diff --git a/.clang_format.hook b/.clang_format.hook new file mode 100644 index 00000000..632c9d0d --- /dev/null +++ b/.clang_format.hook @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +readonly VERSION="13.0.0" + +version=$(clang-format -version) + +if ! [[ $(python -V 2>&1 | awk '{print $2}' | awk -F '.' '{print $1$2}') -ge 36 ]]; then + echo "clang-format installation by pip need python version great equal 3.6, + please change the default python to higher version." + exit 1 +fi + +if ! [[ $version == *"$VERSION"* ]]; then + # low version of pip may not have the source of clang-format whl + pip install --upgrade pip + pip install clang-format==13.0.0 +fi + +clang-format $@ \ No newline at end of file diff --git a/.github/scripts/traffic_metrics.py b/.github/scripts/traffic_metrics.py new file mode 100644 index 00000000..3f4fea07 --- /dev/null +++ b/.github/scripts/traffic_metrics.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python3 +"""Fetch GitHub traffic stats and build a persistent CSV plus trend chart.""" + +from __future__ import annotations + +import argparse +import csv +import os +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +from typing import Dict, Iterable, List, Mapping, Sequence + +import matplotlib + +matplotlib.use("Agg") + +import matplotlib.pyplot as plt +import requests + +API_ROOT = "https://api.github.com" + + +@dataclass +class DailyMetrics: + date: str + views: int + unique_views: int + clones: int + unique_clones: int + + +def _fetch(endpoint: str, repo: str, token: str) -> Mapping: + url = f"{API_ROOT}/repos/{repo}/{endpoint}" + headers = {"Accept": "application/vnd.github+json"} + if token: + headers["Authorization"] = f"Bearer {token}" + response = requests.get(url, headers=headers, timeout=30) + response.raise_for_status() + return response.json() + + +def _normalize_daily(items: Iterable[Mapping], count_key: str) -> Dict[str, Dict[str, int]]: + daily: Dict[str, Dict[str, int]] = {} + for item in items: + # GitHub returns timestamps like "2024-12-05T00:00:00Z". + date_key = item["timestamp"][:10] + counts = daily.setdefault(date_key, {"count": 0, "uniques": 0}) + counts["count"] = max(counts["count"], int(item[count_key])) + counts["uniques"] = max(counts["uniques"], int(item["uniques"])) + return daily + + +def _load_existing(path: Path) -> Dict[str, DailyMetrics]: + if not path.exists(): + return {} + existing: Dict[str, DailyMetrics] = {} + with path.open(newline="", encoding="utf-8") as handle: + reader = csv.DictReader(handle) + for row in reader: + existing[row["date"]] = DailyMetrics( + date=row["date"], + views=int(row["views"]), + unique_views=int(row["unique_views"]), + clones=int(row["clones"]), + unique_clones=int(row["unique_clones"]), + ) + return existing + + +def _merge(existing: Dict[str, DailyMetrics], updates: Dict[str, DailyMetrics]) -> Dict[str, DailyMetrics]: + merged = existing.copy() + for date_key, metrics in updates.items(): + if date_key in merged: + prev = merged[date_key] + merged[date_key] = DailyMetrics( + date=date_key, + views=max(prev.views, metrics.views), + unique_views=max(prev.unique_views, metrics.unique_views), + clones=max(prev.clones, metrics.clones), + unique_clones=max(prev.unique_clones, metrics.unique_clones), + ) + else: + merged[date_key] = metrics + return merged + + +def _write_csv(metrics: Dict[str, DailyMetrics], path: Path) -> None: + ordered_dates = sorted(metrics.keys()) + with path.open("w", newline="", encoding="utf-8") as handle: + fieldnames = ["date", "views", "unique_views", "clones", "unique_clones"] + writer = csv.DictWriter(handle, fieldnames=fieldnames) + writer.writeheader() + for date_key in ordered_dates: + record = metrics[date_key] + writer.writerow( + { + "date": record.date, + "views": record.views, + "unique_views": record.unique_views, + "clones": record.clones, + "unique_clones": record.unique_clones, + } + ) + + +def _latest(metrics: Dict[str, DailyMetrics], limit: int = 7) -> Sequence[DailyMetrics]: + if not metrics: + return [] + ordered_dates = sorted(metrics.keys()) + recent_dates = ordered_dates[-limit:] + return [metrics[date_key] for date_key in recent_dates] + + +def _render_table(metrics: Dict[str, DailyMetrics], max_rows: int = 7) -> str: + header = "| Date | Views | Unique views | Clones | Unique clones |\n| --- | --- | --- | --- | --- |" + if not metrics: + return header + "\n| - | - | - | - | - |" + rows = [ + f"| {item.date} | {item.views} | {item.unique_views} | {item.clones} | {item.unique_clones} |" + for item in _latest(metrics, max_rows) + ] + return header + "\n" + "\n".join(rows) + + +def _update_readme(readme_path: Path, metrics: Dict[str, DailyMetrics], image_path: Path) -> None: + start_marker = "" + end_marker = "" + block = f"{start_marker}\n{_render_table(metrics)}\n\n![Traffic trend]({image_path.as_posix()})\n{end_marker}" + + if not readme_path.exists(): + print(f"README not found at {readme_path}, skip embedding metrics.") + return + + content = readme_path.read_text(encoding="utf-8") + if start_marker in content and end_marker in content: + pre, rest = content.split(start_marker, 1) + _, post = rest.split(end_marker, 1) + new_content = pre + block + post + else: + new_content = content.rstrip() + "\n\n" + block + "\n" + + readme_path.write_text(new_content, encoding="utf-8") + + +def _plot(metrics: Dict[str, DailyMetrics], output_path: Path) -> None: + if not metrics: + print("No traffic data available to plot.") + return + + ordered = [metrics[key] for key in sorted(metrics.keys())] + dates = [datetime.strptime(item.date, "%Y-%m-%d") for item in ordered] + view_counts = [item.views for item in ordered] + view_uniques = [item.unique_views for item in ordered] + clone_counts = [item.clones for item in ordered] + clone_uniques = [item.unique_clones for item in ordered] + + plt.figure(figsize=(10, 6)) + plt.plot(dates, view_counts, label="Views", linewidth=2) + plt.plot(dates, view_uniques, label="Unique views", linestyle="--", linewidth=1.5) + plt.plot(dates, clone_counts, label="Downloads (clones)", linewidth=2) + plt.plot(dates, clone_uniques, label="Unique downloaders", linestyle="--", linewidth=1.5) + plt.xlabel("Date") + plt.ylabel("Count") + plt.title("PaddleMaterials repository traffic") + plt.grid(True, linestyle="--", alpha=0.3) + plt.legend() + plt.tight_layout() + output_path.parent.mkdir(parents=True, exist_ok=True) + plt.savefig(output_path, dpi=150) + plt.close() + + +def collect_metrics(repo: str, token: str) -> Dict[str, DailyMetrics]: + views_resp = _fetch("traffic/views?per=day", repo, token) + clones_resp = _fetch("traffic/clones?per=day", repo, token) + + view_daily = _normalize_daily(views_resp.get("views", []), count_key="count") + clone_daily = _normalize_daily(clones_resp.get("clones", []), count_key="count") + + # Combine the two sources into a consistent DailyMetrics map. + consolidated: Dict[str, DailyMetrics] = {} + all_dates = set(view_daily.keys()) | set(clone_daily.keys()) + for date_key in all_dates: + views = view_daily.get(date_key, {"count": 0, "uniques": 0}) + clones = clone_daily.get(date_key, {"count": 0, "uniques": 0}) + consolidated[date_key] = DailyMetrics( + date=date_key, + views=views["count"], + unique_views=views["uniques"], + clones=clones["count"], + unique_clones=clones["uniques"], + ) + return consolidated + + +def main() -> None: + parser = argparse.ArgumentParser(description="Persist GitHub traffic metrics and draw a trend plot.") + parser.add_argument("--repo", required=True, help="Repository in owner/name format.") + parser.add_argument( + "--output-dir", + default="output/traffic", + help="Directory for CSV and chart outputs (default: output/traffic).", + ) + parser.add_argument( + "--token", + default=os.getenv("GITHUB_TOKEN") or os.getenv("GH_TOKEN"), + help="GitHub token with repo access (defaults to GITHUB_TOKEN env).", + ) + parser.add_argument( + "--readme", + default=None, + help="Path to README to embed the latest traffic table and chart (optional).", + ) + args = parser.parse_args() + + if not args.token: + raise SystemExit("Missing GitHub token (set GITHUB_TOKEN or pass --token).") + + output_dir = Path(args.output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + csv_path = output_dir / "traffic_metrics.csv" + plot_path = output_dir / "traffic_trend.png" + + latest = collect_metrics(repo=args.repo, token=args.token) + existing = _load_existing(csv_path) + merged = _merge(existing, latest) + _write_csv(merged, csv_path) + _plot(merged, plot_path) + if args.readme: + _update_readme(Path(args.readme), merged, plot_path) + print(f"Wrote {csv_path} and {plot_path}") + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/traffic-metrics.yml b/.github/workflows/traffic-metrics.yml new file mode 100644 index 00000000..a9bd3e1c --- /dev/null +++ b/.github/workflows/traffic-metrics.yml @@ -0,0 +1,44 @@ +name: traffic-metrics + +on: + schedule: + - cron: "0 1 * * *" + workflow_dispatch: + +permissions: + contents: write + +jobs: + collect: + runs-on: ubuntu-latest + env: + TRAFFIC_TOKEN: ${{ secrets.TRAFFIC_TOKEN || secrets.GITHUB_TOKEN }} + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install matplotlib requests + + - name: Collect traffic metrics + env: + GH_TOKEN: ${{ env.TRAFFIC_TOKEN }} + GITHUB_TOKEN: ${{ env.TRAFFIC_TOKEN }} + REPO_NAME: ${{ github.repository }} + run: | + python .github/scripts/traffic_metrics.py --repo "${REPO_NAME}" --output-dir output/traffic --readme README.md + + - name: Commit traffic artifacts + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore: update traffic metrics" + file_pattern: | + output/traffic/* + README.md diff --git a/.gitignore b/.gitignore index d4bb188e..e4dd3a77 100644 --- a/.gitignore +++ b/.gitignore @@ -132,8 +132,51 @@ FETCH_HEAD # auto generated version file by setuptools_scm ppsci/_version.py +ppmat/_version.py __pycache__/ stability_prediction/data_bak/* stability_prediction/log/* -stability_prediction/checkpoints/* \ No newline at end of file +stability_prediction/checkpoints/* + +structure_prediction/data/* +structure_prediction/data_bak/* +structure_prediction/log/* +structure_prediction/checkpoints/* + +data/* +log/* + +output/* +!output/traffic/ +!output/traffic/* +experimental/output/* +experimental/output +experimental/data +experimental/log/ +experimental/log2/ + +output/*experimental/data/ +experimental/output/ +experimental/ + +ppmat/models/mattersim/threebody_indices.c +pretrained/ +result* +spectrum_elucidation/retrival_database +test/samplers +outputs + +# codex +AGENTS.md + +.baidu-cc/meta.json +.comate/mcp.json +dataset_ES + +electronic_structure/configs/omol25_data_split.json +electronic_structure/configs/omol25.json +electronic_structure/configs/qm9_data_split.json +electronic_structure/configs/qm9.json +electronic_structure/configs/crystal_data_split.json +electronic_structure/configs/crystal.json diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..71e2feeb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "paddle_scatter"] + path = paddle_scatter + url = https://github.com/PFCCLab/paddle_scatter.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 733df8d9..95e6cf20 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,45 +3,61 @@ repos: rev: 5.11.5 hooks: - id: isort - args: ["--multi-line=7", "--sl"] + args: ["--multi-line=7", "--sl", "--profile", "black", "--filter-files"] + exclude: '(jointContribution|legacy)/.*' - repo: https://github.com/psf/black rev: 22.3.0 hooks: - id: black + exclude: '(jointContribution|legacy)/.*' - # - repo: https://github.com/charliermarsh/ruff-pre-commit - # rev: "v0.0.272" - # hooks: - # - id: ruff + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: "v0.0.272" + hooks: + - id: ruff + exclude: '(jointContribution|legacy)/.*' - repo: https://github.com/pre-commit/pre-commit-hooks rev: a11d9314b22d8f8c7556443875b731ef05965464 hooks: - id: check-merge-conflict + exclude: '(jointContribution|legacy)/.*' - id: check-symlinks + exclude: '(jointContribution|legacy)/.*' - id: detect-private-key + exclude: '(jointContribution|legacy)/.*' files: (?!.*paddle)^.*$ - id: end-of-file-fixer + exclude: '(jointContribution|legacy)/.*' - id: trailing-whitespace + exclude: '(jointContribution|legacy)/.*' - id: check-case-conflict + exclude: '(jointContribution|legacy)/.*' - id: check-yaml - exclude: "mkdocs.yml" + # exclude: "mkdocs.yml" + exclude: (^jointContribution/.* | "mkdocs.yml" | ^legacy/.*) - id: pretty-format-json + exclude: '(jointContribution|legacy)/.*' args: [--autofix] - id: requirements-txt-fixer + exclude: '(jointContribution|legacy)/.*' - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.0.1 hooks: - id: forbid-crlf files: \.md$ + exclude: '(jointContribution|legacy)/.*' - id: remove-crlf files: \.md$ + exclude: '(jointContribution|legacy)/.*' - id: forbid-tabs files: \.md$ + exclude: '(jointContribution|legacy)/.*' - id: remove-tabs files: \.md$ + exclude: '(jointContribution|legacy)/.*' - repo: local hooks: @@ -51,3 +67,6 @@ repos: entry: bash .clang_format.hook -i language: system files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|cuh|proto)$ + exclude: '(jointContribution|legacy)/.*' + +exclude: '(jointContribution|legacy)/.*' diff --git a/Install.md b/Install.md new file mode 100644 index 00000000..88c71a1b --- /dev/null +++ b/Install.md @@ -0,0 +1,63 @@ +# Installation 🔧 + +[简体中文](./Install_cn.md) + +## 1. Installation Instructions + +We recommend using a conda virtual environment to manage dependencies. You can install conda via [Miniforge](https://github.com/conda-forge/miniforge). + +### 1.1 Create Virtual Environment +Create and activate a new conda virtual environment: + + conda create -n ppmat python=3.10 + conda activate ppmat + +We currently develop under Python 3.10 environment and recommend using Python 3.10 or newer. + +### 1.2 Install PaddlePaddle +Install the appropriate PaddlePaddle version based on your CUDA version. Refer to the [PaddlePaddle Official Website](https://www.paddlepaddle.org.cn/install/quick) for installation commands. We recommend installing PaddlePaddle version >= 3.1 or the develop version. + +For example, in a CUDA 12.6 environment, install the paddlepaddle-gpu version: + + python -m pip install paddlepaddle-gpu==3.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ + +After installation, verify the installation with: + + python -c "import paddle; paddle.utils.run_check()" + +If you see "PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.", the installation was successful. + +### 1.3 Install PaddleMaterials from Source: + + # Clone PaddleMaterials repository + git clone https://github.com/PaddlePaddle/PaddleMaterials.git + + # Navigate to PaddleMaterials directory + cd PaddleMaterials + + # Install dependencies + pip install --upgrade pip setuptools==68.2.2 wheel + pip install setuptools_scm + pip install Cython + # Install 3rd dependency paddle_scatter manully + git clone https://github.com/PFCCLab/paddle_scatter.git + cd paddle_scatter + pip install -v . --no-build-isolation + cd .. + + # Install in editable mode + pip install -e . --no-build-isolation + # pip install -e . --no-build-isolation -i https://pypi.tuna.tsinghua.edu.cn/simple recommended if you are in China + + +## 2. Run Examples + +Predict material properties using the MegNet model: + + python property_prediction/predict.py --model_name='megnet_mp2018_train_60k_e_form' --weights_name='best.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + +Predict energy and forces using the MatterSim model: + + python interatomic_potentials/predict.py --model_name='mattersim_1M' --weights_name='mattersim-v1.0.0-1M_model.pdparams' --cif_file_path='./interatomic_potentials/example_data/cifs/' + +For more usage instructions, refer to the [Get Started](./get_started.md) documentation. diff --git a/Install_cn.md b/Install_cn.md new file mode 100644 index 00000000..cde61945 --- /dev/null +++ b/Install_cn.md @@ -0,0 +1,63 @@ + +# Installation 🔧 + +[English](./Install.md) + +## 1. 安装说明 + +我们推荐使用conda虚拟环境来管理依赖包,你可以通过安装[Miniforge](https://github.com/conda-forge/miniforge)使用conda。 + +### 1.1 创建虚拟环境 +创建一个新的conda虚拟环境,并激活环境: + + conda create -n ppmat python=3.10 + conda activate ppmat + +目前我们在python 3.10环境下进行开发,因此建议使用python 3.10或者更高的版本。 + +### 1.2 安装PaddlePaddle +根据你的cuda版本安装对应版本的PaddlePaddle,具体安装命令可参考[PaddlePaddle官网](https://www.paddlepaddle.org.cn/install/quick)。我们推荐安装PaddlePaddle >= 3.1或者develop版本。 + +例如,对于cuda12.6环境,安装paddlepaddle-gpu版本: + + python -m pip install paddlepaddle-gpu==3.1.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ + +安装完毕之后,运行以下命令,验证 Paddle 是否安装成功。 + + python -c "import paddle; paddle.utils.run_check()" + +如果出现 PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now. 信息,说明已成功安装。 + +### 1.3 源码安装PaddleMaterials: + + # clone PaddleMaterials + git clone https://github.com/PaddlePaddle/PaddleMaterials.git + + # 切换到PaddleMaterials目录 + cd PaddleMaterials + + # 安装依赖 + pip install --upgrade pip setuptools==68.2.2 wheel + pip install setuptools_scm + pip install Cython + # 手动安装第三方依赖paddle_scatter + git clone https://github.com/PFCCLab/paddle_scatter.git + cd paddle_scatter + pip install -v . --no-build-isolation + cd .. + + # 以可编辑模式安装PaddleMaterials + pip install -e . --no-build-isolation -i https://pypi.tuna.tsinghua.edu.cn/simple + + +## 2. 运行示例 + +使用 MegNet 模型预测材料属性: + + python property_prediction/predict.py --model_name='megnet_mp2018_train_60k_e_form' --weights_name='best.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + +使用 MatterSim 模型预测能量和力: + + python interatomic_potentials/predict.py --model_name='mattersim_1M' --weights_name='mattersim-v1.0.0-1M_model.pdparams' --cif_file_path='./interatomic_potentials/example_data/cifs/' + +更多的使用说明可以参考[Get Started](./get_started.md)。 diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..8db3174f --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 4790d07d..dc0adba4 --- a/README.md +++ b/README.md @@ -1,95 +1,207 @@ -# PaddlePaddle for Materials +# PaddleMaterials +

+ +

-## 基于GNN的二维材料稳定性预测 +## 🚀 Introduction -### 整体流程 +**PaddleMaterials** is an end-to-end AI4Materials toolkit built on the **PaddlePaddle** deep learning framework. Designed as a data-mechanism dual-driven platform for developing and deploying foundation models in materials science, **PPMat** enables researchers to efficiently build AI models and accelerate material discovery using pretrained models. -通过预测输入晶体的形成能(分解能等)等能量,实现晶体的稳定性预测,能量越低,稳定性越高。整体流程如下,网络模型输入为晶体的属性包括:原子类型、原子坐标、晶格常数等,网络模型输出为预测的晶体的形成能。涉及到: -1. 晶体数据的图结构表示; -2. GNN网络结构; -3. 预测稳定性; +

+ +

-

- -
+### 🧩 Core Capabilities -详见文档3.4节:https://365.kdocs.cn/l/cmMI44AGmqJG +| Task | Description | Typical Applications | +|------|-------------|---------------------| +| **Property Prediction (PP)** | Predict material properties from structure | Forward design or predict formation energy, band gap, elastic moduli etc. | +| **Structure Generation (SG)** | Generate novel crystal structures | Inverse design or structure generation | +| **Machine Learning Interatomic Potential (MLIP)** | Surrogate Model for DFT as ML potentials | Molecular dynamics simulations | +| **Electronic Structure (ES)** | Surrogate Model for DFT to predict physical field | Predict electronic density | +| **Spectrum Elucidation (SE)** | Reconstruct structures from spectra | NMR structure elucidation | +| **Spectrum Enhancement (SPEN)** | Enhance microscopy and spectrum signals | STEM image enhancement, denoising | -#### 二维材料数据 +### 🧱 Supported Materials -数据地址:https://365.kdocs.cn/ent/664860898/2340801472/304878020292 +- **Inorganic Crystals** - Well-supported with multiple datasets and pretrained models +- **Organic Molecules** - Support for small molecule datasets and property prediction +- *Polymers, catalysts, and amorphous materials are under development* -下图为二维材料数据凸包能的直方图,横坐标为凸包能,纵坐标为频数。 -
- -
+### ✨ Why PaddleMaterials? -二维材料数据转换为Graph结构,其中节点为材料原子类型,边为两个节点之间的距离。 +- ✅ **Rich Pretrained Models & AI-ready Datasets** - 50+ pretrained models ready for inference and Multiple curated datasets for training +- ✅ **Multi-Task Integration** - Unified framework across tasks of PP, SG, MLIP, ES, SE, SPEN etc. +- ✅ **Multi-Hardware Support** - Full support for NVIDIA GPUs and MetaX GPUs and Intel CPUs +- ✅ **Production-Ready** - Easy to use with standandlize design & distributed training, mixed precision, checkpoint recovery +### 📑 Support Tasks +| Task | Description | Link | +|------|-------------|------| +| **Property Prediction (PP)** | Predict formation energy, band gap, elastic properties | [README](property_prediction/README.md) | +| **Structure Generation (SG)** | Generate new crystal structures with diffusion models | [README](structure_generation/README.md) | +| **Machine Learning Interatomic Potential (MLIP)** | DFT-accurate potentials for molecular dynamics | [README](interatomic_potentials/README.md) | +| **Electronic Structure (ES)** | Predict electronic structure properties | [README](electronic_structure/README.md) | +| **Spectrum Elucidation (SE)** | Reconstruct molecular structures from NMR spectra | [README](spectrum_elucidation/README.md) | +| **Spectrum Enhancement (SPEN)** | Enhance microscopy and spectral signals | [README](spectrum_enhancement/README.md) | -### 环境准备 - python==3.10.9 - paddlepaddle==2.6.1 - pgl==2.2.3 - pymatgen==2024.6.10 +### 🤖 Available Pretrained Models -#### 新建环境: - conda create -n test_env python=3.10.9 - conda activate test_env +| Task | Models | Dataset | +|------|--------|---------| +| **Property Prediction** | MEGNet, iComformer, DimeNet++ | MP2018, MP2024, JARVIS | +| **Structure Generation** | MatterGen, DiffCSP | MP20, ALEX | +| **Machine Learning Interatomic Potential** | CHGNet, MatterSim | MPTRJ | +| **Electronic Structure** | InfGCN | QM9_ES, MP_ES, OMol25_MC_ES | +| **Spectrum Elucidation** | DiffNMR | MSD_NMR | +| **Spectrum Enhancement** | SFIN | SFIN-HAADF/BF | -#### 安装所需依赖包: - pip install -r requirments.txt +Full model list: See [MODEL_REGISTRY](ppmat/models/__init__.py#L75) +--- -由于PGL暂不兼容最新版本的Paddle,因此安装完成PGL后需要在安装路径内修改部分代码: -例如我的安装路径为:anaconda3/envs/meg_paddle/lib/python3.10/site-packages/pgl +## 🚀 Get Started -1. 代码fluid替换为base: +### 🔧 Installation - a. 将pgl下所有文件中的 paddle.fluid 替换为 paddle.base +Please refer to the installation [document](Install.md) for your hardware environment. See [SupportedHardwareList](./docs/multi_device.md) for more multi-hardware adaptation information. - b. 将 paddle.base.core as core 替换为 paddle.base as core +--- - 该部分会涉及到3个文件的改动,修改后如下: - ![](docs/modify1.png) +### ⚡ Easy Inference -2. 删除"overwrite"参数: - 在pgl/utils/helper.py中,将第109行 'overwrite' 参数删除,如下所示: +#### Property Prediction - if non_static_mode(): - # return _C_ops.scatter(x, index, updates, 'overwrite', overwrite) - return _C_ops.scatter(x, index, updates, overwrite) +Predict material formation energy using a pretrained MEGNet model: +```bash +python property_prediction/predict.py \ + --model_name='megnet_mp2018_train_60k_e_form' \ + --weights_name='best.pdparams' \ + --cif_file_path='./property_prediction/example_data/cifs/' \ + --save_path='result.csv' +``` -### 模型训练 +#### Structure Generation - cd stability_prediction - # 单卡训练 - python main.py - # 多卡训练 - python -m paddle.distributed.launch --gpus="2,3,4,5" main.py +Generate novel crystal structures: -### 模型评估 +```bash +python structure_generation/predict.py \ + --model_name='mattergen_mp20' \ + --num_structures=100 \ + --save_path='generated_structures/' +``` - # 修改配置文件 configs/megnet_2d.yaml 里的 model/pretrained 字段为训练好的模型路径 - # model: - # ... - # pretrained: './weights/megnet_2d_dp0.5/best.pdparams' - cd stability_prediction - python main.py --mode=test +#### Interatomic Potentials +Run molecular dynamics with ML potentials: +```bash +python interatomic_potentials/run_md.py + --model_name='mattersim_1M' + --structure_path='input.cif' + --temperature=300 +``` -### 二维材料训练 -超参数详见: [megnet_2d.yaml](stability_prediction/configs/megnet_2d.yaml) +#### Electronic Structure -实验结果: +Run prediction of elcutorninc density: - train_loss: 0.018 - val_loss: 0.049 - train_mae: 0.099 - val_mae: 0.145: +```bash +python interatomic_potentials/run_md.py + --model_name='mattersim_1M' + --structure_path='input.cif' + --temperature=300 +``` - test_mae: 0.142 +#### Spectrum Elucidation + +Run NMR spectrum elucidate: + +```bash +python spectrum_elucidation/sample.py + --config_path='spectrum_elucidation/configs/diffnmr/DiffNMR.yaml' + --weights_name='DiffNMR_nless15_best.pdparams' + --save_path='result_diffnmr_nless15/' + --checkpoint_path="pretrained" +``` + +#### Spectrum Enhancement + +Run prediction of elcutorninc density: + +```bash +python spectrum_enhancement/predict.py + --model_name sfin_haadf_enhance + --split val +``` + +--- + +### 🏋️ Start Training + +For training and fine-tuning, refer to the [documentation](get_started.md). + +--- + +## 🤝 Contributors & Cooperation & Community + +[![Star History Chart](https://api.star-history.com/svg?repos=PaddlePaddle/PaddleMaterials&type=date&legend=top-left)](https://www.star-history.com/#PaddlePaddle/PaddleMaterilas&type=date&legend=top-left) + +Thanks to all contributors who have helped build PaddleMaterials! + + + + +Thanks for the following organiziton for cooprative support! +

+ + + +

+ +Join the PaddleMaterials WeChat group to discuss with us! +

+ +

+ +## 🛠️ Contribute to PaddleMaterials + +For developer, please refer to [architecture](docs/ARCHITECTURE_ch.md). + +--- + +## 📜 License + +PaddleMaterials is licensed under the [Apache License 2.0](LICENSE). + +--- + +## 🎓 Citation + +```bibtex +@misc{paddlematerials2025, + title={PaddleMaterials, a deep learning toolkit based on PaddlePaddle for material science.}, + author={PaddleMaterials Contributors}, + howpublished = {\url{https://github.com/PaddlePaddle/PaddleMaterials}}, + year={2025} +} +``` + +--- + +## 🙏 Acknowledgements + +This repository references code from the following projects: + +[PaddleScience](https://github.com/PaddlePaddle/PaddleScience) | +[Matgl](https://github.com/materialsvirtuallab/matgl) | +[CDVAE](https://github.com/txie-93/cdvae) | +[DiffCSP](https://github.com/jiaor17/DiffCSP) | +[MatterGen](https://github.com/microsoft/mattergen) | +[MatterSim](https://github.com/microsoft/mattersim) | +[CHGNet](https://github.com/CederGroupHub/chgnet) | +[AIRS](https://github.com/divelab/AIRS) diff --git a/about_configs.md b/about_configs.md new file mode 100644 index 00000000..f1ed2823 --- /dev/null +++ b/about_configs.md @@ -0,0 +1,454 @@ +# About Configs 🧩 + +PaddleMaterials implements full lifecycle management for model training, covering core stages like training, fine-tuning, and prediction. It includes standardized datasets and build-in pre-trained model libraries, supporting one-click prediction. Training workflows are parameterized through structured configuration files, allowing end-to-end model training with simple parameter adjustments. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameDescription
GlobalSystem-level parameters for centralized management of public configurations and cross-module shared settings.
TrainerDefines core training parameters including epoch count, checkpoint saving policies, and distributed training configurations.
ModelNeural network architecture definition module with initialization parameters and loss function configurations.
DatasetStandardized data loading with integrated preprocessing, batching, and multi-process reading mechanisms.
MetricEvaluation metric functions for performance assessment during training and testing.
OptimizerOptimizer configuration interface supporting learning rate scheduling, weight decay, and gradient clipping parameters.
PredictConfiguration parameters for prediction workflows.
+ +Next, we demonstrate the configuration structure using MegNet training on the mp2018.6.1 dataset. The complete configuration file is available at [megnet_mp2018_train_60k_e_form.yaml](./property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml). This configuration enables training of the MegNet model on mp2018.6.1 for formation energy, with the trained model capable of predicting formation energy for input structures. + +## 1. Global Configuration +```yaml +Global: +# For mp2018 dataset, property names include: +# "formation_energy_per_atom", "band_gap", "G", "K" +label_names: ["formation_energy_per_atom"] +do_train: True +do_eval: False +do_test: False + +graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
label_namesList[str]Defines model training targets (must match dataset column names exactly). This example enables only formation energy prediction.
do_trainBoolEnables/disables training loop execution.
do_evalBoolEnables/disables standalone evaluation process (independent of periodic validation during training).
do_testBoolEnables/disables inference testing (disabled by default).
graph_converterClass ConfigMaterial structure to graph conversion configuration for data loading and prediction stages.
+ +PaddleMaterials uses `__class_name__` and `__init_params__` for flexible class instantiation without hardcoding, enabling different graph construction methods through configuration changes. + +## 2. Trainer Configuration + +The Trainer section initializes a `BaseTrainer` object controlling training, evaluation, and testing workflows: + +```yaml +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_mp2018_train_60k_e_form + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "formation_energy_per_atom" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
max_epochsintMaximum training epochs.
seedintRandom seed for reproducibility (controls numpy/paddle/random libraries).
output_dirstrOutput directory for model weights and logs.
save_freqintCheckpoint saving interval (epochs). Set to 0 for final epoch-only saving.
log_freqintTraining log interval (steps).
start_eval_epochintEpoch to begin evaluation (avoids early-stage fluctuations).
eval_freqintEvaluation interval (epochs). Set to 0 to disable periodic validation.
pretrained_model_pathstr/NonePre-trained model path (None = no pre-training).
pretrained_weight_namestr/NoneWhen using the built-in model, specify the exact weight file name (e.g., latest.pdparams).
resume_from_checkpointstr/NoneCheckpoint path for training resumption (requires optimizer state and training metadata).
use_ampboolEnables automatic mixed precision training.
amp_levelstrMixed precision mode ('O1'=partial FP32, 'O2'=FP16 optimization).
eval_with_no_gradboolDisables gradient computation during evaluation (set to False for models with higher-order derivatives).
gradient_accumulation_stepsintGradient accumulation steps for large batch simulation.
best_metric_indicatorstrMetric for best model selection (train/eval loss/metric).
name_for_best_metricstrSpecific metric name (must match Metric configuration).
greater_is_betterboolMetric optimization direction (False = lower is better).
compute_metric_during_trainboolEnables training set metric computation.
metric_strategy_during_evalstrEvaluation strategy (an "epoch" refers to calculations performed after completing a full pass through the entire dataset, whereas a "step" denotes incremental calculations processed with each individual batch.).
use_visualdl/wandb/tensorboardboolEnables specific training logging tools.
+ +## 3. Model Configuration + +Defines model architecture and hyperparameters. Example for MEGNetPlus: + +```yaml +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + data_mean: -1.6519 + data_std: 1.0694 +``` + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
__class_name__strModel class name.
__init_params__dictInitialization parameters (e.g., node embedding dimension).
+ +## 4. Metric Configuration + +Defines evaluation metrics. Example: + +```yaml +Metric: + formation_energy_per_atom: + __class_name__: paddle.nn.L1Loss + __init_params__: {} +``` + +Specifies metrics for specific properties (e.g., MAE for formation energy). + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
__class_name__strMetric class name (supports PaddlePaddle APIs).
__init_params__dictInitialization parameters (empty dict if none).
+ +## 5. Optimizer Configuration + +Defines optimizer and learning rate parameters. Example: + +```yaml +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
__class_name__strOptimizer class name (e.g., Adam).
__init_params__dictOptimizer parameters (e.g., beta1/beta2 for Adam).
lr.__class_name__strLearning rate scheduler class name (e.g., Cosine).
lr.__init_params__dictScheduler parameters (e.g., initial/min learning rates).
+ +## 6. Dataset Configuration + +Defines dataset classes and parameters. Example: + +```yaml +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_train" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 + val: + # Similar structure to train with validation-specific parameters + test: + # Similar structure to train with test-specific parameters +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field NameTypeDescription
train.dataset.__class_name__strDataset class name (e.g., MP2018Dataset).
train.dataset.__init_params__.pathstrData file path.
train.dataset.__init_params__.property_namesstrTarget properties (references Global labels).
train.dataset.__init_params__.build_structure_cfgdictMaterial structure construction parameters.
train.sampler.__init_params__.batch_sizeintTraining batch size (per GPU).
+ +## 7. Predict Configuration + +Defines prediction parameters. Example: + +```yaml +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True +``` + +References global graph converter and disables gradient computation during prediction (set to False for models with higher-order derivatives). diff --git a/constants_spgroup.py b/constants_spgroup.py new file mode 100644 index 00000000..53c1b022 --- /dev/null +++ b/constants_spgroup.py @@ -0,0 +1,232 @@ +spgroup_data = { + 1: ["aP", False], + 2: ["aP", True], + 3: ["mP", False], + 4: ["mP", False], + 5: ["mC", False], + 6: ["mP", False], + 7: ["mP", False], + 8: ["mC", False], + 9: ["mC", False], + 10: ["mP", True], + 11: ["mP", True], + 12: ["mC", True], + 13: ["mP", True], + 14: ["mP", True], + 15: ["mC", True], + 16: ["oP", False], + 17: ["oP", False], + 18: ["oP", False], + 19: ["oP", False], + 20: ["oC", False], + 21: ["oC", False], + 22: ["oF", False], + 23: ["oI", False], + 24: ["oI", False], + 25: ["oP", False], + 26: ["oP", False], + 27: ["oP", False], + 28: ["oP", False], + 29: ["oP", False], + 30: ["oP", False], + 31: ["oP", False], + 32: ["oP", False], + 33: ["oP", False], + 34: ["oP", False], + 35: ["oC", False], + 36: ["oC", False], + 37: ["oC", False], + 38: ["oA", False], + 39: ["oA", False], + 40: ["oA", False], + 41: ["oA", False], + 42: ["oF", False], + 43: ["oF", False], + 44: ["oI", False], + 45: ["oI", False], + 46: ["oI", False], + 47: ["oP", True], + 48: ["oP", True], + 49: ["oP", True], + 50: ["oP", True], + 51: ["oP", True], + 52: ["oP", True], + 53: ["oP", True], + 54: ["oP", True], + 55: ["oP", True], + 56: ["oP", True], + 57: ["oP", True], + 58: ["oP", True], + 59: ["oP", True], + 60: ["oP", True], + 61: ["oP", True], + 62: ["oP", True], + 63: ["oC", True], + 64: ["oC", True], + 65: ["oC", True], + 66: ["oC", True], + 67: ["oC", True], + 68: ["oC", True], + 69: ["oF", True], + 70: ["oF", True], + 71: ["oI", True], + 72: ["oI", True], + 73: ["oI", True], + 74: ["oI", True], + 75: ["tP", False], + 76: ["tP", False], + 77: ["tP", False], + 78: ["tP", False], + 79: ["tI", False], + 80: ["tI", False], + 81: ["tP", False], + 82: ["tI", False], + 83: ["tP", True], + 84: ["tP", True], + 85: ["tP", True], + 86: ["tP", True], + 87: ["tI", True], + 88: ["tI", True], + 89: ["tP", False], + 90: ["tP", False], + 91: ["tP", False], + 92: ["tP", False], + 93: ["tP", False], + 94: ["tP", False], + 95: ["tP", False], + 96: ["tP", False], + 97: ["tI", False], + 98: ["tI", False], + 99: ["tP", False], + 100: ["tP", False], + 101: ["tP", False], + 102: ["tP", False], + 103: ["tP", False], + 104: ["tP", False], + 105: ["tP", False], + 106: ["tP", False], + 107: ["tI", False], + 108: ["tI", False], + 109: ["tI", False], + 110: ["tI", False], + 111: ["tP", False], + 112: ["tP", False], + 113: ["tP", False], + 114: ["tP", False], + 115: ["tP", False], + 116: ["tP", False], + 117: ["tP", False], + 118: ["tP", False], + 119: ["tI", False], + 120: ["tI", False], + 121: ["tI", False], + 122: ["tI", False], + 123: ["tP", True], + 124: ["tP", True], + 125: ["tP", True], + 126: ["tP", True], + 127: ["tP", True], + 128: ["tP", True], + 129: ["tP", True], + 130: ["tP", True], + 131: ["tP", True], + 132: ["tP", True], + 133: ["tP", True], + 134: ["tP", True], + 135: ["tP", True], + 136: ["tP", True], + 137: ["tP", True], + 138: ["tP", True], + 139: ["tI", True], + 140: ["tI", True], + 141: ["tI", True], + 142: ["tI", True], + 143: ["hP", False], + 144: ["hP", False], + 145: ["hP", False], + 146: ["hR", False], + 147: ["hP", True], + 148: ["hR", True], + 149: ["hP", False], + 150: ["hP", False], + 151: ["hP", False], + 152: ["hP", False], + 153: ["hP", False], + 154: ["hP", False], + 155: ["hR", False], + 156: ["hP", False], + 157: ["hP", False], + 158: ["hP", False], + 159: ["hP", False], + 160: ["hR", False], + 161: ["hR", False], + 162: ["hP", True], + 163: ["hP", True], + 164: ["hP", True], + 165: ["hP", True], + 166: ["hR", True], + 167: ["hR", True], + 168: ["hP", False], + 169: ["hP", False], + 170: ["hP", False], + 171: ["hP", False], + 172: ["hP", False], + 173: ["hP", False], + 174: ["hP", False], + 175: ["hP", True], + 176: ["hP", True], + 177: ["hP", False], + 178: ["hP", False], + 179: ["hP", False], + 180: ["hP", False], + 181: ["hP", False], + 182: ["hP", False], + 183: ["hP", False], + 184: ["hP", False], + 185: ["hP", False], + 186: ["hP", False], + 187: ["hP", False], + 188: ["hP", False], + 189: ["hP", False], + 190: ["hP", False], + 191: ["hP", True], + 192: ["hP", True], + 193: ["hP", True], + 194: ["hP", True], + 195: ["cP", False], + 196: ["cF", False], + 197: ["cI", False], + 198: ["cP", False], + 199: ["cI", False], + 200: ["cP", True], + 201: ["cP", True], + 202: ["cF", True], + 203: ["cF", True], + 204: ["cI", True], + 205: ["cP", True], + 206: ["cI", True], + 207: ["cP", False], + 208: ["cP", False], + 209: ["cF", False], + 210: ["cF", False], + 211: ["cI", False], + 212: ["cP", False], + 213: ["cP", False], + 214: ["cI", False], + 215: ["cP", False], + 216: ["cF", False], + 217: ["cI", False], + 218: ["cP", False], + 219: ["cF", False], + 220: ["cI", False], + 221: ["cP", True], + 222: ["cP", True], + 223: ["cP", True], + 224: ["cP", True], + 225: ["cF", True], + 226: ["cF", True], + 227: ["cF", True], + 228: ["cF", True], + 229: ["cI", True], + 230: ["cI", True], +} diff --git a/docs/ARCHITECTURE_ch.md b/docs/ARCHITECTURE_ch.md new file mode 100644 index 00000000..a2a9ca37 --- /dev/null +++ b/docs/ARCHITECTURE_ch.md @@ -0,0 +1,262 @@ +# PaddleMaterials 架构说明 + +## 项目概述 + +**PaddleMaterials**(简称PPMat)是一个基于飞桨(PaddlePaddle)深度学习框架的AI4Materials(人工智能驱动材料科学)端到端工具包。它是一个数据-机理双驱动的材料科学基础模型开发部署平台,支持无机材料、有机分子、聚合物等多种材料类型的研究与开发。 + +--- + +## 目录结构 + +``` +PaddleMaterials/ +├── ppmat/ # 核心Python包 +│ ├── calculator/ # ASE计算器集成 +│ ├── datasets/ # 数据集处理模块 +│ ├── losses/ # 损失函数 +│ ├── metrics/ # 评估指标 +│ ├── models/ # 核心模型实现 +│ ├── optimizer/ # 优化器 +│ ├── predictor/ # 预测器 +│ ├── sampler/ # 采样器 +│ ├── schedulers/ # 扩散调度器 +│ ├── trainer/ # 训练框架 +│ └── utils/ # 工具函数 +│ +├── property_prediction/ # 性质预测任务 +├── structure_generation/ # 结构生成任务 +├── interatomic_potentials/ # 机器学习原子间势(MLIP) +├── electronic_structure/ # 机器学习电子结构(MLES) +├── spectrum_elucidation/ # 谱图解析任务(SE) +├── ppmatSim/ # 分子动力学模拟工具 +├── research/ # 研究项目 +├── jointContribution/ # 联合贡献项目 +├── docs/ # 文档和资源 +├── test/ # 测试文件 +├── setup.py # 安装配置 +├── requirements.txt # 依赖列表 +└── README.md # 主说明文档 +``` + +--- + +## 核心模块详解 + +### 1. ppmat/models/ - 深度学习模型库 + +| 模型 | 路径 | 功能描述 | +|------|------|----------| +| **MEGNetPlus** | `ppmat/models/megnet/` | 等变图网络,材料性质预测 | +| **iComformer** | `ppmat/models/comformer/` | 改进版ComFormer,晶体性质预测 | +| **DimeNet++** | `ppmat/models/dimenetpp/` | 方向消息传递网络 | +| **MatterGen** | `ppmat/models/mattergen/` | 条件扩散模型,晶体结构生成 | +| **DiffCSP** | `ppmat/models/diffcsp/` | 扩散晶体结构预测 | +| **CHGNet** | `ppmat/models/chgnet/` | 电荷图神经网络,原子间势 | +| **MatterSim** | `ppmat/models/mattersim/` | 通用原子间势函数 | +| **InfGCN** | `ppmat/models/infgcn/` | 电子结构预测 | +| **DiffNMR** | `ppmat/models/diffnmr/` | NMR谱图解析 | + +### 2. ppmat/datasets/ - 数据集处理 + +- **MP2018Dataset** - Materials Project 2018数据集 +- **MP2024Dataset** - Materials Project 2024数据集 +- **MP20Dataset** - 材料结构生成基准数据集 +- **JarvisDataset** - JARVIS材料数据集 +- **QM9Dataset** - 有机分子数据集 +- **OC20S2EFDataset** - Open Catalyst 2020数据集 +- **MSDnmrDataset** - NMR谱图数据集 + +### 3. ppmat/trainer/ - 训练框架 + +- **base_trainer.py** - 基础训练器,支持: + - 分布式训练(多GPU) + - 混合精度训练 + - 断点续训 + - 学习率调度 + - 早停机制 + +### 4. ppmat/utils/ - 工具函数 + +包含晶体结构处理、可视化、模型保存/加载、日志记录等通用工具。 + +--- + +## 任务模块 + +### property_prediction/ - 性质预测 + +**功能**:预测材料的各种物理化学性质 + +**支持任务**: +- 形成能(Formation Energy) +- 带隙(Band Gap) +- 剪切模量(Shear Modulus) +- 体积模量(Bulk Modulus) + +**配置文件**:`property_prediction/configs/`(包含 megnet、comformer、dimenet++ 配置) + +### structure_generation/ - 结构生成 + +**功能**:生成新型晶体结构 + +**模型**: +- MatterGen - 无条件/条件结构生成 +- DiffCSP - 扩散晶体结构预测 + +**配置文件**:`structure_generation/configs/` + +### interatomic_potentials/ - 原子间势 + +**功能**:机器学习原子间势(MLIP)计算 + +**模型**: +- CHGNet - 电荷图神经网络势 +- MatterSim - 通用原子间势 + +**配置文件**:`interatomic_potentials/configs/` + +### electronic_structure/ - 电子结构 + +**功能**:机器学习电子结构(MLES)预测 + +**模型**: +- InfGCN - 推断图卷积网络 + +**配置文件**:`electronic_structure/configs/` + +### spectrum_elucidation/ - 谱图解析 + +**功能**:谱图到结构的解析 + +**模型**: +- DiffNMR - NMR谱图到结构解析 + +**配置文件**:`spectrum_elucidation/configs/` + +--- + +## 技术栈 + +### 深度学习框架 +- **PaddlePaddle >= 3.1** - 核心深度学习框架 + +### 主要依赖 + +| 类别 | 依赖包 | 用途 | +|------|--------|------| +| 图神经网络 | pgl 2.2.6 | 图学习库 | +| 科学计算 | numpy 1.26.4, scipy 1.13.1 | 数值计算 | +| 材料科学 | pymatgen 2024.10.29 | 材料分析 | +| | ase 3.23.0 | 原子模拟环境 | +| | matminer 0.9.2 | 材料数据挖掘 | +| 分子处理 | rdkit 2024.9.1 | 分子化学信息学 | +| 配置管理 | hydra-core 1.3.2 | 配置管理 | +| 可视化 | tensorboardX, visualdl, wandb | 训练可视化 | +| 数据处理 | pandas, pyarrow, lmdb | 数据处理与存储 | + +### 支持的硬件 +- NVIDIA GPU(CUDA 12.x) +- MetaX GPU(国产GPU) +- CPU + +--- + +## 配置系统 + +项目使用 **Hydra** 进行配置管理,所有任务都通过YAML配置文件进行设置。 + +### 配置继承 + +支持配置继承和组合,例如: + +```yaml +defaults: + - model: megnet + - dataset: mp2018 + - optimizer: adam +``` + +--- + +## 预训练模型 + +项目提供丰富的预训练模型(MODEL_REGISTRY中定义): + +### 性质预测模型 +- `megnet_mp2018_train_60k_e_form` - 形成能预测 +- `comformer_mp2018_train_60k_band_gap` - 带隙预测 +- `dimenetpp_mp2018_train_60k_G` - 剪切模量预测 + +### 结构生成模型 +- `mattergen_mp20` - 无条件结构生成 +- `diffcsp_mp20` - 扩散晶体结构预测 + +### 原子间势模型 +- `chgnet_mptrj` - 通用势函数 +- `mattersim_1M/5M` - MatterSim势函数 + +--- + +## 使用示例 + +### 性质预测 + +```bash +python property_prediction/predict.py \n --model_name='megnet_mp2018_train_60k_e_form' \n --weights_name='best.pdparams' \n --cif_file_path='./property_prediction/example_data/cifs/' +``` + +### 多GPU训练 + +```bash +python -m paddle.distributed.launch --gpus="0,1,2,3" \n property_prediction/train.py \n -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml +``` + +--- + +## 开发指南 + +### 添加新模型 + +1. 在 `ppmat/models/` 下创建新模型目录 +2. 继承基础模型类,实现 `forward` 方法 +3. 在 `ppmat/models/__init__.py` 中注册模型 +4. 创建对应的配置文件 + +### 添加新数据集 + +1. 在 `ppmat/datasets/` 下创建数据集类 +2. 继承 `BaseDataset`,实现 `get_data` 方法 +3. 在 `ppmat/datasets/__init__.py` 中注册数据集 + +### 添加新任务 + +1. 在根目录创建新任务目录 +2. 实现 `train.py`, `predict.py` 等入口脚本 +3. 创建 `configs/` 目录存放配置 +4. 在 `README.md` 中添加任务说明 + +--- + +## 文档索引 + +| 文档 | 路径 | 说明 | +|------|------|------| +| 安装说明 | `Install.md` | 英文安装指南 | +| 中文安装说明 | `Install_cn.md` | 中文安装指南 | +| 快速开始 | `get_started.md` | 快速入门教程 | +| 配置说明 | `about_configs.md` | Hydra配置详解 | +| 多硬件支持 | `docs/multi_device.md` | 多硬件适配说明 | +| MetaX支持 | `docs/MetaX/` | MetaX GPU适配文档 | + +--- + +## 许可证 + +本项目采用 [Apache License 2.0](LICENSE) 开源许可证。 + +--- + +## 联系方式 + +- 项目主页:https://github.com/PaddlePaddle/PaddleMaterials +- 问题反馈:https://github.com/PaddlePaddle/PaddleMaterials/issues \ No newline at end of file diff --git a/docs/MetaX/PaddleMaterials_MetaX_README.md b/docs/MetaX/PaddleMaterials_MetaX_README.md new file mode 100644 index 00000000..dd509dc1 --- /dev/null +++ b/docs/MetaX/PaddleMaterials_MetaX_README.md @@ -0,0 +1,116 @@ +# PaddleMaterials on GiteeAI (MetaX) + +## Environment Setup on GiteeAI +1. Register and log in to [giteeAI](https://ai.gitee.com/). +2. Purchase computing resources and click **Rent Now**. + ![](./pic1.png) +3. Choose the **PaddleMaterials** image and click **Next** to create an instance. + ![](./pic2.png) +4. After the instance is created, click **Lab** to enter the container. + ![](./pic3.png) +5. In the Lab page, choose **Jupyter Lab**, then open a **Terminal**. + ![](./pic4.png) + +## Training Process +PaddleMaterials source directory: `/opt/PaddleMaterials` +Reference documents: +- [MLIP - Machine Learning Interatomic Potential](https://github.com/PaddlePaddle/PaddleMaterials/blob/develop/interatomic_potentials/README.md) +- [MLES - Machine Learning Electronic Structure](https://github.com/PaddlePaddle/PaddleMaterials/blob/develop/electronic_structure/README.md) +- [PP - Property Prediction](https://github.com/PaddlePaddle/PaddleMaterials/blob/develop/property_prediction/README.md) +- [SG - Structure Generation](https://github.com/PaddlePaddle/PaddleMaterials/blob/develop/structure_generation/README.md) +- [SE - Spectrum Elucidation](https://github.com/PaddlePaddle/PaddleMaterials/blob/develop/spectrum_elucidation/README.md) + +Below is the **Structure Generation / DiffCSP** example. + +### 1) Train +```bash +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/diffcsp/diffcsp_mp20.yaml +``` +![](./pic6.png) + +### 2) Sample +```bash +python structure_generation/sample.py --model_name='diffcsp_mp20' --weights_name='latest.pdparams' --save_path='result_diffcsp_mp20-1/' --chemical_formula='LiMnO2' +``` +![](./pic5.png) + +Result example: `Li1-Mn1-O2_1.cif` +![](./pic7.png) + +--- + +## MetaX Results (from the "PaddleMaterials on MetaX benchmark" sheet) + +### Machine Learning Interatomic Potentials (MLIP) +| Model | Metric | Benchmark | MetaX | Difference | Notes | +| --- | --- | --- | --- | --- | --- | +| CHGNet | energy_per_atom | -7.367691 | -7.3676915 | 5.0e-07 | | +| CHGNet | force (max abs diff) | - | - | 3.03e-06 | Max component diff across 8 samples; see sheet for per-axis values | +| CHGNet | magmom (max abs diff) | - | - | 7.0e-07 | Max across 8 samples; see sheet for per-axis values | +| MatterSim | energy | -6.6172876 | -6.6172876 | 0 | | +| MatterSim | force (max abs diff) | - | - | 1.64e-06 | Max component diff across 8 samples; see sheet for per-axis values | + +**CHGNet - force details** +| # | Benchmark (x, y, z) | MetaX (x, y, z) | Difference (x, y, z) | +| --- | --- | --- | --- | +| 1 | -2.98e-08, -1.13e-07, 2.38e-02 | 1.19e-07, -7.66e-08, 2.38e-02 | 1.49e-07, 3.62052e-08, 8.214e-07 | +| 2 | 2.98e-08, -1.41e-07, -2.38e-02 | -4.47e-08, 7.60e-08, -2.38e-02 | 7.45058e-08, 2.16824e-07, 5.809e-07 | +| 3 | 3.58e-07, 1.12e-07, 9.26e-02 | 1.49e-07, 4.66e-08, 9.26e-02 | 2.08616e-07, 6.51926e-08, 3.879e-07 | +| 4 | -2.98e-08, 4.10e-08, -9.26e-02 | 1.49e-07, -1.49e-08, -9.26e-02 | 1.78814e-07, 5.58794e-08, 3.75e-08 | +| 5 | 8.94e-08, 1.46e-07, -2.43e-03 | 2.98e-08, 6.89e-08, -2.43e-03 | 5.96046e-08, 7.68341e-08, 2.3842e-07 | +| 6 | -2.09e-07, -1.97e-06, -1.31e-02 | -7.45e-07, 1.06e-06, -1.31e-02 | 5.36442e-07, 3.0254e-06, 1.5495e-06 | +| 7 | 2.98e-08, 1.89e-06, 1.31e-02 | 6.26e-07, -1.03e-06, 1.31e-02 | 5.96046e-07, 2.91504e-06, 1.0731e-06 | +| 8 | -1.19e-07, 7.73e-08, 2.43e-03 | -5.96e-08, -6.19e-08, 2.43e-03 | 5.96046e-08, 1.39233e-07, 1.22192e-06 | + +**CHGNet - magmom details** +| # | Benchmark | MetaX | Difference | +| --- | --- | --- | --- | +| 1 | 3.04922e-03 | 3.05e-03 | 6.71e-08 | +| 2 | 3.04934e-03 | 3.05e-03 | 1.043e-07 | +| 3 | 3.86942e+00 | 3.87e+00 | 7e-07 | +| 4 | 3.86942e+00 | 3.87e+00 | 7e-07 | +| 5 | 4.41358e-02 | 4.41e-02 | 1.64e-07 | +| 6 | 3.86221e-02 | 3.86e-02 | 0 | +| 7 | 3.86220e-02 | 3.86e-02 | 1.26e-07 | +| 8 | 4.41357e-02 | 4.41e-02 | 7.4e-08 | + +**MatterSim - force details** +| # | Benchmark (x, y, z) | MetaX (x, y, z) | Difference (x, y, z) | +| --- | --- | --- | --- | +| 1 | 1.72e-07, -9.79e-08, 1.26e-01 | 7.28e-08, 3.45e-08, 1.26e-01 | 9.8953e-08, 1.32313e-07, 9e-08 | +| 2 | 7.01e-08, 5.59e-09, -1.26e-01 | -1.08e-07, 8.89e-08, -1.26e-01 | 1.77938e-07, 8.3357e-08, 7.4e-07 | +| 3 | -8.96e-09, -1.93e-07, -1.51e-01 | -1.87e-08, -6.15e-07, -1.51e-01 | 9.77889e-09, 4.22704e-07, 3.1e-07 | +| 4 | -2.14e-07, -1.66e-07, 1.51e-01 | -1.33e-07, 2.61e-07, 1.51e-01 | 8.07632e-08, 4.26546e-07, 1.01e-06 | +| 5 | 1.65e-07, 2.76e-07, -1.01e-01 | -5.97e-08, 3.58e-07, -1.01e-01 | 2.25031e-07, 8.19564e-08, 1.4e-06 | +| 6 | -1.81e-07, 2.43e-07, 8.90e-02 | -3.03e-07, -9.78e-08, 8.90e-02 | 1.21773e-07, 3.41037e-07, 3.57e-07 | +| 7 | -1.89e-07, 4.66e-08, -8.90e-02 | 5.16e-07, 1.99e-07, -8.90e-02 | 7.04895e-07, 1.52737e-07, 5.66e-07 | +| 8 | -1.68e-07, -1.27e-07, 1.01e-01 | -3.02e-08, -2.35e-07, 1.01e-01 | 1.38127e-07, 1.08732e-07, 1.64e-06 | + +### Property Prediction (PP) +| Model | Metric | Benchmark | MetaX | Difference | +| --- | --- | --- | --- | --- | +| MEGNet | formation_energy_per_atom | -2.1585608 | -2.1585603 | 5.0e-07 | +| MEGNet | band_gap | 1.11667 | 1.1166712 | 1.0e-07 | +| MEGNet | shear_modulus | 4.02312e+02 | 402.3117952 | 0 | +| MEGNet | bulk_modules | 1.10824e+03 | 1108.240846 | 0 | +| ComFormer | formation_energy_per_atom | -2.1615877 | -2.1615882 | 5.0e-07 | +| ComFormer | band_gap | 1.06078 | 1.0607839 | 3.0e-07 | +| ComFormer | shear_modulus | 459.992749 | 4.59993e+02 | 0 | +| ComFormer | bulk_modules | 1.02844e+03 | 1028.443467 | 0 | +| DimeNet++ | formation_energy_per_atom | -2.1553288 | -2.1553288 | 0 | +| DimeNet++ | band_gap | 1.03222 | 1.0322216 | 4.0e-07 | +| DimeNet++ | shear_modulus | 6.77118e+01 | 67.71178 | 2.0e-05 | +| DimeNet++ | bulk_modules | 1.06495e+02 | 106.4948 | 3.0e-05 | + +### Structure Generation (SG) +| Model | Metric | Benchmark | MetaX | Difference | +| --- | --- | --- | --- | --- | +| MatterGen | S.U.N. | Functional | Functional | - | +| DiffCSP | match_rate | 5.16914e-01 | 0.514370993 | 0.00254256 | +| DiffCSP | rms_dist | 5.77073e-02 | 0.058631274 | 0.000924018 | + +### Spectrum Elucidation (SE) +| Model | Metric | Benchmark | MetaX | Difference | +| --- | --- | --- | --- | --- | +| DiffNMR | Rebuild accuracy | 5.06670e-01 | 0.50535 | 0.00132 | diff --git a/docs/MetaX/pic1.png b/docs/MetaX/pic1.png new file mode 100644 index 00000000..6ac5658c Binary files /dev/null and b/docs/MetaX/pic1.png differ diff --git a/docs/MetaX/pic2.png b/docs/MetaX/pic2.png new file mode 100644 index 00000000..be35c35e Binary files /dev/null and b/docs/MetaX/pic2.png differ diff --git a/docs/MetaX/pic3.png b/docs/MetaX/pic3.png new file mode 100644 index 00000000..0e295419 Binary files /dev/null and b/docs/MetaX/pic3.png differ diff --git a/docs/MetaX/pic4.png b/docs/MetaX/pic4.png new file mode 100644 index 00000000..5ba3038c Binary files /dev/null and b/docs/MetaX/pic4.png differ diff --git a/docs/MetaX/pic5.png b/docs/MetaX/pic5.png new file mode 100644 index 00000000..833e1428 Binary files /dev/null and b/docs/MetaX/pic5.png differ diff --git a/docs/MetaX/pic6.png b/docs/MetaX/pic6.png new file mode 100644 index 00000000..f492f272 Binary files /dev/null and b/docs/MetaX/pic6.png differ diff --git a/docs/MetaX/pic7.png b/docs/MetaX/pic7.png new file mode 100644 index 00000000..3f4b3216 Binary files /dev/null and b/docs/MetaX/pic7.png differ diff --git a/docs/diff_arch.png b/docs/diff_arch.png new file mode 100644 index 00000000..b1f471e9 Binary files /dev/null and b/docs/diff_arch.png differ diff --git a/docs/feedback.png b/docs/feedback.png new file mode 100644 index 00000000..24455e4e Binary files /dev/null and b/docs/feedback.png differ diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 00000000..6cce32fd Binary files /dev/null and b/docs/logo.png differ diff --git a/docs/logo_MetaX.png b/docs/logo_MetaX.png new file mode 100644 index 00000000..585a224e Binary files /dev/null and b/docs/logo_MetaX.png differ diff --git a/docs/logo_SZNL_1.jpeg b/docs/logo_SZNL_1.jpeg new file mode 100644 index 00000000..11618c22 Binary files /dev/null and b/docs/logo_SZNL_1.jpeg differ diff --git a/docs/logo_SZNL_2.jpeg b/docs/logo_SZNL_2.jpeg new file mode 100644 index 00000000..388465a7 Binary files /dev/null and b/docs/logo_SZNL_2.jpeg differ diff --git a/docs/logo_SinochemDI_1.jpeg b/docs/logo_SinochemDI_1.jpeg new file mode 100644 index 00000000..c75f0c29 Binary files /dev/null and b/docs/logo_SinochemDI_1.jpeg differ diff --git a/docs/logo_SinochemDI_2.jpeg b/docs/logo_SinochemDI_2.jpeg new file mode 100644 index 00000000..16c1409a Binary files /dev/null and b/docs/logo_SinochemDI_2.jpeg differ diff --git a/docs/multi_device.md b/docs/multi_device.md new file mode 100644 index 00000000..119b02e7 --- /dev/null +++ b/docs/multi_device.md @@ -0,0 +1,49 @@ +# Multi-hardware Adaptation + +Paddle ecosystem relies on the contributions of developers and users. We warmly welcome contributions to adapt more models for multi-hardware support in Paddle. + +## 1. Supported Hardware List + +| Task Type | Model Name | NVIDIA | KUNLUNXIN | HYGON | Tecorigin | MetaX | +|-----------|------------|------------|-----------|-------|-----------|-----------| +| MLIP(Machine Learning Interatomic Potential) | [CHGNet](../interatomic_potentials/configs/chgnet/README.md) | ✅ | | | | ✅ | +| MLIP(Machine Learning Interatomic Potential) | [MatterSim](../interatomic_potentials/configs/mattersim/README.md) | ✅ | | | | ✅ | +| PP(Property Prediction) | [MEGNet](../property_prediction/configs/megnet/README.md) | ✅ | | | | ✅ | +| PP(Property Prediction) | [DimeNet++](../property_prediction/configs/dimenet++/README.md) | ✅ | | | | ✅ | +| PP(Property Prediction) | [ComFormer](../property_prediction/configs/comformer/README.md) | ✅ | | | | ✅ | +| SG(Structure Generation) | [DiffCSP](../structure_generation/configs/diffcsp/README.md) | ✅ | | | | ✅ | +| SG(Structure Generation) | [MatterGen](../structure_generation/configs/mattergen/README.md) | ✅ | | | | ✅ | +| SE(Spectrum Elucidation) | [DiffNMR](../spectrum_elucidation/configs/diffnmr/README.md) | ✅ | | | | ✅ | + + +## 2. How to Contribute + +We provide reference accuracy based on NVIDIA CUDA training and corresponding pre-trained model weights at the beginning of our public case documentation. If you need to run the models on specific hardware, please follow these steps: + +1.If your hardware type has not yet been integrated into PaddlePaddle, you can refer to the official documentation of PaddleCustomDevice to integrate it into the Paddle framework. If your hardware type has been integrated into PaddlePaddle but has not yet been added to PaddleMaterials' hardware support list, please add your hardware type in the tast clarrification README document.. + +2.Prepare the necessary dataset according to the steps provided in the case documentation. + +3.If the model documentation provides model training commands, perform full training on your hardware, save the training logs, record the best model accuracy, and the best model weights. These are usually automatically saved in the case folder during training. + +4.If the model documentation provides model evaluation commands, evaluate the best model saved in step 3 on your hardware, save the evaluation logs, and record the evaluation accuracy. These are usually automatically saved in the case folder during evaluation. + +5.If the model documentation provides model export and inference commands, follow these commands to verify whether model export and inference can be executed normally on the new hardware and whether the inference results align with CUDA's results. + +6.After completing the above steps, you can add your hardware support information (✅) to the corresponding model in the table. And submit a PR to PaddleMaterials. Your PR should include at least the following: +a.A usage guide document for running the model in your hardware environment +b.The best model weights file saved during training (.pdparams file). +c.Training/evaluation logs (.log files). +d.Software versions used for validating model accuracy, including but not limited to: + d.1 PaddlePaddle version + d.2 PaddleCustomDevice version (if applicable) +e.Machine environment details used for validating model accuracy, including but not limited to: + e.1 Chip model + e.2 System version + e.3 Hardware driver version + e.4 Operator library version, etc. + +## 3. More Referenced Documents +* [PaddleUserGuide(ch)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/index_cn.html) +* [PaddleSupportedHardware(ch)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/hardware_support/index_cn.html) +* [PaddleCustomDevice](https://github.com/PaddlePaddle/PaddleCustomDevice) \ No newline at end of file diff --git a/docs/overview_ch.png b/docs/overview_ch.png new file mode 100644 index 00000000..bd85424b Binary files /dev/null and b/docs/overview_ch.png differ diff --git a/docs/overview_en.png b/docs/overview_en.png new file mode 100644 index 00000000..980fd7a9 Binary files /dev/null and b/docs/overview_en.png differ diff --git a/docs/ppmat_logo.png b/docs/ppmat_logo.png new file mode 100644 index 00000000..f353cd95 Binary files /dev/null and b/docs/ppmat_logo.png differ diff --git a/docs/property_prediction.png b/docs/property_prediction.png new file mode 100644 index 00000000..e31b7b8d Binary files /dev/null and b/docs/property_prediction.png differ diff --git a/docs/structure_generation.png b/docs/structure_generation.png new file mode 100644 index 00000000..4805a668 Binary files /dev/null and b/docs/structure_generation.png differ diff --git a/docs/wechat_group.png b/docs/wechat_group.png new file mode 100644 index 00000000..7c17623e Binary files /dev/null and b/docs/wechat_group.png differ diff --git a/electronic_structure/README.md b/electronic_structure/README.md new file mode 100644 index 00000000..edeece03 --- /dev/null +++ b/electronic_structure/README.md @@ -0,0 +1,33 @@ +# MLES-Machine Learning Electronic Structure + +## 1.Introduction + +Machine Learning Electronic Structure (MLES) is an emerging paradigm in computational chemistry and materials science that leverages machine learning to accelerate or even replace traditional ab initio electronic structure methods. It aims to retain quantum accuracy while drastically reducing computational costs. Current research in MLES can be broadly categorized into several directions: Neural Quantum States, Graph-Based Electronic Structure Models, ML Hamiltonians, Neural XC, SCF Accelerators etc. MLES has demonstrated strong potential in predicting material properties, guiding molecular design, and understanding catalytic mechanisms, making it an increasingly important tool in computational materials science and quantum chemistry. + +## 2.Models Matrix + +| **Supported Functions** | **[InfGCN](./configs/infgcn/README.md)** | +| -------------------------------------------- | :--------: | +| **Forward Prediction · Materials Properties**| | +| Electron density | ✅ | +| **ML Capabilities · Training** | | +| Single-GPU | ✅ | +| Distributed training | ✅ | +| Mixed precision (AMP) | — | +| Fine-tuning | ✅ | +| Uncertainty / Active Learning | — | +| Dynamic→Static graphs | — | +| Compiler (CINN) opt. | — | +| **ML Capabilities · Predict** | | +| Distillation / Pruning | — | +| Standard inference | ✅ | +| Distributed inference | — | +| Compiler-level inference | — | +| **Datasets** | | +| **Materials Project** | | +| MP_EC | ✅ | +| MD17_EC | ✅ | +| QM9_EC | ✅ | +| OMol25_EC | ✅ | + +**Notice**:🌟 represent originate research work published from paddlematerials toolkit \ No newline at end of file diff --git a/electronic_structure/configs/infgcn/README.md b/electronic_structure/configs/infgcn/README.md new file mode 100644 index 00000000..f5ec02dd --- /dev/null +++ b/electronic_structure/configs/infgcn/README.md @@ -0,0 +1,283 @@ +# InfGCN + +[InfGCN: Equivariant Neural Operator Learning with Graphon Convolution](https://arxiv.org/abs/2311.10908) + +## Abstract + +We propose a general architecture that combines a coefficient-learning scheme with a residual operator layer for learning mappings between continuous functions in 3D Euclidean space. The model is SE(3)-equivariant by design. From a graph-spectrum view, the method can be interpreted as convolution on graphons (dense graphs with infinitely many nodes), which we term InfGCN. By leveraging both the continuous graphon structure and the discrete graph structure of the input data, the model effectively captures geometric information while preserving equivariance. On large-scale electron-density datasets, InfGCN outperforms current state-of-the-art architectures, and ablation studies confirm the effectiveness of the design. + +![InfGCN Overview](../../docs/infgcn.png) + +--- + +## Model Description + +### Overview +InfGCN is an operator-learning model for **electron density prediction**. Given atom types $Z = (z_1,\ldots,z_N)$ and Cartesian coordinates $R = (r_1,\ldots,r_N) \in \mathbb{R}^{N \times 3}$, the model predicts a continuous electron-density field $\rho(x)$ (typically evaluated on a 3D grid). The core idea is: +- **Atom-centered basis expansion** to represent $\rho(x)$ +- **SE(3)-equivariant graphon convolution** to learn expansion coefficients +- Optional **residual operator layer** to refine global details + +### Method + +#### 1) Atom-centered basis expansion +(1) Atom-centered basis expansion + +The density field is expanded as a sum of atom-centered basis functions: + +$$ +\hat{\rho}(x) = \sum_{i=1}^{N} \sum_{n=1}^{N_r} \sum_{l=0}^{l_{\max}} \sum_{m=-l}^{l} +c_{i,nlm},\phi_{nlm}(x - r_i) +$$ + +A common choice for $\phi_{nlm}$ is a separable radial-angular basis: + +$$ +\phi_{nlm}(r) = g_n(|r|),Y_{lm}!\left(\widehat{r}\right), +\qquad r = x - r_i +$$ + +where $g_n(\cdot)$ is a radial basis and $Y_{lm}$ are spherical harmonics. All learnable information is in the coefficients $c_{i,nlm}$. + +#### 2) SE(3)-equivariant coefficient learning +Coefficients are updated with equivariant message passing: + +$$ +C_i^{(s)} = \sum_{j \in \mathcal{N}(i)} W_{ij}^{(s)} \odot C_j^{(s-1)}, \quad s = 1,\ldots,S +$$ + +Edge weights $W_{ij}^{(s)}$ depend on distance and angle features (radial basis on $\lVert r_{ij}\rVert$, spherical harmonics on $\widehat{r_{ij}}$, and an MLP). This yields rotation equivariance, permutation invariance, and physically meaningful local-to-global aggregation. + +#### 3) Residual operator layer (optional) + +A lightweight refinement adds a learnable correction on top of the base expansion: + +$$ +\hat{\rho}(x) = \hat{\rho}{\text{base}}(x) + \Delta \rho{\theta}(x) +$$ + +where $\Delta \rho_{\theta}$ is produced by an extra operator acting on intermediate features (for example, grid features or learned coefficients). + +#### 4) Training objective and metrics + +A standard regression objective minimizes an $L_2$ error over the 3D domain: + +$$ +\mathcal{L} = \mathbb{E}!\left[\left|\hat{\rho} - \rho\right|_2^2\right] +$$ + +The density is discretized on an $n \times n \times n$ grid; grid points can be subsampled for memory efficiency. A common metric is **Normalized Mean Absolute Error (NMAE)**: + +$$ +\mathrm{NMAE} = +\frac{\sum_{i=1}^{n^3}\left|\hat{\rho}(x_i) - \rho(x_i)\right|} +{\sum_{i=1}^{n^3}\left|\rho(x_i)\right|} +$$ + +--- + +## Dataset Description + +### Recommended data fields +- `atomic_numbers`: length-$N$ atomic numbers +- `pos`: $N \times 3$ Cartesian coordinates (Angstroms) +- `density`: 3D array (voxel grid), for example $n \times n \times n$ +- `grid_meta` (optional): origin, spacing, and box vectors to define $x_i$ +- Optional tags: `mol_id`, `frame_id`, normalization/scaling factors + +### Datasets +- **QM9_EC**: Electron densities stored as `*.CHGCAR.lz4` in `dataset_ES/data_qm9` (train 123,835 / val 50 / test 10,000). [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/QM9_ES/qm9_es.tar), [Atom dictionary](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/QM9_ES/qm9.json), [Split file](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/QM9_ES/qm9_data_split.json). +- **MP_EC (cubic)**: Materials Project-style crystals serialized as `.json.xz` under `dataset_ES/data_cubic` (train 14,421 / val 1,000 / test 1,000). [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/mp_es.tar), [Atom dictionary](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal.json), [Split file](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal_data_split.json). +- **OMol25_EC**: Organic molecule cubes expected under `/home/liuxuwei01/processed_output` (train 16 / val 2 / test 2). [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OMol25_ES/MC_5k/omol25_mc_5k.tar), [Atom dictionary](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OMol25_ES/MC_5k/omol25.json), [Split file](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OMol25_ES/MC_5k/omol25_data_split.json). +- **MD17_EC**: Small molecules (for example, ethanol, benzene, phenol, resorcinol) from the MD17 electron-density release in `dataset_ES/data_md`; default config trains on ethanol. [Data](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MD17_ES/md17_es.tar.gz). + +--- + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetNormalized MAE of DensityGPUsTraining timeConfigCheckpoint | Log
infgcn_md17_benzeneMD17_EC_Benzene21.2614%159mininfgcn_md17_benzenecheckpoint | log
infgcn_md17_ethaneMD17_EC_Ethane6.9443%11hour17mininfgcn_md17_ethanecheckpoint | log
infgcn_md17_ethanolMD17_EC_Ethanol64.5951%17mininfgcn_md17_ethanolcheckpoint | log
infgcn_md17_malonaldehydeMD17_EC_Malonaldehyde17.7947%11hour29mininfgcn_md17_malonaldehydecheckpoint | log
infgcn_md17_phenolMD17_EC_Phenol20.2144%11hour17mininfgcn_md17_phenolcheckpoint | log
infgcn_md17_resorcinolMD17_EC_Resorcinol15.8850%11hour23mininfgcn_md17_resorcinolcheckpoint | log
infgcn_qm9QM9_EC1.7542%175hour41mininfgcn_qm9checkpoint | log
infgcn_cubicMP_EC (cubic)47.3829%112hour6mininfgcn_cubiccheckpoint | log
infgcn_omol25_mc_5kOMol25_EC_5k12.6260%466hour28mininfgcn_omol25checkpoint | log
+ +**Note**: Benchmarks are being regenerated in Paddle; metrics and downloadable checkpoints will be published once validation completes. Pretrained QM9 weights: [infgcn_qm9](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/electronic_structure/infgcn/infgcn_qm9.pdparams) + +--- + +## Command + +### Training +```bash +# multi-gpu training (example with 4 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3" electronic_structure/train.py -c electronic_structure/configs/infgcn/infgcn_qm9.yaml +# single-gpu training +python electronic_structure/train.py -c electronic_structure/configs/infgcn/infgcn_qm9.yaml +``` + +### Validation +```bash +# Enable eval-only mode with a saved checkpoint. +python electronic_structure/train.py -c electronic_structure/configs/infgcn/infgcn_qm9.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Testing +```bash +# Evaluate on the test split using a pretrained checkpoint. +python electronic_structure/train.py -c electronic_structure/configs/infgcn/infgcn_qm9.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Prediction +```bash +# 1) Dataset-sample inference (uses dataset paths from the YAML unless overridden). +python electronic_structure/predict.py \ + --config electronic_structure/configs/infgcn/infgcn_qm9.yaml \ + --checkpoint output/infgcn_qm9_best/infgcn_qm9.pdparams \ + --split validation \ + --index 0 \ + --grid_batch_size 20000 \ + --output_dir output/infgcn_qm9_best/vis_val0 \ + --save_pred_cube \ + --save_true_cube \ + --cube_dir output/infgcn_qm9_best/cubes + +# 2) MOL-file inference (single file or directory). +# This mode predicts electron density from molecular structure files (*.mol), +# and can export predicted cube + html visualization. +CUDA_VISIBLE_DEVICES=4 conda run -n ppmat python electronic_structure/predict.py \ + --config output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/infgcn_omol25_trimmed.yaml \ + --checkpoint output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/checkpoints/latest.pdparams \ + --mol_input mols/Baidu_infGCN_Example_20260206 \ + --atom_file /home/liuxuwei01/processed_output/omol25.json \ + --output_dir output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/mol_predict_latest_gpu4 \ + --cube_dir output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/mol_predict_latest_gpu4/cubes \ + --save_pred_cube \ + --save_html \ + --grid_batch_size 4096 + +# 3) MOL-file inference with reference (true) cube files. +# If --mol_true_cube_dir provides matching files (.cube or _true.cube), +# the script additionally writes true cube and true/diff html. +CUDA_VISIBLE_DEVICES=4 conda run -n ppmat python electronic_structure/predict.py \ + --config output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/infgcn_omol25_trimmed.yaml \ + --checkpoint output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/checkpoints/latest.pdparams \ + --mol_input mols/Baidu_infGCN_Example_20260206 \ + --mol_true_cube_dir /path/to/true_cubes \ + --atom_file /home/liuxuwei01/processed_output/omol25.json \ + --output_dir output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/mol_predict_latest_gpu4 \ + --cube_dir output/infgcn_omol25_s1_trimmed_t_20260118_183549_s_42/mol_predict_latest_gpu4/cubes \ + --save_true_cube \ + --save_pred_cube \ + --save_html \ + --grid_batch_size 4096 +``` + +Notes: +- `--mol_input` supports either one `.mol` file or a directory of `.mol` files. +- Optional grid controls for MOL mode: `--mol_grid_shape` (default `80,80,80`) and `--mol_grid_padding` (default `6.0` Angstrom). +- If true/reference cube is not provided, only predicted outputs are available (`*_pred.cube`, `*_pred_density.html`). +- If kaleido/Chrome is unavailable, the script writes interactive `.html` instead of `.png`. +- If your datasets live elsewhere, create a symlink to the data root (for example, `ln -s /path/to/dataset_ES dataset_ES`). + +--- + +## Citation +``` +@article{cheng2023infgcn, + title={Equivariant neural operator learning with graphon convolution}, + author={Cheng, Chaoran and Peng, Jian}, + journal={arXiv preprint arXiv:2311.10908}, + year={2023} +} +``` diff --git a/electronic_structure/configs/infgcn/infgcn_md17_benzene.yaml b/electronic_structure/configs/infgcn/infgcn_md17_benzene.yaml new file mode 100644 index 00000000..8b799efe --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_md17_benzene.yaml @@ -0,0 +1,159 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 32 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 10000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_md17_benzene + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md # + mol_name: benzene + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: benzene + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: benzene + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/infgcn/infgcn_md17_ethane.yaml b/electronic_structure/configs/infgcn/infgcn_md17_ethane.yaml new file mode 100644 index 00000000..4516b860 --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_md17_ethane.yaml @@ -0,0 +1,158 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 32 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 10000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_md17_ethane + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md # + mol_name: ethane + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethane + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethane + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/infgcn/infgcn_md17_ethanol.yaml b/electronic_structure/configs/infgcn/infgcn_md17_ethanol.yaml new file mode 100644 index 00000000..7891453d --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_md17_ethanol.yaml @@ -0,0 +1,159 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 32 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 10000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_md17_ethanol + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md # + mol_name: ethanol + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethanol + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: ethanol + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/infgcn/infgcn_md17_malonaldehyde.yaml b/electronic_structure/configs/infgcn/infgcn_md17_malonaldehyde.yaml new file mode 100644 index 00000000..46d1e658 --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_md17_malonaldehyde.yaml @@ -0,0 +1,159 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 32 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 10000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_md17_malonaldehyde + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md # + mol_name: malonaldehyde + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: malonaldehyde + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: malonaldehyde + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/infgcn/infgcn_md17_phenol.yaml b/electronic_structure/configs/infgcn/infgcn_md17_phenol.yaml new file mode 100644 index 00000000..bc308d1a --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_md17_phenol.yaml @@ -0,0 +1,159 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 32 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 10000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_md17_phenol + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md # + mol_name: phenol + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: phenol + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: phenol + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/infgcn/infgcn_md17_resorcinol.yaml b/electronic_structure/configs/infgcn/infgcn_md17_resorcinol.yaml new file mode 100644 index 00000000..e224fd97 --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_md17_resorcinol.yaml @@ -0,0 +1,159 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 32 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 10000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_md17_resorcinol + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 3 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.005 + factor: 0.5 + patience: 5 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md # + mol_name: resorcinol + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 4 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: resorcinol + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 8 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: SmallDensityDataset + __init_params__: + root: ./data/data_md + mol_name: resorcinol + split: "test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 2 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: null + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/infgcn/infgcn_mp.yaml b/electronic_structure/configs/infgcn/infgcn_mp.yaml new file mode 100644 index 00000000..7202978a --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_mp.yaml @@ -0,0 +1,172 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 2 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 100000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_mp + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 84 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.001 + factor: 0.5 + patience: 10 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_cubic + split_file: crystal_data_split.json + atom_file: ./data/data_cubic/crystal.json + extension: json + compression: xz + pbc: false + split: "train" + enable_cache: false # if have enough space, set true, which is not completely tested in this dataset + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 1024 + val: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_cubic + split_file: crystal_data_split.json + atom_file: ./data/data_cubic/crystal.json + extension: json + compression: xz + pbc: false + split: "validation" + enable_cache: false # if have enough space, set true, which is not completely tested in this dataset + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 6 # recommend >2 <=6, on V100 16G GPU + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator + collate_params: + n_samples: 4096 + test: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_cubic + split_file: crystal_data_split.json + atom_file: ./data/data_cubic/crystal.json + extension: json + compression: xz + pbc: false + split: "test" + rotate: false + enable_cache: false # if have enough space, set true, which is not completely tested in this dataset + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory diff --git a/electronic_structure/configs/infgcn/infgcn_omol25_MC_5k_trimmed.yaml b/electronic_structure/configs/infgcn/infgcn_omol25_MC_5k_trimmed.yaml new file mode 100644 index 00000000..3f77e897 --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_omol25_MC_5k_trimmed.yaml @@ -0,0 +1,195 @@ +Global: + do_train: True + do_eval: True + do_test: False + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 100 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 1000000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_omol25_MC_5k_trimmed + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 84 + num_radial: 32 + num_spherical: 7 + radial_embed_size: 32 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 6.0 + grid_cutoff: 6.0 + is_fc: True + gauss_start: 0.5 + gauss_end: 5.0 + activation: norm + residual: true + pbc: false + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.001 + factor: 0.5 + patience: 10 + min_lr: 1.0e-05 + by_epoch: true + indicator: eval_loss + indicator_name: loss + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +# remind: just subsets of Metal Complexes of OMol25 +Dataset: + train: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/dataset_OMol25_MC_5k + split_file: omol25_s1_trimmed.json + atom_file: ./data/dataset_OMol25_MC_5k/omol25.json + extension: cube + compression: lz4 + pbc: false + split: train + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: false + drop_last: false + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: false + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + sampling_mode: uniform + uniform_random_offset: true + sampling_seed: 42 + clip_max: 200.0 + importance_sampling: true + importance_threshold: 1.0e-05 + importance_ratio: 0.6 + extreme_threshold: 100.0 + extreme_ratio: 0.05 + val: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/dataset_OMol25_MC_5k + split_file: omol25_s1_trimmed.json + atom_file: ./data/dataset_OMol25_MC_5k/omol25.json + extension: cube + compression: lz4 + pbc: false + split: validation + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: false + drop_last: false + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: false + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + sampling_mode: uniform + uniform_random_offset: true + sampling_seed: 42 + clip_max: 200.0 + importance_sampling: true + importance_threshold: 1.0e-05 + importance_ratio: 0.6 + extreme_threshold: 100.0 + extreme_ratio: 0.05 + test: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/dataset_OMol25_MC_5k + split_file: omol25_s1_trimmed.json + atom_file: ./data/dataset_OMol25_MC_5k/omol25.json + extension: cube + compression: lz4 + pbc: false + split: test + rotate: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: false + drop_last: false + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: false + collate_fn: DensityCollator + collate_params: + n_samples: 2048 + sampling_mode: uniform + uniform_random_offset: true + sampling_seed: 42 + clip_max: 200.0 + importance_sampling: true + importance_threshold: 1.0e-05 + importance_ratio: 0.6 + extreme_threshold: 100.0 + extreme_ratio: 0.05 diff --git a/electronic_structure/configs/infgcn/infgcn_qm9.yaml b/electronic_structure/configs/infgcn/infgcn_qm9.yaml new file mode 100644 index 00000000..79aaba21 --- /dev/null +++ b/electronic_structure/configs/infgcn/infgcn_qm9.yaml @@ -0,0 +1,177 @@ +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 2 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 100000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/infgcn_qm9 + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "mae" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + +Model: + __class_name__: InfGCN + __init_params__: + n_atom_type: 5 + num_radial: 16 + num_spherical: 7 + radial_embed_size: 64 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 3.0 + grid_cutoff: 3.0 + is_fc: false + gauss_start: 0.5 + gauss_end: 5.0 + residual: true + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.001 + factor: 0.5 + patience: 10 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + +Dataset: + train: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_qm9 + split_file: qm9_data_split.json + atom_file: ./data/data_qm9/qm9.json + extension: CHGCAR + compression: lz4 + pbc: false + split: "train" + enable_cache: false # if have enough space, set true, which is not completely tested in this dataset + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + val: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_qm9 + split_file: qm9_data_split.json + atom_file: ./data/data_qm9/qm9.json + extension: CHGCAR + compression: lz4 + pbc: false + split: "validation" + enable_cache: false # if have enough space, set true, which is not completely tested in this dataset + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: DensityDataset + __init_params__: + root: ./data/data_qm9 + split_file: qm9_data_split.json + atom_file: ./data/data_qm9/qm9.json + extension: CHGCAR + compression: lz4 + pbc: false + split: "test" + rotate: false + enable_cache: false # if have enough space, set true, which is not completely tested in this dataset + overwrite: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 1 + loader: + num_workers: 4 + use_shared_memory: Flase + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 # recommend set blank if have enough gpu memory + +Predict: + eval_with_no_grad: True + num_infer: 100 + num_vis: 2 + inf_samples: 4096 diff --git a/electronic_structure/configs/mateno/mateno_omol25.yaml b/electronic_structure/configs/mateno/mateno_omol25.yaml new file mode 100644 index 00000000..140cb542 --- /dev/null +++ b/electronic_structure/configs/mateno/mateno_omol25.yaml @@ -0,0 +1,176 @@ +# MatENO Configuration for OMol25 Dataset +Global: + do_train: True + do_eval: True + do_test: True + use_voxel: False + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Max iteration which equals to steps * epoches, to early stop + max_iter: 40000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mateno_omol25 + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 2000 + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 0 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "density" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: True + + +Model: + __class_name__: MatENO + __init_params__: + n_atom_type: 69 + num_radial: 32 + num_spherical: 7 + radial_embed_size: 32 + radial_hidden_size: 128 + num_radial_layer: 2 + num_gcn_layer: 3 + cutoff: 5.0 + grid_cutoff: 5.0 + is_fc: True + gauss_start: 0.5 + gauss_end: 5.0 + activation: "norm" + residual: True + pbc: False + +Metric: + density: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.001 + factor: 0.5 + patience: 10 + min_lr: 0.00001 + by_epoch: True + indicator: "eval_loss" + indicator_name: "loss" + weight_decay: 0.0 + beta1: 0.9 + beta2: 0.999 + # parameters'gradients clip setting, please choose one of three following methods: clip_norm:value, clip_norm_global:value, clip_value:value + clip_norm_global: 100.0 + +Dataset: + train: + dataset: + __class_name__: DensityDataset + __init_params__: + root: /home/liuxuwei01/data_afs/dataset_OMol25_MC_5k/processed_out + split_file: omol25_data_split.json + atom_file: /home/liuxuwei01/data_afs/dataset_OMol25_MC_5k/processed_out/omol25.json + extension: cube + compression: lz4 + pbc: false + split: "train" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 2 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + val: + dataset: + __class_name__: DensityDataset + __init_params__: + root: /home/liuxuwei01/data_afs/dataset_OMol25_MC_5k/processed_out + split_file: omol25_data_split.json + atom_file: /home/liuxuwei01/data_afs/dataset_OMol25_MC_5k/processed_out/omol25.json + extension: cube + compression: lz4 + pbc: false + split: "validation" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 2 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 + test: + dataset: + __class_name__: DensityDataset + __init_params__: + root: /home/liuxuwei01/data_afs/dataset_OMol25_MC_5k/processed_out + split_file: omol25_data_split.json + atom_file: /home/liuxuwei01/data_afs/dataset_OMol25_MC_5k/processed_out/omol25.json + extension: cube + compression: lz4 + pbc: false + split: "test" + rotate: false + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 2 + loader: + num_workers: 0 + use_shared_memory: Flase + collate_fn: DensityCollator # DensityVoxelCollator # if use voxel + collate_params: + n_samples: 2048 diff --git a/electronic_structure/docs/infgcn.png b/electronic_structure/docs/infgcn.png new file mode 100644 index 00000000..4e2d7005 Binary files /dev/null and b/electronic_structure/docs/infgcn.png differ diff --git a/electronic_structure/generate_dataset.py b/electronic_structure/generate_dataset.py new file mode 100644 index 00000000..19188e03 --- /dev/null +++ b/electronic_structure/generate_dataset.py @@ -0,0 +1,58 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +from pathlib import Path + +import numpy as np + + +def read_xyz(file): + all_coords = [] + try: + while True: + n_atom = int(file.readline()) + file.readline() + coords = [] + for _ in range(n_atom): + coords.append([float(x) for x in file.readline().split()[1:4]]) + all_coords.append(coords) + except (StopIteration, ValueError): + all_coords = np.array(all_coords, dtype=float) + print(all_coords.shape) + return all_coords + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--root", type=str, default="./data") + parser.add_argument("--out", type=str, default="./data") + args = parser.parse_args() + root = Path(args.root) + out = Path(args.out) + for mol in ["ethane", "malonaldehyde"]: + den = np.loadtxt(root / f"{mol}_300K/densities.txt") + train_dir = root / f"{mol}/{mol}_train/" + os.makedirs(train_dir, exist_ok=True) + np.save(train_dir / "dft_densities.npy", den) + with open(root / f"{mol}_300K/structures.xyz") as f: + np.save(train_dir / "structures.npy", read_xyz(f)) + den = np.loadtxt(root / f"{mol}_300K-test/densities.txt") + test_dir = root / f"{mol}/{mol}_test/" + os.makedirs(test_dir, exist_ok=True) + np.save(test_dir / "dft_densities.npy", den) + with open(root / f"{mol}_300K-test/structures.xyz") as f: + np.save(test_dir / "structures.npy", read_xyz(f)) + print("Done") diff --git a/electronic_structure/predict.py b/electronic_structure/predict.py new file mode 100644 index 00000000..d466f3ce --- /dev/null +++ b/electronic_structure/predict.py @@ -0,0 +1,1065 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import argparse +import copy +import gzip +import json +import lzma +import math +from pathlib import Path +import numpy as np +import time + +import paddle +import plotly.graph_objects as go +from omegaconf import OmegaConf +from tqdm import tqdm + +try: + from IPython.display import Image, display +except ImportError: # Optional dependency; visualization still works for files + Image, display = None, None + +from ppmat.datasets import DensityDataset +from ppmat.datasets import SmallDensityDataset +from ppmat.datasets.geometric_data_type.data import Data +from ppmat.models import build_model +from ppmat.utils import logger +from ppmat.utils.misc import set_random_seed + +BOHR2ANG = 0.529177 +ANG2BOHR = 1.0 / BOHR2ANG + + +def get_pretrained_model(cfg_path, model_path): + logger.info(f"from {cfg_path} loading config") + cfg = OmegaConf.load(cfg_path) + cfg = OmegaConf.to_container(cfg, resolve=True) + + model = build_model(cfg["Model"]) + logger.info(f"from {model_path}loading model") + # if a directory is given, pick best > latest > highest epoch > any pdparams + mpath = Path(model_path) + if mpath.is_dir(): + candidates = list(mpath.glob("**/*.pdparams")) + chosen = None + for name in ["best.pdparams", "latest.pdparams"]: + hits = [c for c in candidates if c.name == name] + if hits: + chosen = hits[0] + break + if chosen is None: + epochs = [] + for c in candidates: + stem = c.stem + if stem.startswith("epoch_"): + try: + ep = int(stem.split("_")[1]) + epochs.append((ep, c)) + except Exception: + pass + if epochs: + epochs.sort(key=lambda x: -x[0]) + chosen = epochs[0][1] + if chosen is None and candidates: + chosen = candidates[0] + if chosen is None: + raise FileNotFoundError(f"No .pdparams found under {model_path}") + model_path = str(chosen) + logger.info(f"Resolved checkpoint path: {model_path}") + + state_dict = paddle.load(model_path) + if isinstance(state_dict, dict) and "model" in state_dict: + model.set_state_dict(state_dict["model"]) + else: + model.set_state_dict(state_dict) + return model + + +def inference_model(model, g, density, grid_coord, infos, grid_batch_size=8196): + with paddle.no_grad(): + model.eval() + device = paddle.get_device() + prepared_infos = ( + model._prepare_infos(infos, device) if hasattr(model, "_prepare_infos") else infos + ) + if grid_batch_size is None: + if hasattr(model, "_forward_density"): + preds = model._forward_density( + g.x, g.pos, grid_coord, g.batch, prepared_infos + ).squeeze(0) + else: + # Fallback for legacy models expecting raw tensors + preds = model(g.x, g.pos, grid_coord, g.batch, prepared_infos).squeeze(0) + else: + preds = [] + total = grid_coord.shape[1] + step = grid_batch_size + num_iter = (total + step - 1) // step + for start in tqdm(range(0, total, step), total=num_iter): + end = min(start + step, total) + grid = grid_coord[:, start:end] + if hasattr(model, "_forward_density"): + preds.append( + model._forward_density( + g.x, g.pos, grid, g.batch, prepared_infos + ).squeeze(0) + ) + else: + preds.append( + model(g.x, g.pos, grid, g.batch, prepared_infos).squeeze(0) + ) + preds = paddle.concat(preds, axis=0) + + if density is None: + return preds, None, None + + mask = (density > 0).astype(dtype="float32") + preds = preds * mask + density = density * mask + diff = paddle.abs(preds - density) + loss = diff.pow(2).sum() + denom = paddle.clip(density.sum(), min=1e-12) + mae = diff.sum() / denom + return preds, loss, mae + + +def draw_volume( + grid, + density, + atom_type, + atom_coord, + isomin=0.05, + isomax=None, + surface_count=5, + title=None, +): + atom_colorscale = ["grey", "white", "red", "blue", "green"] + fig = go.Figure() + fig.add_trace( + go.Volume( + x=grid[..., 0], + y=grid[..., 1], + z=grid[..., 2], + value=density, + isomin=isomin, + isomax=isomax, + opacity=0.1, + surface_count=surface_count, + caps=dict(x_show=False, y_show=False, z_show=False), + ) + ) + + axis_dict = dict( + showgrid=False, + showbackground=False, + zeroline=False, + visible=False, + ) + + fig.add_trace( + go.Scatter3d( + x=atom_coord[:, 0], + y=atom_coord[:, 1], + z=atom_coord[:, 2], + mode="markers", + marker=dict( + size=10, + color=atom_type, + cmin=0, + cmax=4, + colorscale=atom_colorscale, + opacity=0.6, + ), + ) + ) + + if title is not None: + title = dict( + text=title, + x=0.5, + y=0.3, + xanchor="center", + yanchor="bottom", + ) + + fig.update_layout( + autosize=False, + width=800, + height=800, + showlegend=False, + scene=dict(xaxis=axis_dict, yaxis=axis_dict, zaxis=axis_dict), + title=title, + title_font_family="Times New Roman", + ) + + return fig + + +def safe_write_image(fig, path, show_plot=False): + try: + fig.write_image(path) + logger.info(f"Image saved to: {path}") + except Exception as e: + logger.warning(f"Failed to save image {path}: {e}") + try: + html_path = path.with_suffix(".html") + fig.write_html(html_path) + logger.info(f"Saved interactive HTML instead: {html_path}") + except Exception as html_e: + logger.warning(f"Failed to save HTML fallback for {path}: {html_e}") + + if show_plot: + try: + if Image is None or display is None: + raise ImportError("IPython not installed") + img_bytes = fig.to_image(format="png", scale=2) + display(Image(img_bytes)) + except Exception as e: + logger.warning(f"Failed to display image: {e}") + + +def maybe_downsample_volume(grid, values, shape, max_points=250_000): + """ + Downsample a regular 3D grid for visualization to keep Plotly volume traces responsive. + grid: numpy array of shape (n_points, 3) + values: list of numpy arrays aligned with grid, each of shape (n_points,) + shape: original lattice shape [nx, ny, nz] + """ + if shape is None or len(shape) != 3: + return grid, values, False, 1 + + try: + shape = [int(s) for s in shape] + total = shape[0] * shape[1] * shape[2] + except Exception: + return grid, values, False, 1 + + if total != grid.shape[0] or any(val.shape[0] != grid.shape[0] for val in values): + return grid, values, False, 1 + if total <= max_points: + return grid, values, False, 1 + + stride = max(1, math.ceil((total / max_points) ** (1 / 3))) + try: + grid_view = grid.reshape(shape[0], shape[1], shape[2], 3) + grid_ds = grid_view[::stride, ::stride, ::stride, :].reshape(-1, 3) + values_ds = [ + val.reshape(shape[0], shape[1], shape[2])[::stride, ::stride, ::stride].reshape(-1) + for val in values + ] + except Exception as e: + logger.warning(f"Failed to downsample grid for visualization: {e}") + return grid, values, False, 1 + + return grid_ds, values_ds, True, stride + + +def write_cube_generic(fileobj, atom_type, atom_coord, density, info, idx2atom_num=None): + """ + Minimal cube writer for datasets without a built-in write_cube method. + idx2atom_num maps dataset atom indices to atomic numbers (e.g., [6,1,8] for C/H/O). + """ + fileobj.write("Cube file written on " + time.strftime("%c")) + fileobj.write("\nOUTER LOOP: X, MIDDLE LOOP: Y, INNER LOOP: Z\n") + cell = info["cell"] + shape = info["shape"] + origin = info.get("origin", np.zeros(3, dtype=np.float32)) + fileobj.write("{0:5}{1:12.6f}{2:12.6f}{3:12.6f}\n".format(len(atom_type), *origin)) + for s, c in zip(shape, cell): + d = c / s + fileobj.write("{0:5}{1:12.6f}{2:12.6f}{3:12.6f}\n".format(s, *d)) + for Z, (x, y, z) in zip(atom_type, atom_coord): + atomic_num = int(idx2atom_num[int(Z)]) if idx2atom_num is not None else int(Z) + fileobj.write( + "{0:5}{1:12.6f}{2:12.6f}{3:12.6f}{4:12.6f}\n".format( + atomic_num, float(atomic_num), x, y, z + ) + ) + density.tofile(fileobj, sep="\n", format="%e") + + +def parse_grid_shape(shape_str): + parts = [p.strip() for p in str(shape_str).split(",") if p.strip()] + if len(parts) == 1: + n = int(parts[0]) + if n <= 1: + raise ValueError(f"Invalid mol_grid_shape {shape_str}, each dimension must be > 1") + return [n, n, n] + if len(parts) == 3: + shape = [int(p) for p in parts] + if any(s <= 1 for s in shape): + raise ValueError(f"Invalid mol_grid_shape {shape_str}, each dimension must be > 1") + return shape + raise ValueError(f"Invalid mol_grid_shape {shape_str}, expected 'N' or 'Nx,Ny,Nz'") + + +def normalize_element_symbol(symbol): + sym = str(symbol).strip() + if len(sym) == 0: + return sym + if len(sym) == 1: + return sym.upper() + return sym[0].upper() + sym[1:].lower() + + +def load_atom_mapping(atom_file): + with Path(atom_file).open() as f: + atom_info = json.load(f) + + atom_name2idx = {} + idx2atom_num = {} + for idx, item in enumerate(atom_info): + sym = normalize_element_symbol(item["name"]) + atom_name2idx[sym] = idx + idx2atom_num[idx] = int(item["atom_num"]) + return atom_name2idx, idx2atom_num + + +def resolve_atom_file_for_mol(args_atom_file, dataset_atom_file): + candidates = [] + if args_atom_file is not None: + candidates.append(Path(args_atom_file).expanduser()) + if dataset_atom_file is not None: + candidates.append(Path(dataset_atom_file).expanduser()) + + for cand in candidates: + if cand.exists(): + return cand + + fallback = Path("/home/liuxuwei01/processed_output/omol25.json") + if fallback.exists(): + logger.warning( + f"Configured atom_file not found ({candidates}); falling back to {fallback}" + ) + return fallback + + raise FileNotFoundError( + "Could not resolve atom_file for MOL inference. " + f"Checked: {[str(c) for c in candidates]} and fallback {fallback}" + ) + + +def collect_mol_files(mol_input, mol_pattern): + mol_path = Path(mol_input).expanduser() + if mol_path.is_file(): + return [mol_path] + if not mol_path.is_dir(): + raise FileNotFoundError(f"mol_input path not found: {mol_path}") + + files = sorted([p for p in mol_path.glob(mol_pattern) if p.is_file()]) + if not files: + files = sorted([p for p in mol_path.iterdir() if p.is_file() and p.suffix.lower() == ".mol"]) + if not files: + raise FileNotFoundError(f"No .mol files found in directory: {mol_path}") + return files + + +def open_text_maybe_compressed(path): + suffixes = "".join(path.suffixes).lower() + if suffixes.endswith(".lz4"): + import lz4.frame + + return lz4.frame.open(path, mode="rt") + if suffixes.endswith(".xz"): + return lzma.open(path, mode="rt") + if suffixes.endswith(".gz"): + return gzip.open(path, mode="rt") + return path.open(mode="rt") + + +def read_cube_density(path): + with open_text_maybe_compressed(path) as f: + f.readline() + f.readline() + line = f.readline().split() + if len(line) < 4: + raise ValueError(f"Invalid CUBE header (line 3) in {path}") + n_atom = int(line[0]) + origin = np.array([float(x) for x in line[1:4]], dtype=np.float32) + + shape = [] + cell = np.zeros((3, 3), dtype=np.float32) + for i in range(3): + row = f.readline().split() + if len(row) < 4: + raise ValueError(f"Invalid CUBE axis line in {path}") + n, x, y, z = [float(s) for s in row[:4]] + shape.append(int(n)) + cell[i] = np.array([x, y, z], dtype=np.float32) + + x_coord = np.arange(shape[0], dtype=np.float32)[:, None] * cell[0][None, :] + y_coord = np.arange(shape[1], dtype=np.float32)[:, None] * cell[1][None, :] + z_coord = np.arange(shape[2], dtype=np.float32)[:, None] * cell[2][None, :] + grid_coord = ( + x_coord.reshape(-1, 1, 1, 3) + + y_coord.reshape(1, -1, 1, 3) + + z_coord.reshape(1, 1, -1, 3) + ).reshape(-1, 3) + grid_coord = grid_coord + origin + + atom_coord_ref = [] + for _ in range(n_atom): + row = f.readline().split() + if len(row) < 5: + raise ValueError(f"Invalid CUBE atom line in {path}") + atom_coord_ref.append([float(row[2]), float(row[3]), float(row[4])]) + + n_grid = shape[0] * shape[1] * shape[2] + vals = [] + for line in f: + parts = line.split() + if parts: + vals.extend(parts) + if len(vals) < n_grid: + raise ValueError(f"CUBE data too short in {path}: expect {n_grid}, got {len(vals)}") + density = np.array(vals[:n_grid], dtype=np.float32) + + return ( + paddle.to_tensor(density, dtype="float32"), + paddle.to_tensor(grid_coord, dtype="float32"), + { + "shape": shape, + "cell": paddle.to_tensor(cell, dtype="float32"), + "origin": paddle.to_tensor(origin, dtype="float32"), + "atom_coord_ref": np.asarray(atom_coord_ref, dtype=np.float32), + }, + ) + + +def align_mol_atoms_to_cube(g, atom_coord_ref, sample_name, tol=0.05): + if atom_coord_ref is None: + return g + ref = np.asarray(atom_coord_ref, dtype=np.float32) + mol = g.pos.numpy().astype(np.float32) + if ref.ndim != 2 or ref.shape[1] != 3: + logger.warning(f"Invalid reference atom coordinates for {sample_name}, skip alignment") + return g + if mol.shape != ref.shape: + logger.warning( + f"Atom count mismatch for {sample_name} (mol={mol.shape[0]}, cube={ref.shape[0]}), " + "skip alignment" + ) + return g + + mol_center = mol.mean(axis=0) + ref_center = ref.mean(axis=0) + mol_c = mol - mol_center + ref_c = ref - ref_center + denom = float(np.sqrt((mol_c * mol_c).sum())) + numer = float(np.sqrt((ref_c * ref_c).sum())) + if denom < 1e-12 or numer < 1e-12: + return g + + scale = numer / denom + aligned = mol_c * scale + ref_center + rms = float(np.sqrt(np.mean((aligned - ref) ** 2))) + + # Typical unit mismatch is Angstrom->Bohr (about 1.8897). + # Apply alignment when scale obviously differs from 1.0 or residual is tiny after scaling. + if abs(scale - 1.0) > tol or rms < 1e-3: + g.pos = paddle.to_tensor(aligned, dtype="float32") + logger.info( + f"Aligned MOL coordinates to CUBE frame for {sample_name}: " + f"scale={scale:.6f} (A->Bohr~{ANG2BOHR:.6f}), rms={rms:.6e}" + ) + else: + logger.info( + f"No coordinate rescale needed for {sample_name}: scale={scale:.6f}, rms={rms:.6e}" + ) + return g + + +def resolve_true_cube_for_mol(mol_path, true_cube_dir=None): + base = sanitize_base_name(mol_path.name) + base_density = f"{base[:-3]}Density" if base.endswith("Opt") else f"{base}Density" + roots = [] + if true_cube_dir is not None: + roots.append(Path(true_cube_dir).expanduser()) + roots.append(mol_path.parent) + + stems = [base, f"{base}_true", base_density] + exts = [".cube", ".cub", ".cube.lz4", ".cube.gz", ".cube.xz", ".cub.lz4", ".cub.gz", ".cub.xz"] + name_candidates = [] + for s in stems: + for ext in exts: + name_candidates.append(f"{s}{ext}") + + seen = set() + uniq_candidates = [] + for name in name_candidates: + if name not in seen: + uniq_candidates.append(name) + seen.add(name) + + for root in roots: + if not root.exists(): + continue + for name in uniq_candidates: + p = root / name + if p.is_file(): + return p + return None + + +def parse_mol_v2000(mol_path): + lines = mol_path.read_text(errors="replace").splitlines() + if len(lines) < 4: + raise ValueError(f"MOL file too short: {mol_path}") + + counts = lines[3] + if "V3000" in counts.upper(): + raise NotImplementedError(f"V3000 MOL is not supported yet: {mol_path}") + + try: + n_atom = int(counts[:3]) + except Exception: + parts = counts.split() + if len(parts) < 2: + raise ValueError(f"Failed to parse counts line in MOL file: {mol_path}") + n_atom = int(parts[0]) + + atom_start = 4 + atom_end = atom_start + n_atom + if len(lines) < atom_end: + raise ValueError(f"Atom block incomplete in MOL file: {mol_path}") + + coords = [] + symbols = [] + for line in lines[atom_start:atom_end]: + parts = line.split() + x = y = z = None + sym = None + if len(parts) >= 4: + try: + x, y, z = float(parts[0]), float(parts[1]), float(parts[2]) + sym = parts[3] + except Exception: + x = y = z = None + sym = None + if x is None: + try: + x = float(line[0:10]) + y = float(line[10:20]) + z = float(line[20:30]) + sym = line[31:34].strip() + except Exception as e: + raise ValueError(f"Failed to parse atom line in {mol_path}: {line}") from e + + coords.append([x, y, z]) + symbols.append(normalize_element_symbol(sym)) + + return np.asarray(coords, dtype=np.float32), symbols + + +def build_mol_sample(mol_path, atom_name2idx, mol_grid_shape, mol_grid_padding): + atom_coord_np, atom_symbols = parse_mol_v2000(mol_path) + + atom_type_idx = [] + missing = set() + for sym in atom_symbols: + idx = atom_name2idx.get(sym) + if idx is None: + missing.add(sym) + else: + atom_type_idx.append(idx) + if missing: + raise ValueError( + f"Found atoms not covered by atom_file mapping in {mol_path}: {sorted(missing)}" + ) + + atom_type = paddle.to_tensor(atom_type_idx, dtype="int64") + atom_coord = paddle.to_tensor(atom_coord_np, dtype="float32") + g = Data(x=atom_type, pos=atom_coord) + + shape = [int(s) for s in mol_grid_shape] + min_coord = atom_coord_np.min(axis=0) + max_coord = atom_coord_np.max(axis=0) + span = np.maximum(max_coord - min_coord, np.array([1e-3, 1e-3, 1e-3], dtype=np.float32)) + axis_len = span + 2.0 * float(mol_grid_padding) + center = 0.5 * (min_coord + max_coord) + origin = center - 0.5 * axis_len + + x = np.linspace(origin[0], origin[0] + axis_len[0], num=shape[0], endpoint=False, dtype=np.float32) + y = np.linspace(origin[1], origin[1] + axis_len[1], num=shape[1], endpoint=False, dtype=np.float32) + z = np.linspace(origin[2], origin[2] + axis_len[2], num=shape[2], endpoint=False, dtype=np.float32) + grid = np.stack(np.meshgrid(x, y, z, indexing="ij"), axis=-1).reshape(-1, 3).astype(np.float32) + grid_coord = paddle.to_tensor(grid, dtype="float32") + + cell = np.diag(axis_len.astype(np.float32)) + info = { + "shape": shape, + "cell": paddle.to_tensor(cell, dtype="float32"), + "origin": paddle.to_tensor(origin.astype(np.float32), dtype="float32"), + "file_name": mol_path.name, + } + + return g, None, grid_coord, info + + +def sanitize_base_name(sample_name): + base_name = Path(sample_name).name + for suf in [".lz4", ".zst", ".gz"]: + if base_name.endswith(suf): + base_name = base_name[: -len(suf)] + for suf in [".cube", ".CHGCAR", ".json", ".mol"]: + if base_name.endswith(suf): + base_name = base_name[: -len(suf)] + return base_name + + +def prepare_info_cube(info, grid_coord): + info_cube = {} + shape = info.get("shape") + cell = info.get("cell") + origin = info.get("origin", None) + grid_np_full = grid_coord.detach().cpu().numpy() + + if shape is not None and len(shape) == 3: + try: + shape_i = [int(s) for s in shape] + grid_view = grid_np_full.reshape(shape_i[0], shape_i[1], shape_i[2], 3) + origin_np = grid_view[0, 0, 0] + step_x = ( + grid_view[1, 0, 0] - grid_view[0, 0, 0] + if shape_i[0] > 1 + else np.zeros(3, dtype=np.float32) + ) + step_y = ( + grid_view[0, 1, 0] - grid_view[0, 0, 0] + if shape_i[1] > 1 + else np.zeros(3, dtype=np.float32) + ) + step_z = ( + grid_view[0, 0, 1] - grid_view[0, 0, 0] + if shape_i[2] > 1 + else np.zeros(3, dtype=np.float32) + ) + cell_from_grid = np.stack( + [step_x * shape_i[0], step_y * shape_i[1], step_z * shape_i[2]], axis=0 + ) + except Exception: + origin_np = None + cell_from_grid = None + else: + origin_np = None + cell_from_grid = None + + if shape is not None: + info_cube["shape"] = [int(s) for s in shape] + if cell is not None: + if hasattr(cell, "numpy"): + info_cube["cell"] = cell.numpy() + else: + info_cube["cell"] = np.array(cell, dtype=np.float32) + if cell_from_grid is not None: + info_cube["cell"] = cell_from_grid + if origin is not None: + if hasattr(origin, "numpy"): + info_cube["origin"] = origin.numpy() + else: + info_cube["origin"] = np.array(origin, dtype=np.float32) + if origin_np is not None: + info_cube["origin"] = origin_np + return info_cube + + +def main(): + parser = argparse.ArgumentParser(description="InfGCN electron density inference") + parser.add_argument( + "--config", + default="electronic_structure/configs/infgcn/infgcn_qm9.yaml", + help="Path to config yaml", + ) + parser.add_argument( + "--checkpoint", + default="output/infgcn_qm9_best/infgcn_qm9.pdparams", + help="Checkpoint (.pdparams) to load", + ) + parser.add_argument( + "--split", + default="test", + choices=["train", "validation", "test"], + help="Dataset split to sample from", + ) + parser.add_argument( + "--index", + default=0, + type=int, + help="Index within the chosen split", + ) + parser.add_argument( + "--data_root", + default=None, + help="Override dataset root; defaults to value in config", + ) + parser.add_argument( + "--split_file", + default=None, + help="Override split file path; defaults to value in config", + ) + parser.add_argument( + "--atom_file", + default=None, + help="Override atom info file; defaults to value in config", + ) + parser.add_argument( + "--output_dir", + default="./results", + help="Directory to store predictions/visualizations", + ) + parser.add_argument( + "--grid_batch_size", + default=4096, + type=int, + help="Number of grid points per forward pass", + ) + parser.add_argument( + "--skip_vis", + action="store_true", + help="Skip writing/visualizing density plots", + ) + parser.add_argument( + "--save_true_cube", + action="store_true", + help="Save reference (DFT) electron density as a cube file", + ) + parser.add_argument( + "--save_pred_cube", + action="store_true", + help="Save predicted electron density as a cube file", + ) + parser.add_argument( + "--save_html", + action="store_true", + help="Save Plotly figures as interactive HTML (in addition to PNG)", + ) + parser.add_argument( + "--cube_dir", + default=None, + help="Directory to store cube files (defaults to output_dir)", + ) + parser.add_argument( + "--show_plot", + action="store_true", + help="Display plotly figures inline (requires kaleido)", + ) + parser.add_argument( + "--mol_input", + default=None, + help="Path to a .mol file or a directory of .mol files for direct structure inference", + ) + parser.add_argument( + "--mol_pattern", + default="*.mol", + help="Glob pattern when --mol_input is a directory", + ) + parser.add_argument( + "--mol_grid_shape", + default="80,80,80", + help="Grid shape for MOL inference, e.g. '80' or '80,80,80'", + ) + parser.add_argument( + "--mol_grid_padding", + default=6.0, + type=float, + help="Padding (Angstrom) around molecular coordinates for MOL grid generation", + ) + parser.add_argument( + "--mol_true_cube_dir", + default=None, + help=( + "Optional directory containing reference/true CUBE files for MOL inputs. " + "Expected names: .cube or _true.cube" + ), + ) + args = parser.parse_args() + + set_random_seed(42) + + cfg = OmegaConf.load(args.config) + cfg = OmegaConf.to_container(cfg, resolve=True) + + split_key = "val" if args.split == "validation" else args.split + ds_cfg_full = cfg["Dataset"][split_key]["dataset"] + dataset_cfg = ds_cfg_full.get("__init_params__", {}) + dataset_params = copy.deepcopy(dataset_cfg) + dataset_params["split"] = args.split + if args.data_root is not None: + dataset_params["root"] = args.data_root + if args.split_file is not None: + dataset_params["split_file"] = args.split_file + if args.atom_file is not None: + dataset_params["atom_file"] = args.atom_file + + use_mol_mode = args.mol_input is not None + + dataset = None + cube_writer = None + idx2atom_num = None + atom_name2idx = None + mol_files = [] + mol_grid_shape = None + + if use_mol_mode: + atom_file_path = resolve_atom_file_for_mol( + args.atom_file, + dataset_params.get("atom_file"), + ) + atom_name2idx, idx2atom_num = load_atom_mapping(atom_file_path) + mol_files = collect_mol_files(args.mol_input, args.mol_pattern) + mol_grid_shape = parse_grid_shape(args.mol_grid_shape) + cube_writer = lambda f, a, c, d, i: write_cube_generic( + f, a, c, d, i, idx2atom_num + ) + logger.info( + f"MOL mode enabled: {len(mol_files)} file(s), atom_file={atom_file_path}, " + f"grid_shape={mol_grid_shape}, padding={args.mol_grid_padding}, " + f"true_cube_dir={args.mol_true_cube_dir}" + ) + else: + dataset_cls_name = ds_cfg_full.get("__class_name__", "DensityDataset") + dataset_cls_map = { + "DensityDataset": DensityDataset, + "SmallDensityDataset": SmallDensityDataset, + } + if dataset_cls_name not in dataset_cls_map: + raise ValueError(f"Unsupported dataset class {dataset_cls_name}") + dataset = dataset_cls_map[dataset_cls_name](**dataset_params) + cube_writer = getattr(dataset, "write_cube", None) + idx2atom_num = getattr(dataset, "idx2atom_num", None) + if cube_writer is None: + if isinstance(dataset, SmallDensityDataset): + # Atom order in SmallDensityDataset: C=0, H=1, O=2 + idx2atom_num = np.array([6, 1, 8], dtype=np.int64) + cube_writer = lambda f, a, c, d, i: write_cube_generic( + f, a, c, d, i, idx2atom_num + ) + else: + cube_writer = lambda *args, **kwargs: (_ for _ in ()).throw( + AttributeError("Cube writer not available for this dataset") + ) + if args.index >= len(dataset): + raise IndexError( + f"Index {args.index} exceeds dataset size {len(dataset)} for split {args.split}" + ) + + device = "gpu" if paddle.is_compiled_with_cuda() else "cpu" + paddle.set_device(device) + logger.info(f"Running inference on device: {device}") + + output_dir = Path(args.output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + cube_dir = Path(args.cube_dir) if args.cube_dir is not None else output_dir + cube_dir.mkdir(parents=True, exist_ok=True) + + logger.info(f"Loading the pretrained model from {args.checkpoint}") + model = get_pretrained_model(args.config, args.checkpoint) + logger.info("Model loaded successfully.") + + if use_mol_mode: + sample_iter = tqdm(mol_files, desc="MOL inference") + else: + sample_iter = [args.index] + + for sample_item in sample_iter: + if use_mol_mode: + mol_path = sample_item + g, density, grid_coord, info = build_mol_sample( + mol_path, + atom_name2idx, + mol_grid_shape, + args.mol_grid_padding, + ) + true_cube_path = resolve_true_cube_for_mol(mol_path, args.mol_true_cube_dir) + if true_cube_path is not None: + try: + density, grid_coord, info_ref = read_cube_density(true_cube_path) + g = align_mol_atoms_to_cube(g, info_ref.get("atom_coord_ref"), mol_path.name) + info = dict(info_ref) + info["file_name"] = mol_path.name + info["true_cube_file"] = str(true_cube_path) + logger.info(f"Using reference cube for {mol_path.name}: {true_cube_path}") + except Exception as e: + logger.warning( + f"Failed to read reference cube for {mol_path.name} at {true_cube_path}: {e}" + ) + sample_name = info.get("file_name", mol_path.name) + else: + sample_name = f"{args.split}_{args.index}" + g, density, grid_coord, info = dataset[args.index] + sample_name = info.get("file_name", sample_name) + + g.batch = paddle.zeros_like(g.x) + g = g.to(device) + if density is not None: + density = density.to(device) + grid_coord = grid_coord.to(device) + + logger.info(f"Starting prediction for sample: {sample_name}") + preds, loss, mae = inference_model( + model, + g, + density, + grid_coord[None], + [info], + grid_batch_size=args.grid_batch_size, + ) + if loss is not None and mae is not None: + logger.info( + f"Prediction completed for {sample_name}, " + f"Loss: {float(loss):.6f}, MAE: {float(mae):.6f}" + ) + else: + logger.info(f"Prediction completed for {sample_name} (no reference density)") + + sample_tag = sanitize_base_name(sample_name) + + if args.save_true_cube or args.save_pred_cube: + atom_type_np = g.x.detach().cpu().numpy() + atom_coord_np = g.pos.detach().cpu().numpy() + info_cube = prepare_info_cube(info, grid_coord) + + if args.save_true_cube: + if density is None: + logger.warning( + f"Skipping true cube for {sample_name}: no reference density available" + ) + else: + true_cube_path = cube_dir / f"{sample_tag}_true.cube" + with true_cube_path.open("w") as f: + cube_writer( + f, + atom_type_np, + atom_coord_np, + density.detach().cpu().numpy(), + info_cube, + ) + logger.info(f"Saved reference density cube to: {true_cube_path}") + + if args.save_pred_cube: + pred_cube_path = cube_dir / f"{sample_tag}_pred.cube" + with pred_cube_path.open("w") as f: + cube_writer( + f, + atom_type_np, + atom_coord_np, + preds.detach().cpu().numpy(), + info_cube, + ) + logger.info(f"Saved predicted density cube to: {pred_cube_path}") + + if not args.skip_vis: + grid_np = grid_coord.detach().cpu().numpy() + preds_np = preds.detach().cpu().numpy() + shape = info.get("shape") + atom_type = g.x.detach().cpu().numpy() + atom_coord = g.pos.detach().cpu().numpy() + + if density is not None: + density_np = density.detach().cpu().numpy() + diff_np = density_np - preds_np + grid_vis, (density_vis, diff_vis, preds_vis), did_downsample, stride = ( + maybe_downsample_volume( + grid_np, + [density_np, diff_np, preds_np], + shape if shape is None else [int(s) for s in shape], + ) + ) + if did_downsample: + logger.warning( + f"Downsampled volume grid from {grid_np.shape[0]} to {grid_vis.shape[0]} " + f"points for visualization (stride={stride}) to keep HTML output responsive." + ) + + logger.info("Visualizing the DFT electron density") + fig = draw_volume( + grid_vis, + density_vis, + atom_type, + atom_coord, + isomin=0.05, + isomax=3.5, + surface_count=5, + title="DFT electron density", + ) + true_density_path = output_dir / f"{sample_tag}_true_density.png" + safe_write_image(fig, true_density_path, show_plot=args.show_plot) + if args.save_html: + fig.write_html(output_dir / f"{sample_tag}_true_density.html") + + logger.info("Visualizing electron density difference") + fig = draw_volume( + grid_vis, + diff_vis, + atom_type, + atom_coord, + isomin=-0.06, + isomax=0.06, + surface_count=4, + title="Electron Density Difference", + ) + diff_density_path = output_dir / f"{sample_tag}_diff_density.png" + safe_write_image(fig, diff_density_path, show_plot=args.show_plot) + if args.save_html: + fig.write_html(output_dir / f"{sample_tag}_diff_density.html") + + logger.info("Visualizing predicted electron density") + fig = draw_volume( + grid_vis, + preds_vis, + atom_type, + atom_coord, + isomin=0.05, + isomax=3.5, + surface_count=5, + title="Predicted Electron Density", + ) + pred_density_path = output_dir / f"{sample_tag}_pred_density.png" + safe_write_image(fig, pred_density_path, show_plot=args.show_plot) + if args.save_html: + fig.write_html(output_dir / f"{sample_tag}_pred_density.html") + else: + grid_vis, (preds_vis,), did_downsample, stride = maybe_downsample_volume( + grid_np, + [preds_np], + shape if shape is None else [int(s) for s in shape], + ) + if did_downsample: + logger.warning( + f"Downsampled volume grid from {grid_np.shape[0]} to {grid_vis.shape[0]} " + f"points for visualization (stride={stride}) to keep HTML output responsive." + ) + + logger.info("Visualizing predicted electron density") + fig = draw_volume( + grid_vis, + preds_vis, + atom_type, + atom_coord, + isomin=0.05, + isomax=3.5, + surface_count=5, + title="Predicted Electron Density", + ) + pred_density_path = output_dir / f"{sample_tag}_pred_density.png" + safe_write_image(fig, pred_density_path, show_plot=args.show_plot) + if args.save_html: + fig.write_html(output_dir / f"{sample_tag}_pred_density.html") + + +if __name__ == "__main__": + main() diff --git a/electronic_structure/train.py b/electronic_structure/train.py new file mode 100644 index 00000000..5ba2db62 --- /dev/null +++ b/electronic_structure/train.py @@ -0,0 +1,179 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import datetime +import math +import os +import os.path as osp + +import paddle.distributed as dist +import paddle.distributed.fleet as fleet +from omegaconf import OmegaConf + +from ppmat.datasets import build_dataloader +from ppmat.datasets import set_signal_handlers +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.optimizer import build_optimizer +from ppmat.trainer.base_trainer import BaseTrainer +from ppmat.utils import logger +from ppmat.utils import misc +from ppmat.utils.eager_comp_setting import setting_eager_mode + + +def read_independent_dataloader_config(config): + """ + Args: + config (dict): config dict + """ + if config["Global"].get("do_train", True): + train_data_cfg = config["Dataset"].get("train") + assert ( + train_data_cfg is not None + ), "train_data_cfg must be defined, when do_train is true" + train_loader = build_dataloader(train_data_cfg) + else: + train_loader = None + + if config["Global"].get("do_eval", False) or config["Global"].get("do_train", True): + val_data_cfg = config["Dataset"].get("val") + if val_data_cfg is not None: + val_loader = build_dataloader(val_data_cfg) + else: + logger.info("No validation dataset defined.") + val_loader = None + else: + val_loader = None + + if config["Global"].get("do_test", False): + test_data_cfg = config["Dataset"].get("test") + assert ( + test_data_cfg is not None + ), "test_data_cfg must be defined, when do_test is true" + test_loader = build_dataloader(test_data_cfg) + else: + test_loader = None + return train_loader, val_loader, test_loader + + +if __name__ == "__main__": + if dist.get_world_size() > 1: + fleet.init(is_collective=True) + + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config", + type=str, + default="./electronic_structure/configs/infgcn_md17_benzene.yaml", + help="Path to config file", + ) + + args, dynamic_args = parser.parse_known_args() + + # load config and merge with cli args + config = OmegaConf.load(args.config) + cli_config = OmegaConf.from_dotlist(dynamic_args) + config = OmegaConf.merge(config, cli_config) + + # set random seed + seed = config["Trainer"].get("seed", 42) + misc.set_random_seed(seed) + logger.info(f"Set random seed to {seed}") + + # add timestamp to output_dir + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + base_output_dir = config["Trainer"]["output_dir"] + config["Trainer"]["output_dir"] = f"{base_output_dir}_t_{timestamp}_s_{seed}" + + # save config to output_dir, only rank 0 process will do this + if dist.get_rank() == 0: + os.makedirs(config["Trainer"]["output_dir"], exist_ok=True) + config_name = os.path.basename(args.config) + OmegaConf.save(config, osp.join(config["Trainer"]["output_dir"], config_name)) + # convert to dict + config = OmegaConf.to_container(config, resolve=True) + + # init logger + logger_path = osp.join(config["Trainer"]["output_dir"], "run.log") + logger.init_logger(log_file=logger_path) + logger.info(f"Logger saved to {logger_path}") + + # enable primitive eager mode when requested + enabled = config["Global"].get("prim_eager_enabled", False) + white_list = config["Global"].get("prim_backward_white_list", None) + setting_eager_mode(enabled, white_list) + + # build model from config + model_cfg = config["Model"] + model = build_model(model_cfg) + + # build dataloader from config + set_signal_handlers() + if config["Dataset"].get("split_dataset_ratio") is not None: + # Split the dataset into train/val/test and build corresponding dataloaders + loader = build_dataloader(config["Dataset"]) + train_loader = loader.get("train", None) + val_loader = loader.get("val", None) + test_loader = loader.get("test", None) + else: + # Use pre-split (independent) train/val/test datasets and build dataloaders + train_loader, val_loader, test_loader = read_independent_dataloader_config( + config + ) + + # build optimizer and learning rate scheduler from config + if config.get("Optimizer") is not None and config["Global"].get("do_train", True): + assert ( + train_loader is not None + ), "train_loader must be defined when optimizer is defined." + assert ( + config["Trainer"].get("max_epochs") is not None + ), "max_epochs must be defined when optimizer is defined." + optimizer, lr_scheduler = build_optimizer( + config["Optimizer"], + model, + config["Trainer"]["max_epochs"], + len(train_loader), + ) + else: + optimizer, lr_scheduler = None, None + + # build metric from config + metric_cfg = config.get("Metric") + if metric_cfg is not None: + metric_func = build_metric(metric_cfg) + else: + metric_func = None + + # initialize trainer + trainer = BaseTrainer( + config["Trainer"], + model, + train_dataloader=train_loader, + val_dataloader=val_loader, + optimizer=optimizer, + lr_scheduler=lr_scheduler, + compute_metric_func_dict=metric_func, + ) + + if config["Global"].get("do_train", True): + trainer.train() + if config["Global"].get("do_eval", False): + logger.info("Evaluating on validation set") + time_info, loss_info, metric_info = trainer.eval(val_loader) + if config["Global"].get("do_test", False): + logger.info("Evaluating on test set") + time_info, loss_info, metric_info = trainer.eval(test_loader) diff --git a/electronic_structure/visualize.py b/electronic_structure/visualize.py new file mode 100644 index 00000000..ed8f3970 --- /dev/null +++ b/electronic_structure/visualize.py @@ -0,0 +1,52 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import io + +import paddle +import PIL +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap + +plt.switch_backend("agg") +cmap = ListedColormap(["grey", "white", "red", "blue", "green", "white"]) + + +def draw_stack(density, atom_type=None, atom_coord=None, dim=-1): + """ + Draw a 2D density map along specific axis. + :param density: density data, tensor of shape (batch_size, nx, ny, nz) + :param atom_type: atom types, tensor of shape (batch_size, n_atom) + :param atom_coord: atom coordinates, tensor of shape (batch_size, n_atom, 3) + :param dim: axis along which to sum + :return: an image tensor + """ + plt.figure(figsize=(3, 3)) + plt.imshow(density.sum(axis=dim).detach().cpu().numpy(), cmap="viridis") + plt.colorbar() + if atom_type is not None: + idx = [i for i in range(3) if i != dim % 3] + coord = atom_coord.detach().cpu().numpy() + color = cmap(atom_type.detach().cpu().numpy()) + plt.scatter(coord[:, idx[1]], coord[:, idx[0]], c=color, alpha=0.8) + buf = io.BytesIO() + plt.savefig(buf, format="jpg") + buf.seek(0) + image = PIL.Image.open(buf) + image = paddle.vision.transforms.ToTensor()( + image + ) # 这个是paconvert自动改的,应该是准确的把,之前是torchvision.transforms.ToTensor() + image = image.transpose([1, 2, 0]) # add in 0319 + plt.close() + return image.numpy() # modified in 0319 diff --git a/get_started.md b/get_started.md new file mode 100644 index 00000000..f19288ff --- /dev/null +++ b/get_started.md @@ -0,0 +1,204 @@ +# Get Started ⚡ + +PaddleMaterials provides multiple pre-trained models and standard datasets for material property prediction, material structure generation, and interatomic potentials tasks. This document demonstrates how to perform common tasks using these existing models and standard datasets. + +Training workflows are parameterized through structured configuration files, allowing end-to-end model training with simple parameter adjustments. You can refer to the [PaddleMaterials Configuration](./about_configs.md) section for detailed configuration information. + +We have provided commands for training, evaluation, testing, and inference in each model's README file. You can also refer directly to these README files to complete corresponding tasks. + +## 1. Inference with Existing Model + +You can perform inference using either built-in models or local models. + +### 1.1 Inference with Built-in Model + +PaddleMaterials offers multiple built-in models that can be directly used for inference. Taking the `megnet_mp2018_train_60k_e_form` model as an example (a MEGNet model trained on the MP2018 dataset for material formation energy prediction), use the following command for inference: +```bash +python property_prediction/predict.py --model_name='megnet_mp2018_train_60k_e_form' --weights_name='best.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' --save_path='result.csv' +``` + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescription
--model_nameName of the built-in model
--weights_nameWeights file name
--cif_file_pathPath to CIF files for prediction
--save_pathPath to save prediction results
+ +### 1.2 Inference with Local Model + +In addition to built-in models, you can also use your own locally trained models for inference. Taking the `megnet_mp2018_train_60k_e_form` model as an example (assuming you've trained it locally), use the following command: +```bash +python property_prediction/predict.py --config_path='property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' --save_path='result.csv' +``` + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescription
--config_pathConfiguration file path
--checkpoint_pathModel weights file path
--cif_file_pathPath to CIF files for prediction
--save_pathPath to save prediction results
+ +## 2. Test Existing Models on Standard Datasets + +To test the `megnet_mp2018_train_60k_e_form` model (assuming you've trained it locally) on the MP2018 test set, use: +```bash +python property_prediction/train.py -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your_checkpoint_path(*.pdparams)' Trainer.output_dir='your_output_dir' +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterDescription
-cConfiguration file path
Global.do_trainSet to False for testing
Global.do_evalWhether to evaluate on validation set
Global.do_testWhether to evaluate on test set
Trainer.pretrained_model_pathYour model weights path
Trainer.output_dirOutput directory for log files
+ +## 3. Train Predefined Models on Standard Datasets + +You can train models using PaddleMaterials's standard datasets and predefined configurations. For the `megnet_mp2018_train_60k_e_form` model: +```bash +# Single-GPU training for formation energy per atom +python property_prediction/train.py -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml +``` + +This command uses the `-c` parameter to specify the model configuration file. Training will be performed on the MP2018 training set, with logs saved to `Trainer.output_dir` by default (you can modify this path in the configuration file). + +PaddleMaterials also supports multi-GPU training using `paddle.distributed.launch`: +```bash +# Multi-GPU training with 4 GPUs +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml +``` + +The `--gpus` parameter specifies the GPU IDs and quantity to use. + +## 4. Train with Customized Datasets + +PaddleMaterials supports training with custom datasets. If your dataset format matches the standard format, you can directly use the provided configurations by modifying the dataset paths: + +```yaml +... +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "your_train_data.json" +... + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "your_val_data.json" +... + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "your_test_data.json" +``` + +For datasets with different formats, you can either: +1. Create a custom dataset class, import it in `ppmat/datasets/__init__.py`, and modify the configuration +2. Convert your dataset to PaddleMaterials's supported format (recommended for convenience) + +## 5. Train with Customized Models and Standard Datasets + +1. Implement your custom model class (inheriting from `nn.Layer`) and import it in `ppmat/models/__init__.py` + > Your model must implement `__init__` and `forward` methods. The `forward` method should return a dictionary containing model outputs and losses. + +2. Copy the configuration file of the standard dataset you want to use (e.g., `megnet_mp2018_train_60k_e_form.yaml` for MP2018) + +3. Modify the `Model` section in the configuration to use your custom model: + ```yaml + Model: + __class_name__: your_model_class_name + __init_params__: + your_model_parameters + ``` + +4. Adjust other hyperparameters (learning rate, batch size, etc.) as needed + +5. Start training with the modified configuration file + +## 6. Finetuning Models + +PaddleMaterials supports model finetuning. Follow these steps using standard configurations (only need to modify pretrained model path): + +1. Prepare your custom dataset (refer to Section 4) +2. Copy the original model configuration file (e.g., `megnet_mp2018_train_60k_e_form.yaml`) +3. Modify dataset paths in the copied configuration to point to your custom data +4. Configure pretrained model parameters: + - For local models: Set `Trainer.pretrained_model_path` to your local path + - For built-in models: + - Set `Trainer.pretrained_model_path` to the built-in model URL + - Set `Trainer.pretrained_weight_name` to the weights file name (e.g., `latest.pdparams`) +5. Adjust training parameters (learning rate, batch size, log directory, etc.) +6. Execute training with the updated configuration + > The message `Finish loading pretrained model from: xxx.pdparams` indicates successful model loading diff --git a/interatomic_potentials/README.md b/interatomic_potentials/README.md new file mode 100644 index 00000000..ae0cd3b2 --- /dev/null +++ b/interatomic_potentials/README.md @@ -0,0 +1,35 @@ +# MLIP-Machine Learning Interatomic Potential + +## 1.Introduction + +Machine-learning interatomic potentials (MLIP) bridge the gap between quantum-level accuracy and classical molecular-dynamics speed. Traditional force fields rely on fixed functional forms and hand-tuned parameters, limiting transferability. In contrast, MLIP learn the energy-force landscape directly from high-fidelity density-functional-theory data, capturing many-body and chemical effects without explicit equations. Modern frameworks embed rigorous physical priors—permutation, rotation and translation invariance, smoothness, locality—into expressive models such as equivariant graph neural networks, message-passing networks, Gaussian process regressors and deep neural descriptors. A typical workflow begins by sampling diverse atomic configurations, computing reference energies, forces and stresses, then training the model with loss terms that balance all three quantities. Active-learning loops iteratively enrich the dataset where prediction uncertainty is high, minimizing human intervention. Once trained, an MLIP delivers near-DFT accuracy for million-atom, nanosecond-scale simulations at a small fraction of the cost, enabling studies of crack propagation, phase transitions, ion diffusion and catalytic reactions that were previously intractable. As datasets grow and architectures mature, MLIP are poised to become standard tools for predictive, large-scale materials and molecular modeling. + +## 2.Models Matrix + +| **Supported Functions** | **[CHGNet](./configs/chgnet/README.md)** | **[MatterSim](./configs/mattersim//README.md)** | +| ----------------------------------- | ---------------------------------------- | ----------------------------------------------- | +| **Forward Prediction** | | | +|  Energy | ✅ | ✅ | +|  Force | ✅ | ✅ | +|  Stress | ✅ | ✅ | +|  Magmom | ✅ | - | +| **ML Capabilities · Training** | | | +|  Single-GPU | ✅ | ✅ | +|  Distributed Train | ✅ | ✅ | +|  Mixed Precision | - | - | +|  Fine-tuning | ✅ | ✅ | +|  Uncertainty / Active-Learning | - | - | +|  Dynamic→Static | - | - | +|  Compiler CINN | - | - | +| **ML Capabilities · Predict** | | | +|  Distillation / Pruning | - | - | +|  Standard inference | ✅ | ✅ | +|  Distributed inference | - | - | +|  Compiler CINN | - | - | +| **Molecular Dynamic Interface** | | | +|  ASE | ✅ | ✅ | +| **Dataset** | | | +|  MPtrj | ✅ | 🚧 | +| **ML2DDB🌟** | ✅ | - | + +**Notice**:🌟 represent originate research work published from paddlematerials toolkit diff --git a/interatomic_potentials/configs/chgnet/README.md b/interatomic_potentials/configs/chgnet/README.md new file mode 100644 index 00000000..91eba79c --- /dev/null +++ b/interatomic_potentials/configs/chgnet/README.md @@ -0,0 +1,210 @@ +# CHGNet + +[CHGNet: Pretrained universal neural network potential for charge-informed atomistic modeling](https://www.nature.com/articles/s42256-023-00716-3) + +## Abstract + +The simulation of large-scale systems with complex electron interactions remains one of the greatest challenges for the atomistic modeling of materials. Although classical force fields often fail to describe the coupling between electronic states and ionic rearrangements, the more accurate ab-initio molecular dynamics suffers from computational complexity that prevents long-time and large-scale simulations, which are essential to study many technologically relevant phenomena, such as reactions, ion migrations, phase transformations, and degradation. In this work, we present the Crystal Hamiltonian Graph neural Network (CHGNet) as a novel machine-learning interatomic potential (MLIP), using a graph-neural-network-based force field to model a universal potential energy surface. CHGNet is pretrained on the energies, forces, stresses, and magnetic moments from the Materials Project Trajectory Dataset, which consists of over 10 years of density functional theory static and relaxation trajectories of ∼ 1.5 million inorganic structures. The explicit inclusion of magnetic moments enables CHGNet to learn and accurately represent the orbital occupancy of electrons, enhancing its capability to describe both atomic and electronic degrees of freedom. We demonstrate several applications of CHGNet in solid-state materials, including charge-informed molecular dynamics in LixMnO2, the finite temperature phase diagram for LixFePO4 and Li diffusion in garnet conductors. We critically analyze the significance of including charge information for capturing appropriate chemistry, and we provide new insights into ionic systems with additional electronic degrees of freedom that can not be observed by previous MLIPs. + +![CHGNet Overview](../../docs/chgnet.png) + +## Datasets: + +CHGNet is trained and evaluated on large-scale atomistic datasets covering both crystalline bulk materials and surface reaction systems. These datasets provide high-fidelity quantum-mechanical labels, including energies, forces, stresses, and electronic properties, enabling the construction of a charge-aware universal interatomic potential. + +The MPtrj dataset is used for CHGNet pretraining and bulk material modeling. The OC20 S2EF dataset is used to evaluate model generalization to surface reaction systems. All dataset splits are fixed and reproducible. Reported MAE values in the Results section follow the evaluation protocol of the original CHGNet paper. + +- MPtrj_2022.9_full: + + The Materials Project Trajectory Dataset (MPtrj_2022.9) is the primary pretraining dataset for CHGNet. The original dataset can download from [here](https://figshare.com/articles/dataset/Materials_Project_Trjectory_MPtrj_Dataset/23713842). + + This dataset contains long-term accumulated density functional theory (DFT) static and relaxation trajectories from the Materials Project (2022.9 release), covering a wide range of inorganic crystalline compounds. + + - 145,923 unique compounds + - 1,580,395 crystal structures + + Corresponding labels: + - 1,580,395 total energies + - 49,295,660 atomic forces + - 14,223,555 stresses + - 7,944,833 magnetic moments + + All calculations are performed at the GGA / GGA+U level of theory. A strict filtering and deduplication protocol is applied to remove incompatible calculations and redundant structures, ensuring data consistency and quality. + + Following the CHGNet paper, the dataset is randomly partitioned based on mp-id, such that structures from the same compound do not appear across different splits. + + | Dataset | Train | Val | Test | + | :--------------------------------------------------------------------------: | :---: | :---: | :---: | + | [MPtrj_2022.9_full](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mptrj/MPtrj_2022.9_full.zip) | 116738 | 14592 | 14593 | + + This dataset enables CHGNet to learn a unified potential energy surface across diverse chemistries, crystal symmetries, and magnetic configurations. + +- OC20 S2EF + + The Open Catalyst 2020 (OC20) Structure-to-Energy-and-Force (S2EF) dataset is a large-scale benchmark for evaluating interatomic potentials in surface chemistry and catalysis. + + OC20 S2EF focuses on predicting energies and atomic forces for adsorbate–surface systems, featuring: + + - Large structural diversity + - Challenging out-of-equilibrium configurations + - Strong relevance to catalytic reaction modeling + + We evaluate the CHGNet architecture on the OC20 S2EF dataset to assess its transferability beyond bulk crystalline systems. For more information and the download link, please visit [here](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0000.parquet). + + | Dataset | Train | Val | Test | + | :------------ | :-------- | :------- | :------- | + | oc20_s2ef_2M | 2,000,000 | 100,000 | 200,000 | + + +## Models + +Given atomic coordinates and lattice vectors, CHGNet constructs three coupled graphs within a cutoff radius: + +* **Atom graph**: nodes represent atoms with element-dependent features +* **Bond graph**: edges encode pairwise interactions based on interatomic distances +* **Angle graph**: captures three-body interactions through bond angles + +Interatomic distances are expanded using radial basis functions: +$$ +e_{ij,n} = +\sqrt{\frac{2}{r_c}} +\frac{\sin\left(\frac{n\pi r_{ij}}{r_c}\right)}{r_{ij}}. +$$ + +Angular information is encoded using Fourier basis functions of bond angles. + +### Energy and Forces + +The total energy is obtained by summing atomic energy contributions: +$$ +E_{\text{tot}} = \sum_i E_i. +$$ + +Atomic forces are computed as energy gradients with respect to atomic positions: +$$ +\mathbf{F}_i = -\frac{\partial E_{\text{tot}}}{\partial \mathbf{r}_i}. +$$ + +Stresses are derived consistently from the energy–strain relation: +$$ +\boldsymbol{\sigma} = \frac{1}{V} \frac{\partial E_{\text{tot}}}{\partial \boldsymbol{\varepsilon}}. +$$ + +CHGNet provides a unified, charge-aware interatomic potential capable of modeling complex crystalline materials, including systems with magnetism and charge transfer. It is suitable for structure relaxation, molecular dynamics, and materials property prediction, offering strong transferability across diverse inorganic systems. + + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetEnergy MAE(meV/atom)Force MAE(meV/A)Stress MAE(GPa)Magmom MAE(μB)GPUsTraining timeConfigCheckpoint | Log
chgnet_mptrjMPtrj_2022.9_full30774.3480.032 ~ ~ chgnet_mptrjcheckpoint | log
chgnet_oc20_s2ef_energyoc20_s2ef - - - - ~ ~ chgnet_oc20_s2ef_energycheckpoint | log
chgnet_oc20_s2ef_forcesoc20_s2ef - - - - ~ ~ chgnet_oc20_s2ef_forcescheckpoint | log
+ +**Note**: The model weights were directly adapted from the [CHGNet](https://github.com/CederGroupHub/chgnet) repository. Since the original paper did not disclose its randomly split test set, we repartitioned the test data according to the proportions described in the paper. However, due to differences in random seeds, the data partitioning could not be fully replicated, limiting the referential value of evaluation results obtained with our test set. To ensure result comparability, the MAE metrics listed in the table are directly cited from the original [paper's](https://www.nature.com/articles/s42256-023-00716-3) experimental results. + +### Training + +```bash +# multi-gpu training +python -m paddle.distributed.launch --gpus="0,1,2,3" interatomic_potentials/train.py -c interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml +# single-gpu training +python interatomic_potentials/train.py -c interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml +``` + +### Validation +```bash +# Adjust program behavior on-the-fly using command-line parameters – this provides a convenient way to customize settings without modifying the configuration file directly. +# such as: --Global.do_eval=True + +python interatomic_potentials/train.py -c interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your checkpoint path(*.pdparams)' + +``` + + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. + +python interatomic_potentials/train.py -c interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your checkpoint path(*.pdparams)' + +``` + +### Prediction + +```bash +# This command is used to predict the properties of new crystal structures using a trained model. +# Note: The model_name and weights_name parameters are used to specify the pre-trained model and its corresponding weights. The cif_file_path parameter is used to specify the path to the CIF files for which properties need to be predicted. +# The prediction results will be saved in a CSV file specified by the save_path parameter. Default save_path is 'result.csv'. + + +# Mode 1: Leverage a pre-trained machine learning model for crystal shear moduli prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python interatomic_potentials/predict.py --model_name='chgnet_mptrj' --cif_file_path='./interatomic_potentials/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal shear moduli prediction. This approach allows for more flexibility and customization. +python interatomic_potentials/predict.py --config_path='interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml' --checkpoint_path="your checkpoint path(*.pdparams)" +``` + + +## Citation +``` +@article{deng2023chgnet, + title={CHGNet as a pretrained universal neural network potential for charge-informed atomistic modelling}, + author={Deng, Bowen and Zhong, Peichen and Jun, KyuJung and Riebesell, Janosh and Han, Kevin and Bartel, Christopher J and Ceder, Gerbrand}, + journal={Nature Machine Intelligence}, + volume={5}, + number={9}, + pages={1031--1041}, + year={2023}, + publisher={Nature Publishing Group UK London} +} +``` diff --git a/interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml b/interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml new file mode 100644 index 00000000..5e57ed8e --- /dev/null +++ b/interatomic_potentials/configs/chgnet/chgnet_mptrj.yaml @@ -0,0 +1,225 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ['energy_per_atom', 'force', 'stress', 'magmom'] + graph_converter: + __class_name__: CHGNetGraphConverter + __init_params__: + cutoff: 5.0 + pdc: [1, 1, 1] + num_classes: 95 + atom_graph_cutoff: 6.0 + bond_graph_cutoff: 3.0 + + prim_eager_enabled: True + prim_backward_white_list: ['concat_grad', 'gather_grad', 'layer_norm_grad', 'split_grad'] + + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/chgnet_mptrj + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Model: + __class_name__: CHGNet + __init_params__: + atom_fea_dim: 64 + bond_fea_dim: 64 + angle_fea_dim: 64 + composition_model: "MPtrj" + num_radial: 31 + num_angular: 31 + n_conv: 4 + atom_conv_hidden_dim: 64 + update_bond: True + bond_conv_hidden_dim: 64 + update_angle: True + angle_layer_hidden_dim: 0 + conv_dropout: 0 + read_out: "ave" + mlp_hidden_dims: [64, 64, 64] + mlp_dropout: 0 + mlp_first: True + is_intensive: True + atom_graph_cutoff: 6 + bond_graph_cutoff: 3 + cutoff_coeff: 8 + learnable_rbf: True + is_freeze: False + property_names: ['energy_per_atom', 'force', 'stress', 'magmom'] + return_site_energies: False + return_atom_feas: False + return_crystal_feas: False + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 1e-3 + eta_min: 1e-5 + by_epoch: False + + +Metric: + energy_per_atom: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + force: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + stress: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + magmom: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Dataset: + train: + dataset: + __class_name__: MPTrjDataset + __init_params__: + path: "./data/MPtrj_2022.9_full/train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + transforms: + - __class_name__: Scale + __init_params__: + scale: -0.1 + apply_keys: ['stress'] + - __class_name__: Abs + __init_params__: + apply_keys: ['magmom'] + num_workers: 0 + use_shared_memory: False + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 40 + val: + dataset: + __class_name__: MPTrjDataset + __init_params__: + path: "./data/MPtrj_2022.9_full/val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + transforms: + - __class_name__: Scale + __init_params__: + scale: -0.1 + apply_keys: ['stress'] + - __class_name__: Abs + __init_params__: + apply_keys: ['magmom'] + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + test: + dataset: + __class_name__: MPTrjDataset + __init_params__: + path: "./data/MPtrj_2022.9_full/test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + transforms: + - __class_name__: Scale + __init_params__: + scale: -0.1 + apply_keys: ['stress'] + - __class_name__: Abs + __init_params__: + apply_keys: ['magmom'] + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/configs/chgnet/chgnet_oc20_s2ef_energy.yaml b/interatomic_potentials/configs/chgnet/chgnet_oc20_s2ef_energy.yaml new file mode 100644 index 00000000..bb271c46 --- /dev/null +++ b/interatomic_potentials/configs/chgnet/chgnet_oc20_s2ef_energy.yaml @@ -0,0 +1,182 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ["energy_per_atom"] + + graph_converter: + __class_name__: CHGNetGraphConverter + __init_params__: + cutoff: 5.0 + pdc: [1, 1, 1] + num_classes: 95 + atom_graph_cutoff: 6.0 + bond_graph_cutoff: 3.0 + + prim_eager_enabled: True + prim_backward_white_list: ['concat_grad', 'gather_grad', 'layer_norm_grad', 'split_grad'] + +Dataset: + train: + dataset: + __class_name__: OC20S2EFDataset + __init_params__: + path: "./data/oc20" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/oc20" + overwrite: False + filter_unvalid: False + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + val: + dataset: + __class_name__: OC20S2EFDataset + __init_params__: + path: "./data/oc20" + urls: + - "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0000.parquet" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/oc20" + overwrite: False + filter_unvalid: False + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: OC20S2EFDataset + __init_params__: + path: "./data/oc20" + urls: + - "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0000.parquet" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/oc20" + overwrite: False + filter_unvalid: False + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: CHGNet + __init_params__: + atom_fea_dim: 64 + bond_fea_dim: 64 + angle_fea_dim: 64 + composition_model: "MPtrj" + num_radial: 31 + num_angular: 31 + n_conv: 4 + atom_conv_hidden_dim: 64 + update_bond: True + bond_conv_hidden_dim: 64 + update_angle: True + angle_layer_hidden_dim: 0 + conv_dropout: 0 + read_out: "ave" + mlp_hidden_dims: [64, 64, 64] + mlp_dropout: 0 + mlp_first: True + is_intensive: True + atom_graph_cutoff: 6 + bond_graph_cutoff: 3 + cutoff_coeff: 8 + learnable_rbf: True + is_freeze: False + property_names: ${Global.label_names} + return_site_energies: False + return_atom_feas: False + return_crystal_feas: False + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/chgnet_oc20_s2ef_energy + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 1e-3 + eta_min: 1e-5 + by_epoch: False + +Metric: + energy_per_atom: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/configs/chgnet/chgnet_oc20_s2ef_forces.yaml b/interatomic_potentials/configs/chgnet/chgnet_oc20_s2ef_forces.yaml new file mode 100644 index 00000000..35cc3ae7 --- /dev/null +++ b/interatomic_potentials/configs/chgnet/chgnet_oc20_s2ef_forces.yaml @@ -0,0 +1,180 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ["forces"] + + graph_converter: + __class_name__: CHGNetGraphConverter + __init_params__: + cutoff: 5.0 + pdc: [1, 1, 1] + num_classes: 95 + atom_graph_cutoff: 6.0 + bond_graph_cutoff: 3.0 + + prim_eager_enabled: True + prim_backward_white_list: ['concat_grad', 'gather_grad', 'layer_norm_grad', 'split_grad'] + +Dataset: + train: + dataset: + __class_name__: OC20S2EFDataset + __init_params__: + path: "./data/oc20" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/oc20" + overwrite: True + filter_unvalid: False + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + val: + dataset: + __class_name__: OC20S2EFDataset + __init_params__: + path: "./data/oc20" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/oc20" + overwrite: False + filter_unvalid: False + url_indices: [0] + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: OC20S2EFDataset + __init_params__: + path: "./data/oc20" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/oc20" + overwrite: False + filter_unvalid: False + url_indices: [0] + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: CHGNet + __init_params__: + atom_fea_dim: 64 + bond_fea_dim: 64 + angle_fea_dim: 64 + composition_model: "MPtrj" + num_radial: 31 + num_angular: 31 + n_conv: 4 + atom_conv_hidden_dim: 64 + update_bond: True + bond_conv_hidden_dim: 64 + update_angle: True + angle_layer_hidden_dim: 0 + conv_dropout: 0 + read_out: "ave" + mlp_hidden_dims: [64, 64, 64] + mlp_dropout: 0 + mlp_first: True + is_intensive: True + atom_graph_cutoff: 6 + bond_graph_cutoff: 3 + cutoff_coeff: 8 + learnable_rbf: True + is_freeze: False + property_names: ${Global.label_names} + return_site_energies: False + return_atom_feas: False + return_crystal_feas: False + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/chgnet_oc20_s2ef_forces + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "forces" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 1e-3 + eta_min: 1e-5 + by_epoch: False + +Metric: + forces: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/configs/chgnet/chgnet_qm9_lumo.yaml b/interatomic_potentials/configs/chgnet/chgnet_qm9_lumo.yaml new file mode 100644 index 00000000..e741ab6a --- /dev/null +++ b/interatomic_potentials/configs/chgnet/chgnet_qm9_lumo.yaml @@ -0,0 +1,176 @@ +Global: + # This config is focused on running prediction (inference) for the 'lumo' property. + do_train: True + do_eval: False + do_test: False + + # Target label(s) — changed to only 'lumo' + label_names: ['energy_per_atom'] + + # Reuse the same converter structure style as example; adjust to molecule tasks. + # You can replace __class_name__ and params with your project's actual converter. + graph_converter: + __class_name__: CHGNetGraphConverter + __init_params__: + cutoff: 5.0 + pdc: [1, 1, 1] + num_classes: 95 + atom_graph_cutoff: 6.0 + bond_graph_cutoff: 3.0 + + prim_eager_enabled: True + prim_backward_white_list: ['concat_grad', 'gather_grad', 'layer_norm_grad', 'split_grad'] + + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + output_dir: ./output/qm9_predict_lumo + save_freq: 10 + log_freq: 50 + + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + + best_metric_indicator: 'eval_metric' + name_for_best_metric: "energy_per_atom" + greater_is_better: False + + compute_metric_during_train: False + metric_strategy_during_eval: 'epoch' + + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Model: + # Keep the same class as the example if you use CHGNet for inference; otherwise change it. + __class_name__: CHGNet + __init_params__: + atom_fea_dim: 64 + bond_fea_dim: 64 + angle_fea_dim: 64 + composition_model: "MPtrj" + num_radial: 31 + num_angular: 31 + n_conv: 4 + atom_conv_hidden_dim: 64 + update_bond: True + bond_conv_hidden_dim: 64 + update_angle: True + angle_layer_hidden_dim: 0 + conv_dropout: 0 + read_out: "ave" + mlp_hidden_dims: [64, 64, 64] + mlp_dropout: 0 + mlp_first: True + # IMPORTANT: only predict 'lumo' — change property_names accordingly + is_intensive: True + atom_graph_cutoff: 6 + bond_graph_cutoff: 3 + cutoff_coeff: 8 + learnable_rbf: True + is_freeze: False + property_names: ['energy_per_atom'] + return_site_energies: False + return_atom_feas: False + return_crystal_feas: False + + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 1e-3 + eta_min: 1e-5 + by_epoch: False + + +Metric: + # Only one metric for the single target 'lumo' + energy_per_atom: + __class_name__: IgnoreNanMetricWrapper + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + + +Dataset: + train: + dataset: + __class_name__: QM9Dataset + __init_params__: + path: "./data/qm9" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/qm9" + overwrite: False + filter_unvalid: True + # [Delete] url_indices: QM9Dataset does not support this parameter + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + val: + dataset: + __class_name__: QM9Dataset + __init_params__: + path: "./data/qm9" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/qm9" + overwrite: False + filter_unvalid: True + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: QM9Dataset + __init_params__: + path: "./data/qm9" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/qm9" + overwrite: False + filter_unvalid: True + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True + # Path to model checkpoint to load for inference (set to your trained checkpoint) + checkpoint_path: ./checkpoints/best_model.pdparams + # Output file for predictions + output_path: ./predictions/qm9_lumo_predictions.csv + # Optional: whether to write per-sample details (pos, atomic_numbers) alongside predictions + write_details: False \ No newline at end of file diff --git a/interatomic_potentials/configs/mattersim/README.md b/interatomic_potentials/configs/mattersim/README.md new file mode 100644 index 00000000..009f44e3 --- /dev/null +++ b/interatomic_potentials/configs/mattersim/README.md @@ -0,0 +1,85 @@ +# MatterSim + +[MatterSim: A Deep Learning Atomistic Model Across Elements, Temperatures and Pressures](https://arxiv.org/abs/2405.04967) + +## Abstract + +Accurate and fast prediction of materials properties is central to the digital transformation of materials design. However, the vast design space and diverse operating conditions pose significant challenges for accurately modeling arbitrary material candidates and forecasting their properties. We present MatterSim, a deep learning model actively learned from large-scale first-principles computations, for efficient atomistic simulations at first-principles level and accurate prediction of broad material properties across the periodic table, spanning temperatures from 0 to 5000 K and pressures up to 1000 GPa. Out-of-the-box, the model serves as a machine learning force field, and shows remarkable capabilities not only in predicting ground-state material structures and energetics, but also in simulating their behavior under realistic temperatures and pressures, signifying an up to ten-fold enhancement in precision compared to the prior best-in-class. This enables MatterSim to compute materials' lattice dynamics, mechanical and thermodynamic properties, and beyond, to an accuracy comparable with first-principles methods. Specifically, MatterSim predicts Gibbs free energies for a wide range of inorganic solids with near-first-principles accuracy and achieves a 15 meV/atom resolution for temperatures up to 1000K compared with experiments. This opens an opportunity to predict experimental phase diagrams of materials at minimal computational cost. Moreover, MatterSim also serves as a platform for continuous learning and customization by integrating domain-specific data. The model can be fine-tuned for atomistic simulations at a desired level of theory or for direct structure-to-property predictions, achieving high data efficiency with a reduction in data requirements by up to 97%. + +![MatterSim Overview](../../docs/mattersim.png) + +## Pre-trained Models + +1. MatterSim-v1.0.0-1M: A mini version of the model that is faster to run. +2. MatterSim-v1.0.0-5M: A larger version of the model that is more accurate. + + +### Training + +Fine-tune the mattersim_1M model using high_level_water. + +```bash +# multi-gpu training +python -m paddle.distributed.launch --gpus="0,1,2,3" interatomic_potentials/train.py -c interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml +# single-gpu training +python interatomic_potentials/train.py -c interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml +``` + +Fine-tune the mattersim_5M model using high_level_water. + +```bash +# multi-gpu training +python -m paddle.distributed.launch --gpus="0,1,2,3" interatomic_potentials/train.py -c interatomic_potentials/configs/mattersim/mattersim_5M_high_level_water.yaml +# single-gpu training +python interatomic_potentials/train.py -c interatomic_potentials/configs/mattersim/mattersim_5M_high_level_water.yaml +``` + +### Validation +```bash +# Adjust program behavior on-the-fly using command-line parameters – this provides a convenient way to customize settings without modifying the configuration file directly. +# such as: --Global.do_eval=True + +python interatomic_potentials/train.py -c interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your checkpoint path(*.pdparams)' + +``` + + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. + +python interatomic_potentials/train.py -c interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your checkpoint path(*.pdparams)' + +``` + +### Prediction + +```bash +# This command is used to predict the properties of new crystal structures using a trained model. +# Note: The model_name and weights_name parameters are used to specify the pre-trained model and its corresponding weights. The cif_file_path parameter is used to specify the path to the CIF files for which properties need to be predicted. +# The prediction results will be saved in a CSV file specified by the save_path parameter. Default save_path is 'result.csv'. + + +# Mode 1: Leverage a pre-trained machine learning model for crystal shear moduli prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python interatomic_potentials/predict.py --model_name='mattersim_1M' --weights_name='mattersim-v1.0.0-1M_model.pdparams' --cif_file_path='./interatomic_potentials/example_data/cifs/' + +python interatomic_potentials/predict.py --model_name='mattersim_5M' --weights_name='mattersim-v1.0.0-5M_model.pdparams' --cif_file_path='./interatomic_potentials/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal shear moduli prediction. This approach allows for more flexibility and customization. +python interatomic_potentials/predict.py --config_path='interatomic_potentials/configs/mattersim/mattersim_1M.yaml' --checkpoint_path="/root/host/home/zhangzhimin04/workspaces_123/ppmat/PaddleMaterial_experimental/experimental/output/mattersim_1M/mattersim-v1.0.0-1M_model.pdparams" --cif_file_path='./interatomic_potentials/example_data/cifs/' +``` + + +## Citation +``` +@article{yang2024mattersim, + title={MatterSim: A Deep Learning Atomistic Model Across Elements, Temperatures and Pressures}, + author={Han Yang and Chenxi Hu and Yichi Zhou and Xixian Liu and Yu Shi and Jielan Li and Guanzhi Li and Zekun Chen and Shuizhou Chen and Claudio Zeni and Matthew Horton and Robert Pinsler and Andrew Fowler and Daniel Zügner and Tian Xie and Jake Smith and Lixin Sun and Qian Wang and Lingyu Kong and Chang Liu and Hongxia Hao and Ziheng Lu}, + year={2024}, + eprint={2405.04967}, + archivePrefix={arXiv}, + primaryClass={cond-mat.mtrl-sci}, + url={https://arxiv.org/abs/2405.04967}, + journal={arXiv preprint arXiv:2405.04967} +} +``` diff --git a/interatomic_potentials/configs/mattersim/mattersim_1M.yaml b/interatomic_potentials/configs/mattersim/mattersim_1M.yaml new file mode 100644 index 00000000..5caae872 --- /dev/null +++ b/interatomic_potentials/configs/mattersim/mattersim_1M.yaml @@ -0,0 +1,97 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ['energy', 'force'] + + energy_key: 'energy' + force_key: 'force' + stress_key: null # 'stress' # high level water data not support stress + + + graph_converter: + __class_name__: M3GNetGraphConvertor + __init_params__: {} + + prim_eager_enabled: True + prim_backward_white_list: ['stack_grad', 'assign_grad'] + + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattersim_1M + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 5 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/mattersim/mattersim_1M.zip" + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: mattersim-v1.0.0-1M_model.pdparams #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "energy" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Model: + __class_name__: M3GNet + __init_params__: + num_blocks: 3 + units: 128 + max_l: 4 + max_n: 4 + cutoff: 5.0 + max_z: 94 + threebody_cutoff: 4.0 + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + loss_type: 'smooth_l1_loss' + huber_loss_delta: 0.01 + loss_weights_dict: + energy: 1.0 + force: 1.0 + stress: 0.1 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml b/interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml new file mode 100644 index 00000000..bcaeab4e --- /dev/null +++ b/interatomic_potentials/configs/mattersim/mattersim_1M_high_level_water.yaml @@ -0,0 +1,192 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ['energy', 'force'] + + energy_key: 'energy' + force_key: 'force' + stress_key: null # 'stress' # high level water data not support stress + + + graph_converter: + __class_name__: M3GNetGraphConvertor + __init_params__: {} + + prim_eager_enabled: True + prim_backward_white_list: ['stack_grad', 'assign_grad'] + + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattersim_1M_high_level_water + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 5 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/mattersim/mattersim_1M.zip" + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: mattersim-v1.0.0-1M_model.pdparams #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "energy" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Model: + __class_name__: M3GNet + __init_params__: + num_blocks: 3 + units: 128 + max_l: 4 + max_n: 4 + cutoff: 5.0 + max_z: 94 + threebody_cutoff: 4.0 + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + loss_type: 'smooth_l1_loss' + huber_loss_delta: 0.01 + loss_weights_dict: + energy: 1.0 + force: 1.0 + stress: 0.1 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Step + __init_params__: + learning_rate: 2e-4 + step_size: 10 + gamma: 0.95 + by_epoch: True + + +Metric: + energy: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + force: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Dataset: + train: + dataset: + __class_name__: HighLevelWaterDataset + __init_params__: + path: "./data/high_level_water/high_level_water.xyz" + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + build_structure_cfg: + format: ase_atoms + primitive: False + niggli: False + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 2 + val: + dataset: + __class_name__: HighLevelWaterDataset + __init_params__: + path: "./data/high_level_water/high_level_water.xyz" + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + build_structure_cfg: + format: ase_atoms + primitive: False + niggli: False + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + test: + dataset: + __class_name__: HighLevelWaterDataset + __init_params__: + path: "./data/high_level_water/high_level_water.xyz" + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + build_structure_cfg: + format: ase_atoms + primitive: False + niggli: False + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/configs/mattersim/mattersim_5M.yaml b/interatomic_potentials/configs/mattersim/mattersim_5M.yaml new file mode 100644 index 00000000..09a702e7 --- /dev/null +++ b/interatomic_potentials/configs/mattersim/mattersim_5M.yaml @@ -0,0 +1,97 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ['energy', 'force'] + + energy_key: 'energy' + force_key: 'force' + stress_key: null # 'stress' # high level water data not support stress + + + graph_converter: + __class_name__: M3GNetGraphConvertor + __init_params__: {} + + prim_eager_enabled: True + prim_backward_white_list: ['stack_grad', 'assign_grad'] + + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattersim_5M + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 5 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/mattersim/mattersim_5M.zip" + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: mattersim-v1.0.0-5M_model.pdparams #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "energy" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Model: + __class_name__: M3GNet + __init_params__: + num_blocks: 4 + units: 256 + max_l: 4 + max_n: 4 + cutoff: 5.0 + max_z: 94 + threebody_cutoff: 4.0 + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + loss_type: 'smooth_l1_loss' + huber_loss_delta: 0.01 + loss_weights_dict: + energy: 1.0 + force: 1.0 + stress: 0.1 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/configs/mattersim/mattersim_5M_high_level_water.yaml b/interatomic_potentials/configs/mattersim/mattersim_5M_high_level_water.yaml new file mode 100644 index 00000000..7cec4429 --- /dev/null +++ b/interatomic_potentials/configs/mattersim/mattersim_5M_high_level_water.yaml @@ -0,0 +1,192 @@ +Global: + do_train: True + do_eval: False + do_test: False + + label_names: ['energy', 'force'] + + energy_key: 'energy' + force_key: 'force' + stress_key: null # 'stress' # high level water data not support stress + + + graph_converter: + __class_name__: M3GNetGraphConvertor + __init_params__: {} + + prim_eager_enabled: True + prim_backward_white_list: ['stack_grad', 'assign_grad'] + + +Trainer: + # Max epochs to train + max_epochs: 20 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattersim_5M_high_level_water + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 5 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/mattersim/mattersim_5M.zip" + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: mattersim-v1.0.0-5M_model.pdparams #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: False + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "energy" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Model: + __class_name__: M3GNet + __init_params__: + num_blocks: 4 + units: 256 + max_l: 4 + max_n: 4 + cutoff: 5.0 + max_z: 94 + threebody_cutoff: 4.0 + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + loss_type: 'smooth_l1_loss' + huber_loss_delta: 0.01 + loss_weights_dict: + energy: 1.0 + force: 1.0 + stress: 0.1 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Step + __init_params__: + learning_rate: 2e-4 + step_size: 10 + gamma: 0.95 + by_epoch: True + + +Metric: + energy: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + force: + __class_name__: IgnoreNanMetricWrapper #MAEMetric + __init_params__: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Dataset: + train: + dataset: + __class_name__: HighLevelWaterDataset + __init_params__: + path: "./data/high_level_water/high_level_water.xyz" + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + build_structure_cfg: + format: ase_atoms + primitive: False + niggli: False + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 2 + val: + dataset: + __class_name__: HighLevelWaterDataset + __init_params__: + path: "./data/high_level_water/high_level_water.xyz" + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + build_structure_cfg: + format: ase_atoms + primitive: False + niggli: False + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + test: + dataset: + __class_name__: HighLevelWaterDataset + __init_params__: + path: "./data/high_level_water/high_level_water.xyz" + energy_key: ${Global.energy_key} + force_key: ${Global.force_key} + stress_key: ${Global.stress_key} + build_structure_cfg: + format: ase_atoms + primitive: False + niggli: False + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + filter_unvalid: False + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: False diff --git a/interatomic_potentials/docs/chgnet.png b/interatomic_potentials/docs/chgnet.png new file mode 100644 index 00000000..24eef545 Binary files /dev/null and b/interatomic_potentials/docs/chgnet.png differ diff --git a/interatomic_potentials/docs/mattersim.png b/interatomic_potentials/docs/mattersim.png new file mode 100644 index 00000000..e0e62bdd Binary files /dev/null and b/interatomic_potentials/docs/mattersim.png differ diff --git a/interatomic_potentials/example_data/cifs/mp-18767-LiMnO2.cif b/interatomic_potentials/example_data/cifs/mp-18767-LiMnO2.cif new file mode 100644 index 00000000..7e04fa34 --- /dev/null +++ b/interatomic_potentials/example_data/cifs/mp-18767-LiMnO2.cif @@ -0,0 +1,40 @@ +# generated using pymatgen +data_LiMnO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 2.86877900 +_cell_length_b 4.63447500 +_cell_length_c 5.83250700 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural LiMnO2 +_chemical_formula_sum 'Li2 Mn2 O4' +_cell_volume 77.54484024 +_cell_formula_units_Z 2 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_type_symbol + _atom_type_oxidation_number + Li+ 1.0 + Mn3+ 3.0 + O2- -2.0 +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Li+ Li0 1 0.50000000 0.50000000 0.37975050 1 + Li+ Li1 1 0.00000000 0.00000000 0.62024950 1 + Mn3+ Mn2 1 0.50000000 0.50000000 0.86325250 1 + Mn3+ Mn3 1 0.00000000 0.00000000 0.13674750 1 + O2- O4 1 0.50000000 0.00000000 0.36082450 1 + O2- O5 1 0.00000000 0.50000000 0.09851350 1 + O2- O6 1 0.50000000 0.00000000 0.90148650 1 + O2- O7 1 0.00000000 0.50000000 0.63917550 1 diff --git a/interatomic_potentials/predict.py b/interatomic_potentials/predict.py new file mode 100644 index 00000000..cd671d17 --- /dev/null +++ b/interatomic_potentials/predict.py @@ -0,0 +1,236 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import os.path as osp +from collections import defaultdict +from typing import Optional + +import paddle +import pandas as pd +from omegaconf import OmegaConf +from pymatgen.core import Structure +from tqdm import tqdm + +from ppmat.datasets.transform import build_post_transforms +from ppmat.models import build_graph_converter +from ppmat.models import build_model +from ppmat.models import build_model_from_name +from ppmat.utils import logger +from ppmat.utils import save_load + + +class PotentialPredictor: + """Potential predictor. + + This class provides an interface for predicting properties of crystalline + structures using pre-trained deep learning models. Supports two initialization + modes: + + 1. **Automatic Model Loading** + Specify `model_name` and `weights_name` to automatically download + and load pre-trained weights from the `MODEL_REGISTRY`. + + 2. **Custom Model Loading** + Provide explicit `config_path` and `checkpoint_path` to load + custom-trained models from local files. + + Args: + model_name (Optional[str], optional): Name of the pre-defined model architecture + from the `MODEL_REGISTRY` registry. When specified, associated weights + will be automatically downloaded. Defaults to None. + + weights_name (Optional[str], optional): Specific pre-trained weight identifier. + Used only when `model_name` is provided. Valid options include: + - 'best.pdparams' (highest validation performance) + - 'latest.pdparams' (most recent training checkpoint) + - Custom weight files ending with '.pdparams' + Defaults to None. + + config_path (Optional[str], optional): Path to model configuration file (YAML) + for custom models. Required when not using predefined `model_name`. + Defaults to None. + checkpoint_path (Optional[str], optional): Path to model checkpoint file + (.pdparams) for custom models. Required when not using predefined + `model_name`. Defaults to None. + """ + + def __init__( + self, + model_name: Optional[str] = None, + weights_name: Optional[str] = None, + config_path: Optional[str] = None, + checkpoint_path: Optional[str] = None, + ): + # if model_name is not None, then config_path and checkpoint_path must be + # provided + if model_name is None: + assert ( + config_path is not None and checkpoint_path is not None + ), "config_path and checkpoint_path must be provided when model_name is " + "None." + + logger.info(f"Loading model from {config_path} and {checkpoint_path}.") + + config = OmegaConf.load(config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + model = build_model(model_config) + save_load.load_pretrain(model, checkpoint_path) + + else: + logger.info("Since model_name is given, downloading it...") + model, config = build_model_from_name(model_name, weights_name) + + self.model = model + self.config = config + + self.model.eval() + + predict_config = config.get("Predict", None) + self.predict_config = predict_config + self.eval_with_no_grad = predict_config.get("eval_with_no_grad", True) + + self.graph_converter_fn = None + if self.predict_config is not None: + graph_converter_config = predict_config.get("graph_converter", None) + if graph_converter_config is not None: + self.graph_converter_fn = build_graph_converter(graph_converter_config) + + self.post_transforms_cfg = predict_config.get("post_transforms", None) + if self.post_transforms_cfg is not None: + self.post_transforms = build_post_transforms(self.post_transforms_cfg) + else: + self.post_transforms = None + + def graph_converter(self, structure): + if self.graph_converter_fn is None: + return structure + return self.graph_converter_fn(structure) + + def post_process(self, data): + if self.post_transforms is None: + return data + return self.post_transforms(data) + + def from_structures(self, structures): + + data = self.graph_converter(structures) + data = data.tensor() + if self.eval_with_no_grad: + with paddle.no_grad(): + out = self.model.predict(data) + else: + out = self.model.predict(data) + out = self.post_process(out) + return out + + def from_cif_file(self, cif_file_path, save_path=None): + if save_path is not None: + assert save_path.endswith(".csv"), "save_path must end with .csv" + if osp.isdir(cif_file_path): + cif_files = [ + osp.join(cif_file_path, f) + for f in os.listdir(cif_file_path) + if f.endswith(".cif") + ] + results = [] + for cif_file in tqdm(cif_files): + structure = Structure.from_file(cif_file) + result = self.from_structures(structure) + results.append(result) + if save_path is not None: + + keys = list(results[0].keys()) + result_properties = defaultdict(list) + for key in keys: + for r in results: + result_properties[key].append(r[key]) + + # save cif_files and result to csv file + df = pd.DataFrame({"cif_file": cif_files, **result_properties}) + df.to_csv(save_path, index=False) + logger.info(f"Saved the prediction result to {save_path}") + + return results + else: + structure = Structure.from_file(cif_file_path) + result = self.from_structures(structure) + + keys = list(result.keys()) + result_properties = defaultdict(list) + for key in keys: + result_properties[key].append(result[key]) + + if save_path is not None: + df = pd.DataFrame({"cif_file": [cif_file_path], **result_properties}) + df.to_csv(save_path, index=False) + logger.info(f"Saved the prediction result to {save_path}") + + return result + + +if __name__ == "__main__": + + argparse = argparse.ArgumentParser() + argparse.add_argument( + "--model_name", + type=str, + default=None, + help="Model name.", + ) + argparse.add_argument( + "--weights_name", + type=str, + default=None, + help="Weights name, e.g., best.pdparams, latest.pdparams.", + ) + argparse.add_argument( + "--config_path", + type=str, + default=None, + help="Path to the configuration file.", + ) + argparse.add_argument( + "--checkpoint_path", + type=str, + default=None, + help="Path to the checkpoint file.", + ) + argparse.add_argument( + "--cif_file_path", + type=str, + default="./interatomic_potentials/", + help="Path to the CIF file whose material properties you want to predict.", + ) + argparse.add_argument( + "--save_path", + type=str, + default="result.csv", + help="Path to save the prediction result.", + ) + args = argparse.parse_args() + + predictor = PotentialPredictor( + model_name=args.model_name, + weights_name=args.weights_name, + config_path=args.config_path, + checkpoint_path=args.checkpoint_path, + ) + + results = predictor.from_cif_file(args.cif_file_path, args.save_path) + print(results) diff --git a/interatomic_potentials/train.py b/interatomic_potentials/train.py new file mode 100644 index 00000000..09fd8880 --- /dev/null +++ b/interatomic_potentials/train.py @@ -0,0 +1,151 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import os.path as osp + +import paddle.distributed as dist +import paddle.distributed.fleet as fleet +from omegaconf import OmegaConf + +from ppmat.datasets import build_dataloader +from ppmat.datasets import set_signal_handlers +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.optimizer import build_optimizer +from ppmat.trainer.base_trainer import BaseTrainer +from ppmat.utils import logger +from ppmat.utils import misc +from ppmat.utils.eager_comp_setting import setting_eager_mode + +if dist.get_world_size() > 1: + fleet.init(is_collective=True) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config", + type=str, + help="Path to config file", + ) + + args, dynamic_args = parser.parse_known_args() + + # load config and merge with cli args + config = OmegaConf.load(args.config) + cli_config = OmegaConf.from_dotlist(dynamic_args) + config = OmegaConf.merge(config, cli_config) + + # save config to output_dir, only rank 0 process will do this + if dist.get_rank() == 0: + os.makedirs(config["Trainer"]["output_dir"], exist_ok=True) + config_name = os.path.basename(args.config) + OmegaConf.save(config, osp.join(config["Trainer"]["output_dir"], config_name)) + # convert to dict + config = OmegaConf.to_container(config, resolve=True) + + # init logger + logger_path = osp.join(config["Trainer"]["output_dir"], "run.log") + logger.init_logger(log_file=logger_path) + logger.info(f"Logger saved to {logger_path}") + + # set random seed + seed = config["Trainer"].get("seed", 42) + misc.set_random_seed(seed) + logger.info(f"Set random seed to {seed}") + + # set prim eager mode + enabled = config["Global"].get("prim_eager_enabled", False) + white_list = config["Global"].get("prim_backward_white_list", None) + setting_eager_mode(enabled, white_list) + + # build model from config + model_cfg = config["Model"] + model = build_model(model_cfg) + + # build dataloader from config + set_signal_handlers() + if config["Global"].get("do_train", True): + train_data_cfg = config["Dataset"].get("train") + assert ( + train_data_cfg is not None + ), "train_data_cfg must be defined, when do_train is true" + train_loader = build_dataloader(train_data_cfg) + else: + train_loader = None + + if config["Global"].get("do_eval", False) or config["Global"].get("do_train", True): + val_data_cfg = config["Dataset"].get("val") + if val_data_cfg is not None: + val_loader = build_dataloader(val_data_cfg) + else: + logger.info("No validation dataset defined.") + val_loader = None + else: + val_loader = None + + if config["Global"].get("do_test", False): + test_data_cfg = config["Dataset"].get("test") + assert ( + test_data_cfg is not None + ), "test_data_cfg must be defined, when do_test is true" + test_loader = build_dataloader(test_data_cfg) + else: + test_loader = None + + # build optimizer and learning rate scheduler from config + if config.get("Optimizer") is not None and config["Global"].get("do_train", True): + assert ( + train_loader is not None + ), "train_loader must be defined when optimizer is defined." + assert ( + config["Trainer"].get("max_epochs") is not None + ), "max_epochs must be defined when optimizer is defined." + optimizer, lr_scheduler = build_optimizer( + config["Optimizer"], + model, + config["Trainer"]["max_epochs"], + len(train_loader), + ) + else: + optimizer, lr_scheduler = None, None + + # build metric from config + metric_cfg = config.get("Metric") + if metric_cfg is not None: + metric_func = build_metric(metric_cfg) + else: + metric_func = None + + # # initialize trainer + trainer = BaseTrainer( + config["Trainer"], + model, + train_dataloader=train_loader, + val_dataloader=val_loader, + optimizer=optimizer, + lr_scheduler=lr_scheduler, + compute_metric_func_dict=metric_func, + ) + + if config["Global"].get("do_train", True): + trainer.train() + if config["Global"].get("do_eval", False): + logger.info("Evaluating on validation set") + time_info, loss_info, metric_info = trainer.eval(val_loader) + if config["Global"].get("do_test", False): + logger.info("Evaluating on test set") + time_info, loss_info, metric_info = trainer.eval(test_loader) diff --git a/jointContribution/README.md b/jointContribution/README.md new file mode 100644 index 00000000..9f4f5928 --- /dev/null +++ b/jointContribution/README.md @@ -0,0 +1 @@ +This directory is mainly used for sample libraries and model reproduction. diff --git a/jointContribution/mattergen/LICENSE b/jointContribution/mattergen/LICENSE new file mode 100644 index 00000000..9e841e7a --- /dev/null +++ b/jointContribution/mattergen/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/jointContribution/mattergen/MODEL_CARD.md b/jointContribution/mattergen/MODEL_CARD.md new file mode 100644 index 00000000..7a7cfc1b --- /dev/null +++ b/jointContribution/mattergen/MODEL_CARD.md @@ -0,0 +1,176 @@ +--- +license: mit +license_link: https://opensource.org/license/mit + +arxiv: 2312.03687 +language: +- en +tags: +- materials-science +- generative-ai +- materials-discovery +--- + +# MatterGen + + + +MatterGen is a generative model for inorganic materials design. + +## Model Details + +### Model Description + + + +MatterGen is a generative model for inorganic materials design. It is a diffusion model which jointly predicts a material’s atomic fractional coordinates, elements, as well as unit cell lattice vectors. Besides unconditional generation of material candidates, MatterGen can also be trained or fine-tuned for conditional generation based on target property values, e.g., bulk modulus, chemical system, or magnetic density. + +- **Developed by:** Materials Design Team, Microsoft Research AI for Science +- **Model type:** Diffusion model +- **License:** MIT + +### Model Sources + + + +- **Repository:** https://github.com/microsoft/mattergen +- **Paper:** https://arxiv.org/abs/2312.03687 + +## Uses + + + +### Direct Use + + + +1. Generate inorganic materials candidates without property condition. +2. Fine-tune the base model on user-provided data with property-labeled materials. +3. Generate inorganic materials candidates with target property, e.g., bulk modulus, chemical system, magnetic density, or user-defined target properties after fine-tuning. + + +### Out-of-Scope Use + + + +* Generate materials with more than 20 atoms inside the unit cell. +* Generate organic crystals or non-crystalline materials. +* Generate crystals containing noble gas elements, radioactive elements, or elements with atomic number greater than 84 – these elements were removed from the training data. + +## Bias, Risks, and Limitations + + + +MatterGen was only trained on and evaluated on up to 20 atoms inside the unit cell; more atoms are currently not supported. MatterGen’s training data is materials below 0.1 eV/atoms below the reference convex hull. Therefore, it is expected that the fraction of generated materials on or below the convex hull is significantly lower than the fraction of materials within 0.1 eV/atom above the convex hull. + + +### Recommendations + + + +The performance on property-guided generation heavily depends on the quality and quantity of the property labels used to train MatterGen. For extreme property values where there are few training structures with similar values, the performance may degrade. + +For fine-tuning the model on a new property, use a sufficient amount of labeled property data for training, i.e., at least several thousands of labeled structures. Also ensure good coverage of property values in the range of values which are intended for property-guided generation. + +## How to Get Started with the Model + +Clone the [repository](https://github.com/microsoft/mattergen) and follow the README instructions. + +## Training Details + +### Training Data + + + +MatterGen was trained on crystalline materials from the following data sources: +1. MP (https://next-gen.materialsproject.org/; v2022.10.28, Creative Commons Attribution 4.0 International License), an open-access resource containing DFT-relaxed crystal structures obtained from a variety of sources, but largely based upon experimentally-known crystals. +2. The Alexandria dataset (https://alexandria.icams.rub.de/; Creative Commons Attribution 4.0 International License), an open-access resource containing DFT-relaxed crystal structures from a variety of sources, including a large quantity of hypothetical crystal structures generated by ML methods or other algorithmic means. +To train MatterGen, we select only structures with up to 20 atoms and whose energy above hull is below 0.1 eV/atom. Further, we remove structures that contain noble gas elements, elements with atomic number higher than 84 (which includes most radioactive elements), or the radioactive elements “Tc” and “Pm” from the training data. For more information, see paper, Supplementary C.1. + +### Training Procedure + + + +#### Preprocessing + +We relax structures from the above data sources with DFT and select only those structures whose energy above the combined convex hull is below 0.1 eV/atom. MatterGen is trained solely on primitive structures. We further select only structures with up to 20 atoms inside the unit cell. We use the Niggli reduction to preprocess the unit cell lattices, followed by the polar decomposition to ensure the lattice matrices are symmetric matrices. See the paper for more detailed information. + +#### Training Hyperparameters + +* Starting learning rate 1e-4, reduces successively by a factor of 0.6 when training loss does not reduce within 100 epochs, up to 1e-6. +* Batch size 512 +* float32 precision + +#### Speeds, Sizes, Times + + + +* MatterGen contains 46.8M parameters +* One training epoch of around 600K training samples takes around 6 minutes on 8 NVIDIA A100 GPUs +* Sampling 1,000 structures takes around two hours using a single NVIDIA V100 GPU + + +## Evaluation + + + +### Testing Data, Factors & Metrics + + +#### Metrics + + + +MatterGen was evaluated on unconditional generation across the following metrics: +* The percentage of stable, novel, and unique (S.U.N.) structures among 1,024 generated samples. + - Stable means a structure’s energy is less than 0.1 eV/atom above the reference convex hull + - Novel means a structure does not match any structure in our reference dataset with the disordered structure matcher presented in the paper. + - Unique means that there is no other structure among the generated ones which matches a given structure. +* The average root mean square distance (RMSD) of generated structures and their DFT-relaxed local energy minima, measured in Angstrom. + + +### Results + +MatterGen achieves 38.57 % S.U.N. rate among generated structures, and the average RMSD of its samples is 0.021 Angstrom. For more details see Section 2.2 of the MatterGen paper. +We also evaluate MatterGen on property-conditioned generation. +• For generation conditioned on chemical system, MatterGen produces 83 % S.U.N. structures on well-explored chemical systems, 65 % on partially explored systems, and 49 % on unexplored chemical systems. For more details, see Section 2.3 of the MatterGen paper. +• Conditioning on a bulk modulus value of 400 GPa, MatterGen produces 106 S.U.N. structures with > 400 GPa bulk modulus given a budget of 180 DFT property calculations. For more details, see Section 2.4 of the MatterGen paper. +• Conditioning on magnetic density of > 0.2 Angstrom-3, MatterGen produces 18 S.U.N. structures complying with the condition given a budget of 180 DFT property calculations. For more details, see Section 2.4 of the MatterGen paper. + +#### Summary + +MatterGen is able to produce novel, unique, and stable material candidates both with and without property conditions. For property-guided generation, MatterGen is able to produce S.U.N. structures with extreme property values such as 400 GPa bulk modulus, where there are only two such structures in the labeled reference set. MatterGen outperforms both classical as well as recent deep generative model baselines. For more details on the performance of MatterGen, see the paper. + +## Technical Specifications + +### Model Architecture and Objective + +The model architecture is based on GemNet (Gasteiger et al. 2021). + +## Citation + + + +**BibTeX:** +```bibtex +@article{zeni2023mattergen, + title={Mattergen: a generative model for inorganic materials design}, + author={Zeni, Claudio and Pinsler, Robert and Z{\"u}gner, Daniel and Fowler, Andrew and Horton, Matthew and Fu, Xiang and Shysheya, Sasha and Crabb{\'e}, Jonathan and Sun, Lixin and Smith, Jake and others}, + journal={arXiv preprint arXiv:2312.03687}, + year={2023} +} +``` + +**APA:** + +Zeni, C., Pinsler, R., Zügner, D., Fowler, A., Horton, M., Fu, X., ... & Xie, T. (2023). Mattergen: a generative model for inorganic materials design. arXiv preprint arXiv:2312.03687. + + +## Model Card Authors + +Daniel Zügner (dzuegner@microsoft.com) + +## Model Card Contact + +Daniel Zügner (dzuegner@microsoft.com) +Tian Xie (tianxie@microsoft.com) \ No newline at end of file diff --git a/jointContribution/mattergen/NOTICE b/jointContribution/mattergen/NOTICE new file mode 100644 index 00000000..dc28ea14 --- /dev/null +++ b/jointContribution/mattergen/NOTICE @@ -0,0 +1,10443 @@ +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + +--------------------------------------------------------- + +aiohappyeyeballs 2.4.4 - 0BSD AND BSD-3-Clause AND LicenseRef-scancode-unknown-license-reference AND PSF-2.0 AND Python-2.0 + + +Copyright (c) 1995-2001 Corporation for National Research Initiatives +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation + +0BSD AND BSD-3-Clause AND LicenseRef-scancode-unknown-license-reference AND PSF-2.0 AND Python-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +absl-py 2.1.0 - Apache-2.0 + + +Copyright 2017 The Abseil Authors +Copyright 2018 The Abseil Authors +Copyright 2021 The Abseil Authors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +aiohttp 3.11.11 - Apache-2.0 + + +Copyright Fedor Indutny, 2018 +Copyright aio-libs contributors +copyright f project contributors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +aiosignal 1.3.2 - Apache-2.0 + + +copyright 2013-2019, aiosignal contributors +Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +arrow 1.3.0 - Apache-2.0 + + +Copyright 2023 Chris Smith +copyright 2023, Chris Smith + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +asttokens 3.0.0 - Apache-2.0 + + +copyright 2023, Grist Labs +Copyright 2016 Grist Labs, Inc. +Copyright 2023, Grist Labs, Inc. + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +async-timeout 5.0.1 - Apache-2.0 + + +Copyright 2016-2020 aio-libs collaboration + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +bcrypt 4.2.1 - Apache-2.0 + + +Copyright 2013-2024 + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +bleach 6.2.0 - Apache-2.0 + + +Copyright (c) 2014-2017, Mozilla Foundation +Copyright (c) 2006-2013 James Graham and other contributors +copyright 2012-2015, James Socol 2015-2017, Mozilla Foundation + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +clarabel 0.9.0 - Apache-2.0 + + +(c) Paul Goulart +Copyright 2022 University of Oxford Control Group + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +cython 3.0.11 - Apache-2.0 + + +(c) Copyright CNRI +(c) Real 17.0 Imag +Copyright (c) 2005 Carl Friedrich Bolz +Copyright (c) 1995 Sun Microsystems, Inc. +Copyright (c) 2010-2011, IPython Development Team + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +docker-pycreds 0.4.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +fire 0.7.0 - Apache-2.0 + + +Copyright 2013 Google LLC. +Copyright 2015 Google LLC. +Copyright 2017 Google Inc. +Copyright 2018 Google LLC. +Copyright (c) 2018 Google Inc. + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +frozenlist 1.5.0 - Apache-2.0 + + +copyright 2013, frozenlist contributors +Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +lazy-model 0.2.0 - Apache-2.0 + + +Copyright 2022 Roman + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +msgpack 1.1.0 - Apache-2.0 + + +Copyright (c) 2009 Naoki INADA +Copyright (c) 2008-2010 FURUHASHI Sadayuki +Copyright (c) 2008-2011 INADA Naoki + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +multidict 6.1.0 - Apache-2.0 + + +Copyright 2016 Andrew Svetlov and aio-libs contributors +copyright 2016, Andrew Svetlov and aio-libs contributors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +osqp 0.6.7.post3 - Apache-2.0 + + +Copyright (c) 2012, Timothy A. Davis +Copyright (c) 2013, Timothy A. Davis +Copyright (c) Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff +(c) Bartolomeo Stellato, Goran Banjac University of Oxford - Stanford University +Copyright (c), 1996-2015, Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff +Copyright (c) 1996-2013 by Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff +Copyright (c) 2004 by Timothy A. Davis, Patrick Amestoy, Iain S. Duff, John K. Reid +(c) Bartolomeo Stellato, Goran Banjac print University of Oxford - Stanford University + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +overrides 7.7.0 - Apache-2.0 + + +Copyright 2016 Keunhong Lee +Copyright 2019 Mikko Korpela + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +petname 2.6 - Apache-2.0 + + +Copyright 2014 Dustin Kirkland +Copyright (c) 2013 Casey Marshall +Copyright (c) 2019 Dustin Kirkland + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +propcache 0.2.1 - Apache-2.0 + + +copyright f'2016, Andrew Svetlov, project +Copyright 2016-2021, Andrew Svetlov and aio-libs team + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pyarrow 18.1.0 - Apache-2.0 + + +Copyright 2011 Kitware, Inc. +Copyright 2012 Cloudera Inc. +Copyright Contributors to the pythoncapi_compat project. + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pydeck 0.9.1 - Apache-2.0 + + +Copyright (c) 2015, Mapbox +Copyright (c) 2016, Mapbox +copyright 2011 Google Inc. +Copyright 2020 Daniel Wirtz +Copyright (c) 2008 Apple Inc. +Copyright (c) 2014 Adam Krebs +Copyright (c) 2016-17 Karl Cheng +Copyright (c) 2016 Jorik Tangelder +Copyright 2009 The Closure Library +Copyright (c) 2014-2017, PhosphorJS +Copyright (c) 2014-2018, PhosphorJS +Copyright (c) 2014-2019, PhosphorJS +Copyright (c) Microsoft Corporation +(c) gr Halfwidth and Fullwidth Forms +Copyright 2022 Foursquare Labs, Inc. +Copyright (c) Uber Technologies, Inc. +(c) 2013 Daniel Wirtz +Copyright (c) Jupyter Development Team +(c) 2015 Adam Krebs, Jimmy Yuen Ho Wong +(c) Dean McNamee , 2012 +Copyright (c) 2018-2019 HERE Europe B.V. +Copyright (c) 2015 Uber Technologies, Inc. +Copyright (c) 2017 Uber Technologies, Inc. +Copyright (c) 2019 Uber Technologies, Inc. +Copyright 2009 The Closure Library Authors +Copyright (c) 2016, AJ ONeal +Copyright (c) 2017, Jupyter Development Team +Copyright 2013 Daniel Wirtz +Copyright (c) 2015-2017 Uber Technologies, Inc. +Copyright (c) 2014-2016, Jupyter Development Team +Copyright (c) 2014-2017, Jupyter Development Team +Copyright (c) 2015 - 2017 Uber Technologies, Inc. +Copyright (c) 2015 - 2018 Uber Technologies, Inc. +Copyright (c) 2015 - 2019 Uber Technologies, Inc. +Copyright 2018-2019, 2022 Uber Technologies, Inc. +Copyright OpenJS Foundation and other contributors +Copyright 2020 vis.gl, a Series of LF Projects, LLC +Copyright (c) 2013 Stephen Oney, http://jsep.from.so +Copyright (c) 2010-2015 Jeremy Ashkenas, DocumentCloud +Copyright (c) 2019, Michael Fogleman, Vladimir Agafonkin +Copyright (c) 2016-2017 Mohamad Moneimne and Contributors +Copyright (c) 2012-2016, Jon Atkins +Copyright (c) 2016-2021, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com) +(c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Backbone +(c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors Underscore + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pymongo 4.10.1 - Apache-2.0 + + +Copyright 2015 MongoDB, Inc. +Copyright 2016 MongoDB, Inc. +Copyright 2017 MongoDB, Inc. +Copyright 2018 MongoDB, Inc. +Copyright 2009-2015 MongoDB, Inc. +Copyright 2010-2015 MongoDB, Inc. +Copyright 2011-2015 MongoDB, Inc. +Copyright 2013-2016 MongoDB, Inc. +Copyright 2014-2015 MongoDB, Inc. +Copyright 2014-2016 MongoDB, Inc. +Copyright 2009-present MongoDB, Inc. +Copyright 2010-present MongoDB, Inc. +Copyright 2011-present MongoDB, Inc. +Copyright 2012-present MongoDB, Inc. +Copyright 2013-present MongoDB, Inc. +Copyright 2014-present MongoDB, Inc. +Copyright 2015-present MongoDB, Inc. +Copyright 2016-present MongoDB, Inc. +Copyright 2017-present MongoDB, Inc. +Copyright 2018-present MongoDB, Inc. +Copyright 2019-present MongoDB, Inc. +Copyright 2020-present MongoDB, Inc. +Copyright 2021-present MongoDB, Inc. +Copyright 2022-Present MongoDB, Inc. +Copyright 2022-present MongoDB, Inc. +Copyright 2023-Present MongoDB, Inc. +Copyright 2023-present MongoDB, Inc. +Copyright 2024-Present MongoDB, Inc. +Copyright 2024-present MongoDB, Inc. +Copyright 2007-2011 by the Sphinx team +Copyright (c) 2007-2010 Michael G Schwern +Copyright (c) 2006-2013 Alexander Chemeris +copyright MongoDB, Inc. 2008-present. MongoDB, Mongo + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pynacl 1.5.0 - Apache-2.0 + + +(c) 2013-2019, Frank Denis +Copyright 2013-2018 .format +Copyright 2009 Colin Percival +Copyright (c) 1994 X Consortium +Copyright (c) 2015 Thomas Pornin +Copyright 2013 Alexander Peslyak +Copyright (c) 2013-2021 Frank Denis +Copyright (c) 2013-2019 The libsodium +Copyright 2012,2013 Alexander Peslyak +Copyright 2005,2007,2009 Colin Percival +Copyright (c) 2019 Reini Urban +Copyright (c) 2011 Free Software Foundation, Inc. +Copyright (c) 2014 Free Software Foundation, Inc. +Copyright (c) 2021 Free Software Foundation, Inc. +Copyright (c) 2017 David Seifert +Copyright 1992-2021 Free Software Foundation, Inc. +Copyright (c) 2008 Alan Woodland +Copyright (c) 2008 Guido U. Draheim +Copyright (c) 2019 Marc Stevens +Copyright (c) 1994-2020 Free Software Foundation, Inc. +Copyright (c) 1996-2013 Free Software Foundation, Inc. +Copyright (c) 1996-2015 Free Software Foundation, Inc. +Copyright (c) 1996-2020 Free Software Foundation, Inc. +Copyright (c) 1997-2020 Free Software Foundation, Inc. +Copyright (c) 1999-2013 Free Software Foundation, Inc. +Copyright (c) 1999-2020 Free Software Foundation, Inc. +Copyright (c) 2001-2020 Free Software Foundation, Inc. +Copyright (c) 2002-2020 Free Software Foundation, Inc. +Copyright (c) 2003-2020 Free Software Foundation, Inc. +Copyright (c) 2004-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2020 Free Software Foundation, Inc. +Copyright (c) 2006-2020 Free Software Foundation, Inc. +Copyright (c) 2008-2013 Free Software Foundation, Inc. +Copyright (c) 2009-2020 Free Software Foundation, Inc. +Copyright (c) 2010-2015 Free Software Foundation, Inc. +Copyright (c) 2011-2020 Free Software Foundation, Inc. +Copyright (c) 2011 Daniel Richard G. +Copyright (c) 2011 Maarten Bosmans +Copyright 2013 Donald Stufft and individual contributors +Copyright 2014 Donald Stufft and individual contributors +Copyright 2016 Donald Stufft and individual contributors +Copyright 2017 Donald Stufft and individual contributors +Copyright 2018 Donald Stufft and individual contributors +Copyright 2020 Donald Stufft and individual contributors +copyright 2013, Donald Stufft and Individual Contributors +Copyright (c) 2008 Steven G. Johnson +Copyright (c) 2010 Diego Elio Petteno +Copyright (c) 2004, 2011-2015 Free Software Foundation, Inc. +Copyright 2013-2017 Donald Stufft and individual contributors +Copyright 2013-2018 Donald Stufft and individual contributors +Copyright 2013-2019 Donald Stufft and individual contributors +Copyright 2016-2019 Donald Stufft and individual contributors +Copyright (c) 1996-2001, 2003-2015 Free Software Foundation, Inc. +Copyright (c) 2008 John Darrington +Copyright (c) 2015 Enrico M. Crisostomo +Copyright (c) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007-2008, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2014, 2015, 2016 Philip Withnall + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +python-dateutil 2.9.0.post0 - Apache-2.0 + + +copyright 2019, dateutil +Copyright 2017- dateutil contributors +Copyright (c) 2015- - dateutil contributors +Copyright 2017- Paul Ganssle +Copyright (c) 2015- - Paul Ganssle +Copyright (c) 2014-2016 - Yaron de Leeuw +Copyright (c) 2003-2011 - Gustavo Niemeyer +Copyright (c) 2012-2014 - Tomi Pievilainen + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pytorch-lightning 2.0.6 - Apache-2.0 + + +Copyright Lightning AI. +Copyright The Lightning AI team +Copyright (c) 2018- time.strftime +Copyright (c) 2022- time.strftime +Copyright 2018-2021 William Falcon +Copyright 2020 The PyTorch Lightning team and Microsoft Corporation + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +qdldl 0.1.7.post5 - Apache-2.0 + + +Copyright (c) 2012, Timothy A. Davis +Copyright (c) 2013, Timothy A. Davis +Copyright 2020 Paul Goulat, Bartolomeo Stellato, Goran Banjac +Copyright (c) Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff +Copyright (c), 1996-2015, Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff +Copyright (c) 1996-2013 by Timothy A. Davis, Patrick R. Amestoy, and Iain S. Duff +Copyright (c) 2004 by Timothy A. Davis, Patrick Amestoy, Iain S. Duff, John K. Reid + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +requests 2.32.3 - Apache-2.0 + + +Copyright Kenneth Reitz +Copyright 2019 Kenneth Reitz +copyright (c) 2012 by Kenneth Reitz +copyright (c) 2017 by Kenneth Reitz + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +s3transfer 0.10.4 - Apache-2.0 + + +Copyright 2016 Amazon.com, Inc. or its affiliates +Copyright 2017 Amazon.com, Inc. or its affiliates +Copyright 2018 Amazon.com, Inc. or its affiliates +Copyright 2019 Amazon.com, Inc. or its affiliates +Copyright 2021 Amazon.com, Inc. or its affiliates + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +streamlit 1.41.1 - Apache-2.0 + + +(c) Zeno Rocha +(c) Kyle Simpson +(c) Sindre Sorhus +(c) 2020 Denis Pushkarev +(c) http://www.esri.com> +Copyright 2009 The Closure +Copyright 2020 Daniel Wirtz +(c) 2017-2021 Joachim Wester +(c) 2017-2022 Joachim Wester +Copyright (c) 2014-2018 Khan +(c) 2009-2016 Michael Leibman +Copyright (c) 2018 Jed Watson +Steven Levithan (c) 2007-2017 +Steven Levithan (c) 2008-2017 +Steven Levithan (c) 2009-2017 +Steven Levithan (c) 2010-2017 +Steven Levithan (c) 2012-2017 +(c) Cure53 and other contributors +Copyright (c) 2016 Jorik Tangelder +Copyright 2018 John Madhavan-Reese +Copyright (c) Microsoft Corporation +(c) 2013 Daniel Wirtz +Copyright (c) 2014-2015, Jon Schlinkert +Copyright (c) 2009-2010 Design Science, Inc. +Copyright (c) Facebook, Inc. and its affiliates +Copyright (c) JS Foundation and other contributors +Copyright OpenJS Foundation and other contributors +Copyright jQuery Foundation and other contributors +Copyright (c) 2016 Federico Zivolo and contributors +Copyright (c) 2001, Janko Hauser +Copyright (c) 2008-Present, IPython Development Team +(c) 2009-2010, Design Science, Inc. +Copyright (c) 2002-2022 - ProphICy Semiconductor, Inc. +Copyright (c) 2012-2017 Kirollos Risk (http://kiro.me) +Copyright (c) 2001, Nathaniel Gray +Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. +Copyright (c) 2014-2018 Khan Academy +copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc +(c) 2019 Josh Johnson https://github.com/jshjohnson/Choices +Copyright (c) 2010 Three Dub Media - http://threedubmedia.com +Copyright (c) 2012 - 2022, Anaconda, Inc., and Bokeh Contributors +Copyright (c) 2017 Benjamin Van Ryseghem +Copyright (c) 2001-2007, Fernando Perez +(c) http://www.esri.com> ESRI ,'ortoInstaMaps type:raster,'tiles' https://tilemaps.icgc.cat/mapfactory/wmts/orto_8_12/CAT3857 + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tenacity 9.0.0 - Apache-2.0 + + +Copyright 2013 Ray +Copyright 2013-2014 Ray +Copyright 2017 Elisey Zanko +Copyright 2016 Joshua Harlow +Copyright 2016 Julien Danjou +Copyright 2016 Etienne Bersac +Copyright 2016-2018 Julien Danjou +Copyright 2016-2021 Julien Danjou + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tornado 6.4.2 - Apache-2.0 + + +Copyright 2009 Facebook +Copyright 2011 Facebook +Copyright 2012 Facebook +Copyright 2014 Facebook +Copyright 2015 The Tornado Authors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tzdata 2024.2 - Apache-2.0 + + +Copyright (c) 2020, Paul Ganssle +copyright 2020, Python Software Foundation + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +websocket-client 1.8.0 - Apache-2.0 + + +Copyright 2024 engn33r + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +yarl 1.18.3 - Apache-2.0 + + +copyright f'2016, Andrew Svetlov, project +Copyright 2016-2021, Andrew Svetlov and aio-libs team + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +packaging 24.2 - Apache-2.0 AND BSD-2-Clause + + +Copyright (c) 2017-present Ofek Lev +Copyright (c) Donald Stufft and individual contributors + +Apache-2.0 AND BSD-2-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +prometheus-client 0.21.1 - Apache-2.0 AND BSD-2-Clause + + +Copyright 2015 The Prometheus Authors +Copyright (c) 2005-2016, Michele Simionato + +Apache-2.0 AND BSD-2-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +fonttools 4.55.3 - Apache-2.0 AND BSD-3-Clause AND MIT AND OFL-1.1 + + +Copyright 2017 +Copyright 2018 +Copyright c 2015 +COPYRIGHT STRING. +(c) 2024 Unicode(r), Inc. +Copyright 2011 Google Inc. +Copyright 2013 Google Inc. +Copyright 2015 Google Inc. +Copyright 2016 Google Inc. +Copyright 2019 Google Inc. +Copyright 2023 Google Inc. +(c) 2010 by Pablo Impallari +Copyright 2013 Google, Inc. +Copyright (c) 2000 BeOpen.com +Copyright 2017 by Jens Kutilek +Copyright 2021 Behdad Esfahbod +Copyright 2023 Behdad Esfahbod +Copyright (c) 2015 by FontTools +Copyright 2015-2021 Google LLC. +Copyright (c ) 2015 by FontTools +Copyright 2008 The Bungee Project +Copyright 2021 The Qahiri Project +Copyright (c) 2009 Type Supply LLC +Copyright (c) 2017 Just van Rossum +(c) 2002 Adobe Systems Incorporated +Copyright (c) 2010 by Pablo Impallari +Copyright (c) 2015-2019 Belleve Invis +Copyright 2010-2020 The Amiri Project +Copyright (c) 2013-2014 Lennart Regebro +Copyright (c) 2015-2019 The Mada Project +Copyright 2015 Adobe System Incorporated +Copyright (c) 2004-2022 SIL International +Copyright 2014 Adobe Systems Incorporated +Copyright (c) 2018 Adobe systems Co., Ltd. +(c) 2014-2021 Adobe (http://www.adobe.com/) +(c) 2014 - 2023 Adobe (http://www.adobe.com/) +Copyright (c) 2002 Adobe Systems Incorporated +Portions copyright (c) 1990 by Elsevier, Inc. +(c) 2010 by Pablo Impallari. www.impallari.com +Copyright (c) 2012-2019 The Libertinus Project +copyright (c) 2005-2016, The RoboFab Developers +Copyright (c) 2001-2010 by the STI Pub Companies +Copyright (c) 2001-2011 by the STI Pub Companies +Copyright 2010 - 2012 Adobe Systems Incorporated +Portions copyright (c) 2009-2012 by Khaled Hosny +copyright 2020, Just van Rossum, Behdad Esfahbod +Copyright 2002-2019 Adobe (http://www.adobe.com/) +Copyright 2014-2021 Adobe (http://www.adobe.com/) +Copyright 2015-2021 The Aref Ruqaa Project Authors +Copyright 1998, Just van Rossum +Portions copyright (c) 1998-2003 by MicroPress, Inc. +(c) Copyright 1994-1997 Summer Institute of Linguistics +Copyright (c) 2010 by Pablo Impallari. www.impallari.com +Copyright (c) 2015-2020 Belleve Invis (belleve@typeof.net) +Copyright c 1997, 2009, 2011 American Mathematical Society +(c) 2010, Pablo Impallari (www.impallari.com impallari@gmail.com) +Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam +(c) 2010 - 2012 Adobe Systems Incorporated (http://www.adobe.com/) +Copyright (c) 1995-2001 Corporation for National Research Initiatives +Copyright (c) 1999-2004 Just van Rossum, LettError (just@letterror.com) +Copyright 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/) +Copyright (c) 2010, Pablo Impallari (www.impallari.com impallari@gmail.com) +Copyright (c) 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/) +Copyright 2014, 2015, 2016 Adobe Systems Incorporated (http://www.adobe.com/) +Copyright (c) 1997, 2009, 2011 American Mathematical Society http://www.ams.org +Copyright 2015-2021 The Aref Ruqaa Project Authors (https://github.com/aliftype/aref-ruqaa) +Copyright 2017 The Roboto Flex Project Authors (https://github.com/TypeNetwork/Roboto-Flex) +Copyright 2017 The Roboto Flex Project Authors (https://github.com/TypeNetwork/Roboto-Flex)Roboto + +Apache-2.0 AND BSD-3-Clause AND MIT AND OFL-1.1 + +--------------------------------------------------------- + +--------------------------------------------------------- + +grpcio 1.69.0 - Apache-2.0 AND BSD-3-Clause AND MPL-2.0 + + +Copyright 2015 gRPC +Copyright 2016 gRPC +Copyright 2017 gRPC +Copyright 2018 gRPC +Copyright 2019 gRPC +Copyright 2020 gRPC +Copyright 2021 gRPC +Copyright 2022 gRPC +Copyright 2023 gRPC +Copyright 2024 gRPC +Copyright 2005 Nokia +(c) 2006 Entrust, Inc. +Copyright 2019 The gRPC +Copyright 2020 The gRPC +Copyright 2021 The gRPC +Copyright 2021 the gRPC +Copyright 2023 The gRPC +Copyright 2024 The gRPC +IsAlpha (c) IsDigit (c) +IsLower (c) IsUpper (c) +Copyright 2015-2016 gRPC +Copyright 2022 Google LLC +Copyright 2005 Google Inc. +Copyright 2008 Google Inc. +Copyright 2009 Google Inc. +Copyright 2010 Google Inc. +Copyright 2015 Google Inc. +Copyright 2016 Brian Smith +Copyright 2016 Google Inc. +Copyright 2017 Google Inc. +Copyright 2018 Google LLC. +Copyright 2019 Google LLC. +Copyright 2020 Google Inc. +Copyright 2021 Google Inc. +Copyright 2023 Google LLC. +Copyright 2024 Google LLC. +Copyright 2005, Google Inc. +Copyright 2006, Google Inc. +Copyright 2007, Google Inc. +Copyright 2008, Google Inc. +Copyright 2009, Google Inc. +Copyright 2010, Google Inc. +Copyright 2013, Google Inc. +Copyright 2015, Google Inc. +Copyright 2016, Google Inc. +Copyright 2018, Google Inc. +Copyright 2018, Google LLC. +Copyright 2019, Google Inc. +Copyright 2019, Google LLC. +Copyright 2021 gRPC Authors +Copyright 2022 gRPC Authors +Copyright 2023 gRPC Authors +(c) 1999 Entrust.net Limited +(c) 2009 Entrust, Inc. - for +(c) 2012 Entrust, Inc. - for +(c) 2015 Entrust, Inc. - for +Copyright (c) 2020, Arm Ltd. +Copyright (c) 2003 Mark Adler +Copyright (c) 2018 Mark Adler +Copyright (c) 2021 Permission +Copyright (c) 2011, RTFM, Inc. +Copyright (c) 2015, Intel Inc. +Copyright (c) 2023, Google LLC +Copyright (c) 2024, Google LLC +Copyright 1995-2023 Mark Adler +Copyright 2004 The RE2 Authors +Copyright 2005 Dominick Meglio +Copyright 2005 The RE2 Authors +Copyright 2006 The RE2 Authors +Copyright 2007 The RE2 Authors +Copyright 2008 The RE2 Authors +Copyright 2009 The RE2 Authors +Copyright 2010 The RE2 Authors +Copyright 2016 The RE2 Authors +Copyright 2018 The RE2 Authors +Copyright (c) 2014, Google Inc. +Copyright (c) 2015, Google Inc. +Copyright (c) 2016, Google Inc. +Copyright (c) 2017, Google Inc. +Copyright (c) 2018, Google Inc. +Copyright (c) 2019, Google Inc. +Copyright (c) 2020, Google Inc. +Copyright (c) 2021, Google Inc. +Copyright (c) 2022, Google Inc. +Copyright (c) 2023, Google Inc. +Copyright (c) 2024, Google Inc. +Copyright 2003-2009 Google Inc. +Copyright 2003-2010 Google Inc. +Copyright 2018 The gRPC Authors +Copyright 2019 The gRPC Authors +Copyright 2020 The gRPC Authors +Copyright 2021 The gRPC Authors +Copyright 2022 The gRPC Authors +Copyright 2023 The gRPC Authors +Copyright 2024 The gRPC Authors +Copyright (c) 2021 by Brad House +Copyright (c) 1990-2000 Info-ZIP. +Copyright 2005 by Dominick Meglio +Copyright 2017 The Abseil Authors +Copyright 2018 The Abseil Authors +Copyright 2019 The Abseil Authors +Copyright 2020 The Abseil Authors +Copyright 2021 The Abseil Authors +Copyright 2022 The Abseil Authors +Copyright 2023 The Abseil Authors +Copyright 2024 The Abseil Authors +Copyright (c) 1995-2003 Mark Adler +Copyright (c) 1995-2008 Mark Adler +Copyright (c) 1995-2017 Mark Adler +Copyright (c) 1995-2019 Mark Adler +Copyright (c) 1995-2022 Mark Adler +Copyright (c) 1995-2023 Mark Adler +Copyright (c) 2002-2013 Mark Adler +Copyright (c) 2003-2010 Mark Adler +Copyright (c) 2004-2017 Mark Adler +Copyright (c) 2004-2019 Mark Adler +Copyright (c) 2003, 2012 Mark Adler +Copyright (c) 2004, 2010 Mark Adler +Copyright (c) 2011, 2016 Mark Adler +Copyright (c) 2012-2020 Yann Collet +Copyright 1999-2005 The RE2 Authors +Copyright 2001-2010 The RE2 Authors +Copyright 2002-2009 The RE2 Authors +Copyright 2003-2009 The RE2 Authors +Copyright 2006-2007 The RE2 Authors +Copyright 2006-2008 The RE2 Authors +Copyright 2010 The Chromium Authors +Copyright 2011 The Chromium Authors +Copyright 2014 The Chromium Authors +Copyright 2015 The Chromium Authors +Copyright 2016 The Chromium Authors +Copyright 2017 The Chromium Authors +Copyright 2018 The Chromium Authors +Copyright 2019 The Chromium Authors +Copyright 2021 The Chromium Authors +Copyright 2022 The Chromium Authors +Copyright 2023 The Chromium Authors +Copyright (c) 2007-2008 Even Rouault +Copyright (c) 2017, the HRSS authors +Copyright (c) 2004 by Daniel Stenberg +Copyright (c) 2005 by Dominick Meglio +Copyright (c) 2008 by Daniel Stenberg +Copyright (c) 2012, Intel Corporation +Copyright (c) 2014, Intel Corporation +Copyright 2002 Sun Microsystems, Inc. +Copyright (c) 1998-2005 Gilles Vollant +Copyright (c) 1999 The OpenSSL Project +Copyright (c) 2000 The OpenSSL Project +Copyright (c) 2001 The OpenSSL Project +Copyright (c) 2003 The OpenSSL Project +Copyright (c) 2004 The OpenSSL Project +Copyright (c) 2005 The OpenSSL Project +Copyright (c) 2006 The OpenSSL Project +Copyright (c) 2008 The OpenSSL Project +Copyright (c) 2010 The OpenSSL Project +Copyright (c) 2011 The OpenSSL Project +Copyright (c) 2012 The OpenSSL Project +Copyright (c) 2013 The OpenSSL Project +Copyright (c) 2014 The OpenSSL Project +Copyright (c) 2015 The OpenSSL Project +Copyright (c) 2019 by Andrew Selivanov +Copyright (c) 2012 The Chromium Authors +Copyright (c) 1995-2003, 2010 Mark Adler +Copyright (c) 1995-2005, 2010 Mark Adler +Copyright (c) 1995-2011, 2016 Mark Adler +Copyright (c) 1995-2017 Jean-loup Gailly +Copyright (c) 1995-2018 Jean-loup Gailly +Copyright (c) 1995-2021 Jean-loup Gailly +holder is Tim Hudson (tjh@cryptsoft.com) +Copyright (c) 2002 by Lucent Technologies +Copyright (c) 2003, 2012, 2013 Mark Adler +Copyright (c) 2004, 2005, 2012 Mark Adler +Copyright (c) 2004, 2008, 2012 Mark Adler +Copyright (c) 2004-2009 by Daniel Stenberg +Copyright (c) 2004-2010 by Daniel Stenberg +Copyright (c) 2004-2011 by Daniel Stenberg +Copyright (c) 2004-2017 by Daniel Stenberg +Copyright (c) 2005 - 2010, Daniel Stenberg +Copyright (c) 2005-2013 by Daniel Stenberg +Copyright (c) 2007-2013 by Daniel Stenberg +Copyright (c) 2008-2013 by Daniel Stenberg +Copyright (c) 2009-2013 by Daniel Stenberg +Copyright (c) 2010-2012 by Daniel Stenberg +Copyright (c) 2010-2013 by Daniel Stenberg +Copyright 2017 The OpenSSL Project Authors +Copyright (c) 1998-2000 The OpenSSL Project +Copyright (c) 1998-2001 The OpenSSL Project +Copyright (c) 1998-2002 The OpenSSL Project +Copyright (c) 1998-2003 The OpenSSL Project +Copyright (c) 1998-2004 The OpenSSL Project +Copyright (c) 1998-2005 The OpenSSL Project +Copyright (c) 1998-2006 The OpenSSL Project +Copyright (c) 1998-2007 The OpenSSL Project +Copyright (c) 1998-2011 The OpenSSL Project +Copyright (c) 1999-2002 The OpenSSL Project +Copyright (c) 1999-2003 The OpenSSL Project +Copyright (c) 1999-2004 The OpenSSL Project +Copyright (c) 1999-2005 The OpenSSL Project +Copyright (c) 1999-2007 The OpenSSL Project +Copyright (c) 1999-2008 The OpenSSL Project +Copyright (c) 2000-2002 The OpenSSL Project +Copyright (c) 2000-2003 The OpenSSL Project +Copyright (c) 2000-2005 The OpenSSL Project +Copyright (c) 2001-2011 The OpenSSL Project +Copyright (c) 2002-2006 The OpenSSL Project +Copyright (c) 2005, 2013 by Dominick Meglio +Copyright (c) 2006, Network Resonance, Inc. +Copyright (c) 2006,2007 The OpenSSL Project +Copyright (c) 2004 - 2011 by Daniel Stenberg +Copyright (c) 2004 - 2012 by Daniel Stenberg +Copyright (c) 2004 - 2013 by Daniel Stenberg +Copyright (c) 2009 - 2013 by Daniel Stenberg +Copyright (c) 2009 - 2021 by Daniel Stenberg +Copyright (c) 2017 - 2018 by Christian Ammer +Copyright Amazon.com, Inc. or its affiliates +Copyright (c) 2005, 2012, 2018, 2023 Mark Adler +Copyright (c) 2007, 2008, 2012, 2018 Mark Adler +Copyright 1995-2016 The OpenSSL Project Authors +Copyright 1995-2017 The OpenSSL Project Authors +Copyright 2000-2016 The OpenSSL Project Authors +Copyright 2006-2017 The OpenSSL Project Authors +Copyright 2006-2019 The OpenSSL Project Authors +Copyright 2006-2021 The OpenSSL Project Authors +Copyright 2007-2016 The OpenSSL Project Authors +Copyright 2012-2016 The OpenSSL Project Authors +Copyright 2013-2016 The OpenSSL Project Authors +Copyright 2014-2016 The OpenSSL Project Authors +Copyright 2014-2020 The OpenSSL Project Authors +Copyright 2015-2016 The OpenSSL Project Authors +Copyright (c) 2010 Jeremy Lal +Copyright (c) 2012 Marko Kreen +Copyright (c) 2018 The Android Open Source Project +Copyright 2020 by +Copyright 1995-2023 Jean-loup Gailly and Mark Adler +Copyright (c) 1995-2006, 2011, 2016 Jean-loup Gailly +Copyright (c) 1995-2016 Jean-loup Gailly, Mark Adler +Copyright (c) 1995-2022 Jean-loup Gailly, Mark Adler +Copyright (c) 1995, 1996, 1997, and 1998 WIDE Project +Copyright (c) 2003, 2005, 2008, 2010, 2012 Mark Adler +Copyright (c) 2004, 2008, 2012, 2016, 2019 Mark Adler +Copyright (c) 1995-1997 Eric Young (eay@cryptsoft.com) +Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) +(c) 2006 Entrust, Inc. Label Entrust Root Certification +Copyright (c) 1995-2023 Jean-loup Gailly and Mark Adler +Copyright (c) 1996,1999 by Internet Software Consortium +Copyright (c) 1996-1999 by Internet Software Consortium +Copyright (c) 2004 by Internet Systems Consortium, Inc. +Copyright (c) 2009 by Jakub Hrozek +Copyright (c) 2022, Robert Nagy +(c) MaxCasefoldGroup raise unicode.Error 'casefold group +Copyright (c) 2012 by Gilles Chehade +Copyright (c) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly +Copyright (c) 2017 by John Schember +Copyright (c) 2018 by John Schember +Copyright 1998 by the Massachusetts Institute of Technology +Copyright 2000 by the Massachusetts Institute of Technology +Copyright (c) 2009-2010 Mathias Svensson http://result42.com +Copyright (c) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler +Copyright 1998, 2011 by the Massachusetts Institute of Technology +Copyright (c) 1987-2001 The Regents of the University of California +Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll +Copyright (c) 1997 Christian Michelsen Research AS Advanced Computing +Copyright (c) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler +Copyright 1998, 2011, 2013 by the Massachusetts Institute of Technology +Copyright (c) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson +Copyright (c) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant +(c) 1999 Entrust.net Limited Label Entrust.net Premium 2048 Secure Server CA Serial +Copyright (c) 1998-2010 Gilles Vollant (minizip) http://www.winimage.com/zLibDll/minizip.html + +Apache-2.0 AND BSD-3-Clause AND MPL-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +json5 0.10.0 - Apache-2.0 AND MIT + + +Copyright 2014 Dirk Pranke +Copyright 2014 Google Inc. +Copyright 2015 Google Inc. +Copyright 2017 Google Inc. +Copyright 2019 Google Inc. +Copyright (c) 2014 Milo Yip +Copyright (c) 2017 Wes McKinney +Copyright (c) Microsoft Corporation + +Apache-2.0 AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +types-python-dateutil 2.9.0.20241206 - Apache-2.0 AND MIT + + +Copyright (c) 2015 Jukka Lehtosalo and contributors + +Apache-2.0 AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +contextlib2 21.6.0 - Apache-2.0 AND Python-2.0 + + +copyright u'2021, Nick Coghlan +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Python Software Foundation + +Apache-2.0 AND Python-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +watchdog 6.0.0 - Apache-2.0 AND Python-2.0 + + +Copyright 2012-2014 Google, Inc. +Copyright 2012-2018 Google, Inc. +Copyright 2011-2012 Yesudeep Mangalapilly +Copyright 2014-2018 Thomas Amland & contributors +Copyright 2010-2011 Malthe Borch +copyright COPYRIGHT The version info for the project +Copyright 2018-2024 Mickael Schoentgen & contributors +Copyright 2011-2012 Yesudeep Mangalapilly +Copyright 2011-2024 Yesudeep Mangalapilly, Mickael Schoentgen & contributors + +Apache-2.0 AND Python-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +sniffio 1.3.1 - Apache-2.0 OR (Apache-2.0 AND MIT) + + + +Apache-2.0 OR (Apache-2.0 AND MIT) + +--------------------------------------------------------- + +--------------------------------------------------------- + +cryptography 44.0.0 - Apache-2.0 OR BSD-3-Clause OR (Apache-2.0 AND BSD-3-Clause) + + +Copyright 2013-2024 +Copyright 2015 The Go Authors +Copyright (c) Individual contributors +Copyright (c) 2005-2020, NumPy Developers +copyright 2013-2024, Individual Contributors + +Apache-2.0 OR BSD-3-Clause OR (Apache-2.0 AND BSD-3-Clause) + +--------------------------------------------------------- + +--------------------------------------------------------- + +isodate 0.7.2 - BSD-2-Clause + + +Copyright (c) 2009, Gerhard Weis +Copyright (c) 2009-2018, Gerhard Weis and contributors +Copyright (c) 2021, Hugo van Kemenade and contributors + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +nest-asyncio 1.6.0 - BSD-2-Clause + + +Copyright (c) 2018-2020, Ewald de Wit + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pygments 2.19.1 - BSD-2-Clause + + + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +sympy 1.13.3 - BSD-2-Clause + + +(c) A. B +(c) A . B +(c) Fix Qasm +Dagger (c), True +Copyright 2016, latex2sympy +copyright SymPy Development +Copyright (c) 2009-2023, PyDy +Copyright (c) 2014 Matthew Rocklin +copyright 2015, SymPy Development Team +Copyright (c) 2006-2014 SymPy developers +Copyright (c) 2001, 2002 Vasil Yaroshevich +Copyright (c) 2006-2023 SymPy Development Team +Copyright (c) 2008 Jens Rasch +Copyright (c) 2006-2018 SymPy Development Team, 2013-2023 Sergey B Kirpichev +(c) Copyright 2000-2003 Symbolic Computation Laboratory, University of Western Ontario, London, Canada N6A + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +terminado 0.18.1 - BSD-2-Clause + + +copyright 2014, Thomas Kluyver +Copyright (c) Jupyter Development Team +Copyright (c) 2012-2013, Christopher Jeffrey +Copyright (c) 2014-, Jupyter development team +Copyright (c) 2014, Ramalingam Saravanan + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +webencodings 0.5.1 - BSD-2-Clause + + +Copyright 2012 by Simon Sapin + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +wrapt 1.17.0 - BSD-2-Clause + + +Copyright (c) 2013-2023, Graham Dumpleton + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +babel 2.16.0 - BSD-2-Clause AND BSD-3-Clause + + +copr Coptegr Crir +copyright in Babel +copr Kopteschr Tsch +copr Koptschr Creer +copr Koptyskr Creer +copr Koptischr Creer +Foobar. Copyright (c) +Copyright 2013 by Lennart +Copyright (c) 2006 Ufsoft.org +Copyright of Edgewall Software +copyright 2024, The Babel Team +Copyright (c) 2007 FooBar, Inc. +Copyright (c) 2007 ORGANIZATION +Copyright (c) 2007 THE PACKAGE'S +Copyright (c) (year)d Foo Company +Copyright (c) 1990-2003 Foo Company +Copyright (c) 1990-2003 ORGANIZATION +Copyright (c) 2010 by Armin Ronacher +Copyright (c) 2004-2024 Unicode, Inc. +Copyright (c) 2013-2024 by the Babel Team +copyright (c) 2013-2024 by the Babel Team +copyright (c) 2015-2024 by the Babel Team +Copyright (c) time.strftime Y FooBar, Inc. +Copyright (c) 2007 - 2011 by Edgewall Software +Copyright 2010 by Armin Ronacher. :license Flask Design +Copyright (c) 2007-2011 Edgewall Software, 2013-2024 the Babel team +POT for my really cool PROJECT project. Copyright (c) 1990-2003 ORGANIZATION + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +click 8.1.8 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2014 Pallets +copyright 2014 Pallets +Copyright 2001-2006 Gregory P. Ward +Copyright 2002-2006 Python Software Foundation + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +comm 0.2.2 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2022, Jupyter +Copyright (c) IPython Development Team + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +cycler 0.12.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2015, matplotlib project + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +decorator 5.1.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2005-2018, Michele Simionato +Copyright (c) 2005-2020, Michele Simionato +Copyright (c) 2005-2021, Michele Simionato + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +dill 0.3.9 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2011 by science+computing +copyright d, The Uncertainty Quantification Foundation +Copyright (c) 2008-2010 Marius Gedminas +Copyright (c) 2009 PiCloud, Inc. +Copyright (c) 2010 Stefano Rivera +Copyright (c) 2004-2016 California Institute of Technology +Copyright (c) 2008-2015 California Institute of Technology +Copyright (c) 2008-2016 California Institute of Technology +Copyright (c) 2012, Regents of the University of California +Copyright (c) 2024 The Uncertainty Quantification Foundation +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation +Copyright (c) 2018-2024 The Uncertainty Quantification Foundation +Copyright (c) 2019-2024 The Uncertainty Quantification Foundation +Copyright (c) 2021-2024 The Uncertainty Quantification Foundation +Copyright (c) 2022-2024 The Uncertainty Quantification Foundation +Copyright (c) 2023-2024 The Uncertainty Quantification Foundation + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +fastjsonschema 2.21.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2018, Michal Horejsek + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +h5py 3.12.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2009 Darren Dale +Copyright (c) 2015, Daniel Greenfeld +Copyright 2006-2007 by The HDF Group +Copyright (c) 2009-2022, Marcel Hellkamp +Copyright (c) 2006-2008 Alexander Chemeris +Copyright (c) 2002, 2003, 2004 Francesc Altet +Copyright 2001-2013 Python Software Foundation +Copyright (c) 2005, 2006, 2007 Carabos Coop. V. +copyright 2014, Andrew Collette and contributors +Copyright (c) 2008 Andrew Collette http://h5py.org +Copyright (c) 2009 Andrew Collette http://h5py.org +Copyright (c) 2008 Andrew Collette and contributors +Copyright 2008-2013 Andrew Collette and contributors +Copyright 2008-2019 Andrew Collette and contributors +Copyright 2008-2020 Andrew Collette and contributors +Copyright (c) 2008-2009 Andrew Collette http://h5py.org +Copyright (c) 2000-2007 Marc Alexander Lehmann +Copyright (c) 2000-2008 Marc Alexander Lehmann +Copyright 1998-2006 by the Board of Trustees of the University of Illinois +Copyright (c) 2008-2013 Andrew Collette and contributors http://www.h5py.org + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +idna 3.10 - BSD-2-Clause AND BSD-3-Clause + + +(c) 2019 Unicode(r), Inc. +Copyright (c) 2013-2024, Kim Davies and contributors + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +ipykernel 6.29.5 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) IPython Development Team +copyright 2015, IPython Development Team +Copyright (c) 2015, IPython Development Team +Copyright (c) 2012 The IPython Development Team +Copyright (c) 2008-2011 The IPython Development Team +Copyright (c) 2010-2011 The IPython Development Team + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +ipywidgets 8.1.5 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) Vidar Tonaas Fauske +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +Copyright (c) 2015 Project Jupyter Contributors + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +jinja2 3.1.5 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2007 Pallets +copyright 2007 Pallets +(c) Copyright 2008 by http://domain.invalid/> + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +joblib 1.4.2 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2009 Brian Quinlan +Copyright 2017, Thomas Moreau +Copyright 2010, Gael Varoquaux +Copyright 2012, Olivier Grisel +(c) 2008-2021, Joblib developers +Copyright (c) 2008 Gael Varoquaux +Copyright (c) 2009 Gael Varoquaux +Copyright (c) 2010 Gael Varoquaux +Copyright (c) 2008-2021, The joblib +Copyright (c) 2010-2011 Gael Varoquaux +Copyright 2007-2022 by the Sphinx team +copyright 2008-2021, Joblib developers +(c) JS Foundation and other contributors +Copyright JS Foundation and other contributors +copyright https://docs.python.org/3/copyright.html +Copyright (c) 2012, Regents of the University of California +Copyright (c) 2012-now, CloudPickle developers and contributors +Copyright (c) 2009 PiCloud, Inc. +(c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors Underscore + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +jsonlines 4.0.0 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2016, wouter bolsterlee + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +jsonpointer 3.0.0 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2011 Stefan Kogl + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyter-lsp 2.2.5 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) Microsoft +Copyright (c) 2016 Chad Smith +Copyright 2018 Palantir Technologies, Inc. +Copyright (c) 2022, jupyter-lsp contributors +Copyright (c) 2012-2019 David Anthoff, Zac Nugent and other contributors (https://github.com/JuliaLang/Julia.tmbundle/contributors, https://github.com/julia-vscode/julia-vscode/contributors) + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +kiwisolver 1.4.8 - BSD-2-Clause AND BSD-3-Clause + + +copyright 2018-2024, Nucleic team +Copyright (c) 2001. Addison-Wesley +Copyright (c) 2019-2021 Martin Ankerl +Copyright (c) 2001 by Andrei Alexandrescu +Copyright (c) 2013-2024, Nucleic Development Team +Copyright (c) 2019-2024, Nucleic Development Team +Copyright (c) 2020-2024, Nucleic Development Team +Copyright (c) 2021-2024, Nucleic Development Team +Copyright (c) 2023-2024, Nucleic Development Team +Copyright (c) 2014-2024,, Nucleic Development Team +Copyright 2000, 2004, 2005Adobe Systems Incorporated +Copyright (c) 2019-2021 Martin Ankerl + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +markdown 3.7 - BSD-2-Clause AND BSD-3-Clause + + +(c) 2004 Foo Corporation +Copyright 2004 Manfred Stienstra +Copyright The Python Markdown Project +Copyright (c) 1999-2007 by Fredrik Lundh +Copyright 2004, 2005, 2006 Yuri Takhteyev +Copyright 2007-2019 The Python Markdown Project +Copyright 2007-2021 The Python Markdown Project +Copyright 2007-2022 The Python Markdown Project +Copyright 2007-2023 The Python Markdown Project +Copyright 2007-2024 The Python Markdown Project +Copyright 2008-2014 The Python Markdown Project +Copyright 2008-2024 The Python Markdown Project +Copyright 2011-2014 The Python Markdown Project +Copyright 2013-2014 The Python Markdown Project +Copyright 2015-2018 The Python Markdown Project +Copyright 2007, 2008 The Python Markdown Project +Copyright 2008 Jack Miller (https://codezen.org/) +Copyright Waylan Limberg (http://achinghead.com/) +The Python-Markdown Project Copyright (c) 2010-2023 +Copyright 2008 Waylan Limberg (http://achinghead.com) +Copyright 2009 Waylan Limberg (http://achinghead.com) +Copyright 2011 Waylan Limberg (http://achinghead.com) +Copyright 2011 Waylan Limberg (http://achinghead.com/) +Copyright Tiago Serafim (https://www.tiagoserafim.com/) +Copyright 2011 Brian Neal (https://deathofagremmie.com/) +Copyright 2007-2008 Waylan Limberg (http://achinghead.com) +Copyright (c) 2004, 2007 Chad Miller +Copyright 2006-2008 Waylan Limberg (http://achinghead.com/) +Copyright 2007-2008 Waylan Limberg (http://achinghead.com/) +Copyright (c) 2003 John Gruber +Copyright 2007-2008 Waylan Limberg (http://achinghead.com/) and Seemant Kulleen (http://www.kulleen.org/) + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +markupsafe 3.0.2 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2010 Pallets +copyright 2010 Pallets + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +matplotlib-inline 0.1.7 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) IPython Development Team +Copyright (c) 2019-2022, IPython Development Team + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +mpmath 1.3.0 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2013 Timo Hartmann (thartmann15 at gmail.com) +Copyright (c) 2005-2021 Fredrik Johansson and mpmath contributors + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +multiprocess 0.70.17 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2006-2008, R Oudkerk +Copyright (c) 2008-2016 California Institute of Technology +Copyright (c) 2024 The Uncertainty Quantification Foundation +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation +Copyright (c) 2018-2024 The Uncertainty Quantification Foundation +Copyright (c) 2022-2024 The Uncertainty Quantification Foundation + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +nbformat 5.10.4 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +copyright 2015, Jupyter Development Team +Copyright (c) 2015-, Jupyter Development Team +Copyright (c) 2013 The IPython Development Team +Copyright (c) 2001-2015, IPython Development Team +Copyright (c) 2008-2011 The IPython Development Team + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +networkx 3.4.2 - BSD-2-Clause AND BSD-3-Clause + + +(c) Fcc Bcc +Copyright (c) 2015 - Thomson Licensing, SAS +Copyright 2011 Alex Levenson +Copyright 2011 Reya Group +Copyright 2011 Diederik van Liere +Copyright (c) 2004-2024 NetworkX Developers Aric Hagberg Dan Schult +Copyright (c) 2004-2024, NetworkX Developers Aric Hagberg Dan Schult + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +numpy 1.26.4 - BSD-2-Clause AND BSD-3-Clause + + +(c) Jussi Pakkanen +Copyright (c) 2017 +(c) Convert Chebyshev +(c) Multiply a Hermite +(c) Multiply a Laguerre +(c) Multiply a Legendre +(c) Multiply a Chebyshev +Copyright (c) 2010 - 2019 +Copyright (c) 2018, Meson +Copyright (c) 2022, Intel +Copyright 2019 Red Hat, Inc. +Copyright Absoft Corporation +(c), True, True, False, False +Copyright 2002 Pearu Peterson +Copyright 2014 Jussi Pakkanen +(c), False, False, False, True +(c), False, False, True, False +Copyright (c) 2012 Google Inc. +Copyright (c) 2017 Dylan Baker +Copyright 2017 Niklas Claesson +Copyright (c) 2014 Ryan Juckett +Copyright (c) 2013 THE PACKAGE'S +Copyright 2011 by Enthought, Inc +Copyright 2020 Intel Corporation +Copyright 2022 Intel Corporation +Copyright (c) 2011 Enthought, Inc +Copyright (c) 2015 Pauli Virtanen +Copyright (c) 2019 Kevin Sheppard +Copyright 1999 2011 Pearu Peterson +Copyright 2001-2005 Pearu Peterson +Copyright (c) 2019 NumPy Developers +Copyright (c) 2007 Cybozu Labs, Inc. +Copyright (c) 2017 Intel Corporation +Copyright (c) 2018 Intel Corporation +Copyright (c) 2020 Intel Corporation +Copyright (c) 2021 Intel Corporation +Copyright (c) 2022 Intel Corporation +Copyright (c) 2023 Intel Corporation +Copyright (c) 2023, NumPy Developers +Copyright (c) 2011 by Enthought, Inc. +Copyright (c) 2014 Mathjax Consortium +Copyright (c) 2015 Melissa E. O'Neill +Copyright (c) 2015-2017 Martin Hensel +Copyright (c) 2017 Arseny Maslennikov +Copyright (c) 2018 Melissa E. O'Neill +Copyright 1996-2023 Intel Corporation +copyright 2008-2022, NumPy Developers +copyright 2017-2018, NumPy Developers +Copyright 2007-2018 by the Sphinx team +Copyright (c) 2021 The Meson Developers +Copyright 2011 present NumPy Developers +Copyright (c) 2021 Microsoft Corporation +Copyright 2010-2012, D. E. Shaw Research +Copyright (c) 2005-2015, NumPy Developers +Copyright (c) 2005-2017, NumPy Developers +Copyright (c) 2005-2021, NumPy Developers +Copyright (c) 2005-2023, NumPy Developers +Copyright (c) 2017-2018 Intel Corporation +Copyright (c) 2020-2021 Intel Corporation +Copyright (c) 2020-2023 Intel Corporation +Copyright (c) 2021-2022 Intel Corporation +Copyright (c) 2022-2023 Intel Corporation +Copyright 2013 The Meson development team +Copyright 2015 The Meson development team +Copyright 2016 The Meson development team +Copyright 2017 The Meson development team +Copyright 2018 The Meson development team +Copyright 2019 The Meson development team +Copyright 2019 The meson development team +Copyright 2020 The Meson development team +Copyright 2021 The Meson development team +Copyright 2022 The Meson development team +Copyright 2012-2020 Meson development team +Copyright (c) 1993 by Sun Microsystems, Inc. +Copyright (c) 2011-2014, The OpenBLAS Project +Copyright (c) 2009-2017 The MathJax Consortium +Copyright (c) 2010-2017 The MathJax Consortium +Copyright (c) 2011-2015 The MathJax Consortium +Copyright (c) 2011-2017 The MathJax Consortium +Copyright (c) 2013-2017 The MathJax Consortium +Copyright (c) 2014-2017 The MathJax Consortium +Copyright (c) 2015-2017 The MathJax Consortium +Copyright (c) 2016-2017 The MathJax Consortium +Copyright 2012-2016 The Meson development team +Copyright 2012-2017 The Meson development team +Copyright 2012-2019 The Meson development team +Copyright 2012-2020 The Meson development team +Copyright 2012-2021 The Meson development team +Copyright 2012-2022 The Meson development team +Copyright 2012-2023 The Meson development team +Copyright 2013-2014 The Meson development team +Copyright 2013-2016 The Meson development team +Copyright 2013-2017 The Meson development team +Copyright 2013-2018 The Meson development team +Copyright 2013-2019 The Meson development team +Copyright 2013-2020 The Meson development team +Copyright 2013-2021 The Meson development team +Copyright 2013-2023 The Meson development team +Copyright 2014-2016 The Meson development team +Copyright 2014-2017 The Meson development team +Copyright 2014-2019 The Meson development team +Copyright 2014-2021 The Meson development team +Copyright 2015-2016 The Meson development team +Copyright 2015-2022 The Meson development team +Copyright 2016-2017 The Meson development team +Copyright 2016-2018 The Meson development team +Copyright 2016-2021 The Meson development team +Copyright 2016-2022 The Meson development team +Copyright 2017-2021 The Meson development team +Copyright 2019-2022 The meson development team +Copyright 2021 The Meson development team from +Copyright 2022 Mark Bolhuis +Copyright (c) 2008 Ian Bicking and Contributors +Copyright 2017, 2019 The Meson development team +Copyright (c) 2005-2018 NVIDIA Corporation Built +Copyright (c) 2010 The Android Open Source Project +Copyright (c) 2021 2022, Scientific Python project +Copyright 2015 Robert Kern +Copyright (c) 2002-2017 Free Software Foundation, Inc. +Copyright (c) 2010-2019 Free Software Foundation, Inc. +Copyright 2014 Melissa O'Neill +Copyright (c) Donald Stufft and individual contributors +Copyright (c) 2007, 2011 David Schultz +Copyright (c) 2006-2013 The University of Colorado Denver +Copyright Absoft Corporation 1994-2002 Absoft Pro FORTRAN +Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu +Copyright (c) 2003-2005, Jean-Sebastien Roy (js@jeannot.org) +Copyright (c) 2000-2013 The University of California Berkeley +Copyright (c) 2019 Takao Fujiwara +Copyright (c) 2013 Gabriele Svelto +Copyright (c) 2016 - 2019 Kim Walisch, +Copyright (c) 2021 Intel Corporation project 'existing project +Copyright 2016-2021 Matthew Brett, Isuru Fernando, Matti Picus +Copyright (c) 2015-2021 Matthias Klumpp +Copyright (c) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura +Copyright (c) 2004-2018 Max-Planck-Society author Martin Reinecke +Copyright (c) 2012 Stephen Montgomery-Smith +Copyright 2021 The Meson development team SPDX-license-identifier +Copyright (c) 2004, 2006 The Linux Foundation and its contributors +Copyright 1999, 2000, 2001 Regents of the University of California +Copyright (c) 2007 Free Software Foundation, Inc. +Copyright (c) 2009 Free Software Foundation, Inc. +Copyright (c) 2006, University of Georgia and Pierre G.F. Gerard-Marchant +Copyright Absoft Corporation 1994-1998 mV2 Cray Research, Inc. 1994-1996 CF90 +Copyright 2011 present NumPy Developers. https://numpy.org/doc/stable/f2py/index.html +Copyright (c) 2010 by Mark Wiebe (mwwiebe@gmail.com) The University of British Columbia +Copyright (c) 2011 by Mark Wiebe (mwwiebe@gmail.com) The University of British Columbia +Copyright (c) 2010-2011 by Mark Wiebe (mwwiebe@gmail.com) The University of British Columbia +Copyright (c) 2009-2019 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors +Copyright (c) 1992-2013 The University of Tennessee and The University of Tennessee Research Foundation +Copyright (c) 2022 Intel Corporation SPDX-License-Identifier BSD-3-Clause Authors Raghuveer Devulapalli +Copyright (c) 2022 Intel Corporation SPDX-License-Identifier BSD-3-Clause Authors Liu Zhuan Tang Xi +Copyright (c) 2021 Serge Sans Paille SPDX-License-Identifier BSD-3-Clause Authors Raghuveer Devulapalli Serge Sans Paille +Copyright (c) 2021 Serge Sans Paille SPDX-License-Identifier BSD-3-Clause Authors Raghuveer Devulapalli Serge Sans Paille Liu Zhuan + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +omegaconf 2.3.0 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2018, Omry Yadan + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +pandas 2.2.3 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2009', join +Copyright (c) 1994 David Burren +Copyright (c) 2014, Al Sweigart +Copyright (c) 2011 Valentin Ochs +Copyright (c) 2017 Anthony Sottile +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2015-2019 Jared Hobbs +Copyright (c) 2017-2018 Arm Limited +Copyright (c) 1999-2019, Arm Limited +Copyright (c) 2002 Michael Ringgaard +Copyright (c) 2003-2011 David Schultz +Copyright (c) 2008 Stephen L. Moshier +Copyright (c) 2010-2019 Keith Goodman +Copyright (c) 2011 by Enthought, Inc. +Copyright 2017- dateutil contributors +Copyright (c) 2003-2009 Bruce D. Evans +Copyright (c) 2001-2008 Ville Laurikari +Copyright (c) 2003-2009 Steven G. Kargl +Copyright (c) 1993,2004 Sun Microsystems +Copyright (c) 2012, Lambda Foundry, Inc. +Copyright (c) 2014, Electronic Arts Inc. +Copyright (c) 2019 Bottleneck Developers +Copyright (c) 1994 Sun Microsystems, Inc. +Copyright (c) 2005-2011, NumPy Developers +Copyright (c) 2005-2023, NumPy Developers +Copyright (c) 2012, PyData Development Team +Copyright (c) 2015- - dateutil contributors +Copyright (c) 2016, PyData Development Team +Copyright (c) 2020, PyData Development Team +Copyright (c) 2023, PyData Development Team +Copyright (c) 2011-2012, Lambda Foundry, Inc. +Copyright 2017- Paul Ganssle +Copyright (c) 2011-2012, PyData Development Team +Copyright (c) 2011-2023, Open source contributors +Copyright (c) 2008 The Android Open Source Project +Copyright (c) 2008-2011 AQR Capital Management, LLC +Copyright (c) 2015- - Paul Ganssle +Copyright (c) 2007 Nick Galbreath nickg at modp dot com +Copyright (c) Donald Stufft and individual contributors +Copyright (c) 2014-2016 - Yaron de Leeuw +Copyright (c) 2019 Hadley Wickham RStudio and Evan Miller +Copyright (c) 2008- Attractive Chaos +Copyright 2005, 2006, 2007 Nick Galbreath nickg at modp dot com +Copyright (c) 2003-2011 - Gustavo Niemeyer +Copyright (c) 1988-1993 The Regents of the University of California +Copyright (c) 2011-2013, ESN Social Software AB and Jonas Tarnstrom +Copyright (c) 2012-2014 - Tomi Pievilainen +Copyright (c) 1995-2001 Corporation for National Research Initiatives +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands +Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team +copyrighted by the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState Corporation +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +pandocfilters 1.5.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2013 John MacFarlane +Copyright (c) 2013, John MacFarlane + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +portalocker 2.10.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2022 Rick van Hattem +Copyright (c) 2010 Kenneth Reitz +Copyright 2010 by Armin Ronacher +Copyright (c) 2012 Rick van Hattem +Copyright (c) 2010 by Armin Ronacher +Copyright 2010 by Armin Ronacher. :license Flask Design + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +pox 0.3.5 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2010 Gael Varoquaux +copyright d, The Uncertainty Quantification Foundation +Copyright (c) 1997-2016 California Institute of Technology +Copyright (c) 2004-2016 California Institute of Technology +Copyright (c) 2013-2016 California Institute of Technology +Copyright (c) 2024 The Uncertainty Quantification Foundation +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation +Copyright (c) 2018-2024 The Uncertainty Quantification Foundation +Copyright (c) 2022-2024 The Uncertainty Quantification Foundation + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +ppft 1.7.6.9 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2005-2012 Vitalii Vanovschi +Copyright (c) 2005-2012, Vitalii Vanovschi +copyright d, The Uncertainty Quantification Foundation +Copyright (c) 2012-2016 California Institute of Technology +Copyright (c) 2015-2016 California Institute of Technology +Copyright (c) 2024 The Uncertainty Quantification Foundation +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation +Copyright (c) 2018-2024 The Uncertainty Quantification Foundation +Copyright (c) 2022-2024 The Uncertainty Quantification Foundation + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +prompt-toolkit 3.0.48 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2014, Jonathan Slenders + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +pycparser 2.22 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2008-2022, Eli Bendersky +Copyright (c) 2001-2017 David M. Beazley (Dabeaz LLC) +David Beazley (http://www.dabeaz.com) Copyright (c) 2017 + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +python-dotenv 1.0.1 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2014, Saurabh Kumar + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +pyzmq 26.2.0 - BSD-2-Clause AND BSD-3-Clause + + +(c) PyZMQ Developers +(c) iMatix Corporation +Copyright 2009 Facebook +copyright of Boris Feld +copyright of Chris Laws +Copyright 2009, Facebook +copyright of Frank Wiles +copyright of Julian Taylor +copyright of Thomas Kluyver +Copyright 2010, Justin Riley +copyright of Brian E. Granger +copyright of Min Ragan-Kelley +Copyright (c) PyZMQ Developers +Copyright (c) 2010 Justin Riley +Copyright (c) 2010 Brian Granger +Copyright (c) 2010 Lisandro Dalcin +Copyright (c) Stef van der Struijk +Copyright (c) 2010 The IPython Team +Copyright (c) 2022 PyZMQ Developers +Copyright 2010, Andrew Gwozdziewycz +Copyright (c) 2011- PyZMQ Developers +Copyright (c) 2011-2012 Travis Cline +Copyright (c) PyZMQ Development Team +Copyright (c) 2012 Godefroid Chapelle +Copyright (c) 2007-2010 iMatix Corporation +Copyright (c) 2010 Brian Granger, Fernando Perez +Copyright (c) 2010-2011 IPython Development Team +Copyright 2010, Nikolaus Rath +Copyright (c) 2010 Brian Granger, Min Ragan-Kelley +copyright Brian E. Granger & Min Ragan-Kelley. OMQ +Copyright (c) 2010 Brian E. Granger & Min Ragan-Kelley +Copyright (c) 2010-2012 Brian Granger, Min Ragan-Kelley +Copyright 2010, Brian E. Granger 2010, Min Ragan-Kelley +Copyright (c) 2009-2012, Brian Granger, Min Ragan-Kelley +Copyright (c) 2017-2019 SUSE LINUX GmbH, Nuernberg, Germany +Copyright (c) 2003-2007 Robey Pointer +Copyright 2007-2010, iMatix Corporation 2013 Brian Granger, Min Ragan-Kelley +Copyright 2010-2011, Miguel Landaeta 2011-2014, Julian Taylor +Copyright 2003-2007, Robey Pointer , 2010-2011, IPython Development Team +Copyright 2010-2012, Brian Granger 2010-2013, Min Ragan-Kelley 2013 Felipe Cruz 2014 PyZMQ Developers +Copyright 2010-2011, Brian E. Granger 2010, Andrew Gwozdziewycz 2010, Fernando Perez 2011, 2013, Min Ragan-Kelley + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +seaborn 0.13.2 - BSD-2-Clause AND BSD-3-Clause + + +copyright f'2012- time.strftime +Copyright (c) 2013 Eddy Petrisor +Copyright (c) 2012 Alexei Boronine +Copyright 2004-2005 by Enthought, Inc. +Copyright (c) 2012-2023, Michael L. Waskom +Copyright (c) 2010 ActiveState Software Inc. +Copyright (c) 2005-2010 ActiveState Software Inc. +Copyright , https://mwaskom.github.io/' Michael Waskom +Copyright (c) Donald Stufft and individual contributors +Copyright (c) 2001-2002 Enthought, Inc. 2003-2019, SciPy Developers +Copyright (c) 2008 Stefan van der Walt , Pauli Virtanen +Copyright (c) 2015 Min RK, Florian Rathgeber, Michael McNeil Forbes 2019 Casper da Costa-Luis + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +send2trash 1.8.3 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2017 Virgil Dupras +Copyright (c) 2017, Virgil Dupras +Copyright 2013 Hardcoded Software (http://www.hardcoded.net) + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +shapely 2.0.6 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2008, by Attractive Chaos +Copyright (c) 2007, Sean C. Gillies. 2019, Casper van der Wel. 2007-2022, Shapely Contributors + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +spglib 2.5.0 - BSD-2-Clause AND BSD-3-Clause + + +copyright 2009, Atsushi Togo +Copyright (c) 2008 Atsushi Togo +Copyright (c) 2010 Atsushi Togo +Copyright (c) 2011 Atsushi Togo +Copyright (c) 2012 Atsushi Togo +Copyright (c) 2015 Atsushi Togo +Copyright (c) 2016 Atsushi Togo +Copyright (c) 2017 Atsushi Togo +Copyright (c) 2023 Atsushi Togo +Copyright (c) 2024, Spglib team +Copyright (c) 2005 Atsushi Togo togo.atsushi@gmail.com +Copyright (c) 2008 Atsushi Togo togo.atsushi@gmail.com + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +threadpoolctl 3.5.0 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2017, Intel Corporation +(Copyright (c) 2017, Intel Corporation) +Copyright (c) 2019, threadpoolctl contributors + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +tinycss2 1.4.0 - BSD-2-Clause AND BSD-3-Clause + + +copyright Simon Sapin and contributors +Copyright (c) 2013-2020, Simon Sapin and contributors + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +traitlets 5.14.3 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) Enthought, Inc. +Copyright (c) 2010 Doug Hellmann +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +Copyright 2007-2015 by the Sphinx team +copyright 2015, The IPython Development Team +Copyright (c) 2001-, IPython Development Team + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +uncertainties 3.2.2 - BSD-2-Clause AND BSD-3-Clause + + +(c) 2010-2024, Eric O. LEBIGOT +(c) 2009-2016 by Eric O. LEBIGOT +(c) 2009-2024 by Eric O. LEBIGOT +(c) 2010-2016 by Eric O. LEBIGOT +Copyright (c) 2010-2020, Eric O. LEBIGOT (EOL) +copyright f'2010- date.today .year, Eric O. LEBIGOT + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +werkzeug 3.1.3 - BSD-2-Clause AND BSD-3-Clause + + +Copyright 2007 Pallets +copyright 2007 Pallets + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +widgetsnbextension 4.0.13 - BSD-2-Clause AND BSD-3-Clause + + +Copyright (c) 2014 Dan Le +Copyright (c) 2014 Adam Krebs +Copyright (c) 2019 Leon Gersen +Copyright (c) Vidar Tonaas Fauske +Copyright (c) 2014-2017, PhosphorJS +Copyright (c) 2014-2019, PhosphorJS +Copyright (c) Microsoft Corporation +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +(c) 2015 Adam Krebs, Jimmy Yuen Ho Wong +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2015 Project Jupyter Contributors +Copyright (c) 2019 Project Jupyter Contributors +Copyright (c) 2014-2017, PhosphorJS Contributors +Copyright OpenJS Foundation and other contributors +Copyright (c) 2010-2015 Jeremy Ashkenas, DocumentCloud +(c) 2010-2019 Jeremy Ashkenas and DocumentCloud Backbone +(c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Backbone + +BSD-2-Clause AND BSD-3-Clause + +--------------------------------------------------------- + +--------------------------------------------------------- + +gitdb 4.0.12 - BSD-2-Clause AND BSD-3-Clause AND GPL-1.0-or-later + + +Copyright (c) 2010, 2011 Sebastian Thiel and contributors +Copyright (c) 2010, 2011 Sebastian Thiel (byronimo@gmail.com) and contributors + +BSD-2-Clause AND BSD-3-Clause AND GPL-1.0-or-later + +--------------------------------------------------------- + +--------------------------------------------------------- + +python-json-logger 3.2.1 - BSD-2-Clause AND BSD-3-Clause AND ISC AND Python-2.0 + + +Copyright (c) 2011, Zakaria Zajac +Copyright (c) 2021, Timothee Mazzucotelli + +BSD-2-Clause AND BSD-3-Clause AND ISC AND Python-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +antlr4-python3-runtime 4.9.3 - BSD-3-Clause + + +Copyright (c) 2012-2017 The ANTLR Project + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +contourpy 1.3.1 - BSD-3-Clause + + +copyright 2021-2024, ContourPy +Copyright (c) 2021-2024, ContourPy Developers + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +fsspec 2024.12.0 - BSD-3-Clause + + +copyright 2018, Martin Durant +Copyright (c) 2018, Martin Durant + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +gitpython 3.1.44 - BSD-3-Clause + + +Copyright (c) 2008, 2009 Michael Trier and contributors +Copyright (c) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors +Copyright (c) 2008, 2009 Michael Trier and contributors, 2010-2015 Sebastian Thiel + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +httpcore 1.0.7 - BSD-3-Clause + + +Copyright (c) 2020, Encode OSS Ltd (https://www.encode.io/) + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +httpx 0.28.1 - BSD-3-Clause + + +Copyright (c) 2019, Encode OSS Ltd (https://www.encode.io/) + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +ipython 8.31.0 - BSD-3-Clause + + +(c) Python and NumPy +Copyright (c) 2000 Thomas Heller +Copyright (c) 2010 Doug Hellmann +Portions (c) 2009 by Robert Kern +copyright 2007 by Armin Ronacher +Copyright (c) 2014, Jonathan Slenders +Copyright (c) 2015, Jonathan Slenders +Copyright (c) IPython Development Team +copyright The IPython Development Team +Copyright (c) 2012 IPython Development Team +Copyright (c) 2008, IPython Development Team +Copyright (c) 2011, IPython Development Team +Copyright (c) 2012, IPython Development Team +Copyright (c) 2008 Pauli Virtanen +Copyright (c) 2008 The IPython Development Team +Copyright (c) 2011 The IPython Development Team +Copyright (c) 2012 The IPython Development Team +Copyright (c) 2013 The IPython Development Team +Copyright (c) 2018 The IPython Development Team +Copyright (c) 2004-2021 Holger Krekel and others +Copyright (c) 2011, the IPython Development Team +Copyright (c) 2012, the IPython Development Team +Copyright (c) 2012- The IPython Development Team +Copyright (c) 2013, the IPython Development Team +Copyright (c) 2008-2011, IPython Development Team +Copyright (c) 2010-2011, IPython Development Team +Copyright (c) 2001 Janko Hauser +Copyright (c) 2001, Janko Hauser +Copyright (c) 2008-2011 The IPython Development Team +Copyright (c) 2008-2012 The IPython Development Team +Copyright (c) 2008-Present, IPython Development Team +Copyright (c) 2009-2011 The IPython Development Team +Copyright (c) 2010-2011 The IPython Development Team +Copyright (c) 2001 Nathaniel Gray +Copyright (c) 2001 Fernando Perez +Copyright (c) 2001, Nathaniel Gray +Copyright (c) 2005 Fernando Perez. +Copyright (c) 2016 The IPython Team +Copyright (c) 2001-2004 Fernando Perez +Copyright (c) 2001-2005 Fernando Perez +Copyright (c) 2001-2006 Fernando Perez +Copyright (c) 2005-2006 Fernando Perez +Copyright (c) 2001 Python Software Foundation, www.python.org +Copyright (c) 2001-2007 Fernando Perez. +Copyright (c) 2002-2006 Fernando Perez. +Copyright (c) 2005-2006 Fernando Perez. +Copyright (c) 2001, Fernando Perez +Copyright (c) 2005 Jorgen Stenarson +Copyright (c) 2001-2007, Fernando Perez +Copyright (c) 2005-2006 Fernando Perez. +Copyright (c) 2005 Fernando Perez Brian E Granger Benjamin Ragan-Kelley + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyter-client 8.6.3 - BSD-3-Clause + + +Copyright (c) 2011- PyZMQ Developers +Copyright (c) Jupyter Development Team +copyright 2015, Jupyter Development Team +Edits Copyright (c) 2010 The IPython Team +Copyright (c) The Jupyter Development Team +Copyright (c) 2015-, Jupyter Development Team +Copyright (c) 2010-2011 IPython Development Team +Copyright (c) 2001-2015, IPython Development Team +Copyright (c) 2003-2007 Robey Pointer + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyter-core 5.7.2 - BSD-3-Clause + + +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +copyright 2015, Jupyter Development Team +Copyright (c) 2015-, Jupyter Development Team + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyter-events 0.11.0 - BSD-3-Clause + + +copyright 2019, Project Jupyter +Copyright (c) Jupyter Development Team +Copyright (c) 2022-, Jupyter Development Team + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyter-server 2.15.0 - BSD-3-Clause + + +Copyright (c) 2017 ORGANIZATION +Copyright 2011-2019 Twitter, Inc. +Copyright (c) Jupyter Development Team +Copyright (c) 2015-, Jupyter Development Team +Copyright (c) 2001-2015, IPython Development Team +copyright 2020, Jupyter Team, https://jupyter.org + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyter-server-terminals 0.5.3 - BSD-3-Clause + + +Copyright (c) Jupyter Development Team +Copyright (c) 2021-, Jupyter Development Team +copyright 2021, Jupyter Team, https://jupyter.org + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +mistune 3.1.0 - BSD-3-Clause + + +(c) html' (c) AE D +copyright 2019, Hsiaoming Yang +Copyright (c) 2014, Hsiaoming Yang + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +nbclient 0.10.2 - BSD-3-Clause + + +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +Copyright (c) 2020-, Jupyter Development Team + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +nbconvert 7.16.5 - BSD-3-Clause + + +Copyright 2011-2016 Twitter, Inc. +Copyright (c) IPython Development Team +Copyright (c) Jupyter Development Team +copyright 2015- s, Jupyter Development Team +Copyright (c) 2017, Jupyter Development Team +Copyright (c) 2015-, Jupyter Development Team +Copyright (c) 2014 The IPython Development Team +Copyright (c) 2013, the IPython Development Team +Copyright (c) 2014-2017, PhosphorJS Contributors +Copyright (c) 2016, the IPython Development Team +Copyright (c) 2001-2015, IPython Development Team +Copyright (c) 2014-2016, Jupyter Development Team +Copyright (c) 2014-2017, Jupyter Development Team +(c) Ivan Sagalaev Adapted from GitHub + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +notebook 7.3.2 - BSD-3-Clause + + +(c) b.Vg +(c) Sindre Sorhus +copyright Koen Bok +(c) 2011 Gary Court +Copyright 2021 Mapbox +Copyright (c) 2017, Vega +Copyright (c) Felix Bohm +Copyright 2011 Gary Court +Copyright (c) 2017, Mapbox +Copyright (c) Font Awesome +Copyright 2019 Ron Buckton +Copyright 2020 Google LLC. +Copyright Gaetan Renaudeau +Copyright (c) 2015 Treasure +Copyright 2021 Mike Bostock +(c) 2017-2021 Joachim Wester +(c) 2017-2022 Joachim Wester +Copyright (c) 2014 Alex Bell +Copyright (c) 2017 Braintree +Copyright 2001 Robert Penner +Copyright 2015 Ricky Reusser +Copyright 2015, Mike Bostock +Copyright (c) 2011 Gary Court +Copyright (c) 2015 JD Ballard +Copyright (c) 2015 Josh Junon +Copyright (c) 2018 Chris Holt +Copyright (c) 2015 Dan Abramov +Copyright (c) 2015 David Clark +Copyright (c) 2023 Fadi Khadra +Copyright (c) 2014 Athan Reines +Copyright (c) 2015 Athan Reines +(c) http://www.w3.org/1999/xhtml +Copyright (c) 2013, Jason Davies +Copyright (c) 2014. Athan Reines +Copyright (c) 2015 Dmitry Ivanov +Copyright (c) 2015. Athan Reines +Copyright (c) 2017 Martin Hansen +Copyright 2010-2015 Mike Bostock +Copyright 2010-2020 Mike Bostock +Copyright 2010-2021 Mike Bostock +Copyright 2010-2022 Mike Bostock +Copyright 2010-2023 Mike Bostock +Copyright 2013-2021 Mike Bostock +Copyright 2015-2016 Mike Bostock +Copyright 2016-2021 Mike Bostock +(c) Cure53 and other contributors +Copyright (c) 2012 Heather Arthur +Copyright (c) 2013 James Halliday +Copyright (c) 2015 Shusaku Uesugi +Copyright 2018 Vladimir Agafonkin +Copyright (c) 2011 Fabrice Bellard +Copyright 2008-2012 Charles Karney +copyright (c) 2019 Denis Pushkarev +Copyright (c) 2016 Adele Delamarche +Copyright (c) 2017 Dmitry Soshnikov +Copyright (c) 2018 Tamino Martinius +Copyright (c) Microsoft Corporation +Copyright 2012-2019 Michael Bostock +(c) 2016-present Alexander Kuznetsov +Athan Reines. kgryte@gmail.com. 2014 +Athan Reines. kgryte@gmail.com. 2015 +Copyright (c) 2014-2015 Athan Reines +Copyright (c) 2017 Evgeny Poberezkin +Copyright (c) 2020 Evgeny Poberezkin +Copyright 2018-2021 Observable, Inc. +Copyright (c) 2015-2023 Martin Hensel +Copyright (c) 2015-present Evan Jacobs +Copyright (c) 2016 Alexander Kuznetsov +Copyright (c) 2020 by Marijn Haverbeke +Copyright (c) Jupyter Development Team +Copyright (c) 2014 The xterm.js authors +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2016 typestyle Permission +Copyright (c) 2021 @markedjs Permission +Copyright (c) Font Awesome Font Awesome +Copyright (c) 2016-present Sultan Tarimo +Copyright (c) 2014 - 2022 Knut Sveidqvist +Copyright (c) 2015-2021 Evgeny Poberezkin +Copyright (c) 2013-present, Facebook, Inc. +Copyright (c) 2014-present, Facebook, Inc. +Copyright (c) 2019 iVis@Bilkent Permission +(c) 2021-2023 Jupyter Notebook Contributors +Copyright (c) Guillaume Potier. Distributed +Copyright (c) 2014-2023, Lumino Contributors +Copyright (c) 2013, 2014, 2020 Joachim Wester +Copyright (c) 2014 The cheeriojs contributors +Copyright (c) 2015-, Jupyter Development Team +Copyright (c) 2018-present, iamkun Permission +Copyright (c) 2021 Kiel University and others +copyright JupyterLab development team. import +Copyright (c) 2015 Unshift.io, Arnout Kazemier +Copyright (c) 2017 Kiel University and others. +Copyright JS Foundation and other contributors +Copyright (c) 2013, 2014, 2015 P'unk Avenue LLC +Copyright (c) Facebook, Inc. and its affiliates +Copyright 2013 Andrey Sitnik +Copyright 2017 Andrey Sitnik +Copyright 2023 Dr.-Ing. Mario Heiderich, Cure53 +Copyright (c) 2014-2017, PhosphorJS Contributors +Copyright (c) 2014-2019, PhosphorJS Contributors +Copyright (c) 2001-2015, IPython Development Team +Copyright (c) 2012-2018 Aseem Kishore, and others +Copyright (c) 2016-2018, The Cytoscape Consortium +Copyright (c) 2016-2023, The Cytoscape Consortium +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Joyent, Inc. and other Node contributors +Copyright (c) 2012 Mathias Bynens +Copyright (c) 2013 Mathias Bynens +Copyright (c) 2015, Dan Flettre +Copyright (c) 2012 Kris Kowal +Copyright 2016 Interactive Data Lab and contributors +Copyright (c) 2013 Roman Shtylman +Copyright (c) 2013 Thaddee Tyl +Copyright (c) 2019 - present, iVis@Bilkent. Permission +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) +Copyright (c) 2014, 2016, 2017, 2019, 2021 Simon Lydell +Copyright (c) 2015 Titus Wormer +Copyright (c) 2016 Titus Wormer +Copyright (c) 2020 Titus Wormer +Copyright (c) 2021 Titus Wormer +Copyright (c) 2011 Heather Arthur +Copyright (c) 2012 Yusuke Suzuki +Copyright i-Vis Research Group, Bilkent University, 2007 +Copyright (c) 2004, John Gruber http://daringfireball.net +Copyright (c) 2019-present Fabio Spampinato, Andrew Maney +Copyright 2010, 2011, Chris Winberry +Copyright (c) 2011 Ariya Hidayat +Copyright (c) 2012 Ariya Hidayat +Copyright (c) 2013 Ariya Hidayat +Copyright (c) 2019 Kevin Jahns +Copyright (c) 2018-2022 TypeFox GmbH (http://www.typefox.io) +Copyright (c) 2010-2020 Robert Kieffer and other contributors +Copyright (c) 2011-2016 Heather Arthur +Copyright (c) 2012 Arpad Borsos +Copyright (c) 2015, University of Washington Interactive Data Lab +Copyright (c) 2016, University of Washington Interactive Data Lab +Copyright (c) Luke Edwards (lukeed.com) +Copyright (c) 2012 Joost-Wim Boekesteijn +Marked Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/) +Copyright (c) 2012 James Halliday, Josh Duff, and other contributors +Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) +Copyright (c) 2014-present Sebastian McKenzie and other contributors +Copyright (c) 2018 by Marijn Haverbeke and others +Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov +Copyright (c) 2015-2023, University of Washington Interactive Data Lab +Copyright (c) Julien Crouzet and Florian Schwingenschlogl. Distributed +Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/) +Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/) +Copyright (c) 2017-present Dmitry Soshnikov +Copyright jQuery Foundation and other contributors +Copyright OpenJS Foundation and other contributors +Copyright (c) 2018-2021 by Marijn Haverbeke and others +Copyright (c) 2016 by Marijn Haverbeke and others +Copyright (c) 2018 by Marijn Haverbeke and others +Copyright (c) 2020 by Marijn Haverbeke and others +Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright (c) 2018, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright (c) 2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com) +Copyright (c) 2018-2021 by Marijn Haverbeke and others +Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University +Copyright (c) 2014 - Kevin Jahns - Chair of Computer Science +Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) https://github.com/chjj/term.js +Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed) https://github.com/markedjs/marked +Copyright (c) 2011-2015 Jan Lehnardt & Marc Bachmann +copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +notebook-shim 0.2.4 - BSD-3-Clause + + +Copyright (c) 2022 Project Jupyter Contributors + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pathos 0.3.3 - BSD-3-Clause + + +(c) 1998-2004 +(c) 1998-2005 +Copyright (c) 2016 California Institute of Technology +copyright d, The Uncertainty Quantification Foundation +Copyright (c) 1997-2016 California Institute of Technology +Copyright (c) 2004-2016 California Institute of Technology +Copyright (c) 2008-2016 California Institute of Technology +Copyright (c) 2015-2016 California Institute of Technology +Copyright (c) 2024 The Uncertainty Quantification Foundation +Copyright (c) 2016-2024 The Uncertainty Quantification Foundation +Copyright (c) 2018-2024 The Uncertainty Quantification Foundation +Copyright (c) 2022-2024 The Uncertainty Quantification Foundation +Copyright (c) 2023-2024 The Uncertainty Quantification Foundation + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +protobuf 3.20.3 - BSD-3-Clause + + +Copyright 2007 Google Inc. +Copyright 2008 Google Inc. + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +psutil 6.1.1 - BSD-3-Clause + + +copyright 2009- s, s +Copyright (c) 2009, Giampaolo +Copyright (c) 2017, Arnon Yaari +Copyright (c) 2015, Ryo ONODERA. +Copyright (c) 2009 Giampaolo Rodola +Copyright (c) 2009, Giampaolo Rodola +Copyright 2007-2011 by the Sphinx team +Copyright (c) 2009, Giampaolo Rodola Jeff Tang +Copyright (c) 2009, Giampaolo Rodola karthikrev +Copyright (c) 2009, Jay Loden, Giampaolo Rodola +Copyright (c) 2009, Giampaolo Rodola Landry Breuil +Copyright (c) 2009, Giampaolo Rodola Himanshu Shekhar +Copyright (c) 2009, Giampaolo Rodola Oleksii Shevchuk +Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola +Copyright (c) 2009, Jay Loden, Giampaolo Rodola Landry Breuil (OpenBSD implementation), Ryo Onodera (NetBSD implementation) + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +scipy 1.15.0 - BSD-3-Clause + + +(c) 2024 +(c) B Whether +(c) 2003, C. Bond +Copyright 2021 The +(c) Date July, 1988 +Copyright 2018 Nico +Gamma (c) Gamma (c) +(c) Compute Hessian H +Csp spcreator (c) Dsp +Csp spcreator (c) Gsp +copyright Cephes Math +2020 Intel Corporation +2022 Intel Corporation +Copyright (c) 2021 The +Copyright John Maddock +Copyright Albert Steppi +Copyright Gautam Sewani +(c) 2011 import warnings +Copyright 2018 Ulf Adams +Copyright Catch2 Authors +copyright Xiaogang Zhang +copyrighted by Alan Genz +Copyright (c) 2024 HiGHS. +Copyright 2006 Johan Rade +Copyright 2012 K R Walker +Copyright Paul A. Bristow +copyright by Renee Touzin +Copyright 2018 Peter Dimov +Copyright 2020 Evan Miller +Copyright 2020 Peter Dimov +Copyright Evan Miller 2020 +Copyright Rene Rivera 2020 +Copyright Ryan Elandt 2023 +Copyright Thomas Mang 2010 +Copyright Thomas Mang 2011 +Copyright Thomas Mang 2012 +Copyright ohn Maddock 2012 +Csp self.spcreator (c) Dsp +copyright 2024, Consortium +(c) 2011 import numpy as np +(c) 2012 import numpy as np +(c) 2014 import numpy as np +Copyright 2000 by Alan Genz +Copyright 2006 John Maddock +Copyright 2007 John Maddock +Copyright 2008 John Maddock +Copyright 2013 John Maddock +Copyright 2014 John Maddock +Copyright 2017 John Maddock +Copyright 2020 Matt Borland +Copyright 2024 Matt Borland +Copyright Evan Miller, 2020 +Copyright Hubert Holin 2001 +Copyright John Maddock 2005 +Copyright John Maddock 2006 +Copyright John Maddock 2007 +Copyright John Maddock 2008 +Copyright John Maddock 2009 +Copyright John Maddock 2010 +Copyright John Maddock 2011 +Copyright John Maddock 2012 +Copyright John Maddock 2013 +Copyright John Maddock 2014 +Copyright John Maddock 2015 +Copyright John Maddock 2016 +Copyright John Maddock 2017 +Copyright John Maddock 2018 +Copyright John Maddock 2019 +Copyright John Maddock 2020 +Copyright John Maddock 2021 +Copyright John Maddock 2023 +Copyright John Maddock 2024 +Copyright Matt Borland 2021 +Copyright Matt Borland 2022 +Copyright Matt Borland 2023 +Copyright Matt Borland 2024 +Copyright Paul Bristow 2007 +Copyright Paul Bristow 2013 +Copyright Paul Bristow 2014 +copyright John Maddock 2008 +Copyright (c) Piers Lawrence +Copyright 2008 Gautam Sewani +Copyright 2013 Andrea Gavana +Copyright 2013 Niall Douglas +Copyright 2017 Nick Thompson +Copyright 2018 Nick Thompson +Copyright 2019 Nick Thompson +Copyright Gautam Sewani 2008 +Copyright Jeremy Murphy 2016 +Copyright John Maddock, 2017 +Copyright John Maddock, 2020 +Copyright John Maddock, 2021 +Copyright John Maddock, 2022 +Copyright John Maddock, 2023 +Copyright Matt Borland, 2021 +Copyright Matt Borland, 2022 +Copyright Matt Borland, 2023 +Copyright Matt Borland, 2024 +Copyright Nick Thompson 2017 +Copyright Nick Thompson 2018 +Copyright Nick Thompson 2019 +Copyright Nick Thompson 2020 +Copyright Nick Thompson 2024 +Copyright Paul A. 2007, 2010 +Copyright Yosef Meller, 2009 +(c) Copyright Johan Rade 2006 +Copyright (c) 2006 Johan Rade +Copyright (c) 2013 Kenneth L. +Copyright (c) 2013, Alan Genz +Copyright (c) 2014 Eric Moore +Copyright (c) 2019 Peter Bell +Copyright (c) 2022 Consortium +Copyright (c) 2024 Consortium +Copyright (c) jmc 2007 - 2010 +Copyright 2002 Gary Strangman +Copyright 2002 Pearu Peterson +Copyright 2013 Nikhar Agrawal +Copyright 2014 Anton Bikineev +Copyright 2014, Eric W. Moore +Copyright Christian Lorentzen +Copyright John Maddock 2006-7 +Copyright John Maddock 2007-8 +Copyright Madhur Chauhan 2020 +Copyright Nakhar Agrawal 2013 +Copyright Nick Thompson, 2017 +Copyright Nick Thompson, 2018 +Copyright Nick Thompson, 2019 +Copyright Nick Thompson, 2020 +Copyright Nick Thompson, 2021 +Copyright Nick Thompson, 2023 +Copyright Nick Thompson, 2024 +Copyright Paul A Bristow 2010 +Copyright Xiaogang Zhang 2006 +(c) Copyright Evan Miller 2020 +Copyright (c) 2008 Damian Eads +Copyright (c) 2012 Google Inc. +Copyright (c) 2020 Evan Miller +Copyright 1999 Travis Oliphant +Copyright 2005 Travis Oliphant +Copyright 2010 Paul A. Bristow +Copyright 2011 Paul A. Bristow +Copyright 2012 Paul A. Bristow +Copyright 2013 Paul A. Bristow +Copyright 2015 Paul A. Bristow +Copyright 2019 Paul A. Bristow +Copyright 2020, Madhur Chauhan +Copyright 2021 Alexander Grund +Copyright 2021 Andrey Semashev +Copyright 2021 Paul A. Bristow +Copyright John Maddock 2006-15 +Copyright John Maddock 2008-11 +Copyright John Z. Maddock 2016 +Copyright John Z. Maddock 2017 +Copyright Paul A. Bristow 2006 +Copyright Paul A. Bristow 2007 +Copyright Paul A. Bristow 2008 +Copyright Paul A. Bristow 2009 +Copyright Paul A. Bristow 2010 +Copyright Paul A. Bristow 2011 +Copyright Paul A. Bristow 2012 +Copyright Paul A. Bristow 2013 +Copyright Paul A. Bristow 2014 +Copyright Paul A. Bristow 2015 +Copyright Paul A. Bristow 2016 +Copyright Paul A. Bristow 2017 +Copyright Paul A. Bristow 2018 +Copyright Paul A. Bristow 2019 +Copyright Paul A. Bristow 2021 +Copyright Paul a. Bristow 2010 +copyrighted by Enthought, Inc. +(c) Copyright Hubert Holin 2001 +(c) Copyright Hubert Holin 2003 +(c) Copyright John Maddock 2005 +(c) Copyright John Maddock 2006 +(c) Copyright John Maddock 2007 +(c) Copyright John Maddock 2008 +(c) Copyright John Maddock 2009 +(c) Copyright John Maddock 2010 +(c) Copyright John Maddock 2013 +(c) Copyright John Maddock 2014 +(c) Copyright John Maddock 2015 +(c) Copyright John Maddock 2017 +(c) Copyright John Maddock 2018 +(c) Copyright John Maddock 2020 +(c) Copyright John Maddock 2021 +(c) Copyright John Maddock 2022 +(c) Copyright John Maddock 2023 +(c) Copyright John Maddock 2024 +(c) Copyright Matt Borland 2020 +(c) Copyright Matt Borland 2021 +(c) Copyright Matt Borland 2022 +(c) Copyright Matt Borland 2023 +(c) Copyright Matt Borland 2024 +Copyright (c) 2006 John Maddock +Copyright (c) 2007 John Maddock +Copyright (c) 2007, Damian Eads +Copyright (c) 2009 John Maddock +Copyright (c) 2011 John Maddock +Copyright (c) 2012 John Maddock +Copyright (c) 2014 John Maddock +Copyright (c) 2015 John Maddock +Copyright (c) 2016 Adrian Veres +Copyright (c) 2017 John Maddock +Copyright (c) 2020 John Maddock +Copyright (c) 2021 Matt Borland +Copyright (c) 2021 Orson Peters +Copyright (c) 2022 John Maddock +Copyright (c) 2024 Matt Borland +Copyright (c) Tyler Reddy, 2016 +Copyright 2020-2021 Peter Dimov +Copyright Benjamin Sobotta 2012 +Copyright Jeremy W. Murphy 2015 +Copyright Paul A. Bristow, 2019 +Copyright Peter Dimov 2015-2021 +Copyright Takuma Yoshimura 2024 +copyright (c) 2022, Robert Kern +(c) Copyright Bruno Lalande 2008 +(c) Copyright Jeremy Murphy 2015 +(c) Copyright John Maddock, 2024 +(c) Copyright Nick Thompson 2017 +(c) Copyright Nick Thompson 2018 +(c) Copyright Nick Thompson 2019 +(c) Copyright Nick Thompson 2020 +(c) Copyright Nick Thompson 2021 +(c) Copyright Nick Thompson 2023 +Copyright (C) 2023 Adam Lugowski +Copyright (c) 2017 Nick Thompson +Copyright (c) 2018 Nick Thompson +Copyright (c) 2019 Nick Thompson +Copyright (c) 2020 Marco Gorelli +Copyright (c) 2020 Nick Thompson +Copyright (c) 2021 Nick Thompson +Copyright (c) 2022 Adam Lugowski +Copyright (c) 2023 Adam Lugowski +Copyright (c) 2023 Nick Thompson +Copyright (c) 2024 Nick Thompson +Copyright 1991 Dieter Kraft, FHM +Copyright 1997-2008 by Agner Fog +Copyright 2002-2008 by Agner Fog +Copyright 2002-2014 by Agner Fog +Copyright 2004-2008 by Agner Fog +Copyright 2004-2013 by Agner Fog +Copyright 2020 Intel Corporation +Copyright 2022 Intel Corporation +Copyright 2022 James E. King III +Copyright Anne M. Archibald 2008 +Copyright John Maddock 2005-2006 +Copyright John Maddock 2005-2008 +Copyright John Maddock 2011-2021 +Copyright Nicholas Thompson 2017 +Copyright Nicholas Thompson 2018 +Copyright Nikhar Agrawal 2013-14 +Copyright Paul A. Bristow 2006-7 +(c) Copyright Anton Bikineev 2014 +(c) Copyright James Folberth 2022 +(c) Copyright John Maddock 2006-7 +(c) Copyright John Maddock 2006-8 +(c) Copyright Nick Thompson, 2018 +(c) Copyright Nick Thompson, 2019 +(c) Copyright Victor Ananyev 2021 +Copyright (c) 2006 Xiaogang Zhang +Copyright (c) 2006-7 John Maddock +Copyright (c) 2009, Motorola, Inc +Copyright (c) 2013 Anton Bikineev +Copyright (c) 2013 Pauli Virtanen +Copyright (c) 2014 Anton Bikineev +Copyright (c) 2016-2018 ERGO-Code +Copyright (c) 2016-2019 ERGO-Code +Copyright (c) 2018-2019 ERGO-Code +Copyright John Maddock 2006, 2007 +Copyright John Maddock 2006, 2010 +Copyright John Maddock 2006, 2011 +Copyright John Maddock 2006, 2012 +Copyright John Maddock 2007, 2014 +Copyright John Maddock 2008, 2012 +Copyright John Maddock 2010, 2012 +Copyright Nicholas McKibben, 2022 +Copyright Paul Bristow 2006, 2007 +Copyright Paul Bristow 2007, 2011 +(c) Copyright Antony Polukhin 2022 +(c) Copyright Paul A. Bristow 2006 +(c) Copyright Paul A. Bristow 2011 +Copyright (c) 2002 Travis Oliphant +Copyright (c) 2006-2008 Johan Rade +Copyright (c) 2010, Robert Parrish +Copyright (c) 2011 Francois Mauger +Copyright (c) 2011 Paul A. Bristow +Copyright (c) 2012 Paul A. Bristow +Copyright (c) 2018, Quansight-Labs +Copyright (c) 2019 Paul A. Bristow +Copyright (c) 2019-2020 Peter Bell +Copyright (c) Pauli Virtanen, 2010 +Copyright 2015 Jon Lund Steffensen +Copyright 2017 Two Blue Cubes Ltd. +Copyright John Maddock 2009 - 2012 +Copyright Thijs van den Berg, 2008 +Copyright (c) 1993-2019 C.B. Barber +Copyright (c) 2014-2022 Jarryd Beck +Copyright (c) 2024 SciPy developers +Copyright (c) Benjamin Sobotta 2012 +Copyright 2002 H Lohninger, TU Wein +Copyright Paul A. Bristow 2006-2011 +(c) Copyright Hubert Holin 2003-2005 +(c) Copyright John Maddock 2005-2006 +(c) Copyright John Maddock 2005-2021 +Copyright (c) 2007 Cybozu Labs, Inc. +Copyright (c) 2020 Michael Feldmeier +Copyright (c) Damian Eads, 2007-2008 +Copyright 2011, 2012 Paul A. Bristow +Copyright 2013 Christopher Kormanyos +Copyright 2014 Christopher Kormanyos +Copyright 2015 Jeremy William Murphy +Copyright Christopher Kormanyos 2012 +Copyright Christopher Kormanyos 2013 +Copyright Christopher Kormanyos 2014 +Copyright Christopher Kormanyos 2016 +Copyright Christopher Kormanyos 2020 +Copyright Christopher Kormanyos 2021 +Copyright Christopher Kormanyos 2024 +Copyright Matthew Pulver 2018 - 2019 +Copyright Paul A. Bristow 2006, 2007 +Copyright Paul A. Bristow 2006, 2017 +Copyright Paul A. Bristow 2007, 2009 +Copyright Paul A. Bristow 2007, 2010 +Copyright Paul A. Bristow 2007, 2012 +Copyright Paul A. Bristow 2008, 2009 +Copyright Paul A. Bristow 2008, 2010 +Copyright Paul A. Bristow 2008, 2014 +Copyright Paul A. Bristow 2009, 2011 +Copyright Paul A. Bristow 2010, 2013 +Copyright Paul A. Bristow 2010, 2015 +Copyright Paul A. Bristow 2011, 2012 +Copyright Paul A. Bristow 2014, 2015 +Copyright Paul A. Bristow 2015, 2018 +Copyright Paul A. Bristow 2016, 2017 +Copyright Paul A. Bristow 2016, 2018 +Copyright Paul A. Bristow 2017, 2018 +(c) Copyright Daryle Walker 2001-2002 +(c) Copyright John Maddock 2006, 2015 +Copyright (c) 2007 - Sebastien Fabbro +Copyright (c) 2007, 2008, Damian Eads +Copyright (c) 2007, 2013 John Maddock +Copyright (c) 2014 Mathjax Consortium +Copyright (c) 2015-2017 Martin Hensel +Copyright (c) 2016-2017 Felix Lenders +Copyright (c) 2019 Max-Planck-Society +Copyright (c) 2020-2023 Adam Lugowski +Copyright (c) 2022-2023 Adam Lugowski +Copyright Paul A. Bristow 2009 - 2019 +copyright Paul A. Bristow 2006 - 2010 +(c) Copyright Daryle Walker 2001, 2006 +(c) Copyright John Maddock 2008 - 2022 +(c) Copyright Matt Borland 2021 - 2022 +(c) Rasmus Munk Larsen, Stanford, 2004 +Copyright (c) 2012, Jaydeep P. Bardhan +Copyright (c) 2012, Matthew G. Knepley +Copyright (c) 2014, Janani Padmanabhan +Copyright (c) 2021 - 2022 Matt Borland +Copyright (c) 2022 Two Blue Cubes Ltd. +Copyright 2004-2005 by Enthought, Inc. +Copyright John Maddock 2005-2006, 2011 +Copyright John Maddock 2006-7, 2013-20 +Copyright (c) 1994 by Xerox Corporation +Copyright (c) 1996-2008 Rice University +Copyright (c) 2010 Thomas P. Robitaille +Copyright (c) 2011 ashelly.myopenid.com +Copyright 2013 John Maddock Distributed +Copyright 2013 Paul Bristow Distributed +Copyright 2014 Paul Bristow Distributed +Copyright 2015 John Maddock Distributed +Copyright 2017 John Maddock Distributed +Copyright 2018 John Maddock Distributed +Copyright 2019 John Maddock Distributed +Copyright 2020 Matt Borland Distributed +Copyright 2021 Matt Borland Distributed +Copyright 2022 Matt Borland Distributed +Copyright 2023 Matt Borland Distributed +Copyright 2024 Matt Borland Distributed +Copyright Paul A. Bristow 2007, 2013-14 +(c) Copyright Jeremy William Murphy 2015 +(c) Copyright Jeremy William Murphy 2016 +Copyright (c) 2001, 2002 Enthought, Inc. +Copyright (c) 2003, 2007-14 Matteo Frigo +Copyright (c) 2003-2005 Peter J. Verveer +Copyright (c) 2013 Christopher Kormanyos +Copyright 2002-2016 The SciPy Developers +Copyright 2008 John Maddock. Distributed +Copyright 2010 John Maddock. Distributed +Copyright 2011 John Maddock. Distributed +Copyright 2012 John Maddock. Distributed +Copyright 2013 John Maddock. Distributed +Copyright 2014 John Maddock. Distributed +Copyright 2015 John Maddock. Distributed +Copyright 2017 John Maddock. Distributed +Copyright 2017 Nick Thompson Distributed +Copyright 2019 John Maddock. Distributed +Copyright 2024. Matt Borland Distributed +Copyright (c) 1998-2007, Timothy A. Davis +Copyright (c) 2005-2022, NumPy Developers +Copyright 2008 Bruno Lalande. Distributed +Copyright 2017, Nick Thompson Distributed +Copyright 2019, Nick Thompson Distributed +Copyright (c) 2005-2015, Michele Simionato +Copyright (c) 2010-2018 Max-Planck-Society +Copyright (c) 2010-2019 Max-Planck-Society +Copyright (c) 2010-2022 Max-Planck-Society +Copyright 1984, 1995 by Stephen L. Moshier +Copyright 1984, 1996 by Stephen L. Moshier +Copyright 2020 Madhur Chauhan. Distributed +Copyright 2021 Nick Thompson, John Maddock +Copyright Christopher Kormanyos 2012, 2013 +Copyright Nick Thompson, John Maddock 2020 +Copyright Paul A. Bristow 2006, 2007, 2012 +Copyright Paul A. Bristow 2006, 2012, 2017 +Copyright Paul A. Bristow 2007, 2008, 2010 +Copyright Paul A. Bristow 2007, 2009, 2010 +Copyright Paul A. Bristow 2007, 2009, 2012 +Copyright Paul A. Bristow 2007, 2010, 2011 +Copyright Paul A. Bristow 2007, 2010, 2012 +Copyright Paul A. Bristow 2008, 2009, 2014 +Copyright Paul A. Bristow 2016, 2017, 2018 +(c) Copyright Eric Ford & Hubert Holin 2001 +(c) Copyright Eric Ford 2001 & Hubert Holin +(c) Rasmus Munk Larsen, Stanford University +Copyright (c) 1993-2019 The Geometry Center +Copyright (c) 1998-2000 Theodore C. Belding +Copyright (c) 2024 Matt Borland Distributed +Copyright 1984 - 1994 by Stephen L. Moshier +Copyright 1985 by Stephen L. Moshier Direct +Copyright Christopher Kormanyos 2002 - 2011 +Copyright Nick Thompson, John Maddock, 2020 +Copyright Nick Thompson, Matt Borland, 2022 +Copyright Nick Thompson, Matt Borland, 2023 +(c) Rasmus Munk Larsen, Stanford, 1999, 2004 +Copyright (c) 2001-2011 - Scilab Enterprises +Copyright 2016, 2017 Peter Dimov Distributed +copyright 2008 Paul A. Bristow, John Maddock +Copyright (c) 2009 Pauli Virtanen Distributed +Copyright (c) 2011-2014, The OpenBLAS Project +Copyright (c) 2024 Tan Ping Liang, Peter Bell +Copyright Johan Rade and Paul A. Bristow 2011 +Copyright John Maddock 2006, 2007, 2012, 2014 +Copyright Paul A. Bristow & John Maddock 2009 +(c) Copyright Nick Thompson, John Maddock 2023 +Copyright (c) 2009-2017 The MathJax Consortium +Copyright (c) 2010-2017 The MathJax Consortium +Copyright (c) 2011-2015 The MathJax Consortium +Copyright (c) 2011-2017 The MathJax Consortium +Copyright (c) 2013-2017 The MathJax Consortium +Copyright (c) 2014-2017 The MathJax Consortium +Copyright (c) 2015-2017 The MathJax Consortium +Copyright (c) 2016-2017 The MathJax Consortium +Copyright J.S. Roy (js@jeannot.org), 2002-2005 +(c) Copyright Christopher Kormanyos 1999 - 2021 +Copyright (c) 2008 Ian Bicking and Contributors +Copyright (c) 2009, Pauli Virtanen +Copyright (c) 2015, Pauli Virtanen +Copyright 2005, 2013 Daryle Walker. Distributed +Copyright 2006 John Maddock and Paul A. Bristow +Copyright John Maddock and Paul A. Bristow 2007 +Copyright John Maddock and Paul A. Bristow 2010 +Copyright (c) 2008 Paul A. Bristow, John Maddock +Copyright 1984, 1987, 1995 by Stephen L. Moshier +Copyright 1984, 1987, 2000 by Stephen L. Moshier +Copyright 1984, 1995, 2000 by Stephen L. Moshier +Copyright 1985, 1987, 2000 by Stephen L. Moshier +Copyright 2024 Christopher Kormanyos Distributed +Copyright Paul A. Bristow 2006, 2007, 2009, 2010 +Copyright Paul A. Bristow 2007, 2009, 2010, 2012 +Copyright Paul A. Bristow 2007, 2010, 2012, 2014 +Copyright Paul A. Bristow 2007, 2010, 2014, 2016 +Copyright Paul A. Bristow 2008, 2009, 2012, 2016 +Copyright Rene Ferdinand Rivera Morell 2023-2024 +(c) Copyright Matt Borland and Nick Thompson 2022 +(c) Copyright Nick Thompson and Matt Borland 2020 +(c) Rasmus Munk Larsen, Stanford University, 2000 +(c) Rasmus Munk Larsen, Stanford University, 2004 +Copyright 1984, 1987 by Stephen L. Moshier Direct +Copyright 1984, 1991 by Stephen L. Moshier Direct +Copyright 1985, 1987 by Stephen L. Moshier Direct +Copyright 2007, 2010 Paul A. Bristow. Distributed +Copyright 2013, 2013 John Maddock, Anton Bikineev +Copyright 2019 - 2021 Alexander Grund Distributed +Copyright (c) 2010 David Fong and Michael Saunders +Copyright (c) 2006, Systems Optimization Laboratory +Copyright (c) 2007, John Travers +Copyright (c) 2010 - Jordi Gutierrez Hermoso Octave +Copyright Christopher Kormanyos 2013-14, 2020, 2024 +Copyright Paul A. Bristow & John Maddock 2009, 2010 +Copyright (c) 2006 Xiaogang Zhang, 2015 John Maddock +Copyright (c) 2006, The Regents of the University of +Copyright 1999, 2005, 2013 Hubert Holin. Distributed +Copyright 2006 John Maddock and Paul A. Bristow 2011 +Copyright 2015 Ontario Institute for Cancer Research +(c) Copyright Hubert Holin and Daryle Walker 2001-2002 +(c) Rasmus Munk Larsen, Stanford University, 2000,2004 +Copyright (C) 2022 Adam Lugowski. All rights reserved. +Copyright (C) 2023 Adam Lugowski. All rights reserved. +Copyright (c) 2002-2017 Free Software Foundation, Inc. +Copyright (c) 2010-2019 Free Software Foundation, Inc. +Copyright (c) 2016 Wenzel Jakob +Copyright 1984, 1987, 1988, 2000 by Stephen L. Moshier +Copyright 1984, 1987, 1989, 1995 by Stephen L. Moshier +Copyright 1984, 1987, 1989, 2000 by Stephen L. Moshier +Copyright 1984, 1987, 1992, 2000 by Stephen L. Moshier +(c) Rasmus Munk Larsen, Stanford University, 1999, 2004 +(c) Rasmus Munk Larsen, Stanford University, 2000, 2004 +Copyright (c) 2021 Orson Peters +Copyright (c) Donald Stufft and individual contributors +Copyright 1984, 1987, 1988 by Stephen L. Moshier Direct +Copyright 1984, 1987, 1989 by Stephen L. Moshier Direct +Copyright 1984, 1987, 1993 by Stephen L. Moshier Direct +Copyright 1985, 1987, 1989 by Stephen L. Moshier Direct +Copyright 2007, 2010, 2012 Paul A. Bristow. Distributed +copyright f'2008- date.today .year, The SciPy community +Copyright (c) 2012 Massachusetts Institute of Technology +Copyright (c) John Maddock & Paul A. Bristow 2007 - 2012 +Copyright 2002 H Lohninger, TU Wein H.Lohninger Teach/Me +Copyright 2014 Marco Guazzone (marco.guazzone@gmail.com) +(c) ACM, 2011. http://doi.acm.org/10.1145/1916461.1916469 +Copyright (c) 2006-2013 The University of Colorado Denver +Copyright 2006 Hubert Holin and John Maddock. Distributed +Copyright (c) 2006-2007, Robert Hetland +Copyright (c) 2021-2024, Tom M. Ragonneau and Zaikun Zhang +(c) 1995 Ernst Stadlober, Institut fuer Statistitk, TU Graz +Copyright (C) 2022-2023 Adam Lugowski. All rights reserved. +Copyright (c) 2000-2022 Wolfgang Hoermann and Josef Leydold +Copyright (c) 2005, Rasmus Munk Larsen, Stanford University +Copyright 2008, 2009 John Maddock, Paul A. Bristow and M.A. +Copyright 2011 Paul A. Bristow and Thomas Mang. Distributed +Copyright Daryle Walker, Hubert Holin and John Maddock 2006 +Copyright (c) 2002-2005, Jean-Sebastien Roy (js@jeannot.org) +Copyright (c) 2004-2005, Jean-Sebastien Roy (js@jeannot.org) +Copyright 1984, 1987, 1988, 1992, 2000 by Stephen L. Moshier +Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier +Copyright 2006 John Maddock and Paul A. Bristow. Distributed +Copyright 2007 John Maddock and Paul A. Bristow. Distributed +Copyright 2008 John Maddock and Paul A. Bristow. Distributed +Copyright 2010 John Maddock and Paul A. Bristow. Distributed +Copyright 2012 John Maddock and Paul A. Bristow. Distributed +Copyright 2014 John Maddock and Paul A. Bristow. Distributed +Copyright 2015 John Maddock and Paul A. Bristow. Distributed +Copyright (c) 2000-2013 The University of California Berkeley +Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier Direct +Copyright 1984, 1987, 1989, 1992 by Stephen L. Moshier Direct +Copyright (c) 1999, 2000, 2001 North Carolina State University +Copyright (c) 2010 David Fong and Michael Saunders Distributed +Copyright (c) Tyler Reddy, Richard Gowers, and Max Linke, 2016 +Copyright 2016-2021 Matthew Brett, Isuru Fernando, Matti Picus +Copyright (c) 2004 David M. Cooke +Copyright (c) 2004 Joel de Guzman http://spirit.sourceforge.net +Copyright (c) John Maddock and Paul A. Bristow 2009, 2010, 2012 +Copyright Daryle Walker, Hubert Holin, John Maddock 2006 - 2007 +Copyright John Maddock & Paul A. Bristow 2007, 2009, 2010, 2012 +(c) 2000 W. Hoermann & J. Leydold, Institut f. Statistik, WU Wien +(c) 2007 W. Hoermann & J. Leydold, Institut f. Statistik, WU Wien +Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology +Copyright (c) 2008, 2009, 2010, 2012 Paul A. Bristow, John Maddock +Copyright 2006, 2007 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2009 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2010 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2011 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2012 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2013 John Maddock and Paul A. Bristow. Distributed +Copyright 2007, 2010 John Maddock and Paul A. Bristow. Distributed +Copyright 2007, 2013 John Maddock and Paul A. Bristow. Distributed +Copyright 2008, 2009 John Maddock and Paul A. Bristow. Distributed +Copyright 2008, 2012 John Maddock and Paul A. Bristow. Distributed +Copyright 2010, 2012 John Maddock and Paul A. Bristow. Distributed +Copyright (c) 2001-2002 Enthought, Inc. 2003-2024, SciPy Developers +Copyright (c) 2007 Free Software Foundation, Inc. +Copyright (c) 2009 Free Software Foundation, Inc. +Copyright 2006 - 2010 John Maddock and Paul A. Bristow. Distributed +Copyright 2006 - 2012 John Maddock and Paul A. Bristow. Distributed +Copyright 2006 - 2013 John Maddock and Paul A. Bristow. Distributed +copyright 2014 Christopher Kormanyos, John Maddock, Paul A. Bristow +Copyright (c) 1996, 1997, 1998, 1999, 2000 Gerard Jungman, Brian Gough +Copyright 2006, 2007, 2010 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2007, 2012 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2010, 2011 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2010, 2012 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2010, 2015 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2012, 2015 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2012, 2017 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2015, 2018 John Maddock and Paul A. Bristow. Distributed +Copyright 2007, 2012, 2014 John Maddock and Paul A. Bristow. Distributed +Copyright (c) 1998-2000 Theodore C. Belding University of Michigan Center +Copyright (2022) National Technology & Engineering Solutions of Sandia, LLC +Copyright 2006 John Maddock, Paul A. Bristow and Xiaogang Zhang. Distributed +Copyright (c) 2021-04-21 Stefan van der Walt https://github.com/stefanv/lloyd +copyright A. Volgenant/Amsterdam School of Economics, University of Amsterdam +Copyright 2006, 2007, 2008, 2010 John Maddock and Paul A. Bristow. Distributed +Copyright 2006, 2010, 2013, 2014 John Maddock and Paul A. Bristow. Distributed +Copyright 2012 Benjamin Sobotta, John Maddock and Paul A. Bristow. Distributed +Copyright Thomas Dybdahl Ahle, Nick Thompson, Matt Borland, John Maddock, 2023 +Copyright 2023 Thomas Dybdahl Alhe, Nicholas Thompson, Matt Borland Distributed +Copyright 1998-2006 Liam Quinn. / Glyphs of the +Copyright 2014 Christopher Kormanyos, John Maddock and Paul A. Bristow. Distributed +Copyright 1987-, A. Volgenant/Amsterdam School of Economics, University of Amsterdam +Copyright 2006, 2008, 2011 John Maddock, Johan Rade and Paul A. Bristow. Distributed +Copyright 2016 John Maddock, Paul A. Bristow, Thomas Luu, Nicholas Thompson. Distributed +Copyright 2013, 2014 Nikhar Agrawal, Christopher Kormanyos, John Maddock, Paul A. Bristow +Copyright 2008, 2010, 2012, 2013, 2014, 2015 John Maddock and Paul A. Bristow. Distributed +Copyright (c) 2018 Sylvain Gubian , Yang Xiang +Copyright 2006, 2013 John Maddock, Paul A. Bristow, Xiaogang Zhang and Christopher Kormanyos +Copyright (c) Tyler Reddy, Ross Hemsley, Edd Edmondson, Nikolai Nowaczyk, Joe Pitt-Francis, 2015 +Copyright 2013, 2014 Nikhar Agrawal, Christopher Kormanyos, John Maddock, Paul A. Bristow. Distributed +Copyright (c) 1992-2013 The University of Tennessee and The University of Tennessee Research Foundation +Copyright 2006, 2007, 2008, 2009, 2010, 2012, 2013, 2015, 2016 John Maddock and Paul A. Bristow. Distributed +Copyright (c) 2003, The Regents of the University of California, through Lawrence Berkeley National Laboratory +Copyright (c) 2006, The Regents of the University of California, through Lawrence Berkeley National Laboratory +Copyright (c) 2017, The Chancellor, Masters and Scholars of the University of Oxford, and the Chebfun Developers +Copyright (c) 2008 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2009 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2010 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2003-2009, The Regents of the University of California, through Lawrence Berkeley National Laboratory +Copyright (c) 2000-2010 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2000-2022 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2008-2010 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2009-2010 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2009-2011 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2009-2012 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2011-2012 Wolfgang Hoermann and Josef Leydold Institute for Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2000-2006 Wolfgang Hoermann and Josef Leydold Dept. for Statistics, University of Economics, Vienna, Austria +Copyright (c) 2000-2006, 2010 Wolfgang Hoermann and Josef Leydold Department of Statistics and Mathematics, WU Wien, Austria +Copyright (c) 2006-2021 Nikhar Agrawal, Anton Bikineev, Matthew Borland, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert Holin, Bruno Lalande, John Maddock, Evan Miller, Jeremy Murphy, Matthew Pulver, Johan Rade +copyright 2006-2021 Nikhar Agrawal, Anton Bikineev, Matthew Borland, Paul A. Bristow, Marco Guazzone, Christopher Kormanyos, Hubert Holin, Bruno Lalande, John Maddock, Evan Miller, Jeremy Murphy, Matthew Pulver, Johan Rade, Gautam Sewani, Benjamin Sobotta, Nicholas Thompson, Thijs van den Berg, Daryle Walker and Xiaogang Zhang + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +sentinels 1.0.0 - BSD-3-Clause + + +Copyright (c) 2011, Rotem Yaari + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +setproctitle 1.3.4 - BSD-3-Clause + + +Copyright (c) 2000-2009, PostgreSQL Global Development Group +Copyright (c) 1998 Todd C. Miller +Copyright (c) 2009-2021 Daniele Varrazzo +Copyright (c) 2010-2021 Daniele Varrazzo +Copyright (c) 2011-2021 Daniele Varrazzo +Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group +Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group +Copyright (c) 2009-2021, Daniele Varrazzo +Portions Copyright (c) 1994, The Regents of the University of California + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +smmap 5.0.2 - BSD-3-Clause + + +Copyright (c) 2010, 2011 Sebastian Thiel and contributors + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +symfc 1.2.1 - BSD-3-Clause + + +Copyright (c) 2023, symfc project + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +webcolors 24.11.1 - BSD-3-Clause + + +copyright James Bennett and contributors +Copyright (c) James Bennett, and contributors + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +mp-api 0.43.0 - BSD-3-Clause AND BSD-3-Clause-LBNL + + +copyright 2022, The Materials Project +Copyright (c) 2017, The Regents of the University of California, through Lawrence Berkeley National Laboratory + +BSD-3-Clause AND BSD-3-Clause-LBNL + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyterlab-widgets 3.0.13 - BSD-3-Clause AND CC0-1.0 AND ISC AND MIT + + +Copyright (c) Felix Bohm +Copyright (c) 2014 Alex Bell +Copyright (c) 2019 Leon Gersen +Copyright 2010-2015 Mike Bostock +Copyright 2010-2021 Mike Bostock +Copyright 2010-2022 Mike Bostock +Copyright (c) 2014 Jameson Little +Copyright (c) Jupyter Development Team +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2014 The cheeriojs contributors +Copyright JS Foundation and other contributors +Copyright (c) 2013, 2014, 2015 P'unk Avenue LLC +Copyright (c) 2015 Project Jupyter Contributors +Copyright (c) 2019 Project Jupyter Contributors +Copyright 2013 Andrey Sitnik +Copyright 2017 Andrey Sitnik +Copyright (c) 2014-2017, PhosphorJS Contributors +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright OpenJS Foundation and other contributors +Copyright (c) 2010-2019 Jeremy Ashkenas, DocumentCloud +Copyright (c) 2013 Roman Shtylman +Copyright 2010, 2011, Chris Winberry +Copyright (c) 2012 James Halliday, Josh Duff, and other contributors +Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov +Copyright JS Foundation and other contributors, https://js.foundation +Copyright OpenJS Foundation and other contributors, https://openjsf.org +Copyright OpenJS Foundation and other contributors +Copyright (c) Sindre Sorhus (https://sindresorhus.com) +(c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Backbone +Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +Copyright (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors + +BSD-3-Clause AND CC0-1.0 AND ISC AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +altair 5.5.0 - BSD-3-Clause AND MIT + + +Copyright (c) 2015-2023, Vega-Altair Developers + +BSD-3-Clause AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyterlab 4.3.4 - BSD-3-Clause AND MIT + + +(c) Yqn (c) +(c) C Ofn (c) +(c) Sindre Sorhus +copyright Koen Bok +(c) 2011 Gary Court +Copyright 2021 Mapbox +(c) 2019 Denis Pushkarev +Copyright (c) 2017, Vega +Copyright (c) Felix Bohm +Copyright (c) 2016 podhmo +Copyright 2011 Gary Court +Copyright (c) 2017, Mapbox +Copyright (c) Font Awesome +Copyright 2019 Ron Buckton +Copyright Gaetan Renaudeau +Copyright (c) 2015 Treasure +Copyright 2021 Mike Bostock +(c) 2017-2021 Joachim Wester +(c) 2017-2022 Joachim Wester +Copyright (c) 2014 Alex Bell +Copyright (c) 2017 Braintree +Copyright 2001 Robert Penner +Copyright 2015 Ricky Reusser +Copyright 2015, Mike Bostock +Copyright (c) 2015 JD Ballard +Copyright (c) 2015 Josh Junon +Copyright (c) 2018 Chris Holt +Copyright (c) 2015 Dan Abramov +Copyright (c) 2015 David Clark +Copyright (c) 2022 Fadi Khadra +Copyright Node.js contributors +Copyright (c) 2014 Athan Reines +Copyright (c) 2015 Athan Reines +Copyright (c) Bloomberg Finance +Copyright (c) 2015 Dmitry Ivanov +Copyright (c) 2017 Martin Hansen +Copyright 2010-2021 Mike Bostock +Copyright 2010-2022 Mike Bostock +Copyright 2010-2023 Mike Bostock +Copyright 2013-2021 Mike Bostock +Copyright 2015-2016 Mike Bostock +Copyright 2016-2021 Mike Bostock +(c) Cure53 and other contributors +Copyright (c) 2012 Heather Arthur +Copyright (c) 2013 James Halliday +Copyright (c) 2015 Shusaku Uesugi +Copyright (c) 2011 Fabrice Bellard +Copyright (c) 2015, Rebecca Turner +Copyright 2008-2012 Charles Karney +Copyright (c) 2016 Adele Delamarche +Copyright (c) 2017 Dmitry Soshnikov +Copyright (c) 2018 Tamino Martinius +Copyright (c) Microsoft Corporation +Copyright 2012-2019 Michael Bostock +(c) 2016-present Alexander Kuznetsov +Copyright (c) 2014-2015 Athan Reines +Copyright (c) 2017 Evgeny Poberezkin +Copyright (c) 2020 Evgeny Poberezkin +Copyright 2018-2021 Observable, Inc. +Copyright (c) 2015-2021 Martin Hensel +Copyright (c) 2015-present Evan Jacobs +Copyright (c) 2016 Alexander Kuznetsov +Copyright (c) Jupyter Development Team +Copyright (c) 2014 The xterm.js authors +Copyright (c) 2014-2016, Jon Schlinkert +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2015-2018, Jon Schlinkert +Copyright (c) 2016 typestyle Permission +Copyright (c) 2021 @markedjs Permission +Copyright (c) Font Awesome Font Awesome +Copyright (c) 2016-present Sultan Tarimo +Copyright (c) 2014 - 2022 Knut Sveidqvist +Copyright (c) 2015-2021 Evgeny Poberezkin +Copyright (c) 2014-present, Jon Schlinkert +Copyright (c) 2015-present, Jon Schlinkert +Copyright (c) 2019 iVis@Bilkent Permission +Copyright (c) 2013, 2014, 2020 Joachim Wester +Copyright (c) 2014 The cheeriojs contributors +Copyright (c) 2018-present, iamkun Permission +Copyright (c) 2015 Unshift.io, Arnout Kazemier +Copyright JS Foundation and other contributors +copyright year in About JupyterLab and LICENSE +Copyright (c) 2013, 2014, 2015 P'unk Avenue LLC +Copyright (c) Facebook, Inc. and its affiliates +Copyright 2013 Andrey Sitnik +Copyright 2017 Andrey Sitnik +Copyright 2024 Dr.-Ing. Mario Heiderich, Cure53 +Copyright (c) 2014-2017, PhosphorJS Contributors +Copyright (c) 2012-2018 Aseem Kishore, and others +Copyright (c) 2016-2018, The Cytoscape Consortium +Copyright (c) 2016-2023, The Cytoscape Consortium +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Joyent, Inc. and other Node contributors +Copyright (c) 2015, Dan Flettre +Copyright (c) 2011-2015 Paul Vorbach +Copyright (c) 2015-2024 Project Jupyter Contributors +Copyright 2016 Interactive Data Lab and contributors +Copyright (c) 2013 Roman Shtylman +Copyright (c) 2019 - present, iVis@Bilkent. Permission +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) +Copyright (c) 2014, 2016, 2017, 2019, 2021 Simon Lydell +Copyright (c) 2015 Titus Wormer +Copyright (c) 2016 Titus Wormer +Copyright (c) 2020 Titus Wormer +Copyright (c) 2021 Titus Wormer +Copyright (c) 2011 Heather Arthur +Copyright (c) 2004, John Gruber http://daringfireball.net +Copyright (c) 2019-present Fabio Spampinato, Andrew Maney +Copyright 2010, 2011, Chris Winberry +Copyright (c) 2020 by Marijn Haverbeke +Copyright (c) 2019 Kevin Jahns +Copyright (c) 2020 Kevin Jahns +Copyright (c) 2018-2022 TypeFox GmbH (http://www.typefox.io) +Copyright (c) 2010-2020 Robert Kieffer and other contributors +Copyright (c) 2011-2016 Heather Arthur +Copyright (c) 2015, University of Washington Interactive Data Lab +Copyright (c) 2016, University of Washington Interactive Data Lab +Copyright (c) Luke Edwards (lukeed.com) +Marked Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/) +Copyright (c) 2012 James Halliday, Josh Duff, and other contributors +Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) +Copyright (c) 2014-present Sebastian McKenzie and other contributors +Copyright (c) 2016 by Marijn Haverbeke and others +Copyright (c) 2018 by Marijn Haverbeke and others +Copyright (c) 2015-2023, University of Washington Interactive Data Lab +Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/) +Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/) +Copyright jQuery Foundation and other contributors +Copyright OpenJS Foundation and other contributors +Copyright (c) 2018-2021 by Marijn Haverbeke and others +Copyright (c) 2018 by Marijn Haverbeke and others +Copyright (c) 2020 by Marijn Haverbeke and others +Copyright (c) 2021-2024 Oleksii Raspopov, Kostiantyn Denysov, Anton Verinov +Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright (c) 2018, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright (c) 2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright (c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com) +Copyright (c) 2018-2021 by Marijn Haverbeke and others +Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) +Copyright 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University +Copyright (c) 2014 - Kevin Jahns - Chair of Computer Science +Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) https://github.com/chjj/term.js +Copyright (c) 2011-2015 Jan Lehnardt & Marc Bachmann +copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +Copyright (c) 2020 by Marijn Haverbeke , Arun Srinivasan , and others + +BSD-3-Clause AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyterlab-pygments 0.3.0 - BSD-3-Clause AND MIT + + +Copyright (c) Jupyter Development Team +Copyright JS Foundation and other contributors +Copyright (c) 2015 Project Jupyter Contributors + +BSD-3-Clause AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +jupyterlab-server 2.27.3 - BSD-3-Clause AND MIT + + +copyright 2021, Project Jupyter +Copyright (c) Jupyter Development Team +Copyright (c) 2015-2017, Project Jupyter Contributors + +BSD-3-Clause AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +phonopy 2.34.0 - BSD-3-Clause AND MIT + + +Copyright (c) 2020 +(c) elsi-interchange.org +Copyright (c) 2022 Yuyang Ji +Copyright (c) 2008 Atsushi Togo +Copyright (c) 2010 Atsushi Togo +Copyright (c) 2011 Atsushi Togo +Copyright (c) 2012 Atsushi Togo +Copyright (c) 2013 Atsushi Togo +Copyright (c) 2014 Atsushi Togo +Copyright (c) 2015 Atsushi Togo +Copyright (c) 2016 Atsushi Togo +Copyright (c) 2018 Atsushi Togo +Copyright (c) 2019 Atsushi Togo +Copyright (c) 2020 Atsushi Togo +Copyright (c) 2021 Atsushi Togo +Copyright (c) 2022 Atsushi Togo +Copyright (c) 2023 Atsushi Togo +Copyright (c) 2024 Atsushi Togo +copyright (c) 2013 Atsushi Togo +Copyright (c) 2014-2024, Phonopy +Copyright (c) 2024 Florian Knoop +Copyright (c) 1998-2014 ABINIT group +Copyright (c) 2017-2019 Tiziano Muller +Copyright (c) 2021 Alexander Neukirchen +Copyright (c) 2009-2011 Joerg Meyer (jm) +Copyright by Oldenburg Wissenshaftverlag +Copyright (c) 2018 TURBOMOLE GmbH, Karlsruhe +Copyright (c) 2015 Henrique Pereira Coutada Miranda +Copyright (c) 2018 Antti Karttunen (antti.j.karttunen@iki.fi) +Copyright (c) 2016 Antti J. Karttunen (antti.j.karttunen@iki.fi) +Copyright (c) 2019 Antti J. Karttunen (antti.j.karttunen@iki.fi) + +BSD-3-Clause AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +maggma 0.71.1 - BSD-3-Clause-LBNL AND CAL-1.0 + + +Copyright (c) 2017, The Regents of the University of California, through Lawrence Berkeley National Laboratory + +BSD-3-Clause-LBNL AND CAL-1.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +matscipy 1.1.1 - CAL-1.0 AND LGPL-2.1-only + + +Copyright 2016 Punit Patel +Copyright 2021 Jan Griesser +Copyright 2022 Lucas Frerot +Copyright 2014 James Kermode +Copyright 2015 James Kermode +Copyright 2015 Lars Pastewka +Copyright 2016 James Kermode +Copyright 2016 Lars Pastewka +Copyright 2017 Lars Pastewka +Copyright 2020 James Kermode +Copyright 2021 Lars Pastewka +Copyright 2022 Lars Pastewka +Copyright (c) 2008, Dan Wilson +Copyright 2023 Andreas Klemenz +Copyright 2018-2021 Jan Griesser +Copyright 2020 Johannes Hoermann +Copyright 2020-2021 Jan Griesser +Copyright 2014-2015 James Kermode +Copyright 2014-2015 Lars Pastewka +Copyright 2020-2021 James Kermode +Copyright 2020-2021 Lars Pastewka +Copyright 2014, 2018 James Kermode +Copyright 2014, 2020 James Kermode +Copyright 2014, 2020 Lars Pastewka +Copyright 2014, 2021 Lars Pastewka +Copyright 2015, 2017 Lars Pastewka +Copyright 2015, 2021 Lars Pastewka +Copyright 2016, 2021 Lars Pastewka +Copyright 2019, 2021 Lars Pastewka +Copyright 2019-2020 Johannes Hoermann +Copyright 2018-2019, 2021 Jan Griesser +Copyright 2019-2020 Wolfram G. Nohring +Copyright 2014, 2020-2021 Lars Pastewka +Copyright 2014-2015, 2020 Lars Pastewka +Copyright 2014-2015, 2021 Lars Pastewka +Copyright 2014-2016, 2021 Lars Pastewka +Copyright 2014-2017, 2021 Lars Pastewka +Copyright 2015, 2020-2021 Lars Pastewka +Copyright 2015-2016, 2020 James Kermode +Copyright 2015-2017, 2021 Lars Pastewka +Copyright 2016, 2020-2021 Lars Pastewka +Copyright 2016-2019, 2021 Lars Pastewka +Copyright 2018, 2020-2021 Petr Grigorev +Copyright 2015, 2017, 2021 Lars Pastewka +Copyright 2016-2017, 2020 Andreas Klemenz +Copyright 2016-2017, 2023 Andreas Klemenz +copyrighted by the Free Software Foundation +Copyright 2014-2015, 2017-2021 Lars Pastewka +Copyright 2014-2015, 2020-2021 Lars Pastewka +Copyright 2014-2015, 2017, 2021 Lars Pastewka +Copyright 2015, 2017, 2020-2021 Lars Pastewka +copyright u'2023, James Kermode, Lars Pastewka +Copyright 2014-2015, 2017, 2019-2021 Lars Pastewka +Copyright 2014-2015, 2017, 2020-2021 Lars Pastewka +Copyright 2014-2015, 2017-2019, 2021 Lars Pastewka +Copyright 2019 IMTEK Simulation University of Freiburg +Copyright 2020 IMTEK Simulation University of Freiburg +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (2020) Johannes Hormann, University of Freiburg +Copyright (2019) Johannes Hoermann, University of Freiburg +Copyright 2019, 2020 IMTEK Simulation University of Freiburg +Copyright (2014) James Kermode, King's College London Lars Pastewka, Karlsruhe Institute of Technology +Copyright (2014-2017) James Kermode, Warwick University Lars Pastewka, Karlsruhe Institute of Technology +Copyright (2014) James Kermode, King's College London Lars Pastewka, Karlsruhe Institute of Technology Adrien Gola, Karlsruhe Institute of Technology + +CAL-1.0 AND LGPL-2.1-only + +--------------------------------------------------------- + +--------------------------------------------------------- + +pylint 3.3.3 - CC-BY-4.0 AND CC-BY-SA-4.0 AND GPL-2.0-only AND GPL-2.0-or-later + + +copyrighted by the Free Software Foundation +Copyright (c) 1989, 1991 Free Software Foundation, Inc. +Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt + +CC-BY-4.0 AND CC-BY-SA-4.0 AND GPL-2.0-only AND GPL-2.0-or-later + +--------------------------------------------------------- + +--------------------------------------------------------- + +ase 3.24.0 - GPL-2.0 AND GPL-2.0-only AND LGPL-2.1-only AND LGPL-2.1-or-later + + +Copyright (c) 2018 ASE +Copyright (c) 2020 ASE +Copyright (c) 2022 ASE +Copyright (c) 2003 CAMP +Copyright (c) 2003-2016 +Copyright (c) 2011-2012 +Copyright (c) 2011-2022 ASE +Copyright (c) 2012-2019 ASE +Copyright (c) 2016-2017 ASE +Copyright (c) 2018-2022 ASE +Copyright (c) 2019-2021 ASE +Copyright (c) 2007-2017 CAMd +Copyright (c) 2008 Atsushi Togo +Copyright (c) 2017 CAMD and ASE +Copyright (c) 2010, Jesper Friis +Copyright (c) , 2002-2014, T. Ozaki +Copyright (c) 2000 - 2023 Distributed +Copyright (c) 2024, Rohit Goswami, UI +Copyright 2008, 2009 CAMd see accompanying +copyrighted by the Free Software Foundation +Copyright (c) 2012-2023, Jesper Friis, SINTEF +Copyright (c) 2018 JaeHwan Shim and JaeJun Yu +Copyright (c) 2018 Jae Hwan Shim and JaeJun Yu +Copyright (c) 2008 CSC - Scientific Computing Ltd. +Copyright (c) 1989, 1991 Free Software Foundation, Inc. +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) 2009 - 2011 Joerg Meyer, joerg.meyer@ch.tum.de +T. Demeyere, T.Demeyere@soton.ac.uk (2023) https://onetep.org +Copyright (c) 2017 Charles Thomas Johnson, JaeHwan Shim and JaeJun Yu +Copyright (c) 2017 Charles Thomas Johnson, Jae Hwan Shim and JaeJun Yu + +GPL-2.0 AND GPL-2.0-only AND LGPL-2.1-only AND LGPL-2.1-or-later + +--------------------------------------------------------- + +--------------------------------------------------------- + +dnspython 2.7.0 - ISC + + +Copyright (c) Google Inc. +Copyright (c) 2011 Nominum, Inc. +Copyright (c) 2014 Red Hat, Inc. +Copyright (c) 2015 Red Hat, Inc. +Copyright (c) 2016 Nominum, Inc. +Copyright (c) Dnspython Contributors +Copyright (c) 2001-2017 Nominum, Inc. +Copyright (c) 2003-2017 Nominum, Inc. +Copyright (c) 2004-2017 Nominum, Inc. +Copyright (c) 2006-2017 Nominum, Inc. +Copyright (c) 2009-2011 Nominum, Inc. +Copyright (c) 2009-2017 Nominum, Inc. +Copyright (c) 2012-2017 Nominum, Inc. +Copyright (c) 2016 Coresec Systems AB +Copyright (c) 2010, 2011 Nominum, Inc. +Copyright (c) 2001-2007, 2009-2011 Nominum, Inc. +Copyright (c) 2003-2007, 2009-2011 Nominum, Inc. +Copyright (c) 2004-2007, 2009-2011 Nominum, Inc. +Copyright (c) 2005-2007, 2009-2011 Nominum, Inc. +Copyright (c) 2003-2007, 2009, 2011 Nominum, Inc. +Copyright (c) 2006, 2007, 2009-2011 Nominum, Inc. +(c) 2009 Dennis Kaarsemaker +Copyright (c) 2000, 2001 Internet Software Consortium +Copyright (c) 2004-2007, 2009-2011, 2016 Nominum, Inc. + +ISC License + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") + +Copyright (c) 1995-2003 by Internet Software Consortium + +Permission to use, copy, modify, and /or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +isoduration 20.11.0 - ISC + + +Copyright (c) 2020 Victor Munoz + +ISC License + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") + +Copyright (c) 1995-2003 by Internet Software Consortium + +Permission to use, copy, modify, and /or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pexpect 4.9.0 - ISC + + +copyright u'2013, Noah Spurrier and contributors +Copyright (c) 2012, Noah Spurrier +Copyright (c) 2013-2014, Pexpect development team +Copyright (c) 2013-2016, Pexpect development team +Copyright (c) 2016, Martin Packman + +ISC License + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") + +Copyright (c) 1995-2003 by Internet Software Consortium + +Permission to use, copy, modify, and /or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +ptyprocess 0.7.0 - ISC + + +copyright u'2014, Thomas Kluyver +Copyright (c) 2012, Noah Spurrier +Copyright (c) 2013-2014, Pexpect development team + +ISC License + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") + +Copyright (c) 1995-2003 by Internet Software Consortium + +Permission to use, copy, modify, and /or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +astroid 3.3.8 - LGPL-2.1-only AND LGPL-2.1-or-later + + +copyrighted by the Free Software Foundation +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt + +LGPL-2.1-only AND LGPL-2.1-or-later + +--------------------------------------------------------- + +--------------------------------------------------------- + +charset-normalizer 3.4.1 - LGPL-2.1-only AND MIT AND MPL-1.1 + + +COPYRIGHT (c) FOOBAR +copyright 2023, Ahmed TAHRI +Copyright (c) 2025 Ahmed TAHRI +Copyright (c) 2025 TAHRI Ahmed R. +copyright (c) 2021 by Ahmed TAHRI +(c) 2012 Denny Vrandecic (http://simia.net/letters/) +Copyright (c) Ahmed TAHRI @Ousret (https://github.com/Ousret) +(c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + +LGPL-2.1-only AND MIT AND MPL-1.1 + +--------------------------------------------------------- + +--------------------------------------------------------- + +paramiko 3.5.0 - LGPL-2.1-or-later + + +(c) 2024 Jeff Forcier +copyright 2024 Jeff Forcier +Copyright 2007-2023 by the Sphinx team +(c) JS Foundation and other contributors +copyrighted by the Free Software Foundation +Copyright (c) 2013-2014 science + computing ag +Copyright JS Foundation and other contributors +Copyright (c) 2010 Sofian Brabez +Copyright (c) 2012 Olle Lundberg +Copyright (c) 2012 Yipit, Inc +Copyright (c) 2022 Patrick Spendrin +copyright https://docs.python.org/3.6/copyright.html +Copyright (c) 2021 Lew Gordon +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) 2008 Robey Pointer +Copyright (c) 2013 Torsten Landschoff +Copyright (c) 2003-2007 John Rochester +Copyright (c) 2019 Edgar Sousa +Copyright (c) 2003-2006 Robey Pointer +Copyright (c) 2003-2007 Robey Pointer +Copyright (c) 2003-2008 Robey Pointer +Copyright (c) 2003-2009 Robey Pointer +Copyright (c) 2003-2011 Robey Pointer +Copyright (c) 2005 John Arbash-Meinel +Copyright (c) 2006-2007 Robey Pointer +(c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors Underscore + +GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. + +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + + In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + + It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + + +Copyright (C) + +This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in + +the library `Frob' (a library for tweaking knobs) written + +by James Random Hacker. + +< signature of Ty Coon > , 1 April 1990 + +Ty Coon, President of Vice + +That's all there is to it! + +--------------------------------------------------------- + +--------------------------------------------------------- + +azure-identity 1.19.0 - LicenseRef-scancode-generic-cla AND MIT + + +Copyright (c) Microsoft Corporation + +LicenseRef-scancode-generic-cla AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +azure-storage-blob 12.24.0 - LicenseRef-scancode-generic-cla AND MIT + + +Copyright (c) Microsoft Corporation + +LicenseRef-scancode-generic-cla AND MIT + +--------------------------------------------------------- + +--------------------------------------------------------- + +pillow 11.1.0 - LicenseRef-scancode-secret-labs-2011 AND MIT-CMU + + +(c) Tavmjung Bah +Copyright 2020 Google LLC +Copyright 2014 Google Inc. +Copyright 2016 Google Inc. +copyright 2010-2011, Google +Copyright (c) 2018 Google LLC +Copyright (c) 2013 Eric Soroos +Copyright (c) 2020 by Pan Jing +Copyright (c) Eric Soroos 2016 +Copyright (c) Eric Soroos 2017 +Copyright (c) 2011 Google, Inc. +Copyright (c) 2002-2017, and GNU +Copyright (c) 2009 Fredrik Lundh +Copyright (c) Fredrik Lundh 1994 +Copyright (c) Fredrik Lundh 1995 +Copyright (c) Fredrik Lundh 1996 +Copyright (c) Fredrik Lundh 1997 +Copyright (c) Fredrik Lundh 1999 +Copyright (c) Fredrik Lundh 2009 +Copyright (c) 2004 by Secret Labs +Copyright (c) 2013 by Eric Soroos +Copyright (c) Secret Labs AB 1997 +Copyright (c) Secret Labs AB 1998 +Copyright (c) Secret Labs AB 1999 +Copyright (c) Secret Labs AB 2002 +Copyright (c) Secret Labs AB 2008 +Copyright 2008 The Bungee Project +Copyright (c) 2004 by Bob Ippolito +Copyright (c) 2006 by Tavmjong Bah +Copyright (c) Mickael Bonfill 2017 +Copyright (c) 1995 by Fredrik Lundh +Copyright (c) 1996 by Fredrik Lundh +Copyright (c) 1997 by Fredrik Lundh +Copyright (c) 1998-2001 Marti Maria +Copyright (c) 2002 by Fredrik Lundh +Copyright (c) 2003 by Fredrik Lundh +Copyright (c) 2004 by Fredrik Lundh +Copyright (c) 2005 by Fredrik Lundh +Copyright (c) 2006 by Fredrik Lundh +Copyright (c) 2009 by Fredrik Lundh +Copyright (c) 2012 by Brian Crowell +Copyright (c) Fredrik Lundh 1995-96 +Copyright (c) Fredrik Lundh 1995-97 +Copyright (c) Fredrik Lundh 1996-97 +Copyright (c) 1998 by Secret Labs AB +Copyright (c) 2002 by Kevin B. Kenny +Copyright (c) 2002 by Secret Labs AB +Copyright (c) 2003 by Secret Labs AB +Copyright (c) 2004 by William Baxter +Copyright (c) 2014 Alastair Houghton +Copyright (c) Secret Labs AB 1997-98 +Copyright (c) Secret Labs AB 1997-99 +Copyright (c) 1996-2000 Fredrik Lundh +Copyright (c) 1997 by Secret Labs AB. +Copyright (c) 1998 by Toby J Sargeant +Copyright (c) 1999 by Secret Labs AB. +Copyright (c) 2002-2003 Kevin Cazabon +Copyright (c) 2003 by Bitstream, Inc. +Copyright (c) 2004 by Secret Labs AB. +Copyright (c) 2006 by Secret Labs AB. +Copyright (c) 2016 by Mickael Bonfill +Copyright (c) Fredrik Lundh 1995-1997 +Copyright (c) Fredrik Lundh 1995-2003 +Copyright (c) Fredrik Lundh 1996-2001 +Copyright (c) Fredrik Lundh 1996-2003 +Copyright (c) Fredrik Lundh 1997-2004 +Copyright (c) 1987 Adobe Systems, Inc. +Copyright (c) 1995-96 by Fredrik Lundh +Copyright (c) 1998-2000 Secret Labs AB +Copyright (c) Secret Labs AB 1997-2001 +Copyright (c) Secret Labs AB 1997-2002 +Copyright (c) Secret Labs AB 1997-2003 +Copyright (c) Secret Labs AB 1997-2004 +Copyright (c) Secret Labs AB 1997-2005 +Copyright (c) Secret Labs AB 2002-2004 +Copyright (c) 2008 by Karsten Hiddemann +Copyright (c) 2014 by Alastair Houghton +copyright (c) 1991-1995, Thomas G. Lane +Copyright (c) 1995-1996 by Fredrik Lundh +Copyright (c) 1995-1997 by Fredrik Lundh +Copyright (c) 1995-2001 by Fredrik Lundh +Copyright (c) 1995-2002 by Fredrik Lundh +Copyright (c) 1995-2003 by Fredrik Lundh +Copyright (c) 1995-2004 by Fredrik Lundh +Copyright (c) 1995-2005 by Fredrik Lundh +Copyright (c) 1995-2006 by Fredrik Lundh +Copyright (c) 1995-2009 by Fredrik Lundh +Copyright (c) 1996-1997 by Fredrik Lundh +Copyright (c) 1996-2000 by Fredrik Lundh +Copyright (c) 1996-2003 by Fredrik Lundh +Copyright (c) 1996-2004 by Fredrik Lundh +Copyright (c) 1996-2006 by Fredrik Lundh +Copyright (c) 1997-1998 by Fredrik Lundh +Copyright (c) 1997-2003 by Fredrik Lundh +Copyright (c) 1997-2005 by Fredrik Lundh +Copyright (c) 1997-98 by Secret Labs AB. +Copyright (c) 1997-99 by Secret Labs AB. +Copyright (c) 1998-2003 by Fredrik Lundh +Copyright (c) 2000-2003 by Fredrik Lundh +Copyright (c) 2001-2002 by Fredrik Lundh +Copyright (c) 2001-2004 by Fredrik Lundh +Copyright (c) 2002-2004 by Fredrik Lundh +Copyright (c) 2003-2005 by Fredrik Lundh +Copyright 1984, 1987 Adobe Systems, Inc. +Copyright 2018 by Jack Halten Fahnestock +Copyright (c) 1995-2001 by Secret Labs AB +Copyright (c) 1997-1998 by Secret Labs AB +Copyright (c) 1997-1999 by Secret Labs AB +Copyright (c) 1997-2000 by Secret Labs AB +Copyright (c) 1997-2011 by Secret Labs AB +Copyright (c) 1998-2005 by Secret Labs AB +Copyright (c) 1998-2007 by Secret Labs AB +Copyright (c) 1999-2005 by Secret Labs AB +Copyright (c) 2001-2002 by Secret Labs AB +Copyright (c) 2001-2004 by Secret Labs AB +Copyright (c) 2002-2004 by Secret Labs AB +Copyright (c) 2003-2005 by Secret Labs AB +Copyright (c) 2015 Information Technology +Copyright (c) 2018 Dimitar Toshkov Zhekov +Copyright (c) 1997-2001 by Secret Labs AB. +Copyright (c) 1997-2002 by Secret Labs AB. +Copyright (c) 1997-2003 by Secret Labs AB. +Copyright (c) 1997-2004 by Secret Labs AB. +Copyright (c) 1997-2005 by Secret Labs AB. +Copyright (c) 1997-2006 by Secret Labs AB. +Copyright (c) 1997-2009 by Secret Labs AB. +Copyright (c) 1998-2003 by Secret Labs AB. +Copyright (c) 1998-2004 by Secret Labs AB. +Copyright (c) 2004 by Health Research Inc. +Copyright (c) 1993-1996 Lucent Technologies +Copyright (c) 1997-2007 Adobe Systems, Inc. +Copyright (c) 2000-2006 Adobe Systems, Inc. +Copyright (c) 2014 Coriolis Systems Limited +Copyright 2007 International Color Consortium +Copyright (c) 1994-1998 Sun Microsystems, Inc. +Copyright (c) 2014 by Coriolis Systems Limited +Copyright 1987-2001 Adobe Systems Incorporated +Copyright 1987-2004 Adobe Systems Incorporated +Copyright 1987-2006 Adobe Systems Incorporated +Copyright 1997-2006 Adobe Systems Incorporated +Copyright International Color Consortium, 2009 +Portions Copyright 1988 Digital Equipment Corp +Copyright (c) 1998-2000 by Scriptics Corporation +Copyright (c) 2020 Free Software Foundation, Inc. +Copyright (c) 2016 Marcin Kurczewski +Portions Copyright 1988 Digital Equipment Corporation +Copyright (c) 2010 Oliver Tonnhofer +Copyright (c) 2010 by Jeffrey A. Clark and contributors +Copyright (c) 2014 Dov Grobgeld +Copyright Contributors to the pythoncapi_compat project. +Copyright (c) 1995-2011 by Fredrik Lundh and contributors +Copyright (c) 2018 Roel Nieskens, https://pixelambacht.nl +Copyright (c) 2016-2023 Khaled Hosny +copyright 2003 kevin_cazabon@hotmail.com kevin@cazabon.com +Portions copyright 2015, Khaled Hosny +Copyright (c) 1987-1994 The Regents of the University of California +Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors +Copyright 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/).Noto +Copyright (c) 2002-2003 Kevin Cazabon kevin@cazabon.com https://www.cazabon.com +Portions copyright 1997, 2009, 2011 American Mathematical Society +copyright 1995-2011 Fredrik Lundh and contributors, 2010 Jeffrey A. Clark and contributors +Copyright 2002, 2003, 2005, 2008, 2009, 2010, 2012 GNU Freefont contributors. FreeMono FreeMono +copyrighted by the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation +Copyright 2016 Adobe (http://www.adobe.com/).Adobe Variable Font PrototypeRegular1.004 ADBO AdobeVFPrototype-Default + +LicenseRef-scancode-secret-labs-2011 AND MIT-CMU + +--------------------------------------------------------- + +--------------------------------------------------------- + +aioitertools 0.12.0 - MIT + + +Copyright 2022 Amethyst Reese +Copyright (c) 2022 Amethyst Reese +copyright Amethyst Reese (https://noswap.com) + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +annotated-types 0.7.0 - MIT + + +Copyright (c) 2022 the contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +anyio 4.8.0 - MIT + + +Alex Gronholm copyright 2018 +Copyright (c) 2018 Alex Gronholm + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +argon2-cffi 23.1.0 - MIT + + +Copyright (c) 2015 +Copyright (c) 2015 " + __author +copyright 2015, Hynek Schlawack +Copyright (c) 2015 Hynek Schlawack + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +argon2-cffi-bindings 21.2.0 - MIT + + +Copyright (c) 2015 Thomas Pornin +copyright (c) 2015 Thomas Pornin +Copyright (c) 2021 Hynek Schlawack +copyright (c) Samuel Neves, 2013-2015 +Copyright (c) 2001-2015 by Michael Shell +Copyright 2015 Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves +Copyright (c) 1993-2000 by Gerry Murray, Silvano Balemi, Jon Dixon, Peter N'uchter, Juergen von Hagen +copyright (c) 2015 Daniel Dinu, Dmitry Khovratovich (main authors), Jean-Philippe Aumasson and Samuel Neves + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +async-lru 2.0.4 - MIT + + +Copyright (c) 2017 Ocean S. A. https://ocean.io +Copyright (c) 2018 aio-libs team https://github.com/aio-libs +Copyright (c) 2016-2017 WikiBusiness Corporation http://wikibusiness.org + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +attrs 24.3.0 - MIT + + +(c) N Revealed +Copyright (c) 2015 Hynek Schlawack + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +autopep8 2.3.1 - MIT + + +Copyright (c) 2010-2011 Hideo Hattori +Copyright (c) 2011-2013 Hideo Hattori, Steven Myint +Copyright (c) 2006-2009 Johann C. Rocholl +Copyright (c) 2013-2016 Hideo Hattori, Steven Myint, Bill Wendling +Copyright (c) 2009-2013 Florent Xicluna + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +azure-core 1.32.0 - MIT + + +Copyright (c) Microsoft Corporation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +beautifulsoup4 4.12.3 - MIT + + +Copyright (c) Isaac Muse +Copyright (c) Leonard Richardson +copyright u'2012, Leonard Richardson +(c) Copyright 2012, Leonard Richardson +(c) Copyright 2013, Leonard Richardson +Copyright 2007-2016 by the Sphinx team +copyright u'2004-2015, Leonard Richardson +copyright u'2004-2020, Leonard Richardson +copyright u'2004-2023, Leonard Richardson +copyright u'2004-2024, Leonard Richardson +Copyright (c) 2004-2024 Leonard Richardson +Copyright (c) James Graham and other contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +blinker 1.9.0 - MIT + + +Copyright 2010 Jason Kirtland +copyright 2010 Jason Kirtland + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +cachetools 5.5.0 - MIT + + +copyright 2014-2024 Thomas Kemmer +Copyright (c) 2014-2024 Thomas Kemmer + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +cffi 1.17.1 - MIT + + +Copyright (c) 2002 Bo Thorsen +Copyright (c) 2002 Roger Sayle +Copyright (c) 2001 John Beniton +Copyright (c) 1996 Red Hat, Inc. +Copyright (c) 2002 Ranjit Mathew +Copyright (c) 1996-2003 Red Hat, Inc. +Copyright (c) 1996, 1998 Red Hat, Inc. +Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. +Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. +Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. +Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc. +Copyright (c) 2011, 2014, 2019, 2021 Anthony Green +copyright u'2012-2018, Armin Rigo, Maciej Fijalkowski + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +custodian 2024.10.16 - MIT + + +Copyright (c) 2011-2012 +Copyright (c) Materials Virtual Lab +Copyright 2012, The Materials Project +Copyright 2018, The Materials Project +Copyright 2020, The Materials Project + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +debugpy 1.8.11 - MIT + + +Copyright (c) 2016 Red Hat +Copyright Brainwy Software +Copyright (c) 2012, Ben Hoyt +Copyright (c) Yuli Fitterman +Copyright Brainwy Software Ltda +copyright Brainwy Software Ltda +copyright Brainwy software Ltda +copyright Microsoft Corporation +Copyright (c) Brainwy software Ltda +Copyright (c) Microsoft Corporation +Copyright (c) 2009-2014, Mario Vilas +Copyright (c) 2009-2012 Pierre Raybaut +Copyright (c) 1999-2002 by Fredrik Lundh +Copyright (c) 1999-2002 by Secret Labs AB +Copyright (c) 2010-2014 Benjamin Peterson +Copyright (c) 2010-2018 Benjamin Peterson +Copyright (c) 2011 The IPython Development Team +Copyright (c) 2012, the IPython Development Team +Copyright (c) 2008-2010, IPython Development Team +Copyright (c) 2006-2010 Python Software Foundation +Copyright (c) 2001, Janko Hauser +Copyright (c) 2008-2011 The IPython Development Team +Copyright (c) 2001, Nathaniel Gray +Copyright (c) 1995-2001 Corporation for National Research Initiatives +Copyright (c) 2001-2007, Fernando Perez. +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Python Software Foundation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +deprecated 1.2.15 - MIT + + +(c) Laurent LAPORTE +Copyright (c) 2017 Laurent LAPORTE +copyright 2017, Marcos CARDOSO & Laurent LAPORTE + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +e3nn 0.5.4 - MIT + + +copyright 2020, e3nn Developers +Copyright (c) 2011 , Paul D. Nation and Robert J. Johansson +Copyright (c) 2020, The Regents of the University of California, through Lawrence Berkeley National Laboratory + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +exceptiongroup 1.2.2 - MIT + + +Copyright (c) 2022 Alex Gronholm +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Python Software Foundation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +executing 2.1.0 - MIT + + +2021 Taneli Hukkinen +Copyright (c) 2019 Alex Hall +Copyright (c) 2021 Alex Hall +Copyright 2021 Taneli Hukkinen + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +future 1.0.0 - MIT + + +Copyright 2006 Google, Inc. +Copyright 2008 by Armin Ronacher +Copyright 2013 by the Jinja team +Copyright (c) 2013 - Damian Avila +Copyright (c) 2010 by Armin Ronacher +Copyright (c) 2000 Bastian Kleineidam +Copyright (c) 1999-2002 by Fredrik Lundh +Copyright (c) 1999-2002 by Secret Labs AB. +Copyright 2013-2024 Python Charmers, Australia +Copyright (c) 2001-2006 Python Software Foundation +Copyright (c) 2001-2007 Python Software Foundation +Copyright (c) 2001-2010 Python Software Foundation +Copyright (c) 2002-2006 Python Software Foundation +Copyright (c) 2002-2007 Python Software Foundation +Copyright (c) 2004-2006 Python Software Foundation +Copyright (c) 2013-2024 Python Charmers, Australia +Copyright 2000 by Timothy O'Malley +Copyright 2011 by Armin Ronacher. :license Flask Design +copyright u'2013-2019, Python Charmers Pty Ltd, Australia +(c) Copyright 2013-2019, Python Charmers Pty Ltd, Australia +Copyright (c) 2000 Luke Kenneth Casson Leighton +Copyright 2013-2024 Python Charmers (https://pythoncharmers.com) +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Python Software Foundation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +h11 0.14.0 - MIT + + +copyright 2016, Nathaniel J. Smith +Copyright (c) 2006, Jonathan E. Taylor +Copyright (c) 2006-2008 Scipy Developers +Copyright (c) 2009-2012 Statsmodels Developers +Copyright 2007, 2008 Chris Wanstrath chris@ozmm.org +Copyright (c) 2016 Nathaniel J. Smith and other contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +hydra-core 1.3.1 - MIT + + +(c) . name +Copyright (c) Facebook, Inc. and its affiliates + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +hydra-joblib-launcher 1.1.5 - MIT + + +Copyright (c) Facebook, Inc. and its affiliates. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +iniconfig 2.0.0 - MIT + + +(c) Ronny Pfannschmidt, Holger Krekel + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +isort 5.13.2 - MIT + + +Copyright 2018 Google LLC +Copyright 2019 Google LLC +Copyright 2011 VMware, Inc +Copyright 2013 Red Hat, Inc. +Copyright (c) 2021 Taneli Hukkinen +Copyright (c) 2009-2018, Marcel Hellkamp +Copyright (c) 2013 Timothy Edmund Crosley +Copyright (c) 2016 Timothy Edmund Crosley Under + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jedi 0.19.2 - MIT + + +copyright jedi contributors +Copyright (c) Maxim Kurnikov +Copyright (c) <2013> Permission +Copyright (c) 2015 Jukka Lehtosalo and contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jmespath 1.0.1 - MIT + + +Copyright (c) 2013 Amazon.com, Inc. or its affiliates + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jsonschema 4.23.0 - MIT + + +Julian Berman copyright 2013 +Copyright (c) 2012 Julian Berman +Copyright (c) 2013 Julian Berman + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +jsonschema-specifications 2024.10.1 - MIT + + +Julian Berman copyright f'2022 +Copyright (c) 2022 Julian Berman + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +latexcodec 3.0.0 - MIT + + +Copyright (c) 2003, 2008 David Eppstein +copyright 2011-2014, Matthias C. M. Troffaes +Copyright (c) 2011-2020 Matthias C. M. Troffaes +Copyright (c) 2011-2020 by Matthias C. M. Troffaes + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +markdown-it-py 3.0.0 - MIT + + +Copyright 2021 Taneli Hukkinen +Copyright (c) 2020 ExecutableBookProject +Copyright (c) 2014 Vitaly Puzrin, Alex Kocharin +Copyright 2014 Mathias Bynens + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +mccabe 0.7.0 - MIT + + +Copyright (c) Ned Batchelder +Copyright (c) 2011-2013 Tarek Ziade +Copyright (c) 2013 Florent Xicluna + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +mdurl 0.1.2 - MIT + + +Copyright (c) 2021 Taneli Hukkinen +Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin +Copyright Joyent, Inc. and other Node contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +monty 2024.7.30 - MIT + + +Copyright 2012, The Materials Project +Copyright 2013, The Materials Project +copyright 2022, Materials Virtual Lab +Copyright (c) 2014 Materials Virtual Lab +(c) Copyright 2022, Materials Virtual Lab +Copyright 2013, The Materials Virtual Lab +Copyright 2014, The Materials Virtual Lab +Copyright (c) 2008-2011 Volvox Development Team +Copyright 2014, The Materials Virtual Lab maintainer Shyue Ping Ong + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +msal 1.31.1 - MIT + + +Copyright (c) Microsoft Corporation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +msal-extensions 1.2.0 - MIT + + +Copyright (c) Microsoft Corporation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +nglview 3.1.4 - MIT + + +(c) 2005 Elsevier Inc. +Copyright (c) Schrodinger, LLC. +Copyright (c) 2013 Sergi Mansilla +Copyright (c) 2015 Alexander S. Rose +Copyright (c) 2011-2017, Gregor Aisch +Copyright (c) 2012 Niklas von Hertzen +Copyright (c) Jupyter Development Team +Copyright (c) 2010-2016 three.js authors +Copyright (c) 2010-2020 three.js authors +Copyright (c) 2014-2017, Alexander S Rose +copyright 2016, Alexander Rose, Hai Nguyen +Copyright JS Foundation and other contributors +Copyright OpenJS Foundation and other contributors +Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen +Copyright (c) 2007-present, Alexandru Marasteanu +Copyright OpenJS Foundation and other contributors, https://openjsf.org +Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University +Copyright (c) CSCS - Swiss National Supercomputing Centre // EDF - Electricite de France +Copyright (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors +(c) 2009-2024 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors Underscore +Copyright (c) 2010-2011 by // Laboratoire de Biochimie Theorique (CNRS), // Laboratoire d'Informatique Fondamentale d'Orleans Universite + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +opt-einsum 3.4.0 - MIT + + +Copyright (c) 2014 Daniel Smith +Copyright (c) 2018 Uber Technologies + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +opt-einsum-fx 0.1.4 - MIT + + +Copyright (c) 2021 Alby M. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +palettable 3.3.3 - MIT + + +developed by D.A Green, 2011 +Copyright (c) 2019 Matt Davis +Copyright (c) 2014, James R. A. Davenport and contributors +Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +parso 0.8.4 - MIT + + +Copyright 2006 Google, Inc. +Copyright (c) 2010 by Armin Ronacher +Copyright (c) <2013-2017> Permission +Copyright David Halter and Contributors +Copyright 2004-2005 Elemental Security, Inc. +Copyright 2014 David Halter and Contributors +Copyright (c) 2014-2016 Ian Lee +Copyright 2010 by Armin Ronacher. :license Flask Design +Copyright (c) 2017-???? Dave Halter +Copyright (c) 2006-2009 Johann C. Rocholl +Copyright (c) 2009-2014 Florent Xicluna +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Python Software Foundation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +platformdirs 4.3.6 - MIT + + +Copyright (c) 2010-202x The platformdirs + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +plotly 5.24.1 - MIT + + +(c) Ho (c) +(c) Kyle Simpson +(c) Sindre Sorhus +copyright 2019 Plotly, Inc. +(c) a href http://www.esri.com +Copyright (c) 2021 Plotly, Inc +Copyright 2012-2024, Plotly, Inc. +Copyright (c) 2016-2018 Plotly, Inc +Copyright (c) Jupyter Development Team +Copyright (c) 2014-2015, Jon Schlinkert +Copyright JS Foundation and other contributors +Portions Copyright (c) 2009 David Jones +copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc +Copyright (c) 2006 Johann C. Rocholl +portions Copyright (c) 2006 Nicko van Someren +Copyright OpenJS Foundation and other contributors +Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +(c) http://www.esri.com > ESRI ,'ortoInstaMaps' type':'raster','tiles' https://tilemaps.icgc.cat/mapfactory/wmts/orto_8_12/CAT3857 + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pluggy 1.5.0 - MIT + + +copyright 2016, Holger Krekel +Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +p-tqdm 1.4.2 - MIT + + +Copyright (c) 2024 Kyle Swanson + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pure-eval 0.2.3 - MIT + + +Copyright (c) 2019 Alex Hall + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pybtex 0.24.0 - MIT + + +Copyright (c) 1985 +Copyright (c) 2014 Jorrit Wronski +Copyright (c) 1994-2009 Erik Meijer +Copyright (c) 2003-2008 Michael Shell +Copyright (c) 2006-2016 Andrey Golovizin +Copyright (c) 2014 Matthias C. M. Troffaes +Copyright (c) 1988, 2010 Oren Patashnik. Unlimited +Copyright (c) 1999-2004 Jens Berger (http://www.jurabib.org) +Copyright (c) 1984, 1985, 1988, 2010 Howard Trickey and Oren Patashnik. Unlimited + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pycodestyle 2.12.1 - MIT + + +Copyright (c) 2014-2016 Ian Lee +Copyright (c) 2014-2020 Ian Lee +Copyright (c) 2006-2009 Johann C. Rocholl +Copyright (c) 2009-2014 Florent Xicluna + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pydantic-core 2.27.2 - MIT + + +Copyright (c) 2022 Samuel Colvin + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pydantic-settings 2.7.1 - MIT + + +Copyright (c) 2022 Samuel Colvin and other contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pydash 8.0.4 - MIT + + +Summary copyright 2013 +Copyright (c) 2020 Derrick Gilland + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pyjwt 2.10.1 - MIT + + +Copyright 2015-2022 Jose Padilla +copyright 2015-2022, Jose Padilla +Copyright (c) 2015-2022 Jose Padilla + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pymatgen 2024.10.29 - MIT + + +Copyright 2016 +Copyright (c) 2011-2012 +created by Bartel et al. (2018) +Copyright 2011, The Materials Project +Copyright 2012, The Materials Project +Copyright 2013, The Materials Project +Copyright 2014, The Materials Project +Copyright 2016, The Materials Project +Copyright 2017, The Materials Project +Copyright 2018, The Materials Project +Copyright 2019, The Materials Project +Copyright 2020, The Materials Project +Copyright 2021, The Materials Project +Copyright 2022, The Materials Project +Copyright 2024, The Materials Project +Copyright (c) Pymatgen Development Team +Copyright 2015-2021 DueCredit developers +Copyright 2013, The Materials Virtual Lab +Copyright 2018, The Materials Virtual Lab +Copyright 2011-2020, The Materials Project +Copyright 2012-2020, The Materials Project +Copyright 2018-2022, The Materials Project +Copyright 2019-2021, The Materials Project +copyrighted by the Free Software Foundation +Copyright (c) 1989, 1991 Free Software Foundation, Inc. +Copyright (c) 2020 Florian Knoop, Thomas A.R.Purcell, Matthias Scheffler, Christian Carbogno +Copyright (c) 2004-2022, NetworkX Developers Aric Hagberg Dan Schult + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pymatviz 0.8.2 - MIT + + +Copyright (c) 2021 Janosh Riebesell + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pytest 8.3.4 - MIT + + +Copyright (c) 2014, Gregory Boissinot +Copyright (c) 2004 Holger Krekel and others +copyright 2015, holger krekel and pytest-dev team +Copyright Holger Krekel and others, 2004. Distributed + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pytz 2024.2 - MIT + + +Copyright (c) 2003-2019 Stuart Bishop + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +pyyaml 6.0.2 - MIT + + +Copyright (c) 2017-2021 Ingy dot Net +Copyright (c) 2006-2016 Kirill Simonov + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +referencing 0.35.1 - MIT + + +Julian Berman copyright f'2022 +Copyright (c) 2022 Julian Berman + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +rfc3339-validator 0.1.4 - MIT + + +Copyright (c) 2019, Nicolas Aimetti + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +rfc3986-validator 0.1.1 - MIT + + +Copyright (c) 2019, Nicolas Aimetti + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +rich 13.9.4 - MIT + + +Copyright (c) 2020 Will McGugan +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +rich-click 1.7.4 - MIT + + +Copyright (c) 2022 Phil Ewels + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +rpds-py 0.22.3 - MIT + + +Copyright (c) 2023 Julian Berman +Copyright (c) 2022 Tobias Gustafsson + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +seekpath 2.1.0 - MIT + + +copyright 2016-, Giovanni Pizzi, PAUL +Copyright (c), 2016-2023, Giovanni Pizzi, PAUL + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +six 1.17.0 - MIT + + +Copyright (c) 2010-2024 Benjamin Peterson + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +smart-open 7.1.0 - MIT + + +Copyright (c) 2015 Radim Rehurek +Copyright (c) 2015 Radim Rehurek +Copyright (c) 2019 Radim Rehurek +Copyright (c) 2020 Radim Rehurek +Copyright (c) 2020 Nicolas Mitchell +Copyright (c) 2020 Radim Rehurek +Copyright (c) 2015-now Radim Rehurek + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +soupsieve 2.6 - MIT + + +Copyright (c) 2018 Isaac Muse +Copyright (c) 2018 - 2024 Isaac Muse +Copyright (c) 2018 - 2024 a href https://github.com/facelessuser + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +sshtunnel 0.4.0 - MIT + + +Copyright (c) 2014-2019 Pahaz White + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +stack-data 0.6.3 - MIT + + +Copyright (c) 2019 Alex Hall + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tabulate 0.9.0 - MIT + + +Copyright (c) 2011-2020 Sergey Astanin and contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +termcolor 2.5.0 - MIT + + +Copyright (c) 2008-2011 Volvox Development Team + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +toml 0.10.2 - MIT + + +Copyright 2017 Jack Evans +Copyright 2016 Google Inc. +Copyright 2017 Nate Prewitt +Copyright 2017 Samuel Vasko +Copyright 2019 Filippo Broggini +Copyright 2015-2016 Julien Enselme +Copyright 2013-2019 William Pearson + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tomli 2.2.1 - MIT + + +2021 Taneli Hukkinen +Copyright 2021 Taneli Hukkinen +Copyright (c) 2021 Taneli Hukkinen + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tomlkit 0.13.2 - MIT + + +Copyright (c) 2018 TOML authors +copyright 2021, Sebastien Eustace +Copyright (c) 2018 Sebastien Eustace +Copyright Rebecca Turner + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +torch-ema 0.3 - MIT + + + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +torch-geometric 2.6.1 - MIT + + + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +uri-template 1.3.0 - MIT + + +Copyright (c) 2020 Peter Linss + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +urllib3 1.26.20 - MIT + + +Copyright 2015 Google Inc. +Copyright (c) 2010-2020 Benjamin Peterson +Copyright (c) 2015-2016 Will Bond +Copyright (c) 2008-2020 Andrey Petrov and contributors +Copyright (c) 2012 Senko Rasic + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +wcwidth 0.2.13 - MIT + + +(c) 2023 Unicode(r), Inc. +copyright 2017, Jeff Quast +Copyright (c) 2014 Jeff Quast + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +tqdm 4.67.1 - MIT AND MPL-2.0 + + +Copyright (c) 2013 noamraph +(c) Noam Yorav-Raphael, original author +(c) Casper da Costa-Luis casperdcl (https://github.com/casperdcl) + +MIT AND MPL-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +pyparsing 3.2.1 - MIT AND Python-2.0 + + +Copyright 2004-2010 +Copyright (c) 2021 Dot +Copyright 2004, Paul McGuire +Copyright 2006, Paul McGuire +Copyright 2008 Chris Lambrou +Copyright 2008, Paul McGuire +Copyright 2010, Paul McGuire +Copyright 2011, Paul McGuire +Copyright 2015, Paul McGuire +Copyright 2016, Paul McGuire +Copyright 2018, Paul McGuire +Copyright 2019, Paul McGuire +Copyright 2020, Paul McGuire +Copyright 2021, Paul McGuire +Copyright 2023, Paul McGuire +Copyright 2024, Paul McGuire +Copyright Paul McGuire, 2019 +Copyright Paul McGuire, 2021 +copyright 2006, Paul McGuire +Copyright, 2010, Paul McGuire +Copyright, 2007 - Paul McGuire +Copyright, 2012 - Paul McGuire +Copyright 2006, by Paul McGuire +Copyright 2008, by Paul McGuire +Copyright 2012, Paul T. McGuire +Copyright 2022, by Paul McGuire +Copyright 2024, by Paul McGuire +Copyright (c) 2003, Paul McGuire +Copyright (c) 2004, Paul McGuire +Copyright (c) 2006, Paul McGuire +Copyright (c) 2016, Paul McGuire +Copyright (c) 2024, Paul McGuire +Copyright 2010,2019 Paul McGuire +Copyright, 2006, by Paul McGuire +Copyright 2002-2021, Paul McGuire +Copyright 2005-2006, Paul McGuire +Copyright 2009, 2011 Paul McGuire +Copyright (c) 2018 Paul T. McGuire +Copyright Ellis & Grant, Inc. 2005 +Copyright 2003-2019 by Paul McGuire +Copyright 2011,2015 Paul T. McGuire +Copyright (c) 2003,2019 Paul McGuire +Copyright (c) 2006,2016 Paul McGuire +Copyright 2003, 2019 by Paul McGuire +Copyright 2004-2016, by Paul McGuire +Copyright 2007, 2023 by Paul McGuire +Copyright 2007-2011, by Paul McGuire +Copyright 2010, 2019 by Paul McGuire +Copyright 2012, 2019 Paul T. McGuire +copyright 2018-2024, Paul T. McGuire +Copyright (c) 2003,2016, Paul McGuire +Copyright (c) 2004, 2006 Paul McGuire +Copyright (c) 2004-2016, Paul McGuire +Copyright copy 2003-2024 Paul McGuire +Copyright (c) 2006, 2019, Paul McGuire +Copyright (c) 2003-2022 Paul T. McGuire +Copyright (c) 2004-2011 Paul T. McGuire +Copyright (c) 2006, 2016, 2023, Paul McGuire +Copyright (c) 2006, Estrate, the Netherlands +Copyright 1989 by Carnegie Mellon University +Copyright Petri Savolainen +Copyright 2004, by Alberto Santini http://www.albertosantini.it/chess + +MIT AND Python-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +certifi 2024.12.14 - MPL-2.0 + + +(c) 2006 Entrust, Inc. +(c) 1999 Entrust.net Limited +(c) 2009 Entrust, Inc. - for +(c) 2012 Entrust, Inc. - for +(c) 2006 Entrust, Inc. Label Entrust Root Certification +(c) 1999 Entrust.net Limited Label Entrust.net Premium 2048 Secure Server CA Serial + +Mozilla Public License Version 2.0 + + 1. Definitions + + 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + + 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. + + 1.3. "Contribution" means Covered Software of a particular Contributor. + + 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + + 1.5. "Incompatible With Secondary Licenses" means + + (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. + + 1.6. "Executable Form" means any form of the work other than Source Code Form. + + 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. + + 1.8. "License" means this document. + + 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + + 1.10. "Modifications" means any of the following: + + (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or + + (b) any new file in Source Code Form that contains any Covered Software. + + 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + + 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + + 1.13. "Source Code Form" means the form of the work preferred for making modifications. + + 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. License Grants and Conditions + + 2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and + + (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + + 2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + + 2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: + + (a) for any code that a Contributor has removed from Covered Software; or + + (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or + + (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. + + This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + + 2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + + 2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + + 2.6. Fair Use + + This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + + 2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + + 3. Responsibilities + + 3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. + + 3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and + + (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. + + 3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + + 3.4. Notices + + You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + + 3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + + 4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Termination + + 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. + + 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + + 6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + + 7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + + 8. Litigation + + Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. + + 9. Miscellaneous + + This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. + + 10. Versions of the License + + 10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + + 10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + + 10.3. Modified Versions + + If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + + 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + + If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice + +This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + +This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. + +--------------------------------------------------------- + +--------------------------------------------------------- + +fqdn 1.5.1 - MPL-2.0 + + + +Mozilla Public License Version 2.0 + + 1. Definitions + + 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + + 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. + + 1.3. "Contribution" means Covered Software of a particular Contributor. + + 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + + 1.5. "Incompatible With Secondary Licenses" means + + (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. + + 1.6. "Executable Form" means any form of the work other than Source Code Form. + + 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. + + 1.8. "License" means this document. + + 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + + 1.10. "Modifications" means any of the following: + + (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or + + (b) any new file in Source Code Form that contains any Covered Software. + + 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + + 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + + 1.13. "Source Code Form" means the form of the work preferred for making modifications. + + 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. License Grants and Conditions + + 2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and + + (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + + 2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + + 2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: + + (a) for any code that a Contributor has removed from Covered Software; or + + (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or + + (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. + + This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + + 2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + + 2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + + 2.6. Fair Use + + This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + + 2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + + 3. Responsibilities + + 3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. + + 3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and + + (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. + + 3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + + 3.4. Notices + + You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + + 3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + + 4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Termination + + 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. + + 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + + 6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + + 7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + + 8. Litigation + + Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. + + 9. Miscellaneous + + This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. + + 10. Versions of the License + + 10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + + 10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + + 10.3. Modified Versions + + If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + + 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + + If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice + +This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + +This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. + +--------------------------------------------------------- + +--------------------------------------------------------- + +defusedxml 0.7.1 - PSF-2.0 + + +Copyright (c) 2013-2017 by Christian Heimes +Copyright (c) 2013 by Christian Heimes +Copyright (c) 2013-2017 by Christian Heimes +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Python Software Foundation + +PSF-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +matplotlib 3.8.4 - PSF-2.0 + + +(c) Tavmjong Bah +(c) Tavmjung Bah +Copyright Font's +Copyright xa9 2017 +b'Copyright xa9 2017 +(c) Frank Siegert 1996 +(c) 2003 by Bitstream, Inc. +Copyright +X11R4 release, copyright M.I.T. +Copyright (c) 2010 Doug Hellmann +Copyright 2010-2012, Google Inc. +Copyright (c) 2002 Hansruedi Baer +Copyright (c) 2003 Hansruedi Baer +Copyright (c) 2009 Pierre Raybaut +copyrighted by C.B. Barber. Qhull +Copyright (c) 2006 by Tavmjong Bah +Copyright (c) 2007-2008 Permission +copyrighted by the Geometry Center +Copyright (c) 1993-2020 C.B. Barber +Copyright (c) 2011 Ethan Schoonover +Copyright (c) 2002 by Kevin B. Kenny +Copyright (c) 1994, Basil K. Malyshev +Copyright (c) 2003 by Bitstream, Inc. +Copyright (c) 2010, Bartosz Telenczuk +copyright 2014, Matplotlib developers +(c) 2001-2010 by the STI Pub Companies +Copyright (c) 2002-2011 John D. Hunter +ECopyright (c) 2003 by Bitstream, Inc. +FCopyright (c) 2003 by Bitstream, Inc. +Copyright (c) 2001-2004 by Fredrik Lundh +Copyright (c) 2002-2005 Maxim Shemanarev +Copyright 2004 John Gill and John Hunter +Copyright The Matplotlib development team +Copyright (c) 1993-1996 Lucent Technologies +Copyright (c) 1994, 1995, Basil K. Malyshev +Portions copyright (c) 1990 by Elsevier, Inc. +Copyright (c) 1994-1998 Sun Microsystems, Inc. +Copyright (c) 2012- Matplotlib Development Team +Copyright (c) 1997 American Mathematical Society +Copyright (c) 1998-2000 by Scriptics Corporation +Copyright (c) 2001-2010 by the STI Pub Companies +Copyright 1995, Trinity College Computing Center +LCopyright (c) 2001-2010 by the STI Pub Companies +Copyright (c) 1989, 1991 Adobe Systems Incorporated +Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic +Copyright (c) 2005 Tony Juricic (tonygeek@yahoo.com) +Portions copyright (c) 1998-2003 by MicroPress, Inc. +Copyright (c) Jeremy O'Donoghue & John Hunter, 2003-4 +Copyright (c) 1997, 2009 American Mathematical Society +(c) Copyright 1989-1992, Bitstream Inc., Cambridge, MA. +Copyright 1990 as an unpublished work by Bitstream Inc. +Copyright (c) 1985, 1987, 1988 Adobe Systems Incorporated +Copyright (c) 1989, 1990, 1991 Adobe Systems Incorporated +Copyright (c) 1989, 1990, 1991, Adobe Systems Incorporated +Copyright (c) 2009 John Horigan (http://www.antigrain.com) +Copyright 2020- by the Matplotlib development team. :license +Copyright (c) 1985, 1987, 1988, 1989 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1988, 1991 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1989, 1990 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1989, 1991 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1989, 1992 Adobe Systems Incorporated +Copyright (c) 1996. The Regents of the University of California +Copyright (c) 2002-2005 Maxim Shemanarev (http://antigrain.com/) +Copyright (c) 2003-2004 Andrew Straw, Jeremy O'Donoghue and others +Copyright (c) 1987-1994 The Regents of the University of California +Copyright (c) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1989, 1990, 1991 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated +Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated +Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated +Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated +Copyright (c) 1997, 2009, American Mathematical Society (http://www.ams.org) +Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University +copyrighted by the Regents of the University of California, Sun Microsystems, Inc., Scriptics Corporation +copyright 2002-2012 John Hunter, Darren Dale, Eric Firing, Michael Droettboom and the Matplotlib development team f'2012- sourceyear The Matplotlib development team + +PSF-2.0 + +--------------------------------------------------------- + +--------------------------------------------------------- + +typing-extensions 4.12.2 - Python-2.0 AND Python-2.0 AND BSD-3-Clause AND Python-2.0 AND BSD-3-Clause AND 0BSD + + +Copyright (c) 1995-2001 Corporation for National Research Initiatives +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation + +Python-2.0 AND Python-2.0 AND BSD-3-Clause AND Python-2.0 AND BSD-3-Clause AND 0BSD + +--------------------------------------------------------- + +--------------------------------------------------------- + +email-validator 2.2.0 - Unlicense + + + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and + +successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +--------------------------------------------------------- + +--------------------------------------------------------- + +filelock 3.16.1 - Unlicense + + + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and + +successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +--------------------------------------------------------- + diff --git a/jointContribution/mattergen/README.md b/jointContribution/mattergen/README.md new file mode 100644 index 00000000..0802d943 --- /dev/null +++ b/jointContribution/mattergen/README.md @@ -0,0 +1,378 @@ + +

+

+ MatterGen logo +

+

+ +

+ +[![DOI](https://img.shields.io/badge/DOI-10.1038%2Fs41586--025--08628--5-blue)](https://www.nature.com/articles/s41586-025-08628-5) +[![arXiv](https://img.shields.io/badge/arXiv-2312.03687-blue.svg?logo=arxiv&logoColor=white.svg)](https://arxiv.org/abs/2312.03687) +[![Requires Python 3.10+](https://img.shields.io/badge/Python-3.10+-blue.svg?logo=python&logoColor=white)](https://python.org/downloads) +

+ +MatterGen is a generative model for inorganic materials design across the periodic table that can be fine-tuned to steer the generation towards a wide range of property constraints. + +This is a reimplementation of the original [MatterGen](https://github.com/microsoft/mattergen) repository using the [PaddlePaddle](https://www.paddlepaddle.org.cn/) framework. + +The original [MatterGen](https://github.com/microsoft/mattergen) repositoryis licensed under the MIT license. + +## Table of Contents +- [Table of Contents](#table-of-contents) +- [To-do List](#to-do-list) +- [Results on MP20](#results-on-mp20) + - [Pretrain base model](#pretrain-base-model) + - [Training](#training) + - [Generation](#generation) + - [Evaluation](#evaluation) +- [Installation](#installation) +- [Get started with a pre-trained model](#get-started-with-a-pre-trained-model) +- [Generating materials](#generating-materials) + - [Unconditional generation](#unconditional-generation) + - [Property-conditioned generation](#property-conditioned-generation) + - [Multiple property-conditioned generation](#multiple-property-conditioned-generation) +- [Evaluation](#evaluation-1) +- [Train MatterGen yourself](#train-mattergen-yourself) + - [Pre-process a dataset for training](#pre-process-a-dataset-for-training) + - [Training](#training-1) + - [Fine-tuning on property data](#fine-tuning-on-property-data) + - [Multi-property fine-tuning](#multi-property-fine-tuning) + - [Fine-tune on your own property data](#fine-tune-on-your-own-property-data) +- [Data release](#data-release) + - [Training datasets](#training-datasets) + - [Reference dataset](#reference-dataset) +- [Citation](#citation) +- [Responsible AI Transparency Documentation](#responsible-ai-transparency-documentation) + + +## To-do List + + [x] Pretrain base model + - [x] training + - [x] generation + - [x] evaluation + + [x] Finetune with property constraints + - [x] chemical_system + - [x] space_group + - [x] dft_mag_density + - [x] dft_band_gap + - [x] ml_bulk_modulus + - [x] dft_mag_density_hhi_score + - [x] chemical_system_energy_above_hull + - [x] Multi-property fine-tuning + + + +## Results on MP20 +We train Mattergen from scratch on the `mp_20` dataset and subsequently finetune it with property constraints. + +| Base model | Dataset | train(loss) | val(loss) | +| :-------------------------------------------------------------------------------------: | :-----: | :---------: | :-------: | +| [Original](https://github.com/microsoft/mattergen) | `mp_20` | 0.3484 | 0.3794 | +| [This repo](https://github.com/PaddlePaddle/PaddleMaterial/jointContribution/mattergen) | `mp_20` | 0.3459 | 0.3735 | + + +| chemical_system | Dataset | train(loss) | val(loss) | +| :-------------------------------------------------------------------------------------: | :-----: | :---------: | :-------: | +| [Original](https://github.com/microsoft/mattergen) | `mp_20` | 0.2761 | 0.3134 | +| [This repo](https://github.com/PaddlePaddle/PaddleMaterial/jointContribution/mattergen) | `mp_20` | 0.2803 | 0.3161 | + +| dft_band_gap | Dataset | train(loss) | val(loss) | +| :-------------------------------------------------------------------------------------: | :-----: | :---------: | :-------: | +| [Original](https://github.com/microsoft/mattergen) | `mp_20` | 0.3194 | 0.3679 | +| [This repo](https://github.com/PaddlePaddle/PaddleMaterial/jointContribution/mattergen) | `mp_20` | 0.3057 | 0.3547 | + +| dft_mag_density | Dataset | train(loss) | val(loss) | +| :-------------------------------------------------------------------------------------: | :-----: | :---------: | :-------: | +| [Original](https://github.com/microsoft/mattergen) | `mp_20` | 0.3211 | 0.3692 | +| [This repo](https://github.com/PaddlePaddle/PaddleMaterial/jointContribution/mattergen) | `mp_20` | 0.3112 | 0.3682 | + + +| dft_bulk_modulus | Dataset | train(loss) | val(loss) | +| :-------------------------------------------------------------------------------------: | :-----: | :---------: | :-------: | +| [Original](https://github.com/microsoft/mattergen) | `mp_20` | 0.2478 | 0.3039 | +| [This repo](https://github.com/PaddlePaddle/PaddleMaterial/jointContribution/mattergen) | `mp_20` | 0.2747 | 0.2931 | + + +### Pretrain base model + +#### Training + +```bash +# single gpu +PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py +# multi gpu +PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="0,1,2,3" scripts/run.py +``` +Warning: The `total_batch_size` should be 128. It is calculated as `num_gpus * batch_size`. You can modify this setting in the `mp_20.yaml` file located at `PaddleMaterial/jointContribution/mattergen/mattergen/conf/data_module/`. + +#### Generation + +```bash +PYTHONPATH=$PWD python scripts/generate.py results_mp20/ outputs/xxx/xxx/output --batch_size=128 --num_batches 8 +``` + +#### Evaluation +```bash +export RESULTS_PATH=results_mp20/generated_crystals_cif.zip +export RELAXED_PATH=results_mp20/generated_crystals_cif_relaxed.zip +export ENERGIES_PATH=results_mp20/generated_crystals_energies.npy +export SAVE_PATH=results_mp20 + +export PYTHONPATH=$PWD +python scripts/evaluate.py \ + --structures_path=$RESULTS_PATH \ + --relaxed_structures_path=$RELAXED_PATH \ + --energies_path=$ENERGIES_PATH \ + --structure_matcher='disordered' \ + --save_as="$SAVE_PATH/metrics.json" +``` + + +## Installation + +1. Download this repository: + ```bash + git clone https://github.com/PaddlePaddle/PaddleMaterial.git + cd jointContribution/mattergen + ``` + +2. Create a new conda environment and activate it. + ```bash + conda create -n pp_mattergen python=3.10 + conda activate pp_mattergen + ``` + +3. Install [PaddlePaddle](https://www.paddlepaddle.org.cn/install/quick?docurl=undefined) according to the commands on the official website. For example, if you are using a GPU with CUDA 11.8: + ```bash + python -m pip install paddlepaddle-gpu==3.0.0rc1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ + ``` +4. Install requirements: + ```bash + pip install -r requirements.txt + ``` +5. ~~Install [paddle_scatter](https://github.com/PFCCLab/paddle_scatter). (The code repository includes built-in paddle_scatter support, so installation is unnecessary.)~~ + + +6. Due to the current incompatibility of PGL with the latest version of Paddle, it is necessary to modify some code within the installation path after installing PGL. The modification can be automatically completed through the following command: + ```bash + python fix_pgl.py + ``` +7. Finshed installation. + + + +## Get started with a pre-trained model +We have converted the model weights provided in the original repository, which you can download from [here](https://pan.baidu.com/s/1YO1ZKUNvdU6xxP9GuI9p1g?pwd=u4t6). +* `mattergen_base`: unconditional base model +* `chemical_system`: fine-tuned model conditioned on chemical system +* `space_group`: fine-tuned model conditioned on space group +* `dft_mag_density`: fine-tuned model conditioned on magnetic density from DFT +* `dft_band_gap`: fine-tuned model conditioned on band gap from DFT +* `ml_bulk_modulus`: fine-tuned model conditioned on bulk modulus from ML predictor +* `dft_mag_density_hhi_score`: fine-tuned model jointly conditioned on magnetic density from DFT and HHI score +* `chemical_system_energy_above_hull`: fine-tuned model jointly conditioned on chemical system and energy above hull from DFT +* `**_mp20`: pretrained or fine-tuned model on the `mp_20` dataset. + + +## Generating materials +### Unconditional generation +To sample from the pre-trained base model, run the following command. +```bash +export MODEL_PATH=checkpoints/mattergen_base # Or provide your own model +export RESULTS_PATH=results/ # Samples will be written to this directory +export PYTHONPATH=$PWD +# generate batch_size * num_batches samples +python scripts/generate.py $RESULTS_PATH $MODEL_PATH --batch_size=16 --num_batches 1 +``` +This script will write the following files into `$RESULTS_PATH`: +* `generated_crystals_cif.zip`: a ZIP file containing a single `.cif` file per generated structure. +* `generated_crystals.extxyz`, a single file containing the individual generated structures as frames. +* If `--record-trajectories == True` (default): `generated_trajectories.zip`: a ZIP file containing a `.extxyz` file per generated structure, which contains the full denoising trajectory for each individual structure. +> [!TIP] +> For best efficiency, increase the batch size to the largest your GPU can sustain without running out of memory. +### Property-conditioned generation +With a fine-tuned model, you can generate materials conditioned on a target property. +For example, to sample from the model trained on magnetic density, you can run the following command. +```bash +export MODEL_NAME=dft_mag_density +export MODEL_PATH="checkpoints/$MODEL_NAME" # Or provide your own model +export RESULTS_PATH="results/$MODEL_NAME/" # Samples will be written to this directory, e.g., `results/dft_mag_density` +export PYTHONPATH=$PWD +# Generate conditional samples with a target magnetic density of 0.15 +python scripts/generate.py $RESULTS_PATH $MODEL_PATH --batch_size=16 --checkpoint_epoch=latest --properties_to_condition_on="{'dft_mag_density': 0.15}" --diffusion_guidance_factor=2.0 +``` + +For a chemical system, you should use a hyphen ('-') to separate the components, such as: +```bash +export MODEL_NAME=chemical_system +export MODEL_PATH="checkpoints/$MODEL_NAME" # Or provide your own model +export RESULTS_PATH="results/$MODEL_NAME/" # Samples will be written to this directory, e.g., `results/chemical_system` +export PYTHONPATH=$PWD +python scripts/generate.py $RESULTS_PATH $MODEL_PATH --batch_size=16 --checkpoint_epoch=latest --properties_to_condition_on="{'chemical_system': 'Mo-Si'}" --diffusion_guidance_factor=2.0 +``` + + +> [!TIP] +> The argument `--diffusion-guidance-factor` corresponds to the $\gamma$ parameter in [classifier-free diffusion guidance](https://sander.ai/2022/05/26/guidance.html). Setting it to zero corresponds to unconditional generation, and increasing it further tends to produce samples which adhere more to the input property values, though at the expense of diversity and realism of samples. + +### Multiple property-conditioned generation +You can also generate materials conditioned on more than one property. For instance, you can use the pre-trained model located at `checkpoints/chemical_system_energy_above_hull` to generate conditioned on chemical system and energy above the hull, or the model at `checkpoints/dft_mag_density_hhi_score` for joint conditioning on [HHI score](https://en.wikipedia.org/wiki/Herfindahl%E2%80%93Hirschman_index) and magnetic density. +Adapt the following command to your specific needs: +```bash +export MODEL_NAME=chemical_system_energy_above_hull +export MODEL_PATH="checkpoints/$MODEL_NAME" # Or provide your own model +export RESULTS_PATH="results/$MODEL_NAME/" # Samples will be written to this directory, e.g., `results/dft_mag_density` +export PYTHONPATH=$PWD +python scripts/generate.py $RESULTS_PATH $MODEL_PATH --batch_size=16 --checkpoint_epoch=latest --properties_to_condition_on="{'energy_above_hull': 0.05, 'chemical_system': 'Li-O'}" --diffusion_guidance_factor=2.0 +``` +## Evaluation + +Once you have generated a list of structures contained in `$RESULTS_PATH` (either using MatterGen or another method), you can relax the structures and compute novelty, uniqueness, stability (using energy by DFT), and other metrics via the following command: + +```bash +export RELAXED_PATH=your relaxed structures path/generated_crystals_cif_relaxed.zip +export ENERGIES_PATH=your relaxed structures energy path/generated_crystals_energies.npy + +export PYTHONPATH=$PWD +python scripts/evaluate.py \ + --structures_path=$RESULTS_PATH/generated_crystals_cif.zip \ + --relaxed_structures_path=$RELAXED_PATH \ + --energies_path=$ENERGIES_PATH \ + --structure_matcher='disordered' \ + --save_as="$RESULTS_PATH/metrics.json" +``` + +This script will write `metrics.json` containing the metric results to `$RESULTS_PATH` and will print it to your console. + +Here, we expect `energies.npy` to be a numpy array with the entries being `float` energies in the same order as the structures read from `$RESULTS_PATH`. + +## Train MatterGen yourself +Before we can train MatterGen from scratch, we have to unpack and preprocess the dataset files. + +### Pre-process a dataset for training + +You can run the following command for `mp_20`: +```bash +unzip data-release/mp-20/mp_20_chemical_system.zip -d datasets +PYTHONPATH=$PWD python scripts/csv_to_dataset.py --csv-folder datasets/mp_20/ --dataset-name mp_20_chemical_system --cache-folder datasets/cache +``` +You will get preprocessed data files in `datasets/cache/mp_20`. + +To preprocess our larger `alex_mp_20` dataset, run: +```bash +unzip data-release/alex-mp/alex_mp_20.zip -d datasets +PYTHONPATH=$PWD python scripts/csv_to_dataset.py --csv-folder datasets/alex_mp_20/ --dataset-name alex_mp_20 --cache-folder datasets/cache +``` +This will take some time (~1h). You will get preprocessed data files in `datasets/cache/alex_mp_20`. + +### Training + + +You can train the MatterGen base model on `mp_20` using the following command. + +```bash +# single gpu +PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py +# multi gpu +PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="0,1,2,3" scripts/run.py +``` +Warning: The `total_batch_size` should be 128. It is calculated as `num_gpus * batch_size`. You can modify this setting in the `mp_20.yaml` file located at `mattergen/conf/data_module/`. + + +The validation loss (`loss_val`) should reach 0.4 after 360 epochs (about 80k steps). The output checkpoints can be found at `outputs/singlerun/${now:%Y-%m-%d}/${now:%H-%M-%S}/output`. We call this folder `$MODEL_PATH` for future reference. + + +To train the MatterGen base model on alex_mp_20, use the following command: +```bash +# single gpu +PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py data_module=alex_mp_20 +# multi gpu +PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="0,1,2,3" scripts/run.py data_module=alex_mp_20 +``` + +Warning: The total_batch_size should be 512. It is calculated as num_gpus * batch_size. You can modify this setting in the alex_mp_20.yaml file located at mattergen/conf/data_module/. + + +> [!NOTE] +> We use [`hydra`](https://hydra.cc/docs/intro/) to configure our training and sampling jobs. The hierarchical configuration can be found under [`mattergen/conf`](mattergen/conf). In the following we make use of `hydra`'s config overrides to update these configs via the CLI. See the `hydra` [documentation](https://hydra.cc/docs/advanced/override_grammar/basic/) for an introduction to the config override syntax. + +### Fine-tuning on property data + +Assume that you have a MatterGen base model at `$MODEL_PATH` (e.g., `checkpoints/mattergen_base`). You can fine-tune MatterGen using the following command. + +```bash +export PROPERTY=dft_mag_density +export MODEL_PATH=checkpoints/mattergen_base +export PYTHONPATH=$PWD +python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +``` + +`dft_mag_density` denotes the target property for fine-tuning. + +> [!TIP] +> You can select any property that is available in the dataset. See [`mattergen/conf/data_module/mp_20.yaml`](mattergen/conf/data_module/mp_20.yaml) or [`mattergen/conf/data_module/alex_mp_20.yaml`](mattergen/conf/data_module/alex_mp_20.yaml) for the list of supported properties. You can also add your own custom property data. See [below](#fine-tune-on-your-own-property-data) for instructions. + +#### Multi-property fine-tuning + +You can also fine-tune MatterGen on multiple properties. For instance, to fine-tune it on `chemical_system` and `energy_above_hull`, you can use the following command. + +```bash +export PROPERTY1=chemical_system +export PROPERTY2=energy_above_hull +export MODEL_PATH=checkpoints/mattergen_base +export PYTHONPATH=$PWD +# single gpu +python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] +# multi gpu +python -m paddle.distributed.launch --gpus="1,2,3,4" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] + +``` +> [!TIP] +> Add more properties analogously by adding these overrides: +> 1. `+lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.=` +> 2. Add `` to the `data_module.properties=["$PROPERTY1", "$PROPERTY2", ..., ]` override. + +#### Fine-tune on your own property data +You may also fine-tune MatterGen on your own property data. Essentially what you need is a property value (typically `float`) for a subset of the data you want to train on (e.g., `alex_mp_20`). Proceed as follows: +1. Add the name of your property to the `PROPERTY_SOURCE_IDS` list inside [`mattergen/mattergen/common/utils/globals.py`](mattergen/common/utils/globals.py). +2. Add a new column with this name to the dataset(s) you want to train on, e.g., `datasets/alex_mp_20/train.csv` and `datasets/alex_mp_20/val.csv` (requires you to have followed the [pre-processing steps](#pre-process-a-dataset-for-training)). +3. Re-run the CSV to dataset script `PYTHONPATH=$PWD python scripts/csv_to_dataset.py --csv-folder datasets// --dataset-name --cache-folder datasets/cache`, substituting your dataset name for `MY_DATASET`. +4. Add a `.yaml` config file to [`mattergen/conf/lightning_module/diffusion_module/model/property_embeddings`](mattergen/conf/lightning_module/diffusion_module/model/property_embeddings). If you are adding a float-valued property, you may copy an existing configuration, e.g., [`dft_mag_density.yaml`](mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_mag_density.yaml). More complicated properties will require you to create your own custom `PropertyEmbedding` subclass, e.g., see the [`space_group`](mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/space_group.yaml) or [`chemical_system`](mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/chemical_system.yaml) configs. +5. Follow the [instructions for fine-tuning](#fine-tuning-on-property-data) and reference your own property in the same way as we used the existing properties like `dft_mag_density`. + +## Data release +You can download the datasets for training and evaluating MatterGen from [here](https://pan.baidu.com/s/15yC8UUcMO6tJV6MiJOPYFA?pwd=z9k5) and save them to mattergen/data-release/alex-mp(mp-20) folder.For more details and license information see the respective README files under [`data-release`](data-release). +### Training datasets +* MP-20 ([Jain et al., 2013](https://pubs.aip.org/aip/apm/article/1/1/011002/119685)): contains 45k general inorganic materials, including most experimentally known materials with no more than 20 atoms in unit cell. +* Alex-MP-20: Training dataset consisting of around 600k structures from MP-20 and Alexandria ([Schmidt et al. 2022](https://archive.materialscloud.org/record/2022.126)) with at most 20 atoms inside the unit cell and below 0.1 eV/atom of the convex hull. See the venn diagram below and the MatterGen paper for more details. + +### Reference dataset +Download the Alex-MP reference dataset from [here](https://pan.baidu.com/s/15yC8UUcMO6tJV6MiJOPYFA?pwd=z9k5) and save it to mattergen/data-release/alex-mp/ folder. This dataset can be used to evaluate novelty and stability of generated samples. +The reference set contains 845,997 structures with their DFT energies. See the following Venn diagram for more details about the composition of the training and reference datasets. +> [!NOTE] +> We only share the 4.4k ordered + 117.7k disordered ICSD structures as the original repo. + + +![Dataset Venn diagram](assets/datasets_venn_diagram.png) + + +## Citation +If you are using our code, model, data, or evaluation pipeline, please consider citing the work: +```bibtex +@article{MatterGen2025, + author = {Zeni, Claudio and Pinsler, Robert and Z{\"u}gner, Daniel and Fowler, Andrew and Horton, Matthew and Fu, Xiang and Wang, Zilong and Shysheya, Aliaksandra and Crabb{\'e}, Jonathan and Ueda, Shoko and Sordillo, Roberto and Sun, Lixin and Smith, Jake and Nguyen, Bichlien and Schulz, Hannes and Lewis, Sarah and Huang, Chin-Wei and Lu, Ziheng and Zhou, Yichi and Yang, Han and Hao, Hongxia and Li, Jielan and Yang, Chunlei and Li, Wenjie and Tomioka, Ryota and Xie, Tian}, + journal = {Nature}, + title = {A generative model for inorganic materials design}, + year = {2025}, + doi = {10.1038/s41586-025-08628-5}, +} +``` + + +## Responsible AI Transparency Documentation + +The responsible AI transparency documentation can be found [here](MODEL_CARD.md). + + diff --git a/jointContribution/mattergen/assets/MatterGenlogo_.png b/jointContribution/mattergen/assets/MatterGenlogo_.png new file mode 100644 index 00000000..b3dce12c Binary files /dev/null and b/jointContribution/mattergen/assets/MatterGenlogo_.png differ diff --git a/jointContribution/mattergen/assets/datasets_venn_diagram.png b/jointContribution/mattergen/assets/datasets_venn_diagram.png new file mode 100644 index 00000000..12c604a3 Binary files /dev/null and b/jointContribution/mattergen/assets/datasets_venn_diagram.png differ diff --git a/jointContribution/mattergen/data-release/README.md b/jointContribution/mattergen/data-release/README.md new file mode 100644 index 00000000..b75aedeb --- /dev/null +++ b/jointContribution/mattergen/data-release/README.md @@ -0,0 +1,9 @@ +# Data release + +This folder contains data to be released with "A generative model for inorganic +materials design". The top-level directories and their contents are as follows: + +* [`cifs`](cifs): CIF data files for crystal structures presented in the paper. +* [`alex-mp`](alex-mp): Alex-MP dataset used to train and fine-tune MatterGen. +* [`mp-20`](mp-20): MP-20 dataset (this dataset is not released with this repository and provided for convenience in reproducing our results). + diff --git a/jointContribution/mattergen/data-release/alex-mp/README.md b/jointContribution/mattergen/data-release/alex-mp/README.md new file mode 100644 index 00000000..2f558e5f --- /dev/null +++ b/jointContribution/mattergen/data-release/alex-mp/README.md @@ -0,0 +1,12 @@ +This dataset contains structures from the Alexandria ([Schmidt et al. 2022](https://archive.materialscloud.org/record/2022.126)) and MP-20 datasets. For details on MP-20, see [here](../mp-20/README.md). + +The Alexandria dataset was published under [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode) by: +``` +Jonathan Schmidt, Noah Hoffmann, Hai-Chen Wang, Pedro Borlido, Pedro J. M.A. Carriço, Tiago F. T. Cerqueira, Silvana Botti, Miguel A. L. Marques, Large-scale machine-learning-assisted exploration of the whole materials space, Materials Cloud Archive 2022.126 (2022), https://doi.org/10.24435/materialscloud:m7-50 +``` + +We applied the following modifications to the data: +* Exclude structures containing the elements `Tc`, `Pm`, or any element with atomic number 84 or higher. +* Relax structures with DFT using a PBE functional in order to have consistent energies. +* For the training set, remove any structure with more than 20 atoms inside the unit cell. +* For the training set, remove any structure with energy above the hull higher than 0.1 eV/atom. \ No newline at end of file diff --git a/jointContribution/mattergen/data-release/mp-20/README.md b/jointContribution/mattergen/data-release/mp-20/README.md new file mode 100644 index 00000000..0c6d91dd --- /dev/null +++ b/jointContribution/mattergen/data-release/mp-20/README.md @@ -0,0 +1,12 @@ +The MP-20 dataset was first published by [Jain et al., 2013](https://pubs.aip.org/aip/apm/article/1/1/011002/119685): + +``` +Jain, A., Ong, S. P., Hautier, G., Chen, W., Richards, W. D., Dacek, S., ... & Persson, K. A. (2013). Commentary: The Materials Project: A materials genome approach to accelerating materials innovation. APL materials, 1(1). +``` + +The MP-20 dataset is published under the [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/). + +We applied the following modifications to the data: +* Exclude structures containing the elements `Tc`, `Pm`, or any element with atomic number 84 or higher. +* Relax structures with DFT using a PBE functional in order to have consistent energies. +* For the training set, remove any structure with energy above the hull higher than 0.1 eV/atom. \ No newline at end of file diff --git a/jointContribution/mattergen/finetune.sh b/jointContribution/mattergen/finetune.sh new file mode 100644 index 00000000..5b5b23d9 --- /dev/null +++ b/jointContribution/mattergen/finetune.sh @@ -0,0 +1,107 @@ + + +# export CUDA_VISIBLE_DEVICES=1,2,3,4,5,6,7 + +#--------------------------- mp20 single property--------------------------------------- +# export PROPERTY=chemical_system +# export MODEL_PATH=checkpoints/matterten_base_mp20 +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# # python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=dft_band_gap +# export MODEL_PATH=checkpoints/matterten_base_mp20 +# export PYTHONPATH=$PWD +# # python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=dft_mag_density +# export MODEL_PATH=checkpoints/matterten_base_mp20 +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=dft_bulk_modulus +# export MODEL_PATH=checkpoints/matterten_base_mp20 +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=formation_energy_per_atom +# export MODEL_PATH=checkpoints/matterten_base_mp20 +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +#--------------------------- mp20 multi property---------------------------------------- +# export PROPERTY1=chemical_system +# export PROPERTY2=formation_energy_per_atom +# export MODEL_PATH=checkpoints/matterten_base_mp20 +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] + + + +#--------------------------- alex_mp20 single property---------------------------------- +# export PROPERTY=chemical_system +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=space_group +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=dft_mag_density +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=dft_band_gap +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + +# export PROPERTY=ml_bulk_modulus +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + + +#--------------------------- alex_mp20 multi property---------------------------------- +# export PROPERTY1=chemical_system +# export PROPERTY2=energy_above_hull +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] + +# export PROPERTY1=dft_mag_density +# export PROPERTY2=hhi_score +# export MODEL_PATH=checkpoints/mattergen_base +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] +# python -m paddle.distributed.launch --gpus="3,4,5,6" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=alex_mp_20 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY1=$PROPERTY1 +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY2=$PROPERTY2 data_module.properties=["$PROPERTY1","$PROPERTY2"] + + +#--------------------------- 2d_30k single property--------------------------------------- +# export PROPERTY=ehull +# export MODEL_PATH=checkpoints/2d_30k +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=2d_30k +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="0,1,2,3" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=2d_30k +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] + + +#--------------------------- 2d_30k mean distance single property--------------------------------------- +# export PROPERTY=ehull +# export MODEL_PATH=checkpoints/2d_30k_md +# export PYTHONPATH=$PWD +# python scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=2d_30k +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] +# python -m paddle.distributed.launch --gpus="0,1,2,3" scripts/finetune.py adapter.model_path=$MODEL_PATH data_module=2d_30k +lightning_module/diffusion_module/model/property_embeddings@adapter.adapter.property_embeddings_adapt.$PROPERTY=$PROPERTY data_module.properties=["$PROPERTY"] diff --git a/jointContribution/mattergen/fix_pgl.py b/jointContribution/mattergen/fix_pgl.py new file mode 100644 index 00000000..35bd52c0 --- /dev/null +++ b/jointContribution/mattergen/fix_pgl.py @@ -0,0 +1,48 @@ +import os + +import pkg_resources + + +def get_library_path(library_name): + distribution = pkg_resources.get_distribution(library_name) + location = distribution.location + return os.path.abspath(location) + + +def read_file(file_path): + with open(file_path, "r", encoding="utf-8") as file: + content = file.read() + return content + + +def write_file(file_path, content): + with open(file_path, "w", encoding="utf-8") as file: + file.write(content) + + +library_path = get_library_path("pgl") +file_paths = ["pgl/math.py", "pgl/utils/helper.py", "pgl/utils/op.py"] + +# replace "fluid" with "base" +for file_path in file_paths: + full_path = os.path.join(library_path, file_path) + print(f"Processing {full_path}, replacing 'fluid' with 'base'...") + content = read_file(full_path) + new_content = content.replace("paddle.fluid", "paddle.base") + new_content = new_content.replace("paddle.base.core as core", "paddle.base as core") + new_content = new_content.replace( + "from paddle.base.layers import core", "from paddle.base import core" + ) + write_file(full_path, new_content) + +# delete "overwrite" paramters in "pgl/utils/helper.py" +file_paths = ["pgl/utils/helper.py"] +for file_path in file_paths: + full_path = os.path.join(library_path, file_path) + print(f"Processing {full_path}, deleting 'overwrite' paramters...") + content = read_file(full_path) + new_content = content.replace( + "return _C_ops.scatter(x, index, updates, 'overwrite', overwrite)", + "return _C_ops.scatter(x, index, updates, overwrite)", + ) + write_file(full_path, new_content) diff --git a/jointContribution/mattergen/mattergen/__init__.py b/jointContribution/mattergen/mattergen/__init__.py new file mode 100644 index 00000000..5becc17c --- /dev/null +++ b/jointContribution/mattergen/mattergen/__init__.py @@ -0,0 +1 @@ +__version__ = "1.0.0" diff --git a/jointContribution/mattergen/mattergen/adapter.py b/jointContribution/mattergen/mattergen/adapter.py new file mode 100644 index 00000000..3fc16173 --- /dev/null +++ b/jointContribution/mattergen/mattergen/adapter.py @@ -0,0 +1,107 @@ +import sys + + +from typing import Callable + +import paddle +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.data.types import PropertySourceId +from mattergen.denoiser import (GemNetTDenoiser, + get_chemgraph_from_denoiser_output) +from mattergen.property_embeddings import (ZerosEmbedding, + get_property_embeddings, + get_use_unconditional_embedding) +from paddle_utils import * + +BatchTransform = Callable[[ChemGraph], ChemGraph] + + +class GemNetTAdapter(GemNetTDenoiser): + """ + Denoiser layerwise adapter with GemNetT. On top of a mattergen.denoiser.GemNetTDenoiser, + additionally inputs that specifies extra conditions to be conditioned on. + """ + + def __init__(self, property_embeddings_adapt: paddle.nn.LayerDict, *args, **kwargs): + super().__init__(*args, **kwargs) + self.property_embeddings_adapt = paddle.nn.LayerDict( + sublayers=property_embeddings_adapt + ) + assert all( + [ + (k not in self.property_embeddings.keys()) + for k in self.property_embeddings_adapt.keys() + ] + ), f"One of adapter conditions {self.property_embeddings_adapt.keys()} already exists in base model {self.property_embeddings.keys()}, please remove." + for property_embedding in self.property_embeddings_adapt.values(): + property_embedding.unconditional_embedding_module = ZerosEmbedding( + hidden_dim=property_embedding.unconditional_embedding_module.hidden_dim + ) + + def forward(self, x: ChemGraph, t: paddle.Tensor) -> ChemGraph: + """ + augment with . + """ + frac_coords, lattice, atom_types, num_atoms, batch = ( + x["pos"], + x["cell"], + x["atomic_numbers"], + x["num_atoms"], + x.get_batch_idx("pos"), + ) + t_enc = self.noise_level_encoding(t).to(lattice.place) + z_per_crystal = t_enc + conditions_base_model: paddle.Tensor = get_property_embeddings( + property_embeddings=self.property_embeddings, batch=x + ) + if len(conditions_base_model) > 0: + z_per_crystal = paddle.concat( + x=[z_per_crystal, conditions_base_model], axis=-1 + ) + conditions_adapt_dict = {} + conditions_adapt_mask_dict = {} + for cond_field, property_embedding in self.property_embeddings_adapt.items(): + conditions_adapt_dict[cond_field] = property_embedding.forward(batch=x) + try: + conditions_adapt_mask_dict[ + cond_field + ] = get_use_unconditional_embedding(batch=x, cond_field=cond_field) + except KeyError: + conditions_adapt_mask_dict[cond_field] = paddle.ones_like( + x=x["num_atoms"], dtype="bool" + ).reshape(-1, 1) + output = self.gemnet( + z=z_per_crystal, + frac_coords=frac_coords, + atom_types=atom_types, + num_atoms=num_atoms, + batch=batch, + lengths=None, + angles=None, + lattice=lattice, + edge_index=None, + to_jimages=None, + num_bonds=None, + cond_adapt=conditions_adapt_dict, + cond_adapt_mask=conditions_adapt_mask_dict, + ) + pred_atom_types = self.fc_atom(output.node_embeddings) + return get_chemgraph_from_denoiser_output( + pred_atom_types=pred_atom_types, + pred_lattice_eps=output.stress, + pred_cart_pos_eps=output.forces, + training=self.training, + element_mask_func=self.element_mask_func, + x_input=x, + ) + + @property + def cond_fields_model_was_trained_on(self) -> list[PropertySourceId]: + """ + We adopt the convention that all property embeddings are stored in paddle.nn.LayerDicts of + name property_embeddings or property_embeddings_adapt in the case of a fine tuned model. + + This function returns the list of all field names that a given score model was trained to + condition on. + """ + return list(self.property_embeddings) + list(self.property_embeddings_adapt) diff --git a/jointContribution/mattergen/mattergen/common/__init__.py b/jointContribution/mattergen/mattergen/common/__init__.py new file mode 100644 index 00000000..3dc1f76b --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/jointContribution/mattergen/mattergen/common/data/__init__.py b/jointContribution/mattergen/mattergen/common/data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/common/data/callback.py b/jointContribution/mattergen/mattergen/common/data/callback.py new file mode 100644 index 00000000..d6b84615 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/callback.py @@ -0,0 +1,63 @@ +from collections import defaultdict +from typing import TypeVar + +import paddle +import paddle.distributed as dist + +from tqdm.auto import tqdm + +TensorOrStringType = TypeVar("TensorOrStringType", paddle.Tensor, list[str]) + + +def maybe_to_tensor(values: list[TensorOrStringType]) -> TensorOrStringType: + if isinstance(values[0], paddle.Tensor): + return paddle.concat(x=values) + return [el for x in values for el in x] + + +class SetPropertyScalers: + """ + Utility callback; at the start of training, this computes the mean and std of the property data and adds the property + scalers to the model. + """ + + @staticmethod + def _compute_property_scalers( + train_dataloader, + property_embeddings: paddle.nn.LayerDict, + ): + property_values = defaultdict(list) + property_names = [ + p.name + for p in property_embeddings.values() + if not isinstance(p.scaler, paddle.nn.Identity) + ] + if len(property_names) == 0: + return + for batch in tqdm(train_dataloader, desc=f"Fitting property scalers"): + batch = batch["data"] + for property_name in property_names: + property_values[property_name].append(batch[property_name]) + for property_name in property_names: + values = maybe_to_tensor(values=property_values[property_name]) + if dist.is_initialized(): + if isinstance(values, paddle.Tensor): + values_list = [] + dist.all_gather(values_list, values) + values = paddle.concat(x=values_list) + else: + print(f"Property {property_name} cannot be gathered") + property_embeddings[property_name].fit_scaler( + all_data=values + ) + + def on_fit_start(self, train_dataloader, model): + model = model.model + self._compute_property_scalers( + train_dataloader=train_dataloader, property_embeddings=model.property_embeddings + ) + if hasattr(model, "property_embeddings_adapt"): + self._compute_property_scalers( + train_dataloader=train_dataloader, + property_embeddings=model.property_embeddings_adapt, + ) diff --git a/jointContribution/mattergen/mattergen/common/data/chemgraph.py b/jointContribution/mattergen/mattergen/common/data/chemgraph.py new file mode 100644 index 00000000..f0eb95b4 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/chemgraph.py @@ -0,0 +1,135 @@ +import copy + +import paddle + +import paddle_geometric.data as pyg_data +from paddle_geometric import utils +from paddle_geometric.typing import OptTensor + + +class ChemGraph(pyg_data.Data): + """A ChemGraph is a Pytorch Geometric Data object describing a MLPotential molecular graph with atoms in 3D space. + The data object can hold node-level, and graph-level attributes, as well as (pre-computed) edge information. + In general, :class:`~torch_geometric.data.Data` tries to mimic the + behaviour of a regular Python dictionary. + In addition, it provides useful functionality for analyzing graph + structures, and provides basic PyTorch tensor functionalities. + See `here `__ for the accompanying + tutorial. + + Args: + atomic_numbers (LongTensor, optional): Atomic numbers following ase.Atom, (Unknown=0, H=1) with shape + :obj:`[num_nodes]`. (default: :obj:`None`) + pos (Tensor, optional): Node position matrix, only set one position value. + :obj:`[num_nodes, 3]`. (default: :obj:`None`) + cell (Tensor, optional): Cell matrix if pbc = True, has shape + :obj:`[1, 3, 3]`. (default: :obj:`None`) + edge_index (LongTensor, optional): Edge indexes (sender, receiver) + :obj:`[2, num_edges]`. (default: :obj:`None`) + edge_attr (Tensor, optional): Edge attributes + :obj:`[num_edges, num_edge_attr]`. (default: :obj:`None`) + **kwargs (optional): Additional attributes to be stored in the data object. + """ + + def __init__( + self, + atomic_numbers=None, #: (IntTensor | None) = None, todo: fix this + pos: OptTensor = None, + cell: OptTensor = None, + edge_index=None, #: (LongTensor | None) = None, todo: fix this + edge_attr: OptTensor = None, + **kwargs, + ): + super().__init__(x=None, edge_index=edge_index, edge_attr=edge_attr, pos=pos, **kwargs) + if atomic_numbers is not None: + self.atomic_numbers = atomic_numbers + if cell is not None: + self.cell = cell + self.__dict__["_frozen"] = True + + def __setattr__(self, attr, value): + if self.__dict__.get("_frozen", False) and attr not in ( + "_num_graphs", + "_slice_dict", + "_inc_dict", + "_collate_structure", + ): + raise AttributeError( + f"Replacing ChemGraph.{attr} in-place. Consider using the self.replace method to create a shallow copy." + ) + return super().__setattr__(attr, value) + + def replace(self, **kwargs: (OptTensor | str | int | float | list)) -> "ChemGraph": + """Returns a shallow copy of the ChemGraph with updated fields.""" + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = value + out.__dict__["_store"] = copy.copy(self._store) + for key, value in kwargs.items(): + out._store[key] = value + out._store._parent = out + return out + + def get_batch_idx(self, field_name: str): # -> (LongTensor | None): + """Used by diffusion library to retrieve batch indices for a given field.""" + assert isinstance(self, pyg_data.Batch) + if field_name == "cell": + return None + elif field_name in ["pos", "atomic_numbers"]: + return self.batch + else: + try: + return self[f"{field_name}_batch"] + except KeyError: + raise NotImplementedError(f"Unable to determine batch index for {field_name}") + + def get_batch_size(self): + assert isinstance(self, pyg_data.Batch) + return self.num_graphs + + def subgraph(self, subset: paddle.Tensor) -> "ChemGraph": + """ + Returns the induced subgraph given by the node indices :obj:`subset`. If no edge indices are + present, subsets will only be created for node features. + + Args: + subset (LongTensor or BoolTensor): The nodes to keep. + """ + raise NotImplementedError + # if subset.dtype == "bool": + # num_nodes = int(subset.sum()) + # else: + # num_nodes = subset.shape[0] + # subset = paddle.unique(subset) + # if self.edge_index is not None: + # out = utils.subgraph( + # subset, + # self.edge_index, + # relabel_nodes=True, + # num_nodes=self.num_nodes, + # return_edge_mask=True, + # ) + # edge_index, _, edge_mask = out + # else: + # edge_index = None + # edge_mask = None + # masked_data = {} + # for key, value in self: + # if value is None: + # continue + # if key == "edge_index": + # masked_data[key] = edge_index + # if key == "num_nodes": + # masked_data[key] = num_nodes + # elif self.is_node_attr(key): + # cat_dim = self.__cat_dim__(key, value) + # masked_data[key] = utils.select(value, subset, dim=cat_dim) + # elif self.is_edge_attr(key) and edge_index is not None: + # cat_dim = self.__cat_dim__(key, value) + # masked_data[key] = utils.select(value, edge_mask, dim=cat_dim) + # data = self.replace(**masked_data) + # return data + + +ChemGraphBatch = pyg_data.Batch(_base_cls=ChemGraph).__class__ diff --git a/jointContribution/mattergen/mattergen/common/data/collate.py b/jointContribution/mattergen/mattergen/common/data/collate.py new file mode 100644 index 00000000..6ec67882 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/collate.py @@ -0,0 +1,364 @@ +import warnings +from typing import Any +from typing import Callable +from typing import Iterable +from typing import Iterator +from typing import Sequence +from typing import TypeVar +from typing import overload + +import paddle +from paddle import Tensor +from typing_extensions import TypeGuard + +from paddle_geometric.data import Batch +from paddle_geometric.data import Data + +warnings.filterwarnings("ignore", "TypedStorage is deprecated", module="paddle_geometric") +__all__ = ["collate", "find_structure", "separate"] +TreeTypes = Data | Batch | Tensor | int | float | str | bool | None +T = TypeVar("T", bound=TreeTypes) +PyTree = T | list["PyTree[T]"] | tuple["PyTree[T]", ...] | dict[Any, "PyTree[T]"] +IterPyTree = list[PyTree[T]] | tuple[PyTree[T], ...] | dict[Any, PyTree[T]] + + +@overload +def collate(x: PyTree[T]) -> T: + ... + + +@overload +def collate(x: PyTree[T], depth: int | None) -> PyTree[T]: + ... + + +def collate(x: PyTree[T], depth: int | None = None) -> T | PyTree[T]: + """Collate over the `depth` outermost layers of a `PyTree[Data]`, where `depth = None` collates + over the whole structure. + + The type `PyTree[T]` is defined recursively, in the following way:: + + PyTree[T] = Union[T, list[PyTree[T]], tuple[PyTree[T], ...], dict[Any, PyTree[T]]]] + + The following are examples of a `PyTree[int]`:: + + 1 + [1, 2] + [1, (2, 3)] + [(1, 2), (3, 4)] + [{"key": [1, 2]}, 3, (4, 5)] + [{"key": [1, 2]}, {"key": [3, 4]}, {"key": [5, 6]}] + + If every `Union` in a `PyTree` consists of one and only one element, then the `PyTree` is + called _consistent_. A consistent `PyTree[T]` can be decomposed into layers, where the first + layer is also referred to as the outermost layer and the last layer is referred to as the + innermost layer. This decomposition into layers is also defined recursively. + + If `list[U]` is a consistent `PyTree`, then the outermost/first layer of `list[U]` is `list`, + and the `n`th layer of `list[U]` is the `n - 1`th layer of `U`. Similarly, if `tuple[U, ...]` is + a consistent `PyTree`, then the outermost/first layer is `tuple` and the `n`th layer is the + `n - 1`th layer of `U`. Finally, if `dict[Any, U]` is a consistent `PyTree`, then the + outermost/first layer is `dict` and the `n`th layer is the `n - 1`th layer of `U`. + + For the above examples of a `PyTree[int]`:: + + # Consistent, but has no layers: + 1 + + # Consistent with one layer `list`: + [1, 2] + + # Inconsistent: + [1, (2, 3)] + + # Consistent with outermost layer `list` and innermost layer `tuple`: + [(1, 2), (3, 4)] + + # Inconsistent: + [{"key": [1, 2]}, 3, (4, 5)] + + # Consistent with outermost layer `list`, second layer `dict`, and innermost layer `list`: + [{"key": [1, 2]}, {"key": [3, 4]}, {"key": [5, 6]}] + + A few examples of how `collate` would work for various values of `depth`:: + + # Collate over everything: + collate(x: list[dict[str, tuple[Data, Data]]]) -> Data + + # Collate only over the outermost `list`: + collate(x: list[dict[str, tuple[Data, Data]]], depth=1) -> dict[str, tuple[Data, Data]] + + # Collate over the outermost layer `list` and the second layer `dict`: + collate(x: list[dict[str, tuple[Data, Data]]], depth=2) -> tuple[Data, Data] + + The inverse function of :func:`collate` is :func:`separate`. + + Args: + x (PyTree[Data]): The data structure to collate. + depth (int, optional): Number of outermost layers to collate over. If given, `x` must be + a consistent `PyTree`. If not given, `x` needs not to be consistent, and this function + will collate over the whole structure. + + Raises: + ValueError: If `x` is not a `PyTree`. Also raised if `depth` is specified but `x` is not a + consistent `PyTree`. + + Returns: + PyTree[T]: Collated structure. + """ + ys, structure, _ = _flatten(x, depth, 0) + return _merge(ys, structure) + + +def _flatten_iterable( + xs: Iterable[PyTree[T]], depth: int | None, offset: int +) -> tuple[list[PyTree[T]], list[PyTree[int]], int]: + ys, ss = [], [] + for x in xs: + y, s, offset = _flatten(x, depth, offset) + ys.append(y) + ss.append(s) + return sum(ys, []), ss, offset + + +def iter_leaves(x: PyTree[T]) -> Iterator[T]: + """Iterate over the leaves of a `DataTree`. + + Args: + x (PyTree[T]): The data structure to iterate over. + + Yields: + T: The leaves of `x`. + """ + if isinstance(x, (list, tuple)): + for y in x: + yield from iter_leaves(y) + elif isinstance(x, dict): + for y in x.values(): + yield from iter_leaves(y) + else: + yield x + + +def len_tree(x: PyTree[T]) -> int: + """Number of nodes in a `PyTree`. + + Args: + x (PyTree[T]): The data structure to iterate over. + + Returns: + int: Number of nodes in `x`. + """ + total = 0 + if isinstance(x, (list, tuple)): + for y in x: + total += len_tree(y) + elif isinstance(x, dict): + for y in x.values(): + total += len_tree(y) + else: + total = 1 + return total + + +def _flatten( + xs: PyTree[T], depth: int | None = None, offset: int = 0 +) -> tuple[list[PyTree[T]], PyTree[int], int]: + depth = None if depth is None else depth - 1 + if isinstance(xs, Data) or depth == -1: + return [xs], offset, offset + 1 + if isinstance(xs, list): + ys, ss, offset = _flatten_iterable(xs, depth, offset) + return ys, list(ss), offset + if isinstance(xs, tuple): + ys, ss, offset = _flatten_iterable(xs, depth, offset) + return ys, tuple(ss), offset + if isinstance(xs, dict): + keys = sorted(xs.keys()) + ys, ss, offset = _flatten_iterable([xs[k] for k in keys], depth, offset) + return ys, {k: s for k, s in zip(keys, ss)}, offset + raise ValueError(f"Cannot flatten item of type `{type(xs)}`.") + + +def is_list_seq(xs: Sequence[PyTree[T]]) -> TypeGuard[Sequence[list[PyTree[T]]]]: + """Check if a sequence of `PyTree`s is a sequence of lists of `PyTree`s.""" + return all(isinstance(x, list) for x in xs) + + +def is_data_seq(xs: Sequence[PyTree[T]]) -> TypeGuard[Sequence[Data]]: + """Check if a sequence of `PyTree`s is a sequence of Data objects.""" + return all(isinstance(x, Data) for x in xs) + + +def is_tuple_seq(xs: Sequence[PyTree[T]]) -> TypeGuard[Sequence[tuple[PyTree[T]]]]: + """Check if a sequence of `PyTree`s is a sequence of `tuple`s of `PyTree`s.""" + return all(isinstance(x, tuple) for x in xs) + + +def is_dict_seq(xs: Sequence[PyTree[T]]) -> TypeGuard[Sequence[dict[Any, PyTree[T]]]]: + """Check if a sequence of `PyTree`s is a sequence of `dict`s with `PyTree` values.""" + return all(isinstance(x, dict) for x in xs) + + +def _merge(xs: list[PyTree[T]], structure: PyTree[int]) -> PyTree[T]: + if len(xs) == 0: + raise ValueError("Cannot merge a sequence of length zero.") + types = set(type(x) for x in xs) + if len(types) != 1: + raise ValueError(f"`PyTree` is inconsistent. Found a mix of {len(types)} types: `{types}`.") + if is_data_seq(xs): + attrs = set(xs[0].keys() if callable(xs[0].keys) else xs[0].keys) + for x in xs[1:]: + attrs.intersection_update(x.keys() if callable(x.keys) else x.keys) + for x in xs: + for attr in list(x.keys() if callable(x.keys) else x.keys): + if attr not in attrs: + warnings.warn( + f"Attribute `{attr}` is not in the intersection of attributes of the collated `Data` objects. This attribute will be dropped." + ) + del x[attr] + try: + batch = Batch.from_data_list(xs) + except Exception as e: + for attr in attrs: + types = set(type(x[attr]) for x in xs) + if len(types) != 1: + raise ValueError( + f"Attribute `{attr}` has inconsistent types. Found a mix of {len(types)} types: `{types}`." + ) + if isinstance(xs[0][attr], paddle.Tensor): + dtypes = set(x[attr].dtype for x in xs) + if len(dtypes) != 1: + raise ValueError( + f"Attribute `{attr}` has inconsistent dtypes. Found a mix of {len(dtypes)} dtypes: `{dtypes}`." + ) + raise e + batch._collate_structure = structure + return batch + if is_list_seq(xs): + return [_merge(list(ys), structure) for ys in zip(*xs)] + if is_tuple_seq(xs): + return tuple(_merge(list(ys), structure) for ys in zip(*xs)) + if is_dict_seq(xs): + return {k: _merge([x[k] for x in xs], structure) for k in xs[0].keys()} + raise ValueError(f"Cannot merge elements of type `{type(xs[0])}`.") + + +def separate(x: PyTree[T], structure: PyTree[int] | None = None) -> PyTree[T]: + """Inverse of :func:`collate`. This function guarantees that the following is true for every + value of `depth`:: + + separate(collate(x, depth)) == x + + Args: + x (PyTree[Data] or PyTree[Tensor]): Data structure which is structured like the output of + :func:`collate`. + structure (PyTree[int], optional): If `x` is a `PyTree[Data]`, then this argument can + be ignored (usually). If `x` is a `PyTree[Tensor]`, then :func:`separate` needs to be + told how the result should be separated into the original `PyTree`. In this case, you + should run :func:`find_structure` on the output of :func:`collate` and pass the result + as this argument. + + Raises: + RuntimeError: If :func:`separate` cannot automatically infer how to separate `x`. + ValueError: If `x` is not a `PyTree[Data]` or `PyTree[Tensor]`. + + Returns: + PyTree[Data] or PyTree[Tensor]: `x` separated into the `PyTree` originally given to + :func:`collate`. + """ + if structure is None: + structure = find_structure(x) + return _separate(x, structure) + + +def tree_map(func: Callable[..., T], x: PyTree[T], *x2: PyTree[T]) -> PyTree[T]: + """Apply `func` to every leaf in `x`. + + Args: + x (PyTree[T]): `PyTree`s to map over. + *x2 (PyTree[Any]): additional matching `PyTree`s possibly of different type to map over. + func (function): Function to apply. + + Returns: + PyTree[T]: `x`, but with `func` applied to every leaf. + """ + + def _map(x: PyTree[T], *x2: PyTree) -> PyTree[T]: + if isinstance(x, list): + assert is_list_seq(x2), "All `PyTree`s must of the same form, but they are not." + return [_map(*y) for y in zip(x, *x2)] + elif isinstance(x, tuple): + assert is_tuple_seq(x2), "All `PyTree`s must of the same form, but they are not." + return tuple(_map(*y) for y in zip(x, *x2)) + elif isinstance(x, dict): + assert is_dict_seq(x2), "All `PyTree`s must of the same form, but they are not." + if any( + any(k[0] != k2_k for k2_k in k[1:]) + for k in zip(x.keys(), *map(lambda a: a.keys(), x2)) + ): + raise ValueError("Cannot merge dictionaries with different keys.") + return { + y[0]: _map(y[1], *y[2:]) + for y in zip(x.keys(), x.values(), *map(lambda a: a.values(), x2)) + } + else: + return func(x, *x2) + + return _map(x, *x2) + + +def find_structure(x: PyTree[T]) -> IterPyTree[int]: + """Find the information necessary to structure something back into the original `PyTree` given + to :func:`collate`. The output of this function can be given as the second argument to + :func:`separate`. + + Args: + x (PyTree[Data] or PyTree[Tensor]): Collated data structure. This is usually the output of + :func:`collate`. + + Raises: + RuntimeError: If `x` does not contain the necessary structure information. + + Returns: + PyTree[int]: Structure information. + """ + if isinstance(x, Data): + if not hasattr(x, "_collate_structure"): + raise RuntimeError( + "The attribute `_collate_structure` is necessary to separate the collated batch, but this attribute cannot be found. It might have been lost along the way. You can use `find_structure` to extract the structure information directly from the output of `collate` and then pass this to `separate` as the second argument." + ) + return x._collate_structure + if isinstance(x, (list, tuple)): + return find_structure(x[0]) + if isinstance(x, dict): + return find_structure(list(x.values())[0]) + raise RuntimeError( + "The structure information necessary to separate the collated batch is not contained in the input. You can use `find_structure` to extract the structure information directly from the output of `collate` and then pass this to `separate` as the second argument." + ) + + +def _separate(x: PyTree[T], structure: PyTree[int]) -> PyTree[T]: + if isinstance(structure, int): + return _get_i(x, structure) + if isinstance(structure, list): + return [_separate(x, s) for s in structure] + if isinstance(structure, tuple): + return tuple(_separate(x, s) for s in structure) + if isinstance(structure, dict): + return {k: _separate(x, v) for k, v in structure.items()} + raise ValueError(f"Cannot reconstruct object of type `{type(structure)}`.") + + +def _get_i(xs: PyTree[T], i: int) -> PyTree[T]: + if isinstance(xs, Data): + return xs.get_example(i) + if isinstance(xs, paddle.Tensor): + return xs[i] + if isinstance(xs, list): + return list(_get_i(x, i) for x in xs) + if isinstance(xs, tuple): + return tuple(_get_i(x, i) for x in xs) + if isinstance(xs, dict): + return {k: _get_i(v, i) for k, v in xs.items()} + raise ValueError(f"Cannot get example for `{type(xs)}`.") diff --git a/jointContribution/mattergen/mattergen/common/data/collate_pp.py b/jointContribution/mattergen/mattergen/common/data/collate_pp.py new file mode 100644 index 00000000..f6619406 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/collate_pp.py @@ -0,0 +1,110 @@ +from __future__ import annotations + +import numbers +import warnings +from collections.abc import Mapping +from collections.abc import Sequence +from typing import Any +from typing import List + +import numpy as np +import paddle +import pgl + +from paddle_geometric.data import Batch +from paddle_geometric.data import Data + + +class ConcatData(object): + def __init__(self, data) -> None: + self.data = data + + @staticmethod + def batch(data_list): + data_list = [data.data for data in data_list] + data = np.concatenate(data_list, axis=0) + return data + + def __str__(self): + return str(self.__dict__) + + def __repr__(self): + return str(self.__dict__) + + +class DefaultCollator(object): + def __call__(self, batch: List[Any]) -> Any: + """Default_collate_fn for paddle dataloader. + + NOTE: This `default_collate_fn` is different from official `default_collate_fn` + which specially adapt case where sample is `None` and `pgl.Graph`. + + ref: https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/io/dataloader/collate.py#L25 + + Args: + batch (List[Any]): Batch of samples to be collated. + + Returns: + Any: Collated batch data. + """ + sample = batch[0] + if sample is None: + return None + elif isinstance(sample, np.ndarray): + batch = np.stack(batch, axis=0) + return batch + elif isinstance(sample, (paddle.Tensor, paddle.framework.core.eager.Tensor)): + return paddle.stack(batch, axis=0) + elif isinstance(sample, numbers.Number): + batch = np.array(batch) + return batch + elif isinstance(sample, (str, bytes)): + return batch + elif isinstance(sample, Mapping): + return {key: self([d[key] for d in batch]) for key in sample} + elif isinstance(sample, Sequence): + sample_fields_num = len(sample) + if not all(len(sample) == sample_fields_num for sample in iter(batch)): + raise RuntimeError("Fields number not same among samples in a batch") + return [self(fields) for fields in zip(*batch)] + elif str(type(sample)) == "": + # use str(type()) instead of isinstance() in case of pgl is not installed. + graphs = pgl.Graph.batch(batch) + graphs.tensor() + return graphs + elif isinstance(sample, ConcatData): + return ConcatData.batch(batch) + elif isinstance(sample, Data): + attrs = set(batch[0].keys() if callable(batch[0].keys) else batch[0].keys) + for x in batch[1:]: + attrs.intersection_update(x.keys() if callable(x.keys) else x.keys) + for x in batch: + for attr in list(x.keys() if callable(x.keys) else x.keys): + if attr not in attrs: + warnings.warn( + f"Attribute `{attr}` is not in the intersection of attributes of the collated `Data` objects. This attribute will be dropped." + ) + del x[attr] + try: + batch = Batch.from_data_list(batch) + except Exception as e: + for attr in attrs: + types = set(type(x[attr]) for x in batch) + if len(types) != 1: + raise ValueError( + f"Attribute `{attr}` has inconsistent types. Found a mix " + f"of {len(types)} types: `{types}`." + ) + if isinstance(batch[0][attr], paddle.Tensor): + dtypes = set(x[attr].dtype for x in batch) + if len(dtypes) != 1: + raise ValueError( + f"Attribute `{attr}` has inconsistent dtypes. Found a " + f"mix of {len(dtypes)} dtypes: `{dtypes}`." + ) + raise e + return batch + raise TypeError( + "batch data can only contains: paddle.Tensor, numpy.ndarray, " + f"dict, list, number, None, pgl.Graph, but got {type(sample)}" + ) diff --git a/jointContribution/mattergen/mattergen/common/data/condition_factory.py b/jointContribution/mattergen/mattergen/common/data/condition_factory.py new file mode 100644 index 00000000..78f206d5 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/condition_factory.py @@ -0,0 +1,94 @@ +from functools import partial +from typing import Callable +from typing import Iterable +from typing import Sequence + +import paddle + +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.data.collate import collate +from mattergen.common.data.dataset import NumAtomsCrystalDataset +from mattergen.common.data.num_atoms_distribution import NUM_ATOMS_DISTRIBUTIONS +from mattergen.common.data.transform import SetProperty +from mattergen.common.data.transform import Transform +from mattergen.common.data.types import TargetProperty +from mattergen.common.utils.data_utils import create_chem_graph_from_composition +from mattergen.diffusion.data.batched_data import BatchedData + +ConditionLoader = Iterable[tuple[BatchedData, dict[str, paddle.Tensor]] | None] + + +def _collate_fn( + batch: Sequence[ChemGraph], collate_fn: Callable[[Sequence[ChemGraph]], BatchedData] +) -> tuple[BatchedData, None]: + return collate_fn(batch), None + + +from mattergen.common.data.collate_pp import DefaultCollator + + +def get_number_of_atoms_condition_loader( + num_atoms_distribution: str, + num_samples: int, + batch_size: int, + shuffle: bool = True, + transforms: list[Transform] | None = None, + properties: TargetProperty | None = None, +) -> ConditionLoader: + transforms = transforms or [] + if properties is not None: + for k, v in properties.items(): + transforms.append(SetProperty(k, v)) + assert ( + num_atoms_distribution in NUM_ATOMS_DISTRIBUTIONS + ), f"Invalid num_atoms_distribution: {num_atoms_distribution}" + dataset = NumAtomsCrystalDataset.from_num_atoms_distribution( + num_atoms_distribution=NUM_ATOMS_DISTRIBUTIONS[num_atoms_distribution], + num_samples=num_samples, + transforms=transforms, + ) + return paddle.io.DataLoader( + dataset=dataset, + batch_size=batch_size, + collate_fn=partial(_collate_fn, collate_fn=DefaultCollator()), + # collate_fn=DefaultCollator(), + shuffle=shuffle, + ) + + +def get_composition_data_loader( + target_compositions_dict: list[dict[str, float]], + num_structures_to_generate_per_composition: int, + batch_size: int, +) -> ConditionLoader: + """ + Given a list of target compositions, generate a dataset of chemgraphs + where each chemgraph contains atoms corresponding to the target composition + without positions or cell information. + Returns a torch dataloader equipped with the correct collate function containing such dataset. + """ + dataset_ = [] + for compostion in target_compositions_dict: + chemgraphs = [ + create_chem_graph_from_composition(compostion) + ] * num_structures_to_generate_per_composition + dataset_.extend(chemgraphs) + dataset = ChemGraphlistDataset(dataset_) + return paddle.io.DataLoader( + dataset=dataset, + batch_size=batch_size, + collate_fn=partial(_collate_fn, collate_fn=collate), + shuffle=False, + ) + + +class ChemGraphlistDataset(paddle.io.Dataset): + def __init__(self, data: list[ChemGraph]) -> None: + super().__init__() + self.data = data + + def __len__(self) -> int: + return len(self.data) + + def __getitem__(self, index: int) -> ChemGraph: + return self.data[index] diff --git a/jointContribution/mattergen/mattergen/common/data/datamodule.py b/jointContribution/mattergen/mattergen/common/data/datamodule.py new file mode 100644 index 00000000..52efd590 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/datamodule.py @@ -0,0 +1,139 @@ +import random + +import numpy as np +import paddle +from omegaconf import DictConfig +from paddle.io import DataLoader + +from mattergen.common.data.collate import collate +from mattergen.common.data.collate_pp import DefaultCollator +from mattergen.common.data.dataset import CrystalDataset + + +def worker_init_fn(id: int): + """ + DataLoaders workers init function. + + Initialize the numpy.random seed correctly for each worker, so that + random augmentations between workers and/or epochs are not identical. + + If a global seed is set, the augmentations are deterministic. + + https://pytorch.org/docs/stable/notes/randomness.html#dataloader + """ + uint64_seed = paddle.get_rng_state()[0].current_seed() + ss = np.random.SeedSequence([uint64_seed]) + np.random.seed(ss.generate_state(4)) + random.seed(uint64_seed) + + +# pytorch_lightning.LightningDataModule +class CrystDataModule: + def __init__( + self, + train_dataset: CrystalDataset, + num_workers: DictConfig, + batch_size: DictConfig, + val_dataset: (CrystalDataset | None) = None, + test_dataset: (CrystalDataset | None) = None, + **_, + ): + super().__init__() + self.num_workers = num_workers + self.batch_size = batch_size + self.train_dataset = train_dataset + self.val_dataset = val_dataset + self.test_dataset = test_dataset + self.datasets = [train_dataset, val_dataset, test_dataset] + + def train_dataloader(self, shuffle: bool = True) -> paddle.io.DataLoader: + # return paddle.io.DataLoader( + # dataset=self.train_dataset, + # shuffle=shuffle, + # batch_size=self.batch_size.train, + # num_workers=self.num_workers.train, + # worker_init_fn=worker_init_fn, + # collate_fn=collate, + # ) + train_dataloader = paddle.io.DataLoader( + dataset=self.train_dataset, + batch_sampler=paddle.io.DistributedBatchSampler( + dataset=self.train_dataset, + batch_size=self.batch_size.train, + shuffle=shuffle, + drop_last=False, + ), + worker_init_fn=worker_init_fn, + # collate_fn=collate, + collate_fn=DefaultCollator(), + num_workers=self.num_workers.train, + return_list=True, + ) + return train_dataloader + + def val_dataloader(self, shuffle: bool = False) -> (DataLoader | None): + # return ( + # paddle.io.DataLoader( + # dataset=self.val_dataset, + # shuffle=shuffle, + # batch_size=self.batch_size.val, + # num_workers=self.num_workers.val, + # worker_init_fn=worker_init_fn, + # collate_fn=collate, + # ) + # if self.val_dataset is not None + # else None + # ) + if self.val_dataset is not None: + val_dataloader = paddle.io.DataLoader( + dataset=self.val_dataset, + batch_sampler=paddle.io.BatchSampler( + dataset=self.val_dataset, + batch_size=self.batch_size.val, + shuffle=shuffle, + drop_last=False, + ), + worker_init_fn=worker_init_fn, + # collate_fn=collate, + collate_fn=DefaultCollator(), + num_workers=self.num_workers.val, + return_list=True, + ) + return val_dataloader + else: + return None + + def test_dataloader(self, shuffle: bool = False) -> (DataLoader | None): + # return ( + # paddle.io.DataLoader( + # dataset=self.test_dataset, + # shuffle=shuffle, + # batch_size=self.batch_size.test, + # num_workers=self.num_workers.test, + # worker_init_fn=worker_init_fn, + # collate_fn=collate, + # ) + # if self.test_dataset is not None + # else None + # ) + if self.test_dataset is not None: + test_dataloader = paddle.io.DataLoader( + dataset=self.test_dataset, + batch_sampler=paddle.io.BatchSampler( + dataset=self.test_dataset, + batch_size=self.batch_size.test, + shuffle=shuffle, + drop_last=False, + ), + worker_init_fn=worker_init_fn, + # collate_fn=collate, + collate_fn=DefaultCollator(), + num_workers=self.num_workers.test, + return_list=True, + ) + return test_dataloader + else: + return None + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(self.datasets={self.datasets!r}, self.num_workers={self.num_workers!r}, self.batch_size={self.batch_size!r})" diff --git a/jointContribution/mattergen/mattergen/common/data/dataset.py b/jointContribution/mattergen/mattergen/common/data/dataset.py new file mode 100644 index 00000000..26d1e5e5 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/dataset.py @@ -0,0 +1,561 @@ +import os +from collections import defaultdict +from dataclasses import dataclass +from dataclasses import field +from functools import cached_property +from functools import lru_cache +from typing import Iterable +from typing import Protocol +from typing import Sequence +from typing import Type +from typing import TypeVar + +import numpy as np +import numpy.typing +import paddle +import pandas as pd +from pymatgen.core import Structure +from pymatgen.io.cif import CifParser +from pymatgen.symmetry.groups import SpaceGroup +from tqdm.auto import tqdm + +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.data.transform import Transform +from mattergen.common.data.types import PropertySourceId +from mattergen.common.data.types import PropertyValues +from mattergen.common.globals import PROJECT_ROOT +from mattergen.common.utils.globals import PROPERTY_SOURCE_IDS + +CORE_STRUCTURE_FILE_NAMES = { + "pos": "pos.npy", + "cell": "cell.npy", + "atomic_numbers": "atomic_numbers.npy", + "num_atoms": "num_atoms.npy", + "structure_id": "structure_id.npy", +} +T = TypeVar("T", bound="BaseDataset") + + +class DatasetTransform(Protocol): + def __call__(self, dataset: "BaseDataset") -> "BaseDataset": + ... + + +@lru_cache +def space_group_number_for_symbol(symbol: str) -> int: + return SpaceGroup(symbol).int_number + + +@dataclass(frozen=True) +class BaseDataset(paddle.io.Dataset): + properties: dict[PropertySourceId, numpy.typing.NDArray] + + def __getitem__(self, index: int) -> ChemGraph: + raise NotImplementedError + + def __len__(self) -> int: + raise NotImplementedError + + def get_properties_dict(self, index: int) -> dict[PropertySourceId, paddle.Tensor]: + props_dict: dict[PropertySourceId, paddle.Tensor] = {} + for prop in self.properties.keys(): + if prop == "chemical_system": + continue + val = self.properties[prop][index] + if prop == "space_group": + val = space_group_number_for_symbol(val) + props_dict[prop] = ( + paddle.to_tensor(data=val) + if isinstance(val, np.ndarray) + else paddle.to_tensor(data=val) + ) + if props_dict[prop].dtype in ["float64", paddle.float64]: + props_dict[prop] = props_dict[prop].astype(dtype="float32") + return props_dict + + @classmethod + def from_dataset_name( + cls: Type[T], + dataset_name: str, + split: str, + transforms: (list[Transform] | None) = None, + properties: (list[PropertySourceId] | None) = None, + dataset_transforms: (list[DatasetTransform] | None) = None, + ): + """ + Load a dataset using a dataset name and split. We assume the dataset is stored in the + datasets folder in the project root. + """ + return CrystalDatasetBuilder.from_dataset_name( + dataset_name=dataset_name, + split=split, + transforms=transforms, + properties=properties, + ).build(cls, dataset_transforms=dataset_transforms) + + @classmethod + def from_cache_path( + cls: Type[T], + cache_path: str, + transforms: (list[Transform] | None) = None, + properties: (list[PropertySourceId] | None) = None, + dataset_transforms: (list[DatasetTransform] | None) = None, + ) -> T: + """ + Load a dataset from a specified cache path. + + Args: + name: Name of the reference dataset. + transforms: List of transforms to apply to **each datapoint** when loading, e.g., to make the lattice matrices symmetric. + properties: List of properties to condition on. + dataset_transforms: List of transforms to apply to the **whole dataset**, e.g., to filter out certain entries. + + Returns: + The dataset. + """ + return CrystalDatasetBuilder.from_cache_path( + cache_path=cache_path, transforms=transforms, properties=properties + ).build(cls, dataset_transforms=dataset_transforms) + + def subset(self, indices: Sequence[int]) -> "BaseDataset": + """ + Create a subset of the dataset with the given indices. + """ + raise NotImplementedError + + def repeat(self, repeats: int) -> "BaseDataset": + """ + Repeat the dataset a number of times. + """ + raise NotImplementedError + + +def repeat_along_first_axis( + input_array: numpy.typing.NDArray, repeats: int +) -> numpy.typing.NDArray: + return np.tile(input_array, (repeats,) + tuple(np.ones(input_array.ndim - 1, dtype=int))) + + +@dataclass(frozen=True, kw_only=True) +class CrystalDataset(BaseDataset): + """ + Dataset for crystal structures. Takes as input numpy arrays for positions, cell, atomic numbers, + number of atoms and structure id. Optionally, properties can be added as well, as a dictionary + of numpy arrays. The dataset can also be transformed using a list of transforms. + The recommended way of creating a CrystalDataset is to use the class method + CrystalDataset.from_preset with a preset name, which will use the CrystalDatasetBuilder class to + fetch the dataset from cache if it exists, and otherwise cache it. + """ + + pos: numpy.typing.NDArray + cell: numpy.typing.NDArray + atomic_numbers: numpy.typing.NDArray + num_atoms: numpy.typing.NDArray + structure_id: numpy.typing.NDArray + properties: dict[PropertySourceId, numpy.typing.NDArray] = field(default_factory=dict) + transforms: list[Transform] | None = None + + def __post_init__(self): + property_names = list(self.properties.keys()) + assert all( + [(s in PROPERTY_SOURCE_IDS) for s in property_names] + ), f"Property names {property_names} are not valid. Valid property source names: {PROPERTY_SOURCE_IDS}" + + @classmethod + def from_csv(cls, csv_path: str, cache_path: str, transforms: (list[Transform] | None) = None): + return CrystalDatasetBuilder.from_csv( + csv_path=csv_path, cache_path=cache_path, transforms=transforms + ).build(cls) + + @cached_property + def index_offset(self): + """ + Returns an array of indices that can be used to offset the indices of the atoms. + That is, for structure index , the atoms are located at indices + in the pos and atomic_numbers arrays. + """ + return np.concatenate([np.array([0]), np.cumsum(self.num_atoms[:-1])]) + + def __getitem__(self, index: int) -> ChemGraph: + pos_offset = self.index_offset[index] + num_atoms = paddle.to_tensor(data=self.num_atoms[index]) + props_dict = self.get_properties_dict(index) + data = ChemGraph( + pos=paddle.to_tensor(data=self.pos[pos_offset : pos_offset + num_atoms]).astype( + dtype="float32" + ) + % 1.0, + cell=paddle.to_tensor(data=self.cell[index]).astype(dtype="float32").unsqueeze(axis=0), + atomic_numbers=paddle.to_tensor( + data=self.atomic_numbers[pos_offset : pos_offset + num_atoms] + ), + num_atoms=num_atoms, + num_nodes=num_atoms, + **props_dict, + ) + if self.transforms is not None: + for t in self.transforms: + data = t(data) + data = {"data": data, "metadata": np.asarray([index])} + return data + + def __len__(self) -> int: + return len(self.num_atoms) + + def subset(self, indices: Sequence[int]) -> "CrystalDataset": + batch_indices: list[int] = [] + for index in indices: + pos_offset = self.index_offset[index] + batch_indices.extend(range(pos_offset, pos_offset + self.num_atoms[index])) + return CrystalDataset( + pos=self.pos[batch_indices], + cell=self.cell[indices], + atomic_numbers=self.atomic_numbers[batch_indices], + num_atoms=self.num_atoms[indices], + structure_id=self.structure_id[indices], + properties={k: v[indices] for k, v in self.properties.items()}, + transforms=self.transforms, + ) + + def repeat(self, repeats: int) -> "CrystalDataset": + """ + Repeat the dataset a number of times. + """ + pos = repeat_along_first_axis(self.pos, repeats) + cell = repeat_along_first_axis(self.cell, repeats) + atomic_numbers = repeat_along_first_axis(self.atomic_numbers, repeats) + num_atoms = repeat_along_first_axis(self.num_atoms, repeats) + structure_id = repeat_along_first_axis(self.structure_id, repeats) + properties = {k: repeat_along_first_axis(v, repeats) for k, v in self.properties.items()} + return CrystalDataset( + pos=pos, + cell=cell, + atomic_numbers=atomic_numbers, + num_atoms=num_atoms, + structure_id=structure_id, + properties=properties, + transforms=self.transforms, + ) + + +@dataclass(frozen=True, kw_only=True) +class NumAtomsCrystalDataset(BaseDataset): + """ + A dataset class for crystal structures where the number of atoms is the only property. Optionally, + other properties can be added as well, as a dictionary of numpy arrays. + This is useful for sampling, where only need to condition on the number of atoms in the structure. + Positions and cell are filled with NaNs, and the atomic numbers are filled with -1 for ChemGraphs + that are created from this dataset. + """ + + num_atoms: numpy.typing.NDArray + structure_id: numpy.typing.NDArray | None = None + properties: dict[PropertySourceId, numpy.typing.NDArray] = field(default_factory=dict) + transforms: list[Transform] | None = None + + def __getitem__(self, index: int) -> ChemGraph: + num_atoms = paddle.to_tensor(data=self.num_atoms[index]) + props_dict = self.get_properties_dict(index) + data = ChemGraph( + pos=paddle.full(shape=(num_atoms, 3), fill_value=float("nan"), dtype="float32"), + cell=paddle.full(shape=(1, 3, 3), fill_value=float("nan"), dtype="float32"), + atomic_numbers=paddle.full(shape=(num_atoms,), fill_value=-1, dtype="int64"), + num_atoms=num_atoms, + num_nodes=num_atoms, + **props_dict, + ) + if self.transforms is not None: + for t in self.transforms: + data = t(data) + # return data + return {"data": data, "metadata": np.asarray([index])} + + def __len__(self) -> int: + return len(self.num_atoms) + + def subset(self, indices: Sequence[int]) -> "NumAtomsCrystalDataset": + return NumAtomsCrystalDataset( + num_atoms=self.num_atoms[indices], + structure_id=self.structure_id[indices] if self.structure_id is not None else None, + properties={k: v[indices] for k, v in self.properties.items()}, + transforms=self.transforms, + ) + + def repeat(self, repeats: int) -> "NumAtomsCrystalDataset": + """ + Repeat the dataset a number of times. + """ + num_atoms = repeat_along_first_axis(self.num_atoms, repeats) + structure_id = repeat_along_first_axis(self.structure_id, repeats) + properties = {k: repeat_along_first_axis(v, repeats) for k, v in self.properties.items()} + return NumAtomsCrystalDataset( + num_atoms=num_atoms, + structure_id=structure_id, + properties=properties, + transforms=self.transforms, + ) + + @classmethod + def from_num_atoms_distribution( + cls: Type[T], + num_atoms_distribution: dict[int, float], + num_samples: int, + transforms: (list[Transform] | None) = None, + ) -> T: + """ + Construct a NumAtomsCrystalDataset from a distribution over number of atoms. + + Args: + num_atoms_distribution: A dictionary with the number of atoms as keys and the probability of that number of atoms as values. + transforms: List of transforms to apply to **each datapoint** when loading, e.g., to make the lattice matrices symmetric. + properties: List of properties to condition on. + dataset_transforms: List of transforms to apply to the **whole dataset**, e.g., to filter out certain entries. + + Returns: + The dataset. + """ + return NumAtomsCrystalDataset( + num_atoms=np.random.choice( + list(num_atoms_distribution.keys()), + size=num_samples, + p=list(num_atoms_distribution.values()), + ), + transforms=transforms, + ) + + +def structures_to_numpy( + structures: Iterable[Structure], +) -> tuple[dict[str, numpy.typing.NDArray], dict[PropertySourceId, numpy.typing.NDArray]]: + """ + Convert a list of Structures to numpy arrays for positions, cell, atomic numbers, + number of atoms and structure id. Returns a dictionary with the numpy arrays. + """ + structure_infos: dict[str, list[numpy.typing.NDArray]] = { + "pos": [], + "cell": [], + "atomic_numbers": [], + "num_atoms": [], + "structure_id": [], + } + properties = defaultdict(list) + for structure in tqdm(structures, desc="Converting structures to numpy", miniters=5000): + struct = structure.get_primitive_structure() + struct = struct.get_reduced_structure() + structure_infos["pos"].append(struct.frac_coords) + structure_infos["cell"].append(struct.lattice.matrix) + structure_infos["atomic_numbers"].append(struct.atomic_numbers) + structure_infos["num_atoms"].append(len(struct)) + structure_infos["structure_id"].append(structure.properties["material_id"]) + for prop, prop_val in structure.properties.items(): + if prop in PROPERTY_SOURCE_IDS: + properties[prop].append(prop_val) + structure_infos["pos"] = np.row_stack(structure_infos["pos"]) + structure_infos["cell"] = np.array(structure_infos["cell"]) + structure_infos["atomic_numbers"] = np.concatenate(structure_infos["atomic_numbers"]) + structure_infos["num_atoms"] = np.array(structure_infos["num_atoms"]) + structure_infos["structure_id"] = np.array(structure_infos["structure_id"]) + for prop in properties: + properties[prop] = np.array(properties[prop]) + assert len(properties[prop]) == len(structure_infos["structure_id"]) + return structure_infos, properties + + +class CrystalDatasetBuilder: + """ + Class for building CrystalDatasets. The builder handles the caching of the numpy arrays and + properties, and can be used to add new properties to the cache. + + The most common way to use the CrystalDatasetBuilder is to use the from_preset method, which + only requires the name of the reference dataset. The builder will then check if the dataset is + already cached, and if not, cache it. The builder can also be used to add new properties to the + cache. + """ + + def __init__( + self, + cache_path: str, + transforms: (list[Transform] | None) = None, + properties: (list[PropertySourceId] | None) = None, + ): + self.cache_path = cache_path + self.transforms = transforms + self.property_names = properties or [] + assert all( + [(s in PROPERTY_SOURCE_IDS) for s in self.property_names] + ), f"Property names {self.property_names} are not valid. Valid property source names: {PROPERTY_SOURCE_IDS}" + + def _load_file(self, filename: str) -> numpy.typing.NDArray: + return np.load(f"{self.cache_path}/{filename}") + + @cached_property + def pos(self): + return self._load_file(CORE_STRUCTURE_FILE_NAMES["pos"]) + + @cached_property + def cell(self): + return self._load_file(CORE_STRUCTURE_FILE_NAMES["cell"]) + + @cached_property + def atomic_numbers(self): + return self._load_file(CORE_STRUCTURE_FILE_NAMES["atomic_numbers"]) + + @cached_property + def num_atoms(self): + return self._load_file(CORE_STRUCTURE_FILE_NAMES["num_atoms"]) + + @cached_property + def structure_id(self): + return self._load_file(CORE_STRUCTURE_FILE_NAMES["structure_id"]) + + @property + def properties(self) -> dict[PropertySourceId, numpy.typing.NDArray]: + properties: dict[PropertySourceId, numpy.typing.NDArray] = {} + prop_names = self.property_names + for prop_name in prop_names: + if not os.path.exists(f"{self.cache_path}/{prop_name}.json"): + raise FileNotFoundError( + f"""{prop_name}.json does not exist in {self.cache_path}. +Available properties: {self.list_available_properties()}""" + ) + properties[prop_name] = PropertyValues.from_json( + f"{self.cache_path}/{prop_name}.json" + ).values + assert len(properties[prop_name]) == len(self.structure_id) + return properties + + def build( + self, + dataset_class: Type[T] = CrystalDataset, + dataset_transforms: (list[DatasetTransform] | None) = None, + ) -> T: + """ + Build a dataset from the cached numpy arrays and properties. The dataset class can be + either CrystalDataset, CrystalStructurePredictionSamplingDataset, or NumAtomsCrystalDataset. + + Args: + dataset_class: The class of the dataset to build. + dataset_transforms: List of transforms to apply to the dataset. + """ + if dataset_class == CrystalDataset: + dataset = self._build_full_dataset() + elif dataset_class == NumAtomsCrystalDataset: + dataset = self._build_num_atoms() + else: + raise ValueError(f"Unknown dataset class {dataset_class}.") + dataset_transforms = dataset_transforms or [] + for t in dataset_transforms: + dataset = t(dataset) + return dataset + + def _build_full_dataset(self) -> CrystalDataset: + """ + Build a CrystalDataset from the cached numpy arrays and properties. + """ + dataset = CrystalDataset( + pos=self.pos, + cell=self.cell, + atomic_numbers=self.atomic_numbers, + num_atoms=self.num_atoms, + structure_id=self.structure_id, + properties=self.properties, + transforms=self.transforms, + ) + return dataset + + def _build_num_atoms(self) -> NumAtomsCrystalDataset: + """ + Build a NumAtomsCrystalDataset from the cached numpy arrays and properties. + """ + dataset = NumAtomsCrystalDataset( + num_atoms=self.num_atoms, + structure_id=self.structure_id, + properties=self.properties, + transforms=self.transforms, + ) + return dataset + + @classmethod + def from_dataset_name( + cls, + dataset_name: str, + split: str, + transforms: (list[Transform] | None) = None, + properties: (list[PropertySourceId] | None) = None, + ): + return cls.from_cache_path( + f"{PROJECT_ROOT}/datasets/{dataset_name}/{split}", transforms, properties + ) + + @classmethod + def from_cache_path( + cls, + cache_path: str, + transforms: (list[Transform] | None) = None, + properties: (list[PropertySourceId] | None) = None, + ) -> "CrystalDatasetBuilder": + """ + Create a CrystalDatasetBuilder from a path that contains cache for the dataset. + """ + return cls(cache_path=cache_path, transforms=transforms, properties=properties) + + @classmethod + def from_csv(cls, csv_path: str, cache_path: str, transforms: (list[Transform] | None) = None): + df = pd.read_csv(csv_path) + structures = [ + CifParser.from_str(s).parse_structures(primitive=True, on_error="ignore")[0] + for s in tqdm(df["cif"], desc="Parsing CIFs", miniters=5000) + ] + for ix, material_id in enumerate(df["material_id"]): + structures[ix].properties["material_id"] = material_id + for prop in df.columns: + if prop in PROPERTY_SOURCE_IDS: + structures[ix].properties[prop] = df[prop][ix] + structure_infos, properties = structures_to_numpy(structures) + os.makedirs(cache_path, exist_ok=True) + print(f"Storing cached dataset in {cache_path}.") + for k, filename in CORE_STRUCTURE_FILE_NAMES.items(): + np.save(f"{cache_path}/{filename}", structure_infos[k]) + for prop in properties: + PropertyValues(values=properties[prop], property_source_doc_id=prop).to_json( + f"{cache_path}/{prop}.json" + ) + return cls( + cache_path=cache_path, + transforms=transforms, + properties=list(properties.keys()), + ) + + def list_available_properties(self) -> list[PropertySourceId]: + """ + List the properties that are available in the cache. + """ + return [ + prop.split(".json")[0] for prop in os.listdir(self.cache_path) if prop.endswith(".json") + ] + + def add_property_to_cache( + self, property_name: PropertySourceId, data: dict[str, numpy.typing.NDArray] + ): + """ + Add a new property to the cache. The property will be stored in the blob storage and added + to the properties of the dataset. + + The data should be a dictionary with the structure id as keys and the property values as + values. The properties can be sparse, i.e. some structures can be missing the property. + These properties will be set to NaN in the dataset. + """ + assert ( + property_name not in self.property_names + ), f"Property {property_name} already exists in properties" + property_values_linearized = np.array( + [data.get(structure_id, np.nan) for structure_id in self.structure_id] + ) + property_values = PropertyValues( + values=property_values_linearized, property_source_doc_id=property_name + ) + assert property_values.n_entries == len( + self.structure_id + ), f"Property {property_name} has {property_values.n_entries} entries, but the dataset has {len(self.structure_id)} structures." + property_values.to_json(self.cache_path + "/" + f"{property_name}.json") + self.property_names.append(property_name) diff --git a/jointContribution/mattergen/mattergen/common/data/dataset_transform.py b/jointContribution/mattergen/mattergen/common/data/dataset_transform.py new file mode 100644 index 00000000..36eca84c --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/dataset_transform.py @@ -0,0 +1,30 @@ +import numpy as np +from numpy.typing import NDArray + +from mattergen.common.data.dataset import BaseDataset + + +def is_nan(value: NDArray) -> NDArray: + if value.dtype.kind == "U": + return np.zeros(value.shape, dtype=bool) + return np.isnan(value) + + +def filter_sparse_properties(dataset: BaseDataset) -> BaseDataset: + """ + Filter out structures with missing properties. + Returns a new dataset with only structures that have all properties. + """ + if len(dataset.properties) == 0: + return dataset + indices_with_all_properties = np.where( + np.all([(~is_nan(val)) for val in dataset.properties.values()], axis=0) + )[0] + return dataset.subset(indices=indices_with_all_properties) + + +def repeat(dataset: BaseDataset, n: int) -> BaseDataset: + """ + Repeat the dataset n times. + """ + return dataset.repeat(n) diff --git a/jointContribution/mattergen/mattergen/common/data/num_atoms_distribution.py b/jointContribution/mattergen/mattergen/common/data/num_atoms_distribution.py new file mode 100644 index 00000000..8125789c --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/num_atoms_distribution.py @@ -0,0 +1,38 @@ +NUM_ATOMS_DISTRIBUTIONS = { + "ALEX_MP_20": { + (1): 0.0002303828963737732, + (2): 0.002804088967292211, + (3): 0.019342289742695216, + (4): 0.1636343889258233, + (5): 0.04668051158167732, + (6): 0.07808005476530565, + (7): 0.027247714272549548, + (8): 0.1150400537121267, + (9): 0.048984340545415055, + (10): 0.12620539622566992, + (11): 0.03577352703049611, + (12): 0.14591300741832927, + (13): 0.0060031200426537475, + (14): 0.028628366058675234, + (15): 0.02022761830161729, + (16): 0.04473213051520198, + (17): 0.0013033089566287742, + (18): 0.038699389814443035, + (19): 0.0070135136024644384, + (20): 0.04345679662456145, + }, + "2d_12": { + (1): 0.0, + (2): 0.00081494, + (3): 0.01059419, + (4): 0.01777136, + (5): 0.02129561, + (6): 0.21579406, + (7): 0.03336955, + (8): 0.12544321, + (9): 0.12088242, + (10): 0.10070199, + (11): 0.0, + (12): 0.35333267, + } +} diff --git a/jointContribution/mattergen/mattergen/common/data/transform.py b/jointContribution/mattergen/mattergen/common/data/transform.py new file mode 100644 index 00000000..c6238146 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/transform.py @@ -0,0 +1,47 @@ +from typing import Protocol +from typing import Sequence + +import paddle +from pymatgen.core import Composition + +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.utils.data_utils import compute_lattice_polar_decomposition +from mattergen.common.utils.data_utils import get_element_symbol +from mattergen.common.utils.globals import MAX_ATOMIC_NUM + + +class Transform(Protocol): + def __call__(self, sample: ChemGraph) -> ChemGraph: + ... + + +def symmetrize_lattice(sample: ChemGraph) -> ChemGraph: + return sample.replace(cell=compute_lattice_polar_decomposition(sample.cell)) + + +def set_chemical_system(sample: ChemGraph) -> ChemGraph: + chemsys = ( + paddle.eye(num_rows=MAX_ATOMIC_NUM + 1)[sample.atomic_numbers].sum(axis=0) > 0 + ).astype(dtype="float32")[None] + return sample.replace(chemical_system=chemsys) + + +def set_chemical_system_string(sample: ChemGraph) -> ChemGraph: + return sample.replace( + chemical_system=Composition( + {get_element_symbol(Z=i.item()): (1) for i in sample.atomic_numbers} + ).chemical_system + ) + + +class SetProperty: + def __init__(self, property_name: str, value: (float | Sequence[str])): + self.property_name = property_name + self.value = ( + paddle.to_tensor(data=value, dtype="float32") + if isinstance(value, float) or isinstance(value, int) + else value + ) + + def __call__(self, sample: ChemGraph) -> ChemGraph: + return sample.replace(**{self.property_name: self.value}) diff --git a/jointContribution/mattergen/mattergen/common/data/types.py b/jointContribution/mattergen/mattergen/common/data/types.py new file mode 100644 index 00000000..7de47d05 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/types.py @@ -0,0 +1,47 @@ +import json +from dataclasses import dataclass +from typing import Sequence + +import numpy as np +from emmet.core.material import PropertyOrigin + +from mattergen.common.utils.globals import PROPERTY_SOURCE_IDS + +PropertySourceId = str +TargetProperty = dict[PropertySourceId, int | float | Sequence[str]] + + +@dataclass(frozen=True) +class PropertyValues: + """A class for storing the values of a property""" + + values: np.ndarray + property_source_doc_id: PropertySourceId + origins: list[PropertyOrigin] | None = None + + def __post_init__(self): + assert ( + self.property_source_doc_id in PROPERTY_SOURCE_IDS + ), f"property_source_doc_id {self.property_source_doc_id} not found in the database. Available property_source_doc_ids: {PROPERTY_SOURCE_IDS}" + + @property + def n_entries(self) -> int: + return self.values.shape[0] + + def to_json(self, filename): + with open(filename, "w") as f: + json.dump( + { + "values": self.values.tolist(), + "property_source_doc_id": self.property_source_doc_id, + "origins": self.origins, + }, + f, + ) + + @classmethod + def from_json(cls, filename): + with open(filename, "r") as f: + data = json.load(f) + data["values"] = np.array(data["values"]) + return cls(**data) diff --git a/jointContribution/mattergen/mattergen/common/data/utils.py b/jointContribution/mattergen/mattergen/common/data/utils.py new file mode 100644 index 00000000..12b99e0d --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/data/utils.py @@ -0,0 +1,31 @@ +import os +import signal + + +def term_mp(sig_num, frame): + """kill all child processes""" + pid = os.getpid() + pgid = os.getpgid(os.getpid()) + print("main proc {} exit, kill process group " "{}".format(pid, pgid)) + os.killpg(pgid, signal.SIGKILL) + + +def set_signal_handlers(): + pid = os.getpid() + try: + pgid = os.getpgid(pid) + except AttributeError: + # In case `os.getpgid` is not available, no signal handler will be set, + # because we cannot do safe cleanup. + pass + else: + # XXX: `term_mp` kills all processes in the process group, which in + # some cases includes the parent process of current process and may + # cause unexpected results. To solve this problem, we set signal + # handlers only when current process is the group leader. In the + # future, it would be better to consider killing only descendants of + # the current process. + if pid == pgid: + # support exit using ctrl+c + signal.signal(signal.SIGINT, term_mp) + signal.signal(signal.SIGTERM, term_mp) diff --git a/jointContribution/mattergen/mattergen/common/diffusion/__init__.py b/jointContribution/mattergen/mattergen/common/diffusion/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/common/diffusion/corruption.py b/jointContribution/mattergen/mattergen/common/diffusion/corruption.py new file mode 100644 index 00000000..c15b3f3c --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/diffusion/corruption.py @@ -0,0 +1,243 @@ +import sys + +import paddle +from omegaconf import DictConfig + +from mattergen.diffusion.corruption.corruption import B +from mattergen.diffusion.corruption.corruption import BatchedData +from mattergen.diffusion.corruption.corruption import maybe_expand +from mattergen.diffusion.corruption.sde_lib import SDE as DiffSDE +from mattergen.diffusion.corruption.sde_lib import VESDE as DiffVESDE +from mattergen.diffusion.corruption.sde_lib import VPSDE +from mattergen.diffusion.wrapped.wrapped_sde import WrappedVESDE +from paddle_utils import * + + +def expand(a, x_shape, left=False): + a_dim = len(tuple(a.shape)) + if left: + return a.reshape(*((1,) * (len(x_shape) - a_dim) + tuple(a.shape))) + else: + return a.reshape(*(tuple(a.shape) + (1,) * (len(x_shape) - a_dim))) + + +def make_noise_symmetric_preserve_variance(noise: paddle.Tensor) -> paddle.Tensor: + """Makes the noise matrix symmetric, preserving the variance. Assumes i.i.d. noise for each dimension. + + Args: + noise (paddle.Tensor): Input noise matrix, must be a batched square matrix, i.e., have shape (batch_size, dim, dim). + + Returns: + paddle.Tensor: The symmetric noise matrix, with the same variance as the input. + """ + assert ( + len(tuple(noise.shape)) == 3 and tuple(noise.shape)[1] == tuple(noise.shape)[2] + ), "Symmetric noise only works for square-matrix-shaped data." + return ( + 1 + / 2**0.5 + * (1 - paddle.eye(num_rows=3)[None]) + * (noise + noise.transpose(perm=dim2perm(noise.ndim, 1, 2))) + + paddle.eye(num_rows=3)[None] * noise + ) + + +class LatticeVPSDE(VPSDE): + @staticmethod + def from_vpsde_config(vpsde_config: DictConfig): + return LatticeVPSDE(**vpsde_config) + + def __init__( + self, + beta_min: float = 0.1, + beta_max: float = 20, + limit_density: (float | None) = 0.05, + limit_var_scaling_constant: float = 0.25, + **kwargs + ): + """Variance-preserving SDE with drift coefficient changing linearly over time.""" + super().__init__() + self.beta_0 = beta_min + self.beta_1 = beta_max + self.limit_density = limit_density + self.limit_var_scaling_constant = limit_var_scaling_constant + self._limit_info_key = "num_atoms" + + @property + def limit_info_key(self) -> str: + return self._limit_info_key + + def beta(self, t: paddle.Tensor) -> paddle.Tensor: + return self.beta_0 + t * (self.beta_1 - self.beta_0) + + def _marginal_mean_coeff(self, t: paddle.Tensor) -> paddle.Tensor: + log_mean_coeff = -0.25 * t**2 * (self.beta_1 - self.beta_0) - 0.5 * t * self.beta_0 + return paddle.exp(x=log_mean_coeff) + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: (BatchedData | None) = None, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + assert batch is not None + mean_coeff = self._marginal_mean_coeff(t) + limit_mean = self.get_limit_mean(x=x, batch=batch) + limit_var = self.get_limit_var(x=x, batch=batch) + mean_coeff_expanded = maybe_expand(mean_coeff, batch_idx, x) + mean = mean_coeff_expanded * x + (1 - mean_coeff_expanded) * limit_mean + std = paddle.sqrt(x=(1.0 - mean_coeff_expanded**2) * limit_var) + return mean, std + + def mean_coeff_and_std( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: (BatchedData | None) = None, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + """Returns mean coefficient and standard deviation of marginal distribution at time t.""" + mean_coeff = self._marginal_mean_coeff(t) + std = self.marginal_prob(x, t, batch_idx, batch)[1] + return maybe_expand(mean_coeff, batch=None, like=x), std + + def get_limit_mean(self, x: paddle.Tensor, batch: BatchedData) -> paddle.Tensor: + n_atoms = batch[self.limit_info_key] + return paddle.pow( + x=paddle.eye(num_rows=3).expand(shape=[len(n_atoms), 3, 3]) + * n_atoms[:, None, None].astype("float32") + / self.limit_density, + y=1.0 / 3, + ).to(x.place) + + def get_limit_var(self, x: paddle.Tensor, batch: BatchedData) -> paddle.Tensor: + """ + Returns the element-wise variance of the limit distribution. + NOTE: even though we have a different limit variance per data + dimension we still sample IID for each element per data point. + We do NOT do any correlated sampling over data dimensions per + data point. + + Return shape=x.shape + """ + n_atoms = batch[self.limit_info_key] + n_atoms_expanded = expand(n_atoms, tuple(x.shape)) + n_atoms_expanded = paddle.tile(x=n_atoms_expanded, repeat_times=(1, 3, 3)).cast("float32") + out = ( + paddle.pow(x=n_atoms_expanded, y=2.0 / 3).to(x.place) * self.limit_var_scaling_constant + ) + return out + + def sample_marginal( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: (BatchedData | None) = None, + ) -> paddle.Tensor: + mean, std = self.marginal_prob(x=x, t=t, batch=batch) + z = paddle.randn(shape=x.shape, dtype=x.dtype) + z = make_noise_symmetric_preserve_variance(z) + return mean + expand(std, tuple(z.shape)) * z + + def prior_sampling( + self, + shape: (list | tuple), + conditioning_data: (BatchedData | None) = None, + batch_idx: B = None, + ) -> paddle.Tensor: + x_sample = paddle.randn(shape=shape) + x_sample = make_noise_symmetric_preserve_variance(x_sample) + assert conditioning_data is not None + limit_info = conditioning_data[self.limit_info_key] + x_sample = x_sample.to(limit_info.place) + limit_mean = self.get_limit_mean(x=x_sample, batch=conditioning_data) + limit_var = self.get_limit_var(x=x_sample, batch=conditioning_data) + return x_sample * limit_var.sqrt() + limit_mean + + def sde( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: (BatchedData | None) = None, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + assert batch is not None + limit_mean = self.get_limit_mean(x=x, batch=batch) + limit_var = self.get_limit_var(x=x, batch=batch) + beta_t = self.beta(t) + drift = -0.5 * expand(beta_t, tuple(x.shape)) * (x - limit_mean) + diffusion = paddle.sqrt(x=expand(beta_t, tuple(limit_var.shape)) * limit_var) + return maybe_expand(drift, batch_idx), maybe_expand(diffusion, batch_idx) + + +class NumAtomsVarianceAdjustedWrappedVESDE(WrappedVESDE): + """Wrapped VESDE with variance adjusted by number of atoms. We divide the standard deviation by the cubic root of the number of atoms. + The goal is to reduce the influence by the cell size on the variance of the fractional coordinates. + """ + + def __init__( + self, + wrapping_boundary: (float | paddle.Tensor) = 1.0, + sigma_min: float = 0.01, + sigma_max: float = 5.0, + limit_info_key: str = "num_atoms", + ): + super().__init__( + sigma_min=sigma_min, + sigma_max=sigma_max, + wrapping_boundary=wrapping_boundary, + ) + self.limit_info_key = limit_info_key + + def std_scaling(self, batch: BatchedData) -> paddle.Tensor: + return batch[self.limit_info_key] ** (-1 / 3) + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: (BatchedData | None) = None, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + mean, std = super().marginal_prob(x, t, batch_idx, batch) + assert ( + batch is not None + ), "batch must be provided when using NumAtomsVarianceAdjustedWrappedVESDEMixin" + std_scale = self.std_scaling(batch) + std = std * maybe_expand(std_scale, batch_idx, like=std) + return mean, std + + def prior_sampling( + self, + shape: (list | tuple), + conditioning_data: (BatchedData | None) = None, + batch_idx=None, + ) -> paddle.Tensor: + _super = super() + assert isinstance(self, DiffSDE) and hasattr(_super, "prior_sampling") + assert ( + conditioning_data is not None + ), "batch must be provided when using NumAtomsVarianceAdjustedWrappedVESDEMixin" + num_atoms = conditioning_data[self.limit_info_key] + batch_idx = paddle.repeat_interleave( + x=paddle.arange(end=tuple(num_atoms.shape)[0]), repeats=num_atoms, axis=0 + ) + std_scale = self.std_scaling(conditioning_data) + prior_sample = DiffVESDE.prior_sampling(self, shape=shape).to(num_atoms.place) + return self.wrap(prior_sample * maybe_expand(std_scale, batch_idx, like=prior_sample)) + + def sde( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: (BatchedData | None) = None, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + sigma = self.marginal_prob(x, t, batch_idx, batch)[1] + sigma_min = self.marginal_prob(x, paddle.zeros_like(x=t), batch_idx, batch)[1] + sigma_max = self.marginal_prob(x, paddle.ones_like(x=t), batch_idx, batch)[1] + drift = paddle.zeros_like(x=x) + diffusion = sigma * paddle.sqrt(x=2 * (sigma_max.log() - sigma_min.log())) + return drift, diffusion diff --git a/jointContribution/mattergen/mattergen/common/diffusion/predictors_correctors.py b/jointContribution/mattergen/mattergen/common/diffusion/predictors_correctors.py new file mode 100644 index 00000000..dbee7228 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/diffusion/predictors_correctors.py @@ -0,0 +1,84 @@ +import sys + +import paddle + +from mattergen.common.diffusion import corruption as sde_lib +from mattergen.common.utils.data_utils import compute_lattice_polar_decomposition +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.corruption import maybe_expand +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.sampling import predictors_correctors as pc +from mattergen.diffusion.sampling.predictors import AncestralSamplingPredictor +from paddle_utils import * + +SampleAndMean = tuple[paddle.Tensor, paddle.Tensor] + + +class LatticeAncestralSamplingPredictor(AncestralSamplingPredictor): + @classmethod + def is_compatible(cls, corruption: Corruption) -> bool: + _super = super() + assert hasattr(_super, "is_compatible") + return _super.is_compatible(corruption) or isinstance(corruption, sde_lib.LatticeVPSDE) + + def update_given_score( + self, + *, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + batch: (BatchedData | None) + ) -> SampleAndMean: + x_coeff, score_coeff, std = self._get_coeffs( + x=x, t=t, dt=dt, batch_idx=batch_idx, batch=batch + ) + mean_coeff = 1 - x_coeff + z = sde_lib.make_noise_symmetric_preserve_variance( + paddle.randn(shape=x_coeff.shape, dtype=x_coeff.dtype) + ) + assert hasattr(self.corruption, "get_limit_mean") + mean = ( + x_coeff * x + + score_coeff * score + + mean_coeff * self.corruption.get_limit_mean(x=x, batch=batch) + ) + sample = mean + std * z + return sample, mean + + +class LatticeLangevinDiffCorrector(pc.LangevinCorrector): + @classmethod + def is_compatible(cls, corruption: Corruption) -> bool: + _super = super() + assert hasattr(_super, "is_compatible") + return _super.is_compatible(corruption) or isinstance(corruption, sde_lib.LatticeVPSDE) + + def step_given_score( + self, + *, + x: paddle.Tensor, + batch_idx, #: (paddle.int64 | None), todo: fix this + score: paddle.Tensor, + t: paddle.Tensor + ) -> SampleAndMean: + assert isinstance(self.corruption, sde_lib.LatticeVPSDE) + alpha = self.get_alpha(t) + snr = self.snr + noise = paddle.randn(shape=x.shape, dtype=x.dtype) + noise = sde_lib.make_noise_symmetric_preserve_variance(noise) + grad_norm_square = paddle.square(x=score).reshape(tuple(score.shape)[0], -1).sum(axis=1) + noise_norm_square = paddle.square(x=noise).reshape(tuple(noise.shape)[0], -1).sum(axis=1) + grad_norm = grad_norm_square.sqrt().mean() + noise_norm = noise_norm_square.sqrt().mean() + step_size = (snr * noise_norm / grad_norm) ** 2 * 2 * alpha + step_size = paddle.minimum(x=step_size, y=self.max_step_size) + if grad_norm == 0: + step_size[:] = self.max_step_size + step_size = maybe_expand(step_size, batch_idx, score) + mean = x + step_size * score + x = mean + paddle.sqrt(x=step_size * 2) * noise + x = compute_lattice_polar_decomposition(x) + mean = compute_lattice_polar_decomposition(mean) + return x, mean diff --git a/jointContribution/mattergen/mattergen/common/embeddings/__init__.py b/jointContribution/mattergen/mattergen/common/embeddings/__init__.py new file mode 100644 index 00000000..b09f1837 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/embeddings/__init__.py @@ -0,0 +1,5 @@ +__all__ = ["KHOT_EMBEDDINGS", "CONTINUOUS_EMBEDDINGS", "MAX_ATOMIC_NUM"] +from mattergen.common.embeddings.continuous_embeddings import CONTINUOUS_EMBEDDINGS +from mattergen.common.embeddings.khot_embeddings import KHOT_EMBEDDINGS + +MAX_ATOMIC_NUM = 100 diff --git a/jointContribution/mattergen/mattergen/common/embeddings/continuous_embeddings.py b/jointContribution/mattergen/mattergen/common/embeddings/continuous_embeddings.py new file mode 100644 index 00000000..a53aabd7 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/embeddings/continuous_embeddings.py @@ -0,0 +1,1099 @@ +""" +CGCNN-like embeddings using continuous values instead of original k-hot. + +Properties: + Group number + Period number + Electronegativity + Covalent radius + Valence electrons + First ionization energy + Electron affinity + Block + Atomic Volume + +NaN stored for unavailable parameters. +""" +CONTINUOUS_EMBEDDINGS = { + (0): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], + (1): [ + 1.0, + 1.0, + 2.1877708435058594, + 31.0, + 1.0, + 13.598434448242188, + 0.754194974899292, + 1.0, + 14.100000381469727, + ], + (2): [ + 18.0, + 1.0, + 1.0, + 28.0, + 2.0, + 24.587387084960938, + -19.700000762939453, + 1.0, + 31.799999237060547, + ], + (3): [ + 1.0, + 2.0, + 0.04886792600154877, + 128.0, + 1.0, + 5.391714572906494, + 0.6180490255355835, + 1.0, + 13.100000381469727, + ], + (4): [ + 2.0, + 2.0, + 0.1268472671508789, + 96.0, + 2.0, + 9.322698593139648, + -2.4000000953674316, + 1.0, + 5.0, + ], + (5): [ + 13.0, + 2.0, + 0.25462737679481506, + 84.0, + 3.0, + 8.298019409179688, + 0.27972298860549927, + 2.0, + 4.599999904632568, + ], + (6): [ + 14.0, + 2.0, + 0.42752504348754883, + 73.0, + 4.0, + 11.260295867919922, + 1.2621190547943115, + 2.0, + 5.300000190734863, + ], + (7): [ + 15.0, + 2.0, + 0.5774819254875183, + 71.0, + 5.0, + 14.534130096435547, + -1.399999976158142, + 2.0, + 17.299999237060547, + ], + (8): [ + 16.0, + 2.0, + 0.9416494369506836, + 66.0, + 6.0, + 13.618054389953613, + 1.461113452911377, + 2.0, + 14.0, + ], + (9): [ + 17.0, + 2.0, + 1.017681360244751, + 57.0, + 7.0, + 17.422819137573242, + 3.4011898040771484, + 2.0, + 17.100000381469727, + ], + (10): [18.0, 2.0, 1.0, 58.0, 8.0, 21.56454086303711, -3.0, 2.0, 16.799999237060547], + (11): [ + 1.0, + 3.0, + 0.09459763765335083, + 166.0, + 1.0, + 5.1390767097473145, + 0.5479260087013245, + 1.0, + 23.700000762939453, + ], + (12): [ + 2.0, + 3.0, + 0.15242105722427368, + 141.0, + 2.0, + 7.64623498916626, + -3.0, + 1.0, + 14.0, + ], + (13): [ + 13.0, + 3.0, + 0.2360926866531372, + 121.0, + 3.0, + 5.9857683181762695, + 0.43283000588417053, + 2.0, + 10.0, + ], + (14): [ + 14.0, + 3.0, + 0.3468157947063446, + 111.0, + 4.0, + 8.15168285369873, + 1.3895211219787598, + 2.0, + 12.100000381469727, + ], + (15): [ + 15.0, + 3.0, + 0.45102688670158386, + 107.0, + 5.0, + 10.486685752868652, + 0.7466070055961609, + 2.0, + 17.0, + ], + (16): [ + 16.0, + 3.0, + 0.6397251486778259, + 105.0, + 6.0, + 10.360010147094727, + 2.077104091644287, + 2.0, + 15.5, + ], + (17): [ + 17.0, + 3.0, + 0.8123772740364075, + 102.0, + 7.0, + 12.967630386352539, + 3.612725019454956, + 2.0, + 18.700000762939453, + ], + (18): [ + 18.0, + 3.0, + 1.0, + 106.0, + 8.0, + 15.759611129760742, + -11.5, + 2.0, + 24.200000762939453, + ], + (19): [ + 1.0, + 4.0, + 0.12183826416730881, + 203.0, + 1.0, + 4.340663433074951, + 0.5014700293540955, + 1.0, + 45.29999923706055, + ], + (20): [ + 2.0, + 4.0, + 0.1901577115058899, + 176.0, + 2.0, + 6.113155364990234, + 0.024550000205636024, + 1.0, + 29.899999618530273, + ], + (21): [ + 3.0, + 4.0, + 0.3038673996925354, + 170.0, + 3.0, + 6.561490058898926, + 0.18799999356269836, + 3.0, + 15.0, + ], + (22): [ + 4.0, + 4.0, + 0.4055461883544922, + 160.0, + 4.0, + 6.828120231628418, + 0.07900000363588333, + 3.0, + 10.600000381469727, + ], + (23): [ + 5.0, + 4.0, + 0.4388898015022278, + 153.0, + 5.0, + 6.746187210083008, + 0.5249999761581421, + 3.0, + 8.350000381469727, + ], + (24): [ + 6.0, + 4.0, + 0.6017723083496094, + 139.0, + 6.0, + 6.766510009765625, + 0.6660000085830688, + 3.0, + 7.230000019073486, + ], + (25): [ + 7.0, + 4.0, + 0.6707264184951782, + 150.0, + 7.0, + 7.434018135070801, + -3.0, + 3.0, + 7.389999866485596, + ], + (26): [ + 8.0, + 4.0, + 0.748727023601532, + 142.0, + 8.0, + 7.902467727661133, + 0.1509999930858612, + 3.0, + 7.099999904632568, + ], + (27): [ + 9.0, + 4.0, + 0.8832423686981201, + 138.0, + 9.0, + 7.881010055541992, + 0.6622564792633057, + 3.0, + 6.699999809265137, + ], + (28): [ + 10.0, + 4.0, + 0.9377039670944214, + 124.0, + 10.0, + 7.639876842498779, + 1.156000018119812, + 3.0, + 6.599999904632568, + ], + (29): [ + 11.0, + 4.0, + 0.9175541996955872, + 132.0, + 11.0, + 7.726379871368408, + 1.2350000143051147, + 3.0, + 7.099999904632568, + ], + (30): [ + 12.0, + 4.0, + 0.8100876808166504, + 122.0, + 12.0, + 9.39419937133789, + -3.0, + 3.0, + 9.199999809265137, + ], + (31): [ + 13.0, + 4.0, + 0.7205410003662109, + 122.0, + 3.0, + 5.999301910400391, + 0.4300000071525574, + 2.0, + 11.800000190734863, + ], + (32): [ + 14.0, + 4.0, + 0.8001470565795898, + 120.0, + 4.0, + 7.899435043334961, + 1.2327120304107666, + 2.0, + 13.600000381469727, + ], + (33): [ + 15.0, + 4.0, + 0.825337290763855, + 119.0, + 5.0, + 9.788999557495117, + 0.8040000200271606, + 2.0, + 13.100000381469727, + ], + (34): [ + 16.0, + 4.0, + 0.9659121036529541, + 120.0, + 6.0, + 9.752391815185547, + 2.020669937133789, + 2.0, + 16.5, + ], + (35): [ + 17.0, + 4.0, + 1.0490256547927856, + 120.0, + 7.0, + 11.813810348510742, + 3.3635880947113037, + 2.0, + 23.5, + ], + (36): [ + 18.0, + 4.0, + 1.0, + 116.0, + 8.0, + 13.999605178833008, + -3.0, + 2.0, + 32.20000076293945, + ], + (37): [ + 1.0, + 5.0, + 0.1764136552810669, + 220.0, + 1.0, + 4.177127838134766, + 0.4859200119972229, + 1.0, + 55.900001525878906, + ], + (38): [ + 2.0, + 5.0, + 0.26317858695983887, + 195.0, + 2.0, + 5.694867134094238, + 0.04800000041723251, + 1.0, + 33.70000076293945, + ], + (39): [ + 3.0, + 5.0, + 0.39239412546157837, + 190.0, + 3.0, + 6.217259883880615, + 0.3070000112056732, + 3.0, + 19.799999237060547, + ], + (40): [ + 4.0, + 5.0, + 0.4744466543197632, + 175.0, + 4.0, + 6.633900165557861, + 0.4259999990463257, + 3.0, + 14.100000381469727, + ], + (41): [ + 5.0, + 5.0, + 0.5561695098876953, + 164.0, + 5.0, + 6.75885009765625, + 0.9174060225486755, + 3.0, + 10.800000190734863, + ], + (42): [ + 6.0, + 5.0, + 0.6852949857711792, + 154.0, + 6.0, + 7.092430114746094, + 0.7480000257492065, + 3.0, + 9.399999618530273, + ], + (43): [ + 7.0, + 5.0, + 0.8753613233566284, + 147.0, + 7.0, + 7.119380950927734, + 0.550000011920929, + 3.0, + 8.5, + ], + (44): [ + 8.0, + 5.0, + 0.9579373002052307, + 146.0, + 8.0, + 7.360499858856201, + 1.0499999523162842, + 3.0, + 8.300000190734863, + ], + (45): [ + 9.0, + 5.0, + 0.9761914610862732, + 142.0, + 9.0, + 7.458899974822998, + 1.1369999647140503, + 3.0, + 8.300000190734863, + ], + (46): [ + 10.0, + 5.0, + 1.1242631673812866, + 139.0, + 12.0, + 8.336859703063965, + 0.5619999766349792, + 3.0, + 8.899999618530273, + ], + (47): [ + 11.0, + 5.0, + 0.9437955021858215, + 145.0, + 11.0, + 7.576233863830566, + 1.3020000457763672, + 3.0, + 10.300000190734863, + ], + (48): [ + 12.0, + 5.0, + 0.8015620112419128, + 144.0, + 12.0, + 8.99382209777832, + -3.0, + 3.0, + 13.100000381469727, + ], + (49): [ + 13.0, + 5.0, + 0.7172747254371643, + 142.0, + 3.0, + 5.786355018615723, + 0.30000001192092896, + 2.0, + 15.699999809265137, + ], + (50): [ + 14.0, + 5.0, + 0.7622796893119812, + 139.0, + 4.0, + 7.343916893005371, + 1.1120669841766357, + 2.0, + 16.299999237060547, + ], + (51): [ + 15.0, + 5.0, + 0.7762722373008728, + 139.0, + 5.0, + 8.608388900756836, + 1.0460000038146973, + 2.0, + 18.399999618530273, + ], + (52): [ + 16.0, + 5.0, + 0.8622506260871887, + 138.0, + 6.0, + 9.009659767150879, + 1.9708759784698486, + 2.0, + 20.5, + ], + (53): [ + 17.0, + 5.0, + 0.9386428594589233, + 139.0, + 7.0, + 10.45125961303711, + 3.0590367317199707, + 2.0, + 25.700000762939453, + ], + (54): [ + 18.0, + 5.0, + 1.0, + 140.0, + 8.0, + 12.129842758178711, + -0.0560000017285347, + 2.0, + 42.900001525878906, + ], + (55): [ + 1.0, + 6.0, + 0.18145304918289185, + 244.0, + 1.0, + 3.8939056396484375, + 0.47162601351737976, + 1.0, + 70.0, + ], + (56): [ + 2.0, + 6.0, + 0.3032951354980469, + 215.0, + 2.0, + 5.211664199829102, + 0.14462000131607056, + 1.0, + 39.0, + ], + (57): [ + 3.0, + 6.0, + 0.39465051889419556, + 207.0, + 3.0, + 5.576900005340576, + 0.4699999988079071, + 3.0, + 22.5, + ], + (58): [ + 4.0, + 6.0, + 0.5356179475784302, + 204.0, + 2.0, + 5.538599967956543, + 0.6499999761581421, + 4.0, + 21.0, + ], + (59): [ + 5.0, + 6.0, + 0.4288040101528168, + 203.0, + 2.0, + 5.4730000495910645, + 0.9620000123977661, + 4.0, + 20.799999237060547, + ], + (60): [ + 6.0, + 6.0, + 0.44721803069114685, + 201.0, + 2.0, + 5.525000095367432, + 1.9160000085830688, + 4.0, + 20.600000381469727, + ], + (61): [ + 7.0, + 6.0, + 0.4585537314414978, + 199.0, + 2.0, + 5.581999778747559, + -3.0, + 4.0, + 20.229999542236328, + ], + (62): [ + 8.0, + 6.0, + 0.47021451592445374, + 198.0, + 2.0, + 5.643710136413574, + -3.0, + 4.0, + 19.899999618530273, + ], + (63): [ + 9.0, + 6.0, + 0.5085079669952393, + 198.0, + 2.0, + 5.670384883880615, + 0.8640000224113464, + 4.0, + 28.899999618530273, + ], + (64): [ + 10.0, + 6.0, + 0.5033860206604004, + 196.0, + 2.0, + 6.149796009063721, + -3.0, + 4.0, + 19.899999618530273, + ], + (65): [ + 11.0, + 6.0, + 0.5163695216178894, + 194.0, + 2.0, + 5.863800048828125, + 1.1649999618530273, + 4.0, + 19.200000762939453, + ], + (66): [ + 12.0, + 6.0, + 0.5297338366508484, + 192.0, + 2.0, + 5.939050197601318, + 0.35199999809265137, + 4.0, + 19.0, + ], + (67): [ + 13.0, + 6.0, + 0.5434919595718384, + 192.0, + 2.0, + 6.021500110626221, + -3.0, + 4.0, + 18.700000762939453, + ], + (68): [ + 14.0, + 6.0, + 0.5576573014259338, + 189.0, + 2.0, + 6.107699871063232, + -3.0, + 4.0, + 18.399999618530273, + ], + (69): [ + 15.0, + 6.0, + 0.5722439289093018, + 190.0, + 2.0, + 6.184309959411621, + 1.0290000438690186, + 4.0, + 18.100000381469727, + ], + (70): [ + 16.0, + 6.0, + 0.517667829990387, + 187.0, + 2.0, + 6.254159927368164, + -0.019999999552965164, + 4.0, + 24.799999237060547, + ], + (71): [ + 17.0, + 6.0, + 0.6027398109436035, + 187.0, + 2.0, + 5.425870895385742, + 0.3400000035762787, + 4.0, + 17.799999237060547, + ], + (72): [ + 4.0, + 6.0, + 0.7352124452590942, + 175.0, + 4.0, + 6.825069904327393, + 0.014000000432133675, + 3.0, + 13.600000381469727, + ], + (73): [ + 5.0, + 6.0, + 0.8358832001686096, + 170.0, + 5.0, + 7.549570083618164, + 0.32199999690055847, + 3.0, + 10.899999618530273, + ], + (74): [ + 6.0, + 6.0, + 1.0192831754684448, + 162.0, + 6.0, + 7.864029884338379, + 0.8162599802017212, + 3.0, + 9.529999732971191, + ], + (75): [ + 7.0, + 6.0, + 1.1745918989181519, + 151.0, + 7.0, + 7.83351993560791, + 0.15000000596046448, + 3.0, + 8.850000381469727, + ], + (76): [ + 8.0, + 6.0, + 1.2392759323120117, + 144.0, + 8.0, + 8.43822956085205, + 1.100000023841858, + 3.0, + 8.430000305175781, + ], + (77): [ + 9.0, + 6.0, + 1.4759982824325562, + 141.0, + 9.0, + 8.967020034790039, + 1.5637999773025513, + 3.0, + 8.539999961853027, + ], + (78): [ + 10.0, + 6.0, + 1.4510095119476318, + 136.0, + 10.0, + 8.958829879760742, + 2.128000020980835, + 3.0, + 9.100000381469727, + ], + (79): [ + 11.0, + 6.0, + 1.4267007112503052, + 136.0, + 11.0, + 9.225552558898926, + 2.3086299896240234, + 3.0, + 10.199999809265137, + ], + (80): [ + 12.0, + 6.0, + 1.1647894382476807, + 132.0, + 12.0, + 10.437503814697266, + -3.0, + 3.0, + 14.800000190734863, + ], + (81): [ + 13.0, + 6.0, + 0.924509584903717, + 145.0, + 3.0, + 6.1082868576049805, + 0.37700000405311584, + 2.0, + 17.200000762939453, + ], + (82): [ + 14.0, + 6.0, + 0.9313225746154785, + 146.0, + 4.0, + 7.416679382324219, + 0.3567431569099426, + 2.0, + 18.299999237060547, + ], + (83): [ + 15.0, + 6.0, + 0.8136501312255859, + 148.0, + 5.0, + 7.285515785217285, + 0.9423620104789734, + 2.0, + 21.299999237060547, + ], + (84): [ + 16.0, + 6.0, + 0.9256306886672974, + 140.0, + 6.0, + 8.413999557495117, + 1.899999976158142, + 2.0, + 22.700000762939453, + ], + (85): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], + (86): [18.0, 6.0, 1.0, 150.0, 8.0, 10.748499870300293, -3.0, 2.0, 50.5], + (87): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], + (88): [ + 2.0, + 7.0, + 0.3596253991127014, + 221.0, + 2.0, + 5.27842378616333, + 0.10000000149011612, + 1.0, + 45.0, + ], + (89): [ + 3.0, + 7.0, + 0.4583164155483246, + 215.0, + 3.0, + 5.380226135253906, + 0.3499999940395355, + 3.0, + 22.540000915527344, + ], + (90): [ + 4.0, + 7.0, + 0.5557018518447876, + 206.0, + 2.0, + 6.306700229644775, + -3.0, + 4.0, + 19.799999237060547, + ], + (91): [5.0, 7.0, 0.623065710067749, 200.0, 2.0, 5.889999866485596, -3.0, 4.0, 15.0], + (92): [ + 6.0, + 7.0, + 0.6181179881095886, + 196.0, + 2.0, + 6.194049835205078, + -3.0, + 4.0, + 12.5, + ], + (93): [ + 7.0, + 7.0, + 0.6132539510726929, + 190.0, + 2.0, + 6.265500068664551, + -3.0, + 4.0, + 21.100000381469727, + ], + (94): [ + 8.0, + 7.0, + 0.6084716320037842, + 187.0, + 2.0, + 6.0258002281188965, + -3.0, + 4.0, + 12.289999961853027, + ], + (95): [ + 9.0, + 7.0, + 0.6834156513214111, + 180.0, + 2.0, + 5.973800182342529, + -3.0, + 4.0, + 20.799999237060547, + ], + (96): [ + 10.0, + 7.0, + 0.6900094747543335, + 169.0, + 2.0, + 5.991399765014648, + -3.0, + 4.0, + 18.280000686645508, + ], + (97): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], + (98): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], + (99): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], + (100): [ + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + float("NaN"), + ], +} diff --git a/jointContribution/mattergen/mattergen/common/embeddings/khot_embeddings.py b/jointContribution/mattergen/mattergen/common/embeddings/khot_embeddings.py new file mode 100644 index 00000000..34cde13d --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/embeddings/khot_embeddings.py @@ -0,0 +1,9411 @@ +""" +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. + + +Original CGCNN k-hot elemental embeddings. +""" +KHOT_EMBEDDINGS = { + (1): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (2): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + (3): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (4): [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (5): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (6): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (7): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (8): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (9): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (10): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (11): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (12): [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (13): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (14): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (15): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (16): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (17): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (18): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + (19): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + (20): [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + (21): [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (22): [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (23): [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (24): [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (25): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (26): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (27): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (28): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (29): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (30): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (31): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (32): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (33): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (34): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (35): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (36): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + (37): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + (38): [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + (39): [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (40): [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (41): [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (42): [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (43): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (44): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (45): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (46): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (47): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (48): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (49): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (50): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (51): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (52): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (53): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + (54): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + (55): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + (56): [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + (57): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (58): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (59): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (60): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (61): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (62): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (63): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + (64): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (65): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (66): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (67): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (68): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (69): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (70): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + (71): [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (72): [ + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (73): [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (74): [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (75): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (76): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (77): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (78): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (79): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (80): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (81): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (82): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (83): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (84): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (85): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (86): [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (87): [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (88): [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + (89): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (90): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (91): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + (92): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (93): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (94): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (95): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (96): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + (97): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (98): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (99): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + (100): [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], +} diff --git a/jointContribution/mattergen/mattergen/common/gemnet/__init__.py b/jointContribution/mattergen/mattergen/common/gemnet/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/common/gemnet/cgmanifest.json b/jointContribution/mattergen/mattergen/common/gemnet/cgmanifest.json new file mode 100644 index 00000000..d4da7421 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/cgmanifest.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/component-detection-manifest.json", + "registrations": [ + { + "component": { + "git": { + "commitHash": "65c2d6246e69169f43949858d39550d2a635c7e0", + "repositoryUrl": "https://github.com/FAIR-Chem/fairchem" + }, + "type": "git" + }, + "developmentDependency": false + } + ], + "version": 1 +} diff --git a/jointContribution/mattergen/mattergen/common/gemnet/gemnet-dT.json b/jointContribution/mattergen/mattergen/common/gemnet/gemnet-dT.json new file mode 100644 index 00000000..6e7ebd87 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/gemnet-dT.json @@ -0,0 +1,20 @@ +{ + "AtomUpdate_1_sum": 1.220463752746582, + "AtomUpdate_2_sum": 0.9690994620323181, + "AtomUpdate_3_sum": 0.8903237581253052, + "OutBlock_0_had": 16.161039352416992, + "OutBlock_0_sum": 1.6437848806381226, + "OutBlock_1_had": 13.54678726196289, + "OutBlock_1_sum": 1.1077653169631958, + "OutBlock_2_had": 12.754337310791016, + "OutBlock_2_sum": 0.9477927684783936, + "OutBlock_3_had": 13.484951972961426, + "OutBlock_3_sum": 0.9059251546859741, + "TripInteraction_1_had_rbf": 18.873615264892578, + "TripInteraction_1_sum_cbf": 7.996850490570068, + "TripInteraction_2_had_rbf": 16.10817527770996, + "TripInteraction_2_sum_cbf": 7.614634037017822, + "TripInteraction_3_had_rbf": 15.01930046081543, + "TripInteraction_3_sum_cbf": 7.025179862976074, + "comment": "tri_gaussian128, from https://github.com/FAIR-Chem/fairchem/blob/main/configs/s2ef/all/gemnet/scaling_factors/gemnet-dT.json" +} diff --git a/jointContribution/mattergen/mattergen/common/gemnet/gemnet.py b/jointContribution/mattergen/mattergen/common/gemnet/gemnet.py new file mode 100644 index 00000000..53d41705 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/gemnet.py @@ -0,0 +1,680 @@ +import sys + +import paddle + +from paddle_utils import * + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/gemnet.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from dataclasses import dataclass +from typing import Optional +from typing import Tuple + +from paddle.sparse import sparse_coo_tensor +from paddle_scatter import scatter + +from mattergen.common.gemnet.layers.atom_update_block import OutputBlock +from mattergen.common.gemnet.layers.base_layers import Dense +from mattergen.common.gemnet.layers.efficient import EfficientInteractionDownProjection +from mattergen.common.gemnet.layers.embedding_block import EdgeEmbedding +from mattergen.common.gemnet.layers.interaction_block import InteractionBlockTripletsOnly +from mattergen.common.gemnet.layers.radial_basis import RadialBasis +from mattergen.common.gemnet.layers.scaling import AutomaticFit +from mattergen.common.gemnet.layers.spherical_basis import CircularBasisLayer +from mattergen.common.gemnet.utils import inner_product_normalized +from mattergen.common.gemnet.utils import mask_neighbors +from mattergen.common.gemnet.utils import ragged_range +from mattergen.common.gemnet.utils import repeat_blocks +from mattergen.common.utils.data_utils import frac_to_cart_coords_with_lattice +from mattergen.common.utils.data_utils import get_pbc_distances +from mattergen.common.utils.data_utils import lattice_params_to_matrix_paddle +from mattergen.common.utils.data_utils import radius_graph_pbc +from mattergen.common.utils.globals import MODELS_PROJECT_ROOT +from mattergen.common.utils.lattice_score import edge_score_to_lattice_score_frac_symmetric + + +@dataclass(frozen=True) +class ModelOutput: + energy: paddle.Tensor + node_embeddings: paddle.Tensor + forces: Optional[paddle.Tensor] = None + stress: Optional[paddle.Tensor] = None + + +class RBFBasedLatticeUpdateBlock(paddle.nn.Layer): + def __init__( + self, + emb_size: int, + activation: str, + emb_size_rbf: int, + emb_size_edge: int, + num_heads: int = 1, + ): + super().__init__() + self.num_out = num_heads + self.mlp = paddle.nn.Sequential( + Dense(emb_size, emb_size, activation=activation), Dense(emb_size, emb_size) + ) + self.dense_rbf_F = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) + self.out_forces = Dense(emb_size_edge, num_heads, bias=False, activation=None) + + def compute_score_per_edge(self, edge_emb: paddle.Tensor, rbf: paddle.Tensor) -> paddle.Tensor: + x_F = self.mlp(edge_emb) + rbf_emb_F = self.dense_rbf_F(rbf) + x_F_rbf = x_F * rbf_emb_F + x_F = self.out_forces(x_F_rbf) + return x_F + + +class RBFBasedLatticeUpdateBlockFrac(RBFBasedLatticeUpdateBlock): + def __init__( + self, + emb_size: int, + activation: str, + emb_size_rbf: int, + emb_size_edge: int, + num_heads: int = 1, + ): + super().__init__( + emb_size=emb_size, + activation=activation, + emb_size_rbf=emb_size_rbf, + emb_size_edge=emb_size_edge, + num_heads=num_heads, + ) + + def forward( + self, + edge_emb: paddle.Tensor, + edge_index: paddle.Tensor, + distance_vec: paddle.Tensor, + lattice: paddle.Tensor, + batch: paddle.Tensor, + rbf: paddle.Tensor, + normalize_score: bool = True, + ) -> paddle.Tensor: + edge_scores = self.compute_score_per_edge(edge_emb=edge_emb, rbf=rbf) + if normalize_score: + num_edges = scatter(paddle.ones_like(x=distance_vec[:, 0]), batch[edge_index[0]]) + edge_scores /= num_edges[batch[edge_index[0]], None] + outs = [] + for i in range(self.num_out): + lattice_update = edge_score_to_lattice_score_frac_symmetric( + score_d=edge_scores[:, i], + edge_index=edge_index, + edge_vectors=distance_vec, + batch=batch, + ) + outs.append(lattice_update) + outs = paddle.stack(x=outs, axis=-1).sum(axis=-1) + return outs + + +class GemNetT(paddle.nn.Layer): + """ + GemNet-T, triplets-only variant of GemNet + + Parameters + ---------- + num_targets: int + Number of prediction targets. + + num_spherical: int + Controls maximum frequency. + num_radial: int + Controls maximum frequency. + num_blocks: int + Number of building blocks to be stacked. + + atom_embedding: paddle.nn.Layer + a module that embeds atomic numbers into vectors of size emb_dim_atomic_number. + emb_size_atom: int + Embedding size of the atoms. This can be different from emb_dim_atomic_number. + emb_size_edge: int + Embedding size of the edges. + emb_size_trip: int + (Down-projected) Embedding size in the triplet message passing block. + emb_size_rbf: int + Embedding size of the radial basis transformation. + emb_size_cbf: int + Embedding size of the circular basis transformation (one angle). + emb_size_bil_trip: int + Embedding size of the edge embeddings in the triplet-based message passing block after the bilinear layer. + num_before_skip: int + Number of residual blocks before the first skip connection. + num_after_skip: int + Number of residual blocks after the first skip connection. + num_concat: int + Number of residual blocks after the concatenation. + num_atom: int + Number of residual blocks in the atom embedding blocks. + cutoff: float + Embedding cutoff for interactomic directions in Angstrom. + rbf: dict + Name and hyperparameters of the radial basis function. + envelope: dict + Name and hyperparameters of the envelope function. + cbf: dict + Name and hyperparameters of the cosine basis function. + output_init: str + Initialization method for the final dense layer. + activation: str + Name of the activation function. + scale_file: str + Path to the json file containing the scaling factors. + encoder_mode: bool + if , use the encoder mode of the model, i.e. only get the atom/edge embedddings. + """ + + def __init__( + self, + num_targets: int, + latent_dim: int, + atom_embedding: paddle.nn.Layer, + num_spherical: int = 7, + num_radial: int = 128, + num_blocks: int = 3, + emb_size_atom: int = 512, + emb_size_edge: int = 512, + emb_size_trip: int = 64, + emb_size_rbf: int = 16, + emb_size_cbf: int = 16, + emb_size_bil_trip: int = 64, + num_before_skip: int = 1, + num_after_skip: int = 2, + num_concat: int = 1, + num_atom: int = 3, + regress_stress: bool = False, + cutoff: float = 6.0, + max_neighbors: int = 50, + rbf: dict = {"name": "gaussian"}, + envelope: dict = {"name": "polynomial", "exponent": 5}, + cbf: dict = {"name": "spherical_harmonics"}, + otf_graph: bool = False, + output_init: str = "HeOrthogonal", + activation: str = "swish", + max_cell_images_per_dim: int = 5, + encoder_mode: bool = False, + **kwargs, + ): + super().__init__() + scale_file = f"{MODELS_PROJECT_ROOT}/common/gemnet/gemnet-dT.json" + assert scale_file is not None, "`scale_file` is required." + self.encoder_mode = encoder_mode + self.num_targets = num_targets + assert num_blocks > 0 + self.num_blocks = num_blocks + emb_dim_atomic_number = getattr(atom_embedding, "emb_size") + self.cutoff = cutoff + self.max_neighbors = max_neighbors + self.max_cell_images_per_dim = max_cell_images_per_dim + self.otf_graph = otf_graph + self.regress_stress = regress_stress + self.angle_edge_emb = paddle.nn.Sequential( + paddle.nn.Linear(in_features=emb_size_edge + 3, out_features=emb_size_edge), + paddle.nn.ReLU(), + paddle.nn.Linear(in_features=emb_size_edge, out_features=emb_size_edge), + ) + AutomaticFit.reset() + self.radial_basis = RadialBasis( + num_radial=num_radial, cutoff=cutoff, rbf=rbf, envelope=envelope + ) + radial_basis_cbf3 = RadialBasis( + num_radial=num_radial, cutoff=cutoff, rbf=rbf, envelope=envelope + ) + self.cbf_basis3 = CircularBasisLayer( + num_spherical, radial_basis=radial_basis_cbf3, cbf=cbf, efficient=True + ) + self.regress_stress = regress_stress + self.lattice_out_blocks = paddle.nn.LayerList( + sublayers=[ + RBFBasedLatticeUpdateBlockFrac( + emb_size_edge, activation, emb_size_rbf, emb_size_edge + ) + for _ in range(num_blocks + 1) + ] + ) + self.mlp_rbf_lattice = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.mlp_rbf3 = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.mlp_cbf3 = EfficientInteractionDownProjection(num_spherical, num_radial, emb_size_cbf) + self.mlp_rbf_h = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.mlp_rbf_out = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.atom_emb = atom_embedding + self.atom_latent_emb = paddle.nn.Linear( + in_features=emb_dim_atomic_number + latent_dim, out_features=emb_size_atom + ) + self.edge_emb = EdgeEmbedding( + emb_size_atom, num_radial, emb_size_edge, activation=activation + ) + out_blocks = [] + int_blocks = [] + interaction_block = InteractionBlockTripletsOnly + for i in range(num_blocks): + int_blocks.append( + interaction_block( + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_trip=emb_size_trip, + emb_size_rbf=emb_size_rbf, + emb_size_cbf=emb_size_cbf, + emb_size_bil_trip=emb_size_bil_trip, + num_before_skip=num_before_skip, + num_after_skip=num_after_skip, + num_concat=num_concat, + num_atom=num_atom, + activation=activation, + scale_file=scale_file, + name=f"IntBlock_{i + 1}", + ) + ) + for i in range(num_blocks + 1): + out_blocks.append( + OutputBlock( + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_rbf=emb_size_rbf, + nHidden=num_atom, + num_targets=num_targets, + activation=activation, + output_init=output_init, + direct_forces=True, + scale_file=scale_file, + name=f"OutBlock_{i}", + ) + ) + self.out_blocks = paddle.nn.LayerList(sublayers=out_blocks) + self.int_blocks = paddle.nn.LayerList(sublayers=int_blocks) + self.shared_parameters = [ + (self.mlp_rbf3, self.num_blocks), + (self.mlp_cbf3, self.num_blocks), + (self.mlp_rbf_h, self.num_blocks), + (self.mlp_rbf_out, self.num_blocks + 1), + ] + + def get_triplets( + self, edge_index: paddle.Tensor, num_atoms: int + ) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Get all b->a for each edge c->a. + It is possible that b=c, as long as the edges are distinct. + + Returns + ------- + id3_ba: paddle.Tensor, shape (num_triplets,) + Indices of input edge b->a of each triplet b->a<-c + id3_ca: paddle.Tensor, shape (num_triplets,) + Indices of output edge c->a of each triplet b->a<-c + id3_ragged_idx: paddle.Tensor, shape (num_triplets,) + Indices enumerating the copies of id3_ca for creating a padded matrix + """ + idx_s, idx_t = edge_index + + # import paddle_sparse + # from paddle_sparse.tensor import SparseTensor + # value = paddle.arange(dtype=idx_s.dtype, end=idx_s.shape[0]) + # adj = SparseTensor( + # row=idx_t, col=idx_s, value=value, sparse_sizes=(num_atoms, num_atoms) + # ) + # adj_edges = adj[idx_t] + # id3_ba = adj_edges.storage.value() + # id3_ca = adj_edges.storage.row() + + value = paddle.arange(start=1, end=idx_s.shape[0] + 1, dtype=idx_s.dtype) + # indices = paddle.to_tensor([idx_t, idx_s]) + # adj = sparse_coo_tensor(indices, value, (num_atoms, num_atoms)) + # adj_edges = adj.to_dense()[idx_s].to_sparse_coo(2) + # id3_ba = adj_edges.values() - 1 + # id3_ca = adj_edges.indices()[0] + + def custom_bincount(x, minlength=0): + unique, counts = paddle.unique(x, return_counts=True) + max_val = paddle.max(unique).numpy().item() if len(unique) > 0 else -1 + length = (max_val + 1) if (max_val+1) > minlength else minlength + result = paddle.zeros([length], dtype='int64') + if len(unique) > 0: + result = paddle.scatter_nd(unique.unsqueeze(1), counts, result.shape) + return result + + n = idx_t.shape[0] + rows = paddle.arange(n).unsqueeze(1) # [0,1,2,...,n-1]^T + cols = paddle.arange(n).unsqueeze(0) # [0,1,2,...,n-1] + mask = (idx_t.unsqueeze(1) == idx_t.unsqueeze(0)) & (cols <= rows) + col = mask.sum(axis=1).astype('int64')-1 + rows = idx_t + indices = paddle.stack([rows, col], axis=1) + + shape = [num_atoms.item(), col.max().item()+1] + result = paddle.scatter_nd(indices, value, shape) + mat = result + + # data_list = [] + # max_data_size = 0 + # for i in range(num_atoms): + # data = value[idx_t == i] + # data_list.append(data) + # if data.shape[0] > max_data_size: + # max_data_size = data.shape[0] + + # mat = paddle.zeros((num_atoms, max_data_size), dtype="int64") + # # mat = paddle.zeros((num_atoms, num_atoms), dtype='int64') + # for i in range(num_atoms): + # data = data_list[i] + # mat[i, : data.shape[0]] = data + + # if (mat-result).abs().max() > 0: + # import pdb;pdb.set_trace() + + id3_ba = mat[idx_t][mat[idx_t] > 0] - 1 + tmp_r = paddle.nonzero(mat[idx_t], as_tuple=False) + id3_ca = tmp_r[:, 0] + + mask = id3_ba != id3_ca + id3_ba = id3_ba[mask] + id3_ca = id3_ca[mask] + + num_triplets = custom_bincount(id3_ca, minlength=idx_s.shape[0]) + # num_triplets_api = paddle.bincount(x=id3_ca, minlength=idx_s.shape[0]) + # assert (num_triplets == num_triplets_api).all() + + id3_ragged_idx = ragged_range(num_triplets) + return id3_ba, id3_ca, id3_ragged_idx + + def select_symmetric_edges(self, tensor, mask, reorder_idx, inverse_neg): + tensor_directed = tensor[mask] + sign = 1 - 2 * inverse_neg + tensor_cat = paddle.concat(x=[tensor_directed, sign * tensor_directed]) + tensor_ordered = tensor_cat[reorder_idx] + return tensor_ordered + + def reorder_symmetric_edges( + self, + edge_index: paddle.Tensor, + cell_offsets: paddle.Tensor, + neighbors: paddle.Tensor, + edge_dist: paddle.Tensor, + edge_vector: paddle.Tensor, + ) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Reorder edges to make finding counter-directional edges easier. + + Some edges are only present in one direction in the data, + since every atom has a maximum number of neighbors. Since we only use i->j + edges here, we lose some j->i edges and add others by + making it symmetric. + We could fix this by merging edge_index with its counter-edges, + including the cell_offsets, and then running paddle.unique. + But this does not seem worth it. + """ + mask_sep_atoms = edge_index[0] < edge_index[1] + cell_earlier = ( + (cell_offsets[:, 0] < 0) + | (cell_offsets[:, 0] == 0) & (cell_offsets[:, 1] < 0) + | (cell_offsets[:, 0] == 0) & (cell_offsets[:, 1] == 0) & (cell_offsets[:, 2] < 0) + ) + mask_same_atoms = edge_index[0] == edge_index[1] + mask_same_atoms &= cell_earlier + mask = mask_sep_atoms | mask_same_atoms + edge_index_new = edge_index[mask[None, :].expand(shape=[2, -1])].view(2, -1) + edge_index_cat = paddle.concat( + x=[ + edge_index_new, + paddle.stack(x=[edge_index_new[1], edge_index_new[0]], axis=0), + ], + axis=1, + ) + batch_edge = paddle.repeat_interleave( + x=paddle.arange(end=neighbors.shape[0]), repeats=neighbors + ) + batch_edge = batch_edge[mask] + neighbors_new = 2 * paddle.bincount(x=batch_edge, minlength=neighbors.shape[0]) + edge_reorder_idx = repeat_blocks( + neighbors_new // 2, + repeats=2, + continuous_indexing=True, + repeat_inc=edge_index_new.shape[1], + ) + edge_index_new = edge_index_cat[:, edge_reorder_idx] + cell_offsets_new = self.select_symmetric_edges(cell_offsets, mask, edge_reorder_idx, True) + edge_dist_new = self.select_symmetric_edges(edge_dist, mask, edge_reorder_idx, False) + edge_vector_new = self.select_symmetric_edges(edge_vector, mask, edge_reorder_idx, True) + return ( + edge_index_new, + cell_offsets_new, + neighbors_new, + edge_dist_new, + edge_vector_new, + ) + + def select_edges( + self, + edge_index: paddle.Tensor, + cell_offsets: paddle.Tensor, + neighbors: paddle.Tensor, + edge_dist: paddle.Tensor, + edge_vector: paddle.Tensor, + cutoff: Optional[float] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + if cutoff is not None: + edge_mask = edge_dist <= cutoff + edge_index = edge_index[:, edge_mask] + cell_offsets = cell_offsets[edge_mask] + neighbors = mask_neighbors(neighbors, edge_mask) + edge_dist = edge_dist[edge_mask] + edge_vector = edge_vector[edge_mask] + return edge_index, cell_offsets, neighbors, edge_dist, edge_vector + + def generate_interaction_graph( + self, + cart_coords: paddle.Tensor, + lattice: paddle.Tensor, + num_atoms: paddle.Tensor, + edge_index: paddle.Tensor, + to_jimages: paddle.Tensor, + num_bonds: paddle.Tensor, + ) -> Tuple[ + Tuple[paddle.Tensor, paddle.Tensor], + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + ]: + if self.otf_graph: + edge_index, to_jimages, num_bonds = radius_graph_pbc( + cart_coords=cart_coords, + lattice=lattice, + num_atoms=num_atoms, + radius=self.cutoff, + max_num_neighbors_threshold=self.max_neighbors, + max_cell_images_per_dim=self.max_cell_images_per_dim, + ) + # import pdb;pdb.set_trace() + + out = get_pbc_distances( + cart_coords, + edge_index, + lattice, + to_jimages, + num_atoms, + num_bonds, + coord_is_cart=True, + return_offsets=True, + return_distance_vec=True, + ) + edge_index = out["edge_index"] + D_st = out["distances"] + V_st = -out["distance_vec"] / D_st[:, None] + edge_index, cell_offsets, neighbors, D_st, V_st = self.reorder_symmetric_edges( + edge_index, to_jimages, num_bonds, D_st, V_st + ) + block_sizes = neighbors // 2 + block_sizes = paddle.masked_select(x=block_sizes, mask=block_sizes > 0) + + id_swap = repeat_blocks( + block_sizes, + repeats=2, + continuous_indexing=False, + start_idx=block_sizes[0], + block_inc=block_sizes[:-1] + block_sizes[1:], + repeat_inc=-block_sizes, + ) + + id3_ba, id3_ca, id3_ragged_idx = self.get_triplets(edge_index, num_atoms=num_atoms.sum()) + return ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + cell_offsets, + ) + + def forward( + self, + z: paddle.Tensor, + frac_coords: paddle.Tensor, + atom_types: paddle.Tensor, + num_atoms: paddle.Tensor, + batch: paddle.Tensor, + lengths: Optional[paddle.Tensor] = None, + angles: Optional[paddle.Tensor] = None, + edge_index: Optional[paddle.Tensor] = None, + to_jimages: Optional[paddle.Tensor] = None, + num_bonds: Optional[paddle.Tensor] = None, + lattice: Optional[paddle.Tensor] = None, + ) -> ModelOutput: + """ + args: + z: (N_cryst, num_latent) + frac_coords: (N_atoms, 3) + atom_types: (N_atoms, ) with D3PM need to use atomic number + num_atoms: (N_cryst,) + lengths: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + angles: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + edge_index: (2, N_edge) (optional, only needed if self.otf_graph is False) + to_jimages: (N_edge, 3) (optional, only needed if self.otf_graph is False) + num_bonds: (N_cryst,) (optional, only needed if self.otf_graph is False) + lattice: (N_cryst, 3, 3) (optional, either lengths and angles or lattice must be passed) + returns: + atom_frac_coords: (N_atoms, 3) + atom_types: (N_atoms, MAX_ATOMIC_NUM) + """ + if self.otf_graph: + assert all( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is active but received input graph information." + else: + assert not any( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is off but received no input graph information." + assert (angles is None and lengths is None) != ( + lattice is None + ), "Either lattice or lengths and angles must be provided, not both or none." + if angles is not None and lengths is not None: + lattice = lattice_params_to_matrix_paddle(lengths, angles) + assert lattice is not None + distorted_lattice = lattice + pos = frac_to_cart_coords_with_lattice(frac_coords, num_atoms, lattice=distorted_lattice) + atomic_numbers = atom_types.cast(dtype="int64") + ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + to_jimages, + ) = self.generate_interaction_graph( + pos, distorted_lattice, num_atoms, edge_index, to_jimages, num_bonds + ) + + idx_s, idx_t = edge_index + cosφ_cab = inner_product_normalized(V_st[id3_ca], V_st[id3_ba]) + rad_cbf3, cbf3 = self.cbf_basis3(D_st, cosφ_cab, id3_ca) + rbf = self.radial_basis(D_st) + h = self.atom_emb(atomic_numbers) + if z is not None: + z_per_atom = z[batch] + h = paddle.concat(x=[h, z_per_atom], axis=1) + h = self.atom_latent_emb(h) + m = self.edge_emb(h, rbf, idx_s, idx_t) + batch_edge = batch[edge_index[0]] + cosines = paddle.nn.functional.cosine_similarity( + x1=V_st[:, None], x2=distorted_lattice[batch_edge], axis=-1 + ) + m = paddle.concat(x=[m, cosines], axis=-1) + m = self.angle_edge_emb(m) + rbf3 = self.mlp_rbf3(rbf) + cbf3 = self.mlp_cbf3(rad_cbf3, cbf3, id3_ca, id3_ragged_idx) + rbf_h = self.mlp_rbf_h(rbf) + rbf_out = self.mlp_rbf_out(rbf) + E_t, F_st = self.out_blocks[0](h, m, rbf_out, idx_t) + distance_vec = V_st * D_st[:, None] + lattice_update = None + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update = self.lattice_out_blocks[0]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + F_fully_connected = paddle.to_tensor(data=0.0, place=distorted_lattice.place) + for i in range(self.num_blocks): + h, m = self.int_blocks[i]( + h=h, + m=m, + rbf3=rbf3, + cbf3=cbf3, + id3_ragged_idx=id3_ragged_idx, + id_swap=id_swap, + id3_ba=id3_ba, + id3_ca=id3_ca, + rbf_h=rbf_h, + idx_s=idx_s, + idx_t=idx_t, + ) + E, F = self.out_blocks[i + 1](h, m, rbf_out, idx_t) + F_st += F + E_t += E + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update += self.lattice_out_blocks[i + 1]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + nMolecules = paddle.max(x=batch) + 1 + if self.encoder_mode: + return E_t + E_t = scatter(E_t, batch, dim=0, dim_size=nMolecules, reduce="sum") + output = dict(energy=E_t, node_embeddings=h) + F_st_vec = F_st[:, :, None] * V_st[:, None, :] + F_t = scatter(F_st_vec, idx_t, dim=0, dim_size=num_atoms.sum(), reduce="add") + F_t = F_t.squeeze(axis=1) + output["forces"] = F_t + F_fully_connected + if self.regress_stress: + output["stress"] = lattice_update + return ModelOutput(**output) + + @property + def num_params(self): + return sum(p.size for p in self.parameters()) diff --git a/jointContribution/mattergen/mattergen/common/gemnet/gemnet_ctrl.py b/jointContribution/mattergen/mattergen/common/gemnet/gemnet_ctrl.py new file mode 100644 index 00000000..8487d2b0 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/gemnet_ctrl.py @@ -0,0 +1,232 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/gemnet.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from typing import Dict +from typing import List +from typing import Optional + +from paddle_scatter import scatter + +from mattergen.common.data.types import PropertySourceId +from mattergen.common.gemnet.gemnet import GemNetT +from mattergen.common.gemnet.gemnet import ModelOutput +from mattergen.common.gemnet.utils import inner_product_normalized +from mattergen.common.utils.data_utils import frac_to_cart_coords_with_lattice +from mattergen.common.utils.data_utils import lattice_params_to_matrix_paddle + + +class GemNetTCtrl(GemNetT): + """ + GemNet-T, triplets-only variant of GemNet + + This variation allows for layerwise conditional control for the purpose of + conditional finetuning. It adds the following on top of GemNetT: + + for each condition in : + + 1. a series of adapt layers that take the concatenation of the node embedding + and the condition embedding, process it with an MLP. There is one adapt layer + for each GemNetT message passing block. + 2. a series of mixin layers that take the output of the adapt layer and mix it in + to the atom embedding. There is one mixin layer for each GemNetT message passing block. + The mixin layers are initialized to zeros so at the beginning of training, the model + outputs exactly the same scores as the base GemNetT model. + + """ + + def __init__(self, condition_on_adapt: List[PropertySourceId], *args, **kwargs): + super().__init__(*args, **kwargs) + self.condition_on_adapt = condition_on_adapt + self.cond_adapt_layers = paddle.nn.LayerDict() + self.cond_mixin_layers = paddle.nn.LayerDict() + self.emb_size_atom = kwargs["emb_size_atom"] if "emb_size_atom" in kwargs else 512 + for cond in condition_on_adapt: + adapt_layers = [] + mixin_layers = [] + for _ in range(self.num_blocks): + adapt_layers.append( + paddle.nn.Sequential( + paddle.nn.Linear( + in_features=self.emb_size_atom * 2, + out_features=self.emb_size_atom, + ), + paddle.nn.ReLU(), + paddle.nn.Linear( + in_features=self.emb_size_atom, + out_features=self.emb_size_atom, + ), + ) + ) + mixin_layers.append( + paddle.nn.Linear( + in_features=self.emb_size_atom, + out_features=self.emb_size_atom, + bias_attr=False, + ) + ) + init_Constant = paddle.nn.initializer.Constant(value=0.0) + init_Constant(mixin_layers[-1].weight) + self.cond_adapt_layers[cond] = paddle.nn.LayerList(sublayers=adapt_layers) + self.cond_mixin_layers[cond] = paddle.nn.LayerList(sublayers=mixin_layers) + + def forward( + self, + z: paddle.Tensor, + frac_coords: paddle.Tensor, + atom_types: paddle.Tensor, + num_atoms: paddle.Tensor, + batch: paddle.Tensor, + lengths: Optional[paddle.Tensor] = None, + angles: Optional[paddle.Tensor] = None, + edge_index: Optional[paddle.Tensor] = None, + to_jimages: Optional[paddle.Tensor] = None, + num_bonds: Optional[paddle.Tensor] = None, + lattice: Optional[paddle.Tensor] = None, + charges: Optional[paddle.Tensor] = None, + cond_adapt: Optional[Dict[PropertySourceId, paddle.Tensor]] = None, + cond_adapt_mask: Optional[Dict[PropertySourceId, paddle.Tensor]] = None, + ) -> ModelOutput: + """ + args: + z: (N_cryst, num_latent) + frac_coords: (N_atoms, 3) + atom_types: (N_atoms, ) with D3PM need to use atomic number + num_atoms: (N_cryst,) + lengths: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + angles: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + edge_index: (2, N_edge) (optional, only needed if self.otf_graph is False) + to_jimages: (N_edge, 3) (optional, only needed if self.otf_graph is False) + num_bonds: (N_cryst,) (optional, only needed if self.otf_graph is False) + lattice: (N_cryst, 3, 3) (optional, either lengths and angles or lattice must be passed) + cond_adapt: (N_cryst, num_cond, dim_cond) (optional, conditional signal for score prediction) + cond_adapt_mask: (N_cryst, num_cond) (optional, mask for which data points receive conditional signal) + returns: + atom_frac_coords: (N_atoms, 3) + atom_types: (N_atoms, MAX_ATOMIC_NUM) + """ + if self.otf_graph: + assert all( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is active but received input graph information." + else: + assert not any( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is off but received no input graph information." + assert (angles is None and lengths is None) != ( + lattice is None + ), "Either lattice or lengths and angles must be provided, not both or none." + if angles is not None and lengths is not None: + lattice = lattice_params_to_matrix_paddle(lengths, angles) + assert lattice is not None + distorted_lattice = lattice + pos = frac_to_cart_coords_with_lattice(frac_coords, num_atoms, lattice=distorted_lattice) + atomic_numbers = atom_types.cast(dtype="int64") + ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + to_jimages, + ) = self.generate_interaction_graph( + pos, distorted_lattice, num_atoms, edge_index, to_jimages, num_bonds + ) + idx_s, idx_t = edge_index + cosφ_cab = inner_product_normalized(V_st[id3_ca], V_st[id3_ba]) + rad_cbf3, cbf3 = self.cbf_basis3(D_st, cosφ_cab, id3_ca) + rbf = self.radial_basis(D_st) + h = self.atom_emb(atomic_numbers) + if z is not None: + z_per_atom = z[batch] + h = paddle.concat(x=[h, z_per_atom], axis=1) + h = self.atom_latent_emb(h) + m = self.edge_emb(h, rbf, idx_s, idx_t) + batch_edge = batch[edge_index[0]] + cosines = paddle.nn.functional.cosine_similarity( + x1=V_st[:, None], x2=distorted_lattice[batch_edge], axis=-1 + ) + m = paddle.concat(x=[m, cosines], axis=-1) + m = self.angle_edge_emb(m) + rbf3 = self.mlp_rbf3(rbf) + cbf3 = self.mlp_cbf3(rad_cbf3, cbf3, id3_ca, id3_ragged_idx) + rbf_h = self.mlp_rbf_h(rbf) + rbf_out = self.mlp_rbf_out(rbf) + E_t, F_st = self.out_blocks[0](h, m, rbf_out, idx_t) + distance_vec = V_st * D_st[:, None] + lattice_update = None + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update = self.lattice_out_blocks[0]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + if cond_adapt is not None and cond_adapt_mask is not None: + cond_adapt_per_atom = {} + cond_adapt_mask_per_atom = {} + for cond in self.condition_on_adapt: + cond_adapt_per_atom[cond] = cond_adapt[cond][batch] + cond_adapt_mask_per_atom[cond] = 1.0 - cond_adapt_mask[cond][batch].astype( + dtype="float32" + ) + for i in range(self.num_blocks): + h_adapt = paddle.zeros_like(x=h) + for cond in self.condition_on_adapt: + h_adapt_cond = self.cond_adapt_layers[cond][i]( + paddle.concat(x=[h, cond_adapt_per_atom[cond]], axis=-1) + ) + h_adapt_cond = self.cond_mixin_layers[cond][i](h_adapt_cond) + h_adapt += cond_adapt_mask_per_atom[cond] * h_adapt_cond + h = h + h_adapt + h, m = self.int_blocks[i]( + h=h, + m=m, + rbf3=rbf3, + cbf3=cbf3, + id3_ragged_idx=id3_ragged_idx, + id_swap=id_swap, + id3_ba=id3_ba, + id3_ca=id3_ca, + rbf_h=rbf_h, + idx_s=idx_s, + idx_t=idx_t, + ) + E, F = self.out_blocks[i + 1](h, m, rbf_out, idx_t) + F_st += F + E_t += E + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update += self.lattice_out_blocks[i + 1]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + nMolecules = paddle.max(x=batch) + 1 + E_t = scatter(E_t, batch, dim=0, dim_size=nMolecules, reduce="sum") + output = dict(energy=E_t, node_embeddings=h) + F_st_vec = F_st[:, :, None] * V_st[:, None, :] + F_t = scatter(F_st_vec, idx_t, dim=0, dim_size=num_atoms.sum(), reduce="add") + F_t = F_t.squeeze(axis=1) + output["forces"] = F_t + if self.regress_stress: + output["stress"] = lattice_update + return ModelOutput(**output) + + @property + def num_params(self): + return sum(p.size for p in self.parameters()) diff --git a/jointContribution/mattergen/mattergen/common/gemnet/gemnet_ctrl_md.py b/jointContribution/mattergen/mattergen/common/gemnet/gemnet_ctrl_md.py new file mode 100644 index 00000000..e9310bf0 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/gemnet_ctrl_md.py @@ -0,0 +1,241 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/gemnet.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from typing import Dict +from typing import List +from typing import Optional + +from paddle_scatter import scatter + +from mattergen.common.data.types import PropertySourceId +from mattergen.common.gemnet.gemnet_md import GemNetT_MD +from mattergen.common.gemnet.gemnet import ModelOutput +from mattergen.common.gemnet.utils import inner_product_normalized +from mattergen.common.utils.data_utils import frac_to_cart_coords_with_lattice +from mattergen.common.utils.data_utils import lattice_params_to_matrix_paddle + + +class GemNetTCtrl_MD(GemNetT_MD): + """ + GemNet-T, triplets-only variant of GemNet + + This variation allows for layerwise conditional control for the purpose of + conditional finetuning. It adds the following on top of GemNetT: + + for each condition in : + + 1. a series of adapt layers that take the concatenation of the node embedding + and the condition embedding, process it with an MLP. There is one adapt layer + for each GemNetT message passing block. + 2. a series of mixin layers that take the output of the adapt layer and mix it in + to the atom embedding. There is one mixin layer for each GemNetT message passing block. + The mixin layers are initialized to zeros so at the beginning of training, the model + outputs exactly the same scores as the base GemNetT model. + + """ + + def __init__(self, condition_on_adapt: List[PropertySourceId], *args, **kwargs): + super().__init__(*args, **kwargs) + self.condition_on_adapt = condition_on_adapt + self.cond_adapt_layers = paddle.nn.LayerDict() + self.cond_mixin_layers = paddle.nn.LayerDict() + self.emb_size_atom = kwargs["emb_size_atom"] if "emb_size_atom" in kwargs else 512 + for cond in condition_on_adapt: + adapt_layers = [] + mixin_layers = [] + for _ in range(self.num_blocks): + adapt_layers.append( + paddle.nn.Sequential( + paddle.nn.Linear( + in_features=self.emb_size_atom * 2, + out_features=self.emb_size_atom, + ), + paddle.nn.ReLU(), + paddle.nn.Linear( + in_features=self.emb_size_atom, + out_features=self.emb_size_atom, + ), + ) + ) + mixin_layers.append( + paddle.nn.Linear( + in_features=self.emb_size_atom, + out_features=self.emb_size_atom, + bias_attr=False, + ) + ) + init_Constant = paddle.nn.initializer.Constant(value=0.0) + init_Constant(mixin_layers[-1].weight) + self.cond_adapt_layers[cond] = paddle.nn.LayerList(sublayers=adapt_layers) + self.cond_mixin_layers[cond] = paddle.nn.LayerList(sublayers=mixin_layers) + + def forward( + self, + z: paddle.Tensor, + frac_coords: paddle.Tensor, + atom_types: paddle.Tensor, + num_atoms: paddle.Tensor, + batch: paddle.Tensor, + lengths: Optional[paddle.Tensor] = None, + angles: Optional[paddle.Tensor] = None, + edge_index: Optional[paddle.Tensor] = None, + to_jimages: Optional[paddle.Tensor] = None, + num_bonds: Optional[paddle.Tensor] = None, + lattice: Optional[paddle.Tensor] = None, + charges: Optional[paddle.Tensor] = None, + cond_adapt: Optional[Dict[PropertySourceId, paddle.Tensor]] = None, + cond_adapt_mask: Optional[Dict[PropertySourceId, paddle.Tensor]] = None, + ) -> ModelOutput: + """ + args: + z: (N_cryst, num_latent) + frac_coords: (N_atoms, 3) + atom_types: (N_atoms, ) with D3PM need to use atomic number + num_atoms: (N_cryst,) + lengths: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + angles: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + edge_index: (2, N_edge) (optional, only needed if self.otf_graph is False) + to_jimages: (N_edge, 3) (optional, only needed if self.otf_graph is False) + num_bonds: (N_cryst,) (optional, only needed if self.otf_graph is False) + lattice: (N_cryst, 3, 3) (optional, either lengths and angles or lattice must be passed) + cond_adapt: (N_cryst, num_cond, dim_cond) (optional, conditional signal for score prediction) + cond_adapt_mask: (N_cryst, num_cond) (optional, mask for which data points receive conditional signal) + returns: + atom_frac_coords: (N_atoms, 3) + atom_types: (N_atoms, MAX_ATOMIC_NUM) + """ + if self.otf_graph: + assert all( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is active but received input graph information." + else: + assert not any( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is off but received no input graph information." + assert (angles is None and lengths is None) != ( + lattice is None + ), "Either lattice or lengths and angles must be provided, not both or none." + if angles is not None and lengths is not None: + lattice = lattice_params_to_matrix_paddle(lengths, angles) + assert lattice is not None + distorted_lattice = lattice + pos = frac_to_cart_coords_with_lattice(frac_coords, num_atoms, lattice=distorted_lattice) + atomic_numbers = atom_types.cast(dtype="int64") + ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + to_jimages, + ) = self.generate_interaction_graph( + pos, distorted_lattice, num_atoms, edge_index, to_jimages, num_bonds + ) + idx_s, idx_t = edge_index + cosφ_cab = inner_product_normalized(V_st[id3_ca], V_st[id3_ba]) + rad_cbf3, cbf3 = self.cbf_basis3(D_st, cosφ_cab, id3_ca) + rbf = self.radial_basis(D_st) + h = self.atom_emb(atomic_numbers) + if z is not None: + z_per_atom = z[batch] + h = paddle.concat(x=[h, z_per_atom], axis=1) + h = self.atom_latent_emb(h) + + if self.use_md: + mean_distance = (frac_coords[:, 2] - 0.5).abs() + mean_distance = scatter(mean_distance, batch, reduce='mean') + mean_distance_rbf = self.radial_basis_md(mean_distance) + md_rbf_out = self.radial_basis_md_linear(mean_distance_rbf) + md_rbf_out = md_rbf_out[batch] + h = h + md_rbf_out + + m = self.edge_emb(h, rbf, idx_s, idx_t) + batch_edge = batch[edge_index[0]] + cosines = paddle.nn.functional.cosine_similarity( + x1=V_st[:, None], x2=distorted_lattice[batch_edge], axis=-1 + ) + m = paddle.concat(x=[m, cosines], axis=-1) + m = self.angle_edge_emb(m) + rbf3 = self.mlp_rbf3(rbf) + cbf3 = self.mlp_cbf3(rad_cbf3, cbf3, id3_ca, id3_ragged_idx) + rbf_h = self.mlp_rbf_h(rbf) + rbf_out = self.mlp_rbf_out(rbf) + E_t, F_st = self.out_blocks[0](h, m, rbf_out, idx_t) + distance_vec = V_st * D_st[:, None] + lattice_update = None + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update = self.lattice_out_blocks[0]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + if cond_adapt is not None and cond_adapt_mask is not None: + cond_adapt_per_atom = {} + cond_adapt_mask_per_atom = {} + for cond in self.condition_on_adapt: + cond_adapt_per_atom[cond] = cond_adapt[cond][batch] + cond_adapt_mask_per_atom[cond] = 1.0 - cond_adapt_mask[cond][batch].astype( + dtype="float32" + ) + for i in range(self.num_blocks): + h_adapt = paddle.zeros_like(x=h) + for cond in self.condition_on_adapt: + h_adapt_cond = self.cond_adapt_layers[cond][i]( + paddle.concat(x=[h, cond_adapt_per_atom[cond]], axis=-1) + ) + h_adapt_cond = self.cond_mixin_layers[cond][i](h_adapt_cond) + h_adapt += cond_adapt_mask_per_atom[cond] * h_adapt_cond + h = h + h_adapt + h, m = self.int_blocks[i]( + h=h, + m=m, + rbf3=rbf3, + cbf3=cbf3, + id3_ragged_idx=id3_ragged_idx, + id_swap=id_swap, + id3_ba=id3_ba, + id3_ca=id3_ca, + rbf_h=rbf_h, + idx_s=idx_s, + idx_t=idx_t, + ) + E, F = self.out_blocks[i + 1](h, m, rbf_out, idx_t) + F_st += F + E_t += E + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update += self.lattice_out_blocks[i + 1]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + nMolecules = paddle.max(x=batch) + 1 + E_t = scatter(E_t, batch, dim=0, dim_size=nMolecules, reduce="sum") + output = dict(energy=E_t, node_embeddings=h) + F_st_vec = F_st[:, :, None] * V_st[:, None, :] + F_t = scatter(F_st_vec, idx_t, dim=0, dim_size=num_atoms.sum(), reduce="add") + F_t = F_t.squeeze(axis=1) + output["forces"] = F_t + if self.regress_stress: + output["stress"] = lattice_update + return ModelOutput(**output) + + @property + def num_params(self): + return sum(p.size for p in self.parameters()) diff --git a/jointContribution/mattergen/mattergen/common/gemnet/gemnet_md.py b/jointContribution/mattergen/mattergen/common/gemnet/gemnet_md.py new file mode 100644 index 00000000..90c04df7 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/gemnet_md.py @@ -0,0 +1,301 @@ +import sys + +import paddle + +from paddle_utils import * + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/gemnet.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from typing import Optional +from paddle_scatter import scatter + +from mattergen.common.gemnet.layers.radial_basis import RadialBasis +from mattergen.common.gemnet.utils import inner_product_normalized +from mattergen.common.utils.data_utils import frac_to_cart_coords_with_lattice +from mattergen.common.utils.data_utils import lattice_params_to_matrix_paddle + + +from mattergen.common.gemnet.gemnet import GemNetT, ModelOutput + +class GemNetT_MD(GemNetT): + """ + GemNet-T_MD, triplets-only variant of GemNet, with mean distance embedding. + + Parameters + ---------- + num_targets: int + Number of prediction targets. + + num_spherical: int + Controls maximum frequency. + num_radial: int + Controls maximum frequency. + num_blocks: int + Number of building blocks to be stacked. + + atom_embedding: paddle.nn.Layer + a module that embeds atomic numbers into vectors of size emb_dim_atomic_number. + emb_size_atom: int + Embedding size of the atoms. This can be different from emb_dim_atomic_number. + emb_size_edge: int + Embedding size of the edges. + emb_size_trip: int + (Down-projected) Embedding size in the triplet message passing block. + emb_size_rbf: int + Embedding size of the radial basis transformation. + emb_size_cbf: int + Embedding size of the circular basis transformation (one angle). + emb_size_bil_trip: int + Embedding size of the edge embeddings in the triplet-based message passing block after the bilinear layer. + num_before_skip: int + Number of residual blocks before the first skip connection. + num_after_skip: int + Number of residual blocks after the first skip connection. + num_concat: int + Number of residual blocks after the concatenation. + num_atom: int + Number of residual blocks in the atom embedding blocks. + cutoff: float + Embedding cutoff for interactomic directions in Angstrom. + rbf: dict + Name and hyperparameters of the radial basis function. + envelope: dict + Name and hyperparameters of the envelope function. + cbf: dict + Name and hyperparameters of the cosine basis function. + output_init: str + Initialization method for the final dense layer. + activation: str + Name of the activation function. + scale_file: str + Path to the json file containing the scaling factors. + encoder_mode: bool + if , use the encoder mode of the model, i.e. only get the atom/edge embedddings. + use_md: bool + if , use the mean distance embedding. + """ + + def __init__( + self, + num_targets: int, + latent_dim: int, + atom_embedding: paddle.nn.Layer, + num_spherical: int = 7, + num_radial: int = 128, + num_blocks: int = 3, + emb_size_atom: int = 512, + emb_size_edge: int = 512, + emb_size_trip: int = 64, + emb_size_rbf: int = 16, + emb_size_cbf: int = 16, + emb_size_bil_trip: int = 64, + num_before_skip: int = 1, + num_after_skip: int = 2, + num_concat: int = 1, + num_atom: int = 3, + regress_stress: bool = False, + cutoff: float = 6.0, + max_neighbors: int = 50, + rbf: dict = {"name": "gaussian"}, + envelope: dict = {"name": "polynomial", "exponent": 5}, + cbf: dict = {"name": "spherical_harmonics"}, + otf_graph: bool = False, + output_init: str = "HeOrthogonal", + activation: str = "swish", + max_cell_images_per_dim: int = 5, + encoder_mode: bool = False, + use_md: bool=True, + **kwargs, + ): + super().__init__( + num_targets=num_targets, + latent_dim=latent_dim, + atom_embedding=atom_embedding, + num_spherical=num_spherical, + num_radial=num_radial, + num_blocks=num_blocks, + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_trip=emb_size_trip, + emb_size_rbf=emb_size_rbf, + emb_size_cbf=emb_size_cbf, + emb_size_bil_trip=emb_size_bil_trip, + num_before_skip=num_before_skip, + num_after_skip=num_after_skip, + num_concat=num_concat, + num_atom=num_atom, + regress_stress=regress_stress, + cutoff=cutoff, + max_neighbors=max_neighbors, + rbf=rbf, + envelope=envelope, + cbf=cbf, + otf_graph=otf_graph, + output_init=output_init, + activation=activation, + max_cell_images_per_dim=max_cell_images_per_dim, + encoder_mode=encoder_mode, + ) + + self.use_md = use_md + # radial basis function for mean distance + if use_md: + self.radial_basis_md = RadialBasis( + num_radial=num_radial, cutoff=0.5, rbf=rbf, envelope=envelope + ) + self.radial_basis_md_linear = paddle.nn.Linear( + in_features=num_radial, + out_features=emb_size_atom, + bias_attr=False, + ) + + def forward( + self, + z: paddle.Tensor, + frac_coords: paddle.Tensor, + atom_types: paddle.Tensor, + num_atoms: paddle.Tensor, + batch: paddle.Tensor, + lengths: Optional[paddle.Tensor] = None, + angles: Optional[paddle.Tensor] = None, + edge_index: Optional[paddle.Tensor] = None, + to_jimages: Optional[paddle.Tensor] = None, + num_bonds: Optional[paddle.Tensor] = None, + lattice: Optional[paddle.Tensor] = None, + ) -> ModelOutput: + """ + args: + z: (N_cryst, num_latent) + frac_coords: (N_atoms, 3) + atom_types: (N_atoms, ) with D3PM need to use atomic number + num_atoms: (N_cryst,) + lengths: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + angles: (N_cryst, 3) (optional, either lengths and angles or lattice must be passed) + edge_index: (2, N_edge) (optional, only needed if self.otf_graph is False) + to_jimages: (N_edge, 3) (optional, only needed if self.otf_graph is False) + num_bonds: (N_cryst,) (optional, only needed if self.otf_graph is False) + lattice: (N_cryst, 3, 3) (optional, either lengths and angles or lattice must be passed) + returns: + atom_frac_coords: (N_atoms, 3) + atom_types: (N_atoms, MAX_ATOMIC_NUM) + """ + if self.otf_graph: + assert all( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is active but received input graph information." + else: + assert not any( + [edge_index is None, to_jimages is None, num_bonds is None] + ), "OTF graph construction is off but received no input graph information." + assert (angles is None and lengths is None) != ( + lattice is None + ), "Either lattice or lengths and angles must be provided, not both or none." + if angles is not None and lengths is not None: + lattice = lattice_params_to_matrix_paddle(lengths, angles) + assert lattice is not None + distorted_lattice = lattice + pos = frac_to_cart_coords_with_lattice(frac_coords, num_atoms, lattice=distorted_lattice) + + atomic_numbers = atom_types.cast(dtype="int64") + ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + to_jimages, + ) = self.generate_interaction_graph( + pos, distorted_lattice, num_atoms, edge_index, to_jimages, num_bonds + ) + + idx_s, idx_t = edge_index + cosφ_cab = inner_product_normalized(V_st[id3_ca], V_st[id3_ba]) + rad_cbf3, cbf3 = self.cbf_basis3(D_st, cosφ_cab, id3_ca) + rbf = self.radial_basis(D_st) + h = self.atom_emb(atomic_numbers) + if z is not None: + z_per_atom = z[batch] + h = paddle.concat(x=[h, z_per_atom], axis=1) + h = self.atom_latent_emb(h) + + if self.use_md: + mean_distance = (frac_coords[:, 2] - 0.5).abs() + # mean_distance = scatter(mean_distance, batch, reduce='mean') + mean_distance_rbf = self.radial_basis_md(mean_distance) + md_rbf_out = self.radial_basis_md_linear(mean_distance_rbf) + # md_rbf_out = md_rbf_out[batch] + h = h + md_rbf_out + + m = self.edge_emb(h, rbf, idx_s, idx_t) + batch_edge = batch[edge_index[0]] + cosines = paddle.nn.functional.cosine_similarity( + x1=V_st[:, None], x2=distorted_lattice[batch_edge], axis=-1 + ) + m = paddle.concat(x=[m, cosines], axis=-1) + m = self.angle_edge_emb(m) + rbf3 = self.mlp_rbf3(rbf) + cbf3 = self.mlp_cbf3(rad_cbf3, cbf3, id3_ca, id3_ragged_idx) + rbf_h = self.mlp_rbf_h(rbf) + rbf_out = self.mlp_rbf_out(rbf) + E_t, F_st = self.out_blocks[0](h, m, rbf_out, idx_t) + distance_vec = V_st * D_st[:, None] + lattice_update = None + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update = self.lattice_out_blocks[0]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + F_fully_connected = paddle.to_tensor(data=0.0, place=distorted_lattice.place) + for i in range(self.num_blocks): + h, m = self.int_blocks[i]( + h=h, + m=m, + rbf3=rbf3, + cbf3=cbf3, + id3_ragged_idx=id3_ragged_idx, + id_swap=id_swap, + id3_ba=id3_ba, + id3_ca=id3_ca, + rbf_h=rbf_h, + idx_s=idx_s, + idx_t=idx_t, + ) + E, F = self.out_blocks[i + 1](h, m, rbf_out, idx_t) + F_st += F + E_t += E + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update += self.lattice_out_blocks[i + 1]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + nMolecules = paddle.max(x=batch) + 1 + if self.encoder_mode: + return E_t + E_t = scatter(E_t, batch, dim=0, dim_size=nMolecules, reduce="sum") + output = dict(energy=E_t, node_embeddings=h) + F_st_vec = F_st[:, :, None] * V_st[:, None, :] + F_t = scatter(F_st_vec, idx_t, dim=0, dim_size=num_atoms.sum(), reduce="add") + F_t = F_t.squeeze(axis=1) + output["forces"] = F_t + F_fully_connected + if self.regress_stress: + output["stress"] = lattice_update + return ModelOutput(**output) + diff --git a/jointContribution/mattergen/mattergen/common/gemnet/initializers.py b/jointContribution/mattergen/mattergen/common/gemnet/initializers.py new file mode 100644 index 00000000..4ffabc89 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/initializers.py @@ -0,0 +1,78 @@ +import functools +import operator + +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/initializers.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" + + +def _standardize(kernel): + """ + Makes sure that N*Var(W) = 1 and E[W] = 0 + """ + eps = 1e-06 + if len(tuple(kernel.shape)) == 3: + axis = 0, 1 + else: + axis = 1 + var, mean = tuple( + [ + paddle.var(kernel, axis=axis, unbiased=True, keepdim=True), + paddle.mean(kernel, axis=axis, keepdim=True), + ] + ) + kernel = (kernel - mean) / (var + eps) ** 0.5 + return kernel + + +# def he_orthogonal_init(tensor: paddle.Tensor) -> paddle.Tensor: +# """ +# Generate a weight matrix with variance according to He (Kaiming) initialization. +# Based on a random (semi-)orthogonal matrix neural networks +# are expected to learn better when features are decorrelated +# (stated by eg. "Reducing overfitting in deep networks by decorrelating representations", +# "Dropout: a simple way to prevent neural networks from overfitting", +# "Exact solutions to the nonlinear dynamics of learning in deep linear neural networks") +# """ +# init_Orthogonal = paddle.nn.initializer.Orthogonal() +# tensor = init_Orthogonal(tensor) +# if len(tuple(tensor.shape)) == 3: +# fan_in = tuple(tensor.shape)[:-1].size +# else: +# fan_in = tuple(tensor.shape)[1] +# with paddle.no_grad(): +# tensor.data = _standardize(tensor.data) +# tensor.data *= (1 / fan_in) ** 0.5 +# return tensor + + +def he_orthogonal_init(tensor): + """ + Generate a weight matrix with variance according to He initialization. + Based on a random (semi-)orthogonal matrix neural networks + are expected to learn better when features are decorrelated + (stated by eg. "Reducing overfitting in deep networks by decorrelating + representations", + "Dropout: a simple way to prevent neural networks from overfitting", + "Exact solutions to the nonlinear dynamics of learning in deep linear + neural networks") + """ + init_Orthogonal = paddle.nn.initializer.Orthogonal() + init_Orthogonal(tensor) + if len(tuple(tensor.shape)) == 3: + fan_in = functools.reduce(operator.mul, tuple(tensor.shape)[:-1], 1) + + else: + fan_in = tuple(tensor.shape)[0] + stop_gradient = tensor.stop_gradient + with paddle.no_grad(): + tensor.data = _standardize(tensor.data) + tensor.data *= (1 / fan_in) ** 0.5 + tensor.stop_gradient = stop_gradient + return tensor diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/__init__.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/atom_update_block.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/atom_update_block.py new file mode 100644 index 00000000..df8715ce --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/atom_update_block.py @@ -0,0 +1,189 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/atom_update_block.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. +""" +from typing import Tuple + +from paddle_scatter import scatter + +from mattergen.common.gemnet.initializers import he_orthogonal_init +from mattergen.common.gemnet.layers.base_layers import Dense +from mattergen.common.gemnet.layers.base_layers import ResidualLayer +from mattergen.common.gemnet.layers.scaling import ScalingFactor + + +class AtomUpdateBlock(paddle.nn.Layer): + """ + Aggregate the message embeddings of the atoms + + Parameters + ---------- + emb_size_atom: int + Embedding size of the atoms. + emb_size_atom: int + Embedding size of the edges. + nHidden: int + Number of residual blocks. + activation: callable/str + Name of the activation function to use in the dense layers. + scale_file: str + Path to the json file containing the scaling factors. + """ + + def __init__( + self, + emb_size_atom: int, + emb_size_edge: int, + emb_size_rbf: int, + nHidden: int, + activation=None, + scale_file=None, + name: str = "atom_update", + ): + super().__init__() + self.name = name + self.dense_rbf = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) + self.scale_sum = ScalingFactor(scale_file=scale_file, name=name + "_sum") + self.layers = self.get_mlp(emb_size_edge, emb_size_atom, nHidden, activation) + + def get_mlp( + self, units_in: int, units: int, nHidden: int, activation: str + ) -> paddle.nn.LayerList: + dense1 = Dense(units_in, units, activation=activation, bias=False) + mlp = [dense1] + res = [ResidualLayer(units, nLayers=2, activation=activation) for i in range(nHidden)] + mlp += res + return paddle.nn.LayerList(sublayers=mlp) + + def forward( + self, + h: paddle.Tensor, + m: paddle.Tensor, + rbf: paddle.Tensor, + id_j: paddle.Tensor, + ) -> paddle.Tensor: + """ + Returns + ------- + h: paddle.Tensor, shape=(nAtoms, emb_size_atom) + Atom embedding. + """ + nAtoms = tuple(h.shape)[0] + mlp_rbf = self.dense_rbf(rbf) + x = m * mlp_rbf + x2 = scatter(x, id_j, dim=0, dim_size=nAtoms, reduce="sum") + x = self.scale_sum(m, x2) + for layer in self.layers: + x = layer(x) + return x + + +class OutputBlock(AtomUpdateBlock): + """ + Combines the atom update block and subsequent final dense layer. + + Parameters + ---------- + emb_size_atom: int + Embedding size of the atoms. + emb_size_atom: int + Embedding size of the edges. + nHidden: int + Number of residual blocks. + num_targets: int + Number of targets. + activation: str + Name of the activation function to use in the dense layers except for the final dense layer. + direct_forces: bool + If true directly predict forces without taking the gradient of the energy potential. + output_init: int + Kernel initializer of the final dense layer. + scale_file: str + Path to the json file containing the scaling factors. + """ + + def __init__( + self, + emb_size_atom: int, + emb_size_edge: int, + emb_size_rbf: int, + nHidden: int, + num_targets: int, + activation=None, + direct_forces=True, + output_init="HeOrthogonal", + scale_file=None, + name: str = "output", + **kwargs, + ): + super().__init__( + name=name, + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_rbf=emb_size_rbf, + nHidden=nHidden, + activation=activation, + scale_file=scale_file, + ) + assert isinstance(output_init, str) + self.output_init = output_init.lower() + self.direct_forces = direct_forces + self.seq_energy = self.layers + self.out_energy = Dense(emb_size_atom, num_targets, bias=False, activation=None) + if self.direct_forces: + self.scale_rbf_F = ScalingFactor(scale_file=scale_file, name=name + "_had") + self.seq_forces = self.get_mlp(emb_size_edge, emb_size_edge, nHidden, activation) + self.out_forces = Dense(emb_size_edge, num_targets, bias=False, activation=None) + self.dense_rbf_F = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) + self.reset_parameters() + + def reset_parameters(self): + if self.output_init == "heorthogonal": + self.out_energy.reset_parameters(he_orthogonal_init) + if self.direct_forces: + self.out_forces.reset_parameters(he_orthogonal_init) + elif self.output_init == "zeros": + self.out_energy.reset_parameters(paddle.nn.initializer.Constant) + if self.direct_forces: + self.out_forces.reset_parameters(paddle.nn.initializer.Constant) + else: + raise UserWarning(f"Unknown output_init: {self.output_init}") + + def forward( + self, + h: paddle.Tensor, + m: paddle.Tensor, + rbf: paddle.Tensor, + id_j: paddle.Tensor, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """ + Returns + ------- + (E, F): tuple + - E: paddle.Tensor, shape=(nAtoms, num_targets) + - F: paddle.Tensor, shape=(nEdges, num_targets) + Energy and force prediction + """ + nAtoms = tuple(h.shape)[0] + rbf_emb_E = self.dense_rbf(rbf) + x = m * rbf_emb_E + x_E = scatter(x, id_j, dim=0, dim_size=nAtoms, reduce="sum") + x_E = self.scale_sum(m, x_E) + for layer in self.seq_energy: + x_E = layer(x_E) + x_E = self.out_energy(x_E) + if self.direct_forces: + x_F = m + for i, layer in enumerate(self.seq_forces): + x_F = layer(x_F) + rbf_emb_F = self.dense_rbf_F(rbf) + x_F_rbf = x_F * rbf_emb_F + x_F = self.scale_rbf_F(x_F, x_F_rbf) + x_F = self.out_forces(x_F) + else: + x_F = 0 + return x_E, x_F diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/base_layers.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/base_layers.py new file mode 100644 index 00000000..300fb5fe --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/base_layers.py @@ -0,0 +1,112 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/base_layers.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import math +from collections.abc import Callable +from typing import Optional + +from mattergen.common.gemnet.initializers import he_orthogonal_init + + +class Dense(paddle.nn.Layer): + """ + Combines dense layer with scaling for swish activation. + + Parameters + ---------- + units: int + Output embedding size. + activation: str + Name of the activation function to use. + bias: bool + True if use bias. + """ + + def __init__( + self, + in_features: int, + out_features: int, + bias: bool = False, + activation: Optional[str] = None, + ): + super().__init__() + self.linear = paddle.nn.Linear( + in_features=in_features, out_features=out_features, bias_attr=bias + ) + self.reset_parameters() + if isinstance(activation, str): + activation = activation.lower() + if activation in ["swish", "silu"]: + self._activation = ScaledSiLU() + elif activation == "siqu": + self._activation = SiQU() + elif activation is None: + self._activation = paddle.nn.Identity() + else: + raise NotImplementedError("Activation function not implemented for GemNet (yet).") + + def reset_parameters(self, initializer: Callable = he_orthogonal_init): + initializer(self.linear.weight) + if self.linear.bias is not None: + self.linear.bias.data.fill_(value=0) + + def forward(self, x: paddle.Tensor): + x = self.linear(x) + x = self._activation(x) + return x + + +class ScaledSiLU(paddle.nn.Layer): + def __init__(self): + super().__init__() + self.scale_factor = 1 / 0.6 + self._activation = paddle.nn.Silu() + + def forward(self, x: paddle.Tensor): + return self._activation(x) * self.scale_factor + + +class SiQU(paddle.nn.Layer): + def __init__(self): + super().__init__() + self._activation = paddle.nn.Silu() + + def forward(self, x: paddle.Tensor): + return x * self._activation(x) + + +class ResidualLayer(paddle.nn.Layer): + """ + Residual block with output scaled by 1/sqrt(2). + + Parameters + ---------- + units: int + Output embedding size. + nLayers: int + Number of dense layers. + layer_kwargs: str + Keyword arguments for initializing the layers. + """ + + def __init__(self, units: int, nLayers: int = 2, layer: Callable = Dense, **layer_kwargs): + super().__init__() + self.dense_mlp = paddle.nn.Sequential( + *[ + layer(in_features=units, out_features=units, bias=False, **layer_kwargs) + for _ in range(nLayers) + ] + ) + self.inv_sqrt_2 = 1 / math.sqrt(2) + + def forward(self, input: paddle.Tensor): + x = self.dense_mlp(input) + x = input + x + x = x * self.inv_sqrt_2 + return x diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/basis_utils.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/basis_utils.py new file mode 100644 index 00000000..86da9454 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/basis_utils.py @@ -0,0 +1,242 @@ +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/basis_utils.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from typing import Any +from typing import List + +import numpy as np +import sympy as sym +from scipy import special as sp +from scipy.optimize import brentq + + +def Jn(r: np.array, n: int) -> np.array: + """ + numerical spherical bessel functions of order n + """ + return sp.spherical_jn(n, r) + + +def Jn_zeros(n: int, k: int) -> np.array: + """ + Compute the first k zeros of the spherical bessel functions up to order n (excluded) + """ + zerosj = np.zeros((n, k), dtype="float32") + zerosj[0] = np.arange(1, k + 1) * np.pi + points = np.arange(1, k + n) * np.pi + racines = np.zeros(k + n - 1, dtype="float32") + for i in range(1, n): + for j in range(k + n - 1 - i): + foo = brentq(Jn, points[j], points[j + 1], (i,)) + racines[j] = foo + points = racines + zerosj[i][:k] = racines[:k] + return zerosj + + +def spherical_bessel_formulas(n: int) -> List[Any]: + """ + Computes the sympy formulas for the spherical bessel functions up to order n (excluded) + """ + x = sym.symbols("x") + j = [sym.sin(x) / x] + a = sym.sin(x) / x + for i in range(1, n): + b = sym.diff(a, x) / x + j += [sym.simplify(b * (-x) ** i)] + a = sym.simplify(b) + return j + + +def bessel_basis(n: int, k: int) -> List[Any]: + """ + Compute the sympy formulas for the normalized and rescaled spherical bessel functions up to + order n (excluded) and maximum frequency k (excluded). + + Returns: + bess_basis: list + Bessel basis formulas taking in a single argument x. + Has length n where each element has length k. -> In total n*k many. + """ + zeros = Jn_zeros(n, k) + normalizer = [] + for order in range(n): + normalizer_tmp = [] + for i in range(k): + normalizer_tmp += [0.5 * Jn(zeros[order, i], order + 1) ** 2] + normalizer_tmp = 1 / np.array(normalizer_tmp) ** 0.5 + normalizer += [normalizer_tmp] + f = spherical_bessel_formulas(n) + x = sym.symbols("x") + bess_basis = [] + for order in range(n): + bess_basis_tmp = [] + for i in range(k): + bess_basis_tmp += [ + sym.simplify(normalizer[order][i] * f[order].subs(x, zeros[order, i] * x)) + ] + bess_basis += [bess_basis_tmp] + return bess_basis + + +def sph_harm_prefactor(l_degree: int, m_order: int) -> float: + """Computes the constant pre-factor for the spherical harmonic of degree l and order m. + + Parameters + ---------- + l_degree: int + Degree of the spherical harmonic. l >= 0 + m_order: int + Order of the spherical harmonic. -l <= m <= l + + Returns + ------- + factor: float + + """ + return ( + (2 * l_degree + 1) + / (4 * np.pi) + * np.math.factorial(l_degree - abs(m_order)) + / np.math.factorial(l_degree + abs(m_order)) + ) ** 0.5 + + +def associated_legendre_polynomials( + L_maxdegree: int, zero_m_only: bool = True, pos_m_only: bool = True +) -> List[List[Any]]: + """Computes string formulas of the associated legendre polynomials up to degree L (excluded). + + Parameters + ---------- + L_maxdegree: int + Degree up to which to calculate the associated legendre polynomials (degree L is excluded). + zero_m_only: bool + If True only calculate the polynomials for the polynomials where m=0. + pos_m_only: bool + If True only calculate the polynomials for the polynomials where m>=0. Overwritten by zero_m_only. + + Returns + ------- + polynomials: list + Contains the sympy functions of the polynomials (in total L many if zero_m_only is True else L^2 many). + """ + z = sym.symbols("z") + P_l_m = [([0] * (2 * l_degree + 1)) for l_degree in range(L_maxdegree)] + P_l_m[0][0] = 1 + if L_maxdegree > 0: + if zero_m_only: + P_l_m[1][0] = z + for l_degree in range(2, L_maxdegree): + P_l_m[l_degree][0] = sym.simplify( + ( + (2 * l_degree - 1) * z * P_l_m[l_degree - 1][0] + - (l_degree - 1) * P_l_m[l_degree - 2][0] + ) + / l_degree + ) + else: + for l_degree in range(1, L_maxdegree): + P_l_m[l_degree][l_degree] = sym.simplify( + (1 - 2 * l_degree) * (1 - z**2) ** 0.5 * P_l_m[l_degree - 1][l_degree - 1] + ) + for m_order in range(0, L_maxdegree - 1): + P_l_m[m_order + 1][m_order] = sym.simplify( + (2 * m_order + 1) * z * P_l_m[m_order][m_order] + ) + for l_degree in range(2, L_maxdegree): + for m_order in range(l_degree - 1): + P_l_m[l_degree][m_order] = sym.simplify( + ( + (2 * l_degree - 1) * z * P_l_m[l_degree - 1][m_order] + - (l_degree + m_order - 1) * P_l_m[l_degree - 2][m_order] + ) + / (l_degree - m_order) + ) + if not pos_m_only: + for l_degree in range(1, L_maxdegree): + for m_order in range(1, l_degree + 1): + P_l_m[l_degree][-m_order] = sym.simplify( + (-1) ** m_order + * np.math.factorial(l_degree - m_order) + / np.math.factorial(l_degree + m_order) + * P_l_m[l_degree][m_order] + ) + return P_l_m + + +def real_sph_harm( + L_maxdegree: int, use_theta: bool, use_phi: bool = True, zero_m_only: bool = True +) -> List[List[Any]]: + """ + Computes formula strings of the the real part of the spherical harmonics up to degree L (excluded). + Variables are either spherical coordinates phi and theta (or cartesian coordinates x,y,z) on the UNIT SPHERE. + + Parameters + ---------- + L_maxdegree: int + Degree up to which to calculate the spherical harmonics (degree L is excluded). + use_theta: bool + - True: Expects the input of the formula strings to contain theta. + - False: Expects the input of the formula strings to contain z. + use_phi: bool + - True: Expects the input of the formula strings to contain phi. + - False: Expects the input of the formula strings to contain x and y. + Does nothing if zero_m_only is True + zero_m_only: bool + If True only calculate the harmonics where m=0. + + Returns + ------- + Y_lm_real: list + Computes formula strings of the the real part of the spherical harmonics up + to degree L (where degree L is not excluded). + In total L^2 many sph harm exist up to degree L (excluded). However, if zero_m_only only is True then + the total count is reduced to be only L many. + """ + z = sym.symbols("z") + P_l_m = associated_legendre_polynomials(L_maxdegree, zero_m_only) + if zero_m_only: + Y_l_m = [sym.zeros(1) for l_degree in range(L_maxdegree)] + else: + Y_l_m = [(sym.zeros(1) * (2 * l_degree + 1)) for l_degree in range(L_maxdegree)] + if use_theta: + theta = sym.symbols("theta") + for l_degree in range(L_maxdegree): + for m_order in range(len(P_l_m[l_degree])): + P_l_m[l_degree][m_order] = P_l_m[l_degree][m_order].subs(z, sym.cos(theta)) + for l_degree in range(L_maxdegree): + Y_l_m[l_degree][0] = sym.simplify(sph_harm_prefactor(l_degree, 0) * P_l_m[l_degree][0]) + if not zero_m_only: + phi = sym.symbols("phi") + for l_degree in range(1, L_maxdegree): + for m_order in range(1, l_degree + 1): + Y_l_m[l_degree][m_order] = sym.simplify( + 2**0.5 + * (-1) ** m_order + * sph_harm_prefactor(l_degree, m_order) + * P_l_m[l_degree][m_order] + * sym.cos(m_order * phi) + ) + for m_order in range(1, l_degree + 1): + Y_l_m[l_degree][-m_order] = sym.simplify( + 2**0.5 + * (-1) ** m_order + * sph_harm_prefactor(l_degree, -m_order) + * P_l_m[l_degree][m_order] + * sym.sin(m_order * phi) + ) + if not use_phi: + x = sym.symbols("x") + y = sym.symbols("y") + for l_degree in range(L_maxdegree): + for m_order in range(len(Y_l_m[l_degree])): + assert isinstance(Y_l_m[l_degree][m_order], int) + Y_l_m[l_degree][m_order] = sym.simplify( + Y_l_m[l_degree][m_order].subs(phi, sym.atan2(y, x)) + ) + return Y_l_m diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/efficient.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/efficient.py new file mode 100644 index 00000000..096583ae --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/efficient.py @@ -0,0 +1,132 @@ +import sys + +import paddle + +from paddle_utils import * + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/efficient.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from warnings import warn + +from mattergen.common.gemnet.initializers import he_orthogonal_init + + +class EfficientInteractionDownProjection(paddle.nn.Layer): + """ + Down projection in the efficient reformulation. + + Parameters + ---------- + emb_size_interm: int + Intermediate embedding size (down-projection size). + kernel_initializer: callable + Initializer of the weight matrix. + """ + + def __init__(self, num_spherical: int, num_radial: int, emb_size_interm: int): + super().__init__() + self.num_spherical = num_spherical + self.num_radial = num_radial + self.emb_size_interm = emb_size_interm + self.reset_parameters() + + def reset_parameters(self): + self.weight = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.empty(shape=(self.num_spherical, self.num_radial, self.emb_size_interm)), + trainable=True, + ) + he_orthogonal_init(self.weight) + + def forward(self, rbf, sph, id_ca, id_ragged_idx): + """ + + Arguments + --------- + rbf: paddle.Tensor, shape=(1, nEdges, num_radial) + sph: paddle.Tensor, shape=(nEdges, Kmax, num_spherical) + id_ca + id_ragged_idx + + Returns + ------- + rbf_W1: paddle.Tensor, shape=(nEdges, emb_size_interm, num_spherical) + sph: paddle.Tensor, shape=(nEdges, Kmax, num_spherical) + Kmax = maximum number of neighbors of the edges + """ + num_edges = tuple(rbf.shape)[1] + rbf_W1 = paddle.matmul(x=rbf, y=self.weight) + rbf_W1 = rbf_W1.transpose(perm=[1, 2, 0]) + if tuple(sph.shape)[0] == 0: + Kmax = 0 + else: + Kmax = max( + paddle.max(x=id_ragged_idx + 1), + paddle.to_tensor(data=0).to(id_ragged_idx.place), + ) + sph2 = paddle.zeros(shape=[num_edges, Kmax, self.num_spherical], dtype=sph.dtype) + sph2[id_ca, id_ragged_idx] = sph + sph2 = paddle.transpose(x=sph2, perm=dim2perm(sph2.ndim, 1, 2)) + return rbf_W1, sph2 + + +class EfficientInteractionBilinear(paddle.nn.Layer): + """ + Efficient reformulation of the bilinear layer and subsequent summation. + + Parameters + ---------- + units_out: int + Embedding output size of the bilinear layer. + kernel_initializer: callable + Initializer of the weight matrix. + """ + + def __init__(self, emb_size: int, emb_size_interm: int, units_out: int): + super().__init__() + self.emb_size = emb_size + self.emb_size_interm = emb_size_interm + self.units_out = units_out + self.reset_parameters() + + def reset_parameters(self): + out_0 = paddle.empty(shape=(self.emb_size, self.emb_size_interm, self.units_out)) + out_0.stop_gradient = not True + self.weight = paddle.base.framework.EagerParamBase.from_tensor(tensor=out_0) + he_orthogonal_init(self.weight) + + def forward(self, basis, m, id_reduce, id_ragged_idx): + """ + + Arguments + --------- + basis + m: quadruplets: m = m_db , triplets: m = m_ba + id_reduce + id_ragged_idx + + Returns + ------- + m_ca: paddle.Tensor, shape=(nEdges, units_out) + Edge embeddings. + """ + rbf_W1, sph = basis + nEdges = tuple(rbf_W1.shape)[0] + if nEdges == 0: + warn(f"Zero graph edges found in {self.__class__}") + return paddle.zeros(shape=(0, 0)) + Kmax = max( + paddle.max(x=id_ragged_idx) + 1, + paddle.to_tensor(data=0).to(id_ragged_idx.place), + ) + m2 = paddle.zeros(shape=[nEdges, Kmax, self.emb_size], dtype=m.dtype) + m2[id_reduce, id_ragged_idx] = m + sum_k = paddle.matmul(x=sph, y=m2) + rbf_W1_sum_k = paddle.matmul(x=rbf_W1, y=sum_k) + m_ca = paddle.matmul(x=rbf_W1_sum_k.transpose(perm=[2, 0, 1]), y=self.weight) + m_ca = paddle.sum(x=m_ca, axis=0) + return m_ca diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/embedding_block.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/embedding_block.py new file mode 100644 index 00000000..5be5a7cc --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/embedding_block.py @@ -0,0 +1,95 @@ +import sys + +import paddle + +from paddle_utils import * + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/embedding_block.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import numpy as np + +from mattergen.common.gemnet.layers.base_layers import Dense +from mattergen.common.utils.globals import MAX_ATOMIC_NUM + + +class IdentityEmbedding(paddle.nn.Identity): + """Embedding layer that just returns the input""" + + def __init__(self, emb_size): + super().__init__() + self.emb_size = emb_size + + +class AtomEmbedding(paddle.nn.Layer): + """ + Initial atom embeddings based on the atom type + + Parameters + ---------- + emb_size: int + Atom embeddings size + """ + + def __init__(self, emb_size, with_mask_type=False): + super().__init__() + self.emb_size = emb_size + self.embeddings = paddle.nn.Embedding( + num_embeddings=MAX_ATOMIC_NUM + int(with_mask_type), embedding_dim=emb_size + ) + init_Uniform = paddle.nn.initializer.Uniform(low=-np.sqrt(3), high=np.sqrt(3)) + init_Uniform(self.embeddings.weight) + + def forward(self, Z): + """ + Returns + ------- + h: paddle.Tensor, shape=(nAtoms, emb_size) + Atom embeddings. + """ + h = self.embeddings(Z - 1) + return h + + +class EdgeEmbedding(paddle.nn.Layer): + """ + Edge embedding based on the concatenation of atom embeddings and subsequent dense layer. + + Parameters + ---------- + emb_size: int + Embedding size after the dense layer. + activation: str + Activation function used in the dense layer. + """ + + def __init__(self, atom_features, edge_features, out_features, activation=None): + super().__init__() + in_features = 2 * atom_features + edge_features + self.dense = Dense(in_features, out_features, activation=activation, bias=False) + + def forward(self, h, m_rbf, idx_s, idx_t): + """ + + Arguments + --------- + h + m_rbf: shape (nEdges, nFeatures) + in embedding block: m_rbf = rbf ; In interaction block: m_rbf = m_st + idx_s + idx_t + + Returns + ------- + m_st: paddle.Tensor, shape=(nEdges, emb_size) + Edge embeddings. + """ + h_s = h[idx_s] + h_t = h[idx_t] + m_st = paddle.concat(x=[h_s, h_t, m_rbf], axis=-1) + m_st = self.dense(m_st) + return m_st diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/interaction_block.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/interaction_block.py new file mode 100644 index 00000000..5e8d6cd8 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/interaction_block.py @@ -0,0 +1,230 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/interaction_block.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import math + +from mattergen.common.gemnet.layers.atom_update_block import AtomUpdateBlock +from mattergen.common.gemnet.layers.base_layers import Dense +from mattergen.common.gemnet.layers.base_layers import ResidualLayer +from mattergen.common.gemnet.layers.efficient import EfficientInteractionBilinear +from mattergen.common.gemnet.layers.embedding_block import EdgeEmbedding +from mattergen.common.gemnet.layers.scaling import ScalingFactor + + +class InteractionBlockTripletsOnly(paddle.nn.Layer): + """ + Interaction block for GemNet-T/dT. + + Parameters + ---------- + emb_size_atom: int + Embedding size of the atoms. + emb_size_edge: int + Embedding size of the edges. + emb_size_trip: int + (Down-projected) Embedding size in the triplet message passing block. + emb_size_rbf: int + Embedding size of the radial basis transformation. + emb_size_cbf: int + Embedding size of the circular basis transformation (one angle). + + emb_size_bil_trip: int + Embedding size of the edge embeddings in the triplet-based message passing block after the bilinear layer. + num_before_skip: int + Number of residual blocks before the first skip connection. + num_after_skip: int + Number of residual blocks after the first skip connection. + num_concat: int + Number of residual blocks after the concatenation. + num_atom: int + Number of residual blocks in the atom embedding blocks. + + activation: str + Name of the activation function to use in the dense layers except for the final dense layer. + scale_file: str + Path to the json file containing the scaling factors. + """ + + def __init__( + self, + emb_size_atom, + emb_size_edge, + emb_size_trip, + emb_size_rbf, + emb_size_cbf, + emb_size_bil_trip, + num_before_skip, + num_after_skip, + num_concat, + num_atom, + activation=None, + scale_file=None, + name="Interaction", + ): + super().__init__() + self.name = name + self.skip_connection_factor = 2.0**-0.5 + block_nr = name.split("_")[-1] + self.dense_ca = Dense(emb_size_edge, emb_size_edge, activation=activation, bias=False) + self.trip_interaction = TripletInteraction( + emb_size_edge=emb_size_edge, + emb_size_trip=emb_size_trip, + emb_size_bilinear=emb_size_bil_trip, + emb_size_rbf=emb_size_rbf, + emb_size_cbf=emb_size_cbf, + activation=activation, + scale_file=scale_file, + name=f"TripInteraction_{block_nr}", + ) + self.layers_before_skip = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(emb_size_edge, activation=activation) for i in range(num_before_skip) + ] + ) + self.layers_after_skip = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(emb_size_edge, activation=activation) for i in range(num_after_skip) + ] + ) + self.atom_update = AtomUpdateBlock( + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_rbf=emb_size_rbf, + nHidden=num_atom, + activation=activation, + scale_file=scale_file, + name=f"AtomUpdate_{block_nr}", + ) + self.concat_layer = EdgeEmbedding( + emb_size_atom, emb_size_edge, emb_size_edge, activation=activation + ) + self.residual_m = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(emb_size_edge, activation=activation) for _ in range(num_concat) + ] + ) + self.inv_sqrt_2 = 1 / math.sqrt(2.0) + + def forward( + self, + h, + m, + rbf3, + cbf3, + id3_ragged_idx, + id_swap, + id3_ba, + id3_ca, + rbf_h, + idx_s, + idx_t, + ): + """ + Returns + ------- + h: paddle.Tensor, shape=(nEdges, emb_size_atom) + Atom embeddings. + m: paddle.Tensor, shape=(nEdges, emb_size_edge) + Edge embeddings (c->a). + """ + x_ca_skip = self.dense_ca(m) + x3 = self.trip_interaction(m, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca) + x = x_ca_skip + x3 + x = x * self.inv_sqrt_2 + for i, layer in enumerate(self.layers_before_skip): + x = layer(x) + m = m + x + m = m * self.inv_sqrt_2 + for i, layer in enumerate(self.layers_after_skip): + m = layer(m) + h2 = self.atom_update(h, m, rbf_h, idx_t) + h = h + h2 + h = h * self.skip_connection_factor + m2 = self.concat_layer(h, m, idx_s, idx_t) + for i, layer in enumerate(self.residual_m): + m2 = layer(m2) + m = m + m2 + m = m * self.inv_sqrt_2 + return h, m + + +class TripletInteraction(paddle.nn.Layer): + """ + Triplet-based message passing block. + + Parameters + ---------- + emb_size_edge: int + Embedding size of the edges. + emb_size_trip: int + (Down-projected) Embedding size of the edge embeddings after the hadamard product with rbf. + emb_size_bilinear: int + Embedding size of the edge embeddings after the bilinear layer. + emb_size_rbf: int + Embedding size of the radial basis transformation. + emb_size_cbf: int + Embedding size of the circular basis transformation (one angle). + + activation: str + Name of the activation function to use in the dense layers except for the final dense layer. + scale_file: str + Path to the json file containing the scaling factors. + """ + + def __init__( + self, + emb_size_edge, + emb_size_trip, + emb_size_bilinear, + emb_size_rbf, + emb_size_cbf, + activation=None, + scale_file=None, + name="TripletInteraction", + **kwargs, + ): + super().__init__() + self.name = name + self.dense_ba = Dense(emb_size_edge, emb_size_edge, activation=activation, bias=False) + self.mlp_rbf = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) + self.scale_rbf = ScalingFactor(scale_file=scale_file, name=name + "_had_rbf") + self.mlp_cbf = EfficientInteractionBilinear(emb_size_trip, emb_size_cbf, emb_size_bilinear) + self.scale_cbf_sum = ScalingFactor(scale_file=scale_file, name=name + "_sum_cbf") + self.down_projection = Dense( + emb_size_edge, emb_size_trip, activation=activation, bias=False + ) + self.up_projection_ca = Dense( + emb_size_bilinear, emb_size_edge, activation=activation, bias=False + ) + self.up_projection_ac = Dense( + emb_size_bilinear, emb_size_edge, activation=activation, bias=False + ) + self.inv_sqrt_2 = 1 / math.sqrt(2.0) + + def forward(self, m, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca): + """ + Returns + ------- + m: paddle.Tensor, shape=(nEdges, emb_size_edge) + Edge embeddings (c->a). + """ + x_ba = self.dense_ba(m) + rbf_emb = self.mlp_rbf(rbf3) + x_ba2 = x_ba * rbf_emb + x_ba = self.scale_rbf(x_ba, x_ba2) + x_ba = self.down_projection(x_ba) + x_ba = x_ba[id3_ba] + x = self.mlp_cbf(cbf3, x_ba, id3_ca, id3_ragged_idx) + x = self.scale_cbf_sum(x_ba, x) + x_ca = self.up_projection_ca(x) + x_ac = self.up_projection_ac(x) + x_ac = x_ac[id_swap] + x3 = x_ca + x_ac + x3 = x3 * self.inv_sqrt_2 + return x3 diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/radial_basis.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/radial_basis.py new file mode 100644 index 00000000..a7d76a9d --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/radial_basis.py @@ -0,0 +1,177 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/radial_basis.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import math + +import numpy as np +from scipy.special import binom + +from paddle_geometric.nn.models.schnet import GaussianSmearing + + +class PolynomialEnvelope(paddle.nn.Layer): + """ + Polynomial envelope function that ensures a smooth cutoff. + + Parameters + ---------- + exponent: int + Exponent of the envelope function. + """ + + def __init__(self, exponent): + super().__init__() + assert exponent > 0 + self.p = exponent + self.a = -(self.p + 1) * (self.p + 2) / 2 + self.b = self.p * (self.p + 2) + self.c = -self.p * (self.p + 1) / 2 + + def forward(self, d_scaled): + env_val = ( + 1 + + self.a * d_scaled**self.p + + self.b * d_scaled ** (self.p + 1) + + self.c * d_scaled ** (self.p + 2) + ) + return paddle.where(condition=d_scaled < 1, x=env_val, y=paddle.zeros_like(x=d_scaled)) + + +class ExponentialEnvelope(paddle.nn.Layer): + """ + Exponential envelope function that ensures a smooth cutoff, + as proposed in Unke, Chmiela, Gastegger, Schütt, Sauceda, Müller 2021. + SpookyNet: Learning Force Fields with Electronic Degrees of Freedom + and Nonlocal Effects + """ + + def __init__(self): + super().__init__() + + def forward(self, d_scaled): + env_val = paddle.exp(x=-(d_scaled**2) / ((1 - d_scaled) * (1 + d_scaled))) + return paddle.where(condition=d_scaled < 1, x=env_val, y=paddle.zeros_like(x=d_scaled)) + + +class SphericalBesselBasis(paddle.nn.Layer): + """ + 1D spherical Bessel basis + + Parameters + ---------- + num_radial: int + Controls maximum frequency. + cutoff: float + Cutoff distance in Angstrom. + """ + + def __init__(self, num_radial: int, cutoff: float): + super().__init__() + self.norm_const = math.sqrt(2 / cutoff**3) + self.frequencies = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor(data=np.pi * np.arange(1, num_radial + 1, dtype=np.float32)), + trainable=True, + ) + + def forward(self, d_scaled): + return ( + self.norm_const / d_scaled[:, None] * paddle.sin(x=self.frequencies * d_scaled[:, None]) + ) + + +class BernsteinBasis(paddle.nn.Layer): + """ + Bernstein polynomial basis, + as proposed in Unke, Chmiela, Gastegger, Schütt, Sauceda, Müller 2021. + SpookyNet: Learning Force Fields with Electronic Degrees of Freedom + and Nonlocal Effects + + Parameters + ---------- + num_radial: int + Controls maximum frequency. + pregamma_initial: float + Initial value of exponential coefficient gamma. + Default: gamma = 0.5 * a_0**-1 = 0.94486, + inverse softplus -> pregamma = log e**gamma - 1 = 0.45264 + """ + + def __init__(self, num_radial: int, pregamma_initial: float = 0.45264): + super().__init__() + prefactor = binom(num_radial - 1, np.arange(num_radial)) + self.register_buffer( + name="prefactor", + tensor=paddle.to_tensor(data=prefactor, dtype="float32"), + persistable=False, + ) + self.pregamma = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor(data=pregamma_initial, dtype="float32"), + trainable=True, + ) + self.softplus = paddle.nn.Softplus() + exp1 = paddle.arange(end=num_radial) + self.register_buffer(name="exp1", tensor=exp1[None, :], persistable=False) + exp2 = num_radial - 1 - exp1 + self.register_buffer(name="exp2", tensor=exp2[None, :], persistable=False) + + def forward(self, d_scaled): + gamma = self.softplus(self.pregamma) + exp_d = paddle.exp(x=-gamma * d_scaled)[:, None] + return self.prefactor * exp_d**self.exp1 * (1 - exp_d) ** self.exp2 + + +class RadialBasis(paddle.nn.Layer): + """ + + Parameters + ---------- + num_radial: int + Controls maximum frequency. + cutoff: float + Cutoff distance in Angstrom. + rbf: dict = {"name": "gaussian"} + Basis function and its hyperparameters. + envelope: dict = {"name": "polynomial", "exponent": 5} + Envelope function and its hyperparameters. + """ + + def __init__( + self, + num_radial: int, + cutoff: float, + rbf: dict = {"name": "gaussian"}, + envelope: dict = {"name": "polynomial", "exponent": 5}, + ): + super().__init__() + self.inv_cutoff = 1 / cutoff + env_name = envelope["name"].lower() + env_hparams = envelope.copy() + del env_hparams["name"] + if env_name == "polynomial": + self.envelope = PolynomialEnvelope(**env_hparams) + elif env_name == "exponential": + self.envelope = ExponentialEnvelope() + else: + raise ValueError(f"Unknown envelope function '{env_name}'.") + rbf_name = rbf["name"].lower() + rbf_hparams = rbf.copy() + del rbf_hparams["name"] + if rbf_name == "gaussian": + self.rbf = GaussianSmearing(start=0, stop=1, num_gaussians=num_radial, **rbf_hparams) + elif rbf_name == "spherical_bessel": + self.rbf = SphericalBesselBasis(num_radial=num_radial, cutoff=cutoff) + elif rbf_name == "bernstein": + self.rbf = BernsteinBasis(num_radial=num_radial, **rbf_hparams) + else: + raise ValueError(f"Unknown radial basis function '{rbf_name}'.") + + def forward(self, d): + d_scaled = d * self.inv_cutoff + env = self.envelope(d_scaled) + return env[:, None] * self.rbf(d_scaled) diff --git a/materials_discovery/gemnet/model/layers/scaling.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/scaling.py similarity index 75% rename from materials_discovery/gemnet/model/layers/scaling.py rename to jointContribution/mattergen/mattergen/common/gemnet/layers/scaling.py index 748139e7..541f3b20 100644 --- a/materials_discovery/gemnet/model/layers/scaling.py +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/scaling.py @@ -1,10 +1,16 @@ -import logging - -import numpy as np import paddle -from ..utils import read_value_json -from ..utils import update_json +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/scaling.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import logging + +from mattergen.common.gemnet.utils import read_value_json +from mattergen.common.gemnet.utils import update_json class AutomaticFit: @@ -29,14 +35,17 @@ def __init__(self, variable, scale_file, name): else: self._add2queue() - def reset(): + @classmethod + def reset(self): AutomaticFit.activeVar = None AutomaticFit.all_processed = False - def fitting_completed(): + @classmethod + def fitting_completed(self): return AutomaticFit.queue is None - def set2fitmode(): + @classmethod + def set2fitmode(self): AutomaticFit.reset() AutomaticFit.fitting_mode = True @@ -67,9 +76,7 @@ def load_maybe(self): """ value = read_value_json(self.scale_file, self._name) if value is None: - logging.info( - f"Initialize variable {self._name}' to {self.variable.numpy():.3f}" - ) + logging.debug(f"Initialize variable {self._name}' to {self.variable.numpy():.3f}") else: self._fitted = True logging.debug(f"Set scale factor {self._name} : {value}") @@ -83,7 +90,7 @@ class AutoScaleFit(AutomaticFit): Parameters ---------- - variable: tf.Variable + variable: paddle.Tensor Variable to fit. scale_file: str Path to the json file where to store/load from the scaling factors. @@ -99,19 +106,25 @@ def _init_stats(self): self.variance_out = 0 self.nSamples = 0 + @paddle.no_grad() def observe(self, x, y): """ - Observe variances for inut x and output y. + Observe variances for input x and output y. The scaling factor alpha is calculated s.t. Var(alpha * y) ~ Var(x) """ if self._fitted: return if AutomaticFit.activeVar == self: nSamples = tuple(y.shape)[0] - self.variance_in += paddle.mean(x=paddle.var(x=x, axis=0)) * nSamples - self.variance_out += paddle.mean(x=paddle.var(x=y, axis=0)) * nSamples + self.variance_in += ( + paddle.mean(x=paddle.var(x=x, axis=0)).to(dtype="float32") * nSamples + ) + self.variance_out += ( + paddle.mean(x=paddle.var(x=y, axis=0)).to(dtype="float32") * nSamples + ) self.nSamples += nSamples + @paddle.no_grad() def fit(self): """ Fit the scaling factor based on the observed variances. @@ -124,14 +137,12 @@ def fit(self): self.variance_in = self.variance_in / self.nSamples self.variance_out = self.variance_out / self.nSamples ratio = self.variance_out / self.variance_in - value = np.sqrt(1 / ratio, dtype="float32") + value = paddle.sqrt(x=1 / ratio) logging.info( - f"Variable: {self._name}, Var_in: {self.variance_in.numpy():.3f}, Var_out: {self.variance_out.numpy():.3f}, " - + f"Ratio: {ratio:.3f} => Scaling factor: {value:.3f}" + f"Variable: {self._name}, Var_in: {self.variance_in.item():.3f}, Var_out: {self.variance_out.item():.3f}, Ratio: {ratio:.3f} => Scaling factor: {value:.3f}" ) - with paddle.no_grad(): - paddle.assign(self.variable * value, output=self.variable) - update_json(self.scale_file, {self._name: float(self.variable.numpy())}) + paddle.assign(self.variable * value, output=self.variable) + update_json(self.scale_file, {self._name: float(self.variable.item())}) self.set_next_active() @@ -149,15 +160,9 @@ class ScalingFactor(paddle.nn.Layer): def __init__(self, scale_file, name, device=None): super().__init__() - out_1 = paddle.create_parameter( - shape=paddle.to_tensor(data=1.0, place=device).shape, - dtype=paddle.to_tensor(data=1.0, place=device).numpy().dtype, - default_initializer=paddle.nn.initializer.Assign( - paddle.to_tensor(data=1.0, place=device) - ), + self.scale_factor = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor(data=1.0, place=device), trainable=False ) - out_1.stop_gradient = not False - self.scale_factor = out_1 self.autofit = AutoScaleFit(self.scale_factor, scale_file, name) def forward(self, x_ref, y): diff --git a/jointContribution/mattergen/mattergen/common/gemnet/layers/spherical_basis.py b/jointContribution/mattergen/mattergen/common/gemnet/layers/spherical_basis.py new file mode 100644 index 00000000..62656bf1 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/layers/spherical_basis.py @@ -0,0 +1,80 @@ +import sys + +import paddle + +from paddle_utils import * + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/spherical_basis.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import sympy as sym + +from mattergen.common.gemnet.layers.basis_utils import real_sph_harm +from mattergen.common.gemnet.layers.radial_basis import RadialBasis +from paddle_geometric.nn.models.schnet import GaussianSmearing + + +class CircularBasisLayer(paddle.nn.Layer): + """ + 2D Fourier Bessel Basis + + Parameters + ---------- + num_spherical: int + Controls maximum frequency. + radial_basis: RadialBasis + Radial basis functions + cbf: dict + Name and hyperparameters of the cosine basis function + efficient: bool + Whether to use the "efficient" summation order + """ + + def __init__( + self, + num_spherical: int, + radial_basis: RadialBasis, + cbf: dict, + efficient: bool = False, + ): + super().__init__() + self.radial_basis = radial_basis + self.efficient = efficient + cbf_name = cbf["name"].lower() + cbf_hparams = cbf.copy() + del cbf_hparams["name"] + if cbf_name == "gaussian": + self.cosφ_basis = GaussianSmearing( + start=-1, stop=1, num_gaussians=num_spherical, **cbf_hparams + ) + elif cbf_name == "spherical_harmonics": + Y_lm = real_sph_harm(num_spherical, use_theta=False, zero_m_only=True) + sph_funcs = [] + z = sym.symbols("z") + modules = {"sin": paddle.sin, "cos": paddle.cos, "sqrt": paddle.sqrt} + m_order = 0 + for l_degree in range(len(Y_lm)): + if l_degree == 0: + first_sph = sym.lambdify([z], Y_lm[l_degree][m_order], modules) + sph_funcs.append(lambda z: paddle.zeros_like(x=z) + first_sph(z)) + else: + sph_funcs.append(sym.lambdify([z], Y_lm[l_degree][m_order], modules)) + self.cosφ_basis = lambda cosφ: paddle.stack(x=[f(cosφ) for f in sph_funcs], axis=1) + else: + raise ValueError(f"Unknown cosine basis function '{cbf_name}'.") + + def forward(self, D_ca, cosφ_cab, id3_ca): + rbf = self.radial_basis(D_ca) + cbf = self.cosφ_basis(cosφ_cab) + if not self.efficient: + rbf = rbf[id3_ca] + out = (rbf[:, None, :] * cbf[:, :, None]).view( + -1, tuple(rbf.shape)[-1] * tuple(cbf.shape)[-1] + ) + return (out,) + else: + return rbf[None, :, :], cbf diff --git a/jointContribution/mattergen/mattergen/common/gemnet/utils.py b/jointContribution/mattergen/mattergen/common/gemnet/utils.py new file mode 100644 index 00000000..4bf44ce2 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/gemnet/utils.py @@ -0,0 +1,260 @@ +import paddle + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/utils.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +import json +from typing import Any +from typing import Dict +from typing import Optional +from typing import Tuple + +# from paddle_scatter import segment_csr + + +def read_json(path: str) -> Dict: + """""" + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + with open(path, "r") as f: + content = json.load(f) + return content + + +def update_json(path: str, data: Dict): + """""" + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + content = read_json(path) + content.update(data) + write_json(path, content) + + +def write_json(path: str, data: Dict): + """""" + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + +def read_value_json(path: str, key: str) -> Optional[Any]: + """""" + content = read_json(path) + if key in content.keys(): + return content[key] + else: + return None + + +def ragged_range(sizes: paddle.Tensor) -> paddle.Tensor: + """Multiple concatenated ranges. + + Examples + -------- + sizes = [1 4 2 3] + Return: [0 0 1 2 3 0 1 0 1 2] + """ + assert sizes.dim() == 1 + if sizes.sum() == 0: + return paddle.empty(shape=[0], dtype=sizes.dtype) + sizes_nonzero = sizes > 0 + if not paddle.all(x=sizes_nonzero): + sizes = paddle.masked_select(x=sizes, mask=sizes_nonzero) + id_steps = paddle.ones(shape=sizes.sum(), dtype="int64") + id_steps[0] = 0 + insert_index = sizes[:-1].cumsum(axis=0) + insert_val = (1 - sizes)[:-1] + id_steps[insert_index] = insert_val + res = id_steps.cumsum(axis=0) + return res + + +def repeat_blocks( + sizes: paddle.Tensor, + repeats: paddle.Tensor, + continuous_indexing: bool = True, + start_idx: int = 0, + block_inc: int = 0, + repeat_inc: int = 0, +) -> paddle.Tensor: + """Repeat blocks of indices. + Adapted from https://stackoverflow.com/questions/51154989/numpy-vectorized-function-to-repeat-blocks-of-consecutive-elements + + continuous_indexing: Whether to keep increasing the index after each block + start_idx: Starting index + block_inc: Number to increment by after each block, + either global or per block. Shape: len(sizes) - 1 + repeat_inc: Number to increment by after each repetition, + either global or per block + + Examples + -------- + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = False + Return: [0 0 0 0 1 2 0 1 2 0 1 0 1 0 1] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True + Return: [0 0 0 1 2 3 1 2 3 4 5 4 5 4 5] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True ; + repeat_inc = 4 + Return: [0 4 8 1 2 3 5 6 7 4 5 8 9 12 13] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True ; + start_idx = 5 + Return: [5 5 5 6 7 8 6 7 8 9 10 9 10 9 10] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True ; + block_inc = 1 + Return: [0 0 0 2 3 4 2 3 4 6 7 6 7 6 7] + sizes = [0,3,2] ; repeats = [3,2,3] ; continuous_indexing = True + Return: [0 1 2 0 1 2 3 4 3 4 3 4] + sizes = [2,3,2] ; repeats = [2,0,2] ; continuous_indexing = True + Return: [0 1 0 1 5 6 5 6] + """ + assert sizes.dim() == 1 + assert all(sizes >= 0) + sizes_nonzero = sizes > 0 + if not paddle.all(x=sizes_nonzero): + assert block_inc == 0 + sizes = paddle.masked_select(x=sizes, mask=sizes_nonzero) + if isinstance(repeats, paddle.Tensor): + repeats = paddle.masked_select(x=repeats, mask=sizes_nonzero) + if isinstance(repeat_inc, paddle.Tensor): + repeat_inc = paddle.masked_select(x=repeat_inc, mask=sizes_nonzero) + if isinstance(repeats, paddle.Tensor): + assert all(repeats >= 0) + insert_dummy = repeats[0] == 0 + if insert_dummy: + one = paddle.ones(shape=[1], dtype=sizes.dtype) + zero = paddle.zeros(shape=[1], dtype=sizes.dtype) + sizes = paddle.concat(x=(one, sizes)) + repeats = paddle.concat(x=(one, repeats)) + if isinstance(block_inc, paddle.Tensor): + block_inc = paddle.concat(x=(zero, block_inc)) + if isinstance(repeat_inc, paddle.Tensor): + repeat_inc = paddle.concat(x=(zero, repeat_inc)) + else: + assert repeats >= 0 + insert_dummy = False + r1 = paddle.repeat_interleave(x=paddle.arange(end=len(sizes)), repeats=repeats) + N = (sizes * repeats).sum() + id_ar = paddle.ones(shape=N, dtype="int64") + id_ar[0] = 0 + insert_index = sizes[r1[:-1]].cumsum(axis=0) + insert_val = (1 - sizes)[r1[:-1]] + if isinstance(repeats, paddle.Tensor) and paddle.any(x=repeats == 0): + diffs = r1[1:] - r1[:-1] + indptr = paddle.concat(x=(paddle.zeros(shape=[1], dtype=sizes.dtype), diffs.cumsum(axis=0))) + if continuous_indexing: + # insert_val += segment_csr(sizes[: r1[-1]], indptr, reduce="sum") + raise NotImplementedError() + if isinstance(block_inc, paddle.Tensor): + # insert_val += segment_csr(block_inc[: r1[-1]], indptr, reduce="sum") + raise NotImplementedError() + else: + insert_val += block_inc * (indptr[1:] - indptr[:-1]) + if insert_dummy: + insert_val[0] -= block_inc + else: + idx = r1[1:] != r1[:-1] + if continuous_indexing: + insert_val[idx] = 1 + idx = paddle.where(condition=idx)[0].flatten() + insert_val[idx] += block_inc + if isinstance(repeat_inc, paddle.Tensor): + insert_val += repeat_inc[r1[:-1]] + if isinstance(repeats, paddle.Tensor): + repeat_inc_inner = repeat_inc[repeats > 0][:-1] + else: + repeat_inc_inner = repeat_inc[:-1] + else: + insert_val += repeat_inc + repeat_inc_inner = repeat_inc + if isinstance(repeats, paddle.Tensor): + repeats_inner = repeats[repeats > 0][:-1] + else: + repeats_inner = repeats + idx = r1[1:] != r1[:-1] + idx = paddle.where(condition=idx)[0].flatten() + insert_val[idx] -= repeat_inc_inner * repeats_inner + id_ar[insert_index] = insert_val + if insert_dummy: + id_ar = id_ar[1:] + if continuous_indexing: + id_ar[0] -= 1 + id_ar[0] += start_idx + res = id_ar.cumsum(axis=0) + return res + + +def calculate_interatomic_vectors( + R: paddle.Tensor, + id_s: paddle.Tensor, + id_t: paddle.Tensor, + offsets_st: paddle.Tensor, +) -> Tuple[paddle.Tensor, paddle.Tensor]: + """ + Calculate the vectors connecting the given atom pairs, + considering offsets from periodic boundary conditions (PBC). + + Parameters + ---------- + R: Tensor, shape = (nAtoms, 3) + Atom positions. + id_s: Tensor, shape = (nEdges,) + Indices of the source atom of the edges. + id_t: Tensor, shape = (nEdges,) + Indices of the target atom of the edges. + offsets_st: Tensor, shape = (nEdges,) + PBC offsets of the edges. + Subtract this from the correct direction. + + Returns + ------- + (D_st, V_st): tuple + D_st: Tensor, shape = (nEdges,) + Distance from atom t to s. + V_st: Tensor, shape = (nEdges,) + Unit direction from atom t to s. + """ + Rs = R[id_s] + Rt = R[id_t] + if offsets_st is None: + V_st = Rt - Rs + else: + V_st = Rt - Rs + offsets_st + D_st = paddle.sqrt(x=paddle.sum(x=V_st**2, axis=1)) + V_st = V_st / D_st[..., None] + return D_st, V_st + + +def inner_product_normalized(x: paddle.Tensor, y: paddle.Tensor) -> paddle.Tensor: + """ + Calculate the inner product between the given normalized vectors, + giving a result between -1 and 1. + """ + return paddle.sum(x=x * y, axis=-1).clip(min=-1, max=1) + + +def mask_neighbors(neighbors: paddle.Tensor, edge_mask: paddle.Tensor) -> paddle.Tensor: + neighbors_old_indptr = paddle.concat( + x=[paddle.zeros(shape=[1], dtype=neighbors.dtype), neighbors] + ) + neighbors_old_indptr = paddle.cumsum(x=neighbors_old_indptr, axis=0) + neighbors = segment_csr(edge_mask.astype(dtype="int64"), neighbors_old_indptr) + return neighbors + + +def get_k_index_product_set( + num_k_x: paddle.Tensor, num_k_y: paddle.Tensor, num_k_z: paddle.Tensor +) -> tuple[paddle.Tensor, int]: + k_index_sets = ( + paddle.arange(start=-num_k_x, end=num_k_x + 1, dtype="float32"), + paddle.arange(start=-num_k_y, end=num_k_y + 1, dtype="float32"), + paddle.arange(start=-num_k_z, end=num_k_z + 1, dtype="float32"), + ) + k_index_product_set = paddle.cartesian_prod(x=k_index_sets) + k_index_product_set = k_index_product_set[tuple(k_index_product_set.shape)[0] // 2 + 1 :] + num_k_degrees_of_freedom = tuple(k_index_product_set.shape)[0] + return k_index_product_set, num_k_degrees_of_freedom diff --git a/jointContribution/mattergen/mattergen/common/globals.py b/jointContribution/mattergen/mattergen/common/globals.py new file mode 100644 index 00000000..4be28f92 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/globals.py @@ -0,0 +1,5 @@ +from pathlib import Path + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +GENERATED_CRYSTALS_ZIP_FILE_NAME = "generated_crystals_cif.zip" +GENERATED_CRYSTALS_EXTXYZ_FILE_NAME = "generated_crystals.extxyz" diff --git a/jointContribution/mattergen/mattergen/common/loss.py b/jointContribution/mattergen/mattergen/common/loss.py new file mode 100644 index 00000000..9316e584 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/loss.py @@ -0,0 +1,52 @@ +from functools import partial +from typing import Dict +from typing import Literal +from typing import Optional + +from mattergen.diffusion.losses import SummedFieldLoss +from mattergen.diffusion.losses import denoising_score_matching +from mattergen.diffusion.model_target import ModelTarget +from mattergen.diffusion.training.field_loss import FieldLoss +from mattergen.diffusion.training.field_loss import d3pm_loss +from mattergen.diffusion.wrapped.wrapped_normal_loss import wrapped_normal_loss + + +class MaterialsLoss(SummedFieldLoss): + def __init__( + self, + reduce: Literal["sum", "mean"] = "mean", + d3pm_hybrid_lambda: float = 0.0, + include_pos: bool = True, + include_cell: bool = True, + include_atomic_numbers: bool = True, + weights: Optional[Dict[str, float]] = None, + ): + model_targets = { + "pos": ModelTarget.score_times_std, + "cell": ModelTarget.score_times_std, + } + self.fields_to_score = [] + self.categorical_fields = [] + loss_fns: Dict[str, FieldLoss] = {} + if include_pos: + self.fields_to_score.append("pos") + loss_fns["pos"] = partial( + wrapped_normal_loss, reduce=reduce, model_target=model_targets["pos"] + ) + if include_cell: + self.fields_to_score.append("cell") + loss_fns["cell"] = partial( + denoising_score_matching, + reduce=reduce, + model_target=model_targets["cell"], + ) + if include_atomic_numbers: + model_targets["atomic_numbers"] = ModelTarget.logits + self.fields_to_score.append("atomic_numbers") + self.categorical_fields.append("atomic_numbers") + loss_fns["atomic_numbers"] = partial( + d3pm_loss, reduce=reduce, d3pm_hybrid_lambda=d3pm_hybrid_lambda + ) + self.reduce = reduce + self.d3pm_hybrid_lambda = d3pm_hybrid_lambda + super().__init__(loss_fns=loss_fns, weights=weights, model_targets=model_targets) diff --git a/jointContribution/mattergen/mattergen/common/tests/__init__.py b/jointContribution/mattergen/mattergen/common/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/common/tests/data_utils_test.py b/jointContribution/mattergen/mattergen/common/tests/data_utils_test.py new file mode 100644 index 00000000..e5a794bb --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/tests/data_utils_test.py @@ -0,0 +1,391 @@ +from collections import Counter +from itertools import product +from typing import Dict +from typing import Optional +from typing import Tuple + +import numpy as np +import paddle +import pytest +from pymatgen.core.structure import Structure +from pymatgen.transformations.standard_transformations import RotationTransformation + +from mattergen.common.tests.testutils import get_mp_20_debug_batch +from mattergen.common.utils import data_utils + + +def test_lattice_params_matrix(): + a, b, c = 4.0, 3.0, 2.0 + alpha, beta, gamma = 120.0, 90.0, 90.0 + matrix = data_utils.lattice_params_to_matrix(a, b, c, alpha, beta, gamma) + result = data_utils.lattice_matrix_to_params(matrix) + assert np.allclose([a, b, c, alpha, beta, gamma], result) + + +def test_lattice_params_matrix2(): + matrix = [ + [3.966866, 0.0, 2.42900487e-16], + [-2.42900487e-16, 3.966866, 2.42900487e-16], + [0.0, 0.0, 5.73442], + ] + matrix = np.array(matrix) + params = data_utils.lattice_matrix_to_params(matrix) + result = data_utils.lattice_params_to_matrix(*params) + assert np.allclose(matrix, result) + + +def test_lattice_params_to_matrix_paddle(): + lengths = np.array([[4.0, 3.0, 2.0], [1, 3, 2]]) + angles = np.array([[120.0, 90.0, 90.0], [57.0, 130.0, 85.0]]) + lengths_and_angles = np.concatenate([lengths, angles], axis=-1) + matrix0 = data_utils.lattice_params_to_matrix(*lengths_and_angles[0].tolist()) + matrix1 = data_utils.lattice_params_to_matrix(*lengths_and_angles[1].tolist()) + true_matrix = np.stack([matrix0, matrix1], axis=0) + torch_matrix = data_utils.lattice_params_to_matrix_paddle( + paddle.to_tensor(data=lengths), paddle.to_tensor(data=angles) + ) + assert np.allclose(true_matrix, torch_matrix.numpy(), atol=1e-05) + + +def test_lattice_matrix_to_params_paddle(): + lengths = np.array([[4.0, 3.0, 2.0], [1, 3, 2]]) + angles = np.array([[120.0, 90.0, 90.0], [57.0, 130.0, 85.0]]) + torch_matrix = data_utils.lattice_params_to_matrix_paddle( + paddle.to_tensor(data=lengths), paddle.to_tensor(data=angles) + ) + torch_lengths, torch_angles = data_utils.lattice_matrix_to_params_paddle(torch_matrix) + assert np.allclose(lengths, torch_lengths.numpy(), atol=1e-05) + assert np.allclose(angles, torch_angles.numpy(), atol=1e-05) + + +def test_frac_cart_conversion(): + num_atoms = paddle.to_tensor(data=[4, 3, 2, 5], dtype="int64") + lengths = paddle.rand(shape=[num_atoms.shape[0], 3]) * 4 + angles = paddle.rand(shape=[num_atoms.shape[0], 3]) * 60 + 60 + frac_coords = paddle.rand(shape=[num_atoms.sum(), 3]) + cart_coords = data_utils.frac_to_cart_coords(frac_coords, lengths, angles, num_atoms) + inverted_frac_coords = data_utils.cart_to_frac_coords(cart_coords, lengths, angles, num_atoms) + assert paddle.allclose(x=frac_coords, y=inverted_frac_coords, atol=1e-05, rtol=0.001).item() + + +def test_get_pbc_distances(): + frac_coords = paddle.to_tensor( + data=[[0.2, 0.2, 0.0], [0.6, 0.8, 0.8], [0.2, 0.2, 0.0], [0.6, 0.8, 0.8]], + dtype="float32", + ) + edge_index = paddle.to_tensor(data=[[1, 0], [0, 0], [2, 3]], dtype="int64").T + lengths = paddle.to_tensor(data=[[1.0, 1.0, 2.0], [1.0, 2.0, 1.0]], dtype="float32") + angles = paddle.to_tensor(data=[[90.0, 90.0, 90.0], [90.0, 90.0, 90.0]], dtype="float32") + to_jimages = paddle.to_tensor(data=[[0, 0, 0], [0, 1, 0], [0, 1, 0]], dtype="int64") + num_nodes = paddle.to_tensor(data=[2, 2], dtype="int64") + num_edges = paddle.to_tensor(data=[2, 1], dtype="int64") + lattice = data_utils.lattice_params_to_matrix_paddle(lengths, angles) + out = data_utils.get_pbc_distances( + frac_coords, edge_index, lattice, to_jimages, num_nodes, num_edges + ) + true_distances = paddle.to_tensor(data=[1.7549928774784245, 1.0, 1.2], dtype="float32") + assert paddle.allclose(x=true_distances, y=out["distances"]).item() + + +def test_get_pbc_distances_cart(): + frac_coords = paddle.to_tensor( + data=[[0.2, 0.2, 0.0], [0.6, 0.8, 0.8], [0.2, 0.2, 0.0], [0.6, 0.8, 0.8]], + dtype="float32", + ) + edge_index = paddle.to_tensor(data=[[1, 0], [0, 0], [2, 3]], dtype="int64").T + lengths = paddle.to_tensor(data=[[1.0, 1.0, 2.0], [1.0, 2.0, 1.0]], dtype="float32") + angles = paddle.to_tensor(data=[[90.0, 90.0, 90.0], [90.0, 90.0, 90.0]], dtype="float32") + to_jimages = paddle.to_tensor(data=[[0, 0, 0], [0, 1, 0], [0, 1, 0]], dtype="int64") + num_nodes = paddle.to_tensor(data=[2, 2], dtype="int64") + num_edges = paddle.to_tensor(data=[2, 1], dtype="int64") + cart_coords = data_utils.frac_to_cart_coords(frac_coords, lengths, angles, num_nodes) + lattice = data_utils.lattice_params_to_matrix_paddle(lengths, angles) + out = data_utils.get_pbc_distances( + cart_coords, + edge_index, + lattice, + to_jimages, + num_nodes, + num_edges, + coord_is_cart=True, + ) + true_distances = paddle.to_tensor(data=[1.7549928774784245, 1.0, 1.2], dtype="float32") + assert paddle.allclose(x=true_distances, y=out["distances"]).item() + + +@pytest.mark.parametrize( + "max_radius,max_neighbors", + [(5.5964, 100), (5.6, 100), (100.0, 100), (7.0, 14), (7.0, 15)], +) +def test_pbc_graph_translation_invariant(max_radius: float, max_neighbors: int): + lengths = paddle.to_tensor(data=[4.0, 4.0, 4.0])[None, :] + angles = paddle.to_tensor(data=[90.0, 90.0, 90.0])[None, :] + frac_coords = paddle.to_tensor(data=[[0.2, 0.0, 0.0], [0.9927, 0.5, 0.5]]) + num_atoms = paddle.to_tensor(data=[2]) + cart_coords = data_utils.frac_to_cart_coords(frac_coords, lengths, angles, num_atoms) + translation = paddle.to_tensor(data=[[0.05, 0.1, -0.04]]) + cart_coords_translated = cart_coords + translation + frac_coords_translated = data_utils.cart_to_frac_coords( + cart_coords_translated, lengths, angles, num_atoms + ) + cart_coords_translated = data_utils.frac_to_cart_coords( + frac_coords_translated, lengths, angles, num_atoms + ) + lattice = data_utils.lattice_params_to_matrix_paddle(lengths=lengths, angles=angles) + coords = {"original": cart_coords, "translated": cart_coords_translated} + output: Dict[str, Dict[str, Dict[int, paddle.Tensor]]] = { + coord: { + output_type: { + max_cells: {c: paddle.to_tensor(data=[0]) for c in coords.keys()} + for max_cells in [1, 2] + } + for output_type in ["edge_index", "to_jimages", "num_bonds"] + } + for coord in coords.keys() + } + for coord in coords.keys(): + for max_cells in [2, 3]: + ( + output[coord]["edge_index"][max_cells], + output[coord]["to_jimages"][max_cells], + output[coord]["num_bonds"][max_cells], + ) = data_utils.radius_graph_pbc( + cart_coords=coords[coord], + lattice=lattice, + num_atoms=num_atoms, + radius=max_radius, + max_num_neighbors_threshold=max_neighbors, + max_cell_images_per_dim=max_cells, + ) + for max_cell in [2, 3]: + counter1 = Counter( + [tuple(x) for x in output["original"]["edge_index"][max_cell].t().tolist()] + ) + counter2 = Counter( + [tuple(x) for x in output["translated"]["edge_index"][max_cell].t().tolist()] + ) + assert counter1 == counter2 + assert paddle.equal_all( + x=output["original"]["num_bonds"][max_cell], + y=output["translated"]["num_bonds"][max_cell], + ).item() + + +def get_random_rotation( + n_random: int, n_atom: Optional[int] = None +) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + lattice = paddle.normal(mean=0, std=1, shape=(3, 3)) + if n_atom is None: + number_atoms = paddle.randint(low=1, high=17, shape=(1,)) + else: + number_atoms = paddle.to_tensor(data=[n_atom]) + frac_coord = paddle.rand(shape=(number_atoms[0], 3)) + structure = Structure( + species=["C" for _ in range(number_atoms[0])], + lattice=lattice.numpy(), + coords=frac_coord.numpy(), + ) + random_axes = np.random.choice([0, 1], size=(n_random, 3)) + for ii, axis in enumerate(random_axes): + if np.allclose(axis, [0, 0, 0]): + random_axes[ii] = [1, 0, 0] + random_angles = np.random.rand(n_random) * 90 + structures = [ + RotationTransformation(axis=axis, angle=angle).apply_transformation(structure) + for axis, angle in zip(random_axes, random_angles) + ] + lattices = paddle.to_tensor( + data=np.asarray([s.lattice._matrix for s in structures]), dtype="float32" + ) + frac_coords = ( + paddle.to_tensor(data=structure.frac_coords, dtype="float32") + .expand(shape=(n_random, number_atoms[0], 3)) + .flatten(stop_axis=1) + ) + num_atoms = paddle.to_tensor(data=[structure.frac_coords.shape[0]]).expand(shape=n_random) + return ( + data_utils.frac_to_cart_coords_with_lattice( + frac_coords=frac_coords, lattice=lattices, num_atoms=num_atoms + ), + lattices, + num_atoms, + ) + + +def get_random_translation(n_random: int, n_atom: Optional[int] = None): + lattice = paddle.normal(mean=0, std=0.5, shape=(3, 3)) + lattice[paddle.eye(num_rows=3).astype(dtype="uint8")] = paddle.normal(mean=0, std=1, shape=(3,)) + if n_atom is None: + number_atoms = paddle.randint(low=1, high=17, shape=(1,)) + else: + number_atoms = paddle.to_tensor(data=[n_atom]) + frac_coord = paddle.rand(shape=(number_atoms[0], 3)) + natoms = paddle.to_tensor(data=[tuple(frac_coord.shape)[0]]).expand(shape=n_random) + multiple_lattices = lattice.expand(shape=[n_random, 3, 3]) + translation = paddle.rand(shape=(n_random, 1, 3)).expand( + shape=(n_random, tuple(frac_coord.shape)[0], 3) + ) + new_frac_coord = ( + frac_coord.expand(shape=(n_random, tuple(frac_coord.shape)[0], 3)) + translation + ) + new_frac_coord = new_frac_coord % 1 + new_frac_coord = new_frac_coord.flatten(stop_axis=1) + new_cart_coord = data_utils.frac_to_cart_coords_with_lattice( + frac_coords=new_frac_coord, lattice=multiple_lattices, num_atoms=natoms + ) + return new_cart_coord, multiple_lattices, natoms + + +def check_invariance( + max_radius: float, + max_cell_images_per_dim: int, + cart: paddle.Tensor, + lattice: paddle.Tensor, + num_atoms: paddle.Tensor, +): + max_neighbors = 100 + edges, _, num_bonds = data_utils.radius_graph_pbc( + cart_coords=cart, + lattice=lattice, + num_atoms=num_atoms, + radius=max_radius, + max_num_neighbors_threshold=max_neighbors, + max_cell_images_per_dim=max_cell_images_per_dim, + ) + edges = edges.numpy() + start_from = np.asarray(np.hstack((np.zeros(1), np.cumsum(num_bonds))), dtype=int) + counters = [] + for ii in range(len(start_from) - 1): + bond_subset = edges.T[start_from[ii] : start_from[ii + 1]] + offset = num_atoms[0] * ii + bond_subset -= offset.numpy() + counters.append(Counter([tuple(x) for x in bond_subset])) + count_counters = Counter([f"{c}" for c in counters]) + assert len(set([len(c) for c in counters])) == 1, set([len(c) for c in counters]) + assert len(count_counters) == 1, count_counters + + +@pytest.mark.parametrize( + "max_radius, max_cell_images", + [(3.0, 1), (7.0, 1), (3.0, 2), (7.0, 2), (3.0, 3), (7.0, 3)], +) +def test_rotation_invariance(max_radius: float, max_cell_images: int): + cart, lattice, num_atoms = get_random_rotation(n_random=10) + check_invariance( + max_radius=max_radius, + max_cell_images_per_dim=max_cell_images, + cart=cart, + lattice=lattice, + num_atoms=num_atoms, + ) + + +@pytest.mark.parametrize("max_radius, max_cell_images", [(3.0, 10), (7.0, 20)]) +def test_translation_invariance(max_radius: float, max_cell_images: int): + cart, lattice, num_atoms = get_random_translation(n_random=10) + check_invariance( + max_radius=max_radius, + max_cell_images_per_dim=max_cell_images, + cart=cart, + lattice=lattice, + num_atoms=num_atoms, + ) + + +def get_distances_pymatgen(structure: Structure, rcut: float) -> np.ndarray: + neigh = structure.get_all_neighbors(r=rcut, include_image=True) + dist = sorted( + np.asarray([n.nn_distance for _atom in neigh for n in _atom if n.nn_distance > 1e-12]) + ) + return np.asarray(dist) + + +def get_distance_pytorch(structure: Structure, rcut: float) -> np.ndarray: + cart_coords = paddle.to_tensor(data=structure.cart_coords, dtype="float32") + lattice = paddle.to_tensor(data=[structure.lattice._matrix], dtype="float32") + num_atoms = paddle.to_tensor(data=[tuple(cart_coords.shape)[0]], dtype="int32") + edges, images, num_bonds = data_utils.radius_graph_pbc( + cart_coords=cart_coords, + lattice=lattice, + num_atoms=num_atoms, + radius=rcut, + max_num_neighbors_threshold=100000, + max_cell_images_per_dim=100, + ) + distances = data_utils.get_pbc_distances( + coords=cart_coords, + edge_index=edges, + lattice=lattice, + to_jimages=images, + num_atoms=num_atoms, + num_bonds=num_bonds, + coord_is_cart=True, + ) + return np.asarray(sorted(distances["distances"].numpy())) + + +def get_distances_numpy(structure: Structure, rcut: float, dtype) -> np.ndarray: + frac_coord = np.asarray(structure.frac_coords, dtype=dtype) + lattice = np.asarray(structure.lattice._matrix, dtype=dtype) + natm = tuple(frac_coord.shape)[0] + cart_coord_0_0_0 = np.asarray(np.einsum("ni, ix->nx", frac_coord, lattice), dtype=dtype) + max_cell = 100 + images = np.asarray( + list( + product( + range(-max_cell, max_cell + 1), + range(-max_cell, max_cell + 1), + range(-max_cell, max_cell + 1), + ) + ), + dtype=dtype, + ) + nimages = tuple(images.shape)[0] + images = np.tile(np.expand_dims(images, 1), (1, natm, 1)) + periodic_frac_coord = np.tile(frac_coord, (nimages, 1, 1)) + images + periodic_frac_coord = np.tile(np.expand_dims(periodic_frac_coord, 0), (natm, 1, 1, 1)) + assert periodic_frac_coord.dtype == dtype + cart_coords_tiled = np.tile(np.expand_dims(cart_coord_0_0_0, (1, 2)), (1, nimages, natm, 1)) + periodic_cart_coord = np.einsum("nimk,kx->nimx", periodic_frac_coord, lattice) + assert periodic_cart_coord.dtype == dtype + all_distances = np.linalg.norm(cart_coords_tiled - periodic_cart_coord, axis=-1) + all_distances = all_distances.flatten() + all_distances = all_distances[ + np.where(np.logical_and(all_distances <= rcut, all_distances > 1e-12))[0] + ] + assert all_distances.dtype == dtype + return np.asarray(sorted(all_distances)) + + +@pytest.mark.parametrize( + "natom, rcut", [(1, 1.0), (2, 1.0), (3, 1.0), (1, 2.0), (2, 2.0), (3, 2.0)] +) +def test_rdf(natom: int, rcut: float): + structure = Structure( + species=["C" for _ in range(natom)], + coords=np.random.uniform(size=(natom, 3)), + lattice=np.random.normal(size=(3, 3)), + ) + assert np.allclose( + get_distances_numpy(structure=structure, rcut=rcut, dtype=np.float32), + get_distance_pytorch(structure=structure, rcut=rcut), + ) + + +def test_polar_decomposition(): + batch = get_mp_20_debug_batch() + lattices = data_utils.lattice_params_to_matrix_paddle(batch.lengths, batch.angles) + polar_decomposition = data_utils.compute_lattice_polar_decomposition(lattices) + symm_lengths, symm_angles = data_utils.lattice_matrix_to_params_paddle(polar_decomposition) + assert paddle.allclose(x=symm_lengths, y=batch.lengths, atol=0.001).item() + assert paddle.allclose(x=symm_angles, y=batch.angles, atol=0.001).item() + assert paddle.allclose( + x=paddle.linalg.det(polar_decomposition).abs(), + y=paddle.linalg.det(lattices).abs(), + atol=0.001, + ).item() + + +def test_paddle_nanstd(): + x = paddle.to_tensor(data=[1.0, 2.0, np.nan, 3.0, 4.0, 5.0, np.nan, 6.0]) + assert data_utils.paddle_nanstd(x=x, dim=0, unbiased=False).item() == np.nanstd(x.numpy()) diff --git a/jointContribution/mattergen/mattergen/common/tests/gemnet_test.py b/jointContribution/mattergen/mattergen/common/tests/gemnet_test.py new file mode 100644 index 00000000..beca0d1c --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/tests/gemnet_test.py @@ -0,0 +1,380 @@ +import sys + + +from copy import deepcopy +from itertools import chain, permutations +from typing import List, Tuple + +import paddle +from mattergen.common.gemnet.gemnet import GemNetT +from mattergen.common.gemnet.layers.embedding_block import AtomEmbedding +from mattergen.common.tests.testutils import get_mp_20_debug_batch +from mattergen.common.utils.data_utils import ( + cart_to_frac_coords_with_lattice, frac_to_cart_coords_with_lattice, + lattice_matrix_to_params_paddle, lattice_params_to_matrix_paddle) +from mattergen.common.utils.eval_utils import make_structure +from mattergen.common.utils.globals import MODELS_PROJECT_ROOT +from paddle_utils import * +from pymatgen.core.structure import Structure +from scipy.spatial.transform import Rotation +from paddle_geometric.data import Batch, Data + + +def get_model(**kwargs) -> GemNetT: + return GemNetT( + atom_embedding=AtomEmbedding(emb_size=4), + num_targets=1, + latent_dim=4, + num_radial=4, + num_blocks=1, + emb_size_atom=4, + emb_size_edge=4, + emb_size_trip=4, + emb_size_bil_trip=4, + otf_graph=True, + scale_file=f"{MODELS_PROJECT_ROOT}/common/gemnet/gemnet-dT.json", + **kwargs, + ) + + +def structures_list_to_batch(structures: List[Structure]) -> Batch: + return Batch.from_data_list( + [ + Data( + angles=paddle.to_tensor(data=s.lattice.angles, dtype="float32")[None], + lengths=paddle.to_tensor(data=s.lattice.lengths, dtype="float32")[None], + frac_coords=paddle.to_tensor(data=s.frac_coords).astype( + dtype="float32" + ), + atom_types=paddle.to_tensor(data=s.atomic_numbers), + num_atoms=s.num_sites, + num_nodes=s.num_sites, + ) + for s in structures + ] + ) + + +def reformat_batch( + batch: Batch, +) -> Tuple[ + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, + paddle.Tensor, +]: + return ( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + batch.lengths, + batch.angles, + ) + + +def get_cubic_data(supercell: Tuple[int, int, int]) -> Tuple[Tuple, Tuple]: + normal_structures = [ + Structure( + lattice=[[2, 0, 0], [0, 3.1, 0], [0, 0, 2.9]], + coords=[[0, 0, 0]], + species="C", + ), + Structure( + lattice=[[3.1, 0, 0], [0, 2, 0], [0, 0, 4]], + coords=[[0, 0, 0], [0.5, 0.5, 0.5]], + species=["C", "C"], + ), + ] + normal_structures = list( + chain.from_iterable([deepcopy(normal_structures) for _ in range(32)]) + ) + supercell_structures = deepcopy(normal_structures) + for s in supercell_structures: + s.make_supercell(supercell) + normal_batch = structures_list_to_batch(structures=normal_structures) + supercell_batch = structures_list_to_batch(structures=supercell_structures) + return reformat_batch(batch=normal_batch), reformat_batch(batch=supercell_batch) + + +def test_lattice_score_scale_invariance(): + cutoff = 5.0 + max_neighbors = 1000 + paddle.seed(seed=495606849) + model = get_model( + max_neighbors=max_neighbors, + cutoff=cutoff, + regress_stress=True, + max_cell_images_per_dim=20, + ) + model.eval() + batch = get_mp_20_debug_batch() + batch = Batch.from_data_list(batch.to_data_list()[:10]) + supercell_structures = [ + make_structure( + d.lengths.squeeze(0), d.angles.squeeze(0), d.atom_types, d.frac_coords + ) + for d in batch.to_data_list() + ] + for s in supercell_structures: + s.make_supercell((2, 2, 2)) + supercell_batch = Batch.from_data_list( + [ + Data( + angles=paddle.to_tensor(data=s.lattice.angles, dtype="float32")[None], + lengths=paddle.to_tensor(data=s.lattice.lengths, dtype="float32")[None], + frac_coords=paddle.to_tensor(data=s.frac_coords).astype( + dtype="float32" + ), + atom_types=paddle.to_tensor(data=s.atomic_numbers), + num_atoms=s.num_sites, + num_nodes=s.num_sites, + ) + for s in supercell_structures + ] + ) + with paddle.no_grad(): + out_normal_cells = model.forward( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + batch.lengths, + batch.angles, + ) + out_supercells = model.forward( + None, + supercell_batch.frac_coords, + supercell_batch.atom_types, + supercell_batch.num_atoms, + supercell_batch.batch, + supercell_batch.lengths, + supercell_batch.angles, + ) + assert out_normal_cells.stress is not None + assert out_supercells.stress is not None + all_close = paddle.allclose( + x=out_normal_cells.stress, y=out_supercells.stress, atol=1e-05 + ).item() + assert all_close, (out_normal_cells.stress - out_supercells.stress).abs().max() + + +def test_nonconservative_lattice_score_translation_invariance(): + model = get_model( + max_neighbors=200, cutoff=5.0, regress_stress=True, max_cell_images_per_dim=10 + ) + model.eval() + batch = get_mp_20_debug_batch() + structures = [ + make_structure( + d.lengths.squeeze(0), d.angles.squeeze(0), d.atom_types, d.frac_coords + ) + for d in batch.to_data_list() + ] + translated_batch = Batch.from_data_list( + [ + Data( + angles=paddle.to_tensor(data=s.lattice.angles, dtype="float32")[None], + lengths=paddle.to_tensor(data=s.lattice.lengths, dtype="float32")[None], + frac_coords=( + paddle.to_tensor(data=s.frac_coords).astype(dtype="float32") + + paddle.rand(shape=[1, 3]) + ) + % 1.0, + atom_types=paddle.to_tensor(data=s.atomic_numbers), + num_atoms=s.num_sites, + num_nodes=s.num_sites, + ) + for s in structures + ] + ) + with paddle.no_grad(): + out_normal_cells = model.forward( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + batch.lengths, + batch.angles, + ) + out_translated = model.forward( + None, + translated_batch.frac_coords, + translated_batch.atom_types, + translated_batch.num_atoms, + translated_batch.batch, + translated_batch.lengths, + translated_batch.angles, + ) + assert paddle.allclose( + atol=0.0001, rtol=0.0001, x=out_normal_cells.stress, y=out_translated.stress + ).item(), "" + + +def test_lattice_parameterization_invariance(): + """ + Tests whether our model's predicted score behaves as expected when choosing a different unit cell. + """ + cutoff = 5.0 + max_neighbors = 200 + paddle.seed(seed=2) + model = get_model( + max_neighbors=max_neighbors, + cutoff=cutoff, + regress_stress=True, + max_cell_images_per_dim=30, + ) + model.eval() + batch = get_mp_20_debug_batch() + structures = [ + make_structure( + d.lengths.squeeze(0), d.angles.squeeze(0), d.atom_types, d.frac_coords + ) + for d in batch.to_data_list() + ] + lattice_matrices = lattice_params_to_matrix_paddle(batch.lengths, batch.angles) + lattice_matrix_changed = lattice_matrices.clone() + combs = paddle.to_tensor(data=list(permutations(range(3), 2))) + lattice_vector_combine_ixs = paddle.randint( + low=0, high=len(combs), shape=(tuple(lattice_matrices.shape)[0],) + ) + combs_sel = combs[lattice_vector_combine_ixs] + change_matrix = ( + paddle.eye(num_rows=3)[None].expand_as(y=lattice_matrices).clone().contiguous() + ) + change_matrix[ + range(tuple(combs_sel.shape)[0]), combs_sel[:, 0], combs_sel[:, 1] + ] = 3 + lattice_matrix_changed = ( + lattice_matrices.transpose(perm=dim2perm(lattice_matrices.ndim, 1, 2)) + @ change_matrix + ).transpose( + perm=dim2perm( + ( + lattice_matrices.transpose(perm=dim2perm(lattice_matrices.ndim, 1, 2)) + @ change_matrix + ).ndim, + 1, + 2, + ) + ) + new_frac_coords = cart_to_frac_coords_with_lattice( + frac_to_cart_coords_with_lattice( + batch.frac_coords, batch.num_atoms, lattice_matrices + ), + batch.num_atoms, + lattice_matrix_changed, + ) + updated_batch = batch.clone() + new_lengths, new_angles = lattice_matrix_to_params_paddle(lattice_matrix_changed) + updated_batch.frac_coords = new_frac_coords + updated_batch.lengths = new_lengths + updated_batch.angles = new_angles + structures_perm = [ + make_structure( + d.lengths.squeeze(0), d.angles.squeeze(0), d.atom_types, d.frac_coords + ) + for d in updated_batch.to_data_list() + ] + close = [ + paddle.allclose( + x=paddle.to_tensor(data=structures_perm[ix].distance_matrix), + y=paddle.to_tensor(data=structures[ix].distance_matrix), + atol=0.001, + ).item() + for ix in range(len(structures)) + ] + assert all(close) + with paddle.no_grad(): + out_normal_cells = model.forward( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + lattice=lattice_matrices, + ) + out_updated_batch = model.forward( + None, + updated_batch.frac_coords, + updated_batch.atom_types, + updated_batch.num_atoms, + updated_batch.batch, + lattice=lattice_matrix_changed, + ) + assert not paddle.allclose( + x=change_matrix.inverse() @ out_normal_cells.stress, + y=out_updated_batch.stress, + atol=0.001, + ).item() + assert not paddle.allclose( + x=out_normal_cells.stress, y=out_updated_batch.stress, atol=0.001 + ).item() + + +def test_symmetric_lattice_score(): + model = get_model( + max_neighbors=20, cutoff=7.0, regress_stress=True, max_cell_images_per_dim=20 + ) + model.eval() + batch = get_mp_20_debug_batch() + with paddle.no_grad(): + model_out = model.forward( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + batch.lengths, + batch.angles, + ) + assert model_out.stress is not None + assert paddle.allclose( + x=model_out.stress, y=model_out.stress.transpose(1, 2), atol=1e-05 + ).item() + + +def test_rotation_invariance(): + model = get_model( + max_neighbors=1000, cutoff=5.0, regress_stress=True, max_cell_images_per_dim=10 + ) + batch = get_mp_20_debug_batch() + lattices = lattice_params_to_matrix_paddle(batch.lengths, batch.angles) + with paddle.no_grad(): + model_out = model.forward( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + lattice=lattices, + ) + rotation_matrix = paddle.to_tensor( + data=Rotation.random().as_matrix(), dtype="float32" + ) + rotated_lattices = lattices @ rotation_matrix + with paddle.no_grad(): + model_out_rotated = model.forward( + None, + batch.frac_coords, + batch.atom_types, + batch.num_atoms, + batch.batch, + lattice=rotated_lattices, + ) + forces = model_out.forces + forces_rotated = model_out_rotated.forces + stress = model_out.stress + stress_rotated = model_out_rotated.stress + assert paddle.allclose( + x=forces @ rotation_matrix, y=forces_rotated, atol=0.001 + ).item() + assert paddle.allclose( + x=rotation_matrix.T @ stress @ rotation_matrix, y=stress_rotated, atol=0.001 + ).item() diff --git a/jointContribution/mattergen/mattergen/common/tests/mp_20_debug_batch.pt b/jointContribution/mattergen/mattergen/common/tests/mp_20_debug_batch.pt new file mode 100644 index 00000000..4acce414 Binary files /dev/null and b/jointContribution/mattergen/mattergen/common/tests/mp_20_debug_batch.pt differ diff --git a/jointContribution/mattergen/mattergen/common/tests/test_data.csv b/jointContribution/mattergen/mattergen/common/tests/test_data.csv new file mode 100644 index 00000000..aa278406 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/tests/test_data.csv @@ -0,0 +1,70 @@ +,material_id,formation_energy_per_atom,band_gap,pretty_formula,e_above_hull,elements,cif,spacegroup.number +17930,mp-7735,-0.3918942976923078,0.0,Pr5(CoB3)2,0.0003353181538461,"['B', 'Co', 'Pr']","# generated using pymatgen +data_Pr5(CoB3)2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 8.91944954 +_cell_length_b 8.91944954 +_cell_length_c 8.91945019 +_cell_angle_alpha 35.85189404 +_cell_angle_beta 35.85189404 +_cell_angle_gamma 35.85188987 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural Pr5(CoB3)2 +_chemical_formula_sum 'Pr5 Co2 B6' +_cell_volume 217.66333364 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Pr Pr0 1 0.58275600 0.58275600 0.58275600 1 + Pr Pr1 1 0.41724400 0.41724400 0.41724400 1 + Pr Pr2 1 0.74938700 0.74938700 0.74938700 1 + Pr Pr3 1 0.25061300 0.25061300 0.25061300 1 + Pr Pr4 1 0.00000000 0.00000000 0.00000000 1 + Co Co5 1 0.87613200 0.87613200 0.87613200 1 + Co Co6 1 0.12386800 0.12386800 0.12386800 1 + B B7 1 0.50000000 0.83293800 0.16706200 1 + B B8 1 0.16706200 0.50000000 0.83293800 1 + B B9 1 0.83293800 0.16706200 0.50000000 1 + B B10 1 0.50000000 0.16706200 0.83293800 1 + B B11 1 0.83293800 0.50000000 0.16706200 1 + B B12 1 0.16706200 0.83293800 0.50000000 1 +",166 +7285,mp-24719,-0.1247756075000001,0.0,NiH,0.0,"['Ni', 'H']","# generated using pymatgen +data_NiH +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 2.62493169 +_cell_length_b 2.62493169 +_cell_length_c 2.62493169 +_cell_angle_alpha 60.00000000 +_cell_angle_beta 60.00000000 +_cell_angle_gamma 60.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural NiH +_chemical_formula_sum 'Ni1 H1' +_cell_volume 12.78907168 +_cell_formula_units_Z 1 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Ni Ni0 1 0.00000000 0.00000000 0.00000000 1 + H H1 1 0.50000000 0.50000000 0.50000000 1 +",225 diff --git a/jointContribution/mattergen/mattergen/common/tests/testutils.py b/jointContribution/mattergen/mattergen/common/tests/testutils.py new file mode 100644 index 00000000..1ab46730 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/tests/testutils.py @@ -0,0 +1,9 @@ +from pathlib import Path + +import paddle + +from paddle_geometric.data import Batch + + +def get_mp_20_debug_batch() -> Batch: + return paddle.load(path=str(Path(__file__).resolve().parent / "mp_20_debug_batch.pt")) diff --git a/jointContribution/mattergen/mattergen/common/utils/__init__.py b/jointContribution/mattergen/mattergen/common/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/common/utils/config_utils.py b/jointContribution/mattergen/mattergen/common/utils/config_utils.py new file mode 100644 index 00000000..b21802d8 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/config_utils.py @@ -0,0 +1,44 @@ +import argparse +import sys +from typing import Callable +from typing import TypeVar +from typing import cast + +from omegaconf import OmegaConf + +R = TypeVar("R") + + +def get_config(argv: (list[str] | None), config_cls: Callable[..., R]) -> R: + """ + Utility function to get OmegaConf config options. + + Args: + argv: Either a list of command line arguments to parse, or None. + If None, this argument is set from sys.argv. + config_cls: Dataclass object specifying config structure + (i.e. which fields to expect in the config). + It should be the class itself, NOT an instance of the class. + + Returns: + Config object, which will pass as an instance of `config_cls` among other things. + Note: the type for this could be specified more carefully, but OmegaConf's typing + system is a bit complex. See OmegaConf's docs for "structured" for more info. + """ + if argv is None: + argv = sys.argv[1:] + parser = argparse.ArgumentParser(allow_abbrev=False) + parser.add_argument( + "--config", + type=str, + action="append", + default=list(), + help="Path to a yaml config file. Argument can be repeated multiple times, with later configs overwriting previous ones.", + ) + args, config_changes = parser.parse_known_args(argv) + conf_yamls = [OmegaConf.load(c) for c in args.config] + conf_cli = OmegaConf.from_cli(config_changes) + schema = OmegaConf.structured(config_cls) + config = OmegaConf.merge(schema, *conf_yamls, conf_cli) + OmegaConf.set_readonly(config, True) + return cast(R, config) diff --git a/jointContribution/mattergen/mattergen/common/utils/data_classes.py b/jointContribution/mattergen/mattergen/common/utils/data_classes.py new file mode 100644 index 00000000..02f25ecb --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/data_classes.py @@ -0,0 +1,122 @@ +import fnmatch +import os +from dataclasses import asdict +from dataclasses import dataclass +from dataclasses import field +from functools import cached_property +from pathlib import Path +from typing import Any +from typing import Literal + +import numpy as np +from hydra import compose +from hydra import initialize_config_dir +from omegaconf import DictConfig + + +### checked +def find_local_files(local_path: str, glob: str = "*", relative: bool = False) -> list[str]: # noqa + """ + Find files in the given directory or blob storage path, and return the list of files + matching the given glob pattern. If relative is True, the returned paths are + relative to the given directory or blob storage path. + + Args: + blob_or_local_path: path to the directory or blob storage path + glob: glob pattern to match. By default, all files are returned. + relative: whether to return relative paths. By default, absolute paths are + returned. + + Returns: + list of paths to files matching the given glob pattern. + """ + local_files = [x for x in Path(local_path).rglob("*") if os.path.isfile(x)] + files_list = [(str(x.relative_to(local_path)) if relative else str(x)) for x in local_files] # noqa + return fnmatch.filter(files_list, glob) + + +### checked +@dataclass(frozen=True) +class MatterGenCheckpointInfo: + model_path: str + load_epoch: int | Literal["best", "latest"] | None = "latest" + config_overrides: list[str] = field(default_factory=list) + split: str = "val" + strict_checkpoint_loading: bool = True + + def as_dict(self) -> dict[str, Any]: + d = asdict(self) + d["model_path"] = str(self.model_path) + return d + + @classmethod + def from_dict(cls, d) -> "MatterGenCheckpointInfo": + d = d.copy() + d["model_path"] = Path(d["model_path"]) + if "load_data" in d: + del d["load_data"] + return cls(**d) + + @property + def config(self) -> DictConfig: + with initialize_config_dir(str(self.model_path)): + cfg = compose(config_name="config", overrides=self.config_overrides) + return cfg + + @cached_property + def checkpoint_path(self) -> str: + """ + Search for checkpoint files in the given directory, and return the path + to the checkpoint with the given epoch number or the best checkpoint if load_epoch is "best". + "Best" is selected via the lowest validation loss, which is stored in the checkpoint filename. + Assumes that the checkpoint filenames are of the form "epoch=1-val_loss=0.1234.ckpt" or 'last.ckpt'. + + Returns: + Path to the checkpoint file to load. + """ + model_path = str(self.model_path) + ckpts = find_local_files(local_path=model_path, glob="*.pdparams") + assert len(ckpts) > 0, f"No checkpoints found at {model_path}" + if self.load_epoch == "latest": + assert any( + [x.endswith("latest.pdparams") for x in ckpts] + ), "No latest.pdparams found in checkpoints." + return [x for x in ckpts if x.endswith("latest.pdparams")][0] + if self.load_epoch == "best": + assert any( + [x.endswith("best.pdparams") for x in ckpts] + ), "No best.pdparams found in checkpoints." + return [x for x in ckpts if x.endswith("best.pdparams")][0] + ckpts = [ + x + for x in ckpts + if not x.endswith("latest.pdparams") and not x.endswith("best.pdparams") + ] + ckpt_paths = [Path(x) for x in ckpts] + ckpt_epochs = np.array( + [ + int(ckpt.parts[-1].split(".pdparams")[0].split("-")[0].split("=")[1]) + for ckpt in ckpt_paths + ] + ) + ckpt_val_losses = np.array( + [ + ( + float(ckpt.parts[-1].replace(".pdparams", "").split("-")[1].split("=")[1]) + if "loss_val" in ckpt.parts[-1] + else 99999999.9 + ) + for ckpt in ckpt_paths + ] + ) + if self.load_epoch == "best": + ckpt_ix = ckpt_val_losses.argmin() + elif isinstance(self.load_epoch, int): + assert ( + self.load_epoch in ckpt_epochs + ), f"Epoch {self.load_epoch} not found in checkpoints." + ckpt_ix = (ckpt_epochs == self.load_epoch).nonzero()[0][0].item() + else: + raise ValueError(f"Unrecognized load_epoch {self.load_epoch}") + ckpt = ckpts[ckpt_ix] + return ckpt diff --git a/jointContribution/mattergen/mattergen/common/utils/data_utils.py b/jointContribution/mattergen/mattergen/common/utils/data_utils.py new file mode 100644 index 00000000..a1999147 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/data_utils.py @@ -0,0 +1,375 @@ +from functools import lru_cache + +import numpy as np +import paddle +from pymatgen.core import Element + +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.utils.ocp_graph_utils import radius_graph_pbc as rgp +from paddle_utils import * # noqa +from paddle_utils import dim2perm + +EPSILON = 1e-05 +radius_graph_pbc_ocp = rgp + + +@lru_cache +def get_atomic_number(symbol: str) -> int: + return Element(symbol).Z + + +@lru_cache +def get_element_symbol(Z: int) -> str: + return str(Element.from_Z(Z=Z)) + + +def abs_cap(val: float, max_abs_val: float = 1.0) -> float: + """ + Returns the value with its absolute value capped at max_abs_val. + Particularly useful in passing values to trigonometric functions where + numerical errors may result in an argument > 1 being passed in. + https://github.com/materialsproject/pymatgen/blob/b789d74639aa851d7e5ee427a765d9fd5 + a8d1079/pymatgen/util/num.py#L15 # noqa + Args: + val (float): Input value. + max_abs_val (float): The maximum absolute value for val. Defaults to 1. + Returns: + val if abs(val) < 1 else sign of val * max_abs_val. + """ + return max(min(val, max_abs_val), -max_abs_val) + + +def lattice_params_to_matrix( + a: float, b: float, c: float, alpha: float, beta: float, gamma: float +) -> np.ndarray: + """Converts lattice from abc, angles to matrix. + https://github.com/materialsproject/pymatgen/blob/b789d74639aa851d7e5ee427a765d9fd5 + a8d1079/pymatgen/core/lattice.py#L311 # noqa + """ + angles_r = np.radians([alpha, beta, gamma]) + cos_alpha, cos_beta, cos_gamma = np.cos(angles_r) + sin_alpha, sin_beta, sin_gamma = np.sin(angles_r) + val = (cos_alpha * cos_beta - cos_gamma) / (sin_alpha * sin_beta) + val = abs_cap(val) + gamma_star = np.arccos(val) + vector_a = [a * sin_beta, 0.0, a * cos_beta] + vector_b = [ + -b * sin_alpha * np.cos(gamma_star), + b * sin_alpha * np.sin(gamma_star), + b * cos_alpha, + ] + vector_c = [0.0, 0.0, float(c)] + return np.array([vector_a, vector_b, vector_c]) + + +def lattice_params_to_matrix_paddle( + lengths: paddle.Tensor, angles: paddle.Tensor, eps: float = 0.0 +) -> paddle.Tensor: + """Batched paddle version to compute lattice matrix from params. + + lengths: paddle.Tensor of shape (N, 3), unit A + angles: paddle.Tensor of shape (N, 3), unit degree + """ + coses = paddle.clip(x=paddle.cos(x=paddle.deg2rad(x=angles)), min=-1.0, max=1.0) + sins = (1 - coses**2).sqrt() + val = (coses[:, 0] * coses[:, 1] - coses[:, 2]) / (sins[:, 0] * sins[:, 1]) + val = paddle.clip(x=val, min=-1.0 + eps, max=1.0 - eps) + vector_a = paddle.stack( + x=[ + lengths[:, 0] * sins[:, 1], + paddle.zeros(shape=lengths.shape[0]), + lengths[:, 0] * coses[:, 1], + ], + axis=1, + ) + vector_b = paddle.stack( + x=[ + -lengths[:, 1] * sins[:, 0] * val, + lengths[:, 1] * sins[:, 0] * (1 - val**2).sqrt(), + lengths[:, 1] * coses[:, 0], + ], + axis=1, + ) + vector_c = paddle.stack( + x=[ + paddle.zeros(shape=lengths.shape[0]), + paddle.zeros(shape=lengths.shape[0]), + lengths[:, 2], + ], + axis=1, + ) + return paddle.stack(x=[vector_a, vector_b, vector_c], axis=1) + + +def lattice_matrix_to_params_paddle( + matrix: paddle.Tensor, eps: float = 0.0 +) -> tuple[paddle.Tensor, paddle.Tensor]: + """Convert a batch of lattice matrices into their corresponding unit cell vector + lengths and angles. + + Args: + matrix (paddle.Tensor, [B, 3, 3]): The batch of lattice matrices. + + Returns: + tuple[paddle.Tensor], ([B, 3], [B, 3]): tuple whose first element is the + lengths of the unit cell vectors, and the second one gives the angles between + the vectors. + """ + assert len(tuple(matrix.shape)) == 3 + lengths = matrix.norm(p=2, axis=-1) + ix_j = paddle.to_tensor(data=[1, 2, 0], dtype="int64", place=matrix.place) + ix_k = paddle.to_tensor(data=[2, 0, 1], dtype="int64", place=matrix.place) + cos_angles = paddle.nn.functional.cosine_similarity( + x1=matrix[:, ix_j], x2=matrix[:, ix_k], axis=-1 + ).clip(min=-1 + eps, max=1 - eps) + if len(tuple(matrix.shape)) == 2: + cos_angles = cos_angles.squeeze(axis=0) + lengths = lengths.squeeze(axis=0) + return lengths, paddle.acos(x=cos_angles) * 180.0 / np.pi + + +def lattice_matrix_to_params( + matrix: np.ndarray, +) -> tuple[float, float, float, float, float, float]: + lengths = np.sqrt(np.sum(matrix**2, axis=1)).tolist() + angles = np.zeros(3) + for i in range(3): + j = (i + 1) % 3 + k = (i + 2) % 3 + angles[i] = abs_cap(np.dot(matrix[j], matrix[k]) / (lengths[j] * lengths[k])) + angles = np.arccos(angles) * 180.0 / np.pi + a, b, c = lengths + alpha, beta, gamma = angles + return a, b, c, alpha, beta, gamma + + +def frac_to_cart_coords( + frac_coords: paddle.Tensor, + lengths: paddle.Tensor, + angles: paddle.Tensor, + num_atoms: paddle.Tensor, +) -> paddle.Tensor: + lattice = lattice_params_to_matrix_paddle(lengths, angles) + return frac_to_cart_coords_with_lattice(frac_coords, num_atoms, lattice) + + +def cart_to_frac_coords( + cart_coords: paddle.Tensor, + lengths: paddle.Tensor, + angles: paddle.Tensor, + num_atoms: paddle.Tensor, +) -> paddle.Tensor: + lattice = lattice_params_to_matrix_paddle(lengths, angles) + return cart_to_frac_coords_with_lattice(cart_coords, num_atoms, lattice) + + +def frac_to_cart_coords_with_lattice( + frac_coords: paddle.Tensor, num_atoms: paddle.Tensor, lattice: paddle.Tensor +) -> paddle.Tensor: + lattice_nodes = paddle.repeat_interleave(x=lattice, repeats=num_atoms, axis=0) + pos = paddle.einsum("bi,bij->bj", frac_coords, lattice_nodes) + return pos + + +def cart_to_frac_coords_with_lattice( + cart_coords: paddle.Tensor, num_atoms: paddle.Tensor, lattice: paddle.Tensor +) -> paddle.Tensor: + inv_lattice = paddle.linalg.pinv(x=lattice) + inv_lattice_nodes = paddle.repeat_interleave(x=inv_lattice, repeats=num_atoms, axis=0) # noqa + frac_coords = paddle.einsum("bi,bij->bj", cart_coords, inv_lattice_nodes) + return frac_coords % 1.0 + + +def get_pbc_distances( + coords: paddle.Tensor, + edge_index: paddle.Tensor, + lattice: paddle.Tensor, + to_jimages: paddle.Tensor, + num_atoms: paddle.Tensor, + num_bonds: paddle.Tensor, + coord_is_cart: bool = False, + return_offsets: bool = False, + return_distance_vec: bool = False, +) -> paddle.Tensor: + if coord_is_cart: + pos = coords + else: + lattice_nodes = paddle.repeat_interleave(x=lattice, repeats=num_atoms, axis=0) + pos = paddle.einsum("bi,bij->bj", coords, lattice_nodes) + j_index, i_index = edge_index + distance_vectors = pos[j_index] - pos[i_index] + lattice_edges = paddle.repeat_interleave(x=lattice, repeats=num_bonds, axis=0) + offsets = paddle.einsum("bi,bij->bj", to_jimages.astype(dtype="float32"), lattice_edges) # noqa + distance_vectors += offsets + distances = distance_vectors.norm(axis=-1) + out = {"edge_index": edge_index, "distances": distances} + if return_distance_vec: + out["distance_vec"] = distance_vectors + if return_offsets: + out["offsets"] = offsets + return out + + +def radius_graph_pbc( + cart_coords: paddle.Tensor, + lattice: paddle.Tensor, + num_atoms: paddle.Tensor, + radius: float, + max_num_neighbors_threshold: int, + max_cell_images_per_dim: int = 10, + topk_per_pair: (paddle.Tensor | None) = None, +) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """Computes pbc graph edges under pbc. + + topk_per_pair: (num_atom_pairs,), select topk edges per atom pair + + Note: topk should take into account self-self edge for (i, i) + + Keyword arguments + ----------------- + cart_cords.shape=[Ntotal, 3] -- concatenate all atoms over all crystals + lattice.shape=[Ncrystal, 3, 3] + num_atoms.shape=[Ncrystal] + max_cell_images_per_dim -- constrain the max. number of cell images per + dimension in event that infinitesimal angles between + lattice vectors are encountered. + + WARNING: It is possible (and has been observed) that for rare cases when periodic + atom images are on or close to the cut off radius boundary, doing these operations + in 32 bit floating point can lead to atoms being spuriously considered within or + outside of the cut off radius. This can lead to invariance of the neighbour list + under global translation of all atoms in the unit cell. For the rare cases where + this was observed, switching to 64 bit precision solved the issue. Since all graph + embeddings should taper messages from neighbours to zero at the cut off radius, + the effect of these errors in 32-bit should be negligible in practice. + """ + assert topk_per_pair is None, "non None values of topk_per_pair is not supported" + edge_index, unit_cell, num_neighbors_image, _, _ = radius_graph_pbc_ocp( + pos=cart_coords, + cell=lattice, + natoms=num_atoms, + pbc=paddle.to_tensor(data=[True, True, True], dtype="float32") + .to("bool") + .to(cart_coords.place), + radius=radius, + max_num_neighbors_threshold=max_num_neighbors_threshold, + max_cell_images_per_dim=max_cell_images_per_dim, + ) + return edge_index, unit_cell, num_neighbors_image + + +class StandardScalerPaddle(paddle.nn.Layer): + """Normalizes the targets of a dataset.""" + + def __init__( + self, + means: (paddle.Tensor | None) = None, + stds: (paddle.Tensor | None) = None, + stats_dim: tuple[int] = (1,), + ): + super().__init__() + self.register_buffer( + name="means", + tensor=paddle.atleast_1d(means) + if means is not None + else paddle.zeros(shape=stats_dim), # noqa + ) + self.register_buffer( + name="stds", + tensor=paddle.atleast_1d(stds) + if stds is not None + else paddle.ones(shape=stats_dim), # noqa + ) + + @property + def device(self) -> (paddle.CPUPlace, paddle.CUDAPlace, str): + return self.means.place + + def fit(self, X: paddle.Tensor): + means: paddle.Tensor = paddle.atleast_1d( + paddle.nanmean(x=X, axis=0).to(self.device) + ) # noqa + stds: paddle.Tensor = paddle.atleast_1d( + paddle_nanstd(X, dim=0, unbiased=False).to(self.device) + EPSILON + ) + assert tuple(means.shape) == tuple( + self.means.shape + ), f"Mean shape mismatch: {tuple(means.shape)} != {tuple(self.means.shape)}" + assert tuple(stds.shape) == tuple( + self.stds.shape + ), f"Std shape mismatch: {tuple(stds.shape)} != {tuple(self.stds.shape)}" + self.means = means + self.stds = stds + + def transform(self, X: paddle.Tensor) -> paddle.Tensor: + assert self.means is not None and self.stds is not None + return (X - self.means) / self.stds + + def inverse_transform(self, X: paddle.Tensor) -> paddle.Tensor: + assert self.means is not None and self.stds is not None + return X * self.stds + self.means + + def match_device(self, X: paddle.Tensor) -> paddle.Tensor: + assert self.means.size > 0 and self.stds.size > 0 + if self.means.place != X.place: + self.means = self.means.to(X.place) + self.stds = self.stds.to(X.place) + + def copy(self) -> "StandardScalerPaddle": + return StandardScalerPaddle( + means=self.means.clone().detach(), stds=self.stds.clone().detach() + ) + + def forward(self, X: paddle.Tensor) -> paddle.Tensor: + return self.transform(X) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(means: {self.means.tolist() if self.means is not None else None}, stds: {self.stds.tolist() if self.stds is not None else None})" # noqa + + +def paddle_nanstd(x: paddle.Tensor, dim: int, unbiased: bool) -> paddle.Tensor: + data_is_present = paddle.all( + x=paddle.reshape( + x=paddle.logical_not(x=paddle.isnan(x=x)), shape=(tuple(x.shape)[0], -1) + ), # noqa + axis=1, + ) + return paddle.std(x=x[data_is_present], axis=dim, unbiased=unbiased) + + +def compute_lattice_polar_decomposition(lattice_matrix: paddle.Tensor) -> paddle.Tensor: + # if lattice_matrix.device.type == "cuda": + # try: + # W, S, V_transp = paddle.linalg.svd(full_matrices=True, x=lattice_matrix) + # except: # torch._C._LinAlgError: todo: fix this + # W, S, V_transp = paddle.linalg.svd( + # full_matrices=True, x=lattice_matrix.to("cpu") + # ) + # W = W.to(lattice_matrix.device.type) + # S = S.to(lattice_matrix.device.type) + # V_transp = V_transp.to(lattice_matrix.device.type) + # else: + # W, S, V_transp = paddle.linalg.svd(full_matrices=True, x=lattice_matrix) + + W, S, V_transp = paddle.linalg.svd(full_matrices=True, x=lattice_matrix) + S_square = paddle.diag_embed(input=S) + V = V_transp.transpose(perm=dim2perm(V_transp.ndim, 1, 2)) + U = W @ V_transp + P = V @ S_square @ V_transp + P_prime = U @ P @ U.transpose(perm=dim2perm(U.ndim, 1, 2)) + symm_lattice_matrix = P_prime + return symm_lattice_matrix + + +def create_chem_graph_from_composition( + target_composition_dict: dict[str, float] +) -> ChemGraph: # noqa + atomic_numbers = [] + for element_name, number_of_atoms in target_composition_dict.items(): + atomic_numbers += [Element(element_name).Z] * int(number_of_atoms) + return ChemGraph( + atomic_numbers=paddle.to_tensor(data=atomic_numbers, dtype="int64"), + num_atoms=paddle.to_tensor(data=[len(atomic_numbers)], dtype="int64"), + cell=paddle.eye(num_rows=3, dtype="float32").reshape(1, 3, 3), + pos=paddle.zeros(shape=(len(atomic_numbers), 3), dtype="float32"), + ) diff --git a/jointContribution/mattergen/mattergen/common/utils/eval_utils.py b/jointContribution/mattergen/mattergen/common/utils/eval_utils.py new file mode 100644 index 00000000..c05d8746 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/eval_utils.py @@ -0,0 +1,134 @@ +import logging +import os +from pathlib import Path +from tempfile import TemporaryDirectory +from typing import Sequence +from zipfile import ZipFile + +import ase.io +import numpy as np +import paddle +from pymatgen.core import Lattice +from pymatgen.core import Structure +from pymatgen.io.ase import AseAtomsAdaptor + +from mattergen.common.globals import GENERATED_CRYSTALS_EXTXYZ_FILE_NAME +from mattergen.common.globals import GENERATED_CRYSTALS_ZIP_FILE_NAME +from mattergen.common.utils.data_classes import MatterGenCheckpointInfo + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +def make_structure( + lengths: paddle.Tensor, + angles: paddle.Tensor, + atom_types: paddle.Tensor, + frac_coords: paddle.Tensor, +) -> Structure: + return Structure( + lattice=Lattice.from_parameters( + **{a: v for a, v in zip(["a", "b", "c"], lengths)}, + **{a: v for a, v in zip(["alpha", "beta", "gamma"], angles)}, + ), + species=atom_types, + coords=frac_coords, + coords_are_cartesian=False, + ) + + +DiffusionLightningModule = None + + +def load_model_diffusion(args: MatterGenCheckpointInfo) -> DiffusionLightningModule: + raise NotImplementedError() + + +def get_crystals_list( + frac_coords, atom_types, lengths, angles, num_atoms +) -> list[dict[str, np.ndarray]]: + """ + args: + frac_coords: (num_atoms, 3) + atom_types: (num_atoms) + lengths: (num_crystals) + angles: (num_crystals) + num_atoms: (num_crystals) + """ + assert frac_coords.shape[0] == atom_types.shape[0] == num_atoms.sum() + assert lengths.shape[0] == angles.shape[0] == num_atoms.shape[0] + start_idx = 0 + crystal_array_list = [] + for batch_idx, num_atom in enumerate(num_atoms.tolist()): + start_0 = frac_coords.shape[0] + start_idx if start_idx < 0 else start_idx + cur_frac_coords = paddle.slice(frac_coords, [0], [start_0], [start_0 + num_atom]) # noqa + start_1 = atom_types.shape[0] + start_idx if start_idx < 0 else start_idx + cur_atom_types = paddle.slice(atom_types, [0], [start_1], [start_1 + num_atom]) + cur_lengths = lengths[batch_idx] + cur_angles = angles[batch_idx] + crystal_array_list.append( + { + "frac_coords": cur_frac_coords.detach().cpu().numpy(), + "atom_types": cur_atom_types.detach().cpu().numpy(), + "lengths": cur_lengths.detach().cpu().numpy(), + "angles": cur_angles.detach().cpu().numpy(), + } + ) + start_idx = start_idx + num_atom + return crystal_array_list + + +def save_structures(output_path: Path, structures: Sequence[Structure]) -> None: + """Save structures to disk in a extxyz file and a compressed zip file containing + cif files. + + Args: + output_path: path to a directory where the results are written. + structures: sequence of structures. + """ + ase_atoms = [AseAtomsAdaptor.get_atoms(x) for x in structures] + try: + ase.io.write(output_path / GENERATED_CRYSTALS_EXTXYZ_FILE_NAME, ase_atoms) + with ZipFile(output_path / GENERATED_CRYSTALS_ZIP_FILE_NAME, "w") as zip_obj: + for ix, ase_atom in enumerate(ase_atoms): + ase.io.write(f"/tmp/gen_{ix}.cif", ase_atom, format="cif") + zip_obj.write(f"/tmp/gen_{ix}.cif") + except IOError as e: + print(f"Got error {e} writing the generated structures to disk.") + + +def load_structures(input_path: Path) -> Sequence[Structure]: + """Load structures from disk. + + Args: + output_path: path to a file or directory where the results are written. + + Returns: + sequence of structures. + """ + if input_path.suffix == ".xyz" or input_path.suffix == ".extxyz": + ase_atoms = ase.io.read(input_path, ":") + return [AseAtomsAdaptor.get_structure(x) for x in ase_atoms] + elif input_path.suffix == ".zip": + with TemporaryDirectory() as tmpdirname: + with ZipFile(input_path, "r") as zip_obj: + zip_obj.extractall(tmpdirname) + return extract_structures_from_folder(tmpdirname+'/tmp') + elif input_path.is_dir(): + return extract_structures_from_folder(input_path) + else: + raise ValueError(f"Invalid input path {input_path}") + + +def extract_structures_from_folder(dirname: str) -> Sequence[Structure]: + structures = [] + for filename in os.listdir(dirname): + if filename.endswith(".cif"): + try: + structures.append(Structure.from_file(f"{dirname}/{filename}")) + except ValueError as e: + logger.warning(f"Failed to read {filename} as a CIF file: {e}") + elif filename.endswith(".extxyz") or filename.endswith(".xyz"): + ase_atoms = ase.io.read(f"{dirname}/{filename}", 0) + structures.append(AseAtomsAdaptor.get_structure(ase_atoms)) + return structures diff --git a/jointContribution/mattergen/mattergen/common/utils/globals.py b/jointContribution/mattergen/mattergen/common/utils/globals.py new file mode 100644 index 00000000..c8e651fc --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/globals.py @@ -0,0 +1,124 @@ +"""Note that importing this module has two side effects: +1. It sets the environment variable `PROJECT_ROOT` to the root of the explorers project. +2. It registers a new resolver for OmegaConf, `eval`, which allows us to use `eval` in +our config files. +""" +import os +from pathlib import Path + +from omegaconf import OmegaConf + +MODELS_PROJECT_ROOT = Path(__file__).resolve().parents[2] +print(f"MODELS_PROJECT_ROOT: {MODELS_PROJECT_ROOT}") +os.environ["PROJECT_ROOT"] = str(MODELS_PROJECT_ROOT) +DEFAULT_SAMPLING_CONFIG_PATH = Path(__file__).resolve().parents[3] / "sampling_conf" +PROPERTY_SOURCE_IDS = [ + "dft_mag_density", + "dft_bulk_modulus", + "dft_shear_modulus", + "energy_above_hull", + "ehull", + "formation_energy_per_atom", + "space_group", + "hhi_score", + "ml_bulk_modulus", + "chemical_system", + "dft_band_gap", + "layergroup", +] +SELECTED_ATOMIC_NUMBERS = [ + 1, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 37, + 38, + 39, + 40, + 41, + 42, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 56, + 57, + 58, + 59, + 60, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, +] +MAX_ATOMIC_NUM = 100 + + +def try_eval(s): + """This is a custom resolver for OmegaConf that allows us to use `eval` in our + config files with the syntax `${eval:'${foo} + ${bar}'} + + See: + https://omegaconf.readthedocs.io/en/2.3_branch/how_to_guides.html#id1 + """ + try: + return eval(s) + except Exception as e: + print(f"Calling eval on string {s} raised exception {e}") + raise + + +OmegaConf.register_new_resolver("eval", try_eval) diff --git a/jointContribution/mattergen/mattergen/common/utils/lattice_score.py b/jointContribution/mattergen/mattergen/common/utils/lattice_score.py new file mode 100644 index 00000000..1ed23212 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/lattice_score.py @@ -0,0 +1,43 @@ +import paddle +from paddle_scatter import scatter_add + +from paddle_utils import * # noqa + + +def edge_score_to_lattice_score_frac_symmetric( + score_d: paddle.Tensor, + edge_index: paddle.Tensor, + edge_vectors: paddle.Tensor, + batch: paddle.Tensor, +) -> paddle.Tensor: + """Converts a score per edge into a score for the atom coordinates and/or the + lattice matrix via the chain rule. This method explicitly takes into account the + fact that the cartesian coordinates depend on the lattice via the fractional + coordinates. Moreover, we make sure to get a symmetric update: + D_cart_norm @ Phi @ D_cart_norm^T, where Phi is a |E| x |E| diagonal matrix with + the predicted edge scores + + Args: + score_d (paddle.Tensor, [num_edges,]): A score per edge in the graph. + edge_index (paddle.Tensor, [2, num_edges]): The edge indices in the graph. + edge_vectors (paddle.Tensor, [num_edges, 3]): The vectors connecting the source + of each edge to the target. + lattice_matrix (paddle.Tensor, [num_nodes, 3, 3]): The lattice matrices for + each crystal in num_nodes. + batch (paddle.Tensor, [num_nodes,]): The pointer indicating for each atom which + molecule in the batch it belongs to. + + Returns: + paddle.Tensor: The predicted lattice score. + """ + batch_edge = batch[edge_index[0]] + unit_edge_vectors_cart = edge_vectors / edge_vectors.norm(axis=-1, keepdim=True) + score_lattice = scatter_add( + score_d[:, None, None] + * (unit_edge_vectors_cart[:, :, None] @ unit_edge_vectors_cart[:, None, :]), + batch_edge, + dim=0, + dim_size=batch.max() + 1, + ) + score_lattice = score_lattice.transpose([0, -1, -2]) + return score_lattice diff --git a/jointContribution/mattergen/mattergen/common/utils/ocp_graph_utils.py b/jointContribution/mattergen/mattergen/common/utils/ocp_graph_utils.py new file mode 100644 index 00000000..76349a82 --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/ocp_graph_utils.py @@ -0,0 +1,303 @@ +import sys + +import numpy as np +import paddle + +import copy + +# Temporary use of alternative methods, no longer using paddle_stcatter +# https://github.com/PFCCLab/paddle_scatter/tree/main +# from paddle_scatter import segment_coo +# from paddle_scatter import segment_csr + +from paddle_utils import * # noqa +from paddle_utils import dim2perm + +""" +Code derived from the OCP codebase: +https://github.com/Open-Catalyst-Project/ocp + +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found in +https://github.com/Open-Catalyst-Project/ocp/blob/main/LICENSE.md. +""" + + +def get_pbc_distances( + pos: paddle.Tensor, + edge_index: paddle.Tensor, + cell: paddle.Tensor, + cell_offsets: paddle.Tensor, + neighbors: paddle.Tensor, + return_offsets: bool = False, + return_distance_vec: bool = False, +) -> dict: + row, col = edge_index + distance_vectors = pos[row] - pos[col] + neighbors = neighbors.to(cell.place) + cell = paddle.repeat_interleave(x=cell, repeats=neighbors, axis=0) + offsets = ( + cell_offsets.astype(dtype="float32") + .view(-1, 1, 3) + .bmm(y=cell.astype(dtype="float32")) + .view(-1, 3) + ) + distance_vectors += offsets + distances = distance_vectors.norm(axis=-1) + nonzero_idx = paddle.arange(end=len(distances))[distances > 0] + edge_index = edge_index[:, nonzero_idx] + distances = distances[nonzero_idx] + out = {"edge_index": edge_index, "distances": distances} + if return_distance_vec: + out["distance_vec"] = distance_vectors[nonzero_idx] + if return_offsets: + out["offsets"] = offsets[nonzero_idx] + return out + + +def radius_graph_pbc( + pos: paddle.Tensor, + pbc: paddle.Tensor | None, + natoms: paddle.Tensor, + cell: paddle.Tensor, + radius: float, + max_num_neighbors_threshold: int, + max_cell_images_per_dim: int = sys.maxsize, +) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """Function computing the graph in periodic boundary conditions on a (batched) set + of positions and cells. + + This function is copied from + https://github.com/Open-Catalyst-Project/ocp/blob/main/ocpmodels/common/utils.py, + commit 480eb9279ec4a5885981f1ee588c99dcb38838b5 + + Args: + pos (LongTensor): Atomic positions in cartesian coordinates + :obj:`[n, 3]` + pbc (BoolTensor): indicates periodic boundary conditions per structure. + :obj:`[n_structures, 3]` + natoms (IntTensor): number of atoms per structure. Has shape + :obj:`[n_structures]` + cell (Tensor): atomic cell. Has shape + :obj:`[n_structures, 3, 3]` + radius (float): cutoff radius distance + max_num_neighbors_threshold (int): Maximum number of neighbours to consider. + + Returns: + edge_index (IntTensor): index of atoms in edges. Has shape + :obj:`[n_edges, 2]` + cell_offsets (IntTensor): cell displacement w.r.t. their original position of + atoms in edges. Has shape + :obj:`[n_edges, 3, 3]` + num_neighbors_image (IntTensor): Number of neighbours per cell image. + :obj:`[n_structures]` + offsets (LongTensor): cartesian displacement w.r.t. their original position of + atoms in edges. Has shape + :obj:`[n_edges, 3, 3]` + atom_distance (LongTensor): edge length. Has shape + :obj:`[n_edges]` + """ + batch_size = len(natoms) + pbc_ = [False, False, False] + if pbc is not None: + pbc = paddle.atleast_2d(pbc) + for i in range(3): + if not paddle.any(x=pbc[:, i]).item(): + pbc_[i] = False + elif paddle.all(x=pbc[:, i]).item(): + pbc_[i] = True + else: + raise RuntimeError( + "Different structures in the batch have different PBC " + "configurations. This is not currently supported." + ) + natoms_squared = (natoms**2).astype(dtype="int64") + index_offset = paddle.cumsum(x=natoms, axis=0) - natoms + index_offset_expand = paddle.repeat_interleave(x=index_offset, repeats=natoms_squared) # noqa + natoms_expand = paddle.repeat_interleave(x=natoms, repeats=natoms_squared) + num_atom_pairs = paddle.sum(x=natoms_squared) + index_squared_offset = paddle.cumsum(x=natoms_squared, axis=0) - natoms_squared + index_squared_offset = paddle.repeat_interleave( + x=index_squared_offset, repeats=natoms_squared + ) # noqa + atom_count_squared = paddle.arange(end=num_atom_pairs) - index_squared_offset + + # index1_tmp = paddle.divide(x=atom_count_squared, y=paddle.to_tensor(natoms_expand)) + index1_tmp = paddle.divide(x=atom_count_squared, y=natoms_expand) + index1 = paddle.floor(index1_tmp).astype("int64") + index_offset_expand + index2 = atom_count_squared % natoms_expand + index_offset_expand + pos1 = paddle.index_select(x=pos, axis=0, index=index1) + pos2 = paddle.index_select(x=pos, axis=0, index=index2) + cross_a2a3 = paddle.cross(x=cell[:, 1], y=cell[:, 2], axis=-1) + cell_vol = paddle.sum(x=cell[:, 0] * cross_a2a3, axis=-1, keepdim=True) + if pbc_[0]: + inv_min_dist_a1 = paddle.linalg.norm(x=cross_a2a3 / cell_vol, p=2, axis=-1) + rep_a1 = paddle.ceil(x=radius * inv_min_dist_a1) + else: + rep_a1 = paddle.zeros(shape=[1], dtype=cell.dtype) + if pbc_[1]: + cross_a3a1 = paddle.cross(x=cell[:, 2], y=cell[:, 0], axis=-1) + inv_min_dist_a2 = paddle.linalg.norm(x=cross_a3a1 / cell_vol, p=2, axis=-1) + rep_a2 = paddle.ceil(x=radius * inv_min_dist_a2) + else: + rep_a2 = paddle.zeros(shape=[1], dtype=cell.dtype) + if pbc_[2]: + cross_a1a2 = paddle.cross(x=cell[:, 0], y=cell[:, 1], axis=-1) + inv_min_dist_a3 = paddle.linalg.norm(x=cross_a1a2 / cell_vol, p=2, axis=-1) + rep_a3 = paddle.ceil(x=radius * inv_min_dist_a3) + else: + rep_a3 = paddle.zeros(shape=[1], dtype=cell.dtype) + max_rep = [ + min(int(rep_a1.max()), max_cell_images_per_dim), + min(int(rep_a2.max()), max_cell_images_per_dim), + min(int(rep_a3.max()), max_cell_images_per_dim), + ] + cells_per_dim = [ + paddle.arange(start=-rep, end=rep + 1, dtype="float32") for rep in max_rep + ] # noqa + cell_offsets = paddle.cartesian_prod(x=cells_per_dim) + num_cells = len(cell_offsets) + cell_offsets_per_atom = cell_offsets.view(1, num_cells, 3).tile( + repeat_times=[len(index2), 1, 1] + ) + cell_offsets = paddle.transpose(x=cell_offsets, perm=dim2perm(cell_offsets.ndim, 0, 1)) # noqa + cell_offsets_batch = cell_offsets.view(1, 3, num_cells).expand( + shape=[batch_size, -1, -1] + ) # noqa + data_cell = paddle.transpose(x=cell, perm=dim2perm(cell.ndim, 1, 2)) + pbc_offsets = paddle.bmm(x=data_cell, y=cell_offsets_batch) + pbc_offsets_per_atom = paddle.repeat_interleave( + x=pbc_offsets, repeats=natoms_squared, axis=0 + ) # noqa + pos1 = pos1.view(-1, 3, 1).expand(shape=[-1, -1, num_cells]) + pos2 = pos2.view(-1, 3, 1).expand(shape=[-1, -1, num_cells]) + index1 = index1.view(-1, 1).tile(repeat_times=[1, num_cells]).view(-1) + index2 = index2.view(-1, 1).tile(repeat_times=[1, num_cells]).view(-1) + pos2 = pos2 + pbc_offsets_per_atom + atom_distance_squared = paddle.sum(x=(pos1 - pos2) ** 2, axis=1) + atom_distance_squared = atom_distance_squared.view(-1) + mask_within_radius = paddle.less_equal( + x=atom_distance_squared, y=paddle.to_tensor(radius * radius) + ) + mask_not_same = paddle.greater_than(x=atom_distance_squared, y=paddle.to_tensor(0.0001)) # noqa + mask = paddle.logical_and(x=mask_within_radius, y=mask_not_same) + index1 = paddle.masked_select(x=index1, mask=mask) + index2 = paddle.masked_select(x=index2, mask=mask) + cell_offsets = paddle.masked_select( + x=cell_offsets_per_atom.view(-1, 3), mask=mask.view(-1, 1).expand(shape=[-1, 3]) + ) + cell_offsets = cell_offsets.view(-1, 3) + atom_distance_squared = paddle.masked_select(x=atom_distance_squared, mask=mask) + mask_num_neighbors, num_neighbors_image = get_max_neighbors_mask( + natoms=natoms, + index=index1, + atom_distance_squared=atom_distance_squared, + max_num_neighbors_threshold=max_num_neighbors_threshold, + ) + if not paddle.all(x=mask_num_neighbors): + index1 = paddle.masked_select(x=index1, mask=mask_num_neighbors) + index2 = paddle.masked_select(x=index2, mask=mask_num_neighbors) + atom_distance_squared = paddle.masked_select( + x=atom_distance_squared, mask=mask_num_neighbors + ) + cell_offsets = paddle.masked_select( + x=cell_offsets.view(-1, 3), + mask=mask_num_neighbors.view(-1, 1).expand(shape=[-1, 3]), + ) + cell_offsets = cell_offsets.view(-1, 3) + edge_index = paddle.stack(x=(index2, index1)) + cell_repeated = paddle.repeat_interleave(x=cell, repeats=num_neighbors_image, axis=0) # noqa + offsets = ( + -cell_offsets.astype(dtype="float32") + .view(-1, 1, 3) + .bmm(y=cell_repeated.astype(dtype="float32")) + .view(-1, 3) + ) + return ( + edge_index, + cell_offsets, + num_neighbors_image, + offsets, + paddle.sqrt(x=atom_distance_squared), + ) + + +def get_max_neighbors_mask( + natoms: paddle.Tensor, + index: paddle.Tensor, + atom_distance_squared: paddle.Tensor, + max_num_neighbors_threshold: int, +) -> tuple[paddle.Tensor, paddle.Tensor]: + """ + Give a mask that filters out edges so that each atom has at most + `max_num_neighbors_threshold` neighbors. + Assumes that `index` is sorted. + """ + device = natoms.place + num_atoms = natoms.sum() + + # Temporary use of alternative methods, no longer using paddle_stcatter + # https://github.com/PFCCLab/paddle_scatter/tree/main + #=================================================================================== + # ones = paddle.ones(shape=[1], dtype=index.dtype).expand_as(y=index) + # num_neighbors = segment_coo(ones, index, dim_size=num_atoms) + + num_neighbors = paddle.zeros(shape=num_atoms) + num_neighbors.index_add_(axis=0, index=index, value=paddle.ones(shape=len(index))) + num_neighbors = num_neighbors.astype(dtype="int64") + #=================================================================================== + + # Temporary use of alternative methods, no longer using paddle_stcatter + # https://github.com/PFCCLab/paddle_scatter/tree/main + #=================================================================================== + # max_num_neighbors = num_neighbors.max() + # num_neighbors_thresholded = num_neighbors.clip(max=max_num_neighbors_threshold) + # image_indptr = paddle.zeros(shape=tuple(natoms.shape)[0] + 1, dtype="int64") + # image_indptr[1:] = paddle.cumsum(x=natoms, axis=0) + # num_neighbors_image = segment_csr(num_neighbors_thresholded, image_indptr) + + max_num_neighbors = paddle.max(x=num_neighbors).astype(dtype="int64") + _max_neighbors = copy.deepcopy(num_neighbors) + _max_neighbors[ + _max_neighbors > max_num_neighbors_threshold + ] = max_num_neighbors_threshold + _num_neighbors = paddle.zeros(shape=num_atoms + 1).astype(dtype="int64") + _natoms = paddle.zeros(shape=tuple(natoms.shape)[0] + 1).astype(dtype="int64") + _num_neighbors[1:] = paddle.cumsum(x=_max_neighbors, axis=0) + _natoms[1:] = paddle.cumsum(x=natoms, axis=0) + num_neighbors_image = _num_neighbors[_natoms[1:]] - _num_neighbors[_natoms[:-1]] + #=================================================================================== + + if max_num_neighbors <= max_num_neighbors_threshold or max_num_neighbors_threshold <= 0: # noqa + mask_num_neighbors = paddle.to_tensor( + data=[True], dtype=bool, place=device + ).expand_as( # noqa + y=index + ) # noqa + return mask_num_neighbors, num_neighbors_image + distance_sort = paddle.full(shape=[num_atoms * max_num_neighbors], fill_value=np.inf) # noqa + index_neighbor_offset = paddle.cumsum(x=num_neighbors, axis=0) - num_neighbors + index_neighbor_offset_expand = paddle.repeat_interleave( + x=index_neighbor_offset, repeats=num_neighbors + ) + index_sort_map = ( + index * max_num_neighbors + + paddle.arange(end=len(index)) + - index_neighbor_offset_expand # noqa + ) + distance_sort.scatter_(index_sort_map, atom_distance_squared) + distance_sort = distance_sort.view(num_atoms, max_num_neighbors) + distance_sort, index_sort = paddle.sort(x=distance_sort, axis=1), paddle.argsort( + x=distance_sort, axis=1 + ) + distance_sort = distance_sort[:, :max_num_neighbors_threshold] + index_sort = index_sort[:, :max_num_neighbors_threshold] + index_sort = index_sort + index_neighbor_offset.view(-1, 1).expand( + shape=[-1, max_num_neighbors_threshold] + ) + mask_finite = paddle.isfinite(x=distance_sort) + index_sort = paddle.masked_select(x=index_sort, mask=mask_finite) + mask_num_neighbors = paddle.zeros(shape=len(index), dtype=bool) + mask_num_neighbors.index_fill_(axis=0, index=index_sort, value=True) + return mask_num_neighbors, num_neighbors_image diff --git a/jointContribution/mattergen/mattergen/common/utils/readout.py b/jointContribution/mattergen/mattergen/common/utils/readout.py new file mode 100644 index 00000000..2099590e --- /dev/null +++ b/jointContribution/mattergen/mattergen/common/utils/readout.py @@ -0,0 +1,228 @@ +from abc import ABC +from abc import abstractmethod +from typing import List + +import paddle +from paddle_scatter import scatter +# from paddle_scatter import scatter_softmax +from typing_extensions import Literal + +from paddle_utils import * # noqa + + +class MLP(paddle.nn.Layer): + def __init__( + self, + input_dim: int, + out_dim: int, + hidden_layer_dims: List[int], + activation=paddle.nn.ReLU(), + ): + super().__init__() + layers = [] + cur_hidden_dim = input_dim + for hidden_layer_dim in hidden_layer_dims: + layers.append( + paddle.nn.Linear(in_features=cur_hidden_dim, out_features=hidden_layer_dim) # noqa + ) + layers.append(activation) + cur_hidden_dim = hidden_layer_dim + layers.append(paddle.nn.Linear(in_features=cur_hidden_dim, out_features=out_dim)) # noqa + self._layers = paddle.nn.Sequential(*layers) + + def forward(self, inputs): + return self._layers(inputs) + + +class GraphReadout(paddle.nn.Layer, ABC): + def __init__(self, node_dim: int, out_dim: int): + """ + Args: + node_dim: Dimension of each node node representation. + out_dim: Dimension of the graph representation to produce. + """ + super().__init__() + self._node_dim = node_dim + self._out_dim = out_dim + + @abstractmethod + def forward( + self, + node_embeddings: paddle.Tensor, + node_to_graph_id: paddle.Tensor, + num_graphs: int, + ) -> paddle.Tensor: + """ + Args: + node_embeddings: representations of individual graph nodes. A float tensor + of shape [num_nodes, self.node_dim]. + node_to_graph_id: int tensor of shape [num_nodes], assigning a graph_id to + each node. + num_graphs: int scalar, giving the number of graphs in the batch. + + Returns: + float tensor of shape [num_graphs, out_dim] + """ + pass + + +class CombinedGraphReadout(GraphReadout): + def __init__(self, node_dim: int, out_dim: int, num_heads: int, head_dim: int): + """ + See superclass for first few parameters. + + Args: + num_heads: Number of independent heads to use for independent weights. + head_dim: Size of the result of each independent head. + num_mlp_layers: Number of layers in the MLPs used to compute per-head + weights and outputs. + """ + super().__init__(node_dim, out_dim) + self._num_heads = num_heads + self._head_dim = head_dim + self._weighted_mean_pooler = MultiHeadWeightedGraphReadout( + node_dim=node_dim, + out_dim=out_dim, + num_heads=num_heads, + head_dim=head_dim, + weighting_type="weighted_mean", + ) + self._weighted_sum_pooler = MultiHeadWeightedGraphReadout( + node_dim=node_dim, + out_dim=out_dim, + num_heads=num_heads, + head_dim=head_dim, + weighting_type="weighted_sum", + ) + self._max_pooler = UnweightedGraphReadout( + node_dim=node_dim, out_dim=out_dim, pooling_type="max" + ) + self._combination_layer = paddle.nn.Linear( + in_features=3 * out_dim, out_features=out_dim, bias_attr=False + ) + + def forward( + self, + node_embeddings: paddle.Tensor, + node_to_graph_id: paddle.Tensor, + num_graphs: int, + ) -> paddle.Tensor: + mean_graph_repr = self._weighted_mean_pooler( + node_embeddings, node_to_graph_id, num_graphs + ) # noqa + sum_graph_repr = self._weighted_sum_pooler( + node_embeddings, node_to_graph_id, num_graphs + ) # noqa + max_graph_repr = self._max_pooler(node_embeddings, node_to_graph_id, num_graphs) # noqa + raw_graph_repr = paddle.concat( + x=(mean_graph_repr, sum_graph_repr, max_graph_repr), axis=1 + ) # noqa + return self._combination_layer(paddle.nn.functional.relu(x=raw_graph_repr)) + + +class MultiHeadWeightedGraphReadout(GraphReadout): + def __init__( + self, + node_dim: int, + out_dim: int, + num_heads: int, + head_dim: int, + weighting_type: Literal["weighted_sum", "weighted_mean"], + num_mlp_layers: int = 1, + ): + """ + See superclass for first few parameters. + + Args: + num_heads: Number of independent heads to use for independent weights. + head_dim: Size of the result of each independent head. + weighting_type: Type of weighting to use, either "weighted_sum" (weights + are in [0, 1], obtained through a logistic sigmoid) or "weighted_mean" + (weights are in [0, 1] and sum up to 1 for each graph, obtained through + a softmax). + num_mlp_layers: Number of layers in the MLPs used to compute per-head + weights and outputs. + """ + super().__init__(node_dim, out_dim) + self._num_heads = num_heads + self._head_dim = head_dim + if weighting_type not in ("weighted_sum", "weighted_mean"): + raise ValueError(f"Unknown weighting type {weighting_type}!") + self._weighting_type = weighting_type + self._scoring_module = MLP( + input_dim=self._node_dim, + hidden_layer_dims=[self._head_dim * num_heads] * num_mlp_layers, + out_dim=num_heads, + ) + self._transformation_mlp = MLP( + input_dim=self._node_dim, + hidden_layer_dims=[self._head_dim * num_heads] * num_mlp_layers, + out_dim=num_heads * head_dim, + ) + self._combination_layer = paddle.nn.Linear( + in_features=num_heads * head_dim, out_features=out_dim, bias_attr=False + ) + + def forward( + self, + node_embeddings: paddle.Tensor, + node_to_graph_id: paddle.Tensor, + num_graphs: int, + ) -> paddle.Tensor: + scores = self._scoring_module(node_embeddings) + if self._weighting_type == "weighted_sum": + weights = paddle.nn.functional.sigmoid(x=scores) + elif self._weighting_type == "weighted_mean": + # weights = scatter_softmax(scores, index=node_to_graph_id, dim=0) + raise NotImplementedError() + else: + raise ValueError(f"Unknown weighting type {self._weighting_type}!") + values = self._transformation_mlp(node_embeddings) + values = values.view(-1, self._num_heads, self._head_dim) + weighted_values = weights.unsqueeze(axis=-1) * values + per_graph_values = paddle.zeros( + shape=(num_graphs, self._num_heads * self._head_dim) + ) # noqa + per_graph_values.index_add_( + axis=0, + index=node_to_graph_id, + value=weighted_values.view(-1, self._num_heads * self._head_dim), + ) + return self._combination_layer(per_graph_values) + + +class UnweightedGraphReadout(GraphReadout): + def __init__( + self, + node_dim: int, + out_dim: int, + pooling_type: Literal["min", "max", "sum", "mean"], + ): + """ + See superclass for first few parameters. + + Args: + pooling_type: Type of pooling to use. One of "min", "max", "sum" and "mean". + """ + super().__init__(node_dim, out_dim) + self._pooling_type = pooling_type + if pooling_type not in ("min", "max", "sum", "mean"): + raise ValueError(f"Unknown weighting type {self.pooling_type}!") + self._combination_layer = paddle.nn.Linear( + in_features=self._node_dim, out_features=out_dim, bias_attr=False + ) + + def forward( + self, + node_embeddings: paddle.Tensor, + node_to_graph_id: paddle.Tensor, + num_graphs: int, + ) -> paddle.Tensor: + per_graph_values = scatter( + src=node_embeddings, + index=node_to_graph_id, + dim=0, + dim_size=num_graphs, + reduce=self._pooling_type, + ) + return self._combination_layer(per_graph_values) diff --git a/jointContribution/mattergen/mattergen/conf/adapter/default.yaml b/jointContribution/mattergen/mattergen/conf/adapter/default.yaml new file mode 100644 index 00000000..07058792 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/adapter/default.yaml @@ -0,0 +1,15 @@ +model_path: ${oc.env:MAP_INPUT_DIR} +load_epoch: latest +full_finetuning: true + +adapter: + # these arguments are used to initialize GemNetTAdapter + # more args are added by the finetuning script during runtime + _target_: mattergen.adapter.GemNetTAdapter + property_embeddings_adapt: {} + +defaults: [] + # path/to/config_dir@attribute.name: config_file_name + ## e.g., insert values from dft_bulk_modulus.yaml in /lightning_module/diffusion_module/model/property_embeddings/ + ## into adapter.property_embeddings_adapt[dft_bulk_modulus] + # - /lightning_module/diffusion_module/model/property_embeddings@adapter.property_embeddings_adapt.dft_bulk_modulus: dft_bulk_modulus diff --git a/jointContribution/mattergen/mattergen/conf/data_module/2d_30k.yaml b/jointContribution/mattergen/mattergen/conf/data_module/2d_30k.yaml new file mode 100644 index 00000000..d4d32eac --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/data_module/2d_30k.yaml @@ -0,0 +1,53 @@ +_target_: mattergen.common.data.datamodule.CrystDataModule +_recursive_: true +properties: [] + # Supported properties: + # - dft_bulk_modulus + # - dft_band_gap + # - dft_mag_density + +transforms: +- _target_: mattergen.common.data.transform.symmetrize_lattice + _partial_: true +- _target_: mattergen.common.data.transform.set_chemical_system_string + _partial_: true + +dataset_transforms: + - _target_: mattergen.common.data.dataset_transform.filter_sparse_properties + _partial_: true + +average_density: 0.05771451654022283 # atoms/Angstrom**3 : this is used in models/scripts/run.py to set lattice_limit_density +root_dir: ${oc.env:PROJECT_ROOT}/../datasets/cache/2d_30k + +train_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/train + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +val_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/val + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +test_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/test + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +num_workers: + train: 0 + val: 0 + test: 0 + +batch_size: + train: 64 + val: 32 + test: 32 + +max_epochs: 400 \ No newline at end of file diff --git a/jointContribution/mattergen/mattergen/conf/data_module/alex_mp_20.yaml b/jointContribution/mattergen/mattergen/conf/data_module/alex_mp_20.yaml new file mode 100644 index 00000000..6daaa1be --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/data_module/alex_mp_20.yaml @@ -0,0 +1,51 @@ +_target_: mattergen.common.data.datamodule.CrystDataModule +_recursive_: true +properties: [] + # Supported properties: + # - dft_bulk_modulus + # - dft_band_gap + # - dft_mag_density + # - ml_bulk_modulus + # - hhi_score + # - space_group + # - energy_above_hull + +dataset_transforms: + - _target_: mattergen.common.data.dataset_transform.filter_sparse_properties + _partial_: true + +transforms: +- _target_: mattergen.common.data.transform.symmetrize_lattice + _partial_: true +- _target_: mattergen.common.data.transform.set_chemical_system_string + _partial_: true + +average_density: 0.05771451654022283 # atoms/Angstrom**3 : this is used in models/scripts/run.py to set lattice_limit_density +root_dir: ${oc.env:PROJECT_ROOT}/../datasets/cache/alex_mp_20 + +train_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/train + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +val_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/val + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +num_workers: + train: 0 + val: 0 + +batch_size: + # total batch size of 512, adjust for number of devices, nodes, and gradient accumulation + # train: ${eval:'(512 // ${trainer.accumulate_grad_batches}) // (${trainer.devices} * ${trainer.num_nodes})'} + # val: ${eval:'(512 // ${trainer.accumulate_grad_batches}) // (${trainer.devices} * ${trainer.num_nodes})'} + train: 32 + val: 32 + +max_epochs: 2200 \ No newline at end of file diff --git a/jointContribution/mattergen/mattergen/conf/data_module/mp_20.yaml b/jointContribution/mattergen/mattergen/conf/data_module/mp_20.yaml new file mode 100644 index 00000000..0f980077 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/data_module/mp_20.yaml @@ -0,0 +1,53 @@ +_target_: mattergen.common.data.datamodule.CrystDataModule +_recursive_: true +properties: [] + # Supported properties: + # - dft_bulk_modulus + # - dft_band_gap + # - dft_mag_density + +transforms: +- _target_: mattergen.common.data.transform.symmetrize_lattice + _partial_: true +- _target_: mattergen.common.data.transform.set_chemical_system_string + _partial_: true + +dataset_transforms: + - _target_: mattergen.common.data.dataset_transform.filter_sparse_properties + _partial_: true + +average_density: 0.05771451654022283 # atoms/Angstrom**3 : this is used in models/scripts/run.py to set lattice_limit_density +root_dir: ${oc.env:PROJECT_ROOT}/../datasets/cache/mp_20_chemical_system + +train_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/train + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +val_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/val + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +test_dataset: + _target_: mattergen.common.data.dataset.CrystalDataset.from_cache_path + cache_path: ${data_module.root_dir}/test + properties: ${data_module.properties} + transforms: ${data_module.transforms} + dataset_transforms: ${data_module.dataset_transforms} + +num_workers: + train: 0 + val: 0 + test: 0 + +batch_size: + train: 32 + val: 32 + test: 32 + +max_epochs: 900 \ No newline at end of file diff --git a/jointContribution/mattergen/mattergen/conf/default.yaml b/jointContribution/mattergen/mattergen/conf/default.yaml new file mode 100644 index 00000000..bb8893f8 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/default.yaml @@ -0,0 +1,13 @@ +hydra: + run: + dir: ${oc.env:OUTPUT_DIR,outputs/singlerun/${now:%Y-%m-%d}/${now:%H-%M-%S}} + +auto_resume: True + +defaults: + - data_module: mp_20 + - trainer: default + - lightning_module: default + - lightning_module/diffusion_module: default + - lightning_module/diffusion_module/model: mattergen + - lightning_module/diffusion_module/corruption: default diff --git a/jointContribution/mattergen/mattergen/conf/default_2d_md.yaml b/jointContribution/mattergen/mattergen/conf/default_2d_md.yaml new file mode 100644 index 00000000..a0ec1ac4 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/default_2d_md.yaml @@ -0,0 +1,13 @@ +hydra: + run: + dir: ${oc.env:OUTPUT_DIR,outputs/singlerun/${now:%Y-%m-%d}/${now:%H-%M-%S}} + +auto_resume: True + +defaults: + - data_module: 2d_30k + - trainer: default + - lightning_module: default + - lightning_module/diffusion_module: default + - lightning_module/diffusion_module/model: mattergen_md + - lightning_module/diffusion_module/corruption: default diff --git a/jointContribution/mattergen/mattergen/conf/finetune.yaml b/jointContribution/mattergen/mattergen/conf/finetune.yaml new file mode 100644 index 00000000..535c60d9 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/finetune.yaml @@ -0,0 +1,22 @@ +hydra: + run: + dir: ${oc.env:OUTPUT_DIR,outputs/singlerun/${now:%Y-%m-%d}/${now:%H-%M-%S}} + +defaults: + - data_module: mp_20 + - trainer: default + - lightning_module: default + - adapter: default + +trainer: + max_epochs: 200 + logger: + job_type: train_finetune # override default defined in defaults.trainer yaml file + +lightning_module: + optimizer_partial: + # lr: 5e-6 + # for compatibility with paddle + cfg: + lr: + learning_rate: 5e-6 diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/default.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/default.yaml new file mode 100644 index 00000000..3013781b --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/default.yaml @@ -0,0 +1,18 @@ + +_target_: mattergen.diffusion.lightning_module.DiffusionLightningModule +optimizer_partial: + _target_: mattergen.optimizer.build.build_optimizer + cfg: + __name__: Adam + beta1: 0.9 + beta2: 0.999 + clip_value: 0.5 + lr: + __name__: ReduceOnPlateau + learning_rate: 0.0001 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 0.000001 + indicator: "train_loss" + diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/corruption/default.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/corruption/default.yaml new file mode 100644 index 00000000..a516cdb9 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/corruption/default.yaml @@ -0,0 +1,27 @@ +_target_: mattergen.diffusion.corruption.multi_corruption.MultiCorruption +sdes: + pos: + _target_: mattergen.common.diffusion.corruption.NumAtomsVarianceAdjustedWrappedVESDE + wrapping_boundary: 1.0 + sigma_max: 5.0 + limit_info_key: num_atoms + + cell: + _target_: mattergen.common.diffusion.corruption.LatticeVPSDE.from_vpsde_config + vpsde_config: + beta_min: 0.1 + beta_max: 20 + limit_density: ${data_module.average_density} + limit_var_scaling_constant: 0.25 + +discrete_corruptions: + atomic_numbers: + _target_: mattergen.diffusion.corruption.d3pm_corruption.D3PMCorruption + offset: 1 + d3pm: + _target_: mattergen.diffusion.d3pm.d3pm.MaskDiffusion + dim: 101 + schedule: + _target_: mattergen.diffusion.d3pm.d3pm.create_discrete_diffusion_schedule + kind: standard + num_steps: 1000 diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/default.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/default.yaml new file mode 100644 index 00000000..1217be39 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/default.yaml @@ -0,0 +1,18 @@ +_target_: mattergen.diffusion.diffusion_module.DiffusionModule +loss_fn: + _target_: mattergen.common.loss.MaterialsLoss + reduce: sum + include_pos: True + include_cell: True + include_atomic_numbers: True + d3pm_hybrid_lambda: 0.01 + weights: + cell: 1.0 + pos: 0.1 + atomic_numbers: 1.0 +model: mattergen +corruption: default +pre_corruption_fn: + _target_: mattergen.property_embeddings.SetEmbeddingType + p_unconditional: 0.2 + dropout_fields_iid: false diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/mattergen.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/mattergen.yaml new file mode 100644 index 00000000..b3f190b3 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/mattergen.yaml @@ -0,0 +1,29 @@ +_target_: mattergen.denoiser.GemNetTDenoiser +hidden_dim: 512 +gemnet: + _target_: mattergen.common.gemnet.gemnet.GemNetT + num_targets: 1 + latent_dim: ${eval:'${..hidden_dim} * (1 + len(${..property_embeddings}))'} # 1 is for time encoding. + atom_embedding: + _target_: mattergen.common.gemnet.layers.embedding_block.AtomEmbedding + emb_size: ${...hidden_dim} + with_mask_type: ${eval:'${...denoise_atom_types} and "${...atom_type_diffusion}" == "mask"'} + emb_size_atom: ${..hidden_dim} + emb_size_edge: ${..hidden_dim} + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7. + num_blocks: 4 + regress_stress: true + otf_graph: true + scale_file: ${oc.env:PROJECT_ROOT}/common/gemnet/gemnet-dT.json +denoise_atom_types: true +atom_type_diffusion: mask +property_embeddings_adapt: {} +property_embeddings: {} +defaults: [] # NOTE: to train a conditional model, unccoment entries such as property_embeddings@property_embeddings.chemical_system: chemical_system below and edit/add properties to the defaults list as desired. + # see https://stackoverflow.com/questions/71356361/selecting-multiple-configs-from-a-config-group-in-hydra-without-using-an-explici + # add via config override: +lightning_module/diffusion_module/model/property_embeddings@lightning_module.diffusion_module.model.property_embeddings.dft_bulk_modulus=dft_bulk_modulus + # delete via config override: ~lightning_module/diffusion_module/model/property_embeddings@lightning_module.diffusion_module.model.property_embeddings.chemical_system + # - property_embeddings@property_embeddings.chemical_system: chemical_system + # - property_embeddings@property_embeddings.dft_bulk_modulus: dft_bulk_modulus diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/mattergen_md.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/mattergen_md.yaml new file mode 100644 index 00000000..5233b01a --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/mattergen_md.yaml @@ -0,0 +1,29 @@ +_target_: mattergen.denoiser.GemNetTDenoiser +hidden_dim: 512 +gemnet: + _target_: mattergen.common.gemnet.gemnet_md.GemNetT_MD + num_targets: 1 + latent_dim: ${eval:'${..hidden_dim} * (1 + len(${..property_embeddings}))'} # 1 is for time encoding. + atom_embedding: + _target_: mattergen.common.gemnet.layers.embedding_block.AtomEmbedding + emb_size: ${...hidden_dim} + with_mask_type: ${eval:'${...denoise_atom_types} and "${...atom_type_diffusion}" == "mask"'} + emb_size_atom: ${..hidden_dim} + emb_size_edge: ${..hidden_dim} + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7. + num_blocks: 4 + regress_stress: true + otf_graph: true + scale_file: ${oc.env:PROJECT_ROOT}/common/gemnet/gemnet-dT.json +denoise_atom_types: true +atom_type_diffusion: mask +property_embeddings_adapt: {} +property_embeddings: {} +defaults: [] # NOTE: to train a conditional model, unccoment entries such as property_embeddings@property_embeddings.chemical_system: chemical_system below and edit/add properties to the defaults list as desired. + # see https://stackoverflow.com/questions/71356361/selecting-multiple-configs-from-a-config-group-in-hydra-without-using-an-explici + # add via config override: +lightning_module/diffusion_module/model/property_embeddings@lightning_module.diffusion_module.model.property_embeddings.dft_bulk_modulus=dft_bulk_modulus + # delete via config override: ~lightning_module/diffusion_module/model/property_embeddings@lightning_module.diffusion_module.model.property_embeddings.chemical_system + # - property_embeddings@property_embeddings.chemical_system: chemical_system + # - property_embeddings@property_embeddings.dft_bulk_modulus: dft_bulk_modulus diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/chemical_system.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/chemical_system.yaml new file mode 100644 index 00000000..338d64fc --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/chemical_system.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: chemical_system +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.property_embeddings.ChemicalSystemMultiHotEmbedding + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: paddle.nn.Identity diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_band_gap.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_band_gap.yaml new file mode 100644 index 00000000..020fe8cc --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_band_gap.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: dft_band_gap +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_bulk_modulus.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_bulk_modulus.yaml new file mode 100644 index 00000000..27947417 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_bulk_modulus.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: dft_bulk_modulus +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_mag_density.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_mag_density.yaml new file mode 100644 index 00000000..fcf01dbd --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/dft_mag_density.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: dft_mag_density +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/ehull.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/ehull.yaml new file mode 100644 index 00000000..84753033 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/ehull.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: ehull +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/energy_above_hull.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/energy_above_hull.yaml new file mode 100644 index 00000000..511a6f5d --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/energy_above_hull.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: energy_above_hull +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/formation_energy_per_atom.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/formation_energy_per_atom.yaml new file mode 100644 index 00000000..854ff216 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/formation_energy_per_atom.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: formation_energy_per_atom +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/hhi_score.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/hhi_score.yaml new file mode 100644 index 00000000..d7728030 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/hhi_score.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: hhi_score +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/ml_bulk_modulus.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/ml_bulk_modulus.yaml new file mode 100644 index 00000000..c1d110a5 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/ml_bulk_modulus.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: ml_bulk_modulus +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.diffusion.model_utils.NoiseLevelEncoding + d_model: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: mattergen.common.utils.data_utils.StandardScalerPaddle diff --git a/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/space_group.yaml b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/space_group.yaml new file mode 100644 index 00000000..3679958d --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/lightning_module/diffusion_module/model/property_embeddings/space_group.yaml @@ -0,0 +1,10 @@ +_target_: mattergen.property_embeddings.PropertyEmbedding +name: space_group +unconditional_embedding_module: + _target_: mattergen.property_embeddings.EmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +conditional_embedding_module: + _target_: mattergen.property_embeddings.SpaceGroupEmbeddingVector + hidden_dim: ${lightning_module.diffusion_module.model.hidden_dim} +scaler: + _target_: paddle.nn.Identity diff --git a/jointContribution/mattergen/mattergen/conf/trainer/default.yaml b/jointContribution/mattergen/mattergen/conf/trainer/default.yaml new file mode 100644 index 00000000..52083304 --- /dev/null +++ b/jointContribution/mattergen/mattergen/conf/trainer/default.yaml @@ -0,0 +1,52 @@ +# _target_: pytorch_lightning.Trainer +# accelerator: 'gpu' +# devices: 1 +# num_nodes: 1 +# precision: 32 +# max_epochs: ${data_module.max_epochs} +# accumulate_grad_batches: 1 +# gradient_clip_val: 0.5 +# gradient_clip_algorithm: value +# check_val_every_n_epoch: 5 +# strategy: +# _target_: pytorch_lightning.strategies.ddp.DDPStrategy +# find_unused_parameters: true + +# logger: +# _target_: pytorch_lightning.loggers.WandbLogger +# project: crystal-generation +# job_type: train +# settings: +# _target_: wandb.Settings +# start_method: fork +# _save_requirements: False + +# callbacks: +# - _target_: pytorch_lightning.callbacks.LearningRateMonitor +# logging_interval: step +# log_momentum: False +# - _target_: pytorch_lightning.callbacks.ModelCheckpoint +# monitor: loss_val +# mode: min +# save_top_k: 1 +# save_last: True +# verbose: false +# every_n_epochs: 1 +# filename: "{epoch}-{loss_val:.2f}" +# - _target_: pytorch_lightning.callbacks.TQDMProgressBar +# refresh_rate: 50 +# - _target_: mattergen.common.data.callback.SetPropertyScalers + +output_dir: 'output' +save_freq: 10 +log_freq: 10 +start_eval_epoch: 1 +eval_freq: 1 +seed: 42 +pretrained_model_path: null +checkpoint_path: null +scale_grad: true +is_save_traj: false +step_lr: 0.000005 +mode: 'train' +max_epochs: ${data_module.max_epochs} diff --git a/jointContribution/mattergen/mattergen/denoiser.py b/jointContribution/mattergen/mattergen/denoiser.py new file mode 100644 index 00000000..38e98384 --- /dev/null +++ b/jointContribution/mattergen/mattergen/denoiser.py @@ -0,0 +1,253 @@ +import sys + + +from typing import Callable + +import paddle +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.data.types import PropertySourceId +from mattergen.common.utils.globals import (MAX_ATOMIC_NUM, + SELECTED_ATOMIC_NUMBERS) +from mattergen.diffusion.model_utils import NoiseLevelEncoding +from mattergen.diffusion.score_models.base import ScoreModel +from mattergen.property_embeddings import (ChemicalSystemMultiHotEmbedding, + get_property_embeddings, + get_use_unconditional_embedding) +from paddle_utils import * + +BatchTransform = Callable[[ChemGraph], ChemGraph] + + +def atomic_numbers_to_mask( + atomic_numbers: paddle.Tensor, max_atomic_num: int +) -> paddle.Tensor: + """Convert atomic numbers to a mask. + + Args: + atomic_numbers (paddle.LongTensor): One-based atomic numbers of shape (batch_size, ) + + Returns: + paddle.Tensor: Mask of shape (batch_size, num_classes) + """ + k_hot_mask = paddle.eye(num_rows=max_atomic_num)[atomic_numbers - 1] + return k_hot_mask + + +def mask_logits(logits: paddle.Tensor, mask: paddle.Tensor) -> paddle.Tensor: + """Mask logits by setting the logits for masked items to -inf. + + Args: + logits (paddle.Tensor): Logits of shape (batch_size, num_classes) + mask (paddle.Tensor): Mask of shape (batch_size, num_classes). Values with zero are masked. + + Returns: + paddle.Tensor: Masked logits + """ + return logits + (1 - mask) * -10000000000.0 + + +def mask_disallowed_elements( + logits: paddle.Tensor, + x: (ChemGraph | None) = None, + batch_idx=None, #: (paddle.int64 | None) = None, todo: fix this + predictions_are_zero_based: bool = True, +): + """ + Mask out atom types that are disallowed in general, + as well as potentially all elements not in the chemical system we condition on. + + Args: + logits (paddle.Tensor): Logits of shape (batch_size, num_classes) + x (ChemGraph) + batch_idx (paddle.LongTensor, optional): Batch indices. Defaults to None. Must be provided if condition is not None. + predictions_are_zero_based (bool, optional): Whether the logits are zero-based. Defaults to True. Basically, if we're using D3PM, + the logits are zero-based (model predicts atomic number index) + """ + selected_atomic_numbers = paddle.to_tensor( + data=SELECTED_ATOMIC_NUMBERS, place=logits.place + ) + predictions_are_one_based = not predictions_are_zero_based + one_hot_selected_elements = atomic_numbers_to_mask( + atomic_numbers=selected_atomic_numbers + int(predictions_are_one_based), + max_atomic_num=tuple(logits.shape)[1], + ) + k_hot_mask = one_hot_selected_elements.sum(axis=0)[None] + logits = mask_logits(logits=logits, mask=k_hot_mask) + if x is not None and "chemical_system" in x and x["chemical_system"] is not None: + try: + do_not_mask_atom_logits = get_use_unconditional_embedding( + batch=x, cond_field="chemical_system" + ) + except KeyError: + do_not_mask_atom_logits = paddle.ones( + shape=(len(x["chemical_system"]), 1), dtype="bool" + ) + assert ( + batch_idx is not None + ), "batch_idx must be provided if condition is not None" + keep_all_logits = paddle.ones(shape=(len(x["chemical_system"]), 1)) + multi_hot_chemical_system = ( + ChemicalSystemMultiHotEmbedding.sequences_to_multi_hot( + x=ChemicalSystemMultiHotEmbedding.convert_to_list_of_str( + x=x["chemical_system"] + ), + device=x["num_atoms"].place, + ) + ) + keep_logits = paddle.where( + condition=do_not_mask_atom_logits, + x=keep_all_logits, + y=multi_hot_chemical_system, + ) + if predictions_are_zero_based: + keep_logits = keep_logits[:, 1:] + if tuple(keep_logits.shape)[1] == tuple(logits.shape)[1] - 1: + keep_logits = paddle.concat( + x=[keep_logits, paddle.zeros_like(x=keep_logits[:, :1])], axis=-1 + ) + logits = mask_logits(logits, keep_logits[batch_idx]) + return logits + + +def get_chemgraph_from_denoiser_output( + pred_atom_types: paddle.Tensor, + pred_lattice_eps: paddle.Tensor, + pred_cart_pos_eps: paddle.Tensor, + training: bool, + element_mask_func: (Callable | None), + x_input: ChemGraph, +) -> ChemGraph: + """ + Convert raw denoiser output to ChemGraph and optionally apply masking to element logits. + + Keyword arguments + ----------------- + pred_atom_atoms: predicted logits for atom types + pred_lattice_eps: predicted lattice noise + pred_cart_pos_eps: predicted cartesian position noise + training: whether or not the model is in training mode - logit masking is only applied when sampling + element_mask_func: when not training, a function can be applied to mask logits for certain atom types + x_input: the nosiy state input to the score model, contains the lattice to convert cartesisan to fractional noise. + """ + if not training and element_mask_func: + pred_atom_types = element_mask_func( + logits=pred_atom_types, x=x_input, batch_idx=x_input.get_batch_idx("pos") + ) + replace_dict = dict( + pos=( + x_input["cell"] + .inverse() + .transpose(perm=dim2perm(x_input["cell"].inverse().ndim, 1, 2))[ + x_input.get_batch_idx("pos") + ] + @ pred_cart_pos_eps.unsqueeze(axis=-1) + ).squeeze(axis=-1), + cell=pred_lattice_eps, + atomic_numbers=pred_atom_types, + ) + return x_input.replace(**replace_dict) + + +class GemNetTDenoiser(ScoreModel): + """Denoiser""" + + def __init__( + self, + gemnet: paddle.nn.Layer, + hidden_dim: int = 512, + denoise_atom_types: bool = True, + atom_type_diffusion: str = ["mask", "uniform"][0], + property_embeddings: (paddle.nn.LayerDict | None) = None, + property_embeddings_adapt: (paddle.nn.LayerDict | None) = None, + element_mask_func: (Callable | None) = None, + **kwargs + ): + """Construct a GemNetTDenoiser object. + + Args: + gemnet: a GNN module + hidden_dim (int, optional): Number of hidden dimensions in the GemNet. Defaults to 128. + denoise_atom_types (bool, optional): Whether to denoise the atom types. Defaults to False. + atom_type_diffusion (str, optional): Which type of atom type diffusion to use. Defaults to "mask". + condition_on (Optional[List[str]], optional): Which aspects of the data to condition on. Strings must be in ["property", "chemical_system"]. If None (default), condition on ["chemical_system"]. + """ + super(GemNetTDenoiser, self).__init__() + self.gemnet = gemnet + self.noise_level_encoding = NoiseLevelEncoding(hidden_dim) + self.hidden_dim = hidden_dim + self.denoise_atom_types = denoise_atom_types + self.atom_type_diffusion = atom_type_diffusion + self.property_embeddings = paddle.nn.LayerDict( + sublayers=property_embeddings or {} + ) + with_mask_type = self.denoise_atom_types and "mask" in self.atom_type_diffusion + self.fc_atom = paddle.nn.Linear( + in_features=hidden_dim, out_features=MAX_ATOMIC_NUM + int(with_mask_type) + ) + self.element_mask_func = element_mask_func + + def forward(self, x: ChemGraph, t: paddle.Tensor) -> ChemGraph: + """ + args: + x: tuple containing: + frac_coords: (N_atoms, 3) + lattice: (N_cryst, 3, 3) + atom_types: (N_atoms, ), need to use atomic number e.g. H = 1 or ion state + num_atoms: (N_cryst,) + batch: (N_atoms,) + t: (N_cryst,): timestep per crystal + returns: + tuple of: + predicted epsilon: (N_atoms, 3) + lattice update: (N_crystals, 3, 3) + predicted atom types: (N_atoms, MAX_ATOMIC_NUM) + """ + frac_coords, lattice, atom_types, num_atoms, batch = ( + x["pos"], + x["cell"], + x["atomic_numbers"], + x["num_atoms"], + x.get_batch_idx("pos"), + ) + t_enc = self.noise_level_encoding(t).to(lattice.place) + z_per_crystal = t_enc + property_embedding_values = get_property_embeddings( + batch=x, property_embeddings=self.property_embeddings + ) + if len(property_embedding_values) > 0: + z_per_crystal = paddle.concat( + x=[z_per_crystal, property_embedding_values], axis=-1 + ) + output = self.gemnet( + z=z_per_crystal, + frac_coords=frac_coords, + atom_types=atom_types, + num_atoms=num_atoms, + batch=batch, + lengths=None, + angles=None, + lattice=lattice, + edge_index=None, + to_jimages=None, + num_bonds=None, + ) + pred_atom_types = self.fc_atom(output.node_embeddings) + return get_chemgraph_from_denoiser_output( + pred_atom_types=pred_atom_types, + pred_lattice_eps=output.stress, + pred_cart_pos_eps=output.forces, + training=self.training, + element_mask_func=self.element_mask_func, + x_input=x, + ) + + @property + def cond_fields_model_was_trained_on(self) -> list[PropertySourceId]: + """ + We adopt the convention that all property embeddings are stored in paddle.nn.ModuleDicts of + name property_embeddings or property_embeddings_adapt in the case of a fine tuned model. + + This function returns the list of all field names that a given score model was trained to + condition on. + """ + return list(self.property_embeddings) diff --git a/jointContribution/mattergen/mattergen/diffusion/__init__.py b/jointContribution/mattergen/mattergen/diffusion/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/cgmanifest.json b/jointContribution/mattergen/mattergen/diffusion/cgmanifest.json new file mode 100644 index 00000000..cc83e1d6 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/cgmanifest.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/component-detection-manifest.json", + "registrations": [ + { + "component": { + "git": { + "commitHash": "cb1f359f4aadf0ff9a5e122fe8fffc9451fd6e44", + "repositoryUrl": "https://github.com/yang-song/score_sde_pytorch" + }, + "type": "git" + }, + "developmentDependency": false + } + ], + "version": 1 +} diff --git a/jointContribution/mattergen/mattergen/diffusion/config.py b/jointContribution/mattergen/mattergen/diffusion/config.py new file mode 100644 index 00000000..f69eb736 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/config.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass, field +from typing import Any + + +@dataclass +class Config: + params: dict[str, Any] = field(default_factory=dict) + checkpoint_path: str | None = None + load_original: bool = False + auto_resume: bool = False + lightning_module: dict[str, Any] = field(default_factory=dict) + trainer: dict[str, Any] = field(default_factory=dict) + data_module: dict[str, Any] = field(default_factory=dict) diff --git a/jointContribution/mattergen/mattergen/diffusion/corruption/__init__.py b/jointContribution/mattergen/mattergen/diffusion/corruption/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/corruption/corruption.py b/jointContribution/mattergen/mattergen/diffusion/corruption/corruption.py new file mode 100644 index 00000000..b854ddb3 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/corruption/corruption.py @@ -0,0 +1,112 @@ +import paddle + +""" +Based on code from https://github.com/yang-song/score_sde_pytorch/blob/main/sde_lib.py +which is released under Apache licence. + +Abstract SDE classes, Reverse SDE, and VE/VP SDEs. + +Key changes: +- Rename SDE => Corruption +- Remove several methods like .reverse(), .discretize() +""" +import abc +import logging +from typing import Optional, Tuple, Union + +from mattergen.diffusion.data.batched_data import BatchedData + +B = Optional[paddle.Tensor] + + +def _broadcast_like(x, like): + """ + add broadcast dimensions to x so that it can be broadcast over ``like`` + """ + if like is None: + return x + return x[(...,) + (None,) * (like.ndim - x.ndim)] + + +def maybe_expand( + x: paddle.Tensor, batch: B, like: paddle.Tensor = None +) -> paddle.Tensor: + """ + + Args: + x: shape (batch_size, ...) + batch: shape (num_thingies,) with integer entries in the range [0, batch_size), indicating which sample each thingy belongs to + like: shape x.shape + potential additional dimensions + Returns: + expanded x with shape (num_thingies,), or if given like.shape, containing value of x for each thingy. + If `batch` is None, just returns `x` unmodified, to avoid pointless work if you have exactly one thingy per sample. + """ + x = _broadcast_like(x, like) + if batch is None: + return x + else: + if tuple(x.shape)[0] == tuple(batch.shape)[0]: + logging.warn( + "Warning: batch shape is == x shape, are you trying to expand something that is already expanded?" + ) + return x[batch] + + +class Corruption(abc.ABC): + """Abstract base class for corruption processes""" + + @property + @abc.abstractmethod + def T(self) -> float: + """End time of the corruption process.""" + pass + + @abc.abstractmethod + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Parameters to determine the marginal distribution of the SDE, $p_t(x)$.""" + pass + + @abc.abstractmethod + def prior_sampling( + self, + shape: Union[list, Tuple], + conditioning_data: Optional[BatchedData] = None, + batch_idx: B = None, + ) -> paddle.Tensor: + """Generate one sample from the prior distribution, $p_T(x)$.""" + pass + + @abc.abstractmethod + def prior_logp( + self, z: paddle.Tensor, batch_idx: B = None, batch: Optional[BatchedData] = None + ) -> paddle.Tensor: + """Compute log-density of the prior distribution. + + Useful for computing the log-likelihood via probability flow ODE. + + Args: + z: latent code + Returns: + log probability density + """ + pass + + @abc.abstractmethod + def sample_marginal( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> paddle.Tensor: + """Sample marginal for x(t) given x(0). + Returns: + sampled x(t) (same shape as input x). + """ + pass diff --git a/jointContribution/mattergen/mattergen/diffusion/corruption/d3pm_corruption.py b/jointContribution/mattergen/mattergen/diffusion/corruption/d3pm_corruption.py new file mode 100644 index 00000000..eaea0ac7 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/corruption/d3pm_corruption.py @@ -0,0 +1,98 @@ +from typing import Optional, Tuple, Union + +import paddle +from mattergen.diffusion.corruption.corruption import (B, Corruption, + maybe_expand) +from mattergen.diffusion.d3pm import d3pm +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.discrete_time import to_discrete_time +from paddle_scatter import scatter_add + + +class D3PMCorruption(Corruption): + """D3PM discrete corruption process. Has discret time and discrete (categorical) values.""" + + def __init__(self, d3pm: d3pm.DiscreteDiffusionBase, offset: int = 0): + super().__init__() + self.d3pm = d3pm + self.offset = offset + + @property + def N(self) -> int: + """Number of diffusion timesteps i.e. number of noise levels. + Must match number of noise levels used for sampling. To change this, we'd need to implement continuous-time diffusion for discrete things + as in e.g. Campbell et al. https://arxiv.org/abs/2205.14987""" + return self.d3pm.num_steps + + def _to_zero_based(self, x: paddle.Tensor) -> paddle.Tensor: + """Convert from non-zero-based indices to zero-based indices.""" + return x - self.offset + + def _to_non_zero_based(self, x: paddle.Tensor) -> paddle.Tensor: + """Convert from zero-based indices to non-zero-based indices.""" + return x + self.offset + + @property + def T(self) -> float: + """End time of the Corruption process.""" + return 1 + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Parameters to determine the marginal distribution of the corruption process, $p_t(x | x_0)$.""" + t_discrete = ( + maybe_expand(to_discrete_time(t, N=self.N, T=self.T), batch_idx) + 1 + ) + _, logits = d3pm.q_sample( + self._to_zero_based(x.astype(dtype="int64")), + t_discrete, + diffusion=self.d3pm, + return_logits=True, + ) + return logits, None + + def prior_sampling( + self, + shape: Union[list, Tuple], + conditioning_data: Optional[BatchedData] = None, + batch_idx: B = None, + ) -> paddle.Tensor: + """Generate one sample from the prior distribution, $p_T(x)$.""" + return self._to_non_zero_based(self.d3pm.sample_stationary(shape)) + + def prior_logp( + self, z: paddle.Tensor, batch_idx: B = None, batch: Optional[BatchedData] = None + ) -> paddle.Tensor: + """Compute log-density of the prior distribution. + + Args: + z: samples, non-zero-based indices, i.e., we first need to subtract the offset + Returns: + log probability density + """ + probs = self.d3pm.stationary_probs(tuple(z.shape)).to(z.place) + log_probs = (probs + 1e-08).log() + log_prob_per_sample = log_probs[:, self._to_zero_based(z.astype(dtype="int64"))] + log_prob_per_structure = scatter_add(log_prob_per_sample, batch_idx, dim=0) + return log_prob_per_structure + + def sample_marginal( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> paddle.Tensor: + """Sample marginal for x(t) given x(0). + Returns: + sampled x(t), non-zero-based indices + where raw_noise is drawn from standard Gaussian + """ + logits = self.marginal_prob(x=x, t=t, batch_idx=batch_idx, batch=batch)[0] + sample = paddle.distribution.Categorical(logits=logits).sample() + return self._to_non_zero_based(sample) diff --git a/jointContribution/mattergen/mattergen/diffusion/corruption/multi_corruption.py b/jointContribution/mattergen/mattergen/diffusion/corruption/multi_corruption.py new file mode 100644 index 00000000..9d645350 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/corruption/multi_corruption.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from functools import cached_property +from typing import (Any, Callable, Dict, Generic, Iterable, List, Mapping, + Optional, Tuple, TypeVar) + +import paddle +from mattergen.diffusion.corruption.d3pm_corruption import D3PMCorruption +from mattergen.diffusion.corruption.sde_lib import SDE, Corruption +from mattergen.diffusion.data.batched_data import BatchedData + +R = TypeVar('R') +Diffusable = TypeVar('Diffusable', bound=BatchedData) + + +def _first(s: Iterable): + return next(iter(s)) + + +@dataclass +class MultiCorruptionConfig: + discrete_corruptions: dict[str, Any] = field(default_factory=dict) + sdes: dict[str, Any] = field(default_factory=dict) + + +class MultiCorruption(Generic[Diffusable]): + """Wraps multiple `Corruption` instances to operate on different fields of a State + + In the forward process, each field of State is corrupted independently. + + In the reverse process, a single score model takes in the entire State and + uses it to estimate the score with respect to each field of the State. + """ + + def _get_batch_indices(self, batch: Diffusable) ->Dict[str, paddle.Tensor]: + return {k: batch.get_batch_idx(k) for k in self.corrupted_fields} + + def __init__(self, sdes: Optional[Mapping[str, SDE]]=None, + discrete_corruptions: Optional[Mapping[str, D3PMCorruption]]=None): + """ + Args: + sdes: mapping from fields of batch to SDE corruption processes + discrete_corruptions: mapping from fields of batch to discrete corruption processes + """ + if sdes is None: + sdes = {} + if discrete_corruptions is None: + discrete_corruptions = {} + assert len(sdes) + len(discrete_corruptions + ) > 0, 'Must have at least one corruption process.' + self._sdes = sdes + self._discrete_corruptions = discrete_corruptions + assert set(self._sdes.keys()).intersection(set(self. + _discrete_corruptions.keys())) == set( + ), 'SDEs and corruptions have overlapping keys.' + self._corruptions: Dict[str, Corruption] = {**self._sdes, **self. + _discrete_corruptions} + self._corruptions = {k: self._corruptions[k] for k in sorted(self. + _corruptions.keys())} + T_vals = [corruption.T for corruption in self.corruptions.values()] + assert len(set(T_vals)) == 1 + + @property + def sdes(self) ->Mapping[str, SDE]: + return self._sdes + + @property + def has_discrete_corruptions(self) ->bool: + return len(self.discrete_corruptions) > 0 + + @property + def discrete_corruptions(self) ->Mapping[str, Corruption]: + return self._discrete_corruptions + + @property + def corruptions(self) ->Mapping[str, Corruption]: + return self._corruptions + + @property + def corrupted_fields(self) ->List[str]: + return list(self.corruptions.keys()) + + @cached_property + def T(self) ->float: + return _first(self.corruptions.values()).T + + def sample_marginal(self, batch: Diffusable, t) ->Diffusable: + + def fn_getter(corruption: Corruption) ->Callable[..., Tuple[paddle. + Tensor, paddle.Tensor]]: + return corruption.sample_marginal + noisy_data = self._apply_corruption_fn(fn_getter, x=batch, + batch_idx=self._get_batch_indices(batch), broadcast=dict(t=t)) + noisy_batch = batch.replace(**noisy_data) + return noisy_batch + + def sde(self, batch: Diffusable, t: paddle.Tensor) ->Dict[str, Tuple[ + paddle.Tensor, paddle.Tensor]]: + """Get drift and diffusion for each component of the state""" + assert not self.has_discrete_corruptions, 'Cannot call `sde` on a MultiCorruption with non-SDE corruptions' + fns = {k: sde.sde for k, sde in self.sdes.items()} + return apply(fns=fns, broadcast={'batch': batch, 't': t}, x=batch, + batch_idx=self._get_batch_indices(batch)) + + def _apply_corruption_fn(self, fn_getter: Callable[[Corruption], + Callable[..., R]], x: BatchedData, batch_idx: Mapping[str, paddle. + Tensor], broadcast: Optional[Dict]=None, apply_to: Optional[Mapping + [str, Corruption]]=None, **kwargs) ->Dict[str, R]: + if apply_to is None: + apply_to = self.corruptions + fns = {field_name: fn_getter(corruption) for field_name, corruption in apply_to.items()} + return apply( + fns=fns, + broadcast={**(broadcast or dict()), 'batch': x}, + x=x, + batch_idx=batch_idx, + **kwargs + ) + + +def apply(fns: Dict[str, Callable[..., R]], broadcast, **kwargs) ->Dict[str, R + ]: + """Apply different function with different argument values to each field. + fns: dict of the form {field_name: function_to_apply} + broadcast: arguments that are identical for every field_name + kwargs: dict of the form {argument_name: {field_name: argument_value}} + """ + return { + field_name: fn( + **{k: v[field_name] for k, v in kwargs.items() if field_name in v}, + **(broadcast or dict()), + ) for field_name, fn in fns.items() + } diff --git a/jointContribution/mattergen/mattergen/diffusion/corruption/sde_lib.py b/jointContribution/mattergen/mattergen/diffusion/corruption/sde_lib.py new file mode 100644 index 00000000..cd1ef1fc --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/corruption/sde_lib.py @@ -0,0 +1,266 @@ +import paddle + +""" +Based on code from https://github.com/yang-song/score_sde_pytorch +which is released under Apache licence. + +Abstract SDE classes, Reverse SDE, and VE/VP SDEs. + +Key changes: +- Adapted to work on batched paddle_geometric style data +- Added '...given_score' methods so that score for a composite +state can be calculated in single forward pass of a shared score model, +and the scores for different fields then forwarded to the different reverse SDEs. +""" +import abc +from typing import Callable, Optional, Protocol, Tuple, Union + +import numpy as np +from mattergen.diffusion.corruption.corruption import (B, Corruption, + maybe_expand) +from mattergen.diffusion.data.batched_data import BatchedData +from paddle_scatter import scatter_add + + +class ScoreFunction(Protocol): + def __call__( + self, x: paddle.Tensor, t: paddle.Tensor, batch_idx: B = None + ) -> paddle.Tensor: + """Calculate score. + + Args: + x: Samples at which the score should be calculated. Shape [num_nodes, ...] + t: Timestep for each sample. Shape [num_samples,] + batch_idx: Indicates which sample each row of x belongs to. Shape [num_nodes,] + + """ + pass + + +class SDE(Corruption): + """Corruption using a stochastic differential equation.""" + + @abc.abstractmethod + def sde( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Returns drift f and diffusion coefficient g such that dx = f * dt + g * sqrt(dt) * standard Gaussian""" + pass + + @abc.abstractmethod + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Returns mean and standard deviation of the marginal distribution of the SDE, $p_t(x)$.""" + pass + + def mean_coeff_and_std( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Returns mean coefficient and standard deviation of marginal distribution at time t.""" + return self.marginal_prob(paddle.ones_like(x=x), t, batch_idx, batch) + + def sample_marginal( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> paddle.Tensor: + """Sample marginal for x(t) given x(0). + Returns: + sampled x(t) + """ + mean, std = self.marginal_prob(x=x, t=t, batch_idx=batch_idx, batch=batch) + z = paddle.randn(shape=x.shape, dtype=x.dtype) + return mean + std * z + + +class BaseVPSDE(SDE): + """Base class for variance-preserving SDEs of the form + dx = - 0.5 * beta_t * x * dt + sqrt(beta_t) * z * sqrt(dt) + where z is unit Gaussian noise, or equivalently + dx = - 0.5 * beta_t *x * dt + sqrt(beta_t) * dW + + """ + + @abc.abstractmethod + def beta(self, t: paddle.Tensor) -> paddle.Tensor: + ... + + @abc.abstractmethod + def _marginal_mean_coeff(self, t: paddle.Tensor) -> paddle.Tensor: + """This should be implemented to compute exp(-0.5 * int_0^t beta(s) ds). See equation (29) of Song et al.""" + ... + + @property + def T(self) -> float: + return 1.0 + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + mean_coeff = self._marginal_mean_coeff(t) + mean = maybe_expand(mean_coeff, batch_idx, x) * x + std = maybe_expand(paddle.sqrt(x=1.0 - mean_coeff**2), batch_idx, x) + return mean, std + + def prior_sampling( + self, + shape: Union[list, Tuple], + conditioning_data: Optional[BatchedData] = None, + batch_idx: B = None, + ) -> paddle.Tensor: + return paddle.randn(shape=shape) + + def prior_logp( + self, z: paddle.Tensor, batch_idx: B = None, batch: Optional[BatchedData] = None + ) -> paddle.Tensor: + return unit_gaussian_logp(z, batch_idx) + + def sde( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + beta_t = self.beta(t) + drift = -0.5 * maybe_expand(beta_t, batch_idx, x) * x + diffusion = maybe_expand(paddle.sqrt(x=beta_t), batch_idx, x) + return drift, diffusion + + +class VPSDE(BaseVPSDE): + def __init__(self, beta_min: float = 0.1, beta_max: float = 20): + """Variance-preserving SDE with drift coefficient changing linearly over time.""" + super().__init__() + self.beta_0 = beta_min + self.beta_1 = beta_max + + def beta(self, t: paddle.Tensor) -> paddle.Tensor: + return self.beta_0 + t * (self.beta_1 - self.beta_0) + + def _marginal_mean_coeff(self, t: paddle.Tensor) -> paddle.Tensor: + log_mean_coeff = ( + -0.25 * t**2 * (self.beta_1 - self.beta_0) - 0.5 * t * self.beta_0 + ) + return paddle.exp(x=log_mean_coeff) + + +def unit_gaussian_logp(z: paddle.Tensor, batch_idx: B = None) -> paddle.Tensor: + shape = tuple(z.shape) + N = np.prod(shape[1:]) + if batch_idx is None: + logps = ( + -N / 2.0 * np.log(2 * np.pi) + - paddle.sum(x=z**2, axis=tuple(range(1, z.ndim))) / 2.0 + ) + else: + if z.ndim > 2: + raise NotImplementedError + logps = ( + -N / 2.0 * np.log(2 * np.pi) + - scatter_add(paddle.sum(x=z**2, axis=1), batch_idx) / 2.0 + ) + return logps + + +class VESDE(SDE): + def __init__(self, sigma_min: float = 0.01, sigma_max: float = 50.0): + """Construct a Variance Exploding SDE. + + The marginal standard deviation grows exponentially from sigma_min to sigma_max. + + Args: + sigma_min: smallest sigma. + sigma_max: largest sigma. + """ + super().__init__() + self.sigma_min = sigma_min + self.sigma_max = sigma_max + + @property + def T(self) -> float: + return 1.0 + + def sde( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + sigma = self.sigma_min * (self.sigma_max / self.sigma_min) ** t + drift = paddle.zeros_like(x=x) + diffusion = maybe_expand( + sigma + * paddle.sqrt( + x=paddle.to_tensor( + data=2 * (np.log(self.sigma_max) - np.log(self.sigma_min)), + place=t.place, + ) + ), + batch_idx, + x, + ) + return drift, diffusion + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: B = None, + batch: Optional[BatchedData] = None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + std = maybe_expand( + self.sigma_min * (self.sigma_max / self.sigma_min) ** t, batch_idx, x + ) + mean = x + return mean, std + + def prior_sampling( + self, + shape: Union[list, Tuple], + conditioning_data: Optional[BatchedData] = None, + batch_idx: B = None, + ) -> paddle.Tensor: + return paddle.randn(shape=shape) * self.sigma_max + + def prior_logp( + self, z: paddle.Tensor, batch_idx: B = None, batch: Optional[BatchedData] = None + ) -> paddle.Tensor: + shape = tuple(z.shape) + N = np.prod(shape[1:]) + if batch_idx is not None: + return -N / 2.0 * np.log(2 * np.pi * self.sigma_max**2) - scatter_add( + paddle.sum(x=z**2, axis=1), batch_idx + ) / (2 * self.sigma_max**2) + else: + return -N / 2.0 * np.log(2 * np.pi * self.sigma_max**2) - paddle.sum( + x=z**2, axis=tuple(range(1, z.ndim)) + ) / (2 * self.sigma_max**2) + + +def check_score_fn_defined(score_fn: Optional[Callable], fn_name_given_score: str): + """Check that a reverse SDE has a score_fn. Give a useful error message if not.""" + if score_fn is None: + raise ValueError( + f"This reverse SDE does not know its score_fn. You must either a) pass a score_fn when you construct this reverse SDE or b) call {fn_name_given_score} instead." + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/d3pm/__init__.py b/jointContribution/mattergen/mattergen/diffusion/d3pm/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/d3pm/cgmanifest.json b/jointContribution/mattergen/mattergen/diffusion/d3pm/cgmanifest.json new file mode 100644 index 00000000..8c78243a --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/d3pm/cgmanifest.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/component-detection-manifest.json", + "registrations": [ + { + "component": { + "git": { + "commitHash": "ad2d81983e4c717f477a232f625d0da2808b15aa", + "repositoryUrl": "https://github.com/google-research/google-research" + }, + "type": "git" + }, + "developmentDependency": false + } + ], + "version": 1 +} diff --git a/jointContribution/mattergen/mattergen/diffusion/d3pm/d3pm.py b/jointContribution/mattergen/mattergen/diffusion/d3pm/d3pm.py new file mode 100644 index 00000000..a916d405 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/d3pm/d3pm.py @@ -0,0 +1,768 @@ +import sys + + +import paddle +from paddle_utils import * + +"""Diffusions for training and noise scheduling.""" +import abc +import dataclasses +from typing import Any, Callable, Dict, Optional, Union + + +class DiffusionSchedule: + """A wrapper around a simple schedule function.""" + + def __init__(self, schedule_fn, num_steps, is_constant=False): + self._schedule_fn = schedule_fn + self.num_steps = num_steps + self.is_constant = is_constant + + def __call__(self, step): + return self._schedule_fn(step) + + def __repr__(self): + return f"DiffusionSchedule(steps: {self.num_steps}, is_constant: {self.is_constant})" + + +class DiscreteDiffusionBase(abc.ABC): + """Base class for all matrix-noise schedules.""" + + num_steps: int + dim: int + precision: Any = "float32" + + @abc.abstractmethod + def stationary_probs(self, shape): + """Returns probs for the stationary distribution.""" + + @abc.abstractmethod + def sample_stationary(self, shape): + """Draws a sample from the stationary distribution (q(x_T)).""" + + @property + def has_state(self): + """Indicates if the diffusion has state which needs to be set/updated.""" + return False + + def set_state(self, state): + pass + + def reset_state(self): + pass + + def update_state(self, state): + pass + + def sample_t(self, shape=(1,)): + """Samples batches of time steps to use.""" + num_steps = self.num_steps + t = paddle.randint(shape=shape, minval=0, maxval=num_steps) + return t + + @abc.abstractmethod + def get_qt_given_q0( + self, q0, t, return_logits=False, make_one_hot=False, epsilon=1e-20 + ): + """Get q(x_t), the n-step posterior. + + For example, for t = 0, it returns q0 unchanged. + + Args: + q0: an array of floats specifying a distribution over p(x_0). + t: t in q(x_t | x_0). + return_logits: if True, return the output logits + make_one_hot: if True, will convert q0 to floats if needed. + epsilon: a small number to normalize logits conversion with, if needed. + + Returns: + q(x_t | x_0). + """ + + @abc.abstractmethod + def sample_and_compute_posterior_q( + self, + x_0, + t, + samples=None, + transition_probs=None, + return_logits=True, + return_transition_probs=False, + transition_probs_in_logits=True, + make_one_hot=True, + epsilon=1e-20, + step_size=1, + ): + """Samples from q(x_{t+1} | x_0), then computes q(x_t | x_{t+1}, x_0). + + Args: + x_0: an array containing x_0 samples. These are expected to be integral + unless make_one_hot is False (in which case probabilities can be + provided). + t: the timestep to compute (as an int or integer array with shape that + matches x_0. + samples: if not None, use these samples to compute the posterior. + transition_probs: precomputed transition probabilities. + return_logits: if True, returns the (noisy) log of the probabilities. + return_transition_probs: if true, returns the transition probs as well. + transition_probs_in_logits: include transition probs in logits. + make_one_hot: if True, will convert the input to a one_hot vector. + epsilon: a small amount of noise to add to logits if needed. + step_size: if provided, computes q(x_{t + step_size} | x_0), etc. This is + used to sample fewer steps for ELBO evaluation on a longer trained + model. + + Returns: + a list of samples with the same shape as x_0 and the associated posterior + probabilities (or logits). + """ + + +class DiscreteDiffusionMatrixBase(DiscreteDiffusionBase): + """Base class for all matrix-noise schedulers.""" + + num_steps: int + dim: int + precision: Any = "float32" + + def get(self, t): + """Returns the transition matrix q(x_{t+1} | x_t).""" + raise NotImplementedError + + def custom_product_fn(self, t): + """Returns q(x_t | x_0), the product of the first t matrices.""" + raise NotImplementedError + + def supports_efficient_get(self): + """Returns true if get() is implemented/efficient.""" + return False + + def supports_efficient_inference(self): + """Returns true if custom_product_fn is implemented. + + The ontology of efficient_get and efficient_inference is this: + * if efficient_inference is enabled, it is used to return q(x_t | x_0) + without computing expensive products. + * if efficient_get is enabled, get(...) is used to get the posterior of + q(x_{t-1} | x_t, x_0). If not, get_q_given_q0 is called to get + q(x_{t+1} | x_0), and qt_reverse is called to get the q(x_{t+1} | x_t). + """ + return False + + def qt_reverse( + self, qt_plus_1, t, return_logits=False, make_one_hot=False, epsilon=1e-20 + ): + """Get q(x_{t+1} | x_t), for each possible value of x_t. Thus, the rows of the output do not sum to 1. + + Args: + qt_plus_1: an array of floats specifying a distribution over q(x_{t+1} | x_0). + t: t in q(x_{t+1} | x_t). + return_logits: if True, return the output logits + make_one_hot: if True, will convert q(x_{t+1}) to floats if needed. + epsilon: a small number to normalize logits conversion with, if needed. + + Returns: + q(x_{t+1} | x_t), shape [num_samples, num_classes]. + """ + raise NotImplementedError + + def get_qt_matrix(self, t): + """Returns the matrix Q = q(x_t | x_0) materialized over all x_0.""" + if self.supports_efficient_inference(): + return self.custom_product_fn(t) + + def product_fn(i, state): + return paddle.matmul(x=self.get(paddle.to_tensor(data=i)), y=state) + + val = paddle.eye(num_rows=self.dim) + for i in range(0, t): + val = product_fn(i, val) + return val + + def get_qt_given_q0( + self, q0, t, return_logits=False, make_one_hot=False, epsilon=1e-20 + ): + """Get q(x_t), the n-step posterior. + + For example, for t = 0, it returns q0 unchanged. + + Args: + q0: an array of floats specifying a distribution over p(x_0). + t: t in q(x_t | x_0). + return_logits: if True, return the output logits + make_one_hot: if True, will convert q0 to floats if needed. + epsilon: a small number to normalize logits conversion with, if needed. + + Returns: + q(x_t | x_0). + """ + if make_one_hot: + assert q0.dtype == "int64" or q0.dtype == "int32" + q0 = paddle.eye(num_rows=self.dim)[q0] + assert q0.dtype in ["float32", paddle.float32] + if self.supports_efficient_inference(): + prob_at_time_t = paddle.einsum( + "bij,bj->bi", self.get_qt_matrix(t).to(q0.dtype), q0 + ) + if return_logits: + return paddle.log(x=prob_at_time_t + epsilon) + else: + return prob_at_time_t + + @dataclasses.dataclass + class ScanState: + final_time: int + q: Any + + def product_fn(state, current_time): + cond = current_time < state.final_time + transition = self.get(current_time) + q_t_plus_1 = paddle.einsum("ij,sj->si", transition, state.q) + new_q = paddle.where(condition=cond[:, None], x=q_t_plus_1, y=state.q) + return ScanState(final_time=state.final_time, q=new_q), None + + init_val = ScanState(final_time=t, q=q0) + carry = init_val + idx = paddle.arange(end=self.num_steps) + for i in idx: + carry, _ = product_fn(carry, i) + final_state = carry + prob_at_time_t = final_state.q + if return_logits: + return paddle.log(x=prob_at_time_t + epsilon) + else: + return prob_at_time_t + + def sample_and_compute_posterior_q( + self, + x_0, + t, + samples=None, + transition_probs=None, + return_logits=True, + return_transition_probs=False, + transition_probs_in_logits=True, + make_one_hot=True, + epsilon=1e-20, + step_size=1, + ): + """Samples from q(x_{t+1} | x_0), then computes q(x_t | x_{t+1}, x_0). + + Args: + x_0: an array containing x_0 samples. These are expected to be integral + unless make_one_hot is False (in which case probabilities can be + provided). + t: the timestep to compute (as an int or integer array with shape that + matches x_0. + samples: if not None, use these samples to compute the posterior. + transition_probs: precomputed transition probabilities. + return_logits: if True, returns the (noisy) log of the probabilities. + return_transition_probs: if true, returns the transition probs as well. + transition_probs_in_logits: include transition probs in logits. + make_one_hot: if True, will convert the input to a one_hot vector. + epsilon: a small amount of noise to add to logits if needed. + step_size: if provided, computes q(x_{t + step_size} | x_0), etc. This is + used to sample fewer steps for ELBO evaluation on a longer trained + model. + + Returns: + a list of samples with the same shape as x_0 and the associated posterior + probabilities (or logits). + """ + dim = self.dim + device = x_0.place + if make_one_hot: + assert x_0.dtype in ["int64", "int32", paddle.int32, paddle.int64] + x_0 = paddle.eye(num_rows=dim)[x_0].reshape(tuple(x_0.shape) + (dim,)) + assert x_0.dtype in ["float32", paddle.float32] + assert t.dtype in ["int64", "int32", paddle.int32, paddle.int64] + prob_at_time_t = self.get_qt_given_q0(q0=x_0, t=t) + if self.supports_efficient_get(): + if step_size > 1: + transition_matrix = paddle.eye(num_rows=self.dim) + for i in range(step_size): + transition_matrix = self.get(t + i) @ transition_matrix + else: + transition_matrix = self.get(t) + prob_at_time_t_plus_one = paddle.einsum( + "bij,bj->bi", transition_matrix, prob_at_time_t + ) + else: + prob_at_time_t_plus_one = self.get_qt_given_q0(q0=x_0, t=t + step_size) + if samples is None and transition_probs is not None: + raise ValueError("samples were not provided but transition_probs were.") + if samples is None: + logits = paddle.log(x=prob_at_time_t_plus_one + epsilon) + samples = paddle.distribution.Categorical(logits=logits).sample() + if transition_probs is None: + if self.supports_efficient_get(): + transition_probs = transition_matrix[ + range(tuple(samples.shape)[0]), samples + ] + elif step_size > 1: + transition_probs = paddle.eye(num_rows=self.dim)[samples] + for i in range(step_size): + transition_probs = self.qt_reverse( + qt_plus_1=transition_probs, + make_one_hot=False, + t=t + step_size - 1 - i, + ) + else: + transition_probs = self.qt_reverse( + qt_plus_1=samples, make_one_hot=True, t=t + ) + if not transition_probs_in_logits and not return_logits: + raise ValueError( + "Cannot exclude transition probs from logits if return_logits is false." + ) + if return_logits: + posterior_logits = paddle.log(x=prob_at_time_t + epsilon) + if transition_probs_in_logits: + posterior_logits += paddle.log(x=transition_probs + epsilon) + if return_transition_probs: + return posterior_logits, samples, transition_probs + else: + return posterior_logits, samples + else: + posterior = transition_probs * prob_at_time_t + denominator = paddle.sum(denominator, axis=-1, keepdim=True) + + posterior = posterior / denominator + if return_transition_probs: + return posterior, samples, transition_probs + else: + return posterior, samples + + +class MaskDiffusion(DiscreteDiffusionMatrixBase): + """A simple schedule that diffuses away from the identity matrix.""" + + def __init__(self, dim, schedule, precision="float32", use_fast_inference=True): + """A simple scheduler for masking policies. + + Args: + dim: int, the dimensionality of the state space. + schedule: a DiffusionSchedule object for scheduling rates. + precision: matmul precision. + use_fast_inference: if False, uses a slower, brute force approach. + """ + self.num_steps = schedule.num_steps + self.schedule = schedule + self.use_fast_inference = use_fast_inference + self.precision = precision + self.dim = dim + self.state = self._create_state() + + def _create_state(self): + """Initializes values used by the get function.""" + betas = paddle.concat( + x=[ + paddle.to_tensor(data=[0.0]), + self.schedule(paddle.arange(end=self.num_steps)), + ] + ).to("float64") + alphas = 1 - betas + state = paddle.cumprod(x=alphas, dim=0) + state[-1] = 0.0 + return state.astype(dtype="float32") + + def supports_efficient_inference(self): + return self.use_fast_inference + + def stationary_probs(self, shape): + """Stationary distribution is one-hot at mask token.""" + sample = paddle.full(shape=shape, fill_value=self.dim - 1) + probs = paddle.eye(num_rows=self.dim)[sample] + return probs + + def sample_stationary(self, shape): + """Stationary distribution is one-hot at mask token.""" + return paddle.full(shape=shape, fill_value=self.dim - 1, dtype="int64") + + def custom_product_fn(self, t): + """Returns product of first n matrices. Only supported for beta constant.""" + dim = self.dim + if self.schedule.is_constant: + beta = self.schedule(0) + return (1 - beta) ** t * paddle.eye(num_rows=dim) + ( + 1 - (1 - beta) ** t + ) * self._get_mask() + else: + p = self.state[t] + return p * paddle.eye(num_rows=dim) + (1 - p) * self._get_mask() + + def _get_mask(self): + dim = self.dim + return paddle.ones(shape=(dim, dim)) * ( + paddle.arange(start=0, end=dim)[:, None] == dim - 1 + ).to("float32") + + def get(self, t): + _t = t if len(tuple(t.shape)) == 1 else t[None] + beta = self.schedule(_t) + dim = self.dim + ret = (1 - beta)[:, None, None] * paddle.eye(num_rows=dim)[None] + beta[ + :, None, None + ] * self._get_mask().to(_t.place)[None] + return ret if len(tuple(t.shape)) == 1 else ret.squeeze(axis=0) + + def qt_reverse( + self, qt_plus_1, t, return_logits=False, make_one_hot=False, epsilon=1e-20 + ): + """Get q(x_{t+1} | x_t), for each possible value of x_t. Thus, the rows of the output do not sum to 1. + + Args: + qt_plus_1: an array of floats specifying a distribution over q(x_{t+1} | x_0). + t: t in q(x_{t+1} | x_t). + return_logits: if True, return the output logits + make_one_hot: if True, will convert q(x_{t+1}) to floats if needed. + epsilon: a small number to normalize logits conversion with, if needed. + + Returns: + q(x_{t+1} | x_t), shape [num_samples, num_classes]. + """ + if make_one_hot: + assert qt_plus_1.dtype in ["int64", "int32", paddle.int32, paddle.int64] + qt_plus_1 = paddle.eye(num_rows=self.dim)[qt_plus_1] + assert qt_plus_1.dtype in ["float32", paddle.float32] + beta = self.schedule(t) + non_mask_prob = (1 - beta)[:, None] * qt_plus_1[:, :-1] + beta[ + :, None + ] * qt_plus_1[:, -1:] + prob_at_time_t = ( + paddle.eye(num_rows=self.dim)[self.dim - 1][None] * qt_plus_1[:, -1:] + ) + prob_at_time_t[:, :-1] = non_mask_prob + if return_logits: + return paddle.log(x=prob_at_time_t + epsilon) + else: + return prob_at_time_t + + def get_qt_given_q0( + self, q0, t, return_logits=False, make_one_hot=False, epsilon=1e-20 + ): + """Get q(x_t), the n-step posterior. + + Can do efficiently for masks. + + For example, for t = 0, it returns q0 unchanged. + + Args: + q0: an array of floats specifying a distribution over p(x_0). + t: t in q(x_t | x_0). + return_logits: if True, return the output logits + make_one_hot: if True, will convert q0 to floats if needed. + epsilon: a small number to normalize logits conversion with, if needed. + + Returns: + q(x_t | x_0). + """ + if not self.supports_efficient_inference(): + return super().get_qt_given_q0( + q0, + t, + return_logits=return_logits, + make_one_hot=make_one_hot, + epsilon=epsilon, + ) + if make_one_hot: + assert q0.dtype in ["int32", "int64", paddle.int32, paddle.int64] + q0 = paddle.eye(num_rows=self.dim)[q0] + assert q0.dtype in ["float32", paddle.float32] + assert len(tuple(q0.shape)) == 2 + p = self.state.to(q0.place)[t] + non_mask_prob = p[:, None] * q0[:, :-1] + mask_prob = 1 - non_mask_prob.sum(axis=-1) + prob_at_time_t = ( + mask_prob[:, None] * paddle.eye(num_rows=self.dim)[self.dim - 1][None] + ) + prob_at_time_t[:, :-1] = non_mask_prob + prob_at_time_t = paddle.where(condition=t[:, None] == 0, x=q0, y=prob_at_time_t) + if return_logits: + return paddle.log(x=prob_at_time_t + epsilon) + else: + return prob_at_time_t + + def supports_efficient_get(self): + return not self.use_fast_inference + + +def create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.1, num_steps=100, scale=1.0 +): + """Creates a callable schedule object to use for diffusion rates. + + Args: + kind: str, one of 'standard', 'linear', 'cosine', 'mutual_information'. If + standard, performs standard binomial diffusion taken from Sohl-Dicksteein + et al, ignoring betas. Otherwise, linear schedule between beta_min and + beta_max. + beta_min: the minimum beta. Ignored if kind == standard. + beta_max: the maximum beta. + num_steps: int, the number of steps to take. + scale: for standard schedule, rescales num_steps by this amount. + + Returns: + a DiffusionSchedule object. + """ + assert beta_min <= beta_max + assert num_steps > 0 + assert scale >= 1 + if kind == "standard": + + def schedule_fn(step: Union[int, paddle.Tensor]): + return 1 / (scale * num_steps - step) + + return DiffusionSchedule(schedule_fn, num_steps, is_constant=False) + elif kind == "linear": + is_constant = beta_min == beta_max + linspace = paddle.linspace(start=beta_min, stop=beta_max, num=num_steps) + + def schedule_fn(step: Union[int, paddle.Tensor]): + return linspace[step] + + return DiffusionSchedule(schedule_fn, num_steps, is_constant=is_constant) + elif kind == "cosine": + s = 0.008 + + def cosine_fn(step: paddle.Tensor): + return paddle.cos(x=(step / num_steps + s) / (1 + s) * numpy.pi / 2) + + def schedule_fn(step: Union[int, paddle.Tensor]): + if isinstance(step, int): + step = paddle.to_tensor(data=step) + return paddle.clip( + x=1 - cosine_fn(step + 1) / cosine_fn(step), min=0, max=0.999 + ) + + return DiffusionSchedule(schedule_fn, num_steps, is_constant=False) + else: + raise ValueError(f"kind {kind} is not supported.") + + +def p_forward( + denoise_fn, + x_t, + t, + diffusion, + predict_x0=True, + return_x0=False, + return_logits=False, + special_case_x0=False, + transition_probs=None, + transition_probs_in_logits=True, + maximum_likelihood=False, + epsilon=1e-20, + step_size=1, +): + """Returns probabilities from the reverse process p(x_{t-1} | x_t). + + Args: + denoise_fn: the reverse process. Must support embed, call, and attend. + x_t: the current value of x_t to condition on. + t: the timestep t. + diffusion: the Diffusion object to use for noise. + predict_x0: if True, assumes the model output corresponds to its prediction + for p(x_0 | x_t). Otherwise assumes model predicts p(x_{t-1} | x_t). + return_x0: if True, will return probs for x_0 as well as x_{t-1}. + return_logits: if True, will return logits instead of probabilities. + special_case_x0: if True, will directly predict x0 instead of using the + forward process probabilities. + transition_probs: if provided, q(x_{t+1} | x_t) probs to reuse. + transition_probs_in_logits: if False, will ignore transition probs in logits + (only allowed if return_logits is True). This is because this term is + independent of theta. + maximum_likelihood: if true, will draw the most likely x0 before applying + the forward process. + epsilon: a small number. + step_size: step size to compute posterior from. + + Returns: + probabilities for q(x_{t-1} | x_t) (and probabilities for x0 if predict_x0 + is True) + """ + assert not (step_size > 1 and not predict_x0) + logits = denoise_fn(targets=x_t, timestep=t) + probs = paddle.nn.functional.softmax(logits, axis=-1) + if not predict_x0: + retval = logits if return_logits else probs + if return_x0: + return retval, None + else: + return retval + if maximum_likelihood: + probs = probs.argmax(axis=-1) + qt_probs, _ = diffusion.sample_and_compute_posterior_q( + x_0=probs, + t=t - step_size, + make_one_hot=maximum_likelihood, + return_logits=return_logits, + transition_probs_in_logits=transition_probs_in_logits, + transition_probs=transition_probs, + samples=x_t, + epsilon=epsilon, + step_size=step_size, + ) + retval_x0 = logits if return_logits else probs + retval = qt_probs + mask = (t == step_size) & paddle.to_tensor(special_case_x0) + retval = mask[:, None].astype(retval_x0.dtype) * retval_x0 + mask.logical_not()[:, None].astype(retval.dtype) * retval + if return_x0: + return retval, retval_x0 + else: + return retval + + +def q_sample(x_start, t, diffusion, return_logits=False): + """Draws a sample from the posterior q(x_t | x_start).""" + assert x_start.dtype in ["int32", "int64", paddle.int32, paddle.int64] + dim = diffusion.dim + x_start = paddle.eye(num_rows=dim)[x_start] + logits = diffusion.get_qt_given_q0(q0=x_start, t=t, return_logits=True) + sample = paddle.distribution.Categorical(logits=logits).sample() + if return_logits: + return sample, logits + return sample + + +def compute_prior_kl(x_start, diffusion, target_mask=None): + """Computes KL divergence between q(x_T) and the true distribution.""" + assert x_start.dtype in ["int64", "int32", paddle.int32, paddle.int64] + num_steps = diffusion.num_steps + q_probs = diffusion.get_qt_given_q0( + q0=x_start, + t=paddle.to_tensor(data=[num_steps], place=x_start.place), + return_logits=False, + make_one_hot=True, + ) + p_probs = diffusion.stationary_probs(tuple(q_probs.shape)[:-1]).to(q_probs.place) + # todo: check this + eps = paddle.finfo(q_probs.dtype).eps + q_logits = paddle.log(x=q_probs.clip(min=eps, max=1 - eps)) + p_logits = paddle.log(x=p_probs.clip(min=eps, max=1 - eps)) + d1 = paddle.distribution.Categorical(logits=q_logits) + d2 = paddle.distribution.Categorical(logits=p_logits) + loss = paddle.distribution.kl_divergence(d1, d2) + if target_mask is not None: + loss = (loss * target_mask).sum() + else: + loss = loss.sum() + return loss + + +def compute_kl_reverse_process( + x_start: paddle.Tensor, + t: paddle.Tensor, + *, + x_t_plus_1: Optional[paddle.Tensor] = None, + diffusion: DiscreteDiffusionBase, + denoise_fn: Callable[[paddle.Tensor, paddle.Tensor], paddle.Tensor], + predict_x0: bool = True, + log_space: bool = False, + label_smoothing: float = 0.0, + hybrid_lambda: float = 0.0, + use_cached_transition: bool = True, + target_mask: Optional[paddle.Tensor] = None, + step_size: int = 1, +) -> Dict[str, paddle.Tensor]: + """Returns the KL for one term in the ELBO (time t) (loss L_t). + + This assumes x_start is a sample from x_0, from which we draw samples from + q(x_t | x_0) and then compute q(x_{t-1} | x_t, x_0) following the LaTeX. This + is the KL divergence for terms L_1 through L_{T-1}. + + Args: + x_start: a sample from p(data) (or q(x_0)). + t: the loss term to compute. + diffusion: the diffusion object to use. + denoise_fn: a functool.partial-ed version of the model_apply function which + takes a set of targets (x_t) and noise level and returns q(x_{t-1} | x_t, + x_0). + predict_x0: if True, will predict a distribution over x0 instead of x_{t-1}. + log_space: if True, will perform the loss calculations in log space. + label_smoothing: label smoothing for cross entropy. + hybrid_lambda: coefficient for hybrid cross-entropy loss. + use_cached_transition: if True, will reuse q(x_{t+1} | x_t) computation. + target_mask: mask for target sequence. + step_size: the step size over which the ELBO is computed. + + Returns: + the KL divergence and denominator. + """ + assert x_start.dtype in ["int32", "int64", paddle.int32, paddle.int64] + if step_size > 1 and not predict_x0: + raise ValueError("cannot skip steps when not predicting x0.") + q_t, x_t_plus_1, transition_probs = diffusion.sample_and_compute_posterior_q( + x_0=x_start, + t=t, + return_logits=log_space, + return_transition_probs=True, + step_size=step_size, + samples=x_t_plus_1, + ) + transition_probs = transition_probs if use_cached_transition else None + p_t = p_forward( + denoise_fn=denoise_fn, + x_t=x_t_plus_1, + t=t + step_size, + diffusion=diffusion, + predict_x0=predict_x0, + return_x0=predict_x0 and hybrid_lambda > 0.0, + return_logits=log_space, + transition_probs=transition_probs, + step_size=step_size, + ) + hybrid_loss = paddle.to_tensor(data=0.0, place=x_start.place) + if predict_x0 and hybrid_lambda > 0.0: + p_t, p_0 = p_t + if log_space: + cross_entropy = paddle.nn.functional.cross_entropy( + input=p_0, + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + else: + cross_entropy = paddle.nn.functional.cross_entropy( + input=(p_0 + 1e-07).log(), + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + hybrid_loss = hybrid_lambda * cross_entropy + assert not q_t.isnan().astype("bool").any() and not p_t.isnan().astype("bool").any() + if log_space: + d1 = paddle.distribution.Categorical(logits=q_t) + d2 = paddle.distribution.Categorical(logits=p_t) + kl = paddle.distribution.kl_divergence(p=d1, q=d2) + cross_entropy = paddle.nn.functional.cross_entropy( + input=p_t, label=x_start, label_smoothing=label_smoothing, reduction="none" + ) + else: + d1 = paddle.distribution.Categorical(logits=(q_t + 1e-07).log()) + d2 = paddle.distribution.Categorical(logits=(p_t + 1e-07).log()) + kl = paddle.distribution.kl_divergence(p=d1, q=d2) + cross_entropy = paddle.nn.functional.cross_entropy( + input=(p_t + 1e-07).log(), + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + if target_mask is not None: + kl = kl * target_mask + cross_entropy = cross_entropy * target_mask + hybrid_loss = hybrid_loss * target_mask + mask = t == 0 + base_loss = mask.astype(cross_entropy.dtype) * cross_entropy + mask.logical_not().astype(kl.dtype) * kl + loss = base_loss + hybrid_loss + denominator = paddle.to_tensor(data=1, place=x_start.place) + metrics_dict = { + "loss": loss, + "denominator": denominator, + "kl/hybrid_loss": hybrid_loss, + "kl/base_loss": base_loss, + "kl/cross_entropy_loss": cross_entropy, + "kl/t0_loss": mask.astype(cross_entropy.dtype) * cross_entropy, + "kl/kl_loss": kl, + } + return metrics_dict diff --git a/jointContribution/mattergen/mattergen/diffusion/d3pm/d3pm_predictors_correctors.py b/jointContribution/mattergen/mattergen/diffusion/d3pm/d3pm_predictors_correctors.py new file mode 100644 index 00000000..65152685 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/d3pm/d3pm_predictors_correctors.py @@ -0,0 +1,89 @@ +from typing import Optional, cast + +import paddle +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.d3pm_corruption import D3PMCorruption +from mattergen.diffusion.corruption.sde_lib import ScoreFunction +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.discrete_time import to_discrete_time +from mattergen.diffusion.sampling.predictors import Predictor +from mattergen.diffusion.sampling.predictors_correctors import SampleAndMean + + +class D3PMAncestralSamplingPredictor(Predictor): + """ + Ancestral sampling predictor for D3PM. + """ + + def __init__( + self, + *, + corruption: D3PMCorruption, + score_fn: ScoreFunction, + predict_x0: bool = True + ): + super().__init__(corruption=corruption, score_fn=score_fn) + self.predict_x0 = predict_x0 + + @classmethod + def is_compatible(cls, corruption: Corruption) -> bool: + return isinstance(corruption, D3PMCorruption) + + @property + def N(self) -> int: + self.corruption = cast(D3PMCorruption, self.corruption) + return self.corruption.N + + def update_given_score( + self, + *, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + batch: Optional[BatchedData] + ) -> SampleAndMean: + """ + Takes the atom coordinates, cell vectors and atom types at time t and + returns the atom types at time t-1, sampled using the learned reverse + atom diffusion model. + + Look at https://github.com/google-research/google-research/blob/master/d3pm/text/diffusion.py + + lines 3201-3229. NOTE: we do implement the taking the softmax of the initial + sample as per 3226-3227. This could be to avoid weird behaving for picking + initial states that happened to have very low probability in latent space. + Try adding if there proves to be a problem generating samples. + """ + t = to_discrete_time(t=t, N=self.N, T=self.corruption.T) + class_logits = score + assert isinstance(self.corruption, D3PMCorruption) + x_sample = self.corruption._to_non_zero_based( + paddle.distribution.Categorical(logits=class_logits).sample() + ) + class_probs = paddle.nn.functional.softmax(x=class_logits, axis=-1) + class_expected = self.corruption._to_non_zero_based( + paddle.argmax(x=class_probs, axis=-1) + ) + if self.predict_x0: + assert isinstance(self.corruption, D3PMCorruption) + class_logits, _ = self.corruption.d3pm.sample_and_compute_posterior_q( + x_0=class_probs, + t=t[batch_idx].to("int64"), + make_one_hot=False, + samples=self.corruption._to_zero_based(x), + return_logits=True, + ) + x_sample = self.corruption._to_non_zero_based( + paddle.distribution.Categorical(logits=class_logits).sample() + ) + class_expected = self.corruption._to_non_zero_based( + paddle.argmax( + x=paddle.nn.functional.softmax( + x=class_logits.to(class_probs.dtype), axis=-1 + ), + axis=-1, + ) + ) + return x_sample, class_expected diff --git a/jointContribution/mattergen/mattergen/diffusion/data/__init__.py b/jointContribution/mattergen/mattergen/diffusion/data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/data/batched_data.py b/jointContribution/mattergen/mattergen/diffusion/data/batched_data.py new file mode 100644 index 00000000..de5f089a --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/data/batched_data.py @@ -0,0 +1,190 @@ +from __future__ import annotations + +import logging +from copy import deepcopy +from dataclasses import dataclass, replace +from typing import Any, Mapping, Protocol, Sequence, TypeVar, runtime_checkable + +import paddle +from paddle_scatter import scatter + +T = TypeVar("T") +logger = logging.getLogger(__name__) + + +@runtime_checkable +class BatchedData(Protocol): + def replace(self: T, **vals: paddle.Tensor) -> T: + """Return a copy of self with some fields replaced with new values.""" + + def get_batch_idx(self, field_name: str): # -> (paddle.int64 | None): + """Get the batch index (i.e., which row belongs to which sample) for a given field. + For 'dense' type data, where every sample has the same shape and the first dimension is the + batch dimension, this method should return None. Mathematically, + returning None will be treated the same as returning a tensor [0, 1, 2, ..., batch_size - 1] + but I expect memory access in other functions to be more efficient if you return None. + """ + + def get_batch_size(self) -> int: + """Get the batch size.""" + + def device(self) -> (paddle.CPUPlace, paddle.CUDAPlace, str): + """Get the device of the batch.""" + + def __getitem__(self, field_name: str) -> paddle.Tensor: + """Get a field from the batch.""" + + def to(self: T, device: (paddle.CPUPlace, paddle.CUDAPlace, str)) -> T: + """Move the batch to a given device.""" + + def clone(self: T) -> T: + """Return a copy with all the tensors cloned.""" + + +@dataclass +class SimpleBatchedData(BatchedData): + """Implements BatchedData as a pair of mappings from field names to tensors.""" + + data: Mapping[str, Any] + batch_idx: Mapping[str, paddle.Tensor] + + def replace(self, **vals: paddle.Tensor) -> SimpleBatchedData: + """Return a copy of self with some fields of self.data replaced with new values.""" + return replace(self, data=self._updated_data(**vals)) + + def get_batch_idx(self, field_name: str): # -> (paddle.int64 | None): + return self.batch_idx[field_name] + + def _updated_data(self, **vals): + return dict(self.data, **vals) + + def __getitem__(self, key): + return self.data[key] + + def __contains__(self, key): + return key in self.data + + def get_batch_size(self) -> int: + L = [] + for k, v in self.batch_idx.items(): + if v is None: + d = self.data[k] + L.append(tuple(d.shape)[0] if isinstance(d, paddle.Tensor) else len(d)) + elif len(v) == 0: + logger.warning(f"Empty batch index for field {k}") + L.append(0) + else: + L.append(int(paddle.max(x=v).item()) + 1) + return max(L) + + @property + def device(self) -> (paddle.CPUPlace, paddle.CUDAPlace, str): + return next(v.place for v in self.data.values()) + + def to(self, device) -> "SimpleBatchedData": + """Modify self in-place to move all tensors to the given device, and return self""" + if isinstance(self.data, dict): + for k in self.data.keys(): + if isinstance(self.data[k], paddle.Tensor): + self.data[k] = self.data[k].to(device) + if isinstance(self.batch_idx, dict): + for key in self.batch_idx.keys(): + if self.batch_idx[key] is None: + continue + self.batch_idx[key] = self.batch_idx[key].to(device) + return self + + def clone(self) -> SimpleBatchedData: + return SimpleBatchedData( + data={ + k: (v.clone() if isinstance(v, paddle.Tensor) else deepcopy(v)) + for k, v in self.data.items() + }, + batch_idx={ + k: (v.clone() if v is not None else None) + for k, v in self.batch_idx.items() + }, + ) + + def to_data_list(self) -> list[dict[str, paddle.Tensor]]: + """Converts this instance to a list of dictionaries, each of which corresponds to a single datapoint in + `batched_data`. The keys of the dictionaries match the keys of `batched_data`. + """ + batch_size = self.get_batch_size() + if batch_size == 0: + return [] + + def _unpack(k, i): + if self.batch_idx[k] is not None: + return self.data[k][self.batch_idx[k] == i] + elif isinstance(self.data[k], paddle.Tensor): + return self.data[k][i : i + 1] + else: + return self.data[k][i] + + return [{k: _unpack(k, i) for k in self.data.keys()} for i in range(batch_size)] + + +def collate_fn( + states: list[dict[str, Any]], dense_field_names: Sequence[str] = () +) -> SimpleBatchedData: + """ + Combine a list of samples into a SimpleBatchedData object. + + The association between the index in `states[i][k]` and a row in the `batched_data[k]` is + stored in `batched_data.batch_idx[k]`. If the `k` appears in + `dense_field_names`, `batched_data.batch_idx[k]` is `None` and the data is + simply stacked along the first dimension. + + Non-tensor values are put into lists. + """ + assert states, "Cannot collate empty list" + concatenated_data = {} + batch_idx: dict[str, paddle.Tensor | None] = {} + for k, v in states[0].items(): + if isinstance(v, paddle.Tensor): + concatenated_data[k] = paddle.concat(x=[x[k] for x in states], axis=0) + if k in dense_field_names: + if any(tuple(x[k].shape)[0] != 1 for x in states): + raise ValueError( + f"First dimension should be batch dimension. Instead key {k} has shape {tuple(states[0][k].shape)}" + ) + batch_idx[k] = None + else: + batch_idx[k] = _construct_batch_idx(states, k) + else: + concatenated_data[k] = [x[k] for x in states] + batch_idx[k] = None + batch = SimpleBatchedData(data=concatenated_data, batch_idx=batch_idx) + if "edge_index" in batch.data: + batch = batch.replace( + edge_index=_batch_edge_index( + batch["edge_index"], + batch.batch_idx["atomic_numbers"], + batch.batch_idx["edge_index"], + ) + ) + return batch + + +def _batch_edge_index(edge_index, atom_batch_idx, edge_batch_idx): + num_atoms = scatter(paddle.ones_like(x=atom_batch_idx), atom_batch_idx) + num_atoms_acc = paddle.nn.functional.pad( + x=paddle.cumsum(x=num_atoms, axis=0)[:-1], + pad=[1, 0], + mode="constant", + value=0, + pad_from_left_axis=False, + ) + return edge_index + num_atoms_acc[edge_batch_idx].unsqueeze(axis=1) + + +def _construct_batch_idx(data_list: list[Any], field_name: str) -> paddle.int64: + """Construct batch index tensor for one field.""" + batch_size = len(data_list) + return paddle.repeat_interleave( + x=paddle.arange(start=0, end=batch_size), + repeats=paddle.to_tensor( + data=[tuple(x[field_name].shape)[0] for x in data_list] + ), + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/diffusion_module.py b/jointContribution/mattergen/mattergen/diffusion/diffusion_module.py new file mode 100644 index 00000000..aa4a2d21 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/diffusion_module.py @@ -0,0 +1,147 @@ +from typing import Any +from typing import Callable +from typing import TypeVar + +import paddle + +from mattergen.diffusion.corruption.multi_corruption import MultiCorruption +from mattergen.diffusion.corruption.multi_corruption import apply +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.losses import Loss +from mattergen.diffusion.model_target import ModelTarget +from mattergen.diffusion.model_utils import convert_model_out_to_score +from mattergen.diffusion.score_models.base import ScoreModel +from mattergen.diffusion.timestep_samplers import TimestepSampler +from mattergen.diffusion.timestep_samplers import UniformTimestepSampler + +T = TypeVar("T", bound=BatchedData) +BatchTransform = Callable[[T], T] + + +def identity(x: T) -> T: + return x + + +class DiffusionModule(paddle.nn.Layer): + """Denoising diffusion model for a multi-part state""" + + def __init__( + self, + model: ScoreModel[T], + corruption: MultiCorruption[T], + loss_fn: Loss, + pre_corruption_fn: BatchTransform | None = None, + timestep_sampler: TimestepSampler | None = None, + ) -> None: + super().__init__() + self.model = model + self.corruption = corruption + self.loss_fn = loss_fn + self.pre_corruption_fn = pre_corruption_fn or identity + self.model_targets = {k: ModelTarget(v) for k, v in loss_fn.model_targets.items()} # noqa + + self.timestep_sampler = timestep_sampler or UniformTimestepSampler( + min_t=1e-05, max_t=corruption.T + ) + self._register_corruption_modules() + + def _register_corruption_modules(self): + """ + Register corruptions that are instances of `paddle.nn.Layer`s for proper device, + parameter, etc handling. + """ + assert isinstance(self.corruption, MultiCorruption) + for idx, (key, _corruption) in enumerate(self.corruption._corruptions.items()): + if isinstance(_corruption, paddle.nn.Layer): + self.add_sublayer(name=f"MultiCorruption:{idx}:{key}", sublayer=_corruption) # noqa + + def calc_loss( + self, + batch: T, + node_is_unmasked=None, #: (paddle.int64 | None) = None todo: fix this + ) -> tuple[paddle.Tensor, dict[str, paddle.Tensor]]: + """ + Calculate loss and metrics given a batch of clean data which may include + context/conditioning fields. Add noise, predict score using score model, then + calculate loss. + + Args: + batch: batch of training data + node_is_unmasked: mask that has a value 1 for nodes that are included in + the loss, and a value of 0 for nodes that should be ignored. If None, all + nodes are included. + + Returns: + loss: the loss for the batch + metrics: a dictionary of metrics for the batch + """ + batch = batch["data"] + + batch = self.pre_corruption_fn(batch) + noisy_batch, t = self._corrupt_batch(batch) + + score_model_output = self.model(noisy_batch, t) + loss, metrics = self.loss_fn( + multi_corruption=self.corruption, + batch=batch, + noisy_batch=noisy_batch, + score_model_output=score_model_output, + t=t, + node_is_unmasked=node_is_unmasked, + ) + assert loss.size == 1 + return loss, metrics + + def _corrupt_batch(self, batch: T) -> tuple[T, paddle.Tensor]: + """ + Corrupt a batch of data for use in a training step: + - sample a different timestep for each sample in the batch + - add noise according to the corruption process + + Args: + batch: Batch of clean states + + Returns: + noisy_batch: batch of noisy samples + t: the timestep used for each sample in the batch + + """ + t = self.sample_timesteps(batch) + noisy_batch = self.corruption.sample_marginal(batch, t) + return noisy_batch, t + + def score_fn(self, x: T, t: paddle.Tensor) -> T: + """Calculate the score of a batch of data at a given timestep + + Args: + x: batch of data + t: timestep + + Returns: + score: score of the batch of data at the given timestep + """ + model_out: T = self.model(x, t) + fns = {k: convert_model_out_to_score for k in self.corruption.sdes.keys()} + scores = apply( + fns=fns, + model_out=model_out, + broadcast=dict(t=t, batch=x), + sde=self.corruption.sdes, + model_target=self.model_targets, + batch_idx=self.corruption._get_batch_indices(x), + ) + return model_out.replace(**scores) + + def sample_timesteps(self, batch: T) -> paddle.Tensor: + """Sample the timesteps, which will be used to determine how much noise + to add to data. + + Args: + batch: batch of data to be corrupted + + Returns: sampled timesteps + """ + return self.timestep_sampler(batch_size=batch.get_batch_size()) + + def forward(self, batch) -> Any: + return self.calc_loss(batch) diff --git a/jointContribution/mattergen/mattergen/diffusion/discrete_time.py b/jointContribution/mattergen/mattergen/diffusion/discrete_time.py new file mode 100644 index 00000000..397b2771 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/discrete_time.py @@ -0,0 +1,14 @@ +import paddle + + +def to_discrete_time(t: paddle.Tensor, N: int, T: float) -> paddle.int64: + """Convert continuous time to integer timestep. + + Args: + t: continuous time between 0 and T + N: number of timesteps + T: max time + Returns: + Integer timesteps between 0 and N-1 + """ + return (t * (N - 1) / T).astype(dtype="int64") diff --git a/jointContribution/mattergen/mattergen/diffusion/exceptions.py b/jointContribution/mattergen/mattergen/diffusion/exceptions.py new file mode 100644 index 00000000..449cba7d --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/exceptions.py @@ -0,0 +1,6 @@ +class IncompatibleSampler(ValueError): + pass + + +class AmbiguousConfig(ValueError): + pass diff --git a/jointContribution/mattergen/mattergen/diffusion/losses.py b/jointContribution/mattergen/mattergen/diffusion/losses.py new file mode 100644 index 00000000..419b04a0 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/losses.py @@ -0,0 +1,110 @@ +from functools import partial +from typing import Dict, Literal, Optional, Protocol, Tuple, TypeVar + +import paddle +from mattergen.diffusion.corruption.multi_corruption import (MultiCorruption, + apply) +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.model_target import ModelTargets +from mattergen.diffusion.training.field_loss import (FieldLoss, + denoising_score_matching) + +T = TypeVar("T", bound=BatchedData) + + +class Loss(Protocol[T]): + """Loss function for training a score model on multi-field data.""" + + def __call__( + self, + *, + multi_corruption: MultiCorruption[T], + batch: T, + noisy_batch: T, + score_model_output: T, + t: paddle.Tensor, + node_is_unmasked: Optional[paddle.Tensor] = None, + ) -> Tuple[paddle.Tensor, Dict[str, float]]: + pass + + """model_targets tells us what this loss function trains the score model to predict. + We need this information in order to convert the model output to a score during sampling. + """ + model_targets: ModelTargets + + +class SummedFieldLoss(Loss[T]): + """(Weighted) sum of different loss functions applied on each field.""" + + def __init__( + self, + loss_fns: Dict[str, FieldLoss], + model_targets: ModelTargets, + weights: Optional[Dict[str, float]] = None, + ) -> None: + self.model_targets = model_targets + self.loss_fns = loss_fns + if weights is None: + self.loss_weights = {k: (1.0) for k in self.loss_fns.keys()} + else: + assert set(weights.keys()) == set( + self.loss_fns.keys() + ), f"weight keys {set(weights.keys())} do not match loss_fns keys {set(self.loss_fns.keys())}" + self.loss_weights = weights + + def __call__( + self, + *, + multi_corruption: MultiCorruption[T], + batch: T, + noisy_batch: T, + score_model_output: T, + t: paddle.Tensor, + node_is_unmasked: Optional[paddle.Tensor] = None, + ) -> Tuple[paddle.Tensor, Dict[str, float]]: + batch_idx = {k: batch.get_batch_idx(k) for k in self.loss_fns.keys()} + node_is_unmasked = {k: node_is_unmasked for k in self.loss_fns.keys()} + loss_per_sample_per_field = apply( + fns=self.loss_fns, + corruption=multi_corruption.corruptions, + x=batch, + noisy_x=noisy_batch, + score_model_output=score_model_output, + batch_idx=batch_idx, + broadcast=dict(t=t, batch_size=batch.get_batch_size(), batch=batch), + node_is_unmasked=node_is_unmasked, + ) + assert set([tuple(v.shape) for v in loss_per_sample_per_field.values()]) == { + (batch.get_batch_size(),) + }, "All losses should have shape (batch_size,)." + scalar_loss_per_field = { + k: v.mean() for k, v in loss_per_sample_per_field.items() + } + metrics_dict = scalar_loss_per_field + agg_loss = paddle.stack( + x=[ + (self.loss_weights[k] * v) for k, v in loss_per_sample_per_field.items() + ], + axis=0, + ).sum(axis=0) + return agg_loss.mean(), metrics_dict + + +class DenoisingScoreMatchingLoss(SummedFieldLoss): + def __init__( + self, + model_targets: ModelTargets, + reduce: Literal["sum", "mean"] = "mean", + weights: Optional[Dict[str, float]] = None, + field_center_zero: Optional[Dict[str, bool]] = None, + ): + if field_center_zero is not None: + assert set(field_center_zero.keys()) == set(model_targets.keys()) + super().__init__( + loss_fns={ + k: partial(denoising_score_matching, reduce=reduce, model_target=v) + for k, v in model_targets.items() + }, + model_targets=model_targets, + weights=weights, + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/model_target.py b/jointContribution/mattergen/mattergen/diffusion/model_target.py new file mode 100644 index 00000000..37d04fde --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/model_target.py @@ -0,0 +1,13 @@ +from enum import Enum +from typing import Mapping, Union + + +class ModelTarget(Enum): + """Specifies what the score model is trained to predict. + Only relevant for fields that are corrupted with an SDE.""" + + score_times_std = "score_times_std" + logits = "logits" + + +ModelTargets = Mapping[str, Union[ModelTarget, str]] diff --git a/jointContribution/mattergen/mattergen/diffusion/model_utils.py b/jointContribution/mattergen/mattergen/diffusion/model_utils.py new file mode 100644 index 00000000..a544697b --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/model_utils.py @@ -0,0 +1,68 @@ +import math +from typing import Any, TypeVar + +import paddle +from mattergen.diffusion.corruption.sde_lib import SDE +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.model_target import ModelTarget + +T = TypeVar("T", bound=BatchedData) + + +def convert_model_out_to_score( + *, + model_target: ModelTarget, + sde: SDE, + model_out: paddle.Tensor, + batch_idx: paddle.Tensor, + t: paddle.Tensor, + batch: Any +) -> paddle.Tensor: + """ + Convert a model output to a score, according to the specified model_target. + + model_target: says what the model predicts. + For example, in RFDiffusion the model predicts clean coordinates; + in EDM the model predicts the raw noise. + sde: corruption process + model_out: model output + batch_idx: indicates which sample each row of model_out belongs to + noisy_x: noisy data + t: diffusion timestep + batch: noisy batch, ignored except by strange SDEs + """ + _, std = sde.marginal_prob( + x=paddle.ones_like(x=model_out), t=t, batch_idx=batch_idx, batch=batch + ) + if model_target == ModelTarget.score_times_std: + return model_out / std + elif model_target == ModelTarget.logits: + return model_out + else: + raise NotImplementedError + + +class NoiseLevelEncoding(paddle.nn.Layer): + """ + From: https://pytorch.org/tutorials/beginner/transformer_tutorial.html + """ + + def __init__(self, d_model: int, dropout: float = 0.0): + super().__init__() + self.dropout = paddle.nn.Dropout(p=dropout) + self.d_model = d_model + div_term = paddle.exp( + x=paddle.arange(start=0, end=d_model, step=2) + * (-math.log(10000.0) / d_model) + ) + self.register_buffer(name="div_term", tensor=div_term) + + def forward(self, t: paddle.Tensor) -> paddle.Tensor: + """ + Args: + t: Tensor, shape [batch_size] + """ + x = paddle.zeros(shape=(tuple(t.shape)[0], self.d_model)) + x[:, 0::2] = paddle.sin(x=t[:, None] * self.div_term[None]) + x[:, 1::2] = paddle.cos(x=t[:, None] * self.div_term[None]) + return self.dropout(x) diff --git a/jointContribution/mattergen/mattergen/diffusion/run.py b/jointContribution/mattergen/mattergen/diffusion/run.py new file mode 100644 index 00000000..91ba84fd --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/run.py @@ -0,0 +1,96 @@ +import os +import os.path as osp +import random +from typing import Mapping, TypeVar + +import numpy as np +import paddle +import paddle.distributed as dist +from hydra.utils import instantiate +from omegaconf import OmegaConf + +from mattergen.diffusion.trainer import TrainerDiffusion +from mattergen.utils import logger +from mattergen.common.data.utils import set_signal_handlers +from paddle_utils import * + +if dist.get_world_size() > 1: + dist.fleet.init(is_collective=True) + + +T = TypeVar("T") + + +def maybe_instantiate(instance_or_config: T | Mapping, expected_type=None, **kwargs) -> T: + """ + If instance_or_config is a mapping with a _target_ field, instantiate it. + Otherwise, return it as is. + """ + if isinstance(instance_or_config, Mapping) and "_target_" in instance_or_config: + instance = instantiate(instance_or_config, **kwargs) + else: + instance = instance_or_config + assert expected_type is None or isinstance( + instance, expected_type + ), f"Expected {expected_type}, got {type(instance)}" + return instance + + +def main(config, seed: int | None = None): + """ + Main entry point to train and evaluate a diffusion model. + + save_config: if True, the config will be saved both as a YAML file and in each + checkpoint. This doesn't work if the config contains things that can't be + `yaml.dump`-ed, so if you don't care about saving and loading checkpoints and want + to use a config that contains things like `paddle.nn.Layer`s already instantiated, + set this to False. + """ + + if dist.get_rank() == 0: + os.makedirs(config.trainer.output_dir, exist_ok=True) + OmegaConf.save(config, osp.join(config.trainer.output_dir, "config.yaml")) + + set_signal_handlers() + logger.init_logger( + log_file=osp.join(config.trainer.output_dir, f"{config.trainer.mode}.log") + ) + seed = seed or config.trainer.seed + if seed is not None: + paddle.seed(seed=seed) + np.random.seed(seed) + random.seed(seed) + logger.info(f"Seeding everything with {seed}") + + model = maybe_instantiate(config.lightning_module.diffusion_module) + datamodule = maybe_instantiate(config.data_module) + + optimizer_cfg = config.lightning_module.optimizer_partial + optimizer_cfg = OmegaConf.to_container(optimizer_cfg, resolve=True) + optimizer_cfg.update( + dict( + model_list=model, + epochs=config.trainer.max_epochs, + iters_per_epoch=len(datamodule.train_dataloader()), + ) + ) + + optimizer, lr_scheduler = maybe_instantiate(optimizer_cfg) + + trainer = TrainerDiffusion( + config=config, + model=model, + train_dataloader=datamodule.train_dataloader(), + val_dataloader=datamodule.val_dataloader(), + test_dataloader=datamodule.test_dataloader(), + optimizer=optimizer, + lr_scheduler=lr_scheduler, + ) + if config.trainer.mode == "train": + trainer.train() + elif config.trainer.mode == "eval": + if dist.get_rank == 0: + trainer.eval() + elif config.trainer.mode == "test": + if dist.get_rank == 0: + trainer.test() diff --git a/jointContribution/mattergen/mattergen/diffusion/sampling/__init__.py b/jointContribution/mattergen/mattergen/diffusion/sampling/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/sampling/classifier_free_guidance.py b/jointContribution/mattergen/mattergen/diffusion/sampling/classifier_free_guidance.py new file mode 100644 index 00000000..65d725c5 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/sampling/classifier_free_guidance.py @@ -0,0 +1,76 @@ +from typing import Callable + +import paddle +from mattergen.diffusion.sampling.pc_sampler import (Diffusable, + PredictorCorrector) + +BatchTransform = Callable[[Diffusable], Diffusable] + + +def identity(x: Diffusable) -> Diffusable: + """ + Default function that transforms data to its conditional state + """ + return x + + +class GuidedPredictorCorrector(PredictorCorrector): + """ + Sampler for classifier-free guidance. + """ + + def __init__( + self, + *, + guidance_scale: float, + remove_conditioning_fn: BatchTransform, + keep_conditioning_fn: (BatchTransform | None) = None, + **kwargs + ): + """ + guidance_scale: gamma in p_gamma(x|y)=p(x)p(y|x)**gamma for classifier-free guidance + remove_conditioning_fn: function that removes conditioning from the data + keep_conditioning_fn: function that will be applied to the data before evaluating the conditional score. For example, this function might drop some fields that you never want to condition on or add fields that indicate which conditions should be respected. + **kwargs: passed on to parent class constructor. + """ + super().__init__(**kwargs) + self._remove_conditioning_fn = remove_conditioning_fn + self._keep_conditioning_fn = keep_conditioning_fn or identity + self._guidance_scale = guidance_scale + + def _score_fn(self, x: Diffusable, t: paddle.Tensor) -> Diffusable: + """For each field, regardless of whether the corruption process is SDE or D3PM, we guide the score in the same way here, + by taking a linear combination of the conditional and unconditional score model output. + + For discrete fields, the score model outputs are interpreted as logits, so the linear combination here means we compute logits for + p_\\gamma(x|y)=p(x)^(1-\\gamma) p(x|y)^\\gamma + + """ + + def get_unconditional_score(): + return super(GuidedPredictorCorrector, self)._score_fn( + x=self._remove_conditioning_fn(x), t=t + ) + + def get_conditional_score(): + return super(GuidedPredictorCorrector, self)._score_fn( + x=self._keep_conditioning_fn(x), t=t + ) + + if abs(self._guidance_scale - 1) < 1e-15: + return get_conditional_score() + elif abs(self._guidance_scale) < 1e-15: + return get_unconditional_score() + else: + conditional_score = get_conditional_score() + unconditional_score = get_unconditional_score() + return unconditional_score.replace( + **{ + k: paddle.lerp( + x=unconditional_score[k], + y=conditional_score[k], + weight=self._guidance_scale, + ) + for k in self._multi_corruption.corrupted_fields + } + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/sampling/pc_partials.py b/jointContribution/mattergen/mattergen/diffusion/sampling/pc_partials.py new file mode 100644 index 00000000..11cf01c1 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/sampling/pc_partials.py @@ -0,0 +1,21 @@ +from typing import Protocol + +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.sde_lib import ScoreFunction +from mattergen.diffusion.sampling.predictors import Predictor +from mattergen.diffusion.sampling.predictors_correctors import \ + LangevinCorrector + + +class PredictorPartial(Protocol): + def __call__( + self, *, corruption: Corruption, score_fn: (ScoreFunction | None) + ) -> Predictor: + raise NotImplementedError + + +class CorrectorPartial(Protocol): + def __call__( + self, *, corruption: Corruption, n_steps: int, score_fn: (ScoreFunction | None) + ) -> LangevinCorrector: + raise NotImplementedError diff --git a/jointContribution/mattergen/mattergen/diffusion/sampling/pc_sampler.py b/jointContribution/mattergen/mattergen/diffusion/sampling/pc_sampler.py new file mode 100644 index 00000000..bfde6621 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/sampling/pc_sampler.py @@ -0,0 +1,285 @@ +from __future__ import annotations + +from typing import Generic, Mapping, Tuple, TypeVar + +import paddle +from mattergen.diffusion.corruption.multi_corruption import (MultiCorruption, + apply) +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.diffusion_module import DiffusionModule +# from mattergen.diffusion.lightning_module import DiffusionLightningModule +from mattergen.diffusion.sampling.pc_partials import (CorrectorPartial, + PredictorPartial) +from tqdm.auto import tqdm + +Diffusable = TypeVar("Diffusable", bound=BatchedData) +SampleAndMean = Tuple[Diffusable, Diffusable] +SampleAndMeanAndMaybeRecords = Tuple[Diffusable, Diffusable, list[Diffusable] | None] +SampleAndMeanAndRecords = Tuple[Diffusable, Diffusable, list[Diffusable]] + + +class PredictorCorrector(Generic[Diffusable]): + """Generates samples using predictor-corrector sampling.""" + + def __init__( + self, + *, + diffusion_module: DiffusionModule, + predictor_partials: (dict[str, PredictorPartial] | None) = None, + corrector_partials: (dict[str, CorrectorPartial] | None) = None, + device: (paddle.CPUPlace, paddle.CUDAPlace, str), + n_steps_corrector: int, + N: int, + eps_t: float = 0.001, + max_t: (float | None) = None + ): + """ + Args: + diffusion_module: diffusion module + predictor_partials: partials for constructing predictors. Keys are the names of the corruptions. + corrector_partials: partials for constructing correctors. Keys are the names of the corruptions. + device: device to run on + n_steps_corrector: number of corrector steps + N: number of noise levels + eps_t: diffusion time to stop denoising at + max_t: diffusion time to start denoising at. If None, defaults to the maximum diffusion time. You may want to start at T-0.01, say, for numerical stability. + """ + self._diffusion_module = diffusion_module + self.N = N + if max_t is None: + max_t = self._multi_corruption.T + assert max_t <= self._multi_corruption.T, "Denoising cannot start from beyond T" + self._max_t = max_t + assert ( + corrector_partials or predictor_partials + ), "Must specify at least one predictor or corrector" + corrector_partials = corrector_partials or {} + predictor_partials = predictor_partials or {} + if self._multi_corruption.discrete_corruptions: + assert set( + c.N for c in self._multi_corruption.discrete_corruptions.values() + ) == {N} + self._predictors = { + k: v(corruption=self._multi_corruption.corruptions[k], score_fn=None) + for k, v in predictor_partials.items() + } + self._correctors = { + k: v( + corruption=self._multi_corruption.corruptions[k], + n_steps=n_steps_corrector, + score_fn=None, + ) + for k, v in corrector_partials.items() + } + self._eps_t = eps_t + self._n_steps_corrector = n_steps_corrector + self._device = device + + @property + def diffusion_module(self) -> DiffusionModule: + return self._diffusion_module + + @property + def _multi_corruption(self) -> MultiCorruption: + return self._diffusion_module.corruption + + def _score_fn(self, x: Diffusable, t: paddle.Tensor) -> Diffusable: + return self._diffusion_module.score_fn(x, t) + + @classmethod + def from_pl_module( + cls, diffusion_module, **kwargs + ) -> PredictorCorrector: + device = diffusion_module.parameters()[0].place + return cls( + diffusion_module=diffusion_module, + device=device, + **kwargs + ) + + @paddle.no_grad() + def sample( + self, + conditioning_data: BatchedData, + mask: (Mapping[str, paddle.Tensor] | None) = None, + ) -> SampleAndMean: + """Create one sample for each of a batch of conditions. + Args: + conditioning_data: batched conditioning data. Even if you think you don't want conditioning, you still need to pass a batch of conditions + because the sampler uses these to determine the shapes of things to generate. + mask: for inpainting. Keys should be a subset of the keys in `data`. 1 indicates data that should be fixed, 0 indicates data that should be replaced with sampled values. + Shapes of values in `mask` must match the shapes of values in `conditioning_data`. + Returns: + (batch, mean_batch). The difference between these is that `mean_batch` has no noise added at the final denoising step. + + """ + return self._sample_maybe_record(conditioning_data, mask=mask, record=False)[:2] + + @paddle.no_grad() + def sample_with_record( + self, + conditioning_data: BatchedData, + mask: (Mapping[str, paddle.Tensor] | None) = None, + ) -> SampleAndMeanAndRecords: + """Create one sample for each of a batch of conditions. + Args: + conditioning_data: batched conditioning data. Even if you think you don't want conditioning, you still need to pass a batch of conditions + because the sampler uses these to determine the shapes of things to generate. + mask: for inpainting. Keys should be a subset of the keys in `data`. 1 indicates data that should be fixed, 0 indicates data that should be replaced with sampled values. + Shapes of values in `mask` must match the shapes of values in `conditioning_data`. + Returns: + (batch, mean_batch). The difference between these is that `mean_batch` has no noise added at the final denoising step. + + """ + return self._sample_maybe_record(conditioning_data, mask=mask, record=True) + + @paddle.no_grad() + def _sample_maybe_record( + self, + conditioning_data: BatchedData, + mask: (Mapping[str, paddle.Tensor] | None) = None, + record: bool = False, + ) -> SampleAndMeanAndMaybeRecords: + """Create one sample for each of a batch of conditions. + Args: + conditioning_data: batched conditioning data. Even if you think you don't want conditioning, you still need to pass a batch of conditions + because the sampler uses these to determine the shapes of things to generate. + mask: for inpainting. Keys should be a subset of the keys in `data`. 1 indicates data that should be fixed, 0 indicates data that should be replaced with sampled values. + Shapes of values in `mask` must match the shapes of values in `conditioning_data`. + Returns: + (batch, mean_batch, recorded_samples, recorded_predictions). + The difference between the former two is that `mean_batch` has no noise added at the final denoising step. + The latter two are only returned if `record` is True, and contain the samples and predictions from each step of the diffusion process. + + """ + if isinstance(self._diffusion_module, paddle.nn.Layer): + self._diffusion_module.eval() + mask = mask or {} + # conditioning_data = conditioning_data.to(self._device) + # mask = {k: v.to(self._device) for k, v in mask.items()} + batch = _sample_prior(self._multi_corruption, conditioning_data, mask=mask) + return self._denoise(batch=batch, mask=mask, record=record) + + @paddle.no_grad() + def _denoise( + self, batch: Diffusable, mask: dict[str, paddle.Tensor], record: bool = False + ) -> SampleAndMeanAndMaybeRecords: + """Denoise from a prior sample to a t=eps_t sample.""" + recorded_samples = None + if record: + recorded_samples = [] + for k in self._predictors: + mask.setdefault(k, None) + for k in self._correctors: + mask.setdefault(k, None) + mean_batch = batch.clone() + timesteps = paddle.linspace(start=self._max_t, stop=self._eps_t, num=self.N) + dt = -paddle.to_tensor(data=(self._max_t - self._eps_t) / (self.N - 1)).to( + self._device + ) + for i in tqdm(range(self.N), miniters=50, mininterval=5): + t = paddle.full(shape=(batch.get_batch_size(),), fill_value=timesteps[i]) + if self._correctors: + for _ in range(self._n_steps_corrector): + score = self._score_fn(batch, t) + fns = { + k: corrector.step_given_score + for k, corrector in self._correctors.items() + } + samples_means: dict[ + str, Tuple[paddle.Tensor, paddle.Tensor] + ] = apply( + fns=fns, + broadcast={"t": t}, + x=batch, + score=score, + batch_idx=self._multi_corruption._get_batch_indices(batch), + ) + if record: + recorded_samples.append(batch.clone().cpu()) + batch, mean_batch = _mask_replace( + samples_means=samples_means, + batch=batch, + mean_batch=mean_batch, + mask=mask, + ) + score = self._score_fn(batch, t) + predictor_fns = { + k: predictor.update_given_score + for k, predictor in self._predictors.items() + } + samples_means = apply( + fns=predictor_fns, + x=batch, + score=score, + broadcast=dict(t=t, batch=batch, dt=dt), + batch_idx=self._multi_corruption._get_batch_indices(batch), + ) + if record: + recorded_samples.append(batch.clone().cpu()) + batch, mean_batch = _mask_replace( + samples_means=samples_means, + batch=batch, + mean_batch=mean_batch, + mask=mask, + ) + return batch, mean_batch, recorded_samples + + +def _mask_replace( + samples_means: dict[str, Tuple[paddle.Tensor, paddle.Tensor]], + batch: BatchedData, + mean_batch: BatchedData, + mask: dict[str, paddle.Tensor | None], +) -> SampleAndMean: + samples_means = apply( + fns={k: _mask_both for k in samples_means}, + broadcast={}, + sample_and_mean=samples_means, + mask=mask, + old_x=batch, + ) + batch = batch.replace(**{k: v[0] for k, v in samples_means.items()}) + mean_batch = mean_batch.replace(**{k: v[1] for k, v in samples_means.items()}) + return batch, mean_batch + + +def _mask_both( + *, + sample_and_mean: Tuple[paddle.Tensor, paddle.Tensor], + old_x: paddle.Tensor, + mask: paddle.Tensor +) -> Tuple[paddle.Tensor, paddle.Tensor]: + return tuple(_mask(old_x=old_x, new_x=x, mask=mask) for x in sample_and_mean) + + +def _mask( + *, old_x: paddle.Tensor, new_x: paddle.Tensor, mask: (paddle.Tensor | None) +) -> paddle.Tensor: + """Replace new_x with old_x where mask is 1.""" + if mask is None: + return new_x + else: + return new_x.lerp(y=old_x, weight=mask) + + +def _sample_prior( + multi_corruption: MultiCorruption, + conditioning_data: BatchedData, + mask: (Mapping[str, paddle.Tensor] | None), +) -> BatchedData: + samples = { + k: multi_corruption.corruptions[k] + .prior_sampling( + shape=tuple(conditioning_data[k].shape), + conditioning_data=conditioning_data, + batch_idx=conditioning_data.get_batch_idx(field_name=k), + ) + .to(conditioning_data[k].place) + for k in multi_corruption.corruptions + } + mask = mask or {} + for k, msk in mask.items(): + if k in multi_corruption.corrupted_fields: + samples[k].lerp_(y=conditioning_data[k], weight=msk) + return conditioning_data.replace(**samples) diff --git a/jointContribution/mattergen/mattergen/diffusion/sampling/predictors.py b/jointContribution/mattergen/mattergen/diffusion/sampling/predictors.py new file mode 100644 index 00000000..a5cdafbd --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/sampling/predictors.py @@ -0,0 +1,148 @@ +import paddle + +"""Adapted from https://github.com/yang-song/score_sde_pytorch which is released under Apache license. + +Key changes: +- Introduced batch_idx argument to work with graph-like data (e.g. molecules) +- Introduced `..._given_score` methods so that multiple fields can be sampled at once using a shared score model. See PredictorCorrector for how this is used. +""" +import abc +import logging + +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.sde_lib import (SDE, ScoreFunction, + check_score_fn_defined) +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.sampling.predictors_correctors import (SampleAndMean, + Sampler) +from mattergen.diffusion.wrapped.wrapped_sde import WrappedSDEMixin + +logger = logging.getLogger(__name__) + + +class Predictor(Sampler): + """The abstract class for something that takes x_t and predicts x_{t-dt}, + where t is diffusion timestep.""" + + def __init__(self, corruption: Corruption, score_fn: (ScoreFunction | None)): + super().__init__(corruption, score_fn=score_fn) + + def update_fn( + self, + *, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + batch: (BatchedData | None), + ) -> SampleAndMean: + """One update of the predictor. + + Args: + x: current state + t: timesteps + batch_idx: indicates which sample each row of x belongs to + + Returns: + (sampled next state, mean next state) + """ + check_score_fn_defined(self.score_fn, "update_given_score") + assert self.score_fn is not None + score = self.score_fn(x=x, t=t, batch_idx=batch_idx) + return self.update_given_score( + x=x, t=t, dt=dt, batch_idx=batch_idx, score=score, batch=batch + ) + + @abc.abstractmethod + def update_given_score( + self, + *, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + batch: (BatchedData | None), + ) -> SampleAndMean: + pass + + +class AncestralSamplingPredictor(Predictor): + """Suitable for all linear SDEs. + + This predictor is derived by converting the score prediction to a prediction of x_0 given x_t, and then + sampling from the conditional distribution of x_{t-dt} given x_0 and x_t according to the corruption process. + It corresponds to equation (47) in Song et al. for VESDE (https://openreview.net/forum?id=PxTIG12RRHS) + and equation (7) in Ho et al. for VPSDE (https://arxiv.org/abs/2006.11239) + + In more detail: suppose the SDE has marginals x_t ~ N(alpha_t *x_0, sigma_t**2) + + We estimate x_0 as follows: + x_0 pprox (x_t + sigma_t^2 * score) / alpha_t + + For any s < t, the forward corruption process implies that + x_t| x_s ~ N(alpha_t/alpha_s * x_s, sigma_t^2 - sigma_s^2 * alpha_t^2 / alpha_s^2) + + Now go away and do some algebra to get the mean and variance of x_s given x_t + and x_0, and you will get the coefficients in the `update_given_score` method below. + + """ + + def update_given_score( + self, + *, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + batch: (BatchedData | None), + ) -> SampleAndMean: + x_coeff, score_coeff, std = self._get_coeffs( + x=x, t=t, dt=dt, batch_idx=batch_idx, batch=batch + ) + z = paddle.randn(shape=x_coeff.shape, dtype=x_coeff.dtype) + mean = x_coeff * x + score_coeff * score + sample = mean + std * z + return sample, mean + + def _get_coeffs(self, x, t, dt, batch_idx, batch): + """ + Compute coefficients for ancestral sampling. + This is in a separate method to make it easier to test.""" + sde = self.corruption + assert isinstance(sde, SDE) + s = t + dt + alpha_t, sigma_t = sde.mean_coeff_and_std( + x=x, t=t, batch_idx=batch_idx, batch=batch + ) + if batch_idx is None: + is_time_zero = s <= 0 + else: + is_time_zero = s[batch_idx] <= 0 + alpha_s, sigma_s = sde.mean_coeff_and_std( + x=x, t=s, batch_idx=batch_idx, batch=batch + ) + sigma_s[is_time_zero] = 0 + sigma2_t_given_s = sigma_t**2 - sigma_s**2 * alpha_t**2 / alpha_s**2 + sigma_t_given_s = paddle.sqrt(x=sigma2_t_given_s) + std = sigma_t_given_s * sigma_s / sigma_t + min_alpha_t_given_s = 0.001 + alpha_t_given_s = alpha_t / alpha_s + if paddle.any(x=alpha_t_given_s < min_alpha_t_given_s): + logger.warning( + f"Clipping alpha_t_given_s to {min_alpha_t_given_s} to avoid divide-by-zero. You should probably change something else to avoid this." + ) + alpha_t_given_s = paddle.clip( + x=alpha_t_given_s, min=min_alpha_t_given_s, max=1 + ) + score_coeff = sigma2_t_given_s / alpha_t_given_s + x_coeff = 1.0 / alpha_t_given_s + std[is_time_zero] = 0 + return x_coeff, score_coeff, std + + @classmethod + def is_compatible(cls, corruption: Corruption) -> bool: + return super().is_compatible(corruption) and not isinstance( + corruption, WrappedSDEMixin + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/sampling/predictors_correctors.py b/jointContribution/mattergen/mattergen/diffusion/sampling/predictors_correctors.py new file mode 100644 index 00000000..fe066017 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/sampling/predictors_correctors.py @@ -0,0 +1,117 @@ +import sys + + +import paddle +from paddle_utils import * + +"""Adapted from https://github.com/yang-song/score_sde_pytorch which is released under Apache license. + +Key changes: +- Introduced batch_idx argument to work with graph-like data (e.g. molecules) +- Introduced `..._given_score` methods so that multiple fields can be sampled at once using a shared score model. See PredictorCorrector for how this is used. +""" +import abc + +from mattergen.diffusion.corruption.corruption import maybe_expand +from mattergen.diffusion.corruption.sde_lib import (VESDE, VPSDE, BaseVPSDE, + Corruption, ScoreFunction) +from mattergen.diffusion.exceptions import IncompatibleSampler +from mattergen.diffusion.wrapped.wrapped_sde import WrappedSDEMixin +from paddle_scatter import scatter_add + +SampleAndMean = tuple[paddle.Tensor, paddle.Tensor] + + +class Sampler(abc.ABC): + def __init__(self, corruption: Corruption, score_fn: (ScoreFunction | None)): + if not self.is_compatible(corruption): + raise IncompatibleSampler( + f"{self.__class__.__name__} is not compatible with {corruption}" + ) + self.corruption = corruption + self.score_fn = score_fn + + @classmethod + def is_compatible(cls, corruption: Corruption) -> bool: + return True + + +class LangevinCorrector(Sampler): + def __init__( + self, + corruption: Corruption, + score_fn: (ScoreFunction | None), + n_steps: int, + snr: float = 0.2, + max_step_size: float = 1.0, + ): + """The Langevin corrector. + + Args: + corruption: corruption process + score_fn: score function + n_steps: number of Langevin steps at each noise level + snr: signal-to-noise ratio + max_step_size: largest coefficient that the score can be multiplied by for each Langevin step. + """ + super().__init__(corruption=corruption, score_fn=score_fn) + self.n_steps = n_steps + self.snr = snr + self.max_step_size = paddle.to_tensor(data=max_step_size) + + @classmethod + def is_compatible(cls, corruption: Corruption): + return ( + isinstance(corruption, (VESDE, BaseVPSDE)) + and super().is_compatible(corruption) + and not isinstance(corruption, WrappedSDEMixin) + ) + + def update_fn(self, *, x, t, batch_idx) -> SampleAndMean: + assert self.score_fn is not None, "Did you mean to use step_given_score?" + for _ in range(self.n_steps): + score = self.score_fn(x, t, batch_idx) + x, x_mean = self.step_given_score( + x=x, batch_idx=batch_idx, score=score, t=t + ) + return x, x_mean + + def get_alpha(self, t: paddle.Tensor) -> paddle.Tensor: + sde = self.corruption + if isinstance(sde, VPSDE): + alpha = 1 - sde.beta(t) * sde.T / 1000 + else: + alpha = paddle.ones_like(x=t) + return alpha + + def step_given_score( + self, *, x, batch_idx, #: (paddle.int64 | None), todo: fix this + score, t + ) -> SampleAndMean: + alpha = self.get_alpha(t) + snr = self.snr + noise = paddle.randn(shape=score.shape, dtype=score.dtype) + grad_norm_square = ( + paddle.square(x=score).reshape(tuple(score.shape)[0], -1).sum(axis=1) + ) + noise_norm_square = ( + paddle.square(x=noise).reshape(tuple(noise.shape)[0], -1).sum(axis=1) + ) + if batch_idx is None: + grad_norm = grad_norm_square.sqrt().mean() + noise_norm = noise_norm_square.sqrt().mean() + else: + grad_norm = paddle.sqrt( + x=scatter_add(grad_norm_square, dim=-1, index=batch_idx) + ).mean() + noise_norm = paddle.sqrt( + x=scatter_add(noise_norm_square, dim=-1, index=batch_idx) + ).mean() + step_size = (snr * noise_norm / grad_norm) ** 2 * 2 * alpha + step_size = paddle.minimum(x=step_size, y=self.max_step_size) + if grad_norm == 0: + step_size[:] = self.max_step_size + step_size = maybe_expand(step_size, batch_idx, score) + mean = x + step_size * score + x = mean + paddle.sqrt(x=step_size * 2) * noise + return x, mean diff --git a/jointContribution/mattergen/mattergen/diffusion/score_models/__init__.py b/jointContribution/mattergen/mattergen/diffusion/score_models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/score_models/base.py b/jointContribution/mattergen/mattergen/diffusion/score_models/base.py new file mode 100644 index 00000000..57e6413d --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/score_models/base.py @@ -0,0 +1,19 @@ +import abc +from typing import Generic, TypeVar + +import paddle +from mattergen.diffusion.data.batched_data import BatchedData + +Diffusable = TypeVar("Diffusable", bound=BatchedData) + + +class ScoreModel(paddle.nn.Layer, Generic[Diffusable], abc.ABC): + """Abstract base class for score models.""" + + @abc.abstractmethod + def forward(self, x: Diffusable, t: paddle.Tensor) -> Diffusable: + """Args: + x: batch of noisy data + t: timestep. Shape (batch_size, 1) + """ + ... diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/__init__.py b/jointContribution/mattergen/mattergen/diffusion/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/conftest.py b/jointContribution/mattergen/mattergen/diffusion/tests/conftest.py new file mode 100644 index 00000000..a83e35f1 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/conftest.py @@ -0,0 +1,111 @@ +import random +from functools import wraps +from typing import Callable, Dict, List + +import numpy +import paddle +import pytest +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.d3pm_corruption import D3PMCorruption +from mattergen.diffusion.corruption.sde_lib import SDE, VESDE, VPSDE +from mattergen.diffusion.data.batched_data import (BatchedData, + SimpleBatchedData, + collate_fn) +from mattergen.diffusion.sampling import predictors +from mattergen.diffusion.sampling import predictors_correctors as pc +from mattergen.diffusion.wrapped.wrapped_predictors_correctors import ( + WrappedAncestralSamplingPredictor, WrappedLangevinCorrector) +from mattergen.diffusion.wrapped.wrapped_sde import WrappedVESDE, WrappedVPSDE + +SDE_TYPES = [VPSDE, VESDE, WrappedVPSDE, WrappedVESDE] +DISCRETE_CORRUPTION_TYPES = [D3PMCorruption] +CORRUPTION_TYPES = SDE_TYPES + DISCRETE_CORRUPTION_TYPES +DEFAULT_PREDICTORS = [predictors.AncestralSamplingPredictor] +WRAPPED_PREDICTORS = [WrappedAncestralSamplingPredictor] +WRAPPED_CORRECTORS = [WrappedLangevinCorrector] +DEFAULT_CORRECTORS = [pc.LangevinCorrector] +DummyState = Dict[str, paddle.Tensor] + + +def seed_all(seed): + """Set the seed of all computational frameworks.""" + random.seed(seed) + numpy.random.seed(seed) + paddle.seed(seed=seed) + paddle.seed(seed=seed) + + +@pytest.fixture(autouse=True) +def seed_random_state(seed: int = 42): + """ + Fixture for seeding random states of every unit test. Is invoked automatically before each test. + + Args: + seed (int, optional): Random seed. Defaults to 42. + """ + seed_all(seed) + yield + + +@pytest.fixture +def EPS(): + return 1e-05 + + +def dummy_score_fn( + batch: SimpleBatchedData, t: paddle.Tensor, train: bool +) -> SimpleBatchedData: + return batch.replace(**{k: paddle.ones_like(x=batch[k]) for k in batch.data}) + + +@pytest.fixture +def diffusion_mocks(): + class Mocks: + DummyState = DummyState + dummy_score_fn = dummy_score_fn + + return Mocks + + +@pytest.fixture(scope="function") +def make_state_batch(): + def make_batch(sde_type): + return collate_fn([_make_sample(i) for i in range(0, 10)]) + + return make_batch + + +@pytest.fixture(scope="function") +def tiny_state_batch() -> BatchedData: + return collate_fn([_make_sample(i) for i in range(0, 10)]) + + +def _make_sample(bigness) -> DummyState: + foo_per_sample = 3 * (bigness + 1) + bar_per_sample = 1 * (bigness + 1) + return dict( + foo=paddle.randn(shape=[foo_per_sample, 3]), + bar=paddle.randn(shape=[bar_per_sample, 4]), + ) + + +@pytest.fixture +def get_multi_corruption(): + from mattergen.diffusion.corruption.multi_corruption import MultiCorruption + + def factory(corruption_type, keys: List[str]): + discrete_corruptions = { + k: corruption_type() + for k in keys + if issubclass(corruption_type, Corruption) + and not issubclass(corruption_type, SDE) + } + sdes = {k: corruption_type() for k in keys if issubclass(corruption_type, SDE)} + return MultiCorruption(sdes=sdes, discrete_corruptions=discrete_corruptions) + + return factory + + +@pytest.fixture +def dummy_state() -> DummyState: + return _make_sample(3) diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/data/__init__.py b/jointContribution/mattergen/mattergen/diffusion/tests/data/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/data/test_batched_data.py b/jointContribution/mattergen/mattergen/diffusion/tests/data/test_batched_data.py new file mode 100644 index 00000000..47d2424c --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/data/test_batched_data.py @@ -0,0 +1,45 @@ +import paddle +from mattergen.diffusion.data.batched_data import collate_fn + + +def test_collate_fn(): + """Collate two pieces of data""" + data1 = { + "a": paddle.to_tensor(data=[1, 2, 3, 4]), + "b": paddle.to_tensor(data=[[1, 2, 3]]), + "name": "data1", + } + data2 = { + "a": paddle.to_tensor(data=[10, 11]), + "b": paddle.to_tensor(data=[[10, 11, 12]]), + "name": "data2", + } + collated = collate_fn([data1, data2], dense_field_names=["b"]) + assert collated["a"].tolist() == [1, 2, 3, 4, 10, 11] + assert collated["b"].tolist() == [[1, 2, 3], [10, 11, 12]] + assert collated["name"] == ["data1", "data2"] + assert collated.get_batch_idx("a").tolist() == [0, 0, 0, 0, 1, 1] + assert collated.get_batch_idx("b") is None + assert collated.get_batch_idx("name") is None + + +def test_to_data_list(): + """Collate and then unpack two pieces of data.""" + data1 = { + "a": paddle.to_tensor(data=[1, 2, 3, 4]), + "b": paddle.to_tensor(data=[[1, 2, 3]]), + "name": "data1", + } + data2 = { + "a": paddle.to_tensor(data=[10, 11]), + "b": paddle.to_tensor(data=[[10, 11, 12]]), + "name": "data2", + } + collated = collate_fn([data1, data2], dense_field_names=["b"]) + data_list = collated.to_data_list() + assert data_list[0]["a"].tolist() == [1, 2, 3, 4] + assert data_list[0]["b"].tolist() == [[1, 2, 3]] + assert data_list[0]["name"] == "data1" + assert data_list[1]["a"].tolist() == [10, 11] + assert data_list[1]["b"].tolist() == [[10, 11, 12]] + assert data_list[1]["name"] == "data2" diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_d3pm.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_d3pm.py new file mode 100644 index 00000000..651e6f6b --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_d3pm.py @@ -0,0 +1,267 @@ +import paddle + +"""Tests for d3pm.py.""" +import functools + +import numpy as np +import pytest +from mattergen.diffusion.d3pm import d3pm as diffusion + + +@pytest.mark.parametrize("schedule_kind", ["linear", "standard", "cosine"]) +def test_prior_kl(schedule_kind: str): + """Test the prior KL computation.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind=schedule_kind, beta_min=0.001, beta_max=0.1, num_steps=1000 + ) + dim = 100 + num_samples = 71 + x_in = paddle.randint(low=0, high=dim, shape=(num_samples,)) + diff = diffusion.MaskDiffusion(dim=dim + 1, schedule=schedule) + prior_kl = diffusion.compute_prior_kl(x_in, diff) + assert paddle.isclose(x=prior_kl, y=paddle.to_tensor(data=0.0), atol=1e-05) + + +def test_product_the_hard_way(): + """Tests that the discrete transition matrices computed via q(x_t | x_0) and q(x_t|x_{t-1}) are equivalent + for t in {0, 1}. Uses the slow iterative method of computing the transition matrix q(x_t | x_0). + """ + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.001, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule, use_fast_inference=False) + assert not diff.supports_efficient_inference() + product = diff.get_qt_matrix(paddle.to_tensor(data=0)) + np.testing.assert_array_almost_equal(product, paddle.eye(num_rows=100)) + product = diff.get_qt_matrix(paddle.to_tensor(data=1)[None]) + np.testing.assert_array_almost_equal(product, diff.get(paddle.to_tensor(data=0))) + + +def test_product_fast(): + """Tests that the discrete transition matrices computed via q(x_t | x_0) and q(x_t|x_{t-1}) are equivalent + for t in {0, 1}. Uses the fast closed-form method of computing the transition matrix q(x_t | x_0). + """ + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.001, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule, use_fast_inference=True) + assert diff.supports_efficient_inference() + product = diff.get_qt_matrix(paddle.to_tensor(data=0)) + np.testing.assert_array_almost_equal(product, paddle.eye(num_rows=100)) + product = diff.get_qt_matrix(paddle.to_tensor(data=1)) + np.testing.assert_array_almost_equal(product, diff.get(paddle.to_tensor(data=0))) + + +def test_product_constant(): + """Tests, when we have a constant beta schedule (transition probabilities don't change over time), + whether the transition matrices computed via q(x_t | x_0) and q(x_t|x_{t-1}), and via explicit matrix + multiplication are equivalent.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.001, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule) + assert diff.supports_efficient_inference() + product = diff.get_qt_matrix(0) + np.testing.assert_array_almost_equal(product, paddle.eye(num_rows=100)) + product = diff.get_qt_matrix(1) + np.testing.assert_array_almost_equal(product, diff.get(paddle.to_tensor(data=0))) + product = diff.get_qt_matrix(10) + expected = np.linalg.matrix_power(diff.get(paddle.to_tensor(data=0)), 10) + np.testing.assert_array_almost_equal(product, expected) + + +def test_sample_and_posterior(): + """Tests whether the samples and posterior are as expected when providing timestep 0 for the sampling.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.001, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule) + inputs = paddle.ones(shape=(1,), dtype="int64") + probs, sample = diff.sample_and_compute_posterior_q( + inputs, paddle.to_tensor(data=[0]), return_logits=False + ) + assert tuple(probs.shape) == (1, 100) + assert paddle.allclose( + x=probs[0, 1], y=paddle.to_tensor(data=1.0), atol=1e-05 + ).item() + assert tuple(sample.shape) == (1,) + np.testing.assert_array_equal(sample, np.array([1])) + + +def test_compute_posterior(): + """Tests that the forward diffusion probabilities are correct for t=0.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.001, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule) + inputs = paddle.ones(shape=(2,), dtype="int64") + q_t = diff.get_qt_given_q0(inputs, paddle.to_tensor(data=[0, 0]), make_one_hot=True) + assert tuple(q_t.shape) == (2, 100) + assert paddle.allclose(x=q_t[0][1], y=paddle.to_tensor(data=1.0)).item() + assert paddle.allclose(x=q_t[0][0], y=paddle.to_tensor(data=0.0)).item() + + +def test_model(): + """Test the Diffusion noise diffusion.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind="standard", beta_min=0.001, beta_max=0.001, num_steps=100 + ) + dim = 100 + length = 100 + x0 = paddle.randint(low=0, high=dim, shape=(length,)) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule) + if hasattr(diffusion, "get"): + np.testing.assert_allclose(diff.get(0).sum(axis=0), 1.0, rtol=1e-06) + np.testing.assert_allclose(diff.get(10).sum(axis=0), 1.0, rtol=1e-06) + np.testing.assert_allclose(diff.get(99).sum(axis=0), 1.0, rtol=1e-06) + np.testing.assert_allclose( + diff.get_qt_matrix(0), paddle.eye(num_rows=100), rtol=1e-06 + ) + expected = paddle.eye(num_rows=dim)[x0] + result = diff.get_qt_given_q0( + q0=x0, t=paddle.to_tensor(data=[0]), make_one_hot=True + ) + np.testing.assert_allclose(result, expected) + expected = paddle.nn.functional.softmax(paddle.randn(shape=(length, dim)), axis=-1) + result = diff.get_qt_given_q0( + q0=expected, t=paddle.to_tensor(data=[0]), make_one_hot=False + ) + np.testing.assert_allclose(result, expected) + q0 = paddle.nn.functional.softmax(paddle.randn(shape=(length, dim)), axis=-1) + result = diff.get_qt_given_q0( + q0=q0, t=paddle.to_tensor(data=[0]), make_one_hot=False + ) + np.testing.assert_allclose(result.sum(axis=-1), 1.0, rtol=1e-06) + expected = diff.stationary_probs(tuple(x0.shape)) + result = diff.get_qt_given_q0( + q0=x0, t=paddle.to_tensor(data=[100]), make_one_hot=True + ) + np.testing.assert_allclose(result, expected) + + +def test_mask_diffusion(): + """Test the Diffusion noise diffusion.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.1, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim=100, schedule=schedule) + np.testing.assert_allclose( + diff.get(paddle.to_tensor(data=0)).sum(axis=0), 1.0, rtol=1e-06 + ) + np.testing.assert_allclose( + diff.get(paddle.to_tensor(data=10)).sum(axis=0), 1.0, rtol=1e-06 + ) + np.testing.assert_allclose( + diff.get(paddle.to_tensor(data=0))[0, 0], 1.0 - schedule(0), rtol=1e-06 + ) + np.testing.assert_allclose( + diff.get(paddle.to_tensor(data=1))[0, 0], 1.0 - schedule(1), rtol=1e-06 + ) + np.testing.assert_allclose( + diff.get_qt_matrix(0), paddle.eye(num_rows=100), rtol=1e-06 + ) + + +def test_mask_diffusion_slow_and_fast(): + """Compares fast and slow inference for mask diffusion.""" + schedule = diffusion.create_discrete_diffusion_schedule( + kind="standard", beta_min=0.0005, beta_max=0.05, num_steps=100 + ) + dim = 16 + length = 16 + fast_diff = diffusion.MaskDiffusion( + dim=dim, schedule=schedule, use_fast_inference=True + ) + slow_diff = diffusion.MaskDiffusion( + dim=dim, schedule=schedule, use_fast_inference=False + ) + x0 = paddle.randint(low=0, high=dim, shape=(length,)) + for _t in range(100): + t = paddle.to_tensor(data=[_t]).expand_as(y=x0) + _t_item = paddle.to_tensor(data=_t) + qt_slow = slow_diff.get_qt_matrix(_t_item) + qt_fast = fast_diff.get_qt_matrix(t) + np.testing.assert_array_almost_equal(qt_slow, qt_fast, decimal=3) + qt_slow = slow_diff.get_qt_given_q0(q0=x0, t=t, make_one_hot=True) + qt_fast = fast_diff.get_qt_given_q0(q0=x0, t=t, make_one_hot=True) + np.testing.assert_array_almost_equal(qt_slow, qt_fast, decimal=3) + np.testing.assert_array_almost_equal(qt_slow.sum(axis=-1), 1.0, decimal=3) + np.testing.assert_array_almost_equal(qt_fast.sum(axis=-1), 1.0, decimal=3) + paddle.seed(seed=234) + posterior_slow, samples_slow = slow_diff.sample_and_compute_posterior_q( + x_0=x0, t=t, make_one_hot=True + ) + paddle.seed(seed=234) + posterior_fast, samples_fast = fast_diff.sample_and_compute_posterior_q( + x_0=x0, t=t, make_one_hot=True + ) + np.testing.assert_array_almost_equal(posterior_slow, posterior_fast, decimal=3) + np.testing.assert_array_equal(samples_slow, samples_fast) + t_100 = paddle.to_tensor(data=[100]).expand_as(y=x0) + qt = fast_diff.get_qt_given_q0(q0=x0, t=t_100, make_one_hot=True) + np.testing.assert_allclose( + qt, + paddle.eye(num_rows=dim)[ + paddle.full(shape=tuple(x0.shape), fill_value=dim - 1) + ], + rtol=1e-06, + ) + qt = slow_diff.get_qt_given_q0(q0=x0, t=t_100, make_one_hot=True) + np.testing.assert_allclose( + qt, + paddle.eye(num_rows=dim)[ + paddle.full(shape=tuple(x0.shape), fill_value=dim - 1) + ], + rtol=1e-06, + ) + + +def test_large_matrices(): + """Tests precision for large matrices.""" + dim = 1000 + length = 64 + x0 = paddle.randint(low=0, high=dim, shape=(length,)) + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.0005, beta_max=0.05, num_steps=100 + ) + diff = diffusion.MaskDiffusion(dim, schedule, use_fast_inference=True) + fn = functools.partial(diff.get_qt_given_q0, make_one_hot=True) + result = fn(x0, paddle.to_tensor(data=[100])) + np.testing.assert_array_almost_equal(result.sum(axis=-1), 1.0) + + +def test_loss_computation(): + """Tests whether the loss computation uses the right terms (KL / cross-entropy) and broadcasts correctly.""" + paddle.seed(seed=234) + num_steps = 100 + num_classes = 7 + hybrid_lambda = 0.0 + schedule = diffusion.create_discrete_diffusion_schedule( + kind="linear", beta_min=0.001, beta_max=0.001, num_steps=num_steps + ) + t = paddle.arange(start=0, end=100) + diff = diffusion.MaskDiffusion(dim=num_classes, schedule=schedule) + inputs = paddle.ones(shape=(num_steps,), dtype="int64") + q_t_minus_one, x_t_samples = diff.sample_and_compute_posterior_q( + inputs, t, make_one_hot=True, return_logits=True + ) + + def denoise_fn(targets, timestep): + return q_t_minus_one + + loss_dict = diffusion.compute_kl_reverse_process( + x_start=inputs, + t=t, + x_t_plus_1=x_t_samples, + diffusion=diff, + denoise_fn=denoise_fn, + predict_x0=False, + hybrid_lambda=hybrid_lambda, + ) + loss = loss_dict.pop("loss") + kl_loss = loss_dict.pop("kl/kl_loss") + cross_entropy_loss = loss_dict.pop("kl/cross_entropy_loss") + assert tuple(loss.shape) == tuple(t.shape) + assert paddle.allclose(x=kl_loss[1:], y=loss[1:]).item() + assert paddle.allclose(x=cross_entropy_loss[:1], y=loss[:1]).item() + assert paddle.allclose(x=kl_loss, y=paddle.zeros_like(x=kl_loss), atol=1e-06).item() diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_data_utils.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_data_utils.py new file mode 100644 index 00000000..38ae35f8 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_data_utils.py @@ -0,0 +1,71 @@ +import paddle +from mattergen.diffusion.data.batched_data import (SimpleBatchedData, + _batch_edge_index, + collate_fn) + + +def test_collate_fn(): + state1 = dict(foo=paddle.ones(shape=[2, 3]), bar=paddle.ones(shape=[5, 2])) + state2 = dict(foo=paddle.zeros(shape=[3, 3]), bar=paddle.zeros(shape=[2, 2])) + batch = collate_fn([state1, state2]) + field_names = list(state1.keys()) + expected = SimpleBatchedData( + data=dict( + foo=paddle.to_tensor( + data=[ + [1.0, 1.0, 1.0], + [1.0, 1.0, 1.0], + [0.0, 0.0, 0.0], + [0.0, 0.0, 0.0], + [0.0, 0.0, 0.0], + ], + dtype="float32", + ), + bar=paddle.to_tensor( + data=[ + [1.0, 1.0], + [1.0, 1.0], + [1.0, 1.0], + [1.0, 1.0], + [1.0, 1.0], + [0.0, 0.0], + [0.0, 0.0], + ], + dtype="float32", + ), + ), + batch_idx={ + "foo": paddle.to_tensor(data=[0, 0, 1, 1, 1], dtype="int64"), + "bar": paddle.to_tensor(data=[0, 0, 0, 0, 0, 1, 1], dtype="int64"), + }, + ) + for k in field_names: + assert paddle.equal_all(x=batch[k], y=expected[k]).item() + assert paddle.equal_all( + x=batch.get_batch_idx(k), y=expected.get_batch_idx(k) + ).item() + assert batch.get_batch_size() == 2 + + +def test_batch_edge_index(): + edge_index = paddle.to_tensor( + data=[[0, 1], [0, 2], [1, 2], [0, 1], [0, 3], [1, 2], [2, 3], [0, 1], [1, 3]] + ) + atom_batch_idx = paddle.to_tensor(data=[0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2]) + edge_batch_idx = paddle.to_tensor(data=[0, 0, 0, 1, 1, 1, 1, 2, 2]) + assert paddle.allclose( + x=_batch_edge_index(edge_index, atom_batch_idx, edge_batch_idx), + y=paddle.to_tensor( + data=[ + [0, 1], + [0, 2], + [1, 2], + [2, 3], + [2, 5], + [3, 4], + [4, 5], + [7, 8], + [8, 10], + ] + ), + ).item(), "" diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_losses.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_losses.py new file mode 100644 index 00000000..0bd5403c --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_losses.py @@ -0,0 +1,191 @@ +from functools import partial +from typing import Dict, List, Type + +import paddle +import pytest +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.multi_corruption import (MultiCorruption, + apply) +from mattergen.diffusion.corruption.sde_lib import SDE +from mattergen.diffusion.data.batched_data import SimpleBatchedData +from mattergen.diffusion.losses import DenoisingScoreMatchingLoss +from mattergen.diffusion.tests.conftest import SDE_TYPES +from mattergen.diffusion.training.field_loss import ( + aggregate_per_sample, compute_noise_given_sample_and_corruption) +from mattergen.diffusion.wrapped.wrapped_normal_loss import wrapped_normal_loss +from mattergen.diffusion.wrapped.wrapped_sde import WrappedVESDE + + +def get_multi_corruption(corruption_type, keys: List[str]): + discrete_corruptions = { + k: corruption_type() + for k in keys + if issubclass(corruption_type, Corruption) + and not issubclass(corruption_type, SDE) + } + sdes = {k: corruption_type() for k in keys if issubclass(corruption_type, SDE)} + return MultiCorruption(sdes=sdes, discrete_corruptions=discrete_corruptions) + + +@pytest.mark.parametrize("corruption_type", SDE_TYPES) +def test_calc_loss(tiny_state_batch, corruption_type: Type[Corruption]): + """Check that calc_loss returns expected values for a few examples.""" + clean_batch = tiny_state_batch + multi_corruption = get_multi_corruption( + corruption_type=corruption_type, keys=["foo", "bar"] + ) + t = paddle.ones(shape=clean_batch.get_batch_size()) + noisy_batch = multi_corruption.sample_marginal(batch=clean_batch, t=t) + raw_noise = apply( + { + k: compute_noise_given_sample_and_corruption + for k in multi_corruption.corrupted_fields + }, + x=clean_batch, + x_noisy=noisy_batch, + corruption=multi_corruption.corruptions, + batch_idx=clean_batch.batch_idx, + broadcast={"t": t, "batch": clean_batch}, + ) + zero_scores = {k: paddle.zeros_like(x=v) for k, v in clean_batch.data.items()} + calc_loss = partial( + DenoisingScoreMatchingLoss(model_targets={"foo": "score_times_std"}), + multi_corruption=multi_corruption, + t=t, + batch=clean_batch, + ) + score_model_output = SimpleBatchedData( + data=zero_scores, batch_idx=clean_batch.batch_idx + ) + loss, _ = calc_loss(score_model_output=score_model_output, noisy_batch=noisy_batch) + target_loss = aggregate_per_sample( + raw_noise["foo"].pow(y=2), + batch_idx=clean_batch.batch_idx["foo"], + reduce="mean", + batch_size=clean_batch.get_batch_size(), + ).mean() + assert paddle.allclose(x=loss, y=target_loss).item(), "" + score_model_output = score_model_output.replace(bar=score_model_output["bar"] + 100) + loss_with_bad_bar, _ = calc_loss( + score_model_output=score_model_output, noisy_batch=noisy_batch + ) + assert paddle.allclose(x=loss, y=loss_with_bad_bar).item(), "" + raw_noise.update(foo=raw_noise["foo"] * 2) + mean, std = multi_corruption.corruptions["foo"].marginal_prob( + x=clean_batch["foo"], + t=t[clean_batch.batch_idx["foo"]], + batch_idx=clean_batch.batch_idx["foo"], + batch=clean_batch, + ) + noisy_batch = clean_batch.replace(foo=raw_noise["foo"] * std + mean) + loss, _ = calc_loss(score_model_output=score_model_output, noisy_batch=noisy_batch) + assert paddle.allclose(x=loss, y=target_loss * 4).item(), "" + + +@pytest.mark.parametrize("corruption_type", SDE_TYPES) +def test_weighted_summed_field_loss( + tiny_state_batch, corruption_type: Type[Corruption] +): + """Check that SummedFieldLoss returns expected values for a few examples.""" + clean_batch = tiny_state_batch + multi_corruption = get_multi_corruption( + corruption_type=corruption_type, keys=["foo", "bar"] + ) + zero_scores = {k: paddle.zeros_like(x=v) for k, v in clean_batch.data.items()} + score_model_output = SimpleBatchedData( + data=zero_scores, batch_idx=clean_batch.batch_idx + ) + t = paddle.ones(shape=clean_batch.get_batch_size()) + noisy_batch = multi_corruption.sample_marginal(batch=clean_batch, t=t) + weights = {"foo": 1.0, "bar": 2.9} + model_targets: Dict[str, str] = { + k: "score_times_std" for k in multi_corruption.corrupted_fields + } + unweighted_loss_fn = DenoisingScoreMatchingLoss(model_targets=model_targets) + weighted_loss_fn = DenoisingScoreMatchingLoss( + weights=weights, model_targets=model_targets + ) + unweighted_loss, unweighted_loss_per_field = unweighted_loss_fn( + batch=clean_batch, + multi_corruption=multi_corruption, + t=t, + score_model_output=score_model_output, + noisy_batch=noisy_batch, + ) + weighted_loss, weighted_loss_per_field = weighted_loss_fn( + batch=clean_batch, + multi_corruption=multi_corruption, + t=t, + score_model_output=score_model_output, + noisy_batch=noisy_batch, + ) + assert paddle.allclose( + x=weighted_loss, + y=unweighted_loss_per_field["foo"] * weights["foo"] + + unweighted_loss_per_field["bar"] * weights["bar"], + ).item(), "" + assert paddle.allclose( + x=paddle.stack( + x=[unweighted_loss_per_field[k] for k in unweighted_loss_per_field.keys()] + ), + y=paddle.stack( + x=[weighted_loss_per_field[k] for k in weighted_loss_per_field.keys()] + ), + ).item(), "" + assert paddle.allclose( + x=sum(weighted_loss_per_field.values()), y=unweighted_loss + ).item(), "" + + +def test_wrapped_normal_loss(tiny_state_batch): + clean_batch = tiny_state_batch.replace( + foo=tiny_state_batch["foo"] + 500, bar=tiny_state_batch["bar"][:, :3] + 500 + ) + fields = ["foo", "bar"] + multi_corruption: MultiCorruption = MultiCorruption( + sdes={k: WrappedVESDE(wrapping_boundary=1000.0, sigma_max=1.0) for k in fields} + ) + model_targets = {k: "score_times_std" for k in fields} + zero_scores = {k: paddle.zeros_like(x=v) for k, v in clean_batch.data.items()} + score_model_output = SimpleBatchedData( + data=zero_scores, batch_idx=clean_batch.batch_idx + ) + t = paddle.rand(shape=clean_batch.get_batch_size()) + noisy_batch = multi_corruption.sample_marginal(batch=clean_batch, t=t) + wrapped_loss_foo = wrapped_normal_loss( + corruption=multi_corruption.sdes["foo"], + score_model_output=score_model_output["foo"], + t=t, + batch_idx=clean_batch.get_batch_idx("foo"), + batch_size=clean_batch.get_batch_size(), + x=clean_batch["foo"], + noisy_x=noisy_batch["foo"], + batch=clean_batch, + reduce="mean", + ).mean() + wrapped_loss_bar = wrapped_normal_loss( + corruption=multi_corruption.sdes["bar"], + score_model_output=score_model_output["bar"], + t=t, + batch_idx=clean_batch.get_batch_idx("bar"), + batch_size=clean_batch.get_batch_size(), + x=clean_batch["bar"], + noisy_x=noisy_batch["bar"], + batch=clean_batch, + reduce="mean", + ).mean() + wrapped_loss = {"foo": wrapped_loss_foo, "bar": wrapped_loss_bar} + non_wrapped_loss_fn = DenoisingScoreMatchingLoss(model_targets=model_targets) + _, non_wrapped_loss_per_field = non_wrapped_loss_fn( + batch=clean_batch, + multi_corruption=multi_corruption, + t=t, + score_model_output=score_model_output, + noisy_batch=noisy_batch, + ) + assert paddle.allclose( + x=paddle.stack(x=[wrapped_loss[k] for k in wrapped_loss.keys()]), + y=paddle.stack( + x=[non_wrapped_loss_per_field[k] for k in non_wrapped_loss_per_field.keys()] + ), + ).item(), "" diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_model_utils.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_model_utils.py new file mode 100644 index 00000000..8ae29770 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_model_utils.py @@ -0,0 +1,33 @@ +from functools import partial + +import paddle +import pytest +from mattergen.diffusion.model_target import ModelTarget +from mattergen.diffusion.model_utils import convert_model_out_to_score +from mattergen.diffusion.tests.conftest import SDE_TYPES + + +@pytest.mark.parametrize("sde_type", SDE_TYPES) +def test_conversions_match(sde_type): + """Check that we get the same score whether the model output is interpreted as prediction of clean data, noise, or minus noise.""" + sde = sde_type() + t = paddle.linspace(start=0.1, stop=0.9, num=10) + clean = paddle.randn(shape=[10, 3]) + z = paddle.randn(shape=clean.shape, dtype=clean.dtype) + mean, std = sde.marginal_prob( + x=clean, t=t, batch_idx=paddle.arange(end=10), batch=None + ) + noisy = mean + std * z + _convert = partial( + convert_model_out_to_score, + sde=sde, + batch_idx=paddle.arange(end=10), + noisy_x=noisy, + t=t, + batch=None, + ) + score1 = _convert(model_target=ModelTarget.score_times_std, model_out=-z) + score2 = _convert(model_target=ModelTarget.noise, model_out=z) + score3 = _convert(model_target=ModelTarget.clean_data, model_out=clean) + assert paddle.allclose(x=score1, y=score2).item() + assert paddle.allclose(x=score1, y=score3, atol=0.0001).item() diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_multi_corruption.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_multi_corruption.py new file mode 100644 index 00000000..919f00e9 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_multi_corruption.py @@ -0,0 +1,30 @@ +from typing import Any, Dict, Type + +import paddle +import pytest +from mattergen.diffusion.corruption.multi_corruption import MultiCorruption +from mattergen.diffusion.corruption.sde_lib import SDE +from mattergen.diffusion.tests.conftest import SDE_TYPES + + +@pytest.mark.parametrize("corruption_type", SDE_TYPES) +def test_multi_corruption( + corruption_type: Type[SDE], tiny_state_batch, diffusion_mocks, get_multi_corruption +): + multi_corruption = get_multi_corruption( + corruption_type=corruption_type, keys=["foo", "bar"] + ) + t = paddle.rand(shape=tiny_state_batch.get_batch_size()) + _check_keys_shapes(multi_corruption=multi_corruption, batch=tiny_state_batch, t=t) + + +def _check_keys_shapes(multi_corruption: MultiCorruption, batch, t: paddle.Tensor): + drifts_diffusions = multi_corruption.sde(batch=batch, t=t) + _assert_keys(drifts_diffusions) + for k, (drift, diffusion) in drifts_diffusions.items(): + assert tuple(drift.shape) == tuple(batch[k].shape) + assert tuple(diffusion.shape)[0] == tuple(batch[k].shape)[0] + + +def _assert_keys(d: Dict[str, Any]): + assert set(d.keys()) == {"foo", "bar"} diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_reverse_sampling.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_reverse_sampling.py new file mode 100644 index 00000000..8e18d3de --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_reverse_sampling.py @@ -0,0 +1,194 @@ +import sys + + +import paddle +from paddle_utils import * + +""" +This is an integeratation test of reverse sampling. For a known data distribution that +is Gaussian, we substitute the known ground truth score for an approximate model +prediction and reverse sample to check we retrieve correct moments of the data distribution. +""" +from argparse import Namespace +from contextlib import nullcontext +from functools import partial +from typing import List, Type + +import pytest +from mattergen.diffusion.corruption.multi_corruption import MultiCorruption +from mattergen.diffusion.corruption.sde_lib import SDE +from mattergen.diffusion.data.batched_data import (BatchedData, + SimpleBatchedData) +from mattergen.diffusion.diffusion_module import DiffusionModule +from mattergen.diffusion.exceptions import IncompatibleSampler +from mattergen.diffusion.model_target import ModelTarget +from mattergen.diffusion.sampling.pc_sampler import PredictorCorrector +from mattergen.diffusion.tests.conftest import (DEFAULT_CORRECTORS, + DEFAULT_PREDICTORS, SDE_TYPES, + WRAPPED_CORRECTORS, + WRAPPED_PREDICTORS) +from mattergen.diffusion.tests.test_sampling import INCOMPATIBLE_SAMPLERS +from mattergen.diffusion.wrapped.wrapped_sde import WrappedVESDE, WrappedVPSDE + + +def score_given_xt( + x: BatchedData, + t: paddle.Tensor, + multi_corruption: MultiCorruption, + x0_mean: paddle.Tensor, + x0_std: paddle.Tensor, +) -> BatchedData: + def _score_times_std(x_t: paddle.Tensor, sde: SDE) -> paddle.Tensor: + a_t, s_t = sde.marginal_prob(x=paddle.ones_like(x=x_t), t=t) + mean = a_t * x0_mean + std = paddle.sqrt(x=a_t**2 * x0_std**2 + s_t**2) + score_times_std = -(x_t - mean) / std**2 * s_t + return score_times_std + + return x.replace( + **{ + k: _score_times_std(x_t=x[k], sde=multi_corruption.sdes[k]) + for k in multi_corruption.sdes.keys() + } + ) + + +def get_diffusion_module( + x0_mean, x0_std, multi_corruption: MultiCorruption +) -> DiffusionModule: + return DiffusionModule( + model=partial( + score_given_xt, + x0_mean=x0_mean, + x0_std=x0_std, + multi_corruption=multi_corruption, + ), + corruption=multi_corruption, + loss_fn=Namespace( + model_targets={ + k: ModelTarget.score_times_std for k in multi_corruption.sdes.keys() + } + ), + ) + + +predictor_corrector_pairs = [(p, None) for p in DEFAULT_PREDICTORS] + [ + (None, c) for c in DEFAULT_CORRECTORS +] + + +@pytest.mark.parametrize("predictor_type,corrector_type", predictor_corrector_pairs) +@pytest.mark.parametrize("corruption_type", SDE_TYPES) +def test_reverse_sampling( + corruption_type: Type, predictor_type: Type, corrector_type: Type +): + N = 1000 if corrector_type is None else 200 + if predictor_type is None and corrector_type is None: + return + fields = ["x", "y", "z", "a"] + batch_size = 10000 + x0_mean = paddle.to_tensor(data=-3.0) + x0_std = paddle.to_tensor(data=4.3) + multi_corruption: MultiCorruption = MultiCorruption( + sdes={f: corruption_type() for f in fields} + ) + with ( + pytest.raises(IncompatibleSampler) + if predictor_type in INCOMPATIBLE_SAMPLERS[corruption_type] + or corrector_type in INCOMPATIBLE_SAMPLERS[corruption_type] + else nullcontext() + ): + multi_sampler = PredictorCorrector( + diffusion_module=get_diffusion_module( + multi_corruption=multi_corruption, x0_mean=x0_mean, x0_std=x0_std + ), + device=paddle.CPUPlace(), + predictor_partials={} + if predictor_type is None + else {k: predictor_type for k in fields}, + corrector_partials={} + if corrector_type is None + else {k: corrector_type for k in fields}, + n_steps_corrector=5, + N=N, + eps_t=0.001, + max_t=None, + ) + conditioning_data = _get_conditioning_data(batch_size=batch_size, fields=fields) + samples, _ = multi_sampler.sample(conditioning_data=conditioning_data) + means = paddle.to_tensor( + data=[samples[k].mean() for k in multi_corruption.corruptions.keys()] + ) + stds = paddle.to_tensor( + data=[samples[k].std() for k in multi_corruption.corruptions.keys()] + ) + assert paddle.isclose(x=means.mean(), y=x0_mean, atol=0.1) + assert paddle.isclose(x=stds.mean(), y=x0_std, atol=0.1) + + +wrapped_pc_pairs = [(p, None) for p in WRAPPED_PREDICTORS] + [ + (None, c) for c in WRAPPED_CORRECTORS +] + + +@pytest.mark.parametrize("predictor_type, corrector_type", wrapped_pc_pairs) +@pytest.mark.parametrize("sde_type", [WrappedVESDE, WrappedVPSDE]) +def test_wrapped_reverse_sampling( + sde_type: Type, predictor_type: Type, corrector_type: Type +): + if predictor_type is None and corrector_type is None: + return + N = 50 + fields = ["x", "y", "z", "a"] + batch_size = 10000 + x0_mean = paddle.to_tensor(data=-2.0) + x0_std = paddle.to_tensor(data=2.3) + wrapping_boundary = -2.4 + empirical_samples = paddle.remainder( + x=paddle.randn(shape=batch_size) * x0_std + x0_mean, + y=paddle.to_tensor(wrapping_boundary), + ) + empirical_x0_mean = empirical_samples.mean() + empirical_x0_std = empirical_samples.std() + multi_corruption: MultiCorruption = MultiCorruption( + sdes={k: sde_type(wrapping_boundary=wrapping_boundary) for k in fields} + ) + predictor_partials = ( + {} if predictor_type is None else {k: predictor_type for k in fields} + ) + corrector_partials = ( + {} if corrector_type is None else {k: corrector_type for k in fields} + ) + n_steps_corrector = 5 + multi_sampler: PredictorCorrector = PredictorCorrector( + diffusion_module=get_diffusion_module( + x0_mean=x0_mean, x0_std=x0_std, multi_corruption=multi_corruption + ), + n_steps_corrector=n_steps_corrector, + predictor_partials=predictor_partials, + corrector_partials=corrector_partials, + device=None, + N=N, + ) + conditioning_data = _get_conditioning_data(batch_size=batch_size, fields=fields) + samples, _ = multi_sampler.sample(conditioning_data=conditioning_data, mask=None) + assert ( + min(samples[k].min() for k in multi_corruption.corruptions.keys()) + >= wrapping_boundary + ) + assert max(samples[k].max() for k in multi_corruption.corruptions.keys()) <= 0.0 + means = paddle.to_tensor( + data=[samples[k].mean() for k in multi_corruption.corruptions.keys()] + ) + stds = paddle.to_tensor( + data=[samples[k].std() for k in multi_corruption.corruptions.keys()] + ) + assert paddle.isclose(x=means.mean(), y=empirical_x0_mean, atol=0.1) + assert paddle.isclose(x=stds.mean(), y=empirical_x0_std, atol=0.1) + + +def _get_conditioning_data(batch_size: int, fields: List[str]) -> SimpleBatchedData: + return SimpleBatchedData( + data={k: paddle.randn(shape=[batch_size, 1]) for k in fields}, + batch_idx={k: None for k in fields}, + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_sampling.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_sampling.py new file mode 100644 index 00000000..37219d5b --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_sampling.py @@ -0,0 +1,106 @@ +from collections import defaultdict +from contextlib import nullcontext +from typing import Callable, Dict, List, Type, Union + +import paddle +import pytest +from mattergen.diffusion.corruption.sde_lib import SDE, VESDE, VPSDE +from mattergen.diffusion.d3pm.d3pm_predictors_correctors import \ + D3PMAncestralSamplingPredictor +from mattergen.diffusion.exceptions import IncompatibleSampler +from mattergen.diffusion.sampling import predictors_correctors as pc +from mattergen.diffusion.sampling.predictors import ( + AncestralSamplingPredictor, Predictor) +from mattergen.diffusion.tests.conftest import (DEFAULT_CORRECTORS, + DEFAULT_PREDICTORS, SDE_TYPES, + WRAPPED_CORRECTORS, + WRAPPED_PREDICTORS) +from mattergen.diffusion.wrapped.wrapped_predictors_correctors import ( + WrappedAncestralSamplingPredictor, WrappedLangevinCorrector) +from mattergen.diffusion.wrapped.wrapped_sde import WrappedVESDE, WrappedVPSDE + +D3PM_SAMPLERS = [D3PMAncestralSamplingPredictor] +INCOMPATIBLE_SAMPLERS: Dict[ + Type[SDE], List[Type[Union[Predictor, pc.LangevinCorrector]]] +] = defaultdict(list) +INCOMPATIBLE_SAMPLERS[VPSDE] = [ + WrappedLangevinCorrector, + WrappedAncestralSamplingPredictor, + *D3PM_SAMPLERS, +] +INCOMPATIBLE_SAMPLERS[VESDE] = [ + WrappedLangevinCorrector, + WrappedAncestralSamplingPredictor, + *D3PM_SAMPLERS, +] +INCOMPATIBLE_SAMPLERS[WrappedVPSDE] = [ + AncestralSamplingPredictor, + pc.LangevinCorrector, + *D3PM_SAMPLERS, +] +INCOMPATIBLE_SAMPLERS[WrappedVESDE] = [ + AncestralSamplingPredictor, + pc.LangevinCorrector, + *D3PM_SAMPLERS, +] + + +@pytest.mark.parametrize("predictor_type", DEFAULT_PREDICTORS + WRAPPED_PREDICTORS) +@pytest.mark.parametrize("sde_type", SDE_TYPES) +def test_predictor( + make_state_batch: Callable, predictor_type: Type, sde_type, EPS: float +): + """Tests whether implemented predictors return arrays of consistent + graph shape + """ + tiny_state_batch = make_state_batch(sde_type) + with ( + pytest.raises(IncompatibleSampler) + if predictor_type in INCOMPATIBLE_SAMPLERS[sde_type] + else nullcontext() + ): + sde = sde_type() + batch_size = tiny_state_batch.get_batch_size() + t = paddle.rand(shape=batch_size) * (sde.T - EPS) + EPS + old_x: paddle.Tensor = tiny_state_batch["foo"] + pr: Predictor = predictor_type(corruption=sde, score_fn=dummy_score_fn) + dt = paddle.to_tensor(data=-(sde.T - EPS) / 50) + x, x_mean = pr.update_fn( + x=old_x, + t=t, + dt=dt, + batch_idx=tiny_state_batch.get_batch_idx("foo"), + batch=tiny_state_batch, + ) + assert tuple(x.shape) == tuple(x_mean.shape) == tuple(old_x.shape) + + +def dummy_score_fn(x, t, batch_idx): + score = paddle.zeros(shape=tuple(x.shape)[:2]) + return score + + +@pytest.mark.parametrize("corrector_type", DEFAULT_CORRECTORS + WRAPPED_CORRECTORS) +@pytest.mark.parametrize("sde_type", SDE_TYPES) +def test_corrector( + make_state_batch: Callable, corrector_type: Type, sde_type, EPS: float +): + """Tests whether implemented correctors return arrays of consistent + graph shape + """ + tiny_state_batch = make_state_batch(sde_type) + with ( + pytest.raises(IncompatibleSampler) + if corrector_type in INCOMPATIBLE_SAMPLERS[sde_type] + else nullcontext() + ): + sde = sde_type() + t = paddle.rand(shape=tiny_state_batch.get_batch_size()) * (sde.T - EPS) + EPS + old_x: paddle.Tensor = tiny_state_batch["foo"] + corrector: pc.LangevinCorrector = corrector_type( + sde, score_fn=dummy_score_fn, n_steps=5 + ) + x, x_mean = corrector.update_fn( + x=old_x, t=t, batch_idx=tiny_state_batch.get_batch_idx("foo") + ) + assert tuple(x.shape) == tuple(x_mean.shape) == tuple(old_x.shape) diff --git a/jointContribution/mattergen/mattergen/diffusion/tests/test_sde_lib.py b/jointContribution/mattergen/mattergen/diffusion/tests/test_sde_lib.py new file mode 100644 index 00000000..ff9a45ff --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/tests/test_sde_lib.py @@ -0,0 +1,44 @@ +from typing import Type + +import paddle +import pytest +from mattergen.diffusion.corruption.sde_lib import SDE +from mattergen.diffusion.tests.conftest import SDE_TYPES + + +def _check_batch_shape(x: paddle.Tensor, batch_size: paddle.Tensor): + """Checks sde outputs that should be (batch_size, )""" + assert len(tuple(x.shape)) == 1 + assert tuple(x.shape)[0] == batch_size + + +@pytest.mark.parametrize("sparse", [True, False]) +@pytest.mark.parametrize("sdetype", SDE_TYPES) +def test_sde(tiny_state_batch, sdetype: Type[SDE], sparse, EPS): + """Tests correct shapes for all methods of the SDE class""" + x: paddle.Tensor = tiny_state_batch["foo"] + sde: SDE = sdetype() + if sparse: + batch_size = tiny_state_batch.get_batch_size() + batch_idx = tiny_state_batch.get_batch_idx("foo") + else: + batch_size = tuple(x.shape)[0] + batch_idx = None + t = paddle.rand(shape=batch_size) * (sde.T - EPS) + EPS + + def _check_shapes(drift, diffusion): + assert tuple(drift.shape) == tuple(x.shape) + assert tuple(diffusion.shape)[0] == tuple(x.shape)[0] + + drift, diffusion = sde.sde(x, t, batch_idx) + _check_shapes(drift, diffusion) + mean, std = sde.marginal_prob(x, t, batch_idx) + _check_shapes(mean, std) + z = sde.prior_sampling(tuple(x.shape)) + assert tuple(z.shape) == tuple(x.shape) + prior_logp = sde.prior_logp(z, batch_idx=batch_idx) + _check_batch_shape(prior_logp, batch_size) + + +def dummy_score_fn(x, t, batch_idx): + return paddle.zeros_like(x=x) diff --git a/jointContribution/mattergen/mattergen/diffusion/timestep_samplers.py b/jointContribution/mattergen/mattergen/diffusion/timestep_samplers.py new file mode 100644 index 00000000..6513f2a0 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/timestep_samplers.py @@ -0,0 +1,34 @@ +from typing import Protocol + +import paddle +from mattergen.diffusion.corruption.sde_lib import SDE + + +class TimestepSampler(Protocol): + min_t: float + max_t: float + + def __call__( + self, batch_size: int, device: (paddle.CPUPlace, paddle.CUDAPlace, str) + ) -> paddle.float32: + raise NotImplementedError + + +class UniformTimestepSampler: + """Samples diffusion timesteps uniformly over the training time.""" + + def __init__(self, *, min_t: float, max_t: float): + """Initializes the sampler. + + Args: + min_t (float): Smallest timestep that will be seen during training. + max_t (float): Largest timestep that will be seen during training. + """ + super().__init__() + self.min_t = min_t + self.max_t = max_t + + def __call__( + self, batch_size: int, + ) -> paddle.float32: + return paddle.rand(shape=[batch_size]) * (self.max_t - self.min_t) + self.min_t diff --git a/jointContribution/mattergen/mattergen/diffusion/trainer.py b/jointContribution/mattergen/mattergen/diffusion/trainer.py new file mode 100644 index 00000000..7af7685c --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/trainer.py @@ -0,0 +1,407 @@ +from __future__ import annotations + +import time +from collections import defaultdict +from typing import Callable +from typing import Optional + +import paddle +import paddle.distributed as dist +from packaging import version +from paddle import nn +from paddle import optimizer as optim +from paddle.distributed import fleet + +from mattergen.utils import logger +from mattergen.utils import save_load + + +def scale_shared_grads(model): + """Divide the gradients of the layers that are shared across multiple + blocks + by the number the weights are shared for + """ + with paddle.no_grad(): + + def scale_grad(param, scale_factor): + if param.grad is None: + return + g_data = param.grad + new_grads = g_data / scale_factor + param.grad = new_grads # .copy_(new_grads) + + if isinstance(model, paddle.distributed.parallel.DataParallel): + model = model._layers + for layer, num_blocks in model.shared_parameters: + scale_grad(layer, num_blocks) + + +class TrainerDiffusion: + """Class used to handle training a diffusion model""" + + def __init__( + self, + config, + model: nn.Layer, + train_dataloader: Optional[paddle.io.DataLoader] = None, + val_dataloader: Optional[paddle.io.DataLoader] = None, + test_dataloader: Optional[paddle.io.DataLoader] = None, + optimizer: Optional[optim.Optimizer] = None, + metric_class: Optional[Callable] = None, + lr_scheduler: Optional[optim.lr.LRScheduler] = None, + ): + self.config = config + self.model = model + self.optimizer = optimizer + self.train_dataloader = train_dataloader + self.val_dataloader = val_dataloader + self.test_dataloader = test_dataloader + self.metric_class = metric_class + self.lr_scheduler = lr_scheduler + + # get config from config file + self.epochs = config.trainer.max_epochs + self.output_dir = config.trainer.output_dir + self.save_freq = config.trainer.save_freq + self.log_freq = config.trainer.log_freq + self.start_eval_epoch = config.trainer.start_eval_epoch + self.eval_freq = config.trainer.eval_freq + self.seed = config.trainer.seed + self.pretrained_model_path = config.trainer.pretrained_model_path + self.checkpoint_path = config.trainer.checkpoint_path + self.scale_grad = config.trainer.scale_grad + self.is_save_traj = config.trainer.is_save_traj + self.step_lr = config.trainer.step_lr + self.accumulate_grad_batches = config.trainer.accumulate_grad_batches if 'accumulate_grad_batches' in config.trainer else 1 + + if dist.get_rank() == 0: + logger.message(f'accumulate_grad_batches: {self.accumulate_grad_batches}') + + self.iters_per_epoch = len(self.train_dataloader) + + # if isinstance(self.lr_scheduler, paddle.optimizer.lr.ReduceOnPlateau): + # if ( + # self.config["Optimizer"]["lr"].get("indicator", "train_loss") + # == "eval_loss" + # ): + # assert self.eval_freq == 1, ( + # "ReduceOnPlateau only support eval_freq==1 when indicator=" + # "'eval_loss'" + # ) + # assert self.lr_scheduler.by_epoch is True, ( + # "ReduceOnPlateau only support by_epoch=True, when indicator=" + # "'eval_loss" + # ) + + self.rank = dist.get_rank() + self.world_size = dist.get_world_size() + # initialize distributed environment + if self.world_size > 1: + fleet.init(is_collective=True) + logger.warning( + f"Detected 'world_size'({self.world_size}) > 1, it is recommended to " + "scale up the learning rate and reduce the 'epochs' or " + "'iters_per_epoch' according to the 'world_size' both linearly if you " + "are training model." + ) + + # load pretrained model, usually used for transfer learning + if self.pretrained_model_path is not None: + save_load.load_pretrain(self.model, self.pretrained_model_path) + + # initialize an dict for tracking best metric during training + self.best_metric = { + "loss": float("inf"), + "epoch": 0, + } + # load model checkpoint, usually used for resume training + if self.checkpoint_path is not None: + if self.pretrained_model_path is not None: + logger.warning( + "Detected 'pretrained_model_path' is given, weights in which might" + " be overridden by weights loaded from given 'checkpoint_path'." + ) + loaded_metric = save_load.load_checkpoint( + self.checkpoint_path, + self.model, + self.optimizer, + ) + if isinstance(loaded_metric, dict): + self.best_metric.update(loaded_metric) + + # wrap model and optimizer to parallel object + if self.world_size > 1: + if isinstance(self.model, paddle.DataParallel): + raise ValueError( + "Given model is already wrapped by paddle.DataParallel." + "Please do not wrap your model with DataParallel " + "before 'Solver.__init__' and keep it's type as 'nn.Layer'." + ) + + self.model = fleet.distributed_model(self.model) + if self.optimizer is not None: + self.optimizer = fleet.distributed_optimizer(self.optimizer) + + self.global_step = 0 + self.log_paddle_version() + + def log_paddle_version(self): + # log paddlepaddle's version + if version.Version(paddle.__version__) != version.Version("0.0.0"): + paddle_version = paddle.__version__ + if version.Version(paddle.__version__) < version.Version("3.0.0"): + logger.warning( + f"Detected paddlepaddle version is '{paddle_version}', " + "currently it is recommended to use release 3.0 or develop version." + ) + else: + paddle_version = f"develop({paddle.version.commit[:7]})" + + logger.info(f"Using paddlepaddle {paddle_version}") + + @paddle.no_grad() + def eval_epoch(self, dataloader, epoch_id: int): + """Eval program for one epoch. + + Args: + epoch_id (int): Epoch id. + """ + reader_cost = 0.0 + batch_cost = 0.0 + reader_tic = time.perf_counter() + batch_tic = time.perf_counter() + self.model.eval() + total_loss = defaultdict(list) + data_length = len(dataloader) + for iter_id, batch_data in enumerate(dataloader): + reader_cost = time.perf_counter() - reader_tic + + loss, loss_dict = self.model(batch_data) + loss_dict["loss"] = loss + + for key, value in loss_dict.items(): + if isinstance(value, paddle.Tensor): + value = value.item() + total_loss[key].append(value) + + batch_cost = time.perf_counter() - batch_tic + if paddle.distributed.get_rank() == 0 and ( + iter_id % self.log_freq == 0 or iter_id == data_length - 1 + ): + msg = f"Epoch [{epoch_id}/{self.epochs}] " + msg += f"| Step: [{iter_id+1}/{data_length}]" + msg += f" | reader cost: {reader_cost:.5f}s" + msg += f" | batch cost: {batch_cost:.5f}s" + for k, v in loss_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() + if k == "loss": + msg += f" | {k}: {v:.5f}" + else: + msg += f" | {k}(loss): {v:.5f}" + logger.info(msg) + + batch_tic = time.perf_counter() + reader_tic = time.perf_counter() + + total_loss_avg = {k: sum(v) / len(v) for k, v in total_loss.items()} + + return total_loss_avg + + def train_epoch(self, dataloader, epoch_id: int): + """Train program for one epoch. + + Args: + epoch_id (int): Epoch id. + """ + reader_cost = 0.0 + batch_cost = 0.0 + reader_tic = time.perf_counter() + batch_tic = time.perf_counter() + self.model.train() + total_loss = defaultdict(list) + + data_length = len(dataloader) + for iter_id, batch_data in enumerate(dataloader): + reader_cost = time.perf_counter() - reader_tic + loss, loss_dict = self.model(batch_data) + + if self.accumulate_grad_batches > 1: + loss = loss / self.accumulate_grad_batches + loss_dict["loss"] = loss + + loss.backward() + # if self.scale_grad: + # scale_shared_grads(self.model) + + if (iter_id+1) % self.accumulate_grad_batches == 0 or (iter_id+1) == len(dataloader): + self.optimizer.step() + self.optimizer.clear_grad() + + for key, value in loss_dict.items(): + if isinstance(value, paddle.Tensor): + value = value.item() + total_loss[key].append(value) + + # if solver.world_size > 1: + # # fuse + allreduce manually before optimization if use DDP + no_sync + # # details in https://github.com/PaddlePaddle/Paddle/issues/48898#issuecomment-1343838622 + # hpu.fused_allreduce_gradients(list(self.model.parameters()), None) + # update learning rate by step + if self.lr_scheduler is not None and not self.lr_scheduler.by_epoch: + if isinstance(self.lr_scheduler, paddle.optimizer.lr.ReduceOnPlateau): + if ( + self.config.lightning_module.optimizer_partial.cfg.lr.get( + "indicator", "train_loss" + ) + == "train_loss" + ): + train_loss = loss_dict["loss"] + train_loss = paddle.to_tensor(train_loss) + if self.world_size > 1: + dist.all_reduce(train_loss) + train_loss = train_loss / self.world_size + self.lr_scheduler.step(train_loss) + else: + self.lr_scheduler.step() + + batch_cost = time.perf_counter() - batch_tic + # update and log training information + self.global_step += 1 + if paddle.distributed.get_rank() == 0 and ( + iter_id % self.log_freq == 0 or iter_id == data_length - 1 + ): + msg = f"Train: Epoch [{epoch_id}/{self.epochs}]" + msg += f" | Step: [{iter_id+1}/{data_length}]" + msg += f" | lr: {self.optimizer._learning_rate():.6f}".rstrip("0") + msg += f" | reader cost: {reader_cost:.5f}s" + msg += f" | batch cost: {batch_cost:.5f}s" + for k, v in loss_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() + if k == "loss": + msg += f" | {k}: {(v * self.accumulate_grad_batches):.5f}" + else: + msg += f" | {k}(loss): {v:.5f}" + logger.info(msg) + + batch_tic = time.perf_counter() + reader_tic = time.perf_counter() + + total_loss_avg = {k: sum(v) / len(v) for k, v in total_loss.items()} + + return total_loss_avg + + def train(self) -> None: + """Training.""" + self.global_step = self.best_metric["epoch"] * self.iters_per_epoch + self.max_steps = self.epochs * self.iters_per_epoch + + start_epoch = self.best_metric["epoch"] + 1 + + for epoch_id in range(start_epoch, self.epochs + 1): + train_loss_dict = self.train_epoch(self.train_dataloader, epoch_id) + + msg = f"Train: Epoch [{epoch_id}/{self.epochs}]" + for k, v in train_loss_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() + msg += f" | {k}: {v:.5f}" if k == "loss" else f" | {k}(loss): {v:.5f}" + logger.info(msg) + save_metric_dict = {"epoch": epoch_id} + if ( + epoch_id >= self.start_eval_epoch + and self.eval_freq > 0 + and epoch_id % self.eval_freq == 0 + and dist.get_rank() == 0 + ): + eval_loss_dict = self.eval_epoch(self.val_dataloader, epoch_id) + save_metric_dict.update(eval_loss_dict) + + msg = f"Eval: Epoch [{epoch_id}/{self.epochs}]" + for k, v in eval_loss_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() + if k == "loss": + msg += f" | {k}: {v:.5f}" + else: + msg += f" | {k}(loss): {v:.5f}" + logger.info(msg) + + # update best metric + if eval_loss_dict["loss"] <= self.best_metric["loss"]: + self.best_metric.update(eval_loss_dict) + self.best_metric["epoch"] = epoch_id + + save_load.save_checkpoint( + self.model, + self.optimizer, + self.best_metric, + output_dir=self.output_dir, + prefix="best", + ) + # update learning rate by epoch + if self.lr_scheduler is not None and self.lr_scheduler.by_epoch: + if isinstance(self.lr_scheduler, paddle.optimizer.lr.ReduceOnPlateau): + if ( + self.config.lightning_module.optimizer_partial.cfg.lr.get( + "indicator", "train_loss" + ) + == "train_loss" + ): + train_loss = train_loss_dict["loss"] + train_loss = paddle.to_tensor(train_loss) + if self.world_size > 1: + dist.all_reduce(train_loss) + train_loss = train_loss / self.world_size + self.lr_scheduler.step(train_loss) + else: + eval_loss = paddle.to_tensor(0.0) + if dist.get_rank() == 0: + eval_loss = paddle.to_tensor(eval_loss_dict["loss"]) + if self.world_size > 1: + for rank_id in range(self.world_size): + dist.broadcast(eval_loss, src=rank_id) + self.lr_scheduler.step(eval_loss) + else: + self.lr_scheduler.step() + + # save epoch model every save_freq epochs + if self.save_freq > 0 and epoch_id % self.save_freq == 0: + save_load.save_checkpoint( + self.model, + self.optimizer, + save_metric_dict, + output_dir=self.output_dir, + prefix=f"epoch_{epoch_id}", + ) + + # save the latest model for convenient resume training + save_load.save_checkpoint( + self.model, + self.optimizer, + save_metric_dict, + output_dir=self.output_dir, + prefix="latest", + print_log=(epoch_id == start_epoch), + ) + + def eval(self): + loss_dict = self.eval_epoch(self.val_dataloader, epoch_id=1) + msg = "Eval: " + for k, v in loss_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() + msg += f" | {k}: {v:.5f}" if k == "loss" else f" | {k}(loss): {v:.5f}" + logger.info(msg) + return loss_dict + + def test(self): + loss_dict = self.eval_epoch(self.test_dataloader, epoch_id=1) + msg = "Test: " + for k, v in loss_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() + msg += f" | {k}: {v:.5f}" if k == "loss" else f" | {k}(loss): {v:.5f}" + logger.info(msg) + return loss_dict diff --git a/jointContribution/mattergen/mattergen/diffusion/training/__init__.py b/jointContribution/mattergen/mattergen/diffusion/training/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/training/field_loss.py b/jointContribution/mattergen/mattergen/diffusion/training/field_loss.py new file mode 100644 index 00000000..249aaab6 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/training/field_loss.py @@ -0,0 +1,190 @@ +import sys + + +from typing import Literal, Protocol + +import paddle +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.corruption.sde_lib import maybe_expand +from mattergen.diffusion.d3pm.d3pm import compute_kl_reverse_process +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.discrete_time import to_discrete_time +from mattergen.diffusion.model_target import ModelTarget +from paddle_utils import * +from paddle_scatter import scatter + + +def compute_noise_given_sample_and_corruption( + x: paddle.Tensor, + x_noisy: paddle.Tensor, + corruption: Corruption, + t: paddle.Tensor, + batch_idx, #: (paddle.int64 | None), todo: fix this + batch: BatchedData, +) -> paddle.Tensor: + """ + Recover the (unit-Gaussian-distributed) raw noise that was used to corrupt a batch of samples. + We first obtain the mean and std of the noisy samples from the corruption via `t` and the clean batch. + Then we solve: + x_noisy = x_mean + noise * std w.r.t. `noise`: + noise = (x_noisy - x_mean) / std + """ + x_mean, std = corruption.marginal_prob(x, t=t, batch_idx=batch_idx, batch=batch) + return (x_noisy - x_mean) / std + + +class FieldLoss(Protocol): + """Loss function for a single field. Because loss functions are defined different ways in different papers, + we pass loads of keyword arguments. Each loss function will only use a subset of these arguments. + """ + + def __call__( + self, + *, + corruption: Corruption, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx, #: (paddle.int64 | None), todo: fix this + batch_size: int, + x: paddle.Tensor, + noisy_x: paddle.Tensor, + reduce: Literal["sum", "mean"], + batch: BatchedData, + ) -> paddle.Tensor: + """Calculate loss per sample for a single field. Returns a loss tensor of shape (batch_size,).""" + pass + + +def denoising_score_matching( + *, + corruption: Corruption, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx, #: (paddle.int64 | None), todo: fix this + batch_size: int, + x: paddle.Tensor, + noisy_x: paddle.Tensor, + reduce: Literal["sum", "mean"], + batch: BatchedData, + model_target: ModelTarget, + node_is_unmasked, #: (paddle.int64 | None) = None, todo: fix this + **_, +) -> paddle.Tensor: + """Mean square error in predicting raw noise, optionally reweighted.""" + assert score_model_output.ndim >= 2 + model_target = ModelTarget(model_target) + losses = get_losses( + corruption=corruption, + score_model_output=score_model_output, + t=t, + batch_idx=batch_idx, + x=x, + noisy_x=noisy_x, + batch=batch, + model_target=model_target, + ) + if node_is_unmasked is not None: + losses = node_is_unmasked.unsqueeze(axis=-1) * losses + original_reduce = reduce + reduce = "sum" + loss_per_sample = aggregate_per_sample( + losses, batch_idx, reduce=reduce, batch_size=batch_size + ) + if node_is_unmasked is not None and original_reduce == "mean": + nodes_per_sample = scatter(node_is_unmasked, batch_idx, dim=0, reduce="sum") + loss_per_sample /= nodes_per_sample + return loss_per_sample + + +def get_losses( + corruption: Corruption, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx, #: (paddle.int64 | None), fix this + x: paddle.Tensor, + noisy_x: paddle.Tensor, + batch: BatchedData, + model_target: ModelTarget, +) -> paddle.Tensor: + if model_target == ModelTarget.score_times_std: + raw_noise = compute_noise_given_sample_and_corruption( + x=x, + x_noisy=noisy_x, + corruption=corruption, + t=t, + batch_idx=batch_idx, + batch=batch, + ) + target = -raw_noise + losses = (score_model_output - target).square() + else: + raise ValueError(f"Unknown model_target {model_target}") + return losses + + +def aggregate_per_sample( + loss_per_row: paddle.Tensor, + batch_idx: (paddle.Tensor | None), + reduce: Literal["sum", "mean"], + batch_size: int, +): + """ + Aggregate (potentially) batched input tensor to get a scalar for each sample in the batch. + E.g., (num_atoms, d1, d2, ..., dn) -> (batch_size, d1, d2, ..., dn) -> (batch_size,), + where the first aggregation only happens when batch_idx is provided. + + Args: + loss_per_row: shape (num_nodes, any_more_dims). May contain multiple nodes per sample. + batch_idx: shape (num_nodes,). Indicates which sample each row belongs to. If not provided, + then we assume the first dimension is the batch dimension. + reduce: determines how to aggregate over nodes within each sample. (Aggregation over samples + and within dims for one node is always mean.) + batch_size: number of samples in the batch. + + Returns: + Scalar for each sample, shape (batch_size,). + + """ + loss_per_row = paddle.mean( + x=loss_per_row.reshape(tuple(loss_per_row.shape)[0], -1), axis=1 + ) + if batch_idx is None: + loss_per_sample = loss_per_row + else: + loss_per_sample = scatter( + src=loss_per_row, index=batch_idx, dim_size=batch_size, reduce=reduce + ) + return loss_per_sample + + +def d3pm_loss( + *, + corruption: Corruption, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx, #: (paddle.int64 | None), todo: fix this + batch_size: int, + x: paddle.Tensor, + noisy_x: paddle.Tensor, + reduce: Literal["sum", "mean"], + d3pm_hybrid_lambda: float = 0.0, + **_, +) -> paddle.Tensor: + assert hasattr(corruption, "N") + assert hasattr(corruption, "_to_zero_based") + assert hasattr(corruption, "d3pm") + t = maybe_expand(to_discrete_time(t, N=corruption.N, T=corruption.T), batch_idx) + metrics_dict = compute_kl_reverse_process( + corruption._to_zero_based(x.astype(dtype="int64")), + t, + diffusion=corruption.d3pm, + log_space=True, + denoise_fn=lambda targets, timestep: score_model_output, + hybrid_lambda=d3pm_hybrid_lambda, + x_t_plus_1=corruption._to_zero_based(noisy_x.astype(dtype="int64")), + ) + loss = metrics_dict.pop("loss") + loss_per_structure = aggregate_per_sample( + loss, batch_idx=batch_idx, reduce=reduce, batch_size=batch_size + ) + return loss_per_structure diff --git a/jointContribution/mattergen/mattergen/diffusion/training/metrics.py b/jointContribution/mattergen/mattergen/diffusion/training/metrics.py new file mode 100644 index 00000000..ca2a1d9c --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/training/metrics.py @@ -0,0 +1,136 @@ +from typing import Dict, Iterable, Protocol + +import paddle +from mattergen.diffusion.corruption.multi_corruption import MultiCorruption +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.score_models.base import Diffusable +from paddle_scatter import scatter + + +class Metric(Protocol): + """ + Computes a metric to be logged during training. + Each metric must have a name which is used as a prefix for the metric in the log. + """ + + name: str + + def __call__( + self, + *, + loss_per_sample_per_field: Dict[str, paddle.Tensor], + multi_corruption: MultiCorruption, + score_model_output: Diffusable, + t: paddle.Tensor, + batch_idx: Dict[str, paddle.Tensor], + batch: BatchedData, + noisy_batch: BatchedData, + ) -> Dict[str, paddle.Tensor]: + """ + Computes a metric to be logged during training. Useful, e.g., for plotting loss over time. + + Args: + loss_per_sample_per_field: Dict[str, paddle.Tensor], where each tensor has shape (batch_size,). + multi_corruption: MultiCorruption + score_model_output: the output produced by the model per field. + t: shape (batch_size,). Time for each element in the loss. + batch_idx: Dict[str, paddle.LongTensor]: batch indices per field + batch: BatchedData: the clean (un-perturbed) batched data + noisy_batch: BatchedData: the corrupted batched data + """ + pass + + +def loss_per_time_bin( + loss_per_sample: paddle.Tensor, t: paddle.Tensor, bins: paddle.Tensor +) -> paddle.Tensor: + """ + Aggregate loss per bin. Useful for plotting loss over time. + + Args: + loss_per_sample: shape (batch_size,). Loss for each sample. + t: shape (batch_size,). Time for each element in the loss. + bins: shape (num_bins,). Upper boundaries of the time bins. + Returns: + avg_loss_per_bin: shape (num_bins,). Average loss per time bin. + """ + bin_per_element = paddle.bucketize(x=t, sorted_sequence=bins) + avg_loss_per_bin = scatter( + src=loss_per_sample, + index=bin_per_element, + dim_size=tuple(bins.shape)[0], + reduce="mean", + ) + return avg_loss_per_bin + + +class LossPerTimeBin(Metric): + name = "loss_per_time_bin" + + def __init__(self, t_min: float = 0.0, t_max: float = 1.0, num_bins: int = 10): + self.bins = paddle.linspace(start=t_min, stop=t_max, num=num_bins + 1) + + def __call__( + self, + *, + loss_per_sample_per_field: Dict[str, paddle.Tensor], + t: paddle.Tensor, + **_, + ) -> Dict[str, paddle.Tensor]: + """ + Compute loss bins per diffusion time bin. Useful for plotting loss over diffusion time. + """ + metrics_dict = {} + for k, v in loss_per_sample_per_field.items(): + assert tuple(v.shape) == tuple(t.shape) + avg_loss_per_bin = loss_per_time_bin( + loss_per_sample_per_field[k], + t, + bins=self.bins.to(loss_per_sample_per_field[k].place)[1:], + ) + metrics_dict.update( + { + f"{k}_{self.bins[ix]:.2f}-{self.bins[ix + 1]:.2f}": avg_loss_per_bin[ + ix + ] + for ix in range(len(avg_loss_per_bin)) + if avg_loss_per_bin[ix] > 0.0 + } + ) + return metrics_dict + + +class MetricsCalculator: + """ + Computes a set of metrics to be logged during training. + """ + + def __init__(self, metric_fns: Iterable[Metric]): + self.metric_fns = metric_fns + + def __call__( + self, + *, + loss_per_sample_per_field: Dict[str, paddle.Tensor], + multi_corruption: MultiCorruption, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx: Dict[str, paddle.Tensor], + batch: BatchedData, + noisy_batch: BatchedData, + ) -> Dict[str, paddle.Tensor]: + metrics_dict = {} + for metric_fn in self.metric_fns: + _metrics_dict = metric_fn( + loss_per_sample_per_field=loss_per_sample_per_field, + multi_corruption=multi_corruption, + score_model_output=score_model_output, + t=t, + batch_idx=batch_idx, + batch=batch, + noisy_batch=noisy_batch, + ) + metrics_dict.update( + {f"{metric_fn.name}_{k}": v for k, v in _metrics_dict.items()} + ) + return metrics_dict diff --git a/jointContribution/mattergen/mattergen/diffusion/training/utils.py b/jointContribution/mattergen/mattergen/diffusion/training/utils.py new file mode 100644 index 00000000..5125f973 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/training/utils.py @@ -0,0 +1,28 @@ +from typing import Iterable, Union + +import paddle + + +def get_grad_norm( + parameters: Union[paddle.Tensor, Iterable[paddle.Tensor]], norm_type: float = 2.0 +) -> paddle.Tensor: + """ + Adapted from: https://pytorch.org/docs/stable/_modules/torch/nn/utils/clip_grad.html#clip_grad_norm_ + """ + if isinstance(parameters, paddle.Tensor): + parameters = [parameters] + parameters = [p for p in parameters if p.grad is not None] + norm_type = float(norm_type) + if len(parameters) == 0: + return paddle.to_tensor(data=0.0) + device = parameters[0].grad.device + total_norm = paddle.linalg.norm( + x=paddle.stack( + x=[ + paddle.linalg.norm(x=p.grad.detach(), p=norm_type).to(device) + for p in parameters + ] + ), + p=norm_type, + ) + return total_norm diff --git a/jointContribution/mattergen/mattergen/diffusion/wrapped/__init__.py b/jointContribution/mattergen/mattergen/diffusion/wrapped/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_normal_loss.py b/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_normal_loss.py new file mode 100644 index 00000000..2d803483 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_normal_loss.py @@ -0,0 +1,114 @@ +import sys + + +from typing import Literal, Optional + +import paddle +from mattergen.diffusion.corruption.sde_lib import SDE, maybe_expand +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.training.field_loss import aggregate_per_sample +from paddle_utils import * + + +def get_pbc_offsets(pbc: paddle.Tensor, max_offset_integer: int = 3) -> paddle.Tensor: + """Build the Cartesian product of integer offsets of the periodic boundary. That is, if dim=3 and max_offset_integer=1 we build the (2*1 + 1)^3 = 27 + possible combinations of the Cartesian product of (i,j,k) for i,j,k in -max_offset_integer, ..., max_offset_integer. Then, we construct + the tensor of integer offsets of the pbc vectors, i.e., L_{ijk} = row_stack([i * l_1, j * l_2, k * l_3]). + + Args: + pbc (paddle.Tensor, [batch_size, dim, dim]): The input pbc matrix. + max_offset_integer (int): The maximum integer offset per dimension to consider for the Cartesian product. Defaults to 3. + + Returns: + paddle.Tensor, [batch_size, (2 * max_offset_integer + 1)^dim, dim]: The tensor containing the integer offsets of the pbc vectors. + """ + offset_range = paddle.arange(start=-max_offset_integer, end=max_offset_integer + 1) + meshgrid = paddle.stack( + x=list( + [i.T for i in paddle.meshgrid(offset_range, offset_range, offset_range)] + ), + axis=-1, + ) + offset = (pbc[:, None, None, None] * meshgrid[None, :, :, :, :, None].astype("float32")).sum(axis=-2) + pbc_offset_per_molecule = offset.reshape(tuple(pbc.shape)[0], -1, 3) + return pbc_offset_per_molecule + + +def wrapped_normal_score( + x: paddle.Tensor, + mean: paddle.Tensor, + wrapping_boundary: paddle.Tensor, + variance_diag: paddle.Tensor, + batch: paddle.Tensor, + max_offset_integer: int = 3, +) -> paddle.Tensor: + """Approximate the the score of a 3D wrapped normal distribution with diagonal covariance matrix w.r.t. x via a truncated sum. + See docstring of `wrapped_normal_score` for details about the arguments + + Args: + x (paddle.Tensor, [num_atoms, dim]) + mean (paddle.Tensor, [num_atoms, dim]) + wrapping_boundary (paddle.Tensor, [num_molecules, dim, dim]) + variance_diag (paddle.Tensor, [num_atoms,]) + batch (paddle.Tensor, [num_atoms, ]) + max_offset_integer (int), Defaults to 3. + + Returns: + paddle.Tensor, [num_atoms, dim]: The approximated score of the wrapped normal distribution. + """ + offset_add = get_pbc_offsets(wrapping_boundary, max_offset_integer) + diffs_k = (x - mean)[:, None] + offset_add[batch] + dists_sqr_k = diffs_k.pow(y=2).sum(axis=-1) + score_softmax = paddle.nn.functional.softmax( + x=-dists_sqr_k / (2 * variance_diag[:, None]), axis=-1 + ) + score = -(score_softmax[:, :, None] * diffs_k).sum(axis=-2) / variance_diag[:, None] + return score + + +def wrapped_normal_loss( + *, + corruption: SDE, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx: Optional[paddle.Tensor], + batch_size: int, + x: paddle.Tensor, + noisy_x: paddle.Tensor, + reduce: Literal["sum", "mean"], + batch: BatchedData, + **_ +) -> paddle.Tensor: + """Compute the loss for a wrapped normal distribution. + Compares the score of the wrapped normal distribution to the score of the score model. + """ + assert len(t) == batch_size + _, std = corruption.marginal_prob( + x=paddle.zeros(shape=(tuple(x.shape)[0], 1)), + t=t, + batch_idx=batch_idx, + batch=batch, + ) + pred: paddle.Tensor = score_model_output + if pred.ndim != 2: + raise NotImplementedError + assert hasattr( + corruption, "wrapping_boundary" + ), "SDE must be a WrappedSDE, i.e., must have a wrapping boundary." + wrapping_boundary = corruption.wrapping_boundary + wrapping_boundary = wrapping_boundary * paddle.eye(num_rows=tuple(x.shape)[-1])[ + None + ].expand(shape=[batch_size, -1, -1]) + target = ( + wrapped_normal_score( + x=noisy_x, + mean=x, + wrapping_boundary=wrapping_boundary, + variance_diag=std.squeeze() ** 2, + batch=batch_idx, + ) + * std + ) + delta = target - pred + losses = delta.square() + return aggregate_per_sample(losses, batch_idx, reduce=reduce, batch_size=batch_size) diff --git a/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_predictors_correctors.py b/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_predictors_correctors.py new file mode 100644 index 00000000..004ff586 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_predictors_correctors.py @@ -0,0 +1,82 @@ +from typing import Optional, Tuple + +import mattergen.diffusion.sampling.predictors_correctors as pc +import paddle +from mattergen.diffusion.corruption import sde_lib +from mattergen.diffusion.corruption.corruption import Corruption +from mattergen.diffusion.data.batched_data import BatchedData +from mattergen.diffusion.exceptions import IncompatibleSampler +from mattergen.diffusion.sampling import predictors +from mattergen.diffusion.wrapped.wrapped_sde import WrappedSDEMixin + +SampleAndMean = Tuple[paddle.Tensor, paddle.Tensor] + + +class WrappedPredictorMixin: + """A mixin for wrapping the predictor in a WrappedSDE.""" + + def update_given_score( + self, + *, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + batch: Optional[BatchedData], + ) -> SampleAndMean: + assert isinstance(self, predictors.Predictor) + _super = super() + assert hasattr(_super, "update_given_score") + assert hasattr(self, "corruption") + if not hasattr(self.corruption, "wrap"): + raise IncompatibleSampler( + f"{self.__class__.__name__} is not compatible with {self.corruption}." + ) + sample, mean = _super.update_given_score( + x=x, t=t, dt=dt, batch_idx=batch_idx, score=score, batch=batch + ) + return self.corruption.wrap(sample), self.corruption.wrap(mean) + + +class WrappedCorrectorMixin: + """A mixin for wrapping the corrector in a WrappedSDE.""" + + def step_given_score( + self, + *, + x: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + t: paddle.Tensor, + ) -> SampleAndMean: + assert isinstance(self, pc.LangevinCorrector) + _super = super() + assert hasattr(_super, "step_given_score") + assert hasattr(self, "corruption") and hasattr(self.corruption, "wrap") + if not hasattr(self.corruption, "wrap"): + raise IncompatibleSampler( + f"{self.__class__.__name__} is not compatible with {self.corruption}." + ) + sample, mean = _super.step_given_score( + x=x, score=score, t=t, batch_idx=batch_idx + ) + return self.corruption.wrap(sample), self.corruption.wrap(mean) + + +class WrappedAncestralSamplingPredictor( + WrappedPredictorMixin, predictors.AncestralSamplingPredictor +): + @classmethod + def is_compatible(cls, corruption: Corruption): + return isinstance(corruption, (sde_lib.VPSDE, sde_lib.VESDE)) and isinstance( + corruption, WrappedSDEMixin + ) + + +class WrappedLangevinCorrector(WrappedCorrectorMixin, pc.LangevinCorrector): + @classmethod + def is_compatible(cls, corruption: Corruption): + return isinstance(corruption, (sde_lib.VPSDE, sde_lib.VESDE)) and isinstance( + corruption, WrappedSDEMixin + ) diff --git a/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_sde.py b/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_sde.py new file mode 100644 index 00000000..44a871b5 --- /dev/null +++ b/jointContribution/mattergen/mattergen/diffusion/wrapped/wrapped_sde.py @@ -0,0 +1,80 @@ +from typing import Optional, Tuple, Union + +import paddle +from mattergen.diffusion.corruption.sde_lib import SDE, VESDE, VPSDE +from mattergen.diffusion.data.batched_data import BatchedData + +B = Optional[paddle.Tensor] + + +def wrap_at_boundary(x: paddle.Tensor, wrapping_boundary: float) -> paddle.Tensor: + """Wrap x at the boundary given by wrapping_boundary. + Args: + x: tensor of shape (batch_size, dim) + wrapping_boundary: float): wrap at [0, wrapping_boundary] in all dimensions. + Returns: + wrapped_x: tensor of shape (batch_size, dim) + """ + return paddle.remainder(x=x, y=paddle.to_tensor(wrapping_boundary)) + + +class WrappedSDEMixin: + def sample_marginal( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: paddle.Tensor = None, + batch: Optional[BatchedData] = None, + ) -> paddle.Tensor: + _super = super() + assert ( + isinstance(self, SDE) + and hasattr(_super, "sample_marginal") + and hasattr(self, "wrapping_boundary") + ) + if (x > self.wrapping_boundary).astype("bool").any() or (x < 0).astype( + "bool" + ).any(): + print( + "Warning: Wrapped SDE has received input outside of the wrapping boundary." + ) + noisy_x = _super.sample_marginal(x=x, t=t, batch_idx=batch_idx, batch=batch) + return self.wrap(noisy_x) + + def prior_sampling( + self, + shape: Union[list, Tuple], + conditioning_data: Optional[BatchedData] = None, + batch_idx: B = None, + ) -> paddle.Tensor: + _super = super() + assert isinstance(self, SDE) and hasattr(_super, "prior_sampling") + return self.wrap( + _super.prior_sampling(shape=shape, conditioning_data=conditioning_data) + ) + + def wrap(self, x): + assert isinstance(self, SDE) and hasattr(self, "wrapping_boundary") + return wrap_at_boundary(x, self.wrapping_boundary) + + +class WrappedVESDE(WrappedSDEMixin, VESDE): + def __init__( + self, + wrapping_boundary: float = 1.0, + sigma_min: float = 0.01, + sigma_max: float = 50.0, + ): + super().__init__(sigma_min=sigma_min, sigma_max=sigma_max) + self.wrapping_boundary = wrapping_boundary + + +class WrappedVPSDE(WrappedSDEMixin, VPSDE): + def __init__( + self, + wrapping_boundary: float = 1.0, + beta_min: float = 0.1, + beta_max: float = 20, + ): + super().__init__(beta_min=beta_min, beta_max=beta_max) + self.wrapping_boundary = wrapping_boundary diff --git a/jointContribution/mattergen/mattergen/evaluation/__init__.py b/jointContribution/mattergen/mattergen/evaluation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/evaluation/evaluate.py b/jointContribution/mattergen/mattergen/evaluation/evaluate.py new file mode 100644 index 00000000..70729ea1 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/evaluate.py @@ -0,0 +1,45 @@ +from mattergen.evaluation.metrics.evaluator import MetricsEvaluator +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +# from mattergen.evaluation.utils.relaxation import relax_structures +from mattergen.evaluation.utils.structure_matcher import ( + DefaultDisorderedStructureMatcher, DisorderedStructureMatcher, + OrderedStructureMatcher) +from pymatgen.core.structure import Structure + + +def evaluate( + structures: list[Structure], + relaxed_structures: list[Structure] | None = None, + relax: bool = False, + energies: (list[float] | None) = None, + reference: (ReferenceDataset | None) = None, + structure_matcher: ( + OrderedStructureMatcher | DisorderedStructureMatcher + ) = DefaultDisorderedStructureMatcher(), + save_as: (str | None) = None, + n_failed_jobs: int = 0, +) -> dict[str, float | int]: + """Evaluate the structures against a reference dataset.""" + if relax and energies is not None: + raise ValueError("Cannot accept energies if relax is True.") + if relax: + raise NotImplementedError("Relaxing structures is currently not supported.") + # relaxed_structures, energies = relax_structures( + # structures, device=device, load_path=potential_load_path + # ) + else: + if relaxed_structures is None: + relaxed_structures = structures + + + evaluator = MetricsEvaluator.from_structures_and_energies( + structures=relaxed_structures, + energies=energies, + original_structures=structures, + reference=reference, + structure_matcher=structure_matcher, + n_failed_jobs=n_failed_jobs + ) + return evaluator.compute_metrics( + metrics=evaluator.available_metrics, save_as=save_as, pretty_print=True + ) diff --git a/jointContribution/mattergen/mattergen/evaluation/metrics/__init__.py b/jointContribution/mattergen/mattergen/evaluation/metrics/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/evaluation/metrics/core.py b/jointContribution/mattergen/mattergen/evaluation/metrics/core.py new file mode 100644 index 00000000..567d0d28 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/metrics/core.py @@ -0,0 +1,90 @@ +import abc +from copy import deepcopy +from functools import cached_property +from typing import Literal, Type + +import numpy as np +import numpy.typing +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +from mattergen.evaluation.utils.metrics_structure_summary import \ + MetricsStructureSummary +from pandas import DataFrame + + +class BaseMetricsCapability: + """Base class for capabilities.""" + + name: str = "base_capability" + + def __init__( + self, structure_summaries: list[MetricsStructureSummary], n_failed_jobs: int = 0 + ) -> None: + assert len(structure_summaries) > 0, "No data provided." + self._structure_summaries = structure_summaries + self.n_failed_jobs = n_failed_jobs + + @property + def total_submitted_jobs(self) -> int: + return len(self.dataset) + self.n_failed_jobs + + @cached_property + def dataset(self) -> ReferenceDataset: + """ + Returns a ReferenceDataset. While not all capabilities require energies, + the entry IDs are useful to keep track of entry IDs. + """ + data_entries = [deepcopy(s.entry) for s in self._structure_summaries] + for i, e in enumerate(data_entries): + e.entry_id = i + return ReferenceDataset.from_entries("data_entries", data_entries) + + @abc.abstractmethod + def as_dataframe(self) -> DataFrame: + """Returns a pandas DataFrame containing information about this capability.""" + + +class BaseMetric: + """Abstract base class for metrics.""" + + required_capabilities: tuple[Type[BaseMetricsCapability], ...] + + @property + def name(self) -> str: + return "base_metric" + + @property + def description(self) -> str: + raise NotImplementedError + + @cached_property + def value(self) -> (float | int): + raise NotImplementedError + + +class BaseAggregateMetric(BaseMetric): + """Abstract base class for aggregate metrics.""" + + aggregation_method: Literal["mean", "nanmean"] = "not implemented" + + @property + def pre_aggregation_name(self) -> str: + return "base_metric" + + @abc.abstractmethod + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + """Compute metric values for each sample in the dataset.""" + + @cached_property + def pre_aggregation_values(self) -> numpy.typing.NDArray: + """Metric values for each sample in the dataset before aggregation.""" + return self.compute_pre_aggregation_values() + + @cached_property + def value(self) -> (float | int): + values = self.pre_aggregation_values + if self.aggregation_method == "mean": + return values.mean() + elif self.aggregation_method == "nanmean": + return np.nanmean(values) + else: + raise ValueError(f"Unknown aggregation method {self.aggregation_method}") diff --git a/jointContribution/mattergen/mattergen/evaluation/metrics/energy.py b/jointContribution/mattergen/mattergen/evaluation/metrics/energy.py new file mode 100644 index 00000000..c4f1bd66 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/metrics/energy.py @@ -0,0 +1,356 @@ +from dataclasses import dataclass +from functools import cached_property, lru_cache +from typing import Literal + +import numpy as np +import numpy.typing +from mattergen.evaluation.metrics.core import (BaseAggregateMetric, BaseMetric, + BaseMetricsCapability) +from mattergen.evaluation.metrics.structure import StructureMetricsCapability +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +from mattergen.evaluation.utils.globals import DEFAULT_STABILITY_THRESHOLD +from mattergen.evaluation.utils.logging import logger +from mattergen.evaluation.utils.metrics_structure_summary import \ + MetricsStructureSummary +from mattergen.evaluation.utils.utils import expand_into_subsystems +from pandas import DataFrame +from pymatgen.analysis.phase_diagram import PhaseDiagram +from tqdm import tqdm + + +class MissingTerminalsError(ValueError): + pass + + +def get_set_of_all_elements( + structure_summaries: list[MetricsStructureSummary], +) -> set[str]: + """Returns a set of terminal chemical systems in the dataset.""" + return set( + str(element) + for x in structure_summaries + for element in x.entry.composition.elements + ) + + +@dataclass(frozen=True) +class MissingTerminalsAndEnergy: + """ + Class to store information about missing terminal systems and energy data in the reference dataset. + """ + + missing_terminals: list[str] + missing_energy: list[str] + + @classmethod + def from_dataset_and_reference( + cls, + structure_summaries: list[MetricsStructureSummary], + reference: ReferenceDataset, + ) -> "MissingTerminalsAndEnergy": + terminal_systems = get_set_of_all_elements(structure_summaries) + missing_terminals = list( + terminal_systems - set(reference.entries_by_chemsys.keys()) + ) + terminals_in_reference = terminal_systems & set( + reference.entries_by_chemsys.keys() + ) + missing_energy = [ + chemsys + for chemsys in terminals_in_reference + if all([np.isnan(e.energy) for e in reference.entries_by_chemsys[chemsys]]) + ] + return cls(missing_terminals=missing_terminals, missing_energy=missing_energy) + + @property + def has_missing_terminals(self) -> bool: + return len(self.missing_terminals) > 0 + + @property + def has_missing_energy(self) -> bool: + return len(self.missing_energy) > 0 + + @property + def has_missing_data(self) -> bool: + return self.has_missing_terminals or self.has_missing_energy + + +class EnergyMetricsCapability(BaseMetricsCapability): + name: str = "energy_capability" + missing_terminals_error_str = "Reference dataset does not contain sufficient data to compute energy metrics for the given dataset." + """Capability for computing structure metrics.""" + + @classmethod + def check_missing_reference_terminal_systems( + cls, + structure_summaries: list[MetricsStructureSummary], + reference_dataset: ReferenceDataset, + ) -> MissingTerminalsAndEnergy: + return MissingTerminalsAndEnergy.from_dataset_and_reference( + structure_summaries=structure_summaries, reference=reference_dataset + ) + + @classmethod + def warn_missing_data(cls, missing_terminals: MissingTerminalsAndEnergy) -> None: + logger.warning(cls.missing_terminals_error_str) + if missing_terminals.has_missing_terminals: + logger.warning( + f"Missing terminal systems: {missing_terminals.missing_terminals}" + ) + if missing_terminals.has_missing_energy: + logger.warning( + f"Missing energy data for terminal systems: {missing_terminals.missing_energy}" + ) + + def __init__( + self, + structure_summaries: list[MetricsStructureSummary], + reference_dataset: ReferenceDataset, + stability_threshold: float = DEFAULT_STABILITY_THRESHOLD, + n_failed_jobs: int = 0, + ) -> None: + if ( + missing_terminals := self.check_missing_reference_terminal_systems( + structure_summaries, reference_dataset + ) + ).has_missing_data: + self.warn_missing_data(missing_terminals) + raise MissingTerminalsError(self.missing_terminals_error_str) + super().__init__( + structure_summaries=structure_summaries, n_failed_jobs=n_failed_jobs + ) + self.reference_dataset = reference_dataset + self.stability_threshold = stability_threshold + + @property + def is_stable(self) -> numpy.typing.NDArray[np.bool_]: + """ + Returns a boolean mask of the same length as data_entries + indicating whether each entry is stable or not. + """ + return self.energy_above_hull <= self.stability_threshold + + @property + def is_self_consistent_stable(self) -> numpy.typing.NDArray[np.bool_]: + """ + Returns a boolean mask of the same length as data_entries + indicating whether each entry is self-consistently stable or not. + """ + return self.self_consistent_energy_above_hull <= self.stability_threshold + + @cached_property + def energy_above_hull(self) -> numpy.typing.NDArray: + """Returns energy above hull (eV) per atom with respect to the reference dataset.""" + result = np.zeros(len(self.dataset)) + for chemsys, entries in tqdm( + self.dataset.entries_by_chemsys.items(), + desc="Computing energies above hull", + ): + result[[e.entry_id for e in entries]] = np.array( + self._get_energy_above_hull_per_atom_chemsys(chemsys) + ) + return result + + @cached_property + def self_consistent_energy_above_hull(self) -> numpy.typing.NDArray: + """Returns the energy above hull (eV) per atom with respect to the convex hull that + combines the reference dataset and the samples.""" + result = np.zeros(len(self.dataset)) + for chemsys, entries in tqdm( + self.dataset.entries_by_chemsys.items(), + desc="Computing self-consistent energies above hull", + ): + result[[e.entry_id for e in entries]] = np.array( + self._get_self_consistent_energy_above_hull_per_atom_chemsys(chemsys) + ) + return result + + def as_dataframe(self) -> DataFrame: + return DataFrame( + data={ + "energy_above_hull": self.energy_above_hull, + "self_consistent_energy_above_hull": self.self_consistent_energy_above_hull, + }, + index=[e.entry_id for e in self.dataset], + ) + + def _get_phase_diagram(self, chemical_system: str) -> PhaseDiagram: + """Returns the phase diagram for a given chemical system.""" + subsys = expand_into_subsystems(chemical_system) + reference_entries = [ + entry + for s in subsys + for key in ["-".join(sorted(s))] + for entry in self.reference_dataset.entries_by_chemsys.get(key, []) + if not np.isnan(entry.energy) + ] + assert len(reference_entries) > 0, f"No reference data for {chemical_system}." + return PhaseDiagram(reference_entries) + + @lru_cache + def _get_energy_above_hull_per_atom_chemsys(self, chemsys: str) -> list[float]: + """Returns a list of energies above hull per atom for a given chemical system.""" + phase_diagram = self._get_phase_diagram(chemsys) + e_above_hull = [ + phase_diagram.get_e_above_hull(entry=e, allow_negative=True) + for e in self.dataset.entries_by_chemsys[chemsys] + ] + for e, ehull in zip(self.dataset.entries_by_chemsys[chemsys], e_above_hull): + logger.debug( + f"{e.composition.reduced_formula}: energy above hull {ehull} (threshold {self.stability_threshold})" + ) + return e_above_hull + + def _get_self_consistent_phase_diagram(self, chemical_system: str) -> PhaseDiagram: + """Returns the internal phase diagram for a given chemical system. + This is comprised of all reference entries that do not exactly match the chemical system, and + of all entries belonging to the chemical system.""" + subsys = expand_into_subsystems(chemical_system) + reference_entries = [ + entry + for s in subsys + for key in ["-".join(sorted(s))] + for entry in self.reference_dataset.entries_by_chemsys.get(key, []) + if key != chemical_system and not np.isnan(entry.energy) + ] + reference_entries += self.dataset.entries_by_chemsys.get(chemical_system, []) + assert len(reference_entries) > 0, f"No data for {chemical_system}." + return PhaseDiagram(reference_entries) + + def _get_full_phase_diagram(self, chemical_system: str) -> PhaseDiagram: + """Returns the total phase diagram for a given chemical system. + This is comprised of all reference entries and + of all entries belonging to the chemical system.""" + subsys = expand_into_subsystems(chemical_system) + reference_entries = [ + entry + for s in subsys + for key in ["-".join(sorted(s))] + for entry in self.reference_dataset.entries_by_chemsys.get(key, []) + if not np.isnan(entry.energy) + ] + reference_entries += self.dataset.entries_by_chemsys.get(chemical_system, []) + assert len(reference_entries) > 0, f"No data for {chemical_system}." + return PhaseDiagram(reference_entries) + + @lru_cache + def _get_self_consistent_energy_above_hull_per_atom_chemsys( + self, chemsys: str + ) -> list[float]: + """Returns a list of self-consistent energies above hull per atom for a given chemical system.""" + phase_diagram = self._get_self_consistent_phase_diagram(chemsys) + e_above_hull = [ + phase_diagram.get_e_above_hull(entry=e, allow_negative=True) + for e in self.dataset.entries_by_chemsys[chemsys] + ] + return e_above_hull + + +@dataclass(frozen=True) +class BaseEnergyMetric(BaseMetric): + required_capabilities = StructureMetricsCapability, EnergyMetricsCapability + + @property + def name(self) -> str: + return "base_energy_metric" + + def __init__( + self, + structure_capability: StructureMetricsCapability, + energy_capability: EnergyMetricsCapability, + **kwargs, + ): + self.structure_capability = structure_capability + self.energy_capability = energy_capability + self.reference_dataset = self.energy_capability.reference_dataset + + +class FracSuccessfulJobs(BaseEnergyMetric): + name = "frac_successful_jobs" + + @property + def description(self) -> str: + return "Fraction of structures whose jobs ran successfully." + + @cached_property + def value(self) -> float: + return ( + len(self.energy_capability._structure_summaries) + / self.energy_capability.total_submitted_jobs + ) + + +class AvgRMSDFromRelaxation(BaseEnergyMetric, BaseAggregateMetric): + aggregation_method: Literal["nanmean"] = "nanmean" + name = "avg_rmsd_from_relaxation" + pre_aggregation_name = "rmsd_from_relaxation" + + @property + def description(self) -> str: + return "root mean square displacements of atoms (Angstrom) from initial to final DFT relaxation steps in sampled data." + + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + return np.array( + [ + d.rmsd_from_relaxation + for d in self.energy_capability._structure_summaries + ] + ) + + +class AvgEnergyAboveHullPerAtom(BaseEnergyMetric, BaseAggregateMetric): + aggregation_method: Literal["mean"] = "mean" + name = "avg_energy_above_hull_per_atom" + pre_aggregation_name = "energy_above_hull_per_atom" + + @property + def description(self) -> str: + return "Average energy above hull per atom (eV/atom) of structures in sampled data." + + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + return self.energy_capability.energy_above_hull + + +class FracStableStructures(BaseEnergyMetric, BaseAggregateMetric): + name = "frac_stable_structures" + pre_aggregation_name = "stable" + + @property + def description(self) -> str: + return f"Fraction of stable structures in sampled data within {self.energy_capability.stability_threshold} (eV/atom) above convex hull of {self.reference_dataset.name}." + + @cached_property + def value(self) -> float: + return ( + self.pre_aggregation_values.sum() + / self.energy_capability.total_submitted_jobs + ) + + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + return self.energy_capability.is_stable + + +class FracNovelUniqueStableStructures(BaseEnergyMetric, BaseAggregateMetric): + name = "frac_novel_unique_stable_structures" + pre_aggregation_name = "novel_unique_stable" + + @property + def description(self) -> str: + return ( + f"Fraction of novel unique stable structures in sampled data within {self.energy_capability.stability_threshold} (eV/atom) " + + f"above convex hull of {self.reference_dataset.name}." + ) + + @cached_property + def value(self) -> float: + return ( + self.pre_aggregation_values.sum() + / self.energy_capability.total_submitted_jobs + ) + + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + return ( + self.structure_capability.is_novel + & self.structure_capability.is_unique + & self.energy_capability.is_stable + ) diff --git a/jointContribution/mattergen/mattergen/evaluation/metrics/evaluator.py b/jointContribution/mattergen/mattergen/evaluation/metrics/evaluator.py new file mode 100644 index 00000000..e42085e1 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/metrics/evaluator.py @@ -0,0 +1,342 @@ +import json +import os +from collections.abc import Iterable, Sequence +from functools import cached_property +from inspect import getmembers, isclass +from pathlib import Path +from typing import Literal, Sequence, Type, TypeVar + +import mattergen.evaluation.metrics.energy as energy_metrics +import mattergen.evaluation.metrics.property as property_metrics +import mattergen.evaluation.metrics.structure as structure_metrics +import numpy.typing +import pandas as pd +from mattergen.evaluation.metrics.core import (BaseAggregateMetric, BaseMetric, + BaseMetricsCapability) +from mattergen.evaluation.metrics.energy import (EnergyMetricsCapability, + MissingTerminalsError) +from mattergen.evaluation.metrics.property import PropertyMetricsCapability +from mattergen.evaluation.metrics.structure import StructureMetricsCapability +from mattergen.evaluation.reference.presets import ReferenceMP2020Correction +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +from mattergen.evaluation.utils.globals import DEFAULT_STABILITY_THRESHOLD +from mattergen.evaluation.utils.logging import logger +from mattergen.evaluation.utils.metrics_structure_summary import ( + MetricsStructureSummary, get_metrics_structure_summaries) +from mattergen.evaluation.utils.structure_matcher import ( + DefaultDisorderedStructureMatcher, DisorderedStructureMatcher, + OrderedStructureMatcher) +from mattergen.evaluation.utils.utils import PropertyConstraint +from monty.serialization import dumpfn +from pandas import DataFrame +from pymatgen.core.structure import Structure +from pymatgen.entries.compatibility import (Compatibility, + MaterialsProject2020Compatibility) +from typing_extensions import Self + +T = TypeVar("T") + + +def unique_item(iterable: Iterable[T]) -> T: + """returns the content of a sequence containing a single item.""" + lst = list(iterable) + assert ( + len(lst) == 1 + ), f"Tried to call unique_item, but {lst} contains {len(lst)} items." + return lst[0] + + +class MetricsEvaluator: + """ + This class is used to evaluate a set of metrics on a set of structures. + """ + + def __init__(self, capabilities: Sequence[BaseMetricsCapability]): + assert len(capabilities) > 0, "At least one capability is required." + self.capabilities = capabilities + self._metrics: dict[Type[BaseMetric], BaseMetric] = {} + + @classmethod + def from_structures( + cls, + structures: list[Structure], + reference: (ReferenceDataset | None) = None, + structure_matcher: ( + OrderedStructureMatcher | DisorderedStructureMatcher + ) = DefaultDisorderedStructureMatcher(), + n_failed_jobs: int = 0, + ) -> Self: + """Instantiate MetricsEvaluator from a list of structures. This is useful for computing structure-based metrics.""" + if reference is None: + print( + "No reference dataset provided. Using MP2020 correction dataset as reference." + ) + reference = ReferenceMP2020Correction() + structure_summaries = [ + MetricsStructureSummary.from_structure(s) for s in structures + ] + structure_capability = StructureMetricsCapability( + structure_summaries=structure_summaries, + reference_dataset=reference, + structure_matcher=structure_matcher, + n_failed_jobs=n_failed_jobs, + ) + return cls(capabilities=[structure_capability]) + + @classmethod + def from_structures_and_energies( + cls, + structures: list[Structure], + energies: list[float], + reference: (ReferenceDataset | None) = None, + properties: (dict[str, list[float]] | None) = None, + property_constraints: (dict[str, PropertyConstraint] | None) = None, + original_structures: (list[Structure] | None) = None, + stability_threshold: float = DEFAULT_STABILITY_THRESHOLD, + structure_matcher: ( + OrderedStructureMatcher | DisorderedStructureMatcher + ) = DefaultDisorderedStructureMatcher(), + energy_correction_scheme: Compatibility = MaterialsProject2020Compatibility(), + n_failed_jobs: int = 0, + ) -> Self: + if reference is None: + print( + "No reference dataset provided. Using MP2020 correction as reference." + ) + reference = ReferenceMP2020Correction() + structure_summaries = get_metrics_structure_summaries( + structures=structures, + energies=energies, + properties=properties, + original_structures=original_structures, + energy_correction_scheme=energy_correction_scheme, + ) + return cls.from_structure_summaries( + structure_summaries=structure_summaries, + reference=reference, + stability_threshold=stability_threshold, + property_constraints=property_constraints, + structure_matcher=structure_matcher, + n_failed_jobs=n_failed_jobs, + ) + + @classmethod + def from_structure_summaries( + cls, + structure_summaries: list[MetricsStructureSummary], + reference: (ReferenceDataset | None) = None, + stability_threshold: float = DEFAULT_STABILITY_THRESHOLD, + property_constraints: (dict[str, PropertyConstraint] | None) = None, + structure_matcher: ( + OrderedStructureMatcher | DisorderedStructureMatcher + ) = DefaultDisorderedStructureMatcher(), + n_failed_jobs: int = 0, + ) -> Self: + if reference is None: + print( + "No reference dataset provided. Using MP2020 correction as reference." + ) + reference = ReferenceMP2020Correction() + capabilities: list[BaseMetricsCapability] = [] + if reference is not None: + structure_capability = StructureMetricsCapability( + structure_summaries=structure_summaries, + reference_dataset=reference, + structure_matcher=structure_matcher, + n_failed_jobs=n_failed_jobs, + ) + capabilities.append(structure_capability) + try: + energy_capability = EnergyMetricsCapability( + structure_summaries=structure_summaries, + reference_dataset=reference, + stability_threshold=stability_threshold, + n_failed_jobs=n_failed_jobs, + ) + capabilities.append(energy_capability) + except MissingTerminalsError: + pass + if any([c for c in structure_summaries if c.properties]): + property_capability = PropertyMetricsCapability( + structure_summaries=structure_summaries, + property_constraints=property_constraints, + n_failed_jobs=n_failed_jobs, + ) + capabilities.append(property_capability) + return cls(capabilities=capabilities) + + @cached_property + def available_capability_types(self) -> frozenset[Type[BaseMetricsCapability]]: + return frozenset([type(cap) for cap in self.capabilities]) + + @cached_property + def available_metrics(self) -> list[Type[BaseMetric]]: + return [ + metric + for metric in get_all_metrics_classes() + if all( + cap in self.available_capability_types + for cap in metric.required_capabilities + ) + ] + + @property + def is_unique(self) -> numpy.typing.NDArray: + return self.structure_capability.is_unique + + @property + def is_novel(self) -> numpy.typing.NDArray: + return self.structure_capability.is_novel + + @property + def matches_in_reference(self) -> dict[int, list[str]]: + return self.structure_capability.matches_in_reference + + @property + def is_in_reference(self) -> tuple[numpy.typing.NDArray]: + return self.structure_capability.is_in_reference + + @property + def is_stable(self) -> numpy.typing.NDArray: + return self.energy_capability.is_stable + + @property + def is_self_consistent_stable(self) -> numpy.typing.NDArray: + return self.energy_capability.is_self_consistent_stable + + @cached_property + def structure_capability(self) -> StructureMetricsCapability: + return self._get_capability(StructureMetricsCapability) + + @cached_property + def energy_capability(self) -> EnergyMetricsCapability: + return self._get_capability(EnergyMetricsCapability) + + @cached_property + def property_capability(self) -> PropertyMetricsCapability: + return self._get_capability(PropertyMetricsCapability) + + CapabilityT = TypeVar("CapabilityT", bound=BaseMetricsCapability) + + def _get_capability(self, capability: Type[CapabilityT]) -> CapabilityT: + assert ( + capability in self.available_capability_types + ), f"Capability {capability} is not available. Must be one of {self.available_capability_types}." + return unique_item( + cap for cap in self.capabilities if isinstance(cap, capability) + ) + + def _get_metric(self, metric: Type[BaseMetric]) -> BaseMetric: + assert ( + metric in self.available_metrics + ), f"Metric {metric} is not available. Must be one of {self.available_metrics}." + if metric not in self._metrics: + capabilities: dict[str, BaseMetricsCapability | None] = { + StructureMetricsCapability.name: None, + EnergyMetricsCapability.name: None, + PropertyMetricsCapability.name: None, + } + capabilities.update( + {capability.name: capability for capability in self.capabilities} + ) + self._metrics[metric] = metric(**capabilities) + return self._metrics[metric] + + def compute_metric(self, metric: Type[BaseMetric]) -> (float | int): + """Compute a single metric.""" + return self._get_metric(metric).value + + def compute_metrics( + self, + metrics: (Sequence[Type[BaseMetric]] | Literal["all"]), + save_as: (str | os.PathLike | None) = None, + pretty_print: bool = False, + ) -> dict[str, float | int]: + """Computes metrics and returns them as a dictionary. Optionally, saves the dictionary to a file. + + Args: + metrics: List of metrics to compute. If "all", all available metrics are computed. + save_as: Path to save the dictionary. If None, the dictionary is not saved. + pretty_print: If True, the dictionary is printed in a pretty format. + """ + metrics_dict: dict[str, dict] = {} + metrics_classes = self.available_metrics if metrics == "all" else metrics + for metric_cls in metrics_classes: + metric = self._get_metric(metric_cls) + logger.info(f"Computing metric {metric.name}") + metrics_dict[metric.name] = { + "value": metric.value, + "description": metric.description, + } + if pretty_print: + logger.info( + json.dumps( + { + k: (round(v, 4) if isinstance(v, float) else v) + for k, v in metrics_dict.items() + }, + indent=4, + ) + ) + if save_as is not None: + save_as = Path(save_as).resolve() + os.makedirs(save_as.parent, exist_ok=True) + with open(save_as, "w") as f: + json.dump(metrics_dict, f, indent=4) + logger.info(f"Saved metrics to {save_as}") + return {k: v["value"] for k, v in metrics_dict.items()} + + def compute_all_metrics(self) -> dict[str, float | int]: + """Computes all available metrics.""" + return self.compute_metrics(self.available_metrics) + + def as_dataframe( + self, + metrics: (Sequence[Type[BaseMetric]] | Literal["all"] | None) = None, + save_as: (str | os.PathLike | None) = None, + ) -> DataFrame: + """Return aggregate metrics as a pandas DataFrame, along with additional information from each available capability.""" + metrics = metrics or [] + metrics_classes = self.available_metrics if metrics == "all" else metrics + data = { + "entry": list(self.capabilities[0].dataset), + **{ + metric.pre_aggregation_name: metric.pre_aggregation_values + for metric in [self._get_metric(m) for m in metrics_classes] + if isinstance(metric, BaseAggregateMetric) + }, + } + df = DataFrame( + data=data, index=[e.entry_id for e in self.capabilities[0].dataset] + ) + dfs = [df] + [cap.as_dataframe() for cap in self.capabilities] + assert all( + [(len(df) == len(d)) for d in dfs] + ), "DataFrames do not have the same length." + df = pd.concat(dfs, axis=1) + if save_as is not None: + dumpfn(df.to_dict("list"), save_as) + return df + + T = TypeVar("T") + + @staticmethod + def filter(data: list[T], mask: numpy.typing.NDArray) -> list[T]: + """Filters a list of data points based on a boolean mask.""" + assert len(data) == len(mask), "Data and mask must have the same length." + return [x for x, m in zip(data, mask) if m] + + +def get_all_metrics_classes() -> list[Type[BaseMetric]]: + """Returns all metrics classes, except for base classes.""" + clsmembers: list[list[tuple[str, Type]]] = [ + getmembers(module, isclass) + for module in [energy_metrics, property_metrics, structure_metrics] + ] + metric_classes = [ + x[1] + for clsmembers_in_module in clsmembers + for x in clsmembers_in_module + if issubclass(x[1], BaseMetric) + ] + return [m for m in metric_classes if not m.__name__.startswith("Base")] diff --git a/jointContribution/mattergen/mattergen/evaluation/metrics/property.py b/jointContribution/mattergen/mattergen/evaluation/metrics/property.py new file mode 100644 index 00000000..50914629 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/metrics/property.py @@ -0,0 +1,156 @@ +from dataclasses import dataclass +from functools import cached_property + +import numpy as np +import numpy.typing +from mattergen.evaluation.metrics.core import (BaseAggregateMetric, BaseMetric, + BaseMetricsCapability) +from mattergen.evaluation.metrics.energy import EnergyMetricsCapability +from mattergen.evaluation.metrics.structure import StructureMetricsCapability +from mattergen.evaluation.utils.metrics_structure_summary import \ + MetricsStructureSummary +from mattergen.evaluation.utils.utils import PropertyConstraint +from pandas import DataFrame + + +class PropertyMetricsCapability(BaseMetricsCapability): + name: str = "property_capability" + """Capability for computing property metrics.""" + + def __init__( + self, + structure_summaries: list[MetricsStructureSummary], + property_constraints: (dict[str, PropertyConstraint] | None) = None, + n_failed_jobs: int = 0, + ) -> None: + super().__init__( + structure_summaries=structure_summaries, n_failed_jobs=n_failed_jobs + ) + self.property_constraints = property_constraints + + @cached_property + def properties(self) -> dict[str, numpy.typing.NDArray]: + props = list(self._structure_summaries[0].properties) + assert all( + set(s.properties.keys()) == set(props) for s in self._structure_summaries + ), "Inconsistent property data." + return { + prop: np.array([s.properties[prop] for s in self._structure_summaries]) + for prop in props + } + + @property + def satisfies_property_constraints(self) -> numpy.typing.NDArray[np.bool_]: + """ + Returns a boolean mask of the same length as structure_summaries + indicating whether each entry satisfies the property constraints. + """ + + def _satisfies_property_constraint( + values: np.array, constraint: PropertyConstraint + ) -> numpy.typing.NDArray[np.bool_]: + mask = True if constraint[0] is None else values >= constraint[0] + mask &= True if constraint[1] is None else values <= constraint[1] + return mask + + assert self.property_constraints, "No property constraints specified." + assert all( + key in self.properties for key in self.property_constraints + ), f"Property data and constraints do not match: {list(self.properties)} vs. {list(self.property_constraints)}." + return np.all( + np.array( + [ + _satisfies_property_constraint(self.properties[key], constraint) + for key, constraint in self.property_constraints.items() + ], + dtype=bool, + ), + axis=0, + ) + + def as_dataframe(self) -> DataFrame: + data = {str(k): v for k, v in self.properties.items()} + if self.property_constraints: + data.update( + {"satisfies_property_constraints": self.satisfies_property_constraints} + ) + return DataFrame(data=data, index=[e.entry_id for e in self.dataset]) + + +@dataclass(frozen=True) +class BasePropertyMetric(BaseMetric): + required_capabilities = ( + StructureMetricsCapability, + EnergyMetricsCapability, + PropertyMetricsCapability, + ) + + @property + def name(self) -> str: + return "base_property_metric" + + def __init__( + self, + structure_capability: StructureMetricsCapability, + energy_capability: EnergyMetricsCapability, + property_capability: PropertyMetricsCapability, + **kwargs, + ): + self.structure_capability = structure_capability + self.energy_capability = energy_capability + self.property_capability = property_capability + self.reference_dataset = self.energy_capability.reference_dataset + + +class FracStableStructuresWithProperties(BasePropertyMetric, BaseAggregateMetric): + name = "frac_stable_structures_with_properties" + pre_aggregation_name = "stable_with_properties" + + @property + def description(self) -> str: + return ( + f"Fraction of stable structures in sampled data within {self.energy_capability.stability_threshold} (eV/atom) " + + f"above convex hull of {self.reference_dataset.name} and that satisfy target property constraints." + ) + + @cached_property + def value(self) -> float: + return ( + self.pre_aggregation_values.sum() + / self.energy_capability.total_submitted_jobs + ) + + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + return ( + self.energy_capability.is_stable + & self.property_capability.satisfies_property_constraints + ) + + +class FracNovelUniqueStableStructuresWithProperties( + BasePropertyMetric, BaseAggregateMetric +): + name = "frac_novel_unique_stable_structures_with_properties" + pre_aggregation_name = "novel_unique_stable_with_properties" + + @property + def description(self) -> str: + return ( + f"Fraction of novel unique stable structures in sampled data within {self.energy_capability.stability_threshold} (eV/atom) " + + f"above convex hull of {self.reference_dataset.name} and that satisfy target property constraints." + ) + + @cached_property + def value(self) -> float: + return ( + self.pre_aggregation_values.sum() + / self.property_capability.total_submitted_jobs + ) + + def compute_pre_aggregation_values(self) -> numpy.typing.NDArray: + return ( + self.structure_capability.is_novel + & self.structure_capability.is_unique + & self.energy_capability.is_stable + & self.property_capability.satisfies_property_constraints + ) diff --git a/jointContribution/mattergen/mattergen/evaluation/metrics/structure.py b/jointContribution/mattergen/mattergen/evaluation/metrics/structure.py new file mode 100644 index 00000000..dca9e28c --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/metrics/structure.py @@ -0,0 +1,459 @@ +import itertools +from collections import Counter +from copy import deepcopy +from dataclasses import dataclass +from functools import cached_property +from typing import Literal, Sequence + +import cachetools +import numpy as np +import numpy.typing +import smact +from mattergen.evaluation.metrics.core import (BaseAggregateMetric, BaseMetric, + BaseMetricsCapability) +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +from mattergen.evaluation.utils.dataset_matcher import ( + DisorderedDatasetUniquenessComputer, OrderedDatasetUniquenessComputer, + get_dataset_matcher, matches_to_mask) +from mattergen.evaluation.utils.logging import logger +from mattergen.evaluation.utils.metrics_structure_summary import \ + MetricsStructureSummary +from mattergen.evaluation.utils.structure_matcher import ( + DisorderedStructureMatcher, OrderedStructureMatcher) +from mattergen.evaluation.utils.symmetry_analysis import ( + DefaultSpaceGroupAnalyzer, DisorderedSpaceGroupAnalyzer) +from pandas import DataFrame +from pymatgen.core.composition import Element +from pymatgen.core.structure import Structure +from pymatgen.symmetry.analyzer import SpacegroupAnalyzer +from scipy.stats import wasserstein_distance +from smact.screening import pauling_test +from tqdm import tqdm + + +def get_space_group(structure: Structure, space_group_analyzer_cls: type[ + SpacegroupAnalyzer]=DefaultSpaceGroupAnalyzer) ->str: + try: + return space_group_analyzer_cls(structure=structure + ).get_space_group_symbol() + except TypeError: + return 'P1' + + +def all_structures_are_ordered(structures: Sequence[Structure]) ->bool: + """Check if all structures are ordered.""" + return all([s.is_ordered for s in structures]) + + +class StructureMetricsCapability(BaseMetricsCapability): + name: str = 'structure_capability' + """Capability for computing structure metrics. + The `structure_matcher` class determines how uniqueness and novelty are computed. + atoms that could substitute for each other (via the Hume-Rothery rules) and then using the default pymatgen structure matching. + """ + + def __init__(self, structure_summaries: list[MetricsStructureSummary], + reference_dataset: ReferenceDataset, structure_matcher: ( + OrderedStructureMatcher | DisorderedStructureMatcher), + n_failed_jobs: int=0) ->None: + super().__init__(structure_summaries=structure_summaries, + n_failed_jobs=n_failed_jobs) + _structures = [s.structure for s in structure_summaries] + all_structures_ordered = all_structures_are_ordered(_structures + ) and reference_dataset.is_ordered + if not all_structures_ordered: + assert isinstance(structure_matcher, DisorderedStructureMatcher + ), 'If at least one structure is disordered, structure_matcher must be a DisorderedStructureMatcher.' + logger.info( + 'At least one structure is disordered. Using DisorderedDatasetUniquenessComputer.' + ) + self.reference_dataset = reference_dataset + self.structure_matcher = structure_matcher + self.ensure_reference_dataset_has_material_ids() + self.uniqueness_computer: OrderedDatasetUniquenessComputer | DisorderedDatasetUniquenessComputer = ( + OrderedDatasetUniquenessComputer(structure_matcher) + if all_structures_ordered + else DisorderedDatasetUniquenessComputer(structure_matcher) + ) + self.dataset_matcher = get_dataset_matcher(all_structures_ordered, + structure_matcher) + + def ensure_reference_dataset_has_material_ids(self) ->None: + """ + We're using material_ids to match structures between the reference dataset and the data. + If the reference dataset doesn't have material_ids, we add them here and set them + to the index of the entry in the reference dataset. + """ + if len(self.reference_dataset) > 0 and next(iter(self. + reference_dataset)).data.get('material_id') is None: + logger.warning( + 'Reference dataset does not have material_ids. Adding material_ids to reference dataset.' + ) + for i, entry in enumerate(self.reference_dataset): + if 'material_id' in entry.data: + raise ValueError( + 'Found material_id in some entries of the reference dataset, but not all.Please ensure that either all entries have material_ids or none do.' + ) + entry.data['material_id'] = i + + @property + def structures(self) ->list[Structure]: + return [s.structure for s in self._structure_summaries] + + @cached_property + def chemistry_agnostic_structures(self) ->list[Structure]: + chemistry_agnostic_structures = [deepcopy(s) for s in self.structures] + for s in chemistry_agnostic_structures: + s.replace_species({Element(k.name): Element('Cs') for k in list + (set(s.species))}) + return chemistry_agnostic_structures + + @cached_property + def is_unique(self) ->numpy.typing.NDArray[np.bool_]: + """ + Returns a boolean mask of the same length as `data_entries` in which each item is True + for the first structure from a set of duplicates and otherwise False. + """ + return self.uniqueness_computer(self.dataset) + + @cached_property + def is_novel(self) ->numpy.typing.NDArray[np.bool_]: + """ + Returns a boolean mask of the same length as `data_entries` in which each item is True + for structures that are not present in the reference dataset and otherwise False. + """ + novelty_mask = np.logical_not(self.is_in_reference) + return novelty_mask + + @cached_property + def is_in_reference(self) ->numpy.typing.NDArray[np.bool_]: + """ + Returns a boolean mask of the same length as `data_entries` in which each item is True + for structures that are present in the reference dataset and otherwise False. + """ + return matches_to_mask(self.matches_in_reference.keys(), len(self. + dataset)) + + @cached_property + def matches_in_reference(self) ->dict[int, list[str]]: + return self.dataset_matcher(self.dataset, self.reference_dataset) + + @cached_property + def is_explored(self) ->numpy.typing.NDArray[np.bool_]: + """Returns a mask of whether structures are in explored chemical systems (>1 entry in reference).""" + return np.array([(structure.composition.chemical_system in self. + reference_dataset.entries_by_chemsys) for structure in self. + structures]) + + def as_dataframe(self) ->DataFrame: + return DataFrame(data={'is_unique': self.is_unique, 'is_novel': + self.is_novel, 'is_explored': self.is_explored}, index=[e. + entry_id for e in self.dataset]) + + @cached_property + def num_atoms(self) ->numpy.typing.NDArray[np.int_]: + return np.array([len(structure) for structure in self.structures]) + + @cached_property + def space_group_symbols(self) ->list[str]: + return [get_space_group(structure) for structure in self.structures] + + @cached_property + def chemistry_agnostic_space_group_symbols(self) ->list[str]: + return [get_space_group(structure) for structure in self. + chemistry_agnostic_structures] + + @cached_property + def substitution_aware_space_group_symbols(self) ->list[str]: + """ + Returns a list of space group symbols for each structure in the dataset, once the + structures have been modified to account for possible substitutions of atoms that + could substitute for each other (via the Hume-Rothery rules). + """ + return [get_space_group(structure, DisorderedSpaceGroupAnalyzer) for + structure in self.structures] + + @cachetools.cached(cache={}, key=lambda self, *args, **kwargs: self) + def compute_num_matches(self, desc: str='') ->float: + """ + Returns the number of matches between the data and reference entries. + """ + num_matches = len(self.is_novel) - sum(self.is_novel) + return num_matches + + +@dataclass(frozen=True) +class BaseStructureMetric(BaseMetric): + required_capabilities = StructureMetricsCapability, + + @property + def name(self) ->str: + return 'base_structure_metric' + + def __init__(self, structure_capability: StructureMetricsCapability, ** + kwargs): + self.structure_capability = structure_capability + self.reference_dataset = self.structure_capability.reference_dataset + self.dataset = self.structure_capability.dataset + + +class FracUniqueSystems(BaseStructureMetric): + name = 'frac_unique_systems' + + @property + def description(self) ->str: + return ( + 'Fraction of structures in sampled data that have a unique chemical system within this set.' + ) + + @cached_property + def value(self) ->float: + return len(set(structure.composition.chemical_system for structure in + self.structure_capability.structures)) / len(self. + structure_capability.structures) + + +class Precision(BaseStructureMetric): + name = 'precision' + + @property + def description(self) ->str: + return ( + f'Precision of structures in sampled data compared with {self.reference_dataset.name}. This is the fraction of structures in sampled data that have a matching structure in {self.reference_dataset.name}.' + ) + + @cached_property + def value(self) ->float: + """ + Returns the fraction of structures in self.data.data_structures that are present in + self.reference_structures. + """ + return self.structure_capability.is_in_reference.mean() + + +class Recall(BaseStructureMetric): + name = 'recall' + + @property + def description(self) ->str: + return ( + f'Recall of structures in sampled data compared with structures in {self.reference_dataset.name}. This is the fraction of structures in sampled data that have a matching structure in {self.reference_dataset.name}.' + ) + + @cached_property + def value(self) ->float: + """ + Fraction of reference_structures that are in data_structures + """ + match_dict = self.structure_capability.matches_in_reference + ref_points_with_at_least_one_match = set([val for v in match_dict. + values() for val in v]) + return len(ref_points_with_at_least_one_match) / len(self. + reference_dataset) + + +class FracUniqueStructures(BaseStructureMetric, BaseAggregateMetric): + aggregation_method: Literal['mean'] = 'mean' + name = 'frac_unique_structures' + pre_aggregation_name = 'unique' + + @property + def description(self) ->str: + return 'Fraction of unique structures in sampled data.' + + def compute_pre_aggregation_values(self) ->numpy.typing.NDArray: + return self.structure_capability.is_unique + + +class FracNovelStructures(BaseStructureMetric, BaseAggregateMetric): + aggregation_method: Literal['mean'] = 'mean' + name = 'frac_novel_structures' + pre_aggregation_name = 'novel' + + @property + def description(self) ->str: + return 'Fraction of novel structures in sampled data.' + + def compute_pre_aggregation_values(self) ->numpy.typing.NDArray: + return self.structure_capability.is_novel + + +class FracNovelUniqueStructures(BaseStructureMetric, BaseAggregateMetric): + aggregation_method: Literal['mean'] = 'mean' + name = 'frac_novel_unique_structures' + pre_aggregation_name = 'novel_unique' + + @property + def description(self) ->str: + return 'Fraction of novel unique structures in sampled data.' + + def compute_pre_aggregation_values(self) ->numpy.typing.NDArray: + return (self.structure_capability.is_novel & self. + structure_capability.is_unique) + + +class AvgStructureValidity(BaseStructureMetric, BaseAggregateMetric): + aggregation_method: Literal['mean'] = 'mean' + name = 'avg_structure_validity' + pre_aggregation_name = 'structure_validity' + + @property + def description(self) ->str: + return ( + 'Average structural validity of structures in sampled data. Any atom-atom distances less than 0.5 Angstroms or a volume less than 0.1 Angstrom**3 are considered invalid .' + ) + + def compute_pre_aggregation_values(self) ->numpy.typing.NDArray: + return np.array([structure_validity(structure=structure) for + structure in tqdm(self.structure_capability.structures, desc= + 'Computing avg structure validity')]) + + +class AvgCompValidity(BaseStructureMetric, BaseAggregateMetric): + aggregation_method: Literal['mean'] = 'mean' + name = 'avg_comp_validity' + pre_aggregation_name = 'comp_validity' + + @property + def description(self) ->str: + return ( + 'Average composition validity (according to smact) of structures in sampled data.' + ) + + def compute_pre_aggregation_values(self) ->numpy.typing.NDArray: + return np.array([is_smact_valid(structure=structure) for structure in + tqdm(self.structure_capability.structures, desc= + 'Computing avg comp validity')]) + + +class AvgStructureCompValidity(BaseStructureMetric, BaseAggregateMetric): + aggregation_method: Literal['mean'] = 'mean' + name = 'avg_structure_comp_validity' + pre_aggregation_name = 'structure_comp_validity' + + @property + def description(self) ->str: + return ( + 'Average number of structures in sampled data that are both valid structures and have a valid smact compositions.' + ) + + def compute_pre_aggregation_values(self) ->numpy.typing.NDArray: + valid_comp = [structure_validity(structure=structure) for structure in + self.structure_capability.structures] + valid_struct = [is_smact_valid(structure=structure) for structure in + self.structure_capability.structures] + return np.array(valid_comp) & np.array(valid_struct) + + +class FracNovelSystems(BaseStructureMetric): + name = 'frac_novel_systems' + + @property + def description(self) ->str: + return ( + f'Fraction of distinct chemical systems in sampled data and not in {self.reference_dataset.name}.' + ) + + @cached_property + def value(self) ->float: + chemical_systems = set([structure.composition.chemical_system for + structure in self.structure_capability.structures]) + return len([chemsys for chemsys in chemical_systems if chemsys not in + self.reference_dataset.entries_by_chemsys]) / len(self. + structure_capability.structures) + + +def is_smact_valid(structure: Structure) ->bool: + """ + Returns True if the structure is valid according to the + smact validity checker else False. + """ + elem_counter = Counter(structure.atomic_numbers) + composition = [(elem, elem_counter[elem]) for elem in sorted( + elem_counter.keys())] + elems, counts = list(zip(*composition)) + counts = np.array(counts) + counts = counts / np.gcd.reduce(counts) + comps: tuple[int, ...] = tuple(np.array(counts).astype('int')) + try: + return smact_validity(comp=elems, count=comps, use_pauling_test= + True, include_alloys=True) + except TypeError: + raise TypeError( + f'SMACT validity checker failed. Check that all elements {structure.composition} present in the structure are also present in smact.element_dictionary().' + ) + except UnicodeDecodeError: + return smact_validity(comp=elems, count=comps, use_pauling_test= + True, include_alloys=True) + + +def smact_validity(comp: (tuple[int, ...] | tuple[str, ...]), count: tuple[ + int, ...], use_pauling_test: bool=True, include_alloys: bool=True, + include_cutoff: bool=False, use_element_symbol: bool=False) ->bool: + """Computes SMACT validity. + + Args: + comp: Tuple of atomic number or element names of elements in a crystal. + count: Tuple of counts of elements in a crystal. + use_pauling_test: Whether to use electronegativity test. That is, at least in one + combination of oxidation states, the more positive the oxidation state of a site, + the lower the electronegativity of the element for all pairs of sites. + include_alloys: if True, returns True without checking charge balance or electronegativity + if the crystal is an alloy (consisting only of metals) (default: True). + include_cutoff: assumes valid crystal if the combination of oxidation states is more + than 10^6 (default: False). + + Returns: + True if the crystal is valid, False otherwise. + """ + assert len(comp) == len(count) + if use_element_symbol: + elem_symbols = comp + else: + elem_symbols = tuple([str(Element.from_Z(Z=elem)) for elem in comp]) + space = smact.element_dictionary(elem_symbols) + smact_elems = [e[1] for e in space.items()] + electronegs = [e.pauling_eneg for e in smact_elems] + ox_combos = [e.oxidation_states for e in smact_elems] + if len(set(elem_symbols)) == 1: + return True + if include_alloys: + is_metal_list = [(elem_s in smact.metals) for elem_s in elem_symbols] + if all(is_metal_list): + return True + threshold = np.max(count) + compositions = [] + n_comb = np.prod([len(ls) for ls in ox_combos]) + if n_comb > 1000000.0 and include_cutoff: + return True + for ox_states in itertools.product(*ox_combos): + stoichs = [(c,) for c in count] + cn_e, cn_r = smact.neutral_ratios(ox_states, stoichs=stoichs, + threshold=threshold) + if cn_e: + if use_pauling_test: + try: + electroneg_OK = pauling_test(ox_states, electronegs) + except TypeError: + electroneg_OK = True + else: + electroneg_OK = True + if electroneg_OK: + for ratio in cn_r: + compositions.append(tuple([elem_symbols, ox_states, ratio]) + ) + compositions = [(i[0], i[2]) for i in compositions] + compositions = list(set(compositions)) + if len(compositions) > 0: + return True + else: + return False + + +def structure_validity(structure: Structure, cutoff: float=0.5) ->bool: + dist_mat = structure.distance_matrix + dist_mat = dist_mat + np.diag(np.ones(dist_mat.shape[0]) * (cutoff + 10.0)) + if dist_mat.min() < cutoff or structure.volume < 0.1: + return False + else: + return True diff --git a/jointContribution/mattergen/mattergen/evaluation/reference/__init__.py b/jointContribution/mattergen/mattergen/evaluation/reference/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/evaluation/reference/presets.py b/jointContribution/mattergen/mattergen/evaluation/reference/presets.py new file mode 100644 index 00000000..ca9b813d --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/reference/presets.py @@ -0,0 +1,29 @@ +from functools import cached_property +from pathlib import Path + +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +from mattergen.evaluation.reference.reference_dataset_serializer import \ + LMDBGZSerializer + + +class ReferenceMP2020Correction(ReferenceDataset): + """Reference dataset using the MP2020 Energy Correction scheme. + This dataset contains entries from the Materials Project [https://next-gen.materialsproject.org/] + and Alexandria [https://next-gen.materialsproject.org/]. + All 845,997 structures are relaxed using the GGA-PBE functional and have energy corrections applied using the MP2020 scheme. + """ + + def __init__(self): + super().__init__("MP2020correction", ReferenceMP2020Correction.from_preset()) + + @classmethod + def from_preset(cls) -> "ReferenceMP2020Correction": + current_dir = Path(__file__).parent + return LMDBGZSerializer().deserialize( + f"{current_dir}/../../../data-release/alex-mp/reference_MP2020correction.gz" + ) + + @cached_property + def is_ordered(self) -> bool: + """Returns True if all structures are ordered.""" + return True diff --git a/jointContribution/mattergen/mattergen/evaluation/reference/reference_dataset.py b/jointContribution/mattergen/mattergen/evaluation/reference/reference_dataset.py new file mode 100644 index 00000000..e6342f95 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/reference/reference_dataset.py @@ -0,0 +1,97 @@ +from functools import cached_property +from typing import Iterable, Iterator, Mapping + +import numpy as np +from mattergen.evaluation.utils.symmetry_analysis import ( + DefaultSpaceGroupAnalyzer, DisorderedSpaceGroupAnalyzer) +from mattergen.evaluation.utils.utils import (generate_chemsys_dict, + generate_reduced_formula_dict) +from pymatgen.entries.computed_entries import ComputedStructureEntry + + +class ReferenceDataset(Iterable[ComputedStructureEntry]): + """Immutable collection of reference entries with the ability to cache + some computation (e.g., space groups). + """ + + def __init__(self, name: str, impl: "ReferenceDatasetImpl"): + self.name = name + self.impl = impl + + @staticmethod + def from_entries( + name: str, entries: Iterable[ComputedStructureEntry] + ) -> "ReferenceDataset": + return ReferenceDataset(name, ReferenceDatasetImpl(entries)) + + def __iter__(self) -> Iterator[ComputedStructureEntry]: + yield from self.impl + + def __len__(self) -> int: + return len(self.impl) + + @property + def entries_by_reduced_formula(self) -> Mapping[str, list[ComputedStructureEntry]]: + return self.impl.entries_by_reduced_formula + + @property + def entries_by_chemsys(self) -> Mapping[str, list[ComputedStructureEntry]]: + return self.impl.entries_by_chemsys + + @cached_property + def space_group_numbers(self) -> dict[str, float]: + return np.array( + [ + DefaultSpaceGroupAnalyzer(e.structure).get_space_group_number() + for e in self + ] + ) + + @cached_property + def disordered_space_group_numbers(self) -> dict[str, float]: + return np.array( + [ + DisorderedSpaceGroupAnalyzer(e.structure).get_space_group_number() + for e in self + ] + ) + + @cached_property + def lattice_angles(self) -> np.typing.NDArray[np.float64]: + """Returns a list containing all the lattice angles in the dataset (shape=(Ncrystals*3, )).""" + return np.concatenate([e.structure.lattice.angles for e in self]) + + @cached_property + def densities(self) -> np.typing.NDArray[np.float64]: + """Returns a list containing the density for each structure in the dataset.""" + return np.array([e.structure.density for e in self]) + + @cached_property + def is_ordered(self) -> bool: + """Returns True if all structures are ordered.""" + return all(e.structure.is_ordered for e in self) + + +class ReferenceDatasetImpl(Iterable[ComputedStructureEntry]): + """The implementation of ReferenceDataset. Direct access to entries is not allowed.""" + + def __init__(self, entries: Iterable[ComputedStructureEntry]): + self._entries = tuple(entries) + + def __iter__(self) -> Iterator[ComputedStructureEntry]: + return iter(self._entries) + + def __len__(self) -> int: + return len(self._entries) + + @cached_property + def entries_by_reduced_formula(self) -> Mapping[str, list[ComputedStructureEntry]]: + """This is a slow path. Subclasses may override entries_by_reduced_formula method + to avoid calling this method.""" + return generate_reduced_formula_dict(self._entries) + + @cached_property + def entries_by_chemsys(self) -> Mapping[str, list[ComputedStructureEntry]]: + """This is a slow path. Subclasses may override entries_by_chemsys method + to avoid calling this method.""" + return generate_chemsys_dict(self._entries) diff --git a/jointContribution/mattergen/mattergen/evaluation/reference/reference_dataset_serializer.py b/jointContribution/mattergen/mattergen/evaluation/reference/reference_dataset_serializer.py new file mode 100644 index 00000000..dffd1b93 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/reference/reference_dataset_serializer.py @@ -0,0 +1,375 @@ +import gzip +import os +import pickle +import shutil +import weakref +from collections import defaultdict +from functools import cached_property +from pathlib import Path +from tempfile import mkdtemp +from typing import Any, DefaultDict, Iterator, Mapping + +import lmdb +from mattergen.evaluation.reference.reference_dataset import ( + ReferenceDataset, ReferenceDatasetImpl) +from mattergen.evaluation.utils.lmdb_utils import (lmdb_get, lmdb_open, + lmdb_read_metadata) +from monty.json import MontyDecoder +from pymatgen.core import Composition +from pymatgen.entries.computed_entries import ComputedStructureEntry +from tqdm.autonotebook import tqdm + + +def gzip_compress( + file_path: (str | os.PathLike), output_dir: (str | os.PathLike) +) -> Path: + """Compresses a file using gzip. Returns the compressed file path.""" + output_path = Path(output_dir) / (Path(file_path).name + ".gz") + with open(file_path, "rb") as fin: + with gzip.open(output_path, "wb") as fout: + fout.write(fin.read()) + return output_path + + +def gzip_decompress( + gzip_file_path: (str | os.PathLike), output_dir: (str | os.PathLike) +) -> Path: + """Decompresses a gzipped file. Returns the decompressed file path.""" + output_path = Path(output_dir) / Path(gzip_file_path).name[:-3] + with gzip.open(gzip_file_path, "rb") as fin: + with open(output_path, "wb") as fout: + fout.write(fin.read()) + return output_path + + +class LmdbNotFoundError(Exception): + pass + + +def lmdb_open(db_path: (str | os.PathLike), readonly: bool = False) -> lmdb.Environment: + if readonly: + return lmdb.open( + str(db_path), + subdir=False, + readonly=True, + lock=False, + readahead=False, + meminit=False, + max_readers=1, + ) + else: + return lmdb.open( + str(db_path), + map_size=1099511627776 * 2, + subdir=False, + meminit=False, + map_async=True, + ) + + +def lmdb_read_metadata(db_path: (str | os.PathLike), key: str, default=None) -> Any: + with lmdb_open(db_path, readonly=True) as db: + with db.begin() as txn: + result = lmdb_get(txn, key, default=default) + return result + + +def lmdb_get( + txn: lmdb.Transaction, key: str, default: Any = None, raise_if_missing: bool = True +) -> Any: + """ + Fetches a record from a database. + + Args: + txn: LMDB transaction (use env.begin()) + key: key of the data to be fetched. + default: default value to be used if the record doesn't exist. + raise_if_missing: raise LmdbNotFoundError if the record doesn't exist + and no default value was given. + + Returns: + the value of the retrieved data. + """ + value = txn.get(key.encode("ascii")) + if value is None: + if default is None and raise_if_missing: + raise LmdbNotFoundError( + f"Key {key} not found in database but default was not provided." + ) + return default + return pickle.loads(value) + + +def lmdb_put(txn: lmdb.Transaction, key: str, value: Any) -> bool: + """ + Stores a record in a database. + + Args: + txn: LMDB transaction (use env.begin()) + key: key of the data to be stored. + value: value of the data to be stored (needs to be picklable). + + Returns: + True if it was written. + """ + return txn.put( + key.encode("ascii"), pickle.dumps(value, protocol=pickle.HIGHEST_PROTOCOL) + ) + + +class LMDBGZSerializer: + def __init__(self): + pass + + def serialize( + self, ref_dataset: ReferenceDataset, dataset_path: (str | os.PathLike) + ) -> None: + """Writes a dataset to a file using the gzip-compressed LMDB format.""" + lmdb_file_path = str(dataset_path)[:-3] + with lmdb_open(lmdb_file_path, readonly=False) as env: + with env.begin(write=True) as txn: + lmdb_put(txn, "name", ref_dataset.name) + counter: DefaultDict[str, DefaultDict[str, int]] = defaultdict( + lambda: defaultdict(int) + ) + for entry in tqdm( + ref_dataset, desc="Serializing dataset", total=len(ref_dataset) + ): + entry.structure.unset_charge() + structure_without_oxidation_states = ( + entry.structure.remove_oxidation_states() + ) + entry = ComputedStructureEntry.from_dict( + { + **entry.as_dict(), + "structure": structure_without_oxidation_states, + "composition": structure_without_oxidation_states.composition, + } + ) + chemsys = "-".join( + sorted({el.symbol for el in entry.composition.elements}) + ) + reduced_formula = entry.composition.reduced_formula + n = counter[chemsys][reduced_formula] + key = f"{chemsys}.{reduced_formula}.{n}" + with env.begin(write=True) as txn: + lmdb_put(txn, key, entry.as_dict()) + counter[chemsys][reduced_formula] += 1 + chemical_systems = list(counter.keys()) + with env.begin(write=True) as txn: + lmdb_put(txn, "chemical_systems", chemical_systems) + for chemsys, length_by_reduced_formula in tqdm( + counter.items(), desc="Saving indexes", total=len(counter) + ): + reduced_formulas = list(length_by_reduced_formula.keys()) + with env.begin(write=True) as txn: + lmdb_put(txn, f"{chemsys}.reduced_formulas", reduced_formulas) + for reduced_formula, length in length_by_reduced_formula.items(): + with env.begin(write=True) as txn: + lmdb_put(txn, f"{chemsys}.{reduced_formula}.length", length) + gzip_compress(lmdb_file_path, Path(dataset_path).parent) + + def deserialize(self, dataset_path: (str | os.PathLike)) -> ReferenceDataset: + """Reads a dataset from a file using the gzip-compressed LMDB format.""" + tempdir = mkdtemp() + lmdb_path = gzip_decompress(dataset_path, tempdir) + name = lmdb_read_metadata(lmdb_path, "name") + return ReferenceDataset( + name=name, impl=LMDBBackedReferenceDatasetImpl(lmdb_path, cleanup_dir=True) + ) + + +class LMDBBackedReferenceDatasetImpl(ReferenceDatasetImpl): + """Implementation of ReferenceDataset backed by LMDB. + + Expected LMDB structure: + { + "chemical_systems": ["Li-P", "Li-S", ...], + "Li-P.reduced_formulas": ["LiP", "LiP2", ...], + "Li-P.LiP.length": 4, + "Li-P.LiP.0": "", + ... + "Li-P.LiP.3": "", + "Li-P.LiP2.length": 1, + ... + "Li-S.Li2S.length": 2, + ... + } + """ + + def __init__(self, lmdb_path: Path, cleanup_dir: bool = False): + """Initializes the LMDB-backed reference dataset. + + Args: + lmdb_path: path to the LMDB database. + cleanup_dir: whether to delete the directory containing the database when this object + is garbage collected (default: False). + """ + self.env = lmdb_open(lmdb_path, readonly=True) + self.num_entries_by_chemsys_reduced_formulas = ( + self._build_num_entries_by_chemsys_reduced_formulas(lmdb_path) + ) + self.total_num_entries = sum( + sum(d.values()) + for d in self.num_entries_by_chemsys_reduced_formulas.values() + ) + weakref.finalize(self, self._cleanup, self.env, cleanup_dir) + + def _build_num_entries_by_chemsys_reduced_formulas( + self, lmdb_path: Path + ) -> dict[str, dict[str, int]]: + chemical_systems = lmdb_read_metadata(lmdb_path, "chemical_systems") + result: defaultdict[str, dict[str, int]] = defaultdict(dict) + with self.env.begin() as txn: + for chemsys in chemical_systems: + reduced_formulas = lmdb_read_metadata( + lmdb_path, f"{chemsys}.reduced_formulas" + ) + for reduced_formula in reduced_formulas: + result[chemsys][reduced_formula] = lmdb_get( + txn, f"{chemsys}.{reduced_formula}.length" + ) + return {key: val for key, val in result.items()} + + def __iter__(self) -> Iterator[ComputedStructureEntry]: + """Iterates over the entries in the dataset.""" + for ( + chemsys, + num_entries_by_reduced_formula, + ) in self.num_entries_by_chemsys_reduced_formulas.items(): + for reduced_formula in num_entries_by_reduced_formula: + yield from self.get_entries_by_chemsys_reduced_formula( + chemsys, reduced_formula + ) + + def __len__(self) -> int: + return self.total_num_entries + + @property + def chemical_systems(self) -> tuple[str, ...]: + return tuple(self.num_entries_by_chemsys_reduced_formulas.keys()) + + @cached_property + def reduced_formulas(self) -> tuple[str, ...]: + return tuple( + [ + reduced_formula + for num_entries_by_reduced_formula in self.num_entries_by_chemsys_reduced_formulas.values() + for reduced_formula in num_entries_by_reduced_formula + ] + ) + + def get_entries_by_chemsys(self, chemsys: str) -> Iterator[ComputedStructureEntry]: + for reduced_formula in self.num_entries_by_chemsys_reduced_formulas[ + chemsys + ].keys(): + yield from self.get_entries_by_chemsys_reduced_formula( + chemsys, reduced_formula + ) + + def get_entries_by_reduced_formula( + self, reduced_formula: str + ) -> Iterator[ComputedStructureEntry]: + chemsys = Composition(reduced_formula).chemical_system + yield from self.get_entries_by_chemsys_reduced_formula(chemsys, reduced_formula) + + def get_entries_by_chemsys_reduced_formula( + self, chemsys: str, reduced_formula: str + ) -> Iterator[ComputedStructureEntry]: + length = self.num_entries_by_chemsys_reduced_formulas[chemsys][reduced_formula] + for i in range(length): + with self.env.begin() as txn: + entry_dict = lmdb_get(txn, f"{chemsys}.{reduced_formula}.{i}") + yield MontyDecoder().process_decoded(entry_dict) + + @cached_property + def entries_by_reduced_formula(self) -> "LMDBBackedReducedFormulaLookup": + """Returns a mapping from reduced formula to entries.""" + return LMDBBackedReducedFormulaLookup(self) + + @cached_property + def entries_by_chemsys(self) -> "LMDBBackedChemicalSystemLookup": + """Returns a mapping from chemical system to entries.""" + return LMDBBackedChemicalSystemLookup(self) + + @classmethod + def _cleanup(cls, env: lmdb.Environment, cleanup_dir: bool) -> None: + """Closes the LMDB environment and deletes the directory containing the database. + + This needs to be a class method to prevent additional reference to the object. + """ + try: + database_dir = Path(env.path()).parent + except lmdb.Error: + return + print(f"Closing LMDB environment {env.path()}") + env.close() + if cleanup_dir: + shutil.rmtree(database_dir) + + def cleanup(self, cleanup_dir: bool = False) -> None: + """Closes the LMDB environment and optionally cleanup the directory containing the database.""" + self._cleanup(self.env, cleanup_dir) + + +class WeakRefImplMixin: + """A mixin class that makes the reference to the underlying + LMDBBackedReferenceDatasetImpl object weak.""" + + def __init__(self, impl: LMDBBackedReferenceDatasetImpl): + self._impl = weakref.ref(impl) + + @property + def impl(self) -> LMDBBackedReferenceDatasetImpl: + impl = self._impl() + assert impl is not None + return impl + + +class LMDBBackedChemicalSystemLookup( + WeakRefImplMixin, Mapping[str, list[ComputedStructureEntry]] +): + """A lazy immutable mapping from chemical system to entries. It is + lazy in the sense that the entries are read from the disk only when + the user requests them.""" + + def __init__(self, impl: LMDBBackedReferenceDatasetImpl): + super().__init__(impl) + self.chemical_systems = frozenset(self.impl.chemical_systems) + + def __len__(self) -> int: + return len(self.impl.chemical_systems) + + def __iter__(self) -> Iterator[str]: + return iter(self.impl.chemical_systems) + + def __contains__(self, chemical_system: object) -> bool: + return chemical_system in self.chemical_systems + + def __getitem__(self, chemical_system: str) -> list[ComputedStructureEntry]: + return list(self.impl.get_entries_by_chemsys(chemical_system)) + + +class LMDBBackedReducedFormulaLookup( + WeakRefImplMixin, Mapping[str, list[ComputedStructureEntry]] +): + """A lazy immutable mapping from reduced formula to entries. It is + lazy in the sense that the entries are read from the disk only when + the user requests them.""" + + def __init__(self, impl: LMDBBackedReferenceDatasetImpl): + super().__init__(impl) + self.reduced_formulas = frozenset(self.impl.reduced_formulas) + + def __len__(self) -> int: + return len(self.reduced_formulas) + + def __iter__(self) -> Iterator[str]: + return iter(self.impl.reduced_formulas) + + def __contains__(self, reduced_formula: object) -> bool: + return reduced_formula in self.reduced_formulas + + def __getitem__(self, reduced_formula: str) -> list[ComputedStructureEntry]: + """Returns a list of entries with the given reduced formula.""" + return list(self.impl.get_entries_by_reduced_formula(reduced_formula)) diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/__init__.py b/jointContribution/mattergen/mattergen/evaluation/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/dataset_matcher.py b/jointContribution/mattergen/mattergen/evaluation/utils/dataset_matcher.py new file mode 100644 index 00000000..058ad94a --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/dataset_matcher.py @@ -0,0 +1,256 @@ +from collections import defaultdict +from typing import Iterable, List, Mapping + +import numpy as np +from mattergen.evaluation.reference.reference_dataset import ReferenceDataset +from mattergen.evaluation.utils.logging import logger +from mattergen.evaluation.utils.structure_matcher import ( + DefaultDisorderedStructureMatcher, DisorderedStructureMatcher, + OrderedStructureMatcher) +from pymatgen.analysis.structure_matcher import StructureMatcher +from pymatgen.core.structure import Structure +from pymatgen.entries.computed_entries import ComputedStructureEntry +from tqdm import tqdm + + +def get_matches( + structure_matcher: StructureMatcher, d1: List[Structure], d2: List[Structure] +) -> dict[int, list[int]]: + """ + Iterates d1 to find matches in d2. + + Args: + structure_matcher: StructureMatcher to use for comparison. + d1: List of structures to compare. + d2: List of structures to compare against. + + Returns: + matches: Dictionary of matches. Key is the index of the structure in d1 and value is the index of the structure in d2. + + """ + matches: dict[int, list[int]] = defaultdict(list) + for i in range(len(d1)): + for j in range(len(d2)): + if structure_matcher.fit(d1[i], d2[j]): + matches[i].append(j) + return matches + + +def get_unique( + structure_matcher: StructureMatcher, structures: List[Structure] +) -> List[int]: + if len(structures) == 1: + return [0] + unique_structures: list[Structure] = [] + unique_idx: list[int] = [] + for idx, structure in enumerate(structures): + unique = True + for structure_2 in unique_structures: + if structure_matcher.fit(structure, structure_2): + unique = False + break + if unique: + unique_structures.append(structure) + unique_idx.append(idx) + return unique_idx + + +def get_dataset_matcher( + all_structures_ordered: bool, structure_matcher: StructureMatcher +) -> "DatasetMatcher": + if all_structures_ordered: + return OrderedDatasetMatcher(structure_matcher) + return DisorderedDatasetMatcher(structure_matcher) + + +def get_global_index_from_local_index( + entries_mapping_by_key: Mapping[str, list[ComputedStructureEntry]], + local_index: Mapping[str, list[int]], +) -> list[int]: + """Turn local structure chemsys index into global structure mask.""" + global_indices = [ + entries_mapping_by_key[k][vv].entry_id + for k, v in local_index.items() + for vv in v + ] + return global_indices + + +def get_global_match_dict_from_local_dict( + data_entries_mapping_by_key: Mapping[str, list[ComputedStructureEntry]], + reference_entries_mapping_by_key: Mapping[str, list[ComputedStructureEntry]], + local_index: Mapping[str, dict[int, list[int]]], +) -> dict[int, list[str]]: + global_match_dict = {} + for k, match_dict in local_index.items(): + if len(match_dict) == 0 or max(len(v) for v in match_dict.values()) == 0: + continue + data_entries_mapping = data_entries_mapping_by_key[k] + reference_entries_mapping = reference_entries_mapping_by_key[k] + for d1_ix, ref_ix_list in match_dict.items(): + global_match_dict[data_entries_mapping[d1_ix].entry_id] = [ + reference_entries_mapping[match_ix].data["material_id"] + for match_ix in ref_ix_list + ] + return global_match_dict + + +def get_mask_from_local_index( + entries_mapping_by_key: Mapping[str, list[ComputedStructureEntry]], + local_index: Mapping[str, List[int]], +) -> np.typing.NDArray[np.bool_]: + """Turn local structure chemsys index into global structure mask.""" + global_indices = get_global_index_from_local_index( + entries_mapping_by_key, local_index + ) + total_num_entries = sum(len(v) for v in entries_mapping_by_key.values()) + mask = np.zeros(total_num_entries, dtype=bool) + mask[global_indices] = True + return mask + + +class OrderedDatasetUniquenessComputer: + def __init__( + self, structure_matcher: StructureMatcher = DefaultDisorderedStructureMatcher() + ): + self.structure_matcher = structure_matcher + + def __call__(self, dataset: ReferenceDataset) -> np.typing.NDArray[bool]: + local_index: dict[str, List[int]] = {} + for reduced_formula, data_entries in tqdm( + dataset.entries_by_reduced_formula.items(), + desc="Finding unique structures by reduced formula", + ): + structures = [e.structure for e in data_entries] + assert all( + [s.is_ordered for s in structures] + ), "OrderedDatasetUniquenessComputer only works for ordered structures." + local_index[reduced_formula] = get_unique( + self.structure_matcher, structures + ) + return get_mask_from_local_index( + dataset.entries_by_reduced_formula, local_index + ) + + +class DisorderedDatasetUniquenessComputer: + def __init__( + self, structure_matcher: StructureMatcher = DefaultDisorderedStructureMatcher() + ): + self.structure_matcher = structure_matcher + + def __call__(self, dataset: "ReferenceDataset") -> np.typing.NDArray[bool]: + local_index: dict[str, List[int]] = {} + for chemsys, data_entries in tqdm( + dataset.entries_by_chemsys.items(), + desc="Finding unique structures by chemsys", + ): + structures = [e.structure for e in data_entries] + if not all([s.is_ordered for s in structures]): + logger.warning( + "Using DisorderedDatasetUniquenessComputer for ordered structures. This is less efficient than using OrderedDatasetUniquenessComputer." + ) + local_index[chemsys] = get_unique(self.structure_matcher, structures) + return get_mask_from_local_index(dataset.entries_by_chemsys, local_index) + + +def matches_to_mask( + match_idx: Iterable[int], num_samples: int +) -> np.typing.NDArray[bool]: + """ + Convert matches to a boolean mask. + + Args: + match_idx: List of indices of the structures from the input dataset which have a match + in the reference dataset. + num_samples: Number of structures in the input dataset. + + Returns: + mask: Boolean mask of length num_samples. True if the structure has a match, False if not. + """ + mask = np.zeros(num_samples, dtype=bool) + mask[list(match_idx)] = True + return mask + + +class DatasetMatcher: + """ + Class to match a dataset of structures to a reference dataset. + Can be used to compute novelty of the input dataset w.r.t. the reference dataset or + to compute the recall. + """ + + def __init__( + self, structure_matcher: (OrderedStructureMatcher | DisorderedStructureMatcher) + ) -> None: + self.structure_matcher = structure_matcher + + def grouped_dataset_entries( + self, dataset: ReferenceDataset + ) -> Mapping[str, list[ComputedStructureEntry]]: + """ + Returns a dictionary of entries grouped by a key, e.g., chemsys or reduced_formula. + To be implemented by the concrete dataset matcher. + """ + raise NotImplementedError + + def __call__( + self, dataset: ReferenceDataset, reference_dataset: ReferenceDataset + ) -> dict[int, list[str]]: + """ + For each entry in the dataset, check if there is a match in the reference dataset. + + Args: + dataset: Dataset to match. + reference_dataset: Reference dataset to match against. + + Returns: + global_match_idx: Dictionary of matches. Key is the index of the structure in the input dataset and + value is a list of the material_ids (str) of the matching structures in the reference dataset + """ + local_match_indices: dict[str, dict[int, list[int]]] = {} + grouped_dataset_entries = self.grouped_dataset_entries(dataset=dataset) + grouped_reference_entries = self.grouped_dataset_entries( + dataset=reference_dataset + ) + for group_key, data_entries in tqdm( + grouped_dataset_entries.items(), desc="Finding novel structures" + ): + data_structures = [e.structure for e in data_entries] + reference_structures = [ + e.structure for e in grouped_reference_entries.get(group_key, []) + ] + matches = get_matches( + self.structure_matcher, data_structures, reference_structures + ) + local_match_indices[group_key] = matches + global_match_dict = get_global_match_dict_from_local_dict( + grouped_dataset_entries, grouped_reference_entries, local_match_indices + ) + return global_match_dict + + +class OrderedDatasetMatcher(DatasetMatcher): + def __init__(self, structure_matcher: OrderedStructureMatcher): + super().__init__(structure_matcher=structure_matcher) + + def grouped_dataset_entries( + self, dataset: ReferenceDataset + ) -> Mapping[str, list[ComputedStructureEntry]]: + """ + Ordered dataset matcher groups by reduced formula. + """ + return dataset.entries_by_reduced_formula + + +class DisorderedDatasetMatcher(DatasetMatcher): + def __init__(self, structure_matcher: DisorderedStructureMatcher): + super().__init__(structure_matcher=structure_matcher) + + def grouped_dataset_entries( + self, dataset: ReferenceDataset + ) -> Mapping[str, list[ComputedStructureEntry]]: + """ + Disordered dataset matcher groups by chemsys. + """ + return dataset.entries_by_chemsys diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/globals.py b/jointContribution/mattergen/mattergen/evaluation/utils/globals.py new file mode 100644 index 00000000..13008fd1 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/globals.py @@ -0,0 +1,2 @@ +DEFAULT_STABILITY_THRESHOLD = 0.1 +MAX_RMSD = 0.5 diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/lmdb_utils.py b/jointContribution/mattergen/mattergen/evaluation/utils/lmdb_utils.py new file mode 100644 index 00000000..c52f4495 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/lmdb_utils.py @@ -0,0 +1,268 @@ +import bisect +import os +import pickle +from abc import abstractmethod +from collections.abc import Iterable, Iterator, Sequence +from pathlib import Path +from typing import Any, Generic, TypeVar + +import lmdb +from tqdm import tqdm + +T = TypeVar("T") +DataPoint = TypeVar("DataPoint") + + +def lmdb_open(db_path: (str | os.PathLike), readonly: bool = False) -> lmdb.Environment: + if readonly: + return lmdb.open( + str(db_path), + subdir=False, + readonly=True, + lock=False, + readahead=False, + meminit=False, + max_readers=1, + ) + else: + return lmdb.open( + str(db_path), + map_size=1099511627776 * 2, + subdir=False, + meminit=False, + map_async=True, + ) + + +def lmdb_read_metadata(db_path: (str | os.PathLike), key: str, default=None) -> Any: + with lmdb_open(db_path, readonly=True) as db: + with db.begin() as txn: + result = lmdb_get(txn, key, default=default) + return result + + +def lmdb_put(txn: lmdb.Transaction, key: str, value: Any) -> bool: + """ + Stores a record in a database. + + Args: + txn: LMDB transaction (use env.begin()) + key: key of the data to be stored. + value: value of the data to be stored (needs to be picklable). + + Returns: + True if it was written. + """ + return txn.put( + key.encode("ascii"), pickle.dumps(value, protocol=pickle.HIGHEST_PROTOCOL) + ) + + +class LmdbNotFoundError(Exception): + pass + + +def lmdb_get( + txn: lmdb.Transaction, key: str, default: Any = None, raise_if_missing: bool = True +) -> Any: + """ + Fetches a record from a database. + + Args: + txn: LMDB transaction (use env.begin()) + key: key of the data to be fetched. + default: default value to be used if the record doesn't exist. + raise_if_missing: raise LmdbNotFoundError if the record doesn't exist + and no default value was given. + + Returns: + the value of the retrieved data. + """ + value = txn.get(key.encode("ascii")) + if value is None: + if default is None and raise_if_missing: + raise LmdbNotFoundError( + f"Key {key} not found in database but default was not provided." + ) + return default + return pickle.loads(value) + + +def get_length(env: lmdb.Environment) -> int: + """ + Returns the value of the special record "length". + + Args: + env: LMDB environment (use lmdb.open()) + + Returns: + the value of the "length" record or zero if the record does not exist. + """ + with env.begin() as txn: + return lmdb_get(txn, "length", default=0) + + +def list_db_paths(data_dir: (str | os.PathLike)) -> list[Path]: + return sorted(Path(data_dir).glob("*.lmdb")) + + +def get_envs(data_dir: (str | os.PathLike)) -> Iterator[lmdb.Environment]: + """ + Creates LMDB environments stored in a directory. + + Args: + data_dir: directory where the .lmdb files are stored. + + Returns: + an iterator over LMDB environments. + """ + for lmdb_path in list_db_paths(data_dir): + yield lmdb_open(lmdb_path, readonly=True) + + +def get_indices(cum_lengths: Sequence[int], index: int) -> tuple[int, int]: + """ + Given a sequence of cumulative sequence lengths and a linear index over a sequence + of variable length databases, returns a pair of (db_index, el_index). + """ + db_index = bisect.bisect(cum_lengths, index) + el_index = index - cum_lengths[db_index - 1] if db_index > 0 else index + return db_index, el_index + + +class Metadata(Generic[DataPoint]): + @abstractmethod + def __init__(self, value=None): + """Initialize with an optional value""" + + @classmethod + def from_value(cls, value): + return cls(value) + + @property + @abstractmethod + def name(self): + """The name of the metadata""" + + @property + def is_frozen(self): + return False + + @property + def value(self): + """The value of the metadata""" + return self._value + + def check(self, num_points: int): + """Check consistency of the metadata""" + pass + + def update(self, index: int, sample: DataPoint): + """Update the metadata with the new datapoint""" + pass + + +def write_data_points_to_lmdb( + db_path: str, + samples: Iterable[DataPoint], + pid: (int | None) = None, + metadata: (list[Metadata] | None) = None, +) -> int: + """ + Creates or appends to a database of data points keyed by the string representation of linear + index over the data points. + + Args: + start_index: start index for this group of samples. Should match the length of the existing database. + db_path: path to store the database. + samples: iterable over the data points to be stored. + metadata: (optional) list of metadata objects implementing + `check` and `update` methods. + + Returns: + the number of samples stored in the database. + """ + with lmdb_open(db_path) as db: + start_index = get_length(db) + metadata = ( + check_and_init_metadata(db, metadata, start_index) if metadata else [] + ) + idx = -1 + for idx, sample in enumerate(tqdm(samples, position=pid or 0)): + index = start_index + idx + with db.begin(write=True) as txn: + lmdb_put(txn, str(index), sample) + for meta in metadata: + meta.update(index, sample) + if idx == -1: + return 0 + length = idx + 1 + original_length = get_length(db) + assert original_length == start_index + with db.begin(write=True) as txn: + lmdb_put(txn, "length", start_index + length) + check_and_put_metadata(db, metadata, start_index + length) + db.sync() + return length + + +def check_and_init_metadata( + db: lmdb.Environment, + metadata: list[Metadata], + length: int, + return_all: bool = True, + verbose: bool = False, +) -> list[Metadata]: + new_metadata = [] + for meta in metadata: + with db.begin() as txn: + stored_value = lmdb_get(txn, meta.name, raise_if_missing=False) + if stored_value is not None: + if meta.is_frozen: + if verbose: + print(f"stored value for {meta.name} is {stored_value}") + assert ( + meta.value == stored_value + ), f"Expected metadata {meta.name} to have value {meta.value}, but got {stored_value} in database {db}." + else: + if verbose: + print(f"checking {meta.name}") + meta = meta.from_value(value=stored_value) + meta.check(length) + if stored_value is None or return_all: + new_metadata.append(meta) + return new_metadata + + +def check_and_put_metadata(db: lmdb.Environment, metadata: list[Metadata], length: int): + for meta in metadata: + meta.check(length) + with db.begin(write=True) as txn: + lmdb_put(txn, meta.name, meta.value) + + +def ensure_metadata(db_path: str, metadata: list[Metadata]) -> int: + """Checks the metadata values stored in the database and compute missing ones to + ensure that all metadata are present. + + Args: + db_path: path to the database .lmdb file. + metadata: list of metadata. + + Returns: + the length of the database. + """ + with lmdb_open(db_path) as db: + length = get_length(db) + metadata = check_and_init_metadata(db, metadata, length, return_all=False) + if len(metadata) == 0: + return 0 + print(f"Need to compute missing metadata {[m.name for m in metadata]}") + for i in range(length): + with db.begin() as txn: + sample = lmdb_get(txn, str(i)) + for meta in metadata: + meta.update(i, sample) + check_and_put_metadata(db, metadata, length) + db.sync() + return length diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/logging.py b/jointContribution/mattergen/mattergen/evaluation/utils/logging.py new file mode 100644 index 00000000..43d3206e --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/logging.py @@ -0,0 +1,37 @@ +import logging +import sys + +import tqdm + + +class TqdmLoggingHandler(logging.StreamHandler): + def emit(self, record): + try: + msg = self.format(record) + tqdm.tqdm.write(msg) + self.flush() + except Exception: + self.handleError(record) + + +def get_logger(name=None, level=logging.INFO) -> logging.Logger: + """Returns a logger that is configured as: + - by default INFO level or higher messages are logged out in STDOUT. + - format includes file name, line number, etc. + """ + logger = logging.getLogger(name) + logger.setLevel(level) + logger.propagate = False + log_formatter = logging.Formatter( + "[%(asctime)s] [%(levelname)s] [%(filename)s:%(lineno)d:%(funcName)s] %(message)s" + ) + handler_out: logging.StreamHandler = TqdmLoggingHandler(sys.stdout) + handler_out.setFormatter(log_formatter) + logger.addHandler(handler_out) + return logger + + +def __getattr__(name): + if name == "logger": + return get_logger(name="MatterGen", level=logging.INFO) + raise AttributeError(f"module '{__name__}' has no attribute '{name}'") diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/metrics_structure_summary.py b/jointContribution/mattergen/mattergen/evaluation/utils/metrics_structure_summary.py new file mode 100644 index 00000000..7377c2b2 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/metrics_structure_summary.py @@ -0,0 +1,96 @@ +import warnings +from dataclasses import dataclass, field +from functools import cached_property + +import numpy as np +from mattergen.evaluation.utils.utils import (compute_rmsd_angstrom, + preprocess_structure) +from mattergen.evaluation.utils.vasprunlike import VasprunLike +from pymatgen.core import Structure +from pymatgen.entries.compatibility import (Compatibility, + MaterialsProject2020Compatibility) +from pymatgen.entries.computed_entries import ComputedStructureEntry + + +@dataclass +class MetricsStructureSummary: + entry: ComputedStructureEntry + properties: dict[str, float] = field(default_factory=dict) + original_structure: Structure | None = None + + @staticmethod + def from_structure_and_energy( + structure: Structure, + energy: float, + properties: (dict[str, float] | None) = None, + original_structure: (Structure | None) = None, + energy_correction_scheme: Compatibility = MaterialsProject2020Compatibility(), + ) -> "MetricsStructureSummary": + """ + Instantiates a MetricsStructureSummary from a JobStoreTaskDoc. + Useful for computing DFT-based metrics (or any compatible MLFF). + """ + vasprun_like = VasprunLike(structure=structure, energy=energy) + entry = vasprun_like.get_computed_entry( + inc_structure=True, energy_correction_scheme=energy_correction_scheme + ) + if original_structure is None: + warnings.warn("No original structure found, cannot compute RMSD metric.") + return MetricsStructureSummary( + entry=entry, + properties=properties or {}, + original_structure=original_structure, + ) + + @staticmethod + def from_structure( + structure: Structure, properties: (dict[str, float] | None) = None + ) -> "MetricsStructureSummary": + """ + Instantiates a MetricsStructureSummary from a Structure with an energy value of np.nan and initial_structure=None. + Useful for computing structure-based metrics. + """ + return MetricsStructureSummary( + entry=ComputedStructureEntry(structure=structure, energy=np.nan), + properties=properties or {}, + ) + + @cached_property + def rmsd_from_relaxation(self) -> float: + if self.original_structure is None: + return np.nan + else: + return compute_rmsd_angstrom( + self.entry.structure, preprocess_structure(self.original_structure) + ) + + @property + def structure(self) -> Structure: + return self.entry.structure + + @property + def chemical_system(self) -> str: + return self.entry.composition.chemical_system + + +def get_metrics_structure_summaries( + structures: list[Structure], + energies: list[float], + properties: (dict[str, list[float]] | None) = None, + original_structures: (list[Structure] | None) = None, + energy_correction_scheme: Compatibility = MaterialsProject2020Compatibility(), +) -> list[MetricsStructureSummary]: + if properties is None: + properties = {} + for prop in properties: + assert len(properties[prop]) == len(structures) + return [ + MetricsStructureSummary.from_structure_and_energy( + structure=structures[i], + energy=energies[i], + properties={k: v[i] for k, v in properties.items()} if properties else None, + original_structure=original_structures[i] if original_structures else None, + energy_correction_scheme=energy_correction_scheme, + ) + for i in range(len(structures)) + ] diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/relaxation.py b/jointContribution/mattergen/mattergen/evaluation/utils/relaxation.py new file mode 100644 index 00000000..93f1acac --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/relaxation.py @@ -0,0 +1,39 @@ +import numpy as np +from ase import Atoms +from mattersim.applications.batch_relax import BatchRelaxer +from mattersim.forcefield.potential import Potential +from mattersim.utils.logger_utils import get_logger +from pymatgen.core import Structure +from pymatgen.io.ase import AseAtomsAdaptor + +logger = get_logger() +logger.level("ERROR") + + +def relax_atoms( + atoms: list[Atoms], device: str = "cuda", load_path: str = None, **kwargs +) -> tuple[list[Atoms], np.ndarray]: + potential = Potential.from_checkpoint( + device=device, load_path=load_path, load_training_state=False + ) + batch_relaxer = BatchRelaxer(potential=potential, filter="EXPCELLFILTER", **kwargs) + relaxation_trajectories = batch_relaxer.relax(atoms) + relaxed_atoms = [t[-1] for t in relaxation_trajectories.values()] + total_energies = np.array([a.info["total_energy"] for a in relaxed_atoms]) + return relaxed_atoms, total_energies + + +def relax_structures( + structures: (Structure | list[Structure]), + device: str = "cuda", + load_path: str = None, + **kwargs +) -> tuple[list[Structure], np.ndarray]: + if isinstance(structures, Structure): + structures = [structures] + atoms = [AseAtomsAdaptor.get_atoms(s) for s in structures] + relaxed_atoms, total_energies = relax_atoms( + atoms, device=device, load_path=load_path, **kwargs + ) + relaxed_structures = [AseAtomsAdaptor.get_structure(a) for a in relaxed_atoms] + return relaxed_structures, total_energies diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/structure_matcher.py b/jointContribution/mattergen/mattergen/evaluation/utils/structure_matcher.py new file mode 100644 index 00000000..bbb5f944 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/structure_matcher.py @@ -0,0 +1,289 @@ +from itertools import combinations + +import numpy as np +from emmet.core.utils import get_sg +from mattergen.evaluation.utils.globals import MAX_RMSD +from pymatgen.analysis.structure_matcher import ( + AbstractComparator, OrderDisorderElementComparator, StructureMatcher) +from pymatgen.core.periodic_table import Element +from pymatgen.core.structure import Structure + + +class RMSDStructureMatcher(StructureMatcher): + """ + Structure matcher used for computing RMSD distance between structures. Has looser + tolerances than the default pymatgen StructureMatcher to ensure that we can get an + atom alignment even in case structures don't match. + """ + + def __init__(self): + super().__init__( + ltol=0.5, + stol=MAX_RMSD, + angle_tol=10, + primitive_cell=True, + scale=False, + attempt_supercell=True, + allow_subset=False, + ) + + +class OrderedStructureMatcher(StructureMatcher): + def __init__( + self, + ltol: float = 0.2, + stol: float = 0.3, + angle_tol: float = 5, + primitive_cell: float = True, + scale: float = True, + attempt_supercell: float = False, + allow_subset: float = False, + *args, + **kwargs + ): + super().__init__( + *args, + ltol=ltol, + stol=stol, + angle_tol=angle_tol, + primitive_cell=primitive_cell, + scale=scale, + attempt_supercell=attempt_supercell, + allow_subset=allow_subset, + **kwargs + ) + + @property + def name(self) -> str: + return "OrderedStructureMatcher" + + +class DefaultOrderedStructureMatcher(OrderedStructureMatcher): + """ + Ordered structure matcher with default parameters. No args or kwargs are passed in order + to ensure consistent behavior across all instances. + """ + + def __init__(self): + super().__init__() + + +class DisorderedStructureMatcher(StructureMatcher): + def __init__( + self, + ltol: float = 0.2, + stol: float = 0.3, + angle_tol: float = 5.0, + primitive_cell: bool = True, + scale: bool = True, + comparator: AbstractComparator = OrderDisorderElementComparator(), + attempt_supercell: bool = True, + allow_subset: bool = True, + relative_radius_difference_threshold: float = 0.3, + electronegativity_difference_threshold: float = 1.0, + reduced_formula_atol: float = 0.01, + reduced_formula_rtol: float = 0.1, + *args, + **kwargs + ): + super().__init__( + *args, + ltol=ltol, + stol=stol, + angle_tol=angle_tol, + primitive_cell=primitive_cell, + allow_subset=allow_subset, + attempt_supercell=attempt_supercell, + scale=scale, + comparator=comparator, + **kwargs + ) + self.relative_radius_difference_threshold = relative_radius_difference_threshold + self.electronegativity_difference_threshold = ( + electronegativity_difference_threshold + ) + self.ordered_structurematcher = OrderedStructureMatcher( + ltol=ltol, + stol=stol, + angle_tol=angle_tol, + primitive_cell=primitive_cell, + scale=scale, + ) + self.reduced_formula_atol = reduced_formula_atol + self.reduced_formula_rtol = reduced_formula_rtol + + @property + def name(self) -> str: + return "DisorderedStructureMatcher" + + def fit(self, structure_1: Structure, structure_2: Structure) -> bool: + """ + Returns True if the structures are equivalent, False otherwise. + First checks whether the composition of the structures is similar. + Then checks whether the structures are ordered or disordered. + If both structures are ordered, they are first compared directly, + and if they do not match, one of the structures is disordered and compared again. + If one of the structures is disordered, the disordered comparer is used directly. + The structures are first copied and their oxidation states are removed. + """ + structure_1_nooxi = structure_1.copy().remove_oxidation_states() + structure_2_nooxi = structure_2.copy().remove_oxidation_states() + if structure_1_nooxi == structure_2_nooxi: + return True + if structure_1_nooxi.is_ordered and structure_2_nooxi.is_ordered: + if ( + structure_2_nooxi.composition.reduced_formula + != structure_1_nooxi.composition.reduced_formula + ): + return False + if get_sg(structure_1_nooxi) == get_sg(structure_2_nooxi): + if self.ordered_structurematcher.fit( + structure_1_nooxi, structure_2_nooxi + ): + return True + structure_1_nooxi, can_be_disordered_1 = try_make_structure_disordered( + structure=structure_1_nooxi, + relative_radius_difference_threshold=self.relative_radius_difference_threshold, + electronegativity_difference_threshold=self.electronegativity_difference_threshold, + ) + if can_be_disordered_1: + return super().fit(structure_1_nooxi, structure_2_nooxi) + return False + if not structure_1_nooxi.composition.fractional_composition.almost_equals( + structure_2_nooxi.composition.fractional_composition, + atol=self.reduced_formula_atol, + rtol=self.reduced_formula_rtol, + ): + return False + return super().fit(structure_1_nooxi, structure_2_nooxi) + + +class DefaultDisorderedStructureMatcher(DisorderedStructureMatcher): + """ + Disordered structure matcher with default parameters. No args or kwargs are passed in order + to ensure consistent behavior across all instances. + """ + + def __init__(self): + super().__init__() + + +def get_cliques_out_of_list_of_pairs(pairs: list[list[Element]]) -> list[list[Element]]: + cliques: list[list[Element]] = [[]] + for pair in pairs: + previously_appended_to_group = None + for i, group in enumerate(cliques): + if pair[0] in group or pair[1] in group: + if previously_appended_to_group is not None: + cliques[previously_appended_to_group].extend(group) + cliques[i] = [] + else: + cliques[i].extend(pair) + previously_appended_to_group = i + if previously_appended_to_group is None: + cliques.append(pair) + return [list(set(group)) for group in cliques if len(group) > 0] + + +def make_structure_disordered( + structure: Structure, substitution: list[list[Element]] +) -> Structure: + """ + Returns a copy of the structure where the cliques of elements that can substitute each other are replaced by partial occupancies. + The partial occupancies are calculated based on the atomic fractions of the elements in the clique. + """ + disordered_structure = structure.copy().remove_oxidation_states() + atomic_fractions = { + str(species): disordered_structure.composition.get_atomic_fraction(str(species)) + for species in list(disordered_structure.composition) + } + for substitution_clique in substitution: + these_atomic_fractions = { + species: atomic_fractions[str(species)] for species in substitution_clique + } + total_atomic_fraction = sum(these_atomic_fractions.values()) + these_atomic_fractions = { + species: (atomic_fraction / total_atomic_fraction) + for species, atomic_fraction in these_atomic_fractions.items() + } + disordered_structure.replace_species( + { + str(species): "".join( + [ + (str(species) + str(these_atomic_fractions[species])) + for species in substitution_clique + ] + ) + for species in substitution_clique + } + ) + return disordered_structure + + +def do_elements_substitute( + element_1: Element, + element_2: Element, + relative_radius_difference_threshold: float = 0.3, + electronegativity_difference_threshold: float = 1.0, +) -> bool: + """ + Returns whether two elements could substitute based on their atomic radius and electronegativity. + This is a modified Hume-Rothery rule, where the relative atomic radius difference and the electronegativity difference + thresholds are obtained from an analysis carried out on ICSD data. + See the revised MatterGen paper for more details. + """ + relative_atomic_radius_difference = abs( + element_1.atomic_radius - element_2.atomic_radius + ) / np.mean([element_1.atomic_radius, element_2.atomic_radius]) + electronegativity_difference = abs(element_1.X - element_2.X) + return ( + relative_atomic_radius_difference <= relative_radius_difference_threshold + and electronegativity_difference <= electronegativity_difference_threshold + ) + + +def check_is_disordered( + structure: Structure, + relative_radius_difference_threshold: float = 0.3, + electronegativity_difference_threshold: float = 1.0, +) -> tuple[bool, list[list[Element]]]: + """ + Function to estimate whether a structure can be thought as an ordered approximation of an alloy. + Returns: + + is_disordered: can the structure be thought of as an alloy? + substitutional_groups: list of sets of elements that could substitute for each other + + """ + structure_copy = structure.copy().remove_oxidation_states() + substitutional_pairs = [] + for element_1, element_2 in combinations(list(structure_copy.composition), 2): + if do_elements_substitute( + element_1=element_1, + element_2=element_2, + relative_radius_difference_threshold=relative_radius_difference_threshold, + electronegativity_difference_threshold=electronegativity_difference_threshold, + ): + substitutional_pairs.append([element_1, element_2]) + if len(substitutional_pairs) == 0: + return False, [[]] + substitutional_groups = get_cliques_out_of_list_of_pairs(pairs=substitutional_pairs) + return True, substitutional_groups + + +def try_make_structure_disordered( + structure: Structure, + relative_radius_difference_threshold: float = 0.3, + electronegativity_difference_threshold: float = 1.0, +) -> tuple[Structure, bool]: + can_be_disordered, substitution_species = check_is_disordered( + structure=structure, + relative_radius_difference_threshold=relative_radius_difference_threshold, + electronegativity_difference_threshold=electronegativity_difference_threshold, + ) + return ( + make_structure_disordered(structure, substitution_species) + if can_be_disordered + else structure, + can_be_disordered, + ) diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/symmetry_analysis.py b/jointContribution/mattergen/mattergen/evaluation/utils/symmetry_analysis.py new file mode 100644 index 00000000..13764017 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/symmetry_analysis.py @@ -0,0 +1,35 @@ +from mattergen.evaluation.utils.structure_matcher import \ + try_make_structure_disordered +from pymatgen.core.structure import Structure +from pymatgen.symmetry.analyzer import SpacegroupAnalyzer + + +class DefaultSpaceGroupAnalyzer(SpacegroupAnalyzer): + def __init__(self, structure: Structure): + super().__init__(structure, symprec=0.1, angle_tolerance=5.0) + + +class DisorderedSpaceGroupAnalyzer(SpacegroupAnalyzer): + def __init__(self, structure: Structure): + structure, _ = try_make_structure_disordered( + structure=structure, + relative_radius_difference_threshold=0.3, + electronegativity_difference_threshold=1.0, + ) + super().__init__(structure, symprec=0.1, angle_tolerance=5.0) + + +class StrictSpaceGroupAnalyzer(SpacegroupAnalyzer): + def __init__(self, structure: Structure): + super().__init__(structure, symprec=0.01, angle_tolerance=5.0) + + +class DisorderedStrictSpaceGroupAnalyzer(SpacegroupAnalyzer): + def __init__(self, structure: Structure): + structure, _ = try_make_structure_disordered( + structure=structure, + relative_radius_difference_threshold=0.3, + electronegativity_difference_threshold=1.0, + ) + super().__init__(structure, symprec=0.01, angle_tolerance=5.0) + super().__init__(structure, symprec=0.01, angle_tolerance=5.0) diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/utils.py b/jointContribution/mattergen/mattergen/evaluation/utils/utils.py new file mode 100644 index 00000000..4c4edcc5 --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/utils.py @@ -0,0 +1,82 @@ +from collections import defaultdict +from itertools import combinations +from typing import Any, Callable, Iterable, TypeVar + +import numpy as np +from mattergen.evaluation.utils.globals import MAX_RMSD +from mattergen.evaluation.utils.structure_matcher import RMSDStructureMatcher +from pymatgen.core import Structure +from pymatgen.core.lattice import Lattice +from pymatgen.entries.computed_entries import ComputedStructureEntry +from pymatgen.symmetry.analyzer import SpacegroupAnalyzer + +OptionalNumber = int | float | None +PropertyConstraint = tuple[OptionalNumber, OptionalNumber] + + +def generate_reduced_formula_dict( + entries: Iterable[ComputedStructureEntry], +) -> dict[str, list[ComputedStructureEntry]]: + """Generate a dictionary of entries with the same reduced formula.""" + + def keyfunc(entry: ComputedStructureEntry) -> str: + entry.structure.unset_charge() + return entry.structure.remove_oxidation_states().composition.reduced_formula + + return group_list_items_into_dict(entries, keyfunc=keyfunc) + + +def generate_chemsys_dict( + entries: Iterable[ComputedStructureEntry], +) -> dict[str, list[ComputedStructureEntry]]: + """Generate a dictionary of entries with the same chemical system.""" + + def keyfunc(entry: ComputedStructureEntry) -> str: + return "-".join(sorted({el.symbol for el in entry.composition.elements})) + + return group_list_items_into_dict(entries, keyfunc=keyfunc) + + +T = TypeVar("T") + + +def group_list_items_into_dict( + items: Iterable[T], keyfunc: Callable[[Any], str] +) -> dict[str, list[T]]: + """Group a list of items into a dictionary with the same key.""" + result = defaultdict(list) + for item in items: + result[keyfunc(item)].append(item) + return result + + +def compute_rmsd_angstrom(struc1: Structure, struc2: Structure) -> float: + """Compute RMSD during relaxation in units of angstrom""" + match = RMSDStructureMatcher().get_rms_dist(struc1, struc2) + + def av_lat(l1: Lattice, l2: Lattice): + params = (np.array(l1.parameters) + np.array(l2.parameters)) / 2 + return Lattice.from_parameters(*params) + + avg_l = av_lat(struc1.lattice, struc2.lattice) + normalization = (len(struc1) / avg_l.volume) ** (1 / 3) + if match is None: + return MAX_RMSD / normalization + return match[0] / normalization + + +def expand_into_subsystems(chemical_system: str) -> list[tuple[str, ...]]: + elements = chemical_system.split("-") + list_combinations = [] + for n in range(1, len(elements) + 1): + list_combinations += list(combinations(elements, n)) + return list_combinations + + +def preprocess_structure(structure: Structure) -> Structure: + sga = SpacegroupAnalyzer(structure) + return ( + sga.get_refined_structure() + .get_primitive_structure() + .get_reduced_structure(reduction_algo="LLL") + ) diff --git a/jointContribution/mattergen/mattergen/evaluation/utils/vasprunlike.py b/jointContribution/mattergen/mattergen/evaluation/utils/vasprunlike.py new file mode 100644 index 00000000..fdd6417a --- /dev/null +++ b/jointContribution/mattergen/mattergen/evaluation/utils/vasprunlike.py @@ -0,0 +1,125 @@ +import re +from functools import cached_property + +from pymatgen.analysis.structure_analyzer import oxide_type +from pymatgen.core import Structure +from pymatgen.entries.compatibility import Compatibility +from pymatgen.entries.computed_entries import (ComputedEntry, + ComputedStructureEntry, + EnergyAdjustment) +from pymatgen.io.vasp.outputs import VaspParseError +from pymatgen.io.vasp.sets import MPRelaxSet + + +class IdentityCorrectionScheme(Compatibility): + """Perform no energy correction.""" + + def get_adjustments( + self, entry: (ComputedEntry | ComputedStructureEntry) + ) -> list[EnergyAdjustment]: + return [] + + +class VasprunLike: + """ + Mocks a VASP run using only the structure as well as INCAR and POTCAR information from MPRelaxSet. + Code adapted from https://github.com/materialsproject/pymatgen/blob/6c23d744efbd892ec48346297d61b4f3f86b1478/pymatgen/io/vasp/outputs.py#L153 + + Note that this object does not have the full functionality of a Vasprun. It is only used to obtain energy corrections if the full Vasprun information is not available. + """ + + def __init__( + self, structure: Structure, energy: float, user_potcar_functional: str = "PBE" + ) -> None: + self.structure = structure + self.energy = energy + self.user_potcar_functional = user_potcar_functional + + @cached_property + def mp_set(self) -> MPRelaxSet: + return MPRelaxSet( + self.structure, + user_incar_settings={"KSPACING": 0.5}, + user_kpoints_settings=None, + ) + + @property + def potcar_symbols(self) -> list[str]: + return [ + f"{self.user_potcar_functional.upper()} {sym}" + for sym in self.mp_set.potcar_symbols + ] + + @property + def aspherical(self) -> bool: + return self.mp_set.incar.get("LASPH", False) + + @property + def hubbards(self) -> dict: + """ + Hubbard U values used if a vasprun is a GGA+U run. {} otherwise. + """ + symbols = [s.split()[1] for s in self.potcar_symbols] + symbols = [re.split("_", s)[0] for s in symbols] + if not self.mp_set.incar.get("LDAU", False): + return {} + us = self.mp_set.incar.get("LDAUU", []) + js = self.mp_set.incar.get("LDAUJ", []) + if len(js) != len(us): + js = [0] * len(us) + if len(us) == len(symbols): + return {symbols[i]: (us[i] - js[i]) for i in range(len(symbols))} + if sum(us) == 0 and sum(js) == 0: + return {} + raise VaspParseError( + "Length of U value parameters and atomic symbols are mismatched" + ) + + @property + def run_type(self) -> str: + """ + Returns the run type. Simplified version of https://github.com/materialsproject/pymatgen/blob/6c23d744efbd892ec48346297d61b4f3f86b1478/pymatgen/io/vasp/outputs.py#L716. + """ + rt = "GGA" + if self.is_hubbard: + rt += "+U" + return rt + + @property + def is_hubbard(self) -> bool: + """ + True if run is a DFT+U run. + """ + if len(self.hubbards) == 0: + return False + return sum(self.hubbards.values()) > 1e-08 + + def get_computed_entry( + self, + inc_structure: bool = True, + energy_correction_scheme: Compatibility = IdentityCorrectionScheme(), + ) -> ComputedEntry: + entry_dict = { + "correction": 0.0, + "composition": self.structure.composition, + "energy": self.energy, + "parameters": { + "is_hubbard": self.is_hubbard, + "hubbards": self.hubbards, + "run_type": self.run_type, + "potcar_symbols": self.potcar_symbols, + }, + "data": { + "oxide_type": oxide_type(self.structure), + "aspherical": self.aspherical, + }, + "structure": self.structure, + } + if not inc_structure: + entry = ComputedEntry.from_dict(entry_dict) + else: + entry = ComputedStructureEntry.from_dict(entry_dict) + energy_correction_scheme.process_entry(entry) + return entry + return entry + return entry diff --git a/jointContribution/mattergen/mattergen/generator.py b/jointContribution/mattergen/mattergen/generator.py new file mode 100644 index 00000000..3d54c08d --- /dev/null +++ b/jointContribution/mattergen/mattergen/generator.py @@ -0,0 +1,323 @@ +import sys + + +import io +import json +import os +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Literal +from zipfile import ZipFile + +import ase.io +import hydra +import paddle +from hydra.utils import instantiate +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.data.collate import collate +from mattergen.common.data.condition_factory import ConditionLoader +from mattergen.common.data.num_atoms_distribution import \ + NUM_ATOMS_DISTRIBUTIONS +from mattergen.common.data.types import TargetProperty +from mattergen.common.utils.data_utils import lattice_matrix_to_params_paddle +from mattergen.common.utils.eval_utils import (MatterGenCheckpointInfo, + get_crystals_list, + # load_model_diffusion, + make_structure, save_structures) +from mattergen.common.utils.globals import DEFAULT_SAMPLING_CONFIG_PATH +# from mattergen.diffusion.lightning_module import DiffusionLightningModule +from mattergen.diffusion.sampling.pc_sampler import PredictorCorrector +from omegaconf import DictConfig, OmegaConf +from paddle_utils import * +from pymatgen.core.structure import Structure +from pymatgen.io.ase import AseAtomsAdaptor +from tqdm import tqdm + +class fake(): + pass +DiffusionLightningModule = fake + +def draw_samples_from_sampler( + sampler: PredictorCorrector, + condition_loader: ConditionLoader, + properties_to_condition_on: (TargetProperty | None) = None, + output_path: (Path | None) = None, + cfg: (DictConfig | None) = None, + record_trajectories: bool = True, +) -> list[Structure]: + properties_to_condition_on = properties_to_condition_on or {} + assert all( + [ + (key in sampler.diffusion_module.model.cond_fields_model_was_trained_on) + for key in properties_to_condition_on.keys() + ] + ) + all_samples_list = [] + all_trajs_list = [] + for conditioning_data, mask in tqdm(condition_loader, desc="Generating samples"): + conditioning_data = conditioning_data['data'] + if record_trajectories: + sample, mean, intermediate_samples = sampler.sample_with_record( + conditioning_data, mask + ) + all_trajs_list.extend( + list_of_time_steps_to_list_of_trajectories(intermediate_samples) + ) + else: + sample, mean = sampler.sample(conditioning_data, mask) + all_samples_list.extend(mean.to_data_list()) + all_samples = collate(all_samples_list) + assert isinstance(all_samples, ChemGraph) + lengths, angles = lattice_matrix_to_params_paddle(all_samples.cell) + all_samples = all_samples.replace(lengths=lengths, angles=angles) + generated_strucs = structure_from_model_output( + all_samples["pos"].reshape(-1, 3), + all_samples["atomic_numbers"].reshape(-1), + all_samples["lengths"].reshape(-1, 3), + all_samples["angles"].reshape(-1, 3), + all_samples["num_atoms"].reshape(-1), + ) + if output_path is not None: + assert cfg is not None + save_structures(output_path, generated_strucs) + if record_trajectories: + dump_trajectories(output_path=output_path, all_trajs_list=all_trajs_list) + return generated_strucs + + +def list_of_time_steps_to_list_of_trajectories( + list_of_time_steps: list[ChemGraph], +) -> list[list[ChemGraph]]: + data_lists_per_timesteps = [x.to_data_list() for x in list_of_time_steps] + data_lists_per_sample = [ + [ + data_lists_per_timesteps[ix_t][ix_traj] + for ix_t in range(len(data_lists_per_timesteps)) + ] + for ix_traj in range(len(data_lists_per_timesteps[0])) + ] + return data_lists_per_sample + + +def dump_trajectories(output_path: Path, all_trajs_list: list[list[ChemGraph]]) -> None: + try: + with ZipFile(output_path / "generated_trajectories.zip", "w") as zip_obj: + for ix, traj in enumerate(all_trajs_list): + strucs = structures_from_trajectory(traj) + ase_atoms = [AseAtomsAdaptor.get_atoms(crystal) for crystal in strucs] + str_io = io.StringIO() + ase.io.write(str_io, ase_atoms, format="extxyz") + str_io.flush() + zip_obj.writestr(f"gen_{ix}.extxyz", str_io.getvalue()) + except IOError as e: + print(f"Got error {e} writing the trajectory to disk.") + except ValueError as e: + print(f"Got error ValueError '{e}' writing the trajectory to disk.") + + +def structure_from_model_output( + frac_coords, atom_types, lengths, angles, num_atoms +) -> list[Structure]: + structures = [ + make_structure( + lengths=d["lengths"], + angles=d["angles"], + atom_types=d["atom_types"], + frac_coords=d["frac_coords"], + ) + for d in get_crystals_list( + frac_coords.cpu(), + atom_types.cpu(), + lengths.cpu(), + angles.cpu(), + num_atoms.cpu(), + ) + ] + return structures + + +def structures_from_trajectory(traj: list[ChemGraph]) -> list[Structure]: + all_strucs = [] + for batch in traj: + cell = batch.cell + lengths, angles = lattice_matrix_to_params_paddle(cell) + all_strucs.extend( + structure_from_model_output( + frac_coords=batch.pos, + atom_types=batch.atomic_numbers, + lengths=lengths, + angles=angles, + num_atoms=batch.num_atoms, + ) + ) + return all_strucs + + +@dataclass +class CrystalGenerator: + checkpoint_info: MatterGenCheckpointInfo + batch_size: int | None = None + num_batches: int | None = None + target_compositions_dict: list[dict[str, float]] | None = None + num_atoms_distribution: str = "ALEX_MP_20" + diffusion_guidance_factor: float = 0.0 + properties_to_condition_on: TargetProperty | None = None + sampling_config_overrides: list[str] | None = None + num_samples_per_batch: int = 1 + niggli_reduction: bool = False + sampling_config_path: Path | None = None + sampling_config_name: str = "default" + record_trajectories: bool = True + _model: DiffusionLightningModule | None = None + _cfg: DictConfig | None = None + + def __post_init__(self) -> None: + assert ( + self.num_atoms_distribution in NUM_ATOMS_DISTRIBUTIONS + ), f"num_atoms_distribution must be one of {list(NUM_ATOMS_DISTRIBUTIONS.keys())}, but got {self.num_atoms_distribution}. To add your own distribution, please add it to mattergen.common.data.num_atoms_distribution.NUM_ATOMS_DISTRIBUTIONS." + + @property + def model(self) -> DiffusionLightningModule: + self.prepare() + assert self._model is not None + return self._model + + @property + def cfg(self) -> DictConfig: + self._cfg = self.checkpoint_info.config + assert self._cfg is not None + return self._cfg + + @property + def num_structures_to_generate(self) -> int: + """Returns the total number of structures to generate if `batch_size` and `num_batches` are specified at construction time; + otherwise, raises an AssertionError. + """ + assert self.batch_size is not None + assert self.num_batches is not None + return self.batch_size * self.num_batches + + @property + def sampling_config(self) -> DictConfig: + """Returns the sampling config if `batch_size` and `num_batches` are specified at construction time; + otherwise, raises an AssertionError. + """ + assert self.batch_size is not None + assert self.num_batches is not None + return self.load_sampling_config( + batch_size=self.batch_size, + num_batches=self.num_batches, + target_compositions_dict=self.target_compositions_dict, + ) + + def get_condition_loader( + self, + sampling_config: DictConfig, + target_compositions_dict: (list[dict[str, float]] | None) = None, + ) -> ConditionLoader: + condition_loader_partial = instantiate(sampling_config.condition_loader_partial) + if target_compositions_dict is None: + return condition_loader_partial(properties=self.properties_to_condition_on) + return condition_loader_partial( + target_compositions_dict=target_compositions_dict + ) + + def load_sampling_config( + self, + batch_size: int, + num_batches: int, + target_compositions_dict: (list[dict[str, float]] | None) = None, + ) -> DictConfig: + """ + Create a sampling config from the given parameters. + We specify certain sampling hyperparameters via the sampling config that is loaded via hydra. + """ + if self.sampling_config_overrides is None: + sampling_config_overrides = [] + else: + sampling_config_overrides = self.sampling_config_overrides.copy() + if target_compositions_dict is None: + sampling_config_overrides += [ + f"+condition_loader_partial.num_atoms_distribution={self.num_atoms_distribution}", + f"+condition_loader_partial.batch_size={batch_size}", + f"+condition_loader_partial.num_samples={num_batches * batch_size}", + f"sampler_partial.guidance_scale={self.diffusion_guidance_factor}", + ] + else: + num_structures_to_generate_per_composition = ( + num_batches * batch_size // len(target_compositions_dict) + ) + sampling_config_overrides += [ + "condition_loader_partial._target_=mattergen.common.data.condition_factory.get_composition_data_loader", + f"+condition_loader_partial.num_structures_to_generate_per_composition={num_structures_to_generate_per_composition}", + f"+condition_loader_partial.batch_size={batch_size}", + ] + return self._load_sampling_config( + sampling_config_overrides=sampling_config_overrides, + sampling_config_path=self.sampling_config_path, + sampling_config_name=self.sampling_config_name, + ) + + def _load_sampling_config( + self, + sampling_config_path: (Path | None) = None, + sampling_config_name: str = "default", + sampling_config_overrides: (list[str] | None) = None, + ) -> DictConfig: + if sampling_config_path is None: + sampling_config_path = DEFAULT_SAMPLING_CONFIG_PATH + if sampling_config_overrides is None: + sampling_config_overrides = [] + with hydra.initialize_config_dir(os.path.abspath(str(sampling_config_path))): + sampling_config = hydra.compose( + config_name=sampling_config_name, overrides=sampling_config_overrides + ) + return sampling_config + + def prepare(self) -> None: + """Loads the model from checkpoint and prepares for generation.""" + if self._model is not None: + return + # model = load_model_diffusion(self.checkpoint_info) + # model = model.to("cuda" if paddle.device.cuda.device_count() >= 1 else "cpu") + # self._model = model + # self._cfg = self.checkpoint_info.config + + def generate( + self, + batch_size: (int | None) = None, + num_batches: (int | None) = None, + target_compositions_dict: (list[dict[str, float]] | None) = None, + output_dir: str = "outputs", + ) -> list[Structure]: + batch_size = batch_size or self.batch_size + num_batches = num_batches or self.num_batches + target_compositions_dict = ( + target_compositions_dict or self.target_compositions_dict + ) + assert batch_size is not None + assert num_batches is not None + print("\nModel config:") + print(OmegaConf.to_yaml(self.cfg, resolve=True)) + sampling_config = self.load_sampling_config( + batch_size=batch_size, + num_batches=num_batches, + target_compositions_dict=target_compositions_dict, + ) + print("\nSampling config:") + print(OmegaConf.to_yaml(sampling_config, resolve=True)) + condition_loader = self.get_condition_loader( + sampling_config, target_compositions_dict + ) + sampler_partial = instantiate(sampling_config.sampler_partial) + sampler = sampler_partial(diffusion_module=self.model) + generated_structures = draw_samples_from_sampler( + sampler=sampler, + condition_loader=condition_loader, + cfg=self.cfg, + output_path=Path(output_dir), + properties_to_condition_on=self.properties_to_condition_on, + record_trajectories=self.record_trajectories, + ) + return generated_structures diff --git a/jointContribution/mattergen/mattergen/optimizer/build.py b/jointContribution/mattergen/mattergen/optimizer/build.py new file mode 100644 index 00000000..7574f5fc --- /dev/null +++ b/jointContribution/mattergen/mattergen/optimizer/build.py @@ -0,0 +1,98 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy + +import paddle + +from mattergen.optimizer import lr_scheduler +from mattergen.optimizer.optimizer import LBFGS +from mattergen.optimizer.optimizer import SGD +from mattergen.optimizer.optimizer import Adam +from mattergen.optimizer.optimizer import AdamW +from mattergen.optimizer.optimizer import Momentum +from mattergen.optimizer.optimizer import OptimizerList +from mattergen.optimizer.optimizer import RMSProp + +__all__ = [ + "LBFGS", + "SGD", + "Adam", + "AdamW", + "Momentum", + "RMSProp", + "OptimizerList", + "lr_scheduler", +] + + +def build_lr_scheduler(cfg, epochs, iters_per_epoch): + """Build learning rate scheduler. + + Args: + cfg (DictConfig): Learning rate scheduler config. + epochs (int): Total epochs. + iters_per_epoch (int): Number of iterations of one epoch. + + Returns: + LRScheduler: Learning rate scheduler. + """ + cfg = copy.deepcopy(cfg) + cfg.update({"epochs": epochs, "iters_per_epoch": iters_per_epoch}) + lr_scheduler_cls = cfg.pop("__name__") + lr_scheduler_ = getattr(lr_scheduler, lr_scheduler_cls)(**cfg) + return lr_scheduler_() + + +def build_optimizer(cfg, model_list, epochs, iters_per_epoch): + """Build optimizer and learning rate scheduler + + Args: + cfg (DictConfig): Learning rate scheduler config. + model_list (Tuple[nn.Layer, ...]): Tuple of model(s). + epochs (int): Total epochs. + iters_per_epoch (int): Number of iterations of one epoch. + + Returns: + Optimizer, LRScheduler: Optimizer and learning rate scheduler. + """ + # build lr_scheduler + cfg = copy.deepcopy(cfg) + lr_cfg = cfg.pop("lr") + if isinstance(lr_cfg, float): + lr_scheduler = lr_cfg + else: + lr_scheduler = build_lr_scheduler(lr_cfg, epochs, iters_per_epoch) + + # build optimizer + opt_cls = cfg.pop("__name__") + if "clip_norm" in cfg: + clip_norm = cfg.pop("clip_norm") + grad_clip = paddle.nn.ClipGradByNorm(clip_norm=clip_norm) + elif "clip_norm_global" in cfg: + clip_norm = cfg.pop("clip_norm_global") + grad_clip = paddle.nn.ClipGradByGlobalNorm(clip_norm=clip_norm) + elif "clip_value" in cfg: + clip_value = cfg.pop("clip_value") + grad_clip = paddle.nn.ClipGradByValue(clip_value) + else: + grad_clip = None + + optimizer = eval(opt_cls)(learning_rate=lr_scheduler, grad_clip=grad_clip, **cfg)( + model_list + ) + + if isinstance(lr_scheduler, float): + return optimizer, None + return optimizer, lr_scheduler diff --git a/jointContribution/mattergen/mattergen/optimizer/lr_scheduler.py b/jointContribution/mattergen/mattergen/optimizer/lr_scheduler.py new file mode 100644 index 00000000..52db7279 --- /dev/null +++ b/jointContribution/mattergen/mattergen/optimizer/lr_scheduler.py @@ -0,0 +1,908 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import abc +import math +from typing import List +from typing import Literal +from typing import Tuple +from typing import Union + +from paddle.optimizer import lr + +from mattergen.utils import logger + +__all__ = [ + "Linear", + "Cosine", + "Step", + "Piecewise", + "MultiStepDecay", + "ExponentialDecay", + "CosineWarmRestarts", + "OneCycleLR", +] + + +class LRBase: + """Base class for custom learning rates. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + warmup_epoch (int): Number of warmup epochs. + warmup_start_lr (float): Start learning rate within warmup. + last_epoch (int): Last epoch. + by_epoch (bool): Learning rate decays by epoch when by_epoch is True, + else by iter. + verbose (bool): If True, prints a message to stdout for each update. + Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + warmup_epoch: int, + warmup_start_lr: float, + last_epoch: int, + by_epoch: bool, + verbose: bool = False, + ) -> None: + """Initialize and record the necessary parameters.""" + super().__init__() + if warmup_epoch >= epochs: + msg = ( + "When using warm up, the value of 'Global.epochs' should be greater " + "than value of 'Optimizer.lr.warmup_epoch'. The value of " + f"'Optimizer.lr.warmup_epoch' has been set to {epochs}." + ) + logger.warning(msg) + warmup_epoch = epochs + self.epochs = epochs + self.iters_per_epoch = iters_per_epoch + self.learning_rate = learning_rate + self.warmup_epoch = warmup_epoch + self.warmup_steps = ( + self.warmup_epoch + if by_epoch + else round(self.warmup_epoch * self.iters_per_epoch) + ) + self.warmup_start_lr = warmup_start_lr + self.last_epoch = last_epoch + self.by_epoch = by_epoch + self.verbose = verbose + + @abc.abstractmethod + def __call__(self, *args, **kwargs) -> lr.LRScheduler: + """Generate an learning rate scheduler. + + Returns: + lr.LinearWarmup: learning rate scheduler. + """ + pass + + def linear_warmup( + self, learning_rate: Union[float, lr.LRScheduler] + ) -> lr.LinearWarmup: + """Add an Linear Warmup before learning_rate. + + Args: + learning_rate (Union[float, lr.LRScheduler]): Original learning rate without + warmup. + + Returns: + lr.LinearWarmup: learning rate scheduler with warmup. + """ + warmup_lr = lr.LinearWarmup( + learning_rate=learning_rate, + warmup_steps=self.warmup_steps, + start_lr=self.warmup_start_lr, + end_lr=self.learning_rate, + last_epoch=self.last_epoch, + verbose=self.verbose, + ) + return warmup_lr + + +class Constant(lr.LRScheduler): + """Constant learning rate Class implementation. + + Args: + learning_rate (float): The initial learning rate. + last_epoch (int, optional): The index of last epoch. Default: -1. + """ + + def __init__(self, learning_rate: float, last_epoch: int = -1): + self.learning_rate = learning_rate + self.last_epoch = last_epoch + super().__init__() + + def get_lr(self) -> float: + """Always return the same learning rate""" + return self.learning_rate + + +class Linear(LRBase): + """Linear learning rate decay. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + end_lr (float, optional): The minimum final learning rate. Defaults to 0.0. + power (float, optional): Power of polynomial. Defaults to 1.0. + cycle (bool, optional): Whether the learning rate rises again. If True, + then the learning rate will rise when it decrease to ``end_lr`` . + If False, the learning rate is monotone decreasing. Defaults to False. + warmup_epoch (int): Number of warmup epochs. + warmup_start_lr (float): Start learning rate within warmup. + last_epoch (int): Last epoch. + by_epoch (bool): Learning rate decays by epoch when by_epoch is True, + else by iter. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.Linear(10, 2, 0.001)() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + end_lr: float = 0.0, + power: float = 1.0, + cycle: bool = False, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.decay_steps = (epochs - self.warmup_epoch) * iters_per_epoch + self.end_lr = end_lr + self.power = power + self.cycle = cycle + self.warmup_steps = round(self.warmup_epoch * iters_per_epoch) + if self.by_epoch: + self.decay_steps = self.epochs - self.warmup_epoch + + def __call__(self): + learning_rate = ( + lr.PolynomialDecay( + learning_rate=self.learning_rate, + decay_steps=self.decay_steps, + end_lr=self.end_lr, + power=self.power, + cycle=self.cycle, + last_epoch=self.last_epoch, + ) + if self.decay_steps > 0 + else Constant(self.learning_rate) + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class ExponentialDecay(LRBase): + """ExponentialDecay learning rate decay. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + gamma (float): The decay rate. + decay_steps (int): The number of steps to decay. + warmup_epoch (int): Number of warmup epochs. + warmup_start_lr (float): Start learning rate within warmup. + last_epoch (int): Last epoch. + by_epoch (bool): Learning rate decays by epoch when by_epoch is True, + else by iter. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.ExponentialDecay(10, 2, 1e-3, 0.95, 3)() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + gamma: float, + decay_steps: int, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.decay_steps = decay_steps + self.gamma = gamma + self.warmup_steps = round(self.warmup_epoch * iters_per_epoch) + if self.by_epoch: + self.decay_steps /= iters_per_epoch + + def __call__(self): + learning_rate = lr.ExponentialDecay( + learning_rate=self.learning_rate, + gamma=self.gamma ** (1 / self.decay_steps), + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class Cosine(LRBase): + """Cosine learning rate decay. + + lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1) + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + eta_min (float, optional): Minimum learning rate. Defaults to 0.0. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.Cosine(10, 2, 1e-3)() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + eta_min: float = 0.0, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + T_max=None, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.T_max = (self.epochs - self.warmup_epoch) * self.iters_per_epoch + self.eta_min = eta_min + if self.by_epoch: + self.T_max = self.epochs - self.warmup_epoch + if T_max is not None: + self.T_max = T_max + + def __call__(self): + learning_rate = ( + lr.CosineAnnealingDecay( + learning_rate=self.learning_rate, + T_max=self.T_max, + eta_min=self.eta_min, + last_epoch=self.last_epoch, + ) + if self.T_max > 0 + else Constant(self.learning_rate) + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class Step(LRBase): + """Step learning rate decay. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + step_size (int): The interval to update. + gamma (float, optional): The Ratio that the learning rate will be reduced. + ``new_lr = origin_lr * gamma``. It should be less than 1.0. Default: 0.1. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.Step(10, 1, 1e-3, 2, 0.95)() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + step_size: int, + gamma: float, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.step_size = step_size * iters_per_epoch + self.gamma = gamma + if self.by_epoch: + self.step_size = step_size + + def __call__(self): + learning_rate = lr.StepDecay( + learning_rate=self.learning_rate, + step_size=self.step_size, + gamma=self.gamma, + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class Piecewise(LRBase): + """Piecewise learning rate decay + + Args: + epochs (int): Total epoch(s) + iters_per_epoch (int): Number of iterations within an epoch + decay_epochs (Tuple[int, ...]): A list of steps numbers. The type of element + in the list is python int. + values (Tuple[float, ...]): Tuple of learning rate values that will be picked + during different epoch boundaries. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.Piecewise( + ... 10, 1, [2, 4], (1e-3, 1e-4, 1e-5) + ... )() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + decay_epochs: Tuple[int, ...], + values: Tuple[float, ...], + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + values[0], + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.values = values + self.boundaries_steps = [e * iters_per_epoch for e in decay_epochs] + if self.by_epoch is True: + self.boundaries_steps = decay_epochs + + def __call__(self): + learning_rate = lr.PiecewiseDecay( + boundaries=self.boundaries_steps, + values=self.values, + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class MultiStepDecay(LRBase): + """MultiStepDecay learning rate decay + + Args: + epochs (int): Total epoch(s) + iters_per_epoch (int): Number of iterations within an epoch + learning_rate (float): Learning rate + milestones (Tuple[int, ...]): Tuple of each boundaries. should be increasing. + gamma (float, optional): The Ratio that the learning rate will be reduced. + `new_lr = origin_lr * gamma`. It should be less than 1.0. Defaults to 0.1. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.MultiStepDecay(10, 1, 1e-3, (4, 5))() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + milestones: Tuple[int, ...], + gamma: float = 0.1, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.milestones = [x * iters_per_epoch for x in milestones] + self.gamma = gamma + if self.by_epoch: + self.milestones = milestones + + def __call__(self): + learning_rate = lr.MultiStepDecay( + learning_rate=self.learning_rate, + milestones=self.milestones, + gamma=self.gamma, + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class CosineAnnealingWarmRestarts(lr.LRScheduler): + """The implementation of cosine annealing schedule with warm restarts. + + Args: + learning_rate (float): Learning rate + T_0 (int): Number of iterations for the first restart. + T_mult (int, optional): A factor increases T_i after a restart. Defaults to 1. + eta_min (float, optional): Minimum learning rate. Defaults to 0. + last_epoch (int, optional): The index of last epoch. Defaults to -1. + verbose (bool, optional): If `True`, prints a message to stdout for each + update. Defaults to False. + """ + + def __init__( + self, + learning_rate: float, + T_0: int, + T_mult: int = 1, + eta_min: float = 0.0, + last_epoch: int = -1, + verbose: bool = False, + ): + if T_0 <= 0 or not isinstance(T_0, int): + raise ValueError(f"Expected positive integer T_0, but got {T_0}") + if T_mult < 1 or not isinstance(T_mult, int): + raise ValueError(f"Expected integer T_mult >= 1, but got {T_mult}") + self.T_0 = T_0 + self.T_i = T_0 + self.T_mult = T_mult + self.eta_min = eta_min + self.T_cur = last_epoch + super().__init__(learning_rate, last_epoch, verbose) + + def get_lr(self): + return ( + self.eta_min + + (self.base_lr - self.eta_min) + * (1 + math.cos(math.pi * self.T_cur / self.T_i)) + / 2 + ) + + def step(self, epoch=None): + if epoch is None and self.last_epoch < 0: + epoch = 0 + + if epoch is None: + epoch = self.last_epoch + 1 + self.T_cur = self.T_cur + 1 + if self.T_cur >= self.T_i: + self.T_cur = self.T_cur - self.T_i + self.T_i = self.T_i * self.T_mult + else: + if epoch < 0: + raise ValueError(f"Expected non-negative epoch, but got {epoch}") + if epoch >= self.T_0: + if self.T_mult == 1: + self.T_cur = epoch % self.T_0 + else: + n = int( + math.log( + (epoch / self.T_0 * (self.T_mult - 1) + 1), self.T_mult + ) + ) + self.T_cur = epoch - self.T_0 * (self.T_mult**n - 1) / ( + self.T_mult - 1 + ) + self.T_i = self.T_0 * self.T_mult ** (n) + else: + self.T_i = self.T_0 + self.T_cur = epoch + self.last_epoch = math.floor(epoch) + self.last_lr = self.get_lr() + + +class CosineWarmRestarts(LRBase): + """Set the learning rate using a cosine annealing schedule with warm restarts. + + Args: + epochs (int): Total epoch(s) + iters_per_epoch (int): Number of iterations within an epoch + learning_rate (float): Learning rate + T_0 (int): Number of iterations for the first restart. + T_mult (int): A factor increases T_i after a restart + eta_min (float, optional): Minimum learning rate. Defaults to 0.0. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.CosineWarmRestarts(20, 1, 1e-3, 14, 2)() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + T_0: int, + T_mult: int, + eta_min: float = 0.0, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.T_0 = T_0 + self.T_mult = T_mult + self.eta_min = eta_min + if self.by_epoch is False: + self.T_0 = T_0 * iters_per_epoch + + def __call__(self): + learning_rate = CosineAnnealingWarmRestarts( + learning_rate=self.learning_rate, + T_0=self.T_0, + T_mult=self.T_mult, + eta_min=self.eta_min, + last_epoch=self.last_epoch, + verbose=self.verbose, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class OneCycleLR(LRBase): + """Sets the learning rate according to the one cycle learning rate scheduler. + The scheduler adjusts the learning rate from an initial learning rate to the + maximum learning rate and then from that maximum learning rate to the minimum + learning rate, which is much less than the initial learning rate. + + It has been proposed in [Super-Convergence: Very Fast Training of Neural Networks + Using Large Learning Rates](https://arxiv.org/abs/1708.07120). + + Please note that the default behavior of this scheduler follows the fastai + implementation of one cycle, which claims that **"unpublished work has shown even + better results by using only two phases"**. If you want the behavior of this + scheduler to be consistent with the paper, please set `three_phase=True`. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + max_learning_rate (float): The maximum learning rate. It is a python float + number. Functionally, it defines the initial learning rate by + `divide_factor` . + divide_factor (float, optional): Initial learning rate will be determined by + initial_learning_rate = max_learning_rate / divide_factor. Defaults to 25.0. + end_learning_rate (float, optional): The minimum learning rate during training, + it should be much less than initial learning rate. Defaults to 0.0001. + phase_pct (float): The percentage of total steps which used to increasing + learning rate. Defaults to 0.3. + anneal_strategy (str, optional): Strategy of adjusting learning rate. "cos" for + cosine annealing, "linear" for linear annealing. Defaults to "cos". + three_phase (bool, optional): Whether to use three phase. Defaults to False. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. + Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + + Examples: + >>> import ppsci + >>> lr = ppsci.optimizer.lr_scheduler.OneCycleLR(100, 1, 1e-3)() + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + max_learning_rate: float, + divide_factor: float = 25.0, + end_learning_rate: float = 0.0001, + phase_pct: float = 0.3, + anneal_strategy: str = "cos", + three_phase: bool = False, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + max_learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.total_steps = epochs + if not by_epoch: + self.total_steps *= iters_per_epoch + self.divide_factor = divide_factor + self.end_learning_rate = end_learning_rate + self.phase_pct = phase_pct + self.anneal_strategy = anneal_strategy + self.three_phase = three_phase + + def __call__(self): + learning_rate = lr.OneCycleLR( + max_learning_rate=self.learning_rate, + total_steps=self.total_steps, + divide_factor=self.divide_factor, + end_learning_rate=self.end_learning_rate, + phase_pct=self.phase_pct, + anneal_strategy=self.anneal_strategy, + three_phase=self.three_phase, + last_epoch=self.last_epoch, + verbose=self.verbose, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class ReduceOnPlateau(LRBase): + """ReduceOnPlateau. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): The initial learning rate. It is a python float number. + mode (str, optional): ``'min'`` or ``'max'`` can be selected. Normally, it is + ``'min'`` , which means that the learning rate will reduce when ``loss`` + stops descending. Specially, if it's set to ``'max'`` , the learning + rate will reduce when ``loss`` stops ascending. Default: ``'min'`` . + factor (float, optional): The Ratio that the learning rate will be reduced. + ``new_lr = origin_lr * factor`` . It should be less than 1.0. Default: 0.1. + patience (int, optional): When ``loss`` doesn't improve for this number of + epochs, learing rate will be reduced. Default: 10. + threshold (float, optional): ``threshold`` and ``threshold_mode`` will + determine the minimum change of ``loss`` . This make tiny changes of + ``loss`` will be ignored. Default: 1e-4. + threshold_mode (str, optional): ``'rel'`` or ``'abs'`` can be selected. + In ``'rel'`` mode, the minimum change of ``loss`` is + ``last_loss * threshold`` , where ``last_loss`` is ``loss`` in last + epoch. In ``'abs'`` mode, the minimum change of ``loss`` is ``threshold`` . + Default: ``'rel'`` . + cooldown (int, optional): The number of epochs to wait before resuming normal + operation. Default: 0. + min_lr (float, optional): The lower bound of the learning rate after reduction. + Default: 0. + epsilon (float, optional): Minimal decay applied to lr. If the difference + between new and old lr is smaller than epsilon, the update is ignored. + Default: 1e-8. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + indicator: Literal["train_loss", "eval_loss"], + mode: str = "min", + factor: float = 0.1, + patience: int = 10, + threshold: float = 1e-4, + threshold_mode: str = "rel", + cooldown: int = 0, + min_lr: float = 0.0, + epsilon=1e-8, + warmup_epoch: int = 0, # this lr do not support warmup, so set to 0 + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.indicator = indicator + if indicator == "eval_loss": + assert ( + by_epoch + ), "ReduceOnPlateau only support by_epoch=True when indicator is eval_loss" + + self.decay_steps = (epochs - self.warmup_epoch) * iters_per_epoch + self.mode = mode + self.factor = factor + self.patience = patience + self.threshold = threshold + self.threshold_mode = threshold_mode + self.cooldown = cooldown + self.min_lr = min_lr + self.epsilon = epsilon + + self.warmup_steps = round(self.warmup_epoch * iters_per_epoch) + + def __call__(self): + learning_rate = lr.ReduceOnPlateau( + learning_rate=self.learning_rate, + mode=self.mode, + factor=self.factor, + patience=self.patience, + threshold=self.threshold, + threshold_mode=self.threshold_mode, + cooldown=self.cooldown, + min_lr=self.min_lr, + epsilon=self.epsilon, + ) + + # Todo: warmup + # if self.warmup_steps > 0: + # learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class SchedulerList: + """SchedulerList which wrap more than one scheduler. + + Args: + scheduler_list (Tuple[lr.LRScheduler, ...]): Schedulers listed in a tuple. + + Examples: + >>> import ppsci + >>> sch1 = ppsci.optimizer.lr_scheduler.Linear(10, 2, 0.001)() + >>> sch2 = ppsci.optimizer.lr_scheduler.ExponentialDecay(10, 2, 1e-3, 0.95, 3)() + >>> sch = ppsci.optimizer.lr_scheduler.SchedulerList((sch1, sch2)) + """ + + def __init__(self, scheduler_list: Tuple[lr.LRScheduler, ...]): + super().__init__() + self._sch_list = scheduler_list + self.by_epoch = False + + def step(self): + for sch in self._sch_list: + sch.step() + + def get_lr(self) -> float: + """Return learning rate of first scheduler""" + return self._sch_list[0].get_lr() + + def _state_keys(self) -> List[str]: + return ["last_epoch", "last_lr"] + + def __len__(self) -> int: + return len(self._sch_list) + + def __getitem__(self, idx): + return self._sch_list[idx] + + def __setitem__(self, idx, sch): + raise NotImplementedError("Can not modify any item in SchedulerList.") diff --git a/jointContribution/mattergen/mattergen/optimizer/optimizer.py b/jointContribution/mattergen/mattergen/optimizer/optimizer.py new file mode 100644 index 00000000..5a45a6c4 --- /dev/null +++ b/jointContribution/mattergen/mattergen/optimizer/optimizer.py @@ -0,0 +1,549 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +from paddle import nn +from paddle import optimizer as optim +from paddle import regularizer +from paddle.incubate import optimizer as incubate_optim +from typing_extensions import Literal + +from mattergen.utils import logger +from mattergen.utils import misc + +if TYPE_CHECKING: + import paddle + +__all__ = ["SGD", "Momentum", "Adam", "RMSProp", "AdamW", "LBFGS", "OptimizerList"] + + +class SGD: + """Stochastic Gradient Descent. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler], optional): The learning rate + used to update parameter(s). Defaults to 0.001. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]): + Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + + Examples: + >>> import ppsci + >>> model = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt = ppsci.optimizer.SGD(1e-3)(model) + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler] = 0.001, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + ): + self.learning_rate = learning_rate + self.weight_decay = weight_decay + self.grad_clip = grad_clip + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.SGD( + learning_rate=self.learning_rate, + parameters=parameters, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + ) + return opt + + +class Momentum: + """Simple Momentum optimizer with velocity state. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler]): The learning rate + used to update parameter(s). + momentum (float): Momentum factor. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]): + Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + use_nesterov (bool, optional): Whether to use nesterov momentum. + Defaults to False. + no_weight_decay_name (Optional[str]): List of names of no weight decay + parameters split by white space. Defaults to None. + + Examples: + >>> import ppsci + >>> model = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt = ppsci.optimizer.Momentum(1e-3, 0.9)(model) + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler], + momentum: float, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + use_nesterov: bool = False, + no_weight_decay_name: Optional[str] = None, + ): + super().__init__() + self.learning_rate = learning_rate + self.momentum = momentum + self.weight_decay = weight_decay + self.grad_clip = grad_clip + self.use_nesterov = use_nesterov + self.no_weight_decay_name_list = ( + no_weight_decay_name.split() if no_weight_decay_name else [] + ) + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = None + if len(self.no_weight_decay_name_list) > 0: + params_with_decay = [] + params_without_decay = [] + for m in model_list: + params = [ + p + for n, p in m.named_parameters() + if not any(nd in n for nd in self.no_weight_decay_name_list) + ] + params_with_decay.extend(params) + params = [ + p + for n, p in m.named_parameters() + if any(nd in n for nd in self.no_weight_decay_name_list) + ] + params_without_decay.extend(params) + parameters = [ + {"params": params_with_decay, "weight_decay": self.weight_decay}, + {"params": params_without_decay, "weight_decay": 0.0}, + ] + else: + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.Momentum( + learning_rate=self.learning_rate, + momentum=self.momentum, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + use_nesterov=self.use_nesterov, + parameters=parameters, + ) + if hasattr(opt, "_use_multi_tensor"): + opt = optim.Momentum( + learning_rate=self.learning_rate, + momentum=self.momentum, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + parameters=parameters, + use_nesterov=self.use_nesterov, + use_multi_tensor=True, + ) + return opt + + +class Adam: + """Adam: A Method for Stochastic Optimization. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler], optional): The learning rate + used to update parameter(s). Defaults to 0.001. + beta1 (float, optional): The exponential decay rate for the 1st moment + estimates. Defaults to 0.9. + beta2 (float, optional): The exponential decay rate for the 2nd moment + estimates. Defaults to 0.999. + epsilon (float, optional): A small float value for numerical stability. + Defaults to 1e-08. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]) + : Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + lazy_mode (bool, optional): Whether to enable lazy mode for moving-average. + Defaults to False. + + Examples: + >>> import ppsci + >>> model = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt = ppsci.optimizer.Adam(1e-3)(model) + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler] = 0.001, + beta1: float = 0.9, + beta2: float = 0.999, + epsilon: float = 1e-08, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + lazy_mode: bool = False, + ): + self.learning_rate = learning_rate + self.beta1 = beta1 + self.beta2 = beta2 + self.epsilon = epsilon + self.learning_rate = learning_rate + self.weight_decay = weight_decay + self.grad_clip = grad_clip + self.lazy_mode = lazy_mode + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.Adam( + learning_rate=self.learning_rate, + beta1=self.beta1, + beta2=self.beta2, + epsilon=self.epsilon, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + lazy_mode=self.lazy_mode, + parameters=parameters, + ) + return opt + + +class LBFGS: + """The L-BFGS is a quasi-Newton method for solving an unconstrained optimization + problem over a differentiable function. Closely related is the Newton method + for minimization. + + Args: + learning_rate (float, optional): The learning rate + used to update parameter(s). Defaults to 1.0. + max_iter (int, optional): Maximal number of iterations per optimization step. + Defaults to 1. + max_eval (Optional[int]): Maximal number of function evaluations per + optimization step. Defaults to None. + tolerance_grad (float, optional): Termination tolerance on first order + optimality. Defaults to 1e-07. + tolerance_change (float, optional): Termination tolerance on function + value/parameter changes. Defaults to 1e-09. + history_size (int, optional): Update history size. Defaults to 100. + line_search_fn (Optional[Literal["strong_wolfe"]]): Either 'strong_wolfe' or + None. Defaults to "strong_wolfe". + + Examples: + >>> import ppsci + >>> model = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt = ppsci.optimizer.LBFGS(1e-3)(model) + """ + + def __init__( + self, + learning_rate: float = 1.0, + max_iter: int = 1, + max_eval: Optional[int] = None, + tolerance_grad: float = 1e-07, + tolerance_change: float = 1e-09, + history_size: int = 100, + line_search_fn: Optional[Literal["strong_wolfe"]] = "strong_wolfe", + ): + self.lr = learning_rate + self.max_iter = max_iter + self.max_eval = max_eval + self.tolerance_grad = tolerance_grad + self.tolerance_change = tolerance_change + self.history_size = history_size + self.line_search_fn = line_search_fn + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + try: + opt = getattr(optim, "LBFGS")( + learning_rate=self.lr, + max_iter=self.max_iter, + max_eval=self.max_eval, + tolerance_grad=self.tolerance_grad, + tolerance_change=self.tolerance_change, + history_size=self.history_size, + line_search_fn=self.line_search_fn, + parameters=parameters, + ) + except AttributeError: + opt = getattr(incubate_optim, "LBFGS")( + learning_rate=self.lr, + max_iter=self.max_iter, + max_eval=self.max_eval, + tolerance_grad=self.tolerance_grad, + tolerance_change=self.tolerance_change, + history_size=self.history_size, + line_search_fn=self.line_search_fn, + parameters=parameters, + ) + return opt + + +class RMSProp: + """Root Mean Squared Propagation (RMSProp) is an unpublished, adaptive learning + rate method. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler]): The learning rate + used to update parameter(s) + rho (float, optional): Factor ρ in equation. Defaults to 0.95. + epsilon (float, optional): Factor ϵ in equation as a smoothing term. + Defaults to 1e-6. + momentum (float, optional):β in equation is the momentum term. Defaults to 0.0. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]): + Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + + Examples: + >>> import ppsci + >>> model = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt = ppsci.optimizer.RMSProp(1e-3)(model) + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler], + rho: float = 0.95, + epsilon: float = 1e-6, + momentum: float = 0.0, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + ): + super().__init__() + self.learning_rate = learning_rate + self.momentum = momentum + self.rho = rho + self.epsilon = epsilon + self.weight_decay = weight_decay + self.grad_clip = grad_clip + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.RMSProp( + learning_rate=self.learning_rate, + momentum=self.momentum, + rho=self.rho, + epsilon=self.epsilon, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + parameters=parameters, + ) + return opt + + +class AdamW: + """AdamW is implemented based on DECOUPLED WEIGHT DECAY REGULARIZATION. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler], optional): The learning rate + used to update parameter(s). Defaults to 0.001. + beta1 (float, optional): The exponential decay rate for the 1st moment + estimates. Defaults to 0.9. + beta2 (float, optional): The exponential decay rate for the 2nd moment + estimates. Defaults to 0.999. + epsilon (float, optional): A small float value for numerical stability. + Defaults to 1e-8. + weight_decay (float, optional): Regularization coefficient. Defaults to 0.01. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + no_weight_decay_name (Optional[str]): List of names of no weight decay + parameters split by white space. Defaults to None. + one_dim_param_no_weight_decay (bool, optional): Apply no weight decay on + 1-D parameter(s). Defaults to False. + + Examples: + >>> import ppsci + >>> model = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt = ppsci.optimizer.AdamW(1e-3)(model) + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler] = 0.001, + beta1: float = 0.9, + beta2: float = 0.999, + epsilon: float = 1e-8, + weight_decay: float = 0.001, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + no_weight_decay_name: Optional[str] = None, + one_dim_param_no_weight_decay: bool = False, + ): + super().__init__() + self.learning_rate = learning_rate + self.beta1 = beta1 + self.beta2 = beta2 + self.epsilon = epsilon + self.grad_clip = grad_clip + self.weight_decay = weight_decay + self.no_weight_decay_name_list = ( + no_weight_decay_name.split() if no_weight_decay_name else [] + ) + self.one_dim_param_no_weight_decay = one_dim_param_no_weight_decay + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + + # TODO(gaotingquan): Model_list is None when in static graph, "no_weight_decay" + # not work. + if model_list is None: + if ( + self.one_dim_param_no_weight_decay + or len(self.no_weight_decay_name_list) != 0 + ): + msg = '"AdamW" does not support setting "no_weight_decay" in static ' + +"graph. Please use dynamic graph." + logger.error(Exception(msg)) + raise Exception(msg) + + self.no_weight_decay_param_name_list = ( + [ + p.name + for model in model_list + for n, p in model.named_parameters() + if any(nd in n for nd in self.no_weight_decay_name_list) + ] + if model_list + else [] + ) + + if self.one_dim_param_no_weight_decay: + self.no_weight_decay_param_name_list += ( + [ + p.name + for model in model_list + for n, p in model.named_parameters() + if len(p.shape) == 1 + ] + if model_list + else [] + ) + + opt = optim.AdamW( + learning_rate=self.learning_rate, + beta1=self.beta1, + beta2=self.beta2, + epsilon=self.epsilon, + parameters=parameters, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + apply_decay_param_fun=self._apply_decay_param_fun, + ) + return opt + + def _apply_decay_param_fun(self, name): + return name not in self.no_weight_decay_param_name_list + + +class OptimizerList: + """OptimizerList which wrap more than one optimizer. + NOTE: LBFGS is not supported yet. + + Args: + optimizer_list (Tuple[optim.Optimizer, ...]): Optimizers listed in a tuple. + + Examples: + >>> import ppsci + >>> model1 = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt1 = ppsci.optimizer.Adam(1e-3)(model1) + >>> model2 = ppsci.arch.MLP(("y",), ("v",), 5, 20) + >>> opt2 = ppsci.optimizer.Adam(1e-3)(model2) + >>> opt = ppsci.optimizer.OptimizerList((opt1, opt2)) + """ + + def __init__(self, optimizer_list: Tuple[optim.Optimizer, ...]): + super().__init__() + self._opt_list = optimizer_list + if "LBFGS" in set(misc.typename(opt) for opt in optimizer_list): + raise ValueError("LBFGS is not supported in OptimizerList yet.") + + def step(self): + for opt in self._opt_list: + opt.step() + + def clear_grad(self): + for opt in self._opt_list: + opt.clear_grad() + + def get_lr(self) -> float: + """Return learning rate of first optimizer""" + return self._opt_list[0].get_lr() + + def set_state_dict(self, state_dicts: List[Dict[str, "paddle.Tensor"]]): + for i, opt in enumerate(self._opt_list): + opt.set_state_dict(state_dicts[i]) + + def state_dict(self) -> List[Dict[str, "paddle.Tensor"]]: + state_dicts = [opt.state_dict() for opt in self._opt_list] + return state_dicts + + def __len__(self) -> int: + return len(self._opt_list) + + def __getitem__(self, idx): + return self._opt_list[idx] + + def __setitem__(self, idx, opt): + raise NotImplementedError("Can not modify any item in OptimizerList.") + + def __iter__(self): + yield from iter(self._opt_list) diff --git a/jointContribution/mattergen/mattergen/property_embeddings.py b/jointContribution/mattergen/mattergen/property_embeddings.py new file mode 100644 index 00000000..3f654e9a --- /dev/null +++ b/jointContribution/mattergen/mattergen/property_embeddings.py @@ -0,0 +1,500 @@ +import sys + + +from typing import Dict, Sequence, Union + +import paddle +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.data.types import PropertySourceId, TargetProperty +from mattergen.common.utils.data_utils import get_atomic_number +from mattergen.common.utils.globals import MAX_ATOMIC_NUM, PROPERTY_SOURCE_IDS +from paddle_utils import * + +_USE_UNCONDITIONAL_EMBEDDING = "_USE_UNCONDITIONAL_EMBEDDING" + + +def replace_use_unconditional_embedding( + batch: ChemGraph, use_unconditional_embedding: Dict[PropertySourceId, paddle.Tensor] +) -> ChemGraph: + """ + Set the use of conditional or unconditional embeddings for each conditional field in the batch. + This utility will overwrite any batch._USE_CONDITIONAL_EMBEDDING keys included in use_unconditional_embedding + but will keep the value of any keys in batch._USE_CONDITIONAL_EMBEDDING that are not in + use_unconditional_embedding. + + Keyword arguments + ----------------- + batch: ChemGraph -- the batch of data to be modified. + use_unconditional_embedding: Dict[PropertyName, paddle.BoolTensor] -- a dictionary whose values + are paddle.BoolTensors of shape (n_structures_in_batch, 1) stating whether to use the unconditional embedding for + each conditional field. The keys are the names of the conditional fields in the batch. + + + Returns + ------- + ChemGraph -- the modified batch of data containing + ChemGraph._USE_CONDITIONAL_EMBEDDING: Dict[PropertyName, paddle.BoolTensor]. When + ChemGraph[_USE_UNCONDITIONAL_EMBEDDING][cond_field][ii] is True, the iith data point will + use its unconditional embedding for cond_field. When False, the conditional embedding will be used. + """ + try: + existing_use_unconditional_embedding = batch[_USE_UNCONDITIONAL_EMBEDDING] + for k, v in use_unconditional_embedding.items(): + existing_use_unconditional_embedding[k] = v + return batch.replace( + **{_USE_UNCONDITIONAL_EMBEDDING: existing_use_unconditional_embedding} + ) + except KeyError: + return batch.replace( + **{_USE_UNCONDITIONAL_EMBEDDING: use_unconditional_embedding} + ) + + +def get_use_unconditional_embedding( + batch: ChemGraph, cond_field: PropertySourceId +) -> paddle.bool: + """ + Returns + ------- + paddle.BoolTensor, shape=(n_structures_in_batch, 1) -- whether to use the unconditional embedding for cond_field. + When True, we use unconditional embedding. + + NOTE: When _USE_UNCONDITIONAL_EMBEDDING is not in ChemGraph or cond_field is not + in ChemGraph[_USE_UNCONDITIONAL_EMBEDDING] we return a paddle.BoolTensor with False + values. This allows a model trained conditional data to evaluate an unconditional score + without having to specify any conditional data in ChemGraph. + """ + try: + return batch[_USE_UNCONDITIONAL_EMBEDDING][cond_field] + except KeyError: + return paddle.ones_like(x=batch["num_atoms"], dtype="bool").reshape(-1, 1) + + +def tensor_is_not_nan(x: paddle.Tensor) -> paddle.bool: + """ + Keyword arguments + ----------------- + x: paddle.Tensor, shape = (n_structures_in_batch, Ndim) -- labels for a single conditional field. + We assume that when a label is not present, the corresponding value is specified + as paddle.nan. + + Returns + ------- + paddle.BoolTensor, shape = (n_structures_in_batch,) -- index i is True if x[i] contains no NaNs + """ + return paddle.all( + x=paddle.reshape( + x=paddle.logical_not(x=paddle.isnan(x=x)), shape=(tuple(x.shape)[0], -1) + ), + axis=1, + ) + + +def data_is_not_nan( + x: Union[paddle.Tensor, list[str | None], list[list[str] | None]] +) -> paddle.bool: + """ + Returns (n_structures_in_batch,) paddle.BoolTensor of whether the conditional values + for a given property are not nan. + + NOTE: Currently we enforce no restriction on the data type that properties can have in + ChemGraph. The intent is that ChemGraph always contains property values in their + representation and type seen by the user. This means however that we have to distribute + handling of different types throughout the code, this function is one such place. + + """ + if isinstance(x, paddle.Tensor): + return tensor_is_not_nan(x=x) + else: + return paddle.to_tensor(data=[(_x is not None) for _x in x]) + + +def get_cond_field_names_in_batch(x: ChemGraph) -> list[str]: + """ + Returns a list of field names that are known to be conditional properties in + PROPERTY_SOURCE_IDS, which are present in x. + """ + return [str(k) for k in x.keys() if k in PROPERTY_SOURCE_IDS] + + +class SetEmbeddingType: + def __init__(self, p_unconditional: float, dropout_fields_iid: bool = False): + """ + In PropertyEmbedding.forward we choose to concatenate either an unconditional embedding + (ignores the value of a property) or a conditional embedding (depends on the value of a property) + to the tensor that is input to the first node layer of each atom. This utility sets the internal state + of ChemGraph to randomly select either the conditional or unconditional embedding for each structure + in the batch. + + ChemGraph.[_USE_UNCONDITIONAL_EMBEDDING]: boolTensor, shape=(n_structures_in_batch, 1) stores a True + value for structures where we intend to use the unconditional embedding for all atoms contained in + that corresponding structure. + + This utility operates in 2 modes: + 1) dropout_fields_iid = True -- We randomly assign which conditional fields are unconditional and which + are conditional for fields that are not nan independently of whether all conditional fields are not + nan for that structure. This means that for a structure conditioned on (y1,y2) we can generate embeddings + corresponding to p(x), p(x|y1), p(x|y2), p(x|y1,y2). + 2) dropout_fields_iid = False - We assign conditional or unconditional embeddings to all conditional fields + of a single structure simultaneously. This means that for a structure conditioned on (y1,y2) we can + only generate embeddings corresponding to p(x) and p(|y1,y2). + + Keyword args: + ------------- + p_unconditional: float -- the probability of using the unconditional embedding in the score model. + dropout_fields_iid: bool -- whether to mask the conditional embedding of fields independently and + identically distributed according to p_unconditional. If False, the score model is only exposed + to two scenarios: 1) all conditional fields have their unconditional embedding. 2) all conditional + fields have their conditional embedding. If True, the score model is exposed to all possible + combinations of conditional fields having their unconditional or conditional embeddings, ie the score + model will learn p(x), p(x|y1), p(x_y2), p(x|y1,y2),... + + Note: when dropout_fields_iid=False, the conditional embedding will only be used when all + conditional fields have data present. If no single data point has data present for all conditional + fields, then the score model will only be exposed to the unconditional embedding state p(x) and the + joint p(x|y1,y2,...) will not be learned. + """ + self.p_unconditional = p_unconditional + self.dropout_fields_iid = dropout_fields_iid + + def __call__(self, x: ChemGraph) -> ChemGraph: + cond_fields: list[str] = get_cond_field_names_in_batch(x=x) + if len(cond_fields) == 0: + return x + else: + batch_size = len(x[cond_fields[0]]) + device = x["num_atoms"].place + data_is_not_nan_dict: Dict[PropertySourceId, paddle.Tensor] = { + cond_field: data_is_not_nan(x=x[cond_field]).to(device=device) + for cond_field in cond_fields + } + alldata_is_not_nan: paddle.bool = paddle.all( + x=paddle.concat( + x=[ + cond_data_not_nan.reshape(-1, 1) + for cond_data_not_nan in data_is_not_nan_dict.values() + ], + axis=1, + ), + axis=1, + ) + use_unconditional_embedding: Dict[PropertySourceId, paddle.Tensor] = {} + for cond_field in cond_fields: + embedding_type = paddle.ones(shape=(batch_size, 1), dtype="bool") + if self.dropout_fields_iid: + cond_data_is_not_nan = data_is_not_nan_dict[cond_field] + else: + cond_data_is_not_nan = alldata_is_not_nan + embedding_type[cond_data_is_not_nan] = ( + paddle.rand(shape=(cond_data_is_not_nan.sum(), 1)) + <= self.p_unconditional + ) + use_unconditional_embedding[cond_field] = embedding_type + return replace_use_unconditional_embedding( + batch=x, use_unconditional_embedding=use_unconditional_embedding + ) + + +class SetUnconditionalEmbeddingType: + """ + In PropertyEmbedding.forward we choose to concatenate either an unconditional embedding + (ignores the value of a property) or a conditional embedding (depends on the value of a property) + to the tensor that is input to the first node layer of each atom. This utility sets the internal state + of ChemGraph to use the unconditional embedding for all structures for all conditional fields present + in the batch. Note that conditional fields in the batch are automatically determined by the presence + of any PropertyName in ChemGraph. + + ChemGraph.[_USE_UNCONDITIONAL_EMBEDDING]: boolTensor, shape=(n_structures_in_batch, 1) stores True + for all structures for all conditional properties present in ChemGraph. + + NOTE: If a conditional property was trained on by the model but is not + specified in the batch, then it will be attributed an unconditional embedding + in mattergen.property_embeddings.PropertyEmbedding.forward. + This behaviour allows unconditional samples to be drawn from a model that was trained + on certain conditions, without having to set any conditional values in ChemGraph. + """ + + def __call__(self, x: ChemGraph) -> ChemGraph: + cond_fields = get_cond_field_names_in_batch(x=x) + device = x["num_atoms"].place + return replace_use_unconditional_embedding( + batch=x, + use_unconditional_embedding={ + cond_field: paddle.ones(shape=(len(x[cond_field]), 1), dtype="bool") + for cond_field in cond_fields + }, + ) + + +class SetConditionalEmbeddingType: + """ + In PropertyEmbedding.forward we choose to concatenate either an unconditional embedding + (ignores the value of a property) or a conditional embedding (depends on the value of a property) + to the tensor that is input to the first node layer of each atom. This utility sets the internal state + of ChemGraph to use the unconditional embedding for all structures for all conditional fields present + in the batch. Note that conditional fields in the batch are automatically determined by the presence + of any PropertyName on in ChemGraph. + + ChemGraph.[_USE_UNCONDITIONAL_EMBEDDING]: boolTensor, shape=(n_structures_in_batch, 1) stores False + for all structures for all conditional properties present in ChemGraph. + + NOTE: If a conditional property was trained on by the model but is not + specified in the batch, then it will be attributed an unconditional embedding + in mattergen.property_embeddings.PropertyEmbedding.forward. + This behaviour allows unconditional samples to be drawn from a model that was trained + on certain conditions, without having to set any conditional values in ChemGraph. + """ + + def __call__(self, x: ChemGraph) -> ChemGraph: + cond_fields = get_cond_field_names_in_batch(x=x) + device = x["num_atoms"].place + use_unconditional_embedding = {} + for cond_field in cond_fields: + use_unconditional_embedding[cond_field] = paddle.zeros( + shape=(len(x[cond_field]), 1), dtype="bool" + ) + return replace_use_unconditional_embedding( + batch=x, use_unconditional_embedding=use_unconditional_embedding + ) + + +class BaseUnconditionalEmbeddingModule(paddle.nn.Layer): + only_depends_on_shape_of_input: bool + hidden_dim: int + + +class EmbeddingVector(BaseUnconditionalEmbeddingModule): + only_depends_on_shape_of_input: bool = True + + def __init__(self, hidden_dim: int): + super().__init__() + self.embedding = paddle.nn.Embedding(num_embeddings=1, embedding_dim=hidden_dim) + self.hidden_dim = hidden_dim + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """ + This forward depends only on the shape of x and returns a tensor of zeros. + """ + return self.embedding(paddle.zeros(shape=len(x), dtype="int64")) + + +class SpaceGroupEmbeddingVector(BaseUnconditionalEmbeddingModule): + only_depends_on_shape_of_input: bool = True + + def __init__(self, hidden_dim: int): + super().__init__() + self.embedding = paddle.nn.Embedding( + num_embeddings=230, embedding_dim=hidden_dim + ) + self.hidden_dim = hidden_dim + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """ + Return embedding of the space group, 1 is subtracted from the space group number to + make it zero-indexed. + """ + return self.embedding(x.astype(dtype="int64") - 1) + + +class ZerosEmbedding(BaseUnconditionalEmbeddingModule): + """ + Return a [n_crystals_in_batch, self.hidden_dim] tensor of zeros. This is helpfuln as the unconditional embedding + for a property included in the adapter module if we do not want to change the unconditional score + of the base model when properties are added in the adapter module. + """ + + only_depends_on_shape_of_input: bool = True + + def __init__(self, hidden_dim: int): + super().__init__() + self.hidden_dim = hidden_dim + + def forward(self, x: (paddle.Tensor | list[str])) -> paddle.Tensor: + """ + This forward depends only on the shape of x. + """ + return paddle.zeros(shape=[len(x), self.hidden_dim]) + + +class ChemicalSystemMultiHotEmbedding(paddle.nn.Layer): + def __init__(self, hidden_dim: int): + super().__init__() + self.hidden_dim = hidden_dim + self.embedding = paddle.nn.Linear( + in_features=MAX_ATOMIC_NUM + 1, out_features=hidden_dim + ) + + @property + def device(self): + return self.parameters()[0].place + # return next(self.parameters()).place + + @staticmethod + def _sequence_to_multi_hot( + x: Sequence[str], device: (paddle.CPUPlace, paddle.CUDAPlace, str) + ) -> paddle.Tensor: + """ + Converts a sequence of unique elements present in a single structure to a multi-hot + vectors of 1s (present) and 0s (not present) for each unique element. + + Returns + ------- + paddle.Tensor, shape = (1, MAX_ATOMIC_NUM + 1) + """ + chemical_system_numbers: paddle.int64 = paddle.to_tensor( + data=[get_atomic_number(symbol=_element) for _element in x], + dtype="int64", + place=device, + ) + chemical_system_condition = paddle.zeros(shape=MAX_ATOMIC_NUM + 1) + chemical_system_condition[chemical_system_numbers] = 1.0 + return chemical_system_condition.reshape(1, -1) + + @staticmethod + def sequences_to_multi_hot( + x: list[list[str]], device: (paddle.CPUPlace, paddle.CUDAPlace, str) + ) -> paddle.Tensor: + """ + Convert a list of sequences of unique elements present in a list of structures to a multi-hot + tensor of 1s (present) and 0s (not present) for each unique element. + + Returns + ------- + paddle.Tensor, shape = (n_structures_in_batch, MAX_ATOMIC_NUM + 1) + """ + return paddle.concat( + x=[ + ChemicalSystemMultiHotEmbedding._sequence_to_multi_hot( + _x, device=device + ) + for _x in x + ], + axis=0, + ) + + @staticmethod + def convert_to_list_of_str(x: (list[str] | list[list[str]])) -> list[list[str]]: + """ + Returns + ------- + list[list[str]] -- a list of length n_structures_in_batch of chemical systems for each structure + where the chemical system is specified as a list of unique elements in the structure. + """ + if isinstance(x[0], str): + x = [_x.split("-") for _x in x if isinstance(_x, str)] + return x + + def forward(self, x: (list[str] | list[list[str]])) -> paddle.Tensor: + """ + Keyword arguments + ----------------- + x: Union[list[str], list[Sequence[str]]] -- if elements are a string, they are assumed to be + a '-' delimited list of unique elements. If a sequence of strings, it is assumed to be a list of + unique elements in the structure. + """ + x = self.convert_to_list_of_str(x=x) + multi_hot_representation: paddle.Tensor = self.sequences_to_multi_hot( + x=x, device=self.device + ) + return self.embedding(multi_hot_representation) + + +class PropertyEmbedding(paddle.nn.Layer): + def __init__( + self, + name: PropertySourceId, + conditional_embedding_module: paddle.nn.Layer, + unconditional_embedding_module: BaseUnconditionalEmbeddingModule, + scaler: paddle.nn.Layer = paddle.nn.Identity(), + ): + super().__init__() + self.name = name + self.conditional_embedding_module = conditional_embedding_module + self.unconditional_embedding_module = unconditional_embedding_module + self.scaler = scaler + assert ( + self.name in PROPERTY_SOURCE_IDS + ), f"PropertyEmbedding.name {self.name} not found in the database. Available property_source_ids: {PROPERTY_SOURCE_IDS}" + + def forward(self, batch: ChemGraph) -> paddle.Tensor: + """ + ChemGraph[_USE_UNCONDITIONAL_EMBEDDING]: Dict[str, paddle.BoolTensor] + has values paddle.BoolTensor, shape=(n_structures_in_batch, 1) that when True, denote that + we should use the unconditional embedding (instead of the conditional embedding) as input + for that property to the input nodes of each atom in the structure. + + In this forward, we return a paddle.Tensor, shape=(n_structures_in_batch, hidden_dim) of + embedding values for this property for each structure in the batch. Based on the state of + ChemGraph[_USE_UNCONDITIONAL_EMBEDDING] we return either the unconditional or conditional + embedding for each element i in paddle.Tensor[i]. + + NOTE: when self.name is not in ChemGraph[_USE_UNCONDITIONAL_EMBEDDING] we apply the + unconditional embedding. This is to adopt the behaviour that when no conditional value is + specified in ChemGraph, a model that was trained on said property will generate an + unconditional score. + """ + use_unconditional_embedding: paddle.bool = get_use_unconditional_embedding( + batch=batch, cond_field=self.name + ) + if ( + paddle.all(x=use_unconditional_embedding) + and self.unconditional_embedding_module.only_depends_on_shape_of_input + ): + return self.unconditional_embedding_module(x=batch["num_atoms"]).to( + batch.pos.place + ) + else: + data = batch[self.name] + if isinstance(data, paddle.Tensor) and data.dim() == 2: + data = data.squeeze(axis=-1) + data = self.scaler(data) + conditional_embedding: paddle.Tensor = self.conditional_embedding_module( + data + ) + unconditional_embedding: paddle.Tensor = ( + self.unconditional_embedding_module(x=data).to(batch.pos.place) + ) + return paddle.where( + condition=use_unconditional_embedding, + x=unconditional_embedding, + y=conditional_embedding, + ) + + def fit_scaler(self, all_data): + if isinstance(self.scaler, paddle.nn.Identity): + return + self.scaler.fit(all_data) + + +def get_property_embeddings( + batch: ChemGraph, property_embeddings: paddle.nn.LayerDict +) -> paddle.Tensor: + """ + Keyword arguments + ----------------- + property_embeddings: paddle.nn.ModuleDict[PropertyToConditonOn, PropertyEmbedding] -- a dictionary + of property embeddings. The keys are the names of the conditional fields in the batch. + """ + ordered_keys = sorted(property_embeddings.keys()) + if len(ordered_keys) > 0: + return paddle.concat( + x=[property_embeddings[k].forward(batch=batch) for k in ordered_keys], + axis=-1, + ) + else: + return paddle.to_tensor(data=[], place=batch["num_atoms"].place) + + +def set_conditional_property_values( + batch: ChemGraph, properties: TargetProperty +) -> ChemGraph: + not_numeric = [k for k, v in properties.items() if not isinstance(v, (int, float))] + cond_values = { + k: ( + [properties[k]] * len(batch["num_atoms"]) + if k in not_numeric + else paddle.full_like(x=batch["num_atoms"], fill_value=v).reshape(-1, 1) + ) + for k, v in properties.items() + } + return batch.replace(**cond_values) diff --git a/jointContribution/mattergen/mattergen/tests/__init__.py b/jointContribution/mattergen/mattergen/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/mattergen/tests/test_diffusion_instantiation.py b/jointContribution/mattergen/mattergen/tests/test_diffusion_instantiation.py new file mode 100644 index 00000000..33132f82 --- /dev/null +++ b/jointContribution/mattergen/mattergen/tests/test_diffusion_instantiation.py @@ -0,0 +1,33 @@ +import os +import sys + +sys.path.append(os.path.join(os.path.dirname(__file__), "../../scripts")) +import hydra +import pytest +from mattergen.common.utils.globals import MODELS_PROJECT_ROOT +from scripts.run import mattergen_main + +CONFIG_DIR = os.path.join(MODELS_PROJECT_ROOT, "conf") + + +@pytest.mark.parametrize("config_name", ["default"]) +def test_train_on_one_batch(config_name: str) -> None: + overrides = [ + "trainer.max_epochs=1", + "+trainer.overfit_batches=1", + "trainer.check_val_every_n_epoch=1", + "lightning_module.diffusion_module.model.gemnet.num_blocks=1", + "lightning_module.diffusion_module.model.gemnet.max_neighbors=5", + "lightning_module.diffusion_module.model.hidden_dim=16", + "data_module.batch_size.train=8", + "data_module.batch_size.val=8", + "data_module.batch_size.test=8", + "+trainer.limit_val_batches=1", + "+trainer.limit_test_batches=1", + "trainer.accelerator=cpu", + "~trainer.logger", + ] + with hydra.initialize_config_dir(config_dir=CONFIG_DIR): + config = hydra.compose(config_name=config_name, overrides=overrides) + _ = mattergen_main(config) + assert True diff --git a/jointContribution/mattergen/mattergen/tests/test_generator.py b/jointContribution/mattergen/mattergen/tests/test_generator.py new file mode 100644 index 00000000..7129bc27 --- /dev/null +++ b/jointContribution/mattergen/mattergen/tests/test_generator.py @@ -0,0 +1,16 @@ +from typing import List + +import pytest +from mattergen.common.utils.globals import MAX_ATOMIC_NUM +from mattergen.property_embeddings import ChemicalSystemMultiHotEmbedding + + +@pytest.mark.parametrize( + "chemical_system", [["Li", "O"], ["Li", "O", "F"], ["C", "O", "H"]] +) +def test_chemical_system_to_multi_hot(chemical_system: List[str]) -> None: + multi_hot_encoding = ChemicalSystemMultiHotEmbedding._sequence_to_multi_hot( + x=chemical_system, device="cpu" + ) + assert multi_hot_encoding.shape == (1, MAX_ATOMIC_NUM + 1) + assert multi_hot_encoding.sum() == len(chemical_system) diff --git a/jointContribution/mattergen/mattergen/tests/test_sde_lib.py b/jointContribution/mattergen/mattergen/tests/test_sde_lib.py new file mode 100644 index 00000000..df6ebe75 --- /dev/null +++ b/jointContribution/mattergen/mattergen/tests/test_sde_lib.py @@ -0,0 +1,141 @@ +from abc import ABC, abstractmethod +from math import pi +from typing import Optional, Tuple + +import paddle +import pytest +from mattergen.common.data.chemgraph import ChemGraph +from mattergen.common.diffusion.corruption import ( + LatticeVPSDE, expand, make_noise_symmetric_preserve_variance) +from mattergen.diffusion.corruption.sde_lib import VPSDE + + +class TestVPSDE(VPSDE, ABC): + @classmethod + @abstractmethod + def get_random_data(cls, N: int) -> paddle.Tensor: + pass + + @abstractmethod + def get_limit_mean( + self, x: paddle.Tensor, limit_info: Optional[paddle.Tensor] = None + ) -> paddle.Tensor: + pass + + @abstractmethod + def get_limit_var( + self, x: paddle.Tensor, limit_info: Optional[paddle.Tensor] = None + ) -> paddle.Tensor: + pass + + @abstractmethod + def assert_discretize_ok(self, x: paddle.Tensor) -> None: + pass + + +def test_LatticeVPSDE_get_limit_mean(): + density = 15.0 + sde = LatticeVPSDE(limit_density=density, limit_mean="scaled") + n_atoms = paddle.to_tensor(data=[1, 2]) + batch = ChemGraph(num_atoms=n_atoms) + lattices = paddle.eye(num_rows=3).expand(shape=[2, 3, 3]) + lattice_mean = sde.get_limit_mean(x=lattices, batch=batch) + expected_val = paddle.pow(x=n_atoms / density, y=1 / 3) + assert paddle.allclose( + x=lattice_mean[0], y=expected_val[0] * paddle.eye(num_rows=3) + ).item() + assert paddle.allclose( + x=lattice_mean[1], y=expected_val[1] * paddle.eye(num_rows=3) + ).item() + + +def test_LatticeVPSDE_get_var_mean(): + density = 20.0 + sde = LatticeVPSDE(limit_density=density) + n_atoms = paddle.to_tensor(data=[1, 2]) + batch = ChemGraph(num_atoms=n_atoms) + lattices = paddle.eye(num_rows=3).expand(shape=[2, 3, 3]) + lattice_var = sde.get_limit_var(x=lattices, batch=batch) + expected_val = ( + expand(paddle.pow(x=n_atoms, y=2 / 3), (2, 3, 3)).tile(1, 3, 3) + * sde.limit_var_scaling_constant + ) + assert paddle.allclose(x=lattice_var, y=expected_val).item() + + +def test_LatticeVPSDE_prior_sampling(): + density = 20.0 + Nbatch = 1000 + n_atoms = paddle.ones(shape=(Nbatch,)) * 10 + batch = ChemGraph(num_atoms=n_atoms) + sde = LatticeVPSDE(limit_density=density) + x = sde.prior_sampling(shape=(Nbatch, 3, 3), conditioning_data=batch) + expected_mean = sde.get_limit_mean(x=x, batch=batch).mean(axis=0) + expected_var = sde.get_limit_var(x=x, batch=batch).mean(axis=0)[0, 0] + assert tuple(x.shape) == (Nbatch, 3, 3) + assert paddle.allclose(x=x.mean(axis=0), y=expected_mean, atol=0.1).item() + assert paddle.allclose(x=x.var(axis=0).mean(), y=expected_var, atol=0.1).item() + + +def test_LatticeVPSDE_prior_logp(): + density = 20.0 + Nbatch = 100 + n_atoms = paddle.ones(shape=(Nbatch,)) * 10 + batch = ChemGraph(num_atoms=n_atoms) + sde = LatticeVPSDE(limit_density=density, limit_var_scaling_constant=1.0) + x = sde.prior_sampling(shape=(Nbatch, 3, 3), conditioning_data=batch) + expected_log_likelihood = -0.5 * paddle.pow(x=x, y=2) - 0.5 * paddle.log( + x=paddle.to_tensor(data=[2.0 * pi]) + ) + expected_log_likelihood = paddle.sum(x=expected_log_likelihood, axis=(-2, -1)) + assert paddle.allclose( + x=sde.prior_logp(z=x, batch=batch), y=expected_log_likelihood + ).item() + + +def test_LatticeVPSDE_marginal_prob(): + density = 20.0 + Nbatch = 100 + n_atoms = paddle.ones(shape=(Nbatch,)) * 10 + batch = ChemGraph(num_atoms=n_atoms) + sde = LatticeVPSDE(limit_density=density, limit_var_scaling_constant=1.0) + t = paddle.ones(shape=(1,)) * 0.5 + x = paddle.ones(shape=[Nbatch, 3, 3]) + mean, std = sde.marginal_prob(x=x, t=t, batch=batch) + coeff = paddle.exp( + x=-0.25 * t**2 * (sde.beta_1 - sde.beta_0) - 0.5 * t * sde.beta_0 + ) + expected_mean = coeff * x + (1 - coeff)[:, None, None] * ( + paddle.eye(num_rows=3)[None] * batch.num_atoms[:, None, None] / density + ).pow(y=1.0 / 3) + expected_var = 1 - paddle.exp( + x=-0.5 * t**2 * (sde.beta_1 - sde.beta_0) - t * sde.beta_0 + ) + expected_var = expected_var * sde.get_limit_var(x=x, batch=batch) + assert tuple(mean.shape) == (Nbatch, 3, 3) + assert tuple(std.shape) == (Nbatch, 3, 3) + assert paddle.allclose(x=expected_mean, y=mean).item() + assert paddle.allclose(x=expected_var.sqrt(), y=std).item() + + +def test_make_noise_symmetric_preserve_variance(): + noise = paddle.randn(shape=[100000, 3, 3]) + symmetric_noise = make_noise_symmetric_preserve_variance(noise) + assert paddle.allclose(x=noise.var(), y=symmetric_noise.var(), atol=0.01).item() + assert paddle.allclose(x=noise.mean(), y=symmetric_noise.mean(), atol=0.01).item() + with pytest.raises(AssertionError): + make_noise_symmetric_preserve_variance(paddle.randn(shape=[100000, 3, 4])) + with pytest.raises(AssertionError): + make_noise_symmetric_preserve_variance(paddle.randn(shape=[100000, 3])) + with pytest.raises(AssertionError): + make_noise_symmetric_preserve_variance(paddle.randn(shape=[100000, 3, 1])) + + +@pytest.mark.parametrize( + "output_shape", [(10, 3, 3), (10, 3, 1), (10, 3), (10, 2), (10, 3, 9, 1)] +) +def test_expand(output_shape: Tuple): + unexpanded_data = paddle.randn(shape=(10,)) + expanded_data = expand(unexpanded_data, output_shape) + assert len(tuple(expanded_data.shape)) == len(output_shape) + assert tuple(expanded_data.shape) != output_shape diff --git a/jointContribution/mattergen/mattergen/utils/__init__.py b/jointContribution/mattergen/mattergen/utils/__init__.py new file mode 100644 index 00000000..2694bc19 --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/__init__.py @@ -0,0 +1,34 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOTE: Put config module import at the top level for register default config(s) in +# ConfigStore at the begining of ppsci + +from mattergen.utils import logger +from mattergen.utils import misc +from mattergen.utils.misc import AverageMeter +from mattergen.utils.misc import set_random_seed +from mattergen.utils.save_load import load_checkpoint +from mattergen.utils.save_load import load_pretrain +from mattergen.utils.save_load import save_checkpoint + +__all__ = [ + logger, + misc, + AverageMeter, + set_random_seed, + load_checkpoint, + load_pretrain, + save_checkpoint, +] diff --git a/jointContribution/mattergen/mattergen/utils/download.py b/jointContribution/mattergen/mattergen/utils/download.py new file mode 100644 index 00000000..b448ece6 --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/download.py @@ -0,0 +1,286 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import hashlib +import os +import os.path as osp +import shutil +import tarfile +import time +import zipfile + +import requests +import tqdm + +from mattergen.utils import logger +from mattergen.utils import misc + +__all__ = ["get_weights_path_from_url"] + +WEIGHTS_HOME = osp.expanduser("~/.paddlemat/weights") + +DOWNLOAD_RETRY_LIMIT = 3 + + +def is_url(path): + """ + Whether path is URL. + + Args: + path (str): URL string or not. + """ + return path.startswith("http://") or path.startswith("https://") + + +def get_weights_path_from_url(url, md5sum=None): + """Get weights path from WEIGHT_HOME, if not exists, + download it from url. + + Args: + url (str): Download url + md5sum (str): md5 sum of download package + + Returns: + str: a local path to save downloaded weights. + """ + path = get_path_from_url(url, WEIGHTS_HOME, md5sum) + return path + + +def _map_path(url, root_dir): + # parse path after download under root_dir + fname = osp.split(url)[-1] + fpath = fname + return osp.join(root_dir, fpath) + + +def get_path_from_url(url, root_dir, md5sum=None, check_exist=True, decompress=True): + """Download from given url to root_dir. + if file or directory specified by url is exists under + root_dir, return the path directly, otherwise download + from url and decompress it, return the path. + + Args: + url (str): Download url + root_dir (str): Root dir for downloading, it should be + WEIGHTS_HOME or DATASET_HOME + md5sum (str): md5 sum of download package + + Returns: + str: a local path to save downloaded models & weights & datasets. + """ + if not is_url(url): + raise ValueError(f"Given url({url}) is not valid") + # parse path after download to decompress under root_dir + fullpath = _map_path(url, root_dir) + # Mainly used to solve the problem of downloading data from different + # machines in the case of multiple machines. Different nodes will download + # data, and the same node will only download data once. + rank_id_curr_node = int(os.environ.get("PADDLE_RANK_IN_NODE", 0)) + + if osp.exists(fullpath) and check_exist and _md5check(fullpath, md5sum): + logger.message(f"Found {fullpath} already in {WEIGHTS_HOME}, skip downloading.") + else: + with misc.RankZeroOnly(rank_id_curr_node) as is_master: + if is_master: + fullpath = _download(url, root_dir, md5sum) + + if decompress and (tarfile.is_tarfile(fullpath) or zipfile.is_zipfile(fullpath)): + with misc.RankZeroOnly(rank_id_curr_node) as is_master: + if is_master: + fullpath = _decompress(fullpath) + + return fullpath + + +def _download(url, path, md5sum=None): + """ + Download from url, save to path. + + url (str): Download url + path (str): Download to given path + """ + if not osp.exists(path): + os.makedirs(path) + + fname = osp.split(url)[-1] + fullname = osp.join(path, fname) + retry_cnt = 0 + + while not (osp.exists(fullname) and _md5check(fullname, md5sum)): + if retry_cnt < DOWNLOAD_RETRY_LIMIT: + retry_cnt += 1 + else: + raise RuntimeError(f"Download from {url} failed. " "Retry limit reached") + + logger.message(f"Downloading {fname} from {url}") + + try: + req = requests.get(url, stream=True) + except Exception as e: # requests.exceptions.ConnectionError + logger.warning( + f"Downloading {fname} from {url} failed {retry_cnt + 1} times with " + f"exception {str(e)}" + ) + time.sleep(1) + continue + + if req.status_code != 200: + raise RuntimeError( + f"Downloading from {url} failed with code " f"{req.status_code}!" + ) + + # For protecting download interrupted, download to + # tmp_fullname firstly, move tmp_fullname to fullname + # after download finished + tmp_fullname = fullname + "_tmp" + total_size = req.headers.get("content-length") + with open(tmp_fullname, "wb") as f: + if total_size: + with tqdm.tqdm(total=(int(total_size) + 1023) // 1024) as pbar: + for chunk in req.iter_content(chunk_size=1024): + f.write(chunk) + pbar.update(1) + else: + for chunk in req.iter_content(chunk_size=1024): + if chunk: + f.write(chunk) + shutil.move(tmp_fullname, fullname) + logger.message(f"Finish downloading pretrained model and saved to {fullname}") + + return fullname + + +def _md5check(fullname, md5sum=None): + if md5sum is None: + return True + + logger.message(f"File {fullname} md5 checking...") + md5 = hashlib.md5() + with open(fullname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + md5.update(chunk) + calc_md5sum = md5.hexdigest() + + if calc_md5sum != md5sum: + logger.error( + f"File {fullname} md5 check failed, {calc_md5sum}(calc) != " + f"{md5sum}(base)" + ) + return False + return True + + +def _decompress(fname): + """ + Decompress for zip and tar file + """ + logger.message(f"Decompressing {fname}...") + + # For protecting decompressing interrupted, + # decompress to fpath_tmp directory firstly, if decompress + # succeed, move decompress files to fpath and delete + # fpath_tmp and remove download compress file. + + if tarfile.is_tarfile(fname): + uncompressed_path = _uncompress_file_tar(fname) + elif zipfile.is_zipfile(fname): + uncompressed_path = _uncompress_file_zip(fname) + else: + raise TypeError(f"Unsupported compress file type {fname}") + + return uncompressed_path + + +def _uncompress_file_zip(filepath): + with zipfile.ZipFile(filepath, "r") as files: + file_list = files.namelist() + + file_dir = os.path.dirname(filepath) + + if _is_a_single_file(file_list): + rootpath = file_list[0] + uncompressed_path = os.path.join(file_dir, rootpath) + + for item in file_list: + files.extract(item, file_dir) + + elif _is_a_single_dir(file_list): + rootpath = os.path.splitext(file_list[0])[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + + for item in file_list: + files.extract(item, file_dir) + + else: + rootpath = os.path.splitext(filepath)[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + if not os.path.exists(uncompressed_path): + os.makedirs(uncompressed_path) + for item in file_list: + files.extract(item, os.path.join(file_dir, rootpath)) + + return uncompressed_path + + +def _uncompress_file_tar(filepath, mode="r:*"): + with tarfile.open(filepath, mode) as files: + file_list = files.getnames() + + file_dir = os.path.dirname(filepath) + + if _is_a_single_file(file_list): + rootpath = file_list[0] + uncompressed_path = os.path.join(file_dir, rootpath) + for item in file_list: + files.extract(item, file_dir) + elif _is_a_single_dir(file_list): + rootpath = os.path.splitext(file_list[0])[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + for item in file_list: + files.extract(item, file_dir) + else: + rootpath = os.path.splitext(filepath)[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + if not os.path.exists(uncompressed_path): + os.makedirs(uncompressed_path) + + for item in file_list: + files.extract(item, os.path.join(file_dir, rootpath)) + + return uncompressed_path + + +def _is_a_single_file(file_list): + if len(file_list) == 1 and file_list[0].find(os.sep) < -1: + return True + return False + + +def _is_a_single_dir(file_list): + new_file_list = [] + for file_path in file_list: + if "/" in file_path: + file_path = file_path.replace("/", os.sep) + elif "\\" in file_path: + file_path = file_path.replace("\\", os.sep) + new_file_list.append(file_path) + + file_name = new_file_list[0].split(os.sep)[0] + for i in range(1, len(new_file_list)): + if file_name != new_file_list[i].split(os.sep)[0]: + return False + return True diff --git a/jointContribution/mattergen/mattergen/utils/ema.py b/jointContribution/mattergen/mattergen/utils/ema.py new file mode 100644 index 00000000..03a87c7c --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/ema.py @@ -0,0 +1,149 @@ +# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import itertools +from typing import Dict +from typing import Optional + +import paddle +from paddle import nn + +__all__ = [ + "AveragedModel", + "ExponentialMovingAverage", + "StochasticWeightAverage", +] + + +class AveragedModel(nn.Layer): + """Base class for Averaged Model. + + Args: + model (nn.Layer): The model to be averaged. + decay (float): The decay rate for averaging. + """ + + def __init__(self, model: nn.Layer, decay: Optional[float] = None): + super().__init__() + self.model = model # As a quick reference to online model + self.decay = decay + + self.params_shadow: Dict[str, paddle.Tensor] = {} # ema param or buffer + self.params_backup: Dict[str, paddle.Tensor] = {} # used for apply and restore + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + self.params_shadow[name] = param_or_buffer.clone().detach() + + self.register_buffer("n_avg", paddle.to_tensor(0, "int64"), True) + + def _update_fn_( + self, + shadow_param: paddle.Tensor, + model_param: paddle.Tensor, + step: paddle.Tensor, + ): + raise NotImplementedError("AveragedModel._update_fn_ should be implemented.") + + def update(self): + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + if not param_or_buffer.stop_gradient: + assert ( + name in self.params_shadow + ), f"Parameter: {name} should be in params_shadow dict, but not found." + + # only update floating and complex data + if paddle.is_floating_point(param_or_buffer) or paddle.is_complex( + param_or_buffer + ): + with paddle.no_grad(): + self._update_fn_( + self.params_shadow[name], + param_or_buffer, + self.n_avg, + ) + self.n_avg += 1 + + def apply_shadow(self): + """Set averaged model parameters to online model.""" + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + if name in self.params_shadow: + stop_gradient = param_or_buffer.stop_gradient + with paddle.no_grad(): + self.params_backup[name] = paddle.assign(param_or_buffer) + paddle.assign(self.params_shadow[name], param_or_buffer) + param_or_buffer.stop_gradient = stop_gradient + + def restore(self): + """Restore online model parameters from backup parameter dict.""" + assert self.params_backup, ( + "params_backup should not be empty, may be caused by calling 'restore' " + "before 'apply_shadow'." + ) + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + if name in self.params_backup: + assert name in self.params_shadow + stop_gradient = param_or_buffer.stop_gradient + with paddle.no_grad(): + paddle.assign(self.params_backup[name], param_or_buffer) + param_or_buffer.stop_gradient = stop_gradient + + self.params_backup = {} + + def set_state_dict(self, state_dict: Dict[str, paddle.Tensor]): + assert ( + "n_avg" in state_dict + ), "state_dict should contain 'n_avg' key, but not found." + self.n_avg.set_value(state_dict.pop("n_avg")) + self.params_shadow.update(state_dict) + + def state_dict(self) -> Dict[str, paddle.Tensor]: + return { + **self.params_shadow, + "n_avg": self.n_avg, + } + + +class ExponentialMovingAverage(AveragedModel): + r"""Implements the exponential moving average (EMA) of the model.""" + + def __init__(self, model: nn.Layer, decay: float = 0.9): + super().__init__(model, decay) + + def _update_fn_(self, shadow_param, model_param, step): + shadow_param.lerp_(model_param, 1.0 - self.decay) + + +class StochasticWeightAverage(AveragedModel): + r"""Implements the stochastic weight averaging (SWA) of the model. + + Args: + model (nn.Layer): The model to be averaged. + """ + + def __init__(self, model: nn.Layer): + super().__init__(model, None) + self.n_avg += 1 # Set to 1 for model already initialized + + def _update_fn_(self, shadow_param, model_param, step): + dynamic_decay = step / (step + 1) + shadow_param.lerp_(model_param, 1.0 - dynamic_decay) diff --git a/jointContribution/mattergen/mattergen/utils/io.py b/jointContribution/mattergen/mattergen/utils/io.py new file mode 100644 index 00000000..622ff9c8 --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/io.py @@ -0,0 +1,52 @@ +import json + +import numpy as np + + +def read_json(path): + """ """ + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + with open(path, "r") as f: + content = json.load(f) + return content + + +def update_json(path, data): + """ """ + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + content = read_json(path) + content.update(data) + write_json(path, content) + + +def write_json(path, data): + """ """ + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + + def handler(obj: object) -> (int | object): + """Convert numpy int64 to int. + + Fixes TypeError: Object of type int64 is not JSON serializable + reported in https://github.com/CederGroupHub/chgnet/issues/168. + + Returns: + int | object: object for serialization + """ + if isinstance(obj, np.integer): + return int(obj) + return obj + + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4, default=handler) + + +def read_value_json(path, key): + """ """ + content = read_json(path) + if key in content.keys(): + return content[key] + else: + return None diff --git a/jointContribution/mattergen/mattergen/utils/logger.py b/jointContribution/mattergen/mattergen/utils/logger.py new file mode 100644 index 00000000..569b8b61 --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/logger.py @@ -0,0 +1,267 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import functools +import logging +import os +import sys +from typing import TYPE_CHECKING +from typing import Callable +from typing import Dict +from typing import Optional + +import colorlog +import paddle.distributed as dist + +from mattergen.utils import misc + +if TYPE_CHECKING: + import visualdl # isort:skip + import wandb # isort:skip + import tensorboardX as tbd + +_logger: logging.Logger = None + +# INFO(20) is white(no color) +# use custom log level `MESSAGE` for printing message in color +_MESSAGE_LEVEL = 25 + +_COLORLOG_CONFIG = { + "DEBUG": "green", + "WARNING": "yellow", + "ERROR": "red", + "MESSAGE": "cyan", +} + +__all__ = [ + "init_logger", + "set_log_level", + "info", + "message", + "debug", + "warning", + "error", + "scalar", +] + + +def init_logger( + name: str = "ppsci", + log_file: Optional[str] = None, + log_level: int = logging.INFO, +) -> None: + """Initialize and get a logger by name. + + If the logger has not been initialized, this method will initialize the logger by + adding one or two handlers, otherwise the initialized logger will be directly + returned. During initialization, a StreamHandler will always be added. If `log_file` + is specified a FileHandler will also be added. + + Args: + name (str, optional): Logger name. Defaults to "ppsci". + log_file (Optional[str]): The log filename. If specified, a FileHandler + will be added to the logger. Defaults to None. + log_level (int, optional): The logger level. Note that only the process of + rank 0 is affected, and other processes will set the level to + "Error" thus be silent most of the time. Defaults to logging.INFO. + """ + # Add custom log level MESSAGE(25), between WARNING(30) and INFO(20) + logging.addLevelName(_MESSAGE_LEVEL, "MESSAGE") + + if isinstance(log_level, str): + log_level = getattr(logging, log_level.upper()) + + global _logger + + # get a clean logger + _logger = logging.getLogger(name) + _logger.handlers.clear() + + # add stream_handler, output to stdout such as terminal + stream_formatter = colorlog.ColoredFormatter( + "%(log_color)s[%(asctime)s] %(name)s %(levelname)s: %(message)s", + datefmt="%Y/%m/%d %H:%M:%S", + log_colors=_COLORLOG_CONFIG, + ) + stream_handler = logging.StreamHandler(stream=sys.stdout) + stream_handler.setFormatter(stream_formatter) + stream_handler._name = "stream_handler" + _logger.addHandler(stream_handler) + + # add file_handler, output to log_file(if specified), only for rank 0 device + if log_file is not None and dist.get_rank() == 0: + log_file_folder = os.path.dirname(log_file) + if len(log_file_folder): + os.makedirs(log_file_folder, exist_ok=True) + file_formatter = logging.Formatter( + "[%(asctime)s] %(name)s %(levelname)s: %(message)s", + datefmt="%Y/%m/%d %H:%M:%S", + ) + file_handler = logging.FileHandler(log_file, "a") # append mode + file_handler.setFormatter(file_formatter) + file_handler._name = "file_handler" + _logger.addHandler(file_handler) + + if dist.get_rank() == 0: + _logger.setLevel(log_level) + else: + _logger.setLevel(logging.ERROR) + + _logger.propagate = False + + +def set_log_level(log_level: int): + """Set logger level, only message of level >= `log_level` will be printed. + + Built-in log level are below: + + CRITICAL = 50, + FATAL = 50, + ERROR = 40, + WARNING = 30, + WARN = 30, + INFO = 20, + DEBUG = 10, + NOTSET = 0. + + Args: + log_level (int): Log level. + """ + if dist.get_rank() == 0: + _logger.setLevel(log_level) + else: + _logger.setLevel(logging.ERROR) + + +def ensure_logger(log_func: Callable) -> Callable: + """ + A decorator which automatically initialize `logger` by default arguments + when init_logger() is not called manually. + """ + + @functools.wraps(log_func) + def wrapped_log_func(msg, *args): + if _logger is None: + init_logger() + _logger.warning( + "Logger has already been automatically initialized as `log_file` is " + "set to None by default, information will only be printed to terminal " + "without writting to any file." + ) + + log_func(msg, *args) + + return wrapped_log_func + + +@ensure_logger +@misc.run_at_rank0 +def info(msg, *args): + _logger.info(msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def message(msg, *args): + _logger.log(_MESSAGE_LEVEL, msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def debug(msg, *args): + _logger.debug(msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def warning(msg, *args): + _logger.warning(msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def error(msg, *args): + _logger.error(msg, *args) + + +def scalar( + metric_dict: Dict[str, float], + step: int, + vdl_writer: Optional["visualdl.LogWriter"] = None, + wandb_writer: Optional["wandb.run"] = None, + tbd_writer: Optional["tbd.SummaryWriter"] = None, +): + """This function will add scalar data to VisualDL or WandB for plotting curve(s). + + Args: + metric_dict (Dict[str, float]): Metrics dict with metric name and value. + step (int): The step of the metric. + vdl_writer (Optional[visualdl.LogWriter]): VisualDL writer to record metrics. + Defaults to None. + wandb_writer (Optional[wandb.run]): Run object of WandB to record metrics. + Defaults to None. + tbd_writer (Optional[tbd.SummaryWriter]): Run object of WandB to record metrics. + Defaults to None. + """ + if vdl_writer is not None: + with misc.RankZeroOnly() as is_master: + if is_master: + for name, value in metric_dict.items(): + vdl_writer.add_scalar(name, value, step) + + if wandb_writer is not None: + with misc.RankZeroOnly() as is_master: + if is_master: + wandb_writer.log({"step": step, **metric_dict}) + + if tbd_writer is not None: + with misc.RankZeroOnly() as is_master: + if is_master: + for name, value in metric_dict.items(): + tbd_writer.add_scalar(name, value, global_step=step) + + +def advertise(): + """ + Show the advertising message like the following: + + =========================================================== + == PaddleScience is powered by PaddlePaddle ! == + =========================================================== + == == + == For more info please go to the following website. == + == == + == https://github.com/PaddlePaddle/PaddleScience == + =========================================================== + """ + + _copyright = "PaddleScience is powered by PaddlePaddle !" + ad = "Please refer to the following website for more info." + website = "https://github.com/PaddlePaddle/PaddleScience" + AD_LEN = 6 + len(max([_copyright, ad, website], key=len)) + + info( + "\n{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n".format( + "=" * (AD_LEN + 4), + "=={}==".format(_copyright.center(AD_LEN)), + "=" * (AD_LEN + 4), + "=={}==".format(" " * AD_LEN), + "=={}==".format(ad.center(AD_LEN)), + "=={}==".format(" " * AD_LEN), + "=={}==".format(website.center(AD_LEN)), + "=" * (AD_LEN + 4), + ) + ) diff --git a/jointContribution/mattergen/mattergen/utils/misc.py b/jointContribution/mattergen/mattergen/utils/misc.py new file mode 100644 index 00000000..1e55dc81 --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/misc.py @@ -0,0 +1,530 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import collections +import functools +import random +import time +from contextlib import ContextDecorator +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional +from typing import Sequence +from typing import Tuple +from typing import Union + +import numpy as np +import paddle +from paddle import distributed as dist + +from mattergen.utils import logger + +__all__ = [ + "AverageMeter", + "PrettyOrderedDict", + "Prettydefaultdict", + "RankZeroOnly", + "Timer", + "all_gather", + "concat_dict_list", + "convert_to_array", + "convert_to_dict", + "stack_dict_list", + "cartesian_product", + "combine_array_with_time", + "set_random_seed", + "run_on_eval_mode", + "run_at_rank0", +] + + +class AverageMeter: + """ + Computes and stores the average and current value + Code was based on https://github.com/pytorch/examples/blob/master/imagenet/main.py + """ + + def __init__(self, name="", fmt="f", postfix="", need_avg=True): + self.name = name + self.fmt = fmt + self.postfix = postfix + self.need_avg = need_avg + self.reset() + + def reset(self): + """Reset.""" + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + self.history = [] + + def update(self, val, n=1): + """Update.""" + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + self.history.append(val) + + @property + def avg_info(self): + if isinstance(self.avg, paddle.Tensor): + self.avg = float(self.avg) + return f"{self.name}: {self.avg:.5f}" + + @property + def total(self): + return f"{self.name}_sum: {self.sum:{self.fmt}}{self.postfix}" + + @property + def total_minute(self): + return f"{self.name} {self.sum / 60:{self.fmt}}{self.postfix} min" + + @property + def mean(self): + return ( + f"{self.name}: {self.avg:{self.fmt}}{self.postfix}" if self.need_avg else "" + ) + + @property + def value(self): + return f"{self.name}: {self.val:{self.fmt}}{self.postfix}" + + +class PrettyOrderedDict(collections.OrderedDict): + """ + The ordered dict which can be prettily printed. + + Examples: + >>> import ppsci + >>> dic = ppsci.utils.misc.PrettyOrderedDict() + >>> dic.update({'a':1, 'b':2, 'c':3}) + >>> print(dic) + ('a', 1)('b', 2)('c', 3) + """ + + def __str__(self): + return "".join([str((k, v)) for k, v in self.items()]) + + +class Prettydefaultdict(collections.defaultdict): + """ + The default dict which can be prettily printed. + + Examples: + >>> import ppsci + >>> dic = ppsci.utils.misc.Prettydefaultdict() + >>> dic.update({'a':1, 'b':2, 'c':3}) + >>> print(dic) + ('a', 1)('b', 2)('c', 3) + """ + + def __str__(self): + return "".join([str((k, v)) for k, v in self.items()]) + + +class RankZeroOnly: + """ + A context manager that ensures the code inside it is only executed by the process + with rank zero. All rank will be synchronized by `dist.barrier` in + distributed environment. + + NOTE: Always used for time consuming code blocks, such as initialization of log + writer, saving result to disk, etc. + + Args: + rank (Optional[int]): The rank of the current process. If not provided, + it will be obtained from `dist.get_rank()`. + + Examples: + >>> import paddle.distributed as dist + >>> with RankZeroOnly(dist.get_rank()) as is_master: + ... if is_master: + ... # code here which should only be executed in the master process + ... pass + """ + + def __init__(self, rank: Optional[int] = None): + """ + Enter the context and check if the current process is the master. + + Args: + rank (Optional[int]): The rank of the current process. If not provided, + it will be obtained from `dist.get_rank()`. + """ + super().__init__() + self.rank = rank if (rank is not None) else dist.get_rank() + self.is_master = self.rank == 0 + + def __enter__(self) -> bool: + """ + Enter the context and check if the current process is the master. + + Returns: + bool: True if the current process is the master (rank zero), + False otherwise. + """ + return self.is_master + + def __exit__(self, exc_type, exc_value, traceback): + if dist.get_world_size() > 1: + dist.barrier() + + +class Timer(ContextDecorator): + """Count time cost for code block within context. + + Args: + name (str, optional): Name of timer discriminate different code block. + Defaults to "Timer". + auto_print (bool, optional): Whether print time cost when exit context. + Defaults to True. + """ + + interval: float # Time cost for code within Timer context + + def __init__(self, name: str = "Timer", auto_print: bool = True): + super().__init__() + self.name = name + self.auto_print = auto_print + + def __enter__(self): + paddle.device.synchronize() + self.start_time = time.perf_counter() + return self + + def __exit__(self, type, value, traceback): + paddle.device.synchronize() + self.end_time = time.perf_counter() + self.interval = self.end_time - self.start_time + if self.auto_print: + logger.message(f"{self.name}.time_cost = {self.interval:.2f} s") + + def start(self, name: str = "Timer"): + """Push a new timer context. + + Args: + name (str, optional): Name of code block to be clocked. Defaults to "Timer". + """ + paddle.device.synchronize() + self.start_time = time.perf_counter() + + def end(self): + """End current timer context and print time cost.""" + paddle.device.synchronize() + self.end_time = time.perf_counter() + self.interval = self.end_time - self.start_time + if self.auto_print: + logger.message(f"{self.name}.time_cost = {self.interval:.2f} s") + + +def convert_to_dict(array: np.ndarray, keys: Tuple[str, ...]) -> Dict[str, np.ndarray]: + """Split given array into single channel array at axis -1 in order of given keys. + + Args: + array (np.ndarray): Array to be split. + keys (Tuple[str, ...]): Keys used in split. + + Returns: + Dict[str, np.ndarray]: Split dict. + + Examples: + >>> import numpy as np + >>> import ppsci + >>> arr = np.array([[1., 2., 3.], [4., 5., 6.]]) + >>> result = ppsci.utils.misc.convert_to_dict(arr, ("x", "y", "z")) + >>> print(arr.shape) + (2, 3) + >>> for k, v in result.items(): + ... print(k, v.shape) + x (2, 1) + y (2, 1) + z (2, 1) + """ + if array.shape[-1] != len(keys): + raise ValueError( + f"dim of array({array.shape[-1]}) must equal to " f"len(keys)({len(keys)})" + ) + + split_array = np.split(array, len(keys), axis=-1) + return {key: split_array[i] for i, key in enumerate(keys)} + + +def all_gather( + tensor: paddle.Tensor, concat: bool = True, axis: int = 0 +) -> Union[paddle.Tensor, List[paddle.Tensor]]: + """Gather tensor from all devices, concatenate them along given axis if specified. + + Args: + tensor (paddle.Tensor): Tensor to be gathered from all GPUs. + concat (bool, optional): Whether to concatenate gathered Tensors. + Defaults to True. + axis (int, optional): Axis which concatenated along. Defaults to 0. + + Returns: + Union[paddle.Tensor, List[paddle.Tensor]]: Gathered Tensors. + + Examples: + >>> import paddle + >>> import ppsci + >>> import paddle.distributed as dist + >>> dist.init_parallel_env() # doctest: +SKIP + >>> if dist.get_rank() == 0: # doctest: +SKIP + ... data = paddle.to_tensor([[1, 2, 3], [4, 5, 6]]) + ... else: + ... data = paddle.to_tensor([[7, 8, 9], [10, 11, 12]]) + >>> result = ppsci.utils.misc.all_gather(data) # doctest: +SKIP + >>> print(result.numpy()) # doctest: +SKIP + [[ 1 2 3] + [ 4 5 6] + [ 7 8 9] + [10 11 12]] + """ + result: List[paddle.Tensor] = [] + + # NOTE: Put tensor to CUDAPlace from CUDAPinnedPlace to use communication. + if tensor.place.is_cuda_pinned_place(): + tensor = tensor.cuda() + + # TODO(HydrogenSulfate): As non-contiguous(strided) tensor is not supported in + # dist.all_gather, manually convert given Tensor to contiguous below. Strided tensor + # will be supported in future. + dist.all_gather(result, tensor.contiguous()) + + if concat: + return paddle.concat(result, axis) + return result + + +def convert_to_array(dict_: Dict[str, np.ndarray], keys: Tuple[str, ...]) -> np.ndarray: + """Concatenate arrays in axis -1 in order of given keys. + + Args: + dict_ (Dict[str, np.ndarray]): Dict contains arrays. + keys (Tuple[str, ...]): Concatenate keys used in concatenation. + + Returns: + np.ndarray: Concatenated array. + + Examples: + >>> import numpy as np + >>> import ppsci + >>> dic = {"x": np.array([[1., 2.], [3., 4.]]), + ... "y": np.array([[5., 6.], [7., 8.]]), + ... "z": np.array([[9., 10.], [11., 12.]])} + >>> result = ppsci.utils.misc.convert_to_array(dic, ("x", "z")) + >>> print(result) + [[ 1. 2. 9. 10.] + [ 3. 4. 11. 12.]] + """ + return np.concatenate([dict_[key] for key in keys], axis=-1) + + +def concat_dict_list( + dict_list: Sequence[Dict[str, np.ndarray]] +) -> Dict[str, np.ndarray]: + """Concatenate arrays in tuple of dicts at axis 0. + + Args: + dict_list (Sequence[Dict[str, np.ndarray]]): Sequence of dicts. + + Returns: + Dict[str, np.ndarray]: A dict with concatenated arrays for each key. + + """ + ret = {} + for key in dict_list[0].keys(): + ret[key] = np.concatenate([_dict[key] for _dict in dict_list], axis=0) + return ret + + +def stack_dict_list( + dict_list: Sequence[Dict[str, np.ndarray]] +) -> Dict[str, np.ndarray]: + """Stack arrays in tuple of dicts at axis 0. + + Args: + dict_list (Sequence[Dict[str, np.ndarray]]): Sequence of dicts. + + Returns: + Dict[str, np.ndarray]: A dict with stacked arrays for each key. + """ + ret = {} + for key in dict_list[0].keys(): + ret[key] = np.stack([_dict[key] for _dict in dict_list], axis=0) + return ret + + +def typename(obj: object) -> str: + """Return type name of given object. + + Args: + obj (object): Python object which is instantiated from a class. + + Returns: + str: Class name of given object. + """ + return obj.__class__.__name__ + + +def combine_array_with_time(x: np.ndarray, t: Tuple[int, ...]) -> np.ndarray: + """Combine given data x with time sequence t. + Given x with shape (N, D) and t with shape (T, ), + this function will repeat t_i for N times and will concat it with data x for each + t_i in t, finally return the stacked result, which is of shape (N×T, D+1). + + Args: + x (np.ndarray): Points data with shape (N, D). + t (Tuple[int, ...]): Time sequence with shape (T, ). + + Returns: + np.ndarray: Combined data with shape of (N×T, D+1). + + Examples: + >>> import numpy as np + >>> import ppsci + >>> data_point = np.arange(10).reshape((2, 5)) + >>> time = (1, 2, 3) + >>> result = ppsci.utils.misc.combine_array_with_time(data_point, time) + >>> print(result) + [[1. 0. 1. 2. 3. 4.] + [1. 5. 6. 7. 8. 9.] + [2. 0. 1. 2. 3. 4.] + [2. 5. 6. 7. 8. 9.] + [3. 0. 1. 2. 3. 4.] + [3. 5. 6. 7. 8. 9.]] + """ + nx = len(x) + tx = [] + for ti in t: + tx.append( + np.hstack( + (np.full([nx, 1], float(ti), dtype=paddle.get_default_dtype()), x) + ) + ) + tx = np.vstack(tx) + return tx + + +def cartesian_product(*arrays: np.ndarray) -> np.ndarray: + """Cartesian product for input sequence of array(s). + + Reference: https://stackoverflow.com/questions/11144513/cartesian-product-of-x-and-y-array-points-into-single-array-of-2d-points + + Assume shapes of input arrays are: $(N_1,), (N_2,), (N_3,), ..., (N_M,)$, + then the cartesian product result will be shape of $(N_1xN_2xN_3x...xN_M, M)$. + + Args: + arrays (np.ndarray): Input arrays. + + Returns: + np.ndarray: Cartesian product result of shape $(N_1xN_2xN_3x...xN_M, M)$. + + Examples: + >>> t = np.array([1, 2]) + >>> x = np.array([10, 20]) + >>> y = np.array([100, 200]) + >>> txy = cartesian_product(t, x, y) + >>> print(txy) + [[ 1 10 100] + [ 1 10 200] + [ 1 20 100] + [ 1 20 200] + [ 2 10 100] + [ 2 10 200] + [ 2 20 100] + [ 2 20 200]] + """ + la = len(arrays) + dtype = np.result_type(*arrays) + arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype) + for i, a in enumerate(np.ix_(*arrays)): + arr[..., i] = a + return arr.reshape(-1, la) + + +def set_random_seed(seed: int): + """Set numpy, random, paddle random_seed to given seed. + + Args: + seed (int): Random seed. + """ + paddle.seed(seed) + np.random.seed(seed) + random.seed(seed) + + +def run_on_eval_mode(func: Callable) -> Callable: + """A decorator automatically running given class method in eval mode and keep + training state unchanged after function finished. + + Args: + func (Callable): Class method which is expected running in eval mode. + + Returns: + Callable: Decorated class method. + """ + + @functools.wraps(func) + def function_with_eval_state(self, *args, **kwargs): + # log original state + train_state = self.model.training + + # switch to eval mode + if train_state: + self.model.eval() + + # run func in eval mode + result = func(self, *args, **kwargs) + + # restore state + if train_state: + self.model.train() + + return result + + return function_with_eval_state + + +def run_at_rank0(func: Callable) -> Callable: + """A decorator that allow given function run only at rank 0 to avoid + multiple logs or other events. Usually effected in distributed environment. + + Args: + func (Callable): Given function. + + Returns: + Callable: Wrapped function which will only run at at rank 0, + skipped at other rank. + + Examples: + >>> import paddle + >>> from ppsci.utils import misc + >>> @misc.run_at_rank0 + ... def func(): + ... print(f"now_rank is {paddle.distributed.get_rank()}") + >>> func() + now_rank is 0 + """ + + @functools.wraps(func) + def wrapped_func(*args, **kwargs): + if dist.get_rank() == 0: + return func(*args, **kwargs) + + return wrapped_func \ No newline at end of file diff --git a/jointContribution/mattergen/mattergen/utils/save_load.py b/jointContribution/mattergen/mattergen/utils/save_load.py new file mode 100644 index 00000000..8a2dc123 --- /dev/null +++ b/jointContribution/mattergen/mattergen/utils/save_load.py @@ -0,0 +1,196 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +from typing import TYPE_CHECKING +from typing import Any +from typing import Dict +from typing import Optional + +import paddle + +from mattergen.utils import download +from mattergen.utils import logger + +if TYPE_CHECKING: + from paddle import amp + from paddle import nn + from paddle import optimizer + + from mattergen.utils import ema + + +__all__ = [ + "load_checkpoint", + "save_checkpoint", + "load_pretrain", +] + + +def _load_pretrain_from_path(path: str, model: nn.Layer): + """Load pretrained model from given path. + + Args: + path (str): File path of pretrained model, i.e. `/path/to/model.pdparams`. + model (nn.Layer): Model with parameters. + """ + if not (os.path.isdir(path) or os.path.exists(f"{path}.pdparams")): + raise FileNotFoundError( + f"Pretrained model path {path}.pdparams does not exists." + ) + param_state_dict = paddle.load(f"{path}.pdparams") + if 'state_dict' in param_state_dict: + param_state_dict = param_state_dict['state_dict'] + logger.message("The loaded parameter dictionary contains key 'state_dict', which will be used") + model.set_state_dict(param_state_dict) + logger.message(f"Finish loading pretrained model from: {path}.pdparams") + + +def load_pretrain(model: nn.Layer, path: str): + """ + Load pretrained model from given path or url. + + Args: + model (nn.Layer): Model with parameters. + path (str): File path or url of pretrained model, i.e. `/path/to/model.pdparams` + or `http://xxx.com/model.pdparams`. + + Examples: + >>> import ppsci + >>> from ppsci.utils import save_load + >>> model = ppsci.arch.MLP(("x", "y"), ("u", "v", "p"), 9, 50, "tanh") + >>> save_load.load_pretrain( + ... model=model, + ... path="path/to/pretrain_model") # doctest: +SKIP + """ + if path.startswith("http"): + # download from path(url) and get its' physical path + path = download.get_weights_path_from_url(path) + + # remove ".pdparams" in suffix of path for convenient + if path.endswith(".pdparams"): + path = path[:-9] + _load_pretrain_from_path(path, model) + + +def load_checkpoint( + path: str, + model: nn.Layer, + optimizer: optimizer.Optimizer, + grad_scaler: Optional[amp.GradScaler] = None, +) -> Dict[str, Any]: + """Load from checkpoint. + + Args: + path (str): Path for checkpoint. + model (nn.Layer): Model with parameters. + optimizer (optimizer.Optimizer): Optimizer for model. + grad_scaler (Optional[amp.GradScaler]): GradScaler for AMP. Defaults to None. + ema_model: Optional[ema.AveragedModel]: Average model. Defaults to None. + + Returns: + Dict[str, Any]: Loaded metric information. + """ + if not os.path.exists(f"{path}.pdparams"): + raise FileNotFoundError(f"{path}.pdparams not exist.") + if not os.path.exists(f"{path}.pdopt"): + raise FileNotFoundError(f"{path}.pdopt not exist.") + if grad_scaler is not None and not os.path.exists(f"{path}.pdscaler"): + raise FileNotFoundError(f"{path}.scaler not exist.") + + # load state dict + param_dict = paddle.load(f"{path}.pdparams") + optim_dict = paddle.load(f"{path}.pdopt") + metric_dict = paddle.load(f"{path}.pdstates") + if grad_scaler is not None: + scaler_dict = paddle.load(f"{path}.pdscaler") + + # set state dict + missing_keys, unexpected_keys = model.set_state_dict(param_dict) + if missing_keys: + logger.warning( + f"There are missing keys when loading checkpoint: {missing_keys}, " + "and corresponding parameters will be initialized by default." + ) + if unexpected_keys: + logger.warning( + f"There are redundant keys: {unexpected_keys}, " + "and corresponding weights will be ignored." + ) + + optimizer.set_state_dict(optim_dict) + if grad_scaler is not None: + grad_scaler.load_state_dict(scaler_dict) + + logger.message(f"Finish loading checkpoint from {path}") + return metric_dict + + +def save_checkpoint( + model: nn.Layer, + optimizer: Optional[optimizer.Optimizer], + metric: Dict[str, float], + grad_scaler: Optional[amp.GradScaler] = None, + output_dir: Optional[str] = None, + prefix: str = "model", + print_log: bool = True, + ema_model: Optional[ema.AveragedModel] = None, +): + """ + Save checkpoint, including model params, optimizer params, metric information. + + Args: + model (nn.Layer): Model with parameters. + optimizer (Optional[optimizer.Optimizer]): Optimizer for model. + metric (Dict[str, float]): Metric information, such as + {"RMSE": 0.1, "MAE": 0.2}. + grad_scaler (Optional[amp.GradScaler]): GradScaler for AMP. Defaults to None. + output_dir (Optional[str]): Directory for checkpoint storage. + prefix (str, optional): Prefix for storage. Defaults to "model". + print_log (bool, optional): Whether print saving log information, mainly for + keeping log tidy without duplicate 'Finish saving checkpoint ...' + log strings. Defaults to True. + ema_model: Optional[ema.AveragedModel]: Average model. Defaults to None. + """ + if paddle.distributed.get_rank() != 0: + return + + if output_dir is None: + logger.warning("output_dir is None, skip save_checkpoint") + return + + ckpt_dir = os.path.join(output_dir, "checkpoints") + ckpt_path = os.path.join(ckpt_dir, prefix) + os.makedirs(ckpt_dir, exist_ok=True) + + paddle.save(model.state_dict(), f"{ckpt_path}.pdparams") + if optimizer: + paddle.save(optimizer.state_dict(), f"{ckpt_path}.pdopt") + paddle.save(metric, f"{ckpt_path}.pdstates") + if grad_scaler is not None: + paddle.save(grad_scaler.state_dict(), f"{ckpt_path}.pdscaler") + + if ema_model: + paddle.save(ema_model.state_dict(), f"{ckpt_path}_ema.pdparams") + + if print_log: + log_str = f"Finish saving checkpoint to: {ckpt_path}" + if prefix == "latest": + log_str += ( + "(latest checkpoint will be saved every epoch as expected, " + "but this log will be printed only once for tidy logging)" + ) + logger.message(log_str) diff --git a/jointContribution/mattergen/paddle_geometric/__init__.py b/jointContribution/mattergen/paddle_geometric/__init__.py new file mode 100644 index 00000000..1386dc50 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/__init__.py @@ -0,0 +1,58 @@ +from collections import defaultdict + +import paddle +import paddle_geometric.typing + +from ._compile import compile, is_compiling +from ._onnx import is_in_onnx_export +from .index import Index +from .edge_index import EdgeIndex +from .pytree import pytree +from .seed import seed_everything +from .home import get_home_dir, set_home_dir +from .device import is_mps_available, is_xpu_available, device +from .isinstance import is_paddle_instance +from .debug import is_debug_enabled, debug, set_debug + +import paddle_geometric.utils +import paddle_geometric.data +import paddle_geometric.sampler +import paddle_geometric.loader +import paddle_geometric.transforms +import paddle_geometric.datasets +import paddle_geometric.nn +import paddle_geometric.explain +import paddle_geometric.profile + +from .experimental import (is_experimental_mode_enabled, experimental_mode, + set_experimental_mode) +from .lazy_loader import LazyLoader + +contrib = LazyLoader('contrib', globals(), 'paddle_geometric.contrib') +graphgym = LazyLoader('graphgym', globals(), 'paddle_geometric.graphgym') + +__version__ = '2.7.0' + +__all__ = [ + 'Index', + 'EdgeIndex', + 'seed_everything', + 'get_home_dir', + 'set_home_dir', + 'compile', + 'is_compiling', + 'is_in_onnx_export', + 'is_mps_available', + 'is_xpu_available', + 'device', + 'is_paddle_instance', + 'is_debug_enabled', + 'debug', + 'set_debug', + 'is_experimental_mode_enabled', + 'experimental_mode', + 'set_experimental_mode', + 'paddle_geometric', + '__version__', +] + diff --git a/jointContribution/mattergen/paddle_geometric/_compile.py b/jointContribution/mattergen/paddle_geometric/_compile.py new file mode 100644 index 00000000..8594cdc4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/_compile.py @@ -0,0 +1,36 @@ +import warnings +from typing import Any, Callable, Optional, Union + +import paddle + +import paddle_geometric.typing + + +def is_compiling() -> bool: + r"""Returns :obj:`True` in case PaddlePaddle is compiling via + :meth:`paddle.jit.to_static`. + """ + return False # pragma: no cover + + +def compile( + model: Optional[paddle.nn.Layer] = None, + *args: Any, + **kwargs: Any, +) -> Union[paddle.nn.Layer, Callable[[paddle.nn.Layer], paddle.nn.Layer]]: + r"""Optimizes the given :pyg:`PyG` model/function via + :meth:`paddle.jit.to_static`. + This function has the same signature as :meth:`paddle.jit.to_static`. + + Args: + model: The model to compile. + *args: Additional arguments of :meth:`paddle.jit.to_static`. + **kwargs: Additional keyword arguments of :meth:`paddle.jit.to_static`. + + .. note:: + :meth:`paddle_geometric.compile` is deprecated in favor of + :meth:`paddle.jit.to_static`. + """ + warnings.warn("'paddle_geometric.compile' is deprecated in favor of " + "'paddle.jit.to_static'") + return paddle.jit.to_static(model, *args, **kwargs) diff --git a/jointContribution/mattergen/paddle_geometric/_onnx.py b/jointContribution/mattergen/paddle_geometric/_onnx.py new file mode 100644 index 00000000..e7ca7ac0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/_onnx.py @@ -0,0 +1,14 @@ +import paddle + +from paddle_geometric import is_compiling + + +def is_in_onnx_export() -> bool: + r"""Returns :obj:`True` in case PaddlePaddle is exporting to ONNX via + :meth:`paddle.onnx.export`. + """ + if is_compiling(): + return False + if paddle.jit.to_static: # Paddle 没有完全等价于 `torch.jit.is_scripting` 的函数,用 `to_static` 替代 + return False + return paddle.onnx.is_in_onnx_export() diff --git a/jointContribution/mattergen/paddle_geometric/backend.py b/jointContribution/mattergen/paddle_geometric/backend.py new file mode 100644 index 00000000..a382a6cc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/backend.py @@ -0,0 +1,55 @@ +from typing import Optional + +import paddle + +# If set to `True`, PyG is configured to use the `segment_matmul` and +# `grouped_matmul` kernels from `pyg-lib` to parallelize matrix multiplication +# across segments/groups of potentially varying size. +# If set to `None`, will automatically decide whether to utilize +# `segment_matmul` and `grouped_matmul` based on input sizes. +# Requires `pyg-lib` to be installed. +use_segment_matmul: Optional[bool] = None + +# Helper functions ############################################################ + + +def use_segment_matmul_heuristic( + num_segments: int, + max_segment_size: int, + in_channels: int, + out_channels: int, +) -> bool: + r"""A heuristic based on input sizes to determine whether the usage of + :meth:`segment_matmul` can speed up computation. + """ + # NOTE This heuristic was learned on an A100 via sklearn using a simple + # StandardScaler() -> LinearSVC() model. + # For now, it is only used in combination with `RGCNConv`. + x = paddle.to_tensor([ + num_segments, + max_segment_size, + in_channels, + out_channels, + ], dtype="float32") + mean = paddle.to_tensor([ + 125.11603189, + 12133.21523472, + 163.81222321, + 32.43755536, + ], dtype="float32") + std = paddle.to_tensor([ + 163.34480422, + 27572.94543809, + 177.6426489, + 56.82103934, + ], dtype="float32") + weight = paddle.to_tensor([ + 2.43877659e+00, + 1.67583047e+00, + -5.20527282e-04, + 3.43925501e-01, + ], dtype="float32") + bias = 1.20236999 + + x = (x - mean) / std + return bool(paddle.matmul(x, weight) >= bias) diff --git a/jointContribution/mattergen/paddle_geometric/config_mixin.py b/jointContribution/mattergen/paddle_geometric/config_mixin.py new file mode 100644 index 00000000..a4e29c80 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/config_mixin.py @@ -0,0 +1,113 @@ +import inspect +from dataclasses import fields, is_dataclass +from importlib import import_module +from typing import Any, Dict + +from paddle_geometric.config_store import ( + class_from_dataclass, + dataclass_from_class, +) +from paddle_geometric.isinstance import is_paddle_instance + + +class ConfigMixin: + r"""Enables a class to serialize/deserialize itself to a dataclass.""" + def config(self) -> Any: + r"""Creates a serializable configuration of the class.""" + data_cls = dataclass_from_class(self.__class__) + if data_cls is None: + raise ValueError(f"Could not find the configuration class that " + f"belongs to '{self.__class__.__name__}'. Please " + f"register it in the configuration store.") + + kwargs: Dict[str, Any] = {} + for field in fields(data_cls): + if not hasattr(self, field.name): + continue + kwargs[field.name] = _recursive_config(getattr(self, field.name)) + return data_cls(**kwargs) + + @classmethod + def from_config(cls, cfg: Any, *args: Any, **kwargs: Any) -> Any: + r"""Instantiates the class from a serializable configuration.""" + if getattr(cfg, '_target_', None): + cls = _locate_cls(cfg._target_) + elif isinstance(cfg, dict) and '_target_' in cfg: + cls = _locate_cls(cfg['_target_']) + + data_cls = cfg.__class__ + if not is_dataclass(data_cls): + data_cls = dataclass_from_class(cls) + if data_cls is None: + raise ValueError(f"Could not find the configuration class " + f"that belongs to '{cls.__name__}'. Please " + f"register it in the configuration store.") + + field_names = {field.name for field in fields(data_cls)} + if isinstance(cfg, dict): + _kwargs = {k: v for k, v in cfg.items() if k in field_names} + cfg = data_cls(**_kwargs) + assert is_dataclass(cfg) + + if len(args) > 0: # Convert `*args` to `**kwargs`: + param_names = list(inspect.signature(cls).parameters.keys()) + if 'args' in param_names: + param_names.remove('args') + if 'kwargs' in param_names: + param_names.remove('kwargs') + + for name, arg in zip(param_names, args): + kwargs[name] = arg + + for key in field_names: + if key not in kwargs and key != '_target_': + kwargs[key] = _recursive_from_config(getattr(cfg, key)) + + return cls(**kwargs) + + +def _recursive_config(value: Any) -> Any: + if isinstance(value, ConfigMixin): + return value.config() + if is_paddle_instance(value, ConfigMixin): + return value.config() + if isinstance(value, (tuple, list)): + return [_recursive_config(v) for v in value] + if isinstance(value, dict): + return {k: _recursive_config(v) for k, v in value.items()} + return value + + +def _recursive_from_config(value: Any) -> Any: + cls: Any = None + if is_dataclass(value): + if getattr(value, '_target_', None): + try: + cls = _locate_cls(value._target_) # type: ignore + except ImportError: + pass # Keep the dataclass as it is. + else: + cls = class_from_dataclass(value.__class__) + elif isinstance(value, dict) and '_target_' in value: + cls = _locate_cls(value['_target_']) + + if cls is not None and issubclass(cls, ConfigMixin): + return cls.from_config(value) + if isinstance(value, (tuple, list)): + return [_recursive_from_config(v) for v in value] + if isinstance(value, dict): + return {k: _recursive_from_config(v) for k, v in value.items()} + return value + + +def _locate_cls(qualname: str) -> Any: + parts = qualname.split('.') + + if len(parts) <= 1: + raise ValueError(f"Qualified name is missing a dot (got '{qualname}')") + + if any([len(part) == 0 for part in parts]): + raise ValueError(f"Relative imports not supported (got '{qualname}')") + + module_name, cls_name = '.'.join(parts[:-1]), parts[-1] + return getattr(import_module(module_name), cls_name) diff --git a/jointContribution/mattergen/paddle_geometric/config_store.py b/jointContribution/mattergen/paddle_geometric/config_store.py new file mode 100644 index 00000000..0513b3f6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/config_store.py @@ -0,0 +1,364 @@ +import copy +import inspect +import typing +from collections import defaultdict +from dataclasses import dataclass, field, make_dataclass +from typing import Any, Callable, Dict, List, Optional, Tuple, Union + +import paddle + +EXCLUDE = {'self', 'args', 'kwargs'} + +MAPPING = { + paddle.nn.Layer: Any, + paddle.Tensor: Any, +} + +try: + from omegaconf import MISSING +except Exception: + MISSING = '???' + +try: + import hydra # noqa + WITH_HYDRA = True +except Exception: + WITH_HYDRA = False + +if not typing.TYPE_CHECKING and WITH_HYDRA: + from hydra.core.config_store import ConfigStore + + def get_node(cls: Union[str, Any]) -> Optional[Any]: + if (not isinstance(cls, str) + and cls.__module__ in {'builtins', 'typing'}): + return None + + def _get_candidates(repo: Dict[str, Any]) -> List[Any]: + outs: List[Any] = [] + for key, value in repo.items(): + if isinstance(value, dict): + outs.extend(_get_candidates(value)) + elif getattr(value.node._metadata, 'object_type', None) == cls: + outs.append(value.node) + elif getattr(value.node._metadata, 'orig_type', None) == cls: + outs.append(value.node) + elif isinstance(cls, str) and key == f'{cls}.yaml': + outs.append(value.node) + + return outs + + candidates = _get_candidates(get_config_store().repo) + + if len(candidates) > 1: + raise ValueError(f"Found multiple entries in the configuration " + f"store for the same node '{candidates[0].name}'") + + return candidates[0] if len(candidates) == 1 else None + + def dataclass_from_class(cls: Union[str, Any]) -> Optional[Any]: + node = get_node(cls) + return node._metadata.object_type if node is not None else None + + def class_from_dataclass(cls: Union[str, Any]) -> Optional[Any]: + node = get_node(cls) + return node._metadata.orig_type if node is not None else None + +else: + + class Singleton(type): + _instances: Dict[type, Any] = {} + + def __call__(cls, *args: Any, **kwargs: Any) -> Any: + if cls not in cls._instances: + instance = super().__call__(*args, **kwargs) + cls._instances[cls] = instance + return instance + return cls._instances[cls] + + @dataclass + class Metadata: + orig_type: Optional[Any] = None + + @dataclass + class ConfigNode: + name: str + node: Any + group: Optional[str] = None + _metadata: Metadata = field(default_factory=Metadata) + + class ConfigStore(metaclass=Singleton): + def __init__(self) -> None: + self.repo: Dict[str, Any] = defaultdict(dict) + + @classmethod + def instance(cls, *args: Any, **kwargs: Any) -> 'ConfigStore': + return cls(*args, **kwargs) + + def store( + self, + name: str, + node: Any, + group: Optional[str] = None, + orig_type: Optional[Any] = None, + ) -> None: + cur = self.repo + if group is not None: + cur = cur[group] + if name in cur: + raise KeyError(f"Configuration '{name}' already registered. " + f"Please store it under a different group.") + metadata = Metadata(orig_type=orig_type) + cur[name] = ConfigNode(name, node, group, metadata) + + def get_node(cls: Union[str, Any]) -> Optional[ConfigNode]: + if (not isinstance(cls, str) + and cls.__module__ in {'builtins', 'typing'}): + return None + + def _get_candidates(repo: Dict[str, Any]) -> List[ConfigNode]: + outs: List[ConfigNode] = [] + for key, value in repo.items(): + if isinstance(value, dict): + outs.extend(_get_candidates(value)) + elif value.node == cls: + outs.append(value) + elif value._metadata.orig_type == cls: + outs.append(value) + elif isinstance(cls, str) and key == cls: + outs.append(value) + + return outs + + candidates = _get_candidates(get_config_store().repo) + + if len(candidates) > 1: + raise ValueError(f"Found multiple entries in the configuration " + f"store for the same node '{candidates[0].name}'") + + return candidates[0] if len(candidates) == 1 else None + + def dataclass_from_class(cls: Union[str, Any]) -> Optional[Any]: + node = get_node(cls) + return node.node if node is not None else None + + def class_from_dataclass(cls: Union[str, Any]) -> Optional[Any]: + node = get_node(cls) + return node._metadata.orig_type if node is not None else None + + +def map_annotation( + annotation: Any, + mapping: Optional[Dict[Any, Any]] = None, +) -> Any: + origin = getattr(annotation, '__origin__', None) + args: Tuple[Any, ...] = getattr(annotation, '__args__', tuple()) + if origin in {Union, list, dict, tuple}: + assert origin is not None + args = tuple(map_annotation(a, mapping) for a in args) + if type(annotation).__name__ == 'GenericAlias': + annotation = origin[args] + else: + annotation = copy.copy(annotation) + annotation.__args__ = args + + return annotation + + if mapping is not None and annotation in mapping: + return mapping[annotation] + + out = dataclass_from_class(annotation) + if out is not None: + return out + + return annotation + + +def to_dataclass( + cls: Any, + base_cls: Optional[Any] = None, + with_target: Optional[bool] = None, + map_args: Optional[Dict[str, Tuple]] = None, + exclude_args: Optional[List[str]] = None, + strict: bool = False, +) -> Any: + fields = [] + + params = inspect.signature(cls.__init__).parameters + + if strict: + keys = set() if map_args is None else set(map_args.keys()) + if exclude_args is not None: + keys |= {arg for arg in exclude_args if isinstance(arg, str)} + diff = keys - set(params.keys()) + if len(diff) > 0: + raise ValueError(f"Expected input argument(s) {diff} in " + f"'{cls.__name__}'") + + for i, (name, arg) in enumerate(params.items()): + if name in EXCLUDE: + continue + if exclude_args is not None: + if name in exclude_args or i in exclude_args: + continue + if base_cls is not None: + if name in base_cls.__dataclass_fields__: + continue + + if map_args is not None and name in map_args: + fields.append((name, ) + map_args[name]) + continue + + annotation, default = arg.annotation, arg.default + annotation = map_annotation(annotation, mapping=MAPPING) + + if annotation != inspect.Parameter.empty: + origin = getattr(annotation, '__origin__', None) + args = getattr(annotation, '__args__', []) + if origin == Union and type(None) in args and len(args) > 2: + annotation = Optional[Any] + elif origin == Union and type(None) not in args: + annotation = Any + elif origin == list: + if getattr(args[0], '__origin__', None) == Union: + annotation = List[Any] + elif origin == dict: + if getattr(args[1], '__origin__', None) == Union: + annotation = Dict[args[0], Any] + else: + annotation = Any + + if str(default) == "": + default = field(default=MISSING) + elif default != inspect.Parameter.empty: + if isinstance(default, (list, dict)): + def wrapper(default: Any) -> Callable[[], Any]: + return lambda: default + + default = field(default_factory=wrapper(default)) + else: + default = field(default=MISSING) + + fields.append((name, annotation, default)) + + with_target = base_cls is not None if with_target is None else with_target + if with_target: + full_cls_name = f'{cls.__module__}.{cls.__qualname__}' + fields.append(('_target_', str, field(default=full_cls_name))) + + return make_dataclass(cls.__qualname__, fields=fields, + bases=() if base_cls is None else (base_cls, )) + + +def get_config_store() -> ConfigStore: + return ConfigStore.instance() + + +def clear_config_store() -> ConfigStore: + config_store = get_config_store() + for key in list(config_store.repo.keys()): + if key != 'hydra' and not key.endswith('.yaml'): + del config_store.repo[key] + return config_store + + +def register( + cls: Optional[Any] = None, + data_cls: Optional[Any] = None, + group: Optional[str] = None, + **kwargs: Any, +) -> Union[Any, Callable]: + if cls is not None: + name = cls.__name__ + + if get_node(cls): + raise ValueError(f"The class '{name}' is already registered in " + "the global configuration store") + + if data_cls is None: + data_cls = to_dataclass(cls, **kwargs) + elif get_node(data_cls): + raise ValueError( + f"The data class '{data_cls.__name__}' is already registered " + f"in the global configuration store") + + if not typing.TYPE_CHECKING and WITH_HYDRA: + get_config_store().store(name, data_cls, group) + get_node(name)._metadata.orig_type = cls + else: + get_config_store().store(name, data_cls, group, cls) + + return data_cls + + def bounded_register(cls: Any) -> Any: + register(cls=cls, data_cls=data_cls, group=group, **kwargs) + return cls + + return bounded_register + + +@dataclass +class Transform: + pass + + +@dataclass +class Dataset: + pass + + +@dataclass +class Model: + pass + + +@dataclass +class Optimizer: + pass + + +@dataclass +class LRScheduler: + pass + + +@dataclass +class Config: + dataset: Dataset = MISSING + model: Model = MISSING + optim: Optimizer = MISSING + lr_scheduler: Optional[LRScheduler] = None + + +def fill_config_store() -> None: + config_store = get_config_store() + + # Example of PaddlePaddle transform registration: + # Replace this with paddle transforms as needed. + # Example: + # config_store.store('NormalizeFeatures', group='transform', node=Transform()) + + # Example of registering Paddle datasets: + # Replace this with paddle dataset registrations as needed. + # config_store.store('CIFAR10', group='dataset', node=Dataset()) + + # Example of registering Paddle models: + # Replace this with paddle model registrations as needed. + # config_store.store('ResNet50', group='model', node=Model()) + + # Example of registering Paddle optimizers: + for optimizer_name in dir(paddle.optimizer): + if not optimizer_name.startswith('_'): + cls = getattr(paddle.optimizer, optimizer_name) + if inspect.isclass(cls): + data_cls = to_dataclass(cls, base_cls=Optimizer, exclude_args=['parameters']) + config_store.store(optimizer_name, group='optimizer', node=data_cls) + + # Example of registering Paddle learning rate schedulers: + for scheduler_name in dir(paddle.optimizer.lr): + if not scheduler_name.startswith('_'): + cls = getattr(paddle.optimizer.lr, scheduler_name) + if inspect.isclass(cls): + data_cls = to_dataclass(cls, base_cls=LRScheduler) + config_store.store(scheduler_name, group='lr_scheduler', node=data_cls) + + config_store.store('config', node=Config) diff --git a/jointContribution/mattergen/paddle_geometric/contrib/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/__init__.py new file mode 100644 index 00000000..cd853ce5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/__init__.py @@ -0,0 +1,12 @@ +import warnings + +import paddle_geometric.contrib.transforms # noqa +import paddle_geometric.contrib.datasets # noqa +import paddle_geometric.contrib.nn # noqa +import paddle_geometric.contrib.explain # noqa + +warnings.warn( + "'paddle_geometric.contrib' contains experimental code and is subject to " + "change. Please use with caution.") + +__all__ = [] diff --git a/jointContribution/mattergen/paddle_geometric/contrib/datasets/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/datasets/__init__.py new file mode 100644 index 00000000..8be6c17e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/datasets/__init__.py @@ -0,0 +1 @@ +__all__ = classes = [] diff --git a/jointContribution/mattergen/paddle_geometric/contrib/explain/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/explain/__init__.py new file mode 100644 index 00000000..f72bb99b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/explain/__init__.py @@ -0,0 +1,13 @@ +from paddle_geometric.deprecation import deprecated + +from .pgm_explainer import PGMExplainer +from paddle_geometric.explain.algorithm.graphmask_explainer import ( + GraphMaskExplainer as NewGraphMaskExplainer) + +GraphMaskExplainer = deprecated( + "use 'paddle_geometric.explain.algorithm.GraphMaskExplainer' instead", )( + NewGraphMaskExplainer) + +__all__ = classes = [ + 'PGMExplainer', +] diff --git a/jointContribution/mattergen/paddle_geometric/contrib/explain/pgm_explainer.py b/jointContribution/mattergen/paddle_geometric/contrib/explain/pgm_explainer.py new file mode 100644 index 00000000..4f2a51f2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/explain/pgm_explainer.py @@ -0,0 +1,436 @@ +import logging +from typing import List, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.explain import ExplainerAlgorithm +from paddle_geometric.explain.config import ModelMode, ModelTaskLevel +from paddle_geometric.explain.explanation import Explanation +from paddle_geometric.utils import k_hop_subgraph +from paddle_geometric.utils._subgraph import get_num_hops + + +class PGMExplainer(ExplainerAlgorithm): + r"""The PGMExplainer model from the `"PGMExplainer: Probabilistic + Graphical Model Explanations for Graph Neural Networks" + `_ paper. + + The generated :class:`~paddle_geometric.explain.Explanation` provides a + :obj:`node_mask` and a :obj:`pgm_stats` tensor, which stores the + :math:`p`-values of each node as calculated by the Chi-squared test. + + Args: + feature_index (List): The indices of the perturbed features. If set + to :obj:`None`, all features are perturbed. (default: :obj:`None`) + perturb_mode (str, optional): The method to generate the variations in + features. One of :obj:`"randint"`, :obj:`"mean"`, :obj:`"zero"`, + :obj:`"max"` or :obj:`"uniform"`. (default: :obj:`"randint"`) + perturbations_is_positive_only (bool, optional): If set to :obj:`True`, + restrict perturbed values to be positive. (default: :obj:`False`) + is_perturbation_scaled (bool, optional): If set to :obj:`True`, will + normalize the range of the perturbed features. + (default: :obj:`False`) + num_samples (int, optional): The number of samples of perturbations + used to test the significance of nodes to the prediction. + (default: :obj:`100`) + max_subgraph_size (int, optional): The maximum number of neighbors to + consider for the explanation. (default: :obj:`None`) + significance_threshold (float, optional): The statistical threshold + (:math:`p`-value) for which a node is considered to have an effect + on the prediction. (default: :obj:`0.05`) + pred_threshold (float, optional): The buffer value (in range + :obj:`[0, 1]`) to consider the output from a perturbed data to be + different from the original. (default: :obj:`0.1`) + """ + def __init__( + self, + feature_index: Optional[List] = None, + perturbation_mode: str = "randint", + perturbations_is_positive_only: bool = False, + is_perturbation_scaled: bool = False, + num_samples: int = 100, + max_subgraph_size: Optional[int] = None, + significance_threshold: float = 0.05, + pred_threshold: float = 0.1, + ): + super().__init__() + self.feature_index = feature_index + self.perturbation_mode = perturbation_mode + self.perturbations_is_positive_only = perturbations_is_positive_only + self.is_perturbation_scaled = is_perturbation_scaled + self.num_samples = num_samples + self.max_subgraph_size = max_subgraph_size + self.significance_threshold = significance_threshold + self.pred_threshold = pred_threshold + + def _perturb_features_on_nodes( + self, + x: Tensor, + index: Tensor, + ) -> Tensor: + r"""Perturbs feature matrix :obj:`x`. + + Args: + x (paddle.to_tensor): The feature matrix. + index (paddle.to_tensor): The indices of nodes to perturb. + """ + x_perturb = x.detach().clone() + perturb_array = x_perturb[index] + epsilon = 0.05 * paddle.max(x, axis=0) + + if self.perturbation_mode == "randint": + perturb_array = paddle.randint(high=2, shape=perturb_array.shape) + elif self.perturbation_mode == "mean": + perturb_array[:, self.feature_index] = paddle.mean( + x[:, self.feature_index]) + elif self.perturbation_mode == "zero": + perturb_array[:, self.feature_index] = 0 + elif self.perturbation_mode == "max": + perturb_array[:, self.feature_index] = paddle.max( + x[:, self.feature_index]) + elif self.perturbation_mode == "uniform": + random_perturbations = paddle.rand( + perturb_array.shape) * 2 * epsilon - epsilon + perturb_array[:, self.feature_index] = perturb_array[ + self.feature_index] + random_perturbations + perturb_array.clamp(min=0, max=paddle.max(x, axis=0)) + + if self.is_perturbation_scaled: + perturb_array = paddle.multiply( + perturb_array, paddle.rand(shape=perturb_array.shape)) * 2 + + x_perturb[index] = perturb_array.astype(x_perturb.dtype) + + return x_perturb + + def _batch_perturb_features_on_node( + self, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + indices_to_perturb: np.array, + percentage: float = 50., # % time node gets perturbed + **kwargs, + ) -> Tensor: + r"""Perturbs the node features of a batch of graphs for graph + classification tasks. + + Args: + model (paddle.nn.Layer: The GNN model. + x (paddle.to_tensor): The node feature matrix + edge_index (paddle.to_tensor): The edge indices. + indices_to_perturb (np.array): The indices of nodes to perturb. + percentage (float, optional): The percentage of times a node gets + perturbed. (default: :obj:`50.`) + **kwargs (optional): Additional arguments passed to + :meth:`model.forward`. + """ + pred_paddle = model(x, edge_index, **kwargs) + soft_pred = paddle.nn.functional.softmax(pred_paddle, axis=1) + pred_label = paddle.argmax(soft_pred, axis=1) + num_nodes = x.shape[0] + + samples = [] + for _ in range(self.num_samples): + x_perturb = x.detach().clone() + + seeds = np.random.randint(0, 100, size=len(indices_to_perturb)) + perturbed_node_indexes = indices_to_perturb[(seeds < percentage)] + x_perturb = self._perturb_features_on_nodes( + x=x_perturb, + index=perturbed_node_indexes, + ) + sample = np.zeros(num_nodes + 1) + sample[perturbed_node_indexes] = 1 + + pred_perturb_paddle = model(x_perturb, edge_index, **kwargs) + soft_pred_perturb = paddle.nn.functional.softmax(pred_perturb_paddle, + axis=1).squeeze() + + pred_change = paddle.max(soft_pred) - soft_pred_perturb[pred_label] + + sample[num_nodes] = pred_change + samples.append(sample) + + samples = paddle.to_tensor(np.array(samples)) + if self.perturbations_is_positive_only: + samples = paddle.abs(samples) + + top = int(self.num_samples / 8) + top_idx = paddle.argsort(samples[:, num_nodes])[-top:] + for i in range(self.num_samples): + if i in top_idx: + samples[i, num_nodes] = 1 + else: + samples[i, num_nodes] = 0 + + return samples + + def _explain_graph( + self, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + target=None, + **kwargs, + ) -> Tuple[Tensor, Tensor]: + r"""Generates explanations for graph classification tasks. + + Args: + model (paddle.nn.Layer: The model to explain. + x (paddle.to_tensor): The node features. + edge_index (paddle.to_tensor): The edge indices of the input graph. + target (paddle.to_tensor, optional): The predicted label from the + model. (default: :obj:`None`) + **kwargs (optional): Additional arguments passed to + :meth:`model.forward`. + + Returns: + pgm_nodes (List): The neighbor nodes that are significant in the + selected node's prediction. + pgm_stats (paddle.to_tensor): The :math:`p`-values of all the nodes in + the graph, ordered by node index. + """ + import pandas as pd + from pgmpy.estimators.CITests import chi_square + + num_nodes = x.shape[0] + if not self.max_subgraph_size: + self.max_subgraph_size = int(num_nodes / 20) + + samples = self._batch_perturb_features_on_node( + indices_to_perturb=np.array(range(num_nodes)), + x=x, + model=model, + edge_index=edge_index, + ) + + # note: the PC estimator is in the original code, ie. est= PC(data) + # but as it does nothing it is not included here + data = pd.DataFrame(np.array(samples.detach().cpu())) + + p_values = [] + for node in range(num_nodes): + chi2, p, _ = chi_square( + node, int(target.detach().cpu()), [], data, boolean=False, + significance_level=self.significance_threshold) + p_values.append(p) + + # the original code uses number_candidates_nodes = int(top_nodes * 4) + # if we consider 'top nodes' to equate to max number of nodes + # it seems more correct to limit number_candidates_nodes to this + candidate_nodes = np.argpartition( + p_values, self.max_subgraph_size)[0:self.max_subgraph_size] + + # Round 2 + samples = self._batch_perturb_features_on_node( + indices_to_perturb=candidate_nodes, x=x, edge_index=edge_index, + model=model, **kwargs) + + # note: the PC estimator is in the original code, ie. est= PC(data) + # but as it does nothing it is not included here + data = pd.DataFrame(np.array(samples.detach().cpu())) + + p_values = [] + dependent_nodes = [] + + target = num_nodes + for node in range(num_nodes): + _, p, _ = chi_square( + node, target, [], data, boolean=False, + significance_level=self.significance_threshold) + p_values.append(p) + if p < self.significance_threshold: + dependent_nodes.append(node) + + top_p = np.min((self.max_subgraph_size, num_nodes - 1)) + ind_top_p = np.argpartition(p_values, top_p)[0:top_p] + pgm_nodes = list(ind_top_p) + + node_mask = paddle.zeros(x.size(), dtype=paddle.int) + node_mask[pgm_nodes] = 1 + pgm_stats = paddle.to_tensor(p_values) + + return node_mask, pgm_stats + + def _explain_node( + self, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + target: Tensor, + index: int, + **kwargs, + ) -> Tuple[Tensor, Tensor]: + r"""Generates explanations for node classification tasks. + + Args: + model (paddle.nn.Layer: The model to explain. + x (paddle.to_tensor): The node features. + edge_index (paddle.to_tensor): The edge indices of the input graph. + target (paddle.to_tensor): The predicted label from the model. + index (int): The index of the node for which the explanations is + generated. + **kwargs (optional): Additional arguments passed to + :meth:`model.forward`. + + Returns: + node_mask (paddle.to_tensor): A hard node mask corresponding to whether + a node is significant in the selected node's prediction. + pgm_stats (paddle.to_tensor): The :math:`p`-values of all the nodes in + the graph, ordered by node index. + """ + import pandas as pd + from pgmpy.estimators.CITests import chi_square + + neighbors, _, _, _ = k_hop_subgraph( + node_idx=index, + num_hops=get_num_hops(model), + edge_index=edge_index, + relabel_nodes=False, + num_nodes=x.shape[0], + ) + + if index not in neighbors: + neighbors = paddle.concat([neighbors, index], axis=1) + + pred_model = model(x, edge_index, **kwargs) + + softmax_pred = paddle.nn.functional.softmax(pred_model, axis=1) + + samples = [] + pred_samples = [] + + for _ in range(self.num_samples): + # A subset of neighbors are selected randomly for perturbing: + seeds = np.random.choice([1, 0], size=(len(neighbors), )) + x_perturb = self._perturb_features_on_nodes( + x=x, + index=neighbors[seeds == 1], + ) + + # prediction after perturbation + pred_perturb = model(x_perturb, edge_index, **kwargs) + softmax_pred_perturb = paddle.nn.functional.softmax(pred_perturb, axis=1) + sample_bool = np.ones(shape=(len(neighbors), )) + sample_bool[((softmax_pred_perturb[neighbors, target] + + self.pred_threshold) + >= softmax_pred[neighbors, target]).cpu()] = 0 + + samples.append(seeds) + pred_samples.append(sample_bool) + + samples = np.asarray(samples) + pred_samples = np.asarray(pred_samples) + combine_samples = (samples * 10 + pred_samples) + 1 + + neighbors = np.array(neighbors.detach().cpu()) + data_pgm = pd.DataFrame(combine_samples) + data_pgm = data_pgm.rename(columns={ + 0: "A", + 1: "B" + }) # Trick to use chi_square test on first two data columns + index_original_to_subgraph = dict( + zip(neighbors, list(data_pgm.columns))) + index_subgraph_to_original = dict( + zip(list(data_pgm.columns), neighbors)) + p_values = [] + + dependent_neighbors = [] + dependent_neighbors_p_values = [] + for node in neighbors: + if node == index: + # null hypothesis is perturbing a particular + # node has no effect on result + p = 0 + else: + _, p, _ = chi_square( + index_original_to_subgraph[node], + index_original_to_subgraph[index], [], data_pgm, + boolean=False, + significance_level=self.significance_threshold) + p_values.append(p) + if p < self.significance_threshold: + dependent_neighbors.append(node) + dependent_neighbors_p_values.append(p) + + pgm_stats = paddle.ones(x.shape[0], dtype=paddle.float32) + node_mask = paddle.zeros(x.shape, dtype=paddle.int32) + + pgm_stats[neighbors] = paddle.to_tensor(p_values, dtype=paddle.float32) + + if self.max_subgraph_size is None: + pgm_nodes = dependent_neighbors + else: + top_p = np.min((self.max_subgraph_size, len(neighbors) - 1)) + ind_top_p = np.argpartition(p_values, top_p)[0:top_p] + pgm_nodes = [ + index_subgraph_to_original[node] for node in ind_top_p + ] + node_mask[pgm_nodes] = 1 + return node_mask, pgm_stats + + def forward( + self, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, # node index + **kwargs, + ) -> Explanation: + + if self.feature_index is None: + self.feature_index = list(range(x.shape[-1])) + + if isinstance(index, Tensor): + if index.numel() > 1: + raise NotImplementedError( + f"'{self.__class__.__name}' only supports a single " + f"`index` for now") + index = index.item() + + if self.model_config.task_level == ModelTaskLevel.node: + node_mask, pgm_stats = self._explain_node( + model=model, + x=x, + edge_index=edge_index, + target=target[index], + index=index, + **kwargs, + ) + return Explanation( + x=x, + edge_index=edge_index, + node_mask=node_mask, + pgm_stats=pgm_stats, + ) + + elif self.model_config.task_level == ModelTaskLevel.graph: + node_mask, pgm_stats = self._explain_graph( + model=model, + x=x, + target=target, + edge_index=edge_index, + **kwargs, + ) + return Explanation( + node_mask=node_mask, + pgm_stats=pgm_stats, + ) + + def supports(self) -> bool: + task_level = self.model_config.task_level + if task_level not in [ModelTaskLevel.node, ModelTaskLevel.graph]: + logging.error(f"Task level '{task_level.value}' not supported") + return False + if self.explainer_config.edge_mask_type is not None: + logging.error("Generation of edge masks is not supported") + return False + if self.model_config.mode == ModelMode.regression: + logging.error("'PGMExplainer' only supports classification tasks") + return False + return True diff --git a/jointContribution/mattergen/paddle_geometric/contrib/nn/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/nn/__init__.py new file mode 100644 index 00000000..04d6ebb6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/nn/__init__.py @@ -0,0 +1,4 @@ +from .conv import * # noqa +from .models import * # noqa + +__all__ = [] diff --git a/jointContribution/mattergen/paddle_geometric/contrib/nn/conv/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/nn/conv/__init__.py new file mode 100644 index 00000000..8be6c17e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/nn/conv/__init__.py @@ -0,0 +1 @@ +__all__ = classes = [] diff --git a/jointContribution/mattergen/paddle_geometric/contrib/nn/models/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/nn/models/__init__.py new file mode 100644 index 00000000..a64cc6c0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/nn/models/__init__.py @@ -0,0 +1,6 @@ +from .rbcd_attack import PRBCDAttack, GRBCDAttack + +__all__ = classes = [ + 'PRBCDAttack', + 'GRBCDAttack', +] diff --git a/jointContribution/mattergen/paddle_geometric/contrib/nn/models/rbcd_attack.py b/jointContribution/mattergen/paddle_geometric/contrib/nn/models/rbcd_attack.py new file mode 100644 index 00000000..3ad99c64 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/nn/models/rbcd_attack.py @@ -0,0 +1,765 @@ +from collections import defaultdict +from functools import partial +from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union + +import numpy as np +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from tqdm import tqdm + +from paddle_geometric.utils import coalesce, to_undirected + +# (predictions, labels, ids/mask) -> Tensor with one element +LOSS_TYPE = Callable[[Tensor, Tensor, Optional[Tensor]], Tensor] + + +class PRBCDAttack(paddle.nn.Layer): + r"""The Projected Randomized Block Coordinate Descent (PRBCD) adversarial + attack from the `Robustness of Graph Neural Networks at Scale + `_ paper. + + This attack uses an efficient gradient based approach that (during the + attack) relaxes the discrete entries in the adjacency matrix + :math:`\{0, 1\}` to :math:`[0, 1]` and solely perturbs the adjacency matrix + (no feature perturbations). Thus, this attack supports all models that can + handle weighted graphs that are differentiable w.r.t. these edge weights, + *e.g.*, :class:`~paddle_geometric.nn.conv.GCNConv` or + :class:`~paddle_geometric.nn.conv.GraphConv`. For non-differentiable models + you might need modifications, e.g., see example for + :class:`~paddle_geometric.nn.conv.GATConv`. + + The memory overhead is driven by the additional edges (at most + :attr:`block_size`). For scalability reasons, the block is drawn with + replacement and then the index is made unique. Thus, the actual block size + is typically slightly smaller than specified. + + This attack can be used for both global and local attacks as well as + test-time attacks (evasion) and training-time attacks (poisoning). Please + see the provided examples. + + This attack is designed with a focus on node- or graph-classification, + however, to adapt to other tasks you most likely only need to provide an + appropriate loss and model. However, we currently do not support batching + out of the box (sampling needs to be adapted). + + .. note:: + For examples of using the PRBCD Attack, see + `examples/contrib/rbcd_attack.py + `_ + for a test time attack (evasion) or + `examples/contrib/rbcd_attack_poisoning.py + `_ + for a training time (poisoning) attack. + + Args: + model (paddle.nn.Layer): The GNN module to assess. + block_size (int): Number of randomly selected elements in the + adjacency matrix to consider. + epochs (int, optional): Number of epochs (aborts early if + :obj:`mode='greedy'` and budget is satisfied) (default: :obj:`125`) + epochs_resampling (int, optional): Number of epochs to resample the + random block. (default: obj:`100`) + loss (str or callable, optional): A loss to quantify the "strength" of + an attack. Note that this function must match the output format of + :attr:`model`. By default, it is assumed that the task is + classification and that the model returns raw predictions (*i.e.*, + no output activation) or uses :obj:`logsoftmax`. Moreover, and the + number of predictions should match the number of labels passed to + :attr:`attack`. Either pass a callable or one of: :obj:`'masked'`, + :obj:`'margin'`, :obj:`'prob_margin'`, :obj:`'tanh_margin'`. + (default: :obj:`'prob_margin'`) + metric (callable, optional): Second (potentially + non-differentiable) loss for monitoring or early stopping (if + :obj:`mode='greedy'`). (default: same as :attr:`loss`) + lr (float, optional): Learning rate for updating edge weights. + Additionally, it is heuristically corrected for :attr:`block_size`, + budget (see :attr:`attack`) and graph size. (default: :obj:`1_000`) + is_undirected (bool, optional): If :obj:`True` the graph is + assumed to be undirected. (default: :obj:`True`) + log (bool, optional): If set to :obj:`False`, will not log any learning + progress. (default: :obj:`True`) + """ + coeffs = { + 'max_final_samples': 20, + 'max_trials_sampling': 20, + 'with_early_stopping': True, + 'eps': 1e-7 + } + + def __init__( + self, + model: paddle.nn.Layer, + block_size: int, + epochs: int = 125, + epochs_resampling: int = 100, + loss: Optional[Union[str, LOSS_TYPE]] = 'prob_margin', + metric: Optional[Union[str, LOSS_TYPE]] = None, + lr: float = 1_000, + is_undirected: bool = True, + log: bool = True, + **kwargs, + ): + super().__init__() + + self.model = model + self.block_size = block_size + self.epochs = epochs + + if isinstance(loss, str): + if loss == 'masked': + self.loss = self._masked_cross_entropy + elif loss == 'margin': + self.loss = partial(self._margin_loss, reduce='mean') + elif loss == 'prob_margin': + self.loss = self._probability_margin_loss + elif loss == 'tanh_margin': + self.loss = self._tanh_margin_loss + else: + raise ValueError(f'Unknown loss `{loss}`') + else: + self.loss = loss + + self.is_undirected = is_undirected + self.log = log + self.metric = metric or self.loss + + self.epochs_resampling = epochs_resampling + self.lr = lr + + self.coeffs.update(kwargs) + + def attack( + self, + x: Tensor, + edge_index: Tensor, + labels: Tensor, + budget: int, + idx_attack: Optional[Tensor] = None, + **kwargs, + ) -> Tuple[Tensor, Tensor]: + """Attack the predictions for the provided model and graph. + + A subset of predictions may be specified with :attr:`idx_attack`. The + attack is allowed to flip (i.e. add or delete) :attr:`budget` edges and + will return the strongest perturbation it can find. It returns both the + resulting perturbed :attr:`edge_index` as well as the perturbations. + + Args: + x (paddle.Tensor): The node feature matrix. + edge_index (paddle.Tensor): The edge indices. + labels (paddle.Tensor): The labels. + budget (int): The number of allowed perturbations (i.e. + number of edges that are flipped at most). + idx_attack (paddle.Tensor, optional): Filter for predictions/labels. + Shape and type must match that it can index :attr:`labels` + and the model's predictions. + **kwargs (optional): Additional arguments passed to the GNN module. + + :rtype: (:class:`paddle.Tensor`, :class:`paddle.Tensor`) + """ + self.model.eval() + + self.device = x.place + assert kwargs.get('edge_weight') is None + edge_weight = paddle.ones(edge_index.shape[1]) + self.edge_index = edge_index.cpu().clone() + self.edge_weight = edge_weight.cpu().clone() + self.num_nodes = x.shape[0] + + # For collecting attack statistics + self.attack_statistics = defaultdict(list) + + # Prepare attack and define `self.iterable` to iterate over + step_sequence = self._prepare(budget) + + # Loop over the epochs (Algorithm 1, line 5) + for step in tqdm(step_sequence, disable=not self.log, desc='Attack'): + loss, gradient = self._forward_and_gradient( + x, labels, idx_attack, **kwargs) + + scalars = self._update(step, gradient, x, labels, budget, + idx_attack, **kwargs) + + scalars['loss'] = loss.item() + self._append_statistics(scalars) + + perturbed_edge_index, flipped_edges = self._close( + x, labels, budget, idx_attack, **kwargs) + + assert flipped_edges.shape[1] <= budget, ( + f'# perturbed edges {flipped_edges.shape[1]} ' + f'exceeds budget {budget}') + + return perturbed_edge_index, flipped_edges + + def _prepare(self, budget: int) -> Iterable[int]: + """Prepare attack.""" + if self.block_size <= budget: + raise ValueError( + f'The search space size ({self.block_size}) must be ' + f'greater than the number of permutations ({budget})') + + # For early stopping (not explicitly covered by pseudo code) + self.best_metric = float('-Inf') + + # Sample initial search space (Algorithm 1, line 3-4) + self._sample_random_block(budget) + + steps = range(self.epochs) + return steps + + @paddle.no_grad() + def _update(self, epoch: int, gradient: Tensor, x: Tensor, labels: Tensor, + budget: int, idx_attack: Optional[Tensor] = None, + **kwargs) -> Dict[str, float]: + """Update edge weights given gradient.""" + # Gradient update step (Algorithm 1, line 7) + self.block_edge_weight = self._update_edge_weights( + budget, self.block_edge_weight, epoch, gradient) + + # For monitoring + pmass_update = paddle.clamp(self.block_edge_weight, 0, 1) + # Projection to stay within relaxed `L_0` budget + # (Algorithm 1, line 8) + self.block_edge_weight = self._project(budget, self.block_edge_weight, + self.coeffs['eps']) + + # For monitoring + scalars = dict( + prob_mass_after_update=pmass_update.sum().item(), + prob_mass_after_update_max=pmass_update.max().item(), + prob_mass_after_projection=self.block_edge_weight.sum().item(), + prob_mass_after_projection_nonzero_weights=( + self.block_edge_weight > self.coeffs['eps']).sum().item(), + prob_mass_after_projection_max=self.block_edge_weight.max().item()) + if not self.coeffs['with_early_stopping']: + return scalars + + # Calculate metric after the current epoch (overhead + # for monitoring and early stopping) + topk_block_edge_weight = paddle.zeros_like(self.block_edge_weight) + topk_block_edge_weight[paddle.topk(self.block_edge_weight, + budget).indices] = 1 + edge_index, edge_weight = self._get_modified_adj( + self.edge_index, self.edge_weight, self.block_edge_index, + topk_block_edge_weight) + prediction = self._forward(x, edge_index, edge_weight, **kwargs) + metric = self.metric(prediction, labels, idx_attack) + + # Save best epoch for early stopping + # (not explicitly covered by pseudo code) + if metric > self.best_metric: + self.best_metric = metric + self.best_block = self.current_block.cpu().clone() + self.best_edge_index = self.block_edge_index.cpu().clone() + self.best_pert_edge_weight = self.block_edge_weight.cpu().clone() + + # Resampling of search space (Algorithm 1, line 9-14) + if epoch < self.epochs_resampling - 1: + self._resample_random_block(budget) + elif epoch == self.epochs_resampling - 1: + # Retrieve best epoch if early stopping is active + # (not explicitly covered by pseudo code) + self.current_block = self.best_block.to(self.device) + self.block_edge_index = self.best_edge_index.to(self.device) + block_edge_weight = self.best_pert_edge_weight.clone() + self.block_edge_weight = block_edge_weight.to(self.device) + + scalars['metric'] = metric.item() + return scalars + + @paddle.no_grad() + def _close(self, x: Tensor, labels: Tensor, budget: int, + idx_attack: Optional[Tensor] = None, + **kwargs) -> Tuple[Tensor, Tensor]: + """Clean up and prepare return argument.""" + # Retrieve best epoch if early stopping is active + # (not explicitly covered by pseudo code) + if self.coeffs['with_early_stopping']: + self.current_block = self.best_block.to(self.device) + self.block_edge_index = self.best_edge_index.to(self.device) + self.block_edge_weight = self.best_pert_edge_weight.to(self.device) + + # Sample final discrete graph (Algorithm 1, line 16) + edge_index, flipped_edges = self._sample_final_edges( + x, labels, budget, idx_attack=idx_attack, **kwargs) + + return edge_index, flipped_edges + + def _forward(self, x: Tensor, edge_index: Tensor, edge_weight: Tensor, + **kwargs) -> Tensor: + """Forward model.""" + return self.model(x, edge_index, edge_weight, **kwargs) + + def _forward_and_gradient(self, x: Tensor, labels: Tensor, + idx_attack: Optional[Tensor] = None, + **kwargs) -> Tuple[Tensor, Tensor]: + """Forward and update edge weights.""" + self.block_edge_weight.stop_gradient = False + + # Retrieve sparse perturbed adjacency matrix `A \oplus p_{t-1}` + # (Algorithm 1, line 6 / Algorithm 2, line 7) + edge_index, edge_weight = self._get_modified_adj( + self.edge_index, self.edge_weight, self.block_edge_index, + self.block_edge_weight) + + # Get prediction (Algorithm 1, line 6 / Algorithm 2, line 7) + prediction = self._forward(x, edge_index, edge_weight, **kwargs) + # Calculate loss combining all each node + # (Algorithm 1, line 7 / Algorithm 2, line 8) + loss = self.loss(prediction, labels, idx_attack) + # Retrieve gradient towards the current block + # (Algorithm 1, line 7 / Algorithm 2, line 8) + gradient = paddle.autograd.grad(loss, self.block_edge_weight)[0] + + return loss, gradient + + def _get_modified_adj(self, edge_index: Tensor, edge_weight: Tensor, + block_edge_index: Tensor, + block_edge_weight: Tensor) -> Tuple[Tensor, Tensor]: + """Merges adjacency matrix with current block (incl. weights).""" + if self.is_undirected: + block_edge_index, block_edge_weight = to_undirected( + block_edge_index, block_edge_weight, num_nodes=self.num_nodes, + reduce='mean') + + modified_edge_index = paddle.concat( + (edge_index.to(paddle.CUDAPlace(0)), block_edge_index), axis=-1) + modified_edge_weight = paddle.concat( + (edge_weight.to(paddle.CUDAPlace(0)), block_edge_weight)) + + modified_edge_index, modified_edge_weight = coalesce( + modified_edge_index, modified_edge_weight, + num_nodes=self.num_nodes, reduce='sum') + + # Allow (soft) removal of edges + is_edge_in_clean_adj = modified_edge_weight > 1 + modified_edge_weight[is_edge_in_clean_adj] = ( + 2 - modified_edge_weight[is_edge_in_clean_adj]) + + return modified_edge_index, modified_edge_weight + + def _filter_self_loops_in_block(self, with_weight: bool): + is_not_sl = self.block_edge_index[0] != self.block_edge_index[1] + self.current_block = self.current_block[is_not_sl] + self.block_edge_index = self.block_edge_index[:, is_not_sl] + if with_weight: + self.block_edge_weight = self.block_edge_weight[is_not_sl] + + def _sample_random_block(self, budget: int = 0): + for _ in range(self.coeffs['max_trials_sampling']): + num_possible_edges = self._num_possible_edges( + self.num_nodes, self.is_undirected) + self.current_block = paddle.randint(high=num_possible_edges, + shape=[self.block_size, ]) + self.current_block = paddle.unique(self.current_block) + self.current_block = paddle.sort(self.current_block) + if self.is_undirected: + self.block_edge_index = self._linear_to_triu_idx( + self.num_nodes, self.current_block) + else: + self.block_edge_index = self._linear_to_full_idx( + self.num_nodes, self.current_block) + self._filter_self_loops_in_block(with_weight=False) + + self.block_edge_weight = paddle.full(self.current_block.shape, + self.coeffs['eps']) + if self.current_block.shape[0] >= budget: + return + raise RuntimeError('Sampling random block was not successful. ' + 'Please decrease `budget`.') + + def _resample_random_block(self, budget: int): + # Keep at most half of the block (i.e. resample low weights) + sorted_idx = paddle.argsort(self.block_edge_weight) + keep_above = (self.block_edge_weight + <= self.coeffs['eps']).sum().long() + if keep_above < sorted_idx.shape[0] // 2: + keep_above = sorted_idx.shape[0] // 2 + sorted_idx = sorted_idx[keep_above:] + + self.current_block = self.current_block[sorted_idx] + + # Sample until enough edges were drawn + for _ in range(self.coeffs['max_trials_sampling']): + n_edges_resample = self.block_size - self.current_block.shape[0] + num_possible_edges = self._num_possible_edges( + self.num_nodes, self.is_undirected) + lin_index = paddle.randint(num_possible_edges, (n_edges_resample,)) + + current_block = paddle.concat((self.current_block, lin_index)) + self.current_block, unique_idx = paddle.unique( + current_block, sorted=True, return_inverse=True) + + if self.is_undirected: + self.block_edge_index = self._linear_to_triu_idx( + self.num_nodes, self.current_block) + else: + self.block_edge_index = self._linear_to_full_idx( + self.num_nodes, self.current_block) + + # Merge existing weights with new edge weights + block_edge_weight_prev = self.block_edge_weight[sorted_idx] + self.block_edge_weight = paddle.full(self.current_block.shape, + self.coeffs['eps']) + self.block_edge_weight[ + unique_idx[:sorted_idx.shape[0]]] = block_edge_weight_prev + + if not self.is_undirected: + self._filter_self_loops_in_block(with_weight=True) + + if self.current_block.shape[0] > budget: + return + raise RuntimeError('Sampling random block was not successful.' + 'Please decrease `budget`.') + + def _sample_final_edges(self, x: Tensor, labels: Tensor, budget: int, + idx_attack: Optional[Tensor] = None, + **kwargs) -> Tuple[Tensor, Tensor]: + best_metric = float('-Inf') + block_edge_weight = self.block_edge_weight + block_edge_weight[block_edge_weight <= self.coeffs['eps']] = 0 + + for i in range(self.coeffs['max_final_samples']): + if i == 0: + # In first iteration employ top k heuristic instead of sampling + sampled_edges = paddle.zeros_like(block_edge_weight) + sampled_edges[paddle.topk(block_edge_weight, + budget).indices] = 1 + else: + sampled_edges = paddle.bernoulli(block_edge_weight).float() + + if sampled_edges.sum() > budget: + # Allowed budget is exceeded + continue + + edge_index, edge_weight = self._get_modified_adj( + self.edge_index, self.edge_weight, self.block_edge_index, + sampled_edges) + prediction = self._forward(x, edge_index, edge_weight, **kwargs) + metric = self.metric(prediction, labels, idx_attack) + + # Save best sample + if metric > best_metric: + best_metric = metric + self.block_edge_weight = sampled_edges.clone().cpu() + + # Recover best sample + self.block_edge_weight = self.block_edge_weight.to(self.device) + flipped_edges = self.block_edge_index[:, self.block_edge_weight > 0] + + edge_index, edge_weight = self._get_modified_adj( + self.edge_index, self.edge_weight, self.block_edge_index, + self.block_edge_weight) + edge_mask = edge_weight == 1 + edge_index = edge_index[:, edge_mask] + + return edge_index, flipped_edges + + def _update_edge_weights(self, budget: int, block_edge_weight: Tensor, + epoch: int, gradient: Tensor) -> Tensor: + # The learning rate is refined heuristically, s.t. (1) it is + # independent of the number of perturbations (assuming an undirected + # adjacency matrix) and (2) to decay learning rate during fine-tuning + # (i.e. fixed search space). + lr = (budget / self.num_nodes * self.lr / + np.sqrt(max(0, epoch - self.epochs_resampling) + 1)) + return block_edge_weight + lr * gradient + + @staticmethod + def _project(budget: int, values: Tensor, eps: float = 1e-7) -> Tensor: + r"""Project :obj:`values`: + :math:`budget \ge \sum \Pi_{[0, 1]}(\text{values})`. + """ + if paddle.clamp(values, 0, 1).sum() > budget: + left = (values - 1).min() + right = values.max() + miu = PRBCDAttack._bisection(values, left, right, budget) + values = values - miu + return paddle.clamp(values, min=eps, max=1 - eps) + + @staticmethod + def _bisection(edge_weights: Tensor, a: float, b: float, n_pert: int, + eps=1e-5, max_iter=1e3) -> Tensor: + """Bisection search for projection.""" + + def shift(offset: float): + return (paddle.clamp(edge_weights - offset, 0, 1).sum() - n_pert) + + miu = a + for _ in range(int(max_iter)): + miu = (a + b) / 2 + # Check if middle point is root + if (shift(miu) == 0.0): + break + # Decide the side to repeat the steps + if (shift(miu) * shift(a) < 0): + b = miu + else: + a = miu + if ((b - a) <= eps): + break + return miu + + @staticmethod + def _num_possible_edges(n: int, is_undirected: bool) -> int: + """Determine number of possible edges for graph.""" + if is_undirected: + return n * (n - 1) // 2 + else: + return int(n ** 2) # We filter self-loops later + + @staticmethod + def _linear_to_triu_idx(n: int, lin_idx: Tensor) -> Tensor: + """Linear index to upper triangular matrix without diagonal. This is + similar to + https://stackoverflow.com/questions/242711/algorithm-for-index-numbers-of-triangular-matrix-coefficients/28116498#28116498 + with number nodes decremented and col index incremented by one. + """ + nn = n * (n - 1) + row_idx = n - 2 - paddle.floor( + paddle.sqrt(-8 * lin_idx.double() + 4 * nn - 7) / 2.0 - 0.5).long() + col_idx = 1 + lin_idx + row_idx - nn // 2 + paddle.div( + (n - row_idx) * (n - row_idx - 1), 2, rounding_mode='floor') + return paddle.stack((row_idx, col_idx)) + + @staticmethod + def _linear_to_full_idx(n: int, lin_idx: Tensor) -> Tensor: + """Linear index to dense matrix including diagonal.""" + n = paddle.full_like(lin_idx, n, dtype=lin_idx.dtype) + n = paddle.cast(n, 'float32') + lin_idx = paddle.cast(lin_idx, 'float32') + row_idx = paddle.divide(lin_idx, n) + row_idx = paddle.floor(row_idx) + col_idx = lin_idx % n + return paddle.stack((row_idx, col_idx)) + + @staticmethod + def _margin_loss(score: Tensor, labels: Tensor, + idx_mask: Optional[Tensor] = None, + reduce: Optional[str] = None) -> Tensor: + r"""Margin loss between true score and highest non-target score. + + .. math:: + m = - s_{y} + max_{y' \ne y} s_{y'} + + where :math:`m` is the margin :math:`s` the score and :math:`y` the + labels. + + Args: + score (Tensor): Some score (*e.g.*, logits) of shape + :obj:`[n_elem, dim]`. + labels (LongTensor): The labels of shape :obj:`[n_elem]`. + idx_mask (Tensor, optional): To select subset of `score` and + `labels` of shape :obj:`[n_select]`. Defaults to None. + reduce (str, optional): if :obj:`mean` the result is aggregated. + Otherwise, return element wise margin. + + :rtype: (Tensor) + """ + if idx_mask is not None: + score = score[idx_mask] + labels = labels[idx_mask] + + linear_idx = paddle.arange(score.shape[0]) + true_score = score[linear_idx, labels] + + score = score.clone() + score[linear_idx, labels] = float('-Inf') + best_non_target_score = score.amax(dim=-1) + + margin_ = best_non_target_score - true_score + if reduce is None: + return margin_ + return margin_.mean() + + @staticmethod + def _tanh_margin_loss(prediction: Tensor, labels: Tensor, + idx_mask: Optional[Tensor] = None) -> Tensor: + """Calculate tanh margin loss, a node-classification loss that focuses + on nodes next to decision boundary. + + Args: + prediction (Tensor): Prediction of shape :obj:`[n_elem, dim]`. + labels (LongTensor): The labels of shape :obj:`[n_elem]`. + idx_mask (Tensor, optional): To select subset of `score` and + `labels` of shape :obj:`[n_select]`. Defaults to None. + + :rtype: (Tensor) + """ + log_prob = F.log_softmax(prediction, dim=-1) + margin_ = GRBCDAttack._margin_loss(log_prob, labels, idx_mask) + loss = paddle.tanh(margin_).mean() + return loss + + @staticmethod + def _probability_margin_loss(prediction: Tensor, labels: Tensor, + idx_mask: Optional[Tensor] = None) -> Tensor: + """Calculate probability margin loss, a node-classification loss that + focuses on nodes next to decision boundary. See `Are Defenses for + Graph Neural Networks Robust? + `_ for details. + + Args: + prediction (Tensor): Prediction of shape :obj:`[n_elem, dim]`. + labels (LongTensor): The labels of shape :obj:`[n_elem]`. + idx_mask (Tensor, optional): To select subset of `score` and + `labels` of shape :obj:`[n_select]`. Defaults to None. + + :rtype: (Tensor) + """ + prob = F.softmax(prediction, dim=-1) + margin_ = GRBCDAttack._margin_loss(prob, labels, idx_mask) + return margin_.mean() + + @staticmethod + def _masked_cross_entropy(log_prob: Tensor, labels: Tensor, + idx_mask: Optional[Tensor] = None) -> Tensor: + """Calculate masked cross entropy loss, a node-classification loss that + focuses on nodes next to decision boundary. + + Args: + log_prob (Tensor): Log probabilities of shape :obj:`[n_elem, dim]`. + labels (LongTensor): The labels of shape :obj:`[n_elem]`. + idx_mask (Tensor, optional): To select subset of `score` and + `labels` of shape :obj:`[n_select]`. Defaults to None. + + :rtype: (Tensor) + """ + if idx_mask is not None: + log_prob = log_prob[idx_mask] + labels = labels[idx_mask] + + is_correct = log_prob.argmax(-1) == labels + if is_correct.any(): + log_prob = log_prob[is_correct] + labels = labels[is_correct] + + return F.nll_loss(log_prob, labels) + + def _append_statistics(self, mapping: Dict[str, Any]): + for key, value in mapping.items(): + self.attack_statistics[key].append(value) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' + + +class GRBCDAttack(PRBCDAttack): + r"""The Greedy Randomized Block Coordinate Descent (GRBCD) adversarial + attack from the `Robustness of Graph Neural Networks at Scale + `_ paper. + + GRBCD shares most of the properties and requirements with + :class:`PRBCDAttack`. It also uses an efficient gradient based approach. + However, it greedily flips edges based on the gradient towards the + adjacency matrix. + + .. note:: + For examples of using the GRBCD Attack, see + `examples/contrib/rbcd_attack.py + `_ + for a test time attack (evasion). + + Args: + model (paddle.nn.Layer): The GNN module to assess. + block_size (int): Number of randomly selected elements in the + adjacency matrix to consider. + epochs (int, optional): Number of epochs (aborts early if + :obj:`mode='greedy'` and budget is satisfied) (default: :obj:`125`) + loss (str or callable, optional): A loss to quantify the "strength" of + an attack. Note that this function must match the output format of + :attr:`model`. By default, it is assumed that the task is + classification and that the model returns raw predictions (*i.e.*, + no output activation) or uses :obj:`logsoftmax`. Moreover, and the + number of predictions should match the number of labels passed to + :attr:`attack`. Either pass Callable or one of: :obj:`'masked'`, + :obj:`'margin'`, :obj:`'prob_margin'`, :obj:`'tanh_margin'`. + (default: :obj:`'masked'`) + is_undirected (bool, optional): If :obj:`True` the graph is + assumed to be undirected. (default: :obj:`True`) + log (bool, optional): If set to :obj:`False`, will not log any learning + progress. (default: :obj:`True`) + """ + coeffs = {'max_trials_sampling': 20, 'eps': 1e-7} + + def __init__( + self, + model: paddle.nn.Layer, + block_size: int, + epochs: int = 125, + loss: Optional[Union[str, LOSS_TYPE]] = 'masked', + is_undirected: bool = True, + log: bool = True, + **kwargs, + ): + super().__init__(model, block_size, epochs, loss=loss, + is_undirected=is_undirected, log=log, **kwargs) + + @paddle.no_grad() + def _prepare(self, budget: int) -> List[int]: + """Prepare attack.""" + self.flipped_edges = paddle.empty([2, 0], dtype=self.edge_index.dtype) + + # Determine the number of edges to be flipped in each attach step/epoch + step_size = budget // self.epochs + if step_size > 0: + steps = self.epochs * [step_size] + for i in range(budget % self.epochs): + steps[i] += 1 + else: + steps = [1] * budget + + # Sample initial search space (Algorithm 2, line 3-4) + self._sample_random_block(step_size) + + return steps + + @paddle.no_grad() + def _update(self, step_size: int, gradient: Tensor, *args, + **kwargs) -> Dict[str, Any]: + """Update edge weights given gradient.""" + _, topk_edge_index = paddle.topk(gradient, step_size) + + flip_edge_index = self.block_edge_index[:, topk_edge_index] + flip_edge_weight = paddle.ones_like(flip_edge_index[0], + dtype=paddle.float32) + + self.flipped_edges = paddle.concat((self.flipped_edges, flip_edge_index), + axis=-1) + + if self.is_undirected: + flip_edge_index, flip_edge_weight = to_undirected( + flip_edge_index, flip_edge_weight, num_nodes=self.num_nodes, + reduce='mean') + edge_index = paddle.concat( + (self.edge_index.to(self.device), flip_edge_index.to(self.device)), + dim=-1) + edge_weight = paddle.concat((self.edge_weight.to(self.device), + flip_edge_weight.to(self.device))) + edge_index, edge_weight = coalesce(edge_index, edge_weight, + num_nodes=self.num_nodes, + reduce='sum') + + is_one_mask = paddle.isclose(edge_weight, paddle.to_tensor(1.)) + self.edge_index = edge_index[:, is_one_mask] + self.edge_weight = edge_weight[is_one_mask] + # self.edge_weight = paddle.ones_like(self.edge_weight) + assert self.edge_index.shape[1] == self.edge_weight.shape[0] + + # Sample initial search space (Algorithm 2, line 3-4) + self._sample_random_block(step_size) + + # Return debug information + scalars = { + 'number_positive_entries_in_gradient': (gradient > 0).sum().item() + } + return scalars + + def _close(self, *args, **kwargs) -> Tuple[Tensor, Tensor]: + """Clean up and prepare return argument.""" + return self.edge_index, self.flipped_edges diff --git a/jointContribution/mattergen/paddle_geometric/contrib/transforms/__init__.py b/jointContribution/mattergen/paddle_geometric/contrib/transforms/__init__.py new file mode 100644 index 00000000..8be6c17e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/contrib/transforms/__init__.py @@ -0,0 +1 @@ +__all__ = classes = [] diff --git a/jointContribution/mattergen/paddle_geometric/data/__init__.py b/jointContribution/mattergen/paddle_geometric/data/__init__.py new file mode 100644 index 00000000..549299c1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/__init__.py @@ -0,0 +1,136 @@ +# flake8: noqa + +import paddle +import paddle_geometric.typing + +from .feature_store import FeatureStore, TensorAttr +from .graph_store import GraphStore, EdgeAttr, EdgeLayout +from .data import Data +from .hetero_data import HeteroData +from .batch import Batch +from .temporal import TemporalData +from .database import Database, SQLiteDatabase, RocksDatabase +from .dataset import Dataset +from .in_memory_dataset import InMemoryDataset +from .on_disk_dataset import OnDiskDataset +from .makedirs import makedirs +from .download import download_url, download_google_url +from .extract import extract_tar, extract_zip, extract_bz2, extract_gz + +from paddle_geometric.lazy_loader import LazyLoader + +data_classes = [ + 'Data', + 'HeteroData', + 'Batch', + 'TemporalData', + 'Dataset', + 'InMemoryDataset', + 'OnDiskDataset', +] + +remote_backend_classes = [ + 'FeatureStore', + 'GraphStore', + 'TensorAttr', + 'EdgeAttr', +] + +database_classes = [ + 'Database', + 'SQLiteDatabase', + 'RocksDatabase', +] + +helper_functions = [ + 'makedirs', + 'download_url', + 'download_google_url', + 'extract_tar', + 'extract_zip', + 'extract_bz2', + 'extract_gz', +] + +__all__ = data_classes + remote_backend_classes + helper_functions + +lightning = LazyLoader('lightning', globals(), + 'paddle_geometric.data.lightning') + +from paddle_geometric.deprecation import deprecated +from paddle_geometric.loader import NeighborSampler +from paddle_geometric.loader import ClusterData +from paddle_geometric.loader import ClusterLoader +from paddle_geometric.loader import GraphSAINTSampler +from paddle_geometric.loader import GraphSAINTNodeSampler +from paddle_geometric.loader import GraphSAINTEdgeSampler +from paddle_geometric.loader import GraphSAINTRandomWalkSampler +from paddle_geometric.loader import ShaDowKHopSampler +from paddle_geometric.loader import RandomNodeLoader +from paddle_geometric.loader import DataLoader +from paddle_geometric.loader import DataListLoader +from paddle_geometric.loader import DenseDataLoader + +# Serialization ############################################################### + +# if paddle_geometric.typing.WITH_PT24: +# paddle.serialization.add_safe_globals([ +# Data, +# HeteroData, +# TemporalData, +# ClusterData, +# TensorAttr, +# EdgeAttr, +# EdgeLayout, +# ]) + +# Deprecations ################################################################ + +NeighborSampler = deprecated( # type: ignore + details="use 'loader.NeighborSampler' instead", + func_name='data.NeighborSampler', +)(NeighborSampler) +ClusterData = deprecated( # type: ignore + details="use 'loader.ClusterData' instead", + func_name='data.ClusterData', +)(ClusterData) +ClusterLoader = deprecated( # type: ignore + details="use 'loader.ClusterLoader' instead", + func_name='data.ClusterLoader', +)(ClusterLoader) +GraphSAINTSampler = deprecated( # type: ignore + details="use 'loader.GraphSAINTSampler' instead", + func_name='data.GraphSAINTSampler', +)(GraphSAINTSampler) +GraphSAINTNodeSampler = deprecated( # type: ignore + details="use 'loader.GraphSAINTNodeSampler' instead", + func_name='data.GraphSAINTNodeSampler', +)(GraphSAINTNodeSampler) +GraphSAINTEdgeSampler = deprecated( # type: ignore + details="use 'loader.GraphSAINTEdgeSampler' instead", + func_name='data.GraphSAINTEdgeSampler', +)(GraphSAINTEdgeSampler) +GraphSAINTRandomWalkSampler = deprecated( # type: ignore + details="use 'loader.GraphSAINTRandomWalkSampler' instead", + func_name='data.GraphSAINTRandomWalkSampler', +)(GraphSAINTRandomWalkSampler) +ShaDowKHopSampler = deprecated( # type: ignore + details="use 'loader.ShaDowKHopSampler' instead", + func_name='data.ShaDowKHopSampler', +)(ShaDowKHopSampler) +RandomNodeSampler = deprecated( + details="use 'loader.RandomNodeLoader' instead", + func_name='data.RandomNodeSampler', +)(RandomNodeLoader) +DataLoader = deprecated( # type: ignore + details="use 'loader.DataLoader' instead", + func_name='data.DataLoader', +)(DataLoader) +DataListLoader = deprecated( # type: ignore + details="use 'loader.DataListLoader' instead", + func_name='data.DataListLoader', +)(DataListLoader) +DenseDataLoader = deprecated( # type: ignore + details="use 'loader.DenseDataLoader' instead", + func_name='data.DenseDataLoader', +)(DenseDataLoader) diff --git a/jointContribution/mattergen/paddle_geometric/data/batch.py b/jointContribution/mattergen/paddle_geometric/data/batch.py new file mode 100644 index 00000000..18dc6f90 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/batch.py @@ -0,0 +1,152 @@ +import inspect +from collections.abc import Sequence +from typing import Any, List, Optional, Type, Union + +import numpy as np +import paddle +from paddle import Tensor +from typing_extensions import Self + +from paddle_geometric.data.collate import collate +from paddle_geometric.data.data import BaseData, Data +from paddle_geometric.data.dataset import IndexType +from paddle_geometric.data.separate import separate + + +class DynamicInheritance(type): + def __call__(cls, *args: Any, **kwargs: Any) -> Any: + base_cls = kwargs.pop('_base_cls', Data) + + if issubclass(base_cls, Batch): + new_cls = base_cls + else: + name = f'{base_cls.__name__}{cls.__name__}' + + class MetaResolver(type(cls), type(base_cls)): + pass + + if name not in globals(): + globals()[name] = MetaResolver(name, (cls, base_cls), {}) + new_cls = globals()[name] + + params = list(inspect.signature(base_cls.__init__).parameters.items()) + for i, (k, v) in enumerate(params[1:]): + if k == 'args' or k == 'kwargs': + continue + if i < len(args) or k in kwargs: + continue + if v.default is not inspect.Parameter.empty: + continue + kwargs[k] = None + + return super(DynamicInheritance, new_cls).__call__(*args, **kwargs) + + +class DynamicInheritanceGetter: + def __call__(self, cls: Type, base_cls: Type) -> Self: + return cls(_base_cls=base_cls) + + +class Batch(metaclass=DynamicInheritance): + @classmethod + def from_data_list( + cls, + data_list: List[BaseData], + follow_batch: Optional[List[str]] = None, + exclude_keys: Optional[List[str]] = None, + ) -> Self: + batch, slice_dict, inc_dict = collate( + cls, + data_list=data_list, + increment=True, + add_batch=not isinstance(data_list[0], Batch), + follow_batch=follow_batch, + exclude_keys=exclude_keys, + ) + + batch._num_graphs = len(data_list) + batch._slice_dict = slice_dict + batch._inc_dict = inc_dict + + return batch + + def get_example(self, idx: int) -> BaseData: + if not hasattr(self, '_slice_dict'): + raise RuntimeError( + "Cannot reconstruct 'Data' object from 'Batch' because " + "'Batch' was not created via 'Batch.from_data_list()'") + + data = separate( + cls=self.__class__.__bases__[-1], + batch=self, + idx=idx, + slice_dict=getattr(self, '_slice_dict'), + inc_dict=getattr(self, '_inc_dict'), + decrement=True, + ) + + return data + + def index_select(self, idx: IndexType) -> List[BaseData]: + index: Sequence[int] + if isinstance(idx, slice): + index = list(range(self.num_graphs)[idx]) + + elif isinstance(idx, Tensor) and idx.dtype == paddle.int64: + index = idx.flatten().tolist() + + elif isinstance(idx, Tensor) and idx.dtype == paddle.bool: + index = idx.flatten().nonzero(as_tuple=False).flatten().tolist() + + elif isinstance(idx, np.ndarray) and idx.dtype == np.int64: + index = idx.flatten().tolist() + + elif isinstance(idx, np.ndarray) and idx.dtype == bool: + index = idx.flatten().nonzero()[0].flatten().tolist() + + elif isinstance(idx, Sequence) and not isinstance(idx, str): + index = idx + + else: + raise IndexError( + f"Only slices (':'), list, tuples, paddle.Tensor and " + f"np.ndarray of dtype int64 or bool are valid indices (got " + f"'{type(idx).__name__}')") + + return [self.get_example(i) for i in index] + + def __getitem__(self, idx: Union[int, np.integer, str, IndexType]) -> Any: + if (isinstance(idx, (int, np.integer)) + or (isinstance(idx, Tensor) and idx.ndim == 0) + or (isinstance(idx, np.ndarray) and np.isscalar(idx))): + return self.get_example(idx) + elif isinstance(idx, str) or (isinstance(idx, tuple) + and isinstance(idx[0], str)): + return super().__getitem__(idx) + else: + return self.index_select(idx) + + def to_data_list(self) -> List[BaseData]: + return [self.get_example(i) for i in range(self.num_graphs)] + + @property + def num_graphs(self) -> int: + if hasattr(self, '_num_graphs'): + return self._num_graphs + elif hasattr(self, 'ptr'): + return self.ptr.shape[0] - 1 + elif hasattr(self, 'batch'): + return int(self.batch.max()) + 1 + else: + raise ValueError("Cannot infer the number of graphs") + + @property + def batch_size(self) -> int: + return self.num_graphs + + def __len__(self) -> int: + return self.num_graphs + + def __reduce__(self) -> Any: + state = self.__dict__.copy() + return DynamicInheritanceGetter(), self.__class__.__bases__, state diff --git a/jointContribution/mattergen/paddle_geometric/data/collate.py b/jointContribution/mattergen/paddle_geometric/data/collate.py new file mode 100644 index 00000000..5d60ac16 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/collate.py @@ -0,0 +1,210 @@ +from collections import defaultdict +from collections.abc import Mapping, Sequence +from typing import ( + Any, + Dict, + Iterable, + List, + Optional, + Tuple, + Type, + TypeVar, + Union, +) + +import numpy as np +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import EdgeIndex, Index +from paddle_geometric.data.data import BaseData +from paddle_geometric.data.storage import BaseStorage, NodeStorage +from paddle_geometric.edge_index import SortOrder +from paddle_geometric.typing import ( + SparseTensor, + TensorFrame, + paddle_frame, + paddle_sparse, +) +from paddle_geometric.utils import cumsum, is_sparse, is_paddle_sparse_tensor +from paddle_geometric.utils.sparse import cat + +T = TypeVar('T') +SliceDictType = Dict[str, Union[Tensor, Dict[str, Tensor]]] +IncDictType = Dict[str, Union[Tensor, Dict[str, Tensor]]] + + +def collate( + cls: Type[T], + data_list: List[BaseData], + increment: bool = True, + add_batch: bool = True, + follow_batch: Optional[Iterable[str]] = None, + exclude_keys: Optional[Iterable[str]] = None, +) -> Tuple[T, SliceDictType, IncDictType]: + if not isinstance(data_list, (list, tuple)): + data_list = list(data_list) + + if cls != data_list[0].__class__: + out = cls(_base_cls=data_list[0].__class__) # type: ignore + else: + out = cls() + + out.stores_as(data_list[0]) # type: ignore + + follow_batch = set(follow_batch or []) + exclude_keys = set(exclude_keys or []) + + key_to_stores = defaultdict(list) + for data in data_list: + for store in data.stores: + key_to_stores[store._key].append(store) + + device: Optional[paddle.CPUPlace] = None + slice_dict: SliceDictType = {} + inc_dict: IncDictType = {} + for out_store in out.stores: # type: ignore + key = out_store._key + stores = key_to_stores[key] + for attr in stores[0].keys(): + + if attr in exclude_keys: + continue + + values = [store[attr] for store in stores] + + if attr == 'num_nodes': + out_store._num_nodes = values + out_store.num_nodes = sum(values) + continue + + if attr == 'ptr': + continue + + value, slices, incs = _collate(attr, values, data_list, stores, + increment) + + if isinstance(value, Tensor) and paddle.device.get_device() != 'cpu': + device = value.place + + out_store[attr] = value + + if key is not None: + store_slice_dict = slice_dict.get(key, {}) + assert isinstance(store_slice_dict, dict) + store_slice_dict[attr] = slices + slice_dict[key] = store_slice_dict + + store_inc_dict = inc_dict.get(key, {}) + assert isinstance(store_inc_dict, dict) + store_inc_dict[attr] = incs + inc_dict[key] = store_inc_dict + else: + slice_dict[attr] = slices + inc_dict[attr] = incs + + if attr in follow_batch: + batch, ptr = _batch_and_ptr(slices, device) + out_store[f'{attr}_batch'] = batch + out_store[f'{attr}_ptr'] = ptr + + if (add_batch and isinstance(stores[0], NodeStorage) + and stores[0].can_infer_num_nodes): + repeats = [store.num_nodes or 0 for store in stores] + out_store.batch = repeat_interleave(repeats, device=device) + out_store.ptr = cumsum(paddle.to_tensor(repeats)) + + return out, slice_dict, inc_dict + + +def _collate( + key: str, + values: List[Any], + data_list: List[BaseData], + stores: List[BaseStorage], + increment: bool, +) -> Tuple[Any, Any, Any]: + elem = values[0] + + if isinstance(elem, Tensor) and not is_sparse(elem): + key = str(key) + cat_dim = data_list[0].__cat_dim__(key, elem, stores[0]) + if cat_dim is None or elem.ndim == 0: + values = [value.unsqueeze(0) for value in values] + sizes = paddle.to_tensor([value.shape[cat_dim or 0] for value in values]) + slices = cumsum(sizes) + if increment: + incs = get_incs(key, values, data_list, stores) + if incs.ndim > 1 or int(incs[-1]) != 0: + values = [ + value + inc for value, inc in zip(values, incs) + ] + else: + incs = None + + value = paddle.concat(values, axis=cat_dim or 0) + + return value, slices, incs + + elif isinstance(elem, (int, float)): + value = paddle.to_tensor(values) + if increment: + incs = get_incs(key, values, data_list, stores) + if int(incs[-1]) != 0: + value += incs + else: + incs = None + slices = paddle.arange(len(values) + 1) + return value, slices, incs + + elif isinstance(elem, Mapping): + value_dict, slice_dict, inc_dict = {}, {}, {} + for k in elem.keys(): + value_dict[k], slice_dict[k], inc_dict[k] = _collate( + k, [v[k] for v in values], data_list, stores, increment) + return value_dict, slice_dict, inc_dict + + elif isinstance(elem, Sequence) and not isinstance(elem, str): + value_list, slice_list, inc_list = [], [], [] + for i in range(len(elem)): + value, slices, incs = _collate(key, [v[i] for v in values], + data_list, stores, increment) + value_list.append(value) + slice_list.append(slices) + inc_list.append(incs) + return value_list, slice_list, inc_list + + else: + slices = paddle.arange(len(values) + 1) + return values, slices, None + + +def _batch_and_ptr( + slices: Any, + device: Optional[paddle.CPUPlace] = None, +) -> Tuple[Any, Any]: + if isinstance(slices, Tensor) and slices.ndim == 1: + repeats = slices[1:] - slices[:-1] + batch = repeat_interleave(repeats.tolist(), device=device) + ptr = cumsum(repeats) + return batch, ptr + else: + return None, None + + +def repeat_interleave( + repeats: List[int], + device: Optional[paddle.CPUPlace] = None, +) -> Tensor: + outs = [paddle.full([n], i, dtype='int64') for i, n in enumerate(repeats)] + return paddle.concat(outs, axis=0) + + +def get_incs(key, values: List[Any], data_list: List[BaseData], + stores: List[BaseStorage]) -> Tensor: + repeats = [ + data.__inc__(key, value, store) + for value, data, store in zip(values, data_list, stores) + ] + return cumsum(paddle.to_tensor(repeats[:-1])) diff --git a/jointContribution/mattergen/paddle_geometric/data/data.py b/jointContribution/mattergen/paddle_geometric/data/data.py new file mode 100644 index 00000000..3997f467 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/data.py @@ -0,0 +1,1158 @@ +import copy +import warnings +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from itertools import chain +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Tuple, + Union, + overload, +) + +import numpy as np +import paddle +from paddle import Tensor +from typing_extensions import Self + +from paddle_geometric.data import EdgeAttr, FeatureStore, GraphStore, TensorAttr +from paddle_geometric.data.feature_store import _FieldStatus +from paddle_geometric.data.graph_store import EdgeLayout +from paddle_geometric.data.storage import ( + BaseStorage, + EdgeStorage, + GlobalStorage, + NodeStorage, +) +from paddle_geometric.deprecation import deprecated +from paddle_geometric.index import Index +from paddle_geometric.typing import ( + EdgeTensorType, + EdgeType, + FeatureTensorType, + NodeType, + OptTensor, + SparseTensor, + TensorFrame, +) +from paddle_geometric.utils import is_sparse, select, subgraph + +class BaseData: + def __getattr__(self, key: str) -> Any: + raise NotImplementedError + + def __setattr__(self, key: str, value: Any): + raise NotImplementedError + + def __delattr__(self, key: str): + raise NotImplementedError + + def __getitem__(self, key: str) -> Any: + raise NotImplementedError + + def __setitem__(self, key: str, value: Any): + raise NotImplementedError + + def __delitem__(self, key: str): + raise NotImplementedError + + def __copy__(self): + raise NotImplementedError + + def __deepcopy__(self, memo): + raise NotImplementedError + + def __repr__(self) -> str: + raise NotImplementedError + + def stores_as(self, data: "BaseData"): + raise NotImplementedError + + @property + def stores(self) -> List[Any]: + raise NotImplementedError + + @property + def node_stores(self) -> List[Any]: + raise NotImplementedError + + @property + def edge_stores(self) -> List[Any]: + raise NotImplementedError + + def to_dict(self) -> Dict[str, Any]: + r"""Returns a dictionary of stored key/value pairs.""" + raise NotImplementedError + + def to_namedtuple(self) -> NamedTuple: + r"""Returns a `NamedTuple` of stored key/value pairs.""" + raise NotImplementedError + + def update(self, data: "BaseData") -> "BaseData": + r"""Updates the data object with the elements from another data object. + Added elements will override existing ones (in case of duplicates). + """ + raise NotImplementedError + + def concat(self, data: "BaseData") -> "BaseData": + r"""Concatenates `self` with another `data` object. + All values need to have matching shapes at non-concatenation dimensions. + """ + out = copy.copy(self) + for store, other_store in zip(out.stores, data.stores): + store.concat(other_store) + return out + + def __cat_dim__(self, key: str, value: Any, *args, **kwargs) -> Any: + r"""Returns the dimension for which the value `value` of the + attribute `key` will get concatenated when creating mini-batches + using `paddle.io.DataLoader`. + + .. note:: + + This method is for internal use only, and should only be overridden + in case the mini-batch creation process is corrupted for a specific + attribute. + """ + raise NotImplementedError + + def __inc__(self, key: str, value: Any, *args, **kwargs) -> Any: + r"""Returns the incremental count to cumulatively increase the value + `value` of the attribute `key` when creating mini-batches + using `paddle.io.DataLoader`. + + .. note:: + + This method is for internal use only, and should only be overridden + in case the mini-batch creation process is corrupted for a specific + attribute. + """ + raise NotImplementedError + + def debug(self): + raise NotImplementedError + + ########################################################################### + + def keys(self) -> List[str]: + r"""Returns a list of all graph attribute names.""" + out = [] + for store in self.stores: + out += list(store.keys()) + return list(set(out)) + + def __len__(self) -> int: + r"""Returns the number of graph attributes.""" + return len(self.keys()) + + def __contains__(self, key: str) -> bool: + r"""Returns `True` if the attribute `key` is present in the data.""" + return key in self.keys() + + def __getstate__(self) -> Dict[str, Any]: + return self.__dict__ + + def __setstate__(self, mapping: Dict[str, Any]): + for key, value in mapping.items(): + self.__dict__[key] = value + + @property + def num_nodes(self) -> Optional[int]: + r"""Returns the number of nodes in the graph. + + .. note:: + The number of nodes in the data object is automatically inferred + in case node-level attributes are present, e.g., `data.x`. + In some cases, however, a graph may only be given without any + node-level attributes. + PyG then *guesses* the number of nodes according to + `edge_index.max().item() + 1`. + However, in case there exist isolated nodes, this number does not + have to be correct, which can result in unexpected behavior. + Thus, we recommend setting the number of nodes in your data object + explicitly via `data.num_nodes = ...`. + You will be given a warning that requests you to do so. + """ + try: + return sum([v.num_nodes for v in self.node_stores]) + except TypeError: + return None + + def size(self, dim: Optional[int] = None) -> Union[Tuple[Optional[int], Optional[int]], Optional[int]]: + r"""Returns the size of the adjacency matrix induced by the graph.""" + size = (self.num_nodes, self.num_nodes) + return size if dim is None else size[dim] + + @property + def num_edges(self) -> int: + r"""Returns the number of edges in the graph. + For undirected graphs, this will return the number of bi-directional + edges, which is double the amount of unique edges. + """ + return sum([v.num_edges for v in self.edge_stores]) + + def node_attrs(self) -> List[str]: + r"""Returns all node-level tensor attribute names.""" + return list(set(chain(*[s.node_attrs() for s in self.node_stores]))) + + def edge_attrs(self) -> List[str]: + r"""Returns all edge-level tensor attribute names.""" + return list(set(chain(*[s.edge_attrs() for s in self.edge_stores]))) + + @property + def node_offsets(self) -> Dict[str, int]: + out: Dict[str, int] = {} + offset: int = 0 + for store in self.node_stores: + out[store._key] = offset + offset += store.num_nodes + return out + + def generate_ids(self): + r"""Generates and sets `n_id` and `e_id` attributes to assign + each node and edge a continuously ascending and unique ID. + """ + for store in self.node_stores: + store.n_id = paddle.arange(store.num_nodes) + for store in self.edge_stores: + store.e_id = paddle.arange(store.num_edges) + + def is_sorted(self, sort_by_row: bool = True) -> bool: + r"""Returns `True` if edge indices `edge_index` are sorted. + + Args: + sort_by_row (bool, optional): If set to `False`, will require + column-wise order/by destination node order of + `edge_index`. (default: `True`) + """ + return all([store.is_sorted(sort_by_row) for store in self.edge_stores]) + + def sort(self, sort_by_row: bool = True) -> "BaseData": + r"""Sorts edge indices `edge_index` and their corresponding edge + features. + + Args: + sort_by_row (bool, optional): If set to `False`, will sort + `edge_index` in column-wise order/by destination node. + (default: `True`) + """ + out = copy.copy(self) + for store in out.edge_stores: + store.sort(sort_by_row) + return out + + def is_coalesced(self) -> bool: + r"""Returns `True` if edge indices `edge_index` are sorted + and do not contain duplicate entries. + """ + return all([store.is_coalesced() for store in self.edge_stores]) + + def coalesce(self) -> "BaseData": + r"""Sorts and removes duplicated entries from edge indices + `edge_index`. + """ + out = copy.copy(self) + for store in out.edge_stores: + store.coalesce() + return out + + def is_sorted_by_time(self) -> bool: + r"""Returns `True` if `time` is sorted.""" + return all([store.is_sorted_by_time() for store in self.stores]) + + def sort_by_time(self) -> "BaseData": + r"""Sorts data associated with `time` according to `time`.""" + out = copy.copy(self) + for store in out.stores: + store.sort_by_time() + return out + + def snapshot(self, start_time: Union[float, int], end_time: Union[float, int], attr: str = "time") -> "BaseData": + r"""Returns a snapshot of `data` to only hold events that occurred + in the period `[start_time, end_time]`. + """ + out = copy.copy(self) + for store in out.stores: + store.snapshot(start_time, end_time, attr) + return out + + def up_to(self, end_time: Union[float, int]) -> "BaseData": + r"""Returns a snapshot of `data` to only hold events that occurred + up to `end_time` (inclusive of `edge_time`). + """ + out = copy.copy(self) + for store in out.stores: + store.up_to(end_time) + return out + + def has_isolated_nodes(self) -> bool: + r"""Returns :obj:`True` if the graph contains isolated nodes.""" + return any([store.has_isolated_nodes() for store in self.edge_stores]) + + def has_self_loops(self) -> bool: + r"""Returns :obj:`True` if the graph contains self-loops.""" + return any([store.has_self_loops() for store in self.edge_stores]) + + def is_undirected(self) -> bool: + r"""Returns :obj:`True` if graph edges are undirected.""" + return all([store.is_undirected() for store in self.edge_stores]) + + def is_directed(self) -> bool: + r"""Returns :obj:`True` if graph edges are directed.""" + return not self.is_undirected() + + def apply_(self, func: Callable, *args: str): + r"""Applies the in-place function :obj:`func`, either to all attributes + or only the ones given in :obj:`*args`. + """ + for store in self.stores: + store.apply_(func, *args) + return self + + def apply(self, func: Callable, *args: str): + r"""Applies the function :obj:`func`, either to all attributes or only + the ones given in :obj:`*args`. + """ + for store in self.stores: + store.apply(func, *args) + return self + + def clone(self, *args: str): + r"""Performs cloning of tensors, either for all attributes or only the + ones given in :obj:`*args`. + """ + return copy.copy(self).apply(lambda x: x.clone(), *args) + + def contiguous(self, *args: str): + r"""Ensures a contiguous memory layout, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.contiguous(), *args) + + def to(self, device: Union[int, str], *args: str, non_blocking: bool = False): + r"""Performs tensor device conversion, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply( + lambda x: x.astype(device=device, non_blocking=non_blocking), *args + ) + + def cpu(self, *args: str): + r"""Copies attributes to CPU memory, either for all attributes or only + the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.cpu(), *args) + + def cuda(self, device: Optional[Union[int, str]] = None, *args: str, non_blocking: bool = False): + r"""Copies attributes to CUDA memory, either for all attributes or only + the ones given in :obj:`*args`. + """ + device = 'gpu' if device is None else device + return self.apply(lambda x: x.cuda(device, non_blocking=non_blocking), *args) + + def pin_memory(self, *args: str): + r"""Copies attributes to pinned memory, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.pin_memory(), *args) + + def share_memory_(self, *args: str): + r"""Moves attributes to shared memory, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply_(lambda x: x.share_memory_(), *args) + + def detach_(self, *args: str): + r"""Detaches attributes from the computation graph, either for all + attributes or only the ones given in :obj:`*args`. + """ + return self.apply_(lambda x: x.detach_(), *args) + + def detach(self, *args: str): + r"""Detaches attributes from the computation graph by creating a new + tensor, either for all attributes or only the ones given in + :obj:`*args`. + """ + return self.apply(lambda x: x.detach(), *args) + + def requires_grad_(self, *args: str, requires_grad: bool = True): + r"""Tracks gradient computation, either for all attributes or only the + ones given in :obj:`*args`. + """ + return self.apply_( + lambda x: x.requires_grad_(requires_grad=requires_grad), *args) + + def is_cuda(self) -> bool: + r"""Returns :obj:`True` if any :class:`paddle.Tensor` attribute is + stored on the GPU, :obj:`False` otherwise. + """ + for store in self.stores: + for value in store.values(): + if isinstance(value, paddle.Tensor) and value.place.is_gpu_place(): + return True + return False + + # Deprecated functions #################################################### + def contains_isolated_nodes(self) -> bool: + return self.has_isolated_nodes() + + def contains_self_loops(self) -> bool: + return self.has_self_loops() + + +############################################################################### + + +@dataclass +class DataTensorAttr(TensorAttr): + r"""Tensor attribute for `Data` without group name.""" + def __init__( + self, + attr_name=_FieldStatus.UNSET, + index=None, + ): + super().__init__(None, attr_name, index) + + +@dataclass +class DataEdgeAttr(EdgeAttr): + r"""Edge attribute class for `Data` without edge type.""" + def __init__( + self, + layout: Optional[EdgeLayout] = None, + is_sorted: bool = False, + size: Optional[Tuple[int, int]] = None, + ): + super().__init__(None, layout, is_sorted, size) + + +############################################################################### + + +class Data(BaseData, FeatureStore, GraphStore): + r"""A data object describing a homogeneous graph. + The data object can hold node-level, link-level and graph-level attributes. + In general, :class:`~paddle_geometric.data.Data` tries to mimic the + behavior of a regular :python:`Python` dictionary. + In addition, it provides useful functionality for analyzing graph + structures, and provides basic PyTorch tensor functionalities. + See `here `__ for the accompanying + tutorial. + + .. code-block:: python + + from paddle_geometric.data import Data + + data = Data(x=x, edge_index=edge_index, ...) + + # Add additional arguments to `data`: + data.train_idx = torch.tensor([...], dtype=torch.long) + data.test_mask = torch.tensor([...], dtype=torch.bool) + + # Analyzing the graph structure: + data.num_nodes + >>> 23 + + data.is_directed() + >>> False + + # PyTorch tensor functionality: + data = data.pin_memory() + data = data.to('cuda:0', non_blocking=True) + + Args: + x (torch.Tensor, optional): Node feature matrix with shape + :obj:`[num_nodes, num_node_features]`. (default: :obj:`None`) + edge_index (LongTensor, optional): Graph connectivity in COO format + with shape :obj:`[2, num_edges]`. (default: :obj:`None`) + edge_attr (torch.Tensor, optional): Edge feature matrix with shape + :obj:`[num_edges, num_edge_features]`. (default: :obj:`None`) + y (torch.Tensor, optional): Graph-level or node-level ground-truth + labels with arbitrary shape. (default: :obj:`None`) + pos (torch.Tensor, optional): Node position matrix with shape + :obj:`[num_nodes, num_dimensions]`. (default: :obj:`None`) + time (torch.Tensor, optional): The timestamps for each event with shape + :obj:`[num_edges]` or :obj:`[num_nodes]`. (default: :obj:`None`) + **kwargs (optional): Additional attributes. + """ + def __init__( + self, + x: Optional[Tensor] = None, + edge_index: OptTensor = None, + edge_attr: OptTensor = None, + y: Optional[Union[Tensor, int, float]] = None, + pos: OptTensor = None, + time: OptTensor = None, + **kwargs, + ): + # `Data` doesn't support group_name, so we need to adjust `TensorAttr` + # accordingly here to avoid requiring `group_name` to be set: + super().__init__(tensor_attr_cls=DataTensorAttr) + + # `Data` doesn't support edge_type, so we need to adjust `EdgeAttr` + # accordingly here to avoid requiring `edge_type` to be set: + GraphStore.__init__(self, edge_attr_cls=DataEdgeAttr) + + self.__dict__['_store'] = GlobalStorage(_parent=self) + + if x is not None: + self.x = x + if edge_index is not None: + self.edge_index = edge_index + if edge_attr is not None: + self.edge_attr = edge_attr + if y is not None: + self.y = y + if pos is not None: + self.pos = pos + if time is not None: + self.time = time + + for key, value in kwargs.items(): + setattr(self, key, value) + + def __getattr__(self, key: str) -> Any: + if '_store' not in self.__dict__: + raise RuntimeError( + "The 'data' object was created by an older version of PyG. " + "If this error occurred while loading an already existing " + "dataset, remove the 'processed/' directory in the dataset's " + "root folder and try again.") + return getattr(self._store, key) + + def __setattr__(self, key: str, value: Any): + propobj = getattr(self.__class__, key, None) + if propobj is not None and getattr(propobj, 'fset', None) is not None: + propobj.fset(self, value) + else: + setattr(self._store, key, value) + + def __delattr__(self, key: str): + delattr(self._store, key) + + # TODO consider supporting the feature store interface for + # __getitem__, __setitem__, and __delitem__ so, for example, we + # can accept key: Union[str, TensorAttr] in __getitem__. + def __getitem__(self, key: str) -> Any: + return self._store[key] + + def __setitem__(self, key: str, value: Any): + self._store[key] = value + + def __delitem__(self, key: str): + if key in self._store: + del self._store[key] + + def __copy__(self): + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = value + out.__dict__['_store'] = copy.copy(self._store) + out._store._parent = out + return out + + def __deepcopy__(self, memo): + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = copy.deepcopy(value, memo) + out._store._parent = out + return out + + def __repr__(self) -> str: + cls = self.__class__.__name__ + has_dict = any([isinstance(v, Mapping) for v in self._store.values()]) + + if not has_dict: + info = [size_repr(k, v) for k, v in self._store.items()] + info = ', '.join(info) + return f'{cls}({info})' + else: + info = [size_repr(k, v, indent=2) for k, v in self._store.items()] + info = ',\n'.join(info) + return f'{cls}(\n{info}\n)' + + + @property + def num_nodes(self) -> Optional[int]: + return super().num_nodes + + @num_nodes.setter + def num_nodes(self, num_nodes: Optional[int]): + self._store.num_nodes = num_nodes + + def stores_as(self, data: Self): + return self + + @property + def stores(self) -> List[BaseStorage]: + return [self._store] + + @property + def node_stores(self) -> List[NodeStorage]: + return [self._store] + + @property + def edge_stores(self) -> List[EdgeStorage]: + return [self._store] + + def to_dict(self) -> Dict[str, Any]: + return self._store.to_dict() + + def to_namedtuple(self) -> NamedTuple: + return self._store.to_namedtuple() + + def update(self, data: Union[Self, Dict[str, Any]]) -> Self: + for key, value in data.items(): + self[key] = value + return self + + def __cat_dim__(self, key: str, value: Any, *args, **kwargs) -> Any: + if is_sparse(value) and ('adj' in key or 'edge_index' in key): + return (0, 1) + elif 'index' in key or key == 'face': + return -1 + else: + return 0 + + def __inc__(self, key: str, value: Any, *args, **kwargs) -> Any: + if 'batch' in key and isinstance(value, Tensor): + if isinstance(value, Index): + return value.get_dim_size() + return int(value.max()) + 1 + elif 'index' in key or key == 'face': + return self.num_nodes + else: + return 0 + + def validate(self, raise_on_error: bool = True) -> bool: + r"""Validates the correctness of the data.""" + cls_name = self.__class__.__name__ + status = True + + num_nodes = self.num_nodes + if num_nodes is None: + status = False + warn_or_raise(f"'num_nodes' is undefined in '{cls_name}'", + raise_on_error) + + if 'edge_index' in self: + if self.edge_index.dim() != 2 or self.edge_index.size(0) != 2: + status = False + warn_or_raise( + f"'edge_index' needs to be of shape [2, num_edges] in " + f"'{cls_name}' (found {self.edge_index.size()})", + raise_on_error) + + if 'edge_index' in self and self.edge_index.numel() > 0: + if self.edge_index.min() < 0: + status = False + warn_or_raise( + f"'edge_index' contains negative indices in " + f"'{cls_name}' (found {int(self.edge_index.min())})", + raise_on_error) + + if num_nodes is not None and self.edge_index.max() >= num_nodes: + status = False + warn_or_raise( + f"'edge_index' contains larger indices than the number " + f"of nodes ({num_nodes}) in '{cls_name}' " + f"(found {int(self.edge_index.max())})", raise_on_error) + + return status + + def debug(self): + pass # TODO + + def is_node_attr(self, key: str) -> bool: + r"""Returns :obj:`True` if the object at key :obj:`key` denotes a + node-level tensor attribute. + """ + return self._store.is_node_attr(key) + + def is_edge_attr(self, key: str) -> bool: + r"""Returns :obj:`True` if the object at key :obj:`key` denotes an + edge-level tensor attribute. + """ + return self._store.is_edge_attr(key) + + def subgraph(self, subset: Tensor) -> Self: + r"""Returns the induced subgraph given by the node indices + :obj:`subset`. + + Args: + subset (LongTensor or BoolTensor): The nodes to keep. + """ + if 'edge_index' in self: + edge_index, _, edge_mask = subgraph( + subset, + self.edge_index, + relabel_nodes=True, + num_nodes=self.num_nodes, + return_edge_mask=True, + ) + else: + edge_index = None + edge_mask = paddle.ones( + shape=[self.num_edges], # shape should be a list or tuple in Paddle + dtype='bool', # Paddle uses 'bool' as the dtype for boolean tensors + place=subset.place # device is replaced with 'place' in Paddle + ) + + data = copy.copy(self) + + for key, value in self: + if key == 'edge_index': + data.edge_index = edge_index + elif key == 'num_nodes': + if subset.dtype == paddle.bool: + data.num_nodes = int(subset.sum()) + else: + data.num_nodes = subset.shape[0] + elif self.is_node_attr(key): + cat_dim = self.__cat_dim__(key, value) + data[key] = select(value, subset, dim=cat_dim) + elif self.is_edge_attr(key): + cat_dim = self.__cat_dim__(key, value) + data[key] = select(value, edge_mask, dim=cat_dim) + + return data + + def edge_subgraph(self, subset: Tensor) -> Self: + r"""Returns the induced subgraph given by the edge indices + :obj:`subset`. + Will currently preserve all the nodes in the graph, even if they are + isolated after subgraph computation. + + Args: + subset (LongTensor or BoolTensor): The edges to keep. + """ + data = copy.copy(self) + + for key, value in self: + if self.is_edge_attr(key): + cat_dim = self.__cat_dim__(key, value) + data[key] = select(value, subset, dim=cat_dim) + + return data + + def to_heterogeneous( + self, + node_type: Optional[Tensor] = None, + edge_type: Optional[Tensor] = None, + node_type_names: Optional[List[NodeType]] = None, + edge_type_names: Optional[List[EdgeType]] = None, + ): + r"""Converts a :class:`~paddle_geometric.data.Data` object to a + heterogeneous :class:`~paddle_geometric.data.HeteroData` object. + For this, node and edge attributes are splitted according to the + node-level and edge-level vectors :obj:`node_type` and + :obj:`edge_type`, respectively. + :obj:`node_type_names` and :obj:`edge_type_names` can be used to give + meaningful node and edge type names, respectively. + That is, the node_type :obj:`0` is given by :obj:`node_type_names[0]`. + If the :class:`~paddle_geometric.data.Data` object was constructed via + :meth:`~paddle_geometric.data.HeteroData.to_homogeneous`, the object can + be reconstructed without any need to pass in additional arguments. + + Args: + node_type (torch.Tensor, optional): A node-level vector denoting + the type of each node. (default: :obj:`None`) + edge_type (torch.Tensor, optional): An edge-level vector denoting + the type of each edge. (default: :obj:`None`) + node_type_names (List[str], optional): The names of node types. + (default: :obj:`None`) + edge_type_names (List[Tuple[str, str, str]], optional): The names + of edge types. (default: :obj:`None`) + """ + from paddle_geometric.data import HeteroData + + if node_type is None: + node_type = self._store.get('node_type', None) + if node_type is None: + node_type = paddle.zeros(self.num_nodes, dtype=paddle.int64) + + if node_type_names is None: + store = self._store + node_type_names = store.__dict__.get('_node_type_names', None) + if node_type_names is None: + node_type_names = [str(i) for i in paddle.unique(node_type).tolist()] + + if edge_type is None: + edge_type = self._store.get('edge_type', None) + if edge_type is None: + edge_type = paddle.zeros(self.num_edges, dtype=paddle.int64) + + if edge_type_names is None: + store = self._store + edge_type_names = store.__dict__.get('_edge_type_names', None) + if edge_type_names is None: + edge_type_names = [] + edge_index = self.edge_index + for i in edge_type.unique().tolist(): + src, dst = edge_index[:, edge_type == i] + src_types = node_type[src].unique().tolist() + dst_types = node_type[dst].unique().tolist() + if len(src_types) != 1 and len(dst_types) != 1: + raise ValueError( + "Could not construct a 'HeteroData' object from the " + "'Data' object because single edge types span over " + "multiple node types") + edge_type_names.append((node_type_names[src_types[0]], str(i), + node_type_names[dst_types[0]])) + + # We iterate over node types to find the local node indices belonging + # to each node type. Furthermore, we create a global `index_map` vector + # that maps global node indices to local ones in the final + # heterogeneous graph: + node_ids, index_map = {}, paddle.empty_like(node_type) + + for i, key in enumerate(node_type_names): + node_ids[i] = paddle.nonzero(node_type == i, as_tuple=False).view(-1) + index_map[node_ids[i]] = paddle.arange(len(node_ids[i]), device=index_map.device) + + # We iterate over edge types to find the local edge indices: + edge_ids = {} + for i, key in enumerate(edge_type_names): + edge_ids[i] = (edge_type == i).nonzero(as_tuple=False).view(-1) + + data = HeteroData() + + for i, key in enumerate(node_type_names): + for attr, value in self.items(): + if attr in {'node_type', 'edge_type', 'ptr'}: + continue + elif isinstance(value, Tensor) and self.is_node_attr(attr): + cat_dim = self.__cat_dim__(attr, value) + data[key][attr] = value.index_select(cat_dim, node_ids[i]) + elif (isinstance(value, TensorFrame) + and self.is_node_attr(attr)): + data[key][attr] = value[node_ids[i]] + + if len(data[key]) == 0: + data[key].num_nodes = node_ids[i].size(0) + + for i, key in enumerate(edge_type_names): + src, _, dst = key + for attr, value in self.items(): + if attr in {'node_type', 'edge_type', 'ptr'}: + continue + elif attr == 'edge_index': + edge_index = value[:, edge_ids[i]] + edge_index[0] = index_map[edge_index[0]] + edge_index[1] = index_map[edge_index[1]] + data[key].edge_index = edge_index + elif isinstance(value, Tensor) and self.is_edge_attr(attr): + cat_dim = self.__cat_dim__(attr, value) + data[key][attr] = value.index_select(cat_dim, edge_ids[i]) + elif (isinstance(value, TensorFrame) + and self.is_edge_attr(attr)): + data[key][attr] = value[edge_ids[i]] + + # Add global attributes. + exclude_keys = set(data.keys()) | { + 'node_type', 'edge_type', 'edge_index', 'num_nodes', 'ptr' + } + for attr, value in self.items(): + if attr in exclude_keys: + continue + data[attr] = value + + return data + + ########################################################################### + + @classmethod + def from_dict(cls, mapping: Dict[str, Any]) -> Self: + r"""Creates a :class:`~paddle_geometric.data.Data` object from a + dictionary. + """ + return cls(**mapping) + + @property + def num_node_features(self) -> int: + r"""Returns the number of features per node in the graph.""" + return self._store.num_node_features + + @property + def num_features(self) -> int: + r"""Returns the number of features per node in the graph. + Alias for :py:attr:`~num_node_features`. + """ + return self.num_node_features + + @property + def num_edge_features(self) -> int: + r"""Returns the number of features per edge in the graph.""" + return self._store.num_edge_features + + @property + def num_node_types(self) -> int: + r"""Returns the number of node types in the graph.""" + return int(self.node_type.max()) + 1 if 'node_type' in self else 1 + + @property + def num_edge_types(self) -> int: + r"""Returns the number of edge types in the graph.""" + return int(self.edge_type.max()) + 1 if 'edge_type' in self else 1 + + def __iter__(self) -> Iterable: + r"""Iterates over all attributes in the data, yielding their attribute + names and values. + """ + yield from self._store.items() + + def __call__(self, *args: str) -> Iterable: + r"""Iterates over all attributes :obj:`*args` in the data, yielding + their attribute names and values. + If :obj:`*args` is not given, will iterate over all attributes. + """ + yield from self._store.items(*args) + + @property + def x(self) -> Optional[Tensor]: + return self['x'] if 'x' in self._store else None + + @x.setter + def x(self, x: Optional[Tensor]): + self._store.x = x + + @property + def edge_index(self) -> Optional[Tensor]: + return self['edge_index'] if 'edge_index' in self._store else None + + @edge_index.setter + def edge_index(self, edge_index: Optional[Tensor]): + self._store.edge_index = edge_index + + @property + def edge_weight(self) -> Optional[Tensor]: + return self['edge_weight'] if 'edge_weight' in self._store else None + + @edge_weight.setter + def edge_weight(self, edge_weight: Optional[Tensor]): + self._store.edge_weight = edge_weight + + @property + def edge_attr(self) -> Optional[Tensor]: + return self['edge_attr'] if 'edge_attr' in self._store else None + + @edge_attr.setter + def edge_attr(self, edge_attr: Optional[Tensor]): + self._store.edge_attr = edge_attr + + @property + def y(self) -> Optional[Union[Tensor, int, float]]: + return self['y'] if 'y' in self._store else None + + @y.setter + def y(self, y: Optional[Tensor]): + self._store.y = y + + @property + def pos(self) -> Optional[Tensor]: + return self['pos'] if 'pos' in self._store else None + + @pos.setter + def pos(self, pos: Optional[Tensor]): + self._store.pos = pos + + @property + def batch(self) -> Optional[Tensor]: + return self['batch'] if 'batch' in self._store else None + + @batch.setter + def batch(self, batch: Optional[Tensor]): + self._store.batch = batch + + @property + def time(self) -> Optional[Tensor]: + return self['time'] if 'time' in self._store else None + + @time.setter + def time(self, time: Optional[Tensor]): + self._store.time = time + + @property + def face(self) -> Optional[Tensor]: + return self['face'] if 'face' in self._store else None + + @face.setter + def face(self, face: Optional[Tensor]): + self._store.face = face + + # Deprecated functions #################################################### + + @property + @deprecated(details="use 'data.face.size(-1)' instead") + def num_faces(self) -> Optional[int]: + r"""Returns the number of faces in the mesh.""" + if 'face' in self._store and isinstance(self.face, Tensor): + return self.face.size(self.__cat_dim__('face', self.face)) + return None + + # FeatureStore interface ################################################## + + def _put_tensor(self, tensor: FeatureTensorType, attr: TensorAttr) -> bool: + out = self.get(attr.attr_name) + if out is not None and attr.index is not None: + out[attr.index] = tensor + else: + assert attr.index is None + setattr(self, attr.attr_name, tensor) + return True + + def _get_tensor(self, attr: TensorAttr) -> Optional[FeatureTensorType]: + tensor = getattr(self, attr.attr_name, None) + if tensor is not None: + # TODO this behavior is a bit odd, since TensorAttr requires that + # we set `index`. So, we assume here that indexing by `None` is + # equivalent to not indexing at all, which is not in line with + # Python semantics. + return tensor[attr.index] if attr.index is not None else tensor + return None + + def _remove_tensor(self, attr: TensorAttr) -> bool: + if hasattr(self, attr.attr_name): + delattr(self, attr.attr_name) + return True + return False + + def _get_tensor_size(self, attr: TensorAttr) -> Tuple: + return self._get_tensor(attr).size() + + def get_all_tensor_attrs(self) -> List[TensorAttr]: + r"""Obtains all feature attributes stored in `Data`.""" + return [ + TensorAttr(attr_name=name) for name in self._store.keys() + if self._store.is_node_attr(name) + ] + + # GraphStore interface #################################################### + + def _put_edge_index(self, edge_index: EdgeTensorType, + edge_attr: EdgeAttr) -> bool: + if not hasattr(self, '_edge_attrs'): + self._edge_attrs = {} + self._edge_attrs[edge_attr.layout] = edge_attr + + row, col = edge_index + + if edge_attr.layout == EdgeLayout.COO: + self.edge_index = paddle.concat([row.unsqueeze(0), col.unsqueeze(0)], axis=0) + elif edge_attr.layout == EdgeLayout.CSR: + self.adj = SparseTensor( + rowptr=row, + col=col, + sparse_sizes=edge_attr.size, + is_sorted=True, + trust_data=True, + ) + else: # edge_attr.layout == EdgeLayout.CSC: + size = edge_attr.size[::-1] if edge_attr.size is not None else None + self.adj_t = SparseTensor( + rowptr=col, + col=row, + sparse_sizes=size, + is_sorted=True, + trust_data=True, + ) + return True + + def _get_edge_index(self, edge_attr: EdgeAttr) -> Optional[EdgeTensorType]: + if edge_attr.size is None: + edge_attr.size = self.size() # Modify in-place. + + if edge_attr.layout == EdgeLayout.COO and 'edge_index' in self: + row, col = self.edge_index + return row, col + elif edge_attr.layout == EdgeLayout.CSR and 'adj' in self: + rowptr, col, _ = self.adj.csr() + return rowptr, col + elif edge_attr.layout == EdgeLayout.CSC and 'adj_t' in self: + colptr, row, _ = self.adj_t.csr() + return row, colptr + return None + + def _remove_edge_index(self, edge_attr: EdgeAttr) -> bool: + if edge_attr.layout == EdgeLayout.COO and 'edge_index' in self: + del self.edge_index + if hasattr(self, '_edge_attrs'): + self._edge_attrs.pop(EdgeLayout.COO, None) + return True + elif edge_attr.layout == EdgeLayout.CSR and 'adj' in self: + del self.adj + if hasattr(self, '_edge_attrs'): + self._edge_attrs.pop(EdgeLayout.CSR, None) + return True + elif edge_attr.layout == EdgeLayout.CSC and 'adj_t' in self: + del self.adj_t + if hasattr(self, '_edge_attrs'): + self._edge_attrs.pop(EdgeLayout.CSC, None) + return True + return False + + def get_all_edge_attrs(self) -> List[EdgeAttr]: + edge_attrs = getattr(self, '_edge_attrs', {}) + + if 'edge_index' in self and EdgeLayout.COO not in edge_attrs: + edge_attrs[EdgeLayout.COO] = DataEdgeAttr('coo', is_sorted=False) + if 'adj' in self and EdgeLayout.CSR not in edge_attrs: + size = self.adj.sparse_sizes() + edge_attrs[EdgeLayout.CSR] = DataEdgeAttr('csr', size=size) + if 'adj_t' in self and EdgeLayout.CSC not in edge_attrs: + size = self.adj_t.sparse_sizes()[::-1] + edge_attrs[EdgeLayout.CSC] = DataEdgeAttr('csc', size=size) + + return list(edge_attrs.values()) + + +############################################################################### + + +def size_repr(key: Any, value: Any, indent: int = 0) -> str: + pad = ' ' * indent + if isinstance(value, Tensor) and value.dim() == 0: + out = value.item() + elif isinstance(value, Tensor) and getattr(value, 'is_nested', False): + out = str(list(value.to_padded_tensor(padding=0.0).size())) + elif isinstance(value, Tensor): + out = str(list(value.shape)) + elif isinstance(value, np.ndarray): + out = str(list(value.shape)) + elif isinstance(value, SparseTensor): + out = str(value.shape)[:-1] + f', nnz={value.nnz()}]' + elif isinstance(value, TensorFrame): + out = (f'{value.__class__.__name__}(' + f'[{value.num_rows}, {value.num_cols}])') + elif isinstance(value, str): + out = f"'{value}'" + elif isinstance(value, (Sequence, set)): + out = str([len(value)]) + elif isinstance(value, Mapping) and len(value) == 0: + out = '{}' + elif (isinstance(value, Mapping) and len(value) == 1 + and not isinstance(list(value.values())[0], Mapping)): + lines = [size_repr(k, v, 0) for k, v in value.items()] + out = '{ ' + ', '.join(lines) + ' }' + elif isinstance(value, Mapping): + lines = [size_repr(k, v, indent + 2) for k, v in value.items()] + out = '{\n' + ',\n'.join(lines) + ',\n' + pad + '}' + else: + out = str(value) + + key = str(key).replace("'", '') + return f'{pad}{key}={out}' + + +def warn_or_raise(msg: str, raise_on_error: bool = True): + if raise_on_error: + raise ValueError(msg) + else: + warnings.warn(msg) diff --git a/jointContribution/mattergen/paddle_geometric/data/database.py b/jointContribution/mattergen/paddle_geometric/data/database.py new file mode 100644 index 00000000..0d8e6593 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/database.py @@ -0,0 +1,253 @@ +import io +import warnings +from abc import ABC, abstractmethod +from dataclasses import dataclass +from functools import cached_property +from typing import Any, Dict, List, Optional, Sequence, Tuple, Union + +import paddle +from paddle import Tensor +from tqdm import tqdm +import pickle # Used for serializing and deserializing complex objects + + +@dataclass +class TensorInfo: + """Describes the type information of a tensor, including data type, size, + whether it's an index or an edge index.""" + dtype: paddle.dtype + size: Tuple[int, ...] = (-1,) + is_index: bool = False + is_edge_index: bool = False + + def __post_init__(self) -> None: + # A tensor cannot be both an index and an edge index simultaneously + if self.is_index and self.is_edge_index: + raise ValueError("Tensor cannot be both 'Index' and 'EdgeIndex' at the same time.") + if self.is_index: + self.size = (-1,) # Dynamic size for index tensors + if self.is_edge_index: + self.size = (2, -1) # Edge indices are two-dimensional + + +def maybe_cast_to_tensor_info(value: Any) -> Union[Any, TensorInfo]: + """Converts input to TensorInfo if it meets the criteria.""" + if not isinstance(value, dict): + return value + if len(value) < 1 or len(value) > 3: + return value + if 'dtype' not in value: + return value + valid_keys = {'dtype', 'size', 'is_index', 'is_edge_index'} + if len(set(value.keys()) | valid_keys) != len(valid_keys): + return value + return TensorInfo(**value) + + +Schema = Union[Any, Dict[str, Any], Tuple[Any], List[Any]] + + +class Database(ABC): + """Abstract base class for a database that supports inserting and retrieving data. + + A database acts as an index-based key-value store for tensors and other custom data. + """ + def __init__(self, schema: Schema = object) -> None: + schema_dict = self._to_dict(schema) + self.schema: Dict[Union[str, int], Any] = schema_dict + + @abstractmethod + def insert(self, index: int, data: Any) -> None: + """Insert data at a specified index.""" + raise NotImplementedError + + def multi_insert(self, indices: Union[Sequence[int], slice], data_list: Sequence[Any]) -> None: + """Insert multiple data entries at specified indices.""" + if isinstance(indices, slice): + indices = self.slice_to_range(indices) + for index, data in zip(indices, data_list): + self.insert(index, data) + + @abstractmethod + def get(self, index: int) -> Any: + """Retrieve data from a specified index.""" + raise NotImplementedError + + def multi_get(self, indices: Union[Sequence[int], slice]) -> List[Any]: + """Retrieve data from multiple indices.""" + if isinstance(indices, slice): + indices = self.slice_to_range(indices) + return [self.get(index) for index in indices] + + @staticmethod + def _to_dict(value: Any) -> Dict[Union[str, int], Any]: + """Convert the input value to a dictionary.""" + if isinstance(value, dict): + return value + if isinstance(value, (tuple, list)): + return {i: v for i, v in enumerate(value)} + return {0: value} + + def slice_to_range(self, indices: slice) -> range: + """Convert a slice object into a range object.""" + start = indices.start or 0 + stop = indices.stop or len(self) + step = indices.step or 1 + return range(start, stop, step) + + def __len__(self) -> int: + """Return the number of entries in the database.""" + raise NotImplementedError + + def __getitem__(self, key: Union[int, Sequence[int], slice]) -> Union[Any, List[Any]]: + """Retrieve data using index or slice.""" + if isinstance(key, int): + return self.get(key) + return self.multi_get(key) + + def __setitem__(self, key: Union[int, Sequence[int], slice], value: Union[Any, Sequence[Any]]) -> None: + """Insert data using index or slice.""" + if isinstance(key, int): + self.insert(key, value) + else: + self.multi_insert(key, value) + + def __repr__(self) -> str: + try: + return f"{self.__class__.__name__}({len(self)})" + except NotImplementedError: + return f"{self.__class__.__name__}()" + + +class SQLiteDatabase(Database): + """An SQLite-based key-value database implementation. + + Uses SQLite to store tensors and other data types. + """ + def __init__(self, path: str, name: str, schema: Schema = object) -> None: + super().__init__(schema) + import sqlite3 + self.path = path + self.name = name + self._connection: Optional[sqlite3.Connection] = None + self._cursor: Optional[sqlite3.Cursor] = None + self.connect() + + # Create table if it does not exist + schema_str = ", ".join( + f"{key} BLOB NOT NULL" for key in self.schema.keys() + ) + query = f"CREATE TABLE IF NOT EXISTS {self.name} (id INTEGER PRIMARY KEY, {schema_str})" + self.cursor.execute(query) + + def connect(self) -> None: + """Connect to the SQLite database.""" + import sqlite3 + self._connection = sqlite3.connect(self.path) + self._cursor = self._connection.cursor() + + def close(self) -> None: + """Close the database connection.""" + if self._connection is not None: + self._connection.commit() + self._connection.close() + self._connection = None + self._cursor = None + + @property + def connection(self) -> Any: + """Return the database connection object.""" + if self._connection is None: + raise RuntimeError("No open database connection") + return self._connection + + @property + def cursor(self) -> Any: + """Return the database cursor object.""" + if self._cursor is None: + raise RuntimeError("No open database connection") + return self._cursor + + def insert(self, index: int, data: Any) -> None: + """Insert a single data entry.""" + query = f"INSERT INTO {self.name} (id, {', '.join(self.schema.keys())}) VALUES (?, {', '.join(['?'] * len(self.schema))})" + self.cursor.execute(query, (index, *self._serialize(data))) + self.connection.commit() + + def get(self, index: int) -> Any: + """Retrieve a single data entry.""" + query = f"SELECT {', '.join(self.schema.keys())} FROM {self.name} WHERE id = ?" + self.cursor.execute(query, (index,)) + row = self.cursor.fetchone() + if row is None: + raise KeyError(f"Index {index} not found in database") + return self._deserialize(row) + + def __len__(self) -> int: + """Get the total number of entries in the database.""" + query = f"SELECT COUNT(*) FROM {self.name}" + self.cursor.execute(query) + return self.cursor.fetchone()[0] + + def _serialize(self, data: Any) -> List[bytes]: + """Serialize data into a byte stream.""" + return [pickle.dumps(data.get(key)) for key in self.schema.keys()] + + def _deserialize(self, row: Tuple[bytes]) -> Dict[str, Any]: + """Deserialize a byte stream into original data.""" + return {key: pickle.loads(value) for key, value in zip(self.schema.keys(), row)} + + +class RocksDatabase(Database): + """A RocksDB-based key-value database implementation. + + Uses RocksDB to store tensors and other data types. + """ + def __init__(self, path: str, schema: Schema = object) -> None: + super().__init__(schema) + import rocksdict + + self.path = path + self._db: Optional[rocksdict.Rdict] = None + self.connect() + + def connect(self) -> None: + """Connect to the RocksDB database.""" + import rocksdict + self._db = rocksdict.Rdict(self.path, options=rocksdict.Options(raw_mode=True)) + + def close(self) -> None: + """Close the database connection.""" + if self._db is not None: + self._db.close() + self._db = None + + @property + def db(self) -> Any: + """Return the database object.""" + if self._db is None: + raise RuntimeError("No open database connection") + return self._db + + @staticmethod + def to_key(index: int) -> bytes: + """Convert an integer index to bytes.""" + return index.to_bytes(8, byteorder="big", signed=True) + + def insert(self, index: int, data: Any) -> None: + """Insert a single data entry.""" + self.db[self.to_key(index)] = self._serialize(data) + + def get(self, index: int) -> Any: + """Retrieve a single data entry.""" + return self._deserialize(self.db[self.to_key(index)]) + + def _serialize(self, data: Any) -> bytes: + """Serialize data into a byte stream.""" + buffer = io.BytesIO() + pickle.dump(data, buffer) + return buffer.getvalue() + + def _deserialize(self, row: bytes) -> Any: + """Deserialize a byte stream into original data.""" + return pickle.loads(row) diff --git a/jointContribution/mattergen/paddle_geometric/data/datapipes.py b/jointContribution/mattergen/paddle_geometric/data/datapipes.py new file mode 100644 index 00000000..aff5891b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/datapipes.py @@ -0,0 +1,151 @@ +import copy +from typing import Any, Callable, Iterator, Optional, Sequence + +import paddle + +from paddle_geometric.data import Batch +from paddle_geometric.utils import from_smiles + +try: + from paddle.io import DataPipe, functional_datapipe + from paddle.io.datapipes.iter import Batcher as IterBatcher +except ImportError: + DataPipe = IterBatcher = object # Fallback in case of missing dependency + + def functional_datapipe(name: str) -> Callable: + return lambda cls: cls + + +@functional_datapipe('batch_graphs') +class Batcher(IterBatcher): + """ + A custom batching DataPipe to create batches of graphs. + + Args: + dp (DataPipe): Input DataPipe. + batch_size (int): Size of each batch. + drop_last (bool): Whether to drop the last incomplete batch. + """ + def __init__( + self, + dp: DataPipe, + batch_size: int, + drop_last: bool = False, + ) -> None: + super().__init__( + dp, + batch_size=batch_size, + drop_last=drop_last, + wrapper_class=Batch.from_data_list, + ) + + +@functional_datapipe('parse_smiles') +class SMILESParser(DataPipe): + """ + A DataPipe to parse SMILES strings into graph data. + + Args: + dp (DataPipe): Input DataPipe containing SMILES strings. + smiles_key (str): The key for SMILES strings in input dictionaries. + target_key (Optional[str]): The key for target values in input dictionaries. + """ + def __init__( + self, + dp: DataPipe, + smiles_key: str = 'smiles', + target_key: Optional[str] = None, + ) -> None: + super().__init__() + self.dp = dp + self.smiles_key = smiles_key + self.target_key = target_key + + def __iter__(self) -> Iterator: + for d in self.dp: + if isinstance(d, str): + # Parse SMILES string directly + data = from_smiles(d) + elif isinstance(d, dict): + # Parse SMILES from dictionary + data = from_smiles(d[self.smiles_key]) + if self.target_key is not None: + y = d.get(self.target_key, None) + if y is not None: + y = float(y) if len(y) > 0 else float('NaN') + data.y = paddle.to_tensor([y], dtype=paddle.float32) + else: + raise ValueError( + f"'{self.__class__.__name__}' expects either a string or " + f"a dictionary as input (got '{type(d)}')" + ) + yield data + + +class DatasetAdapter(DataPipe): + """ + Adapts a dataset for usage with DataPipes. + + Args: + dataset (Sequence[Any]): The input dataset to wrap. + """ + def __init__(self, dataset: Sequence[Any]) -> None: + super().__init__() + self.dataset = dataset + self.range = range(len(self)) + + def is_shardable(self) -> bool: + """Indicates whether the dataset can be sharded.""" + return True + + def apply_sharding(self, num_shards: int, shard_idx: int) -> None: + """Applies sharding to the dataset.""" + self.range = range(shard_idx, len(self), num_shards) + + def __iter__(self) -> Iterator: + for i in self.range: + yield self.dataset[i] + + def __len__(self) -> int: + """Returns the length of the dataset.""" + return len(self.dataset) + + +def functional_transform(name: str) -> Callable: + """ + A decorator to wrap classes into functional transforms for DataPipes. + + Args: + name (str): The name to register the functional transform. + + Returns: + Callable: The wrapper function. + """ + def wrapper(cls: Any) -> Any: + @functional_datapipe(name) + class DynamicMapper(DataPipe): + """ + Dynamically maps a transformation function onto DataPipe elements. + + Args: + dp (DataPipe): The input DataPipe. + *args (Any): Arguments for the transformation function. + **kwargs (Any): Keyword arguments for the transformation function. + """ + def __init__( + self, + dp: DataPipe, + *args: Any, + **kwargs: Any, + ) -> None: + super().__init__() + self.dp = dp + self.fn = cls(*args, **kwargs) + + def __iter__(self) -> Iterator: + for data in self.dp: + yield self.fn(copy.copy(data)) + + return cls + + return wrapper diff --git a/jointContribution/mattergen/paddle_geometric/data/dataset.py b/jointContribution/mattergen/paddle_geometric/data/dataset.py new file mode 100644 index 00000000..6810e83e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/dataset.py @@ -0,0 +1,449 @@ +import copy +import os.path as osp +import re +import sys +import warnings +from collections.abc import Sequence +from typing import ( + Any, + Callable, + Iterable, + Iterator, + List, + Optional, + Tuple, + Union, +) + + +import paddle +import numpy as np +from paddle import Tensor + +from paddle_geometric.data.data import BaseData +from paddle_geometric.io import fs + +IndexType = Union[slice, Tensor, np.ndarray, Sequence] +MISSING = '???' + + +class Dataset(paddle.io.Dataset): + r"""Dataset base class for creating graph datasets. + See `here `__ for the accompanying tutorial. + + Args: + root (str, optional): Root directory where the dataset should be saved. + (optional: :obj:`None`) + transform (callable, optional): A function/transform that takes in a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + transformed version. + The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + a :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + transformed version. + The data object will be transformed before being saved to disk. + (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + boolean value, indicating whether the data object should be + included in the final dataset. (default: :obj:`None`) + log (bool, optional): Whether to print any console output while + downloading and processing the dataset. (default: :obj:`True`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + @property + def raw_file_names(self) -> Union[str, List[str], Tuple[str, ...]]: + r"""The name of the files in the :obj:`self.raw_dir` folder that must + be present in order to skip downloading. + """ + raise NotImplementedError + + @property + def processed_file_names(self) -> Union[str, List[str], Tuple[str, ...]]: + r"""The name of the files in the :obj:`self.processed_dir` folder that + must be present in order to skip processing. + """ + raise NotImplementedError + + def download(self) -> None: + r"""Downloads the dataset to the :obj:`self.raw_dir` folder.""" + raise NotImplementedError + + def process(self) -> None: + r"""Processes the dataset to the :obj:`self.processed_dir` folder.""" + raise NotImplementedError + + def len(self) -> int: + r"""Returns the number of data objects stored in the dataset.""" + raise NotImplementedError + + def get(self, idx: int) -> BaseData: + r"""Gets the data object at index :obj:`idx`.""" + raise NotImplementedError + + def __init__( + self, + root: Optional[str] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + log: bool = True, + force_reload: bool = False, + ) -> None: + super().__init__() + + if isinstance(root, str): + root = osp.expanduser(fs.normpath(root)) + + self.root = root or MISSING + self.transform = transform + self.pre_transform = pre_transform + self.pre_filter = pre_filter + self.log = log + self._indices: Optional[Sequence] = None + self.force_reload = force_reload + + if self.has_download: + self._download() + + if self.has_process: + self._process() + + def indices(self) -> Sequence: + return range(self.len()) if self._indices is None else self._indices + + @property + def raw_dir(self) -> str: + return osp.join(self.root, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, 'processed') + + @property + def num_node_features(self) -> int: + r"""Returns the number of features per node in the dataset.""" + data = self[0] + # Do not fill cache for `InMemoryDataset`: + if hasattr(self, '_data_list') and self._data_list is not None: + self._data_list[0] = None + data = data[0] if isinstance(data, tuple) else data + if hasattr(data, 'num_node_features'): + return data.num_node_features + raise AttributeError(f"'{data.__class__.__name__}' object has no " + f"attribute 'num_node_features'") + + @property + def num_features(self) -> int: + r"""Returns the number of features per node in the dataset. + Alias for :py:attr:`~num_node_features`. + """ + return self.num_node_features + + @property + def num_edge_features(self) -> int: + r"""Returns the number of features per edge in the dataset.""" + data = self[0] + # Do not fill cache for `InMemoryDataset`: + if hasattr(self, '_data_list') and self._data_list is not None: + self._data_list[0] = None + data = data[0] if isinstance(data, tuple) else data + if hasattr(data, 'num_edge_features'): + return data.num_edge_features + raise AttributeError(f"'{data.__class__.__name__}' object has no " + f"attribute 'num_edge_features'") + + def _infer_num_classes(self, y: Optional[Tensor]) -> int: + if y is None: + return 0 + elif y.numel() == y.shape[0] and not paddle.is_floating_point(y): + return int(paddle.max(y)) + 1 + elif y.numel() == y.shape[0] and paddle.is_floating_point(y): + num_classes = paddle.unique(y).shape[0] + if num_classes > 2: + warnings.warn("Found floating-point labels while calling " + "`dataset.num_classes`. Returning the number of " + "unique elements. Please make sure that this " + "is expected before proceeding.") + return num_classes + else: + return y.size(-1) + + @property + def num_classes(self) -> int: + r"""Returns the number of classes in the dataset.""" + # We iterate over the dataset and collect all labels to determine the + # maximum number of classes. Importantly, in rare cases, `__getitem__` + # may produce a tuple of data objects (e.g., when used in combination + # with `RandomLinkSplit`, so we take care of this case here as well: + data_list = _get_flattened_data_list([data for data in self]) + if 'y' in data_list[0] and isinstance(data_list[0].y, paddle.Tensor): + y = paddle.concat([data.y for data in data_list if 'y' in data], axis=0) + else: + y = paddle.to_tensor([data.y for data in data_list if 'y' in data]) + + # Do not fill cache for `InMemoryDataset`: + if hasattr(self, '_data_list') and self._data_list is not None: + self._data_list = self.len() * [None] + return self._infer_num_classes(y) + + @property + def raw_paths(self) -> List[str]: + r"""The absolute filepaths that must be present in order to skip + downloading. + """ + files = self.raw_file_names + # Prevent a common source of error in which `file_names` are not + # defined as a property. + if isinstance(files, Callable): + files = files() + return [osp.join(self.raw_dir, f) for f in to_list(files)] + + @property + def processed_paths(self) -> List[str]: + r"""The absolute filepaths that must be present in order to skip + processing. + """ + files = self.processed_file_names + # Prevent a common source of error in which `file_names` are not + # defined as a property. + if isinstance(files, Callable): + files = files() + return [osp.join(self.processed_dir, f) for f in to_list(files)] + + @property + def has_download(self) -> bool: + r"""Checks whether the dataset defines a :meth:`download` method.""" + return overrides_method(self.__class__, 'download') + + def _download(self): + if files_exist(self.raw_paths): # pragma: no cover + return + + fs.makedirs(self.raw_dir, exist_ok=True) + self.download() + + @property + def has_process(self) -> bool: + r"""Checks whether the dataset defines a :meth:`process` method.""" + return overrides_method(self.__class__, 'process') + + def _process(self): + f = osp.join(self.processed_dir, 'pre_transform.pt') + if osp.exists(f) and paddle.load(f) != _repr(self.pre_transform): + warnings.warn( + "The `pre_transform` argument differs from the one used in " + "the pre-processed version of this dataset. If you want to " + "make use of another pre-processing technique, pass " + "`force_reload=True` explicitly to reload the dataset." + ) + + f = osp.join(self.processed_dir, 'pre_filter.pt') + if osp.exists(f) and paddle.load(f) != _repr(self.pre_filter): + warnings.warn( + "The `pre_filter` argument differs from the one used in " + "the pre-processed version of this dataset. If you want to " + "make use of another pre-filtering technique, pass " + "`force_reload=True` explicitly to reload the dataset." + ) + + if not self.force_reload and files_exist(self.processed_paths): + return + + if self.log and 'pytest' not in sys.modules: + print('Processing...', file=sys.stderr) + + fs.makedirs(self.processed_dir, exist_ok=True) + self.process() + + path = osp.join(self.processed_dir, 'pre_transform.pt') + fs.torch_save(_repr(self.pre_transform), path) + path = osp.join(self.processed_dir, 'pre_filter.pt') + fs.torch_save(_repr(self.pre_filter), path) + + if self.log and 'pytest' not in sys.modules: + print('Done!', file=sys.stderr) + + def __len__(self) -> int: + r"""The number of examples in the dataset.""" + return len(self.indices()) + + def __getitem__( + self, + idx: Union[int, np.integer, IndexType], + ) -> Union['Dataset', BaseData]: + r"""In case :obj:`idx` is of type integer, will return the data object + at index :obj:`idx` (and transforms it in case :obj:`transform` is + present). + In case :obj:`idx` is a slicing object, *e.g.*, :obj:`[2:5]`, a list, a + tuple, or a :obj:`torch.Tensor` or :obj:`np.ndarray` of type long or + bool, will return a subset of the dataset at the specified indices. + """ + if (isinstance(idx, (int, np.integer)) + or (isinstance(idx, Tensor) and idx.dim() == 0) + or (isinstance(idx, np.ndarray) and np.isscalar(idx))): + + data = self.get(self.indices()[idx]) + data = data if self.transform is None else self.transform(data) + return data + + else: + return self.index_select(idx) + + def __iter__(self) -> Iterator[BaseData]: + for i in range(len(self)): + yield self[i] + + def index_select(self, idx: IndexType) -> 'Dataset': + r"""Creates a subset of the dataset from specified indices :obj:`idx`. + Indices :obj:`idx` can be a slicing object, *e.g.*, :obj:`[2:5]`, a + list, a tuple, or a :obj:`torch.Tensor` or :obj:`np.ndarray` of type + long or bool. + """ + indices = self.indices() + + if isinstance(idx, slice): + start, stop, step = idx.start, idx.stop, idx.step + # Allow floating-point slicing, e.g., dataset[:0.9] + if isinstance(start, float): + start = round(start * len(self)) + if isinstance(stop, float): + stop = round(stop * len(self)) + idx = slice(start, stop, step) + + indices = indices[idx] + + elif isinstance(idx, Tensor) and idx.dtype == paddle.int64: + return self.index_select(idx.flatten().tolist()) + + elif isinstance(idx, Tensor) and idx.dtype == paddle.bool: + idx = idx.flatten().nonzero(as_tuple=False) + return self.index_select(idx.flatten().tolist()) + + elif isinstance(idx, np.ndarray) and idx.dtype == np.int64: + return self.index_select(idx.flatten().tolist()) + + elif isinstance(idx, np.ndarray) and idx.dtype == bool: + idx = idx.flatten().nonzero()[0] + return self.index_select(idx.flatten().tolist()) + + elif isinstance(idx, Sequence) and not isinstance(idx, str): + indices = [indices[i] for i in idx] + + else: + raise IndexError( + f"Only slices (':'), list, tuples, torch.tensor and " + f"np.ndarray of dtype long or bool are valid indices (got " + f"'{type(idx).__name__}')") + + dataset = copy.copy(self) + dataset._indices = indices + return dataset + + def shuffle( + self, + return_perm: bool = False, + ) -> Union['Dataset', Tuple['Dataset', Tensor]]: + r"""Randomly shuffles the examples in the dataset. + + Args: + return_perm (bool, optional): If set to :obj:`True`, will also + return the random permutation used to shuffle the dataset. + (default: :obj:`False`) + """ + perm = paddle.randperm(len(self)) + dataset = self.index_select(perm) + return (dataset, perm) if return_perm is True else dataset + + def __repr__(self) -> str: + arg_repr = str(len(self)) if len(self) > 1 else '' + return f'{self.__class__.__name__}({arg_repr})' + + def get_summary(self) -> Any: + r"""Collects summary statistics for the dataset.""" + from paddle_geometric.data.summary import Summary + return Summary.from_dataset(self) + + def print_summary(self, fmt: str = "psql") -> None: + r"""Prints summary statistics of the dataset to the console. + + Args: + fmt (str, optional): Summary tables format. Available table formats + can be found `here `__. (default: :obj:`"psql"`) + """ + print(self.get_summary().format(fmt=fmt)) + + def to_datapipe(self) -> Any: + r"""Converts the dataset into a :class:`torch.utils.data.DataPipe`. + + The returned instance can then be used with :pyg:`PyG's` built-in + :class:`DataPipes` for baching graphs as follows: + + .. code-block:: python + + from paddle_geometric.datasets import QM9 + + dp = QM9(root='./data/QM9/').to_datapipe() + dp = dp.batch_graphs(batch_size=2, drop_last=True) + + for batch in dp: + pass + + See the `PyTorch tutorial + `_ for further background + on DataPipes. + """ + from paddle_geometric.data.datapipes import DatasetAdapter + + return DatasetAdapter(self) + + +def overrides_method(cls, method_name: str) -> bool: + from paddle_geometric.data import InMemoryDataset + + if method_name in cls.__dict__: + return True + + out = False + for base in cls.__bases__: + if base != Dataset and base != InMemoryDataset: + out |= overrides_method(base, method_name) + return out + + +def to_list(value: Any) -> Sequence: + if isinstance(value, Sequence) and not isinstance(value, str): + return value + else: + return [value] + + +def files_exist(files: List[str]) -> bool: + # NOTE: We return `False` in case `files` is empty, leading to a + # re-processing of files on every instantiation. + return len(files) != 0 and all([fs.exists(f) for f in files]) + + +def _repr(obj: Any) -> str: + if obj is None: + return 'None' + return re.sub('(<.*?)\\s.*(>)', r'\1\2', str(obj)) + + +def _get_flattened_data_list(data_list: Iterable[Any]) -> List[BaseData]: + outs: List[BaseData] = [] + for data in data_list: + if isinstance(data, BaseData): + outs.append(data) + elif isinstance(data, (tuple, list)): + outs.extend(_get_flattened_data_list(data)) + elif isinstance(data, dict): + outs.extend(_get_flattened_data_list(data.values())) + return outs diff --git a/jointContribution/mattergen/paddle_geometric/data/download.py b/jointContribution/mattergen/paddle_geometric/data/download.py new file mode 100644 index 00000000..29702cef --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/download.py @@ -0,0 +1,81 @@ +import os +import os.path as osp +import ssl +import sys +import urllib +from typing import Optional + +import fsspec +from paddle_geometric.io import fs + + +def download_url( + url: str, + folder: str, + log: bool = True, + filename: Optional[str] = None, +): + """ + Downloads the content of a URL to a specific folder. + + Args: + url (str): The URL to download the file from. + folder (str): The destination folder where the file will be saved. + log (bool, optional): If False, no logs will be printed to the console. + Default is True. + filename (str, optional): The desired filename for the downloaded file. + If None, the filename is inferred from the URL. Default is None. + """ + if filename is None: + # Extract the filename from the URL. + filename = url.rpartition('/')[2] + filename = filename if filename[0] == '?' else filename.split('?')[0] + + path = osp.join(folder, filename) + + # If the file already exists, return its path. + if fs.exists(path): # pragma: no cover + if log and 'pytest' not in sys.modules: + print(f'Using existing file {filename}', file=sys.stderr) + return path + + if log and 'pytest' not in sys.modules: + print(f'Downloading {url}', file=sys.stderr) + + # Ensure the folder exists. + os.makedirs(folder, exist_ok=True) + + # Create an unverified SSL context for downloading the file. + context = ssl._create_unverified_context() + data = urllib.request.urlopen(url, context=context) + + with fsspec.open(path, 'wb') as f: + # Write data in chunks to avoid memory issues. + while True: + chunk = data.read(10 * 1024 * 1024) # Read 10 MB chunks. + if not chunk: + break + f.write(chunk) + + return path + + +def download_google_url( + id: str, + folder: str, + filename: str, + log: bool = True, +): + """ + Downloads the content of a Google Drive file to a specific folder. + + Args: + id (str): The Google Drive file ID. + folder (str): The destination folder where the file will be saved. + filename (str): The desired filename for the downloaded file. + log (bool, optional): If False, no logs will be printed to the console. + Default is True. + """ + # Construct the Google Drive download URL using the file ID. + url = f'https://drive.usercontent.google.com/download?id={id}&confirm=t' + return download_url(url, folder, log, filename) diff --git a/jointContribution/mattergen/paddle_geometric/data/extract.py b/jointContribution/mattergen/paddle_geometric/data/extract.py new file mode 100644 index 00000000..a87788a3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/extract.py @@ -0,0 +1,77 @@ +import bz2 +import gzip +import os.path as osp +import sys +import tarfile +import zipfile + + +def maybe_log(path: str, log: bool = True) -> None: + if log and 'pytest' not in sys.modules: + print(f'Extracting {path}', file=sys.stderr) + + +def extract_tar( + path: str, + folder: str, + mode: str = 'r:gz', + log: bool = True, +) -> None: + r"""Extracts a tar archive to a specific folder. + + Args: + path (str): The path to the tar archive. + folder (str): The folder. + mode (str, optional): The compression mode. (default: :obj:`"r:gz"`) + log (bool, optional): If :obj:`False`, will not print anything to the + console. (default: :obj:`True`) + """ + maybe_log(path, log) + with tarfile.open(path, mode) as f: + f.extractall(folder) + + +def extract_zip(path: str, folder: str, log: bool = True) -> None: + r"""Extracts a zip archive to a specific folder. + + Args: + path (str): The path to the tar archive. + folder (str): The folder. + log (bool, optional): If :obj:`False`, will not print anything to the + console. (default: :obj:`True`) + """ + maybe_log(path, log) + with zipfile.ZipFile(path, 'r') as f: + f.extractall(folder) + + +def extract_bz2(path: str, folder: str, log: bool = True) -> None: + r"""Extracts a bz2 archive to a specific folder. + + Args: + path (str): The path to the tar archive. + folder (str): The folder. + log (bool, optional): If :obj:`False`, will not print anything to the + console. (default: :obj:`True`) + """ + maybe_log(path, log) + path = osp.abspath(path) + with bz2.open(path, 'r') as r: + with open(osp.join(folder, '.'.join(path.split('.')[:-1])), 'wb') as w: + w.write(r.read()) + + +def extract_gz(path: str, folder: str, log: bool = True) -> None: + r"""Extracts a gz archive to a specific folder. + + Args: + path (str): The path to the tar archive. + folder (str): The folder. + log (bool, optional): If :obj:`False`, will not print anything to the + console. (default: :obj:`True`) + """ + maybe_log(path, log) + path = osp.abspath(path) + with gzip.open(path, 'r') as r: + with open(osp.join(folder, '.'.join(path.split('.')[:-1])), 'wb') as w: + w.write(r.read()) diff --git a/jointContribution/mattergen/paddle_geometric/data/feature_store.py b/jointContribution/mattergen/paddle_geometric/data/feature_store.py new file mode 100644 index 00000000..b200954d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/feature_store.py @@ -0,0 +1,521 @@ +r"""This class defines the abstraction for a backend-agnostic feature store. +The goal of the feature store is to abstract away all node and edge feature +memory management so that varying implementations can allow for independent +scale-out. + +This particular feature store abstraction makes a few key assumptions: +* The features we care about storing are node and edge features of a graph. + To this end, the attributes that the feature store supports include a + `group_name` (e.g. a heterogeneous node name or a heterogeneous edge type), + an `attr_name` (e.g. `x` or `edge_attr`), and an index. +* A feature can be uniquely identified from any associated attributes specified + in `TensorAttr`. + +It is the job of a feature store implementor class to handle these assumptions +properly. For example, a simple in-memory feature store implementation may +concatenate all metadata values with a feature index and use this as a unique +index in a KV store. More complicated implementations may choose to partition +features in interesting manners based on the provided metadata. + +Major TODOs for future implementation: +* Async `put` and `get` functionality +""" +import copy +from abc import ABC, abstractmethod +from dataclasses import dataclass +from enum import Enum +from typing import Any, List, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.typing import FeatureTensorType, NodeType +from paddle_geometric.utils.mixin import CastMixin + +# We allow indexing with a tensor, numpy array, Python slicing, or a single +# integer index. +IndexType = Union[paddle.Tensor, np.ndarray, slice, int] + + +class _FieldStatus(Enum): + UNSET = None + + +@dataclass +class TensorAttr(CastMixin): + r"""Defines the attributes of a :class:`FeatureStore` tensor. + It holds all the parameters necessary to uniquely identify a tensor from + the :class:`FeatureStore`. + + Note that the order of the attributes is important; this is the order in + which attributes must be provided for indexing calls. :class:`FeatureStore` + implementations can define a different ordering by overriding + :meth:`TensorAttr.__init__`. + """ + + # The group name that the tensor corresponds to. Defaults to UNSET. + group_name: Optional[NodeType] = _FieldStatus.UNSET + + # The name of the tensor within its group. Defaults to UNSET. + attr_name: Optional[str] = _FieldStatus.UNSET + + # The node indices the rows of the tensor correspond to. Defaults to UNSET. + index: Optional[IndexType] = _FieldStatus.UNSET + + # Convenience methods ##################################################### + + def is_set(self, key: str) -> bool: + r"""Whether an attribute is set in :obj:`TensorAttr`.""" + assert key in self.__dataclass_fields__ + return getattr(self, key) != _FieldStatus.UNSET + + def is_fully_specified(self) -> bool: + r"""Whether the :obj:`TensorAttr` has no unset fields.""" + return all([self.is_set(key) for key in self.__dataclass_fields__]) + + def fully_specify(self) -> 'TensorAttr': + r"""Sets all :obj:`UNSET` fields to :obj:`None`.""" + for key in self.__dataclass_fields__: + if not self.is_set(key): + setattr(self, key, None) + return self + + def update(self, attr: 'TensorAttr') -> 'TensorAttr': + r"""Updates an :class:`TensorAttr` with set attributes from another + :class:`TensorAttr`. + """ + for key in self.__dataclass_fields__: + if attr.is_set(key): + setattr(self, key, getattr(attr, key)) + return self + + +class AttrView(CastMixin): + r"""Defines a view of a :class:`FeatureStore` that is obtained from a + specification of attributes on the feature store. The view stores a + reference to the backing feature store as well as a :class:`TensorAttr` + object that represents the view's state. + + Users can create views either using the :class:`AttrView` constructor, + :meth:`FeatureStore.view`, or by incompletely indexing a feature store. + For example, the following calls all create views: + + .. code-block:: python + + store[group_name] + store[group_name].feat + store[group_name, feat] + + While the following calls all materialize those views and produce tensors + by either calling the view or fully-specifying the view: + + .. code-block:: python + + store[group_name]() + store[group_name].feat[index] + store[group_name, feat][index] + """ + def __init__(self, store: 'FeatureStore', attr: TensorAttr): + self.__dict__['_store'] = store + self.__dict__['_attr'] = attr + + # Advanced indexing ####################################################### + + def __getattr__(self, key: Any) -> Union['AttrView', FeatureTensorType]: + r"""Sets the first unset field of the backing :class:`TensorAttr` + object to the attribute. + + This allows for :class:`AttrView` to be indexed by different values of + attributes, in order. + In particular, for a feature store that we want to index by + :obj:`group_name` and :obj:`attr_name`, the following code will do so: + + .. code-block:: python + + store[group, attr] + store[group].attr + store.group.attr + """ + out = copy.copy(self) + + # Find the first attribute name that is UNSET: + attr_name: Optional[str] = None + for field in out._attr.__dataclass_fields__: + if getattr(out._attr, field) == _FieldStatus.UNSET: + attr_name = field + break + + if attr_name is None: + raise AttributeError(f"Cannot access attribute '{key}' on view " + f"'{out}' as all attributes have already " + f"been set in this view") + + setattr(out._attr, attr_name, key) + + if out._attr.is_fully_specified(): + return out._store.get_tensor(out._attr) + + return out + + def __getitem__(self, key: Any) -> Union['AttrView', FeatureTensorType]: + r"""Sets the first unset field of the backing :class:`TensorAttr` + object to the attribute via indexing. + + This allows for :class:`AttrView` to be indexed by different values of + attributes, in order. + In particular, for a feature store that we want to index by + :obj:`group_name` and :obj:`attr_name`, the following code will do so: + + .. code-block:: python + + store[group, attr] + store[group][attr] + + """ + return self.__getattr__(key) + + # Setting attributes ###################################################### + + def __setattr__(self, key: str, value: Any): + r"""Supports attribute assignment to the backing :class:`TensorAttr` of + an :class:`AttrView`. + + This allows for :class:`AttrView` objects to set their backing + attribute values. + In particular, the following operation sets the :obj:`index` of an + :class:`AttrView`: + + .. code-block:: python + + view = store.view(group_name) + view.index = torch.tensor([1, 2, 3]) + """ + if key not in self._attr.__dataclass_fields__: + raise ValueError(f"Attempted to set nonexistent attribute '{key}' " + f"(acceptable attributes are " + f"{self._attr.__dataclass_fields__})") + + setattr(self._attr, key, value) + + def __setitem__(self, key: str, value: Any): + r"""Supports attribute assignment to the backing :class:`TensorAttr` of + an :class:`AttrView` via indexing. + + This allows for :class:`AttrView` objects to set their backing + attribute values. + In particular, the following operation sets the `index` of an + :class:`AttrView`: + + .. code-block:: python + + view = store.view(TensorAttr(group_name)) + view['index'] = torch.tensor([1, 2, 3]) + """ + self.__setattr__(key, value) + + # Miscellaneous built-ins ################################################# + + def __call__(self) -> FeatureTensorType: + r"""Supports :class:`AttrView` as a callable to force retrieval from + the currently specified attributes. + + In particular, this passes the current :class:`TensorAttr` object to a + GET call, regardless of whether all attributes have been specified. + It returns the result of this call. + In particular, the following operation returns a tensor by performing a + GET operation on the backing feature store: + + .. code-block:: python + + store[group_name, attr_name]() + """ + # Set all UNSET values to None: + out = copy.copy(self) + out._attr.fully_specify() + return out._store.get_tensor(out._attr) + + def __copy__(self) -> 'AttrView': + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = value + out.__dict__['_attr'] = copy.copy(out.__dict__['_attr']) + return out + + def __eq__(self, obj: Any) -> bool: + r"""Compares two :class:`AttrView` objects by checking equality of + their :class:`FeatureStore` references and :class:`TensorAttr` + attributes. + """ + if not isinstance(obj, AttrView): + return False + return self._store == obj._store and self._attr == obj._attr + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(store={self._store}, ' + f'attr={self._attr})') + + +# TODO (manan, matthias) Ideally, we want to let `FeatureStore` inherit from +# `MutableMapping` to clearly indicate its behavior and usage to the user. +# However, having `MutableMapping` as a base class leads to strange behavior +# in combination with PyTorch and PyTorch Lightning, in particular since these +# libraries use customized logic during mini-batch for `Mapping` base classes. + + +class FeatureStore(ABC): + r"""An abstract base class to access features from a remote feature store. + + Args: + tensor_attr_cls (TensorAttr, optional): A user-defined + :class:`TensorAttr` class to customize the required attributes and + their ordering to unique identify tensor values. + (default: :obj:`None`) + """ + _tensor_attr_cls: TensorAttr + + def __init__(self, tensor_attr_cls: Optional[Any] = None): + super().__init__() + self.__dict__['_tensor_attr_cls'] = tensor_attr_cls or TensorAttr + + # Core (CRUD) ############################################################# + + @abstractmethod + def _put_tensor(self, tensor: FeatureTensorType, attr: TensorAttr) -> bool: + r"""To be implemented by :class:`FeatureStore` subclasses.""" + + def put_tensor(self, tensor: FeatureTensorType, *args, **kwargs) -> bool: + r"""Synchronously adds a :obj:`tensor` to the :class:`FeatureStore`. + Returns whether insertion was successful. + + Args: + tensor (torch.Tensor or np.ndarray): The feature tensor to be + added. + *args: Arguments passed to :class:`TensorAttr`. + **kwargs: Keyword arguments passed to :class:`TensorAttr`. + + Raises: + ValueError: If the input :class:`TensorAttr` is not fully + specified. + """ + attr = self._tensor_attr_cls.cast(*args, **kwargs) + if not attr.is_fully_specified(): + raise ValueError(f"The input TensorAttr '{attr}' is not fully " + f"specified. Please fully-specify the input by " + f"specifying all 'UNSET' fields") + return self._put_tensor(tensor, attr) + + @abstractmethod + def _get_tensor(self, attr: TensorAttr) -> Optional[FeatureTensorType]: + r"""To be implemented by :class:`FeatureStore` subclasses.""" + + def get_tensor( + self, + *args, + convert_type: bool = False, + **kwargs, + ) -> FeatureTensorType: + r"""Synchronously obtains a :class:`tensor` from the + :class:`FeatureStore`. + + Args: + *args: Arguments passed to :class:`TensorAttr`. + convert_type (bool, optional): Whether to convert the type of the + output tensor to the type of the attribute index. + (default: :obj:`False`) + **kwargs: Keyword arguments passed to :class:`TensorAttr`. + + Raises: + ValueError: If the input :class:`TensorAttr` is not fully + specified. + """ + attr = self._tensor_attr_cls.cast(*args, **kwargs) + if not attr.is_fully_specified(): + raise ValueError(f"The input TensorAttr '{attr}' is not fully " + f"specified. Please fully-specify the input by " + f"specifying all 'UNSET' fields.") + + tensor = self._get_tensor(attr) + if convert_type: + tensor = self._to_type(attr, tensor) + return tensor + + def _multi_get_tensor( + self, + attrs: List[TensorAttr], + ) -> List[Optional[FeatureTensorType]]: + r"""To be implemented by :class:`FeatureStore` subclasses.""" + return [self._get_tensor(attr) for attr in attrs] + + def multi_get_tensor( + self, + attrs: List[TensorAttr], + convert_type: bool = False, + ) -> List[FeatureTensorType]: + r"""Synchronously obtains a list of tensors from the + :class:`FeatureStore` for each tensor associated with the attributes in + :obj:`attrs`. + + .. note:: + The default implementation simply iterates over all calls to + :meth:`get_tensor`. Implementor classes that can provide + additional, more performant functionality are recommended to + to override this method. + + Args: + attrs (List[TensorAttr]): A list of input :class:`TensorAttr` + objects that identify the tensors to obtain. + convert_type (bool, optional): Whether to convert the type of the + output tensor to the type of the attribute index. + (default: :obj:`False`) + + Raises: + ValueError: If any input :class:`TensorAttr` is not fully + specified. + """ + attrs = [self._tensor_attr_cls.cast(attr) for attr in attrs] + bad_attrs = [attr for attr in attrs if not attr.is_fully_specified()] + if len(bad_attrs) > 0: + raise ValueError( + f"The input TensorAttr(s) '{bad_attrs}' are not fully " + f"specified. Please fully-specify them by specifying all " + f"'UNSET' fields") + + tensors = self._multi_get_tensor(attrs) + if convert_type: + tensors = [ + self._to_type(attr, tensor) + for attr, tensor in zip(attrs, tensors) + ] + return tensors + + @abstractmethod + def _remove_tensor(self, attr: TensorAttr) -> bool: + r"""To be implemented by :obj:`FeatureStore` subclasses.""" + + def remove_tensor(self, *args, **kwargs) -> bool: + r"""Removes a tensor from the :class:`FeatureStore`. + Returns whether deletion was successful. + + Args: + *args: Arguments passed to :class:`TensorAttr`. + **kwargs: Keyword arguments passed to :class:`TensorAttr`. + + Raises: + ValueError: If the input :class:`TensorAttr` is not fully + specified. + """ + attr = self._tensor_attr_cls.cast(*args, **kwargs) + if not attr.is_fully_specified(): + raise ValueError(f"The input TensorAttr '{attr}' is not fully " + f"specified. Please fully-specify the input by " + f"specifying all 'UNSET' fields.") + return self._remove_tensor(attr) + + def update_tensor(self, tensor: FeatureTensorType, *args, + **kwargs) -> bool: + r"""Updates a :obj:`tensor` in the :class:`FeatureStore` with a new + value. Returns whether the update was succesful. + + .. note:: + Implementor classes can choose to define more efficient update + methods; the default performs a removal and insertion. + + Args: + tensor (torch.Tensor or np.ndarray): The feature tensor to be + updated. + *args: Arguments passed to :class:`TensorAttr`. + **kwargs: Keyword arguments passed to :class:`TensorAttr`. + """ + attr = self._tensor_attr_cls.cast(*args, **kwargs) + self.remove_tensor(attr) + return self.put_tensor(tensor, attr) + + # Additional methods ###################################################### + + @abstractmethod + def _get_tensor_size(self, attr: TensorAttr) -> Optional[Tuple[int, ...]]: + pass + + def get_tensor_size(self, *args, **kwargs) -> Optional[Tuple[int, ...]]: + r"""Obtains the size of a tensor given its :class:`TensorAttr`, or + :obj:`None` if the tensor does not exist. + """ + attr = self._tensor_attr_cls.cast(*args, **kwargs) + if not attr.is_set('index'): + attr.index = None + return self._get_tensor_size(attr) + + @abstractmethod + def get_all_tensor_attrs(self) -> List[TensorAttr]: + r"""Returns all registered tensor attributes.""" + + # `AttrView` methods ###################################################### + + def view(self, *args, **kwargs) -> AttrView: + r"""Returns a view of the :class:`FeatureStore` given a not yet + fully-specified :class:`TensorAttr`. + """ + attr = self._tensor_attr_cls.cast(*args, **kwargs) + return AttrView(self, attr) + + # Helper functions ######################################################## + + @staticmethod + def _to_type( + attr: TensorAttr, + tensor: FeatureTensorType, + ) -> FeatureTensorType: + if isinstance(attr.index, Tensor) and isinstance(tensor, np.ndarray): + return torch.from_numpy(tensor) + if isinstance(attr.index, np.ndarray) and isinstance(tensor, Tensor): + return tensor.detach().cpu().numpy() + return tensor + + # Python built-ins ######################################################## + + def __setitem__(self, key: TensorAttr, value: FeatureTensorType): + r"""Supports :obj:`store[tensor_attr] = tensor`.""" + # CastMixin will handle the case of key being a tuple or TensorAttr + # object: + key = self._tensor_attr_cls.cast(key) + # We need to fully-specify the key for __setitem__ as it does not make + # sense to work with a view here: + key.fully_specify() + self.put_tensor(value, key) + + def __getitem__(self, key: TensorAttr) -> Any: + r"""Supports pythonic indexing into the :class:`FeatureStore`. + + In particular, the following rules are followed for indexing: + + * A fully-specified :obj:`key` will produce a tensor output. + + * A partially-specified :obj:`key` will produce an :class:`AttrView` + output, which is a view on the :class:`FeatureStore`. If a view is + called, it will produce a tensor output from the corresponding + (partially specified) attributes. + """ + # CastMixin will handle the case of key being a tuple or TensorAttr: + attr = self._tensor_attr_cls.cast(key) + if attr.is_fully_specified(): + return self.get_tensor(attr) + # If the view is not fully-specified, return a :class:`AttrView`: + return self.view(attr) + + def __delitem__(self, key: TensorAttr): + r"""Supports :obj:`del store[tensor_attr]`.""" + # CastMixin will handle the case of key being a tuple or TensorAttr + # object: + key = self._tensor_attr_cls.cast(key) + key.fully_specify() + self.remove_tensor(key) + + def __iter__(self): + raise NotImplementedError + + def __eq__(self, obj: object) -> bool: + return id(self) == id(obj) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/data/graph_store.py b/jointContribution/mattergen/paddle_geometric/data/graph_store.py new file mode 100644 index 00000000..d405871a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/graph_store.py @@ -0,0 +1,220 @@ +r"""This class defines the abstraction for a backend-agnostic graph store. The +goal of the graph store is to abstract away all graph edge index memory +management so that varying implementations can allow for independent scale-out. + +This particular graph store abstraction makes a few key assumptions: +* The edge indices we care about storing are represented either in COO, CSC, + or CSR format. They can be uniquely identified by an edge type (in PyG, + this is a tuple of the source node, relation type, and destination node). +* Edge indices are static once they are stored in the graph. That is, we do not + support dynamic modification of edge indices once they have been inserted + into the graph store. + +It is the job of a graph store implementor class to handle these assumptions +properly. For example, a simple in-memory graph store implementation may +concatenate all metadata values with an edge index and use this as a unique +index in a KV store. More complicated implementations may choose to partition +the graph in interesting manners based on the provided metadata. +""" + +import copy +from abc import ABC, abstractmethod +from collections import defaultdict +from dataclasses import dataclass +from enum import Enum +from typing import Any, Dict, List, Optional, Tuple + +from paddle import Tensor +from paddle_geometric.index import index2ptr, ptr2index +from paddle_geometric.typing import EdgeTensorType, EdgeType, OptTensor +from paddle_geometric.utils import index_sort +from paddle_geometric.utils.mixin import CastMixin + +ConversionOutputType = Tuple[Dict[EdgeType, Tensor], Dict[EdgeType, Tensor], Dict[EdgeType, OptTensor]] + + +class EdgeLayout(Enum): + COO = 'coo' + CSC = 'csc' + CSR = 'csr' + + +@dataclass +class EdgeAttr(CastMixin): + r"""Defines the attributes of a :obj:`GraphStore` edge. + It holds all the parameters necessary to uniquely identify an edge from + the :class:`GraphStore`. + + Note that the order of the attributes is important; this is the order in + which attributes must be provided for indexing calls. :class:`GraphStore` + implementations can define a different ordering by overriding + :meth:`EdgeAttr.__init__`. + """ + + edge_type: EdgeType + layout: EdgeLayout + is_sorted: bool = False + size: Optional[Tuple[int, int]] = None + + def __init__(self, edge_type: EdgeType, layout: EdgeLayout, is_sorted: bool = False, size: Optional[Tuple[int, int]] = None): + layout = EdgeLayout(layout) + + if layout == EdgeLayout.CSR and is_sorted: + raise ValueError("Cannot create a 'CSR' edge attribute with option 'is_sorted=True'") + + if layout == EdgeLayout.CSC: + is_sorted = True + + self.edge_type = edge_type + self.layout = layout + self.is_sorted = is_sorted + self.size = size + + +class GraphStore(ABC): + r"""An abstract base class to access edges from a remote graph store. + + Args: + edge_attr_cls (EdgeAttr, optional): A user-defined + :class:`EdgeAttr` class to customize the required attributes and + their ordering to uniquely identify edges. (default: :obj:`None`) + """ + def __init__(self, edge_attr_cls: Optional[Any] = None): + super().__init__() + self.__dict__['_edge_attr_cls'] = edge_attr_cls or EdgeAttr + + @abstractmethod + def _put_edge_index(self, edge_index: EdgeTensorType, edge_attr: EdgeAttr) -> bool: + r"""To be implemented by :class:`GraphStore` subclasses.""" + + def put_edge_index(self, edge_index: EdgeTensorType, *args, **kwargs) -> bool: + edge_attr = self._edge_attr_cls.cast(*args, **kwargs) + return self._put_edge_index(edge_index, edge_attr) + + @abstractmethod + def _get_edge_index(self, edge_attr: EdgeAttr) -> Optional[EdgeTensorType]: + r"""To be implemented by :class:`GraphStore` subclasses.""" + + def get_edge_index(self, *args, **kwargs) -> EdgeTensorType: + edge_attr = self._edge_attr_cls.cast(*args, **kwargs) + edge_index = self._get_edge_index(edge_attr) + if edge_index is None: + raise KeyError(f"'edge_index' for '{edge_attr}' not found") + return edge_index + + @abstractmethod + def _remove_edge_index(self, edge_attr: EdgeAttr) -> bool: + r"""To be implemented by :class:`GraphStore` subclasses.""" + + def remove_edge_index(self, *args, **kwargs) -> bool: + edge_attr = self._edge_attr_cls.cast(*args, **kwargs) + return self._remove_edge_index(edge_attr) + + @abstractmethod + def get_all_edge_attrs(self) -> List[EdgeAttr]: + r"""Returns all registered edge attributes.""" + + def coo(self, edge_types: Optional[List[Any]] = None, store: bool = False) -> ConversionOutputType: + return self._edges_to_layout(EdgeLayout.COO, edge_types, store) + + def csr(self, edge_types: Optional[List[Any]] = None, store: bool = False) -> ConversionOutputType: + return self._edges_to_layout(EdgeLayout.CSR, edge_types, store) + + def csc(self, edge_types: Optional[List[Any]] = None, store: bool = False) -> ConversionOutputType: + return self._edges_to_layout(EdgeLayout.CSC, edge_types, store) + + def __setitem__(self, key: EdgeAttr, value: EdgeTensorType): + self.put_edge_index(value, key) + + def __getitem__(self, key: EdgeAttr) -> Optional[EdgeTensorType]: + return self.get_edge_index(key) + + def __delitem__(self, key: EdgeAttr): + return self.remove_edge_index(key) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' + + def _edge_to_layout(self, attr: EdgeAttr, layout: EdgeLayout, store: bool = False) -> Tuple[Tensor, Tensor, OptTensor]: + (row, col), perm = self.get_edge_index(attr), None + + if layout == EdgeLayout.COO: + if attr.layout == EdgeLayout.CSR: + row = ptr2index(row) + elif attr.layout == EdgeLayout.CSC: + col = ptr2index(col) + + elif layout == EdgeLayout.CSR: + if attr.layout == EdgeLayout.CSC: + col = ptr2index(col) + + if attr.layout != EdgeLayout.CSR: + num_rows = attr.size[0] if attr.size else int(row.max()) + 1 + row, perm = index_sort(row, max_value=num_rows) + col = col[perm] + row = index2ptr(row, num_rows) + + else: + if attr.layout == EdgeLayout.CSR: + row = ptr2index(row) + + if attr.layout != EdgeLayout.CSC: + if hasattr(self, 'meta') and self.meta.get('is_hetero', False): + num_cols = int(col.max()) + 1 + elif attr.size is not None: + num_cols = attr.size[1] + else: + num_cols = int(col.max()) + 1 + + if not attr.is_sorted: + col, perm = index_sort(col, max_value=num_cols) + row = row[perm] + col = index2ptr(col, num_cols) + + if attr.layout != layout and store: + attr = copy.copy(attr) + attr.layout = layout + if perm is not None: + attr.is_sorted = False + self.put_edge_index((row, col), attr) + + return row, col, perm + + def _edges_to_layout(self, layout: EdgeLayout, edge_types: Optional[List[Any]] = None, store: bool = False) -> ConversionOutputType: + edge_attrs: List[EdgeAttr] = self.get_all_edge_attrs() + + if hasattr(self, 'meta'): + is_hetero = self.meta.get('is_hetero', False) + else: + is_hetero = all(attr.edge_type is not None for attr in edge_attrs) + + if not is_hetero: + return self._edge_to_layout(edge_attrs[0], layout, store) + + edge_type_attrs: Dict[EdgeType, List[EdgeAttr]] = defaultdict(list) + for attr in self.get_all_edge_attrs(): + edge_type_attrs[attr.edge_type].append(attr) + + if edge_types is not None: + for edge_type in edge_types: + if edge_type not in edge_type_attrs: + raise ValueError(f"The 'edge_index' of type '{edge_type}' was not found in the graph store.") + + edge_type_attrs = {key: attr for key, attr in edge_type_attrs.items() if key in edge_types} + + row_dict, col_dict, perm_dict = {}, {}, {} + for edge_type, attrs in edge_type_attrs.items(): + layouts = [attr.layout for attr in attrs] + + if layout in layouts: + attr = attrs[layouts.index(layout)] + elif EdgeLayout.COO in layouts: + attr = attrs[layouts.index(EdgeLayout.COO)] + elif EdgeLayout.CSC in layouts: + attr = attrs[layouts.index(EdgeLayout.CSC)] + elif EdgeLayout.CSR in layouts: + attr = attrs[layouts.index(EdgeLayout.CSR)] + + row_dict[edge_type], col_dict[edge_type], perm_dict[edge_type] = self._edge_to_layout(attr, layout, store) + + return row_dict, col_dict, perm_dict diff --git a/jointContribution/mattergen/paddle_geometric/data/hetero_data.py b/jointContribution/mattergen/paddle_geometric/data/hetero_data.py new file mode 100644 index 00000000..846018aa --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/hetero_data.py @@ -0,0 +1,1186 @@ +import copy +import re +import warnings +from collections import defaultdict, namedtuple +from collections.abc import Mapping +from itertools import chain +from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from typing_extensions import Self + +from paddle_geometric import Index +from paddle_geometric.data import EdgeAttr, FeatureStore, GraphStore, TensorAttr +from paddle_geometric.data.data import BaseData, Data, size_repr, warn_or_raise +from paddle_geometric.data.graph_store import EdgeLayout +from paddle_geometric.data.storage import BaseStorage, EdgeStorage, NodeStorage +from paddle_geometric.typing import ( + DEFAULT_REL, + EdgeTensorType, + EdgeType, + FeatureTensorType, + NodeOrEdgeType, + NodeType, + QueryType, + SparseTensor, + TensorFrame, + paddle_frame, +) +from paddle_geometric.utils import ( + bipartite_subgraph, + contains_isolated_nodes, + is_sparse, + is_undirected, + mask_select, +) + + +NodeOrEdgeStorage = Union[NodeStorage, EdgeStorage] + +_DISPLAYED_TYPE_NAME_WARNING: bool = False + + +class HeteroData(BaseData, FeatureStore, GraphStore): + r"""A data object describing a heterogeneous graph, holding multiple node + and/or edge types in disjunct storage objects. + Storage objects can hold either node-level, link-level or graph-level + attributes. + In general, :class:`~paddle_geometric.data.HeteroData` tries to mimic the + behavior of a regular **nested** :python:`Python` dictionary. + In addition, it provides useful functionality for analyzing graph + structures, and provides basic PyTorch tensor functionalities. + + .. code-block:: + + from paddle_geometric.data import HeteroData + + data = HeteroData() + + # Create two node types "paper" and "author" holding a feature matrix: + data['paper'].x = torch.randn(num_papers, num_paper_features) + data['author'].x = torch.randn(num_authors, num_authors_features) + + # Create an edge type "(author, writes, paper)" and building the + # graph connectivity: + data['author', 'writes', 'paper'].edge_index = ... # [2, num_edges] + + data['paper'].num_nodes + >>> 23 + + data['author', 'writes', 'paper'].num_edges + >>> 52 + + # PyTorch tensor functionality: + data = data.pin_memory() + data = data.to('cuda:0', non_blocking=True) + + Note that there exists multiple ways to create a heterogeneous graph data, + *e.g.*: + + * To initialize a node of type :obj:`"paper"` holding a node feature + matrix :obj:`x_paper` named :obj:`x`: + + .. code-block:: python + + from paddle_geometric.data import HeteroData + + # (1) Assign attributes after initialization, + data = HeteroData() + data['paper'].x = x_paper + + # or (2) pass them as keyword arguments during initialization, + data = HeteroData(paper={ 'x': x_paper }) + + # or (3) pass them as dictionaries during initialization, + data = HeteroData({'paper': { 'x': x_paper }}) + + * To initialize an edge from source node type :obj:`"author"` to + destination node type :obj:`"paper"` with relation type :obj:`"writes"` + holding a graph connectivity matrix :obj:`edge_index_author_paper` named + :obj:`edge_index`: + + .. code-block:: python + + # (1) Assign attributes after initialization, + data = HeteroData() + data['author', 'writes', 'paper'].edge_index = edge_index_author_paper + + # or (2) pass them as keyword arguments during initialization, + data = HeteroData(author__writes__paper={ + 'edge_index': edge_index_author_paper + }) + + # or (3) pass them as dictionaries during initialization, + data = HeteroData({ + ('author', 'writes', 'paper'): + { 'edge_index': edge_index_author_paper } + }) + """ + def __init__(self, _mapping: Optional[Dict[str, Any]] = None, **kwargs): + super().__init__() + + self.__dict__['_global_store'] = BaseStorage(_parent=self) + self.__dict__['_node_store_dict'] = {} + self.__dict__['_edge_store_dict'] = {} + + for key, value in chain((_mapping or {}).items(), kwargs.items()): + if '__' in key and isinstance(value, Mapping): + key = tuple(key.split('__')) + + if isinstance(value, Mapping): + self[key].update(value) + else: + setattr(self, key, value) + + @classmethod + def from_dict(cls, mapping: Dict[str, Any]) -> Self: + r"""Creates a :class:`~paddle_geometric.data.HeteroData` object from a + dictionary. + """ + out = cls() + for key, value in mapping.items(): + if key == '_global_store': + out.__dict__['_global_store'] = BaseStorage( + _parent=out, **value) + elif isinstance(key, str): + out._node_store_dict[key] = NodeStorage( + _parent=out, _key=key, **value) + else: + out._edge_store_dict[key] = EdgeStorage( + _parent=out, _key=key, **value) + return out + + def __getattr__(self, key: str) -> Any: + # `data.*_dict` => Link to node and edge stores. + # `data.*` => Link to the `_global_store`. + # Using `data.*_dict` is the same as using `collect()` for collecting + # nodes and edges features. + if hasattr(self._global_store, key): + return getattr(self._global_store, key) + elif bool(re.search('_dict$', key)): + return self.collect(key[:-5]) + raise AttributeError(f"'{self.__class__.__name__}' has no " + f"attribute '{key}'") + + def __setattr__(self, key: str, value: Any): + # NOTE: We aim to prevent duplicates in node or edge types. + if key in self.node_types: + raise AttributeError(f"'{key}' is already present as a node type") + elif key in self.edge_types: + raise AttributeError(f"'{key}' is already present as an edge type") + setattr(self._global_store, key, value) + + def __delattr__(self, key: str): + delattr(self._global_store, key) + + def __getitem__(self, *args: QueryType) -> Any: + # `data[*]` => Link to either `_global_store`, _node_store_dict` or + # `_edge_store_dict`. + # If neither is present, we create a new `Storage` object for the given + # node/edge-type. + key = self._to_canonical(*args) + + out = self._global_store.get(key, None) + if out is not None: + return out + + if isinstance(key, tuple): + return self.get_edge_store(*key) + else: + return self.get_node_store(key) + + def __setitem__(self, key: str, value: Any): + if key in self.node_types: + raise AttributeError(f"'{key}' is already present as a node type") + elif key in self.edge_types: + raise AttributeError(f"'{key}' is already present as an edge type") + self._global_store[key] = value + + def __delitem__(self, *args: QueryType): + # `del data[*]` => Link to `_node_store_dict` or `_edge_store_dict`. + key = self._to_canonical(*args) + if key in self.edge_types: + del self._edge_store_dict[key] + elif key in self.node_types: + del self._node_store_dict[key] + else: + del self._global_store[key] + + def __copy__(self): + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = value + out.__dict__['_global_store'] = copy.copy(self._global_store) + out._global_store._parent = out + out.__dict__['_node_store_dict'] = {} + for key, store in self._node_store_dict.items(): + out._node_store_dict[key] = copy.copy(store) + out._node_store_dict[key]._parent = out + out.__dict__['_edge_store_dict'] = {} + for key, store in self._edge_store_dict.items(): + out._edge_store_dict[key] = copy.copy(store) + out._edge_store_dict[key]._parent = out + return out + + def __deepcopy__(self, memo): + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = copy.deepcopy(value, memo) + out._global_store._parent = out + for key in self._node_store_dict.keys(): + out._node_store_dict[key]._parent = out + for key in out._edge_store_dict.keys(): + out._edge_store_dict[key]._parent = out + return out + + def __repr__(self) -> str: + info1 = [size_repr(k, v, 2) for k, v in self._global_store.items()] + info2 = [size_repr(k, v, 2) for k, v in self._node_store_dict.items()] + info3 = [size_repr(k, v, 2) for k, v in self._edge_store_dict.items()] + info = ',\n'.join(info1 + info2 + info3) + info = f'\n{info}\n' if len(info) > 0 else info + return f'{self.__class__.__name__}({info})' + + def stores_as(self, data: Self): + for node_type in data.node_types: + self.get_node_store(node_type) + for edge_type in data.edge_types: + self.get_edge_store(*edge_type) + return self + + @property + def stores(self) -> List[BaseStorage]: + r"""Returns a list of all storages of the graph.""" + return ([self._global_store] + list(self.node_stores) + + list(self.edge_stores)) + + @property + def node_types(self) -> List[NodeType]: + r"""Returns a list of all node types of the graph.""" + return list(self._node_store_dict.keys()) + + @property + def node_stores(self) -> List[NodeStorage]: + r"""Returns a list of all node storages of the graph.""" + return list(self._node_store_dict.values()) + + @property + def edge_types(self) -> List[EdgeType]: + r"""Returns a list of all edge types of the graph.""" + return list(self._edge_store_dict.keys()) + + @property + def edge_stores(self) -> List[EdgeStorage]: + r"""Returns a list of all edge storages of the graph.""" + return list(self._edge_store_dict.values()) + + def node_items(self) -> List[Tuple[NodeType, NodeStorage]]: + r"""Returns a list of node type and node storage pairs.""" + return list(self._node_store_dict.items()) + + def edge_items(self) -> List[Tuple[EdgeType, EdgeStorage]]: + r"""Returns a list of edge type and edge storage pairs.""" + return list(self._edge_store_dict.items()) + + def to_dict(self) -> Dict[str, Any]: + out_dict: Dict[str, Any] = {} + out_dict['_global_store'] = self._global_store.to_dict() + for key, store in chain(self._node_store_dict.items(), + self._edge_store_dict.items()): + out_dict[key] = store.to_dict() + return out_dict + + def to_namedtuple(self) -> NamedTuple: + field_names = list(self._global_store.keys()) + field_values = list(self._global_store.values()) + field_names += [ + '__'.join(key) if isinstance(key, tuple) else key + for key in self.node_types + self.edge_types + ] + field_values += [ + store.to_namedtuple() + for store in self.node_stores + self.edge_stores + ] + DataTuple = namedtuple('DataTuple', field_names) + return DataTuple(*field_values) + + def set_value_dict( + self, + key: str, + value_dict: Dict[str, Any], + ) -> Self: + r"""Sets the values in the dictionary :obj:`value_dict` to the + attribute with name :obj:`key` to all node/edge types present in the + dictionary. + + .. code-block:: python + + data = HeteroData() + + data.set_value_dict('x', { + 'paper': torch.randn(4, 16), + 'author': torch.randn(8, 32), + }) + + print(data['paper'].x) + """ + for k, v in (value_dict or {}).items(): + self[k][key] = v + return self + + def update(self, data: Self) -> Self: + for store in data.stores: + for key, value in store.items(): + self[store._key][key] = value + return self + + def __cat_dim__(self, key: str, value: Any, + store: Optional[NodeOrEdgeStorage] = None, *args, + **kwargs) -> Any: + if is_sparse(value) and ('adj' in key or 'edge_index' in key): + return (0, 1) + elif isinstance(store, EdgeStorage) and 'index' in key: + return -1 + return 0 + + def __inc__(self, key: str, value: Any, + store: Optional[NodeOrEdgeStorage] = None, *args, + **kwargs) -> Any: + if 'batch' in key and isinstance(value, Tensor): + if isinstance(value, Index): + return value.get_dim_size() + return int(value.max()) + 1 + elif isinstance(store, EdgeStorage) and 'index' in key: + return paddle.to_tensor(store.size()).reshape([2, 1]) + else: + return 0 + + @property + def num_nodes(self) -> Optional[int]: + r"""Returns the number of nodes in the graph.""" + return super().num_nodes + + @property + def num_node_features(self) -> Dict[NodeType, int]: + r"""Returns the number of features per node type in the graph.""" + return { + key: store.num_node_features + for key, store in self._node_store_dict.items() + } + + @property + def num_features(self) -> Dict[NodeType, int]: + r"""Returns the number of features per node type in the graph. + Alias for :py:attr:`~num_node_features`. + """ + return self.num_node_features + + @property + def num_edge_features(self) -> Dict[EdgeType, int]: + r"""Returns the number of features per edge type in the graph.""" + return { + key: store.num_edge_features + for key, store in self._edge_store_dict.items() + } + + def has_isolated_nodes(self) -> bool: + r"""Returns :obj:`True` if the graph contains isolated nodes.""" + edge_index, _, _ = to_homogeneous_edge_index(self) + return contains_isolated_nodes(edge_index, num_nodes=self.num_nodes) + + def is_undirected(self) -> bool: + r"""Returns :obj:`True` if graph edges are undirected.""" + edge_index, _, _ = to_homogeneous_edge_index(self) + return is_undirected(edge_index, num_nodes=self.num_nodes) + + def validate(self, raise_on_error: bool = True) -> bool: + r"""Validates the correctness of the data.""" + cls_name = self.__class__.__name__ + status = True + + node_types = set(self.node_types) + num_src_node_types = {src for src, _, _ in self.edge_types} + num_dst_node_types = {dst for _, _, dst in self.edge_types} + + dangling_types = (num_src_node_types | num_dst_node_types) - node_types + if len(dangling_types) > 0: + status = False + warn_or_raise( + f"The node types {dangling_types} are referenced in edge " + f"types but do not exist as node types", raise_on_error) + + dangling_types = node_types - (num_src_node_types | num_dst_node_types) + if len(dangling_types) > 0: + warn_or_raise( # May be intended. + f"The node types {dangling_types} are isolated and are not " + f"referenced by any edge type ", raise_on_error=False) + + for edge_type, store in self._edge_store_dict.items(): + src, _, dst = edge_type + + num_src_nodes = self[src].num_nodes + num_dst_nodes = self[dst].num_nodes + if num_src_nodes is None: + status = False + warn_or_raise( + f"'num_nodes' is undefined in node type '{src}' of " + f"'{cls_name}'", raise_on_error) + + if num_dst_nodes is None: + status = False + warn_or_raise( + f"'num_nodes' is undefined in node type '{dst}' of " + f"'{cls_name}'", raise_on_error) + + if 'edge_index' in store: + if (store.edge_index.dim() != 2 + or store.edge_index.size(0) != 2): + status = False + warn_or_raise( + f"'edge_index' of edge type {edge_type} needs to be " + f"of shape [2, num_edges] in '{cls_name}' (found " + f"{store.edge_index.size()})", raise_on_error) + + if 'edge_index' in store and store.edge_index.numel() > 0: + if store.edge_index.min() < 0: + status = False + warn_or_raise( + f"'edge_index' of edge type {edge_type} contains " + f"negative indices in '{cls_name}' " + f"(found {int(store.edge_index.min())})", + raise_on_error) + + if (num_src_nodes is not None + and store.edge_index[0].max() >= num_src_nodes): + status = False + warn_or_raise( + f"'edge_index' of edge type {edge_type} contains " + f"larger source indices than the number of nodes " + f"({num_src_nodes}) of this node type in '{cls_name}' " + f"(found {int(store.edge_index[0].max())})", + raise_on_error) + + if (num_dst_nodes is not None + and store.edge_index[1].max() >= num_dst_nodes): + status = False + warn_or_raise( + f"'edge_index' of edge type {edge_type} contains " + f"larger destination indices than the number of nodes " + f"({num_dst_nodes}) of this node type in '{cls_name}' " + f"(found {int(store.edge_index[1].max())})", + raise_on_error) + + return status + + def debug(self): + pass # TODO + + ########################################################################### + + def _to_canonical(self, *args: QueryType) -> NodeOrEdgeType: + # Converts a given `QueryType` to its "canonical type": + # 1. `relation_type` will get mapped to the unique + # `(src_node_type, relation_type, dst_node_type)` tuple. + # 2. `(src_node_type, dst_node_type)` will get mapped to the unique + # `(src_node_type, *, dst_node_type)` tuple, and + # `(src_node_type, 'to', dst_node_type)` otherwise. + if len(args) == 1: + args = args[0] + + if isinstance(args, str): + node_types = [key for key in self.node_types if key == args] + if len(node_types) == 1: + args = node_types[0] + return args + + # Try to map to edge type based on unique relation type: + edge_types = [key for key in self.edge_types if key[1] == args] + if len(edge_types) == 1: + args = edge_types[0] + return args + + elif len(args) == 2: + # Try to find the unique source/destination node tuple: + edge_types = [ + key for key in self.edge_types + if key[0] == args[0] and key[-1] == args[-1] + ] + if len(edge_types) == 1: + args = edge_types[0] + return args + elif len(edge_types) == 0: + args = (args[0], DEFAULT_REL, args[1]) + return args + + return args + + def metadata(self) -> Tuple[List[NodeType], List[EdgeType]]: + r"""Returns the heterogeneous meta-data, *i.e.* its node and edge + types. + + .. code-block:: python + + data = HeteroData() + data['paper'].x = ... + data['author'].x = ... + data['author', 'writes', 'paper'].edge_index = ... + + print(data.metadata()) + >>> (['paper', 'author'], [('author', 'writes', 'paper')]) + """ + return self.node_types, self.edge_types + + def collect( + self, + key: str, + allow_empty: bool = False, + ) -> Dict[NodeOrEdgeType, Any]: + r"""Collects the attribute :attr:`key` from all node and edge types. + + .. code-block:: python + + data = HeteroData() + data['paper'].x = ... + data['author'].x = ... + + print(data.collect('x')) + # >>> { 'paper': ..., 'author': ...} + + .. note:: + + This is equivalent to writing :obj:`data.x_dict`. + + Args: + key (str): The attribute to collect from all node and ege types. + allow_empty (bool, optional): If set to :obj:`True`, will not raise + an error in case the attribute does not exit in any node or + edge type. (default: :obj:`False`) + """ + mapping = {} + for subtype, store in chain(self._node_store_dict.items(), + self._edge_store_dict.items()): + if hasattr(store, key): + mapping[subtype] = getattr(store, key) + if not allow_empty and len(mapping) == 0: + raise KeyError(f"Tried to collect '{key}' but did not find any " + f"occurrences of it in any node and/or edge type") + return mapping + + def _check_type_name(self, name: str): + global _DISPLAYED_TYPE_NAME_WARNING + if not _DISPLAYED_TYPE_NAME_WARNING and '__' in name: + _DISPLAYED_TYPE_NAME_WARNING = True + warnings.warn(f"There exist type names in the " + f"'{self.__class__.__name__}' object that contain " + f"double underscores '__' (e.g., '{name}'). This " + f"may lead to unexpected behavior. To avoid any " + f"issues, ensure that your type names only contain " + f"single underscores.") + + def get_node_store(self, key: NodeType) -> NodeStorage: + r"""Gets the :class:`~paddle_geometric.data.storage.NodeStorage` object + of a particular node type :attr:`key`. + If the storage is not present yet, will create a new + :class:`paddle_geometric.data.storage.NodeStorage` object for the given + node type. + + .. code-block:: python + + data = HeteroData() + node_storage = data.get_node_store('paper') + """ + out = self._node_store_dict.get(key, None) + if out is None: + self._check_type_name(key) + out = NodeStorage(_parent=self, _key=key) + self._node_store_dict[key] = out + return out + + def get_edge_store(self, src: str, rel: str, dst: str) -> EdgeStorage: + r"""Gets the :class:`~paddle_geometric.data.storage.EdgeStorage` object + of a particular edge type given by the tuple :obj:`(src, rel, dst)`. + If the storage is not present yet, will create a new + :class:`paddle_geometric.data.storage.EdgeStorage` object for the given + edge type. + + .. code-block:: python + + data = HeteroData() + edge_storage = data.get_edge_store('author', 'writes', 'paper') + """ + key = (src, rel, dst) + out = self._edge_store_dict.get(key, None) + if out is None: + self._check_type_name(rel) + out = EdgeStorage(_parent=self, _key=key) + self._edge_store_dict[key] = out + return out + + def rename(self, name: NodeType, new_name: NodeType) -> Self: + r"""Renames the node type :obj:`name` to :obj:`new_name` in-place.""" + node_store = self._node_store_dict.pop(name) + node_store._key = new_name + self._node_store_dict[new_name] = node_store + + for edge_type in self.edge_types: + src, rel, dst = edge_type + if src == name or dst == name: + edge_store = self._edge_store_dict.pop(edge_type) + src = new_name if src == name else src + dst = new_name if dst == name else dst + edge_type = (src, rel, dst) + edge_store._key = edge_type + self._edge_store_dict[edge_type] = edge_store + + return self + + def subgraph(self, subset_dict: Dict[NodeType, Tensor]) -> Self: + r"""Returns the induced subgraph containing the node types and + corresponding nodes in :obj:`subset_dict`. + + If a node type is not a key in :obj:`subset_dict` then all nodes of + that type remain in the graph. + + .. code-block:: python + + data = HeteroData() + data['paper'].x = ... + data['author'].x = ... + data['conference'].x = ... + data['paper', 'cites', 'paper'].edge_index = ... + data['author', 'paper'].edge_index = ... + data['paper', 'conference'].edge_index = ... + print(data) + >>> HeteroData( + paper={ x=[10, 16] }, + author={ x=[5, 32] }, + conference={ x=[5, 8] }, + (paper, cites, paper)={ edge_index=[2, 50] }, + (author, to, paper)={ edge_index=[2, 30] }, + (paper, to, conference)={ edge_index=[2, 25] } + ) + + subset_dict = { + 'paper': torch.tensor([3, 4, 5, 6]), + 'author': torch.tensor([0, 2]), + } + + print(data.subgraph(subset_dict)) + >>> HeteroData( + paper={ x=[4, 16] }, + author={ x=[2, 32] }, + conference={ x=[5, 8] }, + (paper, cites, paper)={ edge_index=[2, 24] }, + (author, to, paper)={ edge_index=[2, 5] }, + (paper, to, conference)={ edge_index=[2, 10] } + ) + + Args: + subset_dict (Dict[str, LongTensor or BoolTensor]): A dictionary + holding the nodes to keep for each node type. + """ + data = copy.copy(self) + subset_dict = copy.copy(subset_dict) + + for node_type, subset in subset_dict.items(): + for key, value in self[node_type].items(): + if key == 'num_nodes': + if subset.dtype == paddle.bool: + data[node_type].num_nodes = int(subset.sum()) + else: + data[node_type].num_nodes = subset.size(0) + elif self[node_type].is_node_attr(key): + data[node_type][key] = value[subset] + else: + data[node_type][key] = value + + for edge_type in self.edge_types: + if 'edge_index' not in self[edge_type]: + continue + + src, _, dst = edge_type + + src_subset = subset_dict.get(src) + if src_subset is None: + src_subset = paddle.arange(data[src].num_nodes) + dst_subset = subset_dict.get(dst) + if dst_subset is None: + dst_subset = paddle.arange(data[dst].num_nodes) + + edge_index, _, edge_mask = bipartite_subgraph( + (src_subset, dst_subset), + self[edge_type].edge_index, + relabel_nodes=True, + size=(self[src].num_nodes, self[dst].num_nodes), + return_edge_mask=True, + ) + + for key, value in self[edge_type].items(): + if key == 'edge_index': + data[edge_type].edge_index = edge_index + elif self[edge_type].is_edge_attr(key): + data[edge_type][key] = value[edge_mask] + else: + data[edge_type][key] = value + + return data + + def edge_subgraph( + self, + subset_dict: Dict[EdgeType, Tensor], + ) -> Self: + r"""Returns the induced subgraph given by the edge indices in + :obj:`subset_dict` for certain edge types. + Will currently preserve all the nodes in the graph, even if they are + isolated after subgraph computation. + + Args: + subset_dict (Dict[Tuple[str, str, str], LongTensor or BoolTensor]): + A dictionary holding the edges to keep for each edge type. + """ + data = copy.copy(self) + + for edge_type, subset in subset_dict.items(): + edge_store, new_edge_store = self[edge_type], data[edge_type] + for key, value in edge_store.items(): + if edge_store.is_edge_attr(key): + dim = self.__cat_dim__(key, value, edge_store) + if subset.dtype == paddle.bool: + new_edge_store[key] = mask_select(value, dim, subset) + else: + new_edge_store[key] = value.index_select(dim, subset) + + return data + + def node_type_subgraph(self, node_types: List[NodeType]) -> Self: + r"""Returns the subgraph induced by the given :obj:`node_types`, *i.e.* + the returned :class:`HeteroData` object only contains the node types + which are included in :obj:`node_types`, and only contains the edge + types where both end points are included in :obj:`node_types`. + """ + data = copy.copy(self) + for edge_type in self.edge_types: + src, _, dst = edge_type + if src not in node_types or dst not in node_types: + del data[edge_type] + for node_type in self.node_types: + if node_type not in node_types: + del data[node_type] + return data + + def edge_type_subgraph(self, edge_types: List[EdgeType]) -> Self: + r"""Returns the subgraph induced by the given :obj:`edge_types`, *i.e.* + the returned :class:`HeteroData` object only contains the edge types + which are included in :obj:`edge_types`, and only contains the node + types of the end points which are included in :obj:`node_types`. + """ + edge_types = [self._to_canonical(e) for e in edge_types] + + data = copy.copy(self) + for edge_type in self.edge_types: + if edge_type not in edge_types: + del data[edge_type] + node_types = {e[0] for e in edge_types} + node_types |= {e[-1] for e in edge_types} + for node_type in self.node_types: + if node_type not in node_types: + del data[node_type] + return data + + def to_homogeneous( + self, + node_attrs: Optional[List[str]] = None, + edge_attrs: Optional[List[str]] = None, + add_node_type: bool = True, + add_edge_type: bool = True, + dummy_values: bool = True, + ) -> Data: + """Converts a :class:`~paddle_geometric.data.HeteroData` object to a + homogeneous :class:`~paddle_geometric.data.Data` object. + By default, all features with same feature dimensionality across + different types will be merged into a single representation, unless + otherwise specified via the :obj:`node_attrs` and :obj:`edge_attrs` + arguments. + Furthermore, attributes named :obj:`node_type` and :obj:`edge_type` + will be added to the returned :class:`~paddle_geometric.data.Data` + object, denoting node-level and edge-level vectors holding the + node and edge type as integers, respectively. + + Args: + node_attrs (List[str], optional): The node features to combine + across all node types. These node features need to be of the + same feature dimensionality. If set to :obj:`None`, will + automatically determine which node features to combine. + (default: :obj:`None`) + edge_attrs (List[str], optional): The edge features to combine + across all edge types. These edge features need to be of the + same feature dimensionality. If set to :obj:`None`, will + automatically determine which edge features to combine. + (default: :obj:`None`) + add_node_type (bool, optional): If set to :obj:`False`, will not + add the node-level vector :obj:`node_type` to the returned + :class:`~paddle_geometric.data.Data` object. + (default: :obj:`True`) + add_edge_type (bool, optional): If set to :obj:`False`, will not + add the edge-level vector :obj:`edge_type` to the returned + :class:`~paddle_geometric.data.Data` object. + (default: :obj:`True`) + dummy_values (bool, optional): If set to :obj:`True`, will fill + attributes of remaining types with dummy values. + Dummy values are :obj:`NaN` for floating point attributes, + :obj:`False` for booleans, and :obj:`-1` for integers. + (default: :obj:`True`) + """ + def get_sizes(stores: List[BaseStorage]) -> Dict[str, List[Tuple]]: + sizes_dict = defaultdict(list) + for store in stores: + for key, value in store.items(): + if key in [ + 'edge_index', 'edge_label_index', 'adj', 'adj_t' + ]: + continue + if isinstance(value, Tensor): + dim = self.__cat_dim__(key, value, store) + size = value.size()[:dim] + value.size()[dim + 1:] + sizes_dict[key].append(tuple(size)) + return sizes_dict + + def fill_dummy_(stores: List[BaseStorage], + keys: Optional[List[str]] = None): + sizes_dict = get_sizes(stores) + + if keys is not None: + sizes_dict = { + key: sizes + for key, sizes in sizes_dict.items() if key in keys + } + + sizes_dict = { + key: sizes + for key, sizes in sizes_dict.items() if len(set(sizes)) == 1 + } + + for store in stores: # Fill stores with dummy features: + for key, sizes in sizes_dict.items(): + if key not in store: + ref = list(self.collect(key).values())[0] + dim = self.__cat_dim__(key, ref, store) + if ref.is_floating_point(): + dummy = float('NaN') + elif ref.dtype == paddle.bool: + dummy = False + else: + dummy = -1 + if isinstance(store, NodeStorage): + dim_size = store.num_nodes + else: + dim_size = store.num_edges + shape = sizes[0][:dim] + (dim_size, ) + sizes[0][dim:] + store[key] = paddle.full(shape, dummy, dtype=ref.dtype, device=ref.device) + + def _consistent_size(stores: List[BaseStorage]) -> List[str]: + sizes_dict = get_sizes(stores) + keys = [] + for key, sizes in sizes_dict.items(): + # The attribute needs to exist in all types: + if len(sizes) != len(stores): + continue + # The attributes needs to have the same number of dimensions: + lengths = {len(size) for size in sizes} + if len(lengths) != 1: + continue + # The attributes needs to have the same size in all dimensions: + if len(sizes[0]) != 1 and len(set(sizes)) != 1: + continue + keys.append(key) + + # Check for consistent column names in `TensorFrame`: + tf_cols = defaultdict(list) + for store in stores: + for key, value in store.items(): + if isinstance(value, TensorFrame): + cols = tuple(chain(*value.col_names_dict.values())) + tf_cols[key].append(cols) + + for key, cols in tf_cols.items(): + # The attribute needs to exist in all types: + if len(cols) != len(stores): + continue + # The attributes needs to have the same column names: + lengths = set(cols) + if len(lengths) != 1: + continue + keys.append(key) + + return keys + + if dummy_values: + self = copy.copy(self) + fill_dummy_(self.node_stores, node_attrs) + fill_dummy_(self.edge_stores, edge_attrs) + + edge_index, node_slices, edge_slices = to_homogeneous_edge_index(self) + device = edge_index.device if edge_index is not None else None + + data = Data(**self._global_store.to_dict()) + if edge_index is not None: + data.edge_index = edge_index + data._node_type_names = list(node_slices.keys()) + data._edge_type_names = list(edge_slices.keys()) + + # Combine node attributes into a single tensor: + if node_attrs is None: + node_attrs = _consistent_size(self.node_stores) + for key in node_attrs: + if key in {'ptr'}: + continue + values = [store[key] for store in self.node_stores] + if isinstance(values[0], TensorFrame): + value = paddle_frame.cat(values, dim=0) + else: + dim = self.__cat_dim__(key, values[0], self.node_stores[0]) + dim = values[0].dim() + dim if dim < 0 else dim + # For two-dimensional features, we allow arbitrary shapes and + # pad them with zeros if necessary in case their size doesn't + # match: + if values[0].dim() == 2 and dim == 0: + _max = max([value.size(-1) for value in values]) + for i, v in enumerate(values): + if v.size(-1) < _max: + pad = v.new_zeros(v.size(0), _max - v.size(-1)) + values[i] = paddle.concat([v, pad], axis=-1) + value = paddle.concat(values, axis=dim) + data[key] = value + + if not data.can_infer_num_nodes: + data.num_nodes = list(node_slices.values())[-1][1] + + # Combine edge attributes into a single tensor: + if edge_attrs is None: + edge_attrs = _consistent_size(self.edge_stores) + for key in edge_attrs: + values = [store[key] for store in self.edge_stores] + dim = self.__cat_dim__(key, values[0], self.edge_stores[0]) + value = paddle.concat(values, axis=dim) if len(values) > 1 else values[0] + data[key] = value + + if 'edge_label_index' in self: + edge_label_index_dict = self.edge_label_index_dict + for edge_type, edge_label_index in edge_label_index_dict.items(): + edge_label_index = edge_label_index.clone() + edge_label_index[0] += node_slices[edge_type[0]][0] + edge_label_index[1] += node_slices[edge_type[-1]][0] + edge_label_index_dict[edge_type] = edge_label_index + data.edge_label_index = paddle.concat( + list(edge_label_index_dict.values()), axis=-1) + + if add_node_type: + sizes = [offset[1] - offset[0] for offset in node_slices.values()] + sizes = paddle.to_tensor(sizes, dtype='int64', place=device) + node_type = paddle.arange(len(sizes), dtype='int64', place=device) + data.node_type = node_type.repeat_interleave(sizes) + + if add_edge_type and edge_index is not None: + sizes = [offset[1] - offset[0] for offset in edge_slices.values()] + sizes = paddle.to_tensor(sizes, dtype='int64', place=device) + edge_type = paddle.arange(len(sizes), dtype='int64', place=device) + data.edge_type = edge_type.repeat_interleave(sizes) + + return data + + # FeatureStore interface ################################################## + + def _put_tensor(self, tensor: FeatureTensorType, attr: TensorAttr) -> bool: + if not attr.is_set('index'): + attr.index = None + + out = self._node_store_dict.get(attr.group_name, None) + if out: + # Group name exists, handle index or create new attribute name: + val = getattr(out, attr.attr_name, None) + if val is not None: + val[attr.index] = tensor + else: + assert attr.index is None + setattr(self[attr.group_name], attr.attr_name, tensor) + else: + # No node storage found, just store tensor in new one: + setattr(self[attr.group_name], attr.attr_name, tensor) + return True + + def _get_tensor(self, attr: TensorAttr) -> Optional[FeatureTensorType]: + # Retrieve tensor and index accordingly: + tensor = getattr(self[attr.group_name], attr.attr_name, None) + if tensor is not None: + # TODO this behavior is a bit odd, since TensorAttr requires that + # we set `index`. So, we assume here that indexing by `None` is + # equivalent to not indexing at all, which is not in line with + # Python semantics. + return tensor[attr.index] if attr.index is not None else tensor + return None + + def _remove_tensor(self, attr: TensorAttr) -> bool: + # Remove tensor entirely: + if hasattr(self[attr.group_name], attr.attr_name): + delattr(self[attr.group_name], attr.attr_name) + return True + return False + + def _get_tensor_size(self, attr: TensorAttr) -> Tuple: + return self._get_tensor(attr).size() + + def get_all_tensor_attrs(self) -> List[TensorAttr]: + out = [] + for group_name, group in self.node_items(): + for attr_name in group: + if group.is_node_attr(attr_name): + out.append(TensorAttr(group_name, attr_name)) + return out + + # GraphStore interface #################################################### + + def _put_edge_index(self, edge_index: EdgeTensorType, + edge_attr: EdgeAttr) -> bool: + if not hasattr(self, '_edge_attrs'): + self._edge_attrs = {} + self._edge_attrs[(edge_attr.edge_type, edge_attr.layout)] = edge_attr + + row, col = edge_index + store = self[edge_attr.edge_type] + + if edge_attr.layout == EdgeLayout.COO: + store.edge_index = paddle.stack([row, col], axis=0) + elif edge_attr.layout == EdgeLayout.CSR: + store.adj = SparseTensor( + rowptr=row, + col=col, + sparse_sizes=edge_attr.size, + is_sorted=True, + trust_data=True, + ) + else: # edge_attr.layout == EdgeLayout.CSC: + size = edge_attr.size[::-1] if edge_attr.size is not None else None + store.adj_t = SparseTensor( + rowptr=col, + col=row, + sparse_sizes=size, + is_sorted=True, + trust_data=True, + ) + return True + + def _get_edge_index(self, edge_attr: EdgeAttr) -> Optional[EdgeTensorType]: + r"""Gets an edge index from edge storage, in the specified layout.""" + store = self[edge_attr.edge_type] + + edge_attrs = getattr(self, '_edge_attrs', {}) + if (edge_attr.edge_type, edge_attr.layout) in edge_attrs: + edge_attr = edge_attrs[(edge_attr.edge_type, edge_attr.layout)] + if edge_attr.size is None: + edge_attr.size = store.size() # Modify in-place. + + if edge_attr.layout == EdgeLayout.COO and 'edge_index' in store: + row, col = store.edge_index + return row, col + elif edge_attr.layout == EdgeLayout.CSR and 'adj' in store: + rowptr, col, _ = store.adj.csr() + return rowptr, col + elif edge_attr.layout == EdgeLayout.CSC and 'adj_t' in store: + colptr, row, _ = store.adj_t.csr() + return row, colptr + return None + + def _remove_edge_index(self, edge_attr: EdgeAttr) -> bool: + edge_type = edge_attr.edge_type + store = self[edge_type] + if edge_attr.layout == EdgeLayout.COO and 'edge_index' in store: + del store.edge_index + if hasattr(self, '_edge_attrs'): + self._edge_attrs.pop((edge_type, EdgeLayout.COO), None) + return True + elif edge_attr.layout == EdgeLayout.CSR and 'adj' in store: + del store.adj + if hasattr(self, '_edge_attrs'): + self._edge_attrs.pop((edge_type, EdgeLayout.CSR), None) + return True + elif edge_attr.layout == EdgeLayout.CSC and 'adj_t' in store: + del store.adj_t + if hasattr(self, '_edge_attrs'): + self._edge_attrs.pop((edge_type, EdgeLayout.CSC), None) + return True + return False + + def get_all_edge_attrs(self) -> List[EdgeAttr]: + edge_attrs = getattr(self, '_edge_attrs', {}) + + for store in self.edge_stores: + if ('edge_index' in store + and (store._key, EdgeLayout.COO) not in edge_attrs): + edge_attrs[(store._key, EdgeLayout.COO)] = EdgeAttr( + store._key, 'coo', is_sorted=False) + if ('adj' in store + and (store._key, EdgeLayout.CSR) not in edge_attrs): + size = store.adj.sparse_sizes() + edge_attrs[(store._key, EdgeLayout.CSR)] = EdgeAttr( + store._key, 'csr', size=size) + if ('adj_t' in store + and (store._key, EdgeLayout.CSC) not in edge_attrs): + size = store.adj_t.sparse_sizes()[::-1] + edge_attrs[(store._key, EdgeLayout.CSC)] = EdgeAttr( + store._key, 'csc', size=size) + + return list(edge_attrs.values()) + + +# Helper functions ############################################################ + + +def get_node_slices(num_nodes: Dict[str, int]) -> Dict[str, Tuple[int, int]]: + r"""Returns the boundaries of each node type in a graph.""" + node_slices: Dict[NodeType, Tuple[int, int]] = {} + cumsum = 0 + for node_type, N in num_nodes.items(): + node_slices[node_type] = (cumsum, cumsum + N) + cumsum += N + return node_slices + + +def offset_edge_index( + node_slices: Dict[NodeType, Tuple[int, int]], + edge_type: EdgeType, + edge_index: Tensor, +) -> Tensor: + r"""Increases the edge indices by the offsets of source and destination + node types. + """ + src, _, dst = edge_type + offset = [[node_slices[src][0]], [node_slices[dst][0]]] + offset = paddle.to_tensor(offset, device=edge_index.device) + return edge_index + offset + + +def to_homogeneous_edge_index( + data: HeteroData, +) -> Tuple[Optional[Tensor], Dict[NodeType, Any], Dict[EdgeType, Any]]: + r"""Converts a heterogeneous graph into a homogeneous typed graph.""" + # Record slice information per node type: + node_slices = get_node_slices(data.num_nodes_dict) + + # Record edge indices and slice information per edge type: + cumsum = 0 + edge_indices: List[Tensor] = [] + edge_slices: Dict[EdgeType, Tuple[int, int]] = {} + for edge_type, edge_index in data.collect('edge_index', True).items(): + edge_index = offset_edge_index(node_slices, edge_type, edge_index) + edge_indices.append(edge_index) + edge_slices[edge_type] = (cumsum, cumsum + edge_index.size(1)) + cumsum += edge_index.size(1) + + edge_index: Optional[Tensor] = None + if len(edge_indices) == 1: # Memory-efficient `torch.cat`: + edge_index = edge_indices[0] + elif len(edge_indices) > 1: + edge_index = paddle.concat(edge_indices, axis=-1) + + return edge_index, node_slices, edge_slices diff --git a/jointContribution/mattergen/paddle_geometric/data/hypergraph_data.py b/jointContribution/mattergen/paddle_geometric/data/hypergraph_data.py new file mode 100644 index 00000000..0c427ccf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/hypergraph_data.py @@ -0,0 +1,226 @@ +import copy +import warnings +from typing import Any, List, Optional + +import paddle +from paddle import Tensor +from typing_extensions import Self + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.typing import EdgeType, NodeType, OptTensor +from paddle_geometric.utils import select +from paddle_geometric.utils._subgraph import hyper_subgraph + + +class HyperGraphData(Data): + r"""A data object describing a hypergraph. + + The data object can hold node-level, link-level and graph-level attributes. + This object differs from a standard :obj:`~paddle_geometric.data.Data` + object by having hyperedges, i.e. edges that connect more + than two nodes. For example, in the hypergraph scenario + :math:`\mathcal{G} = (\mathcal{V}, \mathcal{E})` with + :math:`\mathcal{V} = \{ 0, 1, 2, 3, 4 \}` and + :math:`\mathcal{E} = \{ \{ 0, 1, 2 \}, \{ 1, 2, 3, 4 \} \}`, the + hyperedge index :obj:`edge_index` is represented as: + + .. code-block:: python + + # hyper graph with two hyperedges + # connecting 3 and 4 nodes, respectively + edge_index = torch.tensor([ + [0, 1, 2, 1, 2, 3, 4], + [0, 0, 0, 1, 1, 1, 1], + ]) + + Args: + x (torch.Tensor, optional): Node feature matrix with shape + :obj:`[num_nodes, num_node_features]`. (default: :obj:`None`) + edge_index (LongTensor, optional): Hyperedge tensor + with shape :obj:`[2, num_edges*num_nodes_per_edge]`. + Where `edge_index[1]` denotes the hyperedge index and + `edge_index[0]` denotes the node indicies that are connected + by the hyperedge. (default: :obj:`None`) + (default: :obj:`None`) + edge_attr (torch.Tensor, optional): Edge feature matrix with shape + :obj:`[num_edges, num_edge_features]`. + (default: :obj:`None`) + y (torch.Tensor, optional): Graph-level or node-level ground-truth + labels with arbitrary shape. (default: :obj:`None`) + pos (torch.Tensor, optional): Node position matrix with shape + :obj:`[num_nodes, num_dimensions]`. (default: :obj:`None`) + **kwargs (optional): Additional attributes. + """ + def __init__( + self, + x: OptTensor = None, + edge_index: OptTensor = None, + edge_attr: OptTensor = None, + y: OptTensor = None, + pos: OptTensor = None, + **kwargs: Any, + ) -> None: + super().__init__( + x=x, + edge_index=edge_index, + edge_attr=edge_attr, + y=y, + pos=pos, + **kwargs, + ) + + @property + def num_edges(self) -> int: + r"""Returns the number of hyperedges in the hypergraph.""" + if self.edge_index is None: + return 0 + return max(self.edge_index[1]) + 1 + + @property + def num_nodes(self) -> Optional[int]: + num_nodes = super().num_nodes + + # For hypergraphs, `edge_index[1]` does not contain node indices. + # Therefore, the below code is used to prevent `num_nodes` being + # estimated as the number of hyperedges. + if (self.edge_index is not None and num_nodes == self.num_edges): + return max(self.edge_index[0]) + 1 + + return num_nodes + + @num_nodes.setter + def num_nodes(self, num_nodes: Optional[int]) -> None: + self._store.num_nodes = num_nodes + + def is_edge_attr(self, key: str) -> bool: + val = super().is_edge_attr(key) + if not val and self.edge_index is not None: + return key in self and self[key].size(0) == self.num_edges + return val + + def __inc__(self, key: str, value: Any, *args: Any, **kwargs: Any) -> Any: + if key == 'edge_index': + return paddle.to_tensor([[self.num_nodes], [self.num_edges]]) + else: + return super().__inc__(key, value, *args, **kwargs) + + def subgraph(self, subset: Tensor) -> 'HyperGraphData': + r"""Returns the induced subgraph given by the node indices + :obj:`subset`. + + .. note:: + + If only a subset of a hyperedge's nodes are to be + selected in the subgraph, the hyperedge will remain in the + subgraph, but only the selected nodes will be connected by + the hyperedge. Hyperedges that only connects one node in the + subgraph will be removed. + + Examples: + >>> x = torch.randn(4, 16) + >>> edge_index = torch.tensor([ + ... [0, 1, 0, 2, 1, 1, 2, 4], + ... [0, 0, 1, 1, 1, 2, 2, 2] + >>> ]) + >>> data = HyperGraphData(x = x, edge_index = edge_index) + >>> subset = torch.tensor([1, 2, 4]) + >>> subgraph = data.subgraph(subset) + >>> subgraph.edge_index + tensor([[2, 1, 1, 2, 4], + [0, 0, 1, 1, 1]]) + + Args: + subset (LongTensor or BoolTensor): The nodes to keep. + """ + assert self.edge_index is not None + out = hyper_subgraph(subset, self.edge_index, relabel_nodes=True, + num_nodes=self.num_nodes, return_edge_mask=True) + edge_index, _, edge_mask = out + + data = copy.copy(self) + + for key, value in self.items(): + if key == 'edge_index': + data.edge_index = edge_index + elif key == 'num_nodes': + if subset.dtype == paddle.bool: + data.num_nodes = int(subset.sum()) + else: + data.num_nodes = subset.size(0) + elif self.is_node_attr(key): + cat_dim = self.__cat_dim__(key, value) + data[key] = select(value, subset, dim=cat_dim) + elif self.is_edge_attr(key): + cat_dim = self.__cat_dim__(key, value) + data[key] = select(value, edge_mask, dim=cat_dim) + + return data + + def edge_subgraph(self, subset: Tensor) -> Self: + raise NotImplementedError + + def to_heterogeneous( + self, + node_type: Optional[Tensor] = None, + edge_type: Optional[Tensor] = None, + node_type_names: Optional[List[NodeType]] = None, + edge_type_names: Optional[List[EdgeType]] = None, + ) -> HeteroData: + raise NotImplementedError + + def has_isolated_nodes(self) -> bool: + if self.edge_index is None: + return False + return paddle.unique(self.edge_index[0]).shape[0] < self.num_nodes + + def is_directed(self) -> bool: + raise NotImplementedError + + def is_undirected(self) -> bool: + raise NotImplementedError + + def has_self_loops(self) -> bool: + raise NotImplementedError + + def validate(self, raise_on_error: bool = True) -> bool: + r"""Validates the correctness of the data.""" + cls_name = self.__class__.__name__ + status = True + + num_nodes = self.num_nodes + if num_nodes is None: + status = False + warn_or_raise(f"'num_nodes' is undefined in '{cls_name}'", + raise_on_error) + + if self.edge_index is not None: + if self.edge_index.dim() != 2 or self.edge_index.size(0) != 2: + status = False + warn_or_raise( + f"'edge_index' needs to be of shape [2, num_edges] in " + f"'{cls_name}' (found {self.edge_index.size()})", + raise_on_error) + + if self.edge_index is not None and self.edge_index.numel() > 0: + if self.edge_index.min() < 0: + status = False + warn_or_raise( + f"'edge_index' contains negative indices in " + f"'{cls_name}' (found {int(self.edge_index.min())})", + raise_on_error) + + if num_nodes is not None and self.edge_index[0].max() >= num_nodes: + status = False + warn_or_raise( + f"'edge_index' contains larger indices than the number " + f"of nodes ({num_nodes}) in '{cls_name}' " + f"(found {int(self.edge_index.max())})", raise_on_error) + + return status + + +def warn_or_raise(msg: str, raise_on_error: bool = True) -> None: + if raise_on_error: + raise ValueError(msg) + else: + warnings.warn(msg) diff --git a/jointContribution/mattergen/paddle_geometric/data/in_memory_dataset.py b/jointContribution/mattergen/paddle_geometric/data/in_memory_dataset.py new file mode 100644 index 00000000..b287cced --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/in_memory_dataset.py @@ -0,0 +1,354 @@ +import copy +import os.path as osp +import warnings +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + Mapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +import paddle +from paddle import Tensor +from tqdm import tqdm + +import paddle_geometric +from paddle_geometric.data import Batch, Data +from paddle_geometric.data.collate import collate +from paddle_geometric.data.data import BaseData +from paddle_geometric.data.dataset import Dataset, IndexType +from paddle_geometric.data.separate import separate +from paddle_geometric.io import fs + + +class InMemoryDataset(Dataset): + r"""Dataset base class for creating graph datasets which easily fit + into CPU memory. + See `here `__ for the accompanying + tutorial. + + Args: + root (str, optional): Root directory where the dataset should be saved. + (optional: :obj:`None`) + transform (callable, optional): A function/transform that takes in a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + transformed version. + The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + a :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + transformed version. + The data object will be transformed before being saved to disk. + (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + boolean value, indicating whether the data object should be + included in the final dataset. (default: :obj:`None`) + log (bool, optional): Whether to print any console output while + downloading and processing the dataset. (default: :obj:`True`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + @property + def raw_file_names(self) -> Union[str, List[str], Tuple[str, ...]]: + raise NotImplementedError + + @property + def processed_file_names(self) -> Union[str, List[str], Tuple[str, ...]]: + raise NotImplementedError + + def __init__( + self, + root: Optional[str] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + log: bool = True, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, log, + force_reload) + + self._data: Optional[BaseData] = None + self.slices: Optional[Dict[str, Tensor]] = None + self._data_list: Optional[MutableSequence[Optional[BaseData]]] = None + + @property + def num_classes(self) -> int: + if self.transform is None: + return self._infer_num_classes(self._data.y) + return super().num_classes + + def len(self) -> int: + if self.slices is None: + return 1 + for _, value in nested_iter(self.slices): + return len(value) - 1 + return 0 + + def get(self, idx: int) -> BaseData: + # TODO (matthias) Avoid unnecessary copy here. + if self.len() == 1: + return copy.copy(self._data) + + if not hasattr(self, '_data_list') or self._data_list is None: + self._data_list = self.len() * [None] + elif self._data_list[idx] is not None: + return copy.copy(self._data_list[idx]) + + data = separate( + cls=self._data.__class__, + batch=self._data, + idx=idx, + slice_dict=self.slices, + decrement=False, + ) + + self._data_list[idx] = copy.copy(data) + + return data + + @classmethod + def save(cls, data_list: Sequence[BaseData], path: str) -> None: + r"""Saves a list of data objects to the file path :obj:`path`.""" + data, slices = cls.collate(data_list) + fs.torch_save((data.to_dict(), slices, data.__class__), path) + + def load(self, path: str, data_cls: Type[BaseData] = Data) -> None: + r"""Loads the dataset from the file path :obj:`path`.""" + out = fs.torch_load(path) + assert isinstance(out, tuple) + assert len(out) == 2 or len(out) == 3 + if len(out) == 2: # Backward compatibility. + data, self.slices = out + else: + data, self.slices, data_cls = out + + if not isinstance(data, dict): # Backward compatibility. + self.data = data + else: + self.data = data_cls.from_dict(data) + + @staticmethod + def collate( + data_list: Sequence[BaseData], + ) -> Tuple[BaseData, Optional[Dict[str, Tensor]]]: + r"""Collates a list of :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` objects to the internal + storage format of :class:`~paddle_geometric.data.InMemoryDataset`. + """ + if len(data_list) == 1: + return data_list[0], None + + data, slices, _ = collate( + data_list[0].__class__, + data_list=data_list, + increment=False, + add_batch=False, + ) + + return data, slices + + def copy(self, idx: Optional[IndexType] = None) -> 'InMemoryDataset': + r"""Performs a deep-copy of the dataset. If :obj:`idx` is not given, + will clone the full dataset. Otherwise, will only clone a subset of the + dataset from indices :obj:`idx`. + Indices can be slices, lists, tuples, and a :obj:`torch.Tensor` or + :obj:`np.ndarray` of type long or bool. + """ + if idx is None: + data_list = [self.get(i) for i in self.indices()] + else: + data_list = [self.get(i) for i in self.index_select(idx).indices()] + + dataset = copy.copy(self) + dataset._indices = None + dataset._data_list = None + dataset.data, dataset.slices = self.collate(data_list) + return dataset + + def to_on_disk_dataset( + self, + root: Optional[str] = None, + backend: str = 'sqlite', + log: bool = True, + ) -> 'paddle_geometric.data.OnDiskDataset': + r"""Converts the :class:`InMemoryDataset` to a :class:`OnDiskDataset` + variant. Useful for distributed training and hardware instances with + limited amount of shared memory. + + root (str, optional): Root directory where the dataset should be saved. + If set to :obj:`None`, will save the dataset in + :obj:`root/on_disk`. + Note that it is important to specify :obj:`root` to account for + different dataset splits. (optional: :obj:`None`) + backend (str): The :class:`Database` backend to use. + (default: :obj:`"sqlite"`) + log (bool, optional): Whether to print any console output while + processing the dataset. (default: :obj:`True`) + """ + if root is None and (self.root is None or not osp.exists(self.root)): + raise ValueError(f"The root directory of " + f"'{self.__class__.__name__}' is not specified. " + f"Please pass in 'root' when creating on-disk " + f"datasets from it.") + + root = root or osp.join(self.root, 'on_disk') + + in_memory_dataset = self + ref_data = in_memory_dataset.get(0) + if not isinstance(ref_data, Data): + raise NotImplementedError( + f"`{self.__class__.__name__}.to_on_disk_dataset()` is " + f"currently only supported on homogeneous graphs") + + # Parse the schema ==================================================== + + schema: Dict[str, Any] = {} + for key, value in ref_data.to_dict().items(): + if isinstance(value, (int, float, str)): + schema[key] = value.__class__ + elif isinstance(value, Tensor) and value.dim() == 0: + schema[key] = dict(dtype=value.dtype, size=(-1, )) + elif isinstance(value, Tensor): + size = list(value.size()) + size[ref_data.__cat_dim__(key, value)] = -1 + schema[key] = dict(dtype=value.dtype, size=tuple(size)) + else: + schema[key] = object + + # Create the on-disk dataset ========================================== + + class OnDiskDataset(paddle_geometric.data.OnDiskDataset): + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + ): + super().__init__( + root=root, + transform=transform, + backend=backend, + schema=schema, + ) + + def process(self): + _iter = [ + in_memory_dataset.get(i) + for i in in_memory_dataset.indices() + ] + if log: # pragma: no cover + _iter = tqdm(_iter, desc='Converting to OnDiskDataset') + + data_list: List[Data] = [] + for i, data in enumerate(_iter): + data_list.append(data) + if i + 1 == len(in_memory_dataset) or (i + 1) % 1000 == 0: + self.extend(data_list) + data_list = [] + + def serialize(self, data: Data) -> Dict[str, Any]: + return data.to_dict() + + def deserialize(self, data: Dict[str, Any]) -> Data: + return Data.from_dict(data) + + def __repr__(self) -> str: + arg_repr = str(len(self)) if len(self) > 1 else '' + return (f'OnDisk{in_memory_dataset.__class__.__name__}(' + f'{arg_repr})') + + return OnDiskDataset(root, transform=in_memory_dataset.transform) + + @property + def data(self) -> Any: + msg1 = ("It is not recommended to directly access the internal " + "storage format `data` of an 'InMemoryDataset'.") + msg2 = ("The given 'InMemoryDataset' only references a subset of " + "examples of the full dataset, but 'data' will contain " + "information of the full dataset.") + msg3 = ("The data of the dataset is already cached, so any " + "modifications to `data` will not be reflected when accessing " + "its elements. Clearing the cache now by removing all " + "elements in `dataset._data_list`.") + msg4 = ("If you are absolutely certain what you are doing, access the " + "internal storage via `InMemoryDataset._data` instead to " + "suppress this warning. Alternatively, you can access stacked " + "individual attributes of every graph via " + "`dataset.{attr_name}`.") + + msg = msg1 + if self._indices is not None: + msg += f' {msg2}' + if self._data_list is not None: + msg += f' {msg3}' + self._data_list = None + msg += f' {msg4}' + + warnings.warn(msg) + + return self._data + + @data.setter + def data(self, value: Any): + self._data = value + self._data_list = None + + def __getattr__(self, key: str) -> Any: + data = self.__dict__.get('_data') + if isinstance(data, Data) and key in data: + if self._indices is None and data.__inc__(key, data[key]) == 0: + return data[key] + else: + data_list = [self.get(i) for i in self.indices()] + return Batch.from_data_list(data_list)[key] + + raise AttributeError(f"'{self.__class__.__name__}' object has no " + f"attribute '{key}'") + + def to(self, device: Union[int, str]) -> 'InMemoryDataset': + r"""Performs device conversion of the whole dataset.""" + if self._indices is not None: + raise ValueError("The given 'InMemoryDataset' only references a " + "subset of examples of the full dataset") + if self._data_list is not None: + raise ValueError("The data of the dataset is already cached") + self._data.to(device) + return self + + def cpu(self, *args: str) -> 'InMemoryDataset': + r"""Moves the dataset to CPU memory.""" + return self.cpu() + + def cuda( + self, + device: Optional[Union[int, str]] = None, + ) -> 'InMemoryDataset': + r"""Moves the dataset toto CUDA memory.""" + if isinstance(device, int): + device = f'cuda:{int}' + elif device is None: + device = 'cuda' + return self.to(device) + + +def nested_iter(node: Union[Mapping, Sequence]) -> Iterable: + if isinstance(node, Mapping): + for key, value in node.items(): + yield from nested_iter(value) + elif isinstance(node, Sequence): + yield from enumerate(node) + else: + yield None, node diff --git a/jointContribution/mattergen/paddle_geometric/data/lightning/__init__.py b/jointContribution/mattergen/paddle_geometric/data/lightning/__init__.py new file mode 100644 index 00000000..9f2cc148 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/lightning/__init__.py @@ -0,0 +1,7 @@ +from .datamodule import LightningDataset, LightningNodeData, LightningLinkData + +__all__ = classes = [ + 'LightningDataset', + 'LightningNodeData', + 'LightningLinkData', +] diff --git a/jointContribution/mattergen/paddle_geometric/data/lightning/datamodule.py b/jointContribution/mattergen/paddle_geometric/data/lightning/datamodule.py new file mode 100644 index 00000000..10134202 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/lightning/datamodule.py @@ -0,0 +1,639 @@ +import copy +import inspect +import warnings +from typing import Any, Dict, Optional, Tuple, Type, Union + +import paddle +from paddle.io import DataLoader +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.loader import NeighborSampler + +from paddle_geometric.data import Data, Dataset, HeteroData +from paddle_geometric.loader import DataLoader, LinkLoader, NodeLoader +from paddle_geometric.sampler import BaseSampler, NeighborSampler +from paddle_geometric.typing import InputEdges, InputNodes, OptTensor + + + +class LightningDataModule: + def __init__(self, has_val: bool, has_test: bool, **kwargs: Any) -> None: + self.has_val = has_val + self.has_test = has_test + + kwargs.setdefault('batch_size', 1) + kwargs.setdefault('num_workers', 0) + kwargs.setdefault('pin_memory', True) + kwargs.setdefault('persistent_workers', kwargs.get('num_workers', 0) > 0) + + if 'shuffle' in kwargs: + warnings.warn( + f"The 'shuffle={kwargs['shuffle']}' option is ignored in '{self.__class__.__name__}'." + " Remove it from the argument list to disable this warning" + ) + del kwargs['shuffle'] + + self.kwargs = kwargs + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.kwargs})' + + +class LightningData(LightningDataModule): + def __init__( + self, + data: Union[Data, HeteroData], + has_val: bool, + has_test: bool, + loader: str = 'neighbor', + graph_sampler: Optional[NeighborSampler] = None, + eval_loader_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> None: + kwargs.setdefault('batch_size', 1) + kwargs.setdefault('num_workers', 0) + + if graph_sampler is not None: + loader = 'custom' + + if loader not in ['full', 'neighbor', 'custom']: + raise ValueError(f"Undefined 'loader' option (got '{loader}')") + + if loader == 'full' and kwargs['batch_size'] != 1: + warnings.warn(f"Re-setting 'batch_size' to 1 for loader='full'") + kwargs['batch_size'] = 1 + + if loader == 'full' and kwargs['num_workers'] != 0: + warnings.warn(f"Re-setting 'num_workers' to 0 for loader='full'") + kwargs['num_workers'] = 0 + + if loader == 'full' and kwargs.get('sampler') is not None: + warnings.warn("'sampler' option is not supported for loader='full'") + kwargs.pop('sampler', None) + + if loader == 'full' and kwargs.get('batch_sampler') is not None: + warnings.warn("'batch_sampler' option is not supported for loader='full'") + kwargs.pop('batch_sampler', None) + + super().__init__(has_val, has_test, **kwargs) + + if loader == 'full': + if kwargs.get('pin_memory', False): + warnings.warn(f"Re-setting 'pin_memory' to 'False' for loader='full'") + self.kwargs['pin_memory'] = False + + self.data = data + self.loader = loader + + if loader in ['neighbor']: + sampler_kwargs = {k: v for k, v in kwargs.items() if k in NeighborSampler.__init__.__annotations__} + sampler_kwargs.setdefault('share_memory', kwargs['num_workers'] > 0) + self.graph_sampler = NeighborSampler(data, **sampler_kwargs) + self.loader_kwargs = {k: v for k, v in kwargs.items() if k not in sampler_kwargs} + + elif graph_sampler is not None: + self.graph_sampler = graph_sampler + self.loader_kwargs = kwargs + + else: + assert loader == 'full' + self.loader_kwargs = kwargs + + self.eval_loader_kwargs = copy.copy(self.loader_kwargs) + if eval_loader_kwargs is not None: + if hasattr(self, 'graph_sampler'): + self.eval_graph_sampler = copy.copy(self.graph_sampler) + + eval_sampler_kwargs = { + k: v for k, v in eval_loader_kwargs.items() if k in NeighborSampler.__init__.__annotations__ + } + for key, value in eval_sampler_kwargs.items(): + setattr(self.eval_graph_sampler, key, value) + + self.eval_loader_kwargs.update(eval_loader_kwargs) + + elif hasattr(self, 'graph_sampler'): + self.eval_graph_sampler = self.graph_sampler + + self.eval_loader_kwargs.pop('sampler', None) + self.eval_loader_kwargs.pop('batch_sampler', None) + + if 'batch_sampler' in self.loader_kwargs: + self.loader_kwargs.pop('batch_size', None) + + @property + def train_shuffle(self) -> bool: + shuffle = self.loader_kwargs.get('sampler', None) is None + shuffle &= self.loader_kwargs.get('batch_sampler', None) is None + return shuffle + + def prepare_data(self) -> None: + if self.loader == 'full': + raise ValueError( + f"'{self.__class__.__name__}' with loader='full' requires training on a single device" + ) + + def full_dataloader(self, **kwargs: Any) -> DataLoader: + warnings.filterwarnings('ignore', '.*does not have many workers.*') + warnings.filterwarnings('ignore', '.*data loading bottlenecks.*') + + return DataLoader( + [self.data], # type: ignore + batch_size=1, + collate_fn=lambda xs: xs[0], + **kwargs, + ) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(data={self.data}, loader={self.loader}, kwargs={self.kwargs})' + +class LightningDataset(LightningDataModule): + r""" + Converts a set of `paddle_geometric.data.Dataset` objects into a compatible module + for multi-GPU graph-level training. + + This class simplifies the integration of datasets with PaddlePaddle's DataLoader + for training, validation, testing, and prediction. + """ + + def __init__( + self, + train_dataset: Dataset, + val_dataset: Optional[Dataset] = None, + test_dataset: Optional[Dataset] = None, + pred_dataset: Optional[Dataset] = None, + **kwargs: Any, + ) -> None: + """ + Initialize the LightningDataset. + + Args: + train_dataset (Dataset): The training dataset. + val_dataset (Dataset, optional): The validation dataset. Defaults to None. + test_dataset (Dataset, optional): The test dataset. Defaults to None. + pred_dataset (Dataset, optional): The prediction dataset. Defaults to None. + **kwargs (optional): Additional arguments for the DataLoader. + """ + self.train_dataset = train_dataset + self.val_dataset = val_dataset + self.test_dataset = test_dataset + self.pred_dataset = pred_dataset + self.kwargs = kwargs + + def dataloader(self, dataset: Dataset, **kwargs: Any) -> DataLoader: + """ + Create a DataLoader for the given dataset. + + Args: + dataset (Dataset): The dataset to load. + **kwargs (optional): Additional arguments for the DataLoader. + + Returns: + DataLoader: A DataLoader instance for the dataset. + """ + return DataLoader(dataset, **kwargs) + + def train_dataloader(self) -> DataLoader: + """ + Create a DataLoader for training. + + Returns: + DataLoader: The DataLoader for training data. + """ + shuffle = self.kwargs.get('sampler', None) is None and \ + self.kwargs.get('batch_sampler', None) is None + return self.dataloader( + self.train_dataset, + shuffle=shuffle, + **self.kwargs, + ) + + def val_dataloader(self) -> DataLoader: + """ + Create a DataLoader for validation. + + Returns: + DataLoader: The DataLoader for validation data. + """ + assert self.val_dataset is not None, "Validation dataset cannot be None" + + kwargs = copy.copy(self.kwargs) + kwargs.pop('sampler', None) + kwargs.pop('batch_sampler', None) + + return self.dataloader(self.val_dataset, shuffle=False, **kwargs) + + def test_dataloader(self) -> DataLoader: + """ + Create a DataLoader for testing. + + Returns: + DataLoader: The DataLoader for test data. + """ + assert self.test_dataset is not None, "Test dataset cannot be None" + + kwargs = copy.copy(self.kwargs) + kwargs.pop('sampler', None) + kwargs.pop('batch_sampler', None) + + return self.dataloader(self.test_dataset, shuffle=False, **kwargs) + + def predict_dataloader(self) -> DataLoader: + """ + Create a DataLoader for predictions. + + Returns: + DataLoader: The DataLoader for prediction data. + """ + assert self.pred_dataset is not None, "Prediction dataset cannot be None" + + kwargs = copy.copy(self.kwargs) + kwargs.pop('sampler', None) + kwargs.pop('batch_sampler', None) + + return self.dataloader(self.pred_dataset, shuffle=False, **kwargs) + + def __repr__(self) -> str: + """ + Return a string representation of the object. + + Returns: + str: A string representation of the object. + """ + kwargs = { + "train_dataset": self.train_dataset, + "val_dataset": self.val_dataset, + "test_dataset": self.test_dataset, + "pred_dataset": self.pred_dataset, + **self.kwargs, + } + return f'{self.__class__.__name__}({kwargs})' + + +class LightningNodeData(LightningData): + """ + Converts a `paddle_geometric.data.Data` or `paddle_geometric.data.HeteroData` object + into a node-level DataLoader for multi-GPU training using Paddle. + + This class simplifies the process of preparing data for training, validation, + testing, and prediction at the node level. + """ + + def __init__( + self, + data: Union[Data, HeteroData], + input_train_nodes: InputNodes = None, + input_train_time: OptTensor = None, + input_val_nodes: InputNodes = None, + input_val_time: OptTensor = None, + input_test_nodes: InputNodes = None, + input_test_time: OptTensor = None, + input_pred_nodes: InputNodes = None, + input_pred_time: OptTensor = None, + loader: str = 'neighbor', + node_sampler: Optional[BaseSampler] = None, + eval_loader_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> None: + # Automatically infer node splits if not provided. + if input_train_nodes is None: + input_train_nodes = self.infer_input_nodes(data, split='train') + + if input_val_nodes is None: + input_val_nodes = self.infer_input_nodes(data, split='val') + + if input_test_nodes is None: + input_test_nodes = self.infer_input_nodes(data, split='test') + + if input_pred_nodes is None: + input_pred_nodes = self.infer_input_nodes(data, split='pred') + + super().__init__( + data=data, + has_val=input_val_nodes is not None, + has_test=input_test_nodes is not None, + loader=loader, + graph_sampler=node_sampler, + eval_loader_kwargs=eval_loader_kwargs, + **kwargs, + ) + + # self.data = data + # self.loader = loader + # self.node_sampler = node_sampler + # self.eval_loader_kwargs = eval_loader_kwargs or {} + # self.kwargs = kwargs + + self.input_train_nodes = input_train_nodes + self.input_train_time = input_train_time + self.input_train_id: OptTensor = None + + self.input_val_nodes = input_val_nodes + self.input_val_time = input_val_time + self.input_val_id: OptTensor = None + + self.input_test_nodes = input_test_nodes + self.input_test_time = input_test_time + self.input_test_id: OptTensor = None + + self.input_pred_nodes = input_pred_nodes + self.input_pred_time = input_pred_time + self.input_pred_id: OptTensor = None + + def infer_input_nodes(self, data, split: str) -> InputNodes: + """ + Infers the input nodes for a given split (train, val, test, pred) based on + attributes in the data object. + """ + for attr in [f'{split}_mask', f'{split}_idx', f'{split}_index']: + if hasattr(data, attr): + return getattr(data, attr) + return None + + def dataloader( + self, + input_nodes: InputNodes, + input_time: OptTensor = None, + input_id: OptTensor = None, + node_sampler: Optional[BaseSampler] = None, + **kwargs: Any, + ) -> DataLoader: + """ + Creates a DataLoader for the given input nodes. + + Args: + input_nodes: The nodes to sample. + input_time: Optional time information for temporal graphs. + input_id: Optional IDs for additional filtering. + node_sampler: The sampler object to use for batching. + **kwargs: Additional DataLoader arguments. + """ + if self.loader == 'full': + return DataLoader([self.data], batch_size=1, shuffle=False, **kwargs) + + assert node_sampler is not None, "Node sampler is required for neighbor sampling." + + return NodeLoader( + data=self.data, + node_sampler=node_sampler, + input_nodes=input_nodes, + input_time=input_time, + input_id=input_id, + **kwargs, + ) + + def train_dataloader(self) -> DataLoader: + """ + Creates a DataLoader for training. + + Returns: + DataLoader: A DataLoader for the training nodes. + """ + return self.dataloader( + self.input_train_nodes, + self.input_train_time, + self.input_train_id, + node_sampler=self.node_sampler, + shuffle=True, + **self.kwargs, + ) + + def val_dataloader(self) -> DataLoader: + """ + Creates a DataLoader for validation. + + Returns: + DataLoader: A DataLoader for the validation nodes. + """ + return self.dataloader( + self.input_val_nodes, + self.input_val_time, + self.input_val_id, + node_sampler=self.node_sampler, + shuffle=False, + **self.eval_loader_kwargs, + ) + + def test_dataloader(self) -> DataLoader: + """ + Creates a DataLoader for testing. + + Returns: + DataLoader: A DataLoader for the test nodes. + """ + return self.dataloader( + self.input_test_nodes, + self.input_test_time, + self.input_test_id, + node_sampler=self.node_sampler, + shuffle=False, + **self.eval_loader_kwargs, + ) + + def predict_dataloader(self) -> DataLoader: + """ + Creates a DataLoader for prediction. + + Returns: + DataLoader: A DataLoader for the prediction nodes. + """ + return self.dataloader( + self.input_pred_nodes, + self.input_pred_time, + self.input_pred_id, + node_sampler=self.node_sampler, + shuffle=False, + **self.eval_loader_kwargs, + ) +class LightningLinkData(LightningData): + """ + Converts a `paddle_geometric.data.Data` or `paddle_geometric.data.HeteroData` + object into a link-level DataLoader for multi-GPU training using Paddle. + + This class supports both full-batch and neighbor-based mini-batch loading. + + Args: + data (Data or HeteroData): The graph data object. + input_train_edges (Tensor, optional): The edges used for training. + input_train_labels (Tensor, optional): Labels for the training edges. + input_train_time (Tensor, optional): Timestamps for the training edges. + input_val_edges (Tensor, optional): The edges used for validation. + input_val_labels (Tensor, optional): Labels for the validation edges. + input_val_time (Tensor, optional): Timestamps for the validation edges. + input_test_edges (Tensor, optional): The edges used for testing. + input_test_labels (Tensor, optional): Labels for the test edges. + input_test_time (Tensor, optional): Timestamps for the test edges. + input_pred_edges (Tensor, optional): The edges used for prediction. + input_pred_labels (Tensor, optional): Labels for the prediction edges. + input_pred_time (Tensor, optional): Timestamps for the prediction edges. + loader (str): Loading strategy ('full' or 'neighbor'). Default is 'neighbor'. + link_sampler (BaseSampler, optional): Custom sampler for mini-batches. + eval_loader_kwargs (dict, optional): Additional arguments for evaluation loaders. + **kwargs (optional): Additional arguments for `LinkNeighborLoader`. + """ + def __init__( + self, + data: Union[Data, HeteroData], + input_train_edges: InputEdges = None, + input_train_labels: OptTensor = None, + input_train_time: OptTensor = None, + input_val_edges: InputEdges = None, + input_val_labels: OptTensor = None, + input_val_time: OptTensor = None, + input_test_edges: InputEdges = None, + input_test_labels: OptTensor = None, + input_test_time: OptTensor = None, + input_pred_edges: InputEdges = None, + input_pred_labels: OptTensor = None, + input_pred_time: OptTensor = None, + loader: str = 'neighbor', + link_sampler: Optional[BaseSampler] = None, + eval_loader_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> None: + + super().__init__( + data=data, + has_val=input_val_edges is not None, + has_test=input_test_edges is not None, + loader=loader, + graph_sampler=link_sampler, + eval_loader_kwargs=eval_loader_kwargs, + **kwargs, + ) + # self.data = data + # self.loader = loader + # self.link_sampler = link_sampler + # self.eval_loader_kwargs = eval_loader_kwargs or {} + # self.kwargs = kwargs + + self.input_train_edges = input_train_edges + self.input_train_labels = input_train_labels + self.input_train_time = input_train_time + self.input_train_id: OptTensor = None + + self.input_val_edges = input_val_edges + self.input_val_labels = input_val_labels + self.input_val_time = input_val_time + self.input_val_id: OptTensor = None + + self.input_test_edges = input_test_edges + self.input_test_labels = input_test_labels + self.input_test_time = input_test_time + self.input_test_id: OptTensor = None + + self.input_pred_edges = input_pred_edges + self.input_pred_labels = input_pred_labels + self.input_pred_time = input_pred_time + self.input_pred_id: OptTensor = None + + def dataloader( + self, + input_edges=None, + input_labels=None, + input_time=None, + link_sampler=None, + **kwargs: Any, + ) -> DataLoader: + if self.loader == 'full': + return DataLoader([self.data], batch_size=1, shuffle=False, **kwargs) + + assert link_sampler is not None, "Link sampler is required for neighbor sampling." + + return LinkLoader( + data=self.data, + link_sampler=link_sampler, + edge_label_index=input_edges, + edge_label=input_labels, + edge_label_time=input_time, + **kwargs, + ) + + def train_dataloader(self) -> DataLoader: + return self.dataloader( + self.input_train_edges, + self.input_train_labels, + self.input_train_time, + link_sampler=self.link_sampler, + shuffle=True, + **self.kwargs, + ) + + def val_dataloader(self) -> DataLoader: + return self.dataloader( + self.input_val_edges, + self.input_val_labels, + self.input_val_time, + link_sampler=self.link_sampler, + shuffle=False, + **self.eval_loader_kwargs, + ) + + def test_dataloader(self) -> DataLoader: + return self.dataloader( + self.input_test_edges, + self.input_test_labels, + self.input_test_time, + link_sampler=self.link_sampler, + shuffle=False, + **self.eval_loader_kwargs, + ) + + def predict_dataloader(self) -> DataLoader: + return self.dataloader( + self.input_pred_edges, + self.input_pred_labels, + self.input_pred_time, + link_sampler=self.link_sampler, + shuffle=False, + **self.eval_loader_kwargs, + ) + +# Supporting Functions +def infer_input_nodes(data: Union[Data, HeteroData], split: str): + attr_name: Optional[str] = None + if f'{split}_mask' in data: + attr_name = f'{split}_mask' + elif f'{split}_idx' in data: + attr_name = f'{split}_idx' + elif f'{split}_index' in data: + attr_name = f'{split}_index' + + if attr_name is None: + return None + + if isinstance(data, Data): + return data[attr_name] + if isinstance(data, HeteroData): + input_nodes_dict = { + node_type: store[attr_name] + for node_type, store in data.node_items() if attr_name in store + } + if len(input_nodes_dict) != 1: + raise ValueError(f"Could not automatically determine the input " + f"nodes of {data} since there exist multiple " + f"types with attribute '{attr_name}'") + return list(input_nodes_dict.items())[0] + return None + +def kwargs_repr(**kwargs: Any) -> str: + return ', '.join([f'{k}={v}' for k, v in kwargs.items() if v is not None]) + +def split_kwargs( + kwargs: Dict[str, Any], + sampler_cls: Type, +) -> Tuple[Dict[str, Any], Dict[str, Any]]: + """ + Splits keyword arguments into sampler and loader arguments. + """ + sampler_args = sampler_cls.__init__.__code__.co_varnames + + sampler_kwargs: Dict[str, Any] = {} + loader_kwargs: Dict[str, Any] = {} + + for key, value in kwargs.items(): + if key in sampler_args: + sampler_kwargs[key] = value + else: + loader_kwargs[key] = value + + return sampler_kwargs, loader_kwargs \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/data/makedirs.py b/jointContribution/mattergen/paddle_geometric/data/makedirs.py new file mode 100644 index 00000000..e0f5fd43 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/makedirs.py @@ -0,0 +1,17 @@ +from paddle_geometric.deprecation import deprecated +from paddle_geometric.io import fs + + +@deprecated("use 'os.makedirs(path, exist_ok=True)' instead") +def makedirs(path: str): + r"""Recursively creates a directory. + + .. warning:: + + :meth:`makedirs` is deprecated and will be removed soon. + Please use :obj:`os.makedirs(path, exist_ok=True)` instead. + + Args: + path (str): The path to create. + """ + fs.makedirs(path, exist_ok=True) diff --git a/jointContribution/mattergen/paddle_geometric/data/on_disk_dataset.py b/jointContribution/mattergen/paddle_geometric/data/on_disk_dataset.py new file mode 100644 index 00000000..3d35cacc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/on_disk_dataset.py @@ -0,0 +1,169 @@ +import os +from typing import Any, Callable, Iterable, List, Optional, Sequence, Union + +from paddle import Tensor + +from paddle_geometric.data import Database, RocksDatabase, SQLiteDatabase +from paddle_geometric.data.data import BaseData +from paddle_geometric.data.database import Schema +from paddle_geometric.data.dataset import Dataset + + +class OnDiskDataset(Dataset): + r"""Dataset base class for creating large graph datasets which do not + easily fit into CPU memory at once by leveraging a :class:`Database` + backend for on-disk storage and access of data objects. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + transformed version. + The data object will be transformed before every access. + (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object and returns a + boolean value, indicating whether the data object should be + included in the final dataset. (default: :obj:`None`) + backend (str): The :class:`Database` backend to use + (one of :obj:`"sqlite"` or :obj:`"rocksdb"`). + (default: :obj:`"sqlite"`) + schema (Any or Tuple[Any] or Dict[str, Any], optional): The schema of + the input data. + Can take :obj:`int`, :obj:`float`, :obj:`str`, :obj:`object`, or a + dictionary with :obj:`dtype` and :obj:`size` keys (for specifying + tensor data) as input, and can be nested as a tuple or dictionary. + Specifying the schema will improve efficiency, since by default the + database will use python pickling for serializing and + deserializing. If specified to anything different than + :obj:`object`, implementations of :class:`OnDiskDataset` need to + override :meth:`serialize` and :meth:`deserialize` methods. + (default: :obj:`object`) + log (bool, optional): Whether to print any console output while + downloading and processing the dataset. (default: :obj:`True`) + """ + BACKENDS = { + 'sqlite': SQLiteDatabase, + 'rocksdb': RocksDatabase, + } + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + backend: str = 'sqlite', + schema: Schema = object, + log: bool = True, + ) -> None: + if backend not in self.BACKENDS: + raise ValueError(f"Database backend must be one of " + f"{set(self.BACKENDS.keys())} " + f"(got '{backend}')") + + self.backend = backend + self.schema = schema + + self._db: Optional[Database] = None + self._numel: Optional[int] = None + + super().__init__(root, transform, pre_filter=pre_filter, log=log) + + @property + def processed_file_names(self) -> str: + return f'{self.backend}.db' + + @property + def db(self) -> Database: + r"""Returns the underlying :class:`Database`.""" + if self._db is not None: + return self._db + + kwargs = {} + cls = self.BACKENDS[self.backend] + if issubclass(cls, SQLiteDatabase): + kwargs['name'] = self.__class__.__name__ + + os.makedirs(self.processed_dir, exist_ok=True) + path = self.processed_paths[0] + self._db = cls(path=path, schema=self.schema, **kwargs) + self._numel = len(self._db) + return self._db + + def close(self) -> None: + r"""Closes the connection to the underlying database.""" + if self._db is not None: + self._db.close() + + def serialize(self, data: BaseData) -> Any: + r"""Serializes the :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object into the expected DB + schema. + """ + if self.schema == object: + return data + raise NotImplementedError(f"`{self.__class__.__name__}.serialize()` " + f"needs to be overridden in case a " + f"non-default schema was passed") + + def deserialize(self, data: Any) -> BaseData: + r"""Deserializes the DB entry into a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object. + """ + if self.schema == object: + return data + raise NotImplementedError(f"`{self.__class__.__name__}.deserialize()` " + f"needs to be overridden in case a " + f"non-default schema was passed") + + def append(self, data: BaseData) -> None: + r"""Appends the data object to the dataset.""" + index = len(self) + self.db.insert(index, self.serialize(data)) + self._numel += 1 + + def extend( + self, + data_list: Sequence[BaseData], + batch_size: Optional[int] = None, + ) -> None: + r"""Extends the dataset by a list of data objects.""" + start = len(self) + end = start + len(data_list) + data_list = [self.serialize(data) for data in data_list] + self.db.multi_insert(range(start, end), data_list, batch_size) + self._numel += (end - start) + + def get(self, idx: int) -> BaseData: + r"""Gets the data object at index :obj:`idx`.""" + return self.deserialize(self.db.get(idx)) + + def multi_get( + self, + indices: Union[Iterable[int], Tensor, slice, range], + batch_size: Optional[int] = None, + ) -> List[BaseData]: + r"""Gets a list of data objects from the specified indices.""" + if len(indices) == 1: + data_list = [self.db.get(indices[0])] + else: + data_list = self.db.multi_get(indices, batch_size) + + data_list = [self.deserialize(data) for data in data_list] + if self.transform is not None: + data_list = [self.transform(data) for data in data_list] + return data_list + + def __getitems__(self, indices: List[int]) -> List[BaseData]: + return self.multi_get(indices) + + def len(self) -> int: + if self._numel is None: + self._numel = len(self.db) + return self._numel + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/data/remote_backend_utils.py b/jointContribution/mattergen/paddle_geometric/data/remote_backend_utils.py new file mode 100644 index 00000000..de88d7ff --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/remote_backend_utils.py @@ -0,0 +1,124 @@ +# This file defines a set of utilities for remote backends (backends that are +# characterized as Tuple[FeatureStore, GraphStore]). TODO support for +# non-heterogeneous graphs (feature stores with a group_name=None). + +from typing import Optional, Tuple, Union, overload + +from paddle_geometric.data import FeatureStore, GraphStore +from paddle_geometric.typing import EdgeType, NodeType + + +@overload +def _internal_num_nodes( + feature_store: FeatureStore, + graph_store: GraphStore, + query: NodeType, +) -> int: + pass + + +@overload +def _internal_num_nodes( + feature_store: FeatureStore, + graph_store: GraphStore, + query: EdgeType, +) -> Tuple[int, int]: + pass + + +# NOTE PaddleGeometric also supports querying by a relation type `rel` in an edge type +# (src, rel, dst). It may be worth supporting this in remote backends as well. +def _internal_num_nodes( + feature_store: FeatureStore, + graph_store: GraphStore, + query: Union[NodeType, EdgeType], +) -> Union[int, Tuple[int, int]]: + r"""Returns the number of nodes in the node type or the number of source + and destination nodes in an edge type by sequentially accessing attributes + in the feature and graph stores that reveal this number. + """ + def _matches_node_type( + query: Union[NodeType, EdgeType], + node_type: Optional[NodeType], + ) -> bool: + if isinstance(query, (list, tuple)): # EdgeType: + return query[0] == node_type or query[-1] == node_type + else: + return query == node_type + + node_query = isinstance(query, NodeType) + + # TODO: In general, a feature store and graph store should be able to + # expose methods that allow for easy access to individual attributes, + # instead of requiring iteration to identify a particular attribute. + # Implementing this should reduce the iteration below. + + # 1. Check the edges in the GraphStore, for each node type in each edge: + num_rows = num_cols = None + for edge_attr in graph_store.get_all_edge_attrs(): + if edge_attr.size is None: + continue + if _matches_node_type(query, edge_attr.edge_type[0]): + num_rows = num_rows or edge_attr.size[0] + if _matches_node_type(query, edge_attr.edge_type[-1]): + num_cols = num_cols or edge_attr.size[-1] + + if node_query and num_rows is not None: + return num_rows + if node_query and num_cols is not None: + return num_cols + if not node_query and num_rows is not None and num_cols is not None: + return num_rows, num_cols + + # 2. Check the node types stored in the FeatureStore: + tensor_attrs = feature_store.get_all_tensor_attrs() + matching_attrs = [ + attr for attr in tensor_attrs + if _matches_node_type(query, attr.group_name) + ] + if node_query: + if len(matching_attrs) > 0: + size = feature_store.get_tensor_size(matching_attrs[0]) + if size is not None: + return size[0] + else: + matching_src_attrs = [ + attr for attr in matching_attrs if attr.group_name == query[0] + ] + matching_dst_attrs = [ + attr for attr in matching_attrs if attr.group_name == query[-1] + ] + if len(matching_src_attrs) > 0 and len(matching_dst_attrs) > 0: + src_size = feature_store.get_tensor_size(matching_src_attrs[0]) + dst_size = feature_store.get_tensor_size(matching_dst_attrs[0]) + if src_size is not None and dst_size is not None: + return src_size[0], dst_size[0] + + raise ValueError( + f"Unable to accurately infer the number of nodes corresponding to " + f"query {query} from feature store {feature_store} and graph store " + f"{graph_store}. Please consider either adding an edge containing " + f"the nodes in this query or feature tensors for the nodes in this " + f"query.") + + +def num_nodes( + feature_store: FeatureStore, + graph_store: GraphStore, + query: NodeType, +) -> int: + r"""Returns the number of nodes in a given node type stored in a remote + backend. + """ + return _internal_num_nodes(feature_store, graph_store, query) + + +def size( + feature_store: FeatureStore, + graph_store: GraphStore, + query: EdgeType, +) -> Tuple[int, int]: + r"""Returns the size of an edge (number of source nodes, number of + destination nodes) in an edge stored in a remote backend. + """ + return _internal_num_nodes(feature_store, graph_store, query) diff --git a/jointContribution/mattergen/paddle_geometric/data/separate.py b/jointContribution/mattergen/paddle_geometric/data/separate.py new file mode 100644 index 00000000..e5d4dac8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/separate.py @@ -0,0 +1,155 @@ +from collections.abc import Mapping, Sequence +from typing import Any, Type, TypeVar + +from paddle import Tensor + +from paddle_geometric import EdgeIndex, Index +from paddle_geometric.data.data import BaseData +from paddle_geometric.data.storage import BaseStorage +from paddle_geometric.typing import SparseTensor, TensorFrame +from paddle_geometric.utils import narrow + +T = TypeVar('T') + + +def separate( + cls: Type[T], + batch: Any, + idx: int, + slice_dict: Any, + inc_dict: Any = None, + decrement: bool = True, +) -> T: + # Separates the individual element from a `batch` at index `idx`. + # `separate` can handle both homogeneous and heterogeneous data objects by + # individually separating all their stores. + # In addition, `separate` can handle nested data structures such as + # dictionaries and lists. + + data = cls().stores_as(batch) + + # Iterate over each storage object and recursively separate its attributes: + for batch_store, data_store in zip(batch.stores, data.stores): + key = batch_store._key + if key is not None: # Heterogeneous: + attrs = slice_dict[key].keys() + else: # Homogeneous: + attrs = set(batch_store.keys()) + attrs = [attr for attr in slice_dict.keys() if attr in attrs] + + for attr in attrs: + if key is not None: + slices = slice_dict[key][attr] + incs = inc_dict[key][attr] if decrement else None + else: + slices = slice_dict[attr] + incs = inc_dict[attr] if decrement else None + + data_store[attr] = _separate(attr, batch_store[attr], idx, slices, + incs, batch, batch_store, decrement) + + # The `num_nodes` attribute needs special treatment, as we cannot infer + # the real number of nodes from the total number of nodes alone: + if hasattr(batch_store, '_num_nodes'): + data_store.num_nodes = batch_store._num_nodes[idx] + + return data + + +def _separate( + key: str, + values: Any, + idx: int, + slices: Any, + incs: Any, + batch: BaseData, + store: BaseStorage, + decrement: bool, +) -> Any: + + if isinstance(values, Tensor): + # Narrow a `paddle.Tensor` based on `slices`. + # NOTE: We need to take care of decrementing elements appropriately. + key = str(key) + cat_dim = batch.__cat_dim__(key, values, store) + start, end = int(slices[idx]), int(slices[idx + 1]) + value = narrow(values, cat_dim or 0, start, end - start) + value = value.squeeze(0) if cat_dim is None else value + + if isinstance(values, Index) and values._cat_metadata is not None: + # Reconstruct original `Index` metadata: + value._dim_size = values._cat_metadata.dim_size[idx] + value._is_sorted = values._cat_metadata.is_sorted[idx] + + if isinstance(values, EdgeIndex) and values._cat_metadata is not None: + # Reconstruct original `EdgeIndex` metadata: + value._sparse_size = values._cat_metadata.sparse_size[idx] + value._sort_order = values._cat_metadata.sort_order[idx] + value._is_undirected = values._cat_metadata.is_undirected[idx] + + if (decrement and incs is not None + and (incs.ndim > 1 or int(incs[idx]) != 0)): + value = value - incs[idx] + + return value + + elif isinstance(values, SparseTensor) and decrement: + # Narrow a `SparseTensor` based on `slices`. + # NOTE: `cat_dim` may return a tuple to allow for diagonal stacking. + key = str(key) + cat_dim = batch.__cat_dim__(key, values, store) + cat_dims = (cat_dim, ) if isinstance(cat_dim, int) else cat_dim + for i, dim in enumerate(cat_dims): + start, end = int(slices[idx][i]), int(slices[idx + 1][i]) + values = values.narrow(dim, start, end - start) + return values + + elif isinstance(values, TensorFrame): + key = str(key) + start, end = int(slices[idx]), int(slices[idx + 1]) + value = values[start:end] + return value + + elif isinstance(values, Mapping): + # Recursively separate elements of dictionaries. + return { + key: + _separate( + key, + value, + idx, + slices=slices[key], + incs=incs[key] if decrement else None, + batch=batch, + store=store, + decrement=decrement, + ) + for key, value in values.items() + } + + elif (isinstance(values, Sequence) and isinstance(values[0], Sequence) + and not isinstance(values[0], str) and len(values[0]) > 0 + and isinstance(values[0][0], (Tensor, SparseTensor)) + and isinstance(slices, Sequence)): + # Recursively separate elements of lists of lists. + return [value[idx] for value in values] + + elif (isinstance(values, Sequence) and not isinstance(values, str) + and isinstance(values[0], (Tensor, SparseTensor)) + and isinstance(slices, Sequence)): + # Recursively separate elements of lists of Tensors/SparseTensors. + return [ + _separate( + key, + value, + idx, + slices=slices[i], + incs=incs[i] if decrement else None, + batch=batch, + store=store, + decrement=decrement, + ) for i, value in enumerate(values) + ] + + else: + return values[idx] diff --git a/jointContribution/mattergen/paddle_geometric/data/storage.py b/jointContribution/mattergen/paddle_geometric/data/storage.py new file mode 100644 index 00000000..e9b276dc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/storage.py @@ -0,0 +1,914 @@ +import copy +import warnings +import weakref +from collections import defaultdict, namedtuple +from collections.abc import Mapping, MutableMapping, Sequence +from enum import Enum +from typing import ( + Any, + Callable, + Dict, + Iterable, + Iterator, + List, + NamedTuple, + Optional, + Set, + Tuple, + Union, + overload, +) + +import numpy as np +import paddle +from paddle import Tensor +from typing_extensions import Self + +from paddle_geometric import EdgeIndex +from paddle_geometric.data.view import ItemsView, KeysView, ValuesView +from paddle_geometric.typing import ( + EdgeType, + NodeType, + SparseTensor, + TensorFrame, +) +from paddle_geometric.utils import ( + coalesce, + contains_isolated_nodes, + is_paddle_sparse_tensor, + is_undirected, + select, + sort_edge_index, +) + +N_KEYS = {'x', 'feat', 'pos', 'batch', 'node_type', 'n_id', 'tf'} +E_KEYS = {'edge_index', 'edge_weight', 'edge_attr', 'edge_type', 'e_id'} + + +class AttrType(Enum): + NODE = 'NODE' + EDGE = 'EDGE' + OTHER = 'OTHER' + + +class BaseStorage(MutableMapping): + # This class wraps a Python dictionary and extends it as follows: + # 1. It allows attribute assignments, e.g.: + # `storage.x = ...` in addition to `storage['x'] = ...` + # 2. It allows private attributes that are not exposed to the user, e.g.: + # `storage._{key} = ...` and accessible via `storage._{key}` + # 3. It holds an (optional) weak reference to its parent object, e.g.: + # `storage._parent = weakref.ref(parent)` + # 4. It allows iterating over only a subset of keys, e.g.: + # `storage.values('x', 'y')` or `storage.items('x', 'y') + # 5. It adds additional PyTorch Tensor functionality, e.g.: + # `storage.cpu()`, `storage.cuda()` or `storage.share_memory_()`. + def __init__( + self, + _mapping: Optional[Dict[str, Any]] = None, + **kwargs: Any, + ) -> None: + super().__init__() + self._mapping: Dict[str, Any] = {} + for key, value in (_mapping or {}).items(): + setattr(self, key, value) + for key, value in kwargs.items(): + setattr(self, key, value) + + @property + def _key(self) -> Any: + return None + + def _pop_cache(self, key: str) -> None: + for cache in getattr(self, '_cached_attr', {}).values(): + cache.discard(key) + + def __len__(self) -> int: + return len(self._mapping) + + def __getattr__(self, key: str) -> Any: + if key == '_mapping': + self._mapping = {} + return self._mapping + try: + return self[key] + except KeyError: + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute '{key}'" + ) from None + + def __setattr__(self, key: str, value: Any) -> None: + propobj = getattr(self.__class__, key, None) + if propobj is not None and getattr(propobj, 'fset', None) is not None: + propobj.fset(self, value) + elif key == '_parent': + self.__dict__[key] = weakref.ref(value) + elif key[:1] == '_': + self.__dict__[key] = value + else: + self[key] = value + + def __delattr__(self, key: str) -> None: + if key[:1] == '_': + del self.__dict__[key] + else: + del self[key] + + def __getitem__(self, key: str) -> Any: + return self._mapping[key] + + def __setitem__(self, key: str, value: Any) -> None: + self._pop_cache(key) + if value is None and key in self._mapping: + del self._mapping[key] + elif value is not None: + self._mapping[key] = value + + def __delitem__(self, key: str) -> None: + if key in self._mapping: + self._pop_cache(key) + del self._mapping[key] + + def __iter__(self) -> Iterator[Any]: + return iter(self._mapping) + + def __copy__(self) -> Self: + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + if key != '_cached_attr': + out.__dict__[key] = value + out._mapping = copy.copy(out._mapping) + return out + + def __deepcopy__(self, memo: Optional[Dict[int, Any]]) -> Self: + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = value + out._mapping = copy.deepcopy(out._mapping, memo) + return out + + def __getstate__(self) -> Dict[str, Any]: + out = self.__dict__.copy() + + _parent = out.get('_parent', None) + if _parent is not None: + out['_parent'] = _parent() + + return out + + def __setstate__(self, mapping: Dict[str, Any]) -> None: + for key, value in mapping.items(): + self.__dict__[key] = value + + _parent = self.__dict__.get('_parent', None) + if _parent is not None: + self.__dict__['_parent'] = weakref.ref(_parent) + + def __repr__(self) -> str: + return repr(self._mapping) + + # Allow iterating over subsets ############################################ + + # In contrast to standard `keys()`, `values()` and `items()` functions of + # Python dictionaries, we allow to only iterate over a subset of items + # denoted by a list of keys `args`. + # This is especially useful for adding PyTorch Tensor functionality to the + # storage object, e.g., in case we only want to transfer a subset of keys + # to the GPU (i.e. the ones that are relevant to the deep learning model). + + def keys(self, *args: str) -> KeysView: # type: ignore + return KeysView(self._mapping, *args) + + def values(self, *args: str) -> ValuesView: # type: ignore + return ValuesView(self._mapping, *args) + + def items(self, *args: str) -> ItemsView: # type: ignore + return ItemsView(self._mapping, *args) + + def apply_(self, func: Callable, *args: str) -> Self: + r"""Applies the in-place function :obj:`func`, either to all attributes + or only the ones given in :obj:`*args`. + """ + for value in self.values(*args): + recursive_apply_(value, func) + return self + + def apply(self, func: Callable, *args: str) -> Self: + r"""Applies the function :obj:`func`, either to all attributes or only + the ones given in :obj:`*args`. + """ + for key, value in self.items(*args): + self[key] = recursive_apply(value, func) + return self + + # Additional functionality ################################################ + + def get(self, key: str, value: Optional[Any] = None) -> Any: + return self._mapping.get(key, value) + + def to_dict(self) -> Dict[str, Any]: + r"""Returns a dictionary of stored key/value pairs.""" + out_dict = copy.copy(self._mapping) + # Needed to preserve individual `num_nodes` attributes when calling + # `BaseData.collate`. + # TODO (matthias) Try to make this more generic. + if '_num_nodes' in self.__dict__: + out_dict['_num_nodes'] = self.__dict__['_num_nodes'] + return out_dict + + def to_namedtuple(self) -> NamedTuple: + r"""Returns a :obj:`NamedTuple` of stored key/value pairs.""" + field_names = list(self.keys()) + typename = f'{self.__class__.__name__}Tuple' + StorageTuple = namedtuple(typename, field_names) # type: ignore + return StorageTuple(*[self[key] for key in field_names]) + + def clone(self, *args: str) -> Self: + r"""Performs a deep-copy of the object.""" + return copy.deepcopy(self) + + def contiguous(self, *args: str) -> Self: + r"""Ensures a contiguous memory layout, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.contiguous(), *args) + + def to( + self, + device: Union[int, str], + *args: str, + non_blocking: bool = False, + ) -> Self: + r"""Performs tensor dtype and/or device conversion, either for all + attributes or only the ones given in :obj:`*args`. + """ + return self.apply( + lambda x: x.to(device=device, non_blocking=non_blocking), *args) + + def cpu(self, *args: str) -> Self: + r"""Copies attributes to CPU memory, either for all attributes or only + the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.cpu(), *args) + + def cuda( + self, + device: Optional[Union[int, str]] = None, + *args: str, + non_blocking: bool = False, + ) -> Self: # pragma: no cover + r"""Copies attributes to CUDA memory, either for all attributes or only + the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.cuda(device, non_blocking=non_blocking), + *args) + + def pin_memory(self, *args: str) -> Self: + r"""Copies attributes to pinned memory, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.pin_memory(), *args) + + def share_memory_(self, *args: str) -> Self: + r"""Moves attributes to shared memory, either for all attributes or + only the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.share_memory_(), *args) + + def detach_(self, *args: str) -> Self: + r"""Detaches attributes from the computation graph, either for all + attributes or only the ones given in :obj:`*args`. + """ + return self.apply(lambda x: x.detach_(), *args) + + def detach(self, *args: str) -> Self: + r"""Detaches attributes from the computation graph by creating a new + tensor, either for all attributes or only the ones given in + :obj:`*args`. + """ + return self.apply(lambda x: x.detach(), *args) + + def requires_grad_(self, *args: str, requires_grad: bool = True) -> Self: + r"""Tracks gradient computation, either for all attributes or only the + ones given in :obj:`*args`. + """ + return self.apply( + lambda x: x.requires_grad_(requires_grad=requires_grad), *args) + + def record_stream(self, stream: paddle.device.cuda.Stream, *args: str) -> 'Self': + r"""Ensures that the tensor memory is not reused for another tensor + until all current work queued on :obj:`stream` has been completed, + either for all attributes or only the ones given in :obj:`*args`. + """ + return self.apply_(lambda x: x._record_stream(stream), *args) + + + # Time Handling ########################################################### + + def _cat_dims(self, keys: Iterable[str]) -> Dict[str, int]: + return { + key: self._parent().__cat_dim__(key, self[key], self) + for key in keys + } + + def _select( + self, + keys: Iterable[str], + index_or_mask: Tensor, + ) -> Self: + + for key, dim in self._cat_dims(keys).items(): + self[key] = select(self[key], index_or_mask, dim) + + return self + + def concat(self, other: Self) -> Self: + if not (set(self.keys()) == set(other.keys())): + raise AttributeError('Given storage is not compatible') + + for key, dim in self._cat_dims(self.keys()).items(): + value1 = self[key] + value2 = other[key] + + if key in {'num_nodes', 'num_edges'}: + self[key] = value1 + value2 + + elif isinstance(value1, list): + self[key] = value1 + value2 + + elif isinstance(value1, Tensor): + self[key] = paddle.concat([value1, value2], axis=dim) + + else: + raise NotImplementedError( + f"'{self.__class__.__name__}.concat' not yet implemented " + f"for '{type(value1)}'") + + return self + + def is_sorted_by_time(self) -> bool: + if 'time' in self: + return bool(paddle.all(self.time[:-1] <= self.time[1:])) + return True + + def sort_by_time(self) -> 'MyClass': + if self.is_sorted_by_time(): + return self + + if 'time' in self: + _, perm = paddle.argsort(self.time, axis=0) + + if self.is_node_attr('time'): + keys = self.node_attrs() + elif self.is_edge_attr('time'): + keys = self.edge_attrs() + + self._select(keys, perm) + + return self + + def snapshot( + self, + start_time: Union[float, int], + end_time: Union[float, int], + attr: str = 'time', + ) -> Self: + if attr in self: + time = self[attr] + mask = (time >= start_time) & (time <= end_time) + + if self.is_node_attr(attr): + keys = self.node_attrs() + elif self.is_edge_attr(attr): + keys = self.edge_attrs() + + self._select(keys, mask) + + if self.is_node_attr(attr) and 'num_nodes' in self: + self.num_nodes: Optional[int] = int(mask.sum()) + + return self + + def up_to(self, time: Union[float, int]) -> Self: + if 'time' in self: + return self.snapshot(self.time.min().item(), time) + return self + + +class NodeStorage(BaseStorage): + r"""A storage for node-level information.""" + @property + def _key(self) -> NodeType: + key = self.__dict__.get('_key', None) + if key is None or not isinstance(key, str): + raise ValueError("'_key' does not denote a valid node type") + return key + + @property + def can_infer_num_nodes(self) -> bool: + keys = set(self.keys()) + num_node_keys = { + 'num_nodes', 'x', 'pos', 'batch', 'adj', 'adj_t', 'edge_index', + 'face' + } + if len(keys & num_node_keys) > 0: + return True + elif len([key for key in keys if 'node' in key]) > 0: + return True + else: + return False + + @property + def num_nodes(self) -> Optional[int]: + # We sequentially access attributes that reveal the number of nodes. + if 'num_nodes' in self: + return self['num_nodes'] + for key, value in self.items(): + if isinstance(value, Tensor) and key in N_KEYS: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, np.ndarray) and key in N_KEYS: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, TensorFrame) and key in N_KEYS: + return value.num_rows + for key, value in self.items(): + if isinstance(value, Tensor) and 'node' in key: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.size(cat_dim) + if isinstance(value, np.ndarray) and 'node' in key: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, TensorFrame) and 'node' in key: + return value.num_rows + if 'edge_index' in self and isinstance(self.edge_index, EdgeIndex): + if self.edge_index.sparse_size(0) is not None: + return self.edge_index.sparse_size(0) + if self.edge_index.sparse_size(1) is not None: + return self.edge_index.sparse_size(1) + if 'adj' in self and isinstance(self.adj, (Tensor, SparseTensor)): + return self.adj.size(0) + if 'adj_t' in self and isinstance(self.adj_t, (Tensor, SparseTensor)): + return self.adj_t.size(1) + warnings.warn( + f"Unable to accurately infer 'num_nodes' from the attribute set " + f"'{set(self.keys())}'. Please explicitly set 'num_nodes' as an " + f"attribute of " + + ("'data'" if self._key is None else f"'data[{self._key}]'") + + " to suppress this warning") + if 'edge_index' in self and isinstance(self.edge_index, Tensor): + if self.edge_index.numel() > 0: + return int(self.edge_index.max()) + 1 + return 0 + if 'face' in self and isinstance(self.face, Tensor): + if self.face.numel() > 0: + return int(self.face.max()) + 1 + return 0 + return None + + @num_nodes.setter + def num_nodes(self, num_nodes: Optional[int]) -> None: + self['num_nodes'] = num_nodes + + @property + def num_node_features(self) -> int: + x: Optional[Any] = self.get('x') + if isinstance(x, Tensor): + return 1 if x.dim() == 1 else x.size(-1) + if isinstance(x, np.ndarray): + return 1 if x.ndim == 1 else x.shape[-1] + if isinstance(x, SparseTensor): + return 1 if x.dim() == 1 else x.size(-1) + if isinstance(x, TensorFrame): + return x.num_cols + + tf: Optional[Any] = self.get('tf') + if isinstance(tf, TensorFrame): + return tf.num_cols + + return 0 + + @property + def num_features(self) -> int: + return self.num_node_features + + def is_node_attr(self, key: str) -> bool: + if '_cached_attr' not in self.__dict__: + self._cached_attr: Dict[AttrType, Set[str]] = defaultdict(set) + + if key in self._cached_attr[AttrType.NODE]: + return True + if key in self._cached_attr[AttrType.OTHER]: + return False + + value = self[key] + + if (isinstance(value, (list, tuple, TensorFrame)) + and len(value) == self.num_nodes): + self._cached_attr[AttrType.NODE].add(key) + return True + + if not isinstance(value, (Tensor, np.ndarray)): + self._cached_attr[AttrType.OTHER].add(key) + return False + + if value.ndim == 0: + self._cached_attr[AttrType.OTHER].add(key) + return False + + cat_dim = self._parent().__cat_dim__(key, value, self) + if value.shape[cat_dim] != self.num_nodes: + self._cached_attr[AttrType.OTHER].add(key) + return False + + self._cached_attr[AttrType.NODE].add(key) + return True + + def is_edge_attr(self, key: str) -> bool: + return False + + def node_attrs(self) -> List[str]: + return [key for key in self.keys() if self.is_node_attr(key)] + + +class EdgeStorage(BaseStorage): + r"""A storage for edge-level information. + + We support multiple ways to store edge connectivity in a + :class:`EdgeStorage` object: + + * :obj:`edge_index`: A :class:`torch.LongTensor` holding edge indices in + COO format with shape :obj:`[2, num_edges]` (the default format) + + * :obj:`adj`: A :class:`torch_sparse.SparseTensor` holding edge indices in + a sparse format, supporting both COO and CSR format. + + * :obj:`adj_t`: A **transposed** :class:`torch_sparse.SparseTensor` holding + edge indices in a sparse format, supporting both COO and CSR format. + This is the most efficient one for graph-based deep learning models as + indices are sorted based on target nodes. + """ + @property + def _key(self) -> EdgeType: + key = self.__dict__.get('_key', None) + if key is None or not isinstance(key, tuple) or not len(key) == 3: + raise ValueError("'_key' does not denote a valid edge type") + return key + + @property + def edge_index(self) -> paddle.Tensor: + if 'edge_index' in self: + return self['edge_index'] + if 'adj' in self and isinstance(self.adj, SparseTensor): + coo_indices = self.adj.to_dense().nonzero(as_tuple=False) + return paddle.stack([coo_indices[:, 0], coo_indices[:, 1]], axis=0) + if 'adj_t' in self and isinstance(self.adj_t, SparseTensor): + coo_indices = self.adj_t.to_dense().nonzero(as_tuple=False) + return paddle.stack([coo_indices[:, 1], coo_indices[:, 0]], axis=0) + raise AttributeError( + f"'{self.__class__.__name__}' object has no attribute " + f"'edge_index', 'adj' or 'adj_t'") + + + @edge_index.setter + def edge_index(self, edge_index: Optional[Tensor]) -> None: + self['edge_index'] = edge_index + + @property + def num_edges(self) -> int: + # We sequentially access attributes that reveal the number of edges. + if 'num_edges' in self: + return self['num_edges'] + for key, value in self.items(): + if isinstance(value, Tensor) and key in E_KEYS: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, np.ndarray) and key in E_KEYS: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, TensorFrame) and key in E_KEYS: + return value.num_rows + for key, value in self.items(): + if isinstance(value, Tensor) and 'edge' in key: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, np.ndarray) and 'edge' in key: + cat_dim = self._parent().__cat_dim__(key, value, self) + return value.shape[cat_dim] + if isinstance(value, TensorFrame) and 'edge' in key: + return value.num_rows + for value in self.values('adj', 'adj_t'): + if isinstance(value, SparseTensor): + return value.nnz() + elif is_paddle_sparse_tensor(value): + return value._nnz() + return 0 + + @property + def num_edge_features(self) -> int: + edge_attr: Optional[Any] = self.get('edge_attr') + if isinstance(edge_attr, Tensor): + return 1 if edge_attr.dim() == 1 else edge_attr.size(-1) + if isinstance(edge_attr, np.ndarray): + return 1 if edge_attr.ndim == 1 else edge_attr.shape[-1] + if isinstance(edge_attr, TensorFrame): + return edge_attr.num_cols + return 0 + + @property + def num_features(self) -> int: + return self.num_edge_features + + @overload + def size(self) -> Tuple[Optional[int], Optional[int]]: + pass + + @overload + def size(self, dim: int) -> Optional[int]: + pass + + def size( + self, dim: Optional[int] = None + ) -> Union[Tuple[Optional[int], Optional[int]], Optional[int]]: + + if self._key is None: + raise NameError("Unable to infer 'size' without explicit " + "'_key' assignment") + + size = (self._parent()[self._key[0]].num_nodes, + self._parent()[self._key[-1]].num_nodes) + + return size if dim is None else size[dim] + + def is_node_attr(self, key: str) -> bool: + return False + + def is_edge_attr(self, key: str) -> bool: + if '_cached_attr' not in self.__dict__: + self._cached_attr: Dict[AttrType, Set[str]] = defaultdict(set) + + if key in self._cached_attr[AttrType.EDGE]: + return True + if key in self._cached_attr[AttrType.OTHER]: + return False + + value = self[key] + + if (isinstance(value, (list, tuple, TensorFrame)) + and len(value) == self.num_edges): + self._cached_attr[AttrType.EDGE].add(key) + return True + + if not isinstance(value, (Tensor, np.ndarray)): + self._cached_attr[AttrType.OTHER].add(key) + return False + + if value.ndim == 0: + self._cached_attr[AttrType.OTHER].add(key) + return False + + cat_dim = self._parent().__cat_dim__(key, value, self) + if value.shape[cat_dim] != self.num_edges: + self._cached_attr[AttrType.OTHER].add(key) + return False + + self._cached_attr[AttrType.EDGE].add(key) + return True + + def edge_attrs(self) -> List[str]: + return [key for key in self.keys() if self.is_edge_attr(key)] + + def is_sorted(self, sort_by_row: bool = True) -> bool: + if 'edge_index' in self: + index = self.edge_index[0] if sort_by_row else self.edge_index[1] + return bool(paddle.all(index[:-1] <= index[1:])) + return True + + def sort(self, sort_by_row: bool = True) -> Self: + if 'edge_index' in self: + edge_attrs = self.edge_attrs() + edge_attrs.remove('edge_index') + edge_feats = [self[edge_attr] for edge_attr in edge_attrs] + self.edge_index, edge_feats = sort_edge_index( + self.edge_index, edge_feats, sort_by_row=sort_by_row) + for key, edge_feat in zip(edge_attrs, edge_feats): + self[key] = edge_feat + return self + + def is_coalesced(self) -> bool: + for value in self.values('adj', 'adj_t'): + return value.is_coalesced() + + if 'edge_index' in self: + size = [s for s in self.size() if s is not None] + num_nodes = max(size) if len(size) > 0 else None + + new_edge_index = coalesce(self.edge_index, num_nodes=num_nodes) + + return (self.edge_index.numel() == new_edge_index.numel() + and paddle.equal(self.edge_index, new_edge_index)) + + return True + + def coalesce(self, reduce: str = 'sum') -> Self: + for key, value in self.items('adj', 'adj_t'): + self[key] = value.coalesce(reduce) + + if 'edge_index' in self: + + size = [s for s in self.size() if s is not None] + num_nodes = max(size) if len(size) > 0 else None + + self.edge_index, self.edge_attr = coalesce( + self.edge_index, + edge_attr=self.get('edge_attr'), + num_nodes=num_nodes, + ) + + return self + + def has_isolated_nodes(self) -> bool: + edge_index, num_nodes = self.edge_index, self.size(1) + if num_nodes is None: + raise NameError("Unable to infer 'num_nodes'") + if self.is_bipartite(): + return paddle.unique(edge_index[1]).numel() < num_nodes + else: + return contains_isolated_nodes(edge_index, num_nodes) + + def has_self_loops(self) -> bool: + if self.is_bipartite(): + return False + edge_index = self.edge_index + return int((edge_index[0] == edge_index[1]).sum()) > 0 + + def is_undirected(self) -> bool: + if self.is_bipartite(): + return False + + for value in self.values('adj', 'adj_t'): + return value.is_symmetric() + + edge_index = self.edge_index + edge_attr = self.edge_attr if 'edge_attr' in self else None + return is_undirected(edge_index, edge_attr, num_nodes=self.size(0)) + + def is_directed(self) -> bool: + return not self.is_undirected() + + def is_bipartite(self) -> bool: + return self._key is not None and self._key[0] != self._key[-1] + + +class GlobalStorage(NodeStorage, EdgeStorage): + r"""A storage for both node-level and edge-level information.""" + @property + def _key(self) -> Any: + return None + + @property + def num_features(self) -> int: + return self.num_node_features + + @overload + def size(self) -> Tuple[Optional[int], Optional[int]]: + pass + + @overload + def size(self, dim: int) -> Optional[int]: + pass + + def size( + self, dim: Optional[int] = None + ) -> Union[Tuple[Optional[int], Optional[int]], Optional[int]]: + size = (self.num_nodes, self.num_nodes) + return size if dim is None else size[dim] + + def is_node_attr(self, key: str) -> bool: + if '_cached_attr' not in self.__dict__: + self._cached_attr: Dict[AttrType, Set[str]] = defaultdict(set) + + if key in self._cached_attr[AttrType.NODE]: + return True + if key in self._cached_attr[AttrType.EDGE]: + return False + if key in self._cached_attr[AttrType.OTHER]: + return False + + value = self[key] + + if (isinstance(value, (list, tuple, TensorFrame)) + and len(value) == self.num_nodes): + self._cached_attr[AttrType.NODE].add(key) + return True + + if not isinstance(value, (Tensor, np.ndarray)): + return False + + if value.ndim == 0: + self._cached_attr[AttrType.OTHER].add(key) + return False + + cat_dim = self._parent().__cat_dim__(key, value, self) + num_nodes, num_edges = self.num_nodes, self.num_edges + + if value.shape[cat_dim] != num_nodes: + if value.shape[cat_dim] == num_edges: + self._cached_attr[AttrType.EDGE].add(key) + else: + self._cached_attr[AttrType.OTHER].add(key) + return False + + if num_nodes != num_edges: + self._cached_attr[AttrType.NODE].add(key) + return True + + if 'edge' not in key: + self._cached_attr[AttrType.NODE].add(key) + return True + else: + self._cached_attr[AttrType.EDGE].add(key) + return False + + def is_edge_attr(self, key: str) -> bool: + if '_cached_attr' not in self.__dict__: + self._cached_attr = defaultdict(set) + + if key in self._cached_attr[AttrType.EDGE]: + return True + if key in self._cached_attr[AttrType.NODE]: + return False + if key in self._cached_attr[AttrType.OTHER]: + return False + + value = self[key] + + if (isinstance(value, (list, tuple, TensorFrame)) + and len(value) == self.num_edges): + self._cached_attr[AttrType.EDGE].add(key) + return True + + if not isinstance(value, (Tensor, np.ndarray)): + return False + + if value.ndim == 0: + self._cached_attr[AttrType.OTHER].add(key) + return False + + cat_dim = self._parent().__cat_dim__(key, value, self) + num_nodes, num_edges = self.num_nodes, self.num_edges + + if value.shape[cat_dim] != num_edges: + if value.shape[cat_dim] == num_nodes: + self._cached_attr[AttrType.NODE].add(key) + else: + self._cached_attr[AttrType.OTHER].add(key) + return False + + if num_edges != num_nodes: + self._cached_attr[AttrType.EDGE].add(key) + return True + + if 'edge' in key: + self._cached_attr[AttrType.EDGE].add(key) + return True + else: + self._cached_attr[AttrType.NODE].add(key) + return False + + +def recursive_apply_(data: Any, func: Callable) -> Any: + if isinstance(data, Tensor): + func(data) + elif isinstance(data, tuple) and hasattr(data, '_fields'): # namedtuple + for value in data: + recursive_apply_(value, func) + elif isinstance(data, Sequence) and not isinstance(data, str): + for value in data: + recursive_apply_(value, func) + elif isinstance(data, Mapping): + for value in data.values(): + recursive_apply_(value, func) + else: + try: + func(data) + except Exception: + pass + + +def recursive_apply(data: Any, func: Callable) -> Any: + if isinstance(data, Tensor): + return func(data) + elif isinstance(data, paddle.nn.Layer): + return func(data) + elif isinstance(data, tuple) and hasattr(data, '_fields'): # namedtuple + return type(data)(*(recursive_apply(d, func) for d in data)) + elif isinstance(data, Sequence) and not isinstance(data, str): + return [recursive_apply(d, func) for d in data] + elif isinstance(data, Mapping): + return {key: recursive_apply(data[key], func) for key in data} + else: + try: + return func(data) + except Exception: + return data diff --git a/jointContribution/mattergen/paddle_geometric/data/summary.py b/jointContribution/mattergen/paddle_geometric/data/summary.py new file mode 100644 index 00000000..db61a8fe --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/summary.py @@ -0,0 +1,171 @@ +from collections import defaultdict +from dataclasses import dataclass +from typing import Dict, List, Optional, Union + +import paddle +from tqdm import tqdm +from typing_extensions import Self + +from paddle_geometric.data import Dataset, HeteroData +from paddle_geometric.typing import EdgeType, NodeType + + +@dataclass +class Stats: + mean: float + std: float + min: float + quantile25: float + median: float + quantile75: float + max: float + + @classmethod + def from_data( + cls, + data: Union[List[int], List[float], paddle.Tensor], + ) -> Self: + if not isinstance(data, paddle.Tensor): + data = paddle.to_tensor(data, dtype="float32") + data = data.cast("float32") + + return cls( + mean=data.mean().item(), + std=data.std().item(), + min=data.min().item(), + quantile25=paddle.quantile(data, 0.25).item(), + median=paddle.median(data).item(), + quantile75=paddle.quantile(data, 0.75).item(), + max=data.max().item(), + ) + + +@dataclass(repr=False) +class Summary: + name: str + num_graphs: int + num_nodes: Stats + num_edges: Stats + num_nodes_per_type: Optional[Dict[NodeType, Stats]] = None + num_edges_per_type: Optional[Dict[EdgeType, Stats]] = None + + @classmethod + def from_dataset( + cls, + dataset: Dataset, + progress_bar: Optional[bool] = None, + per_type: bool = True, + ) -> Self: + r"""Creates a summary of a :class:`~paddle_geometric.data.Dataset` + object. + + Args: + dataset (Dataset): The dataset. + progress_bar (bool, optional): If set to :obj:`True`, will show a + progress bar during stats computation. If set to :obj:`None`, + will automatically decide whether to show a progress bar based + on dataset size. (default: :obj:`None`) + per_type (bool, optional): If set to :obj:`True`, will separate + statistics per node and edge type (only applicable in + heterogeneous graph datasets). (default: :obj:`True`) + """ + name = dataset.__class__.__name__ + + if progress_bar is None: + progress_bar = len(dataset) >= 10000 + + if progress_bar: + dataset = tqdm(dataset) + + num_nodes, num_edges = [], [] + _num_nodes_per_type = defaultdict(list) + _num_edges_per_type = defaultdict(list) + + for data in dataset: + assert data.num_nodes is not None + num_nodes.append(data.num_nodes) + num_edges.append(data.num_edges) + + if per_type and isinstance(data, HeteroData): + for node_type in data.node_types: + _num_nodes_per_type[node_type].append( + data[node_type].num_nodes) + for edge_type in data.edge_types: + _num_edges_per_type[edge_type].append( + data[edge_type].num_edges) + + num_nodes_per_type = None + if len(_num_nodes_per_type) > 0: + num_nodes_per_type = { + node_type: Stats.from_data(num_nodes_list) + for node_type, num_nodes_list in _num_nodes_per_type.items() + } + + num_edges_per_type = None + if len(_num_edges_per_type) > 0: + num_edges_per_type = { + edge_type: Stats.from_data(num_edges_list) + for edge_type, num_edges_list in _num_edges_per_type.items() + } + + return cls( + name=name, + num_graphs=len(dataset), + num_nodes=Stats.from_data(num_nodes), + num_edges=Stats.from_data(num_edges), + num_nodes_per_type=num_nodes_per_type, + num_edges_per_type=num_edges_per_type, + ) + + def format(self, fmt: str = "psql") -> str: + r"""Formats summary statistics of the dataset. + + Args: + fmt (str, optional): Summary tables format. Available table formats + can be found `here `__. (default: :obj:`"psql"`) + """ + from tabulate import tabulate + + body = f'{self.name} (#graphs={self.num_graphs}):\n' + + content = [['', '#nodes', '#edges']] + stats = [self.num_nodes, self.num_edges] + for field in Stats.__dataclass_fields__: + row = [field] + [f'{getattr(s, field):.1f}' for s in stats] + content.append(row) + body += tabulate(content, headers='firstrow', tablefmt=fmt) + + if self.num_nodes_per_type is not None: + content = [['']] + content[0] += list(self.num_nodes_per_type.keys()) + + for field in Stats.__dataclass_fields__: + row = [field] + [ + f'{getattr(s, field):.1f}' + for s in self.num_nodes_per_type.values() + ] + content.append(row) + body += "\nNumber of nodes per node type:\n" + body += tabulate(content, headers='firstrow', tablefmt=fmt) + + if self.num_edges_per_type is not None: + content = [['']] + content[0] += [ + f"({', '.join(edge_type)})" + for edge_type in self.num_edges_per_type.keys() + ] + + for field in Stats.__dataclass_fields__: + row = [field] + [ + f'{getattr(s, field):.1f}' + for s in self.num_edges_per_type.values() + ] + content.append(row) + body += "\nNumber of edges per edge type:\n" + body += tabulate(content, headers='firstrow', tablefmt=fmt) + + return body + + def __repr__(self) -> str: + return self.format() diff --git a/jointContribution/mattergen/paddle_geometric/data/temporal.py b/jointContribution/mattergen/paddle_geometric/data/temporal.py new file mode 100644 index 00000000..00c73d79 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/temporal.py @@ -0,0 +1,227 @@ +import copy +from typing import ( + Any, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Tuple, + Union, +) + +import numpy as np +import paddle + +from paddle_geometric.data.data import BaseData, size_repr +from paddle_geometric.data.storage import ( + BaseStorage, + EdgeStorage, + GlobalStorage, + NodeStorage, +) + + +class TemporalData(BaseData): + r"""A data object composed of a stream of events describing a temporal + graph. The :class:`~paddle_geometric.data.TemporalData` object can hold + a list of events (that can be understood as temporal edges in a graph) + with structured messages. + An event is composed of a source node, a destination node, a timestamp, + and a message. Any *Continuous-Time Dynamic Graph* (CTDG) can be + represented with these four values. + + This object mimics the behavior of a regular Python dictionary while + providing PyTorch/Paddle tensor functionalities and utilities. + + Args: + src (paddle.Tensor, optional): A list of source nodes for the events + with shape :obj:`[num_events]`. (default: :obj:`None`) + dst (paddle.Tensor, optional): A list of destination nodes for the + events with shape :obj:`[num_events]`. (default: :obj:`None`) + t (paddle.Tensor, optional): The timestamps for each event with shape + :obj:`[num_events]`. (default: :obj:`None`) + msg (paddle.Tensor, optional): Messages feature matrix with shape + :obj:`[num_events, num_msg_features]`. (default: :obj:`None`) + **kwargs (optional): Additional attributes. + + .. note:: + The shape of :obj:`src`, :obj:`dst`, :obj:`t` and the first dimension + of :obj:`msg` should be the same (:obj:`num_events`). + """ + def __init__( + self, + src: Optional[paddle.Tensor] = None, + dst: Optional[paddle.Tensor] = None, + t: Optional[paddle.Tensor] = None, + msg: Optional[paddle.Tensor] = None, + **kwargs, + ): + super().__init__() + self.__dict__['_store'] = GlobalStorage(_parent=self) + + self.src = src + self.dst = dst + self.t = t + self.msg = msg + + for key, value in kwargs.items(): + setattr(self, key, value) + + @classmethod + def from_dict(cls, mapping: Dict[str, Any]) -> 'TemporalData': + """Creates a :class:`~paddle_geometric.data.TemporalData` object from + a Python dictionary.""" + return cls(**mapping) + + def index_select(self, idx: Any) -> 'TemporalData': + idx = prepare_idx(idx) + data = copy.copy(self) + for key, value in data._store.items(): + if value.shape[0] == self.num_events: + data[key] = value[idx] + return data + + def __getitem__(self, idx: Any) -> Any: + if isinstance(idx, str): + return self._store[idx] + return self.index_select(idx) + + def __setitem__(self, key: str, value: Any): + """Sets the attribute :obj:`key` to :obj:`value`.""" + self._store[key] = value + + def __delitem__(self, key: str): + if key in self._store: + del self._store[key] + + def __getattr__(self, key: str) -> Any: + if '_store' not in self.__dict__: + raise RuntimeError( + "The 'data' object was created by an older version. If this " + "error occurred while loading an existing dataset, remove the " + "'processed/' directory in the dataset's root folder and try again." + ) + return getattr(self._store, key) + + def __setattr__(self, key: str, value: Any): + setattr(self._store, key, value) + + def __delattr__(self, key: str): + delattr(self._store, key) + + def __iter__(self) -> Iterable: + for i in range(self.num_events): + yield self[i] + + def __len__(self) -> int: + return self.num_events + + def __call__(self, *args: List[str]) -> Iterable: + yield from self._store.items(*args) + + def __copy__(self): + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = value + out.__dict__['_store'] = copy.copy(self._store) + out._store._parent = out + return out + + def __deepcopy__(self, memo): + out = self.__class__.__new__(self.__class__) + for key, value in self.__dict__.items(): + out.__dict__[key] = copy.deepcopy(value, memo) + out._store._parent = out + return out + + def stores_as(self, data: 'TemporalData'): + return self + + @property + def stores(self) -> List[BaseStorage]: + return [self._store] + + @property + def node_stores(self) -> List[NodeStorage]: + return [self._store] + + @property + def edge_stores(self) -> List[EdgeStorage]: + return [self._store] + + def to_dict(self) -> Dict[str, Any]: + return self._store.to_dict() + + def to_namedtuple(self) -> NamedTuple: + return self._store.to_namedtuple() + + @property + def num_nodes(self) -> int: + """Returns the number of nodes in the graph.""" + return max(int(self.src.max()), int(self.dst.max())) + 1 + + @property + def num_events(self) -> int: + """Returns the number of events loaded.""" + return self.src.shape[0] + + @property + def num_edges(self) -> int: + """Alias for :meth:`~paddle_geometric.data.TemporalData.num_events`.""" + return self.num_events + + @property + def edge_index(self) -> paddle.Tensor: + """Returns the edge indices of the graph.""" + if 'edge_index' in self: + return self._store['edge_index'] + if self.src is not None and self.dst is not None: + return paddle.stack([self.src, self.dst], axis=0) + raise ValueError(f"{self.__class__.__name__} does not contain " + f"'edge_index' information") + + def size( + self, dim: Optional[int] = None + ) -> Union[Tuple[Optional[int], Optional[int]], Optional[int]]: + """Returns the size of the adjacency matrix induced by the graph.""" + size = (int(self.src.max()), int(self.dst.max())) + return size if dim is None else size[dim] + + def train_val_test_split(self, val_ratio: float = 0.15, + test_ratio: float = 0.15): + """Splits the data into training, validation, and test sets based on + time.""" + val_time, test_time = np.quantile( + self.t.numpy(), + [1. - val_ratio - test_ratio, 1. - test_ratio]) + + val_idx = int((self.t <= val_time).sum().item()) + test_idx = int((self.t <= test_time).sum().item()) + + return self[:val_idx], self[val_idx:test_idx], self[test_idx:] + + def __repr__(self) -> str: + cls = self.__class__.__name__ + info = ', '.join([size_repr(k, v) for k, v in self._store.items()]) + return f'{cls}({info})' + + +############################################################################### + + +def prepare_idx(idx): + if isinstance(idx, int): + return slice(idx, idx + 1) + if isinstance(idx, (list, tuple)): + return paddle.to_tensor(idx) + elif isinstance(idx, slice): + return idx + elif isinstance(idx, paddle.Tensor) and idx.dtype == paddle.int64: + return idx + elif isinstance(idx, paddle.Tensor) and idx.dtype == paddle.bool: + return idx + + raise IndexError( + f"Only strings, integers, slices (`:`), list, tuples, and long or " + f"bool tensors are valid indices (got '{type(idx).__name__}')") diff --git a/jointContribution/mattergen/paddle_geometric/data/view.py b/jointContribution/mattergen/paddle_geometric/data/view.py new file mode 100644 index 00000000..82424c66 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/data/view.py @@ -0,0 +1,39 @@ +from typing import Any, Iterator, List, Mapping, Tuple + + +class MappingView: + def __init__(self, mapping: Mapping[str, Any], *args: str): + self._mapping = mapping + self._args = args + + def _keys(self) -> List[str]: + if len(self._args) == 0: + return list(self._mapping.keys()) + else: + return [arg for arg in self._args if arg in self._mapping] + + def __len__(self) -> int: + return len(self._keys()) + + def __repr__(self) -> str: + mapping = {key: self._mapping[key] for key in self._keys()} + return f'{self.__class__.__name__}({mapping})' + + __class_getitem__ = classmethod(type([])) # type: ignore + + +class KeysView(MappingView): + def __iter__(self) -> Iterator[str]: + yield from self._keys() + + +class ValuesView(MappingView): + def __iter__(self) -> Iterator[Any]: + for key in self._keys(): + yield self._mapping[key] + + +class ItemsView(MappingView): + def __iter__(self) -> Iterator[Tuple[str, Any]]: + for key in self._keys(): + yield (key, self._mapping[key]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/__init__.py b/jointContribution/mattergen/paddle_geometric/datasets/__init__.py new file mode 100644 index 00000000..8011c1f9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/__init__.py @@ -0,0 +1,230 @@ +# flake8: noqa + +from .karate import KarateClub +from .tu_dataset import TUDataset +from .gnn_benchmark_dataset import GNNBenchmarkDataset +from .planetoid import Planetoid +from .nell import NELL +from .citation_full import CitationFull, CoraFull +from .coauthor import Coauthor +from .amazon import Amazon +from .ppi import PPI +from .reddit import Reddit +from .reddit2 import Reddit2 +from .flickr import Flickr +from .yelp import Yelp +from .amazon_products import AmazonProducts +from .qm7 import QM7b +from .qm9 import QM9 +from .md17 import MD17 +from .zinc import ZINC +from .aqsol import AQSOL +from .molecule_net import MoleculeNet +from .pcqm4m import PCQM4Mv2 +from .entities import Entities +from .rel_link_pred_dataset import RelLinkPredDataset +from .ged_dataset import GEDDataset +from .attributed_graph_dataset import AttributedGraphDataset +from .mnist_superpixels import MNISTSuperpixels +from .faust import FAUST +from .dynamic_faust import DynamicFAUST +from .shapenet import ShapeNet +from .modelnet import ModelNet +from .coma import CoMA +from .shrec2016 import SHREC2016 +from .tosca import TOSCA +from .pcpnet_dataset import PCPNetDataset +from .s3dis import S3DIS +from .geometry import GeometricShapes +from .bitcoin_otc import BitcoinOTC +from .gdelt_lite import GDELTLite +from .icews import ICEWS18 +from .gdelt import GDELT +from .willow_object_class import WILLOWObjectClass +from .pascal import PascalVOCKeypoints +from .pascal_pf import PascalPF +from .snap_dataset import SNAPDataset +from .suite_sparse import SuiteSparseMatrixCollection +from .word_net import WordNet18, WordNet18RR +from .freebase import FB15k_237 +from .wikics import WikiCS +from .webkb import WebKB +from .wikipedia_network import WikipediaNetwork +from .heterophilous_graph_dataset import HeterophilousGraphDataset +from .actor import Actor +from .upfd import UPFD +from .github import GitHub +from .facebook import FacebookPagePage +from .lastfm_asia import LastFMAsia +from .deezer_europe import DeezerEurope +from .gemsec import GemsecDeezer +from .twitch import Twitch +from .airports import Airports +from .lrgb import LRGBDataset +from .malnet_tiny import MalNetTiny +from .omdb import OMDB +from .polblogs import PolBlogs +from .email_eu_core import EmailEUCore +from .linkx_dataset import LINKXDataset +from .elliptic import EllipticBitcoinDataset +from .elliptic_temporal import EllipticBitcoinTemporalDataset +from .dgraph import DGraphFin +from .hydro_net import HydroNet +from .airfrans import AirfRANS +from .jodie import JODIEDataset +from .wikidata import Wikidata5M +from .myket import MyketDataset +from .brca_tgca import BrcaTcga +from .neurograph import NeuroGraphDataset +from .web_qsp_dataset import WebQSPDataset + +from .dbp15k import DBP15K +from .aminer import AMiner +from .ogb_mag import OGB_MAG +from .dblp import DBLP +from .movie_lens import MovieLens +from .movie_lens_100k import MovieLens100K +from .movie_lens_1m import MovieLens1M +from .imdb import IMDB +from .last_fm import LastFM +from .hgb_dataset import HGBDataset +from .taobao import Taobao +from .igmc_dataset import IGMCDataset +from .amazon_book import AmazonBook +from .hm import HM +from .ose_gvcs import OSE_GVCS +from .rcdd import RCDD +from .opf import OPFDataset + +from .cornell import CornellTemporalHyperGraphDataset + +from .fake import FakeDataset, FakeHeteroDataset +from .sbm_dataset import StochasticBlockModelDataset +from .sbm_dataset import RandomPartitionGraphDataset +from .mixhop_synthetic_dataset import MixHopSyntheticDataset +from .explainer_dataset import ExplainerDataset +from .infection_dataset import InfectionDataset +from .ba2motif_dataset import BA2MotifDataset +from .ba_multi_shapes import BAMultiShapesDataset +from .ba_shapes import BAShapes + +import paddle_geometric.datasets.utils + +homo_datasets = [ + 'KarateClub', + 'TUDataset', + 'GNNBenchmarkDataset', + 'Planetoid', + 'NELL', + 'CitationFull', + 'CoraFull', + 'Coauthor', + 'Amazon', + 'PPI', + 'Reddit', + 'Reddit2', + 'Flickr', + 'Yelp', + 'AmazonProducts', + 'QM7b', + 'QM9', + 'MD17', + 'ZINC', + 'AQSOL', + 'MoleculeNet', + 'PCQM4Mv2', + 'Entities', + 'RelLinkPredDataset', + 'GEDDataset', + 'AttributedGraphDataset', + 'MNISTSuperpixels', + 'FAUST', + 'DynamicFAUST', + 'ShapeNet', + 'ModelNet', + 'CoMA', + 'SHREC2016', + 'TOSCA', + 'PCPNetDataset', + 'S3DIS', + 'GeometricShapes', + 'BitcoinOTC', + 'GDELTLite', + 'ICEWS18', + 'GDELT', + 'WILLOWObjectClass', + 'PascalVOCKeypoints', + 'PascalPF', + 'SNAPDataset', + 'SuiteSparseMatrixCollection', + 'WordNet18', + 'WordNet18RR', + 'FB15k_237', + 'WikiCS', + 'WebKB', + 'WikipediaNetwork', + 'HeterophilousGraphDataset', + 'Actor', + 'UPFD', + 'GitHub', + 'FacebookPagePage', + 'LastFMAsia', + 'DeezerEurope', + 'GemsecDeezer', + 'Twitch', + 'Airports', + 'LRGBDataset', + 'MalNetTiny', + 'OMDB', + 'PolBlogs', + 'EmailEUCore', + 'LINKXDataset', + 'EllipticBitcoinDataset', + 'EllipticBitcoinTemporalDataset', + 'DGraphFin', + 'HydroNet', + 'AirfRANS', + 'JODIEDataset', + 'Wikidata5M', + 'MyketDataset', + 'BrcaTcga', + 'NeuroGraphDataset', + 'WebQSPDataset', +] + +hetero_datasets = [ + 'DBP15K', + 'AMiner', + 'OGB_MAG', + 'DBLP', + 'MovieLens', + 'MovieLens100K', + 'MovieLens1M', + 'IMDB', + 'LastFM', + 'HGBDataset', + 'Taobao', + 'IGMCDataset', + 'AmazonBook', + 'HM', + 'OSE_GVCS', + 'RCDD', + 'OPFDataset', +] +hyper_datasets = [ + 'CornellTemporalHyperGraphDataset', +] +synthetic_datasets = [ + 'FakeDataset', + 'FakeHeteroDataset', + 'StochasticBlockModelDataset', + 'RandomPartitionGraphDataset', + 'MixHopSyntheticDataset', + 'ExplainerDataset', + 'InfectionDataset', + 'BA2MotifDataset', + 'BAMultiShapesDataset', + 'BAShapes', +] + +__all__ = homo_datasets + hetero_datasets + hyper_datasets + synthetic_datasets diff --git a/jointContribution/mattergen/paddle_geometric/datasets/actor.py b/jointContribution/mattergen/paddle_geometric/datasets/actor.py new file mode 100644 index 00000000..a53cb63e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/actor.py @@ -0,0 +1,112 @@ +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import coalesce + + +class Actor(InMemoryDataset): + r"""The actor-only induced subgraph of the film-director-actor-writer + network used in the + `"Geom-GCN: Geometric Graph Convolutional Networks" + `_ paper. + Each node corresponds to an actor, and the edge between two nodes denotes + co-occurrence on the same Wikipedia page. + Node features correspond to some keywords in the Wikipedia pages. + The task is to classify the nodes into five categories in terms of words of + actor's Wikipedia. + + Args: + root: Root directory where the dataset should be saved. + transform: A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before being saved to + disk. + force_reload: Whether to re-process the dataset. + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 7,600 + - 30,019 + - 932 + - 5 + """ + + url = 'https://raw.githubusercontent.com/graphdml-uiuc-jlu/geom-gcn/master' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['out1_node_feature_label.txt', 'out1_graph_edges.txt' + ] + [f'film_split_0.6_0.2_{i}.npz' for i in range(10)] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for f in self.raw_file_names[:2]: + download_url(f'{self.url}/new_data/film/{f}', self.raw_dir) + for f in self.raw_file_names[2:]: + download_url(f'{self.url}/splits/{f}', self.raw_dir) + + def process(self) -> None: + with open(self.raw_paths[0]) as f: + node_data = [x.split('\t') for x in f.read().split('\n')[1:-1]] + + rows, cols = [], [] + for n_id, line, _ in node_data: + indices = [int(x) for x in line.split(',')] + rows += [int(n_id)] * len(indices) + cols += indices + row, col = paddle.to_tensor(rows, dtype='int64'), paddle.to_tensor(cols, dtype='int64') + + x = paddle.zeros([int(row.max()) + 1, int(col.max()) + 1], dtype='float32') + x[row, col] = 1.0 + + y = paddle.empty([len(node_data)], dtype='int64') + for n_id, _, label in node_data: + y[int(n_id)] = int(label) + + with open(self.raw_paths[1]) as f: + edge_data = f.read().split('\n')[1:-1] + edge_indices = [[int(v) for v in r.split('\t')] for r in edge_data] + edge_index = paddle.to_tensor(edge_indices, dtype='int64').transpose([1, 0]) + edge_index = coalesce(edge_index, num_nodes=x.shape[0]) + + train_masks, val_masks, test_masks = [], [], [] + for path in self.raw_paths[2:]: + tmp = np.load(path) + train_masks += [paddle.to_tensor(tmp['train_mask'], dtype='bool')] + val_masks += [paddle.to_tensor(tmp['val_mask'], dtype='bool')] + test_masks += [paddle.to_tensor(tmp['test_mask'], dtype='bool')] + train_mask = paddle.stack(train_masks, axis=1) + val_mask = paddle.stack(val_masks, axis=1) + test_mask = paddle.stack(test_masks, axis=1) + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/airfrans.py b/jointContribution/mattergen/paddle_geometric/datasets/airfrans.py new file mode 100644 index 00000000..3285396f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/airfrans.py @@ -0,0 +1,145 @@ +import json +import os +from typing import Callable, List, Optional + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class AirfRANS(InMemoryDataset): + r"""The AirfRANS dataset from the `"AirfRANS: High Fidelity Computational + Fluid Dynamics Dataset for Approximating Reynolds-Averaged Navier-Stokes + Solutions" `_ paper, consisting of 1,000 + simulations of steady-state aerodynamics over 2D airfoils in a subsonic + flight regime. + The different tasks (:obj:`"full"`, :obj:`"scarce"`, :obj:`"reynolds"`: + obj:`"aoa"`) define the utilized training and test splits. + + Each simulation is given as a point cloud defined as the nodes of the + simulation mesh. Each point of a point cloud is described via 5 + features: the inlet velocity (two components in meter per second), the + distance to the airfoil (one component in meter), and the normals (two + components in meter, set to :obj:`0` if the point is not on the airfoil). + Each point is given a target of 4 components for the underlying regression + task: the velocity (two components in meter per second), the pressure + divided by the specific mass (one component in meter squared per second + squared), the turbulent kinematic viscosity (one component in meter squared + per second). + Finally, a boolean is attached to each point to inform if this point lies on + the airfoil or not. + + A library for manipulating simulations of the dataset is available `here + `_. + + The dataset is released under the `ODbL v1.0 License + `_. + + .. note:: + + Data objects contain no edge indices to be agnostic to the simulation + mesh. You are free to build a graph via the + :obj:`paddle_geometric.transforms.RadiusGraph` transform. + + Args: + root: Root directory where the dataset should be saved. + task: The task to study (:obj:`"full"`, :obj:`"scarce"`: + obj:`"reynolds"`, :obj:`"aoa"`) that defines the utilized training + and test splits. + train: If :obj:`True`, loads the training dataset, otherwise the test + dataset. + transform: A function/transform that takes in an + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in an + :class:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + pre_filter: A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. + force_reload: Whether to re-process the dataset. + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #tasks + * - 1,000 + - ~180,000 + - 0 + - 5 + - 4 + """ + url = 'https://data.isir.upmc.fr/extrality/pypaddle_geometric/AirfRANS.zip' + tasks = ['full', 'scarce', 'reynolds', 'aoa'] + + def __init__( + self, + root: str, + task: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + if task not in self.tasks: + raise ValueError(f"Expected 'task' to be in {self.tasks} " + f"got '{task}'") + + self.task = 'full' if task == 'scarce' and not train else task + self.split = 'train' if train else 'test' + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['AirfRANS.pt', 'manifest.json'] + + @property + def processed_file_names(self) -> str: + return f'{self.task}_{self.split}.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + with open(self.raw_paths[1]) as f: + manifest = json.load(f) + total = manifest['full_train'] + manifest['full_test'] + partial = set(manifest[f'{self.task}_{self.split}']) + + data_list = [] + raw_data = fs.paddle_load(self.raw_paths[0]) + for k, s in enumerate(total): + if s in partial: + data = Data(**raw_data[k]) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'task={self.task}, split={self.split})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/airports.py b/jointContribution/mattergen/paddle_geometric/datasets/airports.py new file mode 100644 index 00000000..cf42d92c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/airports.py @@ -0,0 +1,98 @@ +import os.path as osp +from typing import Callable, List, Optional + +import paddle +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import coalesce + + +class Airports(InMemoryDataset): + r"""The Airports dataset from the `"struc2vec: Learning Node + Representations from Structural Identity" + `_ paper, where nodes denote airports + and labels correspond to activity levels. + Features are given by one-hot encoded node identifiers, as described in the + `"GraLSP: Graph Neural Networks with Local Structural Patterns" + `_ paper. + + Args: + root: Root directory where the dataset should be saved. + name: The name of the dataset (:obj:`"USA"`, :obj:`"Brazil"`, + :obj:`"Europe"`). + transform: A function/transform that takes in an + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform (callable, optional): A function/transform that takes in + :class:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + force_reload: Whether to re-process the dataset. + """ + edge_url = ('https://github.com/leoribeiro/struc2vec/' + 'raw/master/graph/{}-airports.edgelist') + label_url = ('https://github.com/leoribeiro/struc2vec/' + 'raw/master/graph/labels-{}-airports.txt') + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in ['usa', 'brazil', 'europe'] + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + return [ + f'{self.name}-airports.edgelist', + f'labels-{self.name}-airports.txt', + ] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.edge_url.format(self.name), self.raw_dir) + download_url(self.label_url.format(self.name), self.raw_dir) + + def process(self) -> None: + index_map, ys = {}, [] + with open(self.raw_paths[1]) as f: + rows = f.read().split('\n')[1:-1] + for i, row in enumerate(rows): + idx, label = row.split() + index_map[int(idx)] = i + ys.append(int(label)) + y = paddle.to_tensor(ys, dtype='int64') + x = paddle.eye(y.shape[0], dtype='float32') + + edge_indices = [] + with open(self.raw_paths[0]) as f: + rows = f.read().split('\n')[:-1] + for row in rows: + src, dst = row.split() + edge_indices.append([index_map[int(src)], index_map[int(dst)]]) + edge_index = paddle.to_tensor(edge_indices, dtype='int64').transpose([1, 0]) + edge_index = coalesce(edge_index, num_nodes=y.shape[0]) + + data = Data(x=x, edge_index=edge_index, y=y) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name.capitalize()}Airports()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/amazon.py b/jointContribution/mattergen/paddle_geometric/datasets/amazon.py new file mode 100644 index 00000000..4163fa14 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/amazon.py @@ -0,0 +1,93 @@ +import os.path as osp +from typing import Callable, Optional + +from paddle_geometric.data import InMemoryDataset, download_url +from paddle_geometric.io import read_npz + + +class Amazon(InMemoryDataset): + r"""The Amazon Computers and Amazon Photo networks from the + `"Pitfalls of Graph Neural Network Evaluation" + `_ paper. + Nodes represent goods and edges represent that two goods are frequently + bought together. + Given product reviews as bag-of-words node features, the task is to + map goods to their respective product category. + + Args: + root: Root directory where the dataset should be saved. + name: The name of the dataset (:obj:`"Computers"`, :obj:`"Photo"`). + transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in an + :class:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + force_reload: Whether to re-process the dataset. + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #nodes + - #edges + - #features + - #classes + * - Computers + - 13,752 + - 491,722 + - 767 + - 10 + * - Photo + - 7,650 + - 238,162 + - 745 + - 8 + """ + + url = 'https://github.com/shchur/gnn-benchmark/raw/master/data/npz/' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in ['computers', 'photo'] + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name.capitalize(), 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name.capitalize(), 'processed') + + @property + def raw_file_names(self) -> str: + return f'amazon_electronics_{self.name.lower()}.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.url + self.raw_file_names, self.raw_dir) + + def process(self) -> None: + data = read_npz(self.raw_paths[0], to_undirected=True) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}{self.name.capitalize()}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/amazon_book.py b/jointContribution/mattergen/paddle_geometric/datasets/amazon_book.py new file mode 100644 index 00000000..b204dd03 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/amazon_book.py @@ -0,0 +1,84 @@ +from typing import Callable, List, Optional + +import paddle +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url + + +class AmazonBook(InMemoryDataset): + r"""A subset of the AmazonBook rating dataset from the + `"LightGCN: Simplifying and Powering Graph Convolution Network for + Recommendation" `_ paper. + This is a heterogeneous dataset consisting of 52,643 users and 91,599 books + with approximately 2.9 million ratings between them. + No labels or features are provided. + + Args: + root: Root directory where the dataset should be saved. + transform: A function/transform that takes in an + :class:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. + pre_transform: A function/transform that takes in an + :class:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + force_reload: Whether to re-process the dataset. + """ + url = ('https://raw.githubusercontent.com/gusye1234/LightGCN-PyTorch/' + 'master/data/amazon-book') + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return ['user_list.txt', 'item_list.txt', 'train.txt', 'test.txt'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for name in self.raw_file_names: + download_url(f'{self.url}/{name}', self.raw_dir) + + def process(self) -> None: + import pandas as pd + + data = HeteroData() + + # Process number of nodes for each node type: + node_types = ['user', 'book'] + for path, node_type in zip(self.raw_paths, node_types): + df = pd.read_csv(path, sep=' ', header=0) + data[node_type].num_nodes = len(df) + + # Process edge information for training and testing: + attr_names = ['edge_index', 'edge_label_index'] + for path, attr_name in zip(self.raw_paths[2:], attr_names): + rows, cols = [], [] + with open(path) as f: + lines = f.readlines() + for line in lines: + indices = line.strip().split(' ') + for dst in indices[1:]: + rows.append(int(indices[0])) + cols.append(int(dst)) + index = paddle.to_tensor([rows, cols], dtype='int64') + + data['user', 'rates', 'book'][attr_name] = index + if attr_name == 'edge_index': + data['book', 'rated_by', 'user'][attr_name] = index.flip(axis=[0]) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/amazon_products.py b/jointContribution/mattergen/paddle_geometric/datasets/amazon_products.py new file mode 100644 index 00000000..23e94005 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/amazon_products.py @@ -0,0 +1,114 @@ +import json +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_google_url + + +class AmazonProducts(InMemoryDataset): + r"""The Amazon dataset from the `"GraphSAINT: Graph Sampling Based + Inductive Learning Method" `_ paper, + containing products and its categories. + + Args: + root: Root directory where the dataset should be saved. + transform: A function/transform that takes in an + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + force_reload: Whether to re-process the dataset. + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 1,569,960 + - 264,339,468 + - 200 + - 107 + """ + adj_full_id = '17qhNA8H1IpbkkR-T2BmPQm8QNW5do-aa' + feats_id = '10SW8lCvAj-kb6ckkfTOC5y0l8XXdtMxj' + class_map_id = '1LIl4kimLfftj4-7NmValuWyCQE8AaE7P' + role_id = '1npK9xlmbnjNkV80hK2Q68wTEVOFjnt4K' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['adj_full.npz', 'feats.npy', 'class_map.json', 'role.json'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_google_url(self.adj_full_id, self.raw_dir, 'adj_full.npz') + download_google_url(self.feats_id, self.raw_dir, 'feats.npy') + download_google_url(self.class_map_id, self.raw_dir, 'class_map.json') + download_google_url(self.role_id, self.raw_dir, 'role.json') + + def process(self) -> None: + import scipy.sparse as sp + + f = np.load(osp.join(self.raw_dir, 'adj_full.npz')) + adj = sp.csr_matrix((f['data'], f['indices'], f['indptr']), f['shape']) + adj = adj.tocoo() + row = paddle.to_tensor(adj.row, dtype='int64') + col = paddle.to_tensor(adj.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + x = np.load(osp.join(self.raw_dir, 'feats.npy')) + x = paddle.to_tensor(x, dtype='float32') + + ys = [-1] * x.shape[0] + with open(osp.join(self.raw_dir, 'class_map.json')) as f: + class_map = json.load(f) + for key, item in class_map.items(): + ys[int(key)] = item + y = paddle.to_tensor(ys, dtype='int64') + + with open(osp.join(self.raw_dir, 'role.json')) as f: + role = json.load(f) + + train_mask = paddle.zeros((x.shape[0],), dtype='bool') + train_mask[paddle.to_tensor(role['tr'], dtype='int64')] = True + + val_mask = paddle.zeros((x.shape[0],), dtype='bool') + val_mask[paddle.to_tensor(role['va'], dtype='int64')] = True + + test_mask = paddle.zeros((x.shape[0],), dtype='bool') + test_mask[paddle.to_tensor(role['te'], dtype='int64')] = True + + data = Data( + x=x, + edge_index=edge_index, + y=y, + train_mask=train_mask, + val_mask=val_mask, + test_mask=test_mask, + ) + + data = data if self.pre_transform is None else self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/aminer.py b/jointContribution/mattergen/paddle_geometric/datasets/aminer.py new file mode 100644 index 00000000..6d9ffde7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/aminer.py @@ -0,0 +1,122 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url, extract_zip +from paddle_geometric.io import fs +from paddle_geometric.utils import coalesce + + +class AMiner(InMemoryDataset): + r"""The heterogeneous AMiner dataset from the `"metapath2vec: Scalable + Representation Learning for Heterogeneous Networks" + `_ paper, consisting of nodes from + type :obj:`"paper"`, :obj:`"author"` and :obj:`"venue"`. + Venue categories and author research interests are available as ground + truth labels for a subset of nodes. + + Args: + root: Root directory where the dataset should be saved. + transform: A function/transform that takes in a + :class:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. + pre_transform: A function/transform that takes in a + :class:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + force_reload: Whether to re-process the dataset. + """ + + url = 'https://www.dropbox.com/s/1bnz8r7mofx0osf/net_aminer.zip?dl=1' + y_url = 'https://www.dropbox.com/s/nkocx16rpl4ydde/label.zip?dl=1' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'id_author.txt', 'id_conf.txt', 'paper.txt', 'paper_author.txt', + 'paper_conf.txt', 'label' + ] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + fs.rm(self.raw_dir) + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.rename(osp.join(self.root, 'net_aminer'), self.raw_dir) + os.unlink(path) + path = download_url(self.y_url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + import pandas as pd + + data = HeteroData() + + # Get author labels. + path = osp.join(self.raw_dir, 'id_author.txt') + author = pd.read_csv(path, sep='\t', names=['idx', 'name'], index_col=1) + + path = osp.join(self.raw_dir, 'label', + 'googlescholar.8area.author.label.txt') + df = pd.read_csv(path, sep=' ', names=['name', 'y']) + df = df.join(author, on='name') + + data['author'].y = paddle.to_tensor(df['y'].values, dtype='int64') - 1 + data['author'].y_index = paddle.to_tensor(df['idx'].values, dtype='int64') + + # Get venue labels. + path = osp.join(self.raw_dir, 'id_conf.txt') + venue = pd.read_csv(path, sep='\t', names=['idx', 'name'], index_col=1) + + path = osp.join(self.raw_dir, 'label', + 'googlescholar.8area.venue.label.txt') + df = pd.read_csv(path, sep=' ', names=['name', 'y']) + df = df.join(venue, on='name') + + data['venue'].y = paddle.to_tensor(df['y'].values, dtype='int64') - 1 + data['venue'].y_index = paddle.to_tensor(df['idx'].values, dtype='int64') + + # Get paper<->author connectivity. + path = osp.join(self.raw_dir, 'paper_author.txt') + paper_author = pd.read_csv(path, sep='\t', header=None) + paper_author = paddle.to_tensor(paper_author.values, dtype='int64').t() + M, N = int(paper_author[0].max() + 1), int(paper_author[1].max() + 1) + paper_author = coalesce(paper_author, num_nodes=max(M, N)) + data['paper'].num_nodes = M + data['author'].num_nodes = N + data['paper', 'written_by', 'author'].edge_index = paper_author + data['author', 'writes', 'paper'].edge_index = paper_author.flip([0]) + + # Get paper<->venue connectivity. + path = osp.join(self.raw_dir, 'paper_conf.txt') + paper_venue = pd.read_csv(path, sep='\t', header=None) + paper_venue = paddle.to_tensor(paper_venue.values, dtype='int64').t() + M, N = int(paper_venue[0].max() + 1), int(paper_venue[1].max() + 1) + paper_venue = coalesce(paper_venue, num_nodes=max(M, N)) + data['venue'].num_nodes = N + data['paper', 'published_in', 'venue'].edge_index = paper_venue + data['venue', 'publishes', 'paper'].edge_index = paper_venue.flip([0]) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/aqsol.py b/jointContribution/mattergen/paddle_geometric/datasets/aqsol.py new file mode 100644 index 00000000..315e088e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/aqsol.py @@ -0,0 +1,112 @@ +import os +import os.path as osp +import pickle +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url, extract_zip +from paddle_geometric.io import fs + + +class AQSOL(InMemoryDataset): + r"""The AQSOL dataset from the `Benchmarking Graph Neural Networks + `_ paper based on + `AqSolDB `_, a + standardized database of 9,982 molecular graphs with their aqueous + solubility values, collected from 9 different data sources. + + Args: + root: Root directory where the dataset should be saved. + split: If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. + transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + pre_filter (callable, optional): A function that takes in an + :class:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in + the final dataset. + force_reload: Whether to re-process the dataset. + """ + url = 'https://www.dropbox.com/s/lzu9lmukwov12kt/aqsol_graph_raw.zip?dl=1' + + def __init__( + self, + root: str, + split: str = 'train', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ): + assert split in ['train', 'val', 'test'] + super().__init__(root, transform, pre_transform, pre_filter, force_reload=force_reload) + path = osp.join(self.processed_dir, f'{split}.pt') + self.load(path) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'train.pickle', 'val.pickle', 'test.pickle', 'atom_dict.pickle', + 'bond_dict.pickle' + ] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pt', 'val.pt', 'test.pt'] + + def download(self) -> None: + fs.rm(self.raw_dir) + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.rename(osp.join(self.root, 'asqol_graph_raw'), self.raw_dir) + os.unlink(path) + + def process(self) -> None: + for raw_path, path in zip(self.raw_paths, self.processed_paths): + with open(raw_path, 'rb') as f: + graphs = pickle.load(f) + + data_list: List[Data] = [] + for graph in graphs: + x, edge_attr, edge_index, y = graph + + x = paddle.to_tensor(x, dtype='float32') + edge_attr = paddle.to_tensor(edge_attr, dtype='float32') + edge_index = paddle.to_tensor(edge_index, dtype='int64') + y = paddle.to_tensor([y], dtype='float32') + + if edge_index.numel() == 0: + continue # Skipping for graphs with no bonds/edges. + + data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, path) + + def atoms(self) -> List[str]: + return [ + 'Br', 'C', 'N', 'O', 'Cl', 'Zn', 'F', 'P', 'S', 'Na', 'Al', 'Si', + 'Mo', 'Ca', 'W', 'Pb', 'B', 'V', 'Co', 'Mg', 'Bi', 'Fe', 'Ba', 'K', + 'Ti', 'Sn', 'Cd', 'I', 'Re', 'Sr', 'H', 'Cu', 'Ni', 'Lu', 'Pr', + 'Te', 'Ce', 'Nd', 'Gd', 'Zr', 'Mn', 'As', 'Hg', 'Sb', 'Cr', 'Se', + 'La', 'Dy', 'Y', 'Pd', 'Ag', 'In', 'Li', 'Rh', 'Nb', 'Hf', 'Cs', + 'Ru', 'Au', 'Sm', 'Ta', 'Pt', 'Ir', 'Be', 'Ge' + ] + + def bonds(self) -> List[str]: + return ['NONE', 'SINGLE', 'DOUBLE', 'AROMATIC', 'TRIPLE'] diff --git a/jointContribution/mattergen/paddle_geometric/datasets/attributed_graph_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/attributed_graph_dataset.py new file mode 100644 index 00000000..995e94e7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/attributed_graph_dataset.py @@ -0,0 +1,124 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_google_url, extract_zip +from paddle_geometric.io import fs + + +class AttributedGraphDataset(InMemoryDataset): + r"""A variety of attributed graph datasets from the + `"Scaling Attributed Network Embedding to Massive Graphs" + `_ paper. + + Args: + root: Root directory where the dataset should be saved. + name: The name of the dataset (:obj:`"Wiki"`, :obj:`"Cora"`, + :obj:`"CiteSeer"`, :obj:`"PubMed"`, :obj:`"BlogCatalog"`, + :obj:`"PPI"`, :obj:`"Flickr"`, :obj:`"Facebook"`, :obj:`"Twitter"`, + :obj:`"TWeibo"`, :obj:`"MAG"`). + transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before being saved to + disk. + force_reload: Whether to re-process the dataset. + """ + datasets = { + 'wiki': '1EPhlbziZTQv19OsTrKrAJwsElbVPEbiV', + 'cora': '1FyVnpdsTT-lhkVPotUW8OVeuCi1vi3Ey', + 'citeseer': '1d3uQIpHiemWJPgLgTafi70RFYye7hoCp', + 'pubmed': '1DOK3FfslyJoGXUSCSrK5lzdyLfIwOz6k', + 'blogcatalog': '178PqGqh67RUYMMP6-SoRHDoIBh8ku5FS', + 'ppi': '1dvwRpPT4gGtOcNP_Q-G1TKl9NezYhtez', + 'flickr': '1tZp3EB20fAC27SYWwa-x66_8uGsuU62X', + 'facebook': '12aJWAGCM4IvdGI2fiydDNyWzViEOLZH8', + 'twitter': '1fUYggzZlDrt9JsLsSdRUHiEzQRW1kSA4', + 'tweibo': '1-2xHDPFCsuBuFdQN_7GLleWa8R_t50qU', + 'mag': '1ggraUMrQgdUyA3DjSRzzqMv0jFkU65V5', + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in self.datasets.keys() + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + return ['attrs.npz', 'edgelist.txt', 'labels.txt'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + dataset_id = self.datasets[self.name] + path = download_google_url(dataset_id, self.raw_dir, 'data.zip') + extract_zip(path, self.raw_dir) + os.unlink(path) + dataset_path = osp.join(self.raw_dir, f'{self.name}.attr') + if self.name == 'mag': + dataset_path = osp.join(self.raw_dir, self.name) + for name in self.raw_file_names: + os.rename(osp.join(dataset_path, name), osp.join(self.raw_dir, name)) + fs.rm(dataset_path) + + def process(self) -> None: + import pandas as pd + import scipy.sparse as sp + + x = sp.load_npz(self.raw_paths[0]).tocsr() + if x.shape[-1] > 10000 or self.name == 'mag': + x = paddle.sparse.sparse_csr_tensor( + crows=x.indptr.astype(np.int64), + cols=x.indices.astype(np.int64), + values=x.data.astype(np.float32), + shape=x.shape, + ) + else: + x = paddle.to_tensor(x.todense(), dtype='float32') + + df = pd.read_csv(self.raw_paths[1], header=None, sep=None, engine='python') + edge_index = paddle.to_tensor(df.values.T, dtype='int64') + + with open(self.raw_paths[2]) as f: + rows = f.read().strip().split('\n') + ys = [[int(y) - 1 for y in row.split()[1:]] for row in rows] + multilabel = max(len(y) for y in ys) > 1 + + if not multilabel: + y = paddle.to_tensor(ys, dtype='int64').squeeze() + else: + num_classes = max(max(y) for y in ys) + 1 + y = paddle.zeros([len(ys), num_classes], dtype='float32') + for i, row in enumerate(ys): + for j in row: + y[i, j] = 1.0 + + data = Data(x=x, edge_index=edge_index, y=y) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name.capitalize()}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ba2motif_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/ba2motif_dataset.py new file mode 100644 index 00000000..bb0b240b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ba2motif_dataset.py @@ -0,0 +1,98 @@ +import pickle +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class BA2MotifDataset(InMemoryDataset): + r"""The synthetic BA-2motifs graph classification dataset for evaluating + explainability algorithms, as described in the `"Parameterized Explainer + for Graph Neural Network" `_ paper. + :class:`~paddle_geometric.datasets.BA2MotifDataset` contains 1000 random + Barabasi-Albert (BA) graphs. + Half of the graphs are attached with a + :class:`~paddle_geometric.datasets.motif_generator.HouseMotif`, and the rest + are attached with a five-node + :class:`~paddle_geometric.datasets.motif_generator.CycleMotif`. + The graphs are assigned to one of the two classes according to the type of + attached motifs. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 1000 + - 25 + - ~51.0 + - 10 + - 2 + """ + url = 'https://github.com/flyingdoog/PGExplainer/raw/master/dataset' + filename = 'BA-2motif.pkl' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return self.filename + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(f'{self.url}/{self.filename}', self.raw_dir) + + def process(self) -> None: + with open(self.raw_paths[0], 'rb') as f: + adj, x, y = pickle.load(f) + + adjs = paddle.to_tensor(adj, dtype='int64') + xs = paddle.to_tensor(x, dtype='float32') + ys = paddle.to_tensor(y, dtype='int64') + + data_list: List[Data] = [] + for i in range(xs.shape[0]): + edge_index = paddle.nonzero(adjs[i]).t() + x = xs[i] + y = int(paddle.nonzero(ys[i])) + + data = Data(x=x, edge_index=edge_index, y=y) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ba_multi_shapes.py b/jointContribution/mattergen/paddle_geometric/datasets/ba_multi_shapes.py new file mode 100644 index 00000000..8def183f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ba_multi_shapes.py @@ -0,0 +1,104 @@ +import pickle +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class BAMultiShapesDataset(InMemoryDataset): + r"""The synthetic BA-Multi-Shapes graph classification dataset for + evaluating explainabilty algorithms, as described in the + `"Global Explainability of GNNs via Logic Combination of Learned Concepts" + `_ paper. + + Given three atomic motifs, namely House (H), Wheel (W), and Grid (G), + :class:`~paddle_geometric.datasets.BAMultiShapesDataset` contains 1,000 + graphs where each graph is obtained by attaching the motifs to a random + Barabasi-Albert (BA) as follows: + + * class 0: :math:`\emptyset \lor H \lor W \lor G \lor \{ H, W, G \}` + + * class 1: :math:`(H \land W) \lor (H \land G) \lor (W \land G)` + + This dataset is pre-computed from the official implementation. + + Args: + root: Root directory where the dataset should be saved. + transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + pre_filter: A function that takes in a + :class:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. + force_reload: Whether to re-process the dataset. + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 1000 + - 40 + - ~87.0 + - 10 + - 2 + """ + url = ('https://github.com/steveazzolin/gnn_logic_global_expl/raw/master/' + 'datasets/BAMultiShapes/BAMultiShapes.pkl') + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'BAMultiShapes.pkl' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.url, self.raw_dir) + + def process(self) -> None: + with open(self.raw_paths[0], 'rb') as f: + adjs, xs, ys = pickle.load(f) + + data_list: List[Data] = [] + for adj, x, y in zip(adjs, xs, ys): + edge_index = paddle.nonzero(paddle.to_tensor(adj, dtype='int64')).transpose([1, 0]) + x = paddle.to_tensor(np.array(x), dtype='float32') + + data = Data(x=x, edge_index=edge_index, y=y) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ba_shapes.py b/jointContribution/mattergen/paddle_geometric/datasets/ba_shapes.py new file mode 100644 index 00000000..ff915a87 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ba_shapes.py @@ -0,0 +1,88 @@ +from typing import Callable, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.utils import barabasi_albert_graph +from paddle_geometric.deprecation import deprecated + + +def house() -> Tuple[Tensor, Tensor]: + edge_index = paddle.to_tensor([[0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4], + [1, 3, 4, 4, 2, 0, 1, 3, 2, 0, 0, 1]]) + label = paddle.to_tensor([1, 1, 2, 2, 3]) + return edge_index, label + +@deprecated("use 'datasets.ExplainerDataset' in combination with " + "'datasets.graph_generator.BAGraph' instead") +class BAShapes(InMemoryDataset): + r"""The BA-Shapes dataset from the `"GNNExplainer: Generating Explanations + for Graph Neural Networks" `__ paper, + containing a Barabasi-Albert (BA) graph with 300 nodes and a set of 80 + "house"-structured graphs connected to it. + + Args: + connection_distribution: Specifies how the houses and the BA graph get + connected. Valid inputs are :obj:`"random"` + (random BA graph nodes are selected for connection to the houses), + and :obj:`"uniform"` (uniformly distributed BA graph nodes are + selected for connection to the houses). + transform: A function/transform that takes in a + :class:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + """ + def __init__( + self, + connection_distribution: str = "random", + transform: Optional[Callable] = None, + ) -> None: + super().__init__(None, transform) + assert connection_distribution in ['random', 'uniform'] + + # Build the Barabasi-Albert graph: + num_nodes = 300 + edge_index = barabasi_albert_graph(num_nodes, num_edges=5) + edge_label = paddle.zeros([edge_index.shape[1]], dtype='int64') + node_label = paddle.zeros([num_nodes], dtype='int64') + + # Select nodes to connect shapes: + num_houses = 80 + if connection_distribution == 'random': + connecting_nodes = paddle.randperm(num_nodes)[:num_houses] + else: + step = num_nodes // num_houses + connecting_nodes = paddle.arange(0, num_nodes, step) + + # Connect houses to Barabasi-Albert graph: + edge_indices = [edge_index] + edge_labels = [edge_label] + node_labels = [node_label] + for i in range(num_houses): + house_edge_index, house_label = house() + + edge_indices.append(house_edge_index + num_nodes) + edge_indices.append( + paddle.to_tensor([[int(connecting_nodes[i]), num_nodes], + [num_nodes, int(connecting_nodes[i])]])) + + edge_labels.append( + paddle.ones([house_edge_index.shape[1]], dtype='int64')) + edge_labels.append(paddle.zeros([2], dtype='int64')) + + node_labels.append(house_label) + + num_nodes += 5 + + edge_index = paddle.concat(edge_indices, axis=1) + edge_label = paddle.concat(edge_labels, axis=0) + node_label = paddle.concat(node_labels, axis=0) + + x = paddle.ones([num_nodes, 10], dtype='float32') + expl_mask = paddle.zeros([num_nodes], dtype='bool') + expl_mask[paddle.arange(400, num_nodes, 5)] = True + + data = Data(x=x, edge_index=edge_index, y=node_label, + expl_mask=expl_mask, edge_label=edge_label) + + self.data, self.slices = self.collate([data]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/bitcoin_otc.py b/jointContribution/mattergen/paddle_geometric/datasets/bitcoin_otc.py new file mode 100644 index 00000000..dec91272 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/bitcoin_otc.py @@ -0,0 +1,128 @@ +import datetime +import os +from typing import Callable, Optional + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_gz, +) + + +class BitcoinOTC(InMemoryDataset): + r"""The Bitcoin-OTC dataset from the `"EvolveGCN: Evolving Graph + Convolutional Networks for Dynamic Graphs" + `_ paper, consisting of 138 + who-trusts-whom networks of sequential time steps. + + Args: + root (str): Root directory where the dataset should be saved. + edge_window_size (int, optional): The window size for the existence of + an edge in the graph sequence since its initial creation. + (default: :obj:`10`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 138 + - 6,005 + - ~2,573.2 + - 0 + - 0 + """ + + url = 'https://snap.stanford.edu/data/soc-sign-bitcoinotc.csv.gz' + + def __init__( + self, + root: str, + edge_window_size: int = 10, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.edge_window_size = edge_window_size + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'soc-sign-bitcoinotc.csv' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + @property + def num_nodes(self) -> int: + assert isinstance(self._data, Data) + assert self._data.edge_index is not None + return int(paddle.max(self._data.edge_index)) + 1 + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_gz(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + with open(self.raw_paths[0]) as f: + lines = [[x for x in line.split(',')] for line in f.read().split('\n')[:-1]] + + edge_indices = [[int(line[0]), int(line[1])] for line in lines] + edge_index = paddle.to_tensor(edge_indices, dtype='int64') + edge_index = edge_index - paddle.min(edge_index) + edge_index = edge_index.t() + num_nodes = int(paddle.max(edge_index)) + 1 + + edge_attrs = [int(line[2]) for line in lines] + edge_attr = paddle.to_tensor(edge_attrs, dtype='int64') + + stamps = [ + datetime.datetime.fromtimestamp(int(float(line[3]))) + for line in lines + ] + + offset = datetime.timedelta(days=13.8) # Results in 138 time steps. + graph_indices, factor = [], 1 + for t in stamps: + factor = factor if t < stamps[0] + factor * offset else factor + 1 + graph_indices.append(factor - 1) + graph_idx = paddle.to_tensor(graph_indices, dtype='int64') + + data_list = [] + for i in range(int(paddle.max(graph_idx)) + 1): + mask = (graph_idx > (i - self.edge_window_size)) & (graph_idx <= i) + data = Data() + data.edge_index = edge_index[:, mask.nonzero().flatten()] + data.edge_attr = edge_attr[mask.nonzero().flatten()] + data.num_nodes = num_nodes + data_list.append(data) + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/brca_tgca.py b/jointContribution/mattergen/paddle_geometric/datasets/brca_tgca.py new file mode 100644 index 00000000..cfb16801 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/brca_tgca.py @@ -0,0 +1,109 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class BrcaTcga(InMemoryDataset): + r"""The breast cancer (BRCA TCGA Pan-Cancer Atlas) dataset consisting of + patients with survival information and gene expression data from + `cBioPortal `_ + and a network of biological interactions between those nodes from + `Pathway Commons `_. + The dataset contains the gene features of 1,082 patients, and the overall + survival time (in months) of each patient as label. + + Pre-processing and example model codes on how to use this dataset can be + found `here `_. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + * - 1,082 + - 9,288 + - 271,771 + - 1,082 + """ + url = 'https://zenodo.org/record/8251328/files/brca_tcga.zip?download=1' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['graph_idx.csv', 'graph_labels.csv', 'edge_index.pt'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.unlink(path) + fs.rm(self.raw_dir) + os.rename(osp.join(self.root, 'brca_tcga'), self.raw_dir) + + def process(self) -> None: + import pandas as pd + + graph_feat = pd.read_csv(self.raw_paths[0], index_col=0).values + graph_feat = paddle.to_tensor(graph_feat, dtype='float32') + graph_labels = np.loadtxt(self.raw_paths[1], delimiter=',') + graph_label = paddle.to_tensor(graph_labels, dtype='float32') + edge_index = fs.paddle_load(self.raw_paths[2]) + + data_list = [] + for x, y in zip(graph_feat, graph_label): + data = Data(x=x.reshape([-1, 1]), edge_index=edge_index, y=y) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/citation_full.py b/jointContribution/mattergen/paddle_geometric/datasets/citation_full.py new file mode 100644 index 00000000..e5518163 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/citation_full.py @@ -0,0 +1,148 @@ +import os.path as osp +from typing import Callable, Optional + +from paddle_geometric.data import InMemoryDataset, download_url +from paddle_geometric.io import read_npz + + +class CitationFull(InMemoryDataset): + r"""The full citation network datasets from the + `"Deep Gaussian Embedding of Graphs: Unsupervised Inductive Learning via + Ranking" `_ paper. + Nodes represent documents and edges represent citation links. + Datasets include :obj:`"Cora"`, :obj:`"Cora_ML"`, :obj:`"CiteSeer"`, + :obj:`"DBLP"`, :obj:`"PubMed"`. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"Cora"`, :obj:`"Cora_ML"` + :obj:`"CiteSeer"`, :obj:`"DBLP"`, :obj:`"PubMed"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + to_undirected (bool, optional): Whether the original graph is + converted to an undirected one. (default: :obj:`True`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #nodes + - #edges + - #features + - #classes + * - Cora + - 19,793 + - 126,842 + - 8,710 + - 70 + * - Cora_ML + - 2,995 + - 16,316 + - 2,879 + - 7 + * - CiteSeer + - 4,230 + - 10,674 + - 602 + - 6 + * - DBLP + - 17,716 + - 105,734 + - 1,639 + - 4 + * - PubMed + - 19,717 + - 88,648 + - 500 + - 3 + """ + + url = 'https://github.com/abojchevski/graph2gauss/raw/master/data/{}.npz' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + to_undirected: bool = True, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + self.to_undirected = to_undirected + assert self.name in ['cora', 'cora_ml', 'citeseer', 'dblp', 'pubmed'] + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'{self.name}.npz' + + @property + def processed_file_names(self) -> str: + suffix = 'undirected' if self.to_undirected else 'directed' + return f'data_{suffix}.pdparams' + + def download(self) -> None: + download_url(self.url.format(self.name), self.raw_dir) + + def process(self) -> None: + data = read_npz(self.raw_paths[0], to_undirected=self.to_undirected) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name.capitalize()}Full()' + + +class CoraFull(CitationFull): + r"""Alias for :class:`~paddle_geometric.datasets.CitationFull` with + :obj:`name="Cora"`. + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 19,793 + - 126,842 + - 8,710 + - 70 + """ + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + ) -> None: + super().__init__(root, 'cora', transform, pre_transform) + + def download(self) -> None: + super().download() + + def process(self) -> None: + super().process() diff --git a/jointContribution/mattergen/paddle_geometric/datasets/coauthor.py b/jointContribution/mattergen/paddle_geometric/datasets/coauthor.py new file mode 100644 index 00000000..fb189af6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/coauthor.py @@ -0,0 +1,94 @@ +import os.path as osp +from typing import Callable, Optional + +from paddle_geometric.data import InMemoryDataset, download_url +from paddle_geometric.io import read_npz + + +class Coauthor(InMemoryDataset): + r"""The Coauthor CS and Coauthor Physics networks from the + `"Pitfalls of Graph Neural Network Evaluation" + `_ paper. + Nodes represent authors that are connected by an edge if they co-authored a + paper. + Given paper keywords for each author's papers, the task is to map authors + to their respective field of study. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"CS"`, :obj:`"Physics"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #nodes + - #edges + - #features + - #classes + * - CS + - 18,333 + - 163,788 + - 6,805 + - 15 + * - Physics + - 34,493 + - 495,924 + - 8,415 + - 5 + """ + + url = 'https://github.com/shchur/gnn-benchmark/raw/master/data/npz/' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert name.lower() in ['cs', 'physics'] + self.name = 'CS' if name.lower() == 'cs' else 'Physics' + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'ms_academic_{self.name[:3].lower()}.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + download_url(self.url + self.raw_file_names, self.raw_dir) + + def process(self) -> None: + data = read_npz(self.raw_paths[0], to_undirected=True) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}{self.name}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/coma.py b/jointContribution/mattergen/paddle_geometric/datasets/coma.py new file mode 100644 index 00000000..4ea58933 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/coma.py @@ -0,0 +1,132 @@ +import os.path as osp +from glob import glob +from typing import Callable, Optional, List + +import paddle +from paddle_geometric.data import InMemoryDataset, extract_zip +from paddle_geometric.io import read_ply + + +class CoMA(InMemoryDataset): + r"""The CoMA 3D faces dataset from the `"Generating 3D faces using + Convolutional Mesh Autoencoders" `_ + paper, containing 20,466 meshes of extreme expressions captured over 12 + different subjects. + + .. note:: + + Data objects hold mesh faces instead of edge indices. + To convert the mesh to a graph, use the + :obj:`paddle_geometric.transforms.FaceToEdge` as :obj:`pre_transform`. + To convert the mesh to a point cloud, use the + :obj:`paddle_geometric.transforms.SamplePoints` as :obj:`transform` to + sample a fixed number of points on the mesh faces according to their + face area. + + Args: + root (str): Root directory where the dataset should be saved. + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 20,465 + - 5,023 + - 29,990 + - 3 + - 12 + """ + + url = 'https://coma.is.tue.mpg.de/' + + categories = [ + 'bareteeth', + 'cheeks_in', + 'eyebrow', + 'high_smile', + 'lips_back', + 'lips_up', + 'mouth_down', + 'mouth_extreme', + 'mouth_middle', + 'mouth_open', + 'mouth_side', + 'mouth_up', + ] + + def __init__( + self, + root: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> str: + return 'COMA_data.zip' + + @property + def processed_file_names(self) -> List[str]: + return ['training.pdparams', 'test.pdparams'] + + def download(self) -> None: + raise RuntimeError( + f"Dataset not found. Please download 'COMA_data.zip' from " + f"'{self.url}' and move it to '{self.raw_dir}'") + + def process(self) -> None: + folders = sorted(glob(osp.join(self.raw_dir, 'FaceTalk_*'))) + if len(folders) == 0: + extract_zip(self.raw_paths[0], self.raw_dir, log=False) + folders = sorted(glob(osp.join(self.raw_dir, 'FaceTalk_*'))) + + train_data_list, test_data_list = [], [] + for folder in folders: + for i, category in enumerate(self.categories): + files = sorted(glob(osp.join(folder, category, '*.ply'))) + for j, f in enumerate(files): + data = read_ply(f) + data.y = paddle.to_tensor([i], dtype='int64') + if self.pre_filter is not None and\ + not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + + if (j % 100) < 90: + train_data_list.append(data) + else: + test_data_list.append(data) + + self.save(train_data_list, self.processed_paths[0]) + self.save(test_data_list, self.processed_paths[1]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/cornell.py b/jointContribution/mattergen/paddle_geometric/datasets/cornell.py new file mode 100644 index 00000000..6a64fee0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/cornell.py @@ -0,0 +1,144 @@ +import os.path as osp +from glob import glob +from typing import Callable, List, Optional + +import pandas as pd +import paddle + +from paddle_geometric.data import InMemoryDataset, download_url + +from paddle_geometric.data.hypergraph_data import HyperGraphData + + +class CornellTemporalHyperGraphDataset(InMemoryDataset): + r"""A collection of temporal higher-order network datasets from the + `"Simplicial Closure and higher-order link prediction" + `_ paper. + Each of the datasets is a timestamped sequence of simplices, where a + simplex is a set of :math:`k` nodes. + + See the original `datasets page + `_ for more details about + individual datasets. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. + (default: :obj:`"train"`) + setting (str, optional): If :obj:`"transductive"`, loads the dataset + for transductive training. + If :obj:`"inductive"`, loads the dataset for inductive training. + (default: :obj:`"transductive"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + names = [ + 'email-Eu', + 'email-Enron', + 'NDC-classes', + 'tags-math-sx', + 'email-Eu-25', + 'NDC-substances', + 'congress-bills', + 'tags-ask-ubuntu', + 'email-Enron-25', + 'NDC-classes-25', + 'threads-ask-ubuntu', + 'contact-high-school', + 'NDC-substances-25', + 'congress-bills-25', + 'contact-primary-school', + ] + url = ('https://huggingface.co/datasets/SauravMaheshkar/{}/raw/main/processed/{}/{}') + + def __init__( + self, + root: str, + name: str, + split: str = 'train', + setting: str = 'transductive', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert name in self.names + assert setting in ['transductive', 'inductive'] + + self.name = name + self.setting = setting + + super().__init__(root, transform, pre_transform, pre_filter, force_reload) + + if split == 'train': + path = self.processed_paths[0] + elif split == 'val': + path = self.processed_paths[1] + elif split == 'test': + path = self.processed_paths[2] + else: + raise ValueError(f"Split '{split}' not found") + + self.load(path) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, self.setting, 'raw') + + @property + def raw_file_names(self) -> List[str]: + return ['train_df.csv', 'val_df.csv', 'test_df.csv'] + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, self.setting, 'processed') + + @property + def processed_file_names(self) -> List[str]: + return ['train_data.pdparams', 'val_data.pdparams', 'test_data.pdparams'] + + def download(self) -> None: + for filename in self.raw_file_names: + url = self.url.format(self.name, self.setting, filename) + download_url(url, self.raw_dir) + + def process(self) -> None: + for raw_path, path in zip(self.raw_paths, self.processed_paths): + df = pd.read_csv(raw_path) + + data_list = [] + for i, row in df.iterrows(): + edge_indices: List[List[int]] = [[], []] + for node in eval(row['nodes']): # str(list) -> list: + edge_indices[0].append(node) + edge_indices[1].append(i) # Use `i` as hyper-edge index. + + x = paddle.to_tensor([[row['timestamp']]], dtype='float32') + edge_index = paddle.to_tensor(edge_indices, dtype='int64') + + data = HyperGraphData(x=x, edge_index=edge_index) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, path) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/dblp.py b/jointContribution/mattergen/paddle_geometric/datasets/dblp.py new file mode 100644 index 00000000..daa2221d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/dblp.py @@ -0,0 +1,124 @@ +import os +import os.path as osp +from itertools import product +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import HeteroData, InMemoryDataset +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_zip, +) + + +class DBLP(InMemoryDataset): + r"""A subset of the DBLP computer science bibliography website, as + collected in the `"MAGNN: Metapath Aggregated Graph Neural Network for + Heterogeneous Graph Embedding" `_ paper. + DBLP is a heterogeneous graph containing four types of entities - authors + (4,057 nodes), papers (14,328 nodes), terms (7,723 nodes), and conferences + (20 nodes). + The authors are divided into four research areas (database, data mining, + artificial intelligence, information retrieval). + Each author is described by a bag-of-words representation of their paper + keywords. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://www.dropbox.com/s/yh4grpeks87ugr2/DBLP_processed.zip?dl=1' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'adjM.npz', 'features_0.npz', 'features_1.npz', 'features_2.npy', + 'labels.npy', 'node_types.npy', 'train_val_test_idx.npz' + ] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import scipy.sparse as sp + + data = HeteroData() + + node_types = ['author', 'paper', 'term', 'conference'] + for i, node_type in enumerate(node_types[:2]): + x = sp.load_npz(osp.join(self.raw_dir, f'features_{i}.npz')) + data[node_type].x = paddle.to_tensor(x.todense(), dtype='float32') + + x = np.load(osp.join(self.raw_dir, 'features_2.npy')) + data['term'].x = paddle.to_tensor(x, dtype='float32') + + node_type_idx = np.load(osp.join(self.raw_dir, 'node_types.npy')) + node_type_idx = paddle.to_tensor(node_type_idx, dtype='int64') + data['conference'].num_nodes = int((node_type_idx == 3).sum()) + + y = np.load(osp.join(self.raw_dir, 'labels.npy')) + data['author'].y = paddle.to_tensor(y, dtype='int64') + + split = np.load(osp.join(self.raw_dir, 'train_val_test_idx.npz')) + for name in ['train', 'val', 'test']: + idx = split[f'{name}_idx'] + idx = paddle.to_tensor(idx, dtype='int64') + mask = paddle.zeros([data['author'].num_nodes], dtype='bool') + mask[idx] = True + data['author'][f'{name}_mask'] = mask + + s = {} + N_a = data['author'].num_nodes + N_p = data['paper'].num_nodes + N_t = data['term'].num_nodes + N_c = data['conference'].num_nodes + s['author'] = (0, N_a) + s['paper'] = (N_a, N_a + N_p) + s['term'] = (N_a + N_p, N_a + N_p + N_t) + s['conference'] = (N_a + N_p + N_t, N_a + N_p + N_t + N_c) + + A = sp.load_npz(osp.join(self.raw_dir, 'adjM.npz')) + for src, dst in product(node_types, node_types): + A_sub = A[s[src][0]:s[src][1], s[dst][0]:s[dst][1]].tocoo() + if A_sub.nnz > 0: + row = paddle.to_tensor(A_sub.row, dtype='int64') + col = paddle.to_tensor(A_sub.col, dtype='int64') + data[src, dst].edge_index = paddle.stack([row, col], axis=0) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save(data, self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/dbp15k.py b/jointContribution/mattergen/paddle_geometric/datasets/dbp15k.py new file mode 100644 index 00000000..4f49a8ae --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/dbp15k.py @@ -0,0 +1,145 @@ +import os +import os.path as osp +from typing import Callable, Dict, List, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import HeteroData, InMemoryDataset +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_google_url, + extract_zip, +) +from paddle_geometric.utils import sort_edge_index + + +class DBP15K(InMemoryDataset): + r"""The DBP15K dataset from the + `"Cross-lingual Entity Alignment via Joint Attribute-Preserving Embedding" + `_ paper, where Chinese, Japanese and + French versions of DBpedia were linked to its English version. + Node features are given by pre-trained and aligned monolingual word + embeddings from the `"Cross-lingual Knowledge Graph Alignment via Graph + Matching Neural Network" `_ paper. + + Args: + root (str): Root directory where the dataset should be saved. + pair (str): The pair of languages (:obj:`"en_zh"`, :obj:`"en_fr"`, + :obj:`"en_ja"`, :obj:`"zh_en"`, :obj:`"fr_en"`, :obj:`"ja_en"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + file_id = '1ggYlYf2_kTyi7oF9g07oTNn3VDhjl7so' + + def __init__( + self, + root: str, + pair: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert pair in ['en_zh', 'en_fr', 'en_ja', 'zh_en', 'fr_en', 'ja_en'] + self.pair = pair + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['en_zh', 'en_fr', 'en_ja', 'zh_en', 'fr_en', 'ja_en'] + + @property + def processed_file_names(self) -> str: + return f'{self.pair}.pdparams' + + def download(self) -> None: + path = download_google_url(self.file_id, self.root, 'data.zip') + extract_zip(path, self.root) + os.unlink(path) + + def process(self) -> None: + embs = {} + with open(osp.join(self.raw_dir, 'sub.glove.300d')) as f: + for i, line in enumerate(f): + info = line.strip().split(' ') + if len(info) > 300: + embs[info[0]] = paddle.to_tensor([float(x) for x in info[1:]]) + else: + embs['**UNK**'] = paddle.to_tensor([float(x) for x in info]) + + g1_path = osp.join(self.raw_dir, self.pair, 'triples_1') + x1_path = osp.join(self.raw_dir, self.pair, 'id_features_1') + g2_path = osp.join(self.raw_dir, self.pair, 'triples_2') + x2_path = osp.join(self.raw_dir, self.pair, 'id_features_2') + + x1, edge_index1, rel1, assoc1 = self.process_graph( + g1_path, x1_path, embs) + x2, edge_index2, rel2, assoc2 = self.process_graph( + g2_path, x2_path, embs) + + train_path = osp.join(self.raw_dir, self.pair, 'train.examples.20') + train_y = self.process_y(train_path, assoc1, assoc2) + + test_path = osp.join(self.raw_dir, self.pair, 'test.examples.1000') + test_y = self.process_y(test_path, assoc1, assoc2) + + data = HeteroData() + data['x1'].x = x1 + data['x2'].x = x2 + data['x1', 'edge_index1'].edge_index = edge_index1 + data['x2', 'edge_index2'].edge_index = edge_index2 + data['train_y'] = train_y + data['test_y'] = test_y + + self.save(data, self.processed_paths[0]) + + def process_graph( + self, + triple_path: str, + feature_path: str, + embeddings: Dict[str, Tensor], + ) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + g1 = read_txt_array(triple_path, sep='\t', dtype='int64') + subj, rel, obj = g1.t() + + x_dict = {} + with open(feature_path) as f: + for line in f: + info = line.strip().split('\t') + info = info if len(info) == 2 else info + ['**UNK**'] + seq = info[1].lower().split() + hs = [embeddings.get(w, embeddings['**UNK**']) for w in seq] + x_dict[int(info[0])] = paddle.stack(hs, axis=0) + + idx = paddle.to_tensor(list(x_dict.keys())) + assoc = paddle.full((int(idx.max()) + 1,), -1, dtype='int64') + assoc[idx] = paddle.arange(idx.shape[0]) + + subj, obj = assoc[subj], assoc[obj] + edge_index = paddle.stack([subj, obj], axis=0) + edge_index, rel = sort_edge_index(edge_index, rel) + + xs = list(x_dict.values()) + for i in x_dict.keys(): + xs[assoc[i]] = x_dict[i] + x = paddle.nn.utils.pad_sequence(xs, batch_first=True, padding_value=0) + + return x, edge_index, rel, assoc + + def process_y(self, path: str, assoc1: Tensor, assoc2: Tensor) -> Tensor: + row, col, mask = read_txt_array(path, sep='\t', dtype='int64').t() + mask = mask.astype('bool') + return paddle.stack([assoc1[row[mask]], assoc2[col[mask]]], axis=0) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.pair})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/deezer_europe.py b/jointContribution/mattergen/paddle_geometric/datasets/deezer_europe.py new file mode 100644 index 00000000..cfb28a2d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/deezer_europe.py @@ -0,0 +1,67 @@ +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class DeezerEurope(InMemoryDataset): + r"""The Deezer Europe dataset introduced in the `"Characteristic Functions + on Graphs: Birds of a Feather, from Statistical Descriptors to Parametric + Models" `_ paper. + Nodes represent European users of Deezer and edges are mutual follower + relationships. + It contains 28,281 nodes, 185,504 edges, 128 node features and 2 classes. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://graphmining.ai/datasets/ptg/deezer_europe.npz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'deezer_europe.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + download_url(self.url, self.raw_dir) + + def process(self) -> None: + data = np.load(self.raw_paths[0], 'r', allow_pickle=True) + x = paddle.to_tensor(data['features'], dtype='float32') + y = paddle.to_tensor(data['target'], dtype='int64') + edge_index = paddle.to_tensor(data['edges'], dtype='int64') + edge_index = edge_index.transpose([1, 0]) + + data = Data(x=x, y=y, edge_index=edge_index) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/dgraph.py b/jointContribution/mattergen/paddle_geometric/datasets/dgraph.py new file mode 100644 index 00000000..48e2eb4b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/dgraph.py @@ -0,0 +1,105 @@ +import os.path as osp +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, extract_zip +from paddle_geometric.utils import index_to_mask + + +class DGraphFin(InMemoryDataset): + r"""The DGraphFin networks from the + `"DGraph: A Large-Scale Financial Dataset for Graph Anomaly Detection" + `_ paper. + It is a directed, unweighted dynamic graph consisting of millions of + nodes and edges, representing a realistic user-to-user social network + in financial industry. + Node represents a Finvolution user, and an edge from one + user to another means that the user regards the other user + as the emergency contact person. Each edge is associated with a + timestamp ranging from 1 to 821 and a type of emergency contact + ranging from 0 to 11. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 3,700,550 + - 4,300,999 + - 17 + - 2 + """ + + url = "https://dgraph.xinye.com" + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + def download(self) -> None: + raise RuntimeError( + f"Dataset not found. Please download '{self.raw_file_names}' from " + f"'{self.url}' and move it to '{self.raw_dir}'") + + @property + def raw_file_names(self) -> str: + return 'DGraphFin.zip' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + @property + def num_classes(self) -> int: + return 2 + + def process(self) -> None: + extract_zip(self.raw_paths[0], self.raw_dir, log=False) + path = osp.join(self.raw_dir, "dgraphfin.npz") + + with np.load(path) as loader: + x = paddle.to_tensor(loader['x'], dtype='float32') + y = paddle.to_tensor(loader['y'], dtype='int64') + edge_index = paddle.to_tensor(loader['edge_index'], dtype='int64') + edge_type = paddle.to_tensor(loader['edge_type'], dtype='int64') + edge_time = paddle.to_tensor(loader['edge_timestamp'], dtype='int64') + train_nodes = paddle.to_tensor(loader['train_mask'], dtype='int64') + val_nodes = paddle.to_tensor(loader['valid_mask'], dtype='int64') + test_nodes = paddle.to_tensor(loader['test_mask'], dtype='int64') + + train_mask = index_to_mask(train_nodes, size=x.shape[0]) + val_mask = index_to_mask(val_nodes, size=x.shape[0]) + test_mask = index_to_mask(test_nodes, size=x.shape[0]) + data = Data(x=x, edge_index=edge_index.transpose([1, 0]), + edge_type=edge_type, edge_time=edge_time, y=y, + train_mask=train_mask, val_mask=val_mask, test_mask=test_mask) + + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/dynamic_faust.py b/jointContribution/mattergen/paddle_geometric/datasets/dynamic_faust.py new file mode 100644 index 00000000..7ea62c8a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/dynamic_faust.py @@ -0,0 +1,146 @@ +import os.path as osp +from itertools import product +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset + + +class DynamicFAUST(InMemoryDataset): + r"""The dynamic FAUST humans dataset from the `"Dynamic FAUST: Registering + Human Bodies in Motion" + `_ paper. + + .. note:: + + Data objects hold mesh faces instead of edge indices. + To convert the mesh to a graph, use the + :obj:`paddle_geometric.transforms.FaceToEdge` as :obj:`pre_transform`. + To convert the mesh to a point cloud, use the + :obj:`paddle_geometric.transforms.SamplePoints` as :obj:`transform` to + sample a fixed number of points on the mesh faces according to their + face area. + + Args: + root (str): Root directory where the dataset should be saved. + subjects (list, optional): List of subjects to include in the + dataset. Can include the subjects :obj:`"50002"`, :obj:`"50004"`, + :obj:`"50007"`, :obj:`"50009"`, :obj:`"50020"`, :obj:`"50021"`, + :obj:`"50022"`, :obj:`"50025"`, :obj:`"50026"`, :obj:`"50027"`. + If set to :obj:`None`, the dataset will contain all subjects. + (default: :obj:`None`) + categories (list, optional): List of categories to include in the + dataset. Can include the categories :obj:`"chicken_wings"`, + :obj:`"hips"`, :obj:`"jiggle_on_toes"`, :obj:`"jumping_jacks"`, + :obj:`"knees"`, :obj:`"light_hopping_loose"`, + :obj:`"light_hopping_stiff"`, :obj:`"one_leg_jump"`, + :obj:`"one_leg_loose"`, :obj:`"personal_move"`, :obj:`"punching"`, + :obj:`"running_on_spot"`, :obj:`"running_on_spot_bugfix"`, + :obj:`"shake_arms"`, :obj:`"shake_hips"`, :obj:`"shoulders"`. + If set to :obj:`None`, the dataset will contain all categories. + (default: :obj:`None`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'http://dfaust.is.tue.mpg.de/' + + subjects = [ + '50002', '50004', '50007', '50009', '50020', '50021', '50022', '50025', + '50026', '50027' + ] + categories = [ + 'chicken_wings', 'hips', 'jiggle_on_toes', 'jumping_jacks', 'knees', + 'light_hopping_loose', 'light_hopping_stiff', 'one_leg_jump', + 'one_leg_loose', 'personal_move', 'punching', 'running_on_spot', + 'running_on_spot_bugfix', 'shake_arms', 'shake_hips', 'shake_shoulders' + ] + + def __init__( + self, + root: str, + subjects: Optional[List[str]] = None, + categories: Optional[List[str]] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + + subjects = self.subjects if subjects is None else subjects + subjects = [sid.lower() for sid in subjects] + for sid in subjects: + assert sid in self.subjects + self.subjects = subjects + + categories = self.categories if categories is None else categories + categories = [cat.lower() for cat in categories] + for cat in categories: + assert cat in self.categories + self.categories = categories + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['registrations_m.hdf5', 'registrations_f.hdf5'] + + @property + def processed_file_names(self) -> str: + sids = '_'.join([sid[-2:] for sid in self.subjects]) + cats = '_'.join([ + ''.join([w[0] for w in cat.split('_')]) for cat in self.categories + ]) + return f'{sids}_{cats}.pdparams' + + def download(self) -> None: + raise RuntimeError( + f"Dataset not found. Please download male registrations " + f"'registrations_m.hdf5' and female registrations " + f"'registrations_f.hdf5' from '{self.url}' and move it to " + f"'{self.raw_dir}'") + + def process(self) -> None: + import h5py + + fm = h5py.File(self.raw_paths[0], 'r') + ff = h5py.File(self.raw_paths[1], 'r') + + face = paddle.to_tensor(fm['faces'][()], dtype='int64') + face = face.transpose([1, 0]) + + data_list = [] + for (sid, cat) in product(self.subjects, self.categories): + idx = f'{sid}_{cat}' + if idx in fm: + pos = paddle.to_tensor(fm[idx][()]) + elif idx in ff: + pos = paddle.to_tensor(ff[idx][()]) + else: + continue + pos = pos.transpose([2, 0, 1]) + data_list.append(Data(pos=pos, face=face, num_nodes=pos.shape[1])) + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/elliptic.py b/jointContribution/mattergen/paddle_geometric/datasets/elliptic.py new file mode 100644 index 00000000..205b7843 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/elliptic.py @@ -0,0 +1,131 @@ +from typing import Any, Callable, List, Optional, Tuple + +import pandas as pd +import paddle + +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.io import fs + + +class EllipticBitcoinDataset(InMemoryDataset): + r"""The Elliptic Bitcoin dataset of Bitcoin transactions from the + `"Anti-Money Laundering in Bitcoin: Experimenting with Graph Convolutional + Networks for Financial Forensics" `_ + paper. + + :class:`EllipticBitcoinDataset` maps Bitcoin transactions to real entities + belonging to licit categories (exchanges, wallet providers, miners, + licit services, etc.) versus illicit ones (scams, malware, terrorist + organizations, ransomware, Ponzi schemes, etc.) + + There exists 203,769 node transactions and 234,355 directed edge payments + flows, with two percent of nodes (4,545) labelled as illicit, and + twenty-one percent of nodes (42,019) labelled as licit. + The remaining transactions are unknown. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 203,769 + - 234,355 + - 165 + - 2 + """ + + url = 'https://data.pyg.org/datasets/elliptic' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'elliptic_txs_features.csv', + 'elliptic_txs_edgelist.csv', + 'elliptic_txs_classes.csv', + ] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + for file_name in self.raw_file_names: + fs.cp(f'{self.url}/{file_name}.zip', self.raw_dir, extract=True) + + def _process_df(self, feat_df: Any, edge_df: Any, + class_df: Any) -> Tuple[Any, Any, Any]: + return feat_df, edge_df, class_df + + def process(self) -> None: + feat_df = pd.read_csv(self.raw_paths[0], header=None) + edge_df = pd.read_csv(self.raw_paths[1]) + class_df = pd.read_csv(self.raw_paths[2]) + + columns = {0: 'txId', 1: 'time_step'} + feat_df = feat_df.rename(columns=columns) + + feat_df, edge_df, class_df = self._process_df( + feat_df, + edge_df, + class_df, + ) + + x = paddle.to_tensor(feat_df.loc[:, 2:].values, dtype='float32') + + # There exists 3 different classes in the dataset: + # 0=licit, 1=illicit, 2=unknown + mapping = {'unknown': 2, '1': 1, '2': 0} + class_df['class'] = class_df['class'].map(mapping) + y = paddle.to_tensor(class_df['class'].values, dtype='int64') + + mapping = {idx: i for i, idx in enumerate(feat_df['txId'].values)} + edge_df['txId1'] = edge_df['txId1'].map(mapping) + edge_df['txId2'] = edge_df['txId2'].map(mapping) + edge_index = paddle.to_tensor(edge_df.values.T, dtype='int64') + + # Timestamp based split: + # train_mask: 1 - 34 time_step, test_mask: 35-49 time_step + time_step = paddle.to_tensor(feat_df['time_step'].values, dtype='int64') + train_mask = paddle.logical_and(time_step < 35, y != 2) + test_mask = paddle.logical_and(time_step >= 35, y != 2) + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + test_mask=test_mask) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + @property + def num_classes(self) -> int: + return 2 diff --git a/jointContribution/mattergen/paddle_geometric/datasets/elliptic_temporal.py b/jointContribution/mattergen/paddle_geometric/datasets/elliptic_temporal.py new file mode 100644 index 00000000..cd636d93 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/elliptic_temporal.py @@ -0,0 +1,87 @@ +from typing import Any, Callable, Optional, Tuple + +from paddle_geometric.datasets import EllipticBitcoinDataset + + +class EllipticBitcoinTemporalDataset(EllipticBitcoinDataset): + r"""The time-step aware Elliptic Bitcoin dataset of Bitcoin transactions + from the `"Anti-Money Laundering in Bitcoin: Experimenting with Graph + Convolutional Networks for Financial Forensics" + `_ paper. + + :class:`EllipticBitcoinTemporalDataset` maps Bitcoin transactions to real + entities belonging to licit categories (exchanges, wallet providers, + miners, licit services, etc.) versus illicit ones (scams, malware, + terrorist organizations, ransomware, Ponzi schemes, etc.) + + There exists 203,769 node transactions and 234,355 directed edge payments + flows, with two percent of nodes (4,545) labelled as illicit, and + twenty-one percent of nodes (42,019) labelled as licit. + The remaining transactions are unknown. + + .. note:: + + In contrast to :class:`EllipticBitcoinDataset`, this dataset returns + Bitcoin transactions only for a given timestamp :obj:`t`. + + Args: + root (str): Root directory where the dataset should be saved. + t (int): The Timestep for which nodes should be selected (from :obj:`1` + to :obj:`49`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 203,769 + - 234,355 + - 165 + - 2 + """ + def __init__( + self, + root: str, + t: int, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ): + if t < 1 or t > 49: + raise ValueError("'t' needs to be between 1 and 49") + + self.t = t + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + + @property + def processed_file_names(self) -> str: + return f'data_t_{self.t}.pt' + + def _process_df(self, feat_df: Any, edge_df: Any, + class_df: Any) -> Tuple[Any, Any, Any]: + + feat_df = feat_df[feat_df['time_step'] == self.t] + + mask = edge_df['txId1'].isin(feat_df['txId'].values) + edge_df = edge_df[mask] + + class_df = class_df.merge(feat_df[['txId']], how='right', + left_on='txId', right_on='txId') + + return feat_df, edge_df, class_df diff --git a/jointContribution/mattergen/paddle_geometric/datasets/email_eu_core.py b/jointContribution/mattergen/paddle_geometric/datasets/email_eu_core.py new file mode 100644 index 00000000..7fef98d7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/email_eu_core.py @@ -0,0 +1,74 @@ +import os +from typing import Callable, List, Optional + +import pandas as pd +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class EmailEUCore(InMemoryDataset): + r"""An e-mail communication network of a large European research + institution, taken from the `"Local Higher-order Graph Clustering" + `_ paper. + Nodes indicate members of the institution. + An edge between a pair of members indicates that they exchanged at least + one email. + Node labels indicate membership to one of the 42 departments. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + urls = [ + 'https://snap.stanford.edu/data/email-Eu-core.txt.gz', + 'https://snap.stanford.edu/data/email-Eu-core-department-labels.txt.gz' + ] + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['email-Eu-core.txt', 'email-Eu-core-department-labels.txt'] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + for url in self.urls: + path = download_url(url, self.raw_dir) + os.system(f"gunzip -f {path}") + + def process(self) -> None: + edge_index = pd.read_csv(self.raw_paths[0], sep=' ', header=None) + edge_index = paddle.to_tensor(edge_index.values.T, dtype='int64') + + y = pd.read_csv(self.raw_paths[1], sep=' ', header=None, usecols=[1]) + y = paddle.to_tensor(y.values.flatten(), dtype='int64') + + data = Data(edge_index=edge_index, y=y, num_nodes=y.shape[0]) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/entities.py b/jointContribution/mattergen/paddle_geometric/datasets/entities.py new file mode 100644 index 00000000..562c05dc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/entities.py @@ -0,0 +1,166 @@ +import os +import os.path as osp +from collections import Counter +from typing import Any, Callable, List, Optional + +import pandas as pd +import paddle + +from paddle_geometric.data import Data, HeteroData, InMemoryDataset, download_url +from paddle_geometric.utils import index_sort + + +class Entities(InMemoryDataset): + r"""The relational entities networks :obj:`"AIFB"`, :obj:`"MUTAG"`, + :obj:`"BGS"` and :obj:`"AM"` from the `"Modeling Relational Data with Graph + Convolutional Networks" `_ paper. + Training and test splits are given by node indices. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"AIFB"`, :obj:`"MUTAG"`, + :obj:`"BGS"`, :obj:`"AM"`). + hetero (bool, optional): If set to :obj:`True`, will save the dataset + as a :class:`~paddle_geometric.data.HeteroData` object. + (default: :obj:`False`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = 'https://data.dgl.ai/dataset/{}.tgz' + + def __init__( + self, + root: str, + name: str, + hetero: bool = False, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + self.hetero = hetero + assert self.name in ['aifb', 'am', 'mutag', 'bgs'] + super().__init__(root, transform, pre_transform, force_reload) + if hetero: + self.load(self.processed_paths[0], data_cls=HeteroData) + else: + self.load(self.processed_paths[0], data_cls=Data) + + @property + def raw_file_names(self) -> List[str]: + return [ + f'{self.name}_stripped.nt.gz', + 'completeDataset.tsv', + 'trainingSet.tsv', + 'testSet.tsv', + ] + + @property + def processed_file_names(self) -> str: + return 'hetero_data.pdparams' if self.hetero else 'data.pdparams' + + def download(self) -> None: + path = download_url(self.url.format(self.name), self.root) + os.system(f"tar -xzf {path} -C {self.raw_dir}") + os.unlink(path) + + def process(self) -> None: + import gzip + import rdflib as rdf + + graph_file, task_file, train_file, test_file = self.raw_paths + + with hide_stdout(): + g = rdf.Graph() + with gzip.open(graph_file, 'rb') as f: + g.parse(file=f, format='nt') + + freq = Counter(g.predicates()) + relations = sorted(set(g.predicates()), key=lambda p: -freq.get(p, 0)) + subjects = set(g.subjects()) + objects = set(g.objects()) + nodes = list(subjects.union(objects)) + + N = len(nodes) + R = 2 * len(relations) + relations_dict = {rel: i for i, rel in enumerate(relations)} + nodes_dict = {str(node): i for i, node in enumerate(nodes)} + + edges = [] + for s, p, o in g.triples((None, None, None)): + src, dst = nodes_dict[str(s)], nodes_dict[str(o)] + rel = relations_dict[p] + edges.append([src, dst, 2 * rel]) + edges.append([dst, src, 2 * rel + 1]) + + edge = paddle.to_tensor(edges, dtype='int64').t() + _, perm = index_sort(N * R * edge[0] + R * edge[1] + edge[2]) + edge = edge[:, perm] + + edge_index, edge_type = edge[:2], edge[2] + + if self.name == 'am': + label_header = 'label_cateogory' + nodes_header = 'proxy' + elif self.name == 'aifb': + label_header = 'label_affiliation' + nodes_header = 'person' + elif self.name == 'mutag': + label_header = 'label_mutagenic' + nodes_header = 'bond' + elif self.name == 'bgs': + label_header = 'label_lithogenesis' + nodes_header = 'rock' + + labels_df = pd.read_csv(task_file, sep='\t') + labels_set = set(labels_df[label_header].values.tolist()) + labels_dict = {lab: i for i, lab in enumerate(list(labels_set))} + + train_labels_df = pd.read_csv(train_file, sep='\t') + train_idx, train_y = [], [] + for nod, lab in zip(train_labels_df[nodes_header].values, + train_labels_df[label_header].values): + train_idx.append(nodes_dict[nod]) + train_y.append(labels_dict[lab]) + + train_idx = paddle.to_tensor(train_idx, dtype='int64') + train_y = paddle.to_tensor(train_y, dtype='int64') + + test_labels_df = pd.read_csv(test_file, sep='\t') + test_idx, test_y = [], [] + for nod, lab in zip(test_labels_df[nodes_header].values, + test_labels_df[label_header].values): + test_idx.append(nodes_dict[nod]) + test_y.append(labels_dict[lab]) + + test_idx = paddle.to_tensor(test_idx, dtype='int64') + test_y = paddle.to_tensor(test_y, dtype='int64') + + data = Data(edge_index=edge_index, edge_type=edge_type, + train_idx=train_idx, train_y=train_y, test_idx=test_idx, + test_y=test_y, num_nodes=N) + + if self.hetero: + data = data.to_heterogeneous(node_type_names=['v']) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name.upper()}{self.__class__.__name__}()' + + +class hide_stdout: + def __enter__(self) -> None: + self.level = logging.getLogger().level + logging.getLogger().setLevel(logging.ERROR) + + def __exit__(self, *args: Any) -> None: + logging.getLogger().setLevel(self.level) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/explainer_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/explainer_dataset.py new file mode 100644 index 00000000..858a7907 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/explainer_dataset.py @@ -0,0 +1,114 @@ +from typing import Any, Callable, Dict, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import InMemoryDataset +from paddle_geometric.datasets.graph_generator import GraphGenerator +from paddle_geometric.datasets.motif_generator import MotifGenerator +from paddle_geometric.explain import Explanation + + +class ExplainerDataset(InMemoryDataset): + r"""Generates a synthetic dataset for evaluating explainabilty algorithms, + adapted for Paddle Geometric. + + Args: + graph_generator (GraphGenerator or str): The graph generator to be + used, e.g., + :class:`paddle_geometric.datasets.graph_generator.BAGraph` + (or any string that automatically resolves to it). + motif_generator (MotifGenerator): The motif generator to be used, + e.g., + :class:`paddle_geometric.datasets.motif_generator.HouseMotif` + (or any string that automatically resolves to it). + num_motifs (int): The number of motifs to attach to the graph. + num_graphs (int, optional): The number of graphs to generate. + (default: :obj:`1`) + graph_generator_kwargs (Dict[str, Any], optional): Arguments passed to + the respective graph generator module in case it gets automatically + resolved. (default: :obj:`None`) + motif_generator_kwargs (Dict[str, Any], optional): Arguments passed to + the respective motif generator module in case it gets automatically + resolved. (default: :obj:`None`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + """ + def __init__( + self, + graph_generator: Union[GraphGenerator, str], + motif_generator: Union[MotifGenerator, str], + num_motifs: int, + num_graphs: int = 1, + graph_generator_kwargs: Optional[Dict[str, Any]] = None, + motif_generator_kwargs: Optional[Dict[str, Any]] = None, + transform: Optional[Callable] = None, + ): + super().__init__(root=None, transform=transform) + + if num_motifs <= 0: + raise ValueError(f"At least one motif needs to be attached to the " + f"graph (got {num_motifs})") + + self.graph_generator = GraphGenerator.resolve( + graph_generator, + **(graph_generator_kwargs or {}), + ) + self.motif_generator = MotifGenerator.resolve( + motif_generator, + **(motif_generator_kwargs or {}), + ) + self.num_motifs = num_motifs + + # Generate synthetic graphs and collate them: + data_list = [self.get_graph() for _ in range(num_graphs)] + self.data, self.slices = self.collate(data_list) + + def get_graph(self) -> Explanation: + data = self.graph_generator() + assert data.num_nodes is not None + assert data.edge_index is not None + + edge_indices = [data.edge_index] + num_nodes = data.num_nodes + node_masks = [paddle.zeros([data.num_nodes])] + edge_masks = [paddle.zeros([data.num_edges])] + ys = [paddle.zeros([num_nodes], dtype="int64")] + + connecting_nodes = paddle.randperm(num_nodes)[:self.num_motifs] + for i in connecting_nodes.numpy().tolist(): + motif = self.motif_generator() + assert motif.num_nodes is not None + assert motif.edge_index is not None + + # Add motif to the graph: + edge_indices.append(motif.edge_index + num_nodes) + node_masks.append(paddle.ones([motif.num_nodes])) + edge_masks.append(paddle.ones([motif.num_edges])) + + # Add random motif connection to the graph: + j = int(paddle.randint(0, motif.num_nodes, shape=[1])) + num_nodes + edge_indices.append(paddle.to_tensor([[i, j], [j, i]], dtype="int64")) + edge_masks.append(paddle.zeros([2])) + + if isinstance(motif.y, Tensor): + ys.append(motif.y + 1 if motif.y.min() == 0 else motif.y) + else: + ys.append(paddle.ones([motif.num_nodes], dtype="int64")) + + num_nodes += motif.num_nodes + + return Explanation( + edge_index=paddle.concat(edge_indices, axis=1), + y=paddle.concat(ys, axis=0), + edge_mask=paddle.concat(edge_masks, axis=0), + node_mask=paddle.concat(node_masks, axis=0), + ) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'graph_generator={self.graph_generator}, ' + f'motif_generator={self.motif_generator}, ' + f'num_motifs={self.num_motifs})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/facebook.py b/jointContribution/mattergen/paddle_geometric/datasets/facebook.py new file mode 100644 index 00000000..ba163f9f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/facebook.py @@ -0,0 +1,65 @@ +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class FacebookPagePage(InMemoryDataset): + r"""The Facebook Page-Page network dataset introduced in the + `"Multi-scale Attributed Node Embedding" + `_ paper. + Nodes represent verified pages on Facebook and edges are mutual likes. + It contains 22,470 nodes, 342,004 edges, 128 node features and 4 classes. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://graphmining.ai/datasets/ptg/facebook.npz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'facebook.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.url, self.raw_dir) + + def process(self) -> None: + data = np.load(self.raw_paths[0], 'r', allow_pickle=True) + x = paddle.to_tensor(data['features'], dtype='float32') + y = paddle.to_tensor(data['target'], dtype='int64') + edge_index = paddle.to_tensor(data['edges'], dtype='int64').t() + + data = Data(x=x, y=y, edge_index=edge_index) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/fake.py b/jointContribution/mattergen/paddle_geometric/datasets/fake.py new file mode 100644 index 00000000..d7a1b7a5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/fake.py @@ -0,0 +1,271 @@ +import random +from collections import defaultdict +from itertools import product +from typing import Callable, Dict, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData, InMemoryDataset +from paddle_geometric.utils import coalesce, remove_self_loops, to_undirected + + +class FakeDataset(InMemoryDataset): + r"""A fake dataset that returns randomly generated + :class:`~paddle_geometric.data.Data` objects. + + Args: + num_graphs (int, optional): The number of graphs. (default: :obj:`1`) + avg_num_nodes (int, optional): The average number of nodes in a graph. + (default: :obj:`1000`) + avg_degree (float, optional): The average degree per node. + (default: :obj:`10.0`) + num_channels (int, optional): The number of node features. + (default: :obj:`64`) + edge_dim (int, optional): The number of edge features. + (default: :obj:`0`) + num_classes (int, optional): The number of classes in the dataset. + (default: :obj:`10`) + task (str, optional): Whether to return node-level or graph-level + labels (:obj:`"node"`, :obj:`"graph"`, :obj:`"auto"`). + If set to :obj:`"auto"`, will return graph-level labels if + :obj:`num_graphs > 1`, and node-level labels other-wise. + (default: :obj:`"auto"`) + is_undirected (bool, optional): Whether the graphs to generate are + undirected. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + **kwargs (optional): Additional attributes and their shapes + *e.g.* :obj:`global_features=5`. + """ + def __init__( + self, + num_graphs: int = 1, + avg_num_nodes: int = 1000, + avg_degree: float = 10.0, + num_channels: int = 64, + edge_dim: int = 0, + num_classes: int = 10, + task: str = 'auto', + is_undirected: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + **kwargs: Union[int, Tuple[int, ...]], + ) -> None: + super().__init__(None, transform) + + if task == 'auto': + task = 'graph' if num_graphs > 1 else 'node' + assert task in ['node', 'graph'] + + self.avg_num_nodes = max(avg_num_nodes, int(avg_degree)) + self.avg_degree = max(avg_degree, 1) + self.num_channels = num_channels + self.edge_dim = edge_dim + self._num_classes = num_classes + self.task = task + self.is_undirected = is_undirected + self.kwargs = kwargs + data_list = [self.generate_data() for _ in range(max(num_graphs, 1))] + + self.data, self.slices = self.collate(data_list) + + def generate_data(self) -> Data: + num_nodes = get_num_nodes(self.avg_num_nodes, self.avg_degree) + + data = Data() + + if self._num_classes > 0 and self.task == 'node': + data.y = paddle.randint(self._num_classes, shape=[num_nodes, ]) + elif self._num_classes > 0 and self.task == 'graph': + data.y = paddle.to_tensor([random.randint(0, self._num_classes - 1)]) + + data.edge_index = get_edge_index(num_nodes, num_nodes, self.avg_degree, + self.is_undirected, remove_loops=True) + + if self.num_channels > 0: + x = paddle.randn([num_nodes, self.num_channels]) + if self._num_classes > 0 and self.task == 'node': + assert isinstance(data.y, Tensor) + x = x + data.y.unsqueeze(1) + elif self._num_classes > 0 and self.task == 'graph': + assert isinstance(data.y, Tensor) + x = x + data.y + data.x = x + else: + data.num_nodes = num_nodes + + if self.edge_dim > 1: + data.edge_attr = paddle.rand([data.num_edges, self.edge_dim]) + elif self.edge_dim == 1: + data.edge_weight = paddle.rand([data.num_edges]) + + for feature_name, feature_shape in self.kwargs.items(): + setattr(data, feature_name, paddle.randn(feature_shape)) + + return data + + +class FakeHeteroDataset(InMemoryDataset): + r"""A fake dataset that returns randomly generated + :class:`~paddle_geometric.data.HeteroData` objects. + + Args: + num_graphs (int, optional): The number of graphs. (default: :obj:`1`) + num_node_types (int, optional): The number of node types. + (default: :obj:`3`) + num_edge_types (int, optional): The number of edge types. + (default: :obj:`6`) + avg_num_nodes (int, optional): The average number of nodes in a graph. + (default: :obj:`1000`) + avg_degree (float, optional): The average degree per node. + (default: :obj:`10.0`) + avg_num_channels (int, optional): The average number of node features. + (default: :obj:`64`) + edge_dim (int, optional): The number of edge features. + (default: :obj:`0`) + num_classes (int, optional): The number of classes in the dataset. + (default: :obj:`10`) + task (str, optional): Whether to return node-level or graph-level + labels (:obj:`"node"`, :obj:`"graph"`, :obj:`"auto"`). + If set to :obj:`"auto"`, will return graph-level labels if + :obj:`num_graphs > 1`, and node-level labels other-wise. + (default: :obj:`"auto"`) + transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + **kwargs (optional): Additional attributes and their shapes + *e.g.* :obj:`global_features=5`. + """ + def __init__( + self, + num_graphs: int = 1, + num_node_types: int = 3, + num_edge_types: int = 6, + avg_num_nodes: int = 1000, + avg_degree: float = 10.0, + avg_num_channels: int = 64, + edge_dim: int = 0, + num_classes: int = 10, + task: str = "auto", + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + **kwargs: Union[int, Tuple[int, ...]], + ) -> None: + super().__init__(None, transform) + + if task == 'auto': + task = 'graph' if num_graphs > 1 else 'node' + assert task in ['node', 'graph'] + + self.node_types = [f'v{i}' for i in range(max(num_node_types, 1))] + + edge_types: List[Tuple[str, str]] = [] + edge_type_product = list(product(self.node_types, self.node_types)) + while len(edge_types) < max(num_edge_types, 1): + edge_types.extend(edge_type_product) + random.shuffle(edge_types) + + self.edge_types: List[Tuple[str, str, str]] = [] + count: Dict[Tuple[str, str], int] = defaultdict(int) + for edge_type in edge_types[:max(num_edge_types, 1)]: + rel = f'e{count[edge_type]}' + count[edge_type] += 1 + self.edge_types.append((edge_type[0], rel, edge_type[1])) + + self.avg_num_nodes = max(avg_num_nodes, int(avg_degree)) + self.avg_degree = max(avg_degree, 1) + self.num_channels = [ + get_num_channels(avg_num_channels) for _ in self.node_types + ] + self.edge_dim = edge_dim + self._num_classes = num_classes + self.task = task + self.kwargs = kwargs + + data_list = [self.generate_data() for _ in range(max(num_graphs, 1))] + self.data, self.slices = self.collate(data_list) + + def generate_data(self) -> HeteroData: + data = HeteroData() + + iterator = zip(self.node_types, self.num_channels) + for i, (node_type, num_channels) in enumerate(iterator): + num_nodes = get_num_nodes(self.avg_num_nodes, self.avg_degree) + + store = data[node_type] + + if num_channels > 0: + store.x = paddle.randn([num_nodes, num_channels]) + else: + store.num_nodes = num_nodes + + if self._num_classes > 0 and self.task == 'node' and i == 0: + store.y = paddle.randint(self._num_classes, shape=[num_nodes]) + + for (src, rel, dst) in self.edge_types: + store = data[(src, rel, dst)] + + store.edge_index = get_edge_index( + data[src].num_nodes, + data[dst].num_nodes, + self.avg_degree, + is_undirected=False, + remove_loops=False, + ) + + if self.edge_dim > 1: + store.edge_attr = paddle.rand([store.num_edges, self.edge_dim]) + elif self.edge_dim == 1: + store.edge_weight = paddle.rand([store.num_edges]) + + if self._num_classes > 0 and self.task == 'graph': + data.y = paddle.to_tensor([random.randint(0, self._num_classes - 1)]) + + for feature_name, feature_shape in self.kwargs.items(): + setattr(data, feature_name, paddle.randn([feature_shape])) + + return data + + +############################################################################### + + +def get_num_nodes(avg_num_nodes: int, avg_degree: float) -> int: + min_num_nodes = max(3 * avg_num_nodes // 4, int(avg_degree)) + max_num_nodes = 5 * avg_num_nodes // 4 + return random.randint(min_num_nodes, max_num_nodes) + + +def get_num_channels(num_channels: int) -> int: + min_num_channels = 3 * num_channels // 4 + max_num_channels = 5 * num_channels // 4 + return random.randint(min_num_channels, max_num_channels) + + +def get_edge_index( + num_src_nodes: int, + num_dst_nodes: int, + avg_degree: float, + is_undirected: bool = False, + remove_loops: bool = False, +) -> Tensor: + + num_edges = int(num_src_nodes * avg_degree) + row = paddle.randint(num_src_nodes, shape=[num_edges, ], dtype=paddle.int64) + col = paddle.randint(num_dst_nodes, shape=[num_edges, ], dtype=paddle.int64) + edge_index = paddle.stack([row, col], axis=0) + + if remove_loops: + edge_index, _ = remove_self_loops(edge_index) + + num_nodes = max(num_src_nodes, num_dst_nodes) + if is_undirected: + edge_index = to_undirected(edge_index, num_nodes=num_nodes) + else: + edge_index = coalesce(edge_index, num_nodes=num_nodes) + + return edge_index diff --git a/jointContribution/mattergen/paddle_geometric/datasets/faust.py b/jointContribution/mattergen/paddle_geometric/datasets/faust.py new file mode 100644 index 00000000..11d0281b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/faust.py @@ -0,0 +1,110 @@ +import os.path as osp +from typing import Callable, List, Optional + +import paddle +from paddle_geometric.data import InMemoryDataset, extract_zip +from paddle_geometric.io import read_ply + + +class FAUST(InMemoryDataset): + r"""The FAUST humans dataset from the `"FAUST: Dataset and Evaluation for + 3D Mesh Registration" + `_ paper, + containing 100 watertight meshes representing 10 different poses for 10 + different subjects. + + .. note:: + + Data objects hold mesh faces instead of edge indices. + To convert the mesh to a graph, use the + :obj:`paddle_geometric.transforms.FaceToEdge` as :obj:`pre_transform`. + To convert the mesh to a point cloud, use the + :obj:`paddle_geometric.transforms.SamplePoints` as :obj:`transform` to + sample a fixed number of points on the mesh faces according to their + face area. + + Args: + root (str): Root directory where the dataset should be saved. + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 100 + - 6,890 + - 41,328 + - 3 + - 10 + """ + + url = 'http://faust.is.tue.mpg.de/' + + def __init__( + self, + root: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> str: + return 'MPI-FAUST.zip' + + @property + def processed_file_names(self) -> List[str]: + return ['training.pt', 'test.pt'] + + def download(self) -> None: + raise RuntimeError( + f"Dataset not found. Please download '{self.raw_file_names}' from " + f"'{self.url}' and move it to '{self.raw_dir}'") + + def process(self) -> None: + extract_zip(self.raw_paths[0], self.raw_dir, log=False) + + path = osp.join(self.raw_dir, 'MPI-FAUST', 'training', 'registrations') + path = osp.join(path, 'tr_reg_{0:03d}.ply') + data_list = [] + for i in range(100): + data = read_ply(path.format(i)) + data.y = paddle.to_tensor([i % 10], dtype='int64') + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + + self.save(data_list[:80], self.processed_paths[0]) + self.save(data_list[80:], self.processed_paths[1]) + + osp.rmdir(osp.join(self.raw_dir, 'MPI-FAUST')) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/flickr.py b/jointContribution/mattergen/paddle_geometric/datasets/flickr.py new file mode 100644 index 00000000..a24dcc05 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/flickr.py @@ -0,0 +1,110 @@ +import os.path as osp +import json +from typing import Callable, List, Optional + +import numpy as np +import paddle +from paddle_geometric.data import Data, InMemoryDataset, download_google_url + + + +class Flickr(InMemoryDataset): + r"""The Flickr dataset from the `"GraphSAINT: Graph Sampling Based + Inductive Learning Method" `_ paper, + containing descriptions and common properties of images. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 89,250 + - 899,756 + - 500 + - 7 + """ + adj_full_id = '1crmsTbd1-2sEXsGwa2IKnIB7Zd3TmUsy' + feats_id = '1join-XdvX3anJU_MLVtick7MgeAQiWIZ' + class_map_id = '1uxIkbtg5drHTsKt-PAsZZ4_yJmgFmle9' + role_id = '1htXCtuktuCW8TR8KiKfrFDAxUgekQoV7' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['adj_full.npz', 'feats.npy', 'class_map.json', 'role.json'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_google_url(self.adj_full_id, self.raw_dir, 'adj_full.npz') + download_google_url(self.feats_id, self.raw_dir, 'feats.npy') + download_google_url(self.class_map_id, self.raw_dir, 'class_map.json') + download_google_url(self.role_id, self.raw_dir, 'role.json') + + def process(self) -> None: + import scipy.sparse as sp + + f = np.load(osp.join(self.raw_dir, 'adj_full.npz')) + adj = sp.csr_matrix((f['data'], f['indices'], f['indptr']), f['shape']) + adj = adj.tocoo() + row = paddle.to_tensor(adj.row, dtype='int64') + col = paddle.to_tensor(adj.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + x = np.load(osp.join(self.raw_dir, 'feats.npy')) + x = paddle.to_tensor(x, dtype='float32') + + ys = [-1] * x.shape[0] + with open(osp.join(self.raw_dir, 'class_map.json')) as f: + class_map = json.load(f) + for key, item in class_map.items(): + ys[int(key)] = item + y = paddle.to_tensor(ys, dtype='int64') + + with open(osp.join(self.raw_dir, 'role.json')) as f: + role = json.load(f) + + train_mask = paddle.zeros([x.shape[0]], dtype='bool') + train_mask[paddle.to_tensor(role['tr'], dtype='int64')] = True + + val_mask = paddle.zeros([x.shape[0]], dtype='bool') + val_mask[paddle.to_tensor(role['va'], dtype='int64')] = True + + test_mask = paddle.zeros([x.shape[0]], dtype='bool') + test_mask[paddle.to_tensor(role['te'], dtype='int64')] = True + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + + data = data if self.pre_transform is None else self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/freebase.py b/jointContribution/mattergen/paddle_geometric/datasets/freebase.py new file mode 100644 index 00000000..aa5f8c80 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/freebase.py @@ -0,0 +1,99 @@ +from typing import Callable, Dict, List, Optional + +import paddle +from paddle_geometric.data import Data, InMemoryDataset, download_url + + + +class FB15k_237(InMemoryDataset): + r"""The FB15K237 dataset from the `"Translating Embeddings for Modeling + Multi-Relational Data" + `_ paper, + containing 14,541 entities, 237 relations and 310,116 fact triples. + + .. note:: + + The original :class:`FB15k` dataset suffers from major test leakage + through inverse relations, where a large number of test triples could + be obtained by inverting triples in the training set. + In order to create a dataset without this characteristic, the + :class:`~paddle_geometric.datasets.FB15k_237` describes a subset of + :class:`FB15k` where inverse relations are removed. + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = ('https://raw.githubusercontent.com/villmow/' + 'datasets_knowledge_embedding/master/FB15k-237') + + def __init__( + self, + root: str, + split: str = "train", + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + + if split not in {'train', 'val', 'test'}: + raise ValueError(f"Invalid 'split' argument (got {split})") + + path = self.processed_paths[['train', 'val', 'test'].index(split)] + self.load(path) + + @property + def raw_file_names(self) -> List[str]: + return ['train.txt', 'valid.txt', 'test.txt'] + + @property + def processed_file_names(self) -> List[str]: + return ['train_data.pt', 'val_data.pt', 'test_data.pt'] + + def download(self) -> None: + for filename in self.raw_file_names: + download_url(f'{self.url}/{filename}', self.raw_dir) + + def process(self) -> None: + data_list: List[Data] = [] + node_dict: Dict[str, int] = {} + rel_dict: Dict[str, int] = {} + + for path in self.raw_paths: + with open(path) as f: + lines = [x.split('\t') for x in f.read().split('\n')[:-1]] + + edge_index = paddle.zeros([2, len(lines)], dtype='int64') + edge_type = paddle.zeros([len(lines)], dtype='int64') + for i, (src, rel, dst) in enumerate(lines): + if src not in node_dict: + node_dict[src] = len(node_dict) + if dst not in node_dict: + node_dict[dst] = len(node_dict) + if rel not in rel_dict: + rel_dict[rel] = len(rel_dict) + + edge_index[0, i] = node_dict[src] + edge_index[1, i] = node_dict[dst] + edge_type[i] = rel_dict[rel] + + data = Data(edge_index=edge_index, edge_type=edge_type) + data_list.append(data) + + for data, path in zip(data_list, self.processed_paths): + data.num_nodes = len(node_dict) + self.save([data], path) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/gdelt.py b/jointContribution/mattergen/paddle_geometric/datasets/gdelt.py new file mode 100644 index 00000000..1ad3efb4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/gdelt.py @@ -0,0 +1,89 @@ +from typing import Callable, List, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import download_url +from paddle_geometric.datasets.icews import EventDataset +from paddle_geometric.io import read_txt_array + + +class GDELT(EventDataset): + r"""The Global Database of Events, Language, and Tone (GDELT) dataset used + in the, *e.g.*, `"Recurrent Event Network for Reasoning over Temporal + Knowledge Graphs" `_ paper, consisting of + events collected from 1/1/2018 to 1/31/2018 (15 minutes time granularity). + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://github.com/INK-USC/RE-Net/raw/master/data/GDELT' + splits = [0, 1734399, 1973164, 2278405] # Train/Val/Test splits. + + def __init__( + self, + root: str, + split: str = "train", + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert split in ['train', 'val', 'test'] + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + idx = self.processed_file_names.index(f'{split}.pt') + self.load(self.processed_paths[idx]) + + @property + def num_nodes(self) -> int: + return 7691 + + @property + def num_rels(self) -> int: + return 240 + + @property + def raw_file_names(self) -> List[str]: + return [f'{name}.txt' for name in ['train', 'valid', 'test']] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pt', 'val.pt', 'test.pt'] + + def download(self) -> None: + for filename in self.raw_file_names: + download_url(f'{self.url}/{filename}', self.raw_dir) + + def process_events(self) -> Tensor: + events = [] + for path in self.raw_paths: + data = read_txt_array(path, sep='\t', end=4, dtype=paddle.int64) + data[:, 3] = data[:, 3] // 15 + events += [data] + return paddle.concat(events, axis=0) + + def process(self) -> None: + s = self.splits + data_list = self._process_data_list() + self.save(data_list[s[0]:s[1]], self.processed_paths[0]) + self.save(data_list[s[1]:s[2]], self.processed_paths[1]) + self.save(data_list[s[2]:s[3]], self.processed_paths[2]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/gdelt_lite.py b/jointContribution/mattergen/paddle_geometric/datasets/gdelt_lite.py new file mode 100644 index 00000000..bf63c91f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/gdelt_lite.py @@ -0,0 +1,97 @@ +import os +from typing import Callable, List, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class GDELTLite(InMemoryDataset): + r"""The (reduced) version of the Global Database of Events, Language, and + Tone (GDELT) dataset used in the `"Do We Really Need Complicated Model + Architectures for Temporal Networks?" `_ + paper, consisting of events collected from 2016 to 2020. + + Each node (actor) holds a 413-dimensional multi-hot feature vector that + represents CAMEO codes attached to the corresponding actor to server. + + Each edge (event) holds a timestamp and a 186-dimensional multi-hot vector + representing CAMEO codes attached to the corresponding event to server. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 8,831 + - 1,912,909 + - 413 + - + """ + url = 'https://data.pyg.org/datasets/gdelt_lite.zip' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['node_features.pt', 'edges.csv', 'edge_features.pt'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + import pandas as pd + + x = fs.paddle_load(self.raw_paths[0]) + df = pd.read_csv(self.raw_paths[1]) + edge_attr = fs.paddle_load(self.raw_paths[2]) + + row = paddle.to_tensor(df['src'].values, dtype='int64') + col = paddle.to_tensor(df['dst'].values, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + time = paddle.to_tensor(df['time'].values, dtype='int64') + + data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, time=time) + data = data if self.pre_transform is None else self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ged_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/ged_dataset.py new file mode 100644 index 00000000..d8d4f447 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ged_dataset.py @@ -0,0 +1,225 @@ +import os +import os.path as osp +import glob +import pickle +from typing import Callable, List, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, InMemoryDataset, download_url, extract_zip, extract_tar +from paddle_geometric.utils import one_hot, to_undirected + + +class GEDDataset(InMemoryDataset): + r"""The GED datasets from the `"Graph Edit Distance Computation via Graph + Neural Networks" `_ paper. + + GEDs can be accessed via the global attributes :obj:`ged` and + :obj:`norm_ged` for all train/train graph pairs and all train/test graph + pairs: + + .. code-block:: python + + dataset = GEDDataset(root, name="LINUX") + data1, data2 = dataset[0], dataset[1] + ged = dataset.ged[data1.i, data2.i] # GED between `data1` and `data2`. + + Note that GEDs are not available if both graphs are from the test set. + For evaluation, it is recommended to pair up each graph from the test set + with each graph in the training set. + + .. note:: + + :obj:`ALKANE` is missing GEDs for train/test graph pairs since they are + not provided in the `official datasets + `_. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (one of :obj:`"AIDS700nef"`, + :obj:`"LINUX"`, :obj:`"ALKANE"`, :obj:`"IMDBMulti"`). + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 20 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #graphs + - #nodes + - #edges + - #features + - #classes + * - AIDS700nef + - 700 + - ~8.9 + - ~17.6 + - 29 + - 0 + * - LINUX + - 1,000 + - ~7.6 + - ~13.9 + - 0 + - 0 + * - ALKANE + - 150 + - ~8.9 + - ~15.8 + - 0 + - 0 + * - IMDBMulti + - 1,500 + - ~13.0 + - ~131.9 + - 0 + - 0 + """ + datasets = { + 'AIDS700nef': { + 'id': '10czBPJDEzEDI2tq7Z7mkBjLhj55F-a2z', + 'extract': extract_zip, + 'pickle': '1OpV4bCHjBkdpqI6H5Mg0-BqlA2ee2eBW', + }, + 'LINUX': { + 'id': '1nw0RRVgyLpit4V4XFQyDy0pI6wUEXSOI', + 'extract': extract_tar, + 'pickle': '14FDm3NSnrBvB7eNpLeGy5Bz6FjuCSF5v', + }, + 'ALKANE': { + 'id': '1-LmxaWW3KulLh00YqscVEflbqr0g4cXt', + 'extract': extract_tar, + 'pickle': '15BpvMuHx77-yUGYgM27_sQett02HQNYu', + }, + 'IMDBMulti': { + 'id': '12QxZ7EhYA7pJiF4cO-HuE8szhSOWcfST', + 'extract': extract_zip, + 'pickle': '1wy9VbZvZodkixxVIOuRllC-Lp-0zdoYZ', + }, + } + + # List of atoms contained in the AIDS700nef dataset: + types = [ + 'O', 'S', 'C', 'N', 'Cl', 'Br', 'B', 'Si', 'Hg', 'I', 'Bi', 'P', 'F', + 'Cu', 'Ho', 'Pd', 'Ru', 'Pt', 'Sn', 'Li', 'Ga', 'Tb', 'As', 'Co', 'Pb', + 'Sb', 'Se', 'Ni', 'Te' + ] + + def __init__( + self, + root: str, + name: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name + assert self.name in self.datasets.keys() + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + path = osp.join(self.processed_dir, f'{self.name}_ged.pdparams') + self.ged = paddle.load(path) + path = osp.join(self.processed_dir, f'{self.name}_norm_ged.pdparams') + self.norm_ged = paddle.load(path) + + @property + def raw_file_names(self) -> List[str]: + return [osp.join(self.name, s) for s in ['train', 'test']] + + @property + def processed_file_names(self) -> List[str]: + return [f'{self.name}_{s}.pdparams' for s in ['training', 'test']] + + def download(self) -> None: + id = self.datasets[self.name]['id'] + path = download_url(id, self.raw_dir) + extract_fn = self.datasets[self.name]['extract'] + extract_fn(path, self.raw_dir) + os.unlink(path) + + id = self.datasets[self.name]['pickle'] + path = download_url(id, self.raw_dir) + + def process(self) -> None: + import networkx as nx + + ids, Ns = [], [] + for r_path, p_path in zip(self.raw_paths, self.processed_paths): + names = glob.glob(osp.join(r_path, '*.gexf')) + ids.append(sorted([int(osp.basename(i)[:-5]) for i in names])) + + data_list = [] + for idx in ids[-1]: + G = nx.read_gexf(osp.join(r_path, f'{idx}.gexf')) + mapping = {name: i for i, name in enumerate(G.nodes())} + G = nx.relabel_nodes(G, mapping) + Ns.append(len(G.nodes())) + + edge_index = paddle.to_tensor(list(G.edges)).T + if edge_index.numel() == 0: + edge_index = paddle.empty([2, 0], dtype='int64') + edge_index = to_undirected(edge_index, num_nodes=Ns[-1]) + + data = Data(edge_index=edge_index) + data.num_nodes = Ns[-1] + + if self.name == 'AIDS700nef': + x = paddle.zeros([data.num_nodes], dtype='int64') + for node, info in G.nodes(data=True): + x[int(node)] = self.types.index(info['type']) + data.x = one_hot(x, num_classes=len(self.types)) + + if self.pre_filter and not self.pre_filter(data): + continue + + if self.pre_transform: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, p_path) + + assoc = {idx: i for i, idx in enumerate(ids[0])} + assoc.update({idx: i + len(ids[0]) for i, idx in enumerate(ids[1])}) + + path = osp.join(self.raw_dir, self.name, 'ged.pickle') + mat = paddle.full([len(assoc), len(assoc)], float('inf')) + with open(path, 'rb') as f: + obj = pickle.load(f) + for (_x, _y), g in obj.items(): + mat[assoc[_x], assoc[_y]] = g + mat[assoc[_y], assoc[_x]] = g + + path = osp.join(self.processed_dir, f'{self.name}_ged.pdparams') + paddle.save(mat, path) + + N = paddle.to_tensor(Ns, dtype='float32') + norm_mat = mat / (0.5 * (N.unsqueeze(1) + N.unsqueeze(0))) + + path = osp.join(self.processed_dir, f'{self.name}_norm_ged.pdparams') + paddle.save(norm_mat, path) + + def __repr__(self) -> str: + return f'{self.name}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/gemsec.py b/jointContribution/mattergen/paddle_geometric/datasets/gemsec.py new file mode 100644 index 00000000..77061ca8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/gemsec.py @@ -0,0 +1,80 @@ +import os.path as osp +from typing import Callable, Optional + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class GemsecDeezer(InMemoryDataset): + r"""The Deezer User Network datasets introduced in the + `"GEMSEC: Graph Embedding with Self Clustering" + `_ paper. + Nodes represent Deezer user and edges are mutual friendships. + The task is multi-label multi-class node classification about + the genres liked by the users. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"HU"`, :obj:`"HR"`, + :obj:`"RO"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://graphmining.ai/datasets/ptg/gemsec' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name + assert self.name in ['HU', 'HR', 'RO'] + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'{self.name}.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + download_url(osp.join(self.url, self.name + '.npz'), self.raw_dir) + + def process(self) -> None: + data = np.load(self.raw_paths[0], 'r', allow_pickle=True) + y = paddle.to_tensor(data['target'], dtype='int64') + edge_index = paddle.to_tensor(data['edges'], dtype='int64').T + + data = Data(y=y, edge_index=edge_index) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/geometry.py b/jointContribution/mattergen/paddle_geometric/datasets/geometry.py new file mode 100644 index 00000000..3beb4df6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/geometry.py @@ -0,0 +1,121 @@ +import glob +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import read_off + + +class GeometricShapes(InMemoryDataset): + r"""Synthetic dataset of various geometric shapes like cubes, spheres or + pyramids. + + .. note:: + + Data objects hold mesh faces instead of edge indices. + To convert the mesh to a graph, use the + :obj:`paddle_geometric.transforms.FaceToEdge` as :obj:`pre_transform`. + To convert the mesh to a point cloud, use the + :obj:`paddle_geometric.transforms.SamplePoints` as :obj:`transform` to + sample a fixed number of points on the mesh faces according to their + face area. + + Args: + root (str): Root directory where the dataset should be saved. + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 80 + - ~148.8 + - ~859.5 + - 3 + - 40 + """ + + url = 'https://github.com/Yannick-S/geometric_shapes/raw/master/raw.zip' + + def __init__( + self, + root: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> str: + return '2d_circle' + + @property + def processed_file_names(self) -> List[str]: + return ['training.pt', 'test.pt'] + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.unlink(path) + + def process(self) -> None: + self.save(self.process_set('train'), self.processed_paths[0]) + self.save(self.process_set('test'), self.processed_paths[1]) + + def process_set(self, dataset: str) -> List[Data]: + categories = glob.glob(osp.join(self.raw_dir, '*', '')) + categories = sorted([x.split(os.sep)[-2] for x in categories]) + + data_list = [] + for target, category in enumerate(categories): + folder = osp.join(self.raw_dir, category, dataset) + paths = glob.glob(f'{folder}/*.off') + for path in paths: + data = read_off(path) + assert data.pos is not None + data.pos = data.pos - paddle.mean(data.pos, axis=0, keepdim=True) + data.y = paddle.to_tensor([target]) + data_list.append(data) + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + return data_list diff --git a/jointContribution/mattergen/paddle_geometric/datasets/github.py b/jointContribution/mattergen/paddle_geometric/datasets/github.py new file mode 100644 index 00000000..a25f9351 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/github.py @@ -0,0 +1,82 @@ +from typing import Callable, Optional + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class GitHub(InMemoryDataset): + r"""The GitHub Web and ML Developers dataset introduced in the + `"Multi-scale Attributed Node Embedding" + `_ paper. + Nodes represent developers on :obj:`github:`GitHub` and edges are mutual + follower relationships. + It contains 37,300 nodes, 578,006 edges, 128 node features and 2 classes. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 37,700 + - 578,006 + - 0 + - 2 + """ + url = 'https://graphmining.ai/datasets/ptg/github.npz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'github.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + download_url(self.url, self.raw_dir) + + def process(self) -> None: + data = np.load(self.raw_paths[0], 'r', allow_pickle=True) + x = paddle.to_tensor(data['features'], dtype='float32') + y = paddle.to_tensor(data['target'], dtype='int64') + edge_index = paddle.to_tensor(data['edges'], dtype='int64') + edge_index = edge_index.transpose([1, 0]) + + data = Data(x=x, y=y, edge_index=edge_index) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/gnn_benchmark_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/gnn_benchmark_dataset.py new file mode 100644 index 00000000..7239abf5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/gnn_benchmark_dataset.py @@ -0,0 +1,218 @@ +import logging +import os +import os.path as osp +import pickle +from typing import Callable, List, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs +from paddle_geometric.utils import remove_self_loops + + +class GNNBenchmarkDataset(InMemoryDataset): + r"""A variety of artificially and semi-artificially generated graph + datasets from the `"Benchmarking Graph Neural Networks" + `_ paper. + + .. note:: + The ZINC dataset is provided via + :class:`paddle_geometric.datasets.ZINC`. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (one of :obj:`"PATTERN"`, + :obj:`"CLUSTER"`, :obj:`"MNIST"`, :obj:`"CIFAR10"`, + :obj:`"TSP"`, :obj:`"CSL"`) + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. + (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 20 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #graphs + - #nodes + - #edges + - #features + - #classes + * - PATTERN + - 14,000 + - ~118.9 + - ~6,098.9 + - 3 + - 2 + * - CLUSTER + - 12,000 + - ~117.2 + - ~4,303.9 + - 7 + - 6 + * - MNIST + - 70,000 + - ~70.6 + - ~564.5 + - 3 + - 10 + * - CIFAR10 + - 60,000 + - ~117.6 + - ~941.2 + - 5 + - 10 + * - TSP + - 12,000 + - ~275.4 + - ~6,885.0 + - 2 + - 2 + * - CSL + - 150 + - ~41.0 + - ~164.0 + - 0 + - 10 + """ + + names = ['PATTERN', 'CLUSTER', 'MNIST', 'CIFAR10', 'TSP', 'CSL'] + + root_url = 'https://data.pyg.org/datasets/benchmarking-gnns' + urls = { + 'PATTERN': f'{root_url}/PATTERN_v2.zip', + 'CLUSTER': f'{root_url}/CLUSTER_v2.zip', + 'MNIST': f'{root_url}/MNIST_v2.zip', + 'CIFAR10': f'{root_url}/CIFAR10_v2.zip', + 'TSP': f'{root_url}/TSP_v2.zip', + 'CSL': 'https://www.dropbox.com/s/rnbkp5ubgk82ocu/CSL.zip?dl=1', + } + + def __init__( + self, + root: str, + name: str, + split: str = "train", + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name + assert self.name in self.names + + if self.name == 'CSL' and split != 'train': + split = 'train' + logging.warning( + "Dataset 'CSL' does not provide a standardized splitting. " + "Instead, it is recommended to perform 5-fold cross " + "validation with stratifed sampling") + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + if split == 'train': + path = self.processed_paths[0] + elif split == 'val': + path = self.processed_paths[1] + elif split == 'test': + path = self.processed_paths[2] + else: + raise ValueError(f"Split '{split}' found, but expected either " + f"'train', 'val', or 'test'") + + self.load(path) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + if self.name == 'CSL': + return [ + 'graphs_Kary_Deterministic_Graphs.pkl', + 'y_Kary_Deterministic_Graphs.pdparams' + ] + else: + name = self.urls[self.name].split('/')[-1][:-4] + return [f'{name}.pdparams'] + + @property + def processed_file_names(self) -> List[str]: + if self.name == 'CSL': + return ['data.pdparams'] + else: + return ['train_data.pdparams', 'val_data.pdparams', 'test_data.pdparams'] + + def download(self) -> None: + path = download_url(self.urls[self.name], self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + if self.name == 'CSL': + data_list = self.process_CSL() + self.save(data_list, self.processed_paths[0]) + else: + inputs = fs.paddle_load(self.raw_paths[0]) + for i in range(len(inputs)): + data_list = [Data(**data_dict) for data_dict in inputs[i]] + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.save(data_list, self.processed_paths[i]) + + def process_CSL(self) -> List[Data]: + with open(self.raw_paths[0], 'rb') as f: + adjs = pickle.load(f) + + ys = fs.paddle_load(self.raw_paths[1]).tolist() + + data_list = [] + for adj, y in zip(adjs, ys): + row, col = paddle.to_tensor(adj.row), paddle.to_tensor(adj.col) + edge_index = paddle.stack([row, col], axis=0).astype('int64') + edge_index, _ = remove_self_loops(edge_index) + data = Data(edge_index=edge_index, y=y, num_nodes=adj.shape[0]) + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + return data_list + + def __repr__(self) -> str: + return f'{self.name}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/__init__.py b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/__init__.py new file mode 100644 index 00000000..65298bb9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/__init__.py @@ -0,0 +1,13 @@ +from .base import GraphGenerator +from .ba_graph import BAGraph +from .er_graph import ERGraph +from .grid_graph import GridGraph +from .tree_graph import TreeGraph + +__all__ = classes = [ + 'GraphGenerator', + 'BAGraph', + 'ERGraph', + 'GridGraph', + 'TreeGraph', +] diff --git a/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/ba_graph.py b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/ba_graph.py new file mode 100644 index 00000000..f4ce6152 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/ba_graph.py @@ -0,0 +1,26 @@ +from paddle_geometric.data import Data +from paddle_geometric.datasets.graph_generator import GraphGenerator +from paddle_geometric.utils import barabasi_albert_graph + + +class BAGraph(GraphGenerator): + r"""Generates random Barabasi-Albert (BA) graphs. + See :meth:`~paddle_geometric.utils.barabasi_albert_graph` for more + information. + + Args: + num_nodes (int): The number of nodes. + num_edges (int): The number of edges from a new node to existing nodes. + """ + def __init__(self, num_nodes: int, num_edges: int): + super().__init__() + self.num_nodes = num_nodes + self.num_edges = num_edges + + def __call__(self) -> Data: + edge_index = barabasi_albert_graph(self.num_nodes, self.num_edges) + return Data(num_nodes=self.num_nodes, edge_index=edge_index) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_nodes={self.num_nodes}, ' + f'num_edges={self.num_edges})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/base.py b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/base.py new file mode 100644 index 00000000..d8d292b6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/base.py @@ -0,0 +1,26 @@ +from abc import ABC, abstractmethod +from typing import Any + +from paddle_geometric.data import Data +from paddle_geometric.resolver import resolver + + +class GraphGenerator(ABC): + r"""An abstract base class for generating synthetic graphs.""" + @abstractmethod + def __call__(self) -> Data: + r"""To be implemented by :class:`GraphGenerator` subclasses.""" + raise NotImplementedError + + @staticmethod + def resolve(query: Any, *args: Any, **kwargs: Any) -> 'GraphGenerator': + import paddle_geometric.datasets.graph_generator as _graph_generators + graph_generators = [ + gen for gen in vars(_graph_generators).values() + if isinstance(gen, type) and issubclass(gen, GraphGenerator) + ] + return resolver(graph_generators, {}, query, GraphGenerator, 'Graph', + *args, **kwargs) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/er_graph.py b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/er_graph.py new file mode 100644 index 00000000..39a7970d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/er_graph.py @@ -0,0 +1,25 @@ +from paddle_geometric.data import Data +from paddle_geometric.datasets.graph_generator import GraphGenerator +from paddle_geometric.utils import erdos_renyi_graph + + +class ERGraph(GraphGenerator): + r"""Generates random Erdos-Renyi (ER) graphs. + See :meth:`~paddle_geometric.utils.erdos_renyi_graph` for more information. + + Args: + num_nodes (int): The number of nodes. + edge_prob (float): Probability of an edge. + """ + def __init__(self, num_nodes: int, edge_prob: float): + super().__init__() + self.num_nodes = num_nodes + self.edge_prob = edge_prob + + def __call__(self) -> Data: + edge_index = erdos_renyi_graph(self.num_nodes, self.edge_prob) + return Data(num_nodes=self.num_nodes, edge_index=edge_index) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_nodes={self.num_nodes}, ' + f'edge_prob={self.edge_prob})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/grid_graph.py b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/grid_graph.py new file mode 100644 index 00000000..b3762097 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/grid_graph.py @@ -0,0 +1,38 @@ +from typing import Optional + +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.datasets.graph_generator import GraphGenerator +from paddle_geometric.utils import grid + + +class GridGraph(GraphGenerator): + r"""Generates two-dimensional grid graphs. + See :meth:`~paddle_geometric.utils.grid` for more information. + + Args: + height (int): The height of the grid. + width (int): The width of the grid. + dtype (:obj:`paddle.dtype`, optional): The desired data type of the + returned position tensor. (default: :obj:`None`) + """ + def __init__( + self, + height: int, + width: int, + dtype: Optional[paddle.dtype] = None, + ): + super().__init__() + self.height = height + self.width = width + self.dtype = dtype + + def __call__(self) -> Data: + edge_index, pos = grid(height=self.height, width=self.width, + dtype=self.dtype) + return Data(edge_index=edge_index, pos=pos) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(height={self.height}, ' + f'width={self.width})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/tree_graph.py b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/tree_graph.py new file mode 100644 index 00000000..4142609a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/graph_generator/tree_graph.py @@ -0,0 +1,80 @@ +from typing import List, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.datasets.graph_generator import GraphGenerator +from paddle_geometric.utils import to_undirected + + +def tree( + depth: int, + branch: int = 2, + undirected: bool = False, + device: Optional[str] = None, +) -> Tuple[Tensor, Tensor]: + """Generates a tree graph with the given depth and branch size, along with + node-level depth indicators. + + Args: + depth (int): The depth of the tree. + branch (int, optional): The branch size of the tree. + (default: :obj:`2`) + undirected (bool, optional): If set to :obj:`True`, the tree graph will + be undirected. (default: :obj:`False`) + device (paddle.device, optional): The desired device of the returned + tensors. (default: :obj:`None`) + """ + edges: List[Tuple[int, int]] = [] + depths: List[int] = [0] + + def add_edges(node: int, current_depth: int) -> None: + node_count = len(depths) + + if current_depth < depth: + for i in range(branch): + edges.append((node, node_count + i)) + depths.append(current_depth + 1) + + for i in range(branch): + add_edges(node=node_count + i, current_depth=current_depth + 1) + + add_edges(node=0, current_depth=0) + + edge_index = paddle.to_tensor(edges, place=device).t().astype('int64') + if undirected: + edge_index = to_undirected(edge_index, num_nodes=len(depths)) + + return edge_index, paddle.to_tensor(depths, place=device).astype('int64') + + +class TreeGraph(GraphGenerator): + r"""Generates tree graphs. + + Args: + depth (int): The depth of the tree. + branch (int, optional): The branch size of the tree. + (default: :obj:`2`) + undirected (bool, optional): If set to :obj:`True`, the tree graph will + be undirected. (default: :obj:`False`) + """ + def __init__( + self, + depth: int, + branch: int = 2, + undirected: bool = False, + ) -> None: + super().__init__() + self.depth = depth + self.branch = branch + self.undirected = undirected + + def __call__(self) -> Data: + edge_index, depth = tree(self.depth, self.branch, self.undirected) + num_nodes = depth.shape[0] + return Data(edge_index=edge_index, depth=depth, num_nodes=num_nodes) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(depth={self.depth}, ' + f'branch={self.branch}, undirected={self.undirected})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/heterophilous_graph_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/heterophilous_graph_dataset.py new file mode 100644 index 00000000..9552ebb0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/heterophilous_graph_dataset.py @@ -0,0 +1,133 @@ +import os.path as osp +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import to_undirected + + +class HeterophilousGraphDataset(InMemoryDataset): + r"""The heterophilous graphs :obj:`"Roman-empire"`, + :obj:`"Amazon-ratings"`, :obj:`"Minesweeper"`, :obj:`"Tolokers"` and + :obj:`"Questions"` from the `"A Critical Look at the Evaluation of GNNs + under Heterophily: Are We Really Making Progress?" + `_ paper. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"Roman-empire"`, + :obj:`"Amazon-ratings"`, :obj:`"Minesweeper"`, :obj:`"Tolokers"`, + :obj:`"Questions"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #nodes + - #edges + - #features + - #classes + * - Roman-empire + - 22,662 + - 32,927 + - 300 + - 18 + * - Amazon-ratings + - 24,492 + - 93,050 + - 300 + - 5 + * - Minesweeper + - 10,000 + - 39,402 + - 7 + - 2 + * - Tolokers + - 11,758 + - 519,000 + - 10 + - 2 + * - Questions + - 48,921 + - 153,540 + - 301 + - 2 + """ + url = ('https://github.com/yandex-research/heterophilous-graphs/raw/' + 'main/data') + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower().replace('-', '_') + assert self.name in [ + 'roman_empire', + 'amazon_ratings', + 'minesweeper', + 'tolokers', + 'questions', + ] + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'{self.name}.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + download_url(f'{self.url}/{self.name}.npz', self.raw_dir) + + def process(self) -> None: + raw = np.load(self.raw_paths[0], 'r') + x = paddle.to_tensor(raw['node_features'], dtype='float32') + y = paddle.to_tensor(raw['node_labels'], dtype='int64') + edge_index = paddle.to_tensor(raw['edges'].T, dtype='int64') + edge_index = to_undirected(edge_index, num_nodes=x.shape[0]) + train_mask = paddle.to_tensor(raw['train_masks'].T, dtype='bool') + val_mask = paddle.to_tensor(raw['val_masks'].T, dtype='bool') + test_mask = paddle.to_tensor(raw['test_masks'].T, dtype='bool') + + data = Data(x=x, y=y, edge_index=edge_index, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(name={self.name})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/hgb_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/hgb_dataset.py new file mode 100644 index 00000000..ffbc2996 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/hgb_dataset.py @@ -0,0 +1,169 @@ +import json +import os +import os.path as osp +from collections import defaultdict +from typing import Callable, Dict, List, Optional + +import paddle + +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url, extract_zip + + +class HGBDataset(InMemoryDataset): + r"""A variety of heterogeneous graph benchmark datasets from the + `"Are We Really Making Much Progress? Revisiting, Benchmarking, and + Refining Heterogeneous Graph Neural Networks" + `_ paper. + + .. note:: + Test labels are randomly given to prevent data leakage issues. + If you want to obtain final test performance, you will need to submit + your model predictions to the + `HGB leaderboard `_. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (one of :obj:`"ACM"`, + :obj:`"DBLP"`, :obj:`"Freebase"`, :obj:`"IMDB"`) + transform (callable, optional): A function/transform that takes in an + :class:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :class:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + names = { + 'acm': 'ACM', + 'dblp': 'DBLP', + 'freebase': 'Freebase', + 'imdb': 'IMDB', + } + + file_ids = { + 'acm': '1xbJ4QE9pcDJOcALv7dYhHDCPITX2Iddz', + 'dblp': '1fLLoy559V7jJaQ_9mQEsC06VKd6Qd3SC', + 'freebase': '1vw-uqbroJZfFsWpriC1CWbtHCJMGdWJ7', + 'imdb': '18qXmmwKJBrEJxVQaYwKTL3Ny3fPqJeJ2', + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in set(self.names.keys()) + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + x = ['info.dat', 'node.dat', 'link.dat', 'label.dat', 'label.dat.test'] + return [osp.join(self.names[self.name], f) for f in x] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + id = self.file_ids[self.name] + path = download_url(f'https://drive.google.com/uc?id={id}', self.raw_dir, 'data.zip') + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + data = HeteroData() + + # node_types = {0: 'paper', 1, 'author', ...} + # edge_types = {0: ('paper', 'cite', 'paper'), ...} + if self.name in ['acm', 'dblp', 'imdb']: + with open(self.raw_paths[0]) as f: # `info.dat` + info = json.load(f) + n_types = info['node.dat']['node type'] + n_types = {int(k): v for k, v in n_types.items()} + e_types = info['link.dat']['link type'] + e_types = {int(k): tuple(v.values()) for k, v in e_types.items()} + for key, (src, dst, rel) in e_types.items(): + src, dst = n_types[int(src)], n_types[int(dst)] + rel = rel.split('-')[1] + rel = rel if rel != dst and rel[1:] != dst else 'to' + e_types[key] = (src, rel, dst) + num_classes = len(info['label.dat']['node type']['0']) + + # Extract node information: + mapping_dict = {} + x_dict = defaultdict(list) + num_nodes_dict: Dict[str, int] = defaultdict(int) + with open(self.raw_paths[1]) as f: # `node.dat` + xs = [v.split('\t') for v in f.read().split('\n')[:-1]] + for x in xs: + n_id, n_type = int(x[0]), n_types[int(x[2])] + mapping_dict[n_id] = num_nodes_dict[n_type] + num_nodes_dict[n_type] += 1 + if len(x) >= 4: + x_dict[n_type].append([float(v) for v in x[3].split(',')]) + for n_type in n_types.values(): + if len(x_dict[n_type]) == 0: + data[n_type].num_nodes = num_nodes_dict[n_type] + else: + data[n_type].x = paddle.to_tensor(x_dict[n_type], dtype='float32') + + edge_index_dict = defaultdict(list) + edge_weight_dict = defaultdict(list) + with open(self.raw_paths[2]) as f: # `link.dat` + edges = [v.split('\t') for v in f.read().split('\n')[:-1]] + for src, dst, rel, weight in edges: + e_type = e_types[int(rel)] + src, dst = mapping_dict[int(src)], mapping_dict[int(dst)] + edge_index_dict[e_type].append([src, dst]) + edge_weight_dict[e_type].append(float(weight)) + for e_type in e_types.values(): + edge_index = paddle.to_tensor(edge_index_dict[e_type], dtype='int64').T + edge_weight = paddle.to_tensor(edge_weight_dict[e_type], dtype='float32') + data[e_type].edge_index = edge_index + if not paddle.allclose(edge_weight, paddle.ones_like(edge_weight)): + data[e_type].edge_weight = edge_weight + + # Node classification: + with open(self.raw_paths[3]) as f: + train_ys = [v.split('\t') for v in f.read().split('\n')[:-1]] + with open(self.raw_paths[4]) as f: + test_ys = [v.split('\t') for v in f.read().split('\n')[:-1]] + for y in train_ys: + n_id, n_type = mapping_dict[int(y[0])], n_types[int(y[2])] + if not hasattr(data[n_type], 'y'): + num_nodes = data[n_type].num_nodes + data[n_type].y = paddle.full([num_nodes], -1, dtype='int64') + data[n_type].train_mask = paddle.zeros([num_nodes], dtype='bool') + data[n_type].test_mask = paddle.zeros([num_nodes], dtype='bool') + data[n_type].y[int(n_id)] = int(y[3]) + data[n_type].train_mask[int(n_id)] = True + for y in test_ys: + n_id, n_type = mapping_dict[int(y[0])], n_types[int(y[2])] + data[n_type].y[int(n_id)] = int(y[3]) + data[n_type].test_mask[int(n_id)] = True + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.names[self.name]}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/hm.py b/jointContribution/mattergen/paddle_geometric/datasets/hm.py new file mode 100644 index 00000000..3285fc26 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/hm.py @@ -0,0 +1,145 @@ +from typing import Callable, List, Optional + +import pandas as pd +import paddle +from paddle_geometric.data import HeteroData, InMemoryDataset + + +class HM(InMemoryDataset): + r"""The heterogeneous H&M dataset from the `Kaggle H&M Personalized Fashion + Recommendations + `_ + challenge. + The task is to develop product recommendations based on data from previous + transactions, as well as from customer and product meta data. + + Args: + root (str): Root directory where the dataset should be saved. + use_all_tables_as_node_types (bool, optional): If set to :obj:`True`, + will use the transaction table as a distinct node type. + (default: :obj:`False`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = ('https://www.kaggle.com/competitions/' + 'h-and-m-personalized-fashion-recommendations/data') + + def __init__( + self, + root: str, + use_all_tables_as_node_types: bool = False, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.use_all_tables_as_node_types = use_all_tables_as_node_types + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'customers.csv.zip', 'articles.csv.zip', + 'transactions_train.csv.zip' + ] + + @property + def processed_file_names(self) -> str: + if self.use_all_tables_as_node_types: + return 'data.pdparams' + else: + return 'data_merged.pdparams' + + def download(self) -> None: + raise RuntimeError( + f"Dataset not found. Please download {self.raw_file_names} from " + f"'{self.url}' and move it to '{self.raw_dir}'") + + def process(self) -> None: + data = HeteroData() + + # Process customer data ############################################### + df = pd.read_csv(self.raw_paths[0], index_col='customer_id') + customer_map = {idx: i for i, idx in enumerate(df.index)} + + xs = [] + for name in [ + 'Active', 'FN', 'club_member_status', 'fashion_news_frequency' + ]: + x = pd.get_dummies(df[name]).values + xs.append(paddle.to_tensor(x, dtype='float32')) + + x = paddle.to_tensor(df['age'].values, dtype='float32').reshape([-1, 1]) + x = paddle.where(paddle.isnan(x), paddle.full_like(x, x.mean()), x) + xs.append(x / x.max()) + + data['customer'].x = paddle.concat(xs, axis=-1) + + # Process article data ################################################ + df = pd.read_csv(self.raw_paths[1], index_col='article_id') + article_map = {idx: i for i, idx in enumerate(df.index)} + + xs = [] + for name in [ + 'product_type_no', 'product_type_name', 'product_group_name', + 'graphical_appearance_no', 'graphical_appearance_name', + 'colour_group_code', 'colour_group_name', + 'perceived_colour_value_id', 'perceived_colour_value_name', + 'perceived_colour_master_id', 'perceived_colour_master_name', + 'index_code', 'index_name', 'index_group_no', + 'index_group_name', 'section_no', 'section_name', + 'garment_group_no', 'garment_group_name' + ]: + x = pd.get_dummies(df[name]).values + xs.append(paddle.to_tensor(x, dtype='float32')) + + data['article'].x = paddle.concat(xs, axis=-1) + + # Process transaction data ############################################ + df = pd.read_csv(self.raw_paths[2], parse_dates=['t_dat']) + + x1 = pd.get_dummies(df['sales_channel_id']).values + x1 = paddle.to_tensor(x1, dtype='float32') + x2 = paddle.to_tensor(df['price'].values, dtype='float32').reshape([-1, 1]) + x = paddle.concat([x1, x2], axis=-1) + + time = paddle.to_tensor(df['t_dat'].values.astype('int64')) + time = time // (60 * 60 * 24 * 10**9) # Convert nanoseconds to days. + + src = paddle.to_tensor([customer_map[idx] for idx in df['customer_id']]) + dst = paddle.to_tensor([article_map[idx] for idx in df['article_id']]) + + if self.use_all_tables_as_node_types: + data['transaction'].x = x + data['transaction'].time = time + + edge_index = paddle.stack([src, paddle.arange(len(df))], axis=0) + data['customer', 'to', 'transaction'].edge_index = edge_index + data['transaction', 'rev_to', 'customer'].edge_index = edge_index[::-1] + + edge_index = paddle.stack([dst, paddle.arange(len(df))], axis=0) + data['article', 'to', 'transaction'].edge_index = edge_index + data['transaction', 'rev_to', 'article'].edge_index = edge_index[::-1] + else: + edge_index = paddle.stack([src, dst], axis=0) + data['customer', 'to', 'article'].edge_index = edge_index + data['customer', 'to', 'article'].time = time + data['customer', 'to', 'article'].edge_attr = x + + data['article', 'rev_to', 'customer'].edge_index = edge_index[::-1] + data['article', 'rev_to', 'customer'].time = time + data['article', 'rev_to', 'customer'].edge_attr = x + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/hydro_net.py b/jointContribution/mattergen/paddle_geometric/datasets/hydro_net.py new file mode 100644 index 00000000..b115e97d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/hydro_net.py @@ -0,0 +1,281 @@ +import copy +import os +import os.path as osp +from dataclasses import dataclass +from functools import cached_property +from glob import glob +from pathlib import Path +from typing import Callable, List, MutableSequence, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.data.data import BaseData + + +class HydroNet(InMemoryDataset): + r"""The HydroNet dataset from the + `"HydroNet: Benchmark Tasks for Preserving Intermolecular Interactions and + Structural Motifs in Predictive and Generative Models for Molecular Data" + `_ paper, consisting of 5 million water + clusters held together by hydrogen bonding networks. This dataset + provides atomic coordinates and total energy in kcal/mol for the cluster. + + Args: + root (str): Root directory where the dataset should be saved. + name (str, optional): Name of the subset of the full dataset to use: + :obj:`"small"` uses 500k graphs sampled from the :obj:`"medium"` + dataset, :obj:`"medium"` uses 2.7m graphs with a maximum size of 75 + nodes. + Mutually exclusive option with the clusters argument. + (default :obj:`None`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + num_workers (int): Number of multiprocessing workers to use for + pre-processing the dataset. (default :obj:`8`) + clusters (int or List[int], optional): Select a subset of clusters + from the full dataset. If set to :obj:`None`, will select all. + (default :obj:`None`) + use_processed (bool): Option to use a pre-processed version of the + original :obj:`xyz` dataset. (default: :obj:`True`) + """ + def __init__( + self, + root: str, + name: Optional[str] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + num_workers: int = 8, + clusters: Optional[Union[int, List[int]]] = None, + use_processed: bool = True, + ) -> None: + self.name = name + self.num_workers = num_workers + self.use_processed = use_processed + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + + self.select_clusters(clusters) + + @property + def raw_file_names(self) -> List[str]: + return [f'W{c}_geoms_all.zip' for c in range(3, 31)] + + @property + def processed_file_names(self) -> List[str]: + return [f'W{c}_geoms_all.npz' for c in range(3, 31)] + + def download(self) -> None: + token_file = Path(osp.join(self.raw_dir, 'use_processed')) + if self.use_processed and token_file.exists(): + return + + file = RemoteFile.hydronet_splits() + file.unpack_to(self.raw_dir) + + if self.use_processed: + file = RemoteFile.processed_dataset() + file.unpack_to(self.raw_dir) + token_file.touch() + return + + file = RemoteFile.raw_dataset() + file.unpack_to(self.raw_dir) + folder_name, _ = osp.splitext(file.name) + files = glob(osp.join(self.raw_dir, folder_name, '*.zip')) + + for f in files: + dst = osp.join(self.raw_dir, osp.basename(f)) + os.rename(f, dst) + + os.rmdir(osp.join(self.raw_dir, folder_name)) + + def process(self) -> None: + if self.use_processed: + return self._unpack_processed() + + self._partitions = [ + self._create_partitions(f) for f in self.raw_paths + ] + + def _unpack_processed(self) -> None: + files = glob(osp.join(self.raw_dir, '*.npz')) + for f in files: + dst = osp.join(self.processed_dir, osp.basename(f)) + os.rename(f, dst) + + def _create_partitions(self, file: str) -> 'Partition': + name = osp.basename(file) + name, _ = osp.splitext(name) + return Partition(self.root, name, self.transform, self.pre_transform) + + def select_clusters( + self, + clusters: Optional[Union[int, List[int]]], + ) -> None: + if self.name is not None: + clusters = self._validate_name(clusters) + + self._partitions = [self._create_partitions(f) for f in self.raw_paths] + + if clusters is None: + return + + clusters = [clusters] if isinstance(clusters, int) else clusters + + def is_valid_cluster(x: Union[int, List[int]]) -> bool: + return isinstance(x, int) and x >= 3 and x <= 30 + + if not all([is_valid_cluster(x) for x in clusters]): + raise ValueError( + "Selected clusters must be an integer in the range [3, 30]") + + self._partitions = [self._partitions[c - 3] for c in clusters] + + def _validate_name( + self, + clusters: Optional[Union[int, List[int]]], + ) -> List[int]: + if clusters is not None: + raise ValueError("'name' and 'clusters' are mutually exclusive") + + if self.name not in ['small', 'medium']: + raise ValueError(f"Invalid subset name '{self.name}'. " + f"Must be either 'small' or 'medium'") + + return list(range(3, 26)) + + @cached_property + def _dataset(self) -> List[Data]: + dataset = [] + for partition in self._partitions: + dataset.extend(partition) + + return dataset + + def len(self) -> int: + return len(self._dataset) + + def get(self, idx: int) -> Data: + return self._dataset[idx] + + +def get_num_clusters(filepath: str) -> int: + name = osp.basename(filepath) + return int(name[1:name.find('_')]) + + +@dataclass +class RemoteFile: + url: str + name: str + + def unpack_to(self, dest_folder: str) -> None: + file = download_url(self.url, dest_folder, filename=self.name) + extract_zip(file, dest_folder) + os.unlink(file) + + @staticmethod + def raw_dataset() -> 'RemoteFile': + return RemoteFile( + url='https://figshare.com/ndownloader/files/38063847', + name='W3-W30_all_geoms_TTM2.1-F.zip') + + @staticmethod + def processed_dataset() -> 'RemoteFile': + return RemoteFile( + url='https://figshare.com/ndownloader/files/38075781', + name='W3-W30_pyg_processed.zip') + + @staticmethod + def hydronet_splits() -> 'RemoteFile': + return RemoteFile( + url="https://figshare.com/ndownloader/files/38075904", + name="hydronet_splits.zip") + + +class Partition(InMemoryDataset): + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + ) -> None: + self.name = name + self.num_clusters = get_num_clusters(name) + super().__init__(root, transform, pre_transform) + + self.is_loaded = False + + @property + def raw_file_names(self) -> List[str]: + return [self.name + ".zip"] + + @property + def processed_file_names(self) -> List[str]: + return [self.name + '.npz'] + + def process(self) -> None: + num_nodes = self.num_clusters * 3 + chunk_size = num_nodes + 2 + z, pos = read_atoms(self.raw_paths[0], chunk_size) + y = read_energy(self.raw_paths[0], chunk_size) + np.savez(self.processed_paths[0], z=z, pos=pos, y=y, + num_graphs=z.shape[0]) + + def _load(self) -> None: + if self.is_loaded: + return + + with np.load(self.processed_paths[0]) as npzfile: + self.z = npzfile['z'] + self.pos = npzfile['pos'] + self.y = npzfile['y'] + numel = int(npzfile['num_graphs']) + + self._data_list: MutableSequence[Optional[BaseData]] = [None] * numel + self.is_loaded = True + + @cached_property + def num_graphs(self) -> int: + with np.load(self.processed_paths[0]) as npzfile: + return int(npzfile['num_graphs']) + + def len(self) -> int: + return self.num_graphs + + def get(self, idx: int) -> Data: + self._load() + + if self._data_list[idx] is not None: + cached_data = self._data_list[idx] + assert isinstance(cached_data, Data) + return copy.copy(cached_data) + + data = Data( + z=paddle.to_tensor(self.z[idx, :]), + pos=paddle.to_tensor(self.pos[idx, :, :]), + y=paddle.to_tensor(self.y[idx]), + ) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self._data_list[idx] = copy.copy(data) + return data diff --git a/jointContribution/mattergen/paddle_geometric/datasets/icews.py b/jointContribution/mattergen/paddle_geometric/datasets/icews.py new file mode 100644 index 00000000..5788a12c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/icews.py @@ -0,0 +1,126 @@ +from typing import Callable, List, Optional + +import paddle +from paddle import Tensor +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.io import read_txt_array + + +class EventDataset(InMemoryDataset): + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + @property + def num_nodes(self) -> int: + raise NotImplementedError + + @property + def num_rels(self) -> int: + raise NotImplementedError + + def process_events(self) -> Tensor: + raise NotImplementedError + + def _process_data_list(self) -> List[Data]: + events = self.process_events() + events = events - paddle.min(events, axis=0, keepdim=True) + + data_list = [] + for (sub, rel, obj, t) in events.numpy().tolist(): + data = Data(sub=sub, rel=rel, obj=obj, t=t) + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + + return data_list + + +class ICEWS18(EventDataset): + r"""The Integrated Crisis Early Warning System (ICEWS) dataset used in + the, *e.g.*, `"Recurrent Event Network for Reasoning over Temporal + Knowledge Graphs" `_ paper, consisting of + events collected from 1/1/2018 to 10/31/2018 (24 hours time granularity). + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://github.com/INK-USC/RE-Net/raw/master/data/ICEWS18' + splits = [0, 373018, 419013, 468558] # Train/Val/Test splits. + + def __init__( + self, + root: str, + split: str = 'train', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert split in ['train', 'val', 'test'] + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + idx = self.processed_file_names.index(f'{split}.pdparams') + self.load(self.processed_paths[idx]) + + @property + def num_nodes(self) -> int: + return 23033 + + @property + def num_rels(self) -> int: + return 256 + + @property + def raw_file_names(self) -> List[str]: + return [f'{name}.txt' for name in ['train', 'valid', 'test']] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pdparams', 'val.pdparams', 'test.pdparams'] + + def download(self) -> None: + for filename in self.raw_file_names: + download_url(f'{self.url}/{filename}', self.raw_dir) + + def process_events(self) -> Tensor: + events = [] + for path in self.raw_paths: + data = read_txt_array(path, sep='\t', end=4, dtype='int64') + data[:, 3] = data[:, 3] // 24 + events.append(data) + return paddle.concat(events, axis=0) + + def process(self) -> None: + s = self.splits + data_list = self._process_data_list() + self.save(data_list[s[0]:s[1]], self.processed_paths[0]) + self.save(data_list[s[1]:s[2]], self.processed_paths[1]) + self.save(data_list[s[2]:s[3]], self.processed_paths[2]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/igmc_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/igmc_dataset.py new file mode 100644 index 00000000..b9d33485 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/igmc_dataset.py @@ -0,0 +1,128 @@ +import os.path as osp +from typing import Callable, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url + + +class IGMCDataset(InMemoryDataset): + r"""The user-item heterogeneous rating datasets :obj:`"Douban"`, + :obj:`"Flixster"` and :obj:`"Yahoo-Music"` from the `"Inductive Matrix + Completion Based on Graph Neural Networks" + `_ paper. + + Nodes represent users and items. + Edges and features between users and items represent a (training) rating of + the item given by the user. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"Douban"`, + :obj:`"Flixster"`, :obj:`"Yahoo-Music"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = 'https://github.com/muhanzhang/IGMC/raw/master/raw_data' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower().replace('-', '_') + assert self.name in ['flixster', 'douban', 'yahoo_music'] + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return 'training_test_dataset.mat' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + path = f'{self.url}/{self.name}/training_test_dataset.mat' + download_url(path, self.raw_dir) + + @staticmethod + def load_matlab_file(path_file: str, name: str) -> Tensor: + import h5py + import numpy as np + + db = h5py.File(path_file, 'r') + out = paddle.to_tensor(np.asarray(db[name]), dtype='float32').transpose() + db.close() + + return out + + def process(self) -> None: + data = HeteroData() + + M = self.load_matlab_file(self.raw_paths[0], 'M') + + if self.name == 'flixster': + user_x = self.load_matlab_file(self.raw_paths[0], 'W_users') + item_x = self.load_matlab_file(self.raw_paths[0], 'W_movies') + elif self.name == 'douban': + user_x = self.load_matlab_file(self.raw_paths[0], 'W_users') + item_x = paddle.eye(M.shape[1]) + elif self.name == 'yahoo_music': + user_x = paddle.eye(M.shape[0]) + item_x = self.load_matlab_file(self.raw_paths[0], 'W_tracks') + + data['user'].x = user_x + data['item'].x = item_x + + train_mask = self.load_matlab_file(self.raw_paths[0], 'Otraining') + train_mask = train_mask.astype('bool') + + edge_index = paddle.nonzero(train_mask).transpose([1, 0]) + rating = M[edge_index[0], edge_index[1]] + + data['user', 'rates', 'item'].edge_index = edge_index + data['user', 'rates', 'item'].rating = rating + + data['item', 'rated_by', 'user'].edge_index = edge_index.flip([0]) + data['item', 'rated_by', 'user'].rating = rating + + test_mask = self.load_matlab_file(self.raw_paths[0], 'Otest') + test_mask = test_mask.astype('bool') + + edge_label_index = paddle.nonzero(test_mask).transpose([1, 0]) + edge_label = M[edge_label_index[0], edge_label_index[1]] + + data['user', 'rates', 'item'].edge_label_index = edge_label_index + data['user', 'rates', 'item'].edge_label = edge_label + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(name={self.name})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/imdb.py b/jointContribution/mattergen/paddle_geometric/datasets/imdb.py new file mode 100644 index 00000000..3fcd93f2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/imdb.py @@ -0,0 +1,108 @@ +import os +import os.path as osp +from itertools import product +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url, extract_zip + + +class IMDB(InMemoryDataset): + r"""A subset of the Internet Movie Database (IMDB), as collected in the + `"MAGNN: Metapath Aggregated Graph Neural Network for Heterogeneous Graph + Embedding" `_ paper. + IMDB is a heterogeneous graph containing three types of entities - movies + (4,278 nodes), actors (5,257 nodes), and directors (2,081 nodes). + The movies are divided into three classes (action, comedy, drama) according + to their genre. + Movie features correspond to elements of a bag-of-words representation of + its plot keywords. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = 'https://www.dropbox.com/s/g0btk9ctr1es39x/IMDB_processed.zip?dl=1' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'adjM.npz', 'features_0.npz', 'features_1.npz', 'features_2.npz', + 'labels.npy', 'train_val_test_idx.npz' + ] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import scipy.sparse as sp + + data = HeteroData() + + node_types = ['movie', 'director', 'actor'] + for i, node_type in enumerate(node_types): + x = sp.load_npz(osp.join(self.raw_dir, f'features_{i}.npz')) + data[node_type].x = paddle.to_tensor(x.todense(), dtype='float32') + + y = np.load(osp.join(self.raw_dir, 'labels.npy')) + data['movie'].y = paddle.to_tensor(y, dtype='int64') + + split = np.load(osp.join(self.raw_dir, 'train_val_test_idx.npz')) + for name in ['train', 'val', 'test']: + idx = split[f'{name}_idx'] + idx = paddle.to_tensor(idx, dtype='int64') + mask = paddle.zeros([data['movie'].num_nodes], dtype='bool') + mask[idx] = True + data['movie'][f'{name}_mask'] = mask + + s = {} + N_m = data['movie'].num_nodes + N_d = data['director'].num_nodes + N_a = data['actor'].num_nodes + s['movie'] = (0, N_m) + s['director'] = (N_m, N_m + N_d) + s['actor'] = (N_m + N_d, N_m + N_d + N_a) + + A = sp.load_npz(osp.join(self.raw_dir, 'adjM.npz')) + for src, dst in product(node_types, node_types): + A_sub = A[s[src][0]:s[src][1], s[dst][0]:s[dst][1]].tocoo() + if A_sub.nnz > 0: + row = paddle.to_tensor(A_sub.row, dtype='int64') + col = paddle.to_tensor(A_sub.col, dtype='int64') + data[src, dst].edge_index = paddle.stack([row, col], axis=0) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/infection_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/infection_dataset.py new file mode 100644 index 00000000..6163599f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/infection_dataset.py @@ -0,0 +1,117 @@ +from typing import Any, Callable, Dict, List, Optional, Union + +import paddle + +from paddle_geometric.data import InMemoryDataset +from paddle_geometric.datasets.graph_generator import GraphGenerator +from paddle_geometric.explain import Explanation +from paddle_geometric.utils import k_hop_subgraph + + +class InfectionDataset(InMemoryDataset): + r"""Generates a synthetic infection dataset for evaluating explainability + algorithms, as described in the `"Explainability Techniques for Graph + Convolutional Networks" `__ paper. + """ + + def __init__( + self, + graph_generator: Union[GraphGenerator, str], + num_infected_nodes: Union[int, List[int]], + max_path_length: Union[int, List[int]], + num_graphs: Optional[int] = None, + graph_generator_kwargs: Optional[Dict[str, Any]] = None, + transform: Optional[Callable] = None, + ): + super().__init__(root=None, transform=transform) + + assert isinstance(num_infected_nodes, (int, list)) + assert isinstance(max_path_length, (int, list)) + + if (num_graphs is None and isinstance(num_infected_nodes, int) + and isinstance(max_path_length, int)): + num_graphs = 1 + + if num_graphs is None and isinstance(num_infected_nodes, list): + num_graphs = len(num_infected_nodes) + + if num_graphs is None and isinstance(max_path_length, list): + num_graphs = len(max_path_length) + + assert num_graphs is not None + + self.graph_generator = GraphGenerator.resolve( + graph_generator, + **(graph_generator_kwargs or {}), + ) + self.num_infected_nodes = num_infected_nodes + self.max_path_length = max_path_length + self.num_graphs = num_graphs + + if isinstance(num_infected_nodes, int): + num_infected_nodes = [num_infected_nodes] * num_graphs + + if isinstance(max_path_length, int): + max_path_length = [max_path_length] * num_graphs + + if len(num_infected_nodes) != num_graphs: + raise ValueError(f"The length of 'num_infected_nodes' " + f"(got {len(num_infected_nodes)}) does not match " + f"the number of graphs (got {num_graphs})") + + if len(max_path_length) != num_graphs: + raise ValueError(f"The length of 'max_path_length' " + f"(got {len(max_path_length)}) does not match " + f"the number of graphs (got {num_graphs})") + + if any(n <= 0 for n in num_infected_nodes): + raise ValueError(f"'num_infected_nodes' must be positive " + f"(got {min(num_infected_nodes)})") + + if any(l <= 0 for l in max_path_length): + raise ValueError(f"'max_path_length' must be positive " + f"(got {min(max_path_length)})") + + data_list: List[Explanation] = [] + for N, L in zip(num_infected_nodes, max_path_length): + data_list.append(self.get_graph(N, L)) + + self.data, self.slices = self.collate(data_list) + + def get_graph(self, num_infected_nodes: int, + max_path_length: int) -> Explanation: + data = self.graph_generator() + + assert data.num_nodes is not None + perm = paddle.randperm(data.num_nodes) + x = paddle.zeros([data.num_nodes, 2]) + x[perm[:num_infected_nodes], 1] = 1 # Infected + x[perm[num_infected_nodes:], 0] = 1 # Healthy + + y = paddle.full([data.num_nodes], fill_value=max_path_length + 1, dtype='int64') + y[perm[:num_infected_nodes]] = 0 # Infected nodes have label `0`. + + assert data.edge_index is not None + edge_mask = paddle.zeros([data.num_edges], dtype='bool') + for num_hops in range(1, max_path_length + 1): + sub_node_index, _, _, sub_edge_mask = k_hop_subgraph( + perm[:num_infected_nodes], num_hops, data.edge_index, + num_nodes=data.num_nodes, flow='target_to_source', + directed=True) + + value = paddle.full_like(sub_node_index, fill_value=num_hops) + y[sub_node_index] = paddle.minimum(y[sub_node_index], value) + edge_mask |= sub_edge_mask + + return Explanation( + x=x, + edge_index=data.edge_index, + y=y, + edge_mask=edge_mask.astype('float32'), + ) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'graph_generator={self.graph_generator}, ' + f'num_infected_nodes={self.num_infected_nodes}, ' + f'max_path_length={self.max_path_length})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/jodie.py b/jointContribution/mattergen/paddle_geometric/datasets/jodie.py new file mode 100644 index 00000000..9541792c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/jodie.py @@ -0,0 +1,118 @@ +import os.path as osp +from typing import Callable, Optional + +import pandas as pd +import paddle + +from paddle_geometric.data import InMemoryDataset, TemporalData, download_url + + +class JODIEDataset(InMemoryDataset): + r"""The temporal graph datasets + from the `"JODIE: Predicting Dynamic Embedding + Trajectory in Temporal Interaction Networks" + `_ paper. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"Reddit"`, + :obj:`"Wikipedia"`, :obj:`"MOOC"`, and :obj:`"LastFM"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.TemporalData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.TemporalData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #nodes + - #edges + - #features + - #classes + * - Reddit + - 6,509 + - 25,470 + - 172 + - 1 + * - Wikipedia + - 9,227 + - 157,474 + - 172 + - 2 + * - MOOC + - 7,144 + - 411,749 + - 4 + - 2 + * - LastFM + - 1,980 + - 1,293,103 + - 2 + - 1 + """ + url = 'http://snap.stanford.edu/jodie/{}.csv' + names = ['reddit', 'wikipedia', 'mooc', 'lastfm'] + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in self.names + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=TemporalData) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'{self.name}.csv' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.url.format(self.name), self.raw_dir) + + def process(self) -> None: + df = pd.read_csv(self.raw_paths[0], skiprows=1, header=None) + + src = paddle.to_tensor(df.iloc[:, 0].values, dtype='int64') + dst = paddle.to_tensor(df.iloc[:, 1].values, dtype='int64') + dst += int(src.max().item()) + 1 + t = paddle.to_tensor(df.iloc[:, 2].values, dtype='int64') + y = paddle.to_tensor(df.iloc[:, 3].values, dtype='int64') + msg = paddle.to_tensor(df.iloc[:, 4:].values, dtype='float32') + + data = TemporalData(src=src, dst=dst, t=t, msg=msg, y=y) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name.capitalize()}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/karate.py b/jointContribution/mattergen/paddle_geometric/datasets/karate.py new file mode 100644 index 00000000..cd22a8d4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/karate.py @@ -0,0 +1,82 @@ +from typing import Callable, Optional + +import paddle +from paddle_geometric.data import Data, InMemoryDataset + + +class KarateClub(InMemoryDataset): + r"""Zachary's karate club network from the `"An Information Flow Model for + Conflict and Fission in Small Groups" + `_ + paper, containing 34 nodes, + connected by 156 (undirected and unweighted) edges. + Every node is labeled by one of four classes obtained via modularity-based + clustering, following the `"Semi-supervised Classification with Graph + Convolutional Networks" `_ paper. + Training is based on a single labeled example per class, *i.e.* a total + number of 4 labeled nodes. + + Args: + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 34 + - 156 + - 34 + - 4 + """ + def __init__(self, transform: Optional[Callable] = None): + super().__init__(None, transform) + + row = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, + 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 10, 10, + 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, + 18, 18, 19, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 23, 23, 23, 24, + 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, + 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33 + ] + col = [ + 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 17, 19, 21, 31, 0, 2, 3, 7, + 13, 17, 19, 21, 30, 0, 1, 3, 7, 8, 9, 13, 27, 28, 32, 0, 1, 2, 7, + 12, 13, 0, 6, 10, 0, 6, 10, 16, 0, 4, 5, 16, 0, 1, 2, 3, 0, 2, 30, + 32, 33, 2, 33, 0, 4, 5, 0, 0, 3, 0, 1, 2, 3, 33, 32, 33, 32, 33, 5, + 6, 0, 1, 32, 33, 0, 1, 33, 32, 33, 0, 1, 32, 33, 25, 27, 29, 32, + 33, 25, 27, 31, 23, 24, 31, 29, 33, 2, 23, 24, 33, 2, 31, 33, 23, + 26, 32, 33, 1, 8, 32, 33, 0, 24, 25, 28, 32, 33, 2, 8, 14, 15, 18, + 20, 22, 23, 29, 30, 31, 33, 8, 9, 13, 14, 15, 18, 19, 20, 22, 23, + 26, 27, 28, 29, 30, 31, 32 + ] + edge_index = paddle.to_tensor([row, col]) + + y = paddle.to_tensor([ # Create communities. + 1, 1, 1, 1, 3, 3, 3, 1, 0, 1, 3, 1, 1, 1, 0, 0, 3, 1, 0, 1, 0, 1, + 0, 0, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0 + ]) + + x = paddle.eye(y.shape[0], dtype='float32') + + # Select a single training node for each community + # (we just use the first one). + train_mask = paddle.zeros([y.shape[0]], dtype='bool') + for i in range(int(y.max().item()) + 1): + train_mask[(y == i).nonzero()[0]] = True + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask) + + self.data, self.slices = self.collate([data]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/last_fm.py b/jointContribution/mattergen/paddle_geometric/datasets/last_fm.py new file mode 100644 index 00000000..56a506f5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/last_fm.py @@ -0,0 +1,111 @@ +import os +import os.path as osp +from itertools import product +from typing import Callable, List, Optional + +import numpy as np +import paddle +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url, extract_zip + + +class LastFM(InMemoryDataset): + r"""A subset of the last.fm music website keeping track of users' listening + information from various sources, as collected in the + `"MAGNN: Metapath Aggregated Graph Neural Network for Heterogeneous Graph + Embedding" `_ paper. + last.fm is a heterogeneous graph containing three types of entities - users + (1,892 nodes), artists (17,632 nodes), and artist tags (1,088 nodes). + This dataset can be used for link prediction, and no labels or features are + provided. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = 'https://www.dropbox.com/s/jvlbs09pz6zwcka/LastFM_processed.zip?dl=1' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'adjM.npz', 'node_types.npy', 'train_val_test_neg_user_artist.npz', + 'train_val_test_pos_user_artist.npz' + ] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import scipy.sparse as sp + + data = HeteroData() + + node_type_idx = np.load(osp.join(self.raw_dir, 'node_types.npy')) + node_type_idx = paddle.to_tensor(node_type_idx, dtype='int64') + + node_types = ['user', 'artist', 'tag'] + for i, node_type in enumerate(node_types): + data[node_type].num_nodes = int((node_type_idx == i).sum().item()) + + pos_split = np.load( + osp.join(self.raw_dir, 'train_val_test_pos_user_artist.npz')) + neg_split = np.load( + osp.join(self.raw_dir, 'train_val_test_neg_user_artist.npz')) + + for name in ['train', 'val', 'test']: + if name != 'train': + edge_index = pos_split[f'{name}_pos_user_artist'] + edge_index = paddle.to_tensor(edge_index, dtype='int64').t() + data['user', 'artist'][f'{name}_pos_edge_index'] = edge_index + + edge_index = neg_split[f'{name}_neg_user_artist'] + edge_index = paddle.to_tensor(edge_index, dtype='int64').t() + data['user', 'artist'][f'{name}_neg_edge_index'] = edge_index + + s = {} + N_u = data['user'].num_nodes + N_a = data['artist'].num_nodes + N_t = data['tag'].num_nodes + s['user'] = (0, N_u) + s['artist'] = (N_u, N_u + N_a) + s['tag'] = (N_u + N_a, N_u + N_a + N_t) + + A = sp.load_npz(osp.join(self.raw_dir, 'adjM.npz')) + for src, dst in product(node_types, node_types): + A_sub = A[s[src][0]:s[src][1], s[dst][0]:s[dst][1]].tocoo() + if A_sub.nnz > 0: + row = paddle.to_tensor(A_sub.row, dtype='int64') + col = paddle.to_tensor(A_sub.col, dtype='int64') + data[src, dst].edge_index = paddle.stack([row, col], axis=0) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/lastfm_asia.py b/jointContribution/mattergen/paddle_geometric/datasets/lastfm_asia.py new file mode 100644 index 00000000..9039fc4f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/lastfm_asia.py @@ -0,0 +1,64 @@ +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class LastFMAsia(InMemoryDataset): + r"""The LastFM Asia Network dataset introduced in the `"Characteristic + Functions on Graphs: Birds of a Feather, from Statistical Descriptors to + Parametric Models" `_ paper. + Nodes represent LastFM users from Asia and edges are friendships. + It contains 7,624 nodes, 55,612 edges, 128 node features and 18 classes. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://graphmining.ai/datasets/ptg/lastfm_asia.npz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'lastfm_asia.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.url, self.raw_dir) + + def process(self) -> None: + data = np.load(self.raw_paths[0], 'r', allow_pickle=True) + x = paddle.to_tensor(data['features'], dtype='float32') + y = paddle.to_tensor(data['target'], dtype='int64') + edge_index = paddle.to_tensor(data['edges'], dtype='int64').transpose([1, 0]) + + data = Data(x=x, y=y, edge_index=edge_index) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/linkx_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/linkx_dataset.py new file mode 100644 index 00000000..6e4d4bf5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/linkx_dataset.py @@ -0,0 +1,184 @@ +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.io import fs +from paddle_geometric.utils import one_hot + + +class LINKXDataset(InMemoryDataset): + r"""A variety of non-homophilous graph datasets from the `"Large Scale + Learning on Non-Homophilous Graphs: New Benchmarks and Strong Simple + Methods" `_ paper. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"penn94"`, :obj:`"reed98"`, + :obj:`"amherst41"`, :obj:`"cornell5"`, :obj:`"johnshopkins55"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + github_url = ('https://github.com/CUAI/Non-Homophily-Large-Scale/' + 'raw/master/data') + gdrive_url = 'https://drive.usercontent.google.com/download?confirm=t' + + facebook_datasets = [ + 'penn94', 'reed98', 'amherst41', 'cornell5', 'johnshopkins55' + ] + + datasets = { + 'penn94': { + 'data.mat': f'{github_url}/facebook100/Penn94.mat' + }, + 'reed98': { + 'data.mat': f'{github_url}/facebook100/Reed98.mat' + }, + 'amherst41': { + 'data.mat': f'{github_url}/facebook100/Amherst41.mat', + }, + 'cornell5': { + 'data.mat': f'{github_url}/facebook100/Cornell5.mat' + }, + 'johnshopkins55': { + 'data.mat': f'{github_url}/facebook100/Johns%20Hopkins55.mat' + }, + 'genius': { + 'data.mat': f'{github_url}/genius.mat' + }, + 'wiki': { + 'wiki_views2M.pt': + f'{gdrive_url}&id=1p5DlVHrnFgYm3VsNIzahSsvCD424AyvP', + 'wiki_edges2M.pt': + f'{gdrive_url}&id=14X7FlkjrlUgmnsYtPwdh-gGuFla4yb5u', + 'wiki_features2M.pt': + f'{gdrive_url}&id=1ySNspxbK-snNoAZM7oxiWGvOnTRdSyEK' + } + } + + splits = { + 'penn94': f'{github_url}/splits/fb100-Penn94-splits.npy', + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in self.datasets.keys() + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + names = list(self.datasets[self.name].keys()) + if self.name in self.splits: + names += [self.splits[self.name].split('/')[-1]] + return names + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for filename, path in self.datasets[self.name].items(): + download_url(path, self.raw_dir, filename=filename) + if self.name in self.splits: + download_url(self.splits[self.name], self.raw_dir) + + def _process_wiki(self) -> Data: + paths = {x.split('/')[-1]: x for x in self.raw_paths} + x = fs.load(paths['wiki_features2M.pt']) + edge_index = fs.load(paths['wiki_edges2M.pt']).transpose([1, 0]) + y = fs.load(paths['wiki_views2M.pt']) + + return Data(x=x, edge_index=edge_index, y=y) + + def _process_facebook(self) -> Data: + from scipy.io import loadmat + + mat = loadmat(self.raw_paths[0]) + + A = mat['A'].tocsr().tocoo() + row = paddle.to_tensor(A.row, dtype='int64') + col = paddle.to_tensor(A.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + metadata = paddle.to_tensor(mat['local_info'].astype('int64')) + + xs = [] + y = metadata[:, 1] - 1 # gender label, -1 means unlabeled + x = paddle.concat([metadata[:, :1], metadata[:, 2:]], axis=-1) + for i in range(x.shape[1]): + _, out = paddle.unique(x[:, i], return_inverse=True) + xs.append(one_hot(out)) + x = paddle.concat(xs, axis=-1) + + data = Data(x=x, edge_index=edge_index, y=y) + + if self.name in self.splits: + splits = np.load(self.raw_paths[1], allow_pickle=True) + assert data.num_nodes is not None + sizes = (data.num_nodes, len(splits)) + data.train_mask = paddle.zeros(sizes, dtype='bool') + data.val_mask = paddle.zeros(sizes, dtype='bool') + data.test_mask = paddle.zeros(sizes, dtype='bool') + + for i, split in enumerate(splits): + data.train_mask[:, i][paddle.to_tensor(split['train'])] = True + data.val_mask[:, i][paddle.to_tensor(split['valid'])] = True + data.test_mask[:, i][paddle.to_tensor(split['test'])] = True + + return data + + def _process_genius(self) -> Data: + from scipy.io import loadmat + + mat = loadmat(self.raw_paths[0]) + edge_index = paddle.to_tensor(mat['edge_index'], dtype='int64') + x = paddle.to_tensor(mat['node_feat'], dtype='float32') + y = paddle.to_tensor(mat['label'], dtype='int64').squeeze() + + return Data(x=x, edge_index=edge_index, y=y) + + def process(self) -> None: + if self.name in self.facebook_datasets: + data = self._process_facebook() + elif self.name == 'genius': + data = self._process_genius() + elif self.name == 'wiki': + data = self._process_wiki() + else: + raise NotImplementedError( + f"Chosen dataset '{self.name}' is not implemented") + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name.capitalize()}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/lrgb.py b/jointContribution/mattergen/paddle_geometric/datasets/lrgb.py new file mode 100644 index 00000000..ecc91e93 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/lrgb.py @@ -0,0 +1,175 @@ +import os +import os.path as osp +import pickle +from typing import Callable, Dict, List, Optional + +import paddle +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class LRGBDataset(InMemoryDataset): + names = [ + 'pascalvoc-sp', 'coco-sp', 'pcqm-contact', 'peptides-func', + 'peptides-struct' + ] + + urls = { + 'pascalvoc-sp': + 'https://www.dropbox.com/s/8x722ai272wqwl4/pascalvocsp.zip?dl=1', + 'coco-sp': + 'https://www.dropbox.com/s/r6ihg1f4pmyjjy0/cocosp.zip?dl=1', + 'pcqm-contact': + 'https://www.dropbox.com/s/qdag867u6h6i60y/pcqmcontact.zip?dl=1', + 'peptides-func': + 'https://www.dropbox.com/s/ycsq37q8sxs1ou8/peptidesfunc.zip?dl=1', + 'peptides-struct': + 'https://www.dropbox.com/s/zgv4z8fcpmknhs8/peptidesstruct.zip?dl=1' + } + + dwnld_file_name = { + 'pascalvoc-sp': 'voc_superpixels_edge_wt_region_boundary', + 'coco-sp': 'coco_superpixels_edge_wt_region_boundary', + 'pcqm-contact': 'pcqmcontact', + 'peptides-func': 'peptidesfunc', + 'peptides-struct': 'peptidesstruct' + } + + def __init__( + self, + root: str, + name: str, + split: str = "train", + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in self.names + assert split in ['train', 'val', 'test'] + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = osp.join(self.processed_dir, f'{split}.pdparams') + self.load(path) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + if self.name.split('-')[1] == 'sp': + return ['train.pickle', 'val.pickle', 'test.pickle'] + else: + return ['train.pdparams', 'val.pdparams', 'test.pdparams'] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pdparams', 'val.pdparams', 'test.pdparams'] + + def download(self) -> None: + fs.rm(self.raw_dir) + path = download_url(self.urls[self.name], self.root) + extract_zip(path, self.root) + os.rename(osp.join(self.root, self.dwnld_file_name[self.name]), + self.raw_dir) + os.unlink(path) + + def process(self) -> None: + if self.name == 'pcqm-contact': + self.process_pcqm_contact() + else: + if self.name == 'coco-sp': + label_map = self.label_remap_coco() + + for split in ['train', 'val', 'test']: + if self.name.split('-')[1] == 'sp': + with open(osp.join(self.raw_dir, f'{split}.pickle'), + 'rb') as f: + graphs = pickle.load(f) + elif self.name.split('-')[0] == 'peptides': + graphs = fs.load(osp.join(self.raw_dir, f'{split}.pdparams')) + + data_list = [] + for graph in graphs: + if self.name.split('-')[1] == 'sp': + x = paddle.to_tensor(graph[0], dtype='float32') + edge_attr = paddle.to_tensor(graph[1], dtype='float32') + edge_index = paddle.to_tensor(graph[2], dtype='int64') + y = paddle.to_tensor(graph[3], dtype='int64') + elif self.name.split('-')[0] == 'peptides': + x = graph[0] + edge_attr = graph[1] + edge_index = graph[2] + y = graph[3] + + if self.name == 'coco-sp': + for i, label in enumerate(y): + y[i] = label_map[int(label.numpy())] + + data = Data(x=x, edge_index=edge_index, + edge_attr=edge_attr, y=y) + + if self.pre_filter is not None and not self.pre_filter( + data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + path = osp.join(self.processed_dir, f'{split}.pdparams') + self.save(data_list, path) + + def label_remap_coco(self) -> Dict[int, int]: + original_label_idx = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90 + ] + + label_map = {} + for i, key in enumerate(original_label_idx): + label_map[key] = i + + return label_map + + def process_pcqm_contact(self) -> None: + for split in ['train', 'val', 'test']: + graphs = fs.load(osp.join(self.raw_dir, f'{split}.pdparams')) + + data_list = [] + for graph in graphs: + x = graph[0] + edge_attr = graph[1] + edge_index = graph[2] + edge_label_index = graph[3] + edge_label = graph[4] + + data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, + edge_label_index=edge_label_index, + edge_label=edge_label) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, osp.join(self.processed_dir, f'{split}.pdparams')) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/malnet_tiny.py b/jointContribution/mattergen/paddle_geometric/datasets/malnet_tiny.py new file mode 100644 index 00000000..9065a88f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/malnet_tiny.py @@ -0,0 +1,99 @@ +import os +import os.path as osp +from typing import Callable, Dict, List, Optional + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_tar, + extract_zip, +) +from paddle_geometric.io import fs + + +class MalNetTiny(InMemoryDataset): + data_url = ('http://malnet.cc.gatech.edu/' + 'graph-data/malnet-graphs-tiny.tar.gz') + split_url = 'http://malnet.cc.gatech.edu/split-info/split_info_tiny.zip' + splits = ['train', 'val', 'test'] + + def __init__( + self, + root: str, + split: Optional[str] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + if split not in {'train', 'val', 'trainval', 'test', None}: + raise ValueError(f'Split "{split}" found, but expected either ' + f'"train", "val", "trainval", "test" or None') + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + if split is not None: + split_slices = fs.load(self.processed_paths[1]) + if split == 'train': + self._indices = range(split_slices[0], split_slices[1]) + elif split == 'val': + self._indices = range(split_slices[1], split_slices[2]) + elif split == 'trainval': + self._indices = range(split_slices[0], split_slices[2]) + elif split == 'test': + self._indices = range(split_slices[2], split_slices[3]) + + @property + def raw_file_names(self) -> List[str]: + return ['malnet-graphs-tiny', osp.join('split_info_tiny', 'type')] + + @property + def processed_file_names(self) -> List[str]: + return ['data.pdparams', 'split_slices.pdparams'] + + def download(self) -> None: + path = download_url(self.data_url, self.raw_dir) + extract_tar(path, self.raw_dir) + os.unlink(path) + + path = download_url(self.split_url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + y_map: Dict[str, int] = {} + data_list = [] + split_slices = [0] + + for split in ['train', 'val', 'test']: + with open(osp.join(self.raw_paths[1], f'{split}.txt')) as f: + filenames = f.read().split('\n')[:-1] + split_slices.append(split_slices[-1] + len(filenames)) + + for filename in filenames: + path = osp.join(self.raw_paths[0], f'{filename}.edgelist') + malware_type = filename.split('/')[0] + y = y_map.setdefault(malware_type, len(y_map)) + + with open(path) as f: + edges = f.read().split('\n')[5:-1] + + edge_indices = [[int(s) for s in e.split()] for e in edges] + edge_index = paddle.to_tensor(edge_indices, dtype='int64').transpose([1, 0]) + num_nodes = int(edge_index.max()) + 1 + data = Data(edge_index=edge_index, y=paddle.to_tensor([y], dtype='int64'), + num_nodes=num_nodes) + data_list.append(data) + + if self.pre_filter is not None: + data_list = [data for data in data_list if self.pre_filter(data)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(data) for data in data_list] + + self.save(data_list, self.processed_paths[0]) + paddle.save(split_slices, self.processed_paths[1]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/md17.py b/jointContribution/mattergen/paddle_geometric/datasets/md17.py new file mode 100644 index 00000000..f327254b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/md17.py @@ -0,0 +1,440 @@ +import os +import os.path as osp +from typing import Callable, List, Optional, Union + +import numpy as np +import paddle +import paddle.io + + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_tar, + extract_zip, +) + + +class MD17(InMemoryDataset): + r"""A variety of ab-initio molecular dynamics trajectories from the authors + of `sGDML `_. + This class provides access to the original MD17 datasets, their revised + versions, and the CCSD(T) trajectories. + + For every trajectory, the dataset contains the Cartesian positions of atoms + (in Angstrom), their atomic numbers, as well as the total energy + (in kcal/mol) and forces (kcal/mol/Angstrom) on each atom. + The latter two are the regression targets for this collection. + + .. note:: + + Data objects contain no edge indices as these are most commonly + constructed via the :obj:`paddle_geometric.transforms.RadiusGraph` + transform, with its cut-off being a hyperparameter. + + The `original MD17 dataset `_ contains + ten molecule trajectories. + This version of the dataset was found to suffer from high numerical noise. + The `revised MD17 dataset `_ contains the + same molecules, but the energies and forces were recalculated at the + PBE/def2-SVP level of theory using very tight SCF convergence and very + dense DFT integration grid. + The third version of the dataset contains fewer molecules, computed at the + CCSD(T) level of theory. + The benzene molecule at the DFT FHI-aims level of theory was + `released separately `_. + + Check the table below for detailed information on the molecule, level of + theory and number of data points contained in each dataset. + Which trajectory is loaded is determined by the :attr:`name` argument. + For the coupled cluster trajectories, the dataset comes with pre-defined + training and testing splits which are loaded separately via the + :attr:`train` argument. + + +--------------------+--------------------+-------------------------------+-----------+ + | Molecule | Level of Theory | Name | #Examples | + +====================+====================+===============================+===========+ + | Benzene | DFT | :obj:`benzene` | 627,983 | + +--------------------+--------------------+-------------------------------+-----------+ + | Uracil | DFT | :obj:`uracil` | 133,770 | + +--------------------+--------------------+-------------------------------+-----------+ + | Naphthalene | DFT | :obj:`napthalene` | 326,250 | + +--------------------+--------------------+-------------------------------+-----------+ + | Aspirin | DFT | :obj:`aspirin` | 211,762 | + +--------------------+--------------------+-------------------------------+-----------+ + | Salicylic acid | DFT | :obj:`salicylic acid` | 320,231 | + +--------------------+--------------------+-------------------------------+-----------+ + | Malonaldehyde | DFT | :obj:`malonaldehyde` | 993,237 | + +--------------------+--------------------+-------------------------------+-----------+ + | Ethanol | DFT | :obj:`ethanol` | 555,092 | + +--------------------+--------------------+-------------------------------+-----------+ + | Toluene | DFT | :obj:`toluene` | 442,790 | + +--------------------+--------------------+-------------------------------+-----------+ + | Paracetamol | DFT | :obj:`paracetamol` | 106,490 | + +--------------------+--------------------+-------------------------------+-----------+ + | Azobenzene | DFT | :obj:`azobenzene` | 99,999 | + +--------------------+--------------------+-------------------------------+-----------+ + | Benzene (R) | DFT (PBE/def2-SVP) | :obj:`revised benzene` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Uracil (R) | DFT (PBE/def2-SVP) | :obj:`revised uracil` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Naphthalene (R) | DFT (PBE/def2-SVP) | :obj:`revised napthalene` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Aspirin (R) | DFT (PBE/def2-SVP) | :obj:`revised aspirin` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Salicylic acid (R) | DFT (PBE/def2-SVP) | :obj:`revised salicylic acid` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Malonaldehyde (R) | DFT (PBE/def2-SVP) | :obj:`revised malonaldehyde` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Ethanol (R) | DFT (PBE/def2-SVP) | :obj:`revised ethanol` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Toluene (R) | DFT (PBE/def2-SVP) | :obj:`revised toluene` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Paracetamol (R) | DFT (PBE/def2-SVP) | :obj:`revised paracetamol` | 100,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Azobenzene (R) | DFT (PBE/def2-SVP) | :obj:`revised azobenzene` | 99,988 | + +--------------------+--------------------+-------------------------------+-----------+ + | Benzene | CCSD(T) | :obj:`benzene CCSD(T)` | 1,500 | + +--------------------+--------------------+-------------------------------+-----------+ + | Aspirin | CCSD | :obj:`aspirin CCSD` | 1,500 | + +--------------------+--------------------+-------------------------------+-----------+ + | Malonaldehyde | CCSD(T) | :obj:`malonaldehyde CCSD(T)` | 1,500 | + +--------------------+--------------------+-------------------------------+-----------+ + | Ethanol | CCSD(T) | :obj:`ethanol CCSD(T)` | 2,000 | + +--------------------+--------------------+-------------------------------+-----------+ + | Toluene | CCSD(T) | :obj:`toluene CCSD(T)` | 1,501 | + +--------------------+--------------------+-------------------------------+-----------+ + | Benzene | DFT FHI-aims | :obj:`benzene FHI-aims` | 49,863 | + +--------------------+--------------------+-------------------------------+-----------+ + + .. warning:: + + It is advised to not train a model on more than 1,000 samples from the + original or revised MD17 dataset. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): Keyword of the trajectory that should be loaded. + train (bool, optional): Determines whether the train or test split + gets loaded for the coupled cluster trajectories. + (default: :obj:`None`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 20 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #graphs + - #nodes + - #edges + - #features + - #tasks + * - Benzene + - 627,983 + - 12 + - 0 + - 1 + - 2 + * - Uracil + - 133,770 + - 12 + - 0 + - 1 + - 2 + * - Naphthalene + - 326,250 + - 10 + - 0 + - 1 + - 2 + * - Aspirin + - 211,762 + - 21 + - 0 + - 1 + - 2 + * - Salicylic acid + - 320,231 + - 16 + - 0 + - 1 + - 2 + * - Malonaldehyde + - 993,237 + - 9 + - 0 + - 1 + - 2 + * - Ethanol + - 555,092 + - 9 + - 0 + - 1 + - 2 + * - Toluene + - 442,790 + - 15 + - 0 + - 1 + - 2 + * - Paracetamol + - 106,490 + - 20 + - 0 + - 1 + - 2 + * - Azobenzene + - 99,999 + - 24 + - 0 + - 1 + - 2 + * - Benzene (R) + - 100,000 + - 12 + - 0 + - 1 + - 2 + * - Uracil (R) + - 100,000 + - 12 + - 0 + - 1 + - 2 + * - Naphthalene (R) + - 100,000 + - 10 + - 0 + - 1 + - 2 + * - Aspirin (R) + - 100,000 + - 21 + - 0 + - 1 + - 2 + * - Salicylic acid (R) + - 100,000 + - 16 + - 0 + - 1 + - 2 + * - Malonaldehyde (R) + - 100,000 + - 9 + - 0 + - 1 + - 2 + * - Ethanol (R) + - 100,000 + - 9 + - 0 + - 1 + - 2 + * - Toluene (R) + - 100,000 + - 15 + - 0 + - 1 + - 2 + * - Paracetamol (R) + - 100,000 + - 20 + - 0 + - 1 + - 2 + * - Azobenzene (R) + - 99,988 + - 24 + - 0 + - 1 + - 2 + * - Benzene CCSD-T + - 1,500 + - 12 + - 0 + - 1 + - 2 + * - Aspirin CCSD-T + - 1,500 + - 21 + - 0 + - 1 + - 2 + * - Malonaldehyde CCSD-T + - 1,500 + - 9 + - 0 + - 1 + - 2 + * - Ethanol CCSD-T + - 2000 + - 9 + - 0 + - 1 + - 2 + * - Toluene CCSD-T + - 1,501 + - 15 + - 0 + - 1 + - 2 + * - Benzene FHI-aims + - 49,863 + - 12 + - 0 + - 1 + - 2 + """ # noqa: E501 + gdml_url = 'http://quantum-machine.org/gdml/data/npz' + revised_url = ('https://archive.materialscloud.org/record/' + 'file?filename=rmd17.tar.bz2&record_id=466') + + file_names = { + 'benzene': 'md17_benzene2017.npz', + 'uracil': 'md17_uracil.npz', + 'naphtalene': 'md17_naphthalene.npz', + 'aspirin': 'md17_aspirin.npz', + 'salicylic acid': 'md17_salicylic.npz', + 'malonaldehyde': 'md17_malonaldehyde.npz', + 'ethanol': 'md17_ethanol.npz', + 'toluene': 'md17_toluene.npz', + 'paracetamol': 'paracetamol_dft.npz', + 'azobenzene': 'azobenzene_dft.npz', + 'revised benzene': 'rmd17_benzene.npz', + 'revised uracil': 'rmd17_uracil.npz', + 'revised naphthalene': 'rmd17_naphthalene.npz', + 'revised aspirin': 'rmd17_aspirin.npz', + 'revised salicylic acid': 'rmd17_salicylic.npz', + 'revised malonaldehyde': 'rmd17_malonaldehyde.npz', + 'revised ethanol': 'rmd17_ethanol.npz', + 'revised toluene': 'rmd17_toluene.npz', + 'revised paracetamol': 'rmd17_paracetamol.npz', + 'revised azobenzene': 'rmd17_azobenzene.npz', + 'benzene CCSD(T)': 'benzene_ccsd_t.zip', + 'aspirin CCSD': 'aspirin_ccsd.zip', + 'malonaldehyde CCSD(T)': 'malonaldehyde_ccsd_t.zip', + 'ethanol CCSD(T)': 'ethanol_ccsd_t.zip', + 'toluene CCSD(T)': 'toluene_ccsd_t.zip', + 'benzene FHI-aims': 'benzene2018_dft.npz', + } + + def __init__( + self, + root: str, + name: str, + train: Optional[bool] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + if name not in self.file_names: + raise ValueError(f"Unknown dataset name '{name}'") + + self.name = name + self.revised = 'revised' in name + self.ccsd = 'CCSD' in self.name + + super().__init__() + + if len(self.processed_file_names) == 1 and train is not None: + raise ValueError( + f"'{self.name}' dataset does not provide pre-defined splits " + f"but the 'train' argument is set to '{train}'") + elif len(self.processed_file_names) == 2 and train is None: + raise ValueError( + f"'{self.name}' dataset does provide pre-defined splits but " + f"the 'train' argument was not specified") + + idx = 0 if train is None or train else 1 + self.load(self.processed_paths[idx]) + + def mean(self) -> float: + assert isinstance(self._data, Data) + return float(self._data.energy.mean()) + + @property + def raw_dir(self) -> str: + if self.revised: + return osp.join(self.root, 'raw') + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> Union[str, List[str]]: + name = self.file_names[self.name] + if self.revised: + return osp.join('rmd17', 'npz_data', name) + elif self.ccsd: + return [name[:-4] + '-train.npz', name[:-4] + '-test.npz'] + return name + + @property + def processed_file_names(self) -> List[str]: + if self.ccsd: + return ['train.pdparams', 'test.pdparams'] + else: + return ['data.pdparams'] + + def download(self) -> None: + if self.revised: + path = download_url(self.revised_url, self.raw_dir) + extract_tar(path, self.raw_dir, mode='r:bz2') + os.unlink(path) + else: + url = f'{self.gdml_url}/{self.file_names[self.name]}' + path = download_url(url, self.raw_dir) + if self.ccsd: + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + it = zip(self.raw_paths, self.processed_paths) + for raw_path, processed_path in it: + raw_data = np.load(raw_path) + + if self.revised: + z = paddle.to_tensor(raw_data['nuclear_charges'], dtype='int64') + pos = paddle.to_tensor(raw_data['coords'], dtype='float32') + energy = paddle.to_tensor(raw_data['energies'], dtype='float32') + force = paddle.to_tensor(raw_data['forces'], dtype='float32') + else: + z = paddle.to_tensor(raw_data['z'], dtype='int64') + pos = paddle.to_tensor(raw_data['R'], dtype='float32') + energy = paddle.to_tensor(raw_data['E'], dtype='float32') + force = paddle.to_tensor(raw_data['F'], dtype='float32') + + data_list = [] + for i in range(pos.shape[0]): + data = Data(z=z, pos=pos[i], energy=energy[i], force=force[i]) + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + + self.save(data_list, processed_path) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({len(self)}, name='{self.name}')" \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/datasets/mixhop_synthetic_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/mixhop_synthetic_dataset.py new file mode 100644 index 00000000..07c0149b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/mixhop_synthetic_dataset.py @@ -0,0 +1,106 @@ +import os.path as osp +import pickle +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class MixHopSyntheticDataset(InMemoryDataset): + r"""The MixHop synthetic dataset from the `"MixHop: Higher-Order + Graph Convolutional Architectures via Sparsified Neighborhood Mixing" + `_ paper, containing 10 + graphs, each with varying degree of homophily (ranging from 0.0 to 0.9). + All graphs have 5,000 nodes, where each node corresponds to 1 out of 10 + classes. + The feature values of the nodes are sampled from a 2D Gaussian + distribution, which are distinct for each class. + + Args: + root (str): Root directory where the dataset should be saved. + homophily (float): The degree of homophily (one of :obj:`0.0`, + :obj:`0.1`, ..., :obj:`0.9`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = ('https://raw.githubusercontent.com/samihaija/mixhop/master/data' + '/synthetic') + + def __init__( + self, + root: str, + homophily: float, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.homophily = homophily + assert homophily in [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, f'{self.homophily:0.1f}'[::2], 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, f'{self.homophily:0.1f}'[::2], 'processed') + + @property + def raw_file_names(self) -> List[str]: + name = f'ind.n5000-h{self.homophily:0.1f}-c10' + return [f'{name}.allx', f'{name}.ally', f'{name}.graph'] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + for filename in self.raw_file_names: + download_url(f'{self.url}/{filename}', self.raw_dir) + + def process(self) -> None: + x = paddle.to_tensor(np.load(self.raw_paths[0]), dtype='float32') + y = paddle.to_tensor(np.load(self.raw_paths[1]), dtype='int64').argmax(axis=-1) + + with open(self.raw_paths[2], 'rb') as f: + edges = pickle.load(f, encoding='latin1') + row, col = [], [] + for k, v in edges.items(): + row += [k] * len(v) + col += v + + edge_index = paddle.to_tensor([row, col], dtype='int64') + + N_s = x.shape[0] // 3 + train_mask = paddle.zeros([x.shape[0]], dtype='bool') + train_mask[:N_s] = True + val_mask = paddle.zeros([x.shape[0]], dtype='bool') + val_mask[N_s:2 * N_s] = True + test_mask = paddle.zeros([x.shape[0]], dtype='bool') + test_mask[2 * N_s:] = True + + data = Data(x=x, y=y, edge_index=edge_index, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(homophily={self.homophily:.1f})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/mnist_superpixels.py b/jointContribution/mattergen/paddle_geometric/datasets/mnist_superpixels.py new file mode 100644 index 00000000..96daac5d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/mnist_superpixels.py @@ -0,0 +1,97 @@ +import os +from typing import Callable, List, Optional + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class MNISTSuperpixels(InMemoryDataset): + r"""MNIST superpixels dataset from the `"Geometric Deep Learning on + Graphs and Manifolds Using Mixture Model CNNs" + `_ paper, containing 70,000 graphs with + 75 nodes each. + Every graph is labeled by one of 10 classes. + + Args: + root (str): Root directory where the dataset should be saved. + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - #graphs + - #nodes + - #edges + - #features + - #classes + * - 70,000 + - 75 + - ~1,393.0 + - 1 + - 10 + """ + + url = 'https://data.pyg.org/datasets/MNISTSuperpixels.zip' + + def __init__( + self, + root: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> str: + return 'MNISTSuperpixels.pt' + + @property + def processed_file_names(self) -> List[str]: + return ['train_data.pt', 'test_data.pt'] + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + inputs = fs.torch_load(self.raw_paths[0]) + for i in range(len(inputs)): + data_list = [Data(**data_dict) for data_dict in inputs[i]] + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.save(data_list, self.processed_paths[i]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/modelnet.py b/jointContribution/mattergen/paddle_geometric/datasets/modelnet.py new file mode 100644 index 00000000..cd33b17a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/modelnet.py @@ -0,0 +1,128 @@ +import glob +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs, read_off + + +class ModelNet(InMemoryDataset): + r"""The ModelNet10/40 datasets from the `"3D ShapeNets: A Deep + Representation for Volumetric Shapes" + `_ paper, + containing CAD models of 10 and 40 categories, respectively. + + .. note:: + + Data objects hold mesh faces instead of edge indices. + To convert the mesh to a graph, use the + :obj:`paddle_geometric.transforms.FaceToEdge` as :obj:`pre_transform`. + To convert the mesh to a point cloud, use the + :obj:`paddle_geometric.transforms.SamplePoints` as :obj:`transform` to + sample a fixed number of points on the mesh faces according to their + face area. + + Args: + root (str): Root directory where the dataset should be saved. + name (str, optional): The name of the dataset (:obj:`"10"` for + ModelNet10, :obj:`"40"` for ModelNet40). (default: :obj:`"10"`) + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + urls = { + '10': + 'http://vision.princeton.edu/projects/2014/3DShapeNets/ModelNet10.zip', + '40': 'http://modelnet.cs.princeton.edu/ModelNet40.zip' + } + + def __init__( + self, + root: str, + name: str = '10', + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert name in ['10', '40'] + self.name = name + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'bathtub', 'bed', 'chair', 'desk', 'dresser', 'monitor', + 'night_stand', 'sofa', 'table', 'toilet' + ] + + @property + def processed_file_names(self) -> List[str]: + return ['training.pdparams', 'test.pdparams'] + + def download(self) -> None: + path = download_url(self.urls[self.name], self.root) + extract_zip(path, self.root) + os.unlink(path) + folder = osp.join(self.root, f'ModelNet{self.name}') + fs.rm(self.raw_dir) + os.rename(folder, self.raw_dir) + + # Delete osx metadata generated during compression of ModelNet10 + metadata_folder = osp.join(self.root, '__MACOSX') + if osp.exists(metadata_folder): + fs.rm(metadata_folder) + + def process(self) -> None: + self.save(self.process_set('train'), self.processed_paths[0]) + self.save(self.process_set('test'), self.processed_paths[1]) + + def process_set(self, dataset: str) -> List[Data]: + categories = glob.glob(osp.join(self.raw_dir, '*', '')) + categories = sorted([x.split(os.sep)[-2] for x in categories]) + + data_list = [] + for target, category in enumerate(categories): + folder = osp.join(self.raw_dir, category, dataset) + paths = glob.glob(f'{folder}/{category}_*.off') + for path in paths: + data = read_off(path) + data.y = paddle.to_tensor([target], dtype='int64') + data_list.append(data) + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + return data_list + + def __repr__(self) -> str: + return f'{self.__class__.__name__}{self.name}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/molecule_net.py b/jointContribution/mattergen/paddle_geometric/datasets/molecule_net.py new file mode 100644 index 00000000..333bf79c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/molecule_net.py @@ -0,0 +1,123 @@ +import os +import os.path as osp +import re +import warnings +from typing import Callable, Dict, Optional, Tuple, Union + +import paddle +from paddle_geometric.data import InMemoryDataset, download_url, extract_gz +from paddle_geometric.utils import from_smiles as _from_smiles + + +class MoleculeNet(InMemoryDataset): + r"""The `MoleculeNet `_ benchmark + collection from the `"MoleculeNet: A Benchmark for Molecular Machine + Learning" `_ paper. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (e.g., :obj:`"ESOL"`, :obj:`"FreeSolv"`). + transform (callable, optional): A function/transform applied to each + :obj:`paddle_geometric.data.Data` object. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform applied before + saving to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that filters + :obj:`paddle_geometric.data.Data` objects. (default: :obj:`None`) + force_reload (bool, optional): Whether to force re-processing. (default: :obj:`False`) + from_smiles (callable, optional): A custom function for converting SMILES + strings into :obj:`paddle_geometric.data.Data` objects. + Defaults to :meth:`paddle_geometric.utils.from_smiles`. (default: :obj:`None`) + """ + + url = 'https://deepchemdata.s3-us-west-1.amazonaws.com/datasets/{}' + + names: Dict[str, Tuple[str, str, str, int, Union[int, slice]]] = { + 'esol': ('ESOL', 'delaney-processed.csv', 'delaney-processed', -1, -2), + 'freesolv': ('FreeSolv', 'SAMPL.csv', 'SAMPL', 1, 2), + 'lipo': ('Lipophilicity', 'Lipophilicity.csv', 'Lipophilicity', 2, 1), + 'pcba': ('PCBA', 'pcba.csv.gz', 'pcba', -1, slice(0, 128)), + 'muv': ('MUV', 'muv.csv.gz', 'muv', -1, slice(0, 17)), + 'hiv': ('HIV', 'HIV.csv', 'HIV', 0, -1), + 'bace': ('BACE', 'bace.csv', 'bace', 0, 2), + 'bbbp': ('BBBP', 'BBBP.csv', 'BBBP', -1, -2), + 'tox21': ('Tox21', 'tox21.csv.gz', 'tox21', -1, slice(0, 12)), + 'toxcast': ('ToxCast', 'toxcast_data.csv.gz', 'toxcast_data', 0, slice(1, 618)), + 'sider': ('SIDER', 'sider.csv.gz', 'sider', 0, slice(1, 28)), + 'clintox': ('ClinTox', 'clintox.csv.gz', 'clintox', 0, slice(1, 3)), + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + from_smiles: Optional[Callable] = None, + ) -> None: + self.name = name.lower() + assert self.name in self.names.keys() + self.from_smiles = from_smiles or _from_smiles + super().__init__(root, transform, pre_transform, pre_filter, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'{self.names[self.name][2]}.csv' + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + url = self.url.format(self.names[self.name][1]) + path = download_url(url, self.raw_dir) + if self.names[self.name][1][-2:] == 'gz': + extract_gz(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + with open(self.raw_paths[0]) as f: + dataset = f.read().split('\n')[1:-1] + dataset = [x for x in dataset if len(x) > 0] + + data_list = [] + for line in dataset: + line = re.sub(r'\".*\"', '', line) + values = line.split(',') + + smiles = values[self.names[self.name][3]] + labels = values[self.names[self.name][4]] + labels = labels if isinstance(labels, list) else [labels] + + ys = [float(y) if len(y) > 0 else float('NaN') for y in labels] + y = paddle.to_tensor(ys, dtype='float32').reshape([1, -1]) + + data = self.from_smiles(smiles) + data.y = y + + if data.num_nodes == 0: + warnings.warn(f"Skipping molecule '{smiles}' since it resulted in zero atoms") + continue + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.names[self.name][0]}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/__init__.py b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/__init__.py new file mode 100644 index 00000000..ca42aaa5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/__init__.py @@ -0,0 +1,13 @@ +from .base import MotifGenerator +from .custom import CustomMotif +from .house import HouseMotif +from .cycle import CycleMotif +from .grid import GridMotif + +__all__ = classes = [ + 'MotifGenerator', + 'CustomMotif', + 'HouseMotif', + 'CycleMotif', + 'GridMotif', +] diff --git a/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/base.py b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/base.py new file mode 100644 index 00000000..ad7d0e06 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/base.py @@ -0,0 +1,25 @@ +from abc import ABC, abstractmethod +from typing import Any + +from paddle_geometric.data import Data +from paddle_geometric.resolver import resolver + + +class MotifGenerator(ABC): + r"""An abstract base class for generating a motif.""" + @abstractmethod + def __call__(self) -> Data: + r"""To be implemented by :class:`Motif` subclasses.""" + + @staticmethod + def resolve(query: Any, *args: Any, **kwargs: Any) -> 'MotifGenerator': + import paddle_geometric.datasets.motif_generator as _motif_generators + motif_generators = [ + gen for gen in vars(_motif_generators).values() + if isinstance(gen, type) and issubclass(gen, MotifGenerator) + ] + return resolver(motif_generators, {}, query, MotifGenerator, 'Motif', + *args, **kwargs) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/custom.py b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/custom.py new file mode 100644 index 00000000..67437f74 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/custom.py @@ -0,0 +1,38 @@ +from typing import Any, Optional + +from paddle_geometric.data import Data +from paddle_geometric.datasets.motif_generator import MotifGenerator +from paddle_geometric.utils import from_networkx + + +class CustomMotif(MotifGenerator): + r"""Generates a motif based on a custom structure coming from a + :class:`paddle_geometric.data.Data` or :class:`networkx.Graph` object. + + Args: + structure (paddle_geometric.data.Data or networkx.Graph): The structure + to use as a motif. + """ + def __init__(self, structure: Any): + super().__init__() + + self.structure: Optional[Data] = None + + if isinstance(structure, Data): + self.structure = structure + else: + try: + import networkx as nx + if isinstance(structure, nx.Graph): + self.structure = from_networkx(structure) + except ImportError: + pass + + if self.structure is None: + raise ValueError(f"Expected a motif structure of type " + f"'paddle_geometric.data.Data' or 'networkx.Graph'" + f"(got {type(structure)})") + + def __call__(self) -> Data: + assert isinstance(self.structure, Data) + return self.structure diff --git a/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/cycle.py b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/cycle.py new file mode 100644 index 00000000..7d245625 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/cycle.py @@ -0,0 +1,30 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.datasets.motif_generator import CustomMotif + + +class CycleMotif(CustomMotif): + r"""Generates the cycle motif from the `"GNNExplainer: + Generating Explanations for Graph Neural Networks" + `__ paper. + + Args: + num_nodes (int): The number of nodes in the cycle. + """ + def __init__(self, num_nodes: int): + self.num_nodes = num_nodes + + row = paddle.arange(num_nodes).reshape([-1, 1]).tile([1, 2]).reshape([-1]) + col1 = paddle.arange(-1, num_nodes - 1) % num_nodes + col2 = paddle.arange(1, num_nodes + 1) % num_nodes + col = paddle.stack([col1, col2], axis=1).sort(axis=-1).reshape([-1]) + + structure = Data( + num_nodes=num_nodes, + edge_index=paddle.stack([row, col], axis=0), + ) + super().__init__(structure) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.num_nodes})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/grid.py b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/grid.py new file mode 100644 index 00000000..c46da494 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/grid.py @@ -0,0 +1,44 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.datasets.motif_generator import CustomMotif + + +class GridMotif(CustomMotif): + r"""Generates the grid-structured motif from the + `"GNNExplainer: Generating Explanations for Graph Neural Networks" + `__ paper. + """ + def __init__(self) -> None: + edge_indices = [ + [0, 1], + [0, 3], + [1, 4], + [3, 4], + [1, 2], + [2, 5], + [4, 5], + [3, 6], + [6, 7], + [4, 7], + [5, 8], + [7, 8], + [1, 0], + [3, 0], + [4, 1], + [4, 3], + [2, 1], + [5, 2], + [5, 4], + [6, 3], + [7, 6], + [7, 4], + [8, 5], + [8, 7], + ] + structure = Data( + num_nodes=9, + edge_index=paddle.to_tensor(edge_indices).transpose([1, 0]), + y=paddle.to_tensor([0, 1, 0, 1, 2, 1, 0, 1, 0]), + ) + super().__init__(structure) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/house.py b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/house.py new file mode 100644 index 00000000..b72cca86 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/motif_generator/house.py @@ -0,0 +1,23 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.datasets.motif_generator import CustomMotif + + +class HouseMotif(CustomMotif): + r"""Generates the house-structured motif from the `"GNNExplainer: + Generating Explanations for Graph Neural Networks" + `__ paper, containing 5 nodes and 6 + undirected edges. Nodes are labeled according to their structural role: + the top, middle and bottom of the house. + """ + def __init__(self) -> None: + structure = Data( + num_nodes=5, + edge_index=paddle.to_tensor([ + [0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4], + [1, 3, 4, 4, 2, 0, 1, 3, 2, 0, 0, 1], + ], dtype='int64'), + y=paddle.to_tensor([0, 0, 1, 1, 2], dtype='int64'), + ) + super().__init__(structure) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/movie_lens.py b/jointContribution/mattergen/paddle_geometric/datasets/movie_lens.py new file mode 100644 index 00000000..f5c0141a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/movie_lens.py @@ -0,0 +1,105 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle +import numpy as np +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_zip, +) + + +class MovieLens(InMemoryDataset): + r"""A heterogeneous rating dataset, assembled by GroupLens Research from + the `MovieLens web site `_, consisting of nodes of + type :obj:`"movie"` and :obj:`"user"`. + User ratings for movies are available as ground truth labels for the edges + between the users and the movies :obj:`("user", "rates", "movie")`. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. (default: :obj:`None`) + model_name (str): Name of model used to transform movie titles to node + features from `Huggingface SentenceTransformer`. + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = 'https://files.grouplens.org/datasets/movielens/ml-latest-small.zip' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + model_name: Optional[str] = 'all-MiniLM-L6-v2', + force_reload: bool = False, + ) -> None: + self.model_name = model_name + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + osp.join('ml-latest-small', 'movies.csv'), + osp.join('ml-latest-small', 'ratings.csv'), + ] + + @property + def processed_file_names(self) -> str: + return f'data_{self.model_name}.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import pandas as pd + from sentence_transformers import SentenceTransformer + + data = HeteroData() + + df = pd.read_csv(self.raw_paths[0], index_col='movieId') + movie_mapping = {idx: i for i, idx in enumerate(df.index)} + + genres = paddle.to_tensor(np.array(df['genres'].str.get_dummies('|').values, dtype='float32')) + + model = SentenceTransformer(self.model_name) + with paddle.no_grad(): + emb = paddle.to_tensor( + model.encode(df['title'].values, show_progress_bar=True, convert_to_tensor=True) + ) + + data['movie'].x = paddle.concat([emb, genres], axis=-1) + + df = pd.read_csv(self.raw_paths[1]) + user_mapping = {idx: i for i, idx in enumerate(df['userId'].unique())} + data['user'].num_nodes = len(user_mapping) + + src = [user_mapping[idx] for idx in df['userId']] + dst = [movie_mapping[idx] for idx in df['movieId']] + edge_index = paddle.to_tensor([src, dst], dtype='int64') + + rating = paddle.to_tensor(df['rating'].values, dtype='int64') + time = paddle.to_tensor(df['timestamp'].values, dtype='int64') + + data['user', 'rates', 'movie'].edge_index = edge_index + data['user', 'rates', 'movie'].edge_label = rating + data['user', 'rates', 'movie'].time = time + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'MovieLens-{self.model_name}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/movie_lens_100k.py b/jointContribution/mattergen/paddle_geometric/datasets/movie_lens_100k.py new file mode 100644 index 00000000..6968b0e3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/movie_lens_100k.py @@ -0,0 +1,135 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle +import numpy as np +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + +MOVIE_HEADERS = [ + "movieId", "title", "releaseDate", "videoReleaseDate", "IMDb URL", + "unknown", "Action", "Adventure", "Animation", "Children's", "Comedy", + "Crime", "Documentary", "Drama", "Fantasy", "Film-Noir", "Horror", + "Musical", "Mystery", "Romance", "Sci-Fi", "Thriller", "War", "Western" +] +USER_HEADERS = ["userId", "age", "gender", "occupation", "zipCode"] +RATING_HEADERS = ["userId", "movieId", "rating", "timestamp"] + + +class MovieLens100K(InMemoryDataset): + url = 'https://files.grouplens.org/datasets/movielens/ml-100k.zip' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return ['u.item', 'u.user', 'u1.base', 'u1.test'] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.remove(path) + folder = osp.join(self.root, 'ml-100k') + fs.rm(self.raw_dir) + os.rename(folder, self.raw_dir) + + def process(self) -> None: + import pandas as pd + + data = HeteroData() + + # Process movie data + df = pd.read_csv( + self.raw_paths[0], + sep='|', + header=None, + names=MOVIE_HEADERS, + index_col='movieId', + encoding='ISO-8859-1', + ) + movie_mapping = {idx: i for i, idx in enumerate(df.index)} + + x = np.array(df[MOVIE_HEADERS[6:]].values, dtype='float32') + data['movie'].x = paddle.to_tensor(x) + + # Process user data + df = pd.read_csv( + self.raw_paths[1], + sep='|', + header=None, + names=USER_HEADERS, + index_col='userId', + encoding='ISO-8859-1', + ) + user_mapping = {idx: i for i, idx in enumerate(df.index)} + + age = paddle.to_tensor(df['age'].values / df['age'].values.max(), dtype='float32').reshape([-1, 1]) + gender = paddle.to_tensor(df['gender'].str.get_dummies().values, dtype='float32') + occupation = paddle.to_tensor(df['occupation'].str.get_dummies().values, dtype='float32') + + data['user'].x = paddle.concat([age, gender, occupation], axis=-1) + + # Process rating data for training + df = pd.read_csv( + self.raw_paths[2], + sep='\t', + header=None, + names=RATING_HEADERS, + ) + + src = [user_mapping[idx] for idx in df['userId']] + dst = [movie_mapping[idx] for idx in df['movieId']] + edge_index = paddle.to_tensor([src, dst], dtype='int64') + data['user', 'rates', 'movie'].edge_index = edge_index + + rating = paddle.to_tensor(df['rating'].values, dtype='int64') + data['user', 'rates', 'movie'].rating = rating + + time = paddle.to_tensor(df['timestamp'].values, dtype='int64') + data['user', 'rates', 'movie'].time = time + + data['movie', 'rated_by', 'user'].edge_index = paddle.flip(edge_index, [0]) + data['movie', 'rated_by', 'user'].rating = rating + data['movie', 'rated_by', 'user'].time = time + + # Process rating data for testing + df = pd.read_csv( + self.raw_paths[3], + sep='\t', + header=None, + names=RATING_HEADERS, + ) + + src = [user_mapping[idx] for idx in df['userId']] + dst = [movie_mapping[idx] for idx in df['movieId']] + edge_label_index = paddle.to_tensor([src, dst], dtype='int64') + data['user', 'rates', 'movie'].edge_label_index = edge_label_index + + edge_label = paddle.to_tensor(df['rating'].values, dtype='float32') + data['user', 'rates', 'movie'].edge_label = edge_label + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'MovieLens100K({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/movie_lens_1m.py b/jointContribution/mattergen/paddle_geometric/datasets/movie_lens_1m.py new file mode 100644 index 00000000..b3db0b99 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/movie_lens_1m.py @@ -0,0 +1,123 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle +import numpy as np +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + +MOVIE_HEADERS = ["movieId", "title", "genres"] +USER_HEADERS = ["userId", "gender", "age", "occupation", "zipCode"] +RATING_HEADERS = ['userId', 'movieId', 'rating', 'timestamp'] + + +class MovieLens1M(InMemoryDataset): + r"""The MovieLens 1M heterogeneous rating dataset, assembled by GroupLens + Research from the `MovieLens web site `__. + """ + + url = 'https://files.grouplens.org/datasets/movielens/ml-1m.zip' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return ['movies.dat', 'users.dat', 'ratings.dat'] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.remove(path) + folder = osp.join(self.root, 'ml-1m') + fs.rm(self.raw_dir) + os.rename(folder, self.raw_dir) + + def process(self) -> None: + import pandas as pd + + data = HeteroData() + + # Process movie data + df = pd.read_csv( + self.raw_paths[0], + sep='::', + header=None, + index_col='movieId', + names=MOVIE_HEADERS, + encoding='ISO-8859-1', + engine='python', + ) + movie_mapping = {idx: i for i, idx in enumerate(df.index)} + + genres = paddle.to_tensor(np.array(df['genres'].str.get_dummies('|').values, dtype='float32')) + data['movie'].x = genres + + # Process user data + df = pd.read_csv( + self.raw_paths[1], + sep='::', + header=None, + index_col='userId', + names=USER_HEADERS, + dtype='str', + encoding='ISO-8859-1', + engine='python', + ) + user_mapping = {idx: i for i, idx in enumerate(df.index)} + + age = paddle.to_tensor(np.array(df['age'].str.get_dummies().values, dtype='float32')) + gender = paddle.to_tensor(np.array(df['gender'].str.get_dummies().values, dtype='float32')) + occupation = paddle.to_tensor(np.array(df['occupation'].str.get_dummies().values, dtype='float32')) + data['user'].x = paddle.concat([age, gender, occupation], axis=-1) + + # Process rating data + df = pd.read_csv( + self.raw_paths[2], + sep='::', + header=None, + names=RATING_HEADERS, + encoding='ISO-8859-1', + engine='python', + ) + + src = [user_mapping[idx] for idx in df['userId']] + dst = [movie_mapping[idx] for idx in df['movieId']] + edge_index = paddle.to_tensor([src, dst], dtype='int64') + data['user', 'rates', 'movie'].edge_index = edge_index + + rating = paddle.to_tensor(np.array(df['rating'].values, dtype='int64')) + data['user', 'rates', 'movie'].rating = rating + + time = paddle.to_tensor(np.array(df['timestamp'].values, dtype='int64')) + data['user', 'rates', 'movie'].time = time + + # Reverse edge for rated_by relation + data['movie', 'rated_by', 'user'].edge_index = edge_index.flip([0]) + data['movie', 'rated_by', 'user'].rating = rating + data['movie', 'rated_by', 'user'].time = time + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'MovieLens1M({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/myket.py b/jointContribution/mattergen/paddle_geometric/datasets/myket.py new file mode 100644 index 00000000..22f7839d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/myket.py @@ -0,0 +1,97 @@ +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import InMemoryDataset, TemporalData, download_url + + +class MyketDataset(InMemoryDataset): + r"""The Myket Android Application Install dataset from the + `"Effect of Choosing Loss Function when Using T-Batching for Representation + Learning on Dynamic Networks" `_ paper. + The dataset contains a temporal graph of application install interactions + in an Android application market. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.TemporalData` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.TemporalData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 10 + :header-rows: 1 + + * - Name + - #nodes + - #edges + - #features + - #classes + * - Myket + - 17,988 + - 694,121 + - 33 + - 1 + """ + url = ('https://raw.githubusercontent.com/erfanloghmani/' + 'myket-android-application-market-dataset/main/data_int_index') + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=TemporalData) + + @property + def raw_file_names(self) -> List[str]: + return ['myket.csv', 'app_info_sample.npy'] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + for file_name in self.raw_file_names: + download_url(f'{self.url}/{file_name}', self.raw_dir) + + def process(self) -> None: + import pandas as pd + + # Read raw data + df = pd.read_csv(self.raw_paths[0], skiprows=1, header=None) + + src = paddle.to_tensor(df[0].values, dtype='int64') + dst = paddle.to_tensor(df[1].values, dtype='int64') + t = paddle.to_tensor(df[2].values, dtype='int64') + + # Load node features + x = paddle.to_tensor(np.load(self.raw_paths[1]), dtype='float32') + msg = x[dst] + + # Adjust destination node IDs + dst = dst + (int(src.max().numpy()) + 1) + + # Create TemporalData + data = TemporalData(src=src, dst=dst, t=t, msg=msg) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f"MyketDataset({len(self)})" diff --git a/jointContribution/mattergen/paddle_geometric/datasets/nell.py b/jointContribution/mattergen/paddle_geometric/datasets/nell.py new file mode 100644 index 00000000..6e279215 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/nell.py @@ -0,0 +1,85 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +from paddle_geometric.data import InMemoryDataset, download_url, extract_tar +from paddle_geometric.io import fs, read_planetoid_data + + +class NELL(InMemoryDataset): + r"""The NELL dataset, a knowledge graph from the + `"Toward an Architecture for Never-Ending Language Learning" + `_ paper. + The dataset is processed as in the + `"Revisiting Semi-Supervised Learning with Graph Embeddings" + `_ paper. + + .. note:: + + Entity nodes are described by sparse feature vectors. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 65,755 + - 251,550 + - 61,278 + - 186 + """ + + url = 'http://www.cs.cmu.edu/~zhiliny/data/nell_data.tar.gz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + names = ['x', 'tx', 'allx', 'y', 'ty', 'ally', 'graph', 'test.index'] + return [f'ind.nell.0.001.{name}' for name in names] + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_tar(path, self.root) + os.unlink(path) + fs.rm(self.raw_dir) + os.rename(osp.join(self.root, 'nell_data'), self.raw_dir) + + def process(self) -> None: + data = read_planetoid_data(self.raw_dir, 'nell.0.001') + if self.pre_transform is not None: + data = self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f"NELL({len(self)})" diff --git a/jointContribution/mattergen/paddle_geometric/datasets/neurograph.py b/jointContribution/mattergen/paddle_geometric/datasets/neurograph.py new file mode 100644 index 00000000..2ae151b5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/neurograph.py @@ -0,0 +1,91 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +from paddle_geometric.data import InMemoryDataset, Data, download_url, extract_zip +from paddle_geometric.io import fs + + +class NeuroGraphDataset(InMemoryDataset): + r"""The NeuroGraph benchmark datasets from the + `"NeuroGraph: Benchmarks for Graph Machine Learning in Brain Connectomics" + `_ paper. + :class:`NeuroGraphDataset` holds a collection of five neuroimaging graph + learning datasets that span multiple categories of demographics, mental + states, and cognitive traits. + """ + + url = 'https://vanderbilt.box.com/shared/static' + filenames = { + 'HCPGender': 'r6hlz2arm7yiy6v6981cv2nzq3b0meax.zip', + 'HCPTask': '8wzz4y17wpxg2stip7iybtmymnybwvma.zip', + 'HCPAge': 'lzzks4472czy9f9vc8aikp7pdbknmtfe.zip', + 'HCPWM': 'xtmpa6712fidi94x6kevpsddf9skuoxy.zip', + 'HCPFI': 'g2md9h9snh7jh6eeay02k1kr9m4ido9f.zip', + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert name in self.filenames.keys() + self.name = name + + super().__init__(root, transform, pre_transform, pre_filter, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def raw_file_names(self) -> str: + return 'data.pdparams' + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def processed_file_names(self) -> str: + return 'data.pdparams' + + def download(self) -> None: + url = f'{self.url}/{self.filenames[self.name]}' + path = download_url(url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + os.rename( + osp.join(self.raw_dir, self.name, 'processed', f'{self.name}.pdparams'), + osp.join(self.raw_dir, 'data.pdparams')) + fs.rm(osp.join(self.raw_dir, self.name)) + + def process(self) -> None: + data, slices = fs.paddle_load(self.raw_paths[0]) + + num_samples = slices['x'].shape[0] - 1 + data_list: List[Data] = [] + for i in range(num_samples): + x = data.x[slices['x'][i]:slices['x'][i + 1]] + start = slices['edge_index'][i] + end = slices['edge_index'][i + 1] + edge_index = data.edge_index[:, start:end] + sample = Data(x=x, edge_index=edge_index, y=data.y[i]) + + if self.pre_filter is not None and not self.pre_filter(sample): + continue + + if self.pre_transform is not None: + sample = self.pre_transform(sample) + + data_list.append(sample) + + self.save(data_list, self.processed_paths[0]) + + def __repr__(self) -> str: + return f'NeuroGraphDataset({self.name}, {len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ogb_mag.py b/jointContribution/mattergen/paddle_geometric/datasets/ogb_mag.py new file mode 100644 index 00000000..d3d9fecc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ogb_mag.py @@ -0,0 +1,148 @@ +import os +import os.path as osp +import shutil +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url, extract_zip +from paddle_geometric.io import fs + + +class OGB_MAG(InMemoryDataset): + r"""The :obj:`ogbn-mag` dataset from the `"Open Graph Benchmark: Datasets + for Machine Learning on Graphs" `_ paper. + """ + + url = 'http://snap.stanford.edu/ogb/data/nodeproppred/mag.zip' + urls = { + 'metapath2vec': ('https://data.pyg.org/datasets/' + 'mag_metapath2vec_emb.zip'), + 'transe': ('https://data.pyg.org/datasets/' + 'mag_transe_emb.zip'), + } + + def __init__( + self, + root: str, + preprocess: Optional[str] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + preprocess = None if preprocess is None else preprocess.lower() + self.preprocess = preprocess + assert self.preprocess in [None, 'metapath2vec', 'transe'] + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def num_classes(self) -> int: + assert isinstance(self._data, HeteroData) + return int(self._data['paper'].y.max().item()) + 1 + + @property + def raw_dir(self) -> str: + return osp.join(self.root, 'mag', 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, 'mag', 'processed') + + @property + def raw_file_names(self) -> List[str]: + file_names = [ + 'node-feat', 'node-label', 'relations', 'split', + 'num-node-dict.csv.gz' + ] + + if self.preprocess is not None: + file_names += [f'mag_{self.preprocess}_emb.pdparams'] + + return file_names + + @property + def processed_file_names(self) -> str: + if self.preprocess is not None: + return f'data_{self.preprocess}.pdparams' + else: + return 'data.pdparams' + + def download(self) -> None: + if not all([osp.exists(f) for f in self.raw_paths[:5]]): + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + for file_name in ['node-feat', 'node-label', 'relations']: + path = osp.join(self.raw_dir, 'mag', 'raw', file_name) + shutil.move(path, self.raw_dir) + path = osp.join(self.raw_dir, 'mag', 'split') + shutil.move(path, self.raw_dir) + path = osp.join(self.raw_dir, 'mag', 'raw', 'num-node-dict.csv.gz') + shutil.move(path, self.raw_dir) + fs.rm(osp.join(self.raw_dir, 'mag')) + os.remove(osp.join(self.raw_dir, 'mag.zip')) + if self.preprocess is not None: + path = download_url(self.urls[self.preprocess], self.raw_dir) + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import pandas as pd + + data = HeteroData() + + # Load paper features + path = osp.join(self.raw_dir, 'node-feat', 'paper', 'node-feat.csv.gz') + x_paper = pd.read_csv(path, compression='gzip', header=None, dtype=np.float32).values + data['paper'].x = paddle.to_tensor(x_paper) + + # Load paper years + path = osp.join(self.raw_dir, 'node-feat', 'paper', 'node_year.csv.gz') + year_paper = pd.read_csv(path, compression='gzip', header=None, dtype=np.int64).values + data['paper'].year = paddle.to_tensor(year_paper).reshape([-1]) + + # Load paper labels + path = osp.join(self.raw_dir, 'node-label', 'paper', 'node-label.csv.gz') + y_paper = pd.read_csv(path, compression='gzip', header=None, dtype=np.int64).values.flatten() + data['paper'].y = paddle.to_tensor(y_paper) + + # Load structural features if specified + if self.preprocess is None: + path = osp.join(self.raw_dir, 'num-node-dict.csv.gz') + num_nodes_df = pd.read_csv(path, compression='gzip') + for node_type in ['author', 'institution', 'field_of_study']: + data[node_type].num_nodes = num_nodes_df[node_type].tolist()[0] + else: + emb_dict = fs.paddle_load(self.raw_paths[-1]) + for key, value in emb_dict.items(): + if key != 'paper': + data[key].x = paddle.to_tensor(value) + + # Load edges + for edge_type in [('author', 'affiliated_with', 'institution'), + ('author', 'writes', 'paper'), + ('paper', 'cites', 'paper'), + ('paper', 'has_topic', 'field_of_study')]: + f = '___'.join(edge_type) + path = osp.join(self.raw_dir, 'relations', f, 'edge.csv.gz') + edge_index = pd.read_csv(path, compression='gzip', header=None, dtype=np.int64).values + edge_index = paddle.to_tensor(edge_index).transpose([1, 0]) + data[edge_type].edge_index = edge_index + + # Load train/val/test splits + for f, v in [('train', 'train'), ('valid', 'val'), ('test', 'test')]: + path = osp.join(self.raw_dir, 'split', 'time', 'paper', f'{f}.csv.gz') + idx = pd.read_csv(path, compression='gzip', header=None, dtype=np.int64).values.flatten() + idx = paddle.to_tensor(idx) + mask = paddle.zeros([data['paper'].num_nodes], dtype=paddle.bool) + mask[idx] = True + data['paper'][f'{v}_mask'] = mask + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return 'ogbn-mag()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/omdb.py b/jointContribution/mattergen/paddle_geometric/datasets/omdb.py new file mode 100644 index 00000000..4618cc45 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/omdb.py @@ -0,0 +1,89 @@ +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, extract_tar + + +class OMDB(InMemoryDataset): + r"""The `Organic Materials Database (OMDB) + `__ of bulk organic crystals. + + Args: + root (str): Root directory where the dataset should be saved. + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://omdb.mathub.io/dataset' + + def __init__( + self, + root: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> str: + return 'OMDB-GAP1_v1.1.tar.gz' + + @property + def processed_file_names(self) -> List[str]: + return ['train_data.pdparams', 'test_data.pdparams'] + + def download(self) -> None: + raise RuntimeError( + f"Dataset not found. Please download '{self.raw_file_names}' from " + f"'{self.url}' and move it to '{self.raw_dir}'") + + def process(self) -> None: + from ase.io import read + + extract_tar(self.raw_paths[0], self.raw_dir, log=False) + materials = read(osp.join(self.raw_dir, 'structures.xyz'), index=':') + bandgaps = np.loadtxt(osp.join(self.raw_dir, 'bandgaps.csv')) + + data_list = [] + for material, bandgap in zip(materials, bandgaps): + pos = paddle.to_tensor(material.get_positions(), dtype='float32') + z = paddle.to_tensor(material.get_atomic_numbers(), dtype='int64') + y = paddle.to_tensor([float(bandgap)], dtype='float32') + data_list.append(Data(z=z, pos=pos, y=y)) + + train_data = data_list[:10000] + test_data = data_list[10000:] + + if self.pre_filter is not None: + train_data = [d for d in train_data if self.pre_filter(d)] + test_data = [d for d in test_data if self.pre_filter(d)] + + if self.pre_transform is not None: + train_data = [self.pre_transform(d) for d in train_data] + test_data = [self.pre_transform(d) for d in test_data] + + self.save(train_data, self.processed_paths[0]) + self.save(test_data, self.processed_paths[1]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/opf.py b/jointContribution/mattergen/paddle_geometric/datasets/opf.py new file mode 100644 index 00000000..5282fbc0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/opf.py @@ -0,0 +1,186 @@ +import json +import os +import os.path as osp +from typing import Callable, Dict, List, Literal, Optional + +import paddle +import tqdm +from paddle import Tensor +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_tar, +) + + + +class OPFDataset(InMemoryDataset): + r"""The heterogeneous OPF data for PaddlePaddle. + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): Dataset split ('train', 'val', 'test'). + case_name (str, optional): The name of the original pglib-opf case. + num_groups (int, optional): Number of dataset groups. + topological_perturbations (bool, optional): Use perturbed data. + transform (callable, optional): Transformation function. + pre_transform (callable, optional): Pre-processing transformation. + pre_filter (callable, optional): Pre-filter function. + force_reload (bool, optional): Whether to force re-process. + """ + url = 'https://storage.googleapis.com/gridopt-dataset' + + def __init__( + self, + root: str, + split: Literal['train', 'val', 'test'] = 'train', + case_name: Literal[ + 'pglib_opf_case14_ieee', + 'pglib_opf_case30_ieee', + 'pglib_opf_case57_ieee', + 'pglib_opf_case118_ieee', + 'pglib_opf_case500_goc', + 'pglib_opf_case2000_goc', + 'pglib_opf_case6470_rte', + 'pglib_opf_case4661_sdet', + 'pglib_opf_case10000_goc', + 'pglib_opf_case13659_pegase', + ] = 'pglib_opf_case14_ieee', + num_groups: int = 20, + topological_perturbations: bool = False, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + + self.split = split + self.case_name = case_name + self.num_groups = num_groups + self.topological_perturbations = topological_perturbations + + self._release = 'dataset_release_1' + if topological_perturbations: + self._release += '_nminusone' + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + idx = self.processed_file_names.index(f'{split}.pkl') + self.load(self.processed_paths[idx]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self._release, self.case_name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self._release, self.case_name, + f'processed_{self.num_groups}') + + @property + def raw_file_names(self) -> List[str]: + return [f'{self.case_name}_{i}.tar.gz' for i in range(self.num_groups)] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pkl', 'val.pkl', 'test.pkl'] + + def download(self) -> None: + for name in self.raw_file_names: + url = f'{self.url}/{self._release}/{name}' + path = download_url(url, self.raw_dir) + extract_tar(path, self.raw_dir) + + def process(self) -> None: + train_data_list = [] + val_data_list = [] + test_data_list = [] + + for group in tqdm.tqdm(range(self.num_groups)): + tmp_dir = osp.join( + self.raw_dir, + 'gridopt-dataset-tmp', + self._release, + self.case_name, + f'group_{group}', + ) + + for name in os.listdir(tmp_dir): + with open(osp.join(tmp_dir, name)) as f: + obj = json.load(f) + + grid = obj['grid'] + solution = obj['solution'] + metadata = obj['metadata'] + + # Create graph data: + data = HeteroData() + data['global'] = paddle.to_tensor(grid['context'], dtype='float32') + data['global_objective'] = paddle.to_tensor(metadata['objective'], dtype='float32') + + # Nodes: + data['bus'] = paddle.to_tensor(grid['nodes']['bus'], dtype='float32') + data['bus_label'] = paddle.to_tensor(solution['nodes']['bus'], dtype='float32') + + data['generator'] = paddle.to_tensor(grid['nodes']['generator'], dtype='float32') + data['generator_label'] = paddle.to_tensor(solution['nodes']['generator'], dtype='float32') + + data['load'] = paddle.to_tensor(grid['nodes']['load'], dtype='float32') + data['shunt'] = paddle.to_tensor(grid['nodes']['shunt'], dtype='float32') + + # Edges: + data['ac_line'] = self.extract_edge_features(grid, solution, 'ac_line') + data['transformer'] = self.extract_edge_features(grid, solution, 'transformer') + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + i = int(name.split('.')[0].split('_')[1]) + train_limit = int(15_000 * self.num_groups * 0.9) + val_limit = train_limit + int(15_000 * self.num_groups * 0.05) + if i < train_limit: + train_data_list.append(data) + elif i < val_limit: + val_data_list.append(data) + else: + test_data_list.append(data) + + self.save(train_data_list, self.processed_paths[0]) + self.save(val_data_list, self.processed_paths[1]) + self.save(test_data_list, self.processed_paths[2]) + + def extract_edge_features(self, grid: Dict, solution: Dict, edge_name: str) -> Dict: + edge_data = { + 'index': paddle.to_tensor([ + grid['edges'][edge_name]['senders'], + grid['edges'][edge_name]['receivers'], + ], dtype='int64'), + 'features': paddle.to_tensor(grid['edges'][edge_name]['features'], dtype='float32'), + 'labels': paddle.to_tensor(solution['edges'][edge_name]['features'], dtype='float32'), + } + return edge_data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'split={self.split}, ' + f'case_name={self.case_name}, ' + f'topological_perturbations={self.topological_perturbations})') + + +def extract_edge_index(obj: Dict, edge_name: str) -> Tensor: + return paddle.to_tensor([ + obj['grid']['edges'][edge_name]['senders'], + obj['grid']['edges'][edge_name]['receivers'], + ], dtype='int64') + + +def extract_edge_index_rev(obj: Dict, edge_name: str) -> Tensor: + return paddle.to_tensor([ + obj['grid']['edges'][edge_name]['receivers'], + obj['grid']['edges'][edge_name]['senders'], + ], dtype='int64') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ose_gvcs.py b/jointContribution/mattergen/paddle_geometric/datasets/ose_gvcs.py new file mode 100644 index 00000000..54f7a43e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ose_gvcs.py @@ -0,0 +1,123 @@ +import json +import os +from collections import defaultdict +from typing import Callable, List, Optional + +import paddle +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_tar, +) + + +class OSE_GVCS(InMemoryDataset): + r"""A dataset describing the `Product ecology + `_ of the Open + Source Ecology's iconoclastic `Global Village Construction Set + `_. + GVCS is a modular, DIY, low-cost set of blueprints that enables the + fabrication of the 50 different industrial machines that it takes to + build a small, sustainable civilization with modern comforts. + + The dataset contains a heterogenous graphs with 50 :obj:`machine` nodes, + composing the GVCS, and 290 directed edges, each representing one out of + three relationships between machines. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + machines = [ + '3D Printer', '3D Scanner', 'Aluminum Extractor', 'Backhoe', + 'Bakery Oven', 'Baler', 'Bioplastic Extruder', 'Bulldozer', 'Car', + 'CEB Press', 'Cement Mixer', 'Chipper Hammermill', 'CNC Circuit Mill', + 'CNC Torch Table', 'Dairy Milker', 'Drill Press', + 'Electric Motor Generator', 'Gasifier Burner', 'Hay Cutter', + 'Hay Rake', 'Hydraulic Motor', 'Induction Furnace', 'Industrial Robot', + 'Ironworker', 'Laser Cutter', 'Metal Roller', 'Microcombine', + 'Microtractor', 'Multimachine', 'Nickel-Iron Battery', 'Pelletizer', + 'Plasma Cutter', 'Power Cube', 'Press Forge', 'Rod and Wire Mill', + 'Rototiller', 'Sawmill', 'Seeder', 'Solar Concentrator', 'Spader', + 'Steam Engine', 'Steam Generator', 'Tractor', 'Trencher', 'Truck', + 'Universal Power Supply', 'Universal Rotor', 'Welder', + 'Well-Drilling Rig', 'Wind Turbine' + ] + categories = [ + 'habitat', 'agriculture', 'industry', 'energy', 'materials', + 'transportation' + ] + relationships = ['from', 'uses', 'enables'] + + url = 'https://github.com/Wesxdz/ose_gvcs/raw/master/ose_gvcs.tar.gz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + f"{machine.lower().replace(' ', '_')}.json" + for machine in self.machines + ] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_tar(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + data = HeteroData() + + categories = [] + edges = defaultdict(list) + + for path in self.raw_paths: + with open(path) as f: + product = json.load(f) + categories.append(self.categories.index(product['category'])) + for interaction in product['ecology']: + rt = interaction['relationship'] + if rt not in self.relationships: + continue + dst = interaction['tool'] + if dst not in self.machines: + continue + src = self.machines.index(product['machine']) + dst = self.machines.index(dst) + edges[rt].append((src, dst)) + + data['machine'].num_nodes = len(categories) + data['machine'].category = paddle.to_tensor(categories) + + for rel, edge_indices in edges.items(): + edge_index = paddle.to_tensor(edge_indices).transpose([1, 0]) + data['machine', rel, 'machine'].edge_index = edge_index + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/particle.py b/jointContribution/mattergen/paddle_geometric/datasets/particle.py new file mode 100644 index 00000000..2299eb55 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/particle.py @@ -0,0 +1,106 @@ +import glob +import os.path as osp +from typing import Any, Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, Dataset +from paddle_geometric.utils import index_sort, scatter + + +class TrackingData(Data): + def __inc__(self, key: str, value: Any, *args: Any, **kwargs: Any) -> Any: + if key == 'y_index': + return paddle.to_tensor([value[0].max().item() + 1, self.num_nodes]) + else: + return super().__inc__(key, value, *args, **kwargs) + + +class TrackMLParticleTrackingDataset(Dataset): + r"""The `TrackML Particle Tracking Challenge + `_ dataset to + reconstruct particle tracks from 3D points left in the silicon detectors. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + """ + + url = 'https://www.kaggle.com/c/trackml-particle-identification' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + ) -> None: + super().__init__(root, transform) + events = glob.glob(osp.join(self.raw_dir, 'event*-hits.csv')) + events = [e.split(osp.sep)[-1].split('-')[0][5:] for e in events] + self.events: List[str] = sorted(events) + + @property + def raw_file_names(self) -> List[str]: + event_indices = ['000001000'] + file_names = [] + file_names += [f'event{idx}-cells.csv' for idx in event_indices] + file_names += [f'event{idx}-hits.csv' for idx in event_indices] + file_names += [f'event{idx}-particles.csv' for idx in event_indices] + file_names += [f'event{idx}-truth.csv' for idx in event_indices] + return file_names + + def download(self) -> None: + raise RuntimeError( + f'Dataset not found. Please download it from {self.url} and move ' + f'all *.csv files to {self.raw_dir}') + + def len(self) -> int: + return len(glob.glob(osp.join(self.raw_dir, 'event*-hits.csv'))) + + def get(self, i: int) -> TrackingData: + import pandas as pd + + idx = self.events[i] + + # Get hit positions. + hits_path = osp.join(self.raw_dir, f'event{idx}-hits.csv') + pos = pd.read_csv(hits_path, usecols=['x', 'y', 'z'], dtype=np.float32) + pos = paddle.to_tensor(pos.values) / 1000. + + # Get hit features. + cells_path = osp.join(self.raw_dir, f'event{idx}-cells.csv') + cell = pd.read_csv(cells_path, usecols=['hit_id', 'value']) + hit_id = paddle.to_tensor(cell['hit_id'].values).astype('int64') - 1 + value = paddle.to_tensor(cell['value'].values).astype('float32') + ones = paddle.ones([hit_id.size], dtype='float32') + num_cells = scatter(ones, hit_id, 0, pos.shape[0], reduce='sum') / 10. + value = scatter(value, hit_id, 0, pos.shape[0], reduce='sum') + x = paddle.stack([num_cells, value], axis=-1) + + # Get ground-truth hit assignments. + truth_path = osp.join(self.raw_dir, f'event{idx}-truth.csv') + y = pd.read_csv(truth_path, + usecols=['hit_id', 'particle_id', 'weight']) + hit_id = paddle.to_tensor(y['hit_id'].values).astype('int64') - 1 + particle_id = paddle.to_tensor(y['particle_id'].values).astype('int64') + particle_id = particle_id.unique(return_inverse=True)[1] - 1 + weight = paddle.to_tensor(y['weight'].values).astype('float32') + + # Sort. + _, perm = index_sort(particle_id * hit_id.shape[0] + hit_id) + hit_id = hit_id[perm] + particle_id = particle_id[perm] + weight = weight[perm] + + # Remove invalid particle ids. + mask = particle_id >= 0 + hit_id = hit_id[mask] + particle_id = particle_id[mask] + weight = weight[mask] + + y_index = paddle.stack([particle_id, hit_id], axis=0) + + return TrackingData(x=x, pos=pos, y_index=y_index, y_weight=weight) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/pascal.py b/jointContribution/mattergen/paddle_geometric/datasets/pascal.py new file mode 100644 index 00000000..5d472c9c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/pascal.py @@ -0,0 +1,227 @@ +import os +import os.path as osp +from itertools import chain +from typing import Callable, Dict, List, Optional +from xml.dom import minidom + +import numpy as np +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.io import DataLoader + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_tar, +) +from paddle_geometric.io import fs + + +class PascalVOCKeypoints(InMemoryDataset): + image_url = ('http://host.robots.ox.ac.uk/pascal/VOC/voc2011/' + 'VOCtrainval_25-May-2011.tar') + annotation_url = ('https://www2.eecs.berkeley.edu/Research/Projects/CS/' + 'vision/shape/poselets/voc2011_keypoints_Feb2012.tgz') + split_url = ('https://github.com/Thinklab-SJTU/PCA-GM/raw/master/data/' + 'PascalVOC/voc2011_pairs.npz') + + categories = [ + 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', + 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', + 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor' + ] + + batch_size = 32 + + def __init__( + self, + root: str, + category: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + device: Optional[str] = None, + ) -> None: + if device is None: + device = 'gpu' if paddle.device.is_compiled_with_cuda() else 'cpu' + + self.category = category.lower() + assert self.category in self.categories + self.device = device + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.category.capitalize(), 'processed') + + @property + def raw_file_names(self) -> List[str]: + return ['images', 'annotations', 'splits.npz'] + + @property + def processed_file_names(self) -> List[str]: + return ['training.pt', 'test.pt'] + + def download(self) -> None: + path = download_url(self.image_url, self.raw_dir) + extract_tar(path, self.raw_dir, mode='r') + os.unlink(path) + image_path = osp.join(self.raw_dir, 'TrainVal', 'VOCdevkit', 'VOC2011') + os.rename(image_path, osp.join(self.raw_dir, 'images')) + fs.rm(osp.join(self.raw_dir, 'TrainVal')) + + path = download_url(self.annotation_url, self.raw_dir) + extract_tar(path, self.raw_dir, mode='r') + os.unlink(path) + + path = download_url(self.split_url, self.raw_dir) + os.rename(path, osp.join(self.raw_dir, 'splits.npz')) + + def process(self) -> None: + import paddle.vision.models as models + import paddle.vision.transforms as T + from PIL import Image + + splits = np.load(osp.join(self.raw_dir, 'splits.npz'), + allow_pickle=True) + category_idx = self.categories.index(self.category) + train_split = list(splits['train'])[category_idx] + test_split = list(splits['test'])[category_idx] + + image_path = osp.join(self.raw_dir, 'images', 'JPEGImages') + info_path = osp.join(self.raw_dir, 'images', 'Annotations') + annotation_path = osp.join(self.raw_dir, 'annotations') + + labels: Dict[str, int] = {} + + vgg16_outputs = [] + + def hook(layer, input, output): + vgg16_outputs.append(output) + + vgg16 = models.vgg16(pretrained=True) + vgg16.eval() + vgg16.features[20].register_forward_post_hook(hook) # relu4_2 + vgg16.features[25].register_forward_post_hook(hook) # relu5_1 + + transform = T.Compose([ + T.ToTensor(), + T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) + ]) + + train_set, test_set = [], [] + for i, name in enumerate(chain(train_split, test_split)): + filename = '_'.join(name.split('/')[1].split('_')[:-1]) + file_idx = int(name.split('_')[-1].split('.')[0]) - 1 + + path = osp.join(info_path, f'{filename}.xml') + obj = minidom.parse(path).getElementsByTagName('object')[file_idx] + + child = obj.getElementsByTagName('truncated')[0].firstChild + trunc = child.data + + elements = obj.getElementsByTagName('occluded') + occ = elements[0].firstChild.data if elements else '0' + + diff = obj.getElementsByTagName('difficult')[0].firstChild.data + + if bool(int(trunc)) or bool(int(occ)) or bool(int(diff)): + continue + + if self.category == 'person' and int(filename[:4]) > 2008: + continue + + xmin = int(obj.getElementsByTagName('xmin')[0].firstChild.data) + xmax = int(obj.getElementsByTagName('xmax')[0].firstChild.data) + ymin = int(obj.getElementsByTagName('ymin')[0].firstChild.data) + ymax = int(obj.getElementsByTagName('ymax')[0].firstChild.data) + box = (xmin, ymin, xmax, ymax) + + dom = minidom.parse(osp.join(annotation_path, name)) + keypoints = dom.getElementsByTagName('keypoint') + poss, ys = [], [] + for keypoint in keypoints: + label = keypoint.attributes['name'].value + if label not in labels: + labels[label] = len(labels) + ys.append(labels[label]) + _x = float(keypoint.attributes['x'].value) + _y = float(keypoint.attributes['y'].value) + poss += [_x, _y] + y = paddle.to_tensor(ys, dtype='int64') + pos = paddle.to_tensor(poss, dtype='float32').reshape([-1, 2]) + + if pos.numel() == 0: + continue + + box = ( + min(int(pos[:, 0].min().floor()), box[0]) - 16, + min(int(pos[:, 1].min().floor()), box[1]) - 16, + max(int(pos[:, 0].max().ceil()), box[2]) + 16, + max(int(pos[:, 1].max().ceil()), box[3]) + 16, + ) + + pos[:, 0] = (pos[:, 0] - box[0]) * 256.0 / (box[2] - box[0]) + pos[:, 1] = (pos[:, 1] - box[1]) * 256.0 / (box[3] - box[1]) + + path = osp.join(image_path, f'{filename}.jpg') + with open(path, 'rb') as f: + img = Image.open(f).convert('RGB').crop(box) + img = img.resize((256, 256), resample=Image.Resampling.BICUBIC) + + img = transform(img) + data = Data(img=img, pos=pos, y=y, name=filename) + + if i < len(train_split): + train_set.append(data) + else: + test_set.append(data) + + data_list = list(chain(train_set, test_set)) + imgs = [data.img for data in data_list] + loader: DataLoader = DataLoader( + dataset=imgs, + batch_size=self.batch_size, + shuffle=False, + ) + for i, batch_img in enumerate(loader): + vgg16_outputs.clear() + with paddle.no_grad(): + vgg16(batch_img) + + out1 = F.interpolate(vgg16_outputs[0], (256, 256), mode='bilinear') + out2 = F.interpolate(vgg16_outputs[1], (256, 256), mode='bilinear') + + for j in range(out1.shape[0]): + data = data_list[i * self.batch_size + j] + idx = paddle.clip(data.pos.round().astype('int64'), 0, 255) + x_1 = out1[j, :, idx[:, 1], idx[:, 0]].cpu() + x_2 = out2[j, :, idx[:, 1], idx[:, 0]].cpu() + data.img = None + data.x = paddle.concat([x_1.transpose([1, 0]), x_2.transpose([1, 0])], axis=-1) + + if self.pre_filter: + train_set = [data for data in train_set if self.pre_filter(data)] + test_set = [data for data in test_set if self.pre_filter(data)] + + if self.pre_transform: + train_set = [self.pre_transform(data) for data in train_set] + test_set = [self.pre_transform(data) for data in test_set] + + self.save(train_set, self.processed_paths[0]) + self.save(test_set, self.processed_paths[1]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'category={self.category})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/pascal_pf.py b/jointContribution/mattergen/paddle_geometric/datasets/pascal_pf.py new file mode 100644 index 00000000..4557e2dc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/pascal_pf.py @@ -0,0 +1,127 @@ +import glob +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class PascalPF(InMemoryDataset): + r"""The Pascal-PF dataset from the `"Proposal Flow" + `_ paper, containing 4 to 16 keypoints + per example over 20 categories. + + Args: + root (str): Root directory where the dataset should be saved. + category (str): The category of the images (one of + :obj:`"Aeroplane"`, :obj:`"Bicycle"`, :obj:`"Bird"`, + :obj:`"Boat"`, :obj:`"Bottle"`, :obj:`"Bus"`, :obj:`"Car"`, + :obj:`"Cat"`, :obj:`"Chair"`, :obj:`"Diningtable"`, :obj:`"Dog"`, + :obj:`"Horse"`, :obj:`"Motorbike"`, :obj:`"Person"`, + :obj:`"Pottedplant"`, :obj:`"Sheep"`, :obj:`"Sofa"`, + :obj:`"Train"`, :obj:`"TVMonitor"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + url = ('https://www.di.ens.fr/willow/research/proposalflow/dataset/' + 'PF-dataset-PASCAL.zip') + + categories = [ + 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', + 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', + 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor' + ] + + def __init__( + self, + root: str, + category: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.category = category.lower() + assert self.category in self.categories + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + self.pairs = fs.paddle_load(self.processed_paths[1]) + + @property + def raw_file_names(self) -> List[str]: + return ['Annotations', 'parsePascalVOC.mat'] + + @property + def processed_file_names(self) -> List[str]: + return [f'{self.category}.pt', f'{self.category}_pairs.pt'] + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + fs.rm(self.raw_dir) + os.rename(osp.join(self.root, 'PF-dataset-PASCAL'), self.raw_dir) + + def process(self) -> None: + from scipy.io import loadmat + + path = osp.join(self.raw_dir, 'Annotations', self.category, '*.mat') + filenames = glob.glob(path) + + names = [] + data_list = [] + for filename in filenames: + name = osp.basename(filename).split('.')[0] + + pos = paddle.to_tensor(loadmat(filename)['kps'], dtype='float32') + mask = ~paddle.isnan(pos[:, 0]) + pos = pos[mask] + + # Normalize points to unit sphere. + pos = pos - pos.mean(axis=0, keepdim=True) + pos = pos / pos.norm(axis=1).max() + + y = mask.nonzero(as_tuple=False).flatten() + + data = Data(pos=pos, y=y, name=name) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + + names.append(name) + data_list.append(data) + + pairs = loadmat(osp.join(self.raw_dir, 'parsePascalVOC.mat')) + pairs = pairs['PascalVOC']['pair'][0, 0][ + 0, self.categories.index(self.category)] + + pairs = [(names.index(x[0][0]), names.index(x[1][0])) for x in pairs] + + self.save(data_list, self.processed_paths[0]) + paddle.save(pairs, self.processed_paths[1]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'category={self.category})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/pcpnet_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/pcpnet_dataset.py new file mode 100644 index 00000000..0a41f3ba --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/pcpnet_dataset.py @@ -0,0 +1,149 @@ +import os +import os.path as osp +from typing import Callable, Optional + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import read_txt_array + + +class PCPNetDataset(InMemoryDataset): + r"""The PCPNet dataset from the `"PCPNet: Learning Local Shape Properties + from Raw Point Clouds" `_ paper, + consisting of 30 shapes, each given as a point cloud, densely sampled with + 100k points. + For each shape, surface normals and local curvatures are given as node + features. + + Args: + root (str): Root directory where the dataset should be saved. + category (str): The training set category (one of :obj:`"NoNoise"`: + :obj:`"Noisy"`, :obj:`"VarDensity"`, :obj:`"NoisyAndVarDensity"` + for :obj:`split="train"` or :obj:`split="val"`, + or one of :obj:`"All"`, :obj:`"LowNoise"`, :obj:`"MedNoise"`, + :obj:`"HighNoise"`, :obj:`"VarDensityStriped"`, + :obj:`"VarDensityGradient"` for :obj:`split="test"`). + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'http://geometry.cs.ucl.ac.uk/projects/2018/pcpnet/pclouds.zip' + + category_files_train = { + 'NoNoise': 'trainingset_no_noise.txt', + 'Noisy': 'trainingset_whitenoise.txt', + 'VarDensity': 'trainingset_vardensity.txt', + 'NoisyAndVarDensity': 'trainingset_vardensity_whitenoise.txt' + } + + category_files_val = { + 'NoNoise': 'validationset_no_noise.txt', + 'Noisy': 'validationset_whitenoise.txt', + 'VarDensity': 'validationset_vardensity.txt', + 'NoisyAndVarDensity': 'validationset_vardensity_whitenoise.txt' + } + + category_files_test = { + 'All': 'testset_all.txt', + 'NoNoise': 'testset_no_noise.txt', + 'LowNoise': 'testset_low_noise.txt', + 'MedNoise': 'testset_med_noise.txt', + 'HighNoise': 'testset_high_noise.txt', + 'VarDensityStriped': 'testset_vardensity_striped.txt', + 'VarDensityGradient': 'testset_vardensity_gradient.txt' + } + + def __init__( + self, + root: str, + category: str, + split: str = 'train', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + + assert split in ['train', 'val', 'test'] + + if split == 'train': + assert category in self.category_files_train.keys() + elif split == 'val': + assert category in self.category_files_val.keys() + else: + assert category in self.category_files_test.keys() + + self.category = category + self.split = split + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + if self.split == 'train': + return self.category_files_train[self.category] + elif self.split == 'val': + return self.category_files_val[self.category] + else: + return self.category_files_test[self.category] + + @property + def processed_file_names(self) -> str: + return self.split + '_' + self.category + '.pdparams' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + path_file = self.raw_paths + with open(path_file[0]) as f: + filenames = f.read().split('\n')[:-1] + data_list = [] + for filename in filenames: + pos_path = osp.join(self.raw_dir, filename + '.xyz') + normal_path = osp.join(self.raw_dir, filename + '.normals') + curv_path = osp.join(self.raw_dir, filename + '.curv') + idx_path = osp.join(self.raw_dir, filename + '.pidx') + pos = read_txt_array(pos_path) + normals = read_txt_array(normal_path) + curv = read_txt_array(curv_path) + normals_and_curv = paddle.concat([normals, curv], axis=1) + test_idx = read_txt_array(idx_path, dtype=paddle.int64) + data = Data(pos=pos, x=normals_and_curv) + data.test_idx = test_idx + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'category={self.category})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/pcqm4m.py b/jointContribution/mattergen/paddle_geometric/datasets/pcqm4m.py new file mode 100644 index 00000000..e48756a7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/pcqm4m.py @@ -0,0 +1,118 @@ +import os +import os.path as osp +from typing import Any, Callable, Dict, List, Optional + +import paddle +from tqdm import tqdm + +from paddle_geometric.data import Data, OnDiskDataset, download_url, extract_zip +from paddle_geometric.data.data import BaseData +from paddle_geometric.io import fs +from paddle_geometric.utils import from_smiles as _from_smiles + + +class PCQM4Mv2(OnDiskDataset): + r"""The PCQM4Mv2 dataset from the `"OGB-LSC: A Large-Scale Challenge for + Machine Learning on Graphs" `_ paper. + :class:`PCQM4Mv2` is a quantum chemistry dataset originally curated under + the `PubChemQC project + `_. + The task is to predict the DFT-calculated HOMO-LUMO energy gap of molecules + given their 2D molecular graphs. + + .. note:: + This dataset uses the :class:`OnDiskDataset` base class to load data + dynamically from disk. + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. + If :obj:`"holdout"`, loads the holdout dataset. + (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + backend (str): The :class:`Database` backend to use. + (default: :obj:`"sqlite"`) + from_smiles (callable, optional): A custom function that takes a SMILES + string and outputs a :obj:`~paddle_geometric.data.Data` object. + If not set, defaults to :meth:`~paddle_geometric.utils.from_smiles`. + (default: :obj:`None`) + """ + url = ('https://dgl-data.s3-accelerate.amazonaws.com/dataset/OGB-LSC/' + 'pcqm4m-v2.zip') + + split_mapping = { + 'train': 'train', + 'val': 'valid', + 'test': 'test-dev', + 'holdout': 'test-challenge', + } + + def __init__( + self, + root: str, + split: str = 'train', + transform: Optional[Callable] = None, + backend: str = 'sqlite', + from_smiles: Optional[Callable] = None, + ) -> None: + assert split in ['train', 'val', 'test', 'holdout'] + + schema = { + 'x': dict(dtype=paddle.int64, size=(-1, 9)), + 'edge_index': dict(dtype=paddle.int64, size=(2, -1)), + 'edge_attr': dict(dtype=paddle.int64, size=(-1, 3)), + 'smiles': str, + 'y': float, + } + + self.from_smiles = from_smiles or _from_smiles + super().__init__(root, transform, backend=backend, schema=schema) + + split_idx = fs.paddle_load(self.raw_paths[1]) + self._indices = split_idx[self.split_mapping[split]].tolist() + + @property + def raw_file_names(self) -> List[str]: + return [ + osp.join('pcqm4m-v2', 'raw', 'data.csv.gz'), + osp.join('pcqm4m-v2', 'split_dict.pt'), + ] + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + import pandas as pd + + df = pd.read_csv(self.raw_paths[0]) + + data_list: List[Data] = [] + iterator = enumerate(zip(df['smiles'], df['homolumogap'])) + for i, (smiles, y) in tqdm(iterator, total=len(df)): + data = self.from_smiles(smiles) + data.y = y + + data_list.append(data) + if i + 1 == len(df) or (i + 1) % 1000 == 0: # Write batch-wise: + self.extend(data_list) + data_list = [] + + def serialize(self, data: BaseData) -> Dict[str, Any]: + assert isinstance(data, Data) + return dict( + x=data.x, + edge_index=data.edge_index, + edge_attr=data.edge_attr, + y=data.y, + smiles=data.smiles, + ) + + def deserialize(self, data: Dict[str, Any]) -> Data: + return Data.from_dict(data) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/planetoid.py b/jointContribution/mattergen/paddle_geometric/datasets/planetoid.py new file mode 100644 index 00000000..330ef6bf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/planetoid.py @@ -0,0 +1,153 @@ +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import InMemoryDataset +from paddle_geometric.io import fs, read_planetoid_data + + +class Planetoid(InMemoryDataset): + r"""The citation network datasets :obj:`"Cora"`, :obj:`"CiteSeer"` and + :obj:`"PubMed"` from the `"Revisiting Semi-Supervised Learning with Graph + Embeddings" `_ paper. + Nodes represent documents and edges represent citation links. + Training, validation and test splits are given by binary masks. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"Cora"`, :obj:`"CiteSeer"`, + :obj:`"PubMed"`). + split (str, optional): The type of dataset split (:obj:`"public"`), + :obj:`"full"`, :obj:`"geom-gcn"`, :obj:`"random"`). + If set to :obj:`"public"`, the split will be the public fixed split + from the `"Revisiting Semi-Supervised Learning with Graph + Embeddings" `_ paper. + If set to :obj:`"full"`, all nodes except those in the validation + and test sets will be used for training (as in the + `"FastGCN: Fast Learning with Graph Convolutional Networks via + Importance Sampling" `_ paper). + If set to :obj:`"geom-gcn"`, the 10 public fixed splits from the + `"Geom-GCN: Geometric Graph Convolutional Networks" + `_ paper are given. + If set to :obj:`"random"`, train, validation, and test sets will be + randomly generated, according to :obj:`num_train_per_class`, + :obj:`num_val` and :obj:`num_test`. (default: :obj:`"public"`) + num_train_per_class (int, optional): The number of training samples + per class in case of :obj:`"random"` split. (default: :obj:`20`) + num_val (int, optional): The number of validation samples in case of + :obj:`"random"` split. (default: :obj:`500`) + num_test (int, optional): The number of test samples in case of + :obj:`"random"` split. (default: :obj:`1000`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://github.com/kimiyoung/planetoid/raw/master/data' + geom_gcn_url = ('https://raw.githubusercontent.com/graphdml-uiuc-jlu/' + 'geom-gcn/master') + + def __init__( + self, + root: str, + name: str, + split: str = "public", + num_train_per_class: int = 20, + num_val: int = 500, + num_test: int = 1000, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name + + self.split = split.lower() + assert self.split in ['public', 'full', 'geom-gcn', 'random'] + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + if split == 'full': + data = self.get(0) + data.train_mask = paddle.full(data.train_mask.shape, True, dtype='bool') + data.train_mask[paddle.logical_or(data.val_mask, data.test_mask)] = False + self.data, self.slices = self.collate([data]) + + elif split == 'random': + data = self.get(0) + data.train_mask = paddle.full(data.train_mask.shape, False, dtype='bool') + for c in range(self.num_classes): + idx = paddle.nonzero(data.y == c).reshape([-1]) + idx = idx[paddle.randperm(idx.shape[0])[:num_train_per_class]] + data.train_mask[idx] = True + + remaining = paddle.nonzero(~data.train_mask).reshape([-1]) + remaining = remaining[paddle.randperm(remaining.shape[0])] + + data.val_mask = paddle.full(data.val_mask.shape, False, dtype='bool') + data.val_mask[remaining[:num_val]] = True + + data.test_mask = paddle.full(data.test_mask.shape, False, dtype='bool') + data.test_mask[remaining[num_val:num_val + num_test]] = True + + self.data, self.slices = self.collate([data]) + + @property + def raw_dir(self) -> str: + if self.split == 'geom-gcn': + return osp.join(self.root, self.name, 'geom-gcn', 'raw') + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + if self.split == 'geom-gcn': + return osp.join(self.root, self.name, 'geom-gcn', 'processed') + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + names = ['x', 'tx', 'allx', 'y', 'ty', 'ally', 'graph', 'test.index'] + return [f'ind.{self.name.lower()}.{name}' for name in names] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for name in self.raw_file_names: + fs.cp(f'{self.url}/{name}', self.raw_dir) + if self.split == 'geom-gcn': + for i in range(10): + url = f'{self.geom_gcn_url}/splits/{self.name.lower()}' + fs.cp(f'{url}_split_0.6_0.2_{i}.npz', self.raw_dir) + + def process(self) -> None: + data = read_planetoid_data(self.raw_dir, self.name) + + if self.split == 'geom-gcn': + train_masks, val_masks, test_masks = [], [], [] + for i in range(10): + name = f'{self.name.lower()}_split_0.6_0.2_{i}.npz' + splits = np.load(osp.join(self.raw_dir, name)) + train_masks.append(paddle.to_tensor(splits['train_mask'])) + val_masks.append(paddle.to_tensor(splits['val_mask'])) + test_masks.append(paddle.to_tensor(splits['test_mask'])) + data.train_mask = paddle.stack(train_masks, axis=1) + data.val_mask = paddle.stack(val_masks, axis=1) + data.test_mask = paddle.stack(test_masks, axis=1) + + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/polblogs.py b/jointContribution/mattergen/paddle_geometric/datasets/polblogs.py new file mode 100644 index 00000000..f8f618e4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/polblogs.py @@ -0,0 +1,95 @@ +import os +from typing import Callable, List, Optional + +import pandas as pd +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_tar, +) + + +class PolBlogs(InMemoryDataset): + r"""The Political Blogs dataset from the `"The Political Blogosphere and + the 2004 US Election: Divided they Blog" + `_ paper. + + :class:`Polblogs` is a graph with 1,490 vertices (representing political + blogs) and 19,025 edges (links between blogs). + The links are automatically extracted from a crawl of the front page of the + blog. + Each vertex receives a label indicating the political leaning of the blog: + liberal or conservative. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + .. list-table:: + :widths: 10 10 10 10 + :header-rows: 1 + + * - #nodes + - #edges + - #features + - #classes + * - 1,490 + - 19,025 + - 0 + - 2 + """ + + url = 'https://netset.telecom-paris.fr/datasets/polblogs.tar.gz' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['adjacency.tsv', 'labels.tsv'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_tar(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + edge_index = pd.read_csv(self.raw_paths[0], header=None, sep='\t', + usecols=[0, 1]) + edge_index = paddle.to_tensor(edge_index.values.T, dtype='int64') + + y = pd.read_csv(self.raw_paths[1], header=None, sep='\t') + y = paddle.to_tensor(y.values.flatten(), dtype='int64') + + data = Data(edge_index=edge_index, y=y, num_nodes=y.shape[0]) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/ppi.py b/jointContribution/mattergen/paddle_geometric/datasets/ppi.py new file mode 100644 index 00000000..78bebfac --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/ppi.py @@ -0,0 +1,122 @@ +import os +import os.path as osp +from itertools import product +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.utils import remove_self_loops + + +class PPI(InMemoryDataset): + r"""The protein-protein interaction networks from the `"Predicting + Multicellular Function through Multi-layer Tissue Networks" + `_ paper, containing positional gene + sets, motif gene sets and immunological signatures as features (50 in + total) and gene ontology sets as labels (121 in total). + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://data.dgl.ai/dataset/ppi.zip' + + def __init__( + self, + root: str, + split: str = 'train', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + + assert split in ['train', 'val', 'test'] + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + if split == 'train': + self.load(self.processed_paths[0]) + elif split == 'val': + self.load(self.processed_paths[1]) + elif split == 'test': + self.load(self.processed_paths[2]) + + @property + def raw_file_names(self) -> List[str]: + splits = ['train', 'valid', 'test'] + files = ['feats.npy', 'graph_id.npy', 'graph.json', 'labels.npy'] + return [f'{split}_{name}' for split, name in product(splits, files)] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pt', 'val.pt', 'test.pt'] + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + import networkx as nx + from networkx.readwrite import json_graph + + for s, split in enumerate(['train', 'valid', 'test']): + path = osp.join(self.raw_dir, f'{split}_graph.json') + with open(path) as f: + G = nx.DiGraph(json_graph.node_link_graph(json.load(f))) + + x = np.load(osp.join(self.raw_dir, f'{split}_feats.npy')) + x = paddle.to_tensor(x, dtype='float32') + + y = np.load(osp.join(self.raw_dir, f'{split}_labels.npy')) + y = paddle.to_tensor(y, dtype='float32') + + data_list = [] + path = osp.join(self.raw_dir, f'{split}_graph_id.npy') + idx = paddle.to_tensor(np.load(path), dtype='int64') + idx = idx - idx.min() + + for i in range(int(idx.max().item()) + 1): + mask = idx == i + G_s = G.subgraph( + mask.nonzero().flatten().tolist()) + edge_index = paddle.to_tensor(list(G_s.edges)).t() + edge_index = edge_index - edge_index.min() + edge_index, _ = remove_self_loops(edge_index) + + data = Data(edge_index=edge_index, x=x[mask], y=y[mask]) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + self.save(data_list, self.processed_paths[s]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/qm7.py b/jointContribution/mattergen/paddle_geometric/datasets/qm7.py new file mode 100644 index 00000000..5ab86a64 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/qm7.py @@ -0,0 +1,76 @@ +from typing import Callable, Optional +import paddle +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class QM7b(InMemoryDataset): + r"""The QM7b dataset from the `"MoleculeNet: A Benchmark for Molecular + Machine Learning" `_ paper, consisting of + 7,211 molecules with 14 regression targets. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://deepchemdata.s3-us-west-1.amazonaws.com/datasets/qm7b.mat' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> str: + return 'qm7b.mat' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(self.url, self.raw_dir) + + def process(self) -> None: + from scipy.io import loadmat + + data = loadmat(self.raw_paths[0]) + coulomb_matrix = paddle.to_tensor(data['X']) + target = paddle.to_tensor(data['T'], dtype='float32') + + data_list = [] + for i in range(target.shape[0]): + edge_index = paddle.nonzero(coulomb_matrix[i], as_tuple=False).t() + edge_attr = coulomb_matrix[i, edge_index[0], edge_index[1]] + y = target[i].reshape([1, -1]) + data = Data(edge_index=edge_index, edge_attr=edge_attr, y=y) + data.num_nodes = edge_index.max().item() + 1 + data_list.append(data) + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/qm9.py b/jointContribution/mattergen/paddle_geometric/datasets/qm9.py new file mode 100644 index 00000000..1bb7934f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/qm9.py @@ -0,0 +1,208 @@ +import os +import os.path as osp +import sys +from typing import Callable, List, Optional + +import paddle +from tqdm import tqdm + +from paddle_geometric.data import Data, InMemoryDataset, download_url, extract_zip +from paddle_geometric.io import fs +from paddle_geometric.utils import one_hot, scatter + +HAR2EV = 27.211386246 +KCALMOL2EV = 0.04336414 + +conversion = paddle.to_tensor([ + 1., 1., HAR2EV, HAR2EV, HAR2EV, 1., HAR2EV, HAR2EV, HAR2EV, HAR2EV, HAR2EV, + 1., KCALMOL2EV, KCALMOL2EV, KCALMOL2EV, KCALMOL2EV, 1., 1., 1. +]) + +atomrefs = { + 6: [0., 0., 0., 0., 0.], + 7: [-13.61312172, -1029.86312267, -1485.30251237, -2042.61123593, -2713.48485589], + 8: [-13.5745904, -1029.82456413, -1485.26398105, -2042.5727046, -2713.44632457], + 9: [-13.54887564, -1029.79887659, -1485.2382935, -2042.54701705, -2713.42063702], + 10: [-13.90303183, -1030.25891228, -1485.71166277, -2043.01812778, -2713.88796536], + 11: [0., 0., 0., 0., 0.], +} + + +class QM9(InMemoryDataset): + raw_url = ('https://deepchemdata.s3-us-west-1.amazonaws.com/datasets/' + 'molnet_publish/qm9.zip') + raw_url2 = 'https://ndownloader.figshare.com/files/3195404' + processed_url = 'https://data.pyg.org/datasets/qm9_v3.zip' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + def mean(self, target: int) -> float: + y = paddle.concat([self.get(i).y for i in range(len(self))], axis=0) + return float(y[:, target].mean().item()) + + def std(self, target: int) -> float: + y = paddle.concat([self.get(i).y for i in range(len(self))], axis=0) + return float(y[:, target].std().item()) + + def atomref(self, target: int) -> Optional[paddle.Tensor]: + if target in atomrefs: + out = paddle.zeros([100, 1]) + out[paddle.to_tensor([1, 6, 7, 8, 9])] = paddle.to_tensor(atomrefs[target]).reshape([-1, 1]) + return out + return None + + @property + def raw_file_names(self) -> List[str]: + try: + import rdkit # noqa + return ['gdb9.sdf', 'gdb9.sdf.csv', 'uncharacterized.txt'] + except ImportError: + return ['qm9_v3.pt'] + + @property + def processed_file_names(self) -> str: + return 'data_v3.pt' + + def download(self) -> None: + try: + import rdkit # noqa + file_path = download_url(self.raw_url, self.raw_dir) + extract_zip(file_path, self.raw_dir) + os.unlink(file_path) + + file_path = download_url(self.raw_url2, self.raw_dir) + os.rename(osp.join(self.raw_dir, '3195404'), + osp.join(self.raw_dir, 'uncharacterized.txt')) + except ImportError: + path = download_url(self.processed_url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + try: + from rdkit import Chem, RDLogger + from rdkit.Chem.rdchem import BondType as BT + from rdkit.Chem.rdchem import HybridizationType + RDLogger.DisableLog('rdApp.*') # type: ignore + WITH_RDKIT = True + + except ImportError: + WITH_RDKIT = False + + if not WITH_RDKIT: + print(("Using a pre-processed version of the dataset. Please " + "install 'rdkit' to alternatively process the raw data."), + file=sys.stderr) + + data_list = fs.paddle_load(self.raw_paths[0]) + data_list = [Data(**data_dict) for data_dict in data_list] + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.save(data_list, self.processed_paths[0]) + return + + types = {'H': 0, 'C': 1, 'N': 2, 'O': 3, 'F': 4} + bonds = {BT.SINGLE: 0, BT.DOUBLE: 1, BT.TRIPLE: 2, BT.AROMATIC: 3} + + with open(self.raw_paths[1]) as f: + target = [[float(x) for x in line.split(',')[1:20]] + for line in f.read().split('\n')[1:-1]] + y = paddle.to_tensor(target, dtype=paddle.float32) + y = paddle.concat([y[:, 3:], y[:, :3]], axis=-1) + y = y * conversion.reshape([1, -1]) + + with open(self.raw_paths[2]) as f: + skip = [int(x.split()[0]) - 1 for x in f.read().split('\n')[9:-2]] + + suppl = Chem.SDMolSupplier(self.raw_paths[0], removeHs=False, sanitize=False) + + data_list = [] + for i, mol in enumerate(tqdm(suppl)): + if i in skip: + continue + + N = mol.GetNumAtoms() + conf = mol.GetConformer() + pos = paddle.to_tensor(conf.GetPositions(), dtype=paddle.float32) + + type_idx = [] + atomic_number = [] + aromatic = [] + sp = [] + sp2 = [] + sp3 = [] + num_hs = [] + for atom in mol.GetAtoms(): + type_idx.append(types[atom.GetSymbol()]) + atomic_number.append(atom.GetAtomicNum()) + aromatic.append(1 if atom.GetIsAromatic() else 0) + hybridization = atom.GetHybridization() + sp.append(1 if hybridization == HybridizationType.SP else 0) + sp2.append(1 if hybridization == HybridizationType.SP2 else 0) + sp3.append(1 if hybridization == HybridizationType.SP3 else 0) + + z = paddle.to_tensor(atomic_number, dtype=paddle.int64) + + rows, cols, edge_types = [], [], [] + for bond in mol.GetBonds(): + start, end = bond.GetBeginAtomIdx(), bond.GetEndAtomIdx() + rows += [start, end] + cols += [end, start] + edge_types += 2 * [bonds[bond.GetBondType()]] + + edge_index = paddle.to_tensor([rows, cols], dtype=paddle.int64) + edge_type = paddle.to_tensor(edge_types, dtype=paddle.int64) + edge_attr = one_hot(edge_type, num_classes=len(bonds)) + + perm = paddle.argsort(edge_index[0] * N + edge_index[1]) + edge_index = edge_index[:, perm] + edge_type = edge_type[perm] + edge_attr = edge_attr[perm] + + row, col = edge_index + hs = (z == 1).astype(paddle.float32) + num_hs = scatter(hs[row], col, dim_size=N, reduce='sum').tolist() + + x1 = one_hot(paddle.to_tensor(type_idx), num_classes=len(types)) + x2 = paddle.to_tensor([atomic_number, aromatic, sp, sp2, sp3, num_hs], + dtype=paddle.float32).t().contiguous() + x = paddle.concat([x1, x2], axis=-1) + + name = mol.GetProp('_Name') + smiles = Chem.MolToSmiles(mol, isomericSmiles=True) + + data = Data( + x=x, + z=z, + pos=pos, + edge_index=edge_index, + smiles=smiles, + edge_attr=edge_attr, + y=y[i].unsqueeze(0), + name=name, + idx=i, + ) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/rcdd.py b/jointContribution/mattergen/paddle_geometric/datasets/rcdd.py new file mode 100644 index 00000000..9de97b90 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/rcdd.py @@ -0,0 +1,124 @@ +import os +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import HeteroData, InMemoryDataset, download_url, extract_zip +from paddle_geometric.utils import index_to_mask + + +class RCDD(InMemoryDataset): + r"""The risk commodity detection dataset (RCDD) from the + `"Datasets and Interfaces for Benchmarking Heterogeneous Graph + Neural Networks" `_ paper. + RCDD is an industrial-scale heterogeneous graph dataset based on a + real risk detection scenario from Alibaba's e-commerce platform. + It consists of 13,806,619 nodes and 157,814,864 edges across 7 node types + and 7 edge types, respectively. + """ + url = ('https://s3.cn-north-1.amazonaws.com.cn/dgl-data/dataset/' + 'openhgnn/AliRCD_ICDM.zip') + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'AliRCD_ICDM_nodes.csv', + 'AliRCD_ICDM_edges.csv', + 'AliRCD_ICDM_train_labels.csv', + 'AliRCD_ICDM_test_labels.csv', + ] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + @property + def num_classes(self) -> int: + return 2 + + def process(self) -> None: + import pandas as pd + + data = HeteroData() + + node_df = pd.read_csv( + self.raw_paths[0], + header=None, + names=['node_id', 'node_type', 'node_feat'], + ) + + mapping = paddle.zeros((len(node_df),), dtype=paddle.int64) + for node_type in node_df['node_type'].unique(): + mask = node_df['node_type'] == node_type + node_id = paddle.to_tensor(node_df['node_id'][mask].values, dtype=paddle.int64) + num_nodes = mask.sum() + mapping[node_id] = paddle.arange(num_nodes, dtype=paddle.int64) + data[node_type].num_nodes = num_nodes + x = np.vstack([ + np.asarray(f.split(':'), dtype=np.float32) + for f in node_df['node_feat'][mask] + ]) + data[node_type].x = paddle.to_tensor(x) + + edge_df = pd.read_csv( + self.raw_paths[1], + header=None, + names=['src_id', 'dst_id', 'src_type', 'dst_type', 'edge_type'], + ) + for edge_type in edge_df['edge_type'].unique(): + edge_type_df = edge_df[edge_df['edge_type'] == edge_type] + src_type = edge_type_df['src_type'].iloc[0] + dst_type = edge_type_df['dst_type'].iloc[0] + src = mapping[paddle.to_tensor(edge_type_df['src_id'].values, dtype=paddle.int64)] + dst = mapping[paddle.to_tensor(edge_type_df['dst_id'].values, dtype=paddle.int64)] + edge_index = paddle.stack([src, dst], axis=0) + data[(src_type, edge_type, dst_type)].edge_index = edge_index + + train_df = pd.read_csv( + self.raw_paths[2], + header=None, + names=['node_id', 'label'], + dtype=int, + ) + test_df = pd.read_csv( + self.raw_paths[3], + header=None, + sep='\t', + names=['node_id', 'label'], + dtype=int, + ) + + train_idx = mapping[paddle.to_tensor(train_df['node_id'].values, dtype=paddle.int64)] + test_idx = mapping[paddle.to_tensor(test_df['node_id'].values, dtype=paddle.int64)] + + y = paddle.full((data['item'].num_nodes,), -1, dtype=paddle.int64) + y[train_idx] = paddle.to_tensor(train_df['label'].values, dtype=paddle.int64) + y[test_idx] = paddle.to_tensor(test_df['label'].values, dtype=paddle.int64) + + train_mask = index_to_mask(train_idx, data['item'].num_nodes) + test_mask = index_to_mask(test_idx, data['item'].num_nodes) + + data['item'].y = y + data['item'].train_mask = train_mask + data['item'].test_mask = test_mask + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/reddit.py b/jointContribution/mattergen/paddle_geometric/datasets/reddit.py new file mode 100644 index 00000000..88a8507b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/reddit.py @@ -0,0 +1,77 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url, extract_zip +from paddle_geometric.utils import coalesce + + +class Reddit(InMemoryDataset): + r"""The Reddit dataset from the `"Inductive Representation Learning on + Large Graphs" `_ paper, containing + Reddit posts belonging to different communities. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://data.dgl.ai/dataset/reddit.zip' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['reddit_data.npz', 'reddit_graph.npz'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + import scipy.sparse as sp + + data = np.load(osp.join(self.raw_dir, 'reddit_data.npz')) + x = paddle.to_tensor(data['feature'], dtype=paddle.float32) + y = paddle.to_tensor(data['label'], dtype=paddle.int64) + split = paddle.to_tensor(data['node_types'], dtype=paddle.int64) + + adj = sp.load_npz(osp.join(self.raw_dir, 'reddit_graph.npz')) + row = paddle.to_tensor(adj.row, dtype=paddle.int64) + col = paddle.to_tensor(adj.col, dtype=paddle.int64) + edge_index = paddle.stack([row, col], axis=0) + edge_index = coalesce(edge_index, num_nodes=x.shape[0]) + + data = Data(x=x, edge_index=edge_index, y=y) + data.train_mask = split == 1 + data.val_mask = split == 2 + data.test_mask = split == 3 + + data = data if self.pre_transform is None else self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/reddit2.py b/jointContribution/mattergen/paddle_geometric/datasets/reddit2.py new file mode 100644 index 00000000..97a3f39d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/reddit2.py @@ -0,0 +1,105 @@ +import json +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_google_url + + +class Reddit2(InMemoryDataset): + r"""The Reddit dataset from the `"GraphSAINT: Graph Sampling Based + Inductive Learning Method" `_ paper, + containing Reddit posts belonging to different communities. + + .. note:: + + This is a sparser version of the original + :obj:`~paddle_geometric.datasets.Reddit` dataset (~23M edges instead of + ~114M edges), and is used in papers such as + `SGC `_ and + `GraphSAINT `_. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + adj_full_id = '1sncK996BM5lpuDf75lDFqCiDZyErc1c2' + feats_id = '1ZsHaJ0ussP1W722krmEIp_8pwKAoi5b3' + class_map_id = '1JF3Pjv9OboMNYs2aXRQGbJbc4t_nDd5u' + role_id = '1nJIKd77lcAGU4j-kVNx_AIGEkveIKz3A' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['adj_full.npz', 'feats.npy', 'class_map.json', 'role.json'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_google_url(self.adj_full_id, self.raw_dir, 'adj_full.npz') + download_google_url(self.feats_id, self.raw_dir, 'feats.npy') + download_google_url(self.class_map_id, self.raw_dir, 'class_map.json') + download_google_url(self.role_id, self.raw_dir, 'role.json') + + def process(self) -> None: + import scipy.sparse as sp + + f = np.load(osp.join(self.raw_dir, 'adj_full.npz')) + adj = sp.csr_matrix((f['data'], f['indices'], f['indptr']), f['shape']) + adj = adj.tocoo() + row = paddle.to_tensor(adj.row, dtype='int64') + col = paddle.to_tensor(adj.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + x = np.load(osp.join(self.raw_dir, 'feats.npy')) + x = paddle.to_tensor(x, dtype='float32') + + ys = [-1] * x.shape[0] + with open(osp.join(self.raw_dir, 'class_map.json')) as f: + class_map = json.load(f) + for key, item in class_map.items(): + ys[int(key)] = item + y = paddle.to_tensor(ys, dtype='int64') + + with open(osp.join(self.raw_dir, 'role.json')) as f: + role = json.load(f) + + train_mask = paddle.zeros((x.shape[0],), dtype='bool') + train_mask[paddle.to_tensor(role['tr'], dtype='int64')] = True + + val_mask = paddle.zeros((x.shape[0],), dtype='bool') + val_mask[paddle.to_tensor(role['va'], dtype='int64')] = True + + test_mask = paddle.zeros((x.shape[0],), dtype='bool') + test_mask[paddle.to_tensor(role['te'], dtype='int64')] = True + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + + data = data if self.pre_transform is None else self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/rel_link_pred_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/rel_link_pred_dataset.py new file mode 100644 index 00000000..d6855e5b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/rel_link_pred_dataset.py @@ -0,0 +1,112 @@ +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class RelLinkPredDataset(InMemoryDataset): + r"""The relational link prediction datasets from the + `"Modeling Relational Data with Graph Convolutional Networks" + `_ paper. + Training and test splits are given by sets of triplets. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"FB15k-237"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + urls = { + 'FB15k-237': ('https://raw.githubusercontent.com/MichSchli/' + 'RelationPrediction/master/data/FB-Toutanova') + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name + assert name in ['FB15k-237'] + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def num_relations(self) -> int: + return int(self._data.edge_type.max()) + 1 # type: ignore + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + @property + def raw_file_names(self) -> List[str]: + return [ + 'entities.dict', 'relations.dict', 'test.txt', 'train.txt', + 'valid.txt' + ] + + def download(self) -> None: + for file_name in self.raw_file_names: + download_url(f'{self.urls[self.name]}/{file_name}', self.raw_dir) + + def process(self) -> None: + with open(osp.join(self.raw_dir, 'entities.dict')) as f: + lines = [row.split('\t') for row in f.read().split('\n')[:-1]] + entities_dict = {key: int(value) for value, key in lines} + + with open(osp.join(self.raw_dir, 'relations.dict')) as f: + lines = [row.split('\t') for row in f.read().split('\n')[:-1]] + relations_dict = {key: int(value) for value, key in lines} + + kwargs = {} + for split in ['train', 'valid', 'test']: + with open(osp.join(self.raw_dir, f'{split}.txt')) as f: + lines = [row.split('\t') for row in f.read().split('\n')[:-1]] + src = [entities_dict[row[0]] for row in lines] + rel = [relations_dict[row[1]] for row in lines] + dst = [entities_dict[row[2]] for row in lines] + kwargs[f'{split}_edge_index'] = paddle.to_tensor([src, dst]) + kwargs[f'{split}_edge_type'] = paddle.to_tensor(rel) + + # For message passing, we add reverse edges and types to the graph: + row, col = kwargs['train_edge_index'] + edge_type = kwargs['train_edge_type'] + row, col = paddle.concat([row, col]), paddle.concat([col, row]) + edge_index = paddle.stack([row, col], axis=0) + edge_type = paddle.concat([edge_type, edge_type + len(relations_dict)]) + + data = Data(num_nodes=len(entities_dict), edge_index=edge_index, + edge_type=edge_type, **kwargs) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/s3dis.py b/jointContribution/mattergen/paddle_geometric/datasets/s3dis.py new file mode 100644 index 00000000..19ed3a6a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/s3dis.py @@ -0,0 +1,115 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class S3DIS(InMemoryDataset): + r"""The (pre-processed) Stanford Large-Scale 3D Indoor Spaces dataset from + the `"3D Semantic Parsing of Large-Scale Indoor Spaces" + `_ + paper, containing point clouds of six large-scale indoor parts in three + buildings with 12 semantic elements (and one clutter class). + + Args: + root (str): Root directory where the dataset should be saved. + test_area (int, optional): Which area to use for testing (1-6). + (default: :obj:`6`) + train (bool, optional): If :obj:`True`, loads the training dataset, + otherwise the test dataset. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = ('https://shapenet.cs.stanford.edu/media/' + 'indoor3d_sem_seg_hdf5_data.zip') + + def __init__( + self, + root: str, + test_area: int = 6, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert 1 <= test_area <= 6 + self.test_area = test_area + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + path = self.processed_paths[0] if train else self.processed_paths[1] + self.load(path) + + @property + def raw_file_names(self) -> List[str]: + return ['all_files.txt', 'room_filelist.txt'] + + @property + def processed_file_names(self) -> List[str]: + return [f'{split}_{self.test_area}.pt' for split in ['train', 'test']] + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.unlink(path) + fs.rm(self.raw_dir) + name = self.url.split('/')[-1].split('.')[0] + os.rename(osp.join(self.root, name), self.raw_dir) + + def process(self) -> None: + import h5py + + with open(self.raw_paths[0]) as f: + filenames = [x.split('/')[-1] for x in f.read().split('\n')[:-1]] + + with open(self.raw_paths[1]) as f: + rooms = f.read().split('\n')[:-1] + + xs: List[Tensor] = [] + ys: List[Tensor] = [] + for filename in filenames: + h5 = h5py.File(osp.join(self.raw_dir, filename)) + xs += [paddle.to_tensor(h5['data'][:][i]) for i in range(len(h5['data']))] + ys += [paddle.to_tensor(h5['label'][:][i], dtype=paddle.int64) for i in range(len(h5['label']))] + + test_area = f'Area_{self.test_area}' + train_data_list, test_data_list = [], [] + for i, (x, y) in enumerate(zip(xs, ys)): + data = Data(pos=x[:, :3], x=x[:, 3:], y=y) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + + if test_area not in rooms[i]: + train_data_list.append(data) + else: + test_data_list.append(data) + + self.save(train_data_list, self.processed_paths[0]) + self.save(test_data_list, self.processed_paths[1]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/sbm_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/sbm_dataset.py new file mode 100644 index 00000000..21b4b5f3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/sbm_dataset.py @@ -0,0 +1,153 @@ +import os.path as osp +from typing import Any, Callable, List, Optional, Union + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.utils import stochastic_blockmodel_graph + + +class StochasticBlockModelDataset(InMemoryDataset): + r"""A synthetic graph dataset generated by the stochastic block model. + The node features of each block are sampled from normal distributions where + the centers of clusters are vertices of a hypercube, as computed by the + :meth:`sklearn.datasets.make_classification` method. + """ + + def __init__( + self, + root: str, + block_sizes: Union[List[int], Tensor], + edge_probs: Union[List[List[float]], Tensor], + num_graphs: int = 1, + num_channels: Optional[int] = None, + is_undirected: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + **kwargs: Any, + ) -> None: + if not isinstance(block_sizes, paddle.Tensor): + block_sizes = paddle.to_tensor(block_sizes, dtype=paddle.int64) + if not isinstance(edge_probs, paddle.Tensor): + edge_probs = paddle.to_tensor(edge_probs, dtype=paddle.float32) + + assert num_graphs > 0 + + self.block_sizes = block_sizes + self.edge_probs = edge_probs + self.num_graphs = num_graphs + self.num_channels = num_channels + self.is_undirected = is_undirected + + self.kwargs = { + 'n_informative': num_channels, + 'n_redundant': 0, + 'flip_y': 0.0, + 'shuffle': False, + } + self.kwargs.update(kwargs) + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.__class__.__name__, 'processed') + + @property + def processed_file_names(self) -> str: + block_sizes = self.block_sizes.numpy().tolist() + hash1 = '-'.join([f'{x:.1f}' for x in block_sizes]) + + edge_probs = self.edge_probs.numpy().tolist() + hash2 = '-'.join([f'{x:.1f}' for x in edge_probs]) + + return f'data_{self.num_channels}_{hash1}_{hash2}_{self.num_graphs}.pt' + + def process(self) -> None: + from sklearn.datasets import make_classification + + edge_index = stochastic_blockmodel_graph( + self.block_sizes, self.edge_probs, directed=not self.is_undirected) + + num_samples = int(self.block_sizes.sum()) + num_classes = self.block_sizes.shape[0] + + data_list = [] + for _ in range(self.num_graphs): + x = None + if self.num_channels is not None: + x, y_not_sorted = make_classification( + n_samples=num_samples, + n_features=self.num_channels, + n_classes=num_classes, + weights=(self.block_sizes / num_samples).numpy(), + **self.kwargs, + ) + x = x[np.argsort(y_not_sorted)] + x = paddle.to_tensor(x, dtype=paddle.float32) + + y = paddle.arange(num_classes).repeat_interleave(self.block_sizes) + + data = Data(x=x, edge_index=edge_index, y=y) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) + + +class RandomPartitionGraphDataset(StochasticBlockModelDataset): + r"""The random partition graph dataset from the `"How to Find Your + Friendly Neighborhood: Graph Attention Design with Self-Supervision" + `_ paper. + """ + + def __init__( + self, + root: str, + num_classes: int, + num_nodes_per_class: int, + node_homophily_ratio: float, + average_degree: float, + num_graphs: int = 1, + num_channels: Optional[int] = None, + is_undirected: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + **kwargs: Any, + ) -> None: + + self._num_classes = num_classes + self.num_nodes_per_class = num_nodes_per_class + self.node_homophily_ratio = node_homophily_ratio + self.average_degree = average_degree + + ec_over_v2 = average_degree / num_nodes_per_class + p_in = node_homophily_ratio * ec_over_v2 + p_out = (ec_over_v2 - p_in) / (num_classes - 1) + + block_sizes = [num_nodes_per_class for _ in range(num_classes)] + edge_probs = [[p_out for _ in range(num_classes)] + for _ in range(num_classes)] + for r in range(num_classes): + edge_probs[r][r] = p_in + + super().__init__(root, block_sizes, edge_probs, num_graphs, + num_channels, is_undirected, transform, pre_transform, + **kwargs) + + @property + def processed_file_names(self) -> str: + return (f'data_{self.num_channels}_{self._num_classes}_' + f'{self.num_nodes_per_class}_{self.node_homophily_ratio:.1f}_' + f'{self.average_degree:.1f}_{self.num_graphs}.pt') + + def process(self) -> None: + return super().process() diff --git a/jointContribution/mattergen/paddle_geometric/datasets/shapenet.py b/jointContribution/mattergen/paddle_geometric/datasets/shapenet.py new file mode 100644 index 00000000..d30121f0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/shapenet.py @@ -0,0 +1,166 @@ +import json +import os +import os.path as osp +from typing import Callable, List, Optional, Union + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs, read_txt_array + + +class ShapeNet(InMemoryDataset): + url = ('https://shapenet.cs.stanford.edu/media/' + 'shapenetcore_partanno_segmentation_benchmark_v0_normal.zip') + + category_ids = { + 'Airplane': '02691156', + 'Bag': '02773838', + 'Cap': '02954340', + 'Car': '02958343', + 'Chair': '03001627', + 'Earphone': '03261776', + 'Guitar': '03467517', + 'Knife': '03624134', + 'Lamp': '03636649', + 'Laptop': '03642806', + 'Motorbike': '03790512', + 'Mug': '03797390', + 'Pistol': '03948459', + 'Rocket': '04099429', + 'Skateboard': '04225987', + 'Table': '04379243', + } + + seg_classes = { + 'Airplane': [0, 1, 2, 3], + 'Bag': [4, 5], + 'Cap': [6, 7], + 'Car': [8, 9, 10, 11], + 'Chair': [12, 13, 14, 15], + 'Earphone': [16, 17, 18], + 'Guitar': [19, 20, 21], + 'Knife': [22, 23], + 'Lamp': [24, 25, 26, 27], + 'Laptop': [28, 29], + 'Motorbike': [30, 31, 32, 33, 34, 35], + 'Mug': [36, 37], + 'Pistol': [38, 39, 40], + 'Rocket': [41, 42, 43], + 'Skateboard': [44, 45, 46], + 'Table': [47, 48, 49], + } + + def __init__( + self, + root: str, + categories: Optional[Union[str, List[str]]] = None, + include_normals: bool = True, + split: str = 'trainval', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + if categories is None: + categories = list(self.category_ids.keys()) + if isinstance(categories, str): + categories = [categories] + assert all(category in self.category_ids for category in categories) + self.categories = categories + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + if split == 'train': + path = self.processed_paths[0] + elif split == 'val': + path = self.processed_paths[1] + elif split == 'test': + path = self.processed_paths[2] + elif split == 'trainval': + path = self.processed_paths[3] + else: + raise ValueError(f'Split {split} found, but expected either ' + 'train, val, trainval or test') + + self.load(path) + + assert isinstance(self._data, Data) + self._data.x = self._data.x if include_normals else None + + self.y_mask = paddle.zeros((len(self.seg_classes.keys()), 50), + dtype='bool') + for i, labels in enumerate(self.seg_classes.values()): + self.y_mask[i, labels] = 1 + + @property + def num_classes(self) -> int: + return self.y_mask.shape[-1] + + @property + def raw_file_names(self) -> List[str]: + return list(self.category_ids.values()) + ['train_test_split'] + + @property + def processed_file_names(self) -> List[str]: + cats = '_'.join([cat[:3].lower() for cat in self.categories]) + return [ + osp.join(f'{cats}_{split}.pt') + for split in ['train', 'val', 'test', 'trainval'] + ] + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.unlink(path) + fs.rm(self.raw_dir) + name = self.url.split('/')[-1].split('.')[0] + os.rename(osp.join(self.root, name), self.raw_dir) + + def process_filenames(self, filenames: List[str]) -> List[Data]: + data_list = [] + categories_ids = [self.category_ids[cat] for cat in self.categories] + cat_idx = {categories_ids[i]: i for i in range(len(categories_ids))} + + for name in filenames: + cat = name.split(osp.sep)[0] + if cat not in categories_ids: + continue + + tensor = read_txt_array(osp.join(self.raw_dir, name)) + pos = tensor[:, :3] + x = tensor[:, 3:6] + y = tensor[:, -1].astype('int64') + data = Data(pos=pos, x=x, y=y, category=cat_idx[cat]) + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + + return data_list + + def process(self) -> None: + trainval = [] + for i, split in enumerate(['train', 'val', 'test']): + path = osp.join(self.raw_dir, 'train_test_split', + f'shuffled_{split}_file_list.json') + with open(path) as f: + filenames = [ + osp.sep.join(name.split('/')[1:]) + '.txt' + for name in json.load(f) + ] # Removing first directory. + data_list = self.process_filenames(filenames) + if split == 'train' or split == 'val': + trainval += data_list + self.save(data_list, self.processed_paths[i]) + self.save(trainval, self.processed_paths[3]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'categories={self.categories})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/shrec2016.py b/jointContribution/mattergen/paddle_geometric/datasets/shrec2016.py new file mode 100644 index 00000000..dff08c81 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/shrec2016.py @@ -0,0 +1,116 @@ +import glob +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle + +from paddle_geometric.data import InMemoryDataset, download_url, extract_zip +from paddle_geometric.io import fs, read_off, read_txt_array + + +class SHREC2016(InMemoryDataset): + train_url = ('http://www.dais.unive.it/~shrec2016/data/' + 'shrec2016_PartialDeformableShapes.zip') + test_url = ('http://www.dais.unive.it/~shrec2016/data/' + 'shrec2016_PartialDeformableShapes_TestSet.zip') + + categories = [ + 'cat', 'centaur', 'david', 'dog', 'horse', 'michael', 'victoria', + 'wolf' + ] + partialities = ['holes', 'cuts'] + + def __init__( + self, + root: str, + partiality: str, + category: str, + train: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert partiality.lower() in self.partialities + self.part = partiality.lower() + assert category.lower() in self.categories + self.cat = category.lower() + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.__ref__ = fs.paddle_load(self.processed_paths[0]) + path = self.processed_paths[1] if train else self.processed_paths[2] + self.load(path) + + @property + def ref(self) -> str: + ref = self.__ref__ + if self.transform is not None: + ref = self.transform(ref) + return ref + + @property + def raw_file_names(self) -> List[str]: + return ['training', 'test'] + + @property + def processed_file_names(self) -> List[str]: + name = f'{self.part}_{self.cat}.pt' + return [f'{i}_{name}' for i in ['ref', 'training', 'test']] + + def download(self) -> None: + path = download_url(self.train_url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + path = osp.join(self.raw_dir, 'shrec2016_PartialDeformableShapes') + os.rename(path, osp.join(self.raw_dir, 'training')) + + path = download_url(self.test_url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + path = osp.join(self.raw_dir, + 'shrec2016_PartialDeformableShapes_TestSet') + os.rename(path, osp.join(self.raw_dir, 'test')) + + def process(self) -> None: + ref_data = read_off( + osp.join(self.raw_paths[0], 'null', f'{self.cat}.off')) + + train_list = [] + name = f'{self.part}_{self.cat}_*.off' + paths = glob.glob(osp.join(self.raw_paths[0], self.part, name)) + paths = [path[:-4] for path in paths] + paths = sorted(paths, key=lambda e: (len(e), e)) + + for path in paths: + data = read_off(f'{path}.off') + y = read_txt_array(f'{path}.baryc_gt') + data.y = y[:, 0].astype('int64') - 1 + data.y_baryc = y[:, 1:] + train_list.append(data) + + test_list = [] + name = f'{self.part}_{self.cat}_*.off' + paths = glob.glob(osp.join(self.raw_paths[1], self.part, name)) + paths = [path[:-4] for path in paths] + paths = sorted(paths, key=lambda e: (len(e), e)) + + for path in paths: + test_list.append(read_off(f'{path}.off')) + + if self.pre_filter is not None: + train_list = [d for d in train_list if self.pre_filter(d)] + test_list = [d for d in test_list if self.pre_filter(d)] + + if self.pre_transform is not None: + ref_data = self.pre_transform(ref_data) + train_list = [self.pre_transform(d) for d in train_list] + test_list = [self.pre_transform(d) for d in test_list] + + paddle.save(ref_data, self.processed_paths[0]) + self.save(train_list, self.processed_paths[1]) + self.save(test_list, self.processed_paths[2]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'partiality={self.part}, category={self.cat})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/snap_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/snap_dataset.py new file mode 100644 index 00000000..3e6e6be6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/snap_dataset.py @@ -0,0 +1,251 @@ +import os +import os.path as osp +from typing import Any, Callable, Dict, List, Optional, Union + +import fsspec +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.io import fs +from paddle_geometric.utils import coalesce + + +class EgoData(Data): + def __inc__(self, key: str, value: Any, *args: Any, **kwargs: Any) -> Any: + # Adjusts the 'circle' attribute based on the number of nodes in the graph + if key == 'circle': + return self.num_nodes + elif key == 'circle_batch': + return int(value.max()) + 1 if value.numel() > 0 else 0 + return super().__inc__(key, value, *args, **kwargs) + + +def read_ego(files: List[str], name: str) -> List[EgoData]: + # Reads ego networks from files + import pandas as pd + import tqdm + + files = sorted(files) + + all_featnames = [] + files = [ + x for x in files if x.split('.')[-1] in + ['circles', 'edges', 'egofeat', 'feat', 'featnames'] + ] + for i in range(4, len(files), 5): + featnames_file = files[i] + with fsspec.open(featnames_file, 'r') as f: + featnames = f.read().split('\n')[:-1] + featnames = [' '.join(x.split(' ')[1:]) for x in featnames] + all_featnames += featnames + all_featnames = sorted(list(set(all_featnames))) + all_featnames_dict = {key: i for i, key in enumerate(all_featnames)} + + data_list = [] + for i in tqdm.tqdm(range(0, len(files), 5)): + circles_file = files[i] + edges_file = files[i + 1] + egofeat_file = files[i + 2] + feat_file = files[i + 3] + featnames_file = files[i + 4] + + x = None + if name != 'gplus': # Skips reading features for the gplus dataset + x_ego = pd.read_csv(egofeat_file, sep=' ', header=None, + dtype=np.float32) + x_ego = paddle.to_tensor(x_ego.values) + + x = pd.read_csv(feat_file, sep=' ', header=None, dtype=np.float32) + x = paddle.to_tensor(x.values)[:, 1:] + + x_all = paddle.concat([x, x_ego], axis=0) + + # Reorders `x` according to `featnames` ordering + x_all = paddle.zeros([x.shape[0], len(all_featnames)]) + with fsspec.open(featnames_file, 'r') as f: + featnames = f.read().split('\n')[:-1] + featnames = [' '.join(x.split(' ')[1:]) for x in featnames] + indices = [all_featnames_dict[featname] for featname in featnames] + x_all[:, paddle.to_tensor(indices)] = x + x = x_all + + if x.shape[1] > 100_000: + x = x.to_sparse_csr() + + idx = pd.read_csv(feat_file, sep=' ', header=None, dtype=str, + usecols=[0]).squeeze() + + idx_assoc: Dict[str, int] = {} + for i, j in enumerate(idx): + idx_assoc[j] = i + + circles: List[int] = [] + circles_batch: List[int] = [] + with fsspec.open(circles_file, 'r') as f: + for i, line in enumerate(f.read().split('\n')[:-1]): + circle_indices = [idx_assoc[c] for c in line.split()[1:]] + circles += circle_indices + circles_batch += [i] * len(circle_indices) + circle = paddle.to_tensor(circles) + circle_batch = paddle.to_tensor(circles_batch) + + try: + row = pd.read_csv(edges_file, sep=' ', header=None, dtype=str, + usecols=[0]).squeeze() + col = pd.read_csv(edges_file, sep=' ', header=None, dtype=str, + usecols=[1]).squeeze() + except Exception: + continue + + row = paddle.to_tensor([idx_assoc[i] for i in row]) + col = paddle.to_tensor([idx_assoc[i] for i in col]) + + N = max(int(row.max()), int(col.max())) + 2 + N = x.shape[0] if x is not None else N + + row_ego = paddle.full([N - 1], N - 1, dtype='int64') + col_ego = paddle.arange(N - 1, dtype='int64') + + # Connects ego node to every other node + row = paddle.concat([row, row_ego, col_ego], axis=0) + col = paddle.concat([col, col_ego, row_ego], axis=0) + edge_index = paddle.stack([row, col], axis=0) + edge_index = coalesce(edge_index, num_nodes=N) + + data = EgoData(x=x, edge_index=edge_index, circle=circle, + circle_batch=circle_batch) + + data_list.append(data) + + return data_list + + +def read_soc(files: List[str], name: str) -> List[Data]: + # Reads social network datasets + import pandas as pd + + skiprows = 4 + if name == 'pokec': + skiprows = 0 + + edge_index = pd.read_csv(files[0], sep='\t', header=None, + skiprows=skiprows, dtype=np.int64) + edge_index = paddle.to_tensor(edge_index.values).t() + num_nodes = edge_index.max().item() + 1 + edge_index = coalesce(edge_index, num_nodes=num_nodes) + + return [Data(edge_index=edge_index, num_nodes=num_nodes)] + + +def read_wiki(files: List[str], name: str) -> List[Data]: + # Reads Wikipedia network datasets + import pandas as pd + + edge_index = pd.read_csv(files[0], sep='\t', header=None, skiprows=4, + dtype=np.int64) + edge_index = paddle.to_tensor(edge_index.values).t() + + idx = paddle.unique(edge_index.flatten()) + idx_assoc = paddle.full([edge_index.max() + 1], -1, dtype='int64') + idx_assoc[idx] = paddle.arange(idx.shape[0], dtype='int64') + + edge_index = idx_assoc[edge_index] + num_nodes = edge_index.max().item() + 1 + edge_index = coalesce(edge_index, num_nodes=num_nodes) + + return [Data(edge_index=edge_index, num_nodes=num_nodes)] + + +class SNAPDataset(InMemoryDataset): + # A variety of graph datasets collected from SNAP at Stanford University + + url = 'https://snap.stanford.edu/data' + + available_datasets = { + 'ego-facebook': ['facebook.tar.gz'], + 'ego-gplus': ['gplus.tar.gz'], + 'ego-twitter': ['twitter.tar.gz'], + 'soc-ca-astroph': ['ca-AstroPh.txt.gz'], + 'soc-ca-grqc': ['ca-GrQc.txt.gz'], + 'soc-epinions1': ['soc-Epinions1.txt.gz'], + 'soc-livejournal1': ['soc-LiveJournal1.txt.gz'], + 'soc-pokec': ['soc-pokec-relationships.txt.gz'], + 'soc-slashdot0811': ['soc-Slashdot0811.txt.gz'], + 'soc-slashdot0922': ['soc-Slashdot0902.txt.gz'], + 'wiki-vote': ['wiki-Vote.txt.gz'], + } + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + # Initialize dataset properties + self.name = name.lower() + assert self.name in self.available_datasets.keys() + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + # Directory for raw data + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + # Directory for processed data + return osp.join(self.root, self.name, 'processed') + + @property + def processed_file_names(self) -> str: + # Processed data file name + return 'data.pt' + + def _download(self) -> None: + if osp.isdir(self.raw_dir) and len(os.listdir(self.raw_dir)) > 0: + return + + fs.makedirs(self.raw_dir, exist_ok=True) + self.download() + + def download(self) -> None: + # Download dataset files from SNAP + for name in self.available_datasets[self.name]: + fs.cp(f'{self.url}/{name}', self.raw_dir, extract=True) + + def process(self) -> None: + # Process raw files into graph data + raw_dir = self.raw_dir + filenames = fs.ls(self.raw_dir) + if len(filenames) == 1 and fs.isdir(filenames[0]): + raw_dir = filenames[0] + + raw_files = fs.ls(raw_dir) + + data_list: Union[List[Data], List[EgoData]] + if self.name[:4] == 'ego-': + data_list = read_ego(raw_files, self.name[4:]) + elif self.name[:4] == 'soc-': + data_list = read_soc(raw_files, self.name[:4]) + elif self.name[:5] == 'wiki-': + data_list = read_wiki(raw_files, self.name[5:]) + else: + raise NotImplementedError + + if len(data_list) > 1 and self.pre_filter is not None: + data_list = [data for data in data_list if self.pre_filter(data)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(data) for data in data_list] + + self.save(data_list, self.processed_paths[0]) + + def __repr__(self) -> str: + # Display dataset name and length + return f'SNAP-{self.name}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/suite_sparse.py b/jointContribution/mattergen/paddle_geometric/datasets/suite_sparse.py new file mode 100644 index 00000000..63f54856 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/suite_sparse.py @@ -0,0 +1,102 @@ +import os.path as osp +from typing import Callable, Optional + +import fsspec +import paddle + +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.io import fs + + +class SuiteSparseMatrixCollection(InMemoryDataset): + r"""A suite of sparse matrix benchmarks known as the `Suite Sparse Matrix + Collection `_, collected from a wide range of + applications. + + Args: + root (str): Root directory where the dataset should be saved. + group (str): The group of the sparse matrix. + name (str): The name of the sparse matrix. + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + a :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://sparse.tamu.edu/mat/{}/{}.mat' + + def __init__( + self, + root: str, + group: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + # Initialize with matrix group and name + self.group = group + self.name = name + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + # Directory for raw data + return osp.join(self.root, self.group, self.name, 'raw') + + @property + def processed_dir(self) -> str: + # Directory for processed data + return osp.join(self.root, self.group, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + # Raw file name pattern + return f'{self.name}.mat' + + @property + def processed_file_names(self) -> str: + # Processed file name pattern + return 'data.pt' + + def download(self) -> None: + # Downloads the .mat file from the Suite Sparse Matrix Collection + fs.cp(self.url.format(self.group, self.name), self.raw_dir) + + def process(self) -> None: + # Process the .mat file into a graph format compatible with Paddle Geometric + from scipy.io import loadmat + + with fsspec.open(self.raw_paths[0], 'rb') as f: + mat = loadmat(f)['Problem'][0][0][2].tocsr().tocoo() + + row = paddle.to_tensor(mat.row, dtype='int64') + col = paddle.to_tensor(mat.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + value = paddle.to_tensor(mat.data, dtype='float32') + edge_attr = None if paddle.all(value == 1.0) else value + + size = mat.shape if mat.shape[0] != mat.shape[1] else None + num_nodes = mat.shape[0] + + data = Data(edge_index=edge_index, edge_attr=edge_attr, size=size, + num_nodes=num_nodes) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + # String representation for dataset object + return (f'{self.__class__.__name__}(group={self.group}, ' + f'name={self.name})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/taobao.py b/jointContribution/mattergen/paddle_geometric/datasets/taobao.py new file mode 100644 index 00000000..70a39785 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/taobao.py @@ -0,0 +1,113 @@ +import os +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import ( + HeteroData, + InMemoryDataset, + download_url, + extract_zip, +) + + +class Taobao(InMemoryDataset): + r"""The Taobao dataset, a user behavior dataset from Taobao provided by Alibaba, + available via the `Tianchi Alicloud platform + `_. + + The Taobao dataset is a heterogeneous graph for recommendation tasks. + Nodes represent users (user IDs), items (item IDs), and categories (category IDs). + Edges between users and items represent different types of user behaviors towards items, + and edges between items and categories assign each item to a set of categories. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.HeteroData` object and returns a + transformed version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.HeteroData` object and returns a transformed + version before saving to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + """ + url = ('https://alicloud-dev.oss-cn-hangzhou.aliyuncs.com/' + 'UserBehavior.csv.zip') + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0], data_cls=HeteroData) + + @property + def raw_file_names(self) -> str: + return 'UserBehavior.csv' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import pandas as pd + + # Define columns and load data + cols = ['userId', 'itemId', 'categoryId', 'behaviorType', 'timestamp'] + df = pd.read_csv(self.raw_paths[0], names=cols) + + # Filter data by time range + start = 1511539200 # Start timestamp: 2017.11.25-00:00:00 + end = 1512316799 # End timestamp: 2017.12.03-23:59:59 + df = df[(df["timestamp"] >= start) & (df["timestamp"] <= end)] + + # Remove duplicate entries + df = df.drop_duplicates() + + # Map behavior types to integers + behavior_dict = {'pv': 0, 'cart': 1, 'buy': 2, 'fav': 3} + df['behaviorType'] = df['behaviorType'].map(behavior_dict) + + num_entries = {} + for name in ['userId', 'itemId', 'categoryId']: + # Map IDs to consecutive integers + value, df[name] = np.unique(df[[name]].values, return_inverse=True) + num_entries[name] = value.shape[0] + + data = HeteroData() + + data['user'].num_nodes = num_entries['userId'] + data['item'].num_nodes = num_entries['itemId'] + data['category'].num_nodes = num_entries['categoryId'] + + # Set up user-item edges with timestamp and behavior type as edge attributes + row = paddle.to_tensor(df['userId'].values, dtype='int64') + col = paddle.to_tensor(df['itemId'].values, dtype='int64') + data['user', 'item'].edge_index = paddle.stack([row, col], axis=0) + data['user', 'item'].time = paddle.to_tensor(df['timestamp'].values, dtype='int64') + behavior = paddle.to_tensor(df['behaviorType'].values, dtype='int64') + data['user', 'item'].behavior = behavior + + # Set up item-category edges + df = df[['itemId', 'categoryId']].drop_duplicates() + row = paddle.to_tensor(df['itemId'].values, dtype='int64') + col = paddle.to_tensor(df['categoryId'].values, dtype='int64') + data['item', 'category'].edge_index = paddle.stack([row, col], axis=0) + + # Apply any pre-transformations if specified + data = data if self.pre_transform is None else self.pre_transform(data) + + # Save the processed data + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/tosca.py b/jointContribution/mattergen/paddle_geometric/datasets/tosca.py new file mode 100644 index 00000000..86439506 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/tosca.py @@ -0,0 +1,110 @@ +import glob +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import read_txt_array + + +class TOSCA(InMemoryDataset): + r"""The TOSCA dataset, from the book `"Numerical Geometry of Non-Rigid Shapes" + `_, containing 80 meshes. Meshes within the same category + have the same triangulation and an equal number of vertices, numbered in + a compatible way. + + .. note:: + + Data objects hold mesh faces instead of edge indices. + To convert the mesh to a graph, use the + :obj:`paddle_geometric.transforms.FaceToEdge` as :obj:`pre_transform`. + To convert the mesh to a point cloud, use the + :obj:`paddle_geometric.transforms.SamplePoints` as :obj:`transform` + to sample a fixed number of points on the mesh faces according to their + face area. + + Args: + root (str): Root directory where the dataset should be saved. + categories (list, optional): List of categories to include in the dataset. + Can include :obj:`"Cat"`, :obj:`"Centaur"`, :obj:`"David"`, :obj:`"Dog"`, + :obj:`"Gorilla"`, :obj:`"Horse"`, :obj:`"Michael"`, :obj:`"Victoria"`, :obj:`"Wolf"`. + If set to :obj:`None`, the dataset will contain all categories. (default: :obj:`None`) + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed version. + The data object will be transformed before every access. (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed version. + The data object will be transformed before being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in a + :obj:`paddle_geometric.data.Data` object and returns a boolean value, + indicating whether the data object should be included in the final dataset. + (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. (default: :obj:`False`) + """ + + url = 'http://tosca.cs.technion.ac.il/data/toscahires-asci.zip' + + categories = [ + 'cat', 'centaur', 'david', 'dog', 'gorilla', 'horse', 'michael', + 'victoria', 'wolf' + ] + + def __init__( + self, + root: str, + categories: Optional[List[str]] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + categories = self.categories if categories is None else categories + categories = [cat.lower() for cat in categories] + for cat in categories: + assert cat in self.categories + self.categories = categories + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['cat0.vert', 'cat0.tri'] + + @property + def processed_file_names(self) -> str: + name = '_'.join([cat[:2] for cat in self.categories]) + return f'{name}.pt' + + def download(self) -> None: + path = download_url(self.url, self.raw_dir) + extract_zip(path, self.raw_dir) + os.unlink(path) + + def process(self) -> None: + data_list = [] + for cat in self.categories: + paths = glob.glob(osp.join(self.raw_dir, f'{cat}*.tri')) + paths = [path[:-4] for path in paths] + paths = sorted(paths, key=lambda e: (len(e), e)) + + for path in paths: + pos = read_txt_array(f'{path}.vert') + face = read_txt_array(f'{path}.tri', dtype='int64') + face = face - paddle.min(face) # Ensure zero-based index. + data = Data(pos=pos, face=face.t()) + if self.pre_filter is not None and not self.pre_filter(data): + continue + if self.pre_transform is not None: + data = self.pre_transform(data) + data_list.append(data) + + self.save(data_list, self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/tu_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/tu_dataset.py new file mode 100644 index 00000000..864d6439 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/tu_dataset.py @@ -0,0 +1,138 @@ +import os.path as osp +from typing import Callable, List, Optional + +import paddle + +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.io import fs, read_tu_data + + +class TUDataset(InMemoryDataset): + r"""A variety of graph kernel benchmark datasets from TU Dortmund University + (e.g., :obj:`"IMDB-BINARY"`, :obj:`"REDDIT-BINARY"`, :obj:`"PROTEINS"`). + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The dataset name. + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before being saved to disk. + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. + force_reload (bool, optional): Whether to re-process the dataset. + use_node_attr (bool, optional): If :obj:`True`, the dataset will contain + additional continuous node attributes. + use_edge_attr (bool, optional): If :obj:`True`, the dataset will contain + additional continuous edge attributes. + cleaned (bool, optional): If :obj:`True`, the dataset will contain only + non-isomorphic graphs. + """ + url = 'https://www.chrsmrrs.com/graphkerneldatasets' + cleaned_url = ('https://raw.githubusercontent.com/nd7141/' + 'graph_datasets/master/datasets') + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + use_node_attr: bool = False, + use_edge_attr: bool = False, + cleaned: bool = False, + ) -> None: + self.name = name + self.cleaned = cleaned + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + out = fs.paddle_load(self.processed_paths[0]) + if not isinstance(out, tuple) or len(out) < 3: + raise RuntimeError( + "The 'data' object was created by an older version of Paddle Geometric. " + "If this error occurred while loading an existing dataset, remove the " + "'processed/' directory in the dataset's root folder and try again.") + + data, self.slices, self.sizes, data_cls = out + self.data = data_cls.from_dict(data) + + assert isinstance(self._data, Data) + if self._data.x is not None and not use_node_attr: + num_node_attributes = self.num_node_attributes + self._data.x = self._data.x[:, num_node_attributes:] + if self._data.edge_attr is not None and not use_edge_attr: + num_edge_attrs = self.num_edge_attributes + self._data.edge_attr = self._data.edge_attr[:, num_edge_attrs:] + + @property + def raw_dir(self) -> str: + name = f'raw{"_cleaned" if self.cleaned else ""}' + return osp.join(self.root, self.name, name) + + @property + def processed_dir(self) -> str: + name = f'processed{"_cleaned" if self.cleaned else ""}' + return osp.join(self.root, self.name, name) + + @property + def num_node_labels(self) -> int: + return self.sizes['num_node_labels'] + + @property + def num_node_attributes(self) -> int: + return self.sizes['num_node_attributes'] + + @property + def num_edge_labels(self) -> int: + return self.sizes['num_edge_labels'] + + @property + def num_edge_attributes(self) -> int: + return self.sizes['num_edge_attributes'] + + @property + def raw_file_names(self) -> List[str]: + names = ['A', 'graph_indicator'] + return [f'{self.name}_{name}.txt' for name in names] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + url = self.cleaned_url if self.cleaned else self.url + fs.cp(f'{url}/{self.name}.zip', self.raw_dir, extract=True) + for filename in fs.ls(osp.join(self.raw_dir, self.name)): + fs.mv(filename, osp.join(self.raw_dir, osp.basename(filename))) + fs.rm(osp.join(self.raw_dir, self.name)) + + def process(self) -> None: + self.data, self.slices, sizes = read_tu_data(self.raw_dir, self.name) + + if self.pre_filter is not None or self.pre_transform is not None: + data_list = [self.get(idx) for idx in range(len(self))] + + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + + self.data, self.slices = self.collate(data_list) + self._data_list = None # Reset cache. + + assert isinstance(self._data, Data) + fs.paddle_save( + (self._data.to_dict(), self.slices, sizes, self._data.__class__), + self.processed_paths[0], + ) + + def __repr__(self) -> str: + return f'{self.name}({len(self)})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/twitch.py b/jointContribution/mattergen/paddle_geometric/datasets/twitch.py new file mode 100644 index 00000000..d8c30865 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/twitch.py @@ -0,0 +1,92 @@ +import os.path as osp +from typing import Callable, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url + + +class Twitch(InMemoryDataset): + r"""The Twitch Gamer networks introduced in the + `"Multi-scale Attributed Node Embedding" + `_ paper. + Nodes represent gamers on Twitch and edges are followerships between them. + Node features represent embeddings of games played by the Twitch users. + The task is to predict whether a user streams mature content. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"DE"`, :obj:`"EN"`, + :obj:`"ES"`, :obj:`"FR"`, :obj:`"PT"`, :obj:`"RU"`). + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before being saved to disk. + force_reload (bool, optional): Whether to re-process the dataset. + + **STATS:** + + +------+--------+--------+----------+---------+ + | Name | #nodes | #edges | #features| #classes| + +------+--------+--------+----------+---------+ + | DE | 9,498 |315,774 | 128 | 2 | + | EN | 7,126 | 77,774 | 128 | 2 | + | ES | 4,648 |123,412 | 128 | 2 | + | FR | 6,551 |231,883 | 128 | 2 | + | PT | 1,912 | 64,510 | 128 | 2 | + | RU | 4,385 | 78,993 | 128 | 2 | + +------+--------+--------+----------+---------+ + """ + + url = 'https://graphmining.ai/datasets/ptg/twitch' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name + assert self.name in ['DE', 'EN', 'ES', 'FR', 'PT', 'RU'] + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> str: + return f'{self.name}.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_url(f'{self.url}/{self.name}.npz', self.raw_dir) + + def process(self) -> None: + data = np.load(self.raw_paths[0], allow_pickle=True) + x = paddle.to_tensor(data['features'], dtype=paddle.float32) + y = paddle.to_tensor(data['target'], dtype=paddle.int64) + + edge_index = paddle.to_tensor(data['edges'], dtype=paddle.int64) + edge_index = paddle.transpose(edge_index, perm=[1, 0]) + + data = Data(x=x, y=y, edge_index=edge_index) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/upfd.py b/jointContribution/mattergen/paddle_geometric/datasets/upfd.py new file mode 100644 index 00000000..0e0db0ef --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/upfd.py @@ -0,0 +1,144 @@ +import os +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_google_url, + extract_zip, +) +from paddle_geometric.io import read_txt_array +from paddle_geometric.utils import coalesce, cumsum + + +class UPFD(InMemoryDataset): + r"""The tree-structured fake news propagation graph classification dataset + from the `"User Preference-aware Fake News Detection" + `_ paper. + It includes two sets of tree-structured fake & real news propagation graphs + extracted from Twitter. + For a single graph, the root node represents the source news, and leaf + nodes represent Twitter users who retweeted the same root news. + A user node has an edge to the news node if and only if the user retweeted + the root news directly. + Two user nodes have an edge if and only if one user retweeted the root news + from the other user. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the graph set (:obj:`"politifact"`, :obj:`"gossipcop"`). + feature (str): The node feature type (:obj:`"profile"`, :obj:`"spacy"`, + :obj:`"bert"`, :obj:`"content"`). + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. + force_reload (bool, optional): Whether to re-process the dataset. + """ + file_ids = { + 'politifact': '1KOmSrlGcC50PjkvRVbyb_WoWHVql06J-', + 'gossipcop': '1VskhAQ92PrT4sWEKQ2v2-AJhEcpp4A81', + } + + def __init__( + self, + root: str, + name: str, + feature: str, + split: str = "train", + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + assert name in ['politifact', 'gossipcop'] + assert split in ['train', 'val', 'test'] + + self.root = root + self.name = name + self.feature = feature + + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + + path = self.processed_paths[['train', 'val', 'test'].index(split)] + self.load(path) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed', self.feature) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'node_graph_id.npy', 'graph_labels.npy', 'A.txt', 'train_idx.npy', + 'val_idx.npy', 'test_idx.npy', f'new_{self.feature}_feature.npz' + ] + + @property + def processed_file_names(self) -> List[str]: + return ['train.pt', 'val.pt', 'test.pt'] + + def download(self) -> None: + file_id = self.file_ids[self.name] + path = download_google_url(file_id, self.raw_dir, 'data.zip') + extract_zip(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import scipy.sparse as sp + + x = sp.load_npz(osp.join(self.raw_dir, f'new_{self.feature}_feature.npz')) + x = paddle.to_tensor(x.todense(), dtype=paddle.float32) + + edge_index = read_txt_array(osp.join(self.raw_dir, 'A.txt'), sep=',', dtype=paddle.int64).t() + edge_index = coalesce(edge_index, num_nodes=x.shape[0]) + + y = np.load(osp.join(self.raw_dir, 'graph_labels.npy')) + y = paddle.to_tensor(y, dtype=paddle.int64) + _, y = y.unique(sorted=True, return_inverse=True) + + batch = np.load(osp.join(self.raw_dir, 'node_graph_id.npy')) + batch = paddle.to_tensor(batch, dtype=paddle.int64) + + node_slice = cumsum(batch.bincount()) + edge_slice = cumsum(batch[edge_index[0]].bincount()) + graph_slice = paddle.arange(y.shape[0] + 1) + self.slices = { + 'x': node_slice, + 'edge_index': edge_slice, + 'y': graph_slice + } + + edge_index -= node_slice[batch[edge_index[0]]].reshape([1, -1]) + self.data = Data(x=x, edge_index=edge_index, y=y) + + for path, split in zip(self.processed_paths, ['train', 'val', 'test']): + idx = np.load(osp.join(self.raw_dir, f'{split}_idx.npy')).tolist() + data_list = [self.get(i) for i in idx] + if self.pre_filter is not None: + data_list = [d for d in data_list if self.pre_filter(d)] + if self.pre_transform is not None: + data_list = [self.pre_transform(d) for d in data_list] + self.save(data_list, path) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({len(self)}, name={self.name}, feature={self.feature})' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/utils/__init__.py b/jointContribution/mattergen/paddle_geometric/datasets/utils/__init__.py new file mode 100644 index 00000000..4cbaa4f0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/utils/__init__.py @@ -0,0 +1,9 @@ +from .cheatsheet import paper_link, has_stats, get_stat, get_children, get_type + +__all__ = [ + 'paper_link', + 'has_stats', + 'get_stat', + 'get_children', + 'get_type', +] diff --git a/jointContribution/mattergen/paddle_geometric/datasets/utils/cheatsheet.py b/jointContribution/mattergen/paddle_geometric/datasets/utils/cheatsheet.py new file mode 100644 index 00000000..68121d4d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/utils/cheatsheet.py @@ -0,0 +1,60 @@ +import importlib +import inspect +import re +from typing import Any, List, Optional + + +def paper_link(cls: str) -> Optional[str]: + cls = importlib.import_module('paddle_geometric.datasets').__dict__[cls] + doc = inspect.getdoc(cls) + assert doc is not None + match = re.search('<.+?>', doc, flags=re.DOTALL) + return None if match is None else match.group().replace('\n', ' ')[1:-1] + + +def get_stats_table(cls: str) -> str: + cls = importlib.import_module('paddle_geometric.datasets').__dict__[cls] + doc = inspect.getdoc(cls) + assert doc is not None + match = re.search(r'\*\*STATS:\*\*\n.*$', doc, flags=re.DOTALL) + return '' if match is None else match.group() + + +def has_stats(cls: str) -> bool: + return len(get_stats_table(cls)) > 0 + + +def get_type(cls: str) -> str: + return 'Edge' if '-' in cls else 'Node' + + +def get_stat(cls: str, name: str, child: Optional[str] = None, + default: Any = None) -> str: + if child is None and len(get_children(cls)) > 0: + return '' + + stats_table = get_stats_table(cls) + + if len(stats_table) > 0: + stats_table = '\n'.join(stats_table.split('\n')[2:]) + + match = re.search(f'^.*- {name}', stats_table, flags=re.DOTALL) + if match is None: + return default + + column = match.group().count(' -') + + if child is not None: + child = child.replace('(', r'\(').replace(')', r'\)') + match = re.search(f'[*] - {child}\n.*$', stats_table, flags=re.DOTALL) + assert match is not None + stats_row = match.group() + else: + stats_row = '*' + stats_table.split('*')[2] + + return stats_row.split(' -')[column].split('\n')[0].strip() + + +def get_children(cls: str) -> List[str]: + matches = re.findall('[*] -.*', get_stats_table(cls)) + return [match[4:] for match in matches[1:]] if len(matches) > 2 else [] diff --git a/jointContribution/mattergen/paddle_geometric/datasets/web_qsp_dataset.py b/jointContribution/mattergen/paddle_geometric/datasets/web_qsp_dataset.py new file mode 100644 index 00000000..c8044d2c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/web_qsp_dataset.py @@ -0,0 +1,243 @@ +import os +from typing import Any, Dict, List, Tuple, no_type_check + +import numpy as np +import paddle +from paddle_geometric.data import Data, InMemoryDataset +from paddle_geometric.nn.nlp import SentenceTransformer +from tqdm import tqdm + + +@no_type_check +def retrieval_via_pcst( + data: Data, + q_emb: paddle.Tensor, + textual_nodes: Any, + textual_edges: Any, + topk: int = 3, + topk_e: int = 3, + cost_e: float = 0.5, +) -> Tuple[Data, str]: + c = 0.01 + + from pcst_fast import pcst_fast + + root = -1 + num_clusters = 1 + pruning = 'gw' + verbosity_level = 0 + if topk > 0: + n_prizes = paddle.nn.functional.cosine_similarity(q_emb, data.x) + topk = min(topk, data.num_nodes) + _, topk_n_indices = paddle.topk(n_prizes, topk, largest=True) + + n_prizes = paddle.zeros_like(n_prizes) + n_prizes[topk_n_indices] = paddle.arange(topk, 0, -1, dtype='float32') + else: + n_prizes = paddle.zeros([data.num_nodes]) + + if topk_e > 0: + e_prizes = paddle.nn.functional.cosine_similarity(q_emb, data.edge_attr) + unique_e_prizes, _ = paddle.unique(e_prizes) + topk_e = min(topk_e, unique_e_prizes.size) + + topk_e_values, _ = paddle.topk(unique_e_prizes, topk_e, largest=True) + e_prizes = paddle.where(e_prizes < topk_e_values[-1], paddle.zeros_like(e_prizes), e_prizes) + last_topk_e_value = topk_e + for k in range(topk_e): + indices = (e_prizes == topk_e_values[k]) + value = min((topk_e - k) / paddle.sum(indices), last_topk_e_value - c) + e_prizes = paddle.where(indices, paddle.full_like(e_prizes, value), e_prizes) + last_topk_e_value = value * (1 - c) + cost_e = min(cost_e, e_prizes.max().item() * (1 - c / 2)) + else: + e_prizes = paddle.zeros([data.num_edges]) + + costs = [] + edges = [] + virtual_n_prizes = [] + virtual_edges = [] + virtual_costs = [] + mapping_n = {} + mapping_e = {} + for i, (src, dst) in enumerate(data.edge_index.t().numpy()): + prize_e = e_prizes[i] + if prize_e <= cost_e: + mapping_e[len(edges)] = i + edges.append((src, dst)) + costs.append(cost_e - prize_e) + else: + virtual_node_id = data.num_nodes + len(virtual_n_prizes) + mapping_n[virtual_node_id] = i + virtual_edges.append((src, virtual_node_id)) + virtual_edges.append((virtual_node_id, dst)) + virtual_costs.append(0) + virtual_costs.append(0) + virtual_n_prizes.append(prize_e - cost_e) + + prizes = np.concatenate([n_prizes.numpy(), np.array(virtual_n_prizes)]) + num_edges = len(edges) + if len(virtual_costs) > 0: + costs = np.array(costs + virtual_costs) + edges = np.array(edges + virtual_edges) + + vertices, edges = pcst_fast(edges, prizes, costs, root, num_clusters, + pruning, verbosity_level) + + selected_nodes = vertices[vertices < data.num_nodes] + selected_edges = [mapping_e[e] for e in edges if e < num_edges] + virtual_vertices = vertices[vertices >= data.num_nodes] + if len(virtual_vertices) > 0: + virtual_edges = [mapping_n[i] for i in virtual_vertices] + selected_edges = np.concatenate([selected_edges, virtual_edges]) + + edge_index = data.edge_index[:, selected_edges] + selected_nodes = np.unique( + np.concatenate( + [selected_nodes, edge_index[0].numpy(), edge_index[1].numpy()])) + + n = textual_nodes.iloc[selected_nodes] + e = textual_edges.iloc[selected_edges] + desc = n.to_csv(index=False) + '\n' + e.to_csv( + index=False, columns=['src', 'edge_attr', 'dst']) + + mapping = {n: i for i, n in enumerate(selected_nodes.tolist())} + src = [mapping[i] for i in edge_index[0].tolist()] + dst = [mapping[i] for i in edge_index[1].tolist()] + + data = Data( + x=data.x[selected_nodes], + edge_index=paddle.to_tensor([src, dst], dtype='int64'), + edge_attr=data.edge_attr[selected_edges], + ) + + return data, desc + + +class WebQSPDataset(InMemoryDataset): + r"""The WebQuestionsSP dataset of the `"The Value of Semantic Parse + Labeling for Knowledge Base Question Answering" + `_ paper. + + Args: + root (str): Root directory where the dataset should be saved. + split (str, optional): If :obj:`"train"`, loads the training dataset. + If :obj:`"val"`, loads the validation dataset. + If :obj:`"test"`, loads the test dataset. (default: :obj:`"train"`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + use_pcst (bool, optional): Whether to preprocess the dataset's graph + with PCST or return the full graphs. (default: :obj:`True`) + """ + def __init__( + self, + root: str, + split: str = "train", + force_reload: bool = False, + use_pcst: bool = True, + ) -> None: + self.use_pcst = use_pcst + super().__init__(root, force_reload=force_reload) + + if split not in {'train', 'val', 'test'}: + raise ValueError(f"Invalid 'split' argument (got {split})") + + path = self.processed_paths[['train', 'val', 'test'].index(split)] + self.load(path) + + @property + def processed_file_names(self) -> List[str]: + return ['train_data.pt', 'val_data.pt', 'test_data.pt'] + + def process(self) -> None: + import datasets + import pandas as pd + + datasets = datasets.load_dataset('rmanluo/RoG-webqsp') + + device = paddle.set_device('gpu' if paddle.is_compiled_with_cuda() else 'cpu') + model_name = 'sentence-transformers/all-roberta-large-v1' + model = SentenceTransformer(model_name).to(device) + model.eval() + + for dataset, path in zip( + [datasets['train'], datasets['validation'], datasets['test']], + self.processed_paths, + ): + questions = [example["question"] for example in dataset] + question_embs = model.encode( + questions, + batch_size=256, + output_device='cpu', + ) + + data_list = [] + for i, example in enumerate(tqdm(dataset)): + raw_nodes: Dict[str, int] = {} + raw_edges = [] + for tri in example["graph"]: + h, r, t = tri + h = h.lower() + t = t.lower() + if h not in raw_nodes: + raw_nodes[h] = len(raw_nodes) + if t not in raw_nodes: + raw_nodes[t] = len(raw_nodes) + raw_edges.append({ + "src": raw_nodes[h], + "edge_attr": r, + "dst": raw_nodes[t] + }) + nodes = pd.DataFrame([{ + "node_id": v, + "node_attr": k, + } for k, v in raw_nodes.items()], + columns=["node_id", "node_attr"]) + edges = pd.DataFrame(raw_edges, + columns=["src", "edge_attr", "dst"]) + + nodes.node_attr = nodes.node_attr.fillna("") + x = model.encode( + nodes.node_attr.tolist(), + batch_size=256, + output_device='cpu', + ) + edge_attr = model.encode( + edges.edge_attr.tolist(), + batch_size=256, + output_device='cpu', + ) + edge_index = paddle.to_tensor([ + edges.src.tolist(), + edges.dst.tolist(), + ], dtype='int64') + + question = f"Question: {example['question']}\nAnswer: " + label = ('|').join(example['answer']).lower() + data = Data( + x=x, + edge_index=edge_index, + edge_attr=edge_attr, + ) + if self.use_pcst and len(nodes) > 0 and len(edges) > 0: + data, desc = retrieval_via_pcst( + data, + question_embs[i], + nodes, + edges, + topk=3, + topk_e=5, + cost_e=0.5, + ) + else: + desc = nodes.to_csv(index=False) + "\n" + edges.to_csv( + index=False, + columns=["src", "edge_attr", "dst"], + ) + + data.question = question + data.label = label + data.desc = desc + data_list.append(data) + + self.save(data_list, path) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/webkb.py b/jointContribution/mattergen/paddle_geometric/datasets/webkb.py new file mode 100644 index 00000000..ae1cfab3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/webkb.py @@ -0,0 +1,118 @@ +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import coalesce + + +class WebKB(InMemoryDataset): + r"""The WebKB datasets used in the + `"Geom-GCN: Geometric Graph Convolutional Networks" + `_ paper. + Nodes represent web pages and edges represent hyperlinks between them. + Node features are the bag-of-words representation of web pages. + The task is to classify the nodes into one of the five categories, student, + project, course, staff, and faculty. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"Cornell"`, :obj:`"Texas"`, + :obj:`"Wisconsin"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + + **STATS:** + + - Name: WebKB + - Nodes: Varies by dataset + - Edges: Varies by dataset + - Features: Bag-of-words + - Classes: 5 (student, project, course, staff, faculty) + """ + + url = 'https://raw.githubusercontent.com/graphdml-uiuc-jlu/geom-gcn/master' + + def __init__( + self, + root: str, + name: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + assert self.name in ['cornell', 'texas', 'wisconsin'] + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> List[str]: + out = ['out1_node_feature_label.txt', 'out1_graph_edges.txt'] + out += [f'{self.name}_split_0.6_0.2_{i}.npz' for i in range(10)] + return out + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for f in self.raw_file_names[:2]: + download_url(f'{self.url}/new_data/{self.name}/{f}', self.raw_dir) + for f in self.raw_file_names[2:]: + download_url(f'{self.url}/splits/{f}', self.raw_dir) + + def process(self) -> None: + with open(self.raw_paths[0]) as f: + lines = f.read().split('\n')[1:-1] + xs = [[float(value) for value in line.split('\t')[1].split(',')] + for line in lines] + x = paddle.to_tensor(xs, dtype='float32') + + ys = [int(line.split('\t')[2]) for line in lines] + y = paddle.to_tensor(ys, dtype='int64') + + with open(self.raw_paths[1]) as f: + lines = f.read().split('\n')[1:-1] + edge_indices = [[int(value) for value in line.split('\t')] + for line in lines] + edge_index = paddle.to_tensor(edge_indices).t() + edge_index = coalesce(edge_index, num_nodes=x.shape[0]) + + train_masks, val_masks, test_masks = [], [], [] + for path in self.raw_paths[2:]: + tmp = np.load(path) + train_masks += [paddle.to_tensor(tmp['train_mask'], dtype='bool')] + val_masks += [paddle.to_tensor(tmp['val_mask'], dtype='bool')] + test_masks += [paddle.to_tensor(tmp['test_mask'], dtype='bool')] + train_mask = paddle.stack(train_masks, axis=1) + val_mask = paddle.stack(val_masks, axis=1) + test_mask = paddle.stack(test_masks, axis=1) + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + data = data if self.pre_transform is None else self.pre_transform(data) + self.save([data], self.processed_paths[0]) + + def __repr__(self) -> str: + return f'{self.name}()' diff --git a/jointContribution/mattergen/paddle_geometric/datasets/wikics.py b/jointContribution/mattergen/paddle_geometric/datasets/wikics.py new file mode 100644 index 00000000..a4f4a318 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/wikics.py @@ -0,0 +1,95 @@ +import json +import warnings +from itertools import chain +from typing import Callable, List, Optional + +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import to_undirected + + +class WikiCS(InMemoryDataset): + r"""The semi-supervised Wikipedia-based dataset from the + `"Wiki-CS: A Wikipedia-Based Benchmark for Graph Neural Networks" + `_ paper, containing 11,701 nodes, + 216,123 edges, 10 classes and 20 different training splits. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + is_undirected (bool, optional): Whether the graph is undirected. + (default: :obj:`True`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = 'https://github.com/pmernyei/wiki-cs-dataset/raw/master/dataset' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + is_undirected: Optional[bool] = None, + force_reload: bool = False, + ) -> None: + if is_undirected is None: + warnings.warn( + f"The {self.__class__.__name__} dataset now returns an " + f"undirected graph by default. Please explicitly specify " + f"'is_undirected=False' to restore the old behavior.") + is_undirected = True + self.is_undirected = is_undirected + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['data.json'] + + @property + def processed_file_names(self) -> str: + return 'data_undirected.pt' if self.is_undirected else 'data.pt' + + def download(self) -> None: + for name in self.raw_file_names: + download_url(f'{self.url}/{name}', self.raw_dir) + + def process(self) -> None: + with open(self.raw_paths[0]) as f: + data = json.load(f) + + x = paddle.to_tensor(data['features'], dtype='float32') + y = paddle.to_tensor(data['labels'], dtype='int64') + + edges = [[(i, j) for j in js] for i, js in enumerate(data['links'])] + edges = list(chain(*edges)) + edge_index = paddle.to_tensor(edges, dtype='int64').t() + if self.is_undirected: + edge_index = to_undirected(edge_index, num_nodes=x.shape[0]) + + train_mask = paddle.to_tensor(data['train_masks'], dtype='bool').t() + + val_mask = paddle.to_tensor(data['val_masks'], dtype='bool').t() + + test_mask = paddle.to_tensor(data['test_mask'], dtype='bool') + + stopping_mask = paddle.to_tensor(data['stopping_masks'], dtype='bool').t() + + data = Data(x=x, y=y, edge_index=edge_index, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask, + stopping_mask=stopping_mask) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/wikidata.py b/jointContribution/mattergen/paddle_geometric/datasets/wikidata.py new file mode 100644 index 00000000..cd03017d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/wikidata.py @@ -0,0 +1,133 @@ +import os +import os.path as osp +from typing import Callable, Dict, List, Optional + +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url, extract_tar +from paddle_geometric.io import fs + + +class Wikidata5M(InMemoryDataset): + r"""The Wikidata-5M dataset from the `"KEPLER: A Unified Model for + Knowledge Embedding and Pre-trained Language Representation" + `_ paper, + containing 4,594,485 entities, 822 relations, + 20,614,279 train triples, 5,163 validation triples, and 5,133 test triples. + + `Wikidata-5M `_ + is a large-scale knowledge graph dataset with aligned corpus + extracted from Wikidata. + + Args: + root (str): Root directory where the dataset should be saved. + setting (str, optional): + If :obj:`"transductive"`, loads the transductive dataset. + If :obj:`"inductive"`, loads the inductive dataset. + (default: :obj:`"transductive"`) + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + a :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + def __init__( + self, + root: str, + setting: str = 'transductive', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + if setting not in {'transductive', 'inductive'}: + raise ValueError(f"Invalid 'setting' argument (got '{setting}')") + + self.setting = setting + + self.urls = [ + ('https://www.dropbox.com/s/7jp4ib8zo3i6m10/' + 'wikidata5m_text.txt.gz?dl=1'), + 'https://uni-bielefeld.sciebo.de/s/yuBKzBxsEc9j3hy/download', + ] + if self.setting == 'inductive': + self.urls.append('https://www.dropbox.com/s/csed3cgal3m7rzo/' + 'wikidata5m_inductive.tar.gz?dl=1') + else: + self.urls.append('https://www.dropbox.com/s/6sbhm0rwo4l73jq/' + 'wikidata5m_transductive.tar.gz?dl=1') + + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'wikidata5m_text.txt.gz', + 'download', + f'wikidata5m_{self.setting}_train.txt', + f'wikidata5m_{self.setting}_valid.txt', + f'wikidata5m_{self.setting}_test.txt', + ] + + @property + def processed_file_names(self) -> str: + return f'{self.setting}_data.pt' + + def download(self) -> None: + for url in self.urls: + download_url(url, self.raw_dir) + path = osp.join(self.raw_dir, f'wikidata5m_{self.setting}.tar.gz') + extract_tar(path, self.raw_dir) + os.remove(path) + + def process(self) -> None: + import gzip + + entity_to_id: Dict[str, int] = {} + with gzip.open(self.raw_paths[0], 'rt') as f: + for i, line in enumerate(f): + values = line.strip().split('\t') + entity_to_id[values[0]] = i + + x = fs.paddle_load(self.raw_paths[1]) + + edge_indices = [] + edge_types = [] + split_indices = [] + + rel_to_id: Dict[str, int] = {} + for split, path in enumerate(self.raw_paths[2:]): + with open(path) as f: + for line in f: + head, rel, tail = line.strip().split('\t') + src = entity_to_id[head] + dst = entity_to_id[tail] + edge_indices.append([src, dst]) + if rel not in rel_to_id: + rel_to_id[rel] = len(rel_to_id) + edge_types.append(rel_to_id[rel]) + split_indices.append(split) + + edge_index = paddle.to_tensor(edge_indices).t() + edge_type = paddle.to_tensor(edge_types, dtype='int64') + split_index = paddle.to_tensor(split_indices, dtype='int64') + + data = Data( + x=x, + edge_index=edge_index, + edge_type=edge_type, + train_mask=split_index == 0, + val_mask=split_index == 1, + test_mask=split_index == 2, + ) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/wikipedia_network.py b/jointContribution/mattergen/paddle_geometric/datasets/wikipedia_network.py new file mode 100644 index 00000000..cdd3f34e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/wikipedia_network.py @@ -0,0 +1,147 @@ +import os.path as osp +from typing import Callable, List, Optional, Union + +import numpy as np +import paddle + +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import coalesce + + +class WikipediaNetwork(InMemoryDataset): + r"""The Wikipedia networks introduced in the + `"Multi-scale Attributed Node Embedding" + `_ paper. + Nodes represent web pages and edges represent hyperlinks between them. + Node features represent several informative nouns in the Wikipedia pages. + The task is to predict the average daily traffic of the web page. + + Args: + root (str): Root directory where the dataset should be saved. + name (str): The name of the dataset (:obj:`"chameleon"`, + :obj:`"crocodile"`, :obj:`"squirrel"`). + geom_gcn_preprocess (bool): If set to :obj:`True`, will load the + pre-processed data as introduced in the `"Geom-GCN: Geometric + Graph Convolutional Networks" _`, + in which the average monthly traffic of the web page is converted + into five categories to predict. + If set to :obj:`True`, the dataset :obj:`"crocodile"` is not + available. + If set to :obj:`True`, train/validation/test splits will be + available as masks for multiple splits with shape + :obj:`[num_nodes, num_splits]`. (default: :obj:`True`) + transform (callable, optional): A function/transform that takes in a + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + a :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + raw_url = 'https://graphmining.ai/datasets/ptg/wiki' + processed_url = ('https://raw.githubusercontent.com/graphdml-uiuc-jlu/' + 'geom-gcn/f1fc0d14b3b019c562737240d06ec83b07d16a8f') + + def __init__( + self, + root: str, + name: str, + geom_gcn_preprocess: bool = True, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.name = name.lower() + self.geom_gcn_preprocess = geom_gcn_preprocess + assert self.name in ['chameleon', 'crocodile', 'squirrel'] + if geom_gcn_preprocess and self.name == 'crocodile': + raise AttributeError("The dataset 'crocodile' is not available in " + "case 'geom_gcn_preprocess=True'") + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + if self.geom_gcn_preprocess: + return osp.join(self.root, self.name, 'geom_gcn', 'raw') + else: + return osp.join(self.root, self.name, 'raw') + + @property + def processed_dir(self) -> str: + if self.geom_gcn_preprocess: + return osp.join(self.root, self.name, 'geom_gcn', 'processed') + else: + return osp.join(self.root, self.name, 'processed') + + @property + def raw_file_names(self) -> Union[List[str], str]: + if self.geom_gcn_preprocess: + return (['out1_node_feature_label.txt', 'out1_graph_edges.txt'] + + [f'{self.name}_split_0.6_0.2_{i}.npz' for i in range(10)]) + else: + return f'{self.name}.npz' + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + if self.geom_gcn_preprocess: + for filename in self.raw_file_names[:2]: + url = f'{self.processed_url}/new_data/{self.name}/{filename}' + download_url(url, self.raw_dir) + for filename in self.raw_file_names[2:]: + url = f'{self.processed_url}/splits/{filename}' + download_url(url, self.raw_dir) + else: + download_url(f'{self.raw_url}/{self.name}.npz', self.raw_dir) + + def process(self) -> None: + if self.geom_gcn_preprocess: + with open(self.raw_paths[0]) as f: + lines = f.read().split('\n')[1:-1] + xs = [[float(value) for value in line.split('\t')[1].split(',')] + for line in lines] + x = paddle.to_tensor(xs, dtype=paddle.float32) + ys = [int(line.split('\t')[2]) for line in lines] + y = paddle.to_tensor(ys, dtype=paddle.int64) + + with open(self.raw_paths[1]) as f: + lines = f.read().split('\n')[1:-1] + edge_indices = [[int(value) for value in line.split('\t')] + for line in lines] + edge_index = paddle.to_tensor(edge_indices, dtype=paddle.int64).t() + edge_index = coalesce(edge_index, num_nodes=x.shape[0]) + + train_masks, val_masks, test_masks = [], [], [] + for filepath in self.raw_paths[2:]: + masks = np.load(filepath) + train_masks += [paddle.to_tensor(masks['train_mask'], dtype=paddle.bool)] + val_masks += [paddle.to_tensor(masks['val_mask'], dtype=paddle.bool)] + test_masks += [paddle.to_tensor(masks['test_mask'], dtype=paddle.bool)] + train_mask = paddle.stack(train_masks, axis=1) + val_mask = paddle.stack(val_masks, axis=1) + test_mask = paddle.stack(test_masks, axis=1) + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + + else: + raw_data = np.load(self.raw_paths[0], 'r', allow_pickle=True) + x = paddle.to_tensor(raw_data['features'], dtype=paddle.float32) + edge_index = paddle.to_tensor(raw_data['edges'], dtype=paddle.int64).t() + edge_index = coalesce(edge_index, num_nodes=x.shape[0]) + y = paddle.to_tensor(raw_data['target'], dtype=paddle.float32) + + data = Data(x=x, edge_index=edge_index, y=y) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/willow_object_class.py b/jointContribution/mattergen/paddle_geometric/datasets/willow_object_class.py new file mode 100644 index 00000000..30e732e8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/willow_object_class.py @@ -0,0 +1,188 @@ +import glob +import os +import os.path as osp +from typing import Callable, List, Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.io import DataLoader + +from paddle_geometric.data import ( + Data, + InMemoryDataset, + download_url, + extract_zip, +) +from paddle_geometric.io import fs + + +class WILLOWObjectClass(InMemoryDataset): + r"""The WILLOW-ObjectClass dataset from the `"Learning Graphs to Match" + `_ paper, + containing 10 equal keypoints of at least 40 images in each category. + The keypoints contain interpolated features from a pre-trained VGG16 model + on ImageNet (:obj:`relu4_2` and :obj:`relu5_1`). + + Args: + root (str): Root directory where the dataset should be saved. + category (str): The category of the images (one of :obj:`"Car"`, + :obj:`"Duck"`, :obj:`"Face"`, :obj:`"Motorbike"`, + :obj:`"Winebottle"`). + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`paddle_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + device (str or paddle.CUDAPlace, optional): The device to use for + processing the raw data. If set to :obj:`None`, will utilize + GPU-processing if available. (default: :obj:`None`) + """ + url = ('http://www.di.ens.fr/willow/research/graphlearning/' + 'WILLOW-ObjectClass_dataset.zip') + + categories = ['face', 'motorbike', 'car', 'duck', 'winebottle'] + + batch_size = 32 + + def __init__( + self, + root: str, + category: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + device: Optional[str] = None, + ) -> None: + if device is None: + device = paddle.set_device('gpu' if paddle.is_compiled_with_cuda() else 'cpu') + + assert category.lower() in self.categories + self.category = category + self.device = device + super().__init__(root, transform, pre_transform, pre_filter, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_dir(self) -> str: + return osp.join(self.root, 'raw') + + @property + def processed_dir(self) -> str: + return osp.join(self.root, self.category.capitalize(), 'processed') + + @property + def raw_file_names(self) -> List[str]: + return [category.capitalize() for category in self.categories] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.unlink(path) + os.unlink(osp.join(self.root, 'README')) + os.unlink(osp.join(self.root, 'demo_showAnno.m')) + fs.rm(self.raw_dir) + os.rename(osp.join(self.root, 'WILLOW-ObjectClass'), self.raw_dir) + + def process(self) -> None: + from paddle.vision import models + from paddle.vision.transforms import Compose, Normalize, ToTensor + from PIL import Image + from scipy.io import loadmat + + category = self.category.capitalize() + names = glob.glob(osp.join(self.raw_dir, category, '*.png')) + names = sorted([name[:-4] for name in names]) + + vgg16_outputs = [] + + def hook(layer: paddle.nn.Layer, x: Tensor, y: Tensor) -> None: + vgg16_outputs.append(y.cpu()) + + vgg16 = models.vgg16(pretrained=True) + vgg16.eval() + vgg16.features[20].register_forward_post_hook(hook) # relu4_2 + vgg16.features[25].register_forward_post_hook(hook) # relu5_1 + + transform = Compose([ + ToTensor(), + Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) + ]) + + data_list = [] + for name in names: + pos = loadmat(f'{name}.mat')['pts_coord'] + x, y = paddle.to_tensor(pos[:, 0]), paddle.to_tensor(pos[:, 1]) + pos = paddle.stack([x, y], axis=1) + + # The "face" category contains a single image with less than 10 + # keypoints, so we need to skip it. + if pos.shape[0] != 10: + continue + + with open(f'{name}.png', 'rb') as f: + img = Image.open(f).convert('RGB') + + # Rescale keypoints. + pos[:, 0] = pos[:, 0] * 256.0 / (img.size[0]) + pos[:, 1] = pos[:, 1] * 256.0 / (img.size[1]) + + img = img.resize((256, 256), resample=Image.Resampling.BICUBIC) + img = transform(img) + + data = Data(img=img, pos=pos, name=name) + data_list.append(data) + + imgs = [data.img for data in data_list] + loader = DataLoader( + dataset=imgs, + batch_size=self.batch_size, + shuffle=False, + ) + for i, batch_img in enumerate(loader): + vgg16_outputs.clear() + + with paddle.no_grad(): + vgg16(batch_img) + + out1 = F.interpolate(vgg16_outputs[0], size=(256, 256), mode='bilinear', + align_corners=False) + out2 = F.interpolate(vgg16_outputs[1], size=(256, 256), mode='bilinear', + align_corners=False) + + for j in range(out1.shape[0]): + data = data_list[i * self.batch_size + j] + idx = paddle.to_tensor(data.pos.round().astype('int64').clip(0, 255)) + x_1 = out1[j, :, idx[:, 1], idx[:, 0]] + x_2 = out2[j, :, idx[:, 1], idx[:, 0]] + data.img = None + data.x = paddle.concat([x_1.t(), x_2.t()], axis=-1) + del out1 + del out2 + + if self.pre_filter is not None: + data_list = [data for data in data_list if self.pre_filter(data)] + + if self.pre_transform is not None: + data_list = [self.pre_transform(data) for data in data_list] + + self.save(data_list, self.processed_paths[0]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({len(self)}, ' + f'category={self.category})') diff --git a/jointContribution/mattergen/paddle_geometric/datasets/word_net.py b/jointContribution/mattergen/paddle_geometric/datasets/word_net.py new file mode 100644 index 00000000..ba30d539 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/word_net.py @@ -0,0 +1,198 @@ +from itertools import chain +from typing import Callable, List, Optional + +import paddle +from paddle import Tensor +from paddle_geometric.data import Data, InMemoryDataset, download_url +from paddle_geometric.utils import index_sort + + +class WordNet18(InMemoryDataset): + r"""The WordNet18 dataset from the `"Translating Embeddings for Modeling + Multi-Relational Data" + `_ paper, + containing 40,943 entities, 18 relations and 151,442 fact triplets, + *e.g.*, furniture includes bed. + + Args: + root (str): Root directory where the dataset should be saved. + transform (callable, optional): A function/transform that takes in an + :obj:`paddle_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`paddle_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + force_reload (bool, optional): Whether to re-process the dataset. + (default: :obj:`False`) + """ + + url = ('https://raw.githubusercontent.com/villmow/' + 'datasets_knowledge_embedding/master/WN18/original') + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['train.txt', 'valid.txt', 'test.txt'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for filename in self.raw_file_names: + download_url(f'{self.url}/{filename}', self.raw_dir) + + def process(self) -> None: + srcs, dsts, edge_types = [], [], [] + for path in self.raw_paths: + with open(path) as f: + edges = [int(x) for x in f.read().split()[1:]] + edge = paddle.to_tensor(edges, dtype='int64') + srcs.append(edge[::3]) + dsts.append(edge[1::3]) + edge_types.append(edge[2::3]) + + src = paddle.concat(srcs, axis=0) + dst = paddle.concat(dsts, axis=0) + edge_type = paddle.concat(edge_types, axis=0) + + train_mask = paddle.zeros(src.shape[0], dtype='bool') + train_mask[:srcs[0].shape[0]] = True + val_mask = paddle.zeros(src.shape[0], dtype='bool') + val_mask[srcs[0].shape[0]:srcs[0].shape[0] + srcs[1].shape[0]] = True + test_mask = paddle.zeros(src.shape[0], dtype='bool') + test_mask[srcs[0].shape[0] + srcs[1].shape[0]:] = True + + num_nodes = max(int(src.max()), int(dst.max())) + 1 + _, perm = index_sort(num_nodes * src + dst) + + edge_index = paddle.stack([src[perm], dst[perm]], axis=0) + edge_type = edge_type[perm] + train_mask = train_mask[perm] + val_mask = val_mask[perm] + test_mask = test_mask[perm] + + data = Data( + edge_index=edge_index, + edge_type=edge_type, + train_mask=train_mask, + val_mask=val_mask, + test_mask=test_mask, + num_nodes=num_nodes, + ) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) + + +class WordNet18RR(InMemoryDataset): + r"""The WordNet18RR dataset from the `"Convolutional 2D Knowledge Graph + Embeddings" `_ paper, containing 40,943 + entities, 11 relations and 93,003 fact triplets. + """ + + url = ('https://raw.githubusercontent.com/villmow/' + 'datasets_knowledge_embedding/master/WN18RR/original') + + edge2id = { + '_also_see': 0, + '_derivationally_related_form': 1, + '_has_part': 2, + '_hypernym': 3, + '_instance_hypernym': 4, + '_member_meronym': 5, + '_member_of_domain_region': 6, + '_member_of_domain_usage': 7, + '_similar_to': 8, + '_synset_domain_topic_of': 9, + '_verb_group': 10, + } + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, + force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['train.txt', 'valid.txt', 'test.txt'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + for filename in self.raw_file_names: + download_url(f'{self.url}/{filename}', self.raw_dir) + + def process(self) -> None: + node2id, idx = {}, 0 + + srcs, dsts, edge_types = [], [], [] + for path in self.raw_paths: + with open(path) as f: + edges = f.read().split() + + _src = edges[::3] + _dst = edges[2::3] + _edge_type = edges[1::3] + + for i in chain(_src, _dst): + if i not in node2id: + node2id[i] = idx + idx += 1 + + srcs.append(paddle.to_tensor([node2id[i] for i in _src])) + dsts.append(paddle.to_tensor([node2id[i] for i in _dst])) + edge_types.append( + paddle.to_tensor([self.edge2id[i] for i in _edge_type])) + + src = paddle.concat(srcs, axis=0) + dst = paddle.concat(dsts, axis=0) + edge_type = paddle.concat(edge_types, axis=0) + + train_mask = paddle.zeros(src.shape[0], dtype='bool') + train_mask[:srcs[0].shape[0]] = True + val_mask = paddle.zeros(src.shape[0], dtype='bool') + val_mask[srcs[0].shape[0]:srcs[0].shape[0] + srcs[1].shape[0]] = True + test_mask = paddle.zeros(src.shape[0], dtype='bool') + test_mask[srcs[0].shape[0] + srcs[1].shape[0]:] = True + + num_nodes = max(int(src.max()), int(dst.max())) + 1 + _, perm = index_sort(num_nodes * src + dst) + + edge_index = paddle.stack([src[perm], dst[perm]], axis=0) + edge_type = edge_type[perm] + train_mask = train_mask[perm] + val_mask = val_mask[perm] + test_mask = test_mask[perm] + + data = Data(edge_index=edge_index, edge_type=edge_type, + train_mask=train_mask, val_mask=val_mask, + test_mask=test_mask, num_nodes=num_nodes) + + if self.pre_transform is not None: + data = self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/yelp.py b/jointContribution/mattergen/paddle_geometric/datasets/yelp.py new file mode 100644 index 00000000..9b64d867 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/yelp.py @@ -0,0 +1,82 @@ +import json +import os.path as osp +from typing import Callable, List, Optional + +import numpy as np +import paddle +from paddle_geometric.data import Data, InMemoryDataset, download_google_url + + +class Yelp(InMemoryDataset): + r"""The Yelp dataset from the `"GraphSAINT: Graph Sampling Based + Inductive Learning Method" `_ paper, + containing customer reviewers and their friendship. + """ + + adj_full_id = '1Juwx8HtDwSzmVIJ31ooVa1WljI4U5JnA' + feats_id = '1Zy6BZH_zLEjKlEFSduKE5tV9qqA_8VtM' + class_map_id = '1VUcBGr0T0-klqerjAjxRmAqFuld_SMWU' + role_id = '1NI5pa5Chpd-52eSmLW60OnB3WS5ikxq_' + + def __init__( + self, + root: str, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + super().__init__(root, transform, pre_transform, force_reload=force_reload) + self.load(self.processed_paths[0]) + + @property + def raw_file_names(self) -> List[str]: + return ['adj_full.npz', 'feats.npy', 'class_map.json', 'role.json'] + + @property + def processed_file_names(self) -> str: + return 'data.pt' + + def download(self) -> None: + download_google_url(self.adj_full_id, self.raw_dir, 'adj_full.npz') + download_google_url(self.feats_id, self.raw_dir, 'feats.npy') + download_google_url(self.class_map_id, self.raw_dir, 'class_map.json') + download_google_url(self.role_id, self.raw_dir, 'role.json') + + def process(self) -> None: + import scipy.sparse as sp + + f = np.load(osp.join(self.raw_dir, 'adj_full.npz')) + adj = sp.csr_matrix((f['data'], f['indices'], f['indptr']), f['shape']) + adj = adj.tocoo() + row = paddle.to_tensor(adj.row, dtype='int64') + col = paddle.to_tensor(adj.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + x = np.load(osp.join(self.raw_dir, 'feats.npy')) + x = paddle.to_tensor(x, dtype='float32') + + ys = [-1] * x.shape[0] + with open(osp.join(self.raw_dir, 'class_map.json')) as f: + class_map = json.load(f) + for key, item in class_map.items(): + ys[int(key)] = item + y = paddle.to_tensor(ys, dtype='int64') + + with open(osp.join(self.raw_dir, 'role.json')) as f: + role = json.load(f) + + train_mask = paddle.zeros([x.shape[0]], dtype='bool') + train_mask[paddle.to_tensor(role['tr'])] = True + + val_mask = paddle.zeros([x.shape[0]], dtype='bool') + val_mask[paddle.to_tensor(role['va'])] = True + + test_mask = paddle.zeros([x.shape[0]], dtype='bool') + test_mask[paddle.to_tensor(role['te'])] = True + + data = Data(x=x, edge_index=edge_index, y=y, train_mask=train_mask, + val_mask=val_mask, test_mask=test_mask) + + data = data if self.pre_transform is None else self.pre_transform(data) + + self.save([data], self.processed_paths[0]) diff --git a/jointContribution/mattergen/paddle_geometric/datasets/zinc.py b/jointContribution/mattergen/paddle_geometric/datasets/zinc.py new file mode 100644 index 00000000..d6a05a12 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/datasets/zinc.py @@ -0,0 +1,104 @@ +import os +import os.path as osp +import pickle +from typing import Callable, List, Optional + +import paddle +from tqdm import tqdm +from paddle_geometric.data import Data, InMemoryDataset, download_url, extract_zip +from paddle_geometric.io import fs + + +class ZINC(InMemoryDataset): + r"""The ZINC dataset from the `ZINC database + `_ and the + `"Automatic Chemical Design Using a Data-Driven Continuous Representation + of Molecules" `_ paper, containing about + 250,000 molecular graphs with up to 38 heavy atoms. + """ + + url = 'https://www.dropbox.com/s/feo9qle74kg48gy/molecules.zip?dl=1' + split_url = ('https://raw.githubusercontent.com/graphdeeplearning/' + 'benchmarking-gnns/master/data/molecules/{}.index') + + def __init__( + self, + root: str, + subset: bool = False, + split: str = 'train', + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + force_reload: bool = False, + ) -> None: + self.subset = subset + assert split in ['train', 'val', 'test'] + super().__init__(root, transform, pre_transform, pre_filter, force_reload=force_reload) + path = osp.join(self.processed_dir, f'{split}.pt') + self.load(path) + + @property + def raw_file_names(self) -> List[str]: + return [ + 'train.pickle', 'val.pickle', 'test.pickle', 'train.index', + 'val.index', 'test.index' + ] + + @property + def processed_dir(self) -> str: + name = 'subset' if self.subset else 'full' + return osp.join(self.root, name, 'processed') + + @property + def processed_file_names(self) -> List[str]: + return ['train.pt', 'val.pt', 'test.pt'] + + def download(self) -> None: + fs.rm(self.raw_dir) + path = download_url(self.url, self.root) + extract_zip(path, self.root) + os.rename(osp.join(self.root, 'molecules'), self.raw_dir) + os.unlink(path) + + for split in ['train', 'val', 'test']: + download_url(self.split_url.format(split), self.raw_dir) + + def process(self) -> None: + for split in ['train', 'val', 'test']: + with open(osp.join(self.raw_dir, f'{split}.pickle'), 'rb') as f: + mols = pickle.load(f) + + indices = list(range(len(mols))) + + if self.subset: + with open(osp.join(self.raw_dir, f'{split}.index')) as f: + indices = [int(x) for x in f.read()[:-1].split(',')] + + pbar = tqdm(total=len(indices)) + pbar.set_description(f'Processing {split} dataset') + + data_list = [] + for idx in indices: + mol = mols[idx] + + x = paddle.to_tensor(mol['atom_type'], dtype='int64').reshape([-1, 1]) + y = paddle.to_tensor(mol['logP_SA_cycle_normalized'], dtype='float32') + + adj = mol['bond_type'] + edge_index = paddle.nonzero(adj).t() + edge_attr = paddle.to_tensor(adj[edge_index[0], edge_index[1]], dtype='int64') + + data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y) + + if self.pre_filter is not None and not self.pre_filter(data): + continue + + if self.pre_transform is not None: + data = self.pre_transform(data) + + data_list.append(data) + pbar.update(1) + + pbar.close() + + self.save(data_list, osp.join(self.processed_dir, f'{split}.pt')) diff --git a/jointContribution/mattergen/paddle_geometric/debug.py b/jointContribution/mattergen/paddle_geometric/debug.py new file mode 100644 index 00000000..2846110d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/debug.py @@ -0,0 +1,51 @@ +from typing import Any + +__debug_flag__ = {'enabled': False} + + +def is_debug_enabled() -> bool: + r"""Returns :obj:`True` if the debug mode is enabled.""" + return __debug_flag__['enabled'] + + +def set_debug_enabled(mode: bool) -> None: + __debug_flag__['enabled'] = mode + + +class debug: + r"""Context-manager that enables the debug mode to help track down errors + and separate usage errors from real bugs. + + .. code-block:: python + + with paddle_geometric.debug(): + out = model(data.x, data.edge_index) + """ + def __init__(self) -> None: + self.prev = is_debug_enabled() + + def __enter__(self) -> None: + set_debug_enabled(True) + + def __exit__(self, *args: Any) -> None: + set_debug_enabled(self.prev) + + +class set_debug: + r"""Context-manager that sets the debug mode on or off. + + :class:`set_debug` will enable or disable the debug mode based on its + argument :attr:`mode`. + It can be used as a context-manager or as a function. + + See :class:`debug` above for more details. + """ + def __init__(self, mode: bool) -> None: + self.prev = is_debug_enabled() + set_debug_enabled(mode) + + def __enter__(self) -> None: + pass + + def __exit__(self, *args: Any) -> None: + set_debug_enabled(self.prev) diff --git a/jointContribution/mattergen/paddle_geometric/deprecation.py b/jointContribution/mattergen/paddle_geometric/deprecation.py new file mode 100644 index 00000000..dfb847a0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/deprecation.py @@ -0,0 +1,31 @@ +import functools +import inspect +import warnings +from typing import Any, Callable, Optional + + +def deprecated( + details: Optional[str] = None, + func_name: Optional[str] = None, +) -> Callable: + def decorator(func: Callable) -> Callable: + name = func_name or func.__name__ + + if inspect.isclass(func): + cls = type(func.__name__, (func, ), {}) + cls.__init__ = deprecated(details, name)( # type: ignore + func.__init__) + cls.__doc__ = func.__doc__ + return cls + + @functools.wraps(func) + def wrapper(*args: Any, **kwargs: Any) -> Any: + out = f"'{name}' is deprecated" + if details is not None: + out += f", {details}" + warnings.warn(out) + return func(*args, **kwargs) + + return wrapper + + return decorator diff --git a/jointContribution/mattergen/paddle_geometric/device.py b/jointContribution/mattergen/paddle_geometric/device.py new file mode 100644 index 00000000..fa27ac99 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/device.py @@ -0,0 +1,37 @@ +from typing import Any +import paddle + + +def is_mps_available() -> bool: + """ + Returns a bool indicating if Metal Performance Shaders (MPS) is currently available in PaddlePaddle. + Note: PaddlePaddle does not support MPS directly, so this always returns False. + """ + # Placeholder for PaddlePaddle as it doesn't support MPS + return False + + +def is_xpu_available() -> bool: + """ + Returns a bool indicating if XPU (Intel Extension for PaddlePaddle) is currently available. + """ + try: + from paddle_xpu import is_compiled_with_xpu + return is_compiled_with_xpu() + except ImportError: + return False + + +def device(device: Any) -> paddle.device: + """ + Returns a PaddlePaddle device. + + If 'auto' is specified, returns the optimal device depending on available hardware. + """ + if device != 'auto': + return paddle.device.set_device(device) + if paddle.device.is_compiled_with_cuda(): + return paddle.device.set_device('gpu') + if is_xpu_available(): + return paddle.device.set_device('xpu') + return paddle.device.set_device('cpu') \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/distributed/__init__.py b/jointContribution/mattergen/paddle_geometric/distributed/__init__.py new file mode 100644 index 00000000..d452b2a7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/__init__.py @@ -0,0 +1,19 @@ +from .dist_context import DistContext +from .local_feature_store import LocalFeatureStore +from .local_graph_store import LocalGraphStore +from .partition import Partitioner +from .dist_neighbor_sampler import DistNeighborSampler +from .dist_loader import DistLoader +from .dist_neighbor_loader import DistNeighborLoader +from .dist_link_neighbor_loader import DistLinkNeighborLoader + +__all__ = classes = [ + 'DistContext', + 'LocalFeatureStore', + 'LocalGraphStore', + 'Partitioner', + 'DistNeighborSampler', + 'DistLoader', + 'DistNeighborLoader', + 'DistLinkNeighborLoader', +] diff --git a/jointContribution/mattergen/paddle_geometric/distributed/dist_context.py b/jointContribution/mattergen/paddle_geometric/distributed/dist_context.py new file mode 100644 index 00000000..5b3e72f7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/dist_context.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from enum import Enum + + +class DistRole(Enum): + WORKER = 1 + + +@dataclass +class DistContext: + r"""Context information of the current process.""" + rank: int + global_rank: int + world_size: int + global_world_size: int + group_name: str + role: DistRole = DistRole.WORKER + + @property + def worker_name(self) -> str: + return f'{self.group_name}-{self.rank}' diff --git a/jointContribution/mattergen/paddle_geometric/distributed/dist_link_neighbor_loader.py b/jointContribution/mattergen/paddle_geometric/distributed/dist_link_neighbor_loader.py new file mode 100644 index 00000000..f28667ca --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/dist_link_neighbor_loader.py @@ -0,0 +1,117 @@ +from typing import Callable, Dict, List, Optional, Tuple, Union + +import paddle +from paddle_geometric.distributed import ( + DistContext, + DistLoader, + DistNeighborSampler, + LocalFeatureStore, + LocalGraphStore, +) +from paddle_geometric.loader import LinkLoader +from paddle_geometric.sampler.base import NegativeSampling, SubgraphType +from paddle_geometric.typing import EdgeType, InputEdges, OptTensor + + +class DistLinkNeighborLoader(LinkLoader, DistLoader): + r"""A distributed loader that performs sampling from edges. + + Args: + data (tuple): A (:class:`~paddle_geometric.data.FeatureStore`, + :class:`~paddle_geometric.data.GraphStore`) data object. + num_neighbors (List[int] or Dict[Tuple[str, str, str], List[int]]): + The number of neighbors to sample for each node in each iteration. + master_addr (str): RPC address for distributed loader communication, + *i.e.* the IP address of the master node. + master_port (Union[int, str]): Open port for RPC communication with + the master node. + current_ctx (DistContext): Distributed context information of the + current process. + concurrency (int, optional): RPC concurrency for asynchronous processing queue. + (default: :obj:`1`) + """ + + def __init__( + self, + data: Tuple[LocalFeatureStore, LocalGraphStore], + num_neighbors: Union[List[int], Dict[EdgeType, List[int]]], + master_addr: str, + master_port: Union[int, str], + current_ctx: DistContext, + edge_label_index: InputEdges = None, + edge_label: OptTensor = None, + edge_label_time: OptTensor = None, + dist_sampler: Optional[DistNeighborSampler] = None, + replace: bool = False, + subgraph_type: Union[SubgraphType, str] = "directional", + disjoint: bool = False, + temporal_strategy: str = "uniform", + neg_sampling: Optional[NegativeSampling] = None, + neg_sampling_ratio: Optional[Union[int, float]] = None, + time_attr: Optional[str] = None, + transform: Optional[Callable] = None, + concurrency: int = 1, + num_rpc_threads: int = 16, + filter_per_worker: Optional[bool] = False, + async_sampling: bool = True, + device: Optional[paddle.device] = None, + **kwargs, + ): + assert isinstance(data[0], LocalFeatureStore) + assert isinstance(data[1], LocalGraphStore) + assert concurrency >= 1, "RPC concurrency must be greater than 1" + + if (edge_label_time is not None) != (time_attr is not None): + raise ValueError( + f"Received conflicting 'edge_label_time' and 'time_attr' " + f"arguments: 'edge_label_time' is " + f"{'set' if edge_label_time is not None else 'not set'} " + f"while 'time_attr' is " + f"{'set' if time_attr is not None else 'not set'}. " + f"Both arguments must be provided for temporal sampling.") + + channel = paddle.multiprocessing.Queue() if async_sampling else None + + if dist_sampler is None: + dist_sampler = DistNeighborSampler( + data=data, + current_ctx=current_ctx, + num_neighbors=num_neighbors, + replace=replace, + subgraph_type=subgraph_type, + disjoint=disjoint, + temporal_strategy=temporal_strategy, + time_attr=time_attr, + device=device, + channel=channel, + concurrency=concurrency, + ) + + DistLoader.__init__( + self, + channel=channel, + master_addr=master_addr, + master_port=master_port, + current_ctx=current_ctx, + dist_sampler=dist_sampler, + num_rpc_threads=num_rpc_threads, + **kwargs, + ) + LinkLoader.__init__( + self, + data=data, + link_sampler=dist_sampler, + edge_label_index=edge_label_index, + edge_label=edge_label, + edge_label_time=edge_label_time, + neg_sampling=neg_sampling, + neg_sampling_ratio=neg_sampling_ratio, + transform=transform, + filter_per_worker=filter_per_worker, + worker_init_fn=self.worker_init_fn, + transform_sampler_output=self.channel_get if channel else None, + **kwargs, + ) + + def __repr__(self) -> str: + return DistLoader.__repr__(self) diff --git a/jointContribution/mattergen/paddle_geometric/distributed/dist_loader.py b/jointContribution/mattergen/paddle_geometric/distributed/dist_loader.py new file mode 100644 index 00000000..e3446999 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/dist_loader.py @@ -0,0 +1,151 @@ +import atexit +import logging +import os +from typing import Any, Optional, Union + +import paddle.distributed as dist +import paddle.multiprocessing as mp + +from paddle_geometric.distributed import DistNeighborSampler +from paddle_geometric.distributed.dist_context import DistContext +from paddle_geometric.distributed.rpc import ( + global_barrier, + init_rpc, + shutdown_rpc, +) +from paddle_geometric.loader.base import DataLoaderIterator + + +class DistLoader: + r"""A base class for creating distributed data loading routines. + + Args: + current_ctx (DistContext): Distributed context info of the current + process. + master_addr (str, optional): RPC address for distributed loader + communication. + Refers to the IP address of the master node. (default: :obj:`None`) + master_port (int or str, optional): The open port for RPC communication + with the master node. (default: :obj:`None`) + channel (mp.Queue, optional): A communication channel for messages. + (default: :obj:`None`) + num_rpc_threads (int, optional): The number of threads in the + thread-pool used by + :class:`~paddle.distributed.rpc.TensorPipeAgent` to execute + requests. (default: :obj:`16`) + rpc_timeout (int, optional): The default timeout in seconds for RPC + requests. + (default: :obj:`180`) + """ + def __init__( + self, + current_ctx: DistContext, + master_addr: Optional[str] = None, + master_port: Optional[Union[int, str]] = None, + channel: Optional[mp.Queue] = None, + num_rpc_threads: int = 16, + rpc_timeout: int = 180, + dist_sampler: DistNeighborSampler = None, + **kwargs, + ): + if master_addr is None and os.environ.get('MASTER_ADDR') is not None: + master_addr = os.environ['MASTER_ADDR'] + if master_addr is None: + raise ValueError(f"Missing master address for RPC communication " + f"in '{self.__class__.__name__}'. Try to provide " + f"it or set it via the 'MASTER_ADDR' environment " + f"variable.") + + if master_port is None and os.environ.get('MASTER_PORT') is not None: + master_port = int(os.environ['MASTER_PORT']) + 1 + if master_port is None: + raise ValueError(f"Missing master port for RPC communication in " + f"'{self.__class__.__name__}'. Try to provide it " + f"or set it via the 'MASTER_ADDR' environment " + f"variable.") + + assert num_rpc_threads > 0 + assert rpc_timeout > 0 + + self.dist_sampler = dist_sampler + self.current_ctx = current_ctx + self.master_addr = master_addr + self.master_port = master_port + self.channel = channel + self.pid = mp.current_process().pid + self.num_rpc_threads = num_rpc_threads + self.rpc_timeout = rpc_timeout + self.num_workers = kwargs.get('num_workers', 0) + + logging.info(f"[{self}] MASTER_ADDR={master_addr}, " + f"MASTER_PORT={master_port}") + + if self.num_workers == 0: + self.worker_init_fn(0) + + def channel_get(self, out: Any) -> Any: + if self.channel: + out = self.channel.get() + logging.debug(f"[{self}] Retrieved message") + return out + + def reset_channel(self, channel=None): + logging.debug(f'{self} Resetting msg channel') + while not self.channel.empty(): + self.channel.get_nowait() + + dist.barrier() + + self.channel = channel or mp.Queue() + self.dist_sampler.channel = self.channel + + def worker_init_fn(self, worker_id: int): + try: + num_sampler_proc = self.num_workers if self.num_workers > 0 else 1 + self.current_ctx_worker = DistContext( + world_size=self.current_ctx.world_size * num_sampler_proc, + rank=self.current_ctx.rank * num_sampler_proc + worker_id, + global_world_size=self.current_ctx.world_size * + num_sampler_proc, + global_rank=self.current_ctx.rank * num_sampler_proc + + worker_id, + group_name='mp_sampling_worker', + ) + + init_rpc( + current_ctx=self.current_ctx_worker, + master_addr=self.master_addr, + master_port=self.master_port, + num_rpc_threads=self.num_rpc_threads, + rpc_timeout=self.rpc_timeout, + ) + logging.info( + f"RPC initiated in worker-{worker_id} " + f"(current_ctx_worker={self.current_ctx_worker.worker_name})") + self.dist_sampler.init_sampler_instance() + self.dist_sampler.register_sampler_rpc() + global_barrier(timeout=10) + + atexit.register(shutdown_rpc, self.current_ctx_worker.worker_name) + + except RuntimeError: + raise RuntimeError(f"`{self}.init_fn()` could not initialize the " + f"worker loop of the neighbor sampler") + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(pid={self.pid})' + + def __enter__(self) -> DataLoaderIterator: + self._prefetch_old = self.prefetch_factor + self.prefetch_factor = 1 + self._iterator = self._get_iterator() + return self._iterator + + def __exit__(self, *args) -> None: + if self.channel: + self.reset_channel() + if self._iterator: + del self._iterator + dist.barrier() + self._iterator = None + self.prefetch_factor = self._prefetch_old diff --git a/jointContribution/mattergen/paddle_geometric/distributed/dist_neighbor_loader.py b/jointContribution/mattergen/paddle_geometric/distributed/dist_neighbor_loader.py new file mode 100644 index 00000000..f0759165 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/dist_neighbor_loader.py @@ -0,0 +1,111 @@ +from typing import Callable, Dict, List, Optional, Tuple, Union + +import paddle +import paddle.distributed as dist +import paddle.multiprocessing as mp + +from paddle_geometric.distributed import ( + DistContext, + DistLoader, + DistNeighborSampler, + LocalFeatureStore, + LocalGraphStore, +) +from paddle_geometric.loader import NodeLoader +from paddle_geometric.sampler.base import SubgraphType +from paddle_geometric.typing import EdgeType, InputNodes, OptTensor + + +class DistNeighborLoader(NodeLoader, DistLoader): + r"""A distributed loader that performs sampling from nodes. + + Args: + data (tuple): A (:class:`~paddle_geometric.data.FeatureStore`, + :class:`~paddle_geometric.data.GraphStore`) data object. + num_neighbors (List[int] or Dict[Tuple[str, str, str], List[int]]): + The number of neighbors to sample for each node in each iteration. + In heterogeneous graphs, may also take in a dictionary for each + individual edge type. + master_addr (str): RPC address for distributed loader communication. + master_port (Union[int, str]): Open port for RPC communication. + current_ctx (DistContext): Distributed context information. + concurrency (int, optional): RPC concurrency to define the maximum + asynchronous queue size. (default: :obj:`1`) + + All other arguments follow the interface of + :class:`paddle_geometric.loader.NeighborLoader`. + """ + def __init__( + self, + data: Tuple[LocalFeatureStore, LocalGraphStore], + num_neighbors: Union[List[int], Dict[EdgeType, List[int]]], + master_addr: str, + master_port: Union[int, str], + current_ctx: DistContext, + input_nodes: InputNodes = None, + input_time: OptTensor = None, + dist_sampler: Optional[DistNeighborSampler] = None, + replace: bool = False, + subgraph_type: Union[SubgraphType, str] = "directional", + disjoint: bool = False, + temporal_strategy: str = "uniform", + time_attr: Optional[str] = None, + transform: Optional[Callable] = None, + concurrency: int = 1, + num_rpc_threads: int = 16, + filter_per_worker: Optional[bool] = False, + async_sampling: bool = True, + device: Optional[str] = None, + **kwargs, + ): + assert isinstance(data[0], LocalFeatureStore) + assert isinstance(data[1], LocalGraphStore) + assert concurrency >= 1, "RPC concurrency must be greater than 1" + + if input_time is not None and time_attr is None: + raise ValueError("Received conflicting 'input_time' and " + "'time_attr' arguments: 'input_time' is set " + "while 'time_attr' is not set.") + + channel = mp.Queue() if async_sampling else None + + if dist_sampler is None: + dist_sampler = DistNeighborSampler( + data=data, + current_ctx=current_ctx, + num_neighbors=num_neighbors, + replace=replace, + subgraph_type=subgraph_type, + disjoint=disjoint, + temporal_strategy=temporal_strategy, + time_attr=time_attr, + device=device, + channel=channel, + concurrency=concurrency, + ) + + DistLoader.__init__( + self, + channel=channel, + master_addr=master_addr, + master_port=master_port, + current_ctx=current_ctx, + dist_sampler=dist_sampler, + num_rpc_threads=num_rpc_threads, + **kwargs, + ) + NodeLoader.__init__( + self, + data=data, + node_sampler=dist_sampler, + input_nodes=input_nodes, + input_time=input_time, + transform=transform, + filter_per_worker=filter_per_worker, + transform_sampler_output=self.channel_get if channel else None, + worker_init_fn=self.worker_init_fn, + **kwargs, + ) + + def __repr__(self) -> str: + return DistLoader.__repr__(self) diff --git a/jointContribution/mattergen/paddle_geometric/distributed/dist_neighbor_sampler.py b/jointContribution/mattergen/paddle_geometric/distributed/dist_neighbor_sampler.py new file mode 100644 index 00000000..b3fe4f2a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/dist_neighbor_sampler.py @@ -0,0 +1,905 @@ +import itertools +import logging +import math +from typing import Any, Callable, Dict, List, Optional, Tuple, Union + +import numpy as np +import paddle +import paddle.distributed as dist +from paddle import Tensor + +from paddle_geometric.distributed import ( + DistContext, + LocalFeatureStore, + LocalGraphStore, +) +from paddle_geometric.distributed.event_loop import ( + ConcurrentEventLoop, + to_asyncio_future, +) +from paddle_geometric.distributed.rpc import ( + RPCCallBase, + RPCRouter, + rpc_async, + rpc_partition_to_workers, + rpc_register, +) +from paddle_geometric.distributed.utils import ( + BatchDict, + DistEdgeHeteroSamplerInput, + NodeDict, + remove_duplicates, +) +from paddle_geometric.sampler import ( + EdgeSamplerInput, + HeteroSamplerOutput, + NegativeSampling, + NeighborSampler, + NodeSamplerInput, + SamplerOutput, +) +from paddle_geometric.sampler.base import NumNeighbors, SubgraphType +from paddle_geometric.sampler.neighbor_sampler import neg_sample +from paddle_geometric.sampler.utils import remap_keys +from paddle_geometric.typing import EdgeType, NodeType + +NumNeighborsType = Union[NumNeighbors, List[int], Dict[EdgeType, List[int]]] + + +class RPCSamplingCallee(RPCCallBase): + r"""A wrapper for RPC callee that will perform RPC sampling from remote + processes. + """ + def __init__(self, sampler: NeighborSampler): + super().__init__() + self.sampler = sampler + + def rpc_async(self, *args, **kwargs) -> Any: + return self.sampler._sample_one_hop(*args, **kwargs) + + def rpc_sync(self, *args, **kwargs) -> Any: + pass + + +class DistNeighborSampler: + r"""An implementation of a distributed and asynchronous neighbor sampler + used by :class:`~paddle_geometric.distributed.DistNeighborLoader` and + :class:`~paddle_geometric.distributed.DistLinkNeighborLoader`. + """ + def __init__( + self, + current_ctx: DistContext, + data: Tuple[LocalFeatureStore, LocalGraphStore], + num_neighbors: NumNeighborsType, + channel: Optional[dist.Queue] = None, + replace: bool = False, + subgraph_type: Union[SubgraphType, str] = 'directional', + disjoint: bool = False, + temporal_strategy: str = 'uniform', + time_attr: Optional[str] = None, + concurrency: int = 1, + device: Optional[str] = None, + **kwargs, + ): + self.current_ctx = current_ctx + + self.feature_store, self.graph_store = data + assert isinstance(self.graph_store, LocalGraphStore) + assert isinstance(self.feature_store, LocalFeatureStore) + self.is_hetero = self.graph_store.meta['is_hetero'] + + self.num_neighbors = num_neighbors + self.channel = channel + self.concurrency = concurrency + self.device = device + self.event_loop = None + self.replace = replace + self.subgraph_type = SubgraphType(subgraph_type) + self.disjoint = disjoint + self.temporal_strategy = temporal_strategy + self.time_attr = time_attr + self.temporal = time_attr is not None + self.with_edge_attr = self.feature_store.has_edge_attr() + self.csc = True + + def init_sampler_instance(self): + self._sampler = NeighborSampler( + data=(self.feature_store, self.graph_store), + num_neighbors=self.num_neighbors, + subgraph_type=self.subgraph_type, + replace=self.replace, + disjoint=self.disjoint, + temporal_strategy=self.temporal_strategy, + time_attr=self.time_attr, + ) + + self.num_hops = self._sampler.num_neighbors.num_hops + self.node_types = self._sampler.node_types + self.edge_types = self._sampler.edge_types + self.node_time = self._sampler.node_time + self.edge_time = self._sampler.edge_time + + def register_sampler_rpc(self) -> None: + partition2workers = rpc_partition_to_workers( + current_ctx=self.current_ctx, + num_partitions=self.graph_store.num_partitions, + current_partition_idx=self.graph_store.partition_idx, + ) + self.rpc_router = RPCRouter(partition2workers) + self.feature_store.set_rpc_router(self.rpc_router) + + rpc_sample_callee = RPCSamplingCallee(self) + self.rpc_sample_callee_id = rpc_register(rpc_sample_callee) + + def init_event_loop(self) -> None: + if self.event_loop is None: + self.event_loop = ConcurrentEventLoop(self.concurrency) + self.event_loop.start_loop() + logging.info(f'{self} uses {self.event_loop}') + + # Node-based distributed sampling ######################################### + + def sample_from_nodes( + self, + inputs: NodeSamplerInput, + **kwargs, + ) -> Optional[Union[SamplerOutput, HeteroSamplerOutput]]: + self.init_event_loop() + + inputs = NodeSamplerInput.cast(inputs) + if self.channel is None: + # synchronous sampling + return self.event_loop.run_task( + coro=self._sample_from(self.node_sample, inputs)) + + # asynchronous sampling + cb = kwargs.get("callback", None) + self.event_loop.add_task( + coro=self._sample_from(self.node_sample, inputs), callback=cb) + return None + + # Edge-based distributed sampling ######################################### + + def sample_from_edges( + self, + inputs: EdgeSamplerInput, + neg_sampling: Optional[NegativeSampling] = None, + **kwargs, + ) -> Optional[Union[SamplerOutput, HeteroSamplerOutput]]: + self.init_event_loop() + + if self.channel is None: + # synchronous sampling + return self.event_loop.run_task(coro=self._sample_from( + self.edge_sample, inputs, self.node_sample, self._sampler. + num_nodes, self.disjoint, self.node_time, neg_sampling)) + + # asynchronous sampling + cb = kwargs.get("callback", None) + self.event_loop.add_task( + coro=self._sample_from(self.edge_sample, inputs, self.node_sample, + self._sampler.num_nodes, self.disjoint, + self.node_time, neg_sampling), callback=cb) + return None + + async def _sample_from( + self, + async_func, + *args, + **kwargs, + ) -> Optional[Union[SamplerOutput, HeteroSamplerOutput]]: + sampler_output = await async_func(*args, **kwargs) + + if self.subgraph_type == SubgraphType.bidirectional: + sampler_output = sampler_output.to_bidirectional() + + res = await self._collate_fn(sampler_output) + + if self.channel is None: + return res + self.channel.put(res) + return None + + async def node_sample( + self, + inputs: Union[NodeSamplerInput, HeteroSamplerOutput], + ) -> Union[SamplerOutput, HeteroSamplerOutput]: + """ + Performs layer-by-layer distributed sampling from a + :class:`NodeSamplerInput` or :class:`HeteroSamplerOutput` and + returns the output of the sampling procedure. + + .. note:: + In case of distributed training it is required to synchronize the + results between machines after each layer. + """ + input_type = inputs.input_type + self.input_type = input_type + + if isinstance(inputs, NodeSamplerInput): + seed = paddle.to_tensor(inputs.node, place=self.device) + batch_size = len(inputs.node) + seed_batch = paddle.arange(batch_size) if self.disjoint else None + + metadata = (inputs.input_id, inputs.time, batch_size) + + seed_time: Optional[Tensor] = None + if self.temporal: + if inputs.time is not None: + seed_time = paddle.to_tensor(inputs.time, place=self.device) + elif self.node_time is not None: + if not self.is_hetero: + seed_time = self.node_time[seed] + else: + seed_time = self.node_time[input_type][seed] + else: + raise ValueError("Seed time needs to be specified") + else: # `HeteroSamplerOutput` + metadata = None # Metadata is added during `edge_sample`. + + # Heterogeneous Neighborhood Sampling ################################# + + if self.is_hetero: + if input_type is None: + raise ValueError("Input type should be defined") + + node_dict = {node_type: [] for node_type in self.node_types} + batch_dict = {node_type: [] for node_type in self.node_types} + + if isinstance(inputs, NodeSamplerInput): + seed_dict: Dict[NodeType, Tensor] = {input_type: seed} + if self.temporal: + node_dict[input_type].append(seed_time) + + edge_dict: Dict[EdgeType, Tensor] = { + k: paddle.zeros([0], dtype='int64') + for k in self.edge_types + } + sampled_nbrs_per_node_dict: Dict[EdgeType, List[List]] = { + k: [[] for _ in range(self.num_hops)] + for k in self.edge_types + } + num_sampled_edges_dict: Dict[EdgeType, List[int]] = { + k: [] + for k in self.edge_types + } + num_sampled_nodes_dict: Dict[NodeType, List[int]] = { + k: [0] + for k in self.node_types + } + + # Fill in node_dict and batch_dict with input data: + batch_len = 0 + for k, v in seed_dict.items(): + node_dict[k] = v + num_sampled_nodes_dict[k][0] = len(v) + + if self.disjoint: + src_batch = paddle.arange(batch_len, batch_len + len(v)) + batch_dict[k] = src_batch + + batch_len = len(src_batch) + + # Loop over the layers: + for i in range(self.num_hops): + # Sample neighbors per edge type: + for edge_type in self.edge_types: + src = edge_type[0] if not self.csc else edge_type[2] + + if len(node_dict[src]) == 0: + # No source nodes of this type in the current layer. + num_sampled_edges_dict[edge_type].append(0) + continue + + one_hop_num = self.num_neighbors[i] + + # Sample neighbors: + out = await self.sample_one_hop( + node_dict[src], + one_hop_num, + node_dict.get(src, []), + batch_dict.get(src, []), + edge_type, + ) + + if len(out.node) == 0: # No neighbors were sampled. + num_sampled_edges_dict[edge_type].append(0) + continue + + dst = edge_type[2] if not self.csc else edge_type[0] + + # Update dictionaries: + node_dict[dst].extend(out.node) + edge_dict[edge_type] = paddle.concat( + [edge_dict[edge_type], out.edge] + ) + + if self.temporal and i < self.num_hops - 1: + src_seed_time = paddle.concat( + [seed_time[(seed_batch == batch_idx)] + for batch_idx in src_batch]) + + node_dict[src].append(src_seed_time) + + # Create local edge indices for a batch: + row_dict, col_dict = paddle.ops.pyg.hetero_relabel_neighborhood( + self.node_types, + self.edge_types, + seed_dict, + node_dict, + sampled_nbrs_per_node_dict, + self._sampler.num_nodes, + batch_dict, + self.csc, + self.disjoint, + ) + + sampler_output = HeteroSamplerOutput( + node=node_dict, + row=row_dict, + col=col_dict, + edge=edge_dict, + batch=batch_dict if self.disjoint else None, + num_sampled_nodes=num_sampled_nodes_dict, + num_sampled_edges=num_sampled_edges_dict, + metadata=metadata, + ) + + # Homogeneous Neighborhood Sampling ################################### + + else: + src = seed + node = src.clone() + + src_batch = seed_batch.clone() if self.disjoint else None + batch = seed_batch.clone() if self.disjoint else None + + src_seed_time = seed_time.clone() if self.temporal else None + + node_with_dupl = [paddle.zeros([0], dtype='int64')] + batch_with_dupl = [paddle.zeros([0], dtype='int64')] + edge = [paddle.zeros([0], dtype='int64')] + + sampled_nbrs_per_node = [] + num_sampled_nodes = [len(seed)] + num_sampled_edges = [] + + for i, one_hop_num in enumerate(self.num_neighbors): + out = await self.sample_one_hop(src, one_hop_num, + src_seed_time, src_batch) + if len(out.node) == 0: + num_sampled_nodes += [0] * (self.num_hops - i) + num_sampled_edges += [0] * (self.num_hops - i) + break + + src, node, src_batch, batch = self.remove_duplicates( + out, node, batch, self.disjoint) + + node_with_dupl.append(out.node) + edge.append(out.edge) + + if self.disjoint: + batch_with_dupl.append(out.batch) + + num_sampled_nodes.append(len(src)) + num_sampled_edges.append(len(out.node)) + sampled_nbrs_per_node += out.metadata[0] + + row, col = paddle.ops.pyg.relabel_neighborhood( + seed, + paddle.concat(node_with_dupl), + sampled_nbrs_per_node, + self._sampler.num_nodes, + paddle.concat(batch_with_dupl) if self.disjoint else None, + self.csc, + self.disjoint, + ) + + sampler_output = SamplerOutput( + node=node, + row=row, + col=col, + edge=paddle.concat(edge), + batch=batch if self.disjoint else None, + num_sampled_nodes=num_sampled_nodes, + num_sampled_edges=num_sampled_edges, + metadata=metadata, + ) + + return sampler_output + + async def edge_sample( + self, + inputs: EdgeSamplerInput, + sample_fn: Callable, + num_nodes: Union[int, Dict[NodeType, int]], + disjoint: bool, + node_time: Optional[Union[Tensor, Dict[str, Tensor]]] = None, + neg_sampling: Optional[NegativeSampling] = None, + ) -> Union[SamplerOutput, HeteroSamplerOutput]: + """ + Performs layer-by-layer distributed sampling from an + EdgeSamplerInput and returns the output of the sampling + procedure. + + Note: + In case of distributed training, it is required to synchronize the + results between machines after each layer. + """ + input_id = inputs.input_id + src = inputs.row + dst = inputs.col + edge_label = inputs.label + edge_label_time = inputs.time + input_type = inputs.input_type + + src_time = dst_time = edge_label_time + assert edge_label_time is None or disjoint + + assert isinstance(num_nodes, (dict, int)) + if not isinstance(num_nodes, dict): + num_src_nodes = num_dst_nodes = num_nodes + else: + num_src_nodes = num_nodes[input_type[0]] + num_dst_nodes = num_nodes[input_type[-1]] + + num_pos = src.shape[0] + num_neg = 0 + + # Negative Sampling ################################################### + + if neg_sampling is not None: + num_neg = math.ceil(num_pos * neg_sampling.amount) + + if neg_sampling.is_binary(): + # Binary case: Randomly sample negative pairs of nodes + src_neg = self.neg_sample(src, neg_sampling, num_src_nodes, src_time) + src = paddle.concat([src, src_neg], axis=0) + + dst_neg = self.neg_sample(dst, neg_sampling, num_dst_nodes, dst_time) + dst = paddle.concat([dst, dst_neg], axis=0) + + if edge_label is None: + edge_label = paddle.ones([num_pos], dtype='float32') + edge_neg_label = paddle.zeros([num_neg], dtype=edge_label.dtype) + edge_label = paddle.concat([edge_label, edge_neg_label], axis=0) + + if edge_label_time is not None: + src_time = dst_time = paddle.concat( + [edge_label_time] * (1 + math.ceil(neg_sampling.amount)), + axis=0)[:num_pos + num_neg] + + elif neg_sampling.is_triplet(): + dst_neg = self.neg_sample(dst, neg_sampling, num_dst_nodes, dst_time) + dst = paddle.concat([dst, dst_neg], axis=0) + assert edge_label is None + + if edge_label_time is not None: + dst_time = paddle.concat( + [edge_label_time] * (1 + neg_sampling.amount), + axis=0) + + # Heterogeneous Neighborhood Sampling ################################## + + if input_type is not None: + if input_type[0] != input_type[-1]: # Two distinct node types: + seed_dict = {input_type[0]: src, input_type[-1]: dst} + + seed_time_dict = None + if edge_label_time is not None: # Always disjoint. + seed_time_dict = { + input_type[0]: src_time, + input_type[-1]: dst_time, + } + + out = await sample_fn( + DistEdgeHeteroSamplerInput( + input_id=inputs.input_id, + node_dict=seed_dict, + time_dict=seed_time_dict, + input_type=input_type, + ) + ) + + else: # Only a single node type: Merge both source and destination. + seed = paddle.concat([src, dst], axis=0) + + seed_dict = {input_type[0]: seed} + + seed_time = None + if edge_label_time is not None: # Always disjoint. + seed_time = paddle.concat([src_time, dst_time], axis=0) + + out = await sample_fn( + NodeSamplerInput( + input_id=inputs.input_id, + node=seed, + time=seed_time, + input_type=input_type[0], + ) + ) + + # Enhance `out` by label information ############################## + if disjoint: + for key, batch in out.batch.items(): + out.batch[key] = batch % num_pos + + if neg_sampling is None or neg_sampling.is_binary(): + if disjoint: + if input_type[0] != input_type[-1]: + edge_label_index = paddle.arange(2 * (num_pos + num_neg)) + edge_label_index = edge_label_index.reshape([2, -1]) + else: + edge_label_index = paddle.arange(2 * (num_pos + num_neg)) + edge_label_index = edge_label_index.reshape([2, -1]) + else: + edge_label_index = paddle.stack([src, dst], axis=0) + + out.metadata = (input_id, edge_label_index, edge_label, src_time) + + elif neg_sampling.is_triplet(): + src_index = paddle.arange(num_pos) + dst_pos_index = paddle.arange(num_pos, 2 * num_pos) + dst_neg_index = paddle.arange(2 * num_pos, 2 * num_pos + num_neg) + + out.metadata = ( + input_id, + src_index, + dst_pos_index, + dst_neg_index, + src_time, + ) + + # Homogeneous Neighborhood Sampling ################################### + + else: + seed = paddle.concat([src, dst], axis=0) + seed_time = None + + if edge_label_time is not None: # Always disjoint. + seed_time = paddle.concat([src_time, dst_time]) + + out = await sample_fn( + NodeSamplerInput( + input_id=inputs.input_id, + node=seed, + time=seed_time, + input_type=None, + ) + ) + + # Enhance `out` by label information ############################## + if neg_sampling is None or neg_sampling.is_binary(): + if disjoint: + out.batch = out.batch % num_pos + edge_label_index = paddle.arange(seed.shape[0]).reshape([2, -1]) + else: + edge_label_index = paddle.stack([src, dst], axis=0) + + out.metadata = (input_id, edge_label_index, edge_label, src_time) + + elif neg_sampling.is_triplet(): + out.batch = out.batch % num_pos + src_index = paddle.arange(num_pos) + dst_pos_index = paddle.arange(num_pos, 2 * num_pos) + dst_neg_index = paddle.arange(2 * num_pos, seed.shape[0]) + + out.metadata = ( + input_id, + src_index, + dst_pos_index, + dst_neg_index, + src_time, + ) + + return out + + def _get_sampler_output( + self, + outputs: List[SamplerOutput], + seed_size: int, + p_id: int, + src_batch: Optional[Tensor] = None, + ) -> SamplerOutput: + r"""Used when seed nodes belongs to one partition. Its purpose is to + remove seed nodes from sampled nodes and calculates how many neighbors + were sampled by each src node based on the + :obj:`cumsum_neighbors_per_node`. Returns updated sampler output. + """ + cumsum_neighbors_per_node = outputs[p_id].metadata[0] + + # do not include seed + outputs[p_id].node = outputs[p_id].node[seed_size:] + + begin = np.array(cumsum_neighbors_per_node[1:]) + end = np.array(cumsum_neighbors_per_node[:-1]) + + sampled_nbrs_per_node = list(np.subtract(begin, end)) + + outputs[p_id].metadata = (sampled_nbrs_per_node,) + + if self.disjoint: + batch = [[src_batch[i]] * nbrs_per_node + for i, nbrs_per_node in enumerate(sampled_nbrs_per_node)] + outputs[p_id].batch = paddle.to_tensor( + list(itertools.chain.from_iterable(batch)), dtype='int64') + + return outputs[p_id] + + def _merge_sampler_outputs( + self, + partition_ids: Tensor, + partition_orders: Tensor, + outputs: List[SamplerOutput], + one_hop_num: int, + src_batch: Optional[Tensor] = None, + ) -> SamplerOutput: + r"""Merges samplers outputs from different partitions, so that they + are sorted according to the sampling order. Removes seed nodes from + sampled nodes and calculates how many neighbors were sampled by each + src node based on the :obj:`cumsum_neighbors_per_node`. Leverages the + :obj:`pyg-lib` :meth:`merge_sampler_outputs` function. + + Args: + partition_ids (paddle.Tensor): Contains information on which + partition seeds nodes are located on. + partition_orders (paddle.Tensor): Contains information about the + order of seed nodes in each partition. + outputs (List[SamplerOutput]): List of all samplers outputs. + one_hop_num (int): Max number of neighbors sampled in the current + layer. + src_batch (paddle.Tensor, optional): The batch assignment of seed + nodes. (default: :obj:`None`) + + Returns: + SamplerOutput: Containing all merged outputs. + """ + sampled_nodes_with_dupl = [ + o.node if o is not None else paddle.empty([0], dtype='int64') + for o in outputs + ] + edge_ids = [ + o.edge if o is not None else paddle.empty([0], dtype='int64') + for o in outputs + ] + cumm_sampled_nbrs_per_node = [ + o.metadata[0] if o is not None else [] for o in outputs + ] + + partition_ids = partition_ids.numpy().tolist() + partition_orders = partition_orders.numpy().tolist() + + partitions_num = self.graph_store.meta["num_parts"] + + # Implement custom merging logic since `torch.ops.pyg.merge_sampler_outputs` does not directly translate to Paddle. + # Placeholder logic assumes data is concatenated. Adjust based on the actual library behavior. + out_node_with_dupl = paddle.concat(sampled_nodes_with_dupl) + out_edge = paddle.concat(edge_ids) + out_sampled_nbrs_per_node = list(itertools.chain.from_iterable(cumm_sampled_nbrs_per_node)) + + if self.disjoint: + out_batch = paddle.concat([o.batch for o in outputs if o is not None]) + else: + out_batch = None + + return SamplerOutput( + out_node_with_dupl, + None, + None, + out_edge, + out_batch if self.disjoint else None, + metadata=(out_sampled_nbrs_per_node,), + ) + + async def sample_one_hop( + self, + srcs: Tensor, + one_hop_num: int, + seed_time: Optional[Tensor] = None, + src_batch: Optional[Tensor] = None, + edge_type: Optional[EdgeType] = None, + ) -> SamplerOutput: + r"""Samples one-hop neighbors for a set of seed nodes in :obj:`srcs`. + If seed nodes are located on a local partition, evaluates the sampling + function on the current machine. If seed nodes are from a remote + partition, sends a request to a remote machine that contains this + partition. + """ + src_node_type = None if not self.is_hetero else edge_type[2] + partition_ids = self.graph_store.get_partition_ids_from_nids( + srcs, src_node_type) + partition_orders = paddle.zeros([len(partition_ids)], dtype="int64") + + p_outputs: List[SamplerOutput] = [ + None + ] * self.graph_store.meta["num_parts"] + futs = [] + + local_only = True + single_partition = len(set(partition_ids.numpy().tolist())) == 1 + + for i in range(self.graph_store.num_partitions): + p_id = (self.graph_store.partition_idx + + i) % self.graph_store.num_partitions + p_mask = partition_ids == p_id + p_srcs = paddle.masked_select(srcs, p_mask) + p_seed_time = (paddle.masked_select(seed_time, p_mask) + if self.temporal else None) + + p_indices = paddle.arange(len(p_srcs), dtype="int64") + partition_orders[p_mask] = p_indices + + if p_srcs.shape[0] > 0: + if p_id == self.graph_store.partition_idx: + # Sample for one hop on a local machine: + p_nbr_out = self._sample_one_hop(p_srcs, one_hop_num, + p_seed_time, edge_type) + p_outputs.pop(p_id) + p_outputs.insert(p_id, p_nbr_out) + + else: # Sample on a remote machine: + local_only = False + to_worker = self.rpc_router.get_to_worker(p_id) + futs.append( + rpc_async( + to_worker, + self.rpc_sample_callee_id, + args=(p_srcs, one_hop_num, p_seed_time, edge_type), + )) + + if not local_only: + # Src nodes are remote + res_fut_list = await to_asyncio_future( + paddle.futures.collect_all(futs)) + for i, res_fut in enumerate(res_fut_list): + p_id = (self.graph_store.partition_idx + i + + 1) % self.graph_store.num_partitions + p_outputs.pop(p_id) + p_outputs.insert(p_id, res_fut.wait()) + + # All src nodes are in the same partition + if single_partition: + return self._get_sampler_output(p_outputs, len(srcs), + partition_ids[0], src_batch) + + return self._merge_sampler_outputs(partition_ids, partition_orders, + p_outputs, one_hop_num, src_batch) + + def _sample_one_hop( + self, + input_nodes: Tensor, + num_neighbors: int, + seed_time: Optional[Tensor] = None, + edge_type: Optional[EdgeType] = None, + ) -> SamplerOutput: + r"""Implements one-hop neighbor sampling for a set of input nodes for a + specific edge type. + """ + if not self.is_hetero: + colptr = self._sampler.colptr + row = self._sampler.row + node_time = self.node_time + edge_time = self.edge_time + else: + # Given edge type, get input data and evaluate sample function: + rel_type = '__'.join(edge_type) + colptr = self._sampler.colptr_dict[rel_type] + row = self._sampler.row_dict[rel_type] + # `node_time` is a destination node time: + node_time = (self.node_time or {}).get(edge_type[0], None) + edge_time = (self.edge_time or {}).get(edge_type, None) + + out = paddle.ops.pyg.dist_neighbor_sample( + colptr, + row, + input_nodes.astype(colptr.dtype), + num_neighbors, + node_time, + edge_time, + seed_time, + None, # TODO: edge_weight + True, # csc + self.replace, + self.subgraph_type != SubgraphType.induced, + self.disjoint and self.temporal, + self.temporal_strategy, + ) + node, edge, cumsum_neighbors_per_node = out + + if self.disjoint and self.temporal: + # We create a batch during the step of merging sampler outputs. + _, node = paddle.transpose(node, [1, 0]) + + return SamplerOutput( + node=node, + row=None, + col=None, + edge=edge, + batch=None, + metadata=(cumsum_neighbors_per_node,), + ) + + async def _collate_fn( + self, output: Union[SamplerOutput, HeteroSamplerOutput] + ) -> Union[SamplerOutput, HeteroSamplerOutput]: + r"""Collect labels and features for the sampled subgraph if necessary, + and put them into a sample message. + """ + if self.is_hetero: + labels = {} + nfeats = {} + efeats = {} + labels = self.feature_store.labels + if labels is not None: + if isinstance(self.input_type, tuple): # Edge labels. + labels = { + self.input_type: paddle.index_select( + labels[self.input_type], output.edge[self.input_type]) + } + else: # Node labels. + labels = { + self.input_type: paddle.index_select( + labels[self.input_type], output.node[self.input_type]) + } + # Collect node features. + if output.node is not None: + for ntype in output.node.keys(): + if output.node[ntype].numel() > 0: + fut = self.feature_store.lookup_features( + is_node_feat=True, + index=output.node[ntype], + input_type=ntype, + ) + nfeat = await to_asyncio_future(fut) + nfeat = nfeat.cpu() + nfeats[ntype] = nfeat + else: + nfeats[ntype] = None + # Collect edge features. + if output.edge is not None and self.with_edge_attr: + for edge_type in output.edge.keys(): + if output.edge[edge_type].numel() > 0: + fut = self.feature_store.lookup_features( + is_node_feat=False, + index=output.edge[edge_type], + input_type=edge_type, + ) + efeat = await to_asyncio_future(fut) + efeat = efeat.cpu() + efeats[edge_type] = efeat + else: + efeats[edge_type] = None + + else: # Homogeneous: + # Collect node labels. + if self.feature_store.labels is not None: + labels = paddle.index_select( + self.feature_store.labels, output.node) + else: + labels = None + # Collect node features. + if output.node is not None: + fut = self.feature_store.lookup_features( + is_node_feat=True, index=output.node) + nfeats = await to_asyncio_future(fut) + nfeats = nfeats.cpu() + else: + nfeats = None + # Collect edge features. + if output.edge is not None and self.with_edge_attr: + fut = self.feature_store.lookup_features( + is_node_feat=False, index=output.edge) + efeats = await to_asyncio_future(fut) + efeats = efeats.cpu() + else: + efeats = None + + output.metadata = (*output.metadata, nfeats, labels, efeats) + return output + + @property + def edge_permutation(self) -> None: + return None + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(pid={paddle.device.get_current_pid()})' diff --git a/jointContribution/mattergen/paddle_geometric/distributed/event_loop.py b/jointContribution/mattergen/paddle_geometric/distributed/event_loop.py new file mode 100644 index 00000000..d3be07f0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/event_loop.py @@ -0,0 +1,102 @@ +import asyncio +import atexit +import logging +from threading import BoundedSemaphore, Thread +from typing import Callable, Optional + +import paddle + +# Adapted from the graphlearn-for-pytorch repository +# (Original License: Apache v2) + + +def to_asyncio_future(future: paddle.futures.Future) -> asyncio.futures.Future: + r"""Convert a :class:`paddle.futures.Future` to an :obj:`asyncio` future.""" + loop = asyncio.get_event_loop() + asyncio_future = loop.create_future() + + def on_done(*_): + try: + result = future.wait() + except Exception as e: + loop.call_soon_threadsafe(asyncio_future.set_exception, e) + else: + loop.call_soon_threadsafe(asyncio_future.set_result, result) + + future.add_done_callback(on_done) + + return asyncio_future + + +class ConcurrentEventLoop: + r"""Concurrent event loop context. + + Args: + concurrency: max processing concurrency. + """ + def __init__(self, concurrency: int): + self._concurrency = concurrency + self._sem = BoundedSemaphore(concurrency) + self._loop = asyncio.new_event_loop() + self._runner_t = Thread(target=self._run_loop) + self._runner_t.daemon = True + + def cleanup(): + for _ in range(self._concurrency): + self._sem.acquire() + for _ in range(self._concurrency): + self._sem.release() + if self._runner_t.is_alive(): + self._loop.stop() + self._runner_t.join(timeout=1) + logging.debug(f'{self}: Closed `ConcurrentEventLoop`') + + atexit.register(cleanup) + + def start_loop(self): + if not self._runner_t.is_alive(): + self._runner_t.start() + + def wait_all(self): + r"""Wait for all pending tasks to be finished.""" + for _ in range(self._concurrency): + self._sem.acquire() + for _ in range(self._concurrency): + self._sem.release() + + def add_task(self, coro, callback: Optional[Callable] = None): + r"""Adds an asynchronous coroutine task to run. + + Args: + coro: The asynchronous coroutine function. + callback (callable, optional): The callback function applied on the + returned results after the coroutine task is finished. + (default: :obj:`None`) + + Note that any result returned by :obj:`callback` will be ignored. + """ + def on_done(f: asyncio.futures.Future): + try: + res = f.result() + if callback is not None: + callback(res) + except Exception as e: + logging.error(f"Coroutine task failed with error: {e}") + self._sem.release() + + self._sem.acquire() + fut = asyncio.run_coroutine_threadsafe(coro, self._loop) + fut.add_done_callback(on_done) + + def run_task(self, coro): + r"""Runs a coroutine task synchronously. + + Args: + coro: The synchronous coroutine function. + """ + with self._sem: + fut = asyncio.run_coroutine_threadsafe(coro, self._loop) + return fut.result() + + def _run_loop(self): + self._loop.run_forever() diff --git a/jointContribution/mattergen/paddle_geometric/distributed/local_feature_store.py b/jointContribution/mattergen/paddle_geometric/distributed/local_feature_store.py new file mode 100644 index 00000000..f1c83d6d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/local_feature_store.py @@ -0,0 +1,362 @@ +import copy +import os.path as osp +from dataclasses import dataclass +from typing import Any, Dict, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import FeatureStore, TensorAttr +from paddle_geometric.data.feature_store import _FieldStatus +from paddle_geometric.distributed.partition import load_partition_info +from paddle_geometric.distributed.rpc import ( + RPCCallBase, + RPCRouter, + rpc_async, + rpc_register, +) +from paddle_geometric.io import fs +from paddle_geometric.typing import EdgeType, NodeOrEdgeType, NodeType + + +class RPCCallFeatureLookup(RPCCallBase): + r"""A wrapper for RPC calls to the feature store.""" + def __init__(self, dist_feature: FeatureStore): + super().__init__() + self.dist_feature = dist_feature + + def rpc_async(self, *args, **kwargs): + return self.dist_feature._rpc_local_feature_get(*args, **kwargs) + + def rpc_sync(self, *args, **kwargs): + raise NotImplementedError + + +@dataclass +class LocalTensorAttr(TensorAttr): + r"""Tensor attribute for storing features without :obj:`index`.""" + def __init__( + self, + group_name: Optional[Union[NodeType, EdgeType]] = _FieldStatus.UNSET, + attr_name: Optional[str] = _FieldStatus.UNSET, + index=None, + ): + super().__init__(group_name, attr_name, index) + + +class LocalFeatureStore(FeatureStore): + r"""Implements the :class:`~paddle_geometric.data.FeatureStore` interface + to act as a local feature store for distributed training. + """ + def __init__(self): + super().__init__(tensor_attr_cls=LocalTensorAttr) + self._feat: Dict[Tuple[Union[NodeType, EdgeType], str], Tensor] = {} + self._global_id: Dict[Union[NodeType, EdgeType], Tensor] = {} + self._global_id_to_index: Dict[Union[NodeType, EdgeType], Tensor] = {} + self.num_partitions: int = 1 + self.partition_idx: int = 0 + self.node_feat_pb: Union[Tensor, Dict[NodeType, Tensor]] + self.edge_feat_pb: Union[Tensor, Dict[EdgeType, Tensor]] + self.labels: Optional[Tensor] = None + self.local_only: bool = False + self.rpc_router: Optional[RPCRouter] = None + self.meta: Optional[Dict] = None + self.rpc_call_id: Optional[int] = None + + @staticmethod + def key(attr: TensorAttr) -> Tuple[str, str]: + return (attr.group_name, attr.attr_name) + + def put_global_id( + self, + global_id: Tensor, + group_name: Union[NodeType, EdgeType], + ) -> bool: + self._global_id[group_name] = global_id + self._set_global_id_to_index(group_name) + return True + + def get_global_id( + self, + group_name: Union[NodeType, EdgeType], + ) -> Optional[Tensor]: + return self._global_id.get(group_name) + + def remove_global_id(self, group_name: Union[NodeType, EdgeType]) -> bool: + return self._global_id.pop(group_name) is not None + + def _set_global_id_to_index(self, group_name: Union[NodeType, EdgeType]): + global_id = self.get_global_id(group_name) + + if global_id is None: + return + + global_id_to_index = paddle.full([int(global_id.max()) + 1], -1) + global_id_to_index[global_id] = paddle.arange(global_id.shape[0]) + self._global_id_to_index[group_name] = global_id_to_index + + def _put_tensor(self, tensor: Tensor, attr: TensorAttr) -> bool: + assert attr.index is None + self._feat[self.key(attr)] = tensor + return True + + def _get_tensor(self, attr: TensorAttr) -> Optional[Tensor]: + tensor = self._feat.get(self.key(attr)) + if tensor is None: + return None + + if attr.index is None: + return tensor + + return tensor[attr.index] + + def _remove_tensor(self, attr: TensorAttr) -> bool: + assert attr.index is None + return self._feat.pop(self.key(attr), None) is not None + + def get_tensor_from_global_id(self, *args, **kwargs) -> Optional[Tensor]: + attr = self._tensor_attr_cls.cast(*args, **kwargs) + assert attr.index is not None + attr = copy.copy(attr) + attr.index = self._global_id_to_index[attr.group_name][attr.index] + return self.get_tensor(attr) + + def _get_tensor_size(self, attr: TensorAttr) -> Tuple[int, ...]: + return self._get_tensor(attr).shape + + def get_all_tensor_attrs(self) -> List[LocalTensorAttr]: + return [self._tensor_attr_cls.cast(*key) for key in self._feat.keys()] + + def set_rpc_router(self, rpc_router: RPCRouter): + self.rpc_router = rpc_router + if not self.local_only: + if self.rpc_router is None: + raise ValueError("An RPC router must be provided") + rpc_call = RPCCallFeatureLookup(self) + self.rpc_call_id = rpc_register(rpc_call) + else: + self.rpc_call_id = None + + def has_edge_attr(self) -> bool: + has_edge_attr = False + for k in [key for key in self._feat.keys() if 'edge_attr' in key]: + try: + self.get_tensor(k[0], 'edge_attr') + has_edge_attr = True + except KeyError: + pass + return has_edge_attr + + def lookup_features( + self, + index: Tensor, + is_node_feat: bool = True, + input_type: Optional[NodeOrEdgeType] = None, + ) -> paddle.futures.Future: + remote_fut = self._remote_lookup_features(index, is_node_feat, + input_type) + local_feature = self._local_lookup_features(index, is_node_feat, + input_type) + res_fut = paddle.futures.Future() + + def when_finish(*_): + try: + remote_feature_list = remote_fut.wait() + result = paddle.zeros( + [index.shape[0], local_feature[0].shape[1]], + dtype=local_feature[0].dtype, + ) + result[local_feature[1]] = local_feature[0] + for remote in remote_feature_list: + result[remote[1]] = remote[0] + except Exception as e: + res_fut.set_exception(e) + else: + res_fut.set_result(result) + + remote_fut.add_done_callback(when_finish) + return res_fut + + def _local_lookup_features( + self, + index: Tensor, + is_node_feat: bool = True, + input_type: Optional[Union[NodeType, EdgeType]] = None, + ) -> Tuple[Tensor, Tensor]: + pb = self.node_feat_pb if is_node_feat else self.edge_feat_pb + input_order = paddle.arange(index.shape[0], dtype="int64") + if self.meta['is_hetero']: + partition_ids = pb[input_type][index] + else: + partition_ids = pb[index] + + local_mask = partition_ids == self.partition_idx + local_ids = paddle.masked_select(index, local_mask) + local_index = paddle.masked_select(input_order, local_mask) + + if self.meta['is_hetero']: + kwargs = dict(group_name=input_type, + attr_name='x' if is_node_feat else 'edge_attr') + ret_feat = self.get_tensor_from_global_id( + index=local_ids, **kwargs) + else: + kwargs = dict(group_name=None, + attr_name='x' if is_node_feat else 'edge_attr') + ret_feat = self.get_tensor_from_global_id( + index=local_ids, **kwargs) + + return ret_feat, local_index + + def _remote_lookup_features( + self, + index: Tensor, + is_node_feat: bool = True, + input_type: Optional[Union[NodeType, EdgeType]] = None, + ) -> paddle.futures.Future: + pb = self.node_feat_pb if is_node_feat else self.edge_feat_pb + input_order = paddle.arange(index.shape[0], dtype="int64") + partition_ids = pb[input_type][index] if self.meta['is_hetero'] else pb[index] + + futs, indexes = [], [] + for pidx in range(self.num_partitions): + if pidx == self.partition_idx: + continue + remote_mask = partition_ids == pidx + remote_ids = index[remote_mask] + if remote_ids.shape[0] > 0: + to_worker = self.rpc_router.get_to_worker(pidx) + futs.append( + rpc_async( + to_worker, + self.rpc_call_id, + args=(remote_ids.cpu(), is_node_feat, input_type), + )) + indexes.append(paddle.masked_select(input_order, remote_mask)) + collect_fut = paddle.futures.collect_all(futs) + res_fut = paddle.futures.Future() + + def when_finish(*_): + try: + fut_list = collect_fut.wait() + result = [(fut.wait(), indexes[i]) for i, fut in enumerate(fut_list)] + except Exception as e: + res_fut.set_exception(e) + else: + res_fut.set_result(result) + + collect_fut.add_done_callback(when_finish) + return res_fut + + def _rpc_local_feature_get( + self, + index: Tensor, + is_node_feat: bool = True, + input_type: Optional[Union[NodeType, EdgeType]] = None, + ) -> Tensor: + kwargs = dict(group_name=input_type if self.meta['is_hetero'] else None, + attr_name='x' if is_node_feat else 'edge_attr') + return self.get_tensor_from_global_id(index=index, **kwargs) + + # Initialization ########################################################## + + @classmethod + def from_data( + cls, + node_id: Tensor, + x: Optional[Tensor] = None, + y: Optional[Tensor] = None, + edge_id: Optional[Tensor] = None, + edge_attr: Optional[Tensor] = None, + ) -> 'LocalFeatureStore': + feat_store = cls() + feat_store.put_global_id(node_id, group_name=None) + if x is not None: + feat_store.put_tensor(x, group_name=None, attr_name='x') + if y is not None: + feat_store.put_tensor(y, group_name=None, attr_name='y') + if edge_id is not None: + feat_store.put_global_id(edge_id, group_name=(None, None)) + if edge_attr is not None: + if edge_id is None: + raise ValueError("'edge_id' needs to be present in case 'edge_attr' is passed") + feat_store.put_tensor(edge_attr, group_name=(None, None), attr_name='edge_attr') + return feat_store + + @classmethod + def from_hetero_data( + cls, + node_id_dict: Dict[NodeType, Tensor], + x_dict: Optional[Dict[NodeType, Tensor]] = None, + y_dict: Optional[Dict[NodeType, Tensor]] = None, + edge_id_dict: Optional[Dict[EdgeType, Tensor]] = None, + edge_attr_dict: Optional[Dict[EdgeType, Tensor]] = None, + ) -> 'LocalFeatureStore': + feat_store = cls() + for node_type, node_id in node_id_dict.items(): + feat_store.put_global_id(node_id, group_name=node_type) + if x_dict is not None: + for node_type, x in x_dict.items(): + feat_store.put_tensor(x, group_name=node_type, attr_name='x') + if y_dict is not None: + for node_type, y in y_dict.items(): + feat_store.put_tensor(y, group_name=node_type, attr_name='y') + if edge_id_dict is not None: + for edge_type, edge_id in edge_id_dict.items(): + feat_store.put_global_id(edge_id, group_name=edge_type) + if edge_attr_dict is not None: + for edge_type, edge_attr in edge_attr_dict.items(): + if edge_id_dict is None or edge_type not in edge_id_dict: + raise ValueError("'edge_id' needs to be present in case 'edge_attr' is passed") + feat_store.put_tensor(edge_attr, group_name=edge_type, attr_name='edge_attr') + return feat_store + + @classmethod + def from_partition(cls, root: str, pid: int) -> 'LocalFeatureStore': + part_dir = osp.join(root, f'part_{pid}') + assert osp.exists(part_dir) + feat_store = cls() + meta, num_partitions, partition_idx, node_pb, edge_pb = load_partition_info(root, pid) + feat_store.num_partitions = num_partitions + feat_store.partition_idx = partition_idx + feat_store.node_feat_pb = node_pb + feat_store.edge_feat_pb = edge_pb + feat_store.meta = meta + + node_feats = fs.paddle_load(osp.join(part_dir, 'node_feats.pdparams')) + edge_feats = fs.paddle_load(osp.join(part_dir, 'edge_feats.pdparams')) + + if not meta['is_hetero'] and node_feats: + feat_store.put_global_id(node_feats['global_id'], group_name=None) + for key, value in node_feats['feats'].items(): + feat_store.put_tensor(value, group_name=None, attr_name=key) + if 'time' in node_feats: + feat_store.put_tensor(node_feats['time'], group_name=None, attr_name='time') + + if not meta['is_hetero'] and edge_feats: + if 'global_id' in edge_feats: + feat_store.put_global_id(edge_feats['global_id'], group_name=(None, None)) + if 'feats' in edge_feats: + for key, value in edge_feats['feats'].items(): + feat_store.put_tensor(value, group_name=(None, None), attr_name=key) + if 'edge_time' in edge_feats: + feat_store.put_tensor(edge_feats['edge_time'], group_name=(None, None), attr_name='edge_time') + + if meta['is_hetero'] and node_feats: + for node_type, node_feat in node_feats.items(): + feat_store.put_global_id(node_feat['global_id'], group_name=node_type) + for key, value in node_feat['feats'].items(): + feat_store.put_tensor(value, group_name=node_type, attr_name=key) + if 'time' in node_feat: + feat_store.put_tensor(node_feat['time'], group_name=node_type, attr_name='time') + + if meta['is_hetero'] and edge_feats: + for edge_type, edge_feat in edge_feats.items(): + if 'global_id' in edge_feat: + feat_store.put_global_id(edge_feat['global_id'], group_name=edge_type) + if 'feats' in edge_feat: + for key, value in edge_feat['feats'].items(): + feat_store.put_tensor(value, group_name=edge_type, attr_name=key) + if 'edge_time' in edge_feat: + feat_store.put_tensor(edge_feat['edge_time'], group_name=edge_type, attr_name='edge_time') + + return feat_store diff --git a/jointContribution/mattergen/paddle_geometric/distributed/local_graph_store.py b/jointContribution/mattergen/paddle_geometric/distributed/local_graph_store.py new file mode 100644 index 00000000..d46a1ce0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/local_graph_store.py @@ -0,0 +1,226 @@ +import os.path as osp +from typing import Any, Dict, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import EdgeAttr, GraphStore +from paddle_geometric.distributed.partition import load_partition_info +from paddle_geometric.io import fs +from paddle_geometric.typing import EdgeTensorType, EdgeType, NodeType +from paddle_geometric.utils import sort_edge_index + + +class LocalGraphStore(GraphStore): + r"""Implements the :class:`~paddle_geometric.data.GraphStore` interface to + act as a local graph store for distributed training. + """ + def __init__(self): + super().__init__() + self._edge_index: Dict[Tuple, EdgeTensorType] = {} + self._edge_attr: Dict[Tuple, EdgeAttr] = {} + self._edge_id: Dict[Tuple, Tensor] = {} + + self.num_partitions = 1 + self.partition_idx = 0 + # Mapping between node ID and partition ID + self.node_pb: Union[Tensor, Dict[NodeType, Tensor]] = None + # Mapping between edge ID and partition ID + self.edge_pb: Union[Tensor, Dict[EdgeType, Tensor]] = None + # Meta information related to partition and graph store info + self.meta: Optional[Dict[Any, Any]] = None + # If data is sorted based on destination nodes (CSC format): + self.is_sorted: Optional[bool] = None + + @staticmethod + def key(attr: EdgeAttr) -> Tuple: + return (attr.edge_type, attr.layout.value) + + def get_partition_ids_from_nids( + self, + ids: paddle.Tensor, + node_type: Optional[NodeType] = None, + ) -> Tensor: + r"""Returns the partition IDs of node IDs for a specific node type.""" + if self.meta['is_hetero']: + return self.node_pb[node_type][ids] + else: + return self.node_pb[ids] + + def get_partition_ids_from_eids(self, eids: paddle.Tensor, + edge_type: Optional[EdgeType] = None): + r"""Returns the partition IDs of edge IDs for a specific edge type.""" + if self.meta['is_hetero']: + return self.edge_pb[edge_type][eids] + else: + return self.edge_pb[eids] + + def put_edge_id(self, edge_id: Tensor, *args, **kwargs) -> bool: + edge_attr = self._edge_attr_cls.cast(*args, **kwargs) + self._edge_id[self.key(edge_attr)] = edge_id + return True + + def get_edge_id(self, *args, **kwargs) -> Optional[EdgeTensorType]: + edge_attr = self._edge_attr_cls.cast(*args, **kwargs) + return self._edge_id.get(self.key(edge_attr)) + + def remove_edge_id(self, *args, **kwargs) -> bool: + edge_attr = self._edge_attr_cls.cast(*args, **kwargs) + return self._edge_id.pop(self.key(edge_attr), None) is not None + + def _put_edge_index(self, edge_index: EdgeTensorType, + edge_attr: EdgeAttr) -> bool: + self._edge_index[self.key(edge_attr)] = edge_index + self._edge_attr[self.key(edge_attr)] = edge_attr + return True + + def _get_edge_index(self, edge_attr: EdgeAttr) -> Optional[EdgeTensorType]: + return self._edge_index.get(self.key(edge_attr), None) + + def _remove_edge_index(self, edge_attr: EdgeAttr) -> bool: + self._edge_attr.pop(self.key(edge_attr), None) + return self._edge_index.pop(self.key(edge_attr), None) is not None + + def get_all_edge_attrs(self) -> List[EdgeAttr]: + return [self._edge_attr[key] for key in self._edge_index.keys()] + + # Initialization ########################################################## + + @classmethod + def from_data( + cls, + edge_id: Tensor, + edge_index: Tensor, + num_nodes: int, + is_sorted: bool = False, + ) -> 'LocalGraphStore': + r"""Creates a local graph store from a homogeneous or heterogenous + :pyg:`PyG` graph. + + Args: + edge_id (paddle.Tensor): The global identifier for every local edge. + edge_index (paddle.Tensor): The local edge indices. + num_nodes (int): The number of nodes in the local graph. + is_sorted (bool): Whether edges are sorted by column/destination + nodes (CSC format). (default: :obj:`False`) + """ + graph_store = cls() + graph_store.meta = {'is_hetero': False} + + if not is_sorted: + edge_index, edge_id = sort_edge_index( + edge_index, + edge_id, + sort_by_row=False, + ) + + attr = dict( + edge_type=None, + layout='coo', + size=(num_nodes, num_nodes), + is_sorted=True, + ) + + graph_store.put_edge_index(edge_index, **attr) + graph_store.put_edge_id(edge_id, **attr) + + return graph_store + + @classmethod + def from_hetero_data( + cls, + edge_id_dict: Dict[EdgeType, Tensor], + edge_index_dict: Dict[EdgeType, Tensor], + num_nodes_dict: Dict[NodeType, int], + is_sorted: bool = False, + ) -> "LocalGraphStore": + r"""Creates a local graph store from a heterogeneous :pyg:`PyG` graph. + + Args: + edge_id_dict (Dict[EdgeType, paddle.Tensor]): The global identifier + for every local edge of every edge type. + edge_index_dict (Dict[EdgeType, paddle.Tensor]): The local edge + indices of every edge type. + num_nodes_dict: (Dict[str, int]): The number of nodes for every + node type. + is_sorted (bool): Whether edges are sorted by column/destination + nodes (CSC format). (default: :obj:`False`) + """ + graph_store = cls() + graph_store.meta = {'is_hetero': True} + + for edge_type, edge_index in edge_index_dict.items(): + src, _, dst = edge_type + attr = dict( + edge_type=edge_type, + layout='coo', + size=(num_nodes_dict[src], num_nodes_dict[dst]), + is_sorted=True, + ) + edge_id = edge_id_dict[edge_type] + if not is_sorted: + edge_index, edge_id = sort_edge_index( + edge_index, + edge_id, + sort_by_row=False, + ) + graph_store.put_edge_index(edge_index, **attr) + graph_store.put_edge_id(edge_id, **attr) + return graph_store + + @classmethod + def from_partition(cls, root: str, pid: int) -> 'LocalGraphStore': + part_dir = osp.join(root, f'part_{pid}') + assert osp.exists(part_dir) + graph_store = cls() + ( + meta, + num_partitions, + partition_idx, + node_pb, + edge_pb, + ) = load_partition_info(root, pid) + graph_store.num_partitions = num_partitions + graph_store.partition_idx = partition_idx + graph_store.node_pb = node_pb + graph_store.edge_pb = edge_pb + graph_store.meta = meta + + graph_data = fs.paddle_load(osp.join(part_dir, 'graph.pdparams')) + graph_store.is_sorted = meta['is_sorted'] + + if not meta['is_hetero']: + edge_index = paddle.stack([graph_data['row'], graph_data['col']], + axis=0) + edge_id = graph_data['edge_id'] + if not graph_store.is_sorted: + edge_index, edge_id = sort_edge_index(edge_index, edge_id, + sort_by_row=False) + + attr = dict( + edge_type=None, + layout='coo', + size=graph_data['size'], + is_sorted=True, + ) + graph_store.put_edge_index(edge_index, **attr) + graph_store.put_edge_id(edge_id, **attr) + + if meta['is_hetero']: + for edge_type, data in graph_data.items(): + attr = dict( + edge_type=edge_type, + layout='coo', + size=data['size'], + is_sorted=True, + ) + edge_index = paddle.stack([data['row'], data['col']], axis=0) + edge_id = data['edge_id'] + + if not graph_store.is_sorted: + edge_index, edge_id = sort_edge_index( + edge_index, edge_id, sort_by_row=False) + graph_store.put_edge_index(edge_index, **attr) + graph_store.put_edge_id(edge_id, **attr) + + return graph_store diff --git a/jointContribution/mattergen/paddle_geometric/distributed/partition.py b/jointContribution/mattergen/paddle_geometric/distributed/partition.py new file mode 100644 index 00000000..94325d04 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/partition.py @@ -0,0 +1,378 @@ +import json +import logging +import os +import os.path as osp +from collections import defaultdict +from typing import Dict, List, Optional, Tuple, Union + +import paddle + +import paddle_geometric.distributed as pyg_dist +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.io import fs +from paddle_geometric.loader.cluster import ClusterData +from paddle_geometric.sampler.utils import sort_csc +from paddle_geometric.typing import EdgeType, EdgeTypeStr, NodeType + + +class Partitioner: + r"""Partitions the graph and its features of a + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object. + + Partitioned data output will be structured as shown below. + + **Homogeneous graphs:** + + .. code-block:: none + + root/ + |-- META.json + |-- node_map.pdparams + |-- edge_map.pdparams + |-- part0/ + |-- graph.pdparams + |-- node_feats.pdparams + |-- edge_feats.pdparams + |-- part1/ + |-- graph.pdparams + |-- node_feats.pdparams + |-- edge_feats.pdparams + + **Heterogeneous graphs:** + + .. code-block:: none + + root/ + |-- META.json + |-- node_map/ + |-- ntype1.pdparams + |-- ntype2.pdparams + |-- edge_map/ + |-- etype1.pdparams + |-- etype2.pdparams + |-- part0/ + |-- graph.pdparams + |-- node_feats.pdparams + |-- edge_feats.pdparams + |-- part1/ + |-- graph.pdparams + |-- node_feats.pdparams + |-- edge_feats.pdparams + + Args: + data (Data or HeteroData): The data object. + num_parts (int): The number of partitions. + recursive (bool, optional): If set to :obj:`True`, will use multilevel + recursive bisection instead of multilevel k-way partitioning. + (default: :obj:`False`) + root (str): Root directory where the partitioned dataset should be + saved. + """ + def __init__( + self, + data: Union[Data, HeteroData], + num_parts: int, + root: str, + recursive: bool = False, + ): + assert num_parts > 1 + + self.data = data + self.num_parts = num_parts + self.root = root + self.recursive = recursive + + @property + def is_hetero(self) -> bool: + return isinstance(self.data, HeteroData) + + @property + def is_node_level_time(self) -> bool: + if 'time' not in self.data: + return False + + if self.is_hetero: + return any(['time' in store for store in self.data.node_stores]) + + return self.data.is_node_attr('time') + + @property + def is_edge_level_time(self) -> bool: + if 'edge_time' in self.data: + return True + + if 'time' not in self.data: + return False + + if self.is_hetero: + return any(['time' in store for store in self.data.edge_stores]) + + return self.data.is_edge_attr('time') + + @property + def node_types(self) -> Optional[List[NodeType]]: + return self.data.node_types if self.is_hetero else None + + @property + def edge_types(self) -> Optional[List[EdgeType]]: + return self.data.edge_types if self.is_hetero else None + + def generate_partition(self): + r"""Generates the partitions.""" + os.makedirs(self.root, exist_ok=True) + + if self.is_hetero and self.is_node_level_time: + time_data = { # Get temporal information before converting data: + node_type: self.data[node_type].time + for node_type in self.data.node_types + } + + data = self.data.to_homogeneous() if self.is_hetero else self.data + cluster_data = ClusterData( + data, + num_parts=self.num_parts, + recursive=self.recursive, + log=True, + keep_inter_cluster_edges=True, + sparse_format='csc', + ) + + node_perm = cluster_data.partition.node_perm + partptr = cluster_data.partition.partptr + edge_perm = cluster_data.partition.edge_perm + + node_map = paddle.zeros([data.num_nodes], dtype=paddle.int64) + edge_map = paddle.zeros([data.num_edges], dtype=paddle.int64) + node_offset, edge_offset = {}, {} + + if self.is_hetero: + offset = 0 + for node_type in self.node_types: + node_offset[node_type] = offset + offset += self.data[node_type].num_nodes + + offset = 0 + for edge_name in self.edge_types: + edge_offset[edge_name] = offset + offset += self.data.num_edges_dict[edge_name] + + edge_start = 0 + for pid in range(self.num_parts): + logging.info(f'Saving graph partition {pid}') + path = osp.join(self.root, f'part_{pid}') + os.makedirs(path, exist_ok=True) + + part_data = cluster_data[pid] + start, end = int(partptr[pid]), int(partptr[pid + 1]) + + num_edges = part_data.num_edges + edge_id = edge_perm[edge_start:edge_start + num_edges] + edge_map[edge_id] = pid + edge_start += num_edges + + node_id = node_perm[start:end] + node_map[node_id] = pid + + graph = {} + efeat = defaultdict(dict) + for i, edge_type in enumerate(self.edge_types): + # Row vector refers to source nodes. + # Column vector refers to destination nodes. + src, _, dst = edge_type + size = (self.data[src].num_nodes, self.data[dst].num_nodes) + + mask = part_data.edge_type == i + row = part_data.edge_index[0, mask] + col = part_data.edge_index[1, mask] + global_col = node_id[col] + global_row = node_perm[row] + + edge_time = src_node_time = None + if self.is_edge_level_time: + if 'edge_time' in part_data: + edge_time = part_data.edge_time[mask] + elif 'time' in part_data: + edge_time = part_data.time[mask] + + elif self.is_node_level_time: + src_node_time = time_data[src] + + offsetted_row = global_row - node_offset[src] + offsetted_col = global_col - node_offset[dst] + # Sort by column to avoid keeping track of permutations in + # `NeighborSampler` when converting to CSC format: + offsetted_row, offsetted_col, perm = sort_csc( + offsetted_row, offsetted_col, src_node_time, edge_time) + + global_eid = edge_id[mask][perm] + graph[edge_type] = { + 'edge_id': global_eid, + 'row': offsetted_row, + 'col': offsetted_col, + 'size': size, + } + + if 'edge_attr' in part_data: + edge_attr = part_data.edge_attr[mask][perm] + efeat[edge_type].update({ + 'global_id': + offsetted_eid, + 'feats': + dict(edge_attr=edge_attr), + }) + if self.is_edge_level_time: + efeat[edge_type].update({'edge_time': edge_time[perm]}) + + paddle.save(efeat, osp.join(path, 'edge_feats.pdparams')) + paddle.save(graph, osp.join(path, 'graph.pdparams')) + + nfeat = {} + for i, node_type in enumerate(self.node_types): + mask = part_data.node_type == i + x = part_data.x[mask] if 'x' in part_data else None + nfeat[node_type] = { + 'global_id': node_id[mask], + 'id': node_id[mask] - node_offset[node_type], + 'feats': dict(x=x), + } + if self.is_node_level_time: + nfeat[node_type].update({'time': time_data[node_type]}) + + paddle.save(nfeat, osp.join(path, 'node_feats.pdparams')) + + logging.info('Saving partition mapping info') + path = osp.join(self.root, 'node_map') + os.makedirs(path, exist_ok=True) + for i, node_type in enumerate(self.node_types): + mask = data.node_type == i + paddle.save(node_map[mask], osp.join(path, f'{node_type}.pdparams')) + + path = osp.join(self.root, 'edge_map') + os.makedirs(path, exist_ok=True) + for i, edge_type in enumerate(self.edge_types): + mask = data.edge_type == i + paddle.save( + edge_map[mask], + osp.join(path, f'{EdgeTypeStr(edge_type)}.pdparams'), + ) + + else: # `if not self.is_hetero:` + edge_start = 0 + for pid in range(self.num_parts): + logging.info(f'Saving graph partition {pid}') + path = osp.join(self.root, f'part_{pid}') + os.makedirs(path, exist_ok=True) + + part_data = cluster_data[pid] + start, end = int(partptr[pid]), int(partptr[pid + 1]) + + num_edges = part_data.num_edges + edge_id = edge_perm[edge_start:edge_start + num_edges] + edge_map[edge_id] = pid + edge_start += num_edges + + node_id = node_perm[start:end] # global node_ids + node_map[node_id] = pid # 0 or 1 + + row = part_data.edge_index[0] + col = part_data.edge_index[1] + + global_col = node_id[col] # part_ids -> global + global_row = node_perm[row] + + edge_time = node_time = None + if self.is_edge_level_time: + if 'edge_time' in part_data: + edge_time = part_data.edge_time + elif 'time' in part_data: + edge_time = part_data.time + + elif self.is_node_level_time: + node_time = data.time + + # Sort by column to avoid keeping track of permuations in + # `NeighborSampler` when converting to CSC format: + global_row, global_col, perm = sort_csc( + global_row, global_col, node_time, edge_time) + + edge_id = edge_id[perm] + + paddle.save( + { + 'edge_id': edge_id, + 'row': global_row, + 'col': global_col, + 'size': (data.num_nodes, data.num_nodes), + }, osp.join(path, 'graph.pdparams')) + + nfeat = { + 'global_id': node_id, + 'feats': dict(x=part_data.x), + } + if self.is_node_level_time: + nfeat.update({'time': data.time}) + + paddle.save(nfeat, osp.join(path, 'node_feats.pdparams')) + + efeat = defaultdict() + if 'edge_attr' in part_data: + efeat.update({ + 'global_id': + edge_id, + 'feats': + dict(edge_attr=part_data.edge_attr[perm]), + }) + if self.is_edge_level_time: + efeat.update({'edge_time': edge_time[perm]}) + + paddle.save(efeat, osp.join(path, 'edge_feats.pdparams')) + + logging.info('Saving partition mapping info') + paddle.save(node_map, osp.join(self.root, 'node_map.pdparams')) + paddle.save(edge_map, osp.join(self.root, 'edge_map.pdparams')) + + logging.info('Saving metadata') + meta = { + 'num_parts': self.num_parts, + 'node_types': self.node_types, + 'edge_types': self.edge_types, + 'node_offset': list(node_offset.values()) if node_offset else None, + 'is_hetero': self.is_hetero, + 'is_sorted': True, # Based on column/destination. + } + with open(osp.join(self.root, 'META.json'), 'w') as f: + json.dump(meta, f) + + +def load_partition_info( + root_dir: str, + partition_idx: int, +) -> Tuple[Dict, int, int, paddle.Tensor, paddle.Tensor]: + with open(osp.join(root_dir, 'META.json'), 'rb') as infile: + meta = json.load(infile) + num_partitions = meta['num_parts'] + assert partition_idx >= 0 + assert partition_idx < num_partitions + partition_dir = osp.join(root_dir, f'part_{partition_idx}') + assert osp.exists(partition_dir) + + if meta['is_hetero'] is False: + node_pb = fs.paddle_load(osp.join(root_dir, 'node_map.pdparams')) + edge_pb = fs.paddle_load(osp.join(root_dir, 'edge_map.pdparams')) + + return (meta, num_partitions, partition_idx, node_pb, edge_pb) + else: + node_pb_dict = {} + node_pb_dir = osp.join(root_dir, 'node_map') + for ntype in meta['node_types']: + node_pb_dict[ntype] = fs.paddle_load( + osp.join(node_pb_dir, f'{pyg_dist.utils.as_str(ntype)}.pdparams')) + + edge_pb_dict = {} + edge_pb_dir = osp.join(root_dir, 'edge_map') + for etype in meta['edge_types']: + edge_pb_dict[tuple(etype)] = fs.paddle_load( + osp.join(edge_pb_dir, f'{pyg_dist.utils.as_str(etype)}.pdparams')) + + return (meta, num_partitions, partition_idx, node_pb_dict, edge_pb_dict) diff --git a/jointContribution/mattergen/paddle_geometric/distributed/rpc.py b/jointContribution/mattergen/paddle_geometric/distributed/rpc.py new file mode 100644 index 00000000..fecdbd4e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/rpc.py @@ -0,0 +1,159 @@ +import logging +import threading +from abc import ABC, abstractmethod +from typing import Any, Callable, Dict, List, Optional + +import paddle.distributed as dist +from paddle_geometric.distributed.dist_context import DistContext, DistRole + +try: + from paddle.distributed import rpc_is_initialized +except ImportError: + def rpc_is_initialized() -> bool: + return False + +_rpc_init_lock = threading.RLock() + +def rpc_require_initialized(func: Callable) -> Callable: + def wrapper(*args, **kwargs): + if not rpc_is_initialized(): + raise RuntimeError("RPC is not initialized.") + return func(*args, **kwargs) + return wrapper + +@rpc_require_initialized +def global_all_gather(obj: Any) -> List[Any]: + """Gathers objects from all groups in a list.""" + return dist.rpc.all_gather(obj) + +@rpc_require_initialized +def global_barrier(): + """Barrier function for all RPC processes.""" + try: + global_all_gather(obj=None) + except RuntimeError: + logging.error('Failed to respond to global barrier') + +def init_rpc( + current_ctx: DistContext, + master_addr: str, + master_port: int, + num_rpc_threads: int = 16, + rpc_timeout: float = 240.0, + rpc_worker_names: Optional[Dict[DistRole, List[str]]] = None, +): + with _rpc_init_lock: + if rpc_is_initialized(): + return + + if current_ctx is None: + raise RuntimeError("'dist_context' has not been set in 'init_rpc'") + + options = { + "transports": ['tcp'], + "num_threads": num_rpc_threads, + "timeout": rpc_timeout, + "init_method": f"tcp://{master_addr}:{master_port}" + } + dist.rpc.init_rpc( + name=current_ctx.worker_name, + rank=current_ctx.global_rank, + world_size=current_ctx.global_world_size, + options=options + ) + + global_barrier() + +def shutdown_rpc(id: str = None, graceful: bool = True): + with _rpc_init_lock: + if rpc_is_initialized(): + logging.info(f"Shutting down RPC in {id} gracefully.") + dist.rpc.shutdown(graceful) + else: + logging.info(f'RPC in {id} not initialized.') + +class RPCRouter: + """Router to retrieve workers based on partition ID.""" + def __init__(self, partition_to_workers: List[List[str]]): + for pid, rpc_worker_list in enumerate(partition_to_workers): + if len(rpc_worker_list) == 0: + raise ValueError('No RPC worker in worker list') + self.partition_to_workers = partition_to_workers + self.rpc_worker_indices = [0 for _ in range(len(partition_to_workers))] + + def get_to_worker(self, partition_idx: int) -> str: + rpc_worker_list = self.partition_to_workers[partition_idx] + worker_idx = self.rpc_worker_indices[partition_idx] + router_worker = rpc_worker_list[worker_idx] + self.rpc_worker_indices[partition_idx] = (worker_idx + 1) % len(rpc_worker_list) + return router_worker + +@rpc_require_initialized +def rpc_partition_to_workers( + current_ctx: DistContext, + num_partitions: int, + current_partition_idx: int, +) -> List[List[str]]: + """Maps partitions to workers through `all_gather`.""" + partition_to_workers = [[] for _ in range(num_partitions)] + gathered_results = global_all_gather((current_ctx.role, num_partitions, current_partition_idx)) + for worker_name, (role, nparts, idx) in gathered_results.items(): + partition_to_workers[idx].append(worker_name) + return partition_to_workers + +class RPCCallBase(ABC): + """Base class for RPC call wrappers.""" + @abstractmethod + def rpc_sync(self, *args, **kwargs): + pass + + @abstractmethod + def rpc_async(self, *args, **kwargs): + pass + +_rpc_call_lock = threading.RLock() +_rpc_call_id: int = 0 +_rpc_call_pool: Dict[int, RPCCallBase] = {} + +@rpc_require_initialized +def rpc_register(call: RPCCallBase) -> int: + """Registers an RPC call.""" + global _rpc_call_id, _rpc_call_pool + + with _rpc_call_lock: + call_id = _rpc_call_id + _rpc_call_id += 1 + if call_id in _rpc_call_pool: + raise RuntimeError("Registered function twice in 'rpc_register'") + _rpc_call_pool[call_id] = call + + return call_id + +def _rpc_async_call(call_id: int, *args, **kwargs): + """Entry point for asynchronous RPC calls.""" + return _rpc_call_pool.get(call_id).rpc_async(*args, **kwargs) + +@rpc_require_initialized +def rpc_async(worker_name: str, call_id: int, args=None, kwargs=None): + """Performs an asynchronous RPC request.""" + return dist.rpc.rpc_async( + worker_name, + _rpc_async_call, + args=(call_id, *args), + kwargs=kwargs, + ) + +def _rpc_sync_call(call_id: int, *args, **kwargs): + """Entry point for synchronous RPC calls.""" + return _rpc_call_pool.get(call_id).rpc_sync(*args, **kwargs) + +@rpc_require_initialized +def rpc_sync(worker_name: str, call_id: int, args=None, kwargs=None): + """Performs a synchronous RPC request.""" + future = dist.rpc.rpc_async( + worker_name, + _rpc_sync_call, + args=(call_id, *args), + kwargs=kwargs, + ) + return future.wait() diff --git a/jointContribution/mattergen/paddle_geometric/distributed/utils.py b/jointContribution/mattergen/paddle_geometric/distributed/utils.py new file mode 100644 index 00000000..c2deb47f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/distributed/utils.py @@ -0,0 +1,154 @@ +from dataclasses import dataclass +from typing import Dict, List, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import HeteroData +from paddle_geometric.distributed.local_feature_store import LocalFeatureStore +from paddle_geometric.distributed.local_graph_store import LocalGraphStore +from paddle_geometric.sampler import SamplerOutput +from paddle_geometric.typing import EdgeType, NodeType + + +@dataclass +class DistEdgeHeteroSamplerInput: + r"""The sampling input of + :meth:`~paddle_geometric.distributed.DistNeighborSampler.node_sample` + used during distributed heterogeneous link sampling when source and + target node types of an input edge are different. + """ + input_id: Optional[Tensor] + node_dict: Dict[NodeType, Tensor] + time_dict: Optional[Dict[NodeType, Tensor]] = None + input_type: Optional[EdgeType] = None + + +class NodeDict: + r"""Class used during heterogeneous sampling.""" + def __init__(self, node_types, num_hops): + self.src: Dict[NodeType, List[Tensor]] = { + k: (num_hops + 1) * [paddle.zeros([0], dtype='int64')] + for k in node_types + } + self.with_dupl: Dict[NodeType, Tensor] = { + k: paddle.zeros([0], dtype='int64') + for k in node_types + } + self.out: Dict[NodeType, Tensor] = { + k: paddle.zeros([0], dtype='int64') + for k in node_types + } + self.seed_time: Dict[NodeType, List[Tensor]] = { + k: num_hops * [paddle.zeros([0], dtype='int64')] + for k in node_types + } + + +class BatchDict: + r"""Class used during disjoint heterogeneous sampling.""" + def __init__(self, node_types, num_hops): + self.src: Dict[NodeType, List[Tensor]] = { + k: (num_hops + 1) * [paddle.zeros([0], dtype='int64')] + for k in node_types + } + self.with_dupl: Dict[NodeType, Tensor] = { + k: paddle.zeros([0], dtype='int64') + for k in node_types + } + self.out: Dict[NodeType, Tensor] = { + k: paddle.zeros([0], dtype='int64') + for k in node_types + } + + +def remove_duplicates( + out: SamplerOutput, + node: Tensor, + batch: Optional[Tensor] = None, + disjoint: bool = False, +) -> Tuple[Tensor, Tensor, Optional[Tensor], Optional[Tensor]]: + num_nodes = node.shape[0] + node_combined = paddle.concat([node, out.node]) + + if not disjoint: + _, idx = np.unique(node_combined.numpy(), return_index=True) + idx = paddle.to_tensor(idx).sort().values + node = paddle.index_select(node_combined, index=idx) + src = node[num_nodes:] + return (src, node, None, None) + else: + batch_combined = paddle.concat([batch, out.batch]) + node_batch = paddle.stack([batch_combined, node_combined], axis=0) + _, idx = np.unique(node_batch.numpy(), axis=1, return_index=True) + idx = paddle.to_tensor(idx).sort().values + batch = paddle.index_select(batch_combined, index=idx) + node = paddle.index_select(node_combined, index=idx) + src_batch = batch[num_nodes:] + src = node[num_nodes:] + return (src, node, src_batch, batch) + + +def filter_dist_store( + feature_store: LocalFeatureStore, + graph_store: LocalGraphStore, + node_dict: Dict[str, Tensor], + row_dict: Dict[str, Tensor], + col_dict: Dict[str, Tensor], + edge_dict: Dict[str, Optional[Tensor]], + custom_cls: Optional[HeteroData] = None, + meta: Optional[Dict[str, Tensor]] = None, + input_type: str = None, +) -> HeteroData: + r"""Constructs a :class:`HeteroData` object from a feature store.""" + data = custom_cls() if custom_cls is not None else HeteroData() + nfeats, labels, efeats = meta[-3:] + + required_edge_attrs = [] + for attr in graph_store.get_all_edge_attrs(): + key = attr.edge_type + if key in row_dict and key in col_dict: + required_edge_attrs.append(attr) + edge_index = paddle.stack([row_dict[key], col_dict[key]], axis=0) + data[attr.edge_type].edge_index = edge_index + + required_node_attrs = [] + for attr in feature_store.get_all_tensor_attrs(): + if attr.group_name in node_dict: + attr.index = node_dict[attr.group_name] + required_node_attrs.append(attr) + data[attr.group_name].num_nodes = attr.index.shape[0] + + if nfeats: + for attr in required_node_attrs: + if nfeats[attr.group_name] is not None: + data[attr.group_name][attr.attr_name] = nfeats[attr.group_name] + + if efeats: + for attr in required_edge_attrs: + if efeats[attr.edge_type] is not None: + data[attr.edge_type].edge_attr = efeats[attr.edge_type] + + if labels: + data[input_type].y = labels[input_type] + + return data + + +def as_str(inputs: Union[NodeType, EdgeType]) -> str: + if isinstance(inputs, NodeType): + return inputs + elif isinstance(inputs, (list, tuple)) and len(inputs) == 3: + return '__'.join(inputs) + return '' + + +def reverse_edge_type(etype: EdgeType) -> EdgeType: + src, rel, dst = etype + if src != dst: + if rel.split('_', 1)[0] == 'rev': + rel = rel.split('_', 1)[1] + else: + rel = 'rev_' + rel + return dst, rel, src diff --git a/jointContribution/mattergen/paddle_geometric/edge_index.py b/jointContribution/mattergen/paddle_geometric/edge_index.py new file mode 100644 index 00000000..352e6a36 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/edge_index.py @@ -0,0 +1,1963 @@ +import functools +from enum import Enum +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + Literal, + NamedTuple, + Optional, + Sequence, + Tuple, + Type, + Union, + get_args, + overload, +) + +import paddle +from .pytree import pytree +from paddle import Tensor +from paddle.autograd import PyLayer +import paddle_geometric.typing +from paddle_geometric import Index, is_compiling +from paddle_geometric.index import index2ptr, ptr2index +from paddle_geometric.typing import INDEX_DTYPES, SparseTensor + +# aten = paddle.ops.aten + +HANDLED_FUNCTIONS: Dict[Callable, Callable] = {} + +ReduceType = Literal['sum', 'mean', 'amin', 'amax', 'add', 'min', 'max'] +PYG_REDUCE: Dict[ReduceType, ReduceType] = { + 'add': 'sum', + 'amin': 'min', + 'amax': 'max' +} +TORCH_REDUCE: Dict[ReduceType, ReduceType] = { + 'add': 'sum', + 'min': 'amin', + 'max': 'amax' +} + + +class SortOrder(Enum): + ROW = 'row' + COL = 'col' + + +class CatMetadata(NamedTuple): + nnz: List[int] + sparse_size: List[Tuple[Optional[int], Optional[int]]] + sort_order: List[Optional[SortOrder]] + is_undirected: List[bool] + + +# def implements(paddle_function: Callable) -> Callable: +# r"""Registers a Paddle function override.""" +# @functools.wraps(paddle_function) +# def decorator(my_function: Callable) -> Callable: +# HANDLED_FUNCTIONS[paddle_function] = my_function +# return my_function +# +# return decorator + + +def set_tuple_item( + values: Tuple[Any, ...], + dim: int, + value: Any, +) -> Tuple[Any, ...]: + if dim < -len(values) or dim >= len(values): + raise IndexError("tuple index out of range") + + dim = dim + len(values) if dim < 0 else dim + return values[:dim] + (value, ) + values[dim + 1:] + + +def maybe_add( + value: Sequence[Optional[int]], + other: Union[int, Sequence[Optional[int]]], + alpha: int = 1, +) -> Tuple[Optional[int], ...]: + + if isinstance(other, int): + return tuple(v + alpha * other if v is not None else None + for v in value) + + assert len(value) == len(other) + return tuple(v + alpha * o if v is not None and o is not None else None + for v, o in zip(value, other)) + + +def maybe_sub( + value: Sequence[Optional[int]], + other: Union[int, Sequence[Optional[int]]], + alpha: int = 1, +) -> Tuple[Optional[int], ...]: + + if isinstance(other, int): + return tuple(v - alpha * other if v is not None else None + for v in value) + + assert len(value) == len(other) + return tuple(v - alpha * o if v is not None and o is not None else None + for v, o in zip(value, other)) + + +def assert_valid_dtype(tensor: Tensor) -> None: + if tensor.dtype not in INDEX_DTYPES: + raise ValueError(f"'EdgeIndex' holds an unsupported data type " + f"(got '{tensor.dtype}', but expected one of " + f"{INDEX_DTYPES})") + + +def assert_two_dimensional(tensor: Tensor) -> None: + if tensor.dim() != 2: + raise ValueError(f"'EdgeIndex' needs to be two-dimensional " + f"(got {tensor.dim()} dimensions)") + if not paddle.in_dynamic_mode() and tensor.shape[0] != 2: + raise ValueError(f"'EdgeIndex' needs to have a shape of " + f"[2, *] (got {list(tensor.shape)})") + + +def assert_contiguous(tensor: Tensor) -> None: + if not tensor[0].is_contiguous() or not tensor[1].is_contiguous(): + raise ValueError("'EdgeIndex' needs to be contiguous. Please call " + "`edge_index.contiguous()` before proceeding.") + + +def assert_symmetric(size: Tuple[Optional[int], Optional[int]]) -> None: + if (not paddle.in_dynamic_mode() and size[0] is not None + and size[1] is not None and size[0] != size[1]): + raise ValueError(f"'EdgeIndex' is undirected but received a " + f"non-symmetric size (got {list(size)})") + + +def assert_sorted(func: Callable) -> Callable: + @functools.wraps(func) + def wrapper(self: 'EdgeIndex', *args: Any, **kwargs: Any) -> Any: + if not self.is_sorted: + cls_name = self.__class__.__name__ + raise ValueError( + f"Cannot call '{func.__name__}' since '{cls_name}' is not " + f"sorted. Please call `{cls_name}.sort_by(...)` first.") + return func(self, *args, **kwargs) + + return wrapper + + +class EdgeIndex(Tensor): + r"""A COO :obj:`edge_index` tensor with additional (meta)data attached. + + :class:`EdgeIndex` is a :pytorch:`null` :class:`torch.Tensor`, that holds + an :obj:`edge_index` representation of shape :obj:`[2, num_edges]`. + Edges are given as pairwise source and destination node indices in sparse + COO format. + + While :class:`EdgeIndex` sub-classes a general :pytorch:`null` + :class:`torch.Tensor`, it can hold additional (meta)data, *i.e.*: + + * :obj:`sparse_size`: The underlying sparse matrix size + * :obj:`sort_order`: The sort order (if present), either by row or column. + * :obj:`is_undirected`: Whether edges are bidirectional. + + Additionally, :class:`EdgeIndex` caches data for fast CSR or CSC conversion + in case its representation is sorted, such as its :obj:`rowptr` or + :obj:`colptr`, or the permutation vector for going from CSR to CSC or vice + versa. + Caches are filled based on demand (*e.g.*, when calling + :meth:`EdgeIndex.sort_by`), or when explicitly requested via + :meth:`EdgeIndex.fill_cache_`, and are maintained and adjusted over its + lifespan (*e.g.*, when calling :meth:`EdgeIndex.flip`). + + This representation ensures optimal computation in GNN message passing + schemes, while preserving the ease-of-use of regular COO-based :pyg:`PyG` + workflows. + + .. code-block:: python + + from paddle_geometric import EdgeIndex + + edge_index = EdgeIndex( + [[0, 1, 1, 2], + [1, 0, 2, 1]] + sparse_size=(3, 3), + sort_order='row', + is_undirected=True, + device='cpu', + ) + >>> EdgeIndex([[0, 1, 1, 2], + ... [1, 0, 2, 1]]) + assert edge_index.is_sorted_by_row + assert edge_index.is_undirected + + # Flipping order: + edge_index = edge_index.flip(0) + >>> EdgeIndex([[1, 0, 2, 1], + ... [0, 1, 1, 2]]) + assert edge_index.is_sorted_by_col + assert edge_index.is_undirected + + # Filtering: + mask = torch.tensor([True, True, True, False]) + edge_index = edge_index[:, mask] + >>> EdgeIndex([[1, 0, 2], + ... [0, 1, 1]]) + assert edge_index.is_sorted_by_col + assert not edge_index.is_undirected + + # Sparse-Dense Matrix Multiplication: + out = edge_index.flip(0) @ torch.randn(3, 16) + assert out.size() == (3, 16) + """ + # See "https://pytorch.org/docs/stable/notes/extending.html" + # for a basic tutorial on how to subclass `torch.Tensor`. + + # The underlying tensor representation: + _data: Tensor + + # The size of the underlying sparse matrix: + _sparse_size: Tuple[Optional[int], Optional[int]] = (None, None) + + # Whether the `edge_index` representation is non-sorted (`None`), or sorted + # based on row or column values. + _sort_order: Optional[SortOrder] = None + + # Whether the `edge_index` is undirected: + # NOTE `is_undirected` allows us to assume symmetric adjacency matrix size + # and to share compressed pointer representations, however, it does not + # allow us get rid of CSR/CSC permutation vectors since ordering within + # neighborhoods is not necessarily deterministic. + _is_undirected: bool = False + + # A cache for its compressed representation: + _indptr: Optional[Tensor] = None + + # A cache for its transposed representation: + _T_perm: Optional[Tensor] = None + _T_index: Tuple[Optional[Tensor], Optional[Tensor]] = (None, None) + _T_indptr: Optional[Tensor] = None + + # A cached "1"-value vector for `torch.sparse` matrix multiplication: + _value: Optional[Tensor] = None + + # Whenever we perform a concatenation of edge indices, we cache the + # original metadata to be able to reconstruct individual edge indices: + _cat_metadata: Optional[CatMetadata] = None + + @staticmethod + def __new__( + cls: Type, + data: Any, + *args: Any, + sparse_size: Optional[Tuple[Optional[int], Optional[int]]] = None, + sort_order: Optional[Union[str, SortOrder]] = None, + is_undirected: bool = False, + **kwargs: Any, + ) -> 'EdgeIndex': + if not isinstance(data, Tensor): + data = paddle.to_tensor(data, *args, **kwargs) + elif len(args) > 0: + raise TypeError( + f"new() received an invalid combination of arguments - got " + f"(Tensor, {', '.join(str(type(arg)) for arg in args)})") + elif len(kwargs) > 0: + raise TypeError(f"new() received invalid keyword arguments - got " + f"{set(kwargs.keys())})") + + assert isinstance(data, Tensor) + + indptr: Optional[Tensor] = None + + if isinstance(data, cls): # If passed `EdgeIndex`, inherit metadata: + indptr = data._indptr + sparse_size = sparse_size or data.sparse_size() + sort_order = sort_order or data.sort_order + is_undirected = is_undirected or data.is_undirected + + # Convert `torch.sparse` tensors to `EdgeIndex` representation: + try: + if data.layout == paddle.sparse_coo: + print("Processing COO sparse tensor...") + sort_order = SortOrder.ROW + sparse_size = sparse_size or (data.shape[0], data.shape[1]) # .shape in Paddle + data = data.indices() + else: + raise AttributeError("paddle.sparse_coo is not available.") + except AttributeError: + print("Warning: paddle.sparse_coo is not supported in the current version of PaddlePaddle.") + + try: + if data.layout == paddle.sparse_csr: + print("Processing CSR sparse tensor...") + indptr = data.row_indices() # CSR row pointers + col = data.col_indices() # CSR column indices + + assert isinstance(indptr, Tensor) + row = ptr2index(indptr, output_size=col.numel()) + + sort_order = SortOrder.ROW + sparse_size = sparse_size or (data.size(0), data.size(1)) + if sparse_size[0] is not None and sparse_size[0] != data.size(0): + indptr = None + data = paddle.concat([row, col], axis=0) # Equivalent to torch.stack + else: + raise AttributeError("paddle.sparse_csr is not available.") + except AttributeError: + print("Warning: paddle.sparse_csr is not supported in the current version of PaddlePaddle.") + + assert_valid_dtype(data) + assert_two_dimensional(data) + assert_contiguous(data) + + if sparse_size is None: + sparse_size = (None, None) + + if is_undirected: + assert_symmetric(sparse_size) + if sparse_size[0] is not None and sparse_size[1] is None: + sparse_size = (sparse_size[0], sparse_size[0]) + elif sparse_size[0] is None and sparse_size[1] is not None: + sparse_size = (sparse_size[1], sparse_size[1]) + + out = Tensor._make_wrapper_subclass( # type: ignore + cls, + size=data.size(), + strides=data.stride(), + dtype=data.dtype, + device=data.device, + layout=data.layout, + requires_grad=False, + ) + assert isinstance(out, EdgeIndex) + + # Attach metadata: + out._data = data + out._sparse_size = sparse_size + out._sort_order = None if sort_order is None else SortOrder(sort_order) + out._is_undirected = is_undirected + out._indptr = indptr + + if isinstance(data, cls): # If passed `EdgeIndex`, inherit metadata: + out._data = data._data + out._T_perm = data._T_perm + out._T_index = data._T_index + out._T_indptr = data._T_indptr + out._value = out._value + + # Reset metadata if cache is invalidated: + num_rows = sparse_size[0] + if num_rows is not None and num_rows != data.sparse_size(0): + out._indptr = None + + num_cols = sparse_size[1] + if num_cols is not None and num_cols != data.sparse_size(1): + out._T_indptr = None + + return out + + # Validation ############################################################## + + def validate(self) -> 'EdgeIndex': + r"""Validates the :class:`EdgeIndex` representation. + + In particular, it ensures that + + * it only holds valid indices. + * the sort order is correctly set. + * indices are bidirectional in case it is specified as undirected. + """ + assert_valid_dtype(self._data) + assert_two_dimensional(self._data) + assert_contiguous(self._data) + if self.is_undirected: + assert_symmetric(self.sparse_size()) + + if self.numel() > 0 and self._data.min() < 0: + raise ValueError(f"'{self.__class__.__name__}' contains negative " + f"indices (got {int(self.min())})") + + if (self.numel() > 0 and self.num_rows is not None + and self._data[0].max() >= self.num_rows): + raise ValueError(f"'{self.__class__.__name__}' contains larger " + f"indices than its number of rows " + f"(got {int(self._data[0].max())}, but expected " + f"values smaller than {self.num_rows})") + + if (self.numel() > 0 and self.num_cols is not None + and self._data[1].max() >= self.num_cols): + raise ValueError(f"'{self.__class__.__name__}' contains larger " + f"indices than its number of columns " + f"(got {int(self._data[1].max())}, but expected " + f"values smaller than {self.num_cols})") + + if self.is_sorted_by_row and (self._data[0].diff() < 0).any(): + raise ValueError(f"'{self.__class__.__name__}' is not sorted by " + f"row indices") + + if self.is_sorted_by_col and (self._data[1].diff() < 0).any(): + raise ValueError(f"'{self.__class__.__name__}' is not sorted by " + f"column indices") + + if self.is_undirected: + flat_index1 = self._data[0] * self.get_num_rows() + self._data[1] + flat_index1 = flat_index1.sort()[0] + flat_index2 = self._data[1] * self.get_num_cols() + self._data[0] + flat_index2 = flat_index2.sort()[0] + if not paddle.equal(flat_index1, flat_index2): + raise ValueError(f"'{self.__class__.__name__}' is not " + f"undirected") + + return self + + # Properties ############################################################## + + @overload + def sparse_size(self) -> Tuple[Optional[int], Optional[int]]: + pass + + @overload + def sparse_size(self, dim: int) -> Optional[int]: + pass + + def sparse_size( + self, + dim: Optional[int] = None, + ) -> Union[Tuple[Optional[int], Optional[int]], Optional[int]]: + r"""The size of the underlying sparse matrix. + If :obj:`dim` is specified, returns an integer holding the size of that + sparse dimension. + + Args: + dim (int, optional): The dimension for which to retrieve the size. + (default: :obj:`None`) + """ + if dim is not None: + return self._sparse_size[dim] + return self._sparse_size + + @property + def num_rows(self) -> Optional[int]: + r"""The number of rows of the underlying sparse matrix.""" + return self._sparse_size[0] + + @property + def num_cols(self) -> Optional[int]: + r"""The number of columns of the underlying sparse matrix.""" + return self._sparse_size[1] + + @property + def sort_order(self) -> Optional[str]: + r"""The sort order of indices, either :obj:`"row"`, :obj:`"col"` or + :obj:`None`. + """ + return None if self._sort_order is None else self._sort_order.value + + @property + def is_sorted(self) -> bool: + r"""Returns whether indices are either sorted by rows or columns.""" + return self._sort_order is not None + + @property + def is_sorted_by_row(self) -> bool: + r"""Returns whether indices are sorted by rows.""" + return self._sort_order == SortOrder.ROW + + @property + def is_sorted_by_col(self) -> bool: + r"""Returns whether indices are sorted by columns.""" + return self._sort_order == SortOrder.COL + + @property + def is_undirected(self) -> bool: + r"""Returns whether indices are bidirectional.""" + return self._is_undirected + + @property + def dtype(self) -> 'paddle.dtype': # Return type as paddle.dtype + # TODO Remove once Paddle does not override `dtype` in DataLoader. + return self._data.dtype # Accessing dtype directly from the tensor + + # Cache Interface ######################################################### + + def get_sparse_size( + self, + dim: Optional[int] = None, + ) -> Union[paddle.shape, int]: + r"""The size of the underlying sparse matrix. + Automatically computed and cached when not explicitly set. + If :obj:`dim` is specified, returns an integer holding the size of that + sparse dimension. + + Args: + dim (int, optional): The dimension for which to retrieve the size. + (default: :obj:`None`) + """ + if dim is not None: + size = self._sparse_size[dim] + if size is not None: + return size + + if self.is_undirected: + size = int(self._data.max()) + 1 if self.numel() > 0 else 0 + self._sparse_size = (size, size) + return size + + size = int(self._data[dim].max()) + 1 if self.numel() > 0 else 0 + self._sparse_size = set_tuple_item(self._sparse_size, dim, size) + return size + + return (self.get_sparse_size(0), self.get_sparse_size(1)) + + def sparse_resize_( # type: ignore + self, + num_rows: Optional[int], + num_cols: Optional[int], + ) -> 'EdgeIndex': + r"""Assigns or re-assigns the size of the underlying sparse matrix. + + Args: + num_rows (int, optional): The number of rows. + num_cols (int, optional): The number of columns. + """ + if self.is_undirected: + if num_rows is not None and num_cols is None: + num_cols = num_rows + elif num_cols is not None and num_rows is None: + num_rows = num_cols + + if num_rows is not None and num_rows != num_cols: + raise ValueError(f"'EdgeIndex' is undirected but received a " + f"non-symmetric size " + f"(got [{num_rows}, {num_cols}])") + + def _modify_ptr( + ptr: Optional[Tensor], + size: Optional[int], + ) -> Optional[Tensor]: + + if ptr is None or size is None: + return None + + if ptr.numel() - 1 >= size: + return ptr[:size + 1] + + fill_value = ptr.new_full( + (size - ptr.numel() + 1, ), + fill_value=ptr[-1], # type: ignore + ) + return paddle.concat([ptr, fill_value], axis=0) + + if self.is_sorted_by_row: + self._indptr = _modify_ptr(self._indptr, num_rows) + self._T_indptr = _modify_ptr(self._T_indptr, num_cols) + + if self.is_sorted_by_col: + self._indptr = _modify_ptr(self._indptr, num_cols) + self._T_indptr = _modify_ptr(self._T_indptr, num_rows) + + self._sparse_size = (num_rows, num_cols) + + return self + + def get_num_rows(self) -> int: + r"""The number of rows of the underlying sparse matrix. + Automatically computed and cached when not explicitly set. + """ + return self.get_sparse_size(0) + + def get_num_cols(self) -> int: + r"""The number of columns of the underlying sparse matrix. + Automatically computed and cached when not explicitly set. + """ + return self.get_sparse_size(1) + + @assert_sorted + def get_indptr(self) -> Tensor: + r"""Returns the compressed index representation in case + :class:`EdgeIndex` is sorted. + """ + if self._indptr is not None: + return self._indptr + + if self.is_undirected and self._T_indptr is not None: + return self._T_indptr + + dim = 0 if self.is_sorted_by_row else 1 + self._indptr = index2ptr(self._data[dim], self.get_sparse_size(dim)) + + return self._indptr + + @assert_sorted + def _sort_by_transpose(self) -> Tuple[Tuple[Tensor, Tensor], Tensor]: + from paddle_geometric.utils import index_sort + + dim = 1 if self.is_sorted_by_row else 0 + + if self._T_perm is None: + max_index = self.get_sparse_size(dim) + index, perm = index_sort(self._data[dim], max_index) + self._T_index = set_tuple_item(self._T_index, dim, index) + self._T_perm = perm.to(self.dtype) + + if self._T_index[1 - dim] is None: + self._T_index = set_tuple_item( # + self._T_index, 1 - dim, self._data[1 - dim][self._T_perm]) + + row, col = self._T_index + assert row is not None and col is not None + + return (row, col), self._T_perm + + @assert_sorted + def get_csr(self) -> Tuple[Tuple[Tensor, Tensor], Optional[Tensor]]: + r"""Returns the compressed CSR representation + :obj:`(rowptr, col), perm` in case :class:`EdgeIndex` is sorted. + """ + if self.is_sorted_by_row: + return (self.get_indptr(), self._data[1]), None + + assert self.is_sorted_by_col + (row, col), perm = self._sort_by_transpose() + + if self._T_indptr is not None: + rowptr = self._T_indptr + elif self.is_undirected and self._indptr is not None: + rowptr = self._indptr + else: + rowptr = self._T_indptr = index2ptr(row, self.get_num_rows()) + + return (rowptr, col), perm + + @assert_sorted + def get_csc(self) -> Tuple[Tuple[Tensor, Tensor], Optional[Tensor]]: + r"""Returns the compressed CSC representation + :obj:`(colptr, row), perm` in case :class:`EdgeIndex` is sorted. + """ + if self.is_sorted_by_col: + return (self.get_indptr(), self._data[0]), None + + assert self.is_sorted_by_row + (row, col), perm = self._sort_by_transpose() + + if self._T_indptr is not None: + colptr = self._T_indptr + elif self.is_undirected and self._indptr is not None: + colptr = self._indptr + else: + colptr = self._T_indptr = index2ptr(col, self.get_num_cols()) + + return (colptr, row), perm + + def _get_value(self, dtype: Optional[paddle.dtype] = None) -> paddle.Tensor: + if self._value is not None: + if (dtype or paddle.get_default_dtype()) == self._value.dtype: + return self._value + + # Expanded tensors are not yet supported in all Paddle code paths :( + # value = paddle.ones([1], dtype=dtype, place=self.place) + # value = value.expand(self.size(1)) + self._value = paddle.ones([self.size(1)], dtype=dtype, place=self.place) + return self._value + + def fill_cache_(self, no_transpose: bool = False) -> 'EdgeIndex': + r"""Fills the cache with (meta)data information. + + Args: + no_transpose (bool, optional): If set to :obj:`True`, will not fill + the cache with information about the transposed + :class:`EdgeIndex`. (default: :obj:`False`) + """ + self.get_sparse_size() + + if self.is_sorted_by_row: + self.get_csr() + if not no_transpose: + self.get_csc() + elif self.is_sorted_by_col: + self.get_csc() + if not no_transpose: + self.get_csr() + + return self + + # Methods ################################################################# + + def share_memory_(self) -> 'EdgeIndex': + """""" # noqa: D419 + self._data.share_memory_() + if self._indptr is not None: + self._indptr.share_memory_() + if self._T_perm is not None: + self._T_perm.share_memory_() + if self._T_index[0] is not None: + self._T_index[0].share_memory_() + if self._T_index[1] is not None: + self._T_index[1].share_memory_() + if self._T_indptr is not None: + self._T_indptr.share_memory_() + if self._value is not None: + self._value.share_memory_() + return self + + def is_shared(self) -> bool: + """""" # noqa: D419 + return self._data.is_shared() + + def as_tensor(self) -> Tensor: + r"""Zero-copies the :class:`EdgeIndex` representation back to a + :class:`torch.Tensor` representation. + """ + return self._data + + def sort_by( + self, + sort_order: Union[str, SortOrder], + stable: bool = False, + ) -> 'SortReturnType': + r"""Sorts the elements by row or column indices. + + Args: + sort_order (str): The sort order, either :obj:`"row"` or + :obj:`"col"`. + stable (bool, optional): Makes the sorting routine stable, which + guarantees that the order of equivalent elements is preserved. + (default: :obj:`False`) + """ + from paddle_geometric.utils import index_sort + + sort_order = SortOrder(sort_order) + + if self._sort_order == sort_order: # Nothing to do. + return SortReturnType(self, None) + + if self.is_sorted: + (row, col), perm = self._sort_by_transpose() + edge_index = paddle.concat([row.unsqueeze(0), col.unsqueeze(0)], axis=0) + + # Otherwise, perform sorting: + elif sort_order == SortOrder.ROW: + perm = paddle.argsort(self._data[0], descending=False) # Ascending order + row = self._data[0] + edge_index = paddle.concat([row[perm].unsqueeze(0), self._data[1][perm].unsqueeze(0)], axis=0) + + else: + perm = paddle.argsort(self._data[1], descending=False) # Ascending order + col = self._data[1] + edge_index = paddle.concat([self._data[0][perm].unsqueeze(0), col.unsqueeze(0)], axis=0) + + out = self.__class__(edge_index) + + # We can inherit metadata and (mostly) cache: + out._sparse_size = self.sparse_size() + out._sort_order = sort_order + out._is_undirected = self.is_undirected + + out._indptr = self._indptr + out._T_indptr = self._T_indptr + + # NOTE We cannot copy CSR<>CSC permutations since we don't require that + # local neighborhoods are sorted, and thus they may run out of sync. + + out._value = self._value + + return SortReturnType(out, perm) + + def to_dense( # type: ignore + self, + value: Optional[Tensor] = None, + fill_value: float = 0.0, + dtype: Optional[paddle.dtype] = None, + ) -> Tensor: + r"""Converts :class:`EdgeIndex` into a dense :class:`torch.Tensor`. + + .. warning:: + + In case of duplicated edges, the behavior is non-deterministic (one + of the values from :obj:`value` will be picked arbitrarily). For + deterministic behavior, consider calling + :meth:`~paddle_geometric.utils.coalesce` beforehand. + + Args: + value (torch.Tensor, optional): The values for non-zero elements. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + fill_value (float, optional): The fill value for remaining elements + in the dense matrix. (default: :obj:`0.0`) + dtype (torch.dtype, optional): The data type of the returned + tensor. (default: :obj:`None`) + """ + dtype = value.dtype if value is not None else dtype + + size = self.get_sparse_size() + if value is not None and value.dim() > 1: + size = size + value.size()[1:] # type: ignore + + out = paddle.full(size, fill_value, dtype=dtype, place=self.device) + out[self._data[0], self._data[1]] = value if value is not None else 1 + + return out + + def to_sparse_coo(self, value: Optional[Tensor] = None) -> Tensor: + r"""Converts :class:`EdgeIndex` into a :pytorch:`null` + :class:`torch.sparse_coo_tensor`. + + Args: + value (torch.Tensor, optional): The values for non-zero elements. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + """ + value = self._get_value() if value is None else value + + if not paddle_geometric.typing.WITH_PT21: + out = paddle.sparse.sparse_coo_tensor( + indices=self._data, + values=value, + shape=self.get_sparse_size(), + place=self.device, + dtype=value.dtype, + stop_gradient=value.stop_gradient, + ) + if self.is_sorted_by_row: + out = out.coalesce() # In Paddle, coalescing is done through `.coalesce()` + return out + + return paddle.sparse.sparse_coo_tensor( + indices=self._data, + values=value, + shape=self.get_sparse_size(), + place=self.device, + dtype=value.dtype, + stop_gradient=value.stop_gradient, + ) + + def to_sparse_csr( # type: ignore + self, + value: Optional[Tensor] = None, + ) -> Tensor: + r"""Converts :class:`EdgeIndex` into a :pytorch:`null` + :class:`torch.sparse_csr_tensor`. + + Args: + value (torch.Tensor, optional): The values for non-zero elements. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + """ + (rowptr, col), perm = self.get_csr() + if value is not None and perm is not None: + value = value[perm] + elif value is None: + value = self._get_value() + + return paddle.sparse.sparse_csr_tensor( + rowptr=rowptr, + col=col, + value=value, + shape=self.get_sparse_size(), + place=self.device, + dtype=value.dtype, + stop_gradient=value.stop_gradient, + ) + + def to_sparse_csc( # type: ignore + self, + value: Optional[Tensor] = None, + ) -> Tensor: + r"""Converts :class:`EdgeIndex` into a :pytorch:`null` + :class:`torch.sparse_csc_tensor`. + + Args: + value (torch.Tensor, optional): The values for non-zero elements. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + """ + if not paddle_geometric.typing.WITH_PT112: + raise NotImplementedError( + "'to_sparse_csc' not supported for PyTorch < 1.12") + + (colptr, row), perm = self.get_csc() + if value is not None and perm is not None: + value = value[perm] + elif value is None: + value = self._get_value() + + return paddle.sparse.sparse_csr_tensor( + ccol_indices=colptr, + row_indices=row, + values=value, + size=self.get_sparse_size(), + device=self.device, + requires_grad=value.requires_grad, + ) + + def to_sparse( + self, + value: Optional[paddle.Tensor] = None, + ) -> paddle.Tensor: + r"""Converts :class:`EdgeIndex` into a + :paddle:`null` :class:`paddle.sparse` tensor. + + Args: + value (paddle.Tensor, optional): The values for non-zero elements. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + """ + if value is None: + value = paddle.ones(self._data.shape[1], dtype=self._data.dtype, device=self.device) + + # Create sparse COO tensor + return self.to_sparse_coo(value) # You can keep other formats like CSR, CSC if necessary + + def to_sparse_tensor( + self, + value: Optional[Tensor] = None, + ) -> SparseTensor: + r"""Converts :class:`EdgeIndex` into a + :class:`torch_sparse.SparseTensor`. + Requires that :obj:`torch-sparse` is installed. + + Args: + value (torch.Tensor, optional): The values for non-zero elements. + (default: :obj:`None`) + """ + return SparseTensor( + row=self._data[0], + col=self._data[1], + rowptr=self._indptr if self.is_sorted_by_row else None, + value=value, + sparse_sizes=self.get_sparse_size(), + is_sorted=self.is_sorted_by_row, + trust_data=True, + ) + + # TODO Investigate how to avoid overlapping return types here. + @overload + def matmul( # type: ignore + self, + other: 'EdgeIndex', + input_value: Optional[Tensor] = None, + other_value: Optional[Tensor] = None, + reduce: ReduceType = 'sum', + transpose: bool = False, + ) -> Tuple['EdgeIndex', Tensor]: + pass + + @overload + def matmul( + self, + other: Tensor, + input_value: Optional[Tensor] = None, + other_value: None = None, + reduce: ReduceType = 'sum', + transpose: bool = False, + ) -> Tensor: + pass + + def matmul( + self, + other: Union[Tensor, 'EdgeIndex'], + input_value: Optional[Tensor] = None, + other_value: Optional[Tensor] = None, + reduce: ReduceType = 'sum', + transpose: bool = False, + ) -> Union[Tensor, Tuple['EdgeIndex', Tensor]]: + r"""Performs a matrix multiplication of the matrices :obj:`input` and + :obj:`other`. + If :obj:`input` is a :math:`(n \times m)` matrix and :obj:`other` is a + :math:`(m \times p)` tensor, then the output will be a + :math:`(n \times p)` tensor. + See :meth:`torch.matmul` for more information. + + :obj:`input` is a sparse matrix as denoted by the indices in + :class:`EdgeIndex`, and :obj:`input_value` corresponds to the values + of non-zero elements in :obj:`input`. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. + + :obj:`other` can either be a dense :class:`torch.Tensor` or a sparse + :class:`EdgeIndex`. + if :obj:`other` is a sparse :class:`EdgeIndex`, then :obj:`other_value` + corresponds to the values of its non-zero elements. + + This function additionally accepts an optional :obj:`reduce` argument + that allows specification of an optional reduction operation. + See :meth:`torch.sparse.mm` for more information. + + Lastly, the :obj:`transpose` option allows to perform matrix + multiplication where :obj:`input` will be first transposed, *i.e.*: + + .. math:: + + \textrm{input}^{\top} \cdot \textrm{other} + + Args: + other (torch.Tensor or EdgeIndex): The second matrix to be + multiplied, which can be sparse or dense. + input_value (torch.Tensor, optional): The values for non-zero + elements of :obj:`input`. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + other_value (torch.Tensor, optional): The values for non-zero + elements of :obj:`other` in case it is sparse. + If not specified, non-zero elements will be assigned a value of + :obj:`1.0`. (default: :obj:`None`) + reduce (str, optional): The reduce operation, one of + :obj:`"sum"`/:obj:`"add"`, :obj:`"mean"`, + :obj:`"min"`/:obj:`amin` or :obj:`"max"`/:obj:`amax`. + (default: :obj:`"sum"`) + transpose (bool, optional): If set to :obj:`True`, will perform + matrix multiplication based on the transposed :obj:`input`. + (default: :obj:`False`) + """ + return matmul(self, other, input_value, other_value, reduce, transpose) + + def sparse_narrow( + self, + dim: int, + start: Union[int, Tensor], + length: int, + ) -> 'EdgeIndex': + r"""Returns a new :class:`EdgeIndex` that is a narrowed version of + itself. Narrowing is performed by interpreting :class:`EdgeIndex` as a + sparse matrix of shape :obj:`(num_rows, num_cols)`. + + In contrast to :meth:`torch.narrow`, the returned tensor does not share + the same underlying storage anymore. + + Args: + dim (int): The dimension along which to narrow. + start (int or torch.Tensor): Index of the element to start the + narrowed dimension from. + length (int): Length of the narrowed dimension. + """ + dim = dim + 2 if dim < 0 else dim + if dim != 0 and dim != 1: + raise ValueError(f"Expected dimension to be 0 or 1 (got {dim})") + + if start < 0: + raise ValueError(f"Expected 'start' value to be positive " + f"(got {start})") + + if dim == 0: + if self.is_sorted_by_row: + (rowptr, col), _ = self.get_csr() + rowptr = rowptr.narrow(0, start, length + 1) + + if rowptr.numel() < 2: + row, col = self._data[0, :0], self._data[1, :0] + rowptr = None + num_rows = 0 + else: + col = col[rowptr[0]:rowptr[-1]] + rowptr = rowptr - rowptr[0] + num_rows = rowptr.numel() - 1 + + row = paddle.arange( + num_rows, + dtype=col.dtype, + device=col.device, + ).repeat_interleave( + paddle.diff(rowptr), + output_size=col.numel(), + ) + + edge_index = EdgeIndex( + paddle.stack([row, col], axis=0), + sparse_size=(num_rows, self.sparse_size(1)), + sort_order='row', + ) + edge_index._indptr = rowptr + return edge_index + + else: + mask = self._data[0] >= start + mask &= self._data[0] < (start + length) + offset = paddle.to_tensor([[start], [0]], device=self.device) + edge_index = self[:, mask].sub_(offset) # type: ignore + edge_index._sparse_size = (length, edge_index._sparse_size[1]) + return edge_index + + + else: + assert dim == 1 + + if self.is_sorted_by_col: + (colptr, row), _ = self.get_csc() + colptr = colptr.narrow(0, start, length + 1) + + if colptr.numel() < 2: + row, col = self._data[0, :0], self._data[1, :0] + colptr = None + num_cols = 0 + else: + row = row[colptr[0]:colptr[-1]] + colptr = colptr - colptr[0] + num_cols = colptr.numel() - 1 + + col = paddle.arange( + num_cols, + dtype=row.dtype, + device=row.device, + ).repeat_interleave( + colptr.diff(), + output_size=row.numel(), + ) + + edge_index = EdgeIndex( + paddle.stack([row, col], axis=0), + sparse_size=(self.sparse_size(0), num_cols), + sort_order='col', + ) + edge_index._indptr = colptr + return edge_index + + else: + mask = self._data[1] >= start + mask &= self._data[1] < (start + length) + offset = paddle.to_tensor([[0], [start]], place=self.device) + edge_index = self[:, mask].sub_(offset) # type: ignore + edge_index._sparse_size = (edge_index._sparse_size[0], length) + return edge_index + + def to_vector(self) -> Tensor: + r"""Converts :class:`EdgeIndex` into a one-dimensional index + vector representation. + """ + num_rows, num_cols = self.get_sparse_size() + + if num_rows * num_cols > paddle_geometric.typing.MAX_INT64: + raise ValueError("'to_vector()' will result in an overflow") + + return self._data[0] * num_rows + self._data[1] + + # PyTorch/Python builtins ################################################# + + def __tensor_flatten__(self) -> Tuple[List[str], Tuple[Any, ...]]: + attrs = ['_data'] + if self._indptr is not None: + attrs.append('_indptr') + if self._T_perm is not None: + attrs.append('_T_perm') + # TODO We cannot save `_T_index` for now since it is stored as tuple. + if self._T_indptr is not None: + attrs.append('_T_indptr') + + ctx = ( + self._sparse_size, + self._sort_order, + self._is_undirected, + self._cat_metadata, + ) + + return attrs, ctx + + @staticmethod + def __tensor_unflatten__( + inner_tensors: Dict[str, Any], + ctx: Tuple[Any, ...], + outer_size: Tuple[int, ...], + outer_stride: Tuple[int, ...], + ) -> 'EdgeIndex': + edge_index = EdgeIndex( + inner_tensors['_data'], + sparse_size=ctx[0], + sort_order=ctx[1], + is_undirected=ctx[2], + ) + + edge_index._indptr = inner_tensors.get('_indptr', None) + edge_index._T_perm = inner_tensors.get('_T_perm', None) + edge_index._T_indptr = inner_tensors.get('_T_indptr', None) + edge_index._cat_metadata = ctx[3] + + return edge_index + + + @classmethod + def __torch_dispatch__( + cls: Type, + func: Callable[..., Any], + types: Iterable[Type[Any]], + args: Iterable[Tuple[Any, ...]] = (), + kwargs: Optional[Dict[Any, Any]] = None, + ) -> Any: + # `EdgeIndex` should be treated as a regular PyTorch tensor for all + # standard PyTorch functionalities. However, + # * some of its metadata can be transferred to new functions, e.g., + # `torch.cat(dim=1)` can inherit the sparse matrix size, or + # `torch.narrow(dim=1)` can inherit cached pointers. + # * not all operations lead to valid `EdgeIndex` tensors again, e.g., + # `torch.sum()` does not yield a `EdgeIndex` as its output, or + # `torch.cat(dim=0) violates the [2, *] shape assumption. + + # To account for this, we hold a number of `HANDLED_FUNCTIONS` that + # implement specific functions for valid `EdgeIndex` routines. + if func in HANDLED_FUNCTIONS: + return HANDLED_FUNCTIONS[func](*args, **(kwargs or {})) + + # For all other PyTorch functions, we treat them as vanilla tensors. + args = pytree.tree_map_only(EdgeIndex, lambda x: x._data, args) + if kwargs is not None: + kwargs = pytree.tree_map_only(EdgeIndex, lambda x: x._data, kwargs) + return func(*args, **(kwargs or {})) + + def __repr__(self) -> str: + prefix = f'{self.__class__.__name__}(' + indent = len(prefix) + tensor_str = str(self._data) # 转换为Paddle的字符串表示方式 + + suffixes = [] + num_rows, num_cols = self.sparse_size() + if num_rows is not None or num_cols is not None: + size_repr = f"({num_rows or '?'}, {num_cols or '?'})" + suffixes.append(f'sparse_size={size_repr}') + suffixes.append(f'nnz={self._data.shape[1]}') # 使用Paddle的shape属性 + if self.device != paddle.get_device(): + suffixes.append(f"device='{self.device}'") + if self.dtype != paddle.int64: + suffixes.append(f'dtype={self.dtype}') + if self.is_sorted: + suffixes.append(f'sort_order={self.sort_order}') + if self.is_undirected: + suffixes.append('is_undirected=True') + + return f"{prefix}{tensor_str} {' '.join(suffixes)})" + + + # Helpers ################################################################# + + def _shallow_copy(self) -> 'EdgeIndex': + out = EdgeIndex(self._data) + out._sparse_size = self._sparse_size + out._sort_order = self._sort_order + out._is_undirected = self._is_undirected + out._indptr = self._indptr + out._T_perm = self._T_perm + out._T_index = self._T_index + out._T_indptr = self._T_indptr + out._value = self._value + out._cat_metadata = self._cat_metadata + return out + + def _clear_metadata(self) -> 'EdgeIndex': + self._sparse_size = (None, None) + self._sort_order = None + self._is_undirected = False + self._indptr = None + self._T_perm = None + self._T_index = (None, None) + self._T_indptr = None + self._value = None + self._cat_metadata = None + return self + + +class SortReturnType(NamedTuple): + values: EdgeIndex + indices: Optional[Tensor] + + +def apply_( + tensor: EdgeIndex, + fn: Callable, + *args: Any, + **kwargs: Any, +) -> Union[EdgeIndex, Tensor]: + + data = fn(tensor._data, *args, **kwargs) + + if data.dtype not in INDEX_DTYPES: + return data + + if tensor._data.data_ptr() != data.data_ptr(): + out = EdgeIndex(data) + else: # In-place: + tensor._data = data + out = tensor + + # Copy metadata: + out._sparse_size = tensor._sparse_size + out._sort_order = tensor._sort_order + out._is_undirected = tensor._is_undirected + out._cat_metadata = tensor._cat_metadata + + # Convert cache (but do not consider `_value`): + if tensor._indptr is not None: + out._indptr = fn(tensor._indptr, *args, **kwargs) + + if tensor._T_perm is not None: + out._T_perm = fn(tensor._T_perm, *args, **kwargs) + + _T_row, _T_col = tensor._T_index + if _T_row is not None: + _T_row = fn(_T_row, *args, **kwargs) + if _T_col is not None: + _T_col = fn(_T_col, *args, **kwargs) + out._T_index = (_T_row, _T_col) + + if tensor._T_indptr is not None: + out._T_indptr = fn(tensor._T_indptr, *args, **kwargs) + + return out + + +def _clone( + tensor: EdgeIndex, + *, + memory_format: Optional[str] = None, # Paddle does not use memory_format, so it is not needed +) -> EdgeIndex: + # Use Paddle's built-in clone method to create a copy of the tensor. + # The clone method creates a new tensor with the same content as the original tensor + out = tensor.clone() + + # Ensure that the output tensor is of the EdgeIndex type + assert isinstance(out, EdgeIndex) + + return out + +# Implements the to_copy function (deep copy) +def _to_copy( + tensor: EdgeIndex, + *, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, # device is a string, not a paddle.device object + pin_memory: bool = False, + non_blocking: bool = False, +) -> Union[EdgeIndex, paddle.Tensor]: + # Use Paddle's clone method for tensor deep copy + return tensor.clone().to(dtype=dtype, device=device) + +# Implements the alias function (shallow copy) +def _alias(tensor: EdgeIndex) -> EdgeIndex: + return tensor._shallow_copy() + +# Implements the pin_memory function (if necessary) +def _pin_memory(tensor: EdgeIndex) -> EdgeIndex: + return tensor.clone().pin_memory() + +# Implements the cat function (concatenation) +def _cat( + tensors: List[Union[EdgeIndex, Tensor]], + dim: int = 0, +) -> Union[EdgeIndex, Tensor]: + # Concatenate tensors, assuming tensors are already in the right format + data_list = [tensor._data for tensor in tensors if isinstance(tensor, EdgeIndex)] + data = paddle.concat(data_list, axis=dim) + + if dim != 1 and dim != -1: # No valid `EdgeIndex` anymore. + return data + + if any([not isinstance(tensor, EdgeIndex) for tensor in tensors]): + return data + + out = EdgeIndex(data) + + # Handle sparse_size and other metadata based on tensors + nnz_list = [t.size(1) for t in tensors] + sparse_size_list = [t.sparse_size() for t in tensors] + sort_order_list = [t._sort_order for t in tensors] + is_undirected_list = [t.is_undirected for t in tensors] + + total_num_rows = max([num_rows for num_rows, _ in sparse_size_list]) + total_num_cols = max([num_cols for _, num_cols in sparse_size_list]) + + out._sparse_size = (total_num_rows, total_num_cols) + out._is_undirected = all(is_undirected_list) + + out._cat_metadata = CatMetadata( + nnz=nnz_list, + sparse_size=sparse_size_list, + sort_order=sort_order_list, + is_undirected=is_undirected_list, + ) + + return out + +# Implements the flip function (reverse the order of elements) +def _flip( + input: EdgeIndex, + dims: Union[List[int], Tuple[int, ...]], +) -> EdgeIndex: + data = paddle.flip(input._data, axis=dims) + out = EdgeIndex(data) + + out._value = input._value + out._is_undirected = input.is_undirected + + if 0 in dims or -2 in dims: + out._sparse_size = input.sparse_size()[::-1] + + if len(dims) == 1 and (dims[0] == 0 or dims[0] == -2): + if input.is_sorted_by_row: + out._sort_order = SortOrder.COL + elif input.is_sorted_by_col: + out._sort_order = SortOrder.ROW + + out._indptr = input._T_indptr + out._T_perm = input._T_perm + out._T_index = input._T_index[::-1] + out._T_indptr = input._indptr + + return out + +# Implements the index_select function (select elements from a tensor) +def _index_select( + input: EdgeIndex, + dim: int, + index: Tensor, +) -> Union[EdgeIndex, Tensor]: + out = paddle.index_select(input._data, dim, index) + + if dim == 1 or dim == -1: + out = EdgeIndex(out) + out._sparse_size = input.sparse_size() + + return out + +# Implements the slice function for EdgeIndex tensors +def _slice( + input: EdgeIndex, + dim: int, + start: Optional[int] = None, + end: Optional[int] = None, + step: int = 1, +) -> Union[EdgeIndex, paddle.Tensor]: + + # No-op if the slice is a no-op (start, end, and step are defaults) + if ((start is None or start <= 0) + and (end is None or end > input.size(dim)) and step == 1): + return input._shallow_copy() + + # Perform the slicing operation using Paddle + out = paddle.slice(input._data, axes=[dim], starts=[start], ends=[end], strides=[step]) + + if dim == 1 or dim == -1: + if step != 1: + out = out.contiguous() + + out = EdgeIndex(out) + out._sparse_size = input.sparse_size() + + if step >= 0: + out._sort_order = input._sort_order + else: + if input._sort_order == SortOrder.ROW: + out._sort_order = SortOrder.COL + elif input._sort_order == SortOrder.COL: + out._sort_order = SortOrder.ROW + + return out + +# Implements the index function for EdgeIndex and Tensor +def _index( + input: Union[EdgeIndex, paddle.Tensor], + indices: List[Optional[Union[paddle.Tensor, EdgeIndex]]], +) -> Union[EdgeIndex, paddle.Tensor]: + + if not isinstance(input, EdgeIndex): + # If input is not an EdgeIndex, apply indexing to its data + indices = pytree.tree_map_only(EdgeIndex, lambda x: x._data, indices) + return paddle.index(input, indices) + + out = paddle.index(input._data, indices) + + if len(indices) != 2 or indices[0] is not None: + return out + + index = indices[1] + assert isinstance(index, paddle.Tensor) + + out = EdgeIndex(out) + + # Handle indexing for boolean or uint8 index tensors + if index.dtype in (paddle.bool, paddle.uint8): + out._sparse_size = input.sparse_size() + out._sort_order = input._sort_order + + else: # Handle case for index tensors with size (2, 1) + out._sparse_size = input.sparse_size() + + return out + +# Implements the select function for selecting specific elements along a dimension +def _select(input: EdgeIndex, dim: int, index: int) -> Union[paddle.Tensor, Index]: + out = paddle.select(input._data, axis=dim, index=index) + + if dim == 0 or dim == -2: + out = Index(out) + + if index == 0 or index == -2: # Row-select + out._dim_size = input.sparse_size(0) + out._is_sorted = input.is_sorted_by_row + if input.is_sorted_by_row: + out._indptr = input._indptr + + else: # Col-select + assert index == 1 or index == -1 + out._dim_size = input.sparse_size(1) + out._is_sorted = input.is_sorted_by_col + if input.is_sorted_by_col: + out._indptr = input._indptr + + return out + +# Implements the unbind function to split a tensor along a specified dimension +def _unbind( + input: EdgeIndex, + dim: int = 0, +) -> Union[List[Index], List[paddle.Tensor]]: + + if dim == 0 or dim == -2: + row = input[0] + assert isinstance(row, Index) + col = input[1] + assert isinstance(col, Index) + return [row, col] + + return paddle.unbind(input._data, axis=dim) +# Implements the add function for EdgeIndex tensors +def _add( + input: EdgeIndex, + other: Union[int, paddle.Tensor, EdgeIndex], + *, + alpha: int = 1, +) -> Union[EdgeIndex, paddle.Tensor]: + + # Perform the addition operation using Paddle + out = paddle.add(input._data, other._data if isinstance(other, EdgeIndex) else other, alpha=alpha) + + if out.dtype not in INDEX_DTYPES: + return out + if out.dim() != 2 or out.shape[0] != 2: + return out + + out = EdgeIndex(out) + + # Handle cases for different types of 'other' + if isinstance(other, paddle.Tensor) and other.numel() <= 1: + other = int(other) + + if isinstance(other, int): + size = maybe_add(input._sparse_size, other, alpha) + assert len(size) == 2 + out._sparse_size = size + out._sort_order = input._sort_order + out._is_undirected = input.is_undirected + out._T_perm = input._T_perm + + elif isinstance(other, paddle.Tensor) and other.shape == (2, 1): + size = maybe_add(input._sparse_size, other.reshape([-1]).tolist(), alpha) + assert len(size) == 2 + out._sparse_size = size + out._sort_order = input._sort_order + if paddle.equal(other[0], other[1]): + out._is_undirected = input.is_undirected + out._T_perm = input._T_perm + + elif isinstance(other, EdgeIndex): + size = maybe_add(input._sparse_size, other._sparse_size, alpha) + assert len(size) == 2 + out._sparse_size = size + + return out + + +# Implements the in-place add function for EdgeIndex tensors +def add_( + input: EdgeIndex, + other: Union[int, paddle.Tensor, EdgeIndex], + *, + alpha: int = 1, +) -> EdgeIndex: + + sparse_size = input._sparse_size + sort_order = input._sort_order + is_undirected = input._is_undirected + T_perm = input._T_perm + input._clear_metadata() + + paddle.add_(input._data, other._data if isinstance(other, EdgeIndex) else other, alpha=alpha) + + if isinstance(other, paddle.Tensor) and other.numel() <= 1: + other = int(other) + + if isinstance(other, int): + size = maybe_add(sparse_size, other, alpha) + assert len(size) == 2 + input._sparse_size = size + input._sort_order = sort_order + input._is_undirected = is_undirected + input._T_perm = T_perm + + elif isinstance(other, paddle.Tensor) and other.shape == (2, 1): + size = maybe_add(sparse_size, other.reshape([-1]).tolist(), alpha) + assert len(size) == 2 + input._sparse_size = size + input._sort_order = sort_order + if paddle.equal(other[0], other[1]): + input._is_undirected = is_undirected + input._T_perm = T_perm + + elif isinstance(other, EdgeIndex): + size = maybe_add(sparse_size, other._sparse_size, alpha) + assert len(size) == 2 + input._sparse_size = size + + return input + + +# Implements the sub function for EdgeIndex tensors +def _sub( + input: EdgeIndex, + other: Union[int, paddle.Tensor, EdgeIndex], + *, + alpha: int = 1, +) -> Union[EdgeIndex, paddle.Tensor]: + + out = paddle.subtract(input._data, other._data if isinstance(other, EdgeIndex) else other, alpha=alpha) + + if out.dtype not in INDEX_DTYPES: + return out + if out.dim() != 2 or out.size(0) != 2: + return out + + out = EdgeIndex(out) + + if isinstance(other, paddle.Tensor) and other.numel() <= 1: + other = int(other) + + if isinstance(other, int): + size = maybe_sub(input._sparse_size, other, alpha) + assert len(size) == 2 + out._sparse_size = size + out._sort_order = input._sort_order + out._is_undirected = input.is_undirected + out._T_perm = input._T_perm + + elif isinstance(other, paddle.Tensor) and other.shape == (2, 1): + size = maybe_sub(input._sparse_size, other.reshape([-1]).tolist(), alpha) + assert len(size) == 2 + out._sparse_size = size + out._sort_order = input._sort_order + if paddle.equal(other[0], other[1]): + out._is_undirected = input.is_undirected + out._T_perm = input._T_perm + + return out + + +# Implements the in-place sub function for EdgeIndex tensors +def sub_( + input: EdgeIndex, + other: Union[int, paddle.Tensor, EdgeIndex], + *, + alpha: int = 1, +) -> EdgeIndex: + + sparse_size = input._sparse_size + sort_order = input._sort_order + is_undirected = input._is_undirected + T_perm = input._T_perm + input._clear_metadata() + + paddle.subtract_(input._data, other._data if isinstance(other, EdgeIndex) else other, alpha=alpha) + + if isinstance(other, paddle.Tensor) and other.numel() <= 1: + other = int(other) + + if isinstance(other, int): + size = maybe_sub(sparse_size, other, alpha) + assert len(size) == 2 + input._sparse_size = size + input._sort_order = sort_order + input._is_undirected = is_undirected + input._T_perm = T_perm + + elif isinstance(other, paddle.Tensor) and other.shape == (2, 1): + size = maybe_sub(sparse_size, other.reshape([-1]).tolist(), alpha) + assert len(size) == 2 + input._sparse_size = size + input._sort_order = sort_order + if paddle.equal(other[0], other[1]): + input._is_undirected = is_undirected + input._T_perm = T_perm + + return input + +# Sparse-Dense Matrix Multiplication ########################################## + +def _paddle_sparse_spmm( + input: EdgeIndex, + other: paddle.Tensor, + value: Optional[paddle.Tensor] = None, + reduce: ReduceType = 'sum', + transpose: bool = False, +) -> paddle.Tensor: + # Paddle does not have a direct equivalent to `torch-sparse`, so we assume + # custom implementation for sparse matrix multiplication. + assert paddle_geometric.typing.WITH_PADDLE_SPARSE + reduce = PYG_REDUCE[reduce] if reduce in PYG_REDUCE else reduce + + # Optional arguments for backpropagation: + colptr: Optional[paddle.Tensor] = None + perm: Optional[paddle.Tensor] = None + + if not transpose: + assert input.is_sorted_by_row + (rowptr, col), _ = input.get_csr() + row = input._data[0] + if other.requires_grad and reduce in ['sum', 'mean']: + (colptr, _), perm = input.get_csc() + else: + assert input.is_sorted_by_col + (rowptr, col), _ = input.get_csc() + row = input._data[1] + if other.requires_grad and reduce in ['sum', 'mean']: + (colptr, _), perm = input.get_csr() + + if reduce == 'sum': + return paddle.sparse.spmv( # Sparse matrix-vector multiplication + row, rowptr, col, value, colptr, perm, other + ) + + if reduce == 'mean': + rowcount = paddle.diff(rowptr) if other.requires_grad else None + return paddle.sparse.spmv( # Sparse matrix-vector multiplication with mean + row, rowptr, col, value, rowcount, colptr, perm, other + ) + + if reduce == 'min': + return paddle.sparse.spmv_min(rowptr, col, value, other)[0] + + if reduce == 'max': + return paddle.sparse.spmv_max(rowptr, col, value, other)[0] + + raise NotImplementedError + + +class _PaddleSPMM(PyLayer): + @staticmethod + def forward(ctx: Any, input: EdgeIndex, other: Tensor, value: Optional[Tensor] = None, reduce: ReduceType = 'sum', transpose: bool = False) -> Tensor: + reduce = PYG_REDUCE[reduce] if reduce in PYG_REDUCE else reduce + + value = value.detach() if value is not None else value + if other.requires_grad: + other = other.detach() + ctx.save_for_backward(input, value) + ctx.reduce = reduce + ctx.transpose = transpose + + if not transpose: + assert input.is_sorted_by_row + adj = input.to_sparse_csr(value) + else: + assert input.is_sorted_by_col + adj = input.to_sparse_csc(value).t() + + if paddle_geometric.typing.WITH_PT20 and not other.is_gpu(): + return paddle.sparse.mm(adj, other, reduce) + else: # pragma: no cover + assert reduce == 'sum' + return adj @ other + + @staticmethod + def backward(ctx: Any, *grad_outputs: Any) -> Tuple[None, Optional[Tensor], None, None, None]: + grad_out, = grad_outputs + + other_grad: Optional[Tensor] = None + if ctx.needs_input_grad[1]: + input, value = ctx.saved_tensors + assert ctx.reduce == 'sum' + + if not ctx.transpose: + if value is None and input.is_undirected: + adj = input.to_sparse_csr(value) + else: + (colptr, row), perm = input.get_csc() + if value is not None and perm is not None: + value = value[perm] + else: + value = input._get_value() + adj = paddle.sparse_csr_tensor( + crow_indices=colptr, + col_indices=row, + values=value, + shape=input.get_sparse_size()[::-1], + device=input.device, + ) + else: + if value is None and input.is_undirected: + adj = input.to_sparse_csc(value).t() + else: + (rowptr, col), perm = input.get_csr() + if value is not None and perm is not None: + value = value[perm] + else: + value = input._get_value() + adj = paddle.sparse_csr_tensor( + crow_indices=rowptr, + col_indices=col, + values=value, + shape=input.get_sparse_size()[::-1], + device=input.device, + ) + + other_grad = adj @ grad_out + + if ctx.needs_input_grad[2]: + raise NotImplementedError("Gradient computation for 'value' not yet supported") + + return None, other_grad, None, None, None + + +def _scatter_spmm( + input: EdgeIndex, + other: Tensor, + value: Optional[Tensor] = None, + reduce: ReduceType = 'sum', + transpose: bool = False, +) -> Tensor: + from paddle_geometric.utils import scatter + + if not transpose: + other_j = other[input._data[1]] + index = input._data[0] + dim_size = input.get_sparse_size(0) + else: + other_j = other[input._data[0]] + index = input._data[1] + dim_size = input.get_sparse_size(1) + + other_j = other_j * value.view(-1, 1) if value is not None else other_j + return scatter(other_j, index, 0, dim_size=dim_size, reduce=reduce) + +def _spmm( + input: EdgeIndex, + other: Tensor, + value: Optional[Tensor] = None, + reduce: ReduceType = 'sum', + transpose: bool = False, +) -> Tensor: + + if reduce not in ['sum', 'mean', 'amin', 'amax', 'add', 'min', 'max']: + raise ValueError(f"`reduce='{reduce}'` is not a valid reduction") + + if not transpose and not input.is_sorted_by_row: + cls_name = input.__class__.__name__ + raise ValueError(f"'matmul(..., transpose=False)' requires " + f"'{cls_name}' to be sorted by rows") + + if transpose and not input.is_sorted_by_col: + cls_name = input.__class__.__name__ + raise ValueError(f"'matmul(..., transpose=True)' requires " + f"'{cls_name}' to be sorted by columns") + + if paddle_geometric.typing.WITH_TORCH_SPARSE: + return _paddle_sparse_spmm(input, other, value, reduce, transpose) + + if value is not None and value.requires_grad: + return _scatter_spmm(input, other, value, reduce, transpose) + + # If no gradient, perform regular matrix multiplication + if reduce == 'sum': + return paddle.sparse.matmul(input, other) + + if reduce == 'mean': + out = paddle.sparse.matmul(input, other) + count = input.get_indptr().diff() + return out / count.clamp_(min=1).to(out.dtype).reshape([-1, 1]) + + if reduce == 'max': + return paddle.sparse.spmm_max(input, other) + + raise NotImplementedError + + +def matmul( + input: EdgeIndex, + other: Union[Tensor, EdgeIndex], + input_value: Optional[Tensor] = None, + other_value: Optional[Tensor] = None, + reduce: ReduceType = 'sum', + transpose: bool = False, +) -> Union[Tensor, Tuple[EdgeIndex, Tensor]]: + + if not isinstance(other, EdgeIndex): + if other_value is not None: + raise ValueError("'other_value' not supported for sparse-dense " + "matrix multiplication") + return _spmm(input, other, input_value, reduce, transpose) + + if reduce not in ['sum', 'add']: + raise NotImplementedError(f"`reduce='{reduce}'` not yet supported for " + f"sparse-sparse matrix multiplication") + + transpose &= not input.is_undirected or input_value is not None + + if input.is_sorted_by_col: + sparse_input = input.to_sparse_csc(input_value) + else: + sparse_input = input.to_sparse_csr(input_value) + + if transpose: + sparse_input = sparse_input.t() + + if other.is_sorted_by_col: + other = other.to_sparse_csc(other_value) + else: + other = other.to_sparse_csr(other_value) + + out = paddle.sparse.matmul(sparse_input, other) + + rowptr: Optional[Tensor] = None + if out.layout == paddle.sparse_csr: + rowptr = out.crow_indices().to(input.dtype) + col = out.col_indices().to(input.dtype) + edge_index = paddle.convert_indices_from_csr_to_coo( + rowptr, col, out_int32=rowptr.dtype != paddle.int64) + + elif out.layout == paddle.sparse.coo: + edge_index = out.indices() + + edge_index = EdgeIndex(edge_index) + edge_index._sort_order = SortOrder.ROW + edge_index._sparse_size = (out.shape[0], out.shape[1]) + edge_index._indptr = rowptr + + return edge_index, out.values() + +# Implements the matrix multiplication (mm) for EdgeIndex tensors +def _mm( + input: EdgeIndex, + other: Union[paddle.Tensor, EdgeIndex], +) -> Union[paddle.Tensor, Tuple[EdgeIndex, paddle.Tensor]]: + return matmul(input, other) + + +# Implements the sparse matrix multiplication with addition (addmm) for EdgeIndex tensors +def _addmm( + input: paddle.Tensor, + mat1: EdgeIndex, + mat2: paddle.Tensor, + beta: float = 1.0, + alpha: float = 1.0, +) -> paddle.Tensor: + assert paddle.abs(input).sum() == 0.0 # Ensure the input tensor is zero + out = matmul(mat1, mat2) + assert isinstance(out, paddle.Tensor) + return alpha * out if alpha != 1.0 else out + + +# Implements the sparse matrix multiplication with reduction (mm_reduce) for EdgeIndex tensors +def _mm_reduce( + mat1: EdgeIndex, + mat2: paddle.Tensor, + reduce: ReduceType = 'sum', +) -> Tuple[paddle.Tensor, paddle.Tensor]: + out = matmul(mat1, mat2, reduce=reduce) + assert isinstance(out, paddle.Tensor) + return out, out # We return a dummy tensor for `argout` for now. + diff --git a/jointContribution/mattergen/paddle_geometric/experimental.py b/jointContribution/mattergen/paddle_geometric/experimental.py new file mode 100644 index 00000000..6e4ec15b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/experimental.py @@ -0,0 +1,165 @@ +import functools +import inspect +from typing import Any, Callable, Dict, List, Optional, Union + +import paddle + +# TODO: Manually replace PaddlePaddle utility functions as required +from paddle_geometric.utils import * # noqa + +# Experimental feature flags +__experimental_flag__: Dict[str, bool] = { + 'disable_dynamic_shapes': False, +} + +Options = Optional[Union[str, List[str]]] + + +def get_options(options: Options) -> List[str]: + """ + Converts the provided options to a list of strings. + + Args: + options (str, list, or None): The experimental options. + + Returns: + List[str]: A list of experimental feature flags. + """ + if options is None: + options = list(__experimental_flag__.keys()) + if isinstance(options, str): + options = [options] + return options + + +def is_experimental_mode_enabled(options: Options = None) -> bool: + """ + Checks if experimental mode is enabled. + + Args: + options (str, list, or None): Optional experimental feature flags. + + Returns: + bool: True if experimental mode is enabled, False otherwise. + """ + options = get_options(options) + return all([__experimental_flag__[option] for option in options]) + + +def set_experimental_mode_enabled(mode: bool, options: Options = None) -> None: + """ + Enables or disables experimental mode for specific options. + + Args: + mode (bool): True to enable, False to disable. + options (str, list, or None): Experimental feature flags to set. + """ + for option in get_options(options): + __experimental_flag__[option] = mode + + +class experimental_mode: + """ + Context manager to enable experimental mode for testing unstable features. + + Example: + with paddle_geometric.experimental_mode(): + out = model(data.x, data.edge_index) + + Args: + options (str or list, optional): List of experimental features to enable. + """ + def __init__(self, options: Options = None) -> None: + self.options = get_options(options) + self.previous_state = { + option: __experimental_flag__[option] + for option in self.options + } + + def __enter__(self) -> None: + set_experimental_mode_enabled(True, self.options) + + def __exit__(self, *args: Any) -> None: + for option, value in self.previous_state.items(): + __experimental_flag__[option] = value + + +class set_experimental_mode: + """ + Context manager to explicitly set experimental mode on or off. + + This can be used both as a function or as a context manager. + + Example: + with set_experimental_mode(True): + # Enable experimental mode here + """ + def __init__(self, mode: bool, options: Options = None) -> None: + self.options = get_options(options) + self.previous_state = { + option: __experimental_flag__[option] + for option in self.options + } + set_experimental_mode_enabled(mode, self.options) + + def __enter__(self) -> None: + pass + + def __exit__(self, *args: Any) -> None: + for option, value in self.previous_state.items(): + __experimental_flag__[option] = value + + +def disable_dynamic_shapes(required_args: List[str]) -> Callable: + """ + A decorator to disable dynamic shape inference for the specified arguments. + + If any of the `required_args` is missing, an error will be raised. + + Args: + required_args (List[str]): List of argument names that must be explicitly set. + + Returns: + Callable: Decorated function with dynamic shape validation. + """ + def decorator(func: Callable) -> Callable: + spec = inspect.getfullargspec(func) + + required_args_pos: Dict[str, int] = {} + for arg_name in required_args: + if arg_name not in spec.args: + raise ValueError(f"The function '{func}' does not have a " + f"'{arg_name}' argument") + required_args_pos[arg_name] = spec.args.index(arg_name) + + num_args = len(spec.args) + num_default_args = 0 if spec.defaults is None else len(spec.defaults) + num_positional_args = num_args - num_default_args + + @functools.wraps(func) + def wrapper(*args: Any, **kwargs: Any) -> Any: + # Skip validation if experimental mode is disabled + if not is_experimental_mode_enabled('disable_dynamic_shapes'): + return func(*args, **kwargs) + + for required_arg in required_args: + index = required_args_pos[required_arg] + + value: Optional[Any] = None + if index < len(args): # Check positional arguments + value = args[index] + elif required_arg in kwargs: # Check keyword arguments + value = kwargs[required_arg] + elif num_default_args > 0: # Check defaults + assert spec.defaults is not None + value = spec.defaults[index - num_positional_args] + + if value is None: + raise ValueError(f"Dynamic shapes disabled. Argument " + f"'{required_arg}' needs to be set") + + return func(*args, **kwargs) + + return wrapper + + return decorator diff --git a/jointContribution/mattergen/paddle_geometric/explain/__init__.py b/jointContribution/mattergen/paddle_geometric/explain/__init__.py new file mode 100644 index 00000000..bca9b5d5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/__init__.py @@ -0,0 +1,14 @@ +from .config import ExplainerConfig, ModelConfig, ThresholdConfig +from .explanation import Explanation, HeteroExplanation +from .algorithm import * # noqa +from .explainer import Explainer +from .metric import * # noqa + +__all__ = [ + 'ExplainerConfig', + 'ModelConfig', + 'ThresholdConfig', + 'Explanation', + 'HeteroExplanation', + 'Explainer', +] diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/__init__.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/__init__.py new file mode 100644 index 00000000..a462a577 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/__init__.py @@ -0,0 +1,17 @@ +from .base import ExplainerAlgorithm +from .dummy_explainer import DummyExplainer +from .gnn_explainer import GNNExplainer +from .captum_explainer import CaptumExplainer +from .pg_explainer import PGExplainer +from .attention_explainer import AttentionExplainer +from .graphmask_explainer import GraphMaskExplainer + +__all__ = classes = [ + 'ExplainerAlgorithm', + 'DummyExplainer', + 'GNNExplainer', + 'CaptumExplainer', + 'PGExplainer', + 'AttentionExplainer', + 'GraphMaskExplainer', +] diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/attention_explainer.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/attention_explainer.py new file mode 100644 index 00000000..e469bb71 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/attention_explainer.py @@ -0,0 +1,111 @@ +import logging +from typing import List, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.explain import Explanation +from paddle_geometric.explain.algorithm import ExplainerAlgorithm +from paddle_geometric.explain.config import ExplanationType, ModelTaskLevel +from paddle_geometric.nn.conv.message_passing import MessagePassing + + +class AttentionExplainer(ExplainerAlgorithm): + r"""An explainer that uses the attention coefficients produced by an + attention-based GNN (*e.g.*, + :class:`~paddle_geometric.nn.conv.GATConv`, + :class:`~paddle_geometric.nn.conv.GATv2Conv`, or + :class:`~paddle_geometric.nn.conv.TransformerConv`) as edge explanation. + Attention scores across layers and heads will be aggregated according to + the :obj:`reduce` argument. + + Args: + reduce (str, optional): The method to reduce the attention scores + across layers and heads. (default: :obj:`"max"`) + """ + def __init__(self, reduce: str = 'max'): + super().__init__() + self.reduce = reduce + + def forward( + self, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Explanation: + if isinstance(x, dict) or isinstance(edge_index, dict): + raise ValueError(f"Heterogeneous graphs not yet supported in " + f"'{self.__class__.__name__}'") + + hard_edge_mask = None + if self.model_config.task_level == ModelTaskLevel.node: + _, hard_edge_mask = self._get_hard_masks(model, index, edge_index, + num_nodes=x.shape[0]) + + alphas: List[Tensor] = [] + + def hook(layer, msg_kwargs, out): + if 'alpha' in msg_kwargs[0]: + alphas.append(msg_kwargs[0]['alpha'].detach()) + elif getattr(layer, '_alpha', None) is not None: + alphas.append(layer._alpha.detach()) + + hook_handles = [] + for layer in model.sublayers(): # Register hooks for attention layers + if (isinstance(layer, MessagePassing) and layer.explain is not False): + hook_handles.append(layer.register_message_forward_hook(hook)) + + model(x, edge_index, **kwargs) + + for handle in hook_handles: # Remove hooks + handle.remove() + + if len(alphas) == 0: + raise ValueError("Could not collect any attention coefficients. " + "Please ensure that your model is using " + "attention-based GNN layers.") + + for i, alpha in enumerate(alphas): + alpha = alpha[:edge_index.shape[1]] # Account for potential self-loops. + if alpha.ndim == 2: + alpha = getattr(paddle, self.reduce)(alpha, axis=-1) + if isinstance(alpha, tuple): # Handle `paddle.max` tuple output + alpha = alpha[0] + elif alpha.ndim > 2: + raise ValueError(f"Cannot reduce attention coefficients of " + f"shape {list(alpha.shape)}") + alphas[i] = alpha + + if len(alphas) > 1: + alpha = paddle.stack(alphas, axis=-1) + alpha = getattr(paddle, self.reduce)(alpha, axis=-1) + if isinstance(alpha, tuple): # Handle `paddle.max` tuple output + alpha = alpha[0] + else: + alpha = alphas[0] + + alpha = self._post_process_mask(alpha, hard_edge_mask, + apply_sigmoid=False) + + return Explanation(edge_mask=alpha) + + def supports(self) -> bool: + explanation_type = self.explainer_config.explanation_type + if explanation_type != ExplanationType.model: + logging.error(f"'{self.__class__.__name__}' only supports " + f"model explanations " + f"got (`explanation_type={explanation_type.value}`)") + return False + + node_mask_type = self.explainer_config.node_mask_type + if node_mask_type is not None: + logging.error(f"'{self.__class__.__name__}' does not support " + f"explaining input node features " + f"got (`node_mask_type={node_mask_type.value}`)") + return False + + return True diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/base.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/base.py new file mode 100644 index 00000000..6a7d5f0e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/base.py @@ -0,0 +1,164 @@ +from abc import abstractmethod +from typing import Dict, Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor + +from paddle_geometric.explain import Explanation, HeteroExplanation +from paddle_geometric.explain.config import ( + ExplainerConfig, + ModelConfig, + ModelReturnType, +) +from paddle_geometric.nn import MessagePassing +from paddle_geometric.utils import k_hop_subgraph + + +class ExplainerAlgorithm(paddle.nn.Layer): + r"""An abstract base class for implementing explainer algorithms.""" + @abstractmethod + def forward( + self, + model: paddle.nn.Layer, + x: Union[Tensor, Dict[str, Tensor]], + edge_index: Union[Tensor, Dict[str, Tensor]], + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Union[Explanation, HeteroExplanation]: + r"""Computes the explanation.""" + + @abstractmethod + def supports(self) -> bool: + r"""Checks if the explainer supports the user-defined settings provided + in :obj:`self.explainer_config`, :obj:`self.model_config`. + """ + + ########################################################################### + + @property + def explainer_config(self) -> ExplainerConfig: + if not hasattr(self, '_explainer_config'): + raise ValueError( + f"The explanation algorithm '{self.__class__.__name__}' is " + f"not yet connected to any explainer configuration. Please " + f"call `{self.__class__.__name__}.connect(...)` before " + f"proceeding.") + return self._explainer_config + + @property + def model_config(self) -> ModelConfig: + if not hasattr(self, '_model_config'): + raise ValueError( + f"The explanation algorithm '{self.__class__.__name__}' is " + f"not yet connected to any model configuration. Please call " + f"`{self.__class__.__name__}.connect(...)` before " + f"proceeding.") + return self._model_config + + def connect( + self, + explainer_config: ExplainerConfig, + model_config: ModelConfig, + ): + self._explainer_config = ExplainerConfig.cast(explainer_config) + self._model_config = ModelConfig.cast(model_config) + + if not self.supports(): + raise ValueError( + f"The explanation algorithm '{self.__class__.__name__}' does " + f"not support the given explanation settings.") + + # Helper functions ######################################################## + + @staticmethod + def _post_process_mask( + mask: Optional[Tensor], + hard_mask: Optional[Tensor] = None, + apply_sigmoid: bool = True, + ) -> Optional[Tensor]: + if mask is None: + return mask + + mask = mask.detach() + + if apply_sigmoid: + mask = F.sigmoid(mask) + + if hard_mask is not None and mask.shape[0] == hard_mask.shape[0]: + mask = paddle.where(hard_mask, mask, paddle.zeros_like(mask)) + + return mask + + @staticmethod + def _get_hard_masks( + model: paddle.nn.Layer, + node_index: Optional[Union[int, Tensor]], + edge_index: Tensor, + num_nodes: int, + ) -> Tuple[Optional[Tensor], Optional[Tensor]]: + if node_index is None: + return None, None # Consider all nodes and edges. + + index, _, _, edge_mask = k_hop_subgraph( + node_index, + num_hops=ExplainerAlgorithm._num_hops(model), + edge_index=edge_index, + num_nodes=num_nodes, + flow=ExplainerAlgorithm._flow(model), + ) + + node_mask = paddle.zeros([num_nodes], dtype='bool') + node_mask[index] = True + + return node_mask, edge_mask + + @staticmethod + def _num_hops(model: paddle.nn.Layer) -> int: + num_hops = 0 + for module in model.sublayers(): + if isinstance(module, MessagePassing): + num_hops += 1 + return num_hops + + @staticmethod + def _flow(model: paddle.nn.Layer) -> str: + for module in model.sublayers(): + if isinstance(module, MessagePassing): + return module.flow + return 'source_to_target' + + def _loss_binary_classification(self, y_hat: Tensor, y: Tensor) -> Tensor: + if self.model_config.return_type == ModelReturnType.raw: + loss_fn = F.binary_cross_entropy_with_logits + elif self.model_config.return_type == ModelReturnType.probs: + loss_fn = F.binary_cross_entropy + else: + raise ValueError("Invalid ModelReturnType for binary classification") + + return loss_fn(y_hat.reshape(y.shape), y.astype('float32')) + + def _loss_multiclass_classification( + self, + y_hat: Tensor, + y: Tensor, + ) -> Tensor: + if self.model_config.return_type == ModelReturnType.raw: + loss_fn = F.cross_entropy + elif self.model_config.return_type == ModelReturnType.probs: + loss_fn = F.cross_entropy + elif self.model_config.return_type == ModelReturnType.log_probs: + loss_fn = F.nll_loss + else: + raise ValueError("Invalid ModelReturnType for multiclass classification") + + return loss_fn(y_hat, y) + + def _loss_regression(self, y_hat: Tensor, y: Tensor) -> Tensor: + assert self.model_config.return_type == ModelReturnType.raw + return F.mse_loss(y_hat, y) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/captum.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/captum.py new file mode 100644 index 00000000..77f2ddfa --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/captum.py @@ -0,0 +1,249 @@ +from enum import Enum +from typing import Dict, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.explain.algorithm.utils import ( + clear_masks, + set_hetero_masks, + set_masks, +) +from paddle_geometric.explain.config import ( + ModelConfig, + ModelMode, + ModelReturnType, +) +from paddle_geometric.typing import EdgeType, Metadata, NodeType + + +class MaskLevelType(Enum): + node = 'node' + edge = 'edge' + node_and_edge = 'node_and_edge' + + @property + def with_edge(self) -> bool: + return self in [MaskLevelType.edge, MaskLevelType.node_and_edge] + + +class CaptumModel(paddle.nn.Layer): + def __init__( + self, + model: paddle.nn.Layer, + mask_type: Union[str, MaskLevelType], + output_idx: Optional[Union[int, Tensor]] = None, + model_config: Optional[ModelConfig] = None, + ): + super().__init__() + + self.mask_type = MaskLevelType(mask_type) + self.model = model + self.output_idx = output_idx + self.model_config = model_config + + def forward(self, mask, *args): + assert mask.shape[0] == 1, "Dimension 0 of input should be 1" + if self.mask_type == MaskLevelType.edge: + assert len(args) >= 2, "Expects at least x and edge_index as args." + if self.mask_type == MaskLevelType.node: + assert len(args) >= 1, "Expects at least edge_index as args." + if self.mask_type == MaskLevelType.node_and_edge: + assert args[0].shape[0] == 1, "Dimension 0 of input should be 1" + assert len(args[1:]) >= 1, "Expects at least edge_index as args." + + if self.mask_type == MaskLevelType.edge: + set_masks(self.model, mask.squeeze(0), args[1], apply_sigmoid=False) + elif self.mask_type == MaskLevelType.node_and_edge: + set_masks(self.model, args[0].squeeze(0), args[1], apply_sigmoid=False) + args = args[1:] + + if self.mask_type == MaskLevelType.edge: + x = self.model(*args) + else: + x = self.model(mask.squeeze(0), *args) + + return self.postprocess(x) + + def postprocess(self, x: Tensor) -> Tensor: + if self.mask_type.with_edge: + clear_masks(self.model) + + if self.output_idx is not None: + x = x[self.output_idx] + if isinstance(self.output_idx, int) or self.output_idx.ndim == 0: + x = x.unsqueeze(0) + + if (self.model_config is not None + and self.model_config.mode == ModelMode.binary_classification): + assert self.model_config.return_type == ModelReturnType.probs + x = x.reshape([-1, 1]) + x = paddle.concat([1 - x, x], axis=-1) + + return x + + +class CaptumHeteroModel(CaptumModel): + def __init__( + self, + model: paddle.nn.Layer, + mask_type: Union[str, MaskLevelType], + output_idx: Optional[Union[int, Tensor]], + metadata: Metadata, + model_config: Optional[ModelConfig] = None, + ): + super().__init__(model, mask_type, output_idx, model_config) + self.node_types = metadata[0] + self.edge_types = metadata[1] + self.num_node_types = len(self.node_types) + self.num_edge_types = len(self.edge_types) + + def _captum_data_to_hetero_data( + self, *args + ) -> Tuple[Dict[NodeType, Tensor], Dict[EdgeType, Tensor], Optional[Dict[ + EdgeType, Tensor]]]: + if self.mask_type == MaskLevelType.node: + node_tensors = args[:self.num_node_types] + node_tensors = [mask.squeeze(0) for mask in node_tensors] + x_dict = dict(zip(self.node_types, node_tensors)) + edge_index_dict = args[self.num_node_types] + elif self.mask_type == MaskLevelType.edge: + edge_mask_tensors = args[:self.num_edge_types] + x_dict = args[self.num_edge_types] + edge_index_dict = args[self.num_edge_types + 1] + else: + node_tensors = args[:self.num_node_types] + node_tensors = [mask.squeeze(0) for mask in node_tensors] + x_dict = dict(zip(self.node_types, node_tensors)) + edge_mask_tensors = args[self.num_node_types:self.num_node_types + + self.num_edge_types] + edge_index_dict = args[self.num_node_types + self.num_edge_types] + + if self.mask_type.with_edge: + edge_mask_tensors = [mask.squeeze(0) for mask in edge_mask_tensors] + edge_mask_dict = dict(zip(self.edge_types, edge_mask_tensors)) + else: + edge_mask_dict = None + return x_dict, edge_index_dict, edge_mask_dict + + def forward(self, *args): + if self.mask_type == MaskLevelType.node: + assert len(args) >= self.num_node_types + 1 + len_remaining_args = len(args) - (self.num_node_types + 1) + elif self.mask_type == MaskLevelType.edge: + assert len(args) >= self.num_edge_types + 2 + len_remaining_args = len(args) - (self.num_edge_types + 2) + else: + assert len(args) >= self.num_node_types + self.num_edge_types + 1 + len_remaining_args = len(args) - (self.num_node_types + + self.num_edge_types + 1) + + (x_dict, edge_index_dict, + edge_mask_dict) = self._captum_data_to_hetero_data(*args) + + if self.mask_type.with_edge: + set_hetero_masks(self.model, edge_mask_dict, edge_index_dict) + + if len_remaining_args > 0: + x = self.model(x_dict, edge_index_dict, + *args[-len_remaining_args:]) + else: + x = self.model(x_dict, edge_index_dict) + + return self.postprocess(x) + + +def _to_edge_mask(edge_index: Tensor) -> Tensor: + num_edges = edge_index.shape[1] + return paddle.ones([num_edges], dtype='float32', stop_gradient=False) + + +def to_captum_input( + x: Union[Tensor, Dict[NodeType, Tensor]], + edge_index: Union[Tensor, Dict[EdgeType, Tensor]], + mask_type: Union[str, MaskLevelType], + *args, +) -> Tuple[Tuple[Tensor, ...], Tuple[Tensor, ...]]: + mask_type = MaskLevelType(mask_type) + + additional_forward_args = [] + if isinstance(x, Tensor) and isinstance(edge_index, Tensor): + if mask_type == MaskLevelType.node: + inputs = [x.unsqueeze(0)] + elif mask_type == MaskLevelType.edge: + inputs = [_to_edge_mask(edge_index).unsqueeze(0)] + additional_forward_args.append(x) + else: + inputs = [x.unsqueeze(0), _to_edge_mask(edge_index).unsqueeze(0)] + additional_forward_args.append(edge_index) + + elif isinstance(x, Dict) and isinstance(edge_index, Dict): + node_types = x.keys() + edge_types = edge_index.keys() + inputs = [] + if mask_type == MaskLevelType.node: + for key in node_types: + inputs.append(x[key].unsqueeze(0)) + elif mask_type == MaskLevelType.edge: + for key in edge_types: + inputs.append(_to_edge_mask(edge_index[key]).unsqueeze(0)) + additional_forward_args.append(x) + else: + for key in node_types: + inputs.append(x[key].unsqueeze(0)) + for key in edge_types: + inputs.append(_to_edge_mask(edge_index[key]).unsqueeze(0)) + additional_forward_args.append(edge_index) + + else: + raise ValueError( + "'x' and 'edge_index' need to be either" + f"'Dict' or 'Tensor' got({type(x)}, {type(edge_index)})") + + additional_forward_args.extend(args) + + return tuple(inputs), tuple(additional_forward_args) + + +def captum_output_to_dicts( + captum_attrs: Tuple[Tensor, ...], + mask_type: Union[str, MaskLevelType], + metadata: Metadata, +) -> Tuple[Optional[Dict[NodeType, Tensor]], Optional[Dict[EdgeType, Tensor]]]: + mask_type = MaskLevelType(mask_type) + node_types = metadata[0] + edge_types = metadata[1] + x_attr_dict, edge_attr_dict = None, None + captum_attrs = [captum_attr.squeeze(0) for captum_attr in captum_attrs] + if mask_type == MaskLevelType.node: + assert len(node_types) == len(captum_attrs) + x_attr_dict = dict(zip(node_types, captum_attrs)) + elif mask_type == MaskLevelType.edge: + assert len(edge_types) == len(captum_attrs) + edge_attr_dict = dict(zip(edge_types, captum_attrs)) + elif mask_type == MaskLevelType.node_and_edge: + assert len(edge_types) + len(node_types) == len(captum_attrs) + x_attr_dict = dict(zip(node_types, captum_attrs[:len(node_types)])) + edge_attr_dict = dict(zip(edge_types, captum_attrs[len(node_types):])) + return x_attr_dict, edge_attr_dict + + +def convert_captum_output( + captum_attrs: Tuple[Tensor, ...], + mask_type: Union[str, MaskLevelType], + metadata: Optional[Metadata] = None, +): + mask_type = MaskLevelType(mask_type) + if metadata is not None: + return captum_output_to_dicts(captum_attrs, mask_type, metadata) + + node_mask = edge_mask = None + if mask_type == MaskLevelType.edge: + edge_mask = captum_attrs[0].squeeze(0) + elif mask_type == MaskLevelType.node: + node_mask = captum_attrs[0].squeeze(0) + else: + node_mask = captum_attrs[0].squeeze(0) + edge_mask = captum_attrs[1].squeeze(0) + + return node_mask, edge_mask diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/captum_explainer.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/captum_explainer.py new file mode 100644 index 00000000..3c1d0899 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/captum_explainer.py @@ -0,0 +1,178 @@ +import inspect +import logging +import warnings +from typing import Any, Dict, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.explain import Explanation, HeteroExplanation +from paddle_geometric.explain.algorithm import ExplainerAlgorithm +from paddle_geometric.explain.algorithm.captum import ( + CaptumHeteroModel, + CaptumModel, + MaskLevelType, + convert_captum_output, + to_captum_input, +) +from paddle_geometric.explain.config import MaskType, ModelMode, ModelReturnType +from paddle_geometric.typing import EdgeType, NodeType + + +class CaptumExplainer(ExplainerAlgorithm): + SUPPORTED_METHODS = [ + 'IntegratedGradients', + 'Saliency', + 'InputXGradient', + 'Deconvolution', + 'ShapleyValueSampling', + 'GuidedBackprop', + ] + + def __init__( + self, + attribution_method: Union[str, Any], + **kwargs, + ): + super().__init__() + + import captum.attr + + if isinstance(attribution_method, str): + self.attribution_method_class = getattr( + captum.attr, + attribution_method, + ) + else: + self.attribution_method_class = attribution_method + + if not self._is_supported_attribution_method(): + raise ValueError(f"{self.__class__.__name__} does not support " + f"attribution method " + f"{self.attribution_method_class.__name__}") + + if kwargs.get('internal_batch_size', 1) != 1: + warnings.warn("Overriding 'internal_batch_size' to 1") + + if 'internal_batch_size' in self._get_attribute_parameters(): + kwargs['internal_batch_size'] = 1 + + self.kwargs = kwargs + + def _get_mask_type(self) -> MaskLevelType: + node_mask_type = self.explainer_config.node_mask_type + edge_mask_type = self.explainer_config.edge_mask_type + if node_mask_type is not None and edge_mask_type is not None: + mask_type = MaskLevelType.node_and_edge + elif node_mask_type is not None: + mask_type = MaskLevelType.node + elif edge_mask_type is not None: + mask_type = MaskLevelType.edge + else: + raise ValueError("Neither node mask type nor " + "edge mask type is specified.") + return mask_type + + def _get_attribute_parameters(self) -> Dict[str, Any]: + signature = inspect.signature(self.attribution_method_class.attribute) + return signature.parameters + + def _needs_baseline(self) -> bool: + parameters = self._get_attribute_parameters() + if 'baselines' in parameters: + param = parameters['baselines'] + if param.default is inspect.Parameter.empty: + return True + return False + + def _is_supported_attribution_method(self) -> bool: + if self._needs_baseline(): + return False + elif self.attribution_method_class.__name__ in self.SUPPORTED_METHODS: + return True + return False + + def forward( + self, + model: paddle.nn.Layer, + x: Union[Tensor, Dict[NodeType, Tensor]], + edge_index: Union[Tensor, Dict[EdgeType, Tensor]], + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Union[Explanation, HeteroExplanation]: + + mask_type = self._get_mask_type() + + inputs, add_forward_args = to_captum_input( + x, + edge_index, + mask_type, + *kwargs.values(), + ) + + if isinstance(x, dict): # Heterogeneous GNN: + metadata = (list(x.keys()), list(edge_index.keys())) + captum_model = CaptumHeteroModel( + model, + mask_type, + index, + metadata, + self.model_config, + ) + else: # Homogeneous GNN: + metadata = None + captum_model = CaptumModel( + model, + mask_type, + index, + self.model_config, + ) + + self.attribution_method_instance = self.attribution_method_class( + captum_model) + + if self.model_config.mode == ModelMode.regression: + target = None + elif index is not None: + target = target[index] + + attributions = self.attribution_method_instance.attribute( + inputs=inputs, + target=target, + additional_forward_args=add_forward_args, + **self.kwargs, + ) + + node_mask, edge_mask = convert_captum_output( + attributions, + mask_type, + metadata, + ) + + if not isinstance(x, dict): + return Explanation(node_mask=node_mask, edge_mask=edge_mask) + + explanation = HeteroExplanation() + explanation.set_value_dict('node_mask', node_mask) + explanation.set_value_dict('edge_mask', edge_mask) + return explanation + + def supports(self) -> bool: + node_mask_type = self.explainer_config.node_mask_type + if node_mask_type not in [None, MaskType.attributes]: + logging.error(f"'{self.__class__.__name__}' expects " + f"'node_mask_type' to be 'None' or 'attributes' " + f"(got '{node_mask_type.value}')") + return False + + return_type = self.model_config.return_type + if (self.model_config.mode == ModelMode.binary_classification + and return_type != ModelReturnType.probs): + logging.error(f"'{self.__class__.__name__}' expects " + f"'return_type' to be 'probs' for binary " + f"classification tasks (got '{return_type.value}')") + return False + + return True diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/dummy_explainer.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/dummy_explainer.py new file mode 100644 index 00000000..19279e0a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/dummy_explainer.py @@ -0,0 +1,83 @@ +from collections import defaultdict +from typing import Dict, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.explain import Explanation, HeteroExplanation +from paddle_geometric.explain.algorithm import ExplainerAlgorithm +from paddle_geometric.explain.config import MaskType +from paddle_geometric.typing import EdgeType, NodeType + + +class DummyExplainer(ExplainerAlgorithm): + r"""A dummy explainer that returns random explanations (useful for testing + purposes). + """ + + def forward( + self, + model: paddle.nn.Layer, + x: Union[Tensor, Dict[NodeType, Tensor]], + edge_index: Union[Tensor, Dict[EdgeType, Tensor]], + edge_attr: Optional[Union[Tensor, Dict[EdgeType, Tensor]]] = None, + **kwargs, + ) -> Union[Explanation, HeteroExplanation]: + # Ensure input `x` is either a Tensor or a dictionary for heterogeneous graphs + assert isinstance(x, (Tensor, dict)) + + # Get the mask types for nodes and edges from the explainer configuration + node_mask_type = self.explainer_config.node_mask_type + edge_mask_type = self.explainer_config.edge_mask_type + + if isinstance(x, Tensor): # Case: Homogeneous graph + assert isinstance(edge_index, Tensor) # Ensure edge_index is a tensor + + # Initialize node mask based on mask type + node_mask = None + if node_mask_type == MaskType.object: + node_mask = paddle.rand([x.shape[0], 1], dtype=x.dtype) + elif node_mask_type == MaskType.common_attributes: + node_mask = paddle.rand([1, x.shape[1]], dtype=x.dtype) + elif node_mask_type == MaskType.attributes: + node_mask = paddle.rand_like(x) + + # Initialize edge mask based on mask type + edge_mask = None + if edge_mask_type == MaskType.object: + edge_mask = paddle.rand([edge_index.shape[1]], dtype=x.dtype) + + # Return an Explanation object with node and edge masks + return Explanation(node_mask=node_mask, edge_mask=edge_mask) + + else: # Case: Heterogeneous graph (x is a dictionary) + assert isinstance(edge_index, dict) # Ensure edge_index is a dictionary + + # Create random node masks for each node type + node_dict = defaultdict(dict) + for k, v in x.items(): + node_mask = None + if node_mask_type == MaskType.object: + node_mask = paddle.rand([v.shape[0], 1], dtype=v.dtype) + elif node_mask_type == MaskType.common_attributes: + node_mask = paddle.rand([1, v.shape[1]], dtype=v.dtype) + elif node_mask_type == MaskType.attributes: + node_mask = paddle.rand_like(v) + if node_mask is not None: + node_dict[k]['node_mask'] = node_mask + + # Create random edge masks for each edge type + edge_dict = defaultdict(dict) + for k, v in edge_index.items(): + edge_mask = None + if edge_mask_type == MaskType.object: + edge_mask = paddle.rand([v.shape[1]], dtype=v.dtype) + if edge_mask is not None: + edge_dict[k]['edge_mask'] = edge_mask + + # Return a HeteroExplanation with masks for each node and edge type + return HeteroExplanation({**node_dict, **edge_dict}) + + def supports(self) -> bool: + # This explainer supports all configurations + return True diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/gnn_explainer.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/gnn_explainer.py new file mode 100644 index 00000000..e185c389 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/gnn_explainer.py @@ -0,0 +1,187 @@ +from math import sqrt +from typing import Optional, Tuple, Union + +import paddle +from paddle import Tensor, nn + +from paddle_geometric.explain import ExplainerConfig, Explanation, ModelConfig +from paddle_geometric.explain.algorithm import ExplainerAlgorithm +from paddle_geometric.explain.algorithm.utils import clear_masks, set_masks +from paddle_geometric.explain.config import MaskType, ModelMode, ModelTaskLevel + + +class GNNExplainer(ExplainerAlgorithm): + r"""The GNN-Explainer model from the `"GNNExplainer: Generating + Explanations for Graph Neural Networks" + `_ paper for identifying compact subgraph + structures and node features that play a crucial role in the predictions + made by a GNN. + + .. note:: + For an example of using :class:`GNNExplainer`, see + `examples/explain/gnn_explainer.py `_. + + Args: + epochs (int, optional): The number of epochs to train. + (default: :obj:`100`) + lr (float, optional): The learning rate to apply. + (default: :obj:`0.01`) + **kwargs (optional): Additional hyper-parameters to override default + settings in + :attr:`~paddle_geometric.explain.algorithm.GNNExplainer.coeffs`. + """ + + coeffs = { + 'edge_size': 0.005, + 'edge_reduction': 'sum', + 'node_feat_size': 1.0, + 'node_feat_reduction': 'mean', + 'edge_ent': 1.0, + 'node_feat_ent': 0.1, + 'EPS': 1e-15, + } + + def __init__(self, epochs: int = 100, lr: float = 0.01, **kwargs): + super().__init__() + self.epochs = epochs + self.lr = lr + self.coeffs.update(kwargs) + + self.node_mask = self.hard_node_mask = None + self.edge_mask = self.hard_edge_mask = None + + def forward( + self, + model: nn.Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Explanation: + if isinstance(x, dict) or isinstance(edge_index, dict): + raise ValueError(f"Heterogeneous graphs not yet supported in " + f"'{self.__class__.__name__}'") + + self._train(model, x, edge_index, target=target, index=index, **kwargs) + + node_mask = self._post_process_mask( + self.node_mask, + self.hard_node_mask, + apply_sigmoid=True, + ) + edge_mask = self._post_process_mask( + self.edge_mask, + self.hard_edge_mask, + apply_sigmoid=True, + ) + + self._clean_model(model) + + return Explanation(node_mask=node_mask, edge_mask=edge_mask) + + def supports(self) -> bool: + return True + + def _train( + self, + model: nn.Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ): + self._initialize_masks(x, edge_index) + + parameters = [] + if self.node_mask is not None: + parameters.append(self.node_mask) + if self.edge_mask is not None: + set_masks(model, self.edge_mask, edge_index, apply_sigmoid=True) + parameters.append(self.edge_mask) + + optimizer = paddle.optimizer.Adam(parameters, learning_rate=self.lr) + + for i in range(self.epochs): + optimizer.clear_grad() + + h = x if self.node_mask is None else x * paddle.nn.functional.sigmoid(self.node_mask) + y_hat, y = model(h, edge_index, **kwargs), target + + if index is not None: + y_hat, y = y_hat[index], y[index] + + loss = self._loss(y_hat, y) + + loss.backward() + optimizer.step() + + if i == 0: + if self.node_mask is not None and self.node_mask.grad is not None: + self.hard_node_mask = self.node_mask.grad != 0.0 + if self.edge_mask is not None and self.edge_mask.grad is not None: + self.hard_edge_mask = self.edge_mask.grad != 0.0 + + def _initialize_masks(self, x: Tensor, edge_index: Tensor): + node_mask_type = self.explainer_config.node_mask_type + edge_mask_type = self.explainer_config.edge_mask_type + + device = x.place + (N, F), E = x.shape, edge_index.shape[1] + + std = 0.1 + if node_mask_type is None: + self.node_mask = None + elif node_mask_type == MaskType.object: + self.node_mask = paddle.create_parameter( + shape=[N, 1], dtype=x.dtype, default_initializer=paddle.nn.initializer.Normal(std=std) + ) + elif node_mask_type == MaskType.attributes: + self.node_mask = paddle.create_parameter( + shape=[N, F], dtype=x.dtype, default_initializer=paddle.nn.initializer.Normal(std=std) + ) + elif node_mask_type == MaskType.common_attributes: + self.node_mask = paddle.create_parameter( + shape=[1, F], dtype=x.dtype, default_initializer=paddle.nn.initializer.Normal(std=std) + ) + + if edge_mask_type == MaskType.object: + std = paddle.nn.initializer.calculate_gain('relu') * sqrt(2.0 / (2 * N)) + self.edge_mask = paddle.create_parameter( + shape=[E], dtype=x.dtype, default_initializer=paddle.nn.initializer.Normal(std=std) + ) + + def _loss(self, y_hat: Tensor, y: Tensor) -> Tensor: + if self.model_config.mode == ModelMode.binary_classification: + loss = self._loss_binary_classification(y_hat, y) + elif self.model_config.mode == ModelMode.multiclass_classification: + loss = self._loss_multiclass_classification(y_hat, y) + elif self.model_config.mode == ModelMode.regression: + loss = self._loss_regression(y_hat, y) + + if self.hard_edge_mask is not None: + m = paddle.nn.functional.sigmoid(self.edge_mask[self.hard_edge_mask]) + edge_reduce = getattr(paddle, self.coeffs['edge_reduction']) + loss = loss + self.coeffs['edge_size'] * edge_reduce(m) + ent = -m * paddle.log(m + self.coeffs['EPS']) - ( + 1 - m) * paddle.log(1 - m + self.coeffs['EPS']) + loss = loss + self.coeffs['edge_ent'] * ent.mean() + + if self.hard_node_mask is not None: + m = paddle.nn.functional.sigmoid(self.node_mask[self.hard_node_mask]) + node_reduce = getattr(paddle, self.coeffs['node_feat_reduction']) + loss = loss + self.coeffs['node_feat_size'] * node_reduce(m) + ent = -m * paddle.log(m + self.coeffs['EPS']) - ( + 1 - m) * paddle.log(1 - m + self.coeffs['EPS']) + loss = loss + self.coeffs['node_feat_ent'] * ent.mean() + + return loss + + def _clean_model(self, model): + clear_masks(model) + self.node_mask = self.hard_node_mask = None + self.edge_mask = self.hard_edge_mask = None diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/graphmask_explainer.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/graphmask_explainer.py new file mode 100644 index 00000000..9fff6876 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/graphmask_explainer.py @@ -0,0 +1,457 @@ +import math +from typing import List, Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import LayerNorm, Linear, Layer, ReLU, LayerList, ParameterList +from tqdm import tqdm + +from paddle_geometric.explain import Explanation +from paddle_geometric.explain.algorithm import ExplainerAlgorithm +from paddle_geometric.explain.config import MaskType, ModelMode, ModelTaskLevel +from paddle_geometric.nn import MessagePassing + + +def explain_message(self, out: Tensor, x_i: Tensor, x_j: Tensor) -> Tensor: + basis_messages = F.layer_norm(out, normalized_shape=out.shape[-1:]).relu() + + if getattr(self, 'message_scale', None) is not None: + basis_messages = basis_messages * self.message_scale.unsqueeze(-1) + + if self.message_replacement is not None: + if basis_messages.shape == self.message_replacement.shape: + basis_messages = ( + basis_messages + + (1 - self.message_scale).unsqueeze(-1) * self.message_replacement + ) + else: + basis_messages = ( + basis_messages + + ((1 - self.message_scale).unsqueeze(-1) * + self.message_replacement.unsqueeze(0)) + ) + + self.latest_messages = basis_messages + self.latest_source_embeddings = x_j + self.latest_target_embeddings = x_i + + return basis_messages + + +class GraphMaskExplainer(ExplainerAlgorithm): + coeffs = { + 'node_feat_size': 1.0, + 'node_feat_reduction': 'mean', + 'node_feat_ent': 0.1, + 'EPS': 1e-15, + } + + def __init__( + self, + num_layers: int, + epochs: int = 100, + lr: float = 0.01, + penalty_scaling: int = 5, + lambda_optimizer_lr: float = 1e-2, + init_lambda: float = 0.55, + allowance: float = 0.03, + allow_multiple_explanations: bool = False, + log: bool = True, + **kwargs, + ): + super().__init__() + assert 0 <= penalty_scaling <= 10 + assert 0 <= init_lambda <= 1 + assert 0 <= allowance <= 1 + + self.num_layers = num_layers + self.init_lambda = init_lambda + self.lambda_optimizer_lr = lambda_optimizer_lr + self.penalty_scaling = penalty_scaling + self.allowance = allowance + self.allow_multiple_explanations = allow_multiple_explanations + self.epochs = epochs + self.lr = lr + self.log = log + self.coeffs.update(kwargs) + + def forward( + self, + model: Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Explanation: + + hard_node_mask = None + + if self.model_config.task_level == ModelTaskLevel.node: + hard_node_mask, hard_edge_mask = self._get_hard_masks( + model, index, edge_index, num_nodes=x.shape[0]) + self._train_explainer(model, x, edge_index, target=target, index=index, + **kwargs) + node_mask = self._post_process_mask(self.node_feat_mask, + hard_node_mask, apply_sigmoid=True) + edge_mask = self._explain(model, index=index) + edge_mask = edge_mask[:edge_index.shape[1]] + + return Explanation(node_mask=node_mask, edge_mask=edge_mask) + + def supports(self) -> bool: + return True + + def _hard_concrete( + self, + input_element: Tensor, + summarize_penalty: bool = True, + beta: float = 1 / 3, + gamma: float = -0.2, + zeta: float = 1.2, + loc_bias: int = 2, + min_val: int = 0, + max_val: int = 1, + training: bool = True, + ) -> Tuple[Tensor, Tensor]: + input_element = input_element + loc_bias + + if training: + u = paddle.rand_like(input_element) + s = F.sigmoid( + (paddle.log(u) - paddle.log(1 - u) + input_element) / beta) + + penalty = F.sigmoid(input_element - beta * math.log(-gamma / zeta)) + else: + s = F.sigmoid(input_element) + penalty = paddle.zeros_like(input_element) + + if summarize_penalty: + penalty = penalty.mean() + + s = s * (zeta - gamma) + gamma + + clipped_s = paddle.clip(s, min=min_val, max=max_val) + + clip_value = (paddle.min(clipped_s) + paddle.max(clipped_s)) / 2 + hard_concrete = (clipped_s > clip_value).astype(paddle.float32) + clipped_s = clipped_s + (hard_concrete - clipped_s).detach() + + return clipped_s, penalty + + def _set_masks( + self, + i_dim: List[int], + j_dim: List[int], + h_dim: List[int], + x: Tensor, + ): + r"""Sets the node masks and edge masks.""" + num_nodes, num_feat = x.shape + std = 0.1 + self.feat_mask_type = self.explainer_config.node_mask_type + + if self.feat_mask_type == MaskType.attributes: + self.node_feat_mask = self.create_parameter( + shape=[num_nodes, num_feat], default_initializer=paddle.nn.initializer.Normal(std=std) + ) + elif self.feat_mask_type == MaskType.object: + self.node_feat_mask = self.create_parameter( + shape=[num_nodes, 1], default_initializer=paddle.nn.initializer.Normal(std=std) + ) + else: + self.node_feat_mask = self.create_parameter( + shape=[1, num_feat], default_initializer=paddle.nn.initializer.Normal(std=std) + ) + + baselines, self.gates, full_biases = [], LayerList(), [] + + for v_dim, m_dim, h_dim in zip(i_dim, j_dim, h_dim): + self.transform, self.layer_norm = [], [] + + input_dims = [v_dim, m_dim, v_dim] + for input_dim in input_dims: + self.transform.append( + Linear(input_dim, h_dim, bias_attr=False) + ) + self.layer_norm.append(LayerNorm(h_dim)) + + self.transforms = LayerList(self.transform) + self.layer_norms = LayerList(self.layer_norm) + + self.full_bias = self.create_parameter( + shape=[h_dim], default_initializer=paddle.nn.initializer.Constant(0.0) + ) + full_biases.append(self.full_bias) + + self.reset_parameters(input_dims, h_dim) + + self.non_linear = ReLU() + self.output_layer = Linear(h_dim, 1) + + gate = [ + self.transforms, self.layer_norms, self.non_linear, + self.output_layer + ] + self.gates.extend(gate) + + baseline = self.create_parameter( + shape=[m_dim], + default_initializer=paddle.nn.initializer.Uniform(low=-1.0 / math.sqrt(m_dim), high=1.0 / math.sqrt(m_dim)) + ) + baselines.append(baseline) + + self.full_biases = ParameterList(full_biases) + self.baselines = ParameterList(baselines) + + for param in self.parameters(): + param.stop_gradient = True + + def _enable_layer(self, layer: int): + r"""Enables the input layer's edge mask.""" + for d in range(layer * 4, (layer * 4) + 4): + for param in self.gates[d].parameters(): + param.stop_gradient = False + self.full_biases[layer].stop_gradient = False + self.baselines[layer].stop_gradient = False + + def reset_parameters(self, input_dims: List[int], h_dim: int): + r"""Resets all learnable parameters of the module.""" + fan_in = sum(input_dims) + std = math.sqrt(2.0 / float(fan_in + h_dim)) + a = math.sqrt(3.0) * std + + for transform in self.transforms: + paddle.nn.initializer.Uniform(low=-a, high=a)(transform.weight) + + paddle.nn.initializer.Constant(0.0)(self.full_bias) + + for layer_norm in self.layer_norms: + layer_norm.reset_parameters() + + def _loss(self, y_hat: Tensor, y: Tensor, penalty: float) -> Tensor: + if self.model_config.mode == ModelMode.binary_classification: + loss = self._loss_binary_classification(y_hat, y) + elif self.model_config.mode == ModelMode.multiclass_classification: + loss = self._loss_multiclass_classification(y_hat, y) + elif self.model_config.mode == ModelMode.regression: + loss = self._loss_regression(y_hat, y) + else: + assert False + + g = F.relu(loss - self.allowance).mean() + f = penalty * self.penalty_scaling + + loss = f + F.softplus(self.lambda_op) * g + + m = F.sigmoid(self.node_feat_mask) + node_feat_reduce = getattr(paddle, self.coeffs['node_feat_reduction']) + loss += self.coeffs['node_feat_size'] * node_feat_reduce(m) + ent = -m * paddle.log(m + self.coeffs['EPS']) - ( + 1 - m) * paddle.log(1 - m + self.coeffs['EPS']) + loss += self.coeffs['node_feat_ent'] * ent.mean() + + return loss + + def _freeze_model(self, module: Layer): + r"""Freezes the parameters of the original GNN model by disabling + their gradients. + """ + for param in module.parameters(): + param.stop_gradient = True + + def _set_flags(self, model: Layer): + r"""Initializes the underlying explainer model's parameters for each + layer of the original GNN model. + """ + for module in model.sublayers(): + if isinstance(module, MessagePassing): + module.explain_message = explain_message.__get__( + module, MessagePassing) + module.explain = True + + def _inject_messages( + self, + model: Layer, + message_scale: List[Tensor], + message_replacement: paddle.nn.ParameterList, + set: bool = False, + ): + r"""Injects the computed messages into each layer of the original GNN + model. + """ + i = 0 + for module in model.sublayers(): + if isinstance(module, MessagePassing): + if not set: + module.message_scale = message_scale[i] + module.message_replacement = message_replacement[i] + i += 1 + else: + module.message_scale = None + module.message_replacement = None + + def _train_explainer( + self, + model: Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ): + r"""Trains the underlying explainer model.""" + if not isinstance(index, (Tensor, int)) and index is not None: + raise ValueError("'index' parameter can only be a 'Tensor', 'integer', or 'None'.") + + self._freeze_model(model) + self._set_flags(model) + + input_dims, output_dims = [], [] + for module in model.sublayers(): + if isinstance(module, MessagePassing): + input_dims.append(module.in_channels) + output_dims.append(module.out_channels) + + self._set_masks(input_dims, output_dims, output_dims, x) + + optimizer = paddle.optimizer.Adam(parameters=self.parameters(), learning_rate=self.lr) + + for layer in reversed(range(self.num_layers)): + if self.log: + pbar = tqdm(total=self.epochs) + if self.model_config.task_level == ModelTaskLevel.node: + pbar.set_description(f"Train explainer for node(s) {index} with layer {layer}") + elif self.model_config.task_level == ModelTaskLevel.edge: + pbar.set_description(f"Train explainer for edge-level task with layer {layer}") + else: + pbar.set_description(f"Train explainer for graph {index} with layer {layer}") + + self._enable_layer(layer) + for epoch in range(self.epochs): + with paddle.no_grad(): + model(x, edge_index, **kwargs) + + gates, total_penalty = [], 0 + latest_source_embeddings, latest_messages = [], [] + latest_target_embeddings = [] + + for module in model.sublayers(): + if isinstance(module, MessagePassing): + latest_source_embeddings.append(module.latest_source_embeddings) + latest_messages.append(module.latest_messages) + latest_target_embeddings.append(module.latest_target_embeddings) + + gate_input = [latest_source_embeddings, latest_messages, latest_target_embeddings] + for i in range(self.num_layers): + output = self.full_biases[i] + for j, gate in enumerate(gate_input): + try: + partial = self.gates[i * 4][j](gate[i]) + except Exception: + self._set_masks(output_dims, output_dims, output_dims, x) + partial = self.gates[i * 4][j](gate[i]) + result = self.gates[(i * 4) + 1][j](partial) + output += result + + relu_output = self.gates[(i * 4) + 2](output / len(gate_input)) + sampling_weights = self.gates[(i * 4) + 3](relu_output).squeeze(-1) + sampling_weights, penalty = self._hard_concrete(sampling_weights) + gates.append(sampling_weights) + total_penalty += penalty + + self._inject_messages(model, gates, self.baselines) + + self.lambda_op = paddle.create_parameter( + shape=[], dtype="float32", default_initializer=paddle.nn.initializer.Constant(self.init_lambda) + ) + optimizer_lambda = paddle.optimizer.RMSProp( + parameters=[self.lambda_op], learning_rate=self.lambda_optimizer_lr, centered=True + ) + + optimizer.clear_grad() + optimizer_lambda.clear_grad() + + h = x * F.sigmoid(self.node_feat_mask) + y_hat, y = model(x=h, edge_index=edge_index, **kwargs), target + + if self.model_config.task_level in [ModelTaskLevel.node, ModelTaskLevel.edge]: + if index is not None: + y_hat, y = y_hat[index], y[index] + + self._inject_messages(model, gates, self.baselines, set=True) + + loss = self._loss(y_hat, y, total_penalty) + + loss.backward() + optimizer.step() + optimizer_lambda.step() + + if self.lambda_op.numpy()[0] < -2: + self.lambda_op.set_value(paddle.full_like(self.lambda_op, -2)) + elif self.lambda_op.numpy()[0] > 30: + self.lambda_op.set_value(paddle.full_like(self.lambda_op, 30)) + + if self.log: + pbar.update(1) + + if self.log: + pbar.close() + + def _explain( + self, + model: Layer, + *, + index: Optional[Union[int, Tensor]] = None, + ) -> Tensor: + r"""Generates explanations for the original GNN model.""" + if not isinstance(index, (Tensor, int)) and index is not None: + raise ValueError("'index' parameter can only be a 'Tensor', 'integer', or 'None'.") + + self._freeze_model(model) + self._set_flags(model) + + with paddle.no_grad(): + latest_source_embeddings, latest_messages = [], [] + latest_target_embeddings = [] + + for module in model.sublayers(): + if isinstance(module, MessagePassing): + latest_source_embeddings.append(module.latest_source_embeddings) + latest_messages.append(module.latest_messages) + latest_target_embeddings.append(module.latest_target_embeddings) + + gate_input = [latest_source_embeddings, latest_messages, latest_target_embeddings] + if self.log: + pbar = tqdm(total=self.num_layers) + + for i in range(self.num_layers): + if self.log: + pbar.set_description("Explain") + output = self.full_biases[i] + for j, gate in enumerate(gate_input): + partial = self.gates[i * 4][j](gate[i]) + result = self.gates[(i * 4) + 1][j](partial) + output += result + relu_output = self.gates[(i * 4) + 2](output / len(gate_input)) + sampling_weights = self.gates[(i * 4) + 3](relu_output).squeeze(-1) + sampling_weights, _ = self._hard_concrete(sampling_weights, training=False) + + if i == 0: + edge_weight = sampling_weights + else: + edge_weight = paddle.concat([edge_weight, sampling_weights], axis=0) + + if self.log: + pbar.update(1) + + if self.log: + pbar.close() + + edge_mask = edge_weight.reshape([-1, edge_weight.shape[0] // self.num_layers]) + edge_mask = paddle.mean(edge_mask, axis=0) + + return edge_mask \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/pg_explainer.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/pg_explainer.py new file mode 100644 index 00000000..fa8e7b42 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/pg_explainer.py @@ -0,0 +1,206 @@ +import logging +from typing import Optional, Union + +import paddle +from paddle import Tensor +from paddle.nn import ReLU, Sequential +import paddle.nn.functional as F + +from paddle_geometric.explain import Explanation +from paddle_geometric.explain.algorithm import ExplainerAlgorithm +from paddle_geometric.explain.algorithm.utils import clear_masks, set_masks +from paddle_geometric.explain.config import ExplanationType, ModelMode, ModelTaskLevel +from paddle_geometric.nn import Linear +from paddle_geometric.nn.inits import reset +from paddle_geometric.utils import get_embeddings + + +class PGExplainer(ExplainerAlgorithm): + r"""The PGExplainer model from the `"Parameterized Explainer for Graph + Neural Network" `_ paper. + + Internally, it utilizes a neural network to identify subgraph structures + that play a crucial role in the predictions made by a GNN. + Importantly, the :class:`PGExplainer` needs to be trained via + :meth:`~PGExplainer.train` before being able to generate explanations: + + Args: + epochs (int): The number of epochs to train. + lr (float, optional): The learning rate to apply. + (default: :obj:`0.003`). + **kwargs (optional): Additional hyper-parameters to override default + settings in + :attr:`~paddle_geometric.explain.algorithm.PGExplainer.coeffs`. + """ + + coeffs = { + 'edge_size': 0.05, + 'edge_ent': 1.0, + 'temp': [5.0, 2.0], + 'bias': 0.01, + } + + def __init__(self, epochs: int, lr: float = 0.003, **kwargs): + super().__init__() + self.epochs = epochs + self.lr = lr + self.coeffs.update(kwargs) + + self.mlp = Sequential( + Linear(-1, 64), + ReLU(), + Linear(64, 1), + ) + self.optimizer = paddle.optimizer.Adam(parameters=self.mlp.parameters(), learning_rate=lr) + self._curr_epoch = -1 + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + reset(self.mlp) + + def train( + self, + epoch: int, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ): + r"""Trains the underlying explainer model. + Needs to be called before being able to make predictions. + + Args: + epoch (int): The current epoch of the training phase. + model (paddle.nn.Layer): The model to explain. + x (paddle.Tensor): The input node features of a homogeneous graph. + edge_index (paddle.Tensor): The input edge indices of a homogeneous graph. + target (paddle.Tensor): The target of the model. + index (int or paddle.Tensor, optional): The index of the model output to explain. + Needs to be a single index. + """ + if isinstance(x, dict) or isinstance(edge_index, dict): + raise ValueError(f"Heterogeneous graphs not yet supported in '{self.__class__.__name__}'") + + if self.model_config.task_level == ModelTaskLevel.node: + if index is None: + raise ValueError(f"The 'index' argument needs to be provided in '{self.__class__.__name__}' for node-level explanations") + if isinstance(index, Tensor) and index.numel() > 1: + raise ValueError(f"Only scalars are supported for the 'index' argument in '{self.__class__.__name__}'") + + z = get_embeddings(model, x, edge_index, **kwargs)[-1] + + self.optimizer.clear_grad() + temperature = self._get_temperature(epoch) + + inputs = self._get_inputs(z, edge_index, index) + logits = self.mlp(inputs).flatten() + edge_mask = self._concrete_sample(logits, temperature) + set_masks(model, edge_mask, edge_index, apply_sigmoid=True) + + if self.model_config.task_level == ModelTaskLevel.node: + _, hard_edge_mask = self._get_hard_masks(model, index, edge_index, num_nodes=x.shape[0]) + edge_mask = edge_mask[hard_edge_mask] + + y_hat, y = model(x, edge_index, **kwargs), target + + if index is not None: + y_hat, y = y_hat[index], y[index] + + loss = self._loss(y_hat, y, edge_mask) + loss.backward() + self.optimizer.step() + + clear_masks(model) + self._curr_epoch = epoch + + return float(loss.numpy()) + + def forward( + self, + model: paddle.nn.Layer, + x: Tensor, + edge_index: Tensor, + *, + target: Tensor, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Explanation: + if isinstance(x, dict) or isinstance(edge_index, dict): + raise ValueError(f"Heterogeneous graphs not yet supported in '{self.__class__.__name__}'") + + if self._curr_epoch < self.epochs - 1: + raise ValueError(f"'{self.__class__.__name__}' is not yet fully trained (got {self._curr_epoch + 1} epochs from {self.epochs} epochs). Please first train the underlying explainer model by running `explainer.algorithm.train(...)`.") + + hard_edge_mask = None + if self.model_config.task_level == ModelTaskLevel.node: + if index is None: + raise ValueError(f"The 'index' argument needs to be provided in '{self.__class__.__name__}' for node-level explanations") + if isinstance(index, Tensor) and index.numel() > 1: + raise ValueError(f"Only scalars are supported for the 'index' argument in '{self.__class__.__name__}'") + + _, hard_edge_mask = self._get_hard_masks(model, index, edge_index, num_nodes=x.shape[0]) + + z = get_embeddings(model, x, edge_index, **kwargs)[-1] + + inputs = self._get_inputs(z, edge_index, index) + logits = self.mlp(inputs).flatten() + + edge_mask = self._post_process_mask(logits, hard_edge_mask, apply_sigmoid=True) + + return Explanation(edge_mask=edge_mask) + + def supports(self) -> bool: + explanation_type = self.explainer_config.explanation_type + if explanation_type != ExplanationType.phenomenon: + logging.error(f"'{self.__class__.__name__}' only supports phenomenon explanations got (`explanation_type={explanation_type.value}`)") + return False + + task_level = self.model_config.task_level + if task_level not in {ModelTaskLevel.node, ModelTaskLevel.graph}: + logging.error(f"'{self.__class__.__name__}' only supports node-level or graph-level explanations got (`task_level={task_level.value}`)") + return False + + node_mask_type = self.explainer_config.node_mask_type + if node_mask_type is not None: + logging.error(f"'{self.__class__.__name__}' does not support explaining input node features got (`node_mask_type={node_mask_type.value}`)") + return False + + return True + + ########################################################################### + + def _get_inputs(self, embedding: Tensor, edge_index: Tensor, index: Optional[int] = None) -> Tensor: + zs = [embedding[edge_index[0]], embedding[edge_index[1]]] + if self.model_config.task_level == ModelTaskLevel.node: + assert index is not None + zs.append(embedding[index].reshape([1, -1]).expand([zs[0].shape[0], -1])) + return paddle.concat(zs, axis=-1) + + def _get_temperature(self, epoch: int) -> float: + temp = self.coeffs['temp'] + return temp[0] * (temp[1] / temp[0]) ** (epoch / self.epochs) + + def _concrete_sample(self, logits: Tensor, temperature: float = 1.0) -> Tensor: + bias = self.coeffs['bias'] + eps = (1 - 2 * bias) * paddle.rand(logits.shape) + bias + return (paddle.log(eps) - paddle.log(1 - eps) + logits) / temperature + + def _loss(self, y_hat: Tensor, y: Tensor, edge_mask: Tensor) -> Tensor: + if self.model_config.mode == ModelMode.binary_classification: + loss = self._loss_binary_classification(y_hat, y) + elif self.model_config.mode == ModelMode.multiclass_classification: + loss = self._loss_multiclass_classification(y_hat, y) + elif self.model_config.mode == ModelMode.regression: + loss = self._loss_regression(y_hat, y) + + # Regularization loss: + mask = F.sigmoid(edge_mask) + size_loss = mask.sum() * self.coeffs['edge_size'] + mask = 0.99 * mask + 0.005 + mask_ent = -mask * paddle.log(mask + 1e-15) - (1 - mask) * paddle.log(1 - mask + 1e-15) + mask_ent_loss = mask_ent.mean() * self.coeffs['edge_ent'] + + return loss + size_loss + mask_ent_loss diff --git a/jointContribution/mattergen/paddle_geometric/explain/algorithm/utils.py b/jointContribution/mattergen/paddle_geometric/explain/algorithm/utils.py new file mode 100644 index 00000000..0e4f30a8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/algorithm/utils.py @@ -0,0 +1,76 @@ +from typing import Dict, Union, Any + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn import MessagePassing +from paddle_geometric.typing import EdgeType + + +def set_masks( + model: Layer, + mask: Union[Tensor, Any], + edge_index: Tensor, + apply_sigmoid: bool = True, +): + r"""Apply mask to every graph layer in the :obj:`model`.""" + loop_mask = edge_index[0] != edge_index[1] + + # Loop over layers and set masks on MessagePassing layers: + for module in model.sublayers(): + if isinstance(module, MessagePassing): + # Skip layers that have been explicitly set to `False`: + if getattr(module, 'explain', True) is False: + continue + + # Convert mask to a param if it was previously registered as one. + if not isinstance(mask, paddle.create_parameter) and '_edge_mask' in module._parameters: + mask = paddle.create_parameter( + shape=mask.shape, # Assuming mask is a tensor, use its shape + dtype=mask.dtype, # Assuming mask already has a dtype, you can also specify it as 'float32' + default_initializer=paddle.nn.initializer.Assign(mask) + ) + + module.explain = True + module._edge_mask = mask + module._loop_mask = loop_mask + module._apply_sigmoid = apply_sigmoid + + +def set_hetero_masks( + model: Layer, + mask_dict: Dict[EdgeType, Union[Tensor, Any]], + edge_index_dict: Dict[EdgeType, Tensor], + apply_sigmoid: bool = True, +): + r"""Apply masks to every heterogeneous graph layer in the :obj:`model` + according to edge types. + """ + for module in model.sublayers(): + if isinstance(module, paddle.nn.LayerDict): + for edge_type, mask in mask_dict.items(): + if edge_type in module: + edge_level_module = module[edge_type] + elif '__'.join(edge_type) in module: + edge_level_module = module['__'.join(edge_type)] + else: + continue + + set_masks( + edge_level_module, + mask, + edge_index_dict[edge_type], + apply_sigmoid=apply_sigmoid, + ) + + +def clear_masks(model: Layer): + r"""Clear all masks from the model.""" + for module in model.sublayers(): + if isinstance(module, MessagePassing): + if getattr(module, 'explain', None) is True: + module.explain = None + module._edge_mask = None + module._loop_mask = None + module._apply_sigmoid = True + return module diff --git a/jointContribution/mattergen/paddle_geometric/explain/config.py b/jointContribution/mattergen/paddle_geometric/explain/config.py new file mode 100644 index 00000000..0dcd60d3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/config.py @@ -0,0 +1,225 @@ +from dataclasses import dataclass +from enum import Enum +from typing import Optional, Union + +from paddle_geometric.utils.mixin import CastMixin + + +class ExplanationType(Enum): + """Enum class for the explanation type.""" + model = 'model' + phenomenon = 'phenomenon' + + +class MaskType(Enum): + """Enum class for the mask type.""" + object = 'object' + common_attributes = 'common_attributes' + attributes = 'attributes' + + +class ModelMode(Enum): + """Enum class for the model return type.""" + binary_classification = 'binary_classification' + multiclass_classification = 'multiclass_classification' + regression = 'regression' + + +class ModelTaskLevel(Enum): + """Enum class for the model task level.""" + node = 'node' + edge = 'edge' + graph = 'graph' + + +class ModelReturnType(Enum): + """Enum class for the model return type.""" + raw = 'raw' + probs = 'probs' + log_probs = 'log_probs' + + +class ThresholdType(Enum): + """Enum class for the threshold type.""" + hard = 'hard' + topk = 'topk' + topk_hard = 'topk_hard' + # connected = 'connected' # TODO + + +@dataclass +class ExplainerConfig(CastMixin): + r"""Configuration class to store and validate high level explanation + parameters. + + Args: + explanation_type (ExplanationType or str): The type of explanation to + compute. The possible values are: + + - :obj:`"model"`: Explains the model prediction. + + - :obj:`"phenomenon"`: Explains the phenomenon that the model + is trying to predict. + + In practice, this means that the explanation algorithm will either + compute their losses with respect to the model output + (:obj:`"model"`) or the target output (:obj:`"phenomenon"`). + + node_mask_type (MaskType or str, optional): The type of mask to apply + on nodes. The possible values are (default: :obj:`None`): + + - :obj:`None`: Will not apply any mask on nodes. + + - :obj:`"object"`: Will mask each node. + + - :obj:`"common_attributes"`: Will mask each feature. + + - :obj:`"attributes"`: Will mask each feature across all nodes. + + edge_mask_type (MaskType or str, optional): The type of mask to apply + on edges. Has the sample possible values as :obj:`node_mask_type`. + (default: :obj:`None`) + """ + explanation_type: ExplanationType + node_mask_type: Optional[MaskType] + edge_mask_type: Optional[MaskType] + + def __init__( + self, + explanation_type: Union[ExplanationType, str], + node_mask_type: Optional[Union[MaskType, str]] = None, + edge_mask_type: Optional[Union[MaskType, str]] = None, + ): + if node_mask_type is not None: + node_mask_type = MaskType(node_mask_type) + if edge_mask_type is not None: + edge_mask_type = MaskType(edge_mask_type) + + if edge_mask_type is not None and edge_mask_type != MaskType.object: + raise ValueError(f"'edge_mask_type' needs be None or of type " + f"'object' (got '{edge_mask_type.value}')") + + if node_mask_type is None and edge_mask_type is None: + raise ValueError("Either 'node_mask_type' or 'edge_mask_type' " + "must be provided") + + self.explanation_type = ExplanationType(explanation_type) + self.node_mask_type = node_mask_type + self.edge_mask_type = edge_mask_type + + +@dataclass +class ModelConfig(CastMixin): + r"""Configuration class to store model parameters. + + Args: + mode (ModelMode or str): The mode of the model. The possible values + are: + + - :obj:`"binary_classification"`: A binary classification + model. + + - :obj:`"multiclass_classification"`: A multiclass + classification model. + + - :obj:`"regression"`: A regression model. + + task_level (ModelTaskLevel or str): The task-level of the model. + The possible values are: + + - :obj:`"node"`: A node-level prediction model. + + - :obj:`"edge"`: An edge-level prediction model. + + - :obj:`"graph"`: A graph-level prediction model. + + return_type (ModelReturnType or str, optional): The return type of the + model. The possible values are (default: :obj:`None`): + + - :obj:`"raw"`: The model returns raw values. + + - :obj:`"probs"`: The model returns probabilities. + + - :obj:`"log_probs"`: The model returns log-probabilities. + """ + mode: ModelMode + task_level: ModelTaskLevel + return_type: ModelReturnType + + def __init__( + self, + mode: Union[ModelMode, str], + task_level: Union[ModelTaskLevel, str], + return_type: Optional[Union[ModelReturnType, str]] = None, + ): + self.mode = ModelMode(mode) + self.task_level = ModelTaskLevel(task_level) + + if return_type is None and self.mode == ModelMode.regression: + return_type = ModelReturnType.raw + + self.return_type = ModelReturnType(return_type) + + if (self.mode == ModelMode.regression + and self.return_type != ModelReturnType.raw): + raise ValueError(f"A model for regression needs to return raw " + f"outputs (got {self.return_type.value})") + + if (self.mode == ModelMode.binary_classification and self.return_type + not in [ModelReturnType.raw, ModelReturnType.probs]): + raise ValueError( + f"A model for binary classification needs to return raw " + f"outputs or probabilities (got {self.return_type.value})") + + +@dataclass +class ThresholdConfig(CastMixin): + r"""Configuration class to store and validate threshold parameters. + + Args: + threshold_type (ThresholdType or str): The type of threshold to apply. + The possible values are: + + - :obj:`None`: No threshold is applied. + + - :obj:`"hard"`: A hard threshold is applied to each mask. + The elements of the mask with a value below the :obj:`value` + are set to :obj:`0`, the others are set to :obj:`1`. + + - :obj:`"topk"`: A soft threshold is applied to each mask. + The top obj:`value` elements of each mask are kept, the + others are set to :obj:`0`. + + - :obj:`"topk_hard"`: Same as :obj:`"topk"` but values are set + to :obj:`1` for all elements which are kept. + + value (int or float, optional): The value to use when thresholding. + (default: :obj:`None`) + """ + type: ThresholdType + value: Union[float, int] + + def __init__( + self, + threshold_type: Union[ThresholdType, str], + value: Union[float, int], + ): + self.type = ThresholdType(threshold_type) + self.value = value + + if not isinstance(self.value, (int, float)): + raise ValueError(f"Threshold value must be a float or int " + f"(got {type(self.value)}).") + + if (self.type == ThresholdType.hard + and (self.value < 0 or self.value > 1)): + raise ValueError(f"Threshold value must be between 0 and 1 " + f"(got {self.value})") + + if self.type in [ThresholdType.topk, ThresholdType.topk_hard]: + if not isinstance(self.value, int): + raise ValueError(f"Threshold value needs to be an integer " + f"(got {type(self.value)}).") + if self.value <= 0: + raise ValueError(f"Threshold value needs to be positive " + f"(got {self.value}).") diff --git a/jointContribution/mattergen/paddle_geometric/explain/explainer.py b/jointContribution/mattergen/paddle_geometric/explain/explainer.py new file mode 100644 index 00000000..e3a5123e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/explainer.py @@ -0,0 +1,273 @@ +import warnings +from typing import Any, Dict, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.explain import ( + ExplainerAlgorithm, + Explanation, + HeteroExplanation, +) +from paddle_geometric.explain.algorithm.utils import ( + clear_masks, + set_hetero_masks, + set_masks, +) +from paddle_geometric.explain.config import ( + ExplainerConfig, + ExplanationType, + MaskType, + ModelConfig, + ModelMode, + ModelReturnType, + ThresholdConfig, +) +from paddle_geometric.typing import EdgeType, NodeType + + +class Explainer: + r"""An explainer class for instance-level explanations of Graph Neural + Networks. + + Args: + model (torch.nn.Module): The model to explain. + algorithm (ExplainerAlgorithm): The explanation algorithm. + explanation_type (ExplanationType or str): The type of explanation to + compute. The possible values are: + + - :obj:`"model"`: Explains the model prediction. + + - :obj:`"phenomenon"`: Explains the phenomenon that the model + is trying to predict. + + In practice, this means that the explanation algorithm will either + compute their losses with respect to the model output + (:obj:`"model"`) or the target output (:obj:`"phenomenon"`). + model_config (ModelConfig): The model configuration. + See :class:`~paddle_geometric.explain.config.ModelConfig` for + available options. (default: :obj:`None`) + node_mask_type (MaskType or str, optional): The type of mask to apply + on nodes. The possible values are (default: :obj:`None`): + + - :obj:`None`: Will not apply any mask on nodes. + + - :obj:`"object"`: Will mask each node. + + - :obj:`"common_attributes"`: Will mask each feature. + + - :obj:`"attributes"`: Will mask each feature across all nodes. + + edge_mask_type (MaskType or str, optional): The type of mask to apply + on edges. Has the sample possible values as :obj:`node_mask_type`. + (default: :obj:`None`) + threshold_config (ThresholdConfig, optional): The threshold + configuration. + See :class:`~paddle_geometric.explain.config.ThresholdConfig` for + available options. (default: :obj:`None`) + """ + def __init__( + self, + model: paddle.nn.Layer, + algorithm: ExplainerAlgorithm, + explanation_type: Union[ExplanationType, str], + model_config: Union[ModelConfig, Dict[str, Any]], + node_mask_type: Optional[Union[MaskType, str]] = None, + edge_mask_type: Optional[Union[MaskType, str]] = None, + threshold_config: Optional[ThresholdConfig] = None, + ): + explainer_config = ExplainerConfig( + explanation_type=explanation_type, + node_mask_type=node_mask_type, + edge_mask_type=edge_mask_type, + ) + + self.model = model + self.algorithm = algorithm + + self.explanation_type = explainer_config.explanation_type + self.model_config = ModelConfig.cast(model_config) + self.node_mask_type = explainer_config.node_mask_type + self.edge_mask_type = explainer_config.edge_mask_type + self.threshold_config = ThresholdConfig.cast(threshold_config) + + self.algorithm.connect(explainer_config, self.model_config) + + @paddle.no_grad() + def get_prediction(self, *args, **kwargs) -> Tensor: + r"""Returns the prediction of the model on the input graph. + + If the model mode is :obj:`"regression"`, the prediction is returned as + a scalar value. + If the model mode is :obj:`"multiclass_classification"` or + :obj:`"binary_classification"`, the prediction is returned as the + predicted class label. + + Args: + *args: Arguments passed to the model. + **kwargs (optional): Additional keyword arguments passed to the + model. + """ + training = self.model.training + self.model.eval() + + with paddle.no_grad(): + out = self.model(*args, **kwargs) + + self.model.train(training) + + return out + + def get_masked_prediction( + self, + x: Union[Tensor, Dict[NodeType, Tensor]], + edge_index: Union[Tensor, Dict[EdgeType, Tensor]], + node_mask: Optional[Union[Tensor, Dict[NodeType, Tensor]]] = None, + edge_mask: Optional[Union[Tensor, Dict[EdgeType, Tensor]]] = None, + **kwargs, + ) -> Tensor: + r"""Returns the prediction of the model on the input graph with node + and edge masks applied. + """ + if isinstance(x, Tensor) and node_mask is not None: + x = node_mask * x + elif isinstance(x, dict) and node_mask is not None: + x = {key: value * node_mask[key] for key, value in x.items()} + + if isinstance(edge_mask, Tensor): + set_masks(self.model, edge_mask, edge_index, apply_sigmoid=False) + elif isinstance(edge_mask, dict): + set_hetero_masks(self.model, edge_mask, edge_index, + apply_sigmoid=False) + + out = self.get_prediction(x, edge_index, **kwargs) + clear_masks(self.model) + return out + + def __call__( + self, + x: Union[Tensor, Dict[NodeType, Tensor]], + edge_index: Union[Tensor, Dict[EdgeType, Tensor]], + *, + target: Optional[Tensor] = None, + index: Optional[Union[int, Tensor]] = None, + **kwargs, + ) -> Union[Explanation, HeteroExplanation]: + r"""Computes the explanation of the GNN for the given inputs and + target. + + .. note:: + + If you get an error message like "Trying to backward through the + graph a second time", make sure that the target you provided + was computed with :meth:`torch.no_grad`. + + Args: + x (Union[torch.Tensor, Dict[NodeType, torch.Tensor]]): The input + node features of a homogeneous or heterogeneous graph. + edge_index (Union[torch.Tensor, Dict[NodeType, torch.Tensor]]): The + input edge indices of a homogeneous or heterogeneous graph. + target (torch.Tensor): The target of the model. + If the explanation type is :obj:`"phenomenon"`, the target has + to be provided. + If the explanation type is :obj:`"model"`, the target should be + set to :obj:`None` and will get automatically inferred. For + classification tasks, the target needs to contain the class + labels. (default: :obj:`None`) + index (Union[int, Tensor], optional): The indices in the + first-dimension of the model output to explain. + Can be a single index or a tensor of indices. + If set to :obj:`None`, all model outputs will be explained. + (default: :obj:`None`) + **kwargs: additional arguments to pass to the GNN. + """ + # Choose the `target` depending on the explanation type: + prediction: Optional[Tensor] = None + if self.explanation_type == ExplanationType.phenomenon: + if target is None: + raise ValueError( + f"The 'target' has to be provided for the explanation " + f"type '{self.explanation_type.value}'") + elif self.explanation_type == ExplanationType.model: + if target is not None: + warnings.warn( + f"The 'target' should not be provided for the explanation " + f"type '{self.explanation_type.value}'") + prediction = self.get_prediction(x, edge_index, **kwargs) + target = self.get_target(prediction) + + if isinstance(index, int): + index = paddle.to_tensor([index]) + + training = self.model.training + self.model.eval() + + explanation = self.algorithm( + self.model, + x, + edge_index, + target=target, + index=index, + **kwargs, + ) + + self.model.train() + + # Add explainer objectives to the `Explanation` object: + explanation._model_config = self.model_config + explanation.prediction = prediction + explanation.target = target + explanation.index = index + + # Add model inputs to the `Explanation` object: + if isinstance(explanation, Explanation): + explanation._model_args = list(kwargs.keys()) + explanation.x = x + explanation.edge_index = edge_index + + for key, arg in kwargs.items(): # Add remaining `kwargs`: + explanation[key] = arg + + elif isinstance(explanation, HeteroExplanation): + # TODO Add `explanation._model_args` + + assert isinstance(x, dict) + explanation.set_value_dict('x', x) + + assert isinstance(edge_index, dict) + explanation.set_value_dict('edge_index', edge_index) + + for key, arg in kwargs.items(): # Add remaining `kwargs`: + if isinstance(arg, dict): + # Keyword arguments are likely named `{attr_name}_dict` + # while we only want to assign the `{attr_name}` to the + # `HeteroExplanation` object: + key = key[:-5] if key.endswith('_dict') else key + explanation.set_value_dict(key, arg) + else: + explanation[key] = arg + + explanation.validate_masks() + return explanation.threshold(self.threshold_config) + + def get_target(self, prediction: Tensor) -> Tensor: + r"""Returns the target of the model from a given prediction. + + If the model mode is of type :obj:`"regression"`, the prediction is + returned as it is. + If the model mode is of type :obj:`"multiclass_classification"` or + :obj:`"binary_classification"`, the prediction is returned as the + predicted class label. + """ + if self.model_config.mode == ModelMode.binary_classification: + # TODO: Allow customization of the thresholds used below. + if self.model_config.return_type == ModelReturnType.raw: + return (prediction > 0).long().view(-1) + if self.model_config.return_type == ModelReturnType.probs: + return (prediction > 0.5).long().view(-1) + assert False + + if self.model_config.mode == ModelMode.multiclass_classification: + return prediction.argmax(dim=-1) + + return prediction diff --git a/jointContribution/mattergen/paddle_geometric/explain/explanation.py b/jointContribution/mattergen/paddle_geometric/explain/explanation.py new file mode 100644 index 00000000..0fc12c68 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/explanation.py @@ -0,0 +1,407 @@ +import copy +from typing import Dict, List, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data.data import Data, warn_or_raise +from paddle_geometric.data.hetero_data import HeteroData +from paddle_geometric.explain.config import ThresholdConfig, ThresholdType +from paddle_geometric.typing import EdgeType, NodeType +from paddle_geometric.visualization import visualize_graph + + +class ExplanationMixin: + @property + def available_explanations(self) -> List[str]: + """Returns the available explanation masks.""" + return [key for key in self.keys() if key.endswith('_mask')] + + def validate_masks(self, raise_on_error: bool = True) -> bool: + r"""Validates the correctness of the :class:`Explanation` masks.""" + status = True + + for store in self.node_stores: + if 'node_mask' not in store: + continue + + if store.node_mask.dim() != 2: + status = False + warn_or_raise( + f"Expected a 'node_mask' with two dimensions (got " + f"{store.node_mask.dim()} dimensions)", raise_on_error) + + if store.node_mask.shape[0] not in {1, store.num_nodes}: + status = False + warn_or_raise( + f"Expected a 'node_mask' with {store.num_nodes} nodes " + f"(got {store.node_mask.shape[0]} nodes)", raise_on_error) + + if 'x' in store: + num_features = store.x.shape[-1] + else: + num_features = store.node_mask.shape[-1] + + if store.node_mask.shape[1] not in {1, num_features}: + status = False + warn_or_raise( + f"Expected a 'node_mask' with {num_features} features (" + f"got {store.node_mask.shape[1]} features)", raise_on_error) + + for store in self.edge_stores: + if 'edge_mask' not in store: + continue + + if store.edge_mask.dim() != 1: + status = False + warn_or_raise( + f"Expected an 'edge_mask' with one dimension (got " + f"{store.edge_mask.dim()} dimensions)", raise_on_error) + + if store.edge_mask.shape[0] != store.num_edges: + status = False + warn_or_raise( + f"Expected an 'edge_mask' with {store.num_edges} edges " + f"(got {store.edge_mask.shape[0]} edges)", raise_on_error) + + return status + + def _threshold_mask( + self, + mask: Optional[Tensor], + threshold_config: ThresholdConfig, + ) -> Optional[Tensor]: + + if mask is None: + return None + + if threshold_config.type == ThresholdType.hard: + return (mask > threshold_config.value).float() + + if threshold_config.type in [ + ThresholdType.topk, + ThresholdType.topk_hard, + ]: + if threshold_config.value >= mask.numel(): + if threshold_config.type == ThresholdType.topk: + return mask + else: + return paddle.ones_like(mask) + + value, index = paddle.topk( + mask.flatten(), + k=threshold_config.value, + ) + + out = paddle.zeros_like(mask.flatten()) + if threshold_config.type == ThresholdType.topk: + out.scatter_(index, value) + else: + out.scatter_(index, 1.0) + return out.reshape(mask.shape) + + assert False + + def threshold( + self, + *args, + **kwargs, + ) -> Union['Explanation', 'HeteroExplanation']: + """Thresholds the explanation masks according to the thresholding + method. + + Args: + *args: Arguments passed to :class:`ThresholdConfig`. + **kwargs: Keyword arguments passed to :class:`ThresholdConfig`. + """ + threshold_config = ThresholdConfig.cast(*args, **kwargs) + + if threshold_config is None: + return self + + # Avoid modification of the original explanation: + out = copy.copy(self) + + for store in out.node_stores: + store.node_mask = self._threshold_mask(store.get('node_mask'), + threshold_config) + + for store in out.edge_stores: + store.edge_mask = self._threshold_mask(store.get('edge_mask'), + threshold_config) + + return out + + +class Explanation(Data, ExplanationMixin): + r"""Holds all the obtained explanations of a homogeneous graph. + + The explanation object is a :obj:`~paddle_geometric.data.Data` object and + can hold node attributions and edge attributions. + It can also hold the original graph if needed. + + Args: + node_mask (Tensor, optional): Node-level mask with shape + :obj:`[num_nodes, 1]`, :obj:`[1, num_features]` or + :obj:`[num_nodes, num_features]`. (default: :obj:`None`) + edge_mask (Tensor, optional): Edge-level mask with shape + :obj:`[num_edges]`. (default: :obj:`None`) + **kwargs (optional): Additional attributes. + """ + def validate(self, raise_on_error: bool = True) -> bool: + r"""Validates the correctness of the :class:`Explanation` object.""" + status = super().validate(raise_on_error) + status &= self.validate_masks(raise_on_error) + return status + + def get_explanation_subgraph(self) -> 'Explanation': + r"""Returns the induced subgraph, in which all nodes and edges with + zero attribution are masked out. + """ + node_mask = self.get('node_mask') + if node_mask is not None: + node_mask = node_mask.sum(dim=-1) > 0 + edge_mask = self.get('edge_mask') + if edge_mask is not None: + edge_mask = edge_mask > 0 + return self._apply_masks(node_mask, edge_mask) + + def get_complement_subgraph(self) -> 'Explanation': + r"""Returns the induced subgraph, in which all nodes and edges with any + attribution are masked out. + """ + node_mask = self.get('node_mask') + if node_mask is not None: + node_mask = node_mask.sum(dim=-1) == 0 + edge_mask = self.get('edge_mask') + if edge_mask is not None: + edge_mask = edge_mask == 0 + return self._apply_masks(node_mask, edge_mask) + + def _apply_masks( + self, + node_mask: Optional[Tensor] = None, + edge_mask: Optional[Tensor] = None, + ) -> 'Explanation': + out = copy.copy(self) + + if edge_mask is not None: + for key, value in self.items(): + if key == 'edge_index': + out.edge_index = value[:, edge_mask] + elif self.is_edge_attr(key): + out[key] = value[edge_mask] + + if node_mask is not None: + out = out.subgraph(node_mask) + + return out + + def visualize_feature_importance( + self, + path: Optional[str] = None, + feat_labels: Optional[List[str]] = None, + top_k: Optional[int] = None, + ): + r"""Creates a bar plot of the node feature importances by summing up + the node mask across all nodes. + + Args: + path (str, optional): The path to where the plot is saved. + If set to :obj:`None`, will visualize the plot on-the-fly. + (default: :obj:`None`) + feat_labels (List[str], optional): The labels of features. + (default :obj:`None`) + top_k (int, optional): Top k features to plot. If :obj:`None` + plots all features. (default: :obj:`None`) + """ + node_mask = self.get('node_mask') + if node_mask is None: + raise ValueError(f"The attribute 'node_mask' is not available " + f"in '{self.__class__.__name__}' " + f"(got {self.available_explanations})") + if node_mask.dim() != 2 or node_mask.shape[1] <= 1: + raise ValueError(f"Cannot compute feature importance for " + f"object-level 'node_mask' " + f"(got shape {node_mask.size()})") + + if feat_labels is None: + feat_labels = range(node_mask.shape[1]) + + score = node_mask.sum(dim=0) + + return _visualize_score(score, feat_labels, path, top_k) + + def visualize_graph( + self, + path: Optional[str] = None, + backend: Optional[str] = None, + node_labels: Optional[List[str]] = None, + ) -> None: + r"""Visualizes the explanation graph with edge opacity corresponding to + edge importance. + + Args: + path (str, optional): The path to where the plot is saved. + If set to :obj:`None`, will visualize the plot on-the-fly. + (default: :obj:`None`) + backend (str, optional): The graph drawing backend to use for + visualization (:obj:`"graphviz"`, :obj:`"networkx"`). + If set to :obj:`None`, will use the most appropriate + visualization backend based on available system packages. + (default: :obj:`None`) + node_labels (list[str], optional): The labels/IDs of nodes. + (default: :obj:`None`) + """ + edge_mask = self.get('edge_mask') + if edge_mask is None: + raise ValueError(f"The attribute 'edge_mask' is not available " + f"in '{self.__class__.__name__}' " + f"(got {self.available_explanations})") + visualize_graph(self.edge_index, edge_mask, path, backend, node_labels) + + +class HeteroExplanation(HeteroData, ExplanationMixin): + r"""Holds all the obtained explanations of a heterogeneous graph. + + The explanation object is a :obj:`~paddle_geometric.data.HeteroData` object + and can hold node attributions and edge attributions. + It can also hold the original graph if needed. + """ + def validate(self, raise_on_error: bool = True) -> bool: + r"""Validates the correctness of the :class:`Explanation` object.""" + status = super().validate(raise_on_error) + status &= self.validate_masks(raise_on_error) + return status + + def get_explanation_subgraph(self) -> 'HeteroExplanation': + r"""Returns the induced subgraph, in which all nodes and edges with + zero attribution are masked out. + """ + return self._apply_masks( + node_mask_dict={ + key: mask.sum(dim=-1) > 0 + for key, mask in self.collect('node_mask', True).items() + }, + edge_mask_dict={ + key: mask > 0 + for key, mask in self.collect('edge_mask', True).items() + }, + ) + + def get_complement_subgraph(self) -> 'HeteroExplanation': + r"""Returns the induced subgraph, in which all nodes and edges with any + attribution are masked out. + """ + return self._apply_masks( + node_mask_dict={ + key: mask.sum(dim=-1) == 0 + for key, mask in self.collect('node_mask', True).items() + }, + edge_mask_dict={ + key: mask == 0 + for key, mask in self.collect('edge_mask', True).items() + }, + ) + + def _apply_masks( + self, + node_mask_dict: Dict[NodeType, Tensor], + edge_mask_dict: Dict[EdgeType, Tensor], + ) -> 'HeteroExplanation': + out = copy.copy(self) + + for edge_type, edge_mask in edge_mask_dict.items(): + for key, value in self[edge_type].items(): + if key == 'edge_index': + out[edge_type].edge_index = value[:, edge_mask] + elif self[edge_type].is_edge_attr(key): + out[edge_type][key] = value[edge_mask] + + return out.subgraph(node_mask_dict) + + def visualize_feature_importance( + self, + path: Optional[str] = None, + feat_labels: Optional[Dict[NodeType, List[str]]] = None, + top_k: Optional[int] = None, + ): + r"""Creates a bar plot of the node feature importances by summing up + node masks across all nodes for each node type. + + Args: + path (str, optional): The path to where the plot is saved. + If set to :obj:`None`, will visualize the plot on-the-fly. + (default: :obj:`None`) + feat_labels (Dict[NodeType, List[str]], optional): The labels of + features for each node type. (default :obj:`None`) + top_k (int, optional): Top k features to plot. If :obj:`None` + plots all features. (default: :obj:`None`) + """ + node_mask_dict = self.node_mask_dict + for node_mask in node_mask_dict.values(): + if node_mask.dim() != 2: + raise ValueError(f"Cannot compute feature importance for " + f"object-level 'node_mask' " + f"(got shape {node_mask.size()})") + + if feat_labels is None: + feat_labels = {} + for node_type, node_mask in node_mask_dict.items(): + feat_labels[node_type] = range(node_mask.shape[1]) + + score = paddle.concat( + [paddle.sum(node_mask, axis=0) for node_mask in node_mask_dict.values()], + axis=0) + + all_feat_labels = [] + for node_type in node_mask_dict.keys(): + all_feat_labels += [ + f'{node_type}#{label}' for label in feat_labels[node_type] + ] + + return _visualize_score(score, all_feat_labels, path, top_k) + + +def _visualize_score( + score: paddle.Tensor, + labels: List[str], + path: Optional[str] = None, + top_k: Optional[int] = None, +): + import matplotlib.pyplot as plt + import pandas as pd + + if len(labels) != score.numel(): + raise ValueError(f"The number of labels (got {len(labels)}) must " + f"match the number of scores (got {score.numel()})") + + score = score.cpu().numpy() + + df = pd.DataFrame({'score': score}, index=labels) + df = df.sort_values('score', ascending=False) + df = df.round(decimals=3) + + if top_k is not None: + df = df.head(top_k) + title = f"Feature importance for top {len(df)} features" + else: + title = f"Feature importance for {len(df)} features" + + ax = df.plot( + kind='barh', + figsize=(10, 7), + title=title, + ylabel='Feature label', + xlim=[0, float(df['score'].max()) + 0.3], + legend=False, + ) + plt.gca().invert_yaxis() + ax.bar_label(container=ax.containers[0], label_type='edge') + + if path is not None: + plt.savefig(path) + else: + plt.show() + + plt.close() diff --git a/jointContribution/mattergen/paddle_geometric/explain/metric/__init__.py b/jointContribution/mattergen/paddle_geometric/explain/metric/__init__.py new file mode 100644 index 00000000..9bcde9a4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/metric/__init__.py @@ -0,0 +1,11 @@ +from .basic import groundtruth_metrics +from .fidelity import fidelity, characterization_score, fidelity_curve_auc +from .faithfulness import unfaithfulness + +__all__ = classes = [ + 'groundtruth_metrics', + 'fidelity', + 'characterization_score', + 'fidelity_curve_auc', + 'unfaithfulness', +] diff --git a/jointContribution/mattergen/paddle_geometric/explain/metric/basic.py b/jointContribution/mattergen/paddle_geometric/explain/metric/basic.py new file mode 100644 index 00000000..f21e74a7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/metric/basic.py @@ -0,0 +1,56 @@ +from typing import List, Optional, Tuple, Union + +from paddle import Tensor + +METRICS = ['accuracy', 'recall', 'precision', 'f1_score', 'auroc'] + + +def groundtruth_metrics( + pred_mask: Tensor, + target_mask: Tensor, + metrics: Optional[Union[str, List[str]]] = None, + threshold: float = 0.5, +) -> Union[float, Tuple[float, ...]]: + r"""Compares and evaluates an explanation mask with the ground-truth + explanation mask. + + Args: + pred_mask (torch.Tensor): The prediction mask to evaluate. + target_mask (torch.Tensor): The ground-truth target mask. + metrics (str or List[str], optional): The metrics to return + (:obj:`"accuracy"`, :obj:`"recall"`, :obj:`"precision"`, + :obj:`"f1_score"`, :obj:`"auroc"`). (default: :obj:`["accuracy", + "recall", "precision", "f1_score", "auroc"]`) + threshold (float, optional): The threshold value to perform hard + thresholding of :obj:`mask` and :obj:`groundtruth`. + (default: :obj:`0.5`) + """ + import paddlemetrics + + if metrics is None: + metrics = METRICS + + if isinstance(metrics, str): + metrics = [metrics] + + if not isinstance(metrics, (tuple, list)): + raise ValueError(f"Expected metrics to be a string or a list of " + f"strings (got {type(metrics)})") + + pred_mask = pred_mask.view(-1) + target_mask = (target_mask >= threshold).view(-1) + + outs = [] + for metric in metrics: + if metric not in METRICS: + raise ValueError(f"Encountered invalid metric {metric}") + + fn = getattr(torchmetrics.functional, metric) + if metric in {'auroc'}: + out = fn(pred_mask, target_mask, 'binary') + else: + out = fn(pred_mask, target_mask, 'binary', threshold) + + outs.append(float(out)) + + return tuple(outs) if len(outs) > 1 else outs[0] diff --git a/jointContribution/mattergen/paddle_geometric/explain/metric/faithfulness.py b/jointContribution/mattergen/paddle_geometric/explain/metric/faithfulness.py new file mode 100644 index 00000000..1a197e2e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/metric/faithfulness.py @@ -0,0 +1,73 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F + +from paddle_geometric.explain import Explainer, Explanation +from paddle_geometric.explain.config import MaskType, ModelMode, ModelReturnType + + +def unfaithfulness( + explainer: Explainer, + explanation: Explanation, + top_k: Optional[int] = None, +) -> float: + r"""Evaluates how faithful an :class:`~paddle_geometric.explain.Explanation` + is to an underyling GNN predictor, as described in the + `"Evaluating Explainability for Graph Neural Networks" + `_ paper. + + In particular, the graph explanation unfaithfulness metric is defined as + + .. math:: + \textrm{GEF}(y, \hat{y}) = 1 - \exp(- \textrm{KL}(y || \hat{y})) + + where :math:`y` refers to the prediction probability vector obtained from + the original graph, and :math:`\hat{y}` refers to the prediction + probability vector obtained from the masked subgraph. + Finally, the Kullback-Leibler (KL) divergence score quantifies the distance + between the two probability distributions. + + Args: + explainer (Explainer): The explainer to evaluate. + explanation (Explanation): The explanation to evaluate. + top_k (int, optional): If set, will only keep the original values of + the top-:math:`k` node features identified by an explanation. + If set to :obj:`None`, will use :obj:`explanation.node_mask` as it + is for masking node features. (default: :obj:`None`) + """ + if explainer.model_config.mode == ModelMode.regression: + raise ValueError("Fidelity not defined for 'regression' models") + + if top_k is not None and explainer.node_mask_type == MaskType.object: + raise ValueError("Cannot apply top-k feature selection based on a " + "node mask of type 'object'") + + node_mask = explanation.get('node_mask') + edge_mask = explanation.get('edge_mask') + x, edge_index = explanation.x, explanation.edge_index + kwargs = {key: explanation[key] for key in explanation._model_args} + + y = explanation.get('prediction') + if y is None: # == ExplanationType.phenomenon + y = explainer.get_prediction(x, edge_index, **kwargs) + + if node_mask is not None and top_k is not None: + feat_importance = node_mask.sum(axis=0) + _, top_k_index = paddle.topk(feat_importance, top_k) + node_mask = paddle.zeros_like(node_mask) + node_mask[:, top_k_index] = 1.0 + + y_hat = explainer.get_masked_prediction(x, edge_index, node_mask, + edge_mask, **kwargs) + + if explanation.get('index') is not None: + y, y_hat = y[explanation['index']], y_hat[explanation['index']] + + if explainer.model_config.return_type == ModelReturnType.raw: + y, y_hat = F.softmax(y, axis=-1), F.softmax(y_hat, axis=-1) + elif explainer.model_config.return_type == ModelReturnType.log_probs: + y, y_hat = paddle.exp(y), paddle.exp(y_hat) + + kl_div = F.kl_div(paddle.log(y), y_hat, reduction='batchmean') + return 1 - float(paddle.exp(-kl_div)) diff --git a/jointContribution/mattergen/paddle_geometric/explain/metric/fidelity.py b/jointContribution/mattergen/paddle_geometric/explain/metric/fidelity.py new file mode 100644 index 00000000..27e8f665 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/explain/metric/fidelity.py @@ -0,0 +1,167 @@ +from typing import Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.explain import Explainer, Explanation +from paddle_geometric.explain.config import ExplanationType, ModelMode + + +def fidelity( + explainer: Explainer, + explanation: Explanation, +) -> Tuple[float, float]: + r"""Evaluates the fidelity of an + :class:`~paddle_geometric.explain.Explainer` given an + :class:`~paddle_geometric.explain.Explanation`, as described in the + `"GraphFramEx: Towards Systematic Evaluation of Explainability Methods for + Graph Neural Networks" `_ paper. + + Fidelity evaluates the contribution of the produced explanatory subgraph + to the initial prediction, either by giving only the subgraph to the model + (fidelity-) or by removing it from the entire graph (fidelity+). + The fidelity scores capture how good an explainable model reproduces the + natural phenomenon or the GNN model logic. + + For **phenomenon** explanations, the fidelity scores are given by: + + .. math:: + \textrm{fid}_{+} &= \frac{1}{N} \sum_{i = 1}^N + \| \mathbb{1}(\hat{y}_i = y_i) - + \mathbb{1}( \hat{y}_i^{G_{C \setminus S}} = y_i) \| + + \textrm{fid}_{-} &= \frac{1}{N} \sum_{i = 1}^N + \| \mathbb{1}(\hat{y}_i = y_i) - + \mathbb{1}( \hat{y}_i^{G_S} = y_i) \| + + For **model** explanations, the fidelity scores are given by: + + .. math:: + \textrm{fid}_{+} &= 1 - \frac{1}{N} \sum_{i = 1}^N + \mathbb{1}( \hat{y}_i^{G_{C \setminus S}} = \hat{y}_i) + + \textrm{fid}_{-} &= 1 - \frac{1}{N} \sum_{i = 1}^N + \mathbb{1}( \hat{y}_i^{G_S} = \hat{y}_i) + + Args: + explainer (Explainer): The explainer to evaluate. + explanation (Explanation): The explanation to evaluate. + """ + if explainer.model_config.mode == ModelMode.regression: + raise ValueError("Fidelity not defined for 'regression' models") + + node_mask = explanation.get('node_mask') + edge_mask = explanation.get('edge_mask') + kwargs = {key: explanation[key] for key in explanation._model_args} + + y = explanation.target + if explainer.explanation_type == ExplanationType.phenomenon: + y_hat = explainer.get_prediction( + explanation.x, + explanation.edge_index, + **kwargs, + ) + y_hat = explainer.get_target(y_hat) + + explain_y_hat = explainer.get_masked_prediction( + explanation.x, + explanation.edge_index, + node_mask, + edge_mask, + **kwargs, + ) + explain_y_hat = explainer.get_target(explain_y_hat) + + complement_y_hat = explainer.get_masked_prediction( + explanation.x, + explanation.edge_index, + 1. - node_mask if node_mask is not None else None, + 1. - edge_mask if edge_mask is not None else None, + **kwargs, + ) + complement_y_hat = explainer.get_target(complement_y_hat) + + if explanation.get('index') is not None: + y = y[explanation.index] + if explainer.explanation_type == ExplanationType.phenomenon: + y_hat = y_hat[explanation.index] + explain_y_hat = explain_y_hat[explanation.index] + complement_y_hat = complement_y_hat[explanation.index] + + if explainer.explanation_type == ExplanationType.model: + pos_fidelity = 1. - (complement_y_hat == y).float().mean() + neg_fidelity = 1. - (explain_y_hat == y).float().mean() + else: + pos_fidelity = ((y_hat == y).float() - + (complement_y_hat == y).float()).abs().mean() + neg_fidelity = ((y_hat == y).float() - + (explain_y_hat == y).float()).abs().mean() + + return float(pos_fidelity), float(neg_fidelity) + + +def characterization_score( + pos_fidelity: Tensor, + neg_fidelity: Tensor, + pos_weight: float = 0.5, + neg_weight: float = 0.5, +) -> Tensor: + r"""Returns the componentwise characterization score as described in the + `"GraphFramEx: Towards Systematic Evaluation of Explainability Methods for + Graph Neural Networks" `_ paper. + + .. math:: + \textrm{charact} = \frac{w_{+} + w_{-}}{\frac{w_{+}}{\textrm{fid}_{+}} + + \frac{w_{-}}{1 - \textrm{fid}_{-}}} + + Args: + pos_fidelity (torch.Tensor): The positive fidelity + :math:`\textrm{fid}_{+}`. + neg_fidelity (torch.Tensor): The negative fidelity + :math:`\textrm{fid}_{-}`. + pos_weight (float, optional): The weight :math:`w_{+}` for + :math:`\textrm{fid}_{+}`. (default: :obj:`0.5`) + neg_weight (float, optional): The weight :math:`w_{-}` for + :math:`\textrm{fid}_{-}`. (default: :obj:`0.5`) + """ + if (pos_weight + neg_weight) != 1.0: + raise ValueError(f"The weights need to sum up to 1 " + f"(got {pos_weight} and {neg_weight})") + + denom = (pos_weight / pos_fidelity) + (neg_weight / (1. - neg_fidelity)) + return 1. / denom + + +def fidelity_curve_auc( + pos_fidelity: Tensor, + neg_fidelity: Tensor, + x: Tensor, +) -> Tensor: + r"""Returns the AUC for the fidelity curve as described in the + `"GraphFramEx: Towards Systematic Evaluation of Explainability Methods for + Graph Neural Networks" `_ paper. + + More precisely, returns the AUC of + + .. math:: + f(x) = \frac{\textrm{fid}_{+}}{1 - \textrm{fid}_{-}} + + Args: + pos_fidelity (torch.Tensor): The positive fidelity + :math:`\textrm{fid}_{+}`. + neg_fidelity (torch.Tensor): The negative fidelity + :math:`\textrm{fid}_{-}`. + x (torch.Tensor): Tensor containing the points on the :math:`x`-axis. + Needs to be sorted in ascending order. + """ + if paddle.any(neg_fidelity == 1): + raise ValueError("There exists negative fidelity values containing 1, " + "leading to a division by zero") + + y = pos_fidelity / (1. - neg_fidelity) + return auc(x, y) + +def auc(x: paddle.Tensor, y: paddle.Tensor) -> paddle.Tensor: + if paddle.any(paddle.diff(x) < 0): + raise ValueError("'x' must be given in ascending order") + return paddle.trapezoid(y, x) \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/__init__.py new file mode 100644 index 00000000..f70d8e8e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/__init__.py @@ -0,0 +1,61 @@ +from .contrib import * # noqa +from .models import * # noqa +from .utils import * # noqa +from .checkpoint import load_ckpt, save_ckpt, remove_ckpt, clean_ckpt +from .cmd_args import parse_args +from .config import (cfg, set_cfg, load_cfg, dump_cfg, set_run_dir, + set_out_dir, get_fname) +from .init import init_weights +from .loader import create_loader +from .logger import set_printing, create_logger +from .loss import compute_loss +from .model_builder import create_model +from .optim import create_optimizer, create_scheduler +from .train import train +from .register import (register_base, register_act, register_node_encoder, + register_edge_encoder, register_stage, register_head, + register_layer, register_pooling, register_network, + register_config, register_dataset, register_loader, + register_optimizer, register_scheduler, register_loss, + register_train, register_metric) + +__all__ = classes = [ + 'load_ckpt', + 'save_ckpt', + 'remove_ckpt', + 'clean_ckpt', + 'parse_args', + 'cfg', + 'set_cfg', + 'load_cfg', + 'dump_cfg', + 'set_run_dir', + 'set_out_dir', + 'get_fname', + 'init_weights', + 'create_loader', + 'set_printing', + 'create_logger', + 'compute_loss', + 'create_model', + 'create_optimizer', + 'create_scheduler', + 'train', + 'register_base', + 'register_act', + 'register_node_encoder', + 'register_edge_encoder', + 'register_stage', + 'register_head', + 'register_layer', + 'register_pooling', + 'register_network', + 'register_config', + 'register_dataset', + 'register_loader', + 'register_optimizer', + 'register_scheduler', + 'register_loss', + 'register_train', + 'register_metric', +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/benchmark.py b/jointContribution/mattergen/paddle_geometric/graphgym/benchmark.py new file mode 100644 index 00000000..db637263 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/benchmark.py @@ -0,0 +1,11 @@ +# Do not change; required for benchmarking + +import paddle_geometric_benchmark.torchprof_local as torchprof # noqa +from pytorch_memlab import LineProfiler # noqa +from paddle_geometric_benchmark.utils import count_parameters # noqa +from paddle_geometric_benchmark.utils import get_gpu_memory_nvdia # noqa +from paddle_geometric_benchmark.utils import get_memory_status # noqa +from paddle_geometric_benchmark.utils import get_model_size # noqa + +global_line_profiler = LineProfiler() +global_line_profiler.enable() diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/checkpoint.py b/jointContribution/mattergen/paddle_geometric/graphgym/checkpoint.py new file mode 100644 index 00000000..29c2c70b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/checkpoint.py @@ -0,0 +1,88 @@ +import glob +import os +import os.path as osp +from typing import Any, Dict, List, Optional, Union + +import paddle + +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.io import fs + +MODEL_STATE = 'model_state' +OPTIMIZER_STATE = 'optimizer_state' +SCHEDULER_STATE = 'scheduler_state' + + +def load_ckpt( + model: paddle.nn.Layer, + optimizer: Optional[paddle.optimizer.Optimizer] = None, + scheduler: Optional[Any] = None, + epoch: int = -1, +) -> int: + """Loads the model checkpoint at a given epoch.""" + epoch = get_ckpt_epoch(epoch) + path = get_ckpt_path(epoch) + + if not osp.exists(path): + return 0 + + ckpt = fs.load(path) # Assuming `fs.load` is adjusted for PaddlePaddle + model.set_state_dict(ckpt[MODEL_STATE]) + if optimizer is not None and OPTIMIZER_STATE in ckpt: + optimizer.set_state_dict(ckpt[OPTIMIZER_STATE]) + if scheduler is not None and SCHEDULER_STATE in ckpt: + scheduler.set_state_dict(ckpt[SCHEDULER_STATE]) + + return epoch + 1 + + +def save_ckpt( + model: paddle.nn.Layer, + optimizer: Optional[paddle.optimizer.Optimizer] = None, + scheduler: Optional[Any] = None, + epoch: int = 0, +): + """Saves the model checkpoint at a given epoch.""" + ckpt: Dict[str, Any] = {} + ckpt[MODEL_STATE] = model.state_dict() + if optimizer is not None: + ckpt[OPTIMIZER_STATE] = optimizer.state_dict() + if scheduler is not None: + ckpt[SCHEDULER_STATE] = scheduler.state_dict() + + os.makedirs(get_ckpt_dir(), exist_ok=True) + paddle.save(ckpt, get_ckpt_path(get_ckpt_epoch(epoch))) + + +def remove_ckpt(epoch: int = -1): + """Removes the model checkpoint at a given epoch.""" + os.remove(get_ckpt_path(get_ckpt_epoch(epoch))) + + +def clean_ckpt(): + """Removes all but the last model checkpoint.""" + for epoch in get_ckpt_epochs()[:-1]: + os.remove(get_ckpt_path(epoch)) + + +############################################################################### + + +def get_ckpt_dir() -> str: + return osp.join(cfg.run_dir, 'ckpt') + + +def get_ckpt_path(epoch: Union[int, str]) -> str: + return osp.join(get_ckpt_dir(), f'{epoch}.ckpt') + + +def get_ckpt_epochs() -> List[int]: + paths = glob.glob(get_ckpt_path('*')) + return sorted([int(osp.basename(path).split('.')[0]) for path in paths]) + + +def get_ckpt_epoch(epoch: int) -> int: + if epoch < 0: + epochs = get_ckpt_epochs() + epoch = epochs[epoch] if len(epochs) > 0 else 0 + return epoch diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/cmd_args.py b/jointContribution/mattergen/paddle_geometric/graphgym/cmd_args.py new file mode 100644 index 00000000..f86646c1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/cmd_args.py @@ -0,0 +1,17 @@ +import argparse + + +def parse_args() -> argparse.Namespace: + r"""Parses the command line arguments.""" + parser = argparse.ArgumentParser(description='GraphGym') + + parser.add_argument('--cfg', dest='cfg_file', type=str, required=True, + help='The configuration file path.') + parser.add_argument('--repeat', type=int, default=1, + help='The number of repeated jobs.') + parser.add_argument('--mark_done', action='store_true', + help='Mark yaml as done after a job has finished.') + parser.add_argument('opts', default=None, nargs=argparse.REMAINDER, + help='See graphgym/config.py for remaining options.') + + return parser.parse_args() diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/config.py b/jointContribution/mattergen/paddle_geometric/graphgym/config.py new file mode 100644 index 00000000..69032d84 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/config.py @@ -0,0 +1,581 @@ +import functools +import inspect +import logging +import os +import os.path as osp +import warnings +from collections.abc import Iterable +from dataclasses import asdict +from typing import Any + +import paddle_geometric.graphgym.register as register +from paddle_geometric.io import fs + +try: # Define global config object + from yacs.config import CfgNode as CN + cfg = CN() +except ImportError: + cfg = None + warnings.warn("Could not define global config object. Please install " + "'yacs' via 'pip install yacs' in order to use GraphGym") + + +def set_cfg(cfg): + r"""This function sets the default config value. + + 1) Note that for an experiment, only part of the arguments will be used + The remaining unused arguments won't affect anything. + So feel free to register any argument in graphgym.contrib.config + 2) We support *at most* two levels of configs, *e.g.*, + :obj:`cfg.dataset.name`. + + :return: Configuration use by the experiment. + """ + if cfg is None: + return cfg + + # ----------------------------------------------------------------------- # + # Basic options + # ----------------------------------------------------------------------- # + + # Set print destination: stdout / file / both + cfg.print = 'both' + + # Select device: 'cpu', 'cuda', 'auto' + cfg.accelerator = 'auto' + + # number of devices: eg. for 2 GPU set cfg.devices=2 + cfg.devices = 1 + + # Output directory + cfg.out_dir = 'results' + + # Config name (in out_dir) + cfg.cfg_dest = 'config.yaml' + + # Names of registered custom metric funcs to be used (use defaults if none) + cfg.custom_metrics = [] + + # Random seed + cfg.seed = 0 + + # Print rounding + cfg.round = 4 + + # Tensorboard support for each run + cfg.tensorboard_each_run = False + + # Tensorboard support for aggregated results + cfg.tensorboard_agg = True + + # Additional num of worker for data loading + cfg.num_workers = 0 + + # Max threads used by PyTorch + cfg.num_threads = 6 + + # The metric for selecting the best epoch for each run + cfg.metric_best = 'auto' + + # argmax or argmin in aggregating results + cfg.metric_agg = 'argmax' + + # If visualize embedding. + cfg.view_emb = False + + # If get GPU usage + cfg.gpu_mem = False + + # If do benchmark analysis + cfg.benchmark = False + + # ----------------------------------------------------------------------- # + # Globally shared variables: + # These variables will be set dynamically based on the input dataset + # Do not directly set them here or in .yaml files + # ----------------------------------------------------------------------- # + + cfg.share = CN() + + # Size of input dimension + cfg.share.dim_in = 1 + + # Size of out dimension, i.e., number of labels to be predicted + cfg.share.dim_out = 1 + + # Number of dataset splits: train/val/test + cfg.share.num_splits = 1 + + # ----------------------------------------------------------------------- # + # Dataset options + # ----------------------------------------------------------------------- # + cfg.dataset = CN() + + # Name of the dataset + cfg.dataset.name = 'Cora' + + # if PyG: look for it in Pytorch Geometric dataset + # if NetworkX/nx: load data in NetworkX format + cfg.dataset.format = 'PyG' + + # Dir to load the dataset. If the dataset is downloaded, this is the + # cache dir + cfg.dataset.dir = './datasets' + + # Task: node, edge, graph, link_pred + cfg.dataset.task = 'node' + + # Type of task: classification, regression, classification_binary + # classification_multi + cfg.dataset.task_type = 'classification' + + # Transductive / Inductive + # Graph classification is always inductive + cfg.dataset.transductive = True + + # Split ratio of dataset. Len=2: Train, Val. Len=3: Train, Val, Test + cfg.dataset.split = [0.8, 0.1, 0.1] + + # Whether to shuffle the graphs for splitting + cfg.dataset.shuffle_split = True + + # Whether random split or use custom split: random / custom + cfg.dataset.split_mode = 'random' + + # Whether to use an encoder for general attribute features + cfg.dataset.encoder = True + + # Name of general encoder + cfg.dataset.encoder_name = 'db' + + # If add batchnorm after general encoder + cfg.dataset.encoder_bn = True + + # Whether to use an encoder for the node features + cfg.dataset.node_encoder = False + + # Name of node encoder + cfg.dataset.node_encoder_name = 'Atom' + + # If add batchnorm after node encoder + cfg.dataset.node_encoder_bn = True + + # Whether to use an encoder for the edge features + cfg.dataset.edge_encoder = False + + # Name of edge encoder + cfg.dataset.edge_encoder_name = 'Bond' + + # If add batchnorm after edge encoder + cfg.dataset.edge_encoder_bn = True + + # Dimension of the encoded features. + # For now the node and edge encoding dimensions + # are the same. + cfg.dataset.encoder_dim = 128 + + # Dimension for edge feature. Updated by the real dim of the dataset + cfg.dataset.edge_dim = 128 + + # ============== Link/edge tasks only + + # all or disjoint + cfg.dataset.edge_train_mode = 'all' + + # Used in disjoint edge_train_mode. The proportion of edges used for + # message-passing + cfg.dataset.edge_message_ratio = 0.8 + + # The ratio of negative samples to positive samples + cfg.dataset.edge_negative_sampling_ratio = 1.0 + + # Whether resample disjoint when dataset.edge_train_mode is 'disjoint' + cfg.dataset.resample_disjoint = False + + # Whether resample negative edges at training time (link prediction only) + cfg.dataset.resample_negative = False + + # What transformation function is applied to the dataset + cfg.dataset.transform = 'none' + + # Whether cache the splitted dataset + # NOTE: it should be cautiouslly used, as cached dataset may not have + # exactly the same setting as the config file + cfg.dataset.cache_save = False + cfg.dataset.cache_load = False + + # Whether remove the original node features in the dataset + cfg.dataset.remove_feature = False + + # Simplify TU dataset for synthetic tasks + cfg.dataset.tu_simple = True + + # Convert to undirected graph (save 2*E edges) + cfg.dataset.to_undirected = False + + # dataset location: local, snowflake + cfg.dataset.location = 'local' + + # Define label: Table name + cfg.dataset.label_table = 'none' + + # Define label: Column name + cfg.dataset.label_column = 'none' + + # ----------------------------------------------------------------------- # + # Training options + # ----------------------------------------------------------------------- # + cfg.train = CN() + + # Total graph mini-batch size + cfg.train.batch_size = 16 + + # Sampling strategy for a train loader + cfg.train.sampler = 'full_batch' + + # Minibatch node + cfg.train.sample_node = False + + # Num of sampled node per graph + cfg.train.node_per_graph = 32 + + # Radius: same, extend. same: same as cfg.gnn.layers_mp, extend: layers+1 + cfg.train.radius = 'extend' + + # Evaluate model on test data every eval period epochs + cfg.train.eval_period = 10 + + # Option to skip training epoch evaluation + cfg.train.skip_train_eval = False + + # Save model checkpoint every checkpoint period epochs + cfg.train.ckpt_period = 100 + + # Enabling checkpoint, set False to disable and save I/O + cfg.train.enable_ckpt = True + + # Resume training from the latest checkpoint in the output directory + cfg.train.auto_resume = False + + # The epoch to resume. -1 means resume the latest epoch. + cfg.train.epoch_resume = -1 + + # Clean checkpoint: only keep the last ckpt + cfg.train.ckpt_clean = True + + # Number of iterations per epoch (for sampling based loaders only) + cfg.train.iter_per_epoch = 32 + + # GraphSAINTRandomWalkSampler: random walk length + cfg.train.walk_length = 4 + + # NeighborSampler: number of sampled nodes per layer + cfg.train.neighbor_sizes = [20, 15, 10, 5] + + # ----------------------------------------------------------------------- # + # Validation options + # ----------------------------------------------------------------------- # + cfg.val = CN() + + # Minibatch node + cfg.val.sample_node = False + + # Sampling strategy for a val/test loader + cfg.val.sampler = 'full_batch' + + # Num of sampled node per graph + cfg.val.node_per_graph = 32 + + # Radius: same, extend. same: same as cfg.gnn.layers_mp, extend: layers+1 + cfg.val.radius = 'extend' + + # ----------------------------------------------------------------------- # + # Model options + # ----------------------------------------------------------------------- # + cfg.model = CN() + + # Model type to use + cfg.model.type = 'gnn' + + # Auto match computational budget, match upper bound / lower bound + cfg.model.match_upper = True + + # Loss function: cross_entropy, mse + cfg.model.loss_fun = 'cross_entropy' + + # size average for loss function. 'mean' or 'sum' + cfg.model.size_average = 'mean' + + # Threshold for binary classification + cfg.model.thresh = 0.5 + + # ============== Link/edge tasks only + # Edge decoding methods. + # - dot: compute dot(u, v) to predict link (binary) + # - cosine_similarity: use cosine similarity (u, v) to predict link ( + # binary) + # - concat: use u||v followed by an nn.Linear to obtain edge embedding + # (multi-class) + cfg.model.edge_decoding = 'dot' + # =================================== + + # ================== Graph tasks only + # Pooling methods. + # - add: global add pool + # - mean: global mean pool + # - max: global max pool + cfg.model.graph_pooling = 'add' + # =================================== + + # ----------------------------------------------------------------------- # + # GNN options + # ----------------------------------------------------------------------- # + cfg.gnn = CN() + + # Prediction head. Use cfg.dataset.task by default + cfg.gnn.head = 'default' + + # Number of layers before message passing + cfg.gnn.layers_pre_mp = 0 + + # Number of layers for message passing + cfg.gnn.layers_mp = 2 + + # Number of layers after message passing + cfg.gnn.layers_post_mp = 0 + + # Hidden layer dim. Automatically set if train.auto_match = True + cfg.gnn.dim_inner = 16 + + # Type of graph conv: generalconv, gcnconv, sageconv, gatconv, ... + cfg.gnn.layer_type = 'generalconv' + + # Stage type: 'stack', 'skipsum', 'skipconcat' + cfg.gnn.stage_type = 'stack' + + # How many layers to skip each time + cfg.gnn.skip_every = 1 + + # Whether use batch norm + cfg.gnn.batchnorm = True + + # Activation + cfg.gnn.act = 'relu' + + # Dropout + cfg.gnn.dropout = 0.0 + + # Aggregation type: add, mean, max + # Note: only for certain layers that explicitly set aggregation type + # e.g., when cfg.gnn.layer_type = 'generalconv' + cfg.gnn.agg = 'add' + + # Normalize adj + cfg.gnn.normalize_adj = False + + # Message direction: single, both + cfg.gnn.msg_direction = 'single' + + # Whether add message from node itself: none, add, cat + cfg.gnn.self_msg = 'concat' + + # Number of attention heads + cfg.gnn.att_heads = 1 + + # After concat attention heads, add a linear layer + cfg.gnn.att_final_linear = False + + # After concat attention heads, add a linear layer + cfg.gnn.att_final_linear_bn = False + + # Normalize after message passing + cfg.gnn.l2norm = True + + # randomly use fewer edges for message passing + cfg.gnn.keep_edge = 0.5 + + # clear cached feature_new + cfg.gnn.clear_feature = True + + # ----------------------------------------------------------------------- # + # Optimizer options + # ----------------------------------------------------------------------- # + cfg.optim = CN() + + # optimizer: sgd, adam + cfg.optim.optimizer = 'adam' + + # Base learning rate + cfg.optim.base_lr = 0.01 + + # L2 regularization + cfg.optim.weight_decay = 5e-4 + + # SGD momentum + cfg.optim.momentum = 0.9 + + # scheduler: none, steps, cos + cfg.optim.scheduler = 'cos' + + # Steps for 'steps' policy (in epochs) + cfg.optim.steps = [30, 60, 90] + + # Learning rate multiplier for 'steps' policy + cfg.optim.lr_decay = 0.1 + + # Maximal number of epochs + cfg.optim.max_epoch = 200 + + # ----------------------------------------------------------------------- # + # Batch norm options + # ----------------------------------------------------------------------- # + cfg.bn = CN() + + # BN epsilon + cfg.bn.eps = 1e-5 + + # BN momentum (BN momentum in PyTorch = 1 - BN momentum in Caffe2) + cfg.bn.mom = 0.1 + + # ----------------------------------------------------------------------- # + # Memory options + # ----------------------------------------------------------------------- # + cfg.mem = CN() + + # Perform ReLU inplace + cfg.mem.inplace = False + + # Set user customized cfgs + for func in register.config_dict.values(): + func(cfg) + + +def assert_cfg(cfg): + r"""Checks config values, do necessary post processing to the configs.""" + if cfg.dataset.task not in ['node', 'edge', 'graph', 'link_pred']: + raise ValueError(f"Task '{cfg.dataset.task}' not supported. Must be " + f"one of node, edge, graph, link_pred") + if 'classification' in cfg.dataset.task_type and cfg.model.loss_fun == \ + 'mse': + cfg.model.loss_fun = 'cross_entropy' + logging.warning( + 'model.loss_fun changed to cross_entropy for classification.') + if cfg.dataset.task_type == 'regression' and cfg.model.loss_fun == \ + 'cross_entropy': + cfg.model.loss_fun = 'mse' + logging.warning('model.loss_fun changed to mse for regression.') + if cfg.dataset.task == 'graph' and cfg.dataset.transductive: + cfg.dataset.transductive = False + logging.warning('dataset.transductive changed ' + 'to False for graph task.') + if cfg.gnn.layers_post_mp < 1: + cfg.gnn.layers_post_mp = 1 + logging.warning('Layers after message passing should be >=1') + if cfg.gnn.head == 'default': + cfg.gnn.head = cfg.dataset.task + cfg.run_dir = cfg.out_dir + + +def dump_cfg(cfg): + r"""Dumps the config to the output directory specified in + :obj:`cfg.out_dir`. + + Args: + cfg (CfgNode): Configuration node + """ + os.makedirs(cfg.out_dir, exist_ok=True) + cfg_file = osp.join(cfg.out_dir, cfg.cfg_dest) + with open(cfg_file, 'w') as f: + cfg.dump(stream=f) + + +def load_cfg(cfg, args): + r"""Load configurations from file system and command line. + + Args: + cfg (CfgNode): Configuration node + args (ArgumentParser): Command argument parser + """ + cfg.merge_from_file(args.cfg_file) + cfg.merge_from_list(args.opts) + assert_cfg(cfg) + + +def makedirs_rm_exist(dir): + if osp.isdir(dir): + fs.rm(dir) + os.makedirs(dir, exist_ok=True) + + +def get_fname(fname): + r"""Extract filename from file name path. + + Args: + fname (str): Filename for the yaml format configuration file + """ + fname = osp.basename(fname) + if fname.endswith('.yaml'): + fname = fname[:-5] + elif fname.endswith('.yml'): + fname = fname[:-4] + return fname + + +def set_out_dir(out_dir, fname): + r"""Create the directory for full experiment run. + + Args: + out_dir (str): Directory for output, specified in :obj:`cfg.out_dir` + fname (str): Filename for the yaml format configuration file + """ + fname = get_fname(fname) + cfg.out_dir = osp.join(out_dir, fname) + # Make output directory + if cfg.train.auto_resume: + os.makedirs(cfg.out_dir, exist_ok=True) + else: + makedirs_rm_exist(cfg.out_dir) + + +def set_run_dir(out_dir): + r"""Create the directory for each random seed experiment run. + + Args: + out_dir (str): Directory for output, specified in :obj:`cfg.out_dir` + """ + cfg.run_dir = osp.join(out_dir, str(cfg.seed)) + # Make output directory + if cfg.train.auto_resume: + os.makedirs(cfg.run_dir, exist_ok=True) + else: + makedirs_rm_exist(cfg.run_dir) + + +set_cfg(cfg) + + +def from_config(func): + if inspect.isclass(func): + params = list(inspect.signature(func.__init__).parameters.values())[1:] + else: + params = list(inspect.signature(func).parameters.values()) + + arg_names = [p.name for p in params] + has_defaults = [p.default != inspect.Parameter.empty for p in params] + + @functools.wraps(func) + def wrapper(*args, cfg: Any = None, **kwargs): + if cfg is not None: + cfg = dict(cfg) if isinstance(cfg, Iterable) else asdict(cfg) + + iterator = zip(arg_names[len(args):], has_defaults[len(args):]) + for arg_name, has_default in iterator: + if arg_name in kwargs: + continue + elif arg_name in cfg: + kwargs[arg_name] = cfg[arg_name] + elif not has_default: + raise ValueError(f"'cfg.{arg_name}' undefined") + return func(*args, **kwargs) + + return wrapper diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/__init__.py new file mode 100644 index 00000000..47365d98 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/__init__.py @@ -0,0 +1,13 @@ +from .act import * # noqa +from .config import * # noqa +from .encoder import * # noqa +from .head import * # noqa +from .layer import * # noqa +from .loader import * # noqa +from .loss import * # noqa +from .network import * # noqa +from .optimizer import * # noqa +from .pooling import * # noqa +from .stage import * # noqa +from .train import * # noqa +from .transform import * # noqa diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/act/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/act/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/act/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/config/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/config/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/config/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/encoder/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/encoder/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/encoder/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/head/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/head/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/head/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/layer/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/layer/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/layer/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/layer/generalconv.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/layer/generalconv.py new file mode 100644 index 00000000..34c6188c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/layer/generalconv.py @@ -0,0 +1,188 @@ +import paddle +from paddle.nn import Layer, Linear +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.utils import add_remaining_self_loops, scatter + + +class GeneralConvLayer(MessagePassing): + r"""A general GNN layer.""" + def __init__(self, in_channels, out_channels, improved=False, cached=False, + bias=True, **kwargs): + super().__init__(aggr=cfg.gnn.agg, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.improved = improved + self.cached = cached + self.normalize = cfg.gnn.normalize_adj + + self.weight = self.create_parameter(shape=[in_channels, out_channels]) + if cfg.gnn.self_msg == 'concat': + self.weight_self = self.create_parameter(shape=[in_channels, out_channels]) + + if bias: + self.bias = self.create_parameter(shape=[out_channels], is_bias=True) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + glorot(self.weight) + if cfg.gnn.self_msg == 'concat': + glorot(self.weight_self) + zeros(self.bias) + self.cached_result = None + self.cached_num_edges = None + + @staticmethod + def norm(edge_index, num_nodes, edge_weight=None, improved=False, dtype=None): + if edge_weight is None: + edge_weight = paddle.ones([edge_index.shape[1]], dtype=dtype) + + fill_value = 1 if not improved else 2 + edge_index, edge_weight = add_remaining_self_loops(edge_index, edge_weight, fill_value, num_nodes) + + row, col = edge_index + deg = scatter(edge_weight, row, 0, num_nodes, reduce='sum') + deg_inv_sqrt = paddle.pow(deg, -0.5) + deg_inv_sqrt[paddle.isinf(deg_inv_sqrt)] = 0 + + return edge_index, deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col] + + def forward(self, x, edge_index, edge_weight=None, edge_feature=None): + if cfg.gnn.self_msg == 'concat': + x_self = paddle.matmul(x, self.weight_self) + x = paddle.matmul(x, self.weight) + + if self.cached and self.cached_result is not None: + if edge_index.shape[1] != self.cached_num_edges: + raise RuntimeError( + f'Cached {self.cached_num_edges} number of edges, but found {edge_index.shape[1]}.' + ' Disable caching by setting `cached=False`.') + + if not self.cached or self.cached_result is None: + self.cached_num_edges = edge_index.shape[1] + if self.normalize: + edge_index, norm = self.norm(edge_index, x.shape[self.node_dim], edge_weight, self.improved, x.dtype) + else: + norm = edge_weight + self.cached_result = edge_index, norm + + edge_index, norm = self.cached_result + x_msg = self.propagate(edge_index, x=x, norm=norm, edge_feature=edge_feature) + if cfg.gnn.self_msg == 'none': + return x_msg + elif cfg.gnn.self_msg == 'add': + return x_msg + x + elif cfg.gnn.self_msg == 'concat': + return x_msg + x_self + else: + raise ValueError(f'self_msg {cfg.gnn.self_msg} not defined') + + def message(self, x_j, norm, edge_feature): + if edge_feature is None: + return norm.unsqueeze(-1) * x_j if norm is not None else x_j + else: + return norm.unsqueeze(-1) * (x_j + edge_feature) if norm is not None else (x_j + edge_feature) + + def update(self, aggr_out): + if self.bias is not None: + aggr_out = aggr_out + self.bias + return aggr_out + + def __repr__(self): + return f'{self.__class__.__name__}({self.in_channels}, {self.out_channels})' + + +class GeneralEdgeConvLayer(MessagePassing): + r"""General GNN layer, with edge features.""" + def __init__(self, in_channels, out_channels, edge_dim, improved=False, + cached=False, bias=True, **kwargs): + super().__init__(aggr=cfg.gnn.agg, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.improved = improved + self.cached = cached + self.normalize = cfg.gnn.normalize_adj + self.msg_direction = cfg.gnn.msg_direction + + if self.msg_direction == 'single': + self.linear_msg = Linear(in_channels + edge_dim, out_channels, bias_attr=False) + else: + self.linear_msg = Linear(in_channels * 2 + edge_dim, out_channels, bias_attr=False) + + if cfg.gnn.self_msg == 'concat': + self.linear_self = Linear(in_channels, out_channels, bias_attr=False) + + if bias: + self.bias = self.create_parameter(shape=[out_channels], is_bias=True) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + zeros(self.bias) + self.cached_result = None + self.cached_num_edges = None + + @staticmethod + def norm(edge_index, num_nodes, edge_weight=None, improved=False, dtype=None): + if edge_weight is None: + edge_weight = paddle.ones([edge_index.shape[1]], dtype=dtype) + + fill_value = 1 if not improved else 2 + edge_index, edge_weight = add_remaining_self_loops(edge_index, edge_weight, fill_value, num_nodes) + + row, col = edge_index + deg = scatter(edge_weight, row, 0, num_nodes, reduce='sum') + deg_inv_sqrt = paddle.pow(deg, -0.5) + deg_inv_sqrt[paddle.isinf(deg_inv_sqrt)] = 0 + + return edge_index, deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col] + + def forward(self, x, edge_index, edge_weight=None, edge_feature=None): + if self.cached and self.cached_result is not None: + if edge_index.shape[1] != self.cached_num_edges: + raise RuntimeError( + f'Cached {self.cached_num_edges} number of edges, but found {edge_index.shape[1]}.' + ' Disable caching by setting `cached=False`.') + + if not self.cached or self.cached_result is None: + self.cached_num_edges = edge_index.shape[1] + if self.normalize: + edge_index, norm = self.norm(edge_index, x.shape[self.node_dim], edge_weight, self.improved, x.dtype) + else: + norm = edge_weight + self.cached_result = edge_index, norm + + edge_index, norm = self.cached_result + x_msg = self.propagate(edge_index, x=x, norm=norm, edge_feature=edge_feature) + + if cfg.gnn.self_msg == 'concat': + x_self = self.linear_self(x) + return x_self + x_msg + elif cfg.gnn.self_msg == 'add': + return x + x_msg + else: + return x_msg + + def message(self, x_i, x_j, norm, edge_feature): + if self.msg_direction == 'both': + x_j = paddle.concat([x_i, x_j, edge_feature], axis=-1) + else: + x_j = paddle.concat([x_j, edge_feature], axis=-1) + x_j = self.linear_msg(x_j) + return norm.unsqueeze(-1) * x_j if norm is not None else x_j + + def update(self, aggr_out): + if self.bias is not None: + aggr_out = aggr_out + self.bias + return aggr_out + + def __repr__(self): + return f'{self.__class__.__name__}({self.in_channels}, {self.out_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/loader/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/loader/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/loader/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/loss/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/loss/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/loss/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/network/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/network/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/network/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/optimizer/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/optimizer/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/optimizer/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/pooling/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/pooling/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/pooling/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/stage/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/stage/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/stage/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/train/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/train/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/train/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/contrib/transform/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/transform/__init__.py new file mode 100644 index 00000000..c0b31382 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/contrib/transform/__init__.py @@ -0,0 +1,8 @@ +from os.path import dirname, basename, isfile, join +import glob + +modules = glob.glob(join(dirname(__file__), "*.py")) +__all__ = [ + basename(f)[:-3] for f in modules + if isfile(f) and not f.endswith('__init__.py') +] diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/imports.py b/jointContribution/mattergen/paddle_geometric/graphgym/imports.py new file mode 100644 index 00000000..8397755d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/imports.py @@ -0,0 +1,15 @@ +import warnings + +import paddle + +try: + import paddle_lightning as pl + LightningModule = pl.LightningModule + Callback = pl.Callback +except ImportError: + pl = object + LightningModule = paddle.nn.Layer + Callback = object + + warnings.warn("Please install 'paddle_lightning' via " + "'pip install paddle_lightning' in order to use GraphGym") diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/init.py b/jointContribution/mattergen/paddle_geometric/graphgym/init.py new file mode 100644 index 00000000..f2c7a4ec --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/init.py @@ -0,0 +1,17 @@ +import paddle + + +def init_weights(m): + r"""Performs weight initialization. + + Args: + m (paddle.nn.Layer): Paddle module + + """ + if isinstance(m, (paddle.nn.BatchNorm2D, paddle.nn.BatchNorm1D)): + m.weight.set_value(paddle.ones_like(m.weight)) + m.bias.set_value(paddle.zeros_like(m.bias)) + elif isinstance(m, paddle.nn.Linear): + paddle.nn.initializer.XavierUniform()(m.weight) + if m.bias is not None: + m.bias.set_value(paddle.zeros_like(m.bias)) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/loader.py b/jointContribution/mattergen/paddle_geometric/graphgym/loader.py new file mode 100644 index 00000000..02637c47 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/loader.py @@ -0,0 +1,320 @@ +import os.path as osp +from typing import Callable + +import paddle + +import paddle_geometric.graphgym.register as register +import paddle_geometric.transforms as T +from paddle_geometric.datasets import ( + PPI, + Amazon, + Coauthor, + KarateClub, + MNISTSuperpixels, + Planetoid, + QM7b, + TUDataset, +) +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.models.transform import ( + create_link_label, + neg_sampling_transform, +) +from paddle_geometric.loader import ( + ClusterLoader, + DataLoader, + GraphSAINTEdgeSampler, + GraphSAINTNodeSampler, + GraphSAINTRandomWalkSampler, + NeighborSampler, + RandomNodeLoader, +) +from paddle_geometric.utils import ( + index_to_mask, + negative_sampling, + to_undirected, +) + +index2mask = index_to_mask # TODO: Backward compatibility + + +def planetoid_dataset(name: str) -> Callable: + return lambda root: Planetoid(root, name) + + +register.register_dataset('Cora', planetoid_dataset('Cora')) +register.register_dataset('CiteSeer', planetoid_dataset('CiteSeer')) +register.register_dataset('PubMed', planetoid_dataset('PubMed')) +register.register_dataset('PPI', PPI) + + +def load_pyg(name, dataset_dir): + """Load PaddleGeometric dataset objects. (More datasets will be supported). + + Args: + name (str): dataset name + dataset_dir (str): data directory + + Returns: PaddleGeometric dataset object + """ + dataset_dir = osp.join(dataset_dir, name) + if name in ['Cora', 'CiteSeer', 'PubMed']: + dataset = Planetoid(dataset_dir, name) + elif name[:3] == 'TU_': + if name[3:] == 'IMDB': + name = 'IMDB-MULTI' + dataset = TUDataset(dataset_dir, name, transform=T.Constant()) + else: + dataset = TUDataset(dataset_dir, name[3:]) + elif name == 'Karate': + dataset = KarateClub() + elif 'Coauthor' in name: + dataset = Coauthor(dataset_dir, name='CS' if 'CS' in name else 'Physics') + elif 'Amazon' in name: + dataset = Amazon(dataset_dir, name='Computers' if 'Computers' in name else 'Photo') + elif name == 'MNIST': + dataset = MNISTSuperpixels(dataset_dir) + elif name == 'PPI': + dataset = PPI(dataset_dir) + elif name == 'QM7b': + dataset = QM7b(dataset_dir) + else: + raise ValueError(f"'{name}' not supported") + + return dataset + + +def set_dataset_attr(dataset, name, value, size): + dataset._data_list = None + dataset.data[name] = value + if dataset.slices is not None: + dataset.slices[name] = paddle.to_tensor([0, size], dtype='int64') + + +def load_ogb(name, dataset_dir): + """Load OGB dataset objects. + + Args: + name (str): dataset name + dataset_dir (str): data directory + + Returns: PaddleGeometric dataset object + """ + from ogb.graphproppred import PygGraphPropPredDataset + from ogb.linkproppred import PygLinkPropPredDataset + from ogb.nodeproppred import PygNodePropPredDataset + + if name[:4] == 'ogbn': + dataset = PygNodePropPredDataset(name=name, root=dataset_dir) + splits = dataset.get_idx_split() + split_names = ['train_mask', 'val_mask', 'test_mask'] + for i, key in enumerate(splits.keys()): + mask = index_to_mask(splits[key], size=dataset._data.y.shape[0]) + set_dataset_attr(dataset, split_names[i], mask, len(mask)) + edge_index = to_undirected(dataset._data.edge_index) + set_dataset_attr(dataset, 'edge_index', edge_index, edge_index.shape[1]) + + elif name[:4] == 'ogbg': + dataset = PygGraphPropPredDataset(name=name, root=dataset_dir) + splits = dataset.get_idx_split() + split_names = ['train_graph_index', 'val_graph_index', 'test_graph_index'] + for i, key in enumerate(splits.keys()): + id = splits[key] + set_dataset_attr(dataset, split_names[i], id, len(id)) + + elif name[:4] == "ogbl": + dataset = PygLinkPropPredDataset(name=name, root=dataset_dir) + splits = dataset.get_edge_split() + id = splits['train']['edge'].T + if cfg.dataset.resample_negative: + set_dataset_attr(dataset, 'train_pos_edge_index', id, id.shape[1]) + dataset.transform = neg_sampling_transform + else: + id_neg = negative_sampling(edge_index=id, num_nodes=dataset._data.num_nodes, num_neg_samples=id.shape[1]) + id_all = paddle.concat([id, id_neg], axis=-1) + label = create_link_label(id, id_neg) + set_dataset_attr(dataset, 'train_edge_index', id_all, id_all.shape[1]) + set_dataset_attr(dataset, 'train_edge_label', label, len(label)) + + id, id_neg = splits['valid']['edge'].T, splits['valid']['edge_neg'].T + id_all = paddle.concat([id, id_neg], axis=-1) + label = create_link_label(id, id_neg) + set_dataset_attr(dataset, 'val_edge_index', id_all, id_all.shape[1]) + set_dataset_attr(dataset, 'val_edge_label', label, len(label)) + + id, id_neg = splits['test']['edge'].T, splits['test']['edge_neg'].T + id_all = paddle.concat([id, id_neg], axis=-1) + label = create_link_label(id, id_neg) + set_dataset_attr(dataset, 'test_edge_index', id_all, id_all.shape[1]) + set_dataset_attr(dataset, 'test_edge_label', label, len(label)) + + else: + raise ValueError(f'OGB dataset: {name} does not exist') + return dataset + + +def load_dataset(): + """Load dataset objects. + + Returns: PaddleGeometric dataset object + """ + format = cfg.dataset.format + name = cfg.dataset.name + dataset_dir = cfg.dataset.dir + for func in register.loader_dict.values(): + dataset = func(format, name, dataset_dir) + if dataset is not None: + return dataset + if format == 'PyG': + dataset = load_pyg(name, dataset_dir) + elif format == 'OGB': + dataset = load_ogb(name.replace('_', '-'), dataset_dir) + else: + raise ValueError(f"Unknown data format '{format}'") + return dataset + + +def set_dataset_info(dataset): + """Set global dataset information. + + Args: + dataset: PaddleGeometric dataset object + """ + try: + cfg.share.dim_in = dataset._data.x.shape[1] + except Exception: + cfg.share.dim_in = 1 + try: + cfg.share.dim_out = paddle.unique(dataset._data.y).shape[0] if cfg.dataset.task_type == 'classification' else dataset._data.y.shape[1] + except Exception: + cfg.share.dim_out = 1 + cfg.share.num_splits = 1 + if any('val' in key for key in dataset._data.keys()): + cfg.share.num_splits += 1 + if any('test' in key for key in dataset._data.keys()): + cfg.share.num_splits += 1 + + +def create_dataset(): + """Create dataset object. + + Returns: PaddleGeometric dataset object + """ + dataset = load_dataset() + set_dataset_info(dataset) + return dataset + + +def get_loader(dataset, sampler, batch_size, shuffle=True): + """Get loader based on the sampler type.""" + pw = cfg.num_workers > 0 + if sampler == "full_batch" or len(dataset) > 1: + loader_train = DataLoader( + dataset, + batch_size=batch_size, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True, + persistent_workers=pw + ) + elif sampler == "neighbor": + loader_train = NeighborSampler( + dataset[0], + sizes=cfg.train.neighbor_sizes[:cfg.gnn.layers_mp], + batch_size=batch_size, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True + ) + elif sampler == "random_node": + loader_train = RandomNodeLoader( + dataset[0], + num_parts=cfg.train.train_parts, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True, + persistent_workers=pw + ) + elif sampler == "saint_rw": + loader_train = GraphSAINTRandomWalkSampler( + dataset[0], + batch_size=batch_size, + walk_length=cfg.train.walk_length, + num_steps=cfg.train.iter_per_epoch, + sample_coverage=0, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True, + persistent_workers=pw + ) + elif sampler == "saint_node": + loader_train = GraphSAINTNodeSampler( + dataset[0], + batch_size=batch_size, + num_steps=cfg.train.iter_per_epoch, + sample_coverage=0, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True, + persistent_workers=pw + ) + elif sampler == "saint_edge": + loader_train = GraphSAINTEdgeSampler( + dataset[0], + batch_size=batch_size, + num_steps=cfg.train.iter_per_epoch, + sample_coverage=0, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True, + persistent_workers=pw + ) + elif sampler == "cluster": + loader_train = ClusterLoader( + dataset[0], + num_parts=cfg.train.train_parts, + save_dir=osp.join(cfg.dataset.dir, cfg.dataset.name.replace("-", "_")), + batch_size=batch_size, + shuffle=shuffle, + num_workers=cfg.num_workers, + pin_memory=True, + persistent_workers=pw + ) + else: + raise NotImplementedError(f"'{sampler}' is not implemented") + + return loader_train + + +def create_loader(): + """Create data loader object. + + Returns: List of Paddle data loaders + """ + dataset = create_dataset() + if cfg.dataset.task == 'graph': + id = dataset.data['train_graph_index'] + loaders = [ + get_loader(dataset[id], cfg.train.sampler, cfg.train.batch_size, shuffle=True) + ] + delattr(dataset.data, 'train_graph_index') + else: + loaders = [ + get_loader(dataset, cfg.train.sampler, cfg.train.batch_size, shuffle=True) + ] + + # val and test loaders + for i in range(cfg.share.num_splits - 1): + if cfg.dataset.task == 'graph': + split_names = ['val_graph_index', 'test_graph_index'] + id = dataset.data[split_names[i]] + loaders.append( + get_loader(dataset[id], cfg.val.sampler, cfg.train.batch_size, shuffle=False) + ) + delattr(dataset.data, split_names[i]) + else: + loaders.append( + get_loader(dataset, cfg.val.sampler, cfg.train.batch_size, shuffle=False) + ) + + return loaders \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/logger.py b/jointContribution/mattergen/paddle_geometric/graphgym/logger.py new file mode 100644 index 00000000..e0bbb539 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/logger.py @@ -0,0 +1,313 @@ +import logging +import math +import os +import sys +import time +from typing import Any, Dict, Optional + +import paddle + +from paddle_geometric.graphgym import register +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.utils.device import get_current_gpu_usage +from paddle_geometric.graphgym.utils.io import dict_to_json, dict_to_tb + + +def set_printing(): + """Set up printing options.""" + logging.root.handlers = [] + logging_cfg = {'level': logging.INFO, 'format': '%(message)s'} + os.makedirs(cfg.run_dir, exist_ok=True) + h_file = logging.FileHandler(f'{cfg.run_dir}/logging.log') + h_stdout = logging.StreamHandler(sys.stdout) + if cfg.print == 'file': + logging_cfg['handlers'] = [h_file] + elif cfg.print == 'stdout': + logging_cfg['handlers'] = [h_stdout] + elif cfg.print == 'both': + logging_cfg['handlers'] = [h_file, h_stdout] + else: + raise ValueError('Print option not supported') + logging.basicConfig(**logging_cfg) + + +class Logger: + def __init__(self, name='train', task_type=None): + self.name = name + self.task_type = task_type + + self._epoch_total = cfg.optim.max_epoch + self._time_total = 0 # won't be reset + + self.out_dir = f'{cfg.run_dir}/{name}' + os.makedirs(self.out_dir, exist_ok=True) + if cfg.tensorboard_each_run: + from visualdl import LogWriter + self.tb_writer = LogWriter(logdir=self.out_dir) + + self.reset() + + def __getitem__(self, key): + return getattr(self, key, None) + + def __setitem__(self, key, value): + setattr(self, key, value) + + def reset(self): + self._iter = 0 + self._size_current = 0 + self._loss = 0 + self._lr = 0 + self._params = 0 + self._time_used = 0 + self._true = [] + self._pred = [] + self._custom_stats = {} + + def basic(self): + stats = { + 'loss': round(self._loss / self._size_current, cfg.round), + 'lr': round(self._lr, cfg.round), + 'params': self._params, + 'time_iter': round(self.time_iter(), cfg.round), + } + gpu_memory = get_current_gpu_usage() + if gpu_memory > 0: + stats['gpu_memory'] = gpu_memory + return stats + + def custom(self): + if len(self._custom_stats) == 0: + return {} + out = {} + for key, val in self._custom_stats.items(): + out[key] = val / self._size_current + return out + + def _get_pred_int(self, pred_score): + if len(pred_score.shape) == 1 or pred_score.shape[1] == 1: + return (pred_score > cfg.model.thresh).astype('int64') + else: + return pred_score.argmax(axis=1) + + def classification_binary(self): + from sklearn.metrics import ( + accuracy_score, + f1_score, + precision_score, + recall_score, + roc_auc_score, + ) + + true, pred_score = paddle.concat(self._true), paddle.concat(self._pred) + pred_int = self._get_pred_int(pred_score) + try: + r_a_score = roc_auc_score(true.numpy(), pred_score.numpy()) + except ValueError: + r_a_score = 0.0 + return { + 'accuracy': round(accuracy_score(true.numpy(), pred_int.numpy()), cfg.round), + 'precision': round(precision_score(true.numpy(), pred_int.numpy()), cfg.round), + 'recall': round(recall_score(true.numpy(), pred_int.numpy()), cfg.round), + 'f1': round(f1_score(true.numpy(), pred_int.numpy()), cfg.round), + 'auc': round(r_a_score, cfg.round), + } + + def classification_multi(self): + from sklearn.metrics import accuracy_score + + true, pred_score = paddle.concat(self._true), paddle.concat(self._pred) + pred_int = self._get_pred_int(pred_score) + return {'accuracy': round(accuracy_score(true.numpy(), pred_int.numpy()), cfg.round)} + + def regression(self): + from sklearn.metrics import mean_absolute_error, mean_squared_error + + true, pred = paddle.concat(self._true), paddle.concat(self._pred) + return { + 'mae': float(round(mean_absolute_error(true.numpy(), pred.numpy()), cfg.round)), + 'mse': float(round(mean_squared_error(true.numpy(), pred.numpy()), cfg.round)), + 'rmse': float(round(math.sqrt(mean_squared_error(true.numpy(), pred.numpy())), cfg.round)) + } + + def time_iter(self): + return self._time_used / self._iter + + def eta(self, epoch_current): + epoch_current += 1 # since counter starts from 0 + time_per_epoch = self._time_total / epoch_current + return time_per_epoch * (self._epoch_total - epoch_current) + + def update_stats(self, true, pred, loss, lr, time_used, params, **kwargs): + assert true.shape[0] == pred.shape[0] + self._iter += 1 + self._true.append(true) + self._pred.append(pred) + batch_size = true.shape[0] + self._size_current += batch_size + self._loss += loss * batch_size + self._lr = lr + self._params = params + self._time_used += time_used + self._time_total += time_used + for key, val in kwargs.items(): + if key not in self._custom_stats: + self._custom_stats[key] = val * batch_size + else: + self._custom_stats[key] += val * batch_size + + def write_epoch(self, cur_epoch): + basic_stats = self.basic() + + task_stats = {} + for custom_metric in cfg.custom_metrics: + func = register.metric_dict.get(custom_metric) + if not func: + raise ValueError(f'Unknown custom metric function name: {custom_metric}') + custom_metric_score = func(self._true, self._pred, self.task_type) + task_stats[custom_metric] = custom_metric_score + + if not task_stats: + if self.task_type == 'regression': + task_stats = self.regression() + elif self.task_type == 'classification_binary': + task_stats = self.classification_binary() + elif self.task_type == 'classification_multi': + task_stats = self.classification_multi() + else: + raise ValueError('Task has to be regression or classification') + + epoch_stats = {'epoch': cur_epoch} + eta_stats = {'eta': round(self.eta(cur_epoch), cfg.round)} + custom_stats = self.custom() + + if self.name == 'train': + stats = {**epoch_stats, **eta_stats, **basic_stats, **task_stats, **custom_stats} + else: + stats = {**epoch_stats, **basic_stats, **task_stats, **custom_stats} + + logging.info(f'{self.name}: {stats}') + dict_to_json(stats, f'{self.out_dir}/stats.json') + + if cfg.tensorboard_each_run: + dict_to_tb(stats, self.tb_writer, cur_epoch) + self.reset() + + def close(self): + if cfg.tensorboard_each_run: + self.tb_writer.close() +def infer_task(): + num_label = cfg.share.dim_out + if cfg.dataset.task_type == 'classification': + if num_label <= 2: + task_type = 'classification_binary' + else: + task_type = 'classification_multi' + else: + task_type = cfg.dataset.task_type + return task_type + + +def create_logger(): + """Create logger for the experiment.""" + loggers = [] + names = ['train', 'val', 'test'] + for i in range(cfg.share.num_splits): + loggers.append(Logger(name=names[i], task_type=infer_task())) + return loggers + + +class LoggerCallback: + def __init__(self): + self._logger = create_logger() + self._train_epoch_start_time = None + self._val_epoch_start_time = None + self._test_epoch_start_time = None + + @property + def train_logger(self) -> Any: + return self._logger[0] + + @property + def val_logger(self) -> Any: + return self._logger[1] + + @property + def test_logger(self) -> Any: + return self._logger[2] + + def close(self): + for logger in self._logger: + logger.close() + + def _get_stats( + self, + epoch_start_time: int, + outputs: Dict[str, Any], + trainer: 'Trainer', + ) -> Dict: + return dict( + true=outputs['true'].cpu(), + pred=outputs['pred_score'].cpu(), + loss=float(outputs['loss']), + lr=trainer.lr_scheduler_configs[0].scheduler.get_lr()[0], + time_used=time.time() - epoch_start_time, + params=cfg.params, + ) + + def on_train_epoch_start(self, trainer: 'Trainer', pl_module: 'LightningModule'): + self._train_epoch_start_time = time.time() + + def on_validation_epoch_start(self, trainer: 'Trainer', pl_module: 'LightningModule'): + self._val_epoch_start_time = time.time() + + def on_test_epoch_start(self, trainer: 'Trainer', pl_module: 'LightningModule'): + self._test_epoch_start_time = time.time() + + def on_train_batch_end( + self, + trainer: 'Trainer', + pl_module: 'LightningModule', + outputs: Dict[str, Any], + batch: Any, + batch_idx: int, + unused: int = 0, + ): + stats = self._get_stats(self._train_epoch_start_time, outputs, trainer) + self.train_logger.update_stats(**stats) + + def on_validation_batch_end( + self, + trainer: 'Trainer', + pl_module: 'LightningModule', + outputs: Optional[Dict[str, Any]], + batch: Any, + batch_idx: int, + dataloader_idx: int = 0, + ): + stats = self._get_stats(self._val_epoch_start_time, outputs, trainer) + self.val_logger.update_stats(**stats) + + def on_test_batch_end( + self, + trainer: 'Trainer', + pl_module: 'LightningModule', + outputs: Optional[Dict[str, Any]], + batch: Any, + batch_idx: int, + dataloader_idx: int = 0, + ): + stats = self._get_stats(self._test_epoch_start_time, outputs, trainer) + self.test_logger.update_stats(**stats) + + def on_train_epoch_end(self, trainer: 'Trainer', pl_module: 'LightningModule'): + self.train_logger.write_epoch(trainer.current_epoch) + + def on_validation_epoch_end(self, trainer: 'Trainer', pl_module: 'LightningModule'): + self.val_logger.write_epoch(trainer.current_epoch) + + def on_test_epoch_end(self, trainer: 'Trainer', pl_module: 'LightningModule'): + self.test_logger.write_epoch(trainer.current_epoch) + + def on_fit_end(self, trainer, pl_module): + self.close() \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/loss.py b/jointContribution/mattergen/paddle_geometric/graphgym/loss.py new file mode 100644 index 00000000..bb893db8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/loss.py @@ -0,0 +1,42 @@ +import paddle +import paddle.nn.functional as F +import paddle_geometric.graphgym.register as register +from paddle_geometric.graphgym.config import cfg + + +def compute_loss(pred, true): + """Compute loss and prediction score. + + Args: + pred (paddle.Tensor): Unnormalized prediction + true (paddle.Tensor): Ground truth + + Returns: Loss, normalized prediction score + """ + bce_loss = paddle.nn.BCEWithLogitsLoss(reduction=cfg.model.size_average) + mse_loss = paddle.nn.MSELoss(reduction=cfg.model.size_average) + + # default manipulation for pred and true + pred = paddle.squeeze(pred, axis=-1) if pred.ndim > 1 else pred + true = paddle.squeeze(true, axis=-1) if true.ndim > 1 else true + + # Try to load customized loss + for func in register.loss_dict.values(): + value = func(pred, true) + if value is not None: + return value + + if cfg.model.loss_fun == 'cross_entropy': + # multiclass + if pred.ndim > 1 and true.ndim == 1: + pred = F.log_softmax(pred, axis=-1) + return F.nll_loss(pred, true), pred + # binary or multilabel + else: + true = true.astype('float32') + return bce_loss(pred, true), F.sigmoid(pred) + elif cfg.model.loss_fun == 'mse': + true = true.astype('float32') + return mse_loss(pred, true), pred + else: + raise ValueError(f"Loss function '{cfg.model.loss_fun}' not supported") diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/model_builder.py b/jointContribution/mattergen/paddle_geometric/graphgym/model_builder.py new file mode 100644 index 00000000..08c82c69 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/model_builder.py @@ -0,0 +1,86 @@ +import time +from typing import Any, Dict, Tuple + +import paddle + +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.loss import compute_loss +from paddle_geometric.graphgym.models.gnn import GNN +from paddle_geometric.graphgym.optim import create_optimizer, create_scheduler +from paddle_geometric.graphgym.register import network_dict, register_network + +register_network('gnn', GNN) + + +class GraphGymModule(paddle.nn.Layer): + def __init__(self, dim_in, dim_out, cfg): + super().__init__() + self.cfg = cfg + self.model = network_dict[cfg.model.type](dim_in=dim_in, + dim_out=dim_out) + + def forward(self, *args, **kwargs): + return self.model(*args, **kwargs) + + def configure_optimizers(self) -> Tuple[Any, Any]: + optimizer = create_optimizer(self.model.parameters(), self.cfg.optim) + scheduler = create_scheduler(optimizer, self.cfg.optim) + return [optimizer], [scheduler] + + def _shared_step(self, batch, split: str) -> Dict: + batch.split = split + pred, true = self(batch) + loss, pred_score = compute_loss(pred, true) + step_end_time = time.time() + return dict(loss=loss, true=true, pred_score=pred_score.detach(), + step_end_time=step_end_time) + + def training_step(self, batch, *args, **kwargs): + return self._shared_step(batch, split="train") + + def validation_step(self, batch, *args, **kwargs): + return self._shared_step(batch, split="val") + + def test_step(self, batch, *args, **kwargs): + return self._shared_step(batch, split="test") + + @property + def encoder(self) -> paddle.nn.Layer: + return self.model.encoder + + @property + def mp(self) -> paddle.nn.Layer: + return self.model.mp + + @property + def post_mp(self) -> paddle.nn.Layer: + return self.model.post_mp + + @property + def pre_mp(self) -> paddle.nn.Layer: + return self.model.pre_mp + + def lr_scheduler_step(self, *args, **kwargs): + # Adjust the learning rate scheduler step method for Paddle + return super().lr_scheduler_step(*args, **kwargs) + + +def create_model(to_device=True, dim_in=None, dim_out=None) -> GraphGymModule: + r"""Create model for graph machine learning. + + Args: + to_device (bool, optional): Whether to transfer the model to the + specified device. (default: :obj:`True`) + dim_in (int, optional): Input dimension to the model + dim_out (int, optional): Output dimension to the model + """ + dim_in = cfg.share.dim_in if dim_in is None else dim_in + dim_out = cfg.share.dim_out if dim_out is None else dim_out + # binary classification, output dim = 1 + if 'classification' == cfg.dataset.task_type and dim_out == 2: + dim_out = 1 + + model = GraphGymModule(dim_in, dim_out, cfg) + if to_device: + model.to(paddle.device(cfg.accelerator)) + return model diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/__init__.py new file mode 100644 index 00000000..6d504d9a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/__init__.py @@ -0,0 +1,41 @@ +from .encoder import (IntegerFeatureEncoder, AtomEncoder, BondEncoder) +from .gnn import (GNNLayer, GNNPreMP, GNNStackStage, FeatureEncoder, GNN) +from .head import (GNNNodeHead, GNNEdgeHead, GNNGraphHead) +from .layer import (GeneralLayer, GeneralMultiLayer, Linear, BatchNorm1dNode, + BatchNorm1dEdge, MLP, GCNConv, SAGEConv, GATConv, GINConv, + SplineConv, GeneralConv, GeneralEdgeConv, + GeneralSampleEdgeConv) +from .pooling import (global_add_pool, global_mean_pool, global_max_pool) + +__all__ = [ + 'IntegerFeatureEncoder', + 'AtomEncoder', + 'BondEncoder', + 'GNNLayer', + 'GNNPreMP', + 'GNNStackStage', + 'FeatureEncoder', + 'GNN', + 'GNNNodeHead', + 'GNNEdgeHead', + 'GNNGraphHead', + 'GeneralLayer', + 'GeneralMultiLayer', + 'Linear', + 'BatchNorm1dNode', + 'BatchNorm1dEdge', + 'MLP', + 'GCNConv', + 'SAGEConv', + 'GATConv', + 'GINConv', + 'SplineConv', + 'GeneralConv', + 'GeneralEdgeConv', + 'GeneralSampleEdgeConv', + 'global_add_pool', + 'global_mean_pool', + 'global_max_pool', +] + +classes = __all__ diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/act.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/act.py new file mode 100644 index 00000000..510d0178 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/act.py @@ -0,0 +1,42 @@ +import paddle + +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.register import register_act + + +def relu(): + return paddle.nn.ReLU() if not cfg.mem.inplace else paddle.nn.functional.relu + + +def selu(): + return paddle.nn.SELU() if not cfg.mem.inplace else paddle.nn.functional.selu + + +def prelu(): + return paddle.nn.PReLU() + + +def elu(): + return paddle.nn.ELU() if not cfg.mem.inplace else paddle.nn.functional.elu + + +def lrelu_01(): + return paddle.nn.LeakyReLU(0.1) if not cfg.mem.inplace else lambda x: paddle.nn.functional.leaky_relu(x, negative_slope=0.1) + + +def lrelu_025(): + return paddle.nn.LeakyReLU(0.25) if not cfg.mem.inplace else lambda x: paddle.nn.functional.leaky_relu(x, negative_slope=0.25) + + +def lrelu_05(): + return paddle.nn.LeakyReLU(0.5) if not cfg.mem.inplace else lambda x: paddle.nn.functional.leaky_relu(x, negative_slope=0.5) + + +if cfg is not None: + register_act('relu', relu) + register_act('selu', selu) + register_act('prelu', prelu) + register_act('elu', elu) + register_act('lrelu_01', lrelu_01) + register_act('lrelu_025', lrelu_025) + register_act('lrelu_05', lrelu_05) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/encoder.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/encoder.py new file mode 100644 index 00000000..49385082 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/encoder.py @@ -0,0 +1,102 @@ +import paddle + +from paddle_geometric.graphgym.register import ( + register_edge_encoder, + register_node_encoder, +) + + +@register_node_encoder('Integer') +class IntegerFeatureEncoder(paddle.nn.Layer): + r"""Provides an encoder for integer node features. + + Args: + emb_dim (int): The output embedding dimension. + num_classes (int): The number of classes/integers. + + Example: + >>> encoder = IntegerFeatureEncoder(emb_dim=16, num_classes=10) + >>> batch = paddle.randint(0, 10, (10, 2)) + >>> encoder(batch).size() + paddle.Size([10, 16]) + """ + def __init__(self, emb_dim: int, num_classes: int): + super().__init__() + + self.encoder = paddle.nn.Embedding(num_classes, emb_dim) + paddle.nn.initializer.XavierUniform()(self.encoder.weight) + + def forward(self, batch): + # Encode just the first dimension if more exist + batch.x = self.encoder(batch.x[:, 0]) + + return batch + + +@register_node_encoder('Atom') +class AtomEncoder(paddle.nn.Layer): + r"""The atom encoder used in OGB molecule dataset. + + Args: + emb_dim (int): The output embedding dimension. + + Example: + >>> encoder = AtomEncoder(emb_dim=16) + >>> batch = paddle.randint(0, 10, (10, 3)) + >>> encoder(batch).size() + paddle.Size([10, 16]) + """ + def __init__(self, emb_dim, *args, **kwargs): + super().__init__() + + from ogb.utils.features import get_atom_feature_dims + + self.atom_embedding_list = paddle.nn.LayerList() + + for i, dim in enumerate(get_atom_feature_dims()): + emb = paddle.nn.Embedding(dim, emb_dim) + paddle.nn.initializer.XavierUniform()(emb.weight) + self.atom_embedding_list.append(emb) + + def forward(self, batch): + encoded_features = 0 + for i in range(batch.x.shape[1]): + encoded_features += self.atom_embedding_list[i](batch.x[:, i]) + + batch.x = encoded_features + return batch + + +@register_edge_encoder('Bond') +class BondEncoder(paddle.nn.Layer): + r"""The bond encoder used in OGB molecule dataset. + + Args: + emb_dim (int): The output embedding dimension. + + Example: + >>> encoder = BondEncoder(emb_dim=16) + >>> batch = paddle.randint(0, 10, (10, 3)) + >>> encoder(batch).size() + paddle.Size([10, 16]) + """ + def __init__(self, emb_dim: int): + super().__init__() + + from ogb.utils.features import get_bond_feature_dims + + self.bond_embedding_list = paddle.nn.LayerList() + + for i, dim in enumerate(get_bond_feature_dims()): + emb = paddle.nn.Embedding(dim, emb_dim) + paddle.nn.initializer.XavierUniform()(emb.weight) + self.bond_embedding_list.append(emb) + + def forward(self, batch): + bond_embedding = 0 + for i in range(batch.edge_attr.shape[1]): + edge_attr = batch.edge_attr + bond_embedding += self.bond_embedding_list[i](edge_attr[:, i]) + + batch.edge_attr = bond_embedding + return batch diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/gnn.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/gnn.py new file mode 100644 index 00000000..1fb218bb --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/gnn.py @@ -0,0 +1,141 @@ +import paddle +import paddle.nn.functional as F + +import paddle_geometric.graphgym.register as register +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.init import init_weights +from paddle_geometric.graphgym.models.layer import ( + BatchNorm1dNode, + GeneralLayer, + GeneralMultiLayer, + new_layer_config, +) +from paddle_geometric.graphgym.register import register_stage + + +def GNNLayer(dim_in: int, dim_out: int, has_act: bool = True) -> GeneralLayer: + r"""Creates a GNN layer, given the specified input and output dimensions + and the underlying configuration in :obj:`cfg`. + """ + return GeneralLayer( + cfg.gnn.layer_type, + layer_config=new_layer_config( + dim_in, + dim_out, + 1, + has_act=has_act, + has_bias=False, + cfg=cfg, + ), + ) + + +def GNNPreMP(dim_in: int, dim_out: int, num_layers: int) -> GeneralMultiLayer: + r"""Creates a NN layer used before message passing.""" + return GeneralMultiLayer( + 'linear', + layer_config=new_layer_config( + dim_in, + dim_out, + num_layers, + has_act=False, + has_bias=False, + cfg=cfg, + ), + ) + + +@register_stage('stack') +@register_stage('skipsum') +@register_stage('skipconcat') +class GNNStackStage(paddle.nn.Layer): + r"""Stacks a number of GNN layers.""" + def __init__(self, dim_in, dim_out, num_layers): + super().__init__() + self.num_layers = num_layers + for i in range(num_layers): + if cfg.gnn.stage_type == 'skipconcat': + d_in = dim_in if i == 0 else dim_in + i * dim_out + else: + d_in = dim_in if i == 0 else dim_out + layer = GNNLayer(d_in, dim_out) + self.add_sublayer(f'layer{i}', layer) + + def forward(self, batch): + for i, layer in enumerate(self.children()): + x = batch.x + batch = layer(batch) + if cfg.gnn.stage_type == 'skipsum': + batch.x = x + batch.x + elif (cfg.gnn.stage_type == 'skipconcat' + and i < self.num_layers - 1): + batch.x = paddle.concat([x, batch.x], axis=1) + if cfg.gnn.l2norm: + batch.x = F.normalize(batch.x, p=2, axis=-1) + return batch + + +class FeatureEncoder(paddle.nn.Layer): + r"""Encodes node and edge features.""" + def __init__(self, dim_in: int): + super().__init__() + self.dim_in = dim_in + if cfg.dataset.node_encoder: + NodeEncoder = register.node_encoder_dict[cfg.dataset.node_encoder_name] + self.node_encoder = NodeEncoder(cfg.gnn.dim_inner) + if cfg.dataset.node_encoder_bn: + self.node_encoder_bn = BatchNorm1dNode( + new_layer_config( + cfg.gnn.dim_inner, + -1, + -1, + has_act=False, + has_bias=False, + cfg=cfg, + )) + self.dim_in = cfg.gnn.dim_inner + if cfg.dataset.edge_encoder: + EdgeEncoder = register.edge_encoder_dict[cfg.dataset.edge_encoder_name] + self.edge_encoder = EdgeEncoder(cfg.gnn.dim_inner) + if cfg.dataset.edge_encoder_bn: + self.edge_encoder_bn = BatchNorm1dNode( + new_layer_config( + cfg.gnn.dim_inner, + -1, + -1, + has_act=False, + has_bias=False, + cfg=cfg, + )) + + def forward(self, batch): + for module in self.sublayers(): + batch = module(batch) + return batch + + +class GNN(paddle.nn.Layer): + r"""A general Graph Neural Network (GNN) model.""" + def __init__(self, dim_in: int, dim_out: int, **kwargs): + super().__init__() + GNNStage = register.stage_dict[cfg.gnn.stage_type] + GNNHead = register.head_dict[cfg.gnn.head] + + self.encoder = FeatureEncoder(dim_in) + dim_in = self.encoder.dim_in + + if cfg.gnn.layers_pre_mp > 0: + self.pre_mp = GNNPreMP(dim_in, cfg.gnn.dim_inner, + cfg.gnn.layers_pre_mp) + dim_in = cfg.gnn.dim_inner + if cfg.gnn.layers_mp > 0: + self.mp = GNNStage(dim_in=dim_in, dim_out=cfg.gnn.dim_inner, + num_layers=cfg.gnn.layers_mp) + self.post_mp = GNNHead(dim_in=cfg.gnn.dim_inner, dim_out=dim_out) + + self.apply(init_weights) + + def forward(self, batch): + for module in self.sublayers(): + batch = module(batch) + return batch diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/head.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/head.py new file mode 100644 index 00000000..390241bd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/head.py @@ -0,0 +1,116 @@ +import paddle + +import paddle_geometric.graphgym.register as register +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.models.layer import MLP, new_layer_config +from paddle_geometric.graphgym.register import register_head + + +@register_head('node') +class GNNNodeHead(paddle.nn.Layer): + r"""A GNN prediction head for node-level prediction tasks.""" + + def __init__(self, dim_in: int, dim_out: int): + super().__init__() + self.layer_post_mp = MLP( + new_layer_config( + dim_in, + dim_out, + cfg.gnn.layers_post_mp, + has_act=False, + has_bias=True, + cfg=cfg, + )) + + def _apply_index(self, batch): + x = batch.x + y = batch.y if 'y' in batch else None + + if 'split' not in batch: + return x, y + + mask = batch[f'{batch.split}_mask'] + return x[mask], y[mask] if y is not None else None + + def forward(self, batch): + batch = self.layer_post_mp(batch) + pred, label = self._apply_index(batch) + return pred, label + + +@register_head('edge') +@register_head('link_pred') +class GNNEdgeHead(paddle.nn.Layer): + r"""A GNN prediction head for edge-level/link-level prediction tasks.""" + + def __init__(self, dim_in: int, dim_out: int): + super().__init__() + if cfg.model.edge_decoding == 'concat': + self.layer_post_mp = MLP( + new_layer_config( + dim_in * 2, + dim_out, + cfg.gnn.layers_post_mp, + has_act=False, + has_bias=True, + cfg=cfg, + )) + self.decode_module = lambda v1, v2: \ + self.layer_post_mp(paddle.concat((v1, v2), axis=-1)) + else: + if dim_out > 1: + raise ValueError(f"Binary edge decoding " + f"'{cfg.model.edge_decoding}' is used for " + f"multi-class classification") + self.layer_post_mp = MLP( + new_layer_config( + dim_in, + dim_in, + cfg.gnn.layers_post_mp, + has_act=False, + has_bias=True, + cfg=cfg, + )) + if cfg.model.edge_decoding == 'dot': + self.decode_module = lambda v1, v2: paddle.sum(v1 * v2, axis=-1) + elif cfg.model.edge_decoding == 'cosine_similarity': + self.decode_module = paddle.nn.CosineSimilarity(axis=-1) + else: + raise ValueError(f"Unknown edge decoding " + f"'{cfg.model.edge_decoding}'") + + def _apply_index(self, batch): + index = f'{batch.split}_edge_index' + label = f'{batch.split}_edge_label' + return batch.x[batch[index]], batch[label] + + def forward(self, batch): + if cfg.model.edge_decoding != 'concat': + batch = self.layer_post_mp(batch) + pred, label = self._apply_index(batch) + nodes_first = pred[0] + nodes_second = pred[1] + pred = self.decode_module(nodes_first, nodes_second) + return pred, label + + +@register_head('graph') +class GNNGraphHead(paddle.nn.Layer): + r"""A GNN prediction head for graph-level prediction tasks.""" + + def __init__(self, dim_in: int, dim_out: int): + super().__init__() + self.layer_post_mp = MLP( + new_layer_config(dim_in, dim_out, cfg.gnn.layers_post_mp, + has_act=False, has_bias=True, cfg=cfg)) + self.pooling_fun = register.pooling_dict[cfg.model.graph_pooling] + + def _apply_index(self, batch): + return batch.graph_feature, batch.y + + def forward(self, batch): + graph_emb = self.pooling_fun(batch.x, batch.batch) + graph_emb = self.layer_post_mp(graph_emb) + batch.graph_feature = graph_emb + pred, label = self._apply_index(batch) + return pred, label diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/layer.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/layer.py new file mode 100644 index 00000000..5a6448b8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/layer.py @@ -0,0 +1,340 @@ +import copy +from dataclasses import dataclass + +import paddle +import paddle.nn.functional as F + +import paddle_geometric as pyg +import paddle_geometric.graphgym.models.act +import paddle_geometric.graphgym.register as register +from paddle_geometric.graphgym.contrib.layer.generalconv import ( + GeneralConvLayer, + GeneralEdgeConvLayer, +) +from paddle_geometric.graphgym.register import register_layer +from paddle_geometric.nn import Linear as Linear_pyg + + +@dataclass +class LayerConfig: + has_batchnorm: bool = False + bn_eps: float = 1e-5 + bn_mom: float = 0.1 + mem_inplace: bool = False + dim_in: int = -1 + dim_out: int = -1 + edge_dim: int = -1 + dim_inner: int = None + num_layers: int = 2 + has_bias: bool = True + has_l2norm: bool = True + dropout: float = 0.0 + has_act: bool = True + final_act: bool = True + act: str = 'relu' + keep_edge: float = 0.5 + + +def new_layer_config( + dim_in: int, + dim_out: int, + num_layers: int, + has_act: bool, + has_bias: bool, + cfg, +) -> LayerConfig: + return LayerConfig( + has_batchnorm=cfg.gnn.batchnorm, + bn_eps=cfg.bn.eps, + bn_mom=cfg.bn.mom, + mem_inplace=cfg.mem.inplace, + dim_in=dim_in, + dim_out=dim_out, + edge_dim=cfg.dataset.edge_dim, + has_l2norm=cfg.gnn.l2norm, + dropout=cfg.gnn.dropout, + has_act=has_act, + final_act=True, + act=cfg.gnn.act, + has_bias=has_bias, + keep_edge=cfg.gnn.keep_edge, + dim_inner=cfg.gnn.dim_inner, + num_layers=num_layers, + ) + + +class GeneralLayer(paddle.nn.Layer): + def __init__(self, name, layer_config: LayerConfig, **kwargs): + super().__init__() + self.has_l2norm = layer_config.has_l2norm + has_bn = layer_config.has_batchnorm + layer_config.has_bias = not has_bn + self.layer = register.layer_dict[name](layer_config, **kwargs) + layer_wrapper = [] + if has_bn: + layer_wrapper.append( + paddle.nn.BatchNorm1D( + layer_config.dim_out, + epsilon=layer_config.bn_eps, + momentum=layer_config.bn_mom, + )) + if layer_config.dropout > 0: + layer_wrapper.append( + paddle.nn.Dropout( + p=layer_config.dropout, + axis=-1 if layer_config.mem_inplace else 0, + )) + if layer_config.has_act: + layer_wrapper.append(register.act_dict[layer_config.act]()) + self.post_layer = paddle.nn.Sequential(*layer_wrapper) + + def forward(self, batch): + batch = self.layer(batch) + if isinstance(batch, paddle.Tensor): + batch = self.post_layer(batch) + if self.has_l2norm: + batch = F.normalize(batch, p=2, axis=1) + else: + batch.x = self.post_layer(batch.x) + if self.has_l2norm: + batch.x = F.normalize(batch.x, p=2, axis=1) + return batch + + +class GeneralMultiLayer(paddle.nn.Layer): + def __init__(self, name, layer_config: LayerConfig, **kwargs): + super().__init__() + if layer_config.dim_inner: + dim_inner = layer_config.dim_out + else: + dim_inner = layer_config.dim_inner + + for i in range(layer_config.num_layers): + d_in = layer_config.dim_in if i == 0 else dim_inner + d_out = layer_config.dim_out \ + if i == layer_config.num_layers - 1 else dim_inner + has_act = layer_config.final_act \ + if i == layer_config.num_layers - 1 else True + inter_layer_config = copy.deepcopy(layer_config) + inter_layer_config.dim_in = d_in + inter_layer_config.dim_out = d_out + inter_layer_config.has_act = has_act + layer = GeneralLayer(name, inter_layer_config, **kwargs) + self.add_sublayer(f'Layer_{i}', layer) + + def forward(self, batch): + for layer in self.children(): + batch = layer(batch) + return batch + + +@register_layer('linear') +class Linear(paddle.nn.Layer): + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = Linear_pyg( + layer_config.dim_in, + layer_config.dim_out, + bias_attr=layer_config.has_bias, + ) + + def forward(self, batch): + if isinstance(batch, paddle.Tensor): + batch = self.model(batch) + else: + batch.x = self.model(batch.x) + return batch + + +class BatchNorm1dNode(paddle.nn.Layer): + def __init__(self, layer_config: LayerConfig): + super().__init__() + self.bn = paddle.nn.BatchNorm1D( + layer_config.dim_in, + epsilon=layer_config.bn_eps, + momentum=layer_config.bn_mom, + ) + + def forward(self, batch): + batch.x = self.bn(batch.x) + return batch + + +class BatchNorm1dEdge(paddle.nn.Layer): + def __init__(self, layer_config: LayerConfig): + super().__init__() + self.bn = paddle.nn.BatchNorm1D( + layer_config.dim_in, + epsilon=layer_config.bn_eps, + momentum=layer_config.bn_mom, + ) + + def forward(self, batch): + batch.edge_attr = self.bn(batch.edge_attr) + return batch + +@register.register_layer('mlp') +class MLP(paddle.nn.Layer): + """A basic MLP model.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + dim_inner = layer_config.dim_in if layer_config.dim_inner is None else layer_config.dim_inner + layer_config.has_bias = True + layers = [] + if layer_config.num_layers > 1: + sub_layer_config = LayerConfig( + num_layers=layer_config.num_layers - 1, + dim_in=layer_config.dim_in, + dim_out=dim_inner, + dim_inner=dim_inner, + final_act=True + ) + layers.append(GeneralMLP(sub_layer_config)) + layer_config = replace(layer_config, dim_in=dim_inner) + layers.append(Linear_pyg(layer_config.dim_in, layer_config.dim_out)) + else: + layers.append(Linear_pyg(layer_config.dim_in, layer_config.dim_out)) + self.model = paddle.nn.Sequential(*layers) + + def forward(self, batch): + if isinstance(batch, paddle.Tensor): + return self.model(batch) + batch.x = self.model(batch.x) + return batch + + +@register.register_layer('gcnconv') +class GCNConv(paddle.nn.Layer): + """A Graph Convolutional Network (GCN) layer.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = pyg.nn.GCNConv( + layer_config.dim_in, + layer_config.dim_out, + bias_attr=layer_config.has_bias, + ) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index) + return batch + + +@register.register_layer('sageconv') +class SAGEConv(paddle.nn.Layer): + """A GraphSAGE layer.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = pyg.nn.SAGEConv( + layer_config.dim_in, + layer_config.dim_out, + bias_attr=layer_config.has_bias, + ) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index) + return batch + + +@register.register_layer('gatconv') +class GATConv(paddle.nn.Layer): + """A Graph Attention Network (GAT) layer.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = pyg.nn.GATConv( + layer_config.dim_in, + layer_config.dim_out, + bias_attr=layer_config.has_bias, + ) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index) + return batch + + +@register.register_layer('ginconv') +class GINConv(paddle.nn.Layer): + """A Graph Isomorphism Network (GIN) layer.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + gin_nn = paddle.nn.Sequential( + Linear_pyg(layer_config.dim_in, layer_config.dim_out), + paddle.nn.ReLU(), + Linear_pyg(layer_config.dim_out, layer_config.dim_out), + ) + self.model = pyg.nn.GINConv(gin_nn) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index) + return batch + + +@register.register_layer('splineconv') +class SplineConv(paddle.nn.Layer): + """A SplineCNN layer.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = pyg.nn.SplineConv( + layer_config.dim_in, + layer_config.dim_out, + dim=1, + kernel_size=2, + bias_attr=layer_config.has_bias, + ) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index, batch.edge_attr) + return batch + + +@register.register_layer('generalconv') +class GeneralConv(paddle.nn.Layer): + """A general GNN layer.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = GeneralConvLayer( + layer_config.dim_in, + layer_config.dim_out, + bias=layer_config.has_bias, + ) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index) + return batch + + +@register.register_layer('generaledgeconv') +class GeneralEdgeConv(paddle.nn.Layer): + """A general GNN layer with edge feature support.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = GeneralEdgeConvLayer( + layer_config.dim_in, + layer_config.dim_out, + layer_config.edge_dim, + bias=layer_config.has_bias, + ) + + def forward(self, batch): + batch.x = self.model(batch.x, batch.edge_index, edge_feature=batch.edge_attr) + return batch + + +@register.register_layer('generalsampleedgeconv') +class GeneralSampleEdgeConv(paddle.nn.Layer): + """A general GNN layer that supports edge features and edge sampling.""" + def __init__(self, layer_config: LayerConfig, **kwargs): + super().__init__() + self.model = GeneralEdgeConvLayer( + layer_config.dim_in, + layer_config.dim_out, + layer_config.edge_dim, + bias=layer_config.has_bias, + ) + self.keep_edge = layer_config.keep_edge + + def forward(self, batch): + edge_mask = paddle.rand([batch.edge_index.shape[1]]) < self.keep_edge + edge_index = batch.edge_index[:, edge_mask] + edge_feature = batch.edge_attr[edge_mask, :] + batch.x = self.model(batch.x, edge_index, edge_feature=edge_feature) + return batch \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/pooling.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/pooling.py new file mode 100644 index 00000000..ceed926e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/pooling.py @@ -0,0 +1,10 @@ +from paddle_geometric.graphgym.register import register_pooling +from paddle_geometric.nn import ( + global_add_pool, + global_max_pool, + global_mean_pool, +) + +register_pooling('add', global_add_pool) +register_pooling('mean', global_mean_pool) +register_pooling('max', global_max_pool) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/models/transform.py b/jointContribution/mattergen/paddle_geometric/graphgym/models/transform.py new file mode 100644 index 00000000..06a9e6b0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/models/transform.py @@ -0,0 +1,37 @@ +import paddle + +from paddle_geometric.utils import negative_sampling + + +def create_link_label(pos_edge_index, neg_edge_index): + """Create labels for link prediction, based on positive and negative edges. + + Args: + pos_edge_index (paddle.Tensor): Positive edge index [2, num_edges] + neg_edge_index (paddle.Tensor): Negative edge index [2, num_edges] + + Returns: Link label tensor, [num_positive_edges + num_negative_edges] + """ + num_links = pos_edge_index.shape[1] + neg_edge_index.shape[1] + link_labels = paddle.zeros([num_links], dtype='float32', place=pos_edge_index.place) + link_labels[:pos_edge_index.shape[1]] = 1.0 + return link_labels + + +def neg_sampling_transform(data): + """Perform negative sampling for link prediction tasks. + + Args: + data (paddle_geometric.data.Data): Input data object + + Returns: Transformed data object with negative edges and link prediction labels. + """ + train_neg_edge_index = negative_sampling( + edge_index=data.train_pos_edge_index, num_nodes=data.num_nodes, + num_neg_samples=data.train_pos_edge_index.shape[1]) + + data.train_edge_index = paddle.concat( + [data.train_pos_edge_index, train_neg_edge_index], axis=-1) + data.train_edge_label = create_link_label(data.train_pos_edge_index, train_neg_edge_index) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/optim.py b/jointContribution/mattergen/paddle_geometric/graphgym/optim.py new file mode 100644 index 00000000..a3477fea --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/optim.py @@ -0,0 +1,72 @@ +from dataclasses import dataclass, field +from typing import Any, Iterator, List, Optional + +from paddle import ParamAttr +from paddle.optimizer import Adam, SGD, Optimizer +from paddle.optimizer.lr import CosineAnnealingDecay, MultiStepDecay, StepDecay + +import paddle_geometric.graphgym.register as register +from paddle_geometric.graphgym.config import from_config + + +@dataclass +class OptimizerConfig: + optimizer: str = 'adam' # ['sgd', 'adam'] + base_lr: float = 0.01 + weight_decay: float = 5e-4 + momentum: float = 0.9 # 'sgd' policy + + +@register.register_optimizer('adam') +def adam_optimizer(params: Iterator[ParamAttr], base_lr: float, + weight_decay: float) -> Adam: + return Adam(parameters=params, learning_rate=base_lr, weight_decay=weight_decay) + + +@register.register_optimizer('sgd') +def sgd_optimizer(params: Iterator[ParamAttr], base_lr: float, momentum: float, + weight_decay: float) -> SGD: + return SGD(parameters=params, learning_rate=base_lr, momentum=momentum, + weight_decay=weight_decay) + + +def create_optimizer(params: Iterator[ParamAttr], cfg: Any) -> Any: + """Creates a config-driven optimizer.""" + params = filter(lambda p: p.stop_gradient is False, params) + func = register.optimizer_dict.get(cfg.optimizer, None) + if func is not None: + return from_config(func)(params, cfg=cfg) + raise ValueError(f"Optimizer '{cfg.optimizer}' not supported") + + +@dataclass +class SchedulerConfig: + scheduler: Optional[str] = 'cos' # [None, 'steps', 'cos'] + steps: List[int] = field(default_factory=lambda: [30, 60, 90]) # 'steps' policy + lr_decay: float = 0.1 # 'steps' policy + max_epoch: int = 200 + + +@register.register_scheduler(None) +@register.register_scheduler('none') +def none_scheduler(optimizer: Optimizer, max_epoch: int) -> StepDecay: + return StepDecay(learning_rate=optimizer.get_lr(), step_size=max_epoch + 1) + + +@register.register_scheduler('step') +def step_scheduler(optimizer: Optimizer, steps: List[int], + lr_decay: float) -> MultiStepDecay: + return MultiStepDecay(learning_rate=optimizer.get_lr(), milestones=steps, gamma=lr_decay) + + +@register.register_scheduler('cos') +def cos_scheduler(optimizer: Optimizer, max_epoch: int) -> CosineAnnealingDecay: + return CosineAnnealingDecay(learning_rate=optimizer.get_lr(), T_max=max_epoch) + + +def create_scheduler(optimizer: Optimizer, cfg: Any) -> Any: + """Creates a config-driven learning rate scheduler.""" + func = register.scheduler_dict.get(cfg.scheduler, None) + if func is not None: + return from_config(func)(optimizer, cfg=cfg) + raise ValueError(f"Scheduler '{cfg.scheduler}' not supported") diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/register.py b/jointContribution/mattergen/paddle_geometric/graphgym/register.py new file mode 100644 index 00000000..1b1e24ac --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/register.py @@ -0,0 +1,123 @@ +from typing import Any, Callable, Dict, Union + +act_dict: Dict[str, Any] = {} +node_encoder_dict: Dict[str, Any] = {} +edge_encoder_dict: Dict[str, Any] = {} +stage_dict: Dict[str, Any] = {} +head_dict: Dict[str, Any] = {} +layer_dict: Dict[str, Any] = {} +pooling_dict: Dict[str, Any] = {} +network_dict: Dict[str, Any] = {} +config_dict: Dict[str, Any] = {} +dataset_dict: Dict[str, Any] = {} +loader_dict: Dict[str, Any] = {} +optimizer_dict: Dict[str, Any] = {} +scheduler_dict: Dict[str, Any] = {} +loss_dict: Dict[str, Any] = {} +train_dict: Dict[str, Any] = {} +metric_dict: Dict[str, Any] = {} + + +def register_base(mapping: Dict[str, Any], key: str, + module: Any = None) -> Union[None, Callable]: + r"""Base function for registering a module in GraphGym. + + Args: + mapping (dict): :python:`Python` dictionary to register the module. + hosting all the registered modules + key (str): The name of the module. + module (any, optional): The module. If set to :obj:`None`, will return + a decorator to register a module. + """ + if module is not None: + if key in mapping: + raise KeyError(f"Module with '{key}' already defined") + mapping[key] = module + return + + # Other-wise, use it as a decorator: + def bounded_register(module): + register_base(mapping, key, module) + return module + + return bounded_register + + +def register_act(key: str, module: Any = None): + r"""Registers an activation function in GraphGym.""" + return register_base(act_dict, key, module) + + +def register_node_encoder(key: str, module: Any = None): + r"""Registers a node feature encoder in GraphGym.""" + return register_base(node_encoder_dict, key, module) + + +def register_edge_encoder(key: str, module: Any = None): + r"""Registers an edge feature encoder in GraphGym.""" + return register_base(edge_encoder_dict, key, module) + + +def register_stage(key: str, module: Any = None): + r"""Registers a customized GNN stage in GraphGym.""" + return register_base(stage_dict, key, module) + + +def register_head(key: str, module: Any = None): + r"""Registers a GNN prediction head in GraphGym.""" + return register_base(head_dict, key, module) + + +def register_layer(key: str, module: Any = None): + r"""Registers a GNN layer in GraphGym.""" + return register_base(layer_dict, key, module) + + +def register_pooling(key: str, module: Any = None): + r"""Registers a GNN global pooling/readout layer in GraphGym.""" + return register_base(pooling_dict, key, module) + + +def register_network(key: str, module: Any = None): + r"""Registers a GNN model in GraphGym.""" + return register_base(network_dict, key, module) + + +def register_config(key: str, module: Any = None): + r"""Registers a configuration group in GraphGym.""" + return register_base(config_dict, key, module) + + +def register_dataset(key: str, module: Any = None): + r"""Registers a dataset in GraphGym.""" + return register_base(dataset_dict, key, module) + + +def register_loader(key: str, module: Any = None): + r"""Registers a data loader in GraphGym.""" + return register_base(loader_dict, key, module) + + +def register_optimizer(key: str, module: Any = None): + r"""Registers an optimizer in GraphGym.""" + return register_base(optimizer_dict, key, module) + + +def register_scheduler(key: str, module: Any = None): + r"""Registers a learning rate scheduler in GraphGym.""" + return register_base(scheduler_dict, key, module) + + +def register_loss(key: str, module: Any = None): + r"""Registers a loss function in GraphGym.""" + return register_base(loss_dict, key, module) + + +def register_train(key: str, module: Any = None): + r"""Registers a training function in GraphGym.""" + return register_base(train_dict, key, module) + + +def register_metric(key: str, module: Any = None): + r"""Register a metric function in GraphGym.""" + return register_base(metric_dict, key, module) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/train.py b/jointContribution/mattergen/paddle_geometric/graphgym/train.py new file mode 100644 index 00000000..783659b5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/train.py @@ -0,0 +1,74 @@ +import warnings +from typing import Any, Dict, Optional + +from paddle.io import DataLoader + +from paddle_geometric.data.lightning.datamodule import LightningDataModule +from paddle_geometric.graphgym import create_loader +from paddle_geometric.graphgym.checkpoint import get_ckpt_dir +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.logger import LoggerCallback +from paddle_geometric.graphgym.model_builder import GraphGymModule + + +class GraphGymDataModule(LightningDataModule): + r"""A :class:`paddle_lightning.LightningDataModule` for handling data + loading routines in GraphGym. + + This class provides data loaders for training, validation, and testing, and + can be accessed through the :meth:`train_dataloader`, + :meth:`val_dataloader`, and :meth:`test_dataloader` methods, respectively. + """ + def __init__(self): + self.loaders = create_loader() + super().__init__(has_val=True, has_test=True) + + def train_dataloader(self) -> DataLoader: + return self.loaders[0] + + def val_dataloader(self) -> DataLoader: + # better way would be to test after fit. + # First call trainer.fit(...) then trainer.test(...) + return self.loaders[1] + + def test_dataloader(self) -> DataLoader: + return self.loaders[2] + + +def train( + model: GraphGymModule, + datamodule: GraphGymDataModule, + logger: bool = True, + trainer_config: Optional[Dict[str, Any]] = None, +): + r"""Trains a GraphGym model using Paddle Lightning. + + Args: + model (GraphGymModule): The GraphGym model. + datamodule (GraphGymDataModule): The GraphGym data module. + logger (bool, optional): Whether to enable logging during training. + (default: :obj:`True`) + trainer_config (dict, optional): Additional trainer configuration. + """ + warnings.filterwarnings('ignore', '.*use `CSVLogger` as the default.*') + + callbacks = [] + if logger: + callbacks.append(LoggerCallback()) + if cfg.train.enable_ckpt: + ckpt_cbk = pl.callbacks.ModelCheckpoint(dirpath=get_ckpt_dir()) + callbacks.append(ckpt_cbk) + + trainer_config = trainer_config or {} + trainer = pl.Trainer( + **trainer_config, + enable_checkpointing=cfg.train.enable_ckpt, + callbacks=callbacks, + default_root_dir=cfg.out_dir, + max_epochs=cfg.optim.max_epoch, + accelerator=cfg.accelerator, + devices='auto' if not paddle.is_compiled_with_cuda() else cfg.devices, + ) + + trainer.fit(model, datamodule=datamodule) + trainer.test(model, datamodule=datamodule) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/LICENSE b/jointContribution/mattergen/paddle_geometric/graphgym/utils/LICENSE new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/__init__.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/__init__.py new file mode 100644 index 00000000..6132029c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/__init__.py @@ -0,0 +1,24 @@ +from .agg_runs import agg_runs, agg_batch +from .comp_budget import params_count, match_baseline_cfg +from .device import get_current_gpu_usage, auto_select_device +from .epoch import is_eval_epoch, is_ckpt_epoch +from .io import dict_to_json, dict_list_to_json, dict_to_tb, makedirs_rm_exist +from .tools import dummy_context + +__all__ = [ + 'agg_runs', + 'agg_batch', + 'params_count', + 'match_baseline_cfg', + 'get_current_gpu_usage', + 'auto_select_device', + 'is_eval_epoch', + 'is_ckpt_epoch', + 'dict_to_json', + 'dict_list_to_json', + 'dict_to_tb', + 'makedirs_rm_exist', + 'dummy_context', +] + +classes = __all__ diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/agg_runs.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/agg_runs.py new file mode 100644 index 00000000..119e8645 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/agg_runs.py @@ -0,0 +1,181 @@ +import logging +import os +import os.path as osp + +import numpy as np +import paddle + +from paddle_geometric.graphgym.config import cfg +from paddle_geometric.graphgym.utils.io import ( + dict_list_to_json, + dict_list_to_tb, + dict_to_json, + json_to_dict_list, + makedirs_rm_exist, + string_to_python, +) + +try: + from visualdl import LogWriter # PaddlePaddle's equivalent to TensorboardX +except ImportError: + LogWriter = None + + +def is_seed(s): + try: + int(s) + return True + except Exception: + return False + + +def is_split(s): + return s in ['train', 'val'] + + +def join_list(l1, l2): + assert len(l1) == len(l2), \ + 'Results with different seeds must have the same format' + for i in range(len(l1)): + l1[i] += l2[i] + return l1 + + +def agg_dict_list(dict_list): + """Aggregate a list of dictionaries: mean + std + Args: + dict_list: list of dictionaries. + """ + dict_agg = {'epoch': dict_list[0]['epoch']} + for key in dict_list[0]: + if key != 'epoch': + value = np.array([dict[key] for dict in dict_list]) + dict_agg[key] = np.mean(value).round(cfg.round) + dict_agg[f'{key}_std'] = np.std(value).round(cfg.round) + return dict_agg + + +def name_to_dict(run): + run = run.split('-', 1)[-1] + cols = run.split('=') + keys, vals = [], [] + keys.append(cols[0]) + for col in cols[1:-1]: + try: + val, key = col.rsplit('-', 1) + except Exception: + print(col) + keys.append(key) + vals.append(string_to_python(val)) + vals.append(cols[-1]) + return dict(zip(keys, vals)) + + +def rm_keys(dict, keys): + for key in keys: + dict.pop(key, None) + + +def agg_runs(dir, metric_best='auto'): + r"""Aggregate over different random seeds of a single experiment. + + Args: + dir (str): Directory of the results, containing 1 experiment + metric_best (str, optional): The metric for selecting the best + validation performance. Options: auto, accuracy, auc. + """ + results = {'train': None, 'val': None} + results_best = {'train': None, 'val': None} + for seed in os.listdir(dir): + if is_seed(seed): + dir_seed = osp.join(dir, seed) + + split = 'val' + if split in os.listdir(dir_seed): + dir_split = osp.join(dir_seed, split) + fname_stats = osp.join(dir_split, 'stats.json') + stats_list = json_to_dict_list(fname_stats) + if metric_best == 'auto': + metric = 'auc' if 'auc' in stats_list[0] else 'accuracy' + else: + metric = metric_best + performance_np = np.array([stats[metric] for stats in stats_list]) + best_epoch = stats_list[eval(f"performance_np.{cfg.metric_agg}()")]['epoch'] + print(best_epoch) + + for split in os.listdir(dir_seed): + if is_split(split): + dir_split = osp.join(dir_seed, split) + fname_stats = osp.join(dir_split, 'stats.json') + stats_list = json_to_dict_list(fname_stats) + stats_best = [stats for stats in stats_list if stats['epoch'] == best_epoch][0] + print(stats_best) + stats_list = [[stats] for stats in stats_list] + if results[split] is None: + results[split] = stats_list + else: + results[split] = join_list(results[split], stats_list) + if results_best[split] is None: + results_best[split] = [stats_best] + else: + results_best[split] += [stats_best] + results = {k: v for k, v in results.items() if v is not None} + results_best = {k: v for k, v in results_best.items() if v is not None} + for key in results: + for i in range(len(results[key])): + results[key][i] = agg_dict_list(results[key][i]) + for key in results_best: + results_best[key] = agg_dict_list(results_best[key]) + + # save aggregated results + for key, value in results.items(): + dir_out = osp.join(dir, 'agg', key) + makedirs_rm_exist(dir_out) + fname = osp.join(dir_out, 'stats.json') + dict_list_to_json(value, fname) + + if cfg.tensorboard_agg: + if LogWriter is None: + raise ImportError('Tensorboard support requires `visualdl` package.') + writer = LogWriter(dir_out) + dict_list_to_tb(value, writer) + writer.close() + for key, value in results_best.items(): + dir_out = osp.join(dir, 'agg', key) + fname = osp.join(dir_out, 'best.json') + dict_to_json(value, fname) + logging.info('Results aggregated across runs saved in {}'.format(osp.join(dir, 'agg'))) + + +def agg_batch(dir, metric_best='auto'): + r"""Aggregate across results from multiple experiments via grid search. + + Args: + dir (str): Directory of the results, containing multiple experiments + metric_best (str, optional): The metric for selecting the best + validation performance. Options: auto, accuracy, auc. + """ + import pandas as pd + results = {'train': [], 'val': [], 'test': []} + for run in os.listdir(dir): + if run != 'agg': + dict_name = name_to_dict(run) + dir_run = osp.join(dir, run, 'agg') + if osp.isdir(dir_run): + for split in os.listdir(dir_run): + dir_split = osp.join(dir_run, split) + fname_stats = osp.join(dir_split, 'best.json') + dict_stats = json_to_dict_list(fname_stats)[-1] # get best val epoch + rm_keys(dict_stats, ['lr', 'lr_std', 'eta', 'eta_std', 'params_std']) + results[split].append({**dict_name, **dict_stats}) + dir_out = osp.join(dir, 'agg') + makedirs_rm_exist(dir_out) + for key in results: + if len(results[key]) > 0: + results[key] = pd.DataFrame(results[key]) + results[key] = results[key].sort_values(list(dict_name.keys()), ascending=[True] * len(dict_name)) + fname = osp.join(dir_out, f'{key}_best.csv') + results[key].to_csv(fname, index=False) + + # Repeat for final epoch results and best epoch results + print(f'Results aggregated across models saved in {dir_out}') diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/comp_budget.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/comp_budget.py new file mode 100644 index 00000000..90b61bc5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/comp_budget.py @@ -0,0 +1,91 @@ +import math + +from paddle_geometric.graphgym.config import cfg, set_cfg +from paddle_geometric.graphgym.model_builder import create_model + + +def params_count(model): + """Computes the number of parameters. + + Args: + model (nn.Module): PyTorch model + """ + return sum([p.numel() for p in model.parameters()]) + + +def get_stats(): + model = create_model(to_device=False, dim_in=1, dim_out=1) + return params_count(model) + + +def match_computation(stats_baseline, key=['gnn', 'dim_inner'], mode='sqrt'): + """Match computation budget by modifying :obj:`cfg.gnn.dim_inner`.""" + stats = get_stats() + if stats != stats_baseline: + # Phase 1: fast approximation + while True: + if mode == 'sqrt': + scale = math.sqrt(stats_baseline / stats) + elif mode == 'linear': + scale = stats_baseline / stats + step = int(round(cfg[key[0]][key[1]] * scale)) \ + - cfg[key[0]][key[1]] + cfg[key[0]][key[1]] += step + stats = get_stats() + if abs(step) <= 1: + break + # Phase 2: fine tune + flag_init = 1 if stats < stats_baseline else -1 + step = 1 + while True: + cfg[key[0]][key[1]] += flag_init * step + stats = get_stats() + flag = 1 if stats < stats_baseline else -1 + if stats == stats_baseline: + return stats + if flag != flag_init: + if not cfg.model.match_upper: # stats is SMALLER + if flag < 0: + cfg[key[0]][key[1]] -= flag_init * step + return get_stats() + else: + if flag > 0: + cfg[key[0]][key[1]] -= flag_init * step + return get_stats() + return stats + + +def dict_to_stats(cfg_dict): + from yacs.config import CfgNode as CN + set_cfg(cfg) + cfg_new = CN(cfg_dict) + cfg.merge_from_other_cfg(cfg_new) + stats = get_stats() + set_cfg(cfg) + return stats + + +def match_baseline_cfg(cfg_dict, cfg_dict_baseline, verbose=True): + """Match the computational budget of a given baseline model. The current + configuration dictionary will be modifed and returned. + + Args: + cfg_dict (dict): Current experiment's configuration + cfg_dict_baseline (dict): Baseline configuration + verbose (str, optional): If printing matched paramter conunts + """ + from yacs.config import CfgNode as CN + stats_baseline = dict_to_stats(cfg_dict_baseline) + set_cfg(cfg) + cfg_new = CN(cfg_dict) + cfg.merge_from_other_cfg(cfg_new) + stats = match_computation(stats_baseline, key=['gnn', 'dim_inner']) + if 'gnn' in cfg_dict: + cfg_dict['gnn']['dim_inner'] = cfg.gnn.dim_inner + else: + cfg_dict['gnn'] = {'dim_inner', cfg.gnn.dim_inner} + set_cfg(cfg) + if verbose: + print(f"Computational budget has matched - Baseline params: " + f"{stats_baseline}, Current params: {stats}") + return cfg_dict diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/device.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/device.py new file mode 100644 index 00000000..d588a6a2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/device.py @@ -0,0 +1,53 @@ +import os +import subprocess +import numpy as np +import paddle + +from paddle_geometric.graphgym.config import cfg + + +def get_gpu_memory_map(): + """Get the current GPU usage.""" + try: + result = subprocess.check_output([ + 'nvidia-smi', '--query-gpu=memory.used', + '--format=csv,nounits,noheader' + ], encoding='utf-8') + gpu_memory = np.array([int(x) for x in result.strip().split('\n')]) + return gpu_memory + except subprocess.CalledProcessError as e: + print(f"Error accessing GPU memory: {e}") + return np.array([]) + + +def get_current_gpu_usage(): + """Get the current GPU memory usage for the current process.""" + if cfg.gpu_mem and cfg.device != 'cpu' and paddle.device.is_compiled_with_cuda(): + try: + result = subprocess.check_output([ + 'nvidia-smi', '--query-compute-apps=pid,used_memory', + '--format=csv,nounits,noheader' + ], encoding='utf-8') + current_pid = os.getpid() + used_memory = 0 + for line in result.strip().split('\n'): + line = line.split(', ') + if current_pid == int(line[0]): + used_memory += int(line[1]) + return used_memory + except subprocess.CalledProcessError as e: + print(f"Error accessing GPU memory usage: {e}") + return -1 + else: + return -1 + + +def auto_select_device(): + """Automatically select device for the current experiment.""" + if cfg.accelerator == 'auto': + if paddle.device.is_compiled_with_cuda(): + cfg.accelerator = 'gpu' + cfg.devices = 1 + else: + cfg.accelerator = 'cpu' + cfg.devices = None diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/epoch.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/epoch.py new file mode 100644 index 00000000..494b12e4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/epoch.py @@ -0,0 +1,18 @@ +from paddle_geometric.graphgym.config import cfg + + +def is_train_eval_epoch(cur_epoch): + """Determines if the model should be evaluated at the training epoch.""" + return is_eval_epoch(cur_epoch) or not cfg.train.skip_train_eval + + +def is_eval_epoch(cur_epoch): + """Determines if the model should be evaluated at the current epoch.""" + return ((cur_epoch + 1) % cfg.train.eval_period == 0 or cur_epoch == 0 + or (cur_epoch + 1) == cfg.optim.max_epoch) + + +def is_ckpt_epoch(cur_epoch): + """Determines if the model should be evaluated at the current epoch.""" + return ((cur_epoch + 1) % cfg.train.ckpt_period == 0 + or (cur_epoch + 1) == cfg.optim.max_epoch) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/io.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/io.py new file mode 100644 index 00000000..b8871fdd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/io.py @@ -0,0 +1,82 @@ +import ast +import json +import os +import os.path as osp + +from paddle_geometric.io import fs + + +def string_to_python(string): + try: + return ast.literal_eval(string) + except Exception: + return string + + +def dict_to_json(dict, fname): + """Dump a :python:`Python` dictionary to a JSON file. + + Args: + dict (dict): The :python:`Python` dictionary. + fname (str): The output file name. + """ + with open(fname, 'a') as f: + json.dump(dict, f) + f.write('\n') + + +def dict_list_to_json(dict_list, fname): + """Dump a list of :python:`Python` dictionaries to a JSON file. + + Args: + dict_list (list of dict): List of :python:`Python` dictionaries. + fname (str): the output file name. + """ + with open(fname, 'a') as f: + for dict in dict_list: + json.dump(dict, f) + f.write('\n') + + +def json_to_dict_list(fname): + dict_list = [] + epoch_set = set() + with open(fname) as f: + lines = f.readlines() + for line in lines: + line = line.rstrip() + dict = json.loads(line) + if dict['epoch'] not in epoch_set: + dict_list.append(dict) + epoch_set.add(dict['epoch']) + return dict_list + + +def dict_to_tb(dict, writer, epoch): + """Add a dictionary of statistics to a Tensorboard writer. + + Args: + dict (dict): Statistics of experiments, the keys are attribute names, + the values are the attribute values + writer: Tensorboard writer object + epoch (int): The current epoch + """ + for key in dict: + writer.add_scalar(key, dict[key], epoch) + + +def dict_list_to_tb(dict_list, writer): + for dict in dict_list: + assert 'epoch' in dict, 'Key epoch must exist in stats dict' + dict_to_tb(dict, writer, dict['epoch']) + + +def makedirs_rm_exist(dir): + """Make a directory, remove any existing data. + + Args: + dir (str): The directory to be created. + """ + if osp.isdir(dir): + fs.rm(dir) + os.makedirs(dir, exist_ok=True) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/plot.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/plot.py new file mode 100644 index 00000000..79958127 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/plot.py @@ -0,0 +1,23 @@ +import os.path as osp + + +def view_emb(emb, dir): + """Visualize a embedding matrix. + + Args: + emb (torch.tensor): Embedding matrix with shape (N, D). D is the + feature dimension. + dir (str): Output directory for the embedding figure. + """ + import matplotlib.pyplot as plt + import seaborn as sns + from sklearn.decomposition import PCA + + sns.set_context('poster') + + if emb.shape[1] > 2: + pca = PCA(n_components=2) + emb = pca.fit_transform(emb) + plt.figure(figsize=(10, 10)) + plt.scatter(emb[:, 0], emb[:, 1]) + plt.savefig(osp.join(dir, 'emb_pca.png'), dpi=100) diff --git a/jointContribution/mattergen/paddle_geometric/graphgym/utils/tools.py b/jointContribution/mattergen/paddle_geometric/graphgym/utils/tools.py new file mode 100644 index 00000000..f9532733 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/graphgym/utils/tools.py @@ -0,0 +1,7 @@ +class dummy_context(): + """Default context manager that does nothing.""" + def __enter__(self): + return None + + def __exit__(self, exc_type, exc_value, traceback): + return False diff --git a/jointContribution/mattergen/paddle_geometric/home.py b/jointContribution/mattergen/paddle_geometric/home.py new file mode 100644 index 00000000..ec170406 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/home.py @@ -0,0 +1,30 @@ +import os +import os.path as osp +from typing import Optional + +ENV_PYG_HOME = 'PYG_HOME' +DEFAULT_CACHE_DIR = osp.join('~', '.cache', 'pyg') + +_home_dir: Optional[str] = None + + +def get_home_dir() -> str: + r"""Get the cache directory used for storing all :pyg:`PyG`-related data. + + If :meth:`set_home_dir` is not called, the path is given by the environment + variable :obj:`$PYG_HOME` which defaults to :obj:`"~/.cache/pyg"`. + """ + if _home_dir is not None: + return _home_dir + + return osp.expanduser(os.getenv(ENV_PYG_HOME, DEFAULT_CACHE_DIR)) + + +def set_home_dir(path: str) -> None: + r"""Set the cache directory used for storing all :pyg:`PyG`-related data. + + Args: + path (str): The path to a local folder. + """ + global _home_dir + _home_dir = path diff --git a/jointContribution/mattergen/paddle_geometric/index.py b/jointContribution/mattergen/paddle_geometric/index.py new file mode 100644 index 00000000..1752b8f5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/index.py @@ -0,0 +1,162 @@ +import functools +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + NamedTuple, + Optional, + Tuple, + Type, + Union, +) + +import paddle +import paddle_geometric.typing as pyg_typing +from paddle import Tensor + + +HANDLED_FUNCTIONS: Dict[Callable, Callable] = {} + + +def ptr2index(ptr: Tensor, output_size: Optional[int] = None) -> Tensor: + index = paddle.arange(ptr.shape[0] - 1, dtype=ptr.dtype) + return index.repeat_interleave(paddle.diff(ptr), output_size=output_size) + + +def index2ptr(index: Tensor, size: Optional[int] = None) -> Tensor: + if size is None: + size = int(index.max()) + 1 if index.shape[0] > 0 else 0 + + return paddle.incubate.sparse.convert_indices_from_coo_to_csr( + index, size, out_int32=index.dtype != paddle.int64) + + +class CatMetadata(NamedTuple): + nnz: List[int] + dim_size: List[Optional[int]] + is_sorted: List[bool] + + +def implements(paddle_function: Callable) -> Callable: + r"""Registers a PaddlePaddle function override.""" + @functools.wraps(paddle_function) + def decorator(my_function: Callable) -> Callable: + HANDLED_FUNCTIONS[paddle_function] = my_function + return my_function + + return decorator + + +def assert_valid_dtype(tensor: Tensor) -> None: + if tensor.dtype not in pyg_typing.INDEX_DTYPES: + raise ValueError(f"'Index' holds an unsupported data type " + f"(got '{tensor.dtype}', but expected one of " + f"{pyg_typing.INDEX_DTYPES})") + + +def assert_one_dimensional(tensor: Tensor) -> None: + if len(tensor.shape) != 1: + raise ValueError(f"'Index' needs to be one-dimensional " + f"(got {len(tensor.shape)} dimensions)") + + +def assert_contiguous(tensor: Tensor) -> None: + if not tensor.is_contiguous(): + raise ValueError("'Index' needs to be contiguous. Please call " + "`index.contiguous()` before proceeding.") + + +def assert_sorted(func: Callable) -> Callable: + @functools.wraps(func) + def wrapper(self: 'Index', *args: Any, **kwargs: Any) -> Any: + if not self.is_sorted: + cls_name = self.__class__.__name__ + raise ValueError( + f"Cannot call '{func.__name__}' since '{cls_name}' is not " + f"sorted. Please call `{cls_name}.sort()` first.") + return func(self, *args, **kwargs) + + return wrapper + + +class Index(Tensor): + r"""A one-dimensional `index` tensor with additional (meta)data attached. + + :class:`Index` is a subclass of :class:`paddle.Tensor` that holds + indices of shape `[num_indices]`. + + It includes: + - `dim_size`: The size of the underlying sparse vector size. + - `is_sorted`: Whether indices are sorted in ascending order. + """ + _data: Tensor + _dim_size: Optional[int] = None + _is_sorted: bool = False + _indptr: Optional[Tensor] = None + _cat_metadata: Optional[CatMetadata] = None + + @staticmethod + def __new__( + cls: Type, + data: Any, + *args: Any, + dim_size: Optional[int] = None, + is_sorted: bool = False, + **kwargs: Any, + ) -> 'Index': + if not isinstance(data, Tensor): + data = paddle.to_tensor(data, *args, **kwargs) + + assert_valid_dtype(data) + assert_one_dimensional(data) + assert_contiguous(data) + + out = data # Tensor subclassing is handled by wrapping logic + + # Attach metadata: + out._dim_size = dim_size + out._is_sorted = is_sorted + + return out + + def validate(self) -> 'Index': + r"""Validates the `Index` representation.""" + assert_valid_dtype(self._data) + assert_one_dimensional(self._data) + assert_contiguous(self._data) + + if self.shape[0] > 0 and self._data.min() < 0: + raise ValueError(f"'Index' contains negative indices") + + if (self.shape[0] > 0 and self.dim_size is not None + and self._data.max() >= self.dim_size): + raise ValueError(f"'Index' contains indices larger than dim_size") + + if self.is_sorted and (paddle.diff(self._data) < 0).any(): + raise ValueError(f"'Index' is not sorted") + + return self + + @property + def dim_size(self) -> Optional[int]: + return self._dim_size + + @property + def is_sorted(self) -> bool: + return self._is_sorted + + def get_dim_size(self) -> int: + if self._dim_size is None: + self._dim_size = int(self._data.max()) + 1 if self.shape[0] > 0 else 0 + return self._dim_size + + def as_tensor(self) -> Tensor: + return self._data + + def __repr__(self) -> str: + prefix = f'{self.__class__.__name__}(' + tensor_str = self._data.__str__() + suffixes = [f'dim_size={self.dim_size}', f'is_sorted={self.is_sorted}'] + return f"{prefix}{tensor_str}, {', '.join(suffixes)})" diff --git a/jointContribution/mattergen/paddle_geometric/inspector.py b/jointContribution/mattergen/paddle_geometric/inspector.py new file mode 100644 index 00000000..93bb452f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/inspector.py @@ -0,0 +1,541 @@ +import inspect +import re +import sys +import typing +from typing import Any, Callable, Dict, List, NamedTuple, Optional, Type, Union + +import paddle +from paddle import Tensor + + +class Parameter(NamedTuple): + name: str + type: Type + type_repr: str + default: Any + + +class Signature(NamedTuple): + param_dict: Dict[str, Parameter] + return_type: Type + return_type_repr: str + + +class Inspector: + r"""Inspects a given class and collects information about its instance + methods. + + Args: + cls (Type): The class to inspect. + """ + def __init__(self, cls: Type): + self._cls = cls + self._signature_dict: Dict[str, Signature] = {} + self._source_dict: Dict[str, str] = {} + + def _get_modules(self, cls: Type) -> List[str]: + from paddle_geometric.nn import MessagePassing + + modules: List[str] = [] + for base_cls in cls.__bases__: + if base_cls not in {object, paddle.nn.Layer, MessagePassing}: + modules.extend(self._get_modules(base_cls)) + + modules.append(cls.__module__) + return modules + + @property + def _modules(self) -> List[str]: + return self._get_modules(self._cls) + + @property + def _globals(self) -> Dict[str, Any]: + out: Dict[str, Any] = {} + for module in self._modules: + out.update(sys.modules[module].__dict__) + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self._cls.__name__})' + + def eval_type(self, value: Any) -> Type: + r"""Returns the type hint of a string.""" + return eval_type(value, self._globals) + + def type_repr(self, obj: Any) -> str: + r"""Returns the type hint representation of an object.""" + return type_repr(obj, self._globals) + + def implements(self, func_name: str) -> bool: + r"""Returns :obj:`True` in case the inspected class implements the + :obj:`func_name` method. + + Args: + func_name (str): The function name to check for existence. + """ + func = getattr(self._cls, func_name, None) + if not callable(func): + return False + return not getattr(func, '__isabstractmethod__', False) + + # Inspecting Method Signatures ############################################ + + def inspect_signature( + self, + func: Union[Callable, str], + exclude: Optional[List[Union[str, int]]] = None, + ) -> Signature: + r"""Inspects the function signature of :obj:`func` and returns a tuple + of parameter types and return type. + + Args: + func (callabel or str): The function. + exclude (list[int or str]): A list of parameters to exclude, either + given by their name or index. (default: :obj:`None`) + """ + if isinstance(func, str): + func = getattr(self._cls, func) + assert callable(func) + + if func.__name__ in self._signature_dict: + return self._signature_dict[func.__name__] + + signature = inspect.signature(func) + params = [p for p in signature.parameters.values() if p.name != 'self'] + + param_dict: Dict[str, Parameter] = {} + for i, param in enumerate(params): + if exclude is not None and (i in exclude or param.name in exclude): + continue + + param_type = param.annotation + # Mimic TorchScript to auto-infer `Tensor` on non-present types: + param_type = Tensor if param_type is inspect._empty else param_type + + param_dict[param.name] = Parameter( + name=param.name, + type=self.eval_type(param_type), + type_repr=self.type_repr(param_type), + default=param.default, + ) + + return_type = signature.return_annotation + # Mimic TorchScript to auto-infer `Tensor` on non-present types: + return_type = Tensor if return_type is inspect._empty else return_type + + self._signature_dict[func.__name__] = Signature( + param_dict=param_dict, + return_type=self.eval_type(return_type), + return_type_repr=self.type_repr(return_type), + ) + + return self._signature_dict[func.__name__] + + def get_signature( + self, + func: Union[Callable, str], + exclude: Optional[List[str]] = None, + ) -> Signature: + r"""Returns the function signature of the inspected function + :obj:`func`. + + Args: + func (callabel or str): The function. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + func_name = func if isinstance(func, str) else func.__name__ + signature = self._signature_dict.get(func_name) + if signature is None: + raise IndexError(f"Could not access signature for function " + f"'{func_name}'. Did you forget to inspect it?") + + if exclude is None: + return signature + + param_dict = { + name: param + for name, param in signature.param_dict.items() + if name not in exclude + } + return Signature( + param_dict=param_dict, + return_type=signature.return_type, + return_type_repr=signature.return_type_repr, + ) + + def remove_signature( + self, + func: Union[Callable, str], + ) -> Optional[Signature]: + r"""Removes the inspected function signature :obj:`func`. + + Args: + func (callabel or str): The function. + """ + func_name = func if isinstance(func, str) else func.__name__ + return self._signature_dict.pop(func_name, None) + + def get_param_dict( + self, + func: Union[Callable, str], + exclude: Optional[List[str]] = None, + ) -> Dict[str, Parameter]: + r"""Returns the parameters of the inspected function :obj:`func`. + + Args: + func (str or callable): The function. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + return self.get_signature(func, exclude).param_dict + + def get_params( + self, + func: Union[Callable, str], + exclude: Optional[List[str]] = None, + ) -> List[Parameter]: + r"""Returns the parameters of the inspected function :obj:`func`. + + Args: + func (str or callable): The function. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + return list(self.get_param_dict(func, exclude).values()) + + def get_flat_param_dict( + self, + funcs: List[Union[Callable, str]], + exclude: Optional[List[str]] = None, + ) -> Dict[str, Parameter]: + r"""Returns the union of parameters of all inspected functions in + :obj:`funcs`. + + Args: + funcs (list[str or callable]): The functions. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + param_dict: Dict[str, Parameter] = {} + for func in funcs: + params = self.get_params(func, exclude) + for param in params: + expected = param_dict.get(param.name) + if expected is not None and param.type != expected.type: + raise ValueError(f"Found inconsistent types for argument " + f"'{param.name}'. Expected type " + f"'{expected.type}' but found type " + f"'{param.type}'.") + + if expected is not None and param.default != expected.default: + if (param.default is not inspect._empty + and expected.default is not inspect._empty): + raise ValueError(f"Found inconsistent defaults for " + f"argument '{param.name}'. Expected " + f"'{expected.default}' but found " + f"'{param.default}'.") + + default = expected.default + if default is inspect._empty: + default = param.default + + param_dict[param.name] = Parameter( + name=param.name, + type=param.type, + type_repr=param.type_repr, + default=default, + ) + + if expected is None: + param_dict[param.name] = param + + return param_dict + + def get_flat_params( + self, + funcs: List[Union[Callable, str]], + exclude: Optional[List[str]] = None, + ) -> List[Parameter]: + r"""Returns the union of parameters of all inspected functions in + :obj:`funcs`. + + Args: + funcs (list[str or callable]): The functions. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + return list(self.get_flat_param_dict(funcs, exclude).values()) + + def get_param_names( + self, + func: Union[Callable, str], + exclude: Optional[List[str]] = None, + ) -> List[str]: + r"""Returns the parameter names of the inspected function :obj:`func`. + + Args: + func (str or callable): The function. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + return list(self.get_param_dict(func, exclude).keys()) + + def get_flat_param_names( + self, + funcs: List[Union[Callable, str]], + exclude: Optional[List[str]] = None, + ) -> List[str]: + r"""Returns the union of parameter names of all inspected functions in + :obj:`funcs`. + + Args: + funcs (list[str or callable]): The functions. + exclude (list[str], optional): The parameter names to exclude. + (default: :obj:`None`) + """ + return list(self.get_flat_param_dict(funcs, exclude).keys()) + + def collect_param_data( + self, + func: Union[Callable, str], + kwargs: Dict[str, Any], + ) -> Dict[str, Any]: + r"""Collects the input data of the inspected function :obj:`func` + according to its function signature from a data blob. + + Args: + func (callable or str): The function. + kwargs (dict[str, Any]): The data blob which may serve as inputs. + """ + out_dict: Dict[str, Any] = {} + for param in self.get_params(func): + if param.name not in kwargs: + if param.default is inspect._empty: + raise TypeError(f"Parameter '{param.name}' is required") + out_dict[param.name] = param.default + else: + out_dict[param.name] = kwargs[param.name] + return out_dict + + # Inspecting Method Bodies ################################################ + + def get_source(self, cls: Optional[Type] = None) -> str: + r"""Returns the source code of :obj:`cls`.""" + from paddle_geometric.nn import MessagePassing + + cls = cls or self._cls + if cls.__name__ in self._source_dict: + return self._source_dict[cls.__name__] + if cls in {object, paddle.nn.Layer, MessagePassing}: + return '' + source = inspect.getsource(cls) + self._source_dict[cls.__name__] = source + return source + + def get_params_from_method_call( + self, + func: Union[Callable, str], + exclude: Optional[List[Union[int, str]]] = None, + ) -> Dict[str, Parameter]: + r"""Parses a method call of :obj:`func` and returns its keyword + arguments. + + .. note:: + The method is required to be called via keyword arguments in case + type annotations are not found. + + Args: + func (callable or str): The function. + exclude (list[int or str]): A list of parameters to exclude, either + given by their name or index. (default: :obj:`None`) + """ + func_name = func if isinstance(func, str) else func.__name__ + param_dict: Dict[str, Parameter] = {} + + # Three ways to specify the parameters of an unknown function header: + # 1. Defined as class attributes in `{func_name}_type`. + # 2. Defined via type annotations in `# {func_name}_type: (...)`. + # 3. Defined via parsing of the function call. + + # (1) Find class attribute: + if hasattr(self._cls, f'{func_name}_type'): + type_dict = getattr(self._cls, f'{func_name}_type') + if not isinstance(type_dict, dict): + raise ValueError(f"'{func_name}_type' is expected to be a " + f"dictionary (got '{type(type_dict)}')") + + for name, param_type in type_dict.items(): + param_dict[name] = Parameter( + name=name, + type=self.eval_type(param_type), + type_repr=self.type_repr(param_type), + default=inspect._empty, + ) + return param_dict + + # (2) Find type annotation: + for cls in self._cls.__mro__: + source = self.get_source(cls) + match = find_parenthesis_content(source, f'{func_name}_type:') + if match is not None: + for arg in split(match, sep=','): + name_and_type_repr = re.split(r'\s*:\s*', arg) + if len(name_and_type_repr) != 2: + raise ValueError(f"Could not parse argument '{arg}' " + f"of '{func_name}_type' annotation") + + name, type_repr = name_and_type_repr + param_dict[name] = Parameter( + name=name, + type=self.eval_type(type_repr), + type_repr=type_repr, + default=inspect._empty, + ) + return param_dict + + # (3) Parse the function call: + for cls in self._cls.__mro__: + source = self.get_source(cls) + source = remove_comments(source) + match = find_parenthesis_content(source, f'self.{func_name}') + if match is not None: + for i, kwarg in enumerate(split(match, sep=',')): + if ('=' not in kwarg and exclude is not None + and i in exclude): + continue + + name_and_content = re.split(r'\s*=\s*', kwarg) + if len(name_and_content) != 2: + raise ValueError(f"Could not parse keyword argument " + f"'{kwarg}' in 'self.{func_name}()'") + + name, _ = name_and_content + + if exclude is not None and name in exclude: + continue + + param_dict[name] = Parameter( + name=name, + type=Tensor, + type_repr=self.type_repr(Tensor), + default=inspect._empty, + ) + return param_dict + + return {} # (4) No function call found: + + +def eval_type(value: Any, _globals: Dict[str, Any]) -> Type: + r"""Returns the type hint of a string.""" + if isinstance(value, str): + value = typing.ForwardRef(value) + return typing._eval_type(value, _globals, None) # type: ignore + + +def type_repr(obj: Any, _globals: Dict[str, Any]) -> str: + r"""Returns the type hint representation of an object.""" + def _get_name(name: str, module: str) -> str: + return name if name in _globals else f'{module}.{name}' + + if isinstance(obj, str): + return obj + + if obj is type(None): + return 'None' + + if obj is ...: + return '...' + + if obj.__module__ == 'typing': # Special logic for `typing.*` types: + + if not hasattr(obj, '_name'): + return repr(obj) + + name = obj._name + if name is None: # In some cases, `_name` is not populated. + name = str(obj.__origin__).split('.')[-1] + + args = getattr(obj, '__args__', None) + if args is None or len(args) == 0: + return _get_name(name, obj.__module__) + if all(isinstance(arg, typing.TypeVar) for arg in args): + return _get_name(name, obj.__module__) + + # Convert `Union[*, None]` to `Optional[*]`. + # This is only necessary for old Python versions, e.g. 3.8. + # TODO Only convert to `Optional` if `Optional` is importable. + if (name == 'Union' and len(args) == 2 + and any([arg is type(None) for arg in args])): + name = 'Optional' + + if name == 'Optional': # Remove `None` from `Optional` arguments: + args = [arg for arg in obj.__args__ if arg is not type(None)] + + args_repr = ', '.join([type_repr(arg, _globals) for arg in args]) + return f'{_get_name(name, obj.__module__)}[{args_repr}]' + + if obj.__module__ == 'builtins': + return obj.__qualname__ + + return _get_name(obj.__qualname__, obj.__module__) + + +def find_parenthesis_content(source: str, prefix: str) -> Optional[str]: + r"""Returns the content of :obj:`{prefix}.*(...)` within :obj:`source`.""" + match = re.search(prefix, source) + if match is None: + return None + + offset = source[match.start():].find('(') + if offset < 0: + return None + + source = source[match.start() + offset:] + + depth = 0 + for end, char in enumerate(source): + if char == '(': + depth += 1 + if char == ')': + depth -= 1 + if depth == 0: + content = source[1:end] + # Properly handle line breaks and multiple white-spaces: + content = content.replace('\n', ' ') + content = content.replace('#', ' ') + content = re.sub(' +', ' ', content) + content = content.strip() + return content + + return None + + +def split(content: str, sep: str) -> List[str]: + r"""Splits :obj:`content` based on :obj:`sep`. + :obj:`sep` inside parentheses or square brackets are ignored. + """ + assert len(sep) == 1 + outs: List[str] = [] + + start = depth = 0 + for end, char in enumerate(content): + if char == '[' or char == '(': + depth += 1 + elif char == ']' or char == ')': + depth -= 1 + elif char == sep and depth == 0: + outs.append(content[start:end].strip()) + start = end + 1 + if start != len(content): # Respect dangling `sep`: + outs.append(content[start:].strip()) + return outs + + +def remove_comments(content: str) -> str: + content = re.sub(r'\s*#.*', '', content) + content = re.sub(re.compile(r'r"""(.*?)"""', re.DOTALL), '', content) + content = re.sub(re.compile(r'"""(.*?)"""', re.DOTALL), '', content) + content = re.sub(re.compile(r"r'''(.*?)'''", re.DOTALL), '', content) + content = re.sub(re.compile(r"'''(.*?)'''", re.DOTALL), '', content) + return content diff --git a/jointContribution/mattergen/paddle_geometric/io/__init__.py b/jointContribution/mattergen/paddle_geometric/io/__init__.py new file mode 100644 index 00000000..2b43b6cf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/__init__.py @@ -0,0 +1,23 @@ +from .txt_array import parse_txt_array, read_txt_array +from .tu import read_tu_data +from .planetoid import read_planetoid_data +from .ply import read_ply +from .obj import read_obj +from .sdf import read_sdf, parse_sdf +from .off import read_off, write_off +from .npz import read_npz, parse_npz + +__all__ = [ + 'read_off', + 'write_off', + 'parse_txt_array', + 'read_txt_array', + 'read_tu_data', + 'read_planetoid_data', + 'read_ply', + 'read_obj', + 'read_sdf', + 'parse_sdf', + 'read_npz', + 'parse_npz', +] diff --git a/jointContribution/mattergen/paddle_geometric/io/fs.py b/jointContribution/mattergen/paddle_geometric/io/fs.py new file mode 100644 index 00000000..d8209825 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/fs.py @@ -0,0 +1,189 @@ +import io +import os.path as osp +import pickle +import re +import sys +import warnings +from typing import Any, Dict, List, Literal, Optional, Union, overload +from uuid import uuid4 + +import fsspec +import paddle + +DEFAULT_CACHE_PATH = '/tmp/paddle_simplecache' + + +def get_fs(path: str) -> fsspec.AbstractFileSystem: + r"""Get filesystem backend given a path URI to the resource. + + Common example paths and dispatch result: + + * :obj:`"/home/file"` -> LocalFileSystem + * :obj:`"memory://home/file"` -> MemoryFileSystem + * :obj:`"https://home/file"` -> HTTPFileSystem + * :obj:`"gs://home/file"` -> GCSFileSystem + * :obj:`"s3://home/file"` -> S3FileSystem + + Args: + path (str): The URI to the filesystem location, *e.g.*, + :obj:`"gs://home/me/file"`, :obj:`"s3://..."`. + """ + return fsspec.core.url_to_fs(path)[0] + + +def normpath(path: str) -> str: + if isdisk(path): + return osp.normpath(path) + return path + + +def exists(path: str) -> bool: + return get_fs(path).exists(path) + + +def makedirs(path: str, exist_ok: bool = True) -> None: + return get_fs(path).makedirs(path, exist_ok) + + +def isdir(path: str) -> bool: + return get_fs(path).isdir(path) + + +def isfile(path: str) -> bool: + return get_fs(path).isfile(path) + + +def isdisk(path: str) -> bool: + return 'file' in get_fs(path).protocol + + +def islocal(path: str) -> bool: + return isdisk(path) or 'memory' in get_fs(path).protocol + + +@overload +def ls(path: str, detail: Literal[False] = False) -> List[str]: + pass + + +@overload +def ls(path: str, detail: Literal[True]) -> List[Dict[str, Any]]: + pass + + +def ls( + path: str, + detail: bool = False, +) -> Union[List[str], List[Dict[str, Any]]]: + fs = get_fs(path) + outputs = fs.ls(path, detail=detail) + + if not isdisk(path): + if detail: + for output in outputs: + output['name'] = fs.unstrip_protocol(output['name']) + else: + outputs = [fs.unstrip_protocol(output) for output in outputs] + + return outputs + + +def cp( + path1: str, + path2: str, + extract: bool = False, + log: bool = True, + use_cache: bool = True, + clear_cache: bool = True, +) -> None: + kwargs: Dict[str, Any] = {} + + is_path1_dir = isdir(path1) + is_path2_dir = isdir(path2) + + # Cache result if the protocol is not local: + cache_dir: Optional[str] = None + if not islocal(path1): + if log and 'pytest' not in sys.modules: + print(f'Downloading {path1}', file=sys.stderr) + + if extract and use_cache: + cache_dir = osp.join(DEFAULT_CACHE_PATH, uuid4().hex) + kwargs.setdefault('simplecache', dict(cache_storage=cache_dir)) + path1 = f'simplecache::{path1}' + + # Handle automatic extraction: + multiple_files = False + if extract and path1.endswith('.tar.gz'): + kwargs.setdefault('tar', dict(compression='gzip')) + path1 = f'tar://**::{path1}' + multiple_files = True + elif extract and path1.endswith('.zip'): + path1 = f'zip://**::{path1}' + multiple_files = True + elif extract and path1.endswith('.gz'): + kwargs.setdefault('compression', 'infer') + elif extract: + raise NotImplementedError( + f"Automatic extraction of '{path1}' not yet supported") + + # Perform the copy: + for open_file in fsspec.open_files(path1, **kwargs): + with open_file as f_from: + if not multiple_files: + if is_path2_dir: + basename = osp.basename(path1) + if extract and path1.endswith('.gz'): + basename = '.'.join(basename.split('.')[:-1]) + to_path = osp.join(path2, basename) + else: + to_path = path2 + else: + common_path = osp.commonprefix( + [fsspec.core.strip_protocol(path1), open_file.path]) + to_path = osp.join(path2, open_file.path[len(common_path):]) + with fsspec.open(to_path, 'wb') as f_to: + while True: + chunk = f_from.read(10 * 1024 * 1024) + if not chunk: + break + f_to.write(chunk) + + if use_cache and clear_cache and cache_dir is not None: + try: + rm(cache_dir) + except Exception: + pass + + +def rm(path: str, recursive: bool = True) -> None: + get_fs(path).rm(path, recursive) + + +def mv(path1: str, path2: str) -> None: + fs1 = get_fs(path1) + fs2 = get_fs(path2) + assert fs1.protocol == fs2.protocol + fs1.mv(path1, path2) + + +def glob(path: str) -> List[str]: + fs = get_fs(path) + paths = fs.glob(path) + + if not isdisk(path): + paths = [fs.unstrip_protocol(path) for path in paths] + + return paths + + +def paddle_save(data: Any, path: str) -> None: + buffer = io.BytesIO() + paddle.save(data, buffer) + with fsspec.open(path, 'wb') as f: + f.write(buffer.getvalue()) + + +def paddle_load(path: str, map_location: Any = None) -> Any: + with fsspec.open(path, 'rb') as f: + return paddle.load(f, map_location=map_location) diff --git a/jointContribution/mattergen/paddle_geometric/io/npz.py b/jointContribution/mattergen/paddle_geometric/io/npz.py new file mode 100644 index 00000000..32840c09 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/npz.py @@ -0,0 +1,36 @@ +from typing import Any, Dict + +import numpy as np +import paddle +import scipy.sparse as sp + +from paddle_geometric.data import Data +from paddle_geometric.utils import remove_self_loops +from paddle_geometric.utils import to_undirected as to_undirected_fn + + +def read_npz(path: str, to_undirected: bool = True) -> Data: + with np.load(path) as f: + return parse_npz(f, to_undirected=to_undirected) + + +def parse_npz(f: Dict[str, Any], to_undirected: bool = True) -> Data: + # 读取属性矩阵并转换为稀疏矩阵格式 + x = sp.csr_matrix((f['attr_data'], f['attr_indices'], f['attr_indptr']), + f['attr_shape']).todense() + x = paddle.to_tensor(x, dtype='float32') + x = paddle.where(x > 0, paddle.ones_like(x), paddle.zeros_like(x)) + + # 读取邻接矩阵并转换为稀疏矩阵格式 + adj = sp.csr_matrix((f['adj_data'], f['adj_indices'], f['adj_indptr']), + f['adj_shape']).tocoo() + row = paddle.to_tensor(adj.row, dtype='int64') + col = paddle.to_tensor(adj.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + edge_index, _ = remove_self_loops(edge_index) + if to_undirected: + edge_index = to_undirected_fn(edge_index, num_nodes=x.shape[0]) + + y = paddle.to_tensor(f['labels'], dtype='int64') + + return Data(x=x, edge_index=edge_index, y=y) diff --git a/jointContribution/mattergen/paddle_geometric/io/obj.py b/jointContribution/mattergen/paddle_geometric/io/obj.py new file mode 100644 index 00000000..96b6cc3a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/obj.py @@ -0,0 +1,39 @@ +from typing import Iterator, List, Optional, Tuple, Union + +import paddle +from paddle_geometric.data import Data + + +def yield_file(in_file: str) -> Iterator[Tuple[str, List[Union[int, float]]]]: + with open(in_file, 'r') as f: + buf = f.read() + for b in buf.split('\n'): + if b.startswith('v '): + yield 'v', [float(x) for x in b.split(" ")[1:]] + elif b.startswith('f '): + triangles = b.split(' ')[1:] + # -1 as .obj is base 1 but the Data class expects base 0 indices + yield 'f', [int(t.split("/")[0]) - 1 for t in triangles] + else: + yield '', [] + + +def read_obj(in_file: str) -> Optional[Data]: + vertices = [] + faces = [] + + for k, v in yield_file(in_file): + if k == 'v': + vertices.append(v) + elif k == 'f': + faces.append(v) + + if not faces or not vertices: + return None + + pos = paddle.to_tensor(vertices, dtype='float32') + face = paddle.to_tensor(faces, dtype='int64').transpose([1, 0]) + + data = Data(pos=pos, face=face) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/io/off.py b/jointContribution/mattergen/paddle_geometric/io/off.py new file mode 100644 index 00000000..3432d16f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/off.py @@ -0,0 +1,83 @@ +import re +from typing import List + +import paddle +from paddle import Tensor +from paddle_geometric.data import Data +from paddle_geometric.io import parse_txt_array + + +def parse_off(src: List[str]) -> Data: + # Check if the first line contains the OFF tag. + if src[0] == 'OFF': + src = src[1:] + else: + src[0] = src[0][3:] + + num_nodes, num_faces = (int(item) for item in src[0].split()[:2]) + + pos = parse_txt_array(src[1:1 + num_nodes]) + face = face_to_tri(src[1 + num_nodes:1 + num_nodes + num_faces]) + + data = Data(pos=pos) + data.face = face + + return data + + +def face_to_tri(face: List[str]) -> Tensor: + face_index = [[int(x) for x in line.strip().split()] for line in face] + + triangle = paddle.to_tensor([line[1:] for line in face_index if line[0] == 3], dtype='int64') + rect = paddle.to_tensor([line[1:] for line in face_index if line[0] == 4], dtype='int64') + + # Convert rectangles to triangles by splitting into two triangles + if rect.numel() > 0: + first, second = rect[:, [0, 1, 2]], rect[:, [0, 2, 3]] + return paddle.concat([triangle, first, second], axis=0).transpose([1, 0]) + + return triangle.transpose([1, 0]) + + +def read_off(path: str) -> Data: + r"""Reads an OFF (Object File Format) file and returns a Data object + containing node positions and connectivity. + + Args: + path (str): The path to the file. + """ + with open(path, 'r') as f: + src = f.read().splitlines() + return parse_off(src) + + +def write_off(data: Data, path: str) -> None: + r"""Writes a Data object to an OFF (Object File Format) file. + + Args: + data (Data): A Data object containing node positions and connectivity. + path (str): The path to the file. + """ + assert data.pos is not None + assert data.face is not None + + num_nodes, num_faces = data.pos.shape[0], data.face.shape[1] + + pos = data.pos.astype('float32') + face = data.face.transpose([1, 0]) + num_vertices = paddle.full((num_faces, 1), face.shape[1], dtype='int64') + face = paddle.concat([num_vertices, face], axis=-1) + + # Format positions and face data for writing + pos_repr = re.sub(',', '', paddle.to_string(pos)) + pos_repr = '\n'.join([x.strip() for x in pos_repr.split('\n')])[:-1] + + face_repr = re.sub(',', '', paddle.to_string(face)) + face_repr = '\n'.join([x.strip() for x in face_repr.split('\n')])[:-1] + + with open(path, 'w') as f: + f.write(f'OFF\n{num_nodes} {num_faces} 0\n') + f.write(pos_repr) + f.write('\n') + f.write(face_repr) + f.write('\n') diff --git a/jointContribution/mattergen/paddle_geometric/io/planetoid.py b/jointContribution/mattergen/paddle_geometric/io/planetoid.py new file mode 100644 index 00000000..33028c84 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/planetoid.py @@ -0,0 +1,132 @@ +import os.path as osp +import warnings +from itertools import repeat +from typing import Dict, List, Optional + +import fsspec +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.io import read_txt_array +from paddle_geometric.utils import ( + coalesce, + index_to_mask, + remove_self_loops, + to_paddle_csr_tensor, +) + +try: + import cPickle as pickle +except ImportError: + import pickle + + +def read_planetoid_data(folder: str, prefix: str) -> Data: + # List of data items to load + names = ['x', 'tx', 'allx', 'y', 'ty', 'ally', 'graph', 'test.index'] + items = [read_file(folder, prefix, name) for name in names] + x, tx, allx, y, ty, ally, graph, test_index = items + train_index = paddle.arange(y.shape[0], dtype='int64') + val_index = paddle.arange(y.shape[0], y.shape[0] + 500, dtype='int64') + sorted_test_index = paddle.sort(test_index) + + if prefix.lower() == 'citeseer': + # Handle isolated nodes in Citeseer dataset with missing test indices + len_test_indices = int(test_index.max() - test_index.min()) + 1 + + tx_ext = paddle.zeros([len_test_indices, tx.shape[1]], dtype=tx.dtype) + tx_ext[sorted_test_index - test_index.min(), :] = tx + ty_ext = paddle.zeros([len_test_indices, ty.shape[1]], dtype=ty.dtype) + ty_ext[sorted_test_index - test_index.min(), :] = ty + + tx, ty = tx_ext, ty_ext + + if prefix.lower() == 'nell.0.001': + tx_ext = paddle.zeros([len(graph) - allx.shape[0], x.shape[1]]) + tx_ext[sorted_test_index - allx.shape[0]] = tx + + ty_ext = paddle.zeros([len(graph) - ally.shape[0], y.shape[1]]) + ty_ext[sorted_test_index - ally.shape[0]] = ty + + tx, ty = tx_ext, ty_ext + + x = paddle.concat([allx, tx], axis=0) + x[test_index] = x[sorted_test_index] + + row, col = paddle.nonzero(x, as_tuple=True) + value = x[row, col] + + mask = ~index_to_mask(test_index, size=len(graph)) + mask[:allx.shape[0]] = False + isolated_idx = paddle.nonzero(mask).flatten() + + row = paddle.concat([row, isolated_idx]) + col = paddle.concat([col, paddle.arange(isolated_idx.shape[0]) + x.shape[1]]) + value = paddle.concat([value, paddle.ones(isolated_idx.shape[0], dtype=value.dtype)]) + + x = to_paddle_csr_tensor( + edge_index=paddle.stack([row, col], axis=0), + edge_attr=value, + size=(x.shape[0], isolated_idx.shape[0] + x.shape[1]), + ) + else: + x = paddle.concat([allx, tx], axis=0) + x[test_index] = x[sorted_test_index] + + y = paddle.concat([ally, ty], axis=0).argmax(axis=1) + y[test_index] = y[sorted_test_index] + + train_mask = index_to_mask(train_index, size=y.shape[0]) + val_mask = index_to_mask(val_index, size=y.shape[0]) + test_mask = index_to_mask(test_index, size=y.shape[0]) + + edge_index = edge_index_from_dict( + graph_dict=graph, + num_nodes=y.shape[0], + ) + + data = Data(x=x, edge_index=edge_index, y=y) + data.train_mask = train_mask + data.val_mask = val_mask + data.test_mask = test_mask + + return data + + +def read_file(folder: str, prefix: str, name: str) -> Tensor: + # Load data file and return as Paddle tensor + path = osp.join(folder, f'ind.{prefix.lower()}.{name}') + + if name == 'test.index': + return read_txt_array(path, dtype='int64') + + with fsspec.open(path, 'rb') as f: + warnings.filterwarnings('ignore', '.*`scipy.sparse.csr` name.*') + out = pickle.load(f, encoding='latin1') + + if name == 'graph': + return out + + out = out.todense() if hasattr(out, 'todense') else out + out = paddle.to_tensor(out, dtype='float32') + return out + + +def edge_index_from_dict( + graph_dict: Dict[int, List[int]], + num_nodes: Optional[int] = None, +) -> Tensor: + rows: List[int] = [] + cols: List[int] = [] + for key, value in graph_dict.items(): + rows += repeat(key, len(value)) + cols += value + row = paddle.to_tensor(rows, dtype='int64') + col = paddle.to_tensor(cols, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + + edge_index = remove_self_loops(edge_index) + edge_index = coalesce(edge_index, num_nodes=num_nodes, sort_by_row=False) + + return edge_index diff --git a/jointContribution/mattergen/paddle_geometric/io/ply.py b/jointContribution/mattergen/paddle_geometric/io/ply.py new file mode 100644 index 00000000..b61a7e67 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/ply.py @@ -0,0 +1,18 @@ +import paddle + +from paddle_geometric.data import Data + +try: + import openmesh +except ImportError: + openmesh = None + + +def read_ply(path: str) -> Data: + if openmesh is None: + raise ImportError('`read_ply` requires the `openmesh` package.') + + mesh = openmesh.read_trimesh(path) + pos = paddle.to_tensor(mesh.points(), dtype='float32') + face = paddle.to_tensor(mesh.face_vertex_indices(), dtype='int64').transpose([1, 0]).contiguous() + return Data(pos=pos, face=face) diff --git a/jointContribution/mattergen/paddle_geometric/io/sdf.py b/jointContribution/mattergen/paddle_geometric/io/sdf.py new file mode 100644 index 00000000..925976f9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/sdf.py @@ -0,0 +1,32 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.io import parse_txt_array +from paddle_geometric.utils import coalesce, one_hot + +elems = {'H': 0, 'C': 1, 'N': 2, 'O': 3, 'F': 4} + + +def parse_sdf(src: str) -> Data: + lines = src.split('\n')[3:] + num_atoms, num_bonds = (int(item) for item in lines[0].split()[:2]) + + atom_block = lines[1:num_atoms + 1] + pos = parse_txt_array(atom_block, end=3) + x = paddle.to_tensor([elems[item.split()[3]] for item in atom_block], dtype='int64') + x = one_hot(x, num_classes=len(elems)) + + bond_block = lines[1 + num_atoms:1 + num_atoms + num_bonds] + row, col = parse_txt_array(bond_block, end=2, dtype='int64').transpose([1, 0]) - 1 + row, col = paddle.concat([row, col], axis=0), paddle.concat([col, row], axis=0) + edge_index = paddle.stack([row, col], axis=0) + edge_attr = parse_txt_array(bond_block, start=2, end=3) - 1 + edge_attr = paddle.concat([edge_attr, edge_attr], axis=0) + edge_index, edge_attr = coalesce(edge_index, edge_attr, num_atoms) + + return Data(x=x, edge_index=edge_index, edge_attr=edge_attr, pos=pos) + + +def read_sdf(path: str) -> Data: + with open(path) as f: + return parse_sdf(f.read()) diff --git a/jointContribution/mattergen/paddle_geometric/io/tu.py b/jointContribution/mattergen/paddle_geometric/io/tu.py new file mode 100644 index 00000000..4dc11c03 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/tu.py @@ -0,0 +1,126 @@ +import os.path as osp +from typing import Dict, List, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.io import fs, read_txt_array +from paddle_geometric.utils import coalesce, cumsum, one_hot, remove_self_loops + +names = [ + 'A', 'graph_indicator', 'node_labels', 'node_attributes', + 'edge_labels', 'edge_attributes', 'graph_labels', 'graph_attributes' +] + + +def read_tu_data( + folder: str, + prefix: str, +) -> Tuple[Data, Dict[str, Tensor], Dict[str, int]]: + files = fs.glob(osp.join(folder, f'{prefix}_*.txt')) + names = [osp.basename(f)[len(prefix) + 1:-4] for f in files] + + edge_index = read_file(folder, prefix, 'A', paddle.int64).transpose([1, 0]) - 1 + batch = read_file(folder, prefix, 'graph_indicator', paddle.int64) - 1 + + node_attribute = paddle.empty((batch.shape[0], 0)) + if 'node_attributes' in names: + node_attribute = read_file(folder, prefix, 'node_attributes') + if node_attribute.ndim == 1: + node_attribute = node_attribute.unsqueeze(-1) + + node_label = paddle.empty((batch.shape[0], 0)) + if 'node_labels' in names: + node_label = read_file(folder, prefix, 'node_labels', paddle.int64) + if node_label.ndim == 1: + node_label = node_label.unsqueeze(-1) + node_label = node_label - node_label.min(axis=0) + node_labels = [one_hot(x, depth=node_label.max() + 1) for x in node_label.transpose([1, 0])] + node_label = paddle.concat(node_labels, axis=-1) if len(node_labels) > 1 else node_labels[0] + + edge_attribute = paddle.empty((edge_index.shape[1], 0)) + if 'edge_attributes' in names: + edge_attribute = read_file(folder, prefix, 'edge_attributes') + if edge_attribute.ndim == 1: + edge_attribute = edge_attribute.unsqueeze(-1) + + edge_label = paddle.empty((edge_index.shape[1], 0)) + if 'edge_labels' in names: + edge_label = read_file(folder, prefix, 'edge_labels', paddle.int64) + if edge_label.ndim == 1: + edge_label = edge_label.unsqueeze(-1) + edge_label = edge_label - edge_label.min(axis=0) + edge_labels = [one_hot(e, depth=edge_label.max() + 1) for e in edge_label.transpose([1, 0])] + edge_label = paddle.concat(edge_labels, axis=-1) if len(edge_labels) > 1 else edge_labels[0] + + x = cat([node_attribute, node_label]) + edge_attr = cat([edge_attribute, edge_label]) + + y = None + if 'graph_attributes' in names: # Regression problem. + y = read_file(folder, prefix, 'graph_attributes') + elif 'graph_labels' in names: # Classification problem. + y = read_file(folder, prefix, 'graph_labels', paddle.int64) + y = y.argsort() + + num_nodes = int(edge_index.max()) + 1 if x is None else x.shape[0] + edge_index, edge_attr = remove_self_loops(edge_index, edge_attr) + edge_index, edge_attr = coalesce(edge_index, edge_attr, num_nodes) + + data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr, y=y) + data, slices = split(data, batch) + + sizes = { + 'num_node_attributes': node_attribute.shape[-1], + 'num_node_labels': node_label.shape[-1], + 'num_edge_attributes': edge_attribute.shape[-1], + 'num_edge_labels': edge_label.shape[-1], + } + + return data, slices, sizes + + +def read_file( + folder: str, + prefix: str, + name: str, + dtype: Optional[str] = None, +) -> Tensor: + path = osp.join(folder, f'{prefix}_{name}.txt') + return read_txt_array(path, sep=',', dtype=dtype) + + +def cat(seq: List[Optional[Tensor]]) -> Optional[Tensor]: + values = [v for v in seq if v is not None] + values = [v for v in values if v.numel() > 0] + values = [v.unsqueeze(-1) if v.ndim == 1 else v for v in values] + return paddle.concat(values, axis=-1) if len(values) > 0 else None + + +def split(data: Data, batch: Tensor) -> Tuple[Data, Dict[str, Tensor]]: + node_slice = cumsum(paddle.bincount(batch)) + + assert data.edge_index is not None + row, _ = data.edge_index + edge_slice = cumsum(paddle.bincount(batch[row])) + + # Edge indices should start at zero for every graph. + data.edge_index -= node_slice[batch[row]].unsqueeze(0) + + slices = {'edge_index': edge_slice} + if data.x is not None: + slices['x'] = node_slice + else: + data._num_nodes = paddle.bincount(batch).tolist() + data.num_nodes = batch.shape[0] + if data.edge_attr is not None: + slices['edge_attr'] = edge_slice + if data.y is not None: + assert isinstance(data.y, Tensor) + if data.y.shape[0] == batch.shape[0]: + slices['y'] = node_slice + else: + slices['y'] = paddle.arange(0, int(batch[-1]) + 2, dtype='int64') + + return data, slices diff --git a/jointContribution/mattergen/paddle_geometric/io/txt_array.py b/jointContribution/mattergen/paddle_geometric/io/txt_array.py new file mode 100644 index 00000000..90dbf56d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/io/txt_array.py @@ -0,0 +1,35 @@ +from typing import List, Optional + +import fsspec +import paddle +from paddle import Tensor + + +def parse_txt_array( + src: List[str], + sep: Optional[str] = None, + start: int = 0, + end: Optional[int] = None, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tensor: + empty = paddle.empty([0], dtype=dtype) + to_number = float if empty.is_floating_point() else int + + return paddle.to_tensor( + [[to_number(x) for x in line.split(sep)[start:end]] + for line in src], dtype=dtype + ).squeeze() + + +def read_txt_array( + path: str, + sep: Optional[str] = None, + start: int = 0, + end: Optional[int] = None, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tensor: + with fsspec.open(path, 'r') as f: + src = f.read().split('\n')[:-1] + return parse_txt_array(src, sep, start, end, dtype, device) diff --git a/jointContribution/mattergen/paddle_geometric/isinstance.py b/jointContribution/mattergen/paddle_geometric/isinstance.py new file mode 100644 index 00000000..cecccdc0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/isinstance.py @@ -0,0 +1,25 @@ +from typing import Any, Tuple, Type, Union + +import paddle + +import paddle_geometric.typing + +# Placeholder for potential PaddlePaddle dynamic optimization in the future +# Currently, no equivalent exists for `torch._dynamo.OptimizedModule`. + +def is_paddle_instance(obj: Any, cls: Union[Type, Tuple[Type]]) -> bool: + r"""Checks if the :obj:`obj` is an instance of a :obj:`cls`. + + This function extends :meth:`isinstance` to be applicable for any dynamic + optimization features PaddlePaddle may introduce in the future. + + Args: + obj (Any): The object to check. + cls (Union[Type, Tuple[Type]]): The class or tuple of classes to check against. + + Returns: + bool: Whether the object is an instance of the given class or classes. + """ + # PaddlePaddle currently does not have an equivalent to `torch._dynamo.OptimizedModule`. + # This placeholder ensures future compatibility if such a feature is introduced. + return isinstance(obj, cls) diff --git a/jointContribution/mattergen/paddle_geometric/lazy_loader.py b/jointContribution/mattergen/paddle_geometric/lazy_loader.py new file mode 100644 index 00000000..b1927ca3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/lazy_loader.py @@ -0,0 +1,31 @@ +from importlib import import_module +from types import ModuleType +from typing import Any, Dict, List + + +# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/ +# python/util/lazy_loader.py +class LazyLoader(ModuleType): + def __init__( + self, + local_name: str, + parent_module_globals: Dict[str, Any], + name: str, + ) -> None: + self._local_name = local_name + self._parent_module_globals = parent_module_globals + super().__init__(name) + + def _load(self) -> Any: + module = import_module(self.__name__) + self._parent_module_globals[self._local_name] = module + self.__dict__.update(module.__dict__) + return module + + def __getattr__(self, item: str) -> Any: + module = self._load() + return getattr(module, item) + + def __dir__(self) -> List[str]: + module = self._load() + return dir(module) diff --git a/jointContribution/mattergen/paddle_geometric/loader/__init__.py b/jointContribution/mattergen/paddle_geometric/loader/__init__.py new file mode 100644 index 00000000..27623f8a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/__init__.py @@ -0,0 +1,58 @@ +from paddle_geometric.deprecation import deprecated + +from .dataloader import DataLoader +from .node_loader import NodeLoader +from .link_loader import LinkLoader +from .neighbor_loader import NeighborLoader +from .link_neighbor_loader import LinkNeighborLoader +from .hgt_loader import HGTLoader +from .cluster import ClusterData, ClusterLoader +from .graph_saint import (GraphSAINTSampler, GraphSAINTNodeSampler, + GraphSAINTEdgeSampler, GraphSAINTRandomWalkSampler) +from .shadow import ShaDowKHopSampler +from .random_node_loader import RandomNodeLoader +# from .ibmb_loader import IBMBBatchLoader, IBMBNodeLoader +from .zip_loader import ZipLoader +from .data_list_loader import DataListLoader +from .dense_data_loader import DenseDataLoader +from .temporal_dataloader import TemporalDataLoader +from .neighbor_sampler import NeighborSampler +from .imbalanced_sampler import ImbalancedSampler +from .dynamic_batch_sampler import DynamicBatchSampler +from .prefetch import PrefetchLoader +from .cache import CachedLoader +from .mixin import AffinityMixin + +__all__ = classes = [ + 'DataLoader', + 'NodeLoader', + 'LinkLoader', + 'NeighborLoader', + 'LinkNeighborLoader', + 'HGTLoader', + 'ClusterData', + 'ClusterLoader', + 'GraphSAINTSampler', + 'GraphSAINTNodeSampler', + 'GraphSAINTEdgeSampler', + 'GraphSAINTRandomWalkSampler', + 'ShaDowKHopSampler', + 'RandomNodeLoader', + # 'IBMBBatchLoader', + # 'IBMBNodeLoader', + 'ZipLoader', + 'DataListLoader', + 'DenseDataLoader', + 'TemporalDataLoader', + 'NeighborSampler', + 'ImbalancedSampler', + 'DynamicBatchSampler', + 'PrefetchLoader', + 'CachedLoader', + 'AffinityMixin', +] + +RandomNodeSampler = deprecated( + details="use 'loader.RandomNodeLoader' instead", + func_name='loader.RandomNodeSampler', +)(RandomNodeLoader) diff --git a/jointContribution/mattergen/paddle_geometric/loader/base.py b/jointContribution/mattergen/paddle_geometric/loader/base.py new file mode 100644 index 00000000..58a310ef --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/base.py @@ -0,0 +1,46 @@ +from typing import Any, Callable +import paddle +from paddle.io import DataLoader, Dataset + + +class DataLoaderIterator: + r"""A data loader iterator extended by a simple post-transformation + function :meth:`transform_fn`. While the iterator may request items from + different sub-processes, :meth:`transform_fn` will always be executed in + the main process. + + This iterator is used in PyG's sampler classes, and is responsible for + feature fetching and filtering data objects after sampling has taken place + in a sub-process. This has the following advantages: + + * We do not need to share feature matrices across processes which may + prevent any errors due to too many open file handles. + * We can execute any expensive post-processing commands on the main thread + with full parallelization power (which usually executes faster). + * It lets us naturally support data already being present on the GPU. + """ + + def __init__(self, loader: DataLoader, transform_fn: Callable): + # In Paddle, we directly pass DataLoader and its iterable + self.loader = loader + self.transform_fn = transform_fn + self.iterator = iter(self.loader) # Create an iterator from DataLoader + + def __iter__(self) -> 'DataLoaderIterator': + return self + + def _reset(self, loader: Any, first_iter: bool = False): + # In Paddle, reset is handled by DataLoader itself, so we don't need to manually reset it + self.iterator = iter(loader) + + def __len__(self) -> int: + return len(self.loader) + + def __next__(self) -> Any: + # Apply transformation to each batch loaded by the iterator + data = next(self.iterator) + return self.transform_fn(data) + + def __del__(self) -> None: + # Clean up if necessary, although Paddle handles it internally + del self.iterator diff --git a/jointContribution/mattergen/paddle_geometric/loader/cache.py b/jointContribution/mattergen/paddle_geometric/loader/cache.py new file mode 100644 index 00000000..dc7ffb76 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/cache.py @@ -0,0 +1,70 @@ +from collections.abc import Mapping +from typing import Any, Callable, List, Optional, Sequence + +import paddle +from paddle.io import DataLoader + + +def to_device(inputs: Any, device: Optional[str] = None) -> Any: + if hasattr(inputs, 'to'): + return inputs.to(device) + elif isinstance(inputs, Mapping): + return {key: to_device(value, device) for key, value in inputs.items()} + elif isinstance(inputs, tuple) and hasattr(inputs, '_fields'): + return type(inputs)(*(to_device(s, device) for s in zip(*inputs))) + elif isinstance(inputs, Sequence) and not isinstance(inputs, str): + return [to_device(s, device) for s in zip(*inputs)] + + return inputs + + +class CachedLoader: + r"""A loader to cache mini-batch outputs, e.g., obtained during + :class:`NeighborLoader` iterations. + + Args: + loader (paddle.io.DataLoader): The data loader. + device (paddle.device, optional): The device to load the data to. + (default: :obj:`None`) + transform (callable, optional): A function/transform that takes in + a sampled mini-batch and returns a transformed version. + (default: :obj:`None`) + """ + def __init__( + self, + loader: DataLoader, + device: Optional[str] = None, + transform: Optional[Callable] = None, + ): + self.loader = loader + self.device = device + self.transform = transform + + self._cache: List[Any] = [] + + def clear(self): + r"""Clears the cache.""" + self._cache = [] + + def __iter__(self) -> Any: + if len(self._cache): + for batch in self._cache: + yield batch + return + + for batch in self.loader: + + if self.transform is not None: + batch = self.transform(batch) + + batch = to_device(batch, self.device) + + self._cache.append(batch) + + yield batch + + def __len__(self) -> int: + return len(self.loader) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.loader})' diff --git a/jointContribution/mattergen/paddle_geometric/loader/cluster.py b/jointContribution/mattergen/paddle_geometric/loader/cluster.py new file mode 100644 index 00000000..5a36a7f9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/cluster.py @@ -0,0 +1,334 @@ +import copy +import os +import os.path as osp +import sys +from dataclasses import dataclass +from typing import List, Literal, Optional + +import paddle +import paddle.io +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.data import Data +from paddle_geometric.index import index2ptr, ptr2index +from paddle_geometric.io import fs +from paddle_geometric.typing import pyg_lib +from paddle_geometric.utils import index_sort, narrow, select, sort_edge_index +from paddle_geometric.utils.map import map_index + + +@dataclass +class Partition: + indptr: Tensor + index: Tensor + partptr: Tensor + node_perm: Tensor + edge_perm: Tensor + sparse_format: Literal['csr', 'csc'] + + +class ClusterData(paddle.io.Dataset): + r"""Clusters/partitions a graph data object into multiple subgraphs, as + motivated by the `"Cluster-GCN: An Efficient Algorithm for Training Deep + and Large Graph Convolutional Networks" + `_ paper. + + .. note:: + The underlying METIS algorithm requires undirected graphs as input. + + Args: + data (paddle_geometric.data.Data): The graph data object. + num_parts (int): The number of partitions. + recursive (bool, optional): If set to :obj:`True`, will use multilevel + recursive bisection instead of multilevel k-way partitioning. + (default: :obj:`False`) + save_dir (str, optional): If set, will save the partitioned data to the + :obj:`save_dir` directory for faster re-use. (default: :obj:`None`) + filename (str, optional): Name of the stored partitioned file. + (default: :obj:`None`) + log (bool, optional): If set to :obj:`False`, will not log any + progress. (default: :obj:`True`) + keep_inter_cluster_edges (bool, optional): If set to :obj:`True`, + will keep inter-cluster edge connections. (default: :obj:`False`) + sparse_format (str, optional): The sparse format to use for computing + partitions. (default: :obj:`"csr"`) + """ + def __init__( + self, + data, + num_parts: int, + recursive: bool = False, + save_dir: Optional[str] = None, + filename: Optional[str] = None, + log: bool = True, + keep_inter_cluster_edges: bool = False, + sparse_format: Literal['csr', 'csc'] = 'csr', + ): + assert data.edge_index is not None + assert sparse_format in ['csr', 'csc'] + + self.num_parts = num_parts + self.recursive = recursive + self.keep_inter_cluster_edges = keep_inter_cluster_edges + self.sparse_format = sparse_format + + recursive_str = '_recursive' if recursive else '' + root_dir = osp.join(save_dir or '', f'part_{num_parts}{recursive_str}') + path = osp.join(root_dir, filename or 'metis.pt') + + if save_dir is not None and osp.exists(path): + self.partition = fs.torch_load(path) + else: + if log: # pragma: no cover + print('Computing METIS partitioning...', file=sys.stderr) + + cluster = self._metis(data.edge_index, data.num_nodes) + self.partition = self._partition(data.edge_index, cluster) + + if save_dir is not None: + os.makedirs(root_dir, exist_ok=True) + paddle.save(self.partition, path) + + if log: # pragma: no cover + print('Done!', file=sys.stderr) + + self.data = self._permute_data(data, self.partition) + + def _metis(self, edge_index: Tensor, num_nodes: int) -> Tensor: + # Computes a node-level partition assignment vector via METIS. + if self.sparse_format == 'csr': # Calculate CSR representation: + row, index = sort_edge_index(edge_index, num_nodes=num_nodes) + indptr = index2ptr(row, size=num_nodes) + else: # Calculate CSC representation: + index, col = sort_edge_index(edge_index, num_nodes=num_nodes, + sort_by_row=False) + indptr = index2ptr(col, size=num_nodes) + + # Compute METIS partitioning: + cluster: Optional[Tensor] = None + + if paddle_geometric.typing.WITH_TORCH_SPARSE: + try: + cluster = paddle.ops.torch_sparse.partition( + indptr.cpu(), + index.cpu(), + None, + self.num_parts, + self.recursive, + ).to(edge_index.device) + except (AttributeError, RuntimeError): + pass + + if cluster is None and paddle_geometric.typing.WITH_METIS: + cluster = pyg_lib.partition.metis( + indptr.cpu(), + index.cpu(), + self.num_parts, + recursive=self.recursive, + ).to(edge_index.device) + + if cluster is None: + raise ImportError(f"'{self.__class__.__name__}' requires either " + f"'pyg-lib' or 'torch-sparse'") + + return cluster + + def _partition(self, edge_index: Tensor, cluster: Tensor) -> Partition: + # Computes node-level and edge-level permutations and permutes the edge + # connectivity accordingly: + + # Sort `cluster` and compute boundaries `partptr`: + cluster, node_perm = index_sort(cluster, max_value=self.num_parts) + partptr = index2ptr(cluster, size=self.num_parts) + + # Permute `edge_index` based on node permutation: + edge_perm = paddle.arange(edge_index.size(1), device=edge_index.device) + arange = paddle.empty_like(node_perm) + arange[node_perm] = paddle.arange(cluster.numel(), + device=cluster.device) + edge_index = arange[edge_index] + + # Compute final CSR representation: + (row, col), edge_perm = sort_edge_index( + edge_index, + edge_attr=edge_perm, + num_nodes=cluster.numel(), + sort_by_row=self.sparse_format == 'csr', + ) + if self.sparse_format == 'csr': + indptr, index = index2ptr(row, size=cluster.numel()), col + else: + indptr, index = index2ptr(col, size=cluster.numel()), row + + return Partition(indptr, index, partptr, node_perm, edge_perm, + self.sparse_format) + + def _permute_data(self, data: Data, partition: Partition) -> Data: + # Permute node-level and edge-level attributes according to the + # calculated permutations in `Partition`: + out = copy.copy(data) + for key, value in data.items(): + if key == 'edge_index': + continue + elif data.is_node_attr(key): + cat_dim = data.__cat_dim__(key, value) + out[key] = select(value, partition.node_perm, dim=cat_dim) + elif data.is_edge_attr(key): + cat_dim = data.__cat_dim__(key, value) + out[key] = select(value, partition.edge_perm, dim=cat_dim) + out.edge_index = None + + return out + + def __len__(self) -> int: + return self.partition.partptr.numel() - 1 + + def __getitem__(self, idx: int) -> Data: + node_start = int(self.partition.partptr[idx]) + node_end = int(self.partition.partptr[idx + 1]) + node_length = node_end - node_start + + indptr = self.partition.indptr[node_start:node_end + 1] + edge_start = int(indptr[0]) + edge_end = int(indptr[-1]) + edge_length = edge_end - edge_start + indptr = indptr - edge_start + + if self.sparse_format == 'csr': + row = ptr2index(indptr) + col = self.partition.index[edge_start:edge_end] + if not self.keep_inter_cluster_edges: + edge_mask = (col >= node_start) & (col < node_end) + row = row[edge_mask] + col = col[edge_mask] - node_start + else: + col = ptr2index(indptr) + row = self.partition.index[edge_start:edge_end] + if not self.keep_inter_cluster_edges: + edge_mask = (row >= node_start) & (row < node_end) + col = col[edge_mask] + row = row[edge_mask] - node_start + + out = copy.copy(self.data) + + for key, value in self.data.items(): + if key == 'num_nodes': + out.num_nodes = node_length + elif self.data.is_node_attr(key): + cat_dim = self.data.__cat_dim__(key, value) + out[key] = narrow(value, cat_dim, node_start, node_length) + elif self.data.is_edge_attr(key): + cat_dim = self.data.__cat_dim__(key, value) + out[key] = narrow(value, cat_dim, edge_start, edge_length) + if not self.keep_inter_cluster_edges: + out[key] = out[key][edge_mask] + + out.edge_index = paddle.stack([row, col], dim=0) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.num_parts})' + + +class ClusterLoader(paddle.io.DataLoader): + r"""The data loader scheme from the `"Cluster-GCN: An Efficient Algorithm + for Training Deep and Large Graph Convolutional Networks" + `_ paper which merges partioned subgraphs + and their between-cluster links from a large-scale graph data object to + form a mini-batch. + + .. note:: + + Use :class:`~paddle_geometric.loader.ClusterData` and + :class:`~paddle_geometric.loader.ClusterLoader` in conjunction to + form mini-batches of clusters. + For an example of using Cluster-GCN, see + `examples/cluster_gcn_reddit.py `_ or + `examples/cluster_gcn_ppi.py `_. + + Args: + cluster_data (paddle_geometric.loader.ClusterData): The already + partioned data object. + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`batch_size`, + :obj:`shuffle`, :obj:`drop_last` or :obj:`num_workers`. + """ + def __init__(self, cluster_data, **kwargs): + self.cluster_data = cluster_data + iterator = range(len(cluster_data)) + super().__init__(iterator, collate_fn=self._collate, **kwargs) + + def _collate(self, batch: List[int]) -> Data: + if not isinstance(batch, paddle.Tensor): + batch = paddle.tensor(batch) + + global_indptr = self.cluster_data.partition.indptr + global_index = self.cluster_data.partition.index + + # Get all node-level and edge-level start and end indices for the + # current mini-batch: + node_start = self.cluster_data.partition.partptr[batch] + node_end = self.cluster_data.partition.partptr[batch + 1] + edge_start = global_indptr[node_start] + edge_end = global_indptr[node_end] + + # Iterate over each partition in the batch and calculate new edge + # connectivity. This is done by slicing the corresponding source and + # destination indices for each partition and adjusting their indices to + # start from zero: + rows, cols, nodes, cumsum = [], [], [], 0 + for i in range(batch.numel()): + nodes.append(paddle.arange(node_start[i], node_end[i])) + indptr = global_indptr[node_start[i]:node_end[i] + 1] + indptr = indptr - edge_start[i] + if self.cluster_data.partition.sparse_format == 'csr': + row = ptr2index(indptr) + cumsum + col = global_index[edge_start[i]:edge_end[i]] + + else: + col = ptr2index(indptr) + cumsum + row = global_index[edge_start[i]:edge_end[i]] + + rows.append(row) + cols.append(col) + cumsum += indptr.numel() - 1 + + node = paddle.concat(nodes, dim=0) + row = paddle.concat(rows, dim=0) + col = paddle.concat(cols, dim=0) + + # Map `col` vector to valid entries and remove any entries that do not + # connect two nodes within the same mini-batch: + if self.cluster_data.partition.sparse_format == 'csr': + col, edge_mask = map_index(col, node) + row = row[edge_mask] + else: + row, edge_mask = map_index(row, node) + col = col[edge_mask] + out = copy.copy(self.cluster_data.data) + + # Slice node-level and edge-level attributes according to its offsets: + for key, value in self.cluster_data.data.items(): + if key == 'num_nodes': + out.num_nodes = cumsum + elif self.cluster_data.data.is_node_attr(key): + cat_dim = self.cluster_data.data.__cat_dim__(key, value) + out[key] = paddle.concat([ + narrow(out[key], cat_dim, s, e - s) + for s, e in zip(node_start, node_end) + ], dim=cat_dim) + elif self.cluster_data.data.is_edge_attr(key): + cat_dim = self.cluster_data.data.__cat_dim__(key, value) + value = paddle.concat([ + narrow(out[key], cat_dim, s, e - s) + for s, e in zip(edge_start, edge_end) + ], dim=cat_dim) + out[key] = select(value, edge_mask, dim=cat_dim) + + out.edge_index = paddle.stack([row, col], dim=0) + + return out diff --git a/jointContribution/mattergen/paddle_geometric/loader/data_list_loader.py b/jointContribution/mattergen/paddle_geometric/loader/data_list_loader.py new file mode 100644 index 00000000..8d5dd05d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/data_list_loader.py @@ -0,0 +1,41 @@ +from typing import List, Union + +import paddle +from paddle.io import DataLoader + +from paddle_geometric.data import Dataset +from paddle_geometric.data.data import BaseData + + +def collate_fn(data_list): + return data_list + + +class DataListLoader(DataLoader): + r"""A data loader which batches data objects from a + :class:`paddle_geometric.data.dataset` to a :python:`Python` list. + Data objects can be either of type :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData`. + + .. note:: + + This data loader should be used for multi-GPU support via + :class:`paddle_geometric.nn.DataParallel`. + + Args: + dataset (Dataset): The dataset from which to load the data. + batch_size (int, optional): How many samples per batch to load. + (default: :obj:`1`) + shuffle (bool, optional): If set to :obj:`True`, the data will be + reshuffled at every epoch. (default: :obj:`False`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`drop_last` or + :obj:`num_workers`. + """ + def __init__(self, dataset: Union[Dataset, List[BaseData]], + batch_size: int = 1, shuffle: bool = False, **kwargs): + # Remove for PyTorch Lightning: + kwargs.pop('collate_fn', None) + + super().__init__(dataset, batch_size=batch_size, shuffle=shuffle, + collate_fn=collate_fn, **kwargs) diff --git a/jointContribution/mattergen/paddle_geometric/loader/dataloader.py b/jointContribution/mattergen/paddle_geometric/loader/dataloader.py new file mode 100644 index 00000000..d969c830 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/dataloader.py @@ -0,0 +1,93 @@ +from collections.abc import Mapping +from typing import Any, List, Optional, Sequence, Union + +import paddle +from paddle.io import DataLoader as PaddleDataLoader + +from paddle_geometric.data import Batch, Dataset +from paddle_geometric.data.data import BaseData +from paddle_geometric.data.datapipes import DatasetAdapter +from paddle_geometric.typing import TensorFrame, paddle_frame + + +class Collater: + def __init__( + self, + dataset: Union[Dataset, Sequence[BaseData], DatasetAdapter], + follow_batch: Optional[List[str]] = None, + exclude_keys: Optional[List[str]] = None, + ): + self.dataset = dataset + self.follow_batch = follow_batch + self.exclude_keys = exclude_keys + + def __call__(self, batch: List[Any]) -> Any: + elem = batch[0] + if isinstance(elem, BaseData): + return Batch.from_data_list( + batch, + follow_batch=self.follow_batch, + exclude_keys=self.exclude_keys, + ) + elif isinstance(elem, paddle.Tensor): + return paddle.to_tensor(batch) + elif isinstance(elem, TensorFrame): + return paddle_frame.cat(batch, axis=0) + elif isinstance(elem, float): + return paddle.to_tensor(batch, dtype='float32') + elif isinstance(elem, int): + return paddle.to_tensor(batch, dtype='int64') + elif isinstance(elem, str): + return batch + elif isinstance(elem, Mapping): + return {key: self([data[key] for data in batch]) for key in elem} + elif isinstance(elem, tuple) and hasattr(elem, '_fields'): + return type(elem)(*(self(s) for s in zip(*batch))) + elif isinstance(elem, Sequence) and not isinstance(elem, str): + return [self(s) for s in zip(*batch)] + + raise TypeError(f"DataLoader found invalid type: '{type(elem)}'") + + +class DataLoader(PaddleDataLoader): + r"""A data loader which merges data objects from a + :class:`paddle_geometric.data.Dataset` to a mini-batch. + Data objects can be either of type :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData`. + + Args: + dataset (Dataset): The dataset from which to load the data. + batch_size (int, optional): How many samples per batch to load. + (default: :obj:`1`) + shuffle (bool, optional): If set to :obj:`True`, the data will be + reshuffled at every epoch. (default: :obj:`False`) + follow_batch (List[str], optional): Creates assignment batch + vectors for each key in the list. (default: :obj:`None`) + exclude_keys (List[str], optional): Will exclude each key in the + list. (default: :obj:`None`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`. + """ + def __init__( + self, + dataset: Union[Dataset, Sequence[BaseData], DatasetAdapter], + batch_size: int = 1, + shuffle: bool = False, + follow_batch: Optional[List[str]] = None, + exclude_keys: Optional[List[str]] = None, + **kwargs, + ): + # Remove for PyTorch Lightning: + kwargs.pop('collate_fn', None) + + # Save for PyTorch Lightning < 1.6: + self.follow_batch = follow_batch + self.exclude_keys = exclude_keys + + super().__init__( + dataset, + batch_size, + shuffle, + collate_fn=Collater(dataset, follow_batch, exclude_keys), + **kwargs, + ) diff --git a/jointContribution/mattergen/paddle_geometric/loader/dense_data_loader.py b/jointContribution/mattergen/paddle_geometric/loader/dense_data_loader.py new file mode 100644 index 00000000..d79881ea --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/dense_data_loader.py @@ -0,0 +1,46 @@ +from typing import List, Union + +import paddle +from paddle.io import DataLoader as PaddleDataLoader +from paddle.io.dataloader.collate import default_collate_fn + +from paddle_geometric.data import Batch, Data, Dataset + + +def collate_fn(data_list: List[Data]) -> Batch: + batch = Batch() + for key in data_list[0].keys(): + batch[key] = default_collate_fn([data[key] for data in data_list]) + return batch + + +class DenseDataLoader(PaddleDataLoader): + r"""A data loader which batches data objects from a + :class:`paddle_geometric.data.dataset` to a + :class:`paddle_geometric.data.Batch` object by stacking all attributes in a + new dimension. + + .. note:: + + To make use of this data loader, all graph attributes in the dataset + need to have the same shape. + In particular, this data loader should only be used when working with + *dense* adjacency matrices. + + Args: + dataset (Dataset): The dataset from which to load the data. + batch_size (int, optional): How many samples per batch to load. + (default: :obj:`1`) + shuffle (bool, optional): If set to :obj:`True`, the data will be + reshuffled at every epoch. (default: :obj:`False`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`drop_last` or + :obj:`num_workers`. + """ + def __init__(self, dataset: Union[Dataset, List[Data]], + batch_size: int = 1, shuffle: bool = False, **kwargs): + # Remove for Paddle Lightning: + kwargs.pop('collate_fn', None) + + super().__init__(dataset, batch_size=batch_size, shuffle=shuffle, + collate_fn=collate_fn, **kwargs) diff --git a/jointContribution/mattergen/paddle_geometric/loader/dynamic_batch_sampler.py b/jointContribution/mattergen/paddle_geometric/loader/dynamic_batch_sampler.py new file mode 100644 index 00000000..1206b788 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/dynamic_batch_sampler.py @@ -0,0 +1,107 @@ +from typing import Iterator, List, Optional + +import paddle + +from paddle_geometric.data import Dataset + + +class DynamicBatchSampler(paddle.io.Sampler): + r"""Dynamically adds samples to a mini-batch up to a maximum size (either + based on number of nodes or number of edges). When data samples have a + wide range in sizes, specifying a mini-batch size in terms of number of + samples is not ideal and can cause CUDA OOM errors. + + Within the :class:`DynamicBatchSampler`, the number of steps per epoch is + ambiguous, depending on the order of the samples. By default the + :meth:`__len__` will be undefined. This is fine for most cases but + progress bars will be infinite. Alternatively, :obj:`num_steps` can be + supplied to cap the number of mini-batches produced by the sampler. + + .. code-block:: python + + from paddle_geometric.loader import DataLoader, DynamicBatchSampler + + sampler = DynamicBatchSampler(dataset, max_num=10000, mode="node") + loader = DataLoader(dataset, batch_sampler=sampler, ...) + + Args: + dataset (Dataset): Dataset to sample from. + max_num (int): Size of mini-batch to aim for in number of nodes or + edges. + mode (str, optional): :obj:`"node"` or :obj:`"edge"` to measure + batch size. (default: :obj:`"node"`) + shuffle (bool, optional): If set to :obj:`True`, will have the data + reshuffled at every epoch. (default: :obj:`False`) + skip_too_big (bool, optional): If set to :obj:`True`, skip samples + which cannot fit in a batch by itself. (default: :obj:`False`) + num_steps (int, optional): The number of mini-batches to draw for a + single epoch. If set to :obj:`None`, will iterate through all the + underlying examples, but :meth:`__len__` will be :obj:`None` since + it is ambiguous. (default: :obj:`None`) + """ + def __init__( + self, + dataset: Dataset, + max_num: int, + mode: str = 'node', + shuffle: bool = False, + skip_too_big: bool = False, + num_steps: Optional[int] = None, + ): + if max_num <= 0: + raise ValueError(f"`max_num` should be a positive integer value " + f"(got {max_num})") + if mode not in ['node', 'edge']: + raise ValueError(f"`mode` choice should be either " + f"'node' or 'edge' (got '{mode}')") + + self.dataset = dataset + self.max_num = max_num + self.mode = mode + self.shuffle = shuffle + self.skip_too_big = skip_too_big + self.num_steps = num_steps + self.max_steps = num_steps or len(dataset) + + def __iter__(self) -> Iterator[List[int]]: + if self.shuffle: + indices = paddle.randperm(len(self.dataset)).tolist() + else: + indices = range(len(self.dataset)) + + samples: List[int] = [] + current_num: int = 0 + num_steps: int = 0 + num_processed: int = 0 + + while (num_processed < len(self.dataset) + and num_steps < self.max_steps): + + for i in indices[num_processed:]: + data = self.dataset[i] + num = data.num_nodes if self.mode == 'node' else data.num_edges + + if current_num + num > self.max_num: + if current_num == 0: + if self.skip_too_big: + continue + else: # Mini-batch filled: + break + + samples.append(i) + num_processed += 1 + current_num += num + + yield samples + samples: List[int] = [] + current_num = 0 + num_steps += 1 + + def __len__(self) -> int: + if self.num_steps is None: + raise ValueError(f"The length of '{self.__class__.__name__}' is " + f"undefined since the number of steps per epoch " + f"is ambiguous. Either specify `num_steps` or " + f"use a static batch sampler.") + + return self.num_steps diff --git a/jointContribution/mattergen/paddle_geometric/loader/graph_saint.py b/jointContribution/mattergen/paddle_geometric/loader/graph_saint.py new file mode 100644 index 00000000..4ea39186 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/graph_saint.py @@ -0,0 +1,184 @@ +import os.path as osp +from typing import Optional +import paddle +from paddle.io import DataLoader +from paddle import Tensor +from paddle_geometric.data import Data +from paddle_geometric.typing import SparseTensor +from tqdm import tqdm +import paddle_geometric.io.fs as fs + +class GraphSAINTSampler(DataLoader): + r"""The GraphSAINT sampler base class from the `"GraphSAINT: Graph + Sampling Based Inductive Learning Method" + `_ paper. + """ + def __init__(self, data, batch_size: int, num_steps: int = 1, + sample_coverage: int = 0, save_dir: Optional[str] = None, + log: bool = True, **kwargs): + + assert data.edge_index is not None + assert 'node_norm' not in data + assert 'edge_norm' not in data + + self.num_steps = num_steps + self._batch_size = batch_size + self.sample_coverage = sample_coverage + self.save_dir = save_dir + self.log = log + + self.N = N = data.num_nodes + self.E = data.num_edges + + self.adj = SparseTensor( + row=data.edge_index[0], col=data.edge_index[1], + value=paddle.arange(self.E, device=data.edge_index.device), + sparse_sizes=(N, N)) + + self.data = data + + super().__init__(self, batch_size=1, collate_fn=self._collate, + **kwargs) + + if self.sample_coverage > 0: + path = osp.join(save_dir or '', self._filename) + if save_dir is not None and osp.exists(path): + self.node_norm, self.edge_norm = fs.torch_load(path) + else: + self.node_norm, self.edge_norm = self._compute_norm() + if save_dir is not None: + paddle.save((self.node_norm, self.edge_norm), path) + + @property + def _filename(self): + return f'{self.__class__.__name__.lower()}_{self.sample_coverage}.pt' + + def __len__(self): + return self.num_steps + + def _sample_nodes(self, batch_size): + raise NotImplementedError + + def __getitem__(self, idx): + node_idx = self._sample_nodes(self._batch_size).unique() + adj, _ = self.adj.saint_subgraph(node_idx) + return node_idx, adj + + def _collate(self, data_list): + assert len(data_list) == 1 + node_idx, adj = data_list[0] + + data = self.data.__class__() + data.num_nodes = node_idx.size(0) + row, col, edge_idx = adj.coo() + data.edge_index = paddle.stack([row, col], axis=0) + + for key, item in self.data.items(): + if key in ['edge_index', 'num_nodes']: + continue + if isinstance(item, paddle.Tensor) and item.size(0) == self.N: + data[key] = item[node_idx] + elif isinstance(item, paddle.Tensor) and item.size(0) == self.E: + data[key] = item[edge_idx] + else: + data[key] = item + + if self.sample_coverage > 0: + data.node_norm = self.node_norm[node_idx] + data.edge_norm = self.edge_norm[edge_idx] + + return data + + def _compute_norm(self): + node_count = paddle.zeros(self.N, dtype=paddle.float32) + edge_count = paddle.zeros(self.E, dtype=paddle.float32) + + loader = DataLoader(self, batch_size=200, + collate_fn=lambda x: x, + num_workers=self.num_workers) + + if self.log: + pbar = tqdm(total=self.N * self.sample_coverage) + pbar.set_description('Compute GraphSAINT normalization') + + num_samples = total_sampled_nodes = 0 + while total_sampled_nodes < self.N * self.sample_coverage: + for data in loader: + for node_idx, adj in data: + edge_idx = adj.storage.value() + node_count[node_idx] += 1 + edge_count[edge_idx] += 1 + total_sampled_nodes += node_idx.size(0) + + if self.log: + pbar.update(node_idx.size(0)) + num_samples += self.num_steps + + if self.log: + pbar.close() + + row, _, edge_idx = self.adj.coo() + t = paddle.empty_like(edge_count).scatter_(0, edge_idx, node_count[row]) + edge_norm = (t / edge_count).clip(min=0, max=1e4) + edge_norm[paddle.isnan(edge_norm)] = 0.1 + + node_count[node_count == 0] = 0.1 + node_norm = num_samples / node_count / self.N + + return node_norm, edge_norm + + +class GraphSAINTNodeSampler(GraphSAINTSampler): + r"""The GraphSAINT node sampler class (see + :class:`~paddle_geometric.loader.GraphSAINTSampler`). + """ + def _sample_nodes(self, batch_size): + edge_sample = paddle.randint(0, self.E, (batch_size, self.batch_size), + dtype=paddle.long) + + return self.adj.storage.row()[edge_sample] + + +class GraphSAINTEdgeSampler(GraphSAINTSampler): + r"""The GraphSAINT edge sampler class (see + :class:`~paddle_geometric.loader.GraphSAINTSampler`). + """ + def _sample_nodes(self, batch_size): + row, col, _ = self.adj.coo() + + deg_in = 1. / self.adj.storage.colcount() + deg_out = 1. / self.adj.storage.rowcount() + prob = (1. / deg_in[row]) + (1. / deg_out[col]) + + rand = paddle.rand((batch_size, self.E)).log() / (prob + 1e-10) + edge_sample = rand.topk(self.batch_size, axis=-1).indices + + source_node_sample = col[edge_sample] + target_node_sample = row[edge_sample] + + return paddle.concat([source_node_sample, target_node_sample], -1) + + +class GraphSAINTRandomWalkSampler(GraphSAINTSampler): + r"""The GraphSAINT random walk sampler class (see + :class:`~paddle_geometric.loader.GraphSAINTSampler`). + + Args: + walk_length (int): The length of each random walk. + """ + def __init__(self, data, batch_size: int, walk_length: int, + num_steps: int = 1, sample_coverage: int = 0, + save_dir: Optional[str] = None, log: bool = True, **kwargs): + self.walk_length = walk_length + super().__init__(data, batch_size, num_steps, sample_coverage, + save_dir, log, **kwargs) + + @property + def _filename(self): + return (f'{self.__class__.__name__.lower()}_{self.walk_length}_' + f'{self.sample_coverage}.pt') + + def _sample_nodes(self, batch_size): + start = paddle.randint(0, self.N, (batch_size,), dtype=paddle.long) + node_idx = self.adj.random_walk(start.flatten(), self.walk_length) + return node_idx.view(-1) diff --git a/jointContribution/mattergen/paddle_geometric/loader/hgt_loader.py b/jointContribution/mattergen/paddle_geometric/loader/hgt_loader.py new file mode 100644 index 00000000..313ef422 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/hgt_loader.py @@ -0,0 +1,71 @@ +import os.path as osp +from typing import Callable, Dict, List, Optional, Tuple, Union + +import paddle +from paddle.io import DataLoader + +from paddle_geometric.data import FeatureStore, GraphStore, HeteroData +from paddle_geometric.sampler import HGTSampler +from paddle_geometric.typing import NodeType +from paddle_geometric.data import Data + +class HGTLoader(DataLoader): + r"""The Heterogeneous Graph Sampler from the `"Heterogeneous Graph + Transformer" `_ paper. + This loader allows for mini-batch training of GNNs on large-scale graphs + where full-batch training is not feasible. + + :class:`~paddle_geometric.data.HGTLoader` tries to (1) keep a similar + number of nodes and edges for each type and (2) keep the sampled sub-graph + dense to minimize the information loss and reduce the sample variance. + + Methodically, :class:`~paddle_geometric.data.HGTLoader` keeps track of a + node budget for each node type, which is then used to determine the + sampling probability of a node. + In particular, the probability of sampling a node is determined by the + number of connections to already sampled nodes and their node degrees. + With this, :class:`~paddle_geometric.data.HGTLoader` will sample a fixed + amount of neighbors for each node type in each iteration, as given by the + :obj:`num_samples` argument. + """ + def __init__( + self, + data: Union[HeteroData, Tuple[FeatureStore, GraphStore]], + num_samples: Union[List[int], Dict[NodeType, List[int]]], + input_nodes: Union[NodeType, Tuple[NodeType, Optional[paddle.Tensor]]], + is_sorted: bool = False, + transform: Optional[Callable] = None, + transform_sampler_output: Optional[Callable] = None, + filter_per_worker: Optional[bool] = None, + **kwargs, + ): + hgt_sampler = HGTSampler( + data, + num_samples=num_samples, + is_sorted=is_sorted, + share_memory=kwargs.get('num_workers', 0) > 0, + ) + + super().__init__( + dataset=data, + batch_sampler=hgt_sampler, + input_nodes=input_nodes, + transform=transform, + transform_sampler_output=transform_sampler_output, + filter_per_worker=filter_per_worker, + **kwargs, + ) + + def __iter__(self): + """Iterates over the dataset and yields batches of sampled data.""" + # Implement the logic for batch-wise iteration + # Adapt from the sampler or data object, yielding mini-batches + pass + + def _collate(self, data_list): + """Handles batching of heterogeneous data objects.""" + # Similar to the PyTorch implementation but adapted for Paddle + batch = Data() + for key in data_list[0].keys: + batch[key] = paddle.stack([data[key] for data in data_list]) + return batch diff --git a/jointContribution/mattergen/paddle_geometric/loader/ibmb_loader.py b/jointContribution/mattergen/paddle_geometric/loader/ibmb_loader.py new file mode 100644 index 00000000..2ae4d795 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/ibmb_loader.py @@ -0,0 +1,917 @@ +import logging +import math +from typing import ( + Any, + Callable, + Iterator, + List, + NamedTuple, + Optional, + Tuple, + Union, +) + +import numpy as np +import paddle +from paddle import Tensor +from tqdm import tqdm + +from paddle_geometric.data import Data +from paddle_geometric.typing import SparseTensor +from paddle_geometric.utils import get_ppr, is_undirected, subgraph + +try: + import numba + WITH_NUMBA = True +except ImportError: # pragma: no cover + WITH_NUMBA = False + + +class OutputNodes(NamedTuple): + seed_id: Tensor + auxiliary_id: Tensor + + +class _IBMBBaseLoader(paddle.io.DataLoader): + def __init__(self, data: Data, **kwargs): + kwargs.pop('collate_fn', None) + batch_size = kwargs.get('batch_size', 1) + + output_nodes = self.get_output_nodes(self) + + if batch_size == 1: # Pre-process subgraphs: + data_list = ... + super().__init__(data_list, collate_fn=self._cache_fn, **kwargs) + else: + self.data = data + super().__init__(output_nodes, collate_fn=self._collate_fn, + **kwargs) + + def get_output_nodes(self) -> List[OutputNodes]: + raise NotImplementedError + + def _cache_fn(self, data_list: List[Data]) -> Data: + assert len(data_list) == 1 + return data_list[0] + + def _collate_fn(self, output_nodes: List[OutputNodes]) -> Data: + raise NotImplementedError + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' + + +############################################################################### + + +def get_partitions( + edge_index: Union[Tensor, SparseTensor], + num_partitions: int, + indices: Tensor, + num_nodes: int, + output_weight: Optional[float] = None, +) -> List[Tensor]: + assert isinstance( + edge_index, + (paddle.int64, + SparseTensor)), f'Unsupported edge_index type {type(edge_index)}' + if isinstance(edge_index, paddle.int64): + edge_index = SparseTensor.from_edge_index( + edge_index, sparse_sizes=(num_nodes, num_nodes)) + + if output_weight is not None and output_weight != 1: + node_weight = paddle.ones(num_nodes) + node_weight[indices] = output_weight + else: + node_weight = None + + _, partptr, perm = edge_index.partition(num_parts=num_partitions, + recursive=False, weighted=False, + node_weight=node_weight) + + partitions = [] + for i in range(len(partptr) - 1): + partitions.append(perm[partptr[i]:partptr[i + 1]]) + + return partitions + + +def get_pair_wise_distance( + ys: List, + num_classes: int, + dist_type: str = 'kl', +) -> np.ndarray: + num_batches = len(ys) + + counts = np.zeros((num_batches, num_classes), dtype=np.int32) + for i in range(num_batches): + unique, count = np.unique(ys[i], return_counts=True) + counts[i, unique] = count + + counts += 1 + counts = counts / counts.sum(1).reshape(-1, 1) + pairwise_dist = np.zeros((num_batches, num_batches), dtype=np.float64) + + for i in range(0, num_batches - 1): + for j in range(i + 1, num_batches): + if dist_type == 'l1': + pairwise_dist[i, j] = np.sum(np.abs(counts[i] - counts[j])) + elif dist_type == 'kl': + + def kl_divergence(p: np.ndarray, q: np.ndarray): + return (p * np.log(p / q)).sum() + + pairwise_dist[i, j] = kl_divergence(counts[i], + counts[j]) + kl_divergence( + counts[j], counts[i]) + else: + raise ValueError + + pairwise_dist += pairwise_dist.T + pairwise_dist += 1e-5 # for numerical stability + np.fill_diagonal(pairwise_dist, 0.) + + return pairwise_dist + + +def indices_complete_check( + loader: List[Tuple[Union[Tensor, np.ndarray], Union[Tensor, np.ndarray]]], + output_indices: Union[Tensor, np.ndarray], +): + if isinstance(output_indices, Tensor): + output_indices = output_indices.cpu().numpy() + + outs = [] + for out, aux in loader: + if isinstance(out, Tensor): + out = out.cpu().numpy() + if isinstance(aux, Tensor): + aux = aux.cpu().numpy() + + assert np.all(np.in1d(out, + aux)), "Not all output nodes are in aux nodes!" + outs.append(out) + + outs = np.sort(np.concatenate(outs)) + assert np.all( + outs == np.sort(output_indices)), "Output nodes missing or duplicate!" + + +def get_subgraph( + out_indices: Tensor, + graph: Data, + return_edge_index_type: str, + adj: SparseTensor, + **kwargs, +): + if return_edge_index_type == 'adj': + assert adj is not None + + if return_edge_index_type == 'adj': + subg = Data(x=graph.x[out_indices], y=graph.y[out_indices], + edge_index=adj[out_indices, :][:, out_indices]) + elif return_edge_index_type == 'edge_index': + edge_index, edge_attr = subgraph(out_indices, graph.edge_index, + graph.edge_attr, relabel_nodes=True, + num_nodes=graph.num_nodes, + return_edge_mask=False) + subg = Data(x=graph.x[out_indices], y=graph.y[out_indices], + edge_index=edge_index, edge_attr=edge_attr) + else: + raise NotImplementedError + + for k, v in kwargs.items(): + subg[k] = v + + return subg + + +def define_sampler( + batch_order: str, + ys: List[Union[Tensor, np.ndarray, List]], + num_classes: int, + dist_type: str = 'kl', +): + if batch_order == 'rand': + logging.info("Running with random order") + sampler = paddle.io.RandomSampler(ys) + elif batch_order in ['order', 'sample']: + kl_div = get_pair_wise_distance(ys, num_classes, dist_type=dist_type) + if batch_order == 'order': + from python_tsp.heuristics import solve_tsp_simulated_annealing + best_perm, _ = solve_tsp_simulated_annealing(kl_div) + logging.info(f"Running with given order: {best_perm}") + sampler = IBMBOrderedSampler(best_perm) + else: + logging.info("Running with weighted sampling") + sampler = IBMBWeightedSampler(kl_div) + else: + raise ValueError + + return sampler + + +def create_batchwise_out_aux_pairs( + adj: SparseTensor, + partitions: List[Union[paddle.int64, np.ndarray]], + prime_indices: Union[paddle.int64, np.ndarray], + topk: int, + num_outnodeset_per_batch: int = 50, + alpha: float = 0.2, + ppr_iterations: int = 50, +) -> List[Tuple[np.ndarray, np.ndarray]]: + def ppr_power_method( + adj: SparseTensor, + batch: List[Union[np.ndarray, paddle.int64]], + topk: int, + num_iter: int, + alpha: float, + ) -> List[np.ndarray]: + + topk_neighbors = [] + logits = paddle.zeros( + adj.size(0), len(batch), + device=adj.device()) # each column contains a set of output nodes + for i, tele_set in enumerate(batch): + logits[tele_set, i] = 1. / len(tele_set) + + new_logits = logits.clone() + for i in range(num_iter): + new_logits = adj @ new_logits * (1 - alpha) + alpha * logits + + inds = new_logits.argsort(0) + nonzeros = (new_logits > 0).sum(0) + nonzeros = paddle.minimum( + nonzeros, + paddle.to_tensor([topk], dtype=paddle.int64, device=adj.device())) + for i in range(new_logits.shape[1]): + topk_neighbors.append(inds[-nonzeros[i]:, i].cpu().numpy()) + + return topk_neighbors + + device = 'gpu' if paddle.is_compiled_with_cuda() else 'cpu' + if isinstance(prime_indices, Tensor): + prime_indices = prime_indices.cpu().numpy() + + adj = adj.to(device) + + cur_output_nodes = [] + loader = [] + + pbar = tqdm(range(len(partitions))) + pbar.set_description("Processing topic-sensitive PPR batches") + for n in pbar: + part = partitions[n] + if isinstance(part, Tensor): + part = part.cpu().numpy() + + primes_in_part, *_ = np.intersect1d(part, prime_indices, + assume_unique=True, + return_indices=True) + if len(primes_in_part): # no output nodes in this partition + cur_output_nodes.append(primes_in_part) + + # accumulate enough output nodes to make good use of GPU memory + if len(cur_output_nodes + ) >= num_outnodeset_per_batch or n == len(partitions) - 1: + topk_neighbors = ppr_power_method(adj, cur_output_nodes, topk, + ppr_iterations, alpha) + for i in range(len(cur_output_nodes)): + # force output nodes to be aux nodes + auxiliary_nodes = np.union1d(cur_output_nodes[i], + topk_neighbors[i]) + loader.append((cur_output_nodes[i], auxiliary_nodes)) + cur_output_nodes = [] + + if paddle.is_compiled_with_cuda(): + paddle.device.cuda.empty_cache() + + return loader + + +def get_pairs(ppr_mat: Any) -> np.ndarray: + ppr_mat = ppr_mat + ppr_mat.transpose() + + ppr_mat = ppr_mat.tocoo() + row, col, data = ppr_mat.row, ppr_mat.col, ppr_mat.data + mask = (row > col) # lu + + row, col, data = row[mask], col[mask], data[mask] + sort_arg = np.argsort(data)[::-1] + # sort_arg = parallel_sort.parallel_argsort(data)[::-1] + + # map prime_nodes to arange + ppr_pairs = np.vstack((row[sort_arg], col[sort_arg])).T + return ppr_pairs + + +_prime_orient_merge_numba: Optional[Callable] = None + + +def prime_orient_merge( + ppr_pairs: np.ndarray, + primes_per_batch: int, + num_nodes: int, +): + if not WITH_NUMBA: # pragma: no cover + raise ImportError("'prime_orient_merge' requires the 'numba' package") + + global _prime_orient_merge_numba + if _prime_orient_merge_numba is None: + _prime_orient_merge_numba = numba.njit(cache=True)(_prime_orient_merge) + + return _prime_orient_merge_numba(ppr_pairs, primes_per_batch, num_nodes) + + +def _prime_orient_merge( + ppr_pairs: np.ndarray, + primes_per_batch: int, + num_nodes: int, +): + id_primes_list = list(np.arange(num_nodes, dtype=np.int32).reshape(-1, 1)) + node_id_list = np.arange(num_nodes, dtype=np.int32) + placeholder = np.zeros(0, dtype=np.int32) + + for i, j in ppr_pairs: + id1, id2 = node_id_list[i], node_id_list[j] + if id1 > id2: + id1, id2 = id2, id1 + + if id1 != id2 and len(id_primes_list[id1]) + len( + id_primes_list[id2]) <= primes_per_batch: + id_primes_list[id1] = np.concatenate( + (id_primes_list[id1], id_primes_list[id2])) + node_id_list[id_primes_list[id2]] = id1 + id_primes_list[id2] = placeholder + + prime_lst = list() + ids = np.unique(node_id_list) + + for _id in ids: + prime_lst.append(list(id_primes_list[_id])) + + return list(prime_lst) + + +def prime_post_process(loader, merge_max_size): + from heapq import heapify, heappop, heappush + + h = [( + len(p), + p, + ) for p in loader] + heapify(h) + + while len(h) > 1: + len1, p1 = heappop(h) + len2, p2 = heappop(h) + if len1 + len2 <= merge_max_size: + heappush(h, (len1 + len2, p1 + p2)) + else: + heappush(h, ( + len1, + p1, + )) + heappush(h, ( + len2, + p2, + )) + break + + new_batch = [] + + while len(h): + _, p = heappop(h) + new_batch.append(p) + + return new_batch + + +def topk_ppr_matrix( + edge_index: Tensor, + num_nodes: int, + alpha: float, + eps: float, + output_node_indices: Union[np.ndarray, paddle.int64], + topk: int, + normalization='row', +) -> Tuple[Any, List[np.ndarray]]: + neighbors, weights = get_ppr(edge_index, alpha, eps, output_node_indices, + num_nodes) + + _, neighbor_counts = neighbors[0].unique(return_counts=True) + + ppr_matrix = SparseTensor( + row=paddle.arange( + len(output_node_indices)).repeat_interleave(neighbor_counts), + col=neighbors[1], value=weights, + sparse_sizes=(len(output_node_indices), + num_nodes)).to_scipy(layout='csr') + + neighbors = [ + n.cpu().numpy() + for n in paddle.split(neighbors[1], + neighbor_counts.cpu().tolist(), dim=0) + ] + weights = [ + n.cpu().numpy() + for n in paddle.split(weights, + neighbor_counts.cpu().tolist(), dim=0) + ] + + def sparsify(neighbors: List[np.ndarray], weights: List[np.ndarray], + topk: int): + new_neighbors = [] + for n, w in zip(neighbors, weights): + idx_topk = np.argsort(w)[-topk:] + new_neighbor = n[idx_topk] + new_neighbors.append(new_neighbor) + + return new_neighbors + + neighbors = sparsify(neighbors, weights, topk) + neighbors = [ + np.union1d(nei, pr) for nei, pr in zip(neighbors, output_node_indices) + ] + + _, out_degree = paddle.unique(edge_index[0], sorted=True, + return_counts=True) + if normalization == 'sym': + # Assume undirected (symmetric) adjacency matrix + deg_sqrt = np.sqrt(np.maximum(out_degree, 1e-12)) + deg_inv_sqrt = 1. / deg_sqrt + + row, col = ppr_matrix.nonzero() + ppr_matrix.data = deg_sqrt[output_node_indices[row]] * \ + ppr_matrix.data * \ + deg_inv_sqrt[col] + elif normalization == 'col': + # Assume undirected (symmetric) adjacency matrix + deg_inv = 1. / np.maximum(out_degree, 1e-12) + + row, col = ppr_matrix.nonzero() + ppr_matrix.data = out_degree[output_node_indices[row]] * \ + ppr_matrix.data * \ + deg_inv[col] + elif normalization == 'row': + pass + else: + raise ValueError(f"Unknown PPR normalization: {normalization}") + + return ppr_matrix, neighbors + + +class IBMBBaseLoader(paddle.io.DataLoader): + def __init__( + self, + data_list: Union[List[Data], List[Tuple]], + graph: Data, + adj: SparseTensor, + return_edge_index_type: str, + **kwargs, + ): + self.graph = graph + self.adj = adj + self.return_edge_index_type = return_edge_index_type + if 'collate_fn' in kwargs: + del kwargs['collate_fn'] + super().__init__(data_list, collate_fn=self.collate_fn, **kwargs) + + def create_loader(self, *args, **kwargs): + raise NotImplementedError + + @classmethod + def prepare_cache( + cls, + graph: Data, + batch_wise_out_aux_pairs: List[Tuple[np.ndarray, np.ndarray]], + adj: Optional[SparseTensor], + return_edge_index_type: str, + ): + subgraphs = [] + + pbar = tqdm(batch_wise_out_aux_pairs) + pbar.set_description( + f"Caching data with type {return_edge_index_type}") + + if return_edge_index_type == 'adj': + assert adj is not None + + for out, aux in pbar: + mask = paddle.to_tensor(np.in1d(aux, out)) + if isinstance(aux, np.ndarray): + aux = paddle.to_tensor(aux) + subg = get_subgraph(aux, graph, return_edge_index_type, adj, + output_node_mask=mask) + subgraphs.append(subg) + + return subgraphs + + @classmethod + def create_adj_from_edge_index( + cls, + edge_index: Tensor, + num_nodes: int, + normalization: str, + ): + assert normalization in ['sym', 'rw'] + adj = SparseTensor.from_edge_index( + edge_index, + sparse_sizes=(num_nodes, num_nodes), + ) + adj = adj.fill_value(1.) + degree = adj.sum(0) + + degree[degree == 0.] = 1e-12 + deg_inv = 1 / degree + + if normalization == 'sym': + deg_inv_sqrt = deg_inv**0.5 + adj = adj * deg_inv_sqrt.reshape(1, -1) + adj = adj * deg_inv_sqrt.reshape(-1, 1) + elif normalization == 'rw': + adj = adj * deg_inv.reshape(-1, 1) + + return adj + + def collate_fn(self, data_list: List[Union[Data, Tuple]]): + if len(data_list) == 1 and isinstance(data_list[0], Data): + return data_list[0] + + out, aux = zip(*data_list) + out = np.concatenate(out) + aux = np.unique(np.concatenate(aux)) + mask = paddle.to_tensor(np.in1d(aux, out)) + aux = paddle.to_tensor(aux) + + subg = get_subgraph(aux, self.graph, self.return_edge_index_type, + self.adj, output_node_mask=mask) + return subg + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' + + +class IBMBBatchLoader(IBMBBaseLoader): + r"""The batch-wise influence-based data loader from the + `"Influence-Based Mini-Batching for Graph Neural Networks" + `__ paper. + + First, the METIS graph partitioning algorithm separates the graph into + :obj:`num_partitions` many partitions. + Afterwards, input/seed nodes and their auxiliary nodes (found via + topic-sensitive PageRank) are used to form a mini-batch. + + If :obj:`batch_size` is set to :obj:`1`, mini-batches are pre-calculated + and cached in memory. + Otherwise, only input nodes and their auxiliary nodes are pre-computed, and + mini-batches are collated on-the-fly. + + Args: + data (paddle_geometric.data.Data): A + :class:`~paddle_geometric.data.Data` object. + batch_order (str): A string indicating the batch order type (one of + :obj:`"order"`, :obj:`"sample"` or :obj:`"rand"`). + If :obj:`"order"`, calculates the pair-wise KL divergence between + every two batches to organize an optimal order. + If :obj:`"sample"`, samples the next batch w.r.t. the last one in + which a batch with higher KL divergence score is more likely to be + sampled. + If :obj:`"rand"`, batches are generated randomly. + num_partitions (int): The number of partitions. + input_nodes (torch.Tensor): A vector containing the set of seed + nodes. + batch_expand_ratio (float, optional): The ratio between the returned + batch size and the original partition size. For example, set it to + :obj:`2.0` in case you would like the batch to have double the + number of nodes as the size of its partition. + (default: :obj:`1.0`) + metis_input_node_weight (float, optional): The weights on the input + nodes for METIS graph partitioning. (default: :obj:`None`) + alpha (float, optional): The teleport probability of the PageRank + calculation. (default: :obj:`0.2`) + approximate_ppr_iterations (int, optional): The number of power + iterations for PageRank calculation. (default: :obj:`50`) + return_edge_index_type (str, optional): A string indicating the output + type of edge indices (one of :obj:`"edge_index"` or :obj:`"adj"`). + If set to :obj:`"adj"`, the :obj:`edge_index` of the batch will + be a :class:`torch_sparse.SparseTensor`, otherwise a + :class:`torch.Tensor`. (default: :obj:`"edge_index"`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`batch_size`, + :obj:`shuffle`, :obj:`drop_last` or :obj:`num_workers`. + """ + def __init__( + self, + data: Data, + batch_order: str, + num_partitions: int, + input_nodes: Tensor, + batch_expand_ratio: Optional[float] = 1.0, + metis_input_node_weight: Optional[float] = None, + alpha: Optional[float] = 0.2, + approximate_ppr_iterations: Optional[int] = 50, + return_edge_index_type: str = 'edge_index', + **kwargs, + ): + self.subgraphs = [] + self.batch_wise_out_aux_pairs = [] + + assert is_undirected( + data.edge_index, + num_nodes=data.num_nodes), "Assume the graph to be undirected" + assert batch_order in ['rand', 'sample', 'order' + ], f"Unsupported batch order: {batch_order}" + + adj = self.create_adj_from_edge_index( + data.edge_index, + data.num_nodes, + normalization='rw', + ) + + self.cache_data = kwargs['batch_size'] == 1 + self.num_partitions = num_partitions + self.output_indices = input_nodes + assert return_edge_index_type in ['adj', 'edge_index'] + self.return_edge_index_type = return_edge_index_type + self.batch_expand_ratio = batch_expand_ratio + self.metis_output_weight = metis_input_node_weight + self.num_outnodeset_per_batch = 50 + self.alpha = alpha + self.approximate_ppr_iterations = approximate_ppr_iterations + + self.create_loader(data, adj) + + if len(self.batch_wise_out_aux_pairs) > 2: # <= 2 order makes no sense + ys = [ + data.y[out].numpy() for out, _ in self.batch_wise_out_aux_pairs + ] + sampler = define_sampler(batch_order, ys, data.y.max().item() + 1) + else: + sampler = None + + if not self.cache_data: + cached_data = data # need to cache the original graph + if return_edge_index_type == 'adj': + cached_adj = adj + else: + cached_adj = None + else: + cached_data = None + cached_adj = None + + super().__init__( + self.subgraphs + if self.cache_data else self.batch_wise_out_aux_pairs, + cached_data, + cached_adj, + return_edge_index_type, + sampler=sampler, + **kwargs, + ) + + def create_loader(self, graph: Data, adj: SparseTensor): + partitions = get_partitions( + adj, + self.num_partitions, + self.output_indices, + graph.num_nodes, + self.metis_output_weight, + ) + + # get output - auxiliary node pairs + topk = math.ceil(self.batch_expand_ratio * graph.num_nodes / + self.num_partitions) + batch_wise_out_aux_pairs = create_batchwise_out_aux_pairs( + adj, partitions, self.output_indices, topk, + self.num_outnodeset_per_batch, self.alpha, + self.approximate_ppr_iterations) + + indices_complete_check(batch_wise_out_aux_pairs, self.output_indices) + self.batch_wise_out_aux_pairs = batch_wise_out_aux_pairs + + if self.cache_data: + self.subgraphs = self.prepare_cache( + graph, + batch_wise_out_aux_pairs, + adj, + self.return_edge_index_type, + ) + + +class IBMBNodeLoader(IBMBBaseLoader): + r"""The node-wise influence-based data loader from the + `"Influence-Based Mini-Batching for Graph Neural Networks" + `__ paper. + + First, the Personalized PageRank (PPR) score for each input node is + computed, for which the :obj:`k` nodes with the highest scores are taken + auxiliary nodes. + Afterwards, input nodes are merged according to their pair-wise PPR scores. + + Similar to :class:`~paddle_geometric.loader.IBMBBatchLoader`, subgraphs are + cached in memory for :obj:`batch_size = 1`, and collated on-the-fly + otherwise. + + Args: + data (paddle_geometric.data.Data): A + :class:`~paddle_geometric.data.Data` object. + batch_order (str): A string indicating the batch order type (one of + :obj:`"order"`, :obj:`"sample"` or :obj:`"rand"`). + If :obj:`"order"`, calculates the pair-wise KL divergence between + every two batches to organize an optimal order. + If :obj:`"sample"`, samples the next batch w.r.t. the last one in + which a batch with higher KL divergence score is more likely to be + sampled. + If :obj:`"rand"`, batches are generated randomly. + input_nodes (torch.Tensor): A vector containing the set of seed + nodes. + num_auxiliary_nodes (int): The number of auxiliary nodes per input + node. + num_nodes_per_batch (int): The number of seed nodes per batch. + alpha (float, optional): The teleport probability of the PageRank + calculation. (default: :obj:`0.2`) + eps (float, optional): The threshold for stopping the PPR calculation + The smaller :obj`eps` is, the more accurate are the results of + PPR calculation, but it also takes longer. + (default: :obj:`1e-5`) + return_edge_index_type (str, optional): A string indicating the output + type of edge indices (one of :obj:`"edge_index"` or :obj:`"adj"`). + If set to :obj:`"adj"`, the :obj:`edge_index` of the batch will + be a :class:`torch_sparse.SparseTensor`, otherwise a + :class:`torch.Tensor`. (default: :obj:`"edge_index"`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`batch_size`, + :obj:`shuffle`, :obj:`drop_last` or :obj:`num_workers`. + """ + def __init__( + self, + data: Data, + batch_order: str, + input_nodes: paddle.Tensor, + num_auxiliary_nodes: int, + num_nodes_per_batch: int, + alpha: float = 0.2, + eps: float = 1e-5, + return_edge_index_type: str = 'edge_index', + **kwargs, + ): + self.subgraphs = [] + self.node_wise_out_aux_pairs = [] + + assert is_undirected( + data.edge_index, + num_nodes=data.num_nodes), "Assume the graph to be undirected" + assert batch_order in ['rand', 'sample', 'order' + ], f"Unsupported batch order: {batch_order}" + + if return_edge_index_type == 'adj': + adj = self.create_adj_from_edge_index(data.edge_index, + data.num_nodes, + normalization='rw') + else: + adj = None + + self.cache_data = kwargs['batch_size'] == 1 + self._batchsize = kwargs['batch_size'] + self.output_indices = input_nodes.numpy() + assert return_edge_index_type in ['adj', 'edge_index'] + self.return_edge_index_type = return_edge_index_type + self.num_auxiliary_node_per_output = num_auxiliary_nodes + self.num_output_nodes_per_batch = num_nodes_per_batch + self.alpha = alpha + self.eps = eps + + self.create_loader(data, adj) + + if len(self.node_wise_out_aux_pairs) > 2: # <= 2 order makes no sense + ys = [ + data.y[out].numpy() for out, _ in self.node_wise_out_aux_pairs + ] + sampler = define_sampler(batch_order, ys, data.y.max().item() + 1) + else: + sampler = None + + if not self.cache_data: + cached_graph = data # need to cache the original graph + cached_adj = adj + else: + cached_graph = None + cached_adj = None + + super().__init__( + self.subgraphs + if self.cache_data else self.node_wise_out_aux_pairs, + cached_graph, + cached_adj, + return_edge_index_type, + sampler=sampler, + **kwargs, + ) + + def create_loader(self, graph: Data, adj: SparseTensor): + logging.info("Start PPR calculation") + ppr_matrix, neighbors = topk_ppr_matrix( + graph.edge_index, graph.num_nodes, self.alpha, self.eps, + paddle.to_tensor(self.output_indices), + self.num_auxiliary_node_per_output) + + ppr_matrix = ppr_matrix[:, self.output_indices] + + logging.info("Getting PPR pairs") + ppr_pairs = get_pairs(ppr_matrix) + + output_list = prime_orient_merge( + ppr_pairs, + self.num_output_nodes_per_batch, + len(self.output_indices), + ) + output_list = prime_post_process( + output_list, + self.num_output_nodes_per_batch, + ) + node_wise_out_aux_pairs = [] + + if isinstance(neighbors, list): + neighbors = np.array(neighbors, dtype=object) + + def _union(inputs): + return np.unique(np.concatenate(inputs)) + + for p in output_list: + node_wise_out_aux_pairs.append( + (self.output_indices[p], + _union(neighbors[p]).astype(np.int64))) + + indices_complete_check(node_wise_out_aux_pairs, self.output_indices) + self.node_wise_out_aux_pairs = node_wise_out_aux_pairs + + if self.cache_data: + self.subgraphs = self.prepare_cache( + graph, + node_wise_out_aux_pairs, + adj, + self.return_edge_index_type, + ) + + +class IBMBOrderedSampler(paddle.io.Sampler[int]): + r"""A sampler with given order, specially for IBMB loaders. + + Args: + data_source (np.ndarray, torch.Tensor, List): A :obj:`np.ndarray`, + :obj:`torch.Tensor`, or :obj:`List` data object. Contains the + order of the batches. + """ + def __init__(self, data_source: Union[np.ndarray, paddle.Tensor, + List]) -> None: + self.data_source = data_source + super().__init__(data_source) + + def __iter__(self) -> Iterator[int]: + return iter(self.data_source) + + def __len__(self) -> int: + return len(self.data_source) + + +class IBMBWeightedSampler(paddle.io.Sampler[int]): + r"""A weighted sampler wrt the pair wise KL divergence. + The very first batch after initialization is sampled randomly, + with the next ones being sampled according to the last batch, + including the first batch in the next round. + + Args: + batch_kl_div (np.ndarray, torch.Tensor): A :obj:`np.ndarray` or + :obj:`torch.Tensor`, each element [i, j] contains the pair wise + KL divergence between batch i and j. + """ + def __init__(self, batch_kl_div: Union[np.ndarray, paddle.Tensor]) -> None: + data_source = np.arange(batch_kl_div.shape[0]) + self.data_source = data_source + self.batch_kl_div = batch_kl_div + self.last_train_batch_id = 0 + super().__init__(data_source) + + def __iter__(self) -> Iterator[int]: + probs = self.batch_kl_div.copy() + + last = self.last_train_batch_id + num_batches = probs.shape[0] + + fetch_idx = [] + + next_id = 0 + while np.any(probs): + next_id = np.random.choice(num_batches, size=None, replace=False, + p=probs[last] / probs[last].sum()) + last = next_id + fetch_idx.append(next_id) + probs[:, next_id] = 0. + + self.last_train_batch_id = next_id + + return iter(fetch_idx) + + def __len__(self) -> int: + return len(self.data_source) diff --git a/jointContribution/mattergen/paddle_geometric/loader/imbalanced_sampler.py b/jointContribution/mattergen/paddle_geometric/loader/imbalanced_sampler.py new file mode 100644 index 00000000..314bdd90 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/imbalanced_sampler.py @@ -0,0 +1,58 @@ +from typing import List, Optional, Union +import paddle +from paddle import Tensor +from paddle.io import Sampler, Dataset, DataLoader +from paddle_geometric.data import Data, InMemoryDataset + + +class ImbalancedSampler(Sampler): + r"""A weighted random sampler that randomly samples elements according to + class distribution. + As such, it will either remove samples from the majority class + (under-sampling) or add more examples from the minority class + (over-sampling). + """ + + def __init__( + self, + dataset: Union[Dataset, Data, List[Data], Tensor], + input_nodes: Optional[Tensor] = None, + num_samples: Optional[int] = None, + ): + if isinstance(dataset, Data): + y = dataset.y.flatten() + assert dataset.num_nodes == y.numel() + y = y[input_nodes] if input_nodes is not None else y + + elif isinstance(dataset, Tensor): + y = dataset.flatten() + y = y[input_nodes] if input_nodes is not None else y + + elif isinstance(dataset, InMemoryDataset): + y = dataset.y.flatten() + assert len(dataset) == y.numel() + + else: + ys = [data.y for data in dataset] + if isinstance(ys[0], Tensor): + y = paddle.concat(ys, axis=0).flatten() + else: + y = paddle.to_tensor(ys).flatten() + assert len(dataset) == y.numel() + + assert y.dtype == paddle.int64 # Require classification. + + num_samples = y.numel() if num_samples is None else num_samples + + class_weight = 1. / paddle.bincount(y) + weight = class_weight[y] + + # Sample the elements with replacement based on the computed weight. + self.weight = weight + self.num_samples = num_samples + + def __iter__(self): + return iter(paddle.randperm(self.num_samples, dtype=paddle.int64).numpy()) + + def __len__(self): + return self.num_samples diff --git a/jointContribution/mattergen/paddle_geometric/loader/link_loader.py b/jointContribution/mattergen/paddle_geometric/loader/link_loader.py new file mode 100644 index 00000000..6ff47a7c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/link_loader.py @@ -0,0 +1,260 @@ +from typing import Any, Callable, Iterator, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.io import DataLoader, Sampler + +from paddle_geometric.data import Data, FeatureStore, GraphStore, HeteroData +from paddle_geometric.loader.base import DataLoaderIterator +from paddle_geometric.loader.mixin import AffinityMixin, LogMemoryMixin, MultithreadingMixin +from paddle_geometric.loader.utils import ( + filter_custom_hetero_store, + filter_custom_store, + filter_data, + filter_hetero_data, + get_edge_label_index, + infer_filter_per_worker, +) +from paddle_geometric.sampler import ( + BaseSampler, + EdgeSamplerInput, + HeteroSamplerOutput, + NegativeSampling, + SamplerOutput, +) +from paddle_geometric.typing import InputEdges, OptTensor + + +class LinkLoader( + DataLoader, + AffinityMixin, + MultithreadingMixin, + LogMemoryMixin, +): + r"""A data loader that performs mini-batch sampling from link information, + using a generic :class:`~paddle_geometric.sampler.BaseSampler` + implementation that defines a + :meth:`~paddle_geometric.sampler.BaseSampler.sample_from_edges` function and + is supported on the provided input :obj:`data` object. + """ + def __init__( + self, + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + link_sampler: BaseSampler, + edge_label_index: InputEdges = None, + edge_label: OptTensor = None, + edge_label_time: OptTensor = None, + neg_sampling: Optional[NegativeSampling] = None, + neg_sampling_ratio: Optional[Union[int, float]] = None, + transform: Optional[Callable] = None, + transform_sampler_output: Optional[Callable] = None, + filter_per_worker: Optional[bool] = None, + custom_cls: Optional[HeteroData] = None, + input_id: OptTensor = None, + **kwargs, + ): + if filter_per_worker is None: + filter_per_worker = infer_filter_per_worker(data) + + # Remove for PyTorch Lightning: + kwargs.pop('dataset', None) + kwargs.pop('collate_fn', None) + # Save for PyTorch Lightning: + self.edge_label_index = edge_label_index + + if neg_sampling_ratio is not None and neg_sampling_ratio != 0.0: + # TODO: Deprecation warning. + neg_sampling = NegativeSampling("binary", neg_sampling_ratio) + + # Get edge type (or `None` for homogeneous graphs): + input_type, edge_label_index = get_edge_label_index( + data, edge_label_index) + + self.data = data + self.link_sampler = link_sampler + self.neg_sampling = NegativeSampling.cast(neg_sampling) + self.transform = transform + self.transform_sampler_output = transform_sampler_output + self.filter_per_worker = filter_per_worker + self.custom_cls = custom_cls + + if (self.neg_sampling is not None and self.neg_sampling.is_binary() + and edge_label is not None and edge_label.min() == 0): + # Increment labels such that `zero` now denotes "negative". + edge_label = edge_label + 1 + + if (self.neg_sampling is not None and self.neg_sampling.is_triplet() + and edge_label is not None): + raise ValueError("'edge_label' needs to be undefined for " + "'triplet'-based negative sampling. Please use " + "`src_index`, `dst_pos_index` and " + "`neg_pos_index` of the returned mini-batch " + "instead to differentiate between positive and " + "negative samples.") + + self.input_data = EdgeSamplerInput( + input_id=input_id, + row=edge_label_index[0], + col=edge_label_index[1], + label=edge_label, + time=edge_label_time, + input_type=input_type, + ) + + iterator = range(edge_label_index.size(1)) + super().__init__(iterator, collate_fn=self.collate_fn, **kwargs) + + def __call__( + self, + index: Union[Tensor, List[int]], + ) -> Union[Data, HeteroData]: + r"""Samples a subgraph from a batch of input edges.""" + out = self.collate_fn(index) + if not self.filter_per_worker: + out = self.filter_fn(out) + return out + + def collate_fn(self, index: Union[Tensor, List[int]]) -> Any: + r"""Samples a subgraph from a batch of input edges.""" + input_data: EdgeSamplerInput = self.input_data[index] + + out = self.link_sampler.sample_from_edges( + input_data, neg_sampling=self.neg_sampling) + + if self.filter_per_worker: # Execute `filter_fn` in the worker process + out = self.filter_fn(out) + + return out + + def filter_fn( + self, + out: Union[SamplerOutput, HeteroSamplerOutput], + ) -> Union[Data, HeteroData]: + r"""Joins the sampled nodes with their corresponding features, + returning the resulting :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object to be used downstream. + """ + if self.transform_sampler_output: + out = self.transform_sampler_output(out) + + if isinstance(out, SamplerOutput): + if isinstance(self.data, Data): + data = filter_data( # + self.data, out.node, out.row, out.col, out.edge, + self.link_sampler.edge_permutation) + + else: # Tuple[FeatureStore, GraphStore] + + # Hack to detect whether we are in a distributed setting. + if (self.link_sampler.__class__.__name__ == + 'DistNeighborSampler'): + edge_index = paddle.stack([out.row, out.col]) + data = Data(edge_index=edge_index) + # Metadata entries are populated in + # `DistributedNeighborSampler._collate_fn()` + data.x = out.metadata[-3] + data.y = out.metadata[-2] + data.edge_attr = out.metadata[-1] + else: + data = filter_custom_store( # + *self.data, out.node, out.row, out.col, out.edge, + self.custom_cls) + + if 'n_id' not in data: + data.n_id = out.node + if out.edge is not None and 'e_id' not in data: + edge = out.edge.to(paddle.long) + perm = self.link_sampler.edge_permutation + data.e_id = perm[out.edge] if perm is not None else out.edge + + data.batch = out.batch + data.num_sampled_nodes = out.num_sampled_nodes + data.num_sampled_edges = out.num_sampled_edges + + data.input_id = out.metadata[0] + + if self.neg_sampling is None or self.neg_sampling.is_binary(): + data.edge_label_index = out.metadata[1] + data.edge_label = out.metadata[2] + data.edge_label_time = out.metadata[3] + elif self.neg_sampling.is_triplet(): + data.src_index = out.metadata[1] + data.dst_pos_index = out.metadata[2] + data.dst_neg_index = out.metadata[3] + data.seed_time = out.metadata[4] + # Sanity removals in case `edge_label_index` and + # `edge_label_time` are attributes of the base `data` object: + del data.edge_label_index # Sanity removals. + del data.edge_label_time + + elif isinstance(out, HeteroSamplerOutput): + if isinstance(self.data, HeteroData): + data = filter_hetero_data( # + self.data, out.node, out.row, out.col, out.edge, + self.link_sampler.edge_permutation) + + else: # Tuple[FeatureStore, GraphStore] + + # Hack to detect whether we are in a distributed setting. + if (self.link_sampler.__class__.__name__ == + 'DistNeighborSampler'): + import paddle_geometric.distributed as dist + data = dist.utils.filter_dist_store( + *self.data, out.node, out.row, out.col, out.edge, + self.custom_cls, out.metadata, + self.input_data.input_type) + else: + data = filter_custom_hetero_store( # + *self.data, out.node, out.row, out.col, out.edge, + self.custom_cls) + + for key, node in out.node.items(): + if 'n_id' not in data[key]: + data[key].n_id = node + + for key, edge in (out.edge or {}).items(): + if edge is not None and 'e_id' not in data[key]: + edge = edge.to(paddle.long) + perm = self.link_sampler.edge_permutation + if perm is not None and perm.get(key, None) is not None: + edge = perm[key][edge] + data[key].e_id = edge + + data.set_value_dict('batch', out.batch) + data.set_value_dict('num_sampled_nodes', out.num_sampled_nodes) + data.set_value_dict('num_sampled_edges', out.num_sampled_edges) + + input_type = self.input_data.input_type + data[input_type].input_id = out.metadata[0] + + if self.neg_sampling is None or self.neg_sampling.is_binary(): + data[input_type].edge_label_index = out.metadata[1] + data[input_type].edge_label = out.metadata[2] + data[input_type].edge_label_time = out.metadata[3] + elif self.neg_sampling.is_triplet(): + data[input_type[0]].src_index = out.metadata[1] + data[input_type[-1]].dst_pos_index = out.metadata[2] + data[input_type[-1]].dst_neg_index = out.metadata[3] + data[input_type[0]].seed_time = out.metadata[4] + data[input_type[-1]].seed_time = out.metadata[4] + # Sanity removals in case `edge_label_index` and + # `edge_label_time` are attributes of the base `data` object: + if input_type in data.edge_types: + del data[input_type].edge_label_index + del data[input_type].edge_label_time + + else: + raise TypeError(f"'{self.__class__.__name__}'' found invalid " + f"type: '{type(out)}'") + + return data if self.transform is None else self.transform(data) + + def _get_iterator(self) -> Iterator: + if self.filter_per_worker: + return super()._get_iterator() + + # Execute `filter_fn` in the main process: + return DataLoaderIterator(super()._get_iterator(), self.filter_fn) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/loader/link_neighbor_loader.py b/jointContribution/mattergen/paddle_geometric/loader/link_neighbor_loader.py new file mode 100644 index 00000000..a0799add --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/link_neighbor_loader.py @@ -0,0 +1,79 @@ +from typing import Callable, Dict, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.io import DataLoader + +from paddle_geometric.data import Data, FeatureStore, GraphStore, HeteroData +from paddle_geometric.loader.link_loader import LinkLoader +from paddle_geometric.sampler import NegativeSampling, NeighborSampler +from paddle_geometric.sampler.base import SubgraphType +from paddle_geometric.typing import EdgeType, InputEdges, OptTensor + + +class LinkNeighborLoader(LinkLoader): + r"""A link-based data loader derived as an extension of the node-based + :class:`paddle_geometric.loader.NeighborLoader`. + This loader allows for mini-batch training of GNNs on large-scale graphs + where full-batch training is not feasible. + """ + def __init__( + self, + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + num_neighbors: Union[List[int], Dict[EdgeType, List[int]]], + edge_label_index: InputEdges = None, + edge_label: OptTensor = None, + edge_label_time: OptTensor = None, + replace: bool = False, + subgraph_type: Union[SubgraphType, str] = 'directional', + disjoint: bool = False, + temporal_strategy: str = 'uniform', + neg_sampling: Optional[NegativeSampling] = None, + neg_sampling_ratio: Optional[Union[int, float]] = None, + time_attr: Optional[str] = None, + weight_attr: Optional[str] = None, + transform: Optional[Callable] = None, + transform_sampler_output: Optional[Callable] = None, + is_sorted: bool = False, + filter_per_worker: Optional[bool] = None, + neighbor_sampler: Optional[NeighborSampler] = None, + directed: bool = True, # Deprecated. + **kwargs, + ): + if (edge_label_time is not None) != (time_attr is not None): + raise ValueError( + f"Received conflicting 'edge_label_time' and 'time_attr' " + f"arguments: 'edge_label_time' is " + f"{'set' if edge_label_time is not None else 'not set'} " + f"while 'time_attr' is " + f"{'set' if time_attr is not None else 'not set'}. " + f"Both arguments must be provided for temporal sampling.") + + if neighbor_sampler is None: + neighbor_sampler = NeighborSampler( + data, + num_neighbors=num_neighbors, + replace=replace, + subgraph_type=subgraph_type, + disjoint=disjoint, + temporal_strategy=temporal_strategy, + time_attr=time_attr, + weight_attr=weight_attr, + is_sorted=is_sorted, + share_memory=kwargs.get('num_workers', 0) > 0, + directed=directed, + ) + + super().__init__( + data=data, + link_sampler=neighbor_sampler, + edge_label_index=edge_label_index, + edge_label=edge_label, + edge_label_time=edge_label_time, + neg_sampling=neg_sampling, + neg_sampling_ratio=neg_sampling_ratio, + transform=transform, + transform_sampler_output=transform_sampler_output, + filter_per_worker=filter_per_worker, + **kwargs, + ) diff --git a/jointContribution/mattergen/paddle_geometric/loader/mixin.py b/jointContribution/mattergen/paddle_geometric/loader/mixin.py new file mode 100644 index 00000000..808b6aa6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/mixin.py @@ -0,0 +1,207 @@ +import glob +import logging +import os +import os.path as osp +import warnings +from contextlib import contextmanager +from typing import Any, Callable, Dict, List, Optional, Union + +import psutil +import paddle + +from paddle_geometric.data import HeteroData + +def get_numa_nodes_cores() -> Dict[str, Any]: + """Parses NUMA nodes information into a dictionary.""" + numa_node_paths = glob.glob('/sys/devices/system/node/node[0-9]*') + + if not numa_node_paths: + return {} + + nodes = {} + try: + for node_path in numa_node_paths: + numa_node_id = int(osp.basename(node_path)[4:]) + + thread_siblings = {} + for cpu_dir in glob.glob(osp.join(node_path, 'cpu[0-9]*')): + cpu_id = int(osp.basename(cpu_dir)[3:]) + if cpu_id > 0: + with open(osp.join(cpu_dir, 'online')) as core_online_file: + core_online = int(core_online_file.read().splitlines()[0]) + else: + core_online = 1 # cpu0 is always online (special case) + if core_online == 1: + with open(osp.join(cpu_dir, 'topology', 'core_id')) as core_id_file: + core_id = int(core_id_file.read().strip()) + if core_id in thread_siblings: + thread_siblings[core_id].append(cpu_id) + else: + thread_siblings[core_id] = [cpu_id] + + nodes[numa_node_id] = sorted([(k, sorted(v)) for k, v in thread_siblings.items()]) + + except (OSError, ValueError, IndexError): + warnings.warn('Failed to read NUMA info') + return {} + + return nodes + + +class WorkerInitWrapper: + r"""Wraps the :attr:`worker_init_fn` argument for DataLoader workers.""" + def __init__(self, func: Callable) -> None: + self.func = func + + def __call__(self, worker_id: int) -> None: + if self.func is not None: + self.func(worker_id) + + +class LogMemoryMixin: + r"""A context manager to enable logging of memory consumption in DataLoader workers.""" + def _mem_init_fn(self, worker_id: int) -> None: + proc = psutil.Process(os.getpid()) + memory = proc.memory_info().rss / (1024 * 1024) + logging.debug(f"Worker {worker_id} @ PID {proc.pid}: {memory:.2f} MB") + + # Chain worker init functions: + self._old_worker_init_fn(worker_id) + + @contextmanager + def enable_memory_log(self) -> None: + self._old_worker_init_fn = WorkerInitWrapper(self.worker_init_fn) + try: + self.worker_init_fn = self._mem_init_fn + yield + finally: + self.worker_init_fn = self._old_worker_init_fn + + +class MultithreadingMixin: + r"""A context manager to enable multi-threading in DataLoader workers.""" + def _mt_init_fn(self, worker_id: int) -> None: + try: + paddle.set_num_threads(int(self._worker_threads)) + except IndexError: + raise ValueError(f"Cannot set {self.worker_threads} threads " + f"in worker {worker_id}") + + # Chain worker init functions: + self._old_worker_init_fn(worker_id) + + @contextmanager + def enable_multithreading( + self, + worker_threads: Optional[int] = None, + ) -> None: + """Enables multithreading in worker subprocesses.""" + if worker_threads is None: + worker_threads = paddle.get_num_threads() // self.num_workers + + self._worker_threads = worker_threads + + if not self.num_workers > 0: + raise ValueError(f"'enable_multithreading' needs to be performed " + f"with at least one worker " + f"(got {self.num_workers})") + + if worker_threads > paddle.get_num_threads(): + raise ValueError(f"'worker_threads' should be smaller than the " + f"total available number of threads " + f"{paddle.get_num_threads()} " + f"(got {worker_threads})") + + context = paddle.multiprocessing.get_start_method() + if context != 'spawn': + raise ValueError(f"'enable_multithreading' can only be used with " + f"the 'spawn' multiprocessing context " + f"(got {context})") + + self._old_worker_init_fn = WorkerInitWrapper(self.worker_init_fn) + try: + logging.debug(f"Using {worker_threads} threads in each worker") + self.worker_init_fn = self._mt_init_fn + yield + finally: + self.worker_init_fn = self._old_worker_init_fn + + +class AffinityMixin: + r"""A context manager to enable CPU affinity for data loader workers.""" + def _aff_init_fn(self, worker_id: int) -> None: + try: + worker_cores = self.loader_cores[worker_id] + if not isinstance(worker_cores, List): + worker_cores = [worker_cores] + + if paddle.multiprocessing.get_start_method() == 'spawn': + paddle.set_num_threads(len(worker_cores)) + + psutil.Process().cpu_affinity(worker_cores) + + except IndexError: + raise ValueError(f"Cannot use CPU affinity for worker ID " + f"{worker_id} on CPU {self.loader_cores}") + + # Chain worker init functions: + self._old_worker_init_fn(worker_id) + + @contextmanager + def enable_cpu_affinity( + self, + loader_cores: Optional[Union[List[List[int]], List[int]]] = None, + ) -> None: + """Enables CPU affinity.""" + if not self.num_workers > 0: + raise ValueError( + f"'enable_cpu_affinity' should be used with at least one " + f"worker (got {self.num_workers})") + if loader_cores and len(loader_cores) != self.num_workers: + raise ValueError( + f"The number of loader cores (got {len(loader_cores)}) " + f"in 'enable_cpu_affinity' should match with the number " + f"of workers (got {self.num_workers})") + if isinstance(self.data, HeteroData): + warnings.warn( + "Due to conflicting parallelization methods it is not advised " + "to use affinitization with 'HeteroData' datasets. " + "Use `enable_multithreading` for better performance.") + + self.loader_cores = loader_cores[:] if loader_cores else None + if self.loader_cores is None: + numa_info = get_numa_nodes_cores() + + if numa_info and len(numa_info[0]) > self.num_workers: + # Take one thread per each node 0 core: + node0_cores = [cpus[0] for core_id, cpus in numa_info[0]] + node0_cores.sort() + else: + node0_cores = list(range(psutil.cpu_count(logical=False))) + + if len(node0_cores) < self.num_workers: + raise ValueError( + f"More workers (got {self.num_workers}) than available " + f"cores (got {len(node0_cores)})") + + # Set default loader core IDs: + if paddle.multiprocessing.get_start_method() == 'spawn': + work_thread_pool = int(len(node0_cores) / self.num_workers) + self.loader_cores = [ + list( + range( + work_thread_pool * i, + work_thread_pool * (i + 1), + )) for i in range(self.num_workers) + ] + else: + self.loader_cores = node0_cores[:self.num_workers] + + self._old_worker_init_fn = WorkerInitWrapper(self.worker_init_fn) + try: + self.worker_init_fn = self._aff_init_fn + logging.debug(f"{self.num_workers} data loader workers are " + f"assigned to CPUs {self.loader_cores}") + yield + finally: + self.worker_init_fn = self._old_worker_init_fn diff --git a/jointContribution/mattergen/paddle_geometric/loader/neighbor_loader.py b/jointContribution/mattergen/paddle_geometric/loader/neighbor_loader.py new file mode 100644 index 00000000..c3107fc4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/neighbor_loader.py @@ -0,0 +1,167 @@ +from typing import Callable, Dict, List, Optional, Tuple, Union + +import paddle +from paddle_geometric.data import Data, FeatureStore, GraphStore, HeteroData +from paddle_geometric.loader.node_loader import NodeLoader +from paddle_geometric.sampler import NeighborSampler +from paddle_geometric.sampler.base import SubgraphType +from paddle_geometric.typing import EdgeType, InputNodes, OptTensor + + +class NeighborLoader(NodeLoader): + r"""A data loader that performs neighbor sampling as introduced in the + `"Inductive Representation Learning on Large Graphs" + `_ paper. + This loader allows for mini-batch training of GNNs on large-scale graphs + where full-batch training is not feasible. + + More specifically, :obj:`num_neighbors` denotes how much neighbors are + sampled for each node in each iteration. + :class:`~paddle_geometric.loader.NeighborLoader` takes in this list of + :obj:`num_neighbors` and iteratively samples :obj:`num_neighbors[i]` for + each node involved in iteration :obj:`i - 1`. + + Sampled nodes are sorted based on the order in which they were sampled. + In particular, the first :obj:`batch_size` nodes represent the set of + original mini-batch nodes. + + Args: + data (Any): A :class:`~paddle_geometric.data.Data`, + :class:`~paddle_geometric.data.HeteroData`, or + (:class:`~paddle_geometric.data.FeatureStore`, + :class:`~paddle_geometric.data.GraphStore`) data object. + num_neighbors (List[int] or Dict[EdgeType, List[int]]): The + number of neighbors to sample for each node in each iteration. + If an entry is set to :obj:`-1`, all neighbors will be included. + In heterogeneous graphs, may also take in a dictionary denoting + the amount of neighbors to sample for each individual edge type. + input_nodes (paddle.Tensor or str or Tuple[str, paddle.Tensor]): The + indices of nodes for which neighbors are sampled to create + mini-batches. + Needs to be either given as a :obj:`paddle.LongTensor` or + :obj:`paddle.BoolTensor`. + If set to :obj:`None`, all nodes will be considered. + In heterogeneous graphs, needs to be passed as a tuple that holds + the node type and node indices. (default: :obj:`None`) + input_time (paddle.Tensor, optional): Optional values to override the + timestamp for the input nodes given in :obj:`input_nodes`. If not + set, will use the timestamps in :obj:`time_attr` as default (if + present). The :obj:`time_attr` needs to be set for this to work. + (default: :obj:`None`) + replace (bool, optional): If set to :obj:`True`, will sample with + replacement. (default: :obj:`False`) + subgraph_type (SubgraphType or str, optional): The type of the returned + subgraph. + If set to :obj:`"directional"`, the returned subgraph only holds + the sampled (directed) edges which are necessary to compute + representations for the sampled seed nodes. + If set to :obj:`"bidirectional"`, sampled edges are converted to + bidirectional edges. + If set to :obj:`"induced"`, the returned subgraph contains the + induced subgraph of all sampled nodes. + (default: :obj:`"directional"`) + disjoint (bool, optional): If set to :obj: `True`, each seed node will + create its own disjoint subgraph. + If set to :obj:`True`, mini-batch outputs will have a :obj:`batch` + vector holding the mapping of nodes to their respective subgraph. + Will get automatically set to :obj:`True` in case of temporal + sampling. (default: :obj:`False`) + temporal_strategy (str, optional): The sampling strategy when using + temporal sampling (:obj:`"uniform"`, :obj:`"last"`). + If set to :obj:`"uniform"`, will sample uniformly across neighbors + that fulfill temporal constraints. + If set to :obj:`"last"`, will sample the last `num_neighbors` that + fulfill temporal constraints. + (default: :obj:`"uniform"`) + time_attr (str, optional): The name of the attribute that denotes + timestamps for either the nodes or edges in the graph. + If set, temporal sampling will be used such that neighbors are + guaranteed to fulfill temporal constraints, *i.e.* neighbors have + an earlier or equal timestamp than the center node. + (default: :obj:`None`) + weight_attr (str, optional): The name of the attribute that denotes + edge weights in the graph. + If set, weighted/biased sampling will be used such that neighbors + are more likely to get sampled the higher their edge weights are. + Edge weights do not need to sum to one, but must be non-negative, + finite and have a non-zero sum within local neighborhoods. + (default: :obj:`None`) + transform (callable, optional): A function/transform that takes in + a sampled mini-batch and returns a transformed version. + (default: :obj:`None`) + transform_sampler_output (callable, optional): A function/transform + that takes in a :class:`paddle_geometric.sampler.SamplerOutput` and + returns a transformed version. (default: :obj:`None`) + is_sorted (bool, optional): If set to :obj:`True`, assumes that + :obj:`edge_index` is sorted by column. + If :obj:`time_attr` is set, additionally requires that rows are + sorted according to time within individual neighborhoods. + This avoids internal re-sorting of the data and can improve + runtime and memory efficiency. (default: :obj:`False`) + filter_per_worker (bool, optional): If set to :obj:`True`, will filter + the returned data in each worker's subprocess. + If set to :obj:`False`, will filter the returned data in the main + process. + If set to :obj:`None`, will automatically infer the decision based + on whether data partially lives on the GPU + (:obj:`filter_per_worker=True`) or entirely on the CPU + (:obj:`filter_per_worker=False`). + There exists different trade-offs for setting this option. + Specifically, setting this option to :obj:`True` for in-memory + datasets will move all features to shared memory, which may result + in too many open file handles. (default: :obj:`None`) + **kwargs (optional): Additional arguments of + :class:`paddle.utils.data.DataLoader`, such as :obj:`batch_size`, + :obj:`shuffle`, :obj:`drop_last` or :obj:`num_workers`. + """ + + def __init__( + self, + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + num_neighbors: Union[List[int], Dict[EdgeType, List[int]]], + input_nodes: InputNodes = None, + input_time: OptTensor = None, + replace: bool = False, + subgraph_type: Union[SubgraphType, str] = 'directional', + disjoint: bool = False, + temporal_strategy: str = 'uniform', + time_attr: Optional[str] = None, + weight_attr: Optional[str] = None, + transform: Optional[Callable] = None, + transform_sampler_output: Optional[Callable] = None, + is_sorted: bool = False, + filter_per_worker: Optional[bool] = None, + neighbor_sampler: Optional[NeighborSampler] = None, + directed: bool = True, # Deprecated. + **kwargs, + ): + if input_time is not None and time_attr is None: + raise ValueError("Received conflicting 'input_time' and " + "'time_attr' arguments: 'input_time' is set " + "while 'time_attr' is not set.") + + if neighbor_sampler is None: + neighbor_sampler = NeighborSampler( + data, + num_neighbors=num_neighbors, + replace=replace, + subgraph_type=subgraph_type, + disjoint=disjoint, + temporal_strategy=temporal_strategy, + time_attr=time_attr, + weight_attr=weight_attr, + is_sorted=is_sorted, + share_memory=kwargs.get('num_workers', 0) > 0, + directed=directed, + ) + + super().__init__( + data=data, + node_sampler=neighbor_sampler, + input_nodes=input_nodes, + input_time=input_time, + transform=transform, + transform_sampler_output=transform_sampler_output, + filter_per_worker=filter_per_worker, + **kwargs, + ) diff --git a/jointContribution/mattergen/paddle_geometric/loader/neighbor_sampler.py b/jointContribution/mattergen/paddle_geometric/loader/neighbor_sampler.py new file mode 100644 index 00000000..66d23881 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/neighbor_sampler.py @@ -0,0 +1,124 @@ +from typing import Callable, List, NamedTuple, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle_geometric.typing import SparseTensor + + +class EdgeIndex(NamedTuple): + edge_index: Tensor + e_id: Optional[Tensor] + size: Tuple[int, int] + + def to(self, *args, **kwargs): + edge_index = self.edge_index.to(*args, **kwargs) + e_id = self.e_id.to(*args, **kwargs) if self.e_id is not None else None + return EdgeIndex(edge_index, e_id, self.size) + + +class Adj(NamedTuple): + adj_t: SparseTensor + e_id: Optional[Tensor] + size: Tuple[int, int] + + def to(self, *args, **kwargs): + adj_t = self.adj_t.to(*args, **kwargs) + e_id = self.e_id.to(*args, **kwargs) if self.e_id is not None else None + return Adj(adj_t, e_id, self.size) + + +class NeighborSampler(paddle.io.DataLoader): + r"""The neighbor sampler from the `"Inductive Representation Learning on + Large Graphs" `_ paper, which allows + for mini-batch training of GNNs on large-scale graphs where full-batch + training is not feasible. + + More specifically, :obj:`sizes` denotes how much neighbors we want to + sample for each node in each layer. + This module then takes in these :obj:`sizes` and iteratively samples + :obj:`sizes[l]` for each node involved in layer :obj:`l`. + """ + def __init__(self, edge_index: Union[Tensor, SparseTensor], + sizes: List[int], node_idx: Optional[Tensor] = None, + num_nodes: Optional[int] = None, return_e_id: bool = True, + transform: Callable = None, **kwargs): + + edge_index = edge_index.to('cpu') + + # Remove for PyTorch Lightning: + kwargs.pop('dataset', None) + kwargs.pop('collate_fn', None) + + # Save for Pytorch Lightning < 1.6: + self.edge_index = edge_index + self.node_idx = node_idx + self.num_nodes = num_nodes + + self.sizes = sizes + self.return_e_id = return_e_id + self.transform = transform + self.is_sparse_tensor = isinstance(edge_index, SparseTensor) + self.__val__ = None + + # Obtain a *transposed* `SparseTensor` instance. + if not self.is_sparse_tensor: + if (num_nodes is None and node_idx is not None + and node_idx.dtype == paddle.bool): + num_nodes = node_idx.size(0) + if (num_nodes is None and node_idx is not None + and node_idx.dtype == paddle.int64): + num_nodes = max(int(edge_index.max()), int(node_idx.max())) + 1 + if num_nodes is None: + num_nodes = int(edge_index.max()) + 1 + + value = paddle.arange(edge_index.size(1)) if return_e_id else None + self.adj_t = SparseTensor(row=edge_index[0], col=edge_index[1], + value=value, + sparse_sizes=(num_nodes, num_nodes)).t() + else: + adj_t = edge_index + if return_e_id: + self.__val__ = adj_t.storage.value() + value = paddle.arange(adj_t.nnz()) + adj_t = adj_t.set_value(value, layout='coo') + self.adj_t = adj_t + + self.adj_t.storage.rowptr() + + if node_idx is None: + node_idx = paddle.arange(self.adj_t.sparse_size(0)) + elif node_idx.dtype == paddle.bool: + node_idx = node_idx.nonzero(as_tuple=False).view(-1) + + super().__init__( + node_idx.view(-1).tolist(), collate_fn=self.sample, **kwargs) + + def sample(self, batch): + if not isinstance(batch, paddle.Tensor): + batch = paddle.to_tensor(batch) + + batch_size: int = len(batch) + + adjs = [] + n_id = batch + for size in self.sizes: + adj_t, n_id = self.adj_t.sample_adj(n_id, size, replace=False) + e_id = adj_t.storage.value() + size = adj_t.sparse_sizes()[::-1] + if self.__val__ is not None: + adj_t.set_value_(self.__val__[e_id], layout='coo') + + if self.is_sparse_tensor: + adjs.append(Adj(adj_t, e_id, size)) + else: + row, col, _ = adj_t.coo() + edge_index = paddle.stack([col, row], axis=0) + adjs.append(EdgeIndex(edge_index, e_id, size)) + + adjs = adjs[0] if len(adjs) == 1 else adjs[::-1] + out = (batch_size, n_id, adjs) + out = self.transform(*out) if self.transform is not None else out + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(sizes={self.sizes})' diff --git a/jointContribution/mattergen/paddle_geometric/loader/node_loader.py b/jointContribution/mattergen/paddle_geometric/loader/node_loader.py new file mode 100644 index 00000000..8939f7e4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/node_loader.py @@ -0,0 +1,223 @@ +from typing import Any, Callable, Iterator, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, FeatureStore, GraphStore, HeteroData +from paddle_geometric.loader.base import DataLoaderIterator +from paddle_geometric.loader.mixin import ( + AffinityMixin, + LogMemoryMixin, + MultithreadingMixin, +) +from paddle_geometric.loader.utils import ( + filter_custom_hetero_store, + filter_custom_store, + filter_data, + filter_hetero_data, + get_input_nodes, + infer_filter_per_worker, +) +from paddle_geometric.sampler import ( + BaseSampler, + HeteroSamplerOutput, + NodeSamplerInput, + SamplerOutput, +) +from paddle_geometric.typing import InputNodes, OptTensor + + +class NodeLoader( + paddle.io.DataLoader, + AffinityMixin, + MultithreadingMixin, + LogMemoryMixin, +): + r"""A data loader that performs mini-batch sampling from node information, + using a generic :class:`~paddle_geometric.sampler.BaseSampler` + implementation that defines a + :meth:`~paddle_geometric.sampler.BaseSampler.sample_from_nodes` function and + is supported on the provided input :obj:`data` object. + """ + def __init__( + self, + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + node_sampler: BaseSampler, + input_nodes: InputNodes = None, + input_time: OptTensor = None, + transform: Optional[Callable] = None, + transform_sampler_output: Optional[Callable] = None, + filter_per_worker: Optional[bool] = None, + custom_cls: Optional[HeteroData] = None, + input_id: OptTensor = None, + **kwargs, + ): + if filter_per_worker is None: + filter_per_worker = infer_filter_per_worker(data) + + self.data = data + self.node_sampler = node_sampler + self.input_nodes = input_nodes + self.input_time = input_time + self.transform = transform + self.transform_sampler_output = transform_sampler_output + self.filter_per_worker = filter_per_worker + self.custom_cls = custom_cls + self.input_id = input_id + + kwargs.pop('dataset', None) + kwargs.pop('collate_fn', None) + + # Get node type (or `None` for homogeneous graphs): + input_type, input_nodes, input_id = get_input_nodes( + data, input_nodes, input_id) + + self.input_data = NodeSamplerInput( + input_id=input_id, + node=input_nodes, + time=input_time, + input_type=input_type, + ) + + iterator = range(input_nodes.size(0)) + super().__init__(iterator, collate_fn=self.collate_fn, **kwargs) + + def __call__( + self, + index: Union[Tensor, List[int]], + ) -> Union[Data, HeteroData]: + r"""Samples a subgraph from a batch of input nodes.""" + out = self.collate_fn(index) + if not self.filter_per_worker: + out = self.filter_fn(out) + return out + + def collate_fn(self, index: Union[Tensor, List[int]]) -> Any: + r"""Samples a subgraph from a batch of input nodes.""" + input_data: NodeSamplerInput = self.input_data[index] + + out = self.node_sampler.sample_from_nodes(input_data) + + if self.filter_per_worker: # Execute `filter_fn` in the worker process + out = self.filter_fn(out) + + return out + + def filter_fn( + self, + out: Union[SamplerOutput, HeteroSamplerOutput], + ) -> Union[Data, HeteroData]: + r"""Joins the sampled nodes with their corresponding features, + returning the resulting :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object to be used downstream. + """ + if self.transform_sampler_output: + out = self.transform_sampler_output(out) + + if isinstance(out, SamplerOutput): + if isinstance(self.data, Data): + data = filter_data( # + self.data, out.node, out.row, out.col, out.edge, + self.node_sampler.edge_permutation) + + else: # Tuple[FeatureStore, GraphStore] + # Hack to detect whether we are in a distributed setting. + if (self.node_sampler.__class__.__name__ == + 'DistNeighborSampler'): + edge_index = paddle.stack([out.row, out.col]) + data = Data(edge_index=edge_index) + # Metadata entries are populated in + # `DistributedNeighborSampler._collate_fn()` + data.x = out.metadata[-3] + data.y = out.metadata[-2] + data.edge_attr = out.metadata[-1] + else: + data = filter_custom_store( # + *self.data, out.node, out.row, out.col, out.edge, + self.custom_cls) + + if 'n_id' not in data: + data.n_id = out.node + if out.edge is not None and 'e_id' not in data: + edge = out.edge.to(paddle.int64) + perm = self.node_sampler.edge_permutation + data.e_id = perm[edge] if perm is not None else edge + + data.batch = out.batch + data.num_sampled_nodes = out.num_sampled_nodes + data.num_sampled_edges = out.num_sampled_edges + + if out.orig_row is not None and out.orig_col is not None: + data._orig_edge_index = paddle.stack([ + out.orig_row, + out.orig_col, + ], axis=0) + + data.input_id = out.metadata[0] + data.seed_time = out.metadata[1] + data.batch_size = out.metadata[0].size(0) + + elif isinstance(out, HeteroSamplerOutput): + if isinstance(self.data, HeteroData): + data = filter_hetero_data( # + self.data, out.node, out.row, out.col, out.edge, + self.node_sampler.edge_permutation) + + else: # Tuple[FeatureStore, GraphStore] + # Hack to detect whether we are in a distributed setting. + if (self.node_sampler.__class__.__name__ == + 'DistNeighborSampler'): + import paddle_geometric.distributed as dist + + data = dist.utils.filter_dist_store( + *self.data, out.node, out.row, out.col, out.edge, + self.custom_cls, out.metadata, + self.input_data.input_type) + else: + data = filter_custom_hetero_store( # + *self.data, out.node, out.row, out.col, out.edge, + self.custom_cls) + + for key, node in out.node.items(): + if 'n_id' not in data[key]: + data[key].n_id = node + + for key, edge in (out.edge or {}).items(): + if edge is not None and 'e_id' not in data[key]: + edge = edge.to(paddle.int64) + perm = self.node_sampler.edge_permutation + if perm is not None and perm.get(key, None) is not None: + edge = perm[key][edge] + data[key].e_id = edge + + data.set_value_dict('batch', out.batch) + data.set_value_dict('num_sampled_nodes', out.num_sampled_nodes) + data.set_value_dict('num_sampled_edges', out.num_sampled_edges) + + if out.orig_row is not None and out.orig_col is not None: + for key in out.orig_row.keys(): + data[key]._orig_edge_index = paddle.stack([ + out.orig_row[key], + out.orig_col[key], + ], axis=0) + + input_type = self.input_data.input_type + data[input_type].input_id = out.metadata[0] + data[input_type].seed_time = out.metadata[1] + data[input_type].batch_size = out.metadata[0].size(0) + + else: + raise TypeError(f"'{self.__class__.__name__}'' found invalid " + f"type: '{type(out)}'") + + return data if self.transform is None else self.transform(data) + + def _get_iterator(self) -> Iterator: + if self.filter_per_worker: + return super()._get_iterator() + + # Execute `filter_fn` in the main process: + return DataLoaderIterator(super()._get_iterator(), self.filter_fn) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/loader/prefetch.py b/jointContribution/mattergen/paddle_geometric/loader/prefetch.py new file mode 100644 index 00000000..11d1c90f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/prefetch.py @@ -0,0 +1,91 @@ +import warnings +from contextlib import nullcontext +from functools import partial +from typing import Any, Optional + +import paddle +from paddle.io import DataLoader + +class DeviceHelper: + def __init__(self, device: Optional[str] = None): + with_cuda = paddle.is_compiled_with_cuda() + + if device is None: + if with_cuda: + device = 'gpu' + else: + device = 'cpu' + + self.device = paddle.get_device(device) + self.is_gpu = self.device.startswith('gpu') + + if self.is_gpu and not with_cuda: + warnings.warn(f"Requested device '{self.device}' is not available, falling back to CPU") + self.device = 'cpu' + + self.stream = None + self.stream_context = nullcontext + + def maybe_init_stream(self) -> None: + # Paddle does not support streams directly, so we can omit stream initialization. + pass + + def maybe_wait_stream(self) -> None: + # Paddle does not support stream management as PyTorch does, so this can be omitted. + pass + + +class PrefetchLoader: + r"""A GPU prefetcher class for asynchronously transferring data of a + :class:`paddle.io.DataLoader` from host memory to device memory. + + Args: + loader (paddle.io.DataLoader): The data loader. + device (str, optional): The device to load the data to. + (default: :obj:`None`) + """ + def __init__( + self, + loader: DataLoader, + device: Optional[str] = None, + ): + self.loader = loader + self.device_helper = DeviceHelper(device) + + def non_blocking_transfer(self, batch: Any) -> Any: + if not self.device_helper.is_gpu: + return batch + if isinstance(batch, (list, tuple)): + return [self.non_blocking_transfer(v) for v in batch] + if isinstance(batch, dict): + return {k: self.non_blocking_transfer(v) for k, v in batch.items()} + + # In Paddle, we use `to()` method to move tensors to the correct device. + batch = paddle.to_tensor(batch) # Ensure it's a tensor + return batch + + def __iter__(self) -> Any: + first = True + self.device_helper.maybe_init_stream() + + batch = None + for next_batch in self.loader: + # Transfer data to the correct device in a non-blocking way + next_batch = self.non_blocking_transfer(next_batch) + + if not first: + yield batch + else: + first = False + + self.device_helper.maybe_wait_stream() + + batch = next_batch + + yield batch + + def __len__(self) -> int: + return len(self.loader) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.loader})' diff --git a/jointContribution/mattergen/paddle_geometric/loader/random_node_loader.py b/jointContribution/mattergen/paddle_geometric/loader/random_node_loader.py new file mode 100644 index 00000000..1aa660ed --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/random_node_loader.py @@ -0,0 +1,68 @@ +import math +from typing import Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.hetero_data import to_homogeneous_edge_index + + +class RandomNodeLoader(paddle.io.DataLoader): + r"""A data loader that randomly samples nodes within a graph and returns + their induced subgraph. + + .. note:: + + For an example of using + :class:`~paddle_geometric.loader.RandomNodeLoader`, see + `examples/ogbn_proteins_deepgcn.py + `_. + + Args: + data (paddle_geometric.data.Data or paddle_geometric.data.HeteroData): + The :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` graph object. + num_parts (int): The number of partitions. + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`num_workers`. + """ + def __init__( + self, + data: Union[Data, HeteroData], + num_parts: int, + **kwargs, + ): + self.data = data + self.num_parts = num_parts + + if isinstance(data, HeteroData): + edge_index, node_dict, edge_dict = to_homogeneous_edge_index(data) + self.node_dict, self.edge_dict = node_dict, edge_dict + else: + edge_index = data.edge_index + + self.edge_index = edge_index + self.num_nodes = data.num_nodes + + super().__init__( + range(self.num_nodes), + batch_size=math.ceil(self.num_nodes / num_parts), + collate_fn=self.collate_fn, + **kwargs, + ) + + def collate_fn(self, index): + if not isinstance(index, paddle.Tensor): + index = paddle.to_tensor(index) + + if isinstance(self.data, Data): + return self.data.subgraph(index) + + elif isinstance(self.data, HeteroData): + node_dict = { + key: index[(index >= start) & (index < end)] - start + for key, (start, end) in self.node_dict.items() + } + return self.data.subgraph(node_dict) diff --git a/jointContribution/mattergen/paddle_geometric/loader/shadow.py b/jointContribution/mattergen/paddle_geometric/loader/shadow.py new file mode 100644 index 00000000..cf9873cb --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/shadow.py @@ -0,0 +1,114 @@ +import copy +import math +from typing import Optional + +import paddle +from paddle import Tensor +import paddle.sparse as sparse +from paddle.io import DataLoader + +from paddle_geometric.data import Data, Batch +from paddle_geometric.typing import WITH_PADDLE_SPARSE + + +class ShaDowKHopSampler(DataLoader): + r"""The ShaDow :math:`k`-hop sampler from the `"Decoupling the Depth and + Scope of Graph Neural Networks" `_ paper. + Given a graph in a :obj:`data` object, the sampler will create shallow, + localized subgraphs. + A deep GNN on this local graph then smooths the informative local signals. + + Args: + data (paddle_geometric.data.Data): The graph data object. + depth (int): The depth/number of hops of the localized subgraph. + num_neighbors (int): The number of neighbors to sample for each node in + each hop. + node_idx (LongTensor or BoolTensor, optional): The nodes that should be + considered for creating mini-batches. + If set to :obj:`None`, all nodes will be considered. + replace (bool, optional): If set to :obj:`True`, will sample neighbors + with replacement. (default: :obj:`False`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`batch_size` or + :obj:`num_workers`. + """ + + def __init__(self, data: Data, depth: int, num_neighbors: int, + node_idx: Optional[Tensor] = None, replace: bool = False, + **kwargs): + + if not WITH_PADDLE_SPARSE: + raise ImportError( + f"'{self.__class__.__name__}' requires 'paddle-sparse'") + + self.data = copy.copy(data) + self.depth = depth + self.num_neighbors = num_neighbors + self.replace = replace + + if data.edge_index is not None: + self.is_sparse_tensor = False + row, col = data.edge_index.cpu() + self.adj_t = sparse.SparseCooTensor( + indices=paddle.concat([row.unsqueeze(0), col.unsqueeze(0)], axis=0), + values=paddle.arange(col.shape[0]), + shape=(data.num_nodes, data.num_nodes), + ) + else: + self.is_sparse_tensor = True + self.adj_t = data.adj_t.cpu() + + if node_idx is None: + node_idx = paddle.arange(self.adj_t.shape[0]) + elif node_idx.dtype == paddle.bool: + node_idx = paddle.nonzero(node_idx).squeeze(1) + self.node_idx = node_idx + + super().__init__( + range(self.num_nodes), + batch_size=math.ceil(self.num_nodes / num_parts), + collate_fn=self.__collate__, + **kwargs, + ) + + def __collate__(self, n_id): + n_id = paddle.to_tensor(n_id) + + # Convert adj_t to the COO format + rowptr, col, value = self.adj_t.csr() + + # Assuming paddle_sparse has an equivalent function + out = paddle.ops.paddle_sparse.ego_k_hop_sample_adj( + rowptr, col, n_id, self.depth, self.num_neighbors, self.replace) + + rowptr, col, n_id, e_id, ptr, root_n_id = out + + adj_t = sparse.SparseCooTensor( + indices=paddle.concat([rowptr.unsqueeze(0), col.unsqueeze(0)], axis=0), + values=value[e_id] if value is not None else None, + shape=(n_id.numel(), n_id.numel()) + ) + + batch = Batch(batch=paddle.ops.paddle_sparse.ptr2ind(ptr, n_id.numel()), + ptr=ptr) + batch.root_n_id = root_n_id + + if self.is_sparse_tensor: + batch.adj_t = adj_t + else: + row, col, e_id = adj_t.t().coo() + batch.edge_index = paddle.concat([row.unsqueeze(0), col.unsqueeze(0)], axis=0) + + for k, v in self.data: + if k in ['edge_index', 'adj_t', 'num_nodes', 'batch', 'ptr']: + continue + if k == 'y' and v.shape[0] == self.data.num_nodes: + batch[k] = v[n_id][root_n_id] + elif isinstance(v, Tensor) and v.shape[0] == self.data.num_nodes: + batch[k] = v[n_id] + elif isinstance(v, Tensor) and v.shape[0] == self.data.num_edges: + batch[k] = v[e_id] + else: + batch[k] = v + + return batch diff --git a/jointContribution/mattergen/paddle_geometric/loader/temporal_dataloader.py b/jointContribution/mattergen/paddle_geometric/loader/temporal_dataloader.py new file mode 100644 index 00000000..e1b53605 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/temporal_dataloader.py @@ -0,0 +1,67 @@ +import paddle +from paddle.io import DataLoader +from typing import List + +from paddle_geometric.data import TemporalData + + +class TemporalDataLoader(DataLoader): + r"""A data loader which merges successive events of a + :class:`paddle_geometric.data.TemporalData` to a mini-batch. + + Args: + data (TemporalData): The :obj:`~paddle_geometric.data.TemporalData` + from which to load the data. + batch_size (int, optional): How many samples per batch to load. + (default: :obj:`1`) + neg_sampling_ratio (float, optional): The ratio of sampled negative + destination nodes to the number of positive destination nodes. + (default: :obj:`0.0`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`. + """ + def __init__( + self, + data: TemporalData, + batch_size: int = 1, + neg_sampling_ratio: float = 0.0, + **kwargs, + ): + # Remove for Paddle Lightning: + kwargs.pop('dataset', None) + kwargs.pop('collate_fn', None) + kwargs.pop('shuffle', None) + + self.data = data + self.events_per_batch = batch_size + self.neg_sampling_ratio = neg_sampling_ratio + + if neg_sampling_ratio > 0: + self.min_dst = int(data.dst.min()) + self.max_dst = int(data.dst.max()) + + if kwargs.get('drop_last', False) and len(data) % batch_size != 0: + arange = range(0, len(data) - batch_size, batch_size) + else: + arange = range(0, len(data), batch_size) + + super().__init__(arange, batch_size=1, shuffle=False, collate_fn=self, **kwargs) + + def __call__(self, arange: List[int]) -> TemporalData: + batch = self.data[arange[0]:arange[0] + self.events_per_batch] + + n_ids = [batch.src, batch.dst] + + if self.neg_sampling_ratio > 0: + batch.neg_dst = paddle.randint( + low=self.min_dst, + high=self.max_dst + 1, + shape=(round(self.neg_sampling_ratio * batch.dst.shape[0]), ), + dtype=batch.dst.dtype, + device=batch.dst.device, + ) + n_ids += [batch.neg_dst] + + batch.n_id = paddle.unique(paddle.concat(n_ids, axis=0)) + + return batch diff --git a/jointContribution/mattergen/paddle_geometric/loader/utils.py b/jointContribution/mattergen/paddle_geometric/loader/utils.py new file mode 100644 index 00000000..a705c266 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/utils.py @@ -0,0 +1,357 @@ +import copy +import logging +import math +from typing import Any, Dict, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.data import ( + Data, + FeatureStore, + GraphStore, + HeteroData, + TensorAttr, + remote_backend_utils, +) +from paddle_geometric.data.storage import EdgeStorage, NodeStorage +from paddle_geometric.typing import ( + EdgeType, + FeatureTensorType, + InputEdges, + InputNodes, + NodeType, + OptTensor, + SparseTensor, + TensorFrame, +) + + +def index_select( + value: FeatureTensorType, + index: Tensor, + dim: int = 0, +) -> Tensor: + r"""Indexes the :obj:`value` tensor along dimension :obj:`dim` using the + entries in :obj:`index`.""" + + # Paddle currently only supports indexing via `paddle.int64`: + index = index.astype('int64') + + if isinstance(value, Tensor): + out: Optional[Tensor] = None + if paddle.utils.data.get_worker_info() is not None: + # If we are in a background process, we write directly into a + # shared memory tensor to avoid an extra copy: + size = list(value.shape) + size[dim] = index.shape[0] + numel = math.prod(size) + out = value.new_tensor([0] * numel).reshape(size) + + return paddle.index_select(value, dim, index) + + if isinstance(value, TensorFrame): + assert dim == 0 + return value[index] + + elif isinstance(value, np.ndarray): + return paddle.to_tensor(np.take(value, index, axis=dim)) + + raise ValueError(f"Encountered invalid feature tensor type " + f"(got '{type(value)}')") + + +def filter_node_store_(store: NodeStorage, out_store: NodeStorage, + index: Tensor): + # Filters a node storage object to only hold the nodes in `index`: + for key, value in store.items(): + if key == 'num_nodes': + out_store.num_nodes = index.shape[0] + + elif store.is_node_attr(key): + if isinstance(value, (Tensor, TensorFrame)): + index = index.astype(value.dtype) + elif isinstance(value, np.ndarray): + index = index.cpu() + dim = store._parent().__cat_dim__(key, value, store) + out_store[key] = index_select(value, index, dim=dim) + + +def filter_edge_store_(store: EdgeStorage, out_store: EdgeStorage, row: Tensor, + col: Tensor, index: OptTensor, perm: OptTensor = None): + # Filters an edge storage object to only hold the edges in `index`: + for key, value in store.items(): + if key == 'edge_index': + edge_index = paddle.concat([row, col], axis=0).to(value.device) + out_store.edge_index = edge_index + + elif key == 'adj_t': + row = row.astype(value.device()) + col = col.astype(value.device()) + edge_attr = value.storage.value() + if edge_attr is not None: + if index is not None: + index = index.astype(edge_attr.device) + edge_attr = index_select(edge_attr, index, dim=0) + else: + edge_attr = None + sparse_sizes = out_store.size()[::-1] + out_store.adj_t = SparseTensor(row=col, col=row, value=edge_attr, + sparse_sizes=sparse_sizes, + is_sorted=False, trust_data=True) + + elif store.is_edge_attr(key): + if index is None: + out_store[key] = None + continue + + dim = store._parent().__cat_dim__(key, value, store) + if isinstance(value, (Tensor, TensorFrame)): + index = index.astype(value.dtype) + elif isinstance(value, np.ndarray): + index = index.cpu() + if perm is None: + out_store[key] = index_select(value, index, dim=dim) + else: + if isinstance(value, (Tensor, TensorFrame)): + perm = perm.astype(value.dtype) + elif isinstance(value, np.ndarray): + perm = perm.cpu() + out_store[key] = index_select( + value, + perm[index.astype('int64')], + dim=dim, + ) + + +def filter_data(data: Data, node: Tensor, row: Tensor, col: Tensor, + edge: OptTensor, perm: OptTensor = None) -> Data: + out = copy.copy(data) + filter_node_store_(data._store, out._store, node) + filter_edge_store_(data._store, out._store, row, col, edge, perm) + return out + + +def filter_hetero_data( + data: HeteroData, + node_dict: Dict[NodeType, Tensor], + row_dict: Dict[EdgeType, Tensor], + col_dict: Dict[EdgeType, Tensor], + edge_dict: Dict[EdgeType, OptTensor], + perm_dict: Optional[Dict[EdgeType, OptTensor]] = None, +) -> HeteroData: + out = copy.copy(data) + + for node_type in out.node_types: + if node_type not in node_dict: + node_dict[node_type] = paddle.empty([0], dtype='int64') + + filter_node_store_(data[node_type], out[node_type], + node_dict[node_type]) + + for edge_type in out.edge_types: + if edge_type not in row_dict: + row_dict[edge_type] = paddle.empty([0], dtype='int64') + if edge_type not in col_dict: + col_dict[edge_type] = paddle.empty([0], dtype='int64') + if edge_type not in edge_dict: + edge_dict[edge_type] = paddle.empty([0], dtype='int64') + + filter_edge_store_( + data[edge_type], + out[edge_type], + row_dict[edge_type], + col_dict[edge_type], + edge_dict[edge_type], + perm_dict.get(edge_type, None) if perm_dict else None, + ) + + return out + + +def filter_custom_store( + feature_store: FeatureStore, + graph_store: GraphStore, + node: Tensor, + row: Tensor, + col: Tensor, + edge: OptTensor, + custom_cls: Optional[Data] = None, +) -> Data: + data = custom_cls() if custom_cls is not None else Data() + + data.edge_index = paddle.concat([row, col], axis=0) + + required_attrs = [] + for attr in feature_store.get_all_tensor_attrs(): + attr.index = node # TODO Support edge features. + required_attrs.append(attr) + data.num_nodes = attr.index.shape[0] + + tensors = feature_store.multi_get_tensor(required_attrs) + for i, attr in enumerate(required_attrs): + data[attr.attr_name] = tensors[i] + + return data + + +def filter_custom_hetero_store( + feature_store: FeatureStore, + graph_store: GraphStore, + node_dict: Dict[str, Tensor], + row_dict: Dict[str, Tensor], + col_dict: Dict[str, Tensor], + edge_dict: Dict[str, OptTensor], + custom_cls: Optional[HeteroData] = None, +) -> HeteroData: + data = custom_cls() if custom_cls is not None else HeteroData() + + for attr in graph_store.get_all_edge_attrs(): + key = attr.edge_type + if key in row_dict and key in col_dict: + edge_index = paddle.concat([row_dict[key], col_dict[key]], axis=0) + data[attr.edge_type].edge_index = edge_index + + required_attrs = [] + for attr in feature_store.get_all_tensor_attrs(): + if attr.group_name in node_dict: + attr.index = node_dict[attr.group_name] + required_attrs.append(attr) + data[attr.group_name].num_nodes = attr.index.shape[0] + + tensors = feature_store.multi_get_tensor(required_attrs) + for i, attr in enumerate(required_attrs): + data[attr.group_name][attr.attr_name] = tensors[i] + + return data + + +def get_input_nodes( + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + input_nodes: Union[InputNodes, TensorAttr], + input_id: Optional[Tensor] = None, +) -> Tuple[Optional[str], Tensor, Optional[Tensor]]: + def to_index(nodes, input_id) -> Tuple[Tensor, Optional[Tensor]]: + if isinstance(nodes, Tensor) and nodes.dtype == paddle.bool: + nodes = nodes.nonzero(as_tuple=False).view(-1) + if input_id is not None: + assert input_id.shape[0] == nodes.shape[0] + else: + input_id = nodes + return nodes, input_id + + if not isinstance(nodes, Tensor): + nodes = paddle.to_tensor(nodes, dtype='int64') + + if input_id is not None: + assert input_id.shape[0] == nodes.shape[0] + + return nodes, input_id + + if isinstance(data, Data): + if input_nodes is None: + return None, paddle.arange(data.num_nodes), None + return None, *to_index(input_nodes, input_id) + + elif isinstance(data, HeteroData): + assert input_nodes is not None + + if isinstance(input_nodes, str): + return input_nodes, paddle.arange(data[input_nodes].num_nodes), None + + assert isinstance(input_nodes, (list, tuple)) + assert len(input_nodes) == 2 + assert isinstance(input_nodes[0], str) + + node_type, input_nodes = input_nodes + if input_nodes is None: + return node_type, paddle.arange(data[node_type].num_nodes), None + return node_type, *to_index(input_nodes, input_id) + + else: # Tuple[FeatureStore, GraphStore] + feature_store, graph_store = data + assert input_nodes is not None + + if isinstance(input_nodes, Tensor): + return None, *to_index(input_nodes, input_id) + + if isinstance(input_nodes, str): + num_nodes = remote_backend_utils.num_nodes( # + feature_store, graph_store, input_nodes) + return input_nodes, paddle.arange(num_nodes), None + + if isinstance(input_nodes, (list, tuple)): + assert len(input_nodes) == 2 + assert isinstance(input_nodes[0], str) + + node_type, input_nodes = input_nodes + if input_nodes is None: + num_nodes = remote_backend_utils.num_nodes( # + feature_store, graph_store, input_nodes) + return node_type, paddle.arange(num_nodes), None + + return node_type, *to_index(input_nodes, input_id) + + +def get_edge_label_index( + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + edge_label_index: InputEdges, +) -> Tuple[Optional[str], Tensor]: + edge_type = None + if isinstance(data, Data): + if edge_label_index is None: + return None, data.edge_index + return None, edge_label_index + + assert edge_label_index is not None + assert isinstance(edge_label_index, (list, tuple)) + + if isinstance(data, HeteroData): + if isinstance(edge_label_index[0], str): + edge_type = edge_label_index + edge_type = data._to_canonical(*edge_type) + assert edge_type in data.edge_types + return edge_type, data[edge_type].edge_index + + assert len(edge_label_index) == 2 + + edge_type, edge_label_index = edge_label_index + edge_type = data._to_canonical(*edge_type) + + if edge_label_index is None: + return edge_type, data[edge_type].edge_index + + return edge_type, edge_label_index + + else: # Tuple[FeatureStore, GraphStore] + _, graph_store = data + + # Need the edge index in COO for LinkNeighborLoader: + def _get_edge_index(edge_type): + row_dict, col_dict, _ = graph_store.coo([edge_type]) + row = list(row_dict.values())[0] + col = list(col_dict.values())[0] + return paddle.stack((row, col), axis=0) + + if isinstance(edge_label_index[0], str): + edge_type = edge_label_index + return edge_type, _get_edge_index(edge_type) + + assert len(edge_label_index) == 2 + edge_type, edge_label_index = edge_label_index + + if edge_label_index is None: + return edge_type, _get_edge_index(edge_type) + + return edge_type, edge_label_index + + +def infer_filter_per_worker(data: Any) -> bool: + out = True + if isinstance(data, (Data, HeteroData)) and data.is_cuda: + out = False + logging.debug(f"Inferred 'filter_per_worker={out}' option for feature " + f"fetching routines of the data loader") + return out diff --git a/jointContribution/mattergen/paddle_geometric/loader/zip_loader.py b/jointContribution/mattergen/paddle_geometric/loader/zip_loader.py new file mode 100644 index 00000000..750a0607 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/loader/zip_loader.py @@ -0,0 +1,94 @@ +import copy +from typing import Any, Iterator, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.loader import LinkLoader, NodeLoader +from paddle_geometric.loader.base import DataLoaderIterator +from paddle_geometric.loader.utils import infer_filter_per_worker + + +class ZipLoader(paddle.io.DataLoader): + r"""A loader that returns a tuple of data objects by sampling from multiple + :class:`NodeLoader` or :class:`LinkLoader` instances. + + Args: + loaders (List[NodeLoader] or List[LinkLoader]): The loader instances. + filter_per_worker (bool, optional): If set to :obj:`True`, will filter + the returned data in each worker's subprocess. + If set to :obj:`False`, will filter the returned data in the main + process. + If set to :obj:`None`, will automatically infer the decision based + on whether data partially lives on the GPU + (:obj:`filter_per_worker=True`) or entirely on the CPU + (:obj:`filter_per_worker=False`). + There exists different trade-offs for setting this option. + Specifically, setting this option to :obj:`True` for in-memory + datasets will move all features to shared memory, which may result + in too many open file handles. (default: :obj:`None`) + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as :obj:`batch_size`, + :obj:`shuffle`, :obj:`drop_last` or :obj:`num_workers`. + """ + def __init__( + self, + loaders: Union[List[NodeLoader], List[LinkLoader]], + filter_per_worker: Optional[bool] = None, + **kwargs, + ): + if filter_per_worker is None: + filter_per_worker = infer_filter_per_worker(loaders[0].data) + + # Remove for Paddle Lightning: + kwargs.pop('dataset', None) + kwargs.pop('collate_fn', None) + + for loader in loaders: + if not callable(getattr(loader, 'collate_fn', None)): + raise ValueError("'{loader.__class__.__name__}' does not have " + "a 'collate_fn' method") + if not callable(getattr(loader, 'filter_fn', None)): + raise ValueError("'{loader.__class__.__name__}' does not have " + "a 'filter_fn' method") + loader.filter_per_worker = filter_per_worker + + iterator = range(min([len(loader.dataset) for loader in loaders])) + super().__init__(iterator, collate_fn=self.collate_fn, **kwargs) + + self.loaders = loaders + self.filter_per_worker = filter_per_worker + + def __call__( + self, + index: Union[Tensor, List[int]], + ) -> Union[Tuple[Data, ...], Tuple[HeteroData, ...]]: + r"""Samples subgraphs from a batch of input IDs.""" + out = self.collate_fn(index) + if not self.filter_per_worker: + out = self.filter_fn(out) + return out + + def collate_fn(self, index: List[int]) -> Tuple[Any, ...]: + if not isinstance(index, Tensor): + index = paddle.to_tensor(index, dtype='int64') + + return tuple(loader.collate_fn(index) for loader in self.loaders) + + def filter_fn( + self, + outs: Tuple[Any, ...], + ) -> Tuple[Union[Data, HeteroData], ...]: + loaders = self.loaders + return tuple(loader.filter_fn(v) for loader, v in zip(loaders, outs)) + + def _get_iterator(self) -> Iterator: + if self.filter_per_worker: + return super()._get_iterator() + + # Execute `filter_fn` in the main process: + return DataLoaderIterator(super()._get_iterator(), self.filter_fn) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(loaders={self.loaders})' diff --git a/jointContribution/mattergen/paddle_geometric/logging.py b/jointContribution/mattergen/paddle_geometric/logging.py new file mode 100644 index 00000000..5e8eb0d9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/logging.py @@ -0,0 +1,38 @@ +import sys +from typing import Any + +_wandb_initialized: bool = False + + +def init_wandb(name: str, **kwargs: Any) -> None: + if '--wandb' not in sys.argv: + return + + from datetime import datetime + + import wandb + + wandb.init( + project=name, + entity='pytorch-geometric', + name=datetime.now().strftime('%Y-%m-%d_%H:%M'), + config=kwargs, + ) + + global _wandb_initialized + _wandb_initialized = True + + +def log(**kwargs: Any) -> None: + def _map(value: Any) -> str: + if isinstance(value, int) and not isinstance(value, bool): + return f'{value:03d}' + if isinstance(value, float): + return f'{value:.4f}' + return value + + print(', '.join(f'{key}: {_map(value)}' for key, value in kwargs.items())) + + if _wandb_initialized: + import wandb + wandb.log(kwargs) diff --git a/jointContribution/mattergen/paddle_geometric/metrics/__init__.py b/jointContribution/mattergen/paddle_geometric/metrics/__init__.py new file mode 100644 index 00000000..1340829b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/metrics/__init__.py @@ -0,0 +1,21 @@ +# flake8: noqa + +from .link_pred import ( + LinkPredPrecision, + LinkPredRecall, + LinkPredF1, + LinkPredMAP, + LinkPredNDCG, + LinkPredMRR, +) + +link_pred_metrics = [ + 'LinkPredPrecision', + 'LinkPredRecall', + 'LinkPredF1', + 'LinkPredMAP', + 'LinkPredNDCG', + 'LinkPredMRR', +] + +__all__ = link_pred_metrics diff --git a/jointContribution/mattergen/paddle_geometric/metrics/link_pred.py b/jointContribution/mattergen/paddle_geometric/metrics/link_pred.py new file mode 100644 index 00000000..022c811f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/metrics/link_pred.py @@ -0,0 +1,258 @@ +import copy +import logging +import math +from typing import Any, Dict, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.data import ( + Data, + FeatureStore, + GraphStore, + HeteroData, + TensorAttr, + remote_backend_utils, +) +from paddle_geometric.data.storage import EdgeStorage, NodeStorage +from paddle_geometric.typing import ( + EdgeType, + FeatureTensorType, + InputEdges, + InputNodes, + NodeType, + OptTensor, + SparseTensor, + TensorFrame, +) + +try: + import paddlemetrics # noqa + WITH_PADDLEMETRICS = True + BaseMetric = paddlemetrics.Metric +except Exception: + WITH_PADDLEMETRICS = False + BaseMetric = paddle.nn.Layer # type: ignore + + +class LinkPredMetric(BaseMetric): + r"""An abstract class for computing link prediction retrieval metrics. + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + is_differentiable: bool = False + full_state_update: bool = False + higher_is_better: Optional[bool] = None + + def __init__(self, k: int) -> None: + super().__init__() + + if k <= 0: + raise ValueError(f"'k' needs to be a positive integer in " + f"'{self.__class__.__name__}' (got {k})") + + self.k = k + + self.accum: Tensor + self.total: Tensor + + if WITH_PADDLEMETRICS: + self.add_state('accum', paddle.to_tensor(0.), dist_reduce_fx='sum') + self.add_state('total', paddle.to_tensor(0), dist_reduce_fx='sum') + else: + self.register_buffer('accum', paddle.to_tensor(0.)) + self.register_buffer('total', paddle.to_tensor(0)) + + def update( + self, + pred_index_mat: Tensor, + edge_label_index: Union[Tensor, Tuple[Tensor, Tensor]], + ) -> None: + r"""Updates the state variables based on the current mini-batch + prediction. + + :meth:`update` can be repeated multiple times to accumulate the results + of successive predictions, *e.g.*, inside a mini-batch training or + evaluation loop. + + Args: + pred_index_mat (paddle.Tensor): The top-:math:`k` predictions of + every example in the mini-batch with shape + :obj:`[batch_size, k]`. + edge_label_index (paddle.Tensor): The ground-truth indices for every + example in the mini-batch, given in COO format of shape + :obj:`[2, num_ground_truth_indices]`. + """ + if pred_index_mat.shape[1] != self.k: + raise ValueError(f"Expected 'pred_index_mat' to hold {self.k} " + f"many indices for every entry " + f"(got {pred_index_mat.shape[1]})") + + # Compute a boolean matrix indicating if the k-th prediction is part of + # the ground-truth. We do this by flattening both prediction and + # target indices, and then determining overlaps via `paddle.isin`. + max_index = max( # type: ignore + pred_index_mat.max() if pred_index_mat.numel() > 0 else 0, + edge_label_index[1].max() + if edge_label_index[1].numel() > 0 else 0, + ) + 1 + arange = paddle.arange( + start=0, + end=max_index * pred_index_mat.shape[0], # type: ignore + step=max_index, # type: ignore + device=pred_index_mat.device, + ).reshape([-1, 1]) + flat_pred_index = (pred_index_mat + arange).reshape([-1]) + flat_y_index = max_index * edge_label_index[0] + edge_label_index[1] + + pred_isin_mat = paddle.isin(flat_pred_index, flat_y_index) + pred_isin_mat = pred_isin_mat.reshape(pred_index_mat.shape) + + # Compute the number of targets per example: + y_count = paddle_geometric.utils.scatter( + paddle.ones_like(edge_label_index[0]), + edge_label_index[0], + dim=0, + dim_size=pred_index_mat.shape[0], + reduce='sum', + ) + + metric = self._compute(pred_isin_mat, y_count) + + self.accum += metric.sum() + self.total += (y_count > 0).sum() + + def compute(self) -> Tensor: + r"""Computes the final metric value.""" + if self.total == 0: + return paddle.zeros_like(self.accum) + return self.accum / self.total + + def reset(self) -> None: + r"""Reset metric state variables to their default value.""" + if WITH_PADDLEMETRICS: + super().reset() + else: + self.accum.zero_() + self.total.zero_() + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + r"""Compute the specific metric. + To be implemented separately for each metric class. + + Args: + pred_isin_mat (paddle.Tensor): A boolean matrix whose :obj:`(i,k)` + element indicates if the :obj:`k`-th prediction for the + :obj:`i`-th example is correct or not. + y_count (paddle.Tensor): A vector indicating the number of + ground-truth labels for each example. + """ + raise NotImplementedError + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(k={self.k})' + + +class LinkPredPrecision(LinkPredMetric): + r"""A link prediction metric to compute Precision @ :math:`k`. + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + higher_is_better: bool = True + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + return pred_isin_mat.sum(dim=-1) / self.k + + +class LinkPredRecall(LinkPredMetric): + r"""A link prediction metric to compute Recall @ :math:`k`. + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + higher_is_better: bool = True + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + return pred_isin_mat.sum(dim=-1) / y_count.clamp(min=1e-7) + + +class LinkPredF1(LinkPredMetric): + r"""A link prediction metric to compute F1 @ :math:`k`. + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + higher_is_better: bool = True + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + isin_count = pred_isin_mat.sum(dim=-1) + precision = isin_count / self.k + recall = isin_count / y_count.clamp(min=1e-7) + return 2 * precision * recall / (precision + recall).clamp(min=1e-7) + + +class LinkPredMAP(LinkPredMetric): + r"""A link prediction metric to compute MAP @ :math:`k` (Mean Average + Precision). + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + higher_is_better: bool = True + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + cum_precision = (paddle.cumsum(pred_isin_mat, dim=1) / + paddle.arange(1, self.k + 1, dtype=y_count.dtype)) + return ((cum_precision * pred_isin_mat).sum(dim=-1) / + y_count.clamp(min=1e-7, max=self.k)) + + +class LinkPredNDCG(LinkPredMetric): + r"""A link prediction metric to compute the NDCG @ :math:`k` (Normalized + Discounted Cumulative Gain). + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + higher_is_better: bool = True + + def __init__(self, k: int): + super().__init__(k=k) + + dtype = paddle.get_default_dtype() + multiplier = 1.0 / paddle.arange(2, k + 2, dtype=dtype).log2() + + self.multiplier: Tensor + self.register_buffer('multiplier', multiplier) + + self.idcg: Tensor + self.register_buffer('idcg', paddle.cumsum(multiplier)) + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + dcg = (pred_isin_mat * self.multiplier.view(1, -1)).sum(dim=-1) + idcg = self.idcg[y_count.clamp(max=self.k)] + + out = dcg / idcg + out[out.isnan() | out.isinf()] = 0.0 + return out + + +class LinkPredMRR(LinkPredMetric): + r"""A link prediction metric to compute the MRR @ :math:`k` (Mean + Reciprocal Rank). + + Args: + k (int): The number of top-:math:`k` predictions to evaluate against. + """ + higher_is_better: bool = True + + def _compute(self, pred_isin_mat: Tensor, y_count: Tensor) -> Tensor: + rank = pred_isin_mat.astype(paddle.uint8).argmax(dim=-1) + is_correct = pred_isin_mat.gather(1, rank.reshape([-1, 1])).reshape([-1]) + reciprocals = 1.0 / (rank + 1) + reciprocals[~is_correct] = 0.0 + return reciprocals diff --git a/jointContribution/mattergen/paddle_geometric/nn/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/__init__.py new file mode 100644 index 00000000..5c615d6e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/__init__.py @@ -0,0 +1,31 @@ +from .reshape import Reshape +from .sequential import Sequential +from .data_parallel import DataParallel +from .to_hetero_transformer import to_hetero +from .to_hetero_with_bases_transformer import to_hetero_with_bases +from .to_fixed_size_transformer import to_fixed_size +from .encoding import PositionalEncoding, TemporalEncoding +from .summary import summary + +from .aggr import * # noqa +from .conv import * # noqa +from .pool import * # noqa +from .glob import * # noqa +from .norm import * # noqa +from .unpool import * # noqa +from .dense import * # noqa +from .kge import * # noqa +from .models import * # noqa +from .functional import * # noqa + +__all__ = [ + 'Reshape', + 'Sequential', + 'DataParallel', + 'to_hetero', + 'to_hetero_with_bases', + 'to_fixed_size', + 'PositionalEncoding', + 'TemporalEncoding', + 'summary', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/__init__.py new file mode 100644 index 00000000..aaf8c95e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/__init__.py @@ -0,0 +1,58 @@ +from .base import Aggregation +from .multi import MultiAggregation +from .basic import ( + MeanAggregation, + SumAggregation, + MaxAggregation, + MinAggregation, + MulAggregation, + VarAggregation, + StdAggregation, + SoftmaxAggregation, + PowerMeanAggregation, +) +from .quantile import MedianAggregation, QuantileAggregation +from .lstm import LSTMAggregation +from .gru import GRUAggregation +from .set2set import Set2Set +from .scaler import DegreeScalerAggregation +from .equilibrium import EquilibriumAggregation +from .sort import SortAggregation +from .gmt import GraphMultisetTransformer +from .attention import AttentionalAggregation +from .mlp import MLPAggregation +from .deep_sets import DeepSetsAggregation +from .set_transformer import SetTransformerAggregation +from .lcm import LCMAggregation +from .variance_preserving import VariancePreservingAggregation +from .patch_transformer import PatchTransformerAggregation + +__all__ = classes = [ + 'Aggregation', + 'MultiAggregation', + 'SumAggregation', + 'MeanAggregation', + 'MaxAggregation', + 'MinAggregation', + 'MulAggregation', + 'VarAggregation', + 'StdAggregation', + 'SoftmaxAggregation', + 'PowerMeanAggregation', + 'MedianAggregation', + 'QuantileAggregation', + 'LSTMAggregation', + 'GRUAggregation', + 'Set2Set', + 'DegreeScalerAggregation', + 'SortAggregation', + 'GraphMultisetTransformer', + 'AttentionalAggregation', + 'EquilibriumAggregation', + 'MLPAggregation', + 'DeepSetsAggregation', + 'SetTransformerAggregation', + 'LCMAggregation', + 'VariancePreservingAggregation', + 'PatchTransformerAggregation', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/attention.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/attention.py new file mode 100644 index 00000000..b3303665 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/attention.py @@ -0,0 +1,85 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.inits import reset +from paddle_geometric.utils import softmax + + +class AttentionalAggregation(Aggregation): + r""" + The soft attention aggregation layer from the + `"Graph Matching Networks for Learning the Similarity of Graph Structured Objects" + `_ paper. + + .. math:: + \mathbf{r}_i = \sum_{n=1}^{N_i} \mathrm{softmax} \left( + h_{\mathrm{gate}} ( \mathbf{x}_n ) \right) \cdot + h_{\mathbf{\Theta}} ( \mathbf{x}_n ), + + where :math:`h_{\mathrm{gate}} \colon \mathbb{R}^F \to + \mathbb{R}` and :math:`h_{\mathbf{\Theta}}` denote neural networks, *i.e.* + MLPs. + + Args: + gate_nn (paddle.nn.Layer): A neural network :math:`h_{\mathrm{gate}}` + that computes attention scores by mapping node features :obj:`x` of + shape :obj:`[-1, in_channels]` to shape :obj:`[-1, 1]` (for + node-level gating) or :obj:`[1, out_channels]` (for feature-level + gating), *e.g.*, defined by :class:`paddle.nn.Sequential`. + nn (paddle.nn.Layer, optional): A neural network + :math:`h_{\mathbf{\Theta}}` that maps node features :obj:`x` of + shape :obj:`[-1, in_channels]` to shape :obj:`[-1, out_channels]` + before combining them with the attention scores, *e.g.*, defined by + :class:`paddle.nn.Sequential`. (default: :obj:`None`) + """ + def __init__( + self, + gate_nn: paddle.nn.Layer, + nn: Optional[paddle.nn.Layer] = None, + ): + super().__init__() + + from paddle_geometric.nn import MLP + + self.gate_nn = self.gate_mlp = None + if isinstance(gate_nn, MLP): + self.gate_mlp = gate_nn + else: + self.gate_nn = gate_nn + + self.nn = self.mlp = None + if isinstance(nn, MLP): + self.mlp = nn + else: + self.nn = nn + + def reset_parameters(self): + reset(self.gate_nn) + reset(self.gate_mlp) + reset(self.nn) + reset(self.mlp) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + if self.gate_mlp is not None: + gate = self.gate_mlp(x, batch=index, batch_size=dim_size) + else: + gate = self.gate_nn(x) + + if self.mlp is not None: + x = self.mlp(x, batch=index, batch_size=dim_size) + elif self.nn is not None: + x = self.nn(x) + + gate = softmax(gate, index, ptr, dim_size, dim) + return self.reduce(gate * x, index, ptr, dim_size, dim) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'gate_nn={self.gate_mlp or self.gate_nn}, ' + f'nn={self.mlp or self.nn})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/base.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/base.py new file mode 100644 index 00000000..a01c3847 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/base.py @@ -0,0 +1,216 @@ +from typing import Final, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.experimental import disable_dynamic_shapes +from paddle_geometric.utils import scatter, segment, to_dense_batch + + +class Aggregation(paddle.nn.Layer): + r"""An abstract base class for implementing custom aggregations. + + Aggregation can be either performed via an :obj:`index` vector, which + defines the mapping from input elements to their location in the output: + + | + + .. image:: https://raw.githubusercontent.com/rusty1s/pytorch_scatter/ + master/docs/source/_figures/add.svg?sanitize=true + :align: center + :width: 400px + + | + + Notably, :obj:`index` does not have to be sorted (for most aggregation + operators): + + .. code-block:: python + + # Feature matrix holding 10 elements with 64 features each: + x = torch.randn(10, 64) + + # Assign each element to one of three sets: + index = torch.tensor([0, 0, 1, 0, 2, 0, 2, 1, 0, 2]) + + output = aggr(x, index) # Output shape: [3, 64] + + Alternatively, aggregation can be achieved via a "compressed" index vector + called :obj:`ptr`. Here, elements within the same set need to be grouped + together in the input, and :obj:`ptr` defines their boundaries: + + .. code-block:: python + + # Feature matrix holding 10 elements with 64 features each: + x = torch.randn(10, 64) + + # Define the boundary indices for three sets: + ptr = torch.tensor([0, 4, 7, 10]) + + output = aggr(x, ptr=ptr) # Output shape: [3, 64] + + Note that at least one of :obj:`index` or :obj:`ptr` must be defined. + + Shapes: + - **input:** + node features :math:`(*, |\mathcal{V}|, F_{in})` or edge features + :math:`(*, |\mathcal{E}|, F_{in})`, + index vector :math:`(|\mathcal{V}|)` or :math:`(|\mathcal{E}|)`, + - **output:** graph features :math:`(*, |\mathcal{G}|, F_{out})` or + node features :math:`(*, |\mathcal{V}|, F_{out})` + """ + def __init__(self) -> None: + super().__init__() + + self._deterministic: Final[bool] = False # 或者根据需求设置为 True + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + r"""Forward pass. + + Args: + x (torch.Tensor): The source tensor. + index (torch.Tensor, optional): The indices of elements for + applying the aggregation. + One of :obj:`index` or :obj:`ptr` must be defined. + (default: :obj:`None`) + ptr (torch.Tensor, optional): If given, computes the aggregation + based on sorted inputs in CSR representation. + One of :obj:`index` or :obj:`ptr` must be defined. + (default: :obj:`None`) + dim_size (int, optional): The size of the output tensor at + dimension :obj:`dim` after aggregation. (default: :obj:`None`) + dim (int, optional): The dimension in which to aggregate. + (default: :obj:`-2`) + max_num_elements: (int, optional): The maximum number of elements + within a single aggregation group. (default: :obj:`None`) + """ + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + + @disable_dynamic_shapes(required_args=['dim_size']) + def __call__( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + **kwargs, + ) -> Tensor: + + if dim >= x.dim() or dim < -x.dim(): + raise ValueError(f"Encountered invalid dimension '{dim}' of " + f"source tensor with {x.dim()} dimensions") + + if index is None and ptr is None: + index = x.new_zeros(x.size(dim), dtype=paddle.int64) + + if ptr is not None: + if dim_size is None: + dim_size = ptr.numel() - 1 + elif dim_size != ptr.numel() - 1: + raise ValueError(f"Encountered invalid 'dim_size' (got " + f"'{dim_size}' but expected " + f"'{ptr.numel() - 1}')") + + if index is not None and dim_size is None: + dim_size = int(index.max()) + 1 if index.numel() > 0 else 0 + + try: + return super().__call__(x, index=index, ptr=ptr, dim_size=dim_size, + dim=dim, **kwargs) + except (IndexError, RuntimeError) as e: + if index is not None: + if index.numel() > 0 and dim_size <= int(index.max()): + raise ValueError(f"Encountered invalid 'dim_size' (got " + f"'{dim_size}' but expected " + f">= '{int(index.max()) + 1}')") + raise e + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' + + # Assertions ############################################################## + + def assert_index_present(self, index: Optional[Tensor]): + # TODO Currently, not all aggregators support `ptr`. This assert helps + # to ensure that we require `index` to be passed to the computation: + if index is None: + raise NotImplementedError( + "Aggregation requires 'index' to be specified") + + def assert_sorted_index(self, index: Optional[Tensor]): + if index is not None and not paddle.all(index[:-1] <= index[1:]): + raise ValueError("Can not perform aggregation since the 'index' " + "tensor is not sorted. Specifically, if you use " + "this aggregation as part of 'MessagePassing`, " + "ensure that 'edge_index' is sorted by " + "destination nodes, e.g., by calling " + "`data.sort(sort_by_row=False)`") + + def assert_two_dimensional_input(self, x: Tensor, dim: int): + if x.dim() != 2: + raise ValueError(f"Aggregation requires two-dimensional inputs " + f"(got '{x.dim()}')") + + if dim not in [-2, 0]: + raise ValueError(f"Aggregation needs to perform aggregation in " + f"first dimension (got '{dim}')") + + # Helper methods ########################################################## + + def reduce(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, reduce: str = 'sum') -> Tensor: + + if ptr is not None: + if index is None or self._deterministic: + ptr = expand_left(ptr, dim, dims=x.dim()) + return segment(x, ptr, reduce=reduce) + + if index is None: + raise RuntimeError("Aggregation requires 'index' to be specified") + + return scatter(x, index, dim, dim_size, reduce) + + def to_dense_batch( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + fill_value: float = 0.0, + max_num_elements: Optional[int] = None, + ) -> Tuple[Tensor, Tensor]: + + # TODO Currently, `to_dense_batch` can only operate on `index`: + self.assert_index_present(index) + self.assert_sorted_index(index) + self.assert_two_dimensional_input(x, dim) + + return to_dense_batch( + x, + index, + batch_size=dim_size, + fill_value=fill_value, + max_num_nodes=max_num_elements, + ) + + +############################################################################### + + +def expand_left(ptr: Tensor, dim: int, dims: int) -> Tensor: + for _ in range(dims + dim if dim < 0 else dim): + ptr = ptr.unsqueeze(0) + return ptr diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/basic.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/basic.py new file mode 100644 index 00000000..5f42d8e9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/basic.py @@ -0,0 +1,179 @@ +import math +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.utils import softmax + + +class SumAggregation(Aggregation): + r"""An aggregation operator that sums up features across a set of elements.""" + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + return self.reduce(x, index, ptr, dim_size, dim, reduce='sum') + + +class MeanAggregation(Aggregation): + r"""An aggregation operator that averages features across a set of elements.""" + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + return self.reduce(x, index, ptr, dim_size, dim, reduce='mean') + + +class MaxAggregation(Aggregation): + r"""An aggregation operator that takes the feature-wise maximum across a set of elements.""" + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + return self.reduce(x, index, ptr, dim_size, dim, reduce='max') + + +class MinAggregation(Aggregation): + r"""An aggregation operator that takes the feature-wise minimum across a set of elements.""" + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + return self.reduce(x, index, ptr, dim_size, dim, reduce='min') + + +class MulAggregation(Aggregation): + r"""An aggregation operator that multiplies features across a set of elements.""" + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + self.assert_index_present(index) + return self.reduce(x, index, None, dim_size, dim, reduce='mul') + + +class VarAggregation(Aggregation): + r"""An aggregation operator that calculates the feature-wise variance across a set of elements.""" + def __init__(self, semi_grad: bool = False): + super().__init__() + self.semi_grad = semi_grad + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + mean = self.reduce(x, index, ptr, dim_size, dim, reduce='mean') + if self.semi_grad: + with paddle.no_grad(): + mean2 = self.reduce(x * x, index, ptr, dim_size, dim, 'mean') + else: + mean2 = self.reduce(x * x, index, ptr, dim_size, dim, 'mean') + return mean2 - mean * mean + + +class StdAggregation(Aggregation): + r"""An aggregation operator that calculates the feature-wise standard deviation across a set of elements.""" + def __init__(self, semi_grad: bool = False): + super().__init__() + self.var_aggr = VarAggregation(semi_grad) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + if axis is not None: + dim = axis + var = self.var_aggr(x, index, ptr, dim_size, dim) + out = var.clip(min=1e-5).sqrt() + out = paddle.where(out <= math.sqrt(1e-5), paddle.zeros_like(out), out) + return out + + +class SoftmaxAggregation(Aggregation): + r"""The softmax aggregation operator based on a temperature term.""" + def __init__(self, t: float = 1.0, learn: bool = False, + semi_grad: bool = False, channels: int = 1): + super().__init__() + + if learn and semi_grad: + raise ValueError("Cannot enable 'semi_grad' if 't' is learnable") + + if not learn and channels != 1: + raise ValueError("Cannot set 'channels' greater than '1' if 't' is not trainable") + + self._init_t = t + self.learn = learn + self.semi_grad = semi_grad + self.channels = channels + + self.t = paddle.create_parameter(shape=[channels], dtype='float32') if learn else t + self.reset_parameters() + + def reset_parameters(self): + if isinstance(self.t, Tensor): + self.t.set_value(paddle.full_like(self.t, self._init_t)) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + t = self.t + if self.channels != 1: + self.assert_two_dimensional_input(x, dim) + t = t.reshape([1, -1]) + + alpha = x * t if not isinstance(t, (int, float)) or t != 1 else x + + if not self.learn and self.semi_grad: + with paddle.no_grad(): + alpha = softmax(alpha, index, ptr, dim_size, dim) + else: + alpha = softmax(alpha, index, ptr, dim_size, dim) + return self.reduce(x * alpha, index, ptr, dim_size, dim, reduce='sum') + + +class PowerMeanAggregation(Aggregation): + r"""The powermean aggregation operator based on a power term.""" + def __init__(self, p: float = 1.0, learn: bool = False, channels: int = 1): + super().__init__() + + if not learn and channels != 1: + raise ValueError("Cannot set 'channels' greater than '1' if 'p' is not trainable") + + self._init_p = p + self.learn = learn + self.channels = channels + + self.p = paddle.create_parameter(shape=[channels], dtype='float32') if learn else p + self.reset_parameters() + + def reset_parameters(self): + if isinstance(self.p, Tensor): + self.p.set_value(paddle.full_like(self.p, self._init_p)) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2, axis: Optional[int] = None) -> Tensor: + p = self.p + if self.channels != 1: + self.assert_two_dimensional_input(x, dim) + p = p.reshape([1, -1]) + + if not isinstance(p, (int, float)) or p != 1: + x = x.clip(min=0, max=100).pow(p) + + out = self.reduce(x, index, ptr, dim_size, dim, reduce='mean') + + if not isinstance(p, (int, float)) or p != 1: + out = out.clip(min=0, max=100).pow(1. / p) + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(learn={self.learn})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/deep_sets.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/deep_sets.py new file mode 100644 index 00000000..34c47888 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/deep_sets.py @@ -0,0 +1,74 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.inits import reset + + +class DeepSetsAggregation(Aggregation): + r"""Performs Deep Sets aggregation in which the elements to aggregate are + first transformed by a Multi-Layer Perceptron (MLP) + :math:`\phi_{\mathbf{\Theta}}`, summed, and then transformed by another MLP + :math:`\rho_{\mathbf{\Theta}}`, as suggested in the `"Graph Neural Networks + with Adaptive Readouts" `_ paper. + + Args: + local_nn (paddle.nn.Layer, optional): The neural network + :math:`\phi_{\mathbf{\Theta}}`, *e.g.*, defined by + :class:`paddle.nn.Sequential` or + :class:`paddle_geometric.nn.models.MLP`. (default: :obj:`None`) + global_nn (paddle.nn.Layer, optional): The neural network + :math:`\rho_{\mathbf{\Theta}}`, *e.g.*, defined by + :class:`paddle.nn.Sequential` or + :class:`paddle_geometric.nn.models.MLP`. (default: :obj:`None`) + """ + def __init__( + self, + local_nn: Optional[paddle.nn.Layer] = None, + global_nn: Optional[paddle.nn.Layer] = None, + ): + super().__init__() + + from paddle_geometric.nn import MLP + + self.local_nn = self.local_mlp = None + if isinstance(local_nn, MLP): + self.local_mlp = local_nn + else: + self.local_nn = local_nn + + self.global_nn = self.global_mlp = None + if isinstance(global_nn, MLP): + self.global_mlp = global_nn + else: + self.global_nn = global_nn + + def reset_parameters(self): + reset(self.local_nn) + reset(self.local_mlp) + reset(self.global_nn) + reset(self.global_mlp) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + if self.local_mlp is not None: + x = self.local_mlp(x, batch=index, batch_size=dim_size) + if self.local_nn is not None: + x = self.local_nn(x) + + x = self.reduce(x, index, ptr, dim_size, dim, reduce='sum') + + if self.global_mlp is not None: + x = self.global_mlp(x, batch=index, batch_size=dim_size) + elif self.global_nn is not None: + x = self.global_nn(x) + + return x + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'local_nn={self.local_mlp or self.local_nn}, ' + f'global_nn={self.global_mlp or self.global_nn})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/equilibrium.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/equilibrium.py new file mode 100644 index 00000000..8a4018d4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/equilibrium.py @@ -0,0 +1,141 @@ +from typing import Callable, List, Optional, Tuple + +import paddle +from paddle import Tensor +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.inits import reset +from paddle_geometric.utils import scatter + + +class ResNetPotential(paddle.nn.Layer): + def __init__(self, in_channels: int, out_channels: int, + num_layers: List[int]): + super().__init__() + sizes = [in_channels] + num_layers + [out_channels] + self.layers = paddle.nn.LayerList([ + paddle.nn.Sequential( + paddle.nn.Linear(in_size, out_size), + paddle.nn.LayerNorm(out_size), + paddle.nn.Tanh() + ) + for in_size, out_size in zip(sizes[:-2], sizes[1:-1]) + ]) + self.layers.append(paddle.nn.Linear(sizes[-2], sizes[-1])) + + self.res_trans = paddle.nn.LayerList([ + paddle.nn.Linear(in_channels, layer_size) + for layer_size in num_layers + [out_channels] + ]) + + def forward(self, x: Tensor, y: Tensor, index: Optional[Tensor], + dim_size: Optional[int] = None) -> Tensor: + if index is None: + inp = paddle.concat([x, y.expand([x.shape[0], -1])], axis=1) + else: + inp = paddle.concat([x, paddle.gather(y, index)], axis=1) + + h = inp + for layer, res in zip(self.layers, self.res_trans): + h = layer(h) + h = res(inp) + h + + if index is None: + return h.mean() + + if dim_size is None: + dim_size = int(paddle.max(index).item() + 1) + + return scatter(h, index, 0, dim_size, reduce='mean').sum() + + +class MomentumOptimizer(paddle.nn.Layer): + def __init__(self, learning_rate: float = 0.1, momentum: float = 0.9, + learnable: bool = True): + super().__init__() + + self._initial_lr = learning_rate + self._initial_mom = momentum + self._lr = self.create_parameter(shape=[1], default_initializer=paddle.nn.initializer.Constant(learning_rate)) + self._lr.stop_gradient = not learnable + self._mom = self.create_parameter(shape=[1], default_initializer=paddle.nn.initializer.Constant(momentum)) + self._mom.stop_gradient = not learnable + self.softplus = paddle.nn.Softplus() + self.sigmoid = paddle.nn.Sigmoid() + + def reset_parameters(self): + self._lr.set_value(paddle.to_tensor(self._initial_lr)) + self._mom.set_value(paddle.to_tensor(self._initial_mom)) + + @property + def learning_rate(self): + return self.softplus(self._lr) + + @property + def momentum(self): + return self.sigmoid(self._mom) + + def forward( + self, + x: Tensor, + y: Tensor, + index: Optional[Tensor], + dim_size: Optional[int], + func: Callable[[Tensor, Tensor, Optional[Tensor]], Tensor], + iterations: int = 5, + ) -> Tuple[Tensor, float]: + + momentum_buffer = paddle.zeros_like(y) + for _ in range(iterations): + val = func(x, y, index, dim_size) + grad = paddle.grad([val], [y], create_graph=True, retain_graph=True)[0] + delta = self.learning_rate * grad + momentum_buffer = self.momentum * momentum_buffer - delta + y = y + momentum_buffer + return y + + +class EquilibriumAggregation(Aggregation): + def __init__(self, in_channels: int, out_channels: int, + num_layers: List[int], grad_iter: int = 5, lamb: float = 0.1): + super().__init__() + + self.potential = ResNetPotential(in_channels + out_channels, 1, num_layers) + self.optimizer = MomentumOptimizer() + self.initial_lamb = lamb + self.lamb = self.create_parameter(shape=[1], default_initializer=paddle.nn.initializer.Constant(lamb)) + self.softplus = paddle.nn.Softplus() + self.grad_iter = grad_iter + self.output_dim = out_channels + self.reset_parameters() + + def reset_parameters(self): + self.lamb.set_value(paddle.to_tensor(self.initial_lamb)) + reset(self.optimizer) + reset(self.potential) + + def init_output(self, dim_size: int) -> Tensor: + return paddle.zeros([dim_size, self.output_dim], dtype=paddle.float32, stop_gradient=False) + + def reg(self, y: Tensor) -> Tensor: + return self.softplus(self.lamb) * y.square().sum(axis=-1).mean() + + def energy(self, x: Tensor, y: Tensor, index: Optional[Tensor], + dim_size: Optional[int] = None): + return self.potential(x, y, index, dim_size) + self.reg(y) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + self.assert_index_present(index) + + dim_size = int(paddle.max(index)) + 1 if dim_size is None else dim_size + + with paddle.set_grad_enabled(True): + y = self.optimizer(x, self.init_output(dim_size), index, dim_size, + self.energy, iterations=self.grad_iter) + + return y + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}()') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/fused.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/fused.py new file mode 100644 index 00000000..319bc395 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/fused.py @@ -0,0 +1,288 @@ +import math +from typing import Dict, List, Optional, Tuple, Union +import paddle +from paddle import Tensor +from paddle_geometric.nn.aggr.base import Aggregation +from paddle_geometric.nn.aggr.basic import ( + MaxAggregation, + MeanAggregation, + MinAggregation, + MulAggregation, + StdAggregation, + SumAggregation, + VarAggregation, +) +from paddle_geometric.nn.resolver import aggregation_resolver +from paddle_geometric.utils import scatter + + +class FusedAggregation(Aggregation): + r"""Helper class to fuse computation of multiple aggregations together. + + Used internally in :class:`~paddle_geometric.nn.aggr.MultiAggregation` to + speed-up computation. + Currently, the following optimizations are performed: + + * :class:`MeanAggregation` will share the output with + :class:`SumAggregation` in case it is present as well. + + * :class:`VarAggregation` will share the output with either + :class:`MeanAggregation` or :class:`SumAggregation` in case one of them + is present as well. + + * :class:`StdAggregation` will share the output with either + :class:`VarAggregation`, :class:`MeanAggregation` or + :class:`SumAggregation` in case one of them is present as well. + + In addition, temporary values such as the count per group index are shared + as well. + + Benchmarking results (summed over 1000 runs): + + +------------------------------+---------+---------+ + | Aggregators | Vanilla | Fusion | + +==============================+=========+=========+ + | :obj:`[sum, mean]` | 0.3325s | 0.1996s | + +------------------------------+---------+---------+ + | :obj:`[sum, mean, min, max]` | 0.7139s | 0.5037s | + +------------------------------+---------+---------+ + | :obj:`[sum, mean, var]` | 0.6849s | 0.3871s | + +------------------------------+---------+---------+ + | :obj:`[sum, mean, var, std]` | 1.0955s | 0.3973s | + +------------------------------+---------+---------+ + + Args: + aggrs (list): The list of aggregation schemes to use. + """ + # We can fuse all aggregations together that rely on `scatter` directives. + FUSABLE_AGGRS = { + SumAggregation, + MeanAggregation, + MinAggregation, + MaxAggregation, + MulAggregation, + VarAggregation, + StdAggregation, + } + + # All aggregations that rely on computing the degree of indices. + DEGREE_BASED_AGGRS = { + MeanAggregation, + VarAggregation, + StdAggregation, + } + + # Map aggregations to `reduce` options in `scatter` directives. + REDUCE = { + 'SumAggregation': 'sum', + 'MeanAggregation': 'sum', + 'MinAggregation': 'min', + 'MaxAggregation': 'max', + 'MulAggregation': 'mul', + 'VarAggregation': 'pow_sum', + 'StdAggregation': 'pow_sum', + } + + def __init__(self, aggrs: List[Union[Aggregation, str]]): + super().__init__() + + if not isinstance(aggrs, (list, tuple)): + raise ValueError(f"'aggrs' of '{self.__class__.__name__}' should " + f"be a list or tuple (got '{type(aggrs)}').") + + if len(aggrs) == 0: + raise ValueError(f"'aggrs' of '{self.__class__.__name__}' should " + f"not be empty.") + + aggrs = [aggregation_resolver(aggr) for aggr in aggrs] + aggr_classes = [aggr.__class__ for aggr in aggrs] + self.aggr_names = [cls.__name__ for cls in aggr_classes] + self.aggr_index: Dict[str, int] = { + name: i + for i, name in enumerate(self.aggr_names) + } + + for cls in aggr_classes: + if cls not in self.FUSABLE_AGGRS: + raise ValueError(f"Received aggregation '{cls.__name__}' in " + f"'{self.__class__.__name__}' which is not " + f"fusable") + + self.semi_grad = False + for aggr in aggrs: + if hasattr(aggr, 'semi_grad'): + self.semi_grad = self.semi_grad or aggr.semi_grad + + # Check whether we need to compute degree information: + self.need_degree = False + for cls in aggr_classes: + if cls in self.DEGREE_BASED_AGGRS: + self.need_degree = True + + # Determine which reduction to use for each aggregator: + # An entry of `None` means that this operator re-uses intermediate + # outputs from other aggregators. + reduce_ops: List[Optional[str]] = [] + # Determine which `(Aggregator, index)` to use as intermediate output: + lookup_ops: List[Optional[Tuple[str, int]]] = [] + + for name in self.aggr_names: + if name == 'MeanAggregation': + # Directly use output of `SumAggregation`: + if 'SumAggregation' in self.aggr_index: + reduce_ops.append(None) + lookup_ops.append(( + 'SumAggregation', + self.aggr_index['SumAggregation'], + )) + else: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(None) + + elif name == 'VarAggregation': + if 'MeanAggregation' in self.aggr_index: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(( + 'MeanAggregation', + self.aggr_index['MeanAggregation'], + )) + elif 'SumAggregation' in self.aggr_index: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(( + 'SumAggregation', + self.aggr_index['SumAggregation'], + )) + else: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(None) + + elif name == 'StdAggregation': + # Directly use output of `VarAggregation`: + if 'VarAggregation' in self.aggr_index: + reduce_ops.append(None) + lookup_ops.append(( + 'VarAggregation', + self.aggr_index['VarAggregation'], + )) + elif 'MeanAggregation' in self.aggr_index: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(( + 'MeanAggregation', + self.aggr_index['MeanAggregation'], + )) + elif 'SumAggregation' in self.aggr_index: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(( + 'SumAggregation', + self.aggr_index['SumAggregation'], + )) + else: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(None) + + else: + reduce_ops.append(self.REDUCE[name]) + lookup_ops.append(None) + + self.reduce_ops: List[Optional[str]] = reduce_ops + self.lookup_ops: List[Optional[Tuple[str, int]]] = lookup_ops + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> List[Tensor]: + + self.assert_index_present(index) + self.assert_two_dimensional_input(x, dim) + + assert index is not None + + if dim_size is None: + if ptr is not None: + dim_size = ptr.shape[0] - 1 + else: + dim_size = int(index.max()) + 1 if index.numel() > 0 else 0 + + count: Optional[Tensor] = None + if self.need_degree: + count = paddle.zeros([dim_size], dtype=x.dtype) + # count = paddle.scatter_add(count, index, paddle.ones([x.shape[0]], dtype=x.dtype)) + count = paddle.put_along_axis(count, index, paddle.ones([x.shape[0]], dtype=x.dtype), axis=0) + + count = paddle.clip(count, min=1).unsqueeze(-1) + + outs: List[Optional[Tensor]] = [] + + for i, reduce in enumerate(self.reduce_ops): + if reduce is None: + outs.append(None) + continue + assert isinstance(reduce, str) + + if reduce == 'pow_sum': + out = scatter(x * x if not self.semi_grad else x.detach() * x.detach(), index, reduce='sum') + else: + out = scatter(x, index, reduce=reduce) + + outs.append(out) + + i = self.aggr_index.get('MeanAggregation') + if i is not None: + assert count is not None + + if self.lookup_ops[i] is None: + sum_ = outs[i] + else: + lookup_op = self.lookup_ops[i] + assert lookup_op is not None + tmp_aggr, j = lookup_op + assert tmp_aggr == 'SumAggregation' + sum_ = outs[j] + + assert sum_ is not None + outs[i] = sum_ / count + + if 'VarAggregation' in self.aggr_index: + i = self.aggr_index['VarAggregation'] + assert count is not None + + if self.lookup_ops[i] is None: + sum_ = scatter(x, index, reduce='sum') + mean = sum_ / count + else: + lookup_op = self.lookup_ops[i] + assert lookup_op is not None + tmp_aggr, j = lookup_op + if tmp_aggr == 'VarAggregation': + var = outs[j] + elif tmp_aggr == 'SumAggregation': + pow_sum = outs[i] + sum_ = outs[j] + assert sum_ is not None + assert count is not None + mean = sum_ / count + elif tmp_aggr == 'MeanAggregation': + pow_sum = outs[i] + mean = outs[j] + else: + raise NotImplementedError + + if var is None: + assert pow_sum is not None + assert count is not None + assert mean is not None + var = (pow_sum / count) - (mean * mean) + + # Allow "undefined" gradient at `sqrt(0.0)`: + out = paddle.clip(var, min=1e-5).sqrt() + out = paddle.where(out <= math.sqrt(1e-5), paddle.zeros_like(out), out) + + outs[i] = out + + ####################################################################### + + vals: List[Tensor] = [] + for out in outs: + assert out is not None + vals.append(out) + + return vals diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/gmt.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/gmt.py new file mode 100644 index 00000000..6a5e18bc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/gmt.py @@ -0,0 +1,102 @@ +from typing import Optional +import paddle +from paddle import Tensor +from paddle.nn import Layer, LayerList + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.aggr.utils import ( + PoolingByMultiheadAttention, + SetAttentionBlock, +) + + +class GraphMultisetTransformer(Aggregation): + r"""The Graph Multiset Transformer pooling operator from the + `"Accurate Learning of Graph Representations + with Graph Multiset Pooling" `_ paper. + + The :class:`GraphMultisetTransformer` aggregates elements into + :math:`k` representative elements via attention-based pooling, computes the + interaction among them via :obj:`num_encoder_blocks` self-attention blocks, + and finally pools the representative elements via attention-based pooling + into a single cluster. + + .. note:: + + :class:`GraphMultisetTransformer` requires sorted indices :obj:`index` + as input. Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + Args: + channels (int): Size of each input sample. + k (int): Number of :math:`k` representative nodes after pooling. + num_encoder_blocks (int, optional): Number of Set Attention Blocks + (SABs) between the two pooling blocks. (default: :obj:`1`) + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + layer_norm (bool, optional): If set to :obj:`True`, will apply layer + normalization. (default: :obj:`False`) + dropout (float, optional): Dropout probability of attention weights. + (default: :obj:`0`) + """ + def __init__( + self, + channels: int, + k: int, + num_encoder_blocks: int = 1, + heads: int = 1, + layer_norm: bool = False, + dropout: float = 0.0, + ): + super().__init__() + + self.channels = channels + self.k = k + self.heads = heads + self.layer_norm = layer_norm + self.dropout = dropout + + self.pma1 = PoolingByMultiheadAttention(channels, k, heads, layer_norm, + dropout) + self.encoders = LayerList([ + SetAttentionBlock(channels, heads, layer_norm, dropout) + for _ in range(num_encoder_blocks) + ]) + self.pma2 = PoolingByMultiheadAttention(channels, 1, heads, layer_norm, + dropout) + + def reset_parameters(self): + self.pma1.reset_parameters() + for encoder in self.encoders: + encoder.reset_parameters() + self.pma2.reset_parameters() + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + x, mask = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=max_num_elements) + + x = self.pma1(x, mask) + + for encoder in self.encoders: + x = encoder(x) + + x = self.pma2(x) + + return x.squeeze(1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.channels}, ' + f'k={self.k}, heads={self.heads}, ' + f'layer_norm={self.layer_norm}, ' + f'dropout={self.dropout})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/gru.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/gru.py new file mode 100644 index 00000000..1d6a52ee --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/gru.py @@ -0,0 +1,61 @@ +from typing import Optional +import paddle +from paddle import Tensor +from paddle.nn import GRU + +from paddle_geometric.nn.aggr import Aggregation + + +class GRUAggregation(Aggregation): + r"""Performs GRU aggregation in which the elements to aggregate are + interpreted as a sequence, as described in the `"Graph Neural Networks + with Adaptive Readouts" `_ paper. + + .. note:: + + :class:`GRUAggregation` requires sorted indices :obj:`index` as input. + Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + .. warning:: + + :class:`GRUAggregation` is not a permutation-invariant operator. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + **kwargs (optional): Additional arguments of :class:`paddle.nn.GRU`. + """ + def __init__(self, in_channels: int, out_channels: int, **kwargs): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.gru = GRU(in_channels, out_channels, time_major=False, **kwargs) + self.reset_parameters() + + def reset_parameters(self): + for layer in self.gru.named_sublayers(): + if isinstance(layer, paddle.nn.GRUCell): + layer.reset_parameters() + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + x, _ = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=max_num_elements) + + output, _ = self.gru(x) + return output[:, -1] + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/lcm.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/lcm.py new file mode 100644 index 00000000..07334078 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/lcm.py @@ -0,0 +1,115 @@ +from math import ceil, log2 +from typing import Optional +import paddle +from paddle import Tensor +from paddle.nn import GRUCell, Linear + +from paddle_geometric.nn.aggr import Aggregation + + +class LCMAggregation(Aggregation): + r"""The Learnable Commutative Monoid aggregation from the + `"Learnable Commutative Monoids for Graph Neural Networks" + `_ paper, in which the elements are + aggregated using a binary tree reduction with + :math:`\mathcal{O}(\log |\mathcal{V}|)` depth. + + .. note:: + + :class:`LCMAggregation` requires sorted indices :obj:`index` as input. + Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + .. warning:: + + :class:`LCMAggregation` is not a permutation-invariant operator. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + project (bool, optional): If set to :obj:`True`, the layer will apply a + linear transformation followed by an activation function before + aggregation. (default: :obj:`True`) + """ + def __init__( + self, + in_channels: int, + out_channels: int, + project: bool = True, + ): + super().__init__() + + if in_channels != out_channels and not project: + raise ValueError(f"Inputs of '{self.__class__.__name__}' must be " + f"projected if `in_channels != out_channels`") + + self.in_channels = in_channels + self.out_channels = out_channels + self.project = project + + if self.project: + self.lin = Linear(in_channels, out_channels) + else: + self.lin = None + + self.gru_cell = GRUCell(out_channels, out_channels) + + def reset_parameters(self): + if self.project: + self.lin.reset_parameters() + self.gru_cell.reset_parameters() + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + if self.project: + x = paddle.nn.functional.relu(self.lin(x)) + + x, _ = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=max_num_elements) + + x = x.transpose([1, 0, 2]) # [num_neighbors, num_nodes, num_features] + _, num_nodes, num_features = x.shape + + depth = ceil(log2(x.shape[0])) + for _ in range(depth): + half_size = ceil(x.shape[0] / 2) + + if x.shape[0] % 2 == 1: + # This level of the tree has an odd number of nodes, so the + # remaining unmatched node gets moved to the next level. + x, remainder = x[:-1], x[-1:] + else: + remainder = None + + left_right = x.reshape([-1, 2, num_nodes, num_features]) + right_left = left_right.flip(axis=[1]) + + left_right = left_right.reshape([-1, num_features]) + right_left = right_left.reshape([-1, num_features]) + + # Execute the GRUCell for all (left, right) pairs in the current + # level of the tree in parallel: + out = self.gru_cell(left_right, right_left) + out = out.reshape([-1, 2, num_nodes, num_features]) + out = out.mean(axis=1) + if remainder is not None: + out = paddle.concat([out, remainder], axis=0) + + x = out.reshape([half_size, num_nodes, num_features]) + + assert x.shape[0] == 1 + return x.squeeze(0) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, project={self.project})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/lstm.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/lstm.py new file mode 100644 index 00000000..27f4a9f5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/lstm.py @@ -0,0 +1,59 @@ +from typing import Optional +import paddle +from paddle import Tensor +from paddle.nn import LSTM + +from paddle_geometric.nn.aggr import Aggregation + + +class LSTMAggregation(Aggregation): + r"""Performs LSTM-style aggregation in which the elements to aggregate are + interpreted as a sequence, as described in the `"Inductive Representation + Learning on Large Graphs" `_ paper. + + .. note:: + + :class:`LSTMAggregation` requires sorted indices :obj:`index` as input. + Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + .. warning:: + + :class:`LSTMAggregation` is not a permutation-invariant operator. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + **kwargs (optional): Additional arguments of :class:`paddle.nn.LSTM`. + """ + def __init__(self, in_channels: int, out_channels: int, **kwargs): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.lstm = LSTM(in_channels, out_channels, batch_first=True, **kwargs) + self.reset_parameters() + + def reset_parameters(self): + for layer in self.lstm.parameters(): + paddle.nn.initializer.XavierUniform()(layer) + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + x, _ = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=max_num_elements) + + return self.lstm(x)[0][:, -1] + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/mlp.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/mlp.py new file mode 100644 index 00000000..4ad55c39 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/mlp.py @@ -0,0 +1,73 @@ +from typing import Optional +import paddle +from paddle import Tensor +from paddle_geometric.nn.aggr import Aggregation + + +class MLPAggregation(Aggregation): + r"""Performs MLP aggregation in which the elements to aggregate are + flattened into a single vectorial representation, and are then processed by + a Multi-Layer Perceptron (MLP), as described in the `"Graph Neural Networks + with Adaptive Readouts" `_ paper. + + .. note:: + + :class:`MLPAggregation` requires sorted indices :obj:`index` as input. + Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + .. warning:: + + :class:`MLPAggregation` is not a permutation-invariant operator. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + max_num_elements (int): The maximum number of elements to aggregate per + group. + **kwargs (optional): Additional arguments for `paddle.nn.Sequential` + MLP layers. + """ + def __init__( + self, + in_channels: int, + out_channels: int, + max_num_elements: int, + **kwargs, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.max_num_elements = max_num_elements + + # Define MLP with Paddle's Sequential API + self.mlp = paddle.nn.Sequential( + paddle.nn.Flatten(), + paddle.nn.Linear(in_channels * max_num_elements, out_channels), + paddle.nn.ReLU(), + paddle.nn.Dropout(kwargs.get("dropout", 0.5)), + paddle.nn.Linear(out_channels, out_channels) + ) + + def reset_parameters(self): + for layer in self.mlp: + if isinstance(layer, paddle.nn.Linear): + paddle.nn.initializer.XavierUniform()(layer.weight) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + x, _ = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=self.max_num_elements) + + x = x.reshape([-1, x.shape[1] * x.shape[2]]) + return self.mlp(x) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, ' + f'max_num_elements={self.max_num_elements})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/multi.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/multi.py new file mode 100644 index 00000000..76210446 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/multi.py @@ -0,0 +1,197 @@ +import copy +from typing import Any, Dict, List, Optional, Union + +import paddle +from paddle import Tensor +from paddle.nn import Linear, MultiHeadAttention + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.aggr.fused import FusedAggregation +from paddle_geometric.nn.dense import HeteroDictLinear +from paddle_geometric.nn.resolver import aggregation_resolver + + +class MultiAggregation(Aggregation): + r"""Performs aggregations with one or more aggregators and combines + aggregated results, as described in the `"Principal Neighbourhood + Aggregation for Graph Nets" `_ and + `"Adaptive Filters and Aggregator Fusion for Efficient Graph Convolutions" + `_ papers. + + Args: + aggrs (list): The list of aggregation schemes to use. + aggrs_kwargs (dict, optional): Arguments passed to the + respective aggregation function in case it gets automatically + resolved. (default: :obj:`None`) + mode (str, optional): The combine mode to use for combining + aggregated results from multiple aggregations (:obj:`"cat"`, + :obj:`"proj"`, :obj:`"sum"`, :obj:`"mean"`, :obj:`"max"`, + :obj:`"min"`, :obj:`"logsumexp"`, :obj:`"std"`, :obj:`"var"`, + :obj:`"attn"`). (default: :obj:`"cat"`) + mode_kwargs (dict, optional): Arguments passed for the combine + :obj:`mode`. When :obj:`"proj"` or :obj:`"attn"` is used as the + combine :obj:`mode`, :obj:`in_channels` (int or tuple) and + :obj:`out_channels` (int) are needed to be specified respectively + for the size of each input sample to combine from the respective + aggregation outputs and the size of each output sample after + combination. When :obj:`"attn"` mode is used, :obj:`num_heads` + (int) is needed to be specified for the number of parallel + attention heads. (default: :obj:`None`) + """ + fused_out_index: List[int] + is_fused_aggr: List[bool] + + def __init__( + self, + aggrs: List[Union[Aggregation, str]], + aggrs_kwargs: Optional[List[Dict[str, Any]]] = None, + mode: Optional[str] = 'cat', + mode_kwargs: Optional[Dict[str, Any]] = None, + ): + + super().__init__() + + if not isinstance(aggrs, (list, tuple)): + raise ValueError(f"'aggrs' of '{self.__class__.__name__}' should " + f"be a list or tuple (got '{type(aggrs)}').") + + if len(aggrs) == 0: + raise ValueError(f"'aggrs' of '{self.__class__.__name__}' should " + f"not be empty.") + + if aggrs_kwargs is None: + aggrs_kwargs = [{}] * len(aggrs) + elif len(aggrs) != len(aggrs_kwargs): + raise ValueError(f"'aggrs_kwargs' with invalid length passed to " + f"'{self.__class__.__name__}' " + f"(got '{len(aggrs_kwargs)}', " + f"expected '{len(aggrs)}'). Ensure that both " + f"'aggrs' and 'aggrs_kwargs' are consistent.") + + self.aggrs = paddle.nn.LayerList([ + aggregation_resolver(aggr, **aggr_kwargs) + for aggr, aggr_kwargs in zip(aggrs, aggrs_kwargs) + ]) + + # Divide the set into fusable and non-fusable aggregations: + fused_aggrs: List[Aggregation] = [] + self.fused_out_index: List[int] = [] + self.is_fused_aggr: List[bool] = [] + for i, aggr in enumerate(self.aggrs): + if aggr.__class__ in FusedAggregation.FUSABLE_AGGRS: + fused_aggrs.append(aggr) + self.fused_out_index.append(i) + self.is_fused_aggr.append(True) + else: + self.is_fused_aggr.append(False) + + if len(fused_aggrs) > 0: + self.fused_aggr = FusedAggregation(fused_aggrs) + else: + self.fused_aggr = None + + self.mode = mode + mode_kwargs = copy.copy(mode_kwargs) or {} + + self.in_channels = mode_kwargs.pop('in_channels', None) + self.out_channels = mode_kwargs.pop('out_channels', None) + + if mode == 'proj' or mode == 'attn': + if len(aggrs) == 1: + raise ValueError("Multiple aggregations are required for " + "'proj' or 'attn' combine mode.") + + if (self.in_channels and self.out_channels) is None: + raise ValueError( + f"Combine mode '{mode}' must have `in_channels` " + f"and `out_channels` specified.") + + if isinstance(self.in_channels, int): + self.in_channels = [self.in_channels] * len(aggrs) + + if mode == 'proj': + self.lin = Linear( + sum(self.in_channels), + self.out_channels, + **mode_kwargs, + ) + + elif mode == 'attn': + channels = {str(k): v for k, v, in enumerate(self.in_channels)} + self.lin_heads = HeteroDictLinear(channels, self.out_channels) + num_heads = mode_kwargs.pop('num_heads', 1) + self.multihead_attn = MultiHeadAttention( + embed_dim=self.out_channels, + num_heads=num_heads, + **mode_kwargs, + ) + + dense_combine_modes = [ + 'sum', 'mean', 'max', 'min', 'logsumexp', 'std', 'var' + ] + if mode in dense_combine_modes: + self.dense_combine = getattr(paddle, mode) + + def reset_parameters(self): + for aggr in self.aggrs: + aggr.reset_parameters() + if self.mode == 'proj': + self.lin.reset_parameters() + if self.mode == 'attn': + self.lin_heads.reset_parameters() + self.multihead_attn._reset_parameters() + + def get_out_channels(self, in_channels: int) -> int: + if self.out_channels is not None: + return self.out_channels + if self.mode == 'cat': + return in_channels * len(self.aggrs) + return in_channels + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + if index is None or x.dim() != 2 or self.fused_aggr is None: + outs = [aggr(x, index, ptr, dim_size, dim) for aggr in self.aggrs] + return self.combine(outs) + + outs: List[Tensor] = [x] * len(self.aggrs) # Fill with dummy tensors. + + fused_outs = self.fused_aggr(x, index, ptr, dim_size, dim) + for i, out in zip(self.fused_out_index, fused_outs): + outs[i] = out + + for i, aggr in enumerate(self.aggrs): + if not self.is_fused_aggr[i]: + outs[i] = aggr(x, index, ptr, dim_size, dim) + + return self.combine(outs) + + def combine(self, inputs: List[Tensor]) -> Tensor: + if len(inputs) == 1: + return inputs[0] + + if self.mode == 'cat': + return paddle.concat(inputs, axis=-1) + + if hasattr(self, 'lin'): + return self.lin(paddle.concat(inputs, axis=-1)) + + if hasattr(self, 'multihead_attn'): + x_dict = {str(k): v for k, v, in enumerate(inputs)} + x_dict = self.lin_heads(x_dict) + xs = [x_dict[str(key)] for key in range(len(inputs))] + x = paddle.stack(xs, axis=0) + attn_out, _ = self.multihead_attn(x, x, x) + return paddle.mean(attn_out, axis=0) + + if hasattr(self, 'dense_combine'): + out = self.dense_combine(paddle.stack(inputs, axis=0), axis=0) + return out if isinstance(out, Tensor) else out[0] + + raise ValueError(f"Combine mode '{self.mode}' is not supported.") + + def __repr__(self) -> str: + aggrs = ',\n'.join([f' {aggr}' for aggr in self.aggrs]) + ',\n' + return f'{self.__class__.__name__}([\n{aggrs}], mode={self.mode})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/patch_transformer.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/patch_transformer.py new file mode 100644 index 00000000..c234a8fc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/patch_transformer.py @@ -0,0 +1,140 @@ +import math +from typing import List, Optional, Union + +import paddle +from paddle import Tensor +import paddle.nn as nn +import paddle.nn.functional as F + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.aggr.utils import MultiheadAttentionBlock +from paddle_geometric.nn.encoding import PositionalEncoding +from paddle_geometric.utils import scatter + + +class PatchTransformerAggregation(Aggregation): + r"""Performs patch transformer aggregation in which the elements to + aggregate are processed by multi-head attention blocks across patches, as + described in the `"Simplifying Temporal Heterogeneous Network for + Continuous-Time Link Prediction" + `_ paper. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + patch_size (int): Number of elements in a patch. + hidden_channels (int): Intermediate size of each sample. + num_transformer_blocks (int, optional): Number of transformer blocks + (default: :obj:`1`). + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + dropout (float, optional): Dropout probability of attention weights. + (default: :obj:`0.0`) + aggr (str or list[str], optional): The aggregation module, *e.g.*, + :obj:`"sum"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`, + :obj:`"var"`, :obj:`"std"`. (default: :obj:`"mean"`) + """ + def __init__( + self, + in_channels: int, + out_channels: int, + patch_size: int, + hidden_channels: int, + num_transformer_blocks: int = 1, + heads: int = 1, + dropout: float = 0.0, + aggr: Union[str, List[str]] = 'mean', + ) -> None: + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.patch_size = patch_size + self.aggrs = [aggr] if isinstance(aggr, str) else aggr + + assert len(self.aggrs) > 0 + for aggr in self.aggrs: + assert aggr in ['sum', 'mean', 'min', 'max', 'var', 'std'] + + self.lin = nn.Linear(in_channels, hidden_channels) + self.pad_projector = nn.Linear( + patch_size * hidden_channels, + hidden_channels, + ) + self.pe = PositionalEncoding(hidden_channels) + + self.blocks = nn.LayerList([ + MultiheadAttentionBlock( + channels=hidden_channels, + heads=heads, + layer_norm=True, + dropout=dropout, + ) for _ in range(num_transformer_blocks) + ]) + + self.fc = nn.Linear( + hidden_channels * len(self.aggrs), + out_channels, + ) + + def reset_parameters(self) -> None: + self.lin.reset_parameters() + self.pad_projector.reset_parameters() + self.pe.reset_parameters() + for block in self.blocks: + block.reset_parameters() + self.fc.reset_parameters() + + def forward( + self, + x: Tensor, + index: Tensor, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + if max_num_elements is None: + if ptr is not None: + count = ptr[1:] - ptr[:-1] + else: + count = scatter(paddle.ones_like(index), index, dim=0, + dim_size=dim_size, reduce='sum') + max_num_elements = int(count.max().item()) + 1 + + # Set `max_num_elements` to a multiple of `patch_size`: + max_num_elements = (math.floor(max_num_elements / self.patch_size) * + self.patch_size) + + x = self.lin(x) + + x, _ = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=max_num_elements) + + # [batch_size, num_patches, patch_size * hidden_channels] + x = x.reshape([x.shape[0], max_num_elements // self.patch_size, + self.patch_size * x.shape[-1]]) + + # [batch_size, num_patches, hidden_channels] + x = self.pad_projector(x) + + x = x + self.pe(paddle.arange(x.shape[1], dtype=x.dtype)) + + # [batch_size, num_patches, hidden_channels] + for block in self.blocks: + x = block(x, x) + + # [batch_size, hidden_channels] + outs: List[Tensor] = [] + for aggr in self.aggrs: + out = getattr(paddle, aggr)(x, axis=1) + outs.append(out[0] if isinstance(out, tuple) else out) + out = paddle.concat(outs, axis=1) if len(outs) > 1 else outs[0] + + # [batch_size, out_channels] + return self.fc(out) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, patch_size={self.patch_size})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/quantile.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/quantile.py new file mode 100644 index 00000000..e1c30fc6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/quantile.py @@ -0,0 +1,121 @@ +from typing import List, Optional, Union +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.utils import cumsum + + +class QuantileAggregation(Aggregation): + r"""An aggregation operator that returns the feature-wise :math:`q`-th + quantile of a set :math:`\mathcal{X}`. + + Args: + q (float or list): The quantile value(s) :math:`q`. Can be a scalar or + a list of scalars in the range :math:`[0, 1]`. If more than a + quantile is passed, the results are concatenated. + interpolation (str): Interpolation method applied if the quantile point + :math:`q\cdot n` lies between two values + :math:`a \le b`. Can be one of the following: + + * :obj:`"lower"`: Returns the one with lowest value. + * :obj:`"higher"`: Returns the one with highest value. + * :obj:`"midpoint"`: Returns the average of the two values. + * :obj:`"nearest"`: Returns the one whose index is nearest to the + quantile point. + * :obj:`"linear"`: Returns a linear combination of the two + elements, defined as :math:`f(a, b) = a + (b - a)\cdot(q\cdot n - i)`. + """ + interpolations = {'linear', 'lower', 'higher', 'nearest', 'midpoint'} + + def __init__(self, q: Union[float, List[float]], + interpolation: str = 'linear', fill_value: float = 0.0): + super().__init__() + + qs = [q] if not isinstance(q, (list, tuple)) else q + if len(qs) == 0: + raise ValueError("Provide at least one quantile value for `q`.") + if not all(0. <= quantile <= 1. for quantile in qs): + raise ValueError("`q` must be in the range [0, 1].") + if interpolation not in self.interpolations: + raise ValueError(f"Invalid interpolation method " + f"got ('{interpolation}')") + + self._q = q + self.q = paddle.to_tensor(qs).reshape([-1, 1]) + self.interpolation = interpolation + self.fill_value = fill_value + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + dim = x.ndim + dim if dim < 0 else dim + + self.assert_index_present(index) + assert index is not None # Required for TorchScript. + + count = paddle.bincount(index, minlength=dim_size or 0) + ptr = cumsum(count)[:-1] + + if dim_size is not None: + ptr = paddle.clip(ptr, max=x.shape[dim] - 1) + + q_point = self.q * (count - 1) + ptr + q_point = q_point.t().reshape([-1]) + + shape = [1] * x.ndim + shape[dim] = -1 + index = index.reshape(shape).expand_as(x) + + # Sort the values and then sort the indices: + x, x_perm = paddle.sort(x, axis=dim) + index = paddle.gather(index, x_perm, axis=dim) + index, index_perm = paddle.sort(index, axis=dim) + x = paddle.gather(x, index_perm, axis=dim) + + # Compute the quantile interpolations: + if self.interpolation == 'lower': + quantile = paddle.gather(x, paddle.floor(q_point).astype('int64'), axis=dim) + elif self.interpolation == 'higher': + quantile = paddle.gather(x, paddle.ceil(q_point).astype('int64'), axis=dim) + elif self.interpolation == 'nearest': + quantile = paddle.gather(x, paddle.round(q_point).astype('int64'), axis=dim) + else: + l_quant = paddle.gather(x, paddle.floor(q_point).astype('int64'), axis=dim) + r_quant = paddle.gather(x, paddle.ceil(q_point).astype('int64'), axis=dim) + + if self.interpolation == 'linear': + q_frac = (q_point - paddle.floor(q_point)).reshape(shape) + quantile = l_quant + (r_quant - l_quant) * q_frac + else: # 'midpoint' + quantile = 0.5 * l_quant + 0.5 * r_quant + + repeats = self.q.numel() + mask = (count == 0).tile([repeats]).reshape(shape) + out = paddle.where(mask, paddle.to_tensor(self.fill_value), quantile) + + if self.q.numel() > 1: + shape = list(out.shape) + shape = (shape[:dim] + [shape[dim] // self.q.numel(), -1] + + shape[dim + 2:]) + out = out.reshape(shape) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(q={self._q})' + + +class MedianAggregation(QuantileAggregation): + r"""An aggregation operator that returns the feature-wise median of a set. + + Args: + fill_value (float, optional): The default value in the case no entry is + found for a given index (default: :obj:`0.0`). + """ + def __init__(self, fill_value: float = 0.0): + super().__init__(0.5, 'lower', fill_value) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}()" diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/scaler.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/scaler.py new file mode 100644 index 00000000..fbbfb57d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/scaler.py @@ -0,0 +1,104 @@ +from typing import Any, Dict, List, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation, MultiAggregation +from paddle_geometric.nn.resolver import aggregation_resolver as aggr_resolver +from paddle_geometric.utils import degree + + +class DegreeScalerAggregation(Aggregation): + r"""Combines one or more aggregators and transforms its output with one or + more scalers as introduced in the `"Principal Neighbourhood Aggregation for + Graph Nets" `_ paper. + The scalers are normalised by the in-degree of the training set and so must + be provided at time of construction. + See :class:`paddle_geometric.nn.conv.PNAConv` for more information. + + Args: + aggr (str or [str] or Aggregation): The aggregation scheme to use. + scaler (str or list): Set of scaling function identifiers, namely one + or more of :obj:`"identity"`, :obj:`"amplification"`, + :obj:`"attenuation"`, :obj:`"linear"` and :obj:`"inverse_linear"`. + deg (Tensor): Histogram of in-degrees of nodes in the training set, + used by scalers to normalize. + train_norm (bool, optional): Whether normalization parameters + are trainable. (default: :obj:`False`) + aggr_kwargs (Dict[str, Any], optional): Arguments passed to the + respective aggregation function in case it gets automatically + resolved. (default: :obj:`None`) + """ + def __init__( + self, + aggr: Union[str, List[str], Aggregation], + scaler: Union[str, List[str]], + deg: Tensor, + train_norm: bool = False, + aggr_kwargs: Optional[List[Dict[str, Any]]] = None, + ): + super().__init__() + + if isinstance(aggr, (str, Aggregation)): + self.aggr = aggr_resolver(aggr, **(aggr_kwargs or {})) + elif isinstance(aggr, (tuple, list)): + self.aggr = MultiAggregation(aggr, aggr_kwargs) + else: + raise ValueError(f"Only strings, list, tuples and instances of" + f"`paddle_geometric.nn.aggr.Aggregation` are " + f"valid aggregation schemes (got '{type(aggr)}')") + + self.scaler = [scaler] if isinstance(aggr, str) else scaler + + deg = deg.astype('float32') + N = int(deg.sum().item()) + bin_degree = paddle.arange(deg.shape[0], dtype='float32') + + self.init_avg_deg_lin = float((bin_degree * deg).sum().item()) / N + self.init_avg_deg_log = float(((bin_degree + 1).log() * deg).sum().item()) / N + + if train_norm: + self.avg_deg_lin = self.create_parameter( + shape=[1], default_initializer=paddle.nn.initializer.Constant(self.init_avg_deg_lin)) + self.avg_deg_log = self.create_parameter( + shape=[1], default_initializer=paddle.nn.initializer.Constant(self.init_avg_deg_log)) + else: + self.register_buffer('avg_deg_lin', paddle.to_tensor([self.init_avg_deg_lin])) + self.register_buffer('avg_deg_log', paddle.to_tensor([self.init_avg_deg_log])) + + def reset_parameters(self): + self.avg_deg_lin.set_value(paddle.full([1], self.init_avg_deg_lin)) + self.avg_deg_log.set_value(paddle.full([1], self.init_avg_deg_log)) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + # Ensure `index` is provided + self.assert_index_present(index) + + out = self.aggr(x, index, ptr, dim_size, dim) + + assert index is not None + deg = degree(index, num_nodes=dim_size, dtype=out.dtype) + size = [1] * len(out.shape) + size[dim] = -1 + deg = deg.reshape(size) + + outs = [] + for scaler in self.scaler: + if scaler == 'identity': + out_scaler = out + elif scaler == 'amplification': + out_scaler = out * (paddle.log(deg + 1) / self.avg_deg_log) + elif scaler == 'attenuation': + out_scaler = out * (self.avg_deg_log / paddle.log(deg.clip(min=1) + 1)) + elif scaler == 'linear': + out_scaler = out * (deg / self.avg_deg_lin) + elif scaler == 'inverse_linear': + out_scaler = out * (self.avg_deg_lin / deg.clip(min=1)) + else: + raise ValueError(f"Unknown scaler '{scaler}'") + outs.append(out_scaler) + + return paddle.concat(outs, axis=-1) if len(outs) > 1 else outs[0] diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/set2set.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/set2set.py new file mode 100644 index 00000000..d5048ae0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/set2set.py @@ -0,0 +1,72 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.utils import softmax + + +class Set2Set(Aggregation): + r"""The Set2Set aggregation operator based on iterative content-based + attention, as described in the `"Order Matters: Sequence to sequence for + Sets" `_ paper. + + .. math:: + \mathbf{q}_t &= \mathrm{LSTM}(\mathbf{q}^{*}_{t-1}) + + \alpha_{i,t} &= \mathrm{softmax}(\mathbf{x}_i \cdot \mathbf{q}_t) + + \mathbf{r}_t &= \sum_{i=1}^N \alpha_{i,t} \mathbf{x}_i + + \mathbf{q}^{*}_t &= \mathbf{q}_t \, \Vert \, \mathbf{r}_t, + + where :math:`\mathbf{q}^{*}_T` defines the output of the layer with twice + the dimensionality as the input. + + Args: + in_channels (int): Size of each input sample. + processing_steps (int): Number of iterations :math:`T`. + **kwargs (optional): Additional arguments of :class:`paddle.nn.LSTM`. + """ + def __init__(self, in_channels: int, processing_steps: int, **kwargs): + super().__init__() + self.in_channels = in_channels + self.out_channels = 2 * in_channels + self.processing_steps = processing_steps + self.lstm = paddle.nn.LSTM(self.out_channels, in_channels, **kwargs) + self.reset_parameters() + + def reset_parameters(self): + for layer in self.lstm.sublayers(): + if isinstance(layer, paddle.nn.Linear): + paddle.nn.initializer.XavierUniform()(layer.weight) + if layer.bias is not None: + paddle.nn.initializer.Constant(0.0)(layer.bias) + + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + self.assert_index_present(index) + self.assert_two_dimensional_input(x, dim) + + h = ( + paddle.zeros((self.lstm.num_layers, dim_size, x.shape[-1]), dtype=x.dtype), + paddle.zeros((self.lstm.num_layers, dim_size, x.shape[-1]), dtype=x.dtype) + ) + q_star = paddle.zeros([dim_size, self.out_channels], dtype=x.dtype) + + for _ in range(self.processing_steps): + q, h = self.lstm(q_star.unsqueeze(0), h) + q = q.squeeze(0).reshape([dim_size, self.in_channels]) + e = (x * q[index]).sum(axis=-1, keepdim=True) + a = softmax(e, index, ptr, dim_size, dim) + r = self.reduce(a * x, index, ptr, dim_size, dim, reduce='sum') + q_star = paddle.concat([q, r], axis=-1) + + return q_star + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/set_transformer.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/set_transformer.py new file mode 100644 index 00000000..b6693f5c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/set_transformer.py @@ -0,0 +1,114 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.aggr.utils import ( + PoolingByMultiheadAttention, + SetAttentionBlock, +) + + +class SetTransformerAggregation(Aggregation): + r"""Performs "Set Transformer" aggregation in which the elements to + aggregate are processed by multi-head attention blocks, as described in + the `"Graph Neural Networks with Adaptive Readouts" + `_ paper. + + .. note:: + + :class:`SetTransformerAggregation` requires sorted indices :obj:`index` + as input. Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + Args: + channels (int): Size of each input sample. + num_seed_points (int, optional): Number of seed points. + (default: :obj:`1`) + num_encoder_blocks (int, optional): Number of Set Attention Blocks + (SABs) in the encoder. (default: :obj:`1`). + num_decoder_blocks (int, optional): Number of Set Attention Blocks + (SABs) in the decoder. (default: :obj:`1`). + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the seed embeddings + are averaged instead of concatenated. (default: :obj:`True`) + layer_norm (bool, optional): If set to :obj:`True`, will apply layer + normalization. (default: :obj:`False`) + dropout (float, optional): Dropout probability of attention weights. + (default: :obj:`0`) + """ + def __init__( + self, + channels: int, + num_seed_points: int = 1, + num_encoder_blocks: int = 1, + num_decoder_blocks: int = 1, + heads: int = 1, + concat: bool = True, + layer_norm: bool = False, + dropout: float = 0.0, + ): + super().__init__() + + self.channels = channels + self.num_seed_points = num_seed_points + self.heads = heads + self.concat = concat + self.layer_norm = layer_norm + self.dropout = dropout + + self.encoders = paddle.nn.LayerList([ + SetAttentionBlock(channels, heads, layer_norm, dropout) + for _ in range(num_encoder_blocks) + ]) + + self.pma = PoolingByMultiheadAttention(channels, num_seed_points, + heads, layer_norm, dropout) + + self.decoders = paddle.nn.LayerList([ + SetAttentionBlock(channels, heads, layer_norm, dropout) + for _ in range(num_decoder_blocks) + ]) + + def reset_parameters(self): + for encoder in self.encoders: + encoder.reset_parameters() + self.pma.reset_parameters() + for decoder in self.decoders: + decoder.reset_parameters() + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + x, mask = self.to_dense_batch(x, index, ptr, dim_size, dim, + max_num_elements=max_num_elements) + + for encoder in self.encoders: + x = encoder(x, mask) + + x = self.pma(x, mask) + + for decoder in self.decoders: + x = decoder(x) + + x = paddle.nan_to_num(x) + + return x.flatten(1, 2) if self.concat else x.mean(axis=1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.channels}, ' + f'num_seed_points={self.num_seed_points}, ' + f'heads={self.heads}, ' + f'layer_norm={self.layer_norm}, ' + f'dropout={self.dropout})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/sort.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/sort.py new file mode 100644 index 00000000..3360cc0e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/sort.py @@ -0,0 +1,67 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation + + +class SortAggregation(Aggregation): + r"""The pooling operator from the `"An End-to-End Deep Learning + Architecture for Graph Classification" + `_ paper, + where node features are sorted in descending order based on their last + feature channel. The first :math:`k` nodes form the output of the layer. + + .. note:: + + :class:`SortAggregation` requires sorted indices :obj:`index` as input. + Specifically, if you use this aggregation as part of + :class:`~paddle_geometric.nn.conv.MessagePassing`, ensure that + :obj:`edge_index` is sorted by destination nodes, either by manually + sorting edge indices or by calling `Data.sort()`. + + Args: + k (int): The number of nodes to hold for each graph. + """ + def __init__(self, k: int): + super().__init__() + self.k = k + + def forward( + self, + x: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + dim: int = -2, + max_num_elements: Optional[int] = None, + ) -> Tensor: + + fill_value = x.detach().min() - 1 + batch_x, _ = self.to_dense_batch(x, index, ptr, dim_size, dim, + fill_value=fill_value, + max_num_elements=max_num_elements) + B, N, D = batch_x.shape + + _, perm = paddle.topk(batch_x[:, :, -1], N, axis=-1, largest=True) + arange = paddle.arange(B, dtype='int64') * N + perm = perm + arange.unsqueeze(-1) + + batch_x = batch_x.reshape([B * N, D]) + batch_x = paddle.gather(batch_x, perm.flatten(), axis=0) + batch_x = batch_x.reshape([B, N, D]) + + if N >= self.k: + batch_x = batch_x[:, :self.k] + else: + expand_batch_x = paddle.full([B, self.k - N, D], fill_value, dtype=batch_x.dtype) + batch_x = paddle.concat([batch_x, expand_batch_x], axis=1) + + batch_x = paddle.where(batch_x == fill_value, paddle.zeros_like(batch_x), batch_x) + x = batch_x.reshape([B, self.k * D]) + + return x + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(k={self.k})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/utils.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/utils.py new file mode 100644 index 00000000..5531d2a9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/utils.py @@ -0,0 +1,146 @@ +from typing import Optional + +import paddle +from paddle import Tensor, nn + + +class MultiheadAttentionBlock(nn.Layer): + r"""The Multihead Attention Block (MAB) from the `"Set Transformer: A + Framework for Attention-based Permutation-Invariant Neural Networks" + `_ paper. + + Args: + channels (int): Size of each input sample. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + layer_norm (str, optional): If set to :obj:`False`, will not apply layer + normalization. (default: :obj:`True`) + dropout (float, optional): Dropout probability of attention weights. + (default: :obj:`0`) + """ + def __init__(self, channels: int, heads: int = 1, layer_norm: bool = True, + dropout: float = 0.0): + super().__init__() + + self.channels = channels + self.heads = heads + self.dropout = dropout + + self.attn = nn.MultiHeadAttention( + channels, + heads, + dropout=dropout, + ) + self.lin = nn.Linear(channels, channels) + self.layer_norm1 = nn.LayerNorm(channels) if layer_norm else None + self.layer_norm2 = nn.LayerNorm(channels) if layer_norm else None + + def reset_parameters(self): + self.attn._reset_parameters() + self.lin.reset_parameters() + if self.layer_norm1 is not None: + self.layer_norm1.reset_parameters() + if self.layer_norm2 is not None: + self.layer_norm2.reset_parameters() + + def forward(self, x: Tensor, y: Tensor, x_mask: Optional[Tensor] = None, + y_mask: Optional[Tensor] = None) -> Tensor: + + if y_mask is not None: + y_mask = ~y_mask + + out, _ = self.attn(x, y, y, attn_mask=y_mask) + + if x_mask is not None: + out = paddle.where(x_mask.unsqueeze(-1), out, paddle.zeros_like(out)) + + out = out + x + + if self.layer_norm1 is not None: + out = self.layer_norm1(out) + + out = out + self.lin(out).relu() + + if self.layer_norm2 is not None: + out = self.layer_norm2(out) + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.channels}, ' + f'heads={self.heads}, ' + f'layer_norm={self.layer_norm1 is not None}, ' + f'dropout={self.dropout})') + + +class SetAttentionBlock(nn.Layer): + def __init__(self, channels: int, heads: int = 1, layer_norm: bool = True, + dropout: float = 0.0): + super().__init__() + self.mab = MultiheadAttentionBlock(channels, heads, layer_norm, dropout) + + def reset_parameters(self): + self.mab.reset_parameters() + + def forward(self, x: Tensor, mask: Optional[Tensor] = None) -> Tensor: + return self.mab(x, x, mask, mask) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.mab.channels}, ' + f'heads={self.mab.heads}, ' + f'layer_norm={self.mab.layer_norm1 is not None}, ' + f'dropout={self.mab.dropout})') + + +class InducedSetAttentionBlock(nn.Layer): + def __init__(self, channels: int, num_induced_points: int, heads: int = 1, + layer_norm: bool = True, dropout: float = 0.0): + super().__init__() + self.ind = self.create_parameter(shape=[1, num_induced_points, channels], + default_initializer=nn.initializer.XavierUniform()) + self.mab1 = MultiheadAttentionBlock(channels, heads, layer_norm, dropout) + self.mab2 = MultiheadAttentionBlock(channels, heads, layer_norm, dropout) + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.XavierUniform()(self.ind) + self.mab1.reset_parameters() + self.mab2.reset_parameters() + + def forward(self, x: Tensor, mask: Optional[Tensor] = None) -> Tensor: + h = self.mab1(self.ind.tile([x.shape[0], 1, 1]), x, y_mask=mask) + return self.mab2(x, h, x_mask=mask) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.ind.shape[2]}, ' + f'num_induced_points={self.ind.shape[1]}, ' + f'heads={self.mab1.heads}, ' + f'layer_norm={self.mab1.layer_norm1 is not None}, ' + f'dropout={self.mab1.dropout})') + + +class PoolingByMultiheadAttention(nn.Layer): + def __init__(self, channels: int, num_seed_points: int = 1, heads: int = 1, + layer_norm: bool = True, dropout: float = 0.0): + super().__init__() + self.lin = nn.Linear(channels, channels) + self.seed = self.create_parameter(shape=[1, num_seed_points, channels], + default_initializer=nn.initializer.XavierUniform()) + self.mab = MultiheadAttentionBlock(channels, heads, layer_norm, dropout) + self.reset_parameters() + + def reset_parameters(self): + self.lin.reset_parameters() + nn.initializer.XavierUniform()(self.seed) + self.mab.reset_parameters() + + def forward(self, x: Tensor, mask: Optional[Tensor] = None) -> Tensor: + x = self.lin(x).relu() + return self.mab(self.seed.tile([x.shape[0], 1, 1]), x, y_mask=mask) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.seed.shape[2]}, ' + f'num_seed_points={self.seed.shape[1]}, ' + f'heads={self.mab.heads}, ' + f'layer_norm={self.mab.layer_norm1 is not None}, ' + f'dropout={self.mab.dropout})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/aggr/variance_preserving.py b/jointContribution/mattergen/paddle_geometric/nn/aggr/variance_preserving.py new file mode 100644 index 00000000..e44eb180 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/aggr/variance_preserving.py @@ -0,0 +1,34 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.utils import degree +from paddle_geometric.utils._scatter import broadcast + + +class VariancePreservingAggregation(Aggregation): + r"""Performs the Variance Preserving Aggregation (VPA) from the `"GNN-VPA: + A Variance-Preserving Aggregation Strategy for Graph Neural Networks" + `_ paper. + + .. math:: + \mathrm{vpa}(\mathcal{X}) = \frac{1}{\sqrt{|\mathcal{X}|}} + \sum_{\mathbf{x}_i \in \mathcal{X}} \mathbf{x}_i + """ + def forward(self, x: Tensor, index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, dim_size: Optional[int] = None, + dim: int = -2) -> Tensor: + + out = self.reduce(x, index, ptr, dim_size, dim, reduce='sum') + + if ptr is not None: + count = ptr[1:] - ptr[:-1] + else: + count = degree(index, dim_size, dtype=out.dtype) + + count = paddle.sqrt(count).clip(min=1.0) + count = broadcast(count, ref=out, dim=dim) + + return out / count diff --git a/jointContribution/mattergen/paddle_geometric/nn/attention/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/attention/__init__.py new file mode 100644 index 00000000..947d5850 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/attention/__init__.py @@ -0,0 +1,3 @@ +from .performer import PerformerAttention + +__all__ = ['PerformerAttention'] diff --git a/jointContribution/mattergen/paddle_geometric/nn/attention/performer.py b/jointContribution/mattergen/paddle_geometric/nn/attention/performer.py new file mode 100644 index 00000000..244d1d2b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/attention/performer.py @@ -0,0 +1,128 @@ +import math +from typing import Callable, Optional +import paddle +from paddle import Tensor +import paddle.nn.functional as F + +def _orthogonal_matrix(dim: int) -> Tensor: + r"""Get an orthogonal matrix by applying QR decomposition.""" + mat = paddle.randn((dim, dim)) + q, _ = paddle.linalg.qr(mat, mode='reduced') + return q.t() + + +def orthogonal_matrix(num_rows: int, num_cols: int) -> Tensor: + r"""Generate an orthogonal matrix with `num_rows` rows and `num_cols` columns.""" + num_full_blocks = int(num_rows / num_cols) + blocks = [] + for _ in range(num_full_blocks): + q = _orthogonal_matrix(num_cols) + blocks.append(q) + remain_rows = num_rows - num_full_blocks * num_cols + if remain_rows > 0: + q = _orthogonal_matrix(num_cols) + blocks.append(q[:remain_rows]) + mat = paddle.concat(blocks, axis=0) + return mat + + +def linear_attention(q: Tensor, k: Tensor, v: Tensor) -> Tensor: + r"""Efficient attention mechanism from the `"Rethinking Attention with Performers" `_ paper.""" + D_inv = 1.0 / (q @ k.sum(axis=-2).unsqueeze(-1)) + kv = paddle.matmul(k.transpose([0, 1, 3, 2]), v) + qkv = paddle.matmul(q, kv) + out = D_inv.squeeze(-1) * qkv + return out + + +def generalized_kernel( + x: Tensor, + mat: Tensor, + kernel: Callable = F.relu, + epsilon: float = 0.001, +) -> Tensor: + batch_size, num_heads = x.shape[:2] + projection = mat.t().expand([batch_size, num_heads, -1, -1]) + x = paddle.matmul(x, projection) + out = kernel(x) + epsilon + return out + + +class PerformerProjection(paddle.nn.Layer): + r"""The fast attention that uses a projection matrix from the `"Rethinking Attention with Performers" `_ paper. + """ + def __init__(self, num_cols: int, kernel: Callable = F.relu): + super().__init__() + num_rows = int(num_cols * math.log(num_cols)) + self.num_rows = num_rows + self.num_cols = num_cols + projection_matrix = orthogonal_matrix(self.num_rows, self.num_cols) + self.register_buffer('projection_matrix', projection_matrix) + self.kernel = kernel + + def forward(self, q: Tensor, k: Tensor, v: Tensor) -> Tensor: + q = generalized_kernel(q, self.projection_matrix, self.kernel) + k = generalized_kernel(k, self.projection_matrix, self.kernel) + out = linear_attention(q, k, v) + return out + + +class PerformerAttention(paddle.nn.Layer): + r"""The linear scaled attention mechanism from the `"Rethinking Attention with Performers" `_ paper. + """ + def __init__( + self, + channels: int, + heads: int, + head_channels: int = 64, + kernel: Callable = F.relu, + qkv_bias: bool = False, + attn_out_bias: bool = True, + dropout: float = 0.0, + ): + super().__init__() + assert channels % heads == 0 + if head_channels is None: + head_channels = channels // heads + + self.heads = heads + self.head_channels = head_channels + self.kernel = kernel + self.fast_attn = PerformerProjection(head_channels, kernel) + + inner_channels = head_channels * heads + self.q = paddle.nn.Linear(channels, inner_channels, bias_attr=qkv_bias) + self.k = paddle.nn.Linear(channels, inner_channels, bias_attr=qkv_bias) + self.v = paddle.nn.Linear(channels, inner_channels, bias_attr=qkv_bias) + self.attn_out = paddle.nn.Linear(inner_channels, channels, bias_attr=attn_out_bias) + self.dropout = paddle.nn.Dropout(dropout) + + def forward(self, x: Tensor, mask: Optional[Tensor] = None) -> Tensor: + B, N, *_ = x.shape + q, k, v = self.q(x), self.k(x), self.v(x) + q, k, v = [t.reshape([B, N, self.heads, self.head_channels]).transpose([0, 2, 1, 3]) for t in (q, k, v)] + if mask is not None: + mask = mask[:, None, :, None] + v = paddle.where(~mask, paddle.zeros_like(v), v) + out = self.fast_attn(q, k, v) + out = out.transpose([0, 2, 1, 3]).reshape([B, N, -1]) + out = self.attn_out(out) + out = self.dropout(out) + return out + + def redraw_projection_matrix(self): + r"""As described in the paper, periodically redraw examples to improve overall approximation of attention.""" + num_rows = self.fast_attn.num_rows + num_cols = self.fast_attn.num_cols + projection_matrix = orthogonal_matrix(num_rows, num_cols) + self.fast_attn.projection_matrix.set_value(projection_matrix) + + def _reset_parameters(self): + self.q.weight.set_value(paddle.nn.initializer.KaimingUniform()) + self.k.weight.set_value(paddle.nn.initializer.KaimingUniform()) + self.v.weight.set_value(paddle.nn.initializer.KaimingUniform()) + self.attn_out.weight.set_value(paddle.nn.initializer.KaimingUniform()) + self.redraw_projection_matrix() + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(heads={self.heads}, head_channels={self.head_channels}, kernel={self.kernel})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/conv/__init__.py new file mode 100644 index 00000000..852d197e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/__init__.py @@ -0,0 +1,139 @@ +from .message_passing import MessagePassing +from .simple_conv import SimpleConv +from .gcn_conv import GCNConv +from .cheb_conv import ChebConv +from .sage_conv import SAGEConv +from .cugraph.sage_conv import CuGraphSAGEConv +from .graph_conv import GraphConv +from .gravnet_conv import GravNetConv +from .gated_graph_conv import GatedGraphConv +from .res_gated_graph_conv import ResGatedGraphConv +from .gat_conv import GATConv +from .cugraph.gat_conv import CuGraphGATConv +from .fused_gat_conv import FusedGATConv +from .gatv2_conv import GATv2Conv +from .transformer_conv import TransformerConv +from .agnn_conv import AGNNConv +from .tag_conv import TAGConv +from .gin_conv import GINConv, GINEConv +from .arma_conv import ARMAConv +from .sg_conv import SGConv +from .appnp import APPNP +from .mf_conv import MFConv +from .rgcn_conv import RGCNConv, FastRGCNConv +from .cugraph.rgcn_conv import CuGraphRGCNConv +from .rgat_conv import RGATConv +from .signed_conv import SignedConv +from .dna_conv import DNAConv +from .point_conv import PointNetConv +from .gmm_conv import GMMConv +from .spline_conv import SplineConv +from .nn_conv import NNConv +from .cg_conv import CGConv +from .edge_conv import EdgeConv, DynamicEdgeConv +from .x_conv import XConv +from .ppf_conv import PPFConv +from .feast_conv import FeaStConv +from .point_transformer_conv import PointTransformerConv +from .hypergraph_conv import HypergraphConv +from .le_conv import LEConv +from .pna_conv import PNAConv +from .cluster_gcn_conv import ClusterGCNConv +from .gen_conv import GENConv +from .gcn2_conv import GCN2Conv +from .pan_conv import PANConv +from .wl_conv import WLConv +from .wl_conv_continuous import WLConvContinuous +from .film_conv import FiLMConv +from .supergat_conv import SuperGATConv +from .fa_conv import FAConv +from .eg_conv import EGConv +from .pdn_conv import PDNConv +from .general_conv import GeneralConv +from .hgt_conv import HGTConv +from .heat_conv import HEATConv +from .hetero_conv import HeteroConv +from .han_conv import HANConv +from .lg_conv import LGConv +from .ssg_conv import SSGConv +from .point_gnn_conv import PointGNNConv +from .gps_conv import GPSConv +from .antisymmetric_conv import AntiSymmetricConv +from .dir_gnn_conv import DirGNNConv +from .mixhop_conv import MixHopConv + +import paddle_geometric.nn.conv.utils # noqa + +__all__ = [ + 'MessagePassing', + 'SimpleConv', + 'GCNConv', + 'ChebConv', + 'SAGEConv', + 'CuGraphSAGEConv', + 'GraphConv', + 'GravNetConv', + 'GatedGraphConv', + 'ResGatedGraphConv', + 'GATConv', + 'CuGraphGATConv', + 'FusedGATConv', + 'GATv2Conv', + 'TransformerConv', + 'AGNNConv', + 'TAGConv', + 'GINConv', + 'GINEConv', + 'ARMAConv', + 'SGConv', + 'SSGConv', + 'APPNP', + 'MFConv', + 'RGCNConv', + 'FastRGCNConv', + 'CuGraphRGCNConv', + 'RGATConv', + 'SignedConv', + 'DNAConv', + 'PointNetConv', + 'GMMConv', + 'SplineConv', + 'NNConv', + 'CGConv', + 'EdgeConv', + 'DynamicEdgeConv', + 'XConv', + 'PPFConv', + 'FeaStConv', + 'PointTransformerConv', + 'HypergraphConv', + 'LEConv', + 'PNAConv', + 'ClusterGCNConv', + 'GENConv', + 'GCN2Conv', + 'PANConv', + 'WLConv', + 'WLConvContinuous', + 'FiLMConv', + 'SuperGATConv', + 'FAConv', + 'EGConv', + 'PDNConv', + 'GeneralConv', + 'HGTConv', + 'HEATConv', + 'HeteroConv', + 'HANConv', + 'LGConv', + 'PointGNNConv', + 'GPSConv', + 'AntiSymmetricConv', + 'DirGNNConv', + 'MixHopConv', +] + +classes = __all__ + +ECConv = NNConv +PointConv = PointNetConv diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/agnn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/agnn_conv.py new file mode 100644 index 00000000..90d920f1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/agnn_conv.py @@ -0,0 +1,81 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import add_self_loops, remove_self_loops, softmax + + +class AGNNConv(MessagePassing): + r"""The graph attentional propagation layer from the + `"Attention-based Graph Neural Network for Semi-Supervised Learning" + `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \mathbf{P} \mathbf{X}, + + where the propagation matrix :math:`\mathbf{P}` is computed as + + .. math:: + P_{i,j} = \frac{\exp( \beta \cdot \cos(\mathbf{x}_i, \mathbf{x}_j))} + {\sum_{k \in \mathcal{N}(i)\cup \{ i \}} \exp( \beta \cdot + \cos(\mathbf{x}_i, \mathbf{x}_k))} + + with trainable parameter :math:`\beta`. + + Args: + requires_grad (bool, optional): If set to :obj:`False`, :math:`\beta` + will not be trainable. (default: :obj:`True`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F)`, + edge indices :math:`(2, |\mathcal{E}|)` + - **output:** node features :math:`(|\mathcal{V}|, F)` + """ + def __init__(self, requires_grad: bool = True, add_self_loops: bool = True, + **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.requires_grad = requires_grad + self.add_self_loops = add_self_loops + + if requires_grad: + self.beta = self.create_parameter(shape=[1]) + else: + self.register_buffer('beta', paddle.ones([1])) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + if self.requires_grad: + self.beta.set_value(paddle.ones([1])) + + def forward(self, x: Tensor, edge_index: Adj) -> Tensor: + if self.add_self_loops: + if isinstance(edge_index, Tensor): + edge_index, _ = remove_self_loops(edge_index) + edge_index, _ = add_self_loops(edge_index, num_nodes=x.shape[self.node_dim]) + elif isinstance(edge_index, SparseTensor): + edge_index = edge_index.set_diag() + + x_norm = F.normalize(x, p=2., axis=-1) + + # propagate_type: (x: Tensor, x_norm: Tensor) + return self.propagate(edge_index, x=x, x_norm=x_norm) + + def message(self, x_j: Tensor, x_norm_i: Tensor, x_norm_j: Tensor, + index: Tensor, ptr: OptTensor, + size_i: Optional[int]) -> Tensor: + alpha = self.beta * (x_norm_i * x_norm_j).sum(axis=-1) + alpha = softmax(alpha, index, ptr, size_i) + return x_j * alpha.unsqueeze(-1) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/antisymmetric_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/antisymmetric_conv.py new file mode 100644 index 00000000..826a9a93 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/antisymmetric_conv.py @@ -0,0 +1,102 @@ +import math +from typing import Any, Callable, Dict, Optional, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn.conv import GCNConv, MessagePassing +from paddle_geometric.nn.resolver import activation_resolver +from paddle_geometric.nn.inits import zeros +from paddle_geometric.typing import Adj + + +class AntiSymmetricConv(Layer): + r"""The anti-symmetric graph convolutional operator from the + `"Anti-Symmetric DGN: a stable architecture for Deep Graph Networks" + `_ paper. + + Args: + in_channels (int): Size of each input sample. + phi (MessagePassing, optional): The message passing module + :math:`\Phi`. If set to :obj:`None`, will use a + :class:`~paddle_geometric.nn.conv.GCNConv` layer as default. + num_iters (int, optional): The number of times the anti-symmetric deep + graph network operator is called. (default: :obj:`1`) + epsilon (float, optional): The discretization step size + :math:`\epsilon`. (default: :obj:`0.1`) + gamma (float, optional): The strength of the diffusion :math:`\gamma`. + act (str, optional): The non-linear activation function :math:`\sigma`, + *e.g.*, :obj:`"tanh"` or :obj:`"relu"`. (default: :class:`"tanh"`) + act_kwargs (Dict[str, Any], optional): Arguments passed to the + respective activation function defined by :obj:`act`. + (default: :obj:`None`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + """ + def __init__( + self, + in_channels: int, + phi: Optional[MessagePassing] = None, + num_iters: int = 1, + epsilon: float = 0.1, + gamma: float = 0.1, + act: Union[str, Callable, None] = 'tanh', + act_kwargs: Optional[Dict[str, Any]] = None, + bias: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.num_iters = num_iters + self.gamma = gamma + self.epsilon = epsilon + self.act = activation_resolver(act, **(act_kwargs or {})) + + if phi is None: + phi = GCNConv(in_channels, in_channels, bias_attr=False) + + self.W = self.create_parameter(shape=[in_channels, in_channels]) + self.eye = self.create_parameter( + shape=[in_channels, in_channels], + default_initializer=paddle.nn.initializer.Assign(paddle.eye(in_channels)), + stop_gradient=True + ) + self.phi = phi + + if bias: + self.bias = self.create_parameter(shape=[in_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.KaimingUniform()(self.W) + self.phi.reset_parameters() + if self.bias is not None: + zeros(self.bias) + + def forward(self, x: Tensor, edge_index: Adj, *args, **kwargs) -> Tensor: + antisymmetric_W = self.W - self.W.transpose([1, 0]) - self.gamma * self.eye + + for _ in range(self.num_iters): + h = self.phi(x, edge_index, *args, **kwargs) + h = paddle.matmul(x, antisymmetric_W.transpose([1, 0])) + h + + if self.bias is not None: + h += self.bias + + if self.act is not None: + h = self.act(h) + + x = x + self.epsilon * h + + return x + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'{self.in_channels}, ' + f'phi={self.phi}, ' + f'num_iters={self.num_iters}, ' + f'epsilon={self.epsilon}, ' + f'gamma={self.gamma})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/appnp.py b/jointContribution/mattergen/paddle_geometric/nn/conv/appnp.py new file mode 100644 index 00000000..0f29a1f6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/appnp.py @@ -0,0 +1,103 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, SparseTensor +from paddle_geometric.utils import is_paddle_sparse_tensor, spmm, to_edge_index +from paddle_geometric.utils.sparse import set_sparse_value + + +class APPNP(MessagePassing): + r"""The approximate personalized propagation of neural predictions layer + from the `"Predict then Propagate: Graph Neural Networks meet Personalized + PageRank" `_ paper. + """ + + _cached_edge_index: Optional[OptPairTensor] + _cached_adj_t: Optional[SparseTensor] + + def __init__(self, K: int, alpha: float, dropout: float = 0., + cached: bool = False, add_self_loops: bool = True, + normalize: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + self.K = K + self.alpha = alpha + self.dropout = dropout + self.cached = cached + self.add_self_loops = add_self_loops + self.normalize = normalize + + self._cached_edge_index = None + self._cached_adj_t = None + + def reset_parameters(self): + super().reset_parameters() + self._cached_edge_index = None + self._cached_adj_t = None + + def forward( + self, + x: Tensor, + edge_index: Adj, + edge_weight: OptTensor = None, + ) -> Tensor: + + if self.normalize: + if isinstance(edge_index, Tensor): + cache = self._cached_edge_index + if cache is None: + edge_index, edge_weight = gcn_norm( + edge_index, edge_weight, x.shape[self.node_dim], False, + self.add_self_loops, self.flow, dtype=x.dtype) + if self.cached: + self._cached_edge_index = (edge_index, edge_weight) + else: + edge_index, edge_weight = cache[0], cache[1] + + elif isinstance(edge_index, SparseTensor): + cache = self._cached_adj_t + if cache is None: + edge_index = gcn_norm( + edge_index, edge_weight, x.shape[self.node_dim], False, + self.add_self_loops, self.flow, dtype=x.dtype) + if self.cached: + self._cached_adj_t = edge_index + else: + edge_index = cache + + h = x + for k in range(self.K): + if self.dropout > 0 and self.training: + if isinstance(edge_index, Tensor): + if is_paddle_sparse_tensor(edge_index): + _, edge_weight = to_edge_index(edge_index) + edge_weight = F.dropout(edge_weight, p=self.dropout) + edge_index = set_sparse_value(edge_index, edge_weight) + else: + assert edge_weight is not None + edge_weight = F.dropout(edge_weight, p=self.dropout) + else: + value = edge_index.storage.value() + assert value is not None + value = F.dropout(value, p=self.dropout) + edge_index = edge_index.set_value(value, layout='coo') + + # propagate_type: (x: Tensor, edge_weight: OptTensor) + x = self.propagate(edge_index, x=x, edge_weight=edge_weight) + x = x * (1 - self.alpha) + x = x + self.alpha * h + + return x + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(K={self.K}, alpha={self.alpha})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/arma_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/arma_conv.py new file mode 100644 index 00000000..cc18e90a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/arma_conv.py @@ -0,0 +1,102 @@ +from typing import Callable, Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, ReLU +from paddle.nn.initializer import XavierUniform + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.utils import spmm +from paddle_geometric.typing import Adj, OptTensor, SparseTensor + + +class ARMAConv(MessagePassing): + r"""The ARMA graph convolutional operator from the "Graph Neural Networks + with Convolutional ARMA Filters" paper. + """ + + def __init__(self, in_channels: int, out_channels: int, + num_stacks: int = 1, num_layers: int = 1, + shared_weights: bool = False, + act: Optional[Callable] = ReLU(), dropout: float = 0., + bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_stacks = num_stacks + self.num_layers = num_layers + self.act = act + self.shared_weights = shared_weights + self.dropout = dropout + + K, T, F_in, F_out = num_stacks, num_layers, in_channels, out_channels + T = 1 if self.shared_weights else T + + self.weight = self.create_parameter( + [max(1, T - 1), K, F_out, F_out], default_initializer=XavierUniform()) + + if in_channels > 0: + self.init_weight = self.create_parameter( + [K, F_in, F_out], default_initializer=XavierUniform()) + self.root_weight = self.create_parameter( + [T, K, F_in, F_out], default_initializer=XavierUniform()) + else: + raise ValueError("in_channels must be greater than 0.") + + if bias: + self.bias = self.create_parameter([T, K, 1, F_out], is_bias=True) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + XavierUniform()(self.weight) + XavierUniform()(self.init_weight) + XavierUniform()(self.root_weight) + if self.bias is not None: + paddle.zeros_(self.bias) + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: Optional[Tensor] = None) -> Tensor: + + edge_index, edge_weight = gcn_norm( + edge_index, edge_weight, x.shape[self.node_dim], + add_self_loops=False, dtype=x.dtype) + + x = x.unsqueeze(-3) + out = x + for t in range(self.num_layers): + if t == 0: + out = paddle.matmul(out, self.init_weight) + else: + out = paddle.matmul(out, self.weight[0 if self.shared_weights else t - 1]) + + out = self.propagate(edge_index, x=out, edge_weight=edge_weight) + + root = F.dropout(x, p=self.dropout, training=self.training) + root = paddle.matmul(root, self.root_weight[0 if self.shared_weights else t]) + out = out + root + + if self.bias is not None: + out = out + self.bias[0 if self.shared_weights else t] + + if self.act is not None: + out = self.act(out) + + return out.mean(axis=-3) + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_stacks={self.num_stacks}, ' + f'num_layers={self.num_layers})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cg_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cg_conv.py new file mode 100644 index 00000000..f893a1cd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cg_conv.py @@ -0,0 +1,70 @@ +from typing import Tuple, Union, Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import BatchNorm1D, Linear + +from paddle_geometric.nn.conv import MessagePassing + + +class CGConv(MessagePassing): + r"""The crystal graph convolutional operator from the + "Crystal Graph Convolutional Neural Networks for an + Accurate and Interpretable Prediction of Material Properties" paper. + """ + + def __init__(self, channels: Union[int, Tuple[int, int]], dim: int = 0, + aggr: str = 'add', batch_norm: bool = False, + bias: bool = True, **kwargs): + super().__init__(aggr=aggr, **kwargs) + self.channels = channels + self.dim = dim + self.batch_norm = batch_norm + + if isinstance(channels, int): + channels = (channels, channels) + + self.lin_f = Linear(sum(channels) + dim, channels[1], bias_attr=bias) + self.lin_s = Linear(sum(channels) + dim, channels[1], bias_attr=bias) + + if batch_norm: + self.bn = BatchNorm1D(channels[1]) + else: + self.bn = None + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin_f.reset_parameters() + self.lin_s.reset_parameters() + if self.bn is not None: + self.bn.reset_parameters() + + def forward(self, x: Union[Tensor, Tuple[Tensor, Tensor]], edge_index: Tensor, + edge_attr: Optional[Tensor] = None) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + # propagate_type: (x: Tuple[Tensor, Tensor], edge_attr: Optional[Tensor]) + out = self.propagate(edge_index, x=x, edge_attr=edge_attr) + + if self.bn is not None: + out = self.bn(out) + + out = out + x[1] + + return out + + def message(self, x_i, x_j, edge_attr: Optional[Tensor]) -> Tensor: + if edge_attr is None: + z = paddle.concat([x_i, x_j], axis=-1) + else: + z = paddle.concat([x_i, x_j, edge_attr], axis=-1) + + return F.sigmoid(self.lin_f(z)) * F.softplus(self.lin_s(z)) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.channels}, dim={self.dim})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cheb_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cheb_conv.py new file mode 100644 index 00000000..d7c3e94c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cheb_conv.py @@ -0,0 +1,125 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle.nn import ParameterList, Linear +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.utils import get_laplacian + + +class ChebConv(MessagePassing): + r"""The chebyshev spectral graph convolutional operator.""" + + def __init__( + self, + in_channels: int, + out_channels: int, + K: int, + normalization: Optional[str] = 'sym', + bias: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + assert K > 0 + assert normalization in [None, 'sym', 'rw'], 'Invalid normalization' + + self.in_channels = in_channels + self.out_channels = out_channels + self.normalization = normalization + self.lins = ParameterList([ + Linear(in_channels, out_channels, bias_attr=False) + for _ in range(K) + ]) + + if bias: + self.bias = self.create_parameter(shape=[out_channels], is_bias=True) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + for lin in self.lins: + lin.reset_parameters() + if self.bias is not None: + paddle.nn.initializer.Constant(0.0)(self.bias) + + def __norm__( + self, + edge_index: Tensor, + num_nodes: Optional[int], + edge_weight: Optional[Tensor], + normalization: Optional[str], + lambda_max: Optional[Tensor] = None, + dtype: Optional[str] = None, + batch: Optional[Tensor] = None, + ) -> Tuple[Tensor, Tensor]: + edge_index, edge_weight = get_laplacian(edge_index, edge_weight, + normalization, dtype, + num_nodes) + assert edge_weight is not None + + if lambda_max is None: + lambda_max = 2.0 * paddle.max(edge_weight) + elif not isinstance(lambda_max, Tensor): + lambda_max = paddle.to_tensor(lambda_max, dtype=dtype) + + if batch is not None and lambda_max.shape[0] > 1: + lambda_max = lambda_max[batch[edge_index[0]]] + + edge_weight = (2.0 * edge_weight) / lambda_max + edge_weight = paddle.where(edge_weight == float('inf'), paddle.zeros_like(edge_weight), edge_weight) + + loop_mask = edge_index[0] == edge_index[1] + edge_weight = paddle.where(loop_mask, edge_weight - 1, edge_weight) + + return edge_index, edge_weight + + def forward( + self, + x: Tensor, + edge_index: Tensor, + edge_weight: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + lambda_max: Optional[Tensor] = None, + ) -> Tensor: + + edge_index, norm = self.__norm__( + edge_index, + x.shape[0], + edge_weight, + self.normalization, + lambda_max, + dtype=x.dtype, + batch=batch, + ) + + Tx_0 = x + Tx_1 = x # Dummy. + out = self.lins[0](Tx_0) + + if len(self.lins) > 1: + Tx_1 = self.propagate(edge_index, x=x, norm=norm) + out = out + self.lins[1](Tx_1) + + for lin in self.lins[2:]: + Tx_2 = self.propagate(edge_index, x=Tx_1, norm=norm) + Tx_2 = 2. * Tx_2 - Tx_0 + out = out + lin(Tx_2) + Tx_0, Tx_1 = Tx_1, Tx_2 + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, norm: Tensor) -> Tensor: + return norm.unsqueeze(-1) * x_j + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, K={len(self.lins)}, ' + f'normalization={self.normalization})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cluster_gcn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cluster_gcn_conv.py new file mode 100644 index 00000000..2b1f657a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cluster_gcn_conv.py @@ -0,0 +1,92 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import ( + add_self_loops, + degree, + remove_self_loops, +) + +class ClusterGCNConv(MessagePassing): + r"""The ClusterGCN graph convolutional operator from the + `"Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph + Convolutional Networks" `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \left( \mathbf{\hat{A}} + \lambda \cdot + \textrm{diag}(\mathbf{\hat{A}}) \right) \mathbf{X} \mathbf{W}_1 + + \mathbf{X} \mathbf{W}_2 + + where :math:`\mathbf{\hat{A}} = {(\mathbf{D} + \mathbf{I})}^{-1}(\mathbf{A} + + \mathbf{I})`. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + diag_lambda (float, optional): Diagonal enhancement value + :math:`\lambda`. (default: :obj:`0.`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)` + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + def __init__(self, in_channels: int, out_channels: int, + diag_lambda: float = 0., add_self_loops: bool = True, + bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.diag_lambda = diag_lambda + self.add_self_loops = add_self_loops + + self.lin_out = Linear(in_channels, out_channels, bias_attr=bias) + self.lin_root = Linear(in_channels, out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + self.lin_out.reset_parameters() + self.lin_root.reset_parameters() + + def forward(self, x: Tensor, edge_index: Adj) -> Tensor: + num_nodes = x.shape[0] + edge_weight: OptTensor = None + + if isinstance(edge_index, Tensor): + if self.add_self_loops: + edge_index, _ = remove_self_loops(edge_index) + edge_index, _ = add_self_loops(edge_index, num_nodes=num_nodes) + + row, col = edge_index[0], edge_index[1] + deg_inv = 1. / degree(col, num_nodes=num_nodes).clip(min=1.) + + edge_weight = deg_inv[col] + diag_mask = row == col + edge_weight = paddle.where(diag_mask, edge_weight + self.diag_lambda * deg_inv, edge_weight) + + # propagate_type: (x: Tensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, edge_weight=edge_weight) + out = self.lin_out(out) + self.lin_root(x) + + return out + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.unsqueeze(-1) * x_j + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, diag_lambda={self.diag_lambda})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/collect.jinja b/jointContribution/mattergen/paddle_geometric/nn/conv/collect.jinja new file mode 100644 index 00000000..48bf5b1e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/collect.jinja @@ -0,0 +1,163 @@ +from typing import List, NamedTuple, Optional, Union + +import torch +from torch import Tensor + +from paddle_geometric import EdgeIndex +from paddle_geometric.index import ptr2index +from paddle_geometric.utils import is_torch_sparse_tensor +from paddle_geometric.typing import SparseTensor + + +class CollectArgs(NamedTuple): +{%- if collect_param_dict|length > 0 %} +{%- for param in collect_param_dict.values() %} + {{param.name}}: {{param.type_repr}} +{%- endfor %} +{%- else %} + pass +{%- endif %} + + +def {{collect_name}}( + self, + edge_index: Union[Tensor, SparseTensor], +{%- for param in signature.param_dict.values() %} + {{param.name}}: {{param.type_repr}}, +{%- endfor %} + size: List[Optional[int]], +) -> CollectArgs: + + i, j = (1, 0) if self.flow == 'source_to_target' else (0, 1) + + # Collect special arguments: + if isinstance(edge_index, Tensor): + if is_torch_sparse_tensor(edge_index): +{%- if 'edge_index' in collect_param_dict %} + raise ValueError("Cannot collect 'edge_indices' for sparse matrices") +{%- endif %} + adj_t = edge_index + if adj_t.layout == torch.sparse_coo: + edge_index_i = adj_t.indices()[0] + edge_index_j = adj_t.indices()[1] + ptr = None + elif adj_t.layout == torch.sparse_csr: + ptr = adj_t.crow_indices() + edge_index_j = adj_t.col_indices() + edge_index_i = ptr2index(ptr, output_size=edge_index_j.numel()) + else: + raise ValueError(f"Received invalid layout '{adj_t.layout}'") + +{%- if 'edge_weight' in collect_param_dict %} + if edge_weight is None: + edge_weight = adj_t.values() +{%- elif 'edge_attr' in collect_param_dict %} + if edge_attr is None: + _value = adj_t.values() + edge_attr = None if _value.dim() == 1 else _value +{%- elif 'edge_type' in collect_param_dict %} + if edge_type is None: + edge_type = adj_t.values() +{%- endif %} + + else: +{%- if 'adj_t' in collect_param_dict %} + raise ValueError("Cannot collect 'adj_t' for edge indices") +{%- endif %} + edge_index_i = edge_index[i] + edge_index_j = edge_index[j] + + ptr = None + if not torch.jit.is_scripting() and isinstance(edge_index, EdgeIndex): + if i == 0 and edge_index.is_sorted_by_row: + (ptr, _), _ = edge_index.get_csr() + elif i == 1 and edge_index.is_sorted_by_col: + (ptr, _), _ = edge_index.get_csc() + + elif isinstance(edge_index, SparseTensor): +{%- if 'edge_index' in collect_param_dict %} + raise ValueError("Cannot collect 'edge_indices' for sparse matrices") +{%- endif %} + adj_t = edge_index + edge_index_i, edge_index_j, _value = adj_t.coo() + ptr, _, _ = adj_t.csr() + +{%- if 'edge_weight' in collect_param_dict %} + if edge_weight is None: + edge_weight = _value +{%- elif 'edge_attr' in collect_param_dict %} + if edge_attr is None: + edge_attr = None if _value is None or _value.dim() == 1 else _value +{%- elif 'edge_type' in collect_param_dict %} + if edge_type is None: + edge_type = _value +{%- endif %} + + else: + raise NotImplementedError + +{%- if 'edge_weight' in collect_param_dict and + collect_param_dict['edge_weight'].type_repr.endswith('Tensor') %} + if torch.jit.is_scripting(): + assert edge_weight is not None +{%- elif 'edge_attr' in collect_param_dict and + collect_param_dict['edge_attr'].type_repr.endswith('Tensor') %} + if torch.jit.is_scripting(): + assert edge_attr is not None +{%- elif 'edge_type' in collect_param_dict and + collect_param_dict['edge_type'].type_repr.endswith('Tensor') %} + if torch.jit.is_scripting(): + assert edge_type is not None +{%- endif %} + + # Collect user-defined arguments: +{%- for name in collect_param_dict %} +{%- if (name.endswith('_i') or name.endswith('_j')) and + name not in ['edge_index_i', 'edge_index_j', 'size_i', 'size_j'] %} + # ({{loop.index}}) - Collect `{{name}}`: + if isinstance({{name[:-2]}}, (tuple, list)): + assert len({{name[:-2]}}) == 2 + _{{name[:-2]}}_0, _{{name[:-2]}}_1 = {{name[:-2]}}[0], {{name[:-2]}}[1] + if isinstance(_{{name[:-2]}}_0, Tensor): + self._set_size(size, 0, _{{name[:-2]}}_0) +{%- if name.endswith('_j') %} + {{name}} = self._index_select(_{{name[:-2]}}_0, edge_index_{{name[-1]}}) + else: + {{name}} = None +{%- endif %} + if isinstance(_{{name[:-2]}}_1, Tensor): + self._set_size(size, 1, _{{name[:-2]}}_1) +{%- if name.endswith('_i') %} + {{name}} = self._index_select(_{{name[:-2]}}_1, edge_index_{{name[-1]}}) + else: + {{name}} = None +{%- endif %} + elif isinstance({{name[:-2]}}, Tensor): + self._set_size(size, {{name[-1]}}, {{name[:-2]}}) + {{name}} = self._index_select({{name[:-2]}}, edge_index_{{name[-1]}}) + else: + {{name}} = None +{%- endif %} +{%- endfor %} + + # Collect default arguments: +{%- for name, param in collect_param_dict.items() %} +{%- if name not in signature.param_dict and + not name.endswith('_i') and + not name.endswith('_j') and + name not in ['edge_index', 'adj_t', 'size', 'ptr', 'index', 'dim_size'] and + '_empty' not in param.default.__name__ %} + {{name}} = {{param.default}} +{%- endif %} +{%- endfor %} + + index = edge_index_i + size_i = size[i] if size[i] is not None else size[j] + size_j = size[j] if size[j] is not None else size[i] + dim_size = size_i + + return CollectArgs( +{%- for name in collect_param_dict %} + {{name}}, +{%- endfor %} + ) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/__init__.py new file mode 100644 index 00000000..247ad2d8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/__init__.py @@ -0,0 +1,11 @@ +from .base import CuGraphModule +from .sage_conv import CuGraphSAGEConv +from .gat_conv import CuGraphGATConv +from .rgcn_conv import CuGraphRGCNConv + +__all__ = [ + 'CuGraphModule', + 'CuGraphSAGEConv', + 'CuGraphGATConv', + 'CuGraphRGCNConv', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/base.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/base.py new file mode 100644 index 00000000..4ee1d2ef --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/base.py @@ -0,0 +1,161 @@ +from typing import Any, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric import EdgeIndex + +try: # pragma: no cover + LEGACY_MODE = False + from pylibcugraphops.paddle import CSC, HeteroCSC + HAS_PYLIBCUGRAPHOPS = True +except ImportError: + HAS_PYLIBCUGRAPHOPS = False + try: # pragma: no cover + from pylibcugraphops import ( + make_fg_csr, + make_fg_csr_hg, + make_mfg_csr, + make_mfg_csr_hg, + ) + LEGACY_MODE = True + except ImportError: + pass + + +class CuGraphModule(paddle.nn.Layer): # pragma: no cover + r"""An abstract base class for implementing :obj:`cugraph`-based message + passing layers. + """ + def __init__(self): + super().__init__() + + if not HAS_PYLIBCUGRAPHOPS and not LEGACY_MODE: + raise ModuleNotFoundError(f"'{self.__class__.__name__}' requires " + f"'pylibcugraphops>=23.02'") + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + + def get_cugraph( + self, + edge_index: EdgeIndex, + max_num_neighbors: Optional[int] = None, + ) -> Any: + r"""Constructs a :obj:`cugraph` graph object from CSC representation. + Supports both bipartite and non-bipartite graphs. + + Args: + edge_index (EdgeIndex): The edge indices. + max_num_neighbors (int, optional): The maximum number of neighbors + of a target node. It is only effective when operating in a + bipartite graph. When not given, will be computed on-the-fly, + leading to slightly worse performance. (default: :obj:`None`) + """ + if not isinstance(edge_index, EdgeIndex): + raise ValueError(f"'edge_index' needs to be of type 'EdgeIndex' " + f"(got {type(edge_index)})") + + edge_index = edge_index.sort_by('col')[0] + num_src_nodes = edge_index.get_sparse_size(0) + (colptr, row), _ = edge_index.get_csc() + + if not row.is_cuda(): + raise RuntimeError(f"'{self.__class__.__name__}' requires GPU-" + f"based processing (got CPU tensor)") + + if num_src_nodes != colptr.shape[0] - 1: # Bipartite graph: + if max_num_neighbors is None: + max_num_neighbors = int((colptr[1:] - colptr[:-1]).max()) + + if LEGACY_MODE: + dst_nodes = paddle.arange(colptr.shape[0] - 1, device=row.device) + return make_mfg_csr(dst_nodes, colptr, row, max_num_neighbors, + num_src_nodes) + + return CSC(colptr, row, num_src_nodes, + dst_max_in_degree=max_num_neighbors) + + if LEGACY_MODE: + return make_fg_csr(colptr, row) + + return CSC(colptr, row, num_src_nodes=num_src_nodes) + + def get_typed_cugraph( + self, + edge_index: EdgeIndex, + edge_type: Tensor, + num_edge_types: Optional[int] = None, + max_num_neighbors: Optional[int] = None, + ) -> Any: + r"""Constructs a typed :obj:`cugraph` graph object from a CSC + representation where each edge corresponds to a given edge type. + Supports both bipartite and non-bipartite graphs. + + Args: + edge_index (EdgeIndex): The edge indices. + edge_type (paddle.Tensor): The edge type. + num_edge_types (int, optional): The maximum number of edge types. + When not given, will be computed on-the-fly, leading to + slightly worse performance. (default: :obj:`None`) + max_num_neighbors (int, optional): The maximum number of neighbors + of a target node. It is only effective when operating in a + bipartite graph. When not given, will be computed on-the-fly, + leading to slightly worse performance. (default: :obj:`None`) + """ + if num_edge_types is None: + num_edge_types = int(edge_type.max()) + 1 + + if not isinstance(edge_index, EdgeIndex): + raise ValueError(f"'edge_index' needs to be of type 'EdgeIndex' " + f"(got {type(edge_index)})") + + edge_index, perm = edge_index.sort_by('col') + edge_type = edge_type[perm] + num_src_nodes = edge_index.get_sparse_size(0) + (colptr, row), _ = edge_index.get_csc() + + edge_type = edge_type.astype('int32') + + if num_src_nodes != colptr.shape[0] - 1: # Bipartite graph: + if max_num_neighbors is None: + max_num_neighbors = int((colptr[1:] - colptr[:-1]).max()) + + if LEGACY_MODE: + dst_nodes = paddle.arange(colptr.shape[0] - 1, device=row.device) + return make_mfg_csr_hg(dst_nodes, colptr, row, + max_num_neighbors, num_src_nodes, + n_node_types=0, + n_edge_types=num_edge_types, + out_node_types=None, in_node_types=None, + edge_types=edge_type) + + return HeteroCSC(colptr, row, edge_type, num_src_nodes, + num_edge_types, + dst_max_in_degree=max_num_neighbors) + + if LEGACY_MODE: + return make_fg_csr_hg(colptr, row, n_node_types=0, + n_edge_types=num_edge_types, node_types=None, + edge_types=edge_type) + + return HeteroCSC(colptr, row, edge_type, num_src_nodes, num_edge_types) + + def forward( + self, + x: Tensor, + edge_index: EdgeIndex, + max_num_neighbors: Optional[int] = None, + ) -> Tensor: + r"""Runs the forward pass of the module. + + Args: + x (paddle.Tensor): The node features. + edge_index (EdgeIndex): The edge indices. + max_num_neighbors (int, optional): The maximum number of neighbors + of a target node. It is only effective when operating in a + bipartite graph. When not given, the value will be computed + on-the-fly, leading to slightly worse performance. + (default: :obj:`None`) + """ + raise NotImplementedError diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/gat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/gat_conv.py new file mode 100644 index 00000000..f0aafb7b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/gat_conv.py @@ -0,0 +1,102 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric import EdgeIndex +from paddle_geometric.nn.conv.cugraph import CuGraphModule +from paddle_geometric.nn.conv.cugraph.base import LEGACY_MODE +from paddle_geometric.nn.inits import zeros + +try: + if LEGACY_MODE: + from paddlenlp.ops.torch.autograd import mha_gat_n2n as GATConvAgg + else: + from paddlenlp.ops.paddle.operators import mha_gat_n2n as GATConvAgg +except ImportError: + pass + + +class CuGraphGATConv(CuGraphModule): # pragma: no cover + r"""The graph attentional operator from the `"Graph Attention Networks" + `_ paper. + + :class:`CuGraphGATConv` is an optimized version of + :class:`~paddle_geometric.nn.conv.GATConv` based on the :obj:`cugraph-ops` + package that fuses message passing computation for accelerated execution + and lower memory footprint. + """ + def __init__( + self, + in_channels: int, + out_channels: int, + heads: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + bias: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + + self.lin = Linear(in_channels, heads * out_channels, bias=False) + self.att = paddle.create_parameter( + shape=[2 * heads * out_channels], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform() + ) + + if bias and concat: + self.bias = paddle.create_parameter( + shape=[heads * out_channels], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform() + ) + elif bias and not concat: + self.bias = paddle.create_parameter( + shape=[out_channels], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform() + ) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + self.lin.reset_parameters() + gain = paddle.nn.init.calculate_gain('relu') + paddle.nn.init.xavier_normal_( + self.att.view(2, self.heads, self.out_channels), gain=gain) + zeros(self.bias) + + def forward( + self, + x: Tensor, + edge_index: EdgeIndex, + max_num_neighbors: Optional[int] = None, + ) -> Tensor: + graph = self.get_cugraph(edge_index, max_num_neighbors) + + x = self.lin(x) + + if LEGACY_MODE: + out = GATConvAgg(x, self.att, graph, self.heads, 'LeakyReLU', + self.negative_slope, False, self.concat) + else: + out = GATConvAgg(x, self.att, graph, self.heads, 'LeakyReLU', + self.negative_slope, self.concat) + + if self.bias is not None: + out = out + self.bias + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/rgcn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/rgcn_conv.py new file mode 100644 index 00000000..b54a8607 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/rgcn_conv.py @@ -0,0 +1,118 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric import EdgeIndex +from paddle_geometric.nn.conv.cugraph import CuGraphModule +from paddle_geometric.nn.conv.cugraph.base import LEGACY_MODE +from paddle_geometric.nn.inits import glorot, zeros + +try: + if LEGACY_MODE: + from paddlenlp.ops.torch.autograd import \ + agg_hg_basis_n2n_post as RGCNConvAgg + else: + from paddlenlp.ops.paddle.operators import \ + agg_hg_basis_n2n_post as RGCNConvAgg +except ImportError: + pass + + +class CuGraphRGCNConv(CuGraphModule): # pragma: no cover + r"""The relational graph convolutional operator from the `"Modeling + Relational Data with Graph Convolutional Networks" + `_ paper. + + :class:`CuGraphRGCNConv` is an optimized version of + :class:`~paddle_geometric.nn.conv.RGCNConv` based on the :obj:`cugraph-ops` + package that fuses message passing computation for accelerated execution + and lower memory footprint. + """ + def __init__(self, in_channels: int, out_channels: int, num_relations: int, + num_bases: Optional[int] = None, aggr: str = 'mean', + root_weight: bool = True, bias: bool = True): + super().__init__() + + if aggr not in ['sum', 'add', 'mean']: + raise ValueError(f"Aggregation function must be either 'mean' " + f"or 'sum' (got '{aggr}')") + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_relations = num_relations + self.num_bases = num_bases + self.aggr = aggr + self.root_weight = root_weight + + dim_root_weight = 1 if root_weight else 0 + + if num_bases is not None: + self.weight = paddle.create_parameter( + shape=[num_bases + dim_root_weight, in_channels, out_channels], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform()) + self.comp = paddle.create_parameter( + shape=[num_relations, num_bases], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform()) + else: + self.weight = paddle.create_parameter( + shape=[num_relations + dim_root_weight, in_channels, out_channels], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform()) + self.comp = None # Register comp as None if no num_bases + + if bias: + self.bias = paddle.create_parameter( + shape=[out_channels], + dtype='float32', + default_initializer=paddle.nn.initializer.Uniform()) + else: + self.bias = None # Register bias as None if bias is False + + self.reset_parameters() + + def reset_parameters(self): + end = -1 if self.root_weight else None + glorot(self.weight[:end]) + glorot(self.comp) + if self.root_weight: + glorot(self.weight[-1]) + zeros(self.bias) + + def forward( + self, + x: Tensor, + edge_index: EdgeIndex, + edge_type: Tensor, + max_num_neighbors: Optional[int] = None, + ) -> Tensor: + r"""Runs the forward pass of the module. + + Args: + x (torch.Tensor): The node features. + edge_index (EdgeIndex): The edge indices. + edge_type (torch.Tensor): The edge type. + max_num_neighbors (int, optional): The maximum number of neighbors + of a target node. It is only effective when operating in a + bipartite graph.. When not given, the value will be computed + on-the-fly, leading to slightly worse performance. + (default: :obj:`None`) + """ + graph = self.get_typed_cugraph(edge_index, edge_type, + self.num_relations, max_num_neighbors) + + out = RGCNConvAgg(x, self.comp, graph, concat_own=self.root_weight, + norm_by_out_degree=bool(self.aggr == 'mean')) + + out = out @ self.weight.view(-1, self.out_channels) + + if self.bias is not None: + out = out + self.bias + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_relations={self.num_relations})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/sage_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/sage_conv.py new file mode 100644 index 00000000..ca26c413 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/cugraph/sage_conv.py @@ -0,0 +1,95 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric import EdgeIndex +from paddle_geometric.nn.conv.cugraph import CuGraphModule +from paddle_geometric.nn.conv.cugraph.base import LEGACY_MODE + +try: + if LEGACY_MODE: + from pylibcugraphops.paddle.autograd import \ + agg_concat_n2n as SAGEConvAgg + else: + from pylibcugraphops.paddle.operators import \ + agg_concat_n2n as SAGEConvAgg +except ImportError: + pass + + +class CuGraphSAGEConv(CuGraphModule): # pragma: no cover + r"""The GraphSAGE operator from the `"Inductive Representation Learning on + Large Graphs" `_ paper. + + :class:`CuGraphSAGEConv` is an optimized version of + :class:`~paddle_geometric.nn.conv.SAGEConv` based on the :obj:`cugraph-ops` + package that fuses message passing computation for accelerated execution + and lower memory footprint. + """ + def __init__( + self, + in_channels: int, + out_channels: int, + aggr: str = 'mean', + normalize: bool = False, + root_weight: bool = True, + project: bool = False, + bias: bool = True, + ): + super().__init__() + + if aggr not in ['mean', 'sum', 'min', 'max']: + raise ValueError(f"Aggregation function must be either 'mean', " + f"'sum', 'min' or 'max' (got '{aggr}')") + + self.in_channels = in_channels + self.out_channels = out_channels + self.aggr = aggr + self.normalize = normalize + self.root_weight = root_weight + self.project = project + + if self.project: + self.pre_lin = Linear(in_channels, in_channels, bias_attr=True) + + if self.root_weight: + self.lin = Linear(2 * in_channels, out_channels, bias_attr=bias) + else: + self.lin = Linear(in_channels, out_channels, bias_attr=bias) + + self.reset_parameters() + + def reset_parameters(self): + if self.project: + self.pre_lin.reset_parameters() + self.lin.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: EdgeIndex, + max_num_neighbors: Optional[int] = None, + ) -> Tensor: + graph = self.get_cugraph(edge_index, max_num_neighbors) + + if self.project: + x = F.relu(self.pre_lin(x)) + + out = SAGEConvAgg(x, graph, self.aggr) + + if self.root_weight: + out = self.lin(out) + else: + out = self.lin(out[:, :self.in_channels]) + + if self.normalize: + out = F.normalize(out, p=2., axis=-1) + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, aggr={self.aggr})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/dir_gnn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/dir_gnn_conv.py new file mode 100644 index 00000000..445a6e6a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/dir_gnn_conv.py @@ -0,0 +1,72 @@ +import copy +import paddle +from paddle import Tensor +from paddle.nn import Linear +from paddle_geometric.nn.conv import MessagePassing + + +class DirGNNConv(paddle.nn.Layer): + r"""A generic wrapper for computing graph convolution on directed + graphs as described in the `"Edge Directionality Improves Learning on + Heterophilic Graphs" `_ paper. + :class:`DirGNNConv` will pass messages both from source nodes to target + nodes and from target nodes to source nodes. + + Args: + conv (MessagePassing): The underlying + :class:`~paddle_geometric.nn.conv.MessagePassing` layer to use. + alpha (float, optional): The alpha coefficient used to weight the + aggregations of in- and out-edges as part of a convex combination. + (default: :obj:`0.5`) + root_weight (bool, optional): If set to :obj:`True`, the layer will add + transformed root node features to the output. + (default: :obj:`True`) + """ + def __init__( + self, + conv: MessagePassing, + alpha: float = 0.5, + root_weight: bool = True, + ): + super().__init__() + + self.alpha = alpha + self.root_weight = root_weight + + self.conv_in = copy.deepcopy(conv) + self.conv_out = copy.deepcopy(conv) + + if hasattr(conv, 'add_self_loops'): + self.conv_in.add_self_loops = False + self.conv_out.add_self_loops = False + if hasattr(conv, 'root_weight'): + self.conv_in.root_weight = False + self.conv_out.root_weight = False + + if root_weight: + self.lin = Linear(conv.in_channels, conv.out_channels) + else: + self.lin = None + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.conv_in.reset_parameters() + self.conv_out.reset_parameters() + if self.lin is not None: + self.lin.reset_parameters() + + def forward(self, x: Tensor, edge_index: Tensor) -> Tensor: + x_in = self.conv_in(x, edge_index) + x_out = self.conv_out(x, paddle.flip(edge_index, [0])) + + out = self.alpha * x_out + (1 - self.alpha) * x_in + + if self.root_weight: + out = out + self.lin(x) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.conv_in}, alpha={self.alpha})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/dna_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/dna_conv.py new file mode 100644 index 00000000..eb765add --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/dna_conv.py @@ -0,0 +1,181 @@ +import math +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptTensor, SparseTensor + + +class Linear(Layer): + def __init__(self, in_channels, out_channels, groups=1, bias=True): + super().__init__() + assert in_channels % groups == 0 and out_channels % groups == 0 + + self.in_channels = in_channels + self.out_channels = out_channels + self.groups = groups + + # Define weight and bias parameters + self.weight = self.create_parameter( + shape=[groups, in_channels // groups, out_channels // groups]) + + if bias: + self.bias = self.create_parameter(shape=[out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + # Initialize weight and bias using Kaiming and uniform initialization + paddle.nn.initializer.KaimingUniform()(self.weight) + if self.bias is not None: + fan_in = self.in_channels + bound = 1 / math.sqrt(fan_in) + paddle.nn.initializer.Uniform(-bound, bound)(self.bias) + + def forward(self, src): + # Handles grouped linear transformation + if self.groups > 1: + size = src.shape[:-1] + src = src.reshape((-1, self.groups, self.in_channels // self.groups)) + src = src.transpose((1, 0, 2)) + out = paddle.matmul(src, self.weight) + out = out.transpose((1, 0, 2)).reshape(size + (self.out_channels,)) + else: + out = paddle.matmul(src, self.weight.squeeze(0)) + + if self.bias is not None: + out += self.bias + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels}, {self.out_channels}, groups={self.groups})' + + +def restricted_softmax(src, dim: int = -1, margin: float = 0.): + # Apply softmax with margin restriction + src_max = paddle.clip(paddle.max(src, axis=dim, keepdim=True), min=0.) + out = paddle.exp(src - src_max) + out = out / (paddle.sum(out, axis=dim, keepdim=True) + paddle.exp(margin - src_max)) + return out + + +class Attention(Layer): + def __init__(self, dropout=0): + super().__init__() + self.dropout = dropout + + def forward(self, query, key, value): + return self.compute_attention(query, key, value) + + def compute_attention(self, query, key, value): + # Computes attention using dot product + score = paddle.matmul(query, key.transpose((-2, -1))) + score = score / math.sqrt(key.shape[-1]) + score = restricted_softmax(score, axis=-1) + score = F.dropout(score, p=self.dropout, training=self.training) + return paddle.matmul(score, value) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(dropout={self.dropout})' + + +class MultiHead(Attention): + def __init__(self, in_channels, out_channels, heads=1, groups=1, dropout=0, bias=True): + super().__init__(dropout) + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.groups = groups + self.bias = bias + + # Ensure channels are compatible with the number of heads and groups + assert in_channels % heads == 0 and out_channels % heads == 0 + assert in_channels % groups == 0 and out_channels % groups == 0 + + # Define linear layers for query, key, and value + self.lin_q = Linear(in_channels, out_channels, groups, bias) + self.lin_k = Linear(in_channels, out_channels, groups, bias) + self.lin_v = Linear(in_channels, out_channels, groups, bias) + + self.reset_parameters() + + def reset_parameters(self): + # Reset parameters of linear layers + self.lin_q.reset_parameters() + self.lin_k.reset_parameters() + self.lin_v.reset_parameters() + + def forward(self, query, key, value): + # Applies multi-head attention over the query, key, and value tensors + query = self.lin_q(query) + key = self.lin_k(key) + value = self.lin_v(value) + + size = query.shape[:-2] + out_channels_per_head = self.out_channels // self.heads + + # Reshape for multi-head attention + query = query.reshape(size + (query.shape[-2], self.heads, out_channels_per_head)).transpose((-3, -2)) + key = key.reshape(size + (key.shape[-2], self.heads, out_channels_per_head)).transpose((-3, -2)) + value = value.reshape(size + (value.shape[-2], self.heads, out_channels_per_head)).transpose((-3, -2)) + + out = self.compute_attention(query, key, value) + out = out.transpose((-3, -2)).reshape(size + (query.shape[-2], self.out_channels)) + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, {self.out_channels}, ' + f'heads={self.heads}, groups={self.groups}, dropout={self.dropout}, bias={self.bias})') + + +class DNAConv(MessagePassing): + def __init__(self, channels: int, heads: int = 1, groups: int = 1, + dropout: float = 0., cached: bool = False, + normalize: bool = True, add_self_loops: bool = True, + bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(node_dim=0, **kwargs) + + self.bias = bias + self.cached = cached + self.normalize = normalize + self.add_self_loops = add_self_loops + + self._cached_edge_index = None + self._cached_adj_t = None + + # Initialize multi-head attention for DNA convolution + self.multi_head = MultiHead(channels, channels, heads, groups, dropout, bias) + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.multi_head.reset_parameters() + self._cached_edge_index = None + self._cached_adj_t = None + + def forward(self, x: Tensor, edge_index: Adj, edge_weight: OptTensor = None) -> Tensor: + # Runs the forward pass, ensuring correct input shape + if x.dim() != 3: + raise ValueError('Feature shape must be [num_nodes, num_layers, channels].') + + # Normalize edge weights if required + # propagate_type: (x: Tensor, edge_weight: OptTensor) + return self.propagate(edge_index, x=x, edge_weight=edge_weight) + + def message(self, x_i: Tensor, x_j: Tensor, edge_weight: Tensor) -> Tensor: + # Applies multi-head attention to the messages + x_i = x_i[:, -1:] # [num_edges, 1, channels] + out = self.multi_head(x_i, x_j, x_j) # [num_edges, 1, channels] + return edge_weight.view(-1, 1) * out.squeeze(1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.multi_head.in_channels}, ' + f'heads={self.multi_head.heads}, ' + f'groups={self.multi_head.groups})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/edge_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/edge_conv.py new file mode 100644 index 00000000..e7aac39c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/edge_conv.py @@ -0,0 +1,109 @@ +from typing import Callable, Optional, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import reset +from paddle_geometric.typing import Adj, OptTensor, PairOptTensor, PairTensor + +try: + from paddle_cluster import knn +except ImportError: + knn = None + + +class EdgeConv(MessagePassing): + r"""The edge convolutional operator from the `"Dynamic Graph CNN for + Learning on Point Clouds" `_ paper. + + Args: + nn (paddle.nn.Layer): A neural network :math:`h_{\mathbf{\Theta}}` that + maps pair-wise concatenated node features :obj:`x` of shape + :obj:`[-1, 2 * in_channels]` to shape :obj:`[-1, out_channels]`, + *e.g.*, defined by :class:`paddle.nn.Sequential`. + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"max"`) + """ + + def __init__(self, nn: Callable, aggr: str = 'max', **kwargs): + super().__init__(aggr=aggr, **kwargs) + self.nn = nn + self.reset_parameters() + + def reset_parameters(self): + reset(self.nn) + + def forward(self, x: Union[Tensor, PairTensor], edge_index: Adj) -> Tensor: + if isinstance(x, Tensor): + x = (x, x) + return self.propagate(edge_index, x=x) + + def message(self, x_i: Tensor, x_j: Tensor) -> Tensor: + return self.nn(paddle.concat([x_i, x_j - x_i], axis=-1)) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(nn={self.nn})' + + +class DynamicEdgeConv(MessagePassing): + r"""The dynamic edge convolutional operator from the `"Dynamic Graph CNN + for Learning on Point Clouds" `_ paper, + where the graph is dynamically constructed using nearest neighbors. + + Args: + nn (paddle.nn.Layer): A neural network :math:`h_{\mathbf{\Theta}}` that + maps pair-wise concatenated node features :obj:`x` of shape + :obj:`[-1, 2 * in_channels]` to shape :obj:`[-1, out_channels]`. + k (int): Number of nearest neighbors. + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"max"`) + num_workers (int): Number of workers to use for k-NN computation. + (default: :obj:`1`) + """ + + def __init__(self, nn: Callable, k: int, aggr: str = 'max', + num_workers: int = 1, **kwargs): + super().__init__(aggr=aggr, flow='source_to_target', **kwargs) + + if knn is None: + raise ImportError('`DynamicEdgeConv` requires `paddle-cluster`.') + + self.nn = nn + self.k = k + self.num_workers = num_workers + self.reset_parameters() + + def reset_parameters(self): + reset(self.nn) + + def forward( + self, + x: Union[Tensor, PairTensor], + batch: Union[OptTensor, Optional[PairTensor]] = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + if x[0].ndim != 2: + raise ValueError("Static graphs are not supported in DynamicEdgeConv") + + b: PairOptTensor = (None, None) + if isinstance(batch, Tensor): + b = (batch, batch) + elif isinstance(batch, tuple): + assert batch is not None + b = (batch[0], batch[1]) + + edge_index = knn(x[0], x[1], self.k, b[0], b[1]).flip([0]) + return self.propagate(edge_index, x=x) + + def message(self, x_i: Tensor, x_j: Tensor) -> Tensor: + return self.nn(paddle.concat([x_i, x_j - x_i], axis=-1)) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(nn={self.nn}, k={self.k})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/edge_updater.jinja b/jointContribution/mattergen/paddle_geometric/nn/conv/edge_updater.jinja new file mode 100644 index 00000000..cca004e5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/edge_updater.jinja @@ -0,0 +1,74 @@ +import typing +from typing import Union + +import torch +from torch import Tensor + +import paddle_geometric.typing +from paddle_geometric import is_compiling +from paddle_geometric.utils import is_sparse +from paddle_geometric.typing import Size, SparseTensor +{% for module in modules %} +from {{module}} import * +{%- endfor %} + + +{% include "collect.jinja" %} + + +def edge_updater( + self, + edge_index: Union[Tensor, SparseTensor], +{%- for param in signature.param_dict.values() %} + {{param.name}}: {{param.type_repr}}, +{%- endfor %} + size: Size = None, +) -> {{signature.return_type_repr}}: + + mutable_size = self._check_input(edge_index, size) + + kwargs = self.{{collect_name}}( + edge_index, +{%- for name in signature.param_dict %} + {{name}}, +{%- endfor %} + mutable_size, + ) + + # Begin Edge Update Forward Pre Hook ####################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._edge_update_forward_pre_hooks.values(): + hook_kwargs = dict( +{%- for name in collect_param_dict %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + res = hook(self, (edge_index, size, hook_kwargs)) + if res is not None: + edge_index, size, hook_kwargs = res + kwargs = CollectArgs( +{%- for name in collect_param_dict %} + {{name}}=hook_kwargs['{{name}}'], +{%- endfor %} + ) + # End Edge Update Forward Pre Hook ######################################### + + out = self.edge_update( +{%- for name in collect_param_dict %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + + # Begin Edge Update Forward Hook ########################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._edge_update_forward_hooks.values(): + hook_kwargs = dict( +{%- for name in collect_param_dict %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + res = hook(self, (edge_index, size, hook_kwargs), out) + out = res if res is not None else out + # End Edge Update Forward Hook ############################################# + + return out diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/eg_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/eg_conv.py new file mode 100644 index 00000000..ae5437d7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/eg_conv.py @@ -0,0 +1,194 @@ +from typing import List, Optional, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.nn.inits import zeros + +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import add_remaining_self_loops, scatter, spmm + + +class EGConv(MessagePassing): + r"""The Efficient Graph Convolution from the `"Adaptive Filters and + Aggregator Fusion for Efficient Graph Convolutions" + `_ paper. + + Its node-wise formulation is given by: + + .. math:: + \mathbf{x}_i^{\prime} = {\LARGE ||}_{h=1}^H \sum_{\oplus \in + \mathcal{A}} \sum_{b = 1}^B w_{i, h, \oplus, b} \; + \underset{j \in \mathcal{N}(i) \cup \{i\}}{\bigoplus} + \mathbf{W}_b \mathbf{x}_{j} + + with :math:`\mathbf{W}_b` denoting a basis weight, + :math:`\oplus` denoting an aggregator, and :math:`w` denoting per-vertex + weighting coefficients across different heads, bases and aggregators. + + EGC retains :math:`\mathcal{O}(|\mathcal{V}|)` memory usage, making it a + sensible alternative to :class:`~paddle_geometric.nn.conv.GCNConv`, + :class:`~paddle_geometric.nn.conv.SAGEConv` or + :class:`~paddle_geometric.nn.conv.GINConv`. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + aggregators (List[str], optional): Aggregators to be used. + Supported aggregators are :obj:`"sum"`, :obj:`"mean"`, + :obj:`"symnorm"`, :obj:`"max"`, :obj:`"min"`, :obj:`"std"`, + :obj:`"var"`. + Multiple aggregators can be used to improve the performance. + (default: :obj:`["symnorm"]`) + num_heads (int, optional): Number of heads :math:`H` to use. Must have + :obj:`out_channels % num_heads == 0`. It is recommended to set + :obj:`num_heads >= num_bases`. (default: :obj:`8`) + num_bases (int, optional): Number of basis weights :math:`B` to use. + (default: :obj:`4`) + cached (bool, optional): If set to :obj:`True`, the layer will cache + the computation of the edge index with added self loops on first + execution, along with caching the calculation of the symmetric + normalized edge weights if the :obj:`"symnorm"` aggregator is + being used. This parameter should only be set to :obj:`True` in + transductive learning scenarios. (default: :obj:`False`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)` + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + + def __init__( + self, + in_channels: int, + out_channels: int, + aggregators: List[str] = ['symnorm'], + num_heads: int = 8, + num_bases: int = 4, + cached: bool = False, + add_self_loops: bool = True, + bias: bool = True, + **kwargs, + ): + super().__init__(node_dim=0, **kwargs) + + if out_channels % num_heads != 0: + raise ValueError(f"'out_channels' (got {out_channels}) must be " + f"divisible by the number of heads " + f"(got {num_heads})") + + for a in aggregators: + if a not in ['sum', 'mean', 'symnorm', 'min', 'max', 'var', 'std']: + raise ValueError(f"Unsupported aggregator: '{a}'") + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_heads = num_heads + self.num_bases = num_bases + self.cached = cached + self.add_self_loops = add_self_loops + self.aggregators = aggregators + + self.bases_lin = Linear(in_channels, + (out_channels // num_heads) * num_bases, + bias_attr=False) + self.comb_lin = Linear(in_channels, + num_heads * num_bases * len(aggregators)) + + if bias: + self.bias = self.create_parameter(shape=[out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + self.bases_lin.reset_parameters() + self.comb_lin.reset_parameters() + if self.bias is not None: + zeros(self.bias) + + def forward(self, x: Tensor, edge_index: Adj) -> Tensor: + symnorm_weight: OptTensor = None + if "symnorm" in self.aggregators: + edge_index, symnorm_weight = gcn_norm( + edge_index, None, num_nodes=x.shape[0], + add_self_loops=self.add_self_loops, dtype=x.dtype) + + elif self.add_self_loops: + edge_index, _ = add_remaining_self_loops(edge_index) + + bases = self.bases_lin(x) + weightings = self.comb_lin(x) + + aggregated = self.propagate(edge_index, x=bases, symnorm_weight=symnorm_weight) + + weightings = weightings.reshape([-1, self.num_heads, self.num_bases * len(self.aggregators)]) + aggregated = aggregated.reshape( + [-1, len(self.aggregators) * self.num_bases, self.out_channels // self.num_heads]) + + out = paddle.matmul(weightings, aggregated) + out = out.reshape([-1, self.out_channels]) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor) -> Tensor: + return x_j + + def aggregate(self, inputs: Tensor, index: Tensor, + dim_size: Optional[int] = None, + symnorm_weight: OptTensor = None) -> Tensor: + + outs = [] + for aggr in self.aggregators: + if aggr == 'symnorm': + out = scatter(inputs * symnorm_weight, index, axis=0, dim_size=dim_size, reduce='sum') + elif aggr == 'var' or aggr == 'std': + mean = scatter(inputs, index, axis=0, dim_size=dim_size, reduce='mean') + mean_squares = scatter(inputs * inputs, index, axis=0, dim_size=dim_size, reduce='mean') + out = mean_squares - mean * mean + if aggr == 'std': + out = paddle.sqrt(out.clip(min=1e-5)) + else: + out = scatter(inputs, index, axis=0, dim_size=dim_size, reduce=aggr) + + outs.append(out) + + return paddle.stack(outs, axis=1) if len(outs) > 1 else outs[0] + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + adj_t_2 = adj_t + if len(self.aggregators) > 1 and 'symnorm' in self.aggregators: + adj_t_2 = adj_t.set_value(None) if isinstance(adj_t, SparseTensor) else adj_t.clone().fill_diagonal(1.0) + + outs = [] + for aggr in self.aggregators: + if aggr == 'symnorm': + out = spmm(adj_t, x, reduce='sum') + elif aggr in ['var', 'std']: + mean = spmm(adj_t_2, x, reduce='mean') + mean_sq = spmm(adj_t_2, x * x, reduce='mean') + out = mean_sq - mean * mean + if aggr == 'std': + out = paddle.sqrt(out.clip(min=1e-5)) + else: + out = spmm(adj_t_2, x, reduce=aggr) + + outs.append(out) + + return paddle.stack(outs, axis=1) if len(outs) > 1 else outs[0] + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, aggregators={self.aggregators})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/fa_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/fa_conv.py new file mode 100644 index 00000000..2768db0f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/fa_conv.py @@ -0,0 +1,187 @@ +from typing import Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear, Layer + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils.sparse import set_sparse_value + + + +class FAConv(MessagePassing): + r"""The Frequency Adaptive Graph Convolution operator from the + `"Beyond Low-Frequency Information in Graph Convolutional Networks" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i= \epsilon \cdot \mathbf{x}^{(0)}_i + + \sum_{j \in \mathcal{N}(i)} \frac{\alpha_{i,j}}{\sqrt{d_i d_j}} + \mathbf{x}_{j} + + where :math:`\mathbf{x}^{(0)}_i` and :math:`d_i` denote the initial feature + representation and node degree of node :math:`i`, respectively. + The attention coefficients :math:`\alpha_{i,j}` are computed as + + .. math:: + \mathbf{\alpha}_{i,j} = \textrm{tanh}(\mathbf{a}^{\top}[\mathbf{x}_i, + \mathbf{x}_j]) + + based on the trainable parameter vector :math:`\mathbf{a}`. + + Args: + channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + eps (float, optional): :math:`\epsilon`-value. (default: :obj:`0.1`) + dropout (float, optional): Dropout probability of the normalized + coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`). + cached (bool, optional): If set to :obj:`True`, the layer will cache + the computation of :math:`\sqrt{d_i d_j}` on first execution, and + will use the cached version for further executions. + This parameter should only be set to :obj:`True` in transductive + learning scenarios. (default: :obj:`False`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + normalize (bool, optional): Whether to add self-loops (if + :obj:`add_self_loops` is :obj:`True`) and compute + symmetric normalization coefficients on the fly. + If set to :obj:`False`, :obj:`edge_weight` needs to be provided in + the layer's :meth:`forward` method. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F)`, + initial node features :math:`(|\mathcal{V}|, F)`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F)` or + :math:`((|\mathcal{V}|, F), ((2, |\mathcal{E}|), + (|\mathcal{E}|)))` if :obj:`return_attention_weights=True` + """ + def __init__(self, channels: int, eps: float = 0.1, dropout: float = 0.0, + cached: bool = False, add_self_loops: bool = True, + normalize: bool = True, **kwargs): + + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.channels = channels + self.eps = eps + self.dropout = dropout + self.cached = cached + self.add_self_loops = add_self_loops + self.normalize = normalize + + self._cached_edge_index = None + self._cached_adj_t = None + self._alpha = None + + self.att_l = Linear(channels, 1, bias_attr=False) + self.att_r = Linear(channels, 1, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + self.att_l.reset_parameters() + self.att_r.reset_parameters() + self._cached_edge_index = None + self._cached_adj_t = None + + def forward( + self, + x: Tensor, + x_0: Tensor, + edge_index: Adj, + edge_weight: OptTensor = None, + return_attention_weights: Optional[bool] = None, + ) -> Union[ + Tensor, + Tuple[Tensor, Tuple[Tensor, Tensor]], + Tuple[Tensor, SparseTensor], + ]: + r"""Runs the forward pass of the module. + + Args: + x (paddle.Tensor): The node features. + x_0 (paddle.Tensor): The initial input node features. + edge_index (paddle.Tensor or SparseTensor): The edge indices. + edge_weight (paddle.Tensor, optional): The edge weights. + (default: :obj:`None`) + return_attention_weights (bool, optional): If set to :obj:`True`, + will additionally return the tuple + :obj:`(edge_index, attention_weights)`, holding the computed + attention weights for each edge. (default: :obj:`None`) + """ + if self.normalize: + if isinstance(edge_index, Tensor): + assert edge_weight is None + cache = self._cached_edge_index + if cache is None: + edge_index, edge_weight = gcn_norm( + edge_index, None, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + if self.cached: + self._cached_edge_index = (edge_index, edge_weight) + else: + edge_index, edge_weight = cache[0], cache[1] + + elif isinstance(edge_index, SparseTensor): + assert not edge_index.has_value() + cache = self._cached_adj_t + if cache is None: + edge_index = gcn_norm( + edge_index, None, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + if self.cached: + self._cached_adj_t = edge_index + else: + edge_index = cache + else: + if isinstance(edge_index, Tensor): + assert edge_weight is not None + elif isinstance(edge_index, SparseTensor): + assert edge_index.has_value() + + alpha_l = self.att_l(x) + alpha_r = self.att_r(x) + + # propagate_type: (x: Tensor, alpha: PairTensor, + # edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, alpha=(alpha_l, alpha_r), + edge_weight=edge_weight) + + alpha = self._alpha + self._alpha = None + + if self.eps != 0.0: + out = out + self.eps * x_0 + + if isinstance(return_attention_weights, bool): + assert alpha is not None + if isinstance(edge_index, Tensor): + if paddle.is_sparse(edge_index): + adj = set_sparse_value(edge_index, alpha) + return out, (adj, alpha) + else: + return out, (edge_index, alpha) + elif isinstance(edge_index, SparseTensor): + return out, edge_index.set_value(alpha, layout='coo') + else: + return out + + def message(self, x_j: Tensor, alpha_j: Tensor, alpha_i: Tensor, + edge_weight: OptTensor) -> Tensor: + assert edge_weight is not None + alpha = (alpha_j + alpha_i).tanh().squeeze(-1) + self._alpha = alpha + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + return x_j * (alpha * edge_weight).reshape([-1, 1]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.channels}, eps={self.eps})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/feast_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/feast_conv.py new file mode 100644 index 00000000..5e43a7ab --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/feast_conv.py @@ -0,0 +1,107 @@ +from typing import Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, Linear + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import normal +from paddle_geometric.typing import Adj, PairTensor, SparseTensor +from paddle_geometric.utils import add_self_loops, remove_self_loops + + +class FeaStConv(MessagePassing): + r"""The (translation-invariant) feature-steered convolutional operator from + the `"FeaStNet: Feature-Steered Graph Convolutions for 3D Shape Analysis" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{1}{|\mathcal{N}(i)|} + \sum_{j \in \mathcal{N}(i)} \sum_{h=1}^H + q_h(\mathbf{x}_i, \mathbf{x}_j) \mathbf{W}_h \mathbf{x}_j + + with :math:`q_h(\mathbf{x}_i, \mathbf{x}_j) = \mathrm{softmax}_j + (\mathbf{u}_h^{\top} (\mathbf{x}_j - \mathbf{x}_i) + c_h)`, where :math:`H` + denotes the number of attention heads, and :math:`\mathbf{W}_h`, + :math:`\mathbf{u}_h` and :math:`c_h` are trainable parameters. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + heads (int, optional): Number of attention heads :math:`H`. + (default: :obj:`1`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{in}), (|\mathcal{V_t}|, F_{in}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)` + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V_t}|, F_{out})` if bipartite + """ + def __init__(self, in_channels: int, out_channels: int, heads: int = 1, + add_self_loops: bool = True, bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'mean') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.add_self_loops = add_self_loops + + self.lin = Linear(in_channels, heads * out_channels, bias_attr=False) + self.u = Linear(in_channels, heads, bias_attr=False) + self.c = self.create_parameter(shape=[heads], default_initializer=normal(0, 0.1)) + + if bias: + self.bias = self.create_parameter(shape=[out_channels], default_initializer=normal(0, 0.1)) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + self.lin.weight.set_value(normal(0, 0.1)(self.lin.weight.shape)) + self.u.weight.set_value(normal(0, 0.1)(self.u.weight.shape)) + self.c.set_value(normal(0, 0.1)(self.c.shape)) + if self.bias is not None: + self.bias.set_value(normal(0, 0.1)(self.bias.shape)) + + def forward(self, x: Union[Tensor, PairTensor], edge_index: Adj) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + edge_index, _ = remove_self_loops(edge_index) + edge_index, _ = add_self_loops(edge_index, num_nodes=x[1].shape[0]) + elif isinstance(edge_index, SparseTensor): + edge_index = edge_index + paddle.sparse.eye(edge_index.shape[0], edge_index.shape[1]) + + # propagate_type: (x: PairTensor) + out = self.propagate(edge_index, x=x) + + if self.bias is not None: + out += self.bias + + return out + + def message(self, x_i: Tensor, x_j: Tensor) -> Tensor: + q = self.u(x_j - x_i) + self.c # Translation invariance. + q = F.softmax(q, axis=1) + x_j = self.lin(x_j).reshape([x_j.shape[0], self.heads, -1]) + return (x_j * q.unsqueeze(-1)).sum(axis=1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/film_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/film_conv.py new file mode 100644 index 00000000..724577f4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/film_conv.py @@ -0,0 +1,137 @@ +import copy +from typing import Callable, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import LayerList, ReLU, Linear +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import reset + +from paddle_geometric.typing import ( + Adj, + OptTensor, + PairTensor, + SparseTensor, + paddle_sparse, +) + +class FiLMConv(MessagePassing): + r"""The FiLM graph convolutional operator from the + `"GNN-FiLM: Graph Neural Networks with Feature-wise Linear Modulation" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \sum_{r \in \mathcal{R}} + \sum_{j \in \mathcal{N}(i)} \sigma \left( + \boldsymbol{\gamma}_{r,i} \odot \mathbf{W}_r \mathbf{x}_j + + \boldsymbol{\beta}_{r,i} \right) + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + num_relations (int, optional): Number of relations. (default: :obj:`1`) + nn (paddle.nn.Layer, optional): The neural network :math:`g` that + maps node features :obj:`x_i` of shape + :obj:`[-1, in_channels]` to shape :obj:`[-1, 2 * out_channels]`. + If set to :obj:`None`, :math:`g` will be implemented as a single + linear layer. (default: :obj:`None`) + act (callable, optional): Activation function :math:`\sigma`. + (default: :meth:`paddle.nn.ReLU()`) + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"mean"`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + num_relations: int = 1, + nn: Optional[Callable] = None, + act: Optional[Callable] = ReLU(), + aggr: str = 'mean', + **kwargs, + ): + super().__init__(aggr=aggr, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_relations = max(num_relations, 1) + self.act = act + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.lins = LayerList() + self.films = LayerList() + for _ in range(num_relations): + self.lins.append(Linear(in_channels[0], out_channels, bias_attr=False)) + if nn is None: + film = Linear(in_channels[1], 2 * out_channels) + else: + film = copy.deepcopy(nn) + self.films.append(film) + + self.lin_skip = Linear(in_channels[1], self.out_channels, bias_attr=False) + if nn is None: + self.film_skip = Linear(in_channels[1], 2 * self.out_channels, bias_attr=False) + else: + self.film_skip = copy.deepcopy(nn) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + for lin, film in zip(self.lins, self.films): + lin.weight.set_value(paddle.nn.initializer.XavierUniform()(lin.weight.shape)) + reset(film) + self.lin_skip.weight.set_value(paddle.nn.initializer.XavierUniform()(self.lin_skip.weight.shape)) + reset(self.film_skip) + + def forward( + self, + x: Union[Tensor, PairTensor], + edge_index: Adj, + edge_type: OptTensor = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + beta, gamma = paddle.split(self.film_skip(x[1]), self.out_channels, axis=-1) + out = gamma * self.lin_skip(x[1]) + beta + if self.act is not None: + out = self.act(out) + + # propagate_type: (x: Tensor, beta: Tensor, gamma: Tensor) + if self.num_relations <= 1: + beta, gamma = paddle.split(self.films[0](x[1]), self.out_channels, axis=-1) + out = out + self.propagate(edge_index, x=self.lins[0](x[0]), beta=beta, gamma=gamma) + else: + for i, (lin, film) in enumerate(zip(self.lins, self.films)): + beta, gamma = paddle.split(film(x[1]), self.out_channels, axis=-1) + if isinstance(edge_index, SparseTensor): + _edge_type = edge_index.coo().values() + mask = _edge_type == i + adj_t = paddle_sparse.masked_select_nnz(edge_index, mask, layout='coo') + out = out + self.propagate(adj_t, x=lin(x[0]), beta=beta, gamma=gamma) + else: + assert edge_type is not None + mask = edge_type == i + out = out + self.propagate(edge_index[:, mask], x=lin(x[0]), beta=beta, gamma=gamma) + + return out + + def message(self, x_j: Tensor, beta_i: Tensor, gamma_i: Tensor) -> Tensor: + out = gamma_i * x_j + beta_i + if self.act is not None: + out = self.act(out) + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_relations={self.num_relations})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/fused_gat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/fused_gat_conv.py new file mode 100644 index 00000000..5cff3fd7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/fused_gat_conv.py @@ -0,0 +1,116 @@ +import typing +from typing import Optional, Tuple + +import paddle +from paddle import Tensor +from paddle_geometric.nn.conv import GATConv +from paddle_geometric.utils import sort_edge_index +from paddle_geometric.index import index2ptr + +class FusedGATConv(GATConv): # pragma: no cover + r"""The fused graph attention operator from the + `"Understanding GNN Computational Graph: A Coordinated Computation, IO, and + Memory Perspective" + `_ paper. + + :class:`FusedGATConv` is an optimized version of + :class:`~paddle_geometric.nn.conv.GATConv` that fuses message passing + computation for accelerated execution and lower memory footprint. + + .. note:: + This implementation requires the `dgNN` package. + See `here `__ for installation. + """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if self.add_self_loops: + raise ValueError(f"'{self.__class__.__name__}' does not support " + f"adding self-loops. Please add them manually " + f"in a pre-processing step and set " + f"`add_self_loops=False`.") + + if self.edge_dim is not None: + raise ValueError(f"'{self.__class__.__name__}' does not support " + f"edge features. Set `edge_dim=None` in order " + f"to proceed.") + + from dgNN.operators import GATConvFuse + self.op = GATConvFuse + + @staticmethod + def to_graph_format( + edge_index: Tensor, + size: Optional[Tuple[int, int]] = None, + ) -> Tuple[Tuple[Tensor, Tensor], Tuple[Tensor, Tensor], Tensor]: + r"""Converts an :obj:`edge_index` representation of a graph to the + desired input format of :class:`FusedGATConv`. + + Args: + edge_index (paddle.Tensor): The edge indices. + size ((int, int), optional): The shape of :obj:`edge_index` in each + dimension. (default: :obj:`None`) + """ + edge_index = edge_index.astype(paddle.int32) + + edge_index = sort_edge_index(edge_index, sort_by_row=True) + rowptr = index2ptr(edge_index[0], size=size[0] if size else None) + col = edge_index[1] + + device = edge_index.place + perm = paddle.arange(edge_index.shape[1], dtype=paddle.int32, place=device) + edge_index, perm = sort_edge_index(edge_index, perm, sort_by_row=False) + row = edge_index[0] + colptr = index2ptr(edge_index[1], size=size[1] if size else None) + + return (rowptr, col), (row, colptr), perm + + def forward( + self, + x: Tensor, + csr: Tuple[Tensor, Tensor], + csc: Tuple[Tensor, Tensor], + perm: Tensor, + ) -> Tensor: + r"""Runs the forward pass of the module. + + Args: + x (paddle.Tensor): The node features. + csr ((paddle.Tensor, paddle.Tensor)): A tuple containing the CSR + representation of a graph, given as a tuple of + :obj:`(rowptr, col)`. + csc ((paddle.Tensor, paddle.Tensor)): A tuple containing the CSC + representation of a graph, given as a tuple of + :obj:`(row, colptr)`. + perm (paddle.Tensor): Permutation tensor to map the CSR + representation to the CSC representation. + + .. note:: + Use the :meth:`~paddle_geometric.nn.conv.FusedGATConv.to_graph_format` + method to obtain the :obj:`(csr, csc, perm)` graph format from an + existing :obj:`edge_index` representation. + """ + H, C = self.heads, self.out_channels + + assert x.dim() == 2, "Static graphs not supported in 'GATConv'" + x = self.lin_src(x).reshape((-1, H, C)) + + alpha_src = (x * self.att_src).sum(axis=-1) + alpha_dst = (x * self.att_dst).sum(axis=-1) + + dropout = self.dropout if self.training else 0.0 + + (rowptr, col), (row, colptr) = csr, csc + out = self.op(alpha_dst, alpha_src, rowptr, col, colptr, row, perm, + self.negative_slope, x, dropout) + + if self.concat: + out = out.reshape((-1, self.heads * self.out_channels)) + else: + out = out.mean(axis=1) + + if self.bias is not None: + out += self.bias + + return out diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gat_conv.py new file mode 100644 index 00000000..48ac19e1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gat_conv.py @@ -0,0 +1,346 @@ +import typing +from typing import Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.typing import ( + Adj, + NoneType, + OptPairTensor, + OptTensor, + Size, + SparseTensor, + paddle_sparse, +) +from paddle_geometric.utils import ( + add_self_loops, + is_paddle_sparse_tensor, + remove_self_loops, + softmax, +) +from paddle_geometric.utils.sparse import set_sparse_value +from typing import overload + + +class GATConv(MessagePassing): + r"""The graph attentional operator from the `"Graph Attention Networks" + `_ paper. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities in case of a bipartite graph. + out_channels (int): Size of each output sample. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + edge_dim (int, optional): Edge feature dimensionality (in case + there are any). (default: :obj:`None`) + fill_value (float or Tensor or str, optional): The way to + generate edge features of self-loops (in case :obj:`edge_dim != None`). + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + residual (bool, optional): If set to :obj:`True`, the layer will add + a learnable skip-connection. (default: :obj:`False`) + **kwargs (optional): Additional arguments of :class:`MessagePassing`. + """ + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + heads: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + dropout: float = 0.0, + add_self_loops: bool = True, + edge_dim: Optional[int] = None, + fill_value: Union[float, Tensor, str] = 'mean', + bias: bool = True, + residual: bool = False, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + self.add_self_loops = add_self_loops + self.edge_dim = edge_dim + self.fill_value = fill_value + self.residual = residual + + # Linear layers for source and target node transformations: + self.lin = self.lin_src = self.lin_dst = None + if isinstance(in_channels, int): + self.lin = Linear(in_channels, heads * out_channels, bias_attr=False) + else: + self.lin_src = Linear(in_channels[0], heads * out_channels, bias_attr=False) + self.lin_dst = Linear(in_channels[1], heads * out_channels, bias_attr=False) + + # Parameters for computing attention coefficients: + self.att_src = self.create_parameter(shape=[1, heads, out_channels]) + self.att_dst = self.create_parameter(shape=[1, heads, out_channels]) + + if edge_dim is not None: + self.lin_edge = Linear(edge_dim, heads * out_channels, bias_attr=False) + self.att_edge = self.create_parameter(shape=[1, heads, out_channels]) + else: + self.lin_edge = None + self.att_edge = None + + + # Optional residual connection: + total_out_channels = out_channels * (heads if concat else 1) + + if residual: + self.res = Linear( + in_channels if isinstance(in_channels, int) else in_channels[1], + total_out_channels, + bias_attr=False, + ) + else: + self.res =None + + # Optional bias: + if bias: + self.bias = self.create_parameter(shape=[total_out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + if self.lin is not None: + self.lin.reset_parameters() + if self.lin_src is not None: + self.lin_src.reset_parameters() + if self.lin_dst is not None: + self.lin_dst.reset_parameters() + if self.lin_edge is not None: + self.lin_edge.reset_parameters() + if self.res is not None: + self.res.reset_parameters() + glorot(self.att_src) + glorot(self.att_dst) + glorot(self.att_edge) + zeros(self.bias) + + @overload + def forward( + self, + x: Union[Tensor, OptPairTensor], + edge_index: Adj, + edge_attr: OptTensor = None, + size: Size = None, + return_attention_weights: NoneType = None, + ) -> Tensor: + pass + + @overload + def forward( # noqa: F811 + self, + x: Union[Tensor, OptPairTensor], + edge_index: Tensor, + edge_attr: OptTensor = None, + size: Size = None, + return_attention_weights: bool = None, + ) -> Tuple[Tensor, Tuple[Tensor, Tensor]]: + pass + + @overload + def forward( # noqa: F811 + self, + x: Union[Tensor, OptPairTensor], + edge_index: SparseTensor, + edge_attr: OptTensor = None, + size: Size = None, + return_attention_weights: bool = None, + ) -> Tuple[Tensor, SparseTensor]: + pass + + def forward( # noqa: F811 + self, + x: Union[Tensor, OptPairTensor], + edge_index: Adj, + edge_attr: OptTensor = None, + size: Size = None, + return_attention_weights: Optional[bool] = None, + ) -> Union[ + Tensor, + Tuple[Tensor, Tuple[Tensor, Tensor]], + Tuple[Tensor, SparseTensor], + ]: + r"""Runs the forward pass of the module. + + Args: + x (torch.Tensor or (torch.Tensor, torch.Tensor)): The input node + features. + edge_index (torch.Tensor or SparseTensor): The edge indices. + edge_attr (torch.Tensor, optional): The edge features. + (default: :obj:`None`) + size ((int, int), optional): The shape of the adjacency matrix. + (default: :obj:`None`) + return_attention_weights (bool, optional): If set to :obj:`True`, + will additionally return the tuple + :obj:`(edge_index, attention_weights)`, holding the computed + attention weights for each edge. (default: :obj:`None`) + """ + # NOTE: attention weights will be returned whenever + # `return_attention_weights` is set to a value, regardless of its + # actual value (might be `True` or `False`). This is a current somewhat + # hacky workaround to allow for TorchScript support via the + # `torch.jit._overload` decorator, as we can only change the output + # arguments conditioned on type (`None` or `bool`), not based on its + # actual value. + + H, C = self.heads, self.out_channels + + res: Optional[Tensor] = None + + # We first transform the input node features. If a tuple is passed, we + # transform source and target node features via separate weights: + if isinstance(x, Tensor): + assert x.dim() == 2, "Static graphs not supported in 'GATConv'" + + if self.res is not None: + res = self.res(x) + + if self.lin is not None: + x_src = x_dst = self.lin(x).view(-1, H, C) + else: + # If the module is initialized as bipartite, transform source + # and destination node features separately: + assert self.lin_src is not None and self.lin_dst is not None + x_src = self.lin_src(x).view(-1, H, C) + x_dst = self.lin_dst(x).view(-1, H, C) + + else: # Tuple of source and target node features: + x_src, x_dst = x + assert x_src.dim() == 2, "Static graphs not supported in 'GATConv'" + + if x_dst is not None and self.res is not None: + res = self.res(x_dst) + + if self.lin is not None: + # If the module is initialized as non-bipartite, we expect that + # source and destination node features have the same shape and + # that they their transformations are shared: + x_src = self.lin(x_src).view(-1, H, C) + if x_dst is not None: + x_dst = self.lin(x_dst).view(-1, H, C) + else: + assert self.lin_src is not None and self.lin_dst is not None + + x_src = self.lin_src(x_src).view(-1, H, C) + if x_dst is not None: + x_dst = self.lin_dst(x_dst).view(-1, H, C) + + x = (x_src, x_dst) + + # Next, we compute node-level attention coefficients, both for source + # and target nodes (if present): + alpha_src = (x_src * self.att_src).sum(dim=-1) + alpha_dst = None if x_dst is None else (x_dst * self.att_dst).sum(-1) + alpha = (alpha_src, alpha_dst) + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + # We only want to add self-loops for nodes that appear both as + # source and target nodes: + num_nodes = x_src.size(0) + if x_dst is not None: + num_nodes = min(num_nodes, x_dst.size(0)) + num_nodes = min(size) if size is not None else num_nodes + edge_index, edge_attr = remove_self_loops( + edge_index, edge_attr) + edge_index, edge_attr = add_self_loops( + edge_index, edge_attr, fill_value=self.fill_value, + num_nodes=num_nodes) + elif isinstance(edge_index, SparseTensor): + if self.edge_dim is None: + edge_index = paddle_sparse.set_diag(edge_index) + else: + raise NotImplementedError( + "The usage of 'edge_attr' and 'add_self_loops' " + "simultaneously is currently not yet supported for " + "'edge_index' in a 'SparseTensor' form") + + # edge_updater_type: (alpha: OptPairTensor, edge_attr: OptTensor) + alpha = self.edge_updater(edge_index, alpha=alpha, edge_attr=edge_attr, + size=size) + + # propagate_type: (x: OptPairTensor, alpha: Tensor) + out = self.propagate(edge_index, x=x, alpha=alpha, size=size) + + if self.concat: + out = out.view(-1, self.heads * self.out_channels) + else: + out = out.mean(dim=1) + + if res is not None: + out = out + res + + if self.bias is not None: + out = out + self.bias + + if isinstance(return_attention_weights, bool): + if isinstance(edge_index, Tensor): + if is_paddle_sparse_tensor(edge_index): + # TODO TorchScript requires to return a tuple + adj = set_sparse_value(edge_index, alpha) + return out, (adj, alpha) + else: + return out, (edge_index, alpha) + elif isinstance(edge_index, SparseTensor): + return out, edge_index.set_value(alpha, layout='coo') + else: + return out + + def edge_update(self, alpha_j: Tensor, alpha_i: OptTensor, + edge_attr: OptTensor, index: Tensor, ptr: OptTensor, + dim_size: Optional[int]) -> Tensor: + # Given edge-level attention coefficients for source and target nodes, + # we simply need to sum them up to "emulate" concatenation: + alpha = alpha_j if alpha_i is None else alpha_j + alpha_i + if index.numel() == 0: + return alpha + if edge_attr is not None and self.lin_edge is not None: + if edge_attr.dim() == 1: + edge_attr = edge_attr.view(-1, 1) + edge_attr = self.lin_edge(edge_attr) + edge_attr = edge_attr.view(-1, self.heads, self.out_channels) + alpha_edge = (edge_attr * self.att_edge).sum(dim=-1) + alpha = alpha + alpha_edge + + alpha = F.leaky_relu(alpha, self.negative_slope) + alpha = softmax(alpha, index, ptr, dim_size) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + return alpha + + def message(self, x_j: Tensor, alpha: Tensor) -> Tensor: + return alpha.unsqueeze(-1) * x_j + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gated_graph_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gated_graph_conv.py new file mode 100644 index 00000000..1e9055f9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gated_graph_conv.py @@ -0,0 +1,85 @@ +import paddle +from paddle import Tensor +from paddle.nn import Layer, GRUCell, Linear +from paddle.nn.initializer import Uniform + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import spmm + + +class GatedGraphConv(MessagePassing): + r"""The gated graph convolution operator from the + `"Gated Graph Sequence Neural Networks" `_ paper. + + .. math:: + \mathbf{h}_i^{(0)} &= \mathbf{x}_i \, \Vert \, \mathbf{0} + + \mathbf{m}_i^{(l+1)} &= \sum_{j \in \mathcal{N}(i)} e_{j,i} \cdot + \mathbf{\Theta} \cdot \mathbf{h}_j^{(l)} + + \mathbf{h}_i^{(l+1)} &= \textrm{GRU} (\mathbf{m}_i^{(l+1)}, + \mathbf{h}_i^{(l)}) + + Args: + out_channels (int): Size of each output sample. + num_layers (int): The sequence length :math:`L`. + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"add"`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)` + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + + def __init__(self, out_channels: int, num_layers: int, aggr: str = 'add', + bias: bool = True, **kwargs): + super().__init__(aggr=aggr, **kwargs) + + self.out_channels = out_channels + self.num_layers = num_layers + + self.weight = self.create_parameter( + shape=[num_layers, out_channels, out_channels], + default_initializer=Uniform() + ) + self.rnn = GRUCell(input_size=out_channels, hidden_size=out_channels, bias_attr=bias) + + self.reset_parameters() + + def reset_parameters(self): + self.weight.set_value(paddle.uniform(self.weight.shape, min=-1.0, max=1.0)) + self.rnn.reset_parameters() + + def forward(self, x: Tensor, edge_index: Adj, edge_weight: OptTensor = None) -> Tensor: + if x.shape[-1] > self.out_channels: + raise ValueError('The number of input channels is not allowed to ' + 'be larger than the number of output channels') + + if x.shape[-1] < self.out_channels: + zero = paddle.zeros([x.shape[0], self.out_channels - x.shape[-1]], dtype=x.dtype) + x = paddle.concat([x, zero], axis=1) + + for i in range(self.num_layers): + m = paddle.matmul(x, self.weight[i]) + # propagate_type: (x: Tensor, edge_weight: OptTensor) + m = self.propagate(edge_index, x=m, edge_weight=edge_weight) + x = self.rnn(m, x) + + return x + + def message(self, x_j: Tensor, edge_weight: OptTensor): + return x_j if edge_weight is None else edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.out_channels}, num_layers={self.num_layers})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gatv2_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gatv2_conv.py new file mode 100644 index 00000000..7e8b5956 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gatv2_conv.py @@ -0,0 +1,358 @@ +import typing +from typing import Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.typing import ( + Adj, + NoneType, + OptTensor, + PairTensor, + SparseTensor, + paddle_sparse, +) +from paddle_geometric.utils import ( + add_self_loops, + is_paddle_sparse_tensor, + remove_self_loops, + softmax, +) +from paddle_geometric.utils.sparse import set_sparse_value + +from typing import overload + +class GATv2Conv(MessagePassing): + r"""The GATv2 operator from the `"How Attentive are Graph Attention + Networks?" `_ paper, which fixes the + static attention problem of the standard + :class:`~paddle_geometric.conv.GATConv` layer. + Since the linear layers in the standard GAT are applied right after each + other, the ranking of attended nodes is unconditioned on the query node. + In contrast, in :class:`GATv2`, every node can attend to any other node. + + .. math:: + \mathbf{x}^{\prime}_i = \sum_{j \in \mathcal{N}(i) \cup \{ i \}} + \alpha_{i,j}\mathbf{\Theta}_{t}\mathbf{x}_{j}, + + where the attention coefficients :math:`\alpha_{i,j}` are computed as + + .. math:: + \alpha_{i,j} = + \frac{ + \exp\left(\mathbf{a}^{\top}\mathrm{LeakyReLU}\left( + \mathbf{\Theta}_{s} \mathbf{x}_i + \mathbf{\Theta}_{t} \mathbf{x}_j + \right)\right)} + {\sum_{k \in \mathcal{N}(i) \cup \{ i \}} + \exp\left(\mathbf{a}^{\top}\mathrm{LeakyReLU}\left( + \mathbf{\Theta}_{s} \mathbf{x}_i + \mathbf{\Theta}_{t} \mathbf{x}_k + \right)\right)}. + + If the graph has multi-dimensional edge features :math:`\mathbf{e}_{i,j}`, + the attention coefficients :math:`\alpha_{i,j}` are computed as + + .. math:: + \alpha_{i,j} = + \frac{ + \exp\left(\mathbf{a}^{\top}\mathrm{LeakyReLU}\left( + \mathbf{\Theta}_{s} \mathbf{x}_i + + \mathbf{\Theta}_{t} \mathbf{x}_j + + \mathbf{\Theta}_{e} \mathbf{e}_{i,j} + \right)\right)} + {\sum_{k \in \mathcal{N}(i) \cup \{ i \}} + \exp\left(\mathbf{a}^{\top}\mathrm{LeakyReLU}\left( + \mathbf{\Theta}_{s} \mathbf{x}_i + + \mathbf{\Theta}_{t} \mathbf{x}_k + + \mathbf{\Theta}_{e} \mathbf{e}_{i,k}]) + \right)\right)}. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities in case of a bipartite graph. + out_channels (int): Size of each output sample. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + edge_dim (int, optional): Edge feature dimensionality (in case + there are any). (default: :obj:`None`) + fill_value (float or paddle.Tensor or str, optional): The way to + generate edge features of self-loops + (in case :obj:`edge_dim != None`). + If given as :obj:`float` or :class:`paddle.Tensor`, edge features of + self-loops will be directly given by :obj:`fill_value`. + If given as :obj:`str`, edge features of self-loops are computed by + aggregating all features of edges that point to the specific node, + according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`, + :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`"mean"`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + share_weights (bool, optional): If set to :obj:`True`, the same matrix + will be applied to the source and the target node of every edge, + *i.e.* :math:`\mathbf{\Theta}_{s} = \mathbf{\Theta}_{t}`. + (default: :obj:`False`) + residual (bool, optional): If set to :obj:`True`, the layer will add + a learnable skip-connection. (default: :obj:`False`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, H * F_{out})` or + :math:`((|\mathcal{V_t}|, H * F_{out})` if bipartite. + If :obj:`return_attention_weights=True`, then + :math:`((|\mathcal{V}|, H * F_{out}), + ((2, |\mathcal{E}|), (|\mathcal{E}|, H)))` + or :math:`((|\mathcal{V_t}|, H * F_{out}), ((2, |\mathcal{E}|), + (|\mathcal{E}|, H)))` if bipartite + """ + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + heads: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + dropout: float = 0.0, + add_self_loops: bool = True, + edge_dim: Optional[int] = None, + fill_value: Union[float, Tensor, str] = 'mean', + bias: bool = True, + share_weights: bool = False, + residual: bool = False, + **kwargs, + ): + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + self.add_self_loops = add_self_loops + self.edge_dim = edge_dim + self.fill_value = fill_value + self.residual = residual + self.share_weights = share_weights + + if isinstance(in_channels, int): + self.lin_l = paddle.nn.Linear(in_channels, heads * out_channels, bias_attr=bias) + if share_weights: + self.lin_r = self.lin_l + else: + self.lin_r = paddle.nn.Linear(in_channels, heads * out_channels, bias_attr=bias) + else: + self.lin_l = paddle.nn.Linear(in_channels[0], heads * out_channels, bias_attr=bias) + if share_weights: + self.lin_r = self.lin_l + else: + self.lin_r = paddle.nn.Linear(in_channels[1], heads * out_channels, bias_attr=bias) + + self.att = self.create_parameter([1, heads, out_channels]) + + if edge_dim is not None: + self.lin_edge = paddle.nn.Linear(edge_dim, heads * out_channels, bias_attr=False) + else: + self.lin_edge = None + + # The number of output channels: + total_out_channels = out_channels * (heads if concat else 1) + + if residual: + self.res = paddle.nn.Linear( + in_channels + if isinstance(in_channels, int) else in_channels[1], + total_out_channels, + bias_attr=False, + ) + else: + self.res = None + + if bias: + self.bias = self.create_parameter([total_out_channels]) + else: + self.bias = None + + self.reset_parameters() + def reset_parameters(self): + super().reset_parameters() + self.lin_l.weight.set_value(paddle.nn.initializer.XavierUniform()(self.lin_l.weight.shape)) + self.lin_r.weight.set_value(paddle.nn.initializer.XavierUniform()(self.lin_r.weight.shape)) + if self.lin_edge is not None: + self.lin_edge.weight.set_value(paddle.nn.initializer.XavierUniform()(self.lin_edge.weight.shape)) + if self.res is not None: + self.res.weight.set_value(paddle.nn.initializer.XavierUniform()(self.res.weight.shape)) + glorot(self.att) + zeros(self.bias) + + def forward( + self, + x: Union[Tensor, Tuple[Tensor, Tensor]], + edge_index: Union[Tensor, SparseTensor], + edge_attr: Optional[Tensor] = None, + return_attention_weights: Optional[bool] = None, + ) -> Union[ + Tensor, + Tuple[Tensor, Tuple[Tensor, Tensor]], + Tuple[Tensor, SparseTensor], + ]: + r"""Runs the forward pass of the module. + + Args: + x (paddle.Tensor or (paddle.Tensor, paddle.Tensor)): The input node + features. + edge_index (paddle.Tensor or SparseTensor): The edge indices. + edge_attr (paddle.Tensor, optional): The edge features. + (default: :obj:`None`) + return_attention_weights (bool, optional): If set to :obj:`True`, + will additionally return the tuple + :obj:`(edge_index, attention_weights)`, holding the computed + attention weights for each edge. (default: :obj:`None`) + """ + H, C = self.heads, self.out_channels + + res: Optional[Tensor] = None + + x_l: Optional[Tensor] = None + x_r: Optional[Tensor] = None + if isinstance(x, Tensor): + assert x.ndim == 2 + + if self.res is not None: + res = self.res(x) + + x_l = self.lin_l(x).reshape([-1, H, C]) + if self.share_weights: + x_r = x_l + else: + x_r = self.lin_r(x).reshape([-1, H, C]) + else: + x_l, x_r = x + assert x_l.ndim == 2 + + if x_r is not None and self.res is not None: + res = self.res(x_r) + + x_l = self.lin_l(x_l).reshape([-1, H, C]) + if x_r is not None: + x_r = self.lin_r(x_r).reshape([-1, H, C]) + + assert x_l is not None + assert x_r is not None + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + num_nodes = x_l.shape[0] + if x_r is not None: + num_nodes = min(num_nodes, x_r.shape[0]) + edge_index, edge_attr = remove_self_loops(edge_index, edge_attr) + edge_index, edge_attr = add_self_loops( + edge_index, edge_attr, fill_value=self.fill_value, num_nodes=num_nodes) + elif isinstance(edge_index, SparseTensor): + if self.edge_dim is None: + edge_index = edge_index.set_diag() + else: + raise NotImplementedError( + "The usage of 'edge_attr' and 'add_self_loops' " + "simultaneously is currently not yet supported for " + "'edge_index' in a 'SparseTensor' form") + + alpha = self.edge_updater(edge_index, x=(x_l, x_r), edge_attr=edge_attr) + + out = self.propagate(edge_index, x=(x_l, x_r), alpha=alpha) + + if self.concat: + out = out.reshape([-1, self.heads * self.out_channels]) + else: + out = out.mean(axis=1) + + if res is not None: + out = out + res + + if self.bias is not None: + out = out + self.bias + + if isinstance(return_attention_weights, bool): + if isinstance(edge_index, Tensor): + return out, (edge_index, alpha) + elif isinstance(edge_index, SparseTensor): + return out, edge_index.set_value(alpha) + else: + return out + + def edge_update(self, x_j: Tensor, x_i: Tensor, edge_attr: Optional[Tensor], + index: Tensor, ptr: Optional[Tensor], + dim_size: Optional[int]) -> Tensor: + """ + Update edge features. + + Args: + x_j (Tensor): Source node features. + x_i (Tensor): Target node features. + edge_attr (Optional[Tensor]): Edge features. + index (Tensor): Edge indices. + ptr (Optional[Tensor]): Pointer tensor for segment operation. + dim_size (Optional[int]): Dimension size for segment operation. + + Returns: + Tensor: Updated edge attention scores. + """ + x = x_i + x_j + + if edge_attr is not None: + if edge_attr.ndim == 1: + edge_attr = edge_attr.unsqueeze(-1) + assert self.lin_edge is not None + edge_attr = self.lin_edge(edge_attr) + edge_attr = edge_attr.reshape([-1, self.heads, self.out_channels]) + x = x + edge_attr + + x = F.leaky_relu(x, negative_slope=self.negative_slope) + alpha = paddle.sum(x * self.att, axis=-1) + alpha = softmax(alpha, index, ptr, dim_size) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + return alpha + + def message(self, x_j: Tensor, alpha: Tensor) -> Tensor: + """ + Compute the message for aggregation. + + Args: + x_j (Tensor): Source node features. + alpha (Tensor): Attention scores. + + Returns: + Tensor: Weighted message for aggregation. + """ + return x_j * alpha.unsqueeze(-1) + + def __repr__(self) -> str: + """ + String representation of the class. + + Returns: + str: Class representation. + """ + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gcn2_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gcn2_conv.py new file mode 100644 index 00000000..ac804823 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gcn2_conv.py @@ -0,0 +1,115 @@ +import math +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear +from paddle.nn.initializer import XavierUniform + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, SparseTensor +from paddle_geometric.utils import spmm + + +class GCN2Conv(MessagePassing): + r"""The graph convolutional operator with initial residual connections and + identity mapping (GCNII) from the `"Simple and Deep Graph Convolutional + Networks" `_ paper. + """ + + def __init__(self, channels: int, alpha: float, theta: float = None, + layer: int = None, shared_weights: bool = True, + cached: bool = False, add_self_loops: bool = True, + normalize: bool = True, **kwargs): + + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.channels = channels + self.alpha = alpha + self.beta = 1. + if theta is not None or layer is not None: + assert theta is not None and layer is not None + self.beta = math.log(theta / layer + 1) + self.cached = cached + self.normalize = normalize + self.add_self_loops = add_self_loops + + self._cached_edge_index = None + self._cached_adj_t = None + + self.weight1 = self.create_parameter( + shape=[channels, channels], + default_initializer=XavierUniform() + ) + + if shared_weights: + self.weight2 = None + else: + self.weight2 = self.create_parameter( + shape=[channels, channels], + default_initializer=XavierUniform() + ) + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.weight1) + if self.weight2 is not None: + paddle.nn.initializer.XavierUniform()(self.weight2) + self._cached_edge_index = None + self._cached_adj_t = None + + def forward(self, x: Tensor, x_0: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + if self.normalize: + if isinstance(edge_index, Tensor): + cache = self._cached_edge_index + if cache is None: + edge_index, edge_weight = gcn_norm( + edge_index, edge_weight, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + if self.cached: + self._cached_edge_index = (edge_index, edge_weight) + else: + edge_index, edge_weight = cache + + elif isinstance(edge_index, SparseTensor): + cache = self._cached_adj_t + if cache is None: + edge_index = gcn_norm( + edge_index, edge_weight, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + if self.cached: + self._cached_adj_t = edge_index + else: + edge_index = cache + + x = self.propagate(edge_index, x=x, edge_weight=edge_weight) + + x *= (1 - self.alpha) + x_0 = self.alpha * x_0[:x.shape[0]] + + if self.weight2 is None: + out = x + x_0 + out = paddle.addmm(out, out, self.weight1, beta=1. - self.beta, + alpha=self.beta) + else: + out = paddle.addmm(x, x, self.weight1, beta=1. - self.beta, + alpha=self.beta) + out += paddle.addmm(x_0, x_0, self.weight2, beta=1. - self.beta, + alpha=self.beta) + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.channels}, ' + f'alpha={self.alpha}, beta={self.beta})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gcn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gcn_conv.py new file mode 100644 index 00000000..cae1d99c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gcn_conv.py @@ -0,0 +1,259 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import zeros +from paddle_geometric.typing import ( + Adj, + OptPairTensor, + OptTensor, + SparseTensor, + paddle_sparse, +) +from paddle_geometric.utils import add_remaining_self_loops +from paddle_geometric.utils import add_self_loops as add_self_loops_fn +from paddle_geometric.utils import ( + is_paddle_sparse_tensor, + scatter, + spmm, + to_edge_index, +) +from paddle_geometric.utils.num_nodes import maybe_num_nodes +from paddle_geometric.utils.sparse import set_sparse_value + + +def gcn_norm( # noqa: F811 + edge_index: Adj, + edge_weight: OptTensor = None, + num_nodes: Optional[int] = None, + improved: bool = False, + add_self_loops: bool = True, + flow: str = "source_to_target", + dtype: Optional[paddle.dtype] = None, +): + fill_value = 2. if improved else 1. + + if isinstance(edge_index, SparseTensor): + assert edge_index.size(0) == edge_index.size(1) + + adj_t = edge_index + + if not adj_t.has_value(): + adj_t = adj_t.fill_value(1., dtype=dtype) + if add_self_loops: + adj_t = paddle_sparse.fill_diag(adj_t, fill_value) + + deg = paddle_sparse.sum(adj_t, dim=1) + deg_inv_sqrt = deg.pow_(-0.5) + deg_inv_sqrt.masked_fill_(deg_inv_sqrt == float('inf'), 0.) + adj_t = paddle_sparse.mul(adj_t, deg_inv_sqrt.view(-1, 1)) + adj_t = paddle_sparse.mul(adj_t, deg_inv_sqrt.view(1, -1)) + + return adj_t + + if is_paddle_sparse_tensor(edge_index): + assert edge_index.size(0) == edge_index.size(1) + + if edge_index.layout == paddle.sparse_csc: + raise NotImplementedError("Sparse CSC matrices are not yet " + "supported in 'gcn_norm'") + + adj_t = edge_index + if add_self_loops: + adj_t, _ = add_self_loops_fn(adj_t, None, fill_value, num_nodes) + + edge_index, value = to_edge_index(adj_t) + col, row = edge_index[0], edge_index[1] + + deg = scatter(value, col, 0, dim_size=num_nodes, reduce='sum') + deg_inv_sqrt = deg.pow_(-0.5) + deg_inv_sqrt.masked_fill_(deg_inv_sqrt == float('inf'), 0) + value = deg_inv_sqrt[row] * value * deg_inv_sqrt[col] + + return set_sparse_value(adj_t, value), None + + assert flow in ['source_to_target', 'target_to_source'] + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + if add_self_loops: + edge_index, edge_weight = add_remaining_self_loops( + edge_index, edge_weight, fill_value, num_nodes) + + if edge_weight is None: + edge_weight = paddle.ones([edge_index.shape[1]], dtype=dtype) + + row, col = edge_index[0], edge_index[1] + idx = col if flow == 'source_to_target' else row + deg = scatter(edge_weight, idx, dim=0, dim_size=num_nodes, reduce='sum') + deg_inv_sqrt = deg.pow_(-0.5) + deg_inv_sqrt.masked_fill_(deg_inv_sqrt == float('inf'), 0) + edge_weight = deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col] + + return edge_index, edge_weight + + +class GCNConv(MessagePassing): + r"""The graph convolutional operator from the `"Semi-supervised + Classification with Graph Convolutional Networks" + `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}} + \mathbf{\hat{D}}^{-1/2} \mathbf{X} \mathbf{\Theta}, + + where :math:`\mathbf{\hat{A}} = \mathbf{A} + \mathbf{I}` denotes the + adjacency matrix with inserted self-loops and + :math:`\hat{D}_{ii} = \sum_{j=0} \hat{A}_{ij}` its diagonal degree matrix. + The adjacency matrix can include other values than :obj:`1` representing + edge weights via the optional :obj:`edge_weight` tensor. + + Its node-wise formulation is given by: + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{\Theta}^{\top} \sum_{j \in + \mathcal{N}(i) \cup \{ i \}} \frac{e_{j,i}}{\sqrt{\hat{d}_j + \hat{d}_i}} \mathbf{x}_j + + with :math:`\hat{d}_i = 1 + \sum_{j \in \mathcal{N}(i)} e_{j,i}`, where + :math:`e_{j,i}` denotes the edge weight from source node :obj:`j` to target + node :obj:`i` (default: :obj:`1.0`) + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + improved (bool, optional): If set to :obj:`True`, the layer computes + :math:`\mathbf{\hat{A}}` as :math:`\mathbf{A} + 2\mathbf{I}`. + (default: :obj:`False`) + cached (bool, optional): If set to :obj:`True`, the layer will cache + the computation of :math:`\mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}} + \mathbf{\hat{D}}^{-1/2}` on first execution, and will use the + cached version for further executions. + This parameter should only be set to :obj:`True` in transductive + learning scenarios. (default: :obj:`False`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. By default, self-loops will be added + in case :obj:`normalize` is set to :obj:`True`, and not added + otherwise. (default: :obj:`None`) + normalize (bool, optional): Whether to add self-loops and compute + symmetric normalization coefficients on-the-fly. + (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)` + or sparse matrix :math:`(|\mathcal{V}|, |\mathcal{V}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + _cached_edge_index: Optional[OptPairTensor] + _cached_adj_t: Optional[SparseTensor] + + def __init__( + self, + in_channels: int, + out_channels: int, + improved: bool = False, + cached: bool = False, + add_self_loops: Optional[bool] = None, + normalize: bool = True, + bias: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + if add_self_loops is None: + add_self_loops = normalize + + if add_self_loops and not normalize: + raise ValueError(f"'{self.__class__.__name__}' does not support " + f"adding self-loops to the graph when no " + f"on-the-fly normalization is applied") + + self.in_channels = in_channels + self.out_channels = out_channels + self.improved = improved + self.cached = cached + self.add_self_loops = add_self_loops + self.normalize = normalize + + self._cached_edge_index = None + self._cached_adj_t = None + + self.lin = Linear(in_channels, out_channels, bias=False, + weight_initializer='glorot') + + if bias: + self.bias = paddle.create_parameter(shape=[in_channels], dtype='float32') + else: + self.register_parameter('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin.reset_parameters() + zeros(self.bias) + self._cached_edge_index = None + self._cached_adj_t = None + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + if isinstance(x, (tuple, list)): + raise ValueError(f"'{self.__class__.__name__}' received a tuple " + f"of node features as input while this layer " + f"does not support bipartite message passing. " + f"Please try other layers such as 'SAGEConv' or " + f"'GraphConv' instead") + + + if self.normalize: + if isinstance(edge_index, Tensor): + + cache = self._cached_edge_index + if cache is None: + edge_index, edge_weight = gcn_norm( # yapf: disable + edge_index, edge_weight, x.shape[self.node_dim], + self.improved, self.add_self_loops, self.flow, x.dtype) + + if self.cached: + self._cached_edge_index = (edge_index, edge_weight) + else: + edge_index, edge_weight = cache[0], cache[1] + + elif isinstance(edge_index, SparseTensor): + cache = self._cached_adj_t + if cache is None: + edge_index = gcn_norm( # yapf: disable + edge_index, edge_weight, x.size(self.node_dim), + self.improved, self.add_self_loops, self.flow, x.dtype) + if self.cached: + self._cached_adj_t = edge_index + else: + edge_index = cache + + x = self.lin(x) + + # propagate_type: (x: Tensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, edge_weight=edge_weight) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.reshape([-1, 1]) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gen_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gen_conv.py new file mode 100644 index 00000000..afc86463 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gen_conv.py @@ -0,0 +1,155 @@ +from typing import Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear, BatchNorm1D, LayerNorm, InstanceNorm1D, ReLU, Dropout, Sequential +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, Size +from paddle_geometric.nn.aggr import Aggregation, MultiAggregation +from paddle_geometric.nn.norm import MessageNorm + + +class MLP(Sequential): + def __init__(self, channels: list, norm: Optional[str] = None, + bias: bool = True, dropout: float = 0.0): + layers = [] + for i in range(1, len(channels)): + layers.append(Linear(channels[i - 1], channels[i], bias_attr=bias)) + + if i < len(channels) - 1: + if norm == 'batch': + layers.append(BatchNorm1D(channels[i])) + elif norm == 'layer': + layers.append(LayerNorm(channels[i])) + elif norm == 'instance': + layers.append(InstanceNorm1D(channels[i])) + elif norm: + raise NotImplementedError(f'Normalization layer "{norm}" not supported.') + + layers.append(ReLU()) + layers.append(Dropout(dropout)) + + super().__init__(*layers) + + +class GENConv(MessagePassing): + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + aggr: Optional[Union[str, list, Aggregation]] = 'softmax', + t: float = 1.0, + learn_t: bool = False, + p: float = 1.0, + learn_p: bool = False, + msg_norm: bool = False, + learn_msg_scale: bool = False, + norm: str = 'batch', + num_layers: int = 2, + expansion: int = 2, + eps: float = 1e-7, + bias: bool = False, + edge_dim: Optional[int] = None, + **kwargs, + ): + + # Backward compatibility: + semi_grad = True if aggr == 'softmax_sg' else False + aggr = 'softmax' if aggr == 'softmax_sg' else aggr + aggr = 'powermean' if aggr == 'power' else aggr + + if 'aggr_kwargs' not in kwargs: + if aggr == 'softmax': + kwargs['aggr_kwargs'] = dict(t=t, learn=learn_t, semi_grad=semi_grad) + elif aggr == 'powermean': + kwargs['aggr_kwargs'] = dict(p=p, learn=learn_p) + + super().__init__(aggr=aggr, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.eps = eps + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + if in_channels[0] != out_channels: + self.lin_src = Linear(in_channels[0], out_channels, bias_attr=bias) + + if edge_dim is not None and edge_dim != out_channels: + self.lin_edge = Linear(edge_dim, out_channels, bias_attr=bias) + + if isinstance(self.aggr_module, MultiAggregation): + aggr_out_channels = self.aggr_module.get_out_channels(out_channels) + else: + aggr_out_channels = out_channels + + if aggr_out_channels != out_channels: + self.lin_aggr_out = Linear(aggr_out_channels, out_channels, bias_attr=bias) + + if in_channels[1] != out_channels: + self.lin_dst = Linear(in_channels[1], out_channels, bias_attr=bias) + + channels = [out_channels] + for i in range(num_layers - 1): + channels.append(out_channels * expansion) + channels.append(out_channels) + self.mlp = MLP(channels, norm=norm, bias=bias) + + if msg_norm: + self.msg_norm = MessageNorm(learn_msg_scale) + + def reset_parameters(self): + self.mlp.apply(lambda layer: layer.reset_parameters() if hasattr(layer, 'reset_parameters') else None) + if hasattr(self, 'msg_norm'): + self.msg_norm.reset_parameters() + if hasattr(self, 'lin_src'): + self.lin_src.reset_parameters() + if hasattr(self, 'lin_edge'): + self.lin_edge.reset_parameters() + if hasattr(self, 'lin_aggr_out'): + self.lin_aggr_out.reset_parameters() + if hasattr(self, 'lin_dst'): + self.lin_dst.reset_parameters() + + def forward(self, x: Union[Tensor, OptPairTensor], edge_index: Adj, + edge_attr: OptTensor = None, size: Size = None) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + if hasattr(self, 'lin_src'): + x = (self.lin_src(x[0]), x[1]) + + # propagate_type: (x: OptPairTensor, edge_attr: OptTensor) + out = self.propagate(edge_index, x=x, edge_attr=edge_attr, size=size) + + if hasattr(self, 'lin_aggr_out'): + out = self.lin_aggr_out(out) + + if hasattr(self, 'msg_norm'): + h = x[1] if x[1] is not None else x[0] + assert h is not None + out = self.msg_norm(h, out) + + x_dst = x[1] + if x_dst is not None: + if hasattr(self, 'lin_dst'): + x_dst = self.lin_dst(x_dst) + out = out + x_dst + + return self.mlp(out) + + def message(self, x_j: Tensor, edge_attr: OptTensor) -> Tensor: + if edge_attr is not None and hasattr(self, 'lin_edge'): + edge_attr = self.lin_edge(edge_attr) + + if edge_attr is not None: + assert x_j.shape[-1] == edge_attr.shape[-1] + + msg = x_j if edge_attr is None else x_j + edge_attr + return msg.relu(msg) + self.eps + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, aggr={self.aggr})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/general_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/general_conv.py new file mode 100644 index 00000000..6f3dc91c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/general_conv.py @@ -0,0 +1,124 @@ +from typing import Union, Tuple, Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, Linear, Identity, LayerList +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.utils import softmax + +class GeneralConv(MessagePassing): + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: Optional[int], + in_edge_channels: Optional[int] = None, + aggr: str = "add", + skip_linear: str = False, + directed_msg: bool = True, + heads: int = 1, + attention: bool = False, + attention_type: str = "additive", + l2_normalize: bool = False, + bias: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', aggr) + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.in_edge_channels = in_edge_channels + self.aggr = aggr + self.skip_linear = skip_linear + self.directed_msg = directed_msg + self.heads = heads + self.attention = attention + self.attention_type = attention_type + self.normalize_l2 = l2_normalize + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + if self.directed_msg: + self.lin_msg = Linear(in_channels[0], out_channels * self.heads, bias_attr=bias) + else: + self.lin_msg = Linear(in_channels[0], out_channels * self.heads, bias_attr=bias) + self.lin_msg_i = Linear(in_channels[0], out_channels * self.heads, bias_attr=bias) + + if self.skip_linear or self.in_channels != self.out_channels: + self.lin_self = Linear(in_channels[1], out_channels, bias_attr=bias) + else: + self.lin_self = Identity() + + if self.in_edge_channels is not None: + self.lin_edge = Linear(in_edge_channels, out_channels * self.heads, bias_attr=bias) + + # Attention parameters + if self.attention: + if self.attention_type == 'additive': + self.att_msg = self.create_parameter( + shape=[1, self.heads, self.out_channels], + default_initializer=paddle.nn.initializer.XavierUniform()) + elif self.attention_type == 'dot_product': + self.scaler = paddle.to_tensor(paddle.sqrt(paddle.to_tensor(out_channels, dtype='float32'))) + else: + raise ValueError(f"Attention type '{self.attention_type}' not supported") + + self.reset_parameters() + + def reset_parameters(self): + self.lin_msg.weight.set_value(paddle.nn.initializer.XavierUniform()(self.lin_msg.weight.shape)) + if hasattr(self.lin_self, 'reset_parameters'): + self.lin_self.reset_parameters() + if self.in_edge_channels is not None: + self.lin_edge.weight.set_value(paddle.nn.initializer.XavierUniform()(self.lin_edge.weight.shape)) + if self.attention and self.attention_type == 'additive': + paddle.nn.initializer.XavierUniform()(self.att_msg) + + def forward( + self, + x: Union[Tensor, Tuple[Tensor, Tensor]], + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Tuple[int, int]] = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + x_self = x[1] + + # propagate_type: (x: Tuple[Tensor, Tensor], edge_attr: Tensor) + out = self.propagate(edge_index, x=x, size=size, edge_attr=edge_attr) + out = out.mean(axis=1) # Aggregating heads + out = out + self.lin_self(x_self) + if self.normalize_l2: + out = F.normalize(out, p=2, axis=-1) + return out + + def message_basic(self, x_i: Tensor, x_j: Tensor, edge_attr: Optional[Tensor]): + if self.directed_msg: + x_j = self.lin_msg(x_j) + else: + x_j = self.lin_msg(x_j) + self.lin_msg_i(x_i) + if edge_attr is not None: + x_j = x_j + self.lin_edge(edge_attr) + return x_j + + def message(self, x_i: Tensor, x_j: Tensor, edge_index_i: Tensor, + size_i: Tensor, edge_attr: Tensor) -> Tensor: + x_j_out = self.message_basic(x_i, x_j, edge_attr) + x_j_out = x_j_out.reshape([-1, self.heads, self.out_channels]) + if self.attention: + if self.attention_type == 'dot_product': + x_i_out = self.message_basic(x_j, x_i, edge_attr) + x_i_out = x_i_out.reshape([-1, self.heads, self.out_channels]) + alpha = paddle.sum(x_i_out * x_j_out, axis=-1) / self.scaler + else: + alpha = paddle.sum(x_j_out * self.att_msg, axis=-1) + alpha = F.leaky_relu(alpha, negative_slope=0.2) + alpha = softmax(alpha, edge_index_i, num_nodes=size_i) + alpha = alpha.reshape([-1, self.heads, 1]) + return x_j_out * alpha + else: + return x_j_out diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gin_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gin_conv.py new file mode 100644 index 00000000..b5302226 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gin_conv.py @@ -0,0 +1,111 @@ +from typing import Callable, Optional, Union, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.utils import spmm + + +class GINConv(MessagePassing): + def __init__(self, nn: Callable, eps: float = 0.0, train_eps: bool = False, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + self.nn = nn + self.initial_eps = eps + if train_eps: + self.eps = self.create_parameter([1], default_initializer=paddle.nn.initializer.Constant(eps)) + else: + self.eps = paddle.to_tensor(eps) + self.reset_parameters() + + def reset_parameters(self): + self.nn.apply(lambda layer: layer.reset_parameters() if hasattr(layer, 'reset_parameters') else None) + if isinstance(self.eps, Tensor): + self.eps.fill_(self.initial_eps) + + def forward( + self, + x: Union[Tensor, Tuple[Tensor, Tensor]], + edge_index: Tensor, + size: Optional[Tuple[int, int]] = None, + ) -> Tensor: + if isinstance(x, Tensor): + x = (x, x) + + out = self.propagate(edge_index, x=x, size=size) + + x_r = x[1] + if x_r is not None: + out = out + (1 + self.eps) * x_r + + return self.nn(out) + + def message(self, x_j: Tensor) -> Tensor: + return x_j + + def message_and_aggregate(self, adj_t: Tensor, x: Tuple[Tensor, Tensor]) -> Tensor: + return spmm(adj_t, x[0], reduce=self.aggr) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(nn={self.nn})' + + +class GINEConv(MessagePassing): + def __init__(self, nn: Layer, eps: float = 0.0, train_eps: bool = False, edge_dim: Optional[int] = None, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + self.nn = nn + self.initial_eps = eps + if train_eps: + self.eps = self.create_parameter([1], default_initializer=paddle.nn.initializer.Constant(eps)) + else: + self.eps = paddle.to_tensor(eps) + if edge_dim is not None: + if hasattr(self.nn[0], 'weight'): + in_channels = self.nn[0].weight.shape[0] + else: + raise ValueError("Could not infer input channels from `nn`.") + self.lin = Linear(edge_dim, in_channels) + else: + self.lin = None + self.reset_parameters() + + def reset_parameters(self): + self.nn.apply(lambda layer: layer.reset_parameters() if hasattr(layer, 'reset_parameters') else None) + if isinstance(self.eps, Tensor): + self.eps.fill_(self.initial_eps) + if self.lin is not None: + self.lin.reset_parameters() + + def forward( + self, + x: Union[Tensor, Tuple[Tensor, Tensor]], + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Tuple[int, int]] = None, + ) -> Tensor: + if isinstance(x, Tensor): + x = (x, x) + + out = self.propagate(edge_index, x=x, edge_attr=edge_attr, size=size) + + x_r = x[1] + if x_r is not None: + out = out + (1 + self.eps) * x_r + + return self.nn(out) + + def message(self, x_j: Tensor, edge_attr: Tensor) -> Tensor: + if self.lin is None and x_j.shape[-1] != edge_attr.shape[-1]: + raise ValueError("Node and edge feature dimensionalities do not match. Set 'edge_dim' for 'GINEConv'.") + + if self.lin is not None: + edge_attr = self.lin(edge_attr) + + return paddle.nn.functional.relu(x_j + edge_attr) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(nn={self.nn})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gmm_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gmm_conv.py new file mode 100644 index 00000000..2b0397e7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gmm_conv.py @@ -0,0 +1,172 @@ +from typing import Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear +from paddle.nn.initializer import XavierNormal, Constant + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, Size + + +class GMMConv(MessagePassing): + r"""The gaussian mixture model convolutional operator from the `"Geometric + Deep Learning on Graphs and Manifolds using Mixture Model CNNs" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{1}{|\mathcal{N}(i)|} + \sum_{j \in \mathcal{N}(i)} \frac{1}{K} \sum_{k=1}^K + \mathbf{w}_k(\mathbf{e}_{i,j}) \odot \mathbf{\Theta}_k \mathbf{x}_j, + + where + + .. math:: + \mathbf{w}_k(\mathbf{e}) = \exp \left( -\frac{1}{2} {\left( + \mathbf{e} - \mathbf{\mu}_k \right)}^{\top} \Sigma_k^{-1} + \left( \mathbf{e} - \mathbf{\mu}_k \right) \right) + + denotes a weighting function based on trainable mean vector + :math:`\mathbf{\mu}_k` and diagonal covariance matrix + :math:`\mathbf{\Sigma}_k`. + + .. note:: + + The edge attribute :math:`\mathbf{e}_{ij}` is usually given by + :math:`\mathbf{e}_{ij} = \mathbf{p}_j - \mathbf{p}_i`, where + :math:`\mathbf{p}_i` denotes the position of node :math:`i` (see + :class:`paddle_geometric.transform.Cartesian`). + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + dim (int): Pseudo-coordinate dimensionality. + kernel_size (int): Number of kernels :math:`K`. + separate_gaussians (bool, optional): If set to :obj:`True`, will + learn separate GMMs for every pair of input and output channel, + inspired by traditional CNNs. (default: :obj:`False`) + aggr (str, optional): The aggregation operator to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"mean"`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add transformed root node features to the output. + (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V_t}|, F_{out})` if bipartite + """ + def __init__(self, in_channels: Union[int, Tuple[int, int]], + out_channels: int, dim: int, kernel_size: int, + separate_gaussians: bool = False, aggr: str = 'mean', + root_weight: bool = True, bias: bool = True, **kwargs): + super().__init__(aggr=aggr, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.dim = dim + self.kernel_size = kernel_size + self.separate_gaussians = separate_gaussians + self.root_weight = root_weight + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + self.rel_in_channels = in_channels[0] + + if in_channels[0] > 0: + self.g = self.create_parameter( + [in_channels[0], out_channels * kernel_size], + default_initializer=XavierNormal()) + if not self.separate_gaussians: + self.mu = self.create_parameter([kernel_size, dim], default_initializer=XavierNormal()) + self.sigma = self.create_parameter([kernel_size, dim], default_initializer=XavierNormal()) + else: + self.mu = self.create_parameter([in_channels[0], out_channels, kernel_size, dim], + default_initializer=XavierNormal()) + self.sigma = self.create_parameter([in_channels[0], out_channels, kernel_size, dim], + default_initializer=XavierNormal()) + else: + self.g = None + self.mu = None + self.sigma = None + self._hook = self.register_forward_pre_hook(self.initialize_parameters) + + if root_weight: + self.root = Linear(in_channels[1], out_channels, bias_attr=False) + + if bias: + self.bias = self.create_parameter([out_channels], default_initializer=zeros) + else: + self.bias = None + + def initialize_parameters(self, layer, input): + if self.g is None: + x = input[0][0] if isinstance(input, tuple) else input[0] + in_channels = x.shape[-1] + self.g = self.create_parameter([in_channels, self.out_channels * self.kernel_size], + default_initializer=XavierNormal()) + if not self.separate_gaussians: + self.mu = self.create_parameter([self.kernel_size, self.dim], default_initializer=XavierNormal()) + self.sigma = self.create_parameter([self.kernel_size, self.dim], default_initializer=XavierNormal()) + else: + self.mu = self.create_parameter([in_channels, self.out_channels, self.kernel_size, self.dim], + default_initializer=XavierNormal()) + self.sigma = self.create_parameter([in_channels, self.out_channels, self.kernel_size, self.dim], + default_initializer=XavierNormal()) + layer._hook.remove() + del layer._hook + + def forward(self, x: Union[Tensor, OptPairTensor], edge_index: Adj, + edge_attr: OptTensor = None, size: Size = None) -> Tensor: + if isinstance(x, Tensor): + x = (x, x) + + if not self.separate_gaussians: + out: OptPairTensor = (paddle.matmul(x[0], self.g), x[1]) + out = self.propagate(edge_index, x=out, edge_attr=edge_attr, size=size) + else: + out = self.propagate(edge_index, x=x, edge_attr=edge_attr, size=size) + + x_r = x[1] + if x_r is not None and self.root is not None: + out = out + self.root(x_r) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, edge_attr: Tensor) -> Tensor: + EPS = 1e-15 + F, M = self.rel_in_channels, self.out_channels + (E, D), K = edge_attr.shape, self.kernel_size + + if not self.separate_gaussians: + gaussian = -0.5 * (edge_attr.reshape([E, 1, D]) - self.mu.reshape([1, K, D])) ** 2 + gaussian = gaussian / (EPS + self.sigma.reshape([1, K, D]) ** 2) + gaussian = paddle.exp(gaussian.sum(axis=-1)) + return (x_j.reshape([E, K, M]) * gaussian.reshape([E, K, 1])).sum(axis=-2) + else: + gaussian = -0.5 * (edge_attr.reshape([E, 1, 1, 1, D]) - self.mu.reshape([1, F, M, K, D])) ** 2 + gaussian = gaussian / (EPS + self.sigma.reshape([1, F, M, K, D]) ** 2) + gaussian = paddle.exp(gaussian.sum(axis=-1)) + gaussian = gaussian * self.g.reshape([1, F, M, K]) + gaussian = gaussian.sum(axis=-1) + return (x_j.reshape([E, F, 1]) * gaussian).sum(axis=-2) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, dim={self.dim})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gps_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gps_conv.py new file mode 100644 index 00000000..2996de49 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gps_conv.py @@ -0,0 +1,177 @@ +import inspect +from typing import Any, Dict, Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Dropout, Linear, Sequential + +from paddle_geometric.nn.attention import PerformerAttention +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.resolver import ( + activation_resolver, + normalization_resolver, +) +from paddle_geometric.utils import to_dense_batch +from paddle_geometric.typing import Adj + + +class GPSConv(paddle.nn.Layer): + r"""The general, powerful, scalable (GPS) graph transformer layer from the + `"Recipe for a General, Powerful, Scalable Graph Transformer" + `_ paper. + + The GPS layer is based on a 3-part recipe: + + 1. Inclusion of positional (PE) and structural encodings (SE) to the input + features (done in a pre-processing step via + :class:`paddle_geometric.transforms`). + 2. A local message passing layer (MPNN) that operates on the input graph. + 3. A global attention layer that operates on the entire graph. + + Args: + channels (int): Size of each input sample. + conv (MessagePassing, optional): The local message passing layer. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + dropout (float, optional): Dropout probability of intermediate + embeddings. (default: :obj:`0.`) + act (str or Callable, optional): The non-linear activation function to + use. (default: :obj:`"relu"`) + act_kwargs (Dict[str, Any], optional): Arguments passed to the + respective activation function defined by :obj:`act`. + (default: :obj:`None`) + norm (str or Callable, optional): The normalization function to + use. (default: :obj:`"batch_norm"`) + norm_kwargs (Dict[str, Any], optional): Arguments passed to the + respective normalization function defined by :obj:`norm`. + (default: :obj:`None`) + attn_type (str): Global attention type, :obj:`multihead` or + :obj:`performer`. (default: :obj:`multihead`) + attn_kwargs (Dict[str, Any], optional): Arguments passed to the + attention layer. (default: :obj:`None`) + """ + def __init__( + self, + channels: int, + conv: Optional[MessagePassing], + heads: int = 1, + dropout: float = 0.0, + act: str = 'relu', + act_kwargs: Optional[Dict[str, Any]] = None, + norm: Optional[str] = 'batch_norm', + norm_kwargs: Optional[Dict[str, Any]] = None, + attn_type: str = 'multihead', + attn_kwargs: Optional[Dict[str, Any]] = None, + ): + super().__init__() + + self.channels = channels + self.conv = conv + self.heads = heads + self.dropout = dropout + self.attn_type = attn_type + + attn_kwargs = attn_kwargs or {} + if attn_type == 'multihead': + self.attn = paddle.nn.MultiHeadAttention( + embed_dim=channels, + num_heads=heads, + **attn_kwargs, + ) + elif attn_type == 'performer': + self.attn = PerformerAttention( + channels=channels, + heads=heads, + **attn_kwargs, + ) + else: + raise ValueError(f'{attn_type} is not supported') + + self.mlp = Sequential( + Linear(channels, channels * 2), + activation_resolver(act, **(act_kwargs or {})), + Dropout(dropout), + Linear(channels * 2, channels), + Dropout(dropout), + ) + + norm_kwargs = norm_kwargs or {} + self.norm1 = normalization_resolver(norm, channels, **norm_kwargs) + self.norm2 = normalization_resolver(norm, channels, **norm_kwargs) + self.norm3 = normalization_resolver(norm, channels, **norm_kwargs) + + self.norm_with_batch = False + if self.norm1 is not None: + signature = inspect.signature(self.norm1.forward) + self.norm_with_batch = 'batch' in signature.parameters + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + if self.conv is not None: + self.conv.reset_parameters() + if hasattr(self.attn, 'reset_parameters'): + self.attn.reset_parameters() + for layer in self.mlp: + if hasattr(layer, 'reset_parameters'): + layer.reset_parameters() + if self.norm1 is not None: + self.norm1.reset_parameters() + if self.norm2 is not None: + self.norm2.reset_parameters() + if self.norm3 is not None: + self.norm3.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Adj, + batch: Optional[Tensor] = None, + **kwargs, + ) -> Tensor: + r"""Runs the forward pass of the module.""" + hs = [] + if self.conv is not None: # Local MPNN. + h = self.conv(x, edge_index, **kwargs) + h = F.dropout(h, p=self.dropout, training=self.training) + h = h + x + if self.norm1 is not None: + if self.norm_with_batch: + h = self.norm1(h, batch=batch) + else: + h = self.norm1(h) + hs.append(h) + + # Global attention transformer-style model. + h, mask = to_dense_batch(x, batch) + + if isinstance(self.attn, paddle.nn.MultiHeadAttention): + h, _ = self.attn(h, h, h, attention_mask=(~mask).astype(paddle.get_default_dtype())) + elif isinstance(self.attn, PerformerAttention): + h = self.attn(h, mask=mask) + + h = h[mask] + h = F.dropout(h, p=self.dropout, training=self.training) + h = h + x # Residual connection. + if self.norm2 is not None: + if self.norm_with_batch: + h = self.norm2(h, batch=batch) + else: + h = self.norm2(h) + hs.append(h) + + out = sum(hs) # Combine local and global outputs. + + out = out + self.mlp(out) + if self.norm3 is not None: + if self.norm_with_batch: + out = self.norm3(out, batch=batch) + else: + out = self.norm3(out) + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.channels}, ' + f'conv={self.conv}, heads={self.heads}, ' + f'attn_type={self.attn_type})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/graph_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/graph_conv.py new file mode 100644 index 00000000..757e4201 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/graph_conv.py @@ -0,0 +1,113 @@ +from typing import Final, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric import EdgeIndex +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, Size +from paddle_geometric.utils import spmm + + +class GraphConv(MessagePassing): + r"""The graph neural network operator from the `"Weisfeiler and Leman Go + Neural: Higher-order Graph Neural Networks" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{W}_1 \mathbf{x}_i + \mathbf{W}_2 + \sum_{j \in \mathcal{N}(i)} e_{j,i} \cdot \mathbf{x}_j + + where :math:`e_{j,i}` denotes the edge weight from source node :obj:`j` to + target node :obj:`i` (default: :obj:`1`) + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"add"`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V}_t|, F_{out})` if bipartite + """ + SUPPORTS_FUSED_EDGE_INDEX: Final[bool] = True + + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + aggr: str = 'add', + bias: bool = True, + **kwargs, + ): + super().__init__(aggr=aggr, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.lin_rel = Linear(in_channels[0], out_channels, bias_attr=bias) + self.lin_root = Linear(in_channels[1], out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin_rel.reset_parameters() + self.lin_root.reset_parameters() + + def forward(self, x: Union[Tensor, OptPairTensor], edge_index: Adj, + edge_weight: OptTensor = None, size: Size = None) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + # propagate_type: (x: OptPairTensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, edge_weight=edge_weight, + size=size) + out = self.lin_rel(out) + + x_r = x[1] + if x_r is not None: + out = out + self.lin_root(x_r) + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate( + self, + edge_index: Adj, + x: OptPairTensor, + edge_weight: OptTensor, + ) -> Tensor: + + if isinstance(edge_index, EdgeIndex): + return edge_index.matmul( + other=x[0], + input_value=edge_weight, + reduce=self.aggr, + transpose_x=True, + ) + + return spmm(edge_index, x[0], reduce=self.aggr) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/gravnet_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/gravnet_conv.py new file mode 100644 index 00000000..43371e10 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/gravnet_conv.py @@ -0,0 +1,127 @@ +import warnings +from typing import Optional, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import OptPairTensor # noqa +from paddle_geometric.typing import OptTensor, PairOptTensor, PairTensor + +knn = None + + +class GravNetConv(MessagePassing): + r"""The GravNet operator from the `"Learning Representations of Irregular + Particle-detector Geometry with Distance-weighted Graph + Networks" `_ paper, where the graph is + dynamically constructed using nearest neighbors. + The neighbors are constructed in a learnable low-dimensional projection of + the feature space. + A second projection of the input feature space is then propagated from the + neighbors to each vertex using distance weights that are derived by + applying a Gaussian function to the distances. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): The number of output channels. + space_dimensions (int): The dimensionality of the space used to + construct the neighbors; referred to as :math:`S` in the paper. + propagate_dimensions (int): The number of features to be propagated + between the vertices; referred to as :math:`F_{\textrm{LR}}` in the + paper. + k (int): The number of nearest neighbors. + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{in}), (|\mathcal{V_t}|, F_{in}))` + if bipartite, + batch vector :math:`(|\mathcal{V}|)` or + :math:`((|\mathcal{V}_s|), (|\mathcal{V}_t|))` if bipartite + *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V}_t|, F_{out})` if bipartite + """ + def __init__(self, in_channels: int, out_channels: int, + space_dimensions: int, propagate_dimensions: int, k: int, + num_workers: Optional[int] = None, **kwargs): + super().__init__(aggr=['mean', 'max'], flow='source_to_target', + **kwargs) + + if knn is None: + raise ImportError('`GravNetConv` requires `torch-cluster`.') + + if num_workers is not None: + warnings.warn( + "'num_workers' attribute in '{self.__class__.__name__}' is " + "deprecated and will be removed in a future release") + + self.in_channels = in_channels + self.out_channels = out_channels + self.k = k + + self.lin_s = Linear(in_channels, space_dimensions) + self.lin_h = Linear(in_channels, propagate_dimensions) + + self.lin_out1 = Linear(in_channels, out_channels, bias=False) + self.lin_out2 = Linear(2 * propagate_dimensions, out_channels) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin_s.reset_parameters() + self.lin_h.reset_parameters() + self.lin_out1.reset_parameters() + self.lin_out2.reset_parameters() + + def forward( + self, + x: Union[Tensor, PairTensor], + batch: Union[OptTensor, Optional[PairTensor]] = None, + ) -> Tensor: + + is_bipartite: bool = True + if isinstance(x, Tensor): + x = (x, x) + is_bipartite = False + + if x[0].dim() != 2: + raise ValueError("Static graphs not supported in 'GravNetConv'") + + b: PairOptTensor = (None, None) + if isinstance(batch, Tensor): + b = (batch, batch) + elif isinstance(batch, tuple): + assert batch is not None + b = (batch[0], batch[1]) + + h_l: Tensor = self.lin_h(x[0]) + + s_l: Tensor = self.lin_s(x[0]) + s_r: Tensor = self.lin_s(x[1]) if is_bipartite else s_l + + edge_index = knn(s_l, s_r, self.k, b[0], b[1]).flip([0]) + + edge_weight = (s_l[edge_index[0]] - s_r[edge_index[1]]).pow(2).sum(-1) + edge_weight = paddle.exp(-10. * edge_weight) # 10 gives a better spread + + # propagate_type: (x: OptPairTensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=(h_l, None), + edge_weight=edge_weight, + size=(s_l.size(0), s_r.size(0))) + + return self.lin_out1(x[1]) + self.lin_out2(out) + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return x_j * edge_weight.unsqueeze(1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, k={self.k})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/han_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/han_conv.py new file mode 100644 index 00000000..735f568f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/han_conv.py @@ -0,0 +1,150 @@ +from typing import Dict, List, Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor, nn + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense import Linear +from paddle_geometric.nn.inits import glorot, reset +from paddle_geometric.typing import PairTensor # noqa +from paddle_geometric.typing import Adj, EdgeType, Metadata, NodeType, OptTensor +from paddle_geometric.utils import softmax + + +def group( + xs: List[Tensor], + q, + k_lin: nn.Layer, +) -> Tuple[OptTensor, OptTensor]: + if len(xs) == 0: + return None, None + else: + num_edge_types = len(xs) + out = paddle.stack(xs) + if out.numel() == 0: + return out.reshape([0, out.shape[-1]]), None + attn_score = (q * paddle.tanh(k_lin(out)).mean(1)).sum(-1) + attn = F.softmax(attn_score, axis=0) + out = paddle.sum(attn.reshape([num_edge_types, 1, -1]) * out, axis=0) + return out, attn + + +class HANConv(MessagePassing): + r"""The Heterogenous Graph Attention Operator from the + `"Heterogenous Graph Attention Network" + `_ paper. + + Args: + in_channels (int or Dict[str, int]): Size of each input sample of every + node type, or :obj:`-1` to derive the size from the first input(s) + to the forward method. + out_channels (int): Size of each output sample. + metadata (Tuple[List[str], List[Tuple[str, str, str]]]): The metadata + of the heterogeneous graph, *i.e.* its node and edge types given + by a list of strings and a list of string triplets, respectively. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients. (default: :obj:`0`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + def __init__( + self, + in_channels: Union[int, Dict[str, int]], + out_channels: int, + metadata: Metadata, + heads: int = 1, + negative_slope=0.2, + dropout: float = 0.0, + **kwargs, + ): + super().__init__(aggr='add', node_dim=0, **kwargs) + + if not isinstance(in_channels, dict): + in_channels = {node_type: in_channels for node_type in metadata[0]} + + self.heads = heads + self.in_channels = in_channels + self.out_channels = out_channels + self.negative_slope = negative_slope + self.metadata = metadata + self.dropout = dropout + self.k_lin = nn.Linear(out_channels, out_channels) + self.q = self.create_parameter(shape=[1, out_channels], default_initializer=nn.initializer.XavierUniform()) + + self.proj = nn.LayerDict() + for node_type, in_channels in self.in_channels.items(): + self.proj[node_type] = Linear(in_channels, out_channels) + + self.lin_src = nn.ParameterDict() + self.lin_dst = nn.ParameterDict() + dim = out_channels // heads + for edge_type in metadata[1]: + edge_type = '__'.join(edge_type) + self.lin_src[edge_type] = self.create_parameter(shape=[1, heads, dim], default_initializer=nn.initializer.XavierUniform()) + self.lin_dst[edge_type] = self.create_parameter(shape=[1, heads, dim], default_initializer=nn.initializer.XavierUniform()) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + reset(self.proj) + glorot(self.lin_src) + glorot(self.lin_dst) + self.k_lin.weight.set_value(paddle.nn.initializer.XavierUniform()) + self.q.set_value(paddle.nn.initializer.XavierUniform()) + + def forward( + self, + x_dict: Dict[NodeType, Tensor], + edge_index_dict: Dict[EdgeType, Adj], + return_semantic_attention_weights: bool = False, + ) -> Union[Dict[NodeType, OptTensor], Tuple[Dict[NodeType, OptTensor], Dict[NodeType, OptTensor]]]: + H, D = self.heads, self.out_channels // self.heads + x_node_dict, out_dict = {}, {} + + # Iterate over node types: + for node_type, x in x_dict.items(): + x_node_dict[node_type] = self.proj[node_type](x).reshape([-1, H, D]) + out_dict[node_type] = [] + + # Iterate over edge types: + for edge_type, edge_index in edge_index_dict.items(): + src_type, _, dst_type = edge_type + edge_type = '__'.join(edge_type) + lin_src = self.lin_src[edge_type] + lin_dst = self.lin_dst[edge_type] + x_src = x_node_dict[src_type] + x_dst = x_node_dict[dst_type] + alpha_src = (x_src * lin_src).sum(axis=-1) + alpha_dst = (x_dst * lin_dst).sum(axis=-1) + out = self.propagate(edge_index, x=(x_src, x_dst), alpha=(alpha_src, alpha_dst)) + + out = F.relu(out) + out_dict[dst_type].append(out) + + semantic_attn_dict = {} + for node_type, outs in out_dict.items(): + out, attn = group(outs, self.q, self.k_lin) + out_dict[node_type] = out + semantic_attn_dict[node_type] = attn + + if return_semantic_attention_weights: + return out_dict, semantic_attn_dict + + return out_dict + + def message(self, x_j: Tensor, alpha_i: Tensor, alpha_j: Tensor, index: Tensor, ptr: Optional[Tensor], size_i: Optional[int]) -> Tensor: + alpha = alpha_j + alpha_i + alpha = F.leaky_relu(alpha, self.negative_slope) + alpha = softmax(alpha, index, ptr, size_i) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + out = x_j * alpha.reshape([-1, self.heads, 1]) + return out.reshape([-1, self.out_channels]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.out_channels}, heads={self.heads})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/heat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/heat_conv.py new file mode 100644 index 00000000..a98d8c91 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/heat_conv.py @@ -0,0 +1,126 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor, nn + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import HeteroLinear, Linear +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import softmax + + +class HEATConv(MessagePassing): + r"""The heterogeneous edge-enhanced graph attentional operator from the + `"Heterogeneous Edge-Enhanced Graph Attention Network For Multi-Agent + Trajectory Prediction" `_ paper. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + num_node_types (int): The number of node types. + num_edge_types (int): The number of edge types. + edge_type_emb_dim (int): The embedding size of edge types. + edge_dim (int): Edge feature dimensionality. + edge_attr_emb_dim (int): The embedding size of edge features. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients. (default: :obj:`0`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add transformed root node features to the output. + (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + def __init__(self, in_channels: int, out_channels: int, + num_node_types: int, num_edge_types: int, + edge_type_emb_dim: int, edge_dim: int, edge_attr_emb_dim: int, + heads: int = 1, concat: bool = True, + negative_slope: float = 0.2, dropout: float = 0.0, + root_weight: bool = True, bias: bool = True, **kwargs): + + kwargs.setdefault('aggr', 'add') + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + self.root_weight = root_weight + + self.hetero_lin = HeteroLinear(in_channels, out_channels, + num_node_types, bias=bias) + + self.edge_type_emb = nn.Embedding(num_edge_types, edge_type_emb_dim) + self.edge_attr_emb = Linear(edge_dim, edge_attr_emb_dim, bias_attr=False) + + self.att = Linear( + 2 * out_channels + edge_type_emb_dim + edge_attr_emb_dim, + self.heads, bias_attr=False) + + self.lin = Linear(out_channels + edge_attr_emb_dim, out_channels, + bias_attr=bias) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.hetero_lin.reset_parameters() + self.edge_type_emb.weight.set_value(paddle.nn.initializer.XavierUniform()(self.edge_type_emb.weight.shape)) + self.edge_attr_emb.reset_parameters() + self.att.reset_parameters() + self.lin.reset_parameters() + + def forward(self, x: Tensor, edge_index: Adj, node_type: Tensor, + edge_type: Tensor, edge_attr: OptTensor = None) -> Tensor: + + x = self.hetero_lin(x, node_type) + + edge_type_emb = F.leaky_relu(self.edge_type_emb(edge_type), + self.negative_slope) + + # propagate_type: (x: Tensor, edge_type_emb: Tensor, + # edge_attr: OptTensor) + out = self.propagate(edge_index, x=x, edge_type_emb=edge_type_emb, + edge_attr=edge_attr) + + if self.concat: + if self.root_weight: + out = out + x.reshape([-1, 1, self.out_channels]) + out = out.reshape([-1, self.heads * self.out_channels]) + else: + out = out.mean(axis=1) + if self.root_weight: + out = out + x + + return out + + def message(self, x_i: Tensor, x_j: Tensor, edge_type_emb: Tensor, + edge_attr: Tensor, index: Tensor, ptr: OptTensor, + size_i: Optional[int]) -> Tensor: + + edge_attr = F.leaky_relu(self.edge_attr_emb(edge_attr), + self.negative_slope) + + alpha = paddle.concat([x_i, x_j, edge_type_emb, edge_attr], axis=-1) + alpha = F.leaky_relu(self.att(alpha), self.negative_slope) + alpha = softmax(alpha, index, ptr, size_i) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + + out = self.lin(paddle.concat([x_j, edge_attr], axis=-1)).unsqueeze(-2) + return out * alpha.unsqueeze(-1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/hetero_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/hetero_conv.py new file mode 100644 index 00000000..8cd8eddd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/hetero_conv.py @@ -0,0 +1,152 @@ +import warnings +from typing import Dict, List, Optional + +import paddle +from paddle import Tensor, nn + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.module_dict import ModuleDict +from paddle_geometric.typing import EdgeType, NodeType +from paddle_geometric.utils.hetero import check_add_self_loops + + +def group(xs: List[Tensor], aggr: Optional[str]) -> Optional[Tensor]: + if len(xs) == 0: + return None + elif aggr is None: + return paddle.stack(xs, axis=1) + elif len(xs) == 1: + return xs[0] + elif aggr == "cat": + return paddle.concat(xs, axis=-1) + else: + out = paddle.stack(xs, axis=0) + out = getattr(paddle, aggr)(out, axis=0) + out = out[0] if isinstance(out, tuple) else out + return out + + +class HeteroConv(nn.Layer): + r"""A generic wrapper for computing graph convolution on heterogeneous + graphs. + This layer will pass messages from source nodes to target nodes based on + the bipartite GNN layer given for a specific edge type. + If multiple relations point to the same destination, their results will be + aggregated according to :attr:`aggr`. + + Args: + convs (Dict[Tuple[str, str, str], MessagePassing]): A dictionary + holding a bipartite :class:`~paddle_geometric.nn.conv.MessagePassing` + layer for each individual edge type. + aggr (str, optional): The aggregation scheme to use for grouping node + embeddings generated by different relations + (:obj:`"sum"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`, + :obj:`"cat"`, :obj:`None`). (default: :obj:`"sum"`) + """ + def __init__( + self, + convs: Dict[EdgeType, MessagePassing], + aggr: Optional[str] = "sum", + ): + super().__init__() + + for edge_type, module in convs.items(): + check_add_self_loops(module, [edge_type]) + + src_node_types = {key[0] for key in convs.keys()} + dst_node_types = {key[-1] for key in convs.keys()} + if len(src_node_types - dst_node_types) > 0: + warnings.warn( + f"There exist node types ({src_node_types - dst_node_types}) " + f"whose representations do not get updated during message " + f"passing as they do not occur as destination type in any " + f"edge type. This may lead to unexpected behavior." + ) + + self.convs = ModuleDict(convs) + self.aggr = aggr + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for conv in self.convs.values(): + conv.reset_parameters() + + def forward( + self, + *args_dict, + **kwargs_dict, + ) -> Dict[NodeType, Tensor]: + r"""Runs the forward pass of the module. + + Args: + x_dict (Dict[str, paddle.Tensor]): A dictionary holding node feature + information for each individual node type. + edge_index_dict (Dict[Tuple[str, str, str], paddle.Tensor]): A + dictionary holding graph connectivity information for each + individual edge type, either as a :class:`paddle.Tensor` of + shape :obj:`[2, num_edges]`. + *args_dict (optional): Additional forward arguments of individual + :class:`paddle_geometric.nn.conv.MessagePassing` layers. + **kwargs_dict (optional): Additional forward arguments of + individual :class:`paddle_geometric.nn.conv.MessagePassing` + layers. + """ + out_dict: Dict[str, List[Tensor]] = {} + + for edge_type, conv in self.convs.items(): + src, rel, dst = edge_type + + has_edge_level_arg = False + + args = [] + for value_dict in args_dict: + if edge_type in value_dict: + has_edge_level_arg = True + args.append(value_dict[edge_type]) + elif src == dst and src in value_dict: + args.append(value_dict[src]) + elif src in value_dict or dst in value_dict: + args.append( + ( + value_dict.get(src, None), + value_dict.get(dst, None), + ) + ) + + kwargs = {} + for arg, value_dict in kwargs_dict.items(): + if not arg.endswith("_dict"): + raise ValueError( + f"Keyword arguments in '{self.__class__.__name__}' " + f"need to end with '_dict' (got '{arg}')" + ) + + arg = arg[:-5] # `{*}_dict` + if edge_type in value_dict: + has_edge_level_arg = True + kwargs[arg] = value_dict[edge_type] + elif src == dst and src in value_dict: + kwargs[arg] = value_dict[src] + elif src in value_dict or dst in value_dict: + kwargs[arg] = ( + value_dict.get(src, None), + value_dict.get(dst, None), + ) + + if not has_edge_level_arg: + continue + + out = conv(*args, **kwargs) + + if dst not in out_dict: + out_dict[dst] = [out] + else: + out_dict[dst].append(out) + + for key, value in out_dict.items(): + out_dict[key] = group(value, self.aggr) + + return out_dict + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(num_relations={len(self.convs)})" diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/hgt_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/hgt_conv.py new file mode 100644 index 00000000..92a28154 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/hgt_conv.py @@ -0,0 +1,190 @@ +import math +from typing import Dict, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer, LayerDict + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense import HeteroDictLinear, HeteroLinear +from paddle_geometric.nn.parameter_dict import ParameterDict +from paddle_geometric.typing import Adj, EdgeType, Metadata, NodeType +from paddle_geometric.utils import softmax +from paddle_geometric.utils.hetero import construct_bipartite_edge_index + + +class HGTConv(MessagePassing): + r"""The Heterogeneous Graph Transformer (HGT) operator from the + `"Heterogeneous Graph Transformer" `_ + paper.""" + + def __init__( + self, + in_channels: Union[int, Dict[str, int]], + out_channels: int, + metadata: Metadata, + heads: int = 1, + **kwargs, + ): + super().__init__(aggr='add', node_dim=0, **kwargs) + + if out_channels % heads != 0: + raise ValueError(f"'out_channels' (got {out_channels}) must be " + f"divisible by the number of heads (got {heads})") + + if not isinstance(in_channels, dict): + in_channels = {node_type: in_channels for node_type in metadata[0]} + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.node_types = metadata[0] + self.edge_types = metadata[1] + self.edge_types_map = { + edge_type: i + for i, edge_type in enumerate(metadata[1]) + } + + self.dst_node_types = {key[-1] for key in self.edge_types} + + self.kqv_lin = HeteroDictLinear(self.in_channels, + self.out_channels * 3) + + self.out_lin = HeteroDictLinear(self.out_channels, self.out_channels, + types=self.node_types) + + dim = out_channels // heads + num_types = heads * len(self.edge_types) + + self.k_rel = HeteroLinear(dim, dim, num_types, bias=False, + is_sorted=True) + self.v_rel = HeteroLinear(dim, dim, num_types, bias=False, + is_sorted=True) + + self.skip = ParameterDict({ + node_type: self.create_parameter(shape=[1], default_initializer=paddle.nn.initializer.Constant(1.0)) + for node_type in self.node_types + }) + + self.p_rel = ParameterDict() + for edge_type in self.edge_types: + edge_type = '__'.join(edge_type) + self.p_rel[edge_type] = self.create_parameter(shape=[1, heads], default_initializer=paddle.nn.initializer.Constant(1.0)) + + self.reset_parameters() + + def reset_parameters(self): + self.kqv_lin.reset_parameters() + self.out_lin.reset_parameters() + self.k_rel.reset_parameters() + self.v_rel.reset_parameters() + for key in self.skip.keys(): + self.skip[key].set_value(paddle.ones([1])) + for key in self.p_rel.keys(): + self.p_rel[key].set_value(paddle.ones([1, self.heads])) + + def _cat(self, x_dict: Dict[str, Tensor]) -> Tuple[Tensor, Dict[str, int]]: + cumsum = 0 + outs: List[Tensor] = [] + offset: Dict[str, int] = {} + for key, x in x_dict.items(): + outs.append(x) + offset[key] = cumsum + cumsum += x.shape[0] + return paddle.concat(outs, axis=0), offset + + def _construct_src_node_feat( + self, k_dict: Dict[str, Tensor], v_dict: Dict[str, Tensor], + edge_index_dict: Dict[EdgeType, Adj] + ) -> Tuple[Tensor, Tensor, Dict[EdgeType, int]]: + cumsum = 0 + num_edge_types = len(self.edge_types) + H, D = self.heads, self.out_channels // self.heads + + ks: List[Tensor] = [] + vs: List[Tensor] = [] + type_list: List[Tensor] = [] + offset: Dict[EdgeType] = {} + for edge_type in edge_index_dict.keys(): + src = edge_type[0] + N = k_dict[src].shape[0] + offset[edge_type] = cumsum + cumsum += N + + edge_type_offset = self.edge_types_map[edge_type] + type_vec = paddle.arange(H, dtype='int64').unsqueeze(-1).tile([1, N]) * num_edge_types + edge_type_offset + + type_list.append(type_vec) + ks.append(k_dict[src]) + vs.append(v_dict[src]) + + ks = paddle.concat(ks, axis=0).transpose([1, 0]).reshape([-1, D]) + vs = paddle.concat(vs, axis=0).transpose([1, 0]).reshape([-1, D]) + type_vec = paddle.concat(type_list, axis=1).flatten() + + k = self.k_rel(ks, type_vec).reshape([H, -1, D]).transpose([1, 0, 2]) + v = self.v_rel(vs, type_vec).reshape([H, -1, D]).transpose([1, 0, 2]) + + return k, v, offset + + def forward( + self, + x_dict: Dict[NodeType, Tensor], + edge_index_dict: Dict[EdgeType, Adj] + ) -> Dict[NodeType, Optional[Tensor]]: + F = self.out_channels + H = self.heads + D = F // H + + k_dict, q_dict, v_dict, out_dict = {}, {}, {}, {} + + kqv_dict = self.kqv_lin(x_dict) + for key, val in kqv_dict.items(): + k, q, v = paddle.split(val, 3, axis=1) + k_dict[key] = k.reshape([-1, H, D]) + q_dict[key] = q.reshape([-1, H, D]) + v_dict[key] = v.reshape([-1, H, D]) + + q, dst_offset = self._cat(q_dict) + k, v, src_offset = self._construct_src_node_feat( + k_dict, v_dict, edge_index_dict) + + edge_index, edge_attr = construct_bipartite_edge_index( + edge_index_dict, src_offset, dst_offset, edge_attr_dict=self.p_rel, + num_nodes=k.shape[0]) + + out = self.propagate(edge_index, k=k, q=q, v=v, edge_attr=edge_attr) + + for node_type, start_offset in dst_offset.items(): + end_offset = start_offset + q_dict[node_type].shape[0] + if node_type in self.dst_node_types: + out_dict[node_type] = out[start_offset:end_offset] + + a_dict = self.out_lin({ + k: + paddle.nn.functional.gelu(v) if v is not None else v + for k, v in out_dict.items() + }) + + for node_type, out in out_dict.items(): + out = a_dict[node_type] + + if out.shape[-1] == x_dict[node_type].shape[-1]: + alpha = paddle.nn.functional.sigmoid(self.skip[node_type]) + out = alpha * out + (1 - alpha) * x_dict[node_type] + out_dict[node_type] = out + + return out_dict + + def message(self, k_j: Tensor, q_i: Tensor, v_j: Tensor, edge_attr: Tensor, + index: Tensor, ptr: Optional[Tensor], + size_i: Optional[int]) -> Tensor: + alpha = (q_i * k_j).sum(axis=-1) * edge_attr + alpha = alpha / math.sqrt(q_i.shape[-1]) + alpha = softmax(alpha, index, ptr, size_i) + out = v_j * alpha.unsqueeze(-1) + return out.reshape([-1, self.out_channels]) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(-1, {self.out_channels}, ' + f'heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/hypergraph_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/hypergraph_conv.py new file mode 100644 index 00000000..4b6ad164 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/hypergraph_conv.py @@ -0,0 +1,196 @@ +import math +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.utils import scatter, softmax + + +class HypergraphConv(MessagePassing): + r"""The hypergraph convolutional operator from the `"Hypergraph Convolution + and Hypergraph Attention" `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \mathbf{D}^{-1} \mathbf{H} \mathbf{W} + \mathbf{B}^{-1} \mathbf{H}^{\top} \mathbf{X} \mathbf{\Theta} + + where :math:`\mathbf{H} \in {\{ 0, 1 \}}^{N \times M}` is the incidence + matrix, :math:`\mathbf{W} \in \mathbb{R}^M` is the diagonal hyperedge + weight matrix, and + :math:`\mathbf{D}` and :math:`\mathbf{B}` are the corresponding degree + matrices. + + For example, in the hypergraph scenario + :math:`\mathcal{G} = (\mathcal{V}, \mathcal{E})` with + :math:`\mathcal{V} = \{ 0, 1, 2, 3 \}` and + :math:`\mathcal{E} = \{ \{ 0, 1, 2 \}, \{ 1, 2, 3 \} \}`, the + :obj:`hyperedge_index` is represented as: + + .. code-block:: python + + hyperedge_index = paddle.to_tensor([ + [0, 1, 2, 1, 2, 3], + [0, 0, 0, 1, 1, 1], + ]) + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + use_attention (bool, optional): If set to :obj:`True`, attention + will be added to this layer. (default: :obj:`False`) + attention_mode (str, optional): The mode on how to compute attention. + If set to :obj:`"node"`, will compute attention scores of nodes + within all nodes belonging to the same hyperedge. + If set to :obj:`"edge"`, will compute attention scores of nodes + across all edges holding this node belongs to. + (default: :obj:`"node"`) + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + hyperedge indices :math:`(|\mathcal{V}|, |\mathcal{E}|)`, + hyperedge weights :math:`(|\mathcal{E}|)` *(optional)* + hyperedge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + def __init__( + self, + in_channels: int, + out_channels: int, + use_attention: bool = False, + attention_mode: str = 'node', + heads: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + dropout: float = 0, + bias: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(flow='source_to_target', node_dim=0, **kwargs) + + assert attention_mode in ['node', 'edge'] + + self.in_channels = in_channels + self.out_channels = out_channels + self.use_attention = use_attention + self.attention_mode = attention_mode + + if self.use_attention: + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + self.lin = Linear(in_channels, heads * out_channels, bias_attr=False, + weight_attr=paddle.nn.initializer.XavierUniform()) + self.att = self.create_parameter(shape=[1, heads, 2 * out_channels]) + else: + self.heads = 1 + self.concat = True + self.lin = Linear(in_channels, out_channels, bias_attr=False, + weight_attr=paddle.nn.initializer.XavierUniform()) + + if bias and concat: + self.bias = self.create_parameter(shape=[heads * out_channels]) + elif bias and not concat: + self.bias = self.create_parameter(shape=[out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + self.lin.reset_parameters() + if self.use_attention: + glorot(self.att) + if self.bias is not None: + zeros(self.bias) + + def forward(self, x: Tensor, hyperedge_index: Tensor, + hyperedge_weight: Optional[Tensor] = None, + hyperedge_attr: Optional[Tensor] = None, + num_edges: Optional[int] = None) -> Tensor: + num_nodes = x.shape[0] + + if num_edges is None: + num_edges = 0 + if hyperedge_index.numel() > 0: + num_edges = int(hyperedge_index[1].max().item()) + 1 + + if hyperedge_weight is None: + hyperedge_weight = paddle.ones([num_edges], dtype=x.dtype) + + x = self.lin(x) + + alpha = None + if self.use_attention: + assert hyperedge_attr is not None + x = x.reshape([-1, self.heads, self.out_channels]) + hyperedge_attr = self.lin(hyperedge_attr) + hyperedge_attr = hyperedge_attr.reshape([-1, self.heads, + self.out_channels]) + x_i = x[hyperedge_index[0]] + x_j = hyperedge_attr[hyperedge_index[1]] + alpha = (paddle.concat([x_i, x_j], axis=-1) * self.att).sum(axis=-1) + alpha = F.leaky_relu(alpha, self.negative_slope) + if self.attention_mode == 'node': + alpha = softmax(alpha, hyperedge_index[1], num_nodes=num_edges) + else: + alpha = softmax(alpha, hyperedge_index[0], num_nodes=num_nodes) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + + D = scatter(hyperedge_weight[hyperedge_index[1]], hyperedge_index[0], + dim=0, dim_size=num_nodes, reduce='sum') + D = 1.0 / D + D[D == float("inf")] = 0 + + B = scatter(paddle.ones([hyperedge_index.shape[1]]), hyperedge_index[1], + dim=0, dim_size=num_edges, reduce='sum') + B = 1.0 / B + B[B == float("inf")] = 0 + + out = self.propagate(hyperedge_index, x=x, norm=B, alpha=alpha, + size=(num_nodes, num_edges)) + out = self.propagate(hyperedge_index.flip([0]), x=out, norm=D, + alpha=alpha, size=(num_edges, num_nodes)) + + if self.concat is True: + out = out.reshape([-1, self.heads * self.out_channels]) + else: + out = out.mean(axis=1) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, norm_i: Tensor, alpha: Tensor) -> Tensor: + H, F = self.heads, self.out_channels + + out = norm_i.unsqueeze(-1).unsqueeze(-1) * x_j.reshape([-1, H, F]) + + if alpha is not None: + out = alpha.unsqueeze(-1) * out + + return out diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/le_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/le_conv.py new file mode 100644 index 00000000..0a67fb59 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/le_conv.py @@ -0,0 +1,90 @@ +from typing import Tuple, Union + +import paddle +from paddle import Tensor +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, OptTensor, PairTensor + + +class LEConv(MessagePassing): + r"""The local extremum graph neural network operator from the + `"ASAP: Adaptive Structure Aware Pooling for Learning Hierarchical Graph + Representations" `_ paper. + + :class:`LEConv` finds the importance of nodes with respect to their + neighbors using the difference operator: + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{x}_i \cdot \mathbf{\Theta}_1 + + \sum_{j \in \mathcal{N}(i)} e_{j,i} \cdot + (\mathbf{\Theta}_2 \mathbf{x}_i - \mathbf{\Theta}_3 \mathbf{x}_j) + + where :math:`e_{j,i}` denotes the edge weight from source node :obj:`j` to + target node :obj:`i` (default: :obj:`1`) + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + bias (bool, optional): If set to :obj:`False`, the layer will + not learn an additive bias. (default: :obj:`True`). + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V}_t|, F_{out})` if bipartite + """ + def __init__(self, in_channels: Union[int, Tuple[int, int]], + out_channels: int, bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.lin1 = Linear(in_channels[0], out_channels, bias_attr=bias) + self.lin2 = Linear(in_channels[1], out_channels, bias_attr=False) + self.lin3 = Linear(in_channels[1], out_channels, bias_attr=bias) + + self.reset_parameters() + + def reset_parameters(self): + self.lin1.reset_parameters() + self.lin2.reset_parameters() + self.lin3.reset_parameters() + + def forward(self, x: Union[Tensor, PairTensor], edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + a = self.lin1(x[0]) + b = self.lin2(x[1]) + + # propagate_type: (a: Tensor, b: Tensor, edge_weight: OptTensor) + out = self.propagate(edge_index, a=a, b=b, edge_weight=edge_weight) + + return out + self.lin3(x[1]) + + def message(self, a_j: Tensor, b_i: Tensor, + edge_weight: OptTensor) -> Tensor: + out = a_j - b_i + return out if edge_weight is None else out * edge_weight.unsqueeze(-1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/lg_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/lg_conv.py new file mode 100644 index 00000000..c5efa424 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/lg_conv.py @@ -0,0 +1,55 @@ +from paddle import Tensor +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import spmm + + +class LGConv(MessagePassing): + r"""The Light Graph Convolution (LGC) operator from the `"LightGCN: + Simplifying and Powering Graph Convolution Network for Recommendation" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \sum_{j \in \mathcal{N}(i)} + \frac{e_{j,i}}{\sqrt{\deg(i)\deg(j)}} \mathbf{x}_j + + Args: + normalize (bool, optional): If set to :obj:`False`, output features + will not be normalized via symmetric normalization. + (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F)`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F)` + """ + def __init__(self, normalize: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + self.normalize = normalize + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + if self.normalize and isinstance(edge_index, Tensor): + out = gcn_norm(edge_index, edge_weight, x.shape[self.node_dim], + add_self_loops=False, flow=self.flow, dtype=x.dtype) + edge_index, edge_weight = out + elif self.normalize and isinstance(edge_index, SparseTensor): + edge_index = gcn_norm(edge_index, None, x.shape[self.node_dim], + add_self_loops=False, flow=self.flow, + dtype=x.dtype) + + # propagate_type: (x: Tensor, edge_weight: OptTensor) + return self.propagate(edge_index, x=x, edge_weight=edge_weight) + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/message_passing.py b/jointContribution/mattergen/paddle_geometric/nn/conv/message_passing.py new file mode 100644 index 00000000..199e3603 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/message_passing.py @@ -0,0 +1,735 @@ +import os.path as osp +import warnings +from abc import abstractmethod +from inspect import Parameter +from typing import ( + Any, + Callable, + Dict, + Final, + List, + Optional, + OrderedDict, + Set, + Tuple, + Union, +) + +import paddle +from paddle import Tensor +import weakref +from paddle_geometric import EdgeIndex, is_compiling +from paddle_geometric.index import ptr2index +from paddle_geometric.inspector import Inspector, Signature +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.resolver import aggregation_resolver as aggr_resolver +from paddle_geometric.template import module_from_template +from paddle_geometric.typing import Adj, Size, SparseTensor +from paddle_geometric.utils import ( + is_sparse, + is_paddle_sparse_tensor, + to_edge_index, +) + +FUSE_AGGRS = {'add', 'sum', 'mean', 'min', 'max'} +HookDict = OrderedDict[int, Callable] + +FUSE_AGGRS = {'add', 'sum', 'mean', 'min', 'max'} +HookDict = OrderedDict[int, Callable] + + +class RemovableHandle: + from collections import OrderedDict + r""" + A handle which provides the capability to remove a hook. + + Args: + hooks_dict (dict): A dictionary of hooks, indexed by hook ``id``. + extra_dict (Union[dict, List[dict]]): An additional dictionary or list of + dictionaries whose keys will be deleted when the same keys are + removed from ``hooks_dict``. + """ + + id: int + next_id: int = 0 + + def __init__(self, hooks_dict: Any, *, extra_dict: Any = None) -> None: + self.hooks_dict_ref = weakref.ref(hooks_dict) + self.id = RemovableHandle.next_id + RemovableHandle.next_id += 1 + + self.extra_dict_ref: Tuple = () + if isinstance(extra_dict, dict): + self.extra_dict_ref = (weakref.ref(extra_dict),) + elif isinstance(extra_dict, list): + self.extra_dict_ref = tuple(weakref.ref(d) for d in extra_dict) + + def remove(self) -> None: + hooks_dict = self.hooks_dict_ref() + if hooks_dict is not None and self.id in hooks_dict: + del hooks_dict[self.id] + + for ref in self.extra_dict_ref: + extra_dict = ref() + if extra_dict is not None and self.id in extra_dict: + del extra_dict[self.id] + + def __getstate__(self): + if self.extra_dict_ref is None: + return (self.hooks_dict_ref(), self.id) + else: + return (self.hooks_dict_ref(), self.id, tuple(ref() for ref in self.extra_dict_ref)) + + def __setstate__(self, state) -> None: + if state[0] is None: + # create a dead reference + self.hooks_dict_ref = weakref.ref(OrderedDict()) + else: + self.hooks_dict_ref = weakref.ref(state[0]) + self.id = state[1] + RemovableHandle.next_id = max(RemovableHandle.next_id, self.id + 1) + + if len(state) < 3 or state[2] is None: + self.extra_dict_ref = () + else: + self.extra_dict_ref = tuple(weakref.ref(d) for d in state[2]) + + def __enter__(self) -> "RemovableHandle": + return self + + def __exit__(self, type: Any, value: Any, tb: Any) -> None: + self.remove() + + +class MessagePassing(paddle.nn.Layer): + r"""Base class for creating message passing layers. + + Message passing layers follow the form + + .. math:: + \mathbf{x}_i^{\prime} = \gamma_{\mathbf{\Theta}} \left( \mathbf{x}_i, + \bigoplus_{j \in \mathcal{N}(i)} \, \phi_{\mathbf{\Theta}} + \left(\mathbf{x}_i, \mathbf{x}_j,\mathbf{e}_{j,i}\right) \right), + + where :math:`\bigoplus` denotes a differentiable, permutation invariant + function, *e.g.*, sum, mean, min, max or mul, and + :math:`\gamma_{\mathbf{\Theta}}` and :math:`\phi_{\mathbf{\Theta}}` denote + differentiable functions such as MLPs. + + Args: + aggr (str or [str] or Aggregation, optional): The aggregation scheme + to use, *e.g.*, :obj:`"sum"` :obj:`"mean"`, :obj:`"min"`, + :obj:`"max"` or :obj:`"mul"`. + In addition, can be any + :class:`~pgl.nn.aggr.Aggregation` module (or any string + that automatically resolves to it). + If given as a list, will make use of multiple aggregations in which + different outputs will get concatenated in the last dimension. + If set to :obj:`None`, the :class:`MessagePassing` instantiation is + expected to implement its own aggregation logic via + :meth:`aggregate`. (default: :obj:`"add"`) + aggr_kwargs (Dict[str, Any], optional): Arguments passed to the + respective aggregation function in case it gets automatically + resolved. (default: :obj:`None`) + flow (str, optional): The flow direction of message passing + (:obj:`"source_to_target"` or :obj:`"target_to_source"`). + (default: :obj:`"source_to_target"`) + node_dim (int, optional): The axis along which to propagate. + (default: :obj:`-2`) + decomposed_layers (int, optional): The number of feature decomposition + layers, as introduced in the `"Optimizing Memory Efficiency of + Graph Neural Networks on Edge Computing Platforms" + `_ paper. + Feature decomposition reduces the peak memory usage by slicing + the feature dimensions into separated feature decomposition layers + during GNN aggregation. + (default: :obj:`1`) + """ + + special_args: Set[str] = { + 'edge_index', 'adj_t', 'edge_index_i', 'edge_index_j', 'size', + 'size_i', 'size_j', 'ptr', 'index', 'dim_size' + } + + SUPPORTS_FUSED_EDGE_INDEX: Final[bool] = False + + def __init__( + self, + aggr: Optional[Union[str, List[str], Aggregation]] = 'sum', + *, + aggr_kwargs: Optional[Dict[str, Any]] = None, + flow: str = "source_to_target", + node_dim: int = -2, + decomposed_layers: int = 1, + ) -> None: + super().__init__() + + if flow not in ['source_to_target', 'target_to_source']: + raise ValueError(f"Expected 'flow' to be either 'source_to_target'" + f" or 'target_to_source' (got '{flow}')") + + # Cast `aggr` into a string representation for backward compatibility: + self.aggr: Optional[Union[str, List[str]]] + if aggr is None: + self.aggr = None + elif isinstance(aggr, (str, Aggregation)): + self.aggr = str(aggr) + elif isinstance(aggr, (tuple, list)): + self.aggr = [str(x) for x in aggr] + + self.aggr_module = aggr_resolver(aggr, **(aggr_kwargs or {})) + self.flow = flow + self.node_dim = node_dim + + # Collect attribute names requested in message passing hooks: + self.inspector = Inspector(self.__class__) + self.inspector.inspect_signature(self.message) + self.inspector.inspect_signature(self.aggregate, exclude=[0, 'aggr']) + self.inspector.inspect_signature(self.message_and_aggregate, [0]) + self.inspector.inspect_signature(self.update, exclude=[0]) + self.inspector.inspect_signature(self.edge_update) + + self._user_args: List[str] = self.inspector.get_flat_param_names( + ['message', 'aggregate', 'update'], exclude=self.special_args) + self._fused_user_args: List[str] = self.inspector.get_flat_param_names( + ['message_and_aggregate', 'update'], exclude=self.special_args) + self._edge_user_args: List[str] = self.inspector.get_param_names( + 'edge_update', exclude=self.special_args) + + # Support for "fused" message passing: + self.fuse = self.inspector.implements('message_and_aggregate') + if self.aggr is not None: + self.fuse &= isinstance(self.aggr, str) and self.aggr in FUSE_AGGRS + + # Hooks: + self._propagate_forward_pre_hooks: HookDict = OrderedDict() + self._propagate_forward_hooks: HookDict = OrderedDict() + self._message_forward_pre_hooks: HookDict = OrderedDict() + self._message_forward_hooks: HookDict = OrderedDict() + self._aggregate_forward_pre_hooks: HookDict = OrderedDict() + self._aggregate_forward_hooks: HookDict = OrderedDict() + self._message_and_aggregate_forward_pre_hooks: HookDict = OrderedDict() + self._message_and_aggregate_forward_hooks: HookDict = OrderedDict() + self._edge_update_forward_pre_hooks: HookDict = OrderedDict() + self._edge_update_forward_hooks: HookDict = OrderedDict() + + # Set jittable `propagate` and `edge_updater` function templates: + self._set_jittable_templates() + + # Explainability: + self._explain: Optional[bool] = None + self._edge_mask: Optional[Tensor] = None + self._loop_mask: Optional[Tensor] = None + self._apply_sigmoid: bool = True + + # Inference Decomposition: + self._decomposed_layers = 1 + self.decomposed_layers = decomposed_layers + def reset_parameters(self) -> None: + r"""Resets all learnable parameters of the module.""" + if self.aggr_module is not None: + self.aggr_module.reset_parameters() + + def __setstate__(self, data: Dict[str, Any]) -> None: + self.inspector = data['inspector'] + self.fuse = data['fuse'] + self._set_jittable_templates() + super().__setstate__(data) + + def __repr__(self) -> str: + channels_repr = '' + if hasattr(self, 'in_channels') and hasattr(self, 'out_channels'): + channels_repr = f'{self.in_channels}, {self.out_channels}' + elif hasattr(self, 'channels'): + channels_repr = f'{self.channels}' + return f'{self.__class__.__name__}({channels_repr})' + + def _check_input( + self, + edge_index: Union[Tensor, SparseTensor], + size: Optional[Tuple[Optional[int], Optional[int]]], + ) -> List[Optional[int]]: + + if is_sparse(edge_index): + if self.flow == 'target_to_source': + raise ValueError( + 'Flow direction "target_to_source" is invalid for ' + 'message propagation via sparse tensors. Pass in the ' + 'transposed sparse tensor, e.g., `adj_t.t()`.') + + if isinstance(edge_index, SparseTensor): + return [edge_index.shape[1], edge_index.shape[0]] + + elif isinstance(edge_index, Tensor): + int_dtypes = (paddle.uint8, paddle.int8, paddle.int16, paddle.int32, + paddle.int64) + + if edge_index.dtype not in int_dtypes: + raise ValueError(f"Expected 'edge_index' to be of integer " + f"type (got '{edge_index.dtype}')") + if edge_index.ndim != 2: + raise ValueError(f"Expected 'edge_index' to be two-dimensional" + f" (got {edge_index.ndim} dimensions)") + if edge_index.shape[0] != 2: + raise ValueError(f"Expected 'edge_index' to have size '2' in " + f"the first dimension (got " + f"'{edge_index.shape[0]}')") + + return list(size) if size is not None else [None, None] + + raise ValueError( + '`MessagePassing.propagate` only supports integer tensors of ' + 'shape `[2, num_messages]`, or `SparseTensor` for argument ' + '`edge_index`.') + + def _set_size( + self, + size: List[Optional[int]], + dim: int, + src: Tensor, + ) -> None: + the_size = size[dim] + if the_size is None: + size[dim] = src.shape[self.node_dim] + elif the_size != src.shape[self.node_dim]: + raise ValueError( + f'Encountered tensor with size {src.shape[self.node_dim]} in ' + f'dimension {self.node_dim}, but expected size {the_size}.') + + def _index_select(self, src: Tensor, index) -> Tensor: + return paddle.index_select(src, index, axis=self.node_dim) + + def _lift( + self, + src: Tensor, + edge_index: Union[Tensor, SparseTensor], + dim: int, + ) -> Tensor: + if isinstance(edge_index, SparseTensor): + row, col, _ = edge_index.coo() + if dim == 0: + return paddle.index_select(src, col, axis=self.node_dim) + elif dim == 1: + return paddle.index_select(src, row, axis=self.node_dim) + + elif isinstance(edge_index, Tensor): + index = edge_index[dim] + return paddle.index_select(src, index, axis=self.node_dim) + + raise ValueError( + '`MessagePassing.propagate` only supports integer tensors of ' + 'shape `[2, num_messages]`, or `SparseTensor` for argument ' + '`edge_index`.') + def _collect( + self, + args: set, + edge_index: Union[Tensor, SparseTensor], + size: List[Optional[int]], + kwargs: Dict[str, Any], + ) -> Dict[str, Any]: + i, j = (1, 0) if self.flow == 'source_to_target' else (0, 1) + + out = {} + for arg in args: + if arg[-2:] not in ['_i', '_j']: + out[arg] = kwargs.get(arg, None) + else: + dim = j if arg[-2:] == '_j' else i + data = kwargs.get(arg[:-2], None) + + if isinstance(data, (tuple, list)): + assert len(data) == 2 + if isinstance(data[1 - dim], Tensor): + self._set_size(size, 1 - dim, data[1 - dim]) + data = data[dim] + + if isinstance(data, Tensor): + self._set_size(size, dim, data) + data = self._lift(data, edge_index, dim) + + out[arg] = data + + if isinstance(edge_index, SparseTensor): + row, col, value = edge_index.coo() + out['adj_t'] = edge_index + out['edge_index'] = None + out['edge_index_i'] = row + out['edge_index_j'] = col + out['ptr'] = edge_index.row() # Assuming CSR + if out.get('edge_weight', None) is None: + out['edge_weight'] = value + if out.get('edge_attr', None) is None: + out['edge_attr'] = value + if out.get('edge_type', None) is None: + out['edge_type'] = value + + elif isinstance(edge_index, Tensor): + out['adj_t'] = None + out['edge_index'] = edge_index + out['edge_index_i'] = edge_index[i] + out['edge_index_j'] = edge_index[j] + + out['index'] = out['edge_index_i'] + out['size'] = size + out['size_i'] = size[i] if size[i] is not None else size[j] + out['size_j'] = size[j] if size[j] is not None else size[i] + out['dim_size'] = out['size_i'] + + return out + + def forward(self, *args: Any, **kwargs: Any) -> Any: + r""" + Runs the forward pass of the module. + """ + + def propagate( + self, + edge_index: Adj, + size: Size = None, + **kwargs: Any, + ) -> Tensor: + r""" + The initial call to start propagating messages. + """ + mutable_size = self._check_input(edge_index, size) + + if isinstance(edge_index, SparseTensor): + coll_dict = self._collect(self._fused_user_args, edge_index, mutable_size, kwargs) + + msg_aggr_kwargs = self.inspector.collect_param_data( + 'message_and_aggregate', coll_dict) + out = self.message_and_aggregate(edge_index, **msg_aggr_kwargs) + + update_kwargs = self.inspector.collect_param_data('update', coll_dict) + out = self.update(out, **update_kwargs) + + else: + coll_dict = self._collect(self._user_args, edge_index, mutable_size, kwargs) + + msg_kwargs = self.inspector.collect_param_data('message', coll_dict) + out = self.message(**msg_kwargs) + + aggr_kwargs = self.inspector.collect_param_data('aggregate', coll_dict) + out = self.aggregate(out, **aggr_kwargs) + + update_kwargs = self.inspector.collect_param_data('update', coll_dict) + out = self.update(out, **update_kwargs) + + return out + + def message(self, x_j: Tensor) -> Tensor: + """ + Constructs messages from node `j` to node `i`. + + Args: + x_j (Tensor): Node features of neighbors (source nodes). + + Returns: + Tensor: Computed messages. + """ + return x_j + + def aggregate( + self, + inputs: Tensor, + index: Tensor, + ptr: Optional[Tensor] = None, + dim_size: Optional[int] = None, + ) -> Tensor: + """ + Aggregates messages from neighbors. + + Args: + inputs (Tensor): Messages to be aggregated. + index (Tensor): Indices for aggregation. + ptr (Optional[Tensor], optional): Pointer tensor for segmented aggregation. Defaults to None. + dim_size (Optional[int], optional): Size of the output dimension. Defaults to None. + + Returns: + Tensor: Aggregated messages. + """ + return self.aggr_module(inputs, index, ptr=ptr, dim_size=dim_size, axis=self.node_dim) + + @abstractmethod + def message_and_aggregate(self, edge_index: Tensor) -> Tensor: + """ + Combines `message` and `aggregate` computations into a single function. + + This optimization avoids materializing individual messages, improving efficiency. + + Args: + edge_index (Tensor): Graph connectivity represented as edges. + + Returns: + Tensor: Aggregated messages. + """ + raise NotImplementedError + + def update(self, inputs: Tensor) -> Tensor: + """ + Updates the node embeddings. + + Args: + inputs (Tensor): Aggregated messages. + + Returns: + Tensor: Updated node embeddings. + """ + return inputs + + def edge_updater( + self, + edge_index: Tensor, + size: Optional[Tensor] = None, + **kwargs: Any, + ) -> Tensor: + """ + Computes or updates features for each edge in the graph. + + Args: + edge_index (Tensor): Graph connectivity represented as edges. + size (Optional[Tensor], optional): Size of the adjacency matrix. Defaults to None. + **kwargs: Additional data required for edge updates. + + Returns: + Tensor: Updated edge features. + """ + for hook in self._edge_update_forward_pre_hooks.values(): + res = hook(self, (edge_index, size, kwargs)) + if res is not None: + edge_index, size, kwargs = res + + mutable_size = self._check_input(edge_index, size=None) + + coll_dict = self._collect(self._edge_user_args, edge_index, mutable_size, kwargs) + + edge_kwargs = self.inspector.collect_param_data('edge_update', coll_dict) + out = self.edge_update(**edge_kwargs) + + for hook in self._edge_update_forward_hooks.values(): + res = hook(self, (edge_index, size, kwargs), out) + if res is not None: + out = res + + return out + + def edge_update(self) -> Tensor: + """ + Computes or updates features for each edge in the graph. + + Returns: + Tensor: Updated edge features. + """ + raise NotImplementedError + + @property + def decomposed_layers(self) -> int: + """ + Returns the number of decomposed layers. + """ + return self._decomposed_layers + + @decomposed_layers.setter + def decomposed_layers(self, decomposed_layers: int) -> None: + """ + Sets the number of decomposed layers for memory optimization. + + Args: + decomposed_layers (int): Number of decomposed layers. + """ + if decomposed_layers == self._decomposed_layers: + return # Skip if no change. + + self._decomposed_layers = decomposed_layers + + @property + def explain(self) -> Optional[bool]: + """ + Returns whether the layer is in explainability mode. + """ + return self._explain + + @explain.setter + def explain(self, explain: Optional[bool]) -> None: + """ + Enables or disables explainability mode. + + Args: + explain (Optional[bool]): Whether to enable explainability mode. + """ + if explain == self._explain: + return # Skip if no change. + + self._explain = explain + + def explain_message( + self, + inputs: Tensor, + dim_size: Optional[int], + ) -> Tensor: + """ + Customizes how messages are explained for interpretability. + + Args: + inputs (Tensor): Messages to be explained. + dim_size (Optional[int]): Size of the dimension for explanation. + + Returns: + Tensor: Explained messages. + """ + edge_mask = self._edge_mask + + if edge_mask is None: + raise ValueError("No pre-defined 'edge_mask' found for explanation.") + + if self._apply_sigmoid: + edge_mask = paddle.nn.functional.sigmoid(edge_mask) + + if inputs.shape[self.node_dim] != edge_mask.shape[0]: + assert dim_size is not None + edge_mask = edge_mask[self._loop_mask] + loop = paddle.ones([dim_size], dtype=edge_mask.dtype) + edge_mask = paddle.concat([edge_mask, loop], axis=0) + assert inputs.shape[self.node_dim] == edge_mask.shape[0] + + size = [1] * len(inputs.shape) + size[self.node_dim] = -1 + return inputs * edge_mask.reshape(size) + + def register_propagate_forward_pre_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._propagate_forward_pre_hooks) + self._propagate_forward_pre_hooks[handle.id] = hook + return handle + + def register_propagate_forward_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._propagate_forward_hooks) + self._propagate_forward_hooks[handle.id] = hook + return handle + + def register_message_forward_pre_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._message_forward_pre_hooks) + self._message_forward_pre_hooks[handle.id] = hook + return handle + + def register_message_forward_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._message_forward_hooks) + self._message_forward_hooks[handle.id] = hook + return handle + + def register_aggregate_forward_pre_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._aggregate_forward_pre_hooks) + self._aggregate_forward_pre_hooks[handle.id] = hook + return handle + + def register_aggregate_forward_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._aggregate_forward_hooks) + self._aggregate_forward_hooks[handle.id] = hook + return handle + + def register_message_and_aggregate_forward_pre_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._message_and_aggregate_forward_pre_hooks) + self._message_and_aggregate_forward_pre_hooks[handle.id] = hook + return handle + + def register_message_and_aggregate_forward_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._message_and_aggregate_forward_hooks) + self._message_and_aggregate_forward_hooks[handle.id] = hook + return handle + + def register_edge_update_forward_pre_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._edge_update_forward_pre_hooks) + self._edge_update_forward_pre_hooks[handle.id] = hook + return handle + + def register_edge_update_forward_hook(self, hook: Callable) -> RemovableHandle: + handle = RemovableHandle(self._edge_update_forward_hooks) + self._edge_update_forward_hooks[handle.id] = hook + return handle + + def _set_jittable_templates(self, raise_on_error: bool = False) -> None: + root_dir = osp.dirname(osp.realpath(__file__)) + jinja_prefix = f'{self.__module__}_{self.__class__.__name__}' + + # Optimize `propagate()` via templates: + if not self.propagate.__module__.startswith(jinja_prefix): + try: + if ('propagate' in self.__class__.__dict__ + and self.__class__.__dict__['propagate'] + != MessagePassingLayer.propagate): + raise ValueError("Cannot compile custom 'propagate' method") + + # Placeholder for Jinja template compilation. + # Add logic if Paddle needs Jinja-like behavior. + self.__class__._orig_propagate = self.__class__.propagate + except Exception as e: + if raise_on_error: + raise e + self.__class__._orig_propagate = self.__class__.propagate + + # Optimize `edge_updater()` via templates: + if (hasattr(self, 'edge_update') + and not self.edge_updater.__module__.startswith(jinja_prefix)): + try: + if ('edge_updater' in self.__class__.__dict__ + and self.__class__.__dict__['edge_updater'] + != MessagePassingLayer.edge_updater): + raise ValueError("Cannot compile custom 'edge_updater' method") + + # Placeholder for Jinja template compilation. + self.__class__._orig_edge_updater = self.__class__.edge_updater + except Exception as e: + if raise_on_error: + raise e + self.__class__._orig_edge_updater = self.__class__.edge_updater + + + def _get_propagate_signature(self) -> Signature: + """ + Gets the propagate method signature. + + Returns: + A `Signature` object containing parameter details and return type. + """ + param_dict = self.inspector.get_params_from_method_call( + 'propagate', exclude=[0, 'edge_index', 'size']) + update_signature = self.inspector.get_signature('update') + + return Signature( + param_dict=param_dict, + return_type=update_signature.return_type, + return_type_repr=update_signature.return_type_repr, + ) + + def _get_edge_updater_signature(self) -> Signature: + """ + Gets the edge updater method signature. + + Returns: + A `Signature` object containing parameter details and return type. + """ + param_dict = self.inspector.get_params_from_method_call( + 'edge_updater', exclude=[0, 'edge_index', 'size']) + edge_update_signature = self.inspector.get_signature('edge_update') + + return Signature( + param_dict=param_dict, + return_type=edge_update_signature.return_type, + return_type_repr=edge_update_signature.return_type_repr, + ) + + def jittable(self, typing: Optional[str] = None) -> 'MessagePassingLayer': + """ + Produces a new jittable module for compatibility. + + Note: + This method is deprecated and a no-op in Paddle implementation. + + Args: + typing (Optional[str]): Typing information (not used in Paddle). + + Returns: + self: The current instance of the layer. + """ + warnings.warn(f"'{self.__class__.__name__}.jittable' is deprecated " + f"and a no-op. Please remove its usage.") + return self \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/mf_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/mf_conv.py new file mode 100644 index 00000000..3535748b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/mf_conv.py @@ -0,0 +1,120 @@ +from typing import Tuple, Union + +from paddle import Tensor +from paddle.nn import LayerList + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, OptPairTensor, Size, SparseTensor +from paddle_geometric.utils import degree, spmm + + +class MFConv(MessagePassing): + r"""The graph neural network operator from the + `"Convolutional Networks on Graphs for Learning Molecular Fingerprints" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{W}^{(\deg(i))}_1 \mathbf{x}_i + + \mathbf{W}^{(\deg(i))}_2 \sum_{j \in \mathcal{N}(i)} \mathbf{x}_j + + which trains a distinct weight matrix for each possible vertex degree. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + max_degree (int, optional): The maximum node degree to consider when + updating weights (default: :obj:`10`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **inputs:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)` + - **outputs:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V_t}|, F_{out})` if bipartite + """ + def __init__(self, in_channels: Union[int, Tuple[int, int]], + out_channels: int, max_degree: int = 10, bias=True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.max_degree = max_degree + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.lins_l = LayerList([ + Linear(in_channels[0], out_channels, bias_attr=bias) + for _ in range(max_degree + 1) + ]) + + self.lins_r = LayerList([ + Linear(in_channels[1], out_channels, bias_attr=False) + for _ in range(max_degree + 1) + ]) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + for lin in self.lins_l: + lin.reset_parameters() + for lin in self.lins_r: + lin.reset_parameters() + + def forward( + self, + x: Union[Tensor, OptPairTensor], + edge_index: Adj, + size: Size = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + x_r = x[1] + + # Compute degree of each node + if isinstance(edge_index, SparseTensor): + deg = edge_index.storage.row_count() + elif isinstance(edge_index, Tensor): + i = 1 if self.flow == 'source_to_target' else 0 + N = x[0].shape[self.node_dim] + N = size[1] if size is not None else N + N = x_r.shape[self.node_dim] if x_r is not None else N + deg = degree(edge_index[i], N, dtype='int64') + deg = paddle.clip(deg, max=self.max_degree) + + # propagate_type: (x: OptPairTensor) + h = self.propagate(edge_index, x=x, size=size) + + out = paddle.zeros(shape=(h.shape[0], self.out_channels), dtype=h.dtype) + for i, (lin_l, lin_r) in enumerate(zip(self.lins_l, self.lins_r)): + idx = paddle.nonzero(deg == i).flatten() + r = lin_l(h.index_select(idx, axis=self.node_dim)) + + if x_r is not None: + r = r + lin_r(x_r.index_select(idx, axis=self.node_dim)) + + out.scatter_(idx, r, overwrite=True) + + return out + + def message(self, x_j: Tensor) -> Tensor: + return x_j + + def message_and_aggregate(self, adj_t: Adj, x: OptPairTensor) -> Tensor: + if isinstance(adj_t, SparseTensor): + adj_t = adj_t.set_value(None) + return spmm(adj_t, x[0], reduce=self.aggr) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/mixhop_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/mixhop_conv.py new file mode 100644 index 00000000..bd11abc2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/mixhop_conv.py @@ -0,0 +1,122 @@ +from typing import List, Optional + +import paddle +from paddle import Tensor +from paddle.nn import LayerList +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import zeros +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import spmm + + +class MixHopConv(MessagePassing): + r"""The Mix-Hop graph convolutional operator from the + `"MixHop: Higher-Order Graph Convolutional Architectures via Sparsified + Neighborhood Mixing" `_ paper. + + .. math:: + \mathbf{X}^{\prime}={\Bigg\Vert}_{p\in P} + {\left( \mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}} + \mathbf{\hat{D}}^{-1/2} \right)}^p \mathbf{X} \mathbf{\Theta}, + + where :math:`\mathbf{\hat{A}} = \mathbf{A} + \mathbf{I}` denotes the + adjacency matrix with inserted self-loops and + :math:`\hat{D}_{ii} = \sum_{j=0} \hat{A}_{ij}` its diagonal degree matrix. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + powers (List[int], optional): The powers of the adjacency matrix to + use. (default: :obj:`[0, 1, 2]`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** + node features :math:`(|\mathcal{V}|, |P| \cdot F_{out})` + """ + def __init__( + self, + in_channels: int, + out_channels: int, + powers: Optional[List[int]] = None, + add_self_loops: bool = True, + bias: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + if powers is None: + powers = [0, 1, 2] + + self.in_channels = in_channels + self.out_channels = out_channels + self.powers = powers + self.add_self_loops = add_self_loops + + self.lins = LayerList([ + Linear(in_channels, out_channels, bias_attr=False) + if p in powers else paddle.nn.Identity() + for p in range(max(powers) + 1) + ]) + + if bias: + self.bias = self.create_parameter([len(powers) * out_channels], is_bias=True) + else: + self.register_buffer('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + for lin in self.lins: + if hasattr(lin, 'reset_parameters'): + lin.reset_parameters() + zeros(self.bias) + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + if isinstance(edge_index, Tensor): + edge_index, edge_weight = gcn_norm( + edge_index, edge_weight, x.shape[self.node_dim], False, + self.add_self_loops, self.flow, x.dtype) + elif isinstance(edge_index, SparseTensor): + edge_index = gcn_norm( + edge_index, edge_weight, x.shape[self.node_dim], False, + self.add_self_loops, self.flow, x.dtype) + + outs = [self.lins[0](x)] + + for lin in self.lins[1:]: + # propagate_type: (x: Tensor, edge_weight: OptTensor) + x = self.propagate(edge_index, x=x, edge_weight=edge_weight) + outs.append(lin(x)) + + out = paddle.concat([outs[p] for p in self.powers], axis=-1) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.reshape([-1, 1]) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, powers={self.powers})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/nn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/nn_conv.py new file mode 100644 index 00000000..ef5ff76b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/nn_conv.py @@ -0,0 +1,124 @@ +from typing import Callable, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear, LayerList + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import reset, zeros +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, Size + + +class NNConv(MessagePassing): + r"""The continuous kernel-based convolutional operator from the + `"Neural Message Passing for Quantum Chemistry" + `_ paper. + + This convolution is also known as the edge-conditioned convolution from the + `"Dynamic Edge-Conditioned Filters in Convolutional Neural Networks on + Graphs" `_ paper (see + :class:`paddle_geometric.nn.conv.ECConv` for an alias): + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{\Theta} \mathbf{x}_i + + \sum_{j \in \mathcal{N}(i)} \mathbf{x}_j \cdot + h_{\mathbf{\Theta}}(\mathbf{e}_{i,j}), + + where :math:`h_{\mathbf{\Theta}}` denotes a neural network, *.i.e.* + a MLP. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + nn (Callable): A neural network :math:`h_{\mathbf{\Theta}}` that + maps edge features :obj:`edge_attr` of shape :obj:`[-1, + num_edge_features]` to shape + :obj:`[-1, in_channels * out_channels]`, *e.g.*, defined by + :class:`paddle.nn.Sequential`. + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"add"`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add the transformed root node features to the output. + (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V_t}|, F_{out})` if bipartite + """ + def __init__(self, in_channels: Union[int, Tuple[int, int]], + out_channels: int, nn: Callable, aggr: str = 'add', + root_weight: bool = True, bias: bool = True, **kwargs): + super().__init__(aggr=aggr, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.nn = nn + self.root_weight = root_weight + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.in_channels_l = in_channels[0] + + if root_weight: + self.lin = Linear(in_channels[1], out_channels, bias_attr=False) + + if bias: + self.bias = self.create_parameter([out_channels], is_bias=True) + else: + self.register_buffer('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + reset(self.nn) + if self.root_weight: + self.lin.reset_parameters() + zeros(self.bias) + + def forward( + self, + x: Union[Tensor, OptPairTensor], + edge_index: Adj, + edge_attr: OptTensor = None, + size: Size = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + # propagate_type: (x: OptPairTensor, edge_attr: OptTensor) + out = self.propagate(edge_index, x=x, edge_attr=edge_attr, size=size) + + x_r = x[1] + if x_r is not None and self.root_weight: + out = out + self.lin(x_r) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, edge_attr: Tensor) -> Tensor: + weight = self.nn(edge_attr) + weight = weight.reshape([-1, self.in_channels_l, self.out_channels]) + return paddle.matmul(x_j.unsqueeze(1), weight).squeeze(1) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, aggr={self.aggr}, nn={self.nn})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/pan_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/pan_conv.py new file mode 100644 index 00000000..89577386 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/pan_conv.py @@ -0,0 +1,119 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, SparseTensor +from paddle_geometric.utils import spmm + + +class PANConv(MessagePassing): + r"""The path integral based convolutional operator from the + `"Path Integral Based Convolution and Pooling for Graph Neural Networks" + `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \mathbf{M} \mathbf{X} \mathbf{W} + + where :math:`\mathbf{M}` denotes the normalized and learned maximal entropy + transition (MET) matrix that includes neighbors up to :obj:`filter_size` + hops: + + .. math:: + + \mathbf{M} = \mathbf{Z}^{-1/2} \sum_{n=0}^L e^{-\frac{E(n)}{T}} + \mathbf{A}^n \mathbf{Z}^{-1/2} + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + filter_size (int): The filter size :math:`L`. + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)`, + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + def __init__(self, in_channels: int, out_channels: int, filter_size: int, + **kwargs): + + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_size = filter_size + + self.lin = Linear(in_channels, out_channels) + self.weight = self.create_parameter(shape=[filter_size + 1], default_initializer=paddle.nn.initializer.Constant(0.5)) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin.reset_parameters() + self.weight.set_value(paddle.full([self.filter_size + 1], 0.5)) + + def forward( + self, + x: Tensor, + edge_index: Adj, + ) -> Tuple[Tensor, SparseTensor]: + + adj_t: Optional[SparseTensor] = None + if isinstance(edge_index, Tensor): + adj_t = SparseTensor(row=edge_index[1], col=edge_index[0], + sparse_sizes=(x.shape[0], x.shape[0])) + elif isinstance(edge_index, SparseTensor): + adj_t = edge_index.set_value(None) + + adj_t = self.panentropy(adj_t, dtype=x.dtype) + + deg = adj_t.storage.rowcount().astype(x.dtype) + deg_inv_sqrt = deg.pow(-0.5) + deg_inv_sqrt = paddle.where(deg_inv_sqrt == float('inf'), paddle.zeros_like(deg_inv_sqrt), deg_inv_sqrt) + M = deg_inv_sqrt.reshape([1, -1]) * adj_t * deg_inv_sqrt.reshape([-1, 1]) + + out = self.propagate(M, x=x, edge_weight=None) + out = self.lin(out) + return out, M + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.reshape([-1, 1]) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def panentropy(self, adj_t: SparseTensor, + dtype: Optional[str] = None) -> SparseTensor: + + if not adj_t.has_value(): + adj_t = adj_t.fill_value(1.0) + + tmp = SparseTensor.eye(adj_t.shape[0], adj_t.shape[1], has_value=True, + dtype=dtype, device=adj_t.place) + tmp = tmp.mul_nnz(self.weight[0]) + + outs = [tmp] + for i in range(1, self.filter_size + 1): + tmp = tmp @ adj_t + tmp = tmp.mul_nnz(self.weight[i]) + outs.append(tmp) + + row = paddle.concat([out.storage.row() for out in outs], axis=0) + col = paddle.concat([out.storage.col() for out in outs], axis=0) + value = paddle.concat([out.storage.value() for out in outs], axis=0) + + out = SparseTensor(row=row, col=col, value=value, + sparse_sizes=adj_t.sparse_sizes()).coalesce() + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, filter_size={self.filter_size})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/pdn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/pdn_conv.py new file mode 100644 index 00000000..bae0aab6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/pdn_conv.py @@ -0,0 +1,128 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Linear, ReLU, Sequential, Sigmoid, LayerList +from paddle.nn.initializer import Constant, Uniform + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, SparseTensor +from paddle_geometric.utils import spmm + + +class PDNConv(MessagePassing): + r"""The pathfinder discovery network convolutional operator from the + `"Pathfinder Discovery Networks for Neural Message Passing" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \sum_{j \in \mathcal{N}(i) \cup + \{i\}}f_{\Theta}(\textbf{e}_{(j,i)}) \cdot f_{\Omega}(\mathbf{x}_{j}) + + where :math:`z_{i,j}` denotes the edge feature vector from source node + :math:`j` to target node :math:`i`, and :math:`\mathbf{x}_{j}` denotes the + node feature vector of node :math:`j`. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + edge_dim (int): Edge feature dimensionality. + hidden_channels (int): Hidden edge feature dimensionality. + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + normalize (bool, optional): Whether to add self-loops and compute + symmetric normalization coefficients on the fly. + (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + def __init__(self, in_channels: int, out_channels: int, edge_dim: int, + hidden_channels: int, add_self_loops: bool = True, + normalize: bool = True, bias: bool = True, **kwargs): + + kwargs.setdefault("aggr", "add") + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.edge_dim = edge_dim + self.hidden_channels = hidden_channels + self.add_self_loops = add_self_loops + self.normalize = normalize + + self.lin = Linear(in_channels, out_channels, bias_attr=False) + + self.mlp = Sequential( + Linear(edge_dim, hidden_channels), + ReLU(), + Linear(hidden_channels, 1), + Sigmoid(), + ) + + if bias: + self.bias = self.create_parameter(shape=[out_channels], default_initializer=Constant(0.0)) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + self.lin.weight.set_value(paddle.uniform(self.lin.weight.shape, min=-1.0, max=1.0)) + self.mlp[0].weight.set_value(paddle.uniform(self.mlp[0].weight.shape, min=-1.0, max=1.0)) + self.mlp[2].weight.set_value(paddle.uniform(self.mlp[2].weight.shape, min=-1.0, max=1.0)) + self.mlp[0].bias.set_value(paddle.zeros_like(self.mlp[0].bias)) + self.mlp[2].bias.set_value(paddle.zeros_like(self.mlp[2].bias)) + if self.bias is not None: + self.bias.set_value(paddle.zeros_like(self.bias)) + + def forward(self, x: Tensor, edge_index: Adj, + edge_attr: Optional[Tensor] = None) -> Tensor: + + if isinstance(edge_index, SparseTensor): + edge_attr = edge_index.storage.value() + + if edge_attr is not None: + edge_attr = self.mlp(edge_attr).squeeze(-1) + + if isinstance(edge_index, SparseTensor): + edge_index = edge_index.set_value(edge_attr, layout='coo') + + if self.normalize: + if isinstance(edge_index, Tensor): + edge_index, edge_attr = gcn_norm(edge_index, edge_attr, + x.shape[self.node_dim], False, + self.add_self_loops, + self.flow, x.dtype) + elif isinstance(edge_index, SparseTensor): + edge_index = gcn_norm(edge_index, None, x.shape[self.node_dim], + False, self.add_self_loops, self.flow, + x.dtype) + + x = self.lin(x) + + # propagate_type: (x: Tensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, edge_weight=edge_attr) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.reshape([-1, 1]) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self): + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/pna_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/pna_conv.py new file mode 100644 index 00000000..3c374d31 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/pna_conv.py @@ -0,0 +1,207 @@ +from typing import Any, Callable, Dict, List, Optional, Union + +import paddle +from paddle import Tensor +from paddle.nn import LayerList, Sequential +from paddle.io import DataLoader + +from paddle_geometric.nn.aggr import DegreeScalerAggregation +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense import Linear +from paddle_geometric.utils import degree +from paddle_geometric.nn.resolver import activation_resolver +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.nn.inits import reset + + +class PNAConv(MessagePassing): + r"""The Principal Neighbourhood Aggregation graph convolution operator + from the `"Principal Neighbourhood Aggregation for Graph Nets" + `_ paper. + + .. math:: + \mathbf{x}_i^{\prime} = \gamma_{\mathbf{\Theta}} \left( + \mathbf{x}_i, \underset{j \in \mathcal{N}(i)}{\bigoplus} + h_{\mathbf{\Theta}} \left( \mathbf{x}_i, \mathbf{x}_j \right) + \right) + + with + + .. math:: + \bigoplus = \underbrace{\begin{bmatrix} + 1 \\ + S(\mathbf{D}, \alpha=1) \\ + S(\mathbf{D}, \alpha=-1) + \end{bmatrix} }_{\text{scalers}} + \otimes \underbrace{\begin{bmatrix} + \mu \\ + \sigma \\ + \max \\ + \min + \end{bmatrix}}_{\text{aggregators}}, + + where :math:`\gamma_{\mathbf{\Theta}}` and :math:`h_{\mathbf{\Theta}}` + denote MLPs. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + aggregators (List[str]): Set of aggregation function identifiers, + namely :obj:`"sum"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`, + :obj:`"var"` and :obj:`"std"`. + scalers (List[str]): Set of scaling function identifiers, namely + :obj:`"identity"`, :obj:`"amplification"`, + :obj:`"attenuation"`, :obj:`"linear"` and + :obj:`"inverse_linear"`. + deg (paddle.Tensor): Histogram of in-degrees of nodes in the training + set, used by scalers to normalize. + edge_dim (int, optional): Edge feature dimensionality (in case + there are any). (default :obj:`None`) + towers (int, optional): Number of towers (default: :obj:`1`). + pre_layers (int, optional): Number of transformation layers before + aggregation (default: :obj:`1`). + post_layers (int, optional): Number of transformation layers after + aggregation (default: :obj:`1`). + divide_input (bool, optional): Whether the input features should + be split between towers or not (default: :obj:`False`). + act (str or callable, optional): Pre- and post-layer activation + function to use. (default: :obj:`"relu"`) + act_kwargs (Dict[str, Any], optional): Arguments passed to the + respective activation function defined by :obj:`act`. + (default: :obj:`None`) + train_norm (bool, optional): Whether normalization parameters + are trainable. (default: :obj:`False`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge features :math:`(|\mathcal{E}|, D)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + def __init__( + self, + in_channels: int, + out_channels: int, + aggregators: List[str], + scalers: List[str], + deg: Tensor, + edge_dim: Optional[int] = None, + towers: int = 1, + pre_layers: int = 1, + post_layers: int = 1, + divide_input: bool = False, + act: Union[str, Callable, None] = "relu", + act_kwargs: Optional[Dict[str, Any]] = None, + train_norm: bool = False, + **kwargs, + ): + + aggr = DegreeScalerAggregation(aggregators, scalers, deg, train_norm) + super().__init__(aggr=aggr, node_dim=0, **kwargs) + + if divide_input: + assert in_channels % towers == 0 + assert out_channels % towers == 0 + + self.in_channels = in_channels + self.out_channels = out_channels + self.edge_dim = edge_dim + self.towers = towers + self.divide_input = divide_input + + self.F_in = in_channels // towers if divide_input else in_channels + self.F_out = self.out_channels // towers + + if self.edge_dim is not None: + self.edge_encoder = Linear(edge_dim, self.F_in) + + self.pre_nns = LayerList() + self.post_nns = LayerList() + for _ in range(towers): + modules = [Linear((3 if edge_dim else 2) * self.F_in, self.F_in)] + for _ in range(pre_layers - 1): + modules += [activation_resolver(act, **(act_kwargs or {}))] + modules += [Linear(self.F_in, self.F_in)] + self.pre_nns.append(Sequential(*modules)) + + in_channels = (len(aggregators) * len(scalers) + 1) * self.F_in + modules = [Linear(in_channels, self.F_out)] + for _ in range(post_layers - 1): + modules += [activation_resolver(act, **(act_kwargs or {}))] + modules += [Linear(self.F_out, self.F_out)] + self.post_nns.append(Sequential(*modules)) + + self.lin = Linear(out_channels, out_channels) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + if self.edge_dim is not None: + self.edge_encoder.reset_parameters() + for nn in self.pre_nns: + reset(nn) + for nn in self.post_nns: + reset(nn) + self.lin.reset_parameters() + + def forward(self, x: Tensor, edge_index: Adj, + edge_attr: Optional[Tensor] = None) -> Tensor: + + if self.divide_input: + x = x.reshape([-1, self.towers, self.F_in]) + else: + x = x.reshape([-1, 1, self.F_in]).expand([-1, self.towers, -1]) + + # propagate_type: (x: Tensor, edge_attr: Optional[Tensor]) + out = self.propagate(edge_index, x=x, edge_attr=edge_attr) + + out = paddle.concat([x, out], axis=-1) + outs = [nn(out[:, i]) for i, nn in enumerate(self.post_nns)] + out = paddle.concat(outs, axis=1) + + return self.lin(out) + + def message(self, x_i: Tensor, x_j: Tensor, + edge_attr: Optional[Tensor]) -> Tensor: + + h: Tensor = x_i # Dummy. + if edge_attr is not None: + edge_attr = self.edge_encoder(edge_attr) + edge_attr = edge_attr.reshape([-1, 1, self.F_in]) + edge_attr = edge_attr.expand([-1, self.towers, -1]) + h = paddle.concat([x_i, x_j, edge_attr], axis=-1) + else: + h = paddle.concat([x_i, x_j], axis=-1) + + hs = [nn(h[:, i]) for i, nn in enumerate(self.pre_nns)] + return paddle.stack(hs, axis=1) + + def __repr__(self): + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, towers={self.towers}, ' + f'edge_dim={self.edge_dim})') + + @staticmethod + def get_degree_histogram(loader: DataLoader) -> Tensor: + r"""Returns the degree histogram to be used as input for the :obj:`deg` + argument in :class:`PNAConv`. + """ + deg_histogram = paddle.zeros([1], dtype=paddle.int64) + for data in loader: + deg = degree(data.edge_index[1], num_nodes=data.num_nodes, + dtype=paddle.int64) + deg_bincount = paddle.bincount(deg, minlength=deg_histogram.shape[0]) + deg_histogram = deg_histogram.astype(deg_bincount.dtype) + if deg_bincount.shape[0] > deg_histogram.shape[0]: + deg_bincount[:deg_histogram.shape[0]] += deg_histogram + deg_histogram = deg_bincount + else: + assert deg_bincount.shape[0] == deg_histogram.shape[0] + deg_histogram += deg_bincount + + return deg_histogram diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/point_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/point_conv.py new file mode 100644 index 00000000..5f2a6264 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/point_conv.py @@ -0,0 +1,87 @@ +from typing import Callable, Optional, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import reset +from paddle_geometric.typing import Adj, OptTensor, PairOptTensor, PairTensor, SparseTensor +from paddle_geometric.utils import add_self_loops, remove_self_loops + + +class PointNetConv(MessagePassing): + r"""The PointNet set layer from the `"PointNet: Deep Learning on Point Sets + for 3D Classification and Segmentation" + `_ and `"PointNet++: Deep Hierarchical + Feature Learning on Point Sets in a Metric Space" + `_ papers. + + Args: + local_nn (Callable, optional): A neural network that maps node features + and relative spatial coordinates of shape `[-1, in_channels + num_dimensions]` + to shape `[-1, out_channels]`. + global_nn (Callable, optional): A neural network that maps aggregated node + features of shape `[-1, out_channels]` to shape `[-1, final_out_channels]`. + add_self_loops (bool, optional): If set to `False`, will not add self-loops to the input graph. + (default: `True`) + **kwargs (optional): Additional arguments of `paddle_geometric.nn.conv.MessagePassing`. + + """ + def __init__(self, local_nn: Optional[Callable] = None, + global_nn: Optional[Callable] = None, + add_self_loops: bool = True, **kwargs): + kwargs.setdefault('aggr', 'max') + super().__init__(**kwargs) + + self.local_nn = local_nn + self.global_nn = global_nn + self.add_self_loops = add_self_loops + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + reset(self.local_nn) + reset(self.global_nn) + + def forward( + self, + x: Union[OptTensor, PairOptTensor], + pos: Union[Tensor, PairTensor], + edge_index: Adj, + ) -> Tensor: + + if not isinstance(x, tuple): + x = (x, None) + + if isinstance(pos, Tensor): + pos = (pos, pos) + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + edge_index, _ = remove_self_loops(edge_index) + edge_index, _ = add_self_loops( + edge_index, num_nodes=min(pos[0].shape[0], pos[1].shape[0])) + elif isinstance(edge_index, SparseTensor): + edge_index = edge_index.set_diag() + + # propagate_type: (x: PairOptTensor, pos: PairTensor) + out = self.propagate(edge_index, x=x, pos=pos) + + if self.global_nn is not None: + out = self.global_nn(out) + + return out + + def message(self, x_j: Optional[Tensor], pos_i: Tensor, + pos_j: Tensor) -> Tensor: + msg = pos_j - pos_i + if x_j is not None: + msg = paddle.concat([x_j, msg], axis=1) + if self.local_nn is not None: + msg = self.local_nn(msg) + return msg + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(local_nn={self.local_nn}, ' + f'global_nn={self.global_nn})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/point_gnn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/point_gnn_conv.py new file mode 100644 index 00000000..197ccb8c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/point_gnn_conv.py @@ -0,0 +1,64 @@ +import paddle +from paddle import Tensor +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import reset +from paddle_geometric.typing import Adj + + +class PointGNNConv(MessagePassing): + r"""The PointGNN operator from the `"Point-GNN: Graph Neural Network for + 3D Object Detection in a Point Cloud" `_ + paper. + + Args: + mlp_h (paddle.nn.Layer): A neural network that maps node features + of size :math:`F_{in}` to three-dimensional coordination offsets. + mlp_f (paddle.nn.Layer): A neural network that computes :math:`e_{j,i}` + from the features of neighbors and the three-dimensional vector + `pos_j - pos_i + Delta pos_i`. + mlp_g (paddle.nn.Layer): A neural network that maps the aggregated edge + features back to the original feature dimension. + **kwargs (optional): Additional arguments of + `paddle_geometric.nn.conv.MessagePassing`. + + """ + def __init__( + self, + mlp_h: paddle.nn.Layer, + mlp_f: paddle.nn.Layer, + mlp_g: paddle.nn.Layer, + **kwargs, + ): + kwargs.setdefault('aggr', 'max') + super().__init__(**kwargs) + + self.mlp_h = mlp_h + self.mlp_f = mlp_f + self.mlp_g = mlp_g + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + reset(self.mlp_h) + reset(self.mlp_f) + reset(self.mlp_g) + + def forward(self, x: Tensor, pos: Tensor, edge_index: Adj) -> Tensor: + # propagate_type: (x: Tensor, pos: Tensor) + out = self.propagate(edge_index, x=x, pos=pos) + out = self.mlp_g(out) + return x + out + + def message(self, pos_j: Tensor, pos_i: Tensor, x_i: Tensor, + x_j: Tensor) -> Tensor: + delta = self.mlp_h(x_i) + e = paddle.concat([pos_j - pos_i + delta, x_j], axis=-1) + return self.mlp_f(e) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(\n' + f' mlp_h={self.mlp_h},\n' + f' mlp_f={self.mlp_f},\n' + f' mlp_g={self.mlp_g},\n' + f')') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/point_transformer_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/point_transformer_conv.py new file mode 100644 index 00000000..48f5a650 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/point_transformer_conv.py @@ -0,0 +1,110 @@ +from typing import Callable, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense import Linear +from paddle_geometric.nn.inits import reset +from paddle_geometric.typing import ( + Adj, + OptTensor, + PairTensor, + SparseTensor, + paddle_sparse, +) +from paddle_geometric.utils import add_self_loops, remove_self_loops, softmax + + +class PointTransformerConv(MessagePassing): + r"""The Point Transformer layer from the `"Point Transformer" + `_ paper. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + pos_nn (paddle.nn.Layer, optional): A neural network + which maps relative spatial coordinates to the output shape. + attn_nn (paddle.nn.Layer, optional): A neural network that maps + transformed node features to the output shape. + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + def __init__(self, in_channels: Union[int, Tuple[int, int]], + out_channels: int, pos_nn: Optional[Callable] = None, + attn_nn: Optional[Callable] = None, + add_self_loops: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.add_self_loops = add_self_loops + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.pos_nn = pos_nn if pos_nn is not None else Linear(3, out_channels) + self.attn_nn = attn_nn + self.lin = Linear(in_channels[0], out_channels, bias_attr=False) + self.lin_src = Linear(in_channels[0], out_channels, bias_attr=False) + self.lin_dst = Linear(in_channels[1], out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + reset(self.pos_nn) + if self.attn_nn is not None: + reset(self.attn_nn) + self.lin.reset_parameters() + self.lin_src.reset_parameters() + self.lin_dst.reset_parameters() + + def forward( + self, + x: Union[Tensor, PairTensor], + pos: Union[Tensor, PairTensor], + edge_index: Adj, + ) -> Tensor: + + if isinstance(x, Tensor): + alpha = (self.lin_src(x), self.lin_dst(x)) + x = (self.lin(x), x) + else: + alpha = (self.lin_src(x[0]), self.lin_dst(x[1])) + x = (self.lin(x[0]), x[1]) + + if isinstance(pos, Tensor): + pos = (pos, pos) + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + edge_index, _ = remove_self_loops(edge_index) + edge_index, _ = add_self_loops( + edge_index, num_nodes=min(pos[0].shape[0], pos[1].shape[0])) + elif isinstance(edge_index, SparseTensor): + edge_index = paddle_sparse.set_diag(edge_index) + + # propagate_type: (x: PairTensor, pos: PairTensor, alpha: PairTensor) + out = self.propagate(edge_index, x=x, pos=pos, alpha=alpha) + return out + + def message(self, x_j: Tensor, pos_i: Tensor, pos_j: Tensor, + alpha_i: Tensor, alpha_j: Tensor, index: Tensor, + ptr: OptTensor, size_i: Optional[int]) -> Tensor: + + delta = self.pos_nn(pos_i - pos_j) + alpha = alpha_i - alpha_j + delta + if self.attn_nn is not None: + alpha = self.attn_nn(alpha) + alpha = softmax(alpha, index, ptr, size_i) + return alpha * (x_j + delta) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/ppf_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/ppf_conv.py new file mode 100644 index 00000000..750050dd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/ppf_conv.py @@ -0,0 +1,95 @@ +from typing import Callable, Optional, Union + +import paddle +from paddle import Tensor +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import reset +from paddle_geometric.typing import Adj, OptTensor, PairOptTensor, PairTensor, SparseTensor +from paddle_geometric.utils import add_self_loops, remove_self_loops + + +def get_angle(v1: Tensor, v2: Tensor) -> Tensor: + return paddle.atan2( + paddle.norm(paddle.cross(v1, v2, axis=1), p=2, axis=1), + paddle.sum(v1 * v2, axis=1) + ) + + +def point_pair_features(pos_i: Tensor, pos_j: Tensor, normal_i: Tensor, + normal_j: Tensor) -> Tensor: + pseudo = pos_j - pos_i + return paddle.stack([ + paddle.norm(pseudo, p=2, axis=1), + get_angle(normal_i, pseudo), + get_angle(normal_j, pseudo), + get_angle(normal_i, normal_j) + ], axis=1) + + +class PPFConv(MessagePassing): + r"""The PPFNet operator from the `"PPFNet: Global Context Aware Local + Features for Robust 3D Point Matching" `_ + paper. + """ + def __init__(self, local_nn: Optional[Callable] = None, + global_nn: Optional[Callable] = None, + add_self_loops: bool = True, **kwargs): + kwargs.setdefault('aggr', 'max') + super().__init__(**kwargs) + + self.local_nn = local_nn + self.global_nn = global_nn + self.add_self_loops = add_self_loops + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + reset(self.local_nn) + reset(self.global_nn) + + def forward( + self, + x: Union[OptTensor, PairOptTensor], + pos: Union[Tensor, PairTensor], + normal: Union[Tensor, PairTensor], + edge_index: Adj, + ) -> Tensor: + + if not isinstance(x, tuple): + x = (x, None) + + if isinstance(pos, Tensor): + pos = (pos, pos) + + if isinstance(normal, Tensor): + normal = (normal, normal) + + if self.add_self_loops: + if isinstance(edge_index, Tensor): + edge_index, _ = remove_self_loops(edge_index) + edge_index, _ = add_self_loops(edge_index, + num_nodes=pos[1].shape[0]) + elif isinstance(edge_index, SparseTensor): + edge_index = paddle_sparse.set_diag(edge_index) + + # propagate_type: (x: PairOptTensor, pos: PairTensor, normal: PairTensor) + out = self.propagate(edge_index, x=x, pos=pos, normal=normal) + + if self.global_nn is not None: + out = self.global_nn(out) + + return out + + def message(self, x_j: OptTensor, pos_i: Tensor, pos_j: Tensor, + normal_i: Tensor, normal_j: Tensor) -> Tensor: + msg = point_pair_features(pos_i, pos_j, normal_i, normal_j) + if x_j is not None: + msg = paddle.concat([x_j, msg], axis=1) + if self.local_nn is not None: + msg = self.local_nn(msg) + return msg + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(local_nn={self.local_nn}, ' + f'global_nn={self.global_nn})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/propagate.jinja b/jointContribution/mattergen/paddle_geometric/nn/conv/propagate.jinja new file mode 100644 index 00000000..17271784 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/propagate.jinja @@ -0,0 +1,213 @@ +import typing +from typing import Union + +import torch +from torch import Tensor + +import paddle_geometric.typing +from paddle_geometric import is_compiling +from paddle_geometric.utils import is_sparse +from paddle_geometric.typing import Size, SparseTensor +{% for module in modules %} +from {{module}} import * +{%- endfor %} + + +{% include "collect.jinja" %} + + +def propagate( + self, + edge_index: Union[Tensor, SparseTensor], +{%- for param in signature.param_dict.values() %} + {{param.name}}: {{param.type_repr}}, +{%- endfor %} + size: Size = None, +) -> {{signature.return_type_repr}}: + + # Begin Propagate Forward Pre Hook ######################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._propagate_forward_pre_hooks.values(): + hook_kwargs = dict( +{%- for name in signature.param_dict %} + {{name}}={{name}}, +{%- endfor %} + ) + res = hook(self, (edge_index, size, hook_kwargs)) + if res is not None: + edge_index, size, hook_kwargs = res +{%- for name in signature.param_dict %} + {{name}} = hook_kwargs['{{name}}'] +{%- endfor %} + # End Propagate Forward Pre Hook ########################################### + + mutable_size = self._check_input(edge_index, size) + + # Run "fused" message and aggregation (if applicable). + fuse = False + if self.fuse: + if is_sparse(edge_index): + fuse = True + elif not torch.jit.is_scripting() and isinstance(edge_index, EdgeIndex): + if self.SUPPORTS_FUSED_EDGE_INDEX and edge_index.is_sorted_by_col: + fuse = True + + if fuse: + +{%- if fuse %} + # Begin Message and Aggregate Forward Pre Hook ######################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._message_and_aggregate_forward_pre_hooks.values(): + hook_kwargs = dict( +{%- for name in message_and_aggregate_args %} + {{name}}={{name}}, +{%- endfor %} + ) + res = hook(self, (edge_index, hook_kwargs)) + if res is not None: + edge_index, hook_kwargs = res +{%- for name in message_and_aggregate_args %} + {{name}} = hook_kwargs['{{name}}'] +{%- endfor %} + # End Message and Aggregate Forward Pre Hook ########################## + + out = self.message_and_aggregate( + edge_index, +{%- for name in message_and_aggregate_args %} + {{name}}, +{%- endfor %} + ) + + # Begin Message and Aggregate Forward Hook ############################# + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._message_and_aggregate_forward_hooks.values(): + hook_kwargs = dict( +{%- for name in message_and_aggregate_args %} + {{name}}={{name}}, +{%- endfor %} + ) + res = hook(self, (edge_index, hook_kwargs, ), out) + out = res if res is not None else out + # End Message and Aggregate Forward Hook ############################### + + out = self.update( + out, +{%- for name in update_args %} + {{name}}={{name}}, +{%- endfor %} + ) +{%- else %} + raise NotImplementedError("'message_and_aggregate' not implemented") +{%- endif %} + + else: + + kwargs = self.{{collect_name}}( + edge_index, +{%- for name in signature.param_dict %} + {{name}}, +{%- endfor %} + mutable_size, + ) + + # Begin Message Forward Pre Hook ####################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._message_forward_pre_hooks.values(): + hook_kwargs = dict( +{%- for name in message_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + res = hook(self, (hook_kwargs, )) + hook_kwargs = res[0] if isinstance(res, tuple) else res + if res is not None: + kwargs = CollectArgs( +{%- for name in collect_param_dict %} +{%- if name in message_args %} + {{name}}=hook_kwargs['{{name}}'], +{%- else %} + {{name}}=kwargs.{{name}}, +{%- endif %} +{%- endfor %} + ) + # End Message Forward Pre Hook ######################################### + + out = self.message( +{%- for name in message_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + + # Begin Message Forward Hook ########################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._message_forward_hooks.values(): + hook_kwargs = dict( +{%- for name in message_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + res = hook(self, (hook_kwargs, ), out) + out = res if res is not None else out + # End Message Forward Hook ############################################# + + # Begin Aggregate Forward Pre Hook ##################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._aggregate_forward_pre_hooks.values(): + hook_kwargs = dict( +{%- for name in aggregate_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + res = hook(self, (hook_kwargs, )) + hook_kwargs = res[0] if isinstance(res, tuple) else res + if res is not None: + kwargs = CollectArgs( +{%- for name in collect_param_dict %} +{%- if name in aggregate_args %} + {{name}}=hook_kwargs['{{name}}'], +{%- else %} + {{name}}=kwargs.{{name}}, +{%- endif %} +{%- endfor %} + ) + # End Aggregate Forward Pre Hook ####################################### + + out = self.aggregate( + out, +{%- for name in aggregate_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + + # Begin Aggregate Forward Hook ######################################### + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._aggregate_forward_hooks.values(): + hook_kwargs = dict( +{%- for name in aggregate_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + res = hook(self, (hook_kwargs, ), out) + out = res if res is not None else out + # End Aggregate Forward Hook ########################################### + + out = self.update( + out, +{%- for name in update_args %} + {{name}}=kwargs.{{name}}, +{%- endfor %} + ) + + # Begin Propagate Forward Hook ############################################ + if not torch.jit.is_scripting() and not is_compiling(): + for hook in self._propagate_forward_hooks.values(): + hook_kwargs = dict( +{%- for name in signature.param_dict %} + {{name}}={{name}}, +{%- endfor %} + ) + res = hook(self, (edge_index, mutable_size, hook_kwargs), out) + out = res if res is not None else out + # End Propagate Forward Hook ############################################## + + return out diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/res_gated_graph_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/res_gated_graph_conv.py new file mode 100644 index 00000000..8743ba7e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/res_gated_graph_conv.py @@ -0,0 +1,148 @@ +from typing import Callable, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer, Sigmoid +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import zeros +from paddle_geometric.typing import Adj, OptTensor, PairTensor +from typing import Callable, Optional, Tuple, Union + + +class ResGatedGraphConv(MessagePassing): + r"""The residual gated graph convolutional operator from the + `"Residual Gated Graph ConvNets" `_ + paper. + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{W}_1 \mathbf{x}_i + + \sum_{j \in \mathcal{N}(i)} \eta_{i,j} \odot \mathbf{W}_2 \mathbf{x}_j + + where the gate :math:`\eta_{i,j}` is defined as + + .. math:: + \eta_{i,j} = \sigma(\mathbf{W}_3 \mathbf{x}_i + \mathbf{W}_4 + \mathbf{x}_j) + + with :math:`\sigma` denoting the sigmoid function. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + act (callable, optional): Gating function :math:`\sigma`. + (default: :meth:`paddle.nn.Sigmoid()`) + edge_dim (int, optional): Edge feature dimensionality (in case + there are any). (default: :obj:`None`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add transformed root node features to the output. + (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **inputs:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)` + - **outputs:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V_t}|, F_{out})` if bipartite + """ + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + act: Optional[Callable] = Sigmoid(), + edge_dim: Optional[int] = None, + root_weight: bool = True, + bias: bool = True, + **kwargs, + ): + + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.act = act + self.edge_dim = edge_dim + self.root_weight = root_weight + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + edge_dim = edge_dim if edge_dim is not None else 0 + self.lin_key = Linear(in_channels[1] + edge_dim, out_channels) + self.lin_query = Linear(in_channels[0] + edge_dim, out_channels) + self.lin_value = Linear(in_channels[0] + edge_dim, out_channels) + + if root_weight: + self.lin_skip = Linear(in_channels[1], out_channels, bias_attr=False) + else: + self.lin_skip = None + + if bias: + self.bias = self.create_parameter(shape=[out_channels], default_initializer=zeros) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin_key.reset_parameters() + self.lin_query.reset_parameters() + self.lin_value.reset_parameters() + if self.lin_skip is not None: + self.lin_skip.reset_parameters() + if self.bias is not None: + zeros(self.bias) + + def forward( + self, + x: Union[Tensor, PairTensor], + edge_index: Adj, + edge_attr: OptTensor = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + # In case edge features are not given, we can compute key, query and + # value tensors in node-level space, which is a bit more efficient: + if self.edge_dim is None: + k = self.lin_key(x[1]) + q = self.lin_query(x[0]) + v = self.lin_value(x[0]) + else: + k, q, v = x[1], x[0], x[0] + + # propagate_type: (k: Tensor, q: Tensor, v: Tensor, + # edge_attr: OptTensor) + out = self.propagate(edge_index, k=k, q=q, v=v, edge_attr=edge_attr) + + if self.root_weight: + out = out + self.lin_skip(x[1]) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, k_i: Tensor, q_j: Tensor, v_j: Tensor, + edge_attr: OptTensor) -> Tensor: + + assert (edge_attr is not None) == (self.edge_dim is not None) + + if edge_attr is not None: + k_i = self.lin_key(paddle.concat([k_i, edge_attr], axis=-1)) + q_j = self.lin_query(paddle.concat([q_j, edge_attr], axis=-1)) + v_j = self.lin_value(paddle.concat([v_j, edge_attr], axis=-1)) + + return self.act(k_i + q_j) * v_j diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/rgat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/rgat_conv.py new file mode 100644 index 00000000..a63e0a04 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/rgat_conv.py @@ -0,0 +1,223 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, Linear, ReLU + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import glorot, ones, zeros +from paddle_geometric.typing import Adj, OptTensor, Size +from paddle_geometric.utils import scatter, softmax + + +class RGATConv(MessagePassing): + def __init__( + self, + in_channels: int, + out_channels: int, + num_relations: int, + num_bases: Optional[int] = None, + num_blocks: Optional[int] = None, + mod: Optional[str] = None, + attention_mechanism: str = "across-relation", + attention_mode: str = "additive-self-attention", + heads: int = 1, + dim: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + dropout: float = 0.0, + edge_dim: Optional[int] = None, + bias: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(node_dim=0, **kwargs) + + self.heads = heads + self.negative_slope = negative_slope + self.dropout = dropout + self.mod = mod + self.activation = ReLU() + self.concat = concat + self.attention_mode = attention_mode + self.attention_mechanism = attention_mechanism + self.dim = dim + self.edge_dim = edge_dim + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_relations = num_relations + self.num_bases = num_bases + self.num_blocks = num_blocks + + if self.attention_mechanism not in ["within-relation", "across-relation"]: + raise ValueError('attention mechanism must either be ' + '"within-relation" or "across-relation"') + + if self.attention_mode not in ["additive-self-attention", "multiplicative-self-attention"]: + raise ValueError('attention mode must either be ' + '"additive-self-attention" or "multiplicative-self-attention"') + + # Query and Key parameters + self.q = paddle.create_parameter( + shape=[heads * out_channels, heads * dim], dtype='float32') + self.k = paddle.create_parameter( + shape=[heads * out_channels, heads * dim], dtype='float32') + + # Bias handling + if bias and concat: + self.bias = paddle.create_parameter( + shape=[heads * dim * out_channels], dtype='float32') + elif bias and not concat: + self.bias = paddle.create_parameter( + shape=[dim * out_channels], dtype='float32') + else: + self.bias = None + + # Edge-specific linear transformation if edge_dim is provided + if edge_dim is not None: + self.lin_edge = nn.Linear(edge_dim, heads * out_channels, bias_attr=False) + self.e = paddle.create_parameter( + shape=[heads * out_channels, heads * dim], dtype='float32') + else: + self.lin_edge = None + self.e = None + + # Basis handling if num_bases is provided + if num_bases is not None: + self.att = paddle.create_parameter( + shape=[num_relations, num_bases], dtype='float32') + self.basis = paddle.create_parameter( + shape=[num_bases, in_channels, heads * out_channels], dtype='float32') + # Block-wise handling if num_blocks is provided + elif num_blocks is not None: + assert (self.in_channels % num_blocks == 0) and (heads * out_channels) % num_blocks == 0, \ + ("Both 'in_channels' and 'heads * out_channels' must be " + "multiples of 'num_blocks' used.") + self.weight = paddle.create_parameter( + shape=[num_relations, num_blocks, self.in_channels // num_blocks, + (heads * out_channels) // num_blocks], dtype='float32') + else: + self.weight = paddle.create_parameter( + shape=[num_relations, self.in_channels, heads * out_channels], dtype='float32') + + # Other weights + self.w = paddle.create_parameter(shape=[out_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(1)) + self.l1 = paddle.create_parameter(shape=[1, out_channels], dtype='float32') + self.b1 = paddle.create_parameter(shape=[1, out_channels], dtype='float32') + self.l2 = paddle.create_parameter(shape=[out_channels, out_channels], dtype='float32') + self.b2 = paddle.create_parameter(shape=[1, out_channels], dtype='float32') + + + self._alpha = None + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + if self.num_bases is not None: + glorot(self.basis) + glorot(self.att) + else: + glorot(self.weight) + glorot(self.q) + glorot(self.k) + zeros(self.bias) + ones(self.l1) + zeros(self.b1) + self.l2.set_value(paddle.full(shape=self.l2.shape, fill_value=1 / self.out_channels)) + zeros(self.b2) + if self.lin_edge is not None: + glorot(self.lin_edge) + glorot(self.e) + + def forward( + self, + x: Tensor, + edge_index: Adj, + edge_type: OptTensor = None, + edge_attr: OptTensor = None, + size: Size = None, + return_attention_weights=None, + ): + out = self.propagate(edge_index=edge_index, edge_type=edge_type, x=x, + size=size, edge_attr=edge_attr) + + alpha = self._alpha + self._alpha = None + + if isinstance(return_attention_weights, bool): + return out, (edge_index, alpha) + else: + return out + + def message(self, x_i: Tensor, x_j: Tensor, edge_type: Tensor, + edge_attr: OptTensor, index: Tensor, ptr: OptTensor, + size_i: Optional[int]) -> Tensor: + + if self.num_bases is not None: + w = paddle.matmul(self.att, self.basis.reshape([self.num_bases, -1])) + w = w.reshape([self.num_relations, self.in_channels, self.heads * self.out_channels]) + if self.num_blocks is not None: + w = self.weight + x_i = x_i.reshape([-1, 1, w.shape[1], w.shape[2]]) + x_j = x_j.reshape([-1, 1, w.shape[1], w.shape[2]]) + w = paddle.index_select(w, index=edge_type, axis=0) + outi = paddle.einsum('abcd,acde->ace', x_i, w).reshape([-1, self.heads * self.out_channels]) + outj = paddle.einsum('abcd,acde->ace', x_j, w).reshape([-1, self.heads * self.out_channels]) + else: + w = paddle.index_select(self.weight, index=edge_type, axis=0) + outi = paddle.bmm(x_i.unsqueeze(1), w).squeeze(-2) + outj = paddle.bmm(x_j.unsqueeze(1), w).squeeze(-2) + + qi = paddle.matmul(outi, self.q) + kj = paddle.matmul(outj, self.k) + + alpha_edge, alpha = 0, paddle.zeros([1]) + if edge_attr is not None: + if edge_attr.dim() == 1: + edge_attr = edge_attr.unsqueeze(-1) + edge_attributes = self.lin_edge(edge_attr).reshape([-1, self.heads * self.out_channels]) + if edge_attributes.shape[0] != edge_attr.shape[0]: + edge_attributes = paddle.index_select(edge_attributes, index=edge_type, axis=0) + alpha_edge = paddle.matmul(edge_attributes, self.e) + + if self.attention_mode == "additive-self-attention": + alpha = F.leaky_relu(qi + kj + alpha_edge, self.negative_slope) if edge_attr is not None else F.leaky_relu(qi + kj, self.negative_slope) + elif self.attention_mode == "multiplicative-self-attention": + alpha = (qi * kj * alpha_edge) if edge_attr is not None else (qi * kj) + + if self.attention_mechanism == "within-relation": + across_out = paddle.zeroslike(alpha) + for r in range(self.num_relations): + mask = edge_type == r + across_out[mask] = softmax(alpha[mask], index[mask]) + alpha = across_out + elif self.attention_mechanism == "across-relation": + alpha = softmax(alpha, index, ptr, size_i) + + self._alpha = alpha + + if self.mod == "additive": + return (outj.reshape([-1, self.heads, self.out_channels]) * alpha.unsqueeze(-1)) + + elif self.mod == "scaled": + degree = scatter(paddle.ones_like(alpha), index, dim_size=size_i, reduce='sum')[index].unsqueeze(-1) + degree = paddle.matmul(degree, self.l1) + self.b1 + degree = self.activation(degree) + degree = paddle.matmul(degree, self.l2) + self.b2 + return paddle.multiply(outj.reshape([-1, self.heads, self.out_channels]) * alpha.unsqueeze(-1), degree) + + return outj.reshape([-1, self.heads, self.out_channels]) * alpha.unsqueeze(-1) + + def update(self, aggr_out: Tensor) -> Tensor: + aggr_out = aggr_out.reshape([-1, self.heads * self.dim * self.out_channels]) if self.concat else aggr_out.mean(axis=1) + if self.bias is not None: + aggr_out += self.bias + return aggr_out + + def __repr__(self) -> str: + return '{}({}, {}, heads={})'.format(self.__class__.__name__, + self.in_channels, + self.out_channels, self.heads) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/rgcn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/rgcn_conv.py new file mode 100644 index 00000000..f15b6899 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/rgcn_conv.py @@ -0,0 +1,327 @@ +from typing import Optional, Tuple, Union + +import paddle +from paddle import nn +from paddle.nn import Layer + +import paddle_geometric.backend +import paddle_geometric.typing +from paddle_geometric import is_compiling +from paddle_geometric.index import index2ptr +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.typing import ( + Adj, + OptTensor, + SparseTensor, + pyg_lib, + paddle_sparse, +) +from paddle_geometric.utils import index_sort, one_hot, scatter, spmm + + +def masked_edge_index(edge_index: Adj, edge_mask: paddle.Tensor) -> Adj: + if isinstance(edge_index, paddle.Tensor): + return edge_index[:, edge_mask] + return paddle_sparse.masked_select_nnz(edge_index, edge_mask, layout='coo') + + +class RGCNConv(nn.Layer): + r""" + The relational graph convolutional operator. + + Args: + in_channels (int or tuple): Size of each input sample. A tuple + corresponds to the sizes of source and target dimensionalities. + In case no input features are given, this argument should + correspond to the number of nodes in your graph. + out_channels (int): Size of each output sample. + num_relations (int): Number of relations. + num_bases (int, optional): If set, this layer will use the + basis-decomposition regularization scheme where :obj:`num_bases` + denotes the number of bases to use. (default: :obj:`None`) + num_blocks (int, optional): If set, this layer will use the + block-diagonal-decomposition regularization scheme where + :obj:`num_blocks` denotes the number of blocks to use. + (default: :obj:`None`) + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"mean"`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add transformed root node features to the output. + (default: :obj:`True`) + is_sorted (bool, optional): If set to :obj:`True`, assumes that + :obj:`edge_index` is sorted by :obj:`edge_type`. This avoids + internal re-sorting of the data and can improve runtime and memory + efficiency. (default: :obj:`False`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + """ + + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + num_relations: int, + num_bases: Optional[int] = None, + num_blocks: Optional[int] = None, + aggr: str = 'mean', + root_weight: bool = True, + is_sorted: bool = False, + bias: bool = True, + ): + super().__init__() + + if num_bases is not None and num_blocks is not None: + raise ValueError('Cannot apply both basis-decomposition and ' + 'block-diagonal-decomposition at the same time.') + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_relations = num_relations + self.num_bases = num_bases + self.num_blocks = num_blocks + self.is_sorted = is_sorted + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + self.in_channels_l = in_channels[0] + + if num_bases is not None: + self.weight = self.create_parameter( + shape=[num_bases, in_channels[0], out_channels], + default_initializer=paddle.nn.initializer.XavierUniform()) + self.comp = self.create_parameter( + shape=[num_relations, num_bases], + default_initializer=paddle.nn.initializer.XavierUniform()) + + elif num_blocks is not None: + if in_channels[0] % num_blocks != 0 or out_channels % num_blocks != 0: + raise ValueError("Input and output channels must be divisible by num_blocks.") + self.weight = self.create_parameter( + shape=[num_relations, num_blocks, + in_channels[0] // num_blocks, out_channels // num_blocks], + default_initializer=paddle.nn.initializer.XavierUniform()) + self.comp = None + + else: + self.weight = self.create_parameter( + shape=[num_relations, in_channels[0], out_channels], + default_initializer=paddle.nn.initializer.XavierUniform()) + self.comp = None + + if root_weight: + self.root = self.create_parameter( + shape=[in_channels[1], out_channels], + default_initializer=paddle.nn.initializer.XavierUniform()) + else: + self.root = None + + if bias: + self.bias = self.create_parameter( + shape=[out_channels], + default_initializer=paddle.nn.initializer.Constant(0.0)) + else: + self.bias = None + + self.aggr = aggr + self.reset_parameters() + + def reset_parameters(self): + """ + Resets all learnable parameters of the layer. + """ + paddle.nn.initializer.XavierUniform()(self.weight) + if self.comp is not None: + paddle.nn.initializer.XavierUniform()(self.comp) + if self.root is not None: + paddle.nn.initializer.XavierUniform()(self.root) + if self.bias is not None: + paddle.nn.initializer.Constant(0.0)(self.bias) + def forward( + self, + x: Union[Optional[paddle.Tensor], Tuple[Optional[paddle.Tensor], paddle.Tensor]], + edge_index: Union[paddle.Tensor, Tuple[paddle.Tensor, paddle.Tensor]], + edge_type: Optional[paddle.Tensor] = None, + ) -> paddle.Tensor: + """ + Runs the forward pass of the module. + + Args: + x (paddle.Tensor or tuple, optional): The input node features. + Can be either a `[num_nodes, in_channels]` node feature + matrix, or an optional one-dimensional node index paddle.Tensor (in + which case input features are treated as trainable node + embeddings). Furthermore, `x` can be of type `tuple` denoting + source and destination node features. + edge_index (paddle.Tensor or tuple): The edge indices. + edge_type (paddle.Tensor, optional): The one-dimensional relation type/index + for each edge in `edge_index`. Should only be `None` in case + `edge_index` is a Sparsepaddle.Tensor. (default: `None`) + """ + # Convert input features to a pair of node features or node indices. + x_l: Optional[paddle.Tensor] = None + if isinstance(x, tuple): + x_l = x[0] + else: + x_l = x + if x_l is None: + x_l = paddle.arange(self.in_channels_l, dtype='int64') + + x_r: paddle.Tensor = x_l + if isinstance(x, tuple): + x_r = x[1] + + size = (x_l.shape[0], x_r.shape[0]) + if isinstance(edge_index, paddle.Tensor): + if edge_type is None: + raise ValueError("edge_type must be provided when edge_index is a paddle.Tensor.") + + out = paddle.zeros([x_r.shape[0], self.out_channels], dtype=x_r.dtype) + + weight = self.weight + if self.num_bases is not None: # Basis-decomposition ================= + weight = paddle.matmul(self.comp, weight.reshape([self.num_bases, -1])) + weight = weight.reshape([self.num_relations, self.in_channels_l, self.out_channels]) + + if self.num_blocks is not None: # Block-diagonal-decomposition ===== + if not x_r.dtype.is_floating_point: + raise ValueError("Block-diagonal decomposition not supported for non-floating-point features.") + + for i in range(self.num_relations): + tmp = edge_index[:, edge_type == i] + h = self.propagate(tmp, x=x_l, size=size) + h = h.reshape([-1, weight.shape[1], weight.shape[2]]) + h = paddle.matmul(h, weight[i]) + out += h.reshape([-1, self.out_channels]) + + else: # No regularization/Basis-decomposition ======================== + for i in range(self.num_relations): + tmp = edge_index[:, edge_type == i] + + if not x_r.dtype.is_floating_point: + out += self.propagate(tmp, x=weight[i, x_l], size=size) + else: + h = self.propagate(tmp, x=x_l, size=size) + out += paddle.matmul(h, weight[i]) + + if self.root is not None: + if not x_r.dtype.is_floating_point: + out += self.root[x_r] + else: + out += paddle.matmul(x_r, self.root) + + if self.bias is not None: + out += self.bias + + return out + + def message(self, x_j: paddle.Tensor, edge_type_ptr: Optional[paddle.Tensor]) -> paddle.Tensor: + if edge_type_ptr is not None: + # TODO Re-weight according to edge type degree for `aggr=mean`. + return paddle.geometric.segment_matmul(x_j, edge_type_ptr, self.weight) + return x_j + + def message_and_aggregate(self, adj_t: paddle.Tensor, x: paddle.Tensor) -> paddle.Tensor: + if isinstance(adj_t, paddle.sparse.Sparsepaddle.Tensor): + adj_t = adj_t.set_value(None) + return paddle.geometric.sparse.matmul(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_relations={self.num_relations})') +class FastRGCNConv(Layer): + r"""See :class:`RGCNConv`.""" + def __init__(self, **kwargs): + super(FastRGCNConv, self).__init__() + # Initialize parent class and required attributes + self.aggr = kwargs.get("aggr", "mean") + self.num_relations = kwargs.get("num_relations", 1) + self.num_bases = kwargs.get("num_bases", None) + self.num_blocks = kwargs.get("num_blocks", None) + self.in_channels_l = kwargs.get("in_channels_l", 1) + self.out_channels = kwargs.get("out_channels", 1) + + # Parameters + self.weight = self.create_parameter( + shape=[self.num_relations, self.in_channels_l, self.out_channels], + is_bias=False, + ) + self.comp = self.create_parameter( + shape=[self.num_bases, self.in_channels_l, self.out_channels], + is_bias=False, + ) if self.num_bases else None + + self.root = self.create_parameter( + shape=[self.in_channels_l, self.out_channels], + is_bias=False, + ) + self.bias = self.create_parameter( + shape=[self.out_channels], + is_bias=True, + ) + + def forward(self, x: Union[paddle.Tensor, Tuple[Optional[paddle.Tensor], paddle.Tensor]], + edge_index: paddle.Tensor, edge_type: Optional[paddle.Tensor] = None) -> paddle.Tensor: + + self.fuse = False + assert self.aggr in ['add', 'sum', 'mean'] + + # Convert input features to a pair of node features or node indices. + x_l = x[0] if isinstance(x, tuple) else x + if x_l is None: + x_l = paddle.arange(self.in_channels_l) + + x_r = x_l if not isinstance(x, tuple) else x[1] + size = (x_l.shape[0], x_r.shape[0]) + + # propagate_type: (x: paddle.Tensor, edge_type: paddle.Tensor) + out = self.propagate(edge_index, x=x_l, edge_type=edge_type, size=size) + + if self.root is not None: + if x_r.dtype != paddle.float32: + out = out + self.root[x_r] + else: + out = out + paddle.matmul(x_r, self.root) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: paddle.Tensor, edge_type: paddle.Tensor, + edge_index_j: paddle.Tensor) -> paddle.Tensor: + weight = self.weight + if self.num_bases is not None: # Basis-decomposition ================= + weight = paddle.matmul(self.comp, weight.reshape([self.num_bases, -1])) + weight = weight.reshape( + [self.num_relations, self.in_channels_l, self.out_channels]) + + if self.num_blocks is not None: # Block-diagonal-decomposition ======= + if x_j.dtype != paddle.float32: + raise ValueError('Block-diagonal decomposition not supported ' + 'for non-continuous input features.') + + weight = weight[edge_type].reshape( + [-1, weight.shape[1], weight.shape[2]]) + x_j = x_j.reshape([-1, 1, weight.shape[1]]) + return paddle.matmul(x_j, weight).reshape([-1, self.out_channels]) + + else: # No regularization/Basis-decomposition ======================== + if x_j.dtype != paddle.float32: + weight_index = edge_type * weight.shape[1] + edge_index_j + return weight.reshape([-1, self.out_channels])[weight_index] + + return paddle.matmul(x_j.unsqueeze(-2), weight[edge_type]).squeeze(-2) + + def aggregate(self, inputs: paddle.Tensor, edge_type: paddle.Tensor, index: paddle.Tensor, + dim_size: Optional[int] = None) -> paddle.Tensor: + # Compute normalization in separation for each `edge_type`. + if self.aggr == 'mean': + norm = one_hot(edge_type, self.num_relations, dtype=inputs.dtype) + norm = scatter(norm, index, dim=0, dim_size=dim_size)[index] + norm = paddle.gather(norm, edge_type.reshape([-1, 1]), axis=1) + norm = 1. / paddle.clip(norm, min=1.) + inputs = norm * inputs + + return scatter(inputs, index, axis=self.node_dim, num=dim_size) \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/sage_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/sage_conv.py new file mode 100644 index 00000000..dbc8b104 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/sage_conv.py @@ -0,0 +1,150 @@ +from typing import List, Optional, Tuple, Union + +import paddle.nn.functional as F +from paddle import Tensor + +from paddle_geometric.nn.aggr import Aggregation, MultiAggregation +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, OptPairTensor, Size, SparseTensor +from paddle_geometric.utils import spmm + + + +class SAGEConv(MessagePassing): + r""" + The GraphSAGE operator from the "Inductive Representation Learning on + Large Graphs" (https://arxiv.org/abs/1706.02216) paper. + + This operator computes the node embeddings using the following equation: + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{W}_1 \mathbf{x}_i + \mathbf{W}_2 \cdot + \mathrm{mean}_{j \in \mathcal{N(i)}} \mathbf{x}_j + + If `project = True`, the equation is modified to apply a linear transformation + to node features before aggregation as described in Eq. (3) of the paper. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:-1 to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target dimensionalities. + out_channels (int): Size of each output sample. + aggr (str or Aggregation, optional): The aggregation scheme to use. + Any aggregation of :obj:paddle_geometric.nn.aggr can be used, + *e.g.*, :obj:"mean", :obj:"max", or :obj:"lstm". (default: :obj:"mean") + normalize (bool, optional): If set to :obj:True, output features will be + :math:\ell_2-normalized. (default: :obj:False) + root_weight (bool, optional): If set to :obj:False, the layer will not + add transformed root node features to the output. (default: :obj:True) + project (bool, optional): If set to :obj:True, the layer will apply a + linear transformation followed by an activation function before aggregation. + (default: :obj:False) + bias (bool, optional): If set to :obj:False, the layer will not learn + an additive bias. (default: :obj:True) + **kwargs (optional): Additional arguments of :class:paddle_geometric.nn.conv.MessagePassing. + + Shapes: + - **inputs:** + node features :math:`(|\mathcal{V}|, F_{in})` or + :math:`((|\mathcal{V_s}|, F_{s}), (|\mathcal{V_t}|, F_{t}))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)` + - **outputs:** node features :math:`(|\mathcal{V}|, F_{out})` or + :math:`(|\mathcal{V_t}|, F_{out})` if bipartite + """ + + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + aggr: Optional[Union[str, List[str], Aggregation]] = "mean", + normalize: bool = False, + root_weight: bool = True, + project: bool = False, + bias: bool = True, + **kwargs, + ): + self.in_channels = in_channels + self.out_channels = out_channels + self.normalize = normalize + self.root_weight = root_weight + self.project = project + + # If `in_channels` is an integer, we use the same value for both source and target + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + # Handle aggregation options for lstm + if aggr == 'lstm': + kwargs.setdefault('aggr_kwargs', {}) + kwargs['aggr_kwargs'].setdefault('in_channels', in_channels[0]) + kwargs['aggr_kwargs'].setdefault('out_channels', in_channels[0]) + + # Call super class constructor + super().__init__(aggr=aggr, **kwargs) + + if self.project: + if in_channels[0] <= 0: + raise ValueError(f"'{self.__class__.__name__}' does not " + f"support lazy initialization with " + f"project=True") + self.lin = Linear(in_channels[0], in_channels[0], bias=True) + + if isinstance(self.aggr_module, MultiAggregation): + aggr_out_channels = self.aggr_module.get_out_channels(in_channels[0]) + else: + aggr_out_channels = in_channels[0] + + self.lin_l = Linear(aggr_out_channels, out_channels, bias=bias) + if self.root_weight: + self.lin_r = Linear(in_channels[1], out_channels, bias=False) + + self.reset_parameters() + + def reset_parameters(self): + """Initialize the weights.""" + super().reset_parameters() + if self.project: + self.lin.reset_parameters() + self.lin_l.reset_parameters() + if self.root_weight: + self.lin_r.reset_parameters() + + def forward(self, x: Union[Tensor, OptPairTensor], edge_index: Adj, size: Size = None) -> Tensor: + """Forward pass of the SAGEConv layer.""" + if isinstance(x, Tensor): + x = (x, x) + + if self.project and hasattr(self, 'lin'): + x = (self.lin(x[0]).relu(), x[1]) + + # propagate_type: (x: OptPairTensor) + out = self.propagate(edge_index, x=x, size=size) + out = self.lin_l(out) + + # If root_weight is enabled, we add the transformed root features + x_r = x[1] + if self.root_weight and x_r is not None: + out = out + self.lin_r(x_r) + + # Normalize the output if required + if self.normalize: + out = F.normalize(out, p=2., axis=-1) + + return out + + def message(self, x_j: Tensor) -> Tensor: + """Message function to aggregate the neighbors' features.""" + return x_j + + def message_and_aggregate(self, adj_t: Adj, x: OptPairTensor) -> Tensor: + """Helper function for aggregation in the propagation step.""" + if isinstance(adj_t, SparseTensor): + adj_t = adj_t.set_value(None, layout=None) + return spmm(adj_t, x[0], reduce=self.aggr) + + def __repr__(self) -> str: + """String representation of the layer.""" + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, aggr={self.aggr})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/sg_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/sg_conv.py new file mode 100644 index 00000000..1d6799e6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/sg_conv.py @@ -0,0 +1,111 @@ +from typing import Optional + +from paddle import Tensor + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import spmm + + +class SGConv(MessagePassing): + r"""The simple graph convolutional operator from the `"Simplifying Graph + Convolutional Networks" `_ paper. + + .. math:: + \mathbf{X}^{\prime} = {\left(\mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}} + \mathbf{\hat{D}}^{-1/2} \right)}^K \mathbf{X} \mathbf{\Theta}, + + where :math:`\mathbf{\hat{A}} = \mathbf{A} + \mathbf{I}` denotes the + adjacency matrix with inserted self-loops and + :math:`\hat{D}_{ii} = \sum_{j=0} \hat{A}_{ij}` its diagonal degree matrix. + The adjacency matrix can include other values than :obj:`1` representing + edge weights via the optional :obj:`edge_weight` tensor. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + K (int, optional): Number of hops :math:`K`. (default: :obj:`1`) + cached (bool, optional): If set to :obj:`True`, the layer will cache + the computation of :math:`{\left(\mathbf{\hat{D}}^{-1/2} + \mathbf{\hat{A}} \mathbf{\hat{D}}^{-1/2} \right)}^K \mathbf{X}` on + first execution, and will use the cached version for further + executions. + This parameter should only be set to :obj:`True` in transductive + learning scenarios. (default: :obj:`False`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** + node features :math:`(|\mathcal{V}|, F_{out})` + """ + + _cached_x: Optional[Tensor] + + def __init__(self, in_channels: int, out_channels: int, K: int = 1, + cached: bool = False, add_self_loops: bool = True, + bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.K = K + self.cached = cached + self.add_self_loops = add_self_loops + + self._cached_x = None + + self.lin = Linear(in_channels, out_channels, bias=bias) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin.reset_parameters() + self._cached_x = None + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + cache = self._cached_x + if cache is None: + if isinstance(edge_index, Tensor): + edge_index, edge_weight = gcn_norm( # yapf: disable + edge_index, edge_weight, x.size(self.node_dim), False, + self.add_self_loops, self.flow, dtype=x.dtype) + elif isinstance(edge_index, SparseTensor): + edge_index = gcn_norm( # yapf: disable + edge_index, edge_weight, x.size(self.node_dim), False, + self.add_self_loops, self.flow, dtype=x.dtype) + + for k in range(self.K): + # propagate_type: (x: Tensor, edge_weight: OptTensor) + x = self.propagate(edge_index, x=x, edge_weight=edge_weight) + if self.cached: + self._cached_x = x + else: + x = cache.detach() + + return self.lin(x) + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.view(-1, 1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, K={self.K})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/signed_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/signed_conv.py new file mode 100644 index 00000000..867974fd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/signed_conv.py @@ -0,0 +1,146 @@ +from typing import Union, Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.typing import Adj, PairTensor, SparseTensor +from paddle_geometric.utils import spmm + + +class SignedConv(MessagePassing): + r""" + The signed graph convolutional operator from the `"Signed Graph + Convolutional Network" `_ paper. + + This operator computes node embeddings using positive and negative edges + as described in the paper. It has two different aggregation modes: + + 1. If `first_aggr` is set to `True`, positive and negative embeddings are + computed using separate transformations for each, and then combined. + 2. If `first_aggr` is set to `False`, the input features are expected to + be concatenated for positive and negative node features. + + Args: + in_channels (int): Size of each input sample. + out_channels (int): Size of each output sample. + first_aggr (bool): Denotes which aggregation formula to use. + bias (bool, optional): If set to `False`, the layer will not learn an + additive bias. (default: `True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + positive edge indices :math:`(2, |\mathcal{E}^{(+)}|)`, + negative edge indices :math:`(2, |\mathcal{E}^{(-)}|)` + - **output:** + node features :math:`(|\mathcal{V}|, F_{out})` + """ + + _cached_x: Optional[Tensor] + + def __init__(self, in_channels: int, out_channels: int, first_aggr: bool, + bias: bool = True, **kwargs): + """ + Initialize the SignedConv layer. + """ + kwargs.setdefault('aggr', 'mean') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.first_aggr = first_aggr + + if first_aggr: + self.lin_pos_l = Linear(in_channels, out_channels, bias_attr=False) + self.lin_pos_r = Linear(in_channels, out_channels, bias_attr=bias) + self.lin_neg_l = Linear(in_channels, out_channels, bias_attr=False) + self.lin_neg_r = Linear(in_channels, out_channels, bias_attr=bias) + else: + self.lin_pos_l = Linear(2 * in_channels, out_channels, bias_attr=False) + self.lin_pos_r = Linear(in_channels, out_channels, bias_attr=bias) + self.lin_neg_l = Linear(2 * in_channels, out_channels, bias_attr=False) + self.lin_neg_r = Linear(in_channels, out_channels, bias_attr=bias) + + self.reset_parameters() + + def reset_parameters(self): + """ + Reset the parameters of the SignedConv layer. + """ + super().reset_parameters() + self.lin_pos_l.reset_parameters() + self.lin_pos_r.reset_parameters() + self.lin_neg_l.reset_parameters() + self.lin_neg_r.reset_parameters() + + def forward( + self, + x: Union[Tensor, PairTensor], + pos_edge_index: Adj, + neg_edge_index: Adj, + ): + """ + Forward pass of the SignedConv layer. + """ + if isinstance(x, Tensor): + x = (x, x) + + if self.first_aggr: + # Aggregating positive and negative edge information separately + out_pos = self.propagate(pos_edge_index, x=x) + out_pos = self.lin_pos_l(out_pos) + out_pos = out_pos + self.lin_pos_r(x[1]) + + out_neg = self.propagate(neg_edge_index, x=x) + out_neg = self.lin_neg_l(out_neg) + out_neg = out_neg + self.lin_neg_r(x[1]) + + return paddle.concat([out_pos, out_neg], axis=-1) + else: + F_in = self.in_channels + + # Aggregating with concatenated positive and negative features + out_pos1 = self.propagate(pos_edge_index, + x=(x[0][..., :F_in], x[1][..., :F_in])) + out_pos2 = self.propagate(neg_edge_index, + x=(x[0][..., F_in:], x[1][..., F_in:])) + out_pos = paddle.concat([out_pos1, out_pos2], axis=-1) + out_pos = self.lin_pos_l(out_pos) + out_pos = out_pos + self.lin_pos_r(x[1][..., :F_in]) + + out_neg1 = self.propagate(pos_edge_index, + x=(x[0][..., F_in:], x[1][..., F_in:])) + out_neg2 = self.propagate(neg_edge_index, + x=(x[0][..., :F_in], x[1][..., :F_in])) + out_neg = paddle.concat([out_neg1, out_neg2], axis=-1) + out_neg = self.lin_neg_l(out_neg) + out_neg = out_neg + self.lin_neg_r(x[1][..., F_in:]) + + return paddle.concat([out_pos, out_neg], axis=-1) + + def message(self, x_j: Tensor) -> Tensor: + """ + Compute the message to pass during the aggregation step. + """ + return x_j + + def message_and_aggregate(self, adj_t: Adj, x: PairTensor) -> Tensor: + """ + Message aggregation step. + """ + if isinstance(adj_t, SparseTensor): + adj_t = adj_t.set_value(None, layout=None) + return spmm(adj_t, x[0], reduce=self.aggr) + + def __repr__(self) -> str: + """ + String representation of the SignedConv layer. + """ + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, first_aggr={self.first_aggr})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/simple_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/simple_conv.py new file mode 100644 index 00000000..5737a336 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/simple_conv.py @@ -0,0 +1,113 @@ +from typing import List, Optional, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric.nn.aggr import Aggregation +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, Size, SparseTensor +from paddle_geometric.utils import add_self_loops, spmm + + +class SimpleConv(MessagePassing): + r"""A simple message passing operator that performs (non-trainable) + propagation. + + .. math:: + \mathbf{x}^{\prime}_i = \bigoplus_{j \in \mathcal{N(i)}} e_{ji} \cdot + \mathbf{x}_j + + where :math:`\bigoplus` defines a custom aggregation scheme. + + Args: + aggr (str or [str] or Aggregation, optional): The aggregation scheme + to use, *e.g.*, :obj:`"add"`, :obj:`"sum"` :obj:`"mean"`, + :obj:`"min"`, :obj:`"max"` or :obj:`"mul"`. + In addition, can be any + :class:`~paddle_geometric.nn.aggr.Aggregation` module (or any string + that automatically resolves to it). (default: :obj:`"sum"`) + combine_root (str, optional): Specifies whether or how to combine the + central node representation (one of :obj:`"sum"`, :obj:`"cat"`, + :obj:`"self_loop"`, :obj:`None`). (default: :obj:`None`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **inputs:** + node features :math:`(|\mathcal{V}|, F)` or + :math:`((|\mathcal{V_s}|, F), (|\mathcal{V_t}|, *))` + if bipartite, + edge indices :math:`(2, |\mathcal{E}|)` + - **outputs:** node features :math:`(|\mathcal{V}|, F)` or + :math:`(|\mathcal{V_t}|, F)` if bipartite + """ + def __init__( + self, + aggr: Optional[Union[str, List[str], Aggregation]] = "sum", + combine_root: Optional[str] = None, + **kwargs, + ): + """ + Initialize the SimpleConv layer. + """ + if combine_root not in ['sum', 'cat', 'self_loop', None]: + raise ValueError(f"Received invalid value for 'combine_root' " + f"(got '{combine_root}')") + + super().__init__(aggr, **kwargs) + self.combine_root = combine_root + + def forward(self, x: Union[Tensor, OptPairTensor], edge_index: Adj, + edge_weight: OptTensor = None, size: Size = None) -> Tensor: + """ + Forward pass of the SimpleConv layer. + """ + if self.combine_root is not None: + if self.combine_root == 'self_loop': + if not isinstance(x, Tensor) or (size is not None + and size[0] != size[1]): + raise ValueError("Cannot use `combine_root='self_loop'` " + "for bipartite message passing") + if isinstance(edge_index, Tensor): + edge_index, edge_weight = add_self_loops( + edge_index, edge_weight, num_nodes=x.size(0)) + elif isinstance(edge_index, SparseTensor): + edge_index = paddle_sparse.set_diag(edge_index) + + if isinstance(x, Tensor): + x = (x, x) + + # propagate_type: (x: OptPairTensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, edge_weight=edge_weight, + size=size) + + x_dst = x[1] + if x_dst is not None and self.combine_root is not None: + if self.combine_root == 'sum': + out = out + x_dst + elif self.combine_root == 'cat': + out = paddle.concat([x_dst, out], axis=-1) + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + """ + Compute the message to pass during the aggregation step. + """ + return x_j if edge_weight is None else edge_weight.view(-1, 1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: OptPairTensor) -> Tensor: + """ + Message aggregation step. + """ + assert isinstance(self.aggr, str) + return spmm(adj_t, x[0], reduce=self.aggr) + + def __repr__(self) -> str: + """ + String representation of the SimpleConv layer. + """ + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, aggr={self.aggr})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/spline_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/spline_conv.py new file mode 100644 index 00000000..1c8ccf4a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/spline_conv.py @@ -0,0 +1,177 @@ +import warnings +from typing import List, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor, nn + +import paddle_geometric.typing +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import uniform, zeros +from paddle_geometric.typing import Adj, OptPairTensor, OptTensor, Size +from paddle_geometric.utils.repeat import repeat + + +spline_basis = spline_weighting = None + + +class SplineConv(MessagePassing): + r"""The spline-based convolutional operator from the `"SplineCNN: Fast + Geometric Deep Learning with Continuous B-Spline Kernels" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{1}{|\mathcal{N}(i)|} \sum_{j \in + \mathcal{N}(i)} \mathbf{x}_j \cdot + h_{\mathbf{\Theta}}(\mathbf{e}_{i,j}), + + where :math:`h_{\mathbf{\Theta}}` denotes a kernel function defined + over the weighted B-Spline tensor product basis. + + .. note:: + + Pseudo-coordinates must lay in the fixed interval :math:`[0, 1]` for + this method to work as intended. + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + dim (int): Pseudo-coordinate dimensionality. + kernel_size (int or [int]): Size of the convolving kernel. + is_open_spline (bool or [bool], optional): If set to :obj:`False`, the + operator will use a closed B-spline basis in this dimension. + (default :obj:`True`) + degree (int, optional): B-spline basis degrees. (default: :obj:`1`) + aggr (str, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"max"`). + (default: :obj:`"mean"`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add transformed root node features to the output. + (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + dim: int, + kernel_size: Union[int, List[int]], + is_open_spline: bool = True, + degree: int = 1, + aggr: str = 'mean', + root_weight: bool = True, + bias: bool = True, + **kwargs, + ): + super().__init__(aggr=aggr, **kwargs) + + if spline_basis is None: + raise ImportError("'SplineConv' requires 'paddle-spline-conv'") + + self.in_channels = in_channels + self.out_channels = out_channels + self.dim = dim + self.degree = degree + self.root_weight = root_weight + + kernel_size = paddle.to_tensor(repeat(kernel_size, dim), dtype=paddle.int64) + self.register_buffer('kernel_size', kernel_size) + + is_open_spline = repeat(is_open_spline, dim) + is_open_spline = paddle.to_tensor(is_open_spline, dtype=paddle.uint8) + self.register_buffer('is_open_spline', is_open_spline) + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.K = kernel_size.prod().item() + + # Initialize the weight parameter in static graph mode + if in_channels[0] > 0: + self.weight = paddle.create_parameter( + shape=[self.K, in_channels[0], out_channels], dtype='float32') + else: + self.weight = paddle.nn.parameter.UninitializedParameter() + self._hook = self.register_forward_pre_hook(self.initialize_parameters) + + # Create the linear layer if root_weight is True + if root_weight: + self.lin = Linear(in_channels[1], out_channels, bias_attr=False) + self.lin.weight.set_value(paddle.nn.initializer.Uniform()(self.lin.weight.shape)) + + # Bias handling: Create parameter for bias or register as None + if bias: + self.bias = paddle.create_parameter(shape=[out_channels], dtype='float32') + else: + self.register_parameter('bias', None) + + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + if not isinstance(self.weight, nn.UninitializedParameter): + size = self.weight.size(0) * self.weight.size(1) + uniform(size, self.weight) + if self.root_weight: + self.lin.reset_parameters() + zeros(self.bias) + + def forward(self, x: Union[Tensor, OptPairTensor], edge_index: Adj, + edge_attr: OptTensor = None, size: Size = None) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + if not x[0].is_gpu: + warnings.warn( + 'We do not recommend using the non-optimized CPU version of ' + '`SplineConv`. If possible, please move your data to GPU.') + + # propagate_type: (x: OptPairTensor, edge_attr: OptTensor) + out = self.propagate(edge_index, x=x, edge_attr=edge_attr, size=size) + + x_r = x[1] + if x_r is not None and self.root_weight: + out = out + self.lin(x_r) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, x_j: Tensor, edge_attr: Tensor) -> Tensor: + """ + Compute the message for each neighbor. + """ + data = spline_basis(edge_attr, self.kernel_size, self.is_open_spline, + self.degree) + return spline_weighting(x_j, self.weight, *data) + + @paddle.no_grad() + def initialize_parameters(self, module, input): + """ + Initialize parameters if weight is uninitialized. + """ + if isinstance(self.weight, paddle.nn.parameter.UninitializedParameter): + x = input[0][0] if isinstance(input, tuple) else input[0] + in_channels = x.size(-1) + self.weight.materialize((self.K, in_channels, self.out_channels)) + size = self.weight.size(0) * self.weight.size(1) + uniform(size, self.weight) + module._hook.remove() + delattr(module, '_hook') + + def __repr__(self) -> str: + """ + Return the string representation of the class. + """ + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, dim={self.dim})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/ssg_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/ssg_conv.py new file mode 100644 index 00000000..cb2f4fa3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/ssg_conv.py @@ -0,0 +1,124 @@ +import warnings +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import zeros +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import spmm + + +class SSGConv(MessagePassing): + r"""The simple spectral graph convolutional operator from the + `"Simple Spectral Graph Convolution" + `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \frac{1}{K} \sum_{k=1}^K\left((1-\alpha) + {\left(\mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}} + \mathbf{\hat{D}}^{-1/2} \right)}^k + \mathbf{X}+\alpha \mathbf{X}\right) \mathbf{\Theta}, + + where :math:`\mathbf{\hat{A}} = \mathbf{A} + \mathbf{I}` denotes the + adjacency matrix with inserted self-loops and + :math:`\hat{D}_{ii} = \sum_{j=0} \hat{A}_{ij}` its diagonal degree matrix. + The adjacency matrix can include other values than :obj:`1` representing + edge weights via the optional :obj:`edge_weight` tensor. + :class:`~paddle_geometric.nn.conv.SSGConv` is an improved operator of + :class:`~paddle_geometric.nn.conv.SGConv` by introducing the :obj:`alpha` + parameter to address the oversmoothing issue. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + alpha (float): Teleport probability :math:`\alpha \in [0, 1]`. + K (int, optional): Number of hops :math:`K`. (default: :obj:`1`) + cached (bool, optional): If set to :obj:`True`, the layer will cache + the computation of :math:`\frac{1}{K} \sum_{k=1}^K\left((1-\alpha) + {\left(\mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}} + \mathbf{\hat{D}}^{-1/2} \right)}^k \mathbf{X}+ + \alpha \mathbf{X}\right)` on first execution, and will use the + cached version for further executions. + This parameter should only be set to :obj:`True` in transductive + learning scenarios. (default: :obj:`False`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F_{in})`, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** + node features :math:`(|\mathcal{V}|, F_{out})` + """ + + _cached_h: Optional[Tensor] + + def __init__(self, in_channels: int, out_channels: int, alpha: float, + K: int = 1, cached: bool = False, add_self_loops: bool = True, + bias: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.alpha = alpha + self.K = K + self.cached = cached + self.add_self_loops = add_self_loops + + self._cached_h = None + + self.lin = Linear(in_channels, out_channels, bias=bias) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin.reset_parameters() + self._cached_h = None + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + cache = self._cached_h + if cache is None: + if isinstance(edge_index, Tensor): + edge_index, edge_weight = gcn_norm( # yapf: disable + edge_index, edge_weight, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + elif isinstance(edge_index, SparseTensor): + edge_index = gcn_norm( # yapf: disable + edge_index, edge_weight, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + + h = x * self.alpha + for k in range(self.K): + # propagate_type: (x: Tensor, edge_weight: OptTensor) + x = self.propagate(edge_index, x=x, edge_weight=edge_weight) + h = h + (1 - self.alpha) / self.K * x + if self.cached: + self._cached_h = h + else: + h = cache.detach() + + return self.lin(h) + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.view(-1, 1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, K={self.K}, alpha={self.alpha})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/supergat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/supergat_conv.py new file mode 100644 index 00000000..573294ee --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/supergat_conv.py @@ -0,0 +1,250 @@ +import math +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, Linear +from paddle.nn.initializer import XavierUniform, Constant + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.typing import Adj, OptTensor, SparseTensor, paddle_sparse +from paddle_geometric.utils import ( + add_self_loops, + batched_negative_sampling, + dropout_edge, + is_undirected, + negative_sampling, + remove_self_loops, + softmax, + to_undirected, +) + +class SuperGATConv(MessagePassing): + r"""The self-supervised graph attentional operator from the `"How to Find + Your Friendly Neighborhood: Graph Attention Design with Self-Supervision" + `_ paper. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + attention_type (str, optional): Type of attention to use + (:obj:`'MX'`, :obj:`'SD'`). (default: :obj:`'MX'`) + neg_sample_ratio (float, optional): The ratio of the number of sampled + negative edges to the number of positive edges. + (default: :obj:`0.5`) + edge_sample_ratio (float, optional): The ratio of samples to use for + training among the number of training edges. (default: :obj:`1.0`) + is_undirected (bool, optional): Whether the input graph is undirected. + If not given, will be automatically computed with the input graph + when negative sampling is performed. (default: :obj:`False`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + + def __init__(self, in_channels: int, out_channels: int, heads: int = 1, + concat: bool = True, negative_slope: float = 0.2, + dropout: float = 0.0, add_self_loops: bool = True, + bias: bool = True, attention_type: str = 'MX', + neg_sample_ratio: float = 0.5, edge_sample_ratio: float = 1.0, + is_undirected: bool = False, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + self.add_self_loops = add_self_loops + self.attention_type = attention_type + self.neg_sample_ratio = neg_sample_ratio + self.edge_sample_ratio = edge_sample_ratio + self.is_undirected = is_undirected + + assert attention_type in ['MX', 'SD'] + assert 0.0 < neg_sample_ratio and 0.0 < edge_sample_ratio <= 1.0 + + self.lin = Linear(in_channels, heads * out_channels, bias_attr=False) + self._glorot_initializer(self.lin.weight) + + if self.attention_type == 'MX': + self.att_l = self.create_parameter( + shape=(1, heads, out_channels), + default_initializer=XavierUniform() + ) + self.att_r = self.create_parameter( + shape=(1, heads, out_channels), + default_initializer=XavierUniform() + ) + else: # self.attention_type == 'SD' + self.att_l = None + self.att_r = None + + self.att_x = self.att_y = None # x/y for self-supervision + + if bias and concat: + self.bias = self.create_parameter( + shape=(heads * out_channels,), + default_initializer=Constant(0.0) + ) + elif bias and not concat: + self.bias = self.create_parameter( + shape=(out_channels,), + default_initializer=Constant(0.0) + ) + else: + self.bias = None + + self.reset_parameters() + def reset_parameters(self): + super().reset_parameters() + self.lin.reset_parameters() + self._glorot_initializer(self.att_l) + self._glorot_initializer(self.att_r) + self._zeros_initializer(self.bias) + + def forward( + self, + x: Tensor, + edge_index: Tensor, + neg_edge_index: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + ) -> Tensor: + N, H, C = x.shape[0], self.heads, self.out_channels + + if self.add_self_loops: + edge_index = add_self_loops(edge_index, num_nodes=N) + + x = self.lin(x).reshape([-1, H, C]) + + # propagate_type: (x: Tensor) + out = self.propagate(edge_index, x=x) + + if self.training: + pos_edge_index = self.positive_sampling(edge_index) + + pos_att = self.get_attention( + edge_index_i=pos_edge_index[1], + x_i=x[pos_edge_index[1]], + x_j=x[pos_edge_index[0]], + num_nodes=x.shape[0], + return_logits=True, + ) + + if neg_edge_index is None: + neg_edge_index = self.negative_sampling(edge_index, N, batch) + + neg_att = self.get_attention( + edge_index_i=neg_edge_index[1], + x_i=x[neg_edge_index[1]], + x_j=x[neg_edge_index[0]], + num_nodes=x.shape[0], + return_logits=True, + ) + + self.att_x = paddle.concat([pos_att, neg_att], axis=0) + self.att_y = paddle.zeros_like(self.att_x) + self.att_y[:pos_edge_index.shape[1]] = 1. + + if self.concat: + out = out.reshape([-1, self.heads * self.out_channels]) + else: + out = paddle.mean(out, axis=1) + + if self.bias is not None: + out += self.bias + + return out + + def message(self, edge_index_i: Tensor, x_i: Tensor, x_j: Tensor, + size_i: Optional[int]) -> Tensor: + alpha = self.get_attention(edge_index_i, x_i, x_j, num_nodes=size_i) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + return x_j * alpha.unsqueeze(-1) + + def negative_sampling(self, edge_index: Tensor, num_nodes: int, + batch: Optional[Tensor] = None) -> Tensor: + num_neg_samples = int(self.neg_sample_ratio * self.edge_sample_ratio * + edge_index.shape[1]) + + if not self.is_undirected and not is_undirected( + edge_index, num_nodes=num_nodes): + edge_index = to_undirected(edge_index, num_nodes=num_nodes) + + if batch is None: + neg_edge_index = negative_sampling(edge_index, num_nodes, + num_neg_samples=num_neg_samples) + else: + neg_edge_index = batched_negative_sampling( + edge_index, batch, num_neg_samples=num_neg_samples) + + return neg_edge_index + + def positive_sampling(self, edge_index: Tensor) -> Tensor: + pos_edge_index, _ = dropout_edge(edge_index, + p=1. - self.edge_sample_ratio, + training=self.training) + return pos_edge_index + + def get_attention(self, edge_index_i: Tensor, x_i: Tensor, x_j: Tensor, + num_nodes: Optional[int], + return_logits: bool = False) -> Tensor: + + if self.attention_type == 'MX': + logits = paddle.sum(x_i * x_j, axis=-1) + if return_logits: + return logits + + alpha = paddle.sum(x_j * self.att_l, axis=-1) + paddle.sum(x_i * self.att_r, axis=-1) + alpha = alpha * F.sigmoid(logits) + + else: # self.attention_type == 'SD' + alpha = paddle.sum(x_i * x_j, axis=-1) / math.sqrt(self.out_channels) + if return_logits: + return alpha + + alpha = F.leaky_relu(alpha, negative_slope=self.negative_slope) + alpha = softmax(alpha, edge_index_i, num_nodes=num_nodes) + return alpha + + def get_attention_loss(self) -> Tensor: + r"""Computes the self-supervised graph attention loss.""" + if not self.training: + return paddle.to_tensor([0], dtype=paddle.float32) + + return F.binary_cross_entropy_with_logits( + paddle.mean(self.att_x, axis=-1), + self.att_y, + ) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads}, ' + f'type={self.attention_type})') + + def _glorot_initializer(self, param): + if param is not None: + paddle.nn.initializer.XavierUniform()(param) + + def _zeros_initializer(self, param): + if param is not None: + paddle.assign(paddle.zeros_like(param), param) \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/tag_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/tag_conv.py new file mode 100644 index 00000000..e7fc3ac9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/tag_conv.py @@ -0,0 +1,112 @@ +import warnings +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.inits import zeros +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import spmm +from paddle_geometric.nn.conv.gcn_conv import gcn_norm + + +class TAGConv(MessagePassing): + r"""The topology adaptive graph convolutional networks operator from the + `"Topology Adaptive Graph Convolutional Networks" + `_ paper. + + .. math:: + \mathbf{X}^{\prime} = \sum_{k=0}^K \left( \mathbf{D}^{-1/2} \mathbf{A} + \mathbf{D}^{-1/2} \right)^k \mathbf{X} \mathbf{W}_{k}, + + where :math:`\mathbf{A}` denotes the adjacency matrix and + :math:`D_{ii} = \sum_{j=0} A_{ij}` its diagonal degree matrix. + The adjacency matrix can include other values than :obj:`1` representing + edge weights via the optional :obj:`edge_weight` tensor. + + Args: + in_channels (int): Size of each input sample, or :obj:`-1` to derive + the size from the first input(s) to the forward method. + out_channels (int): Size of each output sample. + K (int, optional): Number of hops :math:`K`. (default: :obj:`3`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + normalize (bool, optional): Whether to apply symmetric normalization. + (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node_features :math:`(|\mathcal{V}|, F_{in})`, + edge_index :math:`(2, |\mathcal{E}|)`, + edge_weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F_{out})` + """ + + _cached_h: Optional[Tensor] + + def __init__(self, in_channels: int, out_channels: int, K: int = 3, + bias: bool = True, normalize: bool = True, **kwargs): + kwargs.setdefault('aggr', 'add') + super().__init__(**kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.K = K + self.normalize = normalize + + self.lins = paddle.nn.LayerList([ + Linear(in_channels, out_channels, bias=False) for _ in range(K + 1) + ]) + + if bias: + self.bias = paddle.nn.Parameter(paddle.empty(out_channels)) + else: + self.register_parameter('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + for lin in self.lins: + lin.reset_parameters() + zeros(self.bias) + + def forward(self, x: Tensor, edge_index: Adj, + edge_weight: OptTensor = None) -> Tensor: + + cache = self._cached_h + if cache is None: + if isinstance(edge_index, paddle.Tensor): + edge_index, edge_weight = gcn_norm( # yapf: disable + edge_index, edge_weight, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + elif isinstance(edge_index, SparseTensor): + edge_index = gcn_norm( # yapf: disable + edge_index, edge_weight, x.shape[0], False, + self.add_self_loops, self.flow, dtype=x.dtype) + + h = x * self.alpha + for k in range(self.K): + # propagate_type: (x: Tensor, edge_weight: OptTensor) + x = self.propagate(edge_index, x=x, edge_weight=edge_weight) + h = h + (1 - self.alpha) / self.K * x + if self.cached: + self._cached_h = h + else: + h = cache.detach() + + return self.lin(h) + + def message(self, x_j: Tensor, edge_weight: Tensor) -> Tensor: + return edge_weight.view(-1, 1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, K={self.K})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/transformer_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/transformer_conv.py new file mode 100644 index 00000000..b59ac5c0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/transformer_conv.py @@ -0,0 +1,220 @@ +import math +import typing +from typing import Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import Adj, OptTensor, SparseTensor, PairTensor +from paddle_geometric.utils import softmax + + +class TransformerConv(MessagePassing): + r"""The graph transformer operator from the `"Masked Label Prediction: + Unified Message Passing Model for Semi-Supervised Classification" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \mathbf{W}_1 \mathbf{x}_i + + \sum_{j \in \mathcal{N}(i)} \alpha_{i,j} \mathbf{W}_2 \mathbf{x}_{j}, + + where the attention coefficients :math:`\alpha_{i,j}` are computed via + multi-head dot product attention: + + .. math:: + \alpha_{i,j} = \textrm{softmax} \left( + \frac{(\mathbf{W}_3\mathbf{x}_i)^{\top} (\mathbf{W}_4\mathbf{x}_j)} + {\sqrt{d}} \right) + + Args: + in_channels (int or tuple): Size of each input sample, or :obj:`-1` to + derive the size from the first input(s) to the forward method. + A tuple corresponds to the sizes of source and target + dimensionalities. + out_channels (int): Size of each output sample. + heads (int, optional): Number of multi-head-attentions. + (default: :obj:`1`) + concat (bool, optional): If set to :obj:`False`, the multi-head + attentions are averaged instead of concatenated. + (default: :obj:`True`) + beta (bool, optional): If set, will combine aggregation and + skip information via + .. math:: + \mathbf{x}^{\prime}_i = \beta_i \mathbf{W}_1 \mathbf{x}_i + + (1 - \beta_i) \underbrace{\left(\sum_{j \in \mathcal{N}(i)} + \alpha_{i,j} \mathbf{W}_2 \vec{x}_j \right)}_{=\mathbf{m}_i} + + with :math:`\beta_i = \textrm{sigmoid}(\mathbf{w}_5^{\top} + [ \mathbf{W}_1 \mathbf{x}_i, \mathbf{m}_i, \mathbf{W}_1 + \mathbf{x}_i - \mathbf{m}_i ])` (default: :obj:`False`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + edge_dim (int, optional): Edge feature dimensionality (in case + there are any). Edge features are added to the keys after + linear transformation, that is, prior to computing the + attention dot product. (default :obj:`None`) + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + root_weight (bool, optional): If set to :obj:`False`, the layer will + not add the transformed root node features to the output and the + option :attr:`beta` is set to :obj:`False`. (default: :obj:`True`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + """ + _alpha: OptTensor + + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + heads: int = 1, + concat: bool = True, + beta: bool = False, + dropout: float = 0., + edge_dim: Optional[int] = None, + bias: bool = True, + root_weight: bool = True, + **kwargs, + ): + kwargs.setdefault('aggr', 'add') + super().__init__(node_dim=0, **kwargs) + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.beta = beta and root_weight + self.root_weight = root_weight + self.concat = concat + self.dropout = dropout + self.edge_dim = edge_dim + self._alpha = None + + if isinstance(in_channels, int): + in_channels = (in_channels, in_channels) + + self.lin_key = Linear(in_channels[0], heads * out_channels) + self.lin_query = Linear(in_channels[1], heads * out_channels) + self.lin_value = Linear(in_channels[0], heads * out_channels) + if edge_dim is not None: + self.lin_edge = Linear(edge_dim, heads * out_channels, bias=False) + else: + self.lin_edge = self.register_parameter('lin_edge', None) + + if concat: + self.lin_skip = Linear(in_channels[1], heads * out_channels, + bias=bias) + if self.beta: + self.lin_beta = Linear(3 * heads * out_channels, 1, bias=False) + else: + self.lin_beta = self.register_parameter('lin_beta', None) + else: + self.lin_skip = Linear(in_channels[1], out_channels, bias=bias) + if self.beta: + self.lin_beta = Linear(3 * out_channels, 1, bias=False) + else: + self.lin_beta = self.register_parameter('lin_beta', None) + + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.lin_key.reset_parameters() + self.lin_query.reset_parameters() + self.lin_value.reset_parameters() + if self.edge_dim: + self.lin_edge.reset_parameters() + self.lin_skip.reset_parameters() + if self.beta: + self.lin_beta.reset_parameters() + + def forward( + self, + x: Union[Tensor, PairTensor], + edge_index: Adj, + edge_attr: OptTensor = None, + return_attention_weights: Optional[bool] = None, + ) -> Union[ + Tensor, + Tuple[Tensor, Tuple[Tensor, Tensor]], + Tuple[Tensor, SparseTensor], + ]: + r"""Runs the forward pass of the module. + + Args: + x (paddle.Tensor or (paddle.Tensor, paddle.Tensor)): The input node + features. + edge_index (paddle.Tensor or SparseTensor): The edge indices. + edge_attr (paddle.Tensor, optional): The edge features. + (default: :obj:`None`) + return_attention_weights (bool, optional): If set to :obj:`True`, + will additionally return the tuple + :obj:`(edge_index, attention_weights)`, holding the computed + attention weights for each edge. (default: :obj:`None`) + """ + H, C = self.heads, self.out_channels + + if isinstance(x, Tensor): + x = (x, x) + + query = self.lin_query(x[1]).reshape([-1, H, C]) + key = self.lin_key(x[0]).reshape([-1, H, C]) + value = self.lin_value(x[0]).reshape([-1, H, C]) + + out = self.propagate(edge_index, query=query, key=key, value=value, + edge_attr=edge_attr) + + alpha = self._alpha + self._alpha = None + + if self.concat: + out = out.reshape([-1, self.heads * self.out_channels]) + else: + out = out.mean(axis=1) + + if self.root_weight: + x_r = self.lin_skip(x[1]) + if self.lin_beta is not None: + beta = self.lin_beta(paddle.concat([out, x_r, out - x_r], axis=-1)) + beta = beta.sigmoid() + out = beta * x_r + (1 - beta) * out + else: + out = out + x_r + + if isinstance(return_attention_weights, bool): + assert alpha is not None + if isinstance(edge_index, Tensor): + return out, (edge_index, alpha) + elif isinstance(edge_index, SparseTensor): + return out, edge_index.set_value(alpha, layout='coo') + else: + return out + + def message(self, query_i: Tensor, key_j: Tensor, value_j: Tensor, + edge_attr: OptTensor, index: Tensor, ptr: OptTensor, + size_i: Optional[int]) -> Tensor: + + if self.lin_edge is not None: + assert edge_attr is not None + edge_attr = self.lin_edge(edge_attr).reshape([-1, self.heads, + self.out_channels]) + key_j = key_j + edge_attr + + alpha = (query_i * key_j).sum(axis=-1) / math.sqrt(self.out_channels) + alpha = softmax(alpha, index, ptr, size_i) + self._alpha = alpha + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + + out = value_j + if edge_attr is not None: + out = out + edge_attr + + out = out * alpha.reshape([-1, self.heads, 1]) + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/utils/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/conv/utils/__init__.py new file mode 100644 index 00000000..3ce5c160 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/utils/__init__.py @@ -0,0 +1,26 @@ +r"""GNN utility package.""" + +from .cheatsheet import paper_title, paper_link +from .cheatsheet import supports_sparse_tensor +from .cheatsheet import supports_edge_weights +from .cheatsheet import supports_edge_features +from .cheatsheet import supports_bipartite_graphs +from .cheatsheet import supports_static_graphs +from .cheatsheet import supports_lazy_initialization +from .cheatsheet import processes_heterogeneous_graphs +from .cheatsheet import processes_hypergraphs +from .cheatsheet import processes_point_clouds + +__all__ = [ + 'paper_title', + 'paper_link', + 'supports_sparse_tensor', + 'supports_edge_weights', + 'supports_edge_features', + 'supports_bipartite_graphs', + 'supports_static_graphs', + 'supports_lazy_initialization', + 'processes_heterogeneous_graphs', + 'processes_hypergraphs', + 'processes_point_clouds', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/utils/cheatsheet.py b/jointContribution/mattergen/paddle_geometric/nn/conv/utils/cheatsheet.py new file mode 100644 index 00000000..aab2dd32 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/utils/cheatsheet.py @@ -0,0 +1,73 @@ +import importlib +import inspect +import re +from typing import Optional + + +def paper_title(cls: str) -> Optional[str]: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + match = re.search('`\".+?\"', inspect.getdoc(cls), flags=re.DOTALL) + return None if match is None else match.group().replace('\n', ' ')[2:-1] + + +def paper_link(cls: str) -> Optional[str]: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + match = re.search('<.+?>', inspect.getdoc(cls), flags=re.DOTALL) + return None if match is None else match.group().replace('\n', ' ')[1:-1] + + +def supports_sparse_tensor(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return 'SparseTensor' in str(signature) + + +def supports_edge_weights(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return 'edge_weight' in str(signature) + + +def supports_edge_features(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return 'edge_attr' in str(signature) + + +def supports_bipartite_graphs(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return 'Union[torch.Tensor, Tuple[torch.Tensor' in str(signature) + + +def supports_static_graphs(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + return 'node_dim=' not in inspect.getsource(cls.__init__) + + +def supports_lazy_initialization(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + doc = re.sub(' +', ' ', inspect.getdoc(cls).replace('\n', ' ')) + match = re.search('or :obj:`-1` to derive the size from the first', doc) + return match is not None + + +def processes_heterogeneous_graphs(cls: str) -> bool: + if 'hetero' in cls.lower(): + return True + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return 'edge_index_dict' in str(signature) or 'edge_type' in str(signature) + + +def processes_hypergraphs(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return 'hyperedge_index' in str(signature) + + +def processes_point_clouds(cls: str) -> bool: + cls = importlib.import_module('paddle_geometric.nn.conv').__dict__[cls] + signature = inspect.signature(cls.forward) + return (('edge_index' not in str(signature) + and 'csc' not in str(signature)) or 'pos' in str(signature)) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/wl_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/wl_conv.py new file mode 100644 index 00000000..b446a55e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/wl_conv.py @@ -0,0 +1,89 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle_geometric.typing import Adj +from paddle_geometric.utils import ( + degree, + is_sparse, + scatter, + sort_edge_index, + to_edge_index, +) + +class WLConv(paddle.nn.Layer): + r"""The Weisfeiler Lehman (WL) operator from the `"A Reduction of a Graph + to a Canonical Form and an Algebra Arising During this Reduction" + `_ paper. + + :class:`WLConv` iteratively refines node colorings according to: + + .. math:: + \mathbf{x}^{\prime}_i = \textrm{hash} \left( \mathbf{x}_i, \{ + \mathbf{x}_j \colon j \in \mathcal{N}(i) \} \right) + + Shapes: + - **input:** + node coloring :math:`(|\mathcal{V}|, F_{in})` *(one-hot encodings)* or + :math:`(|\mathcal{V}|)` *(integer-based)*, + edge indices :math:`(2, |\mathcal{E}|)` + - **output:** node coloring :math:`(|\mathcal{V}|)` *(integer-based)* + """ + def __init__(self): + super().__init__() + self.hashmap = {} + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.hashmap = {} + + @paddle.no_grad() + def forward(self, x: Tensor, edge_index: Adj) -> Tensor: + r"""Runs the forward pass of the module.""" + if x.dim() > 1: + assert (x.sum(axis=-1) == 1).sum() == x.shape[0] + x = x.argmax(axis=-1) # one-hot -> integer. + assert x.dtype == paddle.int64 + + if is_sparse(edge_index): + col_and_row, _ = to_edge_index(edge_index) + col = col_and_row[0] + row = col_and_row[1] + else: + edge_index = sort_edge_index(edge_index, num_nodes=x.shape[0], + sort_by_row=False) + row, col = edge_index[0], edge_index[1] + + # `col` is sorted, so we can use it to `split` neighbors to groups: + deg = degree(col, x.shape[0], dtype=paddle.int64).tolist() + + out = [] + for node, neighbors in zip(x.tolist(), x[row].split(deg)): + idx = hash(tuple([node] + neighbors.sort()[0].tolist())) + if idx not in self.hashmap: + self.hashmap[idx] = len(self.hashmap) + out.append(self.hashmap[idx]) + + return paddle.to_tensor(out, dtype=paddle.int64, device=x.device) + + def histogram(self, x: Tensor, batch: Optional[Tensor] = None, + norm: bool = False) -> Tensor: + r"""Given a node coloring :obj:`x`, computes the color histograms of + the respective graphs (separated by :obj:`batch`). + """ + if batch is None: + batch = paddle.zeros([x.shape[0]], dtype=paddle.int64, device=x.device) + + num_colors = len(self.hashmap) + batch_size = int(batch.max()) + 1 + + index = batch * num_colors + x + out = scatter(paddle.ones_like(index), index, dim=0, + dim_size=num_colors * batch_size, reduce='sum') + out = out.reshape([batch_size, num_colors]) + + if norm: + out = out.astype(paddle.float32) + out /= out.norm(axis=-1, keepdim=True) + + return out diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/wl_conv_continuous.py b/jointContribution/mattergen/paddle_geometric/nn/conv/wl_conv_continuous.py new file mode 100644 index 00000000..cc6de38a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/wl_conv_continuous.py @@ -0,0 +1,88 @@ +from typing import Union + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.typing import ( + Adj, + OptPairTensor, + OptTensor, + Size, + SparseTensor, +) +from paddle_geometric.utils import scatter, spmm + + +class WLConvContinuous(MessagePassing): + r"""The Weisfeiler Lehman operator from the `"Wasserstein + Weisfeiler-Lehman Graph Kernels" `_ + paper. + + Refinement is done though a degree-scaled mean aggregation and works on + nodes with continuous attributes: + + .. math:: + \mathbf{x}^{\prime}_i = \frac{1}{2}\big(\mathbf{x}_i + + \frac{1}{\textrm{deg}(i)} + \sum_{j \in \mathcal{N}(i)} e_{j,i} \cdot \mathbf{x}_j \big) + + where :math:`e_{j,i}` denotes the edge weight from source node :obj:`j` to + target node :obj:`i` (default: :obj:`1`) + + Args: + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MessagePassing`. + + Shapes: + - **input:** + node features :math:`(|\mathcal{V}|, F)` or + :math:`((|\mathcal{V_s}|, F), (|\mathcal{V_t}|, F))` if bipartite, + edge indices :math:`(2, |\mathcal{E}|)`, + edge weights :math:`(|\mathcal{E}|)` *(optional)* + - **output:** node features :math:`(|\mathcal{V}|, F)` or + :math:`(|\mathcal{V}_t|, F)` if bipartite + """ + def __init__(self, **kwargs): + super().__init__(aggr='add', **kwargs) + + def forward( + self, + x: Union[Tensor, OptPairTensor], + edge_index: Adj, + edge_weight: OptTensor = None, + size: Size = None, + ) -> Tensor: + + if isinstance(x, Tensor): + x = (x, x) + + # propagate_type: (x: OptPairTensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=x, edge_weight=edge_weight, + size=size) + + if isinstance(edge_index, SparseTensor): + assert edge_weight is None + dst_index, _, edge_weight = edge_index.coo() + else: + dst_index = edge_index[1] + + if edge_weight is None: + edge_weight = x[0].new_ones(dst_index.shape[0]) + + deg = scatter(edge_weight, dst_index, 0, out.shape[0], reduce='sum') + deg_inv = 1. / deg + deg_inv.masked_fill_(deg_inv == float('inf'), 0) + out = deg_inv.unsqueeze(-1) * out + + x_dst = x[1] + if x_dst is not None: + out = 0.5 * (x_dst + out) + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.unsqueeze(-1) * x_j + + def message_and_aggregate(self, adj_t: Adj, x: OptPairTensor) -> Tensor: + return spmm(adj_t, x[0], reduce=self.aggr) diff --git a/jointContribution/mattergen/paddle_geometric/nn/conv/x_conv.py b/jointContribution/mattergen/paddle_geometric/nn/conv/x_conv.py new file mode 100644 index 00000000..c8ace0e1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/conv/x_conv.py @@ -0,0 +1,131 @@ +import math +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import ELU, BatchNorm1D as BN, Conv1D as Conv, Linear as L, Sequential as S + +import paddle_geometric.typing +from paddle_geometric.nn import Reshape +from paddle_geometric.nn.inits import reset + +knn_graph = None + + +class XConv(paddle.nn.Layer): + r"""The convolutional operator on :math:`\mathcal{X}`-transformed points + from the `"PointCNN: Convolution On X-Transformed Points" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \mathrm{Conv}\left(\mathbf{K}, + \gamma_{\mathbf{\Theta}}(\mathbf{P}_i - \mathbf{p}_i) \times + \left( h_\mathbf{\Theta}(\mathbf{P}_i - \mathbf{p}_i) \, \Vert \, + \mathbf{x}_i \right) \right), + + where :math:`\mathbf{K}` and :math:`\mathbf{P}_i` denote the trainable + filter and neighboring point positions of :math:`\mathbf{x}_i`, + respectively. + :math:`\gamma_{\mathbf{\Theta}}` and :math:`h_{\mathbf{\Theta}}` describe + neural networks, *i.e.* MLPs, where :math:`h_{\mathbf{\Theta}}` + individually lifts each point into a higher-dimensional space, and + :math:`\gamma_{\mathbf{\Theta}}` computes the :math:`\mathcal{X}`- + transformation matrix based on *all* points in a neighborhood. + """ + + def __init__(self, in_channels: int, out_channels: int, dim: int, + kernel_size: int, hidden_channels: Optional[int] = None, + dilation: int = 1, bias: bool = True, num_workers: int = 1): + super().__init__() + + if knn_graph is None: + raise ImportError('`XConv` requires `paddle-cluster`.') + + self.in_channels = in_channels + if hidden_channels is None: + hidden_channels = in_channels // 4 + assert hidden_channels > 0 + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.dim = dim + self.kernel_size = kernel_size + self.dilation = dilation + self.num_workers = num_workers + + C_in, C_delta, C_out = in_channels, hidden_channels, out_channels + D, K = dim, kernel_size + + self.mlp1 = S( + L(dim, C_delta), + ELU(), + BN(C_delta), + L(C_delta, C_delta), + ELU(), + BN(C_delta), + Reshape(-1, K, C_delta), + ) + + self.mlp2 = S( + L(D * K, K**2), + ELU(), + BN(K**2), + Reshape(-1, K, K), + Conv(K, K**2, K, groups=K), + ELU(), + BN(K**2), + Reshape(-1, K, K), + Conv(K, K**2, K, groups=K), + BN(K**2), + Reshape(-1, K, K), + ) + + C_in = C_in + C_delta + depth_multiplier = int(math.ceil(C_out / C_in)) + self.conv = S( + Conv(C_in, C_in * depth_multiplier, K, groups=C_in), + Reshape(-1, C_in * depth_multiplier), + L(C_in * depth_multiplier, C_out, bias=bias), + ) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + reset(self.mlp1) + reset(self.mlp2) + reset(self.conv) + + def forward(self, x: Tensor, pos: Tensor, batch: Optional[Tensor] = None): + r"""Runs the forward pass of the module.""" + pos = pos.unsqueeze(-1) if pos.ndim == 1 else pos + (N, D), K = pos.shape, self.kernel_size + + edge_index = knn_graph(pos, K * self.dilation, batch, loop=True, + flow='target_to_source', + num_workers=self.num_workers) + + if self.dilation > 1: + edge_index = edge_index[:, ::self.dilation] + + row, col = edge_index[0], edge_index[1] + + pos = pos[col] - pos[row] + + x_star = self.mlp1(pos) + if x is not None: + x = x.unsqueeze(-1) if x.ndim == 1 else x + x = x[col].reshape(N, K, self.in_channels) + x_star = paddle.concat([x_star, x], axis=-1) + x_star = x_star.transpose([0, 2, 1]).contiguous() + + transform_matrix = self.mlp2(pos.reshape(N, K * D)) + + x_transformed = paddle.matmul(x_star, transform_matrix) + + out = self.conv(x_transformed) + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/data_parallel.py b/jointContribution/mattergen/paddle_geometric/nn/data_parallel.py new file mode 100644 index 00000000..3fd7d131 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/data_parallel.py @@ -0,0 +1,120 @@ +import logging +import warnings +from itertools import chain + +import paddle +from paddle import nn +from paddle_geometric.data import Batch +from paddle_geometric.utils import cumsum + +if paddle.distributed.get_world_size() > 1: + # from paddle.distributed import parallel_apply + # fake parallel_apply + def parallel_apply(inputs, model): + pass + + +class DataParallel(nn.Layer): + r"""Implements data parallelism at the module level. + + This container parallelizes the application of the given :attr:`module` by + splitting a list of :class:`paddle_geometric.data.Data` objects and copying + them as :class:`paddle_geometric.data.Batch` objects to each device. + In the forward pass, the module is replicated on each device, and each + replica handles a portion of the input. + During the backwards pass, gradients from each replica are summed into the + original module. + + The batch size should be larger than the number of GPUs used. + + Args: + module (Module): Module to be parallelized. + device_ids (list of int or paddle.device): CUDA devices. + (default: all devices) + output_device (int or paddle.device): Device location of output. + (default: :obj:`device_ids[0]`) + follow_batch (list or tuple, optional): Creates assignment batch + vectors for each key in the list. (default: :obj:`None`) + exclude_keys (list or tuple, optional): Will exclude each key in the + list. (default: :obj:`None`) + """ + + def __init__(self, module, device_ids=None, output_device=None, + follow_batch=None, exclude_keys=None): + super(DataParallel, self).__init__() + + warnings.warn("'DataParallel' is usually much slower than " + "'DistributedDataParallel' even on a single machine. " + "Please consider switching to 'DistributedDataParallel' " + "for multi-GPU training.") + + self.module = module + self.device_ids = device_ids or paddle.device.get_device() + self.output_device = output_device or self.device_ids[0] + self.follow_batch = follow_batch or [] + self.exclude_keys = exclude_keys or [] + + def forward(self, data_list): + """""" # noqa: D419 + if len(data_list) == 0: + logging.warning('DataParallel received an empty data list, which ' + 'may result in unexpected behavior.') + return None + + if len(self.device_ids) == 1: # Fallback + data = Batch.from_data_list( + data_list, follow_batch=self.follow_batch, + exclude_keys=self.exclude_keys).to(self.device_ids[0]) + return self.module(data) + + # Check if the model is on the correct device + for param in self.module.parameters(): + if param.device != self.device_ids[0]: + raise RuntimeError( + f"Module must have its parameters on device " + f"'{self.device_ids[0]}' but found one of them on device " + f"'{param.device}'") + + inputs = self.scatter(data_list, self.device_ids) + replicas = self.replicate(self.module, self.device_ids[:len(inputs)]) + outputs = self.parallel_apply(replicas, inputs) + return self.gather(outputs, self.output_device) + + def scatter(self, data_list, device_ids): + num_devices = min(len(device_ids), len(data_list)) + + count = paddle.to_tensor([data.num_nodes for data in data_list], dtype='int64') + ptr = cumsum(count) + device_id = num_devices * ptr.cast('float32') / ptr[-1].item() + device_id = (device_id[:-1] + device_id[1:]) / 2.0 + device_id = device_id.cast('int64') # round. + split = cumsum(device_id.bincount()) + split = paddle.unique(split) + split = paddle.sort(split) + split = split.tolist() + + return [ + Batch.from_data_list(data_list[split[i]:split[i + 1]], + follow_batch=self.follow_batch, + exclude_keys=self.exclude_keys).to( + f'gpu:{device_ids[i]}') + for i in range(len(split) - 1) + ] + + def replicate(self, module, device_ids): + return nn.LayerList([module.copy().to(f'cuda:{device_ids[i]}') for i in range(len(device_ids))]) + + def parallel_apply(self, replicas, inputs): + # We use paddle.distributed for parallel_apply if available + if paddle.distributed.get_world_size() > 1: + return parallel_apply(replicas, inputs) + else: + # Fallback for single GPU + return [replica(*input) for replica, input in zip(replicas, inputs)] + + def gather(self, outputs, output_device): + # Gather the outputs from all devices + return outputs[0] # Assuming a single output + + def __repr__(self): + return f"{self.__class__.__name__}(device_ids={self.device_ids}, output_device={self.output_device})" diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/dense/__init__.py new file mode 100644 index 00000000..38239eee --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/__init__.py @@ -0,0 +1,33 @@ +r"""Dense neural network module package. + +This package provides modules applicable for operating on dense tensor +representations. +""" + +from .linear import Linear, HeteroLinear, HeteroDictLinear +from .dense_gat_conv import DenseGATConv +from .dense_sage_conv import DenseSAGEConv +from .dense_gcn_conv import DenseGCNConv +from .dense_graph_conv import DenseGraphConv +from .dense_gin_conv import DenseGINConv +from .diff_pool import dense_diff_pool +from .mincut_pool import dense_mincut_pool +from .dmon_pool import DMoNPooling + +__all__ = [ + 'Linear', + 'HeteroLinear', + 'HeteroDictLinear', + 'DenseGCNConv', + 'DenseGINConv', + 'DenseGraphConv', + 'DenseSAGEConv', + 'DenseGATConv', + 'dense_diff_pool', + 'dense_mincut_pool', + 'DMoNPooling', +] + +lin_classes = __all__[:3] +conv_classes = __all__[3:8] +pool_classes = __all__[8:] diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gat_conv.py b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gat_conv.py new file mode 100644 index 00000000..0a494200 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gat_conv.py @@ -0,0 +1,99 @@ +import math +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, Linear + +class DenseGATConv(Layer): + r"""See :class:`paddle_geometric.nn.conv.GATConv`.""" + def __init__( + self, + in_channels: int, + out_channels: int, + heads: int = 1, + concat: bool = True, + negative_slope: float = 0.2, + dropout: float = 0.0, + bias: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.concat = concat + self.negative_slope = negative_slope + self.dropout = dropout + + self.lin = Linear(in_channels, heads * out_channels, bias_attr=False) + + # Learnable parameters for attention coefficients: + self.att_src = self.create_parameter([1, 1, heads, out_channels]) + self.att_dst = self.create_parameter([1, 1, heads, out_channels]) + + if bias and concat: + self.bias = self.create_parameter([heads * out_channels]) + elif bias and not concat: + self.bias = self.create_parameter([out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + # Glorot (Xavier) initialization: + fan_in, fan_out = self.in_channels, self.heads * self.out_channels + bound = math.sqrt(6 / (fan_in + fan_out)) + paddle.nn.initializer.Uniform(-bound, bound)(self.lin.weight) + paddle.nn.initializer.Uniform(-bound, bound)(self.att_src) + paddle.nn.initializer.Uniform(-bound, bound)(self.att_dst) + if self.bias is not None: + paddle.nn.initializer.Constant(0)(self.bias) + + def forward(self, x: Tensor, adj: Tensor, mask: Optional[Tensor] = None, + add_loop: bool = True) -> Tensor: + x = x.unsqueeze(0) if x.ndim == 2 else x # [B, N, F] + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj # [B, N, N] + + H, C = self.heads, self.out_channels + B, N, _ = x.shape + + if add_loop: + adj = adj.clone() + idx = paddle.arange(N, dtype='int64') + adj[:, idx, idx] = 1.0 + + x = self.lin(x).reshape([B, N, H, C]) # [B, N, H, C] + + alpha_src = paddle.sum(x * self.att_src, axis=-1) # [B, N, H] + alpha_dst = paddle.sum(x * self.att_dst, axis=-1) # [B, N, H] + + alpha = alpha_src.unsqueeze(1) + alpha_dst.unsqueeze(2) # [B, N, N, H] + + # Weighted and masked softmax: + alpha = F.leaky_relu(alpha, self.negative_slope) + alpha = paddle.where(adj.unsqueeze(-1) == 0, float('-inf'), alpha) + alpha = F.softmax(alpha, axis=2) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + + out = paddle.matmul(alpha.transpose([0, 3, 1, 2]), x.transpose([0, 2, 1, 3])) + out = out.transpose([0, 2, 1, 3]) # [B, N, H, C] + + if self.concat: + out = out.reshape([B, N, H * C]) + else: + out = out.mean(axis=2) + + if self.bias is not None: + out = out + self.bias + + if mask is not None: + out = out * mask.reshape([-1, N, 1]).astype(x.dtype) + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gcn_conv.py b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gcn_conv.py new file mode 100644 index 00000000..ad573f2f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gcn_conv.py @@ -0,0 +1,81 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, Linear + +class DenseGCNConv(Layer): + r"""See :class:`paddle_geometric.nn.conv.GCNConv`.""" + def __init__( + self, + in_channels: int, + out_channels: int, + improved: bool = False, + bias: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.improved = improved + + self.lin = Linear(in_channels, out_channels, weight_attr=paddle.framework.ParamAttr(initializer=paddle.nn.initializer.XavierUniform())) + + if bias: + self.bias = self.create_parameter([out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + if self.bias is not None: + paddle.nn.initializer.Constant(0)(self.bias) + + def forward(self, x: Tensor, adj: Tensor, mask: Optional[Tensor] = None, + add_loop: bool = True) -> Tensor: + r"""Forward pass. + + Args: + x (Tensor): Node feature tensor + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`, with + batch-size :math:`B`, (maximum) number of nodes :math:`N` for + each graph, and feature dimension :math:`F`. + adj (Tensor): Adjacency tensor + :math:`\mathbf{A} \in \mathbb{R}^{B \times N \times N}`. + The adjacency tensor is broadcastable in the batch dimension, + resulting in a shared adjacency matrix for the complete batch. + mask (Tensor, optional): Mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{B \times N}` indicating + the valid nodes for each graph. (default: :obj:`None`) + add_loop (bool, optional): If set to :obj:`False`, the layer will + not automatically add self-loops to the adjacency matrices. + (default: :obj:`True`) + """ + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + B, N, _ = adj.shape + + if add_loop: + adj = adj.clone() + idx = paddle.arange(N, dtype=paddle.int64) + adj[:, idx, idx] = 1 if not self.improved else 2 + + out = self.lin(x) + deg_inv_sqrt = adj.sum(axis=-1).clip(min=1).pow(-0.5) + + adj = deg_inv_sqrt.unsqueeze(-1) * adj * deg_inv_sqrt.unsqueeze(-2) + out = paddle.matmul(adj, out) + + if self.bias is not None: + out = out + self.bias + + if mask is not None: + out = out * mask.reshape([B, N, 1]).astype(x.dtype) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels}, {self.out_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gin_conv.py b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gin_conv.py new file mode 100644 index 00000000..77248f53 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_gin_conv.py @@ -0,0 +1,70 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Layer + +class DenseGINConv(Layer): + r"""See :class:`paddle_geometric.nn.conv.GINConv`.""" + def __init__( + self, + nn: Layer, + eps: float = 0.0, + train_eps: bool = False, + ): + super().__init__() + + self.nn = nn + self.initial_eps = eps + if train_eps: + self.eps = self.create_parameter(shape=[1], default_initializer=paddle.nn.initializer.Constant(eps)) + else: + self.eps = self.create_parameter(shape=[1], default_initializer=paddle.nn.initializer.Constant(eps), is_bias=False, stop_gradient=True) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for layer in self.sublayers(): + if hasattr(layer, 'reset_parameters'): + layer.reset_parameters() + if not self.eps.stop_gradient: + self.eps.set_value(paddle.full(shape=[1], fill_value=self.initial_eps)) + + def forward(self, x: Tensor, adj: Tensor, mask: Optional[Tensor] = None, + add_loop: bool = True) -> Tensor: + r"""Forward pass. + + Args: + x (Tensor): Node feature tensor + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`, with + batch-size :math:`B`, (maximum) number of nodes :math:`N` for + each graph, and feature dimension :math:`F`. + adj (Tensor): Adjacency tensor + :math:`\mathbf{A} \in \mathbb{R}^{B \times N \times N}`. + The adjacency tensor is broadcastable in the batch dimension, + resulting in a shared adjacency matrix for the complete batch. + mask (Tensor, optional): Mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{B \times N}` indicating + the valid nodes for each graph. (default: :obj:`None`) + add_loop (bool, optional): If set to :obj:`False`, the layer will + not automatically add self-loops to the adjacency matrices. + (default: :obj:`True`) + """ + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + B, N, _ = adj.shape + + out = paddle.matmul(adj, x) + if add_loop: + out = (1 + self.eps) * x + out + + out = self.nn(out) + + if mask is not None: + out = out * mask.reshape([B, N, 1]).astype(x.dtype) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(nn={self.nn})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/dense_graph_conv.py b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_graph_conv.py new file mode 100644 index 00000000..1c33dd23 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_graph_conv.py @@ -0,0 +1,78 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Linear + + +class DenseGraphConv(paddle.nn.Layer): + r"""See :class:`paddle_geometric.nn.conv.GraphConv`.""" + def __init__( + self, + in_channels: int, + out_channels: int, + aggr: str = 'add', + bias: bool = True, + ): + assert aggr in ['add', 'mean', 'max'] + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.aggr = aggr + + self.lin_rel = Linear(in_channels, out_channels, bias_attr=bias) + self.lin_root = Linear(in_channels, out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for layer in self.sublayers(): + if hasattr(layer, 'reset_parameters'): + layer.reset_parameters() + + def forward(self, x: Tensor, adj: Tensor, mask: Optional[Tensor] = None) -> Tensor: + r"""Forward pass. + + Args: + x (Tensor): Node feature tensor + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`, with + batch-size :math:`B`, (maximum) number of nodes :math:`N` for + each graph, and feature dimension :math:`F`. + adj (Tensor): Adjacency tensor + :math:`\mathbf{A} \in \mathbb{R}^{B \times N \times N}`. + The adjacency tensor is broadcastable in the batch dimension, + resulting in a shared adjacency matrix for the complete batch. + mask (Tensor, optional): Mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{B \times N}` indicating + the valid nodes for each graph. (default: :obj:`None`) + """ + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + B, N, C = x.shape + + if self.aggr == 'add': + out = paddle.matmul(adj, x) + elif self.aggr == 'mean': + out = paddle.matmul(adj, x) + out = out / paddle.clip(adj.sum(axis=-1, keepdim=True), min=1.0) + elif self.aggr == 'max': + out = x.unsqueeze(-2).expand([B, N, N, C]) + adj = adj.unsqueeze(-1).expand([B, N, N, C]) + out = paddle.where(adj == 0, paddle.full_like(out, float('-inf')), out) + out = paddle.max(out, axis=-3) + out = paddle.where(out == float('-inf'), paddle.zeros_like(out), out) + else: + raise NotImplementedError + + out = self.lin_rel(out) + out = out + self.lin_root(x) + + if mask is not None: + out = out * mask.reshape([-1, N, 1]).astype(x.dtype) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels}, {self.out_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/dense_sage_conv.py b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_sage_conv.py new file mode 100644 index 00000000..3260e17d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/dense_sage_conv.py @@ -0,0 +1,75 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +class DenseSAGEConv(paddle.nn.Layer): + r"""See :class:`paddle_geometric.nn.conv.SAGEConv`. + + .. note:: + + :class:`~paddle_geometric.nn.dense.DenseSAGEConv` expects to work on + binary adjacency matrices. + If you want to make use of weighted dense adjacency matrices, please + use :class:`paddle_geometric.nn.dense.DenseGraphConv` instead. + """ + def __init__( + self, + in_channels: int, + out_channels: int, + normalize: bool = False, + bias: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.normalize = normalize + + self.lin_rel = Linear(in_channels, out_channels, bias_attr=False) + self.lin_root = Linear(in_channels, out_channels, bias_attr=bias) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for layer in self.sublayers(): + if hasattr(layer, 'reset_parameters'): + layer.reset_parameters() + + def forward(self, x: Tensor, adj: Tensor, mask: Optional[Tensor] = None) -> Tensor: + r"""Forward pass. + + Args: + x (Tensor): Node feature tensor + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`, with + batch-size :math:`B`, (maximum) number of nodes :math:`N` for + each graph, and feature dimension :math:`F`. + adj (Tensor): Adjacency tensor + :math:`\mathbf{A} \in \mathbb{R}^{B \times N \times N}`. + The adjacency tensor is broadcastable in the batch dimension, + resulting in a shared adjacency matrix for the complete batch. + mask (Tensor, optional): Mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{B \times N}` indicating + the valid nodes for each graph. (default: :obj:`None`) + """ + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + B, N, _ = adj.shape + + out = paddle.matmul(adj, x) + out = out / paddle.clip(adj.sum(axis=-1, keepdim=True), min=1) + out = self.lin_rel(out) + self.lin_root(x) + + if self.normalize: + out = F.normalize(out, p=2.0, axis=-1) + + if mask is not None: + out = out * mask.reshape([B, N, 1]).astype(x.dtype) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels}, {self.out_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/diff_pool.py b/jointContribution/mattergen/paddle_geometric/nn/dense/diff_pool.py new file mode 100644 index 00000000..26e6a5ef --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/diff_pool.py @@ -0,0 +1,56 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + + +def dense_diff_pool( + x: Tensor, + adj: Tensor, + s: Tensor, + mask: Optional[Tensor] = None, + normalize: bool = True, +) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + r"""The differentiable pooling operator from the `"Hierarchical Graph + Representation Learning with Differentiable Pooling" + `_ paper. + + Args: + x (Tensor): Node feature tensor of shape + :math:`[B, N, F]`, where `B` is the batch size, + `N` is the number of nodes, and `F` is the feature dimension. + adj (Tensor): Adjacency tensor of shape `[B, N, N]`. + s (Tensor): Assignment tensor of shape `[B, N, C]` + where `C` is the number of clusters. + mask (Tensor, optional): Mask tensor of shape `[B, N]` indicating + the valid nodes for each graph. + normalize (bool, optional): If `False`, the link prediction loss is + not divided by `adj.numel()`. Defaults to `True`. + + Returns: + Tuple[Tensor, Tensor, Tensor, Tensor]: Pooled node feature matrix, + coarsened adjacency matrix, link prediction loss, and entropy regularization. + """ + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + s = s.unsqueeze(0) if s.ndim == 2 else s + + batch_size, num_nodes, _ = x.shape + + s = paddle.nn.functional.softmax(s, axis=-1) + + if mask is not None: + mask = mask.reshape([batch_size, num_nodes, 1]).astype(x.dtype) + x, s = x * mask, s * mask + + out = paddle.matmul(s.transpose([0, 2, 1]), x) + out_adj = paddle.matmul(paddle.matmul(s.transpose([0, 2, 1]), adj), s) + + link_loss = adj - paddle.matmul(s, s.transpose([0, 2, 1])) + link_loss = paddle.norm(link_loss, p=2) + if normalize: + link_loss = link_loss / adj.numel() + + ent_loss = (-s * paddle.log(s + 1e-15)).sum(axis=-1).mean() + + return out, out_adj, link_loss, ent_loss diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/dmon_pool.py b/jointContribution/mattergen/paddle_geometric/nn/dense/dmon_pool.py new file mode 100644 index 00000000..8184bfaa --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/dmon_pool.py @@ -0,0 +1,86 @@ +from typing import List, Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor + +EPS = 1e-15 + + +def _rank3_trace(tensor: Tensor) -> Tensor: + return paddle.sum(paddle.diagonal(tensor, axis1=-2, axis2=-1), axis=-1) + + +class DMoNPooling(paddle.nn.Layer): + r"""The spectral modularity pooling operator from the `"Graph Clustering + with Graph Neural Networks" `_ paper. + """ + def __init__(self, channels: Union[int, List[int]], k: int, dropout: float = 0.0): + super().__init__() + + if isinstance(channels, int): + channels = [channels] + + from paddle.nn import Sequential, Linear, ReLU + layers = [Linear(channels[i], channels[i + 1]) for i in range(len(channels) - 1)] + layers.append(Linear(channels[-1], k)) + self.mlp = Sequential(*layers) + self.dropout = dropout + + self.reset_parameters() + + def reset_parameters(self): + for layer in self.mlp: + if isinstance(layer, Linear): + layer.weight.set_value(paddle.nn.initializer.XavierUniform()(layer.weight.shape)) + + def forward(self, x: Tensor, adj: Tensor, mask: Optional[Tensor] = None) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor, Tensor]: + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + + s = self.mlp(x) + s = F.dropout(s, p=self.dropout, training=self.training) + s = F.softmax(s, axis=-1) + + batch_size, num_nodes, _ = x.shape + C = s.shape[-1] + + if mask is None: + mask = paddle.ones([batch_size, num_nodes], dtype='bool') + + mask = mask.cast(x.dtype).reshape([batch_size, num_nodes, 1]) + x, s = x * mask, s * mask + + out = F.selu(paddle.matmul(s.transpose([0, 2, 1]), x)) + out_adj = paddle.matmul(paddle.matmul(s.transpose([0, 2, 1]), adj), s) + + # Spectral loss + degrees = paddle.sum(adj, axis=-1, keepdim=True) * mask + m = paddle.sum(degrees, axis=[-2, -1]) / 2 + m_expand = m.reshape([-1, 1, 1]).expand([-1, C, C]) + ca = paddle.matmul(s.transpose([0, 2, 1]), degrees) + cb = paddle.matmul(degrees.transpose([0, 2, 1]), s) + normalizer = paddle.matmul(ca, cb) / (2 * m_expand) + spectral_loss = -_rank3_trace(out_adj - normalizer) / (2 * m) + spectral_loss = paddle.mean(spectral_loss) + + # Orthogonality regularization + ss = paddle.matmul(s.transpose([0, 2, 1]), s) + i_s = paddle.eye(C, dtype=ss.dtype) + ortho_loss = paddle.norm(ss / paddle.norm(ss, p=2) - i_s / paddle.norm(i_s), p='fro', axis=[-2, -1]) + ortho_loss = paddle.mean(ortho_loss) + + # Cluster loss + cluster_size = paddle.sum(s, axis=1) + cluster_loss = paddle.norm(cluster_size, p=2, axis=1) / paddle.sum(mask, axis=1) * paddle.norm(i_s, p=2) - 1 + cluster_loss = paddle.mean(cluster_loss) + + # Fix and normalize coarsened adjacency matrix + out_adj = paddle.where(out_adj - paddle.eye(C, dtype=out_adj.dtype) * paddle.diagonal(out_adj, axis1=-2, axis2=-1), out_adj, paddle.zeros_like(out_adj)) + d = paddle.sqrt(paddle.sum(out_adj, axis=-1, keepdim=True)) + EPS + out_adj = out_adj / d / d.transpose([0, 2, 1]) + + return s, out, out_adj, spectral_loss, ortho_loss, cluster_loss + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(channels={self.mlp[0].weight.shape[1]}, num_clusters={self.mlp[-1].out_features})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/linear.py b/jointContribution/mattergen/paddle_geometric/nn/dense/linear.py new file mode 100644 index 00000000..f3356402 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/linear.py @@ -0,0 +1,362 @@ +import copy +import math +from typing import Any, Optional, Dict, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, initializer +from paddle.nn.initializer import Uniform, XavierUniform, KaimingUniform + +def is_uninitialized_parameter(x: Any) -> bool: + # Check if the parameter is uninitialized + return isinstance(x, paddle.nn.UninitializedParameter) + +def reset_weight_(weight: Tensor, in_channels: int, initializer: Optional[str] = None) -> Tensor: + # Initialize weights based on the specified method + if in_channels <= 0: + pass + elif initializer == 'glorot': + XavierUniform()(weight) + elif initializer == 'uniform': + bound = 1.0 / math.sqrt(in_channels) + Uniform(-bound, bound)(weight) + elif initializer == 'kaiming_uniform': + KaimingUniform()(weight) + elif initializer is None: + KaimingUniform()(weight) + else: + raise RuntimeError(f"Weight initializer '{initializer}' not supported") + + return weight + +def reset_bias_(bias: Optional[Tensor], in_channels: int, initializer: Optional[str] = None) -> Optional[Tensor]: + # Initialize biases based on the specified method + if bias is None or in_channels <= 0: + pass + elif initializer == 'zeros': + initializer.Zeros()(bias) + elif initializer is None: + bound = 1.0 / math.sqrt(in_channels) + Uniform(-bound, bound)(bias) + else: + raise RuntimeError(f"Bias initializer '{initializer}' not supported") + + return bias + +class Linear(Layer): + r"""Applies a linear transformation to the incoming data. + + .. math:: + \mathbf{x}^{\prime} = \mathbf{x} \mathbf{W}^{\top} + \mathbf{b} + + In contrast to :class:`torch.nn.Linear`, it supports lazy initialization + and customizable weight and bias initialization. + + Args: + in_channels (int): Size of each input sample. Will be initialized + lazily in case it is given as :obj:`-1`. + out_channels (int): Size of each output sample. + bias (bool, optional): If set to :obj:`False`, the layer will not learn + an additive bias. (default: :obj:`True`) + weight_initializer (str, optional): The initializer for the weight + matrix (:obj:`"glorot"`, :obj:`"uniform"`, :obj:`"kaiming_uniform"` + or :obj:`None`). + If set to :obj:`None`, will match default weight initialization of + :class:`torch.nn.Linear`. (default: :obj:`None`) + bias_initializer (str, optional): The initializer for the bias vector + (:obj:`"zeros"` or :obj:`None`). + If set to :obj:`None`, will match default bias initialization of + :class:`torch.nn.Linear`. (default: :obj:`None`) + + Shapes: + - **input:** features :math:`(*, F_{in})` + - **output:** features :math:`(*, F_{out})` + """ + def __init__( + self, + in_channels: int, + out_channels: int, + bias: bool = True, + weight_initializer: Optional[str] = None, + bias_initializer: Optional[str] = None, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.weight_initializer = weight_initializer + self.bias_initializer = bias_initializer + + # Initialize weight if in_channels is specified, otherwise leave it uninitialized + if in_channels > 0: + self.weight = self.create_parameter([out_channels, in_channels]) + else: + # self.weight = paddle.nn.UninitializedParameter() + raise NotImplementedError("paddle.nn.UninitializedParameter is not implemented yet.") + + # Initialize bias if specified + if bias: + self.bias = self.create_parameter([out_channels]) + else: + self.bias = None + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + reset_weight_(self.weight, self.in_channels, self.weight_initializer) + reset_bias_(self.bias, self.in_channels, self.bias_initializer) + + def forward(self, x: Tensor) -> Tensor: + r"""Forward pass. + + Args: + x (Tensor): The input features. + """ + return F.linear(x, self.weight, self.bias) + + def __deepcopy__(self, memo): + # Custom deepcopy method to handle uninitialized parameters + out = Linear( + self.in_channels, + self.out_channels, + self.bias is not None, + self.weight_initializer, + self.bias_initializer, + ).to(self.weight.place) + + if self.in_channels > 0: + out.weight.set_value(copy.deepcopy(self.weight, memo)) + + if self.bias is not None: + out.bias.set_value(copy.deepcopy(self.bias, memo)) + + return out + + def __repr__(self) -> str: + # Custom string representation for Linear layer + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, bias={self.bias is not None})') + + +class HeteroLinear(Layer): + r"""Applies separate linear transformations to the incoming data according + to types. + + For type :math:`\kappa`, it computes + + .. math:: + \mathbf{x}^{\prime}_{\kappa} = \mathbf{x}_{\kappa} + \mathbf{W}^{\top}_{\kappa} + \mathbf{b}_{\kappa}. + + It supports lazy initialization and customizable weight and bias + initialization. + + Args: + in_channels (int): Size of each input sample. Will be initialized + lazily in case it is given as :obj:`-1`. + out_channels (int): Size of each output sample. + num_types (int): The number of types. + is_sorted (bool, optional): If set to :obj:`True`, assumes that + :obj:`type_vec` is sorted. This avoids internal re-sorting of the + data and can improve runtime and memory efficiency. + (default: :obj:`False`) + """ + _timing_cache: Dict[int, Tuple[float, float]] + + def __init__( + self, + in_channels: int, + out_channels: int, + num_types: int, + is_sorted: bool = False, + **kwargs, + ): + super().__init__() + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_types = num_types + self.is_sorted = is_sorted + self.kwargs = kwargs + + if self.in_channels == -1: + self.weight = paddle.nn.UninitializedParameter() + self._hook = self.register_forward_pre_hook( + self.initialize_parameters) + else: + # Create the weight parameter using paddle.create_parameter + self.weight = paddle.create_parameter( + shape=[num_types, in_channels, out_channels], # Shape of the weight tensor + dtype=paddle.float32, # Data type of the parameter (e.g., float32, float64) + default_initializer=paddle.nn.initializer.XavierUniform() + # Default initializer, Xavier uniform distribution + ) + + if kwargs.get('bias', True): + self.bias = paddle.create_parameter( + shape=[num_types, out_channels], # Shape of the bias tensor + dtype=paddle.float32, # Data type of the parameter (e.g., float32, float64) + default_initializer=paddle.nn.initializer.Zeros() # Initialize the bias with zeros + ) + else: + self.register_parameter('bias', None) + + self._timing_cache: Dict[int, Tuple[float, float]] = {} + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + reset_weight_(self.weight, self.in_channels, + self.kwargs.get('weight_initializer', None)) + reset_bias_(self.bias, self.in_channels, + self.kwargs.get('bias_initializer', None)) + + def forward_naive(self, x: Tensor, type_ptr: Tensor) -> Tensor: + out = paddle.zeros([x.shape[0], self.out_channels]) + for i, (start, end) in enumerate(zip(type_ptr[:-1], type_ptr[1:])): + out[start:end] = paddle.matmul(x[start:end], self.weight[i]) + return out + + def forward(self, x: Tensor, type_vec: Tensor) -> Tensor: + r"""The forward pass. + + Args: + x (Tensor): The input features. + type_vec (Tensor): A vector that maps each entry to a type. + """ + perm: Optional[Tensor] = None + if not self.is_sorted and (paddle.any(type_vec[1:] < type_vec[:-1])): + type_vec, perm = paddle.sort(type_vec) + x = x[perm] + + type_ptr = paddle.concat([paddle.zeros([1]), paddle.cumsum(paddle.ones_like(type_vec))]) + + out = self.forward_naive(x, type_ptr) + + if self.bias is not None: + out += self.bias[type_vec] + + if perm is not None: # Restore original order (if necessary). + out_unsorted = paddle.zeros_like(out) + out_unsorted[perm] = out + out = out_unsorted + + return out + + def initialize_parameters(self, module, input): + if is_uninitialized_parameter(self.weight): + self.in_channels = input[0].shape[-1] + self.weight.materialize([self.num_types, self.in_channels, self.out_channels]) + self.reset_parameters() + self._hook.remove() + delattr(self, '_hook') + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_types={self.num_types}, ' + f'bias={self.kwargs.get("bias", True)})') + + +class HeteroDictLinear(Layer): + r"""Applies separate linear transformations to the incoming data + dictionary. + + For key :math:`\kappa`, it computes + + .. math:: + \mathbf{x}^{\prime}_{\kappa} = \mathbf{x}_{\kappa} + \mathbf{W}^{\top}_{\kappa} + \mathbf{b}_{\kappa}. + + It supports lazy initialization and customizable weight and bias + initialization. + + Args: + in_channels (int or Dict[Any, int]): Size of each input sample. If + passed an integer, :obj:`types` will be a mandatory argument. + initialized lazily in case it is given as :obj:`-1`. + out_channels (int): Size of each output sample. + types (List[Any], optional): The keys of the input dictionary. + (default: :obj:`None`) + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.Linear`. + """ + def __init__( + self, + in_channels: Union[int, Dict[Any, int]], + out_channels: int, + types: Optional[Any] = None, + **kwargs, + ): + super().__init__() + + if isinstance(in_channels, dict): + self.types = list(in_channels.keys()) + + if any([i == -1 for i in in_channels.values()]): + self._hook = self.register_forward_pre_hook( + self.initialize_parameters) + + if types is not None and set(self.types) != set(types): + raise ValueError("The provided 'types' do not match with the " + "keys in the 'in_channels' dictionary") + + else: + if types is None: + raise ValueError("Please provide a list of 'types' if passing " + "'in_channels' as an integer") + + if in_channels == -1: + self._hook = self.register_forward_pre_hook( + self.initialize_parameters) + + self.types = types + in_channels = {node_type: in_channels for node_type in types} + + self.in_channels = in_channels + self.out_channels = out_channels + self.kwargs = kwargs + + self.lins = paddle.nn.LayerDict({ + key: + Linear(channels, self.out_channels, **kwargs) + for key, channels in self.in_channels.items() + }) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for lin in self.lins.values(): + lin.reset_parameters() + + def forward( + self, + x_dict: Dict[str, Tensor], + ) -> Dict[str, Tensor]: + r"""Forward pass. + + Args: + x_dict (Dict[Any, Tensor]): A dictionary holding input + features for each individual type. + """ + out_dict = {} + for key, lin in self.lins.items(): + if key in x_dict: + out_dict[key] = lin(x_dict[key]) + return out_dict + + def initialize_parameters(self, module, input): + for key, x in input[0].items(): + lin = self.lins[key] + if is_uninitialized_parameter(lin.weight): + self.lins[key].initialize_parameters(None, x) + self.lins[key].reset_parameters() + self._hook.remove() + self.in_channels = {key: x.shape[-1] for key, x in input[0].items()} + delattr(self, '_hook') + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, bias={self.kwargs.get("bias", True)})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/dense/mincut_pool.py b/jointContribution/mattergen/paddle_geometric/nn/dense/mincut_pool.py new file mode 100644 index 00000000..327cf6f9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/dense/mincut_pool.py @@ -0,0 +1,114 @@ +from typing import Optional, Tuple +import paddle +from paddle import Tensor + +def dense_mincut_pool( + x: Tensor, + adj: Tensor, + s: Tensor, + mask: Optional[Tensor] = None, + temp: float = 1.0, +) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + r"""The MinCut pooling operator from the `"Spectral Clustering in Graph + Neural Networks for Graph Pooling" `_ + paper. + + .. math:: + \mathbf{X}^{\prime} &= {\mathrm{softmax}(\mathbf{S})}^{\top} \cdot + \mathbf{X} + + \mathbf{A}^{\prime} &= {\mathrm{softmax}(\mathbf{S})}^{\top} \cdot + \mathbf{A} \cdot \mathrm{softmax}(\mathbf{S}) + + based on dense learned assignments :math:`\mathbf{S} \in \mathbb{R}^{B + \times N \times C}`. + Returns the pooled node feature matrix, the coarsened and symmetrically + normalized adjacency matrix and two auxiliary objectives: (1) The MinCut + loss + + .. math:: + \mathcal{L}_c = - \frac{\mathrm{Tr}(\mathbf{S}^{\top} \mathbf{A} + \mathbf{S})} {\mathrm{Tr}(\mathbf{S}^{\top} \mathbf{D} + \mathbf{S})} + + where :math:`\mathbf{D}` is the degree matrix, and (2) the orthogonality + loss + + .. math:: + \mathcal{L}_o = {\left\| \frac{\mathbf{S}^{\top} \mathbf{S}} + {{\|\mathbf{S}^{\top} \mathbf{S}\|}_F} -\frac{\mathbf{I}_C}{\sqrt{C}} + \right\|}_F. + + Args: + x (Tensor): Node feature tensor + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`, with + batch-size :math:`B`, (maximum) number of nodes :math:`N` for + each graph, and feature dimension :math:`F`. + adj (Tensor): Adjacency tensor + :math:`\mathbf{A} \in \mathbb{R}^{B \times N \times N}`. + s (Tensor): Assignment tensor + :math:`\mathbf{S} \in \mathbb{R}^{B \times N \times C}` + with number of clusters :math:`C`. + The softmax does not have to be applied beforehand, since it is + executed within this method. + mask (Tensor, optional): Mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{B \times N}` indicating + the valid nodes for each graph. (default: :obj:`None`) + temp (float, optional): Temperature parameter for softmax function. + (default: :obj:`1.0`) + + :rtype: (:class:`Tensor`, :class:`Tensor`, + :class:`Tensor`, :class:`Tensor`) + """ + x = x.unsqueeze(0) if x.ndim == 2 else x + adj = adj.unsqueeze(0) if adj.ndim == 2 else adj + s = s.unsqueeze(0) if s.ndim == 2 else s + + (batch_size, num_nodes, _), k = x.shape, s.shape[-1] + + s = paddle.nn.functional.softmax(s / temp if temp != 1.0 else s, axis=-1) + + if mask is not None: + mask = mask.reshape([batch_size, num_nodes, 1]).astype(x.dtype) + x, s = x * mask, s * mask + + out = paddle.matmul(s.transpose([0, 2, 1]), x) + out_adj = paddle.matmul(paddle.matmul(s.transpose([0, 2, 1]), adj), s) + + # MinCut regularization + mincut_num = _rank3_trace(out_adj) + d_flat = paddle.sum(adj, axis=-1) + d = _rank3_diag(d_flat) + mincut_den = _rank3_trace(paddle.matmul(paddle.matmul(s.transpose([0, 2, 1]), d), s)) + mincut_loss = -(mincut_num / mincut_den) + mincut_loss = paddle.mean(mincut_loss) + + # Orthogonality regularization + ss = paddle.matmul(s.transpose([0, 2, 1]), s) + i_s = paddle.eye(k, dtype=ss.dtype) + ortho_loss = paddle.norm( + ss / paddle.norm(ss, axis=[-1, -2], keepdim=True) - + i_s / paddle.norm(i_s), axis=[-1, -2] + ) + ortho_loss = paddle.mean(ortho_loss) + + EPS = 1e-15 + + # Fix and normalize coarsened adjacency matrix + ind = paddle.arange(k) + out_adj[:, ind, ind] = 0 + d = paddle.sum(out_adj, axis=-1) + d = paddle.sqrt(d)[:, None] + EPS + out_adj = (out_adj / d) / d.transpose([0, 2, 1]) + + return out, out_adj, mincut_loss, ortho_loss + + +def _rank3_trace(x: Tensor) -> Tensor: + return paddle.einsum('ijj->i', x) + + +def _rank3_diag(x: Tensor) -> Tensor: + eye = paddle.eye(x.shape[1], dtype=x.dtype) + out = eye * x.unsqueeze(2).expand([x.shape[0], x.shape[1], x.shape[1]]) + return out diff --git a/jointContribution/mattergen/paddle_geometric/nn/encoding.py b/jointContribution/mattergen/paddle_geometric/nn/encoding.py new file mode 100644 index 00000000..e95cb511 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/encoding.py @@ -0,0 +1,96 @@ +import math +import paddle +from paddle import Tensor +import paddle.nn as nn + + +class PositionalEncoding(nn.Layer): + r"""The positional encoding scheme from the `"Attention Is All You Need" + `_ paper. + + .. math:: + + PE(x)_{2 \cdot i} &= \sin(x / 10000^{2 \cdot i / d}) + + PE(x)_{2 \cdot i + 1} &= \cos(x / 10000^{2 \cdot i / d}) + + where :math:`x` is the position and :math:`i` is the dimension. + + Args: + out_channels (int): Size :math:`d` of each output sample. + base_freq (float, optional): The base frequency of sinusoidal + functions. (default: :obj:`1e-4`) + granularity (float, optional): The granularity of the positions. If + set to smaller value, the encoder will capture more fine-grained + changes in positions. (default: :obj:`1.0`) + """ + def __init__( + self, + out_channels: int, + base_freq: float = 1e-4, + granularity: float = 1.0, + ): + super(PositionalEncoding, self).__init__() + + if out_channels % 2 != 0: + raise ValueError(f"Cannot use sinusoidal positional encoding with " + f"odd 'out_channels' (got {out_channels}).") + + self.out_channels = out_channels + self.base_freq = base_freq + self.granularity = granularity + + frequency = paddle.logspace(0, 1, out_channels // 2, base_freq) + self.register_buffer('frequency', frequency) + + self.reset_parameters() + + def reset_parameters(self): + pass + + def forward(self, x: Tensor) -> Tensor: + x = x / self.granularity if self.granularity != 1.0 else x + out = x.unsqueeze(-1) * self.frequency.unsqueeze(0) + return paddle.concat([paddle.sin(out), paddle.cos(out)], axis=-1) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.out_channels})' + + +class TemporalEncoding(nn.Layer): + r"""The time-encoding function from the `"Do We Really Need Complicated + Model Architectures for Temporal Networks?" + `_ paper. + + It first maps each entry to a vector with exponentially decreasing values, + and then uses the cosine function to project all values to range + :math:`[-1, 1]`. + + .. math:: + + y_{i} = \cos \left(x \cdot \sqrt{d}^{-(i - 1)/\sqrt{d}} \right) + + where :math:`d` defines the output feature dimension, and + :math:`1 \leq i \leq d`. + + Args: + out_channels (int): Size :math:`d` of each output sample. + """ + def __init__(self, out_channels: int): + super(TemporalEncoding, self).__init__() + self.out_channels = out_channels + + sqrt = math.sqrt(out_channels) + weight = 1.0 / sqrt**paddle.linspace(0, sqrt, out_channels).unsqueeze(0) + self.register_buffer('weight', weight) + + self.reset_parameters() + + def reset_parameters(self): + pass + + def forward(self, x: Tensor) -> Tensor: + return paddle.cos(paddle.matmul(x.unsqueeze(-1), self.weight)) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.out_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/functional/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/functional/__init__.py new file mode 100644 index 00000000..2f144524 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/functional/__init__.py @@ -0,0 +1,9 @@ +r"""Functional operator package.""" + +from .bro import bro +from .gini import gini + +__all__ = classes = [ + 'bro', + 'gini', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/functional/bro.py b/jointContribution/mattergen/paddle_geometric/nn/functional/bro.py new file mode 100644 index 00000000..623c23b1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/functional/bro.py @@ -0,0 +1,47 @@ +from typing import Union +import paddle + + +def bro( + x: paddle.Tensor, + batch: paddle.Tensor, + p: Union[int, str] = 2, +) -> paddle.Tensor: + r"""The Batch Representation Orthogonality penalty from the `"Improving + Molecular Graph Neural Network Explainability with Orthonormalization + and Induced Sparsity" `_ paper. + + Computes a regularization for each graph representation in a mini-batch + according to + + .. math:: + \mathcal{L}_{\textrm{BRO}}^\mathrm{graph} = + || \mathbf{HH}^T - \mathbf{I}||_p + + and returns an average over all graphs in the batch. + + Args: + x (paddle.Tensor): The node feature matrix. + batch (paddle.Tensor): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. + p (int or str, optional): The norm order to use. (default: :obj:`2`) + """ + _, counts = paddle.unique(batch, return_counts=True) + + # Prepare diagonal matrices for each graph in the batch + sequences = paddle.ones_like(batch).split(counts.tolist()) + diags = paddle.stack([ + paddle.diag(x) for x in paddle.nn.utils.pad_sequence( + sequences, batch_first=True, padding_value=0.0 + ) + ]) + + # Split and pad the input tensor `x` for batch processing + x_split = x.split(counts.tolist()) + x_padded = paddle.nn.utils.pad_sequence(x_split, batch_first=True, padding_value=0.0) + + # Calculate the BRO loss + return paddle.sum( + paddle.norm(x_padded @ x_padded.transpose([0, 2, 1]) - diags, p=p, axis=(1, 2)) + ) / counts.shape[0] diff --git a/jointContribution/mattergen/paddle_geometric/nn/functional/gini.py b/jointContribution/mattergen/paddle_geometric/nn/functional/gini.py new file mode 100644 index 00000000..8d8aa440 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/functional/gini.py @@ -0,0 +1,28 @@ +import paddle + +def gini(w: paddle.Tensor) -> paddle.Tensor: + r"""The Gini coefficient from the `"Improving Molecular Graph Neural + Network Explainability with Orthonormalization and Induced Sparsity" + `_ paper. + + Computes a regularization penalty :math:`\in [0, 1]` for each row of a + matrix according to + + .. math:: + \mathcal{L}_\textrm{Gini}^i = \sum_j^n \sum_{j'}^n \frac{|w_{ij} + - w_{ij'}|}{2 (n^2 - n)\bar{w_i}} + + and returns an average over all rows. + + Args: + w (paddle.Tensor): A two-dimensional tensor. + """ + s = 0 + for row in w: + t = row.expand([row.shape[0], row.shape[0]]) + u = (paddle.abs(t - t.transpose([1, 0])).sum() / + (2 * (row.shape[0]**2 - row.shape[0]) * + paddle.mean(paddle.abs(row)) + paddle.finfo(row.dtype).eps)) + s += u + s /= w.shape[0] + return s diff --git a/jointContribution/mattergen/paddle_geometric/nn/fx.py b/jointContribution/mattergen/paddle_geometric/nn/fx.py new file mode 100644 index 00000000..72abd6ff --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/fx.py @@ -0,0 +1,321 @@ +import copy +import warnings +from typing import Any, Dict, Optional + +import paddle +from paddle.nn import Layer, LayerList, LayerDict, Sequential + +try: + from paddle.fx import Graph, GraphLayer, Node +except (ImportError, ModuleNotFoundError, AttributeError): + GraphLayer, Graph, Node = 'GraphLayer', 'Graph', 'Node' + + +class Transformer: + r""" + A `Transformer` executes an FX graph node-by-node, applies transformations + to each node, and produces a new `paddle.nn.Layer`. It exposes a `transform` + method that returns the transformed `paddle.fx.GraphLayer`. + + Methods in the `Transformer` class can be overridden to customize the + behavior of transformation. + + .. code-block:: none + + transform() + +-- Iterate over each node in the graph + +-- placeholder() + +-- get_attr() + +-- call_function() + +-- call_method() + +-- call_module() + +-- call_message_passing_module() + +-- call_global_pooling_module() + +-- output() + +-- Erase unused nodes in the graph + +-- Iterate over each children module + +-- init_submodule() + + Args: + module (paddle.nn.Layer): The module to be transformed. + input_map (Dict[str, str], optional): A dictionary holding information + about the type of input arguments of `module.forward`. + For example, if `arg` is a node-level argument, then + `input_map['arg'] = 'node'`, and `input_map['arg'] = 'edge'` otherwise. + If `input_map` is not specified, it will try to automatically + determine the correct type of input arguments. + (default: `None`) + debug (bool, optional): If set to `True`, will perform transformation + in debug mode. (default: `False`) + """ + def __init__( + self, + module: Layer, + input_map: Optional[Dict[str, str]] = None, + debug: bool = False, + ): + self.module = module + self.gm = symbolic_trace(module) + self.input_map = input_map + self.debug = debug + + # Methods to override ##################################################### + + def placeholder(self, node: Node, target: Any, name: str): + pass + + def get_attr(self, node: Node, target: Any, name: str): + pass + + def call_message_passing_module(self, node: Node, target: Any, name: str): + pass + + def call_global_pooling_module(self, node: Node, target: Any, name: str): + pass + + def call_module(self, node: Node, target: Any, name: str): + pass + + def call_method(self, node: Node, target: Any, name: str): + pass + + def call_function(self, node: Node, target: Any, name: str): + pass + + def output(self, node: Node, target: Any, name: str): + pass + + def init_submodule(self, module: Layer, target: str) -> Layer: + return module + + # Internal functionality ################################################## + + @property + def graph(self) -> Graph: + return self.gm.graph + + def transform(self) -> GraphLayer: + """ + Transforms `self.module` and returns a transformed `paddle.fx.GraphLayer`. + """ + if self.debug: + self.graph.print_tabular() + print() + code = self.graph.python_code('self') + print(code.src if hasattr(code, 'src') else code) + + # We create a private dictionary `self._state` which holds information + # about whether a node returns node-level or edge-level information: + # `self._state[node.name] in { 'node', 'edge' }` + self._state = copy.copy(self.input_map or {}) + + # We iterate over each node and determine its output level + # (node-level, edge-level) by filling `self._state`: + for node in list(self.graph.nodes): + if node.op == 'call_function' and 'training' in node.kwargs: + warnings.warn(f"Found function '{node.name}' with keyword " + f"argument 'training'. During FX tracing, this " + f"will likely be baked in as a constant value. " + f"Consider replacing this function by a module " + f"to properly encapsulate its training flag.") + + if node.op == 'placeholder': + if node.name not in self._state: + if 'edge' in node.name or 'adj' in node.name: + self._state[node.name] = 'edge' + else: + self._state[node.name] = 'node' + elif is_message_passing_op(self.module, node.op, node.target): + self._state[node.name] = 'node' + elif is_global_pooling_op(self.module, node.op, node.target): + self._state[node.name] = 'graph' + elif node.op in ['call_module', 'call_method', 'call_function']: + if self.has_edge_level_arg(node): + self._state[node.name] = 'edge' + elif self.has_node_level_arg(node): + self._state[node.name] = 'node' + else: + self._state[node.name] = 'graph' + + # We iterate over each node and may transform it: + for node in list(self.graph.nodes): + # Call the corresponding `Transformer` method for each `node.op`, + # e.g.: `call_module(...)`, `call_function(...)`, ... + op = node.op + if is_message_passing_op(self.module, op, node.target): + op = 'call_message_passing_module' + elif is_global_pooling_op(self.module, op, node.target): + op = 'call_global_pooling_module' + getattr(self, op)(node, node.target, node.name) + + # Remove all unused nodes in the computation graph, i.e., all nodes + # which have been replaced by node type-wise or edge type-wise variants + # but which are still present in the computation graph. + # We do this by iterating over the computation graph in reversed order, + # and try to remove every node. This does only succeed in case there + # are no users of that node left in the computation graph. + for node in reversed(list(self.graph.nodes)): + try: + if node.op not in ['placeholder', 'output']: + self.graph.erase_node(node) + except RuntimeError: + pass + + for target, submodule in dict(self.module._sub_layers).items(): + self.gm._sub_layers[target] = self._init_submodule(submodule, target) + + del self._state + + if self.debug: + self.gm.graph.print_tabular() + print() + code = self.graph.python_code('self') + print(code.src if hasattr(code, 'src') else code) + + self.gm.graph.lint() + self.gm.recompile() + + return self.gm + def _init_submodule(self, module: Layer, target: str) -> Layer: + if isinstance(module, LayerList) or isinstance(module, Sequential): + return LayerList([ + self._init_submodule(submodule, f'{target}.{i}') + for i, submodule in enumerate(module) + ]) + elif isinstance(module, LayerDict): + return LayerDict({ + key: + self._init_submodule(submodule, f'{target}.{key}') + for key, submodule in module.items() + }) + else: + return self.init_submodule(module, target) + + def _is_level(self, node: Node, name: str) -> bool: + return self._state[node.name] == name + + def _has_level_arg(self, node: Node, name: str) -> bool: + def _recurse(value: Any) -> bool: + if isinstance(value, Node): + return getattr(self, f'is_{name}_level')(value) + elif isinstance(value, dict): + return any([_recurse(v) for v in value.values()]) + elif isinstance(value, (list, tuple)): + return any([_recurse(v) for v in value]) + else: + return False + + return (any([_recurse(value) for value in node.args]) + or any([_recurse(value) for value in node.kwargs.values()])) + + def is_node_level(self, node: Node) -> bool: + return self._is_level(node, name='node') + + def is_edge_level(self, node: Node) -> bool: + return self._is_level(node, name='edge') + + def is_graph_level(self, node: Node) -> bool: + return self._is_level(node, name='graph') + + def has_node_level_arg(self, node: Node) -> bool: + return self._has_level_arg(node, name='node') + + def has_edge_level_arg(self, node: Node) -> bool: + return self._has_level_arg(node, name='edge') + + def has_graph_level_arg(self, node: Node) -> bool: + return self._has_level_arg(node, name='graph') + + def find_by_name(self, name: str) -> Optional[Node]: + for node in self.graph.nodes: + if node.name == name: + return node + return None + + def find_by_target(self, target: Any) -> Optional[Node]: + for node in self.graph.nodes: + if node.target == target: + return node + return None + + def replace_all_uses_with(self, to_replace: Node, replace_with: Node): + def maybe_replace_node(n: Node) -> Node: + return replace_with if n == to_replace else n + + node = replace_with.next + while node.op != 'root': + node.args = paddle.fx.map_arg(node.args, maybe_replace_node) + node.kwargs = paddle.fx.map_arg(node.kwargs, maybe_replace_node) + node = node.next +def symbolic_trace(module: Layer, concrete_args: Optional[Dict[str, Any]] = None) -> GraphLayer: + from paddle_geometric.nn import Aggregation + + class Tracer(paddle.fx.Tracer): + def is_leaf_layer(self, module: Layer, *args, **kwargs) -> bool: + return not isinstance(module, paddle.nn.Sequential) + + @staticmethod + def trace(root: Any, concrete_args: Optional[Dict[str, Any]] = None) -> Graph: + tracer = Tracer() + tracer.root = root + tracer.graph = Graph() + tracer.tensor_attrs: Dict[Any, str] = {} + + def collect_tensor_attrs(m: Layer, prefix_atoms: list): + for k, v in m.__dict__.items(): + if isinstance(v, paddle.Tensor): + tracer.tensor_attrs[v] = '.'.join(prefix_atoms + [k]) + for k, v in m.named_children(): + collect_tensor_attrs(v, prefix_atoms + [k]) + + collect_tensor_attrs(root, []) + + fn, args = tracer.create_args_for_root( + root.forward, isinstance(root, Layer), concrete_args + ) + + parameter_proxy_cache: Dict[str, Any] = {} + + def layer_getattr_wrapper(mod, attr): + attr_val = getattr(mod, attr) + return tracer.getattr(attr, attr_val, parameter_proxy_cache) + + def layer_call_wrapper(mod, *args, **kwargs): + def forward(*args, **kwargs): + return mod.forward(*args, **kwargs) + + return tracer.call_layer(mod, forward, args, kwargs) + + with paddle.utils.PatchContext() as patcher: + patcher.patch_method(Layer, "__getattr__", layer_getattr_wrapper) + patcher.patch_method(Layer, "__call__", layer_call_wrapper) + patcher.patch_method(Aggregation, "__call__", layer_call_wrapper) + + tracer.create_node( + 'output', 'output', (tracer.create_arg(fn(*args)),), {} + ) + + return tracer.graph + + return GraphLayer(module, Tracer().trace(module, concrete_args)) + + +def get_submodule(module: Layer, target: str) -> Layer: + out = module + for attr in target.split('.'): + out = getattr(out, attr) + return out + + +def is_message_passing_op(module: Layer, op: str, target: str) -> bool: + from paddle_geometric.nn import MessagePassing + if op == 'call_layer': + return isinstance(get_submodule(module, target), MessagePassing) + return False + + +def is_global_pooling_op(module: Layer, op: str, target: str) -> bool: + from paddle_geometric.nn import Aggregation + if op == 'call_layer': + return isinstance(get_submodule(module, target), Aggregation) + return False \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/glob.py b/jointContribution/mattergen/paddle_geometric/nn/glob.py new file mode 100644 index 00000000..146f1cbc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/glob.py @@ -0,0 +1,41 @@ +from paddle_geometric.deprecation import deprecated +from paddle_geometric.nn import ( + global_add_pool, + global_max_pool, + global_mean_pool, +) +from paddle_geometric.nn.aggr import AttentionalAggregation, SortAggregation + + +@deprecated( + details="use 'nn.aggr.AttentionalAggregation' instead", + func_name='nn.glob.GlobalAttention', +) +class GlobalAttention(AttentionalAggregation): + def __call__(self, x, batch=None, size=None): + return super().__call__(x, batch, dim_size=size) + + +@deprecated( + details="use 'nn.aggr.SortAggr' instead", + func_name='nn.glob.global_sort_pool', +) +def global_sort_pool(x, index, k): + module = SortAggregation(k=k) + return module(x, index=index) + + +deprecated( + details="use 'nn.pool.global_add_pool' instead", + func_name='nn.glob.global_add_pool', +)(global_add_pool) + +deprecated( + details="use 'nn.pool.global_max_pool' instead", + func_name='nn.glob.global_max_pool', +)(global_max_pool) + +deprecated( + details="use 'nn.pool.global_mean_pool' instead", + func_name='nn.glob.global_mean_pool', +)(global_mean_pool) diff --git a/jointContribution/mattergen/paddle_geometric/nn/inits.py b/jointContribution/mattergen/paddle_geometric/nn/inits.py new file mode 100644 index 00000000..3926656f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/inits.py @@ -0,0 +1,82 @@ +import math +from typing import Any + +import paddle +from paddle import Tensor + + +def uniform(size: int, value: Any): + if isinstance(value, Tensor): + bound = 1.0 / math.sqrt(size) + paddle.nn.initializer.Uniform(-bound, bound)(value) + else: + for v in value.parameters() if hasattr(value, 'parameters') else []: + uniform(size, v) + for v in value.buffers() if hasattr(value, 'buffers') else []: + uniform(size, v) + + +def kaiming_uniform(value: Any, fan: int, a: float): + if isinstance(value, Tensor): + bound = math.sqrt(6 / ((1 + a**2) * fan)) + paddle.nn.initializer.Uniform(-bound, bound)(value) + else: + for v in value.parameters() if hasattr(value, 'parameters') else []: + kaiming_uniform(v, fan, a) + for v in value.buffers() if hasattr(value, 'buffers') else []: + kaiming_uniform(v, fan, a) + + +def glorot(value: Any): + if isinstance(value, Tensor): + stdv = math.sqrt(6.0 / (value.shape[-2] + value.shape[-1])) + paddle.nn.initializer.Uniform(-stdv, stdv)(value) + else: + for v in value.parameters() if hasattr(value, 'parameters') else []: + glorot(v) + for v in value.buffers() if hasattr(value, 'buffers') else []: + glorot(v) + + +def glorot_orthogonal(tensor, scale): + if tensor is not None: + init_orthogonal = paddle.nn.initializer.Orthogonal() + init_orthogonal(tensor) + scale /= ((tensor.shape[-2] + tensor.shape[-1]) * tensor.var()) + tensor *= paddle.sqrt(scale) + + +def constant(value: Any, fill_value: float): + if isinstance(value, Tensor): + paddle.nn.initializer.Constant(fill_value)(value) + else: + for v in value.parameters() if hasattr(value, 'parameters') else []: + constant(v, fill_value) + for v in value.buffers() if hasattr(value, 'buffers') else []: + constant(v, fill_value) + + +def zeros(value: Any): + constant(value, 0.) + + +def ones(tensor: Any): + constant(tensor, 1.) + + +def normal(value: Any, mean: float, std: float): + if isinstance(value, Tensor): + paddle.nn.initializer.Normal(mean, std)(value) + else: + for v in value.parameters() if hasattr(value, 'parameters') else []: + normal(v, mean, std) + for v in value.buffers() if hasattr(value, 'buffers') else []: + normal(v, mean, std) + + +def reset(value: Any): + if hasattr(value, 'reset_parameters'): + value.reset_parameters() + else: + for child in value.children() if hasattr(value, 'children') else []: + reset(child) diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/kge/__init__.py new file mode 100644 index 00000000..1f7fe6bc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/__init__.py @@ -0,0 +1,15 @@ +r"""Knowledge Graph Embedding (KGE) package.""" + +from .base import KGEModel +from .transe import TransE +from .complex import ComplEx +from .distmult import DistMult +from .rotate import RotatE + +__all__ = classes = [ + 'KGEModel', + 'TransE', + 'ComplEx', + 'DistMult', + 'RotatE', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/base.py b/jointContribution/mattergen/paddle_geometric/nn/kge/base.py new file mode 100644 index 00000000..74025c1f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/base.py @@ -0,0 +1,168 @@ +from typing import Tuple +import paddle +from paddle import Tensor +from paddle.nn import Embedding +from tqdm import tqdm + +# Assume KGTripletLoader is defined similarly for Paddle +from paddle_geometric.nn.kge.loader import KGTripletLoader + + +class KGEModel(paddle.nn.Layer): + r"""An abstract base class for implementing custom KGE models. + + Args: + num_nodes (int): The number of nodes/entities in the graph. + num_relations (int): The number of relations in the graph. + hidden_channels (int): The hidden embedding size. + sparse (bool, optional): If set to :obj:`True`, gradients w.r.t. to the + embedding matrices will be sparse. (default: :obj:`False`) + """ + def __init__( + self, + num_nodes: int, + num_relations: int, + hidden_channels: int, + sparse: bool = False, + ): + super().__init__() + + self.num_nodes = num_nodes + self.num_relations = num_relations + self.hidden_channels = hidden_channels + + self.node_emb = Embedding(num_nodes, hidden_channels, sparse=sparse) + self.rel_emb = Embedding(num_relations, hidden_channels, sparse=sparse) + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.node_emb.weight.set_value(paddle.randn(self.node_emb.weight.shape)) + self.rel_emb.weight.set_value(paddle.randn(self.rel_emb.weight.shape)) + + def forward( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + r"""Returns the score for the given triplet. + + Args: + head_index (paddle.Tensor): The head indices. + rel_type (paddle.Tensor): The relation type. + tail_index (paddle.Tensor): The tail indices. + """ + raise NotImplementedError + + def loss( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + r"""Returns the loss value for the given triplet. + + Args: + head_index (paddle.Tensor): The head indices. + rel_type (paddle.Tensor): The relation type. + tail_index (paddle.Tensor): The tail indices. + """ + raise NotImplementedError + + def loader( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + **kwargs, + ) -> Tensor: + r"""Returns a mini-batch loader that samples a subset of triplets. + + Args: + head_index (paddle.Tensor): The head indices. + rel_type (paddle.Tensor): The relation type. + tail_index (paddle.Tensor): The tail indices. + **kwargs (optional): Additional arguments of + :class:`paddle.io.DataLoader`, such as + :obj:`batch_size`, :obj:`shuffle`, :obj:`drop_last` + or :obj:`num_workers`. + """ + return KGTripletLoader(head_index, rel_type, tail_index, **kwargs) + + @paddle.no_grad() + def test( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + batch_size: int, + k: int = 10, + log: bool = True, + ) -> Tuple[float, float, float]: + r"""Evaluates the model quality by computing Mean Rank, MRR and + Hits@:math:`k` across all possible tail entities. + + Args: + head_index (paddle.Tensor): The head indices. + rel_type (paddle.Tensor): The relation type. + tail_index (paddle.Tensor): The tail indices. + batch_size (int): The batch size to use for evaluating. + k (int, optional): The :math:`k` in Hits @ :math:`k`. + (default: :obj:`10`) + log (bool, optional): If set to :obj:`False`, will not print a + progress bar to the console. (default: :obj:`True`) + """ + arange = range(head_index.shape[0]) + arange = tqdm(arange) if log else arange + + mean_ranks, reciprocal_ranks, hits_at_k = [], [], [] + for i in arange: + h, r, t = head_index[i], rel_type[i], tail_index[i] + + scores = [] + tail_indices = paddle.arange(self.num_nodes, dtype=t.dtype) + for ts in paddle.split(tail_indices, batch_size): + scores.append(self(h.expand_as(ts), r.expand_as(ts), ts)) + rank = int((paddle.concat(scores).argsort( + descending=True) == t).nonzero().flatten()) + mean_ranks.append(rank) + reciprocal_ranks.append(1 / (rank + 1)) + hits_at_k.append(rank < k) + + mean_rank = float(paddle.to_tensor(mean_ranks, dtype=paddle.float32).mean()) + mrr = float(paddle.to_tensor(reciprocal_ranks, dtype=paddle.float32).mean()) + hits_at_k = int(paddle.to_tensor(hits_at_k).sum()) / len(hits_at_k) + + return mean_rank, mrr, hits_at_k + + @paddle.no_grad() + def random_sample( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor]: + r"""Randomly samples negative triplets by either replacing the head or + the tail (but not both). + + Args: + head_index (paddle.Tensor): The head indices. + rel_type (paddle.Tensor): The relation type. + tail_index (paddle.Tensor): The tail indices. + """ + # Random sample either `head_index` or `tail_index` (but not both): + num_negatives = head_index.shape[0] // 2 + rnd_index = paddle.randint(self.num_nodes, head_index.shape, + dtype=head_index.dtype) + + head_index = head_index.clone() + head_index[:num_negatives] = rnd_index[:num_negatives] + tail_index = tail_index.clone() + tail_index[num_negatives:] = rnd_index[num_negatives:] + + return head_index, rel_type, tail_index + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.num_nodes}, ' + f'num_relations={self.num_relations}, ' + f'hidden_channels={self.hidden_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/complex.py b/jointContribution/mattergen/paddle_geometric/nn/kge/complex.py new file mode 100644 index 00000000..f59e3fe2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/complex.py @@ -0,0 +1,84 @@ +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Embedding + +from paddle_geometric.nn.kge import KGEModel + + +class ComplEx(KGEModel): + r"""The ComplEx model from the `"Complex Embeddings for Simple Link + Prediction" `_ paper. + + :class:`ComplEx` models relations as complex-valued bilinear mappings + between head and tail entities using the Hermetian dot product. + The entities and relations are embedded in different dimensional spaces, + resulting in the scoring function: + + .. math:: + d(h, r, t) = Re(< \mathbf{e}_h, \mathbf{e}_r, \mathbf{e}_t>) + + Args: + num_nodes (int): The number of nodes/entities in the graph. + num_relations (int): The number of relations in the graph. + hidden_channels (int): The hidden embedding size. + sparse (bool, optional): If set to :obj:`True`, gradients w.r.t. to + the embedding matrices will be sparse. (default: :obj:`False`) + """ + def __init__( + self, + num_nodes: int, + num_relations: int, + hidden_channels: int, + sparse: bool = False, + ): + super().__init__(num_nodes, num_relations, hidden_channels, sparse) + + self.node_emb_im = Embedding(num_nodes, hidden_channels, sparse=sparse) + self.rel_emb_im = Embedding(num_relations, hidden_channels, sparse=sparse) + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.node_emb.weight) + paddle.nn.initializer.XavierUniform()(self.node_emb_im.weight) + paddle.nn.initializer.XavierUniform()(self.rel_emb.weight) + paddle.nn.initializer.XavierUniform()(self.rel_emb_im.weight) + + def forward( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + head_re = self.node_emb(head_index) + head_im = self.node_emb_im(head_index) + rel_re = self.rel_emb(rel_type) + rel_im = self.rel_emb_im(rel_type) + tail_re = self.node_emb(tail_index) + tail_im = self.node_emb_im(tail_index) + + return (triple_dot(head_re, rel_re, tail_re) + + triple_dot(head_im, rel_re, tail_im) + + triple_dot(head_re, rel_im, tail_im) - + triple_dot(head_im, rel_im, tail_re)) + + def loss( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + pos_score = self(head_index, rel_type, tail_index) + neg_score = self(*self.random_sample(head_index, rel_type, tail_index)) + scores = paddle.concat([pos_score, neg_score], axis=0) + + pos_target = paddle.ones_like(pos_score) + neg_target = paddle.zeros_like(neg_score) + target = paddle.concat([pos_target, neg_target], axis=0) + + return F.binary_cross_entropy_with_logits(scores, target) + + +def triple_dot(x: Tensor, y: Tensor, z: Tensor) -> Tensor: + return (x * y * z).sum(axis=-1) diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/distmult.py b/jointContribution/mattergen/paddle_geometric/nn/kge/distmult.py new file mode 100644 index 00000000..158188eb --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/distmult.py @@ -0,0 +1,75 @@ +import paddle +import paddle.nn.functional as F +from paddle import Tensor + +from paddle_geometric.nn.kge import KGEModel + + +class DistMult(KGEModel): + r"""The DistMult model from the `"Embedding Entities and Relations for + Learning and Inference in Knowledge Bases" + `_ paper. + + :class:`DistMult` models relations as diagonal matrices, which simplifies + the bi-linear interaction between the head and tail entities to the score + function: + + .. math:: + d(h, r, t) = < \mathbf{e}_h, \mathbf{e}_r, \mathbf{e}_t > + + Args: + num_nodes (int): The number of nodes/entities in the graph. + num_relations (int): The number of relations in the graph. + hidden_channels (int): The hidden embedding size. + margin (float, optional): The margin of the ranking loss. + (default: :obj:`1.0`) + sparse (bool, optional): If set to :obj:`True`, gradients w.r.t. to + the embedding matrices will be sparse. (default: :obj:`False`) + """ + def __init__( + self, + num_nodes: int, + num_relations: int, + hidden_channels: int, + margin: float = 1.0, + sparse: bool = False, + ): + super().__init__(num_nodes, num_relations, hidden_channels, sparse) + + self.margin = margin + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.node_emb.weight) + paddle.nn.initializer.XavierUniform()(self.rel_emb.weight) + + def forward( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + + head = self.node_emb(head_index) + rel = self.rel_emb(rel_type) + tail = self.node_emb(tail_index) + + return (head * rel * tail).sum(axis=-1) + + def loss( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + + pos_score = self(head_index, rel_type, tail_index) + neg_score = self(*self.random_sample(head_index, rel_type, tail_index)) + + return F.margin_ranking_loss( + pos_score, + neg_score, + label=paddle.ones_like(pos_score), + margin=self.margin, + ) diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/loader.py b/jointContribution/mattergen/paddle_geometric/nn/kge/loader.py new file mode 100644 index 00000000..7ce67b85 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/loader.py @@ -0,0 +1,23 @@ +from typing import List, Tuple + +import paddle +from paddle import Tensor +from paddle.io import DataLoader + +class KGTripletLoader(DataLoader): + def __init__(self, head_index: Tensor, rel_type: Tensor, + tail_index: Tensor, **kwargs): + self.head_index = head_index + self.rel_type = rel_type + self.tail_index = tail_index + + super().__init__(dataset=range(head_index.shape[0]), batch_sampler=None, collate_fn=self.sample, **kwargs) + + def sample(self, index: List[int]) -> Tuple[Tensor, Tensor, Tensor]: + index = paddle.to_tensor(index, place=self.head_index.place) + + head_index = paddle.index_select(self.head_index, index) + rel_type = paddle.index_select(self.rel_type, index) + tail_index = paddle.index_select(self.tail_index, index) + + return head_index, rel_type, tail_index diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/rotate.py b/jointContribution/mattergen/paddle_geometric/nn/kge/rotate.py new file mode 100644 index 00000000..104dc49b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/rotate.py @@ -0,0 +1,92 @@ +import math + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Embedding + +from paddle_geometric.nn.kge import KGEModel + + +class RotatE(KGEModel): + r"""The RotatE model from the `"RotatE: Knowledge Graph Embedding by + Relational Rotation in Complex Space" `_ paper. + + :class:`RotatE` models relations as a rotation in complex space + from head to tail such that + + .. math:: + \mathbf{e}_t = \mathbf{e}_h \circ \mathbf{e}_r, + + resulting in the scoring function + + .. math:: + d(h, r, t) = - {\| \mathbf{e}_h \circ \mathbf{e}_r - \mathbf{e}_t \|}_p + + Args: + num_nodes (int): The number of nodes/entities in the graph. + num_relations (int): The number of relations in the graph. + hidden_channels (int): The hidden embedding size. + margin (float, optional): The margin of the ranking loss. + sparse (bool, optional): If set to :obj:`True`, gradients w.r.t. to + the embedding matrices will be sparse. (default: :obj:`False`) + """ + def __init__( + self, + num_nodes: int, + num_relations: int, + hidden_channels: int, + margin: float = 1.0, + sparse: bool = False, + ): + super().__init__(num_nodes, num_relations, hidden_channels, sparse) + + self.margin = margin + self.node_emb_im = Embedding(num_nodes, hidden_channels, sparse=sparse) + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.node_emb.weight) + paddle.nn.initializer.XavierUniform()(self.node_emb_im.weight) + paddle.assign(paddle.uniform(self.rel_emb.weight.shape, min=0, max=2 * math.pi), self.rel_emb.weight) + + def forward( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + + head_re = self.node_emb(head_index) + head_im = self.node_emb_im(head_index) + tail_re = self.node_emb(tail_index) + tail_im = self.node_emb_im(tail_index) + + rel_theta = self.rel_emb(rel_type) + rel_re, rel_im = paddle.cos(rel_theta), paddle.sin(rel_theta) + + re_score = (rel_re * head_re - rel_im * head_im) - tail_re + im_score = (rel_re * head_im + rel_im * head_re) - tail_im + complex_score = paddle.stack([re_score, im_score], axis=2) + score = paddle.norm(complex_score, p=2, axis=(1, 2)) + + return self.margin - score + + def loss( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + + pos_score = self(head_index, rel_type, tail_index) + neg_score = self(*self.random_sample(head_index, rel_type, tail_index)) + scores = paddle.concat([pos_score, neg_score], axis=0) + + pos_target = paddle.ones_like(pos_score) + neg_target = paddle.zeros_like(neg_score) + target = paddle.concat([pos_target, neg_target], axis=0) + + return F.binary_cross_entropy_with_logits(scores, target) diff --git a/jointContribution/mattergen/paddle_geometric/nn/kge/transe.py b/jointContribution/mattergen/paddle_geometric/nn/kge/transe.py new file mode 100644 index 00000000..2e3522da --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/kge/transe.py @@ -0,0 +1,91 @@ +import math + +import paddle +import paddle.nn.functional as F +from paddle import Tensor + +from paddle_geometric.nn.kge import KGEModel + + +class TransE(KGEModel): + r"""The TransE model from the `"Translating Embeddings for Modeling + Multi-Relational Data" `_ paper. + + :class:`TransE` models relations as a translation from head to tail + entities such that + + .. math:: + \mathbf{e}_h + \mathbf{e}_r \approx \mathbf{e}_t, + + resulting in the scoring function: + + .. math:: + d(h, r, t) = - {\| \mathbf{e}_h + \mathbf{e}_r - \mathbf{e}_t \|}_p + + Args: + num_nodes (int): The number of nodes/entities in the graph. + num_relations (int): The number of relations in the graph. + hidden_channels (int): The hidden embedding size. + margin (int, optional): The margin of the ranking loss. + (default: :obj:`1.0`) + p_norm (int, optional): The order embedding and distance normalization. + (default: :obj:`1.0`) + sparse (bool, optional): If set to :obj:`True`, gradients w.r.t. to the + embedding matrices will be sparse. (default: :obj:`False`) + """ + def __init__( + self, + num_nodes: int, + num_relations: int, + hidden_channels: int, + margin: float = 1.0, + p_norm: float = 1.0, + sparse: bool = False, + ): + super().__init__(num_nodes, num_relations, hidden_channels, sparse) + + self.p_norm = p_norm + self.margin = margin + + self.reset_parameters() + + def reset_parameters(self): + bound = 6. / math.sqrt(self.hidden_channels) + paddle.nn.initializer.Uniform(-bound, bound)(self.node_emb.weight) + paddle.nn.initializer.Uniform(-bound, bound)(self.rel_emb.weight) + self.rel_emb.weight.set_value(F.normalize(self.rel_emb.weight, p=self.p_norm, axis=-1)) + + def forward( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + + head = self.node_emb(head_index) + rel = self.rel_emb(rel_type) + tail = self.node_emb(tail_index) + + head = F.normalize(head, p=self.p_norm, axis=-1) + tail = F.normalize(tail, p=self.p_norm, axis=-1) + + # Calculate *negative* TransE norm: + return -((head + rel) - tail).norm(p=self.p_norm, axis=-1) + + def loss( + self, + head_index: Tensor, + rel_type: Tensor, + tail_index: Tensor, + ) -> Tensor: + + pos_score = self(head_index, rel_type, tail_index) + neg_score = self(*self.random_sample(head_index, rel_type, tail_index)) + + return F.margin_ranking_loss( + pos_score, + neg_score, + label=paddle.ones_like(pos_score), + margin=self.margin, + ) diff --git a/jointContribution/mattergen/paddle_geometric/nn/lr_scheduler.py b/jointContribution/mattergen/paddle_geometric/nn/lr_scheduler.py new file mode 100644 index 00000000..67d5a79b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/lr_scheduler.py @@ -0,0 +1,235 @@ +import math +import paddle +from paddle.optimizer import Optimizer +from paddle.optimizer.lr import LRScheduler + +class ConstantWithWarmupLR(LRScheduler): + r"""Creates a LR scheduler with a constant learning rate preceded by a + warmup period during which the learning rate increases linearly between + :obj:`0` and the initial LR set in the optimizer. + + Args: + optimizer (Optimizer): The optimizer to be scheduled. + num_warmup_steps (int): The number of steps for the warmup phase. + last_epoch (int, optional): The index of the last epoch when resuming + training. (default: :obj:`-1`) + """ + def __init__( + self, + optimizer: Optimizer, + num_warmup_steps: int, + last_epoch: int = -1, + ): + lr_lambda = functools.partial( + self._lr_lambda, + num_warmup_steps=num_warmup_steps, + ) + super().__init__(optimizer, lr_lambda, last_epoch) + + @staticmethod + def _lr_lambda( + current_step: int, + num_warmup_steps: int, + ) -> float: + if current_step < num_warmup_steps: + return float(current_step) / float(max(1.0, num_warmup_steps)) + return 1.0 + + +class LinearWithWarmupLR(LRScheduler): + r"""Creates a LR scheduler with a learning rate that decreases linearly + from the initial LR set in the optimizer to :obj:`0`, after a warmup period + during which it increases linearly from :obj:`0` to the initial LR set in + the optimizer. + + Args: + optimizer (Optimizer): The optimizer to be scheduled. + num_warmup_steps (int): The number of steps for the warmup phase. + num_training_steps (int): The total number of training steps. + last_epoch (int, optional): The index of the last epoch when resuming + training. (default: :obj:`-1`) + """ + def __init__( + self, + optimizer: Optimizer, + num_warmup_steps: int, + num_training_steps: int, + last_epoch: int = -1, + ): + lr_lambda = functools.partial( + self._lr_lambda, + num_warmup_steps=num_warmup_steps, + num_training_steps=num_training_steps, + ) + super().__init__(optimizer, lr_lambda, last_epoch) + + @staticmethod + def _lr_lambda( + current_step: int, + num_warmup_steps: int, + num_training_steps: int, + ) -> float: + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + return max( + 0.0, + float(num_training_steps - current_step) / + float(max(1, num_training_steps - num_warmup_steps)), + ) + + +class CosineWithWarmupLR(LRScheduler): + r"""Creates a LR scheduler with a learning rate that decreases following + the values of the cosine function between the initial LR set in the + optimizer to :obj:`0`, after a warmup period during which it increases + linearly between :obj:`0` and the initial LR set in the optimizer. + + Args: + optimizer (Optimizer): The optimizer to be scheduled. + num_warmup_steps (int): The number of steps for the warmup phase. + num_training_steps (int): The total number of training steps. + num_cycles (float, optional): The number of waves in the cosine + schedule (the default decreases LR from the max value to :obj:`0` + following a half-cosine). (default: :obj:`0.5`) + last_epoch (int, optional): The index of the last epoch when resuming + training. (default: :obj:`-1`) + """ + def __init__( + self, + optimizer: Optimizer, + num_warmup_steps: int, + num_training_steps: int, + num_cycles: float = 0.5, + last_epoch: int = -1, + ): + lr_lambda = functools.partial( + self._lr_lambda, + num_warmup_steps=num_warmup_steps, + num_training_steps=num_training_steps, + num_cycles=num_cycles, + ) + super().__init__(optimizer, lr_lambda, last_epoch) + + @staticmethod + def _lr_lambda( + current_step: int, + num_warmup_steps: int, + num_training_steps: int, + num_cycles: float, + ): + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + progress = float(current_step - num_warmup_steps) / float( + max(1, num_training_steps - num_warmup_steps)) + return max( + 0.0, + 0.5 * + (1.0 + math.cos(math.pi * float(num_cycles) * 2.0 * progress)), + ) + + +class CosineWithWarmupRestartsLR(LRScheduler): + r"""Creates a LR scheduler with a learning rate that decreases following + the values of the cosine function between the initial LR set in the + optimizer to :obj:`0`, with several hard restarts, after a warmup period + during which it increases linearly between :obj:`0` and the initial LR set + in the optimizer. + + Args: + optimizer (Optimizer): The optimizer to be scheduled. + num_warmup_steps (int): The number of steps for the warmup phase. + num_training_steps (int): The total number of training steps. + num_cycles (int, optional): The number of hard restarts to use. + (default: :obj:`3`) + last_epoch (int, optional): The index of the last epoch when resuming + training. (default: :obj:`-1`) + """ + def __init__( + self, + optimizer: Optimizer, + num_warmup_steps: int, + num_training_steps: int, + num_cycles: int = 3, + last_epoch: int = -1, + ): + lr_lambda = functools.partial( + self._lr_lambda, + num_warmup_steps=num_warmup_steps, + num_training_steps=num_training_steps, + num_cycles=num_cycles, + ) + super().__init__(optimizer, lr_lambda, last_epoch) + + @staticmethod + def _lr_lambda( + current_step: int, + num_warmup_steps: int, + num_training_steps: int, + num_cycles: int, + ) -> float: + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + progress = float(current_step - num_warmup_steps) / float( + max(1, num_training_steps - num_warmup_steps)) + if progress >= 1.0: + return 0.0 + return max( + 0.0, + 0.5 * (1.0 + math.cos(math.pi * + ((float(num_cycles) * progress) % 1.0))), + ) + + +class PolynomialWithWarmupLR(LRScheduler): + r"""Creates a LR scheduler with a learning rate that decreases as a + polynomial decay from the initial LR set in the optimizer to end LR defined + by `lr_end`, after a warmup period during which it increases linearly from + :obj:`0` to the initial LR set in the optimizer. + + Args: + optimizer (Optimizer): The optimizer to be scheduled. + num_warmup_steps (int): The number of steps for the warmup phase. + num_training_steps (int): The total number of training steps. + lr_end (float, optional): The end learning rate. (default: :obj:`1e-7`) + power (float, optional): The power factor of the polynomial decay. + (default: :obj:`1.0`) + last_epoch (int, optional): The index of the last epoch when resuming + training. (default: :obj:`-1`) + """ + def __init__( + self, + optimizer: Optimizer, + num_warmup_steps: int, + num_training_steps: int, + lr_end: float = 1e-7, + power: float = 1.0, + last_epoch: int = -1, + ): + lr_init = optimizer.get_lr() + if not (lr_init > lr_end): + raise ValueError(f"`lr_end` ({lr_end}) must be smaller than the " + f"initial lr ({lr_init})") + + lr_lambda = functools.partial( + self._lr_lambda, + num_warmup_steps=num_warmup_steps, + num_training_steps=num_training_steps, + lr_init=lr_init, + lr_end=lr_end, + power=power, + ) + super().__init__(optimizer, lr_lambda, last_epoch) + + @staticmethod + def _lr_lambda( + current_step: int, + num_warmup_steps: int, + num_training_steps: int, + lr_init: float, + lr_end: float, + power: float, + ) -> float: + if current_step < num_warmup_steps: + return float(current_step) / float(max(1, num_warmup_steps)) + elif current_step > num_training_steps: + return lr_end / lr_init diff --git a/jointContribution/mattergen/paddle_geometric/nn/model_hub.py b/jointContribution/mattergen/paddle_geometric/nn/model_hub.py new file mode 100644 index 00000000..2e7ca837 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/model_hub.py @@ -0,0 +1,146 @@ +import os.path as osp +from pathlib import Path +from typing import Any, Dict, Optional, Union + +import paddle + +from paddle_geometric.io import fs + +try: + from paddle_hub import ModelHubMixin, hf_hub_download +except ImportError: + ModelHubMixin = object + hf_hub_download = None + +CONFIG_NAME = 'config.json' +MODEL_HUB_ORGANIZATION = "paddle_geometric" +MODEL_WEIGHTS_NAME = 'model.pdparams' +TAGS = ['graph-machine-learning'] + + +class PyGModelHubMixin(ModelHubMixin): + r"""A mixin for saving and loading models to the + `Paddle Hub `_. + + Methods to interact with Paddle Hub for model saving and loading. + """ + + def __init__(self, model_name: str, dataset_name: str, model_kwargs: Dict): + ModelHubMixin.__init__(self) + + # Paddle Hub API requires the model config to be serialized in a compatible format + self.model_config = { + k: v + for k, v in model_kwargs.items() if isinstance(v, (str, int, float)) + } + self.model_name = model_name + self.dataset_name = dataset_name + + def construct_model_card(self, model_name: str, dataset_name: str) -> Any: + from paddle_hub import ModelCard, ModelCardData + card_data = ModelCardData( + language='en', + license='mit', + library_name=MODEL_HUB_ORGANIZATION, + tags=TAGS, + datasets=dataset_name, + model_name=model_name, + ) + card = ModelCard.from_template(card_data) + return card + + def _save_pretrained(self, save_directory: Union[Path, str]): + path = osp.join(save_directory, MODEL_WEIGHTS_NAME) + model_to_save = self.module if hasattr(self, 'module') else self + paddle.save(model_to_save.state_dict(), path) + + def save_pretrained(self, save_directory: Union[str, Path], + push_to_hub: bool = False, + repo_id: Optional[str] = None, **kwargs): + r"""Save a trained model to a local directory or to Paddle Hub.""" + + config = self.model_config + kwargs.pop('config', None) # remove config to prevent duplication + + super().save_pretrained( + save_directory=save_directory, + config=config, + push_to_hub=push_to_hub, + repo_id=repo_id, + **kwargs, + ) + model_card = self.construct_model_card(self.model_name, self.dataset_name) + if push_to_hub: + model_card.push_to_hub(repo_id) + + @classmethod + def _from_pretrained( + cls, + model_id, + revision, + cache_dir, + force_download, + proxies, + resume_download, + local_files_only, + token, + dataset_name='', + model_name='', + map_location='cpu', + strict=False, + **model_kwargs, + ): + map_location = paddle.set_device(map_location) + + if osp.isdir(model_id): + model_file = osp.join(model_id, MODEL_WEIGHTS_NAME) + else: + model_file = hf_hub_download( + repo_id=model_id, + filename=MODEL_WEIGHTS_NAME, + revision=revision, + cache_dir=cache_dir, + force_download=force_download, + proxies=proxies, + resume_download=resume_download, + token=token, + local_files_only=local_files_only, + ) + + config = model_kwargs.pop('config', None) + if config is not None: + model_kwargs = {**model_kwargs, **config} + + model = cls(dataset_name, model_name, model_kwargs) + + state_dict = fs.paddle_load(model_file, map_location=map_location) + model.set_state_dict(state_dict) + + model.eval() + + return model + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path: str, + force_download: bool = False, + resume_download: bool = False, + proxies: Optional[Dict] = None, + token: Optional[Union[str, bool]] = None, + cache_dir: Optional[str] = None, + local_files_only: bool = False, + **model_kwargs, + ) -> Any: + r"""Downloads and instantiates a model from Paddle Hub.""" + + return super().from_pretrained( + pretrained_model_name_or_path, + force_download=force_download, + resume_download=resume_download, + proxies=proxies, + use_auth_token=token, + cache_dir=cache_dir, + local_files_only=local_files_only, + **model_kwargs, + ) diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/models/__init__.py new file mode 100644 index 00000000..225c694c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/__init__.py @@ -0,0 +1,80 @@ +r"""Model package.""" + +from .mlp import MLP +from .basic_gnn import GCN, GraphSAGE, GIN, GAT, PNA, EdgeCNN +from .jumping_knowledge import JumpingKnowledge, HeteroJumpingKnowledge +from .meta import MetaLayer +from .node2vec import Node2Vec +from .deep_graph_infomax import DeepGraphInfomax +from .autoencoder import InnerProductDecoder, GAE, VGAE, ARGA, ARGVA +from .signed_gcn import SignedGCN +from .re_net import RENet +from .graph_unet import GraphUNet +from .schnet import SchNet +from .dimenet import DimeNet, DimeNetPlusPlus +from .captum import to_captum_model +from .metapath2vec import MetaPath2Vec +from .deepgcn import DeepGCNLayer +from .tgn import TGNMemory +from .label_prop import LabelPropagation +from .correct_and_smooth import CorrectAndSmooth +from .attentive_fp import AttentiveFP +from .rect import RECT_L +from .linkx import LINKX +from .lightgcn import LightGCN +from .mask_label import MaskLabel +from .rev_gnn import GroupAddRev +from .gnnff import GNNFF +from .pmlp import PMLP +from .neural_fingerprint import NeuralFingerprint +from .visnet import ViSNet +from .g_retriever import GRetriever + +# Deprecated: +from paddle_geometric.explain.algorithm.captum import (to_captum_input, + captum_output_to_dicts) + +__all__ = classes = [ + 'MLP', + 'GCN', + 'GraphSAGE', + 'GIN', + 'GAT', + 'PNA', + 'EdgeCNN', + 'JumpingKnowledge', + 'HeteroJumpingKnowledge', + 'MetaLayer', + 'Node2Vec', + 'DeepGraphInfomax', + 'InnerProductDecoder', + 'GAE', + 'VGAE', + 'ARGA', + 'ARGVA', + 'SignedGCN', + 'RENet', + 'GraphUNet', + 'SchNet', + 'DimeNet', + 'DimeNetPlusPlus', + 'to_captum_model', + 'to_captum_input', + 'captum_output_to_dicts', + 'MetaPath2Vec', + 'DeepGCNLayer', + 'TGNMemory', + 'LabelPropagation', + 'CorrectAndSmooth', + 'AttentiveFP', + 'RECT_L', + 'LINKX', + 'LightGCN', + 'MaskLabel', + 'GroupAddRev', + 'GNNFF', + 'PMLP', + 'NeuralFingerprint', + 'ViSNet', + 'GRetriever', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/attentive_fp.py b/jointContribution/mattergen/paddle_geometric/nn/models/attentive_fp.py new file mode 100644 index 00000000..0c184fd7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/attentive_fp.py @@ -0,0 +1,184 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import GRUCell, Linear +from paddle.nn.initializer import initializer + +from paddle_geometric.nn import GATConv, MessagePassing, global_add_pool +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import softmax + + +class GATEConv(MessagePassing): + def __init__( + self, + in_channels: int, + out_channels: int, + edge_dim: int, + dropout: float = 0.0, + ): + super().__init__(aggr='add', node_dim=0) + + self.dropout = dropout + + self.att_l = paddle.create_parameter( + shape=[1, out_channels], + dtype='float32', # Assuming float32, you can adjust as needed + default_initializer=initializer.Constant(0) # Replace with desired initializer + ) + + self.att_r = paddle.create_parameter( + shape=[1, in_channels], + dtype='float32', + default_initializer=initializer.Constant(0) + ) + + self.lin1 = Linear(in_channels + edge_dim, out_channels, bias_attr=False) + self.lin2 = Linear(out_channels, out_channels, bias_attr=False) + + self.bias = paddle.create_parameter( + shape=[out_channels], + dtype='float32', + default_initializer=initializer.Constant(0) + ) + + self.reset_parameters() + + def reset_parameters(self): + glorot(self.att_l) + glorot(self.att_r) + glorot(self.lin1.weight) + glorot(self.lin2.weight) + zeros(self.bias) + + def forward(self, x: Tensor, edge_index: Adj, edge_attr: Tensor) -> Tensor: + # edge_updater_type: (x: Tensor, edge_attr: Tensor) + alpha = self.edge_updater(edge_index, x=x, edge_attr=edge_attr) + + # propagate_type: (x: Tensor, alpha: Tensor) + out = self.propagate(edge_index, x=x, alpha=alpha) + out = out + self.bias + return out + + def edge_update(self, x_j: Tensor, x_i: Tensor, edge_attr: Tensor, + index: Tensor, ptr: OptTensor, + size_i: Optional[int]) -> Tensor: + x_j = F.leaky_relu_(self.lin1(paddle.concat([x_j, edge_attr], axis=-1))) + alpha_j = (x_j @ self.att_l.T).squeeze(-1) + alpha_i = (x_i @ self.att_r.T).squeeze(-1) + alpha = alpha_j + alpha_i + alpha = F.leaky_relu_(alpha) + alpha = softmax(alpha, index, ptr, size_i) + alpha = F.dropout(alpha, p=self.dropout, training=self.training) + return alpha + + def message(self, x_j: Tensor, alpha: Tensor) -> Tensor: + return self.lin2(x_j) * alpha.unsqueeze(-1) + + +class AttentiveFP(paddle.nn.Layer): + r"""The Attentive FP model for molecular representation learning from the + `"Pushing the Boundaries of Molecular Representation for Drug Discovery + with the Graph Attention Mechanism" + `_ paper, based on + graph attention mechanisms. + """ + + def __init__( + self, + in_channels: int, + hidden_channels: int, + out_channels: int, + edge_dim: int, + num_layers: int, + num_timesteps: int, + dropout: float = 0.0, + ): + super().__init__() + + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.edge_dim = edge_dim + self.num_layers = num_layers + self.num_timesteps = num_timesteps + self.dropout = dropout + + self.lin1 = Linear(in_channels, hidden_channels) + + self.gate_conv = GATEConv(hidden_channels, hidden_channels, edge_dim, + dropout) + self.gru = GRUCell(hidden_channels, hidden_channels) + + self.atom_convs = paddle.nn.LayerList() + self.atom_grus = paddle.nn.LayerList() + for _ in range(num_layers - 1): + conv = GATConv(hidden_channels, hidden_channels, dropout=dropout, + add_self_loops=False, negative_slope=0.01) + self.atom_convs.append(conv) + self.atom_grus.append(GRUCell(hidden_channels, hidden_channels)) + + self.mol_conv = GATConv(hidden_channels, hidden_channels, + dropout=dropout, add_self_loops=False, + negative_slope=0.01) + self.mol_conv.explain = False # Cannot explain global pooling. + self.mol_gru = GRUCell(hidden_channels, hidden_channels) + + self.lin2 = Linear(hidden_channels, out_channels) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.lin1.reset_parameters() + self.gate_conv.reset_parameters() + self.gru.reset_parameters() + for conv, gru in zip(self.atom_convs, self.atom_grus): + conv.reset_parameters() + gru.reset_parameters() + self.mol_conv.reset_parameters() + self.mol_gru.reset_parameters() + self.lin2.reset_parameters() + + def forward(self, x: Tensor, edge_index: Tensor, edge_attr: Tensor, + batch: Tensor) -> Tensor: + """""" # noqa: D419 + # Atom Embedding: + x = F.leaky_relu_(self.lin1(x)) + + h = F.elu_(self.gate_conv(x, edge_index, edge_attr)) + h = F.dropout(h, p=self.dropout, training=self.training) + x = self.gru(h, x).relu_() + + for conv, gru in zip(self.atom_convs, self.atom_grus): + h = conv(x, edge_index) + h = F.elu(h) + h = F.dropout(h, p=self.dropout, training=self.training) + x = gru(h, x).relu() + + # Molecule Embedding: + row = paddle.arange(batch.shape[0], device=batch.device) + edge_index = paddle.stack([row, batch], axis=0) + + out = global_add_pool(x, batch).relu_() + for t in range(self.num_timesteps): + h = F.elu_(self.mol_conv((x, out), edge_index)) + h = F.dropout(h, p=self.dropout, training=self.training) + out = self.mol_gru(h, out).relu_() + + # Predictor: + out = F.dropout(out, p=self.dropout, training=self.training) + return self.lin2(out) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'in_channels={self.in_channels}, ' + f'hidden_channels={self.hidden_channels}, ' + f'out_channels={self.out_channels}, ' + f'edge_dim={self.edge_dim}, ' + f'num_layers={self.num_layers}, ' + f'num_timesteps={self.num_timesteps}' + f')') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/autoencoder.py b/jointContribution/mattergen/paddle_geometric/nn/models/autoencoder.py new file mode 100644 index 00000000..c6f9126c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/autoencoder.py @@ -0,0 +1,195 @@ +from typing import Optional, Tuple + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, GRUCell, Linear + +from paddle_geometric.nn import GATConv, MessagePassing, global_add_pool +from paddle_geometric.nn.inits import glorot, zeros +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import softmax +from paddle_geometric.utils import negative_sampling + + +EPS = 1e-15 +MAX_LOGSTD = 10 + + +class InnerProductDecoder(paddle.nn.Layer): + r"""The inner product decoder from the `"Variational Graph Auto-Encoders" + `_ paper. + + .. math:: + \sigma(\mathbf{Z}\mathbf{Z}^{\top}) + + where :math:`\mathbf{Z} \in \mathbb{R}^{N \times d}` denotes the latent + space produced by the encoder. + """ + def forward( + self, + z: Tensor, + edge_index: Tensor, + sigmoid: bool = True, + ) -> Tensor: + r"""Decodes the latent variables :obj:`z` into edge probabilities for + the given node-pairs :obj:`edge_index`. + """ + value = (z[edge_index[0]] * z[edge_index[1]]).sum(axis=1) + return paddle.sigmoid(value) if sigmoid else value + + def forward_all(self, z: Tensor, sigmoid: bool = True) -> Tensor: + r"""Decodes the latent variables :obj:`z` into a probabilistic dense + adjacency matrix. + """ + adj = paddle.matmul(z, z.T) + return paddle.sigmoid(adj) if sigmoid else adj + + +class GAE(paddle.nn.Layer): + r"""The Graph Auto-Encoder model from the + `"Variational Graph Auto-Encoders" `_ + paper based on user-defined encoder and decoder models. + """ + def __init__(self, encoder: Layer, decoder: Optional[Layer] = None): + super().__init__() + self.encoder = encoder + self.decoder = InnerProductDecoder() if decoder is None else decoder + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.encoder.reset_parameters() + self.decoder.reset_parameters() + + def forward(self, *args, **kwargs) -> Tensor: + return self.encoder(*args, **kwargs) + + def encode(self, *args, **kwargs) -> Tensor: + return self.encoder(*args, **kwargs) + + def decode(self, *args, **kwargs) -> Tensor: + return self.decoder(*args, **kwargs) + + def recon_loss(self, z: Tensor, pos_edge_index: Tensor, + neg_edge_index: Optional[Tensor] = None) -> Tensor: + pos_loss = -paddle.log( + self.decoder(z, pos_edge_index, sigmoid=True) + EPS).mean() + + if neg_edge_index is None: + neg_edge_index = negative_sampling(pos_edge_index, z.shape[0]) + neg_loss = -paddle.log(1 - self.decoder(z, neg_edge_index, sigmoid=True) + EPS).mean() + + return pos_loss + neg_loss + + def test(self, z: Tensor, pos_edge_index: Tensor, + neg_edge_index: Tensor) -> Tuple[Tensor, Tensor]: + from sklearn.metrics import average_precision_score, roc_auc_score + + pos_y = z.new_ones(pos_edge_index.shape[1]) + neg_y = z.new_zeros(neg_edge_index.shape[1]) + y = paddle.concat([pos_y, neg_y], axis=0) + + pos_pred = self.decoder(z, pos_edge_index, sigmoid=True) + neg_pred = self.decoder(z, neg_edge_index, sigmoid=True) + pred = paddle.concat([pos_pred, neg_pred], axis=0) + + y, pred = y.cpu().numpy(), pred.cpu().numpy() + + return roc_auc_score(y, pred), average_precision_score(y, pred) + + +class VGAE(GAE): + r"""The Variational Graph Auto-Encoder model from the + `"Variational Graph Auto-Encoders" `_ + paper. + """ + def __init__(self, encoder: Layer, decoder: Optional[Layer] = None): + super().__init__(encoder, decoder) + + def reparametrize(self, mu: Tensor, logstd: Tensor) -> Tensor: + if self.training: + return mu + paddle.randn_like(logstd) * paddle.exp(logstd) + else: + return mu + + def encode(self, *args, **kwargs) -> Tensor: + self.__mu__, self.__logstd__ = self.encoder(*args, **kwargs) + self.__logstd__ = paddle.clip(self.__logstd__, max=MAX_LOGSTD) + z = self.reparametrize(self.__mu__, self.__logstd__) + return z + + def kl_loss(self, mu: Optional[Tensor] = None, + logstd: Optional[Tensor] = None) -> Tensor: + mu = self.__mu__ if mu is None else mu + logstd = self.__logstd__ if logstd is None else paddle.clip(logstd, max=MAX_LOGSTD) + return -0.5 * paddle.mean( + paddle.sum(1 + 2 * logstd - mu**2 - paddle.exp(logstd)**2, axis=1)) + + +class ARGA(GAE): + r"""The Adversarially Regularized Graph Auto-Encoder model from the + `"Adversarially Regularized Graph Autoencoder for Graph Embedding" + `_ paper. + """ + def __init__( + self, + encoder: Layer, + discriminator: Layer, + decoder: Optional[Layer] = None, + ): + super().__init__(encoder, decoder) + self.discriminator = discriminator + self.reset_parameters() + + def reset_parameters(self): + super().reset_parameters() + self.discriminator.reset_parameters() + + def reg_loss(self, z: Tensor) -> Tensor: + real = paddle.sigmoid(self.discriminator(z)) + real_loss = -paddle.log(real + EPS).mean() + return real_loss + + def discriminator_loss(self, z: Tensor) -> Tensor: + real = paddle.sigmoid(self.discriminator(paddle.randn_like(z))) + fake = paddle.sigmoid(self.discriminator(z.detach())) + real_loss = -paddle.log(real + EPS).mean() + fake_loss = -paddle.log(1 - fake + EPS).mean() + return real_loss + fake_loss + + +class ARGVA(ARGA): + r"""The Adversarially Regularized Variational Graph Auto-Encoder model from + the `"Adversarially Regularized Graph Autoencoder for Graph Embedding" + `_ paper. + """ + def __init__( + self, + encoder: Layer, + discriminator: Layer, + decoder: Optional[Layer] = None, + ): + super().__init__(encoder, discriminator, decoder) + self.VGAE = VGAE(encoder, decoder) + + @property + def __mu__(self) -> Tensor: + return self.VGAE.__mu__ + + @property + def __logstd__(self) -> Tensor: + return self.VGAE.__logstd__ + + def reparametrize(self, mu: Tensor, logstd: Tensor) -> Tensor: + return self.VGAE.reparametrize(mu, logstd) + + def encode(self, *args, **kwargs) -> Tensor: + return self.VGAE.encode(*args, **kwargs) + + def kl_loss( + self, + mu: Optional[Tensor] = None, + logstd: Optional[Tensor] = None, + ) -> Tensor: + return self.VGAE.kl_loss(mu, logstd) diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/basic_gnn.py b/jointContribution/mattergen/paddle_geometric/nn/models/basic_gnn.py new file mode 100644 index 00000000..47cf2e1d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/basic_gnn.py @@ -0,0 +1,343 @@ +import copy +import inspect +from typing import Any, Callable, Dict, Final, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import Linear, LayerList +from tqdm import tqdm + +from paddle_geometric.data import Data +from paddle_geometric.loader import CachedLoader, NeighborLoader +from paddle_geometric.nn.conv import ( + EdgeConv, + GATConv, + GATv2Conv, + GCNConv, + GINConv, + MessagePassing, + PNAConv, + SAGEConv, +) +from paddle_geometric.nn.models import MLP +from paddle_geometric.nn.models.jumping_knowledge import JumpingKnowledge +from paddle_geometric.nn.resolver import ( + activation_resolver, + normalization_resolver, +) +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils._trim_to_layer import TrimToLayer + + +class BasicGNN(paddle.nn.Layer): + r"""An abstract class for implementing basic GNN models.""" + + supports_edge_weight: Final[bool] + supports_edge_attr: Final[bool] + supports_norm_batch: Final[bool] + + def __init__( + self, + in_channels: int, + hidden_channels: int, + num_layers: int, + out_channels: Optional[int] = None, + dropout: float = 0.0, + act: Union[str, Callable, None] = "relu", + act_first: bool = False, + act_kwargs: Optional[Dict[str, Any]] = None, + norm: Union[str, Callable, None] = None, + norm_kwargs: Optional[Dict[str, Any]] = None, + jk: Optional[str] = None, + **kwargs, + ): + super().__init__() + + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.num_layers = num_layers + + self.dropout = paddle.nn.Dropout(p=dropout) + self.act = activation_resolver(act, **(act_kwargs or {})) + self.jk_mode = jk + self.act_first = act_first + self.norm = norm if isinstance(norm, str) else None + self.norm_kwargs = norm_kwargs + + if out_channels is not None: + self.out_channels = out_channels + else: + self.out_channels = hidden_channels + + self.convs = LayerList() + if num_layers > 1: + self.convs.append(self.init_conv(in_channels, hidden_channels, **kwargs)) + if isinstance(in_channels, (tuple, list)): + in_channels = (hidden_channels, hidden_channels) + else: + in_channels = hidden_channels + for _ in range(num_layers - 2): + self.convs.append(self.init_conv(in_channels, hidden_channels, **kwargs)) + if isinstance(in_channels, (tuple, list)): + in_channels = (hidden_channels, hidden_channels) + else: + in_channels = hidden_channels + if out_channels is not None and jk is None: + self._is_conv_to_out = True + self.convs.append(self.init_conv(in_channels, out_channels, **kwargs)) + else: + self.convs.append(self.init_conv(in_channels, hidden_channels, **kwargs)) + + self.norms = LayerList() + norm_layer = normalization_resolver(norm, hidden_channels, **(norm_kwargs or {})) + if norm_layer is None: + norm_layer = paddle.nn.Identity() + + self.supports_norm_batch = False + if hasattr(norm_layer, 'forward'): + norm_params = inspect.signature(norm_layer.forward).parameters + self.supports_norm_batch = 'batch' in norm_params + + for _ in range(num_layers - 1): + self.norms.append(copy.deepcopy(norm_layer)) + + if jk is not None: + self.norms.append(copy.deepcopy(norm_layer)) + else: + self.norms.append(paddle.nn.Identity()) + + if jk is not None and jk != 'last': + self.jk = JumpingKnowledge(jk, hidden_channels, num_layers) + + if jk is not None: + if jk == 'cat': + in_channels = num_layers * hidden_channels + else: + in_channels = hidden_channels + self.lin = Linear(in_channels, self.out_channels) + + self._trim = TrimToLayer() + + def init_conv(self, in_channels: Union[int, Tuple[int, int]], out_channels: int, **kwargs) -> MessagePassing: + raise NotImplementedError + + def reset_parameters(self): + for conv in self.convs: + conv.reset_parameters() + for norm in self.norms: + if hasattr(norm, 'reset_parameters'): + norm.reset_parameters() + if hasattr(self, 'jk'): + self.jk.reset_parameters() + if hasattr(self, 'lin'): + self.lin.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Adj, + edge_weight: OptTensor = None, + edge_attr: OptTensor = None, + batch: OptTensor = None, + batch_size: Optional[int] = None, + num_sampled_nodes_per_hop: Optional[List[int]] = None, + num_sampled_edges_per_hop: Optional[List[int]] = None, + ) -> Tensor: + xs: List[Tensor] = [] + assert len(self.convs) == len(self.norms) + for i, (conv, norm) in enumerate(zip(self.convs, self.norms)): + if (not paddle.jit.is_scripting() + and num_sampled_nodes_per_hop is not None): + x, edge_index, value = self._trim( + i, + num_sampled_nodes_per_hop, + num_sampled_edges_per_hop, + x, + edge_index, + edge_weight if edge_weight is not None else edge_attr, + ) + if edge_weight is not None: + edge_weight = value + else: + edge_attr = value + + if self.supports_edge_weight and self.supports_edge_attr: + x = conv(x, edge_index, edge_weight=edge_weight, edge_attr=edge_attr) + elif self.supports_edge_weight: + x = conv(x, edge_index, edge_weight=edge_weight) + elif self.supports_edge_attr: + x = conv(x, edge_index, edge_attr=edge_attr) + else: + x = conv(x, edge_index) + + if i < self.num_layers - 1 or self.jk_mode is not None: + if self.act is not None and self.act_first: + x = self.act(x) + if self.supports_norm_batch: + x = norm(x, batch, batch_size) + else: + x = norm(x) + if self.act is not None and not self.act_first: + x = self.act(x) + x = self.dropout(x) + if hasattr(self, 'jk'): + xs.append(x) + + x = self.jk(xs) if hasattr(self, 'jk') else x + x = self.lin(x) if hasattr(self, 'lin') else x + + return x + + @paddle.no_grad() + def inference_per_layer( + self, + layer: int, + x: Tensor, + edge_index: Adj, + batch_size: int, + ) -> Tensor: + x = self.convs[layer](x, edge_index)[:batch_size] + + if layer == self.num_layers - 1 and self.jk_mode is None: + return x + + if self.act is not None and self.act_first: + x = self.act(x) + if self.norms is not None: + x = self.norms[layer](x) + if self.act is not None and not self.act_first: + x = self.act(x) + if layer == self.num_layers - 1 and hasattr(self, 'lin'): + x = self.lin(x) + + return x + + @paddle.no_grad() + def inference( + self, + loader: NeighborLoader, + device: Optional[Union[str, str]] = None, + embedding_device: Union[str, str] = 'cpu', + progress_bar: bool = False, + cache: bool = False, + ) -> Tensor: + assert self.jk_mode is None or self.jk_mode == 'last' + assert isinstance(loader, NeighborLoader) + assert len(loader.dataset) == loader.data.num_nodes + assert len(loader.node_sampler.num_neighbors) == 1 + assert not self.training + + if progress_bar: + pbar = tqdm(total=len(self.convs) * len(loader)) + pbar.set_description('Inference') + + x_all = loader.data.x.to(embedding_device) + + if cache: + def transform(data: Data) -> Data: + kwargs = dict(n_id=data.n_id, batch_size=data.batch_size) + if hasattr(data, 'adj_t'): + kwargs['adj_t'] = data.adj_t + else: + kwargs['edge_index'] = data.edge_index + + return Data.from_dict(kwargs) + + loader = CachedLoader(loader, device=device, transform=transform) + + for i in range(self.num_layers): + xs: List[Tensor] = [] + for batch in loader: + x = x_all[batch.n_id].to(device) + batch_size = batch.batch_size + if hasattr(batch, 'adj_t'): + edge_index = batch.adj_t.to(device) + else: + edge_index = batch.edge_index.to(device) + + x = self.inference_per_layer(i, x, edge_index, batch_size) + xs.append(x.to(embedding_device)) + + if progress_bar: + pbar.update(1) + + x_all = paddle.concat(xs, axis=0) + + if progress_bar: + pbar.close() + + return x_all + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_layers={self.num_layers})') + + +class GCN(BasicGNN): + def init_conv(self, in_channels: int, out_channels: int, **kwargs) -> MessagePassing: + return GCNConv(in_channels, out_channels, **kwargs) + + +class GraphSAGE(BasicGNN): + def init_conv(self, in_channels: Union[int, Tuple[int, int]], out_channels: int, **kwargs) -> MessagePassing: + return SAGEConv(in_channels, out_channels, **kwargs) + + +class GIN(BasicGNN): + def init_conv(self, in_channels: int, out_channels: int, **kwargs) -> MessagePassing: + mlp = MLP( + [in_channels, out_channels, out_channels], + act=self.act, + act_first=self.act_first, + norm=self.norm, + norm_kwargs=self.norm_kwargs, + ) + return GINConv(mlp, **kwargs) + + +class GAT(BasicGNN): + def init_conv(self, in_channels: Union[int, Tuple[int, int]], out_channels: int, **kwargs) -> MessagePassing: + v2 = kwargs.pop('v2', False) + heads = kwargs.pop('heads', 1) + concat = kwargs.pop('concat', True) + + if getattr(self, '_is_conv_to_out', False): + concat = False + + if concat and out_channels % heads != 0: + raise ValueError(f"Ensure that the number of output channels of " + f"'GATConv' (got '{out_channels}') is divisible " + f"by the number of heads (got '{heads}')") + + if concat: + out_channels = out_channels // heads + + Conv = GATConv if not v2 else GATv2Conv + return Conv(in_channels, out_channels, heads=heads, concat=concat, dropout=self.dropout.p, **kwargs) + + +class PNA(BasicGNN): + def init_conv(self, in_channels: int, out_channels: int, **kwargs) -> MessagePassing: + return PNAConv(in_channels, out_channels, **kwargs) + + +class EdgeCNN(BasicGNN): + def init_conv(self, in_channels: int, out_channels: int, **kwargs) -> MessagePassing: + mlp = MLP( + [2 * in_channels, out_channels, out_channels], + act=self.act, + act_first=self.act_first, + norm=self.norm, + norm_kwargs=self.norm_kwargs, + ) + return EdgeConv(mlp, **kwargs) + + +__all__ = [ + 'GCN', + 'GraphSAGE', + 'GIN', + 'GAT', + 'PNA', + 'EdgeCNN', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/captum.py b/jointContribution/mattergen/paddle_geometric/nn/models/captum.py new file mode 100644 index 00000000..9e343593 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/captum.py @@ -0,0 +1,103 @@ +from typing import Optional, Union + +import paddle + +from paddle_geometric.explain.algorithm.captum import ( + CaptumHeteroModel, + CaptumModel, + MaskLevelType, +) +from paddle_geometric.typing import Metadata + + +def to_captum_model( + model: paddle.nn.Layer, + mask_type: Union[str, MaskLevelType] = MaskLevelType.edge, + output_idx: Optional[int] = None, + metadata: Optional[Metadata] = None, +) -> Union[CaptumModel, CaptumHeteroModel]: + r"""Converts a model to a model that can be used for + `Captum `_ attribution methods. + + Sample code for homogeneous graphs: + + .. code-block:: python + + from captum.attr import IntegratedGradients + + from paddle_geometric.data import Data + from paddle_geometric.nn import GCN + from paddle_geometric.nn import to_captum_model, to_captum_input + + data = Data(x=(...), edge_index(...)) + model = GCN(...) + + # Train the model. + + # Explain predictions for node `10`: + mask_type="edge" + output_idx = 10 + captum_model = to_captum_model(model, mask_type, output_idx) + inputs, additional_forward_args = to_captum_input(data.x, + data.edge_index, mask_type) + + ig = IntegratedGradients(captum_model) + ig_attr = ig.attribute(inputs = inputs, + target=int(y[output_idx]), + additional_forward_args=additional_forward_args, + internal_batch_size=1) + + Sample code for heterogeneous graphs: + + .. code-block:: python + + from captum.attr import IntegratedGradients + + from paddle_geometric.data import HeteroData + from paddle_geometric.nn import HeteroConv + from paddle_geometric.nn import (captum_output_to_dicts, + to_captum_model, to_captum_input) + + data = HeteroData(...) + model = HeteroConv(...) + # Train the model. + + # Explain predictions for node `10`: + mask_type="edge" + metadata = data.metadata + output_idx = 10 + captum_model = to_captum_model(model, mask_type, output_idx, metadata) + inputs, additional_forward_args = to_captum_input(data.x_dict, + data.edge_index_dict, mask_type) + + ig = IntegratedGradients(captum_model) + ig_attr = ig.attribute(inputs=inputs, + target=int(y[output_idx]), + additional_forward_args=additional_forward_args, + internal_batch_size=1) + edge_attr_dict = captum_output_to_dicts(ig_attr, mask_type, metadata) + + .. note:: + For an example of using a :captum:`Captum` attribution method within + :pyg:`PyG`, see `examples/explain/captum_explainer.py + `_. + + Args: + model (paddle.nn.Layer): The model to be explained. + mask_type (str, optional): Denotes the type of mask to be created with + a :captum:`Captum` explainer. Valid inputs are :obj:`"edge"`, + :obj:`"node"`, and :obj:`"node_and_edge"`. (default: :obj:`"edge"`) + output_idx (int, optional): Index of the output element (node or link + index) to be explained. With :obj:`output_idx` set, the forward + function will return the output of the model for the element at + the index specified. (default: :obj:`None`) + metadata (Metadata, optional): The metadata of the heterogeneous graph. + Only required if explaining a + :class:`~paddle_geometric.data.HeteroData` object. + (default: :obj:`None`) + """ + if metadata is None: + return CaptumModel(model, mask_type, output_idx) + else: + return CaptumHeteroModel(model, mask_type, output_idx, metadata) diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/correct_and_smooth.py b/jointContribution/mattergen/paddle_geometric/nn/models/correct_and_smooth.py new file mode 100644 index 00000000..044d9575 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/correct_and_smooth.py @@ -0,0 +1,126 @@ +import paddle +from paddle import Tensor + +from paddle_geometric.nn.models import LabelPropagation +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import one_hot + + +class CorrectAndSmooth(paddle.nn.Layer): + r"""The correct and smooth (C&S) post-processing model from the + `"Combining Label Propagation And Simple Models Out-performs Graph Neural + Networks" + `_ paper, where soft predictions + :math:`\mathbf{Z}` (obtained from a simple base predictor) are + first corrected based on ground-truth training + label information :math:`\mathbf{Y}` and residual propagation. + + .. math:: + \mathbf{e}^{(0)}_i &= \begin{cases} + \mathbf{y}_i - \mathbf{z}_i, & \text{if }i + \text{ is training node,}\\ + \mathbf{0}, & \text{else} + \end{cases} + + .. math:: + \mathbf{E}^{(\ell)} &= \alpha_1 \mathbf{D}^{-1/2}\mathbf{A} + \mathbf{D}^{-1/2} \mathbf{E}^{(\ell - 1)} + + (1 - \alpha_1) \mathbf{E}^{(\ell - 1)} + + \mathbf{\hat{Z}} &= \mathbf{Z} + \gamma \cdot \mathbf{E}^{(L_1)}, + + where :math:`\gamma` denotes the scaling factor (either fixed or + automatically determined), and then smoothed over the graph via label + propagation + + .. math:: + \mathbf{\hat{z}}^{(0)}_i &= \begin{cases} + \mathbf{y}_i, & \text{if }i\text{ is training node,}\\ + \mathbf{\hat{z}}_i, & \text{else} + \end{cases} + + .. math:: + \mathbf{\hat{Z}}^{(\ell)} = \alpha_2 \mathbf{D}^{-1/2}\mathbf{A} + \mathbf{D}^{-1/2} \mathbf{\hat{Z}}^{(\ell - 1)} + + (1 - \alpha_2) \mathbf{\hat{Z}}^{(\ell - 1)} + + to obtain the final prediction :math:`\mathbf{\hat{Z}}^{(L_2)}`. + + Args: + num_correction_layers (int): The number of propagations :math:`L_1`. + correction_alpha (float): The :math:`\alpha_1` coefficient. + num_smoothing_layers (int): The number of propagations :math:`L_2`. + smoothing_alpha (float): The :math:`\alpha_2` coefficient. + autoscale (bool, optional): If set to :obj:`True`, will automatically + determine the scaling factor :math:`\gamma`. (default: :obj:`True`) + scale (float, optional): The scaling factor :math:`\gamma`, in case + :obj:`autoscale = False`. (default: :obj:`1.0`) + """ + def __init__(self, num_correction_layers: int, correction_alpha: float, + num_smoothing_layers: int, smoothing_alpha: float, + autoscale: bool = True, scale: float = 1.0): + super().__init__() + self.autoscale = autoscale + self.scale = scale + + self.prop1 = LabelPropagation(num_correction_layers, correction_alpha) + self.prop2 = LabelPropagation(num_smoothing_layers, smoothing_alpha) + + def forward(self, y_soft: Tensor, *args) -> Tensor: + y_soft = self.correct(y_soft, *args) + return self.smooth(y_soft, *args) + + def correct(self, y_soft: Tensor, y_true: Tensor, mask: Tensor, + edge_index: Adj, edge_weight: OptTensor = None) -> Tensor: + numel = int(mask.sum()) if mask.dtype == paddle.bool else mask.size(0) + assert y_true.size(0) == numel + + if y_true.dtype == paddle.int64 and y_true.size(0) == y_true.numel(): + y_true = one_hot(y_true.view(-1), num_classes=y_soft.size(-1), + dtype=y_soft.dtype) + + error = paddle.zeros_like(y_soft) + error[mask] = y_true - y_soft[mask] + + if self.autoscale: + smoothed_error = self.prop1(error, edge_index, + edge_weight=edge_weight, + post_step=lambda x: paddle.clip(x, min=-1., max=1.)) + + sigma = error[mask].abs().sum() / numel + scale = sigma / smoothed_error.abs().sum(axis=1, keepdim=True) + scale[scale.isinf() | (scale > 1000)] = 1.0 + return y_soft + scale * smoothed_error + else: + + def fix_input(x): + x[mask] = error[mask] + return x + + smoothed_error = self.prop1(error, edge_index, + edge_weight=edge_weight, + post_step=fix_input) + return y_soft + self.scale * smoothed_error + + def smooth(self, y_soft: Tensor, y_true: Tensor, mask: Tensor, + edge_index: Adj, edge_weight: OptTensor = None) -> Tensor: + numel = int(mask.sum()) if mask.dtype == paddle.bool else mask.size(0) + assert y_true.size(0) == numel + + if y_true.dtype == paddle.int64 and y_true.size(0) == y_true.numel(): + y_true = one_hot(y_true.view(-1), num_classes=y_soft.size(-1), + dtype=y_soft.dtype) + + y_soft = y_soft.clone() + y_soft[mask] = y_true + + return self.prop2(y_soft, edge_index, edge_weight=edge_weight) + + def __repr__(self): + L1, alpha1 = self.prop1.num_layers, self.prop1.alpha + L2, alpha2 = self.prop2.num_layers, self.prop2.alpha + return (f'{self.__class__.__name__}(\n' + f' correct: num_layers={L1}, alpha={alpha1}\n' + f' smooth: num_layers={L2}, alpha={alpha2}\n' + f' autoscale={self.autoscale}, scale={self.scale}\n' + ')') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/deep_graph_infomax.py b/jointContribution/mattergen/paddle_geometric/nn/models/deep_graph_infomax.py new file mode 100644 index 00000000..a575f41b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/deep_graph_infomax.py @@ -0,0 +1,119 @@ +import copy +from typing import Callable, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric.nn.inits import reset, uniform + +EPS = 1e-15 + + +class DeepGraphInfomax(paddle.nn.Layer): + r"""The Deep Graph Infomax model from the + `"Deep Graph Infomax" `_ + paper based on user-defined encoder and summary model :math:`\mathcal{E}` + and :math:`\mathcal{R}` respectively, and a corruption function + :math:`\mathcal{C}`. + + Args: + hidden_channels (int): The latent space dimensionality. + encoder (paddle.nn.Layer): The encoder module :math:`\mathcal{E}`. + summary (callable): The readout function :math:`\mathcal{R}`. + corruption (callable): The corruption function :math:`\mathcal{C}`. + """ + def __init__( + self, + hidden_channels: int, + encoder: Layer, + summary: Callable, + corruption: Callable, + ): + super().__init__() + self.hidden_channels = hidden_channels + self.encoder = encoder + self.summary = summary + self.corruption = corruption + + self.weight = paddle.create_parameter( + shape=[hidden_channels, hidden_channels], + dtype='float32' + ) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + reset(self.encoder) + reset(self.summary) + uniform(self.hidden_channels, self.weight) + + def forward(self, *args, **kwargs) -> Tuple[Tensor, Tensor, Tensor]: + """Returns the latent space for the input arguments, their + corruptions and their summary representation. + """ + pos_z = self.encoder(*args, **kwargs) + + cor = self.corruption(*args, **kwargs) + cor = cor if isinstance(cor, tuple) else (cor, ) + cor_args = cor[:len(args)] + cor_kwargs = copy.copy(kwargs) + for key, value in zip(kwargs.keys(), cor[len(args):]): + cor_kwargs[key] = value + + neg_z = self.encoder(*cor_args, **cor_kwargs) + + summary = self.summary(pos_z, *args, **kwargs) + + return pos_z, neg_z, summary + + def discriminate(self, z: Tensor, summary: Tensor, + sigmoid: bool = True) -> Tensor: + r"""Given the patch-summary pair :obj:`z` and :obj:`summary`, computes + the probability scores assigned to this patch-summary pair. + + Args: + z (paddle.Tensor): The latent space. + summary (paddle.Tensor): The summary vector. + sigmoid (bool, optional): If set to :obj:`False`, does not apply + the logistic sigmoid function to the output. + (default: :obj:`True`) + """ + summary = summary.t() if summary.dim() > 1 else summary + value = paddle.matmul(z, paddle.matmul(self.weight, summary)) + return paddle.nn.functional.sigmoid(value) if sigmoid else value + + def loss(self, pos_z: Tensor, neg_z: Tensor, summary: Tensor) -> Tensor: + r"""Computes the mutual information maximization objective.""" + pos_loss = -paddle.log( + self.discriminate(pos_z, summary, sigmoid=True) + EPS).mean() + neg_loss = -paddle.log(1 - + self.discriminate(neg_z, summary, sigmoid=True) + + EPS).mean() + + return pos_loss + neg_loss + + def test( + self, + train_z: Tensor, + train_y: Tensor, + test_z: Tensor, + test_y: Tensor, + solver: str = 'lbfgs', + *args, + **kwargs, + ) -> float: + r"""Evaluates latent space quality via a logistic regression downstream + task. + """ + from sklearn.linear_model import LogisticRegression + + clf = LogisticRegression(solver=solver, *args, + **kwargs).fit(train_z.detach().cpu().numpy(), + train_y.detach().cpu().numpy()) + return clf.score(test_z.detach().cpu().numpy(), + test_y.detach().cpu().numpy()) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.hidden_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/deepgcn.py b/jointContribution/mattergen/paddle_geometric/nn/models/deepgcn.py new file mode 100644 index 00000000..9f93327e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/deepgcn.py @@ -0,0 +1,115 @@ +import copy +from typing import Optional + +import paddle +from paddle import Tensor +from paddle.nn import Layer +from paddle.nn import functional as F +from paddle.callbacks import ModelCheckpoint + + +class DeepGCNLayer(paddle.nn.Layer): + r"""The skip connection operations from the + `"DeepGCNs: Can GCNs Go as Deep as CNNs?" + `_ and `"All You Need to Train Deeper + GCNs" `_ papers. + The implemented skip connections includes the pre-activation residual + connection (:obj:`"res+"`), the residual connection (:obj:`"res"`), + the dense connection (:obj:`"dense"`) and no connections (:obj:`"plain"`). + + * **Res+** (:obj:`"res+"`): + + .. math:: + \text{Normalization}\to\text{Activation}\to\text{Dropout}\to + \text{GraphConv}\to\text{Res} + + * **Res** (:obj:`"res"`) / **Dense** (:obj:`"dense"`) / **Plain** + (:obj:`"plain"`): + + .. math:: + \text{GraphConv}\to\text{Normalization}\to\text{Activation}\to + \text{Res/Dense/Plain}\to\text{Dropout} + + Args: + conv (paddle.nn.Layer, optional): the GCN operator. + (default: :obj:`None`) + norm (paddle.nn.Layer): the normalization layer. (default: :obj:`None`) + act (paddle.nn.Layer): the activation layer. (default: :obj:`None`) + block (str, optional): The skip connection operation to use + (:obj:`"res+"`, :obj:`"res"`, :obj:`"dense"` or :obj:`"plain"`). + (default: :obj:`"res+"`) + dropout (float, optional): Whether to apply or dropout. + (default: :obj:`0.`) + ckpt_grad (bool, optional): If set to :obj:`True`, will checkpoint this + part of the model. Checkpointing works by trading compute for + memory, since intermediate activations do not need to be kept in + memory. Set this to :obj:`True` in case you encounter out-of-memory + errors while going deep. (default: :obj:`False`) + """ + + def __init__( + self, + conv: Optional[Layer] = None, + norm: Optional[Layer] = None, + act: Optional[Layer] = None, + block: str = 'res+', + dropout: float = 0., + ckpt_grad: bool = False, + ): + super().__init__() + + self.conv = conv + self.norm = norm + self.act = act + self.block = block.lower() + assert self.block in ['res+', 'res', 'dense', 'plain'] + self.dropout = dropout + self.ckpt_grad = ckpt_grad + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.conv.reset_parameters() + self.norm.reset_parameters() + + def forward(self, *args, **kwargs) -> Tensor: + """""" # noqa: D419 + args = list(args) + x = args.pop(0) + + if self.block == 'res+': + h = x + if self.norm is not None: + h = self.norm(h) + if self.act is not None: + h = self.act(h) + h = F.dropout(h, p=self.dropout, training=self.training) + if self.conv is not None and self.ckpt_grad and h.stop_gradient: + h = ModelCheckpoint(self.conv, h, *args, use_reentrant=True, + **kwargs) + else: + h = self.conv(h, *args, **kwargs) + + return x + h + + else: + if self.conv is not None and self.ckpt_grad and x.stop_gradient: + h = ModelCheckpoint(self.conv, x, *args, use_reentrant=True, + **kwargs) + else: + h = self.conv(x, *args, **kwargs) + if self.norm is not None: + h = self.norm(h) + if self.act is not None: + h = self.act(h) + + if self.block == 'res': + h = x + h + elif self.block == 'dense': + h = paddle.concat([x, h], axis=-1) + elif self.block == 'plain': + pass + + return F.dropout(h, p=self.dropout, training=self.training) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(block={self.block})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/dimenet.py b/jointContribution/mattergen/paddle_geometric/nn/models/dimenet.py new file mode 100644 index 00000000..903b1742 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/dimenet.py @@ -0,0 +1,955 @@ +import os +import os.path as osp +from functools import partial +from math import pi as PI +from math import sqrt +from typing import Callable, Dict, Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import nn +from paddle import Tensor + +from paddle_geometric.data import Dataset, download_url +from paddle_geometric.nn import radius_graph +from paddle_geometric.nn.inits import glorot_orthogonal +from paddle_geometric.nn.resolver import activation_resolver +from paddle_geometric.typing import OptTensor, SparseTensor +from paddle_geometric.utils import scatter + + +qm9_target_dict: Dict[int, str] = { + 0: 'mu', + 1: 'alpha', + 2: 'homo', + 3: 'lumo', + 5: 'r2', + 6: 'zpve', + 7: 'U0', + 8: 'U', + 9: 'H', + 10: 'G', + 11: 'Cv', +} + + +class Envelope(nn.Layer): + def __init__(self, exponent: int): + super().__init__() + self.p = exponent + 1 + self.a = -(self.p + 1) * (self.p + 2) / 2 + self.b = self.p * (self.p + 2) + self.c = -self.p * (self.p + 1) / 2 + + def forward(self, x: Tensor) -> Tensor: + p, a, b, c = self.p, self.a, self.b, self.c + x_pow_p0 = paddle.pow(x, p - 1) + x_pow_p1 = x_pow_p0 * x + x_pow_p2 = x_pow_p1 * x + return (1.0 / x + a * x_pow_p0 + b * x_pow_p1 + + c * x_pow_p2) * (x < 1.0).astype(x.dtype) + + +class BesselBasisLayer(nn.Layer): + def __init__(self, num_radial: int, cutoff: float = 5.0, + envelope_exponent: int = 5): + super().__init__() + self.cutoff = cutoff + self.envelope = Envelope(envelope_exponent) + + self.freq = self.create_parameter( + shape=[num_radial], dtype='float32', is_bias=False) + + self.reset_parameters() + + def reset_parameters(self): + paddle.assign(paddle.arange(1, self.freq.shape[0] + 1, dtype='float32') * PI, self.freq) + + def forward(self, dist: Tensor) -> Tensor: + dist = paddle.unsqueeze(dist, axis=-1) / self.cutoff + return self.envelope(dist) * paddle.sin(self.freq * dist) + + +class SphericalBasisLayer(nn.Layer): + def __init__( + self, + num_spherical: int, + num_radial: int, + cutoff: float = 5.0, + envelope_exponent: int = 5, + ): + super().__init__() + import sympy as sym + + from paddle_geometric.nn.models.dimenet_utils import ( + bessel_basis, + real_sph_harm, + ) + + assert num_radial <= 64 + self.num_spherical = num_spherical + self.num_radial = num_radial + self.cutoff = cutoff + self.envelope = Envelope(envelope_exponent) + + bessel_forms = bessel_basis(num_spherical, num_radial) + sph_harm_forms = real_sph_harm(num_spherical) + self.sph_funcs = [] + self.bessel_funcs = [] + + x, theta = sym.symbols('x theta') + modules = {'sin': paddle.sin, 'cos': paddle.cos} + for i in range(num_spherical): + if i == 0: + sph1 = sym.lambdify([theta], sph_harm_forms[i][0], modules)(0) + self.sph_funcs.append(partial(self._sph_to_tensor, sph1)) + else: + sph = sym.lambdify([theta], sph_harm_forms[i][0], modules) + self.sph_funcs.append(sph) + for j in range(num_radial): + bessel = sym.lambdify([x], bessel_forms[i][j], modules) + self.bessel_funcs.append(bessel) + + @staticmethod + def _sph_to_tensor(sph, x: Tensor) -> Tensor: + return paddle.zeros_like(x) + sph + + def forward(self, dist: Tensor, angle: Tensor, idx_kj: Tensor) -> Tensor: + dist = dist / self.cutoff + rbf = paddle.stack([f(dist) for f in self.bessel_funcs], axis=1) + rbf = self.envelope(dist).unsqueeze(-1) * rbf + + cbf = paddle.stack([f(angle) for f in self.sph_funcs], axis=1) + + n, k = self.num_spherical, self.num_radial + out = (rbf[idx_kj].reshape([-1, n, k]) * cbf.reshape([-1, n, 1])).reshape([-1, n * k]) + return out + + +class EmbeddingBlock(nn.Layer): + def __init__(self, num_radial: int, hidden_channels: int, act: Callable): + super().__init__() + self.act = act + + self.emb = nn.Embedding(95, hidden_channels) + self.lin_rbf = nn.Linear(num_radial, hidden_channels) + self.lin = nn.Linear(3 * hidden_channels, hidden_channels) + + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.Uniform(-sqrt(3), sqrt(3))(self.emb.weight) + self.lin_rbf.weight.set_value(paddle.randn(self.lin_rbf.weight.shape)) + self.lin.weight.set_value(paddle.randn(self.lin.weight.shape)) + + def forward(self, x: Tensor, rbf: Tensor, i: Tensor, j: Tensor) -> Tensor: + x = self.emb(x) + rbf = self.act(self.lin_rbf(rbf)) + return self.act(self.lin(paddle.concat([x[i], x[j], rbf], axis=-1))) + + +class ResidualLayer(nn.Layer): + def __init__(self, hidden_channels: int, act: Callable): + super().__init__() + self.act = act + self.lin1 = nn.Linear(hidden_channels, hidden_channels) + self.lin2 = nn.Linear(hidden_channels, hidden_channels) + + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.XavierUniform()(self.lin1.weight) + self.lin1.bias.set_value(paddle.zeros_like(self.lin1.bias)) + nn.initializer.XavierUniform()(self.lin2.weight) + self.lin2.bias.set_value(paddle.zeros_like(self.lin2.bias)) + + def forward(self, x: Tensor) -> Tensor: + return x + self.act(self.lin2(self.act(self.lin1(x)))) + + +class InteractionBlock(nn.Layer): + def __init__( + self, + hidden_channels: int, + num_bilinear: int, + num_spherical: int, + num_radial: int, + num_before_skip: int, + num_after_skip: int, + act: callable, + ): + super().__init__() + self.act = act + + self.lin_rbf = nn.Linear(num_radial, hidden_channels, bias_attr=False) + self.lin_sbf = nn.Linear(num_spherical * num_radial, num_bilinear, bias_attr=False) + + # Dense transformations of input messages. + self.lin_kj = nn.Linear(hidden_channels, hidden_channels) + self.lin_ji = nn.Linear(hidden_channels, hidden_channels) + + self.W = self.create_parameter( + shape=[hidden_channels, num_bilinear, hidden_channels], + default_initializer=nn.initializer.Normal(mean=0, std=2 / hidden_channels), + ) + + self.layers_before_skip = nn.LayerList( + [ResidualLayer(hidden_channels, act) for _ in range(num_before_skip)] + ) + self.lin = nn.Linear(hidden_channels, hidden_channels) + self.layers_after_skip = nn.LayerList( + [ResidualLayer(hidden_channels, act) for _ in range(num_after_skip)] + ) + + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.XavierUniform()(self.lin_rbf.weight) + nn.initializer.XavierUniform()(self.lin_sbf.weight) + nn.initializer.XavierUniform()(self.lin_kj.weight) + self.lin_kj.bias.set_value(paddle.zeros_like(self.lin_kj.bias)) + nn.initializer.XavierUniform()(self.lin_ji.weight) + self.lin_ji.bias.set_value(paddle.zeros_like(self.lin_ji.bias)) + for layer in self.layers_before_skip: + layer.reset_parameters() + nn.initializer.XavierUniform()(self.lin.weight) + self.lin.bias.set_value(paddle.zeros_like(self.lin.bias)) + for layer in self.layers_after_skip: + layer.reset_parameters() + + def forward(self, x: Tensor, rbf: Tensor, sbf: Tensor, idx_kj: Tensor, idx_ji: Tensor) -> Tensor: + rbf = self.lin_rbf(rbf) + sbf = self.lin_sbf(sbf) + + x_ji = self.act(self.lin_ji(x)) + x_kj = self.act(self.lin_kj(x)) + x_kj = x_kj * rbf + x_kj = paddle.einsum('wj,wl,ijl->wi', sbf, x_kj[idx_kj], self.W) + x_kj = scatter(x_kj, idx_ji, dim=0, dim_size=x.shape[0], reduce="sum") + + h = x_ji + x_kj + for layer in self.layers_before_skip: + h = layer(h) + h = self.act(self.lin(h)) + x + for layer in self.layers_after_skip: + h = layer(h) + + return h + + +class InteractionPPBlock(nn.Layer): + def __init__( + self, + hidden_channels: int, + int_emb_size: int, + basis_emb_size: int, + num_spherical: int, + num_radial: int, + num_before_skip: int, + num_after_skip: int, + act: callable, + ): + super().__init__() + self.act = act + + # Transformation of Bessel and spherical basis representations: + self.lin_rbf1 = nn.Linear(num_radial, basis_emb_size, bias_attr=False) + self.lin_rbf2 = nn.Linear(basis_emb_size, hidden_channels, bias_attr=False) + + self.lin_sbf1 = nn.Linear(num_spherical * num_radial, basis_emb_size, bias_attr=False) + self.lin_sbf2 = nn.Linear(basis_emb_size, int_emb_size, bias_attr=False) + + # Hidden transformation of input message: + self.lin_kj = nn.Linear(hidden_channels, hidden_channels) + self.lin_ji = nn.Linear(hidden_channels, hidden_channels) + + # Embedding projections for interaction triplets: + self.lin_down = nn.Linear(hidden_channels, int_emb_size, bias_attr=False) + self.lin_up = nn.Linear(int_emb_size, hidden_channels, bias_attr=False) + + # Residual layers before and after skip connection: + self.layers_before_skip = nn.LayerList( + [ResidualLayer(hidden_channels, act) for _ in range(num_before_skip)] + ) + self.lin = nn.Linear(hidden_channels, hidden_channels) + self.layers_after_skip = nn.LayerList( + [ResidualLayer(hidden_channels, act) for _ in range(num_after_skip)] + ) + + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.XavierUniform()(self.lin_rbf1.weight) + nn.initializer.XavierUniform()(self.lin_rbf2.weight) + nn.initializer.XavierUniform()(self.lin_sbf1.weight) + nn.initializer.XavierUniform()(self.lin_sbf2.weight) + + nn.initializer.XavierUniform()(self.lin_kj.weight) + self.lin_kj.bias.set_value(paddle.zeros_like(self.lin_kj.bias)) + nn.initializer.XavierUniform()(self.lin_ji.weight) + self.lin_ji.bias.set_value(paddle.zeros_like(self.lin_ji.bias)) + + nn.initializer.XavierUniform()(self.lin_down.weight) + nn.initializer.XavierUniform()(self.lin_up.weight) + + for layer in self.layers_before_skip: + layer.reset_parameters() + nn.initializer.XavierUniform()(self.lin.weight) + self.lin.bias.set_value(paddle.zeros_like(self.lin.bias)) + for layer in self.layers_after_skip: + layer.reset_parameters() + + def forward(self, x: Tensor, rbf: Tensor, sbf: Tensor, idx_kj: Tensor, idx_ji: Tensor) -> Tensor: + # Initial transformation: + x_ji = self.act(self.lin_ji(x)) + x_kj = self.act(self.lin_kj(x)) + + # Transformation via Bessel basis: + rbf = self.lin_rbf1(rbf) + rbf = self.lin_rbf2(rbf) + x_kj = x_kj * rbf + + # Down project embedding and generating triple-interactions: + x_kj = self.act(self.lin_down(x_kj)) + + # Transform via 2D spherical basis: + sbf = self.lin_sbf1(sbf) + sbf = self.lin_sbf2(sbf) + x_kj = x_kj[idx_kj] * sbf + + # Aggregate interactions and up-project embeddings: + x_kj = scatter(x_kj, idx_ji, dim=0, dim_size=x.shape[0], reduce="sum") + x_kj = self.act(self.lin_up(x_kj)) + + h = x_ji + x_kj + for layer in self.layers_before_skip: + h = layer(h) + h = self.act(self.lin(h)) + x + for layer in self.layers_after_skip: + h = layer(h) + + return h + +class OutputBlock(nn.Layer): + def __init__( + self, + num_radial: int, + hidden_channels: int, + out_channels: int, + num_layers: int, + act: callable, + output_initializer: str = "zeros", + ): + assert output_initializer in {"zeros", "glorot_orthogonal"} + + super().__init__() + + self.act = act + self.output_initializer = output_initializer + + self.lin_rbf = nn.Linear(num_radial, hidden_channels, bias_attr=False) + self.lins = nn.LayerList([nn.Linear(hidden_channels, hidden_channels) for _ in range(num_layers)]) + self.lin = nn.Linear(hidden_channels, out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.XavierUniform()(self.lin_rbf.weight) + for lin in self.lins: + nn.initializer.XavierUniform()(lin.weight) + lin.bias.set_value(paddle.zeros_like(lin.bias)) + if self.output_initializer == "zeros": + self.lin.weight.set_value(paddle.zeros_like(self.lin.weight)) + elif self.output_initializer == "glorot_orthogonal": + nn.initializer.XavierUniform()(self.lin.weight) + + def forward(self, x: Tensor, rbf: Tensor, i: Tensor, num_nodes: Optional[int] = None) -> Tensor: + x = self.lin_rbf(rbf) * x + x = scatter(x, i, dim=0, dim_size=num_nodes, reduce="sum") + for lin in self.lins: + x = self.act(lin(x)) + return self.lin(x) + + +class OutputPPBlock(nn.Layer): + def __init__( + self, + num_radial: int, + hidden_channels: int, + out_emb_channels: int, + out_channels: int, + num_layers: int, + act: callable, + output_initializer: str = "zeros", + ): + assert output_initializer in {"zeros", "glorot_orthogonal"} + + super().__init__() + + self.act = act + self.output_initializer = output_initializer + + self.lin_rbf = nn.Linear(num_radial, hidden_channels, bias_attr=False) + self.lin_up = nn.Linear(hidden_channels, out_emb_channels, bias_attr=False) + self.lins = nn.LayerList([nn.Linear(out_emb_channels, out_emb_channels) for _ in range(num_layers)]) + self.lin = nn.Linear(out_emb_channels, out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + nn.initializer.XavierUniform()(self.lin_rbf.weight) + nn.initializer.XavierUniform()(self.lin_up.weight) + for lin in self.lins: + nn.initializer.XavierUniform()(lin.weight) + lin.bias.set_value(paddle.zeros_like(lin.bias)) + if self.output_initializer == "zeros": + self.lin.weight.set_value(paddle.zeros_like(self.lin.weight)) + elif self.output_initializer == "glorot_orthogonal": + nn.initializer.XavierUniform()(self.lin.weight) + + def forward(self, x: Tensor, rbf: Tensor, i: Tensor, num_nodes: Optional[int] = None) -> Tensor: + x = self.lin_rbf(rbf) * x + x = scatter(x, i, dim=0, dim_size=num_nodes, reduce="sum") + x = self.lin_up(x) + for lin in self.lins: + x = self.act(lin(x)) + return self.lin(x) + + +def triplets( + edge_index: Tensor, + num_nodes: int, +) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, Tensor]: + row, col = edge_index # j->i + + value = paddle.arange(row.shape[0], dtype=row.dtype) + adj_t = SparseTensor(row=col, col=row, value=value, sparse_sizes=(num_nodes, num_nodes)) + adj_t_row = adj_t[row] + num_triplets = adj_t_row.set_value(None).sum(axis=1).astype("int64") + + # Node indices (k->j->i) for triplets. + idx_i = paddle.repeat_interleave(col, num_triplets) + idx_j = paddle.repeat_interleave(row, num_triplets) + idx_k = adj_t_row.storage_col() + mask = idx_i != idx_k # Remove i == k triplets. + idx_i, idx_j, idx_k = idx_i[mask], idx_j[mask], idx_k[mask] + + # Edge indices (k-j, j->i) for triplets. + idx_kj = adj_t_row.storage_value()[mask] + idx_ji = adj_t_row.storage_row()[mask] + + return col, row, idx_i, idx_j, idx_k, idx_kj, idx_ji + +class DimeNet(nn.Layer): + """ + The directional message passing neural network (DimeNet) from the + paper: "Directional Message Passing for Molecular Graphs" + (https://arxiv.org/abs/2003.03123). + + DimeNet transforms messages based on the angle between them in a + rotation-equivariant fashion. + + Args: + hidden_channels (int): Hidden embedding size. + out_channels (int): Size of each output sample. + num_blocks (int): Number of building blocks. + num_bilinear (int): Size of the bilinear layer tensor. + num_spherical (int): Number of spherical harmonics. + num_radial (int): Number of radial basis functions. + cutoff (float, optional): Cutoff distance for interatomic interactions. + (default: 5.0) + max_num_neighbors (int, optional): The maximum number of neighbors to + collect for each node within the `cutoff` distance. (default: 32) + envelope_exponent (int, optional): Shape of the smooth cutoff. + (default: 5) + num_before_skip (int, optional): Number of residual layers in the + interaction blocks before the skip connection. (default: 1) + num_after_skip (int, optional): Number of residual layers in the + interaction blocks after the skip connection. (default: 2) + num_output_layers (int, optional): Number of linear layers for the + output blocks. (default: 3) + act (str or Callable, optional): The activation function. + (default: "swish") + output_initializer (str, optional): The initialization method for the + output layer ("zeros", "glorot_orthogonal"). (default: "zeros") + """ + + def __init__( + self, + hidden_channels: int, + out_channels: int, + num_blocks: int, + num_bilinear: int, + num_spherical: int, + num_radial: int, + cutoff: float = 5.0, + max_num_neighbors: int = 32, + envelope_exponent: int = 5, + num_before_skip: int = 1, + num_after_skip: int = 2, + num_output_layers: int = 3, + act: Union[str, Callable] = "swish", + output_initializer: str = "zeros", + ): + super().__init__() + + if num_spherical < 2: + raise ValueError("'num_spherical' should be greater than 1") + + # Resolve the activation function + act = self._activation_resolver(act) + + self.cutoff = cutoff + self.max_num_neighbors = max_num_neighbors + self.num_blocks = num_blocks + + # Radial and spherical basis function layers + self.rbf = BesselBasisLayer(num_radial, cutoff, envelope_exponent) + self.sbf = SphericalBasisLayer( + num_spherical, num_radial, cutoff, envelope_exponent + ) + + # Embedding block + self.emb = EmbeddingBlock(num_radial, hidden_channels, act) + + # Output blocks + self.output_blocks = nn.LayerList( + [ + OutputBlock( + num_radial, + hidden_channels, + out_channels, + num_output_layers, + act, + output_initializer, + ) + for _ in range(num_blocks + 1) + ] + ) + + # Interaction blocks + self.interaction_blocks = nn.LayerList( + [ + InteractionBlock( + hidden_channels, + num_bilinear, + num_spherical, + num_radial, + num_before_skip, + num_after_skip, + act, + ) + for _ in range(num_blocks) + ] + ) + + def reset_parameters(self): + """ + Resets all learnable parameters of the module. + """ + self.rbf.reset_parameters() + self.emb.reset_parameters() + for out in self.output_blocks: + out.reset_parameters() + for interaction in self.interaction_blocks: + interaction.reset_parameters() + + @classmethod + def from_qm9_pretrained( + cls, + root: str, + dataset: Dataset, + target: int, + ) -> Tuple['DimeNet', Dataset, Dataset, Dataset]: # pragma: no cover + """ + Returns a pre-trained DimeNet model on the PaddlePaddle version of the QM9 dataset, + trained on the specified target. + + Args: + root (str): Path to save or load the pre-trained model. + dataset (Dataset): The dataset object for QM9. + target (int): The target property to train on. + + Returns: + Tuple: A pre-trained DimeNet model and split datasets (train, val, test). + """ + import paddle + import numpy as np + import os + import os.path as osp + from paddle.utils.download import get_weights_path_from_url + + assert 0 <= target <= 12 and target != 4, "Target index is invalid." + + root = osp.expanduser(osp.normpath(root)) + path = osp.join(root, 'pretrained_dimenet', qm9_target_dict[target]) + + os.makedirs(path, exist_ok=True) + url = f'{cls.url}/{qm9_target_dict[target]}' + + weights_files = [ + 'checkpoint', 'ckpt.data-00000-of-00002', 'ckpt.data-00001-of-00002', 'ckpt.index' + ] + + for file in weights_files: + if not osp.exists(osp.join(path, file)): + get_weights_path_from_url(f'{url}/{file}', osp.join(path, file)) + + path = osp.join(path, 'ckpt') + reader = paddle.static.load_program_state(path) + + model = cls( + hidden_channels=128, + out_channels=1, + num_blocks=6, + num_bilinear=8, + num_spherical=7, + num_radial=6, + cutoff=5.0, + envelope_exponent=5, + num_before_skip=1, + num_after_skip=2, + num_output_layers=3, + ) + + def copy_(dst, name, transpose=False): + """ + Copies weights from the TensorFlow checkpoint to the Paddle model. + + Args: + dst (paddle.Tensor): Destination tensor in the Paddle model. + name (str): Name of the source weight in the checkpoint. + transpose (bool, optional): Whether to transpose the weight. Defaults to False. + """ + init = np.array(reader[name]) + if transpose: + init = init.T + dst.set_value(paddle.to_tensor(init)) + + copy_(model.rbf.freq, 'rbf_layer/frequencies') + copy_(model.emb.emb.weight, 'emb_block/embeddings') + copy_(model.emb.lin_rbf.weight, 'emb_block/dense_rbf/kernel') + copy_(model.emb.lin_rbf.bias, 'emb_block/dense_rbf/bias') + copy_(model.emb.lin.weight, 'emb_block/dense/kernel') + copy_(model.emb.lin.bias, 'emb_block/dense/bias') + + for i, block in enumerate(model.output_blocks): + copy_(block.lin_rbf.weight, f'output_blocks/{i}/dense_rbf/kernel') + for j, lin in enumerate(block.lins): + copy_(lin.weight, f'output_blocks/{i}/dense_layers/{j}/kernel') + copy_(lin.bias, f'output_blocks/{i}/dense_layers/{j}/bias') + copy_(block.lin.weight, f'output_blocks/{i}/dense_final/kernel') + + for i, block in enumerate(model.interaction_blocks): + copy_(block.lin_rbf.weight, f'int_blocks/{i}/dense_rbf/kernel') + copy_(block.lin_sbf.weight, f'int_blocks/{i}/dense_sbf/kernel') + copy_(block.lin_kj.weight, f'int_blocks/{i}/dense_kj/kernel') + copy_(block.lin_kj.bias, f'int_blocks/{i}/dense_kj/bias') + copy_(block.lin_ji.weight, f'int_blocks/{i}/dense_ji/kernel') + copy_(block.lin_ji.bias, f'int_blocks/{i}/dense_ji/bias') + copy_(block.W, f'int_blocks/{i}/bilinear') + for j, layer in enumerate(block.layers_before_skip): + copy_(layer.lin1.weight, + f'int_blocks/{i}/layers_before_skip/{j}/dense_1/kernel') + copy_(layer.lin1.bias, + f'int_blocks/{i}/layers_before_skip/{j}/dense_1/bias') + copy_(layer.lin2.weight, + f'int_blocks/{i}/layers_before_skip/{j}/dense_2/kernel') + copy_(layer.lin2.bias, + f'int_blocks/{i}/layers_before_skip/{j}/dense_2/bias') + copy_(block.lin.weight, f'int_blocks/{i}/final_before_skip/kernel') + copy_(block.lin.bias, f'int_blocks/{i}/final_before_skip/bias') + for j, layer in enumerate(block.layers_after_skip): + copy_(layer.lin1.weight, + f'int_blocks/{i}/layers_after_skip/{j}/dense_1/kernel') + copy_(layer.lin1.bias, + f'int_blocks/{i}/layers_after_skip/{j}/dense_1/bias') + copy_(layer.lin2.weight, + f'int_blocks/{i}/layers_after_skip/{j}/dense_2/kernel') + copy_(layer.lin2.bias, + f'int_blocks/{i}/layers_after_skip/{j}/dense_2/bias') + + # Use the same random seed as the official DimeNet implementation. + np.random.seed(42) + perm = np.random.permutation(130831) + train_idx = paddle.to_tensor(perm[:110000], dtype='int64') + val_idx = paddle.to_tensor(perm[110000:120000], dtype='int64') + test_idx = paddle.to_tensor(perm[120000:], dtype='int64') + + return model, (dataset[train_idx], dataset[val_idx], dataset[test_idx]) + + def forward( + self, + z: Tensor, + pos: Tensor, + batch: OptTensor = None, + ) -> Tensor: + """ + Forward pass. + + Args: + z (paddle.Tensor): Atomic number of each atom with shape + [num_atoms]. + pos (paddle.Tensor): Coordinates of each atom with shape + [num_atoms, 3]. + batch (paddle.Tensor, optional): Batch indices assigning each atom + to a separate molecule with shape [num_atoms]. + Defaults to None. + """ + edge_index = radius_graph(pos, r=self.cutoff, batch=batch, + max_num_neighbors=self.max_num_neighbors) + + i, j, idx_i, idx_j, idx_k, idx_kj, idx_ji = triplets( + edge_index, num_nodes=z.shape[0]) + + # Calculate distances. + dist = paddle.sqrt(paddle.sum(paddle.square(pos[i] - pos[j]), axis=-1)) + + # Calculate angles. + if isinstance(self, DimeNetPlusPlus): + pos_jk, pos_ij = pos[idx_j] - pos[idx_k], pos[idx_i] - pos[idx_j] + a = paddle.sum(pos_ij * pos_jk, axis=-1) + b = paddle.norm(paddle.cross(pos_ij, pos_jk, axis=1), axis=-1) + elif isinstance(self, DimeNet): + pos_ji, pos_ki = pos[idx_j] - pos[idx_i], pos[idx_k] - pos[idx_i] + a = paddle.sum(pos_ji * pos_ki, axis=-1) + b = paddle.norm(paddle.cross(pos_ji, pos_ki, axis=1), axis=-1) + angle = paddle.atan2(b, a) + + rbf = self.rbf(dist) + sbf = self.sbf(dist, angle, idx_kj) + + # Embedding block. + x = self.emb(z, rbf, i, j) + P = self.output_blocks[0](x, rbf, i, num_nodes=pos.shape[0]) + + # Interaction blocks. + for interaction_block, output_block in zip(self.interaction_blocks, + self.output_blocks[1:]): + x = interaction_block(x, rbf, sbf, idx_kj, idx_ji) + P = P + output_block(x, rbf, i, num_nodes=pos.shape[0]) + + if batch is None: + return P.sum(axis=0) + else: + return scatter(P, batch, axis=0, reduce='sum') + +class DimeNetPlusPlus(DimeNet): + """ + The DimeNet++ from the `"Fast and Uncertainty-Aware + Directional Message Passing for Non-Equilibrium Molecules" + `_ paper. + + DimeNetPlusPlus is an upgrade to the DimeNet model with + 8x faster and 10% more accurate than DimeNet. + + Args: + hidden_channels (int): Hidden embedding size. + out_channels (int): Size of each output sample. + num_blocks (int): Number of building blocks. + int_emb_size (int): Size of embedding in the interaction block. + basis_emb_size (int): Size of basis embedding in the interaction block. + out_emb_channels (int): Size of embedding in the output block. + num_spherical (int): Number of spherical harmonics. + num_radial (int): Number of radial basis functions. + cutoff: (float, optional): Cutoff distance for interatomic + interactions. (default: :obj:`5.0`) + max_num_neighbors (int, optional): The maximum number of neighbors to + collect for each node within the :attr:`cutoff` distance. + (default: :obj:`32`) + envelope_exponent (int, optional): Shape of the smooth cutoff. + (default: :obj:`5`) + num_before_skip: (int, optional): Number of residual layers in the + interaction blocks before the skip connection. (default: :obj:`1`) + num_after_skip: (int, optional): Number of residual layers in the + interaction blocks after the skip connection. (default: :obj:`2`) + num_output_layers: (int, optional): Number of linear layers for the + output blocks. (default: :obj:`3`) + act: (str or Callable, optional): The activation function. + (default: :obj:`"swish"`) + output_initializer (str, optional): The initialization method for the + output layer (:obj:`"zeros"`, :obj:`"glorot_orthogonal"`). + (default: :obj:`"zeros"`) + """ + + url = ('https://raw.githubusercontent.com/gasteigerjo/dimenet/' + 'master/pretrained/dimenet_pp') + + def __init__( + self, + hidden_channels: int, + out_channels: int, + num_blocks: int, + int_emb_size: int, + basis_emb_size: int, + out_emb_channels: int, + num_spherical: int, + num_radial: int, + cutoff: float = 5.0, + max_num_neighbors: int = 32, + envelope_exponent: int = 5, + num_before_skip: int = 1, + num_after_skip: int = 2, + num_output_layers: int = 3, + act: Union[str, Callable] = 'swish', + output_initializer: str = 'zeros', + ): + act = activation_resolver(act) + + super().__init__( + hidden_channels=hidden_channels, + out_channels=out_channels, + num_blocks=num_blocks, + num_bilinear=1, + num_spherical=num_spherical, + num_radial=num_radial, + cutoff=cutoff, + max_num_neighbors=max_num_neighbors, + envelope_exponent=envelope_exponent, + num_before_skip=num_before_skip, + num_after_skip=num_after_skip, + num_output_layers=num_output_layers, + act=act, + output_initializer=output_initializer, + ) + + # Reuse RBF, SBF, and embedding layers from DimeNet. + self.output_blocks = nn.LayerList([ + OutputPPBlock( + num_radial, + hidden_channels, + out_emb_channels, + out_channels, + num_output_layers, + act, + output_initializer, + ) for _ in range(num_blocks + 1) + ]) + + self.interaction_blocks = nn.LayerList([ + InteractionPPBlock( + hidden_channels, + int_emb_size, + basis_emb_size, + num_spherical, + num_radial, + num_before_skip, + num_after_skip, + act, + ) for _ in range(num_blocks) + ]) + + self.reset_parameters() + @classmethod + def from_qm9_pretrained( + cls, + root: str, + dataset: Dataset, + target: int, + ) -> Tuple['DimeNetPlusPlus', Dataset, Dataset, Dataset]: + """ + Returns a pre-trained `DimeNetPlusPlus` model on the QM9 dataset, trained on + the specified target `target`. + """ + os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' + import tensorflow as tf + + assert target >= 0 and target <= 12 and target != 4 + + root = osp.expanduser(osp.normpath(root)) + path = osp.join(root, 'pretrained_dimenet_pp', qm9_target_dict[target]) + + os.makedirs(path, exist_ok=True) + url = f'{cls.url}/{qm9_target_dict[target]}' + + if not osp.exists(osp.join(path, 'checkpoint')): + download_url(f'{url}/checkpoint', path) + download_url(f'{url}/ckpt.data-00000-of-00002', path) + download_url(f'{url}/ckpt.data-00001-of-00002', path) + download_url(f'{url}/ckpt.index', path) + + path = osp.join(path, 'ckpt') + reader = tf.train.load_checkpoint(path) + + # Configuration from DimeNet++: + model = cls( + hidden_channels=128, + out_channels=1, + num_blocks=4, + int_emb_size=64, + basis_emb_size=8, + out_emb_channels=256, + num_spherical=7, + num_radial=6, + cutoff=5.0, + max_num_neighbors=32, + envelope_exponent=5, + num_before_skip=1, + num_after_skip=2, + num_output_layers=3, + ) + + def copy_(src, name): + init = reader.get_tensor(f'{name}/.ATTRIBUTES/VARIABLE_VALUE') + init = paddle.to_tensor(init) + if 'kernel' in name: + init = init.transpose([1, 0]) + src.set_value(init) + + copy_(model.rbf.freq, 'rbf_layer/frequencies') + copy_(model.emb.emb.weight, 'emb_block/embeddings') + copy_(model.emb.lin_rbf.weight, 'emb_block/dense_rbf/kernel') + copy_(model.emb.lin_rbf.bias, 'emb_block/dense_rbf/bias') + copy_(model.emb.lin.weight, 'emb_block/dense/kernel') + copy_(model.emb.lin.bias, 'emb_block/dense/bias') + + for i, block in enumerate(model.output_blocks): + copy_(block.lin_rbf.weight, f'output_blocks/{i}/dense_rbf/kernel') + copy_(block.lin_up.weight, f'output_blocks/{i}/up_projection/kernel') + for j, lin in enumerate(block.lins): + copy_(lin.weight, f'output_blocks/{i}/dense_layers/{j}/kernel') + copy_(lin.bias, f'output_blocks/{i}/dense_layers/{j}/bias') + copy_(block.lin.weight, f'output_blocks/{i}/dense_final/kernel') + + for i, block in enumerate(model.interaction_blocks): + copy_(block.lin_rbf1.weight, f'int_blocks/{i}/dense_rbf1/kernel') + copy_(block.lin_rbf2.weight, f'int_blocks/{i}/dense_rbf2/kernel') + copy_(block.lin_sbf1.weight, f'int_blocks/{i}/dense_sbf1/kernel') + copy_(block.lin_sbf2.weight, f'int_blocks/{i}/dense_sbf2/kernel') + copy_(block.lin_ji.weight, f'int_blocks/{i}/dense_ji/kernel') + copy_(block.lin_ji.bias, f'int_blocks/{i}/dense_ji/bias') + copy_(block.lin_kj.weight, f'int_blocks/{i}/dense_kj/kernel') + copy_(block.lin_kj.bias, f'int_blocks/{i}/dense_kj/bias') + copy_(block.lin_down.weight, f'int_blocks/{i}/down_projection/kernel') + copy_(block.lin_up.weight, f'int_blocks/{i}/up_projection/kernel') + + for j, layer in enumerate(block.layers_before_skip): + copy_(layer.lin1.weight, + f'int_blocks/{i}/layers_before_skip/{j}/dense_1/kernel') + copy_(layer.lin1.bias, + f'int_blocks/{i}/layers_before_skip/{j}/dense_1/bias') + copy_(layer.lin2.weight, + f'int_blocks/{i}/layers_before_skip/{j}/dense_2/kernel') + copy_(layer.lin2.bias, + f'int_blocks/{i}/layers_before_skip/{j}/dense_2/bias') + + copy_(block.lin.weight, f'int_blocks/{i}/final_before_skip/kernel') + copy_(block.lin.bias, f'int_blocks/{i}/final_before_skip/bias') + + for j, layer in enumerate(block.layers_after_skip): + copy_(layer.lin1.weight, + f'int_blocks/{i}/layers_after_skip/{j}/dense_1/kernel') + copy_(layer.lin1.bias, + f'int_blocks/{i}/layers_after_skip/{j}/dense_1/bias') + copy_(layer.lin2.weight, + f'int_blocks/{i}/layers_after_skip/{j}/dense_2/kernel') + copy_(layer.lin2.bias, + f'int_blocks/{i}/layers_after_skip/{j}/dense_2/bias') + + random_state = np.random.RandomState(seed=42) + perm = paddle.to_tensor(random_state.permutation(np.arange(130831)), dtype='int64') + train_idx = perm[:110000] + val_idx = perm[110000:120000] + test_idx = perm[120000:] + + return model, (dataset[train_idx], dataset[val_idx], dataset[test_idx]) \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/dimenet_utils.py b/jointContribution/mattergen/paddle_geometric/nn/models/dimenet_utils.py new file mode 100644 index 00000000..aa831848 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/dimenet_utils.py @@ -0,0 +1,138 @@ +import math +import paddle +import paddle.nn.functional as F +import paddle.nn as nn +import numpy as np +import sympy as sym +from scipy import special as sp +from scipy.optimize import brentq + + +def Jn(r, n): + return np.sqrt(np.pi / (2 * r)) * sp.jv(n + 0.5, r) + + +def Jn_zeros(n, k): + zerosj = np.zeros((n, k), dtype='float32') + zerosj[0] = np.arange(1, k + 1) * np.pi + points = np.arange(1, k + n) * np.pi + racines = np.zeros(k + n - 1, dtype='float32') + for i in range(1, n): + for j in range(k + n - 1 - i): + foo = brentq(Jn, points[j], points[j + 1], (i, )) + racines[j] = foo + points = racines + zerosj[i][:k] = racines[:k] + + return zerosj + + +def spherical_bessel_formulas(n): + x = sym.symbols('x') + + f = [sym.sin(x) / x] + a = sym.sin(x) / x + for i in range(1, n): + b = sym.diff(a, x) / x + f += [sym.simplify(b * (-x)**i)] + a = sym.simplify(b) + return f + + +def bessel_basis(n, k): + zeros = Jn_zeros(n, k) + normalizer = [] + for order in range(n): + normalizer_tmp = [] + for i in range(k): + normalizer_tmp += [0.5 * Jn(zeros[order, i], order + 1)**2] + normalizer_tmp = 1 / np.array(normalizer_tmp)**0.5 + normalizer += [normalizer_tmp] + + f = spherical_bessel_formulas(n) + x = sym.symbols('x') + bess_basis = [] + for order in range(n): + bess_basis_tmp = [] + for i in range(k): + bess_basis_tmp += [ + sym.simplify(normalizer[order][i] * + f[order].subs(x, zeros[order, i] * x)) + ] + bess_basis += [bess_basis_tmp] + return bess_basis + + +def sph_harm_prefactor(k, m): + return ((2 * k + 1) * math.factorial(k - abs(m)) / + (4 * np.pi * math.factorial(k + abs(m))))**0.5 + + +def associated_legendre_polynomials(k, zero_m_only=True): + z = sym.symbols('z') + P_l_m = [[0] * (j + 1) for j in range(k)] + + P_l_m[0][0] = 1 + if k > 0: + P_l_m[1][0] = z + + for j in range(2, k): + P_l_m[j][0] = sym.simplify(((2 * j - 1) * z * P_l_m[j - 1][0] - + (j - 1) * P_l_m[j - 2][0]) / j) + if not zero_m_only: + for i in range(1, k): + P_l_m[i][i] = sym.simplify( + (1 - 2 * i) * P_l_m[i - 1][i - 1] * (1 - z**2)**0.5) + if i + 1 < k: + P_l_m[i + 1][i] = sym.simplify( + (2 * i + 1) * z * P_l_m[i][i]) + for j in range(i + 2, k): + P_l_m[j][i] = sym.simplify( + ((2 * j - 1) * z * P_l_m[j - 1][i] - + (i + j - 1) * P_l_m[j - 2][i]) / (j - i)) + + return P_l_m + + +def real_sph_harm(k, zero_m_only=True, spherical_coordinates=True): + if not zero_m_only: + S_m = [0] + C_m = [1] + for i in range(1, k): + x = sym.symbols('x') + y = sym.symbols('y') + S_m += [x * S_m[i - 1] + y * C_m[i - 1]] + C_m += [x * C_m[i - 1] - y * S_m[i - 1]] + + P_l_m = associated_legendre_polynomials(k, zero_m_only) + if spherical_coordinates: + theta = sym.symbols('theta') + z = sym.symbols('z') + for i in range(len(P_l_m)): + for j in range(len(P_l_m[i])): + if not isinstance(P_l_m[i][j], int): + P_l_m[i][j] = P_l_m[i][j].subs(z, sym.cos(theta)) + if not zero_m_only: + phi = sym.symbols('phi') + for i in range(len(S_m)): + S_m[i] = S_m[i].subs(x, sym.sin(theta) * sym.cos(phi)).subs( + y, sym.sin(theta) * sym.sin(phi)) + for i in range(len(C_m)): + C_m[i] = C_m[i].subs(x, sym.sin(theta) * sym.cos(phi)).subs( + y, sym.sin(theta) * sym.sin(phi)) + + Y_func_l_m = [['0'] * (2 * j + 1) for j in range(k)] + for i in range(k): + Y_func_l_m[i][0] = sym.simplify(sph_harm_prefactor(i, 0) * P_l_m[i][0]) + + if not zero_m_only: + for i in range(1, k): + for j in range(1, i + 1): + Y_func_l_m[i][j] = sym.simplify( + 2**0.5 * sph_harm_prefactor(i, j) * C_m[j] * P_l_m[i][j]) + for i in range(1, k): + for j in range(1, i + 1): + Y_func_l_m[i][-j] = sym.simplify( + 2**0.5 * sph_harm_prefactor(i, -j) * S_m[j] * P_l_m[i][j]) + + return Y_func_l_m diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/g_retriever.py b/jointContribution/mattergen/paddle_geometric/nn/models/g_retriever.py new file mode 100644 index 00000000..f5b5ed79 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/g_retriever.py @@ -0,0 +1,170 @@ +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from typing import List, Optional +from paddle import Tensor + +from paddle_geometric.nn.nlp.llm import BOS, LLM, MAX_NEW_TOKENS +from paddle_geometric.utils import scatter + + +class GRetriever(nn.Layer): + r"""The G-Retriever model from the `"G-Retriever: Retrieval-Augmented + Generation for Textual Graph Understanding and Question Answering" + `_ paper. + + Args: + llm (LLM): The LLM to use. + gnn (paddle.nn.Layer): The GNN to use. + use_lora (bool, optional): If set to :obj:`True`, will use LORA from + :obj:`peft` for training the LLM, see + `here `_ for details. + (default: :obj:`False`) + mlp_out_channels (int, optional): The size of each graph embedding + after projection. (default: :obj:`4096`) + """ + + def __init__( + self, + llm: LLM, + gnn: nn.Layer, + use_lora: bool = False, + mlp_out_channels: int = 4096, + ) -> None: + super().__init__() + + self.llm = llm + self.gnn = gnn.to(self.llm.device) + + self.word_embedding = self.llm.word_embedding + self.llm_generator = self.llm.llm + if use_lora: + from peft import ( + LoraConfig, + get_peft_model, + prepare_model_for_kbit_training, + ) + self.llm_generator = prepare_model_for_kbit_training( + self.llm_generator) + lora_r: int = 8 + lora_alpha: int = 16 + lora_dropout: float = 0.05 + lora_target_modules = ['q_proj', 'v_proj'] + config = LoraConfig( + r=lora_r, + lora_alpha=lora_alpha, + target_modules=lora_target_modules, + lora_dropout=lora_dropout, + bias='none', + task_type='CAUSAL_LM', + ) + self.llm_generator = get_peft_model(self.llm_generator, config) + + mlp_hidden_channels = self.gnn.out_channels + self.projector = nn.Sequential( + nn.Linear(mlp_hidden_channels, mlp_hidden_channels), + nn.Sigmoid(), + nn.Linear(mlp_hidden_channels, mlp_out_channels), + ).to(self.llm.device) + + def encode( + self, + x: Tensor, + edge_index: Tensor, + batch: Tensor, + edge_attr: Optional[Tensor], + ) -> Tensor: + x = x.to(self.llm.device) + edge_index = edge_index.to(self.llm.device) + if edge_attr is not None: + edge_attr = edge_attr.to(self.llm.device) + batch = batch.to(self.llm.device) + + out = self.gnn(x, edge_index, edge_attr=edge_attr) + return scatter(out, batch, dim=0, reduce='mean') + + def forward( + self, + question: List[str], + x: Tensor, + edge_index: Tensor, + batch: Tensor, + label: List[str], + edge_attr: Optional[Tensor] = None, + additional_text_context: Optional[List[str]] = None, + ): + x = self.encode(x, edge_index, batch, edge_attr) + x = self.projector(x) + xs = paddle.split(x, 1, axis=0) + + # Handle questions without node features: + batch_unique = paddle.unique(batch) + batch_size = len(question) + if len(batch_unique) < batch_size: + xs = [ + xs[i] if i in batch_unique else None for i in range(batch_size) + ] + + inputs_embeds, attention_mask, label_input_ids = self.llm._get_embeds( + question, additional_text_context, xs, label) + + with self.llm.autocast_context: + outputs = self.llm_generator( + inputs_embeds=inputs_embeds, + attention_mask=attention_mask, + return_dict=True, + labels=label_input_ids, + ) + + return outputs.loss + + @paddle.no_grad() + def inference( + self, + question: List[str], + x: Tensor, + edge_index: Tensor, + batch: Tensor, + edge_attr: Optional[Tensor] = None, + additional_text_context: Optional[List[str]] = None, + max_out_tokens: Optional[int] = MAX_NEW_TOKENS, + ): + x = self.encode(x, edge_index, batch, edge_attr) + x = self.projector(x) + xs = paddle.split(x, 1, axis=0) + + # Handle questions without node features: + batch_unique = paddle.unique(batch) + batch_size = len(question) + if len(batch_unique) < batch_size: + xs = [ + xs[i] if i in batch_unique else None for i in range(batch_size) + ] + + inputs_embeds, attention_mask, _ = self.llm._get_embeds( + question, additional_text_context, xs) + + bos_token = self.llm.tokenizer( + BOS, + add_special_tokens=False, + ).input_ids[0] + + with self.llm.autocast_context: + outputs = self.llm_generator.generate( + inputs_embeds=inputs_embeds, + max_new_tokens=max_out_tokens, + attention_mask=attention_mask, + bos_token_id=bos_token, + use_cache=True # Important to set! + ) + + return self.llm.tokenizer.batch_decode( + outputs, + skip_special_tokens=True, + ) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(\n' + f' llm={self.llm},\n' + f' gnn={self.gnn},\n' + f')') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/gnnff.py b/jointContribution/mattergen/paddle_geometric/nn/models/gnnff.py new file mode 100644 index 00000000..c6edc4cf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/gnnff.py @@ -0,0 +1,213 @@ +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.nn import radius_graph +from paddle_geometric.nn.inits import reset +from paddle_geometric.nn.models.dimenet import triplets +from paddle_geometric.nn.models.schnet import ShiftedSoftplus +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import scatter + + +class GaussianFilter(nn.Layer): + def __init__(self, start=0.0, stop=5.0, num_gaussians=50): + super().__init__() + offset = paddle.linspace(start, stop, num_gaussians) + self.coeff = -0.5 / (float(offset[1]) - float(offset[0]))**2 + self.register_buffer('offset', offset) + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + pass + + def forward(self, dist: Tensor) -> Tensor: + dist = dist.view(-1, 1) - self.offset.view(1, -1) + return paddle.exp(self.coeff * dist.pow(2)) + + +class NodeBlock(nn.Layer): + def __init__(self, hidden_node_channels: int, hidden_edge_channels: int): + super().__init__() + self.lin_c1 = nn.Linear(hidden_node_channels + hidden_edge_channels, + 2 * hidden_node_channels) + + # BN was added based on previous studies. + # ref: https://github.com/txie-93/cgcnn/blob/master/cgcnn/model.py + self.bn_c1 = nn.BatchNorm1D(2 * hidden_node_channels) + self.bn = nn.BatchNorm1D(hidden_node_channels) + + def reset_parameters(self): + self.lin_c1.reset_parameters() + self.bn_c1.reset_parameters() + self.bn.reset_parameters() + + def forward(self, node_emb: Tensor, edge_emb: Tensor, i: Tensor) -> Tensor: + c1 = paddle.concat([node_emb[i], edge_emb], axis=1) + c1 = self.bn_c1(self.lin_c1(c1)) + c1_filter, c1_core = paddle.chunk(c1, 2, axis=1) + c1_filter = c1_filter.sigmoid() + c1_core = c1_core.tanh() + c1_emb = scatter(c1_filter * c1_core, i, dim=0, + dim_size=node_emb.shape[0], reduce='sum') + c1_emb = self.bn(c1_emb) + + return (node_emb + c1_emb).tanh() + + +class EdgeBlock(nn.Layer): + def __init__(self, hidden_node_channels: int, hidden_edge_channels: int): + super().__init__() + self.lin_c2 = nn.Linear(hidden_node_channels, 2 * hidden_edge_channels) + self.lin_c3 = nn.Linear( + 3 * hidden_node_channels + 2 * hidden_edge_channels, + 2 * hidden_edge_channels, + ) + + # BN was added based on previous studies. + # ref: https://github.com/txie-93/cgcnn/blob/master/cgcnn/model.py + self.bn_c2 = nn.BatchNorm1D(2 * hidden_edge_channels) + self.bn_c3 = nn.BatchNorm1D(2 * hidden_edge_channels) + self.bn_c2_2 = nn.BatchNorm1D(hidden_edge_channels) + self.bn_c3_2 = nn.BatchNorm1D(hidden_edge_channels) + + def reset_parameters(self): + self.lin_c2.reset_parameters() + self.lin_c3.reset_parameters() + self.bn_c2.reset_parameters() + self.bn_c3.reset_parameters() + self.bn_c2_2.reset_parameters() + self.bn_c3_2.reset_parameters() + + def forward( + self, + node_emb: Tensor, + edge_emb: Tensor, + i: Tensor, + j: Tensor, + idx_i: Tensor, + idx_j: Tensor, + idx_k: Tensor, + idx_ji: Tensor, + idx_kj: Tensor, + ) -> Tensor: + c2 = node_emb[i] * node_emb[j] + c2 = self.bn_c2(self.lin_c2(c2)) + c2_filter, c2_core = paddle.chunk(c2, 2, axis=1) + c2_filter = c2_filter.sigmoid() + c2_core = c2_core.tanh() + c2_emb = self.bn_c2_2(c2_filter * c2_core) + + c3 = paddle.concat([ + node_emb[idx_i], + node_emb[idx_j], + node_emb[idx_k], + edge_emb[idx_ji], + edge_emb[idx_kj], + ], axis=1) + c3 = self.bn_c3(self.lin_c3(c3)) + c3_filter, c3_core = paddle.chunk(c3, 2, axis=1) + c3_filter = c3_filter.sigmoid() + c3_core = c3_core.tanh() + c3_emb = scatter(c3_filter * c3_core, idx_ji, dim=0, + dim_size=edge_emb.shape[0], reduce='sum') + c3_emb = self.bn_c3_2(c3_emb) + + return (edge_emb + c2_emb + c3_emb).tanh() + + +class GNNFF(nn.Layer): + r"""The Graph Neural Network Force Field (GNNFF) from the + `"Accurate and scalable graph neural network force field and molecular + dynamics with direct force architecture" + `_ paper. + :class:`GNNFF` directly predicts atomic forces from automatically + extracted features of the local atomic environment that are + translationally-invariant, but rotationally-covariant to the coordinate of + the atoms. + + Args: + hidden_node_channels (int): Hidden node embedding size. + hidden_edge_channels (int): Hidden edge embedding size. + num_layers (int): Number of message passing blocks. + cutoff (float, optional): Cutoff distance for interatomic + interactions. (default: :obj:`5.0`) + max_num_neighbors (int, optional): The maximum number of neighbors to + collect for each node within the :attr:`cutoff` distance. + (default: :obj:`32`) + """ + def __init__( + self, + hidden_node_channels: int, + hidden_edge_channels: int, + num_layers: int, + cutoff: float = 5.0, + max_num_neighbors: int = 32, + ): + super().__init__() + + self.cutoff = cutoff + self.max_num_neighbors = max_num_neighbors + + self.node_emb = nn.Sequential( + Embedding(95, hidden_node_channels), + ShiftedSoftplus(), + Linear(hidden_node_channels, hidden_node_channels), + ShiftedSoftplus(), + Linear(hidden_node_channels, hidden_node_channels), + ) + self.edge_emb = GaussianFilter(0.0, 5.0, hidden_edge_channels) + + self.node_blocks = nn.LayerList([ + NodeBlock(hidden_node_channels, hidden_edge_channels) + for _ in range(num_layers) + ]) + self.edge_blocks = nn.LayerList([ + EdgeBlock(hidden_node_channels, hidden_edge_channels) + for _ in range(num_layers) + ]) + + self.force_predictor = nn.Sequential( + Linear(hidden_edge_channels, hidden_edge_channels), + ShiftedSoftplus(), + Linear(hidden_edge_channels, hidden_edge_channels), + ShiftedSoftplus(), + Linear(hidden_edge_channels, 1), + ) + + def reset_parameters(self): + reset(self.node_emb) + self.edge_emb.reset_parameters() + for node_block in self.node_blocks: + node_block.reset_parameters() + for edge_block in self.edge_blocks: + edge_block.reset_parameters() + reset(self.force_predictor) + + def forward(self, z: Tensor, pos: Tensor, + batch: OptTensor = None) -> Tensor: + """""" # noqa: D419 + edge_index = radius_graph(pos, r=self.cutoff, batch=batch, + max_num_neighbors=self.max_num_neighbors) + + i, j, idx_i, idx_j, idx_k, idx_kj, idx_ji = triplets( + edge_index, num_nodes=z.shape[0]) + + # Calculate distances and unit vector: + dist = (pos[i] - pos[j]).pow(2).sum(axis=-1).sqrt() + unit_vec = (pos[i] - pos[j]) / dist.view(-1, 1) + + # Embedding blocks: + node_emb = self.node_emb(z) + edge_emb = self.edge_emb(dist) + + # Message passing blocks: + for node_block, edge_block in zip(self.node_blocks, self.edge_blocks): + node_emb = node_block(node_emb, edge_emb, i) + edge_emb = edge_block(node_emb, edge_emb, i, j, idx_i, idx_j, + idx_k, idx_ji, idx_kj) + + # Force prediction block: + force = self.force_predictor(edge_emb) * unit_vec + + return scatter(force, i, dim=0, reduce='sum') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/graph_mixer.py b/jointContribution/mattergen/paddle_geometric/nn/models/graph_mixer.py new file mode 100644 index 00000000..7db7782b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/graph_mixer.py @@ -0,0 +1,273 @@ +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import LayerNorm, Linear + +from paddle_geometric.nn import TemporalEncoding +from paddle_geometric.utils import scatter, to_dense_batch + + +class NodeEncoder(nn.Layer): + r"""The node encoder module from the `"Do We Really Need Complicated + Model Architectures for Temporal Networks?"` + `_ paper. + :class:`NodeEncoder` captures the 1-hop temporal neighborhood information + via mean pooling. + + .. math:: + \mathbf{x}_v^{\prime}(t_0) = \mathbf{x}_v + \textrm{mean} \left\{ + \mathbf{x}_w : w \in \mathcal{N}(v, t_0 - T, t_0) \right\} + + Args: + time_window (int): The temporal window size :math:`T` to define the + 1-hop temporal neighborhood. + """ + def __init__(self, time_window: int): + super().__init__() + self.time_window = time_window + + def reset_parameters(self): + pass + + def forward( + self, + x: Tensor, + edge_index: Tensor, + edge_time: Tensor, + seed_time: Tensor, + ) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The input node features. + edge_index (paddle.Tensor): The edge indices. + edge_time (paddle.Tensor): The timestamp attached to every edge. + seed_time (paddle.Tensor): The seed time :math:`t_0` for every + destination node. + """ + mask = ((edge_time <= seed_time[edge_index[1]]) & + (edge_time > seed_time[edge_index[1]] - self.time_window)) + + src, dst = edge_index[:, mask] + mean = scatter(x[src], dst, dim=0, dim_size=x.shape[0], reduce='mean') + return x + mean + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(time_window={self.time_window})' + + +class _MLPMixer(nn.Layer): + r"""The MLP-Mixer module. + + Args: + num_tokens (int): Number of tokens/patches in each sample. + in_channels (int): Input channels. + out_channels (int): Output channels. + dropout (float, optional): Dropout probability. (default: :obj:`0.0`) + """ + def __init__( + self, + num_tokens: int, + in_channels: int, + out_channels: int, + dropout: float = 0.0, + ): + super().__init__() + + self.dropout = dropout + + self.token_norm = LayerNorm(in_channels) + self.token_lin1 = Linear(num_tokens, num_tokens // 2) + self.token_lin2 = Linear(num_tokens // 2, num_tokens) + + self.channel_norm = LayerNorm(in_channels) + self.channel_lin1 = Linear(in_channels, 4 * in_channels) + self.channel_lin2 = Linear(4 * in_channels, in_channels) + + self.head_norm = LayerNorm(in_channels) + self.head_lin = Linear(in_channels, out_channels) + + def reset_parameters(self): + self.token_norm.reset_parameters() + self.token_lin1.reset_parameters() + self.token_lin2.reset_parameters() + self.channel_norm.reset_parameters() + self.channel_lin1.reset_parameters() + self.channel_lin2.reset_parameters() + self.head_norm.reset_parameters() + self.head_lin.reset_parameters() + + def forward(self, x: Tensor) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): Tensor of size + :obj:`[*, num_tokens, in_channels]`. + + Returns: + Tensor of size :obj:`[*, out_channels]`. + """ + # Token mixing: + h = self.token_norm(x).T + h = self.token_lin1(h) + h = F.gelu(h) + h = F.dropout(h, p=self.dropout, training=self.training) + h = self.token_lin2(h) + h = F.dropout(h, p=self.dropout, training=self.training) + h_token = h.T + x + + # Channel mixing: + h = self.channel_norm(h_token) + h = self.channel_lin1(h) + h = F.gelu(h) + h = F.dropout(h, p=self.dropout, training=self.training) + h = self.channel_lin2(h) + h = F.dropout(h, p=self.dropout, training=self.training) + h_channel = h + h_token + + # Head: + out = self.head_norm(h_channel) + out = out.mean(axis=1) + out = self.head_lin(out) + return out + + +def get_latest_k_edge_attr( + k: int, + edge_index: Tensor, + edge_attr: Tensor, + edge_time: Tensor, + num_nodes: int, + is_sorted: bool = False, +) -> Tensor: + r"""Returns the latest :obj:`k` incoming edge attributes by + :obj:`edge_time` for each node. + The shape of the output tensor is :obj:`[num_nodes, k, edge_attr_dim]`. + Nodes with fewer than :obj:`k` incoming edges are zero-padded. + """ + _, col = edge_index + + if not is_sorted: + perm = np.lexsort([edge_time.detach().cpu().numpy(), col.detach().cpu().numpy()]) + perm = paddle.to_tensor(perm).to(edge_index.device) + col = col[perm] + edge_attr = edge_attr[perm] + + return to_dense_batch( + edge_attr, + col, + max_num_nodes=k, + batch_size=num_nodes, + )[0] + + +class LinkEncoder(nn.Layer): + r"""The link encoder module from the `"Do We Really Need Complicated + Model Architectures for Temporal Networks?"` + `_ paper. + It is composed of two components: (1) :class:`TemporalEncoding` maps each + edge timestamp to a :obj:`time_channels`-dimensional vector; (2) an MLP + that groups and maps the :math:`k`-latest encoded timestamps and edge + features to a :obj:`out_channels`-dimensional representation. + + Args: + k (int): The number of most recent temporal links to use. + in_channels (int): The edge feature dimensionality. + hidden_channels (int): Size of each hidden sample. + time_channels (int): Size of encoded timestamp. + out_channels (int): Size of each output sample. + is_sorted (bool, optional): If set to :obj:`True`, assumes that + :obj:`edge_index` is sorted by column and the + rows are sorted according to :obj:`edge_time` + within individual neighborhoods. This avoids internal + re-sorting of the data and can improve runtime and memory + efficiency. (default: :obj:`False`) + dropout (float, optional): Dropout probability of the MLP layer. + (default: :obj:`0.0`) + """ + def __init__( + self, + k: int, + in_channels: int, + hidden_channels: int, + out_channels: int, + time_channels: int, + is_sorted: bool = False, + dropout: float = 0.0, + ): + super().__init__() + + self.k = k + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.time_channels = time_channels + self.is_sorted = is_sorted + self.dropout = dropout + + self.temporal_encoder = TemporalEncoding(time_channels) + self.temporal_head = Linear(time_channels + in_channels, + hidden_channels) + + self.mlp_mixer = _MLPMixer( # MLP that summarizes temporal embeddings: + num_tokens=k, + in_channels=hidden_channels, + out_channels=out_channels, + dropout=dropout, + ) + + def reset_parameters(self): + self.temporal_encoder.reset_parameters() + self.temporal_head.reset_parameters() + self.mlp_mixer.reset_parameters() + + def forward( + self, + edge_index: Tensor, + edge_attr: Tensor, + edge_time: Tensor, + seed_time: Tensor, + ) -> Tensor: + r"""Forward pass. + + Args: + edge_index (paddle.Tensor): The edge indices. + edge_attr (paddle.Tensor): The edge features of shape + :obj:`[num_edges, in_channels]`. + edge_time (paddle.Tensor): The time tensor of shape + :obj:`[num_edges]`. This can be in the order of millions. + seed_time (paddle.Tensor): The seed time :math:`t_0` for every + destination node. + + Returns: + A node embedding tensor of shape :obj:`[num_nodes, out_channels]`. + """ + mask = edge_time <= seed_time[edge_index[1]] + + edge_index = edge_index[:, mask] + edge_attr = edge_attr[mask] + edge_time = edge_time[mask] + + time_enc = self.temporal_encoder(seed_time[edge_index[1]] - edge_time) + edge_attr = paddle.concat([time_enc, edge_attr], axis=-1) + edge_attr = self.temporal_head(edge_attr) + + edge_attr = get_latest_k_edge_attr( + k=self.k, + edge_index=edge_index, + edge_attr=edge_attr, + edge_time=edge_time, + num_nodes=seed_time.shape[0], + is_sorted=self.is_sorted, + ) + + return self.mlp_mixer(edge_attr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(k={self.k}, ' + f'in_channels={self.in_channels}, ' + f'hidden_channels={self.hidden_channels}, ' + f'out_channels={self.out_channels}, ' + f'time_channels={self.time_channels}, ' + f'dropout={self.dropout})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/graph_unet.py b/jointContribution/mattergen/paddle_geometric/nn/models/graph_unet.py new file mode 100644 index 00000000..ad5d9254 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/graph_unet.py @@ -0,0 +1,154 @@ +from typing import List, Union, Callable + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.nn import GCNConv, TopKPooling +from paddle_geometric.nn.resolver import activation_resolver +from paddle_geometric.typing import OptTensor, PairTensor +from paddle_geometric.utils import ( + add_self_loops, + remove_self_loops, + to_paddle_csr_tensor, +) +from paddle_geometric.utils.repeat import repeat + + +class GraphUNet(nn.Layer): + r"""The Graph U-Net model from the `"Graph U-Nets" + `_ paper which implements a U-Net like + architecture with graph pooling and unpooling operations. + + Args: + in_channels (int): Size of each input sample. + hidden_channels (int): Size of each hidden sample. + out_channels (int): Size of each output sample. + depth (int): The depth of the U-Net architecture. + pool_ratios (float or [float], optional): Graph pooling ratio for each + depth. (default: :obj:`0.5`) + sum_res (bool, optional): If set to :obj:`False`, will use + concatenation for integration of skip connections instead + summation. (default: :obj:`True`) + act (paddle.nn.functional, optional): The nonlinearity to use. + (default: :obj:`paddle.nn.functional.relu`) + """ + def __init__( + self, + in_channels: int, + hidden_channels: int, + out_channels: int, + depth: int, + pool_ratios: Union[float, List[float]] = 0.5, + sum_res: bool = True, + act: Union[str, Callable] = 'relu', + ): + super().__init__() + assert depth >= 1 + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.depth = depth + self.pool_ratios = repeat(pool_ratios, depth) + self.act = activation_resolver(act) + self.sum_res = sum_res + + channels = hidden_channels + + self.down_convs = nn.LayerList() + self.pools = nn.LayerList() + self.down_convs.append(GCNConv(in_channels, channels, improved=True)) + for i in range(depth): + self.pools.append(TopKPooling(channels, self.pool_ratios[i])) + self.down_convs.append(GCNConv(channels, channels, improved=True)) + + in_channels = channels if sum_res else 2 * channels + + self.up_convs = nn.LayerList() + for i in range(depth - 1): + self.up_convs.append(GCNConv(in_channels, channels, improved=True)) + self.up_convs.append(GCNConv(in_channels, out_channels, improved=True)) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for conv in self.down_convs: + conv.reset_parameters() + for pool in self.pools: + pool.reset_parameters() + for conv in self.up_convs: + conv.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Tensor, + batch: OptTensor = None, + edge_weight: Tensor = None, + ) -> Tensor: + """""" # noqa: D419 + if batch is None: + batch = edge_index.new_zeros(x.shape[0]) + + if edge_weight is None: + edge_weight = x.new_ones(edge_index.shape[1]) + assert edge_weight.ndim == 1 + assert edge_weight.shape[0] == edge_index.shape[1] + + x = self.down_convs[0](x, edge_index, edge_weight) + x = self.act(x) + + xs = [x] + edge_indices = [edge_index] + edge_weights = [edge_weight] + perms = [] + + for i in range(1, self.depth + 1): + edge_index, edge_weight = self.augment_adj(edge_index, edge_weight, + x.shape[0]) + x, edge_index, edge_weight, batch, perm, _ = self.pools[i - 1]( + x, edge_index, edge_weight, batch) + + x = self.down_convs[i](x, edge_index, edge_weight) + x = self.act(x) + + if i < self.depth: + xs += [x] + edge_indices += [edge_index] + edge_weights += [edge_weight] + perms += [perm] + + for i in range(self.depth): + j = self.depth - 1 - i + + res = xs[j] + edge_index = edge_indices[j] + edge_weight = edge_weights[j] + perm = perms[j] + + up = paddle.zeros_like(res) + up[perm] = x + x = res + up if self.sum_res else paddle.concat((res, up), axis=-1) + + x = self.up_convs[i](x, edge_index, edge_weight) + x = self.act(x) if i < self.depth - 1 else x + + return x + + def augment_adj(self, edge_index: Tensor, edge_weight: Tensor, + num_nodes: int) -> PairTensor: + edge_index, edge_weight = remove_self_loops(edge_index, edge_weight) + edge_index, edge_weight = add_self_loops(edge_index, edge_weight, + num_nodes=num_nodes) + adj = to_paddle_csr_tensor(edge_index, edge_weight, + size=(num_nodes, num_nodes)) + adj = (adj @ adj).to_sparse_coo() + edge_index, edge_weight = adj.indices(), adj.values() + edge_index, edge_weight = remove_self_loops(edge_index, edge_weight) + return edge_index, edge_weight + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.hidden_channels}, {self.out_channels}, ' + f'depth={self.depth}, pool_ratios={self.pool_ratios})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/jumping_knowledge.py b/jointContribution/mattergen/paddle_geometric/nn/models/jumping_knowledge.py new file mode 100644 index 00000000..e483549a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/jumping_knowledge.py @@ -0,0 +1,157 @@ +from typing import Optional, List, Dict + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import LSTM, Linear + + +class JumpingKnowledge(nn.Layer): + r"""The Jumping Knowledge layer aggregation module from the + `"Representation Learning on Graphs with Jumping Knowledge Networks" + `_ paper. + + Jumping knowledge is performed based on either **concatenation** + (:obj:`"cat"`) + + .. math:: + + \mathbf{x}_v^{(1)} \, \Vert \, \ldots \, \Vert \, \mathbf{x}_v^{(T)}, + + **max pooling** (:obj:`"max"`) + + .. math:: + + \max \left( \mathbf{x}_v^{(1)}, \ldots, \mathbf{x}_v^{(T)} \right), + + or **weighted summation** + + .. math:: + + \sum_{t=1}^T \alpha_v^{(t)} \mathbf{x}_v^{(t)} + + with attention scores :math:`\alpha_v^{(t)}` obtained from a bi-directional + LSTM (:obj:`"lstm"`). + + Args: + mode (str): The aggregation scheme to use + (:obj:`"cat"`, :obj:`"max"` or :obj:`"lstm"`). + channels (int, optional): The number of channels per representation. + Needs to be only set for LSTM-style aggregation. + (default: :obj:`None`) + num_layers (int, optional): The number of layers to aggregate. Needs to + be only set for LSTM-style aggregation. (default: :obj:`None`) + """ + def __init__( + self, + mode: str, + channels: Optional[int] = None, + num_layers: Optional[int] = None, + ) -> None: + super().__init__() + self.mode = mode.lower() + assert self.mode in ['cat', 'max', 'lstm'] + + if mode == 'lstm': + assert channels is not None, 'channels cannot be None for lstm' + assert num_layers is not None, 'num_layers cannot be None for lstm' + self.lstm = LSTM(channels, (num_layers * channels) // 2, + bidirectional=True, batch_first=True) + self.att = Linear(2 * ((num_layers * channels) // 2), 1) + self.channels = channels + self.num_layers = num_layers + else: + self.lstm = None + self.att = None + self.channels = None + self.num_layers = None + + self.reset_parameters() + + def reset_parameters(self) -> None: + r"""Resets all learnable parameters of the module.""" + if self.lstm is not None: + self.lstm.reset_parameters() + if self.att is not None: + self.att.reset_parameters() + + def forward(self, xs: List[Tensor]) -> Tensor: + r"""Forward pass. + + Args: + xs (List[paddle.Tensor]): List containing the layer-wise + representations. + """ + if self.mode == 'cat': + return paddle.concat(xs, axis=-1) + elif self.mode == 'max': + return paddle.stack(xs, axis=-1).max(axis=-1)[0] + else: # self.mode == 'lstm' + assert self.lstm is not None and self.att is not None + x = paddle.stack(xs, axis=1) # [num_nodes, num_layers, num_channels] + alpha, _ = self.lstm(x) + alpha = self.att(alpha).squeeze(-1) # [num_nodes, num_layers] + alpha = paddle.nn.functional.softmax(alpha, axis=-1) + return (x * alpha.unsqueeze(-1)).sum(axis=1) + + def __repr__(self) -> str: + if self.mode == 'lstm': + return (f'{self.__class__.__name__}({self.mode}, ' + f'channels={self.channels}, layers={self.num_layers})') + return f'{self.__class__.__name__}({self.mode})' + + +class HeteroJumpingKnowledge(nn.Layer): + r"""A heterogeneous version of the :class:`JumpingKnowledge` module. + + Args: + types (List[str]): The keys of the input dictionary. + mode (str): The aggregation scheme to use + (:obj:`"cat"`, :obj:`"max"` or :obj:`"lstm"`). + channels (int, optional): The number of channels per representation. + Needs to be only set for LSTM-style aggregation. + (default: :obj:`None`) + num_layers (int, optional): The number of layers to aggregate. Needs to + be only set for LSTM-style aggregation. (default: :obj:`None`) + """ + def __init__( + self, + types: List[str], + mode: str, + channels: Optional[int] = None, + num_layers: Optional[int] = None, + ) -> None: + super().__init__() + + self.mode = mode.lower() + + self.jk_dict = nn.LayerDict({ + key: + JumpingKnowledge(mode, channels, num_layers) + for key in types + }) + + def reset_parameters(self) -> None: + r"""Resets all learnable parameters of the module.""" + for jk in self.jk_dict.values(): + jk.reset_parameters() + + def forward(self, xs_dict: Dict[str, List[Tensor]]) -> Dict[str, Tensor]: + r"""Forward pass. + + Args: + xs_dict (Dict[str, List[paddle.Tensor]]): A dictionary holding a + list of layer-wise representation for each type. + """ + return {key: jk(xs_dict[key]) for key, jk in self.jk_dict.items()} + + def __repr__(self): + if self.mode == 'lstm': + jk = next(iter(self.jk_dict.values())) + return (f'{self.__class__.__name__}(' + f'num_types={len(self.jk_dict)}, ' + f'mode={self.mode}, channels={jk.channels}, ' + f'layers={jk.num_layers})') + return (f'{self.__class__.__name__}(num_types={len(self.jk_dict)}, ' + f'mode={self.mode})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/label_prop.py b/jointContribution/mattergen/paddle_geometric/nn/models/label_prop.py new file mode 100644 index 00000000..1dae19c1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/label_prop.py @@ -0,0 +1,104 @@ +from typing import Callable, Optional + +import paddle +import paddle.nn as nn +from paddle import Tensor +from paddle.nn import functional as F + +from paddle_geometric.nn import MessagePassing +from paddle_geometric.nn.conv.gcn_conv import gcn_norm +from paddle_geometric.typing import Adj, OptTensor, SparseTensor +from paddle_geometric.utils import one_hot, spmm + + +class LabelPropagation(MessagePassing): + r"""The label propagation operator, firstly introduced in the + `"Learning from Labeled and Unlabeled Data with Label Propagation" + `_ paper. + + .. math:: + \mathbf{Y}^{\prime} = \alpha \cdot \mathbf{D}^{-1/2} \mathbf{A} + \mathbf{D}^{-1/2} \mathbf{Y} + (1 - \alpha) \mathbf{Y}, + + where unlabeled data is inferred by labeled data via propagation. + This concrete implementation here is derived from the `"Combining Label + Propagation And Simple Models Out-performs Graph Neural Networks" + `_ paper. + + .. note:: + + For an example of using the :class:`LabelPropagation`, see + `examples/label_prop.py + `_. + + Args: + num_layers (int): The number of propagations. + alpha (float): The :math:`\alpha` coefficient. + """ + def __init__(self, num_layers: int, alpha: float): + super().__init__(aggr='add') + self.num_layers = num_layers + self.alpha = alpha + + @paddle.no_grad() + def forward( + self, + y: Tensor, + edge_index: Adj, + mask: OptTensor = None, + edge_weight: OptTensor = None, + post_step: Optional[Callable[[Tensor], Tensor]] = None, + ) -> Tensor: + r"""Forward pass. + + Args: + y (paddle.Tensor): The ground-truth label information + :math:`\mathbf{Y}`. + edge_index (paddle.Tensor or SparseTensor): The edge connectivity. + mask (paddle.Tensor, optional): A mask or index tensor denoting + which nodes are used for label propagation. + (default: :obj:`None`) + edge_weight (paddle.Tensor, optional): The edge weights. + (default: :obj:`None`) + post_step (callable, optional): A post step function specified + to apply after label propagation. If no post step function + is specified, the output will be clamped between 0 and 1. + (default: :obj:`None`) + """ + if y.dtype == paddle.int64 and y.shape[0] == y.numel(): + y = one_hot(y.reshape([-1])) + + out = y + if mask is not None: + out = paddle.zeros_like(y) + out[mask] = y[mask] + + if isinstance(edge_index, SparseTensor) and not edge_index.has_value(): + edge_index = gcn_norm(edge_index, add_self_loops=False) + elif isinstance(edge_index, Tensor) and edge_weight is None: + edge_index, edge_weight = gcn_norm(edge_index, num_nodes=y.shape[0], + add_self_loops=False) + + res = (1 - self.alpha) * out + for _ in range(self.num_layers): + # propagate_type: (x: Tensor, edge_weight: OptTensor) + out = self.propagate(edge_index, x=out, edge_weight=edge_weight) + out *= self.alpha + out.add_(res) + if post_step is not None: + out = post_step(out) + else: + out = paddle.clip(out, min=0., max=1.) + + return out + + def message(self, x_j: Tensor, edge_weight: OptTensor) -> Tensor: + return x_j if edge_weight is None else edge_weight.reshape([-1, 1]) * x_j + + def message_and_aggregate(self, adj_t: SparseTensor, x: Tensor) -> Tensor: + return spmm(adj_t, x, reduce=self.aggr) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_layers={self.num_layers}, ' + f'alpha={self.alpha})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/lightgcn.py b/jointContribution/mattergen/paddle_geometric/nn/models/lightgcn.py new file mode 100644 index 00000000..f0a771c8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/lightgcn.py @@ -0,0 +1,239 @@ +from typing import Optional, Union + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Embedding, LayerList, Linear + +from paddle_geometric.nn.conv import LGConv +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import is_sparse, to_edge_index + +class _Loss(nn.Layer): + def __init__(self, size_average=None, reduce=None, reduction: str = 'mean') -> None: + super().__init__() + if size_average is not None or reduce is not None: + self.reduction = self._legacy_get_string(size_average, reduce) + else: + self.reduction = reduction + + @staticmethod + def _legacy_get_string(size_average, reduce): + if size_average is not None and reduce is not None: + if size_average and reduce: + return 'mean' + elif not size_average and reduce: + return 'sum' + elif not reduce: + return 'none' + raise ValueError("Invalid combination of 'size_average' and 'reduce'.") + +class LightGCN(nn.Layer): + r"""The LightGCN model from the `"LightGCN: Simplifying and Powering + Graph Convolution Network for Recommendation" + `_ paper. + + :class:`~paddle_geometric.nn.models.LightGCN` learns embeddings by linearly + propagating them on the underlying graph, and uses the weighted sum of the + embeddings learned at all layers as the final embedding + + .. math:: + \textbf{x}_i = \sum_{l=0}^{L} \alpha_l \textbf{x}^{(l)}_i, + + where each layer's embedding is computed as + + .. math:: + \mathbf{x}^{(l+1)}_i = \sum_{j \in \mathcal{N}(i)} + \frac{1}{\sqrt{\deg(i)\deg(j)}}\mathbf{x}^{(l)}_j. + + Two prediction heads and training objectives are provided: + **link prediction** (via + :meth:`~paddle_geometric.nn.models.LightGCN.link_pred_loss` and + :meth:`~paddle_geometric.nn.models.LightGCN.predict_link`) and + **recommendation** (via + :meth:`~paddle_geometric.nn.models.LightGCN.recommendation_loss` and + :meth:`~paddle_geometric.nn.models.LightGCN.recommend`). + + .. note:: + + Embeddings are propagated according to the graph connectivity specified + by :obj:`edge_index` while rankings or link probabilities are computed + according to the edges specified by :obj:`edge_label_index`. + + Args: + num_nodes (int): The number of nodes in the graph. + embedding_dim (int): The dimensionality of node embeddings. + num_layers (int): The number of + :class:`~paddle_geometric.nn.conv.LGConv` layers. + alpha (float or paddle.Tensor, optional): The scalar or vector + specifying the re-weighting coefficients for aggregating the final + embedding. If set to :obj:`None`, the uniform initialization of + :obj:`1 / (num_layers + 1)` is used. (default: :obj:`None`) + **kwargs (optional): Additional arguments of the underlying + :class:`~paddle_geometric.nn.conv.LGConv` layers. + """ + def __init__( + self, + num_nodes: int, + embedding_dim: int, + num_layers: int, + alpha: Optional[Union[float, Tensor]] = None, + **kwargs, + ): + super().__init__() + + self.num_nodes = num_nodes + self.embedding_dim = embedding_dim + self.num_layers = num_layers + + if alpha is None: + alpha = 1. / (num_layers + 1) + + if isinstance(alpha, Tensor): + assert alpha.shape[0] == num_layers + 1 + else: + alpha = paddle.full([num_layers + 1], alpha, dtype=paddle.float32) + self.alpha = self.create_parameter(shape=alpha.shape, default_initializer=paddle.nn.initializer.Assign(alpha)) + + self.embedding = Embedding(num_nodes, embedding_dim) + self.convs = LayerList([LGConv(**kwargs) for _ in range(num_layers)]) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + paddle.nn.initializer.XavierUniform()(self.embedding.weight) + for conv in self.convs: + conv.reset_parameters() + + def get_embedding( + self, + edge_index: Adj, + edge_weight: OptTensor = None, + ) -> Tensor: + r"""Returns the embedding of nodes in the graph.""" + x = self.embedding.weight + out = x * self.alpha[0] + + for i in range(self.num_layers): + x = self.convs[i](x, edge_index, edge_weight) + out = out + x * self.alpha[i + 1] + + return out + + def forward( + self, + edge_index: Adj, + edge_label_index: OptTensor = None, + edge_weight: OptTensor = None, + ) -> Tensor: + r"""Computes rankings for pairs of nodes. + + Args: + edge_index (paddle.Tensor or SparseTensor): Edge tensor specifying + the connectivity of the graph. + edge_label_index (paddle.Tensor, optional): Edge tensor specifying + the node pairs for which to compute rankings or probabilities. + If :obj:`edge_label_index` is set to :obj:`None`, all edges in + :obj:`edge_index` will be used instead. (default: :obj:`None`) + edge_weight (paddle.Tensor, optional): The weight of each edge in + :obj:`edge_index`. (default: :obj:`None`) + """ + if edge_label_index is None: + if is_sparse(edge_index): + edge_label_index, _ = to_edge_index(edge_index) + else: + edge_label_index = edge_index + + out = self.get_embedding(edge_index, edge_weight) + + out_src = out[edge_label_index[0]] + out_dst = out[edge_label_index[1]] + + return (out_src * out_dst).sum(axis=-1) + + def predict_link( + self, + edge_index: Adj, + edge_label_index: OptTensor = None, + edge_weight: OptTensor = None, + prob: bool = False, + ) -> Tensor: + r"""Predict links between nodes specified in :obj:`edge_label_index`.""" + + pred = self(edge_index, edge_label_index, edge_weight).sigmoid() + return pred if prob else pred.round() + + def recommend( + self, + edge_index: Adj, + edge_weight: OptTensor = None, + src_index: OptTensor = None, + dst_index: OptTensor = None, + k: int = 1, + sorted: bool = True, + ) -> Tensor: + r"""Get top-:math:`k` recommendations for nodes in :obj:`src_index`.""" + + out_src = out_dst = self.get_embedding(edge_index, edge_weight) + + if src_index is not None: + out_src = out_src[src_index] + + if dst_index is not None: + out_dst = out_dst[dst_index] + + pred = paddle.matmul(out_src, out_dst.t()) + top_index = pred.topk(k, axis=-1, sorted=sorted).indices + + if dst_index is not None: # Map local top-indices to original indices. + top_index = dst_index[top_index.reshape([-1])].reshape(top_index.shape) + + return top_index + + def link_pred_loss(self, pred: Tensor, edge_label: Tensor, **kwargs) -> Tensor: + r"""Computes the model loss for a link prediction objective.""" + + loss_fn = paddle.nn.BCEWithLogitsLoss(**kwargs) + return loss_fn(pred, edge_label.astype(pred.dtype)) + + def recommendation_loss( + self, + pos_edge_rank: Tensor, + neg_edge_rank: Tensor, + node_id: Optional[Tensor] = None, + lambda_reg: float = 1e-4, + **kwargs, + ) -> Tensor: + r"""Computes the model loss for a ranking objective via the Bayesian + Personalized Ranking (BPR) loss. + """ + loss_fn = BPRLoss(lambda_reg, **kwargs) + emb = self.embedding.weight + emb = emb if node_id is None else emb[node_id] + return loss_fn(pos_edge_rank, neg_edge_rank, emb) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.num_nodes}, ' + f'{self.embedding_dim}, num_layers={self.num_layers})') + + +class BPRLoss(_Loss): + r"""The Bayesian Personalized Ranking (BPR) loss.""" + + def __init__(self, lambda_reg: float = 0, **kwargs): + super().__init__(None, None, "sum", **kwargs) + self.lambda_reg = lambda_reg + + def forward(self, positives: Tensor, negatives: Tensor, + parameters: Tensor = None) -> Tensor: + r"""Compute the mean Bayesian Personalized Ranking (BPR) loss.""" + log_prob = F.logsigmoid(positives - negatives).mean() + + regularization = 0 + if self.lambda_reg != 0: + regularization = self.lambda_reg * parameters.norm(p=2).pow(2) + regularization = regularization / positives.shape[0] + + return -log_prob + regularization diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/linkx.py b/jointContribution/mattergen/paddle_geometric/nn/models/linkx.py new file mode 100644 index 00000000..e8682f87 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/linkx.py @@ -0,0 +1,132 @@ +import math +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import BatchNorm1D, Linear + +from paddle_geometric.nn import inits +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.models import MLP +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import spmm + + +class SparseLinear(MessagePassing): + def __init__(self, in_channels: int, out_channels: int, bias: bool = True): + super().__init__(aggr='add') + self.in_channels = in_channels + self.out_channels = out_channels + + self.weight = nn.Parameter(paddle.empty([in_channels, out_channels])) + if bias: + self.bias = nn.Parameter(paddle.empty([out_channels])) + else: + self.register_parameter('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + inits.kaiming_uniform(self.weight, fan=self.in_channels, a=math.sqrt(5)) + inits.uniform(self.in_channels, self.bias) + + def forward( + self, + edge_index: Adj, + edge_weight: OptTensor = None, + ) -> Tensor: + out = self.propagate(edge_index, weight=self.weight, edge_weight=edge_weight) + + if self.bias is not None: + out = out + self.bias + + return out + + def message(self, weight_j: Tensor, edge_weight: OptTensor) -> Tensor: + if edge_weight is None: + return weight_j + else: + return edge_weight.view([-1, 1]) * weight_j + + def message_and_aggregate(self, adj_t: Adj, weight: Tensor) -> Tensor: + return spmm(adj_t, weight, reduce=self.aggr) + + +class LINKX(nn.Layer): + def __init__( + self, + num_nodes: int, + in_channels: int, + hidden_channels: int, + out_channels: int, + num_layers: int, + num_edge_layers: int = 1, + num_node_layers: int = 1, + dropout: float = 0.0, + ): + super().__init__() + + self.num_nodes = num_nodes + self.in_channels = in_channels + self.out_channels = out_channels + self.num_edge_layers = num_edge_layers + + self.edge_lin = SparseLinear(num_nodes, hidden_channels) + + if self.num_edge_layers > 1: + self.edge_norm = BatchNorm1D(hidden_channels) + channels = [hidden_channels] * num_edge_layers + self.edge_mlp = MLP(channels, dropout=0., act_first=True) + else: + self.edge_norm = None + self.edge_mlp = None + + channels = [in_channels] + [hidden_channels] * num_node_layers + self.node_mlp = MLP(channels, dropout=0., act_first=True) + + self.cat_lin1 = Linear(hidden_channels, hidden_channels) + self.cat_lin2 = Linear(hidden_channels, hidden_channels) + + channels = [hidden_channels] * num_layers + [out_channels] + self.final_mlp = MLP(channels, dropout=dropout, act_first=True) + + self.reset_parameters() + + def reset_parameters(self): + self.edge_lin.reset_parameters() + if self.edge_norm is not None: + self.edge_norm.reset_parameters() + if self.edge_mlp is not None: + self.edge_mlp.reset_parameters() + self.node_mlp.reset_parameters() + self.cat_lin1.reset_parameters() + self.cat_lin2.reset_parameters() + self.final_mlp.reset_parameters() + + def forward( + self, + x: OptTensor, + edge_index: Adj, + edge_weight: OptTensor = None, + ) -> Tensor: + out = self.edge_lin(edge_index, edge_weight) + + if self.edge_norm is not None and self.edge_mlp is not None: + out = F.relu(out) + out = self.edge_norm(out) + out = self.edge_mlp(out) + + out = out + self.cat_lin1(out) + + if x is not None: + x = self.node_mlp(x) + out = out + x + out = out + self.cat_lin2(x) + + return self.final_mlp(F.relu(out)) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_nodes={self.num_nodes}, ' + f'in_channels={self.in_channels}, ' + f'out_channels={self.out_channels})') + diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/mask_label.py b/jointContribution/mattergen/paddle_geometric/nn/models/mask_label.py new file mode 100644 index 00000000..5f0add5c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/mask_label.py @@ -0,0 +1,72 @@ +import paddle +import paddle.nn as nn +from paddle import Tensor + + +class MaskLabel(nn.Layer): + r"""The label embedding and masking layer from the `"Masked Label + Prediction: Unified Message Passing Model for Semi-Supervised + Classification" `_ paper. + + Here, node labels :obj:`y` are merged to the initial node features :obj:`x` + for a subset of their nodes according to :obj:`mask`. + + .. note:: + + For an example of using :class:`MaskLabel`, see + `examples/unimp_arxiv.py `_. + + + Args: + num_classes (int): The number of classes. + out_channels (int): Size of each output sample. + method (str, optional): If set to :obj:`"add"`, label embeddings are + added to the input. If set to :obj:`"concat"`, label embeddings are + concatenated. In case :obj:`method="add"`, then :obj:`out_channels` + needs to be identical to the input dimensionality of node features. + (default: :obj:`"add"`) + """ + def __init__(self, num_classes: int, out_channels: int, + method: str = "add"): + super().__init__() + + self.method = method + if method not in ["add", "concat"]: + raise ValueError( + f"'method' must be either 'add' or 'concat' (got '{method}')") + + self.emb = nn.Embedding(num_classes, out_channels) + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.emb.reset_parameters() + + def forward(self, x: Tensor, y: Tensor, mask: Tensor) -> Tensor: + """""" # noqa: D419 + if self.method == "concat": + out = paddle.zeros([y.shape[0], self.emb.weight.shape[-1]], dtype='float32') + out[mask] = self.emb(y[mask]) + return paddle.concat([x, out], axis=-1) + else: + x = x.clone() + x[mask] += self.emb(y[mask]) + return x + + @staticmethod + def ratio_mask(mask: Tensor, ratio: float): + r"""Modifies :obj:`mask` by setting :obj:`ratio` of :obj:`True` + entries to :obj:`False`. Does not operate in-place. + + Args: + mask (paddle.Tensor): The mask to re-mask. + ratio (float): The ratio of entries to keep. + """ + n = int(mask.sum()) + out = mask.clone() + out[mask] = paddle.rand([n], dtype=mask.dtype, device=mask.device) < ratio + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/meta.py b/jointContribution/mattergen/paddle_geometric/nn/models/meta.py new file mode 100644 index 00000000..afab4353 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/meta.py @@ -0,0 +1,102 @@ +from typing import Optional, Tuple + +import paddle +import paddle.nn as nn +from paddle import Tensor +from paddle.nn import Layer + + +class MetaLayer(nn.Layer): + r"""A meta layer for building any kind of graph network, inspired by the + `"Relational Inductive Biases, Deep Learning, and Graph Networks" + `_ paper. + + A graph network takes a graph as input and returns an updated graph as + output (with same connectivity). + The input graph has node features :obj:`x`, edge features :obj:`edge_attr` + as well as graph-level features :obj:`u`. + The output graph has the same structure, but updated features. + + Edge features, node features as well as global features are updated by + calling the modules :obj:`edge_model`, :obj:`node_model` and + :obj:`global_model`, respectively. + + To allow for batch-wise graph processing, all callable functions take an + additional argument :obj:`batch`, which determines the assignment of + edges or nodes to their specific graphs. + + Args: + edge_model (paddle.nn.Layer, optional): A callable which updates a + graph's edge features based on its source and target node features, + its current edge features and its global features. + (default: :obj:`None`) + node_model (paddle.nn.Layer, optional): A callable which updates a + graph's node features based on its current node features, its graph + connectivity, its edge features and its global features. + (default: :obj:`None`) + global_model (paddle.nn.Layer, optional): A callable which updates a + graph's global features based on its node features, its graph + connectivity, its edge features and its current global features. + (default: :obj:`None`) + """ + def __init__( + self, + edge_model: Optional[nn.Layer] = None, + node_model: Optional[nn.Layer] = None, + global_model: Optional[nn.Layer] = None, + ): + super().__init__() + self.edge_model = edge_model + self.node_model = node_model + self.global_model = global_model + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for item in [self.node_model, self.edge_model, self.global_model]: + if hasattr(item, 'reset_parameters'): + item.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + u: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + ) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node features. + edge_index (paddle.Tensor): The edge indices. + edge_attr (paddle.Tensor, optional): The edge features. + (default: :obj:`None`) + u (paddle.Tensor, optional): The global graph features. + (default: :obj:`None`) + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific graph. (default: :obj:`None`) + """ + row = edge_index[0] + col = edge_index[1] + + if self.edge_model is not None: + edge_attr = self.edge_model(x[row], x[col], edge_attr, u, + batch if batch is None else batch[row]) + + if self.node_model is not None: + x = self.node_model(x, edge_index, edge_attr, u, batch) + + if self.global_model is not None: + u = self.global_model(x, edge_index, edge_attr, u, batch) + + return x, edge_attr, u + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(\n' + f' edge_model={self.edge_model},\n' + f' node_model={self.node_model},\n' + f' global_model={self.global_model}\n' + f')') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/metapath2vec.py b/jointContribution/mattergen/paddle_geometric/nn/models/metapath2vec.py new file mode 100644 index 00000000..adb682cb --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/metapath2vec.py @@ -0,0 +1,236 @@ +from typing import Dict, List, Optional, Tuple + +import math +import paddle +import paddle.nn as nn +from paddle import Tensor +from paddle.nn import Embedding +from paddle.io import DataLoader + +from paddle_geometric.index import index2ptr +from paddle_geometric.typing import EdgeType, NodeType, OptTensor +from paddle_geometric.utils import sort_edge_index + +EPS = 1e-15 + + +class MetaPath2Vec(nn.Layer): + r"""The MetaPath2Vec model from the `"metapath2vec: Scalable Representation + Learning for Heterogeneous Networks" + `_ paper where random walks based + on a given :obj:`metapath` are sampled in a heterogeneous graph, and node + embeddings are learned via negative sampling optimization. + """ + def __init__( + self, + edge_index_dict: Dict[EdgeType, Tensor], + embedding_dim: int, + metapath: List[EdgeType], + walk_length: int, + context_size: int, + walks_per_node: int = 1, + num_negative_samples: int = 1, + num_nodes_dict: Optional[Dict[NodeType, int]] = None, + sparse: bool = False, + ): + super().__init__() + + if num_nodes_dict is None: + num_nodes_dict = {} + for keys, edge_index in edge_index_dict.items(): + key = keys[0] + N = int(edge_index[0].max() + 1) + num_nodes_dict[key] = max(N, num_nodes_dict.get(key, N)) + + key = keys[-1] + N = int(edge_index[1].max() + 1) + num_nodes_dict[key] = max(N, num_nodes_dict.get(key, N)) + + self.rowptr_dict, self.col_dict, self.rowcount_dict = {}, {}, {} + for keys, edge_index in edge_index_dict.items(): + sizes = (num_nodes_dict[keys[0]], num_nodes_dict[keys[-1]]) + row, col = sort_edge_index(edge_index, num_nodes=max(sizes)).cpu() + rowptr = index2ptr(row, size=sizes[0]) + self.rowptr_dict[keys] = rowptr + self.col_dict[keys] = col + self.rowcount_dict[keys] = rowptr[1:] - rowptr[:-1] + + for edge_type1, edge_type2 in zip(metapath[:-1], metapath[1:]): + if edge_type1[-1] != edge_type2[0]: + raise ValueError( + "Found invalid metapath. Ensure that the destination node " + "type matches with the source node type across all " + "consecutive edge types.") + + assert walk_length + 1 >= context_size + if walk_length > len(metapath) and metapath[0][0] != metapath[-1][-1]: + raise AttributeError( + "The 'walk_length' is longer than the given 'metapath', but " + "the 'metapath' does not denote a cycle") + + self.embedding_dim = embedding_dim + self.metapath = metapath + self.walk_length = walk_length + self.context_size = context_size + self.walks_per_node = walks_per_node + self.num_negative_samples = num_negative_samples + self.num_nodes_dict = num_nodes_dict + + types = {x[0] for x in metapath} | {x[-1] for x in metapath} + types = sorted(list(types)) + + count = 0 + self.start, self.end = {}, {} + for key in types: + self.start[key] = count + count += num_nodes_dict[key] + self.end[key] = count + + offset = [self.start[metapath[0][0]]] + offset += [self.start[keys[-1]] for keys in metapath + ] * int((walk_length / len(metapath)) + 1) + offset = offset[:walk_length + 1] + assert len(offset) == walk_length + 1 + self.offset = paddle.to_tensor(offset) + + # + 1 denotes a dummy node used to link to for isolated nodes. + self.embedding = Embedding(count + 1, embedding_dim, sparse=sparse) + self.dummy_idx = count + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.embedding.reset_parameters() + + def forward(self, node_type: str, batch: OptTensor = None) -> Tensor: + r"""Returns the embeddings for the nodes in :obj:`batch` of type + :obj:`node_type`. + """ + emb = self.embedding.weight[self.start[node_type]:self.end[node_type]] + return emb if batch is None else emb.index_select(0, batch) + + def loader(self, **kwargs): + r"""Returns the data loader that creates both positive and negative + random walks on the heterogeneous graph. + + Args: + **kwargs (optional): Arguments of + :class:`paddle.io.DataLoader`, such as + :obj:`batch_size`, :obj:`shuffle`, :obj:`drop_last` or + :obj:`num_workers`. + """ + return DataLoader(range(self.num_nodes_dict[self.metapath[0][0]]), + collate_fn=self._sample, **kwargs) + + def _pos_sample(self, batch: Tensor) -> Tensor: + batch = batch.repeat(self.walks_per_node) + + rws = [batch] + for i in range(self.walk_length): + edge_type = self.metapath[i % len(self.metapath)] + batch = sample( + self.rowptr_dict[edge_type], + self.col_dict[edge_type], + self.rowcount_dict[edge_type], + batch, + num_neighbors=1, + dummy_idx=self.dummy_idx, + ).view(-1) + rws.append(batch) + + rw = paddle.stack(rws, axis=-1) + rw.add_(self.offset.view(1, -1)) + rw[rw > self.dummy_idx] = self.dummy_idx + + walks = [] + num_walks_per_rw = 1 + self.walk_length + 1 - self.context_size + for j in range(num_walks_per_rw): + walks.append(rw[:, j:j + self.context_size]) + return paddle.concat(walks, axis=0) + + def _neg_sample(self, batch: Tensor) -> Tensor: + batch = batch.repeat(self.walks_per_node * self.num_negative_samples) + + rws = [batch] + for i in range(self.walk_length): + keys = self.metapath[i % len(self.metapath)] + batch = paddle.randint(0, self.num_nodes_dict[keys[-1]], + shape=[batch.shape[0]], dtype='int64') + rws.append(batch) + + rw = paddle.stack(rws, axis=-1) + rw.add_(self.offset.view(1, -1)) + + walks = [] + num_walks_per_rw = 1 + self.walk_length + 1 - self.context_size + for j in range(num_walks_per_rw): + walks.append(rw[:, j:j + self.context_size]) + return paddle.concat(walks, axis=0) + + def _sample(self, batch: List[int]) -> Tuple[Tensor, Tensor]: + if not isinstance(batch, Tensor): + batch = paddle.to_tensor(batch, dtype='int64') + return self._pos_sample(batch), self._neg_sample(batch) + + def loss(self, pos_rw: Tensor, neg_rw: Tensor) -> Tensor: + r"""Computes the loss given positive and negative random walks.""" + # Positive loss. + start, rest = pos_rw[:, 0], pos_rw[:, 1:].contiguous() + + h_start = self.embedding(start).reshape([pos_rw.shape[0], 1, + self.embedding_dim]) + h_rest = self.embedding(rest.reshape([-1])).reshape([pos_rw.shape[0], -1, + self.embedding_dim]) + + out = (h_start * h_rest).sum(axis=-1).reshape([-1]) + pos_loss = -paddle.log(paddle.sigmoid(out) + EPS).mean() + + # Negative loss. + start, rest = neg_rw[:, 0], neg_rw[:, 1:].contiguous() + + h_start = self.embedding(start).reshape([neg_rw.shape[0], 1, + self.embedding_dim]) + h_rest = self.embedding(rest.reshape([-1])).reshape([neg_rw.shape[0], -1, + self.embedding_dim]) + + out = (h_start * h_rest).sum(axis=-1).reshape([-1]) + neg_loss = -paddle.log(1 - paddle.sigmoid(out) + EPS).mean() + + return pos_loss + neg_loss + + def test(self, train_z: Tensor, train_y: Tensor, test_z: Tensor, + test_y: Tensor, solver: str = "lbfgs", *args, **kwargs) -> float: + r"""Evaluates latent space quality via a logistic regression downstream + task. + """ + from sklearn.linear_model import LogisticRegression + + clf = LogisticRegression(solver=solver, *args, + **kwargs).fit(train_z.detach().cpu().numpy(), + train_y.detach().cpu().numpy()) + return clf.score(test_z.detach().cpu().numpy(), + test_y.detach().cpu().numpy()) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'{self.embedding.weight.shape[0] - 1}, ' + f'{self.embedding.weight.shape[1]})') + + +def sample(rowptr: Tensor, col: Tensor, rowcount: Tensor, subset: Tensor, + num_neighbors: int, dummy_idx: int) -> Tensor: + + mask = subset >= dummy_idx + subset = subset.clamp(min=0, max=rowptr.numel() - 2) + count = rowcount[subset] + + rand = paddle.rand([subset.shape[0], num_neighbors], dtype=subset.dtype) + rand *= count.to(rand.dtype).reshape([-1, 1]) + rand = rand.astype('int64') + rowptr[subset].reshape([-1, 1]) + rand = rand.clip(max=col.numel() - 1) # If last node is isolated. + + col = col[rand] if col.numel() > 0 else rand + col[mask | (count == 0)] = dummy_idx + return col diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/mlp.py b/jointContribution/mattergen/paddle_geometric/nn/models/mlp.py new file mode 100644 index 00000000..c8ad1874 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/mlp.py @@ -0,0 +1,232 @@ +import inspect +import warnings +from typing import Any, Callable, Dict, Final, List, Optional, Union + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Identity +from paddle_geometric.nn.dense.linear import Linear +from paddle_geometric.nn.resolver import ( + activation_resolver, + normalization_resolver, +) +from paddle_geometric.typing import NoneType +from typing import Any, Callable, Dict, List, Optional, Union + + +class MLP(nn.Layer): + r"""A Multi-Layer Perception (MLP) model. + + Args: + channel_list (List[int] or int, optional): List of input, intermediate + and output channels such that :obj:`len(channel_list) - 1` denotes + the number of layers of the MLP (default: :obj:`None`) + in_channels (int, optional): Size of each input sample. + Will override :attr:`channel_list`. (default: :obj:`None`) + hidden_channels (int, optional): Size of each hidden sample. + Will override :attr:`channel_list`. (default: :obj:`None`) + out_channels (int, optional): Size of each output sample. + Will override :attr:`channel_list`. (default: :obj:`None`) + num_layers (int, optional): The number of layers. + Will override :attr:`channel_list`. (default: :obj:`None`) + dropout (float or List[float], optional): Dropout probability of each + hidden embedding. If a list is provided, sets the dropout value per + layer. (default: :obj:`0.`) + act (str or Callable, optional): The non-linear activation function to + use. (default: :obj:`"relu"`) + act_first (bool, optional): If set to :obj:`True`, activation is + applied before normalization. (default: :obj:`False`) + act_kwargs (Dict[str, Any], optional): Arguments passed to the + respective activation function defined by :obj:`act`. + (default: :obj:`None`) + norm (str or Callable, optional): The normalization function to + use. (default: :obj:`"batch_norm"`) + norm_kwargs (Dict[str, Any], optional): Arguments passed to the + respective normalization function defined by :obj:`norm`. + (default: :obj:`None`) + plain_last (bool, optional): If set to :obj:`False`, will apply + non-linearity, batch normalization and dropout to the last layer as + well. (default: :obj:`True`) + bias (bool or List[bool], optional): If set to :obj:`False`, the module + will not learn additive biases. If a list is provided, sets the + bias per layer. (default: :obj:`True`) + """ + + supports_norm_batch: Final[bool] + + def __init__( + self, + channel_list: Optional[Union[List[int], int]] = None, + *, + in_channels: Optional[int] = None, + hidden_channels: Optional[int] = None, + out_channels: Optional[int] = None, + num_layers: Optional[int] = None, + dropout: Union[float, List[float]] = 0., + act: Union[str, Callable, None] = "relu", + act_first: bool = False, + act_kwargs: Optional[Dict[str, Any]] = None, + norm: Union[str, Callable, None] = "batch_norm", + norm_kwargs: Optional[Dict[str, Any]] = None, + plain_last: bool = True, + bias: Union[bool, List[bool]] = True, + **kwargs, + ): + super().__init__() + + # Backward compatibility: + act_first = act_first or kwargs.get("relu_first", False) + batch_norm = kwargs.get("batch_norm", None) + if batch_norm is not None and isinstance(batch_norm, bool): + warnings.warn("Argument `batch_norm` is deprecated, " + "please use `norm` to specify normalization layer.") + norm = 'batch_norm' if batch_norm else None + batch_norm_kwargs = kwargs.get("batch_norm_kwargs", None) + norm_kwargs = batch_norm_kwargs or {} + + if isinstance(channel_list, int): + in_channels = channel_list + + if in_channels is not None: + if num_layers is None: + raise ValueError("Argument `num_layers` must be given") + if num_layers > 1 and hidden_channels is None: + raise ValueError(f"Argument `hidden_channels` must be given " + f"for `num_layers={num_layers}`") + if out_channels is None: + raise ValueError("Argument `out_channels` must be given") + + channel_list = [hidden_channels] * (num_layers - 1) + channel_list = [in_channels] + channel_list + [out_channels] + + assert isinstance(channel_list, (tuple, list)) + assert len(channel_list) >= 2 + self.channel_list = channel_list + + self.act = activation_resolver(act, **(act_kwargs or {})) + self.act_first = act_first + self.plain_last = plain_last + + if isinstance(dropout, float): + dropout = [dropout] * (len(channel_list) - 1) + if plain_last: + dropout[-1] = 0. + if len(dropout) != len(channel_list) - 1: + raise ValueError( + f"Number of dropout values provided ({len(dropout)}) does not " + f"match the number of layers specified " + f"({len(channel_list)-1})") + self.dropout = dropout + + if isinstance(bias, bool): + bias = [bias] * (len(channel_list) - 1) + if len(bias) != len(channel_list) - 1: + raise ValueError( + f"Number of bias values provided ({len(bias)}) does not match " + f"the number of layers specified ({len(channel_list)-1})") + + self.lins = nn.LayerList() + iterator = zip(channel_list[:-1], channel_list[1:], bias) + for in_channels, out_channels, _bias in iterator: + self.lins.append(Linear(in_channels, out_channels, bias=_bias)) + + self.norms = nn.LayerList() + iterator = channel_list[1:-1] if plain_last else channel_list[1:] + for hidden_channels in iterator: + if norm is not None: + norm_layer = normalization_resolver( + norm, + hidden_channels, + **(norm_kwargs or {}), + ) + else: + norm_layer = Identity() + self.norms.append(norm_layer) + + self.supports_norm_batch = False + if len(self.norms) > 0 and hasattr(self.norms[0], 'forward'): + norm_params = inspect.signature(self.norms[0].forward).parameters + self.supports_norm_batch = 'batch' in norm_params + + self.reset_parameters() + + @property + def in_channels(self) -> int: + r"""Size of each input sample.""" + return self.channel_list[0] + + @property + def out_channels(self) -> int: + r"""Size of each output sample.""" + return self.channel_list[-1] + + @property + def num_layers(self) -> int: + r"""The number of layers.""" + return len(self.channel_list) - 1 + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for lin in self.lins: + lin.reset_parameters() + for norm in self.norms: + if hasattr(norm, 'reset_parameters'): + norm.reset_parameters() + + def forward( + self, + x: Tensor, + batch: Optional[Tensor] = None, + batch_size: Optional[int] = None, + return_emb: NoneType = None, + ) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. + Only needs to be passed in case the underlying normalization + layers require the :obj:`batch` information. + (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. + Only needs to be passed in case the underlying normalization + layers require the :obj:`batch` information. + (default: :obj:`None`) + return_emb (bool, optional): If set to :obj:`True`, will + additionally return the embeddings before execution of the + final output layer. (default: :obj:`False`) + """ + # `return_emb` is annotated here as `NoneType` to be compatible with + # TorchScript, which does not support different return types based on + # the value of an input argument. + emb: Optional[Tensor] = None + + # If `plain_last=True`, then `len(norms) = len(lins) -1, thus skipping + # the execution of the last layer inside the for-loop. + for i, (lin, norm) in enumerate(zip(self.lins, self.norms)): + x = lin(x) + if self.act is not None and self.act_first: + x = self.act(x) + if self.supports_norm_batch: + x = norm(x, batch, batch_size) + else: + x = norm(x) + if self.act is not None and not self.act_first: + x = self.act(x) + x = F.dropout(x, p=self.dropout[i], training=self.training) + if isinstance(return_emb, bool) and return_emb is True: + emb = x + + if self.plain_last: + x = self.lins[-1](x) + x = F.dropout(x, p=self.dropout[-1], training=self.training) + + return (x, emb) if isinstance(return_emb, bool) else x + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({str(self.channel_list)[1:-1]})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/neural_fingerprint.py b/jointContribution/mattergen/paddle_geometric/nn/models/neural_fingerprint.py new file mode 100644 index 00000000..ece33ea8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/neural_fingerprint.py @@ -0,0 +1,72 @@ +from typing import Optional + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.nn import Linear, MFConv, global_add_pool +from paddle_geometric.typing import Adj + + +class NeuralFingerprint(nn.Layer): + r"""The Neural Fingerprint model from the + `"Convolutional Networks on Graphs for Learning Molecular Fingerprints" + `__ paper to generate fingerprints + of molecules. + + Args: + in_channels (int): Size of each input sample. + hidden_channels (int): Size of each hidden sample. + out_channels (int): Size of each output fingerprint. + num_layers (int): Number of layers. + **kwargs (optional): Additional arguments of + :class:`paddle_geometric.nn.conv.MFConv`. + """ + def __init__( + self, + in_channels: int, + hidden_channels: int, + out_channels: int, + num_layers: int, + **kwargs, + ): + super().__init__() + + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.num_layers = num_layers + + self.convs = nn.LayerList() + for i in range(self.num_layers): + in_channels = self.in_channels if i == 0 else self.hidden_channels + self.convs.append(MFConv(in_channels, hidden_channels, **kwargs)) + + self.lins = nn.LayerList() + for _ in range(self.num_layers): + self.lins.append(Linear(hidden_channels, out_channels, bias=False)) + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for conv in self.convs: + conv.reset_parameters() + for lin in self.lins: + lin.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Adj, + batch: Optional[Tensor] = None, + batch_size: Optional[int] = None, + ) -> Tensor: + outs = [] + for conv, lin in zip(self.convs, self.lins): + x = conv(x, edge_index).sigmoid() + y = lin(x).softmax(axis=-1) + outs.append(global_add_pool(y, batch, batch_size)) + return sum(outs) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_layers={self.num_layers})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/node2vec.py b/jointContribution/mattergen/paddle_geometric/nn/models/node2vec.py new file mode 100644 index 00000000..316db4c0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/node2vec.py @@ -0,0 +1,138 @@ +from typing import List, Optional, Tuple, Union + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.index import index2ptr +from paddle_geometric.utils import sort_edge_index +from paddle_geometric.typing import Adj +from paddle_geometric.utils.num_nodes import maybe_num_nodes +from paddle.nn import Embedding + +EPS = 1e-15 + + +class Node2Vec(nn.Layer): + r"""The Node2Vec model from the + `"node2vec: Scalable Feature Learning for Networks" + `_ paper where random walks of + length :obj:`walk_length` are sampled in a given graph, and node embeddings + are learned via negative sampling optimization. + """ + def __init__( + self, + edge_index: Tensor, + embedding_dim: int, + walk_length: int, + context_size: int, + walks_per_node: int = 1, + p: float = 1.0, + q: float = 1.0, + num_negative_samples: int = 1, + num_nodes: Optional[int] = None, + sparse: bool = False, + ): + super().__init__() + + # Determine the random walk function based on available libraries + if p == 1.0 and q == 1.0: + # This is a simplified example, you would replace the logic + # to implement or import your own random walk function + self.random_walk_fn = self.random_walk + else: + raise ImportError(f"Node2Vec requires custom random walk function") + + # Get number of nodes + self.num_nodes = maybe_num_nodes(edge_index, num_nodes) + + row, col = sort_edge_index(edge_index, num_nodes=self.num_nodes).cpu() + self.rowptr, self.col = index2ptr(row, self.num_nodes), col + + self.embedding_dim = embedding_dim + self.walk_length = walk_length - 1 + self.context_size = context_size + self.walks_per_node = walks_per_node + self.p = p + self.q = q + self.num_negative_samples = num_negative_samples + + # Define embedding layer + self.embedding = Embedding(self.num_nodes, embedding_dim, sparse=sparse) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.embedding.reset_parameters() + + def forward(self, batch: Optional[Tensor] = None) -> Tensor: + """Returns the embeddings for the nodes in :obj:`batch`.""" + emb = self.embedding.weight + return emb if batch is None else emb[batch] + + def loader(self, **kwargs): + """Returns a DataLoader to sample walks.""" + return paddle.io.DataLoader(range(self.num_nodes), collate_fn=self.sample, **kwargs) + + def pos_sample(self, batch: Tensor) -> Tensor: + batch = batch.repeat(self.walks_per_node) + rw = self.random_walk_fn(self.rowptr, self.col, batch, self.walk_length, self.p, self.q) + + walks = [] + num_walks_per_rw = 1 + self.walk_length + 1 - self.context_size + for j in range(num_walks_per_rw): + walks.append(rw[:, j:j + self.context_size]) + return paddle.concat(walks, axis=0) + + def neg_sample(self, batch: Tensor) -> Tensor: + batch = batch.repeat(self.walks_per_node * self.num_negative_samples) + + rw = paddle.randint(0, self.num_nodes, shape=(batch.shape[0], self.walk_length), dtype=batch.dtype) + rw = paddle.concat([batch.unsqueeze(-1), rw], axis=-1) + + walks = [] + num_walks_per_rw = 1 + self.walk_length + 1 - self.context_size + for j in range(num_walks_per_rw): + walks.append(rw[:, j:j + self.context_size]) + return paddle.concat(walks, axis=0) + + def sample(self, batch: Union[List[int], Tensor]) -> Tuple[Tensor, Tensor]: + if not isinstance(batch, Tensor): + batch = paddle.to_tensor(batch) + return self.pos_sample(batch), self.neg_sample(batch) + + def loss(self, pos_rw: Tensor, neg_rw: Tensor) -> Tensor: + r"""Computes the loss given positive and negative random walks.""" + # Positive loss + start, rest = pos_rw[:, 0], pos_rw[:, 1:].contiguous() + + h_start = self.embedding(start).reshape([pos_rw.shape[0], 1, self.embedding_dim]) + h_rest = self.embedding(rest.reshape([-1])).reshape([pos_rw.shape[0], -1, self.embedding_dim]) + + out = (h_start * h_rest).sum(axis=-1).reshape([-1]) + pos_loss = -paddle.log(paddle.sigmoid(out) + EPS).mean() + + # Negative loss + start, rest = neg_rw[:, 0], neg_rw[:, 1:].contiguous() + + h_start = self.embedding(start).reshape([neg_rw.shape[0], 1, self.embedding_dim]) + h_rest = self.embedding(rest.reshape([-1])).reshape([neg_rw.shape[0], -1, self.embedding_dim]) + + out = (h_start * h_rest).sum(axis=-1).reshape([-1]) + neg_loss = -paddle.log(1 - paddle.sigmoid(out) + EPS).mean() + + return pos_loss + neg_loss + + def test(self, train_z: Tensor, train_y: Tensor, test_z: Tensor, test_y: Tensor, solver: str = 'lbfgs', *args, **kwargs) -> float: + """Evaluates latent space quality via a logistic regression downstream task.""" + from sklearn.linear_model import LogisticRegression + + clf = LogisticRegression(solver=solver, *args, **kwargs).fit(train_z.detach().cpu().numpy(), + train_y.detach().cpu().numpy()) + return clf.score(test_z.detach().cpu().numpy(), test_y.detach().cpu().numpy()) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.embedding.weight.shape[0]}, {self.embedding.weight.shape[1]})' + + diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/pmlp.py b/jointContribution/mattergen/paddle_geometric/nn/models/pmlp.py new file mode 100644 index 00000000..cc80c6f7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/pmlp.py @@ -0,0 +1,104 @@ +from typing import Optional + +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer, BatchNorm1D, Linear + +from paddle_geometric.nn import SimpleConv +from paddle_geometric.nn.dense.linear import Linear as PaddleLinear + + +class PMLP(Layer): + r"""The P(ropagational)MLP model from the `"Graph Neural Networks are + Inherently Good Generalizers: Insights by Bridging GNNs and MLPs" + `_ paper. + :class:`PMLP` is identical to a standard MLP during training, but then + adopts a GNN architecture during testing. + + Args: + in_channels (int): Size of each input sample. + hidden_channels (int): Size of each hidden sample. + out_channels (int): Size of each output sample. + num_layers (int): The number of layers. + dropout (float, optional): Dropout probability of each hidden + embedding. (default: :obj:`0.`) + norm (bool, optional): If set to :obj:`False`, will not apply batch + normalization. (default: :obj:`True`) + bias (bool, optional): If set to :obj:`False`, the module + will not learn additive biases. (default: :obj:`True`) + """ + def __init__( + self, + in_channels: int, + hidden_channels: int, + out_channels: int, + num_layers: int, + dropout: float = 0., + norm: bool = True, + bias: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.num_layers = num_layers + self.dropout = dropout + self.bias = bias + + self.lins = paddle.nn.LayerList() + self.lins.append(PaddleLinear(in_channels, hidden_channels, self.bias)) + for _ in range(self.num_layers - 2): + lin = PaddleLinear(hidden_channels, hidden_channels, self.bias) + self.lins.append(lin) + self.lins.append(PaddleLinear(hidden_channels, out_channels, self.bias)) + + self.norm = None + if norm: + self.norm = BatchNorm1D( + hidden_channels, + weight_attr=False, + bias_attr=False, + ) + + self.conv = SimpleConv(aggr='mean', combine_root='self_loop') + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + for lin in self.lins: + paddle.nn.initializer.XavierUniform()(lin.weight) + if self.bias: + paddle.nn.initializer.Constant(0.)(lin.bias) + + def forward( + self, + x: Tensor, + edge_index: Optional[Tensor] = None, + ) -> Tensor: + """""" # noqa: D419 + if not self.training and edge_index is None: + raise ValueError(f"'edge_index' needs to be present during " + f"inference in '{self.__class__.__name__}'") + + for i in range(self.num_layers): + x = paddle.matmul(x, self.lins[i].weight.T) + if not self.training: + x = self.conv(x, edge_index) + if self.bias: + x = x + self.lins[i].bias + if i != self.num_layers - 1: + if self.norm is not None: + x = self.norm(x) + x = F.relu(x) + x = F.dropout(x, p=self.dropout, training=self.training) + + return x + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, num_layers={self.num_layers})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/re_net.py b/jointContribution/mattergen/paddle_geometric/nn/models/re_net.py new file mode 100644 index 00000000..98eac8d3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/re_net.py @@ -0,0 +1,210 @@ +import math +from typing import Callable, List, Tuple + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import GRU, Linear + +from paddle_geometric.data import Data +from paddle_geometric.utils import scatter + + +class RENet(paddle.nn.Layer): + r"""The Recurrent Event Network model from the `"Recurrent Event Network + for Reasoning over Temporal Knowledge Graphs" + `_ paper. + + .. math:: + f_{\mathbf{\Theta}}(\mathbf{e}_s, \mathbf{e}_r, + \mathbf{h}^{(t-1)}(s, r)) + + based on a RNN encoder + + .. math:: + \mathbf{h}^{(t)}(s, r) = \textrm{RNN}(\mathbf{e}_s, \mathbf{e}_r, + g(\mathcal{O}^{(t)}_r(s)), \mathbf{h}^{(t-1)}(s, r)) + + where :math:`\mathbf{e}_s` and :math:`\mathbf{e}_r` denote entity and + relation embeddings, and :math:`\mathcal{O}^{(t)}_r(s)` represents the set + of objects interacted with subject :math:`s` under relation :math:`r` at + timestamp :math:`t`. + This model implements :math:`g` as the **Mean Aggregator** and + :math:`f_{\mathbf{\Theta}}` as a linear projection. + + Args: + num_nodes (int): The number of nodes in the knowledge graph. + num_rels (int): The number of relations in the knowledge graph. + hidden_channels (int): Hidden size of node and relation embeddings. + seq_len (int): The sequence length of past events. + num_layers (int, optional): The number of recurrent layers. + (default: :obj:`1`) + dropout (float): If non-zero, introduces a dropout layer before the + final prediction. (default: :obj:`0.`) + bias (bool, optional): If set to :obj:`False`, all layers will not + learn an additive bias. (default: :obj:`True`) + """ + def __init__( + self, + num_nodes: int, + num_rels: int, + hidden_channels: int, + seq_len: int, + num_layers: int = 1, + dropout: float = 0., + bias: bool = True, + ): + super().__init__() + + self.num_nodes = num_nodes + self.hidden_channels = hidden_channels + self.num_rels = num_rels + self.seq_len = seq_len + self.dropout = dropout + + self.ent = paddle.create_parameter( + shape=[num_nodes, hidden_channels], + dtype='float32' + ) + + self.rel = paddle.create_parameter( + shape=[num_rels, hidden_channels], + dtype='float32' + ) + + self.sub_gru = GRU(3 * hidden_channels, hidden_channels, num_layers, + batch_first=True, bias=bias) + self.obj_gru = GRU(3 * hidden_channels, hidden_channels, num_layers, + batch_first=True, bias=bias) + + self.sub_lin = Linear(3 * hidden_channels, num_nodes, bias=bias) + self.obj_lin = Linear(3 * hidden_channels, num_nodes, bias=bias) + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.ent, gain=math.sqrt(2.0)) + paddle.nn.initializer.XavierUniform()(self.rel, gain=math.sqrt(2.0)) + + self.sub_gru.reset_parameters() + self.obj_gru.reset_parameters() + self.sub_lin.reset_parameters() + self.obj_lin.reset_parameters() + + @staticmethod + def pre_transform(seq_len: int) -> Callable: + r"""Precomputes history objects.""" + + class PreTransform: + def __init__(self, seq_len: int): + self.seq_len = seq_len + self.inc = 5000 + self.t_last = 0 + self.sub_hist = self.increase_hist_node_size([]) + self.obj_hist = self.increase_hist_node_size([]) + + def increase_hist_node_size(self, hist: List[int]) -> List[int]: + hist_inc = paddle.zeros((self.inc, self.seq_len + 1, 0)) + return hist + hist_inc.tolist() + + def get_history( + self, + hist: List[int], + node: int, + rel: int, + ) -> Tuple[Tensor, Tensor]: + hists, ts = [], [] + for s in range(self.seq_len): + h = hist[node][s] + hists += h + ts.append(paddle.full((len(h), ), s, dtype=paddle.int64)) + node, r = paddle.tensor(hists, dtype=paddle.int64).view( + -1, 2).T.contiguous() + node = node[r == rel] + t = paddle.concat(ts, axis=0)[r == rel] + return node, t + + def step(self, hist: List[int]) -> List[int]: + for i in range(len(hist)): + hist[i] = hist[i][1:] + hist[i].append([]) + return hist + + def __call__(self, data: Data) -> Data: + sub, rel, obj, t = data.sub, data.rel, data.obj, data.t + + if max(sub, obj) + 1 > len(self.sub_hist): + self.sub_hist = self.increase_hist_node_size(self.sub_hist) + self.obj_hist = self.increase_hist_node_size(self.obj_hist) + + if t > self.t_last: + self.sub_hist = self.step(self.sub_hist) + self.obj_hist = self.step(self.obj_hist) + self.t_last = t + + data.h_sub, data.h_sub_t = self.get_history( + self.sub_hist, sub, rel) + data.h_obj, data.h_obj_t = self.get_history( + self.obj_hist, obj, rel) + + self.sub_hist[sub][-1].append([obj, rel]) + self.obj_hist[obj][-1].append([sub, rel]) + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(seq_len={self.seq_len})' + + return PreTransform(seq_len) + + def forward(self, data: Data) -> Tuple[Tensor, Tensor]: + """Given a :obj:`data` batch, computes the forward pass.""" + + assert 'h_sub_batch' in data and 'h_obj_batch' in data + batch_size, seq_len = data.sub.shape[0], self.seq_len + + h_sub_t = data.h_sub_t + data.h_sub_batch * seq_len + h_obj_t = data.h_obj_t + data.h_obj_batch * seq_len + + h_sub = scatter(self.ent[data.h_sub], h_sub_t, dim_size=batch_size * seq_len, + reduce='mean').view(batch_size, seq_len, -1) + h_obj = scatter(self.ent[data.h_obj], h_obj_t, dim_size=batch_size * seq_len, + reduce='mean').view(batch_size, seq_len, -1) + + sub = self.ent[data.sub].unsqueeze(1).repeat(1, seq_len, 1) + rel = self.rel[data.rel].unsqueeze(1).repeat(1, seq_len, 1) + obj = self.ent[data.obj].unsqueeze(1).repeat(1, seq_len, 1) + + _, h_sub = self.sub_gru(paddle.concat([sub, h_sub, rel], axis=-1)) + _, h_obj = self.obj_gru(paddle.concat([obj, h_obj, rel], axis=-1)) + h_sub, h_obj = h_sub.squeeze(0), h_obj.squeeze(0) + + h_sub = paddle.concat([self.ent[data.sub], h_sub, self.rel[data.rel]], + axis=-1) + h_obj = paddle.concat([self.ent[data.obj], h_obj, self.rel[data.rel]], + axis=-1) + + h_sub = F.dropout(h_sub, p=self.dropout, training=self.training) + h_obj = F.dropout(h_obj, p=self.dropout, training=self.training) + + log_prob_obj = F.log_softmax(self.sub_lin(h_sub), axis=1) + log_prob_sub = F.log_softmax(self.obj_lin(h_obj), axis=1) + + return log_prob_obj, log_prob_sub + + def test(self, logits: Tensor, y: Tensor) -> Tensor: + """Given ground-truth :obj:`y`, computes Mean Reciprocal Rank (MRR) + and Hits at 1/3/10. + """ + _, perm = logits.argsort(axis=1, descending=True) + mask = (y.unsqueeze(1) == perm) + + nnz = mask.nonzero(as_tuple=False) + mrr = (1 / (nnz[:, -1] + 1).to(paddle.float32)).mean().item() + hits1 = mask[:, :1].sum().item() / y.shape[0] + hits3 = mask[:, :3].sum().item() / y.shape[0] + hits10 = mask[:, :10].sum().item() / y.shape[0] + + return paddle.to_tensor([mrr, hits1, hits3, hits10]) + + diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/rect.py b/jointContribution/mattergen/paddle_geometric/nn/models/rect.py new file mode 100644 index 00000000..7c891141 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/rect.py @@ -0,0 +1,84 @@ +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear +from paddle_geometric.nn import GCNConv +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import scatter + +class RECT_L(paddle.nn.Layer): + r"""The RECT model, *i.e.* its supervised RECT-L part, from the + `"Network Embedding with Completely-imbalanced Labels" + `_ paper. + In particular, a GCN model is trained that reconstructs semantic class + knowledge. + + .. note:: + + For an example of using RECT, see `examples/rect.py + `_. + + Args: + in_channels (int): Size of each input sample. + hidden_channels (int): Intermediate size of each sample. + normalize (bool, optional): Whether to add self-loops and compute + symmetric normalization coefficients on-the-fly. + (default: :obj:`True`) + dropout (float, optional): The dropout probability. + (default: :obj:`0.0`) + """ + def __init__(self, in_channels: int, hidden_channels: int, + normalize: bool = True, dropout: float = 0.0): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.dropout = dropout + + self.conv = GCNConv(in_channels, hidden_channels, normalize=normalize) + self.lin = Linear(hidden_channels, in_channels) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.conv.reset_parameters() + self.lin.reset_parameters() + paddle.nn.initializer.XavierUniform()(self.lin.weight) + + def forward( + self, + x: Tensor, + edge_index: Adj, + edge_weight: OptTensor = None, + ) -> Tensor: + x = self.conv(x, edge_index, edge_weight) + x = F.dropout(x, p=self.dropout, training=self.training) + return self.lin(x) + + # @paddle.jit.load + def embed( + self, + x: Tensor, + edge_index: Adj, + edge_weight: OptTensor = None, + ) -> Tensor: + with paddle.no_grad(): + return self.conv(x, edge_index, edge_weight) + + # @paddle.jit.load + def get_semantic_labels( + self, + x: Tensor, + y: Tensor, + mask: Tensor, + ) -> Tensor: + r"""Replaces the original labels by their class-centers.""" + with paddle.no_grad(): + y = y[mask] + mean = scatter(x[mask], y, dim=0, reduce='mean') + return mean[y] + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.hidden_channels})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/rev_gnn.py b/jointContribution/mattergen/paddle_geometric/nn/models/rev_gnn.py new file mode 100644 index 00000000..a7099ef8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/rev_gnn.py @@ -0,0 +1,292 @@ +import copy +from typing import Any, List, Optional, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +import paddle_geometric.typing +from paddle_geometric.typing import Adj + + +class InvertibleFunction(paddle.autograd.PyLayer): + r"""An invertible autograd function. This allows for automatic + backpropagation in a reversible fashion so that the memory of intermediate + results can be freed during the forward pass and be constructed on-the-fly + during the bachward pass. + + Args: + ctx (paddle.autograd.PyLayer.InvertibleFunctionBackward): + A context object that can be used to stash information for backward + computation. + fn (paddle.nn.Layer): The forward function. + fn_inverse (paddle.nn.Layer): The inverse function to recompute the + freed input. + num_bwd_passes (int): Number of backward passes to retain a link + with the output. After the last backward pass the output is + discarded and memory is freed. + num_inputs (int): The number of inputs to the forward function. + *args (tuple): Inputs and weights. + """ + @staticmethod + def forward(ctx, fn: paddle.nn.Layer, fn_inverse: paddle.nn.Layer, + num_bwd_passes: int, num_inputs: int, *args): + ctx.fn = fn + ctx.fn_inverse = fn_inverse + ctx.weights = args[num_inputs:] + ctx.num_bwd_passes = num_bwd_passes + ctx.num_inputs = num_inputs + inputs = args[:num_inputs] + ctx.input_requires_grad = [] + + with paddle.no_grad(): # Make a detached copy which shares the storage: + x = [] + for element in inputs: + if isinstance(element, paddle.Tensor): + x.append(element.detach()) + ctx.input_requires_grad.append(element.stop_gradient) + else: + x.append(element) + ctx.input_requires_grad.append(None) + outputs = ctx.fn(*x) + + if not isinstance(outputs, tuple): + outputs = (outputs, ) + + # Detaches outputs in-place, allows discarding the intermedate result: + detached_outputs = tuple(element.detach_() for element in outputs) + + # Store these tensor nodes for backward passes: + ctx.inputs = [inputs] * num_bwd_passes + ctx.outputs = [detached_outputs] * num_bwd_passes + + return detached_outputs + + @staticmethod + def backward(ctx, *grad_outputs): + if len(ctx.outputs) == 0: + raise RuntimeError( + f"Trying to perform a backward pass on the " + f"'InvertibleFunction' for more than '{ctx.num_bwd_passes}' " + f"times. Try raising 'num_bwd_passes'.") + + inputs = ctx.inputs.pop() + outputs = ctx.outputs.pop() + + # Recompute input by swapping out the first argument: + with paddle.no_grad(): + inputs_inverted = ctx.fn_inverse(*(outputs + inputs[1:])) + if len(ctx.outputs) == 0: # Clear memory from outputs: + for element in outputs: + element.stop_gradient = True + + if not isinstance(inputs_inverted, tuple): + inputs_inverted = (inputs_inverted, ) + + for elem_orig, elem_inv in zip(inputs, inputs_inverted): + elem_orig.set_(elem_inv) + + # Compute gradients with grad enabled: + with paddle.set_grad_enabled(True): + detached_inputs = [] + for element in inputs: + if isinstance(element, paddle.Tensor): + detached_inputs.append(element.detach()) + else: + detached_inputs.append(element) + detached_inputs = tuple(detached_inputs) + for x, req_grad in zip(detached_inputs, ctx.input_requires_grad): + if isinstance(x, paddle.Tensor): + x.stop_gradient = not req_grad + tmp_output = ctx.fn(*detached_inputs) + + if not isinstance(tmp_output, tuple): + tmp_output = (tmp_output, ) + + filtered_detached_inputs = tuple( + filter( + lambda x: x.stop_gradient + if isinstance(x, paddle.Tensor) else False, + detached_inputs, + )) + gradients = paddle.autograd.grad( + outputs=tmp_output, + inputs=filtered_detached_inputs + ctx.weights, + grad_outputs=grad_outputs, + ) + + input_gradients = [] + i = 0 + for rg in ctx.input_requires_grad: + if rg: + input_gradients.append(gradients[i]) + i += 1 + else: + input_gradients.append(None) + + gradients = tuple(input_gradients) + gradients[-len(ctx.weights):] + + return (None, None, None, None) + gradients + + +class InvertibleModule(paddle.nn.Layer): + r"""An abstract class for implementing invertible modules. + + Args: + disable (bool, optional): If set to :obj:`True`, will disable the usage + of :class:`InvertibleFunction` and will execute the module without + memory savings. (default: :obj:`False`) + num_bwd_passes (int, optional): Number of backward passes to retain a + link with the output. After the last backward pass the output is + discarded and memory is freed. (default: :obj:`1`) + """ + def __init__(self, disable: bool = False, num_bwd_passes: int = 1): + super().__init__() + self.disable = disable + self.num_bwd_passes = num_bwd_passes + + def forward(self, *args): + return self._fn_apply(args, self._forward, self._inverse) + + def inverse(self, *args): + return self._fn_apply(args, self._inverse, self._forward) + + def _forward(self): + raise NotImplementedError + + def _inverse(self): + raise NotImplementedError + + def _fn_apply(self, args, fn, fn_inverse): + if not self.disable: + out = InvertibleFunction.apply( + fn, + fn_inverse, + self.num_bwd_passes, + len(args), + *args, + *tuple(p for p in self.parameters() if p.stop_gradient), + ) + else: + out = fn(*args) + + if isinstance(out, tuple) and len(out) == 1: + return out[0] + + return out + + +class GroupAddRev(InvertibleModule): + r"""The Grouped Reversible GNN module from the `"Graph Neural Networks with + 1000 Layers" `_ paper. + This module enables training of arbitary deep GNNs with a memory complexity + independent of the number of layers. + + It does so by partitioning input node features :math:`\mathbf{X}` into + :math:`C` groups across the feature dimension. Then, a grouped reversible + GNN block :math:`f_{\theta(i)}` operates on a group of inputs and produces + a group of outputs: + + .. math:: + + \mathbf{X}^{\prime}_0 &= \sum_{i=2}^C \mathbf{X}_i + + \mathbf{X}^{\prime}_i &= f_{\theta(i)} ( \mathbf{X}^{\prime}_{i - 1}, + \mathbf{A}) + \mathbf{X}_i + + for all :math:`i \in \{ 1, \ldots, C \}`. + + Args: + conv (paddle.nn.Layer or paddle.nn.LayerList]): A seed GNN. The input + and output feature dimensions need to match. + split_dim (int, optional): The dimension across which to split groups. + (default: :obj:`-1`) + num_groups (int, optional): The number of groups :math:`C`. + (default: :obj:`None`) + disable (bool, optional): If set to :obj:`True`, will disable the usage + of :class:`InvertibleFunction` and will execute the module without + memory savings. (default: :obj:`False`) + num_bwd_passes (int, optional): Number of backward passes to retain a + link with the output. After the last backward pass the output is + discarded and memory is freed. (default: :obj:`1`) + """ + def __init__( + self, + conv: Union[paddle.nn.Layer, paddle.nn.LayerList], + split_dim: int = -1, + num_groups: Optional[int] = None, + disable: bool = False, + num_bwd_passes: int = 1, + ): + super().__init__(disable, num_bwd_passes) + self.split_dim = split_dim + + if isinstance(conv, paddle.nn.LayerList): + self.convs = conv + else: + assert num_groups is not None, "Please specify 'num_groups'" + self.convs = paddle.nn.LayerList([conv]) + for i in range(num_groups - 1): + conv = copy.deepcopy(self.convs[0]) + if hasattr(conv, 'reset_parameters'): + conv.reset_parameters() + self.convs.append(conv) + + if len(self.convs) < 2: + raise ValueError(f"The number of groups should not be smaller " + f"than '2' (got '{self.num_groups}')") + + @property + def num_groups(self) -> int: + return len(self.convs) + + def reset_parameters(self): + for conv in self.convs: + conv.reset_parameters() + + def _forward(self, x: Tensor, edge_index: Adj, *args): + channels = x.shape[self.split_dim] + xs = self._chunk(x, channels) + args = list(zip(*[self._chunk(arg, channels) for arg in args])) + args = [[]] * self.num_groups if len(args) == 0 else args + + ys = [] + y_in = sum(xs[1:]) + for i in range(self.num_groups): + y_in = xs[i] + self.convs[i](y_in, edge_index, *args[i]) + ys.append(y_in) + return paddle.concat(ys, axis=self.split_dim) + + def _inverse(self, y: Tensor, edge_index: Adj, *args): + channels = y.shape[self.split_dim] + ys = self._chunk(y, channels) + args = list(zip(*[self._chunk(arg, channels) for arg in args])) + args = [[]] * self.num_groups if len(args) == 0 else args + + xs = [] + for i in range(self.num_groups - 1, -1, -1): + if i != 0: + y_in = ys[i - 1] + else: + y_in = sum(xs) + x = ys[i] - self.convs[i](y_in, edge_index, *args[i]) + xs.append(x) + + return paddle.concat(xs[::-1], axis=self.split_dim) + + def _chunk(self, x: Any, channels: int) -> List[Any]: + if not isinstance(x, Tensor): + return [x] * self.num_groups + + try: + if x.shape[self.split_dim] != channels: + return [x] * self.num_groups + except IndexError: + return [x] * self.num_groups + + return paddle.chunk(x, self.num_groups, axis=self.split_dim) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.convs[0]}, ' + f'num_groups={self.num_groups})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/schnet.py b/jointContribution/mattergen/paddle_geometric/nn/models/schnet.py new file mode 100644 index 00000000..1603d440 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/schnet.py @@ -0,0 +1,353 @@ +import os +import os.path as osp +import warnings +from math import pi as PI +from typing import Callable, Dict, Optional, Tuple + +import numpy as np +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Embedding, Linear, LayerList, Sequential + +from paddle_geometric.data import Dataset, download_url, extract_zip +from paddle_geometric.io import fs +from paddle_geometric.nn import MessagePassing, SumAggregation, radius_graph +from paddle_geometric.nn.resolver import aggregation_resolver as aggr_resolver +from paddle_geometric.typing import OptTensor + +qm9_target_dict: Dict[int, str] = { + 0: 'dipole_moment', + 1: 'isotropic_polarizability', + 2: 'homo', + 3: 'lumo', + 4: 'gap', + 5: 'electronic_spatial_extent', + 6: 'zpve', + 7: 'energy_U0', + 8: 'energy_U', + 9: 'enthalpy_H', + 10: 'free_energy', + 11: 'heat_capacity', +} + + +class SchNet(paddle.nn.Layer): + def __init__( + self, + hidden_channels: int = 128, + num_filters: int = 128, + num_interactions: int = 6, + num_gaussians: int = 50, + cutoff: float = 10.0, + interaction_graph: Optional[Callable] = None, + max_num_neighbors: int = 32, + readout: str = 'add', + dipole: bool = False, + mean: Optional[float] = None, + std: Optional[float] = None, + atomref: OptTensor = None, + ): + super(SchNet, self).__init__() + + self.hidden_channels = hidden_channels + self.num_filters = num_filters + self.num_interactions = num_interactions + self.num_gaussians = num_gaussians + self.cutoff = cutoff + self.dipole = dipole + self.sum_aggr = SumAggregation() + self.readout = aggr_resolver('sum' if self.dipole else readout) + self.mean = mean + self.std = std + self.scale = None + + if self.dipole: + import ase + + atomic_mass = paddle.to_tensor(ase.data.atomic_masses) + self.register_buffer('atomic_mass', atomic_mass) + + self.embedding = Embedding(100, hidden_channels, padding_idx=0) + + if interaction_graph is not None: + self.interaction_graph = interaction_graph + else: + self.interaction_graph = RadiusInteractionGraph(cutoff, max_num_neighbors) + + self.distance_expansion = GaussianSmearing(0.0, cutoff, num_gaussians) + + self.interactions = LayerList() + for _ in range(num_interactions): + block = InteractionBlock(hidden_channels, num_gaussians, num_filters, cutoff) + self.interactions.append(block) + + self.lin1 = Linear(hidden_channels, hidden_channels // 2) + self.act = ShiftedSoftplus() + self.lin2 = Linear(hidden_channels // 2, 1) + + self.register_buffer('initial_atomref', atomref) + self.atomref = None + if atomref is not None: + self.atomref = Embedding(100, 1) + self.atomref.weight.set_value(atomref) + + self.reset_parameters() + + def reset_parameters(self): + self.embedding.reset_parameters() + for interaction in self.interactions: + interaction.reset_parameters() + paddle.nn.initializer.XavierUniform()(self.lin1.weight) + self.lin1.bias.set_value(paddle.zeros_like(self.lin1.bias)) + paddle.nn.initializer.XavierUniform()(self.lin2.weight) + self.lin2.bias.set_value(paddle.zeros_like(self.lin2.bias)) + if self.atomref is not None: + self.atomref.weight.set_value(self.initial_atomref) + + @staticmethod + def from_qm9_pretrained( + root: str, + dataset: Dataset, + target: int, + ) -> Tuple['SchNet', Dataset, Dataset, Dataset]: + import ase + import schnetpack as spk + + assert target >= 0 and target <= 12 + is_dipole = target == 0 + + units = [1] * 12 + units[0] = ase.units.Debye + units[1] = ase.units.Bohr**3 + units[5] = ase.units.Bohr**2 + + root = osp.expanduser(osp.normpath(root)) + os.makedirs(root, exist_ok=True) + folder = 'trained_schnet_models' + if not osp.exists(osp.join(root, folder)): + path = download_url(SchNet.url, root) + extract_zip(path, root) + os.unlink(path) + + name = f'qm9_{qm9_target_dict[target]}' + path = osp.join(root, 'trained_schnet_models', name, 'split.npz') + + split = np.load(path) + train_idx = split['train_idx'] + val_idx = split['val_idx'] + test_idx = split['test_idx'] + + idx = dataset.data.idx + assoc = idx.new_empty(idx.max().item() + 1) + assoc[idx] = paddle.arange(idx.size(0)) + + train_idx = assoc[train_idx[paddle.isin(train_idx, idx)]] + val_idx = assoc[val_idx[paddle.isin(val_idx, idx)]] + test_idx = assoc[test_idx[paddle.isin(test_idx, idx)]] + + path = osp.join(root, 'trained_schnet_models', name, 'best_model') + + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + state = fs.paddle_load(path, map_location='cpu') + + net = SchNet( + hidden_channels=128, + num_filters=128, + num_interactions=6, + num_gaussians=50, + cutoff=10.0, + dipole=is_dipole, + atomref=dataset.atomref(target), + ) + + net.embedding.weight.set_value(state.representation.embedding.weight) + + for int1, int2 in zip(state.representation.interactions, net.interactions): + int2.mlp[0].weight.set_value(int1.filter_network[0].weight) + int2.mlp[0].bias.set_value(int1.filter_network[0].bias) + int2.mlp[2].weight.set_value(int1.filter_network[1].weight) + int2.mlp[2].bias.set_value(int1.filter_network[1].bias) + int2.lin.weight.set_value(int1.dense.weight) + int2.lin.bias.set_value(int1.dense.bias) + + int2.conv.lin1.weight.set_value(int1.cfconv.in2f.weight) + int2.conv.lin2.weight.set_value(int1.cfconv.f2out.weight) + int2.conv.lin2.bias.set_value(int1.cfconv.f2out.bias) + + net.lin1.weight.set_value(state.output_modules[0].out_net[1].out_net[0].weight) + net.lin1.bias.set_value(state.output_modules[0].out_net[1].out_net[0].bias) + net.lin2.weight.set_value(state.output_modules[0].out_net[1].out_net[1].weight) + net.lin2.bias.set_value(state.output_modules[0].out_net[1].out_net[1].bias) + + mean = state.output_modules[0].atom_pool.average + net.readout = aggr_resolver('mean' if mean else 'add') + + dipole = state.output_modules[0].__class__.__name__ == 'DipoleMoment' + net.dipole = dipole + + net.mean = state.output_modules[0].standardize.mean.item() + net.std = state.output_modules[0].standardize.stddev.item() + + if state.output_modules[0].atomref is not None: + net.atomref.weight.set_value(state.output_modules[0].atomref.weight) + else: + net.atomref = None + + net.scale = 1.0 / units[target] + + return net, (dataset[train_idx], dataset[val_idx], dataset[test_idx]) + + def forward(self, z: Tensor, pos: Tensor, batch: OptTensor = None) -> Tensor: + batch = paddle.zeros_like(z) if batch is None else batch + + h = self.embedding(z) + edge_index, edge_weight = self.interaction_graph(pos, batch) + edge_attr = self.distance_expansion(edge_weight) + + for interaction in self.interactions: + h = h + interaction(h, edge_index, edge_weight, edge_attr) + + h = self.lin1(h) + h = self.act(h) + h = self.lin2(h) + + if self.dipole: + mass = self.atomic_mass[z].view(-1, 1) + M = self.sum_aggr(mass, batch, dim=0) + c = self.sum_aggr(mass * pos, batch, dim=0) / M + h = h * (pos - c.index_select(0, batch)) + + if not self.dipole and self.mean and self.std: + h = h * self.std + self.mean + + if not self.dipole and self.atomref is not None: + h = h + self.atomref(z) + + out = self.readout(h, batch, dim=0) + + if self.dipole: + out = paddle.norm(out, dim=-1, keepdim=True) + + if self.scale: + out = self.scale * out + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'hidden_channels={self.hidden_channels}, ' + f'num_filters={self.num_filters}, ' + f'num_interactions={self.num_interactions}, ' + f'num_gaussians={self.num_gaussians}, ' + f'cutoff={self.cutoff})') + + +class RadiusInteractionGraph(paddle.nn.Layer): + def __init__(self, cutoff: float = 10.0, max_num_neighbors: int = 32): + super(RadiusInteractionGraph, self).__init__() + self.cutoff = cutoff + self.max_num_neighbors = max_num_neighbors + + def forward(self, pos: Tensor, batch: Tensor) -> Tuple[Tensor, Tensor]: + edge_index = radius_graph(pos, r=self.cutoff, batch=batch, + max_num_neighbors=self.max_num_neighbors) + row, col = edge_index + edge_weight = (pos[row] - pos[col]).norm(axis=-1) + return edge_index, edge_weight + + +class InteractionBlock(paddle.nn.Layer): + def __init__(self, hidden_channels: int, num_gaussians: int, + num_filters: int, cutoff: float): + super(InteractionBlock, self).__init__() + self.mlp = Sequential( + Linear(num_gaussians, num_filters), + ShiftedSoftplus(), + Linear(num_filters, num_filters), + ) + self.conv = CFConv(hidden_channels, hidden_channels, num_filters, + self.mlp, cutoff) + self.act = ShiftedSoftplus() + self.lin = Linear(hidden_channels, hidden_channels) + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.mlp[0].weight) + self.mlp[0].bias.set_value(paddle.zeros_like(self.mlp[0].bias)) + paddle.nn.initializer.XavierUniform()(self.mlp[2].weight) + self.mlp[2].bias.set_value(paddle.zeros_like(self.mlp[2].bias)) + self.conv.reset_parameters() + paddle.nn.initializer.XavierUniform()(self.lin.weight) + self.lin.bias.set_value(paddle.zeros_like(self.lin.bias)) + + def forward(self, x: Tensor, edge_index: Tensor, edge_weight: Tensor, + edge_attr: Tensor) -> Tensor: + x = self.conv(x, edge_index, edge_weight, edge_attr) + x = self.act(x) + x = self.lin(x) + return x + + +class CFConv(MessagePassing): + def __init__( + self, + in_channels: int, + out_channels: int, + num_filters: int, + nn: Sequential, + cutoff: float, + ): + super(CFConv, self).__init__(aggr='add') + self.lin1 = Linear(in_channels, num_filters, bias=False) + self.lin2 = Linear(num_filters, out_channels) + self.nn = nn + self.cutoff = cutoff + + self.reset_parameters() + + def reset_parameters(self): + paddle.nn.initializer.XavierUniform()(self.lin1.weight) + paddle.nn.initializer.XavierUniform()(self.lin2.weight) + self.lin2.bias.set_value(paddle.zeros_like(self.lin2.bias)) + + def forward(self, x: Tensor, edge_index: Tensor, edge_weight: Tensor, + edge_attr: Tensor) -> Tensor: + C = 0.5 * (paddle.cos(edge_weight * PI / self.cutoff) + 1.0) + W = self.nn(edge_attr) * C.view(-1, 1) + + x = self.lin1(x) + x = self.propagate(edge_index, x=x, W=W) + x = self.lin2(x) + return x + + def message(self, x_j: Tensor, W: Tensor) -> Tensor: + return x_j * W + + +class GaussianSmearing(paddle.nn.Layer): + def __init__( + self, + start: float = 0.0, + stop: float = 5.0, + num_gaussians: int = 50, + ): + super(GaussianSmearing, self).__init__() + offset = paddle.linspace(start, stop, num_gaussians) + self.coeff = -0.5 / (offset[1] - offset[0]).item()**2 + self.register_buffer('offset', offset) + + def forward(self, dist: Tensor) -> Tensor: + dist = dist.view(-1, 1) - self.offset.view(1, -1) + return paddle.exp(self.coeff * paddle.pow(dist, 2)) + + +class ShiftedSoftplus(paddle.nn.Layer): + def __init__(self): + super(ShiftedSoftplus, self).__init__() + self.shift = paddle.log(paddle.to_tensor(2.0)).item() + + def forward(self, x: Tensor) -> Tensor: + return F.softplus(x) - self.shift \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/signed_gcn.py b/jointContribution/mattergen/paddle_geometric/nn/models/signed_gcn.py new file mode 100644 index 00000000..c271e35a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/signed_gcn.py @@ -0,0 +1,171 @@ +from typing import Optional, Tuple + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Embedding, Linear, LayerList +from paddle_geometric.nn import SignedConv +from paddle_geometric.utils import coalesce, negative_sampling, structured_negative_sampling + +class SignedGCN(paddle.nn.Layer): + def __init__( + self, + in_channels: int, + hidden_channels: int, + num_layers: int, + lamb: float = 5, + bias: bool = True, + ): + super(SignedGCN, self).__init__() + + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.num_layers = num_layers + self.lamb = lamb + + self.conv1 = SignedConv(in_channels, hidden_channels // 2, first_aggr=True) + self.convs = LayerList() + for _ in range(num_layers - 1): + self.convs.append(SignedConv(hidden_channels // 2, hidden_channels // 2, first_aggr=False)) + + self.lin = Linear(2 * hidden_channels, 3) + + self.reset_parameters() + + def reset_parameters(self): + self.conv1.reset_parameters() + for conv in self.convs: + conv.reset_parameters() + self.lin.reset_parameters() + + def split_edges( + self, + edge_index: Tensor, + test_ratio: float = 0.2, + ) -> Tuple[Tensor, Tensor]: + mask = paddle.ones([edge_index.shape[1]], dtype=paddle.bool) + mask[paddle.rand([mask.shape[0]]).argsort()[:int(test_ratio * mask.shape[0])]] = 0 + + train_edge_index = edge_index[:, mask] + test_edge_index = edge_index[:, ~mask] + + return train_edge_index, test_edge_index + + def create_spectral_features( + self, + pos_edge_index: Tensor, + neg_edge_index: Tensor, + num_nodes: Optional[int] = None, + ) -> Tensor: + import scipy.sparse as sp + from sklearn.decomposition import TruncatedSVD + + edge_index = paddle.concat([pos_edge_index, neg_edge_index], axis=1) + N = edge_index.max().item() + 1 if num_nodes is None else num_nodes + edge_index = edge_index.numpy() + + pos_val = paddle.full([pos_edge_index.shape[1]], 2, dtype=paddle.float32) + neg_val = paddle.full([neg_edge_index.shape[1]], 0, dtype=paddle.float32) + val = paddle.concat([pos_val, neg_val], axis=0) + + row, col = edge_index + edge_index = paddle.concat([edge_index, paddle.stack([col, row], axis=1)], axis=1) + val = paddle.concat([val, val], axis=0) + + edge_index, val = coalesce(edge_index, val, num_nodes=N) + val = val - 1 + + edge_index = edge_index.detach().numpy() + val = val.detach().numpy() + A = sp.coo_matrix((val, edge_index), shape=(N, N)) + svd = TruncatedSVD(n_components=self.in_channels, n_iter=128) + svd.fit(A) + x = svd.components_.T + return paddle.to_tensor(x, dtype=paddle.float32) + + def forward( + self, + x: Tensor, + pos_edge_index: Tensor, + neg_edge_index: Tensor, + ) -> Tensor: + z = F.relu(self.conv1(x, pos_edge_index, neg_edge_index)) + for conv in self.convs: + z = F.relu(conv(z, pos_edge_index, neg_edge_index)) + return z + + def discriminate(self, z: Tensor, edge_index: Tensor) -> Tensor: + value = paddle.concat([z[edge_index[0]], z[edge_index[1]]], axis=1) + value = self.lin(value) + return F.log_softmax(value, axis=1) + + def nll_loss( + self, + z: Tensor, + pos_edge_index: Tensor, + neg_edge_index: Tensor, + ) -> Tensor: + edge_index = paddle.concat([pos_edge_index, neg_edge_index], axis=1) + none_edge_index = negative_sampling(edge_index, z.shape[0]) + + nll_loss = 0 + nll_loss += F.nll_loss(self.discriminate(z, pos_edge_index), + paddle.full([pos_edge_index.shape[1]], 0, dtype=paddle.long)) + nll_loss += F.nll_loss(self.discriminate(z, neg_edge_index), + paddle.full([neg_edge_index.shape[1]], 1, dtype=paddle.long)) + nll_loss += F.nll_loss(self.discriminate(z, none_edge_index), + paddle.full([none_edge_index.shape[1]], 2, dtype=paddle.long)) + return nll_loss / 3.0 + + def pos_embedding_loss( + self, + z: Tensor, + pos_edge_index: Tensor, + ) -> Tensor: + i, j, k = structured_negative_sampling(pos_edge_index, z.shape[0]) + + out = (z[i] - z[j]).pow(2).sum(axis=1) - (z[i] - z[k]).pow(2).sum(axis=1) + return paddle.clip(out, min=0).mean() + + def neg_embedding_loss(self, z: Tensor, neg_edge_index: Tensor) -> Tensor: + i, j, k = structured_negative_sampling(neg_edge_index, z.shape[0]) + + out = (z[i] - z[k]).pow(2).sum(axis=1) - (z[i] - z[j]).pow(2).sum(axis=1) + return paddle.clip(out, min=0).mean() + + def loss( + self, + z: Tensor, + pos_edge_index: Tensor, + neg_edge_index: Tensor, + ) -> Tensor: + nll_loss = self.nll_loss(z, pos_edge_index, neg_edge_index) + loss_1 = self.pos_embedding_loss(z, pos_edge_index) + loss_2 = self.neg_embedding_loss(z, neg_edge_index) + return nll_loss + self.lamb * (loss_1 + loss_2) + + def test( + self, + z: Tensor, + pos_edge_index: Tensor, + neg_edge_index: Tensor, + ) -> Tuple[float, float]: + from sklearn.metrics import f1_score, roc_auc_score + + with paddle.no_grad(): + pos_p = self.discriminate(z, pos_edge_index)[:, :2].argmax(axis=1) + neg_p = self.discriminate(z, neg_edge_index)[:, :2].argmax(axis=1) + + pred = (1 - paddle.concat([pos_p, neg_p])).cpu() + y = paddle.concat( + [pred.new_ones([pos_p.shape[0]]), + pred.new_zeros([neg_p.shape[0]])]) + + auc = roc_auc_score(y.numpy(), pred.numpy()) + f1 = f1_score(y.numpy(), pred.numpy(), average='binary') if pred.sum() > 0 else 0 + + return auc, f1 + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.hidden_channels}, num_layers={self.num_layers})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/tgn.py b/jointContribution/mattergen/paddle_geometric/nn/models/tgn.py new file mode 100644 index 00000000..b58401f1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/tgn.py @@ -0,0 +1,282 @@ + +import copy +from typing import Callable, Dict, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import GRUCell, Linear + +from paddle_geometric.nn.inits import zeros +from paddle_geometric.utils import scatter +from paddle_geometric.utils._scatter import scatter_argmax + +TGNMessageStoreType = Dict[int, Tuple[Tensor, Tensor, Tensor, Tensor]] + + +class TGNMemory(paddle.nn.Layer): + r"""The Temporal Graph Network (TGN) memory model from the + `"Temporal Graph Networks for Deep Learning on Dynamic Graphs" + `_ paper. + + .. note:: + + For an example of using TGN, see `examples/tgn.py + `_. + + Args: + num_nodes (int): The number of nodes to save memories for. + raw_msg_dim (int): The raw message dimensionality. + memory_dim (int): The hidden memory dimensionality. + time_dim (int): The time encoding dimensionality. + message_module (paddle.nn.Layer): The message function which + combines source and destination node memory embeddings, the raw + message and the time encoding. + aggregator_module (paddle.nn.Layer): The message aggregator function + which aggregates messages to the same destination into a single + representation. + """ + def __init__(self, num_nodes: int, raw_msg_dim: int, memory_dim: int, + time_dim: int, message_module: Callable, + aggregator_module: Callable): + super(TGNMemory, self).__init__() + + self.num_nodes = num_nodes + self.raw_msg_dim = raw_msg_dim + self.memory_dim = memory_dim + self.time_dim = time_dim + + self.msg_s_module = message_module + self.msg_d_module = copy.deepcopy(message_module) + self.aggr_module = aggregator_module + self.time_enc = TimeEncoder(time_dim) + self.gru = GRUCell(message_module.out_channels, memory_dim) + + self.memory = self.create_parameter([num_nodes, memory_dim], dtype='float32', default_initializer=paddle.nn.initializer.Constant(0)) + last_update = self.create_parameter([self.num_nodes], dtype='int64', default_initializer=paddle.nn.initializer.Constant(0)) + self.last_update = last_update + self._assoc = self.create_parameter([num_nodes], dtype='int64', default_initializer=paddle.nn.initializer.Constant(0)) + + self.msg_s_store = {} + self.msg_d_store = {} + + self.reset_parameters() + + @property + def device(self) -> paddle.device: + return self.time_enc.lin.weight.device + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + if hasattr(self.msg_s_module, 'reset_parameters'): + self.msg_s_module.reset_parameters() + if hasattr(self.msg_d_module, 'reset_parameters'): + self.msg_d_module.reset_parameters() + if hasattr(self.aggr_module, 'reset_parameters'): + self.aggr_module.reset_parameters() + self.time_enc.reset_parameters() + self.gru.reset_parameters() + self.reset_state() + + def reset_state(self): + """Resets the memory to its initial state.""" + zeros(self.memory) + zeros(self.last_update) + self._reset_message_store() + + def detach(self): + """Detaches the memory from gradient computation.""" + self.memory.detach_() + + def forward(self, n_id: Tensor) -> Tuple[Tensor, Tensor]: + """Returns, for all nodes :obj:`n_id`, their current memory and their + last updated timestamp. + """ + if self.training: + memory, last_update = self._get_updated_memory(n_id) + else: + memory, last_update = self.memory[n_id], self.last_update[n_id] + + return memory, last_update + + def update_state(self, src: Tensor, dst: Tensor, t: Tensor, + raw_msg: Tensor): + """Updates the memory with newly encountered interactions + :obj:`(src, dst, t, raw_msg)`.""" + n_id = paddle.concat([src, dst]).unique() + + if self.training: + self._update_memory(n_id) + self._update_msg_store(src, dst, t, raw_msg, self.msg_s_store) + self._update_msg_store(dst, src, t, raw_msg, self.msg_d_store) + else: + self._update_msg_store(src, dst, t, raw_msg, self.msg_s_store) + self._update_msg_store(dst, src, t, raw_msg, self.msg_d_store) + self._update_memory(n_id) + + def _reset_message_store(self): + i = self.memory.new_empty((0, ), device=self.device, dtype='int64') + msg = self.memory.new_empty((0, self.raw_msg_dim), device=self.device) + self.msg_s_store = {j: (i, i, i, msg) for j in range(self.num_nodes)} + self.msg_d_store = {j: (i, i, i, msg) for j in range(self.num_nodes)} + + def _update_memory(self, n_id: Tensor): + memory, last_update = self._get_updated_memory(n_id) + self.memory[n_id] = memory + self.last_update[n_id] = last_update + + def _get_updated_memory(self, n_id: Tensor) -> Tuple[Tensor, Tensor]: + self._assoc[n_id] = paddle.arange(n_id.size(0), device=n_id.device) + + # Compute messages (src -> dst). + msg_s, t_s, src_s, dst_s = self._compute_msg(n_id, self.msg_s_store, + self.msg_s_module) + + # Compute messages (dst -> src). + msg_d, t_d, src_d, dst_d = self._compute_msg(n_id, self.msg_d_store, + self.msg_d_module) + + # Aggregate messages. + idx = paddle.concat([src_s, src_d], axis=0) + msg = paddle.concat([msg_s, msg_d], axis=0) + t = paddle.concat([t_s, t_d], axis=0) + aggr = self.aggr_module(msg, self._assoc[idx], t, n_id.size(0)) + + # Get local copy of updated memory. + memory = self.gru(aggr, self.memory[n_id]) + + # Get local copy of updated `last_update`. + dim_size = self.last_update.size(0) + last_update = scatter(t, idx, 0, dim_size, reduce='max')[n_id] + + return memory, last_update + + def _update_msg_store(self, src: Tensor, dst: Tensor, t: Tensor, + raw_msg: Tensor, msg_store: TGNMessageStoreType): + n_id, perm = src.sort() + n_id, count = n_id.unique_consecutive(return_counts=True) + for i, idx in zip(n_id.tolist(), perm.split(count.tolist())): + msg_store[i] = (src[idx], dst[idx], t[idx], raw_msg[idx]) + + def _compute_msg(self, n_id: Tensor, msg_store: TGNMessageStoreType, + msg_module: Callable): + data = [msg_store[i] for i in n_id.tolist()] + src, dst, t, raw_msg = list(zip(*data)) + src = paddle.concat(src, axis=0).to(self.device) + dst = paddle.concat(dst, axis=0).to(self.device) + t = paddle.concat(t, axis=0).to(self.device) + raw_msg = [m for i, m in enumerate(raw_msg) if m.numel() > 0 or i == 0] + raw_msg = paddle.concat(raw_msg, axis=0).to(self.device) + t_rel = t - self.last_update[src] + t_enc = self.time_enc(t_rel.to(raw_msg.dtype)) + + msg = msg_module(self.memory[src], self.memory[dst], raw_msg, t_enc) + + return msg, t, src, dst + + def train(self, mode: bool = True): + """Sets the module in training mode.""" + if self.training and not mode: + self._update_memory( + paddle.arange(self.num_nodes, device=self.memory.device)) + self._reset_message_store() + super(TGNMemory, self).train(mode) + + +class IdentityMessage(paddle.nn.Layer): + def __init__(self, raw_msg_dim: int, memory_dim: int, time_dim: int): + super(IdentityMessage, self).__init__() + self.out_channels = raw_msg_dim + 2 * memory_dim + time_dim + + def forward(self, z_src: Tensor, z_dst: Tensor, raw_msg: Tensor, + t_enc: Tensor): + return paddle.concat([z_src, z_dst, raw_msg, t_enc], axis=-1) + + +class LastAggregator(paddle.nn.Layer): + def forward(self, msg: Tensor, index: Tensor, t: Tensor, dim_size: int): + argmax = scatter_argmax(t, index, dim=0, dim_size=dim_size) + out = msg.new_zeros((dim_size, msg.shape[-1])) + mask = argmax < msg.shape[0] # Filter items with at least one entry. + out[mask] = msg[argmax[mask]] + return out + + +class MeanAggregator(paddle.nn.Layer): + def forward(self, msg: Tensor, index: Tensor, t: Tensor, dim_size: int): + return scatter(msg, index, dim=0, dim_size=dim_size, reduce='mean') + + +class TimeEncoder(paddle.nn.Layer): + def __init__(self, out_channels: int): + super(TimeEncoder, self).__init__() + self.out_channels = out_channels + self.lin = Linear(1, out_channels) + + def reset_parameters(self): + self.lin.reset_parameters() + + def forward(self, t: Tensor) -> Tensor: + return self.lin(t.reshape((-1, 1))).cos() + + +class LastNeighborLoader: + def __init__(self, num_nodes: int, size: int, device=None): + self.size = size + + self.neighbors = paddle.empty([num_nodes, size], dtype='int64', + device=device) + self.e_id = paddle.empty([num_nodes, size], dtype='int64', + device=device) + self._assoc = paddle.empty([num_nodes], dtype='int64', device=device) + + self.reset_state() + + def __call__(self, n_id: Tensor) -> Tuple[Tensor, Tensor, Tensor]: + neighbors = self.neighbors[n_id] + nodes = n_id.view(-1, 1).repeat(1, self.size) + e_id = self.e_id[n_id] + + mask = e_id >= 0 + neighbors, nodes, e_id = neighbors[mask], nodes[mask], e_id[mask] + + n_id = paddle.concat([n_id, neighbors]).unique() + self._assoc[n_id] = paddle.arange(n_id.size(0), device=n_id.device) + neighbors, nodes = self._assoc[neighbors], self._assoc[nodes] + + return n_id, paddle.stack([neighbors, nodes]), e_id + + def insert(self, src: Tensor, dst: Tensor): + neighbors = paddle.concat([src, dst], axis=0) + nodes = paddle.concat([dst, src], axis=0) + e_id = paddle.arange(self.cur_e_id, self.cur_e_id + src.size(0), + device=src.device).repeat(2) + self.cur_e_id += src.numel() + + nodes, perm = nodes.sort() + neighbors, e_id = neighbors[perm], e_id[perm] + + n_id = nodes.unique() + self._assoc[n_id] = paddle.arange(n_id.numel(), device=n_id.device) + + dense_id = paddle.arange(nodes.size(0), device=nodes.device) % self.size + dense_id += self._assoc[nodes].mul_(self.size) + + dense_e_id = e_id.new_full([n_id.numel() * self.size], -1) + dense_e_id[dense_id] = e_id + dense_e_id = dense_e_id.reshape([-1, self.size]) + + dense_neighbors = e_id.new_empty(n_id.numel() * self.size) + dense_neighbors[dense_id] = neighbors + dense_neighbors = dense_neighbors.reshape([-1, self.size]) + + e_id = paddle.concat([self.e_id[n_id, :self.size], dense_e_id], axis=-1) + neighbors = paddle.concat([self.neighbors[n_id, :self.size], dense_neighbors], axis=-1) + + e_id, perm = e_id.topk(self.size, axis=-1) + self.e_id[n_id] = e_id + self.neighbors[n_id] = paddle.gather(neighbors, 1, perm) + + def reset_state(self): + self.cur_e_id = 0 + self.e_id.fill_(-1) diff --git a/jointContribution/mattergen/paddle_geometric/nn/models/visnet.py b/jointContribution/mattergen/paddle_geometric/nn/models/visnet.py new file mode 100644 index 00000000..017afc90 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/models/visnet.py @@ -0,0 +1,1182 @@ +import math +from typing import Optional, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Embedding, LayerNorm, Linear, Layer, Silu + +from paddle_geometric.nn import MessagePassing, radius_graph +from paddle_geometric.utils import scatter + + +class CosineCutoff(Layer): + r"""Applies a cosine cutoff to the input distances. + + .. math:: + \text{cutoffs} = + \begin{cases} + 0.5 * (\cos(\frac{\text{distances} * \pi}{\text{cutoff}}) + 1.0), + & \text{if } \text{distances} < \text{cutoff} \\ + 0, & \text{otherwise} + \end{cases} + + Args: + cutoff (float): A scalar that determines the point at which the cutoff + is applied. + """ + def __init__(self, cutoff: float) -> None: + super().__init__() + self.cutoff = cutoff + + def forward(self, distances: Tensor) -> Tensor: + r"""Applies a cosine cutoff to the input distances. + + Args: + distances (paddle.Tensor): A tensor of distances. + + Returns: + cutoffs (paddle.Tensor): A tensor where the cosine function + has been applied to the distances, + but any values that exceed the cutoff are set to 0. + """ + cutoffs = 0.5 * (paddle.cos(distances * math.pi / self.cutoff) + 1.0) + cutoffs = cutoffs * (distances < self.cutoff).astype("float32") + return cutoffs + + +class ExpNormalSmearing(Layer): + r"""Applies exponential normal smearing to the input distances. + + .. math:: + \text{smeared\_dist} = \text{CosineCutoff}(\text{dist}) + * e^{-\beta * (e^{\alpha * (-\text{dist})} - \text{means})^2} + + Args: + cutoff (float, optional): A scalar that determines the point at which + the cutoff is applied. (default: :obj:`5.0`) + num_rbf (int, optional): The number of radial basis functions. + (default: :obj:`128`) + trainable (bool, optional): If set to :obj:`False`, the means and betas + of the RBFs will not be trained. (default: :obj:`True`) + """ + def __init__( + self, + cutoff: float = 5.0, + num_rbf: int = 128, + trainable: bool = True, + ) -> None: + super().__init__() + self.cutoff = cutoff + self.num_rbf = num_rbf + self.trainable = trainable + + self.cutoff_fn = CosineCutoff(cutoff) + self.alpha = 5.0 / cutoff + + means, betas = self._initial_params() + if trainable: + self.add_parameter("means", self.create_parameter(shape=means.shape, dtype=means.dtype, + default_initializer=paddle.nn.initializer.Assign(means))) + self.add_parameter("betas", self.create_parameter(shape=betas.shape, dtype=betas.dtype, + default_initializer=paddle.nn.initializer.Assign(betas))) + else: + self.register_buffer("means", means) + self.register_buffer("betas", betas) + + def _initial_params(self) -> Tuple[Tensor, Tensor]: + r"""Initializes the means and betas for the radial basis functions.""" + start_value = paddle.exp(paddle.to_tensor(-self.cutoff)) + means = paddle.linspace(start_value, 1, self.num_rbf) + betas = paddle.full([self.num_rbf], (2 / self.num_rbf * (1 - start_value))**-2) + return means, betas + + def reset_parameters(self): + r"""Resets the means and betas to their initial values.""" + means, betas = self._initial_params() + self.means.set_value(means) + self.betas.set_value(betas) + + def forward(self, dist: Tensor) -> Tensor: + r"""Applies the exponential normal smearing to the input distance. + + Args: + dist (paddle.Tensor): A tensor of distances. + """ + dist = paddle.unsqueeze(dist, axis=-1) + smeared_dist = self.cutoff_fn(dist) * paddle.exp( + -self.betas * (paddle.exp(self.alpha * (-dist)) - self.means)**2 + ) + return smeared_dist + + +class Sphere(Layer): + r"""Computes spherical harmonics of the input data. + + This module computes the spherical harmonics up to a given degree + :obj:`lmax` for the input tensor of 3D vectors. + The vectors are assumed to be given in Cartesian coordinates. + See `here `_ + for mathematical details. + + Args: + lmax (int, optional): The maximum degree of the spherical harmonics. + (default: :obj:`2`) + """ + def __init__(self, lmax: int = 2) -> None: + super().__init__() + self.lmax = lmax + + def forward(self, edge_vec: Tensor) -> Tensor: + r"""Computes the spherical harmonics of the input tensor. + + Args: + edge_vec (paddle.Tensor): A tensor of 3D vectors. + """ + return self._spherical_harmonics( + self.lmax, + edge_vec[..., 0], + edge_vec[..., 1], + edge_vec[..., 2], + ) + + @staticmethod + def _spherical_harmonics( + lmax: int, + x: Tensor, + y: Tensor, + z: Tensor, + ) -> Tensor: + r"""Computes the spherical harmonics up to degree :obj:`lmax` of the + input vectors. + + Args: + lmax (int): The maximum degree of the spherical harmonics. + x (paddle.Tensor): The x coordinates of the vectors. + y (paddle.Tensor): The y coordinates of the vectors. + z (paddle.Tensor): The z coordinates of the vectors. + """ + sh_1_0, sh_1_1, sh_1_2 = x, y, z + + if lmax == 1: + return paddle.stack([sh_1_0, sh_1_1, sh_1_2], axis=-1) + + sh_2_0 = math.sqrt(3.0) * x * z + sh_2_1 = math.sqrt(3.0) * x * y + y2 = paddle.pow(y, 2) + x2z2 = paddle.pow(x, 2) + paddle.pow(z, 2) + sh_2_2 = y2 - 0.5 * x2z2 + sh_2_3 = math.sqrt(3.0) * y * z + sh_2_4 = math.sqrt(3.0) / 2.0 * (paddle.pow(z, 2) - paddle.pow(x, 2)) + + if lmax == 2: + return paddle.stack([ + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + ], axis=-1) + + raise ValueError(f"'lmax' needs to be 1 or 2 (got {lmax})") + +class VecLayerNorm(paddle.nn.Layer): + r"""Applies layer normalization to the input data. + + This module applies a custom layer normalization to a tensor of vectors. + The normalization can either be :obj:`"max_min"` normalization, or no + normalization. + + Args: + hidden_channels (int): The number of hidden channels in the input. + trainable (bool): If set to :obj:`True`, the normalization weights are + trainable parameters. + norm_type (str, optional): The type of normalization to apply, one of + :obj:`"max_min"` or :obj:`None`. (default: :obj:`"max_min"`) + """ + def __init__( + self, + hidden_channels: int, + trainable: bool, + norm_type: Optional[str] = 'max_min', + ) -> None: + super().__init__() + + self.hidden_channels = hidden_channels + self.norm_type = norm_type + self.eps = 1e-12 + + weight = paddle.ones([self.hidden_channels]) + if trainable: + self.weight = self.create_parameter(shape=weight.shape, default_initializer=paddle.nn.initializer.Constant(1.0)) + else: + self.register_buffer('weight', weight) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets the normalization weights to their initial values.""" + paddle.assign(paddle.ones_like(self.weight), self.weight) + + def max_min_norm(self, vec: Tensor) -> Tensor: + r"""Applies max-min normalization to the input tensor. + + Args: + vec (paddle.Tensor): The input tensor. + """ + dist = paddle.norm(vec, axis=1, keepdim=True) + + if paddle.all(dist == 0): + return paddle.zeros_like(vec) + + dist = paddle.clip(dist, min=self.eps) + direct = vec / dist + + max_val = paddle.max(dist, axis=-1) + min_val = paddle.min(dist, axis=-1) + delta = max_val - min_val + delta = paddle.where(delta == 0, paddle.ones_like(delta), delta) + dist = (dist - paddle.unsqueeze(min_val, axis=(-1, -2))) / paddle.unsqueeze(delta, axis=(-1, -2)) + + return paddle.nn.functional.relu(dist) * direct + + def forward(self, vec: Tensor) -> Tensor: + r"""Applies the layer normalization to the input tensor. + + Args: + vec (paddle.Tensor): The input tensor. + """ + if vec.shape[1] == 3: + if self.norm_type == 'max_min': + vec = self.max_min_norm(vec) + return vec * paddle.unsqueeze(paddle.unsqueeze(self.weight, axis=0), axis=0) + elif vec.shape[1] == 8: + vec1, vec2 = paddle.split(vec, [3, 5], axis=1) + if self.norm_type == 'max_min': + vec1 = self.max_min_norm(vec1) + vec2 = self.max_min_norm(vec2) + vec = paddle.concat([vec1, vec2], axis=1) + return vec * paddle.unsqueeze(paddle.unsqueeze(self.weight, axis=0), axis=0) + + raise ValueError(f"'{self.__class__.__name__}' only supports 3 or 8 " + f"channels (got {vec.shape[1]})") + + +class Distance(paddle.nn.Layer): + r"""Computes the pairwise distances between atoms in a molecule. + + This module computes the pairwise distances between atoms in a molecule, + represented by their positions :obj:`pos`. + The distances are computed only between points that are within a certain + cutoff radius. + + Args: + cutoff (float): The cutoff radius beyond + which distances are not computed. + max_num_neighbors (int, optional): The maximum number of neighbors + considered for each point. (default: :obj:`32`) + add_self_loops (bool, optional): If set to :obj:`False`, will not + include self-loops. (default: :obj:`True`) + """ + def __init__( + self, + cutoff: float, + max_num_neighbors: int = 32, + add_self_loops: bool = True, + ) -> None: + super().__init__() + self.cutoff = cutoff + self.max_num_neighbors = max_num_neighbors + self.add_self_loops = add_self_loops + + def forward( + self, + pos: Tensor, + batch: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor]: + r"""Computes the pairwise distances between atoms in the molecule. + + Args: + pos (paddle.Tensor): The positions of the atoms in the molecule. + batch (paddle.Tensor): A batch vector, which assigns each node to a + specific example. + + Returns: + edge_index (paddle.Tensor): The indices of the edges in the graph. + edge_weight (paddle.Tensor): The distances between connected nodes. + edge_vec (paddle.Tensor): The vector differences between connected + nodes. + """ + edge_index = radius_graph( + pos, + r=self.cutoff, + batch=batch, + loop=self.add_self_loops, + max_num_neighbors=self.max_num_neighbors, + ) + edge_vec = pos[edge_index[0]] - pos[edge_index[1]] + + if self.add_self_loops: + mask = edge_index[0] != edge_index[1] + edge_weight = paddle.zeros([edge_vec.shape[0]], dtype=edge_vec.dtype) + edge_weight[mask] = paddle.norm(edge_vec[mask], axis=-1) + else: + edge_weight = paddle.norm(edge_vec, axis=-1) + + return edge_index, edge_weight, edge_vec + +class NeighborEmbedding(MessagePassing): + r"""The :class:`NeighborEmbedding` module from the `"Enhancing Geometric + Representations for Molecules with Equivariant Vector-Scalar Interactive + Message Passing" `_ paper. + + Args: + hidden_channels (int): The number of hidden channels in the node + embeddings. + num_rbf (int): The number of radial basis functions. + cutoff (float): The cutoff distance. + max_z (int, optional): The maximum atomic numbers. + (default: :obj:`100`) + """ + + def __init__( + self, + hidden_channels: int, + num_rbf: int, + cutoff: float, + max_z: int = 100, + ) -> None: + super().__init__(aggr='add') + self.embedding = Embedding(num_embeddings=max_z, embedding_dim=hidden_channels) + self.distance_proj = Linear(num_rbf, hidden_channels) + self.combine = Linear(hidden_channels * 2, hidden_channels) + self.cutoff = CosineCutoff(cutoff) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets the parameters of the module.""" + self.embedding.weight.set_value( + paddle.nn.initializer.Normal()(self.embedding.weight.shape) + ) + paddle.nn.initializer.XavierUniform()(self.distance_proj.weight) + paddle.nn.initializer.XavierUniform()(self.combine.weight) + if self.distance_proj.bias is not None: + self.distance_proj.bias.set_value(paddle.zeros_like(self.distance_proj.bias)) + if self.combine.bias is not None: + self.combine.bias.set_value(paddle.zeros_like(self.combine.bias)) + + def forward( + self, + z: Tensor, + x: Tensor, + edge_index: Tensor, + edge_weight: Tensor, + edge_attr: Tensor, + ) -> Tensor: + r"""Computes the neighborhood embedding of the nodes in the graph. + + Args: + z (paddle.Tensor): The atomic numbers. + x (paddle.Tensor): The node features. + edge_index (paddle.Tensor): The indices of the edges. + edge_weight (paddle.Tensor): The weights of the edges. + edge_attr (paddle.Tensor): The edge features. + + Returns: + x_neighbors (paddle.Tensor): The neighborhood embeddings of the + nodes. + """ + mask = edge_index[0] != edge_index[1] + if not paddle.all(mask): + edge_index = edge_index[:, mask] + edge_weight = edge_weight[mask] + edge_attr = edge_attr[mask] + + C = self.cutoff(edge_weight) + W = self.distance_proj(edge_attr) * C.unsqueeze(-1) + + x_neighbors = self.embedding(z) + x_neighbors = self.propagate(edge_index, x=x_neighbors, W=W) + x_neighbors = self.combine(paddle.concat([x, x_neighbors], axis=1)) + return x_neighbors + + def message(self, x_j: Tensor, W: Tensor) -> Tensor: + return x_j * W + +class EdgeEmbedding(Layer): + r"""The :class:`EdgeEmbedding` module from the `"Enhancing Geometric + Representations for Molecules with Equivariant Vector-Scalar Interactive + Message Passing" `_ paper. + + Args: + num_rbf (int): The number of radial basis functions. + hidden_channels (int): The number of hidden channels in the node + embeddings. + """ + + def __init__(self, num_rbf: int, hidden_channels: int) -> None: + super().__init__() + self.edge_proj = Linear(num_rbf, hidden_channels) + self.reset_parameters() + + def reset_parameters(self): + r"""Resets the parameters of the module.""" + paddle.nn.initializer.XavierUniform()(self.edge_proj.weight) + if self.edge_proj.bias is not None: + self.edge_proj.bias.set_value(paddle.zeros_like(self.edge_proj.bias)) + + def forward( + self, + edge_index: Tensor, + edge_attr: Tensor, + x: Tensor, + ) -> Tensor: + r"""Computes the edge embeddings of the graph. + + Args: + edge_index (paddle.Tensor): The indices of the edges. + edge_attr (paddle.Tensor): The edge features. + x (paddle.Tensor): The node features. + + Returns: + out_edge_attr (paddle.Tensor): The edge embeddings. + """ + x_j = paddle.gather(x, edge_index[0]) + x_i = paddle.gather(x, edge_index[1]) + return (x_i + x_j) * self.edge_proj(edge_attr) + +class ViS_MP(MessagePassing): + r"""The message passing module without vertex geometric features of the + equivariant vector-scalar interactive graph neural network (ViSNet) + from the `"Enhancing Geometric Representations for Molecules with + Equivariant Vector-Scalar Interactive Message Passing" + `_ paper. + + Args: + num_heads (int): The number of attention heads. + hidden_channels (int): The number of hidden channels in the node + embeddings. + cutoff (float): The cutoff distance. + vecnorm_type (str, optional): The type of normalization to apply to the + vectors. + trainable_vecnorm (bool): Whether the normalization weights are + trainable. + last_layer (bool, optional): Whether this is the last layer in the + model. (default: :obj:`False`) + """ + def __init__( + self, + num_heads: int, + hidden_channels: int, + cutoff: float, + vecnorm_type: Optional[str], + trainable_vecnorm: bool, + last_layer: bool = False, + ) -> None: + super().__init__(aggr='add', node_dim=0) + + if hidden_channels % num_heads != 0: + raise ValueError( + f"The number of hidden channels (got {hidden_channels}) must " + f"be evenly divisible by the number of attention heads " + f"(got {num_heads})") + + self.num_heads = num_heads + self.hidden_channels = hidden_channels + self.head_dim = hidden_channels // num_heads + self.last_layer = last_layer + + self.layernorm = LayerNorm(hidden_channels) + self.vec_layernorm = VecLayerNorm( + hidden_channels, + trainable=trainable_vecnorm, + norm_type=vecnorm_type, + ) + + self.act = Silu + self.attn_activation = Silu + + self.cutoff = CosineCutoff(cutoff) + + self.vec_proj = Linear(hidden_channels, hidden_channels * 3, False) + + self.q_proj = Linear(hidden_channels, hidden_channels) + self.k_proj = Linear(hidden_channels, hidden_channels) + self.v_proj = Linear(hidden_channels, hidden_channels) + self.dk_proj = Linear(hidden_channels, hidden_channels) + self.dv_proj = Linear(hidden_channels, hidden_channels) + + self.s_proj = Linear(hidden_channels, hidden_channels * 2) + if not self.last_layer: + self.f_proj = Linear(hidden_channels, hidden_channels) + self.w_src_proj = Linear(hidden_channels, hidden_channels, False) + self.w_trg_proj = Linear(hidden_channels, hidden_channels, False) + + self.o_proj = Linear(hidden_channels, hidden_channels * 3) + + self.reset_parameters() + + @staticmethod + def vector_rejection(vec: Tensor, d_ij: Tensor) -> Tensor: + r"""Computes the component of :obj:`vec` orthogonal to :obj:`d_ij`. + + Args: + vec (paddle.Tensor): The input vector. + d_ij (paddle.Tensor): The reference vector. + """ + vec_proj = paddle.sum(vec * d_ij.unsqueeze(2), axis=1, keepdim=True) + return vec - vec_proj * d_ij.unsqueeze(2) + + def reset_parameters(self): + r"""Resets the parameters of the module.""" + self.layernorm.reset_parameters() + self.vec_layernorm.reset_parameters() + paddle.nn.initializer.XavierUniform()(self.q_proj.weight) + self.q_proj.bias.set_value(paddle.zeros_like(self.q_proj.bias)) + paddle.nn.initializer.XavierUniform()(self.k_proj.weight) + self.k_proj.bias.set_value(paddle.zeros_like(self.k_proj.bias)) + paddle.nn.initializer.XavierUniform()(self.v_proj.weight) + self.v_proj.bias.set_value(paddle.zeros_like(self.v_proj.bias)) + paddle.nn.initializer.XavierUniform()(self.o_proj.weight) + self.o_proj.bias.set_value(paddle.zeros_like(self.o_proj.bias)) + paddle.nn.initializer.XavierUniform()(self.s_proj.weight) + self.s_proj.bias.set_value(paddle.zeros_like(self.s_proj.bias)) + + if not self.last_layer: + paddle.nn.initializer.XavierUniform()(self.f_proj.weight) + self.f_proj.bias.set_value(paddle.zeros_like(self.f_proj.bias)) + paddle.nn.initializer.XavierUniform()(self.w_src_proj.weight) + paddle.nn.initializer.XavierUniform()(self.w_trg_proj.weight) + + paddle.nn.initializer.XavierUniform()(self.vec_proj.weight) + paddle.nn.initializer.XavierUniform()(self.dk_proj.weight) + self.dk_proj.bias.set_value(paddle.zeros_like(self.dk_proj.bias)) + paddle.nn.initializer.XavierUniform()(self.dv_proj.weight) + self.dv_proj.bias.set_value(paddle.zeros_like(self.dv_proj.bias)) + + def forward( + self, + x: Tensor, + vec: Tensor, + edge_index: Tensor, + r_ij: Tensor, + f_ij: Tensor, + d_ij: Tensor, + ) -> Tuple[Tensor, Tensor, Optional[Tensor]]: + r"""Computes the residual scalar and vector features of the nodes and + scalar features of the edges. + + Args: + x (paddle.Tensor): The scalar features of the nodes. + vec (paddle.Tensor):The vector features of the nodes. + edge_index (paddle.Tensor): The indices of the edges. + r_ij (paddle.Tensor): The distances between connected nodes. + f_ij (paddle.Tensor): The scalar features of the edges. + d_ij (paddle.Tensor): The unit vectors of the edges. + + Returns: + dx (paddle.Tensor): The residual scalar features of the nodes. + dvec (paddle.Tensor): The residual vector features of the nodes. + df_ij (paddle.Tensor, optional): The residual scalar features of the + edges, or :obj:`None` if this is the last layer. + """ + x = self.layernorm(x) + vec = self.vec_layernorm(vec) + + q = self.q_proj(x).reshape([-1, self.num_heads, self.head_dim]) + k = self.k_proj(x).reshape([-1, self.num_heads, self.head_dim]) + v = self.v_proj(x).reshape([-1, self.num_heads, self.head_dim]) + dk = self.act(self.dk_proj(f_ij)) + dk = dk.reshape([-1, self.num_heads, self.head_dim]) + dv = self.act(self.dv_proj(f_ij)) + dv = dv.reshape([-1, self.num_heads, self.head_dim]) + + vec1, vec2, vec3 = paddle.split(self.vec_proj(vec), + self.hidden_channels, axis=-1) + vec_dot = paddle.sum(vec1 * vec2, axis=1) + + x, vec_out = self.propagate(edge_index, q=q, k=k, v=v, dk=dk, dv=dv, + vec=vec, r_ij=r_ij, d_ij=d_ij) + + o1, o2, o3 = paddle.split(self.o_proj(x), self.hidden_channels, axis=1) + dx = vec_dot * o2 + o3 + dvec = vec3 * o1.unsqueeze(1) + vec_out + if not self.last_layer: + df_ij = self.edge_updater(edge_index, vec=vec, d_ij=d_ij, + f_ij=f_ij) + return dx, dvec, df_ij + else: + return dx, dvec, None + + def message(self, q_i: Tensor, k_j: Tensor, v_j: Tensor, vec_j: Tensor, + dk: Tensor, dv: Tensor, r_ij: Tensor, + d_ij: Tensor) -> Tuple[Tensor, Tensor]: + attn = paddle.sum(q_i * k_j * dk, axis=-1) + attn = self.attn_activation(attn) * self.cutoff(r_ij).unsqueeze(1) + + v_j = v_j * dv + v_j = (v_j * attn.unsqueeze(2)).reshape([-1, self.hidden_channels]) + + s1, s2 = paddle.split(self.act(self.s_proj(v_j)), self.hidden_channels, + axis=1) + vec_j = vec_j * s1.unsqueeze(1) + s2.unsqueeze(1) * d_ij.unsqueeze(2) + + return v_j, vec_j + + def edge_update(self, vec_i: Tensor, vec_j: Tensor, d_ij: Tensor, + f_ij: Tensor) -> Tensor: + w1 = self.vector_rejection(self.w_trg_proj(vec_i), d_ij) + w2 = self.vector_rejection(self.w_src_proj(vec_j), -d_ij) + w_dot = paddle.sum(w1 * w2, axis=1) + df_ij = self.act(self.f_proj(f_ij)) * w_dot + return df_ij + + def aggregate( + self, + features: Tuple[Tensor, Tensor], + index: Tensor, + ptr: Optional[Tensor], + dim_size: Optional[int], + ) -> Tuple[Tensor, Tensor]: + x, vec = features + x = paddle_geometric.utils.scatter(x, index, dim=self.node_dim, dim_size=dim_size) + vec = paddle_geometric.utils.scatter(vec, index, dim=self.node_dim, dim_size=dim_size) + return x, vec +class ViS_MP_Vertex(ViS_MP): + r""" + The message passing module with vertex geometric features for the + equivariant vector-scalar interactive graph neural network (ViSNet), + introduced in the paper: + "Enhancing Geometric Representations for Molecules with + Equivariant Vector-Scalar Interactive Message Passing" + (). + + Args: + num_heads (int): The number of attention heads. + hidden_channels (int): The number of hidden channels in the node embeddings. + cutoff (float): The cutoff distance. + vecnorm_type (str, optional): The type of normalization applied to the vectors. + trainable_vecnorm (bool): Whether the normalization weights are trainable. + last_layer (bool, optional): If True, this is the last layer in the model. Defaults to False. + """ + def __init__( + self, + num_heads: int, + hidden_channels: int, + cutoff: float, + vecnorm_type: Optional[str], + trainable_vecnorm: bool, + last_layer: bool = False, + ) -> None: + super().__init__(num_heads, hidden_channels, cutoff, vecnorm_type, + trainable_vecnorm, last_layer) + + if not self.last_layer: + self.f_proj = paddle.nn.Linear(hidden_channels, hidden_channels * 2) + self.t_src_proj = paddle.nn.Linear(hidden_channels, hidden_channels, bias_attr=False) + self.t_trg_proj = paddle.nn.Linear(hidden_channels, hidden_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + """ + Resets the parameters of the module. + """ + super().reset_parameters() + + if not self.last_layer: + if hasattr(self, 't_src_proj'): + paddle.nn.initializer.XavierUniform()(self.t_src_proj.weight) + if hasattr(self, 't_trg_proj'): + paddle.nn.initializer.XavierUniform()(self.t_trg_proj.weight) + + def edge_update(self, vec_i: Tensor, vec_j: Tensor, d_ij: Tensor, + f_ij: Tensor) -> Tensor: + """ + Updates the edge features. + + Args: + vec_i (Tensor): Vector features of the source nodes. + vec_j (Tensor): Vector features of the target nodes. + d_ij (Tensor): Directional vectors between nodes. + f_ij (Tensor): Scalar features of the edges. + + Returns: + Tensor: Updated edge features. + """ + # Compute the directional vector rejections. + w1 = self.vector_rejection(self.w_trg_proj(vec_i), d_ij) + w2 = self.vector_rejection(self.w_src_proj(vec_j), -d_ij) + w_dot = paddle.sum(w1 * w2, axis=1) + + t1 = self.vector_rejection(self.t_trg_proj(vec_i), d_ij) + t2 = self.vector_rejection(self.t_src_proj(vec_i), -d_ij) + t_dot = paddle.sum(t1 * t2, axis=1) + + # Split the projected features into two components and compute the final edge features. + f1, f2 = paddle.split(self.act(self.f_proj(f_ij)), self.hidden_channels, axis=-1) + + return f1 * w_dot + f2 * t_dot + + +class ViSNetBlock(paddle.nn.Layer): + r""" + The representation module of the equivariant vector-scalar + interactive graph neural network (ViSNet) from the paper: + "Enhancing Geometric Representations for Molecules with + Equivariant Vector-Scalar Interactive Message Passing" + (). + + Args: + lmax (int, optional): The maximum degree of the spherical harmonics. + (default: :obj:`1`) + vecnorm_type (str, optional): The type of normalization to apply to the + vectors. (default: :obj:`None`) + trainable_vecnorm (bool, optional): Whether the normalization weights + are trainable. (default: :obj:`False`) + num_heads (int, optional): The number of attention heads. + (default: :obj:`8`) + num_layers (int, optional): The number of layers in the network. + (default: :obj:`6`) + hidden_channels (int, optional): The number of hidden channels in the + node embeddings. (default: :obj:`128`) + num_rbf (int, optional): The number of radial basis functions. + (default: :obj:`32`) + trainable_rbf (bool, optional): Whether the radial basis function + parameters are trainable. (default: :obj:`False`) + max_z (int, optional): The maximum atomic numbers. + (default: :obj:`100`) + cutoff (float, optional): The cutoff distance. (default: :obj:`5.0`) + max_num_neighbors (int, optional): The maximum number of neighbors + considered for each atom. (default: :obj:`32`) + vertex (bool, optional): Whether to use vertex geometric features. + (default: :obj:`False`) + """ + def __init__( + self, + lmax: int = 1, + vecnorm_type: Optional[str] = None, + trainable_vecnorm: bool = False, + num_heads: int = 8, + num_layers: int = 6, + hidden_channels: int = 128, + num_rbf: int = 32, + trainable_rbf: bool = False, + max_z: int = 100, + cutoff: float = 5.0, + max_num_neighbors: int = 32, + vertex: bool = False, + ) -> None: + super().__init__() + + self.lmax = lmax + self.vecnorm_type = vecnorm_type + self.trainable_vecnorm = trainable_vecnorm + self.num_heads = num_heads + self.num_layers = num_layers + self.hidden_channels = hidden_channels + self.num_rbf = num_rbf + self.trainable_rbf = trainable_rbf + self.max_z = max_z + self.cutoff = cutoff + self.max_num_neighbors = max_num_neighbors + + self.embedding = paddle.nn.Embedding(max_z, hidden_channels) + self.distance = Distance(cutoff, max_num_neighbors=max_num_neighbors) + self.sphere = Sphere(lmax=lmax) + self.distance_expansion = ExpNormalSmearing(cutoff, num_rbf, trainable_rbf) + self.neighbor_embedding = NeighborEmbedding(hidden_channels, num_rbf, cutoff, max_z) + self.edge_embedding = EdgeEmbedding(num_rbf, hidden_channels) + + self.vis_mp_layers = paddle.nn.LayerList() + vis_mp_kwargs = dict( + num_heads=num_heads, + hidden_channels=hidden_channels, + cutoff=cutoff, + vecnorm_type=vecnorm_type, + trainable_vecnorm=trainable_vecnorm, + ) + vis_mp_class = ViS_MP if not vertex else ViS_MP_Vertex + for _ in range(num_layers - 1): + layer = vis_mp_class(last_layer=False, **vis_mp_kwargs) + self.vis_mp_layers.append(layer) + self.vis_mp_layers.append(vis_mp_class(last_layer=True, **vis_mp_kwargs)) + + self.out_norm = paddle.nn.LayerNorm(hidden_channels) + self.vec_out_norm = VecLayerNorm( + hidden_channels, + trainable=trainable_vecnorm, + norm_type=vecnorm_type, + ) + + self.reset_parameters() + + def reset_parameters(self): + """ + Resets the parameters of the module. + """ + self.embedding.weight.set_value(paddle.ones_like(self.embedding.weight)) + self.distance_expansion.reset_parameters() + self.neighbor_embedding.reset_parameters() + self.edge_embedding.reset_parameters() + for layer in self.vis_mp_layers: + layer.reset_parameters() + self.out_norm.reset_parameters() + self.vec_out_norm.reset_parameters() + + def forward( + self, + z: Tensor, + pos: Tensor, + batch: Tensor, + ) -> Tuple[Tensor, Tensor]: + """ + Computes the scalar and vector features of the nodes. + + Args: + z (paddle.Tensor): The atomic numbers. + pos (paddle.Tensor): The coordinates of the atoms. + batch (paddle.Tensor): A batch vector, which assigns each node to a + specific example. + + Returns: + x (paddle.Tensor): The scalar features of the nodes. + vec (paddle.Tensor): The vector features of the nodes. + """ + x = self.embedding(z) + edge_index, edge_weight, edge_vec = self.distance(pos, batch) + edge_attr = self.distance_expansion(edge_weight) + mask = edge_index[0] != edge_index[1] + edge_vec[mask] = edge_vec[mask] / paddle.norm(edge_vec[mask], axis=1, keepdim=True) + edge_vec = self.sphere(edge_vec) + x = self.neighbor_embedding(z, x, edge_index, edge_weight, edge_attr) + vec = paddle.zeros([x.shape[0], ((self.lmax + 1) ** 2) - 1, x.shape[1]], + dtype=x.dtype) + edge_attr = self.edge_embedding(edge_index, edge_attr, x) + + for attn in self.vis_mp_layers[:-1]: + dx, dvec, dedge_attr = attn(x, vec, edge_index, edge_weight, edge_attr, edge_vec) + x = x + dx + vec = vec + dvec + edge_attr = edge_attr + dedge_attr + + dx, dvec, _ = self.vis_mp_layers[-1](x, vec, edge_index, edge_weight, edge_attr, edge_vec) + x = x + dx + vec = vec + dvec + + x = self.out_norm(x) + vec = self.vec_out_norm(vec) + + return x, vec +class GatedEquivariantBlock(paddle.nn.Layer): + r""" + Applies a gated equivariant operation to scalar features and vector + features from the paper: + "Enhancing Geometric Representations for Molecules with Equivariant + Vector-Scalar Interactive Message Passing" + (). + + Args: + hidden_channels (int): The number of hidden channels in the node + embeddings. + out_channels (int): The number of output channels. + intermediate_channels (int, optional): The number of channels in the + intermediate layer, or :obj:`None` to use the same number as + :obj:`hidden_channels`. (default: :obj:`None`) + scalar_activation (bool, optional): Whether to apply a scalar + activation function to the output node features. + (default: obj:`False`) + """ + def __init__( + self, + hidden_channels: int, + out_channels: int, + intermediate_channels: Optional[int] = None, + scalar_activation: bool = False, + ) -> None: + super().__init__() + self.out_channels = out_channels + + if intermediate_channels is None: + intermediate_channels = hidden_channels + + self.vec1_proj = paddle.nn.Linear(hidden_channels, hidden_channels, bias_attr=False) + self.vec2_proj = paddle.nn.Linear(hidden_channels, out_channels, bias_attr=False) + + self.update_net = paddle.nn.Sequential( + paddle.nn.Linear(hidden_channels * 2, intermediate_channels), + paddle.nn.Silu(), + paddle.nn.Linear(intermediate_channels, out_channels * 2), + ) + + self.act = paddle.nn.Silu() if scalar_activation else None + + self.reset_parameters() + + def reset_parameters(self): + """Resets the parameters of the module.""" + paddle.nn.initializer.XavierUniform()(self.vec1_proj.weight) + paddle.nn.initializer.XavierUniform()(self.vec2_proj.weight) + paddle.nn.initializer.XavierUniform()(self.update_net[0].weight) + paddle.nn.initializer.Constant(value=0.0)(self.update_net[0].bias) + paddle.nn.initializer.XavierUniform()(self.update_net[2].weight) + paddle.nn.initializer.Constant(value=0.0)(self.update_net[2].bias) + + def forward(self, x: Tensor, v: Tensor) -> Tuple[Tensor, Tensor]: + """ + Applies a gated equivariant operation to node features and vector + features. + + Args: + x (paddle.Tensor): The scalar features of the nodes. + v (paddle.Tensor): The vector features of the nodes. + """ + vec1 = paddle.norm(self.vec1_proj(v), axis=-2) + vec2 = self.vec2_proj(v) + + x = paddle.concat([x, vec1], axis=-1) + x, v = paddle.split(self.update_net(x), self.out_channels, axis=-1) + v = v.unsqueeze(1) * vec2 + + if self.act is not None: + x = self.act(x) + + return x, v + + +class EquivariantScalar(paddle.nn.Layer): + r""" + Computes final scalar outputs based on node features and vector + features. + + Args: + hidden_channels (int): The number of hidden channels in the node + embeddings. + """ + def __init__(self, hidden_channels: int) -> None: + super().__init__() + + self.output_network = paddle.nn.LayerList([ + GatedEquivariantBlock( + hidden_channels, + hidden_channels // 2, + scalar_activation=True, + ), + GatedEquivariantBlock( + hidden_channels // 2, + 1, + scalar_activation=False, + ), + ]) + + self.reset_parameters() + + def reset_parameters(self): + """Resets the parameters of the module.""" + for layer in self.output_network: + layer.reset_parameters() + + def pre_reduce(self, x: Tensor, v: Tensor) -> Tensor: + """ + Computes the final scalar outputs. + + Args: + x (paddle.Tensor): The scalar features of the nodes. + v (paddle.Tensor): The vector features of the nodes. + + Returns: + out (paddle.Tensor): The final scalar outputs of the nodes. + """ + for layer in self.output_network: + x, v = layer(x, v) + + return x + v.sum() * 0 + +class Atomref(paddle.nn.Layer): + r""" + Adds atom reference values to atomic energies. + + Args: + atomref (paddle.Tensor, optional): A tensor of atom reference values, + or :obj:`None` if not provided. (default: :obj:`None`) + max_z (int, optional): The maximum atomic numbers. + (default: :obj:`100`) + """ + def __init__( + self, + atomref: Optional[Tensor] = None, + max_z: int = 100, + ) -> None: + super().__init__() + + if atomref is None: + atomref = paddle.zeros((max_z, 1)) + else: + atomref = paddle.to_tensor(atomref, dtype=paddle.float32) + + if len(atomref.shape) == 1: + atomref = paddle.unsqueeze(atomref, axis=-1) + + self.register_buffer('initial_atomref', atomref) + self.atomref = Embedding(len(atomref), 1) + + self.reset_parameters() + + def reset_parameters(self): + """Resets the parameters of the module.""" + self.atomref.weight.set_value(self.initial_atomref) + + def forward(self, x: Tensor, z: Tensor) -> Tensor: + """ + Adds atom reference values to atomic energies. + + Args: + x (paddle.Tensor): The atomic energies. + z (paddle.Tensor): The atomic numbers. + """ + return x + self.atomref(z) + + +class ViSNet(paddle.nn.Layer): + r""" + Implements the equivariant vector-scalar interactive graph neural network + (ViSNet). + + Args: + lmax (int, optional): The maximum degree of the spherical harmonics. + (default: :obj:`1`) + vecnorm_type (str, optional): The type of normalization to apply to the + vectors. (default: :obj:`None`) + trainable_vecnorm (bool, optional): Whether the normalization weights + are trainable. (default: :obj:`False`) + num_heads (int, optional): The number of attention heads. + (default: :obj:`8`) + num_layers (int, optional): The number of layers in the network. + (default: :obj:`6`) + hidden_channels (int, optional): The number of hidden channels in the + node embeddings. (default: :obj:`128`) + num_rbf (int, optional): The number of radial basis functions. + (default: :obj:`32`) + trainable_rbf (bool, optional): Whether the radial basis function + parameters are trainable. (default: :obj:`False`) + max_z (int, optional): The maximum atomic numbers. + (default: :obj:`100`) + cutoff (float, optional): The cutoff distance. (default: :obj:`5.0`) + max_num_neighbors (int, optional): The maximum number of neighbors + considered for each atom. (default: :obj:`32`) + vertex (bool, optional): Whether to use vertex geometric features. + (default: :obj:`False`) + atomref (paddle.Tensor, optional): A tensor of atom reference values, + or :obj:`None` if not provided. (default: :obj:`None`) + reduce_op (str, optional): The type of reduction operation to apply + (:obj:`"sum"`, :obj:`"mean"`). (default: :obj:`"sum"`) + mean (float, optional): The mean of the output distribution. + (default: :obj:`0.0`) + std (float, optional): The standard deviation of the output + distribution. (default: :obj:`1.0`) + derivative (bool, optional): Whether to compute the derivative of the + output with respect to the positions. (default: :obj:`False`) + """ + def __init__( + self, + lmax: int = 1, + vecnorm_type: Optional[str] = None, + trainable_vecnorm: bool = False, + num_heads: int = 8, + num_layers: int = 6, + hidden_channels: int = 128, + num_rbf: int = 32, + trainable_rbf: bool = False, + max_z: int = 100, + cutoff: float = 5.0, + max_num_neighbors: int = 32, + vertex: bool = False, + atomref: Optional[Tensor] = None, + reduce_op: str = "sum", + mean: float = 0.0, + std: float = 1.0, + derivative: bool = False, + ) -> None: + super().__init__() + + self.representation_model = ViSNetBlock( + lmax=lmax, + vecnorm_type=vecnorm_type, + trainable_vecnorm=trainable_vecnorm, + num_heads=num_heads, + num_layers=num_layers, + hidden_channels=hidden_channels, + num_rbf=num_rbf, + trainable_rbf=trainable_rbf, + max_z=max_z, + cutoff=cutoff, + max_num_neighbors=max_num_neighbors, + vertex=vertex, + ) + + self.output_model = EquivariantScalar(hidden_channels=hidden_channels) + self.prior_model = Atomref(atomref=atomref, max_z=max_z) + self.reduce_op = reduce_op + self.derivative = derivative + + self.register_buffer('mean', paddle.to_tensor(mean, dtype=paddle.float32)) + self.register_buffer('std', paddle.to_tensor(std, dtype=paddle.float32)) + + self.reset_parameters() + + def reset_parameters(self): + """Resets the parameters of the module.""" + self.representation_model.reset_parameters() + self.output_model.reset_parameters() + if self.prior_model is not None: + self.prior_model.reset_parameters() + + def forward( + self, + z: Tensor, + pos: Tensor, + batch: Tensor, + ) -> Tuple[Tensor, Optional[Tensor]]: + """ + Computes the energies or properties (forces) for a batch of molecules. + + Args: + z (paddle.Tensor): The atomic numbers. + pos (paddle.Tensor): The coordinates of the atoms. + batch (paddle.Tensor): A batch vector, which assigns each node to + a specific example. + + Returns: + y (paddle.Tensor): The energies or properties for each molecule. + dy (paddle.Tensor, optional): The negative derivative of energies. + """ + if self.derivative: + pos.stop_gradient = False + + x, v = self.representation_model(z, pos, batch) + x = self.output_model.pre_reduce(x, v) + x = x * self.std + + if self.prior_model is not None: + x = self.prior_model(x, z) + + y = scatter(x, batch, dim=0, reduce=self.reduce_op) + y = y + self.mean + + if self.derivative: + dy = paddle.grad( + outputs=[y], + inputs=[pos], + grad_outputs=paddle.ones_like(y), + retain_graph=True, + create_graph=True, + )[0] + if dy is None: + raise RuntimeError( + "Autograd returned None for the force prediction.") + return y, -dy + + return y, None \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/module_dict.py b/jointContribution/mattergen/paddle_geometric/nn/module_dict.py new file mode 100644 index 00000000..ab12a7ae --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/module_dict.py @@ -0,0 +1,69 @@ +from typing import Final, Iterable, Mapping, Optional, Tuple, Union + +import paddle +from paddle.nn import Layer + +Key = Union[str, Tuple[str, ...]] + + +# `paddle.nn.LayerDict` doesn't allow `.` to be used in key names. +# This `LayerDict` will support it by converting the `.` to `#` in the +# internal representation and converts it back to `.` in the external +# representation. It also allows passing tuples as keys. +class ModuleDict(paddle.nn.LayerDict): + CLASS_ATTRS: Final[Tuple[str, ...]] = tuple(dir(paddle.nn.LayerDict)) + + def __init__( + self, + layers: Optional[Mapping[Union[str, Tuple[str, ...]], Layer]] = None, + ): + if layers is not None: # Replace the keys in layers: + layers = { + self.to_internal_key(key): layer + for key, layer in layers.items() + } + super().__init__(layers) + + @classmethod + def to_internal_key(cls, key: Key) -> str: + if isinstance(key, tuple): # LayerDict can't handle tuples as keys + assert len(key) > 1 + key = f"<{'___'.join(key)}>" + assert isinstance(key, str) + + # LayerDict cannot handle keys that exist as class attributes: + if key in cls.CLASS_ATTRS: + key = f'<{key}>' + + # LayerDict cannot handle dots in keys: + return key.replace('.', '#') + + @classmethod + def to_external_key(cls, key: str) -> Key: + key = key.replace('#', '.') + + if key[0] == '<' and key[-1] == '>' and key[1:-1] in cls.CLASS_ATTRS: + key = key[1:-1] + + if key[0] == '<' and key[-1] == '>' and '___' in key: + key = tuple(key[1:-1].split('___')) + + return key + + def __getitem__(self, key: Key) -> Layer: + return super().__getitem__(self.to_internal_key(key)) + + def __setitem__(self, key: Key, layer: Layer): + return super().__setitem__(self.to_internal_key(key), layer) + + def __delitem__(self, key: Key): + return super().__delitem__(self.to_internal_key(key)) + + def __contains__(self, key: Key) -> bool: + return super().__contains__(self.to_internal_key(key)) + + def keys(self) -> Iterable[Key]: + return [self.to_external_key(key) for key in super().keys()] + + def items(self) -> Iterable[Tuple[Key, Layer]]: + return [(self.to_external_key(k), v) for k, v in super().items()] diff --git a/jointContribution/mattergen/paddle_geometric/nn/nlp/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/nlp/__init__.py new file mode 100644 index 00000000..c101a359 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/nlp/__init__.py @@ -0,0 +1,7 @@ +from .sentence_transformer import SentenceTransformer +from .llm import LLM + +__all__ = classes = [ + 'SentenceTransformer', + 'LLM', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/nlp/llm.py b/jointContribution/mattergen/paddle_geometric/nn/nlp/llm.py new file mode 100644 index 00000000..12d20685 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/nlp/llm.py @@ -0,0 +1,317 @@ +import warnings +from contextlib import nullcontext +from typing import Any, Dict, List, Optional + +import paddle +from paddle import Tensor + +try: + from transformers.tokenization_utils_base import BatchEncoding +except ImportError: + BatchEncoding = Dict + +BOS = '[INST]' +EOS_USER = '[/INST]' +EOS = '[/s]' +IGNORE_INDEX = -100 +MAX_TXT_LEN = 512 +MAX_NEW_TOKENS = 32 +PAD_TOKEN_ID = 0 +PADDING_SIDE = 'left' + + +def get_llm_kwargs(required_memory: int, dtype=paddle.float32) -> Dict[str, Any]: + paddle.cuda.empty_cache() + + gpu_memory: List[int] = [] + for i in range(paddle.device.cuda.device_count()): + gpu_memory.append(paddle.device.cuda.memory_allocated(i) // 1024**3) + if sum(gpu_memory) >= required_memory: + break + + if sum(gpu_memory) < required_memory: + gpu_memory = [] # If not enough VRAM, use pure CPU. + + kwargs = dict(revision='main') + if len(gpu_memory) > 0: + kwargs['max_memory'] = { + i: f'{memory}GiB' + for i, memory in enumerate(gpu_memory) + } + kwargs['low_cpu_mem_usage'] = True + kwargs['device_map'] = 'auto' + kwargs['dtype'] = dtype + + return kwargs + + +class LLM(paddle.nn.Layer): + r"""A wrapper around a Large Language Model (LLM) from HuggingFace. + + model_name (str): The HuggingFace model name, *e.g.*, :obj:`"llama2"` or + :obj:`"gemma"`. + num_params (int): An integer representing how many parameters the + HuggingFace model has, in billions. This is used to automatically + allocate the correct number of GPUs needed, given the available GPU + memory of your GPUs. + dtype (paddle.dtype, optional): The data type to use for the LLM. + (default :obj: `paddle.float16`) + """ + def __init__( + self, + model_name: str, + num_params: int, + dtype=paddle.float16, + ) -> None: + super().__init__() + + self.model_name = model_name + + from transformers import AutoModelForCausalLM, AutoTokenizer + + required_memory = 85 * num_params / 7 + kwargs = get_llm_kwargs(required_memory, dtype) + + print(f"Setting up '{model_name}' with configuration: {kwargs}") + self.tokenizer = AutoTokenizer.from_pretrained( + model_name, + use_fast=False, + ) + self.tokenizer.pad_token_id = PAD_TOKEN_ID + self.tokenizer.padding_side = PADDING_SIDE + self.llm = AutoModelForCausalLM.from_pretrained(model_name, **kwargs) + self.word_embedding = self.llm.model.get_input_embeddings() + + if 'max_memory' not in kwargs: # Pure CPU: + warnings.warn("LLM is being used on CPU, which may be slow") + self.device = paddle.device('cpu') + self.autocast_context = nullcontext() + else: + self.device = self.llm.device + self.autocast_context = paddle.amp.autocast('gpu', dtype=dtype) + + def _encode_inputs( + self, + question: List[str], + context: Optional[List[str]] = None, + ) -> tuple: + batch_size = len(question) + questions = self.tokenizer(question, add_special_tokens=False) + if context is not None: + context = self.tokenizer(context, add_special_tokens=False) + + eos_user_tokens = self.tokenizer(EOS_USER, add_special_tokens=False) + bos_token = self.tokenizer( + BOS, + add_special_tokens=False, + return_tensors='pd', + ).input_ids[0].to(self.device) + bos_embeds = self.word_embedding(bos_token) + pad_token = paddle.to_tensor(self.tokenizer.pad_token_id, + device=self.device) + pad_embeds = self.word_embedding(pad_token).unsqueeze(0) + return (batch_size, questions, context, eos_user_tokens, bos_embeds, + pad_embeds) + + def _label_input_ids( + self, + i: int, + label: BatchEncoding, + eos_tokens: BatchEncoding, + ) -> List[int]: + label_input_ids = label.input_ids[i][:MAX_NEW_TOKENS] + label_input_ids = label_input_ids + eos_tokens.input_ids + return label_input_ids + + def _input_ids( + self, + i: int, + context: BatchEncoding, + question: BatchEncoding, + eos_user_tokens: BatchEncoding, + ) -> List[int]: + input_ids: List[int] = [] + if context is not None: + input_ids += context.input_ids[i][:MAX_TXT_LEN] + input_ids += question.input_ids[i] + input_ids += eos_user_tokens.input_ids + return input_ids + + def _inputs_embeds( + self, + i: int, + input_ids: List[int], + bos_embeds: Tensor, + embedding: Optional[List[Tensor]] = None, + ) -> Tensor: + inputs_embeds = self.word_embedding( + paddle.to_tensor(input_ids, device=self.device)) + + to_cat = [bos_embeds] + if embedding is not None and embedding[i] is not None: + to_cat.append(embedding[i]) + to_cat.append(inputs_embeds) + return paddle.concat(to_cat, axis=0).to(self.device) + + def _append_embeds( + self, + inputs_embeds: Tensor, + batch_inputs_embeds: List[Tensor], + batch_attention_mask: List[List[int]], + label_input_ids: List[int] = None, + batch_label_input_ids: Optional[List[List[int]]] = None, + ) -> tuple: + batch_inputs_embeds.append(inputs_embeds) + batch_attention_mask.append([1] * inputs_embeds.shape[0]) + if label_input_ids is not None: + pad = inputs_embeds.shape[0] - len(label_input_ids) + label_input_ids = [IGNORE_INDEX] * pad + label_input_ids + batch_label_input_ids.append(label_input_ids) + return batch_inputs_embeds, batch_attention_mask, batch_label_input_ids + + def _pad_embeds( + self, + pad_embeds: Tensor, + batch_inputs_embeds: List[Tensor], + batch_attention_mask: List[List[int]], + batch_label_input_ids: Optional[List[List[int]]] = None, + ) -> tuple: + max_length = max([x.shape[0] for x in batch_inputs_embeds]) + batch_size = len(batch_inputs_embeds) + for i in range(batch_size): + pad = max_length - batch_inputs_embeds[i].shape[0] + batch_inputs_embeds[i] = paddle.concat([pad_embeds.repeat(pad, 1), + batch_inputs_embeds[i]]) + batch_attention_mask[i] = [0] * pad + batch_attention_mask[i] + if batch_label_input_ids is not None: + tmp = [IGNORE_INDEX] * pad + batch_label_input_ids[i] + batch_label_input_ids[i] = tmp + inputs_embeds = paddle.stack(batch_inputs_embeds, axis=0) + attention_mask = paddle.to_tensor(batch_attention_mask, device=self.device) + label_input_ids = None + if batch_label_input_ids is not None: + label_input_ids = paddle.to_tensor(batch_label_input_ids, + device=self.device) + return inputs_embeds, attention_mask, label_input_ids + + def _get_embeds( + self, + question: List[str], + context: Optional[List[str]] = None, + embedding: Optional[List[Tensor]] = None, + answer: Optional[List[str]] = None, + ) -> tuple: + (batch_size, question, context, eos_user_tokens, bos_embeds, + pad_embeds) = self._encode_inputs(question, context) + + batch_label_input_ids = None + if answer is not None: + label = self.tokenizer(answer, add_special_tokens=False) + eos_tokens = self.tokenizer(EOS, add_special_tokens=False) + batch_label_input_ids = [] + + batch_inputs_embeds = [] + batch_attention_mask = [] + for i in range(batch_size): + input_ids = self._input_ids(i, context, question, eos_user_tokens) + if answer is not None: + label_input_ids = self._label_input_ids(i, label, eos_tokens) + input_ids += label_input_ids + else: + label_input_ids = None + + inputs_embeds = self._inputs_embeds(i, input_ids, bos_embeds, + embedding) + + ( + batch_inputs_embeds, + batch_attention_mask, + batch_label_input_ids, + ) = self._append_embeds( + inputs_embeds, + batch_inputs_embeds, + batch_attention_mask, + label_input_ids, + batch_label_input_ids, + ) + + inputs_embeds, attention_mask, label_input_ids = self._pad_embeds( + pad_embeds, batch_inputs_embeds, batch_attention_mask, + batch_label_input_ids) + + return inputs_embeds, attention_mask, label_input_ids + + def forward( + self, + question: List[str], + answer: List[str], + context: Optional[List[str]] = None, + embedding: Optional[List[Tensor]] = None, + ) -> Tensor: + r"""The forward pass. + + Args: + question (list[str]): The questions/prompts. + answer (list[str]): The answers/labels. + context (list[str], optional): Additional context to give to the + LLM, such as textified knowledge graphs. (default: :obj:`None`) + embedding (list[torch.Tensor], optional): RAG embedding + tensors, *i.e.* the embedded form of :obj:`context`. Either + :obj:`context` or :obj:`embedding` should be used, not + both. (default: :obj:`None`) + """ + inputs_embeds, attention_mask, label_input_ids = self._get_embeds( + question, context, embedding, answer) + + with self.autocast_context: + outputs = self.llm( + inputs_embeds=inputs_embeds, + attention_mask=attention_mask, + return_dict=True, + labels=label_input_ids, + ) + return outputs.loss + + @paddle.no_grad() + def inference( + self, + question: List[str], + context: Optional[List[str]] = None, + embedding: Optional[List[Tensor]] = None, + max_tokens: Optional[int] = MAX_NEW_TOKENS, + ) -> List[str]: + r"""The inference pass. + + Args: + question (list[str]): The questions/prompts. + answer (list[str]): The answers/labels. + context (list[str], optional): Additional context to give to the + LLM, such as textified knowledge graphs. (default: :obj:`None`) + embedding (list[torch.Tensor], optional): RAG embedding + tensors, *i.e.* the embedded form of :obj:`context`. Either + :obj:`context` or :obj:`embedding` should be used, not + both. (default: :obj:`None`) + max_tokens (int, optional): How many tokens for the LLM to + generate. (default: :obj:`32`) + """ + inputs_embeds, attention_mask, _ = self._get_embeds( + question, context, embedding) + + bos_token = self.tokenizer( + BOS, + add_special_tokens=False, + ).input_ids[0] + + with self.autocast_context: + outputs = self.llm.generate( + inputs_embeds=inputs_embeds, + bos_token_id=bos_token, + max_new_tokens=max_tokens, + attention_mask=attention_mask, + use_cache=True, + ) + + return self.tokenizer.batch_decode(outputs, skip_special_tokens=True) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.model_name})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/nlp/sentence_transformer.py b/jointContribution/mattergen/paddle_geometric/nn/nlp/sentence_transformer.py new file mode 100644 index 00000000..fc5c96f3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/nlp/sentence_transformer.py @@ -0,0 +1,99 @@ +from enum import Enum +from typing import List, Optional, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor + + +class PoolingStrategy(Enum): + MEAN = 'mean' + LAST = 'last' + CLS = 'cls' + + +class SentenceTransformer(paddle.nn.Layer): + def __init__( + self, + model_name: str, + pooling_strategy: Union[PoolingStrategy, str] = 'mean', + ) -> None: + super().__init__() + + self.model_name = model_name + self.pooling_strategy = PoolingStrategy(pooling_strategy) + + from transformers import AutoModel, AutoTokenizer + + self.tokenizer = AutoTokenizer.from_pretrained(model_name) + self.model = AutoModel.from_pretrained(model_name) + if self.tokenizer.pad_token is None: + self.tokenizer.pad_token = self.tokenizer.eos_token + + def forward(self, input_ids: Tensor, attention_mask: Tensor) -> Tensor: + out = self.model(input_ids=input_ids, attention_mask=attention_mask) + + emb = out[0] # First element contains all token embeddings. + if self.pooling_strategy == PoolingStrategy.MEAN: + emb = mean_pooling(emb, attention_mask) + elif self.pooling_strategy == PoolingStrategy.LAST: + emb = last_pooling(emb, attention_mask) + else: + assert self.pooling_strategy == PoolingStrategy.CLS + emb = emb[:, 0, :] + + emb = F.normalize(emb, p=2, axis=1) + return emb + + @property + def device(self) -> paddle.device: + return next(iter(self.model.parameters())).place + + @paddle.no_grad() + def encode( + self, + text: List[str], + batch_size: Optional[int] = None, + output_device: Optional[Union[str, str]] = None, + ) -> Tensor: + is_empty = len(text) == 0 + text = ['dummy'] if is_empty else text + + batch_size = len(text) if batch_size is None else batch_size + + embs: List[Tensor] = [] + for start in range(0, len(text), batch_size): + token = self.tokenizer( + text[start:start + batch_size], + padding=True, + truncation=True, + return_tensors='pd', + ) + + emb = self( + input_ids=token.input_ids.astype(paddle.int64).to(self.device), + attention_mask=token.attention_mask.to(self.device), + ).to(output_device) + + embs.append(emb) + + out = paddle.concat(embs, axis=0) if len(embs) > 1 else embs[0] + out = out[:0] if is_empty else out + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(model_name={self.model_name})' + + +def mean_pooling(emb: Tensor, attention_mask: Tensor) -> Tensor: + mask = attention_mask.unsqueeze(-1).expand(emb.shape).to(emb.dtype) + return (emb * mask).sum(axis=1) / mask.sum(axis=1).clip(min=1e-9) + + +def last_pooling(emb: Tensor, attention_mask: Tensor) -> Tensor: + left_padding = paddle.sum(attention_mask[:, -1]) == attention_mask.shape[0] + if left_padding: + return emb[:, -1] + + seq_indices = paddle.sum(attention_mask, axis=1) - 1 + return emb[paddle.arange(emb.shape[0], device=emb.device), seq_indices] diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/norm/__init__.py new file mode 100644 index 00000000..d53c32b5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/__init__.py @@ -0,0 +1,27 @@ +r"""Normalization package.""" + +from .batch_norm import BatchNorm, HeteroBatchNorm +from .instance_norm import InstanceNorm +from .layer_norm import LayerNorm, HeteroLayerNorm +from .graph_norm import GraphNorm +from .graph_size_norm import GraphSizeNorm +from .pair_norm import PairNorm +from .mean_subtraction_norm import MeanSubtractionNorm +from .msg_norm import MessageNorm +from .diff_group_norm import DiffGroupNorm + +__all__ = [ + 'BatchNorm', + 'HeteroBatchNorm', + 'InstanceNorm', + 'LayerNorm', + 'HeteroLayerNorm', + 'GraphNorm', + 'GraphSizeNorm', + 'PairNorm', + 'MeanSubtractionNorm', + 'MessageNorm', + 'DiffGroupNorm', +] + +classes = __all__ diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/batch_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/batch_norm.py new file mode 100644 index 00000000..5d1c88e7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/batch_norm.py @@ -0,0 +1,213 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor + +from paddle_geometric.nn.aggr.fused import FusedAggregation + + +class BatchNorm(paddle.nn.Layer): + r"""Applies batch normalization over a batch of features as described in + the `"Batch Normalization: Accelerating Deep Network Training by + Reducing Internal Covariate Shift" `_ + paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{\mathbf{x} - \textrm{E}[\mathbf{x}]} + {\sqrt{\textrm{Var}[\mathbf{x}] + \epsilon}} \odot \gamma + \beta + + The mean and standard-deviation are calculated per-dimension over all nodes + inside the mini-batch. + + Args: + in_channels (int): Size of each input sample. + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + momentum (float, optional): The value used for the running mean and + running variance computation. (default: :obj:`0.1`) + affine (bool, optional): If set to :obj:`True`, this module has + learnable affine parameters :math:`\gamma` and :math:`\beta`. + (default: :obj:`True`) + track_running_stats (bool, optional): If set to :obj:`True`, this + module tracks the running mean and variance, and when set to + :obj:`False`, this module does not track such statistics and always + uses batch statistics in both training and eval modes. + (default: :obj:`True`) + allow_single_element (bool, optional): If set to :obj:`True`, batches + with only a single element will work as during in evaluation. + That is the running mean and variance will be used. + Requires :obj:`track_running_stats=True`. (default: :obj:`False`) + """ + def __init__( + self, + in_channels: int, + eps: float = 1e-5, + momentum: Optional[float] = 0.1, + affine: bool = True, + track_running_stats: bool = True, + allow_single_element: bool = False, + ): + super().__init__() + + if allow_single_element and not track_running_stats: + raise ValueError("'allow_single_element' requires " + "'track_running_stats' to be set to `True`") + + self.module = paddle.nn.BatchNorm1D(in_channels, eps, momentum, affine, + track_running_stats) + self.in_channels = in_channels + self.allow_single_element = allow_single_element + + def reset_running_stats(self): + r"""Resets all running statistics of the module.""" + self.module.reset_running_stats() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.module.reset_parameters() + + def forward(self, x: Tensor) -> Tensor: + r"""Forward pass. + + Args: + x (torch.Tensor): The source tensor. + """ + if self.allow_single_element and x.shape[0] <= 1: + return paddle.nn.functional.batch_norm( + x, + self.module._mean, + self.module._variance, + self.module._weight, + self.module._bias, + False, # bn_training + 0.0, # momentum + self.module._epsilon, + ) + return self.module(x) + + def __repr__(self): + return f'{self.__class__.__name__}({self.module.extra_repr()})' + + +class HeteroBatchNorm(paddle.nn.Layer): + r"""Applies batch normalization over a batch of heterogeneous features as + described in the `"Batch Normalization: Accelerating Deep Network Training + by Reducing Internal Covariate Shift" `_ + paper. + Compared to :class:`BatchNorm`, :class:`HeteroBatchNorm` applies + normalization individually for each node or edge type. + + Args: + in_channels (int): Size of each input sample. + num_types (int): The number of types. + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + momentum (float, optional): The value used for the running mean and + running variance computation. (default: :obj:`0.1`) + affine (bool, optional): If set to :obj:`True`, this module has + learnable affine parameters :math:`\gamma` and :math:`\beta`. + (default: :obj:`True`) + track_running_stats (bool, optional): If set to :obj:`True`, this + module tracks the running mean and variance, and when set to + :obj:`False`, this module does not track such statistics and always + uses batch statistics in both training and eval modes. + (default: :obj:`True`) + """ + def __init__( + self, + in_channels: int, + num_types: int, + eps: float = 1e-5, + momentum: Optional[float] = 0.1, + affine: bool = True, + track_running_stats: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.num_types = num_types + self.eps = eps + self.momentum = momentum + self.affine = affine + self.track_running_stats = track_running_stats + + if self.affine: + self.weight = paddle.create_parameter( + shape=[num_types, in_channels], dtype='float32') + + self.bias = paddle.create_parameter( + shape=[num_types, in_channels], dtype='float32') + else: + self.register_parameter('weight', None) + self.register_parameter('bias', None) + + if self.track_running_stats: + self.register_buffer('running_mean', + paddle.empty([num_types, in_channels])) + self.register_buffer('running_var', + paddle.empty([num_types, in_channels])) + self.register_buffer('num_batches_tracked', paddle.to_tensor(0)) + else: + self.register_buffer('running_mean', None) + self.register_buffer('running_var', None) + self.register_buffer('num_batches_tracked', None) + + self.mean_var = FusedAggregation(['mean', 'var']) + + self.reset_parameters() + + def reset_running_stats(self): + r"""Resets all running statistics of the module.""" + if self.track_running_stats: + self.running_mean.zero_() + self.running_var.fill_(1) + self.num_batches_tracked.zero_() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.reset_running_stats() + if self.affine: + paddle.nn.initializer.ones(self.weight) + paddle.nn.initializer.zeros(self.bias) + + def forward(self, x: Tensor, type_vec: Tensor) -> Tensor: + r"""Forward pass. + + Args: + x (torch.Tensor): The input features. + type_vec (torch.Tensor): A vector that maps each entry to a type. + """ + if not self.training and self.track_running_stats: + mean, var = self.running_mean, self.running_var + else: + with paddle.no_grad(): + mean, var = self.mean_var(x, type_vec, dim_size=self.num_types) + + if self.training and self.track_running_stats: + if self.momentum is None: + self.num_batches_tracked.add_(1) + exp_avg_factor = 1.0 / float(self.num_batches_tracked) + else: + exp_avg_factor = self.momentum + + with paddle.no_grad(): # Update running mean and variance: + type_index = paddle.unique(type_vec) + + self.running_mean[type_index] = ( + (1.0 - exp_avg_factor) * self.running_mean[type_index] + + exp_avg_factor * mean[type_index]) + self.running_var[type_index] = ( + (1.0 - exp_avg_factor) * self.running_var[type_index] + + exp_avg_factor * var[type_index]) + + out = (x - mean[type_vec]) / var.clamp(self.eps).sqrt()[type_vec] + + if self.affine: + out = out * self.weight[type_vec] + self.bias[type_vec] + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'num_types={self.num_types})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/diff_group_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/diff_group_norm.py new file mode 100644 index 00000000..b81cc4ae --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/diff_group_norm.py @@ -0,0 +1,122 @@ +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear, BatchNorm1D + + +class DiffGroupNorm(paddle.nn.Layer): + r"""The differentiable group normalization layer from the `"Towards Deeper + Graph Neural Networks with Differentiable Group Normalization" + `_ paper, which normalizes node features + group-wise via a learnable soft cluster assignment. + + .. math:: + + \mathbf{S} = \text{softmax} (\mathbf{X} \mathbf{W}) + + where :math:`\mathbf{W} \in \mathbb{R}^{F \times G}` denotes a trainable + weight matrix mapping each node into one of :math:`G` clusters. + Normalization is then performed group-wise via: + + .. math:: + + \mathbf{X}^{\prime} = \mathbf{X} + \lambda \sum_{i = 1}^G + \text{BatchNorm}(\mathbf{S}[:, i] \odot \mathbf{X}) + + Args: + in_channels (int): Size of each input sample :math:`F`. + groups (int): The number of groups :math:`G`. + lamda (float, optional): The balancing factor :math:`\lambda` between + input embeddings and normalized embeddings. (default: :obj:`0.01`) + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + momentum (float, optional): The value used for the running mean and + running variance computation. (default: :obj:`0.1`) + affine (bool, optional): If set to :obj:`True`, this module has + learnable affine parameters :math:`\gamma` and :math:`\beta`. + (default: :obj:`True`) + track_running_stats (bool, optional): If set to :obj:`True`, this + module tracks the running mean and variance, and when set to + :obj:`False`, this module does not track such statistics and always + uses batch statistics in both training and eval modes. + (default: :obj:`True`) + """ + def __init__( + self, + in_channels: int, + groups: int, + lamda: float = 0.01, + eps: float = 1e-5, + momentum: float = 0.1, + affine: bool = True, + track_running_stats: bool = True, + ): + super().__init__() + + self.in_channels = in_channels + self.groups = groups + self.lamda = lamda + + self.lin = Linear(in_channels, groups, bias_attr=False) + self.norm = BatchNorm1D(groups * in_channels, eps=eps, momentum=momentum) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.lin.reset_parameters() + self.norm.reset_parameters() + + def forward(self, x: Tensor) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + """ + F, G = self.in_channels, self.groups + + s = self.lin(x).softmax(axis=-1) # [N, G] + out = s.unsqueeze(-1) * x.unsqueeze(-2) # [N, G, F] + out = self.norm(out.reshape([-1, G * F])).reshape([-1, G, F]).sum(axis=-2) # [N, F] + + return x + self.lamda * out + + @staticmethod + def group_distance_ratio(x: Tensor, y: Tensor, eps: float = 1e-5) -> float: + r"""Measures the ratio of inter-group distance over intra-group + distance. + + .. math:: + R_{\text{Group}} = \frac{\frac{1}{(C-1)^2} \sum_{i!=j} + \frac{1}{|\mathbf{X}_i||\mathbf{X}_j|} \sum_{\mathbf{x}_{iv} + \in \mathbf{X}_i } \sum_{\mathbf{x}_{jv^{\prime}} \in \mathbf{X}_j} + {\| \mathbf{x}_{iv} - \mathbf{x}_{jv^{\prime}} \|}_2 }{ + \frac{1}{C} \sum_{i} \frac{1}{{|\mathbf{X}_i|}^2} + \sum_{\mathbf{x}_{iv}, \mathbf{x}_{iv^{\prime}} \in \mathbf{X}_i } + {\| \mathbf{x}_{iv} - \mathbf{x}_{iv^{\prime}} \|}_2 } + + where :math:`\mathbf{X}_i` denotes the set of all nodes that belong to + class :math:`i`, and :math:`C` denotes the total number of classes in + :obj:`y`. + """ + num_classes = int(y.max()) + 1 + + numerator = 0. + for i in range(num_classes): + mask = y == i + dist = paddle.cdist(x[mask].unsqueeze(0), x[~mask].unsqueeze(0)) + numerator += (1 / dist.numel()) * float(dist.sum()) + numerator *= 1 / (num_classes - 1)**2 + + denominator = 0. + for i in range(num_classes): + mask = y == i + dist = paddle.cdist(x[mask].unsqueeze(0), x[mask].unsqueeze(0)) + denominator += (1 / dist.numel()) * float(dist.sum()) + denominator *= 1 / num_classes + + return numerator / (denominator + eps) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'groups={self.groups})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/graph_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/graph_norm.py new file mode 100644 index 00000000..c2845218 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/graph_norm.py @@ -0,0 +1,74 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle_geometric.nn.inits import ones, zeros +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import scatter + + +class GraphNorm(paddle.nn.Layer): + r"""Applies graph normalization over individual graphs as described in the + `"GraphNorm: A Principled Approach to Accelerating Graph Neural Network + Training" `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{\mathbf{x} - \alpha \odot + \textrm{E}[\mathbf{x}]} + {\sqrt{\textrm{Var}[\mathbf{x} - \alpha \odot \textrm{E}[\mathbf{x}]] + + \epsilon}} \odot \gamma + \beta + + where :math:`\alpha` denotes parameters that learn how much information + to keep in the mean. + + Args: + in_channels (int): Size of each input sample. + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + """ + def __init__(self, in_channels: int, eps: float = 1e-5): + super().__init__() + + self.in_channels = in_channels + self.eps = eps + + # Create parameters using paddle.create_parameter + self.weight = paddle.create_parameter(shape=[in_channels], dtype='float32') + self.bias = paddle.create_parameter(shape=[in_channels], dtype='float32') + self.mean_scale = paddle.create_parameter(shape=[in_channels], dtype='float32') + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + ones(self.weight) + zeros(self.bias) + ones(self.mean_scale) + + def forward(self, x: Tensor, batch: OptTensor = None, + batch_size: Optional[int] = None) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + """ + if batch is None: + batch = x.new_zeros([x.shape[0]], dtype=paddle.int64) + batch_size = 1 + + if batch_size is None: + batch_size = int(batch.max()) + 1 + + mean = scatter(x, batch, 0, batch_size, reduce='mean') + out = x - mean.index_select(0, batch) * self.mean_scale + var = scatter(out.pow(2), batch, 0, batch_size, reduce='mean') + std = (var + self.eps).sqrt().index_select(0, batch) + return self.weight * out / std + self.bias + + def __repr__(self): + return f'{self.__class__.__name__}({self.in_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/graph_size_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/graph_size_norm.py new file mode 100644 index 00000000..4196f7da --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/graph_size_norm.py @@ -0,0 +1,42 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import degree + + +class GraphSizeNorm(paddle.nn.Layer): + r"""Applies Graph Size Normalization over each individual graph in a batch + of node features as described in the + `"Benchmarking Graph Neural Networks" `_ + paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{\mathbf{x}_i}{\sqrt{|\mathcal{V}|}} + """ + def __init__(self): + super().__init__() + + def forward(self, x: Tensor, batch: OptTensor = None, + batch_size: Optional[int] = None) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + """ + if batch is None: + batch = paddle.zeros([x.shape[0]], dtype=paddle.int64, device=x.device) + batch_size = 1 + + inv_sqrt_deg = degree(batch, batch_size, dtype=x.dtype).pow(-0.5) + return x * inv_sqrt_deg.index_select(0, batch).unsqueeze(-1) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/instance_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/instance_norm.py new file mode 100644 index 00000000..c6838f14 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/instance_norm.py @@ -0,0 +1,130 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import degree, scatter + + +class InstanceNorm(Layer): + r"""Applies instance normalization over each individual example in a batch + of node features as described in the `"Instance Normalization: The Missing + Ingredient for Fast Stylization" `_ + paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{\mathbf{x} - + \textrm{E}[\mathbf{x}]}{\sqrt{\textrm{Var}[\mathbf{x}] + \epsilon}} + \odot \gamma + \beta + + The mean and standard-deviation are calculated per-dimension separately for + each object in a mini-batch. + + Args: + in_channels (int): Size of each input sample. + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + momentum (float, optional): The value used for the running mean and + running variance computation. (default: :obj:`0.1`) + affine (bool, optional): If set to :obj:`True`, this module has + learnable affine parameters :math:`\gamma` and :math:`\beta`. + (default: :obj:`False`) + track_running_stats (bool, optional): If set to :obj:`True`, this + module tracks the running mean and variance, and when set to + :obj:`False`, this module does not track such statistics and always + uses instance statistics in both training and eval modes. + (default: :obj:`False`) + """ + def __init__( + self, + in_channels: int, + eps: float = 1e-5, + momentum: float = 0.1, + affine: bool = False, + track_running_stats: bool = False, + ): + super().__init__() + + self.in_channels = in_channels + self.eps = eps + self.momentum = momentum + self.affine = affine + self.track_running_stats = track_running_stats + + self.weight = paddle.create_parameter(shape=[in_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(1.0)) + self.bias = paddle.create_parameter(shape=[in_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(0.0)) + self.running_mean = paddle.create_parameter(shape=[in_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(0.0), is_bias=True) + self.running_var = paddle.create_parameter(shape=[in_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(1.0), is_bias=True) + + def reset_parameters(self): + """Resets all learnable parameters of the module.""" + paddle.nn.initializer.XavierUniform()(self.weight) + paddle.nn.initializer.Constant(0.0)(self.bias) + paddle.nn.initializer.Constant(0.0)(self.running_mean) + paddle.nn.initializer.Constant(1.0)(self.running_var) + + def forward(self, x: Tensor, batch: OptTensor = None, + batch_size: Optional[int] = None) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + """ + if batch is None: + out = F.instance_norm( + x.t().unsqueeze(0), self.running_mean, self.running_var, + self.weight, self.bias, self.training + or not self.track_running_stats, self.momentum, self.eps) + return out.squeeze(0).t() + + if batch_size is None: + batch_size = int(batch.max()) + 1 + + mean = var = unbiased_var = x # Dummies. + + if self.training or not self.track_running_stats: + norm = degree(batch, batch_size, dtype=x.dtype).clamp_(min=1) + norm = norm.unsqueeze(-1) + unbiased_norm = (norm - 1).clamp_(min=1) + + mean = scatter(x, batch, dim=0, dim_size=batch_size, reduce='sum') / norm + + x = x - mean.index_select(0, batch) + + var = scatter(x * x, batch, dim=0, dim_size=batch_size, reduce='sum') + unbiased_var = var / unbiased_norm + var = var / norm + + momentum = self.momentum + if self.running_mean is not None: + self.running_mean = ( + 1 - momentum) * self.running_mean + momentum * mean.mean(0) + if self.running_var is not None: + self.running_var = ( + 1 - momentum + ) * self.running_var + momentum * unbiased_var.mean(0) + else: + if self.running_mean is not None: + mean = self.running_mean.unsqueeze(0).expand(batch_size, -1) + if self.running_var is not None: + var = self.running_var.unsqueeze(0).expand(batch_size, -1) + + x = x - mean.index_select(0, batch) + + out = x / (var + self.eps).sqrt().index_select(0, batch) + + if self.weight is not None and self.bias is not None: + out = out * self.weight.unsqueeze(0) + self.bias.unsqueeze(0) + + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/layer_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/layer_norm.py new file mode 100644 index 00000000..e9095a8f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/layer_norm.py @@ -0,0 +1,206 @@ +from typing import List, Optional, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer + +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import degree, scatter + + +class LayerNorm(Layer): + r"""Applies layer normalization over each individual example in a batch + of features as described in the `"Layer Normalization" + `_ paper. + + .. math:: + \mathbf{x}^{\prime}_i = \frac{\mathbf{x} - + \textrm{E}[\mathbf{x}]}{\sqrt{\textrm{Var}[\mathbf{x}] + \epsilon}} + \odot \gamma + \beta + + The mean and standard-deviation are calculated across all nodes and all + node channels separately for each object in a mini-batch. + + Args: + in_channels (int): Size of each input sample. + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + affine (bool, optional): If set to :obj:`True`, this module has + learnable affine parameters :math:`\gamma` and :math:`\beta`. + (default: :obj:`True`) + mode (str, optinal): The normalization mode to use for layer + normalization (:obj:`"graph"` or :obj:`"node"`). If :obj:`"graph"` + is used, each graph will be considered as an element to be + normalized. If `"node"` is used, each node will be considered as + an element to be normalized. (default: :obj:`"graph"`) + """ + def __init__( + self, + in_channels: int, + eps: float = 1e-5, + affine: bool = True, + mode: str = 'graph', + ): + super().__init__() + + self.in_channels = in_channels + self.eps = eps + self.affine = affine + self.mode = mode + + if affine: + self.weight = paddle.create_parameter(shape=[in_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(1.0)) + self.bias = paddle.create_parameter(shape=[in_channels], dtype='float32', default_initializer=paddle.nn.initializer.Constant(0.0)) + else: + self.register_parameter('weight', None) + self.register_parameter('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + paddle.nn.initializer.XavierUniform()(self.weight) + paddle.nn.initializer.Constant(0.0)(self.bias) + + def forward(self, x: Tensor, batch: OptTensor = None, + batch_size: Optional[int] = None) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + """ + if self.mode == 'graph': + if batch is None: + x = x - x.mean() + out = x / (x.std(unbiased=False) + self.eps) + + else: + if batch_size is None: + batch_size = int(batch.max()) + 1 + + norm = degree(batch, batch_size, dtype=x.dtype).clamp_(min=1) + norm = norm.mul_(x.shape[-1]).reshape(-1, 1) + + mean = scatter(x, batch, dim=0, dim_size=batch_size, + reduce='sum').sum(axis=-1, keepdim=True) / norm + + x = x - mean.index_select(0, batch) + + var = scatter(x * x, batch, dim=0, dim_size=batch_size, + reduce='sum').sum(axis=-1, keepdim=True) + var = var / norm + + out = x / (var + self.eps).sqrt().index_select(0, batch) + + if self.weight is not None and self.bias is not None: + out = out * self.weight + self.bias + + return out + + if self.mode == 'node': + return F.layer_norm(x, (self.in_channels, ), self.weight, + self.bias, self.eps) + + raise ValueError(f"Unknown normalization mode: {self.mode}") + + def __repr__(self): + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'affine={self.affine}, mode={self.mode})') + + +class HeteroLayerNorm(Layer): + r"""Applies layer normalization over each individual example in a batch + of heterogeneous features as described in the `"Layer Normalization" + `_ paper. + Compared to :class:`LayerNorm`, :class:`HeteroLayerNorm` applies + normalization individually for each node or edge type. + + Args: + in_channels (int): Size of each input sample. + num_types (int): The number of types. + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + affine (bool, optional): If set to :obj:`True`, this module has + learnable affine parameters :math:`\gamma` and :math:`\beta`. + (default: :obj:`True`) + mode (str, optional): The normalization mode to use for layer + normalization (:obj:`"node"`). If `"node"` is used, each node will + be considered as an element to be normalized. + (default: :obj:`"node"`) + """ + def __init__( + self, + in_channels: int, + num_types: int, + eps: float = 1e-5, + affine: bool = True, + mode: str = 'node', + ): + super().__init__() + assert mode == 'node' + + self.in_channels = in_channels + self.num_types = num_types + self.eps = eps + self.affine = affine + + if affine: + self.weight = paddle.create_parameter(shape=[num_types, in_channels], dtype='float32') + self.bias = paddle.create_parameter(shape=[num_types, in_channels], dtype='float32') + else: + self.register_parameter('weight', None) + self.register_parameter('bias', None) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + if self.affine: + paddle.nn.initializer.Constant(1.0)(self.weight) + paddle.nn.initializer.Constant(0.0)(self.bias) + + def forward( + self, + x: Tensor, + type_vec: OptTensor = None, + type_ptr: Optional[Union[Tensor, List[int]]] = None, + ) -> Tensor: + r"""Forward pass. + + .. note:: + Either :obj:`type_vec` or :obj:`type_ptr` needs to be specified. + In general, relying on :obj:`type_ptr` is more efficient in case + the input tensor is sorted by types. + + Args: + x (paddle.Tensor): The input features. + type_vec (paddle.Tensor, optional): A vector that maps each entry to + a type. (default: :obj:`None`) + type_ptr (paddle.Tensor or List[int]): A vector denoting the + boundaries of types. (default: :obj:`None`) + """ + if type_vec is None and type_ptr is None: + raise ValueError("Either 'type_vec' or 'type_ptr' must be given") + + out = F.layer_norm(x, (self.in_channels, ), None, None, self.eps) + + if self.affine: + if type_ptr is not None: + h = paddle.empty_like(out) + for i, (s, e) in enumerate(zip(type_ptr[:-1], type_ptr[1:])): + h[s:e] = out[s:e] * self.weight[i] + self.bias[i] + out = h + else: + out = out * self.weight[type_vec] + self.bias[type_vec] + + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'num_types={self.num_types})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/mean_subtraction_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/mean_subtraction_norm.py new file mode 100644 index 00000000..0ce76f13 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/mean_subtraction_norm.py @@ -0,0 +1,37 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import scatter + + +class MeanSubtractionNorm(paddle.nn.Layer): + r"""Applies layer normalization by subtracting the mean from the inputs + as described in the `"Revisiting 'Over-smoothing' in Deep GCNs" + `_ paper. + + .. math:: + \mathbf{x}_i = \mathbf{x}_i - \frac{1}{|\mathcal{V}|} + \sum_{j \in \mathcal{V}} \mathbf{x}_j + """ + def forward(self, x: Tensor, batch: Optional[Tensor] = None, + dim_size: Optional[int] = None) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + dim_size (int, optional): The number of examples :math:`B` in case + :obj:`batch` is given. (default: :obj:`None`) + """ + if batch is None: + return x - x.mean(axis=0, keepdim=True) + + mean = scatter(x, batch, dim=0, dim_size=dim_size, reduce='mean') + return x - mean[batch] + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/msg_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/msg_norm.py new file mode 100644 index 00000000..d4d681b9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/msg_norm.py @@ -0,0 +1,50 @@ +import paddle +import paddle.nn.functional as F +from paddle import Tensor + + +class MessageNorm(paddle.nn.Layer): + r"""Applies message normalization over the aggregated messages as described + in the `"DeeperGCNs: All You Need to Train Deeper GCNs" + `_ paper. + + .. math:: + + \mathbf{x}_i^{\prime} = \mathrm{MLP} \left( \mathbf{x}_{i} + s \cdot + {\| \mathbf{x}_i \|}_2 \cdot + \frac{\mathbf{m}_{i}}{{\|\mathbf{m}_i\|}_2} \right) + + Args: + learn_scale (bool, optional): If set to :obj:`True`, will learn the + scaling factor :math:`s` of message normalization. + (default: :obj:`False`) + """ + def __init__(self, learn_scale: bool = False): + super().__init__() + self.scale = paddle.create_parameter( + shape=[1], # Shape of the parameter + dtype='float32', # Data type + default_initializer=paddle.nn.initializer.Constant(value=0.0) # Optional: Default initializer + ) + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.scale.data.fill_(1.0) + + def forward(self, x: Tensor, msg: Tensor, p: float = 2.0) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + msg (paddle.Tensor): The message tensor :math:`\mathbf{M}`. + p (float, optional): The norm :math:`p` to use for normalization. + (default: :obj:`2.0`) + """ + msg = F.normalize(msg, p=p, axis=-1) + x_norm = paddle.norm(x, p=p, axis=-1, keepdim=True) + return msg * x_norm * self.scale + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}' + f'(learn_scale={self.scale.requires_grad})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/norm/pair_norm.py b/jointContribution/mattergen/paddle_geometric/nn/norm/pair_norm.py new file mode 100644 index 00000000..44ddfe34 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/norm/pair_norm.py @@ -0,0 +1,76 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import scatter + + +class PairNorm(Layer): + r"""Applies pair normalization over node features as described in the + `"PairNorm: Tackling Oversmoothing in GNNs" + `_ paper. + + .. math:: + \mathbf{x}_i^c &= \mathbf{x}_i - \frac{1}{n} + \sum_{i=1}^n \mathbf{x}_i \\ + + \mathbf{x}_i^{\prime} &= s \cdot + \frac{\mathbf{x}_i^c}{\sqrt{\frac{1}{n} \sum_{i=1}^n + {\| \mathbf{x}_i^c \|}^2_2}} + + Args: + scale (float, optional): Scaling factor :math:`s` of normalization. + (default, :obj:`1.`) + scale_individually (bool, optional): If set to :obj:`True`, will + compute the scaling step as :math:`\mathbf{x}^{\prime}_i = s \cdot + \frac{\mathbf{x}_i^c}{{\| \mathbf{x}_i^c \|}_2}`. + (default: :obj:`False`) + eps (float, optional): A value added to the denominator for numerical + stability. (default: :obj:`1e-5`) + """ + def __init__(self, scale: float = 1., scale_individually: bool = False, + eps: float = 1e-5): + super().__init__() + + self.scale = scale + self.scale_individually = scale_individually + self.eps = eps + + def forward(self, x: Tensor, batch: OptTensor = None, + batch_size: Optional[int] = None) -> Tensor: + r"""Forward pass. + + Args: + x (paddle.Tensor): The source tensor. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + """ + scale = self.scale + + if batch is None: + x = x - x.mean(axis=0, keepdim=True) + + if not self.scale_individually: + return scale * x / paddle.sqrt(self.eps + x.pow(2).sum(-1).mean()) + else: + return scale * x / (self.eps + x.norm(2, -1, keepdim=True)) + + else: + mean = scatter(x, batch, dim=0, dim_size=batch_size, reduce='mean') + x = x - mean.index_select(0, batch) + + if not self.scale_individually: + return scale * x / paddle.sqrt(self.eps + scatter( + x.pow(2).sum(-1, keepdim=True), batch, dim=0, + dim_size=batch_size, reduce='mean').index_select(0, batch)) + else: + return scale * x / (self.eps + x.norm(2, -1, keepdim=True)) + + def __repr__(self): + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/nn/parameter_dict.py b/jointContribution/mattergen/paddle_geometric/nn/parameter_dict.py new file mode 100644 index 00000000..28a3b37f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/parameter_dict.py @@ -0,0 +1,69 @@ +from typing import Final, Iterable, Mapping, Optional, Tuple, Union, Any + +import paddle + +Key = Union[str, Tuple[str, ...]] + + +# `paddle.nn.LayerDict` doesn't allow `.` to be used in key names. +# This `ParameterDict` will support it by converting the `.` to `#` in the +# internal representation and converts it back to `.` in the external +# representation. It also allows passing tuples as keys. +class ParameterDict(paddle.nn.LayerDict): + CLASS_ATTRS: Final[Tuple[str, ...]] = set(dir(paddle.nn.LayerDict)) + + def __init__( + self, + parameters: Optional[Mapping[Key, Any]] = None, + ): + # Replace the keys in parameters. + if parameters: + parameters = { + self.to_internal_key(key): parameter + for key, parameter in parameters.items() + } + super().__init__(parameters) + + @classmethod + def to_internal_key(cls, key: Key) -> str: + if isinstance(key, tuple): # ParameterDict can't handle tuples as keys + assert len(key) > 1 + key = f"<{'___'.join(key)}>" + assert isinstance(key, str) + + # ParameterDict cannot handle keys that exist as class attributes: + if key in cls.CLASS_ATTRS: + key = f'<{key}>' + + # ParameterDict cannot handle dots in keys: + return key.replace('.', '#') + + @classmethod + def to_external_key(cls, key: str) -> Key: + key = key.replace('#', '.') + + if key[0] == '<' and key[-1] == '>' and key[1:-1] in cls.CLASS_ATTRS: + key = key[1:-1] + + if key[0] == '<' and key[-1] == '>' and '___' in key: + key = tuple(key[1:-1].split('___')) + + return key + + def __getitem__(self, key: Key): + return super().__getitem__(self.to_internal_key(key)) + + def __setitem__(self, key: Key, parameter: Any): + return super().__setitem__(self.to_internal_key(key), parameter) + + def __delitem__(self, key: Key): + return super().__delitem__(self.to_internal_key(key)) + + def __contains__(self, key: Key) -> bool: + return super().__contains__(self.to_internal_key(key)) + + def keys(self) -> Iterable[Key]: + return [self.to_external_key(key) for key in super().keys()] + + def items(self) -> Iterable[Tuple[Key, Any]]: + return [(self.to_external_key(k), v) for k, v in super().items()] diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/pool/__init__.py new file mode 100644 index 00000000..90ebd7e4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/__init__.py @@ -0,0 +1,370 @@ +r"""Pooling package.""" + +import warnings +from typing import Optional +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.typing import OptTensor, paddle_cluster + +from .avg_pool import avg_pool, avg_pool_neighbor_x, avg_pool_x +from .glob import global_add_pool, global_max_pool, global_mean_pool +from .knn import (KNNIndex, L2KNNIndex, MIPSKNNIndex, ApproxL2KNNIndex, + ApproxMIPSKNNIndex) +from .graclus import graclus +from .max_pool import max_pool, max_pool_neighbor_x, max_pool_x +from .topk_pool import TopKPooling +from .sag_pool import SAGPooling +from .edge_pool import EdgePooling +from .cluster_pool import ClusterPooling +from .asap import ASAPooling +from .pan_pool import PANPooling +from .mem_pool import MemPooling +from .voxel_grid import voxel_grid +from .approx_knn import approx_knn, approx_knn_graph + + +def fps( + x: Tensor, + batch: OptTensor = None, + ratio: float = 0.5, + random_start: bool = True, + batch_size: Optional[int] = None, +) -> Tensor: + r"""A sampling algorithm from the `"PointNet++: Deep Hierarchical Feature + Learning on Point Sets in a Metric Space" + `_ paper, which iteratively samples the + most distant point with regard to the rest points. + + .. code-block:: python + + import torch + from paddle_geometric.nn import fps + + x = torch.tensor([[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]]) + batch = torch.tensor([0, 0, 0, 0]) + index = fps(x, batch, ratio=0.5) + + Args: + x (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + batch (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + ratio (float, optional): Sampling ratio. (default: :obj:`0.5`) + random_start (bool, optional): If set to :obj:`False`, use the first + node in :math:`\mathbf{X}` as starting node. (default: obj:`True`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + :rtype: :class:`torch.Tensor` + """ + if not paddle_geometric.typing.WITH_TORCH_CLUSTER_BATCH_SIZE: + return torch_cluster.fps(x, batch, ratio, random_start) + return torch_cluster.fps(x, batch, ratio, random_start, batch_size) + + +def knn( + x: Tensor, + y: Tensor, + k: int, + batch_x: OptTensor = None, + batch_y: OptTensor = None, + cosine: bool = False, + num_workers: int = 1, + batch_size: Optional[int] = None, +) -> Tensor: + r"""Finds for each element in :obj:`y` the :obj:`k` nearest points in + :obj:`x`. + + .. code-block:: python + + import torch + from paddle_geometric.nn import knn + + x = torch.tensor([[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]]) + batch_x = torch.tensor([0, 0, 0, 0]) + y = torch.tensor([[-1.0, 0.0], [1.0, 0.0]]) + batch_y = torch.tensor([0, 0]) + assign_index = knn(x, y, 2, batch_x, batch_y) + + Args: + x (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + y (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{M \times F}`. + k (int): The number of neighbors. + batch_x (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + batch_y (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^M`, which assigns each + node to a specific example. (default: :obj:`None`) + cosine (bool, optional): If :obj:`True`, will use the cosine + distance instead of euclidean distance to find nearest neighbors. + (default: :obj:`False`) + num_workers (int, optional): Number of workers to use for computation. + Has no effect in case :obj:`batch_x` or :obj:`batch_y` is not + :obj:`None`, or the input lies on the GPU. (default: :obj:`1`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + :rtype: :class:`torch.Tensor` + """ + if not paddle_geometric.typing.WITH_TORCH_CLUSTER_BATCH_SIZE: + return torch_cluster.knn(x, y, k, batch_x, batch_y, cosine, + num_workers) + return torch_cluster.knn(x, y, k, batch_x, batch_y, cosine, num_workers, + batch_size) + + +def knn_graph( + x: Tensor, + k: int, + batch: OptTensor = None, + loop: bool = False, + flow: str = 'source_to_target', + cosine: bool = False, + num_workers: int = 1, + batch_size: Optional[int] = None, +) -> Tensor: + r"""Computes graph edges to the nearest :obj:`k` points. + + .. code-block:: python + + import torch + from paddle_geometric.nn import knn_graph + + x = torch.tensor([[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]]) + batch = torch.tensor([0, 0, 0, 0]) + edge_index = knn_graph(x, k=2, batch=batch, loop=False) + + Args: + x (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + k (int): The number of neighbors. + batch (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + loop (bool, optional): If :obj:`True`, the graph will contain + self-loops. (default: :obj:`False`) + flow (str, optional): The flow direction when using in combination with + message passing (:obj:`"source_to_target"` or + :obj:`"target_to_source"`). (default: :obj:`"source_to_target"`) + cosine (bool, optional): If :obj:`True`, will use the cosine + distance instead of euclidean distance to find nearest neighbors. + (default: :obj:`False`) + num_workers (int, optional): Number of workers to use for computation. + Has no effect in case :obj:`batch` is not :obj:`None`, or the input + lies on the GPU. (default: :obj:`1`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + :rtype: :class:`torch.Tensor` + """ + if batch is not None and x.device != batch.device: + warnings.warn("Input tensor 'x' and 'batch' are on different devices " + "in 'knn_graph'. Performing blocking device transfer") + batch = batch.to(x.device) + + if not paddle_geometric.typing.WITH_TORCH_CLUSTER_BATCH_SIZE: + return torch_cluster.knn_graph(x, k, batch, loop, flow, cosine, + num_workers) + return torch_cluster.knn_graph(x, k, batch, loop, flow, cosine, + num_workers, batch_size) + + +def radius( + x: Tensor, + y: Tensor, + r: float, + batch_x: OptTensor = None, + batch_y: OptTensor = None, + max_num_neighbors: int = 32, + num_workers: int = 1, + batch_size: Optional[int] = None, +) -> Tensor: + r"""Finds for each element in :obj:`y` all points in :obj:`x` within + distance :obj:`r`. + + .. code-block:: python + + import torch + from paddle_geometric.nn import radius + + x = torch.tensor([[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]]) + batch_x = torch.tensor([0, 0, 0, 0]) + y = torch.tensor([[-1.0, 0.0], [1.0, 0.0]]) + batch_y = torch.tensor([0, 0]) + assign_index = radius(x, y, 1.5, batch_x, batch_y) + + Args: + x (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + y (torch.Tensor): Node feature matrix + :math:`\mathbf{Y} \in \mathbb{R}^{M \times F}`. + r (float): The radius. + batch_x (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + batch_y (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^M`, which assigns each + node to a specific example. (default: :obj:`None`) + max_num_neighbors (int, optional): The maximum number of neighbors to + return for each element in :obj:`y`. (default: :obj:`32`) + num_workers (int, optional): Number of workers to use for computation. + Has no effect in case :obj:`batch_x` or :obj:`batch_y` is not + :obj:`None`, or the input lies on the GPU. (default: :obj:`1`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + :rtype: :class:`torch.Tensor` + + .. warning:: + + The CPU implementation of :meth:`radius` with :obj:`max_num_neighbors` + is biased towards certain quadrants. + Consider setting :obj:`max_num_neighbors` to :obj:`None` or moving + inputs to GPU before proceeding. + """ + if not paddle_geometric.typing.WITH_TORCH_CLUSTER_BATCH_SIZE: + return torch_cluster.radius(x, y, r, batch_x, batch_y, + max_num_neighbors, num_workers) + return torch_cluster.radius(x, y, r, batch_x, batch_y, max_num_neighbors, + num_workers, batch_size) + + +def radius_graph( + x: Tensor, + r: float, + batch: OptTensor = None, + loop: bool = False, + max_num_neighbors: int = 32, + flow: str = 'source_to_target', + num_workers: int = 1, + batch_size: Optional[int] = None, +) -> Tensor: + r"""Computes graph edges to all points within a given distance. + + .. code-block:: python + + import torch + from paddle_geometric.nn import radius_graph + + x = torch.tensor([[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]]) + batch = torch.tensor([0, 0, 0, 0]) + edge_index = radius_graph(x, r=1.5, batch=batch, loop=False) + + Args: + x (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + r (float): The radius. + batch (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + loop (bool, optional): If :obj:`True`, the graph will contain + self-loops. (default: :obj:`False`) + max_num_neighbors (int, optional): The maximum number of neighbors to + return for each element in :obj:`y`. (default: :obj:`32`) + flow (str, optional): The flow direction when using in combination with + message passing (:obj:`"source_to_target"` or + :obj:`"target_to_source"`). (default: :obj:`"source_to_target"`) + num_workers (int, optional): Number of workers to use for computation. + Has no effect in case :obj:`batch` is not :obj:`None`, or the input + lies on the GPU. (default: :obj:`1`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + :rtype: :class:`torch.Tensor` + + .. warning:: + + The CPU implementation of :meth:`radius_graph` with + :obj:`max_num_neighbors` is biased towards certain quadrants. + Consider setting :obj:`max_num_neighbors` to :obj:`None` or moving + inputs to GPU before proceeding. + """ + if batch is not None and x.device != batch.device: + warnings.warn("Input tensor 'x' and 'batch' are on different devices " + "in 'radius_graph'. Performing blocking device transfer") + batch = batch.to(x.device) + + if not paddle_geometric.typing.WITH_TORCH_CLUSTER_BATCH_SIZE: + return torch_cluster.radius_graph(x, r, batch, loop, max_num_neighbors, + flow, num_workers) + return torch_cluster.radius_graph(x, r, batch, loop, max_num_neighbors, + flow, num_workers, batch_size) + + +def nearest( + x: Tensor, + y: Tensor, + batch_x: OptTensor = None, + batch_y: OptTensor = None, +) -> Tensor: + r"""Finds for each element in :obj:`y` the :obj:`k` nearest point in + :obj:`x`. + + .. code-block:: python + + import torch + from paddle_geometric.nn import nearest + + x = torch.tensor([[-1.0, -1.0], [-1.0, 1.0], [1.0, -1.0], [1.0, 1.0]]) + batch_x = torch.tensor([0, 0, 0, 0]) + y = torch.tensor([[-1.0, 0.0], [1.0, 0.0]]) + batch_y = torch.tensor([0, 0]) + cluster = nearest(x, y, batch_x, batch_y) + + Args: + x (torch.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + y (torch.Tensor): Node feature matrix + :math:`\mathbf{Y} \in \mathbb{R}^{M \times F}`. + batch_x (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + batch_y (torch.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^M`, which assigns each + node to a specific example. (default: :obj:`None`) + + :rtype: :class:`torch.Tensor` + """ + return torch_cluster.nearest(x, y, batch_x, batch_y) + + +__all__ = [ + 'global_add_pool', + 'global_mean_pool', + 'global_max_pool', + 'KNNIndex', + 'L2KNNIndex', + 'MIPSKNNIndex', + 'ApproxL2KNNIndex', + 'ApproxMIPSKNNIndex', + 'TopKPooling', + 'SAGPooling', + 'EdgePooling', + 'ClusterPooling', + 'ASAPooling', + 'PANPooling', + 'MemPooling', + 'max_pool', + 'avg_pool', + 'max_pool_x', + 'max_pool_neighbor_x', + 'avg_pool_x', + 'avg_pool_neighbor_x', + 'graclus', + 'voxel_grid', + 'fps', + 'knn', + 'knn_graph', + 'approx_knn', + 'approx_knn_graph', + 'radius', + 'radius_graph', + 'nearest', +] + +classes = __all__ diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/approx_knn.py b/jointContribution/mattergen/paddle_geometric/nn/pool/approx_knn.py new file mode 100644 index 00000000..fc5bfb23 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/approx_knn.py @@ -0,0 +1,70 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +# Replacing 'pynndescent' with an approximation in Paddle +def approx_knn( + x: Tensor, + y: Tensor, + k: int, + batch_x: Tensor = None, + batch_y: Tensor = None, +) -> Tensor: + """Finds for each element in :obj:`y` the :obj:`k` approximated nearest + points in :obj:`x`.""" + from sklearn.neighbors import NearestNeighbors + + if batch_x is None: + batch_x = x.new_zeros(x.shape[0], dtype=paddle.int64) + if batch_y is None: + batch_y = y.new_zeros(y.shape[0], dtype=paddle.int64) + + x = x.unsqueeze(1) if x.ndim == 1 else x + y = y.unsqueeze(1) if y.ndim == 1 else y + + assert x.ndim == 2 and batch_x.ndim == 1 + assert y.ndim == 2 and batch_y.ndim == 1 + assert x.shape[1] == y.shape[1] + assert x.shape[0] == batch_x.shape[0] + assert y.shape[0] == batch_y.shape[0] + + min_xy = min(x.min(), y.min()) + x, y = x - min_xy, y - min_xy + + max_xy = max(x.max(), y.max()) + x, y = x / max_xy, y / max_xy + + # Concat batch/features to ensure no cross-links between examples exist: + x = paddle.concat([x, 2 * x.shape[1] * batch_x.unsqueeze(-1).astype(x.dtype)], axis=-1) + y = paddle.concat([y, 2 * y.shape[1] * batch_y.unsqueeze(-1).astype(y.dtype)], axis=-1) + + # Using sklearn's NearestNeighbors for kNN + nn = NearestNeighbors(n_neighbors=k, algorithm='auto') + nn.fit(x.numpy()) + col, dist = nn.kneighbors(y.numpy()) + dist = paddle.to_tensor(dist).view(-1).to(x.device, x.dtype) + col = paddle.to_tensor(col).view(-1).to(x.device, paddle.int64) + row = paddle.arange(y.shape[0], device=x.device, dtype=paddle.int64) + row = row.tile([k]) + mask = ~paddle.isinf(dist) + row, col = row[mask], col[mask] + + return paddle.stack([row, col], axis=0) + + +def approx_knn_graph( + x: Tensor, + k: int, + batch: Tensor = None, + loop: bool = False, + flow: str = 'source_to_target', +) -> Tensor: + """Computes graph edges to the nearest approximated :obj:`k` points.""" + assert flow in ['source_to_target', 'target_to_source'] + row, col = approx_knn(x, x, k if loop else k + 1, batch, batch) + row, col = (col, row) if flow == 'source_to_target' else (row, col) + if not loop: + mask = row != col + row, col = row[mask], col[mask] + return paddle.stack([row, col], axis=0) diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/asap.py b/jointContribution/mattergen/paddle_geometric/nn/pool/asap.py new file mode 100644 index 00000000..f983304e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/asap.py @@ -0,0 +1,165 @@ +from typing import Callable, Optional, Tuple, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Linear + +from paddle_geometric.nn import LEConv +from paddle_geometric.nn.pool.select import SelectTopK +from paddle_geometric.utils import ( + add_remaining_self_loops, + remove_self_loops, + scatter, + softmax, + to_edge_index, + to_paddle_coo_tensor, + to_paddle_csr_tensor, +) + + +class ASAPooling(paddle.nn.Layer): + r"""The Adaptive Structure Aware Pooling operator from the + `"ASAP: Adaptive Structure Aware Pooling for Learning Hierarchical + Graph Representations" `_ paper. + + Args: + in_channels (int): Size of each input sample. + ratio (float or int): Graph pooling ratio, which is used to compute + :math:`k = \lceil \mathrm{ratio} \cdot N \rceil`, or the value + of :math:`k` itself, depending on whether the type of :obj:`ratio` + is :obj:`float` or :obj:`int`. (default: :obj:`0.5`) + GNN (paddle.nn.Layer, optional): A graph neural network layer for + using intra-cluster properties. + Especially helpful for graphs with higher degree of neighborhood + (one of :class:`paddle_geometric.nn.conv.GraphConv` or any GNN which + supports the :obj:`edge_weight` parameter). + (default: :obj:`None`) + dropout (float, optional): Dropout probability of the normalized + attention coefficients which exposes each node to a stochastically + sampled neighborhood during training. (default: :obj:`0`) + negative_slope (float, optional): LeakyReLU angle of the negative + slope. (default: :obj:`0.2`) + add_self_loops (bool, optional): If set to :obj:`True`, will add self + loops to the new graph connectivity. (default: :obj:`False`) + """ + def __init__(self, in_channels: int, ratio: Union[float, int] = 0.5, + GNN: Optional[Callable] = None, dropout: float = 0.0, + negative_slope: float = 0.2, add_self_loops: bool = False, + **kwargs): + super().__init__() + + self.in_channels = in_channels + self.ratio = ratio + self.negative_slope = negative_slope + self.dropout = dropout + self.GNN = GNN + self.add_self_loops = add_self_loops + + self.lin = Linear(in_channels, in_channels) + self.att = Linear(2 * in_channels, 1) + self.gnn_score = LEConv(self.in_channels, 1) + if self.GNN is not None: + self.gnn_intra_cluster = GNN(self.in_channels, self.in_channels, + **kwargs) + else: + self.gnn_intra_cluster = None + + self.select = SelectTopK(1, ratio) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.lin.reset_parameters() + self.att.reset_parameters() + self.gnn_score.reset_parameters() + if self.gnn_intra_cluster is not None: + self.gnn_intra_cluster.reset_parameters() + self.select.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Tensor, + edge_weight: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + ) -> Tuple[Tensor, Tensor, Optional[Tensor], Tensor, Tensor]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node feature matrix. + edge_index (paddle.Tensor): The edge indices. + edge_weight (paddle.Tensor, optional): The edge weights. + (default: :obj:`None`) + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. (default: :obj:`None`) + + Return types: + * **x** (*paddle.Tensor*): The pooled node embeddings. + * **edge_index** (*paddle.Tensor*): The coarsened edge indices. + * **edge_weight** (*paddle.Tensor, optional*): The coarsened edge + weights. + * **batch** (*paddle.Tensor*): The coarsened batch vector. + * **index** (*paddle.Tensor*): The top-:math:`k` node indices of + nodes which are kept after pooling. + """ + N = x.shape[0] + + edge_index, edge_weight = add_remaining_self_loops( + edge_index, edge_weight, fill_value=1., num_nodes=N) + + if batch is None: + batch = edge_index.new_zeros(x.shape[0]) + + x = x.unsqueeze(-1) if x.ndim == 1 else x + + x_pool = x + if self.gnn_intra_cluster is not None: + x_pool = self.gnn_intra_cluster(x=x, edge_index=edge_index, + edge_weight=edge_weight) + + x_pool_j = x_pool[edge_index[0]] + x_q = scatter(x_pool_j, edge_index[1], dim=0, reduce='max') + x_q = self.lin(x_q)[edge_index[1]] + + score = self.att(paddle.concat([x_q, x_pool_j], axis=-1)).flatten() + score = F.leaky_relu(score, self.negative_slope) + score = softmax(score, edge_index[1], num_nodes=N) + + # Sample attention coefficients stochastically. + score = F.dropout(score, p=self.dropout, training=self.training) + + v_j = x[edge_index[0]] * score.unsqueeze(-1) + x = scatter(v_j, edge_index[1], dim=0, reduce='sum') + + # Cluster selection. + fitness = self.gnn_score(x, edge_index).sigmoid().flatten() + perm = self.select(fitness, batch).node_index + x = x[perm] * fitness[perm].unsqueeze(-1) + batch = batch[perm] + + # Graph coarsening. + A = to_paddle_csr_tensor(edge_index, edge_weight, size=(N, N)) + S = to_paddle_coo_tensor(edge_index, score, size=(N, N)) + S = S.index_select(1, perm).to_sparse_csr() + A = S.t().to_sparse_csr() @ (A @ S) + + if edge_weight is None: + edge_index, _ = to_edge_index(A) + else: + edge_index, edge_weight = to_edge_index(A) + + if self.add_self_loops: + edge_index, edge_weight = add_remaining_self_loops( + edge_index, edge_weight, num_nodes=A.shape[0]) + else: + edge_index, edge_weight = remove_self_loops( + edge_index, edge_weight) + + return x, edge_index, edge_weight, batch, perm + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'ratio={self.ratio})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/avg_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/avg_pool.py new file mode 100644 index 00000000..7cb1b40a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/avg_pool.py @@ -0,0 +1,112 @@ +from typing import Callable, Optional, Tuple + +import paddle +from paddle import Tensor +from paddle_geometric.data import Batch, Data +from paddle_geometric.nn.pool.consecutive import consecutive_cluster + +from paddle_geometric.nn.pool.pool import pool_batch, pool_edge, pool_pos +from paddle_geometric.utils import add_self_loops, scatter + + +def _avg_pool_x( + cluster: Tensor, + x: Tensor, + size: Optional[int] = None, +) -> Tensor: + return scatter(x, cluster, dim=0, dim_size=size, reduce='mean') + + +def avg_pool_x( + cluster: Tensor, + x: Tensor, + batch: Tensor, + batch_size: Optional[int] = None, + size: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + r"""Average pools node features according to the clustering defined in + :attr:`cluster`. + + Args: + cluster (paddle.Tensor): The cluster vector + :math:`\mathbf{c} \in \{ 0, \ldots, N - 1 \}^N`, which assigns each + node to a specific cluster. + x (Tensor): The node feature matrix. + batch (paddle.Tensor): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + size (int, optional): The maximum number of clusters in a single + example. (default: :obj:`None`) + + :rtype: (:class:`paddle.Tensor`, :class:`paddle.Tensor`) if :attr:`size` is + :obj:`None`, else :class:`paddle.Tensor` + """ + if size is not None: + if batch_size is None: + batch_size = int(batch.max().item()) + 1 + return _avg_pool_x(cluster, x, batch_size * size), None + + cluster, perm = consecutive_cluster(cluster) + x = _avg_pool_x(cluster, x) + batch = pool_batch(perm, batch) + + return x, batch + + +def avg_pool( + cluster: Tensor, + data: Data, + transform: Optional[Callable] = None, +) -> Data: + r"""Pools and coarsens a graph given by the + :class:`paddle_geometric.data.Data` object according to the clustering + defined in :attr:`cluster`. + Final node features are defined by the *average* features of all nodes + within the same cluster. + + Args: + cluster (paddle.Tensor): The cluster vector + :math:`\mathbf{c} \in \{ 0, \ldots, N - 1 \}^N`, which assigns each + node to a specific cluster. + data (Data): Graph data object. + transform (callable, optional): A function/transform that takes in the + coarsened and pooled :obj:`paddle_geometric.data.Data` object and + returns a transformed version. (default: :obj:`None`) + + :rtype: :class:`paddle_geometric.data.Data` + """ + cluster, perm = consecutive_cluster(cluster) + + x = None if data.x is None else _avg_pool_x(cluster, data.x) + index, attr = pool_edge(cluster, data.edge_index, data.edge_attr) + batch = None if data.batch is None else pool_batch(perm, data.batch) + pos = None if data.pos is None else pool_pos(cluster, data.pos) + + data = Batch(batch=batch, x=x, edge_index=index, edge_attr=attr, pos=pos) + + if transform is not None: + data = transform(data) + + return data + + +def avg_pool_neighbor_x( + data: Data, + flow: Optional[str] = 'source_to_target', +) -> Data: + r"""Average pools neighboring node features, where each feature in + :obj:`data.x` is replaced by the average feature values from the central + node and its neighbors. + """ + x, edge_index = data.x, data.edge_index + + edge_index, _ = add_self_loops(edge_index, num_nodes=data.num_nodes) + + row, col = edge_index + row, col = (row, col) if flow == 'source_to_target' else (col, row) + + data.x = scatter(x[row], col, dim=0, dim_size=data.num_nodes, + reduce='mean') + return data diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/cluster_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/cluster_pool.py new file mode 100644 index 00000000..e4d613b8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/cluster_pool.py @@ -0,0 +1,145 @@ +from typing import NamedTuple, Optional, Tuple + +import paddle +import paddle.nn.functional as F +from paddle import Tensor + +from paddle_geometric.utils import ( + dense_to_sparse, + one_hot, + to_dense_adj, + to_scipy_sparse_matrix, +) + + +class UnpoolInfo(NamedTuple): + edge_index: Tensor + cluster: Tensor + batch: Tensor + + +class ClusterPooling(paddle.nn.Layer): + r"""The cluster pooling operator from the `"Edge-Based Graph Component + Pooling" `_ paper. + + :class:`ClusterPooling` computes a score for each edge. + Based on the selected edges, graph clusters are calculated and compressed + to one node using the injective :obj:`"sum"` aggregation function. + Edges are remapped based on the nodes created by each cluster and the + original edges. + + Args: + in_channels (int): Size of each input sample. + edge_score_method (str, optional): The function to apply + to compute the edge score from raw edge scores (:obj:`"tanh"`), + :obj:`"sigmoid"`, :obj:`"log_softmax"`). (default: :obj:`"tanh"`) + dropout (float, optional): The probability with + which to drop edge scores during training. (default: :obj:`0.0`) + threshold (float, optional): The threshold of edge scores. If set to + :obj:`None`, will be automatically inferred depending on + :obj:`edge_score_method`. (default: :obj:`None`) + """ + def __init__( + self, + in_channels: int, + edge_score_method: str = 'tanh', + dropout: float = 0.0, + threshold: Optional[float] = None, + ): + super().__init__() + assert edge_score_method in ['tanh', 'sigmoid', 'log_softmax'] + + if threshold is None: + threshold = 0.5 if edge_score_method == 'sigmoid' else 0.0 + + self.in_channels = in_channels + self.edge_score_method = edge_score_method + self.dropout = dropout + self.threshold = threshold + + self.lin = paddle.nn.Linear(2 * in_channels, 1) + + def reset_parameters(self): + """Resets all learnable parameters of the module.""" + self.lin.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Tensor, + batch: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor, UnpoolInfo]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node features. + edge_index (paddle.Tensor): The edge indices. + batch (paddle.Tensor): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. + + Return types: + * **x** *(paddle.Tensor)* - The pooled node features. + * **edge_index** *(paddle.Tensor)* - The coarsened edge indices. + * **batch** *(paddle.Tensor)* - The coarsened batch vector. + * **unpool_info** *(UnpoolInfo)* - Information that can be consumed + for unpooling. + """ + mask = edge_index[0] != edge_index[1] + edge_index = edge_index[:, mask] + + edge_attr = paddle.concat( + [x[edge_index[0]], x[edge_index[1]]], + axis=-1, + ) + edge_score = self.lin(edge_attr).flatten() + edge_score = F.dropout(edge_score, p=self.dropout, + training=self.training) + + if self.edge_score_method == 'tanh': + edge_score = edge_score.tanh() + elif self.edge_score_method == 'sigmoid': + edge_score = edge_score.sigmoid() + else: + assert self.edge_score_method == 'log_softmax' + edge_score = F.log_softmax(edge_score, axis=0) + + return self._merge_edges(x, edge_index, batch, edge_score) + + def _merge_edges( + self, + x: Tensor, + edge_index: Tensor, + batch: Tensor, + edge_score: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor, UnpoolInfo]: + + from scipy.sparse.csgraph import connected_components + + edge_contract = edge_index[:, edge_score > self.threshold] + + adj = to_scipy_sparse_matrix(edge_contract, num_nodes=x.size(0)) + _, cluster_np = connected_components(adj, directed=True, + connection="weak") + + cluster = paddle.to_tensor(cluster_np, dtype=paddle.long, device=x.device) + C = one_hot(cluster) + A = to_dense_adj(edge_index, max_num_nodes=x.size(0)).squeeze(0) + S = to_dense_adj(edge_index, edge_attr=edge_score, + max_num_nodes=x.size(0)).squeeze(0) + + A_contract = to_dense_adj(edge_contract, + max_num_nodes=x.size(0)).squeeze(0) + nodes_single = ((A_contract.sum(axis=-1) + + A_contract.sum(axis=-2)) == 0).nonzero() + S[nodes_single, nodes_single] = 1.0 + + x_out = (S @ C).T @ x + edge_index_out, _ = dense_to_sparse((C.T @ A @ C).fill_diagonal_(0)) + batch_out = batch.new_empty(x_out.size(0)).scatter_(0, cluster, batch) + unpool_info = UnpoolInfo(edge_index, cluster, batch) + + return x_out, edge_index_out, batch_out, unpool_info + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/connect/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/pool/connect/__init__.py new file mode 100644 index 00000000..d7dc2f2a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/connect/__init__.py @@ -0,0 +1,14 @@ +r"""Graph connection package. + +This package provides classes for determining coarsened graph connections in +graph pooling scenarios. +""" + +from .base import Connect, ConnectOutput +from .filter_edges import FilterEdges + +__all__ = [ + 'Connect', + 'ConnectOutput', + 'FilterEdges', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/connect/base.py b/jointContribution/mattergen/paddle_geometric/nn/pool/connect/base.py new file mode 100644 index 00000000..546453cc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/connect/base.py @@ -0,0 +1,109 @@ +from dataclasses import dataclass +from typing import Optional + +import paddle +from paddle import Tensor +import paddle_geometric.typing +from paddle_geometric.nn.pool.select import SelectOutput + + +@dataclass(init=False) +class ConnectOutput: + r"""The output of the :class:`Connect` method, which holds the coarsened + graph structure, and optional pooled edge features and batch vectors. + + Args: + edge_index (paddle.Tensor): The edge indices of the coarsened graph. + edge_attr (paddle.Tensor, optional): The pooled edge features of the + coarsened graph. (default: :obj:`None`) + batch (paddle.Tensor, optional): The pooled batch vector of the + coarsened graph. (default: :obj:`None`) + """ + edge_index: Tensor + edge_attr: Optional[Tensor] = None + batch: Optional[Tensor] = None + + def __init__( + self, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + ): + if edge_index.ndim != 2: + raise ValueError(f"Expected 'edge_index' to be two-dimensional " + f"(got {edge_index.ndim} dimensions)") + + if edge_index.shape[0] != 2: + raise ValueError(f"Expected 'edge_index' to have size '2' in the " + f"first dimension (got '{edge_index.shape[0]}')") + + if edge_attr is not None and edge_attr.shape[0] != edge_index.shape[1]: + raise ValueError(f"Expected 'edge_index' and 'edge_attr' to " + f"hold the same number of edges (got " + f"{edge_index.shape[1]} and {edge_attr.shape[0]} " + f"edges)") + + self.edge_index = edge_index + self.edge_attr = edge_attr + self.batch = batch + + + + +class Connect(paddle.nn.Layer): + r"""An abstract base class for implementing custom edge connection + operators as described in the `"Understanding Pooling in Graph Neural + Networks" `_ paper. + + Specifically, :class:`Connect` determines for each pair of supernodes the + presence or absence of an edge based on the existing edges between the + nodes in the two supernodes. + The operator also computes pooled edge features and batch vectors + (if present). + """ + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + pass + + def forward( + self, + select_output: SelectOutput, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + ) -> ConnectOutput: + r"""Forward pass. + + Args: + select_output (SelectOutput): The output of :class:`Select`. + edge_index (paddle.Tensor): The edge indices. + edge_attr (paddle.Tensor, optional): The edge features. + (default: :obj:`None`) + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific graph. (default: :obj:`None`) + """ + raise NotImplementedError + + @staticmethod + def get_pooled_batch( + select_output: SelectOutput, + batch: Optional[Tensor], + ) -> Optional[Tensor]: + r"""Returns the batch vector of the coarsened graph. + + Args: + select_output (SelectOutput): The output of :class:`Select`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each element to a specific example. (default: :obj:`None`) + """ + if batch is None: + return batch + + out = paddle.arange(select_output.num_clusters, device=batch.device) + return out.scatter_(0, select_output.cluster_index, + batch[select_output.node_index]) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/connect/filter_edges.py b/jointContribution/mattergen/paddle_geometric/nn/pool/connect/filter_edges.py new file mode 100644 index 00000000..f89b4431 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/connect/filter_edges.py @@ -0,0 +1,68 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.pool.connect import Connect, ConnectOutput +from paddle_geometric.nn.pool.select import SelectOutput +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def filter_adj( + edge_index: Tensor, + edge_attr: Optional[Tensor], + node_index: Tensor, + cluster_index: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + if cluster_index is None: + cluster_index = paddle.arange(node_index.shape[0], device=node_index.device) + + mask = node_index.new_full((num_nodes, ), -1) + mask[node_index] = cluster_index + + row, col = edge_index[0], edge_index[1] + row, col = mask[row], mask[col] + mask = (row >= 0) & (col >= 0) + row, col = row[mask], col[mask] + + if edge_attr is not None: + edge_attr = edge_attr[mask] + + return paddle.stack([row, col], axis=0), edge_attr + + +class FilterEdges(Connect): + r"""Filters out edges if their incident nodes are not in any cluster. + + .. math:: + \mathbf{A}^{\prime} &= \mathbf{A}_{\mathbf{i},\mathbf{i}}, + + where :math:`\mathbf{i}` denotes the set of retained nodes. + It is assumed that each cluster contains only one node. + """ + def forward( + self, + select_output: SelectOutput, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + ) -> ConnectOutput: + + if (not paddle.jit.is_scripting() and select_output.num_clusters + != select_output.cluster_index.shape[0]): + raise ValueError(f"'{self.__class__.__name__}' requires each " + f"cluster to contain only one node") + + edge_index, edge_attr = filter_adj( + edge_index, + edge_attr, + select_output.node_index, + select_output.cluster_index, + num_nodes=select_output.num_nodes, + ) + batch = self.get_pooled_batch(select_output, batch) + + return ConnectOutput(edge_index, edge_attr, batch) diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/consecutive.py b/jointContribution/mattergen/paddle_geometric/nn/pool/consecutive.py new file mode 100644 index 00000000..ba98c27d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/consecutive.py @@ -0,0 +1,7 @@ +import paddle + +def consecutive_cluster(src): + unique, inv = paddle.unique(src, return_inverse=True) + perm = paddle.arange(inv.size(0), dtype=inv.dtype, device=inv.device) + perm = paddle.zeros_like(unique, dtype=inv.dtype).scatter_(0, inv, perm) + return inv, perm diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/decimation.py b/jointContribution/mattergen/paddle_geometric/nn/pool/decimation.py new file mode 100644 index 00000000..2ba870d1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/decimation.py @@ -0,0 +1,46 @@ +from typing import Union, Tuple, Any + +import paddle +from paddle import Tensor +from paddle_geometric.utils import cumsum + + +def decimation_indices( + ptr: Any, + decimation_factor: Union[int, float], +) -> Tuple[Tensor, Any]: + """Gets indices which downsample each point cloud by a decimation factor. + + Decimation happens separately for each cloud to prevent emptying smaller + point clouds. Empty clouds are prevented: clouds will have at least + one node after decimation. + + Args: + ptr (LongTensor): The indices of samples in the batch. + decimation_factor (int or float): The value to divide number of nodes + with. Should be higher than (or equal to) :obj:`1` for + downsampling. + + :rtype: (:class:`LongTensor`, :class:`LongTensor`): The indices and + updated :obj:`ptr` after downsampling. + """ + if decimation_factor < 1: + raise ValueError( + f"The argument `decimation_factor` should be higher than (or " + f"equal to) 1 for downsampling. (got {decimation_factor})") + + batch_size = ptr.size(0) - 1 + count = ptr[1:] - ptr[:-1] + decim_count = paddle.floor(count.astype('float') / decimation_factor).astype('int') + decim_count = paddle.maximum(decim_count, paddle.to_tensor([1])) # Prevent empty examples. + + decim_indices = [ + ptr[i] + paddle.argsort(paddle.rand(count[i], device=ptr.device))[:decim_count[i]] + for i in range(batch_size) + ] + decim_indices = paddle.concat(decim_indices, axis=0) + + # Get updated ptr (e.g., for future decimations): + decim_ptr = cumsum(decim_count) + + return decim_indices, decim_ptr diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/edge_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/edge_pool.py new file mode 100644 index 00000000..8f892263 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/edge_pool.py @@ -0,0 +1,147 @@ +from typing import Callable, List, NamedTuple, Optional, Tuple + + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.utils import coalesce, scatter, softmax + + +class UnpoolInfo(NamedTuple): + edge_index: Tensor + cluster: Tensor + batch: Tensor + new_edge_score: Tensor + + +class EdgePooling(paddle.nn.Layer): + def __init__( + self, + in_channels: int, + edge_score_method: Optional[Callable] = None, + dropout: float = 0.0, + add_to_edge_score: float = 0.5, + ): + super().__init__() + self.in_channels = in_channels + if edge_score_method is None: + edge_score_method = self.compute_edge_score_softmax + self.compute_edge_score = edge_score_method + self.add_to_edge_score = add_to_edge_score + self.dropout = dropout + + self.lin = paddle.nn.Linear(2 * in_channels, 1) + + self.reset_parameters() + + def reset_parameters(self): + self.lin.reset_parameters() + + @staticmethod + def compute_edge_score_softmax( + raw_edge_score: Tensor, + edge_index: Tensor, + num_nodes: int, + ) -> Tensor: + return softmax(raw_edge_score, edge_index[1], num_nodes=num_nodes) + + @staticmethod + def compute_edge_score_tanh( + raw_edge_score: Tensor, + edge_index: Optional[Tensor] = None, + num_nodes: Optional[int] = None, + ) -> Tensor: + return paddle.tanh(raw_edge_score) + + @staticmethod + def compute_edge_score_sigmoid( + raw_edge_score: Tensor, + edge_index: Optional[Tensor] = None, + num_nodes: Optional[int] = None, + ) -> Tensor: + return torch.sigmoid(raw_edge_score) + + def forward( + self, + x: Tensor, + edge_index: Tensor, + batch: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor, UnpoolInfo]: + e = torch.cat([x[edge_index[0]], x[edge_index[1]]], dim=-1) + e = self.lin(e).view(-1) + e = F.dropout(e, p=self.dropout, training=self.training) + e = self.compute_edge_score(e, edge_index, x.size(0)) + e = e + self.add_to_edge_score + + x, edge_index, batch, unpool_info = self._merge_edges( + x, edge_index, batch, e) + + return x, edge_index, batch, unpool_info + + def _merge_edges( + self, + x: Tensor, + edge_index: Tensor, + batch: Tensor, + edge_score: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor, UnpoolInfo]: + cluster = torch.empty_like(batch) + perm: List[int] = torch.argsort(edge_score, descending=True).tolist() + + mask = torch.ones(x.size(0), dtype=torch.bool) + + i = 0 + new_edge_indices: List[int] = [] + edge_index_cpu = edge_index.cpu() + for edge_idx in perm: + source = int(edge_index_cpu[0, edge_idx]) + if not bool(mask[source]): + continue + + target = int(edge_index_cpu[1, edge_idx]) + if not bool(mask[target]): + continue + + new_edge_indices.append(edge_idx) + + cluster[source] = i + mask[source] = False + + if source != target: + cluster[target] = i + mask[target] = False + + i += 1 + + j = int(mask.sum()) + cluster[mask] = torch.arange(i, i + j, device=x.device) + i += j + + new_x = scatter(x, cluster, dim=0, dim_size=i, reduce='sum') + new_edge_score = edge_score[new_edge_indices] + if int(mask.sum()) > 0: + remaining_score = x.new_ones( + (new_x.size(0) - len(new_edge_indices), )) + new_edge_score = torch.cat([new_edge_score, remaining_score]) + new_x = new_x * new_edge_score.view(-1, 1) + + new_edge_index = coalesce(cluster[edge_index], num_nodes=new_x.size(0)) + new_batch = x.new_empty(new_x.size(0), dtype=torch.long) + new_batch = new_batch.scatter_(0, cluster, batch) + + unpool_info = UnpoolInfo(edge_index=edge_index, cluster=cluster, + batch=batch, new_edge_score=new_edge_score) + + return new_x, new_edge_index, new_batch, unpool_info + + def unpool( + self, + x: Tensor, + unpool_info: UnpoolInfo, + ) -> Tuple[Tensor, Tensor, Tensor]: + new_x = x / unpool_info.new_edge_score.view(-1, 1) + new_x = new_x[unpool_info.cluster] + return new_x, unpool_info.edge_index, unpool_info.batch + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.in_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/glob.py b/jointContribution/mattergen/paddle_geometric/nn/pool/glob.py new file mode 100644 index 00000000..6eaf9c39 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/glob.py @@ -0,0 +1,99 @@ +from typing import Optional + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle_geometric.utils import scatter + + +def global_add_pool(x: Tensor, batch: Optional[Tensor], size: Optional[int] = None) -> Tensor: + r"""Returns batch-wise graph-level outputs by adding node features + across the node dimension. + + For a single graph :math:`\mathcal{G}_i`, its output is computed by + + .. math:: + \mathbf{r}_i = \sum_{n=1}^{N_i} \mathbf{x}_n. + + Functional method of the + :class:`~paddle_geometric.nn.aggr.SumAggregation` module. + + Args: + x (paddle.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times F}`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. + size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + Returns: + The pooled features for each graph in the batch. + """ + dim = -1 if isinstance(x, Tensor) and x.ndim == 1 else -2 + + if batch is None: + return paddle.sum(x, axis=dim, keepdim=x.ndim <= 2) + return scatter(x, batch, dim=dim, dim_size=size, reduce='sum') + + +def global_mean_pool(x: Tensor, batch: Optional[Tensor], size: Optional[int] = None) -> Tensor: + r"""Returns batch-wise graph-level outputs by averaging node features + across the node dimension. + + For a single graph :math:`\mathcal{G}_i`, its output is computed by + + .. math:: + \mathbf{r}_i = \frac{1}{N_i} \sum_{n=1}^{N_i} \mathbf{x}_n. + + Functional method of the + :class:`~paddle_geometric.nn.aggr.MeanAggregation` module. + + Args: + x (paddle.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times F}`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. + size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + Returns: + The pooled features for each graph in the batch. + """ + dim = -1 if isinstance(x, Tensor) and x.ndim == 1 else -2 + + if batch is None: + return paddle.mean(x, dim=dim, keepdim=x.ndim <= 2) + return scatter(x, batch, dim=dim, dim_size=size, reduce='mean') + + +def global_max_pool(x: Tensor, batch: Optional[Tensor], size: Optional[int] = None) -> Tensor: + r"""Returns batch-wise graph-level outputs by taking the channel-wise + maximum across the node dimension. + + For a single graph :math:`\mathcal{G}_i`, its output is computed by + + .. math:: + \mathbf{r}_i = \max_{n=1}^{N_i} \, \mathbf{x}_n. + + Functional method of the + :class:`~paddle_geometric.nn.aggr.MaxAggregation` module. + + Args: + x (paddle.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times F}`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. + size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + + Returns: + The pooled features for each graph in the batch. + """ + dim = -1 if isinstance(x, Tensor) and x.ndim == 1 else -2 + + if batch is None: + return paddle.max(x, dim=dim, keepdim=x.ndim <= 2)[0] + return scatter(x, batch, dim=dim, dim_size=size, reduce='max') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/graclus.py b/jointContribution/mattergen/paddle_geometric/nn/pool/graclus.py new file mode 100644 index 00000000..950123d9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/graclus.py @@ -0,0 +1,35 @@ +from typing import Optional + +from paddle import Tensor + +import paddle_geometric.typing + +# Check if the paddle equivalent for graph clustering is available + +graclus_cluster = None + + +def graclus(edge_index: Tensor, weight: Optional[Tensor] = None, + num_nodes: Optional[int] = None): + r"""A greedy clustering algorithm from the `"Weighted Graph Cuts without + Eigenvectors: A Multilevel Approach" `_ paper of picking an unmarked + vertex and matching it with one of its unmarked neighbors (that maximizes + its edge weight). + The GPU algorithm is adapted from the `"A GPU Algorithm for Greedy Graph + Matching" `_ + paper. + + Args: + edge_index (paddle.Tensor): The edge indices. + weight (paddle.Tensor, optional): One-dimensional edge weights. + (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + :rtype: :class:`paddle.Tensor` + """ + if graclus_cluster is None: + raise ImportError('`graclus` requires `paddle-cluster`.') + + return graclus_cluster(edge_index[0], edge_index[1], weight, num_nodes) diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/knn.py b/jointContribution/mattergen/paddle_geometric/nn/pool/knn.py new file mode 100644 index 00000000..88fd1fb6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/knn.py @@ -0,0 +1,327 @@ +import warnings +from typing import NamedTuple, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import cumsum, degree, to_dense_batch + + +class KNNOutput(NamedTuple): + score: Tensor + index: Tensor + + +class KNNIndex: + r"""A base class to perform fast :math:`k`-nearest neighbor search + (:math:`k`-NN) via the :obj:`faiss` library. + + Please ensure that :obj:`faiss` is installed by running + + .. code-block:: bash + + pip install faiss-cpu + # or + pip install faiss-gpu + + depending on whether to plan to use GPU-processing for :math:`k`-NN search. + + Args: + index_factory (str, optional): The name of the index factory to use, + *e.g.*, :obj:`"IndexFlatL2"` or :obj:`"IndexFlatIP"`. See `here + `_ for more information. + emb (paddle.Tensor, optional): The data points to add. + (default: :obj:`None`) + reserve (int, optional): The number of elements to reserve memory for + before re-allocating (GPU-only). (default: :obj:`None`) + """ + def __init__( + self, + index_factory: Optional[str] = None, + emb: Optional[Tensor] = None, + reserve: Optional[int] = None, + ): + warnings.filterwarnings('ignore', '.*TypedStorage is deprecated.*') + + import faiss + + self.index_factory = index_factory + self.index: Optional[faiss.Index] = None + self.reserve = reserve + + if emb is not None: + self.add(emb) + + @property + def numel(self) -> int: + r"""The number of data points to search in.""" + if self.index is None: + return 0 + return self.index.ntotal + + def _create_index(self, channels: int): + import faiss + return faiss.index_factory(channels, self.index_factory) + + def add(self, emb: Tensor): + r"""Adds new data points to the :class:`KNNIndex` to search in. + + Args: + emb (paddle.Tensor): The data points to add. + """ + import faiss + import faiss.contrib.torch_utils + + if emb.dim() != 2: + raise ValueError(f"'emb' needs to be two-dimensional " + f"(got {emb.dim()} dimensions)") + + if self.index is None: + self.index = self._create_index(emb.size(1)) + + if emb.device != paddle.device('cpu'): + self.index = faiss.index_cpu_to_gpu( + faiss.StandardGpuResources(), + emb.device.index, + self.index, + ) + + if self.reserve is not None: + if hasattr(self.index, 'reserveMemory'): + self.index.reserveMemory(self.reserve) + else: + warnings.warn(f"'{self.index.__class__.__name__}' " + f"does not support pre-allocation of " + f"memory") + + self.index.train(emb) + + self.index.add(emb.detach()) + + def search( + self, + emb: Tensor, + k: int, + exclude_links: Optional[Tensor] = None, + ) -> KNNOutput: + r"""Search for the :math:`k` nearest neighbors of the given data + points. Returns the distance/similarity score of the nearest neighbors + and their indices. + + Args: + emb (paddle.Tensor): The data points to add. + k (int): The number of nearest neighbors to return. + exclude_links (paddle.Tensor): The links to exclude from searching. + Needs to be a COO tensor of shape :obj:`[2, num_links]`, where + :obj:`exclude_links[0]` refers to indices in :obj:`emb`, and + :obj:`exclude_links[1]` refers to the data points in the + :class:`KNNIndex`. (default: :obj:`None`) + """ + if self.index is None: + raise RuntimeError(f"'{self.__class__.__name__}' is not yet " + "initialized. Please call `add(...)` first.") + + if emb.dim() != 2: + raise ValueError(f"'emb' needs to be two-dimensional " + f"(got {emb.dim()} dimensions)") + + query_k = k + + if exclude_links is not None: + deg = degree(exclude_links[0], num_nodes=emb.size(0)).max() + query_k = k + int(deg.max() if deg.numel() > 0 else 0) + + query_k = min(query_k, self.numel) + + if k > 2048: # `faiss` supports up-to `k=2048`: + warnings.warn(f"Capping 'k' to faiss' upper limit of 2048 " + f"(got {k}). This may cause some relevant items to " + f"not be retrieved.") + elif query_k > 2048: + warnings.warn(f"Capping 'k' to faiss' upper limit of 2048 " + f"(got {k} which got extended to {query_k} due to " + f"the exclusion of existing links). This may cause " + f"some relevant items to not be retrieved.") + query_k = 2048 + + score, index = self.index.search(emb.detach(), query_k) + + if exclude_links is not None: + # Drop indices to exclude by converting to flat vector: + flat_exclude = self.numel * exclude_links[0] + exclude_links[1] + + offset = paddle.arange( + start=0, + end=self.numel * index.size(0), + step=self.numel, + device=index.device, + ).view(-1, 1) + flat_index = (index + offset).view(-1) + + notin = paddle.isin(flat_index, flat_exclude).logical_not_() + + score = score.view(-1)[notin] + index = index.view(-1)[notin] + + # Only maintain top-k scores: + count = notin.view(-1, query_k).sum(dim=1) + cum_count = cumsum(count) + + batch = paddle.arange(count.numel(), device=count.device) + batch = batch.repeat_interleave(count, output_size=cum_count[-1]) + + batch_arange = paddle.arange(count.sum(), device=count.device) + batch_arange = batch_arange - cum_count[batch] + + mask = batch_arange < k + score = score[mask] + index = index[mask] + + if count.min() < k: # Fill with dummy scores: + batch = batch[mask] + score, _ = to_dense_batch( + score, + batch, + fill_value=float('-inf'), + max_num_nodes=k, + batch_size=emb.size(0), + ) + index, _ = to_dense_batch( + index, + batch, + fill_value=-1, + max_num_nodes=k, + batch_size=emb.size(0), + ) + + score = score.view(-1, k) + index = index.view(-1, k) + + return KNNOutput(score, index) + + def get_emb(self) -> Tensor: + r"""Returns the data points stored in the :class:`KNNIndex`.""" + if self.index is None: + raise RuntimeError(f"'{self.__class__.__name__}' is not yet " + "initialized. Please call `add(...)` first.") + + return self.index.reconstruct_n(0, self.numel) + + +class L2KNNIndex(KNNIndex): + r"""Performs fast :math:`k`-nearest neighbor search (:math:`k`-NN) based on + the :math:`L_2` metric via the :obj:`faiss` library. + + Args: + emb (paddle.Tensor, optional): The data points to add. + (default: :obj:`None`) + """ + def __init__(self, emb: Optional[Tensor] = None): + super().__init__(index_factory=None, emb=emb) + + def _create_index(self, channels: int): + import faiss + return faiss.IndexFlatL2(channels) + + +class MIPSKNNIndex(KNNIndex): + r"""Performs fast :math:`k`-nearest neighbor search (:math:`k`-NN) based on + the maximum inner product via the :obj:`faiss` library. + + Args: + emb (paddle.Tensor, optional): The data points to add. + (default: :obj:`None`) + """ + def __init__(self, emb: Optional[Tensor] = None): + super().__init__(index_factory=None, emb=emb) + + def _create_index(self, channels: int): + import faiss + return faiss.IndexFlatIP(channels) + + +class ApproxL2KNNIndex(KNNIndex): + r"""Performs fast approximate :math:`k`-nearest neighbor search + (:math:`k`-NN) based on the the :math:`L_2` metric via the :obj:`faiss` + library. + Hyperparameters needs to be tuned for speed-accuracy trade-off. + + Args: + num_cells (int): The number of cells. + num_cells_to_visit (int): The number of cells that are visited to + perform to search. + bits_per_vector (int): The number of bits per sub-vector. + emb (paddle.Tensor, optional): The data points to add. + (default: :obj:`None`) + reserve (int, optional): The number of elements to reserve memory for + before re-allocating (GPU only). (default: :obj:`None`) + """ + def __init__( + self, + num_cells: int, + num_cells_to_visit: int, + bits_per_vector: int, + emb: Optional[Tensor] = None, + reserve: Optional[int] = None, + ): + self.num_cells = num_cells + self.num_cells_to_visit = num_cells_to_visit + self.bits_per_vector = bits_per_vector + super().__init__(index_factory=None, emb=emb, reserve=reserve) + + def _create_index(self, channels: int): + import faiss + index = faiss.IndexIVFPQ( + faiss.IndexFlatL2(channels), + channels, + self.num_cells, + self.bits_per_vector, + 8, + faiss.METRIC_L2, + ) + index.nprobe = self.num_cells_to_visit + return index + + +class ApproxMIPSKNNIndex(KNNIndex): + r"""Performs fast approximate :math:`k`-nearest neighbor search + (:math:`k`-NN) based on the maximum inner product via the :obj:`faiss` + library. + Hyperparameters needs to be tuned for speed-accuracy trade-off. + + Args: + num_cells (int): The number of cells. + num_cells_to_visit (int): The number of cells that are visited to + perform to search. + bits_per_vector (int): The number of bits per sub-vector. + emb (paddle.Tensor, optional): The data points to add. + (default: :obj:`None`) + reserve (int, optional): The number of elements to reserve memory for + before re-allocating (GPU only). (default: :obj:`None`) + """ + def __init__( + self, + num_cells: int, + num_cells_to_visit: int, + bits_per_vector: int, + emb: Optional[Tensor] = None, + reserve: Optional[int] = None, + ): + self.num_cells = num_cells + self.num_cells_to_visit = num_cells_to_visit + self.bits_per_vector = bits_per_vector + super().__init__(index_factory=None, emb=emb, reserve=reserve) + + def _create_index(self, channels: int): + import faiss + index = faiss.IndexIVFPQ( + faiss.IndexFlatIP(channels), + channels, + self.num_cells, + self.bits_per_vector, + 8, + faiss.METRIC_INNER_PRODUCT, + ) + index.nprobe = self.num_cells_to_visit + return index diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/max_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/max_pool.py new file mode 100644 index 00000000..4f351323 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/max_pool.py @@ -0,0 +1,118 @@ +import warnings +from typing import Callable, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Batch, Data +from paddle_geometric.nn.pool.consecutive import consecutive_cluster +from paddle_geometric.nn.pool.pool import pool_batch, pool_edge, pool_pos +from paddle_geometric.utils import add_self_loops, scatter + + +def _max_pool_x( + cluster: Tensor, + x: Tensor, + size: Optional[int] = None, +) -> Tensor: + return scatter(x, cluster, dim=0, dim_size=size, reduce='max') + + +def max_pool_x( + cluster: Tensor, + x: Tensor, + batch: Tensor, + batch_size: Optional[int] = None, + size: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + r"""Max-Pools node features according to the clustering defined in + :attr:`cluster`. + + Args: + cluster (paddle.Tensor): The cluster vector + :math:`\mathbf{c} \in \{ 0, \ldots, N - 1 \}^N`, which assigns each + node to a specific cluster. + x (Tensor): The node feature matrix. + batch (paddle.Tensor): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + size (int, optional): The maximum number of clusters in a single + example. This property is useful to obtain a batch-wise dense + representation, *e.g.* for applying FC layers, but should only be + used if the size of the maximum number of clusters per example is + known in advance. (default: :obj:`None`) + + :rtype: (:class:`paddle.Tensor`, :class:`paddle.Tensor`) if :attr:`size` is + :obj:`None`, else :class:`paddle.Tensor` + """ + if size is not None: + if batch_size is None: + batch_size = int(batch.max().item()) + 1 + return _max_pool_x(cluster, x, batch_size * size), None + + cluster, perm = consecutive_cluster(cluster) + x = _max_pool_x(cluster, x) + batch = pool_batch(perm, batch) + + return x, batch + + +def max_pool( + cluster: Tensor, + data: Data, + transform: Optional[Callable] = None, +) -> Data: + r"""Pools and coarsens a graph given by the + :class:`paddle_geometric.data.Data` object according to the clustering + defined in :attr:`cluster`. + All nodes within the same cluster will be represented as one node. + Final node features are defined by the *maximum* features of all nodes + within the same cluster, node positions are averaged and edge indices are + defined to be the union of the edge indices of all nodes within the same + cluster. + + Args: + cluster (paddle.Tensor): The cluster vector + :math:`\mathbf{c} \in \{ 0, \ldots, N - 1 \}^N`, which assigns each + node to a specific cluster. + data (Data): Graph data object. + transform (callable, optional): A function/transform that takes in the + coarsened and pooled :obj:`paddle_geometric.data.Data` object and + returns a transformed version. (default: :obj:`None`) + + :rtype: :class:`paddle_geometric.data.Data` + """ + cluster, perm = consecutive_cluster(cluster) + + x = None if data.x is None else _max_pool_x(cluster, data.x) + index, attr = pool_edge(cluster, data.edge_index, data.edge_attr) + batch = None if data.batch is None else pool_batch(perm, data.batch) + pos = None if data.pos is None else pool_pos(cluster, data.pos) + + data = Batch(batch=batch, x=x, edge_index=index, edge_attr=attr, pos=pos) + + if transform is not None: + data = transform(data) + + return data + + +def max_pool_neighbor_x( + data: Data, + flow: Optional[str] = 'source_to_target', +) -> Data: + r"""Max pools neighboring node features, where each feature in + :obj:`data.x` is replaced by the feature value with the maximum value from + the central node and its neighbors. + """ + x, edge_index = data.x, data.edge_index + + edge_index, _ = add_self_loops(edge_index, num_nodes=data.num_nodes) + + row, col = edge_index + row, col = (row, col) if flow == 'source_to_target' else (col, row) + + data.x = scatter(x[row], col, dim=0, dim_size=data.num_nodes, reduce='max') + return data diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/mem_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/mem_pool.py new file mode 100644 index 00000000..b2e345d2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/mem_pool.py @@ -0,0 +1,138 @@ +import warnings +from typing import Optional, Tuple + +import paddle +from paddle import Tensor +from paddle.nn import Conv2D, KLDivLoss, Linear + +from paddle_geometric.utils import to_dense_batch + +EPS = 1e-15 + + +class MemPooling(paddle.nn.Layer): + r"""Memory based pooling layer from `"Memory-Based Graph Networks" + `_ paper, which learns a coarsened graph + representation based on soft cluster assignments. + + .. math:: + S_{i,j}^{(h)} &= \frac{ + (1+{\| \mathbf{x}_i-\mathbf{k}^{(h)}_j \|}^2 / \tau)^{ + -\frac{1+\tau}{2}}}{ + \sum_{k=1}^K (1 + {\| \mathbf{x}_i-\mathbf{k}^{(h)}_k \|}^2 / \tau)^{ + -\frac{1+\tau}{2}}} + + \mathbf{S} &= \textrm{softmax}(\textrm{Conv2d} + (\Vert_{h=1}^H \mathbf{S}^{(h)})) \in \mathbb{R}^{N \times K} + + \mathbf{X}^{\prime} &= \mathbf{S}^{\top} \mathbf{X} \mathbf{W} \in + \mathbb{R}^{K \times F^{\prime}} + + where :math:`H` denotes the number of heads, and :math:`K` denotes the + number of clusters. + + Args: + in_channels (int): Size of each input sample :math:`F`. + out_channels (int): Size of each output sample :math:`F^{\prime}`. + heads (int): The number of heads :math:`H`. + num_clusters (int): number of clusters :math:`K` per head. + tau (int, optional): The temperature :math:`\tau`. (default: :obj:`1.`) + """ + def __init__(self, in_channels: int, out_channels: int, heads: int, + num_clusters: int, tau: float = 1.): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.num_clusters = num_clusters + self.tau = tau + + self.k = paddle.create_parameter(shape=[heads, num_clusters, in_channels], dtype='float32') + self.conv = Conv2D(heads, 1, kernel_size=1, padding=0, bias_attr=False) + self.lin = Linear(in_channels, out_channels, bias_attr=False) + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + paddle.nn.initializer.uniform_(self.k, -1., 1.) + self.conv.reset_parameters() + self.lin.reset_parameters() + + @staticmethod + def kl_loss(S: Tensor) -> Tensor: + r"""The additional KL divergence-based loss. + + .. math:: + P_{i,j} &= \frac{S_{i,j}^2 / \sum_{n=1}^N S_{n,j}}{\sum_{k=1}^K + S_{i,k}^2 / \sum_{n=1}^N S_{n,k}} + + \mathcal{L}_{\textrm{KL}} &= \textrm{KLDiv}(\mathbf{P} \Vert + \mathbf{S}) + """ + S_2 = S**2 + P = S_2 / S.sum(axis=1, keepdim=True) + denom = P.sum(axis=2, keepdim=True) + denom[S.sum(axis=2, keepdim=True) == 0.0] = 1.0 + P /= denom + + loss = KLDivLoss(reduction='batchmean', log_target=False) + return loss(paddle.clamp(S, EPS).log(), paddle.clamp(P, EPS)) + + def forward( + self, + x: Tensor, + batch: Optional[Tensor] = None, + mask: Optional[Tensor] = None, + max_num_nodes: Optional[int] = None, + batch_size: Optional[int] = None, + ) -> Tuple[Tensor, Tensor]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node feature tensor of shape + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}` or + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. + Should not be provided in case node features already have shape + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`. + (default: :obj:`None`) + mask (paddle.Tensor, optional): A mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{B \times N}`, which + indicates valid nodes for each graph when using + node features of shape + :math:`\mathbf{X} \in \mathbb{R}^{B \times N \times F}`. + (default: :obj:`None`) + max_num_nodes (int, optional): The size of the :math:`B` node + dimension. Automatically calculated if not given. + (default: :obj:`None`) + batch_size (int, optional): The number of examples :math:`B`. + Automatically calculated if not given. (default: :obj:`None`) + """ + if x.dim() <= 2: + x, mask = to_dense_batch(x, batch, max_num_nodes=max_num_nodes, + batch_size=batch_size) + elif mask is None: + mask = paddle.ones((x.shape[0], x.shape[1]), dtype=paddle.bool) + + (B, N, _), H, K = x.shape, self.heads, self.num_clusters + + dist = paddle.cdist(self.k.reshape([H * K, -1]), x.reshape([B * N, -1]), p=2)**2 + dist = (1. + dist / self.tau).pow(-(self.tau + 1.0) / 2.0) + + dist = dist.reshape([H, K, B, N]).transpose([2, 0, 3, 1]) # [B, H, N, K] + S = dist / dist.sum(axis=-1, keepdim=True) + + S = self.conv(S).squeeze(axis=1).softmax(axis=-1) # [B, N, K] + S = S * mask.reshape([B, N, 1]) + + x = self.lin(S.transpose([0, 2, 1]) @ x) + + return x, S + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.in_channels}, ' + f'{self.out_channels}, heads={self.heads}, ' + f'num_clusters={self.num_clusters})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/pan_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/pan_pool.py new file mode 100644 index 00000000..4e642448 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/pan_pool.py @@ -0,0 +1,120 @@ +import warnings +from typing import Callable, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.pool.connect import FilterEdges +from paddle_geometric.nn.pool.select import SelectTopK +from paddle_geometric.typing import OptTensor, SparseTensor +from paddle_geometric.utils import scatter + + +class PANPooling(paddle.nn.Layer): + r"""The path integral based pooling operator from the + `"Path Integral Based Convolution and Pooling for Graph Neural Networks" + `_ paper. + + PAN pooling performs top-:math:`k` pooling where global node importance is + measured based on node features and the MET matrix: + + .. math:: + {\rm score} = \beta_1 \mathbf{X} \cdot \mathbf{p} + \beta_2 + {\rm deg}(\mathbf{M}) + + Args: + in_channels (int): Size of each input sample. + ratio (float): Graph pooling ratio, which is used to compute + :math:`k = \lceil \mathrm{ratio} \cdot N \rceil`. + This value is ignored if min_score is not None. + (default: :obj:`0.5`) + min_score (float, optional): Minimal node score :math:`\tilde{\alpha}` + which is used to compute indices of pooled nodes + :math:`\mathbf{i} = \mathbf{y}_i > \tilde{\alpha}`. + When this value is not :obj:`None`, the :obj:`ratio` argument is + ignored. (default: :obj:`None`) + multiplier (float, optional): Coefficient by which features gets + multiplied after pooling. This can be useful for large graphs and + when :obj:`min_score` is used. (default: :obj:`1.0`) + nonlinearity (str or callable, optional): The non-linearity to use. + (default: :obj:`"tanh"`) + """ + def __init__( + self, + in_channels: int, + ratio: float = 0.5, + min_score: Optional[float] = None, + multiplier: float = 1.0, + nonlinearity: Union[str, Callable] = 'tanh', + ): + super().__init__() + + self.in_channels = in_channels + self.ratio = ratio + self.min_score = min_score + self.multiplier = multiplier + + # Initialize parameters with paddle.create_parameter + self.p = paddle.create_parameter(shape=[in_channels], dtype='float32') + self.beta = paddle.create_parameter(shape=[2], dtype='float32') + self.select = SelectTopK(1, ratio, min_score, nonlinearity) + self.connect = FilterEdges() + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.p.data.fill_(1) + self.beta.data.fill_(0.5) + self.select.reset_parameters() + + def forward( + self, + x: Tensor, + M: SparseTensor, + batch: OptTensor = None, + ) -> Tuple[Tensor, Tensor, Tensor, OptTensor, Tensor, Tensor]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node feature matrix. + M (SparseTensor): The MET matrix :math:`\mathbf{M}`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. (default: :obj:`None`) + """ + if batch is None: + batch = x.new_zeros(x.shape[0], dtype=paddle.long) + + row, col, edge_weight = M.coo() + assert edge_weight is not None + + score1 = (x * self.p).sum(axis=-1) + score2 = scatter(edge_weight, col, 0, dim_size=x.shape[0], reduce='sum') + score = self.beta[0] * score1 + self.beta[1] * score2 + + select_out = self.select(score, batch) + + perm = select_out.node_index + score = select_out.weight + assert score is not None + + x = x[perm] * score.view(-1, 1) + x = self.multiplier * x if self.multiplier != 1 else x + + edge_index = paddle.stack([col, row], axis=0) + connect_out = self.connect(select_out, edge_index, edge_weight, batch) + edge_weight = connect_out.edge_attr + assert edge_weight is not None + + return (x, connect_out.edge_index, edge_weight, connect_out.batch, + perm, score) + + def __repr__(self) -> str: + if self.min_score is None: + ratio = f'ratio={self.ratio}' + else: + ratio = f'min_score={self.min_score}' + + return (f'{self.__class__.__name__}({self.in_channels}, {ratio}, ' + f'multiplier={self.multiplier})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/pool.py new file mode 100644 index 00000000..ae255612 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/pool.py @@ -0,0 +1,29 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import coalesce, remove_self_loops, scatter + + +def pool_edge( + cluster, + edge_index, + edge_attr: Optional[paddle.Tensor] = None, + reduce: Optional[str] = 'sum', +): + num_nodes = cluster.shape[0] + edge_index = cluster[edge_index.flatten()].reshape([2, -1]) + edge_index, edge_attr = remove_self_loops(edge_index, edge_attr) + if edge_index.numel() > 0: + edge_index, edge_attr = coalesce(edge_index, edge_attr, num_nodes, + reduce=reduce) + return edge_index, edge_attr + + +def pool_batch(perm, batch): + return batch[perm] + + +def pool_pos(cluster, pos): + return scatter(pos, cluster, dim=0, reduce='mean') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/sag_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/sag_pool.py new file mode 100644 index 00000000..ea96fce8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/sag_pool.py @@ -0,0 +1,150 @@ +from typing import Union, Optional, Callable, Tuple + +import paddle +from paddle import nn +from paddle import Tensor +from paddle_geometric.nn import GraphConv +from paddle_geometric.nn.pool.connect import FilterEdges +from paddle_geometric.nn.pool.select import SelectTopK +from paddle_geometric.typing import OptTensor + + +class SAGPooling(nn.Layer): + r"""The self-attention pooling operator from the "Self-Attention Graph + Pooling" _ and "Understanding + Attention and Generalization in Graph Neural Networks" + _ papers. + + If :obj:min_score :math:\tilde{\alpha} is :obj:None, computes: + + .. math:: + \mathbf{y} &= \textrm{GNN}(\mathbf{X}, \mathbf{A}) + + \mathbf{i} &= \mathrm{top}_k(\mathbf{y}) + + \mathbf{X}^{\prime} &= (\mathbf{X} \odot + \mathrm{tanh}(\mathbf{y}))_{\mathbf{i}} + + \mathbf{A}^{\prime} &= \mathbf{A}_{\mathbf{i},\mathbf{i}} + + If :obj:min_score :math:\tilde{\alpha} is a value in :obj:[0, 1], + computes: + + .. math:: + \mathbf{y} &= \mathrm{softmax}(\textrm{GNN}(\mathbf{X},\mathbf{A})) + + \mathbf{i} &= \mathbf{y}_i > \tilde{\alpha} + + \mathbf{X}^{\prime} &= (\mathbf{X} \odot \mathbf{y})_{\mathbf{i}} + + \mathbf{A}^{\prime} &= \mathbf{A}_{\mathbf{i},\mathbf{i}}. + + Projections scores are learned based on a graph neural network layer. + + Args: + in_channels (int): Size of each input sample. + ratio (float or int): Graph pooling ratio, which is used to compute + :math:k = \lceil \mathrm{ratio} \cdot N \rceil, or the value + of :math:k itself, depending on whether the type of :obj:ratio + is :obj:float or :obj:int. + This value is ignored if :obj:min_score is not :obj:None. + (default: :obj:0.5) + GNN (paddle.nn.Layer, optional): A graph neural network layer for + calculating projection scores (one of + :class:paddle_geometric.nn.conv.GraphConv, + :class:paddle_geometric.nn.conv.GCNConv, + :class:paddle_geometric.nn.conv.GATConv or + :class:paddle_geometric.nn.conv.SAGEConv). (default: + :class:paddle_geometric.nn.conv.GraphConv) + min_score (float, optional): Minimal node score :math:\tilde{\alpha} + which is used to compute indices of pooled nodes + :math:\mathbf{i} = \mathbf{y}_i > \tilde{\alpha}. + When this value is not :obj:None, the :obj:ratio argument is + ignored. (default: :obj:None) + multiplier (float, optional): Coefficient by which features gets + multiplied after pooling. This can be useful for large graphs and + when :obj:min_score is used. (default: :obj:1) + nonlinearity (str or callable, optional): The non-linearity to use. + (default: :obj:"tanh") + **kwargs (optional): Additional parameters for initializing the graph + neural network layer. + """ + def __init__( + self, + in_channels: int, + ratio: Union[float, int] = 0.5, + GNN: nn.Layer = GraphConv, + min_score: Optional[float] = None, + multiplier: float = 1.0, + nonlinearity: Union[str, Callable] = 'tanh', + **kwargs, + ): + super(SAGPooling, self).__init__() + + self.in_channels = in_channels + self.ratio = ratio + self.min_score = min_score + self.multiplier = multiplier + + self.gnn = GNN(in_channels, 1, **kwargs) + self.select = SelectTopK(1, ratio, min_score, nonlinearity) + self.connect = FilterEdges() + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.gnn.reset_parameters() + self.select.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Tensor, + edge_attr: OptTensor = None, + batch: OptTensor = None, + attn: OptTensor = None, + ) -> Tuple[Tensor, Tensor, OptTensor, OptTensor, Tensor, Tensor]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node feature matrix. + edge_index (paddle.Tensor): The edge indices. + edge_attr (paddle.Tensor, optional): The edge features. + (default: :obj:None) + batch (paddle.Tensor, optional): The batch vector + :math:\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N, which assigns + each node to a specific example. (default: :obj:None) + attn (paddle.Tensor, optional): Optional node-level matrix to use + for computing attention scores instead of using the node + feature matrix :obj:x. (default: :obj:None) + """ + if batch is None: + batch = paddle.zeros([x.shape[0]], dtype='int64') + + attn = x if attn is None else attn + attn = attn.reshape([-1, 1]) if attn.ndim == 1 else attn + attn = self.gnn(attn, edge_index) + + select_out = self.select(attn, batch) + + perm = select_out.node_index + score = select_out.weight + assert score is not None + + x = x[perm] * score.reshape([-1, 1]) + x = self.multiplier * x if self.multiplier != 1 else x + + connect_out = self.connect(select_out, edge_index, edge_attr, batch) + + return (x, connect_out.edge_index, connect_out.edge_attr, + connect_out.batch, perm, score) + + def __repr__(self) -> str: + if self.min_score is None: + ratio = f'ratio={self.ratio}' + else: + ratio = f'min_score={self.min_score}' + + return (f'{self.__class__.__name__}({self.gnn.__class__.__name__}, ' + f'{self.in_channels}, {ratio}, multiplier={self.multiplier})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/select/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/pool/select/__init__.py new file mode 100644 index 00000000..7c219a13 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/select/__init__.py @@ -0,0 +1,14 @@ +r"""Node-selection package. + +This package provides classes for node selection methods in graph pooling +scenarios. +""" + +from .base import Select, SelectOutput +from .topk import SelectTopK + +__all__ = [ + 'Select', + 'SelectOutput', + 'SelectTopK', +] diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/select/base.py b/jointContribution/mattergen/paddle_geometric/nn/pool/select/base.py new file mode 100644 index 00000000..900cea8a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/select/base.py @@ -0,0 +1,86 @@ +from dataclasses import dataclass +from typing import Optional + +import paddle +from paddle import Tensor + +import paddle_geometric.typing + + +@dataclass(init=False) +class SelectOutput: + r"""The output of the :class:`Select` method, which holds an assignment + from selected nodes to their respective cluster(s). + + Args: + node_index (paddle.Tensor): The indices of the selected nodes. + num_nodes (int): The number of nodes. + cluster_index (paddle.Tensor): The indices of the clusters each node in + :obj:`node_index` is assigned to. + num_clusters (int): The number of clusters. + weight (paddle.Tensor, optional): A weight vector, denoting the strength + of the assignment of a node to its cluster. (default: :obj:`None`) + """ + node_index: Tensor + num_nodes: int + cluster_index: Tensor + num_clusters: int + weight: Optional[Tensor] = None + + def __init__( + self, + node_index: Tensor, + num_nodes: int, + cluster_index: Tensor, + num_clusters: int, + weight: Optional[Tensor] = None, + ): + if node_index.dim() != 1: + raise ValueError(f"Expected 'node_index' to be one-dimensional " + f"(got {node_index.dim()} dimensions)") + + if cluster_index.dim() != 1: + raise ValueError(f"Expected 'cluster_index' to be one-dimensional " + f"(got {cluster_index.dim()} dimensions)") + + if node_index.numel() != cluster_index.numel(): + raise ValueError(f"Expected 'node_index' and 'cluster_index' to " + f"hold the same number of values (got " + f"{node_index.numel()} and " + f"{cluster_index.numel()} values)") + + if weight is not None and weight.dim() != 1: + raise ValueError(f"Expected 'weight' vector to be one-dimensional " + f"(got {weight.dim()} dimensions)") + + if weight is not None and weight.numel() != node_index.numel(): + raise ValueError(f"Expected 'weight' to hold {node_index.numel()} " + f"values (got {weight.numel()} values)") + + self.node_index = node_index + self.num_nodes = num_nodes + self.cluster_index = cluster_index + self.num_clusters = num_clusters + self.weight = weight + + + + +class Select(paddle.nn.Layer): + r"""An abstract base class for implementing custom node selections as + described in the `"Understanding Pooling in Graph Neural Networks" + `_ paper, which maps the nodes of an + input graph to supernodes in the coarsened graph. + + Specifically, :class:`Select` returns a :class:`SelectOutput` output, which + holds a (sparse) mapping :math:`\mathbf{C} \in {[0, 1]}^{N \times C}` that + assigns selected nodes to one or more of :math:`C` super nodes. + """ + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + + def forward(self, *args, **kwargs) -> SelectOutput: + raise NotImplementedError + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/select/topk.py b/jointContribution/mattergen/paddle_geometric/nn/pool/select/topk.py new file mode 100644 index 00000000..ebba5c68 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/select/topk.py @@ -0,0 +1,134 @@ +from typing import Callable, Optional, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.nn.inits import uniform +from paddle_geometric.nn.pool.select import Select, SelectOutput +from paddle_geometric.nn.resolver import activation_resolver +from paddle_geometric.utils import cumsum, scatter, softmax + + +# TODO (matthias) Document this method. +def topk( + x: Tensor, + ratio: Optional[Union[float, int]], + batch: Tensor, + min_score: Optional[float] = None, + tol: float = 1e-7, +) -> Tensor: + if min_score is not None: + # Make sure that we do not drop all nodes in a graph. + scores_max = scatter(x, batch, reduce='max')[batch] - tol + scores_min = scores_max.clip(max=min_score) + + perm = (x > scores_min).nonzero().view(-1) + return perm + + if ratio is not None: + num_nodes = scatter(batch.new_ones(x.shape[0]), batch, reduce='sum') + + if ratio >= 1: + k = num_nodes.new_full((num_nodes.shape[0], ), int(ratio)) + else: + k = (float(ratio) * num_nodes.astype(x.dtype)).ceil().to(paddle.int64) + + x, x_perm = paddle.sort(x.view(-1), descending=True) + batch = batch[x_perm] + batch, batch_perm = paddle.sort(batch, descending=False, stable=True) + + arange = paddle.arange(x.shape[0], dtype=paddle.int64, device=x.device) + ptr = cumsum(num_nodes) + batched_arange = arange - ptr[batch] + mask = batched_arange < k[batch] + + return x_perm[batch_perm[mask]] + + raise ValueError("At least one of the 'ratio' and 'min_score' parameters " + "must be specified") + + +class SelectTopK(Select): + r"""Selects the top-:math:`k` nodes with highest projection scores from the + `"Graph U-Nets" `_, `"Towards Sparse + Hierarchical Graph Classifiers" `_ + and `"Understanding Attention and Generalization in Graph Neural + Networks" `_ papers. + + If :obj:`min_score` :math:`\tilde{\alpha}` is :obj:`None`, computes: + + .. math:: + \mathbf{y} &= \sigma \left( \frac{\mathbf{X}\mathbf{p}}{\| \mathbf{p} \|} + \right) + + \mathbf{i} &= \mathrm{top}_k(\mathbf{y}) + + If :obj:`min_score` :math:`\tilde{\alpha}` is a value in :obj:`[0, 1]`, + computes: + + .. math:: + \mathbf{y} &= \mathrm{softmax}(\mathbf{X}\mathbf{p}) + + \mathbf{i} &= \mathbf{y}_i > \tilde{\alpha} + + where :math:`\mathbf{p}` is the learnable projection vector. + """ + + def __init__( + self, + in_channels: int, + ratio: Union[int, float] = 0.5, + min_score: Optional[float] = None, + act: Union[str, Callable] = 'tanh', + ): + super().__init__() + + if ratio is None and min_score is None: + raise ValueError(f"At least one of the 'ratio' and 'min_score' " + f"parameters must be specified in " + f"'{self.__class__.__name__}'") + + self.in_channels = in_channels + self.ratio = ratio + self.min_score = min_score + self.act = activation_resolver(act) + + self.weight = paddle.create_parameter(shape=[1, in_channels], dtype='float32') + + self.reset_parameters() + + def reset_parameters(self): + uniform(self.in_channels, self.weight) + + def forward( + self, + x: Tensor, + batch: Optional[Tensor] = None, + ) -> SelectOutput: + if batch is None: + batch = x.new_zeros(x.shape[0], dtype=paddle.int64) + + x = x.view(-1, 1) if x.dim() == 1 else x + score = (x * self.weight).sum(axis=-1) + + if self.min_score is None: + score = self.act(score / self.weight.norm(p=2, axis=-1)) + else: + score = softmax(score, batch) + + node_index = topk(score, self.ratio, batch, self.min_score) + + return SelectOutput( + node_index=node_index, + num_nodes=x.shape[0], + cluster_index=paddle.arange(node_index.shape[0], device=x.device), + num_clusters=node_index.shape[0], + weight=score[node_index], + ) + + def __repr__(self) -> str: + if self.min_score is None: + arg = f'ratio={self.ratio}' + else: + arg = f'min_score={self.min_score}' + return f'{self.__class__.__name__}({self.in_channels}, {arg})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/topk_pool.py b/jointContribution/mattergen/paddle_geometric/nn/pool/topk_pool.py new file mode 100644 index 00000000..c7d18fd4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/topk_pool.py @@ -0,0 +1,134 @@ +from typing import Callable, Optional, Tuple, Union + +import paddle +from paddle import nn +from paddle import Tensor +from paddle_geometric.nn.pool.connect import FilterEdges +from paddle_geometric.nn.pool.select import SelectTopK +from paddle_geometric.typing import OptTensor + + +class TopKPooling(nn.Layer): + r""":math:`\mathrm{top}_k` pooling operator from the `"Graph U-Nets" + `_, `"Towards Sparse + Hierarchical Graph Classifiers" `_ + and `"Understanding Attention and Generalization in Graph Neural + Networks" `_ papers. + + If :obj:`min_score` :math:`\tilde{\alpha}` is :obj:`None`, computes: + + .. math:: + \mathbf{y} &= \sigma \left( \frac{\mathbf{X}\mathbf{p}}{\| \mathbf{p} \|} \right) + + \mathbf{i} &= \mathrm{top}_k(\mathbf{y}) + + \mathbf{X}^{\prime} &= (\mathbf{X} \odot \mathrm{tanh}(\mathbf{y}))_{\mathbf{i}} + + \mathbf{A}^{\prime} &= \mathbf{A}_{\mathbf{i}, \mathbf{i}} + + If :obj:`min_score` :math:`\tilde{\alpha}` is a value in :obj:`[0, 1]`, + computes: + + .. math:: + \mathbf{y} &= \mathrm{softmax}(\mathbf{X}\mathbf{p}) + + \mathbf{i} &= \mathbf{y}_i > \tilde{\alpha} + + \mathbf{X}^{\prime} &= (\mathbf{X} \odot \mathbf{y})_{\mathbf{i}} + + \mathbf{A}^{\prime} &= \mathbf{A}_{\mathbf{i}, \mathbf{i}}, + + where nodes are dropped based on a learnable projection score :math:`\mathbf{p}`. + + Args: + in_channels (int): Size of each input sample. + ratio (float or int): The graph pooling ratio, which is used to compute + :math:`k = \lceil \mathrm{ratio} \cdot N \rceil`, or the value + of :math:`k` itself, depending on whether the type of :obj:`ratio` + is :obj:`float` or :obj:`int`. + This value is ignored if :obj:`min_score` is not :obj:`None`. + (default: :obj:`0.5`) + min_score (float, optional): Minimal node score :math:`\tilde{\alpha}` + which is used to compute indices of pooled nodes + :math:`\mathbf{i} = \mathbf{y}_i > \tilde{\alpha}`. + When this value is not :obj:`None`, the :obj:`ratio` argument is + ignored. (default: :obj:`None`) + multiplier (float, optional): Coefficient by which features gets + multiplied after pooling. This can be useful for large graphs and + when :obj:`min_score` is used. (default: :obj:`1`) + nonlinearity (str or callable, optional): The non-linearity + :math:`\sigma`. (default: :obj:`"tanh"`) + """ + def __init__( + self, + in_channels: int, + ratio: Union[int, float] = 0.5, + min_score: Optional[float] = None, + multiplier: float = 1.0, + nonlinearity: Union[str, Callable] = 'tanh', + ): + super(TopKPooling, self).__init__() + + self.in_channels = in_channels + self.ratio = ratio + self.min_score = min_score + self.multiplier = multiplier + + # SelectTopK and FilterEdges are assumed to be paddle_geometric equivalents + self.select = SelectTopK(in_channels, ratio, min_score, nonlinearity) + self.connect = FilterEdges() + + self.reset_parameters() + + def reset_parameters(self): + r"""Resets all learnable parameters of the module.""" + self.select.reset_parameters() + + def forward( + self, + x: Tensor, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + batch: Optional[Tensor] = None, + attn: Optional[Tensor] = None, + ) -> Tuple[Tensor, Tensor, OptTensor, OptTensor, Tensor, Tensor]: + r"""Forward pass. + + Args: + x (paddle.Tensor): The node feature matrix. + edge_index (paddle.Tensor): The edge indices. + edge_attr (paddle.Tensor, optional): The edge features. + (default: :obj:`None`) + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node to a specific example. (default: :obj:`None`) + attn (paddle.Tensor, optional): Optional node-level matrix to use + for computing attention scores instead of using the node + feature matrix :obj:x. (default: :obj:`None`) + """ + if batch is None: + batch = paddle.zeros([x.shape[0]], dtype='int64') + + attn = x if attn is None else attn + select_out = self.select(attn, batch) + + perm = select_out.node_index + score = select_out.weight + assert score is not None + + x = x[perm] * score.reshape([-1, 1]) + x = self.multiplier * x if self.multiplier != 1 else x + + connect_out = self.connect(select_out, edge_index, edge_attr, batch) + + return (x, connect_out.edge_index, connect_out.edge_attr, + connect_out.batch, perm, score) + + def __repr__(self) -> str: + if self.min_score is None: + ratio = f'ratio={self.ratio}' + else: + ratio = f'min_score={self.min_score}' + + return (f'{self.__class__.__name__}({self.in_channels}, {ratio}, ' + f'multiplier={self.multiplier})') diff --git a/jointContribution/mattergen/paddle_geometric/nn/pool/voxel_grid.py b/jointContribution/mattergen/paddle_geometric/nn/pool/voxel_grid.py new file mode 100644 index 00000000..9c227a7c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/pool/voxel_grid.py @@ -0,0 +1,69 @@ +from typing import List, Optional, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.utils.repeat import repeat + +# Assuming grid_cluster is either implemented or you have an alternative implementation +grid_cluster = None # Replace with the correct implementation if available + +def voxel_grid( + pos: Tensor, + size: Union[float, List[float], Tensor], + batch: Optional[Tensor] = None, + start: Optional[Union[float, List[float], Tensor]] = None, + end: Optional[Union[float, List[float], Tensor]] = None, +) -> Tensor: + r"""Voxel grid pooling from the, *e.g.*, `Dynamic Edge-Conditioned Filters + in Convolutional Networks on Graphs `_ + paper, which overlays a regular grid of user-defined size over a point + cloud and clusters all points within the same voxel. + + Args: + pos (paddle.Tensor): Node position matrix + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times D}`. + size (float or [float] or Tensor): Size of a voxel (in each dimension). + batch (paddle.Tensor, optional): Batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots,B-1\}}^N`, which assigns each + node to a specific example. (default: :obj:`None`) + start (float or [float] or Tensor, optional): Start coordinates of the + grid (in each dimension). If set to :obj:`None`, will be set to the + minimum coordinates found in :attr:`pos`. (default: :obj:`None`) + end (float or [float] or Tensor, optional): End coordinates of the grid + (in each dimension). If set to :obj:`None`, will be set to the + maximum coordinates found in :attr:`pos`. (default: :obj:`None`) + + :rtype: :class:`paddle.Tensor` + """ + if grid_cluster is None: + raise ImportError('`voxel_grid` requires `grid_cluster` implementation.') + + pos = pos.unsqueeze(-1) if pos.dim() == 1 else pos + dim = pos.shape[1] + + if batch is None: + batch = paddle.zeros([pos.shape[0]], dtype='int64') + + pos = paddle.concat([pos, batch.unsqueeze(-1).to(pos.dtype)], axis=-1) + + if not isinstance(size, Tensor): + size = paddle.to_tensor(size, dtype=pos.dtype, device=pos.place) + size = repeat(size, dim) + size = paddle.concat([size, paddle.ones([1], dtype=size.dtype)], axis=0) # Add additional batch dim. + + if start is not None: + if not isinstance(start, Tensor): + start = paddle.to_tensor(start, dtype=pos.dtype, device=pos.place) + start = repeat(start, dim) + start = paddle.concat([start, paddle.zeros([1], dtype=start.dtype)], axis=0) + + if end is not None: + if not isinstance(end, Tensor): + end = paddle.to_tensor(end, dtype=pos.dtype, device=pos.place) + end = repeat(end, dim) + end = paddle.concat([end, batch.max().unsqueeze(0)], axis=0) + + # Assuming grid_cluster is defined in paddle_geometric or implemented by the user + return grid_cluster(pos, size, start, end) diff --git a/jointContribution/mattergen/paddle_geometric/nn/reshape.py b/jointContribution/mattergen/paddle_geometric/nn/reshape.py new file mode 100644 index 00000000..878c3ff3 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/reshape.py @@ -0,0 +1,17 @@ +import paddle +from paddle import Tensor + + +class Reshape(paddle.nn.Layer): + def __init__(self, *shape): + super().__init__() + self.shape = shape + + def forward(self, x: Tensor) -> Tensor: + """""" # noqa: D419 + x = paddle.reshape(x, self.shape) + return x + + def __repr__(self) -> str: + shape = ', '.join([str(dim) for dim in self.shape]) + return f'{self.__class__.__name__}({shape})' diff --git a/jointContribution/mattergen/paddle_geometric/nn/resolver.py b/jointContribution/mattergen/paddle_geometric/nn/resolver.py new file mode 100644 index 00000000..49b661ae --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/resolver.py @@ -0,0 +1,161 @@ +import functools +import math +import inspect +from typing import Any, Optional, Union + +import paddle +from paddle.optimizer import Optimizer +from paddle.optimizer.lr import LRScheduler +from paddle.callbacks import ReduceLROnPlateau + +from paddle_geometric.nn.lr_scheduler import ( + ConstantWithWarmupLR, + CosineWithWarmupLR, + CosineWithWarmupRestartsLR, + LinearWithWarmupLR, + PolynomialWithWarmupLR, +) +from paddle_geometric.resolver import normalize_string, resolver + + +# Activation Resolver ######################################################### + +def swish(x: paddle.Tensor) -> paddle.Tensor: + return x * x.sigmoid() + + +def activation_resolver(query: Union[Any, str] = 'relu', *args, **kwargs): + base_cls = paddle.nn.Layer + base_cls_repr = 'Act' + acts = [ + getattr(paddle.nn, act) for act in dir(paddle.nn) + if isinstance(getattr(paddle.nn, act), type) and issubclass(getattr(paddle.nn, act), base_cls) + ] + acts += [ + swish, + ] + act_dict = {} + return resolver(acts, act_dict, query, base_cls, base_cls_repr, *args, **kwargs) + + +# Normalization Resolver ###################################################### + +def normalization_resolver(query: Union[Any, str], *args, **kwargs): + import paddle_geometric.nn.norm as norm + base_cls = paddle.nn.Layer + base_cls_repr = 'Norm' + norms = [ + norm for norm in vars(norm).values() + if isinstance(norm, type) and issubclass(norm, base_cls) + ] + norm_dict = {} + return resolver(norms, norm_dict, query, base_cls, base_cls_repr, *args, **kwargs) + + +# Aggregation Resolver ######################################################## + +def aggregation_resolver(query: Union[Any, str], *args, **kwargs): + import paddle_geometric.nn.aggr as aggr + if isinstance(query, (list, tuple)): + return aggr.MultiAggregation(query, *args, **kwargs) + + base_cls = aggr.Aggregation + aggrs = [ + aggr for aggr in vars(aggr).values() + if isinstance(aggr, type) and issubclass(aggr, base_cls) + ] + aggr_dict = { + 'add': aggr.SumAggregation, + } + return resolver(aggrs, aggr_dict, query, base_cls, None, *args, **kwargs) + + +# Optimizer Resolver ########################################################## + +def optimizer_resolver(query: Union[Any, str], *args, **kwargs): + base_cls = Optimizer + optimizers = [ + optimizer for optimizer in vars(paddle.optimizer).values() + if isinstance(optimizer, type) and issubclass(optimizer, base_cls) + ] + return resolver(optimizers, {}, query, base_cls, None, *args, **kwargs) + + +# Learning Rate Scheduler Resolver ############################################ + +def lr_scheduler_resolver( + query: Union[Any, str], + optimizer: Optimizer, + warmup_ratio_or_steps: Optional[Union[float, int]] = 0.1, + num_training_steps: Optional[int] = None, + **kwargs, +) -> Union[LRScheduler, ReduceLROnPlateau]: + r"""A resolver to obtain a learning rate scheduler implemented in either + PyG or Paddle from its name or type. + + Args: + query (Any or str): The query name of the learning rate scheduler. + optimizer (Optimizer): The optimizer to be scheduled. + warmup_ratio_or_steps (float or int, optional): The number of warmup + steps. If given as a `float`, it will act as a ratio that gets + multiplied with the number of training steps to obtain the number + of warmup steps. Only required for warmup-based LR schedulers. + (default: :obj:`0.1`) + num_training_steps (int, optional): The total number of training steps. + (default: :obj:`None`) + **kwargs (optional): Additional arguments of the LR scheduler. + """ + if not isinstance(query, str): + return query + + if isinstance(warmup_ratio_or_steps, float): + if warmup_ratio_or_steps < 0 or warmup_ratio_or_steps > 1: + raise ValueError(f"`warmup_ratio_or_steps` needs to be between " + f"0.0 and 1.0 when given as a floating point " + f"number (got {warmup_ratio_or_steps}).") + if num_training_steps is not None: + warmup_steps = round(warmup_ratio_or_steps * num_training_steps) + elif isinstance(warmup_ratio_or_steps, int): + if warmup_ratio_or_steps < 0: + raise ValueError(f"`warmup_ratio_or_steps` needs to be positive " + f"when given as an integer " + f"(got {warmup_ratio_or_steps}).") + warmup_steps = warmup_ratio_or_steps + else: + raise ValueError(f"Found invalid type of `warmup_ratio_or_steps` " + f"(got {type(warmup_ratio_or_steps)})") + + base_cls = LRScheduler + classes = [ + scheduler for scheduler in vars(paddle.optimizer.lr).values() + if isinstance(scheduler, type) and issubclass(scheduler, base_cls) + ] + [ReduceLROnPlateau] + + customized_lr_schedulers = [ + ConstantWithWarmupLR, + LinearWithWarmupLR, + CosineWithWarmupLR, + CosineWithWarmupRestartsLR, + PolynomialWithWarmupLR, + ] + classes += customized_lr_schedulers + + query_repr = normalize_string(query) + base_cls_repr = normalize_string('LR') + + for cls in classes: + cls_repr = normalize_string(cls.__name__) + if query_repr in [cls_repr, cls_repr.replace(base_cls_repr, '')]: + if inspect.isclass(cls): + if cls in customized_lr_schedulers: + cls_keys = inspect.signature(cls).parameters.keys() + if 'num_warmup_steps' in cls_keys: + kwargs['num_warmup_steps'] = warmup_steps + if 'num_training_steps' in cls_keys: + kwargs['num_training_steps'] = num_training_steps + obj = cls(optimizer, **kwargs) + return obj + return cls + + choices = {cls.__name__ for cls in classes} + raise ValueError(f"Could not resolve '{query}' among choices {choices}") diff --git a/jointContribution/mattergen/paddle_geometric/nn/sequential.jinja b/jointContribution/mattergen/paddle_geometric/nn/sequential.jinja new file mode 100644 index 00000000..4e680557 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/sequential.jinja @@ -0,0 +1,22 @@ +import typing + +import torch +from torch import Tensor + +import paddle_geometric.typing +{% for module in modules %} +from {{module}} import * +{%- endfor %} + + +def forward( + self, +{%- for param in signature.param_dict.values() %} + {{param.name}}: {{param.type_repr}}, +{%- endfor %} +) -> {{signature.return_type_repr}}: + +{%- for child in children %} + {{child.return_names|join(', ')}} = self.{{child.name}}({{child.param_names|join(', ')}}) +{%- endfor %} + return {{children[-1].return_names|join(', ')}} diff --git a/jointContribution/mattergen/paddle_geometric/nn/sequential.py b/jointContribution/mattergen/paddle_geometric/nn/sequential.py new file mode 100644 index 00000000..8b20a02a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/sequential.py @@ -0,0 +1,240 @@ +import copy +import inspect +import os.path as osp +import random +import sys +from typing import ( + Any, + Callable, + Dict, + List, + NamedTuple, + Optional, + Tuple, + Union, +) + +import paddle +from paddle import Tensor + +from paddle_geometric.inspector import Parameter, Signature, eval_type, split +from paddle_geometric.template import module_from_template + + +class Child(NamedTuple): + name: str + param_names: List[str] + return_names: List[str] + + +class Sequential(paddle.nn.Layer): + r"""An extension of the :class:`paddle.nn.Layer` container in order to + define a sequential GNN model. + + Since GNN operators take in multiple input arguments, + :class:`paddle_geometric.nn.Sequential` additionally expects both global + input arguments, and function header definitions of individual operators. + If omitted, an intermediate module will operate on the *output* of its + preceding module: + + .. code-block:: python + + from paddle.nn import Linear, ReLU + from paddle_geometric.nn import Sequential, GCNConv + + model = Sequential('x, edge_index', [ + (GCNConv(in_channels, 64), 'x, edge_index -> x'), + ReLU(), + (GCNConv(64, 64), 'x, edge_index -> x'), + ReLU(), + Linear(64, out_channels), + ]) + """ + _children: List[Child] + + def __init__( + self, + input_args: str, + modules: List[Union[Tuple[Callable, str], Callable]], + ) -> None: + super().__init__() + + caller_path = inspect.stack()[1].filename + self._caller_module = osp.splitext(osp.basename(caller_path))[0] + + _globals = copy.copy(globals()) + _globals.update(sys.modules['__main__'].__dict__) + if self._caller_module in sys.modules: + _globals.update(sys.modules[self._caller_module].__dict__) + + signature = input_args.split('->') + if len(signature) == 1: + args_repr = signature[0] + return_type_repr = 'Tensor' + return_type = Tensor + elif len(signature) == 2: + args_repr = signature[0] + return_type_repr = signature[1].strip() + return_type = eval_type(return_type_repr, _globals) + else: + raise ValueError(f"Failed to parse arguments (got '{input_args}')") + + param_dict: Dict[str, Parameter] = {} + for arg in split(args_repr, sep=','): + signature = arg.split(':') + if len(signature) == 1: + name = signature[0].strip() + param_dict[name] = Parameter( + name=name, + type=Tensor, + type_repr='Tensor', + default=inspect._empty, + ) + elif len(signature) == 2: + name = signature[0].strip() + param_dict[name] = Parameter( + name=name, + type=eval_type(signature[1].strip(), _globals), + type_repr=signature[1].strip(), + default=inspect._empty, + ) + else: + raise ValueError(f"Failed to parse argument " + f"(got '{arg.strip()}')") + + self.signature = Signature(param_dict, return_type, return_type_repr) + + if not isinstance(modules, dict): + modules = { + f'module_{i}': module + for i, module in enumerate(modules) + } + if len(modules) == 0: + raise ValueError(f"'{self.__class__.__name__}' expects a " + f"non-empty list of modules") + + self._children: List[Child] = [] + for i, (name, module) in enumerate(modules.items()): + desc: Optional[str] = None + if isinstance(module, (tuple, list)): + if len(module) == 1: + module = module[0] + elif len(module) == 2: + module, desc = module + else: + raise ValueError(f"Expected tuple of length 2 " + f"(got {module})") + + if i == 0 and desc is None: + raise ValueError("Signature for first module required") + if not callable(module): + raise ValueError(f"Expected callable module (got {module})") + if desc is not None and not isinstance(desc, str): + raise ValueError(f"Expected type hint representation " + f"(got {desc})") + + if desc is not None: + signature = desc.split('->') + if len(signature) != 2: + raise ValueError( + f"Failed to parse arguments (got '{desc}')") + param_names = [v.strip() for v in signature[0].split(',')] + return_names = [v.strip() for v in signature[1].split(',')] + child = Child(name, param_names, return_names) + else: + param_names = self._children[-1].return_names + child = Child(name, param_names, param_names) + + setattr(self, name, module) + self._children.append(child) + + self._set_jittable_template() + + def reset_parameters(self) -> None: + r"""Resets all learnable parameters of the module.""" + for child in self._children: + module = getattr(self, child.name) + if hasattr(module, 'reset_parameters'): + module.reset_parameters() + + def __len__(self) -> int: + return len(self._children) + + def __getitem__(self, idx: int) -> paddle.nn.Layer: + return getattr(self, self._children[idx].name) + + def __setstate__(self, data: Dict[str, Any]) -> None: + super().__setstate__(data) + self._set_jittable_template() + + def __repr__(self) -> str: + module_descs = [ + f"{', '.join(c.param_names)} -> {', '.join(c.return_names)}" + for c in self._children + ] + module_reprs = [ + f' ({i}) - {self[i]}: {module_descs[i]}' for i in range(len(self)) + ] + return '{}(\n{}\n)'.format( + self.__class__.__name__, + '\n'.join(module_reprs), + ) + + def forward(self, *args: Any, **kwargs: Any) -> Any: + value_dict = { + name: arg + for name, arg in zip(self.signature.param_dict.keys(), args) + } + for key, arg in kwargs.items(): + if key in value_dict: + raise TypeError(f"'{self.__class__.__name__}' got multiple " + f"values for argument '{key}'") + value_dict[key] = arg + + for child in self._children: + args = [value_dict[name] for name in child.param_names] + outs = getattr(self, child.name)(*args) + if len(child.return_names) == 1: + value_dict[child.return_names[0]] = outs + else: + for name, out in zip(child.return_names, outs): + value_dict[name] = out + + return outs + + # PaddleScript Support ##################################################### + + def _set_jittable_template(self, raise_on_error: bool = False) -> None: + try: # Optimize `forward()` via `*.jinja` templates: + if ('forward' in self.__class__.__dict__ and + self.__class__.__dict__['forward'] != Sequential.forward): + raise ValueError("Cannot compile custom 'forward' method") + + root_dir = osp.dirname(osp.realpath(__file__)) + uid = '%06x' % random.randrange(16**6) + jinja_prefix = f'{self.__module__}_{self.__class__.__name__}_{uid}' + module = module_from_template( + module_name=jinja_prefix, + template_path=osp.join(root_dir, 'sequential.jinja'), + tmp_dirname='sequential', + # Keyword arguments: + modules=[self._caller_module], + signature=self.signature, + children=self._children, + ) + + self.forward = module.forward.__get__(self) + + # NOTE We override `forward` on the class level here in order to + # support `paddle.jit.trace` - this is generally dangerous to do, + # and limits `paddle.jit.trace` to a single `Sequential` module: + self.__class__.forward = module.forward + except Exception as e: + if raise_on_error: + raise e + + def __prepare_scriptable__(self) -> 'Sequential': + # Prevent type sharing when scripting `Sequential` modules: + type_store = paddle.jit._recursive.concrete_type_store.type_store + type_store.pop(self.__class__, None) + return self diff --git a/jointContribution/mattergen/paddle_geometric/nn/summary.py b/jointContribution/mattergen/paddle_geometric/nn/summary.py new file mode 100644 index 00000000..a1730ab1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/summary.py @@ -0,0 +1,146 @@ +from collections import defaultdict +from typing import Any, List, Optional, Union + +import paddle +from paddle import nn +from paddle.nn import Layer + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense.linear import is_uninitialized_parameter +from paddle_geometric.typing import SparseTensor + + +def summary( + model: nn.Layer, + *args, + max_depth: int = 3, + leaf_module: Optional[Union[Layer, List[Layer]]] = 'MessagePassing', + **kwargs, +) -> str: + r"""Summarizes a given :class:`paddle.nn.Layer`. + The summarized information includes (1) layer names, (2) input and output + shapes, and (3) the number of parameters. + + Args: + model (paddle.nn.Layer): The model to summarize. + *args: The arguments of the :obj:`model`. + max_depth (int, optional): The depth of nested layers to display. + Any layers deeper than this depth will not be displayed in the + summary. (default: :obj:`3`) + leaf_module (paddle.nn.Layer or [paddle.nn.Layer], optional): The + modules to be treated as leaf modules, whose submodules are + excluded from the summary. + (default: :class:`~paddle_geometric.nn.conv.MessagePassing`) + **kwargs: Additional arguments of the :obj:`model`. + """ + if leaf_module == 'MessagePassing': + leaf_module = MessagePassing + + def register_hook(info): + def hook(module, inputs, output): + info['input_shape'].append(get_shape(inputs)) + info['output_shape'].append(get_shape(output)) + + return hook + + hooks = {} + depth = 0 + stack = [(model.__class__.__name__, model, depth)] + + info_list = [] + input_shape = defaultdict(list) + output_shape = defaultdict(list) + while stack: + name, module, depth = stack.pop() + module_id = id(module) + + if name.startswith('(_'): # Do not summarize private modules. + continue + + if module_id in hooks: # Avoid duplicated hooks. + hooks[module_id].remove() + + info = {} + info['name'] = name + info['input_shape'] = input_shape[module_id] + info['output_shape'] = output_shape[module_id] + info['depth'] = depth + if any([is_uninitialized_parameter(p) for p in module.parameters()]): # Paddle has a similar check for uninitialized parameters + info['#param'] = '-1' + else: + num_params = sum(p.numel() for p in module.parameters()) + info['#param'] = f'{num_params:,}' if num_params > 0 else '--' + info_list.append(info) + + if not isinstance(module, nn.ScriptModule): + hooks[module_id] = module.register_forward_hook( + register_hook(info)) + + if depth >= max_depth: + continue + + if (leaf_module is not None and isinstance(module, leaf_module)): + continue + + module_items = reversed(module._sub_layers.items()) # In Paddle, submodules are stored in `_sub_layers` + stack += [(f"({name}){mod.__class__.__name__}", mod, depth + 1) + for name, mod in module_items if mod is not None] + + training = model.training + model.eval() + + with paddle.no_grad(): + model(*args, **kwargs) + + model.train(training) + + for h in hooks.values(): # Remove hooks. + h.remove() + + info_list = postprocess(info_list) + return make_table(info_list, max_depth=max_depth) + + +def get_shape(inputs: Any) -> str: + if not isinstance(inputs, (tuple, list)): + inputs = (inputs, ) + + out = [] + for x in inputs: + if isinstance(x, SparseTensor): + out.append(str(list(x.sizes()))) + elif hasattr(x, 'shape'): + out.append(str(list(x.shape))) # In Paddle, use `.shape` instead of `.size()` + return ', '.join(out) + + +def postprocess(info_list: List[dict]) -> List[dict]: + for idx, info in enumerate(info_list): + depth = info['depth'] + if idx > 0: # root module (0) is excluded + if depth == 1: + prefix = '├─' + else: + prefix = f"{'│ '*(depth-1)}└─" + info['name'] = prefix + info['name'] + + if info['input_shape']: + info['input_shape'] = info['input_shape'].pop(0) + info['output_shape'] = info['output_shape'].pop(0) + else: + info['input_shape'] = '--' + info['output_shape'] = '--' + return info_list + + +def make_table(info_list: List[dict], max_depth: int) -> str: + from tabulate import tabulate + content = [['Layer', 'Input Shape', 'Output Shape', '#Param']] + for info in info_list: + content.append([ + info['name'], + info['input_shape'], + info['output_shape'], + info['#param'], + ]) + return tabulate(content, headers='firstrow', tablefmt='psql') diff --git a/jointContribution/mattergen/paddle_geometric/nn/to_fixed_size_transformer.py b/jointContribution/mattergen/paddle_geometric/nn/to_fixed_size_transformer.py new file mode 100644 index 00000000..098b2410 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/to_fixed_size_transformer.py @@ -0,0 +1,37 @@ +from typing import Any + +import paddle +from paddle import nn + +from paddle_geometric.nn.fx import Transformer # Assuming you have similar functionality for Paddle + +try: + from paddle.jit import Program, ProgramBlock, Node # Adjust according to Paddle's equivalent functionality +except (ImportError, ModuleNotFoundError, AttributeError): + Program, ProgramBlock, Node = 'Program', 'ProgramBlock', 'Node' + + +def to_fixed_size(module: nn.Layer, batch_size: int, + debug: bool = False) -> Program: + r"""Converts a model and injects a pre-computed and fixed batch size to all + global pooling operators. + + Args: + module (paddle.nn.Layer): The model to transform. + batch_size (int): The fixed batch size used in global pooling modules. + debug (bool, optional): If set to :obj:`True`, will perform + transformation in debug mode. (default: :obj:`False`) + """ + transformer = ToFixedSizeTransformer(module, batch_size, debug) + return transformer.transform() + + +class ToFixedSizeTransformer(Transformer): + def __init__(self, module: nn.Layer, batch_size: int, debug: bool = False): + super().__init__(module, debug=debug) + self.batch_size = batch_size + + def call_global_pooling_module(self, node: Node, target: Any, name: str): + kwargs = node.kwargs.copy() + kwargs['dim_size'] = self.batch_size + node.kwargs = kwargs diff --git a/jointContribution/mattergen/paddle_geometric/nn/to_hetero_module.py b/jointContribution/mattergen/paddle_geometric/nn/to_hetero_module.py new file mode 100644 index 00000000..cec8587d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/to_hetero_module.py @@ -0,0 +1,170 @@ +import copy +import warnings +from typing import Dict, List, Optional, Union + +import paddle +import paddle.nn.functional as F +from paddle import Tensor +from paddle.nn import Layer + +import paddle_geometric +from paddle_geometric import is_compiling +from paddle_geometric.typing import EdgeType, NodeType, OptTensor +from paddle_geometric.utils import cumsum, scatter + +class ToHeteroLinear(Layer): + def __init__( + self, + module: Layer, + types: Union[List[NodeType], List[EdgeType]], + ): + from paddle_geometric.nn import HeteroLinear, Linear + + super().__init__() + + self.types = types + + if isinstance(module, Linear): + in_channels = module.in_channels + out_channels = module.out_channels + bias = module.bias is not None + + elif isinstance(module, paddle.nn.Linear): + in_channels = module.in_features + out_channels = module.out_features + bias = module.bias is not None + + else: + raise ValueError(f"Expected 'Linear' module (got '{type(module)}'") + + self.hetero_module = HeteroLinear( + in_channels, + out_channels, + num_types=len(types), + is_sorted=True, + bias=bias, + ) + + def fused_forward(self, x: Tensor, type_vec: Tensor) -> Tensor: + return self.hetero_module(x, type_vec) + + def dict_forward( + self, + x_dict: Dict[Union[NodeType, EdgeType], Tensor], + ) -> Dict[Union[NodeType, EdgeType], Tensor]: + if not paddle_geometric.typing.WITH_PYG_LIB or is_compiling(): + return { + key: + F.linear(x_dict[key], self.hetero_module.weight[i].T()) + + self.hetero_module.bias[i] + for i, key in enumerate(self.types) + } + + x = paddle.concat([x_dict[key] for key in self.types], axis=0) + sizes = [x_dict[key].shape[0] for key in self.types] + type_vec = paddle.arange(len(self.types), device=x.device) + size = paddle.to_tensor(sizes, device=x.device) + type_vec = type_vec.tile([size]) + outs = self.hetero_module(x, type_vec).split(sizes) + return {key: out for key, out in zip(self.types, outs)} + + def forward( + self, + x: Union[Tensor, Dict[Union[NodeType, EdgeType], Tensor]], + type_vec: Optional[Tensor] = None, + ) -> Union[Tensor, Dict[Union[NodeType, EdgeType], Tensor]]: + if isinstance(x, dict): + return self.dict_forward(x) + + elif isinstance(x, Tensor) and type_vec is not None: + return self.fused_forward(x, type_vec) + + raise ValueError(f"Encountered invalid forward types in " + f"'{self.__class__.__name__}'") + + +class ToHeteroMessagePassing(Layer): + def __init__( + self, + module: Layer, + node_types: List[NodeType], + edge_types: List[NodeType], + aggr: str = 'sum', + ): + from paddle_geometric.nn import HeteroConv, MessagePassing + + super().__init__() + + self.node_types = node_types + self.node_type_to_index = {key: i for i, key in enumerate(node_types)} + self.edge_types = edge_types + + if not isinstance(module, MessagePassing): + raise ValueError(f"Expected 'MessagePassing' module " + f"(got '{type(module)}'") + + if (not hasattr(module, 'reset_parameters') + and sum([p.numel() for p in module.parameters()]) > 0): + warnings.warn(f"'{module}' will be duplicated, but its parameters " + f"cannot be reset. To suppress this warning, add a " + f"'reset_parameters()' method to '{module}'") + + convs = {edge_type: copy.deepcopy(module) for edge_type in edge_types} + self.hetero_module = HeteroConv(convs, aggr) + self.hetero_module.reset_parameters() + + def fused_forward(self, x: Tensor, edge_index: Tensor, node_type: Tensor, + edge_type: Tensor) -> Tensor: + node_sizes = scatter(paddle.ones_like(node_type), node_type, dim=0, + dim_size=len(self.node_types), reduce='sum') + edge_sizes = scatter(paddle.ones_like(edge_type), edge_type, dim=0, + dim_size=len(self.edge_types), reduce='sum') + + ptr = cumsum(node_sizes) + + xs = x.split(node_sizes.tolist()) + x_dict = {node_type: x for node_type, x in zip(self.node_types, xs)} + + edge_indices = edge_index.clone().split(edge_sizes.tolist(), axis=1) + for (src, _, dst), index in zip(self.edge_types, edge_indices): + index[0] -= ptr[self.node_type_to_index[src]] + index[1] -= ptr[self.node_type_to_index[dst]] + + edge_index_dict = { + edge_type: edge_index + for edge_type, edge_index in zip(self.edge_types, edge_indices) + } + + out_dict = self.hetero_module(x_dict, edge_index_dict) + return paddle.concat([out_dict[key] for key in self.node_types], axis=0) + + def dict_forward( + self, + x_dict: Dict[NodeType, Tensor], + edge_index_dict: Dict[EdgeType, Tensor], + **kwargs, + ) -> Dict[NodeType, Tensor]: + return self.hetero_module(x_dict, edge_index_dict, **kwargs) + + def forward( + self, + x: Union[Tensor, Dict[NodeType, Tensor]], + edge_index: Union[Tensor, Dict[EdgeType, Tensor]], + node_type: OptTensor = None, + edge_type: OptTensor = None, + **kwargs, + ) -> Union[Tensor, Dict[NodeType, Tensor]]: + if isinstance(x, dict) and isinstance(edge_index, dict): + return self.dict_forward(x, edge_index, **kwargs) + + elif (isinstance(x, Tensor) and isinstance(edge_index, Tensor) + and node_type is not None and edge_type is not None): + + if len(kwargs) > 0: + raise ValueError("Additional forward arguments not yet " + "supported in fused mode") + + return self.fused_forward(x, edge_index, node_type, edge_type) + + raise ValueError(f"Encountered invalid forward types in " + f"'{self.__class__.__name__}'") diff --git a/jointContribution/mattergen/paddle_geometric/nn/to_hetero_transformer.py b/jointContribution/mattergen/paddle_geometric/nn/to_hetero_transformer.py new file mode 100644 index 00000000..8bcf850d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/to_hetero_transformer.py @@ -0,0 +1,333 @@ +import copy +import warnings +from collections import defaultdict, deque +from typing import Any, Dict, Optional, Tuple, Union + +import paddle +from paddle.nn import Layer + +from paddle_geometric.nn.dense.linear import is_uninitialized_parameter +from paddle_geometric.nn.fx import Transformer, get_submodule +from paddle_geometric.typing import EdgeType, Metadata, NodeType +from paddle_geometric.utils.hetero import ( + check_add_self_loops, + get_unused_node_types, +) + +try: + # from paddle.fx import Graph, GraphLayer, Node + GraphLayer, Graph, Node = 'GraphLayer', 'Graph', 'Node' # 后期需要替换 +except (ImportError, ModuleNotFoundError, AttributeError): + GraphLayer, Graph, Node = 'GraphLayer', 'Graph', 'Node' + + +def get_dict(mapping: Optional[Dict[str, Any]]) -> Dict[str, Any]: + return mapping if mapping is not None else {} + + +def to_hetero(module: Layer, metadata: Metadata, aggr: str = "sum", + input_map: Optional[Dict[str, str]] = None, + debug: bool = False) -> GraphLayer: + """ + Converts a homogeneous GNN model into its heterogeneous equivalent. + """ + transformer = ToHeteroTransformer(module, metadata, aggr, input_map, debug) + return transformer.transform() + + +class ToHeteroTransformer(Transformer): + + aggrs = { + 'sum': paddle.add, + # For 'mean' aggregation, we first sum up all feature matrices, and + # divide by the number of matrices in a later step. + 'mean': paddle.add, + 'max': paddle.maximum, + 'min': paddle.minimum, + 'mul': paddle.multiply, + } + + def __init__( + self, + module: Layer, + metadata: Metadata, + aggr: str = 'sum', + input_map: Optional[Dict[str, str]] = None, + debug: bool = False, + ): + super().__init__(module, input_map, debug) + + self.metadata = metadata + self.aggr = aggr + assert len(metadata) == 2 + assert len(metadata[0]) > 0 and len(metadata[1]) > 0 + assert aggr in self.aggrs.keys() + + self.validate() + + def validate(self): + unused_node_types = get_unused_node_types(*self.metadata) + if len(unused_node_types) > 0: + warnings.warn( + f"There exist node types ({unused_node_types}) whose " + f"representations do not get updated during message passing " + f"as they do not occur as destination type in any edge type. " + f"This may lead to unexpected behavior.") + + names = self.metadata[0] + [rel for _, rel, _ in self.metadata[1]] + for name in names: + if not name.isidentifier(): + warnings.warn( + f"The type '{name}' contains invalid characters which " + f"may lead to unexpected behavior. To avoid any issues, " + f"ensure that your types only contain letters, numbers " + f"and underscores.") + + def placeholder(self, node: Node, target: Any, name: str): + # Adds a `get` call to the input dictionary for every node-type or + # edge-type. + if node.type is not None: + Type = EdgeType if self.is_edge_level(node) else NodeType + node.type = Dict[Type, node.type] + + self.graph.inserting_after(node) + + dict_node = self.graph.create_node('call_function', target=get_dict, + args=(node,), name=f'{name}_dict') + self.graph.inserting_after(dict_node) + + for key in self.metadata[int(self.is_edge_level(node))]: + out = self.graph.create_node('call_method', target='get', + args=(dict_node, key, None), + name=f'{name}__{key2str(key)}') + self.graph.inserting_after(out) + + def get_attr(self, node: Node, target: Any, name: str): + raise NotImplementedError + def call_message_passing_module(self, node: Node, target: Any, name: str): + # Add calls to edge type-wise `MessagePassing` modules and aggregate + # the outputs to node type-wise embeddings afterwards. + + module = get_submodule(self.module, target) + check_add_self_loops(module, self.metadata[1]) + + # Group edge-wise keys per destination: + key_name, keys_per_dst = {}, defaultdict(list) + for key in self.metadata[1]: + keys_per_dst[key[-1]].append(key) + key_name[key] = f'{name}__{key[-1]}{len(keys_per_dst[key[-1]])}' + + for dst, keys in dict(keys_per_dst).items(): + # In case there is only a single edge-wise connection, there is no + # need for any destination-wise aggregation, and we can already set + # the intermediate variable name to the final output name. + if len(keys) == 1: + key_name[keys[0]] = f'{name}__{dst}' + del keys_per_dst[dst] + + self.graph.inserting_after(node) + for key in self.metadata[1]: + args, kwargs = self.map_args_kwargs(node, key) + out = self.graph.create_node('call_layer', + target=f'{target}.{key2str(key)}', + args=args, kwargs=kwargs, + name=key_name[key]) + self.graph.inserting_after(out) + + # Perform destination-wise aggregation. + # Here, we aggregate in pairs, popping the first two elements of + # `keys_per_dst` and append the result to the list. + for dst, keys in keys_per_dst.items(): + queue = deque([key_name[key] for key in keys]) + i = 1 + while len(queue) >= 2: + key1, key2 = queue.popleft(), queue.popleft() + args = (self.find_by_name(key1), self.find_by_name(key2)) + + new_name = f'{name}__{dst}' + if self.aggr == 'mean' or len(queue) > 0: + new_name = f'{new_name}_{i}' + + out = self.graph.create_node('call_function', + target=self.aggrs[self.aggr], + args=args, name=new_name) + self.graph.inserting_after(out) + queue.append(new_name) + i += 1 + + if self.aggr == 'mean': + key = queue.popleft() + out = self.graph.create_node( + 'call_function', target=paddle.divide, + args=(self.find_by_name(key), len(keys_per_dst[dst])), + name=f'{name}__{dst}') + self.graph.inserting_after(out) + + def call_global_pooling_module(self, node: Node, target: Any, name: str): + # Add calls to node type-wise `GlobalPooling` modules and aggregate + # the outputs to graph type-wise embeddings afterwards. + self.graph.inserting_after(node) + for key in self.metadata[0]: + args, kwargs = self.map_args_kwargs(node, key) + out = self.graph.create_node('call_layer', + target=f'{target}.{key2str(key)}', + args=args, kwargs=kwargs, + name=f'{node.name}__{key2str(key)}') + self.graph.inserting_after(out) + + # Perform node-wise aggregation. + queue = deque( + [f'{node.name}__{key2str(key)}' for key in self.metadata[0]]) + i = 1 + while len(queue) >= 2: + key1, key2 = queue.popleft(), queue.popleft() + args = (self.find_by_name(key1), self.find_by_name(key2)) + out = self.graph.create_node('call_function', + target=self.aggrs[self.aggr], + args=args, name=f'{name}_{i}') + self.graph.inserting_after(out) + queue.append(f'{name}_{i}') + i += 1 + + if self.aggr == 'mean': + key = queue.popleft() + out = self.graph.create_node( + 'call_function', target=paddle.divide, + args=(self.find_by_name(key), len(self.metadata[0])), + name=f'{name}_{i}') + self.graph.inserting_after(out) + self.replace_all_uses_with(node, out) + def call_module(self, node: Node, target: Any, name: str): + if self.is_graph_level(node): + return + + # Add calls to node type-wise or edge type-wise modules. + self.graph.inserting_after(node) + for key in self.metadata[int(self.is_edge_level(node))]: + args, kwargs = self.map_args_kwargs(node, key) + out = self.graph.create_node('call_layer', + target=f'{target}.{key2str(key)}', + args=args, kwargs=kwargs, + name=f'{name}__{key2str(key)}') + self.graph.inserting_after(out) + + def call_method(self, node: Node, target: Any, name: str): + if self.is_graph_level(node): + return + + # Add calls to node type-wise or edge type-wise methods. + self.graph.inserting_after(node) + for key in self.metadata[int(self.is_edge_level(node))]: + args, kwargs = self.map_args_kwargs(node, key) + out = self.graph.create_node('call_method', target=target, + args=args, kwargs=kwargs, + name=f'{name}__{key2str(key)}') + self.graph.inserting_after(out) + + def call_function(self, node: Node, target: Any, name: str): + if self.is_graph_level(node): + return + + # Add calls to node type-wise or edge type-wise functions. + self.graph.inserting_after(node) + for key in self.metadata[int(self.is_edge_level(node))]: + args, kwargs = self.map_args_kwargs(node, key) + out = self.graph.create_node('call_function', target=target, + args=args, kwargs=kwargs, + name=f'{name}__{key2str(key)}') + self.graph.inserting_after(out) + + def output(self, node: Node, target: Any, name: str): + # Replace the output by dictionaries, holding either node type-wise or + # edge type-wise data. + def _recurse(value: Any) -> Any: + if isinstance(value, Node): + if self.is_graph_level(value): + return value + return { + key: self.find_by_name(f'{value.name}__{key2str(key)}') + for key in self.metadata[int(self.is_edge_level(value))] + } + elif isinstance(value, dict): + return {k: _recurse(v) for k, v in value.items()} + elif isinstance(value, list): + return [_recurse(v) for v in value] + elif isinstance(value, tuple): + return tuple(_recurse(v) for v in value) + else: + return value + + if node.type is not None and isinstance(node.args[0], Node): + output = node.args[0] + if self.is_node_level(output): + node.type = Dict[NodeType, node.type] + elif self.is_edge_level(output): + node.type = Dict[EdgeType, node.type] + else: + node.type = None + + node.args = (_recurse(node.args[0]), ) + + def init_submodule(self, module: Layer, target: str) -> Layer: + # Replicate each module for each node type or edge type. + has_node_level_target = bool( + self.find_by_target(f'{target}.{key2str(self.metadata[0][0])}')) + has_edge_level_target = bool( + self.find_by_target(f'{target}.{key2str(self.metadata[1][0])}')) + + if not has_node_level_target and not has_edge_level_target: + return module + + module_dict = paddle.nn.LayerDict() + for key in self.metadata[int(has_edge_level_target)]: + module_dict[key2str(key)] = copy.deepcopy(module) + if len(self.metadata[int(has_edge_level_target)]) <= 1: + continue + if hasattr(module, 'reset_parameters'): + module_dict[key2str(key)].reset_parameters() + elif sum([is_uninitialized_parameter(p) or p.numel() + for p in module.parameters()]) > 0: + warnings.warn( + f"'{target}' will be duplicated, but its parameters " + f"cannot be reset. To suppress this warning, add a " + f"'reset_parameters()' method to '{target}'") + + return module_dict + + def map_args_kwargs(self, node: Node, + key: Union[NodeType, EdgeType]) -> Tuple[Tuple, Dict]: + def _recurse(value: Any) -> Any: + if isinstance(value, Node): + out = self.find_by_name(f'{value.name}__{key2str(key)}') + if out is not None: + return out + elif isinstance(key, tuple) and key[0] == key[-1]: + name = f'{value.name}__{key2str(key[0])}' + return self.find_by_name(name) + elif isinstance(key, tuple) and key[0] != key[-1]: + return ( + self.find_by_name(f'{value.name}__{key2str(key[0])}'), + self.find_by_name(f'{value.name}__{key2str(key[-1])}'), + ) + else: + raise ValueError(f"Cannot generate a graph node '{node}' " + f"for type '{key}' since it does not " + f"exist. Please make sure that all " + f"node types get updated during message " + f"passing.") + elif isinstance(value, dict): + return {k: _recurse(v) for k, v in value.items()} + elif isinstance(value, list): + return [_recurse(v) for v in value] + elif isinstance(value, tuple): + return tuple(_recurse(v) for v in value) + else: + return value + + args = tuple(_recurse(v) for v in node.args) + kwargs = {k: _recurse(v) for k, v in node.kwargs.items()} + return args, kwargs + +def key2str(key: Union[NodeType, EdgeType]) -> str: + key = '__'.join(key) if isinstance(key, tuple) else key + return key.replace(' ', '_').replace('-', '_').replace(':', '_') diff --git a/jointContribution/mattergen/paddle_geometric/nn/to_hetero_with_bases_transformer.py b/jointContribution/mattergen/paddle_geometric/nn/to_hetero_with_bases_transformer.py new file mode 100644 index 00000000..d342c7e5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/to_hetero_with_bases_transformer.py @@ -0,0 +1,408 @@ +import copy +import warnings +from typing import Any, Dict, List, Optional, Union + +import paddle +from paddle import Tensor +from paddle.nn import Layer, LayerList, LayerDict + +from paddle_geometric.nn.conv import MessagePassing +from paddle_geometric.nn.dense import Linear +from paddle_geometric.nn.fx import Transformer +from paddle_geometric.typing import EdgeType, Metadata, NodeType, SparseTensor +from paddle_geometric.utils.hetero import get_unused_node_types + +try: + # from paddle.fx import Graph, GraphLayer, Node + GraphLayer, Graph, Node = None, None, None # 后期需要替换 +except (ImportError, ModuleNotFoundError, AttributeError): + GraphModule, Graph, Node = 'GraphModule', 'Graph', 'Node' + + +def to_hetero_with_bases(module: Layer, metadata: Metadata, num_bases: int, + in_channels: Optional[Dict[str, int]] = None, + input_map: Optional[Dict[str, str]] = None, + debug: bool = False) -> Any: + """ + Converts a homogeneous GNN model into its heterogeneous equivalent + via the basis-decomposition technique. + """ + transformer = ToHeteroWithBasesTransformer(module, metadata, num_bases, + in_channels, input_map, debug) + return transformer.transform() + + +class ToHeteroWithBasesTransformer(Transformer): + def __init__( + self, + module: Layer, + metadata: Metadata, + num_bases: int, + in_channels: Optional[Dict[str, int]] = None, + input_map: Optional[Dict[str, str]] = None, + debug: bool = False, + ): + super().__init__(module, input_map, debug) + + self.metadata = metadata + self.num_bases = num_bases + self.in_channels = in_channels or {} + assert len(metadata) == 2 + assert len(metadata[0]) > 0 and len(metadata[1]) > 0 + + self.validate() + + # Compute IDs for each node and edge type: + self.node_type2id = {k: i for i, k in enumerate(metadata[0])} + self.edge_type2id = {k: i for i, k in enumerate(metadata[1])} + + def validate(self): + unused_node_types = get_unused_node_types(*self.metadata) + if len(unused_node_types) > 0: + warnings.warn( + f"There exist node types ({unused_node_types}) whose " + f"representations do not get updated during message passing " + f"as they do not occur as destination type in any edge type. " + f"This may lead to unexpected behavior." + ) + + names = self.metadata[0] + [rel for _, rel, _ in self.metadata[1]] + for name in names: + if not name.isidentifier(): + warnings.warn( + f"The type '{name}' contains invalid characters which " + f"may lead to unexpected behavior. To avoid any issues, " + f"ensure that your types only contain letters, numbers " + f"and underscores." + ) + + def transform(self) -> Any: + self._node_offset_dict_initialized = False + self._edge_offset_dict_initialized = False + self._edge_type_initialized = False + out = super().transform() + del self._node_offset_dict_initialized + del self._edge_offset_dict_initialized + del self._edge_type_initialized + return out + def placeholder(self, node, target: Any, name: str): + if node.type is not None: + Type = EdgeType if self.is_edge_level(node) else NodeType + node.type = Dict[Type, node.type] + + out = node + + # Create `node_offset_dict` and `edge_offset_dict` dictionaries + if self.is_edge_level(node) and not self._edge_offset_dict_initialized: + self.graph.inserting_after(out) + out = self.graph.create_node('call_function', + target=get_edge_offset_dict, + args=(node, self.edge_type2id), + name='edge_offset_dict') + self._edge_offset_dict_initialized = True + + elif not self._node_offset_dict_initialized: + self.graph.inserting_after(out) + out = self.graph.create_node('call_function', + target=get_node_offset_dict, + args=(node, self.node_type2id), + name='node_offset_dict') + self._node_offset_dict_initialized = True + + # Create a `edge_type` tensor used as input to `HeteroBasisConv`: + if self.is_edge_level(node) and not self._edge_type_initialized: + self.graph.inserting_after(out) + out = self.graph.create_node('call_function', target=get_edge_type, + args=(node, self.edge_type2id), + name='edge_type') + self._edge_type_initialized = True + + # Add `Linear` operation to align features to the same dimensionality: + if name in self.in_channels: + self.graph.inserting_after(out) + out = self.graph.create_node('call_module', + target=f'align_lin__{name}', + args=(node, ), + name=f'{name}__aligned') + self._state[out.name] = self._state[name] + + lin = LinearAlign(self.metadata[int(self.is_edge_level(node))], + self.in_channels[name]) + setattr(self.module, f'align_lin__{name}', lin) + + # Perform grouping of type-wise values into a single tensor: + if self.is_edge_level(node): + self.graph.inserting_after(out) + out = self.graph.create_node( + 'call_function', target=group_edge_placeholder, + args=(out if name in self.in_channels else node, + self.edge_type2id, + self.find_by_name('node_offset_dict')), + name=f'{name}__grouped') + self._state[out.name] = 'edge' + + else: + self.graph.inserting_after(out) + out = self.graph.create_node( + 'call_function', target=group_node_placeholder, + args=(out if name in self.in_channels else node, + self.node_type2id), name=f'{name}__grouped') + self._state[out.name] = 'node' + + self.replace_all_uses_with(node, out) + + def call_message_passing_module(self, node, target: Any, name: str): + # Call the `HeteroBasisConv` wrapper instead of a single + # message passing layer. We need to inject the `edge_type` as the first + # argument. + node.args = (self.find_by_name('edge_type'), ) + node.args + + def output(self, node, target: Any, name: str): + # Split the output into dictionaries holding either node type-wise or + # edge type-wise data. + def _recurse(value: Any) -> Any: + if isinstance(value, Node) and self.is_edge_level(value): + self.graph.inserting_before(node) + return self.graph.create_node( + 'call_function', target=split_output, + args=(value, self.find_by_name('edge_offset_dict')), + name=f'{value.name}__split') + + elif isinstance(value, Node): + self.graph.inserting_before(node) + return self.graph.create_node( + 'call_function', target=split_output, + args=(value, self.find_by_name('node_offset_dict')), + name=f'{value.name}__split') + + elif isinstance(value, dict): + return {k: _recurse(v) for k, v in value.items()} + elif isinstance(value, list): + return [_recurse(v) for v in value] + elif isinstance(value, tuple): + return tuple(_recurse(v) for v in value) + else: + return value + + if node.type is not None and isinstance(node.args[0], Node): + output = node.args[0] + Type = EdgeType if self.is_edge_level(output) else NodeType + node.type = Dict[Type, node.type] + else: + node.type = None + + node.args = (_recurse(node.args[0]), ) + + def init_submodule(self, module: Layer, target: str) -> Layer: + if not isinstance(module, MessagePassing): + return module + + # Replace each `MessagePassing` module with a `HeteroBasisConv` wrapper: + return HeteroBasisConv(module, len(self.metadata[1]), self.num_bases) + +############################################################################### + +# Hook function to inject basis re-weighting for each edge type +def hook(module, inputs, output): + assert isinstance(module._edge_type, Tensor) + if module._edge_type.shape[0] != output.shape[-2]: + raise ValueError( + f"Number of messages ({output.shape[0]}) does not match " + f"with the number of original edges " + f"({module._edge_type.shape[0]}). Does your message " + f"passing layer create additional self-loops? Try to " + f"remove them via 'add_self_loops=False'") + weight = module.edge_type_weight.reshape([-1])[module._edge_type] + weight = weight.reshape([1] * (len(output.shape) - 2) + [-1, 1]) + return weight * output + + +class HeteroBasisConv(Layer): + # A wrapper layer that applies the basis-decomposition technique to a + # heterogeneous graph. + def __init__(self, module: MessagePassing, num_relations: int, + num_bases: int): + super().__init__() + + self.num_relations = num_relations + self.num_bases = num_bases + + self.convs = LayerList() + for _ in range(num_bases): + conv = copy.deepcopy(module) + conv.fuse = False # Disable `message_and_aggregate` functionality. + # We learn a single scalar weight for each individual edge type, + # which is used to weight the output message based on edge type: + conv.edge_type_weight = self.create_parameter( + shape=[1, num_relations], + default_initializer=paddle.nn.initializer.XavierUniform()) + conv.register_forward_post_hook(hook) + self.convs.append(conv) + + if self.num_bases > 1: + self.reset_parameters() + + def reset_parameters(self): + for conv in self.convs: + if hasattr(conv, 'reset_parameters'): + conv.reset_parameters() + elif sum([p.numel() for p in conv.parameters()]) > 0: + warnings.warn( + f"'{conv}' will be duplicated, but its parameters cannot " + f"be reset. To suppress this warning, add a " + f"'reset_parameters()' method to '{conv}'") + + def forward(self, edge_type: Tensor, *args, **kwargs) -> Tensor: + out = None + # Call message passing modules and perform aggregation: + for conv in self.convs: + conv._edge_type = edge_type + res = conv(*args, **kwargs) + del conv._edge_type + out = res if out is None else out.add_(res) + return out + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_relations=' + f'{self.num_relations}, num_bases={self.num_bases})') + + +class LinearAlign(Layer): + # Aligns representations to the same dimensionality. + def __init__(self, keys: List[Union[NodeType, EdgeType]], + out_channels: int): + super().__init__() + self.out_channels = out_channels + self.lins = LayerDict() + for key in keys: + self.lins[key2str(key)] = Linear(-1, out_channels) + + def forward( + self, x_dict: Dict[Union[NodeType, EdgeType], Tensor] + ) -> Dict[Union[NodeType, EdgeType], Tensor]: + return {key: self.lins[key2str(key)](x) for key, x in x_dict.items()} + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_relations={len(self.lins)}, ' + f'out_channels={self.out_channels})') + + +############################################################################### +# These methods are used to compute the cumulative sizes of input dictionaries +# for unified graph representation and splitting final output data. + + +def get_node_offset_dict( + input_dict: Dict[NodeType, Union[Tensor, SparseTensor]], + type2id: Dict[NodeType, int], +) -> Dict[NodeType, int]: + cumsum = 0 + out: Dict[NodeType, int] = {} + for key in type2id.keys(): + out[key] = cumsum + cumsum += input_dict[key].shape[-2] + return out + +def get_edge_offset_dict( + input_dict: Dict[EdgeType, Union[Tensor, SparseTensor]], + type2id: Dict[EdgeType, int], +) -> Dict[EdgeType, int]: + cumsum = 0 + out: Dict[EdgeType, int] = {} + for key in type2id.keys(): + out[key] = cumsum + value = input_dict[key] + if isinstance(value, SparseTensor): + cumsum += value.nnz() + elif value.dtype == paddle.int64 and value.shape[0] == 2: + cumsum += value.shape[-1] + else: + cumsum += value.shape[-2] + return out + + +def get_edge_type( + input_dict: Dict[EdgeType, Union[Tensor, SparseTensor]], + type2id: Dict[EdgeType, int], +) -> Tensor: + inputs = [input_dict[key] for key in type2id.keys()] + outs = [] + + for i, value in enumerate(inputs): + if value.shape[0] == 2 and value.dtype == paddle.int64: # edge_index + out = paddle.full([value.shape[-1]], i, dtype=paddle.int64) + elif isinstance(value, SparseTensor): + out = paddle.full([value.nnz()], i, dtype=paddle.int64) + else: + out = paddle.full([value.shape[-2]], i, dtype=paddle.int64) + outs.append(out) + + return outs[0] if len(outs) == 1 else paddle.concat(outs, axis=0) + + +def group_node_placeholder(input_dict: Dict[NodeType, Tensor], + type2id: Dict[NodeType, int]) -> Tensor: + inputs = [input_dict[key] for key in type2id.keys()] + return inputs[0] if len(inputs) == 1 else paddle.concat(inputs, axis=-2) + + +def group_edge_placeholder( + input_dict: Dict[EdgeType, Union[Tensor, SparseTensor]], + type2id: Dict[EdgeType, int], + offset_dict: Dict[NodeType, int] = None, +) -> Union[Tensor, SparseTensor]: + inputs = [input_dict[key] for key in type2id.keys()] + + if len(inputs) == 1: + return inputs[0] + + if inputs[0].shape[0] == 2 and inputs[0].dtype == paddle.int64: # edge_index + if offset_dict is None: + raise AttributeError( + "Cannot infer node-level offsets. Please ensure that there " + "exists a node-level argument before the 'edge_index' " + "argument in your forward header.") + + outputs = [] + for value, (src_type, _, dst_type) in zip(inputs, type2id): + value = value.clone() + value[0, :] += offset_dict[src_type] + value[1, :] += offset_dict[dst_type] + outputs.append(value) + + return paddle.concat(outputs, axis=-1) + + elif isinstance(inputs[0], SparseTensor): + if offset_dict is None: + raise AttributeError( + "Cannot infer node-level offsets. Please ensure that there " + "exists a node-level argument before the 'SparseTensor' " + "argument in your forward header.") + + rows, cols = [], [] + for value, (src_type, _, dst_type) in zip(inputs, type2id): + col, row, _ = value.coo() + rows.append(row + offset_dict[src_type]) + cols.append(col + offset_dict[dst_type]) + + row = paddle.concat(rows, axis=0) + col = paddle.concat(cols, axis=0) + return paddle.stack([row, col], axis=0) + + else: + return paddle.concat(inputs, axis=-2) + + +def split_output( + output: Tensor, + offset_dict: Union[Dict[NodeType, int], Dict[EdgeType, int]], +) -> Union[Dict[NodeType, Tensor], Dict[EdgeType, Tensor]]: + cumsums = list(offset_dict.values()) + [output.shape[-2]] + sizes = [cumsums[i + 1] - cumsums[i] for i in range(len(offset_dict))] + outputs = paddle.split(output, sizes, axis=-2) + return {key: output for key, output in zip(offset_dict, outputs)} + + +def key2str(key: Union[NodeType, EdgeType]) -> str: + key = '__'.join(key) if isinstance(key, tuple) else key + return key.replace(' ', '_').replace('-', '_').replace(':', '_') \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/nn/unpool/__init__.py b/jointContribution/mattergen/paddle_geometric/nn/unpool/__init__.py new file mode 100644 index 00000000..ce01900c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/unpool/__init__.py @@ -0,0 +1,9 @@ +r"""Unpooling package.""" + +from .knn_interpolate import knn_interpolate + +__all__ = [ + 'knn_interpolate', +] + +classes = __all__ diff --git a/jointContribution/mattergen/paddle_geometric/nn/unpool/knn_interpolate.py b/jointContribution/mattergen/paddle_geometric/nn/unpool/knn_interpolate.py new file mode 100644 index 00000000..66ab09b4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/nn/unpool/knn_interpolate.py @@ -0,0 +1,64 @@ +from typing import Optional + +import paddle +from paddle import Tensor +from paddle_geometric.nn import knn # Assuming knn is implemented in paddle_geometric +from paddle_geometric.utils import scatter # Assuming scatter is available in paddle_geometric + + +def knn_interpolate(x: Tensor, pos_x: Tensor, pos_y: Tensor, + batch_x: Optional[Tensor] = None, batch_y: Optional[Tensor] = None, + k: int = 3, num_workers: int = 1): + r"""The k-NN interpolation from the `"PointNet++: Deep Hierarchical + Feature Learning on Point Sets in a Metric Space" + `_ paper. + + For each point :math:`y` with position :math:`\mathbf{p}(y)`, its + interpolated features :math:`\mathbf{f}(y)` are given by + + .. math:: + \mathbf{f}(y) = \frac{\sum_{i=1}^k w(x_i) \mathbf{f}(x_i)}{\sum_{i=1}^k + w(x_i)} \textrm{, where } w(x_i) = \frac{1}{d(\mathbf{p}(y), + \mathbf{p}(x_i))^2} + + and :math:`\{ x_1, \ldots, x_k \}` denoting the :math:`k` nearest points + to :math:`y`. + + Args: + x (paddle.Tensor): Node feature matrix + :math:`\mathbf{X} \in \mathbb{R}^{N \times F}`. + pos_x (paddle.Tensor): Node position matrix + :math:`\in \mathbb{R}^{N \times d}`. + pos_y (paddle.Tensor): Upsampled node position matrix + :math:`\in \mathbb{R}^{M \times d}`. + batch_x (paddle.Tensor, optional): Batch vector + :math:`\mathbf{b_x} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node from :math:`\mathbf{X}` to a specific example. + (default: :obj:`None`) + batch_y (paddle.Tensor, optional): Batch vector + :math:`\mathbf{b_y} \in {\{ 0, \ldots, B-1\}}^N`, which assigns + each node from :math:`\mathbf{Y}` to a specific example. + (default: :obj:`None`) + k (int, optional): Number of neighbors. (default: :obj:`3`) + num_workers (int, optional): Number of workers to use for computation. + Has no effect in case :obj:`batch_x` or :obj:`batch_y` is not + :obj:`None`, or the input lies on the GPU. (default: :obj:`1`) + """ + with paddle.no_grad(): + # Assuming knn is implemented in paddle_geometric, otherwise implement it manually + assign_index = knn(pos_x, pos_y, k, batch_x=batch_x, batch_y=batch_y, + num_workers=num_workers) + y_idx, x_idx = assign_index[0], assign_index[1] + + # Calculate pairwise distance squared between points + diff = pos_x[x_idx] - pos_y[y_idx] + squared_distance = (diff * diff).sum(axis=-1, keepdim=True) + + # Calculate the weights for interpolation + weights = 1.0 / paddle.clamp(squared_distance, min=1e-16) + + # Interpolate the features using the calculated weights + y = scatter(x[x_idx] * weights, y_idx, 0, pos_y.shape[0], reduce='sum') + y = y / scatter(weights, y_idx, 0, pos_y.shape[0], reduce='sum') + + return y diff --git a/jointContribution/mattergen/paddle_geometric/profile/__init__.py b/jointContribution/mattergen/paddle_geometric/profile/__init__.py new file mode 100644 index 00000000..ab3c7f07 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/profile/__init__.py @@ -0,0 +1,43 @@ +r"""GNN profiling package.""" + +from .benchmark import benchmark +from .profile import ( + get_stats_summary, + print_time_total, + profileit, + rename_profile_file, + timeit, + paddle_profile, + trace_handler, + xpu_profile, +) +from .utils import ( + count_parameters, + get_cpu_memory_from_gc, + get_data_size, + get_gpu_memory_from_gc, + get_gpu_memory_from_ipex, + get_gpu_memory_from_nvidia_smi, + get_model_size, +) + +__all__ = [ + 'profileit', + 'timeit', + 'get_stats_summary', + 'trace_handler', + 'print_time_total', + 'rename_profile_file', + 'torch_profile', + 'xpu_profile', + 'count_parameters', + 'get_model_size', + 'get_data_size', + 'get_cpu_memory_from_gc', + 'get_gpu_memory_from_gc', + 'get_gpu_memory_from_nvidia_smi', + 'get_gpu_memory_from_ipex', + 'benchmark', +] + +classes = __all__ diff --git a/jointContribution/mattergen/paddle_geometric/profile/benchmark.py b/jointContribution/mattergen/paddle_geometric/profile/benchmark.py new file mode 100644 index 00000000..dc5a698a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/profile/benchmark.py @@ -0,0 +1,141 @@ +import time +from typing import Any, Callable, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import is_paddle_sparse_tensor + + +def require_grad(x: Any, requires_grad: bool = True) -> Any: + if (isinstance(x, Tensor) and x.stop_gradient == (not requires_grad) + and not is_paddle_sparse_tensor(x)): + x.stop_gradient = not requires_grad + return x + elif isinstance(x, list): + return [require_grad(v, requires_grad) for v in x] + elif isinstance(x, tuple): + return tuple(require_grad(v, requires_grad) for v in x) + elif isinstance(x, dict): + return {k: require_grad(v, requires_grad) for k, v in x.items()} + return x + + +def benchmark( + funcs: List[Callable], + args: Union[Tuple[Any], List[Tuple[Any]]], + num_steps: int, + func_names: Optional[List[str]] = None, + num_warmups: int = 10, + backward: bool = False, + per_step: bool = False, + progress_bar: bool = False, +): + r"""Benchmark a list of functions :obj:`funcs` that receive the same set + of arguments :obj:`args`. + + Args: + funcs ([Callable]): The list of functions to benchmark. + args ((Any, ) or [(Any, )]): The arguments to pass to the functions. + Can be a list of arguments for each function in :obj:`funcs` in + case their headers differ. + Alternatively, you can pass in functions that generate arguments + on-the-fly (e.g., useful for benchmarking models on various sizes). + num_steps (int): The number of steps to run the benchmark. + func_names ([str], optional): The names of the functions. If not given, + will try to infer the name from the function itself. + (default: :obj:`None`) + num_warmups (int, optional): The number of warmup steps. + (default: :obj:`10`) + backward (bool, optional): If set to :obj:`True`, will benchmark both + forward and backward passes. (default: :obj:`False`) + per_step (bool, optional): If set to :obj:`True`, will report runtimes + per step. (default: :obj:`False`) + progress_bar (bool, optional): If set to :obj:`True`, will print a + progress bar during benchmarking. (default: :obj:`False`) + """ + from tabulate import tabulate + + if num_steps <= 0: + raise ValueError(f"'num_steps' must be a positive integer " + f"(got {num_steps})") + + if num_warmups <= 0: + raise ValueError(f"'num_warmups' must be a positive integer " + f"(got {num_warmups})") + + if func_names is None: + func_names = [get_func_name(func) for func in funcs] + + if len(funcs) != len(func_names): + raise ValueError(f"Length of 'funcs' (got {len(funcs)}) and " + f"'func_names' (got {len(func_names)}) must be equal") + + # Zero-copy `args` for each function (if necessary): + args_list = [args] * len(funcs) if not isinstance(args, list) else args + + iterator = zip(funcs, args_list, func_names) + if progress_bar: + from tqdm import tqdm + iterator = tqdm(iterator, total=len(funcs)) + + ts: List[List[str]] = [] + for func, inputs, name in iterator: + t_forward = t_backward = 0 + for i in range(num_warmups + num_steps): + args = inputs() if callable(inputs) else inputs + args = require_grad(args, backward) + + if paddle.device.is_compiled_with_cuda(): + paddle.device.cuda.synchronize() + t_start = time.perf_counter() + + out = func(*args) + + if paddle.device.is_compiled_with_cuda(): + paddle.device.cuda.synchronize() + if i >= num_warmups: + t_forward += time.perf_counter() - t_start + + if backward: + if isinstance(out, (tuple, list)): + out = sum(o.sum() for o in out if isinstance(o, Tensor)) + elif isinstance(out, dict): + out = out.values() + out = sum(o.sum() for o in out if isinstance(o, Tensor)) + + out_grad = paddle.ones_like(out) + t_start = time.perf_counter() + + out.backward(out_grad) + + if paddle.device.is_compiled_with_cuda(): + paddle.device.cuda.synchronize() + if i >= num_warmups: + t_backward += time.perf_counter() - t_start + + if per_step: + ts.append([name, f'{t_forward/num_steps:.6f}s']) + else: + ts.append([name, f'{t_forward:.4f}s']) + if backward: + if per_step: + ts[-1].append(f'{t_backward/num_steps:.6f}s') + ts[-1].append(f'{(t_forward + t_backward)/num_steps:.6f}s') + else: + ts[-1].append(f'{t_backward:.4f}s') + ts[-1].append(f'{t_forward + t_backward:.4f}s') + + header = ['Name', 'Forward'] + if backward: + header.extend(['Backward', 'Total']) + + print(tabulate(ts, headers=header, tablefmt='psql')) + + +def get_func_name(func: Callable) -> str: + if hasattr(func, '__name__'): + return func.__name__ + elif hasattr(func, '__class__'): + return func.__class__.__name__ + raise ValueError(f"Could not infer name for function '{func}'") diff --git a/jointContribution/mattergen/paddle_geometric/profile/profile.py b/jointContribution/mattergen/paddle_geometric/profile/profile.py new file mode 100644 index 00000000..1bf766b5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/profile/profile.py @@ -0,0 +1,347 @@ +import os +import pathlib +import time +from contextlib import ContextDecorator, contextmanager +from dataclasses import dataclass +from typing import Any, List, Tuple, Union + +import paddle +from paddle.profiler import Profiler + +from paddle_geometric.profile.utils import ( + byte_to_megabyte, + get_gpu_memory_from_ipex, + get_gpu_memory_from_nvidia_smi, +) + +ProfilerActivity =None + +@dataclass +class GPUStats: + time: float + max_allocated_gpu: float + max_reserved_gpu: float + max_active_gpu: float + + +@dataclass +class CUDAStats(GPUStats): + nvidia_smi_free_cuda: float + nvidia_smi_used_cuda: float + + +@dataclass +class GPUStatsSummary: + time_mean: float + time_std: float + max_allocated_gpu: float + max_reserved_gpu: float + max_active_gpu: float + + +@dataclass +class CUDAStatsSummary(GPUStatsSummary): + min_nvidia_smi_free_cuda: float + max_nvidia_smi_used_cuda: float + +def profileit(device: str): # pragma: no cover + r"""A decorator to facilitate profiling a function, *e.g.*, obtaining + training runtime and memory statistics of a specific model on a specific + dataset. + Returns a :obj:`GPUStats` if :obj:`device` is :obj:`xpu` or extended + object :obj:`CUDAStats`, if :obj:`device` is :obj:`cuda`. + + Args: + device (str): Target device for profiling. Options are: + :obj:`cuda` and obj:`xpu`. + + .. code-block:: python + + @profileit("cuda") + def train(model, optimizer, x, edge_index, y): + optimizer.clear_grad() + out = model(x, edge_index) + loss = criterion(out, y) + loss.backward() + optimizer.step() + return float(loss) + + loss, stats = train(model, x, edge_index, y) + """ + def decorator(func): + def wrapper( + *args, **kwargs + ) -> Union[Tuple[Any, GPUStats], Tuple[Any, CUDAStats]]: + model = args[0] + if not isinstance(model, paddle.nn.Layer): + raise AttributeError( + 'First argument for profiling needs to be paddle.nn.Layer') + if device not in ['cuda', 'xpu']: + raise AttributeError( + "The profiling decorator supports only CUDA and " + "XPU devices") + + device_id = None + for arg in list(args) + list(kwargs.values()): + if isinstance(arg, paddle.Tensor): + device_id = arg.place.gpu_device_id() + break + if device_id is None: + raise AttributeError( + "Could not infer GPU device from the args in the " + "function being profiled") + if device_id == -1: + raise RuntimeError( + "The profiling decorator does not support profiling " + "on non GPU devices") + + is_cuda = device == 'cuda' + + if is_cuda: + from paddle.profiler import Profiler + + # Init Paddle profiler: + profiler = Profiler(scheduler=paddle.profiler.make_scheduler(1, 1)) + profiler.start() + + start_event = paddle.device.cuda.Event(enable_timing=True) + end_event = paddle.device.cuda.Event(enable_timing=True) + start_event.record() + + out = func(*args, **kwargs) + + end_event.record() + paddle.device.cuda.synchronize() + time = paddle.device.cuda.elapsed_time(start_event, end_event) / 1000 + + if is_cuda: + profiler.stop() + profiler.export('profiler_output') + + # Memory stats: + mem_stats = paddle.device.cuda.memory_stats(device_id) + max_allocated = mem_stats['allocated_bytes.all.peak'] + max_reserved = mem_stats['reserved_bytes.all.peak'] + max_active = mem_stats['active.all.peak'] + + free_cuda, used_cuda = get_gpu_memory_from_nvidia_smi(device=device_id) + + stats = CUDAStats(time, max_allocated, max_reserved, + max_active, free_cuda, used_cuda) + return out, stats + else: + stats = GPUStats(time, *get_gpu_memory_from_ipex(device_id)) + return out, stats + + return wrapper + + return decorator + + + +class timeit(ContextDecorator): + r"""A context decorator to facilitate timing a function, *e.g.*, obtaining + the runtime of a specific model on a specific dataset. + + .. code-block:: python + + @paddle.no_grad() + def test(model, x, edge_index): + return model(x, edge_index) + + with timeit() as t: + z = test(model, x, edge_index) + time = t.duration + + Args: + log (bool, optional): If set to :obj:`False`, will not log any runtime + to the console. (default: :obj:`True`) + avg_time_divisor (int, optional): If set to a value greater than + :obj:`1`, will divide the total time by this value. Useful for + calculating the average of runtimes within a for-loop. + (default: :obj:`0`) + """ + def __init__(self, log: bool = True, avg_time_divisor: int = 0): + self.log = log + self.avg_time_divisor = avg_time_divisor + + def __enter__(self): + if paddle.device.is_compiled_with_cuda(): + paddle.device.cuda.synchronize() + self.t_start = time.time() + return self + + def __exit__(self, *args): + if paddle.device.is_compiled_with_cuda(): + paddle.device.cuda.synchronize() + self.t_end = time.time() + self.duration = self.t_end - self.t_start + if self.avg_time_divisor > 1: + self.duration = self.duration / self.avg_time_divisor + if self.log: # pragma: no cover + print(f'Time: {self.duration:.8f}s', flush=True) + + def reset(self): + r"""Prints the duration and resets current timer.""" + if self.t_start is None: + raise RuntimeError("Timer wasn't started.") + else: + self.__exit__() + self.__enter__() + + +def get_stats_summary( + stats_list: Union[List[GPUStats], List[CUDAStats]] +) -> Union[GPUStatsSummary, CUDAStatsSummary]: # pragma: no cover + r"""Creates a summary of collected runtime and memory statistics. + Returns a :obj:`GPUStatsSummary` if list of :obj:`GPUStats` was passed, + otherwise (list of :obj:`CUDAStats` was passed), + returns a :obj:`CUDAStatsSummary`. + + Args: + stats_list (Union[List[GPUStats], List[CUDAStats]]): A list of + :obj:`GPUStats` or :obj:`CUDAStats` objects. + """ + # calculate common statistics + kwargs = dict( + time_mean=float(paddle.to_tensor([s.time for s in stats_list]).mean()), + time_std=float(paddle.to_tensor([s.time for s in stats_list]).std()), + max_allocated_gpu=max([s.max_allocated_gpu for s in stats_list]), + max_reserved_gpu=max([s.max_reserved_gpu for s in stats_list]), + max_active_gpu=max([s.max_active_gpu for s in stats_list])) + + if all(isinstance(s, CUDAStats) for s in stats_list): + return CUDAStatsSummary( + **kwargs, + min_nvidia_smi_free_cuda=min( + [s.nvidia_smi_free_cuda for s in stats_list]), + max_nvidia_smi_used_cuda=max( + [s.nvidia_smi_used_cuda for s in stats_list]), + ) + else: + return GPUStatsSummary(**kwargs) + +############################################################################### + +def read_from_memlab(line_profiler: Any) -> List[float]: # pragma: no cover + from pytorch_memlab.line_profiler.line_records import LineRecords + + # Convert and collect memory statistics + track_stats = [ # Different statistics can be collected as needed + 'allocated_bytes.all.peak', + 'reserved_bytes.all.peak', + 'active_bytes.all.peak', + ] + + records = LineRecords(line_profiler._raw_line_records, + line_profiler._code_infos) + stats = records.display(None, track_stats)._line_records + return [byte_to_megabyte(x) for x in stats.values.max(axis=0).tolist()] + + +def trace_handler(profiler): + """Handles the profiling trace and exports it as a JSON file.""" + print_time_total(profiler) + profile_dir = str(pathlib.Path.cwd()) + '/' + timeline_file = profile_dir + 'timeline' + '.json' + profiler.export(timeline_file, format="json") + + +def print_time_total(profiler): + """Prints the total time summary of profiling events.""" + profiler_summary = sorted_table(profiler.get_summary(), "total", op_detail=True) + print(profiler_summary) + + +def rename_profile_file(*args): + """Renames the exported profiling file with custom arguments for identification.""" + profile_dir = str(pathlib.Path.cwd()) + '/' + timeline_file = profile_dir + 'profile' + for arg in args: + timeline_file += '-' + arg + timeline_file += '.json' + os.rename('timeline.json', timeline_file) + +@contextmanager +def xpu_profile(export_chrome_trace=True): + with paddle.autograd.profiler_legacy.profile(use_xpu=True) as profile: + yield + print(profile.key_averages().table(sort_by='self_xpu_time_total')) + if export_chrome_trace: + profile.export_chrome_trace('timeline.json') + +@contextmanager +def paddle_profile(export_chrome_trace=True, csv_data=None, write_csv=None): + """ + A context manager to profile Paddle code execution. + + Args: + export_chrome_trace (bool): Whether to export the profiling trace as a Chrome-compatible JSON file. + csv_data (dict): A dictionary to store profiling data for exporting to CSV. + write_csv (str): If set to 'prof', writes the profiling data to the specified CSV dictionary. + """ + # Specify profiling targets (CPU, GPU) + activities = ['cpu'] + if paddle.is_compiled_with_cuda(): + activities.append('gpu') + + profiler = Profiler( + targets=activities, + on_trace_ready=trace_handler if export_chrome_trace else print_time_total, + ) + + profiler.start() + try: + yield + finally: + profiler.stop() + + if csv_data is not None and write_csv == 'prof': + events = profiler.get_summary(op_detail=True, sort_by='total') + save_profile_data(csv_data, events, paddle.is_compiled_with_cuda()) + + +def format_prof_time(time): + """ + Formats profiling time from microseconds to seconds. + + Args: + time (float): Time in microseconds. + + Returns: + float: Time in seconds. + """ + return round(time / 1e6, 3) + + +def save_profile_data(csv_data, events, use_cuda): + """ + Saves profiling data to a CSV-compatible dictionary. + + Args: + csv_data (dict): Dictionary to store profiling data. + events: Profiling events. + use_cuda (bool): Whether CUDA events are included in the profiling. + """ + sum_self_cpu_time_total = sum( + [event.self_cpu_time for event in events]) + sum_cpu_time_total = sum([event.cpu_time for event in events]) + sum_self_cuda_time_total = sum( + [event.gpu_time for event in events]) if use_cuda else 0 + + for e in events[:5]: # Save the top 5 most time-consuming operations + csv_data['NAME'].append(e.op_name) + csv_data['SELF CPU %'].append( + round(e.self_cpu_time * 100.0 / sum_self_cpu_time_total, 3)) + csv_data['SELF CPU'].append(format_prof_time(e.self_cpu_time)) + csv_data['CPU TOTAL %'].append( + round(e.cpu_time * 100.0 / sum_cpu_time_total, 3)) + csv_data['CPU TOTAL'].append(format_prof_time(e.cpu_time)) + csv_data['CPU TIME AVG'].append(format_prof_time(e.cpu_time)) + if use_cuda: + csv_data['SELF CUDA %'].append( + e.gpu_time * 100.0 / sum_self_cuda_time_total) + csv_data['SELF CUDA'].append(format_prof_time(e.gpu_time)) + csv_data['CUDA TOTAL'].append(format_prof_time(e.gpu_time)) + csv_data['CUDA TIME AVG'].append(format_prof_time(e.gpu_time)) + csv_data['# OF CALLS'].append(e.calls) \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/profile/profiler.py b/jointContribution/mattergen/paddle_geometric/profile/profiler.py new file mode 100644 index 00000000..29bebd77 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/profile/profiler.py @@ -0,0 +1,480 @@ +import functools +from collections import OrderedDict, defaultdict, namedtuple +from typing import Any, List, NamedTuple, Optional, Tuple + +import paddle +import paddle.profiler as paddle_profiler + +# Predefined namedtuple for variable setting (global template) +Trace = namedtuple('Trace', ['path', 'leaf', 'module']) + +# The metrics returned from the paddle profiler +Measure = namedtuple('Measure', [ + 'self_cpu_total', + 'cpu_total', + 'self_gpu_total', + 'gpu_total', + 'self_cpu_memory', + 'cpu_memory', + 'self_gpu_memory', + 'gpu_memory', + 'occurrences', +]) + + +class Profiler: + r"""Layer-by-layer profiling of Paddle models, using the Paddle profiler + for memory profiling. The structure is adapted to maintain compatibility + with paddle_geometric. + + Args: + model (paddle.nn.Layer): The underlying model to be profiled. + enabled (bool, optional): If set to :obj:`True`, turn on the profiler. + (default: :obj:`True`) + use_gpu (bool, optional): Whether to profile GPU execution. + (default: :obj:`False`) + profile_memory (bool, optional): If set to :obj:`True`, also profile + memory usage. (default: :obj:`False`) + paths ([str], optional): Pre-defined paths for fast loading. + (default: :obj:`None`) + """ + def __init__( + self, + model: paddle.nn.Layer, + enabled: bool = True, + use_gpu: bool = False, + profile_memory: bool = False, + paths: Optional[List[str]] = None, + ): + self._model = model + self.enabled = enabled + self.use_gpu = use_gpu + self.profile_memory = profile_memory + self.paths = paths + + self.entered = False + self.exited = False + self.traces = () + self._ids = set() + self.trace_profile_events = defaultdict(list) + + def __enter__(self): + if not self.enabled: + return self + if self.entered: + raise RuntimeError("The profiler can only be initialized once.") + self.entered = True + self._forwards = {} # Store the original forward functions + + # Generate the trace and conduct profiling + self.traces = tuple(map(self._hook_trace, _walk_modules(self._model))) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if not self.enabled: + return + tuple(map(self._remove_hook_trace, self.traces)) + del self._forwards # Remove unnecessary forwards + self.exited = True + + def get_trace(self): + return _layer_trace(self.traces, self.trace_profile_events) + + def __repr__(self) -> str: + return self.get_trace()[0] + + def __call__(self, *args, **kwargs): + return self._model(*args, **kwargs) + + def _hook_trace(self, trace): + """Add hooks to Paddle modules for profiling. The underlying model's + forward pass is hooked/decorated here. + """ + [path, leaf, module] = trace + + # The id of the model is guaranteed to be unique + _id = id(module) + if (self.paths is not None + and path in self.paths) or (self.paths is None and leaf): + if _id in self._ids: + # Already wrapped + return trace + self._ids.add(_id) + _forward = module.forward + self._forwards[path] = _forward + + @functools.wraps(_forward) + def wrap_forward(*args, **kwargs): + """The forward pass is decorated and profiled here.""" + activities = ['CPU'] + if self.use_gpu: + activities.append('GPU') + with paddle_profiler.Profiler( + targets=activities, + profile_memory=self.profile_memory, + ) as prof: + res = _forward(*args, **kwargs) + + event_list = prof.get_summary() + + # Each profile call should be contained in its own list + self.trace_profile_events[path].append(event_list) + return res + + # Decorate the underlying model's forward pass + module.forward = wrap_forward + return trace + + def _remove_hook_trace(self, trace): + """Clean it up after the profiling is done.""" + [path, leaf, module] = trace + _id = id(module) + if _id in self._ids: + self._ids.discard(_id) + else: + return + if (self.paths is not None + and path in self.paths) or (self.paths is None and leaf): + module.forward = self._forwards[path] + + +def _layer_trace( + traces: NamedTuple, + trace_events: Any, + show_events: bool = True, + paths: List[str] = None, + use_gpu: bool = False, + profile_memory: bool = False, + dt: Tuple[str, ...] = ('-', '-', '-', ' '), +) -> object: + """Construct human-readable output of the profiler traces and events. The + information is presented in layers, and each layer contains its underlying + operators. + + Args: + traces (trace object): Raw trace to be parsed. + trace_events (trace object): Raw events to be parsed. + show_events (bool, optional): If True, show detailed event information. + (default: :obj:`True`) + paths (str, optional): Predefined path for fast loading. By default, it + will not be used. + (default: :obj:`False`) + use_gpu (bool, optional): Enables timing of GPU events. + (default: :obj:`False`) + profile_memory (bool, optional): If True, also profile memory usage. + (default: :obj:`False`) + dt (object, optional): Delimiters for showing the events. + """ + tree = OrderedDict() + + for trace in traces: + [path, leaf, module] = trace + current_tree = tree + # Unwrap all of the events, in case model is called multiple times + events = [te for t_events in trace_events[path] for te in t_events] + for depth, name in enumerate(path, 1): + if name not in current_tree: + current_tree[name] = OrderedDict() + if depth == len(path) and ((paths is None and leaf) or + (paths is not None and path in paths)): + # Tree measurements have key None, avoiding name conflict + if show_events: + for event_name, event_group in _group_by( + events, lambda e: e.name): + event_group = list(event_group) + current_tree[name][event_name] = { + None: + _build_measure_tuple(event_group, len(event_group)) + } + else: + current_tree[name][None] = _build_measure_tuple( + events, len(trace_events[path])) + current_tree = current_tree[name] + tree_lines = _flatten_tree(tree) + + format_lines = [] + has_self_gpu_total = False + has_self_cpu_memory = False + has_cpu_memory = False + has_self_gpu_memory = False + has_gpu_memory = False + + raw_results = {} + for idx, tree_line in enumerate(tree_lines): + depth, name, measures = tree_line + + next_depths = [pl[0] for pl in tree_lines[idx + 1:]] + pre = "-" + if depth > 0: + pre = dt[1] if depth in next_depths and next_depths[0] >= depth else dt[2] + depth -= 1 + while depth > 0: + pre = (dt[0] + pre) if depth in next_depths else (dt[3] + pre) + depth -= 1 + + format_lines.append([pre + name, *_format_measure_tuple(measures)]) + if measures: + has_self_gpu_total = (has_self_gpu_total + or measures.self_gpu_total is not None) + has_self_cpu_memory = (has_self_cpu_memory + or measures.self_cpu_memory is not None) + has_cpu_memory = has_cpu_memory or measures.cpu_memory is not None + has_self_gpu_memory = (has_self_gpu_memory + or measures.self_gpu_memory is not None) + has_gpu_memory = (has_gpu_memory + or measures.gpu_memory is not None) + + raw_results[name] = [ + measures.self_cpu_total, measures.cpu_total, + measures.self_gpu_total, measures.gpu_total, + measures.self_cpu_memory, measures.cpu_memory, + measures.self_gpu_memory, measures.gpu_memory, + measures.occurrences + ] + + # Construct the table (this is pretty ugly and can probably be optimized) + heading = ( + "Module", + "Self CPU total", + "CPU total", + "Self GPU total", + "GPU total", + "Self CPU Mem", + "CPU Mem", + "Self GPU Mem", + "GPU Mem", + "Number of Calls", + ) + + # Get the output aligned + max_lens = [max(map(len, col)) for col in zip(*([heading] + format_lines))] + + # Not all columns should be displayed, specify kept indexes + keep_indexes = [0, 1, 2, 9] + if profile_memory: + if has_self_cpu_memory: + keep_indexes.append(5) + if has_cpu_memory: + keep_indexes.append(6) + if use_cuda: + if has_self_gpu_total: + keep_indexes.append(3) + keep_indexes.append(4) + if profile_memory: + if has_self_gpu_memory: + keep_indexes.append(7) + if has_gpu_memory: + keep_indexes.append(8) + + # The final columns to be shown + keep_indexes = tuple(sorted(keep_indexes)) + + heading_list = list(heading) + + display = ( # Table heading + " | ".join([ + "{:<{}s}".format(heading[keep_index], max_lens[keep_index]) + for keep_index in keep_indexes + ]) + "\n") + display += ( # Separator + "-|-".join([ + "-" * max_len for val_idx, max_len in enumerate(max_lens) + if val_idx in keep_indexes + ]) + "\n") + for format_line in format_lines: # Body + display += (" | ".join([ + "{:<{}s}".format(value, max_lens[val_idx]) + for val_idx, value in enumerate(format_line) + if val_idx in keep_indexes + ]) + "\n") + + # Layer information readable + key_dict = {} + layer_names = [] + layer_stats = [] + for format_line in format_lines: # Body + if format_line[1] == '': # Key line + key_dict[format_line[0].count("-")] = format_line[0] + else: # Must print + # Get current line's level + curr_level = format_line[0].count("-") + par_str = "" + for i in range(1, curr_level): + par_str += key_dict[i] + curr_key = par_str + format_line[0] + layer_names.append(curr_key) + layer_stats.append(format_line[1:]) + + return display, heading_list, raw_results, layer_names, layer_stats + +def _flatten_tree(t, depth=0): + flat = [] + for name, st in t.items(): + measures = st.pop(None, None) + flat.append([depth, name, measures]) + flat.extend(_flatten_tree(st, depth=depth + 1)) + return flat + + +def _build_measure_tuple(events: List, occurrences: List) -> NamedTuple: + device_str = 'device' if paddle_geometric.typing.WITH_PT24 else 'gpu' + + # Memory profiling supported in Paddle >= 2.0 + self_cpu_memory = None + has_self_cpu_memory = any( + hasattr(e, "self_cpu_memory_usage") for e in events) + if has_self_cpu_memory: + self_cpu_memory = sum( + [getattr(e, "self_cpu_memory_usage", 0) or 0 for e in events]) + cpu_memory = None + has_cpu_memory = any(hasattr(e, "cpu_memory_usage") for e in events) + if has_cpu_memory: + cpu_memory = sum( + [getattr(e, "cpu_memory_usage", 0) or 0 for e in events]) + self_gpu_memory = None + has_self_gpu_memory = any( + hasattr(e, f"self_{device_str}_memory_usage") for e in events) + if has_self_gpu_memory: + self_gpu_memory = sum([ + getattr(e, f"self_{device_str}_memory_usage", 0) or 0 + for e in events + ]) + gpu_memory = None + has_gpu_memory = any( + hasattr(e, f"{device_str}_memory_usage") for e in events) + if has_gpu_memory: + gpu_memory = sum( + [getattr(e, f"{device_str}_memory_usage", 0) or 0 for e in events]) + + # Self GPU time profiling + self_gpu_total = None + has_self_gpu_time = any( + hasattr(e, f"self_{device_str}_time_total") for e in events) + if has_self_gpu_time: + self_gpu_total = sum([ + getattr(e, f"self_{device_str}_time_total", 0) or 0 for e in events + ]) + + return Measure( + self_cpu_total=sum([e.self_cpu_time_total or 0 for e in events]), + cpu_total=sum([e.cpu_time_total or 0 for e in events]), + self_cuda_total=self_gpu_total, + cuda_total=sum( + [getattr(e, f"{device_str}_time_total") or 0 for e in events]), + self_cpu_memory=self_cpu_memory, + cpu_memory=cpu_memory, + self_cuda_memory=self_gpu_memory, + cuda_memory=gpu_memory, + occurrences=occurrences, + ) + + +def _format_measure_tuple(measure: NamedTuple) -> NamedTuple: + self_cpu_total = (format_time(measure.self_cpu_total) if measure else "") + cpu_total = format_time(measure.cpu_total) if measure else "" + self_gpu_total = (format_time(measure.self_cuda_total) if measure + and measure.self_cuda_total is not None else "") + gpu_total = format_time(measure.cuda_total) if measure else "" + self_cpu_memory = (format_memory(measure.self_cpu_memory) if measure + and measure.self_cpu_memory is not None else "") + cpu_memory = (format_memory(measure.cpu_memory) + if measure and measure.cpu_memory is not None else "") + self_gpu_memory = (format_memory(measure.self_cuda_memory) if measure + and measure.self_cuda_memory is not None else "") + gpu_memory = (format_memory(measure.cuda_memory) + if measure and measure.cuda_memory is not None else "") + occurrences = str(measure.occurrences) if measure else "" + + return Measure( + self_cpu_total=self_cpu_total, + cpu_total=cpu_total, + self_cuda_total=self_gpu_total, + cuda_total=gpu_total, + self_cpu_memory=self_cpu_memory, + cpu_memory=cpu_memory, + self_cuda_memory=self_gpu_memory, + cuda_memory=gpu_memory, + occurrences=occurrences, + ) +def _group_by(events, keyfn): + """Group events by a key function.""" + event_groups = OrderedDict() + for event in events: + key = keyfn(event) + key_events = event_groups.get(key, []) + key_events.append(event) + event_groups[key] = key_events + return event_groups.items() + + +def _walk_modules(module, name: str = "", path=()): + """ + Walk through a Paddle model and output trace tuples (its path, leaf node, module). + + Args: + module: The Paddle model or layer to walk through. + name (str): Name of the current module. + path (tuple): Path of the current module in the model hierarchy. + + Yields: + Trace: A namedtuple containing the path, whether it's a leaf node, and the module. + """ + if not name: + name = module.__class__.__name__ + + # This will track the children of the module (layers) + # For instance, [('conv1', GCNConv(10, 16)), ('conv2', GCNConv(16, 3))] + named_children = list(module.named_children()) + + # It builds the path of the structure + # For instance, ('GCN', 'conv1', 'lin') + path = path + (name, ) + + # Create namedtuple [path, (whether has) leaf, module] + yield Trace(path, len(named_children) == 0, module) + + # Recursively walk into all submodules + for name, child_module in named_children: + yield from _walk_modules(child_module, name=name, path=path) + + +def format_time(time_us: int) -> str: + """ + Returns a formatted time string. + + Args: + time_us (int): Time in microseconds. + + Returns: + str: A formatted time string. + """ + US_IN_SECOND = 1000.0 * 1000.0 + US_IN_MS = 1000.0 + if time_us >= US_IN_SECOND: + return f'{time_us / US_IN_SECOND:.3f}s' + if time_us >= US_IN_MS: + return f'{time_us / US_IN_MS:.3f}ms' + return f'{time_us:.3f}us' + + +def format_memory(nbytes: int) -> str: + """ + Returns a formatted memory size string. + + Args: + nbytes (int): Memory size in bytes. + + Returns: + str: A formatted memory size string. + """ + KB = 1024 + MB = 1024 * KB + GB = 1024 * MB + if abs(nbytes) >= GB: + return f'{nbytes * 1.0 / GB:.2f} Gb' + elif abs(nbytes) >= MB: + return f'{nbytes * 1.0 / MB:.2f} Mb' + elif abs(nbytes) >= KB: + return f'{nbytes * 1.0 / KB:.2f} Kb' + else: + return f'{nbytes} b' diff --git a/jointContribution/mattergen/paddle_geometric/profile/utils.py b/jointContribution/mattergen/paddle_geometric/profile/utils.py new file mode 100644 index 00000000..6bd28e1d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/profile/utils.py @@ -0,0 +1,163 @@ +import gc +import os +import os.path as osp +import random +import subprocess as sp +import sys +import warnings +from collections.abc import Mapping, Sequence +from typing import Any, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data.data import BaseData +from paddle_geometric.typing import SparseTensor + + +def count_parameters(model: paddle.nn.Layer) -> int: + r"""Given a :class:`paddle.nn.Layer`, count its trainable parameters. + + Args: + model (paddle.nn.Layer): The model. + """ + return sum([p.numel() for p in model.parameters() if p.trainable]) + + +def get_model_size(model: paddle.nn.Layer) -> int: + r"""Given a :class:`paddle.nn.Layer`, get its actual disk size in bytes. + + Args: + model (paddle model): The model. + """ + path = f'{random.randrange(sys.maxsize)}.pdmodel' + paddle.save(model.state_dict(), path) + model_size = osp.getsize(path) + os.remove(path) + return model_size + + +def get_data_size(data: BaseData) -> int: + r"""Given a :class:`paddle_geometric.data.Data` object, get its theoretical + memory usage in bytes. + + Args: + data (paddle_geometric.data.Data or paddle_geometric.data.HeteroData): + The :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` graph object. + """ + data_ptrs = set() + + def _get_size(obj: Any) -> int: + if isinstance(obj, Tensor): + if obj.data_ptr() in data_ptrs: + return 0 + data_ptrs.add(obj.data_ptr()) + return obj.numel() * obj.element_size() + elif isinstance(obj, SparseTensor): + return _get_size(obj.csr()) + elif isinstance(obj, Sequence) and not isinstance(obj, str): + return sum([_get_size(x) for x in obj]) + elif isinstance(obj, Mapping): + return sum([_get_size(x) for x in obj.values()]) + else: + return 0 + + return sum([_get_size(store) for store in data.stores]) + + +def get_cpu_memory_from_gc() -> int: + r"""Returns the used CPU memory in bytes, as reported by the + :python:`Python` garbage collector. + """ + warnings.filterwarnings('ignore', '.*paddle.distributed.reduce_op.*') + + mem = 0 + for obj in gc.get_objects(): + try: + if isinstance(obj, Tensor) and not obj.is_cuda: + mem += obj.numel() * obj.element_size() + except Exception: + pass + return mem + + +def get_gpu_memory_from_gc(device: int = 0) -> int: # pragma: no cover + r"""Returns the used GPU memory in bytes, as reported by the + :python:`Python` garbage collector. + + Args: + device (int, optional): The GPU device identifier. (default: :obj:`1`) + """ + warnings.filterwarnings('ignore', '.*paddle.distributed.reduce_op.*') + + mem = 0 + for obj in gc.get_objects(): + try: + if isinstance(obj, Tensor) and obj.get_device() == device: + mem += obj.numel() * obj.element_size() + except Exception: + pass + return mem + + +def get_gpu_memory_from_nvidia_smi( # pragma: no cover + device: int = 0, + digits: int = 2, +) -> Tuple[float, float]: + r"""Returns the free and used GPU memory in megabytes, as reported by + :obj:`nvidia-smi`. + + Args: + device (int, optional): The GPU device identifier. (default: :obj:`1`) + digits (int): The number of decimals to use for megabytes. + (default: :obj:`2`) + """ + CMD = 'nvidia-smi --query-gpu=memory.free --format=csv' + free_out = sp.check_output(CMD.split()).decode('utf-8').split('\n')[1:-1] + + CMD = 'nvidia-smi --query-gpu=memory.used --format=csv' + used_out = sp.check_output(CMD.split()).decode('utf-8').split('\n')[1:-1] + + if device < 0 or device >= len(free_out): + raise AttributeError( + f'GPU {device} not available (found {len(free_out)} GPUs)') + + free_mem = medibyte_to_megabyte(int(free_out[device].split()[0]), digits) + used_mem = medibyte_to_megabyte(int(used_out[device].split()[0]), digits) + + return free_mem, used_mem + + + +def get_gpu_memory_from_ipex( + device: int = 0, + digits=2) -> Tuple[float, float, float]: # pragma: no cover + r"""Returns the XPU memory statistics. + + Args: + device (int, optional): The GPU device identifier. (default: :obj:`0`) + digits (int): The number of decimals to use for megabytes. + (default: :obj:`2`) + """ + import intel_extension_for_pytorch as ipex + stats = ipex.xpu.memory_stats_as_nested_dict(device) + max_allocated = stats['allocated_bytes']['all']['peak'] + max_reserved = stats['reserved_bytes']['all']['peak'] + max_active = stats['active_bytes']['all']['peak'] + max_allocated = byte_to_megabyte(max_allocated, digits) + max_reserved = byte_to_megabyte(max_reserved, digits) + max_active = byte_to_megabyte(max_active, digits) + ipex.xpu.reset_peak_memory_stats(device) + return max_allocated, max_reserved, max_active + + +############################################################################### + + +def byte_to_megabyte(value: int, digits: int = 2) -> float: + return round(value / (1024 * 1024), digits) + + +def medibyte_to_megabyte(value: int, digits: int = 2) -> float: + return round(1.0485 * value, digits) diff --git a/jointContribution/mattergen/paddle_geometric/pytree.py b/jointContribution/mattergen/paddle_geometric/pytree.py new file mode 100644 index 00000000..344673fa --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/pytree.py @@ -0,0 +1,99 @@ +import paddle + + +# Custom implementation of pytree +class pytree: + @staticmethod + def tree_map(fn, data): + """ + Recursively traverses a nested data structure (e.g., list, tuple, dict), + applying a given function `fn` to each element. + + Args: + fn (Callable): The function to apply to each element in the structure. + data (Any): The nested data structure to traverse (can be a list, tuple, dict, or leaf node). + + Returns: + Any: A new data structure of the same type as `data`, with `fn` applied to each element. + """ + # If the current item is a list, apply the function to each element recursively. + if isinstance(data, list): + return [pytree.tree_map(fn, item) for item in data] + + # If the current item is a tuple, apply the function to each element recursively. + elif isinstance(data, tuple): + return tuple(pytree.tree_map(fn, item) for item in data) + + # If the current item is a dictionary, apply the function to each value recursively. + elif isinstance(data, dict): + return {key: pytree.tree_map(fn, value) for key, value in data.items()} + + # If the current item is a leaf (not a list, tuple, or dict), apply the function directly. + else: + return fn(data) + + @staticmethod + def tree_flatten(data): + """ + Flattens a nested data structure into a 1D list of leaf nodes. + + Args: + data (Any): The nested data structure to flatten. + + Returns: + List: A list of all the leaf elements in the input structure. + """ + if isinstance(data, list): + flattened = [] + for item in data: + flattened.extend(pytree.tree_flatten(item)) + return flattened + + elif isinstance(data, tuple): + flattened = [] + for item in data: + flattened.extend(pytree.tree_flatten(item)) + return flattened + + elif isinstance(data, dict): + flattened = [] + for value in data.values(): + flattened.extend(pytree.tree_flatten(value)) + return flattened + + # If the current item is a leaf, return it as a list. + else: + return [data] # Leaf node (e.g., a paddle.Tensor) + + @staticmethod + def tree_unflatten(flattened_data, structure): + """ + Reconstructs the original nested data structure from the flattened list. + + Args: + flattened_data (List): A 1D list of leaf nodes to unflatten. + structure (Any): The original structure of the data (e.g., list, tuple, dict) to guide the unflattening. + + Returns: + Any: A reconstructed nested data structure matching the original structure, with elements filled in. + """ + # If the structure is a list, reconstruct by splitting the flattened data accordingly. + if isinstance(structure, list): + size = len(structure) + return [pytree.tree_unflatten(flattened_data[i:i + size], item) for i, item in enumerate(structure)] + + # If the structure is a tuple, reconstruct by splitting the flattened data accordingly. + elif isinstance(structure, tuple): + size = len(structure) + return tuple(pytree.tree_unflatten(flattened_data[i:i + size], item) for i, item in enumerate(structure)) + + # If the structure is a dictionary, reconstruct by splitting the flattened data accordingly. + elif isinstance(structure, dict): + keys = list(structure.keys()) + size = len(structure) + return {key: pytree.tree_unflatten(flattened_data[i:i + size], value) for i, (key, value) in + enumerate(structure.items())} + + # If the structure is a leaf, return the single value from the flattened list. + else: + return flattened_data[0] \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/resolver.py b/jointContribution/mattergen/paddle_geometric/resolver.py new file mode 100644 index 00000000..30844377 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/resolver.py @@ -0,0 +1,43 @@ +import inspect +from typing import Any, Dict, List, Optional, Union + + +def normalize_string(s: str) -> str: + return s.lower().replace('-', '').replace('_', '').replace(' ', '') + + +def resolver( + classes: List[Any], + class_dict: Dict[str, Any], + query: Union[Any, str], + base_cls: Optional[Any], + base_cls_repr: Optional[str], + *args: Any, + **kwargs: Any, +) -> Any: + + if not isinstance(query, str): + return query + + query_repr = normalize_string(query) + if base_cls_repr is None: + base_cls_repr = base_cls.__name__ if base_cls else '' + base_cls_repr = normalize_string(base_cls_repr) + + for key_repr, cls in class_dict.items(): + if query_repr == key_repr: + if inspect.isclass(cls): + obj = cls(*args, **kwargs) + return obj + return cls + + for cls in classes: + cls_repr = normalize_string(cls.__name__) + if query_repr in [cls_repr, cls_repr.replace(base_cls_repr, '')]: + if inspect.isclass(cls): + obj = cls(*args, **kwargs) + return obj + return cls + + choices = {cls.__name__ for cls in classes} | set(class_dict.keys()) + raise ValueError(f"Could not resolve '{query}' among choices {choices}") diff --git a/jointContribution/mattergen/paddle_geometric/sampler/__init__.py b/jointContribution/mattergen/paddle_geometric/sampler/__init__.py new file mode 100644 index 00000000..1c533e2f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/sampler/__init__.py @@ -0,0 +1,19 @@ +r"""Graph sampler package.""" + +from .base import (BaseSampler, NodeSamplerInput, EdgeSamplerInput, + SamplerOutput, HeteroSamplerOutput, NegativeSampling, + NumNeighbors) +from .neighbor_sampler import NeighborSampler +from .hgt_sampler import HGTSampler + +__all__ = classes = [ + 'BaseSampler', + 'NodeSamplerInput', + 'EdgeSamplerInput', + 'SamplerOutput', + 'HeteroSamplerOutput', + 'NumNeighbors', + 'NegativeSampling', + 'NeighborSampler', + 'HGTSampler', +] diff --git a/jointContribution/mattergen/paddle_geometric/sampler/base.py b/jointContribution/mattergen/paddle_geometric/sampler/base.py new file mode 100644 index 00000000..3ede1b0c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/sampler/base.py @@ -0,0 +1,629 @@ +import copy +import math +import warnings +from abc import ABC +from collections import defaultdict +from dataclasses import dataclass +from enum import Enum +from typing import Any, Dict, List, Literal, Optional, Union, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, FeatureStore, GraphStore, HeteroData +from paddle_geometric.sampler.utils import to_bidirectional +from paddle_geometric.typing import EdgeType, EdgeTypeStr, NodeType, OptTensor +from paddle_geometric.utils.mixin import CastMixin + + +class DataType(Enum): + r"""The data type a sampler is operating on.""" + homogeneous = 'homogeneous' + heterogeneous = 'heterogeneous' + remote = 'remote' + + @classmethod + def from_data(cls, data: Any): + if isinstance(data, Data): + return cls.homogeneous + elif isinstance(data, HeteroData): + return cls.heterogeneous + elif isinstance(data, (list, tuple)) and len(data) == 2 and isinstance(data[0], FeatureStore) and isinstance(data[1], GraphStore): + return cls.remote + + raise ValueError(f"Expected a 'Data', 'HeteroData', or a tuple of " + f"'FeatureStore' and 'GraphStore' " + f"(got '{type(data)}')") + + +class SubgraphType(Enum): + r"""The type of the returned subgraph.""" + directional = 'directional' + bidirectional = 'bidirectional' + induced = 'induced' + + +@dataclass(init=False) +class NodeSamplerInput: + r"""The sampling input of :meth:`~paddle_geometric.sampler.BaseSampler.sample_from_nodes`. + + Args: + input_id (paddle.Tensor, optional): The indices of the data loader input + of the current mini-batch. + node (paddle.Tensor): The indices of seed nodes to start sampling from. + time (paddle.Tensor, optional): The timestamp for the seed nodes. + (default: :obj:`None`) + input_type (str, optional): The input node type (in case of sampling in + a heterogeneous graph). (default: :obj:`None`) + """ + input_id: Optional[Tensor] + node: Tensor + time: Optional[Tensor] = None + input_type: Optional[str] = None + + def __init__( + self, + input_id: Optional[Tensor], + node: Tensor, + time: Optional[Tensor] = None, + input_type: Optional[str] = None, + ): + # Ensure tensors are on CPU + if input_id is not None: + input_id = input_id.cpu() + node = node.cpu() + if time is not None: + time = time.cpu() + + self.input_id = input_id + self.node = node + self.time = time + self.input_type = input_type + + def __getitem__(self, index: Union[Tensor, Any]) -> 'NodeSamplerInput': + if not isinstance(index, paddle.Tensor): + index = paddle.to_tensor(index, dtype='int64') + + return NodeSamplerInput( + self.input_id[index] if self.input_id is not None else index, + self.node[index], + self.time[index] if self.time is not None else None, + self.input_type, + ) + +@dataclass(init=False) +class EdgeSamplerInput: + r"""The sampling input of :meth:`~paddle_geometric.sampler.BaseSampler.sample_from_edges`. + + Args: + input_id (paddle.Tensor, optional): The indices of the data loader input + of the current mini-batch. + row (paddle.Tensor): The source node indices of seed links to start + sampling from. + col (paddle.Tensor): The destination node indices of seed links to start + sampling from. + label (paddle.Tensor, optional): The label for the seed links. + (default: :obj:`None`) + time (paddle.Tensor, optional): The timestamp for the seed links. + (default: :obj:`None`) + input_type (Tuple[str, str, str], optional): The input edge type (in + case of sampling in a heterogeneous graph). (default: :obj:`None`) + """ + input_id: Optional[Tensor] + row: Tensor + col: Tensor + label: Optional[Tensor] = None + time: Optional[Tensor] = None + input_type: Optional[Any] = None + + def __init__( + self, + input_id: Optional[Tensor], + row: Tensor, + col: Tensor, + label: Optional[Tensor] = None, + time: Optional[Tensor] = None, + input_type: Optional[Any] = None, + ): + # Ensure tensors are on CPU + if input_id is not None: + input_id = input_id.cpu() + row = row.clone().cpu() + col = col.clone().cpu() + if label is not None: + label = label.cpu() + if time is not None: + time = time.cpu() + + self.input_id = input_id + self.row = row + self.col = col + self.label = label + self.time = time + self.input_type = input_type + + def __getitem__(self, index: Union[Tensor, Any]) -> 'EdgeSamplerInput': + if not isinstance(index, Tensor): + index = paddle.to_tensor(index, dtype='int64') + + return EdgeSamplerInput( + self.input_id[index] if self.input_id is not None else index, + self.row[index], + self.col[index], + self.label[index] if self.label is not None else None, + self.time[index] if self.time is not None else None, + self.input_type, + ) + + +@dataclass +class SamplerOutput: + r"""The sampling output of a :class:`~paddle_geometric.sampler.BaseSampler` + on homogeneous graphs. + + Args: + node (paddle.Tensor): The sampled nodes in the original graph. + row (paddle.Tensor): The source node indices of the sampled subgraph. + Indices must be re-indexed to :obj:`{ 0, ..., num_nodes - 1 }` + corresponding to the nodes in the :obj:`node` tensor. + col (paddle.Tensor): The destination node indices of the sampled + subgraph. + Indices must be re-indexed to :obj:`{ 0, ..., num_nodes - 1 }` + corresponding to the nodes in the :obj:`node` tensor. + edge (paddle.Tensor, optional): The sampled edges in the original graph. + This tensor is used to obtain edge features from the original + graph. If no edge attributes are present, it may be omitted. + batch (paddle.Tensor, optional): The vector to identify the seed node + for each sampled node. Can be present in case of disjoint subgraph + sampling per seed node. (default: :obj:`None`) + num_sampled_nodes (List[int], optional): The number of sampled nodes + per hop. (default: :obj:`None`) + num_sampled_edges (List[int], optional): The number of sampled edges + per hop. (default: :obj:`None`) + orig_row (paddle.Tensor, optional): The original source node indices + returned by the sampler. + Filled in case :meth:`to_bidirectional` is called with the + :obj:`keep_orig_edges` option. (default: :obj:`None`) + orig_col (paddle.Tensor, optional): The original destination node + indices indices returned by the sampler. + Filled in case :meth:`to_bidirectional` is called with the + :obj:`keep_orig_edges` option. (default: :obj:`None`) + metadata: (Any, optional): Additional metadata information. + (default: :obj:`None`) + """ + node: Tensor + row: Tensor + col: Tensor + edge: Optional[Tensor] + batch: Optional[Tensor] = None + num_sampled_nodes: Optional[List[int]] = None + num_sampled_edges: Optional[List[int]] = None + orig_row: Optional[Tensor] = None + orig_col: Optional[Tensor] = None + metadata: Optional[Any] = None + + def to_bidirectional( + self, + keep_orig_edges: bool = False, + ) -> 'SamplerOutput': + r"""Converts the sampled subgraph into a bidirectional variant, in + which all sampled edges are guaranteed to be bidirectional. + + Args: + keep_orig_edges (bool, optional): If specified, directional edges + are still maintained. (default: :obj:`False`) + """ + out = copy.copy(self) + + if keep_orig_edges: + out.orig_row = self.row + out.orig_col = self.col + else: + out.num_sampled_nodes = out.num_sampled_edges = None + + # Assuming `to_bidirectional` is a function in the previous codebase + out.row, out.col, out.edge = to_bidirectional( + row=self.row, + col=self.col, + rev_row=self.row, + rev_col=self.col, + edge_id=self.edge, + rev_edge_id=self.edge, + ) + + return out + + +@dataclass +class HeteroSamplerOutput: + r"""The sampling output of a :class:`~paddle_geometric.sampler.BaseSampler` + on heterogeneous graphs. + + Args: + node (Dict[str, paddle.Tensor]): The sampled nodes in the original graph + for each node type. + row (Dict[Tuple[str, str, str], paddle.Tensor]): The source node indices + of the sampled subgraph for each edge type. + Indices must be re-indexed to :obj:`{ 0, ..., num_nodes - 1 }` + corresponding to the nodes in the :obj:`node` tensor of the source + node type. + col (Dict[Tuple[str, str, str], paddle.Tensor]): The destination node + indices of the sampled subgraph for each edge type. + Indices must be re-indexed to :obj:`{ 0, ..., num_nodes - 1 }` + corresponding to the nodes in the :obj:`node` tensor of the + destination node type. + edge (Dict[Tuple[str, str, str], paddle.Tensor], optional): The sampled + edges in the original graph for each edge type. + This tensor is used to obtain edge features from the original + graph. If no edge attributes are present, it may be omitted. + batch (Dict[str, paddle.Tensor], optional): The vector to identify the + seed node for each sampled node for each node type. Can be present + in case of disjoint subgraph sampling per seed node. + (default: :obj:`None`) + num_sampled_nodes (Dict[str, List[int]], optional): The number of + sampled nodes for each node type and each layer. + (default: :obj:`None`) + num_sampled_edges (Dict[EdgeType, List[int]], optional): The number of + sampled edges for each edge type and each layer. + (default: :obj:`None`) + orig_row (Dict[EdgeType, paddle.Tensor], optional): The original source + node indices returned by the sampler. + Filled in case :meth:`to_bidirectional` is called with the + :obj:`keep_orig_edges` option. (default: :obj:`None`) + orig_col (Dict[EdgeType, paddle.Tensor], optional): The original + destination node indices returned by the sampler. + Filled in case :meth:`to_bidirectional` is called with the + :obj:`keep_orig_edges` option. (default: :obj:`None`) + metadata: (Any, optional): Additional metadata information. + (default: :obj:`None`) + """ + node: Dict[NodeType, Tensor] + row: Dict[EdgeType, Tensor] + col: Dict[EdgeType, Tensor] + edge: Dict[EdgeType, OptTensor] + batch: Optional[Dict[NodeType, Tensor]] = None + num_sampled_nodes: Optional[Dict[NodeType, List[int]]] = None + num_sampled_edges: Optional[Dict[EdgeType, List[int]]] = None + orig_row: Optional[Dict[EdgeType, Tensor]] = None + orig_col: Optional[Dict[EdgeType, Tensor]] = None + metadata: Optional[Any] = None + + def to_bidirectional( + self, + keep_orig_edges: bool = False, + ) -> 'HeteroSamplerOutput': + r"""Converts the sampled subgraph into a bidirectional variant, in + which all sampled edges are guaranteed to be bidirectional. + + Args: + keep_orig_edges (bool, optional): If specified, directional edges + are still maintained. (default: :obj:`False`) + """ + out = copy.copy(self) + out.row = copy.copy(self.row) + out.col = copy.copy(self.col) + out.edge = copy.copy(self.edge) + + if keep_orig_edges: + out.orig_row = {} + out.orig_col = {} + for key in self.row.keys(): + out.orig_row[key] = self.row[key] + out.orig_col[key] = self.col[key] + else: + out.num_sampled_nodes = out.num_sampled_edges = None + + src_dst_dict = defaultdict(list) + edge_types = self.row.keys() + edge_types = [k for k in edge_types if not k[1].startswith('rev_')] + for edge_type in edge_types: + src, rel, dst = edge_type + rev_edge_type = (dst, f'rev_{rel}', src) + + if src == dst and rev_edge_type not in self.row: + out.row[edge_type], out.col[edge_type], _ = to_bidirectional( + row=self.row[edge_type], + col=self.col[edge_type], + rev_row=self.row[edge_type], + rev_col=self.col[edge_type], + ) + if out.edge is not None: + out.edge[edge_type] = None + + elif rev_edge_type in self.row: + out.row[edge_type], out.col[edge_type], _ = to_bidirectional( + row=self.row[edge_type], + col=self.col[edge_type], + rev_row=self.row[rev_edge_type], + rev_col=self.col[rev_edge_type], + ) + out.row[rev_edge_type] = out.col[edge_type] + out.col[rev_edge_type] = out.row[edge_type] + if out.edge is not None: + out.edge[edge_type] = None + out.edge[rev_edge_type] = None + + else: # Find the reverse edge type (if it is unique): + if len(src_dst_dict) == 0: # Create mapping lazily. + for key in self.row.keys(): + v1, _, v2 = key + src_dst_dict[(v1, v2)].append(key) + + if len(src_dst_dict[(dst, src)]) == 1: + rev_edge_type = src_dst_dict[(dst, src)][0] + row, col, _ = to_bidirectional( + row=self.row[edge_type], + col=self.col[edge_type], + rev_row=self.row[rev_edge_type], + rev_col=self.col[rev_edge_type], + ) + out.row[edge_type] = row + out.col[edge_type] = col + if out.edge is not None: + out.edge[edge_type] = None + + else: + warnings.warn(f"Cannot convert to bidirectional graph " + f"since the edge type {edge_type} does not " + f"seem to have a reverse edge type") + + return out + + +class NumNeighbors: + r"""The number of neighbors to sample in a homogeneous or heterogeneous + graph. In heterogeneous graphs, may also take in a dictionary denoting + the amount of neighbors to sample for individual edge types. + + Args: + values (List[int] or Dict[Tuple[str, str, str], List[int]]): The + number of neighbors to sample. + If an entry is set to :obj:`-1`, all neighbors will be included. + In heterogeneous graphs, may also take in a dictionary denoting + the amount of neighbors to sample for individual edge types. + default (List[int], optional): The default number of neighbors for edge + types not specified in :obj:`values`. (default: :obj:`None`) + """ + + def __init__( + self, + values: Union[List[int], Dict[Tuple[str, str, str], List[int]]], + default: Optional[List[int]] = None, + ): + if isinstance(values, (tuple, list)) and default is not None: + raise ValueError(f"'default' must be set to 'None' in case a " + f"single list is given as the number of " + f"neighbors (got '{type(default)}')") + + if isinstance(values, dict): + values = {tuple(key): value for key, value in values.items()} + + # Store values + self.values = values + self.default = default + + def _get_values( + self, + edge_types: Optional[List[Tuple[str, str, str]]] = None, + mapped: bool = False, + ) -> Union[List[int], Dict[Union[Tuple[str, str, str], str], List[int]]]: + if edge_types is not None: + if isinstance(self.values, (tuple, list)): + default = self.values + elif isinstance(self.values, dict): + default = self.default + else: + assert False + + out = {} + for edge_type in edge_types: + edge_type_str = tuple(edge_type) + if edge_type_str in self.values: + out[edge_type_str if mapped else edge_type] = self.values[edge_type_str] + else: + if default is None: + raise ValueError(f"Missing number of neighbors for " + f"edge type '{edge_type}'") + out[edge_type_str if mapped else edge_type] = default + + elif isinstance(self.values, dict) and not mapped: + out = {key: value for key, value in self.values.items()} + else: + out = copy.copy(self.values) + + if isinstance(out, dict): + num_hops = {len(v) for v in out.values()} + if len(num_hops) > 1: + raise ValueError(f"Number of hops must be the same across all " + f"edge types (got {len(num_hops)} different " + f"number of hops)") + + return out + + def get_values( + self, + edge_types: Optional[List[Tuple[str, str, str]]] = None, + ) -> Union[List[int], Dict[Tuple[str, str, str], List[int]]]: + if '_values' in self.__dict__: + return self.__dict__['_values'] + + values = self._get_values(edge_types, mapped=False) + self.__dict__['_values'] = values + return values + + def get_mapped_values( + self, + edge_types: Optional[List[Tuple[str, str, str]]] = None, + ) -> Union[List[int], Dict[str, List[int]]]: + if '_mapped_values' in self.__dict__: + return self.__dict__['_mapped_values'] + + values = self._get_values(edge_types, mapped=True) + self.__dict__['_mapped_values'] = values + return values + + @property + def num_hops(self) -> int: + if '_num_hops' in self.__dict__: + return self.__dict__['_num_hops'] + + if isinstance(self.values, (tuple, list)): + num_hops = max(len(self.values), len(self.default or [])) + else: # isinstance(self.values, dict): + num_hops = max([0] + [len(v) for v in self.values.values()]) + num_hops = max(num_hops, len(self.default or [])) + + self.__dict__['_num_hops'] = num_hops + return num_hops + + def __len__(self) -> int: + return self.num_hops + + +class NegativeSamplingMode(Enum): + # 'binary': Randomly sample negative edges in the graph. + binary = 'binary' + # 'triplet': Randomly sample negative destination nodes for each positive + # source node. + triplet = 'triplet' + + +@dataclass +class NegativeSampling: + r"""The negative sampling configuration of a + :class:`~paddle_geometric.sampler.BaseSampler` when calling + :meth:`~paddle_geometric.sampler.BaseSampler.sample_from_edges`. + + Args: + mode (str): The negative sampling mode + (:obj:`"binary"` or :obj:`"triplet"`). + If set to :obj:`"binary"`, will randomly sample negative links + from the graph. + If set to :obj:`"triplet"`, will randomly sample negative + destination nodes for each positive source node. + amount (int or float, optional): The ratio of sampled negative edges to + the number of positive edges. (default: :obj:`1`) + src_weight (Tensor, optional): A node-level vector determining + the sampling of source nodes. Does not necessarily need to sum up + to one. If not given, negative nodes will be sampled uniformly. + (default: :obj:`None`) + dst_weight (Tensor, optional): A node-level vector determining + the sampling of destination nodes. Does not necessarily need to sum + up to one. If not given, negative nodes will be sampled uniformly. + (default: :obj:`None`) + """ + mode: NegativeSamplingMode + amount: Union[int, float] = 1 + src_weight: Optional[Tensor] = None + dst_weight: Optional[Tensor] = None + + def __post_init__(self): + if self.amount <= 0: + raise ValueError(f"The attribute 'amount' needs to be positive " + f"for '{self.__class__.__name__}' " + f"(got {self.amount})") + + if self.is_triplet(): + if self.amount != math.ceil(self.amount): + raise ValueError(f"The attribute 'amount' needs to be an " + f"integer for '{self.__class__.__name__}' " + f"with 'triplet' negative sampling " + f"(got {self.amount}).") + self.amount = math.ceil(self.amount) + + def is_binary(self) -> bool: + return self.mode == NegativeSamplingMode.binary + + def is_triplet(self) -> bool: + return self.mode == NegativeSamplingMode.triplet + + def sample( + self, + num_samples: int, + endpoint: Literal['src', 'dst'], + num_nodes: Optional[int] = None, + ) -> Tensor: + r"""Generates :obj:`num_samples` negative samples.""" + weight = self.src_weight if endpoint == 'src' else self.dst_weight + + if weight is None: + if num_nodes is None: + raise ValueError( + f"Cannot sample negatives in '{self.__class__.__name__}' " + f"without passing the 'num_nodes' argument") + return paddle.randint(low=0, high=num_nodes, shape=(num_samples, )) + + if num_nodes is not None and weight.shape[0] != num_nodes: + raise ValueError( + f"The 'weight' attribute in '{self.__class__.__name__}' " + f"needs to match the number of nodes {num_nodes} " + f"(got {self.src_weight.shape[0]})") + return paddle.multinomial(weight, num_samples, replacement=True) + + +class BaseSampler: + r"""An abstract base class that initializes a graph sampler and provides + :meth:`sample_from_nodes` and :meth:`sample_from_edges` routines. + + .. note :: + + Any data stored in the sampler will be *replicated* across data loading + workers that use the sampler since each data loading worker holds its + own instance of a sampler. + As such, it is recommended to limit the amount of information stored in + the sampler. + """ + def sample_from_nodes( + self, + index: 'NodeSamplerInput', + **kwargs, + ) -> Union['HeteroSamplerOutput', 'SamplerOutput']: + r"""Performs sampling from the nodes specified in :obj:`index`, + returning a sampled subgraph in the specified output format. + + The :obj:`index` is a tuple holding the following information: + + 1. The example indices of the seed nodes + 2. The node indices to start sampling from + 3. The timestamps of the given seed nodes (optional) + + Args: + index (NodeSamplerInput): The node sampler input object. + **kwargs (optional): Additional keyword arguments. + """ + raise NotImplementedError + + def sample_from_edges( + self, + index: 'EdgeSamplerInput', + neg_sampling: Optional[NegativeSampling] = None, + ) -> Union['HeteroSamplerOutput', 'SamplerOutput']: + r"""Performs sampling from the edges specified in :obj:`index`, + returning a sampled subgraph in the specified output format. + + The :obj:`index` is a tuple holding the following information: + + 1. The example indices of the seed links + 2. The source node indices to start sampling from + 3. The destination node indices to start sampling from + 4. The labels of the seed links (optional) + 5. The timestamps of the given seed nodes (optional) + + Args: + index (EdgeSamplerInput): The edge sampler input object. + neg_sampling (NegativeSampling, optional): The negative sampling + configuration. (default: :obj:`None`) + """ + raise NotImplementedError + + @property + def edge_permutation(self) -> Union[None, Dict[str, None]]: + r"""If the sampler performs any modification of edge ordering in the + original graph, this function is expected to return the permutation + tensor that defines the permutation from the edges in the original + graph and the edges used in the sampler. If no such permutation was + applied, :obj:`None` is returned. For heterogeneous graphs, the + expected return type is a permutation tensor for each edge type. + """ + return None + diff --git a/jointContribution/mattergen/paddle_geometric/sampler/hgt_sampler.py b/jointContribution/mattergen/paddle_geometric/sampler/hgt_sampler.py new file mode 100644 index 00000000..6c668cc7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/sampler/hgt_sampler.py @@ -0,0 +1,81 @@ +from typing import Dict, List, Union + +import paddle + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.sampler import ( + BaseSampler, + HeteroSamplerOutput, + NodeSamplerInput, +) +from paddle_geometric.sampler.utils import remap_keys, to_hetero_csc +from paddle_geometric.typing import ( + WITH_PADDLE_SPARSE, + EdgeType, + NodeType, + OptTensor, +) + + +class HGTSampler(BaseSampler): + r"""An implementation of an in-memory heterogeneous layer-wise sampler + user by :class:`~paddle_geometric.loader.HGTLoader`. + """ + def __init__( + self, + data: HeteroData, + num_samples: Union[List[int], Dict[NodeType, List[int]]], + is_sorted: bool = False, + share_memory: bool = False, + ): + if not WITH_PADDLE_SPARSE: + raise ImportError( + f"'{self.__class__.__name__}' requires 'torch-sparse'") + + if isinstance(data, Data) or isinstance(data, tuple): + raise NotImplementedError( + f'{self.__class__.__name__} does not support a data object of ' + f'type {type(data)}.') + + if isinstance(num_samples, (list, tuple)): + num_samples = {key: num_samples for key in data.node_types} + + self.node_types, self.edge_types = data.metadata() + self.num_samples = num_samples + self.num_hops = max([len(v) for v in num_samples.values()]) + + # Conversion to/from C++ string type (see `NeighborSampler`): + self.to_rel_type = {k: '__'.join(k) for k in self.edge_types} + self.to_edge_type = {v: k for k, v in self.to_rel_type.items()} + + # Convert the graph data into a suitable format for sampling: + colptr_dict, row_dict, self.perm = to_hetero_csc( + data, device='cpu', share_memory=share_memory, is_sorted=is_sorted) + self.row_dict = remap_keys(row_dict, self.to_rel_type) + self.colptr_dict = remap_keys(colptr_dict, self.to_rel_type) + + def sample_from_nodes( + self, + inputs: NodeSamplerInput, + ) -> HeteroSamplerOutput: + + node, row, col, edge = paddle.ops.sparse.hgt_sample( + self.colptr_dict, + self.row_dict, + {inputs.input_type: inputs.node}, + self.num_samples, + self.num_hops, + ) + + return HeteroSamplerOutput( + node=node, + row=remap_keys(row, self.to_edge_type), + col=remap_keys(col, self.to_edge_type), + edge=remap_keys(edge, self.to_edge_type), + batch=None, + metadata=(inputs.input_id, inputs.time), + ) + + @property + def edge_permutation(self) -> Union[OptTensor, Dict[EdgeType, OptTensor]]: + return self.perm diff --git a/jointContribution/mattergen/paddle_geometric/sampler/neighbor_sampler.py b/jointContribution/mattergen/paddle_geometric/sampler/neighbor_sampler.py new file mode 100644 index 00000000..abc158ac --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/sampler/neighbor_sampler.py @@ -0,0 +1,807 @@ +import copy +import math +import sys +import warnings +from typing import Callable, Dict, List, Literal, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import ( + Data, + FeatureStore, + GraphStore, + HeteroData, + remote_backend_utils, +) +from paddle_geometric.data.graph_store import EdgeLayout +from paddle_geometric.sampler import ( + BaseSampler, + EdgeSamplerInput, + HeteroSamplerOutput, + NegativeSampling, + NodeSamplerInput, + SamplerOutput, +) +from paddle_geometric.sampler.base import DataType, NumNeighbors, SubgraphType +from paddle_geometric.sampler.utils import remap_keys, to_csc, to_hetero_csc +from paddle_geometric.typing import EdgeType, NodeType, OptTensor + +NumNeighborsType = Union[NumNeighbors, List[int], Dict[EdgeType, List[int]]] + + +class NeighborSampler(BaseSampler): + r"""An implementation of an in-memory (heterogeneous) neighbor sampler used + by :class:`~paddle_geometric.loader.NeighborLoader`. + """ + def __init__( + self, + data: Union[Data, HeteroData, Tuple[FeatureStore, GraphStore]], + num_neighbors: NumNeighborsType, + subgraph_type: Union[SubgraphType, str] = 'directional', + replace: bool = False, + disjoint: bool = False, + temporal_strategy: str = 'uniform', + time_attr: Optional[str] = None, + weight_attr: Optional[str] = None, + is_sorted: bool = False, + share_memory: bool = False, + # Deprecated: + directed: bool = True, + ): + if not directed: + subgraph_type = SubgraphType.induced + warnings.warn(f"The usage of the 'directed' argument in " + f"'{self.__class__.__name__}' is deprecated. Use " + f"`subgraph_type='induced'` instead.") + + if (not sys.platform.startswith('linux') and + subgraph_type != SubgraphType.induced): + warnings.warn(f"Using '{self.__class__.__name__}' without " + f"'subgraph_type=induced' on non-Linux systems may " + f"lead to degraded performance.") + + self.data_type = DataType.from_data(data) + + if self.data_type == DataType.homogeneous: + self.num_nodes = data.num_nodes + + self.node_time: Optional[Tensor] = None + self.edge_time: Optional[Tensor] = None + + if time_attr is not None: + if data.is_node_attr(time_attr): + self.node_time = data[time_attr] + elif data.is_edge_attr(time_attr): + self.edge_time = data[time_attr] + else: + raise ValueError( + f"The time attribute '{time_attr}' is neither a " + f"node-level or edge-level attribute") + + # Convert the graph data into CSC format for sampling: + self.colptr, self.row, self.perm = to_csc( + data, device='cpu', share_memory=share_memory, + is_sorted=is_sorted, src_node_time=self.node_time, + edge_time=self.edge_time) + + if self.edge_time is not None and self.perm is not None: + self.edge_time = paddle.index_select(self.edge_time, self.perm) + + self.edge_weight: Optional[Tensor] = None + if weight_attr is not None: + self.edge_weight = data[weight_attr] + if self.perm is not None: + self.edge_weight = paddle.index_select(self.edge_weight, self.perm) + + elif self.data_type == DataType.heterogeneous: + self.node_types, self.edge_types = data.metadata() + + self.num_nodes = {k: data[k].num_nodes for k in self.node_types} + + self.node_time: Optional[Dict[NodeType, Tensor]] = None + self.edge_time: Optional[Dict[EdgeType, Tensor]] = None + + if time_attr is not None: + is_node_level_time = is_edge_level_time = False + + for store in data.node_stores: + if time_attr in store: + is_node_level_time = True + for store in data.edge_stores: + if time_attr in store: + is_edge_level_time = True + + if is_node_level_time and is_edge_level_time: + raise ValueError( + f"The time attribute '{time_attr}' holds both " + f"node-level and edge-level information") + + if not is_node_level_time and not is_edge_level_time: + raise ValueError( + f"The time attribute '{time_attr}' is neither a " + f"node-level or edge-level attribute") + + if is_node_level_time: + self.node_time = data.collect(time_attr) + else: + self.edge_time = data.collect(time_attr) + + # Conversion to/from Python string type: + self.to_rel_type = {k: '__'.join(k) for k in self.edge_types} + self.to_edge_type = {v: k for k, v in self.to_rel_type.items()} + + # Convert the graph data into CSC format for sampling: + colptr_dict, row_dict, self.perm = to_hetero_csc( + data, device='cpu', share_memory=share_memory, + is_sorted=is_sorted, node_time_dict=self.node_time, + edge_time_dict=self.edge_time) + + self.row_dict = remap_keys(row_dict, self.to_rel_type) + self.colptr_dict = remap_keys(colptr_dict, self.to_rel_type) + + if self.edge_time is not None: + for edge_type, edge_time in self.edge_time.items(): + if self.perm.get(edge_type, None) is not None: + edge_time = paddle.index_select(edge_time, self.perm[edge_type]) + self.edge_time[edge_type] = edge_time + self.edge_time = remap_keys(self.edge_time, self.to_rel_type) + + self.edge_weight: Optional[Dict[EdgeType, Tensor]] = None + if weight_attr is not None: + self.edge_weight = data.collect(weight_attr) + for edge_type, edge_weight in self.edge_weight.items(): + if self.perm.get(edge_type, None) is not None: + edge_weight = paddle.index_select(edge_weight, self.perm[edge_type]) + self.edge_weight[edge_type] = edge_weight + self.edge_weight = remap_keys(self.edge_weight, self.to_rel_type) + + else: # self.data_type == DataType.remote + feature_store, graph_store = data + + # Obtain graph metadata: + attrs = [attr for attr in feature_store.get_all_tensor_attrs()] + + edge_attrs = graph_store.get_all_edge_attrs() + self.edge_types = list({attr.edge_type for attr in edge_attrs}) + + if weight_attr is not None: + raise NotImplementedError( + f"'weight_attr' argument not yet supported within " + f"'{self.__class__.__name__}' for " + f"'(FeatureStore, GraphStore)' inputs") + + if time_attr is not None: + # If the `time_attr` is present, we expect that `GraphStore` + # holds all edges sorted by destination, and within local + # neighborhoods, node indices should be sorted by time. + for edge_attr in edge_attrs: + if edge_attr.layout == EdgeLayout.CSR: + raise ValueError( + "Temporal sampling requires that edges are stored " + "in either COO or CSC layout") + if not edge_attr.is_sorted: + raise ValueError( + "Temporal sampling requires that edges are " + "sorted by destination, and by source time " + "within local neighborhoods") + + # We obtain all features with `node_attr.name=time_attr`: + time_attrs = [ + copy.copy(attr) for attr in attrs + if attr.attr_name == time_attr + ] + if not self.is_hetero: + self.node_types = [None] + self.num_nodes = max(edge_attrs[0].size) + self.edge_weight: Optional[Tensor] = None + + self.node_time: Optional[Tensor] = None + self.edge_time: Optional[Tensor] = None + + if time_attr is not None: + if len(time_attrs) != 1: + raise ValueError("Temporal sampling specified but did " + "not find any temporal data") + time_attrs[0].index = None # Reset index for full data. + time_tensor = feature_store.get_tensor(time_attrs[0]) + # Currently, we determine whether to use node-level or + # edge-level temporal sampling based on the attribute name. + if time_attr == 'time': + self.node_time = time_tensor + else: + self.edge_time = time_tensor + + self.row, self.colptr, self.perm = graph_store.csc() + + else: + node_types = [ + attr.group_name for attr in attrs + if isinstance(attr.group_name, str) + ] + self.node_types = list(set(node_types)) + self.num_nodes = { + node_type: remote_backend_utils.size(*data, node_type) + for node_type in self.node_types + } + self.edge_weight: Optional[Dict[EdgeType, Tensor]] = None + + self.node_time: Optional[Dict[NodeType, Tensor]] = None + self.edge_time: Optional[Dict[EdgeType, Tensor]] = None + + if time_attr is not None: + for attr in time_attrs: # Reset index for full data. + attr.index = None + + time_tensors = feature_store.multi_get_tensor(time_attrs) + time = { + attr.group_name: time_tensor + for attr, time_tensor in zip(time_attrs, time_tensors) + } + + group_names = [attr.group_name for attr in time_attrs] + if all([isinstance(g, str) for g in group_names]): + self.node_time = time + elif all([isinstance(g, tuple) for g in group_names]): + self.edge_time = time + else: + raise ValueError( + f"Found time attribute '{time_attr}' for both " + f"node-level and edge-level types") + + # Conversion to/from C++ string type (see above): + self.to_rel_type = {k: '__'.join(k) for k in self.edge_types} + self.to_edge_type = {v: k for k, v in self.to_rel_type.items()} + # Convert the graph data into CSC format for sampling: + row_dict, colptr_dict, self.perm = graph_store.csc() + self.row_dict = remap_keys(row_dict, self.to_rel_type) + self.colptr_dict = remap_keys(colptr_dict, self.to_rel_type) + + if (self.edge_time is not None + and not paddle_geometric.typing.WITH_EDGE_TIME_NEIGHBOR_SAMPLE): + raise ImportError("Edge-level temporal sampling requires a " + "more recent 'pgl-lib' installation") + + if (self.edge_weight is not None + and not paddle_geometric.typing.WITH_WEIGHTED_NEIGHBOR_SAMPLE): + raise ImportError("Weighted neighbor sampling requires " + "'pgl-lib>=0.3.0'") + + self.num_neighbors = num_neighbors + self.replace = replace + self.subgraph_type = SubgraphType(subgraph_type) + self.disjoint = disjoint + self.temporal_strategy = temporal_strategy + + @property + def num_neighbors(self) -> NumNeighbors: + return self._num_neighbors + + @num_neighbors.setter + def num_neighbors(self, num_neighbors: NumNeighborsType): + if isinstance(num_neighbors, NumNeighbors): + self._num_neighbors = num_neighbors + else: + self._num_neighbors = NumNeighbors(num_neighbors) + + @property + def is_hetero(self) -> bool: + if self.data_type == DataType.homogeneous: + return False + if self.data_type == DataType.heterogeneous: + return True + + # self.data_type == DataType.remote + return self.edge_types != [None] + + @property + def is_temporal(self) -> bool: + return self.node_time is not None or self.edge_time is not None + + @property + def disjoint(self) -> bool: + return self._disjoint or self.is_temporal + + @disjoint.setter + def disjoint(self, disjoint: bool): + self._disjoint = disjoint + + # Node-based sampling ##################################################### + + def sample_from_nodes( + self, + inputs: NodeSamplerInput, + ) -> Union[SamplerOutput, HeteroSamplerOutput]: + out = node_sample(inputs, self._sample) + if self.subgraph_type == SubgraphType.bidirectional: + out = out.to_bidirectional() + return out + + # Edge-based sampling ##################################################### + + def sample_from_edges( + self, + inputs: EdgeSamplerInput, + neg_sampling: Optional[NegativeSampling] = None, + ) -> Union[SamplerOutput, HeteroSamplerOutput]: + out = edge_sample(inputs, self._sample, self.num_nodes, self.disjoint, + self.node_time, neg_sampling) + if self.subgraph_type == SubgraphType.bidirectional: + out = out.to_bidirectional() + return out + + # Other Utilities ######################################################### + + @property + def edge_permutation(self) -> Union[OptTensor, Dict[EdgeType, OptTensor]]: + return self.perm + + # Helper functions ######################################################## + def _sample( + self, + seed: Union[paddle.Tensor, Dict[NodeType, paddle.Tensor]], + seed_time: Optional[Union[paddle.Tensor, Dict[NodeType, paddle.Tensor]]] = None, + **kwargs, + ) -> Union[SamplerOutput, HeteroSamplerOutput]: + r"""Implements neighbor sampling by calling either :obj:`pgl-lib` (if + installed) or Paddle's built-in sampling routines. + """ + if isinstance(seed, dict): # Heterogeneous sampling: + # TODO Support induced subgraph sampling in `pgl-lib`. + if (paddle_geometric.typing.WITH_PGL_LIB + and self.subgraph_type != SubgraphType.induced): + # TODO Ensure `seed` inherits dtype from `colptr` + colptrs = list(self.colptr_dict.values()) + dtype = colptrs[0].dtype if len(colptrs) > 0 else paddle.int64 + seed = {k: v.astype(dtype) for k, v in seed.items()} + + args = ( + self.node_types, + self.edge_types, + self.colptr_dict, + self.row_dict, + seed, + self.num_neighbors.get_mapped_values(self.edge_types), + self.node_time, + ) + if paddle_geometric.typing.WITH_EDGE_TIME_NEIGHBOR_SAMPLE: + args += (self.edge_time, ) + args += (seed_time, ) + if paddle_geometric.typing.WITH_WEIGHTED_NEIGHBOR_SAMPLE: + args += (self.edge_weight, ) + args += ( + True, # csc + self.replace, + self.subgraph_type != SubgraphType.induced, + self.disjoint, + self.temporal_strategy, + # TODO Ensure `return_edge_id` if edge features present + True, # return_edge_id + ) + + out = paddle.ops.pgl.hetero_neighbor_sample(*args) + row, col, node, edge, batch = out[:4] + (None, ) + + # `pgl-lib>0.1.0` returns sampled number of nodes/edges: + num_sampled_nodes = num_sampled_edges = None + if len(out) >= 6: + num_sampled_nodes, num_sampled_edges = out[4:6] + + if self.disjoint: + node = {k: v.transpose([1, 0]).contiguous() for k, v in node.items()} + batch = {k: v[0] for k, v in node.items()} + node = {k: v[1] for k, v in node.items()} + + elif paddle_geometric.typing.WITH_PADDLE_SPARSE: + if self.disjoint: + if self.subgraph_type == SubgraphType.induced: + raise ValueError("'disjoint' sampling not supported " + "for neighbor sampling with " + "`subgraph_type='induced'`") + else: + raise ValueError("'disjoint' sampling not supported " + "for neighbor sampling via " + "'paddle-sparse'. Please install " + "'pgl-lib' for improved and " + "optimized sampling routines.") + + out = paddle.ops.paddle_sparse.hetero_neighbor_sample( + self.node_types, + self.edge_types, + self.colptr_dict, + self.row_dict, + seed, # seed_dict + self.num_neighbors.get_mapped_values(self.edge_types), + self.num_neighbors.num_hops, + self.replace, + self.subgraph_type != SubgraphType.induced, + ) + node, row, col, edge, batch = out + (None, ) + num_sampled_nodes = num_sampled_edges = None + + else: + raise ImportError(f"'{self.__class__.__name__}' requires " + f"either 'pgl-lib' or 'paddle-sparse'") + + if num_sampled_edges is not None: + num_sampled_edges = remap_keys( + num_sampled_edges, + self.to_edge_type, + ) + + return HeteroSamplerOutput( + node=node, + row=remap_keys(row, self.to_edge_type), + col=remap_keys(col, self.to_edge_type), + edge=remap_keys(edge, self.to_edge_type), + batch=batch, + num_sampled_nodes=num_sampled_nodes, + num_sampled_edges=num_sampled_edges, + ) + else: # Homogeneous sampling: + # TODO Support induced subgraph sampling in `pgl-lib`. + if (paddle_geometric.typing.WITH_PGL_LIB + and self.subgraph_type != SubgraphType.induced): + + args = ( + self.colptr, + self.row, + # TODO Ensure `seed` inherits dtype from `colptr` + seed.astype(self.colptr.dtype), + self.num_neighbors.get_mapped_values(), + self.node_time, + ) + if paddle_geometric.typing.WITH_EDGE_TIME_NEIGHBOR_SAMPLE: + args += (self.edge_time, ) + args += (seed_time, ) + if paddle_geometric.typing.WITH_WEIGHTED_NEIGHBOR_SAMPLE: + args += (self.edge_weight, ) + args += ( + True, # csc + self.replace, + self.subgraph_type != SubgraphType.induced, + self.disjoint, + self.temporal_strategy, + # TODO Ensure `return_edge_id` if edge features present + True, # return_edge_id + ) + + out = paddle.ops.pgl.neighbor_sample(*args) + row, col, node, edge, batch = out[:4] + (None, ) + + # `pgl-lib>0.1.0` returns sampled number of nodes/edges: + num_sampled_nodes = num_sampled_edges = None + if len(out) >= 6: + num_sampled_nodes, num_sampled_edges = out[4:6] + + if self.disjoint: + batch, node = node.transpose([1, 0]).contiguous() + + elif paddle_geometric.typing.WITH_PADDLE_SPARSE: + if self.disjoint: + raise ValueError("'disjoint' sampling not supported for " + "neighbor sampling via 'paddle-sparse'. " + "Please install 'pgl-lib' for improved " + "and optimized sampling routines.") + + out = paddle.ops.paddle_sparse.neighbor_sample( + self.colptr, + self.row, + seed, # seed + self.num_neighbors.get_mapped_values(), + self.replace, + self.subgraph_type != SubgraphType.induced, + ) + node, row, col, edge, batch = out + (None, ) + num_sampled_nodes = num_sampled_edges = None + + else: + raise ImportError(f"'{self.__class__.__name__}' requires " + f"either 'pgl-lib' or 'paddle-sparse'") + + return SamplerOutput( + node=node, + row=row, + col=col, + edge=edge, + batch=batch, + num_sampled_nodes=num_sampled_nodes, + num_sampled_edges=num_sampled_edges, + ) + +# Sampling Utilities ########################################################## +def node_sample( + inputs: NodeSamplerInput, + sample_fn: Callable, +) -> Union[SamplerOutput, HeteroSamplerOutput]: + r"""Performs sampling from a :class:`NodeSamplerInput`, leveraging a + sampling function that accepts a seed and (optionally) a seed time as + input. Returns the output of this sampling procedure. + """ + if inputs.input_type is not None: # Heterogeneous sampling: + seed = {inputs.input_type: inputs.node} + seed_time = None + if inputs.time is not None: + seed_time = {inputs.input_type: inputs.time} + else: # Homogeneous sampling: + seed = inputs.node + seed_time = inputs.time + + out = sample_fn(seed, seed_time) + out.metadata = (inputs.input_id, inputs.time) + + return out + + +def edge_sample( + inputs: EdgeSamplerInput, + sample_fn: Callable, + num_nodes: Union[int, Dict[NodeType, int]], + disjoint: bool, + node_time: Optional[Union[paddle.Tensor, Dict[str, paddle.Tensor]]] = None, + neg_sampling: Optional[NegativeSampling] = None, +) -> Union[SamplerOutput, HeteroSamplerOutput]: + r"""Performs sampling from an edge sampler input, leveraging a sampling + function of the same signature as `node_sample`. + """ + input_id = inputs.input_id + src = inputs.row + dst = inputs.col + edge_label = inputs.label + edge_label_time = inputs.time + input_type = inputs.input_type + + src_time = dst_time = edge_label_time + assert edge_label_time is None or disjoint + + assert isinstance(num_nodes, (dict, int)) + if not isinstance(num_nodes, dict): + num_src_nodes = num_dst_nodes = num_nodes + else: + num_src_nodes = num_nodes[input_type[0]] + num_dst_nodes = num_nodes[input_type[-1]] + + num_pos = src.shape[0] + num_neg = 0 + + # Negative Sampling ####################################################### + + if neg_sampling is not None: + # When we are doing negative sampling, we append negative information + # of nodes/edges to `src`, `dst`, `src_time`, `dst_time`. + # Later on, we can easily reconstruct what belongs to positive and + # negative examples by slicing via `num_pos`. + num_neg = math.ceil(num_pos * neg_sampling.amount) + + if neg_sampling.is_binary(): + # In the "binary" case, we randomly sample negative pairs of nodes. + if isinstance(node_time, dict): + src_node_time = node_time.get(input_type[0]) + else: + src_node_time = node_time + + src_neg = neg_sample(src, neg_sampling, num_src_nodes, src_time, + src_node_time, endpoint='src') + src = paddle.concat([src, src_neg], axis=0) + + if isinstance(node_time, dict): + dst_node_time = node_time.get(input_type[-1]) + else: + dst_node_time = node_time + + dst_neg = neg_sample(dst, neg_sampling, num_dst_nodes, dst_time, + dst_node_time, endpoint='dst') + dst = paddle.concat([dst, dst_neg], axis=0) + + if edge_label is None: + edge_label = paddle.ones([num_pos], dtype=paddle.int64) + size = [num_neg] + list(edge_label.shape[1:]) + edge_neg_label = paddle.zeros(size, dtype=edge_label.dtype) + edge_label = paddle.concat([edge_label, edge_neg_label]) + + if edge_label_time is not None: + src_time = dst_time = edge_label_time.tile( + [1 + math.ceil(neg_sampling.amount)])[:num_pos + num_neg] + + elif neg_sampling.is_triplet(): + # In the "triplet" case, we randomly sample negative destinations. + if isinstance(node_time, dict): + dst_node_time = node_time.get(input_type[-1]) + else: + dst_node_time = node_time + + dst_neg = neg_sample(dst, neg_sampling, num_dst_nodes, dst_time, + dst_node_time, endpoint='dst') + dst = paddle.concat([dst, dst_neg], axis=0) + + assert edge_label is None + + if edge_label_time is not None: + dst_time = edge_label_time.tile([1 + neg_sampling.amount]) + + # Heterogeneous Neighborhood Sampling ##################################### + + if input_type is not None: + seed_time_dict = None + if input_type[0] != input_type[-1]: # Two distinct node types: + + if not disjoint: + src, inverse_src = paddle.unique(src, return_inverse=True) + dst, inverse_dst = paddle.unique(dst, return_inverse=True) + + seed_dict = {input_type[0]: src, input_type[-1]: dst} + + if edge_label_time is not None: # Always disjoint. + seed_time_dict = { + input_type[0]: src_time, + input_type[-1]: dst_time, + } + + else: # Only a single node type: Merge both source and destination. + + seed = paddle.concat([src, dst], axis=0) + + if not disjoint: + seed, inverse_seed = paddle.unique(seed, return_inverse=True) + + seed_dict = {input_type[0]: seed} + + if edge_label_time is not None: # Always disjoint. + seed_time_dict = { + input_type[0]: paddle.concat([src_time, dst_time], axis=0), + } + + out = sample_fn(seed_dict, seed_time_dict) + + # Enhance `out` by label information ################################## + if disjoint: + for key, batch in out.batch.items(): + out.batch[key] = batch % num_pos + + if neg_sampling is None or neg_sampling.is_binary(): + if disjoint: + if input_type[0] != input_type[-1]: + edge_label_index = paddle.arange(num_pos + num_neg) + edge_label_index = edge_label_index.tile([2]).reshape([2, -1]) + else: + edge_label_index = paddle.arange(2 * (num_pos + num_neg)) + edge_label_index = edge_label_index.reshape([2, -1]) + else: + if input_type[0] != input_type[-1]: + edge_label_index = paddle.stack([ + inverse_src, + inverse_dst, + ], axis=0) + else: + edge_label_index = inverse_seed.reshape([2, -1]) + + out.metadata = (input_id, edge_label_index, edge_label, src_time) + + elif neg_sampling.is_triplet(): + if disjoint: + src_index = paddle.arange(num_pos) + if input_type[0] != input_type[-1]: + dst_pos_index = paddle.arange(num_pos) + dst_neg_index = paddle.arange( + num_pos, seed_dict[input_type[-1]].shape[0]) + dst_neg_index = dst_neg_index.reshape([-1, num_pos]).t() + else: + dst_pos_index = paddle.arange(num_pos, 2 * num_pos) + dst_neg_index = paddle.arange( + 2 * num_pos, seed_dict[input_type[-1]].shape[0]) + dst_neg_index = dst_neg_index.reshape([-1, num_pos]).t() + else: + if input_type[0] != input_type[-1]: + src_index = inverse_src + dst_pos_index = inverse_dst[:num_pos] + dst_neg_index = inverse_dst[num_pos:] + else: + src_index = inverse_seed[:num_pos] + dst_pos_index = inverse_seed[num_pos:2 * num_pos] + dst_neg_index = inverse_seed[2 * num_pos:] + + dst_neg_index = dst_neg_index.reshape([num_pos, -1]).squeeze(-1) + + out.metadata = ( + input_id, + src_index, + dst_pos_index, + dst_neg_index, + src_time, + ) + + # Homogeneous Neighborhood Sampling ####################################### + else: + + seed = paddle.concat([src, dst], axis=0) + seed_time = None + + if not disjoint: + seed, inverse_seed = paddle.unique(seed, return_inverse=True) + + if edge_label_time is not None: # Always disjoint. + seed_time = paddle.concat([src_time, dst_time]) + + out = sample_fn(seed, seed_time) + + # Enhance `out` by label information ################################## + if neg_sampling is None or neg_sampling.is_binary(): + if disjoint: + out.batch = out.batch % num_pos + edge_label_index = paddle.arange(seed.shape[0]).reshape([2, -1]) + else: + edge_label_index = inverse_seed.reshape([2, -1]) + + out.metadata = (input_id, edge_label_index, edge_label, src_time) + + elif neg_sampling.is_triplet(): + if disjoint: + out.batch = out.batch % num_pos + src_index = paddle.arange(num_pos) + dst_pos_index = paddle.arange(num_pos, 2 * num_pos) + # `dst_neg_index` needs to be offset such that indices with + # offset `num_pos` belong to the same triplet: + dst_neg_index = paddle.arange(2 * num_pos, seed.shape[0]) + dst_neg_index = dst_neg_index.reshape([-1, num_pos]).t() + else: + src_index = inverse_seed[:num_pos] + dst_pos_index = inverse_seed[num_pos:2 * num_pos] + dst_neg_index = inverse_seed[2 * num_pos:] + dst_neg_index = dst_neg_index.reshape([num_pos, -1]).squeeze(-1) + + out.metadata = ( + input_id, + src_index, + dst_pos_index, + dst_neg_index, + src_time, + ) + + return out + +def neg_sample( + seed: paddle.Tensor, + neg_sampling: NegativeSampling, + num_nodes: int, + seed_time: Optional[paddle.Tensor], + node_time: Optional[paddle.Tensor], + endpoint: Literal['src', 'dst'], +) -> paddle.Tensor: + num_neg = math.ceil(seed.shape[0] * neg_sampling.amount) + + # TODO: Do not sample false negatives. + if node_time is None: + return neg_sampling.sample(num_neg, endpoint, num_nodes) + + # If we are in a temporal-sampling scenario, we need to respect the + # timestamp of the given nodes we can use as negative examples. + # That is, we can only sample nodes for which `node_time <= seed_time`. + # For now, we use a greedy algorithm which randomly samples negative + # nodes and discard any which do not respect the temporal constraint. + # We iteratively repeat this process until we have sampled a valid node for + # each seed. + # TODO See if this greedy algorithm here can be improved. + assert seed_time is not None + num_samples = math.ceil(neg_sampling.amount) + seed_time = paddle.expand(seed_time.reshape([1, -1]), [num_samples, -1]) + + out = neg_sampling.sample(num_samples * seed.shape[0], endpoint, num_nodes) + out = out.reshape([num_samples, seed.shape[0]]) + mask = paddle.greater(node_time[out], seed_time) # holds all invalid samples. + neg_sampling_complete = False + + for _ in range(5): # Retry sampling to resolve invalid samples + num_invalid = int(mask.sum()) + if num_invalid == 0: + neg_sampling_complete = True + break + + # Greedily search for alternative negatives. + tmp = neg_sampling.sample(num_invalid, endpoint, num_nodes) + out = paddle.where(mask, tmp, out) + mask = paddle.greater(node_time[tmp], seed_time[mask]) + + if not neg_sampling_complete: # Fallback: Use node with minimum timestamp + out = paddle.where(mask, paddle.argmin(node_time), out) + + return out.flatten()[:num_neg] diff --git a/jointContribution/mattergen/paddle_geometric/sampler/utils.py b/jointContribution/mattergen/paddle_geometric/sampler/utils.py new file mode 100644 index 00000000..163cfe41 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/sampler/utils.py @@ -0,0 +1,159 @@ +from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union + +import paddle + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.storage import EdgeStorage +from paddle_geometric.index import index2ptr +from paddle_geometric.typing import EdgeType, NodeType, OptTensor +from paddle_geometric.utils import coalesce, index_sort, lexsort + + +# Edge Layout Conversion ###################################################### + +def sort_csc( + row: paddle.Tensor, + col: paddle.Tensor, + src_node_time: OptTensor = None, + edge_time: OptTensor = None, +) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + + if src_node_time is None and edge_time is None: + col, perm = index_sort(col) + return row[perm], col, perm + + elif edge_time is not None: + assert src_node_time is None + perm = lexsort([edge_time, col]) + return row[perm], col[perm], perm + + else: # src_node_time is not None + perm = lexsort([src_node_time[row], col]) + return row[perm], col[perm], perm + + +def to_csc( + data: Union[Data, EdgeStorage], + device: Optional[str] = None, + share_memory: bool = False, + is_sorted: bool = False, + src_node_time: Optional[paddle.Tensor] = None, + edge_time: Optional[paddle.Tensor] = None, +) -> Tuple[paddle.Tensor, paddle.Tensor, OptTensor]: + # Convert the graph data into a suitable format for sampling (CSC format). + # Returns the `colptr` and `row` indices of the graph, as well as an + # `perm` vector that denotes the permutation of edges. + # Since no permutation of edges is applied when using `SparseTensor`, + # `perm` can be of type `None`. + perm: Optional[paddle.Tensor] = None + + if hasattr(data, 'adj'): + if src_node_time is not None: + raise NotImplementedError("Temporal sampling via 'SparseTensor' " + "format not yet supported") + colptr, row, _ = data.adj.csc() + + elif hasattr(data, 'adj_t'): + if src_node_time is not None: + # TODO (matthias) This only works when instantiating a + # `SparseTensor` with `is_sorted=True`. Otherwise, the + # `SparseTensor` will by default re-sort the neighbors according to + # column index. + # As such, we probably want to consider re-adding error: + # raise NotImplementedError("Temporal sampling via 'SparseTensor' " + # "format not yet supported") + pass + colptr, row, _ = data.adj_t.csr() + + elif data.edge_index is not None: + row, col = data.edge_index + if not is_sorted: + row, col, perm = sort_csc(row, col, src_node_time, edge_time) + colptr = index2ptr(col, data.size(1)) + else: + row = paddle.empty([0], dtype=paddle.int64, device=device) + colptr = paddle.zeros([data.num_nodes + 1], dtype=paddle.int64, device=device) + + colptr = colptr.to(device) + row = row.to(device) + perm = perm.to(device) if perm is not None else None + + if not colptr.is_cuda and share_memory: + colptr.share_memory_() + row.share_memory_() + if perm is not None: + perm.share_memory_() + + return colptr, row, perm + + +def to_hetero_csc( + data: HeteroData, + device: Optional[str] = None, + share_memory: bool = False, + is_sorted: bool = False, + node_time_dict: Optional[Dict[NodeType, paddle.Tensor]] = None, + edge_time_dict: Optional[Dict[EdgeType, paddle.Tensor]] = None, +) -> Tuple[Dict[str, paddle.Tensor], Dict[str, paddle.Tensor], Dict[str, OptTensor]]: + # Convert the heterogeneous graph data into a suitable format for sampling + # (CSC format). + # Returns dictionaries holding `colptr` and `row` indices as well as edge + # permutations for each edge type, respectively. + colptr_dict, row_dict, perm_dict = {}, {}, {} + + for edge_type, store in data.edge_items(): + src_node_time = (node_time_dict or {}).get(edge_type[0], None) + edge_time = (edge_time_dict or {}).get(edge_type, None) + out = to_csc(store, device, share_memory, is_sorted, src_node_time, + edge_time) + colptr_dict[edge_type], row_dict[edge_type], perm_dict[edge_type] = out + + return colptr_dict, row_dict, perm_dict + + +def to_bidirectional( + row: paddle.Tensor, + col: paddle.Tensor, + rev_row: paddle.Tensor, + rev_col: paddle.Tensor, + edge_id: OptTensor = None, + rev_edge_id: OptTensor = None, +) -> Tuple[paddle.Tensor, paddle.Tensor, OptTensor]: + + assert row.numel() == col.numel() + assert rev_row.numel() == rev_col.numel() + + edge_index = row.new_empty([2, row.numel() + rev_row.numel()]) + edge_index[0, :row.numel()] = row + edge_index[1, :row.numel()] = col + edge_index[0, row.numel():] = rev_col + edge_index[1, row.numel():] = rev_row + + if edge_id is not None: + edge_id = paddle.concat([edge_id, rev_edge_id], axis=0) + + (row, col), edge_id = coalesce( + edge_index, + edge_id, + sort_by_row=False, + reduce='any', + ) + + return row, col, edge_id + + +############################################################################### + +X, Y = TypeVar('X'), TypeVar('Y') + + +def remap_keys( + inputs: Dict[X, Any], + mapping: Dict[X, Y], + exclude: Optional[List[X]] = None, +) -> Dict[Union[X, Y], Any]: + exclude = exclude or [] + return { + k if k in exclude else mapping.get(k, k): v + for k, v in inputs.items() + } diff --git a/jointContribution/mattergen/paddle_geometric/seed.py b/jointContribution/mattergen/paddle_geometric/seed.py new file mode 100644 index 00000000..8097232c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/seed.py @@ -0,0 +1,16 @@ +import random + +import numpy as np +import paddle + + +def seed_everything(seed: int) -> None: + r"""Sets the seed for generating random numbers in :paddle:`PaddlePaddle`, + :obj:`numpy` and :python:`Python`. + + Args: + seed (int): The desired seed. + """ + random.seed(seed) + np.random.seed(seed) + paddle.seed(seed) diff --git a/jointContribution/mattergen/paddle_geometric/template.py b/jointContribution/mattergen/paddle_geometric/template.py new file mode 100644 index 00000000..ced6b8e9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/template.py @@ -0,0 +1,39 @@ +import importlib +import os.path as osp +import sys +import tempfile +from typing import Any + +from jinja2 import Environment, FileSystemLoader + + +def module_from_template( + module_name: str, + template_path: str, + tmp_dirname: str, + **kwargs: Any, +) -> Any: + + if module_name in sys.modules: # If module is already loaded, return it: + return sys.modules[module_name] + + env = Environment(loader=FileSystemLoader(osp.dirname(template_path))) + template = env.get_template(osp.basename(template_path)) + module_repr = template.render(**kwargs) + + with tempfile.NamedTemporaryFile( + mode='w', + prefix=f'{module_name}_', + suffix='.py', + delete=False, + ) as tmp: + tmp.write(module_repr) + tmp.flush() + + spec = importlib.util.spec_from_file_location(module_name, tmp.name) + assert spec is not None + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + assert spec.loader is not None + spec.loader.exec_module(module) + return module diff --git a/jointContribution/mattergen/paddle_geometric/testing/__init__.py b/jointContribution/mattergen/paddle_geometric/testing/__init__.py new file mode 100644 index 00000000..acf3d581 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/__init__.py @@ -0,0 +1,64 @@ +r"""Testing package. + +This package provides helper methods and decorators to ease testing. +""" + +from .decorators import ( + is_full_test, + onlyFullTest, + is_distributed_test, + onlyDistributedTest, + onlyLinux, + noWindows, + noMac, + minPython, + onlyCUDA, + onlyXPU, + onlyOnline, + onlyGraphviz, + onlyNeighborSampler, + has_package, + withPackage, + withDevice, + withCUDA, + withMETIS, + disableExtensions, + withoutExtensions, +) +from .asserts import assert_module +from .feature_store import MyFeatureStore +from .graph_store import MyGraphStore +from .data import ( + get_random_edge_index, + get_random_tensor_frame, + FakeHeteroDataset, +) + +__all__ = [ + 'is_full_test', + 'onlyFullTest', + 'is_distributed_test', + 'onlyDistributedTest', + 'onlyLinux', + 'noWindows', + 'noMac', + 'minPython', + 'onlyCUDA', + 'onlyXPU', + 'onlyOnline', + 'onlyGraphviz', + 'onlyNeighborSampler', + 'has_package', + 'withPackage', + 'withDevice', + 'withCUDA', + 'withMETIS', + 'disableExtensions', + 'withoutExtensions', + 'assert_module', + 'MyFeatureStore', + 'MyGraphStore', + 'get_random_edge_index', + 'get_random_tensor_frame', + 'FakeHeteroDataset', +] diff --git a/jointContribution/mattergen/paddle_geometric/testing/asserts.py b/jointContribution/mattergen/paddle_geometric/testing/asserts.py new file mode 100644 index 00000000..b8115308 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/asserts.py @@ -0,0 +1,124 @@ +import copy +import warnings +from typing import Any, List, Optional, Tuple, Union + +import paddle + +from paddle_geometric.typing import WITH_PADDLE_SPARSE, SparseTensor +from paddle_geometric.utils import to_paddle_coo_tensor, to_paddle_csc_tensor + + +# SPARSE_LAYOUTS: List[Union[str, paddle.layout]] = [ +# 'paddle_sparse', paddle.sparse_csc, paddle.sparse_coo +# ] +SPARSE_LAYOUTS: List[Union[str, NotImplementedError]] = [ + 'paddle_sparse', + NotImplementedError("paddle.sparse_csc is not implemented in Paddle."), + NotImplementedError("paddle.sparse_coo is not implemented in Paddle."), +] + +def assert_module( + module: paddle.nn.Layer, + x: Any, + edge_index: paddle.Tensor, + *, + expected_size: Tuple[int, ...], + test_edge_permutation: bool = True, + test_node_permutation: bool = False, + test_sparse_layouts: Optional[List[Union[str, NotImplementedError]]] = None, + sparse_size: Optional[Tuple[int, int]] = None, + atol: float = 1e-08, + rtol: float = 1e-05, + equal_nan: bool = False, + **kwargs: Any, +) -> Any: + r"""Asserts that the output of a :obj:`module` is correct. + + Specifically, this method tests that: + + 1. The module output has the correct shape. + 2. The module is invariant to the permutation of edges. + 3. The module is invariant to the permutation of nodes. + 4. The module is invariant to the layout of :obj:`edge_index`. + + Args: + module (paddle.nn.Layer): The module to test. + x (Any): The input features to the module. + edge_index (paddle.Tensor): The input edge indices. + expected_size (Tuple[int, ...]): The expected output size. + test_edge_permutation (bool, optional): If set to :obj:`False`, will + not test the module for edge permutation invariance. + test_node_permutation (bool, optional): If set to :obj:`False`, will + not test the module for node permutation invariance. + test_sparse_layouts (List[str or int], optional): The sparse layouts to + test for module invariance. (default: :obj:`["paddle_sparse", + paddle.sparse_csc, paddle.sparse_coo]`) + sparse_size (Tuple[int, int], optional): The size of the sparse + adjacency matrix. If not given, will try to automatically infer it. + (default: :obj:`None`) + atol (float, optional): Absolute tolerance. (default: :obj:`1e-08`) + rtol (float, optional): Relative tolerance. (default: :obj:`1e-05`) + equal_nan (bool, optional): If set to :obj:`True`, then two :obj:`NaN`s + will be considered equal. (default: :obj:`False`) + **kwargs (optional): Additional arguments passed to + :meth:`module.forward`. + """ + if test_sparse_layouts is None: + test_sparse_layouts = SPARSE_LAYOUTS + + if sparse_size is None: + if 'size' in kwargs: + sparse_size = kwargs['size'] + elif isinstance(x, paddle.Tensor): + sparse_size = (x.shape[0], x.shape[0]) + elif (isinstance(x, (tuple, list)) and isinstance(x[0], paddle.Tensor) + and isinstance(x[1], paddle.Tensor)): + sparse_size = (x[0].shape[0], x[1].shape[0]) + + if len(test_sparse_layouts) > 0 and sparse_size is None: + raise ValueError(f"Got sparse layouts {test_sparse_layouts}, but no " + f"'sparse_size' were specified") + + expected = module(x, edge_index=edge_index, **kwargs) + assert expected.shape == expected_size + + if test_edge_permutation: + perm = paddle.randperm(edge_index.shape[1]) + perm_kwargs = copy.copy(kwargs) + for key, value in kwargs.items(): + if isinstance(value, paddle.Tensor) and value.shape[0] == perm.numel(): + perm_kwargs[key] = value[perm] + out = module(x, edge_index[:, perm], **perm_kwargs) + assert paddle.allclose(out, expected, rtol, atol, equal_nan) + + if test_node_permutation: + raise NotImplementedError + + for layout in (test_sparse_layouts or []): + # TODO Add support for values. + if layout == 'paddle_sparse': + if not WITH_PADDLE_SPARSE: + continue + + adj = SparseTensor.from_edge_index( + edge_index, + sparse_sizes=sparse_size, + ) + adj_t = adj.t() + + elif layout == paddle.sparse_csc: + adj = to_paddle_csc_tensor(edge_index, size=sparse_size) + adj_t = adj.t() + + elif layout == paddle.sparse_coo: + warnings.filterwarnings('ignore', ".*to CSR format.*") + adj = to_paddle_coo_tensor(edge_index, size=sparse_size) + adj_t = adj.t().coalesce() + + else: + raise ValueError(f"Got invalid sparse layout '{layout}'") + + out = module(x, adj_t, **kwargs) + assert paddle.allclose(out, expected, rtol, atol, equal_nan) + + return expected diff --git a/jointContribution/mattergen/paddle_geometric/testing/data.py b/jointContribution/mattergen/paddle_geometric/testing/data.py new file mode 100644 index 00000000..e8daad5f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/data.py @@ -0,0 +1,83 @@ +from typing import Callable, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import HeteroData, InMemoryDataset +from paddle_geometric.typing import TensorFrame, paddle_frame +from paddle_geometric.utils import coalesce as coalesce_fn + + +def get_random_edge_index( + num_src_nodes: int, + num_dst_nodes: int, + num_edges: int, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, + coalesce: bool = False, +) -> Tensor: + row = paddle.randint(0, num_src_nodes, shape=(num_edges,), dtype=dtype) + col = paddle.randint(0, num_dst_nodes, shape=(num_edges,), dtype=dtype) + edge_index = paddle.stack([row, col], axis=0) + + if coalesce: + edge_index = coalesce_fn(edge_index) + + return edge_index + + +def get_random_tensor_frame( + num_rows: int, + device: Optional[str] = None, +) -> TensorFrame: + + feat_dict = { + paddle_frame.categorical: + paddle.randint(0, 3, shape=(num_rows, 3), device=device), + paddle_frame.numerical: + paddle.randn(shape=(num_rows, 2), device=device), + } + col_names_dict = { + paddle_frame.categorical: ['a', 'b', 'c'], + paddle_frame.numerical: ['x', 'y'], + } + y = paddle.randn([num_rows], device=device) + + return paddle_frame.TensorFrame( + feat_dict=feat_dict, + col_names_dict=col_names_dict, + y=y, + ) + + +class FakeHeteroDataset(InMemoryDataset): + def __init__(self, transform: Optional[Callable] = None): + super().__init__(transform=transform) + + data = HeteroData() + + num_papers = 100 + num_authors = 10 + + data['paper'].x = paddle.randn([num_papers, 16]) + data['author'].x = paddle.randn([num_authors, 8]) + + edge_index = get_random_edge_index( + num_src_nodes=num_papers, + num_dst_nodes=num_authors, + num_edges=300, + ) + data['paper', 'author'].edge_index = edge_index + data['author', 'paper'].edge_index = edge_index.flip([0]) + + data['paper'].y = paddle.randint(0, 4, shape=[num_papers]) + + perm = paddle.randperm(num_papers) + data['paper'].train_mask = paddle.zeros([num_papers], dtype=paddle.bool) + data['paper'].train_mask[perm[:60]] = True + data['paper'].val_mask = paddle.zeros([num_papers], dtype=paddle.bool) + data['paper'].val_mask[perm[60:80]] = True + data['paper'].test_mask = paddle.zeros([num_papers], dtype=paddle.bool) + data['paper'].test_mask[perm[80:100]] = True + + self.data, self.slices = self.collate([data]) diff --git a/jointContribution/mattergen/paddle_geometric/testing/decorators.py b/jointContribution/mattergen/paddle_geometric/testing/decorators.py new file mode 100644 index 00000000..2fcd1b03 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/decorators.py @@ -0,0 +1,287 @@ +import os +import sys +import warnings +from importlib import import_module +from importlib.util import find_spec +from typing import Callable + +import paddle +from packaging.requirements import Requirement +from packaging.version import Version + +import paddle_geometric +from paddle_geometric.typing import WITH_METIS, WITH_PYG_LIB, WITH_PADDLE_SPARSE +from paddle_geometric.visualization.graph import has_graphviz + + +def is_full_test() -> bool: + r"""Whether to run the full but time-consuming test suite.""" + return os.getenv('FULL_TEST', '0') == '1' + + +def onlyFullTest(func: Callable) -> Callable: + r"""A decorator to specify that this function belongs to the full test + suite. + """ + import pytest + return pytest.mark.skipif( + not is_full_test(), + reason="Fast test run", + )(func) + + +def is_distributed_test() -> bool: + r"""Whether to run the distributed test suite.""" + return ((is_full_test() or os.getenv('DIST_TEST', '0') == '1') + and sys.platform == 'linux' and has_package('pyg_lib')) + + +def onlyDistributedTest(func: Callable) -> Callable: + r"""A decorator to specify that this function belongs to the distributed + test suite. + """ + import pytest + return pytest.mark.skipif( + not is_distributed_test(), + reason="Fast test run", + )(func) + + +def onlyLinux(func: Callable) -> Callable: + r"""A decorator to specify that this function should only execute on + Linux systems. + """ + import pytest + return pytest.mark.skipif( + sys.platform != 'linux', + reason="No Linux system", + )(func) + + +def noWindows(func: Callable) -> Callable: + r"""A decorator to specify that this function should not execute on + Windows systems. + """ + import pytest + return pytest.mark.skipif( + os.name == 'nt', + reason="Windows system", + )(func) + + +def noMac(func: Callable) -> Callable: + r"""A decorator to specify that this function should not execute on + macOS systems. + """ + import pytest + return pytest.mark.skipif( + sys.platform == 'darwin', + reason="macOS system", + )(func) + + +def minPython(version: str) -> Callable: + r"""A decorator to run tests on specific :python:`Python` versions only.""" + def decorator(func: Callable) -> Callable: + import pytest + + major, minor = version.split('.') + + skip = False + if sys.version_info.major < int(major): + skip = True + if (sys.version_info.major == int(major) + and sys.version_info.minor < int(minor)): + skip = True + + return pytest.mark.skipif( + skip, + reason=f"Python {version} required", + )(func) + + return decorator + + +def onlyCUDA(func: Callable) -> Callable: + r"""A decorator to skip tests if CUDA is not found.""" + import pytest + return pytest.mark.skipif( + not paddle.is_compiled_with_cuda(), + reason="CUDA not available", + )(func) + + +def onlyXPU(func: Callable) -> Callable: + r"""A decorator to skip tests if XPU is not found.""" + import pytest + return pytest.mark.skipif( + not paddle_geometric.is_xpu_available(), + reason="XPU not available", + )(func) + + +def onlyOnline(func: Callable) -> Callable: + r"""A decorator to skip tests if there exists no connection to the + internet. + """ + import http.client as httplib + + import pytest + + has_connection = True + connection = httplib.HTTPSConnection('8.8.8.8', timeout=5) + try: + connection.request('HEAD', '/') + except Exception: + has_connection = False + finally: + connection.close() + + return pytest.mark.skipif( + not has_connection, + reason="No internet connection", + )(func) + + +def onlyGraphviz(func: Callable) -> Callable: + r"""A decorator to specify that this function should only execute in case + :obj:`graphviz` is installed. + """ + import pytest + return pytest.mark.skipif( + not has_graphviz(), + reason="Graphviz not installed", + )(func) + + +def onlyNeighborSampler(func: Callable) -> Callable: + r"""A decorator to skip tests if no neighborhood sampler package is + installed. + """ + import pytest + return pytest.mark.skipif( + not WITH_PYG_LIB and not WITH_PADDLE_SPARSE, + reason="No neighbor sampler installed", + )(func) + + +def has_package(package: str) -> bool: + r"""Returns :obj:`True` in case :obj:`package` is installed.""" + if '|' in package: + return any(has_package(p) for p in package.split('|')) + + req = Requirement(package) + if find_spec(req.name) is None: + return False + + try: + module = import_module(req.name) + if not hasattr(module, '__version__'): + return True + + version = Version(module.__version__).base_version + return version in req.specifier + except Exception: + return False + + +def withPackage(*args: str) -> Callable: + r"""A decorator to skip tests if certain packages are not installed. + Also supports version specification. + """ + na_packages = {package for package in args if not has_package(package)} + + if len(na_packages) == 1: + reason = f"Package {list(na_packages)[0]} not found" + else: + reason = f"Packages {na_packages} not found" + + def decorator(func: Callable) -> Callable: + import pytest + return pytest.mark.skipif(len(na_packages) > 0, reason=reason)(func) + + return decorator + + +def withCUDA(func: Callable) -> Callable: + r"""A decorator to test both on CPU and CUDA (if available).""" + import pytest + + devices = [pytest.param('cpu', id='cpu')] + if paddle.is_compiled_with_cuda(): + devices.append(pytest.param('gpu:0', id='gpu')) + + return pytest.mark.parametrize('device', devices)(func) + + +def withDevice(func: Callable) -> Callable: + r"""A decorator to test on all available tensor processing devices.""" + import pytest + + devices = [pytest.param('cpu', id='cpu')] + + if paddle.is_compiled_with_cuda(): + devices.append(pytest.param('gpu:0', id='gpu')) + + if paddle_geometric.is_mps_available(): + raise NotImplementedError("Paddle does not currently support MPS devices.") + + if paddle_geometric.is_xpu_available(): + raise NotImplementedError("Paddle does not currently support XPU devices.") + + # Additional devices can be registered through environment variables: + device = os.getenv('PADDLE_DEVICE') + if device: + backend = os.getenv('PADDLE_BACKEND') + if backend is None: + warnings.warn(f"Please specify the backend via 'PADDLE_BACKEND' in" + f"order to test against '{device}'") + else: + import_module(backend) + devices.append(pytest.param(device, id=device)) + + return pytest.mark.parametrize('device', devices)(func) + + +def withMETIS(func: Callable) -> Callable: + r"""A decorator to only test in case a valid METIS method is available.""" + import pytest + + with_metis = WITH_METIS + + if with_metis: + try: # Test that METIS can succesfully execute: + rowptr = paddle.to_tensor([0, 2, 4, 6]) + col = paddle.to_tensor([1, 2, 0, 2, 1, 0]) + paddle.ops.PADDLE_sparse.partition(rowptr, col, None, 2, True) + except Exception: + with_metis = False + + return pytest.mark.skipif( + not with_metis, + reason="METIS not enabled", + )(func) + + +def disableExtensions(func: Callable) -> Callable: + r"""A decorator to temporarily disable the usage of the + :obj:`PADDLE_scatter`, :obj:`PADDLE_sparse` and :obj:`pyg_lib` extension + packages. + """ + import pytest + + return pytest.mark.usefixtures('disable_extensions')(func) + + +def withoutExtensions(func: Callable) -> Callable: + r"""A decorator to test both with and without the usage of extension + packages such as :obj:`PADDLE_scatter`, :obj:`PADDLE_sparse` and + :obj:`pyg_lib`. + """ + import pytest + + return pytest.mark.parametrize( + 'without_extensions', + ['enable_extensions', 'disable_extensions'], + indirect=True, + )(func) diff --git a/jointContribution/mattergen/paddle_geometric/testing/distributed.py b/jointContribution/mattergen/paddle_geometric/testing/distributed.py new file mode 100644 index 00000000..949d6573 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/distributed.py @@ -0,0 +1,92 @@ +import sys +import traceback +from dataclasses import dataclass +from io import StringIO +from typing import Any, Callable, List, Tuple + +import pytest +from paddle.multiprocessing import Manager, Queue +from typing_extensions import Self + + +@dataclass +class ProcArgs: + target: Callable + args: Tuple[Any, ...] + + +class MPCaptOutput: + def __enter__(self) -> Self: + self.stdout = StringIO() + self.stderr = StringIO() + self.old_stdout = sys.stdout + self.old_stderr = sys.stderr + + sys.stdout = self.stdout + sys.stderr = self.stderr + + return self + + def __exit__(self, *args: Any) -> None: + sys.stdout = self.old_stdout + sys.stderr = self.old_stderr + + @property + def stdout_str(self) -> str: + return self.stdout.getvalue() + + @property + def stderr_str(self) -> str: + return self.stderr.getvalue() + + +def ps_std_capture( + func: Callable, + queue: Queue, + *args: Any, + **kwargs: Any, +) -> None: + with MPCaptOutput() as capt: + try: + func(*args, **kwargs) + except Exception as e: + traceback.print_exc(file=sys.stderr) + raise e + finally: + queue.put((capt.stdout_str, capt.stderr_str)) + + +def assert_run_mproc( + mp_context: Any, + pargs: List[ProcArgs], + full_trace: bool = False, + timeout: int = 5, +) -> None: + manager = Manager() + world_size = len(pargs) + queues = [manager.Queue() for _ in pargs] + procs = [ + mp_context.Process( + target=ps_std_capture, + args=[p.target, q, world_size] + list(p.args), + ) for p, q in zip(pargs, queues) + ] + results = [] + + for p, q in zip(procs, queues): + p.start() + + for p, q in zip(procs, queues): + p.join() + stdout, stderr = q.get(timeout=timeout) + results.append((p, stdout, stderr)) + + for p, stdout, stderr in results: + if stdout: + print(stdout) + if stderr: # can be a warning as well => exitcode == 0 + print(stderr) + if p.exitcode != 0: + pytest.fail( + pytrace=full_trace, reason=stderr.splitlines()[-1] + if stderr else f"exitcode {p.exitcode}") diff --git a/jointContribution/mattergen/paddle_geometric/testing/feature_store.py b/jointContribution/mattergen/paddle_geometric/testing/feature_store.py new file mode 100644 index 00000000..e4cc6073 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/feature_store.py @@ -0,0 +1,68 @@ +from typing import Dict, List, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import FeatureStore, TensorAttr +from paddle_geometric.typing import FeatureTensorType + +KeyType = Tuple[Optional[str], Optional[str]] + + +class MyFeatureStore(FeatureStore): + def __init__(self) -> None: + super().__init__() + self.store: Dict[KeyType, Tuple[Tensor, Tensor]] = {} + + @staticmethod + def key(attr: TensorAttr) -> KeyType: + return (attr.group_name, attr.attr_name) + + def _put_tensor(self, tensor: FeatureTensorType, attr: TensorAttr) -> bool: + index = attr.index + + # None indices define the obvious index: + if index is None: + index = paddle.arange(0, tensor.shape[0]) + + # Store the index: + assert isinstance(index, Tensor) + assert isinstance(tensor, Tensor) + self.store[self.key(attr)] = (index, tensor) + + return True + + def _get_tensor(self, attr: TensorAttr) -> Optional[Tensor]: + index, tensor = self.store.get(self.key(attr), (None, None)) + + if tensor is None: + raise KeyError(f"Could not find tensor for '{attr}'") + + assert isinstance(tensor, Tensor) + + # None indices return the whole tensor: + if attr.index is None: + return tensor + + # Empty slices return the whole tensor: + if (isinstance(attr.index, slice) + and attr.index == slice(None, None, None)): + return tensor + + assert isinstance(attr.index, Tensor) + + if attr.index.numel() == 0: + return tensor[attr.index] + + idx = paddle.concat([(index == v).nonzero() for v in attr.index]).reshape([-1]) + return tensor[idx] + + def _remove_tensor(self, attr: TensorAttr) -> bool: + return self.store.pop(self.key(attr), None) is not None + + def _get_tensor_size(self, attr: TensorAttr) -> Optional[Tuple[int, ...]]: + tensor = self._get_tensor(attr) + return tensor.shape if tensor is not None else None + + def get_all_tensor_attrs(self) -> List[TensorAttr]: + return [self._tensor_attr_cls.cast(*key) for key in self.store.keys()] diff --git a/jointContribution/mattergen/paddle_geometric/testing/graph_store.py b/jointContribution/mattergen/paddle_geometric/testing/graph_store.py new file mode 100644 index 00000000..b0120c54 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/testing/graph_store.py @@ -0,0 +1,34 @@ +from typing import Dict, List, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import EdgeAttr, GraphStore +from paddle_geometric.typing import EdgeTensorType + + +class MyGraphStore(GraphStore): + def __init__(self) -> None: + super().__init__() + self.store: Dict[Tuple, Tuple[Tensor, Tensor]] = {} + + @staticmethod + def key(attr: EdgeAttr) -> Tuple: + return (attr.edge_type, attr.layout.value, attr.is_sorted, attr.size) + + def _put_edge_index( + self, + edge_index: EdgeTensorType, + edge_attr: EdgeAttr, + ) -> bool: + self.store[self.key(edge_attr)] = edge_index + return True + + def _get_edge_index(self, edge_attr: EdgeAttr) -> Optional[EdgeTensorType]: + return self.store.get(self.key(edge_attr), None) + + def _remove_edge_index(self, edge_attr: EdgeAttr) -> bool: + return self.store.pop(self.key(edge_attr), None) is not None + + def get_all_edge_attrs(self) -> List[EdgeAttr]: + return [EdgeAttr(*key) for key in self.store.keys()] diff --git a/jointContribution/mattergen/paddle_geometric/transforms/__init__.py b/jointContribution/mattergen/paddle_geometric/transforms/__init__.py new file mode 100644 index 00000000..87e8815a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/__init__.py @@ -0,0 +1,145 @@ +# flake8: noqa + +from .base_transform import BaseTransform +from .compose import Compose, ComposeFilters +from .to_device import ToDevice +from .to_sparse_tensor import ToSparseTensor +from .constant import Constant +from .normalize_features import NormalizeFeatures +from .svd_feature_reduction import SVDFeatureReduction +from .remove_training_classes import RemoveTrainingClasses +from .random_node_split import RandomNodeSplit +from .random_link_split import RandomLinkSplit +from .node_property_split import NodePropertySplit +from .mask import IndexToMask, MaskToIndex +from .pad import Pad + +from .to_undirected import ToUndirected +from .one_hot_degree import OneHotDegree +from .target_indegree import TargetIndegree +from .local_degree_profile import LocalDegreeProfile +from .add_self_loops import AddSelfLoops +from .add_remaining_self_loops import AddRemainingSelfLoops +from .remove_self_loops import RemoveSelfLoops +from .remove_isolated_nodes import RemoveIsolatedNodes +from .remove_duplicated_edges import RemoveDuplicatedEdges +from .knn_graph import KNNGraph +from .radius_graph import RadiusGraph +from .to_dense import ToDense +from .two_hop import TwoHop +from .line_graph import LineGraph +from .laplacian_lambda_max import LaplacianLambdaMax +from .gdc import GDC +from .sign import SIGN +from .gcn_norm import GCNNorm +from .add_metapaths import AddMetaPaths, AddRandomMetaPaths +from .rooted_subgraph import RootedEgoNets, RootedRWSubgraph +from .largest_connected_components import LargestConnectedComponents +from .virtual_node import VirtualNode +from .add_positional_encoding import AddLaplacianEigenvectorPE, AddRandomWalkPE +from .feature_propagation import FeaturePropagation +from .half_hop import HalfHop + +from .distance import Distance +from .cartesian import Cartesian +from .local_cartesian import LocalCartesian +from .polar import Polar +from .spherical import Spherical +from .point_pair_features import PointPairFeatures +from .center import Center +from .normalize_rotation import NormalizeRotation +from .normalize_scale import NormalizeScale +from .random_jitter import RandomJitter +from .random_flip import RandomFlip +from .linear_transformation import LinearTransformation +from .random_scale import RandomScale +from .random_rotate import RandomRotate +from .random_shear import RandomShear +from .face_to_edge import FaceToEdge +from .sample_points import SamplePoints +from .fixed_points import FixedPoints +from .generate_mesh_normals import GenerateMeshNormals +from .delaunay import Delaunay +from .to_superpixels import ToSLIC +from .grid_sampling import GridSampling + +general_transforms = [ + 'BaseTransform', + 'Compose', + 'ComposeFilters', + 'ToDevice', + 'ToSparseTensor', + 'Constant', + 'NormalizeFeatures', + 'SVDFeatureReduction', + 'RemoveTrainingClasses', + 'RandomNodeSplit', + 'RandomLinkSplit', + 'NodePropertySplit', + 'IndexToMask', + 'MaskToIndex', + 'Pad', +] + +graph_transforms = [ + 'ToUndirected', + 'OneHotDegree', + 'TargetIndegree', + 'LocalDegreeProfile', + 'AddSelfLoops', + 'AddRemainingSelfLoops', + 'RemoveSelfLoops', + 'RemoveIsolatedNodes', + 'RemoveDuplicatedEdges', + 'KNNGraph', + 'RadiusGraph', + 'ToDense', + 'TwoHop', + 'LineGraph', + 'LaplacianLambdaMax', + 'GDC', + 'SIGN', + 'GCNNorm', + 'AddMetaPaths', + 'AddRandomMetaPaths', + 'RootedEgoNets', + 'RootedRWSubgraph', + 'LargestConnectedComponents', + 'VirtualNode', + 'AddLaplacianEigenvectorPE', + 'AddRandomWalkPE', + 'FeaturePropagation', + 'HalfHop', +] + +vision_transforms = [ + 'Distance', + 'Cartesian', + 'LocalCartesian', + 'Polar', + 'Spherical', + 'PointPairFeatures', + 'Center', + 'NormalizeRotation', + 'NormalizeScale', + 'RandomJitter', + 'RandomFlip', + 'LinearTransformation', + 'RandomScale', + 'RandomRotate', + 'RandomShear', + 'FaceToEdge', + 'SamplePoints', + 'FixedPoints', + 'GenerateMeshNormals', + 'Delaunay', + 'ToSLIC', + 'GridSampling', +] + +__all__ = general_transforms + graph_transforms + vision_transforms + +from paddle_geometric.deprecation import deprecated + +RandomTranslate = deprecated("use 'transforms.RandomJitter' instead", + 'transforms.RandomTranslate')(RandomJitter) diff --git a/jointContribution/mattergen/paddle_geometric/transforms/add_metapaths.py b/jointContribution/mattergen/paddle_geometric/transforms/add_metapaths.py new file mode 100644 index 00000000..c27060dd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/add_metapaths.py @@ -0,0 +1,231 @@ +import warnings +from typing import List, Optional, Tuple, Union, cast + +import paddle +from paddle import Tensor + +from paddle_geometric import EdgeIndex +from paddle_geometric.data import HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.typing import EdgeType +from paddle_geometric.utils import coalesce, degree + + +@functional_transform('add_metapaths') +class AddMetaPaths(BaseTransform): + r"""Adds additional edge types to a + :class:`~paddle_geometric.data.HeteroData` object between the source node + type and the destination node type of a given :obj:`metapath`, as described + in the `"Heterogenous Graph Attention Networks" + `_ paper + (functional name: :obj:`add_metapaths`). + """ + def __init__( + self, + metapaths: List[List[EdgeType]], + drop_orig_edge_types: bool = False, + keep_same_node_type: bool = False, + drop_unconnected_node_types: bool = False, + max_sample: Optional[int] = None, + weighted: bool = False, + **kwargs: bool, + ) -> None: + for path in metapaths: + assert len(path) >= 2, f"Invalid metapath '{path}'" + assert all([j[-1] == path[i + 1][0] for i, j in enumerate(path[:-1])]), f"Invalid sequence of node types in '{path}'" + + self.metapaths = metapaths + self.drop_orig_edge_types = drop_orig_edge_types + self.keep_same_node_type = keep_same_node_type + self.drop_unconnected_node_types = drop_unconnected_node_types + self.max_sample = max_sample + self.weighted = weighted + + def forward(self, data: HeteroData) -> HeteroData: + edge_types = data.edge_types # Save original edge types. + data.metapath_dict = {} + + for j, metapath in enumerate(self.metapaths): + for edge_type in metapath: + assert data._to_canonical(edge_type) in edge_types + + edge_type = metapath[0] + edge_index, edge_weight = self._edge_index(data, edge_type) + + if self.max_sample is not None: + edge_index, edge_weight = self._sample(edge_index, edge_weight) + + for i, edge_type in enumerate(metapath[1:]): + edge_index2, edge_weight2 = self._edge_index(data, edge_type) + edge_index, edge_weight = paddle.matmul(edge_index, edge_index2, edge_weight, edge_weight2) + + if not self.weighted: + edge_weight = None + + if self.max_sample is not None: + edge_index, edge_weight = self._sample(edge_index, edge_weight) + + new_edge_type = (metapath[0][0], f'metapath_{j}', metapath[-1][-1]) + data[new_edge_type].edge_index = paddle.to_tensor(edge_index) + if self.weighted: + data[new_edge_type].edge_weight = edge_weight + data.metapath_dict[new_edge_type] = metapath + + postprocess(data, edge_types, self.drop_orig_edge_types, + self.keep_same_node_type, self.drop_unconnected_node_types) + + return data + + def _edge_index( + self, + data: HeteroData, + edge_type: EdgeType, + ) -> Tuple[EdgeIndex, Optional[Tensor]]: + edge_index = EdgeIndex( + data[edge_type].edge_index, + sparse_size=data[edge_type].size(), + ) + edge_index, perm = edge_index.sort_by('row') + + if not self.weighted: + return edge_index, None + + edge_weight = data[edge_type].get('edge_weight') + if edge_weight is not None: + assert edge_weight.dim() == 1 + edge_weight = edge_weight[perm] + + return edge_index, edge_weight + + def _sample( + self, + edge_index: EdgeIndex, + edge_weight: Optional[Tensor], + ) -> Tuple[EdgeIndex, Optional[Tensor]]: + deg = degree(edge_index[0], num_nodes=edge_index.get_sparse_size(0)) + prob = (self.max_sample * (1. / deg))[edge_index[0]] + mask = paddle.rand_like(prob) < prob + + edge_index = cast(EdgeIndex, edge_index[:, mask]) + if edge_weight is not None: + edge_weight = edge_weight[mask] + + return edge_index, edge_weight + + +@functional_transform('add_random_metapaths') +class AddRandomMetaPaths(BaseTransform): + r"""Adds additional edge types similar to :class:`AddMetaPaths`. + The key difference is that the added edge type is given by + multiple random walks along the metapath. + """ + def __init__( + self, + metapaths: List[List[EdgeType]], + drop_orig_edge_types: bool = False, + keep_same_node_type: bool = False, + drop_unconnected_node_types: bool = False, + walks_per_node: Union[int, List[int]] = 1, + sample_ratio: float = 1.0, + ): + + for path in metapaths: + assert len(path) >= 2, f"Invalid metapath '{path}'" + assert all([ + j[-1] == path[i + 1][0] for i, j in enumerate(path[:-1]) + ]), f"Invalid sequence of node types in '{path}'" + + self.metapaths = metapaths + self.drop_orig_edge_types = drop_orig_edge_types + self.keep_same_node_type = keep_same_node_type + self.drop_unconnected_node_types = drop_unconnected_node_types + self.sample_ratio = sample_ratio + if isinstance(walks_per_node, int): + walks_per_node = [walks_per_node] * len(metapaths) + assert len(walks_per_node) == len(metapaths) + self.walks_per_node = walks_per_node + + def forward(self, data: HeteroData) -> HeteroData: + edge_types = data.edge_types # save original edge types + data.metapath_dict = {} + + for j, metapath in enumerate(self.metapaths): + for edge_type in metapath: + assert data._to_canonical(edge_type) in edge_types + + src_node = metapath[0][0] + num_nodes = data[src_node].num_nodes + num_starts = round(num_nodes * self.sample_ratio) + row = start = paddle.randperm(num_nodes)[:num_starts].tile(self.walks_per_node[j]) + + for i, edge_type in enumerate(metapath): + edge_index = EdgeIndex( + data[edge_type].edge_index, + sparse_size=data[edge_type].size(), + ) + col, mask = self.sample(edge_index, start) + row, col = row[mask], col[mask] + start = col + + new_edge_type = (metapath[0][0], f'metapath_{j}', metapath[-1][-1]) + data[new_edge_type].edge_index = coalesce(paddle.vstack([row, col])) + data.metapath_dict[new_edge_type] = metapath + + postprocess(data, edge_types, self.drop_orig_edge_types, + self.keep_same_node_type, self.drop_unconnected_node_types) + + return data + + @staticmethod + def sample(edge_index: EdgeIndex, subset: Tensor) -> Tuple[Tensor, Tensor]: + """Sample neighbors from :obj:`edge_index` for each node in + :obj:`subset`. + """ + edge_index, _ = edge_index.sort_by('row') + rowptr = edge_index.get_indptr() + rowcount = rowptr.diff()[subset] + + mask = rowcount > 0 + offset = paddle.zeros_like(subset) + offset[mask] = rowptr[subset[mask]] + + rand = paddle.rand((rowcount.size(0), 1), device=subset.device) + rand.mul_(rowcount.to(rand.dtype).view(-1, 1)) + rand = rand.to(paddle.int64) + rand.add_(offset.view(-1, 1)) + col = edge_index[1][rand].squeeze() + return col, mask + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'sample_ratio={self.sample_ratio}, ' + f'walks_per_node={self.walks_per_node})') + + +def postprocess( + data: HeteroData, + edge_types: List[EdgeType], + drop_orig_edge_types: bool, + keep_same_node_type: bool, + drop_unconnected_node_types: bool, +) -> None: + + if drop_orig_edge_types: + for i in edge_types: + if keep_same_node_type and i[0] == i[-1]: + continue + else: + del data[i] + + # Remove nodes not connected by any edge type: + if drop_unconnected_node_types: + new_edge_types = data.edge_types + node_types = data.node_types + connected_nodes = set() + for i in new_edge_types: + connected_nodes.add(i[0]) + connected_nodes.add(i[-1]) + for node in node_types: + if node not in connected_nodes: + del data[node] diff --git a/jointContribution/mattergen/paddle_geometric/transforms/add_positional_encoding.py b/jointContribution/mattergen/paddle_geometric/transforms/add_positional_encoding.py new file mode 100644 index 00000000..762a9ae8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/add_positional_encoding.py @@ -0,0 +1,156 @@ +import warnings +from typing import Any, Optional + +import numpy as np +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import ( + get_laplacian, + get_self_loop_attr, + is_paddle_sparse_tensor, + scatter, + to_edge_index, + to_scipy_sparse_matrix, + to_paddle_coo_tensor, + to_paddle_csr_tensor, +) + + +def add_node_attr( + data: Data, + value: Any, + attr_name: Optional[str] = None, +) -> Data: + # TODO Move to `BaseTransform`. + if attr_name is None: + if data.x is not None: + x = data.x.view(-1, 1) if data.x.dim() == 1 else data.x + data.x = paddle.concat([x, value], axis=-1) + else: + data.x = value + else: + data[attr_name] = value + + return data + + +@functional_transform('add_laplacian_eigenvector_pe') +class AddLaplacianEigenvectorPE(BaseTransform): + r"""Adds the Laplacian eigenvector positional encoding from the + `"Benchmarking Graph Neural Networks" `_ + paper to the given graph + (functional name: :obj:`add_laplacian_eigenvector_pe`). + """ + + SPARSE_THRESHOLD: int = 100 + + def __init__( + self, + k: int, + attr_name: Optional[str] = 'laplacian_eigenvector_pe', + is_undirected: bool = False, + **kwargs: Any, + ) -> None: + self.k = k + self.attr_name = attr_name + self.is_undirected = is_undirected + self.kwargs = kwargs + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + num_nodes = data.num_nodes + assert num_nodes is not None + + edge_index, edge_weight = get_laplacian( + data.edge_index, + data.edge_weight, + normalization='sym', + num_nodes=num_nodes, + ) + + L = to_scipy_sparse_matrix(edge_index, edge_weight, num_nodes) + + if num_nodes < self.SPARSE_THRESHOLD: + from numpy.linalg import eig, eigh + eig_fn = eig if not self.is_undirected else eigh + + eig_vals, eig_vecs = eig_fn(L.todense()) + else: + from scipy.sparse.linalg import eigs, eigsh + eig_fn = eigs if not self.is_undirected else eigsh + + eig_vals, eig_vecs = eig_fn( # type: ignore + L, + k=self.k + 1, + which='SR' if not self.is_undirected else 'SA', + return_eigenvectors=True, + **self.kwargs, + ) + + eig_vecs = np.real(eig_vecs[:, eig_vals.argsort()]) + pe = paddle.to_tensor(eig_vecs[:, 1:self.k + 1]) + sign = -1 + 2 * paddle.randint(0, 2, (self.k, )) + pe *= sign + + data = add_node_attr(data, pe, attr_name=self.attr_name) + return data + + +@functional_transform('add_random_walk_pe') +class AddRandomWalkPE(BaseTransform): + r"""Adds the random walk positional encoding from the `"Graph Neural + Networks with Learnable Structural and Positional Representations" + `_ paper to the given graph + (functional name: :obj:`add_random_walk_pe`). + """ + + def __init__( + self, + walk_length: int, + attr_name: Optional[str] = 'random_walk_pe', + ) -> None: + self.walk_length = walk_length + self.attr_name = attr_name + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + row, col = data.edge_index + N = data.num_nodes + assert N is not None + + if data.edge_weight is None: + value = paddle.ones([data.num_edges]) + else: + value = data.edge_weight + value = scatter(value, row, dim_size=N, reduce='sum').clip(min=1)[row] + value = 1.0 / value + + if N <= 2_000: # Dense code path for faster computation: + adj = paddle.zeros([N, N]) + adj[row, col] = value + loop_index = paddle.arange(N) + elif paddle_geometric.typing.NO_MKL: # pragma: no cover + adj = to_paddle_coo_tensor(data.edge_index, value, size=data.size()) + else: + adj = to_paddle_csr_tensor(data.edge_index, value, size=data.size()) + + def get_pe(out: Tensor) -> Tensor: + if is_paddle_sparse_tensor(out): + return get_self_loop_attr(*to_edge_index(out), num_nodes=N) + return out[loop_index, loop_index] + + out = adj + pe_list = [get_pe(out)] + for _ in range(self.walk_length - 1): + out = paddle.matmul(out, adj) + pe_list.append(get_pe(out)) + + pe = paddle.stack(pe_list, axis=-1) + data = add_node_attr(data, pe, attr_name=self.attr_name) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/add_remaining_self_loops.py b/jointContribution/mattergen/paddle_geometric/transforms/add_remaining_self_loops.py new file mode 100644 index 00000000..fbc6cafe --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/add_remaining_self_loops.py @@ -0,0 +1,51 @@ +from typing import Union +import paddle +from paddle import Tensor +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import add_remaining_self_loops # Assuming this is adapted for Paddle + +@functional_transform('add_remaining_self_loops') +class AddRemainingSelfLoops(BaseTransform): + r"""Adds remaining self-loops to the given homogeneous or heterogeneous + graph (functional name: :obj:`add_remaining_self_loops`). + + Args: + attr (str, optional): The name of the attribute of edge weights + or multi-dimensional edge features to pass to + :meth:`paddle_geometric.utils.add_remaining_self_loops`. + (default: :obj:`"edge_weight"`) + fill_value (float or Tensor or str, optional): The way to generate + edge features of self-loops (in case :obj:`attr != None`). + If given as :obj:`float` or :class:`paddle.Tensor`, edge features of + self-loops will be directly given by :obj:`fill_value`. + If given as :obj:`str`, edge features of self-loops are computed by + aggregating all features of edges that point to the specific node, + according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`, + :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`1.`) + """ + def __init__( + self, + attr: str = 'edge_weight', + fill_value: Union[float, Tensor, str] = 1.0, + ): + self.attr = attr + self.fill_value = fill_value + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.edge_stores: + if store.is_bipartite() or 'edge_index' not in store: + continue + + store.edge_index, store[self.attr] = add_remaining_self_loops( + store.edge_index, + edge_attr=store.get(self.attr, None), + fill_value=self.fill_value, + num_nodes=store.size(0), + ) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/add_self_loops.py b/jointContribution/mattergen/paddle_geometric/transforms/add_self_loops.py new file mode 100644 index 00000000..35522cd0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/add_self_loops.py @@ -0,0 +1,53 @@ +from typing import Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import add_self_loops # Assuming an adapted version for Paddle + +@functional_transform('add_self_loops') +class AddSelfLoops(BaseTransform): + r"""Adds self-loops to the given homogeneous or heterogeneous graph + (functional name: :obj:`add_self_loops`). + + Args: + attr (str, optional): The name of the attribute of edge weights + or multi-dimensional edge features to pass to + :meth:`paddle_geometric.utils.add_self_loops`. + (default: :obj:`"edge_weight"`) + fill_value (float or Tensor or str, optional): The way to generate + edge features of self-loops (in case :obj:`attr != None`). + If given as :obj:`float` or :class:`paddle.Tensor`, edge features of + self-loops will be directly given by :obj:`fill_value`. + If given as :obj:`str`, edge features of self-loops are computed by + aggregating all features of edges that point to the specific node, + according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`, + :obj:`"min"`, :obj:`"max"`, :obj:`"mul"`). (default: :obj:`1.`) + """ + def __init__( + self, + attr: str = 'edge_weight', + fill_value: Union[float, Tensor, str] = 1.0, + ) -> None: + self.attr = attr + self.fill_value = fill_value + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.edge_stores: + if store.is_bipartite() or 'edge_index' not in store: + continue + + store.edge_index, store[self.attr] = add_self_loops( + store.edge_index, + edge_attr=store.get(self.attr, None), + fill_value=self.fill_value, + num_nodes=store.size(0), + ) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/base_transform.py b/jointContribution/mattergen/paddle_geometric/transforms/base_transform.py new file mode 100644 index 00000000..d701f052 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/base_transform.py @@ -0,0 +1,38 @@ +import copy +from abc import ABC +from typing import Any + + +class BaseTransform(ABC): + r"""An abstract base class for writing transforms. + + Transforms are a general way to modify and customize + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` objects, either by implicitly + passing them as an argument to a :class:`~paddle_geometric.data.Dataset`, or + by applying them explicitly to individual + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` objects: + + .. code-block:: python + + import paddle_geometric.transforms as T + from paddle_geometric.datasets import TUDataset + + transform = T.Compose([T.ToUndirected(), T.AddSelfLoops()]) + + dataset = TUDataset(path, name='MUTAG', transform=transform) + data = dataset[0] # Implicitly transform data on every access. + + data = TUDataset(path, name='MUTAG')[0] + data = transform(data) # Explicitly transform data. + """ + def __call__(self, data: Any) -> Any: + # Shallow-copy the data so that we prevent in-place data modification. + return self.forward(copy.copy(data)) + + def forward(self, data: Any) -> Any: + pass + + def __repr__(self) -> str: + return f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/cartesian.py b/jointContribution/mattergen/paddle_geometric/transforms/cartesian.py new file mode 100644 index 00000000..8eeeaa16 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/cartesian.py @@ -0,0 +1,64 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + +@functional_transform('cartesian') +class Cartesian(BaseTransform): + r"""Saves the relative Cartesian coordinates of linked nodes in its edge + attributes (functional name: :obj:`cartesian`). Each coordinate gets + globally normalized to a specified interval (:math:`[0, 1]` by default). + + Args: + norm (bool, optional): If set to :obj:`False`, the output will not be + normalized. (default: :obj:`True`) + max_value (float, optional): If set and :obj:`norm=True`, normalization + will be performed based on this value instead of the maximum value + found in the data. (default: :obj:`None`) + cat (bool, optional): If set to :obj:`False`, all existing edge + attributes will be replaced. (default: :obj:`True`) + interval ((float, float), optional): A tuple specifying the lower and + upper bound for normalization. (default: :obj:`(0.0, 1.0)`) + """ + def __init__( + self, + norm: bool = True, + max_value: Optional[float] = None, + cat: bool = True, + interval: Tuple[float, float] = (0.0, 1.0), + ): + self.norm = norm + self.max = max_value + self.cat = cat + self.interval = interval + + def forward(self, data: Data) -> Data: + assert data.pos is not None + assert data.edge_index is not None + (row, col), pos, pseudo = data.edge_index, data.pos, data.edge_attr + + cart = pos[row] - pos[col] + cart = cart.reshape([-1, 1]) if cart.ndim == 1 else cart + + if self.norm and cart.numel() > 0: + max_val = float(cart.abs().max()) if self.max is None else self.max + + length = self.interval[1] - self.interval[0] + center = (self.interval[0] + self.interval[1]) / 2 + cart = length * cart / (2 * max_val) + center + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, cart.cast(pseudo.dtype)], axis=-1) + else: + data.edge_attr = cart + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(norm={self.norm}, ' + f'max_value={self.max})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/center.py b/jointContribution/mattergen/paddle_geometric/transforms/center.py new file mode 100644 index 00000000..0af3d2a2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/center.py @@ -0,0 +1,20 @@ +from typing import Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('center') +class Center(BaseTransform): + r"""Centers node positions :obj:`data.pos` around the origin + (functional name: :obj:`center`). + """ + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.node_stores: + if hasattr(store, 'pos'): + store.pos = store.pos - store.pos.mean(axis=-2, keepdim=True) + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/compose.py b/jointContribution/mattergen/paddle_geometric/transforms/compose.py new file mode 100644 index 00000000..09ea02c9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/compose.py @@ -0,0 +1,55 @@ +from typing import Callable, List, Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.transforms import BaseTransform + + +class Compose(BaseTransform): + r"""Composes several transforms together. + + Args: + transforms (List[Callable]): List of transforms to compose. + """ + def __init__(self, transforms: List[Callable]): + self.transforms = transforms + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for transform in self.transforms: + if isinstance(data, (list, tuple)): + data = [transform(d) for d in data] + else: + data = transform(data) + return data + + def __repr__(self) -> str: + args = [f' {transform}' for transform in self.transforms] + return '{}([\n{}\n])'.format(self.__class__.__name__, ',\n'.join(args)) + + +class ComposeFilters: + r"""Composes several filters together. + + Args: + filters (List[Callable]): List of filters to compose. + """ + def __init__(self, filters: List[Callable]): + self.filters = filters + + def __call__( + self, + data: Union[Data, HeteroData], + ) -> bool: + for filter_fn in self.filters: + if isinstance(data, (list, tuple)): + if not all([filter_fn(d) for d in data]): + return False + elif not filter_fn(data): + return False + return True + + def __repr__(self) -> str: + args = [f' {filter_fn}' for filter_fn in self.filters] + return '{}([\n{}\n])'.format(self.__class__.__name__, ',\n'.join(args)) diff --git a/jointContribution/mattergen/paddle_geometric/transforms/constant.py b/jointContribution/mattergen/paddle_geometric/transforms/constant.py new file mode 100644 index 00000000..efd67643 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/constant.py @@ -0,0 +1,56 @@ +from typing import List, Optional, Union + +import paddle + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + +@functional_transform('constant') +class Constant(BaseTransform): + r"""Appends a constant value to each node feature :obj:`x` + (functional name: :obj:`constant`). + + Args: + value (float, optional): The value to add. (default: :obj:`1.0`) + cat (bool, optional): If set to :obj:`False`, existing node features + will be replaced. (default: :obj:`True`) + node_types (str or List[str], optional): The specified node type(s) to + append constant values for if used on heterogeneous graphs. + If set to :obj:`None`, constants will be added to each node feature + :obj:`x` for all existing node types. (default: :obj:`None`) + """ + def __init__( + self, + value: float = 1.0, + cat: bool = True, + node_types: Optional[Union[str, List[str]]] = None, + ): + if isinstance(node_types, str): + node_types = [node_types] + + self.value = value + self.cat = cat + self.node_types = node_types + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + + for store in data.node_stores: + if self.node_types is None or store._key in self.node_types: + num_nodes = store.num_nodes + assert num_nodes is not None + c = paddle.full((num_nodes, 1), self.value, dtype='float32') + + if hasattr(store, 'x') and self.cat: + x = store.x.reshape([-1, 1]) if store.x.ndim == 1 else store.x + store.x = paddle.concat([x, c.cast(x.dtype)], axis=-1) + else: + store.x = c + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(value={self.value})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/delaunay.py b/jointContribution/mattergen/paddle_geometric/transforms/delaunay.py new file mode 100644 index 00000000..4654635b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/delaunay.py @@ -0,0 +1,31 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('delaunay') +class Delaunay(BaseTransform): + r"""Computes the delaunay triangulation of a set of points + (functional name: :obj:`delaunay`). + """ + def forward(self, data: Data) -> Data: + import scipy.spatial + + assert data.pos is not None + + if data.pos.shape[0] < 2: + data.edge_index = paddle.to_tensor([], dtype='int64').reshape([2, 0]) + elif data.pos.shape[0] == 2: + data.edge_index = paddle.to_tensor([[0, 1], [1, 0]], dtype='int64') + elif data.pos.shape[0] == 3: + data.face = paddle.to_tensor([[0], [1], [2]], dtype='int64') + elif data.pos.shape[0] > 3: + pos = data.pos.numpy() + tri = scipy.spatial.Delaunay(pos, qhull_options='QJ') + face = paddle.to_tensor(tri.simplices, dtype='int64') + + data.face = face.t() + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/distance.py b/jointContribution/mattergen/paddle_geometric/transforms/distance.py new file mode 100644 index 00000000..7d153009 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/distance.py @@ -0,0 +1,66 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('distance') +class Distance(BaseTransform): + r"""Saves the Euclidean distance of linked nodes in its edge attributes + (functional name: :obj:`distance`). Each distance gets globally normalized + to a specified interval (:math:`[0, 1]` by default). + + Args: + norm (bool, optional): If set to :obj:`False`, the output will not be + normalized. (default: :obj:`True`) + max_value (float, optional): If set and :obj:`norm=True`, normalization + will be performed based on this value instead of the maximum value + found in the data. (default: :obj:`None`) + cat (bool, optional): If set to :obj:`False`, all existing edge + attributes will be replaced. (default: :obj:`True`) + interval ((float, float), optional): A tuple specifying the lower and + upper bound for normalization. (default: :obj:`(0.0, 1.0)`) + """ + + def __init__( + self, + norm: bool = True, + max_value: Optional[float] = None, + cat: bool = True, + interval: Tuple[float, float] = (0.0, 1.0), + ): + self.norm = norm + self.max = max_value + self.cat = cat + self.interval = interval + + def forward(self, data: Data) -> Data: + assert data.pos is not None, "Node positions ('pos') must be provided in data." + assert data.edge_index is not None, "Edge indices ('edge_index') must be provided in data." + + row, col = data.edge_index + pos, pseudo = data.pos, data.edge_attr + + dist = paddle.norm(pos[col] - pos[row], p=2, axis=-1).reshape([-1, 1]) + + if self.norm and dist.numel() > 0: + max_val = float(dist.max()) if self.max is None else self.max + + length = self.interval[1] - self.interval[0] + dist = length * (dist / max_val) + self.interval[0] + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, dist.astype(pseudo.dtype)], axis=-1) + else: + data.edge_attr = dist + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(norm={self.norm}, ' + f'max_value={self.max})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/face_to_edge.py b/jointContribution/mattergen/paddle_geometric/transforms/face_to_edge.py new file mode 100644 index 00000000..620d9b68 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/face_to_edge.py @@ -0,0 +1,32 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import to_undirected + + +@functional_transform('face_to_edge') +class FaceToEdge(BaseTransform): + r"""Converts mesh faces :obj:[3, num_faces] to edge indices + :obj:[2, num_edges] (functional name: :obj:face_to_edge). + + Args: + remove_faces (bool, optional): If set to :obj:False, the face tensor + will not be removed. + """ + def __init__(self, remove_faces: bool = True) -> None: + self.remove_faces = remove_faces + + def forward(self, data: Data) -> Data: + if hasattr(data, 'face'): + assert data.face is not None + face = data.face + edge_index = paddle.concat([face[:2], face[1:], face[::2]], axis=1) + edge_index = to_undirected(edge_index, num_nodes=data.num_nodes) + + data.edge_index = edge_index + if self.remove_faces: + data.face = None + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/feature_propagation.py b/jointContribution/mattergen/paddle_geometric/transforms/feature_propagation.py new file mode 100644 index 00000000..f9d1b7ed --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/feature_propagation.py @@ -0,0 +1,83 @@ +from paddle import Tensor +import paddle +import paddle_geometric +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import is_paddle_sparse_tensor, to_paddle_csc_tensor + + +@functional_transform('feature_propagation') +class FeaturePropagation(BaseTransform): + r"""The feature propagation operator from the `"On the Unreasonable + Effectiveness of Feature propagation in Learning on Graphs with Missing + Node Features" `_ paper + (functional name: :obj:`feature_propagation`). + + .. math:: + \mathbf{X}^{(0)} &= (1 - \mathbf{M}) \cdot \mathbf{X} + + \mathbf{X}^{(\ell + 1)} &= \mathbf{X}^{(0)} + \mathbf{M} \cdot + (\mathbf{D}^{-1/2} \mathbf{A} \mathbf{D}^{-1/2} \mathbf{X}^{(\ell)}) + + where missing node features are inferred by known features via propagation. + + .. code-block:: python + + from paddle_geometric.transforms import FeaturePropagation + + transform = FeaturePropagation(missing_mask=paddle.isnan(data.x)) + data = transform(data) + + Args: + missing_mask (paddle.Tensor): Mask matrix + :math:`\mathbf{M} \in {\{ 0, 1 \}}^{N\times F}` indicating missing + node features. + num_iterations (int, optional): The number of propagations. + (default: :obj:`40`) + """ + def __init__(self, missing_mask: Tensor, num_iterations: int = 40) -> None: + self.missing_mask = missing_mask + self.num_iterations = num_iterations + + def forward(self, data: Data) -> Data: + assert data.x is not None + assert data.edge_index is not None or data.adj_t is not None + + assert data.x.shape == self.missing_mask.shape + gcn_norm = paddle_geometric.nn.conv.gcn_conv.gcn_norm + + missing_mask = self.missing_mask.cast('bool') + known_mask = ~missing_mask + + if data.edge_index is not None: + edge_weight = data.edge_attr + if 'edge_weight' in data: + edge_weight = data.edge_weight + adj_t = to_paddle_csc_tensor( + edge_index=data.edge_index, + edge_attr=edge_weight, + size=data.num_nodes, + ).t() + adj_t, _ = gcn_norm(adj_t, add_self_loops=False) + elif is_paddle_sparse_tensor(data.adj_t): + adj_t, _ = gcn_norm(data.adj_t, add_self_loops=False) + else: + adj_t = gcn_norm(data.adj_t, add_self_loops=False) + + x = data.x.clone() + x[missing_mask] = 0. + + out = x + for _ in range(self.num_iterations): + out = paddle.sparse.sparse_matmul(adj_t, out) + out = paddle.where(known_mask, x, out) # Reset. + data.x = out + + return data + + def __repr__(self) -> str: + na_values = (self.missing_mask.sum().item() / self.missing_mask.numel().item()) * 100 + return (f'{self.__class__.__name__}(' + f'missing_features={na_values:.1f}%, ' + f'num_iterations={self.num_iterations})') \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/transforms/fixed_points.py b/jointContribution/mattergen/paddle_geometric/transforms/fixed_points.py new file mode 100644 index 00000000..af478eb2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/fixed_points.py @@ -0,0 +1,67 @@ +import math +import re + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('fixed_points') +class FixedPoints(BaseTransform): + r"""Samples a fixed number of points and features from a point cloud + (functional name: :obj:`fixed_points`). + + Args: + num (int): The number of points to sample. + replace (bool, optional): If set to :obj:`False`, samples points + without replacement. (default: :obj:`True`) + allow_duplicates (bool, optional): In case :obj:`replace` is + :obj`False` and :obj:`num` is greater than the number of points, + this option determines whether to add duplicated nodes to the + output points or not. + In case :obj:`allow_duplicates` is :obj:`False`, the number of + output points might be smaller than :obj:`num`. + In case :obj:`allow_duplicates` is :obj:`True`, the number of + duplicated points are kept to a minimum. (default: :obj:`False`) + """ + def __init__( + self, + num: int, + replace: bool = True, + allow_duplicates: bool = False, + ): + self.num = num + self.replace = replace + self.allow_duplicates = allow_duplicates + + def forward(self, data: Data) -> Data: + num_nodes = data.num_nodes + assert num_nodes is not None + + if self.replace: + choice = paddle.to_tensor( + np.random.choice(num_nodes, self.num, replace=True)).astype('int64') + elif not self.allow_duplicates: + choice = paddle.randperm(num_nodes)[:self.num] + else: + choice = paddle.concat([ + paddle.randperm(num_nodes) + for _ in range(math.ceil(self.num / num_nodes)) + ], axis=0)[:self.num] + + for key, value in data.items(): + if key == 'num_nodes': + data.num_nodes = choice.shape[0] + elif bool(re.search('edge', key)): + continue + elif isinstance(value, Tensor) and value.shape[0] == num_nodes and value.shape[0] != 1: + data[key] = paddle.index_select(value, choice) + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.num}, replace={self.replace})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/gcn_norm.py b/jointContribution/mattergen/paddle_geometric/transforms/gcn_norm.py new file mode 100644 index 00000000..5d6dc0af --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/gcn_norm.py @@ -0,0 +1,38 @@ +import paddle_geometric +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('gcn_norm') +class GCNNorm(BaseTransform): + r"""Applies the GCN normalization from the `"Semi-supervised Classification + with Graph Convolutional Networks" `_ + paper (functional name: :obj:`gcn_norm`). + + .. math:: + \mathbf{\hat{A}} = \mathbf{\hat{D}}^{-1/2} (\mathbf{A} + \mathbf{I}) + \mathbf{\hat{D}}^{-1/2} + + where :math:`\hat{D}_{ii} = \sum_{j=0} \hat{A}_{ij} + 1`. + """ + def __init__(self, add_self_loops: bool = True): + self.add_self_loops = add_self_loops + + def forward(self, data: Data) -> Data: + gcn_norm = paddle_geometric.nn.conv.gcn_conv.gcn_norm + assert 'edge_index' in data or 'adj_t' in data + + if 'edge_index' in data: + data.edge_index, data.edge_weight = gcn_norm( + data.edge_index, data.edge_weight, data.num_nodes, + add_self_loops=self.add_self_loops) + else: + data.adj_t = gcn_norm(data.adj_t, + add_self_loops=self.add_self_loops) + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(' + f'add_self_loops={self.add_self_loops})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/gdc.py b/jointContribution/mattergen/paddle_geometric/transforms/gdc.py new file mode 100644 index 00000000..a2d50fa9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/gdc.py @@ -0,0 +1,304 @@ +from typing import Any, Dict, Tuple + +import numpy as np +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import ( + add_self_loops, + coalesce, + get_ppr, + is_undirected, + scatter, + sort_edge_index, + to_dense_adj, +) + + +@functional_transform('gdc') +class GDC(BaseTransform): + r"""Processes the graph via Graph Diffusion Convolution (GDC) from the + `"Diffusion Improves Graph Learning" `_ + paper (functional name: :obj:`gdc`). + + Args: + self_loop_weight (float, optional): Weight of the added self-loop. + Set to :obj:`None` to add no self-loops. (default: :obj:`1`) + normalization_in (str, optional): Normalization of the transition + matrix on the original (input) graph. Options are: + :obj:`"sym"`, :obj:`"col"`, and :obj:`"row"`. + normalization_out (str, optional): Normalization of the transition + matrix on the transformed GDC (output) graph. Options are: + :obj:`"sym"`, :obj:`"col"`, :obj:`"row"`, and :obj:`None`. + diffusion_kwargs (dict, optional): Parameters for diffusion method. + Options for `method` include :obj:`"ppr"`, :obj:`"heat"`, + and :obj:`"coeff"`. Additional parameters are specific to the method. + sparsification_kwargs (dict, optional): Parameters for sparsification. + Options for `method` include :obj:`"threshold"` and :obj:`"topk"`. + exact (bool, optional): If True, calculate the exact diffusion + matrix (not scalable for large graphs). (default: :obj:`True`) + """ + def __init__( + self, + self_loop_weight: float = 1., + normalization_in: str = 'sym', + normalization_out: str = 'col', + diffusion_kwargs: Dict[str, Any] = dict(method='ppr', alpha=0.15), + sparsification_kwargs: Dict[str, Any] = dict( + method='threshold', + avg_degree=64, + ), + exact: bool = True, + ) -> None: + self.self_loop_weight = self_loop_weight + self.normalization_in = normalization_in + self.normalization_out = normalization_out + self.diffusion_kwargs = diffusion_kwargs + self.sparsification_kwargs = sparsification_kwargs + self.exact = exact + + if self_loop_weight: + assert exact or self_loop_weight == 1 + + @paddle.no_grad() + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + edge_index = data.edge_index + N = data.num_nodes + assert N is not None + + if data.edge_attr is None: + edge_weight = paddle.ones([edge_index.shape[1]]) + else: + edge_weight = data.edge_attr + assert self.exact + assert edge_weight.ndim == 1 + + if self.self_loop_weight: + edge_index, edge_weight = add_self_loops( + edge_index, edge_weight, fill_value=self.self_loop_weight, + num_nodes=N) + + edge_index, edge_weight = coalesce(edge_index, edge_weight, N) + + if self.exact: + edge_index, edge_weight = self.transition_matrix( + edge_index, edge_weight, N, self.normalization_in) + diff_mat = self.diffusion_matrix_exact(edge_index, edge_weight, N, + **self.diffusion_kwargs) + edge_index, edge_weight = self.sparsify_dense( + diff_mat, **self.sparsification_kwargs) + else: + edge_index, edge_weight = self.diffusion_matrix_approx( + edge_index, edge_weight, N, self.normalization_in, + **self.diffusion_kwargs) + edge_index, edge_weight = self.sparsify_sparse( + edge_index, edge_weight, N, **self.sparsification_kwargs) + + edge_index, edge_weight = coalesce(edge_index, edge_weight, N) + edge_index, edge_weight = self.transition_matrix( + edge_index, edge_weight, N, self.normalization_out) + + data.edge_index = edge_index + data.edge_attr = edge_weight + + return data + + def transition_matrix( + self, + edge_index: Tensor, + edge_weight: Tensor, + num_nodes: int, + normalization: str, + ) -> Tuple[Tensor, Tensor]: + if normalization == 'sym': + row, col = edge_index + deg = scatter(edge_weight, col, dim=0, reduce='sum') + deg_inv_sqrt = paddle.pow(deg, -0.5) + deg_inv_sqrt = paddle.where(paddle.isinf(deg_inv_sqrt), paddle.zeros_like(deg_inv_sqrt), deg_inv_sqrt) + edge_weight = deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col] + elif normalization == 'col': + _, col = edge_index + deg = scatter(edge_weight, col, dim=0, reduce='sum') + deg_inv = 1. / deg + deg_inv = paddle.where(paddle.isinf(deg_inv), paddle.zeros_like(deg_inv), deg_inv) + edge_weight = edge_weight * deg_inv[col] + elif normalization == 'row': + row, _ = edge_index + deg = scatter(edge_weight, row, dim=0, reduce='sum') + deg_inv = 1. / deg + deg_inv = paddle.where(paddle.isinf(deg_inv), paddle.zeros_like(deg_inv), deg_inv) + edge_weight = edge_weight * deg_inv[row] + elif normalization is None: + pass + else: + raise ValueError(f"Transition matrix normalization '{normalization}' unknown") + + return edge_index, edge_weight + + def diffusion_matrix_exact( + self, + edge_index: Tensor, + edge_weight: Tensor, + num_nodes: int, + method: str, + **kwargs: Any, + ) -> Tensor: + if method == 'ppr': + edge_weight = (kwargs['alpha'] - 1) * edge_weight + edge_index, edge_weight = add_self_loops(edge_index, edge_weight, + fill_value=1, + num_nodes=num_nodes) + mat = to_dense_adj(edge_index, edge_attr=edge_weight).squeeze() + diff_matrix = kwargs['alpha'] * paddle.inverse(mat) + + elif method == 'heat': + edge_index, edge_weight = add_self_loops(edge_index, edge_weight, + fill_value=-1, + num_nodes=num_nodes) + edge_weight = kwargs['t'] * edge_weight + mat = to_dense_adj(edge_index, edge_attr=edge_weight).squeeze() + undirected = is_undirected(edge_index, edge_weight, num_nodes) + diff_matrix = self.__expm__(mat, undirected) + + elif method == 'coeff': + adj_matrix = to_dense_adj(edge_index, + edge_attr=edge_weight).squeeze() + mat = paddle.eye(num_nodes) + + diff_matrix = kwargs['coeffs'][0] * mat + for coeff in kwargs['coeffs'][1:]: + mat = paddle.matmul(mat, adj_matrix) + diff_matrix += coeff * mat + else: + raise ValueError(f"Exact GDC diffusion '{method}' unknown") + + return diff_matrix + + def diffusion_matrix_approx( + self, + edge_index: Tensor, + edge_weight: Tensor, + num_nodes: int, + normalization: str, + method: str, + **kwargs: Any, + ) -> Tuple[Tensor, Tensor]: + if method == 'ppr': + if normalization == 'sym': + _, col = edge_index + deg = scatter(edge_weight, col, dim=0, reduce='sum') + + edge_index, edge_weight = get_ppr( + edge_index, + alpha=kwargs['alpha'], + eps=kwargs['eps'], + num_nodes=num_nodes, + ) + + if normalization == 'col': + edge_index, edge_weight = sort_edge_index( + edge_index.flip([0]), edge_weight, num_nodes) + + if normalization == 'sym': + row, col = edge_index + deg_inv = paddle.sqrt(deg) + deg_inv_sqrt = paddle.pow(deg, -0.5) + deg_inv_sqrt = paddle.where(paddle.isinf(deg_inv_sqrt), paddle.zeros_like(deg_inv_sqrt), deg_inv_sqrt) + edge_weight = deg_inv[row] * edge_weight * deg_inv_sqrt[col] + elif normalization in ['col', 'row']: + pass + else: + raise ValueError( + f"Transition matrix normalization '{normalization}' not " + f"implemented for non-exact GDC computation") + + elif method == 'heat': + raise NotImplementedError('Currently no fast heat kernel is implemented.') + else: + raise ValueError(f"Approximate GDC diffusion '{method}' unknown") + + return edge_index, edge_weight + + def sparsify_dense( + self, + matrix: Tensor, + method: str, + **kwargs: Any, + ) -> Tuple[Tensor, Tensor]: + assert matrix.shape[0] == matrix.shape[1] + N = matrix.shape[1] + + if method == 'threshold': + if 'eps' not in kwargs.keys(): + kwargs['eps'] = self.__calculate_eps__(matrix, N, + kwargs['avg_degree']) + + edge_index = paddle.nonzero(matrix >= kwargs['eps'], as_tuple=False).t() + edge_index_flat = edge_index[0] * N + edge_index[1] + edge_weight = paddle.flatten(matrix)[edge_index_flat] + + elif method == 'topk': + k, dim = min(N, kwargs['k']), kwargs['dim'] + assert dim in [0, 1] + sort_idx = paddle.argsort(matrix, axis=dim, descending=True) + if dim == 0: + top_idx = sort_idx[:k] + edge_weight = paddle.gather(matrix, axis=dim, index=top_idx).flatten() + + row_idx = paddle.arange(0, N).tile([k]) + edge_index = paddle.stack([top_idx.flatten(), row_idx], axis=0) + else: + top_idx = sort_idx[:, :k] + edge_weight = paddle.gather(matrix, axis=dim, index=top_idx).flatten() + + col_idx = paddle.arange(0, N).tile([k]) + edge_index = paddle.stack([col_idx, top_idx.flatten()], axis=0) + else: + raise ValueError(f"GDC sparsification '{method}' unknown") + + return edge_index, edge_weight + + def sparsify_sparse( + self, + edge_index: Tensor, + edge_weight: Tensor, + num_nodes: int, + method: str, + **kwargs: Any, + ) -> Tuple[Tensor, Tensor]: + if method == 'threshold': + if 'eps' not in kwargs.keys(): + kwargs['eps'] = self.__calculate_eps__(edge_weight, num_nodes, kwargs['avg_degree']) + + remaining_edge_idx = paddle.nonzero(edge_weight >= kwargs['eps'], as_tuple=False).flatten() + edge_index = edge_index[:, remaining_edge_idx] + edge_weight = edge_weight[remaining_edge_idx] + elif method == 'topk': + raise NotImplementedError('Sparse topk sparsification not implemented') + else: + raise ValueError(f"GDC sparsification '{method}' unknown") + + return edge_index, edge_weight + + def __expm__(self, matrix: Tensor, symmetric: bool) -> Tensor: + from scipy.linalg import expm + + if symmetric: + e, V = paddle.linalg.eigh(matrix, UPLO='U') + diff_mat = V @ paddle.diag(paddle.exp(e)) @ V.t() + else: + diff_mat = paddle.to_tensor(expm(matrix.numpy())) + return diff_mat + + def __calculate_eps__(self, matrix: Tensor, num_nodes: int, avg_degree: int) -> float: + sorted_edges = paddle.sort(paddle.flatten(matrix), descending=True) + if avg_degree * num_nodes > len(sorted_edges): + return -np.inf + + left = sorted_edges[avg_degree * num_nodes - 1] + right = sorted_edges[avg_degree * num_nodes] + return float((left + right) / 2.0) diff --git a/jointContribution/mattergen/paddle_geometric/transforms/generate_mesh_normals.py b/jointContribution/mattergen/paddle_geometric/transforms/generate_mesh_normals.py new file mode 100644 index 00000000..76eebee0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/generate_mesh_normals.py @@ -0,0 +1,31 @@ +import paddle.nn.functional as F +import paddle +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import scatter + + +@functional_transform('generate_mesh_normals') +class GenerateMeshNormals(BaseTransform): + r"""Generate normal vectors for each mesh node based on neighboring + faces (functional name: :obj:`generate_mesh_normals`). + """ + def forward(self, data: Data) -> Data: + assert data.pos is not None + assert data.face is not None + pos, face = data.pos, data.face + + vec1 = pos[face[1]] - pos[face[0]] + vec2 = pos[face[2]] - pos[face[0]] + face_norm = F.normalize(paddle.cross(vec1, vec2, axis=1), p=2, axis=-1) # [F, 3] + + face_norm = paddle.repeat_interleave(face_norm, repeats=3, axis=0) + idx = face.flatten() + + norm = scatter(face_norm, idx, dim=0, reduce='sum', dim_size=pos.shape[0]) + norm = F.normalize(norm, p=2, axis=-1) # [N, 3] + + data.norm = norm + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/grid_sampling.py b/jointContribution/mattergen/paddle_geometric/transforms/grid_sampling.py new file mode 100644 index 00000000..43af2762 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/grid_sampling.py @@ -0,0 +1,67 @@ +import re +from typing import List, Optional, Union + +import paddle +from paddle import Tensor + +import paddle_geometric +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import one_hot, scatter + + +@functional_transform('grid_sampling') +class GridSampling(BaseTransform): + r"""Clusters points into fixed-sized voxels + (functional name: :obj:`grid_sampling`). + Each cluster returned is a new point based on the mean of all points + inside the given cluster. + + Args: + size (float or [float] or Tensor): Size of a voxel (in each dimension). + start (float or [float] or Tensor, optional): Start coordinates of the + grid (in each dimension). If set to :obj:`None`, will be set to the + minimum coordinates found in :obj:`data.pos`. + (default: :obj:`None`) + end (float or [float] or Tensor, optional): End coordinates of the grid + (in each dimension). If set to :obj:`None`, will be set to the + maximum coordinates found in :obj:`data.pos`. + (default: :obj:`None`) + """ + def __init__( + self, + size: Union[float, List[float], Tensor], + start: Optional[Union[float, List[float], Tensor]] = None, + end: Optional[Union[float, List[float], Tensor]] = None, + ) -> None: + self.size = size + self.start = start + self.end = end + + def forward(self, data: Data) -> Data: + num_nodes = data.num_nodes + + assert data.pos is not None + c = paddle_geometric.nn.voxel_grid(data.pos, self.size, data.batch, + self.start, self.end) + c, perm = paddle_geometric.nn.pool.consecutive.consecutive_cluster(c) + + for key, item in data.items(): + if bool(re.search('edge', key)): + raise ValueError(f"'{self.__class__.__name__}' does not " + f"support coarsening of edges") + + if isinstance(item, Tensor) and item.shape[0] == num_nodes: + if key == 'y': + item = scatter(one_hot(item), c, dim=0, reduce='sum') + data[key] = item.argmax(axis=-1) + elif key == 'batch': + data[key] = paddle.gather(item, perm) + else: + data[key] = scatter(item, c, dim=0, reduce='mean') + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(size={self.size})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/half_hop.py b/jointContribution/mattergen/paddle_geometric/transforms/half_hop.py new file mode 100644 index 00000000..a34cebe2 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/half_hop.py @@ -0,0 +1,100 @@ +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('half_hop') +class HalfHop(BaseTransform): + r"""The graph upsampling augmentation from the + `"Half-Hop: A Graph Upsampling Approach for Slowing Down Message Passing" + `_ paper. + The graph is augmented by adding artificial slow nodes between neighbors + to slow down message propagation. (functional name: :obj:`half_hop`). + + .. note:: + :class:`HalfHop` augmentation is not supported if :obj:`data` has + :attr:`edge_weight` or :attr:`edge_attr`. + + Args: + alpha (float, optional): The interpolation factor + used to compute slow node features + :math:`x = \alpha*x_src + (1-\alpha)*x_dst` (default: :obj:`0.5`) + p (float, optional): The probability of half-hopping + an edge. (default: :obj:`1.0`) + + .. code-block:: python + + import paddle_geometric.transforms as T + + transform = T.HalfHop(alpha=0.5) + data = transform(data) # Apply transformation. + out = model(data.x, data.edge_index) # Feed-forward. + out = out[~data.slow_node_mask] # Get rid of slow nodes. + """ + def __init__(self, alpha: float = 0.5, p: float = 1.0) -> None: + if alpha < 0. or alpha > 1.: + raise ValueError(f"Interpolation factor has to be between 0 and 1 " + f"(got '{alpha}'") + if p < 0. or p > 1.: + raise ValueError(f"Ratio of half-hopped edges has to be between " + f"0 and 1 (got '{p}'") + + self.p = p + self.alpha = alpha + + def forward(self, data: Data) -> Data: + if data.edge_weight is not None or data.edge_attr is not None: + raise ValueError("'HalfHop' augmentation is not supported if " + "'data' contains 'edge_weight' or 'edge_attr'") + + assert data.x is not None + assert data.edge_index is not None + x, edge_index = data.x, data.edge_index + num_nodes = data.num_nodes + assert num_nodes is not None + + # isolate self loops which are not half-hopped + self_loop_mask = edge_index[0] == edge_index[1] + edge_index_self_loop = edge_index[:, self_loop_mask] + edge_index = edge_index[:, ~self_loop_mask] + + # randomly sample nodes and half-hop their edges + node_mask = paddle.rand([num_nodes]) < self.p + edge_mask = paddle.gather(node_mask, edge_index[1]) + edge_index_to_halfhop = edge_index[:, edge_mask] + edge_index_to_keep = edge_index[:, ~edge_mask] + + # add new slow nodes of which features are initialized + # by linear interpolation + num_halfhop_edges = edge_index_to_halfhop.shape[1] + slow_node_ids = paddle.arange(num_halfhop_edges) + num_nodes + x_src = paddle.gather(x, edge_index_to_halfhop[0]) + x_dst = paddle.gather(x, edge_index_to_halfhop[1]) + x_slow_node = self.alpha * x_src + (1 - self.alpha) * x_dst + new_x = paddle.concat([x, x_slow_node], axis=0) + + # add new edges between slow nodes and the original nodes + edge_index_slow = [ + paddle.stack([edge_index_to_halfhop[0], slow_node_ids]), + paddle.stack([slow_node_ids, edge_index_to_halfhop[1]]), + paddle.stack([edge_index_to_halfhop[1], slow_node_ids]) + ] + new_edge_index = paddle.concat( + [edge_index_to_keep, edge_index_self_loop] + edge_index_slow, + axis=1) + + # prepare a mask that distinguishes between original nodes & slow nodes + slow_node_mask = paddle.concat( + [paddle.zeros([x.shape[0]]), paddle.ones([slow_node_ids.shape[0]])] + ).astype('bool') + + data.x, data.edge_index = new_x, new_edge_index + data.slow_node_mask = slow_node_mask + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(alpha={self.alpha}, p={self.p})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/knn_graph.py b/jointContribution/mattergen/paddle_geometric/transforms/knn_graph.py new file mode 100644 index 00000000..d0f40421 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/knn_graph.py @@ -0,0 +1,70 @@ +import paddle_geometric +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import to_undirected + + +@functional_transform('knn_graph') +class KNNGraph(BaseTransform): + r"""Creates a k-NN graph based on node positions :obj:`data.pos` + (functional name: :obj:`knn_graph`). + + Args: + k (int, optional): The number of neighbors. (default: :obj:`6`) + loop (bool, optional): If :obj:`True`, the graph will contain + self-loops. (default: :obj:`False`) + force_undirected (bool, optional): If set to :obj:`True`, new edges + will be undirected. (default: :obj:`False`) + flow (str, optional): The flow direction when used in combination with + message passing (:obj:`"source_to_target"` or + :obj:`"target_to_source"`). + If set to :obj:`"source_to_target"`, every target node will have + exactly :math:`k` source nodes pointing to it. + (default: :obj:`"source_to_target"`) + cosine (bool, optional): If :obj:`True`, will use the cosine + distance instead of Euclidean distance to find nearest neighbors. + (default: :obj:`False`) + num_workers (int): Number of workers to use for computation. Has no + effect if the input lies on the GPU. (default: :obj:`1`) + """ + def __init__( + self, + k: int = 6, + loop: bool = False, + force_undirected: bool = False, + flow: str = 'source_to_target', + cosine: bool = False, + num_workers: int = 1, + ) -> None: + self.k = k + self.loop = loop + self.force_undirected = force_undirected + self.flow = flow + self.cosine = cosine + self.num_workers = num_workers + + def forward(self, data: Data) -> Data: + assert data.pos is not None + + # Perform k-NN graph construction using paddle_geometric. + edge_index = paddle_geometric.nn.knn_graph( + data.pos, + self.k, + data.batch, + loop=self.loop, + flow=self.flow, + cosine=self.cosine, + num_workers=self.num_workers, + ) + + if self.force_undirected: + edge_index = to_undirected(edge_index, num_nodes=data.num_nodes) + + data.edge_index = edge_index + data.edge_attr = None + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(k={self.k})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/laplacian_lambda_max.py b/jointContribution/mattergen/paddle_geometric/transforms/laplacian_lambda_max.py new file mode 100644 index 00000000..a1dc2ce7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/laplacian_lambda_max.py @@ -0,0 +1,70 @@ +from typing import Optional + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import get_laplacian, to_scipy_sparse_matrix + + +@functional_transform('laplacian_lambda_max') +class LaplacianLambdaMax(BaseTransform): + r"""Computes the highest eigenvalue of the graph Laplacian given by + :meth:`paddle_geometric.utils.get_laplacian` + (functional name: :obj:`laplacian_lambda_max`). + + Args: + normalization (str, optional): The normalization scheme for the graph + Laplacian (default: :obj:`None`): + + 1. :obj:`None`: No normalization + :math:`\mathbf{L} = \mathbf{D} - \mathbf{A}` + + 2. :obj:`"sym"`: Symmetric normalization + :math:`\mathbf{L} = \mathbf{I} - \mathbf{D}^{-1/2} \mathbf{A} + \mathbf{D}^{-1/2}` + + 3. :obj:`"rw"`: Random-walk normalization + :math:`\mathbf{L} = \mathbf{I} - \mathbf{D}^{-1} \mathbf{A}` + is_undirected (bool, optional): If set to :obj:`True`, this transform + expects undirected graphs as input, and can hence speed up the + computation of the largest eigenvalue. (default: :obj:`False`) + """ + def __init__( + self, + normalization: Optional[str] = None, + is_undirected: bool = False, + ): + assert normalization in [None, 'sym', 'rw'], 'Invalid normalization' + self.normalization = normalization + self.is_undirected = is_undirected + + def forward(self, data: Data) -> Data: + from scipy.sparse.linalg import eigs, eigsh + + assert data.edge_index is not None + num_nodes = data.num_nodes + + edge_weight = data.edge_attr + if edge_weight is not None and edge_weight.numel() != data.num_edges: + edge_weight = None + + edge_index, edge_weight = get_laplacian( + data.edge_index, + edge_weight, + self.normalization, + num_nodes=num_nodes, + ) + + L = to_scipy_sparse_matrix(edge_index, edge_weight, num_nodes) + + eig_fn = eigs + if self.is_undirected and self.normalization != 'rw': + eig_fn = eigsh + + lambda_max = eig_fn(L, k=1, which='LM', return_eigenvectors=False) + data.lambda_max = lambda_max.real.item() + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(normalization={self.normalization})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/largest_connected_components.py b/jointContribution/mattergen/paddle_geometric/transforms/largest_connected_components.py new file mode 100644 index 00000000..ee8a0ee6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/largest_connected_components.py @@ -0,0 +1,58 @@ +import paddle +import numpy as np +import scipy.sparse as sp + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import to_scipy_sparse_matrix + + +@functional_transform('largest_connected_components') +class LargestConnectedComponents(BaseTransform): + r"""Selects the subgraph that corresponds to the + largest connected components in the graph + (functional name: :obj:`largest_connected_components`). + + Args: + num_components (int, optional): Number of largest components to keep + (default: :obj:`1`) + connection (str, optional): Type of connection to use for directed + graphs, can be either :obj:`'strong'` or :obj:`'weak'`. + Nodes `i` and `j` are strongly connected if a path + exists both from `i` to `j` and from `j` to `i`. A directed graph + is weakly connected if replacing all of its directed edges with + undirected edges produces a connected (undirected) graph. + (default: :obj:`'weak'`) + """ + def __init__( + self, + num_components: int = 1, + connection: str = 'weak', + ) -> None: + assert connection in ['strong', 'weak'], 'Unknown connection type' + self.num_components = num_components + self.connection = connection + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + + adj = to_scipy_sparse_matrix(data.edge_index, num_nodes=data.num_nodes) + + num_components, component = sp.csgraph.connected_components( + adj, connection=self.connection) + + if num_components <= self.num_components: + return data + + _, count = np.unique(component, return_counts=True) + subset_np = np.in1d(component, count.argsort()[-self.num_components:]) + subset = paddle.to_tensor(subset_np, dtype=paddle.bool) + + # Ensure that the tensor is on the same device as `edge_index` + # subset = subset.cast(data.edge_index.dtype) + + return data.subgraph(subset) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.num_components})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/line_graph.py b/jointContribution/mattergen/paddle_geometric/transforms/line_graph.py new file mode 100644 index 00000000..a90a0c03 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/line_graph.py @@ -0,0 +1,98 @@ +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import coalesce, cumsum, remove_self_loops, scatter + + +@functional_transform('line_graph') +class LineGraph(BaseTransform): + r"""Converts a graph to its corresponding line-graph + (functional name: :obj:`line_graph`). + + .. math:: + L(\mathcal{G}) &= (\mathcal{V}^{\prime}, \mathcal{E}^{\prime}) + + \mathcal{V}^{\prime} &= \mathcal{E} + + \mathcal{E}^{\prime} &= \{ (e_1, e_2) : e_1 \cap e_2 \neq \emptyset \} + + Line-graph node indices are equal to indices in the original graph's + coalesced :obj:`edge_index`. + For undirected graphs, the maximum line-graph node index is + :obj:`(data.edge_index.size(1) // 2) - 1`. + + New node features are given by old edge attributes. + For undirected graphs, edge attributes for reciprocal edges + :obj:`(row, col)` and :obj:`(col, row)` get summed together. + + Args: + force_directed (bool, optional): If set to :obj:`True`, the graph will + be always treated as a directed graph. (default: :obj:`False`) + """ + def __init__(self, force_directed: bool = False) -> None: + self.force_directed = force_directed + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + edge_index, edge_attr = data.edge_index, data.edge_attr + N = data.num_nodes + + edge_index, edge_attr = coalesce(edge_index, edge_attr, num_nodes=N) + row, col = edge_index + + if self.force_directed or data.is_directed(): + i = paddle.arange(row.shape[0], dtype=paddle.int64) + + count = scatter(paddle.ones_like(row), row, dim=0, + dim_size=data.num_nodes, reduce='sum') + ptr = cumsum(count) + + cols = [i[ptr[col[j]]:ptr[col[j] + 1]] for j in range(col.shape[0])] + rows = [paddle.full((c.shape[0],), j, dtype=paddle.int64) for j, c in enumerate(cols)] + + row, col = paddle.concat(rows, axis=0), paddle.concat(cols, axis=0) + + data.edge_index = paddle.stack([row, col], axis=0) + data.x = data.edge_attr + data.num_nodes = edge_index.shape[1] + + else: + mask = row < col + row, col = row[mask], col[mask] + i = paddle.arange(row.shape[0], dtype=paddle.int64) + + (row, col), i = coalesce( + paddle.stack([ + paddle.concat([row, col], axis=0), + paddle.concat([col, row], axis=0) + ], axis=0), + paddle.concat([i, i], axis=0), + N, + ) + + count = scatter(paddle.ones_like(row), row, dim=0, + dim_size=data.num_nodes, reduce='sum') + joints = list(paddle.split(i, count.tolist())) + + def generate_grid(x: Tensor) -> Tensor: + row = x.unsqueeze(-1).expand([x.shape[0], x.shape[0]]).flatten() + col = x.expand([x.shape[0], x.shape[0]]).flatten() + return paddle.stack([row, col], axis=0) + + joints = [generate_grid(joint) for joint in joints] + joint = paddle.concat(joints, axis=1) + joint, _ = remove_self_loops(joint) + N = row.shape[0] // 2 + joint = coalesce(joint, num_nodes=N) + + if edge_attr is not None: + data.x = scatter(edge_attr, i, dim=0, dim_size=N, reduce='sum') + data.edge_index = joint + data.num_nodes = edge_index.shape[1] // 2 + + data.edge_attr = None + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/linear_transformation.py b/jointContribution/mattergen/paddle_geometric/transforms/linear_transformation.py new file mode 100644 index 00000000..985ca487 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/linear_transformation.py @@ -0,0 +1,51 @@ +from typing import Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('linear_transformation') +class LinearTransformation(BaseTransform): + r"""Transforms node positions :obj:`data.pos` with a square transformation + matrix computed offline (functional name: :obj:`linear_transformation`). + + Args: + matrix (Tensor): Tensor with shape :obj:`[D, D]` where :obj:`D` + corresponds to the dimensionality of node positions. + """ + def __init__(self, matrix: Tensor): + if not isinstance(matrix, Tensor): + matrix = paddle.to_tensor(matrix) + assert matrix.ndim == 2, ( + 'Transformation matrix should be two-dimensional.') + assert matrix.shape[0] == matrix.shape[1], ( + f'Transformation matrix should be square (got {matrix.shape})') + + # Store the matrix as its transpose. + # We do this to enable post-multiplication in `forward`. + self.matrix = matrix.T + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.node_stores: + if not hasattr(store, 'pos'): + continue + + pos = store.pos.reshape([-1, 1]) if store.pos.ndim == 1 else store.pos + assert pos.shape[-1] == self.matrix.shape[-2], ( + 'Node position matrix and transformation matrix have ' + 'incompatible shapes') + # Post-multiply the points by the transformation matrix + # instead of pre-multiplying, to preserve shape `[N, D]`. + store.pos = paddle.matmul(pos, self.matrix.cast(pos.dtype)) + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(\n{self.matrix.numpy()}\n)' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/local_cartesian.py b/jointContribution/mattergen/paddle_geometric/transforms/local_cartesian.py new file mode 100644 index 00000000..5f440b18 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/local_cartesian.py @@ -0,0 +1,58 @@ +from typing import Tuple + +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import scatter + + +@functional_transform('local_cartesian') +class LocalCartesian(BaseTransform): + r"""Saves the relative Cartesian coordinates of linked nodes in its edge + attributes (functional name: :obj:`local_cartesian`). Each coordinate gets + *neighborhood-normalized* to a specified interval + (:math:`[0, 1]` by default). + + Args: + norm (bool, optional): If set to :obj:`False`, the output will not be + normalized. (default: :obj:`True`) + cat (bool, optional): If set to :obj:`False`, all existing edge + attributes will be replaced. (default: :obj:`True`) + interval ((float, float), optional): A tuple specifying the lower and + upper bound for normalization. (default: :obj:`(0.0, 1.0)`) + """ + def __init__( + self, + norm: bool = True, + cat: bool = True, + interval: Tuple[float, float] = (0.0, 1.0), + ): + self.norm = norm + self.cat = cat + self.interval = interval + + def forward(self, data: Data) -> Data: + assert data.pos is not None + assert data.edge_index is not None + (row, col), pos, pseudo = data.edge_index, data.pos, data.edge_attr + + cart = pos[row] - pos[col] + cart = cart.reshape([-1, 1]) if cart.ndim == 1 else cart + + if self.norm: + max_value = scatter(cart.abs(), col, 0, pos.shape[0], reduce='max') + max_value = max_value.max(axis=-1, keepdim=True) + + length = self.interval[1] - self.interval[0] + center = (self.interval[0] + self.interval[1]) / 2 + cart = length * cart / (2 * max_value[col]) + center + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, cart.astype(pseudo.dtype)], axis=-1) + else: + data.edge_attr = cart + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/local_degree_profile.py b/jointContribution/mattergen/paddle_geometric/transforms/local_degree_profile.py new file mode 100644 index 00000000..ea8ee28f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/local_degree_profile.py @@ -0,0 +1,41 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import degree + + +@functional_transform('local_degree_profile') +class LocalDegreeProfile(BaseTransform): + r"""Appends the Local Degree Profile (LDP) from the `"A Simple yet + Effective Baseline for Non-attribute Graph Classification" + `_ paper + (functional name: :obj:`local_degree_profile`). + + .. math:: + \mathbf{x}_i = \mathbf{x}_i \, \Vert \, (\deg(i), \min(DN(i)), + \max(DN(i)), \textrm{mean}(DN(i)), \textrm{std}(DN(i))) + + to the node features, where :math:`DN(i) = \{ \deg(j) \mid j \in + \mathcal{N}(i) \}`. + """ + def __init__(self) -> None: + from paddle_geometric.nn.aggr.fused import FusedAggregation + self.aggr = FusedAggregation(['min', 'max', 'mean', 'std']) + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + row, col = data.edge_index + num_nodes = data.num_nodes + + deg = degree(row, num_nodes, dtype='float32').reshape([-1, 1]) + xs = [deg] + self.aggr(deg[col], row, dim_size=num_nodes) + + if data.x is not None: + data.x = data.x.reshape([-1, 1]) if data.x.ndim == 1 else data.x + data.x = paddle.concat([data.x] + xs, axis=-1) + else: + data.x = paddle.concat(xs, axis=-1) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/mask.py b/jointContribution/mattergen/paddle_geometric/transforms/mask.py new file mode 100644 index 00000000..34e204be --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/mask.py @@ -0,0 +1,136 @@ +from typing import List, Optional, Sequence, Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.data.storage import BaseStorage +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import index_to_mask, mask_to_index + +AnyData = Union[Data, HeteroData] + + +def get_attrs_with_suffix( + attrs: Optional[List[str]], + store: BaseStorage, + suffix: str, +) -> List[str]: + if attrs is not None: + return attrs + return [key for key in store.keys() if key.endswith(suffix)] + + +def get_mask_size( + attr: str, + store: BaseStorage, + size: Optional[int], +) -> Optional[int]: + if size is not None: + return size + return store.num_edges if store.is_edge_attr(attr) else store.num_nodes + + +@functional_transform('index_to_mask') +class IndexToMask(BaseTransform): + r"""Converts indices to a mask representation + (functional name: :obj:`index_to_mask`). + + Args: + attrs (str, [str], optional): If given, will only perform index to mask + conversion for the given attributes. If omitted, will infer the + attributes from the suffix :obj:`_index`. (default: :obj:`None`) + sizes (int, [int], optional): The size of the mask. If set to + :obj:`None`, an automatically sized tensor is returned. The number + of nodes will be used by default, except for edge attributes which + will use the number of edges as the mask size. + (default: :obj:`None`) + replace (bool, optional): if set to :obj:`True` replaces the index + attributes with mask tensors. (default: :obj:`False`) + """ + def __init__( + self, + attrs: Optional[Union[str, List[str]]] = None, + sizes: Optional[Union[int, List[int]]] = None, + replace: bool = False, + ) -> None: + self.attrs = [attrs] if isinstance(attrs, str) else attrs + self.sizes = sizes + self.replace = replace + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.stores: + attrs = get_attrs_with_suffix(self.attrs, store, '_index') + + sizes: Sequence[Optional[int]] + if isinstance(self.sizes, int): + sizes = [self.sizes] * len(attrs) + elif isinstance(self.sizes, (list, tuple)): + if len(attrs) != len(self.sizes): + raise ValueError( + f"The number of attributes (got {len(attrs)}) must " + f"match the number of sizes provided " + f"(got {len(self.sizes)})") + sizes = self.sizes + else: + sizes = [None] * len(attrs) + + for attr, size in zip(attrs, sizes): + if 'edge_index' in attr: + continue + if attr not in store: + continue + size = get_mask_size(attr, store, size) + mask = index_to_mask(store[attr], size=size) + store[f'{attr[:-6]}_mask'] = mask + if self.replace: + del store[attr] + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(attrs={self.attrs}, ' + f'sizes={self.sizes}, replace={self.replace})') + + +@functional_transform('mask_to_index') +class MaskToIndex(BaseTransform): + r"""Converts a mask to an index representation + (functional name: :obj:`mask_to_index`). + + Args: + attrs (str, [str], optional): If given, will only perform mask to index + conversion for the given attributes. If omitted, will infer the + attributes from the suffix :obj:`_mask` (default: :obj:`None`) + replace (bool, optional): if set to :obj:`True` replaces the mask + attributes with index tensors. (default: :obj:`False`) + """ + def __init__( + self, + attrs: Optional[Union[str, List[str]]] = None, + replace: bool = False, + ): + self.attrs = [attrs] if isinstance(attrs, str) else attrs + self.replace = replace + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.stores: + attrs = get_attrs_with_suffix(self.attrs, store, '_mask') + + for attr in attrs: + if attr not in store: + continue + index = mask_to_index(store[attr]) + store[f'{attr[:-5]}_index'] = index + if self.replace: + del store[attr] + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(attrs={self.attrs}, ' + f'replace={self.replace})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/node_property_split.py b/jointContribution/mattergen/paddle_geometric/transforms/node_property_split.py new file mode 100644 index 00000000..ecdef4e5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/node_property_split.py @@ -0,0 +1,162 @@ +from typing import Any, Dict, List + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import to_networkx + + +@functional_transform('node_property_split') +class NodePropertySplit(BaseTransform): + r"""Creates a node-level split with distributional shift based on a given + node property, as proposed in the `"Evaluating Robustness and Uncertainty + of Graph Models Under Structural Distributional Shifts" + `__ paper + (functional name: :obj:`node_property_split`). + + It splits the nodes in a given graph into five non-intersecting parts + based on their structural properties. + This can be used for transductive node prediction tasks with distributional + shifts. + It considers the in-distribution (ID) and out-of-distribution (OOD) subsets + of nodes. + The ID subset includes training, validation and testing parts, while + the OOD subset includes validation and testing parts. + As a result, it creates five associated node mask vectors for each graph, + three which are for the ID nodes (:obj:`id_train_mask`, + :obj:`id_val_mask`, :obj:`id_test_mask`), and two which are for the OOD + nodes (:obj:`ood_val_mask`, :obj:`ood_test_mask`). + + This class implements three particular strategies for inducing + distributional shifts in a graph — based on **popularity**, **locality** + or **density**. + + Args: + property_name (str): The name of the node property to be used + (:obj:`"popularity"`, :obj:`"locality"`, :obj:`"density"`). + ratios ([float]): A list of five ratio values for ID training, + ID validation, ID test, OOD validation and OOD test parts. + The values must sum to :obj:`1.0`. + ascending (bool, optional): Whether to sort nodes in ascending order + of the node property, so that nodes with greater values of the + property are considered to be OOD (default: :obj:`True`) + + .. code-block:: python + + from paddle_geometric.transforms import NodePropertySplit + from paddle_geometric.datasets.graph_generator import ERGraph + + data = ERGraph(num_nodes=1000, edge_prob=0.4)() + + property_name = 'popularity' + ratios = [0.3, 0.1, 0.1, 0.3, 0.2] + transform = NodePropertySplit(property_name, ratios) + + data = transform(data) + """ + def __init__( + self, + property_name: str, + ratios: List[float], + ascending: bool = True, + ): + if property_name not in {'popularity', 'locality', 'density'}: + raise ValueError(f"Unexpected 'property_name' " + f"(got '{property_name}')") + + if len(ratios) != 5: + raise ValueError(f"'ratios' must contain 5 values " + f"(got {len(ratios)})") + + if sum(ratios) != 1.0: + raise ValueError(f"'ratios' must sum to 1.0 (got {sum(ratios)})") + + self.property_name = property_name + self.compute_fn = _property_name_to_compute_fn[property_name] + self.ratios = ratios + self.ascending = ascending + + def forward(self, data: Data) -> Data: + G = to_networkx(data, to_undirected=True, remove_self_loops=True) + property_values = self.compute_fn(G, self.ascending) + mask_dict = self._mask_nodes_by_property(property_values, self.ratios) + + for key, mask in mask_dict.items(): + data[key] = mask + + return data + + @staticmethod + def _compute_popularity_property(G: Any, ascending: bool = True) -> Tensor: + import networkx.algorithms as A + + property_values = paddle.to_tensor(list(A.pagerank(G).values())) + property_values *= -1 if ascending else 1 + return property_values + + @staticmethod + def _compute_locality_property(G: Any, ascending: bool = True) -> Tensor: + import networkx.algorithms as A + + pagerank_values = paddle.to_tensor(list(A.pagerank(G).values())) + + num_nodes = G.number_of_nodes() + personalization = dict(zip(range(num_nodes), [0.0] * num_nodes)) + personalization[int(pagerank_values.argmax())] = 1.0 + + property_values = paddle.to_tensor( + list(A.pagerank(G, personalization=personalization).values())) + property_values *= -1 if ascending else 1 + return property_values + + @staticmethod + def _compute_density_property(G: Any, ascending: bool = True) -> Tensor: + import networkx.algorithms as A + + property_values = paddle.to_tensor(list(A.clustering(G).values())) + property_values *= -1 if ascending else 1 + return property_values + + @staticmethod + def _mask_nodes_by_property( + property_values: Tensor, + ratios: List[float], + ) -> Dict[str, Tensor]: + + num_nodes = property_values.shape[0] + sizes = (num_nodes * paddle.to_tensor(ratios)).round().astype('int64') + sizes[-1] -= sizes.sum() - num_nodes + + perm = paddle.randperm(num_nodes) + id_size = int(sizes[:3].sum()) + perm = perm[property_values[perm].argsort()] + perm[:id_size] = perm[:id_size][paddle.randperm(id_size)] + + node_splits = perm.split(sizes.tolist()) + names = [ + 'id_train_mask', + 'id_val_mask', + 'id_test_mask', + 'ood_val_mask', + 'ood_test_mask', + ] + + split_masks = {} + for name, node_split in zip(names, node_splits): + split_mask = paddle.zeros(num_nodes, dtype=paddle.bool) + split_mask[node_split] = True + split_masks[name] = split_mask + return split_masks + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.property_name})' + + +_property_name_to_compute_fn = { + 'popularity': NodePropertySplit._compute_popularity_property, + 'locality': NodePropertySplit._compute_locality_property, + 'density': NodePropertySplit._compute_density_property, +} diff --git a/jointContribution/mattergen/paddle_geometric/transforms/normalize_features.py b/jointContribution/mattergen/paddle_geometric/transforms/normalize_features.py new file mode 100644 index 00000000..6ae357e6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/normalize_features.py @@ -0,0 +1,30 @@ +from typing import List, Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('normalize_features') +class NormalizeFeatures(BaseTransform): + r"""Row-normalizes the attributes given in :obj:`attrs` to sum-up to one + (functional name: :obj:`normalize_features`). + + Args: + attrs (List[str]): The names of attributes to normalize. + (default: :obj:`["x"]`) + """ + def __init__(self, attrs: List[str] = ["x"]): + self.attrs = attrs + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.stores: + for key, value in store.items(*self.attrs): + if value.numel() > 0: + value = value - value.min() + value.divide_(value.sum(axis=-1, keepdim=True).clip_(min=1.)) + store[key] = value + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/normalize_rotation.py b/jointContribution/mattergen/paddle_geometric/transforms/normalize_rotation.py new file mode 100644 index 00000000..f2bae9b1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/normalize_rotation.py @@ -0,0 +1,50 @@ +import paddle +import paddle.nn.functional as F + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('normalize_rotation') +class NormalizeRotation(BaseTransform): + r"""Rotates all points according to the eigenvectors of the point cloud + (functional name: :obj:`normalize_rotation`). + If the data additionally holds normals saved in :obj:`data.normal`, these + will be rotated accordingly. + + Args: + max_points (int, optional): If set to a value greater than :obj:`0`, + only a random number of :obj:`max_points` points are sampled and + used to compute eigenvectors. (default: :obj:`-1`) + sort (bool, optional): If set to :obj:`True`, will sort eigenvectors + according to their eigenvalues. (default: :obj:`False`) + """ + def __init__(self, max_points: int = -1, sort: bool = False) -> None: + self.max_points = max_points + self.sort = sort + + def forward(self, data: Data) -> Data: + assert data.pos is not None + pos = data.pos + + if self.max_points > 0 and pos.shape[0] > self.max_points: + perm = paddle.randperm(pos.shape[0]) + pos = paddle.index_select(pos, perm[:self.max_points]) + + pos = pos - pos.mean(axis=0, keepdim=True) + C = paddle.matmul(pos.t(), pos) + e, v = paddle.linalg.eig(C) + e, v = paddle.real(e), paddle.real(v) + + if self.sort: + indices = paddle.argsort(e, descending=True) + v = paddle.index_select(v, indices, axis=1) + + data.pos = paddle.matmul(data.pos, v) + + if 'normal' in data: + data.normal = F.normalize(paddle.matmul(data.normal, v)) + data.normal = paddle.round(data.normal * 10000) / 10000 + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/normalize_scale.py b/jointContribution/mattergen/paddle_geometric/transforms/normalize_scale.py new file mode 100644 index 00000000..82e8da66 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/normalize_scale.py @@ -0,0 +1,21 @@ +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform, Center + + +@functional_transform('normalize_scale') +class NormalizeScale(BaseTransform): + r"""Centers and normalizes node positions to the interval :math:`(-1, 1)` + (functional name: :obj:`normalize_scale`). + """ + def __init__(self) -> None: + self.center = Center() + + def forward(self, data: Data) -> Data: + data = self.center(data) + + assert data.pos is not None + scale = (1.0 / data.pos.abs().max()) * 0.999999 + data.pos = data.pos * scale + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/one_hot_degree.py b/jointContribution/mattergen/paddle_geometric/transforms/one_hot_degree.py new file mode 100644 index 00000000..fbfd6319 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/one_hot_degree.py @@ -0,0 +1,47 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import degree, one_hot + + +@functional_transform('one_hot_degree') +class OneHotDegree(BaseTransform): + r"""Adds the node degree as one hot encodings to the node features + (functional name: :obj:`one_hot_degree`). + + Args: + max_degree (int): Maximum degree. + in_degree (bool, optional): If set to :obj:`True`, will compute the + in-degree of nodes instead of the out-degree. + (default: :obj:`False`) + cat (bool, optional): Concat node degrees to node features instead + of replacing them. (default: :obj:`True`) + """ + def __init__( + self, + max_degree: int, + in_degree: bool = False, + cat: bool = True, + ) -> None: + self.max_degree = max_degree + self.in_degree = in_degree + self.cat = cat + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + idx, x = data.edge_index[1 if self.in_degree else 0], data.x + deg = degree(idx, data.num_nodes, dtype=paddle.int64) + deg = one_hot(deg, num_classes=self.max_degree + 1) + + if x is not None and self.cat: + x = x.reshape([-1, 1]) if x.ndim == 1 else x + data.x = paddle.concat([x, deg.astype(x.dtype)], axis=-1) + else: + data.x = deg + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.max_degree})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/pad.py b/jointContribution/mattergen/paddle_geometric/transforms/pad.py new file mode 100644 index 00000000..67782381 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/pad.py @@ -0,0 +1,529 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Any, Dict, Optional, Union, Tuple, List, Callable + +import paddle + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.storage import EdgeStorage, NodeStorage +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.typing import EdgeType, NodeType +from paddle_geometric.data.datapipes import functional_transform + + +class Padding(ABC): + r"""An abstract class for specifying padding values.""" + @abstractmethod + def get_value( + self, + store_type: Optional[Union[NodeType, EdgeType]] = None, + attr_name: Optional[str] = None, + ) -> Union[int, float]: + pass + + +@dataclass(init=False) +class UniformPadding(Padding): + r"""Uniform padding independent of attribute name or node/edge type. + + Args: + value (int or float, optional): The value to be used for padding. + (default: :obj:`0.0`) + """ + value: Union[int, float] = 0.0 + + def __init__(self, value: Union[int, float] = 0.0): + self.value = value + + if not isinstance(self.value, (int, float)): + raise ValueError(f"Expected 'value' to be an integer or float " + f"(got '{type(value)}')") + + def get_value( + self, + store_type: Optional[Union[NodeType, EdgeType]] = None, + attr_name: Optional[str] = None, + ) -> Union[int, float]: + return self.value + + +@dataclass(init=False) +class MappingPadding(Padding): + r"""An abstract class for specifying different padding values.""" + values: Dict[Any, Padding] + default: UniformPadding + + def __init__( + self, + values: Dict[Any, Union[int, float, Padding]], + default: Union[int, float] = 0.0, + ): + if not isinstance(values, dict): + raise ValueError(f"Expected 'values' to be a dictionary " + f"(got '{type(values)}')") + + self.values = { + key: UniformPadding(val) if isinstance(val, (int, float)) else val + for key, val in values.items() + } + self.default = UniformPadding(default) + + for key, value in self.values.items(): + self.validate_key_value(key, value) + + def validate_key_value(self, key: Any, value: Any) -> None: + pass + + +class AttrNamePadding(MappingPadding): + r"""Padding dependent on attribute names. + + Args: + values (dict): The mapping from attribute names to padding values. + default (int or float, optional): The padding value to use for + attribute names not specified in :obj:`values`. + (default: :obj:`0.0`) + """ + def validate_key_value(self, key: Any, value: Any) -> None: + if not isinstance(key, str): + raise ValueError(f"Expected the attribute name '{key}' to be a " + f"string (got '{type(key)}')") + + if not isinstance(value, UniformPadding): + raise ValueError(f"Expected the value of '{key}' to be of " + f"type 'UniformPadding' (got '{type(value)}')") + + def get_value( + self, + store_type: Optional[Union[NodeType, EdgeType]] = None, + attr_name: Optional[str] = None, + ) -> Union[int, float]: + padding = self.values.get(attr_name, self.default) + return padding.get_value() + + +class NodeTypePadding(MappingPadding): + r"""Padding dependent on node types. + + Args: + values (dict): The mapping from node types to padding values. + default (int or float, optional): The padding value to use for node + types not specified in :obj:`values`. (default: :obj:`0.0`) + """ + def validate_key_value(self, key: Any, value: Any) -> None: + if not isinstance(key, str): + raise ValueError(f"Expected the node type '{key}' to be a string " + f"(got '{type(key)}')") + + if not isinstance(value, (UniformPadding, AttrNamePadding)): + raise ValueError(f"Expected the value of '{key}' to be of " + f"type 'UniformPadding' or 'AttrNamePadding' " + f"(got '{type(value)}')") + + def get_value( + self, + store_type: Optional[Union[NodeType, EdgeType]] = None, + attr_name: Optional[str] = None, + ) -> Union[int, float]: + padding = self.values.get(store_type, self.default) + return padding.get_value(attr_name=attr_name) + + +class EdgeTypePadding(MappingPadding): + r"""Padding dependent on edge types. + + Args: + values (dict): The mapping from edge types to padding values. + default (int or float, optional): The padding value to use for edge + types not specified in :obj:`values`. (default: :obj:`0.0`) + """ + def validate_key_value(self, key: Any, value: Any) -> None: + if not isinstance(key, tuple): + raise ValueError(f"Expected the edge type '{key}' to be a tuple " + f"(got '{type(key)}')") + + if len(key) != 3: + raise ValueError(f"Expected the edge type '{key}' to hold exactly " + f"three elements (got {len(key)})") + + if not isinstance(value, (UniformPadding, AttrNamePadding)): + raise ValueError(f"Expected the value of '{key}' to be of " + f"type 'UniformPadding' or 'AttrNamePadding' " + f"(got '{type(value)}')") + + def get_value( + self, + store_type: Optional[Union[NodeType, EdgeType]] = None, + attr_name: Optional[str] = None, + ) -> Union[int, float]: + padding = self.values.get(store_type, self.default) + return padding.get_value(attr_name=attr_name) +class _NumNodes: + def __init__( + self, + value: Union[int, Dict[NodeType, int], None], + ) -> None: + self.value = value + + def get_value(self, key: Optional[NodeType] = None) -> Optional[int]: + if self.value is None or isinstance(self.value, int): + return self.value + assert isinstance(key, str) + return self.value[key] + + +class _NumEdges: + def __init__( + self, + value: Union[int, Dict[EdgeType, int], None], + num_nodes: _NumNodes, + ) -> None: + + if value is None: + if isinstance(num_nodes.value, int): + value = num_nodes.value * num_nodes.value + else: + value = {} + + self.value = value + self.num_nodes = num_nodes + + def get_value(self, key: Optional[EdgeType] = None) -> Optional[int]: + if self.value is None or isinstance(self.value, int): + return self.value + + assert isinstance(key, tuple) and len(key) == 3 + if key not in self.value: + num_src_nodes = self.num_nodes.get_value(key[0]) + num_dst_nodes = self.num_nodes.get_value(key[-1]) + assert num_src_nodes is not None and num_dst_nodes is not None + self.value[key] = num_src_nodes * num_dst_nodes + + return self.value[key] + +@functional_transform('pad') +class Pad(BaseTransform): + r"""Applies padding to enforce consistent tensor shapes + (functional name: :obj:`pad`). + + This transform will pad node and edge features up to a maximum allowed size + in the node or edge feature dimension. By default :obj:`0.0` is used as the + padding value and can be configured by setting :obj:`node_pad_value` and + :obj:`edge_pad_value`. + + In case of applying :class:`Pad` to a :class:`~paddle_geometric.data.Data` + object, the :obj:`node_pad_value` value (or :obj:`edge_pad_value`) can be + either: + + * an int, float or object of :class:`UniformPadding` class for cases when + all attributes are going to be padded with the same value; + * an object of :class:`AttrNamePadding` class for cases when padding is + going to differ based on attribute names. + + In case of applying :class:`Pad` to a + :class:`~paddle_geometric.data.HeteroData` object, the :obj:`node_pad_value` + value (or :obj:`edge_pad_value`) can be either: + + * an int, float or object of :class:`UniformPadding` class for cases when + all attributes of all node (or edge) stores are going to be padded with + the same value; + * an object of :class:`AttrNamePadding` class for cases when padding is + going to differ based on attribute names (but not based on node or edge + types); + * an object of class :class:`NodeTypePadding` or :class:`EdgeTypePadding` + for cases when padding values are going to differ based on node or edge + types. Padding values can also differ based on attribute names for a + given node or edge type by using :class:`AttrNamePadding` objects as + values of its `values` argument. + + Note that in order to allow for consistent padding across all graphs in a + dataset, below conditions must be met: + + * if :obj:`max_num_nodes` is a single value, it must be greater than or + equal to the maximum number of nodes of any graph in the dataset; + * if :obj:`max_num_nodes` is a dictionary, value for every node type must + be greater than or equal to the maximum number of this type nodes of any + graph in the dataset. + + Example below shows how to create a :class:`Pad` transform for an + :class:`~paddle_geometric.data.HeteroData` object. The object is padded to + have :obj:`10` nodes of type :obj:`v0`, :obj:`20` nodes of type :obj:`v1` + and :obj:`30` nodes of type :obj:`v2`. + It is padded to have :obj:`80` edges of type :obj:`('v0', 'e0', 'v1')`. + All the attributes of the :obj:`v0` nodes are padded using a value of + :obj:`3.0`. + The :obj:`x` attribute of the :obj:`v1` node type is padded using a value + of :obj:`-1.0`, and the other attributes of this node type are padded using + a value of :obj:`0.5`. + All the attributes of node types other than :obj:`v0` and :obj:`v1` are + padded using a value of :obj:`1.0`. + All the attributes of the :obj:`('v0', 'e0', 'v1')` edge type are padded + using a value of :obj:`3.5`. + The :obj:`edge_attr` attributes of the :obj:`('v1', 'e0', 'v0')` edge type + are padded using a value of :obj:`-1.5`, and any other attributes of this + edge type are padded using a value of :obj:`5.5`. + All the attributes of edge types other than these two are padded using a + value of :obj:`1.5`. + + .. code-block:: python + + num_nodes = {'v0': 10, 'v1': 20, 'v2':30} + num_edges = {('v0', 'e0', 'v1'): 80} + + node_padding = NodeTypePadding({ + 'v0': 3.0, + 'v1': AttrNamePadding({'x': -1.0}, default=0.5), + }, default=1.0) + + edge_padding = EdgeTypePadding({ + ('v0', 'e0', 'v1'): 3.5, + ('v1', 'e0', 'v0'): AttrNamePadding({'edge_attr': -1.5}, + default=5.5), + }, default=1.5) + + transform = Pad(num_nodes, num_edges, node_padding, edge_padding) + + Args: + max_num_nodes (int or dict): The number of nodes after padding. + In heterogeneous graphs, may also take in a dictionary denoting the + number of nodes for specific node types. + max_num_edges (int or dict, optional): The number of edges after + padding. + In heterogeneous graphs, may also take in a dictionary denoting the + number of edges for specific edge types. (default: :obj:`None`) + node_pad_value (int or float or Padding, optional): The fill value to + use for node features. (default: :obj:`0.0`) + edge_pad_value (int or float or Padding, optional): The fill value to + use for edge features. (default: :obj:`0.0`) + The :obj:`edge_index` tensor is padded with with the index of the + first padded node (which represents a set of self-loops on the + padded node). (default: :obj:`0.0`) + mask_pad_value (bool, optional): The fill value to use for + :obj:`train_mask`, :obj:`val_mask` and :obj:`test_mask` attributes + (default: :obj:`False`). + add_pad_mask (bool, optional): If set to :obj:`True`, will attach + node-level :obj:`pad_node_mask` and edge-level :obj:`pad_edge_mask` + attributes to the output which indicates which elements in the data + are real (represented by :obj:`True`) and which were added as a + result of padding (represented by :obj:`False`). + (default: :obj:`False`) + exclude_keys ([str], optional): Keys to be removed + from the input data object. (default: :obj:`None`) + """ + def __init__( + self, + max_num_nodes: Union[int, Dict[NodeType, int]], + max_num_edges: Optional[Union[int, Dict[EdgeType, int]]] = None, + node_pad_value: Union[int, float, Padding] = 0.0, + edge_pad_value: Union[int, float, Padding] = 0.0, + mask_pad_value: bool = False, + add_pad_mask: bool = False, + exclude_keys: Optional[List[str]] = None, + ): + self.max_num_nodes = _NumNodes(max_num_nodes) + self.max_num_edges = _NumEdges(max_num_edges, self.max_num_nodes) + + self.node_pad: Padding + if not isinstance(node_pad_value, Padding): + self.node_pad = UniformPadding(node_pad_value) + else: + self.node_pad = node_pad_value + + self.edge_pad: Padding + if not isinstance(edge_pad_value, Padding): + self.edge_pad = UniformPadding(edge_pad_value) + else: + self.edge_pad = edge_pad_value + + self.node_additional_attrs_pad = { + key: mask_pad_value + for key in ['train_mask', 'val_mask', 'test_mask'] + } + + self.add_pad_mask = add_pad_mask + self.exclude_keys = set(exclude_keys or []) + + def __should_pad_node_attr(self, attr_name: str) -> bool: + if attr_name in self.node_additional_attrs_pad: + return True + if self.exclude_keys is None or attr_name not in self.exclude_keys: + return True + return False + + def __should_pad_edge_attr(self, attr_name: str) -> bool: + if self.max_num_edges.value is None: + return False + if attr_name == 'edge_index': + return True + if self.exclude_keys is None or attr_name not in self.exclude_keys: + return True + return False + + def __get_node_padding( + self, + attr_name: str, + node_type: Optional[NodeType] = None, + ) -> Union[int, float]: + if attr_name in self.node_additional_attrs_pad: + return self.node_additional_attrs_pad[attr_name] + return self.node_pad.get_value(node_type, attr_name) + + def __get_edge_padding( + self, + attr_name: str, + edge_type: Optional[EdgeType] = None, + ) -> Union[int, float]: + return self.edge_pad.get_value(edge_type, attr_name) + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + + if isinstance(data, Data): + assert isinstance(self.node_pad, (UniformPadding, AttrNamePadding)) + assert isinstance(self.edge_pad, (UniformPadding, AttrNamePadding)) + + for key in self.exclude_keys: + del data[key] + + num_nodes = data.num_nodes + assert num_nodes is not None + self.__pad_edge_store(data._store, data.__cat_dim__, num_nodes) + self.__pad_node_store(data._store, data.__cat_dim__) + data.num_nodes = self.max_num_nodes.get_value() + else: + assert isinstance( + self.node_pad, + (UniformPadding, AttrNamePadding, NodeTypePadding)) + assert isinstance( + self.edge_pad, + (UniformPadding, AttrNamePadding, EdgeTypePadding)) + + for edge_type, edge_store in data.edge_items(): + for key in self.exclude_keys: + del edge_store[key] + + src_node_type, _, dst_node_type = edge_type + num_src_nodes = data[src_node_type].num_nodes + num_dst_nodes = data[dst_node_type].num_nodes + assert num_src_nodes is not None and num_dst_nodes is not None + self.__pad_edge_store(edge_store, data.__cat_dim__, + (num_src_nodes, num_dst_nodes), + edge_type) + + for node_type, node_store in data.node_items(): + for key in self.exclude_keys: + del node_store[key] + self.__pad_node_store(node_store, data.__cat_dim__, node_type) + data[node_type].num_nodes = self.max_num_nodes.get_value( + node_type) + + return data + + def __pad_node_store( + self, + store: NodeStorage, + get_dim_fn: Callable, + node_type: Optional[NodeType] = None, + ) -> None: + + attrs_to_pad = [key for key in store.keys() if store.is_node_attr(key)] + + if len(attrs_to_pad) == 0: + return + + num_target_nodes = self.max_num_nodes.get_value(node_type) + assert num_target_nodes is not None + assert store.num_nodes is not None + assert num_target_nodes >= store.num_nodes, \ + f'The number of nodes after padding ({num_target_nodes}) cannot ' \ + f'be lower than the number of nodes in the data object ' \ + f'({store.num_nodes}).' + num_pad_nodes = num_target_nodes - store.num_nodes + + if self.add_pad_mask: + pad_node_mask = paddle.ones([num_target_nodes], dtype=paddle.bool) + pad_node_mask[store.num_nodes:] = False + store.pad_node_mask = pad_node_mask + + for attr_name in attrs_to_pad: + attr = store[attr_name] + pad_value = self.__get_node_padding(attr_name, node_type) + dim = get_dim_fn(attr_name, attr) + store[attr_name] = self._pad_tensor_dim(attr, dim, num_pad_nodes, + pad_value) + + def __pad_edge_store( + self, + store: EdgeStorage, + get_dim_fn: Callable, + num_nodes: Union[int, Tuple[int, int]], + edge_type: Optional[EdgeType] = None, + ) -> None: + + attrs_to_pad = { + attr + for attr in store.keys() + if store.is_edge_attr(attr) and self.__should_pad_edge_attr(attr) + } + if not attrs_to_pad: + return + num_target_edges = self.max_num_edges.get_value(edge_type) + assert num_target_edges is not None + assert num_target_edges >= store.num_edges, \ + f'The number of edges after padding ({num_target_edges}) cannot ' \ + f'be lower than the number of edges in the data object ' \ + f'({store.num_edges}).' + num_pad_edges = num_target_edges - store.num_edges + + if self.add_pad_mask: + pad_edge_mask = paddle.ones([num_target_edges], dtype=paddle.bool) + pad_edge_mask[store.num_edges:] = False + store.pad_edge_mask = pad_edge_mask + + if isinstance(num_nodes, tuple): + src_pad_value, dst_pad_value = num_nodes + else: + src_pad_value = dst_pad_value = num_nodes + + for attr_name in attrs_to_pad: + attr = store[attr_name] + dim = get_dim_fn(attr_name, attr) + if attr_name == 'edge_index': + store[attr_name] = self._pad_edge_index( + attr, num_pad_edges, src_pad_value, dst_pad_value) + else: + pad_value = self.__get_edge_padding(attr_name, edge_type) + store[attr_name] = self._pad_tensor_dim( + attr, dim, num_pad_edges, pad_value) + + @staticmethod + def _pad_tensor_dim(input: paddle.Tensor, dim: int, length: int, + pad_value: float) -> paddle.Tensor: + r"""Pads the input tensor in the specified dim with a constant value of + the given length. + """ + pads = [0] * (2 * len(input.shape)) + pads[-2 * dim - 1] = length + return paddle.nn.functional.pad(input, pads, value=pad_value, mode='constant') + + @staticmethod + def _pad_edge_index(input: paddle.Tensor, length: int, src_pad_value: float, + dst_pad_value: float) -> paddle.Tensor: + r"""Pads the edges :obj:`edge_index` feature with values specified + separately for src and dst nodes. + """ + pads = [0, length, 0, 0] + padded = paddle.nn.functional.pad(input, pads, mode='constant', value=src_pad_value) + if src_pad_value != dst_pad_value: + padded[1, input.shape[1]:] = dst_pad_value + return padded + + def __repr__(self) -> str: + s = f'{self.__class__.__name__}(' + s += f'max_num_nodes={self.max_num_nodes.value}, ' + s += f'max_num_edges={self.max_num_edges.value}, ' + s += f'node_pad_value={self.node_pad}, ' + s += f'edge_pad_value={self.edge_pad})' + return s diff --git a/jointContribution/mattergen/paddle_geometric/transforms/point_pair_features.py b/jointContribution/mattergen/paddle_geometric/transforms/point_pair_features.py new file mode 100644 index 00000000..a761667e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/point_pair_features.py @@ -0,0 +1,50 @@ +import paddle + +import paddle_geometric +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('point_pair_features') +class PointPairFeatures(BaseTransform): + r"""Computes the rotation-invariant Point Pair Features + (functional name: :obj:`point_pair_features`). + + .. math:: + \left( \| \mathbf{d_{j,i}} \|, \angle(\mathbf{n}_i, \mathbf{d_{j,i}}), + \angle(\mathbf{n}_j, \mathbf{d_{j,i}}), \angle(\mathbf{n}_i, + \mathbf{n}_j) \right) + + of linked nodes in its edge attributes, where :math:`\mathbf{d}_{j,i}` + denotes the difference vector between, and :math:`\mathbf{n}_i` and + :math:`\mathbf{n}_j` denote the surface normals of node :math:`i` and + :math:`j` respectively. + + Args: + cat (bool, optional): If set to :obj:`False`, all existing edge + attributes will be replaced. (default: :obj:`True`) + """ + def __init__(self, cat: bool = True): + self.cat = cat + + def forward(self, data: Data) -> Data: + ppf_func = paddle_geometric.nn.conv.ppf_conv.point_pair_features + + assert data.edge_index is not None + assert data.pos is not None and data.norm is not None + assert data.pos.shape[-1] == 3 + assert data.pos.shape == data.norm.shape + + row, col = data.edge_index + pos, norm, pseudo = data.pos, data.norm, data.edge_attr + + ppf = ppf_func(pos[row], pos[col], norm[row], norm[col]) + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, ppf.astype(pseudo.dtype)], axis=-1) + else: + data.edge_attr = ppf + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/polar.py b/jointContribution/mattergen/paddle_geometric/transforms/polar.py new file mode 100644 index 00000000..38a5a8de --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/polar.py @@ -0,0 +1,65 @@ +from math import pi as PI +from typing import Optional + +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('polar') +class Polar(BaseTransform): + r"""Saves the polar coordinates of linked nodes in its edge attributes + (functional name: :obj:`polar`). + + Args: + norm (bool, optional): If set to :obj:`False`, the output will not be + normalized to the interval :math:`{[0, 1]}^2`. + (default: :obj:`True`) + max_value (float, optional): If set and :obj:`norm=True`, normalization + will be performed based on this value instead of the maximum value + found in the data. (default: :obj:`None`) + cat (bool, optional): If set to :obj:`False`, all existing edge + attributes will be replaced. (default: :obj:`True`) + """ + def __init__( + self, + norm: bool = True, + max_value: Optional[float] = None, + cat: bool = True, + ) -> None: + self.norm = norm + self.max = max_value + self.cat = cat + + def forward(self, data: Data) -> Data: + assert data.pos is not None + assert data.edge_index is not None + (row, col), pos, pseudo = data.edge_index, data.pos, data.edge_attr + assert pos.ndim == 2 and pos.shape[1] == 2 + + cart = pos[col] - pos[row] + + rho = paddle.norm(cart, p=2, axis=-1).reshape([-1, 1]) + + theta = paddle.atan2(cart[..., 1], cart[..., 0]).reshape([-1, 1]) + theta = theta + (theta < 0).astype(theta.dtype) * (2 * PI) + + if self.norm: + rho = rho / (rho.max() if self.max is None else self.max) + theta = theta / (2 * PI) + + polar = paddle.concat([rho, theta], axis=-1) + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, polar.astype(pos.dtype)], axis=-1) + else: + data.edge_attr = polar + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(norm={self.norm}, ' + f'max_value={self.max})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/radius_graph.py b/jointContribution/mattergen/paddle_geometric/transforms/radius_graph.py new file mode 100644 index 00000000..e5b4c534 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/radius_graph.py @@ -0,0 +1,57 @@ +import paddle_geometric +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('radius_graph') +class RadiusGraph(BaseTransform): + r"""Creates edges based on node positions :obj:`data.pos` to all points + within a given distance (functional name: :obj:`radius_graph`). + + Args: + r (float): The distance. + loop (bool, optional): If :obj:`True`, the graph will contain + self-loops. (default: :obj:`False`) + max_num_neighbors (int, optional): The maximum number of neighbors to + return for each element in :obj:`y`. + This flag is only needed for CUDA tensors. (default: :obj:`32`) + flow (str, optional): The flow direction when using in combination with + message passing (:obj:`"source_to_target"` or + :obj:`"target_to_source"`). (default: :obj:`"source_to_target"`) + num_workers (int): Number of workers to use for computation. Has no + effect in case :obj:`batch` is not :obj:`None`, or the input lies + on the GPU. (default: :obj:`1`) + """ + def __init__( + self, + r: float, + loop: bool = False, + max_num_neighbors: int = 32, + flow: str = 'source_to_target', + num_workers: int = 1, + ) -> None: + self.r = r + self.loop = loop + self.max_num_neighbors = max_num_neighbors + self.flow = flow + self.num_workers = num_workers + + def forward(self, data: Data) -> Data: + assert data.pos is not None + + data.edge_index = paddle_geometric.nn.radius_graph( + data.pos, + self.r, + data.batch, + loop=self.loop, + max_num_neighbors=self.max_num_neighbors, + flow=self.flow, + num_workers=self.num_workers, + ) + data.edge_attr = None + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(r={self.r})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_flip.py b/jointContribution/mattergen/paddle_geometric/transforms/random_flip.py new file mode 100644 index 00000000..63a5a622 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_flip.py @@ -0,0 +1,32 @@ +import random + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('random_flip') +class RandomFlip(BaseTransform): + """Flips node positions along a given axis randomly with a given + probability (functional name: :obj:`random_flip`). + + Args: + axis (int): The axis along the position of nodes being flipped. + p (float, optional): Probability that node positions will be flipped. + (default: :obj:`0.5`) + """ + def __init__(self, axis: int, p: float = 0.5) -> None: + self.axis = axis + self.p = p + + def forward(self, data: Data) -> Data: + assert data.pos is not None + + if random.random() < self.p: + pos = data.pos.clone() + pos[..., self.axis] = -pos[..., self.axis] + data.pos = pos + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(axis={self.axis}, p={self.p})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_jitter.py b/jointContribution/mattergen/paddle_geometric/transforms/random_jitter.py new file mode 100644 index 00000000..340bdc5c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_jitter.py @@ -0,0 +1,51 @@ +from itertools import repeat +from typing import Sequence, Union +import paddle +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('random_jitter') +class RandomJitter(BaseTransform): + r"""Translates node positions by randomly sampled translation values + within a given interval (functional name: :obj:`random_jitter`). + In contrast to other random transformations, + translation is applied separately at each position. + + Args: + translate (sequence or float or int): Maximum translation in each + dimension, defining the range + :math:`(-\mathrm{translate}, +\mathrm{translate})` to sample from. + If :obj:`translate` is a number instead of a sequence, the same + range is used for each dimension. + """ + def __init__( + self, + translate: Union[float, int, Sequence[Union[float, int]]], + ) -> None: + self.translate = translate + + def forward(self, data: Data) -> Data: + assert data.pos is not None + num_nodes, dim = data.pos.shape + + translate: Sequence[Union[float, int]] + if isinstance(self.translate, (int, float)): + translate = list(repeat(self.translate, times=dim)) + else: + assert len(self.translate) == dim + translate = self.translate + + # jitter = data.pos.new_empty(num_nodes, dim) + jitter = paddle.empty([num_nodes, dim]) + + for d in range(dim): + jitter[:, d].uniform_(-abs(translate[d]), abs(translate[d])) + + data.pos = data.pos + jitter + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.translate})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_link_split.py b/jointContribution/mattergen/paddle_geometric/transforms/random_link_split.py new file mode 100644 index 00000000..13fb5d2c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_link_split.py @@ -0,0 +1,139 @@ +import copy +import warnings +from typing import List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.data.storage import EdgeStorage +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.typing import EdgeType +from paddle_geometric.utils import negative_sampling + + +@functional_transform('random_link_split') +class RandomLinkSplit(BaseTransform): + r"""Performs an edge-level random split into training, validation and test + sets of a :class:`~paddle_geometric.data.Data` or a + :class:`~paddle_geometric.data.HeteroData` object + (functional name: :obj:`random_link_split`). + The split is performed such that the training split does not include edges + in validation and test splits; and the validation split does not include + edges in the test split. + + Args: + num_val (int or float, optional): The number of validation edges. + If set to a floating-point value in :math:`[0, 1]`, it represents + the ratio of edges to include in the validation set. + (default: :obj:`0.1`) + num_test (int or float, optional): The number of test edges. + If set to a floating-point value in :math:`[0, 1]`, it represents + the ratio of edges to include in the test set. + (default: :obj:`0.2`) + is_undirected (bool): If set to :obj:`True`, the graph is assumed to be + undirected, and positive and negative samples will not leak + (reverse) edge connectivity across different splits. This only + affects the graph split, label data will not be returned + undirected. This option is ignored for bipartite edge types or + whenever :obj:`edge_type != rev_edge_type`. (default: :obj:`False`) + key (str, optional): The name of the attribute holding + ground-truth labels. + If :obj:`data[key]` does not exist, it will be automatically + created and represents a binary classification task + (:obj:`1` = edge, :obj:`0` = no edge). + If :obj:`data[key]` exists, it has to be a categorical label from + :obj:`0` to :obj:`num_classes - 1`. + After negative sampling, label :obj:`0` represents negative edges, + and labels :obj:`1` to :obj:`num_classes` represent the labels of + positive edges. (default: :obj:`"edge_label"`) + split_labels (bool, optional): If set to :obj:`True`, will split + positive and negative labels and save them in distinct attributes + :obj:`"pos_edge_label"` and :obj:`"neg_edge_label"`, respectively. + (default: :obj:`False`) + add_negative_train_samples (bool, optional): Whether to add negative + training samples for link prediction. + If the model already performs negative sampling, then the option + should be set to :obj:`False`. + Otherwise, the added negative samples will be the same across + training iterations unless negative sampling is performed again. + (default: :obj:`True`) + neg_sampling_ratio (float, optional): The ratio of sampled negative + edges to the number of positive edges. (default: :obj:`1.0`) + disjoint_train_ratio (int or float, optional): If set to a value + greater than :obj:`0.0`, training edges will not be shared for + message passing and supervision. Instead, + :obj:`disjoint_train_ratio` edges are used as ground-truth labels + for supervision during training. (default: :obj:`0.0`) + edge_types (Tuple[EdgeType] or List[EdgeType], optional): The edge + types used for performing edge-level splitting in case of + operating on :class:`~paddle_geometric.data.HeteroData` objects. + (default: :obj:`None`) + rev_edge_types (Tuple[EdgeType] or List[Tuple[EdgeType]], optional): + The reverse edge types of :obj:`edge_types` in case of operating + on :class:`~paddle_geometric.data.HeteroData` objects. + This will ensure that edges of the reverse direction will be + split accordingly to prevent any data leakage. + Can be :obj:`None` in case no reverse connection exists. + (default: :obj:`None`) + """ + def __init__( + self, + num_val: Union[int, float] = 0.1, + num_test: Union[int, float] = 0.2, + is_undirected: bool = False, + key: str = 'edge_label', + split_labels: bool = False, + add_negative_train_samples: bool = True, + neg_sampling_ratio: float = 1.0, + disjoint_train_ratio: Union[int, float] = 0.0, + edge_types: Optional[Union[EdgeType, List[EdgeType]]] = None, + rev_edge_types: Optional[Union[ + EdgeType, + List[Optional[EdgeType]], + ]] = None, + ) -> None: + if isinstance(edge_types, list): + if rev_edge_types is None: + rev_edge_types = [None] * len(edge_types) + + assert isinstance(rev_edge_types, list) + assert len(edge_types) == len(rev_edge_types) + + self.num_val = num_val + self.num_test = num_test + self.is_undirected = is_undirected + self.key = key + self.split_labels = split_labels + self.add_negative_train_samples = add_negative_train_samples + self.neg_sampling_ratio = neg_sampling_ratio + self.disjoint_train_ratio = disjoint_train_ratio + self.edge_types = edge_types + self.rev_edge_types = rev_edge_types + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Tuple[ + Union[Data, HeteroData], + Union[Data, HeteroData], + Union[Data, HeteroData], + ]: + edge_types = self.edge_types + rev_edge_types = self.rev_edge_types + + train_data = copy.copy(data) + val_data = copy.copy(data) + test_data = copy.copy(data) + + # Adaptation for Paddle operations and data structure handling. + # Conversion and tensor handling code here will need to be adjusted based on the actual availability and syntax of paddle geometric methods. + + return train_data, val_data, test_data + + # Other methods (_split and _create_label) would need similar adaptations for paddle compatibility. + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(num_val={self.num_val}, ' + f'num_test={self.num_test})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_node_split.py b/jointContribution/mattergen/paddle_geometric/transforms/random_node_split.py new file mode 100644 index 00000000..39c5f4df --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_node_split.py @@ -0,0 +1,128 @@ +import random +from typing import Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.data.storage import NodeStorage +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('random_node_split') +class RandomNodeSplit(BaseTransform): + r"""Performs a node-level random split by adding :obj:`train_mask`, + :obj:`val_mask` and :obj:`test_mask` attributes to the + :class:`~paddle_geometric.data.Data` or + :class:`~paddle_geometric.data.HeteroData` object + (functional name: :obj:`random_node_split`). + + Args: + split (str, optional): The type of dataset split (:obj:`"train_rest"`, + :obj:`"test_rest"`, :obj:`"random"`). + If set to :obj:`"train_rest"`, all nodes except those in the + validation and test sets will be used for training (as in the + `"FastGCN: Fast Learning with Graph Convolutional Networks via + Importance Sampling" `_ paper). + If set to :obj:`"test_rest"`, all nodes except those in the + training and validation sets will be used for test (as in the + `"Pitfalls of Graph Neural Network Evaluation" + `_ paper). + If set to :obj:`"random"`, train, validation, and test sets will be + randomly generated, according to :obj:`num_train_per_class`, + :obj:`num_val` and :obj:`num_test` (as in the `"Semi-supervised + Classification with Graph Convolutional Networks" + `_ paper). + (default: :obj:`"train_rest"`) + num_splits (int, optional): The number of splits to add. If bigger + than :obj:`1`, the shape of masks will be + :obj:`[num_nodes, num_splits]`, and :obj:`[num_nodes]` otherwise. + (default: :obj:`1`) + num_train_per_class (int, optional): The number of training samples + per class in case of :obj:`"test_rest"` and :obj:`"random"` split. + (default: :obj:`20`) + num_val (int or float, optional): The number of validation samples. + If float, it represents the ratio of samples to include in the + validation set. (default: :obj:`500`) + num_test (int or float, optional): The number of test samples in case + of :obj:`"train_rest"` and :obj:`"random"` split. If float, it + represents the ratio of samples to include in the test set. + (default: :obj:`1000`) + key (str, optional): The name of the attribute holding ground-truth + labels. By default, will only add node-level splits for node-level + storages in which :obj:`key` is present. (default: :obj:`"y"`). + """ + def __init__( + self, + split: str = "train_rest", + num_splits: int = 1, + num_train_per_class: int = 20, + num_val: Union[int, float] = 500, + num_test: Union[int, float] = 1000, + key: Optional[str] = "y", + ) -> None: + assert split in ['train_rest', 'test_rest', 'random'] + self.split = split + self.num_splits = num_splits + self.num_train_per_class = num_train_per_class + self.num_val = num_val + self.num_test = num_test + self.key = key + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.node_stores: + if self.key is not None and not hasattr(store, self.key): + continue + + train_masks, val_masks, test_masks = zip( + *[self._split(store) for _ in range(self.num_splits)]) + + store.train_mask = paddle.stack(train_masks, axis=-1).squeeze(-1) + store.val_mask = paddle.stack(val_masks, axis=-1).squeeze(-1) + store.test_mask = paddle.stack(test_masks, axis=-1).squeeze(-1) + + return data + + def _split(self, store: NodeStorage) -> Tuple[Tensor, Tensor, Tensor]: + num_nodes = store.num_nodes + assert num_nodes is not None + + train_mask = paddle.zeros([num_nodes], dtype=paddle.bool) + val_mask = paddle.zeros([num_nodes], dtype=paddle.bool) + test_mask = paddle.zeros([num_nodes], dtype=paddle.bool) + + num_val = int(num_nodes * self.num_val) if isinstance(self.num_val, float) else self.num_val + num_test = int(num_nodes * self.num_test) if isinstance(self.num_test, float) else self.num_test + + if self.split == 'train_rest': + perm = paddle.randperm(num_nodes) + val_mask[perm[:num_val]] = True + test_mask[perm[num_val:num_val + num_test]] = True + train_mask[perm[num_val + num_test:]] = True + else: + assert self.key is not None + y = getattr(store, self.key) + num_classes = int(paddle.max(y).item()) + 1 + for c in range(num_classes): + idx = paddle.nonzero(y == c).flatten() + idx = idx[paddle.randperm(len(idx))] + train_mask[idx[:self.num_train_per_class]] = True + + remaining = paddle.nonzero(~train_mask).flatten() + remaining = remaining[paddle.randperm(len(remaining))] + + val_mask[remaining[:num_val]] = True + + if self.split == 'test_rest': + test_mask[remaining[num_val:]] = True + elif self.split == 'random': + test_mask[remaining[num_val:num_val + num_test]] = True + + return train_mask, val_mask, test_mask + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(split={self.split})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_rotate.py b/jointContribution/mattergen/paddle_geometric/transforms/random_rotate.py new file mode 100644 index 00000000..d0128357 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_rotate.py @@ -0,0 +1,55 @@ +import math +import random +from typing import Tuple, Union + +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform, LinearTransformation + + +@functional_transform('random_rotate') +class RandomRotate(BaseTransform): + r"""Rotates node positions around a specific axis by a randomly sampled + factor within a given interval (functional name: :obj:`random_rotate`). + + Args: + degrees (tuple or float): Rotation interval from which the rotation + angle is sampled. If :obj:`degrees` is a number instead of a + tuple, the interval is given by :math:`[-\mathrm{degrees}, + \mathrm{degrees}]`. + axis (int, optional): The rotation axis. (default: :obj:`0`) + """ + def __init__( + self, + degrees: Union[Tuple[float, float], float], + axis: int = 0, + ) -> None: + if isinstance(degrees, (int, float)): + degrees = (-abs(degrees), abs(degrees)) + assert isinstance(degrees, (tuple, list)) and len(degrees) == 2 + self.degrees = degrees + self.axis = axis + + def forward(self, data: Data) -> Data: + assert data.pos is not None + + degree = math.pi * random.uniform(*self.degrees) / 180.0 + sin, cos = math.sin(degree), math.cos(degree) + + if data.pos.shape[-1] == 2: + matrix = [[cos, sin], [-sin, cos]] + else: + if self.axis == 0: + matrix = [[1, 0, 0], [0, cos, sin], [0, -sin, cos]] + elif self.axis == 1: + matrix = [[cos, 0, -sin], [0, 1, 0], [sin, 0, cos]] + else: + matrix = [[cos, sin, 0], [-sin, cos, 0], [0, 0, 1]] + + return LinearTransformation(paddle.to_tensor(matrix))(data) + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}({self.degrees}, ' + f'axis={self.axis})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_scale.py b/jointContribution/mattergen/paddle_geometric/transforms/random_scale.py new file mode 100644 index 00000000..58d4463a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_scale.py @@ -0,0 +1,41 @@ +import random +from typing import Tuple + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('random_scale') +class RandomScale(BaseTransform): + r"""Scales node positions by a randomly sampled factor :math:`s` within a + given interval, *e.g.*, resulting in the transformation matrix + (functional name: :obj:`random_scale`). + + .. math:: + \begin{bmatrix} + s & 0 & 0 \\ + 0 & s & 0 \\ + 0 & 0 & s \\ + \end{bmatrix} + + for three-dimensional positions. + + Args: + scales (tuple): scaling factor interval, e.g. :obj:`(a, b)`, then scale + is randomly sampled from the range + :math:`a \leq \mathrm{scale} \leq b`. + """ + def __init__(self, scales: Tuple[float, float]) -> None: + assert isinstance(scales, (tuple, list)) and len(scales) == 2 + self.scales = scales + + def forward(self, data: Data) -> Data: + assert data.pos is not None + + scale = random.uniform(*self.scales) + data.pos = data.pos * scale + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.scales})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/random_shear.py b/jointContribution/mattergen/paddle_geometric/transforms/random_shear.py new file mode 100644 index 00000000..dd5910e5 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/random_shear.py @@ -0,0 +1,44 @@ +from typing import Union + +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform, LinearTransformation + + +@functional_transform('random_shear') +class RandomShear(BaseTransform): + r"""Shears node positions by randomly sampled factors :math:`s` within a + given interval, *e.g.*, resulting in the transformation matrix + (functional name: :obj:`random_shear`). + + .. math:: + \begin{bmatrix} + 1 & s_{xy} & s_{xz} \\ + s_{yx} & 1 & s_{yz} \\ + s_{zx} & z_{zy} & 1 \\ + \end{bmatrix} + + for three-dimensional positions. + + Args: + shear (float or int): maximum shearing factor defining the range + :math:`(-\mathrm{shear}, +\mathrm{shear})` to sample from. + """ + def __init__(self, shear: Union[float, int]) -> None: + self.shear = abs(shear) + + def forward(self, data: Data) -> Data: + assert data.pos is not None + + dim = data.pos.shape[-1] + + matrix = paddle.uniform([dim, dim], min=-self.shear, max=self.shear) + eye = paddle.arange(dim) + matrix[eye, eye] = 1 + + return LinearTransformation(matrix)(data) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.shear})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/remove_duplicated_edges.py b/jointContribution/mattergen/paddle_geometric/transforms/remove_duplicated_edges.py new file mode 100644 index 00000000..6b42b9b1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/remove_duplicated_edges.py @@ -0,0 +1,55 @@ +from typing import List, Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import coalesce + + +@functional_transform('remove_duplicated_edges') +class RemoveDuplicatedEdges(BaseTransform): + r"""Removes duplicated edges from a given homogeneous or heterogeneous + graph. Useful to clean-up known repeated edges/self-loops in common + benchmark datasets, *e.g.*, in :obj:`ogbn-products`. + (functional name: :obj:`remove_duplicated_edges`). + + Args: + key (str or [str], optional): The name of edge attribute(s) to merge in + case of duplication. (default: :obj:`["edge_weight", "edge_attr"]`) + reduce (str, optional): The reduce operation to use for merging edge + attributes (:obj:`"add"`, :obj:`"mean"`, :obj:`"min"`, + :obj:`"max"`, :obj:`"mul"`). (default: :obj:`"add"`) + """ + def __init__( + self, + key: Union[str, List[str]] = ['edge_attr', 'edge_weight'], + reduce: str = "add", + ) -> None: + if isinstance(key, str): + key = [key] + + self.keys = key + self.reduce = reduce + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + + for store in data.edge_stores: + keys = [key for key in self.keys if key in store] + + size = [s for s in store.size() if s is not None] + num_nodes = max(size) if len(size) > 0 else None + + store.edge_index, edge_attrs = coalesce( + edge_index=store.edge_index, + edge_attr=[store[key] for key in keys], + num_nodes=num_nodes, + reduce=self.reduce, + ) + + for key, edge_attr in zip(keys, edge_attrs): + store[key] = edge_attr + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/remove_isolated_nodes.py b/jointContribution/mattergen/paddle_geometric/transforms/remove_isolated_nodes.py new file mode 100644 index 00000000..1209bb30 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/remove_isolated_nodes.py @@ -0,0 +1,68 @@ +import copy +from collections import defaultdict +from typing import Union + +import paddle + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('remove_isolated_nodes') +class RemoveIsolatedNodes(BaseTransform): + r"""Removes isolated nodes from the graph + (functional name: :obj:`remove_isolated_nodes`). + """ + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + # Gather all nodes that occur in at least one edge (across all types): + n_ids_dict = defaultdict(list) + for edge_store in data.edge_stores: + if 'edge_index' not in edge_store: + continue + + if edge_store._key is None: + src = dst = None + else: + src, _, dst = edge_store._key + + n_ids_dict[src].append(edge_store.edge_index[0]) + n_ids_dict[dst].append(edge_store.edge_index[1]) + + n_id_dict = {k: paddle.unique(paddle.concat(v)) for k, v in n_ids_dict.items()} + + n_map_dict = {} + for node_store in data.node_stores: + if node_store._key not in n_id_dict: + n_id_dict[node_store._key] = paddle.to_tensor([], dtype='int64') + + idx = n_id_dict[node_store._key] + mapping = paddle.zeros([data.num_nodes], dtype='int64') + mapping[idx] = paddle.arange(idx.shape[0], dtype='int64') + n_map_dict[node_store._key] = mapping + + for edge_store in data.edge_stores: + if 'edge_index' not in edge_store: + continue + + if edge_store._key is None: + src = dst = None + else: + src, _, dst = edge_store._key + + row = n_map_dict[src][edge_store.edge_index[0]] + col = n_map_dict[dst][edge_store.edge_index[1]] + edge_store.edge_index = paddle.stack([row, col], axis=0) + + old_data = copy.copy(data) + for out, node_store in zip(data.node_stores, old_data.node_stores): + for key, value in node_store.items(): + if key == 'num_nodes': + out.num_nodes = n_id_dict[node_store._key].shape[0] + elif node_store.is_node_attr(key): + out[key] = value[n_id_dict[node_store._key]] + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/remove_self_loops.py b/jointContribution/mattergen/paddle_geometric/transforms/remove_self_loops.py new file mode 100644 index 00000000..97867a8a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/remove_self_loops.py @@ -0,0 +1,36 @@ +from typing import Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import remove_self_loops + + +@functional_transform('remove_self_loops') +class RemoveSelfLoops(BaseTransform): + r"""Removes all self-loops in the given homogeneous or heterogeneous + graph (functional name: :obj:`remove_self_loops`). + + Args: + attr (str, optional): The name of the attribute of edge weights + or multi-dimensional edge features to pass to + :meth:`paddle_geometric.utils.remove_self_loops`. + (default: :obj:`"edge_weight"`) + """ + def __init__(self, attr: str = 'edge_weight') -> None: + self.attr = attr + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.edge_stores: + if store.is_bipartite() or 'edge_index' not in store: + continue + + store.edge_index, store[self.attr] = remove_self_loops( + store.edge_index, + edge_attr=store.get(self.attr, None), + ) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/remove_training_classes.py b/jointContribution/mattergen/paddle_geometric/transforms/remove_training_classes.py new file mode 100644 index 00000000..99fe8c64 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/remove_training_classes.py @@ -0,0 +1,27 @@ +from typing import List + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('remove_training_classes') +class RemoveTrainingClasses(BaseTransform): + r"""Removes classes from the node-level training set as given by + :obj:`data.train_mask`, *e.g.*, in order to get a zero-shot label scenario + (functional name: :obj:`remove_training_classes`). + + Args: + classes (List[int]): The classes to remove from the training set. + """ + def __init__(self, classes: List[int]): + self.classes = classes + + def forward(self, data: Data) -> Data: + data.train_mask = data.train_mask.clone() + for i in self.classes: + data.train_mask[data.y == i] = False + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.classes})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/rooted_subgraph.py b/jointContribution/mattergen/paddle_geometric/transforms/rooted_subgraph.py new file mode 100644 index 00000000..8b7cfe4b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/rooted_subgraph.py @@ -0,0 +1,178 @@ +import copy +from abc import ABC, abstractmethod +from typing import Any, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import to_paddle_csc_tensor + + +class RootedSubgraphData(Data): + r"""A data object describing a homogeneous graph together with each node's + rooted subgraph. + + It contains several additional properties that hold the information to map + to batch of every node's rooted subgraph: + + * :obj:`sub_edge_index` (Tensor): The edge indices of all combined rooted + subgraphs. + * :obj:`n_id` (Tensor): The indices of nodes in all combined rooted + subgraphs. + * :obj:`e_id` (Tensor): The indices of edges in all combined rooted + subgraphs. + * :obj:`n_sub_batch` (Tensor): The batch vector to distinguish nodes across + different subgraphs. + * :obj:`e_sub_batch` (Tensor): The batch vector to distinguish edges across + different subgraphs. + """ + def __inc__(self, key: str, value: Any, *args: Any, **kwargs: Any) -> Any: + if key == 'sub_edge_index': + return self.n_id.shape[0] + if key in ['n_sub_batch', 'e_sub_batch']: + return 1 + int(self.n_sub_batch[-1]) + elif key == 'n_id': + return self.num_nodes + elif key == 'e_id': + assert self.edge_index is not None + return self.edge_index.shape[1] + return super().__inc__(key, value, *args, **kwargs) + + def map_data(self) -> Data: + # Maps all feature information of the :class:`Data` object to each + # rooted subgraph. + data = copy.copy(self) + + for key, value in self.items(): + if key in ['sub_edge_index', 'n_id', 'e_id', 'e_sub_batch']: + del data[key] + elif key == 'n_sub_batch': + continue + elif key == 'num_nodes': + data.num_nodes = self.n_id.shape[0] + elif key == 'edge_index': + data.edge_index = self.sub_edge_index + elif self.is_node_attr(key): + dim = self.__cat_dim__(key, value) + data[key] = paddle.index_select(value, self.n_id, axis=dim) + elif self.is_edge_attr(key): + dim = self.__cat_dim__(key, value) + data[key] = paddle.index_select(value, self.e_id, axis=dim) + + return data + + +class RootedSubgraph(BaseTransform, ABC): + r"""Base class for implementing rooted subgraph transformations.""" + @abstractmethod + def extract( + self, + data: Data, + ) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor]: + # Returns the tuple: + # :obj:`(sub_edge_index, n_id, e_id, n_sub_batch, e_sub_batch)` + # of the :class:`RootedSubgraphData` object. + pass + + def map( + self, + data: Data, + n_mask: Tensor, + ) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor]: + + assert data.edge_index is not None + num_nodes = data.num_nodes + assert num_nodes is not None + + n_sub_batch, n_id = paddle.nonzero(n_mask, as_tuple=True) + e_mask = n_mask[:, data.edge_index[0]] & n_mask[:, data.edge_index[1]] + e_sub_batch, e_id = paddle.nonzero(e_mask, as_tuple=True) + + sub_edge_index = data.edge_index[:, e_id] + arange = paddle.arange(n_id.shape[0], device=data.edge_index.place) + node_map = paddle.ones([num_nodes, num_nodes], dtype='int64') + node_map[n_sub_batch, n_id] = arange + sub_edge_index += (arange * data.num_nodes)[e_sub_batch] + sub_edge_index = paddle.reshape(node_map, [-1])[sub_edge_index] + + return sub_edge_index, n_id, e_id, n_sub_batch, e_sub_batch + + def forward(self, data: Data) -> RootedSubgraphData: + out = self.extract(data) + d = RootedSubgraphData.from_dict(data.to_dict()) + d.sub_edge_index, d.n_id, d.e_id, d.n_sub_batch, d.e_sub_batch = out + return d + + +class RootedEgoNets(RootedSubgraph): + r"""Collects rooted :math:`k`-hop EgoNets for each node in the graph, as + described in the `"From Stars to Subgraphs: Uplifting Any GNN with Local + Structure Awareness" `_ paper. + + Args: + num_hops (int): the number of hops :math:`k`. + """ + def __init__(self, num_hops: int) -> None: + super().__init__() + self.num_hops = num_hops + + def extract( + self, + data: Data, + ) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor]: + + assert data.edge_index is not None + num_nodes = data.num_nodes + assert num_nodes is not None + + adj_t = to_paddle_csc_tensor(data.edge_index, size=data.size()).t() + n_mask = paddle.eye(num_nodes, dtype='float32', place=data.edge_index.place) + for _ in range(self.num_hops): + n_mask += paddle.matmul(adj_t, n_mask) + + return self.map(data, n_mask > 0) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(num_hops={self.num_hops})' + + +class RootedRWSubgraph(RootedSubgraph): + """Collects rooted random-walk based subgraphs for each node in the graph, + as described in the `"From Stars to Subgraphs: Uplifting Any GNN with Local + Structure Awareness" `_ paper. + + Args: + walk_length (int): the length of the random walk. + repeat (int, optional): The number of times of repeating the random + walk to reduce randomness. (default: :obj:`1`) + """ + def __init__(self, walk_length: int, repeat: int = 1): + super().__init__() + self.walk_length = walk_length + self.repeat = repeat + + def extract( + self, + data: Data, + ) -> Tuple[Tensor, Tensor, Tensor, Tensor, Tensor]: + from paddle_geometric.utils import random_walk + + assert data.edge_index is not None + num_nodes = data.num_nodes + assert num_nodes is not None + + start = paddle.arange(num_nodes, dtype='int64', place=data.edge_index.place) + start = paddle.tile(start.reshape([-1, 1]), [1, self.repeat]).reshape([-1]) + walk = random_walk(data.edge_index[0], data.edge_index[1], start, + self.walk_length, num_nodes=data.num_nodes) + + n_mask = paddle.zeros((num_nodes, num_nodes), dtype='bool', place=walk.place) + start = paddle.tile(start.reshape([-1, 1]), [1, (self.walk_length + 1)]).reshape([-1]) + n_mask[start, walk.reshape([-1])] = True + + return self.map(data, n_mask) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(walk_length={self.walk_length})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/sample_points.py b/jointContribution/mattergen/paddle_geometric/transforms/sample_points.py new file mode 100644 index 00000000..e5d2bcb8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/sample_points.py @@ -0,0 +1,75 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('sample_points') +class SamplePoints(BaseTransform): + r"""Uniformly samples a fixed number of points on the mesh faces according + to their face area (functional name: :obj:`sample_points`). + + Args: + num (int): The number of points to sample. + remove_faces (bool, optional): If set to :obj:`False`, the face tensor + will not be removed. (default: :obj:`True`) + include_normals (bool, optional): If set to :obj:`True`, then compute + normals for each sampled point. (default: :obj:`False`) + """ + def __init__( + self, + num: int, + remove_faces: bool = True, + include_normals: bool = False, + ): + self.num = num + self.remove_faces = remove_faces + self.include_normals = include_normals + + def forward(self, data: Data) -> Data: + assert data.pos is not None + assert data.face is not None + + pos, face = data.pos, data.face + assert pos.shape[1] == 3 and face.shape[0] == 3 + + pos_max = paddle.abs(pos).max() + pos = pos / pos_max + + area = paddle.cross( + pos[face[1]] - pos[face[0]], + pos[face[2]] - pos[face[0]], + axis=1, + ) + area = paddle.norm(area, p=2, axis=1).abs() / 2 + + prob = area / area.sum() + sample = paddle.multinomial(prob, self.num, replacement=True) + face = face[:, sample] + + frac = paddle.rand([self.num, 2]) + mask = frac.sum(axis=-1) > 1 + frac[mask] = 1 - frac[mask] + + vec1 = pos[face[1]] - pos[face[0]] + vec2 = pos[face[2]] - pos[face[0]] + + if self.include_normals: + data.normal = paddle.nn.functional.normalize( + paddle.cross(vec1, vec2, axis=1), p=2) + + pos_sampled = pos[face[0]] + pos_sampled += frac[:, :1] * vec1 + pos_sampled += frac[:, 1:] * vec2 + + pos_sampled = pos_sampled * pos_max + data.pos = pos_sampled + + if self.remove_faces: + data.face = None + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.num})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/sign.py b/jointContribution/mattergen/paddle_geometric/transforms/sign.py new file mode 100644 index 00000000..9650dadf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/sign.py @@ -0,0 +1,66 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import scatter + + +@functional_transform('sign') +class SIGN(BaseTransform): + r"""The Scalable Inception Graph Neural Network module (SIGN) from the + `"SIGN: Scalable Inception Graph Neural Networks" + `_ paper (functional name: :obj:`sign`), + which precomputes the fixed representations. + + .. math:: + \mathbf{X}^{(i)} = {\left( \mathbf{D}^{-1/2} \mathbf{A} + \mathbf{D}^{-1/2} \right)}^i \mathbf{X} + + for :math:`i \in \{ 1, \ldots, K \}` and saves them in + :obj:`data.x1`, :obj:`data.x2`, ... + + .. note:: + + Since intermediate node representations are pre-computed, this operator + is able to scale well to large graphs via classic mini-batching. + For an example of using SIGN, see `examples/sign.py + `_. + + Args: + K (int): The number of hops/layer. + """ + def __init__(self, K: int) -> None: + self.K = K + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + edge_index = data.edge_index + row, col = edge_index + num_nodes = data.num_nodes + + edge_weight = data.edge_weight + if edge_weight is None: + edge_weight = paddle.ones([data.num_edges], dtype=edge_index.dtype) + + deg = scatter(edge_weight, col, dim_size=num_nodes, reduce='sum') + deg_inv_sqrt = deg.pow(-0.5) + deg_inv_sqrt = paddle.where(paddle.isinf(deg_inv_sqrt), paddle.zeros_like(deg_inv_sqrt), deg_inv_sqrt) + edge_weight = deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col] + + xs = [data.x] + for i in range(1, self.K + 1): + xs.append(self._sparse_matmul(edge_index, edge_weight, xs[-1], num_nodes)) + data[f'x{i}'] = xs[-1] + + return data + + def _sparse_matmul(self, edge_index, edge_weight, x, num_nodes): + row, col = edge_index + out = paddle.zeros([num_nodes, x.shape[-1]], dtype=x.dtype) + out = paddle.scatter_add(out, row, x[col] * edge_weight.unsqueeze(-1)) + return out + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(K={self.K})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/spherical.py b/jointContribution/mattergen/paddle_geometric/transforms/spherical.py new file mode 100644 index 00000000..b91be979 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/spherical.py @@ -0,0 +1,68 @@ +from math import pi as PI +from typing import Optional +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('spherical') +class Spherical(BaseTransform): + r"""Saves the spherical coordinates of linked nodes in its edge attributes + (functional name: :obj:`spherical`). + + Args: + norm (bool, optional): If set to :obj:`False`, the output will not be + normalized to the interval :math:`{[0, 1]}^3`. + (default: :obj:`True`) + max_value (float, optional): If set and :obj:`norm=True`, normalization + will be performed based on this value instead of the maximum value + found in the data. (default: :obj:`None`) + cat (bool, optional): If set to :obj:`False`, all existing edge + attributes will be replaced. (default: :obj:`True`) + """ + def __init__( + self, + norm: bool = True, + max_value: Optional[float] = None, + cat: bool = True, + ): + self.norm = norm + self.max = max_value + self.cat = cat + + def forward(self, data: Data) -> Data: + assert data.pos is not None + assert data.edge_index is not None + row, col = data.edge_index + pos, pseudo = data.pos, data.edge_attr + assert pos.shape[1] == 3 + + cart = pos[col] - pos[row] + + rho = paddle.norm(cart, p=2, axis=-1).reshape([-1, 1]) + + theta = paddle.atan2(cart[..., 1], cart[..., 0]).reshape([-1, 1]) + theta = theta + (theta < 0).astype(theta.dtype) * (2 * PI) + + phi = paddle.acos(cart[..., 2] / rho.reshape([-1])).reshape([-1, 1]) + + if self.norm: + rho = rho / (rho.max() if self.max is None else self.max) + theta = theta / (2 * PI) + phi = phi / PI + + spher = paddle.concat([rho, theta, phi], axis=-1) + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, spher.astype(pos.dtype)], axis=-1) + else: + data.edge_attr = spher + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(norm={self.norm}, ' + f'max_value={self.max})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/svd_feature_reduction.py b/jointContribution/mattergen/paddle_geometric/transforms/svd_feature_reduction.py new file mode 100644 index 00000000..88b57c27 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/svd_feature_reduction.py @@ -0,0 +1,30 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('svd_feature_reduction') +class SVDFeatureReduction(BaseTransform): + r"""Dimensionality reduction of node features via Singular Value + Decomposition (SVD) (functional name: :obj:`svd_feature_reduction`). + + Args: + out_channels (int): The dimensionality of node features after + reduction. + """ + def __init__(self, out_channels: int): + self.out_channels = out_channels + + def forward(self, data: Data) -> Data: + assert data.x is not None + + if data.x.shape[-1] > self.out_channels: + U, S, _ = paddle.linalg.svd(data.x) + data.x = paddle.matmul(U[:, :self.out_channels], + paddle.diag(S[:self.out_channels])) + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.out_channels})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/target_indegree.py b/jointContribution/mattergen/paddle_geometric/transforms/target_indegree.py new file mode 100644 index 00000000..909629c1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/target_indegree.py @@ -0,0 +1,58 @@ +from typing import Optional + +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import degree + + +@functional_transform('target_indegree') +class TargetIndegree(BaseTransform): + r"""Saves the globally normalized degree of target nodes + (functional name: :obj:`target_indegree`). + + .. math:: + + \mathbf{u}(i,j) = \frac{\deg(j)}{\max_{v \in \mathcal{V}} \deg(v)} + + in its edge attributes. + + Args: + cat (bool, optional): Concat pseudo-coordinates to edge attributes + instead of replacing them. (default: :obj:`True`) + """ + def __init__( + self, + norm: bool = True, + max_value: Optional[float] = None, + cat: bool = True, + ) -> None: + self.norm = norm + self.max = max_value + self.cat = cat + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + col, pseudo = data.edge_index[1], data.edge_attr + + deg = degree(col, data.num_nodes) + + if self.norm: + deg = deg / (deg.max() if self.max is None else self.max) + + deg = paddle.index_select(deg, col) + deg = deg.reshape([-1, 1]) + + if pseudo is not None and self.cat: + pseudo = pseudo.reshape([-1, 1]) if pseudo.ndim == 1 else pseudo + data.edge_attr = paddle.concat([pseudo, deg.astype(pseudo.dtype)], axis=-1) + else: + data.edge_attr = deg + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(norm={self.norm}, ' + f'max_value={self.max})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/to_dense.py b/jointContribution/mattergen/paddle_geometric/transforms/to_dense.py new file mode 100644 index 00000000..98de257d --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/to_dense.py @@ -0,0 +1,63 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('to_dense') +class ToDense(BaseTransform): + r"""Converts a sparse adjacency matrix to a dense adjacency matrix with + shape :obj:`[num_nodes, num_nodes, *]` (functional name: :obj:`to_dense`). + + Args: + num_nodes (int, optional): The number of nodes. If set to :obj:`None`, + the number of nodes will get automatically inferred. + (default: :obj:`None`) + """ + def __init__(self, num_nodes: Optional[int] = None) -> None: + self.num_nodes = num_nodes + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + + orig_num_nodes = data.num_nodes + assert orig_num_nodes is not None + + num_nodes = self.num_nodes or orig_num_nodes + if self.num_nodes is not None: + assert orig_num_nodes <= self.num_nodes + + if data.edge_attr is None: + edge_attr = paddle.ones([data.edge_index.shape[1]], dtype='float32') + else: + edge_attr = data.edge_attr + + size = [num_nodes, num_nodes] + list(edge_attr.shape[1:]) + adj = paddle.sparse.sparse_coo_tensor(data.edge_index, edge_attr, shape=size) + data.adj = adj.to_dense() + data.edge_index = None + data.edge_attr = None + + data.mask = paddle.zeros([num_nodes], dtype='bool') + data.mask[:orig_num_nodes] = True + + if data.x is not None: + _size = [num_nodes - data.x.shape[0]] + list(data.x.shape[1:]) + data.x = paddle.concat([data.x, paddle.zeros(_size, dtype=data.x.dtype)], axis=0) + + if data.pos is not None: + _size = [num_nodes - data.pos.shape[0]] + list(data.pos.shape[1:]) + data.pos = paddle.concat([data.pos, paddle.zeros(_size, dtype=data.pos.dtype)], axis=0) + + if data.y is not None and isinstance(data.y, Tensor) and data.y.shape[0] == orig_num_nodes: + _size = [num_nodes - data.y.shape[0]] + list(data.y.shape[1:]) + data.y = paddle.concat([data.y, paddle.zeros(_size, dtype=data.y.dtype)], axis=0) + + return data + + def __repr__(self) -> str: + return f'{self.__class__.__name__}(num_nodes={self.num_nodes})' if self.num_nodes else f'{self.__class__.__name__}()' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/to_device.py b/jointContribution/mattergen/paddle_geometric/transforms/to_device.py new file mode 100644 index 00000000..dce93993 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/to_device.py @@ -0,0 +1,40 @@ +from typing import List, Optional, Union + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('to_device') +class ToDevice(BaseTransform): + r"""Performs tensor device conversion, either for all attributes of the + :obj:`~paddle_geometric.data.Data` object or only the ones given by + :obj:`attrs` (functional name: :obj:`to_device`). + + Args: + device (torch.device): The destination device. + attrs (List[str], optional): If given, will only perform tensor device + conversion for the given attributes. (default: :obj:`None`) + non_blocking (bool, optional): If set to :obj:`True` and tensor + values are in pinned memory, the copy will be asynchronous with + respect to the host. (default: :obj:`False`) + """ + def __init__( + self, + device: Union[int, str], + attrs: Optional[List[str]] = None, + non_blocking: bool = False, + ) -> None: + self.device = device + self.attrs = attrs or [] + self.non_blocking = non_blocking + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + return data.to(self.device, *self.attrs, + non_blocking=self.non_blocking) + + def __repr__(self) -> str: + return f'{self.__class__.__name__}({self.device})' diff --git a/jointContribution/mattergen/paddle_geometric/transforms/to_sparse_tensor.py b/jointContribution/mattergen/paddle_geometric/transforms/to_sparse_tensor.py new file mode 100644 index 00000000..733f32ff --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/to_sparse_tensor.py @@ -0,0 +1,114 @@ +from typing import Optional, Union + +import paddle +from paddle import sparse as paddle_sparse +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.typing import SparseTensor +from paddle_geometric.utils import ( + sort_edge_index, + to_paddle_coo_tensor, + to_paddle_csr_tensor, +) + + +@functional_transform('to_sparse_tensor') +class ToSparseTensor(BaseTransform): + r"""Converts the :obj:`edge_index` attributes of a homogeneous or + heterogeneous data object into a **transposed** + sparse tensor with key :obj:`adj_t` + (functional name: :obj:`to_sparse_tensor`). + + Args: + attr (str, optional): The name of the attribute to add as a value to + the sparse tensor (if present). + (default: :obj:`edge_weight`) + remove_edge_index (bool, optional): If set to :obj:`False`, the + :obj:`edge_index` tensor will not be removed. + (default: :obj:`True`) + fill_cache (bool, optional): If set to :obj:`True`, will fill the + underlying sparse tensor cache (if used). + (default: :obj:`True`) + layout (optional): Specifies the layout of the returned + sparse tensor (:obj:`None`, :obj:`paddle.sparse_coo` or + :obj:`paddle.sparse_csr`). + """ + def __init__( + self, + attr: Optional[str] = 'edge_weight', + remove_edge_index: bool = True, + fill_cache: bool = True, + layout: Optional[int] = None, + ) -> None: + if layout not in {None, paddle_sparse.sparse_coo, paddle_sparse.sparse_csr}: + raise ValueError(f"Unexpected sparse tensor layout (got '{layout}')") + + self.attr = attr + self.remove_edge_index = remove_edge_index + self.fill_cache = fill_cache + self.layout = layout + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + + for store in data.edge_stores: + if 'edge_index' not in store: + continue + + keys, values = [], [] + for key, value in store.items(): + if key in {'edge_index', 'edge_label', 'edge_label_index'}: + continue + + if store.is_edge_attr(key): + keys.append(key) + values.append(value) + + store.edge_index, values = sort_edge_index( + store.edge_index, + values, + sort_by_row=False, + ) + + for key, value in zip(keys, values): + store[key] = value + + layout = self.layout + size = store.size()[::-1] + edge_weight: Optional[Tensor] = None + if self.attr is not None and self.attr in store: + edge_weight = store[self.attr] + + if layout == paddle_sparse.sparse_coo or (layout is None and not hasattr(paddle_geometric.typing, "WITH_PADDLE_SPARSE")): + store.adj_t = to_paddle_coo_tensor( + store.edge_index.flip([0]), + edge_attr=edge_weight, + size=size, + ) + + elif layout == paddle_sparse.sparse_csr or layout is None: + store.adj_t = to_paddle_csr_tensor( + store.edge_index.flip([0]), + edge_attr=edge_weight, + size=size, + ) + + if self.remove_edge_index: + del store['edge_index'] + if self.attr is not None and self.attr in store: + del store[self.attr] + + if self.fill_cache: + # Any caching steps if applicable for the backend + pass + + return data + + def __repr__(self) -> str: + return (f'{self.__class__.__name__}(attr={self.attr}, layout={self.layout})') diff --git a/jointContribution/mattergen/paddle_geometric/transforms/to_superpixels.py b/jointContribution/mattergen/paddle_geometric/transforms/to_superpixels.py new file mode 100644 index 00000000..fccdd5c4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/to_superpixels.py @@ -0,0 +1,65 @@ +from typing import Any + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import scatter + + +@functional_transform('to_slic') +class ToSLIC(BaseTransform): + r"""Converts an image to a superpixel representation using the + :meth:`skimage.segmentation.slic` algorithm, resulting in a + :obj:`paddle_geometric.data.Data` object holding the centroids of + superpixels in :obj:`data.pos` and their mean color in :obj:`data.x` + (functional name: :obj:`to_slic`). + + Args: + add_seg (bool, optional): If set to `True`, will add the segmentation + result to the data object. (default: :obj:`False`) + add_img (bool, optional): If set to `True`, will add the input image + to the data object. (default: :obj:`False`) + **kwargs (optional): Arguments to adjust the output of the SLIC + algorithm. + """ + def __init__( + self, + add_seg: bool = False, + add_img: bool = False, + **kwargs: Any, + ) -> None: + self.add_seg = add_seg + self.add_img = add_img + self.kwargs = kwargs + + def forward(self, img: Tensor) -> Data: + from skimage.segmentation import slic + + img = img.transpose([1, 2, 0]) # Permute dimensions to HWC + h, w, c = img.shape + + seg = slic(img.astype('float64').numpy(), start_label=0, **self.kwargs) + seg = paddle.to_tensor(seg) + + x = scatter(img.reshape([h * w, c]), seg.reshape([h * w]), dim=0, reduce='mean') + + pos_y = paddle.arange(h, dtype='float32') + pos_y = pos_y.unsqueeze(1).expand([h, w]).reshape([h * w]) + pos_x = paddle.arange(w, dtype='float32') + pos_x = pos_x.unsqueeze(0).expand([h, w]).reshape([h * w]) + + pos = paddle.stack([pos_x, pos_y], axis=-1) + pos = scatter(pos, seg.reshape([h * w]), dim=0, reduce='mean') + + data = Data(x=x, pos=pos) + + if self.add_seg: + data.seg = seg.reshape([1, h, w]) + + if self.add_img: + data.img = img.transpose([2, 0, 1]).reshape([1, c, h, w]) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/to_undirected.py b/jointContribution/mattergen/paddle_geometric/transforms/to_undirected.py new file mode 100644 index 00000000..c6bb1015 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/to_undirected.py @@ -0,0 +1,79 @@ +from typing import Union + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data, HeteroData +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import to_undirected + + +@functional_transform('to_undirected') +class ToUndirected(BaseTransform): + r"""Converts a homogeneous or heterogeneous graph to an undirected graph + such that :math:`(j,i) \in \mathcal{E}` for every edge + :math:`(i,j) \in \mathcal{E}` (functional name: :obj:`to_undirected`). + In heterogeneous graphs, will add "reverse" connections for *all* existing + edge types. + + Args: + reduce (str, optional): The reduce operation to use for merging edge + features (:obj:`"add"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`). + (default: :obj:`"add"`) + merge (bool, optional): If set to :obj:`False`, will create reverse + edge types for connections pointing to the same source and target + node type. + If set to :obj:`True`, reverse edges will be merged into the + original relation. + This option only has effects in + :class:`~paddle_geometric.data.HeteroData` graph data. + (default: :obj:`True`) + """ + def __init__(self, reduce: str = "add", merge: bool = True): + self.reduce = reduce + self.merge = merge + + def forward( + self, + data: Union[Data, HeteroData], + ) -> Union[Data, HeteroData]: + for store in data.edge_stores: + if 'edge_index' not in store: + continue + + nnz = store.edge_index.shape[1] + + if isinstance(data, HeteroData) and (store.is_bipartite() + or not self.merge): + src, rel, dst = store._key + + # Just reverse the connectivity and add edge attributes: + row, col = store.edge_index + rev_edge_index = paddle.stack([col, row], axis=0) + + inv_store = data[(dst, f'rev_{rel}', src)] + inv_store.edge_index = rev_edge_index + for key, value in store.items(): + if key == 'edge_index': + continue + if isinstance(value, Tensor) and value.shape[0] == nnz: + inv_store[key] = value + + else: + keys, values = [], [] + for key, value in store.items(): + if key == 'edge_index': + continue + + if store.is_edge_attr(key): + keys.append(key) + values.append(value) + + store.edge_index, values = to_undirected( + store.edge_index, values, reduce=self.reduce) + + for key, value in zip(keys, values): + store[key] = value + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/two_hop.py b/jointContribution/mattergen/paddle_geometric/transforms/two_hop.py new file mode 100644 index 00000000..6c854ff7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/two_hop.py @@ -0,0 +1,41 @@ +import paddle + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform +from paddle_geometric.utils import coalesce, remove_self_loops + + +@functional_transform('two_hop') +class TwoHop(BaseTransform): + r"""Adds the two-hop edges to the edge indices + (functional name: :obj:`two_hop`). + """ + + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + edge_index, edge_attr = data.edge_index, data.edge_attr + N = data.num_nodes + + # Convert edge_index to a dense representation for multiplication + edge_index_dense = paddle.to_tensor(edge_index.numpy()) + edge_index_dense_sorted = paddle.sort(edge_index_dense, axis=0)[0] + + # Perform two-hop connection calculation + edge_index2 = paddle.matmul(edge_index_dense_sorted, edge_index_dense_sorted) + + # Convert back to sparse format and remove self-loops + edge_index2, _ = remove_self_loops(edge_index2) + + # Concatenate original edges with two-hop edges + edge_index = paddle.concat([edge_index_dense, edge_index2], axis=1) + + if edge_attr is not None: + # Newly added edges will have zero features + edge_attr2 = paddle.zeros([edge_index2.shape[1]] + list(edge_attr.shape[1:]), dtype=edge_attr.dtype) + edge_attr = paddle.concat([edge_attr, edge_attr2], axis=0) + + # Coalesce to handle duplicates and finalize + data.edge_index, data.edge_attr = coalesce(edge_index, edge_attr, N) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/transforms/virtual_node.py b/jointContribution/mattergen/paddle_geometric/transforms/virtual_node.py new file mode 100644 index 00000000..8e72f892 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/transforms/virtual_node.py @@ -0,0 +1,77 @@ +import copy + +import paddle +from paddle import Tensor + +from paddle_geometric.data import Data +from paddle_geometric.data.datapipes import functional_transform +from paddle_geometric.transforms import BaseTransform + + +@functional_transform('virtual_node') +class VirtualNode(BaseTransform): + r"""Appends a virtual node to the given homogeneous graph that is connected + to all other nodes, as described in the `"Neural Message Passing for + Quantum Chemistry" `_ paper + (functional name: :obj:`virtual_node`). + The virtual node serves as a global scratch space that each node both reads + from and writes to in every step of message passing. + This allows information to travel long distances during the propagation + phase. + + Node and edge features of the virtual node are added as zero-filled input + features. + Furthermore, special edge types will be added both for in-coming and + out-going information to and from the virtual node. + """ + def forward(self, data: Data) -> Data: + assert data.edge_index is not None + row, col = data.edge_index + edge_type = data.get('edge_type', paddle.zeros_like(row)) + num_nodes = data.num_nodes + assert num_nodes is not None + + arange = paddle.arange(num_nodes, dtype=row.dtype) + full = paddle.full([num_nodes], num_nodes, dtype=row.dtype) + row = paddle.concat([row, arange, full], axis=0) + col = paddle.concat([col, full, arange], axis=0) + edge_index = paddle.stack([row, col], axis=0) + + num_edge_types = int(edge_type.max().item()) if edge_type.numel() > 0 else 0 + new_type = paddle.full([num_nodes], num_edge_types + 1, dtype=edge_type.dtype) + edge_type = paddle.concat([edge_type, new_type, new_type + 1], axis=0) + + old_data = copy.copy(data) + for key, value in old_data.items(): + if key in {'edge_index', 'edge_type'}: + continue + + if isinstance(value, Tensor): + dim = old_data.__cat_dim__(key, value) + size = list(value.shape) + + fill_value = None + if key == 'edge_weight': + size[dim] = 2 * num_nodes + fill_value = 1. + elif key == 'batch': + size[dim] = 1 + fill_value = int(value[0].item()) + elif old_data.is_edge_attr(key): + size[dim] = 2 * num_nodes + fill_value = 0. + elif old_data.is_node_attr(key): + size[dim] = 1 + fill_value = 0. + + if fill_value is not None: + new_value = paddle.full(size, fill_value, dtype=value.dtype) + data[key] = paddle.concat([value, new_value], axis=dim) + + data.edge_index = edge_index + data.edge_type = edge_type + + if 'num_nodes' in data: + data.num_nodes = num_nodes + 1 + + return data diff --git a/jointContribution/mattergen/paddle_geometric/typing.py b/jointContribution/mattergen/paddle_geometric/typing.py new file mode 100644 index 00000000..592c5e83 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/typing.py @@ -0,0 +1,346 @@ +import inspect +import os +import sys +import typing +import warnings +from typing import Any, Dict, List, Optional, Set, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + +WITH_PADDLE_DEV = True + + +WITH_WINDOWS = os.name == 'nt' + +MAX_INT64 = paddle.iinfo(paddle.int64).max + +INDEX_DTYPES: Set[paddle.dtype] = { + paddle.int32, + paddle.int64, +} + + +try: + import pyg_lib # noqa + WITH_PYG_LIB = True + WITH_GMM = hasattr(pyg_lib.ops, 'grouped_matmul') + WITH_SEGMM = hasattr(pyg_lib.ops, 'segment_matmul') + if WITH_SEGMM and 'pytest' in sys.modules and paddle.device.is_compiled_with_cuda(): + try: + x = paddle.randn([3, 4], place='gpu') + ptr = paddle.to_tensor([0, 2, 3], place='gpu') + weight = paddle.randn([2, 4, 4], place='gpu') + out = pyg_lib.ops.segment_matmul(x, ptr, weight) + except RuntimeError: + WITH_GMM = False + WITH_SEGMM = False + WITH_SAMPLED_OP = hasattr(pyg_lib.ops, 'sampled_add') + WITH_SOFTMAX = hasattr(pyg_lib.ops, 'softmax_csr') + WITH_INDEX_SORT = hasattr(pyg_lib.ops, 'index_sort') + WITH_METIS = hasattr(pyg_lib, 'partition') + WITH_EDGE_TIME_NEIGHBOR_SAMPLE = ('edge_time' in inspect.signature( + pyg_lib.sampler.neighbor_sample).parameters) + WITH_WEIGHTED_NEIGHBOR_SAMPLE = ('edge_weight' in inspect.signature( + pyg_lib.sampler.neighbor_sample).parameters) +except Exception as e: + if not isinstance(e, ImportError): # pragma: no cover + warnings.warn(f"An issue occurred while importing 'pyg-lib'. " + f"Disabling its usage. Stacktrace: {e}") + pyg_lib = object + WITH_PYG_LIB = False + WITH_GMM = False + WITH_SEGMM = False + WITH_SAMPLED_OP = False + WITH_SOFTMAX = False + WITH_INDEX_SORT = False + WITH_METIS = False + WITH_EDGE_TIME_NEIGHBOR_SAMPLE = False + WITH_WEIGHTED_NEIGHBOR_SAMPLE = False + +try: + import paddle_scatter # noqa + WITH_PADDLE_SCATTER = True +except Exception as e: + if not isinstance(e, ImportError): # pragma: no cover + warnings.warn(f"An issue occurred while importing 'paddle-scatter'. " + f"Disabling its usage. Stacktrace: {e}") + paddle_scatter = object + WITH_PADDLE_SCATTER = False + +try: + import paddle_cluster # noqa + WITH_PADDLE_CLUSTER = True + WITH_PADDLE_CLUSTER_BATCH_SIZE = 'batch_size' in paddle_cluster.knn.__doc__ +except Exception as e: + if not isinstance(e, ImportError): # pragma: no cover + warnings.warn(f"An issue occurred while importing 'paddle-cluster'. " + f"Disabling its usage. Stacktrace: {e}") + WITH_PADDLE_CLUSTER = False + WITH_PADDLE_CLUSTER_BATCH_SIZE = False + + class PaddleCluster: + def __getattr__(self, key: str) -> Any: + raise ImportError(f"'{key}' requires 'paddle-cluster'") + + paddle_cluster = PaddleCluster() + +try: + import paddle_sparse # noqa + from paddle_sparse import SparseStorage, SparseTensor + WITH_PADDLE_SPARSE = True +except Exception as e: + if not isinstance(e, ImportError): # pragma: no cover + warnings.warn(f"An issue occurred while importing 'paddle-sparse'. " + f"Disabling its usage. Stacktrace: {e}") + WITH_PADDLE_SPARSE = False + + class SparseStorage: # type: ignore + def __init__( + self, + row: Optional[Tensor] = None, + rowptr: Optional[Tensor] = None, + col: Optional[Tensor] = None, + value: Optional[Tensor] = None, + sparse_sizes: Optional[Tuple[Optional[int], Optional[int]]] = None, + rowcount: Optional[Tensor] = None, + colptr: Optional[Tensor] = None, + colcount: Optional[Tensor] = None, + csr2csc: Optional[Tensor] = None, + csc2csr: Optional[Tensor] = None, + is_sorted: bool = False, + trust_data: bool = False, + ): + raise ImportError("'SparseStorage' requires 'paddle-sparse'") + + def value(self) -> Optional[Tensor]: + raise ImportError("'SparseStorage' requires 'paddle-sparse'") + + def rowcount(self) -> Tensor: + raise ImportError("'SparseStorage' requires 'paddle-sparse'") + + class SparseTensor: # type: ignore + def __init__( + self, + row: Optional[Tensor] = None, + rowptr: Optional[Tensor] = None, + col: Optional[Tensor] = None, + value: Optional[Tensor] = None, + sparse_sizes: Optional[Tuple[Optional[int], Optional[int]]] = None, + is_sorted: bool = False, + trust_data: bool = False, + ): + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + @classmethod + def from_edge_index( + self, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + sparse_sizes: Optional[Tuple[Optional[int], Optional[int]]] = None, + is_sorted: bool = False, + trust_data: bool = False, + ) -> 'SparseTensor': + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + @property + def storage(self) -> SparseStorage: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + @classmethod + def from_dense(self, mat: Tensor, + has_value: bool = True) -> 'SparseTensor': + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def size(self, dim: int) -> int: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def nnz(self) -> int: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def is_cuda(self) -> bool: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def has_value(self) -> bool: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def set_value(self, value: Optional[Tensor], + layout: Optional[str] = None) -> 'SparseTensor': + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def fill_value(self, fill_value: float, + dtype: Optional[paddle.dtype] = None) -> 'SparseTensor': + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def coo(self) -> Tuple[Tensor, Tensor, Optional[Tensor]]: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def csr(self) -> Tuple[Tensor, Tensor, Optional[Tensor]]: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def requires_grad(self) -> bool: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + def to_paddle_sparse_csr_tensor( + self, + dtype: Optional[paddle.dtype] = None, + ) -> Tensor: + raise ImportError("'SparseTensor' requires 'paddle-sparse'") + + class paddle_sparse: # type: ignore + @staticmethod + def matmul(src: SparseTensor, other: Tensor, + reduce: str = "sum") -> Tensor: + raise ImportError("'matmul' requires 'paddle-sparse'") + + @staticmethod + def sum(src: SparseTensor, dim: Optional[int] = None) -> Tensor: + raise ImportError("'sum' requires 'paddle-sparse'") + + @staticmethod + def mul(src: SparseTensor, other: Tensor) -> SparseTensor: + raise ImportError("'mul' requires 'paddle-sparse'") + + @staticmethod + def set_diag(src: SparseTensor, values: Optional[Tensor] = None, + k: int = 0) -> SparseTensor: + raise ImportError("'set_diag' requires 'paddle-sparse'") + + @staticmethod + def fill_diag(src: SparseTensor, fill_value: float, + k: int = 0) -> SparseTensor: + raise ImportError("'fill_diag' requires 'paddle-sparse'") + + @staticmethod + def masked_select_nnz(src: SparseTensor, mask: Tensor, + layout: Optional[str] = None) -> SparseTensor: + raise ImportError("'masked_select_nnz' requires 'paddle-sparse'") + +try: + import paddle_frame # noqa + WITH_PADDLE_FRAME = True + from paddle_frame import TensorFrame +except Exception: + paddle_frame = object + WITH_PADDLE_FRAME = False + + class TensorFrame: # type: ignore + pass + +class MockPaddleCSCTensor: + def __init__( + self, + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Union[int, Tuple[int, int]]] = None, + ): + self.edge_index = edge_index + self.edge_attr = edge_attr + self.size = size + + def t(self) -> Tensor: + from paddle_geometric.utils import to_paddle_csr_tensor + size = self.size + return to_paddle_csr_tensor( + self.edge_index.flip([0]), + self.edge_attr, + size[::-1] if isinstance(size, (tuple, list)) else size, + ) + + +# Types for accessing data #################################################### + +# Node-types are denoted by a single string, e.g.: `data['paper']`: +NodeType = str + +# Edge-types are denotes by a triplet of strings, e.g.: +# `data[('author', 'writes', 'paper')] +EdgeType = Tuple[str, str, str] + +NodeOrEdgeType = Union[NodeType, EdgeType] + +DEFAULT_REL = 'to' +EDGE_TYPE_STR_SPLIT = '__' + + +class EdgeTypeStr(str): + r"""A helper class to construct serializable edge types by merging an edge + type tuple into a single string. + """ + def __new__(cls, *args: Any) -> 'EdgeTypeStr': + if isinstance(args[0], (list, tuple)): + # Unwrap `EdgeType((src, rel, dst))` and `EdgeTypeStr((src, dst))`: + args = tuple(args[0]) + + if len(args) == 1 and isinstance(args[0], str): + arg = args[0] # An edge type string was passed. + + elif len(args) == 2 and all(isinstance(arg, str) for arg in args): + # A `(src, dst)` edge type was passed - add `DEFAULT_REL`: + arg = EDGE_TYPE_STR_SPLIT.join((args[0], DEFAULT_REL, args[1])) + + elif len(args) == 3 and all(isinstance(arg, str) for arg in args): + # A `(src, rel, dst)` edge type was passed: + arg = EDGE_TYPE_STR_SPLIT.join(args) + + else: + raise ValueError(f"Encountered invalid edge type '{args}'") + + return str.__new__(cls, arg) + + def to_tuple(self) -> EdgeType: + r"""Returns the original edge type.""" + out = tuple(self.split(EDGE_TYPE_STR_SPLIT)) + if len(out) != 3: + raise ValueError(f"Cannot convert the edge type '{self}' to a " + f"tuple since it holds invalid characters") + return out + + +# There exist some short-cuts to query edge-types (given that the full triplet +# can be uniquely reconstructed, e.g.: +# * via str: `data['writes']` +# * via Tuple[str, str]: `data[('author', 'paper')]` +QueryType = Union[NodeType, EdgeType, str, Tuple[str, str]] + +Metadata = Tuple[List[NodeType], List[EdgeType]] + +# A representation of a feature tensor +FeatureTensorType = Union[Tensor, np.ndarray] + +# A representation of an edge index, following the possible formats: +# * COO: (row, col) +# * CSC: (row, colptr) +# * CSR: (rowptr, col) +EdgeTensorType = Tuple[Tensor, Tensor] + +# Types for message passing ################################################### + +Adj = Union[Tensor, SparseTensor] +OptTensor = Optional[Tensor] +PairTensor = Tuple[Tensor, Tensor] +OptPairTensor = Tuple[Tensor, Optional[Tensor]] +PairOptTensor = Tuple[Optional[Tensor], Optional[Tensor]] +Size = Optional[Tuple[int, int]] +NoneType = Optional[Tensor] + +MaybeHeteroNodeTensor = Union[Tensor, Dict[NodeType, Tensor]] +MaybeHeteroAdjTensor = Union[Tensor, Dict[EdgeType, Adj]] +MaybeHeteroEdgeTensor = Union[Tensor, Dict[EdgeType, Tensor]] + +# Types for sampling ########################################################## + +InputNodes = Union[OptTensor, NodeType, Tuple[NodeType, OptTensor]] +InputEdges = Union[OptTensor, EdgeType, Tuple[EdgeType, OptTensor]] + +# Serialization ############################################################### + +if hasattr(paddle, "serialization"): + paddle.serialization.add_safe_globals([ + SparseTensor, + SparseStorage, + TensorFrame, + MockPaddleCSCTensor, + EdgeTypeStr, + ]) diff --git a/jointContribution/mattergen/paddle_geometric/utils/__init__.py b/jointContribution/mattergen/paddle_geometric/utils/__init__.py new file mode 100644 index 00000000..cd8f7cb7 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/__init__.py @@ -0,0 +1,156 @@ +r"""Utility package.""" + +import copy + +from ._scatter import scatter, group_argsort, group_cat +from ._segment import segment +from ._index_sort import index_sort +from .functions import cumsum +from ._degree import degree +from ._softmax import softmax +from ._lexsort import lexsort +from ._sort_edge_index import sort_edge_index +from ._coalesce import coalesce +from .undirected import is_undirected, to_undirected +from .loop import (contains_self_loops, remove_self_loops, + segregate_self_loops, add_self_loops, + add_remaining_self_loops, get_self_loop_attr) +from .isolated import contains_isolated_nodes, remove_isolated_nodes +from ._subgraph import (get_num_hops, subgraph, k_hop_subgraph, + bipartite_subgraph) +from .dropout import dropout_adj, dropout_node, dropout_edge, dropout_path +from ._homophily import homophily +from ._assortativity import assortativity +from ._normalize_edge_index import normalize_edge_index +from .laplacian import get_laplacian +from .mesh_laplacian import get_mesh_laplacian +from .mask import mask_select, index_to_mask, mask_to_index +from ._select import select, narrow +from ._to_dense_batch import to_dense_batch +from ._to_dense_adj import to_dense_adj +from .nested import to_nested_tensor, from_nested_tensor +from .sparse import (dense_to_sparse, is_sparse, is_paddle_sparse_tensor, + to_paddle_coo_tensor, to_paddle_csr_tensor, + to_paddle_csc_tensor, to_paddle_sparse_tensor, + to_edge_index) +from ._spmm import spmm +from ._unbatch import unbatch, unbatch_edge_index +from ._one_hot import one_hot +from ._normalized_cut import normalized_cut +from ._grid import grid +from .geodesic import geodesic_distance +from .convert import to_scipy_sparse_matrix, from_scipy_sparse_matrix +from .convert import to_networkx, from_networkx +from .convert import to_networkit, from_networkit +from .convert import to_trimesh, from_trimesh +from .convert import to_cugraph, from_cugraph +from .convert import to_dgl, from_dgl +from .smiles import from_rdmol, to_rdmol, from_smiles, to_smiles +from .random import (erdos_renyi_graph, stochastic_blockmodel_graph, + barabasi_albert_graph) +from ._negative_sampling import (negative_sampling, batched_negative_sampling, + structured_negative_sampling, + structured_negative_sampling_feasible) +from .augmentation import shuffle_node, mask_feature, add_random_edge +from ._tree_decomposition import tree_decomposition +from .embedding import get_embeddings +from ._trim_to_layer import trim_to_layer +from .ppr import get_ppr +from ._train_test_split_edges import train_test_split_edges + +__all__ = [ + 'scatter', + 'group_argsort', + 'group_cat', + 'segment', + 'index_sort', + 'cumsum', + 'degree', + 'softmax', + 'lexsort', + 'sort_edge_index', + 'coalesce', + 'is_undirected', + 'to_undirected', + 'contains_self_loops', + 'remove_self_loops', + 'segregate_self_loops', + 'add_self_loops', + 'add_remaining_self_loops', + 'get_self_loop_attr', + 'contains_isolated_nodes', + 'remove_isolated_nodes', + 'get_num_hops', + 'subgraph', + 'bipartite_subgraph', + 'k_hop_subgraph', + 'dropout_node', + 'dropout_edge', + 'dropout_path', + 'dropout_adj', + 'homophily', + 'assortativity', + 'normalize_edge_index', + 'get_laplacian', + 'get_mesh_laplacian', + 'mask_select', + 'index_to_mask', + 'mask_to_index', + 'select', + 'narrow', + 'to_dense_batch', + 'to_dense_adj', + 'to_nested_tensor', + 'from_nested_tensor', + 'dense_to_sparse', + 'is_paddle_sparse_tensor', + 'is_sparse', + 'to_paddle_coo_tensor', + 'to_paddle_csr_tensor', + 'to_paddle_csc_tensor', + 'to_paddle_sparse_tensor', + 'to_edge_index', + 'spmm', + 'unbatch', + 'unbatch_edge_index', + 'one_hot', + 'normalized_cut', + 'grid', + 'geodesic_distance', + 'to_scipy_sparse_matrix', + 'from_scipy_sparse_matrix', + 'to_networkx', + 'from_networkx', + 'to_networkit', + 'from_networkit', + 'to_trimesh', + 'from_trimesh', + 'to_cugraph', + 'from_cugraph', + 'to_dgl', + 'from_dgl', + 'from_rdmol', + 'to_rdmol', + 'from_smiles', + 'to_smiles', + 'erdos_renyi_graph', + 'stochastic_blockmodel_graph', + 'barabasi_albert_graph', + 'negative_sampling', + 'batched_negative_sampling', + 'structured_negative_sampling', + 'structured_negative_sampling_feasible', + 'shuffle_node', + 'mask_feature', + 'add_random_edge', + 'tree_decomposition', + 'get_embeddings', + 'trim_to_layer', + 'get_ppr', + 'train_test_split_edges', +] + +# `structured_negative_sampling_feasible` is a long name and thus destroys the +# documentation rendering. We remove it for now from the documentation: +classes = copy.copy(__all__) +classes.remove('structured_negative_sampling_feasible') diff --git a/jointContribution/mattergen/paddle_geometric/utils/_assortativity.py b/jointContribution/mattergen/paddle_geometric/utils/_assortativity.py new file mode 100644 index 00000000..115ac424 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_assortativity.py @@ -0,0 +1,65 @@ +import paddle +from paddle import Tensor + +from paddle_geometric.typing import Adj, SparseTensor +from paddle_geometric.utils import coalesce, degree +from paddle_geometric.utils._to_dense_adj import to_dense_adj + + +def assortativity(edge_index: Adj) -> float: + r"""The degree assortativity coefficient from the + `"Mixing patterns in networks" + `_ paper. + Assortativity in a network refers to the tendency of nodes to + connect with other similar nodes over dissimilar nodes. + It is computed from Pearson correlation coefficient of the node degrees. + + Args: + edge_index (Tensor or SparseTensor): The graph connectivity. + + Returns: + The value of the degree assortativity coefficient for the input + graph :math:`\in [-1, 1]` + + Example: + >>> edge_index = paddle.to_tensor([[0, 1, 2, 3, 2], + ... [1, 2, 0, 1, 3]]) + >>> assortativity(edge_index) + -0.666667640209198 + """ + if isinstance(edge_index, SparseTensor): + adj: SparseTensor = edge_index + row, col, _ = adj.coo() + else: + assert isinstance(edge_index, Tensor) + row, col = edge_index + + device = row.place + out_deg = degree(row, dtype='int64') + in_deg = degree(col, dtype='int64') + degrees = paddle.unique(paddle.concat([out_deg, in_deg])) + mapping = paddle.zeros([degrees.max().item() + 1], dtype=row.dtype) + mapping = paddle.scatter(mapping, degrees, paddle.arange(degrees.shape[0], dtype=row.dtype)) + + # Compute degree mixing matrix (joint probability distribution) `M` + num_degrees = degrees.shape[0] + src_deg = paddle.gather(mapping, out_deg[row]) + dst_deg = paddle.gather(mapping, in_deg[col]) + + pairs = paddle.stack([src_deg, dst_deg], axis=0) + occurrence = paddle.ones([pairs.shape[1]], dtype=row.dtype) + pairs, occurrence = coalesce(pairs, occurrence) + M = to_dense_adj(pairs, edge_attr=occurrence, max_num_nodes=num_degrees)[0] + # normalization + M /= M.sum() + + # Numeric assortativity coefficient, computed by Pearson correlation coefficient of the node degrees + x = y = degrees.astype('float32') + a, b = M.sum(axis=0), M.sum(axis=1) + + vara = (a * x**2).sum() - ((a * x).sum())**2 + varb = (b * x**2).sum() - ((b * x).sum())**2 + xy = paddle.outer(x, y) + ab = paddle.outer(a, b) + out = (xy * (M - ab)).sum() / (vara * varb).sqrt() + return out.item() diff --git a/jointContribution/mattergen/paddle_geometric/utils/_coalesce.py b/jointContribution/mattergen/paddle_geometric/utils/_coalesce.py new file mode 100644 index 00000000..3440eb9b --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_coalesce.py @@ -0,0 +1,105 @@ +import typing +from typing import List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import EdgeIndex +from paddle_geometric.edge_index import SortOrder +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import index_sort, scatter +from paddle_geometric.utils.num_nodes import maybe_num_nodes + +MISSING = '???' + + +def coalesce( + edge_index: Tensor, + edge_attr: Union[OptTensor, List[Tensor], str] = MISSING, + num_nodes: Optional[int] = None, + reduce: str = 'sum', + is_sorted: bool = False, + sort_by_row: bool = True, +) -> Union[Tensor, Tuple[Tensor, OptTensor], Tuple[Tensor, List[Tensor]]]: + """Row-wise sorts :obj:`edge_index` and removes its duplicated entries. + Duplicate entries in :obj:`edge_attr` are merged by scattering them + together according to the given :obj:`reduce` option. + + Args: + edge_index (paddle.Tensor): The edge indices. + edge_attr (paddle.Tensor or List[paddle.Tensor], optional): Edge weights + or multi-dimensional edge features. + If given as a list, will re-shuffle and remove duplicates for all + its entries. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + reduce (str, optional): The reduce operation to use for merging edge + features (:obj:`"sum"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`, + :obj:`"mul"`, :obj:`"any"`). (default: :obj:`"sum"`) + is_sorted (bool, optional): If set to :obj:`True`, will expect + :obj:`edge_index` to be already sorted row-wise. + sort_by_row (bool, optional): If set to :obj:`False`, will sort + :obj:`edge_index` column-wise. + + Returns: + Union[Tensor, Tuple[Tensor, OptTensor], Tuple[Tensor, List[Tensor]]]: + The sorted edge index and edge attributes, with duplicates removed. + """ + num_edges = edge_index[0].shape[0] + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + if num_nodes * num_nodes > paddle_geometric.typing.MAX_INT64: + raise ValueError("'coalesce' will result in an overflow") + + # idx = paddle.concat( + # [paddle.to_tensor([-1], dtype=paddle.float32), edge_index[1 - int(sort_by_row)] * num_nodes + edge_index[int(sort_by_row)]]) + + dtype = edge_index.dtype + # place = edge_index.place + + idx = paddle.empty([num_edges + 1]) + idx[0] = -1 + idx[1:] = edge_index[1 - int(sort_by_row)] + idx[1:].multiply_(paddle.to_tensor(num_nodes)).add_(edge_index[int(sort_by_row)]) + + if not is_sorted: + idx[1:], perm = index_sort(idx[1:], max_value=num_nodes * num_nodes) + edge_index = edge_index[:, perm] + if isinstance(edge_attr, Tensor): + edge_attr = edge_attr[perm] + elif isinstance(edge_attr, list): + edge_attr = [e[perm] for e in edge_attr] + + mask = idx[1:] > idx[:-1] + + if mask.all(): + if edge_attr is None or isinstance(edge_attr, Tensor): + return edge_index, edge_attr + if isinstance(edge_attr, (list, tuple)): + return edge_index, edge_attr + return edge_index + + if isinstance(edge_index, Tensor): + edge_index = edge_index[:, mask] + elif isinstance(edge_index, tuple): + edge_index = (edge_index[0][mask], edge_index[1][mask]) + else: + raise NotImplementedError + + dim_size: Optional[int] = None + if isinstance(edge_attr, (Tensor, list, tuple)) and len(edge_attr) > 0: + dim_size = edge_index.shape[1] + idx = paddle.arange(0, num_edges) + idx.subtract_(mask.logical_not_().cumsum(axis=0)) + + if edge_attr is None: + return edge_index, None + if isinstance(edge_attr, Tensor): + edge_attr = scatter(edge_attr, idx, 0, dim_size, reduce) + return edge_index, edge_attr + if isinstance(edge_attr, list): + edge_attr = [scatter(e, idx, 0, dim_size, reduce) for e in edge_attr] + return edge_index, edge_attr + + return edge_index diff --git a/jointContribution/mattergen/paddle_geometric/utils/_degree.py b/jointContribution/mattergen/paddle_geometric/utils/_degree.py new file mode 100644 index 00000000..5d4c1fcc --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_degree.py @@ -0,0 +1,30 @@ +from typing import Optional +import paddle +from paddle import Tensor + +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def degree(index: Tensor, num_nodes: Optional[int] = None, + dtype: Optional[paddle.dtype] = None) -> Tensor: + r"""Computes the (unweighted) degree of a given one-dimensional index + tensor. + + Args: + index (Tensor): Index tensor. + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`index`. (default: :obj:`None`) + dtype (:obj:`paddle.dtype`, optional): The desired data type of the + returned tensor. + + :rtype: :class:`Tensor` + + Example: + >>> row = paddle.to_tensor([0, 1, 0, 2, 0], dtype='int64') + >>> degree(row, dtype='int64') + Tensor([3, 1, 1]) + """ + N = maybe_num_nodes(index, num_nodes) + out = paddle.zeros((N, ), dtype=dtype if dtype is not None else index.dtype) + one = paddle.ones((index.shape[0], ), dtype=out.dtype) + return out.put_along_axis_(indices=index, values=one, axis=0, reduce='add', include_self=True) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_grid.py b/jointContribution/mattergen/paddle_geometric/utils/_grid.py new file mode 100644 index 00000000..f8b65292 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_grid.py @@ -0,0 +1,73 @@ +from typing import Optional, Tuple +import paddle +from paddle import Tensor + +from paddle_geometric.utils import coalesce + + +def grid( + height: int, + width: int, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tuple[Tensor, Tensor]: + r"""Returns the edge indices of a two-dimensional grid graph with height + :attr:`height` and width :attr:`width` and its node positions. + + Args: + height (int): The height of the grid. + width (int): The width of the grid. + dtype (paddle.dtype, optional): The desired data type of the returned + position tensor. (default: :obj:`None`) + device (str, optional): The desired device of the returned + tensors. (default: :obj:`None`) + + :rtype: (:class:`Tensor`, :class:`Tensor`) + """ + edge_index = grid_index(height, width, device) + pos = grid_pos(height, width, dtype, device) + return edge_index, pos + + +def grid_index( + height: int, + width: int, + device: Optional[str] = None, +) -> Tensor: + + w = width + kernel = paddle.to_tensor( + [-w - 1, -1, w - 1, -w, 0, w, -w + 1, 1, w + 1], + place=device, + ) + + row = paddle.arange(height * width, dtype="int64") + row = row.reshape([-1, 1]).tile([1, kernel.shape[0]]) + col = row + kernel.reshape([1, -1]) + row, col = row.reshape([height, -1]), col.reshape([height, -1]) + index = paddle.arange(3, row.shape[1] - 3, dtype="int64") + row, col = row[:, index].reshape([-1]), col[:, index].reshape([-1]) + + mask = (col >= 0) & (col < height * width) + row, col = row[mask], col[mask] + + edge_index = paddle.stack([row, col], axis=0) + edge_index = coalesce(edge_index, num_nodes=height * width) + return edge_index + + +def grid_pos( + height: int, + width: int, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tensor: + + dtype = paddle.float32 if dtype is None else dtype + x = paddle.arange(width, dtype=dtype) + y = (height - 1) - paddle.arange(height, dtype=dtype) + + x = x.tile([height]) + y = y.unsqueeze(-1).tile([1, width]).reshape([-1]) + + return paddle.stack([x, y], axis=-1) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_homophily.py b/jointContribution/mattergen/paddle_geometric/utils/_homophily.py new file mode 100644 index 00000000..e14fa1bd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_homophily.py @@ -0,0 +1,82 @@ +from typing import Optional, Tuple, Union, overload + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import Adj, OptTensor +from paddle_geometric.utils import degree, scatter + + +@overload +def homophily( + edge_index: Adj, + y: Tensor, + batch: None = ..., + method: str = ..., +) -> float: + pass + + +@overload +def homophily( + edge_index: Adj, + y: Tensor, + batch: Tensor, + method: str = ..., +) -> Tensor: + pass + + +def homophily( + edge_index: Adj, + y: Tensor, + batch: OptTensor = None, + method: str = 'edge', +) -> Union[float, Tensor]: + assert method in {'edge', 'node', 'edge_insensitive'} + y = y.squeeze(-1) if y.ndim > 1 else y + + if isinstance(edge_index, paddle.sparse.SparseTensor): + row, col, _ = edge_index.coo() + else: + row, col = edge_index + + if method == 'edge': + out = paddle.zeros([row.shape[0]], dtype='float32', place=row.place) + out = paddle.where(y[row] == y[col], paddle.ones_like(out), out) + if batch is None: + return float(out.mean().item()) + else: + dim_size = int(batch.max().item()) + 1 + return scatter(out, batch[col], 0, dim_size, reduce='mean') + + elif method == 'node': + out = paddle.zeros([row.shape[0]], dtype='float32', place=row.place) + out = paddle.where(y[row] == y[col], paddle.ones_like(out), out) + out = scatter(out, col, 0, dim_size=y.shape[0], reduce='mean') + if batch is None: + return float(out.mean().item()) + else: + return scatter(out, batch, dim=0, reduce='mean') + + elif method == 'edge_insensitive': + num_classes = int(y.max().item()) + 1 + assert num_classes >= 2 + batch = paddle.zeros_like(y) if batch is None else batch + num_nodes = degree(batch, dtype='int64') + num_graphs = num_nodes.shape[0] + batch = num_classes * batch + y + + h = homophily(edge_index, y, batch, method='edge') + h = h.reshape([num_graphs, num_classes]) + + counts = paddle.bincount(batch, minlength=num_classes * num_graphs) + counts = counts.reshape([num_graphs, num_classes]) + proportions = counts / num_nodes.reshape([-1, 1]) + + out = (h - proportions).clip(min=0).sum(axis=-1) + out /= (num_classes - 1) + return out if out.shape[0] > 1 else float(out.item()) + + else: + raise NotImplementedError diff --git a/jointContribution/mattergen/paddle_geometric/utils/_index_sort.py b/jointContribution/mattergen/paddle_geometric/utils/_index_sort.py new file mode 100644 index 00000000..0cde59b6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_index_sort.py @@ -0,0 +1,37 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + + +def index_sort( + inputs: paddle.Tensor, + max_value: Optional[int] = None, + stable: bool = False, +) -> Tuple[paddle.Tensor, paddle.Tensor]: + r"""Sorts the elements of the :obj:`inputs` tensor in ascending order. + It is expected that :obj:`inputs` is one-dimensional and that it only + contains positive integer values. If :obj:`max_value` is given, it can + be used by the underlying algorithm for better performance. + + Args: + inputs (Tensor): A vector with positive integer values. + max_value (int, optional): The maximum value stored inside + :obj:`inputs`. This value can be an estimation, but needs to be + greater than or equal to the real maximum. + (default: :obj:`None`) + stable (bool, optional): Makes the sorting routine stable, which + guarantees that the order of equivalent elements is preserved. + (default: :obj:`False`) + """ + if stable: + # Perform stable sort if requested + indices = paddle.argsort(inputs, axis=0, descending=False, stable=True) + sorted_inputs = paddle.gather(inputs, indices) + else: + # Perform regular sort + indices = paddle.argsort(inputs, axis=0, descending=False) + sorted_inputs = paddle.gather(inputs, indices) + + return sorted_inputs, indices + diff --git a/jointContribution/mattergen/paddle_geometric/utils/_lexsort.py b/jointContribution/mattergen/paddle_geometric/utils/_lexsort.py new file mode 100644 index 00000000..ddb53df1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_lexsort.py @@ -0,0 +1,37 @@ +from typing import List + +import numpy as np +import paddle +from paddle import Tensor + + +def lexsort( + keys: List[Tensor], + axis: int = -1, + descending: bool = False, +) -> Tensor: + r"""Performs an indirect stable sort using a sequence of keys. + + Given multiple sorting keys, returns an array of integer indices that + describe their sort order. + The last key in the sequence is used for the primary sort order, the + second-to-last key for the secondary sort order, and so on. + + Args: + keys ([paddle.Tensor]): The :math:`k` different columns to be sorted. + The last key is the primary sort key. + axis (int, optional): The dimension to sort along. (default: :obj:`-1`) + descending (bool, optional): Controls the sorting order (ascending or + descending). (default: :obj:`False`) + """ + assert len(keys) >= 1 + + # Convert tensors to numpy arrays for `np.lexsort` functionality + keys = [k.numpy() for k in keys] + if descending: + keys = [-k for k in keys] + + # Perform lexicographical sort using numpy + out = np.lexsort(keys[::-1], axis=axis) + + return paddle.to_tensor(out, dtype='int64') diff --git a/jointContribution/mattergen/paddle_geometric/utils/_negative_sampling.py b/jointContribution/mattergen/paddle_geometric/utils/_negative_sampling.py new file mode 100644 index 00000000..f495a370 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_negative_sampling.py @@ -0,0 +1,295 @@ +import random +from typing import Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + + +def negative_sampling( + edge_index: Tensor, + num_nodes: Optional[Union[int, Tuple[int, int]]] = None, + num_neg_samples: Optional[int] = None, + method: str = "sparse", + force_undirected: bool = False, +) -> Tensor: + """ + Samples random negative edges for a given graph represented by `edge_index`. + + Args: + edge_index (Tensor): The edge indices of the graph. + num_nodes (int or Tuple[int, int], optional): The number of nodes, i.e., + max value + 1 of `edge_index`. If a tuple is provided, `edge_index` + is treated as a bipartite graph with shape `(num_src_nodes, num_dst_nodes)`. + num_neg_samples (int, optional): The number of negative samples to generate. + If set to None, generates a negative edge for each positive edge. + method (str, optional): Sampling method, "sparse" or "dense". Controls + memory/runtime trade-offs. "sparse" works with any graph size, while + "dense" performs faster checks for true negatives. + force_undirected (bool, optional): If True, sampled negative edges will be + undirected. + + Returns: + Tensor: Negative edge indices. + + Examples: + edge_index = paddle.to_tensor([[0, 0, 1, 2], [0, 1, 2, 3]]) + negative_sampling(edge_index) + """ + assert method in ['sparse', 'dense'] + if num_nodes is None: + num_nodes = max(edge_index.flatten().numpy()) + 1 + + size = (num_nodes, num_nodes) if isinstance(num_nodes, int) else num_nodes + bipartite = not isinstance(num_nodes, int) + force_undirected = False if bipartite else force_undirected + + idx, population = edge_index_to_vector(edge_index, size, bipartite, force_undirected) + + if idx.shape[0] >= population: + return paddle.empty((2, 0), dtype="int64") + + num_neg_samples = num_neg_samples or edge_index.shape[1] + if force_undirected: + num_neg_samples //= 2 + + prob = 1.0 - idx.shape[0] / population + sample_size = int(1.1 * num_neg_samples / prob) + + neg_idx = None + if method == 'dense': + mask = paddle.ones([population], dtype=paddle.bool) + mask[idx] = False + for _ in range(3): + rnd = sample(population, sample_size, edge_index.place) + rnd = rnd[mask[rnd]] + neg_idx = paddle.concat([neg_idx, rnd]) if neg_idx is not None else rnd + if neg_idx.shape[0] >= num_neg_samples: + neg_idx = neg_idx[:num_neg_samples] + break + mask[neg_idx] = False + + else: + idx = idx.cpu() + for _ in range(3): + rnd = sample(population, sample_size, 'cpu') + mask = np.isin(rnd.numpy(), idx.numpy()) | (neg_idx is not None and np.isin(rnd, neg_idx.cpu())) + rnd = rnd[~mask].to(edge_index.place) + neg_idx = paddle.concat([neg_idx, rnd]) if neg_idx is not None else rnd + if neg_idx.shape[0] >= num_neg_samples: + neg_idx = neg_idx[:num_neg_samples] + break + + return vector_to_edge_index(neg_idx, size, bipartite, force_undirected) + + +def batched_negative_sampling( + edge_index: Tensor, + batch: Union[Tensor, Tuple[Tensor, Tensor]], + num_neg_samples: Optional[int] = None, + method: str = "sparse", + force_undirected: bool = False, +) -> Tensor: + """ + Samples random negative edges for multiple graphs based on `edge_index` and `batch`. + + Args: + edge_index (Tensor): The edge indices of the graph. + batch (Tensor or Tuple[Tensor, Tensor]): Batch vector to assign each node to a specific example. + num_neg_samples (int, optional): The number of negative samples to return. + method (str, optional): Sampling method, "sparse" or "dense". Controls memory/runtime trade-offs. + force_undirected (bool, optional): If True, sampled negative edges will be undirected. + + Returns: + Tensor: Batched negative edge indices. + """ + src_batch, dst_batch = (batch, batch) if isinstance(batch, Tensor) else batch + src_cumsum = paddle.cumsum(paddle.to_tensor([len(src_batch)]), axis=0)[:-1] + + num_nodes = paddle.unique(paddle.concat([src_batch, dst_batch])) + ptr = src_cumsum if isinstance(batch, Tensor) else paddle.concat([src_cumsum, src_cumsum + len(dst_batch)]) + + neg_edge_indices = [] + for i, edge_index_part in enumerate(paddle.split(edge_index, len(src_batch))): + neg_edge_index = negative_sampling(edge_index_part - ptr[i], [len(src_batch), len(dst_batch)][i], + num_neg_samples, method, force_undirected) + neg_edge_indices.append(neg_edge_index + ptr[i]) + + return paddle.concat(neg_edge_indices, axis=1) + + +def structured_negative_sampling(edge_index: Tensor, num_nodes: Optional[int] = None, + contains_neg_self_loops: bool = True) -> Tuple[Tensor, Tensor, Tensor]: + """ + Samples a negative edge for each positive edge in `edge_index` and returns as a tuple `(i, j, k)`. + + Args: + edge_index (Tensor): The edge indices of the graph. + num_nodes (int, optional): The number of nodes. + contains_neg_self_loops (bool, optional): If False, sampled negative edges will not contain self loops. + + Returns: + Tuple[Tensor, Tensor, Tensor]: Positive and negative edges `(i, j, k)`. + """ + num_nodes = max(edge_index.flatten().numpy()) + 1 if num_nodes is None else num_nodes + row, col = edge_index[:, 0], edge_index[:, 1] + pos_idx = row * num_nodes + col + + rand = paddle.randint(0, num_nodes, (len(row),), dtype=paddle.int64) + neg_idx = row * num_nodes + rand + + mask = paddle.to_tensor(np.isin(neg_idx.numpy(), pos_idx.numpy()), dtype=paddle.bool) + rest = paddle.nonzero(mask).squeeze() + while rest.numel() > 0: + tmp = paddle.randint(0, num_nodes, (len(rest),), dtype=paddle.int64) + rand[rest] = tmp + neg_idx = row[rest] * num_nodes + tmp + mask = paddle.to_tensor(np.isin(neg_idx.numpy(), pos_idx.numpy()), dtype=paddle.bool) + rest = rest[mask] + + return row, col, rand + +def structured_negative_sampling_feasible( + edge_index: Tensor, + num_nodes: Optional[int] = None, + contains_neg_self_loops: bool = True, +) -> bool: + """ + Returns True if structured_negative_sampling is feasible + on the graph given by edge_index. + structured_negative_sampling is infeasible if at least one node + is connected to all other nodes. + + Args: + edge_index (Tensor): The edge indices. + num_nodes (int, optional): The number of nodes, i.e., + max_val + 1 of edge_index. (default: None) + contains_neg_self_loops (bool, optional): If set to False, sampled + negative edges will not contain self loops. (default: True) + + Returns: + bool: Whether structured negative sampling is feasible. + + Examples: + >>> edge_index = paddle.to_tensor([[0, 0, 1, 1, 2, 2, 2], + ... [1, 2, 0, 2, 0, 1, 1]]) + >>> structured_negative_sampling_feasible(edge_index, 3, False) + False + >>> structured_negative_sampling_feasible(edge_index, 3, True) + True + """ + def maybe_num_nodes(edge_index, num_nodes=None): + if num_nodes is not None: + return num_nodes + return int(paddle.max(edge_index) + 1) + + def coalesce(edge_index, num_nodes): + sorted_indices = paddle.argsort(edge_index[0] * num_nodes + edge_index[1]) + edge_index = edge_index[:, sorted_indices] + unique_indices = paddle.unique(edge_index, axis=1) + return unique_indices + + def remove_self_loops(edge_index): + mask = edge_index[0] != edge_index[1] + edge_index = edge_index[:, mask] + return edge_index + + def degree(src, num_nodes): + return paddle.bincount(src, minlength=num_nodes) + + num_nodes = maybe_num_nodes(edge_index, num_nodes) + max_num_neighbors = num_nodes + + edge_index = coalesce(edge_index, num_nodes=num_nodes) + + if not contains_neg_self_loops: + edge_index = remove_self_loops(edge_index) + max_num_neighbors -= 1 # Reduce number of valid neighbors + + deg = degree(edge_index[0], num_nodes) + # True if there exists no node that is connected to all other nodes. + return bool(paddle.all(deg < max_num_neighbors)) + + +def sample(population: int, k: int, device: Optional[str] = None) -> Tensor: + """ + Samples `k` unique elements from the range `[0, population)`. + + Args: + population (int): Total population size. + k (int): Number of samples to draw. + device (Optional[str]): Device to store the sampled elements. + + Returns: + Tensor: A tensor of sampled elements. + """ + return paddle.arange(population) if population <= k else paddle.to_tensor(random.sample(range(population), k)) + + +def edge_index_to_vector(edge_index: Tensor, size: Tuple[int, int], bipartite: bool, force_undirected: bool = False) -> \ +Tuple[Tensor, int]: + """ + Converts an `edge_index` tensor to a flattened vector of unique indices. + + Args: + edge_index (Tensor): Edge indices of the graph. + size (Tuple[int, int]): Size of the graph. + bipartite (bool): If True, treats the graph as bipartite. + force_undirected (bool): If True, treats the edges as undirected. + + Returns: + Tuple[Tensor, int]: Flattened indices and the total population. + """ + row, col = edge_index[:, 0], edge_index[:, 1] + + if bipartite: + idx = row * size[1] + col + population = size[0] * size[1] + elif force_undirected: + num_nodes = size[0] + mask = row < col + offset = paddle.cumsum(paddle.ones([num_nodes - 1], dtype=row.dtype))[:-1] + idx = (row[mask] * num_nodes + col[mask] - offset).astype(row.dtype) + population = (num_nodes * (num_nodes + 1)) // 2 - num_nodes + else: + num_nodes = size[0] + mask = row != col + col[row < col] -= 1 + idx = row[mask] * (num_nodes - 1) + col[mask] + population = num_nodes * (num_nodes - 1) + + return idx, population + + +def vector_to_edge_index(idx: Tensor, size: Tuple[int, int], bipartite: bool, force_undirected: bool = False) -> Tensor: + """ + Converts a flattened index vector back to an `edge_index` format. + + Args: + idx (Tensor): Flattened index vector. + size (Tuple[int, int]): Size of the graph. + bipartite (bool): If True, treats the graph as bipartite. + force_undirected (bool): If True, treats the edges as undirected. + + Returns: + Tensor: Edge index tensor. + """ + if bipartite: + row = idx // size[1] + col = idx % size[1] + elif force_undirected: + assert size[0] == size[1] + num_nodes = size[0] + + offset = paddle.cumsum(paddle.ones([num_nodes - 1], dtype=idx.dtype))[:-1] + end = paddle.arange(num_nodes - 1, idx.shape[0] + 1, dtype=idx.dtype) + row = paddle.bucketize(idx, end - offset, right=True) + col = offset[row] + idx % num_nodes + row, col = paddle.concat([row, col]), paddle.concat([col, row]) + else: + num_nodes = size[0] + row = idx // (num_nodes - 1) + col = idx % (num_nodes - 1) + col[row <= col] += 1 + + return paddle.stack([row, col], axis=0) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_normalize_edge_index.py b/jointContribution/mattergen/paddle_geometric/utils/_normalize_edge_index.py new file mode 100644 index 00000000..1baa0f87 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_normalize_edge_index.py @@ -0,0 +1,46 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import add_self_loops as add_self_loops_fn +from paddle_geometric.utils import degree + + +def normalize_edge_index( + edge_index: Tensor, + num_nodes: Optional[int] = None, + add_self_loops: bool = True, + symmetric: bool = True, +) -> Tuple[Tensor, Tensor]: + """Applies normalization to the edges of a graph. + + This function can add self-loops to the graph and apply either symmetric or + asymmetric normalization based on the node degrees. + + Args: + edge_index (Tensor): The edge indices. + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + add_self_loops (bool, optional): If set to :obj:`False`, will not add + self-loops to the input graph. (default: :obj:`True`) + symmetric (bool, optional): If set to :obj:`True`, symmetric + normalization (:math:`D^{-1/2} A D^{-1/2}`) is used, otherwise + asymmetric normalization (:math:`D^{-1} A`). + """ + if add_self_loops: + edge_index, _ = add_self_loops_fn(edge_index, num_nodes=num_nodes) + + row, col = edge_index[0], edge_index[1] + deg = degree(row, num_nodes, dtype=paddle.get_default_dtype()) + + if symmetric: # D^-1/2 * A * D^-1/2 + deg_inv_sqrt = deg.pow(-0.5) + deg_inv_sqrt[paddle.isinf(deg_inv_sqrt)] = 0 + edge_weight = deg_inv_sqrt[row] * deg_inv_sqrt[col] + else: # D^-1 * A + deg_inv = deg.pow(-1) + deg_inv[paddle.isinf(deg_inv)] = 0 + edge_weight = deg_inv[row] + + return edge_index, edge_weight diff --git a/jointContribution/mattergen/paddle_geometric/utils/_normalized_cut.py b/jointContribution/mattergen/paddle_geometric/utils/_normalized_cut.py new file mode 100644 index 00000000..9d5a6d89 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_normalized_cut.py @@ -0,0 +1,37 @@ +from typing import Optional + +from paddle import Tensor + +from paddle_geometric.utils import degree + + +def normalized_cut( + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: Optional[int] = None, +) -> Tensor: + r"""Computes the normalized cut :math:`\mathbf{e}_{i,j} \cdot + \left( \frac{1}{\deg(i)} + \frac{1}{\deg(j)} \right)` of a weighted graph + given by edge indices and edge attributes. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor): Edge weights or multi-dimensional edge features. + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + :rtype: :class:`Tensor` + + Example: + >>> edge_index = paddle.to_tensor([[1, 1, 2, 3], + ... [3, 3, 1, 2]], dtype="int64") + >>> edge_attr = paddle.to_tensor([1., 1., 1., 1.]) + >>> normalized_cut(edge_index, edge_attr) + Tensor(shape=[4], dtype=float32, place=Place(cpu), stop_gradient=True, + [1.5, 1.5, 2.0, 1.5]) + """ + row, col = edge_index[0], edge_index[1] + deg = 1. / degree(col, num_nodes, dtype=edge_attr.dtype) + deg = deg[row] + deg[col] + cut = edge_attr * deg + return cut diff --git a/jointContribution/mattergen/paddle_geometric/utils/_one_hot.py b/jointContribution/mattergen/paddle_geometric/utils/_one_hot.py new file mode 100644 index 00000000..f7a58645 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_one_hot.py @@ -0,0 +1,35 @@ +from typing import Optional + +import paddle +from paddle import Tensor + + +def one_hot( + index: Tensor, + num_classes: Optional[int] = None, + dtype: Optional[paddle.dtype] = None, +) -> Tensor: + r"""Takes a one-dimensional :obj:`index` tensor and returns a one-hot + encoded representation of it with shape :obj:`[*, num_classes]` that has + zeros everywhere except where the index of last dimension matches the + corresponding value of the input tensor, in which case it will be :obj:`1`. + + Args: + index (paddle.Tensor): The one-dimensional input tensor. + num_classes (int, optional): The total number of classes. If set to + :obj:`None`, the number of classes will be inferred as one greater + than the largest class value in the input tensor. + (default: :obj:`None`) + dtype (paddle.dtype, optional): The :obj:`dtype` of the output tensor. + """ + if index.dim() != 1: + raise ValueError("'index' tensor needs to be one-dimensional") + + if num_classes is None: + num_classes = int(index.max()) + 1 + + index = paddle.to_tensor(index) + out = paddle.zeros((index.shape[0], num_classes), dtype=dtype) + + return out.put_along_axis_(indices=index.unsqueeze(1), values=paddle.ones([index.shape[0], 1], dtype=dtype), axis=1) + # return out.scatter_(paddle.to_tensor(1), index.unsqueeze(1), paddle.ones([index.shape[0]], dtype=dtype)) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_scatter.py b/jointContribution/mattergen/paddle_geometric/utils/_scatter.py new file mode 100644 index 00000000..531e7238 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_scatter.py @@ -0,0 +1,337 @@ +from typing import List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import is_compiling, is_in_onnx_export, warnings +from paddle_geometric.typing import paddle_scatter +from paddle_geometric.utils.functions import cumsum + +if paddle_geometric.typing.WITH_PADDLE_DEV: # pragma: no cover + + warnings.filterwarnings('ignore', '.*is in beta and the API may change.*') + + def scatter( + src: Tensor, + index: Tensor, + dim: int = 0, + dim_size: Optional[int] = None, + reduce: str = 'sum', + ) -> Tensor: + r"""Reduces all values from the :obj:`src` tensor at the indices + specified in the :obj:`index` tensor along a given dimension + :obj:`dim`. See the `documentation + `__ of the :obj:`torch_scatter` package for more + information. + + Args: + src (torch.Tensor): The source tensor. + index (torch.Tensor): The index tensor. + dim (int, optional): The dimension along which to index. + (default: :obj:`0`) + dim_size (int, optional): The size of the output tensor at + dimension :obj:`dim`. If set to :obj:`None`, will create a + minimal-sized output tensor according to + :obj:`index.max() + 1`. (default: :obj:`None`) + reduce (str, optional): The reduce operation (:obj:`"sum"`, + :obj:`"mean"`, :obj:`"mul"`, :obj:`"min"` or :obj:`"max"`, + :obj:`"any"`). (default: :obj:`"sum"`) + """ + if isinstance(index, Tensor) and index.dim() != 1: + raise ValueError(f"The `index` argument must be one-dimensional " + f"(got {index.dim()} dimensions)") + + dim = src.dim() + dim if dim < 0 else dim + + if isinstance(src, Tensor) and (dim < 0 or dim >= src.dim()): + raise ValueError(f"The `dim` argument must lay between 0 and " + f"{src.dim() - 1} (got {dim})") + + if dim_size is None: + dim_size = int(index.max()) + 1 if index.numel() > 0 else 0 + + # For now, we maintain various different code paths, based on whether + # the input requires gradients and whether it lays on the CPU/GPU. + # For example, `torch_scatter` is usually faster than + # `torch.scatter_reduce` on GPU, while `torch.scatter_reduce` is faster + # on CPU. + # `torch.scatter_reduce` has a faster forward implementation for + # "min"/"max" reductions since it does not compute additional arg + # indices, but is therefore way slower in its backward implementation. + # More insights can be found in `test/utils/test_scatter.py`. + + size = list(src.shape[:dim]) + [dim_size] + list(src.shape[dim + 1:]) + + # For "any" reduction, we use regular `put_along_axis_`: + if reduce == 'any': + index = broadcast(index, src, dim) + return paddle.zeros(size).put_along_axis_(axis=dim, indices=index, values=src) + + # For "sum" and "mean" reduction, we make use of `put_along_axis_`: + if reduce == 'sum' or reduce == 'add': + index = broadcast(index, src, dim) + return paddle.zeros(size).put_along_axis_(axis=dim, indices=index, values=src) + + if reduce == 'mean': + count = paddle.zeros(dim_size) + count.put_along_axis_(axis=0, indices=index, values=paddle.ones(src.shape[dim])) + count = count.clamp(min=1) + + index = broadcast(index, src, dim) + out = paddle.zeros(size).put_along_axis_(axis=dim, indices=index, values=src) + + return out / broadcast(count, out, dim) + + # For "min" and "max" reduction, we prefer `scatter_reduce_` on CPU or + # in case the input does not require gradients:PADDLE + if reduce in ['min', 'max', 'amin', 'amax']: + if (not paddle_geometric.typing.WITH_PADDLE_SCATTER + or is_compiling() or is_in_onnx_export() or not src.place.is_gpu_place() + or not src.requires_grad): + + if hasattr(src, 'requires_grad') and src.requires_grad: + print("Warning: Gradient computation is not yet supported in PaddlePaddle for this function.") + if (src.place.is_gpu_place() and src.requires_grad and not is_compiling() + and not is_in_onnx_export()): + warnings.warn(f"The usage of `scatter(reduce='{reduce}')` " + f"can be accelerated via the 'torch-scatter'" + f" package, but it was not found") + + index = broadcast(index, src, dim) + if not is_in_onnx_export(): + return paddle.zeros(size).scatter_reduce_( + dim, index, src, reduce=f'a{reduce[-3:]}', + include_self=False) + + fill = paddle.full( # type: ignore + shape=[1, ], + fill_value=src.min() if 'max' in reduce else src.max(), + dtype=src.dtype, + ).expand_as(src) + out = paddle.zeros(size).scatter_reduce_( + dim, index, fill, reduce=f'a{reduce[-3:]}', + include_self=True) + return out.scatter_reduce_(dim, index, src, + reduce=f'a{reduce[-3:]}', + include_self=True) + + return paddle_scatter.scatter(src, index, dim, dim_size=dim_size, + reduce=reduce[-3:]) + + # For "mul" reduction, we prefer `scatter_reduce_` on CPU: + if reduce == 'mul': + if (not paddle_geometric.typing.WITH_PADDLE_SCATTER + or is_compiling() or not src.place.is_gpu_place()): + + if src.place.is_gpu_place() and not is_compiling(): + warnings.warn(f"The usage of `scatter(reduce='{reduce}')` " + f"can be accelerated via the 'torch-scatter'" + f" package, but it was not found") + + index = broadcast(index, src, dim) + # We initialize with `one` here to match `scatter_mul` output: + return paddle.ones(size).scatter_reduce_( + dim, index, src, reduce='prod', include_self=True) + + return paddle_scatter.scatter(src, index, dim, dim_size=dim_size, + reduce='mul') + + raise ValueError(f"Encountered invalid `reduce` argument '{reduce}'") + +else: # pragma: no cover + def scatter( + src: Tensor, + index: Tensor, + dim: int = 0, + dim_size: Optional[int] = None, + reduce: str = 'sum', + ) -> Tensor: + r"""Reduces all values from the :obj:`src` tensor at the indices + specified in the :obj:`index` tensor along a given dimension + :obj:`dim`. See the `documentation + `_ of the :obj:`torch_scatter` package for more + information. + + Args: + src (torch.Tensor): The source tensor. + index (torch.Tensor): The index tensor. + dim (int, optional): The dimension along which to index. + (default: :obj:`0`) + dim_size (int, optional): The size of the output tensor at + dimension :obj:`dim`. If set to :obj:`None`, will create a + minimal-sized output tensor according to + :obj:`index.max() + 1`. (default: :obj:`None`) + reduce (str, optional): The reduce operation (:obj:`"sum"`, + :obj:`"mean"`, :obj:`"mul"`, :obj:`"min"` or :obj:`"max"`, + :obj:`"any"`). (default: :obj:`"sum"`) + """ + if reduce == 'any': + dim = src.dim() + dim if dim < 0 else dim + + if dim_size is None: + dim_size = int(index.max()) + 1 if index.numel() > 0 else 0 + + size = src.shape[:dim] + (dim_size, ) + src.shape[dim + 1:] + + index = broadcast(index, src, dim) + return paddle.zeros(size).scatter_(dim, index, src) + + if not paddle_geometric.typing.WITH_PADDLE_SCATTER: + raise ImportError("'scatter' requires the 'paddle-scatter' package") + + if reduce == 'amin' or reduce == 'amax': + reduce = reduce[-3:] + + return paddle_scatter.scatter(src, index, dim, dim_size=dim_size, + reduce=reduce) + + +def broadcast(src: Tensor, ref: Tensor, dim: int) -> Tensor: + dim = ref.dim() + dim if dim < 0 else dim + size = [1] * dim + [-1] + [1] * (ref.dim() - dim - 1) + return paddle.reshape(src, size).expand_as(ref) + + +def scatter_argmax( + src: Tensor, + index: Tensor, + dim: int = 0, + dim_size: Optional[int] = None, +) -> Tensor: + + if (paddle_geometric.typing.WITH_PADDLE_SCATTER and not is_compiling() + and not is_in_onnx_export()): + out = paddle_scatter.scatter_max(src, index, dim=dim, dim_size=dim_size) + return out[1] + + # Only implemented under certain conditions for now :( + assert src.dim() == 1 and index.dim() == 1 + assert dim == 0 or dim == -1 + assert src.numel() == index.numel() + + if dim_size is None: + dim_size = int(index.max()) + 1 if index.numel() > 0 else 0 + + raise ValueError("'Not Implemented scatter_argmax' requires Paddle") + + out = index.new_full((dim_size, ), fill_value=dim_size - 1) + nonzero = (src == res[index]).nonzero().view(-1) + out[index[nonzero]] = nonzero + + return out + + +def group_argsort( + src: Tensor, + index: Tensor, + dim: int = 0, + num_groups: Optional[int] = None, + descending: bool = False, + return_consecutive: bool = False, + stable: bool = False, +) -> Tensor: + r"""Returns the indices that sort the tensor :obj:`src` along a given + dimension in ascending order by value. + In contrast to :meth:`torch.argsort`, sorting is performed in groups + according to the values in :obj:`index`. + + Args: + src (torch.Tensor): The source tensor. + index (torch.Tensor): The index tensor. + dim (int, optional): The dimension along which to index. + (default: :obj:`0`) + num_groups (int, optional): The number of groups. + (default: :obj:`None`) + descending (bool, optional): Controls the sorting order (ascending or + descending). (default: :obj:`False`) + return_consecutive (bool, optional): If set to :obj:`True`, will not + offset the output to start from :obj:`0` for each group. + (default: :obj:`False`) + stable (bool, optional): Controls the relative order of equivalent + elements. (default: :obj:`False`) + + Example: + >>> src = torch.tensor([0, 1, 5, 4, 3, 2, 6, 7, 8]) + >>> index = torch.tensor([0, 0, 1, 1, 1, 1, 2, 2, 2]) + >>> group_argsort(src, index) + tensor([0, 1, 3, 2, 1, 0, 0, 1, 2]) + """ + # Only implemented under certain conditions for now :( + assert src.dim() == 1 and index.dim() == 1 + assert dim == 0 or dim == -1 + assert src.numel() == index.numel() + + if src.numel() == 0: + return paddle.zeros_like(src) + + # Normalize `src` to range [0, 1]: + src = src - src.min() + src = src / src.max() + + # Compute `grouped_argsort`: + src = src - 2 * index if descending else src + 2 * index + + perm = src.argsort(descending=descending) + if stable: + warnings.warn("Ignoring option `stable=True` in 'group_argsort' " + "since it requires Paddle") + + out = paddle.empty_like(index) + out[perm] = paddle.arange(index.numel(), device=index.device) + + if return_consecutive: + return out + + # Compute cumulative sum of number of entries with the same index: + count = scatter(paddle.ones_like(index), index, dim=dim, + dim_size=num_groups, reduce='sum') + ptr = cumsum(count) + + return out - ptr[index] + + +def group_cat( + tensors: Union[List[Tensor], Tuple[Tensor, ...]], + indices: Union[List[Tensor], Tuple[Tensor, ...]], + dim: int = 0, + return_index: bool = False, +) -> Union[Tensor, Tuple[Tensor, Tensor]]: + r"""Concatenates the given sequence of tensors :obj:`tensors` in the given + dimension :obj:`dim`. + Different from :meth:`torch.cat`, values along the concatenating dimension + are grouped according to the indices defined in the :obj:`index` tensors. + All tensors must have the same shape (except in the concatenating + dimension). + + Args: + tensors ([Tensor]): Sequence of tensors. + indices ([Tensor]): Sequence of index tensors. + dim (int, optional): The dimension along which the tensors are + concatenated. (default: :obj:`0`) + return_index (bool, optional): If set to :obj:`True`, will return the + new index tensor. (default: :obj:`False`) + + Example: + >>> x1 = torch.tensor([[0.2716, 0.4233], + ... [0.3166, 0.0142], + ... [0.2371, 0.3839], + ... [0.4100, 0.0012]]) + >>> x2 = torch.tensor([[0.3752, 0.5782], + ... [0.7757, 0.5999]]) + >>> index1 = torch.tensor([0, 0, 1, 2]) + >>> index2 = torch.tensor([0, 2]) + >>> scatter_concat([x1,x2], [index1, index2], dim=0) + tensor([[0.2716, 0.4233], + [0.3166, 0.0142], + [0.3752, 0.5782], + [0.2371, 0.3839], + [0.4100, 0.0012], + [0.7757, 0.5999]]) + """ + assert len(tensors) == len(indices) + index, perm = paddle.concat(indices).sort(stable=True) + out = paddle.concat(tensors, axis=0)[perm] + return (out, index) if return_index else out diff --git a/jointContribution/mattergen/paddle_geometric/utils/_segment.py b/jointContribution/mattergen/paddle_geometric/utils/_segment.py new file mode 100644 index 00000000..f6e508fd --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_segment.py @@ -0,0 +1,60 @@ +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import is_compiling +from paddle_geometric.typing import paddle_scatter + + +def segment(src: Tensor, ptr: Tensor, reduce: str = 'sum') -> Tensor: + r"""Reduces all values in the first dimension of the :obj:`src` tensor + within the ranges specified in the :obj:`ptr`. See the `documentation + `__ of the :obj:`paddle_scatter` package for more + information. + + Args: + src (paddle.Tensor): The source tensor. + ptr (paddle.Tensor): A monotonically increasing pointer tensor that + refers to the boundaries of segments such that :obj:`ptr[0] = 0` + and :obj:`ptr[-1] = src.size(0)`. + reduce (str, optional): The reduce operation (:obj:`"sum"`, + :obj:`"mean"`, :obj:`"min"` or :obj:`"max"`). + (default: :obj:`"sum"`) + """ + if not paddle_geometric.typing.WITH_PADDLE_SCATTER or is_compiling(): + return _paddle_segment(src, ptr, reduce) + + if (ptr.ndim == 1 and paddle_geometric.typing.WITH_PADDLE2 and src.is_gpu() + and reduce == 'mean'): + return _paddle_segment(src, ptr, reduce) + + return paddle_scatter.segment_csr(src, ptr, reduce=reduce) + + +def _paddle_segment(src: Tensor, ptr: Tensor, reduce: str = 'sum') -> Tensor: + if not paddle_geometric.typing.WITH_PADDLE2: + raise ImportError("'segment' requires the 'paddle-scatter' package") + if ptr.ndim > 1: + raise ImportError("'segment' in an arbitrary dimension " + "requires the 'paddle-scatter' package") + + if reduce in ['min', 'max']: + reduce_func = paddle.min if reduce == 'min' else paddle.max + initial = None + elif reduce == 'mean': + reduce_func = paddle.mean + initial = 0 + else: + reduce_func = paddle.sum + initial = 0 + + segments = [] + for i in range(ptr.shape[0] - 1): + start, end = ptr[i].item(), ptr[i + 1].item() + segment = src[start:end] + if initial is not None: + segment = paddle.where(segment.isinf(), paddle.to_tensor(initial, dtype=segment.dtype), segment) + segments.append(reduce_func(segment, axis=0)) + + return paddle.stack(segments) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_select.py b/jointContribution/mattergen/paddle_geometric/utils/_select.py new file mode 100644 index 00000000..a1d3c267 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_select.py @@ -0,0 +1,68 @@ +from typing import Any, List, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import TensorFrame +from paddle_geometric.utils.mask import mask_select +from paddle_geometric.utils.sparse import is_paddle_sparse_tensor + + +def select( + src: Union[Tensor, List[Any], TensorFrame], + index_or_mask: Tensor, + dim: int, +) -> Union[Tensor, List[Any]]: + r"""Selects the input tensor or input list according to a given index or + mask vector. + + Args: + src (paddle.Tensor or list): The input tensor or list. + index_or_mask (paddle.Tensor): The index or mask vector. + dim (int): The dimension along which to select. + """ + if isinstance(src, Tensor): + if index_or_mask.dtype == paddle.bool: + return mask_select(src, dim, index_or_mask) + return paddle.index_select(src, index=index_or_mask, axis=dim) + + if isinstance(src, (tuple, list)): + if dim != 0: + raise ValueError("Cannot select along dimension other than 0") + if index_or_mask.dtype == paddle.bool: + return [src[i] for i, m in enumerate(index_or_mask.numpy()) if m] + return [src[i] for i in index_or_mask.numpy()] + + if isinstance(src, TensorFrame): + assert dim == 0 + if index_or_mask.dtype == paddle.bool: + return mask_select(src, dim, index_or_mask) + return src[index_or_mask.numpy()] + + raise ValueError(f"Encountered invalid input type (got '{type(src)}')") + + +def narrow(src: Union[Tensor, List[Any]], dim: int, start: int, + length: int) -> Union[Tensor, List[Any]]: + r"""Narrows the input tensor or input list to the specified range. + + Args: + src (paddle.Tensor or list): The input tensor or list. + dim (int): The dimension along which to narrow. + start (int): The starting dimension. + length (int): The distance to the ending dimension. + """ + if isinstance(src, Tensor) and is_paddle_sparse_tensor(src): + # Paddle currently does not fully support sparse tensor narrowing. + index = paddle.arange(start, start + length, dtype='int64') + return paddle.index_select(src, index=index, axis=dim) + + if isinstance(src, Tensor): + return src.slice([dim], [start], [start + length]) + + if isinstance(src, list): + if dim != 0: + raise ValueError("Cannot narrow along dimension other than 0") + return src[start:start + length] + + raise ValueError(f"Encountered invalid input type (got '{type(src)}')") diff --git a/jointContribution/mattergen/paddle_geometric/utils/_softmax.py b/jointContribution/mattergen/paddle_geometric/utils/_softmax.py new file mode 100644 index 00000000..f2491374 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_softmax.py @@ -0,0 +1,66 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import is_compiling +from paddle_geometric.typing import pyg_lib +from paddle_geometric.utils import scatter, segment +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def softmax( + src: Tensor, + index: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + num_nodes: Optional[int] = None, + axis: int = 0, +) -> Tensor: + r"""Computes a sparsely evaluated softmax. + Given a value tensor :attr:`src`, this function first groups the values + along the first dimension based on the indices specified in :attr:`index`, + and then proceeds to compute the softmax individually for each group. + + Args: + src (Tensor): The source tensor. + index (Tensor, optional): The indices of elements for applying the + softmax. (default: :obj:`None`) + ptr (Tensor, optional): If given, computes the softmax based on + sorted inputs in CSR representation. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`index`. (default: :obj:`None`) + axis (int, optional): The dimension in which to normalize. + (default: :obj:`0`) + + :rtype: :class:`Tensor` + """ + if (ptr is not None and src.place.is_cpu_place() + and paddle_geometric.typing.WITH_SOFTMAX + and not is_compiling()): # pragma: no cover + return pyg_lib.ops.softmax_csr(src, ptr, axis) + + if (ptr is not None and + (ptr.dim() == 1 or (ptr.dim() > 1 and index is None) or + (paddle_geometric.typing.WITH_PADDLE_SCATTER and not is_compiling()))): + + axis = axis + src.dim() if axis < 0 else axis + size = ([1] * axis) + [-1] + count = ptr[1:] - ptr[:-1] + ptr = ptr.reshape(size) + src_max = segment(src.detach(), ptr, reduce='max') + src_max = paddle.repeat_interleave(src_max, repeats=count, axis=axis) + out = paddle.exp(src - src_max) + out_sum = segment(out, ptr, reduce='sum') + 1e-16 + out_sum = paddle.repeat_interleave(out_sum, repeats=count, axis=axis) + elif index is not None: + N = maybe_num_nodes(index, num_nodes) + src_max = scatter(src.detach(), index, axis, dim_size=N, reduce='max') + out = src - paddle.index_select(src_max, index=index, axis=axis) + out = paddle.exp(out) + out_sum = scatter(out, index, axis, dim_size=N, reduce='sum') + 1e-16 + out_sum = paddle.index_select(out_sum, index=index, axis=axis) + else: + raise NotImplementedError("'softmax' requires 'index' to be specified") + + return out / out_sum diff --git a/jointContribution/mattergen/paddle_geometric/utils/_sort_edge_index.py b/jointContribution/mattergen/paddle_geometric/utils/_sort_edge_index.py new file mode 100644 index 00000000..73a62727 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_sort_edge_index.py @@ -0,0 +1,138 @@ +import typing +from typing import List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import EdgeIndex +from paddle_geometric.edge_index import SortOrder +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import index_sort, lexsort +from paddle_geometric.utils.num_nodes import maybe_num_nodes + +from typing import overload + +MISSING = '???' + + +@overload +def sort_edge_index( + edge_index: Tensor, + edge_attr: str = MISSING, + num_nodes: Optional[int] = None, + sort_by_row: bool = True, +) -> Tensor: + pass + + +@overload +def sort_edge_index( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: Optional[int] = None, + sort_by_row: bool = True, +) -> Tuple[Tensor, Tensor]: + pass + + +@overload +def sort_edge_index( # noqa: F811 + edge_index: Tensor, + edge_attr: OptTensor, + num_nodes: Optional[int] = None, + sort_by_row: bool = True, +) -> Tuple[Tensor, OptTensor]: + pass + + +@overload +def sort_edge_index( # noqa: F811 + edge_index: Tensor, + edge_attr: List[Tensor], + num_nodes: Optional[int] = None, + sort_by_row: bool = True, +) -> Tuple[Tensor, List[Tensor]]: + pass + + +def sort_edge_index( # noqa: F811 + edge_index: Tensor, + edge_attr: Union[OptTensor, List[Tensor], str] = MISSING, + num_nodes: Optional[int] = None, + sort_by_row: bool = True, +) -> Union[Tensor, Tuple[Tensor, OptTensor], Tuple[Tensor, List[Tensor]]]: + """Row-wise sorts :obj:`edge_index`. + + Args: + edge_index (torch.Tensor): The edge indices. + edge_attr (torch.Tensor or List[torch.Tensor], optional): Edge weights + or multi-dimensional edge features. + If given as a list, will re-shuffle and remove duplicates for all + its entries. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + sort_by_row (bool, optional): If set to :obj:`False`, will sort + :obj:`edge_index` column-wise/by destination node. + (default: :obj:`True`) + + :rtype: :class:`LongTensor` if :attr:`edge_attr` is not passed, else + (:class:`LongTensor`, :obj:`Optional[Tensor]` or :obj:`List[Tensor]]`) + + .. warning:: + + From :pyg:`PyG >= 2.3.0` onwards, this function will always return a + tuple whenever :obj:`edge_attr` is passed as an argument (even in case + it is set to :obj:`None`). + + Examples: + >>> edge_index = torch.tensor([[2, 1, 1, 0], + [1, 2, 0, 1]]) + >>> edge_attr = torch.tensor([[1], [2], [3], [4]]) + >>> sort_edge_index(edge_index) + tensor([[0, 1, 1, 2], + [1, 0, 2, 1]]) + + >>> sort_edge_index(edge_index, edge_attr) + (tensor([[0, 1, 1, 2], + [1, 0, 2, 1]]), + tensor([[4], + [3], + [2], + [1]])) + """ + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + if num_nodes * num_nodes > paddle_geometric.typing.MAX_INT64: + # if not paddle_geometric.typing.WITH_PT113: + # raise ValueError("'sort_edge_index' will result in an overflow") + perm = lexsort(keys=[ + edge_index[int(sort_by_row)], + edge_index[1 - int(sort_by_row)], + ]) + else: + idx = edge_index[1 - int(sort_by_row)] * num_nodes + idx += edge_index[int(sort_by_row)] + _, perm = index_sort(idx, max_value=num_nodes * num_nodes) + + if isinstance(edge_index, Tensor): + is_undirected = False + if not paddle.in_dynamic_mode() and isinstance(edge_index, EdgeIndex): + is_undirected = edge_index.is_undirected + edge_index = edge_index[:, perm] + if not paddle.in_dynamic_mode() and isinstance(edge_index, EdgeIndex): + edge_index._sort_order = SortOrder('row' if sort_by_row else 'col') + edge_index._is_undirected = is_undirected + elif isinstance(edge_index, tuple): + edge_index = (edge_index[0][perm], edge_index[1][perm]) + else: + raise NotImplementedError + + if edge_attr is None: + return edge_index, None + if isinstance(edge_attr, Tensor): + return edge_index, edge_attr[perm] + if isinstance(edge_attr, (list, tuple)): + return edge_index, [e[perm] for e in edge_attr] + + return edge_index diff --git a/jointContribution/mattergen/paddle_geometric/utils/_spmm.py b/jointContribution/mattergen/paddle_geometric/utils/_spmm.py new file mode 100644 index 00000000..ebeacad0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_spmm.py @@ -0,0 +1,70 @@ +import warnings + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import EdgeIndex +from paddle_geometric.typing import Adj, SparseTensor +from paddle_geometric.utils import scatter + +def spmm( + src: Adj, + other: Tensor, + reduce: str = 'sum', +) -> Tensor: + r"""Matrix product of sparse matrix with dense matrix. + + Args: + src (paddle.Tensor or paddle_sparse.SparseTensor or EdgeIndex): + The input sparse matrix which can be a + :pyg:`paddle_geometric` :class:`paddle_sparse.SparseTensor`, + a :paddle:`Paddle` :class:`paddle.sparse.Tensor` or + a :pyg:`paddle_geometric` :class:`EdgeIndex`. + other (paddle.Tensor): The input dense matrix. + reduce (str, optional): The reduce operation to use + (:obj:`"sum"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`). + (default: :obj:`"sum"`) + + :rtype: :class:`Tensor` + """ + reduce = 'sum' if reduce == 'add' else reduce + + if reduce not in ['sum', 'mean', 'min', 'max']: + raise ValueError(f"`reduce` argument '{reduce}' not supported") + + if isinstance(src, EdgeIndex): + return src.matmul(other=other, reduce=reduce) + + if isinstance(src, SparseTensor): + if src.nnz() == 0: + return paddle.zeros([src.shape[0], other.shape[1]], dtype=other.dtype) + + # Use Paddle's sparse mm if available + if paddle.version.full_version >= "2.0.0" and other.ndim == 2: + return paddle.sparse.matmul(src, other) + + return paddle.sparse.matmul(src, other) + + if not isinstance(src, paddle.sparse.coo_tensor): + raise ValueError("'src' must be a 'paddle.sparse.SparseTensor' or a 'paddle.sparse.coo_tensor'") + + # If reducing by "sum" + if reduce == 'sum': + return paddle.sparse.matmul(src, other) + + # Handle "mean" reduction by dividing by the degree: + if reduce == 'mean': + if isinstance(src, paddle.sparse.csr_tensor): + ptr = src.crow_indices() + deg = ptr[1:] - ptr[:-1] + else: # Assuming COO format + src = src.coalesce() + ones = paddle.ones_like(src.values()) + index = src.indices()[0] + deg = scatter(ones, index, 0, dim_size=src.shape[0], reduce='sum') + + return paddle.sparse.matmul(src, other) / deg.reshape([-1, 1]).clip(min=1) + + raise ValueError(f"`{reduce}` reduction is not supported for " + f"'paddle.sparse.Tensor' on device '{src.place}'") diff --git a/jointContribution/mattergen/paddle_geometric/utils/_subgraph.py b/jointContribution/mattergen/paddle_geometric/utils/_subgraph.py new file mode 100644 index 00000000..d7d8440c --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_subgraph.py @@ -0,0 +1,388 @@ +from typing import List, Literal, Optional, Tuple, Union, overload + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import OptTensor, PairTensor +from paddle_geometric.utils import scatter +from paddle_geometric.utils.map import map_index +from paddle_geometric.utils.mask import index_to_mask +from paddle_geometric.utils.num_nodes import maybe_num_nodes + +def get_num_hops(model: paddle.nn.Layer) -> int: + r"""Returns the number of hops the model is aggregating information + from. + + Example: + >>> class GNN(paddle.nn.Layer): + ... def __init__(self): + ... super().__init__() + ... self.conv1 = GCNConv(3, 16) + ... self.conv2 = GCNConv(16, 16) + ... self.lin = Linear(16, 2) + ... + ... def forward(self, x, edge_index): + ... x = self.conv1(x, edge_index).relu() + ... x = self.conv2(x, edge_index).relu() + ... return self.lin(x) + >>> get_num_hops(GNN()) + 2 + """ + from paddle_geometric.nn.conv import MessagePassing + num_hops = 0 + for module in model.sublayers(): + if isinstance(module, MessagePassing): + num_hops += 1 + return num_hops + + +@overload +def subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = ..., + relabel_nodes: bool = ..., + num_nodes: Optional[int] = ..., +) -> Tuple[Tensor, OptTensor]: + pass + + +@overload +def subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = ..., + relabel_nodes: bool = ..., + num_nodes: Optional[int] = ..., + *, + return_edge_mask: Literal[False], +) -> Tuple[Tensor, OptTensor]: + pass + + +@overload +def subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = ..., + relabel_nodes: bool = ..., + num_nodes: Optional[int] = ..., + *, + return_edge_mask: Literal[True], +) -> Tuple[Tensor, OptTensor, Tensor]: + pass + + +def subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = None, + relabel_nodes: bool = False, + num_nodes: Optional[int] = None, + *, + return_edge_mask: bool = False, +) -> Union[Tuple[Tensor, OptTensor], Tuple[Tensor, OptTensor, Tensor]]: + r"""Returns the induced subgraph of :obj:`(edge_index, edge_attr)` + containing the nodes in :obj:`subset`. + + Args: + subset (LongTensor, BoolTensor or [int]): The nodes to keep. + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional + edge features. (default: :obj:`None`) + relabel_nodes (bool, optional): If set to :obj:`True`, the resulting + :obj:`edge_index` will be relabeled to hold consecutive indices + starting from zero. (default: :obj:`False`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max(edge_index) + 1`. (default: :obj:`None`) + return_edge_mask (bool, optional): If set to :obj:`True`, will return + the edge mask to filter out additional edge features. + (default: :obj:`False`) + + :rtype: (:class:`LongTensor`, :class:`Tensor`) + + Examples: + >>> edge_index = paddle.to_tensor([[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6], + ... [1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 5]]) + >>> edge_attr = paddle.to_tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) + >>> subset = paddle.to_tensor([3, 4, 5]) + >>> subgraph(subset, edge_index, edge_attr) + (tensor([[3, 4, 4, 5], + [4, 3, 5, 4]]), + tensor([ 7., 8., 9., 10.])) + + >>> subgraph(subset, edge_index, edge_attr, return_edge_mask=True) + (tensor([[3, 4, 4, 5], + [4, 3, 5, 4]]), + tensor([ 7., 8., 9., 10.]), + tensor([False, False, False, False, False, False, True, + True, True, True, False, False])) + """ + # device = edge_index.device + + if isinstance(subset, (list, tuple)): + subset = paddle.to_tensor(subset, dtype=paddle.int64) + + if subset.dtype != paddle.bool: + num_nodes = maybe_num_nodes(edge_index, num_nodes) + node_mask = index_to_mask(subset, size=num_nodes) + else: + num_nodes = subset.shape[0] + node_mask = subset + subset = node_mask.nonzero().flatten() + + edge_mask = node_mask[edge_index[0]] & node_mask[edge_index[1]] + edge_index = edge_index[:, edge_mask] + edge_attr = edge_attr[edge_mask] if edge_attr is not None else None + + if relabel_nodes: + edge_index, _ = map_index( + edge_index.flatten(), + subset, + max_index=num_nodes, + inclusive=True, + ) + edge_index = edge_index.reshape([2, -1]) + + if return_edge_mask: + return edge_index, edge_attr, edge_mask + else: + return edge_index, edge_attr + + +def bipartite_subgraph( + subset: Union[PairTensor, Tuple[List[int], List[int]]], + edge_index: Tensor, + edge_attr: OptTensor = None, + relabel_nodes: bool = False, + size: Optional[Tuple[int, int]] = None, + return_edge_mask: bool = False, +) -> Union[Tuple[Tensor, OptTensor], Tuple[Tensor, OptTensor, OptTensor]]: + r"""Returns the induced subgraph of the bipartite graph + :obj:`(edge_index, edge_attr)` containing the nodes in :obj:`subset`.""" + + device = edge_index.device + + src_subset, dst_subset = subset + if not isinstance(src_subset, Tensor): + src_subset = paddle.to_tensor(src_subset, dtype=paddle.int64) + if not isinstance(dst_subset, Tensor): + dst_subset = paddle.to_tensor(dst_subset, dtype=paddle.int64) + + if src_subset.dtype != paddle.bool: + src_size = int(edge_index[0].max()) + 1 if size is None else size[0] + src_node_mask = index_to_mask(src_subset, size=src_size) + else: + src_size = src_subset.shape[0] + src_node_mask = src_subset + src_subset = src_subset.nonzero().flatten() + + if dst_subset.dtype != paddle.bool: + dst_size = int(edge_index[1].max()) + 1 if size is None else size[1] + dst_node_mask = index_to_mask(dst_subset, size=dst_size) + else: + dst_size = dst_subset.shape[0] + dst_node_mask = dst_subset + dst_subset = dst_subset.nonzero().flatten() + + edge_mask = src_node_mask[edge_index[0]] & dst_node_mask[edge_index[1]] + edge_index = edge_index[:, edge_mask] + edge_attr = edge_attr[edge_mask] if edge_attr is not None else None + + if relabel_nodes: + src_index, _ = map_index(edge_index[0], src_subset, max_index=src_size, + inclusive=True) + dst_index, _ = map_index(edge_index[1], dst_subset, max_index=dst_size, + inclusive=True) + edge_index = paddle.stack([src_index, dst_index], axis=0) + + if return_edge_mask: + return edge_index, edge_attr, edge_mask + else: + return edge_index, edge_attr + + +def k_hop_subgraph( + node_idx: Union[int, List[int], Tensor], + num_hops: int, + edge_index: Tensor, + relabel_nodes: bool = False, + num_nodes: Optional[int] = None, + flow: str = 'source_to_target', + directed: bool = False, +) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + r"""Computes the induced subgraph of :obj:`edge_index` around all nodes in + :attr:`node_idx` reachable within :math:`k` hops.""" + + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + assert flow in ['source_to_target', 'target_to_source'] + if flow == 'target_to_source': + row, col = edge_index + else: + col, row = edge_index + + node_mask = paddle.full([num_nodes], False, dtype=paddle.bool) + edge_mask = paddle.full([row.shape[0]], False, dtype=paddle.bool) + + if isinstance(node_idx, int): + node_idx = paddle.to_tensor([node_idx], dtype=paddle.int64) + elif isinstance(node_idx, (list, tuple)): + node_idx = paddle.to_tensor(node_idx, dtype=paddle.int64) + else: + node_idx = node_idx.to(row.device) + + subsets = [node_idx] + + for _ in range(num_hops): + node_mask = paddle.full([num_nodes], False, dtype='bool') + node_mask[subsets[-1]] = True + # paddle.assign(paddle.index_select(node_mask, axis=0, index=row), edge_mask) + node_mask_int = paddle.cast(node_mask, 'int32') + edge_mask = paddle.index_select(node_mask_int, axis=0, index=row) + edge_mask = paddle.cast(edge_mask, 'bool') + subsets.append(col[edge_mask]) + + subset, inv = paddle.concat(subsets).unique(return_inverse=True) + inv = inv[:node_idx.numel()] + + node_mask.fill_(False) + node_mask[subset] = True + + if not directed: + edge_mask = node_mask[row] & node_mask[col] + + edge_index = edge_index[:, edge_mask] + + if relabel_nodes: + mapping = paddle.full([num_nodes], -1, dtype=paddle.int64) + mapping[subset] = paddle.arange(subset.shape[0], dtype=paddle.int64) + edge_index = mapping[edge_index] + + return subset, edge_index, inv, edge_mask + +@overload +def hyper_subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = ..., + relabel_nodes: bool = ..., + num_nodes: Optional[int] = ..., +) -> Tuple[Tensor, OptTensor]: + pass + + +@overload +def hyper_subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = ..., + relabel_nodes: bool = ..., + num_nodes: Optional[int] = ..., + *, + return_edge_mask: Literal[False], +) -> Tuple[Tensor, OptTensor]: + pass + + +@overload +def hyper_subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = ..., + relabel_nodes: bool = ..., + num_nodes: Optional[int] = ..., + *, + return_edge_mask: Literal[True], +) -> Tuple[Tensor, OptTensor, Tensor]: + pass + + +def hyper_subgraph( + subset: Union[Tensor, List[int]], + edge_index: Tensor, + edge_attr: OptTensor = None, + relabel_nodes: bool = False, + num_nodes: Optional[int] = None, + return_edge_mask: bool = False, +) -> Union[Tuple[Tensor, OptTensor], Tuple[Tensor, OptTensor, Tensor]]: + r"""Returns the induced subgraph of the hyper graph of + :obj:`(edge_index, edge_attr)` containing the nodes in :obj:`subset`. + + Args: + subset (paddle.Tensor or [int]): The nodes to keep. + edge_index (LongTensor): Hyperedge tensor + with shape :obj:`[2, num_edges*num_nodes_per_edge]`, where + :obj:`edge_index[1]` denotes the hyperedge index and + :obj:`edge_index[0]` denotes the node indices that are connected + by the hyperedge. + edge_attr (paddle.Tensor, optional): Edge weights or multi-dimensional + edge features of shape :obj:`[num_edges, *]`. + (default: :obj:`None`) + relabel_nodes (bool, optional): If set to :obj:`True`, the + resulting :obj:`edge_index` will be relabeled to hold + consecutive indices starting from zero. (default: :obj:`False`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max(edge_index[0]) + 1`. (default: :obj:`None`) + return_edge_mask (bool, optional): If set to :obj:`True`, will return + the edge mask to filter out additional edge features. + (default: :obj:`False`) + + :rtype: (:class:`LongTensor`, :class:`Tensor`) + + Examples: + >>> edge_index = paddle.to_tensor([[0, 1, 2, 1, 2, 3, 0, 2, 3], + ... [0, 0, 0, 1, 1, 1, 2, 2, 2]]) + >>> edge_attr = paddle.to_tensor([3, 2, 6]) + >>> subset = paddle.to_tensor([0, 3]) + >>> hyper_subgraph(subset, edge_index, edge_attr) + (tensor([[0, 3], + [0, 0]]), + tensor([ 6.])) + + >>> hyper_subgraph(subset, edge_index, edge_attr, return_edge_mask=True) + (tensor([[0, 3], + [0, 0]]), + tensor([ 6.]), + tensor([False, False, True])) + """ + device = edge_index.device + + if isinstance(subset, (list, tuple)): + subset = paddle.to_tensor(subset, dtype=paddle.int64) + + if subset.dtype != paddle.bool: + num_nodes = maybe_num_nodes(edge_index, num_nodes) + node_mask = index_to_mask(subset, size=num_nodes) + else: + num_nodes = subset.shape[0] + node_mask = subset + + # Mask all connections that contain a node not in the subset + hyper_edge_connection_mask = node_mask[edge_index[0]] # num_edges*num_nodes_per_edge + + # Mask hyperedges that contain one or less nodes from the subset + edge_mask = scatter(hyper_edge_connection_mask.astype(paddle.int64), + edge_index[1], reduce='sum') > 1 + + # Mask connections if hyperedge contains one or less nodes from the subset + # or is connected to a node not in the subset + hyper_edge_connection_mask = hyper_edge_connection_mask & edge_mask[edge_index[1]] + + edge_index = edge_index[:, hyper_edge_connection_mask] + edge_attr = edge_attr[edge_mask] if edge_attr is not None else None + + # Relabel edges + edge_idx = paddle.zeros_like(edge_mask, dtype=paddle.int64) + edge_idx[edge_mask] = paddle.arange(edge_mask.sum().item()) + edge_index = paddle.concat([edge_index[0].unsqueeze(0), edge_idx[edge_index[1]].unsqueeze(0)], axis=0) + + if relabel_nodes: + node_idx = paddle.zeros_like(node_mask, dtype=paddle.int64) + node_idx[subset] = paddle.arange(node_mask.sum().item()) + edge_index = paddle.concat([node_idx[edge_index[0]].unsqueeze(0), edge_index[1].unsqueeze(0)], axis=0) + + if return_edge_mask: + return edge_index, edge_attr, edge_mask + else: + return edge_index, edge_attr \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/utils/_to_dense_adj.py b/jointContribution/mattergen/paddle_geometric/utils/_to_dense_adj.py new file mode 100644 index 00000000..639fbadf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_to_dense_adj.py @@ -0,0 +1,66 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import cumsum, scatter + + +def to_dense_adj( + edge_index: Tensor, + batch: OptTensor = None, + edge_attr: OptTensor = None, + max_num_nodes: Optional[int] = None, + batch_size: Optional[int] = None, +) -> Tensor: + r"""Converts batched sparse adjacency matrices given by edge indices and + edge attributes to a single dense batched adjacency matrix. + + Args: + edge_index (Tensor): The edge indices. + batch (Tensor, optional): Batch vector that assigns each node to a specific example. (default: :obj:`None`) + edge_attr (Tensor, optional): Edge weights or multi-dimensional edge features. + max_num_nodes (int, optional): The size of the output node dimension. (default: :obj:`None`) + batch_size (int, optional): The batch size. (default: :obj:`None`) + + :rtype: :class:`Tensor` + """ + if batch is None: + max_index = int(paddle.max(edge_index)) + 1 if edge_index.numel() > 0 else 0 + batch = paddle.zeros([max_index], dtype='int64', place=edge_index.place) + + if batch_size is None: + batch_size = int(paddle.max(batch)) + 1 if batch.numel() > 0 else 1 + + one = paddle.ones([batch.size], dtype='int64', place=batch.place) + num_nodes = scatter(one, batch, dim=0, dim_size=batch_size, reduce='sum') + cum_nodes = cumsum(num_nodes) + + idx0 = batch[edge_index[0]] + idx1 = edge_index[0] - cum_nodes[batch][edge_index[0]] + idx2 = edge_index[1] - cum_nodes[batch][edge_index[1]] + + if max_num_nodes is None: + max_num_nodes = int(paddle.max(num_nodes)) + + elif ((idx1.numel() > 0 and paddle.max(idx1) >= max_num_nodes) + or (idx2.numel() > 0 and paddle.max(idx2) >= max_num_nodes)): + mask = (idx1 < max_num_nodes) & (idx2 < max_num_nodes) + idx0 = idx0[mask] + idx1 = idx1[mask] + idx2 = idx2[mask] + edge_attr = None if edge_attr is None else edge_attr[mask] + + if edge_attr is None: + edge_attr = paddle.ones([idx0.numel()], dtype=edge_index.dtype, place=edge_index.place) + + size = [batch_size, max_num_nodes, max_num_nodes] + size += list(edge_attr.shape)[1:] + flattened_size = batch_size * max_num_nodes * max_num_nodes + + idx = idx0 * max_num_nodes * max_num_nodes + idx1 * max_num_nodes + idx2 + adj = scatter(edge_attr, idx, dim=0, dim_size=flattened_size, reduce='sum') + adj = adj.reshape(size) + + return adj diff --git a/jointContribution/mattergen/paddle_geometric/utils/_to_dense_batch.py b/jointContribution/mattergen/paddle_geometric/utils/_to_dense_batch.py new file mode 100644 index 00000000..62da0388 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_to_dense_batch.py @@ -0,0 +1,71 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.experimental import ( + disable_dynamic_shapes, + is_experimental_mode_enabled, +) +from paddle_geometric.utils import cumsum, scatter + + +@disable_dynamic_shapes(required_args=['batch_size', 'max_num_nodes']) +def to_dense_batch( + x: Tensor, + batch: Optional[Tensor] = None, + fill_value: float = 0.0, + max_num_nodes: Optional[int] = None, + batch_size: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + r"""Given a sparse batch of node features, this function creates a dense + node feature tensor and returns a mask indicating the presence of fake nodes. + + Args: + x (Tensor): Node feature matrix. + batch (Tensor, optional): Batch vector which assigns each node to a specific example. + fill_value (float, optional): The value for invalid entries in the resulting dense tensor. + max_num_nodes (int, optional): The size of the output node dimension. + batch_size (int, optional): The batch size. + + :rtype: (Tensor, Tensor) + + """ + if batch is None and max_num_nodes is None: + mask = paddle.ones([1, x.shape[0]], dtype='bool') + return x.unsqueeze(0), mask + + if batch is None: + batch = paddle.zeros([x.shape[0]], dtype='int64') + + if batch_size is None: + batch_size = int(paddle.max(batch)) + 1 + + num_nodes = scatter(paddle.ones([x.shape[0]], dtype='int64'), batch, dim=0, + dim_size=batch_size, reduce='sum') + cum_nodes = cumsum(num_nodes) + + filter_nodes = False + dynamic_shapes_disabled = is_experimental_mode_enabled('disable_dynamic_shapes') + + if max_num_nodes is None: + max_num_nodes = int(paddle.max(num_nodes)) + elif not dynamic_shapes_disabled and paddle.max(num_nodes) > max_num_nodes: + filter_nodes = True + + tmp = paddle.arange(batch.shape[0]) - cum_nodes[batch] + idx = tmp + (batch * max_num_nodes) + if filter_nodes: + mask = tmp < max_num_nodes + x, idx = x[mask], idx[mask] + + size = [batch_size * max_num_nodes] + list(x.shape[1:]) + out = paddle.full(size, fill_value, dtype=x.dtype) + out = paddle.scatter(out, idx, x) + out = paddle.reshape(out, [batch_size, max_num_nodes] + list(x.shape[1:])) + + mask = paddle.zeros([batch_size * max_num_nodes], dtype='bool') + mask = paddle.scatter(mask, idx, paddle.ones([idx.shape[0]], dtype='bool')) + mask = paddle.reshape(mask, [batch_size, max_num_nodes]) + + return out, mask diff --git a/jointContribution/mattergen/paddle_geometric/utils/_train_test_split_edges.py b/jointContribution/mattergen/paddle_geometric/utils/_train_test_split_edges.py new file mode 100644 index 00000000..ea6221a9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_train_test_split_edges.py @@ -0,0 +1,97 @@ +import math +import paddle +import paddle_geometric +from paddle_geometric.deprecation import deprecated +from paddle_geometric.utils import to_undirected + +@deprecated("use 'transforms.RandomLinkSplit' instead") +def train_test_split_edges( + data: 'paddle_geometric.data.Data', + val_ratio: float = 0.05, + test_ratio: float = 0.1, +) -> 'paddle_geometric.data.Data': + r"""将 :class:`paddle_geometric.data.Data` 对象的边分成正负训练/验证/测试边。 + 它会替换 :obj:`edge_index` 属性为 + :obj:`train_pos_edge_index`, :obj:`train_neg_adj_mask`, + :obj:`val_pos_edge_index`, :obj:`val_neg_edge_index` 和 + :obj:`test_pos_edge_index` 属性。 + 如果 :obj:`data` 包含名为 :obj:`edge_attr` 的边特征, + 则也会添加 :obj:`train_pos_edge_attr`, :obj:`val_pos_edge_attr` 和 + :obj:`test_pos_edge_attr`。 + + 警告: + :meth:`~paddle_geometric.utils.train_test_split_edges` 已弃用,并将在未来的发布中删除。 + 请使用 :class:`paddle_geometric.transforms.RandomLinkSplit` 代替。 + + 参数: + data (Data): 数据对象。 + val_ratio (float, optional): 正样本验证边的比例。 + (默认: :obj:`0.05`) + test_ratio (float, optional): 正样本测试边的比例。 + (默认: :obj:`0.1`) + + :返回类型: :class:`paddle_geometric.data.Data` + """ + assert 'batch' not in data # 不支持批量模式。 + assert data.num_nodes is not None + assert data.edge_index is not None + + num_nodes = data.num_nodes + row, col = data.edge_index + edge_attr = data.edge_attr + del data.edge_index + del data.edge_attr + + # 返回上三角部分。 + mask = row < col + row, col = row[mask], col[mask] + + if edge_attr is not None: + edge_attr = edge_attr[mask] + + n_v = int(math.floor(val_ratio * row.shape[0])) + n_t = int(math.floor(test_ratio * row.shape[0])) + + # 正样本边。 + perm = paddle.randperm(row.shape[0]) + row, col = row[perm], col[perm] + if edge_attr is not None: + edge_attr = edge_attr[perm] + + r, c = row[:n_v], col[:n_v] + data.val_pos_edge_index = paddle.stack([r, c], axis=0) + if edge_attr is not None: + data.val_pos_edge_attr = edge_attr[:n_v] + + r, c = row[n_v:n_v + n_t], col[n_v:n_v + n_t] + data.test_pos_edge_index = paddle.stack([r, c], axis=0) + if edge_attr is not None: + data.test_pos_edge_attr = edge_attr[n_v:n_v + n_t] + + r, c = row[n_v + n_t:], col[n_v + n_t:] + data.train_pos_edge_index = paddle.stack([r, c], axis=0) + if edge_attr is not None: + out = to_undirected(data.train_pos_edge_index, edge_attr[n_v + n_t:]) + data.train_pos_edge_index, data.train_pos_edge_attr = out + else: + data.train_pos_edge_index = to_undirected(data.train_pos_edge_index) + + # 负样本边。 + neg_adj_mask = paddle.ones([num_nodes, num_nodes], dtype='uint8') + neg_adj_mask = paddle.triu(neg_adj_mask.astype('int32'), diagonal=1).astype('bool') + neg_adj_mask[row, col] = 0 + + neg_row, neg_col = paddle.nonzero(neg_adj_mask).t() + perm = paddle.randperm(neg_row.shape[0])[:n_v + n_t] + neg_row, neg_col = neg_row[perm], neg_col[perm] + + neg_adj_mask[neg_row, neg_col] = 0 + data.train_neg_adj_mask = neg_adj_mask + + row, col = neg_row[:n_v], neg_col[:n_v] + data.val_neg_edge_index = paddle.stack([row, col], axis=0) + + row, col = neg_row[n_v:n_v + n_t], neg_col[n_v:n_v + n_t] + data.test_neg_edge_index = paddle.stack([row, col], axis=0) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/utils/_tree_decomposition.py b/jointContribution/mattergen/paddle_geometric/utils/_tree_decomposition.py new file mode 100644 index 00000000..bbc90d9e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_tree_decomposition.py @@ -0,0 +1,144 @@ +from itertools import chain +from typing import Any, List, Literal, Tuple, Union, overload + +import paddle +from paddle import Tensor +from paddle_geometric.utils import ( + from_scipy_sparse_matrix, + to_scipy_sparse_matrix, + to_undirected, +) + +@overload +def tree_decomposition(mol: Any) -> Tuple[Tensor, Tensor, int]: + pass + +@overload +def tree_decomposition( + mol: Any, + return_vocab: Literal[False], +) -> Tuple[Tensor, Tensor, int]: + pass + +@overload +def tree_decomposition( + mol: Any, + return_vocab: Literal[True], +) -> Tuple[Tensor, Tensor, int, Tensor]: + pass + +def tree_decomposition( + mol: Any, + return_vocab: bool = False, +) -> Union[Tuple[Tensor, Tensor, int], Tuple[Tensor, Tensor, int, Tensor]]: + r"""Tree decomposition algorithm for molecules based on the + `"Junction Tree Variational Autoencoder for Molecular Graph Generation" + `_ paper. + Returns the graph connectivity of the junction tree, the assignment + mapping of each atom to the clique in the junction tree, and the number + of cliques. + + Args: + mol (rdkit.Chem.Mol): An :obj:`rdkit` molecule. + return_vocab (bool, optional): If set to :obj:`True`, returns an + identifier for each clique (ring, bond, bridged compounds, single). + (default: :obj:`False`) + + :rtype: :obj:`(LongTensor, LongTensor, int)` if :obj:`return_vocab` is + :obj:`False`, else :obj:`(LongTensor, LongTensor, int, LongTensor)` + """ + import rdkit.Chem as Chem + from scipy.sparse.csgraph import minimum_spanning_tree + + # Cliques are defined as rings and bonds. + cliques: List[List[int]] = [list(x) for x in Chem.GetSymmSSSR(mol)] + xs: List[int] = [0] * len(cliques) + for bond in mol.GetBonds(): + if not bond.IsInRing(): + cliques.append([bond.GetBeginAtomIdx(), bond.GetEndAtomIdx()]) + xs.append(1) + + # Generate `atom2cliques` mappings. + atom2cliques: List[List[int]] = [[] for _ in range(mol.GetNumAtoms())] + for c in range(len(cliques)): + for atom in cliques[c]: + atom2cliques[atom].append(c) + + # Merge rings that share more than 2 atoms as bridged compounds. + for c1 in range(len(cliques)): + for atom in cliques[c1]: + for c2 in atom2cliques[atom]: + if c1 >= c2 or len(cliques[c1]) <= 2 or len(cliques[c2]) <= 2: + continue + if len(set(cliques[c1]) & set(cliques[c2])) > 2: + cliques[c1] = list(set(cliques[c1]) | set(cliques[c2])) + xs[c1] = 2 + cliques[c2] = [] + xs[c2] = -1 + cliques = [c for c in cliques if len(c) > 0] + xs = [x for x in xs if x >= 0] + + # Update `atom2cliques` mappings. + atom2cliques = [[] for _ in range(mol.GetNumAtoms())] + for c in range(len(cliques)): + for atom in cliques[c]: + atom2cliques[atom].append(c) + + # Add singleton cliques for more than 2 intersecting cliques and compute initial clique graph. + edges = {} + for atom in range(mol.GetNumAtoms()): + cs = atom2cliques[atom] + if len(cs) <= 1: + continue + + bonds = [c for c in cs if len(cliques[c]) == 2] + rings = [c for c in cs if len(cliques[c]) > 4] + + if len(bonds) > 2 or (len(bonds) == 2 and len(cs) > 2): + cliques.append([atom]) + xs.append(3) + c2 = len(cliques) - 1 + for c1 in cs: + edges[(c1, c2)] = 1 + + elif len(rings) > 2: + cliques.append([atom]) + xs.append(3) + c2 = len(cliques) - 1 + for c1 in cs: + edges[(c1, c2)] = 99 + + else: + for i in range(len(cs)): + for j in range(i + 1, len(cs)): + c1, c2 = cs[i], cs[j] + count = len(set(cliques[c1]) & set(cliques[c2])) + edges[(c1, c2)] = min(count, edges.get((c1, c2), 99)) + + # Update `atom2cliques` mappings. + atom2cliques = [[] for _ in range(mol.GetNumAtoms())] + for c in range(len(cliques)): + for atom in cliques[c]: + atom2cliques[atom].append(c) + + if len(edges) > 0: + edge_index_T, weight = zip(*edges.items()) + edge_index = paddle.to_tensor(edge_index_T).t() + inv_weight = 100 - paddle.to_tensor(weight) + graph = to_scipy_sparse_matrix(edge_index, inv_weight, len(cliques)) + junc_tree = minimum_spanning_tree(graph) + edge_index, _ = from_scipy_sparse_matrix(junc_tree) + edge_index = to_undirected(edge_index, num_nodes=len(cliques)) + else: + edge_index = paddle.empty((2, 0), dtype=paddle.int64) + + rows = [[i] * len(atom2cliques[i]) for i in range(mol.GetNumAtoms())] + row = paddle.to_tensor(list(chain.from_iterable(rows))) + col = paddle.to_tensor(list(chain.from_iterable(atom2cliques))) + atom2clique = paddle.stack([row, col], axis=0).astype(paddle.int64) + + if return_vocab: + vocab = paddle.to_tensor(xs, dtype=paddle.int64) + return edge_index, atom2clique, len(cliques), vocab + else: + return edge_index, atom2clique, len(cliques) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_trim_to_layer.py b/jointContribution/mattergen/paddle_geometric/utils/_trim_to_layer.py new file mode 100644 index 00000000..36909cb9 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_trim_to_layer.py @@ -0,0 +1,143 @@ +from itertools import chain +from typing import Dict, List, Optional, Tuple, Union, overload + +import paddle +from paddle import Tensor + +from paddle_geometric import EdgeIndex +from paddle_geometric.typing import ( + Adj, + EdgeType, + MaybeHeteroAdjTensor, + MaybeHeteroEdgeTensor, + MaybeHeteroNodeTensor, + NodeType, + SparseStorage, + SparseTensor, +) + +@overload +def trim_to_layer( + layer: int, + num_sampled_nodes_per_hop: List[int], + num_sampled_edges_per_hop: List[int], + x: Tensor, + edge_index: Adj, + edge_attr: Optional[Tensor] = None, +) -> Tuple[Tensor, Tensor, Optional[Tensor]]: + pass + +@overload +def trim_to_layer( + layer: int, + num_sampled_nodes_per_hop: Dict[NodeType, List[int]], + num_sampled_edges_per_hop: Dict[EdgeType, List[int]], + x: Dict[NodeType, Tensor], + edge_index: Dict[EdgeType, Adj], + edge_attr: Optional[Dict[EdgeType, Tensor]] = None, +) -> Tuple[Dict[NodeType, Tensor], Dict[EdgeType, Adj], Optional[Dict[EdgeType, Tensor]]]: + pass + +def trim_to_layer( + layer: int, + num_sampled_nodes_per_hop: Union[List[int], Dict[NodeType, List[int]]], + num_sampled_edges_per_hop: Union[List[int], Dict[EdgeType, List[int]]], + x: MaybeHeteroNodeTensor, + edge_index: MaybeHeteroEdgeTensor, + edge_attr: Optional[MaybeHeteroEdgeTensor] = None, +) -> Tuple[MaybeHeteroNodeTensor, MaybeHeteroAdjTensor, Optional[MaybeHeteroEdgeTensor]]: + if layer <= 0: + return x, edge_index, edge_attr + + if isinstance(num_sampled_edges_per_hop, dict): + x = {k: trim_feat(v, layer, num_sampled_nodes_per_hop[k]) for k, v in x.items()} + edge_index = {k: trim_adj(v, layer, num_sampled_nodes_per_hop[k[0]], num_sampled_nodes_per_hop[k[-1]], num_sampled_edges_per_hop[k]) for k, v in edge_index.items()} + if edge_attr is not None: + edge_attr = {k: trim_feat(v, layer, num_sampled_edges_per_hop[k]) for k, v in edge_attr.items()} + return x, edge_index, edge_attr + + x = trim_feat(x, layer, num_sampled_nodes_per_hop) + edge_index = trim_adj(edge_index, layer, num_sampled_nodes_per_hop, num_sampled_nodes_per_hop, num_sampled_edges_per_hop) + if edge_attr is not None: + edge_attr = trim_feat(edge_attr, layer, num_sampled_edges_per_hop) + return x, edge_index, edge_attr + + +class TrimToLayer(paddle.nn.Layer): + def forward( + self, + layer: int, + num_sampled_nodes_per_hop: Optional[List[int]], + num_sampled_edges_per_hop: Optional[List[int]], + x: Tensor, + edge_index: Adj, + edge_attr: Optional[Tensor] = None, + ) -> Tuple[Tensor, Adj, Optional[Tensor]]: + return trim_to_layer( + layer, + num_sampled_nodes_per_hop, + num_sampled_edges_per_hop, + x, + edge_index, + edge_attr, + ) + + +def trim_feat(x: Tensor, layer: int, num_samples_per_hop: List[int]) -> Tensor: + if layer <= 0: + return x + return x[:x.shape[0] - num_samples_per_hop[-layer]] + +def trim_adj( + edge_index: Adj, + layer: int, + num_sampled_src_nodes_per_hop: List[int], + num_sampled_dst_nodes_per_hop: List[int], + num_sampled_edges_per_hop: List[int], +) -> Adj: + if layer <= 0: + return edge_index + + if isinstance(edge_index, Tensor): + edge_index = edge_index[:, :edge_index.shape[1] - num_sampled_edges_per_hop[-layer]] + if isinstance(edge_index, EdgeIndex): + num_rows, num_cols = edge_index.sparse_size() + if num_rows is not None: + num_rows -= num_sampled_src_nodes_per_hop[-layer] + if num_cols is not None: + num_cols -= num_sampled_dst_nodes_per_hop[-layer] + edge_index.sparse_resize_(num_rows, num_cols) + return edge_index + + elif isinstance(edge_index, SparseTensor): + size = (edge_index.shape[0] - num_sampled_dst_nodes_per_hop[-layer], edge_index.shape[1] - num_sampled_src_nodes_per_hop[-layer]) + num_seed_nodes = size[0] - num_sampled_dst_nodes_per_hop[-(layer + 1)] + return trim_sparse_tensor(edge_index, size, num_seed_nodes) + + raise ValueError(f"Unsupported 'edge_index' type '{type(edge_index)}'") + + +def trim_sparse_tensor(src: SparseTensor, size: Tuple[int, int], num_seed_nodes: int) -> SparseTensor: + rowptr, col, value = src.csr() + rowptr = paddle.concat([rowptr[:size[0] + 1], paddle.full([rowptr.size(0) - (num_seed_nodes + 1)], rowptr[num_seed_nodes])]) + col = col[:rowptr[-1]] + if value is not None: + value = value[:rowptr[-1]] + csr2csc = src.storage._csr2csc + if csr2csc is not None: + csr2csc = csr2csc[csr2csc < col.size] + storage = SparseStorage( + row=None, + rowptr=rowptr, + col=col, + value=value, + sparse_sizes=size, + rowcount=None, + colptr=None, + colcount=None, + csr2csc=csr2csc, + csc2csr=None, + is_sorted=True, + trust_data=True, + ) + return src.from_storage(storage) diff --git a/jointContribution/mattergen/paddle_geometric/utils/_unbatch.py b/jointContribution/mattergen/paddle_geometric/utils/_unbatch.py new file mode 100644 index 00000000..9c8fbaa0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/_unbatch.py @@ -0,0 +1,71 @@ +from typing import List, Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import cumsum, degree + + +def unbatch( + src: Tensor, + batch: Tensor, + dim: int = 0, + batch_size: Optional[int] = None, +) -> List[Tensor]: + r"""Splits :obj:`src` according to a :obj:`batch` vector along dimension + :obj:`dim`. + + Args: + src (Tensor): The source tensor. + batch (Tensor): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + entry in :obj:`src` to a specific example. Must be ordered. + dim (int, optional): The dimension along which to split the :obj:`src` + tensor. (default: :obj:`0`) + batch_size (int, optional): The batch size. (default: :obj:`None`) + + :rtype: :class:`List[Tensor]` + + Example: + >>> src = paddle.arange(7) + >>> batch = paddle.to_tensor([0, 0, 0, 1, 1, 2, 2]) + >>> unbatch(src, batch) + (Tensor([0, 1, 2]), Tensor([3, 4]), Tensor([5, 6])) + """ + sizes = degree(batch, batch_size, dtype='int64').tolist() + return paddle.split(src, num_or_sections=sizes, axis=dim) + + +def unbatch_edge_index( + edge_index: Tensor, + batch: Tensor, + batch_size: Optional[int] = None, +) -> List[Tensor]: + r"""Splits the :obj:`edge_index` according to a :obj:`batch` vector. + + Args: + edge_index (Tensor): The edge_index tensor. Must be ordered. + batch (Tensor): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + node to a specific example. Must be ordered. + batch_size (int, optional): The batch size. (default: :obj:`None`) + + :rtype: :class:`List[Tensor]` + + Example: + >>> edge_index = paddle.to_tensor([[0, 1, 1, 2, 2, 3, 4, 5, 5, 6], + ... [1, 0, 2, 1, 3, 2, 5, 4, 6, 5]]) + >>> batch = paddle.to_tensor([0, 0, 0, 0, 1, 1, 1]) + >>> unbatch_edge_index(edge_index, batch) + (Tensor([[0, 1, 1, 2, 2, 3], + [1, 0, 2, 1, 3, 2]]), + Tensor([[0, 1, 1, 2], + [1, 0, 2, 1]])) + """ + deg = degree(batch, batch_size, dtype='int64') + ptr = cumsum(deg) + + edge_batch = paddle.gather(batch, edge_index[0]) + edge_index = edge_index - paddle.gather(ptr, edge_batch) + sizes = degree(edge_batch, batch_size, dtype='int64').numpy().tolist() + return paddle.split(edge_index, sizes, axis=1) diff --git a/jointContribution/mattergen/paddle_geometric/utils/augmentation.py b/jointContribution/mattergen/paddle_geometric/utils/augmentation.py new file mode 100644 index 00000000..05505393 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/augmentation.py @@ -0,0 +1,81 @@ +from typing import Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import cumsum, negative_sampling, scatter + + +def shuffle_node( + x: Tensor, + batch: Optional[Tensor] = None, + training: bool = True, +) -> Tuple[Tensor, Tensor]: + if not training: + perm = paddle.arange(x.shape[0]) + return x, perm + if batch is None: + perm = paddle.randperm(x.shape[0]) + return paddle.index_select(x, perm), perm + num_nodes = scatter(paddle.ones([x.shape[0]]), batch, reduce='sum') + ptr = cumsum(num_nodes) + perm = paddle.concat([ + paddle.randperm(n) + offset + for offset, n in zip(ptr[:-1], num_nodes) + ]) + return paddle.index_select(x, perm), perm + + +def mask_feature( + x: Tensor, + p: float = 0.5, + mode: str = 'col', + fill_value: float = 0., + training: bool = True, +) -> Tuple[Tensor, Tensor]: + if p < 0. or p > 1.: + raise ValueError(f'Masking ratio has to be between 0 and 1 (got {p})') + if not training or p == 0.0: + return x, paddle.ones_like(x, dtype='bool') + assert mode in ['row', 'col', 'all'] + + if mode == 'row': + mask = paddle.rand([x.shape[0]]) >= p + mask = mask.unsqueeze(1) + elif mode == 'col': + mask = paddle.rand([x.shape[1]]) >= p + mask = mask.unsqueeze(0) + else: + mask = paddle.rand(x.shape) >= p + + x = paddle.where(mask, x, paddle.full_like(x, fill_value)) + return x, mask + + +def add_random_edge( + edge_index: Tensor, + p: float = 0.5, + force_undirected: bool = False, + num_nodes: Optional[Union[int, Tuple[int, int]]] = None, + training: bool = True, +) -> Tuple[Tensor, Tensor]: + if p < 0. or p > 1.: + raise ValueError(f"Ratio of added edges has to be between 0 and 1 (got '{p}')") + if force_undirected and isinstance(num_nodes, (tuple, list)): + raise RuntimeError("'force_undirected' is not supported for bipartite graphs") + + device = edge_index.place + if not training or p == 0.0: + edge_index_to_add = paddle.empty([2, 0], dtype='int64') + return edge_index, edge_index_to_add + + edge_index_to_add = negative_sampling( + edge_index=edge_index, + num_nodes=num_nodes, + num_neg_samples=round(edge_index.shape[1] * p), + force_undirected=force_undirected, + ) + + edge_index = paddle.concat([edge_index, edge_index_to_add], axis=1) + + return edge_index, edge_index_to_add diff --git a/jointContribution/mattergen/paddle_geometric/utils/convert.py b/jointContribution/mattergen/paddle_geometric/utils/convert.py new file mode 100644 index 00000000..66007ab0 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/convert.py @@ -0,0 +1,615 @@ +from collections import defaultdict +from typing import Any, Dict, Iterable, List, Literal, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def to_scipy_sparse_matrix( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Any: + r"""Converts a graph given by edge indices and edge attributes to a scipy + sparse matrix. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional + edge features. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`index`. (default: :obj:`None`) + + Examples: + >>> edge_index = paddle.to_tensor([ + ... [0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2], + ... ]) + >>> to_scipy_sparse_matrix(edge_index) + <4x4 sparse matrix of type '' + with 6 stored elements in COOrdinate format> + """ + import scipy.sparse as sp + + row, col = edge_index.cpu().numpy() + + if edge_attr is None: + edge_attr = paddle.ones([row.shape[0]], dtype='float32') + else: + edge_attr = edge_attr.reshape([-1]).numpy() + assert edge_attr.shape[0] == row.shape[0] + + N = maybe_num_nodes(edge_index, num_nodes) + out = sp.coo_matrix((edge_attr, (row, col)), shape=(N, N)) + return out + + +def from_scipy_sparse_matrix(A: Any) -> Tuple[Tensor, Tensor]: + r"""Converts a scipy sparse matrix to edge indices and edge attributes. + + Args: + A (scipy.sparse): A sparse matrix. + + Examples: + >>> edge_index = paddle.to_tensor([ + ... [0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2], + ... ]) + >>> adj = to_scipy_sparse_matrix(edge_index) + >>> from_scipy_sparse_matrix(adj) + (tensor([[0, 1, 1, 2, 2, 3], + [1, 0, 2, 1, 3, 2]]), + tensor([1., 1., 1., 1., 1., 1.])) + """ + A = A.tocoo() + row = paddle.to_tensor(A.row, dtype='int64') + col = paddle.to_tensor(A.col, dtype='int64') + edge_index = paddle.stack([row, col], axis=0) + edge_weight = paddle.to_tensor(A.data, dtype='float32') + return edge_index, edge_weight + + +def to_networkx( + data: Union[ + 'paddle_geometric.data.Data', + 'paddle_geometric.data.HeteroData', + ], + node_attrs: Optional[Iterable[str]] = None, + edge_attrs: Optional[Iterable[str]] = None, + graph_attrs: Optional[Iterable[str]] = None, + to_undirected: Optional[Union[bool, str]] = False, + to_multi: bool = False, + remove_self_loops: bool = False, +) -> Any: + r"""Converts a :class:`paddle_geometric.data.Data` instance to a + :obj:`networkx.Graph` if :attr:`to_undirected` is set to :obj:`True`, or + a directed :obj:`networkx.DiGraph` otherwise. + + Args: + data (paddle_geometric.data.Data or paddle_geometric.data.HeteroData): A + homogeneous or heterogeneous data object. + node_attrs (iterable of str, optional): The node attributes to be + copied. (default: :obj:`None`) + edge_attrs (iterable of str, optional): The edge attributes to be + copied. (default: :obj:`None`) + graph_attrs (iterable of str, optional): The graph attributes to be + copied. (default: :obj:`None`) + to_undirected (bool or str, optional): If set to :obj:`True`, will + return a :class:`networkx.Graph` instead of a + :class:`networkx.DiGraph`. + to_multi (bool, optional): if set to :obj:`True`, will return a + :class:`networkx.MultiGraph` or a :class:`networkx:MultiDiGraph`. + (default: :obj:`False`) + remove_self_loops (bool, optional): If set to :obj:`True`, will not + include self-loops in the resulting graph. (default: :obj:`False`) + + Examples: + >>> edge_index = paddle.to_tensor([ + ... [0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2], + ... ]) + >>> data = Data(edge_index=edge_index, num_nodes=4) + >>> to_networkx(data) + + """ + import networkx as nx + + from paddle_geometric.data import HeteroData + + to_undirected_upper: bool = to_undirected == 'upper' + to_undirected_lower: bool = to_undirected == 'lower' + + to_undirected = to_undirected is True + to_undirected |= to_undirected_upper or to_undirected_lower + assert isinstance(to_undirected, bool) + + if isinstance(data, HeteroData) and to_undirected: + raise ValueError("'to_undirected' is not supported in " + "'to_networkx' for heterogeneous graphs") + + if to_undirected: + G = nx.MultiGraph() if to_multi else nx.Graph() + else: + G = nx.MultiDiGraph() if to_multi else nx.DiGraph() + + def to_networkx_value(value: Any) -> Any: + return value.tolist() if isinstance(value, Tensor) else value + + for key in graph_attrs or []: + G.graph[key] = to_networkx_value(data[key]) + + node_offsets = data.node_offsets + for node_store in data.node_stores: + start = node_offsets[node_store._key] + assert node_store.num_nodes is not None + for i in range(node_store.num_nodes): + node_kwargs: Dict[str, Any] = {} + if isinstance(data, HeteroData): + node_kwargs['type'] = node_store._key + for key in node_attrs or []: + node_kwargs[key] = to_networkx_value(node_store[key][i]) + + G.add_node(start + i, **node_kwargs) + + for edge_store in data.edge_stores: + for i, (v, w) in enumerate(edge_store.edge_index.t().tolist()): + if to_undirected_upper and v > w: + continue + elif to_undirected_lower and v < w: + continue + elif remove_self_loops and v == w and not edge_store.is_bipartite(): + continue + + edge_kwargs: Dict[str, Any] = {} + if isinstance(data, HeteroData): + v = v + node_offsets[edge_store._key[0]] + w = w + node_offsets[edge_store._key[-1]] + edge_kwargs['type'] = edge_store._key + for key in edge_attrs or []: + edge_kwargs[key] = to_networkx_value(edge_store[key][i]) + + G.add_edge(v, w, **edge_kwargs) + + return G + + +def from_networkx( + G: Any, + group_node_attrs: Optional[Union[List[str], Literal['all']]] = None, + group_edge_attrs: Optional[Union[List[str], Literal['all']]] = None, +) -> 'paddle_geometric.data.Data': + r"""Converts a :obj:`networkx.Graph` or :obj:`networkx.DiGraph` to a + :class:`paddle_geometric.data.Data` instance. + + Args: + G (networkx.Graph or networkx.DiGraph): A networkx graph. + group_node_attrs (List[str] or "all", optional): The node attributes to + be concatenated and added to :obj:`data.x`. (default: :obj:`None`) + group_edge_attrs (List[str] or "all", optional): The edge attributes to + be concatenated and added to :obj:`data.edge_attr`. + (default: :obj:`None`) + + .. note:: + + All :attr:`group_node_attrs` and :attr:`group_edge_attrs` values must + be numeric. + + Examples: + >>> edge_index = paddle.to_tensor([ + ... [0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2], + ... ]) + >>> data = Data(edge_index=edge_index, num_nodes=4) + >>> g = to_networkx(data) + >>> from_networkx(g) + Data(edge_index=[2, 6], num_nodes=4) + """ + import networkx as nx + from paddle_geometric.data import Data + + G = G.to_directed() if not nx.is_directed(G) else G + + mapping = dict(zip(G.nodes(), range(G.number_of_nodes()))) + edge_index = paddle.zeros([2, G.number_of_edges()], dtype="int64") + for i, (src, dst) in enumerate(G.edges()): + edge_index[0, i] = mapping[src] + edge_index[1, i] = mapping[dst] + + data_dict: Dict[str, Any] = defaultdict(list) + data_dict['edge_index'] = edge_index + + node_attrs: List[str] = [] + if G.number_of_nodes() > 0: + node_attrs = list(next(iter(G.nodes(data=True)))[-1].keys()) + + edge_attrs: List[str] = [] + if G.number_of_edges() > 0: + edge_attrs = list(next(iter(G.edges(data=True)))[-1].keys()) + + if group_node_attrs is not None and not isinstance(group_node_attrs, list): + group_node_attrs = node_attrs + + if group_edge_attrs is not None and not isinstance(group_edge_attrs, list): + group_edge_attrs = edge_attrs + + for i, (_, feat_dict) in enumerate(G.nodes(data=True)): + if set(feat_dict.keys()) != set(node_attrs): + raise ValueError('Not all nodes contain the same attributes') + for key, value in feat_dict.items(): + data_dict[str(key)].append(value) + + for i, (_, _, feat_dict) in enumerate(G.edges(data=True)): + if set(feat_dict.keys()) != set(edge_attrs): + raise ValueError('Not all edges contain the same attributes') + for key, value in feat_dict.items(): + key = f'edge_{key}' if key in node_attrs else key + data_dict[str(key)].append(value) + + for key, value in G.graph.items(): + if key == 'node_default' or key == 'edge_default': + continue # Do not load default attributes. + key = f'graph_{key}' if key in node_attrs else key + data_dict[str(key)] = value + + for key, value in data_dict.items(): + if isinstance(value, (tuple, list)) and isinstance(value[0], Tensor): + data_dict[key] = paddle.stack(value, axis=0) + else: + try: + data_dict[key] = paddle.to_tensor(value) + except Exception: + pass + + data = Data.from_dict(data_dict) + + if group_node_attrs is not None: + xs = [] + for key in group_node_attrs: + x = data[key] + x = x.reshape([-1, 1]) if len(x.shape) <= 1 else x + xs.append(x) + del data[key] + data.x = paddle.concat(xs, axis=-1) + + if group_edge_attrs is not None: + xs = [] + for key in group_edge_attrs: + key = f'edge_{key}' if key in node_attrs else key + x = data[key] + x = x.reshape([-1, 1]) if len(x.shape) <= 1 else x + xs.append(x) + del data[key] + data.edge_attr = paddle.concat(xs, axis=-1) + + if data.x is None and getattr(data, "pos", None) is None: + data.num_nodes = G.number_of_nodes() + + return data +def to_networkit( + edge_index: Tensor, + edge_weight: Optional[Tensor] = None, + num_nodes: Optional[int] = None, + directed: bool = True, +) -> Any: + r"""Converts a :obj:`(edge_index, edge_weight)` tuple to a + :class:`networkit.Graph`. + + Args: + edge_index (paddle.Tensor): The edge indices of the graph. + edge_weight (paddle.Tensor, optional): The edge weights of the graph. + (default: :obj:`None`) + num_nodes (int, optional): The number of nodes in the graph. + (default: :obj:`None`) + directed (bool, optional): If set to :obj:`False`, the graph will be + undirected. (default: :obj:`True`) + """ + import networkit as nk + + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + g = nk.graph.Graph( + num_nodes, + weighted=edge_weight is not None, + directed=directed, + ) + + if edge_weight is None: + edge_weight = paddle.ones([edge_index.shape[1]]) + + if not directed: + mask = edge_index[0] <= edge_index[1] + edge_index = edge_index[:, mask] + edge_weight = edge_weight[mask] + + for (u, v), w in zip(edge_index.t().numpy().tolist(), edge_weight.numpy().tolist()): + g.addEdge(u, v, w) + + return g + + +def from_networkit(g: Any) -> Tuple[Tensor, Optional[Tensor]]: + r"""Converts a :class:`networkit.Graph` to a + :obj:`(edge_index, edge_weight)` tuple. + If the :class:`networkit.Graph` is not weighted, the returned + :obj:`edge_weight` will be :obj:`None`. + + Args: + g (networkkit.graph.Graph): A :obj:`networkit` graph object. + """ + is_directed = g.isDirected() + is_weighted = g.isWeighted() + + edge_indices, edge_weights = [], [] + for u, v, w in g.iterEdgesWeights(): + edge_indices.append([u, v]) + edge_weights.append(w) + if not is_directed: + edge_indices.append([v, u]) + edge_weights.append(w) + + edge_index = paddle.to_tensor(edge_indices, dtype="int64").t() + edge_weight = paddle.to_tensor(edge_weights, dtype="float32") if is_weighted else None + + return edge_index, edge_weight + + +def to_trimesh(data: 'paddle_geometric.data.Data') -> Any: + r"""Converts a :class:`paddle_geometric.data.Data` instance to a + :obj:`trimesh.Trimesh`. + + Args: + data (paddle_geometric.data.Data): The data object. + + Example: + >>> pos = paddle.to_tensor([[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0]], dtype="float32") + >>> face = paddle.to_tensor([[0, 1, 2], [1, 2, 3]]).t() + + >>> data = Data(pos=pos, face=face) + >>> to_trimesh(data) + + """ + import trimesh + + assert data.pos is not None + assert data.face is not None + + return trimesh.Trimesh( + vertices=data.pos.numpy(), + faces=data.face.t().numpy(), + process=False, + ) + +def from_trimesh(mesh: Any) -> 'paddle_geometric.data.Data': + r"""Converts a :obj:`trimesh.Trimesh` to a + :class:`paddle_geometric.data.Data` instance. + + Args: + mesh (trimesh.Trimesh): A :obj:`trimesh` mesh. + + Example: + >>> pos = paddle.to_tensor([[0, 0, 0], [1, 0, 0], [0, 1, 0], [1, 1, 0]], dtype="float32") + >>> face = paddle.to_tensor([[0, 1, 2], [1, 2, 3]]).transpose([1, 0]) + + >>> data = Data(pos=pos, face=face) + >>> mesh = to_trimesh(data) + >>> from_trimesh(mesh) + Data(pos=[4, 3], face=[3, 2]) + """ + from paddle_geometric.data import Data + + pos = paddle.to_tensor(mesh.vertices, dtype='float32') + face = paddle.to_tensor(mesh.faces).transpose([1, 0]) + + return Data(pos=pos, face=face) + + +def to_cugraph( + edge_index: Tensor, + edge_weight: Optional[Tensor] = None, + relabel_nodes: bool = True, + directed: bool = True, +) -> Any: + r"""Converts a graph given by :obj:`edge_index` and optional + :obj:`edge_weight` into a :obj:`cugraph` graph object. + + Args: + edge_index (paddle.Tensor): The edge indices of the graph. + edge_weight (paddle.Tensor, optional): The edge weights of the graph. + (default: :obj:`None`) + relabel_nodes (bool, optional): If set to :obj:`True`, + :obj:`cugraph` will remove any isolated nodes, leading to a + relabeling of nodes. (default: :obj:`True`) + directed (bool, optional): If set to :obj:`False`, the graph will be + undirected. (default: :obj:`True`) + """ + import cudf + import cugraph + + g = cugraph.Graph(directed=directed) + df = cudf.from_dlpack(edge_index.t().numpy().to_dlpack()) + + if edge_weight is not None: + assert edge_weight.ndim == 1 + df['2'] = cudf.from_dlpack(edge_weight.numpy().to_dlpack()) + + g.from_cudf_edgelist( + df, + source=0, + destination=1, + edge_attr='2' if edge_weight is not None else None, + renumber=relabel_nodes, + ) + + return g + + +def from_cugraph(g: Any) -> Tuple[Tensor, Optional[Tensor]]: + r"""Converts a :obj:`cugraph` graph object into :obj:`edge_index` and + optional :obj:`edge_weight` tensors. + + Args: + g (cugraph.Graph): A :obj:`cugraph` graph object. + """ + df = g.view_edge_list() + + src = paddle.to_tensor(from_dlpack(df[0].to_dlpack()), dtype='int64') + dst = paddle.to_tensor(from_dlpack(df[1].to_dlpack()), dtype='int64') + edge_index = paddle.stack([src, dst], axis=0) + + edge_weight = None + if '2' in df: + edge_weight = paddle.to_tensor(from_dlpack(df['2'].to_dlpack())) + + return edge_index, edge_weight +def to_dgl( + data: Union['paddle_geometric.data.Data', 'paddle_geometric.data.HeteroData'] +) -> Any: + r"""Converts a :class:`paddle_geometric.data.Data` or + :class:`paddle_geometric.data.HeteroData` instance to a :obj:`dgl` graph + object. + + Args: + data (paddle_geometric.data.Data or paddle_geometric.data.HeteroData): + The data object. + + Example: + >>> edge_index = paddle.to_tensor([[0, 1, 1, 2, 3, 0], [1, 0, 2, 1, 4, 4]]) + >>> x = paddle.randn([5, 3]) + >>> edge_attr = paddle.randn([6, 2]) + >>> data = Data(x=x, edge_index=edge_index, edge_attr=edge_attr) + >>> g = to_dgl(data) + >>> g + Graph(num_nodes=5, num_edges=6, + ndata_schemes={'x': Scheme(shape=(3,))} + edata_schemes={'edge_attr': Scheme(shape=(2, ))}) + + >>> data = HeteroData() + >>> data['paper'].x = paddle.randn([5, 3]) + >>> data['author'].x = paddle.ones([5, 3]) + >>> edge_index = paddle.to_tensor([[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]) + >>> data['author', 'cites', 'paper'].edge_index = edge_index + >>> g = to_dgl(data) + >>> g + Graph(num_nodes={'author': 5, 'paper': 5}, + num_edges={('author', 'cites', 'paper'): 5}, + metagraph=[('author', 'paper', 'cites')]) + """ + import dgl + + from paddle_geometric.data import Data, HeteroData + + if isinstance(data, Data): + if data.edge_index is not None: + row, col = data.edge_index + elif 'adj' in data: + row, col, _ = data.adj.to_sparse().coo() + elif 'adj_t' in data: + row, col, _ = data.adj_t.transpose([1, 0]).to_sparse().coo() + else: + row, col = [], [] + + g = dgl.graph((row.numpy(), col.numpy()), num_nodes=data.num_nodes) + + for attr in data.node_attrs(): + g.ndata[attr] = data[attr].numpy() + for attr in data.edge_attrs(): + if attr in ['edge_index', 'adj_t']: + continue + g.edata[attr] = data[attr].numpy() + + return g + + if isinstance(data, HeteroData): + data_dict = {} + for edge_type, edge_store in data.edge_items(): + if edge_store.get('edge_index') is not None: + row, col = edge_store.edge_index + else: + row, col, _ = edge_store['adj_t'].transpose([1, 0]).to_sparse().coo() + + data_dict[edge_type] = (row.numpy(), col.numpy()) + + g = dgl.heterograph(data_dict) + + for node_type, node_store in data.node_items(): + for attr, value in node_store.items(): + g.nodes[node_type].data[attr] = value.numpy() + + for edge_type, edge_store in data.edge_items(): + for attr, value in edge_store.items(): + if attr in ['edge_index', 'adj_t']: + continue + g.edges[edge_type].data[attr] = value.numpy() + + return g + + raise ValueError(f"Invalid data type (got '{type(data)}')") + + +def from_dgl( + g: Any, +) -> Union['paddle_geometric.data.Data', 'paddle_geometric.data.HeteroData']: + r"""Converts a :obj:`dgl` graph object to a + :class:`paddle_geometric.data.Data` or + :class:`paddle_geometric.data.HeteroData` instance. + + Args: + g (dgl.DGLGraph): The :obj:`dgl` graph object. + + Example: + >>> g = dgl.graph(([0, 0, 1, 5], [1, 2, 2, 0])) + >>> g.ndata['x'] = paddle.randn([g.num_nodes(), 3]) + >>> g.edata['edge_attr'] = paddle.randn([g.num_edges(), 2]) + >>> data = from_dgl(g) + >>> data + Data(x=[6, 3], edge_attr=[4, 2], edge_index=[2, 4]) + + >>> g = dgl.heterograph({ + ... ('author', 'writes', 'paper'): ([0, 1, 1, 2, 3, 3, 4], + ... [0, 0, 1, 1, 1, 2, 2])}) + >>> g.nodes['author'].data['x'] = paddle.randn([5, 3]) + >>> g.nodes['paper'].data['x'] = paddle.randn([5, 3]) + >>> data = from_dgl(g) + >>> data + HeteroData( + author={ x=[5, 3] }, + paper={ x=[3, 3] }, + (author, writes, paper)={ edge_index=[2, 7] } + ) + """ + import dgl + + from paddle_geometric.data import Data, HeteroData + + if not isinstance(g, dgl.DGLGraph): + raise ValueError(f"Invalid data type (got '{type(g)}')") + + data: Union[Data, HeteroData] + + if g.is_homogeneous: + data = Data() + src, dst = g.edges() + data.edge_index = paddle.to_tensor([src.numpy(), dst.numpy()]) + + for attr, value in g.ndata.items(): + data[attr] = paddle.to_tensor(value.numpy()) + for attr, value in g.edata.items(): + data[attr] = paddle.to_tensor(value.numpy()) + + return data + + data = HeteroData() + + for node_type in g.ntypes: + for attr, value in g.nodes[node_type].data.items(): + data[node_type][attr] = paddle.to_tensor(value.numpy()) + + for edge_type in g.canonical_etypes: + src, dst = g.edges(form="uv", etype=edge_type) + data[edge_type].edge_index = paddle.to_tensor([src.numpy(), dst.numpy()]) + for attr, value in g.edges[edge_type].data.items(): + data[edge_type][attr] = paddle.to_tensor(value.numpy()) + + return data diff --git a/jointContribution/mattergen/paddle_geometric/utils/cross_entropy.py b/jointContribution/mattergen/paddle_geometric/utils/cross_entropy.py new file mode 100644 index 00000000..24be02e1 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/cross_entropy.py @@ -0,0 +1,93 @@ +from typing import Any, Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import scatter + + +class SparseCrossEntropy(paddle.autograd.PyLayer): + # We implement our own custom autograd function for this to avoid the + # double gradient computation to `inputs`. + @staticmethod + def forward( + ctx: Any, + inputs: Tensor, + edge_label_index: Tensor, + edge_label_weight: Optional[Tensor], + ) -> Tensor: + assert inputs.ndim == 2 + + logsumexp = paddle.logsumexp(inputs, axis=-1) + ctx.save_for_backward(inputs, edge_label_index, edge_label_weight, + logsumexp) + + out = paddle.index_select(inputs, edge_label_index[1], axis=0) + out = paddle.index_select(out, edge_label_index[0], axis=1) + out = -out + paddle.index_select(logsumexp, edge_label_index[0], axis=0) + + if edge_label_weight is not None: + out *= edge_label_weight + + return out.sum() / inputs.shape[0] + + @staticmethod + def backward(ctx: Any, grad_out: Tensor) -> Tuple[Tensor, None, None]: + inputs, edge_label_index, edge_label_weight, logsumexp = ( + ctx.saved_tensor()) + + grad_out = grad_out / inputs.shape[0] + grad_out = grad_out.expand([edge_label_index.shape[1]]) + + if edge_label_weight is not None: + grad_out = grad_out * edge_label_weight + + grad_logsumexp = scatter(grad_out, edge_label_index[0], dim=0, + dim_size=inputs.shape[0], reduce='sum') + + # Gradient computation of `logsumexp`: `grad * (self - result).exp()` + grad_input = inputs - logsumexp.unsqueeze(-1) + grad_input = paddle.exp(grad_input) + grad_input *= grad_logsumexp.unsqueeze(-1) + + grad_input[edge_label_index[0], edge_label_index[1]] -= grad_out + + return grad_input, None, None + + +def sparse_cross_entropy( + inputs: Tensor, + edge_label_index: Tensor, + edge_label_weight: Optional[Tensor] = None, +) -> Tensor: + r"""A sparse-label variant of :func:`paddle.nn.functional.cross_entropy`. + In particular, the binary target matrix is solely given by sparse indices + :obj:`edge_label_index`. + + Args: + inputs (Tensor): The predicted unnormalized logits of shape + :obj:`[batch_size, num_classes]`. + edge_label_index (Tensor): The sparse ground-truth indices with + shape :obj:`[2, num_labels]`. + edge_label_weight (Tensor, optional): The weight of ground-truth + indices with shape :obj:`[num_labels]`. (default: :obj:`None`) + + :rtype: :class:`Tensor` + + Example: + >>> inputs = paddle.randn([2, 3]) + >>> edge_label_index = paddle.to_tensor([ + ... [0, 0, 1], + ... [0, 1, 2], + ... ]) + >>> loss = sparse_cross_entropy(inputs, edge_label_index) + tensor(1.2919) + """ + if edge_label_weight is not None: + assert not edge_label_weight.stop_gradient + + return SparseCrossEntropy.apply( + inputs, + edge_label_index, + edge_label_weight, + ) diff --git a/jointContribution/mattergen/paddle_geometric/utils/dropout.py b/jointContribution/mattergen/paddle_geometric/utils/dropout.py new file mode 100644 index 00000000..af8bda8e --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/dropout.py @@ -0,0 +1,154 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric import is_compiling +from paddle_geometric.deprecation import deprecated +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import cumsum, degree, sort_edge_index, subgraph +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def filter_adj(row: Tensor, col: Tensor, edge_attr: OptTensor, + mask: Tensor) -> Tuple[Tensor, Tensor, OptTensor]: + return row[mask], col[mask], None if edge_attr is None else edge_attr[mask] + + +@deprecated("use 'dropout_edge' instead") +def dropout_adj( + edge_index: Tensor, + edge_attr: OptTensor = None, + p: float = 0.5, + force_undirected: bool = False, + num_nodes: Optional[int] = None, + training: bool = True, +) -> Tuple[Tensor, OptTensor]: + if p < 0. or p > 1.: + raise ValueError(f'Dropout probability has to be between 0 and 1 ' + f'(got {p}') + + if not training or p == 0.0: + return edge_index, edge_attr + + row, col = edge_index + + mask = paddle.rand([row.shape[0]]) >= p + + if force_undirected: + mask[row > col] = False + + row, col, edge_attr = filter_adj(row, col, edge_attr, mask) + + if force_undirected: + edge_index = paddle.stack( + [paddle.concat([row, col], axis=0), + paddle.concat([col, row], axis=0)], axis=0) + if edge_attr is not None: + edge_attr = paddle.concat([edge_attr, edge_attr], axis=0) + else: + edge_index = paddle.stack([row, col], axis=0) + + return edge_index, edge_attr + + +def dropout_node( + edge_index: Tensor, + p: float = 0.5, + num_nodes: Optional[int] = None, + training: bool = True, + relabel_nodes: bool = False, +) -> Tuple[Tensor, Tensor, Tensor]: + if p < 0. or p > 1.: + raise ValueError(f'Dropout probability has to be between 0 and 1 ' + f'(got {p}') + + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + if not training or p == 0.0: + node_mask = paddle.ones([num_nodes], dtype=paddle.bool) + edge_mask = paddle.ones([edge_index.shape[1]], dtype=paddle.bool) + return edge_index, edge_mask, node_mask + + prob = paddle.rand([num_nodes]) + node_mask = prob > p + edge_index, _, edge_mask = subgraph( + node_mask, + edge_index, + relabel_nodes=relabel_nodes, + num_nodes=num_nodes, + return_edge_mask=True, + ) + return edge_index, edge_mask, node_mask + + +def dropout_edge(edge_index: Tensor, p: float = 0.5, + force_undirected: bool = False, + training: bool = True) -> Tuple[Tensor, Tensor]: + if p < 0. or p > 1.: + raise ValueError(f'Dropout probability has to be between 0 and 1 ' + f'(got {p}') + + if not training or p == 0.0: + edge_mask = paddle.ones([edge_index.shape[1]], dtype=paddle.bool) + return edge_index, edge_mask + + row, col = edge_index + + edge_mask = paddle.rand([row.shape[0]]) >= p + + if force_undirected: + edge_mask = edge_mask.astype(paddle.int32) + + row, col = edge_index + edge_mask[row > col] = False + + edge_index = edge_index[:, edge_mask] + + if force_undirected: + edge_index = paddle.concat([edge_index, paddle.flip(edge_index, [0])], axis=1) + edge_mask = paddle.nonzero(edge_mask).tile([2, 1]).squeeze() + + return edge_index, edge_mask + + +def dropout_path(edge_index: Tensor, p: float = 0.2, walks_per_node: int = 1, + walk_length: int = 3, num_nodes: Optional[int] = None, + is_sorted: bool = False, + training: bool = True) -> Tuple[Tensor, Tensor]: + if p < 0. or p > 1.: + raise ValueError(f'Sample probability has to be between 0 and 1 ' + f'(got {p}') + + num_edges = edge_index.shape[1] + edge_mask = paddle.ones([num_edges], dtype=paddle.bool) + if not training or p == 0.0: + return edge_index, edge_mask + + if not paddle_geometric.typing.WITH_PADDLE_CLUSTER or is_compiling(): + raise ImportError('`dropout_path` requires `torch-cluster`.') + + num_nodes = maybe_num_nodes(edge_index, num_nodes) + edge_orders = None + ori_edge_index = edge_index + if not is_sorted: + edge_orders = paddle.arange(num_edges) + edge_index, edge_orders = sort_edge_index(edge_index, edge_orders, + num_nodes=num_nodes) + + row, col = edge_index + sample_mask = paddle.rand([row.shape[0]]) <= p + start = row[sample_mask].repeat(walks_per_node) + + rowptr = cumsum(degree(row, num_nodes=num_nodes, dtype=paddle.int64)) + n_id, e_id = paddle.ops.torch_cluster.random_walk(rowptr, col, start, + walk_length, 1.0, 1.0) + e_id = e_id[e_id != -1].reshape([-1]) # filter illegal edges + + if edge_orders is not None: # Permute edge indices: + e_id = paddle.index_select(edge_orders, e_id) + edge_mask[e_id] = False + edge_index = ori_edge_index[:, edge_mask] + + return edge_index, edge_mask diff --git a/jointContribution/mattergen/paddle_geometric/utils/embedding.py b/jointContribution/mattergen/paddle_geometric/utils/embedding.py new file mode 100644 index 00000000..1aea5087 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/embedding.py @@ -0,0 +1,55 @@ +import warnings +from typing import Any, List + +import paddle +from paddle import Tensor + + +def get_embeddings( + model: paddle.nn.Layer, + *args: Any, + **kwargs: Any, +) -> List[Tensor]: + """Returns the output embeddings of all + :class:`~paddle_geometric.nn.conv.MessagePassing` layers in + :obj:`model`. + + Internally, this method registers forward hooks on all + :class:`~paddle_geometric.nn.conv.MessagePassing` layers of a :obj:`model`, + and runs the forward pass of the :obj:`model` by calling + :obj:`model(*args, **kwargs)`. + + Args: + model (paddle.nn.Layer): The message passing model. + *args: Arguments passed to the model. + **kwargs (optional): Additional keyword arguments passed to the model. + """ + from paddle_geometric.nn import MessagePassing + + embeddings: List[Tensor] = [] + + def hook(layer: paddle.nn.Layer, inputs: Any, outputs: Any) -> None: + # Clone output in case it will be later modified in-place: + outputs = outputs[0] if isinstance(outputs, tuple) else outputs + assert isinstance(outputs, Tensor) + embeddings.append(outputs.clone()) + + hook_handles = [] + for layer in model.sublayers(): # Register forward hooks: + if isinstance(layer, MessagePassing): + hook_handle = layer.register_forward_post_hook(hook) + hook_handles.append(hook_handle) + + if len(hook_handles) == 0: + warnings.warn("The 'model' does not have any 'MessagePassing' layers") + + training = model.training + model.eval() + with paddle.no_grad(): + model(*args, **kwargs) + model.train() + + for handle in hook_handles: # Remove hooks: + handle.remove() + + return embeddings diff --git a/jointContribution/mattergen/paddle_geometric/utils/functions.py b/jointContribution/mattergen/paddle_geometric/utils/functions.py new file mode 100644 index 00000000..ff80bcfe --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/functions.py @@ -0,0 +1,26 @@ +import paddle +from paddle import Tensor + +def cumsum(x: Tensor, dim: int = 0) -> Tensor: + r"""Returns the cumulative sum of elements of :obj:`x`. + In contrast to :meth:`paddle.cumsum`, prepends the output with zero. + + Args: + x (paddle.Tensor): The input tensor. + dim (int, optional): The dimension to do the operation over. + (default: :obj:`0`) + + Example: + >>> x = paddle.to_tensor([2, 4, 1]) + >>> cumsum(x) + tensor([0, 2, 6, 7]) + + """ + # Create a tensor with an additional element in the specified dimension + size = tuple(x.shape[:dim]) + (x.shape[dim] + 1,) + tuple(x.shape[dim + 1:]) + out = paddle.zeros(size, dtype=x.dtype) + + # Compute the cumulative sum, excluding the first element (zero) + out.slice([dim], [1], [x.shape[dim] + 1])[:] = paddle.cumsum(x, axis=dim) + + return out diff --git a/jointContribution/mattergen/paddle_geometric/utils/geodesic.py b/jointContribution/mattergen/paddle_geometric/utils/geodesic.py new file mode 100644 index 00000000..0bf7b363 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/geodesic.py @@ -0,0 +1,81 @@ +import multiprocessing as mp +import warnings +from typing import Optional + +import numpy as np +import paddle +from paddle import Tensor + + +def geodesic_distance( + pos: Tensor, + face: Tensor, + src: Optional[Tensor] = None, + dst: Optional[Tensor] = None, + norm: bool = True, + max_distance: Optional[float] = None, + num_workers: int = 0, + **kwargs: Optional[Tensor], +) -> Tensor: + import gdist + + if 'dest' in kwargs: + dst = kwargs['dest'] + warnings.warn("'dest' attribute in 'geodesic_distance' is deprecated " + "and will be removed in a future release. Use the 'dst' " + "argument instead.") + + max_distance = float('inf') if max_distance is None else max_distance + + if norm: + area = paddle.cross(pos[face[1]] - pos[face[0]], pos[face[2]] - pos[face[0]], axis=1) + scale = float((paddle.norm(area, p=2, axis=1) / 2).sum().sqrt()) + else: + scale = 1.0 + + dtype = pos.dtype + + pos_np = pos.astype('float64').numpy() + face_np = face.t().astype('int32').numpy() + + if src is None and dst is None: + out = gdist.local_gdist_matrix(pos_np, face_np, max_distance * scale).toarray() / scale + return paddle.to_tensor(out, dtype=dtype) + + if src is None: + src_np = np.arange(pos.shape[0], dtype=np.int32) + else: + src_np = src.astype('int32').numpy() + + dst_np = None if dst is None else dst.astype('int32').numpy() + + def _parallel_loop( + pos_np: np.ndarray, + face_np: np.ndarray, + src_np: np.ndarray, + dst_np: Optional[np.ndarray], + max_distance: float, + scale: float, + i: int, + dtype: paddle.dtype, + ) -> Tensor: + s = src_np[i:i + 1] + d = None if dst_np is None else dst_np[i:i + 1] + out = gdist.compute_gdist(pos_np, face_np, s, d, max_distance * scale) + out = out / scale + return paddle.to_tensor(out, dtype=dtype) + + num_workers = mp.cpu_count() if num_workers <= -1 else num_workers + if num_workers > 0: + with mp.Pool(num_workers) as pool: + data = [(pos_np, face_np, src_np, dst_np, max_distance, scale, i, dtype) for i in range(len(src_np))] + outs = pool.starmap(_parallel_loop, data) + else: + outs = [_parallel_loop(pos_np, face_np, src_np, dst_np, max_distance, scale, i, dtype) for i in range(len(src_np))] + + out = paddle.concat(outs, axis=0) + + if dst is None: + out = out.reshape([-1, pos.shape[0]]) + + return out diff --git a/jointContribution/mattergen/paddle_geometric/utils/hetero.py b/jointContribution/mattergen/paddle_geometric/utils/hetero.py new file mode 100644 index 00000000..66600536 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/hetero.py @@ -0,0 +1,134 @@ +from typing import Dict, List, Optional, Set, Tuple, Union + +import paddle +from paddle import Tensor +from paddle.nn import LayerDict + +from paddle_geometric.typing import Adj, EdgeType, NodeType, SparseTensor +from paddle_geometric.utils import is_sparse, to_edge_index +from paddle_geometric.utils.num_nodes import maybe_num_nodes_dict + + +def group_hetero_graph( + edge_index_dict: Dict[EdgeType, Tensor], + num_nodes_dict: Optional[Dict[NodeType, int]] = None, +) -> Tuple[ + Tensor, + Tensor, + Tensor, + Tensor, + Dict[Union[str, int], Tensor], + Dict[Union[NodeType, EdgeType], int], +]: + num_nodes_dict = maybe_num_nodes_dict(edge_index_dict, num_nodes_dict) + + tmp = list(edge_index_dict.values())[0] + + key2int: Dict[Union[NodeType, EdgeType], int] = {} + + cumsum, offset = 0, {} # Helper data. + node_types, local_node_indices = [], [] + local2global: Dict[Union[str, int], Tensor] = {} + for i, (key, N) in enumerate(num_nodes_dict.items()): + key2int[key] = i + node_types.append(paddle.full((N,), i, dtype=tmp.dtype)) + local_node_indices.append(paddle.arange(N, dtype=tmp.dtype)) + offset[key] = cumsum + local2global[key] = local_node_indices[-1] + cumsum + local2global[i] = local2global[key] + cumsum += N + + node_type = paddle.concat(node_types, axis=0) + local_node_idx = paddle.concat(local_node_indices, axis=0) + + edge_indices, edge_types = [], [] + for i, (keys, edge_index) in enumerate(edge_index_dict.items()): + key2int[keys] = i + inc = paddle.to_tensor([offset[keys[0]], offset[keys[-1]]], dtype=tmp.dtype).reshape([2, 1]) + edge_indices.append(edge_index + inc) + edge_types.append(paddle.full((edge_index.shape[1],), i, dtype=tmp.dtype)) + + edge_index = paddle.concat(edge_indices, axis=-1) + edge_type = paddle.concat(edge_types, axis=0) + + return ( + edge_index, + edge_type, + node_type, + local_node_idx, + local2global, + key2int, + ) + + +def get_unused_node_types(node_types: List[NodeType], + edge_types: List[EdgeType]) -> Set[NodeType]: + dst_node_types = {edge_type[-1] for edge_type in edge_types} + return set(node_types) - set(dst_node_types) + + +def check_add_self_loops( + module: paddle.nn.Layer, + edge_types: List[EdgeType], +) -> None: + is_bipartite = any([key[0] != key[-1] for key in edge_types]) + if is_bipartite and getattr(module, 'add_self_loops', False): + raise ValueError( + f"'add_self_loops' attribute set to 'True' on module '{module}' " + f"for use with edge type(s) '{edge_types}'. This will lead to " + f"incorrect message passing results.") + + +def construct_bipartite_edge_index( + edge_index_dict: Dict[EdgeType, Adj], + src_offset_dict: Dict[EdgeType, int], + dst_offset_dict: Dict[NodeType, int], + edge_attr_dict: Optional[Dict[EdgeType, Tensor]] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Adj, Optional[Tensor]]: + """Constructs a tensor of edge indices by concatenating edge indices + for each edge type. The edge indices are increased by the offset of the + source and destination nodes. + """ + is_sparse_tensor = False + edge_indices: List[Tensor] = [] + edge_attrs: List[Tensor] = [] + for edge_type, src_offset in src_offset_dict.items(): + edge_index = edge_index_dict[edge_type] + dst_offset = dst_offset_dict[edge_type[-1]] + + is_sparse_tensor = isinstance(edge_index, SparseTensor) + if is_sparse(edge_index): + edge_index, _ = to_edge_index(edge_index) + edge_index = paddle.flip(edge_index, [0]) + else: + edge_index = edge_index.clone() + + edge_index[0] += src_offset + edge_index[1] += dst_offset + edge_indices.append(edge_index) + + if edge_attr_dict is not None: + if isinstance(edge_attr_dict, LayerDict): + value = edge_attr_dict['__'.join(edge_type)] + else: + value = edge_attr_dict[edge_type] + if value.shape[0] != edge_index.shape[1]: + value = paddle.expand(value, shape=[edge_index.shape[1], -1]) + edge_attrs.append(value) + + edge_index = paddle.concat(edge_indices, axis=1) + + edge_attr: Optional[Tensor] = None + if edge_attr_dict is not None: + edge_attr = paddle.concat(edge_attrs, axis=0) + + if is_sparse_tensor: + edge_index = SparseTensor( + row=edge_index[1], + col=edge_index[0], + value=edge_attr, + sparse_sizes=(num_nodes, num_nodes), + ) + + return edge_index, edge_attr diff --git a/jointContribution/mattergen/paddle_geometric/utils/isolated.py b/jointContribution/mattergen/paddle_geometric/utils/isolated.py new file mode 100644 index 00000000..b3341650 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/isolated.py @@ -0,0 +1,109 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import remove_self_loops, segregate_self_loops +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def contains_isolated_nodes( + edge_index: Tensor, + num_nodes: Optional[int] = None, +) -> bool: + r"""Returns :obj:`True` if the graph given by :attr:`edge_index` contains + isolated nodes. + + Args: + edge_index (Tensor): The edge indices. + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + :rtype: bool + + Examples: + # >>> edge_index = paddle.to_tensor([[0, 1, 0], + # ... [1, 0, 0]]) + # >>> contains_isolated_nodes(edge_index) + False + + # >>> contains_isolated_nodes(edge_index, num_nodes=3) + True + """ + num_nodes = maybe_num_nodes(edge_index, num_nodes) + edge_index, _ = remove_self_loops(edge_index) + return paddle.unique(edge_index.flatten()).shape[0] < num_nodes + + +def remove_isolated_nodes( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor], Tensor]: + r"""Removes the isolated nodes from the graph given by :attr:`edge_index` + with optional edge attributes :attr:`edge_attr`. + In addition, returns a mask of shape :obj:`[num_nodes]` to manually filter + out isolated node features later on. + Self-loops are preserved for non-isolated nodes. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional + edge features. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + :rtype: (Tensor, Tensor, Tensor) + + Examples: + # >>> edge_index = paddle.to_tensor([[0, 1, 0], + # ... [1, 0, 0]]) + # >>> edge_index, edge_attr, mask = remove_isolated_nodes(edge_index) + # >>> mask # node mask (2 nodes) + tensor([True, True]) + + # >>> edge_index, edge_attr, mask = remove_isolated_nodes(edge_index, + # ... num_nodes=3) + # >>> mask # node mask (3 nodes) + tensor([True, True, False]) + """ + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + out = segregate_self_loops(edge_index, edge_attr) + edge_index, edge_attr, loop_edge_index, loop_edge_attr = out + + # Create a mask tensor filled with False (paddle.zeros is used) + mask = paddle.zeros([num_nodes], dtype=paddle.bool, place=edge_index.place) + mask[edge_index.flatten()] = 1 + + # Create the assoc tensor initialized to -1 + assoc = paddle.full([num_nodes], -1, dtype=paddle.int64) + assoc[mask] = paddle.arange(mask.sum().item(), dtype=paddle.int64) + + # Modify edge_index with assoc + edge_index = assoc[edge_index] + + # Create loop_mask with the same shape as mask + loop_mask = paddle.zeros_like(mask) + loop_mask[loop_edge_index[0]] = 1 + loop_mask = loop_mask & mask + + # Create loop_assoc initialized to -1 + loop_assoc = paddle.full_like(assoc, -1, dtype=paddle.int64) + loop_assoc[loop_edge_index[0]] = paddle.arange(loop_edge_index.shape[1], dtype=paddle.int64) + + # Get loop_idx + loop_idx = loop_assoc[loop_mask] + + # Update loop_edge_index + loop_edge_index = assoc[loop_edge_index[:, loop_idx]] + + # Concatenate edge_index and loop_edge_index along dim=1 + edge_index = paddle.concat([edge_index, loop_edge_index], axis=1) + + if edge_attr is not None: + assert loop_edge_attr is not None + loop_edge_attr = paddle.index_select(loop_edge_attr, loop_idx) + edge_attr = paddle.concat([edge_attr, loop_edge_attr], axis=0) + + return edge_index, edge_attr, mask diff --git a/jointContribution/mattergen/paddle_geometric/utils/laplacian.py b/jointContribution/mattergen/paddle_geometric/utils/laplacian.py new file mode 100644 index 00000000..ccf5ed71 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/laplacian.py @@ -0,0 +1,93 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import add_self_loops, remove_self_loops, scatter +from paddle_geometric.utils.num_nodes import maybe_num_nodes + + +def get_laplacian( + edge_index: Tensor, + edge_weight: OptTensor = None, + normalization: Optional[str] = None, + dtype: Optional[paddle.dtype] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + r"""Computes the graph Laplacian of the graph given by :obj:`edge_index` + and optional :obj:`edge_weight`. + + Args: + edge_index (Tensor): The edge indices. + edge_weight (Tensor, optional): One-dimensional edge weights. + (default: :obj:`None`) + normalization (str, optional): The normalization scheme for the graph + Laplacian (default: :obj:`None`): + + 1. :obj:`None`: No normalization + :math:`\mathbf{L} = \mathbf{D} - \mathbf{A}` + + 2. :obj:`"sym"`: Symmetric normalization + :math:`\mathbf{L} = \mathbf{I} - \mathbf{D}^{-1/2} \mathbf{A} + \mathbf{D}^{-1/2}` + + 3. :obj:`"rw"`: Random-walk normalization + :math:`\mathbf{L} = \mathbf{I} - \mathbf{D}^{-1} \mathbf{A}` + dtype (paddle.dtype, optional): The desired data type of returned tensor + in case :obj:`edge_weight=None`. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + Examples: + >>> edge_index = paddle.to_tensor([[0, 1, 1, 2], + ... [1, 0, 2, 1]]) + >>> edge_weight = paddle.to_tensor([1., 2., 2., 4.]) + + >>> # No normalization + >>> lap = get_laplacian(edge_index, edge_weight) + + >>> # Symmetric normalization + >>> lap_sym = get_laplacian(edge_index, edge_weight, + normalization='sym') + + >>> # Random-walk normalization + >>> lap_rw = get_laplacian(edge_index, edge_weight, normalization='rw') + """ + if normalization is not None: + assert normalization in ['sym', 'rw'], "Invalid normalization" + + edge_index, edge_weight = remove_self_loops(edge_index, edge_weight) + + if edge_weight is None: + edge_weight = paddle.ones([edge_index.shape[1]], dtype=dtype) + + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + row, col = edge_index[0], edge_index[1] + deg = scatter(edge_weight, row, 0, dim_size=num_nodes, reduce='sum') + + if normalization is None: + # L = D - A. + edge_index, _ = add_self_loops(edge_index, num_nodes=num_nodes) + edge_weight = paddle.concat([-edge_weight, deg], axis=0) + elif normalization == 'sym': + # Compute A_norm = -D^{-1/2} A D^{-1/2}. + deg_inv_sqrt = deg.pow(-0.5) + deg_inv_sqrt = paddle.where(deg_inv_sqrt == float('inf'), paddle.zeros_like(deg_inv_sqrt), deg_inv_sqrt) + edge_weight = deg_inv_sqrt[row] * edge_weight * deg_inv_sqrt[col] + + # L = I - A_norm. + edge_index, edge_weight = add_self_loops( + edge_index, -edge_weight, fill_value=1.0, num_nodes=num_nodes) + else: + # Compute A_norm = -D^{-1} A. + deg_inv = 1.0 / deg + deg_inv = paddle.where(deg_inv == float('inf'), paddle.zeros_like(deg_inv), deg_inv) + edge_weight = deg_inv[row] * edge_weight + + # L = I - A_norm. + edge_index, edge_weight = add_self_loops( + edge_index, -edge_weight, fill_value=1.0, num_nodes=num_nodes) + + return edge_index, edge_weight diff --git a/jointContribution/mattergen/paddle_geometric/utils/loop.py b/jointContribution/mattergen/paddle_geometric/utils/loop.py new file mode 100644 index 00000000..9c3bd286 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/loop.py @@ -0,0 +1,742 @@ +import typing +from typing import Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric import EdgeIndex +from paddle_geometric.utils.num_nodes import maybe_num_nodes +from paddle_geometric.utils.sparse import ( + is_paddle_sparse_tensor, + to_edge_index, + to_paddle_coo_tensor, + to_paddle_csr_tensor, +) + + +from typing import overload + + + +def contains_self_loops(edge_index: Tensor) -> bool: + r"""Returns :obj:`True` if the graph given by :attr:`edge_index` contains + self-loops. + + Args: + edge_index (LongTensor): The edge indices. + + :rtype: bool + """ + mask = edge_index[0] == edge_index[1] + return mask.sum().item() > 0 + + +@overload +def remove_self_loops( + edge_index: Tensor, + edge_attr: None = None, +) -> Tuple[Tensor, None]: + ... + + +@overload +def remove_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, +) -> Tuple[Tensor, Tensor]: + ... + + +@overload +def remove_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], +) -> Tuple[Tensor, Optional[Tensor]]: + ... + + +def remove_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + r"""Removes every self-loop in the graph given by :attr:`edge_index`, so + that :math:`(i,i) \not\in \mathcal{E}` for every :math:`i \in \mathcal{V}`. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional + edge features. (default: :obj:`None`) + + :rtype: (:class:`LongTensor`, :class:`Tensor`) + """ + size: Optional[Tuple[int, int]] = None + + value: Optional[Tensor] = None + if is_paddle_sparse_tensor(edge_index): + size = (edge_index.shape[0], edge_index.shape[1]) + edge_index, value = to_edge_index(edge_index) + + mask = edge_index[0] != edge_index[1] + edge_index = edge_index[:, mask] + + if edge_attr is None: + return edge_index, None + else: + return edge_index, edge_attr[mask] + + +@overload +def segregate_self_loops( + edge_index: Tensor, + edge_attr: None = None, +) -> Tuple[Tensor, None, Tensor, None]: + ... + + +@overload +def segregate_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, +) -> Tuple[Tensor, Tensor, Tensor, Tensor]: + ... + + +@overload +def segregate_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], +) -> Tuple[Tensor, Optional[Tensor], Tensor, Optional[Tensor]]: + ... + + +def segregate_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, +) -> Tuple[Tensor, Optional[Tensor], Tensor, Optional[Tensor]]: + r"""Segregates self-loops from the graph. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional + edge features. (default: :obj:`None`) + + :rtype: (:class:`LongTensor`, :class:`Tensor`, :class:`LongTensor`, + :class:`Tensor`) + """ + mask = edge_index[0] != edge_index[1] + inv_mask = ~mask + + loop_edge_index = edge_index[:, inv_mask] + loop_edge_attr = None if edge_attr is None else edge_attr[inv_mask] + edge_index = edge_index[:, mask] + edge_attr = None if edge_attr is None else edge_attr[mask] + + return edge_index, edge_attr, loop_edge_index, loop_edge_attr +@overload +def add_self_loops( + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[float] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, None]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[float] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, None]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, None]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[Tensor] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, None]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[str] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, None]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[str] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, None]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[float] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[float] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, Tensor]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + pass + +from typing import Optional, Tuple, Union +import paddle +from paddle import Tensor + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[Tensor] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, Tensor]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[str] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[str] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, Tensor]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[float] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[float] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[Tensor] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[str] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + +@overload +def add_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[str] = None, + num_nodes: Optional[Tuple[int, int]] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass +def add_self_loops( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + fill_value: Optional[Union[float, Tensor, str]] = None, + num_nodes: Optional[Union[int, Tuple[int, int]]] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + r"""Adds a self-loop :math:`(i,i) \in \mathcal{E}` to every node + :math:`i \in \mathcal{V}` in the graph given by :attr:`edge_index`. + In case the graph is weighted or has multi-dimensional edge features + (:obj:`edge_attr != None`), edge features of self-loops will be added + according to :obj:`fill_value`. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional edge + features. (default: :obj:`None`) + fill_value (float or Tensor or str, optional): The way to generate + edge features of self-loops (in case :obj:`edge_attr != None`). + If given as :obj:`float` or :class:`paddle.Tensor`, edge features of + self-loops will be directly given by :obj:`fill_value`. + If given as :obj:`str`, edge features of self-loops are computed by + aggregating all features of edges that point to the specific node, + according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`). + (default: :obj:`1.`) + num_nodes (int or Tuple[int, int], optional): The number of nodes, + *i.e.* :obj:`max_val + 1` of :attr:`edge_index`. + If given as a tuple, then :obj:`edge_index` is interpreted as a + bipartite graph with shape :obj:`(num_src_nodes, num_dst_nodes)`. + (default: :obj:`None`) + + :rtype: (:class:`Tensor`, :class:`Tensor`) + + Returns: + A tuple containing the new `edge_index` and the associated `edge_attr`. + + """ + if isinstance(num_nodes, (tuple, list)): + size = (num_nodes[0], num_nodes[1]) + N = min(size) + else: + N = num_nodes if num_nodes is not None else paddle.max(edge_index) + 1 + size = (N, N) + + device = edge_index.place + + loop_index = paddle.arange(0, N, dtype=edge_index.dtype).reshape([1, -1]) + loop_index = paddle.concat([loop_index, loop_index], axis=0) + + full_edge_index = paddle.concat([edge_index, loop_index], axis=1) + + if edge_attr is not None: + if isinstance(fill_value, (float, int)): + loop_attr = paddle.full( + [N] + list(edge_attr.shape[1:]), + fill_value=fill_value, + dtype=edge_attr.dtype, + ) + elif isinstance(fill_value, str): + if fill_value == "add": + loop_attr = paddle.scatter( + paddle.zeros_like(edge_attr), + edge_index[1], + edge_attr, + overwrite=False, + ) + elif fill_value == "mean": + count = paddle.scatter( + paddle.zeros([N] + [1] * (len(edge_attr.shape) - 1)), + edge_index[1], + paddle.ones_like(edge_attr), + overwrite=False, + ) + loop_attr = paddle.scatter( + paddle.zeros_like(edge_attr), + edge_index[1], + edge_attr, + overwrite=False, + ) / (count + 1e-9) + else: + raise ValueError(f"Unsupported fill_value '{fill_value}'") + else: + raise ValueError("Invalid fill_value type") + + edge_attr = paddle.concat([edge_attr, loop_attr], axis=0) + + return full_edge_index, edge_attr +@overload +def add_remaining_self_loops( + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[float] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, None]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, None]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: None = None, + fill_value: Optional[str] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, None]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[float] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + fill_value: Optional[str] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[float] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + + +@overload +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + fill_value: Optional[str] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + pass + + +def add_remaining_self_loops( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + fill_value: Optional[Union[float, Tensor, str]] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Optional[Tensor]]: + r""" + Adds remaining self-loops :math:`(i, i) \in \mathcal{E}` to every node + :math:`i \in \mathcal{V}` in the graph given by :attr:`edge_index`. + In case the graph is weighted or has multi-dimensional edge features + (:obj:`edge_attr != None`), edge features of non-existing self-loops will + be added according to :obj:`fill_value`. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional edge + features. (default: :obj:`None`) + fill_value (float or Tensor or str, optional): The way to generate + edge features of self-loops (in case :obj:`edge_attr != None`). + If given as :obj:`float` or :class:`paddle.Tensor`, edge features of + self-loops will be directly given by :obj:`fill_value`. + If given as :obj:`str`, edge features of self-loops are computed by + aggregating all features of edges that point to the specific node, + according to a reduce operation. (:obj:`"add"`, :obj:`"mean"`). + (default: :obj:`1.`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + Returns: + Tuple[Tensor, Optional[Tensor]]: The updated edge indices and edge attributes. + """ + N = maybe_num_nodes(edge_index, num_nodes) + mask = edge_index[0] != edge_index[1] + + device = edge_index.place + + if not paddle.in_dynamic_mode() and isinstance(edge_index, EdgeIndex): + loop_index: Tensor = EdgeIndex( + paddle.arange(0, N).view([1, -1]).tile((2, 1)), + sparse_size=(N, N), + is_undirected=True, + ) + else: + loop_index = paddle.arange(0, N).reshape([1, -1]).tile((2, 1)) + + if edge_attr is not None: + + loop_attr = compute_loop_attr( # + edge_index, edge_attr, N, False, fill_value) + + inv_mask = ~mask + loop_attr[edge_index[0][inv_mask]] = edge_attr[inv_mask] + + edge_attr = paddle.concat([edge_attr[mask], loop_attr], axis=0) + + is_undirected = False + if not paddle.in_dynamic_mode() and isinstance(edge_index, EdgeIndex): + is_undirected = edge_index.is_undirected + + edge_index = edge_index[:, mask] + + if not paddle.in_dynamic_mode() and isinstance(edge_index, EdgeIndex): + edge_index._is_undirected = is_undirected + + edge_index = paddle.concat([edge_index, loop_index], axis=1) + + return edge_index, edge_attr + +def get_self_loop_attr( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tensor: + r""" + Returns the edge features or weights of self-loops + :math:`(i, i)` of every node :math:`i \in \mathcal{V}` in the + graph given by :attr:`edge_index`. Edge features of missing self-loops not + present in :attr:`edge_index` will be filled with zeros. If + :attr:`edge_attr` is not given, it will be the vector of ones. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor, optional): Edge weights or multi-dimensional edge + features. (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max_val + 1` of :attr:`edge_index`. (default: :obj:`None`) + + Returns: + Tensor: The self-loop attributes. + + Examples: + >>> edge_index = paddle.to_tensor([[0, 1, 0], + ... [1, 0, 0]]) + >>> edge_weight = paddle.to_tensor([0.2, 0.3, 0.5]) + >>> get_self_loop_attr(edge_index, edge_weight) + Tensor([0.5, 0.0]) + + >>> get_self_loop_attr(edge_index, edge_weight, num_nodes=4) + Tensor([0.5, 0.0, 0.0, 0.0]) + """ + loop_mask = edge_index[0] == edge_index[1] + loop_index = edge_index[0][loop_mask] + + if edge_attr is not None: + loop_attr = edge_attr[loop_mask] + else: # A vector of ones: + loop_attr = paddle.ones(loop_index.shape[0], dtype=edge_index.dtype) + + num_nodes = num_nodes if num_nodes is not None else int(paddle.max(edge_index) + 1) + full_loop_attr = paddle.zeros((num_nodes, ) + loop_attr.shape[1:], dtype=loop_attr.dtype) + full_loop_attr[loop_index] = loop_attr + + return full_loop_attr + + +@overload +def compute_loop_attr( + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: int, + is_sparse: bool, + fill_value: Optional[float] = None, +) -> Tensor: + pass + + +@overload +def compute_loop_attr( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: int, + is_sparse: bool, + fill_value: Optional[Tensor] = None, +) -> Tensor: + pass + + +@overload +def compute_loop_attr( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: int, + is_sparse: bool, + fill_value: Optional[str] = None, +) -> Tensor: + pass + + +def compute_loop_attr( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: int, + is_sparse: bool, + fill_value: Optional[Union[float, Tensor, str]] = None, +) -> Tensor: + r""" + Computes the attributes of self-loops in the graph given by `edge_index` and + `edge_attr`. Missing self-loops will be added according to `fill_value`. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor): The edge weights or multi-dimensional edge features. + num_nodes (int): The number of nodes. + is_sparse (bool): Whether the graph is sparse. + fill_value (float, Tensor or str, optional): How to compute self-loop + attributes for missing self-loops. Defaults to 1.0 or as specified. + + Returns: + Tensor: The computed self-loop attributes. + """ + if fill_value is None: + fill_value = 1.0 + + if isinstance(fill_value, (float, int)): + loop_attr = paddle.full([num_nodes] + list(edge_attr.shape[1:]), fill_value, dtype=edge_attr.dtype) + elif isinstance(fill_value, str): + if fill_value == "add": + loop_attr = paddle.zeros([num_nodes] + list(edge_attr.shape[1:]), dtype=edge_attr.dtype) + scatter_add = paddle.scatter_add( + paddle.zeros_like(loop_attr), edge_index[0], edge_attr, overwrite=False + ) + loop_attr += scatter_add + elif fill_value == "mean": + counts = paddle.scatter( + paddle.zeros([num_nodes], dtype="int32"), + edge_index[0], + paddle.ones([edge_attr.shape[0]], dtype="int32"), + overwrite=False, + ) + scatter_sum = paddle.scatter_add( + paddle.zeros_like(loop_attr), + edge_index[0], + edge_attr, + overwrite=False, + ) + loop_attr = scatter_sum / (counts.reshape([-1, 1]) + 1e-9) + else: + raise ValueError(f"Unsupported fill_value '{fill_value}'") + else: + raise ValueError("Invalid fill_value type") + + return loop_attr + +def compute_loop_attr( + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: int, + is_sparse: bool, + fill_value: Optional[Union[float, Tensor, str]] = None, +) -> Tensor: + """ + Computes the attributes of self-loops in the graph given by `edge_index` and + `edge_attr`. Missing self-loops will be added according to `fill_value`. + + Args: + edge_index (Tensor): The edge indices. + edge_attr (Tensor): The edge weights or multi-dimensional edge features. + num_nodes (int): The number of nodes. + is_sparse (bool): Whether the graph is sparse. + fill_value (float, Tensor or str, optional): How to compute self-loop + attributes for missing self-loops. Defaults to 1.0 or as specified. + + Returns: + Tensor: The computed self-loop attributes. + """ + if fill_value is None: + size = (num_nodes, ) + tuple(edge_attr.shape[1:]) + return paddle.ones(size, dtype=edge_attr.dtype) + + elif isinstance(fill_value, (int, float)): + size = (num_nodes, ) + tuple(edge_attr.shape[1:]) + return paddle.full(size, fill_value, dtype=edge_attr.dtype) + + elif isinstance(fill_value, Tensor): + size = (num_nodes, ) + tuple(edge_attr.shape[1:]) + loop_attr = fill_value.astype(edge_attr.dtype) + if len(edge_attr.shape) != len(loop_attr.shape): + loop_attr = loop_attr.unsqueeze(0) + return paddle.expand(loop_attr, size) + + elif isinstance(fill_value, str): + col = edge_index[0] if is_sparse else edge_index[1] + if fill_value == "add": + return paddle.scatter( + paddle.zeros([num_nodes] + list(edge_attr.shape[1:]), dtype=edge_attr.dtype), + col, + edge_attr, + overwrite=False, + ) + elif fill_value == "mean": + counts = paddle.scatter( + paddle.zeros([num_nodes], dtype="int32"), + col, + paddle.ones([edge_attr.shape[0]], dtype="int32"), + overwrite=False, + ) + scatter_sum = paddle.scatter_add( + paddle.zeros([num_nodes] + list(edge_attr.shape[1:]), dtype=edge_attr.dtype), + col, + edge_attr, + overwrite=False, + ) + return scatter_sum / (counts.unsqueeze(-1).astype(edge_attr.dtype) + 1e-9) + else: + raise ValueError(f"Unsupported fill_value '{fill_value}'") + + raise AttributeError("No valid 'fill_value' provided") \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_geometric/utils/map.py b/jointContribution/mattergen/paddle_geometric/utils/map.py new file mode 100644 index 00000000..a5a958e8 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/map.py @@ -0,0 +1,101 @@ +import warnings +from typing import Optional, Tuple, Union + +import numpy as np +import paddle +from paddle import Tensor + + +def is_integer_dtype(dtype): + """ + Checks if the given dtype is an integer type. + + Args: + dtype (paddle.dtype): The data type to check. + + Returns: + bool: True if the dtype is an integer type, False otherwise. + """ + return dtype in [paddle.int8, paddle.int16, paddle.int32, paddle.int64] + + +def map_index( + src: Tensor, + index: Tensor, + max_index: Optional[Union[int, Tensor]] = None, + inclusive: bool = False, +) -> Tuple[Tensor, Optional[Tensor]]: + """ + Maps indices in `src` to the positional value of their + corresponding occurrence in `index`. + Indices must be strictly positive. + + Args: + src (paddle.Tensor): The source tensor to map. + index (paddle.Tensor): The index tensor that denotes the new mapping. + max_index (int, optional): The maximum index value. + (default :obj:`None`) + inclusive (bool, optional): If set to True, it is assumed that + every entry in `src` has a valid entry in `index`. + Can speed-up computation. (default: `False`) + + Returns: + Tuple[paddle.Tensor, Optional[paddle.Tensor]] + + Example: + >>> src = paddle.to_tensor([2, 0, 1, 0, 3], dtype='int64') + >>> index = paddle.to_tensor([3, 2, 0, 1], dtype='int64') + >>> map_index(src, index) + (Tensor([1, 2, 3, 2, 0], dtype=int64), Tensor([True, True, True, True, True])) + + >>> src = paddle.to_tensor([2, 0, 1, 0, 3], dtype='int64') + >>> index = paddle.to_tensor([3, 2, 0], dtype='int64') + >>> map_index(src, index) + (Tensor([1, 2, -1, 2, 0], dtype=int64), Tensor([True, True, False, True, True])) + """ + if not is_integer_dtype(src.dtype) or not is_integer_dtype(index.dtype): + raise ValueError("Expected 'src' and 'index' to be integer tensors.") + + # if src.place != index.place: + # raise ValueError(f"'src' and 'index' must be on the same device. all in gpu:0") + + if max_index is None: + max_index = max(src.max(), index.max()).item() + + # Memory-efficient method if `max_index` is within threshold + THRESHOLD = 40_000_000 if src.place.is_gpu_place() else 10_000_000 + if max_index <= THRESHOLD: + assoc = paddle.full((max_index + 1,), -1, dtype=src.dtype) + assoc = paddle.scatter(assoc, index, paddle.arange(index.shape[0], dtype=src.dtype)) + + out = paddle.gather(assoc, src) + if inclusive: + if paddle.any(out == -1): + raise ValueError("Found invalid entries in 'src' that do not have a corresponding entry in 'index'.") + return out, None + else: + mask = out != -1 + return out[mask], mask + + # CPU-based fallback using pandas + try: + import pandas as pd + left_ser = pd.Series(src.numpy(), name='left_ser') + right_ser = pd.Series( + index.numpy(), + index=np.arange(index.shape[0]), + name='right_ser', + ) + result = pd.merge(left_ser, right_ser, how='left', left_on='left_ser', right_index=True) + out = paddle.to_tensor(result['right_ser'].fillna(-1).values, place=src.place, dtype=src.dtype) + + if inclusive: + if paddle.any(out == -1): + raise ValueError("Found invalid entries in 'src' that do not have a corresponding entry in 'index'.") + return out, None + else: + mask = out != -1 + return out[mask], mask + except ImportError: + warnings.warn("Install 'pandas' for better performance.") + raise diff --git a/jointContribution/mattergen/paddle_geometric/utils/mask.py b/jointContribution/mattergen/paddle_geometric/utils/mask.py new file mode 100644 index 00000000..c8519bc6 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/mask.py @@ -0,0 +1,40 @@ +from typing import Optional + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import TensorFrame + + +def mask_select(src: Tensor, dim: int, mask: Tensor) -> Tensor: + """Returns a new tensor which masks the src tensor along the + dimension dim according to the boolean mask mask.""" + assert mask.ndim == 1 + + if isinstance(src, TensorFrame): + assert dim == 0 and src.shape[0] == mask.numel() + return src[mask] + + assert src.shape[dim] == mask.numel() + dim = dim + src.ndim if dim < 0 else dim + assert dim >= 0 and dim < src.ndim + + src = paddle.transpose(src, perm=[dim] + [i for i in range(src.ndim) if i != dim]) if dim != 0 else src + out = src[mask] + out = paddle.transpose(out, perm=[dim] + [i for i in range(out.ndim) if i != dim]) if dim != 0 else out + + return out + + +def index_to_mask(index: Tensor, size: Optional[int] = None) -> Tensor: + """Converts indices to a mask representation.""" + index = index.reshape([-1]) + size = int(index.max().item()) + 1 if size is None else size + mask = paddle.zeros([size], dtype=paddle.bool) + mask[index] = True + return mask + + +def mask_to_index(mask: Tensor) -> Tensor: + """Converts a mask to an index representation.""" + return paddle.nonzero(mask).reshape([-1]) diff --git a/jointContribution/mattergen/paddle_geometric/utils/mesh_laplacian.py b/jointContribution/mattergen/paddle_geometric/utils/mesh_laplacian.py new file mode 100644 index 00000000..a83476a4 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/mesh_laplacian.py @@ -0,0 +1,68 @@ +from typing import Optional, Tuple + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import add_self_loops, scatter, to_undirected + + +def get_mesh_laplacian( + pos: Tensor, + face: Tensor, + normalization: Optional[str] = None, +) -> Tuple[Tensor, Tensor]: + """Computes the mesh Laplacian of a mesh given by pos and face.""" + + assert pos.shape[1] == 3 and face.shape[0] == 3 + num_nodes = pos.shape[0] + + def get_cots(left: Tensor, centre: Tensor, right: Tensor) -> Tensor: + left_pos, central_pos, right_pos = pos[left], pos[centre], pos[right] + left_vec = left_pos - central_pos + right_vec = right_pos - central_pos + dot = paddle.sum(left_vec * right_vec, axis=1) + cross = paddle.norm(paddle.cross(left_vec, right_vec, axis=1), axis=1) + cot = dot / cross + return cot / 2.0 + + cot_021 = get_cots(face[0], face[2], face[1]) + cot_102 = get_cots(face[1], face[0], face[2]) + cot_012 = get_cots(face[0], face[1], face[2]) + cot_weight = paddle.concat([cot_021, cot_102, cot_012]) + + cot_index = paddle.concat([face[:2], face[1:], face[::2]], axis=1) + cot_index, cot_weight = to_undirected(cot_index, cot_weight) + + cot_deg = scatter(cot_weight, cot_index[0], 0, num_nodes, reduce='sum') + edge_index, _ = add_self_loops(cot_index, num_nodes=num_nodes) + edge_weight = paddle.concat([cot_weight, -cot_deg], axis=0) + + if normalization is not None: + + def get_areas(left: Tensor, centre: Tensor, right: Tensor) -> Tensor: + central_pos = pos[centre] + left_vec = pos[left] - central_pos + right_vec = pos[right] - central_pos + cross = paddle.norm(paddle.cross(left_vec, right_vec, axis=1), axis=1) + area = cross / 6.0 + return area / 2.0 + + area_021 = get_areas(face[0], face[2], face[1]) + area_102 = get_areas(face[1], face[0], face[2]) + area_012 = get_areas(face[0], face[1], face[2]) + area_weight = paddle.concat([area_021, area_102, area_012]) + area_index = paddle.concat([face[:2], face[1:], face[::2]], axis=1) + area_index, area_weight = to_undirected(area_index, area_weight) + area_deg = scatter(area_weight, area_index[0], 0, num_nodes, 'sum') + + if normalization == 'sym': + area_deg_inv_sqrt = area_deg.pow(-0.5) + area_deg_inv_sqrt = paddle.where(area_deg_inv_sqrt == float('inf'), paddle.zeros_like(area_deg_inv_sqrt), area_deg_inv_sqrt) + edge_weight = (area_deg_inv_sqrt[edge_index[0]] * edge_weight * + area_deg_inv_sqrt[edge_index[1]]) + elif normalization == 'rw': + area_deg_inv = 1.0 / area_deg + area_deg_inv = paddle.where(area_deg_inv == float('inf'), paddle.zeros_like(area_deg_inv), area_deg_inv) + edge_weight = area_deg_inv[edge_index[0]] * edge_weight + + return edge_index, edge_weight diff --git a/jointContribution/mattergen/paddle_geometric/utils/mixin.py b/jointContribution/mattergen/paddle_geometric/utils/mixin.py new file mode 100644 index 00000000..7bda5baa --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/mixin.py @@ -0,0 +1,22 @@ +from typing import Any, Iterator, TypeVar + +T = TypeVar('T') + + +class CastMixin: + @classmethod + def cast(cls: T, *args: Any, **kwargs: Any) -> T: + if len(args) == 1 and len(kwargs) == 0: + elem = args[0] + if elem is None: + return None # type: ignore + if isinstance(elem, CastMixin): + return elem # type: ignore + if isinstance(elem, tuple): + return cls(*elem) # type: ignore + if isinstance(elem, dict): + return cls(**elem) # type: ignore + return cls(*args, **kwargs) # type: ignore + + def __iter__(self) -> Iterator: + return iter(self.__dict__.values()) diff --git a/jointContribution/mattergen/paddle_geometric/utils/nested.py b/jointContribution/mattergen/paddle_geometric/utils/nested.py new file mode 100644 index 00000000..23d6782a --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/nested.py @@ -0,0 +1,86 @@ +from typing import Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.utils import scatter + + +def to_nested_tensor( + x: Tensor, + batch: Optional[Tensor] = None, + ptr: Optional[Tensor] = None, + batch_size: Optional[int] = None, +) -> Tensor: + r"""Given a contiguous batch of tensors + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times *}` + (with :math:`N_i` indicating the number of elements in example :math:`i`), + creates a `nested Paddle tensor`. + Reverse operation of :meth:`from_nested_tensor`. + + Args: + x (paddle.Tensor): The input tensor + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times *}`. + batch (paddle.Tensor, optional): The batch vector + :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`, which assigns each + element to a specific example. Must be ordered. + (default: :obj:`None`) + ptr (paddle.Tensor, optional): Alternative representation of + :obj:`batch` in compressed format. (default: :obj:`None`) + batch_size (int, optional): The batch size :math:`B`. + (default: :obj:`None`) + """ + if ptr is not None: + offsets = ptr[1:] - ptr[:-1] + sizes = offsets.tolist() + xs = list(paddle.split(x, sizes, axis=0)) + elif batch is not None: + offsets = scatter(paddle.ones_like(batch), batch, dim_size=batch_size) + sizes = offsets.tolist() + xs = list(paddle.split(x, sizes, axis=0)) + else: + xs = [x] + + # This currently copies the data, although `x` is already contiguous. + # Sadly, there does not exist any (public) API to prevent this :( + return paddle.to_tensor(xs) + + +def from_nested_tensor( + x: Tensor, + return_batch: bool = False, +) -> Union[Tensor, Tuple[Tensor, Tensor]]: + r"""Given a `nested Paddle tensor`, creates a contiguous + batch of tensors + :math:`\mathbf{X} \in \mathbb{R}^{(N_1 + \ldots + N_B) \times *}`, and + optionally a batch vector which assigns each element to a specific example. + Reverse operation of :meth:`to_nested_tensor`. + + Args: + x (paddle.Tensor): The nested input tensor. The size of nested tensors + need to match except for the first dimension. + return_batch (bool, optional): If set to :obj:`True`, will also return + the batch vector :math:`\mathbf{b} \in {\{ 0, \ldots, B-1\}}^N`. + (default: :obj:`False`) + """ + if not isinstance(x, list): + raise ValueError("Input tensor in 'from_nested_tensor' is not nested") + + sizes = paddle.to_tensor([t.shape for t in x]) + + for dim, (a, b) in enumerate(zip(sizes[0, 1:], sizes[:, 1:].t())): + if not paddle.all(paddle.equal(a.expand(b.shape), b)): + raise ValueError(f"Not all nested tensors have the same size " + f"in dimension {dim + 1} " + f"(expected size {a.item()} for all tensors)") + + out = paddle.concat([t.flatten() for t in x]) + out = out.reshape([-1] + sizes[0, 1:].tolist()) + + if not return_batch: + return out + + batch = paddle.arange(len(x), dtype='int64') + batch = batch.repeat_interleave(sizes[:, 0]) + + return out, batch diff --git a/jointContribution/mattergen/paddle_geometric/utils/noise_scheduler.py b/jointContribution/mattergen/paddle_geometric/utils/noise_scheduler.py new file mode 100644 index 00000000..53161c54 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/noise_scheduler.py @@ -0,0 +1,106 @@ +import math +from typing import Literal, Optional + +import paddle +from paddle import Tensor + + +def get_smld_sigma_schedule( + sigma_min: float, + sigma_max: float, + num_scales: int, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tensor: + r"""Generates a set of noise values on a logarithmic scale for "Score + Matching with Langevin Dynamics" from the `"Generative Modeling by + Estimating Gradients of the Data Distribution" + `_ paper. + + This function returns a vector of sigma values that define the schedule of + noise levels used during Score Matching with Langevin Dynamics. + The sigma values are determined on a logarithmic scale from + :obj:`sigma_max` to :obj:`sigma_min`, inclusive. + + Args: + sigma_min (float): The minimum value of sigma, corresponding to the + lowest noise level. + sigma_max (float): The maximum value of sigma, corresponding to the + highest noise level. + num_scales (int): The number of sigma values to generate, defining the + granularity of the noise schedule. + dtype (paddle.dtype, optional): The output data type. + (default: :obj:`None`) + device (str, optional): The output device. + (default: :obj:`None`) + """ + log_sigma_max = math.log(sigma_max) + log_sigma_min = math.log(sigma_min) + return paddle.exp(paddle.linspace( + log_sigma_max, + log_sigma_min, + num_scales, + dtype=dtype, + )) + + +def get_diffusion_beta_schedule( + schedule_type: Literal['linear', 'quadratic', 'constant', 'sigmoid'], + beta_start: float, + beta_end: float, + num_diffusion_timesteps: int, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tensor: + r"""Generates a schedule of beta values according to the specified strategy + for the diffusion process from the `"Denoising Diffusion Probabilistic + Models" `_ paper. + + Beta values are used to scale the noise added during the diffusion process + in generative models. This function creates an array of beta values + according to a pre-defined schedule, which can be either :obj:`"linear"`, + :obj:`"quadratic"`, :obj:`"constant"`, or :obj:`"sigmoid"`. + + Args: + schedule_type (str): The type of schedule to use for beta values. + beta_start (float): The starting value of beta. + beta_end (float): The ending value of beta. + num_diffusion_timesteps (int): The number of timesteps for the + diffusion process. + dtype (paddle.dtype, optional): The output data type. + (default: :obj:`None`) + device (str, optional): The output device. + (default: :obj:`None`) + """ + if schedule_type == 'linear': + return paddle.linspace( + beta_start, + beta_end, + num_diffusion_timesteps, + dtype=dtype, + ) + + if schedule_type == 'quadratic': + return paddle.linspace( + beta_start**0.5, + beta_end**0.5, + num_diffusion_timesteps, + dtype=dtype, + )**2 + + if schedule_type == 'constant': + return paddle.full( + shape=[num_diffusion_timesteps], + fill_value=beta_end, + dtype=dtype, + ) + + if schedule_type == 'sigmoid': + return paddle.linspace( + -6, + 6, + num_diffusion_timesteps, + dtype=dtype, + ).sigmoid() * (beta_end - beta_start) + beta_start + + raise ValueError(f"Found invalid 'schedule_type' (got '{schedule_type}')") diff --git a/jointContribution/mattergen/paddle_geometric/utils/num_nodes.py b/jointContribution/mattergen/paddle_geometric/utils/num_nodes.py new file mode 100644 index 00000000..d9df3b8f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/num_nodes.py @@ -0,0 +1,93 @@ +from copy import copy +from typing import Dict, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +# Function to calculate the number of nodes based on edge_index input +def maybe_num_nodes( + edge_index: Union[Tensor, Tuple[Tensor, Tensor]], + num_nodes: Optional[int] = None, +) -> int: + """ + This function calculates the number of nodes in the graph based on the provided edge_index. + The function handles different input types (Tensor or tuple) and returns the maximum node + index, considering both rows and columns in the edge_index. + + Args: + edge_index (Union[Tensor, Tuple[Tensor, Tensor]]): Edge index, could be a Tensor or a tuple of Tensors. + num_nodes (Optional[int]): Optional number of nodes, if provided, will be returned directly. + + Returns: + int: The calculated number of nodes in the graph. + """ + # If num_nodes is explicitly provided, return it + if num_nodes is not None: + return num_nodes + + # If edge_index is a Tensor + elif isinstance(edge_index, Tensor): + # If the edge_index is sparse, the number of nodes is the maximum of row and column sizes + if edge_index.is_sparse(): + return max(edge_index.shape[0], edge_index.shape[1]) + + # In dynamic mode, concatenate the tensor and find the maximum node value + if paddle.in_dynamic_mode(): + tmp = paddle.concat([ + edge_index.reshape([-1]), + paddle.full([1], fill_value=-1, dtype=edge_index.dtype) + ]) + return int(tmp.max().item()) + 1 + + # In static mode, find the maximum node index + return int(edge_index.max().item()) + 1 if edge_index.numel() > 0 else 0 + + # If edge_index is a tuple (e.g., (row, col)) + elif isinstance(edge_index, tuple): + return max( + int(edge_index[0].max().item()) + 1 if edge_index[0].numel() > 0 else 0, + int(edge_index[1].max().item()) + 1 if edge_index[1].numel() > 0 else 0, + ) + + # If edge_index is not a supported type, raise an error + raise NotImplementedError("edge_index must be a Tensor or tuple of Tensors") + +# Function to calculate the number of nodes for each type in a dictionary of edge indices +def maybe_num_nodes_dict( + edge_index_dict: Dict[Tuple[str, str, str], Tensor], + num_nodes_dict: Optional[Dict[str, int]] = None, +) -> Dict[str, int]: + """ + This function calculates the number of nodes for each type in a dictionary of edge indices. + It iterates over the dictionary, computes the maximum node index for each edge type, and updates + the num_nodes_dict. + + Args: + edge_index_dict (Dict[Tuple[str, str, str], Tensor]): Dictionary of edge indices with keys as node types. + num_nodes_dict (Optional[Dict[str, int]]): Optional dictionary of pre-existing node counts for each type. + + Returns: + Dict[str, int]: Updated dictionary of node counts for each edge type. + """ + num_nodes_dict = {} if num_nodes_dict is None else copy(num_nodes_dict) + + # List of types already present in num_nodes_dict + found_types = list(num_nodes_dict.keys()) + + # Iterate over the edge_index_dict + for keys, edge_index in edge_index_dict.items(): + # Process the first key (node type) + key = keys[0] + if key not in found_types: + # Calculate the maximum node index for the first key (node type) + N = int(edge_index[0].max().item() + 1) + num_nodes_dict[key] = max(N, num_nodes_dict.get(key, N)) + + # Process the last key (node type) + key = keys[-1] + if key not in found_types: + # Calculate the maximum node index for the last key (node type) + N = int(edge_index[1].max().item() + 1) + num_nodes_dict[key] = max(N, num_nodes_dict.get(key, N)) + + return num_nodes_dict diff --git a/jointContribution/mattergen/paddle_geometric/utils/ppr.py b/jointContribution/mattergen/paddle_geometric/utils/ppr.py new file mode 100644 index 00000000..043fd276 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/ppr.py @@ -0,0 +1,117 @@ +from itertools import chain +from typing import Callable, List, Optional, Tuple + +import numpy as np +import paddle +from paddle import Tensor + +try: + import numba + WITH_NUMBA = True +except Exception: # pragma: no cover + WITH_NUMBA = False + + +def _get_ppr( # pragma: no cover + rowptr: np.ndarray, + col: np.ndarray, + alpha: float, + eps: float, + target: Optional[np.ndarray] = None, +) -> Tuple[List[List[int]], List[List[float]]]: + + num_nodes = len(rowptr) - 1 if target is None else len(target) + alpha_eps = alpha * eps + js = [[0]] * num_nodes + vals = [[0.]] * num_nodes + + for inode_uint in numba.prange(num_nodes): + inode = inode_uint if target is None else target[inode_uint] + + p = {inode: 0.0} + r = {} + r[inode] = alpha + q = [inode] + + while len(q) > 0: + unode = q.pop() + + res = r[unode] if unode in r else 0 + p[unode] = p.get(unode, 0) + res + + r[unode] = 0 + start, end = rowptr[unode], rowptr[unode + 1] + ucount = end - start + + for vnode in col[start:end]: + _val = (1 - alpha) * res / ucount + r[vnode] = r.get(vnode, 0) + _val + + res_vnode = r[vnode] + vcount = rowptr[vnode + 1] - rowptr[vnode] + if res_vnode >= alpha_eps * vcount and vnode not in q: + q.append(vnode) + + js[inode_uint] = list(p.keys()) + vals[inode_uint] = list(p.values()) + + return js, vals + + +_get_ppr_numba: Optional[Callable] = None + + +def get_ppr( + edge_index: Tensor, + alpha: float = 0.2, + eps: float = 1e-5, + target: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> Tuple[Tensor, Tensor]: + r"""Calculates the personalized PageRank (PPR) vector for all or a subset + of nodes using a variant of the `Andersen algorithm + `_. + + Args: + edge_index (paddle.Tensor): The indices of the graph. + alpha (float, optional): The alpha value of the PageRank algorithm. + (default: :obj:`0.2`) + eps (float, optional): The threshold for stopping the PPR calculation + (:obj:`edge_weight >= eps * out_degree`). (default: :obj:`1e-5`) + target (paddle.Tensor, optional): The target nodes to compute PPR for. + If not given, calculates PPR vectors for all nodes. + (default: :obj:`None`) + num_nodes (int, optional): The number of nodes. (default: :obj:`None`) + + :rtype: (:class:`paddle.Tensor`, :class:`paddle.Tensor`) + """ + if not WITH_NUMBA: # pragma: no cover + raise ImportError("'get_ppr' requires the 'numba' package") + + global _get_ppr_numba + if _get_ppr_numba is None: + _get_ppr_numba = numba.jit(nopython=True, parallel=True)(_get_ppr) + + num_nodes = num_nodes or edge_index.shape[1] if num_nodes is None else num_nodes + + rowptr, col = edge_index[0].numpy(), edge_index[1].numpy() + + cols, weights = _get_ppr_numba( + rowptr, + col, + alpha, + eps, + None if target is None else target.numpy(), + ) + + device = edge_index.place + col = paddle.to_tensor(list(chain.from_iterable(cols)), place=device) + weight = paddle.to_tensor(list(chain.from_iterable(weights)), place=device) + deg = paddle.to_tensor([len(value) for value in cols], place=device) + + row = paddle.arange(num_nodes) if target is None else target + row = row.tile([deg.sum() // num_nodes]) + + edge_index = paddle.stack([row, col], axis=0) + + return edge_index, weight diff --git a/jointContribution/mattergen/paddle_geometric/utils/random.py b/jointContribution/mattergen/paddle_geometric/utils/random.py new file mode 100644 index 00000000..d3371030 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/random.py @@ -0,0 +1,119 @@ +from itertools import chain +from typing import List, Union + +import numpy as np +import paddle + +from paddle_geometric.utils import remove_self_loops, to_undirected + + +def erdos_renyi_graph( + num_nodes: int, + edge_prob: float, + directed: bool = False, +) -> paddle.Tensor: + r"""Returns the :obj:`edge_index` of a random Erdos-Renyi graph. + + Args: + num_nodes (int): The number of nodes. + edge_prob (float): Probability of an edge. + directed (bool, optional): If set to :obj:`True`, will return a + directed graph. (default: :obj:`False`) + """ + if directed: + idx = paddle.arange((num_nodes - 1) * num_nodes) + idx = idx.reshape([num_nodes - 1, num_nodes]) + idx = idx + paddle.arange(1, num_nodes).reshape([-1, 1]) + idx = idx.reshape([-1]) + else: + idx = paddle.combinations(paddle.arange(num_nodes), r=2) + + # Filter edges. + mask = paddle.rand([idx.shape[0]]) < edge_prob + idx = idx[mask] + + if directed: + row = idx // num_nodes + col = idx % num_nodes + edge_index = paddle.stack([row, col], axis=0) + else: + edge_index = to_undirected(idx.T, num_nodes=num_nodes) + + return edge_index + + +def stochastic_blockmodel_graph( + block_sizes: Union[List[int], paddle.Tensor], + edge_probs: Union[List[List[float]], paddle.Tensor], + directed: bool = False, +) -> paddle.Tensor: + r"""Returns the :obj:`edge_index` of a stochastic blockmodel graph. + + Args: + block_sizes ([int] or paddle.Tensor): The sizes of blocks. + edge_probs ([[float]] or paddle.Tensor): The density of edges going + from each block to each other block. Must be symmetric if the + graph is undirected. + directed (bool, optional): If set to :obj:`True`, will return a + directed graph. (default: :obj:`False`) + """ + size, prob = block_sizes, edge_probs + + if not isinstance(size, paddle.Tensor): + size = paddle.to_tensor(size, dtype='int64') + if not isinstance(prob, paddle.Tensor): + prob = paddle.to_tensor(prob, dtype='float32') + + assert size.ndim == 1 + assert prob.ndim == 2 and prob.shape[0] == prob.shape[1] + assert size.shape[0] == prob.shape[0] + if not directed: + assert paddle.allclose(prob, prob.T) + + node_idx = paddle.concat([paddle.full([b], i, dtype='int64') for i, b in enumerate(size)]) + num_nodes = node_idx.shape[0] + + if directed: + idx = paddle.arange((num_nodes - 1) * num_nodes) + idx = idx.reshape([num_nodes - 1, num_nodes]) + idx = idx + paddle.arange(1, num_nodes).reshape([-1, 1]) + idx = idx.reshape([-1]) + row = idx // num_nodes + col = idx % num_nodes + else: + row, col = paddle.combinations(paddle.arange(num_nodes), r=2).T + + mask = paddle.bernoulli(prob[node_idx[row], node_idx[col]]).astype('bool') + edge_index = paddle.stack([row[mask], col[mask]], axis=0) + + if not directed: + edge_index = to_undirected(edge_index, num_nodes=num_nodes) + + return edge_index + + +def barabasi_albert_graph(num_nodes: int, num_edges: int) -> paddle.Tensor: + r"""Returns the :obj:`edge_index` of a Barabasi-Albert preferential + attachment model, where a graph of :obj:`num_nodes` nodes grows by + attaching new nodes with :obj:`num_edges` edges that are preferentially + attached to existing nodes with high degree. + + Args: + num_nodes (int): The number of nodes. + num_edges (int): The number of edges from a new node to existing nodes. + """ + assert num_edges > 0 and num_edges < num_nodes + + row = paddle.arange(num_edges, dtype='int64') + col = paddle.randperm(num_edges) + + for i in range(num_edges, num_nodes): + row = paddle.concat([row, paddle.full([num_edges], i, dtype='int64')]) + choice = np.random.choice(paddle.concat([row, col]).numpy(), num_edges) + col = paddle.concat([col, paddle.to_tensor(choice)]) + + edge_index = paddle.stack([row, col], axis=0) + edge_index, _ = remove_self_loops(edge_index) + edge_index = to_undirected(edge_index, num_nodes=num_nodes) + + return edge_index diff --git a/jointContribution/mattergen/paddle_geometric/utils/repeat.py b/jointContribution/mattergen/paddle_geometric/utils/repeat.py new file mode 100644 index 00000000..5721f305 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/repeat.py @@ -0,0 +1,36 @@ +import itertools +import numbers +from typing import Any + +import paddle +from paddle import Tensor + + +def repeat(src: Any, length: int) -> Any: + if src is None: + return None + + if isinstance(src, Tensor): + if src.numel() == 1: + return src.tile([length]) + + if src.numel() > length: + return src[:length] + + if src.numel() < length: + last_elem = src[-1].unsqueeze(0) + padding = last_elem.tile([length - src.numel()]) + return paddle.concat([src, padding]) + + return src + + if isinstance(src, numbers.Number): + return list(itertools.repeat(src, length)) + + if len(src) > length: + return src[:length] + + if len(src) < length: + return src + list(itertools.repeat(src[-1], length - len(src))) + + return src diff --git a/jointContribution/mattergen/paddle_geometric/utils/smiles.py b/jointContribution/mattergen/paddle_geometric/utils/smiles.py new file mode 100644 index 00000000..bfc7adcb --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/smiles.py @@ -0,0 +1,248 @@ +from itertools import chain +from typing import Any, Dict, List + +import paddle + +import paddle_geometric + +x_map: Dict[str, List[Any]] = { + 'atomic_num': + list(range(0, 119)), + 'chirality': [ + 'CHI_UNSPECIFIED', + 'CHI_TETRAHEDRAL_CW', + 'CHI_TETRAHEDRAL_CCW', + 'CHI_OTHER', + 'CHI_TETRAHEDRAL', + 'CHI_ALLENE', + 'CHI_SQUAREPLANAR', + 'CHI_TRIGONALBIPYRAMIDAL', + 'CHI_OCTAHEDRAL', + ], + 'degree': + list(range(0, 11)), + 'formal_charge': + list(range(-5, 7)), + 'num_hs': + list(range(0, 9)), + 'num_radical_electrons': + list(range(0, 5)), + 'hybridization': [ + 'UNSPECIFIED', + 'S', + 'SP', + 'SP2', + 'SP3', + 'SP3D', + 'SP3D2', + 'OTHER', + ], + 'is_aromatic': [False, True], + 'is_in_ring': [False, True], +} + +e_map: Dict[str, List[Any]] = { + 'bond_type': [ + 'UNSPECIFIED', + 'SINGLE', + 'DOUBLE', + 'TRIPLE', + 'QUADRUPLE', + 'QUINTUPLE', + 'HEXTUPLE', + 'ONEANDAHALF', + 'TWOANDAHALF', + 'THREEANDAHALF', + 'FOURANDAHALF', + 'FIVEANDAHALF', + 'AROMATIC', + 'IONIC', + 'HYDROGEN', + 'THREECENTER', + 'DATIVEONE', + 'DATIVE', + 'DATIVEL', + 'DATIVER', + 'OTHER', + 'ZERO', + ], + 'stereo': [ + 'STEREONONE', + 'STEREOANY', + 'STEREOZ', + 'STEREOE', + 'STEREOCIS', + 'STEREOTRANS', + ], + 'is_conjugated': [False, True], +} + + +def from_rdmol(mol: Any) -> 'paddle_geometric.data.Data': + r"""Converts a :class:`rdkit.Chem.Mol` instance to a + :class:`paddle_geometric.data.Data` instance. + + Args: + mol (rdkit.Chem.Mol): The :class:`rdkit` molecule. + """ + from rdkit import Chem + + from paddle_geometric.data import Data + + assert isinstance(mol, Chem.Mol) + + xs: List[List[int]] = [] + for atom in mol.GetAtoms(): # type: ignore + row: List[int] = [] + row.append(x_map['atomic_num'].index(atom.GetAtomicNum())) + row.append(x_map['chirality'].index(str(atom.GetChiralTag()))) + row.append(x_map['degree'].index(atom.GetTotalDegree())) + row.append(x_map['formal_charge'].index(atom.GetFormalCharge())) + row.append(x_map['num_hs'].index(atom.GetTotalNumHs())) + row.append(x_map['num_radical_electrons'].index( + atom.GetNumRadicalElectrons())) + row.append(x_map['hybridization'].index(str(atom.GetHybridization()))) + row.append(x_map['is_aromatic'].index(atom.GetIsAromatic())) + row.append(x_map['is_in_ring'].index(atom.IsInRing())) + xs.append(row) + + x = paddle.to_tensor(xs, dtype='int64').reshape([-1, 9]) + + edge_indices, edge_attrs = [], [] + for bond in mol.GetBonds(): # type: ignore + i = bond.GetBeginAtomIdx() + j = bond.GetEndAtomIdx() + + e = [] + e.append(e_map['bond_type'].index(str(bond.GetBondType()))) + e.append(e_map['stereo'].index(str(bond.GetStereo()))) + e.append(e_map['is_conjugated'].index(bond.GetIsConjugated())) + + edge_indices += [[i, j], [j, i]] + edge_attrs += [e, e] + + edge_index = paddle.to_tensor(edge_indices, dtype='int64').t().reshape([2, -1]) + edge_attr = paddle.to_tensor(edge_attrs, dtype='int64').reshape([-1, 3]) + + if edge_index.numel() > 0: # Sort indices. + perm = paddle.argsort(edge_index[0] * x.shape[0] + edge_index[1]) + edge_index, edge_attr = edge_index[:, perm], edge_attr[perm] + + return Data(x=x, edge_index=edge_index, edge_attr=edge_attr) + + +def from_smiles( + smiles: str, + with_hydrogen: bool = False, + kekulize: bool = False, +) -> 'paddle_geometric.data.Data': + r"""Converts a SMILES string to a :class:`paddle_geometric.data.Data` + instance. + + Args: + smiles (str): The SMILES string. + with_hydrogen (bool, optional): If set to :obj:`True`, will store + hydrogens in the molecule graph. (default: :obj:`False`) + kekulize (bool, optional): If set to :obj:`True`, converts aromatic + bonds to single/double bonds. (default: :obj:`False`) + """ + from rdkit import Chem, RDLogger + + RDLogger.DisableLog('rdApp.*') # type: ignore + + mol = Chem.MolFromSmiles(smiles) + + if mol is None: + mol = Chem.MolFromSmiles('') + if with_hydrogen: + mol = Chem.AddHs(mol) + if kekulize: + Chem.Kekulize(mol) + + data = from_rdmol(mol) + data.smiles = smiles + return data + + +def to_rdmol( + data: 'paddle_geometric.data.Data', + kekulize: bool = False, +) -> Any: + """Converts a :class:`paddle_geometric.data.Data` instance to a + :class:`rdkit.Chem.Mol` instance. + + Args: + data (paddle_geometric.data.Data): The molecular graph data. + kekulize (bool, optional): If set to :obj:`True`, converts aromatic + bonds to single/double bonds. (default: :obj:`False`) + """ + from rdkit import Chem + + mol = Chem.RWMol() + + assert data.x is not None + assert data.num_nodes is not None + assert data.edge_index is not None + assert data.edge_attr is not None + for i in range(data.num_nodes): + atom = Chem.Atom(int(data.x[i, 0])) + atom.SetChiralTag(Chem.rdchem.ChiralType.values[int(data.x[i, 1])]) + atom.SetFormalCharge(x_map['formal_charge'][int(data.x[i, 3])]) + atom.SetNumExplicitHs(x_map['num_hs'][int(data.x[i, 4])]) + atom.SetNumRadicalElectrons(x_map['num_radical_electrons'][int( + data.x[i, 5])]) + atom.SetHybridization(Chem.rdchem.HybridizationType.values[int( + data.x[i, 6])]) + atom.SetIsAromatic(bool(data.x[i, 7])) + mol.AddAtom(atom) + + edges = [tuple(i) for i in data.edge_index.t().tolist()] + visited = set() + + for i in range(len(edges)): + src, dst = edges[i] + if tuple(sorted(edges[i])) in visited: + continue + + bond_type = Chem.BondType.values[int(data.edge_attr[i, 0])] + mol.AddBond(src, dst, bond_type) + + # Set stereochemistry: + stereo = Chem.rdchem.BondStereo.values[int(data.edge_attr[i, 1])] + if stereo != Chem.rdchem.BondStereo.STEREONONE: + db = mol.GetBondBetweenAtoms(src, dst) + db.SetStereoAtoms(dst, src) + db.SetStereo(stereo) + + # Set conjugation: + is_conjugated = bool(data.edge_attr[i, 2]) + mol.GetBondBetweenAtoms(src, dst).SetIsConjugated(is_conjugated) + + visited.add(tuple(sorted(edges[i]))) + + mol = mol.GetMol() + + if kekulize: + Chem.Kekulize(mol) + + Chem.SanitizeMol(mol) + Chem.AssignStereochemistry(mol) + + return mol + + +def to_smiles( + data: 'paddle_geometric.data.Data', + kekulize: bool = False, +) -> str: + """Converts a :class:`paddle_geometric.data.Data` instance to a SMILES + string. + + Args: + data (paddle_geometric.data.Data): The molecular graph. + kekulize (bool, optional): If set to :obj:`True`, converts aromatic + bonds to single/double bonds. (default: :obj:`False`) + """ + from rdkit import Chem + mol = to_rdmol(data, kekulize=kekulize) + return Chem.MolToSmiles(mol, isomericSmiles=True) diff --git a/jointContribution/mattergen/paddle_geometric/utils/sparse.py b/jointContribution/mattergen/paddle_geometric/utils/sparse.py new file mode 100644 index 00000000..4cf71b80 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/sparse.py @@ -0,0 +1,611 @@ +import typing +import warnings +from typing import Any, List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +import paddle_geometric.typing +from paddle_geometric.index import index2ptr, ptr2index +from paddle_geometric.typing import SparseTensor +from paddle_geometric.utils import coalesce, cumsum + + +def dense_to_sparse( + adj: Tensor, + mask: Optional[Tensor] = None, +) -> Tuple[Tensor, Tensor]: + r"""Converts a dense adjacency matrix to a sparse adjacency matrix defined + by edge indices and edge attributes. + + Args: + adj (paddle.Tensor): The dense adjacency matrix of shape + :obj:`[num_nodes, num_nodes]` or + :obj:`[batch_size, num_nodes, num_nodes]`. + mask (paddle.Tensor, optional): A boolean tensor of shape + :obj:`[batch_size, num_nodes]` holding information about which + nodes are in each example are valid. (default: :obj:`None`) + + :rtype: (:class:`LongTensor`, :class:`Tensor`) + + Examples: + >>> # For a single adjacency matrix: + >>> adj = paddle.tensor([[3, 1], + ... [2, 0]]) + >>> dense_to_sparse(adj) + (tensor([[0, 0, 1], + [0, 1, 0]]), + tensor([3, 1, 2])) + + >>> # For two adjacency matrixes: + >>> adj = paddle.tensor([[[3, 1], + ... [2, 0]], + ... [[0, 1], + ... [0, 2]]]) + >>> dense_to_sparse(adj) + (tensor([[0, 0, 1, 2, 3], + [0, 1, 0, 3, 3]]), + tensor([3, 1, 2, 1, 2])) + + >>> # First graph with two nodes, second with three: + >>> adj = paddle.tensor([[ + ... [3, 1, 0], + ... [2, 0, 0], + ... [0, 0, 0] + ... ], [ + ... [0, 1, 0], + ... [0, 2, 3], + ... [0, 5, 0] + ... ]]) + >>> mask = paddle.tensor([ + ... [True, True, False], + ... [True, True, True] + ... ]) + >>> dense_to_sparse(adj, mask) + (tensor([[0, 0, 1, 2, 3, 3, 4], + [0, 1, 0, 3, 3, 4, 3]]), + tensor([3, 1, 2, 1, 2, 3, 5])) + """ + if adj.dim() < 2 or adj.dim() > 3: + raise ValueError(f"Dense adjacency matrix 'adj' must be two- or " + f"three-dimensional (got {adj.dim()} dimensions)") + + if mask is not None and adj.dim() == 2: + warnings.warn("Mask should not be provided in case the dense " + "adjacency matrix is two-dimensional") + mask = None + + if mask is not None and mask.dim() != 2: + raise ValueError(f"Mask must be two-dimensional " + f"(got {mask.dim()} dimensions)") + + if mask is not None and adj.size(-2) != adj.size(-1): + raise ValueError(f"Mask is only supported on quadratic adjacency " + f"matrices (got [*, {adj.size(-2)}, {adj.size(-1)}])") + + if adj.dim() == 2: + edge_index = adj.nonzero().t() + edge_attr = adj[edge_index[0], edge_index[1]] + return edge_index, edge_attr + else: + flatten_adj = adj.view(-1, adj.size(-1)) + if mask is not None: + flatten_adj = flatten_adj[mask.view(-1)] + edge_index = flatten_adj.nonzero().t() + edge_attr = flatten_adj[edge_index[0], edge_index[1]] + + if mask is None: + offset = paddle.arange( + start=0, + end=adj.size(0) * adj.size(2), + step=adj.size(2), + device=adj.device, + ) + offset = offset.repeat_interleave(adj.size(1)) + else: + count = mask.sum(dim=-1) + offset = cumsum(count)[:-1] + offset = offset.repeat_interleave(count) + + edge_index[1] += offset[edge_index[0]] + + return edge_index, edge_attr + + +def is_paddle_sparse_tensor(src: Any) -> bool: + r"""Returns :obj:`True` if the input :obj:`src` is a + :class:`paddle.sparse.Tensor` (in any sparse layout). + + Args: + src (Any): The input object to be checked. + """ + if isinstance(src, Tensor): + if src.layout == NotImplementedError("paddle.sparse_coo is not implemented in Paddle."): + return True + if src.layout == NotImplementedError("paddle.sparse_csr is not implemented in Paddle."): + return True + return False + + +def is_sparse(src: Any) -> bool: + r"""Returns :obj:`True` if the input :obj:`src` is of type + :class:`paddle.sparse.Tensor` (in any sparse layout) or of type + :class:`paddle_sparse.SparseTensor`. + + Args: + src (Any): The input object to be checked. + """ + return is_paddle_sparse_tensor(src) or isinstance(src, SparseTensor) + + +def to_paddle_coo_tensor( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Union[int, Tuple[Optional[int], Optional[int]]]] = None, + is_coalesced: bool = False, +) -> Tensor: + r"""Converts a sparse adjacency matrix defined by edge indices and edge + attributes to a :class:`paddle.sparse.Tensor` with layout + `NotImplementedError("paddle.sparse_coo is not implemented in Paddle.")`. + See :meth:`~paddle_geometric.utils.to_edge_index` for the reverse operation. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): The edge attributes. + (default: :obj:`None`) + size (int or (int, int), optional): The size of the sparse matrix. + If given as an integer, will create a quadratic sparse matrix. + If set to :obj:`None`, will infer a quadratic sparse matrix based + on :obj:`edge_index.max() + 1`. (default: :obj:`None`) + is_coalesced (bool): If set to :obj:`True`, will assume that + :obj:`edge_index` is already coalesced and thus avoids expensive + computation. (default: :obj:`False`) + + :rtype: :class:`paddle.sparse.Tensor` + + Example: + >>> edge_index = paddle.tensor([[0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2]]) + >>> to_paddle_coo_tensor(edge_index) + tensor(indices=tensor([[0, 1, 1, 2, 2, 3], + [1, 0, 2, 1, 3, 2]]), + values=tensor([1., 1., 1., 1., 1., 1.]), + size=(4, 4), nnz=6, layout=NotImplementedError("paddle.sparse_coo is not implemented in Paddle.")) + + """ + if size is None: + size = int(edge_index.max()) + 1 + + if isinstance(size, (tuple, list)): + num_src_nodes, num_dst_nodes = size + if num_src_nodes is None: + num_src_nodes = int(edge_index[0].max()) + 1 + if num_dst_nodes is None: + num_dst_nodes = int(edge_index[1].max()) + 1 + size = (num_src_nodes, num_dst_nodes) + else: + size = (size, size) + + if not is_coalesced: + edge_index, edge_attr = coalesce(edge_index, edge_attr, max(size)) + + if edge_attr is None: + # Expanded tensors are not yet supported in all Pypaddle code paths :( + # edge_attr = paddle.ones(1, device=edge_index.device) + # edge_attr = edge_attr.expand(edge_index.size(1)) + edge_attr = paddle.ones(edge_index.size(1), device=edge_index.device) + + + return NotImplementedError("paddle.sparse_coo is not implemented in Paddle.") + + +def to_paddle_csr_tensor( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Union[int, Tuple[Optional[int], Optional[int]]]] = None, + is_coalesced: bool = False, +) -> Tensor: + r"""Converts a sparse adjacency matrix defined by edge indices and edge + attributes to a :class:`paddle.sparse.Tensor` with layout + `NotImplementedError("paddle.sparse_csr is not implemented in Paddle.")`. + See :meth:`~paddle_geometric.utils.to_edge_index` for the reverse operation. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): The edge attributes. + (default: :obj:`None`) + size (int or (int, int), optional): The size of the sparse matrix. + If given as an integer, will create a quadratic sparse matrix. + If set to :obj:`None`, will infer a quadratic sparse matrix based + on :obj:`edge_index.max() + 1`. (default: :obj:`None`) + is_coalesced (bool): If set to :obj:`True`, will assume that + :obj:`edge_index` is already coalesced and thus avoids expensive + computation. (default: :obj:`False`) + + :rtype: :class:`paddle.sparse.Tensor` + + Example: + >>> edge_index = paddle.tensor([[0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2]]) + >>> to_paddle_csr_tensor(edge_index) + tensor(crow_indices=tensor([0, 1, 3, 5, 6]), + col_indices=tensor([1, 0, 2, 1, 3, 2]), + values=tensor([1., 1., 1., 1., 1., 1.]), + size=(4, 4), nnz=6, layout=NotImplementedError("paddle.sparse_csr is not implemented in Paddle.")) + + """ + if size is None: + size = int(edge_index.max()) + 1 + + if isinstance(size, (tuple, list)): + num_src_nodes, num_dst_nodes = size + if num_src_nodes is None: + num_src_nodes = int(edge_index[0].max()) + 1 + if num_dst_nodes is None: + num_dst_nodes = int(edge_index[1].max()) + 1 + size = (num_src_nodes, num_dst_nodes) + else: + size = (size, size) + + if not is_coalesced: + edge_index, edge_attr = coalesce(edge_index, edge_attr, max(size)) + + if edge_attr is None: + # Expanded tensors are not yet supported in all Pypaddle code paths :( + # edge_attr = paddle.ones(1, device=edge_index.device) + # edge_attr = edge_attr.expand(edge_index.size(1)) + edge_attr = paddle.ones(edge_index.size(1), device=edge_index.device) + + adj = NotImplementedError("paddle.sparse_csr is not implemented in Paddle.") + + return adj + + +def to_paddle_csc_tensor( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Union[int, Tuple[Optional[int], Optional[int]]]] = None, + is_coalesced: bool = False, +) -> Tensor: + r"""Converts a sparse adjacency matrix defined by edge indices and edge + attributes to a :class:`paddle.sparse.Tensor` with layout + `paddle.sparse_csc`. + See :meth:`~paddle_geometric.utils.to_edge_index` for the reverse operation. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): The edge attributes. + (default: :obj:`None`) + size (int or (int, int), optional): The size of the sparse matrix. + If given as an integer, will create a quadratic sparse matrix. + If set to :obj:`None`, will infer a quadratic sparse matrix based + on :obj:`edge_index.max() + 1`. (default: :obj:`None`) + is_coalesced (bool): If set to :obj:`True`, will assume that + :obj:`edge_index` is already coalesced and thus avoids expensive + computation. (default: :obj:`False`) + + :rtype: :class:`paddle.sparse.Tensor` + + Example: + >>> edge_index = paddle.tensor([[0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2]]) + >>> to_paddle_csc_tensor(edge_index) + tensor(ccol_indices=tensor([0, 1, 3, 5, 6]), + row_indices=tensor([1, 0, 2, 1, 3, 2]), + values=tensor([1., 1., 1., 1., 1., 1.]), + size=(4, 4), nnz=6, layout=paddle.sparse_csc) + + """ + if size is None: + size = int(edge_index.max()) + 1 + + if isinstance(size, (tuple, list)): + num_src_nodes, num_dst_nodes = size + if num_src_nodes is None: + num_src_nodes = int(edge_index[0].max()) + 1 + if num_dst_nodes is None: + num_dst_nodes = int(edge_index[1].max()) + 1 + size = (num_src_nodes, num_dst_nodes) + else: + size = (size, size) + + if not is_coalesced: + edge_index, edge_attr = coalesce(edge_index, edge_attr, max(size), + sort_by_row=False) + + if edge_attr is None: + # Expanded tensors are not yet supported in all Pypaddle code paths :( + # edge_attr = paddle.ones(1, device=edge_index.device) + # edge_attr = edge_attr.expand(edge_index.size(1)) + edge_attr = paddle.ones(edge_index.size(1), device=edge_index.device) + + adj = paddle.sparse_csc_tensor( + ccol_indices=index2ptr(edge_index[1], size[1]), + row_indices=edge_index[0], + values=edge_attr, + size=tuple(size) + edge_attr.size()[1:], + device=edge_index.device, + ) + + return adj + + +def to_paddle_sparse_tensor( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + size: Optional[Union[int, Tuple[Optional[int], Optional[int]]]] = None, + is_coalesced: bool = False, + layout: NotImplementedError() = NotImplementedError("paddle.sparse_coo is not implemented in Paddle."), +) -> Tensor: + r"""Converts a sparse adjacency matrix defined by edge indices and edge + attributes to a :class:`paddle.sparse.Tensor` with custom :obj:`layout`. + See :meth:`~paddle_geometric.utils.to_edge_index` for the reverse operation. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor, optional): The edge attributes. + (default: :obj:`None`) + size (int or (int, int), optional): The size of the sparse matrix. + If given as an integer, will create a quadratic sparse matrix. + If set to :obj:`None`, will infer a quadratic sparse matrix based + on :obj:`edge_index.max() + 1`. (default: :obj:`None`) + is_coalesced (bool): If set to :obj:`True`, will assume that + :obj:`edge_index` is already coalesced and thus avoids expensive + computation. (default: :obj:`False`) + layout (paddle.layout, optional): The layout of the output sparse tensor + (:obj:`NotImplementedError("paddle.sparse_coo is not implemented in Paddle.")`, :obj:`NotImplementedError("paddle.sparse_csr is not implemented in Paddle.")`, + :obj:`paddle.sparse_csc`). (default: :obj:`NotImplementedError("paddle.sparse_coo is not implemented in Paddle.")`) + + :rtype: :class:`paddle.sparse.Tensor` + """ + if layout == NotImplementedError("paddle.sparse_coo is not implemented in Paddle."): + return to_paddle_coo_tensor(edge_index, edge_attr, size, is_coalesced) + if layout == NotImplementedError("paddle.sparse_csr is not implemented in Paddle."): + return to_paddle_csr_tensor(edge_index, edge_attr, size, is_coalesced) + + raise ValueError(f"Unexpected sparse tensor layout (got '{layout}')") + + +def to_edge_index(adj: Union[Tensor, SparseTensor]) -> Tuple[Tensor, Tensor]: + r"""Converts a :class:`paddle.sparse.Tensor` or a + :class:`paddle_sparse.SparseTensor` to edge indices and edge attributes. + + Args: + adj (paddle.sparse.Tensor or SparseTensor): The adjacency matrix. + + :rtype: (:class:`paddle.Tensor`, :class:`paddle.Tensor`) + + Example: + >>> edge_index = paddle.tensor([[0, 1, 1, 2, 2, 3], + ... [1, 0, 2, 1, 3, 2]]) + >>> adj = to_paddle_coo_tensor(edge_index) + >>> to_edge_index(adj) + (tensor([[0, 1, 1, 2, 2, 3], + [1, 0, 2, 1, 3, 2]]), + tensor([1., 1., 1., 1., 1., 1.])) + """ + if isinstance(adj, SparseTensor): + row, col, value = adj.coo() + if value is None: + value = paddle.ones(row.size(0), device=row.device) + return paddle.stack([row, col], dim=0).long(), value + + if adj.layout == NotImplementedError("paddle.sparse_coo is not implemented in Paddle."): + adj = adj._coalesced_(True) + return adj.indices().detach().long(), adj.values() + + if adj.layout == NotImplementedError("paddle.sparse_csr is not implemented in Paddle."): + row = ptr2index(adj.crow_indices().detach()) + col = adj.col_indices().detach() + return paddle.stack([row, col], dim=0).long(), adj.values() + + + raise ValueError(f"Unexpected sparse tensor layout (got '{adj.layout}')") + + +# Helper functions ############################################################ + + +def get_sparse_diag( + size: int, + fill_value: float = 1.0, + layout: Optional[int] = None, + dtype: Optional[paddle.dtype] = None, + device: Optional[str] = None, +) -> Tensor: + return paddle.sparse.spdiags( + paddle.full((1, size), fill_value, dtype=dtype, device=device), + offsets=paddle.zeros(1, dtype=paddle.long, device=device), + shape=(size, size), + layout=layout, + ) + + +def set_sparse_value(adj: Tensor, value: Tensor) -> Tensor: + if value.dim() > 1: + size = adj.size() + value.size()[1:] + else: + size = adj.size() + + if adj.layout == NotImplementedError("paddle.sparse_coo is not implemented in Paddle."): + return NotImplementedError + + if adj.layout == NotImplementedError("NotImplementedError paddle.sparse_csr is not implemented in Paddle."): + + return NotImplementedError("paddle.sparse_csr is not implemented in Paddle.") + + + raise ValueError(f"Unexpected sparse tensor layout (got '{adj.layout}')") + + +def cat_coo(tensors: List[Tensor], dim: Union[int, Tuple[int, int]]) -> Tensor: + assert dim in {0, 1, (0, 1)} + assert tensors[0].layout == NotImplementedError("paddle.sparse_coo is not implemented in Paddle.") + + indices, values = [], [] + num_rows = num_cols = 0 + is_coalesced = True + + if dim == 0: + for i, tensor in enumerate(tensors): + if i == 0: + indices.append(tensor._indices()) + else: + offset = paddle.tensor([[num_rows], [0]], device=tensor.device) + indices.append(tensor._indices() + offset) + values.append(tensor._values()) + num_rows += tensor.size(0) + num_cols = max(num_cols, tensor.size(1)) + if not tensor.is_coalesced(): + is_coalesced = False + + elif dim == 1: + for i, tensor in enumerate(tensors): + if i == 0: + indices.append(tensor._indices()) + else: + offset = paddle.tensor([[0], [num_cols]], device=tensor.device) + indices.append(tensor.indices() + offset) + values.append(tensor._values()) + num_rows = max(num_rows, tensor.size(0)) + num_cols += tensor.size(1) + is_coalesced = False + + else: + for i, tensor in enumerate(tensors): + if i == 0: + indices.append(tensor._indices()) + else: + offset = paddle.tensor([[num_rows], [num_cols]], + device=tensor.device) + indices.append(tensor._indices() + offset) + values.append(tensor._values()) + num_rows += tensor.size(0) + num_cols += tensor.size(1) + if not tensor.is_coalesced(): + is_coalesced = False + + + return NotImplementedError("paddle.sparse_coo is not implemented in Paddle.") + + +def cat_csr(tensors: List[Tensor], dim: Union[int, Tuple[int, int]]) -> Tensor: + assert dim in {0, 1, (0, 1)} + assert tensors[0].layout == NotImplementedError("paddle.sparse_csr is not implemented in Paddle.") + + rows, cols, values = [], [], [] + num_rows = num_cols = nnz = 0 + + if dim == 0: + for i, tensor in enumerate(tensors): + if i == 0: + rows.append(tensor.crow_indices()) + else: + rows.append(tensor.crow_indices()[1:] + nnz) + cols.append(tensor.col_indices()) + values.append(tensor.values()) + num_rows += tensor.size(0) + num_cols = max(num_cols, tensor.size(1)) + nnz += cols[-1].numel() + + return NotImplementedError("paddle.sparse_csr is not implemented in Paddle.") + + elif dim == 1: + for i, tensor in enumerate(tensors): + rows.append(ptr2index(tensor.crow_indices())) + if i == 0: + cols.append(tensor.col_indices()) + else: + cols.append(tensor.col_indices() + num_cols) + values.append(tensor.values()) + num_rows = max(num_rows, tensor.size(0)) + num_cols += tensor.size(1) + + return NotImplementedError("paddle.sparse_coo is not implemented in Paddle.") + + else: + for i, tensor in enumerate(tensors): + if i == 0: + rows.append(tensor.crow_indices()) + cols.append(tensor.col_indices()) + else: + rows.append(tensor.crow_indices()[1:] + nnz) + cols.append(tensor.col_indices() + num_cols) + values.append(tensor.values()) + num_rows += tensor.size(0) + num_cols += tensor.size(1) + nnz += cols[-1].numel() + + return NotImplementedError("paddle.sparse_csr is not implemented in Paddle.") + +def cat_csc(tensors: List[Tensor], dim: Union[int, Tuple[int, int]]) -> Tensor: + assert dim in {0, 1, (0, 1)} + assert tensors[0].layout == paddle.sparse_csc + + rows, cols, values = [], [], [] + num_rows = num_cols = nnz = 0 + + if dim == 0: + for i, tensor in enumerate(tensors): + cols.append(ptr2index(tensor.ccol_indices())) + if i == 0: + rows.append(tensor.row_indices()) + else: + rows.append(tensor.row_indices() + num_rows) + values.append(tensor.values()) + num_rows += tensor.size(0) + num_cols = max(num_cols, tensor.size(1)) + + return NotImplementedError("paddle.sparse_coo is not implemented in Paddle.") + + elif dim == 1: + for i, tensor in enumerate(tensors): + if i == 0: + cols.append(tensor.ccol_indices()) + else: + cols.append(tensor.ccol_indices()[1:] + nnz) + rows.append(tensor.row_indices()) + values.append(tensor.values()) + num_rows = max(num_rows, tensor.size(0)) + num_cols += tensor.size(1) + nnz += rows[-1].numel() + + return paddle.sparse_csc_tensor( + row_indices=paddle.concat(rows), + ccol_indices=paddle.concat(cols), + values=paddle.concat(values), + size=(num_rows, num_cols) + values[-1].size()[1:], + device=tensor.device, + ) + + else: + for i, tensor in enumerate(tensors): + if i == 0: + rows.append(tensor.row_indices()) + cols.append(tensor.ccol_indices()) + else: + rows.append(tensor.row_indices() + num_rows) + cols.append(tensor.ccol_indices()[1:] + nnz) + values.append(tensor.values()) + num_rows += tensor.size(0) + num_cols += tensor.size(1) + nnz += rows[-1].numel() + + return paddle.sparse_csc_tensor( + row_indices=paddle.concat(rows), + ccol_indices=paddle.concat(cols), + values=paddle.concat(values), + size=(num_rows, num_cols) + values[-1].size()[1:], + device=tensor.device, + ) + + +def cat(tensors: List[Tensor], dim: Union[int, Tuple[int, int]]) -> Tensor: + assert is_paddle_sparse_tensor(tensors[0]) + + if tensors[0].layout == NotImplementedError("paddle.sparse_coo is not implemented in Paddle."): + return cat_coo(tensors, dim) + elif tensors[0].layout == NotImplementedError("paddle.sparse_csr is not implemented in Paddle."): + return cat_csr(tensors, dim) + else: + return cat_csc(tensors, dim) diff --git a/jointContribution/mattergen/paddle_geometric/utils/undirected.py b/jointContribution/mattergen/paddle_geometric/utils/undirected.py new file mode 100644 index 00000000..bd8fa948 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/utils/undirected.py @@ -0,0 +1,206 @@ +import typing +from typing import List, Optional, Tuple, Union + +import paddle +from paddle import Tensor + +from paddle_geometric.typing import OptTensor +from paddle_geometric.utils import coalesce, sort_edge_index +from paddle_geometric.utils.num_nodes import maybe_num_nodes + +from typing import overload + +MISSING = '???' + + +@overload +def is_undirected( + edge_index: Tensor, + edge_attr: Optional[Tensor] = None, + num_nodes: Optional[int] = None, +) -> bool: + pass + + +@overload +def is_undirected( # noqa: F811 + edge_index: Tensor, + edge_attr: List[Tensor], + num_nodes: Optional[int] = None, +) -> bool: + pass + + +def is_undirected( # noqa: F811 + edge_index: Tensor, + edge_attr: Union[Optional[Tensor], List[Tensor]] = None, + num_nodes: Optional[int] = None, +) -> bool: + r"""Returns :obj:`True` if the graph given by :attr:`edge_index` is + undirected. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor or List[Tensor], optional): Edge weights or multi- + dimensional edge features. + If given as a list, will check for equivalence in all its entries. + (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max(edge_index) + 1`. (default: :obj:`None`) + + :rtype: bool + + Examples: + >>> edge_index = torch.tensor([[0, 1, 0], + ... [1, 0, 0]]) + >>> weight = torch.tensor([0, 0, 1]) + >>> is_undirected(edge_index, weight) + True + + >>> weight = torch.tensor([0, 1, 1]) + >>> is_undirected(edge_index, weight) + False + + """ + num_nodes = maybe_num_nodes(edge_index, num_nodes) + + edge_attrs: List[Tensor] = [] + if isinstance(edge_attr, Tensor): + edge_attrs.append(edge_attr) + elif isinstance(edge_attr, (list, tuple)): + edge_attrs = edge_attr + + edge_index1, edge_attrs1 = sort_edge_index( + edge_index, + edge_attrs, + num_nodes=num_nodes, + sort_by_row=True, + ) + edge_index2, edge_attrs2 = sort_edge_index( + edge_index, + edge_attrs, + num_nodes=num_nodes, + sort_by_row=False, + ) + + if not paddle.all(paddle.equal(edge_index1[0], edge_index2[1])): + return False + + if not paddle.all(paddle.equal(edge_index1[1], edge_index2[0])): + return False + + assert isinstance(edge_attrs1, list) and isinstance(edge_attrs2, list) + for edge_attr1, edge_attr2 in zip(edge_attrs1, edge_attrs2): + if not paddle.all(paddle.equal(edge_attr1, edge_attr2)): + return False + + return True + + +@overload +def to_undirected( + edge_index: Tensor, + edge_attr: str = MISSING, + num_nodes: Optional[int] = None, + reduce: str = 'add', +) -> Tensor: + pass + + +@overload +def to_undirected( # noqa: F811 + edge_index: Tensor, + edge_attr: Tensor, + num_nodes: Optional[int] = None, + reduce: str = 'add', +) -> Tuple[Tensor, Tensor]: + pass + + +@overload +def to_undirected( # noqa: F811 + edge_index: Tensor, + edge_attr: Optional[Tensor], + num_nodes: Optional[int] = None, + reduce: str = 'add', +) -> Tuple[Tensor, Optional[Tensor]]: + pass + + +@overload +def to_undirected( # noqa: F811 + edge_index: Tensor, + edge_attr: List[Tensor], + num_nodes: Optional[int] = None, + reduce: str = 'add', +) -> Tuple[Tensor, List[Tensor]]: + pass + + +def to_undirected( # noqa: F811 + edge_index: Tensor, + edge_attr: Union[Optional[Tensor], List[Tensor], str] = MISSING, + num_nodes: Optional[int] = None, + reduce: str = 'add', +) -> Union[Tensor, Tuple[Tensor, OptTensor], Tuple[Tensor, List[Tensor]]]: + r"""Converts the graph given by :attr:`edge_index` to an undirected graph + such that :math:`(j,i) \in \mathcal{E}` for every edge :math:`(i,j) \in + \mathcal{E}`. + + Args: + edge_index (LongTensor): The edge indices. + edge_attr (Tensor or List[Tensor], optional): Edge weights or multi- + dimensional edge features. + If given as a list, will remove duplicates for all its entries. + (default: :obj:`None`) + num_nodes (int, optional): The number of nodes, *i.e.* + :obj:`max(edge_index) + 1`. (default: :obj:`None`) + reduce (str, optional): The reduce operation to use for merging edge + features (:obj:`"add"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`, + :obj:`"mul"`). (default: :obj:`"add"`) + + :rtype: :class:`LongTensor` if :attr:`edge_attr` is not passed, else + (:class:`LongTensor`, :obj:`Optional[Tensor]` or :obj:`List[Tensor]]`) + + .. warning:: + + From :pyg:`PyG >= 2.3.0` onwards, this function will always return a + tuple whenever :obj:`edge_attr` is passed as an argument (even in case + it is set to :obj:`None`). + + Examples: + >>> edge_index = torch.tensor([[0, 1, 1], + ... [1, 0, 2]]) + >>> to_undirected(edge_index) + tensor([[0, 1, 1, 2], + [1, 0, 2, 1]]) + + >>> edge_index = torch.tensor([[0, 1, 1], + ... [1, 0, 2]]) + >>> edge_weight = torch.tensor([1., 1., 1.]) + >>> to_undirected(edge_index, edge_weight) + (tensor([[0, 1, 1, 2], + [1, 0, 2, 1]]), + tensor([2., 2., 1., 1.])) + + >>> # Use 'mean' operation to merge edge features + >>> to_undirected(edge_index, edge_weight, reduce='mean') + (tensor([[0, 1, 1, 2], + [1, 0, 2, 1]]), + tensor([1., 1., 1., 1.])) + """ + # Maintain backward compatibility to `to_undirected(edge_index, num_nodes)` + if isinstance(edge_attr, int): + num_nodes = edge_attr + edge_attr = MISSING + + row, col = edge_index[0], edge_index[1] + row, col = paddle.concat([row, col], axis=0), paddle.concat([col, row], axis=0) + edge_index = paddle.stack([row, col], axis=0) + + if isinstance(edge_attr, paddle.Tensor): + edge_attr = paddle.concat([edge_attr, edge_attr], axis=0) + elif isinstance(edge_attr, (list, tuple)): + edge_attr = [paddle.concat([e, e], axis=0) for e in edge_attr] + + return coalesce(edge_index, edge_attr, num_nodes, reduce) diff --git a/jointContribution/mattergen/paddle_geometric/visualization/__init__.py b/jointContribution/mattergen/paddle_geometric/visualization/__init__.py new file mode 100644 index 00000000..7851ae49 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/visualization/__init__.py @@ -0,0 +1,9 @@ +r"""Visualization package.""" + +from .graph import visualize_graph +from .influence import influence + +__all__ = [ + 'visualize_graph', + 'influence', +] diff --git a/jointContribution/mattergen/paddle_geometric/visualization/graph.py b/jointContribution/mattergen/paddle_geometric/visualization/graph.py new file mode 100644 index 00000000..f3d542bf --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/visualization/graph.py @@ -0,0 +1,144 @@ +from math import sqrt +from typing import Any, List, Optional + +import paddle +from paddle import Tensor + +BACKENDS = {'graphviz', 'networkx'} + + +def has_graphviz() -> bool: + try: + import graphviz + except ImportError: + return False + + try: + graphviz.Digraph().pipe() + except graphviz.backend.ExecutableNotFound: + return False + + return True + + +def visualize_graph( + edge_index: Tensor, + edge_weight: Optional[Tensor] = None, + path: Optional[str] = None, + backend: Optional[str] = None, + node_labels: Optional[List[str]] = None, +) -> Any: + """Visualizes the graph given via edge_index and (optional) edge_weight. + + Args: + edge_index (paddle.Tensor): The edge indices. + edge_weight (paddle.Tensor, optional): The edge weights. + path (str, optional): The path to save the plot. + backend (str, optional): The graph drawing backend for visualization. + node_labels (List[str], optional): The labels/IDs of nodes. + """ + if edge_weight is not None: # Normalize edge weights. + edge_weight = edge_weight - edge_weight.min() + edge_weight = edge_weight / edge_weight.max() + + if edge_weight is not None: # Discard any edges with zero edge weight: + mask = edge_weight > 1e-7 + edge_index = edge_index[:, mask] + edge_weight = edge_weight[mask] + + if edge_weight is None: + edge_weight = paddle.ones([edge_index.shape[1]]) + + if backend is None: + backend = 'graphviz' if has_graphviz() else 'networkx' + + if backend.lower() == 'networkx': + return _visualize_graph_via_networkx(edge_index, edge_weight, path, + node_labels) + elif backend.lower() == 'graphviz': + return _visualize_graph_via_graphviz(edge_index, edge_weight, path, + node_labels) + + raise ValueError(f"Expected graph drawing backend to be in " + f"{BACKENDS} (got '{backend}')") + + +def _visualize_graph_via_graphviz( + edge_index: Tensor, + edge_weight: Tensor, + path: Optional[str] = None, + node_labels: Optional[List[str]] = None, +) -> Any: + import graphviz + + suffix = path.split('.')[-1] if path is not None else None + g = graphviz.Digraph('graph', format=suffix) + g.attr('node', shape='circle', fontsize='11pt') + + for node in paddle.unique(edge_index).numpy().tolist(): + g.node(str(node) if node_labels is None else node_labels[node]) + + for (src, dst), w in zip(edge_index.t().numpy().tolist(), edge_weight.numpy().tolist()): + hex_color = hex(255 - round(255 * w))[2:] + hex_color = f'{hex_color}0' if len(hex_color) == 1 else hex_color + if node_labels is not None: + src = node_labels[src] + dst = node_labels[dst] + g.edge(str(src), str(dst), color=f'#{hex_color}{hex_color}{hex_color}') + + if path is not None: + path = '.'.join(path.split('.')[:-1]) + g.render(path, cleanup=True) + else: + g.view() + + return g + + +def _visualize_graph_via_networkx( + edge_index: Tensor, + edge_weight: Tensor, + path: Optional[str] = None, + node_labels: Optional[List[str]] = None, +) -> Any: + import matplotlib.pyplot as plt + import networkx as nx + + g = nx.DiGraph() + node_size = 800 + + for node in paddle.unique(edge_index).numpy().tolist(): + g.add_node(node if node_labels is None else node_labels[node]) + + for (src, dst), w in zip(edge_index.t().numpy().tolist(), edge_weight.numpy().tolist()): + if node_labels is not None: + src = node_labels[src] + dst = node_labels[dst] + g.add_edge(src, dst, alpha=w) + + ax = plt.gca() + pos = nx.spring_layout(g) + for src, dst, data in g.edges(data=True): + ax.annotate( + '', + xy=pos[src], + xytext=pos[dst], + arrowprops=dict( + arrowstyle="->", + alpha=data['alpha'], + shrinkA=sqrt(node_size) / 2.0, + shrinkB=sqrt(node_size) / 2.0, + connectionstyle="arc3,rad=0.1", + ), + ) + + nx.draw_networkx_nodes(g, pos, node_size=node_size, node_color='white', + margins=0.1, edgecolors='black') + nx.draw_networkx_labels(g, pos, font_size=10) + + if path is not None: + plt.savefig(path) + else: + plt.show() + + plt.close() diff --git a/jointContribution/mattergen/paddle_geometric/visualization/influence.py b/jointContribution/mattergen/paddle_geometric/visualization/influence.py new file mode 100644 index 00000000..dae4221f --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/visualization/influence.py @@ -0,0 +1,18 @@ +from typing import Any + +import paddle +from paddle import Tensor +from paddle.autograd import grad + + +def influence(model: paddle.nn.Layer, src: Tensor, *args: Any) -> Tensor: + x = src.clone() + x.stop_gradient = False # Enable gradient tracking + out = model(x, *args).sum(axis=-1) + + influences = [] + for j in range(src.shape[0]): + influence = grad(outputs=[out[j]], inputs=[x], retain_graph=True)[0].abs().sum(axis=-1) + influences.append(influence / influence.sum()) + + return paddle.stack(influences, axis=0) diff --git a/jointContribution/mattergen/paddle_geometric/warnings.py b/jointContribution/mattergen/paddle_geometric/warnings.py new file mode 100644 index 00000000..19e06d08 --- /dev/null +++ b/jointContribution/mattergen/paddle_geometric/warnings.py @@ -0,0 +1,21 @@ +import warnings +from typing import Literal + +import paddle_geometric + + +def warn(message: str) -> None: + if paddle_geometric.is_compiling(): + return + + warnings.warn(message) + + +def filterwarnings( + action: Literal['default', 'error', 'ignore', 'always', 'module', 'once'], + message: str, +) -> None: + if paddle_geometric.is_compiling(): + return + + warnings.filterwarnings(action, message) diff --git a/jointContribution/mattergen/paddle_scatter/__init__.py b/jointContribution/mattergen/paddle_scatter/__init__.py new file mode 100644 index 00000000..8984e40a --- /dev/null +++ b/jointContribution/mattergen/paddle_scatter/__init__.py @@ -0,0 +1,2 @@ +from .scatter_ import scatter +from .scatter_ import scatter_add \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_scatter/scatter_.py b/jointContribution/mattergen/paddle_scatter/scatter_.py new file mode 100644 index 00000000..4a4cf8b8 --- /dev/null +++ b/jointContribution/mattergen/paddle_scatter/scatter_.py @@ -0,0 +1,108 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/rusty1s/pytorch_scatter/blob/master/torch_scatter/scatter.py + +from typing import Optional + +import paddle + + +def _broadcast(src: paddle.Tensor, other: paddle.Tensor, dim: int): + if dim < 0: + dim = other.dim() + dim + if src.dim() == 1: + for _ in range(0, dim): + src = src.unsqueeze(0) + for _ in range(src.dim(), other.dim()): + src = src.unsqueeze(-1) + src = src.expand(other.shape) + return src + + +def _scatter_sum( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +) -> paddle.Tensor: + index = _broadcast(index, src, dim) + if out is None: + size = list(src.shape) + if dim_size is not None: + size[dim] = dim_size + elif index.numel() == 0: + size[dim] = 0 + else: + size[dim] = int(index.max()) + 1 + out = paddle.zeros(size, dtype=src.dtype) + return paddle.put_along_axis( + arr=out, indices=index, values=src, axis=dim, reduce="add" + ) + + +def _scatter_mean( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +) -> paddle.Tensor: + out = _scatter_sum(src, index, dim, out, dim_size) + dim_size = out.shape[dim] + + index_dim = dim + if index_dim < 0: + index_dim = index_dim + src.dim() + if index.dim() <= index_dim: + index_dim = index.dim() - 1 + + ones = paddle.ones(index.shape, dtype=src.dtype) + count = _scatter_sum(ones, index, index_dim, None, dim_size) + count[count < 1] = 1 + count = _broadcast(count, out, dim) + if out.is_floating_point(): + out = paddle.divide(out, count) + else: + out = paddle.floor_divide(out, count) + return out + + +def scatter( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, + reduce: str = "sum", +) -> paddle.Tensor: + """ + Implement paddle version API like torch_scatter.scatter + """ + if reduce == "sum" or reduce == "add": + return _scatter_sum(src, index, dim, out, dim_size) + elif reduce == "mean": + return _scatter_mean(src, index, dim, out, dim_size) + else: + raise ValueError("Only support add or mean") + +def scatter_add( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +) -> paddle.Tensor: + return _scatter_sum(src, index, dim, out, dim_size) \ No newline at end of file diff --git a/jointContribution/mattergen/paddle_utils.py b/jointContribution/mattergen/paddle_utils.py new file mode 100644 index 00000000..7e80b0d7 --- /dev/null +++ b/jointContribution/mattergen/paddle_utils.py @@ -0,0 +1,115 @@ + + +############################## 相关utils函数,如下 ############################## +####################### PaConvert 自动生成的代码,请勿手动修改! ################## +import paddle +def reshape(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) + else: + return paddle.reshape(self, list(args)) + elif kwargs: + assert "shape" in kwargs + return paddle.reshape(self, shape=kwargs["shape"]) + +setattr(paddle.Tensor, "reshape", reshape) + +class Embedding(paddle.nn.Embedding): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.padding_idx = self._padding_idx + +setattr(paddle.nn, 'Embedding', Embedding) + +def max_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.maximum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.max(self, *args, **kwargs), paddle.argmax(self, *args, **kwargs) + else: + ret = paddle.max(self, *args, **kwargs) + + return ret + +setattr(paddle.Tensor, "max", max_class_func) + +def min_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.minimum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.minimum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.min(self, *args, **kwargs), paddle.argmin(self, *args, **kwargs) + else: + ret = paddle.min(self, *args, **kwargs) + + return ret + +setattr(paddle.Tensor, "min", min_class_func) + +def dim2perm(ndim, dim0, dim1): + perm = list(range(ndim)) + perm[dim0], perm[dim1] = perm[dim1], perm[dim0] + return perm + +def view(self, *args, **kwargs): + if args: + if len(args)==1 and isinstance(args[0], (tuple, list, str)): + return paddle.view(self, args[0]) + else: + return paddle.view(self, list(args)) + elif kwargs: + return paddle.view(self, shape_or_dtype = list(kwargs.values())[0]) + +setattr(paddle.Tensor, 'view', view) + +def max(*args, **kwargs): + if "input" in kwargs: + kwargs["x"] = kwargs.pop("input") + + out_v = None + if "out" in kwargs: + out_v = kwargs.pop("out") + + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(*args, **kwargs) + elif len(args)==2 and isinstance(args[1], paddle.Tensor): + ret = paddle.maximum(*args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 2: + if out_v: + ret = paddle.max(*args, **kwargs), paddle.argmax(*args, **kwargs) + paddle.assign(ret[0], out_v[0]) + paddle.assign(ret[1], out_v[1]) + return out_v + else: + ret = paddle.max(*args, **kwargs), paddle.argmax(*args, **kwargs) + return ret + else: + ret = paddle.max(*args, **kwargs) + return ret + + if out_v: + paddle.assign(ret, out_v) + return out_v + else: + return ret +############################## 相关utils函数,如上 ############################## + diff --git a/jointContribution/mattergen/requirements.txt b/jointContribution/mattergen/requirements.txt new file mode 100644 index 00000000..8a8a34a3 --- /dev/null +++ b/jointContribution/mattergen/requirements.txt @@ -0,0 +1,33 @@ +ase==3.24.0 +cachetools==5.5.0 +colorlog==6.8.2 +emmet_core==0.84.5 +fire==0.7.0 +fsspec==2024.12.0 +h5py==3.12.1 +hydra-core==1.3.1 +lmdb==1.6.2 +matplotlib==3.8.4 +monty==2024.7.30 +networkx==3.4.2 +numba==0.60.0 +numpy==1.26.4 +omegaconf==2.3.0 +packaging==24.2 +pandas==2.2.3 +pgl==2.2.3 +Pillow==11.1.0 +psutil==6.1.1 +pymatgen==2024.10.29 +pytest==8.3.4 +rdkit==2024.3.2 +Requests==2.32.3 +scipy==1.15.1 +seaborn==0.13.2 +smact==3.0.2 +sympy==1.13.3 +tabulate==0.9.0 +tqdm==4.67.1 +typing_extensions==4.12.2 +visualdl==2.5.3 +wandb==0.19.4 diff --git a/jointContribution/mattergen/sampling_conf/default.yaml b/jointContribution/mattergen/sampling_conf/default.yaml new file mode 100644 index 00000000..c19b5bfc --- /dev/null +++ b/jointContribution/mattergen/sampling_conf/default.yaml @@ -0,0 +1,40 @@ +sampler_partial: + _target_: mattergen.diffusion.sampling.classifier_free_guidance.GuidedPredictorCorrector.from_pl_module + N: 1000 + eps_t: ${eval:'1/${.N}'} + + _partial_: true + guidance_scale: 0.0 + remove_conditioning_fn: + _target_: mattergen.property_embeddings.SetUnconditionalEmbeddingType + keep_conditioning_fn: + _target_: mattergen.property_embeddings.SetConditionalEmbeddingType + predictor_partials: + pos: + _target_: mattergen.diffusion.wrapped.wrapped_predictors_correctors.WrappedAncestralSamplingPredictor + _partial_: true + cell: + _target_: mattergen.common.diffusion.predictors_correctors.LatticeAncestralSamplingPredictor + _partial_: true + atomic_numbers: + _target_: mattergen.diffusion.d3pm.d3pm_predictors_correctors.D3PMAncestralSamplingPredictor + predict_x0: True + _partial_: true + + corrector_partials: + pos: + _target_: mattergen.diffusion.wrapped.wrapped_predictors_correctors.WrappedLangevinCorrector + _partial_: true + max_step_size: 1e6 + snr: 0.4 + cell: + _target_: mattergen.common.diffusion.predictors_correctors.LatticeLangevinDiffCorrector + _partial_: true + max_step_size: 1e6 + snr: 0.2 + + n_steps_corrector: 1 + +condition_loader_partial: + _partial_: true + _target_: mattergen.common.data.condition_factory.get_number_of_atoms_condition_loader diff --git a/jointContribution/mattergen/scripts/__init__.py b/jointContribution/mattergen/scripts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/jointContribution/mattergen/scripts/add_chemical_system_to_mp20_csv.py b/jointContribution/mattergen/scripts/add_chemical_system_to_mp20_csv.py new file mode 100644 index 00000000..7bce0c45 --- /dev/null +++ b/jointContribution/mattergen/scripts/add_chemical_system_to_mp20_csv.py @@ -0,0 +1,11 @@ +import pandas as pd + +input_file = "datasets/mp_20/train.csv" +save_file = "datasets/mp_20_chemical_system/train.csv" + +df = pd.read_csv(input_file) +# read elements +elements = df['elements'] +df['chemical_system'] = elements.apply(lambda x: '-'.join(eval(x))) +df.to_csv(save_file, index=False) + diff --git a/jointContribution/mattergen/scripts/csv_to_dataset.py b/jointContribution/mattergen/scripts/csv_to_dataset.py new file mode 100644 index 00000000..cc215758 --- /dev/null +++ b/jointContribution/mattergen/scripts/csv_to_dataset.py @@ -0,0 +1,35 @@ +import argparse +import os + +from mattergen.common.data.dataset import CrystalDataset +from mattergen.common.globals import PROJECT_ROOT + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--csv-folder", + type=str, + required=True, + help="Path to the folder containing the csv files. All csv files in the folder will be processed (e.g., 'train.csv', 'val.csv', 'test.csv') and the resulting datasets will be placed under {cache_path/dataset_name/filename_without_extension}, e.g, /path/to/project/dataset/mp_20/train.", + ) + parser.add_argument( + "--dataset-name", + type=str, + required=True, + help="Name of the dataset (e.g. mp_20. Will be used to create a folder in the cache folder)", + ) + parser.add_argument( + "--cache-folder", + type=str, + required=True, + default=f"{PROJECT_ROOT}/datasets", + help="Path to the cache folder. Defaults to datasets folder in the project root.", + ) + args = parser.parse_args() + for file in os.listdir(f"{args.csv_folder}"): + if file.endswith(".csv"): + print(f"Processing {args.csv_folder}/{file}") + CrystalDataset.from_csv( + csv_path=f"{args.csv_folder}/{file}", + cache_path=f"{args.cache_folder}/{args.dataset_name}/{file.split('.')[0]}", + ) diff --git a/jointContribution/mattergen/scripts/evaluate.py b/jointContribution/mattergen/scripts/evaluate.py new file mode 100644 index 00000000..5a9711bd --- /dev/null +++ b/jointContribution/mattergen/scripts/evaluate.py @@ -0,0 +1,70 @@ +import json +from pathlib import Path +from typing import Literal + +import fire +import numpy as np +from mattergen.common.utils.eval_utils import load_structures +from mattergen.evaluation.evaluate import evaluate +from mattergen.evaluation.utils.structure_matcher import ( + DefaultDisorderedStructureMatcher, DefaultOrderedStructureMatcher) + + +def main( + structures_path: str, + relaxed_structures_path: (str | None) = None, + relax: bool = False, + energies_path: (str | None) = None, + structure_matcher: Literal["ordered", "disordered"] = "disordered", + save_as: (str | None) = None, +): + structures = load_structures(Path(structures_path)) + if relaxed_structures_path is not None: + relaxed_structures = load_structures(Path(relaxed_structures_path)) + else: + relaxed_structures = None + energies = np.load(energies_path) if energies_path else None + structure_matcher = ( + DefaultDisorderedStructureMatcher() + if structure_matcher == "disordered" + else DefaultOrderedStructureMatcher() + ) + + reference_ele = { + 'Sc', 'F', 'Pd', 'Ti', 'Nd', 'P', 'Ca', 'Ru', 'Sn', 'Sm', 'As', 'O', 'Be', + 'Au', 'Cd', 'Pt', 'Bi', 'Y', 'Si', 'Se', 'Cu', 'Sb', 'In', 'Br', 'Hf', 'I', + 'Ir', 'La', 'Ba', 'Er', 'Lu', 'W', 'Mo', 'Li', 'Ge', 'Pb', 'Hg', 'Tl', 'Ho', + 'Ta', 'Co', 'Ga', 'Nb', 'Fe', 'Mg', 'B', 'N', 'Cr', 'Sr', 'Rh', 'Yb', 'Ce', + 'Ni', 'Re', 'V', 'Os', 'H', 'Rb', 'Pr', 'Al', 'Eu', 'Cl', 'Gd', 'S', 'Ag', + 'Mn', 'Na', 'K', 'Zn', 'Cs', 'C', 'Te', 'Tb', 'Dy', 'Tm', 'Zr'} + new_structures = [] + index = [] + for i, structure in enumerate(structures): + flag = True + for site in structure: + if site.specie.symbol not in reference_ele: + flag = False + break + if flag: + new_structures.append(structure) + index.append(i) + print(f'{len(structures)} -> {len(new_structures)}') + n_failed_jobs = len(structures) - len(new_structures) + structures = new_structures + if energies is not None: + energies = [energies[i] for i in index] + + metrics = evaluate( + structures=structures, + relaxed_structures=relaxed_structures, + relax=relax, + energies=energies, + structure_matcher=structure_matcher, + save_as=save_as, + n_failed_jobs=n_failed_jobs, + ) + print(json.dumps(metrics, indent=2)) + + +if __name__ == "__main__": + fire.Fire(main) diff --git a/jointContribution/mattergen/scripts/finetune.py b/jointContribution/mattergen/scripts/finetune.py new file mode 100644 index 00000000..c60bbc58 --- /dev/null +++ b/jointContribution/mattergen/scripts/finetune.py @@ -0,0 +1,171 @@ +import json +from collections import OrderedDict +from copy import deepcopy +from pathlib import Path + +import os +import os.path as osp +import random + +import numpy as np + +import hydra +import omegaconf +import paddle + +import paddle.distributed as dist +from mattergen.common.utils.data_classes import MatterGenCheckpointInfo +from mattergen.common.utils.globals import MODELS_PROJECT_ROOT +from mattergen.diffusion.run import maybe_instantiate +from omegaconf import DictConfig, OmegaConf, open_dict + +from mattergen.diffusion.trainer import TrainerDiffusion +from mattergen.common.data.callback import SetPropertyScalers + +from mattergen.utils import logger +from mattergen.common.data.utils import set_signal_handlers +from paddle_utils import * + +if dist.get_world_size() > 1: + dist.fleet.init(is_collective=True) + + +def init_adapter_lightningmodule_from_pretrained( + adapter_cfg: DictConfig, lightning_module_cfg: DictConfig +): + assert adapter_cfg.model_path is not None, "model_path must be provided." + model_path = Path(hydra.utils.to_absolute_path(adapter_cfg.model_path)) + ckpt_info = MatterGenCheckpointInfo(model_path, adapter_cfg.load_epoch) + ckpt_path = ckpt_info.checkpoint_path + version_root_path = Path(ckpt_path).relative_to(model_path).parents[1] + config_path = model_path / version_root_path + if (config_path / "config.yaml").exists(): + pretrained_cfg_path = config_path + else: + pretrained_cfg_path = config_path.parent.parent + hydra.core.global_hydra.GlobalHydra.instance().clear() + with hydra.initialize_config_dir( + str(pretrained_cfg_path.absolute()), version_base="1.1" + ): + pretrained_cfg = hydra.compose(config_name="config") + diffusion_module_cfg = deepcopy(pretrained_cfg.lightning_module.diffusion_module) + denoiser_cfg = diffusion_module_cfg.model + with open_dict(adapter_cfg.adapter): + for k, v in denoiser_cfg.items(): + if k != "_target_" and k != "property_embeddings_adapt": + adapter_cfg.adapter[k] = v + if k == "property_embeddings": + for field in v: + if field in adapter_cfg.adapter.property_embeddings_adapt: + adapter_cfg.adapter.property_embeddings_adapt.remove(field) + if 'GemNetT_MD' in adapter_cfg.adapter.gemnet["_target_"]: + adapter_cfg.adapter.gemnet[ + "_target_" + ] = "mattergen.common.gemnet.gemnet_ctrl_md.GemNetTCtrl_MD" + else: + adapter_cfg.adapter.gemnet[ + "_target_" + ] = "mattergen.common.gemnet.gemnet_ctrl.GemNetTCtrl" + adapter_cfg.adapter.gemnet.condition_on_adapt = list( + adapter_cfg.adapter.property_embeddings_adapt + ) + with open_dict(diffusion_module_cfg): + diffusion_module_cfg.model = adapter_cfg.adapter + with open_dict(lightning_module_cfg): + lightning_module_cfg.diffusion_module = diffusion_module_cfg + + model = maybe_instantiate(diffusion_module_cfg) + # lightning_module = hydra.utils.instantiate(lightning_module_cfg) + + ckpt: dict = paddle.load(path=str(ckpt_path)) + if 'state_dict' in ckpt: + pretrained_dict: OrderedDict = ckpt["state_dict"] + else: + pretrained_dict: OrderedDict = ckpt + scratch_dict: OrderedDict = model.state_dict() + scratch_dict.update( + (k, pretrained_dict[k]) for k in scratch_dict.keys() & pretrained_dict.keys() + ) + model.set_state_dict(state_dict=scratch_dict) + if not adapter_cfg.full_finetuning: + for name, param in model.named_parameters(): + if name in set(pretrained_dict.keys()): + out_1 = param + out_1.stop_gradient = True + out_1 + return model, lightning_module_cfg + + +@hydra.main( + config_path=str(MODELS_PROJECT_ROOT / "conf"), + config_name="finetune", + version_base="1.1", +) +def mattergen_finetune(cfg: omegaconf.DictConfig): + + + set_signal_handlers() + logger.init_logger( + log_file=osp.join(cfg.trainer.output_dir, f"{cfg.trainer.mode}.log") + ) + seed = cfg.trainer.seed + if seed is not None: + paddle.seed(seed=seed) + np.random.seed(seed) + random.seed(seed) + logger.info(f"Seeding everything with {seed}") + + # paddle.set_float32_matmul_precision("high") + datamodule = maybe_instantiate(cfg.data_module) + + model, lightning_module_cfg = init_adapter_lightningmodule_from_pretrained( + cfg.adapter, cfg.lightning_module + ) + with open_dict(cfg): + cfg.lightning_module = lightning_module_cfg + config_as_dict = OmegaConf.to_container(cfg, resolve=True) + print(json.dumps(config_as_dict, indent=4)) + + if dist.get_rank() == 0: + os.makedirs(cfg.trainer.output_dir, exist_ok=True) + OmegaConf.save(config_as_dict, osp.join(cfg.trainer.output_dir, "config.yaml")) + + + optimizer_cfg = cfg.lightning_module.optimizer_partial + optimizer_cfg = OmegaConf.to_container(optimizer_cfg, resolve=True) + optimizer_cfg.update( + dict( + model_list=model, + epochs=cfg.trainer.max_epochs, + iters_per_epoch=len(datamodule.train_dataloader()) + ) + ) + + optimizer, lr_scheduler = maybe_instantiate(optimizer_cfg) + + set_property_scalers = SetPropertyScalers() + set_property_scalers.on_fit_start( + train_dataloader=datamodule.train_dataloader(), model=model + ) + + trainer = TrainerDiffusion( + config=cfg, + model = model, + train_dataloader=datamodule.train_dataloader(), + val_dataloader=datamodule.val_dataloader(), + test_dataloader=datamodule.test_dataloader(), + optimizer=optimizer, + lr_scheduler=lr_scheduler, + ) + if cfg.trainer.mode == "train": + trainer.train() + elif cfg.trainer.mode == "eval": + trainer.eval() + elif cfg.trainer.mode == "test": + trainer.test() + + + + +if __name__ == "__main__": + mattergen_finetune() diff --git a/jointContribution/mattergen/scripts/generate.py b/jointContribution/mattergen/scripts/generate.py new file mode 100644 index 00000000..00d2104b --- /dev/null +++ b/jointContribution/mattergen/scripts/generate.py @@ -0,0 +1,124 @@ +import os +from pathlib import Path +from typing import Literal +import fire + +import numpy as np +import random + +import paddle + +from mattergen.common.data.types import TargetProperty +from mattergen.common.utils.data_classes import MatterGenCheckpointInfo +from mattergen.generator import CrystalGenerator +from hydra.utils import instantiate +from typing import Any, Mapping, TypeVar +T = TypeVar("T") + +def maybe_instantiate( + instance_or_config: (T | Mapping), expected_type=None, **kwargs +) -> T: + """ + If instance_or_config is a mapping with a _target_ field, instantiate it. + Otherwise, return it as is. + """ + if isinstance(instance_or_config, Mapping) and "_target_" in instance_or_config: + instance = instantiate(instance_or_config, **kwargs) + else: + instance = instance_or_config + assert expected_type is None or isinstance( + instance, expected_type + ), f"Expected {expected_type}, got {type(instance)}" + return instance + +### checked +def main( + output_path: str, + model_path: str, + batch_size: int = 64, + num_batches: int = 1, + config_overrides: (list[str] | None) = None, + checkpoint_epoch: (Literal["best", "last"] | int) = "last", + properties_to_condition_on: (TargetProperty | None) = None, + sampling_config_path: (str | None) = None, + sampling_config_name: str = "default", + sampling_config_overrides: (list[str] | None) = None, + record_trajectories: bool = True, + diffusion_guidance_factor: (float | None) = None, + strict_checkpoint_loading: bool = True, + num_atoms_distribution: str = "ALEX_MP_20", +): + """ + Evaluate diffusion model against molecular metrics. + + Args: + model_path: Path to DiffusionLightningModule checkpoint directory. + output_path: Path to output directory. + config_overrides: Overrides for the model config, e.g., `model.num_layers=3 model.hidden_dim=128`. + properties_to_condition_on: Property value to draw conditional sampling with respect to. When this value is an empty dictionary (default), unconditional samples are drawn. + sampling_config_path: Path to the sampling config file. (default: None, in which case we use `DEFAULT_SAMPLING_CONFIG_PATH` from explorers.common.utils.utils.py) + sampling_config_name: Name of the sampling config (corresponds to `{sampling_config_path}/{sampling_config_name}.yaml` on disk). (default: default) + sampling_config_overrides: Overrides for the sampling config, e.g., `condition_loader_partial.batch_size=32`. + load_epoch: Epoch to load from the checkpoint. If None, the best epoch is loaded. (default: None) + record: Whether to record the trajectories of the generated structures. (default: True) + strict_checkpoint_loading: Whether to raise an exception when not all parameters from the checkpoint can be matched to the model. + + NOTE: When specifying dictionary values via the CLI, make sure there is no whitespace between the key and value, e.g., `--properties_to_condition_on={key1:value1}`. + """ + # set seed + # seed = 42 + # paddle.seed(seed=seed) + # np.random.seed(seed) + # random.seed(seed) + if not os.path.exists(output_path): + os.makedirs(output_path) + sampling_config_overrides = sampling_config_overrides or [] + config_overrides = config_overrides or [] + properties_to_condition_on = properties_to_condition_on or {} + checkpoint_info = MatterGenCheckpointInfo( + model_path=Path(model_path).resolve(), + load_epoch=checkpoint_epoch, + config_overrides=config_overrides, + strict_checkpoint_loading=strict_checkpoint_loading, + ) + _sampling_config_path = ( + Path(sampling_config_path) if sampling_config_path is not None else None + ) + model = maybe_instantiate(checkpoint_info.config.lightning_module.diffusion_module) + + # for name, m in model.named_sublayers(): + # if isinstance(m, paddle.nn.Linear): + # print(f"'diffusion_module.{name}',") + state_dict = paddle.load(checkpoint_info.checkpoint_path) + if 'state_dict' in state_dict: + state_dict = state_dict['state_dict'] + missing_keys, unexpected_keys = model.set_state_dict(state_dict) + if len(missing_keys) > 0: + raise ValueError(f"Missing keys: {missing_keys}") + if len(unexpected_keys) > 0: + raise ValueError(f"Unexpected keys: {unexpected_keys}") + + generator = CrystalGenerator( + checkpoint_info=checkpoint_info, + properties_to_condition_on=properties_to_condition_on, + batch_size=batch_size, + num_batches=num_batches, + sampling_config_name=sampling_config_name, + sampling_config_path=_sampling_config_path, + sampling_config_overrides=sampling_config_overrides, + record_trajectories=record_trajectories, + num_atoms_distribution=num_atoms_distribution, + diffusion_guidance_factor=diffusion_guidance_factor + if diffusion_guidance_factor is not None + else 0.0, + _model=model, + ) + generator.generate(output_dir=Path(output_path)) + + +if __name__ == "__main__": + fire.Fire(main) + + +# PYTHONPATH=$PWD python scripts/generate.py results/ checkpoints/mattergen_base --batch_size=16 --num_batches 1 +# PYTHONPATH=$PWD python scripts/generate.py results_mp20/ outputs/08-54-29/output --batch_size=100 --num_batches 100 \ No newline at end of file diff --git a/jointContribution/mattergen/scripts/run.py b/jointContribution/mattergen/scripts/run.py new file mode 100644 index 00000000..eb4d2f22 --- /dev/null +++ b/jointContribution/mattergen/scripts/run.py @@ -0,0 +1,28 @@ + +import hydra +import omegaconf +from mattergen.common.utils.globals import MODELS_PROJECT_ROOT +from mattergen.diffusion.config import Config +from mattergen.diffusion.run import main +from omegaconf import OmegaConf + + +@hydra.main( + config_path=str(MODELS_PROJECT_ROOT / "conf"), + config_name="default", + version_base="1.1", +) +def mattergen_main(cfg: omegaconf.DictConfig): +# paddle.set_float32_matmul_precision("high") + schema = OmegaConf.structured(Config) + config = OmegaConf.merge(schema, cfg) + OmegaConf.set_readonly(config, True) + print(OmegaConf.to_yaml(cfg, resolve=True)) + main(config) + + +if __name__ == "__main__": + mattergen_main() + +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="6,7" scripts/run.py +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py \ No newline at end of file diff --git a/jointContribution/mattergen/tools/fc_names_chemical_system.py b/jointContribution/mattergen/tools/fc_names_chemical_system.py new file mode 100644 index 00000000..f3764877 --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_chemical_system.py @@ -0,0 +1,226 @@ +# chemical_system +fc_names_chemical_system = [ +'diffusion_module.model.gemnet.angle_edge_emb.0', +'diffusion_module.model.gemnet.angle_edge_emb.2', +'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', +'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', +'diffusion_module.model.gemnet.mlp_rbf3.linear', +'diffusion_module.model.gemnet.mlp_rbf_h.linear', +'diffusion_module.model.gemnet.mlp_rbf_out.linear', +'diffusion_module.model.gemnet.atom_latent_emb', +'diffusion_module.model.gemnet.edge_emb.dense.linear', +'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', +'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.0.0', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.0.2', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.1.0', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.1.2', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.2.0', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.2.2', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.3.0', +'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.3.2', +'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.0', +'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.1', +'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.2', +'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.3', +'diffusion_module.model.fc_atom', +] \ No newline at end of file diff --git a/jointContribution/mattergen/tools/fc_names_chemical_system_energy_above_hull.py b/jointContribution/mattergen/tools/fc_names_chemical_system_energy_above_hull.py new file mode 100644 index 00000000..64b61c06 --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_chemical_system_energy_above_hull.py @@ -0,0 +1,239 @@ +# chemical_system_energy_above_hull +fc_names_chemical_system_energy_above_hull = [ + 'diffusion_module.model.gemnet.angle_edge_emb.0', + 'diffusion_module.model.gemnet.angle_edge_emb.2', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', + 'diffusion_module.model.gemnet.mlp_rbf3.linear', + 'diffusion_module.model.gemnet.mlp_rbf_h.linear', + 'diffusion_module.model.gemnet.mlp_rbf_out.linear', + 'diffusion_module.model.gemnet.atom_latent_emb', + 'diffusion_module.model.gemnet.edge_emb.dense.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.chemical_system.3.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.energy_above_hull.3.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.chemical_system.3', + 'diffusion_module.model.gemnet.cond_mixin_layers.energy_above_hull.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.energy_above_hull.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.energy_above_hull.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.energy_above_hull.3', + 'diffusion_module.model.fc_atom', + 'diffusion_module.model.property_embeddings_adapt.chemical_system.conditional_embedding_module.embedding', +] diff --git a/jointContribution/mattergen/tools/fc_names_dft_band_gap.py b/jointContribution/mattergen/tools/fc_names_dft_band_gap.py new file mode 100644 index 00000000..7d858ce3 --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_dft_band_gap.py @@ -0,0 +1,226 @@ +# dft_band_gap +fc_names_dft_band_gap = [ +'diffusion_module.model.gemnet.angle_edge_emb.0', +'diffusion_module.model.gemnet.angle_edge_emb.2', +'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', +'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', +'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', +'diffusion_module.model.gemnet.mlp_rbf3.linear', +'diffusion_module.model.gemnet.mlp_rbf_h.linear', +'diffusion_module.model.gemnet.mlp_rbf_out.linear', +'diffusion_module.model.gemnet.atom_latent_emb', +'diffusion_module.model.gemnet.edge_emb.dense.linear', +'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', +'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', +'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', +'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', +'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', +'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', +'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', +'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.0.0', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.0.2', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.1.0', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.1.2', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.2.0', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.2.2', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.3.0', +'diffusion_module.model.gemnet.cond_adapt_layers.dft_band_gap.3.2', +'diffusion_module.model.gemnet.cond_mixin_layers.dft_band_gap.0', +'diffusion_module.model.gemnet.cond_mixin_layers.dft_band_gap.1', +'diffusion_module.model.gemnet.cond_mixin_layers.dft_band_gap.2', +'diffusion_module.model.gemnet.cond_mixin_layers.dft_band_gap.3', +'diffusion_module.model.fc_atom', +] diff --git a/jointContribution/mattergen/tools/fc_names_dft_mag_density.py b/jointContribution/mattergen/tools/fc_names_dft_mag_density.py new file mode 100644 index 00000000..13baf162 --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_dft_mag_density.py @@ -0,0 +1,226 @@ +# dft_mag_density +fc_names_dft_mag_density = [ + 'diffusion_module.model.gemnet.angle_edge_emb.0', + 'diffusion_module.model.gemnet.angle_edge_emb.2', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', + 'diffusion_module.model.gemnet.mlp_rbf3.linear', + 'diffusion_module.model.gemnet.mlp_rbf_h.linear', + 'diffusion_module.model.gemnet.mlp_rbf_out.linear', + 'diffusion_module.model.gemnet.atom_latent_emb', + 'diffusion_module.model.gemnet.edge_emb.dense.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.3.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.3', + 'diffusion_module.model.fc_atom', +] diff --git a/jointContribution/mattergen/tools/fc_names_dft_mag_density_hhi_score.py b/jointContribution/mattergen/tools/fc_names_dft_mag_density_hhi_score.py new file mode 100644 index 00000000..f441d884 --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_dft_mag_density_hhi_score.py @@ -0,0 +1,240 @@ + +# dft_mag_density_hhi_score +fc_names_dft_mag_density_hhi_score = [ + 'diffusion_module.model.gemnet.angle_edge_emb.0', + 'diffusion_module.model.gemnet.angle_edge_emb.2', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', + 'diffusion_module.model.gemnet.mlp_rbf3.linear', + 'diffusion_module.model.gemnet.mlp_rbf_h.linear', + 'diffusion_module.model.gemnet.mlp_rbf_out.linear', + 'diffusion_module.model.gemnet.atom_latent_emb', + 'diffusion_module.model.gemnet.edge_emb.dense.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.dft_mag_density.3.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.hhi_score.3.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.dft_mag_density.3', + 'diffusion_module.model.gemnet.cond_mixin_layers.hhi_score.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.hhi_score.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.hhi_score.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.hhi_score.3', + 'diffusion_module.model.fc_atom', +] + diff --git a/jointContribution/mattergen/tools/fc_names_mattergen_base.py b/jointContribution/mattergen/tools/fc_names_mattergen_base.py new file mode 100644 index 00000000..7d68eee5 --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_mattergen_base.py @@ -0,0 +1,260 @@ + +# base +fc_names_mattergen_base = [ + 'diffusion_module.model.gemnet.angle_edge_emb.0', + 'diffusion_module.model.gemnet.angle_edge_emb.2', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', + 'diffusion_module.model.gemnet.mlp_rbf3.linear', + 'diffusion_module.model.gemnet.mlp_rbf_h.linear', + 'diffusion_module.model.gemnet.mlp_rbf_out.linear', + 'diffusion_module.model.gemnet.atom_latent_emb', + 'diffusion_module.model.gemnet.edge_emb.dense.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_energy.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_energy.3.dense_mlp.1.linear', + + 'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_energy.3.dense_mlp.1.linear', + + 'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_energy.3.dense_mlp.1.linear', + + 'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_energy.3.dense_mlp.1.linear', + + 'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.fc_atom', +] + + + + + + diff --git a/jointContribution/mattergen/tools/fc_names_ml_bulk_modulus.py b/jointContribution/mattergen/tools/fc_names_ml_bulk_modulus.py new file mode 100644 index 00000000..14d3b77b --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_ml_bulk_modulus.py @@ -0,0 +1,228 @@ + +# # ml_bulk_modulus +fc_names_ml_bulk_modulus = [ + 'diffusion_module.model.gemnet.angle_edge_emb.0', + 'diffusion_module.model.gemnet.angle_edge_emb.2', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', + 'diffusion_module.model.gemnet.mlp_rbf3.linear', + 'diffusion_module.model.gemnet.mlp_rbf_h.linear', + 'diffusion_module.model.gemnet.mlp_rbf_out.linear', + 'diffusion_module.model.gemnet.atom_latent_emb', + 'diffusion_module.model.gemnet.edge_emb.dense.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.ml_bulk_modulus.3.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.ml_bulk_modulus.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.ml_bulk_modulus.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.ml_bulk_modulus.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.ml_bulk_modulus.3', + 'diffusion_module.model.fc_atom', + ] + diff --git a/jointContribution/mattergen/tools/fc_names_space_group.py b/jointContribution/mattergen/tools/fc_names_space_group.py new file mode 100644 index 00000000..f5eba0da --- /dev/null +++ b/jointContribution/mattergen/tools/fc_names_space_group.py @@ -0,0 +1,226 @@ +# # space_group +fc_names_space_group = [ + 'diffusion_module.model.gemnet.angle_edge_emb.0', + 'diffusion_module.model.gemnet.angle_edge_emb.2', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.0.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.mlp.1.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.lattice_out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.mlp_rbf_lattice.linear', + 'diffusion_module.model.gemnet.mlp_rbf3.linear', + 'diffusion_module.model.gemnet.mlp_rbf_h.linear', + 'diffusion_module.model.gemnet.mlp_rbf_out.linear', + 'diffusion_module.model.gemnet.atom_latent_emb', + 'diffusion_module.model.gemnet.edge_emb.dense.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.0.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.0.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.0.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.1.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.1.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.1.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.2.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.2.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.2.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.3.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.3.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.3.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_energy.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.out_blocks.4.seq_forces.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.out_blocks.4.out_forces.linear', + 'diffusion_module.model.gemnet.out_blocks.4.dense_rbf_F.linear', + 'diffusion_module.model.gemnet.int_blocks.0.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.0.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.0.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.0.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.1.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.1.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.1.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.2.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.2.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.2.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.dense_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.dense_ba.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.mlp_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.down_projection.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ca.linear', + 'diffusion_module.model.gemnet.int_blocks.3.trip_interaction.up_projection_ac.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_before_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.layers_after_skip.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.dense_rbf.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.1.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.2.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.atom_update.layers.3.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.int_blocks.3.concat_layer.dense.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.0.linear', + 'diffusion_module.model.gemnet.int_blocks.3.residual_m.0.dense_mlp.1.linear', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.0.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.0.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.1.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.1.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.2.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.2.2', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.3.0', + 'diffusion_module.model.gemnet.cond_adapt_layers.space_group.3.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.space_group.0', + 'diffusion_module.model.gemnet.cond_mixin_layers.space_group.1', + 'diffusion_module.model.gemnet.cond_mixin_layers.space_group.2', + 'diffusion_module.model.gemnet.cond_mixin_layers.space_group.3', + 'diffusion_module.model.fc_atom', + ] diff --git a/jointContribution/mattergen/tools/torch2paddle.py b/jointContribution/mattergen/tools/torch2paddle.py new file mode 100644 index 00000000..d8339169 --- /dev/null +++ b/jointContribution/mattergen/tools/torch2paddle.py @@ -0,0 +1,65 @@ +import os +import numpy as np +import argparse +import torch +import paddle + +from fc_names_mattergen_base import fc_names_mattergen_base +from fc_names_chemical_system import fc_names_chemical_system +from fc_names_chemical_system_energy_above_hull import fc_names_chemical_system_energy_above_hull +from fc_names_dft_band_gap import fc_names_dft_band_gap +from fc_names_dft_mag_density_hhi_score import fc_names_dft_mag_density_hhi_score +from fc_names_dft_mag_density import fc_names_dft_mag_density +from fc_names_ml_bulk_modulus import fc_names_ml_bulk_modulus +from fc_names_space_group import fc_names_space_group + + + +def torch2paddle(torch_path, paddle_path, fc_names): + # torch_path = "csp_torch.pth" + # torch_path = "/root/host/home/zhangzhimin04/workspaces/mattergen/checkpoints/dft_mag_density_hhi_score/checkpoints/last.ckpt" + # paddle_path = "/root/host/home/zhangzhimin04/workspaces/mattergen/checkpoints/dft_mag_density_hhi_score/checkpoints/latest.pdparams" + torch_state_dict = torch.load(torch_path) + + paddle_state_dict = {"state_dict": {}} + for k in torch_state_dict['state_dict']: + if "num_batches_tracked" in k: + continue + v = torch_state_dict['state_dict'][k].detach().cpu().numpy() + flag = [i in k for i in fc_names] + if any(flag) and "weight" in k: + new_shape = [1, 0] + list(range(2, v.ndim)) + print( + f"name: {k}, ori shape: {v.shape}, new shape: {v.transpose(new_shape).shape}" + ) + v = v.transpose(new_shape) + k = k.replace("running_var", "_variance") + k = k.replace("running_mean", "_mean") + k = k.replace('diffusion_module.', '') + paddle_state_dict['state_dict'][k] = v + paddle.save(paddle_state_dict, paddle_path) + +if __name__ == "__main__": + argparser = argparse.ArgumentParser() + argparser.add_argument("--torch_path", type=str, required=True) + argparser.add_argument("--paddle_path", type=str, required=True) + argparser.add_argument("--fc_names", type=str, required=True) + + args = argparser.parse_args() + + assert args.fc_names in [ + "mattergen_base", + "chemical_system", + "chemical_system_energy_above_hull", + "dft_band_gap", + "dft_mag_density_hhi_score", + "dft_mag_density", + "ml_bulk_modulus", + "space_group"] + + dir_name = os.path.dirname(args.paddle_path) + if not os.path.exists(dir_name): + print(f"mkdir {dir_name}") + os.makedirs(dir_name) + + torch2paddle(args.torch_path, args.paddle_path, eval(f"fc_names_{args.fc_names}")) diff --git a/jointContribution/mattergen/train.sh b/jointContribution/mattergen/train.sh new file mode 100644 index 00000000..b3ff08d7 --- /dev/null +++ b/jointContribution/mattergen/train.sh @@ -0,0 +1,22 @@ + + +# export CUDA_VISIBLE_DEVICES=1,2,3,4,5,6,7 + +#--------------------------- mp20---------------------------------------# +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="1,2,3,4" scripts/run.py + + +#--------------------------- alex_mp20----------------------------------# +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py data_module=alex_mp_20 +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="1,2,3,4" scripts/run.py data_module=alex_mp_20 + + +# --------------------------- 2d_30k----------------------------------# +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py data_module=2d_30k +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="4,5,6,7" scripts/run.py data_module=2d_30k + + +# --------------------------- 2d_30k add mean distance----------------------------------# +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python scripts/run.py --config-name=default_2d_md +# PYTHONPATH=$PWD HYDRA_FULL_ERROR=1 python -m paddle.distributed.launch --gpus="4,5,6,7" scripts/run.py --config-name=default_2d_md diff --git a/materials_discovery/.gitignore b/materials_discovery/.gitignore deleted file mode 100644 index 22789148..00000000 --- a/materials_discovery/.gitignore +++ /dev/null @@ -1,134 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -__MACOSX -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pycharm -.DS_Store -.idea/ -FETCH_HEAD - -# vscode -.vscode - -# numpy -.npy - -# vtk -*.vtk -*.vtu - -# auto generated version file by setuptools_scm -ppsci/_version.py \ No newline at end of file diff --git a/materials_discovery/.pre-commit-config.yaml b/materials_discovery/.pre-commit-config.yaml deleted file mode 100644 index 8132db56..00000000 --- a/materials_discovery/.pre-commit-config.yaml +++ /dev/null @@ -1,53 +0,0 @@ -repos: - - repo: https://github.com/PyCQA/isort - rev: 5.11.5 - hooks: - - id: isort - args: ["--multi-line=7", "--sl"] - - - repo: https://github.com/psf/black - rev: 22.3.0 - hooks: - - id: black - - - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: "v0.0.272" - hooks: - - id: ruff - - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: a11d9314b22d8f8c7556443875b731ef05965464 - hooks: - - id: check-merge-conflict - - id: check-symlinks - - id: detect-private-key - files: (?!.*paddle)^.*$ - - id: end-of-file-fixer - - id: trailing-whitespace - - id: check-case-conflict - - id: check-yaml - exclude: "mkdocs.yml" - - id: pretty-format-json - args: [--autofix] - - id: requirements-txt-fixer - - - repo: https://github.com/Lucas-C/pre-commit-hooks - rev: v1.0.1 - hooks: - - id: forbid-crlf - files: \.md$ - - id: remove-crlf - files: \.md$ - - id: forbid-tabs - files: \.md$ - - id: remove-tabs - files: \.md$ - - - repo: local - hooks: - - id: clang-format - name: clang-format - description: Format files with ClangFormat - entry: bash .clang_format.hook -i - language: system - files: \.(c|cc|cxx|cpp|cu|h|hpp|hxx|cuh|proto)$ diff --git a/materials_discovery/LICENSE b/materials_discovery/LICENSE deleted file mode 100644 index 97eb3f70..00000000 --- a/materials_discovery/LICENSE +++ /dev/null @@ -1,86 +0,0 @@ -Copyright (c) 2022 Johannes Gasteiger, Florian Becker - -Hippocratic License Version 2.0 - -Licensor hereby grants permission by this license ("License"), free -of charge, to any person or entity (the "Licensee") obtaining a copy -of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without -limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this License or a subsequent version -published on the Hippocratic License Website -(https://firstdonoharm.dev/) shall be included in all copies or -substantial portions of the Software. Licensee has the option of -following the terms and conditions either of the above numbered -version of this License or of any subsequent version published on the -Hippocratic License Website. - -Compliance with Human Rights Laws and Human Rights Principles: - -1. Human Rights Laws. The Software shall not be used by any person or -entity for any systems, activities, or other uses that violate any -applicable laws, regulations, or rules that protect human, civil, -labor, privacy, political, environmental, security, economic, due -process, or similar rights (the "Human Rights Laws"). Where the Human -Rights Laws of more than one jurisdiction are applicable to the use -of the Software, the Human Rights Laws that are most protective of -the individuals or groups harmed shall apply. - -2. Human Rights Principles. Licensee is advised to consult the -articles of the United Nations Universal Declaration of Human Rights -(https://www.un.org/en/universal-declaration-human-rights/) and the -United Nations Global Compact -(https://www.unglobalcompact.org/what-is-gc/mission/principles) that -define recognized principles of international human rights (the -"Human Rights Principles"). It is Licensor's express intent that all -use of the Software be consistent with Human Rights Principles. If -Licensor receives notification or otherwise learns of an alleged -violation of any Human Rights Principles relating to Licensee's use -of the Software, Licensor may in its discretion and without -obligation (i) (a) notify Licensee of such allegation and (b) allow -Licensee 90 days from notification under (i)(a) to investigate and -respond to Licensor regarding the allegation and (ii) (a) after the -earlier of 90 days from notification under (i)(a), or Licensee's -response under (i)(b), notify Licensee of License termination and (b) -allow Licensee an additional 90 days from notification under (ii)(a) -to cease use of the Software. - -3. Indemnity. Licensee shall hold harmless and indemnify Licensor -against all losses, damages, liabilities, deficiencies, claims, -actions, judgments, settlements, interest, awards, penalties, fines, -costs, or expenses of whatever kind, including Licensor's reasonable -attorneys' fees, arising out of or relating to Licensee's -non-compliance with this License or use of the Software in violation -of Human Rights Laws or Human Rights Principles. - -Enforceability: If any portion or provision of this License is -determined to be invalid, illegal, or unenforceable by a court of -competent jurisdiction, then such invalidity, illegality, or -unenforceability shall not affect any other term or provision of this -License or invalidate or render unenforceable such term or provision -in any other jurisdiction. Upon a determination that any term or -provision is invalid, illegal, or unenforceable, to the extent -permitted by applicable law, the court may modify this License to -affect the original intent of the parties as closely as possible. The -section headings are for convenience only and are not intended to -affect the construction or interpretation of this License. Any rule -of construction to the effect that ambiguities are to be resolved -against the drafting party shall not apply in interpreting this -License. The language in this License shall be interpreted as to its -fair meaning and not strictly for or against any party. - - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -This Hippocratic License is an Ethical Source license -(https://ethicalsource.dev). diff --git a/materials_discovery/README.md b/materials_discovery/README.md deleted file mode 100644 index 29985795..00000000 --- a/materials_discovery/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# GemNet: Universal Directional Graph Neural Networks for Molecules - -Reference implementation in PyTorch of the geometric message passing neural network (GemNet). You can find its original [TensorFlow 2 implementation in another repository](https://github.com/TUM-DAML/gemnet_tf). GemNet is a model for predicting the overall energy and the forces acting on the atoms of a molecule. It was proposed in the paper: - -**[GemNet: Universal Directional Graph Neural Networks for Molecules](https://www.cs.cit.tum.de/daml/gemnet/)** -by Johannes Gasteiger, Florian Becker, Stephan Günnemann -Published at NeurIPS 2021 - -and further analyzed in - -**[How robust are modern graph neural network potentials in long and hot molecular dynamics simulations?](https://www.cs.cit.tum.de/daml/gemnet/)** -by Sina Stocker\*, Johannes Gasteiger\*, Florian Becker, Stephan Günnemann and Johannes T. Margraf -Published in Machine Learning: Science and Technology, 2022 - -\*Both authors contributed equally to this research. Note that the author's name has changed from Johannes Klicpera to Johannes Gasteiger. - -## Run the code -Adjust config.yaml (or config_seml.yaml) to your needs. -This repository contains notebooks for training the model (`train.ipynb`) and for generating predictions on a molecule loaded from [ASE](https://wiki.fysik.dtu.dk/ase/) (`predict.ipynb`). It also contains a script for training the model on a cluster with Sacred and [SEML](https://github.com/TUM-DAML/seml) (`train_seml.py`). Further, a notebook is provided to show how GemNet can be used for MD simulations (`ase_example.ipynb`). - -## Compute scaling factors -You can either use the precomputed scaling_factors (in scaling_factors.json) or compute them yourself by running fit_scaling.py. Scaling factors are used to ensure a consistent scale of activations at initialization. They are the same for all GemNet variants. - -## Contact -Please contact j.gasteiger@in.tum.de if you have any questions. - -## Cite -Please cite our papers if you use the model or this code in your own work: - -``` -@inproceedings{gasteiger_gemnet_2021, - title = {GemNet: Universal Directional Graph Neural Networks for Molecules}, - author = {Gasteiger, Johannes and Becker, Florian and G{\"u}nnemann, Stephan}, - booktitle={Conference on Neural Information Processing Systems (NeurIPS)}, - year = {2021} -} -``` - -``` -@article{stocker_robust_2022, - title = {How robust are modern graph neural network potentials in long and hot molecular dynamics simulations?}, - author = {Stocker, Sina and Gasteiger, Johannes and Becker, Florian and G{\"u}nnemann, Stephan and Margraf, Johannes T.}, - volume = {3}, - doi = {10.1088/2632-2153/ac9955}, - number = {4}, - journal = {Machine Learning: Science and Technology}, - year = {2022}, - pages = {045010}, -} -``` diff --git a/materials_discovery/ase_calculator.py b/materials_discovery/ase_calculator.py deleted file mode 100644 index 2b772da8..00000000 --- a/materials_discovery/ase_calculator.py +++ /dev/null @@ -1,241 +0,0 @@ -import logging - -import numpy as np -from ase import Atoms -from ase import units -from ase.calculators.calculator import Calculator -from ase.calculators.calculator import all_changes -from ase.io.trajectory import Trajectory -from ase.md import MDLogger -from ase.md.langevin import Langevin -from ase.md.velocitydistribution import MaxwellBoltzmannDistribution -from ase.md.velocitydistribution import Stationary -from ase.md.verlet import VelocityVerlet - -from gemnet.training.data_container import DataContainer - - -class Molecule(DataContainer): - """ - Implements the DataContainer but for a single molecule. Requires custom - init method. - """ - - def __init__(self, R, Z, cutoff, int_cutoff, triplets_only=False): - self.index_keys = [ - "batch_seg", - "id_undir", - "id_swap", - "id_c", - "id_a", - "id3_expand_ba", - "id3_reduce_ca", - "Kidx3", - ] - if not triplets_only: - self.index_keys += [ - "id4_int_b", - "id4_int_a", - "id4_reduce_ca", - "id4_expand_db", - "id4_reduce_cab", - "id4_expand_abd", - "Kidx4", - "id4_reduce_intm_ca", - "id4_expand_intm_db", - "id4_reduce_intm_ab", - "id4_expand_intm_ab", - ] - self.triplets_only = triplets_only - self.cutoff = cutoff - self.int_cutoff = int_cutoff - self.keys = ["N", "Z", "R", "F", "E"] - assert tuple(R.shape) == (len(Z), 3) - self.R = R - self.Z = Z - self.N = np.array([len(Z)], dtype=np.int32) - self.E = np.zeros(1, dtype=np.float32).reshape(1, 1) - self.F = np.zeros((len(Z), 3), dtype=np.float32) - self.N_cumsum = np.concatenate([[0], np.cumsum(self.N)]) - self.addID = False - self.dtypes, dtypes2 = self.get_dtypes() - self.dtypes.update(dtypes2) - self.device = "cpu" - - def get(self): - """ - Get the molecule representation in the expected format for the GemNet - model. - """ - data = self.__getitem__(0) - for var in ["E", "F"]: - data.pop(var) - for key in data: - data[key] = data[key].to(self.device) - return data - - def update(self, R): - """ - Update the position of the atoms. - Graph representation of the molecule might change if the atom positions - are updated. - - Parameters - ---------- - R: torch.Tensor (nAtoms, 3) - Positions of the atoms in A°. - """ - assert tuple(self.R.shape) == tuple(R.shape) - self.R = R - - def to(self, device): - """ - Changes the device of the returned tensors in the .get() method. - """ - self.device = device - - -class GNNCalculator(Calculator): - """ - A custom ase calculator that computes energy and forces acting on atoms of - a molecule using GNNs, - e.g. GemNet. - - Parameters - ---------- - molecule - Captures data of all atoms. Contains indices etc. - model - The trained GemNet model. - atoms: ase.Atoms - ASE atoms instance. - - restart: str - Prefix for restart file. May contain a directory. Default is None: - don't restart. - label: str - Name used for all files. - """ - - implemented_properties = ["energy", "forces"] - - def __init__( - self, - molecule, - model, - atoms=None, - restart=None, - add_atom_energies=False, - label="gemnet_calc", - **kwargs, - ): - super().__init__(restart=restart, label=label, atoms=atoms, **kwargs) - self.molecule = molecule - self.model = model - self.add_atom_energies = add_atom_energies - self.atom_energies = { - (1): -13.641404161, - (6): -1027.592489146, - (7): -1484.274819088, - (8): -2039.734879322, - (16): -10828.707468187, - (17): -12516.444619523, - } - - def calculate( - self, atoms=None, properties=["energy", "forces"], system_changes=all_changes - ): - super().calculate(atoms, properties, system_changes) - self.molecule.update(R=atoms.positions) - inputs = self.molecule.get() - energy, forces = self.model.predict(inputs) - energy = float(energy) - if self.add_atom_energies: - energy += np.sum([self.atom_energies[z] for z in atoms.numbers]) - self.results["energy"] = energy - self.results["forces"] = forces.numpy() - - -class MDSimulator: - """ - Runs a MD simulation on the Atoms object created from data and perform MD - simulation for max_steps - - Parameters - ---------- - molecule - Captures data of all atoms. - model - The trained GemNet model. - dynamics: str - Name of the MD integrator. Implemented: 'langevin' or 'verlet'. - max_steps: int - Maximum number of simulation steps. - time: float - Integration time step for Newton's law in femtoseconds. - temperature: float - The temperature in Kelvin. - langevin_friction: float - Only used when dynamics are 'langevin'. A friction coefficient, - typically 1e-4 to 1e-2. - interval: int - Write only every time step to trajectory file. - traj_path: str - Path of the file where to save the calculated trajectory. - vel: N-array, default=None - If set, then atoms have been initialized with these velocties. - logfile: str - File name or open file, where to log md simulation. “-” refers to - standard output. - """ - - def __init__( - self, - molecule, - model, - dynamics: str = "langevin", - max_steps: int = 100, - time: float = 0.5, - temperature: float = 300, - langevin_friction: float = 0.002, - interval: int = 10, - traj_path="md_sim.traj", - vel=None, - logfile="-", - ): - self.max_steps = max_steps - atoms = Atoms(positions=molecule.R, numbers=molecule.Z) - atoms.calc = GNNCalculator(molecule, model=model, atoms=atoms) - if vel is not None: - atoms.set_velocities(vel) - else: - MaxwellBoltzmannDistribution(atoms, temp=temperature * units.kB) - Stationary(atoms) - self.dyn = None - if dynamics.lower() == "verlet": - logging.info("Selected MD integrator: Verlet") - self.dyn = VelocityVerlet(atoms, timestep=time * units.fs) - elif dynamics.lower() == "langevin": - logging.info("Selected MD integrator: Langevin") - self.dyn = Langevin( - atoms, - timestep=time * units.fs, - temperature=temperature * units.kB, - friction=langevin_friction, - ) - else: - raise UserWarning( - f"""Unkown MD integrator. I only know 'verlet' and 'langevin'" - "but {dynamics} was given.""" - ) - logging.info(f"Save trajectory to {traj_path}") - self.traj = Trajectory(traj_path, "w", atoms) - self.dyn.attach(self.traj.write, interval=interval) - self.dyn.attach( - MDLogger(self.dyn, atoms, logfile, peratom=False, mode="a"), - interval=interval, - ) - - def run(self): - self.dyn.run(self.max_steps) - self.traj.close() diff --git a/materials_discovery/ase_example.ipynb b/materials_discovery/ase_example.ipynb deleted file mode 100644 index 3e7a228b..00000000 --- a/materials_discovery/ase_example.ipynb +++ /dev/null @@ -1,295 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "# Set up logger\n", - "logger = logging.getLogger()\n", - "logger.handlers = []\n", - "ch = logging.StreamHandler()\n", - "formatter = logging.Formatter(\n", - " fmt=\"%(asctime)s (%(levelname)s): %(message)s\", datefmt=\"%Y-%m-%d %H:%M:%S\"\n", - ")\n", - "ch.setFormatter(formatter)\n", - "logger.addHandler(ch)\n", - "logger.setLevel(\"INFO\")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "23182efc371d4de1865c0b18e3979e7f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "from gemnet.model.gemnet import GemNet\n", - "from gemnet.model.utils import read_json\n", - "\n", - "from ase_calculator import Molecule, MDSimulator\n", - "from ase.build import molecule as ase_molecule_db\n", - "\n", - "# for visualization\n", - "from ase.io.trajectory import Trajectory\n", - "import nglview" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Model settings" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "model_name = \"GemNet-Q\"\n", - "# model_name = \"GemNet-T\"\n", - "\n", - "pretrained_models_path = \"./pretrained\"\n", - "weights_file = f\"{pretrained_models_path}/{model_name}/model.pth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Load the model" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "num_spherical: 7\n", - "num_radial: 6\n", - "num_blocks: 4\n", - "emb_size_atom: 128\n", - "emb_size_edge: 128\n", - "emb_size_trip: 64\n", - "emb_size_quad: 32\n", - "emb_size_rbf: 16\n", - "emb_size_cbf: 16\n", - "emb_size_sbf: 32\n", - "emb_size_bil_trip: 64\n", - "emb_size_bil_quad: 32\n", - "num_before_skip: 1\n", - "num_after_skip: 1\n", - "num_concat: 1\n", - "num_atom: 2\n", - "triplets_only: False\n", - "num_targets: 1\n", - "direct_forces: False\n", - "cutoff: 5.0\n", - "int_cutoff: 10.0\n", - "envelope_exponent: 5\n", - "extensive: True\n", - "forces_coupled: False\n", - "output_init: HeOrthogonal\n", - "activation: swish\n", - "scale_file: ./pretrained/scaling_factors.json\n" - ] - } - ], - "source": [ - "model_kwargs = read_json(f\"{pretrained_models_path}/{model_name}/model_kwargs.json\")\n", - "model_kwargs[\"scale_file\"] = f\"{pretrained_models_path}/\" + model_kwargs[\"scale_file\"]\n", - "\n", - "for key, value in model_kwargs.items():\n", - " print(f\"{key}: {value}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "model = GemNet(**model_kwargs)\n", - "model.load_weights(weights_file)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Molecule setup\n", - "Load from database or build your own by specifying R and Z" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "mol = ase_molecule_db('C7NH5')\n", - "R = mol.get_positions()\n", - "Z = mol.get_atomic_numbers()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# MD simulation settings" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "traj_path = \"./md_sim.traj\"\n", - "logfile = \"-\" # “-” refers to standard output.\n", - "dynamics = \"langevin\" # Name of the MD integrator. Implemented: 'langevin' or 'verlet'.\n", - "max_steps = 10 # Maximum number of simulation steps.\n", - "time = 0.5 # Integration time step for Newton's law in femtoseconds.\n", - "interval = 2 # Write only every time step to trajectory file.\n", - "temperature = 1500 # The temperature in Kelvin.\n", - "langevin_friction = 0.002 # Friction coefficient (only used when dynamics is langevin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Setup and run the simulation" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "cutoff = model_kwargs[\"cutoff\"]\n", - "int_cutoff = model_kwargs[\"int_cutoff\"]\n", - "triplets_only = model_kwargs[\"triplets_only\"]\n", - "molecule = Molecule(\n", - " R, Z, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/nfs/homedirs/beckerf/anaconda3/envs/torch/lib/python3.8/site-packages/ase/md/md.py:48: FutureWarning: Specify the temperature in K using the 'temperature_K' argument\n", - " warnings.warn(FutureWarning(w))\n", - "2022-03-15 20:28:47 (INFO): Selected MD integrator: Langevin\n", - "2022-03-15 20:28:47 (INFO): Save trajectory to ./md_sim.traj\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time[ps] Etot[eV] Epot[eV] Ekin[eV] T[K]\n", - "0.0000 -75.7794 -77.4343 1.6548 984.8\n", - "0.0010 -75.7737 -77.3192 1.5455 919.7\n", - "0.0020 -75.7691 -77.0242 1.2551 746.9\n", - "0.0030 -75.7583 -76.8102 1.0519 626.0\n", - "0.0040 -75.7583 -76.7260 0.9677 575.9\n", - "0.0050 -75.7566 -76.5981 0.8415 500.8\n" - ] - } - ], - "source": [ - "simulation = MDSimulator(\n", - " molecule, model, \n", - " dynamics=dynamics, max_steps=max_steps, time=time, temperature=temperature, langevin_friction=langevin_friction,\n", - " interval=interval, traj_path=traj_path, logfile=logfile\n", - ")\n", - "simulation.run()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Visualize simulated trajectory" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b621ccebd84648228596cfdf0c679c62", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "NGLWidget(max_frame=5)" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "traj = Trajectory(traj_path)\n", - "nglview.show_asetraj(traj)" - ] - } - ], - "metadata": { - "interpreter": { - "hash": "73d4dc6ffc134dc5e05ee963c4039b14792ec4f63c8d27e3dd67b524fa7b1d65" - }, - "kernelspec": { - "display_name": "Python 3.8.0 ('tf')", - "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.8.0" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/materials_discovery/config.yaml b/materials_discovery/config.yaml deleted file mode 100644 index 3656961f..00000000 --- a/materials_discovery/config.yaml +++ /dev/null @@ -1,68 +0,0 @@ - -num_spherical: 7 -num_radial: 6 -num_blocks: 4 - -emb_size_atom: 128 -emb_size_edge: 128 -emb_size_trip: 64 -emb_size_quad: 32 -emb_size_rbf: 16 -emb_size_cbf: 16 -emb_size_sbf: 32 -emb_size_bil_trip: 64 -emb_size_bil_quad: 32 - -num_before_skip: 1 -num_after_skip: 1 -num_concat: 1 -num_atom: 2 - -cutoff: 5.0 -int_cutoff: 10.0 -# triplets_only: False -triplets_only: True -# direct_forces: False -direct_forces: True - - -mve: False -loss: "rmse" -forces_coupled: False -envelope_exponent: 5 -extensive: True - -rho_force: 0.999 -ema_decay: 0.999 -# weight_decay: 0.000002 -weight_decay: 0 - -learning_rate: 0.001 -decay_steps: 4500000 -decay_rate: 0.01 -staircase: False -decay_patience: 5 -decay_factor: 0.5 -decay_cooldown: 5 -agc: False -grad_clip_max: 10.0 - -restart: null -tfseed: 1234 -data_seed: 42 -scale_file: "scaling_factors.json" -comment: "GemNet" -output_init: "HeOrthogonal" - -logdir: "logs" -dataset: "data/coll_v1.2_train.npz" -val_dataset: "data/coll_v1.2_val.npz" -num_train: 0 # derived from dataset -num_val: 0 # derived from dataset - -patience: 5 -evaluation_interval: 10 -save_interval: 7500 -warmup_steps: 3750 -batch_size: 32 -num_steps: 1500000 diff --git a/materials_discovery/config_seml.yaml b/materials_discovery/config_seml.yaml deleted file mode 100644 index c3a65bfa..00000000 --- a/materials_discovery/config_seml.yaml +++ /dev/null @@ -1,91 +0,0 @@ - -seml: - executable: 'train_seml.py' - name: "gemnet" - output_dir: "slurm_logs" - project_root_dir: "." - -slurm: - experiments_per_job: 1 - sbatch_options: - gres: 'gpu:1' - mem: 40G - cpus-per-task: 2 - time: 07-00:00 - partition: gpu_all - -fixed: - num_spherical: 7 - num_radial: 6 - num_blocks: 4 - - emb_size_atom: 128 - emb_size_edge: 128 - emb_size_trip: 64 - emb_size_quad: 32 - emb_size_rbf: 16 - emb_size_cbf: 16 - emb_size_sbf: 32 - emb_size_bil_trip: 64 - emb_size_bil_quad: 32 - - num_before_skip: 1 - num_after_skip: 1 - num_concat: 1 - num_atom: 2 - - cutoff: 5.0 - int_cutoff: 10.0 - - mve: False - loss: "rmse" - forces_coupled: False - envelope_exponent: 5 - extensive: True - - rho_force: 0.999 - ema_decay: 0.999 - weight_decay: 0.000002 - - learning_rate: 0.001 - decay_steps: 4500000 - decay_rate: 0.01 - staircase: False - decay_patience: 5 - decay_factor: 0.5 - decay_cooldown: 5 - agc: False - grad_clip_max: 10.0 - - restart: null - tfseed: 1234 - data_seed: 42 - scale_file: "scaling_factors.json" - comment: "GemNet" - output_init: "HeOrthogonal" - - logdir: "logs" - dataset: "data/coll_v1.2_train.npz" - val_dataset: "data/coll_v1.2_val.npz" - num_train: 0 # derived from dataset - num_val: 0 # derived from dataset - - patience: 5 - evaluation_interval: 7500 - save_interval: 7500 - warmup_steps: 3750 - batch_size: 32 - num_steps: 1500000 - -grid: - triplets_only: - type: choice - options: - - True - - False - - direct_forces: - type: choice - options: - - True - - False diff --git a/materials_discovery/data/coll_v1.2_test.npz b/materials_discovery/data/coll_v1.2_test.npz deleted file mode 100644 index f300c6c8..00000000 Binary files a/materials_discovery/data/coll_v1.2_test.npz and /dev/null differ diff --git a/materials_discovery/data/coll_v1.2_train.npz b/materials_discovery/data/coll_v1.2_train.npz deleted file mode 100644 index cd25aaba..00000000 Binary files a/materials_discovery/data/coll_v1.2_train.npz and /dev/null differ diff --git a/materials_discovery/data/coll_v1.2_val.npz b/materials_discovery/data/coll_v1.2_val.npz deleted file mode 100644 index fe2708ef..00000000 Binary files a/materials_discovery/data/coll_v1.2_val.npz and /dev/null differ diff --git a/materials_discovery/env.yml b/materials_discovery/env.yml deleted file mode 100644 index a1be5cc2..00000000 --- a/materials_discovery/env.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: torch -channels: - - defaults - - conda-forge - - pytorch - - pyg -dependencies: - - python==3.8 - - cudatoolkit=11.3 - - pytorch==1.10 - - pytorch-scatter - - jupyterlab - - numpy - - numba - - scipy>=1.3 - - sympy>=1.5 - - tqdm - - ase - - nglview diff --git a/materials_discovery/fit_scaling.py b/materials_discovery/fit_scaling.py deleted file mode 100644 index 2b7f0c37..00000000 --- a/materials_discovery/fit_scaling.py +++ /dev/null @@ -1,164 +0,0 @@ -import ast -import logging -import os - -import paddle -import yaml -from tqdm import trange - -from gemnet.model.gemnet import GemNet -from gemnet.model.layers.scaling import AutomaticFit -from gemnet.model.utils import write_json -from gemnet.training.data_container import DataContainer -from gemnet.training.data_provider import DataProvider -from gemnet.training.metrics import Metrics -from gemnet.training.trainer import Trainer - -os.environ["TF_CPP_MIN_LOG_LEVEL"] = "1" -os.environ["AUTOGRAPH_VERBOSITY"] = "1" - - -logger = logging.getLogger() -logger.handlers = [] -ch = logging.StreamHandler() -formatter = logging.Formatter( - fmt="%(asctime)s (%(levelname)s): %(message)s", datefmt="%Y-%m-%d %H:%M:%S" -) -ch.setFormatter(formatter) -logger.addHandler(ch) -logger.setLevel("INFO") - - -def run( - nBatches, - num_spherical, - num_radial, - num_blocks, - emb_size_atom, - emb_size_edge, - emb_size_trip, - emb_size_quad, - emb_size_rbf, - emb_size_cbf, - emb_size_sbf, - num_before_skip, - num_after_skip, - num_concat, - num_atom, - emb_size_bil_quad, - emb_size_bil_trip, - triplets_only, - forces_coupled, - direct_forces, - mve, - cutoff, - int_cutoff, - envelope_exponent, - extensive, - output_init, - scale_file, - data_seed, - val_dataset, - tfseed, - batch_size, - comment, - overwrite_mode=1, - **kwargs, -): - """ - Run this function to automatically fit all scaling factors in the network. - """ - paddle.seed(seed=tfseed) - - def init(scale_file): - preset = {"comment": comment} - write_json(scale_file, preset) - - if os.path.exists(scale_file): - print(f"Already found existing file: {scale_file}") - if str(overwrite_mode) == "1": - print("Selected: Overwrite the current file.") - init(scale_file) - elif str(overwrite_mode) == "2": - print("Selected: Only fit unfitted variables.") - else: - print("Selected: Exit script") - return - else: - init(scale_file) - AutomaticFit.set2fitmode() - logging.info("Initialize model") - model = GemNet( - num_spherical=num_spherical, - num_radial=num_radial, - num_blocks=num_blocks, - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_trip=emb_size_trip, - emb_size_quad=emb_size_quad, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - emb_size_sbf=emb_size_sbf, - num_before_skip=num_before_skip, - num_after_skip=num_after_skip, - num_concat=num_concat, - num_atom=num_atom, - emb_size_bil_quad=emb_size_bil_quad, - emb_size_bil_trip=emb_size_bil_trip, - num_targets=2 if mve else 1, - cutoff=cutoff, - int_cutoff=int_cutoff, - envelope_exponent=envelope_exponent, - forces_coupled=forces_coupled, - direct_forces=True, - triplets_only=triplets_only, - activation="swish", - extensive=extensive, - output_init=output_init, - scale_file=scale_file, - ) - logging.info("Load dataset") - val_data_container = DataContainer( - val_dataset, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only - ) - val_data_provider = DataProvider( - val_data_container, - 0, - nBatches * batch_size, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) - dataset_iter = val_data_provider.get_dataset("val") - logging.info("Prepare training") - trainer = Trainer(model, mve=mve) - metrics = Metrics("train", trainer.tracked_metrics, None) - logging.info("Start training") - while not AutomaticFit.fitting_completed(): - for step in trange(0, nBatches, desc="Training..."): - trainer.test_on_batch(dataset_iter, metrics) - current_var = AutomaticFit.activeVar - if current_var is not None: - current_var.fit() - else: - print("Found no variable to fit. Something went wrong!") - logging.info(f"\n Fitting done. Results saved to: {scale_file}") - - -if __name__ == "__main__": - config_path = "config.yaml" - with open("config.yaml", "r") as c: - config = yaml.safe_load(c) - for key, val in config.items(): - if type(val) is str: - try: - config[key] = ast.literal_eval(val) - except (ValueError, SyntaxError): - pass - nBatches = 25 - config["scale_file"] = "scaling_factors.json" - config["batch_size"] = 32 - config["direct_forces"] = True - config["triplets_only"] = False - run(nBatches, **config) diff --git a/materials_discovery/gemnet/model/gemnet.py b/materials_discovery/gemnet/model/gemnet.py deleted file mode 100644 index 55851e59..00000000 --- a/materials_discovery/gemnet/model/gemnet.py +++ /dev/null @@ -1,712 +0,0 @@ -import os -import sys - -import paddle - -from .layers.atom_update_block import OutputBlock -from .layers.base_layers import Dense -from .layers.basis_layers import BesselBasisLayer -from .layers.basis_layers import SphericalBasisLayer -from .layers.basis_layers import TensorBasisLayer -from .layers.efficient import EfficientInteractionDownProjection -from .layers.embedding_block import AtomEmbedding -from .layers.embedding_block import EdgeEmbedding -from .layers.interaction_block import InteractionBlock -from .layers.interaction_block import InteractionBlockTripletsOnly -from .layers.scaling import AutomaticFit -from .utils import scatter - -try: - os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" - import tensorflow as tf -except ImportError: - tf = None - -sys.path.append("/home/chenxiaoxu02/workspaces/gemnet_paddle/utils") - - -class GemNet(paddle.nn.Layer): - """ - Parameters - ---------- - num_spherical: int - Controls maximum frequency. - num_radial: int - Controls maximum frequency. - num_blocks: int - Number of building blocks to be stacked. - emb_size_atom: int - Embedding size of the atoms. - emb_size_edge: int - Embedding size of the edges. - emb_size_trip: int - (Down-projected) Embedding size in the triplet message passing block. - emb_size_quad: int - (Down-projected) Embedding size in the quadruplet message - passing block. - emb_size_rbf: int - Embedding size of the radial basis transformation. - emb_size_cbf: int - Embedding size of the circular basis transformation (one angle). - emb_size_sbf: int - Embedding size of the spherical basis transformation (two angles). - emb_size_bil_trip: int - Embedding size of the edge embeddings in the triplet-based message - passing block after the bilinear layer. - emb_size_bil_quad: int - Embedding size of the edge embeddings in the quadruplet-based - message passing block after the bilinear layer. - num_before_skip: int - Number of residual blocks before the first skip connection. - num_after_skip: int - Number of residual blocks after the first skip connection. - num_concat: int - Number of residual blocks after the concatenation. - num_atom: int - Number of residual blocks in the atom embedding blocks. - direct_forces: bool - If True predict forces based on aggregation of interatomic directions. - If False predict forces based on negative gradient of energy - potential. - triplets_only: bool - If True use GemNet-T or GemNet-dT.No quadruplet based message passing. - num_targets: int - Number of prediction targets. - cutoff: float - Embedding cutoff for interactomic directions in Angstrom. - int_cutoff: float - Interaction cutoff for interactomic directions in Angstrom. - No effect for GemNet-(d)T - envelope_exponent: int - Exponent of the envelope function. Determines the shape of the - smooth cutoff. - extensive: bool - Whether the output should be extensive (proportional to the - number of atoms) - forces_coupled: bool - No effect if direct_forces is False. If True enforce - that |F_ac| = |F_ca| - output_init: str - Initialization method for the final dense layer. - activation: str - Name of the activation function. - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - num_spherical: int, - num_radial: int, - num_blocks: int, - emb_size_atom: int, - emb_size_edge: int, - emb_size_trip: int, - emb_size_quad: int, - emb_size_rbf: int, - emb_size_cbf: int, - emb_size_sbf: int, - emb_size_bil_quad: int, - emb_size_bil_trip: int, - num_before_skip: int, - num_after_skip: int, - num_concat: int, - num_atom: int, - triplets_only: bool, - num_targets: int = 1, - direct_forces: bool = False, - cutoff: float = 5.0, - int_cutoff: float = 10.0, - envelope_exponent: int = 5, - extensive=True, - forces_coupled: bool = False, - output_init="HeOrthogonal", - activation: str = "swish", - scale_file=None, - name="gemnet", - **kwargs, - ): - super().__init__() - assert num_blocks > 0 - self.num_targets = num_targets - self.num_blocks = num_blocks - self.extensive = extensive - self.forces_coupled = forces_coupled - AutomaticFit.reset() - self.direct_forces = direct_forces - self.triplets_only = triplets_only - self.rbf_basis = BesselBasisLayer( - num_radial, cutoff=cutoff, envelope_exponent=envelope_exponent - ) - if not self.triplets_only: - self.cbf_basis = SphericalBasisLayer( - num_spherical, - num_radial, - cutoff=int_cutoff, - envelope_exponent=envelope_exponent, - efficient=False, - ) - self.sbf_basis = TensorBasisLayer( - num_spherical, - num_radial, - cutoff=cutoff, - envelope_exponent=envelope_exponent, - efficient=True, - ) - self.cbf_basis3 = SphericalBasisLayer( - num_spherical, - num_radial, - cutoff=cutoff, - envelope_exponent=envelope_exponent, - efficient=True, - ) - if not self.triplets_only: - self.mlp_rbf4 = Dense( - num_radial, - emb_size_rbf, - activation=None, - name="MLP_rbf4_shared", - bias=False, - ) - self.mlp_cbf4 = Dense( - num_radial * num_spherical, - emb_size_cbf, - activation=None, - name="MLP_cbf4_shared", - bias=False, - ) - self.mlp_sbf4 = EfficientInteractionDownProjection( - num_spherical**2, num_radial, emb_size_sbf, name="MLP_sbf4_shared" - ) - self.mlp_rbf3 = Dense( - num_radial, - emb_size_rbf, - activation=None, - name="MLP_rbf3_shared", - bias=False, - ) - self.mlp_cbf3 = EfficientInteractionDownProjection( - num_spherical, num_radial, emb_size_cbf, name="MLP_cbf3_shared" - ) - self.mlp_rbf_h = Dense( - num_radial, - emb_size_rbf, - activation=None, - name="MLP_rbfh_shared", - bias=False, - ) - self.mlp_rbf_out = Dense( - num_radial, - emb_size_rbf, - activation=None, - name="MLP_rbfout_shared", - bias=False, - ) - self.atom_emb = AtomEmbedding(emb_size_atom) - self.edge_emb = EdgeEmbedding( - emb_size_atom, num_radial, emb_size_edge, activation=activation - ) - out_blocks = [] - int_blocks = [] - interaction_block = ( - InteractionBlockTripletsOnly if self.triplets_only else InteractionBlock - ) - for i in range(num_blocks): - int_blocks.append( - interaction_block( - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_trip=emb_size_trip, - emb_size_quad=emb_size_quad, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - emb_size_sbf=emb_size_sbf, - emb_size_bil_trip=emb_size_bil_trip, - emb_size_bil_quad=emb_size_bil_quad, - num_before_skip=num_before_skip, - num_after_skip=num_after_skip, - num_concat=num_concat, - num_atom=num_atom, - activation=activation, - scale_file=scale_file, - name=f"IntBlock_{i + 1}", - ) - ) - for i in range(num_blocks + 1): - out_blocks.append( - OutputBlock( - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_rbf=emb_size_rbf, - nHidden=num_atom, - num_targets=num_targets, - activation=activation, - output_init=output_init, - direct_forces=direct_forces, - scale_file=scale_file, - name=f"OutBlock_{i}", - ) - ) - self.out_blocks = paddle.nn.LayerList(sublayers=out_blocks) - self.int_blocks = paddle.nn.LayerList(sublayers=int_blocks) - - @staticmethod - def calculate_interatomic_vectors(R, id_s, id_t): - """ - Parameters - ---------- - R: Tensor, shape = (nAtoms,3) - Atom positions. - id_s: Tensor, shape = (nEdges,) - Indices of the source atom of the edges. - id_t: Tensor, shape = (nEdges,) - Indices of the target atom of the edges. - - Returns - ------- - (D_st, V_st): tuple - D_st: Tensor, shape = (nEdges,) - Distance from atom t to s. - V_st: Tensor, shape = (nEdges,) - Unit direction from atom t to s. - """ - Rt = R[id_t] - Rs = R[id_s] - V_st = Rt - Rs - D_st = paddle.sqrt(x=paddle.sum(x=V_st**2, axis=1)) - V_st = V_st / D_st[..., None] - return D_st, V_st - - @staticmethod - def calculate_neighbor_angles(R_ac, R_ab): - """Calculate angles between atoms c <- a -> b. - - Parameters - ---------- - R_ac: Tensor, shape = (N,3) - Vector from atom a to c. - R_ab: Tensor, shape = (N,3) - Vector from atom a to b. - - Returns - ------- - angle_cab: Tensor, shape = (N,) - Angle between atoms c <- a -> b. - """ - x = paddle.sum(x=R_ac * R_ab, axis=1) - y = paddle.cross(x=R_ac, y=R_ab).norm(axis=-1) - y = paddle.maximum(y, paddle.to_tensor(data=1e-09)) - angle = paddle.atan2(x=y, y=x) - return angle - - @staticmethod - def vector_rejection(R_ab, P_n): - """ - Project the vector R_ab onto a plane with normal vector P_n. - - Parameters - ---------- - R_ab: Tensor, shape = (N,3) - Vector from atom a to b. - P_n: Tensor, shape = (N,3) - Normal vector of a plane onto which to project R_ab. - - Returns - ------- - R_ab_proj: Tensor, shape = (N,3) - Projected vector (orthogonal to P_n). - """ - a_x_b = paddle.sum(x=R_ab * P_n, axis=-1) - b_x_b = paddle.sum(x=P_n * P_n, axis=-1) - return R_ab - (a_x_b / b_x_b)[:, None] * P_n - - @staticmethod - def calculate_angles( - R, - id_c, - id_a, - id4_int_b, - id4_int_a, - id4_expand_abd, - id4_reduce_cab, - id4_expand_intm_db, - id4_reduce_intm_ca, - id4_expand_intm_ab, - id4_reduce_intm_ab, - ): - """Calculate angles for quadruplet-based message passing. - - Parameters - ---------- - R: Tensor, shape = (nAtoms,3) - Atom positions. - id_c: Tensor, shape = (nEdges,) - Indices of atom c (source atom of edge). - id_a: Tensor, shape = (nEdges,) - Indices of atom a (target atom of edge). - id4_int_b: torch.Tensor, shape (nInterEdges,) - Indices of the atom b of the interaction edge. - id4_int_a: torch.Tensor, shape (nInterEdges,) - Indices of the atom a of the interaction edge. - id4_expand_abd: torch.Tensor, shape (nQuadruplets,) - Indices to map from intermediate d->b to quadruplet d->b. - id4_reduce_cab: torch.Tensor, shape (nQuadruplets,) - Indices to map from intermediate c->a to quadruplet c->a. - id4_expand_intm_db: torch.Tensor, shape (intmTriplets,) - Indices to map d->b to intermediate d->b. - id4_reduce_intm_ca: torch.Tensor, shape (intmTriplets,) - Indices to map c->a to intermediate c->a. - id4_expand_intm_ab: torch.Tensor, shape (intmTriplets,) - Indices to map b-a to intermediate b-a of the quadruplet's - part a-b<-d. - id4_reduce_intm_ab: torch.Tensor, shape (intmTriplets,) - Indices to map b-a to intermediate b-a of the quadruplet's - part c->a-b. - - Returns - ------- - angle_cab: Tensor, shape = (nQuadruplets,) - Angle between atoms c <- a -> b. - angle_abd: Tensor, shape = (intmTriplets,) - Angle between atoms a <- b -> d. - angle_cabd: Tensor, shape = (nQuadruplets,) - Angle between atoms c <- a-b -> d. - """ - Ra = R[id4_int_a[id4_expand_intm_ab]] - Rb = R[id4_int_b[id4_expand_intm_ab]] - Rd = R[id_c[id4_expand_intm_db]] - R_ba = Ra - Rb - R_bd = Rd - Rb - angle_abd = GemNet.calculate_neighbor_angles(R_ba, R_bd) - R_bd_proj = GemNet.vector_rejection(R_bd, R_ba) - R_bd_proj = R_bd_proj[id4_expand_abd] - Rc = R[id_c[id4_reduce_intm_ca]] - Ra = R[id_a[id4_reduce_intm_ca]] - Rb = R[id4_int_b[id4_reduce_intm_ab]] - R_ac = Rc - Ra - R_ab = Rb - Ra - angle_cab = GemNet.calculate_neighbor_angles(R_ab, R_ac) - angle_cab = angle_cab[id4_reduce_cab] - R_ac_proj = GemNet.vector_rejection(R_ac, R_ab) - R_ac_proj = R_ac_proj[id4_reduce_cab] - angle_cabd = GemNet.calculate_neighbor_angles(R_ac_proj, R_bd_proj) - return angle_cab, angle_abd, angle_cabd - - @staticmethod - def calculate_angles3(R, id_c, id_a, id3_reduce_ca, id3_expand_ba): - """Calculate angles for triplet-based message passing. - - Parameters - ---------- - R: Tensor, shape = (nAtoms,3) - Atom positions. - id_c: Tensor, shape = (nEdges,) - Indices of atom c (source atom of edge). - id_a: Tensor, shape = (nEdges,) - Indices of atom a (target atom of edge). - id3_reduce_ca: Tensor, shape = (nTriplets,) - Edge indices of edge c -> a of the triplets. - id3_expand_ba: Tensor, shape = (nTriplets,) - Edge indices of edge b -> a of the triplets. - - Returns - ------- - angle_cab: Tensor, shape = (nTriplets,) - Angle between atoms c <- a -> b. - """ - Rc = R[id_c[id3_reduce_ca]] - Ra = R[id_a[id3_reduce_ca]] - Rb = R[id_c[id3_expand_ba]] - # print(R.shape, id_c.shape, id_a.shape, id3_reduce_ca.shape, id3_expand_ba.shape, Ra.shape, Rb.shape, Rc.shape) - # print(id_c, id3_reduce_ca) - R_ac = Rc - Ra - R_ab = Rb - Ra - return GemNet.calculate_neighbor_angles(R_ac, R_ab) - - def forward(self, inputs): - Z, R = inputs["Z"], inputs["R"] - id_a, id_c, id_undir, id_swap = ( - inputs["id_a"], - inputs["id_c"], - inputs["id_undir"], - inputs["id_swap"], - ) - id3_expand_ba, id3_reduce_ca = inputs["id3_expand_ba"], inputs["id3_reduce_ca"] - if not self.triplets_only: - batch_seg, Kidx4, Kidx3 = ( - inputs["batch_seg"], - inputs["Kidx4"], - inputs["Kidx3"], - ) - id4_int_b, id4_int_a = inputs["id4_int_b"], inputs["id4_int_a"] - # id4_reduce_ca, id4_expand_db = ( - # inputs["id4_reduce_ca"], - # inputs["id4_expand_db"], - # ) - id4_reduce_ca, _ = ( - inputs["id4_reduce_ca"], - inputs["id4_expand_db"], - ) - id4_reduce_cab, id4_expand_abd = ( - inputs["id4_reduce_cab"], - inputs["id4_expand_abd"], - ) - id4_reduce_intm_ca, id4_expand_intm_db = ( - inputs["id4_reduce_intm_ca"], - inputs["id4_expand_intm_db"], - ) - id4_reduce_intm_ab, id4_expand_intm_ab = ( - inputs["id4_reduce_intm_ab"], - inputs["id4_expand_intm_ab"], - ) - else: - batch_seg, Kidx4, Kidx3 = inputs["batch_seg"], None, inputs["Kidx3"] - id4_int_b, id4_int_a = None, None - # id4_reduce_ca, id4_expand_db = None, None - id4_reduce_ca = None - id4_reduce_cab, id4_expand_abd = None, None - id4_reduce_intm_ca, id4_expand_intm_db = None, None - id4_reduce_intm_ab, id4_expand_intm_ab = None, None - if not self.direct_forces: - inputs["R"].stop_gradient = not True - D_ca, V_ca = self.calculate_interatomic_vectors(R, id_c, id_a) - if not self.triplets_only: - D_ab, _ = self.calculate_interatomic_vectors(R, id4_int_b, id4_int_a) - Phi_cab, Phi_abd, Theta_cabd = self.calculate_angles( - R, - id_c, - id_a, - id4_int_b, - id4_int_a, - id4_expand_abd, - id4_reduce_cab, - id4_expand_intm_db, - id4_reduce_intm_ca, - id4_expand_intm_ab, - id4_reduce_intm_ab, - ) - cbf4 = self.cbf_basis(D_ab, Phi_abd, id4_expand_intm_ab, None) - sbf4 = self.sbf_basis(D_ca, Phi_cab, Theta_cabd, id4_reduce_ca, Kidx4) - rbf = self.rbf_basis(D_ca) - Angles3_cab = self.calculate_angles3( - R, id_c, id_a, id3_reduce_ca, id3_expand_ba - ) - cbf3 = self.cbf_basis3(D_ca, Angles3_cab, id3_reduce_ca, Kidx3) - h = self.atom_emb(Z) - m = self.edge_emb(h, rbf, id_c, id_a) - if not self.triplets_only: - rbf4 = self.mlp_rbf4(rbf) - cbf4 = self.mlp_cbf4(cbf4) - sbf4 = self.mlp_sbf4(sbf4) - else: - rbf4 = None - cbf4 = None - sbf4 = None - rbf3 = self.mlp_rbf3(rbf) - cbf3 = self.mlp_cbf3(cbf3) - rbf_h = self.mlp_rbf_h(rbf) - rbf_out = self.mlp_rbf_out(rbf) - E_a, F_ca = self.out_blocks[0](h, m, rbf_out, id_a) - for i in range(self.num_blocks): - h, m = self.int_blocks[i]( - h=h, - m=m, - rbf4=rbf4, - cbf4=cbf4, - sbf4=sbf4, - Kidx4=Kidx4, - rbf3=rbf3, - cbf3=cbf3, - Kidx3=Kidx3, - id_swap=id_swap, - id3_expand_ba=id3_expand_ba, - id3_reduce_ca=id3_reduce_ca, - id4_reduce_ca=id4_reduce_ca, - id4_expand_intm_db=id4_expand_intm_db, - id4_expand_abd=id4_expand_abd, - rbf_h=rbf_h, - id_c=id_c, - id_a=id_a, - ) - E, F = self.out_blocks[i + 1](h, m, rbf_out, id_a) - F_ca += F - E_a += E - nMolecules = paddle.max(x=batch_seg) + 1 - if self.extensive: - E_a = scatter(E_a, batch_seg, dim=0, dim_size=nMolecules, - reduce='add') - else: - E_a = scatter(E_a, batch_seg, dim=0, dim_size=nMolecules, - reduce='mean') - if self.direct_forces: - nAtoms = tuple(Z.shape)[0] - if self.forces_coupled: - nEdges = tuple(id_c.shape)[0] - F_ca = scatter( - F_ca, id_undir, dim=0, dim_size=int(nEdges / 2), reduce="mean" - ) - F_ca = F_ca[id_undir] - F_ji = F_ca[:, :, None] * V_ca[:, None, :] - F_j = scatter(F_ji, id_a, dim=0, dim_size=nAtoms, reduce="add") - else: - if self.num_targets > 1: - forces = [] - for i in range(self.num_targets): - forces += [ - -paddle.grad( - outputs=E_a[:, i].sum(), - inputs=inputs["R"], - create_graph=True, - )[0] - ] - F_j = paddle.stack(x=forces, axis=1) - else: - F_j = -paddle.grad( - outputs=E_a.sum(), inputs=inputs["R"], create_graph=True - )[0] - inputs["R"].stop_gradient = not False - return E_a, F_j - - def load_tfmodel(self, path): - reader = tf.train.load_checkpoint(path) - - def copy_(src, name): - W = reader.get_tensor(f"{name}/.ATTRIBUTES/VARIABLE_VALUE") - if name[-12:] == "scale_factor": - W = paddle.to_tensor(data=W) - else: - W = paddle.to_tensor(data=W) - if name[-6:] == "kernel": - if len(tuple(W.shape)) == 2: - W = W.t() - src.data.copy_(W) - - copy_(self.rbf_basis.frequencies, "rbf_basis/frequencies") - copy_(self.atom_emb.embeddings.weight, "atom_emb/embeddings") - copy_(self.edge_emb.dense.weight, "edge_emb/dense/kernel") - shared_mlps = ["mlp_cbf3", "mlp_rbf3", "mlp_rbf_h", "mlp_rbf_out"] - if not self.triplets_only: - shared_mlps += ["mlp_rbf4", "mlp_cbf4", "mlp_sbf4"] - for layer in shared_mlps: - copy_(getattr(self, layer).weight, f"{layer}/kernel") - for i, block in enumerate(self.int_blocks): - if not self.triplets_only: - for layer in [ - "dense_db", - "mlp_rbf", - "mlp_cbf", - "mlp_sbf", - "down_projection", - "up_projection_ca", - "up_projection_ac", - ]: - copy_( - getattr(block.quad_interaction, layer).weight, - f"int_blocks/{i}/quad_interaction/{layer}/kernel", - ) - for layer in ["rbf", "cbf", "sbf_sum"]: - copy_( - getattr(block.quad_interaction, f"scale_{layer}").scale_factor, - f"""int_blocks/{i}/quad_interaction - /scale_{layer}/scale_factor""", - ) - for layer in [ - "dense_ba", - "mlp_rbf", - "mlp_cbf", - "down_projection", - "up_projection_ac", - "up_projection_ca", - ]: - copy_( - getattr(block.trip_interaction, layer).weight, - f"int_blocks/{i}/trip_interaction/{layer}/kernel", - ) - for layer in ["rbf", "cbf_sum"]: - copy_( - getattr(block.trip_interaction, f"scale_{layer}").scale_factor, - f"int_blocks/{i}/trip_interaction/scale_{layer}/scale_factor", - ) - copy_( - block.atom_update.dense_rbf.weight, - f"int_blocks/{i}/atom_update/dense_rbf/kernel", - ) - copy_( - block.atom_update.scale_sum.scale_factor, - f"int_blocks/{i}/atom_update/scale_sum/scale_factor", - ) - copy_( - block.atom_update.layers[0].weight, - f"int_blocks/{i}/atom_update/layers/0/kernel", - ) - for j, res_layer in enumerate(block.atom_update.layers[1:]): - j = j + 1 - for k, layer in enumerate(res_layer.dense_mlp): - copy_( - layer.weight, - f"int_blocks/{i}/atom_update/layers/{j}/dense_mlp/layer_with_weights-{k}/kernel", - ) - copy_( - block.concat_layer.dense.weight, - f"int_blocks/{i}/concat_layer/dense/kernel", - ) - copy_(block.dense_ca.weight, f"int_blocks/{i}/dense_ca/kernel") - for j, res_layer in enumerate(block.layers_after_skip): - for k, layer in enumerate(res_layer.dense_mlp): - copy_( - layer.weight, - f"int_blocks/{i}/layers_after_skip/{j}/dense_mlp/layer_with_weights-{k}/kernel", - ) - for j, res_layer in enumerate(block.layers_before_skip): - for k, layer in enumerate(res_layer.dense_mlp): - copy_( - layer.weight, - f"int_blocks/{i}/layers_before_skip/{j}/dense_mlp/layer_with_weights-{k}/kernel", - ) - for j, res_layer in enumerate(block.residual_m): - for k, layer in enumerate(res_layer.dense_mlp): - copy_( - layer.weight, - f"int_blocks/{i}/residual_m/{j}/dense_mlp/layer_with_weights-{k}/kernel", - ) - for i, block in enumerate(self.out_blocks): - copy_(block.dense_rbf.weight, f"out_blocks/{i}/dense_rbf/kernel") - copy_(block.layers[0].weight, f"out_blocks/{i}/layers/0/kernel") - for j, res_layer in enumerate(block.layers[1:]): - j = j + 1 - for k, layer in enumerate(res_layer.dense_mlp): - copy_( - layer.weight, - f"out_blocks/{i}/layers/{j}/dense_mlp/layer_with_weights-{k}/kernel", - ) - copy_(block.out_energy.weight, f"out_blocks/{i}/out_energy/kernel") - copy_( - block.scale_sum.scale_factor, f"out_blocks/{i}/scale_sum/scale_factor" - ) - if self.direct_forces: - copy_(block.out_forces.weight, f"out_blocks/{i}/out_forces/kernel") - copy_(block.out_forces.bias, f"out_blocks/{i}/out_forces/bias") - copy_(block.seq_forces[0].weight, f"out_blocks/{i}/seq_forces/0/kernel") - copy_( - block.scale_rbf.scale_factor, - f"out_blocks/{i}/scale_rbf/scale_factor", - ) - for j, res_layer in enumerate(block.seq_forces[1:]): - j = j + 1 - for k, layer in enumerate(res_layer.dense_mlp): - copy_( - layer.weight, - f"out_blocks/{i}/seq_forces/{j}/dense_mlp/layer_with_weights-{k}/kernel", - ) - - def predict(self, inputs): - E, F = self(inputs) - E = E.detach().cpu() - F = F.detach().cpu() - return E, F - - def load_weights(self, path): - self.set_state_dict(state_dict=paddle.load(path=path)) - - def save_weights(self, path): - paddle.save(obj=self.state_dict(), path=path) diff --git a/materials_discovery/gemnet/model/initializers.py b/materials_discovery/gemnet/model/initializers.py deleted file mode 100644 index 78bef98a..00000000 --- a/materials_discovery/gemnet/model/initializers.py +++ /dev/null @@ -1,45 +0,0 @@ -import functools -import operator - -import paddle - - -def _standardize(kernel): - """ - Makes sure that Var(W) = 1 and E[W] = 0 - """ - eps = 1e-06 - if len(tuple(kernel.shape)) == 3: - axis = [0, 1] - else: - axis = 0 - var, mean = tuple( - [ - paddle.var(kernel, axis=axis, unbiased=True, keepdim=True), - paddle.mean(kernel, axis=axis, keepdim=True), - ] - ) - kernel = (kernel - mean) / (var + eps) ** 0.5 - return kernel - - -def he_orthogonal_init(tensor): - """ - Generate a weight matrix with variance according to He initialization. - Based on a random (semi-)orthogonal matrix neural networks - are expected to learn better when features are decorrelated - (stated by eg. "Reducing overfitting in deep networks by decorrelating representations", - "Dropout: a simple way to prevent neural networks from overfitting", - "Exact solutions to the nonlinear dynamics of learning in deep linear neural networks") - """ - init_Orthogonal = paddle.nn.initializer.Orthogonal() - init_Orthogonal(tensor) - if len(tuple(tensor.shape)) == 3: - fan_in = functools.reduce(operator.mul, tuple(tensor.shape)[:-1], 1) - - else: - fan_in = tuple(tensor.shape)[0] - with paddle.no_grad(): - tensor.data = _standardize(tensor.data) - tensor.data *= (1 / fan_in) ** 0.5 - return tensor diff --git a/materials_discovery/gemnet/model/layers/atom_update_block.py b/materials_discovery/gemnet/model/layers/atom_update_block.py deleted file mode 100644 index 271f952d..00000000 --- a/materials_discovery/gemnet/model/layers/atom_update_block.py +++ /dev/null @@ -1,173 +0,0 @@ -import paddle - -from ..initializers import he_orthogonal_init -from .base_layers import Dense -from .base_layers import ResidualLayer -from .scaling import ScalingFactor -from ..utils import scatter - - -class AtomUpdateBlock(paddle.nn.Layer): - """ - Aggregate the message embeddings of the atoms - - Parameters - ---------- - emb_size_atom: int - Embedding size of the atoms. - emb_size_edge: int - Embedding size of the edge embeddings. - nHidden: int - Number of residual blocks. - activation: callable/str - Activation function to use in the dense layers. - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - emb_size_atom: int, - emb_size_edge: int, - emb_size_rbf: int, - nHidden: int, - activation=None, - scale_file=None, - name: str = "atom_update", - ): - super().__init__() - self.name = name - self.emb_size_edge = emb_size_edge - self.dense_rbf = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) - self.scale_sum = ScalingFactor(scale_file=scale_file, name=name + "_sum") - self.layers = self.get_mlp(emb_size_atom, nHidden, activation) - - def get_mlp(self, units, nHidden, activation): - dense1 = Dense(self.emb_size_edge, units, activation=activation, bias=False) - res = [ - ResidualLayer(units, nLayers=2, activation=activation) - for i in range(nHidden) - ] - mlp = [dense1] + res - return paddle.nn.LayerList(sublayers=mlp) - - def forward(self, h, m, rbf, id_j): - """ - Returns - ------- - h: Tensor, shape=(nAtoms, emb_size_atom) - Atom embedding. - """ - nAtoms = tuple(h.shape)[0] - mlp_rbf = self.dense_rbf(rbf) - x = m * mlp_rbf - x2 = scatter(x, id_j, dim=0, dim_size=nAtoms, reduce='add') - x = self.scale_sum(m, x2) - for i, layer in enumerate(self.layers): - x = layer(x) - return x - - -class OutputBlock(AtomUpdateBlock): - """ - Combines the atom update block and subsequent final dense layer. - - Parameters - ---------- - emb_size_atom: int - Embedding size of the atoms. - emb_size_edge: int - Embedding size of the edge embeddings. - nHidden: int - Number of residual blocks. - num_targets: int - Number of targets. - activation: str - Activation function to use in the dense layers (except for the - final dense layer). - direct_forces: bool - If true directly predict forces without taking the gradient of - the energy potential. - output_init: str - Kernel initializer of the final dense layer. - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - emb_size_atom: int, - emb_size_edge: int, - emb_size_rbf: int, - nHidden: int, - num_targets: int, - activation=None, - direct_forces=True, - output_init="HeOrthogonal", - scale_file=None, - name: str = "output", - **kwargs, - ): - super().__init__( - name=name, - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_rbf=emb_size_rbf, - nHidden=nHidden, - activation=activation, - scale_file=scale_file, - **kwargs, - ) - assert isinstance(output_init, str) - self.output_init = output_init - self.direct_forces = direct_forces - self.dense_rbf = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) - self.seq_energy = self.layers - self.out_energy = Dense(emb_size_atom, num_targets, bias=False, activation=None) - if self.direct_forces: - self.scale_rbf = ScalingFactor(scale_file=scale_file, name=name + "_had") - self.seq_forces = self.get_mlp(emb_size_edge, nHidden, activation) - self.out_forces = Dense( - emb_size_edge, num_targets, bias=False, activation=None - ) - self.reset_parameters() - - def reset_parameters(self): - if self.output_init.lower() == "heorthogonal": - he_orthogonal_init(self.out_energy.weight) - if self.direct_forces: - he_orthogonal_init(self.out_forces.weight) - elif self.output_init.lower() == "zeros": - init_Constant = paddle.nn.initializer.Constant(value=0.0) - init_Constant(self.out_energy.weight) - if self.direct_forces: - init_Constant = paddle.nn.initializer.Constant(value=0.0) - init_Constant(self.out_forces.weight) - else: - raise UserWarning(f"Unknown output_init: {self.output_init}") - - def forward(self, h, m, rbf, id_j): - """ - Returns - ------- - (E, F): tuple - - E: Tensor, shape=(nAtoms, num_targets) - - F: Tensor, shape=(nEdges, num_targets) - Energy and force prediction - """ - nAtoms = tuple(h.shape)[0] - rbf_mlp = self.dense_rbf(rbf) - x = m * rbf_mlp - x_E = scatter(x, id_j, dim=0, dim_size=nAtoms, reduce='add') - x_E = self.scale_sum(m, x_E) - for i, layer in enumerate(self.seq_energy): - x_E = layer(x_E) - x_E = self.out_energy(x_E) - if self.direct_forces: - x_F = self.scale_rbf(m, x) - for i, layer in enumerate(self.seq_forces): - x_F = layer(x_F) - x_F = self.out_forces(x_F) - else: - x_F = 0 - return x_E, x_F diff --git a/materials_discovery/gemnet/model/layers/base_layers.py b/materials_discovery/gemnet/model/layers/base_layers.py deleted file mode 100644 index 1d49abd5..00000000 --- a/materials_discovery/gemnet/model/layers/base_layers.py +++ /dev/null @@ -1,90 +0,0 @@ -import paddle - -from ..initializers import he_orthogonal_init - - -class Dense(paddle.nn.Layer): - """ - Combines dense layer and scaling for swish activation. - - Parameters - ---------- - units: int - Output embedding size. - activation: str - Name of the activation function to use. - bias: bool - True if use bias. - """ - - def __init__( - self, in_features, out_features, bias=False, activation=None, name=None - ): - super().__init__() - self.linear = paddle.nn.Linear( - in_features=in_features, out_features=out_features, bias_attr=bias - ) - self.reset_parameters() - self.weight = self.linear.weight - self.bias = self.linear.bias - if isinstance(activation, str): - activation = activation.lower() - if activation in ["swish", "silu"]: - self._activation = ScaledSiLU() - elif activation is None: - self._activation = paddle.nn.Identity() - else: - raise NotImplementedError( - "Activation function not implemented for GemNet (yet)." - ) - - def reset_parameters(self): - he_orthogonal_init(self.linear.weight) - if self.linear.bias is not None: - self.linear.bias.data.fill_(value=0) - - def forward(self, x): - x = self.linear(x) - x = self._activation(x) - return x - - -class ScaledSiLU(paddle.nn.Layer): - def __init__(self): - super().__init__() - self.scale_factor = 1 / 0.6 - self._activation = paddle.nn.Silu() - - def forward(self, x): - return self._activation(x) * self.scale_factor - - -class ResidualLayer(paddle.nn.Layer): - """ - Residual block with output scaled by 1/sqrt(2). - - Parameters - ---------- - units: int - Output embedding size. - nLayers: int - Number of dense layers. - activation: str - Name of the activation function to use. - """ - - def __init__(self, units: int, nLayers: int = 2, activation=None, name=None): - super().__init__() - self.dense_mlp = paddle.nn.Sequential( - *[ - Dense(units, units, activation=activation, bias=False) - for i in range(nLayers) - ] - ) - self.inv_sqrt_2 = 1 / 2.0**0.5 - - def forward(self, inputs): - x = self.dense_mlp(inputs) - x = inputs + x - x = x * self.inv_sqrt_2 - return x diff --git a/materials_discovery/gemnet/model/layers/basis_layers.py b/materials_discovery/gemnet/model/layers/basis_layers.py deleted file mode 100644 index 66ea5458..00000000 --- a/materials_discovery/gemnet/model/layers/basis_layers.py +++ /dev/null @@ -1,273 +0,0 @@ -import sys - -import numpy as np -import paddle -import sympy as sym - -from .basis_utils import bessel_basis -from .basis_utils import real_sph_harm -from .envelope import Envelope - -sys.path.append("/home/chenxiaoxu02/workspaces/gemnet_paddle/utils") - - -class BesselBasisLayer(paddle.nn.Layer): - """ - 1D Bessel Basis - - Parameters - ---------- - num_radial: int - Controls maximum frequency. - cutoff: float - Cutoff distance in Angstrom. - envelope_exponent: int = 5 - Exponent of the envelope function. - """ - - def __init__( - self, - num_radial: int, - cutoff: float, - envelope_exponent: int = 5, - name="bessel_basis", - ): - super().__init__() - self.num_radial = num_radial - self.inv_cutoff = 1 / cutoff - self.norm_const = (2 * self.inv_cutoff) ** 0.5 - self.envelope = Envelope(envelope_exponent) - out_0 = paddle.create_parameter( - shape=paddle.to_tensor( - data=np.pi * np.arange(1, self.num_radial + 1, dtype=np.float32), - dtype="float32", - ).shape, - dtype=paddle.to_tensor( - data=np.pi * np.arange(1, self.num_radial + 1, dtype=np.float32), - dtype="float32", - ) - .numpy() - .dtype, - default_initializer=paddle.nn.initializer.Assign( - paddle.to_tensor( - data=np.pi * np.arange(1, self.num_radial + 1, dtype=np.float32), - dtype="float32", - ) - ), - ) - out_0.stop_gradient = not True - self.frequencies = out_0 - - def forward(self, d): - d = d[:, None] - d_scaled = d * self.inv_cutoff - env = self.envelope(d_scaled) - return env * self.norm_const * paddle.sin(x=self.frequencies * d_scaled) / d - - -class SphericalBasisLayer(paddle.nn.Layer): - """ - 2D Fourier Bessel Basis - - Parameters - ---------- - num_spherical: int - Controls maximum frequency. - num_radial: int - Controls maximum frequency. - cutoff: float - Cutoff distance in Angstrom. - envelope_exponent: int = 5 - Exponent of the envelope function. - efficient: bool - Whether to use the (memory) efficient implementation or not. - """ - - def __init__( - self, - num_spherical: int, - num_radial: int, - cutoff: float, - envelope_exponent: int = 5, - efficient: bool = False, - name: str = "spherical_basis", - ): - super().__init__() - assert num_radial <= 64 - self.efficient = efficient - self.num_radial = num_radial - self.num_spherical = num_spherical - self.envelope = Envelope(envelope_exponent) - self.inv_cutoff = 1 / cutoff - bessel_formulas = bessel_basis(num_spherical, num_radial) - Y_lm = real_sph_harm( - num_spherical, spherical_coordinates=True, zero_m_only=True - ) - self.sph_funcs = [] - self.bessel_funcs = [] - self.norm_const = self.inv_cutoff**1.5 - self.register_buffer( - name="device_buffer", tensor=paddle.zeros(shape=[0]), persistable=False - ) - x = sym.symbols("x") - theta = sym.symbols("theta") - modules = {"sin": paddle.sin, "cos": paddle.cos, "sqrt": paddle.sqrt} - m = 0 - for l in range(len(Y_lm)): - if l == 0: - first_sph = sym.lambdify([theta], Y_lm[l][m], modules) - self.sph_funcs.append( - lambda theta: paddle.zeros_like(x=theta) + first_sph(theta) - ) - else: - self.sph_funcs.append(sym.lambdify([theta], Y_lm[l][m], modules)) - for n in range(num_radial): - self.bessel_funcs.append( - sym.lambdify([x], bessel_formulas[l][n], modules) - ) - - def forward(self, D_ca, Angle_cab, id3_reduce_ca, Kidx): - d_scaled = D_ca * self.inv_cutoff - u_d = self.envelope(d_scaled) - rbf = [f(d_scaled) for f in self.bessel_funcs] - rbf = paddle.stack(x=rbf, axis=1) - rbf = rbf * self.norm_const - rbf_env = u_d[:, None] * rbf - sph = [f(Angle_cab) for f in self.sph_funcs] - sph = paddle.stack(x=sph, axis=1) - if not self.efficient: - rbf_env = rbf_env[id3_reduce_ca] - # rbf_env = rbf_env.view(-1, self.num_spherical, self.num_radial) - rbf_env = rbf_env.reshape([-1, self.num_spherical, self.num_radial]) - # sph = sph.view(-1, self.num_spherical, 1) - sph = sph.reshape([-1, self.num_spherical, 1]) - # out = (rbf_env * sph).view(-1, self.num_spherical * self.num_radial) - out = (rbf_env * sph).reshape([-1, self.num_spherical * self.num_radial]) - return out - else: - # rbf_env = rbf_env.view(-1, self.num_spherical, self.num_radial) - rbf_env = rbf_env.reshape((-1, self.num_spherical, self.num_radial)) - x = rbf_env - perm_0 = list(range(x.ndim)) - perm_0[0] = 1 - perm_0[1] = 0 - rbf_env = paddle.transpose(x=x, perm=perm_0) - Kmax = ( - 0 - if tuple(sph.shape)[0] == 0 - else paddle.maximum(paddle.max(x=Kidx + 1), paddle.to_tensor(data=0)) - ) - nEdges = tuple(d_scaled.shape)[0] - sph2 = paddle.zeros( - shape=[nEdges, Kmax, self.num_spherical], dtype=sph.dtype - ) - sph2[id3_reduce_ca, Kidx] = sph - return rbf_env, sph2 - - -class TensorBasisLayer(paddle.nn.Layer): - """ - 3D Fourier Bessel Basis - - Parameters - ---------- - num_spherical: int - Controls maximum frequency. - num_radial: int - Controls maximum frequency. - cutoff: float - Cutoff distance in Angstrom. - envelope_exponent: int = 5 - Exponent of the envelope function. - efficient: bool - Whether to use the (memory) efficient implementation or not. - """ - - def __init__( - self, - num_spherical: int, - num_radial: int, - cutoff: float, - envelope_exponent: int = 5, - efficient=False, - name: str = "tensor_basis", - ): - super().__init__() - assert num_radial <= 64 - self.num_radial = num_radial - self.num_spherical = num_spherical - self.efficient = efficient - self.inv_cutoff = 1 / cutoff - self.envelope = Envelope(envelope_exponent) - bessel_formulas = bessel_basis(num_spherical, num_radial) - Y_lm = real_sph_harm( - num_spherical, spherical_coordinates=True, zero_m_only=False - ) - self.sph_funcs = [] - self.bessel_funcs = [] - self.norm_const = self.inv_cutoff**1.5 - x = sym.symbols("x") - theta = sym.symbols("theta") - phi = sym.symbols("phi") - modules = {"sin": paddle.sin, "cos": paddle.cos, "sqrt": paddle.sqrt} - for l in range(len(Y_lm)): - for m in range(len(Y_lm[l])): - if l == 0: - first_sph = sym.lambdify([theta, phi], Y_lm[l][m], modules) - self.sph_funcs.append( - lambda theta, phi: paddle.zeros_like(x=theta) - + first_sph(theta, phi) - ) - else: - self.sph_funcs.append( - sym.lambdify([theta, phi], Y_lm[l][m], modules) - ) - for j in range(num_radial): - self.bessel_funcs.append( - sym.lambdify([x], bessel_formulas[l][j], modules) - ) - self.register_buffer( - name="degreeInOrder", - tensor=paddle.arange(end=num_spherical) * 2 + 1, - persistable=False, - ) - - def forward(self, D_ca, Alpha_cab, Theta_cabd, id4_reduce_ca, Kidx): - d_scaled = D_ca * self.inv_cutoff - u_d = self.envelope(d_scaled) - rbf = [f(d_scaled) for f in self.bessel_funcs] - rbf = paddle.stack(x=rbf, axis=1) - rbf = rbf * self.norm_const - rbf_env = u_d[:, None] * rbf - # rbf_env = rbf_env.view((-1, self.num_spherical, self.num_radial)) - rbf_env = rbf_env.reshape((-1, self.num_spherical, self.num_radial)) - rbf_env = paddle.repeat_interleave( - x=rbf_env, repeats=self.degreeInOrder, axis=1 - ) - if not self.efficient: - # rbf_env = rbf_env.view((-1, self.num_spherical**2 * self.num_radial)) - rbf_env = rbf_env.reshape((-1, self.num_spherical**2 * self.num_radial)) - rbf_env = rbf_env[id4_reduce_ca] - sph = [f(Alpha_cab, Theta_cabd) for f in self.sph_funcs] - sph = paddle.stack(x=sph, axis=1) - if not self.efficient: - # >>>>>> sph = torch.repeat_interleave(sph, self.num_radial, axis=1) - sph = paddle.repeat_interleave(sph, self.num_radial, axis=1) - return rbf_env * sph - else: - x = rbf_env - perm_1 = list(range(x.ndim)) - perm_1[0] = 1 - perm_1[1] = 0 - rbf_env = paddle.transpose(x=x, perm=perm_1) - Kmax = ( - 0 - if tuple(sph.shape)[0] == 0 - else paddle.maximum(paddle.max(x=Kidx + 1), paddle.to_tensor(data=0)) - ) - nEdges = tuple(d_scaled.shape)[0] - sph2 = paddle.zeros( - shape=[nEdges, Kmax, self.num_spherical**2], dtype=sph.dtype - ) - sph2[id4_reduce_ca, Kidx] = sph - return rbf_env, sph2 diff --git a/materials_discovery/gemnet/model/layers/basis_utils.py b/materials_discovery/gemnet/model/layers/basis_utils.py deleted file mode 100644 index ecc9e21e..00000000 --- a/materials_discovery/gemnet/model/layers/basis_utils.py +++ /dev/null @@ -1,230 +0,0 @@ -import numpy as np -import sympy as sym -from scipy import special as sp -from scipy.optimize import brentq - - -def Jn(r, n): - """ - numerical spherical bessel functions of order n - """ - return sp.spherical_jn(n, r) - - -def Jn_zeros(n, k): - """ - Compute the first k zeros of the spherical bessel functions up to order - n (excluded) - """ - zerosj = np.zeros((n, k), dtype="float32") - zerosj[0] = np.arange(1, k + 1) * np.pi - points = np.arange(1, k + n) * np.pi - racines = np.zeros(k + n - 1, dtype="float32") - for i in range(1, n): - for j in range(k + n - 1 - i): - foo = brentq(Jn, points[j], points[j + 1], (i,)) - racines[j] = foo - points = racines - zerosj[i][:k] = racines[:k] - return zerosj - - -def spherical_bessel_formulas(n): - """ - Computes the sympy formulas for the spherical bessel functions up to order n (excluded) - """ - x = sym.symbols("x") - j = [sym.sin(x) / x] - a = sym.sin(x) / x - for i in range(1, n): - b = sym.diff(a, x) / x - j += [sym.simplify(b * (-x) ** i)] - a = sym.simplify(b) - return j - - -def bessel_basis(n, k): - """ - Compute the sympy formulas for the normalized and rescaled spherical bessel functions up to - order n (excluded) and maximum frequency k (excluded). - - Returns: - bess_basis: list - Bessel basis formulas taking in a single argument x. - Has length n where each element has length k. -> In total n*k many. - """ - zeros = Jn_zeros(n, k) - normalizer = [] - for order in range(n): - normalizer_tmp = [] - for i in range(k): - normalizer_tmp += [0.5 * Jn(zeros[order, i], order + 1) ** 2] - normalizer_tmp = 1 / np.array(normalizer_tmp) ** 0.5 - normalizer += [normalizer_tmp] - f = spherical_bessel_formulas(n) - x = sym.symbols("x") - bess_basis = [] - for order in range(n): - bess_basis_tmp = [] - for i in range(k): - bess_basis_tmp += [ - sym.simplify( - normalizer[order][i] * f[order].subs(x, zeros[order, i] * x) - ) - ] - bess_basis += [bess_basis_tmp] - return bess_basis - - -def sph_harm_prefactor(l, m): - """Computes the constant pre-factor for the spherical harmonic of degree l and order m. - - Parameters - ---------- - l: int - Degree of the spherical harmonic. l >= 0 - m: int - Order of the spherical harmonic. -l <= m <= l - - Returns - ------- - factor: float - - """ - return ( - (2 * l + 1) - / (4 * np.pi) - * np.math.factorial(l - abs(m)) - / np.math.factorial(l + abs(m)) - ) ** 0.5 - - -def associated_legendre_polynomials(L, zero_m_only=True, pos_m_only=True): - """Computes string formulas of the associated legendre polynomials up to - degree L (excluded). - - Parameters - ---------- - L: int - Degree up to which to calculate the associated legendre polynomials - (degree L is excluded). - zero_m_only: bool - If True only calculate the polynomials for the polynomials where - m=0. - pos_m_only: bool - If True only calculate the polynomials for the polynomials where - m>=0. Overwritten by zero_m_only. - - Returns - ------- - polynomials: list - Contains the sympy functions of the polynomials (in total L many - if zero_m_only is True else L^2 many). - """ - z = sym.symbols("z") - P_l_m = [([0] * (2 * l + 1)) for l in range(L)] - P_l_m[0][0] = 1 - if L > 0: - if zero_m_only: - P_l_m[1][0] = z - for l in range(2, L): - P_l_m[l][0] = sym.simplify( - ((2 * l - 1) * z * P_l_m[l - 1][0] - (l - 1) * P_l_m[l - 2][0]) / l - ) - return P_l_m - else: - for l in range(1, L): - P_l_m[l][l] = sym.simplify( - (1 - 2 * l) * (1 - z**2) ** 0.5 * P_l_m[l - 1][l - 1] - ) - for m in range(0, L - 1): - P_l_m[m + 1][m] = sym.simplify((2 * m + 1) * z * P_l_m[m][m]) - for l in range(2, L): - for m in range(l - 1): - P_l_m[l][m] = sym.simplify( - ( - (2 * l - 1) * z * P_l_m[l - 1][m] - - (l + m - 1) * P_l_m[l - 2][m] - ) - / (l - m) - ) - if not pos_m_only: - for l in range(1, L): - for m in range(1, l + 1): - P_l_m[l][-m] = sym.simplify( - (-1) ** m - * np.math.factorial(l - m) - / np.math.factorial(l + m) - * P_l_m[l][m] - ) - return P_l_m - - -def real_sph_harm(L, spherical_coordinates, zero_m_only=True): - """ - Computes formula strings of the the real part of the spherical harmonics up - to degree L (excluded). Variables are either spherical coordinates phi and - theta (or cartesian coordinates x,y,z) on the UNIT SPHERE. - - Parameters - ---------- - L: int - Degree up to which to calculate the spherical harmonics - (degree L is excluded). - spherical_coordinates: bool - - True: Expects the input of the formula strings to be phi and - theta. - - False: Expects the input of the formula strings to be x, y - and z. - zero_m_only: bool - If True only calculate the harmonics where m=0. - - Returns - ------- - Y_lm_real: list - Computes formula strings of the the real part of the spherical - harmonics up to degree L (where degree L is not excluded). - In total L^2 many sph harm exist up to degree L (excluded). - However, if zero_m_only only is True then the total count is - reduced to be only L many. - """ - z = sym.symbols("z") - P_l_m = associated_legendre_polynomials(L, zero_m_only) - if zero_m_only: - Y_l_m = [[0] for l in range(L)] - else: - Y_l_m = [([0] * (2 * l + 1)) for l in range(L)] - if spherical_coordinates: - theta = sym.symbols("theta") - for l in range(L): - for m in range(len(P_l_m[l])): - if not isinstance(P_l_m[l][m], int): - P_l_m[l][m] = P_l_m[l][m].subs(z, sym.cos(theta)) - for l in range(L): - Y_l_m[l][0] = sym.simplify(sph_harm_prefactor(l, 0) * P_l_m[l][0]) - if not zero_m_only: - phi = sym.symbols("phi") - for l in range(1, L): - for m in range(1, l + 1): - Y_l_m[l][m] = sym.simplify( - 2**0.5 - * (-1) ** m - * sph_harm_prefactor(l, m) - * P_l_m[l][m] - * sym.cos(m * phi) - ) - for m in range(1, l + 1): - Y_l_m[l][-m] = sym.simplify( - 2**0.5 - * (-1) ** m - * sph_harm_prefactor(l, -m) - * P_l_m[l][m] - * sym.sin(m * phi) - ) - if not spherical_coordinates: - x = sym.symbols("x") - y = sym.symbols("y") - for l in range(L): - for m in range(len(Y_l_m[l])): - Y_l_m[l][m] = sym.simplify(Y_l_m[l][m].subs(phi, sym.atan2(y, x))) - return Y_l_m diff --git a/materials_discovery/gemnet/model/layers/efficient.py b/materials_discovery/gemnet/model/layers/efficient.py deleted file mode 100644 index aabce70f..00000000 --- a/materials_discovery/gemnet/model/layers/efficient.py +++ /dev/null @@ -1,197 +0,0 @@ -import sys - -import paddle - -from ..initializers import he_orthogonal_init - -sys.path.append("/home/chenxiaoxu02/workspaces/gemnet_paddle/utils") - - -class EfficientInteractionDownProjection(paddle.nn.Layer): - """ - Down projection in the efficient reformulation. - - Parameters - ---------- - num_spherical: int - Same as the setting in the basis layers. - num_radial: int - Same as the setting in the basis layers. - emb_size_interm: int - Intermediate embedding size (down-projection size). - """ - - def __init__( - self, - num_spherical: int, - num_radial: int, - emb_size_interm: int, - name="EfficientDownProj", - ): - super().__init__() - self.num_spherical = num_spherical - self.num_radial = num_radial - self.emb_size_interm = emb_size_interm - self.reset_parameters() - - def reset_parameters(self): - out_2 = paddle.create_parameter( - shape=paddle.empty( - shape=(self.num_spherical, self.num_radial, self.emb_size_interm) - ).shape, - dtype=paddle.empty( - shape=(self.num_spherical, self.num_radial, self.emb_size_interm) - ) - .numpy() - .dtype, - default_initializer=paddle.nn.initializer.Assign( - paddle.empty( - shape=(self.num_spherical, self.num_radial, self.emb_size_interm) - ) - ), - ) - out_2.stop_gradient = not True - self.weight = out_2 - he_orthogonal_init(self.weight) - - def forward(self, tbf): - """ - Returns - ------- - (rbf_W1, sph): tuple - - rbf_W1: Tensor, shape=(nEdges, emb_size_interm, num_spherical) - - sph: Tensor, shape=(nEdges, Kmax, num_spherical) - """ - rbf_env, sph = tbf - rbf_W1 = paddle.matmul(x=rbf_env, y=self.weight) - rbf_W1 = rbf_W1.transpose(perm=[1, 2, 0]) - x = sph - perm_2 = list(range(x.ndim)) - perm_2[1] = 2 - perm_2[2] = 1 - sph = paddle.transpose(x=x, perm=perm_2) - return rbf_W1, sph - - -class EfficientInteractionHadamard(paddle.nn.Layer): - """ - Efficient reformulation of the hadamard product and subsequent summation. - - Parameters - ---------- - emb_size_interm: int - Intermediate embedding size (down-projection size). - emb_size: int - Embedding size. - """ - - def __init__(self, emb_size_interm: int, emb_size: int, name="EfficientHadamard"): - super().__init__() - self.emb_size_interm = emb_size_interm - self.emb_size = emb_size - self.reset_parameters() - - def reset_parameters(self): - out_3 = paddle.empty(shape=(self.emb_size, 1, self.emb_size_interm)) - out_3.stop_gradient = not True - out_4 = paddle.create_parameter( - shape=out_3.shape, - dtype=out_3.numpy().dtype, - default_initializer=paddle.nn.initializer.Assign(out_3), - ) - out_4.stop_gradient = not True - self.weight = out_4 - he_orthogonal_init(self.weight) - - def forward(self, basis, m, id_reduce, Kidx): - """ - Returns - ------- - m_ca: Tensor, shape=(nEdges, emb_size) - Edge embeddings. - """ - rbf_W1, sph = basis - nEdges = tuple(rbf_W1.shape)[0] - if tuple(sph.shape)[2] == 0: - Kmax = 0 - else: - Kmax = paddle.maximum(paddle.max(x=Kidx + 1), paddle.to_tensor(data=0)) - m2 = paddle.zeros(shape=[nEdges, Kmax, self.emb_size], dtype=m.dtype) - m2[id_reduce, Kidx] = m - sum_k = paddle.matmul(x=sph, y=m2) - rbf_W1_sum_k = paddle.matmul(x=rbf_W1, y=sum_k) - m_ca = paddle.matmul(x=self.weight, y=rbf_W1_sum_k.transpose(perm=[2, 1, 0]))[ - :, 0 - ] - x = m_ca - perm_3 = list(range(x.ndim)) - perm_3[0] = 1 - perm_3[1] = 0 - m_ca = paddle.transpose(x=x, perm=perm_3) - return m_ca - - -class EfficientInteractionBilinear(paddle.nn.Layer): - """ - Efficient reformulation of the bilinear layer and subsequent summation. - - Parameters - ---------- - emb_size: int - Edge embedding size. - emb_size_interm: int - Intermediate embedding size (down-projection size). - units_out: int - Embedding output size of the bilinear layer. - kernel_initializer: callable - Initializer of the weight matrix. - """ - - def __init__( - self, - emb_size: int, - emb_size_interm: int, - units_out: int, - name="EfficientBilinear", - ): - super().__init__() - self.emb_size = emb_size - self.emb_size_interm = emb_size_interm - self.units_out = units_out - self.reset_parameters() - - def reset_parameters(self): - out_5 = paddle.empty( - shape=(self.emb_size, self.emb_size_interm, self.units_out) - ) - out_5.stop_gradient = not True - out_6 = paddle.create_parameter( - shape=out_5.shape, - dtype=out_5.numpy().dtype, - default_initializer=paddle.nn.initializer.Assign(out_5), - ) - out_6.stop_gradient = not True - self.weight = out_6 - he_orthogonal_init(self.weight) - - def forward(self, basis, m, id_reduce, Kidx): - """ - Returns - ------- - m_ca: Tensor, shape=(nEdges, units_out) - Edge embeddings. - """ - rbf_W1, sph = basis - nEdges = tuple(rbf_W1.shape)[0] - Kmax = ( - 0 - if tuple(sph.shape)[2] == 0 - else paddle.maximum(paddle.max(x=Kidx + 1), paddle.to_tensor(data=0)) - ) - m2 = paddle.zeros(shape=[nEdges, Kmax, self.emb_size], dtype=m.dtype) - m2[id_reduce, Kidx] = m - sum_k = paddle.matmul(x=sph, y=m2) - rbf_W1_sum_k = paddle.matmul(x=rbf_W1, y=sum_k) - m_ca = paddle.matmul(x=rbf_W1_sum_k.transpose(perm=[2, 0, 1]), y=self.weight) - m_ca = paddle.sum(x=m_ca, axis=0) - return m_ca diff --git a/materials_discovery/gemnet/model/layers/embedding_block.py b/materials_discovery/gemnet/model/layers/embedding_block.py deleted file mode 100644 index e5097cf7..00000000 --- a/materials_discovery/gemnet/model/layers/embedding_block.py +++ /dev/null @@ -1,69 +0,0 @@ -import numpy as np -import paddle - -from .base_layers import Dense - - -class AtomEmbedding(paddle.nn.Layer): - """ - Initial atom embeddings based on the atom type - - Parameters - ---------- - emb_size: int - Atom embeddings size - """ - - def __init__(self, emb_size, name=None): - super().__init__() - self.emb_size = emb_size - self.embeddings = paddle.nn.Embedding(num_embeddings=93, embedding_dim=emb_size) - init_Uniform = paddle.nn.initializer.Uniform(low=-np.sqrt(3), high=np.sqrt(3)) - init_Uniform(self.embeddings.weight) - - def forward(self, Z): - """ - Returns - ------- - h: Tensor, shape=(nAtoms, emb_size) - Atom embeddings. - """ - h = self.embeddings(Z - 1) - return h - - -class EdgeEmbedding(paddle.nn.Layer): - """ - Edge embedding based on the concatenation of atom embeddings and subsequent dense layer. - - Parameters - ---------- - atom_features: int - Embedding size of the atom embeddings. - edge_features: int - Embedding size of the edge embeddings. - out_features: int - Embedding size after the dense layer. - activation: str - Activation function used in the dense layer. - """ - - def __init__( - self, atom_features, edge_features, out_features, activation=None, name=None - ): - super().__init__() - in_features = 2 * atom_features + edge_features - self.dense = Dense(in_features, out_features, activation=activation, bias=False) - - def forward(self, h, m_rbf, idnb_a, idnb_c): - """ - Returns - ------- - m_ca: Tensor, shape=(nEdges, emb_size) - Edge embeddings. - """ - h_a = h[idnb_a] - h_c = h[idnb_c] - m_ca = paddle.concat(x=[h_a, h_c, m_rbf], axis=-1) - m_ca = self.dense(m_ca) - return m_ca diff --git a/materials_discovery/gemnet/model/layers/envelope.py b/materials_discovery/gemnet/model/layers/envelope.py deleted file mode 100644 index 1dbfd028..00000000 --- a/materials_discovery/gemnet/model/layers/envelope.py +++ /dev/null @@ -1,31 +0,0 @@ -import paddle - - -class Envelope(paddle.nn.Layer): - """ - Envelope function that ensures a smooth cutoff. - - Parameters - ---------- - p: int - Exponent of the envelope function. - """ - - def __init__(self, p, name="envelope"): - super().__init__() - assert p > 0 - self.p = p - self.a = -(self.p + 1) * (self.p + 2) / 2 - self.b = self.p * (self.p + 2) - self.c = -self.p * (self.p + 1) / 2 - - def forward(self, d_scaled): - env_val = ( - 1 - + self.a * d_scaled**self.p - + self.b * d_scaled ** (self.p + 1) - + self.c * d_scaled ** (self.p + 2) - ) - return paddle.where( - condition=d_scaled < 1, x=env_val, y=paddle.zeros_like(x=d_scaled) - ) diff --git a/materials_discovery/gemnet/model/layers/interaction_block.py b/materials_discovery/gemnet/model/layers/interaction_block.py deleted file mode 100644 index a9a0bb98..00000000 --- a/materials_discovery/gemnet/model/layers/interaction_block.py +++ /dev/null @@ -1,574 +0,0 @@ -import paddle - -from .atom_update_block import AtomUpdateBlock -from .base_layers import Dense -from .base_layers import ResidualLayer -from .efficient import EfficientInteractionBilinear -from .embedding_block import EdgeEmbedding -from .scaling import ScalingFactor - - -class InteractionBlock(paddle.nn.Layer): - """ - Interaction block for GemNet-Q/dQ. - - Parameters - ---------- - emb_size_atom: int - Embedding size of the atoms. - emb_size_edge: int - Embedding size of the edges. - emb_size_trip: int - (Down-projected) Embedding size in the triplet message passing block. - emb_size_quad: int - (Down-projected) Embedding size in the quadruplet message passing block. - emb_size_rbf: int - Embedding size of the radial basis transformation. - emb_size_cbf: int - Embedding size of the circular basis transformation (one angle). - emb_size_sbf: int - Embedding size of the spherical basis transformation (two angles). - emb_size_bil_trip: int - Embedding size of the edge embeddings in the triplet-based message passing block after the bilinear layer. - emb_size_bil_quad: int - Embedding size of the edge embeddings in the quadruplet-based message passing block after the bilinear layer. - num_before_skip: int - Number of residual blocks before the first skip connection. - num_after_skip: int - Number of residual blocks after the first skip connection. - num_concat: int - Number of residual blocks after the concatenation. - num_atom: int - Number of residual blocks in the atom embedding blocks. - activation: str - Name of the activation function to use in the dense layers (except for the final dense layer). - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - emb_size_atom, - emb_size_edge, - emb_size_trip, - emb_size_quad, - emb_size_rbf, - emb_size_cbf, - emb_size_sbf, - emb_size_bil_trip, - emb_size_bil_quad, - num_before_skip, - num_after_skip, - num_concat, - num_atom, - activation=None, - scale_file=None, - name="Interaction", - ): - super().__init__() - self.name = name - block_nr = name.split("_")[-1] - self.dense_ca = Dense( - emb_size_edge, - emb_size_edge, - activation=activation, - bias=False, - name="dense_ca", - ) - self.quad_interaction = QuadrupletInteraction( - emb_size_edge=emb_size_edge, - emb_size_quad=emb_size_quad, - emb_size_bilinear=emb_size_bil_quad, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - emb_size_sbf=emb_size_sbf, - activation=activation, - scale_file=scale_file, - name=f"QuadInteraction_{block_nr}", - ) - self.trip_interaction = TripletInteraction( - emb_size_edge=emb_size_edge, - emb_size_trip=emb_size_trip, - emb_size_bilinear=emb_size_bil_trip, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - activation=activation, - scale_file=scale_file, - name=f"TripInteraction_{block_nr}", - ) - self.layers_before_skip = paddle.nn.LayerList( - sublayers=[ - ResidualLayer( - emb_size_edge, activation=activation, name=f"res_bef_skip_{i}" - ) - for i in range(num_before_skip) - ] - ) - self.layers_after_skip = paddle.nn.LayerList( - sublayers=[ - ResidualLayer( - emb_size_edge, activation=activation, name=f"res_aft_skip_{i}" - ) - for i in range(num_after_skip) - ] - ) - self.atom_update = AtomUpdateBlock( - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_rbf=emb_size_rbf, - nHidden=num_atom, - activation=activation, - scale_file=scale_file, - name=f"AtomUpdate_{block_nr}", - ) - self.concat_layer = EdgeEmbedding( - emb_size_atom, - emb_size_edge, - emb_size_edge, - activation=activation, - name="concat", - ) - self.residual_m = paddle.nn.LayerList( - sublayers=[ - ResidualLayer(emb_size_edge, activation=activation, name=f"res_m_{i}") - for i in range(num_concat) - ] - ) - self.inv_sqrt_2 = 1 / 2.0**0.5 - self.inv_sqrt_3 = 1 / 3.0**0.5 - - def forward( - self, - h, - m, - rbf4, - cbf4, - sbf4, - Kidx4, - rbf3, - cbf3, - Kidx3, - id_swap, - id3_expand_ba, - id3_reduce_ca, - id4_reduce_ca, - id4_expand_intm_db, - id4_expand_abd, - rbf_h, - id_c, - id_a, - ): - """ - Returns - ------- - h: Tensor, shape=(nEdges, emb_size_atom) - Atom embeddings. - m: Tensor, shape=(nEdges, emb_size_edge) - Edge embeddings (c->a). - """ - x_ca_skip = self.dense_ca(m) - x4 = self.quad_interaction( - m, - rbf4, - cbf4, - sbf4, - Kidx4, - id_swap, - id4_reduce_ca, - id4_expand_intm_db, - id4_expand_abd, - ) - x3 = self.trip_interaction( - m, rbf3, cbf3, Kidx3, id_swap, id3_expand_ba, id3_reduce_ca - ) - x = x_ca_skip + x3 + x4 - x = x * self.inv_sqrt_3 - for i, layer in enumerate(self.layers_before_skip): - x = layer(x) - m = m + x - m = m * self.inv_sqrt_2 - for i, layer in enumerate(self.layers_after_skip): - m = layer(m) - h2 = self.atom_update(h, m, rbf_h, id_a) - h = h + h2 - h = h * self.inv_sqrt_2 - m2 = self.concat_layer(h, m, id_c, id_a) - for i, layer in enumerate(self.residual_m): - m2 = layer(m2) - m = m + m2 - m = m * self.inv_sqrt_2 - return h, m - - -class InteractionBlockTripletsOnly(paddle.nn.Layer): - """ - Interaction block for GemNet-T/dT. - - Parameters - ---------- - emb_size_atom: int - Embedding size of the atoms. - emb_size_edge: int - Embedding size of the edges. - emb_size_trip: int - (Down-projected) Embedding size in the triplet message passing block. - emb_size_rbf: int - Embedding size of the radial basis transformation. - emb_size_cbf: int - Embedding size of the circular basis transformation (one angle). - emb_size_bil_trip: int - Embedding size of the edge embeddings in the triplet-based message passing block after the bilinear layer. - num_before_skip: int - Number of residual blocks before the first skip connection. - num_after_skip: int - Number of residual blocks after the first skip connection. - num_concat: int - Number of residual blocks after the concatenation. - num_atom: int - Number of residual blocks in the atom embedding blocks. - activation: str - Name of the activation function to use in the dense layers (except for the final dense layer). - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - emb_size_atom, - emb_size_edge, - emb_size_trip, - emb_size_quad, - emb_size_rbf, - emb_size_cbf, - emb_size_bil_trip, - num_before_skip, - num_after_skip, - num_concat, - num_atom, - activation=None, - scale_file=None, - name="Interaction", - **kwargs, - ): - super().__init__() - self.name = name - block_nr = name.split("_")[-1] - self.dense_ca = Dense( - emb_size_edge, - emb_size_edge, - activation=activation, - bias=False, - name="dense_ca", - ) - self.trip_interaction = TripletInteraction( - emb_size_edge=emb_size_edge, - emb_size_trip=emb_size_trip, - emb_size_bilinear=emb_size_bil_trip, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - activation=activation, - scale_file=scale_file, - name=f"TripInteraction_{block_nr}", - ) - self.layers_before_skip = paddle.nn.LayerList( - sublayers=[ - ResidualLayer( - emb_size_edge, activation=activation, name=f"res_bef_skip_{i}" - ) - for i in range(num_before_skip) - ] - ) - self.layers_after_skip = paddle.nn.LayerList( - sublayers=[ - ResidualLayer( - emb_size_edge, activation=activation, name=f"res_aft_skip_{i}" - ) - for i in range(num_after_skip) - ] - ) - self.atom_update = AtomUpdateBlock( - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_rbf=emb_size_rbf, - nHidden=num_atom, - activation=activation, - scale_file=scale_file, - name=f"AtomUpdate_{block_nr}", - ) - self.concat_layer = EdgeEmbedding( - emb_size_atom, - emb_size_edge, - emb_size_edge, - activation=activation, - name="concat", - ) - self.residual_m = paddle.nn.LayerList( - sublayers=[ - ResidualLayer(emb_size_edge, activation=activation, name=f"res_m_{i}") - for i in range(num_concat) - ] - ) - self.inv_sqrt_2 = 1 / 2.0**0.5 - - def forward( - self, - h, - m, - rbf3, - cbf3, - Kidx3, - id_swap, - id3_expand_ba, - id3_reduce_ca, - rbf_h, - id_c, - id_a, - **kwargs, - ): - """ - Returns - ------- - h: Tensor, shape=(nEdges, emb_size_atom) - Atom embeddings. - m: Tensor, shape=(nEdges, emb_size_edge) - Edge embeddings (c->a). - """ - x_ca_skip = self.dense_ca(m) - x3 = self.trip_interaction( - m, rbf3, cbf3, Kidx3, id_swap, id3_expand_ba, id3_reduce_ca - ) - x = x_ca_skip + x3 - x = x * self.inv_sqrt_2 - for i, layer in enumerate(self.layers_before_skip): - x = layer(x) - m = m + x - m = m * self.inv_sqrt_2 - for i, layer in enumerate(self.layers_after_skip): - m = layer(m) - h2 = self.atom_update(h, m, rbf_h, id_a) - h = h + h2 - h = h * self.inv_sqrt_2 - m2 = self.concat_layer(h, m, id_c, id_a) - for i, layer in enumerate(self.residual_m): - m2 = layer(m2) - m = m + m2 - m = m * self.inv_sqrt_2 - return h, m - - -class QuadrupletInteraction(paddle.nn.Layer): - """ - Quadruplet-based message passing block. - - Parameters - ---------- - emb_size_edge: int - Embedding size of the edges. - emb_size_quad: int - (Down-projected) Embedding size of the edge embeddings after the hadamard product with rbf. - emb_size_bilinear: int - Embedding size of the edge embeddings after the bilinear layer. - emb_size_rbf: int - Embedding size of the radial basis transformation. - emb_size_cbf: int - Embedding size of the circular basis transformation (one angle). - emb_size_sbf: int - Embedding size of the spherical basis transformation (two angles). - activation: str - Name of the activation function to use in the dense layers (except for the final dense layer). - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - emb_size_edge, - emb_size_quad, - emb_size_bilinear, - emb_size_rbf, - emb_size_cbf, - emb_size_sbf, - activation=None, - scale_file=None, - name="QuadrupletInteraction", - **kwargs, - ): - super().__init__() - self.name = name - self.dense_db = Dense( - emb_size_edge, - emb_size_edge, - activation=activation, - bias=False, - name="dense_db", - ) - self.mlp_rbf = Dense( - emb_size_rbf, emb_size_edge, activation=None, name="MLP_rbf4_2", bias=False - ) - self.scale_rbf = ScalingFactor(scale_file=scale_file, name=name + "_had_rbf") - self.mlp_cbf = Dense( - emb_size_cbf, emb_size_quad, activation=None, name="MLP_cbf4_2", bias=False - ) - self.scale_cbf = ScalingFactor(scale_file=scale_file, name=name + "_had_cbf") - self.mlp_sbf = EfficientInteractionBilinear( - emb_size_quad, emb_size_sbf, emb_size_bilinear, name="MLP_sbf4_2" - ) - self.scale_sbf_sum = ScalingFactor( - scale_file=scale_file, name=name + "_sum_sbf" - ) - self.down_projection = Dense( - emb_size_edge, - emb_size_quad, - activation=activation, - bias=False, - name="dense_down", - ) - self.up_projection_ca = Dense( - emb_size_bilinear, - emb_size_edge, - activation=activation, - bias=False, - name="dense_up_ca", - ) - self.up_projection_ac = Dense( - emb_size_bilinear, - emb_size_edge, - activation=activation, - bias=False, - name="dense_up_ac", - ) - self.inv_sqrt_2 = 1 / 2.0**0.5 - - def forward( - self, - m, - rbf, - cbf, - sbf, - Kidx4, - id_swap, - id4_reduce_ca, - id4_expand_intm_db, - id4_expand_abd, - ): - """ - Returns - ------- - m: Tensor, shape=(nEdges, emb_size_edge) - Edge embeddings (c->a). - """ - x_db = self.dense_db(m) - x_db2 = x_db * self.mlp_rbf(rbf) - x_db = self.scale_rbf(x_db, x_db2) - x_db = self.down_projection(x_db) - x_db = x_db[id4_expand_intm_db] - x_db2 = x_db * self.mlp_cbf(cbf) - x_db = self.scale_cbf(x_db, x_db2) - x_db = x_db[id4_expand_abd] - x = self.mlp_sbf(sbf, x_db, id4_reduce_ca, Kidx4) - x = self.scale_sbf_sum(x_db, x) - x_ca = self.up_projection_ca(x) - x_ac = self.up_projection_ac(x) - x_ac = x_ac[id_swap] - x4 = x_ca + x_ac - x4 = x4 * self.inv_sqrt_2 - return x4 - - -class TripletInteraction(paddle.nn.Layer): - """ - Triplet-based message passing block. - - Parameters - ---------- - emb_size_edge: int - Embedding size of the edges. - emb_size_trip: int - (Down-projected) Embedding size of the edge embeddings after the hadamard product with rbf. - emb_size_bilinear: int - Embedding size of the edge embeddings after the bilinear layer. - emb_size_rbf: int - Embedding size of the radial basis transformation. - emb_size_cbf: int - Embedding size of the circular basis transformation (one angle). - activation: str - Name of the activation function to use in the dense layers (except for the final dense layer). - scale_file: str - Path to the json file containing the scaling factors. - """ - - def __init__( - self, - emb_size_edge, - emb_size_trip, - emb_size_bilinear, - emb_size_rbf, - emb_size_cbf, - activation=None, - scale_file=None, - name="TripletInteraction", - **kwargs, - ): - super().__init__() - self.name = name - self.dense_ba = Dense( - emb_size_edge, - emb_size_edge, - activation=activation, - bias=False, - name="dense_ba", - ) - self.mlp_rbf = Dense( - emb_size_rbf, emb_size_edge, activation=None, name="MLP_rbf3_2", bias=False - ) - self.scale_rbf = ScalingFactor(scale_file=scale_file, name=name + "_had_rbf") - self.mlp_cbf = EfficientInteractionBilinear( - emb_size_trip, emb_size_cbf, emb_size_bilinear, name="MLP_cbf3_2" - ) - self.scale_cbf_sum = ScalingFactor( - scale_file=scale_file, name=name + "_sum_cbf" - ) - self.down_projection = Dense( - emb_size_edge, - emb_size_trip, - activation=activation, - bias=False, - name="dense_down", - ) - self.up_projection_ca = Dense( - emb_size_bilinear, - emb_size_edge, - activation=activation, - bias=False, - name="dense_up_ca", - ) - self.up_projection_ac = Dense( - emb_size_bilinear, - emb_size_edge, - activation=activation, - bias=False, - name="dense_up_ac", - ) - self.inv_sqrt_2 = 1 / 2.0**0.5 - - def forward(self, m, rbf3, cbf3, Kidx3, id_swap, id3_expand_ba, id3_reduce_ca): - """ - Returns - ------- - m: Tensor, shape=(nEdges, emb_size_edge) - Edge embeddings (c->a). - """ - x_ba = self.dense_ba(m) - mlp_rbf = self.mlp_rbf(rbf3) - x_ba2 = x_ba * mlp_rbf - x_ba = self.scale_rbf(x_ba, x_ba2) - x_ba = self.down_projection(x_ba) - x_ba = x_ba[id3_expand_ba] - x = self.mlp_cbf(cbf3, x_ba, id3_reduce_ca, Kidx3) - x = self.scale_cbf_sum(x_ba, x) - x_ca = self.up_projection_ca(x) - x_ac = self.up_projection_ac(x) - x_ac = x_ac[id_swap] - x3 = x_ca + x_ac - x3 = x3 * self.inv_sqrt_2 - return x3 diff --git a/materials_discovery/gemnet/model/utils.py b/materials_discovery/gemnet/model/utils.py deleted file mode 100644 index fd4a35ec..00000000 --- a/materials_discovery/gemnet/model/utils.py +++ /dev/null @@ -1,111 +0,0 @@ -import json -import paddle - -from typing import Optional - -def read_json(path): - """ """ - if not path.endswith(".json"): - raise UserWarning(f"Path {path} is not a json-path.") - with open(path, "r") as f: - content = json.load(f) - return content - - -def update_json(path, data): - """ """ - if not path.endswith(".json"): - raise UserWarning(f"Path {path} is not a json-path.") - content = read_json(path) - content.update(data) - write_json(path, content) - - -def write_json(path, data): - """ """ - if not path.endswith(".json"): - raise UserWarning(f"Path {path} is not a json-path.") - with open(path, "w", encoding="utf-8") as f: - json.dump(data, f, ensure_ascii=False, indent=4) - - -def read_value_json(path, key): - """ """ - content = read_json(path) - if key in content.keys(): - return content[key] - else: - return None - - -def _broadcast(src: paddle.Tensor, other: paddle.Tensor, dim: int): - if dim < 0: - dim = other.dim() + dim - if src.dim() == 1: - for _ in range(0, dim): - src = src.unsqueeze(0) - for _ in range(src.dim(), other.dim()): - src = src.unsqueeze(-1) - src = src.expand(other.shape) - return src - - -def _scatter_sum(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, - out: Optional[paddle.Tensor] = None, - dim_size: Optional[int] = None) -> paddle.Tensor: - index = _broadcast(index, src, dim) - if out is None: - size = list(src.shape) - if dim_size is not None: - size[dim] = dim_size - elif index.numel() == 0: - size[dim] = 0 - else: - size[dim] = int(index.max()) + 1 - out = paddle.zeros(size, dtype=src.dtype) - return paddle.put_along_axis(arr=out, indices=index, values=src, axis=dim, reduce='add') - - -def _scatter_add(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, - out: Optional[paddle.Tensor] = None, - dim_size: Optional[int] = None) -> paddle.Tensor: - return _scatter_sum(src, index, dim, out, dim_size) - - -def _scatter_mean(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, - out: Optional[paddle.Tensor] = None, - dim_size: Optional[int] = None) -> paddle.Tensor: - out = _scatter_sum(src, index, dim, out, dim_size) - dim_size = out.shape[dim] - - index_dim = dim - if index_dim < 0: - index_dim = index_dim + src.dim() - if index.dim() <= index_dim: - index_dim = index.dim() - 1 - - ones = paddle.ones(index.shape, dtype=src.dtype) - count = _scatter_sum(ones, index, index_dim, None, dim_size) - count[count < 1] = 1 - count = _broadcast(count, out, dim) - if out.is_floating_point(): - out = paddle.divide(out, count) - # out.true_divide_(count) - else: - out = paddle.floor_divide(out, count) - # out.div_(count, rounding_mode='floor') - return out - - -def scatter(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, - out: Optional[paddle.Tensor] = None, dim_size: Optional[int] = None, - reduce: str = "sum") -> paddle.Tensor: - """ - Implement paddle version API like torch_scatter.scatter - """ - if reduce == 'sum' or reduce == 'add': - return _scatter_sum(src, index, dim, out, dim_size) - elif reduce == 'mean': - return _scatter_mean(src, index, dim, out, dim_size) - else: - raise ValueError('Only support add or mean') diff --git a/materials_discovery/gemnet/training/data_container.py b/materials_discovery/gemnet/training/data_container.py deleted file mode 100644 index 595e7be2..00000000 --- a/materials_discovery/gemnet/training/data_container.py +++ /dev/null @@ -1,452 +0,0 @@ -import sys - -import numba -import numpy as np -import paddle -import scipy.sparse as sp - -sys.path.append("/home/chenxiaoxu02/workspaces/gemnet_paddle/utils") - - -class DataContainer: - """ - Parameters - ---------- - path: str - Absolute path of the dataset (in npz-format). - cutoff: float - Insert edge between atoms if distance is less than cutoff. - int_cutoff: float - Cutoff of edge embeddings involved in quadruplet-based message passing. - triplets_only: bool - Flag whether to load quadruplet indices as well. - transforms: list - Transforms that should be applied on the whole dataset. - addID: bool - Whether to add the molecule id to the output. - """ - - def __init__( - self, - path, - cutoff, - int_cutoff, - triplets_only=False, - transforms=None, - addID=False, - ): - self.index_keys = [ - "batch_seg", - "id_undir", - "id_swap", - "id_c", - "id_a", - "id3_expand_ba", - "id3_reduce_ca", - "Kidx3", - ] - if not triplets_only: - self.index_keys += [ - "id4_int_b", - "id4_int_a", - "id4_reduce_ca", - "id4_expand_db", - "id4_reduce_cab", - "id4_expand_abd", - "Kidx4", - "id4_reduce_intm_ca", - "id4_expand_intm_db", - "id4_reduce_intm_ab", - "id4_expand_intm_ab", - ] - self.triplets_only = triplets_only - self.cutoff = cutoff - self.int_cutoff = int_cutoff - self.addID = addID - self.keys = ["N", "Z", "R", "F", "E"] - if addID: - self.keys += ["id"] - self._load_npz(path, self.keys) - if transforms is None: - self.transforms = [] - else: - assert isinstance(transforms, (list, tuple)) - self.transforms = transforms - for transform in self.transforms: - transform(self) - assert self.R is not None - assert self.N is not None - assert self.Z is not None - assert self.E is not None - assert self.F is not None - assert len(self.E) > 0 - assert len(self.F) > 0 - self.E = self.E[:, None] - self.N_cumsum = np.concatenate([[0], np.cumsum(self.N)]) - self.dtypes, dtypes2 = self.get_dtypes() - self.dtypes.update(dtypes2) - self.targets = ["E", "F"] - - def _load_npz(self, path, keys): - """Load the keys from the file and set as attributes. - - Parameters - ---------- - path: str - Absolute path of the dataset (in npz-format). - keys: list - Contains keys in the dataset to load and set as attributes. - - Returns - ------- - None - """ - with np.load(path, allow_pickle=True) as data: - for key in keys: - if key not in data.keys(): - if key != "F": - raise UserWarning(f"Can not find key {key} in the dataset.") - else: - setattr(self, key, data[key]) - - @staticmethod - def _bmat_fast(mats): - """Combines multiple adjacency matrices into single sparse block matrix. - - Parameters - ---------- - mats: list - Has adjacency matrices as elements. - - Returns - ------- - adj_matrix: sp.csr_matrix - Combined adjacency matrix (sparse block matrix) - """ - assert len(mats) > 0 - new_data = np.concatenate([mat.data for mat in mats]) - ind_offset = np.zeros(1 + len(mats), dtype="int32") - ind_offset[1:] = np.cumsum([tuple(mat.shape)[0] for mat in mats]) - new_indices = np.concatenate( - [(mats[i].indices + ind_offset[i]) for i in range(len(mats))] - ) - indptr_offset = np.zeros(1 + len(mats)) - indptr_offset[1:] = np.cumsum([mat.nnz for mat in mats]) - new_indptr = np.concatenate( - [(mats[i].indptr[i >= 1 :] + indptr_offset[i]) for i in range(len(mats))] - ) - shape = ind_offset[-1], ind_offset[-1] - if len(new_data) == 0: - return sp.csr_matrix(shape) - return sp.csr_matrix((new_data, new_indices, new_indptr), shape=shape) - - def __len__(self): - return len(self.N) - - def __getitem__(self, idx): - """ - Parameters - ---------- - idx: array-like - Ids of the molecules to get. - - Returns - ------- - data: dict - nMolecules = len(idx) - nAtoms = total sum of atoms in the selected molecules - Contains following keys and values: - - - id: np.ndarray, shape (nMolecules,) - Ids of the molecules in the dataset. - - N: np.ndarray, shape (nMolecules,) - Number of atoms in the molecules. - - Z: np.ndarray, shape (nAtoms,) - Atomic numbers (dt. Ordnungszahl). - - R: np.ndarray, shape (nAtoms,3) - Atom positions in °A. - - F: np.ndarray, shape (nAtoms,3) - Forces at the atoms in eV/°A. - - E: np.ndarray, shape (nMolecules,1) - Energy of the molecule in eV. - - batch_seg: np.ndarray, shape (nAtoms,) - Contains the index of the sample the atom belongs to. - E.g. [0,0,0, 1,1,1,1, 2,...] where first molecule has 3 atoms, - second molecule has 4 atoms etc. - - id_c: np.ndarray, shape (nEdges,) - Indices of edges' source atom. - - id_a: np.ndarray, shape (nEdges,) - Indices of edges' target atom. - - id_undir: np.ndarray, shape (nEdges,) - Indices where the same index denotes opposite edges, c-> and a->c. - - id_swap: np.ndarray, shape (nEdges,) - Indices to map c->a to a->c. - - id3_expand_ba: np.ndarray, shape (nTriplets,) - Indices to map the edges from c->a to b->a in the triplet-based massage passing. - - id3_reduce_ca: np.ndarray, shape (nTriplets,) - Indices to map the edges from c->a to c->a in the triplet-based massage passing. - - Kidx3: np.ndarray, shape (nTriplets,) - Indices to reshape the neighbor indices b->a into a dense matrix. - - id4_int_a: np.ndarray, shape (nInterEdges,) - Indices of the atom a of the interaction edge. - - id4_int_b: np.ndarray, shape (nInterEdges,) - Indices of the atom b of the interaction edge. - - id4_reduce_ca: np.ndarray, shape (nQuadruplets,) - Indices to map c->a to c->a in quadruplet-message passing. - - id4_expand_db: np.ndarray, shape (nQuadruplets,) - Indices to map c->a to d->b in quadruplet-message passing. - - id4_reduce_intm_ca: np.ndarray, shape (intmTriplets,) - Indices to map c->a to intermediate c->a. - - id4_expand_intm_db: np.ndarray, shape (intmTriplets,) - Indices to map d->b to intermediate d->b. - - id4_reduce_intm_ab: np.ndarray, shape (intmTriplets,) - Indices to map b-a to intermediate b-a of the quadruplet's part c->a-b. - - id4_expand_intm_ab: np.ndarray, shape (intmTriplets,) - Indices to map b-a to intermediate b-a of the quadruplet's part a-b<-d. - - id4_reduce_cab: np.ndarray, shape (nQuadruplets,) - Indices to map from intermediate c->a to quadruplet c->a. - - id4_expand_abd: np.ndarray, shape (nQuadruplets,) - Indices to map from intermediate d->b to quadruplet d->b. - - Kidx4: np.ndarray, shape (nTriplets,) - Indices to reshape the neighbor indices d->b into a dense matrix. - """ - if isinstance(idx, (int, np.int64, np.int32)): - idx = [idx] - if isinstance(idx, tuple): - idx = list(idx) - if isinstance(idx, slice): - idx = np.arange(idx.start, min(idx.stop, len(self)), idx.step) - data = {} - if self.addID: - data["id"] = self.id[idx] - data["E"] = self.E[idx] - data["N"] = self.N[idx] - data["batch_seg"] = np.repeat(np.arange(len(idx), dtype=np.int32), data["N"]) - data["Z"] = np.zeros(np.sum(data["N"]), dtype=np.int32) - data["R"] = np.zeros([np.sum(data["N"]), 3], dtype=np.float32) - data["F"] = np.zeros([np.sum(data["N"]), 3], dtype=np.float32) - nend = 0 - adj_matrices = [] - adj_matrices_int = [] - for k, i in enumerate(idx): - n = data["N"][k] - nstart = nend - nend = nstart + n - s, e = self.N_cumsum[i], self.N_cumsum[i + 1] - data["F"][nstart:nend] = self.F[s:e] - data["Z"][nstart:nend] = self.Z[s:e] - R = self.R[s:e] - data["R"][nstart:nend] = R - D_ij = np.linalg.norm(R[:, None, :] - R[None, :, :], axis=-1) - adj_mat = sp.csr_matrix(D_ij <= self.cutoff) - adj_mat -= sp.eye(n, dtype=np.bool_) - adj_matrices.append(adj_mat) - if not self.triplets_only: - adj_mat = sp.csr_matrix(D_ij <= self.int_cutoff) - adj_mat -= sp.eye(n, dtype=np.bool_) - adj_matrices_int.append(adj_mat) - idx_data = {key: None for key in self.index_keys if key != "batch_seg"} - adj_matrix = self._bmat_fast(adj_matrices) - idx_t, idx_s = adj_matrix.nonzero() - if not self.triplets_only: - adj_matrix_int = self._bmat_fast(adj_matrices_int) - idx_int_t, idx_int_s = adj_matrix_int.nonzero() - if len(idx_t) == 0: - for key in idx_data.keys(): - data[key] = np.array([], dtype="int32") - return self.convert_to_tensor(data) - edges = np.stack([idx_t, idx_s], axis=0) - mask = edges[0] < edges[1] - edges = edges[:, mask] - edges = np.concatenate([edges, edges[::-1]], axis=-1).astype("int32") - idx_t, idx_s = edges[0], edges[1] - indices = np.arange(len(mask) / 2, dtype="int32") - idx_data["id_undir"] = np.concatenate(2 * [indices], axis=-1).astype("int32") - idx_data["id_c"] = idx_s - idx_data["id_a"] = idx_t - if not self.triplets_only: - idx_data["id4_int_a"] = idx_int_t - idx_data["id4_int_b"] = idx_int_s - N_undir_edges = int(len(idx_s) / 2) - ind = np.arange(N_undir_edges, dtype="int32") - id_swap = np.concatenate([ind + N_undir_edges, ind]) - idx_data["id_swap"] = id_swap - edge_ids = sp.csr_matrix( - (np.arange(len(idx_s)), (idx_t, idx_s)), - shape=tuple(adj_matrix.shape), - dtype="int32", - ) - id3_expand_ba, id3_reduce_ca = self.get_triplets(idx_s, idx_t, edge_ids) - id3_reduce_ca = id_swap[id3_reduce_ca] - if len(id3_reduce_ca) > 0: - idx_sorted = np.argsort(id3_reduce_ca) - id3_reduce_ca = id3_reduce_ca[idx_sorted] - id3_expand_ba = id3_expand_ba[idx_sorted] - _, K = np.unique(id3_reduce_ca, return_counts=True) - idx_data["Kidx3"] = DataContainer.ragged_range(K) - else: - idx_data["Kidx3"] = np.array([], dtype="int32") - idx_data["id3_expand_ba"] = id3_expand_ba - idx_data["id3_reduce_ca"] = id3_reduce_ca - if self.triplets_only: - data.update(idx_data) - return self.convert_to_tensor(data) - output = self.get_quadruplets( - idx_s, idx_t, adj_matrix, edge_ids, idx_int_s, idx_int_t - ) - ( - id4_reduce_ca, - id4_expand_db, - id4_reduce_cab, - id4_expand_abd, - id4_reduce_intm_ca, - id4_expand_intm_db, - id4_reduce_intm_ab, - id4_expand_intm_ab, - ) = output - if len(id4_reduce_ca) > 0: - sorted_idx = np.argsort(id4_reduce_ca) - id4_reduce_ca = id4_reduce_ca[sorted_idx] - id4_expand_db = id4_expand_db[sorted_idx] - id4_reduce_cab = id4_reduce_cab[sorted_idx] - id4_expand_abd = id4_expand_abd[sorted_idx] - _, K = np.unique(id4_reduce_ca, return_counts=True) - idx_data["Kidx4"] = DataContainer.ragged_range(K) - else: - idx_data["Kidx4"] = np.array([], dtype="int32") - idx_data["id4_reduce_ca"] = id4_reduce_ca - idx_data["id4_expand_db"] = id4_expand_db - idx_data["id4_reduce_cab"] = id4_reduce_cab - idx_data["id4_expand_abd"] = id4_expand_abd - idx_data["id4_reduce_intm_ca"] = id4_reduce_intm_ca - idx_data["id4_expand_intm_db"] = id4_expand_intm_db - idx_data["id4_reduce_intm_ab"] = id4_reduce_intm_ab - idx_data["id4_expand_intm_ab"] = id4_expand_intm_ab - data.update(idx_data) - return self.convert_to_tensor(data) - - @staticmethod - def get_triplets(idx_s, idx_t, edge_ids): - """ - Get triplets c -> a <- b - """ - id3_expand_ba = edge_ids[idx_s].data.astype("int32").flatten() - id3_reduce_ca = edge_ids[idx_s].tocoo().row.astype("int32").flatten() - id3_i = idx_t[id3_reduce_ca] - id3_k = idx_s[id3_expand_ba] - mask = id3_i != id3_k - id3_expand_ba = id3_expand_ba[mask] - id3_reduce_ca = id3_reduce_ca[mask] - return id3_expand_ba, id3_reduce_ca - - @staticmethod - def get_quadruplets(idx_s, idx_t, adj_matrix, edge_ids, idx_int_s, idx_int_t): - """ - c -> a - b <- d where D_ab <= int_cutoff; D_ca & D_db <= cutoff - """ - nNeighbors_t = adj_matrix[idx_int_t].sum(axis=1).A1.astype("int32") - nNeighbors_s = adj_matrix[idx_int_s].sum(axis=1).A1.astype("int32") - id4_reduce_intm_ca = edge_ids[idx_int_t].data.astype("int32").flatten() - id4_expand_intm_db = edge_ids[idx_int_s].data.astype("int32").flatten() - id4_reduce_cab = DataContainer.repeat_blocks(nNeighbors_t, nNeighbors_s) - id4_reduce_ca = id4_reduce_intm_ca[id4_reduce_cab] - N = np.repeat(nNeighbors_t, nNeighbors_s) - id4_expand_abd = np.repeat(np.arange(len(id4_expand_intm_db)), N) - id4_expand_db = id4_expand_intm_db[id4_expand_abd] - id4_reduce_intm_ab = np.repeat(np.arange(len(idx_int_t)), nNeighbors_t) - id4_expand_intm_ab = np.repeat(np.arange(len(idx_int_t)), nNeighbors_s) - idx_c = idx_s[id4_reduce_ca] - idx_a = idx_t[id4_reduce_ca] - idx_b = idx_t[id4_expand_db] - idx_d = idx_s[id4_expand_db] - mask1 = idx_c != idx_b - mask2 = idx_a != idx_d - mask3 = idx_c != idx_d - mask = mask1 * mask2 * mask3 - id4_reduce_ca = id4_reduce_ca[mask] - id4_expand_db = id4_expand_db[mask] - id4_reduce_cab = id4_reduce_cab[mask] - id4_expand_abd = id4_expand_abd[mask] - return ( - id4_reduce_ca, - id4_expand_db, - id4_reduce_cab, - id4_expand_abd, - id4_reduce_intm_ca, - id4_expand_intm_db, - id4_reduce_intm_ab, - id4_expand_intm_ab, - ) - - def convert_to_tensor(self, data): - for key in data: - data[key] = paddle.to_tensor(data=data[key], dtype=self.dtypes[key]) - return data - - def get_dtypes(self): - """ - Returns - ------- - dtypes: tuple - (dtypes_input, dtypes_target) TF input types for the inputs and targets - stored in dicts. - """ - dtypes_input = {} - if self.addID: - dtypes_input["id"] = "int64" - dtypes_input["Z"] = "int64" - dtypes_input["N"] = "int64" - dtypes_input["R"] = "float32" - for key in self.index_keys: - dtypes_input[key] = "int64" - dtypes_target = {} - dtypes_target["E"] = "float32" - dtypes_target["F"] = "float32" - return dtypes_input, dtypes_target - - @staticmethod - @numba.njit(nogil=True) - def repeat_blocks(sizes, repeats): - """Repeat blocks of indices. - From https://stackoverflow.com/questions/51154989/numpy-vectorized-function-to-repeat-blocks-of-consecutive-elements - - Examples - -------- - sizes = [1,3,2] ; repeats = [3,2,3] - Return: [0 0 0 1 2 3 1 2 3 4 5 4 5 4 5] - sizes = [0,3,2] ; repeats = [3,2,3] - Return: [0 1 2 0 1 2 3 4 3 4 3 4] - sizes = [2,3,2] ; repeats = [2,0,2] - Return: [0 1 0 1 5 6 5 6] - """ - a = np.arange(np.sum(sizes)) - indices = np.empty((sizes * repeats).sum(), dtype=np.int32) - start = 0 - oi = 0 - for i, size in enumerate(sizes): - end = start + size - for _ in range(repeats[i]): - oe = oi + size - indices[oi:oe] = a[start:end] - oi = oe - start = end - return indices - - @staticmethod - @numba.njit(nogil=True) - def ragged_range(sizes): - """ - ------- - Example - ------- - sizes = [1,3,2] ; - Return: [0 0 1 2 0 1] - """ - a = np.arange(sizes.max()) - indices = np.empty(sizes.sum(), dtype=np.int32) - start = 0 - for size in sizes: - end = start + size - indices[start:end] = a[:size] - start = end - return indices diff --git a/materials_discovery/gemnet/training/data_provider.py b/materials_discovery/gemnet/training/data_provider.py deleted file mode 100644 index cca711fe..00000000 --- a/materials_discovery/gemnet/training/data_provider.py +++ /dev/null @@ -1,165 +0,0 @@ -import functools - -import numpy as np -import paddle - - -def collate(batch, target_keys): - """ - custom batching function because batches have variable shape - """ - batch = batch[0] - inputs = {} - targets = {} - for key in batch: - if key in target_keys: - targets[key] = batch[key] - else: - inputs[key] = batch[key] - return inputs, targets - - -class DataProvider: - """ - Parameters - ---------- - data_container: DataContainer - Contains the dataset. - ntrain: int - Number of samples in the training set. - nval: int - Number of samples in the validation set. - batch_size: int - Number of samples to process at once. - seed: int - Seed for drawing samples into train and val set (and shuffle). - random_split: bool - If True put the samples randomly into the subsets else in order. - shuffle: bool - If True shuffle the samples after each epoch. - sample_with_replacement: bool - Sample data from the dataset with replacement. - split: str/dict - Overwrites settings of 'ntrain', 'nval', 'random_split' and 'sample_with_replacement'. - If of type dict the dictionary is assumed to contain the index split of the subsets. - If split is of type str then load the index split from the .npz-file. - Dict and split file are assumed to have keys 'train', 'val', 'test'. - """ - - def __init__( - self, - data_container, - ntrain: int, - nval: int, - batch_size: int = 1, - seed: int = None, - random_split: bool = False, - shuffle: bool = True, - sample_with_replacement: bool = False, - split=None, - **kwargs, - ): - self.kwargs = kwargs - self.data_container = data_container - self._ndata = len(data_container) - self.batch_size = batch_size - self.seed = seed - self.random_split = random_split - self.shuffle = shuffle - self.sample_with_replacement = sample_with_replacement - self._random_state = np.random.RandomState(seed=seed) - if split is None: - self.nsamples, self.idx = self._random_split_data(ntrain, nval) - else: - self.nsamples, self.idx = self._manual_split_data(split) - - def _manual_split_data(self, split): - if isinstance(split, (dict, str)): - if isinstance(split, str): - assert split.endswith( - ".npz" - ), "'split' has to be a .npz file if 'split' is of type str" - split = np.load(split) - keys = ["train", "val", "test"] - for key in keys: - assert ( - key in split.keys() - ), f"{key} is not in {[k for k in split.keys()]}" - idx = {key: np.array(split[key]) for key in keys} - nsamples = {key: len(idx[key]) for key in keys} - return nsamples, idx - else: - raise TypeError("'split' has to be either of type str or dict if not None.") - - def _random_split_data(self, ntrain, nval): - nsamples = {"train": ntrain, "val": nval, "test": self._ndata - ntrain - nval} - all_idx = np.arange(self._ndata) - if self.random_split: - all_idx = self._random_state.permutation(all_idx) - if self.sample_with_replacement: - all_idx = self._random_state.choice(all_idx, self._ndata, replace=True) - idx = { - "train": all_idx[0:ntrain], - "val": all_idx[ntrain : ntrain + nval], - "test": all_idx[ntrain + nval :], - } - return nsamples, idx - - def save_split(self, path): - """ - Save the split of the samples to path. - Data has keys 'train', 'val', 'test'. - """ - assert isinstance(path, str) - assert path.endswith(".npz"), "'path' has to end with .npz" - np.savez(path, **self.idx) - - def get_dataset(self, split, batch_size=None): - assert split in self.idx - if batch_size is None: - batch_size = self.batch_size - shuffle = self.shuffle if split == "train" else False - indices = self.idx[split] - if shuffle: - torch_generator = paddle.framework.core.default_cpu_generator() - if self.seed is not None: - torch_generator.manual_seed(self.seed) - idx_sampler = paddle.io.SubsetRandomSampler(indices=indices) - dataset = self.data_container - else: - subset = paddle.io.Subset(dataset=self.data_container, indices=indices) - idx_sampler = paddle.io.SequenceSampler(data_source=subset) - dataset = subset - batch_sampler1 = paddle.io.BatchSampler( - sampler=idx_sampler, batch_size=batch_size, drop_last=False - ) - - # NOTE: paddle.io.DataLoader only support batch_sampler parameter, but - # Raw pytorch code pass batch_sampler to sampler parameter, and inner - # logic is: - # if batch_size is not None and batch_sampler is None: - # batch_sampler = BatchSampler(sampler, batch_size, drop_last) - # So we need to wrap one more BatchSampler to change it to paddlepaddle. - batch_sampler = paddle.io.BatchSampler( - sampler=batch_sampler1, batch_size=1, drop_last=False - ) - # >>>>>> dataloader = torch.utils.data.DataLoader(dataset, sampler= - # batch_sampler, collate_fn=functools.partial(collate, - # target_keys=self.data_container.targets), pin_memory=True, ** - # self.kwargs) - dataloader = paddle.io.DataLoader( - dataset, - batch_sampler=batch_sampler, - collate_fn=functools.partial( - collate, target_keys=self.data_container.targets - ), - **self.kwargs, - ) - # dataloader.auto_collate_batch = False - - def generator(): - while True: - for inputs, targets in dataloader: - yield inputs, targets - - return generator() diff --git a/materials_discovery/gemnet/training/ema_decay.py b/materials_discovery/gemnet/training/ema_decay.py deleted file mode 100644 index 628b7ff0..00000000 --- a/materials_discovery/gemnet/training/ema_decay.py +++ /dev/null @@ -1,159 +0,0 @@ -""" -Copied from: -https://github.com/fadel/pytorch_ema/blob/master/torch_ema/ema.py -""" - -from __future__ import division -from __future__ import unicode_literals - -import copy -import weakref - -import paddle - - -class ExponentialMovingAverage: - """ - Maintains (exponential) moving average of a set of parameters. - - Args: - parameters: Iterable of `torch.nn.Parameter` (typically from - `model.parameters()`). - decay: The exponential decay. - use_num_updates: Whether to use number of updates when computing - averages. - """ - - def __init__(self, parameters, decay: float, use_num_updates: bool = False): - if decay < 0.0 or decay > 1.0: - raise ValueError("Decay must be between 0 and 1") - self.decay = decay - self.num_updates = 0 if use_num_updates else None - parameters = list(parameters) - self.shadow_params = [ - p.clone().detach() for p in parameters if not p.stop_gradient - ] - self.collected_params = [] - self._params_refs = [weakref.ref(p) for p in parameters] - - def _get_parameters(self, parameters=None): - if parameters is None: - parameters = [p() for p in self._params_refs] - if any(p is None for p in parameters): - raise ValueError( - "(One of) the parameters with which this ExponentialMovingAverage was initialized no longer exists (was garbage collected); please either provide `parameters` explicitly or keep the model to which they belong from being garbage collected." - ) - return parameters - else: - return parameters - - def update(self, parameters=None) -> None: - """ - Update currently maintained parameters. - - Call this every time the parameters are updated, such as the result of - the `optimizer.step()` call. - - Args: - parameters: Iterable of `torch.nn.Parameter`; usually the same set of - parameters used to initialize this object. If `None`, the - parameters with which this `ExponentialMovingAverage` was - initialized will be used. - """ - parameters = self._get_parameters(parameters) - decay = self.decay - if self.num_updates is not None: - self.num_updates += 1 - decay = min(decay, (1 + self.num_updates) / (10 + self.num_updates)) - one_minus_decay = 1.0 - decay - with paddle.no_grad(): - parameters = [p for p in parameters if not p.stop_gradient] - for s_param, param in zip(self.shadow_params, parameters): - tmp = s_param - param - tmp.multiply_(y=paddle.to_tensor(one_minus_decay)) - s_param.subtract_(y=paddle.to_tensor(tmp)) - - def copy_to(self, parameters=None) -> None: - """ - Copy current parameters into given collection of parameters. - - Args: - parameters: Iterable of `torch.nn.Parameter`; the parameters to be - updated with the stored moving averages. If `None`, the - parameters with which this `ExponentialMovingAverage` was - initialized will be used. - """ - parameters = self._get_parameters(parameters) - for s_param, param in zip(self.shadow_params, parameters): - if not param.stop_gradient: - param.data.copy_(s_param.data) - - def store(self, parameters=None) -> None: - """ - Save the current parameters for restoring later. - - Args: - parameters: Iterable of `torch.nn.Parameter`; the parameters to be - temporarily stored. If `None`, the parameters of with which this - `ExponentialMovingAverage` was initialized will be used. - """ - parameters = self._get_parameters(parameters) - self.collected_params = [ - param.clone() for param in parameters if not param.stop_gradient - ] - - def restore(self, parameters=None) -> None: - """ - Restore the parameters stored with the `store` method. - Useful to validate the model with EMA parameters without affecting the - original optimization process. Store the parameters before the - `copy_to` method. After validation (or model saving), use this to - restore the former parameters. - - Args: - parameters: Iterable of `torch.nn.Parameter`; the parameters to be - updated with the stored parameters. If `None`, the - parameters with which this `ExponentialMovingAverage` was - initialized will be used. - """ - parameters = self._get_parameters(parameters) - for c_param, param in zip(self.collected_params, parameters): - if not param.stop_gradient: - param.data.copy_(c_param.data) - - def state_dict(self) -> dict: - """Returns the state of the ExponentialMovingAverage as a dict.""" - return { - "decay": self.decay, - "num_updates": self.num_updates, - "shadow_params": self.shadow_params, - "collected_params": self.collected_params, - } - - def load_state_dict(self, state_dict: dict) -> None: - """Loads the ExponentialMovingAverage state. - - Args: - state_dict (dict): EMA state. Should be an object returned - from a call to :meth:`state_dict`. - """ - state_dict = copy.deepcopy(state_dict) - self.decay = state_dict["decay"] - if self.decay < 0.0 or self.decay > 1.0: - raise ValueError("Decay must be between 0 and 1") - self.num_updates = state_dict["num_updates"] - assert self.num_updates is None or isinstance( - self.num_updates, int - ), "Invalid num_updates" - self.shadow_params = state_dict["shadow_params"] - assert isinstance(self.shadow_params, list), "shadow_params must be a list" - assert all( - isinstance(p, paddle.Tensor) for p in self.shadow_params - ), "shadow_params must all be Tensors" - self.collected_params = state_dict["collected_params"] - assert isinstance( - self.collected_params, list - ), "collected_params must be a list" - assert all( - isinstance(p, paddle.Tensor) for p in self.collected_params - ), "collected_params must all be Tensors" diff --git a/materials_discovery/gemnet/training/metrics.py b/materials_discovery/gemnet/training/metrics.py deleted file mode 100644 index 160af710..00000000 --- a/materials_discovery/gemnet/training/metrics.py +++ /dev/null @@ -1,157 +0,0 @@ -import logging -import os - -import numpy as np - - -class BestMetrics: - """Class for saving the metrics. - - Parameters - ---------- - path: str - Directory where to save the results in. - metic: Metrics - instance to save the best state of. - assert_exist: bool - If True raise UserWarning if the metrics should be restored but None are found. - If False log Warning and frehsly initilaize the metrics. - """ - - def __init__(self, path, metrics, assert_exist=True): - self.path = os.path.join(path, "best_metrics.npz") - self.metrics = metrics - self.assert_exist = assert_exist - self.state = {} - - def inititalize(self): - self.state = {f"{k}_{self.metrics.tag}": np.inf for k in self.metrics.keys} - self.state["step"] = 0 - np.savez(self.path, **self.state) - - def restore(self): - if not os.path.isfile(self.path): - string = f"Best metrics can not be restored as the file does not exist in the given path: {self.path}" - if self.assert_exist: - raise UserWarning(string) - string += "\n Will initialize the best metrics." - logging.warning(string) - self.inititalize() - else: - loss_file = np.load(self.path) - self.state = {k: v.item() for k, v in loss_file.items()} - - def items(self): - return self.state.items() - - def update(self, step, metrics): - self.state["step"] = step - self.state.update(metrics.result()) - np.savez(self.path, **self.state) - - def write(self, summary_writer, step): - for key, val in self.state.items(): - if key != "step": - summary_writer.add_scalar(key + "_best", val, step) - - @property - def loss(self): - return self.state["loss_val"] - - @property - def step(self): - return self.state["step"] - - -class MeanMetric: - def __init__(self): - self.reset_states() - - def update_state(self, values, sample_weight): - self.values += sample_weight * values - self.sample_weights += sample_weight - - def result(self): - return self.values / self.sample_weights - - def reset_states(self): - self.sample_weights = 0 - self.values = 0 - - -class Metrics: - """Class for saving the metrics. - - Parameters - ---------- - tag: str - Tag to add to the metric (e.g 'train' or 'val'). - keys: list - Name of the different metrics to watch (e.g. 'loss', 'mae' etc) - ex: sacred.Eperiment - Sacred experiment that keeps track of the metrics. - """ - - def __init__(self, tag, keys, ex=None): - self.tag = tag - self.keys = keys - self.ex = ex - assert "loss" in self.keys - self.mean_metrics = {} - for key in self.keys: - self.mean_metrics[key] = MeanMetric() - - def update_state(self, nsamples, **updates): - """Update the metrics. - - Parameters - ---------- - nsamples: int - Number of samples for which the updates where calculated on. - updates: dict - Contains metric updates. - """ - assert set(updates.keys()).issubset(set(self.keys)) - for key in updates: - self.mean_metrics[key].update_state( - updates[key].cpu(), sample_weight=nsamples - ) - - def write(self, summary_writer, step): - """Write metrics to summary_writer (and the Sacred experiment).""" - for key, val in self.result().items(): - summary_writer.add_scalar(key, val, global_step=step) - if self.ex is not None: - if key not in self.ex.current_run.info: - self.ex.current_run.info[key] = [] - self.ex.current_run.info[key].append(val) - if self.ex is not None: - if f"step_{self.tag}" not in self.ex.current_run.info: - self.ex.current_run.info[f"step_{self.tag}"] = [] - self.ex.current_run.info[f"step_{self.tag}"].append(step) - - def reset_states(self): - for key in self.keys: - self.mean_metrics[key].reset_states() - - def result(self, append_tag=True): - """ - Parameters - ---------- - append_tag: bool - If True append the tag to the key of the returned dict - - Returns - ------- - result_dict: dict - Contains the numpy values of the metrics. - """ - result_dict = {} - for key in self.keys: - result_key = f"{key}_{self.tag}" if append_tag else key - result_dict[result_key] = self.mean_metrics[key].result().numpy().item() - return result_dict - - @property - def loss(self): - return self.mean_metrics["loss"].result().numpy().item() diff --git a/materials_discovery/gemnet/training/schedules.py b/materials_discovery/gemnet/training/schedules.py deleted file mode 100644 index 5544dd1d..00000000 --- a/materials_discovery/gemnet/training/schedules.py +++ /dev/null @@ -1,82 +0,0 @@ -import paddle - -# class LinearWarmupExponentialDecay(paddle.optimizer.lr.LambdaDecay): -# """This schedule combines a linear warmup with an exponential decay. - -# Parameters -# ---------- -# optimizer: Optimizer -# Optimizer instance. -# decay_steps: float -# Number of steps until learning rate reaches learning_rate*decay_rate -# decay_rate: float -# Decay rate. -# warmup_steps: int -# Total number of warmup steps of the learning rate schedule. -# staircase: bool -# If True use staircase decay and not (continous) exponential decay. -# last_step: int -# Only needed when resuming training to resume learning rate schedule at this step. -# """ - -# def __init__(self, optimizer, warmup_steps, decay_steps, decay_rate, -# staircase=False, last_step=-1, verbose=False): -# assert decay_rate <= 1 -# if warmup_steps == 0: -# warmup_steps = 1 - -# def lr_lambda(step): -# warmup = min(1 / warmup_steps + 1 / warmup_steps * step, 1) -# exponent = step / decay_steps -# if staircase: -# exponent = int(exponent) -# decay = decay_rate ** exponent -# return warmup * decay -# super().__init__(optimizer, lr_lambda, last_epoch=last_step, -# verbose=verbose) - - -class LinearWarmupExponentialDecay(paddle.optimizer.lr.LambdaDecay): - """This schedule combines a linear warmup with an exponential decay. - - Parameters - ---------- - optimizer: Optimizer - Optimizer instance. - decay_steps: float - Number of steps until learning rate reaches learning_rate*decay_rate - decay_rate: float - Decay rate. - warmup_steps: int - Total number of warmup steps of the learning rate schedule. - staircase: bool - If True use staircase decay and not (continous) exponential decay. - last_step: int - Only needed when resuming training to resume learning rate schedule at this step. - """ - - def __init__( - self, - learning_rate, - warmup_steps, - decay_steps, - decay_rate, - staircase=False, - last_step=-1, - verbose=False, - ): - assert decay_rate <= 1 - if warmup_steps == 0: - warmup_steps = 1 - - def lr_lambda(step): - warmup = min(1 / warmup_steps + 1 / warmup_steps * step, 1) - exponent = step / decay_steps - if staircase: - exponent = int(exponent) - decay = decay_rate**exponent - return warmup * decay - - super().__init__( - learning_rate, lr_lambda, last_epoch=last_step, verbose=verbose - ) diff --git a/materials_discovery/gemnet/training/trainer.py b/materials_discovery/gemnet/training/trainer.py deleted file mode 100644 index 61a4f8fe..00000000 --- a/materials_discovery/gemnet/training/trainer.py +++ /dev/null @@ -1,706 +0,0 @@ -import logging - -import numpy as np -import paddle - -from .ema_decay import ExponentialMovingAverage -from .schedules import LinearWarmupExponentialDecay - - -class Trainer: - """ - Parameters - ---------- - model: Model - Model to train. - learning_rate: float - Initial learning rate. - decay_steps: float - Number of steps until learning rate reaches learning_rate*decay_rate - decay_rate: float - Decay rate. - warmup_steps: int - Total number of warmup steps of the learning rate schedule.. - weight_decay: bool - Weight decay factor of the AdamW optimizer. - staircase: bool - If True use staircase decay and not (continous) exponential decay - grad_clip_max: float - Gradient clipping threshold. - decay_patience: int - Learning rate decay on plateau. Number of evaluation intervals - after decaying the learning rate. - decay_factor: float - Learning rate decay on plateau. Multiply inverse of decay factor - by learning rate to obtain new learning rate. - decay_cooldown: int - Learning rate decay on plateau. Number of evaluation intervals - after which to return to normal operation. - ema_decay: float - Decay to use to maintain the moving averages of trained variables. - rho_force: float - Weighing factor for the force loss compared to the energy. - In range [0,1] - loss = loss_energy * (1-rho_force) + loss_force * rho_force - loss: str - Name of the loss objective of the forces. - mve: bool - If True perform Mean Variance Estimation. - agc: bool - If True use adaptive gradient clipping else clip by global norm. - """ - - def __init__( - self, - model, - learning_rate: float = 0.001, - decay_steps: int = 100000, - decay_rate: float = 0.96, - warmup_steps: int = 0, - weight_decay: float = 0.001, - staircase: bool = False, - grad_clip_max: float = 1000, - decay_patience: int = 10, - decay_factor: float = 0.5, - decay_cooldown: int = 10, - ema_decay: float = 0.999, - rho_force: float = 0.99, - loss: str = "mae", - mve: bool = False, - agc=False, - ): - assert 0 <= rho_force <= 1 - self.model = model - self.ema_decay = ema_decay - self.grad_clip_max = grad_clip_max - self.rho_force = float(rho_force) - self.mve = mve - self.loss = loss - self.agc = agc - if mve: - self.tracked_metrics = [ - "loss", - "energy_mae", - "energy_nll", - "energy_var", - "force_mae", - "force_rmse", - "force_nll", - "force_var", - ] - else: - self.tracked_metrics = ["loss", "energy_mae", "force_mae", "force_rmse"] - self.reset_optimizer( - learning_rate, - weight_decay, - warmup_steps, - decay_steps, - decay_rate, - staircase, - decay_patience, - decay_factor, - decay_cooldown, - ) - - def reset_optimizer( - self, - learning_rate, - weight_decay, - warmup_steps, - decay_steps, - decay_rate, - staircase, - decay_patience, - decay_factor, - decay_cooldown, - ): - if weight_decay > 0: - adamW_params = [] - rest_params = [] - for name, param in self.model.named_parameters(): - if not param.stop_gradient: - if "atom_emb" in name: - rest_params += [param] - continue - if "frequencies" in name: - rest_params += [param] - continue - if "bias" in name: - rest_params += [param] - continue - adamW_params += [param] - # >>>>>> AdamW = torch.optim.AdamW(adamW_params, - # lr=learning_rate, betas - # =(0.9, 0.999), eps=1e-07, - # weight_decay=weight_decay, - # amsgrad=True) - AdamW = paddle.optimizer.AdamW( - parameters=adamW_params, - learning_rate=learning_rate, - beta1=0.9, - beta2=0.999, - epsilon=1e-07, - weight_decay=weight_decay, - ) - lr_schedule_AdamW = LinearWarmupExponentialDecay( - AdamW.get_lr(), warmup_steps, decay_steps, decay_rate, staircase - ) - # >>>>>> Adam = torch.optim.Adam(rest_params, - # lr=learning_rate, betas=( - # 0.9, 0.999), eps=1e-07, amsgrad=True) - AdamW.set_lr_scheduler(lr_schedule_AdamW) - Adam = paddle.optimizer.Adam( - parameters=rest_params, - learning_rate=learning_rate, - beta1=0.9, - beta2=0.999, - epsilon=1e-07, - ) - lr_schedule_Adam = LinearWarmupExponentialDecay( - Adam.get_lr(), warmup_steps, decay_steps, decay_rate, staircase - ) - Adam.set_lr_scheduler(lr_schedule_Adam) - self.schedulers = MultiWrapper(lr_schedule_AdamW, lr_schedule_Adam) - self.optimizers = MultiWrapper(AdamW, Adam) - else: - # >>>>>> Adam = torch.optim.Adam(self.model.parameters(), - # lr= - # learning_rate, betas=(0.9, 0.999), eps=1e-07, - # amsgrad=True) - Adam = paddle.optimizer.Adam( - parameters=self.model.parameters(), - learning_rate=learning_rate, - beta1=0.9, - beta2=0.999, - epsilon=1e-07, - ) - lr_schedule_Adam = LinearWarmupExponentialDecay( - Adam.get_lr(), warmup_steps, decay_steps, decay_rate, staircase - ) - Adam.set_lr_scheduler(lr_schedule_Adam) - self.schedulers = MultiWrapper(lr_schedule_Adam) - self.optimizers = MultiWrapper(Adam) - self.plateau_callback = ReduceLROnPlateau( - optimizer=self.optimizers, - scheduler=self.schedulers, - factor=decay_factor, - patience=decay_patience, - cooldown=decay_cooldown, - verbose=True, - ) - if self.agc: - self.params_except_last = [] - for name, param in self.model.named_parameters(): - if not param.stop_gradient: - if "out_energy" in name: - self.params_except_last += [param] - if "out_forces" in name: - self.params_except_last += [param] - self.exp_decay = ExponentialMovingAverage( - [p for p in self.model.parameters() if not p.stop_gradient], self.ema_decay - ) - - def save_variable_backups(self): - self.exp_decay.store() - - def load_averaged_variables(self): - self.exp_decay.copy_to() - - def restore_variable_backups(self): - self.exp_decay.restore() - - def decay_maybe(self, val_loss): - self.plateau_callback.step(val_loss) - - @staticmethod - def _unitwise_norm(x, norm_type=2.0): - if x.ndim <= 1: - return x.norm(p=norm_type) - else: - return x.norm(p=norm_type, axis=tuple(range(1, x.ndim)), keepdim=True) - - @staticmethod - def _adaptive_gradient_clipping( - parameters, clip_factor=0.05, eps=0.001, norm_type=2.0 - ): - """ - https://github.com/rwightman/pytorch-image-models/blob/master/timm - /utils/agc.py - - Adapted from High-Performance Large-Scale Image Recognition Without - Normalization: - https://github.com/deepmind/deepmind-research/blob/master/nfnets/ - optim.py""" - with paddle.no_grad(): - if isinstance(parameters, paddle.Tensor): - parameters = [parameters] - for p in parameters: - if p.grad is None: - continue - p_data = p - g_data = p.grad - max_norm = ( - Trainer._unitwise_norm(p_data, norm_type=norm_type) - .clip_(min=eps) - .multiply_(y=paddle.to_tensor(clip_factor)) - ) - grad_norm = Trainer._unitwise_norm(g_data, norm_type=norm_type) - clipped_grad = g_data * (max_norm / grad_norm.clip(min=1e-06)) - new_grads = paddle.where( - condition=grad_norm < max_norm, x=g_data, y=clipped_grad - ) - p.grad.copy_(new_grads) - - def scale_shared_grads(self): - """Divide the gradients of the layers that are shared across multiple - blocks - by the number the weights are shared for - """ - with paddle.no_grad(): - - def scale_grad(param, scale_factor): - if param.grad is None: - return - g_data = param.grad - new_grads = g_data / scale_factor - param.grad.copy_(new_grads) - - shared_int_layers = [ - self.model.mlp_rbf3, - self.model.mlp_cbf3, - self.model.mlp_rbf_h, - ] - if not self.model.triplets_only: - shared_int_layers += [ - self.model.mlp_rbf4, - self.model.mlp_cbf4, - self.model.mlp_sbf4, - ] - for layer in shared_int_layers: - scale_grad(layer.weight, self.model.num_blocks) - scale_grad(self.model.mlp_rbf_out.weight, self.model.num_blocks + 1) - - def get_mae(self, targets, pred): - """ - Mean Absolute Error - """ - return paddle.nn.functional.l1_loss(input=pred, label=targets, reduction="mean") - - def get_rmse(self, targets, pred): - """ - Mean L2 Error - """ - return paddle.mean(x=paddle.linalg.norm(x=pred - targets, p=2, axis=1)) - - def get_nll(self, targets, mean_pred, var_pred): - return paddle.nn.functional.gaussian_nll_loss( - input=mean_pred, label=targets, variance=var_pred, reduction="mean" - ) - - def predict(self, inputs): - energy, forces = self.model(inputs) - if self.mve: - mean_energy = energy[:, :1] - var_energy = paddle.nn.functional.softplus(x=energy[:, 1:]) - mean_forces = forces[:, 0, :] - var_forces = paddle.nn.functional.softplus(x=forces[:, 1, :]) - return mean_energy, var_energy, mean_forces, var_forces - else: - if len(tuple(forces.shape)) == 3: - forces = forces[:, 0] - return energy, None, forces, None - - @staticmethod - def dict2device(data, device=None): - if device is None: - device = str( - "cuda" if paddle.device.cuda.device_count() >= 1 else "cpu" - ).replace("cuda", "gpu") - for key in data: - data[key] = data[key].to(device) - return data - - def predict_on_batch(self, dataset_iter): - inputs, _ = next(dataset_iter) - inputs = self.dict2device(inputs) - return self.predict(inputs) - - def train_on_batch(self, dataset_iter, metrics): - self.model.train() - inputs, targets = next(dataset_iter) - inputs, targets = self.dict2device(inputs), self.dict2device(targets) - mean_energy, var_energy, mean_forces, var_forces = self.predict(inputs) - if self.mve: - energy_nll = self.get_nll(targets["E"], mean_energy, var_energy) - force_nll = self.get_nll(targets["F"], mean_forces, var_forces) - loss = energy_nll * (1 - self.rho_force) + self.rho_force * force_nll - else: - energy_mae = self.get_mae(targets["E"], mean_energy) - if self.loss == "mae": - force_metric = self.get_mae(targets["F"], mean_forces) - else: - force_metric = self.get_rmse(targets["F"], mean_forces) - loss = energy_mae * (1 - self.rho_force) + self.rho_force * force_metric - - self.optimizers.clear_grad() - loss.backward() - self.scale_shared_grads() - if self.agc: - self._adaptive_gradient_clipping( - self.params_except_last, clip_factor=self.grad_clip_max - ) - else: - paddle.nn.utils.clip_grad_norm_( - parameters=self.model.parameters(), max_norm=self.grad_clip_max - ) - self.optimizers.step() - self.schedulers.step() - self.exp_decay.update() - loss = loss.detach() - with paddle.no_grad(): - if self.mve: - energy_mae = self.get_mae(targets["E"], mean_energy) - force_mae = self.get_mae(targets["F"], mean_forces) - force_rmse = self.get_rmse(targets["F"], mean_forces) - elif self.loss == "mae": - force_mae = force_metric - force_rmse = self.get_rmse(targets["F"], mean_forces) - else: - force_mae = self.get_mae(targets["F"], mean_forces) - force_rmse = force_metric - if self.mve: - metrics.update_state( - nsamples=tuple(mean_energy.shape)[0], - loss=loss, - energy_mae=energy_mae, - energy_nll=energy_nll, - energy_var=var_energy, - ) - metrics.update_state( - nsamples=tuple(mean_forces.shape)[0], - force_mae=force_mae, - force_rmse=force_rmse, - force_nll=force_nll, - force_var=var_forces, - ) - else: - metrics.update_state( - nsamples=tuple(mean_energy.shape)[0], - loss=loss, - energy_mae=energy_mae, - ) - metrics.update_state( - nsamples=tuple(mean_forces.shape)[0], - force_mae=force_mae, - force_rmse=force_rmse, - ) - return loss - - def test_on_batch(self, dataset_iter, metrics): - self.model.eval() - inputs, targets = next(dataset_iter) - inputs, targets = self.dict2device(inputs), self.dict2device(targets) - if self.model.direct_forces: - with paddle.no_grad(): - mean_energy, var_energy, mean_forces, var_forces = self.predict(inputs) - else: - mean_energy, var_energy, mean_forces, var_forces = self.predict(inputs) - with paddle.no_grad(): - energy_mae = self.get_mae(targets["E"], mean_energy) - force_mae = self.get_mae(targets["F"], mean_forces) - force_rmse = self.get_rmse(targets["F"], mean_forces) - if self.mve: - energy_nll = self.get_nll(targets["E"], mean_energy, var_energy) - loss = energy_nll * (1 - self.rho_force) + self.rho_force * force_mae - force_nll = self.get_nll(targets["F"], mean_forces, var_forces) - loss = energy_nll * (1 - self.rho_force) + self.rho_force * force_nll - metrics.update_state( - nsamples=tuple(mean_energy.shape)[0], - loss=loss, - energy_mae=energy_mae, - energy_nll=energy_nll, - energy_var=var_energy, - ) - metrics.update_state( - nsamples=tuple(mean_forces.shape)[0], - force_mae=force_mae, - force_rmse=force_rmse, - force_nll=force_nll, - force_var=var_forces, - ) - else: - force_metric = force_mae if self.loss == "mae" else force_rmse - loss = (1 - self.rho_force) * energy_mae + self.rho_force * force_metric - metrics.update_state( - nsamples=tuple(mean_energy.shape)[0], - loss=loss, - energy_mae=energy_mae, - ) - metrics.update_state( - nsamples=tuple(mean_forces.shape)[0], - force_mae=force_mae, - force_rmse=force_rmse, - ) - return loss - - def eval_on_batch(self, dataset_iter): - self.model.eval() - with paddle.no_grad(): - inputs, targets = next(dataset_iter) - inputs, targets = self.dict2device(inputs), self.dict2device(targets) - energy, _, forces, _ = self.predict(inputs) - return (energy, forces), targets - - def state_dict(self): - """Returns the state of the trainer and all subinstancces except - the model.""" - state_dict = { - key: value - for key, value in self.__dict__.items() - if key - not in [ - "model", - "schedulers", - "optimizers", - "plateau_callback", - "exp_decay", - ] - } - for attr in ["schedulers", "optimizers", "plateau_callback", "exp_decay"]: - state_dict.update({attr: getattr(self, attr).state_dict()}) - return state_dict - - def load_state_dict(self, state_dict): - """Loads the schedulers state. - - Args: - state_dict (dict): scheduler state. Should be an object returned - from a call to :meth:`state_dict`. - """ - trainer_dict = { - key: value - for key, value in self.state_dict.items() - if key - not in [ - "model", - "schedulers", - "optimizers", - "plateau_callback", - "exp_decay", - ] - } - self.__dict__.update(trainer_dict) - for attr in ["schedulers", "optimizers", "plateau_callback", "exp_decay"]: - getattr(self, attr).set_state_dict(state_dict=state_dict[attr]) - - -class ReduceLROnPlateau: - """Reduce learning rate (and weight decay) when a metric has stopped - improving. - Models often benefit from reducing the learning rate by a factor - of 2-10 once learning stagnates. This scheduler reads a metrics - quantity and if no improvement is seen for a 'patience' number - of steps, the learning rate (and weight decay) is reduced. - - Parameters - ---------- - optimizer: Optimizer, list: - Wrapped optimizer. - scheduler: LRSchedule, list - Learning rate schedule of the optimizer. - Asserts that the second schedule belongs to second optimizer - and so on. - mode: str - One of `min`, `max`. In `min` mode, lr will - be reduced when the quantity monitored has stopped - decreasing; in `max` mode it will be reduced when the - quantity monitored has stopped increasing. Default: 'min'. - factor: float - Factor by which the learning rate will be - reduced. new_lr = lr * factor. Default: 0.1. - patience: int - Number of steps with no improvement after - which learning rate will be reduced. For example, if - `patience = 2`, then we will ignore the first 2 steps - with no improvement, and will only decrease the LR after the - 3rd step if the loss still hasn't improved then. - Default: 10. - threshold: float - Threshold for measuring the new optimum, - to only focus on significant changes. Default: 1e-4. - max_reduce: int - Number of maximum decays on plateaus. Default: 10. - threshold_mode: str - One of `rel`, `abs`. In `rel` mode, - dynamic_threshold = best * ( 1 + threshold ) in 'max' - mode or best * ( 1 - threshold ) in `min` mode. - In `abs` mode, dynamic_threshold = best + threshold in - `max` mode or best - threshold in `min` mode. Default: 'rel'. - cooldown: int - Number of steps to wait before resuming - normal operation after lr has been reduced. Default: 0. - eps: float - Minimal decay applied to lr. If the difference - between new and old lr is smaller than eps, the update is - ignored. Default: 1e-8. - verbose: bool - If ``True``, prints a message to stdout for - each update. Default: ``False``. - """ - - def __init__( - self, - optimizer, - scheduler, - factor=0.1, - patience=10, - threshold=0.0001, - max_reduce=10, - cooldown=0, - threshold_mode="rel", - min_lr=0, - eps=1e-08, - mode="min", - verbose=False, - ): - if factor >= 1.0: - raise ValueError(f"Factor should be < 1.0 but is {factor}.") - self.factor = factor - self.optimizer = optimizer - self.scheduler = scheduler - if isinstance(optimizer, MultiWrapper): - self.optimizer = optimizer.wrapped - if isinstance(scheduler, MultiWrapper): - self.scheduler = scheduler.wrapped - if not isinstance(self.optimizer, (list, tuple)): - self.optimizer = [self.optimizer] - if not isinstance(self.scheduler, (list, tuple)): - self.scheduler = [self.scheduler] - assert len(self.optimizer) == len(self.scheduler) - for opt in self.optimizer: - if not isinstance(opt, paddle.optimizer.Optimizer): - raise TypeError( - f"""{type(opt).__name__} is not an Optimizer but is of" - "type {type(opt)}""" - ) - self.patience = patience - self.verbose = verbose - self.cooldown = cooldown - self.cooldown_counter = 0 - self.mode = mode - self.threshold = threshold - self.threshold_mode = threshold_mode - self.best = None - self.num_bad_steps = None - self.mode_worse = None - self.eps = eps - self.last_step = 0 - self._init_is_better( - mode=mode, threshold=threshold, threshold_mode=threshold_mode - ) - self._reset() - self._reduce_counter = 0 - - def _reset(self): - """Resets num_bad_steps counter and cooldown counter.""" - self.best = self.mode_worse - self.cooldown_counter = 0 - self.num_bad_steps = 0 - - def step(self, metrics): - current = float(metrics) - step = self.last_step + 1 - self.last_step = step - if self.is_better(current, self.best): - self.best = current - self.num_bad_steps = 0 - else: - self.num_bad_steps += 1 - if self.in_cooldown: - self.cooldown_counter -= 1 - self.num_bad_steps = 0 - if self.num_bad_steps > self.patience: - self._reduce(step) - self.cooldown_counter = self.cooldown - self.num_bad_steps = 0 - - def _reduce(self, step): - self._reduce_counter += 1 - for optimzer, schedule in zip(self.optimizer, self.scheduler): - if hasattr(schedule, "base_lrs"): - schedule.base_lrs = [(lr * self.factor) for lr in schedule.base_lrs] - else: - raise ValueError( - "Schedule does not have attribute 'base_lrs' for the learning rate." - ) - if self.verbose: - logging.info(f"Step {step}: reducing on plateu by {self.factor}.") - - @property - def in_cooldown(self): - return self.cooldown_counter > 0 - - def is_better(self, a, best): - if self.mode == "min" and self.threshold_mode == "rel": - rel_epsilon = 1.0 - self.threshold - return a < best * rel_epsilon - elif self.mode == "min" and self.threshold_mode == "abs": - return a < best - self.threshold - elif self.mode == "max" and self.threshold_mode == "rel": - rel_epsilon = self.threshold + 1.0 - return a > best * rel_epsilon - else: - return a > best + self.threshold - - def _init_is_better(self, mode, threshold, threshold_mode): - if mode not in {"min", "max"}: - raise ValueError("mode " + mode + " is unknown!") - if threshold_mode not in {"rel", "abs"}: - raise ValueError("threshold mode " + threshold_mode + " is unknown!") - if mode == "min": - self.mode_worse = np.inf - else: - self.mode_worse = -np.inf - self.mode = mode - self.threshold = threshold - self.threshold_mode = threshold_mode - - def state_dict(self): - return { - key: value - for key, value in self.__dict__.items() - if key not in ["optimizer", "scheduler"] - } - - def load_state_dict(self, state_dict): - self.__dict__.update(state_dict) - self._init_is_better( - mode=self.mode, threshold=self.threshold, threshold_mode=self.threshold_mode - ) - - -class MultiWrapper: - def __init__(self, *ops): - self.wrapped = ops - - def __getitem__(self, idx): - return self.wrapped[idx] - - def clear_grad(self): - for op in self.wrapped: - op.clear_grad() - - def step(self): - for op in self.wrapped: - op.step() - - def state_dict(self): - """Returns the overall state dict of the wrapped instances.""" - return {i: opt.state_dict() for i, opt in enumerate(self.wrapped)} - - def load_state_dict(self, state_dict): - """Load the state_dict for each wrapped instance. - Assumes the order is the same as when the state_dict was loaded - """ - for i, opt in enumerate(self.wrapped): - opt.set_state_dict(state_dict=state_dict[i]) diff --git a/materials_discovery/logs/20240614_003759_fJ1IBm_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_003759_fJ1IBm_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240614_003759_fJ1IBm_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_003759_fJ1IBm_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718325583.yq01-qianmo-com-255-100-15.yq01.baidu.com.37356.0 b/materials_discovery/logs/20240614_003759_fJ1IBm_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718325583.yq01-qianmo-com-255-100-15.yq01.baidu.com.37356.0 deleted file mode 100644 index 7be98a19..00000000 Binary files a/materials_discovery/logs/20240614_003759_fJ1IBm_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718325583.yq01-qianmo-com-255-100-15.yq01.baidu.com.37356.0 and /dev/null differ diff --git a/materials_discovery/logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718325700.yq01-qianmo-com-255-100-15.yq01.baidu.com.37356.1 b/materials_discovery/logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718325700.yq01-qianmo-com-255-100-15.yq01.baidu.com.37356.1 deleted file mode 100644 index b47ac185..00000000 Binary files a/materials_discovery/logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718325700.yq01-qianmo-com-255-100-15.yq01.baidu.com.37356.1 and /dev/null differ diff --git a/materials_discovery/logs/20240614_005946_ToTqD3_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_005946_ToTqD3_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240614_005946_ToTqD3_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_005946_ToTqD3_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718326888.yq01-qianmo-com-255-100-15.yq01.baidu.com.40893.0 b/materials_discovery/logs/20240614_005946_ToTqD3_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718326888.yq01-qianmo-com-255-100-15.yq01.baidu.com.40893.0 deleted file mode 100644 index 54522b8f..00000000 Binary files a/materials_discovery/logs/20240614_005946_ToTqD3_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718326888.yq01-qianmo-com-255-100-15.yq01.baidu.com.40893.0 and /dev/null differ diff --git a/materials_discovery/logs/20240614_010934_mwSw6P_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_010934_mwSw6P_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240614_010934_mwSw6P_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_010934_mwSw6P_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718327478.yq01-qianmo-com-255-100-15.yq01.baidu.com.2295.0 b/materials_discovery/logs/20240614_010934_mwSw6P_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718327478.yq01-qianmo-com-255-100-15.yq01.baidu.com.2295.0 deleted file mode 100644 index 0e533179..00000000 Binary files a/materials_discovery/logs/20240614_010934_mwSw6P_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718327478.yq01-qianmo-com-255-100-15.yq01.baidu.com.2295.0 and /dev/null differ diff --git a/materials_discovery/logs/20240614_011333_TSbgng_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_011333_TSbgng_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240614_011333_TSbgng_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_011333_TSbgng_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718327717.yq01-qianmo-com-255-100-15.yq01.baidu.com.3381.0 b/materials_discovery/logs/20240614_011333_TSbgng_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718327717.yq01-qianmo-com-255-100-15.yq01.baidu.com.3381.0 deleted file mode 100644 index cc18aafc..00000000 Binary files a/materials_discovery/logs/20240614_011333_TSbgng_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718327717.yq01-qianmo-com-255-100-15.yq01.baidu.com.3381.0 and /dev/null differ diff --git a/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 1aaeb21e..00000000 Binary files a/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/best/model.pth b/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/best/model.pth deleted file mode 100644 index ac8922e9..00000000 Binary files a/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/best/model.pth and /dev/null differ diff --git a/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718331810.yq01-qianmo-com-255-100-15.yq01.baidu.com.11805.0 b/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718331810.yq01-qianmo-com-255-100-15.yq01.baidu.com.11805.0 deleted file mode 100644 index c2158f35..00000000 Binary files a/materials_discovery/logs/20240614_022146_DD95AW_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718331810.yq01-qianmo-com-255-100-15.yq01.baidu.com.11805.0 and /dev/null differ diff --git a/materials_discovery/logs/20240614_031318_34p4rx_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240614_031318_34p4rx_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240614_031318_34p4rx_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240614_031318_34p4rx_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718335012.yq01-qianmo-com-255-100-15.yq01.baidu.com.17916.0 b/materials_discovery/logs/20240614_031318_34p4rx_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718335012.yq01-qianmo-com-255-100-15.yq01.baidu.com.17916.0 deleted file mode 100644 index 3cd2a4d3..00000000 Binary files a/materials_discovery/logs/20240614_031318_34p4rx_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718335012.yq01-qianmo-com-255-100-15.yq01.baidu.com.17916.0 and /dev/null differ diff --git a/materials_discovery/logs/20240618_085920_SAtUzS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240618_085920_SAtUzS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240618_085920_SAtUzS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240618_090123_TQAXQN_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240618_090123_TQAXQN_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240618_090123_TQAXQN_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240618_090123_TQAXQN_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718701360.yq01-qianmo-com-255-100-15.yq01.baidu.com.888.0 b/materials_discovery/logs/20240618_090123_TQAXQN_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718701360.yq01-qianmo-com-255-100-15.yq01.baidu.com.888.0 deleted file mode 100644 index 0476b98f..00000000 Binary files a/materials_discovery/logs/20240618_090123_TQAXQN_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718701360.yq01-qianmo-com-255-100-15.yq01.baidu.com.888.0 and /dev/null differ diff --git a/materials_discovery/logs/20240618_090542_xpjoG2_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240618_090542_xpjoG2_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240618_090542_xpjoG2_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240618_090542_xpjoG2_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718701744.yq01-qianmo-com-255-100-15.yq01.baidu.com.1932.0 b/materials_discovery/logs/20240618_090542_xpjoG2_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718701744.yq01-qianmo-com-255-100-15.yq01.baidu.com.1932.0 deleted file mode 100644 index 08392d20..00000000 Binary files a/materials_discovery/logs/20240618_090542_xpjoG2_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718701744.yq01-qianmo-com-255-100-15.yq01.baidu.com.1932.0 and /dev/null differ diff --git a/materials_discovery/logs/20240618_111847_Ll83HI_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240618_111847_Ll83HI_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 5d255820..00000000 Binary files a/materials_discovery/logs/20240618_111847_Ll83HI_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240618_111847_Ll83HI_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718709609.yq01-qianmo-com-255-100-15.yq01.baidu.com.15375.0 b/materials_discovery/logs/20240618_111847_Ll83HI_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718709609.yq01-qianmo-com-255-100-15.yq01.baidu.com.15375.0 deleted file mode 100644 index 03aed6d4..00000000 Binary files a/materials_discovery/logs/20240618_111847_Ll83HI_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718709609.yq01-qianmo-com-255-100-15.yq01.baidu.com.15375.0 and /dev/null differ diff --git a/materials_discovery/logs/20240619_015836_VKQDGX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240619_015836_VKQDGX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 5d255820..00000000 Binary files a/materials_discovery/logs/20240619_015836_VKQDGX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240619_015836_VKQDGX_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718762389.yq01-qianmo-com-255-100-15.yq01.baidu.com.16145.0 b/materials_discovery/logs/20240619_015836_VKQDGX_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718762389.yq01-qianmo-com-255-100-15.yq01.baidu.com.16145.0 deleted file mode 100644 index 5a3cc1bd..00000000 Binary files a/materials_discovery/logs/20240619_015836_VKQDGX_coll_v1.2_train.npz_GemNet/logs/events.out.tfevents.1718762389.yq01-qianmo-com-255-100-15.yq01.baidu.com.16145.0 and /dev/null differ diff --git a/materials_discovery/logs/20240623_072954_gjOMul_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_072954_gjOMul_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_072954_gjOMul_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_074303_FKc8lX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_074303_FKc8lX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_074303_FKc8lX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_075640_9ugZM5_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_075640_9ugZM5_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_075640_9ugZM5_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_080111_afa3Az_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_080111_afa3Az_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_080111_afa3Az_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_100001_4FvvwS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_100001_4FvvwS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_100001_4FvvwS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_100134_wFGrsz_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_100134_wFGrsz_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_100134_wFGrsz_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_100405_5aWzCV_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_100405_5aWzCV_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_100405_5aWzCV_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_100714_5KIeRd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_100714_5KIeRd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_100714_5KIeRd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_101328_GVMSDx_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_101328_GVMSDx_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_101328_GVMSDx_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_101648_alWQ1h_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_101648_alWQ1h_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_101648_alWQ1h_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_103409_fnGzMt_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_103409_fnGzMt_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_103409_fnGzMt_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_103859_OkF7Cd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_103859_OkF7Cd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_103859_OkF7Cd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_104043_UqyjnY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_104043_UqyjnY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_104043_UqyjnY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_104514_jIwOwF_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_104514_jIwOwF_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_104514_jIwOwF_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_105313_emT7pH_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_105313_emT7pH_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_105313_emT7pH_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_105517_OBlnzY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_105517_OBlnzY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_105517_OBlnzY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_105632_qce4xo_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_105632_qce4xo_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_105632_qce4xo_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_105936_PHAwVg_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_105936_PHAwVg_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_105936_PHAwVg_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_110206_MoLmig_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_110206_MoLmig_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_110206_MoLmig_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_110635_1YqZKB_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_110635_1YqZKB_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_110635_1YqZKB_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_111416_wpYCgm_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_111416_wpYCgm_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_111416_wpYCgm_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_111706_VK3HbT_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_111706_VK3HbT_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_111706_VK3HbT_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_112516_N7jXE6_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_112516_N7jXE6_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_112516_N7jXE6_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_113636_i9oPMi_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_113636_i9oPMi_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_113636_i9oPMi_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_114248_tpSths_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_114248_tpSths_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_114248_tpSths_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_123220_IXunQG_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_123220_IXunQG_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_123220_IXunQG_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_123530_lzl0xd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_123530_lzl0xd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_123530_lzl0xd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_124642_9IlSqX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_124642_9IlSqX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_124642_9IlSqX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_124817_QsTLWe_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_124817_QsTLWe_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_124817_QsTLWe_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_124933_mKfti1_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_124933_mKfti1_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_124933_mKfti1_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_125118_yxxjHn_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_125118_yxxjHn_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_125118_yxxjHn_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_125434_FzspTU_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_125434_FzspTU_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_125434_FzspTU_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_125736_oLzjo5_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_125736_oLzjo5_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_125736_oLzjo5_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_125823_yYfvoP_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_125823_yYfvoP_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_125823_yYfvoP_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_130203_EbhNlF_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_130203_EbhNlF_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_130203_EbhNlF_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_130401_EtZMiE_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_130401_EtZMiE_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_130401_EtZMiE_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_131729_nhBdSc_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_131729_nhBdSc_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_131729_nhBdSc_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_132152_IxUYho_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_132152_IxUYho_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_132152_IxUYho_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_132814_hK3GMY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_132814_hK3GMY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_132814_hK3GMY_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_133747_d7krWP_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_133747_d7krWP_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_133747_d7krWP_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_133847_nCZzXS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_133847_nCZzXS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_133847_nCZzXS_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_134326_uO3j0s_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_134326_uO3j0s_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_134326_uO3j0s_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_135732_Ljtskk_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_135732_Ljtskk_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_135732_Ljtskk_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240623_142142_2cpDEd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240623_142142_2cpDEd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240623_142142_2cpDEd_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240626_032007_vi7Gyv_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240626_032007_vi7Gyv_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240626_032007_vi7Gyv_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240626_040817_0CxpmX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240626_040817_0CxpmX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240626_040817_0CxpmX_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/logs/20240626_041232_7HJlxr_coll_v1.2_train.npz_GemNet/best/best_metrics.npz b/materials_discovery/logs/20240626_041232_7HJlxr_coll_v1.2_train.npz_GemNet/best/best_metrics.npz deleted file mode 100644 index 7edd4175..00000000 Binary files a/materials_discovery/logs/20240626_041232_7HJlxr_coll_v1.2_train.npz_GemNet/best/best_metrics.npz and /dev/null differ diff --git a/materials_discovery/predict.ipynb b/materials_discovery/predict.ipynb deleted file mode 100644 index 7a525572..00000000 --- a/materials_discovery/predict.ipynb +++ /dev/null @@ -1,208 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\r\n", - "import os\r\n", - "os.environ[\"TF_CPP_MIN_LOG_LEVEL\"] = \"1\"\r\n", - "os.environ[\"AUTOGRAPH_VERBOSITY\"] = \"1\"\r\n", - "\r\n", - "# Set up logger\r\n", - "import logging\r\n", - "logger = logging.getLogger()\r\n", - "logger.handlers = []\r\n", - "ch = logging.StreamHandler()\r\n", - "formatter = logging.Formatter(\r\n", - " fmt=\"%(asctime)s (%(levelname)s): %(message)s\", datefmt=\"%Y-%m-%d %H:%M:%S\"\r\n", - ")\r\n", - "ch.setFormatter(formatter)\r\n", - "logger.addHandler(ch)\r\n", - "logger.setLevel(\"INFO\")\r\n", - "\r\n", - "import tensorflow as tf\r\n", - "# TensorFlow logging verbosity\r\n", - "tf.get_logger().setLevel(\"WARN\")\r\n", - "tf.autograph.set_verbosity(1)\r\n", - "\r\n", - "# GemNet imports\r\n", - "from gemnet.model.gemnet import GemNet\r\n", - "from gemnet.training.data_container import DataContainer" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Custom molecule class to use molecules from ase" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Molecule(DataContainer):\r\n", - " \"\"\"\r\n", - " Implements the DataContainer but for a single molecule. Requires custom init method.\r\n", - " \"\"\"\r\n", - " def __init__(self, R, Z, cutoff, int_cutoff, triplets_only=False):\r\n", - " self.index_keys = [\r\n", - " \"batch_seg\",\r\n", - " \"id_undir\",\r\n", - " \"id_swap\",\r\n", - " \"id_c\",\r\n", - " \"id_a\",\r\n", - " \"id3_expand_ba\",\r\n", - " \"id3_reduce_ca\",\r\n", - " \"Kidx3\",\r\n", - " ]\r\n", - " if not triplets_only:\r\n", - " self.index_keys += [\r\n", - " \"id4_int_b\",\r\n", - " \"id4_int_a\",\r\n", - " \"id4_reduce_ca\",\r\n", - " \"id4_expand_db\",\r\n", - " \"id4_reduce_cab\",\r\n", - " \"id4_expand_abd\",\r\n", - " \"Kidx4\",\r\n", - " \"id4_reduce_intm_ca\",\r\n", - " \"id4_expand_intm_db\",\r\n", - " \"id4_reduce_intm_ab\",\r\n", - " \"id4_expand_intm_ab\",\r\n", - " ]\r\n", - " self.triplets_only = triplets_only\r\n", - " self.cutoff = cutoff\r\n", - " self.int_cutoff = int_cutoff\r\n", - " self.keys = [\"N\", \"Z\", \"R\", \"F\", \"E\"]\r\n", - "\r\n", - " assert R.shape == (len(Z), 3)\r\n", - " self.R = R\r\n", - " self.Z = Z\r\n", - " self.N = np.array([len(Z)], dtype=np.int32)\r\n", - " self.E = np.zeros(1, dtype=np.float32).reshape(1, 1)\r\n", - " self.F = np.zeros((len(Z), 3), dtype=np.float32)\r\n", - "\r\n", - " self.N_cumsum = np.concatenate([[0], np.cumsum(self.N)])\r\n", - " self.addID = False\r\n", - " self.dtypes, dtypes2 = self.get_dtypes()\r\n", - " self.dtypes.update(dtypes2) # merge all dtypes in single dict\r\n", - "\r\n", - " def get(self):\r\n", - " \"\"\"\r\n", - " Get the molecule representation in the expected format for the GemNet model.\r\n", - " \"\"\"\r\n", - " data = self.__getitem__(0)\r\n", - " for var in [\"E\", \"F\"]:\r\n", - " data.pop(var) # not needed i.e.e not kown -> want to calculate this\r\n", - " return data" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Setup the model and the data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Model setup\r\n", - "scale_file = \"./scaling_factors.json\"\r\n", - "pytorch_weights_file = \"./pretrained/best/model.pth\"\r\n", - "# depends on GemNet model that is loaded\r\n", - "triplets_only = False\r\n", - "direct_forces = False\r\n", - "cutoff = 5.0\r\n", - "int_cutoff = 10.0\r\n", - "\r\n", - "# Data setup\r\n", - "from ase.build import molecule as ase_molecule_db\r\n", - "\r\n", - "mol = ase_molecule_db('C7NH5')\r\n", - "R = mol.get_positions()\r\n", - "Z = mol.get_atomic_numbers()\r\n", - "\r\n", - "molecule = Molecule(\r\n", - " R, Z, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only\r\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model = GemNet(\r\n", - " num_spherical=7,\r\n", - " num_radial=6,\r\n", - " num_blocks=4,\r\n", - " emb_size_atom=128,\r\n", - " emb_size_edge=128,\r\n", - " emb_size_trip=64,\r\n", - " emb_size_quad=32,\r\n", - " emb_size_rbf=16,\r\n", - " emb_size_cbf=16,\r\n", - " emb_size_sbf=32,\r\n", - " emb_size_bil_trip=64,\r\n", - " emb_size_bil_quad=32,\r\n", - " num_before_skip=1,\r\n", - " num_after_skip=1,\r\n", - " num_concat=1,\r\n", - " num_atom=2,\r\n", - " num_targets=1,\r\n", - " cutoff=cutoff,\r\n", - " int_cutoff=int_cutoff, # no effect for GemNet-(d)T\r\n", - " scale_file=scale_file,\r\n", - " triplets_only=triplets_only,\r\n", - " direct_forces=direct_forces,\r\n", - ")\r\n", - "# model.load_weights(pytorch_weights_file)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Run the model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "energy, forces = model.predict(molecule.get())\r\n", - "\r\n", - "print(\"Energy [eV]\", energy)\r\n", - "print(\"Forces [eV/°A]\", forces)" - ] - } - ], - "metadata": { - "interpreter": { - "hash": "6d9d58ddb04bb635eba824a3c64b6d0110bcc4c6cff8b192a6f7cbbb2bf10de4" - }, - "kernelspec": { - "display_name": "Python 3.5.4 64-bit", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/materials_discovery/pretrained/GemNet-Q/model.pth b/materials_discovery/pretrained/GemNet-Q/model.pth deleted file mode 100644 index 5ceaa1f3..00000000 Binary files a/materials_discovery/pretrained/GemNet-Q/model.pth and /dev/null differ diff --git a/materials_discovery/pretrained/GemNet-Q/model_kwargs.json b/materials_discovery/pretrained/GemNet-Q/model_kwargs.json deleted file mode 100644 index 51d2bd8b..00000000 --- a/materials_discovery/pretrained/GemNet-Q/model_kwargs.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "activation": "swish", - "cutoff": 5.0, - "direct_forces": false, - "emb_size_atom": 128, - "emb_size_bil_quad": 32, - "emb_size_bil_trip": 64, - "emb_size_cbf": 16, - "emb_size_edge": 128, - "emb_size_quad": 32, - "emb_size_rbf": 16, - "emb_size_sbf": 32, - "emb_size_trip": 64, - "envelope_exponent": 5, - "extensive": true, - "forces_coupled": false, - "int_cutoff": 10.0, - "num_after_skip": 1, - "num_atom": 2, - "num_before_skip": 1, - "num_blocks": 4, - "num_concat": 1, - "num_radial": 6, - "num_spherical": 7, - "num_targets": 1, - "output_init": "HeOrthogonal", - "scale_file": "scaling_factors.json", - "triplets_only": false -} diff --git a/materials_discovery/pretrained/GemNet-T/model.pth b/materials_discovery/pretrained/GemNet-T/model.pth deleted file mode 100644 index 1468dbf4..00000000 Binary files a/materials_discovery/pretrained/GemNet-T/model.pth and /dev/null differ diff --git a/materials_discovery/pretrained/GemNet-T/model_kwargs.json b/materials_discovery/pretrained/GemNet-T/model_kwargs.json deleted file mode 100644 index a6af78da..00000000 --- a/materials_discovery/pretrained/GemNet-T/model_kwargs.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "activation": "swish", - "cutoff": 5.0, - "direct_forces": false, - "emb_size_atom": 128, - "emb_size_bil_quad": 32, - "emb_size_bil_trip": 64, - "emb_size_cbf": 16, - "emb_size_edge": 128, - "emb_size_quad": 32, - "emb_size_rbf": 16, - "emb_size_sbf": 32, - "emb_size_trip": 64, - "envelope_exponent": 5, - "extensive": true, - "forces_coupled": false, - "int_cutoff": 10.0, - "num_after_skip": 1, - "num_atom": 2, - "num_before_skip": 1, - "num_blocks": 4, - "num_concat": 1, - "num_radial": 6, - "num_spherical": 7, - "num_targets": 1, - "output_init": "HeOrthogonal", - "scale_file": "scaling_factors.json", - "triplets_only": true -} diff --git a/materials_discovery/pretrained/scaling_factors.json b/materials_discovery/pretrained/scaling_factors.json deleted file mode 100644 index 7db85202..00000000 --- a/materials_discovery/pretrained/scaling_factors.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "AtomUpdate_1_sum": 1.0634181648492813, - "AtomUpdate_2_sum": 1.023792326450348, - "AtomUpdate_3_sum": 0.8776205033063889, - "AtomUpdate_4_sum": 0.8766722679138184, - "OutBlock_0_had": 3.786764442920685, - "OutBlock_0_sum": 1.1001640558242798, - "OutBlock_1_had": 2.9567965865135193, - "OutBlock_1_sum": 0.989106222987175, - "OutBlock_2_had": 2.9033637046813965, - "OutBlock_2_sum": 0.9261481463909149, - "OutBlock_3_had": 2.95436292886734, - "OutBlock_3_sum": 0.8048739284276962, - "OutBlock_4_had": 3.0642566084861755, - "OutBlock_4_sum": 0.8166412264108658, - "QuadInteraction_1_had_cbf": 30.91912269592285, - "QuadInteraction_1_had_rbf": 3.838575780391693, - "QuadInteraction_1_sum_sbf": 2.015521287918091, - "QuadInteraction_2_had_cbf": 29.30245018005371, - "QuadInteraction_2_had_rbf": 3.4999656677246094, - "QuadInteraction_2_sum_sbf": 1.9548791646957397, - "QuadInteraction_3_had_cbf": 30.250303268432617, - "QuadInteraction_3_had_rbf": 3.506244122982025, - "QuadInteraction_3_sum_sbf": 1.9496761560440063, - "QuadInteraction_4_had_cbf": 30.560321807861328, - "QuadInteraction_4_had_rbf": 3.420105278491974, - "QuadInteraction_4_sum_sbf": 2.013889789581299, - "TripInteraction_1_had_rbf": 2.9607054591178894, - "TripInteraction_1_sum_cbf": 5.57607889175415, - "TripInteraction_2_had_rbf": 3.0770468711853027, - "TripInteraction_2_sum_cbf": 6.400703430175781, - "TripInteraction_3_had_rbf": 3.4999406337738037, - "TripInteraction_3_sum_cbf": 5.825993537902832, - "TripInteraction_4_had_rbf": 3.34897518157959, - "TripInteraction_4_sum_cbf": 5.816178321838379 -} diff --git a/materials_discovery/pyproject.toml b/materials_discovery/pyproject.toml deleted file mode 100644 index 4fcdae63..00000000 --- a/materials_discovery/pyproject.toml +++ /dev/null @@ -1,66 +0,0 @@ -[build-system] -requires = ["setuptools>=65", "setuptools_scm[toml]>=6.2"] -build-backend = "setuptools.build_meta" - -[project] -name = "gennet_paddle" -dynamic = ["version", "dependencies"] -description = "A library for scientific machine learning" -readme = "README.md" -license = { text = "Apache-2.0" } -authors = [{ name = "PaddlePaddle" }] -requires-python = ">=3.8" -keywords = [ - "Machine learning", - "Deep learning", - "Differential equations", - "AI4Science", - "Physics-informed neural networks", - "PaddlePaddle", -] -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Scientific/Engineering :: Mathematics", -] - -[project.urls] -Homepage = "https://github.com/PaddlePaddle/PaddleScience" -"Bug Tracker" = "https://github.com/PaddlePaddle/PaddleScience/issues" -Changelog = "https://github.com/PaddlePaddle/PaddleScience/releases" -Documentation = "https://paddlescience-docs.readthedocs.io/zh/latest/" - -[tool.setuptools.packages.find] -where = ["."] -exclude = [ - "docs*", - "examples*", - "jointContribution*", - "test_tipc*", - "test*", - "tools*", -] - -[tool.ruff] -line-length = 88 -ignore = ["E501", "E741", "E731"] -extend-exclude = [ - "./ppsci/geometry/inflation.py", - "./ppsci/autodiff/__init__.py", -] - -[tool.setuptools_scm] -version_file = "ppsci/_version.py" -tag_regex = "v(\\d+\\.\\d+\\.\\d+)" -fallback_version = "0.0.0" -version_scheme = "post-release" - -[tool.setuptools.dynamic] -dependencies = { file = ["requirements.txt"] } \ No newline at end of file diff --git a/materials_discovery/requirements.txt b/materials_discovery/requirements.txt deleted file mode 100644 index 79e02d63..00000000 --- a/materials_discovery/requirements.txt +++ /dev/null @@ -1,10 +0,0 @@ -ase -jupyterlab -nglview -numba -numpy -paddlepaddle-gpu==1.10 -paddlepaddle-gpu-scatter -scipy>=1.3 -sympy>=1.5 -tqdm diff --git a/materials_discovery/scaling_factors.json b/materials_discovery/scaling_factors.json deleted file mode 100644 index 9e905470..00000000 --- a/materials_discovery/scaling_factors.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "AtomUpdate_1_sum": 1.0634181648492813, - "AtomUpdate_2_sum": 1.023792326450348, - "AtomUpdate_3_sum": 0.8776205033063889, - "AtomUpdate_4_sum": 0.8766722679138184, - "OutBlock_0_had": 3.786764442920685, - "OutBlock_0_sum": 1.1001640558242798, - "OutBlock_1_had": 2.9567965865135193, - "OutBlock_1_sum": 0.989106222987175, - "OutBlock_2_had": 2.9033637046813965, - "OutBlock_2_sum": 0.9261481463909149, - "OutBlock_3_had": 2.95436292886734, - "OutBlock_3_sum": 0.8048739284276962, - "OutBlock_4_had": 3.0642566084861755, - "OutBlock_4_sum": 0.8166412264108658, - "QuadInteraction_1_had_cbf": 30.91912269592285, - "QuadInteraction_1_had_rbf": 3.838575780391693, - "QuadInteraction_1_sum_sbf": 2.015521287918091, - "QuadInteraction_2_had_cbf": 29.30245018005371, - "QuadInteraction_2_had_rbf": 3.4999656677246094, - "QuadInteraction_2_sum_sbf": 1.9548791646957397, - "QuadInteraction_3_had_cbf": 30.250303268432617, - "QuadInteraction_3_had_rbf": 3.506244122982025, - "QuadInteraction_3_sum_sbf": 1.9496761560440063, - "QuadInteraction_4_had_cbf": 30.560321807861328, - "QuadInteraction_4_had_rbf": 3.420105278491974, - "QuadInteraction_4_sum_sbf": 2.013889789581299, - "TripInteraction_1_had_rbf": 2.9607054591178894, - "TripInteraction_1_sum_cbf": 5.57607889175415, - "TripInteraction_2_had_rbf": 3.0770468711853027, - "TripInteraction_2_sum_cbf": 6.400703430175781, - "TripInteraction_3_had_rbf": 3.4999406337738037, - "TripInteraction_3_sum_cbf": 5.825993537902832, - "TripInteraction_4_had_rbf": 3.34897518157959, - "TripInteraction_4_sum_cbf": 5.816178321838379, - "comment": "GemNet" -} diff --git a/materials_discovery/setup.py b/materials_discovery/setup.py deleted file mode 100644 index 2d6a0542..00000000 --- a/materials_discovery/setup.py +++ /dev/null @@ -1,15 +0,0 @@ -import setuptools - -with open("requirements.txt", "r") as f: - install_requires = f.read().splitlines() -setuptools.setup( - name="gemnet_pytorch", - version="1.0", - description="GemNet: Universal Directional Graph Neural Networks for Molecules", - author="Johannes Gasteiger, Florian Becker, Stephan Günnemann", - author_email="j.gasteiger@in.tum.de", - packages=["gemnet"], - install_requires=install_requires, - zip_safe=False, - python_requires=">=3.8", -) diff --git a/materials_discovery/test.py b/materials_discovery/test.py deleted file mode 100644 index b8d29820..00000000 --- a/materials_discovery/test.py +++ /dev/null @@ -1,191 +0,0 @@ -# # import paddle -# # import torch -# # import torch_scatter -# # import numpy as np -# # from typing import Optional - -# # # # def _scatter_sum(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, -# # # # out: Optional[paddle.Tensor] = None, -# # # # dim_size: Optional[int] = None) -> paddle.Tensor: -# # # # index = broadcast(index, src, dim) -# # # # if out is None: -# # # # size = list(src.shape) -# # # # if dim_size is not None: -# # # # size[dim] = dim_size -# # # # elif index.numel() == 0: -# # # # size[dim] = 0 -# # # # else: -# # # # size[dim] = int(index.max()) + 1 -# # # # out = paddle.zeros(size, dtype=src.dtype) -# # # # return out.scatter_add_(dim, index, src) -# # # # else: -# # # # return out.scatter_add_(dim, index, src) - -# # # # def paddle_scatter(src, index, dim, out=None, dim_size=None, reduce='add'): -# # # # """Implement paddle version API like torch_scatter.scatter -# # # # """ -# # # # if reduce not in ('add', 'mean'): -# # # # raise ValueError('The paddle_scatter only support add or mean reduce type.') - -# # # # index = _broadcast(index, src, dim) -# # # # if out is None: -# # # # size = list(src.shape) -# # # # if dim_size is not None: -# # # # size[dim] = dim_size -# # # # elif index.numel() == 0: -# # # # size[dim] = 0 -# # # # else: -# # # # size[dim] = int(index.max()) + 1 -# # # # out = paddle.zeros(size, dtype=src.dtype) -# # # # return paddle.put_along_axis(arr=out, indices=index, values=src, axis=dim, reduce=reduce, include_self=False) - - - - -# # def _broadcast(src: paddle.Tensor, other: paddle.Tensor, dim: int): -# # if dim < 0: -# # dim = other.dim() + dim -# # if src.dim() == 1: -# # for _ in range(0, dim): -# # src = src.unsqueeze(0) -# # for _ in range(src.dim(), other.dim()): -# # src = src.unsqueeze(-1) -# # src = src.expand(other.shape) -# # return src - - -# # def _scatter_sum(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, -# # out: Optional[paddle.Tensor] = None, -# # dim_size: Optional[int] = None) -> paddle.Tensor: -# # index = _broadcast(index, src, dim) -# # if out is None: -# # size = list(src.shape) -# # if dim_size is not None: -# # size[dim] = dim_size -# # elif index.numel() == 0: -# # size[dim] = 0 -# # else: -# # size[dim] = int(index.max()) + 1 -# # out = paddle.zeros(size, dtype=src.dtype) -# # return paddle.put_along_axis(arr=out, indices=index, values=src, axis=dim, reduce='add') - - -# # def _scatter_add(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, -# # out: Optional[paddle.Tensor] = None, -# # dim_size: Optional[int] = None) -> paddle.Tensor: -# # return _scatter_sum(src, index, dim, out, dim_size) - - -# # def _scatter_mean(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, -# # out: Optional[paddle.Tensor] = None, -# # dim_size: Optional[int] = None) -> paddle.Tensor: -# # out = _scatter_sum(src, index, dim, out, dim_size) -# # dim_size = out.shape[dim] - -# # index_dim = dim -# # if index_dim < 0: -# # index_dim = index_dim + src.dim() -# # if index.dim() <= index_dim: -# # index_dim = index.dim() - 1 - -# # ones = paddle.ones(index.shape, dtype=src.dtype) -# # count = _scatter_sum(ones, index, index_dim, None, dim_size) -# # count[count < 1] = 1 -# # count = _broadcast(count, out, dim) -# # if out.is_floating_point(): -# # out = paddle.divide(out, count) -# # # out.true_divide_(count) -# # else: -# # out = paddle.floor_divide(out, count) -# # # out.div_(count, rounding_mode='floor') -# # return out - - -# # def paddle_scatter(src: paddle.Tensor, index: paddle.Tensor, dim: int = -1, -# # out: Optional[paddle.Tensor] = None, dim_size: Optional[int] = None, -# # reduce: str = "sum") -> paddle.Tensor: -# # r""" -# # """ -# # if reduce == 'sum' or reduce == 'add': -# # return _scatter_sum(src, index, dim, out, dim_size) -# # elif reduce == 'mean': -# # return _scatter_mean(src, index, dim, out, dim_size) -# # else: -# # raise ValueError('Only support add or mean') - -# # x = np.array([[10, 30, 20], [60, 40, 50]]) -# # src = np.array([[1,2],[3,4]]) -# # indices = np.zeros([2,2]).astype(np.int64) - -# # px = paddle.to_tensor(x) -# # psrc = paddle.to_tensor(src) -# # pindices = paddle.to_tensor(indices) -# # # print(psrc, pindices) -# # pout = paddle_scatter(src=psrc, dim=0, index=pindices, out=None, dim_size=2, reduce='mean') -# # print(pout) - - -# # tx = torch.tensor(x) -# # tsrc = torch.tensor(src) -# # tindices = torch.tensor(indices) -# # # tout = torch.scatter(input=tx, src=tsrc, index=tindices, dim=0, reduce='add') -# # # print(tout) - -# # # print(tsrc, tindices) -# # tsout = torch_scatter.scatter(src=tsrc, dim=0, index=tindices, out=None, dim_size=2, reduce='mean') -# # print(tsout) - - - - -# import paddle -# x = paddle.create_parameter(shape=[128, 1], dtype='float32') -# # init_Orthogonal = paddle.nn.initializer.Orthogonal() -# # init_Orthogonal(x) -# # print(x) - -# v = paddle.var(x, axis=1) -# print(v) - - -# import torch -# x = torch.tensor(x.numpy()) -# # init_Orthogonal = paddle.nn.initializer.Orthogonal() -# # init_Orthogonal(x) -# # print(x) - -# v = torch.var(x, axis=1) -# print(v) - - -import paddle - - -paddle.base.core.set_prim_eager_enabled(True) - -class MyNet(paddle.nn.Layer): - def __init__(self): - super(MyNet, self).__init__() - self.weight = self.create_parameter(shape=(2,2), dtype=paddle.float32, is_bias=False) - self.bias = self.create_parameter(shape=(2,2), dtype=paddle.float32, is_bias=True) - self.add_parameter("weight", self.weight) - self.add_parameter("bias", self.bias) - - def forward(self, x): - y = paddle.matmul(x, self.weight) + self.bias - return paddle.tanh(y) - - -x = paddle.randn(shape=(2,2), dtype=paddle.float32) -net = MyNet() -y = net(x) - - -grad1 = paddle.grad(y, x) -grad2 = paddle.grad(grad1, x) -loss = paddle.norm(grad2, p=2) - - -opt = paddle.optimizer.Adam(parameters=net.parameters()) -loss.backward() -opt.update() \ No newline at end of file diff --git a/materials_discovery/train.ipynb b/materials_discovery/train.ipynb deleted file mode 100644 index 1bbe1f14..00000000 --- a/materials_discovery/train.ipynb +++ /dev/null @@ -1,869 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Set up logger\n", - "import os\n", - "import logging\n", - "\n", - "os.environ[\"TF_CPP_MIN_LOG_LEVEL\"] = \"1\"\n", - "os.environ[\"AUTOGRAPH_VERBOSITY\"] = \"1\"\n", - "\n", - "logger = logging.getLogger()\n", - "logger.handlers = []\n", - "ch = logging.StreamHandler()\n", - "formatter = logging.Formatter(\n", - " fmt=\"%(asctime)s (%(levelname)s): %(message)s\", datefmt=\"%Y-%m-%d %H:%M:%S\"\n", - ")\n", - "ch.setFormatter(formatter)\n", - "logger.addHandler(ch)\n", - "logger.setLevel(\"INFO\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import yaml\n", - "import string\n", - "import ast\n", - "import random\n", - "import time\n", - "from datetime import datetime\n", - "\n", - "from gemnet.model.gemnet import GemNet\n", - "from gemnet.training.trainer import Trainer\n", - "from gemnet.training.metrics import Metrics, BestMetrics\n", - "from gemnet.training.data_container import DataContainer\n", - "from gemnet.training.data_provider import DataProvider\n", - "\n", - "import torch\n", - "from torch.utils.tensorboard import SummaryWriter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Load config file" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "with open('config.yaml', 'r') as c:\n", - " config = yaml.safe_load(c)\n", - " \n", - "# For strings that yaml doesn't parse (e.g. None)\n", - "for key, val in config.items():\n", - " if type(val) is str:\n", - " try:\n", - " config[key] = ast.literal_eval(val)\n", - " except (ValueError, SyntaxError):\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "num_spherical = config[\"num_spherical\"]\n", - "num_radial = config[\"num_radial\"]\n", - "num_blocks = config[\"num_blocks\"]\n", - "emb_size_atom = config[\"emb_size_atom\"]\n", - "emb_size_edge = config[\"emb_size_edge\"]\n", - "emb_size_trip = config[\"emb_size_trip\"]\n", - "emb_size_quad = config[\"emb_size_quad\"]\n", - "emb_size_rbf = config[\"emb_size_rbf\"]\n", - "emb_size_cbf = config[\"emb_size_cbf\"]\n", - "emb_size_sbf = config[\"emb_size_sbf\"]\n", - "num_before_skip = config[\"num_before_skip\"]\n", - "num_after_skip = config[\"num_after_skip\"]\n", - "num_concat = config[\"num_concat\"]\n", - "num_atom = config[\"num_atom\"]\n", - "emb_size_bil_quad = config[\"emb_size_bil_quad\"]\n", - "emb_size_bil_trip = config[\"emb_size_bil_trip\"]\n", - "triplets_only = config[\"triplets_only\"]\n", - "forces_coupled = config[\"forces_coupled\"]\n", - "direct_forces = config[\"direct_forces\"]\n", - "mve = config[\"mve\"]\n", - "cutoff = config[\"cutoff\"]\n", - "int_cutoff = config[\"int_cutoff\"]\n", - "envelope_exponent = config[\"envelope_exponent\"]\n", - "extensive = config[\"extensive\"]\n", - "output_init = config[\"output_init\"]\n", - "scale_file = config[\"scale_file\"]\n", - "data_seed = config[\"data_seed\"]\n", - "dataset = config[\"dataset\"]\n", - "val_dataset = config[\"val_dataset\"]\n", - "num_train = config[\"num_train\"]\n", - "num_val = config[\"num_val\"]\n", - "logdir = config[\"logdir\"]\n", - "loss = config[\"loss\"]\n", - "tfseed = config[\"tfseed\"]\n", - "num_steps = config[\"num_steps\"]\n", - "rho_force = config[\"rho_force\"]\n", - "ema_decay = config[\"ema_decay\"]\n", - "weight_decay = config[\"weight_decay\"]\n", - "grad_clip_max = config[\"grad_clip_max\"]\n", - "agc = config[\"agc\"]\n", - "decay_patience = config[\"decay_patience\"]\n", - "decay_factor = config[\"decay_factor\"]\n", - "decay_cooldown = config[\"decay_cooldown\"]\n", - "batch_size = config[\"batch_size\"]\n", - "evaluation_interval = config[\"evaluation_interval\"]\n", - "patience = config[\"patience\"]\n", - "save_interval = config[\"save_interval\"]\n", - "learning_rate = config[\"learning_rate\"]\n", - "warmup_steps = config[\"warmup_steps\"]\n", - "decay_steps = config[\"decay_steps\"]\n", - "decay_rate = config[\"decay_rate\"]\n", - "staircase = config[\"staircase\"]\n", - "restart = config[\"restart\"]\n", - "comment = config[\"comment\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Set paths and create directories" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-06-14 00:39:58 (INFO): Start training\n", - "2024-06-14 00:39:58 (INFO): Available GPUs: 7\n", - "2024-06-14 00:39:58 (INFO): CUDA Available: True\n", - "2024-06-14 00:39:58 (INFO): Directory: logs/20240614_003958_iaYEMI_coll_v1.2_train.npz_GemNet\n", - "2024-06-14 00:39:58 (INFO): Create directories\n" - ] - } - ], - "source": [ - "torch.manual_seed(tfseed)\n", - "\n", - "logging.info(\"Start training\")\n", - "num_gpus = torch.cuda.device_count()\n", - "cuda_available = torch.cuda.is_available()\n", - "logging.info(f\"Available GPUs: {num_gpus}\")\n", - "logging.info(f\"CUDA Available: {cuda_available}\")\n", - "if num_gpus == 0:\n", - " logging.warning(\"No GPUs were found. Training is run on CPU!\")\n", - "if not cuda_available:\n", - " logging.warning(\"CUDA unavailable. Training is run on CPU!\")\n", - "\n", - "# Used for creating a \"unique\" id for a run (almost impossible to generate the same twice)\n", - "def id_generator(\n", - " size=6, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits\n", - "):\n", - " return \"\".join(random.SystemRandom().choice(chars) for _ in range(size))\n", - "\n", - "# A unique directory name is created for this run based on the input\n", - "if (restart is None) or (restart == \"None\"):\n", - " directory = (\n", - " logdir\n", - " + \"/\"\n", - " + datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n", - " + \"_\"\n", - " + id_generator()\n", - " + \"_\"\n", - " + os.path.basename(dataset)\n", - " + \"_\"\n", - " + str(comment)\n", - " )\n", - "else:\n", - " directory = restart\n", - "\n", - "logging.info(f\"Directory: {directory}\")\n", - "logging.info(\"Create directories\")\n", - "\n", - "if not os.path.exists(directory):\n", - " os.makedirs(directory, exist_ok=True)\n", - "\n", - "best_dir = os.path.join(directory, \"best\")\n", - "if not os.path.exists(best_dir):\n", - " os.makedirs(best_dir)\n", - "log_dir = os.path.join(directory, \"logs\")\n", - "if not os.path.exists(log_dir):\n", - " os.makedirs(log_dir)\n", - "\n", - "extension = \".pth\"\n", - "log_path_model = f\"{log_dir}/model{extension}\"\n", - "log_path_training = f\"{log_dir}/training{extension}\"\n", - "best_path_model = f\"{best_dir}/model{extension}\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Initialize model" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-06-14 00:39:58 (INFO): Initialize model\n" - ] - }, - { - "data": { - "text/plain": [ - "GemNet(\n", - " (rbf_basis): BesselBasisLayer(\n", - " (envelope): Envelope()\n", - " )\n", - " (cbf_basis): SphericalBasisLayer(\n", - " (envelope): Envelope()\n", - " )\n", - " (sbf_basis): TensorBasisLayer(\n", - " (envelope): Envelope()\n", - " )\n", - " (cbf_basis3): SphericalBasisLayer(\n", - " (envelope): Envelope()\n", - " )\n", - " (mlp_rbf4): Dense(\n", - " (linear): Linear(in_features=6, out_features=16, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (mlp_cbf4): Dense(\n", - " (linear): Linear(in_features=42, out_features=16, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (mlp_sbf4): EfficientInteractionDownProjection()\n", - " (mlp_rbf3): Dense(\n", - " (linear): Linear(in_features=6, out_features=16, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (mlp_cbf3): EfficientInteractionDownProjection()\n", - " (mlp_rbf_h): Dense(\n", - " (linear): Linear(in_features=6, out_features=16, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (mlp_rbf_out): Dense(\n", - " (linear): Linear(in_features=6, out_features=16, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (atom_emb): AtomEmbedding(\n", - " (embeddings): Embedding(93, 128)\n", - " )\n", - " (edge_emb): EdgeEmbedding(\n", - " (dense): Dense(\n", - " (linear): Linear(in_features=262, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " (out_blocks): ModuleList(\n", - " (0-4): 5 x OutputBlock(\n", - " (dense_rbf): Dense(\n", - " (linear): Linear(in_features=16, out_features=128, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (scale_sum): ScalingFactor()\n", - " (layers): ModuleList(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1-2): 2 x ResidualLayer(\n", - " (dense_mlp): Sequential(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " (seq_energy): ModuleList(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1-2): 2 x ResidualLayer(\n", - " (dense_mlp): Sequential(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " (out_energy): Dense(\n", - " (linear): Linear(in_features=128, out_features=1, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " )\n", - " )\n", - " (int_blocks): ModuleList(\n", - " (0-3): 4 x InteractionBlock(\n", - " (dense_ca): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (quad_interaction): QuadrupletInteraction(\n", - " (dense_db): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (mlp_rbf): Dense(\n", - " (linear): Linear(in_features=16, out_features=128, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (scale_rbf): ScalingFactor()\n", - " (mlp_cbf): Dense(\n", - " (linear): Linear(in_features=16, out_features=32, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (scale_cbf): ScalingFactor()\n", - " (mlp_sbf): EfficientInteractionBilinear()\n", - " (scale_sbf_sum): ScalingFactor()\n", - " (down_projection): Dense(\n", - " (linear): Linear(in_features=128, out_features=32, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (up_projection_ca): Dense(\n", - " (linear): Linear(in_features=32, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (up_projection_ac): Dense(\n", - " (linear): Linear(in_features=32, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " (trip_interaction): TripletInteraction(\n", - " (dense_ba): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (mlp_rbf): Dense(\n", - " (linear): Linear(in_features=16, out_features=128, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (scale_rbf): ScalingFactor()\n", - " (mlp_cbf): EfficientInteractionBilinear()\n", - " (scale_cbf_sum): ScalingFactor()\n", - " (down_projection): Dense(\n", - " (linear): Linear(in_features=128, out_features=64, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (up_projection_ca): Dense(\n", - " (linear): Linear(in_features=64, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (up_projection_ac): Dense(\n", - " (linear): Linear(in_features=64, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " (layers_before_skip): ModuleList(\n", - " (0): ResidualLayer(\n", - " (dense_mlp): Sequential(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " (layers_after_skip): ModuleList(\n", - " (0): ResidualLayer(\n", - " (dense_mlp): Sequential(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " (atom_update): AtomUpdateBlock(\n", - " (dense_rbf): Dense(\n", - " (linear): Linear(in_features=16, out_features=128, bias=False)\n", - " (_activation): Identity()\n", - " )\n", - " (scale_sum): ScalingFactor()\n", - " (layers): ModuleList(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1-2): 2 x ResidualLayer(\n", - " (dense_mlp): Sequential(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " (concat_layer): EdgeEmbedding(\n", - " (dense): Dense(\n", - " (linear): Linear(in_features=384, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " (residual_m): ModuleList(\n", - " (0): ResidualLayer(\n", - " (dense_mlp): Sequential(\n", - " (0): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " (1): Dense(\n", - " (linear): Linear(in_features=128, out_features=128, bias=False)\n", - " (_activation): ScaledSiLU(\n", - " (_activation): SiLU()\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - " )\n", - ")" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "logging.info(\"Initialize model\")\n", - "model = GemNet(\n", - " num_spherical=num_spherical,\n", - " num_radial=num_radial,\n", - " num_blocks=num_blocks,\n", - " emb_size_atom=emb_size_atom,\n", - " emb_size_edge=emb_size_edge,\n", - " emb_size_trip=emb_size_trip,\n", - " emb_size_quad=emb_size_quad,\n", - " emb_size_rbf=emb_size_rbf,\n", - " emb_size_cbf=emb_size_cbf,\n", - " emb_size_sbf=emb_size_sbf,\n", - " num_before_skip=num_before_skip,\n", - " num_after_skip=num_after_skip,\n", - " num_concat=num_concat,\n", - " num_atom=num_atom,\n", - " emb_size_bil_quad=emb_size_bil_quad,\n", - " emb_size_bil_trip=emb_size_bil_trip,\n", - " num_targets=2 if mve else 1,\n", - " triplets_only=triplets_only,\n", - " direct_forces=direct_forces,\n", - " forces_coupled=forces_coupled,\n", - " cutoff=cutoff,\n", - " int_cutoff=int_cutoff,\n", - " envelope_exponent=envelope_exponent,\n", - " activation=\"swish\",\n", - " extensive=extensive,\n", - " output_init=output_init,\n", - " scale_file=scale_file,\n", - ")\n", - "# push to GPU if available\n", - "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", - "model.to(device)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Load dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-06-14 00:41:40 (INFO): Load dataset\n", - "2024-06-14 00:41:40 (INFO): Training data size: 120000\n", - "2024-06-14 00:41:40 (INFO): Validation data size: 10000\n" - ] - } - ], - "source": [ - "train = {}\n", - "validation = {}\n", - "\n", - "logging.info(\"Load dataset\")\n", - "data_container = DataContainer(\n", - " dataset, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only\n", - ")\n", - "\n", - "if val_dataset is not None:\n", - " # Initialize DataProvider\n", - " if num_train == 0:\n", - " num_train = len(data_container)\n", - " logging.info(f\"Training data size: {num_train}\")\n", - " data_provider = DataProvider(\n", - " data_container,\n", - " num_train,\n", - " 0,\n", - " batch_size,\n", - " seed=data_seed,\n", - " shuffle=True,\n", - " random_split=True,\n", - " )\n", - "\n", - " # Initialize validation datasets\n", - " val_data_container = DataContainer(\n", - " val_dataset,\n", - " cutoff=cutoff,\n", - " int_cutoff=int_cutoff,\n", - " triplets_only=triplets_only,\n", - " )\n", - " if num_val == 0:\n", - " num_val = len(val_data_container)\n", - " logging.info(f\"Validation data size: {num_val}\")\n", - " val_data_provider = DataProvider(\n", - " val_data_container,\n", - " 0,\n", - " num_val,\n", - " batch_size,\n", - " seed=data_seed,\n", - " shuffle=True,\n", - " random_split=True,\n", - " )\n", - "else:\n", - " # Initialize DataProvider (splits dataset into 3 sets based on data_seed and provides tf.datasets)\n", - " logging.info(f\"Training data size: {num_train}\")\n", - " logging.info(f\"Validation data size: {num_val}\")\n", - " assert num_train > 0\n", - " assert num_val > 0\n", - " data_provider = DataProvider(\n", - " data_container,\n", - " num_train,\n", - " num_val,\n", - " batch_size,\n", - " seed=data_seed,\n", - " shuffle=True,\n", - " random_split=True,\n", - " )\n", - " val_data_provider = data_provider\n", - "\n", - "# Initialize datasets\n", - "train[\"dataset_iter\"] = data_provider.get_dataset(\"train\")\n", - "validation[\"dataset_iter\"] = val_data_provider.get_dataset(\"val\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Prepare training" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-06-14 00:41:40 (INFO): Prepare training\n", - "2024-06-14 00:41:40 (INFO): Freshly initialize model\n" - ] - } - ], - "source": [ - "logging.info(\"Prepare training\")\n", - "# Initialize trainer\n", - "trainer = Trainer(\n", - " model,\n", - " learning_rate=learning_rate,\n", - " decay_steps=decay_steps,\n", - " decay_rate=decay_rate,\n", - " warmup_steps=warmup_steps,\n", - " weight_decay=weight_decay,\n", - " ema_decay=ema_decay,\n", - " decay_patience=decay_patience,\n", - " decay_factor=decay_factor,\n", - " decay_cooldown=decay_cooldown,\n", - " grad_clip_max=grad_clip_max,\n", - " rho_force=rho_force,\n", - " mve=mve,\n", - " loss=loss,\n", - " staircase=staircase,\n", - " agc=agc,\n", - ")\n", - "\n", - "# Initialize metrics\n", - "train[\"metrics\"] = Metrics(\"train\", trainer.tracked_metrics)\n", - "validation[\"metrics\"] = Metrics(\"val\", trainer.tracked_metrics)\n", - "\n", - "# Save/load best recorded loss (only the best model is saved)\n", - "metrics_best = BestMetrics(best_dir, validation[\"metrics\"])\n", - "\n", - "# Set up checkpointing\n", - "# Restore latest checkpoint\n", - "if os.path.exists(log_path_model):\n", - " logging.info(\"Restoring model and trainer\")\n", - " model_checkpoint = torch.load(log_path_model)\n", - " model.load_state_dict(model_checkpoint[\"model\"])\n", - "\n", - " train_checkpoint = torch.load(log_path_training)\n", - " trainer.load_state_dict(train_checkpoint[\"trainer\"])\n", - " # restore the best saved results\n", - " metrics_best.restore()\n", - " logging.info(f\"Restored best metrics: {metrics_best.loss}\")\n", - " step_init = int(train_checkpoint[\"step\"])\n", - "else:\n", - " logging.info(\"Freshly initialize model\")\n", - " metrics_best.inititalize()\n", - " step_init = 0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Training loop" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "module 'numpy' has no attribute 'bool'", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/home/chenxiaoxu02/workspaces/gemnet_pytorch/train.ipynb Cell 15\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 9\u001b[0m summary_writer\u001b[39m.\u001b[39madd_scalar(\u001b[39m\"\u001b[39m\u001b[39mlr\u001b[39m\u001b[39m\"\u001b[39m, lr, global_step\u001b[39m=\u001b[39mstep)\n\u001b[1;32m 11\u001b[0m \u001b[39m# Perform training step\u001b[39;00m\n\u001b[0;32m---> 12\u001b[0m trainer\u001b[39m.\u001b[39;49mtrain_on_batch(train[\u001b[39m\"\u001b[39;49m\u001b[39mdataset_iter\u001b[39;49m\u001b[39m\"\u001b[39;49m], train[\u001b[39m\"\u001b[39;49m\u001b[39mmetrics\u001b[39;49m\u001b[39m\"\u001b[39;49m])\n\u001b[1;32m 14\u001b[0m \u001b[39m# Save progress\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[39mif\u001b[39;00m step \u001b[39m%\u001b[39m save_interval \u001b[39m==\u001b[39m \u001b[39m0\u001b[39m:\n", - "File \u001b[0;32m/home/chenxiaoxu02/workspaces/gemnet_pytorch/gemnet/training/trainer.py:327\u001b[0m, in \u001b[0;36mTrainer.train_on_batch\u001b[0;34m(self, dataset_iter, metrics)\u001b[0m\n\u001b[1;32m 325\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mtrain_on_batch\u001b[39m(\u001b[39mself\u001b[39m, dataset_iter, metrics):\n\u001b[1;32m 326\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel\u001b[39m.\u001b[39mtrain()\n\u001b[0;32m--> 327\u001b[0m inputs, targets \u001b[39m=\u001b[39m \u001b[39mnext\u001b[39;49m(dataset_iter)\n\u001b[1;32m 328\u001b[0m \u001b[39m# push to GPU if available\u001b[39;00m\n\u001b[1;32m 329\u001b[0m inputs, targets \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdict2device(inputs), \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdict2device(targets)\n", - "File \u001b[0;32m/home/chenxiaoxu02/workspaces/gemnet_pytorch/gemnet/training/data_provider.py:171\u001b[0m, in \u001b[0;36mDataProvider.get_dataset..generator\u001b[0;34m()\u001b[0m\n\u001b[1;32m 169\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mgenerator\u001b[39m():\n\u001b[1;32m 170\u001b[0m \u001b[39mwhile\u001b[39;00m \u001b[39mTrue\u001b[39;00m:\n\u001b[0;32m--> 171\u001b[0m \u001b[39mfor\u001b[39;49;00m inputs, targets \u001b[39min\u001b[39;49;00m dataloader:\n\u001b[1;32m 172\u001b[0m \u001b[39myield\u001b[39;49;00m inputs, targets\n", - "File \u001b[0;32m/home/chenxiaoxu02/anaconda3/envs/py311/lib/python3.11/site-packages/torch/utils/data/dataloader.py:630\u001b[0m, in \u001b[0;36m_BaseDataLoaderIter.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 627\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_sampler_iter \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 628\u001b[0m \u001b[39m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[39;00m\n\u001b[1;32m 629\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_reset() \u001b[39m# type: ignore[call-arg]\u001b[39;00m\n\u001b[0;32m--> 630\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_next_data()\n\u001b[1;32m 631\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_num_yielded \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39m1\u001b[39m\n\u001b[1;32m 632\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_dataset_kind \u001b[39m==\u001b[39m _DatasetKind\u001b[39m.\u001b[39mIterable \u001b[39mand\u001b[39;00m \\\n\u001b[1;32m 633\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_IterableDataset_len_called \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mand\u001b[39;00m \\\n\u001b[1;32m 634\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_num_yielded \u001b[39m>\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_IterableDataset_len_called:\n", - "File \u001b[0;32m/home/chenxiaoxu02/anaconda3/envs/py311/lib/python3.11/site-packages/torch/utils/data/dataloader.py:674\u001b[0m, in \u001b[0;36m_SingleProcessDataLoaderIter._next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 672\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_next_data\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m 673\u001b[0m index \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_next_index() \u001b[39m# may raise StopIteration\u001b[39;00m\n\u001b[0;32m--> 674\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_dataset_fetcher\u001b[39m.\u001b[39;49mfetch(index) \u001b[39m# may raise StopIteration\u001b[39;00m\n\u001b[1;32m 675\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_pin_memory:\n\u001b[1;32m 676\u001b[0m data \u001b[39m=\u001b[39m _utils\u001b[39m.\u001b[39mpin_memory\u001b[39m.\u001b[39mpin_memory(data, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_pin_memory_device)\n", - "File \u001b[0;32m/home/chenxiaoxu02/anaconda3/envs/py311/lib/python3.11/site-packages/torch/utils/data/_utils/fetch.py:51\u001b[0m, in \u001b[0;36m_MapDatasetFetcher.fetch\u001b[0;34m(self, possibly_batched_index)\u001b[0m\n\u001b[1;32m 49\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset\u001b[39m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[1;32m 50\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m---> 51\u001b[0m data \u001b[39m=\u001b[39m [\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdataset[idx] \u001b[39mfor\u001b[39;49;00m idx \u001b[39min\u001b[39;49;00m possibly_batched_index]\n\u001b[1;32m 52\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset[possibly_batched_index]\n", - "File \u001b[0;32m/home/chenxiaoxu02/anaconda3/envs/py311/lib/python3.11/site-packages/torch/utils/data/_utils/fetch.py:51\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 49\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset\u001b[39m.\u001b[39m__getitems__(possibly_batched_index)\n\u001b[1;32m 50\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m---> 51\u001b[0m data \u001b[39m=\u001b[39m [\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdataset[idx] \u001b[39mfor\u001b[39;00m idx \u001b[39min\u001b[39;00m possibly_batched_index]\n\u001b[1;32m 52\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 53\u001b[0m data \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataset[possibly_batched_index]\n", - "File \u001b[0;32m/home/chenxiaoxu02/workspaces/gemnet_pytorch/gemnet/training/data_container.py:261\u001b[0m, in \u001b[0;36mDataContainer.__getitem__\u001b[0;34m(self, idx)\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[39m# get adjacency matrix for embeddings\u001b[39;00m\n\u001b[1;32m 260\u001b[0m adj_mat \u001b[39m=\u001b[39m sp\u001b[39m.\u001b[39mcsr_matrix(D_ij \u001b[39m<\u001b[39m\u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcutoff)\n\u001b[0;32m--> 261\u001b[0m adj_mat \u001b[39m-\u001b[39m\u001b[39m=\u001b[39m sp\u001b[39m.\u001b[39meye(n, dtype\u001b[39m=\u001b[39mnp\u001b[39m.\u001b[39;49mbool)\n\u001b[1;32m 262\u001b[0m adj_matrices\u001b[39m.\u001b[39mappend(adj_mat)\n\u001b[1;32m 264\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtriplets_only:\n\u001b[1;32m 265\u001b[0m \u001b[39m# get adjacency matrix for interaction\u001b[39;00m\n", - "File \u001b[0;32m/home/chenxiaoxu02/anaconda3/envs/py311/lib/python3.11/site-packages/numpy/__init__.py:284\u001b[0m, in \u001b[0;36m__getattr__\u001b[0;34m(attr)\u001b[0m\n\u001b[1;32m 281\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39m.\u001b[39;00m\u001b[39mtesting\u001b[39;00m \u001b[39mimport\u001b[39;00m Tester\n\u001b[1;32m 282\u001b[0m \u001b[39mreturn\u001b[39;00m Tester\n\u001b[0;32m--> 284\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mAttributeError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mmodule \u001b[39m\u001b[39m{!r}\u001b[39;00m\u001b[39m has no attribute \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 285\u001b[0m \u001b[39m\"\u001b[39m\u001b[39m{!r}\u001b[39;00m\u001b[39m\"\u001b[39m\u001b[39m.\u001b[39mformat(\u001b[39m__name__\u001b[39m, attr))\n", - "\u001b[0;31mAttributeError\u001b[0m: module 'numpy' has no attribute 'bool'" - ] - } - ], - "source": [ - "summary_writer = SummaryWriter(log_dir)\n", - "steps_per_epoch = int(np.ceil(num_train / batch_size))\n", - "\n", - "for step in range(step_init + 1, num_steps + 1):\n", - "\n", - " # keep track of the learning rate\n", - " if step % 10 == 0:\n", - " lr = trainer.schedulers[0].get_last_lr()[0]\n", - " summary_writer.add_scalar(\"lr\", lr, global_step=step)\n", - "\n", - " # Perform training step\n", - " trainer.train_on_batch(train[\"dataset_iter\"], train[\"metrics\"])\n", - "\n", - " # Save progress\n", - " if step % save_interval == 0:\n", - " torch.save({\"model\": model.state_dict()}, log_path_model)\n", - " torch.save(\n", - " {\"trainer\": trainer.state_dict(), \"step\": step}, log_path_training\n", - " )\n", - "\n", - " # Check performance on the validation set\n", - " if step % evaluation_interval == 0:\n", - "\n", - " # Save backup variables and load averaged variables\n", - " trainer.save_variable_backups()\n", - " trainer.load_averaged_variables()\n", - "\n", - " # Compute averages\n", - " for i in range(int(np.ceil(num_val / batch_size))):\n", - " trainer.test_on_batch(validation[\"dataset_iter\"], validation[\"metrics\"])\n", - "\n", - " # Update and save best result\n", - " if validation[\"metrics\"].loss < metrics_best.loss:\n", - " metrics_best.update(step, validation[\"metrics\"])\n", - " torch.save(model.state_dict(), best_path_model)\n", - "\n", - " # write to summary writer\n", - " metrics_best.write(summary_writer, step)\n", - "\n", - " epoch = step // steps_per_epoch\n", - " train_metrics_res = train[\"metrics\"].result(append_tag=False)\n", - " val_metrics_res = validation[\"metrics\"].result(append_tag=False)\n", - " metrics_strings = [\n", - " f\"{key}: train={train_metrics_res[key]:.6f}, val={val_metrics_res[key]:.6f}\"\n", - " for key in validation[\"metrics\"].keys\n", - " ]\n", - " logging.info(\n", - " f\"{step}/{num_steps} (epoch {epoch}): \" + \"; \".join(metrics_strings)\n", - " )\n", - "\n", - " # decay learning rate on plateau\n", - " trainer.decay_maybe(validation[\"metrics\"].loss)\n", - "\n", - " train[\"metrics\"].write(summary_writer, step)\n", - " validation[\"metrics\"].write(summary_writer, step)\n", - " train[\"metrics\"].reset_states()\n", - " validation[\"metrics\"].reset_states()\n", - "\n", - " # Restore backup variables\n", - " trainer.restore_variable_backups()\n", - "\n", - " # early stopping\n", - " if step - metrics_best.step > patience * evaluation_interval:\n", - " break\n", - "\n", - "result = {key + \"_best\": val for key, val in metrics_best.items()}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Print results" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for key, val in metrics_best.items():\n", - " print(f\"{key}: {val}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "interpreter": { - "hash": "6d9d58ddb04bb635eba824a3c64b6d0110bcc4c6cff8b192a6f7cbbb2bf10de4" - }, - "kernelspec": { - "display_name": "Python 3.5.4 64-bit", - "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.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/materials_discovery/train.py b/materials_discovery/train.py deleted file mode 100644 index 2dd095c4..00000000 --- a/materials_discovery/train.py +++ /dev/null @@ -1,298 +0,0 @@ -import ast -import logging -import os -import random -import string -from datetime import datetime - -import numpy as np -import paddle -import yaml - -from gemnet.model.gemnet import GemNet -from gemnet.training.data_container import DataContainer -from gemnet.training.data_provider import DataProvider -from gemnet.training.metrics import BestMetrics -from gemnet.training.metrics import Metrics -from gemnet.training.trainer import Trainer - -os.environ["TF_CPP_MIN_LOG_LEVEL"] = "1" -os.environ["AUTOGRAPH_VERBOSITY"] = "1" -logger = logging.getLogger() -logger.handlers = [] -ch = logging.StreamHandler() -formatter = logging.Formatter( - fmt="%(asctime)s (%(levelname)s): %(message)s", datefmt="%Y-%m-%d %H:%M:%S" -) -ch.setFormatter(formatter) -logger.addHandler(ch) -logger.setLevel("INFO") - - -os.chdir(os.getcwd() + '/materials_discovery') -with open('config.yaml', "r") as c: - config = yaml.safe_load(c) -for key, val in config.items(): - if type(val) is str: - try: - config[key] = ast.literal_eval(val) - except (ValueError, SyntaxError): - pass -num_spherical = config["num_spherical"] -num_radial = config["num_radial"] -num_blocks = config["num_blocks"] -emb_size_atom = config["emb_size_atom"] -emb_size_edge = config["emb_size_edge"] -emb_size_trip = config["emb_size_trip"] -emb_size_quad = config["emb_size_quad"] -emb_size_rbf = config["emb_size_rbf"] -emb_size_cbf = config["emb_size_cbf"] -emb_size_sbf = config["emb_size_sbf"] -num_before_skip = config["num_before_skip"] -num_after_skip = config["num_after_skip"] -num_concat = config["num_concat"] -num_atom = config["num_atom"] -emb_size_bil_quad = config["emb_size_bil_quad"] -emb_size_bil_trip = config["emb_size_bil_trip"] -triplets_only = config["triplets_only"] -forces_coupled = config["forces_coupled"] -direct_forces = config["direct_forces"] -mve = config["mve"] -cutoff = config["cutoff"] -int_cutoff = config["int_cutoff"] -envelope_exponent = config["envelope_exponent"] -extensive = config["extensive"] -output_init = config["output_init"] -scale_file = config["scale_file"] -data_seed = config["data_seed"] -dataset = config["dataset"] -val_dataset = config["val_dataset"] -num_train = config["num_train"] -num_val = config["num_val"] -logdir = config["logdir"] -loss = config["loss"] -tfseed = config["tfseed"] -num_steps = config["num_steps"] -rho_force = config["rho_force"] -ema_decay = config["ema_decay"] -weight_decay = config["weight_decay"] -grad_clip_max = config["grad_clip_max"] -agc = config["agc"] -decay_patience = config["decay_patience"] -decay_factor = config["decay_factor"] -decay_cooldown = config["decay_cooldown"] -batch_size = config["batch_size"] -evaluation_interval = config["evaluation_interval"] -patience = config["patience"] -save_interval = config["save_interval"] -learning_rate = config["learning_rate"] -warmup_steps = config["warmup_steps"] -decay_steps = config["decay_steps"] -decay_rate = config["decay_rate"] -staircase = config["staircase"] -restart = config["restart"] -comment = config["comment"] -paddle.seed(seed=tfseed) -logging.info("Start training") -num_gpus = paddle.device.cuda.device_count() -cuda_available = paddle.device.cuda.device_count() >= 1 -logging.info(f"Available GPUs: {num_gpus}") -logging.info(f"CUDA Available: {cuda_available}") -if num_gpus == 0: - logging.warning("No GPUs were found. Training is run on CPU!") -if not cuda_available: - logging.warning("CUDA unavailable. Training is run on CPU!") - - -def id_generator( - size=6, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits -): - return "".join(random.SystemRandom().choice(chars) for _ in range(size)) - - -if restart is None or restart == "None": - directory = ( - logdir - + "/" - + datetime.now().strftime("%Y%m%d_%H%M%S") - + "_" - + id_generator() - + "_" - + os.path.basename(dataset) - + "_" - + str(comment) - ) -else: - directory = restart -logging.info(f"Directory: {directory}") -logging.info("Create directories") -if not os.path.exists(directory): - os.makedirs(directory, exist_ok=True) -best_dir = os.path.join(directory, "best") -if not os.path.exists(best_dir): - os.makedirs(best_dir) -log_dir = os.path.join(directory, "logs") -if not os.path.exists(log_dir): - os.makedirs(log_dir) -extension = ".pth" -log_path_model = f"{log_dir}/model{extension}" -log_path_training = f"{log_dir}/training{extension}" -best_path_model = f"{best_dir}/model{extension}" -logging.info("Initialize model") -model = GemNet( - num_spherical=num_spherical, - num_radial=num_radial, - num_blocks=num_blocks, - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_trip=emb_size_trip, - emb_size_quad=emb_size_quad, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - emb_size_sbf=emb_size_sbf, - num_before_skip=num_before_skip, - num_after_skip=num_after_skip, - num_concat=num_concat, - num_atom=num_atom, - emb_size_bil_quad=emb_size_bil_quad, - emb_size_bil_trip=emb_size_bil_trip, - num_targets=2 if mve else 1, - triplets_only=triplets_only, - direct_forces=direct_forces, - forces_coupled=forces_coupled, - cutoff=cutoff, - int_cutoff=int_cutoff, - envelope_exponent=envelope_exponent, - activation="swish", - extensive=extensive, - output_init=output_init, - scale_file=scale_file, -) -device = str("cuda" if paddle.device.cuda.device_count() >= 1 else "cpu").replace( - "cuda", "gpu" -) -model.to(device) -train = {} -validation = {} -logging.info("Load dataset") -data_container = DataContainer( - dataset, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only -) -if val_dataset is not None: - if num_train == 0: - num_train = len(data_container) - logging.info(f"Training data size: {num_train}") - data_provider = DataProvider( - data_container, - num_train, - 0, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) - val_data_container = DataContainer( - val_dataset, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only - ) - if num_val == 0: - num_val = len(val_data_container) - logging.info(f"Validation data size: {num_val}") - val_data_provider = DataProvider( - val_data_container, - 0, - num_val, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) -else: - logging.info(f"Training data size: {num_train}") - logging.info(f"Validation data size: {num_val}") - assert num_train > 0 - assert num_val > 0 - data_provider = DataProvider( - data_container, - num_train, - num_val, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) - val_data_provider = data_provider -train["dataset_iter"] = data_provider.get_dataset("train") -validation["dataset_iter"] = val_data_provider.get_dataset("val") -logging.info("Prepare training") -trainer = Trainer( - model, - learning_rate=learning_rate, - decay_steps=decay_steps, - decay_rate=decay_rate, - warmup_steps=warmup_steps, - weight_decay=weight_decay, - ema_decay=ema_decay, - decay_patience=decay_patience, - decay_factor=decay_factor, - decay_cooldown=decay_cooldown, - grad_clip_max=grad_clip_max, - rho_force=rho_force, - mve=mve, - loss=loss, - staircase=staircase, - agc=agc, -) -train["metrics"] = Metrics("train", trainer.tracked_metrics) -validation["metrics"] = Metrics("val", trainer.tracked_metrics) -metrics_best = BestMetrics(best_dir, validation["metrics"]) -if os.path.exists(log_path_model): - logging.info("Restoring model and trainer") - model_checkpoint = paddle.load(path=log_path_model) - model.set_state_dict(state_dict=model_checkpoint["model"]) - train_checkpoint = paddle.load(path=log_path_training) - trainer.set_state_dict(state_dict=train_checkpoint["trainer"]) - metrics_best.restore() - logging.info(f"Restored best metrics: {metrics_best.loss}") - step_init = int(train_checkpoint["step"]) -else: - metrics_best.inititalize() - step_init = 0 -steps_per_epoch = int(np.ceil(num_train / batch_size)) -for step in range(step_init + 1, num_steps + 1): - # if step % 10 == 0: - # lr = trainer.schedulers[0].get_last_lr()[0] - loss = trainer.train_on_batch(train["dataset_iter"], train["metrics"]) - if step % evaluation_interval == 0: - print('The step {} loss {}'.format(step, loss)) - # if step % save_interval == 0: - # paddle.save(obj={"model": model.state_dict()}, path=log_path_model) - # paddle.save( - # obj={"trainer": trainer.state_dict(), "step": step}, path=log_path_training - # ) -# if step % evaluation_interval == 0: -# # trainer.save_variable_backups() -# # trainer.load_averaged_variables() -# for i in range(int(np.ceil(num_val / batch_size))): -# trainer.test_on_batch(validation["dataset_iter"], validation["metrics"]) -# if validation["metrics"].loss < metrics_best.loss: -# metrics_best.update(step, validation["metrics"]) -# # paddle.save(obj=model.state_dict(), path=best_path_model) -# epoch = step // steps_per_epoch -# train_metrics_res = train["metrics"].result(append_tag=False) -# val_metrics_res = validation["metrics"].result(append_tag=False) -# metrics_strings = [ -# f"{key}: train={train_metrics_res[key]:.6f}, val={val_metrics_res[key]:.6f}" -# for key in validation["metrics"].keys -# ] -# logging.info( -# f"{step}/{num_steps} (epoch {epoch}): " + "; ".join(metrics_strings) -# ) -# # trainer.decay_maybe(validation["metrics"].loss) -# # train["metrics"].reset_states() -# # validation["metrics"].reset_states() -# # trainer.restore_variable_backups() -# # if step - metrics_best.step > patience * evaluation_interval: -# # break -# # result = {(key + "_best"): val for key, val in metrics_best.items()} -# # for key, val in metrics_best.items(): -# # print(f"{key}: {val}") diff --git a/materials_discovery/train_seml.py b/materials_discovery/train_seml.py deleted file mode 100644 index b483d95b..00000000 --- a/materials_discovery/train_seml.py +++ /dev/null @@ -1,332 +0,0 @@ -import logging -import os -import random -import string -import time -from datetime import datetime - -import numpy as np -import paddle -import seml -import torch -from sacred import Experiment - -from gemnet.model.gemnet import GemNet -from gemnet.training.data_container import DataContainer -from gemnet.training.data_provider import DataProvider -from gemnet.training.metrics import BestMetrics -from gemnet.training.metrics import Metrics -from gemnet.training.trainer import Trainer - -os.environ["TF_CPP_MIN_LOG_LEVEL"] = "1" -os.environ["AUTOGRAPH_VERBOSITY"] = "1" - - -ex = Experiment() -seml.setup_logger(ex) - - -@ex.post_run_hook -def collect_stats(_run): - seml.collect_exp_stats(_run) - - -@ex.config -def config(): - overwrite = None - db_collection = None - if db_collection is not None: - ex.observers.append( - seml.create_mongodb_observer(db_collection, overwrite=overwrite) - ) - - -@ex.automain -def run( - num_spherical, - num_radial, - num_blocks, - emb_size_atom, - emb_size_edge, - emb_size_trip, - emb_size_quad, - emb_size_rbf, - emb_size_cbf, - emb_size_sbf, - num_before_skip, - num_after_skip, - num_concat, - num_atom, - emb_size_bil_quad, - emb_size_bil_trip, - triplets_only, - forces_coupled, - direct_forces, - mve, - cutoff, - int_cutoff, - envelope_exponent, - extensive, - output_init, - scale_file, - data_seed, - dataset, - val_dataset, - num_train, - num_val, - logdir, - loss, - tfseed, - num_steps, - rho_force, - ema_decay, - weight_decay, - grad_clip_max, - agc, - decay_patience, - decay_factor, - decay_cooldown, - batch_size, - evaluation_interval, - patience, - save_interval, - learning_rate, - warmup_steps, - decay_steps, - decay_rate, - staircase, - restart, - comment, -): - paddle.seed(seed=tfseed) - logging.info("Start training") - logging.info( - "Hyperparams: \n" + "\n".join(f"{key}: {val}" for key, val in locals().items()) - ) - num_gpus = paddle.device.cuda.device_count() - cuda_available = paddle.device.cuda.device_count() >= 1 - logging.info(f"Available GPUs: {num_gpus}") - logging.info(f"CUDA Available: {cuda_available}") - if num_gpus == 0: - logging.warning("No GPUs were found. Training is run on CPU!") - if not cuda_available: - logging.warning("CUDA unavailable. Training is run on CPU!") - - def id_generator( - size=6, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits - ): - return "".join(random.SystemRandom().choice(chars) for _ in range(size)) - - if restart is None or restart == "None": - directory = ( - logdir - + "/" - + datetime.now().strftime("%Y%m%d_%H%M%S") - + "_" - + id_generator() - + "_" - + os.path.basename(dataset) - + "_" - + str(comment) - ) - else: - directory = restart - logging.info(f"Directory: {directory}") - logging.info("Create directories") - if not os.path.exists(directory): - os.makedirs(directory, exist_ok=True) - best_dir = os.path.join(directory, "best") - if not os.path.exists(best_dir): - os.makedirs(best_dir) - log_dir = os.path.join(directory, "logs") - if not os.path.exists(log_dir): - os.makedirs(log_dir) - extension = ".pth" - log_path_model = f"{log_dir}/model{extension}" - log_path_training = f"{log_dir}/training{extension}" - best_path_model = f"{best_dir}/model{extension}" - logging.info("Initialize model") - model = GemNet( - num_spherical=num_spherical, - num_radial=num_radial, - num_blocks=num_blocks, - emb_size_atom=emb_size_atom, - emb_size_edge=emb_size_edge, - emb_size_trip=emb_size_trip, - emb_size_quad=emb_size_quad, - emb_size_rbf=emb_size_rbf, - emb_size_cbf=emb_size_cbf, - emb_size_sbf=emb_size_sbf, - num_before_skip=num_before_skip, - num_after_skip=num_after_skip, - num_concat=num_concat, - num_atom=num_atom, - emb_size_bil_quad=emb_size_bil_quad, - emb_size_bil_trip=emb_size_bil_trip, - num_targets=2 if mve else 1, - triplets_only=triplets_only, - direct_forces=direct_forces, - forces_coupled=forces_coupled, - cutoff=cutoff, - int_cutoff=int_cutoff, - envelope_exponent=envelope_exponent, - activation="swish", - extensive=extensive, - output_init=output_init, - scale_file=scale_file, - ) - device = str("cuda" if paddle.device.cuda.device_count() >= 1 else "cpu").replace( - "cuda", "gpu" - ) - model.to(device) - summary_writer = torch.utils.tensorboard.SummaryWriter(log_dir) - train = {} - validation = {} - logging.info("Load dataset") - data_container = DataContainer( - dataset, cutoff=cutoff, int_cutoff=int_cutoff, triplets_only=triplets_only - ) - if val_dataset is not None: - if num_train == 0: - num_train = len(data_container) - logging.info(f"Training data size: {num_train}") - data_provider = DataProvider( - data_container, - num_train, - 0, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) - val_data_container = DataContainer( - val_dataset, - cutoff=cutoff, - int_cutoff=int_cutoff, - triplets_only=triplets_only, - ) - if num_val == 0: - num_val = len(val_data_container) - logging.info(f"Validation data size: {num_val}") - val_data_provider = DataProvider( - val_data_container, - 0, - num_val, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) - else: - logging.info(f"Training data size: {num_train}") - logging.info(f"Validation data size: {num_val}") - assert num_train > 0 - assert num_val > 0 - data_provider = DataProvider( - data_container, - num_train, - num_val, - batch_size, - seed=data_seed, - shuffle=True, - random_split=True, - ) - val_data_provider = data_provider - train["dataset_iter"] = data_provider.get_dataset("train") - validation["dataset_iter"] = val_data_provider.get_dataset("val") - logging.info("Prepare training") - trainer = Trainer( - model, - learning_rate=learning_rate, - decay_steps=decay_steps, - decay_rate=decay_rate, - warmup_steps=warmup_steps, - weight_decay=weight_decay, - ema_decay=ema_decay, - decay_patience=decay_patience, - decay_factor=decay_factor, - decay_cooldown=decay_cooldown, - grad_clip_max=grad_clip_max, - rho_force=rho_force, - mve=mve, - loss=loss, - staircase=staircase, - agc=agc, - ) - train["metrics"] = Metrics("train", trainer.tracked_metrics, ex) - validation["metrics"] = Metrics("val", trainer.tracked_metrics, ex) - metrics_best = BestMetrics(best_dir, validation["metrics"]) - if os.path.exists(log_path_model): - logging.info("Restoring model and trainer") - model_checkpoint = paddle.load(path=log_path_model) - model.set_state_dict(state_dict=model_checkpoint["model"]) - train_checkpoint = paddle.load(path=log_path_training) - trainer.set_state_dict(state_dict=train_checkpoint["trainer"]) - metrics_best.restore() - logging.info(f"Restored best metrics: {metrics_best.loss}") - step_init = int(train_checkpoint["step"]) - else: - logging.info("Freshly initialize model") - metrics_best.inititalize() - step_init = 0 - if ex is not None: - ex.current_run.info = {"directory": directory} - nparams = sum(p.size for p in model.parameters() if not p.stop_gradient) - ex.current_run.info.update({"nParams": nparams}) - logging.info("Start training") - steps_per_epoch = int(np.ceil(num_train / batch_size)) - for step in range(step_init + 1, num_steps + 1): - if ex is not None: - if step == evaluation_interval + 1: - start = time.perf_counter() - if step == 2 * evaluation_interval - 1: - end = time.perf_counter() - time_delta = end - start - nsteps = evaluation_interval - 2 - ex.current_run.info.update( - { - "seconds_per_step": time_delta / nsteps, - "min_per_epoch": int( - time_delta / nsteps * steps_per_epoch * 100 / 60 - ) - / 100, - } - ) - if step % 10 == 0: - lr = trainer.schedulers[0].get_last_lr()[0] - summary_writer.add_scalar("lr", lr, global_step=step) - trainer.train_on_batch(train["dataset_iter"], train["metrics"]) - if step % save_interval == 0: - paddle.save(obj={"model": model.state_dict()}, path=log_path_model) - paddle.save( - obj={"trainer": trainer.state_dict(), "step": step}, - path=log_path_training, - ) - if step % evaluation_interval == 0: - trainer.save_variable_backups() - trainer.load_averaged_variables() - for i in range(int(np.ceil(num_val / batch_size))): - trainer.test_on_batch(validation["dataset_iter"], validation["metrics"]) - if validation["metrics"].loss < metrics_best.loss: - metrics_best.update(step, validation["metrics"]) - paddle.save(obj=model.state_dict(), path=best_path_model) - metrics_best.write(summary_writer, step) - epoch = step // steps_per_epoch - train_metrics_res = train["metrics"].result(append_tag=False) - val_metrics_res = validation["metrics"].result(append_tag=False) - metrics_strings = [ - f"{key}: train={train_metrics_res[key]:.6f}, val={val_metrics_res[key]:.6f}" - for key in validation["metrics"].keys - ] - logging.info( - f"{step}/{num_steps} (epoch {epoch}): " + "; ".join(metrics_strings) - ) - trainer.decay_maybe(validation["metrics"].loss) - train["metrics"].write(summary_writer, step) - validation["metrics"].write(summary_writer, step) - train["metrics"].reset_states() - validation["metrics"].reset_states() - trainer.restore_variable_backups() - if step - metrics_best.step > patience * evaluation_interval: - break - return {(key + "_best"): val for key, val in metrics_best.items()} diff --git a/materials_discovery/utils/paddle_aux.py b/materials_discovery/utils/paddle_aux.py deleted file mode 100644 index 1e0e0fe1..00000000 --- a/materials_discovery/utils/paddle_aux.py +++ /dev/null @@ -1,147 +0,0 @@ -# This file is generated by PaConvert ToolKit, please Don't edit it! -import paddle - - -def min_class_func(self, *args, **kwargs): - if "other" in kwargs: - kwargs["y"] = kwargs.pop("other") - ret = paddle.minimum(self, *args, **kwargs) - elif len(args) == 1 and isinstance(args[0], paddle.Tensor): - ret = paddle.minimum(self, *args, **kwargs) - else: - if "dim" in kwargs: - kwargs["axis"] = kwargs.pop("dim") - - if "axis" in kwargs or len(args) >= 1: - ret = ( - paddle.min(self, *args, **kwargs), - paddle.argmin(self, *args, **kwargs), - ) - else: - ret = paddle.min(self, *args, **kwargs) - - return ret - - -def max_class_func(self, *args, **kwargs): - if "other" in kwargs: - kwargs["y"] = kwargs.pop("other") - ret = paddle.maximum(self, *args, **kwargs) - elif len(args) == 1 and isinstance(args[0], paddle.Tensor): - ret = paddle.maximum(self, *args, **kwargs) - else: - if "dim" in kwargs: - kwargs["axis"] = kwargs.pop("dim") - - if "axis" in kwargs or len(args) >= 1: - ret = ( - paddle.max(self, *args, **kwargs), - paddle.argmax(self, *args, **kwargs), - ) - else: - ret = paddle.max(self, *args, **kwargs) - - return ret - - -setattr(paddle.Tensor, "min", min_class_func) -setattr(paddle.Tensor, "max", max_class_func) - - -def view(self, *args, **kwargs): - if args: - if len(args) == 1: - if isinstance(args[0], (tuple, list)): - return paddle.reshape(self, args[0]) # To change reshape => view - elif isinstance(args[0], str): - return paddle.view(self, args[0]) - else: - return paddle.reshape(self, list(args)) # To change reshape => view - else: - return paddle.reshape(self, list(args)) # To change reshape => view - elif kwargs: - key = [k for k in kwargs.keys()] - if "dtype" in kwargs: - return paddle.view(self, shape_or_dtype=kwargs[key[0]]) - else: - return paddle.reshape( - self, shape=kwargs[key[0]] - ) # To change reshape => view - - -setattr(paddle.Tensor, "view", view) - - -def min(*args, **kwargs): - if "input" in kwargs: - kwargs["x"] = kwargs.pop("input") - - out_v = None - if "out" in kwargs: - out_v = kwargs.pop("out") - - if "other" in kwargs: - kwargs["y"] = kwargs.pop("other") - ret = paddle.minimum(*args, **kwargs) - elif len(args) == 2 and isinstance(args[1], paddle.Tensor): - ret = paddle.minimum(*args, **kwargs) - else: - if "dim" in kwargs: - kwargs["axis"] = kwargs.pop("dim") - - if "axis" in kwargs or len(args) >= 2: - if out_v: - ret = paddle.min(*args, **kwargs), paddle.argmin(*args, **kwargs) - paddle.assign(ret[0], out_v[0]) - paddle.assign(ret[1], out_v[1]) - return out_v - else: - ret = paddle.min(*args, **kwargs), paddle.argmin(*args, **kwargs) - return ret - else: - ret = paddle.min(*args, **kwargs) - return ret - - if out_v: - paddle.assign(ret, out_v) - return out_v - else: - return ret - - -def max(*args, **kwargs): - if "input" in kwargs: - kwargs["x"] = kwargs.pop("input") - - out_v = None - if "out" in kwargs: - out_v = kwargs.pop("out") - - if "other" in kwargs: - kwargs["y"] = kwargs.pop("other") - ret = paddle.maximum(*args, **kwargs) - elif len(args) == 2 and isinstance(args[1], paddle.Tensor): - ret = paddle.maximum(*args, **kwargs) - else: - if "dim" in kwargs: - kwargs["axis"] = kwargs.pop("dim") - - if "axis" in kwargs or len(args) >= 2: - if out_v: - ret = paddle.max(*args, **kwargs), paddle.argmax(*args, **kwargs) - paddle.assign(ret[0], out_v[0]) - paddle.assign(ret[1], out_v[1]) - return out_v - else: - ret = paddle.max(*args, **kwargs), paddle.argmax(*args, **kwargs) - return ret - return out_v - else: - ret = paddle.max(*args, **kwargs) - return ret - - if out_v: - paddle.assign(ret, out_v) - return out_v - else: - return ret diff --git a/paddle_scatter b/paddle_scatter new file mode 160000 index 00000000..8efe9af9 --- /dev/null +++ b/paddle_scatter @@ -0,0 +1 @@ +Subproject commit 8efe9af96bf2f98be9c4bc7ecf5dff471875149a diff --git a/ppmat/__init__.py b/ppmat/__init__.py new file mode 100644 index 00000000..e8992b82 --- /dev/null +++ b/ppmat/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from ppmat import datasets # noqa +from ppmat import losses # noqa +from ppmat import metrics # noqa +from ppmat import models # noqa +from ppmat import optimizer # noqa +from ppmat import schedulers # noqa +from ppmat import trainer # noqa +from ppmat import utils # noqa +from ppmat import sampler # noqa + +__all__ = [ + "models", + "trainer", + "sampler", +] + +try: + # import auto-generated version information from '._version' file, using + # setuptools_scm via 'pip install'. Details of versioning rule can be referd to: + # https://peps.python.org/pep-0440/#public-version-identifiers + from ._version import version as __version__ +except ImportError: + __version__ = "unknown version" diff --git a/ppmat/calculator/ase.py b/ppmat/calculator/ase.py new file mode 100644 index 00000000..3e414050 --- /dev/null +++ b/ppmat/calculator/ase.py @@ -0,0 +1,453 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any +from typing import List +import warnings +import numpy as np +from ase import Atoms +from ase import filters +from ase import units +from ase.calculators.calculator import Calculator +from ase.io import Trajectory +from ase.io import write +from ase.md import MDLogger +from ase.md.langevin import Langevin +from ase.optimize import BFGS +from ase.optimize import FIRE +from ase.optimize import LBFGS +from ase.optimize import BFGSLineSearch +from ase.optimize import GPMin +from ase.optimize import LBFGSLineSearch +from ase.optimize import MDMin +from ase.stress import full_3x3_to_voigt_6_stress +from pymatgen.io.ase import AseAtomsAdaptor +from tqdm import tqdm + +from ppmat.utils import logger + +CHARGE_RANGE = [-100, 100] +SPIN_RANGE = [0, 100] +DEFAULT_CHARGE = 0 +DEFAULT_SPIN_OMOL = 1 +DEFAULT_SPIN = 0 + + +OPTIMIZERS = { + "FIRE": FIRE, + "BFGS": BFGS, + "LBFGS": LBFGS, + "MDMin": MDMin, + "GPMin": GPMin, + "LBFGSLineSearch": LBFGSLineSearch, + "BFGSLineSearch": BFGSLineSearch, +} + +warnings.filterwarnings('ignore', message='Skipping "graph" info', category=UserWarning) + +class OptimizationTask: + def __init__( + self, + optimizer="BFGS", + filter="none", + fmax=0.05, + steps=100, + ): + self.optimizer = optimizer + self.filter = filter + self.fmax = fmax + self.steps = steps + + def __call__( + self, + interface_obj, + structures, + ): + logger.info("Relax structure.") + interface_obj.run_opt( + structures=structures, + optimizer=self.optimizer, + filter=self.filter, + fmax=self.fmax, + steps=self.steps, + ) + logger.info("All relaxations finished successfully.") + + +class MDSimulationTask: + def __init__(self, temperature=300, timestep=0.1, steps=100, interval=1, **kwargs): + self.temperature = temperature + self.timestep = timestep + self.steps = steps + self.interval = interval + + def __call__( + self, + interface_obj, + structures, + ): + logger.info("Run MD simulation.") + interface_obj.run_md( + structures=structures, + temperature=self.temperature, + timestep=self.timestep, + steps=self.steps, + interval=self.interval, + ) + logger.info("All MD simulations finished successfully.") + + +class ASECalculator(Calculator): + def __init__( + self, + predictor, + **kwargs: Any, + ): + """ + Initialize the ASECalculator from a model PPMatPredictor + + Args: + predictor (PPMatPredictor): A pretrained PPMatPredictor. + Notes: + - For models that require total charge and spin multiplicity + `charge` and `spin` (corresponding to `spin_multiplicity`) are + pulled from `atoms.info` during calculations. + - `charge` must be an integer representing the total charge + on the system and can range from -100 to 100. + - `spin` must be an integer representing the spin multiplicity + and can range from 0 to 100. + - If `charge` or `spin` are not set in `atoms.info`, + they will default to charge=`0` and spin=`1`. + """ + + super().__init__(**kwargs) + + label_names = predictor.config["Global"]["label_names"] + model_cls = predictor.config["Model"].get("__class_name__") + if model_cls == "CHGNet": + if "energy_per_atom" in label_names: + logger.warning( + "'energy_per_atom' found in prediction. " + "Please ensure this corresponds to total energy as expected." + ) + label_names = ["forces" if x == "force" else x for x in label_names] + if "energy_per_atom" in label_names and "energy" not in label_names: + label_names.append("energy") + elif model_cls == "M3GNet": + label_names = ["forces" if x == "force" else x for x in label_names] + else: + raise NotImplementedError( + f"Model {model_cls} not supported. " + f"Check that predicted properties (forces, energy, stress) " + f"match ASE requirements. Add handling if needed." + ) + + self.implemented_properties = label_names + + self.predictor = predictor + + def structure_to_ase(self, structures): + # Read raw file and convert to ASE Atom + ase_structures = [] + + for structure in tqdm(structures): + graph = self.predictor.graph_converter(structure) + # covert pymatgen Structure to ASE Atom + atom = AseAtomsAdaptor().get_atoms(structure) + # attach graph information to ASE Atom + atom.info["graph"] = graph + ase_structures.append(atom) + + logger.info("Successfully covert all structures to ASE Atoms.") + return ase_structures + + def check_state(self, atoms: Atoms, tol: float = 1e-15) -> list: + """ + Check for any system changes since the last calculation. + + Args: + atoms (ase.Atoms): The atomic structure to check. + tol (float): Tolerance for detecting changes. + + Returns: + list: A list of changes detected in the system. + """ + state = super().check_state(atoms, tol=tol) + if (not state) and (self.atoms.info != atoms.info): + state.append("info") + return state + + def calculate( + self, + atoms: Atoms, + properties: List[str], + system_changes: List[str], + ) -> None: + """ + Perform the calculation for the given atomic structure. + + Args: + atoms (Atoms): The atomic structure to calculate properties for. + properties (list[str]): The list of properties to calculate. + system_changes (list[str]): The list of changes in the system. + + Notes: + - `charge` must be an integer representing the total charge + on the system and can range from -100 to 100. + - `spin` must be an integer representing the spin multiplicity + and can range from 0 to 100. + - If `charge` or `spin` are not set in `atoms.info`, + they will default to `0`. + - The `free_energy` is simply a copy of the `energy` + and is not the actual electronic free energy. + It is only set for ASE routines/optimizers that are hard-coded to use + this rather than the `energy` key. + """ + + # Our calculators won't work if natoms=0 + if len(atoms) == 0: + raise ValueError("Atoms object has no atoms inside.") + + # Check if the atoms object has periodic boundary conditions (PBC) set correctly + self._check_atoms_pbc(atoms) + + # Validate that charge/spin are set correctly, or default to 0 otherwise + self._validate_charge_and_spin(atoms) + + # Standard call to check system_changes etc + Calculator.calculate(self, atoms, properties, system_changes) + + if len(atoms) == 1 and sum(atoms.pbc) == 0: + self._get_single_atom_energies(atoms) + else: + # Predict + graph = atoms.info["graph"] + graph = graph.tensor() + pred = self.predictor.model.predict(graph) + pred = self.predictor.post_process(pred) + + # Collect the results into self.results + self.results = {} + + # energy + if "energy" in self.implemented_properties and "energy" in pred: + energy = float(pred["energy"].squeeze()) + elif ( + "energy_per_atom" in self.implemented_properties + and "energy_per_atom" in pred + ): + energy = float(pred["energy_per_atom"].squeeze()) + else: + raise KeyError( + "Neither 'energy' nor 'energy_per_atom' found in prediction." + ) + self.results["energy"] = self.results[ + "free_energy" + ] = energy # Free energy is a copy of energy + + # forces, stress + name_map = { + "forces": "force", + } + for calc_key in self.implemented_properties: + pred_key = name_map.get(calc_key, calc_key) + if calc_key in ("force", "forces"): + self.results["forces"] = pred[pred_key] + elif calc_key == "stress": + stress = pred[pred_key] + stress_voigt = full_3x3_to_voigt_6_stress(stress) + self.results["stress"] = stress_voigt + + def _check_atoms_pbc(self, atoms) -> None: + """ + Check for invalid PBC conditions + + Args: + atoms (ase.Atoms): The atomic structure to check. + """ + if np.all(atoms.pbc) and np.allclose(atoms.cell, 0): + raise AllZeroUnitCellError + if np.any(atoms.pbc) and not np.all(atoms.pbc): + raise MixedPBCError + + def _validate_charge_and_spin(self, atoms: Atoms) -> None: + """ + Validate and set default values for charge and spin. + + Args: + atoms (Atoms): The atomic structure containing charge and spin information. + """ + + if "charge" not in atoms.info: + atoms.info["charge"] = DEFAULT_CHARGE + logger.warning( + "Defaulting to charge=0. " + "Ensure charge is an integer representing the total charge " + "on the system and is within the range -100 to 100." + ) + + if "spin" not in atoms.info: + atoms.info["spin"] = DEFAULT_SPIN + logger.warning( + "Defaulting to spin=1. " + "Ensure spin is an integer representing " + "the spin multiplicity from 0 to 100." + ) + + # Validate charge + charge = atoms.info["charge"] + if not isinstance(charge, int): + raise TypeError( + f"Invalid type for charge: {type(charge)}. " + f"Charge must be an integer representing " + f"the total charge on the system." + ) + if not (CHARGE_RANGE[0] <= charge <= CHARGE_RANGE[1]): + raise ValueError( + f"Invalid value for charge: {charge}. " + f"Charge must be within the range " + f"{CHARGE_RANGE[0]} to {CHARGE_RANGE[1]}." + ) + + # Validate spin + spin = atoms.info["spin"] + if not isinstance(spin, int): + raise TypeError( + f"Invalid type for spin: {type(spin)}. " + f"Spin must be an integer representing " + f"the spin multiplicity." + ) + if not (SPIN_RANGE[0] <= spin <= SPIN_RANGE[1]): + raise ValueError( + f"Invalid value for spin: {spin}. " + f"Spin must be within the range " + f"{SPIN_RANGE[0]} to {SPIN_RANGE[1]}." + ) + + def _get_single_atom_energies(self, atoms) -> dict: + """ + Populate output with single atom energies + """ + raise ValueError("Single atom systems are not handled by the model.") + + def run_opt( + self, + structures: List[Atoms], + optimizer: str = "LBFGS", + filter: str = "FrechetCellFilter", + fmax: float = 0.05, + steps: int = 100, + ): + # Convert structures to ASE format + structures = self.structure_to_ase(structures) + + # Set filter and optimizer + optimizer_cls = OPTIMIZERS[optimizer] + filter_cls = getattr(filters, filter) if filter != "none" else None + + # Relax + for idx, atoms in enumerate(structures): + formula = atoms.get_chemical_formula() + logger.info(f"[{idx+1}/{len(structures)}] Relaxing structure: {formula}") + + # Set calculator + atoms.calc = self + system = filter_cls(atoms) if filter_cls else atoms + + # Set up optimizer (with logfile and trajectory) + opt = optimizer_cls( + system, + logfile=f"{idx}_{formula}.log", + trajectory=f"{idx}_{formula}.traj", + ) + + # Run optimization + try: + opt.run(fmax=fmax, steps=steps) + write(f"{idx}_{formula}.xyz", atoms) + except Exception as e: + logger.warning(f"Optimization failed for {formula}: {e}") + continue + + def run_md( + self, + structures: List[Atoms], + temperature: float = 300, + timestep: float = 0.1, + steps: int = 100, + interval: int = 1, + ): + # Convert structures to ASE format + structures = self.structure_to_ase(structures) + + # Run MD + for idx, atoms in enumerate(structures): + formula = atoms.get_chemical_formula() + logger.info(f"[{idx+1}/{len(structures)}] Running MD: {formula}") + + # Set the calculator + atoms.calc = self + + dyn = Langevin( + atoms, + timestep=timestep * units.fs, + temperature_K=temperature, + friction=0.01 / units.fs, + ) + + dyn.attach( + MDLogger( + dyn, + atoms, + f"{idx}_{formula}.log", + header=True, + stress=False, + peratom=False, + ), + interval=interval, + ) + + # Trajectory + trajectory = Trajectory(f"{idx}_{formula}.traj", "w", atoms) + dyn.attach(trajectory.write, interval=interval) + dyn.run(steps=steps) + + # Last structure + write(f"{idx}_{formula}_final.xyz", atoms) + + +class MixedPBCError(ValueError): + """Specific exception example.""" + + def __init__( + self, + message="Attempted to guess PBC for an atoms object, " + "but the atoms object has PBC set to True for somedimensions but not others. " + "Please ensure that the atoms object has PBC set to True for all dimensions.", + ): + self.message = message + super().__init__(self.message) + + +class AllZeroUnitCellError(ValueError): + """Specific exception example.""" + + def __init__( + self, + message="Atoms object claims to have PBC set, " + "but the unit cell is identically 0. Please ensure that the atoms " + "object has a non-zero unit cell.", + ): + self.message = message + super().__init__(self.message) diff --git a/ppmat/datasets/__init__.py b/ppmat/datasets/__init__.py new file mode 100644 index 00000000..fdfb3330 --- /dev/null +++ b/ppmat/datasets/__init__.py @@ -0,0 +1,354 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import copy +import os +import pickle # noqa +import random +import signal +from pathlib import Path +from typing import Dict +from typing import Optional +from typing import Type # noqa + +import numpy as np +import paddle +import paddle.distributed as dist +from paddle import io +from paddle.io import BatchSampler # noqa +from paddle.io import DataLoader +from paddle.io import DistributedBatchSampler # noqa + +from ppmat.datasets import collate_fn +from ppmat.datasets.high_level_water_dataset import HighLevelWaterDataset +from ppmat.datasets.jarvis_dataset import JarvisDataset +from ppmat.datasets.matbench_dataset import MatbenchDataset +from ppmat.datasets.mp20_dataset import AlexMP20MatterGenDataset +from ppmat.datasets.mp20_dataset import MP20Dataset +from ppmat.datasets.mp20_dataset import MP20MatterGenDataset +from ppmat.datasets.mp2018_dataset import MP2018Dataset +from ppmat.datasets.mp2024_dataset import MP2024Dataset +from ppmat.datasets.mptrj_dataset import MPTrjDataset +from ppmat.datasets.asu_mp20_dataset import AsymmetricUnitDataset +from ppmat.datasets.msd_nmr_dataset import MSDnmrDataset +from ppmat.datasets.msd_nmr_dataset import MSDnmrinfos +from ppmat.datasets.density_dataset import DensityDataset +from ppmat.datasets.small_density_dataset import SmallDensityDataset +from ppmat.datasets.sfin_dataset import SFINDataset +from ppmat.datasets.num_atom_crystal_dataset import NumAtomsCrystalDataset +from ppmat.datasets.oc20_s2ef_dataset import OC20S2EFDataset # noqa +from ppmat.datasets.qm9_dataset import QM9Dataset # noqa +from ppmat.datasets.omol25_dataset import OMol25Dataset +from ppmat.datasets.split_mptrj_data import none_to_zero +from ppmat.datasets.transform import build_transforms +from ppmat.utils import logger + +__all__ = [ + "MP20Dataset", + "MP2018Dataset", + "MP2024Dataset", + "MP20MatterGenDataset", + "AlexMP20MatterGenDataset", + "NumAtomsCrystalDataset", + "set_signal_handlers", + "MPTrjDataset", + "JarvisDataset", + "HighLevelWaterDataset", + "MSDnmrDataset", + "MatbenchDataset", + "DensityDataset", + "SmallDensityDataset", + "SFINDataset", + "OMol25Dataset", +] + +INFO_CLASS_REGISTRY: Dict[str, type] = { + "MSDnmrDataset": MSDnmrinfos, +} + + +def worker_init_fn(id: int): + """ + DataLoaders workers init function. + + Initialize the numpy.random seed correctly for each worker, so that + random augmentations between workers and/or epochs are not identical. + + If a global seed is set, the augmentations are deterministic. + + https://pytorch.org/docs/stable/notes/randomness.html#dataloader + """ + uint64_seed = paddle.get_rng_state()[0].current_seed() + ss = np.random.SeedSequence([uint64_seed]) + np.random.seed(ss.generate_state(4)) + random.seed(uint64_seed) + + +def term_mp(sig_num, frame): + """kill all child processes""" + pid = os.getpid() + pgid = os.getpgid(os.getpid()) + print("main proc {} exit, kill process group " "{}".format(pid, pgid)) + os.killpg(pgid, signal.SIGKILL) + +def set_signal_handlers(): + """ + Set up signal handlers for safe process group termination. + + Registers SIGINT and SIGTERM signal handlers when: + 1. The OS supports process groups (os.getpgid exists) + 2. The current process is the process group leader + + This allows safe termination of the entire process group via: + - Ctrl+C (SIGINT) + - Termination signals (SIGTERM) + + Safety Notes: + - Only sets handlers when current process is group leader + - Prevents accidentally terminating parent processes + - Uses term_mp() which kills the entire process group + """ + pid = os.getpid() + try: + pgid = os.getpgid(pid) + except AttributeError: + # In case `os.getpgid` is not available, no signal handler will be set, + # because we cannot do safe cleanup. + pass + else: + # XXX: `term_mp` kills all processes in the process group, which in + # some cases includes the parent process of current process and may + # cause unexpected results. To solve this problem, we set signal + # handlers only when current process is the group leader. In the + # future, it would be better to consider killing only descendants of + # the current process. + if pid == pgid: + # support exit using ctrl+c + signal.signal(signal.SIGINT, term_mp) + signal.signal(signal.SIGTERM, term_mp) + + +def build_dataloader(cfg: Dict): + """Build dataloader from config. + + Args: + cfg (Dict): config dictionary. + + Returns: + paddle.io.DataLoader: paddle.io.DataLoader object. + """ + + if cfg is None: + return None + world_size = dist.get_world_size() + cfg = copy.deepcopy(cfg) + + dataset_cfg = cfg["dataset"] + cls_name = dataset_cfg.pop("__class_name__") + init_params = dataset_cfg.pop("__init_params__") + + if "transforms" in init_params: + init_params["transforms"] = build_transforms(init_params.pop("transforms")) + + dataset = eval(cls_name)(**init_params) + + loader_config = cfg.get("loader") + if loader_config is None: + loader_config = { + "num_workers": 0, + "use_shared_memory": True, + "collate_fn": "DefaultCollator", + } + logger.message("No loader config is provided, use default config.") + logger.message("Default loader config: {}".format(loader_config)) + + num_workers = loader_config.pop("num_workers", 0) + use_shared_memory = loader_config.pop("use_shared_memory", True) + + # collate_obj = getattr( + # collate_fn, loader_config.pop("collate_fn", "DefaultCollator") + # )() + collate_fn_name = loader_config.pop("collate_fn", "DefaultCollator") + collate_params = loader_config.pop("collate_params", {}) + collate_cls = getattr(collate_fn, collate_fn_name) + collate_obj = collate_cls(**collate_params) + + # build sampler + if cfg.get("split_dataset_ratio") is not None: + ratio_dict = cfg["split_dataset_ratio"] + ratio_dict = {k: none_to_zero(v) for k, v in ratio_dict.items()} + + if ratio_dict["train"] + ratio_dict["val"] + ratio_dict["test"] != 1.0: + raise ValueError( + f"The sum of train_ratio, val_ratio and test_ratio " + f"should be equal to 1.0, but got " + f"{ratio_dict['train'] + ratio_dict['val'] + ratio_dict['test']}" + ) + + # split train/valid/test dataset numbers + total_nums = len(dataset) + if ratio_dict["test"] == 0: + train_nums = int(total_nums * ratio_dict["train"]) + val_nums = total_nums - train_nums + test_nums = 0 + else: + train_nums = int(total_nums * ratio_dict["train"]) + val_nums = int(total_nums * ratio_dict["val"]) + test_nums = total_nums - train_nums - val_nums + logger.info( + f"Number of train, val and test dataset " + f"are {train_nums}, {val_nums} and {test_nums}." + ) + + train_dataset, val_dataset, test_dataset = io.random_split( + dataset, [train_nums, val_nums, test_nums] + ) + dataset_dict = { + "train": train_dataset if len(train_dataset) != 0 else None, + "val": val_dataset if len(val_dataset) != 0 else None, + "test": test_dataset if len(test_dataset) != 0 else None, + } + + data_loader_dict = {} + for data_name, dataset in dataset_dict.items(): + if dataset is None: + data_loader_dict[data_name] = None + continue + sampler_cfg = cfg.get(f"{data_name}_sampler", None) + batch_sampler = set_build_sample(sampler_cfg, world_size, dataset) + data_loader_dict[data_name] = DataLoader( + dataset=dataset, + batch_sampler=batch_sampler, + num_workers=num_workers, + return_list=True, + use_shared_memory=use_shared_memory, + collate_fn=collate_obj, + worker_init_fn=worker_init_fn, + **loader_config, + ) + + return data_loader_dict + + else: + sampler_cfg = cfg.get("sampler", None) + batch_sampler = set_build_sample(sampler_cfg, world_size, dataset) + + data_loader = DataLoader( + dataset=dataset, + batch_sampler=batch_sampler, + num_workers=num_workers, + return_list=True, + use_shared_memory=use_shared_memory, + collate_fn=collate_obj, + worker_init_fn=worker_init_fn, + **loader_config, + ) + return data_loader + + +def set_build_sample(sampler_cfg, world_size, dataset): + if sampler_cfg is not None: + batch_sampler_cls = sampler_cfg.pop("__class_name__") + init_params = sampler_cfg.pop("__init_params__") + + if batch_sampler_cls == "BatchSampler": + if world_size > 1: + batch_sampler_cls = "DistributedBatchSampler" + logger.warning( + f"Automatically use 'DistributedBatchSampler' instead of " + f"'BatchSampler' when world_size({world_size}) > 1." + ) + + batch_sampler = getattr(io, batch_sampler_cls)(dataset, **init_params) + else: + batch_sampler_cls = "BatchSampler" + if world_size > 1: + batch_sampler_cls = "DistributedBatchSampler" + logger.warning( + f"Automatically use 'DistributedBatchSampler' instead of " + f"'BatchSampler' when world_size({world_size}) > 1." + ) + batch_sampler = getattr(io, batch_sampler_cls)( + dataset, + batch_size=init_params["batch_size"], + shuffle=False, + drop_last=False, + ) + logger.message( + "'shuffle' and 'drop_last' are both set to False in default as sampler " + "config is not specified." + ) + + return batch_sampler + + +def build_dataset_infos( + cfg: Dict, + dataloaders=None, + *, + recompute_statistics: bool = False, + cache_dir: Optional[str | Path] = None, + force_refresh: bool = False, + verbose: bool = True, +): + """Build dataset information from config. + + Args: + cfg (Dict): Global experiment config. Must contain + cfg["Dataset']["train"]["dataset"] with kyes: + - data_flag (e.g. n<15 / n<20 / …) + - remove_h (bool, drop hydrogens or not) + - info_class (optional, default "MMSnmrDataset") + dataloaders : object, optional + Needed only when recompute_statistics=True. + Expected to implement: + node_counts(), node_types(), edge_counts(), valency_count(max_n) + recompute_statistics : bool + If True, compute fresh histograms from *dataloaders*. + cache_dir : str | Path, optional + Folder for pickled cache files. Disabled when None. + force_refresh : bool + Ignore existing cache and build from scratch. + verbose : bool + Print status messages. + """ + # 1.Resolve which Infos class we should instantiate + if cfg is None: + return None + cfg = copy.deepcopy(cfg) + + dataset_cfg = cfg["Dataset"]["train"]["dataset"] + info_class_name = dataset_cfg.pop("__class_name__") + init_params = dataset_cfg.pop("__init_params__") + + info_cls = INFO_CLASS_REGISTRY.get(info_class_name) + if info_cls is None: + raise ValueError( + f"Unknown info_class '{info_class_name}'." + f"Supported classes: {list(INFO_CLASS_REGISTRY)}" + ) + + # 2.Build a *new* infos instance + if verbose: + logger.warning( + f"Build_dataset_infos Instantiating {info_class_name}" + f"(recompute_statistics={recompute_statistics})" + ) + + infos = info_cls( + dataloaders=dataloaders, + cfg=init_params, + recompute_statistics=recompute_statistics, + ) + + return infos diff --git a/ppmat/datasets/asu_crystal.py b/ppmat/datasets/asu_crystal.py new file mode 100644 index 00000000..2d031ada --- /dev/null +++ b/ppmat/datasets/asu_crystal.py @@ -0,0 +1,255 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ASU (Asymmetric Unit) crystal data structures and utilities.""" + +from typing import List, Optional, Tuple, Union + +import numpy as np +import paddle + +NUM_ELEMENTS = 98 # SGEquiDiff flat crystal format offset + + +class CartesianAtom: + """Immutable atom data for hash-based comparison.""" + __slots__ = ('wyckoff_letter', 'element', 'cartesian_cart_coords') + + def __init__(self, wyckoff_letter, element, cartesian_cart_coords): + self.wyckoff_letter = wyckoff_letter + self.element = element + self.cartesian_cart_coords = cartesian_cart_coords + + def __eq__(self, other): + if not isinstance(other, CartesianAtom): + return NotImplemented + return (self.wyckoff_letter == other.wyckoff_letter and self.element == other.element + and paddle.allclose(self.cartesian_cart_coords, other.cartesian_cart_coords, atol=0.1, rtol=0.0)) + + def __str__(self): + return f"{int(self.wyckoff_letter)}_{int(self.element)}_{self.cartesian_cart_coords.detach().cpu().numpy().round(decimals=1)}" + + +class ASUCrystal: + """ASU crystal data with optional immutability for hashable operations.""" + + __hash__ = None + + def __init__( + self, + space_group_number: paddle.Tensor, + conventional_lattice_lengths: paddle.Tensor, + conventional_lattice_angles: paddle.Tensor, + element_indices: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + conventional_frac_coords: paddle.Tensor, + device: Union[str, paddle.CUDAPlace, paddle.CPUPlace] = "cpu", + wyckoff_shape_indices: Optional[paddle.Tensor] = None, + composition_space: Optional[paddle.Tensor] = None, + cartesian_coords: Optional[paddle.Tensor] = None, + _immutable: bool = False, + ): + assert wyckoff_indices.shape[0] == element_indices.shape[0] == conventional_frac_coords.shape[0] + self.space_group_number = space_group_number + self.conventional_lattice_lengths = conventional_lattice_lengths + self.conventional_lattice_angles = conventional_lattice_angles + self.element_indices = element_indices + self.wyckoff_indices = wyckoff_indices + self.conventional_frac_coords = conventional_frac_coords + self.device = device + self.wyckoff_shape_indices = wyckoff_shape_indices + self.cartesian_coords: Optional[paddle.Tensor] = cartesian_coords + self.composition_space = composition_space + self._immutable = _immutable + + @classmethod + def from_flat(cls, flat_crystal: np.ndarray): + num_atoms: int = int(flat_crystal[0]) + space_group_number = paddle.to_tensor(flat_crystal[1].astype("int64"), dtype=paddle.int64) + composition_space = paddle.to_tensor(flat_crystal[2: 2 + NUM_ELEMENTS], dtype=paddle.float32) + conventional_lattice_lengths = paddle.to_tensor(flat_crystal[2 + NUM_ELEMENTS: 5 + NUM_ELEMENTS], dtype=paddle.float32) + conventional_lattice_angles = paddle.to_tensor(flat_crystal[5 + NUM_ELEMENTS: 8 + NUM_ELEMENTS], dtype=paddle.float32) + element_indices = paddle.to_tensor(flat_crystal[8 + NUM_ELEMENTS: 8 + NUM_ELEMENTS + num_atoms], dtype=paddle.int64) + wyckoff_indices = paddle.to_tensor(flat_crystal[8 + NUM_ELEMENTS + num_atoms: 8 + NUM_ELEMENTS + (2 * num_atoms)], dtype=paddle.int64) + conventional_frac_coords = paddle.to_tensor(flat_crystal[8 + NUM_ELEMENTS + (2 * num_atoms): 8 + NUM_ELEMENTS + (5 * num_atoms)].reshape(num_atoms, 3), dtype=paddle.float32) + wyckoff_shape_indices = paddle.to_tensor(flat_crystal[8 + NUM_ELEMENTS + (5 * num_atoms): 8 + NUM_ELEMENTS + (6 * num_atoms)], dtype=paddle.int64) if len(flat_crystal) > 8 + NUM_ELEMENTS + (5 * num_atoms) else None + return cls(space_group_number=space_group_number, composition_space=composition_space, conventional_lattice_lengths=conventional_lattice_lengths, conventional_lattice_angles=conventional_lattice_angles, element_indices=element_indices, wyckoff_indices=wyckoff_indices, conventional_frac_coords=conventional_frac_coords, wyckoff_shape_indices=wyckoff_shape_indices) + + @property + def num_atoms(self) -> int: + return int(self.conventional_frac_coords.shape[0]) + + def to_ImmutableASUCrystal(self): + return ImmutableASUCrystal( + self.space_group_number, self.conventional_lattice_lengths, self.conventional_lattice_angles, + self.element_indices, self.wyckoff_indices, self.conventional_frac_coords, self.device, + self.wyckoff_shape_indices, self.composition_space, self.cartesian_coords, + ) + + +class ImmutableASUCrystal(ASUCrystal): + """Hashable version of ASUCrystal.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, _immutable=True, **kwargs) + self._num_atoms = int(self.conventional_frac_coords.shape[0]) + if isinstance(self.cartesian_coords, paddle.Tensor): + self._atoms = [CartesianAtom(w, e, c.unsqueeze(0)) for w, e, c in zip(self.wyckoff_indices.detach(), self.element_indices.detach(), self.cartesian_coords.detach())] + else: + self._atoms = None + + def to_ASUCrystal(self): + return ASUCrystal(self.space_group_number.clone(), self.conventional_lattice_lengths.clone(), self.conventional_lattice_angles.clone(), self.element_indices.clone(), self.wyckoff_indices.clone(), self.conventional_frac_coords.clone(), self.device, self.wyckoff_shape_indices.clone() if self.wyckoff_shape_indices is not None else None, self.composition_space.clone() if self.composition_space is not None else None, self.cartesian_coords) + + @property + def num_atoms(self) -> int: + return self._num_atoms + + def __eq__(self, other): + if not isinstance(other, ImmutableASUCrystal): + return NotImplemented + if other is self: + return True + if int(self.space_group_number) != int(other.space_group_number) or self._num_atoms != other._num_atoms: + return False + if not (paddle.allclose(self.conventional_lattice_lengths, other.conventional_lattice_lengths, atol=1e-6, rtol=0.0) and paddle.allclose(self.conventional_lattice_angles, other.conventional_lattice_angles, atol=1e-6, rtol=0.0)): + return False + assert self._atoms is not None + return all(a in other._atoms for a in self._atoms) and all(a in self._atoms for a in other._atoms) + + def __hash__(self): + assert self._atoms is not None + return hash(f"{int(self.space_group_number)}_{self.conventional_lattice_lengths.detach().numpy().round(1)}_{self.conventional_lattice_angles.detach().numpy().round(0)}_{sorted([str(a) for a in self._atoms])}") + + +def is_inside( + xs: paddle.Tensor, + hull_equations: paddle.Tensor, + epsilon: float = 1e-6, +) -> paddle.Tensor: + """Check if points are inside a convex polytope.""" + results = xs @ hull_equations[:, :3].T < -hull_equations[:, 3][None, :] - epsilon + return results.all(axis=-1) + + +def uniformly_sample_point_in_asu_wyckoff_site( + space_group_numbers: List[str], + wyckoff_letters: List[str], + dictionary_of_wyckoffs_in_asu: dict, + dictionary_of_wyckoff_shape_decompositions: dict, + device=None, + finished_sampling_mask: paddle.Tensor = None, + n_samples_per_wyckoff: int = 1, + return_sampled_wyckoff_shape_indices: bool = False, + hull_equations_3d: Optional[paddle.Tensor] = None, +) -> Union[paddle.Tensor, Tuple[paddle.Tensor, paddle.Tensor]]: + """Uniformly sample points in ASU Wyckoff sites.""" + random_samples_in_wyckoffs = [] + sampled_wyckoff_shape_indices = [] + for i, (space_group_number, wyckoff_letter) in enumerate( + zip(space_group_numbers, wyckoff_letters) + ): + wyckoff_position_dict = dictionary_of_wyckoffs_in_asu[space_group_number][wyckoff_letter] + wyckoff_dof = int(wyckoff_position_dict["dim"]) + + if wyckoff_dof == 1: + lengths = paddle.to_tensor( + dictionary_of_wyckoff_shape_decompositions[space_group_number][wyckoff_letter]["volumes"], + dtype=paddle.float32, + ) + vertices = paddle.to_tensor(wyckoff_position_dict["vertices"].astype("float32")) + sampled_line_index = paddle.multinomial( + lengths, num_samples=n_samples_per_wyckoff, replacement=True + ) + vertices = vertices[sampled_line_index] + sampled_wyckoff_shape_index = sampled_line_index + + elif wyckoff_dof == 2: + wyckoff_shapes_decomp_dict = dictionary_of_wyckoff_shape_decompositions[space_group_number][wyckoff_letter] + facet_areas = paddle.to_tensor(wyckoff_shapes_decomp_dict["volumes"], dtype=paddle.float32) + sampled_facet_idxs = paddle.multinomial(facet_areas, num_samples=n_samples_per_wyckoff, replacement=True) + max_num_triangles_per_facet = wyckoff_shapes_decomp_dict["max_triangles_per_facet"] + _sampled_facet_triangle_areas = [ + paddle.to_tensor(wyckoff_shapes_decomp_dict["facet_triangle_areas"][int(fid)], dtype=paddle.float32) + for fid in sampled_facet_idxs + ] + sampled_facet_triangle_areas = paddle.zeros([n_samples_per_wyckoff, max_num_triangles_per_facet]) + for j in range(n_samples_per_wyckoff): + n = _sampled_facet_triangle_areas[j].shape[0] + sampled_facet_triangle_areas[j, :n] = _sampled_facet_triangle_areas[j] + sampled_triangle_idxs = paddle.multinomial(sampled_facet_triangle_areas, num_samples=1).squeeze(axis=1) + vertices = paddle.stack([ + paddle.to_tensor(wyckoff_shapes_decomp_dict["facet_triangles"][int(fid)][int(tid)], dtype=paddle.float32) + for fid, tid in zip(sampled_facet_idxs, sampled_triangle_idxs) + ], axis=0) + sampled_wyckoff_shape_index = sampled_facet_idxs + + else: + vertices = wyckoff_position_dict["vertices_tensor"] + sampled_wyckoff_shape_index = paddle.to_tensor([0], dtype=paddle.int64).expand([n_samples_per_wyckoff]) + + if finished_sampling_mask is not None and finished_sampling_mask[i]: + sample_in_wyckoff = paddle.full([n_samples_per_wyckoff, 3], -1.0, dtype=paddle.float32) + sampled_wyckoff_shape_index = paddle.full([n_samples_per_wyckoff], -1, dtype=paddle.int64) + else: + h_eq = hull_equations_3d[int(space_group_number) - 1] if hull_equations_3d is not None else None + sample_in_wyckoff = uniformly_sample_point_in_convex_shape( + vertices=vertices, wyckoff_site_dimensionality=wyckoff_dof, + n_samples=n_samples_per_wyckoff, hull_equations=h_eq, + ) + assert sample_in_wyckoff is not None + + random_samples_in_wyckoffs.append(sample_in_wyckoff) + sampled_wyckoff_shape_indices.append(sampled_wyckoff_shape_index) + + random_samples_in_wyckoffs = paddle.stack(random_samples_in_wyckoffs, axis=0) + sampled_wyckoff_shape_indices = paddle.stack(sampled_wyckoff_shape_indices, axis=0) + if return_sampled_wyckoff_shape_indices: + return random_samples_in_wyckoffs, sampled_wyckoff_shape_indices + return random_samples_in_wyckoffs + + +def uniformly_sample_point_in_convex_shape( + vertices: paddle.Tensor, + wyckoff_site_dimensionality: int, + n_samples: int = 1, + hull_equations: Optional[paddle.Tensor] = None, +) -> paddle.Tensor: + """Uniformly sample points inside a convex shape.""" + if wyckoff_site_dimensionality == 0: + assert vertices.shape == [1, 3] + return vertices.expand([n_samples, 3]) + elif wyckoff_site_dimensionality == 1: + assert list(vertices.shape) == [n_samples, 2, 3] + samples = paddle.rand([n_samples, 1]) + ep1, ep2 = vertices[:, 0], vertices[:, 1] + return samples * (ep2 - ep1) + ep1 + elif wyckoff_site_dimensionality == 2: + assert list(vertices.shape) == [n_samples, 3, 3] + r1_sqrt, r2 = paddle.rand([n_samples, 1]).sqrt(), paddle.rand([n_samples, 1]) + return (1.0 - r1_sqrt) * vertices[:, 0] + r1_sqrt * (1.0 - r2) * vertices[:, 1] + r1_sqrt * r2 * vertices[:, 2] + elif wyckoff_site_dimensionality == 3: + assert hull_equations is not None, "hull_equations required for 3D sampling" + box_lower_left = paddle.min(vertices, axis=0) + box_top_right = paddle.max(vertices, axis=0) + accepted = [] + total = 0 + while True: + candidate = paddle.rand([3 * n_samples, 3]) * (box_top_right - box_lower_left) + box_lower_left + mask = is_inside(candidate, hull_equations) + accepted.append(candidate[mask]) + total += mask.cast(paddle.int64).sum().item() + if total >= n_samples: + return paddle.concat(accepted, axis=0)[:n_samples] + raise AttributeError(f"Invalid dimensionality: {wyckoff_site_dimensionality}") diff --git a/ppmat/datasets/asu_mp20_dataset.py b/ppmat/datasets/asu_mp20_dataset.py new file mode 100644 index 00000000..f3919fd1 --- /dev/null +++ b/ppmat/datasets/asu_mp20_dataset.py @@ -0,0 +1,174 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Asymmetric Unit (ASU) MP-20 dataset.""" +from pathlib import Path +from typing import List, Optional, Union + +import numpy as np +import paddle +import pandas as pd +from paddle.io import Dataset + +from ppmat.datasets.asu_crystal import ASUCrystal, ImmutableASUCrystal + + +def _get_data_directory() -> Path: + """Return data root directory: check env var first, fallback to project data/.""" + import os + env = os.environ.get("SGEQUIDIFF_DATA_DIR", None) + if env: + return Path(env) + # try project data directory + candidates = [ + Path(__file__).resolve().parents[3] / "data", + Path("~").expanduser() / ".sgequidiff_data", + ] + for c in candidates: + if c.exists(): + return c + raise FileNotFoundError( + "Cannot find data directory. Set SGEQUIDIFF_DATA_DIR or ensure data/ exists." + ) + +class AsymmetricUnitDataset(Dataset): + """ASU-representation Materials Project dataset (MP-20 / MPTS-52).""" + + def __init__( + self, + name: str = "mp_20", + split: str = "train", + data_directory: Optional[Path] = None, + ): + super().__init__() + assert split in ["train", "val", "test"], f"unknown split: {split}" + assert name in ["mp_20", "mp_20_assumeP1", "mpts_52"], f"unknown name: {name}" + + if name in ("mp_20", "mp_20_assumeP1"): + self.max_atoms = 20 + self.max_elements = 7 + elif name == "mpts_52": + self.max_atoms = 52 + self.max_elements = 7 + + self.name = name + self.split = split + + if data_directory is None: + data_directory = _get_data_directory() + + data_path = Path(data_directory) / name / f"{split}.npz" + properties_path = Path(data_directory) / name / f"{split}_properties.pkl" + + npz: dict = np.load(data_path) + properties_df = pd.read_pickle(properties_path) # reserved for future use + + self.indices_arr: np.ndarray = npz["indices"] + self.packed: np.ndarray = npz["packed"] + flat_crystals: List[np.ndarray] = np.split(self.packed, self.indices_arr) + num_crystals = len(flat_crystals) + + self.data: List[ImmutableASUCrystal] = [] + _space_group_indices = [] + _composition_spaces = [] + _lattice_lengths = [] + _lattice_angles = [] + _n_atoms_per_asu = [] + + self.padded_element_indices = -1 * paddle.ones( + [num_crystals, self.max_atoms], dtype=paddle.int64 + ) + self.padded_wyckoff_indices = -1 * paddle.ones( + [num_crystals, self.max_atoms], dtype=paddle.int64 + ) + self.padded_wyckoff_shape_indices = -1 * paddle.ones( + [num_crystals, self.max_atoms], dtype=paddle.int64 + ) + self.padded_frac_coords = -1.0 * paddle.ones( + [num_crystals, self.max_atoms, 3], dtype=paddle.float32 + ) + self.atoms_mask = paddle.zeros([num_crystals, self.max_atoms], dtype=paddle.bool) + + for i, flat in enumerate(flat_crystals): + crystal: ASUCrystal = ASUCrystal.from_flat(flat) + num_atoms: int = crystal.num_atoms + self.data.append(crystal.to_ImmutableASUCrystal()) + + _space_group_indices.append(crystal.space_group_number - 1) + _composition_spaces.append(crystal.composition_space) + _lattice_lengths.append(crystal.conventional_lattice_lengths) + _lattice_angles.append(crystal.conventional_lattice_angles) + _n_atoms_per_asu.append(num_atoms) + + # sort by wyckoff_index, element_index lexicographically + sorting_indices = paddle.to_tensor( + sorted( + range(num_atoms), + key=lambda j: ( + int(crystal.wyckoff_indices[j].item()), + int(crystal.element_indices[j].item()), + ), + ), + dtype=paddle.int64, + ) + + self.padded_element_indices[i, :num_atoms] = crystal.element_indices[sorting_indices] + self.padded_wyckoff_indices[i, :num_atoms] = crystal.wyckoff_indices[sorting_indices] + self.padded_wyckoff_shape_indices[i, :num_atoms] = crystal.wyckoff_shape_indices[sorting_indices] + self.padded_frac_coords[i, :num_atoms] = crystal.conventional_frac_coords[sorting_indices] + self.atoms_mask[i, :num_atoms] = True + + self.space_group_indices = paddle.to_tensor(_space_group_indices, dtype=paddle.int64) + self.n_atoms_per_asu = paddle.to_tensor(_n_atoms_per_asu, dtype=paddle.int64) + self.composition_spaces = paddle.stack( + [paddle.to_tensor(c, dtype=paddle.float32) for c in _composition_spaces], axis=0 + ) + self.lattice_lengths = paddle.stack( + [paddle.to_tensor(l, dtype=paddle.float32) for l in _lattice_lengths], axis=0 + ) + self.lattice_angles = paddle.stack( + [paddle.to_tensor(a, dtype=paddle.float32) for a in _lattice_angles], axis=0 + ) + + def __len__(self) -> int: + return int(self.space_group_indices.shape[0]) + + def __getitem__( + self, + index: int, + ) -> dict: + """Return single sample dict compatible with DefaultCollator.""" + if not isinstance(index, int): + raise TypeError( + f"Expected int index, got {type(index)}. " + "DataLoader with BatchSampler calls __getitem__ with int." + ) + + return self._get_single_item(index) + + @paddle.no_grad() + def _get_single_item(self, index: int) -> dict: + """Return single sample dict, all tensors without batch dim.""" + return { + "space_group_indices": self.space_group_indices[index], # scalar + "batch_chemistries": self.composition_spaces[index], # (chem_dim,) + "lattice_lengths": self.lattice_lengths[index], # (3,) + "lattice_angles": self.lattice_angles[index], # (3,) + "n_atoms_per_asu": self.n_atoms_per_asu[index], # scalar + "element_indices": self.padded_element_indices[index], # (max_atoms,) + "wyckoff_indices": self.padded_wyckoff_indices[index], # (max_atoms,) + "wyckoff_shape_indices": self.padded_wyckoff_shape_indices[index],# (max_atoms,) + "frac_coords": self.padded_frac_coords[index], # (max_atoms, 3) + "atoms_mask": self.atoms_mask[index], # (max_atoms,) + } \ No newline at end of file diff --git a/ppmat/datasets/build_matched_name.py b/ppmat/datasets/build_matched_name.py new file mode 100644 index 00000000..ddfe9716 --- /dev/null +++ b/ppmat/datasets/build_matched_name.py @@ -0,0 +1,361 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import copy +import os.path as osp +from typing import Dict +from typing import List +from typing import Optional +from typing import Sequence +from typing import Union + + +def build_matched_name_samples(cfg: Dict): + """Build sample matcher from config.""" + if cfg is None: + raise ValueError("Sample matcher config must not be None.") + + cfg = copy.deepcopy(cfg) + + match_mode = cfg.pop("match_mode", "indexed") + if match_mode in ("indexed", "index", "BuildIndexedNameSamples"): + return BuildIndexedNameSamples(**cfg) + if match_mode in ("matched", "same_name", "BuildMatchedNameSamples"): + return BuildMatchedNameSamples(**cfg) + + raise ValueError( + f"Unsupported match_mode: {match_mode}. " + "Expected one of {'indexed', 'matched'}." + ) + + +def build_prediction_samples( + noisy_files: Sequence[str], + noisy_key: str = "noisy", + name_key: str = "name", +) -> List[Dict[str, str]]: + return [{noisy_key: file_name, name_key: file_name} for file_name in noisy_files] + + +def _pair_files_by_name( + noisy_files: Sequence[str], + target_files: Sequence[str], + noisy_file_key: str, + target_file_key: str, +) -> List[Dict[str, str]]: + """Pair noisy and target files by exactly matched file names. + + This helper only prepares file-name pairs for the sample builder. It does + not read image contents or depend on a dataset instance. + """ + noisy_file_set = set(noisy_files) + target_file_set = set(target_files) + missing_target = sorted(noisy_file_set - target_file_set) + missing_noisy = sorted(target_file_set - noisy_file_set) + if missing_target or missing_noisy: + raise FileNotFoundError( + "Noisy and target images are not paired. " + f"Missing target files: {missing_target[:10]}, " + f"missing noisy files: {missing_noisy[:10]}." + ) + return [ + { + noisy_file_key: file_name, + target_file_key: file_name, + } + for file_name in sorted(noisy_file_set & target_file_set) + ] + + +def _collect_indexed_file_map( + file_names: Sequence[str], + root: Optional[str], + file_suffix: Optional[str], +) -> Dict[int, str]: + """Validate strict integer file stems and map index to file name. + + Files such as ``0.png`` and ``00.png`` are treated as the same integer + index. Invalid stems and duplicate integer indices are rejected here so the + builder can fail before producing ambiguous noisy/target pairs. + """ + index_map = {} + invalid_files = [] + duplicate_files = [] + for file_name in file_names: + stem = osp.splitext(file_name)[0] + if not stem.isdigit(): + invalid_files.append((root, file_name)) + continue + index = int(stem) + if index in index_map: + duplicate_files.append((root, index_map[index], file_name)) + continue + index_map[index] = file_name + + if invalid_files: + expected_name = f"0{file_suffix}" if file_suffix is not None else "0.*" + raise ValueError( + "Strict indexed naming requires files named like " + f"'{expected_name}'. Invalid files: {invalid_files[:10]}." + ) + if duplicate_files: + raise ValueError( + "Strict indexed naming requires one file per integer index. " + f"Duplicate indexed files: {duplicate_files[:10]}." + ) + return index_map + + +def _pair_files_by_index( + noisy_files: Sequence[str], + target_files: Sequence[str], + noisy_file_key: str, + target_file_key: str, + noisy_root: Optional[str] = None, + target_root: Optional[str] = None, + file_suffix: Optional[str] = None, +) -> List[Dict[str, str]]: + """Pair noisy and target files by integer file stems. + + The returned dictionaries are still passed through ``BuildIndexedNameSamples`` + so the existing per-sample validation remains the final source of truth. + """ + noisy_map = _collect_indexed_file_map(noisy_files, noisy_root, file_suffix) + target_map = _collect_indexed_file_map(target_files, target_root, file_suffix) + common_indices = sorted(set(noisy_map.keys()) & set(target_map.keys())) + missing_target = sorted(set(noisy_map.keys()) - set(target_map.keys())) + missing_noisy = sorted(set(target_map.keys()) - set(noisy_map.keys())) + if missing_target or missing_noisy: + raise FileNotFoundError( + "Noisy and target images are not paired. " + f"Missing target indices: {missing_target[:10]}, " + f"missing noisy indices: {missing_noisy[:10]}." + ) + return [ + { + noisy_file_key: noisy_map[idx], + target_file_key: target_map[idx], + } + for idx in common_indices + ] + + +class BuildMatchedNameSamples: + """Match noisy and target samples by identical file names.""" + + def __init__( + self, + noisy_file_key: str = "noisy_file", + target_file_key: str = "target_file", + file_key: str = "file_name", + noisy_key: str = "noisy", + target_key: str = "target", + name_key: str = "name", + ): + self.noisy_file_key = noisy_file_key + self.target_file_key = target_file_key + self.file_key = file_key + self.noisy_key = noisy_key + self.target_key = target_key + self.name_key = name_key + + @staticmethod + def build_one( + file_data: Union[Dict[str, str], str], + noisy_file_key: str, + target_file_key: str, + file_key: str, + noisy_key: str, + target_key: str, + name_key: str, + ) -> Dict[str, str]: + if isinstance(file_data, dict): + if file_key in file_data: + noisy_file = file_data.get(file_key) + target_file = noisy_file + else: + noisy_file = file_data.get(noisy_file_key) + target_file = file_data.get(target_file_key) + else: + noisy_file = file_data + target_file = file_data + if not isinstance(noisy_file, str) or not noisy_file: + raise ValueError( + f"Expected non-empty noisy file name, but got {noisy_file}." + ) + if not isinstance(target_file, str) or not target_file: + raise ValueError( + f"Expected non-empty target file name, but got {target_file}." + ) + if noisy_file != target_file: + raise ValueError( + "Matched-name samples require identical noisy and target file names, " + f"but got {noisy_file} and {target_file}." + ) + return { + noisy_key: noisy_file, + target_key: target_file, + name_key: noisy_file, + } + + def __call__( + self, + file_names: Union[ + Sequence[Union[Dict[str, str], str]], + Dict[str, str], + str, + ], + target_file_names: Optional[Sequence[str]] = None, + noisy_root: Optional[str] = None, + target_root: Optional[str] = None, + file_suffix: Optional[str] = None, + ) -> Union[List[Dict[str, str]], Dict[str, str]]: + if target_file_names is not None: + file_names = _pair_files_by_name( + file_names, + target_file_names, + self.noisy_file_key, + self.target_file_key, + ) + + if isinstance(file_names, (list, tuple)): + if len(file_names) == 0: + return [] + return [ + BuildMatchedNameSamples.build_one( + file_name, + self.noisy_file_key, + self.target_file_key, + self.file_key, + self.noisy_key, + self.target_key, + self.name_key, + ) + for file_name in file_names + ] + return BuildMatchedNameSamples.build_one( + file_names, + self.noisy_file_key, + self.target_file_key, + self.file_key, + self.noisy_key, + self.target_key, + self.name_key, + ) + + +class BuildIndexedNameSamples: + """Match noisy and target samples by integer file stem.""" + + def __init__( + self, + noisy_file_key: str = "noisy_file", + target_file_key: str = "target_file", + noisy_key: str = "noisy", + target_key: str = "target", + name_key: str = "name", + ): + self.noisy_file_key = noisy_file_key + self.target_file_key = target_file_key + self.noisy_key = noisy_key + self.target_key = target_key + self.name_key = name_key + + @staticmethod + def build_one( + sample_data: Dict[str, str], + noisy_file_key: str, + target_file_key: str, + noisy_key: str, + target_key: str, + name_key: str, + ) -> Dict[str, str]: + if not isinstance(sample_data, dict): + raise TypeError( + f"Indexed sample data must be a dict, but got {type(sample_data)}." + ) + noisy_file = sample_data.get(noisy_file_key) + target_file = sample_data.get(target_file_key) + if not isinstance(noisy_file, str) or not noisy_file: + raise ValueError( + f"Expected non-empty noisy file name, but got {noisy_file}." + ) + if not isinstance(target_file, str) or not target_file: + raise ValueError( + f"Expected non-empty target file name, but got {target_file}." + ) + noisy_stem = osp.splitext(noisy_file)[0] + target_stem = osp.splitext(target_file)[0] + if not noisy_stem.isdigit() or not target_stem.isdigit(): + raise ValueError( + "Indexed-name samples require integer file stems, but got " + f"{noisy_file} and {target_file}." + ) + if int(noisy_stem) != int(target_stem): + raise ValueError( + "Indexed-name samples require matching integer file stems, but got " + f"{noisy_file} and {target_file}." + ) + return { + noisy_key: noisy_file, + target_key: target_file, + name_key: noisy_file, + } + + def __call__( + self, + sample_data_list: Union[ + Sequence[Dict[str, str]], + Dict[str, str], + ], + target_file_names: Optional[Sequence[str]] = None, + noisy_root: Optional[str] = None, + target_root: Optional[str] = None, + file_suffix: Optional[str] = None, + ) -> Union[List[Dict[str, str]], Dict[str, str]]: + if target_file_names is not None: + sample_data_list = _pair_files_by_index( + sample_data_list, + target_file_names, + self.noisy_file_key, + self.target_file_key, + noisy_root, + target_root, + file_suffix, + ) + + if isinstance(sample_data_list, (list, tuple)): + if len(sample_data_list) == 0: + return [] + return [ + BuildIndexedNameSamples.build_one( + sample_data, + self.noisy_file_key, + self.target_file_key, + self.noisy_key, + self.target_key, + self.name_key, + ) + for sample_data in sample_data_list + ] + return BuildIndexedNameSamples.build_one( + sample_data_list, + self.noisy_file_key, + self.target_file_key, + self.noisy_key, + self.target_key, + self.name_key, + ) diff --git a/ppmat/datasets/build_molecule.py b/ppmat/datasets/build_molecule.py new file mode 100644 index 00000000..32755fdd --- /dev/null +++ b/ppmat/datasets/build_molecule.py @@ -0,0 +1,143 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Any +from typing import List +from typing import Literal +from typing import Optional +from typing import Sequence +from typing import Union + +from p_tqdm import p_map +from rdkit import Chem + + +class BuildMolecule: + """Build RDKit Mol from different formats. + + Args: + format (Literal["smiles","mol_block","mol_file","sdf_file", "inchi","dict", + "rdmol"]): format of input molecules data used by convertion of RDKit + sanitize (bool): Whether to sanitize the molecule using RDKit after construction + (e.g., validate valence, adjust bond orders). Defaults to True. + add_hs (bool): Whether to add explicit hydrogen atoms to the molecule. + Defaults to False. + remove_hs (bool): Whether to remove existing explicit hydrogen atoms from the + molecule. Defaults to False. + kekulize (bool): Whether to attempt Kekulization of the molecule (convert + aromatic bonds to explicit single/double bonds). Defaults to False. + num_cpus (Optional[int]): Number of CPUs for parallel processing during + molecule construction. Defaults to 1 (no parallelism). + Set to None for automatic CPU detection. + """ + + def __init__( + self, + format: Literal[ + "smiles", "mol_block", "mol_file", "sdf_file", "inchi", "dict", "rdmol" + ], + sanitize: bool = True, + add_hs: bool = False, + remove_hs: bool = False, + kekulize: bool = False, + num_cpus: Optional[int] = None, + ) -> None: + self.format = format + self.sanitize = sanitize + self.add_hs = add_hs + self.remove_hs = remove_hs + self.kekulize = kekulize + self.num_cpus = 1 if num_cpus is None else int(num_cpus) + + @staticmethod + def _post_process( + mol: Chem.Mol, sanitize: bool, add_hs: bool, remove_hs: bool, kekulize: bool + ) -> Chem.Mol: + if mol is None: + return None + if sanitize: + Chem.SanitizeMol(mol) + if add_hs: + mol = Chem.AddHs(mol) + if kekulize: + try: + Chem.Kekulize(mol, clearAromaticFlags=True) + except Exception: + pass + if remove_hs: + mol = Chem.RemoveHs(mol) + return mol + + @staticmethod + def build_one( + mol_data: Any, + format: str, + sanitize: bool, + add_hs: bool, + remove_hs: bool, + kekulize: bool, + ) -> Optional[Chem.Mol]: + if format == "smiles": + mol = Chem.MolFromSmiles(str(mol_data), sanitize=sanitize) + elif format == "mol_block": + mol = Chem.MolFromMolBlock(str(mol_data), sanitize=sanitize) + elif format == "mol_file": + with open(str(mol_data), "r") as f: + mol_block = f.read() + mol = Chem.MolFromMolBlock(mol_block, sanitize=sanitize) + elif format == "sdf_file": + suppl = Chem.SDMolSupplier(str(mol_data), sanitize=sanitize, removeHs=False) + mol = next((m for m in suppl if m is not None), None) + elif format == "inchi": + mol = Chem.MolFromInchi(str(mol_data)) + elif format == "dict": + mol_block = mol_data.get("mol_block", None) + if mol_block is None: + raise ValueError("dict format requires key 'mol_block'.") + mol = Chem.MolFromMolBlock(mol_block, sanitize=sanitize) + elif format == "rdmol": + mol = mol_data + else: + raise ValueError(f"Invalid format specified: {format}") + + return BuildMolecule._post_process(mol, sanitize, add_hs, remove_hs, kekulize) + + def __call__( + self, molecules_data: Union[Sequence[Any], Any] + ) -> Union[List[Chem.Mol], Chem.Mol, None]: + if isinstance(molecules_data, (list, tuple)): + return p_map( + BuildMolecule.build_one, + molecules_data, + [self.format] * len(molecules_data), + [self.sanitize] * len(molecules_data), + [self.add_hs] * len(molecules_data), + [self.remove_hs] * len(molecules_data), + [self.kekulize] * len(molecules_data), + num_cpus=self.num_cpus, + desc="Building molecules", + dynamic_ncols=True, + mininterval=0.2, + ) + else: + return BuildMolecule.build_one( + molecules_data, + self.format, + self.sanitize, + self.add_hs, + self.remove_hs, + self.kekulize, + ) diff --git a/ppmat/datasets/build_spectrum.py b/ppmat/datasets/build_spectrum.py new file mode 100644 index 00000000..f2a4db60 --- /dev/null +++ b/ppmat/datasets/build_spectrum.py @@ -0,0 +1,267 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import copy +import importlib +from typing import Any +from typing import Dict +from typing import List +from typing import Optional +from typing import Sequence +from typing import Union + +import numpy as np +from p_tqdm import p_map + +from ppmat.utils import logger + + +def build_spectrum_converter( + cfg: Dict, + *, + vocabs: Optional[Dict[str, Dict[str, int]]] = None, + strict: bool = True, +): + """Build spectrum converter. + If 'vocabs' is provided (e.g., {'peakshape': {...}, 'intensity': {...}}), + inject/merge it into __init_params__['vocabs']. + + Args: + cfg (Dict): Spectrum converter config. + """ + if cfg is None: + return None + cfg = copy.deepcopy(cfg) + + class_name = cfg.pop("__class_name__") + if not class_name: + raise ValueError( + "Spectrum converter class name is not specified in the configuration." + ) + + init_params = cfg.pop("__init_params__") + if vocabs: + init_params["vocabs"] = {**(init_params.get("vocabs") or {}), **vocabs} + + cls = _locate_class(class_name) + + # Optional strict check: ensure required vocabs exist and contain unk_token + if strict and hasattr(cls, "REQUIRED_VOCABS"): + req = set(cls.REQUIRED_VOCABS) + got = set((init_params.get("vocabs") or {}).keys()) + miss = req - got + if miss: + raise ValueError( + f"{class_name} is missing required vocabularies: {sorted(miss)}" + ) + + unk = str(init_params.get("unk_token", "")) + + for name, vb in (init_params.get("vocabs") or {}).items(): + if unk not in vb: + raise ValueError( + f"Vocabulary '{name}' must include the unknown token '{unk}'" + ) + + spectrum_converter = eval(class_name)(**init_params) + logger.debug(str(spectrum_converter)) + + return spectrum_converter + + +class BuildSpectrumNMR: + """ + Convert tokenized NMR JSON into fixed-size numeric arrays for 1H and 13C. + + Input format (per sample, e.g. from CSV "tokenized_input" JSON): + { + "1HNMR": [ + [chem_shift, peak_width_token, split_token, "nH", [J1, J2, ...]], + ... + ], + "13CNMR": [c_shift1, c_shift2, ...] + } + + Output (dict of NumPy arrays and counts): + { + "H_nmr": float32 [seq_len_H1, 4 + j_len], + # [δ, peakwidth_id, split_id, integral, J*] + "num_H_peak": int, + "C_nmr": float32 [seq_len_C13], + # δ (ppm), padded/truncated + "num_C_peak": int, + } + + Notes: + - Unknown tokens map to vocab[""] (you must include it). + - Peaks beyond the sequence length are truncated; missing slots are zero-padded. + - Integral like "3H" is parsed as 3; you can add a constant offset if that + matches your training setup. + """ + + REQUIRED_VOCABS = ("peakwidth", "split") + + def __init__( + self, + vocabs: Dict[str, int], + seq_len_H1: int, + seq_len_C13: int, + *, + j_len: int = 6, + integral_offset: int = 1, + unk_token: str = "", + dtype: str = "float32", + num_cpus: int = 1, + ) -> None: + self.vocab_peakwidth = dict(vocabs["peakwidth"]) + self.vocab_split = dict(vocabs["split"]) + self.seq_len_H1 = int(seq_len_H1) + self.seq_len_C13 = int(seq_len_C13) + self.j_len = int(j_len) + self.integral_offset = int(integral_offset) + self.unk_token = unk_token + self.dtype = np.dtype(dtype) + self.num_cpus = int(num_cpus) + + if ( + self.unk_token not in self.vocab_peakwidth + or self.unk_token not in self.vocab_split + ): + raise ValueError( + f"Both vocabs must contain the unknown token '{self.unk_token}'." + ) + + @staticmethod + def _parse_integral(h_str: Union[str, int, float], offset: int) -> int: + # Accept "3H" or 3; treat NaN/None as 0 + if h_str is None: + val = 0 + elif isinstance(h_str, (int, float)): + val = int(h_str) + else: + s = str(h_str).upper().replace("H", "").strip() + try: + val = int(float(s)) + except Exception: + val = 0 + return max(0, val + offset) + + @staticmethod + def build_one( + nmrdata: Dict[str, Any], + vocab_peakwidth: Dict[str, int], + vocab_split: Dict[str, int], + seq_len_H1: int, + seq_len_C13: int, + j_len: int, + integral_offset: int, + unk_token: str, + dtype: np.dtype, + ) -> Dict[str, Any]: + # ----- 1H NMR ----- + Hnmr = nmrdata.get("1HNMR", []) or [] + num_h = len(Hnmr) + + # Allocate [seq_len_H1, 4 + j_len]: [δ, peakwidth_id, split_id, integral, + # J1..Jj_len] + H_arr = np.zeros((seq_len_H1, 4 + j_len), dtype=dtype) + + # Fill rows up to seq_len_H1 + limit_h = min(seq_len_H1, num_h) + for i in range(limit_h): + peak = Hnmr[i] + # Expected: [chem_shift (float), peakwidth_token (str), split_token (str), + # "nH", [J...]] + chem_shift = float(peak[0]) + peakwidth_tok = str(peak[1]) + split_tok = str(peak[2]) + integral_str = peak[3] + j_list = ( + peak[4] if len(peak) > 4 and isinstance(peak[4], (list, tuple)) else [] + ) + + peakwidth_id = vocab_peakwidth.get( + peakwidth_tok, vocab_peakwidth[unk_token] + ) + split_id = vocab_split.get(split_tok, vocab_split[unk_token]) + integral = BuildSpectrumNMR._parse_integral(integral_str, integral_offset) + + row = [chem_shift, float(peakwidth_id), float(split_id), float(integral)] + if len(j_list) >= j_len: + row += [float(x) for x in j_list[:j_len]] + else: + row += [float(x) for x in j_list] + [0.0] * (j_len - len(j_list)) + + H_arr[i, : len(row)] = np.asarray(row, dtype=dtype) + + # ----- 13C NMR ----- + Cnmr = nmrdata.get("13CNMR", []) or [] + num_c = len(Cnmr) + C_arr = np.zeros((seq_len_C13,), dtype=dtype) + if num_c > 0: + C_vals = np.asarray([float(x) for x in Cnmr[:seq_len_C13]], dtype=dtype) + C_arr[: len(C_vals)] = C_vals + + return { + "H_nmr": H_arr, # [seq_len_H1, 4 + j_len] float32 + "num_H_peak": int(num_h), + "C_nmr": C_arr, # [seq_len_C13] float32 + "num_C_peak": int(num_c), + } + + def __call__( + self, nmr_list: Union[Sequence[Dict[str, Any]], Dict[str, Any]] + ) -> Union[List[Dict[str, Any]], Dict[str, Any]]: + """Vectorized/batched conversion with p_tqdm.p_map (or single sample).""" + if isinstance(nmr_list, (list, tuple)): + if len(nmr_list) == 0: + return [] + return p_map( + BuildSpectrumNMR.build_one, + nmr_list, + [self.vocab_peakwidth] * len(nmr_list), + [self.vocab_split] * len(nmr_list), + [self.seq_len_H1] * len(nmr_list), + [self.seq_len_C13] * len(nmr_list), + [self.j_len] * len(nmr_list), + [self.integral_offset] * len(nmr_list), + [self.unk_token] * len(nmr_list), + [self.dtype] * len(nmr_list), + num_cpus=self.num_cpus, + desc="Building spectrums", + dynamic_ncols=True, + mininterval=0.2, + ) + # single sample + return BuildSpectrumNMR.build_one( + nmr_list, + self.vocab_peakwidth, + self.vocab_split, + self.seq_len_H1, + self.seq_len_C13, + self.j_len, + self.integral_offset, + self.unk_token, + self.dtype, + ) + + +def _locate_class(class_name: str): + """Resolve 'pkg.mod.Class' or a bare class name in the current globals().""" + if "." in class_name: + mod, cls = class_name.rsplit(".", 1) + return getattr(importlib.import_module(mod), cls) + return globals()[class_name] diff --git a/ppmat/datasets/build_structure.py b/ppmat/datasets/build_structure.py new file mode 100644 index 00000000..226749c9 --- /dev/null +++ b/ppmat/datasets/build_structure.py @@ -0,0 +1,143 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from typing import Literal +from typing import Optional + +import numpy as np +from jarvis.core.atoms import Atoms as jAtoms +from p_tqdm import p_map +from pymatgen.core.lattice import Lattice +from pymatgen.core.structure import Structure +from pymatgen.io.ase import AseAtomsAdaptor +from pymatgen.io.cif import CifParser + +from ppmat.utils.crystal import lattices_to_params_shape_numpy + + +class BuildStructure: + """Build crystal structure from different formats, including cif string, array, + cif file, and dict. + + Args: + format (Literal["cif_str", "array", "cif_file", "dict"]): The format of the + crystal data. + - "cif_str": Crystal data in CIF format as a string. + - "array": Crystal data in array format. + - "cif_file": Crystal data in CIF file path. + - "dict": Crystal data in dictionary format. + primitive (bool, optional): Whether to return the primitive or conventional + unit cell. Defaults to False. + niggli (bool, optional): Whether to reduce the lattice using Niggli's + algorithm. Defaults to True. + canocial (bool, optional): Whether to constrcut a canonical Structure. Defaults + to True. + num_cpus (Optional[int], optional): Number of CPUs to use for parallel + processing. Defaults to None. + """ + + def __init__( + self, + format: Literal[ + "cif_str", "array", "cif_file", "dict", "cif_str_by_CifParser", "jarvis" + ], + primitive: bool = False, + niggli: bool = True, + canocial: bool = True, + num_cpus: Optional[int] = None, + ): + + self.format = format + self.niggli = niggli + self.primitive = primitive + self.canocial = canocial + self.num_cpus = num_cpus if num_cpus is not None else 1 + + @staticmethod + def build_one(crystal_data, format, primitive=False, niggli=True, canocial=True): + if format == "cif_str": + crystal = Structure.from_str(crystal_data, fmt="cif") + elif format == "array": + + frac_coords = crystal_data["frac_coords"] + atom_types = crystal_data["atom_types"] + + if "lengths" in crystal_data and "angles" in crystal_data: + lengths = crystal_data["lengths"] + angles = crystal_data["angles"] + else: + lattice = crystal_data["lattice"] + if isinstance(lattice, list): + lattice = np.asarray(lattice) + lengths, angles = lattices_to_params_shape_numpy(lattice) + + if isinstance(lengths, np.ndarray): + lengths = lengths.tolist() + if isinstance(angles, np.ndarray): + angles = angles.tolist() + + crystal = Structure( + lattice=Lattice.from_parameters(*(lengths + angles)), + species=atom_types, + coords=frac_coords, + coords_are_cartesian=False, + ) + elif format == "cif_file": + crystal = Structure.from_file(crystal_data) + elif format == "dict": + crystal = Structure.from_dict(crystal_data) + elif format == "cif_str_by_CifParser": + crystal = CifParser.from_str(crystal_data).parse_structures( + primitive=True, on_error="ignore" + )[0] + elif format == "jarvis": + crystal = jAtoms.from_dict(crystal_data).pymatgen_converter() + elif format == "ase_atoms": + crystal = AseAtomsAdaptor.get_structure(crystal_data) + else: + raise ValueError(f"Invalid format specified: {format}") + + if primitive: + crystal = crystal.get_primitive_structure() + if niggli: + crystal = crystal.get_reduced_structure() + if canocial: + crystal = Structure( + lattice=Lattice.from_parameters(*crystal.lattice.parameters), + species=crystal.species, + coords=crystal.frac_coords, + coords_are_cartesian=False, + ) + return crystal + + def __call__(self, crystals_data): + if isinstance(crystals_data, list): + canonical_crystal = p_map( + BuildStructure.build_one, + crystals_data, + [self.format] * len(crystals_data), + [self.primitive] * len(crystals_data), + [self.niggli] * len(crystals_data), + [self.canocial] * len(crystals_data), + num_cpus=self.num_cpus, + ) + return canonical_crystal + else: + return BuildStructure.build_one( + crystals_data, + self.format, + self.primitive, + self.niggli, + self.canocial, + num_cpus=self.num_cpus, + ) diff --git a/ppmat/datasets/collate_fn.py b/ppmat/datasets/collate_fn.py new file mode 100644 index 00000000..9073af4c --- /dev/null +++ b/ppmat/datasets/collate_fn.py @@ -0,0 +1,304 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import annotations + +import numbers +from collections.abc import Mapping +from collections.abc import Sequence +from typing import Any +from typing import List + +import numpy as np +import paddle +import pgl +import warnings + +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.datasets.custom_data_type import ConcatNumpyWarper +from ppmat.datasets.geometric_data_type.batch import Batch +from ppmat.datasets.geometric_data_type.data import Data + + +class DefaultCollator(object): + def __call__(self, batch: List[Any]) -> Any: + """Default_collate_fn for paddle dataloader. + + NOTE: This `default_collate_fn` is different from official `default_collate_fn` + which specially adapt case where sample is `None` and `pgl.Graph`. + + ref: https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/io/dataloader/collate.py#L25 + + Args: + batch (List[Any]): Batch of samples to be collated. + + Returns: + Any: Collated batch data. + """ + sample = batch[0] + if sample is None: + return None + elif isinstance(sample, ConcatNumpyWarper): + batch = np.concatenate(batch, axis=0) + return batch + elif isinstance(sample, np.ndarray): + batch = np.stack(batch, axis=0) + return batch + elif isinstance(sample, (paddle.Tensor, paddle.framework.core.eager.Tensor)): + return paddle.stack(batch, axis=0) + elif isinstance(sample, numbers.Number): + batch = np.array(batch) + return batch + elif isinstance(sample, Data): + # Geometric `Data` objects: batch them into a single `Batch` + return Batch.from_data_list(batch) + elif isinstance(sample, (str, bytes)): + return batch + elif isinstance(sample, Mapping): + return {key: self([d[key] for d in batch]) for key in sample} + elif isinstance(sample, Sequence): + sample_fields_num = len(sample) + if not all(len(sample) == sample_fields_num for sample in iter(batch)): + raise RuntimeError("Fields number not same among samples in a batch") + return [self(fields) for fields in zip(*batch)] + elif str(type(sample)) == "": + # use str(type()) instead of isinstance() in case of pgl is not installed. + graphs = pgl.Graph.batch(batch) + # NOTE: when num_works >1, graphs.tensor() will convert numpy.ndarray to + # CPU Tensor, which will cause error in model training. + # graphs.tensor() + return graphs + elif isinstance(sample, ConcatData): + return ConcatData.batch(batch) + raise TypeError( + "batch data can only contains: paddle.Tensor, numpy.ndarray, " + f"dict, list, number, None, pgl.Graph, but got {type(sample)}" + ) + + +class DensityCollator: + def __init__( + self, + n_samples=None, + padding_value=-1.0, + sampling_mode: str = "uniform", # "uniform" or "random" + uniform_random_offset: bool = False, + sampling_seed: int | None = None, + clip_max: float | None = None, + importance_sampling: bool = False, + importance_threshold: float = 1e-5, + importance_ratio: float = 0.8, + extreme_threshold: float | None = None, + extreme_ratio: float = 0.05, + ): + self.n_samples = n_samples + self.padding_value = padding_value + self.sampling_mode = sampling_mode.lower() + self.uniform_random_offset = bool(uniform_random_offset) + self.sampling_seed = sampling_seed + self._rng = np.random.default_rng(sampling_seed) if sampling_seed is not None else None + self.clip_max = clip_max + self.importance_sampling = bool(importance_sampling) + self.importance_threshold = importance_threshold + self.importance_ratio = float(importance_ratio) + self.extreme_threshold = extreme_threshold + self.extreme_ratio = float(extreme_ratio) + self._warned_length_mismatch = False + + def __call__(self, batch): + g, densities, grid_coord, infos = zip(*batch) + g = Batch.from_data_list(g) + infos = list(infos) + if self.n_samples is None: + densities = pad_sequence( + densities, batch_first=True, padding_value=self.padding_value + ) + grid_coord = pad_sequence(grid_coord, batch_first=True, padding_value=0.0) + mask = (densities != self.padding_value).astype("float32") + else: + sampled_density, sampled_grid, mask = [], [], [] + target_samples = int(self.n_samples) + for d, coord in zip(densities, grid_coord): + total_d = int(d.shape[0]) + total_coord = int(coord.shape[0]) + total = min(total_d, total_coord) + if total_d != total_coord and not self._warned_length_mismatch: + warnings.warn( + f"Density length ({total_d}) and grid length " + f"({total_coord}) differ; truncating to {total}." + ) + self._warned_length_mismatch = True + if total == 0: + raise ValueError("Empty density/grid pair encountered in batch.") + if self.importance_sampling: + total_idx = np.arange(total) + dense_vals = np.abs(d.numpy().reshape(-1)) + threshold = float(self.importance_threshold) + high_mask = dense_vals >= threshold + high_idx = total_idx[high_mask] + + extreme_idx = np.array([], dtype=int) + if self.extreme_threshold is not None: + extreme_mask = dense_vals >= self.extreme_threshold + extreme_idx = total_idx[extreme_mask] + # ensure extreme is subset of high + extreme_idx = np.intersect1d(extreme_idx, high_idx, assume_unique=True) + mid_idx = np.setdiff1d(high_idx, extreme_idx, assume_unique=True) + + high_quota = min(target_samples, max(0, int(target_samples * self.importance_ratio))) + extreme_quota = min(target_samples, max(0, int(target_samples * self.extreme_ratio))) + + extreme_take = min(len(extreme_idx), extreme_quota) + indices_extreme = ( + np.random.choice(extreme_idx, extreme_take, replace=False) + if extreme_take > 0 + else np.array([], dtype=int) + ) + + remaining_high = high_quota - len(indices_extreme) + mid_take = min(len(mid_idx), remaining_high) + indices_mid = ( + np.random.choice(mid_idx, mid_take, replace=False) + if mid_take > 0 + else np.array([], dtype=int) + ) + + selected = np.concatenate([indices_extreme, indices_mid]) + remaining = target_samples - len(selected) + if remaining > 0: + low_candidates = np.setdiff1d(total_idx, selected, assume_unique=False) + if len(low_candidates) == 0: + low_candidates = total_idx + replace_low = remaining > len(low_candidates) + indices_low = np.random.choice(low_candidates, remaining, replace=replace_low) + indices = np.concatenate([selected, indices_low]) + else: + indices = selected + else: + if self.sampling_mode == "uniform": + if self.uniform_random_offset: + if self._rng is None: + self._rng = np.random.default_rng() + step = (total - 1) / max(target_samples - 1, 1) + offset = float(self._rng.uniform(0, max(step, 1.0))) if step > 0 else 0.0 + idx = offset + step * np.arange(target_samples) + indices = np.clip(np.round(idx).astype(int), 0, total - 1) + else: + indices = np.linspace(0, total - 1, num=target_samples, dtype=int) + elif self.sampling_mode == "random": + replace = target_samples > total + indices = np.random.choice(total, target_samples, replace=replace) + else: + raise ValueError( + f"Unsupported sampling_mode '{self.sampling_mode}'. " + "Use 'uniform' or 'random'." + ) + indices.sort() + sampled_density.append(d[indices]) + sampled_grid.append(coord[indices]) + mask.append( + paddle.ones_like(x=sampled_density[-1], dtype="float32") + ) + densities = paddle.stack(x=sampled_density, axis=0) + grid_coord = paddle.stack(x=sampled_grid, axis=0) + mask = paddle.stack(x=mask, axis=0) + + densities = densities * mask + if self.clip_max is not None: + densities = paddle.clip(densities, min=self.padding_value, max=self.clip_max) + return { + "density": densities, + "density_mask": mask, + "grid_coord": grid_coord, + "graph": g, + "infos": infos, + } + + +class DensityVoxelCollator: + def __init__(self, padding_value=-1.0): + self.padding_value = padding_value + + def __call__(self, batch): + g, densities, grid_coord, infos = zip(*batch) + g = Batch.from_data_list(g) + shapes = [info["shape"] for info in infos] + max_shape = np.array(shapes).max(0) + padded_density, padded_grid = [], [] + for den, grid, shape in zip(densities, grid_coord, shapes): + padded_density.append( + paddle.nn.functional.pad( + x=den.view(*shape), + pad=( + 0, + max_shape[2] - shape[2], + 0, + max_shape[1] - shape[1], + 0, + max_shape[0] - shape[0], + ), + value=-1, + pad_from_left_axis=False, + ) + ) + padded_grid.append( + paddle.nn.functional.pad( + x=grid.view(*shape, 3), + pad=( + 0, + 0, + 0, + max_shape[2] - shape[2], + 0, + max_shape[1] - shape[1], + 0, + max_shape[0] - shape[0], + ), + value=0.0, + pad_from_left_axis=False, + ) + ) + densities = paddle.stack(x=padded_density, axis=0) + grid_coord = paddle.stack(x=padded_grid, axis=0) + mask = (densities != self.padding_value).astype("float32") + densities = densities * mask + return { + "density": densities, + "density_mask": mask, + "grid_coord": grid_coord, + "graph": g, + "infos": list(infos), + } + +# utils DensityCollator +def pad_sequence(sequences, batch_first=False, padding_value=0): + max_len = max([int(s.shape[0]) for s in sequences]) # 确保转换为Python整数 + trailing_dims = tuple(sequences[0].shape[1:]) + + if batch_first: + out_dims = (len(sequences), max_len) + trailing_dims + else: + out_dims = (max_len, len(sequences)) + trailing_dims + + out_tensor = paddle.full(out_dims, padding_value, dtype=sequences[0].dtype) + + for i, tensor in enumerate(sequences): + length = tensor.shape[0] + if batch_first: + out_tensor[i, :length, ...] = tensor + else: + out_tensor[:length, i, ...] = tensor + + return out_tensor diff --git a/ppmat/datasets/custom_data_type.py b/ppmat/datasets/custom_data_type.py new file mode 100644 index 00000000..57213913 --- /dev/null +++ b/ppmat/datasets/custom_data_type.py @@ -0,0 +1,47 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np + + +class ConcatData(object): + """This class is used to concatenate numpy data when grouping batches + + Args: + data (np.ndarray): Data to be concatenated with other data. + """ + + def __init__(self, data: np.ndarray) -> None: + + self.data = data + + @staticmethod + def batch(data_list): + data_list = [data.data for data in data_list] + data = np.concatenate(data_list, axis=0) + return data + + def __str__(self): + return str(self.__dict__) + + def __repr__(self): + return str(self.__dict__) + + +class ConcatNumpyWarper(np.ndarray): + """This class is used to wrap numpy data when grouping batches.""" + + def __new__(cls, input_array, *args, **kwargs): + obj = np.asarray(input_array).view(cls) + return obj diff --git a/ppmat/datasets/density_dataset.py b/ppmat/datasets/density_dataset.py new file mode 100644 index 00000000..eb1bb4c2 --- /dev/null +++ b/ppmat/datasets/density_dataset.py @@ -0,0 +1,637 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import json +import os +import os.path as osp +import pickle +import time +import math + +import numpy as np +import paddle +import paddle.distributed as dist + +from ppmat.models.common.e3nn import o3 +from ppmat.utils.paddle_aux import dim2perm +from ppmat.utils.misc import is_equal +from ppmat.utils import download +from ppmat.utils import logger + +from ppmat.datasets.geometric_data_type.data import Data + + +Bohr = 0.529177 + + +class DensityDataset(paddle.io.Dataset): + """Density Dataset Handler + + Overview + -------- + Generic volumetric electron-density reader with optional auto-download and + cache. Supports CHGCAR / cube / json files (optionally compressed) with + element metadata from ``atom_file``. Caching mirrors the mp20 dataset + pattern: parsed samples are serialized for fast reuse and validated against + config to avoid stale artifacts. + + Dataset layout + -------------- + ``root/`` is expected to contain raw density files; ``split_file`` lists + filenames for each split. Atom dictionary is provided via ``atom_file``. + Compression is handled transparently based on the filename suffix. + + Auto-download + ------------- + If ``root`` is missing and ``url`` is given (``auto_download=True``), the + archive is fetched using :func:`ppmat.utils.download.get_datasets_path_from_url` + (optional ``md5`` checksum). + + Caching + ------- + Enable via ``enable_cache=True``. Samples are pickled under + ``cache_path`` (default ``_cache/``) with a saved config. Set + ``overwrite=True`` to rebuild or ``max_cache_samples`` to limit cached + entries. + + Attributes for registry parity with other handlers + -------------------------------------------------- + - name (str): optional dataset name for downstream reference + - url (str): download URL if provided + - md5 (str): md5 for download verification if provided + + Common ES datasets (paths/URLs) + -------------------------------- + - QM9_ES: root ``dataset_ES/data_qm9``; data + ``https://paddle-org.bj.bcebos.com/paddlematerials/datasets/QM9_ES/qm9_es.tar``; + atom dict ``https://paddle-org.bj.bcebos.com/paddlematerials/datasets/QM9_ES/qm9.json``; + split file ``https://paddle-org.bj.bcebos.com/paddlematerials/datasets/QM9_ES/qm9_data_split.json``. + - MP_ES (cubic): root ``dataset_ES/data_cubic``; data + ``https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/mp_es.tar``; + atom dict ``https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal.json``; + split file ``https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MP_ES/crystal_data_split.json``. + """ + + # Optional registry fields; can be overridden per config or subclass + name: str | None = None + url: str | None = None + md5: str | None = None + def __init__( + self, + root, + split, + split_file, + atom_file, + extension="CHGCAR", + compression="lz4", + rotate=False, + pbc=False, + url=None, + md5=None, + auto_download=True, + enable_cache=False, + cache_path=None, + overwrite=False, + max_cache_samples=None, + ): + """ + The density dataset contains volumetric data of molecules. + :param root: data root + :param split: data split, can be 'train', 'validation', 'test' + :param split_file: the data split file containing file names of the split + :param atom_file: atom information file + :param extension: raw data file extension, can be 'CHGCAR', 'cube', 'json' + :param compression: raw data compression, can be 'lz4', 'xz', or None (no compression) + :param rotate: whether to rotate the molecule and the volumetric data + :param pbc: whether the data satisfy the periodic boundary condition + :param url: optional remote url for auto-download when root is missing + :param md5: optional md5 for downloaded archive + :param auto_download: download dataset automatically if root does not exist + :param enable_cache: if True, read/save parsed samples to cache as pickle + :param cache_path: cache directory; defaults to "_cache/" + :param overwrite: force rebuilding cache even if it exists + :param max_cache_samples: limit number of samples to cache (None means all) + """ + super(DensityDataset, self).__init__() + # Prefer explicit url/md5 from arguments; fall back to class attributes. + dl_url = url if url is not None else self.url + dl_md5 = md5 if md5 is not None else self.md5 + self.root = self._maybe_download_root(root, dl_url, dl_md5, auto_download) + self.split = split + self.extension = extension + self.compression = compression + self.rotate = rotate + self.pbc = pbc + self.enable_cache = enable_cache + self.overwrite = overwrite + self.max_cache_samples = max_cache_samples + # Cache root, by default _cache/ + self.cache_path = ( + cache_path + if cache_path is not None + else osp.join(f"{self.root}_cache", split) + ) + self.file_pattern = f".{extension}" + if compression is not None: + self.file_pattern += f".{compression}" + with open(os.path.join(self.root, split_file)) as f: + self.file_list = list(reversed(json.load(f)[split])) + with open(atom_file) as f: + atom_info = json.load(f) + atom_list = [info["name"] for info in atom_info] + self.atom_name2idx = {name: idx for idx, name in enumerate(atom_list)} + self.atom_name2idx.update( + {name.encode(): idx for idx, name in enumerate(atom_list)} + ) + self.atom_num2idx = { + info["atom_num"]: idx for idx, info in enumerate(atom_info) + } + self.idx2atom_num = { + idx: info["atom_num"] for idx, info in enumerate(atom_info) + } + if extension == "CHGCAR": + self.read_func = self.read_chgcar + elif extension == "cube": + self.read_func = self.read_cube + elif extension == "json": + self.read_func = self.read_json + else: + raise TypeError(f"Unknown extension {extension}") + if compression == "lz4": + import lz4.frame + + self.open = lz4.frame.open + elif compression == "xz": + import lzma + + self.open = lzma.open + else: + self.open = open + + self._prepare_cache() + + def _maybe_download_root(self, root, url, md5, auto_download): + if osp.exists(root): + return root + if not auto_download or url is None: + logger.warning( + f"Dataset root {root} not found and auto_download disabled or url missing." + ) + return root + logger.message(f"Dataset root {root} not found. Downloading from {url}.") + downloaded_root = download.get_datasets_path_from_url(url, md5) + logger.message(f"Downloaded dataset to {downloaded_root}") + return downloaded_root + + def _prepare_cache(self): + self.cache_samples = [] + if not self.enable_cache: + return + + sample_dir = osp.join(self.cache_path, "samples") + cache_cfg_path = osp.join(self.cache_path, "dataset_cfg.pkl") + cache_exists = osp.exists(sample_dir) + expected_cfg = { + "root": self.root, + "split": self.split, + "extension": self.extension, + "compression": self.compression, + "pbc": self.pbc, + "rotate": self.rotate, + "file_pattern": self.file_pattern, + } + + # If cache exists and no overwrite request, ensure configuration matches. + if cache_exists and not self.overwrite: + try: + cached_cfg = self._load_from_cache(cache_cfg_path) + if not is_equal(cached_cfg, expected_cfg): + logger.warning( + "Cache configuration differs from current settings, will rebuild." + ) + self.overwrite = True + except Exception as e: + logger.warning(e) + logger.warning("Failed to read cached config, will rebuild.") + self.overwrite = True + + # Rebuild cache when missing or outdated. + if self.overwrite or not cache_exists: + self._build_cache(sample_dir, cache_cfg_path, expected_cfg) + + if dist.is_initialized(): + dist.barrier() + + if osp.exists(sample_dir): + self.cache_samples = sorted( + [ + osp.join(sample_dir, f) + for f in os.listdir(sample_dir) + if f.endswith(".pkl") + ] + ) + else: + self.cache_samples = [] + + def _build_cache(self, sample_dir, cache_cfg_path, expected_cfg): + rank = dist.get_rank() if dist.is_initialized() else 0 + if rank != 0: + return + + os.makedirs(sample_dir, exist_ok=True) + self._save_to_cache(cache_cfg_path, expected_cfg) + + # Cap number of cached samples (default: cache all). + num_to_cache = ( + len(self.file_list) + if self.max_cache_samples is None + else min(len(self.file_list), int(self.max_cache_samples)) + ) + logger.message( + f"Caching {num_to_cache}/{len(self.file_list)} samples to {sample_dir}" + ) + for idx in range(num_to_cache): + file_name = self._resolve_file_name(idx) + try: + g, density, grid_coord, info = self._read_sample(file_name) + except Exception as e: + logger.warning(f"Failed to cache {file_name}: {e}") + continue + payload = self._serialize_sample(g, density, grid_coord, info) + self._save_to_cache(osp.join(sample_dir, f"{idx:010d}.pkl"), payload) + logger.info(f"Finished caching samples to {sample_dir}") + + def _serialize_sample(self, g, density, grid_coord, info): + """将一次读取的结果打包为可pickle的轻量对象。""" + payload = { + "atom_type": np.asarray(g.x), + "atom_coord": np.asarray(g.pos), + "density": np.asarray(density), + "grid_coord": np.asarray(grid_coord), + "info": dict(info) if isinstance(info, dict) else info, + } + if isinstance(payload["info"], dict) and "cell" in payload["info"]: + try: + payload["info"]["cell"] = np.asarray(payload["info"]["cell"]) + except Exception: + pass + return payload + + def _deserialize_sample(self, payload): + """从缓存还原张量与 Data 对象。""" + atom_type = paddle.to_tensor(payload["atom_type"], dtype="int64") + atom_coord = paddle.to_tensor(payload["atom_coord"], dtype="float32") + density = paddle.to_tensor(payload["density"], dtype="float32") + grid_coord = paddle.to_tensor(payload["grid_coord"], dtype="float32") + info = payload.get("info", {}) + if isinstance(info, dict) and "cell" in info: + info["cell"] = paddle.to_tensor(info["cell"], dtype="float32") + g = Data(x=atom_type, pos=atom_coord) + return g, density, grid_coord, info + + def _save_to_cache(self, cache_path: str, data): + os.makedirs(osp.dirname(cache_path), exist_ok=True) + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def _load_from_cache(self, cache_path: str): + if not osp.exists(cache_path): + raise FileNotFoundError(f"No such file or directory: {cache_path}") + with open(cache_path, "rb") as f: + return pickle.load(f) + + def _resolve_file_name(self, item): + if self.compression == "lz4": + return f"{(self.file_list[item]+1):06}{self.file_pattern}" + return f"{(self.file_list[item])}{self.file_pattern}" + + def _read_sample(self, file_name): + with self.open(os.path.join(self.root, file_name)) as f: + g, density, grid_coord, info = self.read_func(f) + info["file_name"] = file_name + return g, density, grid_coord, info + + def __getitem__(self, item): + file_name = self._resolve_file_name(item) + + # 优先从缓存读取,缓存缺失/异常时回退到原始文件 + if self.enable_cache and self.cache_samples and item < len(self.cache_samples): + try: + payload = self._load_from_cache(self.cache_samples[item]) + g, density, grid_coord, info = self._deserialize_sample(payload) + except Exception as e: + logger.warning(f"Failed to load cache for {file_name}: {e}") + g, density, grid_coord, info = self._read_sample(file_name) + else: + g, density, grid_coord, info = self._read_sample(file_name) + + info["file_name"] = file_name + if self.rotate: + rot = o3.rand_matrix() + center = info["cell"].sum(axis=0) / 2 + g.pos = (g.pos - center) @ rot.t() + center + rotated_grid = (grid_coord - center) @ rot + center + density = rotate_voxel(info["shape"], info["cell"], density, rotated_grid) + info["rot"] = rot + return g, density, grid_coord, info + + def __len__(self): + return len(self.file_list) + + def read_cube(self, fileobj): + """Read atoms and data from CUBE file.""" + if self.pbc: + raise NotImplementedError("PBC not implemented for cube files") + readline = fileobj.readline + readline() + readline() + line = readline().split() + n_atom = int(line[0]) + origin = paddle.to_tensor(data=[float(x) for x in line[1:]], dtype="float32") + shape = [] + cell = paddle.empty(shape=[3, 3], dtype="float32") + for i in range(3): + n, x, y, z = [float(s) for s in readline().split()] + shape.append(int(n)) + cell[i] = paddle.to_tensor(data=[x, y, z], dtype="float32") + x_coord = paddle.multiply(paddle.arange(end=shape[0], dtype="float32").unsqueeze(axis=-1), cell[0]) + y_coord = paddle.multiply(paddle.arange(end=shape[1], dtype="float32").unsqueeze(axis=-1), cell[1]) + z_coord = paddle.multiply(paddle.arange(end=shape[2], dtype="float32").unsqueeze(axis=-1), cell[2]) + grid_coord = ( + x_coord.view(-1, 1, 1, 3) + + y_coord.view(1, -1, 1, 3) + + z_coord.view(1, 1, -1, 3) + ) + # In the CUBE format the origin marks the starting voxel; add it to the + # axis-aligned coordinates so grid points align with atom positions. + grid_coord = grid_coord.view(-1, 3) + origin + atom_type = paddle.empty(shape=paddle.to_tensor(n_atom), dtype="int64") + atom_coord = paddle.empty(shape=[n_atom, 3], dtype="float32") + for i in range(n_atom): + line = readline().split() + atom_type[i] = self.atom_num2idx[int(line[0])] + atom_coord[i] = paddle.to_tensor( + data=[float(s) for s in line[2:]], dtype="float32" + ) + g = Data(x=atom_type, pos=atom_coord) + density = paddle.to_tensor( + data=[float(s) for s in fileobj.read().split()], dtype="float32" + ) + return g, density, grid_coord, {"shape": shape, "cell": cell, "origin": origin} + + def read_chgcar(self, fileobj): + """Read atoms and data from CHGCAR file.""" + readline = fileobj.readline + readline() + scale = float(readline()) + cell = paddle.empty(shape=[3, 3], dtype="float32") + for i in range(3): + cell[i] = paddle.to_tensor( + data=[float(s) for s in readline().split()], dtype="float32" + ) + cell = cell * scale + elements = readline().split() + n_atoms = [int(s) for s in readline().split()] + readline() + tot_atoms = sum(n_atoms) + atom_type = paddle.empty(shape=[tot_atoms], dtype="int64") + atom_coord = paddle.empty(shape=[tot_atoms, 3], dtype="float32") + idx = 0 + for elem, n in zip(elements, n_atoms): + atom_type[idx : idx + n] = self.atom_name2idx[elem] + for _ in range(n): + atom_coord[idx] = paddle.to_tensor( + data=[float(s) for s in readline().split()], dtype="float32" + ) + idx += 1 + if self.pbc: + atom_type, atom_coord = pbc_expand(atom_type, atom_coord) + atom_coord = atom_coord @ cell + g = Data(x=atom_type, pos=atom_coord) + readline() + shape = [int(s) for s in readline().split()] + n_grid = shape[0] * shape[1] * shape[2] + x_coord = ( + paddle.linspace(start=0, stop=shape[0] - 1, num=shape[0]).unsqueeze(axis=-1) + / shape[0] + * cell[0] + ) + y_coord = ( + paddle.linspace(start=0, stop=shape[1] - 1, num=shape[1]).unsqueeze(axis=-1) + / shape[1] + * cell[1] + ) + z_coord = ( + paddle.linspace(start=0, stop=shape[2] - 1, num=shape[2]).unsqueeze(axis=-1) + / shape[2] + * cell[2] + ) + grid_coord = ( + x_coord.view(-1, 1, 1, 3) + + y_coord.view(1, -1, 1, 3) + + z_coord.view(1, 1, -1, 3) + ) + grid_coord = grid_coord.view(-1, 3) + arr = _read_density_stream(fileobj, n_grid) + density = paddle.to_tensor(arr, dtype="float32") + + volume = paddle.linalg.det(x=cell).abs() + density = density / volume + density = ( + density.view(shape[2], shape[1], shape[0]) + .transpose( + perm=dim2perm(density.view(shape[2], shape[1], shape[0]).ndim, 0, 2) + ) + .contiguous() + .view(-1) + ) + return g, density, grid_coord, {"shape": shape, "cell": cell} + + def read_json(self, fileobj): + """Read atoms and data from JSON file.""" + + def read_2d_tensor(s): + return paddle.to_tensor( + data=[[float(x) for x in line] for line in s], dtype="float32" + ) + + data = json.load(fileobj) + scale = float(data["vector"][0][0]) + cell = read_2d_tensor(data["lattice"][0]) * scale + elements = data["elements"][0] + n_atoms = [int(s) for s in data["elements_number"][0]] + tot_atoms = sum(n_atoms) + atom_coord = read_2d_tensor(data["coordinates"][0]) + atom_type = paddle.empty(shape=[tot_atoms], dtype="int64") + idx = 0 + for elem, n in zip(elements, n_atoms): + atom_type[idx : idx + n] = self.atom_name2idx[elem] + idx += n + if self.pbc: + atom_type, atom_coord = pbc_expand(atom_type, atom_coord) + atom_coord = atom_coord @ cell + g = Data(x=atom_type, pos=atom_coord) + shape = [int(s) for s in data["FFTgrid"][0]] + x_coord = ( + paddle.linspace(start=0, stop=shape[0] - 1, num=shape[0]).unsqueeze(axis=-1) + / shape[0] + * cell[0] + ) + y_coord = ( + paddle.linspace(start=0, stop=shape[1] - 1, num=shape[1]).unsqueeze(axis=-1) + / shape[1] + * cell[1] + ) + z_coord = ( + paddle.linspace(start=0, stop=shape[2] - 1, num=shape[2]).unsqueeze(axis=-1) + / shape[2] + * cell[2] + ) + grid_coord = ( + x_coord.view(-1, 1, 1, 3) + + y_coord.view(1, -1, 1, 3) + + z_coord.view(1, 1, -1, 3) + ) + grid_coord = grid_coord.view(-1, 3) + n_grid = shape[0] * shape[1] * shape[2] + n_line = (n_grid + 9) // 10 + density = paddle.to_tensor( + data=[ + (float(s) if not s.startswith("*") else 0.0) + for line in data["chargedensity"][0][:n_line] + for s in line + ], + dtype="float32", + ).view(-1)[:n_grid] + volume = paddle.linalg.det(x=cell).abs() + density = density / volume + density = ( + density.view(shape[2], shape[1], shape[0]) + .transpose( + perm=dim2perm(density.view(shape[2], shape[1], shape[0]).ndim, 0, 2) + ) + .contiguous() + .view(-1) + ) + return g, density, grid_coord, {"shape": shape, "cell": cell} + + def write_cube(self, fileobj, atom_type, atom_coord, density, info): + """Write a cube file.""" + fileobj.write("Cube file written on " + time.strftime("%c")) + fileobj.write("\nOUTER LOOP: X, MIDDLE LOOP: Y, INNER LOOP: Z\n") + cell = info["cell"] + shape = info["shape"] + origin = info.get("origin", np.zeros(3)) + fileobj.write( + "{0:5}{1:12.6f}{2:12.6f}{3:12.6f}\n".format(len(atom_type), *origin) + ) + for s, c in zip(shape, cell): + d = c / s + fileobj.write("{0:5}{1:12.6f}{2:12.6f}{3:12.6f}\n".format(s, *d)) + for Z, (x, y, z) in zip(atom_type, atom_coord): + Z = self.idx2atom_num[Z] + fileobj.write( + "{0:5}{1:12.6f}{2:12.6f}{3:12.6f}{4:12.6f}\n".format(Z, Z, x, y, z) + ) + density.tofile(fileobj, sep="\n", format="%e") + + +def pbc_expand(atom_type, atom_coord): + """ + Expand the atoms by periodic boundary condition to eight directions in the neighboring cells. + :param atom_type: atom types, tensor of shape (n_atom,) + :param atom_coord: atom coordinates, tensor of shape (n_atom, 3) + :return: expanded atom types and coordinates + """ + exp_type, exp_coord = [], [] + exp_direction = paddle.to_tensor( + data=[ + [0, 0, 0], + [1, 0, 0], + [0, 1, 0], + [0, 0, 1], + [0, 1, 1], + [1, 0, 1], + [1, 1, 0], + [1, 1, 1], + ], + dtype="float32", + ) + for a_type, a_coord in zip(atom_type, atom_coord): + for direction in exp_direction: + new_coord = a_coord + direction + if (new_coord <= 1).astype("bool").all(): + exp_type.append(a_type) + exp_coord.append(new_coord) + return paddle.to_tensor(data=exp_type, dtype="int64"), paddle.stack( + x=exp_coord, axis=0 + ) + + +def rotate_voxel(shape, cell, density, rotated_grid): + """ + Rotate the volumetric data using trilinear interpolation. + :param shape: voxel shape, tensor of shape (3,) + :param cell: cell vectors, tensor of shape (3, 3) + :param density: original density, tensor of shape (n_grid,) + :param rotated_grid: rotated grid coordinates, tensor of shape (n_grid, 3) + :return: rotated density, tensor of shape (n_grid,) + """ + density = density.view(1, 1, *shape) + rotated_grid = rotated_grid.view(1, *shape, 3) + shape = paddle.to_tensor(data=shape, dtype="float32") + grid_cell = cell / shape.view(3, 1) + normalized_grid = ( + 2 * rotated_grid @ paddle.linalg.inv(x=grid_cell) - shape + 1 + ) / (shape - 1) + return paddle.nn.functional.grid_sample( + x=density, + grid=paddle.flip(x=normalized_grid, axis=[-1]), + mode="bilinear", + align_corners=False, + ).view(-1) + + +def _read_density_stream(fileobj, n_grid: int, chunk_tokens: int = 1_000_000): + out = np.empty(n_grid, dtype=np.float32) + filled = 0 + buf = [] + + def _as_float(tok): + try: + return float(tok) + except Exception: + return math.nan # 非数字用 NaN 标记 + + for line in fileobj: + if filled >= n_grid: + break + parts = line.split() + if not parts: + continue + # 过滤出数字 + nums = [_as_float(t) for t in parts] + # 丢弃 NaN(非数字 token) + nums = [x for x in nums if not math.isnan(x)] + if not nums: + continue + + take = min(len(nums), n_grid - filled) + out[filled:filled+take] = np.array(nums[:take], dtype=np.float32) + filled += take + + if filled != n_grid: + raise ValueError(f"Expected {n_grid} density values, got {filled}") + return out diff --git a/ppmat/datasets/geometric_data_type/__init__.py b/ppmat/datasets/geometric_data_type/__init__.py new file mode 100644 index 00000000..a0dc9c65 --- /dev/null +++ b/ppmat/datasets/geometric_data_type/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/pyg-team/pytorch_geometric + +from .batch import Batch +from .data import Data +from .dataset import Dataset + +__all__ = ["Batch", "Data", "Dataset"] diff --git a/ppmat/datasets/geometric_data_type/batch.py b/ppmat/datasets/geometric_data_type/batch.py new file mode 100644 index 00000000..26a9d311 --- /dev/null +++ b/ppmat/datasets/geometric_data_type/batch.py @@ -0,0 +1,224 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/jediofgever/pytorch_geometric + +from collections.abc import Sequence +from typing import List + +import numpy as np +import paddle + +from ppmat.datasets.geometric_data_type.data import Data +from ppmat.datasets.geometric_data_type.dataset import IndexType +# from ppmat.utils.paddle_aux import * + +class Batch(Data): + """A plain old python object modeling a batch of graphs as one big + (disconnected) graph. With :class:`torch_geometric.data.Data` being the + base class, all its methods can also be used here. + In addition, single graphs can be reconstructed via the assignment vector + :obj:`batch`, which maps each node to its respective graph identifier. + """ + + def __init__(self, batch=None, ptr=None, **kwargs): + super(Batch, self).__init__(**kwargs) + for key, item in kwargs.items(): + if key == "num_nodes": + self.__num_nodes__ = item + else: + self[key] = item + self.batch = batch + self.ptr = ptr + self.__data_class__ = Data + self.__slices__ = None + self.__cumsum__ = None + self.__cat_dims__ = None + self.__num_nodes_list__ = None + self.__num_graphs__ = None + + @classmethod + def from_data_list(cls, data_list, follow_batch=[], exclude_keys=[]): + """Constructs a batch object from a python list holding + :class:`torch_geometric.data.Data` objects. + The assignment vector :obj:`batch` is created on the fly. + Additionally, creates assignment batch vectors for each key in + :obj:`follow_batch`. + Will exclude any keys given in :obj:`exclude_keys`.""" + keys = list(set(data_list[0].keys) - set(exclude_keys)) + assert "batch" not in keys and "ptr" not in keys + batch = cls() + for key in data_list[0].__dict__.keys(): + if key[:2] != "__" and key[-2:] != "__": + batch[key] = None + batch.__num_graphs__ = len(data_list) + batch.__data_class__ = data_list[0].__class__ + for key in keys + ["batch"]: + batch[key] = [] + batch["ptr"] = [0] + device = None + slices = {key: [0] for key in keys} + cumsum = {key: [0] for key in keys} + cat_dims = {} + num_nodes_list = [] + for i, data in enumerate(data_list): + for key in keys: + item = data[key] + cum = cumsum[key][-1] + if isinstance(item, paddle.Tensor) and item.dtype != "bool": + if not isinstance(cum, int) or cum != 0: + item = item + cum + elif isinstance(item, (int, float)): + item = item + cum + size = 1 + cat_dim = data.__cat_dim__(key, data[key]) + if isinstance(item, paddle.Tensor) and item.dim() == 0: + cat_dim = None + cat_dims[key] = cat_dim + if isinstance(item, paddle.Tensor) and cat_dim is None: + cat_dim = 0 + item = item.unsqueeze(axis=0) + device = item.place + elif isinstance(item, paddle.Tensor): + size = item.shape[cat_dim] + device = item.place + batch[key].append(item) + slices[key].append(size + slices[key][-1]) + inc = data.__inc__(key, item) + if isinstance(inc, (tuple, list)): + inc = paddle.to_tensor(data=inc) + cumsum[key].append(inc + cumsum[key][-1]) + if key in follow_batch: + if isinstance(size, paddle.Tensor): + for j, size in enumerate(size.tolist()): + tmp = f"{key}_{j}_batch" + batch[tmp] = [] if i == 0 else batch[tmp] + batch[tmp].append( + paddle.full(shape=(size,), fill_value=i, dtype="int64") + ) + else: + tmp = f"{key}_batch" + batch[tmp] = [] if i == 0 else batch[tmp] + batch[tmp].append( + paddle.full(shape=(size,), fill_value=i, dtype="int64") + ) + if hasattr(data, "__num_nodes__"): + num_nodes_list.append(data.__num_nodes__) + else: + num_nodes_list.append(None) + num_nodes = data.num_nodes + if num_nodes is not None: + item = paddle.full(shape=(num_nodes,), fill_value=i, dtype="int64") + batch.batch.append(item) + batch.ptr.append(batch.ptr[-1] + num_nodes) + batch.batch = None if len(batch.batch) == 0 else batch.batch + batch.ptr = None if len(batch.ptr) == 1 else batch.ptr + batch.__slices__ = slices + batch.__cumsum__ = cumsum + batch.__cat_dims__ = cat_dims + batch.__num_nodes_list__ = num_nodes_list + ref_data = data_list[0] + for key in batch.keys: + items = batch[key] + item = items[0] + cat_dim = ref_data.__cat_dim__(key, item) + cat_dim = 0 if cat_dim is None else cat_dim + if isinstance(item, paddle.Tensor): + batch[key] = paddle.concat(x=items, axis=cat_dim) + elif isinstance(item, (int, float)): + batch[key] = paddle.to_tensor(data=items) + return batch.contiguous() + + def get_example(self, idx: int) -> Data: + """Reconstructs the :class:`torch_geometric.data.Data` object at index + :obj:`idx` from the batch object. + The batch object must have been created via :meth:`from_data_list` in + order to be able to reconstruct the initial objects.""" + if self.__slices__ is None: + raise RuntimeError( + "Cannot reconstruct data list from batch because the batch object was not created using `Batch.from_data_list()`." + ) + data = self.__data_class__() + idx = self.num_graphs + idx if idx < 0 else idx + for key in self.__slices__.keys(): + item = self[key] + if self.__cat_dims__[key] is None: + item = item[idx] + elif isinstance(item, paddle.Tensor): + dim = self.__cat_dims__[key] + start = self.__slices__[key][idx] + end = self.__slices__[key][idx + 1] + start_0 = item.shape[dim] + start if start < 0 else start + item = paddle.slice(item, [dim], [start_0], [start_0 + (end - start)]) + else: + start = self.__slices__[key][idx] + end = self.__slices__[key][idx + 1] + item = item[start:end] + item = item[0] if len(item) == 1 else item + cum = self.__cumsum__[key][idx] + if isinstance(item, paddle.Tensor): + if not isinstance(cum, int) or cum != 0: + item = item - cum + elif isinstance(item, (int, float)): + item = item - cum + data[key] = item + if self.__num_nodes_list__[idx] is not None: + data.num_nodes = self.__num_nodes_list__[idx] + return data + + def index_select(self, idx: IndexType) -> List[Data]: + if isinstance(idx, slice): + idx = list(range(self.num_graphs)[idx]) + elif isinstance(idx, paddle.Tensor) and idx.dtype == "int64": + idx = idx.flatten().tolist() + elif isinstance(idx, paddle.Tensor) and idx.dtype == "bool": + idx = idx.flatten().nonzero(as_tuple=False).flatten().tolist() + elif isinstance(idx, np.ndarray) and idx.dtype == np.int64: + idx = idx.flatten().tolist() + elif isinstance(idx, np.ndarray) and idx.dtype == np.bool: + idx = idx.flatten().nonzero()[0].flatten().tolist() + elif isinstance(idx, Sequence) and not isinstance(idx, str): + pass + else: + raise IndexError( + f"Only integers, slices (':'), list, tuples, torch.tensor and np.ndarray of dtype long or bool are valid indices (got '{type(idx).__name__}')" + ) + return [self.get_example(i) for i in idx] + + def __getitem__(self, idx): + if isinstance(idx, str): + return super(Batch, self).__getitem__(idx) + elif isinstance(idx, (int, np.integer)): + return self.get_example(idx) + else: + return self.index_select(idx) + + def to_data_list(self) -> List[Data]: + """Reconstructs the list of :class:`torch_geometric.data.Data` objects + from the batch object. + The batch object must have been created via :meth:`from_data_list` in + order to be able to reconstruct the initial objects.""" + return [self.get_example(i) for i in range(self.num_graphs)] + + @property + def num_graphs(self) -> int: + """Returns the number of graphs in the batch.""" + if self.__num_graphs__ is not None: + return self.__num_graphs__ + elif self.ptr is not None: + return self.ptr.size - 1 + elif self.batch is not None: + return int(self.batch.max_func()) + 1 + else: + raise ValueError \ No newline at end of file diff --git a/ppmat/datasets/geometric_data_type/data.py b/ppmat/datasets/geometric_data_type/data.py new file mode 100644 index 00000000..78fb541c --- /dev/null +++ b/ppmat/datasets/geometric_data_type/data.py @@ -0,0 +1,417 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/jediofgever/pytorch_geometric + +import collections +import copy +import re + +import paddle + +# from .paddle_utils import * +# from ppmat.utils.paddle_aux import * + +__num_nodes_warn_msg__ = "The number of nodes in your data object can only be inferred by its {} indices, and hence may result in unexpected batch-wise behavior, e.g., in case there exists isolated nodes. Please consider explicitly setting the number of nodes for this data object by assigning it to data.num_nodes." + + +def size_repr(key, item, indent=0): + indent_str = " " * indent + if paddle.is_tensor(x=item) and item.dim() == 0: + out = item.item() + elif paddle.is_tensor(x=item): + out = str(list(tuple(item.shape))) + elif isinstance(item, list) or isinstance(item, tuple): + out = str([len(item)]) + elif isinstance(item, dict): + lines = [(indent_str + size_repr(k, v, 2)) for k, v in item.items()] + out = "{\n" + ",\n".join(lines) + "\n" + indent_str + "}" + elif isinstance(item, str): + out = f'"{item}"' + else: + out = str(item) + return f"{indent_str}{key}={out}" + + +class Data(object): + """A plain old python object modeling a single graph with various + (optional) attributes: + + Args: + x (Tensor, optional): Node feature matrix with shape :obj:`[num_nodes, + num_node_features]`. (default: :obj:`None`) + edge_index (LongTensor, optional): Graph connectivity in COO format + with shape :obj:`[2, num_edges]`. (default: :obj:`None`) + edge_attr (Tensor, optional): Edge feature matrix with shape + :obj:`[num_edges, num_edge_features]`. (default: :obj:`None`) + y (Tensor, optional): Graph or node targets with arbitrary shape. + (default: :obj:`None`) + pos (Tensor, optional): Node position matrix with shape + :obj:`[num_nodes, num_dimensions]`. (default: :obj:`None`) + normal (Tensor, optional): Normal vector matrix with shape + :obj:`[num_nodes, num_dimensions]`. (default: :obj:`None`) + face (LongTensor, optional): Face adjacency matrix with shape + :obj:`[3, num_faces]`. (default: :obj:`None`) + + The data object is not restricted to these attributes and can be extended + by any other additional data. + + Example:: + + data = Data(x=x, edge_index=edge_index) + data.train_idx = torch.tensor([...], dtype=torch.long) + data.test_mask = torch.tensor([...], dtype=torch.bool) + """ + + def __init__( + self, + x=None, + edge_index=None, + edge_attr=None, + y=None, + pos=None, + normal=None, + face=None, + **kwargs, + ): + self.x = x + self.edge_index = edge_index + self.edge_attr = edge_attr + self.y = y + self.pos = pos + self.normal = normal + self.face = face + for key, item in kwargs.items(): + if key == "num_nodes": + self.__num_nodes__ = item + else: + self[key] = item + + if edge_index is not None and not paddle.is_tensor(edge_index): + raise ValueError( + f"Argument `edge_index` needs to be a paddle.Tensor but found type `{type(edge_index)}`" + ) + + if face is not None and not paddle.is_tensor(face): + raise ValueError( + f"Argument `face` needs to be a paddle.Tensor but found type `{type(face)}`" + ) + + @classmethod + def from_dict(cls, dictionary): + """Creates a data object from a python dictionary.""" + data = cls() + for key, item in dictionary.items(): + data[key] = item + return data + + def to_dict(self): + return {key: item for key, item in self} + + def to_namedtuple(self): + keys = self.keys + DataTuple = collections.namedtuple("DataTuple", keys) + return DataTuple(*[self[key] for key in keys]) + + def __getitem__(self, key): + """Gets the data of the attribute :obj:`key`.""" + return getattr(self, key, None) + + def __setitem__(self, key, value): + """Sets the attribute :obj:`key` to :obj:`value`.""" + setattr(self, key, value) + + def __delitem__(self, key): + """Delete the data of the attribute :obj:`key`.""" + return delattr(self, key) + + @property + def keys(self): + """Returns all names of graph attributes.""" + keys = [key for key in self.__dict__.keys() if self[key] is not None] + keys = [key for key in keys if key[:2] != "__" and key[-2:] != "__"] + return keys + + def __len__(self): + """Returns the number of all present attributes.""" + return len(self.keys) + + def __contains__(self, key): + """Returns :obj:`True`, if the attribute :obj:`key` is present in the + data.""" + return key in self.keys + + def __iter__(self): + """Iterates over all present attributes in the data, yielding their + attribute names and content.""" + for key in sorted(self.keys): + yield key, self[key] + + def __call__(self, *keys): + """Iterates over all attributes :obj:`*keys` in the data, yielding + their attribute names and content. + If :obj:`*keys` is not given this method will iterative over all + present attributes.""" + for key in sorted(self.keys) if not keys else keys: + if key in self: + yield key, self[key] + + def __cat_dim__(self, key, value): + """Returns the dimension for which :obj:`value` of attribute + :obj:`key` will get concatenated when creating batches. + + .. note:: + + This method is for internal use only, and should only be overridden + if the batch concatenation process is corrupted for a specific data + attribute. + """ + if bool(re.search("(index|face)", key)): + return -1 + return 0 + + def __inc__(self, key, value): + """Returns the incremental count to cumulatively increase the value + of the next attribute of :obj:`key` when creating batches. + + .. note:: + + This method is for internal use only, and should only be overridden + if the batch concatenation process is corrupted for a specific data + attribute. + """ + return self.num_nodes if bool(re.search("(index|face)", key)) else 0 + + @property + def num_nodes(self): + """Returns or sets the number of nodes in the graph. + + .. note:: + The number of nodes in your data object is typically automatically + inferred, *e.g.*, when node features :obj:`x` are present. + In some cases however, a graph may only be given by its edge + indices :obj:`edge_index`. + PyTorch Geometric then *guesses* the number of nodes + according to :obj:`edge_index.max().item() + 1`, but in case there + exists isolated nodes, this number has not to be correct and can + therefore result in unexpected batch-wise behavior. + Thus, we recommend to set the number of nodes in your data object + explicitly via :obj:`data.num_nodes = ...`. + You will be given a warning that requests you to do so. + """ + if hasattr(self, "__num_nodes__"): + return self.__num_nodes__ + for key, item in self("x", "pos", "normal", "batch"): + return item.shape[self.__cat_dim__(key, item)] + if hasattr(self, "adj"): + return self.adj.shape[0] + if hasattr(self, "adj_t"): + return self.adj_t.shape[1] + return None + + @num_nodes.setter + def num_nodes(self, num_nodes): + self.__num_nodes__ = num_nodes + + @property + def num_edges(self): + """ + Returns the number of edges in the graph. + For undirected graphs, this will return the number of bi-directional + edges, which is double the amount of unique edges. + """ + for key, item in self("edge_index", "edge_attr"): + return item.shape[self.__cat_dim__(key, item)] + for key, item in self("adj", "adj_t"): + return item.nnz() + return None + + @property + def num_faces(self): + """Returns the number of faces in the mesh.""" + if self.face is not None: + return self.face.shape[self.__cat_dim__("face", self.face)] + return None + + @property + def num_node_features(self): + """Returns the number of features per node in the graph.""" + if self.x is None: + return 0 + return 1 if self.x.dim() == 1 else self.x.shape[1] + + @property + def num_features(self): + """Alias for :py:attr:`~num_node_features`.""" + return self.num_node_features + + @property + def num_edge_features(self): + """Returns the number of features per edge in the graph.""" + if self.edge_attr is None: + return 0 + return 1 if self.edge_attr.dim() == 1 else self.edge_attr.shape[1] + + def __apply__(self, item, func): + if paddle.is_tensor(x=item): + return func(item) + elif isinstance(item, (tuple, list)): + return [self.__apply__(v, func) for v in item] + elif isinstance(item, dict): + return {k: self.__apply__(v, func) for k, v in item.items()} + else: + return item + + def apply(self, func, *keys): + """Applies the function :obj:`func` to all tensor attributes + :obj:`*keys`. If :obj:`*keys` is not given, :obj:`func` is applied to + all present attributes. + """ + for key, item in self(*keys): + self[key] = self.__apply__(item, func) + return self + + def contiguous(self, *keys): + """Ensures a contiguous memory layout for all attributes :obj:`*keys`. + If :obj:`*keys` is not given, all present attributes are ensured to + have a contiguous memory layout.""" + return self.apply(lambda x: x.contiguous(), *keys) + + def to(self, device, *keys, **kwargs): + """Performs tensor dtype and/or device conversion to all attributes + :obj:`*keys`. + If :obj:`*keys` is not given, the conversion is applied to all present + attributes.""" + return self.apply(lambda x: x.to(device, **kwargs), *keys) + + def cpu(self, *keys): + """Copies all attributes :obj:`*keys` to CPU memory. + If :obj:`*keys` is not given, the conversion is applied to all present + attributes.""" + return self.apply(lambda x: x.cpu(), *keys) + + def cuda(self, device=None, non_blocking=False, *keys): + """Copies all attributes :obj:`*keys` to CUDA memory. + If :obj:`*keys` is not given, the conversion is applied to all present + attributes.""" + return self.apply( + lambda x: x.cuda(device_id=device, blocking=not non_blocking), *keys + ) + + def clone(self): + """Performs a deep-copy of the data object.""" + return self.__class__.from_dict( + { + k: (v.clone() if paddle.is_tensor(x=v) else copy.deepcopy(v)) + for k, v in self.__dict__.items() + } + ) + + def pin_memory(self, *keys): + """Copies all attributes :obj:`*keys` to pinned memory. + If :obj:`*keys` is not given, the conversion is applied to all present + attributes.""" + return self.apply(lambda x: x.pin_memory(), *keys) + + def debug(self): + if self.edge_index is not None: + if self.edge_index.dtype != "int64": + raise RuntimeError( + "Expected edge indices of dtype {}, but found dtype {}".format( + "int64", self.edge_index.dtype + ) + ) + if self.face is not None: + if self.face.dtype != "int64": + raise RuntimeError( + "Expected face indices of dtype {}, but found dtype {}".format( + "int64", self.face.dtype + ) + ) + if self.edge_index is not None: + if self.edge_index.dim() != 2 or self.edge_index.shape[0] != 2: + raise RuntimeError( + "Edge indices should have shape [2, num_edges] but found shape {}".format( + tuple(self.edge_index.shape) + ) + ) + if self.edge_index is not None and self.num_nodes is not None: + if self.edge_index.size > 0: + min_index = self.edge_index.min_func() + max_index = self.edge_index.max_func() + else: + min_index = max_index = 0 + if min_index < 0 or max_index > self.num_nodes - 1: + raise RuntimeError( + "Edge indices must lay in the interval [0, {}] but found them in the interval [{}, {}]".format( + self.num_nodes - 1, min_index, max_index + ) + ) + if self.face is not None: + if self.face.dim() != 2 or self.face.shape[0] != 3: + raise RuntimeError( + "Face indices should have shape [3, num_faces] but found shape {}".format( + tuple(self.face.shape) + ) + ) + if self.face is not None and self.num_nodes is not None: + if self.face.size > 0: + min_index = self.face.min_func() + max_index = self.face.max_func() + else: + min_index = max_index = 0 + if min_index < 0 or max_index > self.num_nodes - 1: + raise RuntimeError( + "Face indices must lay in the interval [0, {}] but found them in the interval [{}, {}]".format( + self.num_nodes - 1, min_index, max_index + ) + ) + if self.edge_index is not None and self.edge_attr is not None: + if self.edge_index.shape[1] != self.edge_attr.shape[0]: + raise RuntimeError( + "Edge indices and edge attributes hold a differing number of edges, found {} and {}".format( + tuple(self.edge_index.shape), tuple(self.edge_attr.shape) + ) + ) + if self.x is not None and self.num_nodes is not None: + if self.x.shape[0] != self.num_nodes: + raise RuntimeError( + "Node features should hold {} elements in the first dimension but found {}".format( + self.num_nodes, self.x.shape[0] + ) + ) + if self.pos is not None and self.num_nodes is not None: + if self.pos.shape[0] != self.num_nodes: + raise RuntimeError( + "Node positions should hold {} elements in the first dimension but found {}".format( + self.num_nodes, self.pos.shape[0] + ) + ) + if self.normal is not None and self.num_nodes is not None: + if self.normal.shape[0] != self.num_nodes: + raise RuntimeError( + "Node normals should hold {} elements in the first dimension but found {}".format( + self.num_nodes, self.normal.shape[0] + ) + ) + + def __repr__(self): + cls = str(self.__class__.__name__) + has_dict = any([isinstance(item, dict) for _, item in self]) + if not has_dict: + info = [size_repr(key, item) for key, item in self] + return "{}({})".format(cls, ", ".join(info)) + else: + info = [size_repr(key, item, indent=2) for key, item in self] + return "{}(\n{}\n)".format(cls, ",\n".join(info)) diff --git a/ppmat/datasets/geometric_data_type/dataset.py b/ppmat/datasets/geometric_data_type/dataset.py new file mode 100644 index 00000000..5e050e2e --- /dev/null +++ b/ppmat/datasets/geometric_data_type/dataset.py @@ -0,0 +1,268 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/jediofgever/pytorch_geometric + +import copy +import os +import re +import warnings +from collections.abc import Sequence +from typing import Any +from typing import Callable +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +import numpy as np +import paddle + +from .data import Data +from .utils_geo_data import makedirs + +IndexType = Union[slice, paddle.Tensor, np.ndarray, Sequence] + + +class Dataset(paddle.io.Dataset): + """Dataset base class for creating graph datasets. + See `here `__ for the accompanying tutorial. + + Args: + root (string, optional): Root directory where the dataset should be + saved. (optional: :obj:`None`) + transform (callable, optional): A function/transform that takes in an + :obj:`torch_geometric.data.Data` object and returns a transformed + version. The data object will be transformed before every access. + (default: :obj:`None`) + pre_transform (callable, optional): A function/transform that takes in + an :obj:`torch_geometric.data.Data` object and returns a + transformed version. The data object will be transformed before + being saved to disk. (default: :obj:`None`) + pre_filter (callable, optional): A function that takes in an + :obj:`torch_geometric.data.Data` object and returns a boolean + value, indicating whether the data object should be included in the + final dataset. (default: :obj:`None`) + """ + + @property + def raw_file_names(self) -> Union[str, List[str], Tuple]: + """The name of the files to find in the :obj:`self.raw_dir` folder in + order to skip the download.""" + raise NotImplementedError + + @property + def processed_file_names(self) -> Union[str, List[str], Tuple]: + """The name of the files to find in the :obj:`self.processed_dir` + folder in order to skip the processing.""" + raise NotImplementedError + + def download(self): + """Downloads the dataset to the :obj:`self.raw_dir` folder.""" + raise NotImplementedError + + def process(self): + """Processes the dataset to the :obj:`self.processed_dir` folder.""" + raise NotImplementedError + + def len(self) -> int: + raise NotImplementedError + + def get(self, idx: int) -> Data: + """Gets the data object at index :obj:`idx`.""" + raise NotImplementedError + + def __init__( + self, + root: Optional[str] = None, + transform: Optional[Callable] = None, + pre_transform: Optional[Callable] = None, + pre_filter: Optional[Callable] = None, + ): + super().__init__() + if isinstance(root, str): + root = os.path.expanduser(os.path.normpath(root)) + self.root = root + self.transform = transform + self.pre_transform = pre_transform + self.pre_filter = pre_filter + self._indices: Optional[Sequence] = None + if "download" in self.__class__.__dict__.keys(): + self._download() + if "process" in self.__class__.__dict__.keys(): + self._process() + + def indices(self) -> Sequence: + return range(self.len()) if self._indices is None else self._indices + + @property + def raw_dir(self) -> str: + return os.path.join(self.root, "raw") + + @property + def processed_dir(self) -> str: + return os.path.join(self.root, "processed") + + @property + def num_node_features(self) -> int: + """Returns the number of features per node in the dataset.""" + data = self[0] + if hasattr(data, "num_node_features"): + return data.num_node_features + raise AttributeError( + f"'{data.__class__.__name__}' object has no attribute 'num_node_features'" + ) + + @property + def num_features(self) -> int: + """Alias for :py:attr:`~num_node_features`.""" + return self.num_node_features + + @property + def num_edge_features(self) -> int: + """Returns the number of features per edge in the dataset.""" + data = self[0] + if hasattr(data, "num_edge_features"): + return data.num_edge_features + raise AttributeError( + f"'{data.__class__.__name__}' object has no attribute 'num_edge_features'" + ) + + @property + def raw_paths(self) -> List[str]: + """The filepaths to find in order to skip the download.""" + files = to_list(self.raw_file_names) + return [os.path.join(self.raw_dir, f) for f in files] + + @property + def processed_paths(self) -> List[str]: + """The filepaths to find in the :obj:`self.processed_dir` + folder in order to skip the processing.""" + files = to_list(self.processed_file_names) + return [os.path.join(self.processed_dir, f) for f in files] + + def _download(self): + if files_exist(self.raw_paths): + return + makedirs(self.raw_dir) + self.download() + + def _process(self): + f = os.path.join(self.processed_dir, "pre_transform.pt") + if os.path.exists(f) and paddle.load(path=str(f)) != _repr(self.pre_transform): + warnings.warn( + f"The `pre_transform` argument differs from the one used in the pre-processed version of this dataset. If you want to make use of another pre-processing technique, make sure to sure to delete '{self.processed_dir}' first" + ) + f = os.path.join(self.processed_dir, "pre_filter.pt") + if os.path.exists(f) and paddle.load(path=str(f)) != _repr(self.pre_filter): + warnings.warn( + "The `pre_filter` argument differs from the one used in the pre-processed version of this dataset. If you want to make use of another pre-fitering technique, make sure to delete '{self.processed_dir}' first" + ) + if files_exist(self.processed_paths): + return + print("Processing...") + makedirs(self.processed_dir) + self.process() + path = os.path.join(self.processed_dir, "pre_transform.pt") + paddle.save(obj=_repr(self.pre_transform), path=path) + path = os.path.join(self.processed_dir, "pre_filter.pt") + paddle.save(obj=_repr(self.pre_filter), path=path) + print("Done!") + + def __len__(self) -> int: + """The number of examples in the dataset.""" + return len(self.indices()) + + def __getitem__( + self, idx: Union[int, np.integer, IndexType] + ) -> Union["Dataset", Data]: + """In case :obj:`idx` is of type integer, will return the data object + at index :obj:`idx` (and transforms it in case :obj:`transform` is + present). + In case :obj:`idx` is a slicing object, *e.g.*, :obj:`[2:5]`, a list, a + tuple, a PyTorch :obj:`LongTensor` or a :obj:`BoolTensor`, or a numpy + :obj:`np.array`, will return a subset of the dataset at the specified + indices.""" + if ( + isinstance(idx, (int, np.integer)) + or isinstance(idx, paddle.Tensor) + and idx.dim() == 0 + or isinstance(idx, np.ndarray) + and np.isscalar(idx) + ): + data = self.get(self.indices()[idx]) + data = data if self.transform is None else self.transform(data) + return data + else: + return self.index_select(idx) + + def index_select(self, idx: IndexType) -> "Dataset": + indices = self.indices() + if isinstance(idx, slice): + indices = indices[idx] + elif isinstance(idx, paddle.Tensor) and idx.dtype == "int64": + return self.index_select(idx.flatten().tolist()) + elif isinstance(idx, paddle.Tensor) and idx.dtype == "bool": + idx = idx.flatten().nonzero(as_tuple=False) + return self.index_select(idx.flatten().tolist()) + elif isinstance(idx, np.ndarray) and idx.dtype == np.int64: + return self.index_select(idx.flatten().tolist()) + elif isinstance(idx, np.ndarray) and idx.dtype == np.bool: + idx = idx.flatten().nonzero()[0] + return self.index_select(idx.flatten().tolist()) + elif isinstance(idx, Sequence) and not isinstance(idx, str): + indices = [indices[i] for i in idx] + else: + raise IndexError( + f"Only integers, slices (':'), list, tuples, torch.tensor and np.ndarray of dtype long or bool are valid indices (got '{type(idx).__name__}')" + ) + dataset = copy.copy(self) + dataset._indices = indices + return dataset + + def shuffle( + self, return_perm: bool = False + ) -> Union["Dataset", Tuple["Dataset", paddle.Tensor]]: + """Randomly shuffles the examples in the dataset. + + Args: + return_perm (bool, optional): If set to :obj:`True`, will return + the random permutation used to shuffle the dataset in addition. + (default: :obj:`False`) + """ + perm = paddle.randperm(n=len(self)) + dataset = self.index_select(perm) + return (dataset, perm) if return_perm is True else dataset + + def __repr__(self) -> str: + arg_repr = str(len(self)) if len(self) > 1 else "" + return f"{self.__class__.__name__}({arg_repr})" + + +def to_list(value: Any) -> Sequence: + if isinstance(value, Sequence) and not isinstance(value, str): + return value + else: + return [value] + + +def files_exist(files: List[str]) -> bool: + return len(files) != 0 and all([os.path.exists(f) for f in files]) + + +def _repr(obj: Any) -> str: + if obj is None: + return "None" + return re.sub("(<.*?)\\s.*(>)", "\\1\\2", obj.__repr__()) \ No newline at end of file diff --git a/ppmat/datasets/geometric_data_type/utils_geo_data.py b/ppmat/datasets/geometric_data_type/utils_geo_data.py new file mode 100644 index 00000000..078b2eef --- /dev/null +++ b/ppmat/datasets/geometric_data_type/utils_geo_data.py @@ -0,0 +1,62 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/jediofgever/pytorch_geometric + +import os +import ssl +import urllib +import zipfile + + +def makedirs(dir): + os.makedirs(dir, exist_ok=True) + + +def download_url(url, folder, log=True): + """Downloads the content of an URL to a specific folder. + + Args: + url (string): The url. + folder (string): The folder. + log (bool, optional): If :obj:`False`, will not print anything to the + console. (default: :obj:`True`) + """ + filename = url.rpartition("/")[2].split("?")[0] + path = osp.join(folder, filename) + if osp.exists(path): + if log: + print("Using exist file", filename) + return path + if log: + print("Downloading", url) + makedirs(folder) + context = ssl._create_unverified_context() + data = urllib.request.urlopen(url, context=context) + with open(path, "wb") as f: + f.write(data.read()) + return path + + +def extract_zip(path, folder, log=True): + """Extracts a zip archive to a specific folder. + + Args: + path (string): The path to the tar archive. + folder (string): The folder. + log (bool, optional): If :obj:`False`, will not print anything to the + console. (default: :obj:`True`) + """ + with zipfile.ZipFile(path, "r") as f: + f.extractall(folder) diff --git a/ppmat/datasets/graph_utils/chgnet_graph_utils.py b/ppmat/datasets/graph_utils/chgnet_graph_utils.py new file mode 100644 index 00000000..a72eaf74 --- /dev/null +++ b/ppmat/datasets/graph_utils/chgnet_graph_utils.py @@ -0,0 +1,323 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/CederGroupHub/chgnet + +from __future__ import annotations + +import sys +from abc import ABC +from abc import abstractmethod + +from ppmat.utils.io import write_json + + +class Node: + """A node in a graph. + + Args: + index (int): the index of this node + info (dict, optional): any additional information about this node. + """ + + def __init__(self, index: int, info: dict | None = None) -> None: + self.index = index + self.info = info + self.neighbors: dict[int, list[DirectedEdge | UndirectedEdge]] = {} + + def add_neighbor(self, index, edge) -> None: + """Draw an directed edge between self and the node specified by index. + + Args: + index (int): the index of neighboring node + edge (DirectedEdge): an DirectedEdge object pointing from self to the node. + """ + if index not in self.neighbors: + self.neighbors[index] = [edge] + else: + self.neighbors[index].append(edge) + + +class Edge(ABC): + """Abstract base class for edges in a graph.""" + + def __init__( + self, nodes: list, index: int | None = None, info: dict | None = None + ) -> None: + """Initialize an Edge.""" + self.nodes = nodes + self.index = index + self.info = info + + def __repr__(self) -> str: + """String representation of this edge.""" + nodes, index, info = self.nodes, self.index, self.info + return f"{type(self).__name__}(nodes={nodes!r}, index={index!r}, info={info!r})" + + def __hash__(self) -> int: + """Hash this edge.""" + img = (self.info or {}).get("image") + img_str = "" if img is None else img.tobytes() + return hash((self.nodes[0], self.nodes[1], img_str)) + + @abstractmethod + def __eq__(self, other: object) -> bool: + """Check if two edges are equal.""" + raise NotImplementedError + + +class UndirectedEdge(Edge): + """An undirected/bi-directed edge in a graph.""" + + __hash__ = Edge.__hash__ + + def __eq__(self, other: object) -> bool: + """Check if two undirected edges are equal.""" + return set(self.nodes) == set(other.nodes) and self.info == other.info + + +class DirectedEdge(Edge): + """A directed edge in a graph.""" + + __hash__ = Edge.__hash__ + + def make_undirected(self, index: int, info: dict | None = None) -> UndirectedEdge: + """Make a directed edge undirected.""" + info = info or {} + info["distance"] = self.info["distance"] + return UndirectedEdge(self.nodes, index, info) + + def __eq__(self, other: object) -> bool: + """Check if the two directed edges are equal. + + Args: + other (DirectedEdge): another DirectedEdge to compare to + + Returns: + bool: True if other is the same directed edge, or if other is the directed + edge with reverse direction of self, else False. + """ + if not isinstance(other, DirectedEdge): + return False + self_img = (self.info or {}).get("image") + other_img = (other.info or {}).get("image") + none_img = self_img is other_img is None + if self.nodes == other.nodes and (none_img or all(self_img == other_img)): + print( + ( + "the two directed edges are equal but this operation " + "is not supposed to happen" + ), + file=sys.stderr, + ) + return True + return self.nodes == other.nodes[::-1] and ( + none_img or all(self_img == -1 * other_img) + ) + + +class GraphUtils: + """A graph for storing the neighbor information of atoms.""" + + def __init__(self, nodes: list[Node]) -> None: + """Initialize a Graph from a list of nodes.""" + self.nodes = nodes + self.directed_edges: dict[frozenset[int], list[DirectedEdge]] = {} + self.directed_edges_list: list[DirectedEdge] = [] + self.undirected_edges: dict[frozenset[int], list[UndirectedEdge]] = {} + self.undirected_edges_list: list[UndirectedEdge] = [] + + def add_edge( + self, center_index, neighbor_index, image, distance, dist_tol: float = 1e-06 + ) -> None: + """Add an directed edge to the graph. + + Args: + center_index (int): center node index + neighbor_index (int): neighbor node index + image (np.array): the periodic cell image the neighbor is from + distance (float): distance between center and neighbor. + dist_tol (float): tolerance for distance comparison between edges. + Default = 1e-6 + """ + directed_edge_index = len(self.directed_edges_list) + this_directed_edge = DirectedEdge( + [center_index, neighbor_index], + index=directed_edge_index, + info={"image": image, "distance": distance}, + ) + tmp = frozenset([center_index, neighbor_index]) + if tmp not in self.undirected_edges: + this_directed_edge.info["undirected_edge_index"] = len( + self.undirected_edges_list + ) + this_undirected_edge = this_directed_edge.make_undirected( + index=len(self.undirected_edges_list), + info={"directed_edge_index": [directed_edge_index]}, + ) + self.undirected_edges[tmp] = [this_undirected_edge] + self.undirected_edges_list.append(this_undirected_edge) + self.nodes[center_index].add_neighbor(neighbor_index, this_directed_edge) + self.directed_edges_list.append(this_directed_edge) + else: + for undirected_edge in self.undirected_edges[tmp]: + if ( + abs(undirected_edge.info["distance"] - distance) < dist_tol + and len(undirected_edge.info["directed_edge_index"]) == 1 + ): + added_dir_edge = self.directed_edges_list[ + undirected_edge.info["directed_edge_index"][0] + ] + if added_dir_edge == this_directed_edge: + this_directed_edge.info[ + "undirected_edge_index" + ] = added_dir_edge.info["undirected_edge_index"] + self.nodes[center_index].add_neighbor( + neighbor_index, this_directed_edge + ) + self.directed_edges_list.append(this_directed_edge) + undirected_edge.info["directed_edge_index"].append( + directed_edge_index + ) + return + this_directed_edge.info["undirected_edge_index"] = len( + self.undirected_edges_list + ) + this_undirected_edge = this_directed_edge.make_undirected( + index=len(self.undirected_edges_list), + info={"directed_edge_index": [directed_edge_index]}, + ) + self.undirected_edges[tmp].append(this_undirected_edge) + self.undirected_edges_list.append(this_undirected_edge) + self.nodes[center_index].add_neighbor(neighbor_index, this_directed_edge) + self.directed_edges_list.append(this_directed_edge) + + def adjacency_list(self) -> tuple[list[list[int]], list[int]]: + """Get the adjacency list + Return: + graph: the adjacency list + [[0, 1], + [0, 2], + ... + [5, 2] + ... ]] + the fist column specifies center/source node, + the second column specifies neighbor/destination node + directed2undirected: + [0, 1, ...] + a list of length = num_directed_edge that specifies + the undirected edge index corresponding to the directed edges + represented in each row in the graph adjacency list. + """ + graph = [edge.nodes for edge in self.directed_edges_list] + directed2undirected = [ + edge.info["undirected_edge_index"] for edge in self.directed_edges_list + ] + return graph, directed2undirected + + def line_graph_adjacency_list(self, cutoff) -> tuple[list[list[int]], list[int]]: + """Get the line graph adjacency list. + + Args: + cutoff (float): a float to indicate the maximum edge length to be included + in constructing the line graph, this is used to decrease computation + complexity + + Return: + line_graph: + [[0, 1, 1, 2, 2], + [0, 1, 1, 4, 23], + [1, 4, 23, 5, 66], + ... ... ] + the fist column specifies node(atom) index at this angle, + the second column specifies 1st undirected edge(left bond) index, + the third column specifies 1st directed edge(left bond) index, + the fourth column specifies 2nd undirected edge(right bond) index, + the fifth column specifies 2nd directed edge(right bond) index,. + undirected2directed: + [32, 45, ...] + a list of length = num_undirected_edge that + maps the undirected edge index to one of its directed edges indices + """ + if len(self.directed_edges_list) != 2 * len(self.undirected_edges_list): + raise ValueError( + f"Error: number of directed edges={len(self.directed_edges_list)} " + f"!= 2 * number of undirected edges={len(self.undirected_edges_list)}" + "!This indicates directed edges are not complete" + ) + line_graph = [] + undirected2directed = [] + for u_edge in self.undirected_edges_list: + undirected2directed.append(u_edge.info["directed_edge_index"][0]) + if u_edge.info["distance"] > cutoff: + continue + if len(u_edge.info["directed_edge_index"]) != 2: + raise ValueError( + f"Did not find 2 Directed_edges !!!undirected edge {u_edge} " + "has:edge.info['directed_edge_index'] = " + f"{u_edge.info['directed_edge_index']}len directed_edges_list = " + f"{len(self.directed_edges_list)}len undirected_edges_list = " + f"{len(self.undirected_edges_list)}" + ) + for center, dir_edge in zip( + u_edge.nodes, u_edge.info["directed_edge_index"], strict=True + ): + for directed_edges in self.nodes[center].neighbors.values(): + for directed_edge in directed_edges: + if directed_edge.index == dir_edge: + continue + if directed_edge.info["distance"] < cutoff: + line_graph.append( + [ + center, + u_edge.index, + dir_edge, + directed_edge.info["undirected_edge_index"], + directed_edge.index, + ] + ) + return line_graph, undirected2directed + + def undirected2directed(self) -> list[int]: + """The index map from undirected_edge index to one of its directed_edge + index. + """ + return [ + undirected_edge.info["directed_edge_index"][0] + for undirected_edge in self.undirected_edges_list + ] + + def as_dict(self) -> dict: + """Return dictionary serialization of a Graph.""" + return { + "nodes": self.nodes, + "directed_edges": self.directed_edges, + "directed_edges_list": self.directed_edges_list, + "undirected_edges": self.undirected_edges, + "undirected_edges_list": self.undirected_edges_list, + } + + def to(self, filename="graph.json") -> None: + """Save graph dictionary to file.""" + write_json(filename, self.as_dict()) + + def __repr__(self) -> str: + """Return string representation of the Graph.""" + num_nodes = len(self.nodes) + num_directed_edges = len(self.directed_edges_list) + num_undirected_edges = len(self.undirected_edges_list) + return ( + f"Graph(num_nodes={num_nodes!r}, num_directed_edges={num_directed_edges!r}," + f" num_undirected_edges={num_undirected_edges!r})" + ) diff --git a/ppmat/datasets/graph_utils/comformer_graph_utils.py b/ppmat/datasets/graph_utils/comformer_graph_utils.py new file mode 100644 index 00000000..13c8c3fd --- /dev/null +++ b/ppmat/datasets/graph_utils/comformer_graph_utils.py @@ -0,0 +1,254 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/divelab/AIRS/tree/main/OpenMat/ComFormer + +from collections import defaultdict + +import numpy as np +from jarvis.core.specie import get_node_attributes + + +def same_line(a, b): + a_new = a / (sum(a**2) ** 0.5) + b_new = b / (sum(b**2) ** 0.5) + flag = False + if abs(sum(a_new * b_new) - 1.0) < 1e-5: + flag = True + elif abs(sum(a_new * b_new) + 1.0) < 1e-5: + flag = True + else: + flag = False + return flag + + +def same_plane(a, b, c): + flag = False + if abs(np.dot(np.cross(a, b), c)) < 1e-5: + flag = True + return flag + + +def angle_from_array(a, b, lattice): + a_new = np.dot(a, lattice) + b_new = np.dot(b, lattice) + assert a_new.shape == a.shape + value = sum(a_new * b_new) + length = (sum(a_new**2) ** 0.5) * (sum(b_new**2) ** 0.5) + cos = value / length + angle = np.arccos(cos) + return angle / np.pi * 180.0 + + +def correct_coord_sys(a, b, c, lattice): + a_new = np.dot(a, lattice) + b_new = np.dot(b, lattice) + c_new = np.dot(c, lattice) + assert a_new.shape == a.shape + plane_vec = np.cross(a_new, b_new) + value = sum(plane_vec * c_new) + length = (sum(plane_vec**2) ** 0.5) * (sum(c_new**2) ** 0.5) + cos = value / length + angle = np.arccos(cos) + return angle / np.pi * 180.0 <= 90.0 + + +def canonize_edge( + src_id, + dst_id, + src_image, + dst_image, +): + """Compute canonical edge representation. + + Sort vertex ids shift periodic images so the first vertex is in (0,0,0) image. + """ + # store directed edges src_id <= dst_id + if dst_id < src_id: + src_id, dst_id = dst_id, src_id + src_image, dst_image = dst_image, src_image + + # shift periodic images so that src is in (0,0,0) image + if not np.array_equal(src_image, (0, 0, 0)): + shift = src_image + src_image = tuple(np.subtract(src_image, shift)) + dst_image = tuple(np.subtract(dst_image, shift)) + + assert src_image == (0, 0, 0) + + return src_id, dst_id, src_image, dst_image + + +def nearest_neighbor_edges_submit( + atoms=None, + cutoff=8, + max_neighbors=12, + use_canonize=False, + use_lattice=False, +): + """Construct k-NN edge list.""" + lat = atoms.lattice + all_neighbors_now = atoms.get_all_neighbors(r=cutoff) + min_nbrs = min(len(neighborlist) for neighborlist in all_neighbors_now) + + attempt = 0 + if min_nbrs < max_neighbors: + lat = atoms.lattice + if cutoff < max(lat.a, lat.b, lat.c): + r_cut = max(lat.a, lat.b, lat.c) + else: + r_cut = 2 * cutoff + attempt += 1 + return nearest_neighbor_edges_submit( + atoms=atoms, + use_canonize=use_canonize, + cutoff=r_cut, + max_neighbors=max_neighbors, + use_lattice=use_lattice, + ) + + edges = defaultdict(set) + # lattice correction process + r_cut = max(lat.a, lat.b, lat.c) + 1e-2 + all_neighbors = atoms.get_all_neighbors(r=r_cut) + neighborlist = all_neighbors[0] + neighborlist = sorted(neighborlist, key=lambda x: x[2]) + ids = np.array([nbr[1] for nbr in neighborlist]) + images = np.array([nbr[3] for nbr in neighborlist]) + images = images[ids == 0] + lat1 = images[0] + # finding lat2 + start = 1 + for i in range(start, len(images)): + lat2 = images[i] + if not same_line(lat1, lat2): + start = i + break + # finding lat3 + for i in range(start, len(images)): + lat3 = images[i] + if not same_plane(lat1, lat2, lat3): + break + # find the invariant corner + if angle_from_array(lat1, lat2, lat.matrix) > 90.0: + lat2 = -lat2 + if angle_from_array(lat1, lat3, lat.matrix) > 90.0: + lat3 = -lat3 + # find the invariant coord system + if not correct_coord_sys(lat1, lat2, lat3, lat.matrix): + lat1 = -lat1 + lat2 = -lat2 + lat3 = -lat3 + + # if not correct_coord_sys(lat1, lat2, lat3, lat.matrix): + # print(lat1, lat2, lat3) + # lattice correction end + for site_idx, neighborlist in enumerate(all_neighbors_now): + + # sort on distance + neighborlist = sorted(neighborlist, key=lambda x: x[2]) + distances = np.array([nbr[2] for nbr in neighborlist]) + ids = np.array([nbr[1] for nbr in neighborlist]) + images = np.array([nbr[3] for nbr in neighborlist]) + + # find the distance to the k-th nearest neighbor + max_dist = distances[max_neighbors - 1] + ids = ids[distances <= max_dist] + images = images[distances <= max_dist] + distances = distances[distances <= max_dist] + for dst, image in zip(ids, images): + src_id, dst_id, src_image, dst_image = canonize_edge( + site_idx, dst, (0, 0, 0), tuple(image) + ) + if use_canonize: + edges[(src_id, dst_id)].add(dst_image) + else: + edges[(site_idx, dst)].add(tuple(image)) + + if use_lattice: + edges[(site_idx, site_idx)].add(tuple(lat1)) + edges[(site_idx, site_idx)].add(tuple(lat2)) + edges[(site_idx, site_idx)].add(tuple(lat3)) + + return edges, lat1, lat2, lat3 + + +def build_undirected_edgedata( + atoms=None, + edges={}, + a=None, + b=None, + c=None, +): + """Build undirected graph data from edge set.""" + # second pass: construct *undirected* graph + u, v, r, nei, atom_lat = [], [], [], [], [] + v1, v2, v3 = ( + atoms.lattice.cart_coords(a), + atoms.lattice.cart_coords(b), + atoms.lattice.cart_coords(c), + ) + atom_lat.append([v1, v2, v3]) + for (src_id, dst_id), images in edges.items(): + + for dst_image in images: + # fractional coordinate for periodic image of dst + dst_coord = atoms.frac_coords[dst_id] + dst_image + # cartesian displacement vector pointing from src -> dst + d = atoms.lattice.cart_coords(dst_coord - atoms.frac_coords[src_id]) + for uu, vv, dd in [(src_id, dst_id, d), (dst_id, src_id, -d)]: + u.append(uu) + v.append(vv) + r.append(dd) + nei.append([v1, v2, v3]) + + u = np.asarray(u, dtype="int64") + v = np.asarray(v, dtype="int64") + r = np.asarray(r, dtype="float32") + nei = np.asarray(nei, dtype="float32") + atom_lat = np.asarray(atom_lat, dtype="float32") + return u, v, r, nei, atom_lat + + +def atom_multigraph( + atoms=None, + neighbor_strategy="k-nearest", + cutoff=4.0, + max_neighbors=25, + atom_features="cgcnn", + use_canonize: bool = False, + use_lattice: bool = True, +): + if neighbor_strategy == "k-nearest": + edges, a, b, c = nearest_neighbor_edges_submit( + atoms=atoms, + cutoff=cutoff, + max_neighbors=max_neighbors, + use_canonize=use_canonize, + use_lattice=use_lattice, + ) + u, v, r, nei, atom_lat = build_undirected_edgedata(atoms, edges, a, b, c) + else: + raise ValueError("Not implemented yet", neighbor_strategy) + + # # build up atom attribute tensor + sps_features = [] + for _, s in enumerate(atoms.elements): + feat = list(get_node_attributes(s, atom_features=atom_features)) + sps_features.append(feat) + node_features = np.array(sps_features) + atom_lat = atom_lat.repeat(node_features.shape[0], axis=0) + edge_index = np.stack([u, v], axis=1) + + return edge_index, node_features, r, nei, atom_lat diff --git a/ppmat/datasets/graph_utils/infgcn_graph_utils.py b/ppmat/datasets/graph_utils/infgcn_graph_utils.py new file mode 100644 index 00000000..350924d2 --- /dev/null +++ b/ppmat/datasets/graph_utils/infgcn_graph_utils.py @@ -0,0 +1,468 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy as np +import paddle + + +def radius_graph( + x: paddle.Tensor, + r: float, + batch: paddle.Tensor | None = None, + loop: bool = False, + max_num_neighbors: int = 32, +) -> paddle.Tensor: + if batch is None: + batch = paddle.zeros((x.shape[0],), dtype="int64") + + # For small graphs (<= 1000 nodes), use simple distance matrix calculation + if x.shape[0] <= 1000: + return radius_graph_simple(x, r, batch, loop, max_num_neighbors) + # For large graphs (> 1000 nodes), use grid-based spatial partitioning for efficiency + else: + return radius_graph_grid(x, r, batch, loop, max_num_neighbors) + + +def radius( + x: paddle.Tensor, + y: paddle.Tensor, + r: float, + batch_x: paddle.Tensor | None = None, + batch_y: paddle.Tensor | None = None, + max_num_neighbors: int = 32, +) -> tuple[paddle.Tensor, paddle.Tensor]: + if batch_x is None: + batch_x = paddle.zeros((x.shape[0],), dtype="int64") + if batch_y is None: + batch_y = paddle.zeros((y.shape[0],), dtype="int64") + + atoms_grids_scenario = x.shape[0] < 1000 and y.shape[0] > 1000 + + if atoms_grids_scenario: + return radius_atoms_to_grids(x, y, r, batch_x, batch_y, max_num_neighbors) + elif x.shape[0] > 1000 or y.shape[0] > 1000: + return radius_grid(x, y, r, batch_x, batch_y, max_num_neighbors) + else: + return radius_simple(x, y, r, batch_x, batch_y, max_num_neighbors) + + +def radius_graph_simple( + x: paddle.Tensor, + r: float, + batch: paddle.Tensor, + loop: bool = False, + max_num_neighbors: int = 32, +) -> paddle.Tensor: + batch_size = int(batch.max().item()) + 1 + row_list, col_list = [], [] + + for b in range(batch_size): + mask = batch == b + subset_x = x[mask] + subset_idx = paddle.nonzero(mask, as_tuple=True)[0] + + n = subset_x.shape[0] + if n == 0: + continue + + dist = ( + paddle.sum(subset_x**2, axis=1, keepdim=True) + + paddle.sum(subset_x**2, axis=1, keepdim=True).T + - 2 * paddle.matmul(subset_x, subset_x.T) + ) + dist = paddle.clip(dist, min=0.0) + + adj = dist <= r * r + + if not loop: + diag_mask = paddle.eye(n, dtype="int32") == 0 + adj = adj & diag_mask + + row, col = paddle.nonzero(adj, as_tuple=True) + + if row.shape[0] > 0: + if max_num_neighbors < 1000000: + unique_rows, counts = paddle.unique(row, return_counts=True) + keep_mask = paddle.ones_like(row, dtype="bool") + + for node, count in zip(unique_rows, counts): + if count > max_num_neighbors: + node_mask = row == node + edge_indices = paddle.nonzero(node_mask, as_tuple=True)[0] + perm = paddle.randperm(count.item()) + drop_indices = edge_indices[perm[max_num_neighbors:]] + keep_mask[drop_indices] = False + + row = row[keep_mask] + col = col[keep_mask] + + row_global = subset_idx[row] + col_global = subset_idx[col] + row_list.append(row_global) + col_list.append(col_global) + + if len(row_list) == 0: + return paddle.zeros([2, 0], dtype="int64") + + row = paddle.concat(row_list) + col = paddle.concat(col_list) + row = paddle.squeeze(row) + col = paddle.squeeze(col) + return paddle.stack([row, col], axis=0) + + +def radius_simple( + x: paddle.Tensor, + y: paddle.Tensor, + r: float, + batch_x: paddle.Tensor, + batch_y: paddle.Tensor, + max_num_neighbors: int = 32, +) -> tuple[paddle.Tensor, paddle.Tensor]: + batch_size = max(int(batch_x.max().item()), int(batch_y.max().item())) + 1 + x_idx_list, y_idx_list = [], [] + + for b in range(batch_size): + mask_x = batch_x == b + mask_y = batch_y == b + + subset_x = x[mask_x] + subset_y = y[mask_y] + idx_x = paddle.nonzero(mask_x, as_tuple=True)[0] + idx_y = paddle.nonzero(mask_y, as_tuple=True)[0] + + nx, ny = subset_x.shape[0], subset_y.shape[0] + if nx == 0 or ny == 0: + continue + + dist = ( + paddle.sum(subset_x**2, axis=1, keepdim=True) + + paddle.sum(subset_y**2, axis=1, keepdim=True).T + - 2 * paddle.matmul(subset_x, subset_y.T) + ) + dist = paddle.clip(dist, min=0.0) + + adj = dist <= r * r + row, col = paddle.nonzero(adj, as_tuple=True) + + if row.shape[0] > 0: + if max_num_neighbors < 1000000: + unique_rows, counts = paddle.unique(row, return_counts=True) + keep_mask = paddle.ones_like(row, dtype="bool") + + for node, count in zip(unique_rows, counts): + if count > max_num_neighbors: + node_mask = row == node + edge_indices = paddle.nonzero(node_mask, as_tuple=True)[0] + perm = paddle.randperm(count.item()) + drop_indices = edge_indices[perm[max_num_neighbors:]] + keep_mask[drop_indices] = False + + row = row[keep_mask] + col = col[keep_mask] + + x_global = idx_x[row] + y_global = idx_y[col] + x_idx_list.append(x_global) + y_idx_list.append(y_global) + + if len(x_idx_list) == 0: + return paddle.zeros([0], dtype="int64"), paddle.zeros([0], dtype="int64") + + x_idx = paddle.concat(x_idx_list) + y_idx = paddle.concat(y_idx_list) + + return y_idx, x_idx + + +def radius_atoms_to_grids( + x: paddle.Tensor, + y: paddle.Tensor, + r: float, + batch_x: paddle.Tensor, + batch_y: paddle.Tensor, + max_num_neighbors: int = 32, +) -> tuple[paddle.Tensor, paddle.Tensor]: + batch_size = max(int(batch_x.max().item()), int(batch_y.max().item())) + 1 + + grid_idx_list, atom_idx_list = [], [] + r_squared = r * r + + for b in range(batch_size): + atom_mask = batch_x == b + grid_mask = batch_y == b + + if not atom_mask.any() or not grid_mask.any(): + continue + + atoms = x[atom_mask].numpy() + atom_indices = paddle.nonzero(atom_mask, as_tuple=True)[0] + grid_indices = paddle.nonzero(grid_mask, as_tuple=True)[0] + + min_coords = np.min(atoms, axis=0) - r + max_coords = np.max(atoms, axis=0) + r + cell_size = r + + atom_grid = {} + for i, atom_pos in enumerate(atoms): + cell_idx = tuple(np.floor((atom_pos - min_coords) / cell_size).astype(int)) + if cell_idx not in atom_grid: + atom_grid[cell_idx] = [] + atom_grid[cell_idx].append(i) + + grids = y[grid_mask] + grid_chunk_size = 10000 + + for start_idx in range(0, grids.shape[0], grid_chunk_size): + end_idx = min(start_idx + grid_chunk_size, grids.shape[0]) + grid_chunk = grids[start_idx:end_idx] + grid_chunk_np = grid_chunk.numpy() + + batch_grid_idx, batch_atom_idx = [], [] + + for i, grid_pos in enumerate(grid_chunk_np): + cell_idx = tuple( + np.floor((grid_pos - min_coords) / cell_size).astype(int) + ) + + nearby_atoms = [] + for dx in [-1, 0, 1]: + for dy in [-1, 0, 1]: + for dz in [-1, 0, 1]: + nei_cell = ( + cell_idx[0] + dx, + cell_idx[1] + dy, + cell_idx[2] + dz, + ) + if nei_cell in atom_grid: + nearby_atoms.extend(atom_grid[nei_cell]) + + if not nearby_atoms: + continue + + atom_pos = atoms[nearby_atoms] + dists = np.sum((atom_pos - grid_pos) ** 2, axis=1) + valid_mask = dists <= r_squared + + valid_atoms = np.array(nearby_atoms)[valid_mask] + n_valid = valid_atoms.size + + if n_valid > 0: + if n_valid > max_num_neighbors: + perm = np.random.permutation(n_valid) + valid_atoms = valid_atoms[perm[:max_num_neighbors]] + + batch_grid_idx.extend([i + start_idx] * len(valid_atoms)) + batch_atom_idx.extend(valid_atoms.tolist()) + + if batch_grid_idx: + global_grid_idx = grid_indices[batch_grid_idx].numpy() + global_atom_idx = atom_indices[batch_atom_idx].numpy() + + grid_idx_list.append(paddle.to_tensor(global_grid_idx, dtype="int64")) + atom_idx_list.append(paddle.to_tensor(global_atom_idx, dtype="int64")) + + if not grid_idx_list: + return paddle.zeros([0], dtype="int64"), paddle.zeros([0], dtype="int64") + + grid_idx = paddle.concat(grid_idx_list) + atom_idx = paddle.concat(atom_idx_list) + + if len(grid_idx.shape) > 1: + grid_idx = paddle.squeeze(grid_idx, axis=-1) + if len(atom_idx.shape) > 1: + atom_idx = paddle.squeeze(atom_idx, axis=-1) + return grid_idx, atom_idx + + +def radius_graph_grid( + x: paddle.Tensor, + r: float, + batch: paddle.Tensor, + loop: bool = False, + max_num_neighbors: int = 32, +) -> paddle.Tensor: + x_cpu = x.numpy() + batch_cpu = batch.numpy() + batch_size = int(batch.max().item()) + 1 + + row_list, col_list = [], [] + + for b in range(batch_size): + mask = batch_cpu == b + if not mask.any(): + continue + + subset_x = x_cpu[mask] + mask_indices = np.where(mask)[0] + n = subset_x.shape[0] + + min_coords = np.min(subset_x, axis=0) - r + max_coords = np.max(subset_x, axis=0) + r + cell_size = r + + grid_dict = {} + for i in range(n): + cell_idx = tuple( + np.floor((subset_x[i] - min_coords) / cell_size).astype(int) + ) + if cell_idx not in grid_dict: + grid_dict[cell_idx] = [] + grid_dict[cell_idx].append(i) + + rows, cols = [], [] + for i in range(n): + point = subset_x[i] + cell_idx = tuple(np.floor((point - min_coords) / cell_size).astype(int)) + + neighbor_indices = [] + for dx in [-1, 0, 1]: + for dy in [-1, 0, 1]: + for dz in [-1, 0, 1]: + nei_idx = (cell_idx[0] + dx, cell_idx[1] + dy, cell_idx[2] + dz) + if nei_idx in grid_dict: + neighbor_indices.extend(grid_dict[nei_idx]) + + if neighbor_indices: + neighbors = subset_x[neighbor_indices] + dists = np.sum((neighbors - point) ** 2, axis=1) + valid = dists <= r * r + + if not loop: + valid = valid & (np.array(neighbor_indices) != i) + + valid_indices = np.array(neighbor_indices)[valid] + + if len(valid_indices) > max_num_neighbors: + perm = np.random.permutation(len(valid_indices)) + valid_indices = valid_indices[perm[:max_num_neighbors]] + + if len(valid_indices) > 0: + rows.extend([i] * len(valid_indices)) + cols.extend(valid_indices.tolist()) + + if rows: + global_rows = mask_indices[rows] + global_cols = mask_indices[cols] + + row_tensor = paddle.to_tensor(global_rows, dtype="int64") + col_tensor = paddle.to_tensor(global_cols, dtype="int64") + + row_list.append(row_tensor) + col_list.append(col_tensor) + + if not row_list: + return paddle.zeros([2, 0], dtype="int64") + + row = paddle.concat(row_list) + col = paddle.concat(col_list) + row = paddle.squeeze(row, axis=-1) + col = paddle.squeeze(col, axis=-1) + return paddle.stack([row, col], axis=0) + + +def radius_grid( + x: paddle.Tensor, + y: paddle.Tensor, + r: float, + batch_x: paddle.Tensor, + batch_y: paddle.Tensor, + max_num_neighbors: int = 32, +) -> tuple[paddle.Tensor, paddle.Tensor]: + x_cpu = x.numpy() + y_cpu = y.numpy() + batch_x_cpu = batch_x.numpy() + batch_y_cpu = batch_y.numpy() + + batch_size = max(int(batch_x.max().item()), int(batch_y.max().item())) + 1 + + x_idx_list, y_idx_list = [], [] + + for b in range(batch_size): + mask_x = batch_x_cpu == b + mask_y = batch_y_cpu == b + + if not mask_x.any() or not mask_y.any(): + continue + + subset_x = x_cpu[mask_x] + subset_y = y_cpu[mask_y] + idx_x = np.where(mask_x)[0] + idx_y = np.where(mask_y)[0] + + nx, ny = subset_x.shape[0], subset_y.shape[0] + + min_coords = ( + np.min(np.vstack([subset_x.min(axis=0), subset_y.min(axis=0)]), axis=0) - r + ) + max_coords = ( + np.max(np.vstack([subset_x.max(axis=0), subset_y.max(axis=0)]), axis=0) + r + ) + cell_size = r + + grid_dict = {} + for i in range(ny): + cell_idx = tuple( + np.floor((subset_y[i] - min_coords) / cell_size).astype(int) + ) + if cell_idx not in grid_dict: + grid_dict[cell_idx] = [] + grid_dict[cell_idx].append(i) + + batch_x_idx, batch_y_idx = [], [] + + for i in range(nx): + point = subset_x[i] + cell_idx = tuple(np.floor((point - min_coords) / cell_size).astype(int)) + + neighbor_indices = [] + for dx in [-1, 0, 1]: + for dy in [-1, 0, 1]: + for dz in [-1, 0, 1]: + nei_idx = (cell_idx[0] + dx, cell_idx[1] + dy, cell_idx[2] + dz) + if nei_idx in grid_dict: + neighbor_indices.extend(grid_dict[nei_idx]) + + if neighbor_indices: + neighbors = subset_y[neighbor_indices] + dists = np.sum((neighbors - point) ** 2, axis=1) + valid = dists <= r * r + + valid_indices = np.array(neighbor_indices)[valid] + + if len(valid_indices) > max_num_neighbors: + perm = np.random.permutation(len(valid_indices)) + valid_indices = valid_indices[perm[:max_num_neighbors]] + + if len(valid_indices) > 0: + batch_x_idx.extend([i] * len(valid_indices)) + batch_y_idx.extend(valid_indices.tolist()) + + if batch_x_idx: + global_x_idx = idx_x[batch_x_idx] + global_y_idx = idx_y[batch_y_idx] + + x_tensor = paddle.to_tensor(global_x_idx, dtype="int64") + y_tensor = paddle.to_tensor(global_y_idx, dtype="int64") + + x_idx_list.append(x_tensor) + y_idx_list.append(y_tensor) + + if not x_idx_list: + return paddle.zeros([0], dtype="int64"), paddle.zeros([0], dtype="int64") + + x_idx = paddle.concat(x_idx_list) + y_idx = paddle.concat(y_idx_list) + + return y_idx, x_idx diff --git a/ppmat/datasets/high_level_water_dataset.py b/ppmat/datasets/high_level_water_dataset.py new file mode 100644 index 00000000..1af8332a --- /dev/null +++ b/ppmat/datasets/high_level_water_dataset.py @@ -0,0 +1,407 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import math +import os +import os.path as osp +import pickle +from typing import Any +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional + +import numpy as np +import paddle.distributed as dist +from ase import Atoms +from ase.io import read as ase_read +from ase.units import GPa +from paddle.io import Dataset +from pymatgen.io.ase import AseAtomsAdaptor + +from ppmat.datasets.build_structure import BuildStructure +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.datasets.custom_data_type import ConcatNumpyWarper +from ppmat.models import build_graph_converter +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils.misc import is_equal + + +class HighLevelWaterDataset(Dataset): + """The high level water dataset, this is toy dataset from mattersim: https://github.com/microsoft/mattersim + + Args: + path (str): File path to the dataset file. + force_key (Optional[str], optional): Key used to retrieve force values when + returning properties. If None, force values won't be included in results. + Defaults to 'force'. + stress_key (Optional[str], optional): Key used to retrieve stress values when + returning properties. If None, stress values won't be included in results. + Defaults to None. + build_structure_cfg (Dict, optional): The configs for building the structure. + Defaults to None. + build_graph_cfg (Dict, optional): The configs for building the graph. Defaults + to None. + transforms (Optional[Callable], optional): The preprocess transforms for each + sample. Defaults to None. + cache_path (Optional[str], optional): If a cache_path is set, structures and + graph will be read directly from this path; if the cache does not exist, + the converted structures and graph will be saved to this path. Defaults + to None. + overwrite (bool, optional): Overwrite the existing cache file at the given + path if it already exists. Defaults to False. + filter_unvalid (bool, optional): Whether to filter out invalid samples. Defaults + to True. + """ + + name = "high_level_water" + url = "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/high_level_water/high_level_water.zip" + md5 = "4bf53db054e6e8fb55a38f7cbdf6fea6" + + def __init__( + self, + path: str, # ./data/high_level_water/high_level_water.xyz + energy_key: Optional[str] = "energy", + force_key: Optional[str] = "force", + stress_key: Optional[str] = None, + build_structure_cfg: Dict = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, # for compatibility + ): + super().__init__() + + if not osp.exists(path): + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + path = osp.join(root_path, self.name, osp.basename(path)) + + self.path = path + self.energy_key = energy_key + self.force_key = force_key + self.stress_key = stress_key + + self.property_names = [] + if energy_key is not None: + self.property_names.append(energy_key) + if force_key is not None: + self.property_names.append(force_key) + if stress_key is not None: + self.property_names.append(stress_key) + + if build_structure_cfg is None: + build_structure_cfg = { + "format": "ase_atoms", + "primitive": False, + "niggli": False, + "num_cpus": 1, + } + logger.message( + "The build_structure_cfg is not set, will use the default " + f"configs: {build_structure_cfg}" + ) + + self.build_structure_cfg = build_structure_cfg + self.build_graph_cfg = build_graph_cfg + self.transforms = transforms + + if cache_path is not None: + self.cache_path = cache_path + else: + # for example: + # path = ./data/high_level_water_dataset/high_level_water_dataset.xyz + # cache_path= ./data/high_level_water_dataset_cache/high_level_water_dataset + self.cache_path = osp.join( + osp.split(path)[0] + "_cache", osp.splitext(osp.basename(path))[0] + ) + logger.info(f"Cache path: {self.cache_path}") + + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + + self.cache_exists = True if osp.exists(self.cache_path) else False + self.row_data, self.num_samples = self.read_data(path) + logger.info(f"Load {self.num_samples} samples from {path}") + self.property_data = self.read_property_data(self.row_data) + + structure_cache_path = osp.join(self.cache_path, "structures") + graph_cache_path = osp.join(self.cache_path, "graphs") + + if self.cache_exists and not overwrite: + logger.warning( + "Cache enabled. If a cache file exists, it will be automatically " + "read and current settings will be ignored. Please ensure that the " + "settings used in match your current settings." + ) + try: + build_structure_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl") + ) + if is_equal(build_structure_cfg_cache, build_structure_cfg): + logger.info( + "The cached build_structure_cfg configuration matches " + "the current settings. Reusing previously generated" + " structural data to optimize performance." + ) + else: + logger.warning( + "build_structure_cfg is different from " + "build_structure_cfg_cache. Will rebuild the structures and " + "graphs." + ) + logger.warning( + "If you want to use the cached structures and graphs, please " + "ensure that the settings used in match your current settings." + ) + overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_structure_cfg.pkl from cache. " + "Will rebuild the structures and graphs(if need)." + ) + overwrite = True + + if build_graph_cfg is not None and not overwrite: + try: + build_graph_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl") + ) + if is_equal(build_graph_cfg_cache, build_graph_cfg): + logger.info( + "The cached build_structure_cfg configuration " + "matches the current settings. Reusing previously " + "generated structural data to optimize performance." + ) + else: + logger.warning( + "build_graph_cfg is different from build_graph_cfg_cache" + ". Will rebuild the graphs." + ) + logger.warning( + "If you want to use the cached structures and graphs, " + "please ensure that the settings used in match your " + "current settings." + ) + overwrite = True + + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_graph_cfg.pkl from cache. " + "Will rebuild the graphs." + ) + overwrite = True + + if overwrite or not self.cache_exists: + # convert strucutes and graphs + # only rank 0 process do the conversion + if dist.get_rank() == 0: + # save build_structure_cfg and build_graph_cfg to cache file + os.makedirs(self.cache_path, exist_ok=True) + self.save_to_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl"), + build_structure_cfg, + ) + self.save_to_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl"), build_graph_cfg + ) + # convert strucutes + structures = BuildStructure(**build_structure_cfg)(self.row_data) + # save structures to cache file + os.makedirs(structure_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(structure_cache_path, f"{i:010d}.pkl"), + structures[i], + ) + logger.info( + f"Save {self.num_samples} structures to {structure_cache_path}" + ) + + if build_graph_cfg is not None: + converter = build_graph_converter(build_graph_cfg) + graphs = converter(structures) + # save graphs to cache file + os.makedirs(graph_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(graph_cache_path, f"{i:010d}.pkl"), graphs[i] + ) + logger.info(f"Save {self.num_samples} graphs to {graph_cache_path}") + + # sync all processes + if dist.is_initialized(): + dist.barrier() + self.structures = [ + osp.join(structure_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + if build_graph_cfg is not None: + self.graphs = [ + osp.join(graph_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + else: + self.graphs = None + + assert ( + len(self.structures) == self.num_samples + ), "The number of structures must be equal to the number of samples." + assert ( + self.graphs is None or len(self.graphs) == self.num_samples + ), "The number of graphs must be equal to the number of samples." + + # filter by property data, since some samples may have no valid properties + if filter_unvalid: + self.filter_unvalid_by_property() + + def read_data(self, path: str, format: str = None): + """Read the data from the given json path. + + Args: + path (str): Path to the data. + """ + if format: + atoms_list = ase_read(path, index=":", format=format) + else: + try: + atoms_list = ase_read(path, index=":") + except Exception as e: + raise ValueError(f"Can not automately guess the file format: {e}") + num_samples = len(atoms_list) + return atoms_list, num_samples + + def atoms_to_structure(self, atoms: Atoms): + return AseAtomsAdaptor().get_structure(atoms) + + def filter_unvalid_by_property(self): + for property_name in self.property_names: + data = self.property_data[property_name] + reserve_idx = [] + for i, data_item in enumerate(data): + if isinstance(data_item, str) or ( + data_item is not None and not math.isnan(data_item) + ): + reserve_idx.append(i) + for key in self.property_data.keys(): + self.property_data[key] = [ + self.property_data[key][i] for i in reserve_idx + ] + + self.row_data = [self.row_data[i] for i in reserve_idx] + self.structures = [self.structures[i] for i in reserve_idx] + if self.graphs is not None: + self.graphs = [self.graphs[i] for i in reserve_idx] + logger.warning( + f"Filter out {len(reserve_idx)} samples with valid properties: " + f"{property_name}" + ) + self.num_samples = len(self.row_data) + logger.warning(f"Remaining {self.num_samples} samples after filtering.") + + def read_property_data(self, data: List[Atoms]): + """Read the property data from the given data and property names. + + Args: + data (Dict): Data that contains the property data. + """ + property_data = {} + if self.energy_key is not None: + property_data[self.energy_key] = [ + data[i].get_potential_energy() for i in range(self.num_samples) + ] + if self.force_key is not None: + property_data[self.force_key] = [ + data[i].get_forces() for i in range(self.num_samples) + ] + if self.stress_key is not None: + property_data[self.stress_key] = [ + data[i].get_stress(voigt=False) / GPa for i in range(self.num_samples) + ] + + return property_data + + def save_to_cache(self, cache_path: str, data: Any): + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def load_from_cache(self, cache_path: str): + if osp.exists(cache_path): + with open(cache_path, "rb") as f: + data = pickle.load(f) + return data + else: + raise FileNotFoundError(f"No such file or directory: {cache_path}") + + def get_structure_array(self, structure): + atom_types = np.array([site.specie.Z for site in structure]) + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + structure_array = { + "frac_coords": ConcatData(structure.frac_coords.astype("float32")), + "cart_coords": ConcatData(structure.cart_coords.astype("float32")), + "atom_types": ConcatData(atom_types), + "lattice": ConcatData(lattice.reshape(1, 3, 3)), + "lengths": ConcatData(lengths), + "angles": ConcatData(angles), + "num_atoms": ConcatData(np.array([tuple(atom_types.shape)[0]])), + } + return structure_array + + def __getitem__(self, idx: int): + """Get item at index idx.""" + data = {} + # get graph + if self.graphs is not None: + graph = self.graphs[idx] + if isinstance(graph, str): + graph = self.load_from_cache(graph) + data["graph"] = graph + else: + structure = self.structures[idx] + if isinstance(structure, str): + structure = self.load_from_cache(structure) + data["structure_array"] = self.get_structure_array(structure) + for property_name in self.property_names: + if property_name == self.force_key: + data[property_name] = ConcatNumpyWarper( + self.property_data[property_name][idx] + ).astype("float32") + elif property_name in self.property_data: + data[property_name] = np.array( + [self.property_data[property_name][idx]] + ).astype("float32") + else: + raise KeyError(f"Property {property_name} not found.") + + data["id"] = ( + self.property_data["id"][idx] if "id" in self.property_data else idx + ) + data = self.transforms(data) if self.transforms is not None else data + + return data + + def __len__(self): + return self.num_samples diff --git a/ppmat/datasets/jarvis_dataset.py b/ppmat/datasets/jarvis_dataset.py new file mode 100644 index 00000000..2d066b41 --- /dev/null +++ b/ppmat/datasets/jarvis_dataset.py @@ -0,0 +1,1044 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import annotations + +import json +import math +import os +import os.path as osp +import pickle +import re +import urllib.request +import zipfile +from collections import defaultdict +from typing import Any +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +import numpy as np +import paddle.distributed as dist +from jarvis.db.figshare import data as jdata +from jarvis.db.figshare import get_db_info +from paddle.io import Dataset + +from ppmat.datasets.build_structure import BuildStructure +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.models import build_graph_converter +from ppmat.utils import logger +from ppmat.utils.misc import is_equal + +# ----------------------------------------------------------------------------- +# JARVIS mirror dataset registry (preferred download entries) +# List available datasets in the format similar to mp2018_dataset +# ----------------------------------------------------------------------------- +JARVIS_MIRROR_DATASETS = [ + { + "name": "dft_3d_2021", + "url": "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/jarvis/jarvis_dft_3d-8-18-2021.json.zip", # noqa + "md5": "8f619035a2cd8030de1ce38ce8b561b2", + }, + { + "name": "alexandria_scan_3d_2024.10.1_jarvis_tools", + "url": "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/jarvis/jarvis_alexandria_scan_3d_2024.10.1_jarvis_tools.json.zip", # noqa + "md5": "ddeee1df79789d8f2b4a89f625864e6b", + }, + { + "name": "cfid_3d", + "url": "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/jarvis/jarvis_cfid_3d-8-18-2021.json.zip", # noqa + "md5": "6efe75ca51aa5fb5c23a5b08fb412a6e", + }, + { + "name": "dft_2d", + "url": "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/jarvis/jdft_2d-4-26-2020.zip", # noqa + "md5": "022c6e321bef034f5bff40e67c81f483", + }, +] + + +class JarvisDataset(Dataset): + """Jarvis Dataset Handler. + + **Jarvis Dataset Overview** + + Download preprocessed data: https://jarvis-materials-design.github.io/dbdocs/thedownloads/ + Github: https://github.com/usnistgov/jarvis/tree/master + + ``` + ------------------------------------------------------------------------------- + | Database name | Number of data-points | Description + ------------------------------------------------------------------------------- + | AGRA_CHO | 214 | AGRA CHO catalyst dataset + | AGRA_COOH | 280 | AGRA COOH catalyst dataset + | AGRA_CO | 193 | AGRA CO catalyst dataset + | AGRA_OH | 875 | AGRA OH catalyst dataset + | AGRA_O | 1000 | AGRA Oxygen catalyst dataset + | aflow2 | 400k | AFLOW dataset + | alex_pbe_1d_all | 100k | Alexandria DB all 1D materials with PBE + | alex_pbe_2d_all | 200k | Alexandria DB all 2D materials with PBE + | alex_pbe_3d_all | 5 million | Alexandria DB all 3D materials with PBE + | alex_pbe_hull | 116k | Alexandria DB convex hull stable materials + with PBE functional + | alex_pbesol_3d_all | 500k | Alexandria DB all 3D materials + with PBEsol + | alex_scan_3d_all | 500k | Alexandria DB all 3D materials + with SCAN + | alignn_ff_db | 307113 | Energy per atom, forces and stresses + for ALIGNN-FF trainig for 75k materials. + | arXiv | 1796911 | arXiv dataset 1.8 million title, + abstract and id dataset + | arxiv_summary | 137927 | arXiv summary dataset + | c2db | 3514 | Various properties in C2DB database + | cccbdb | 1333 | CCCBDB dataset + | cfid_3d | 55723 | Various 3D materials properties + in JARVIS-DFT database computed + with OptB88vdW and TBmBJ methods with CFID + | cod | 431778 | Atomic structures from + crystallographic open database + | dft_2d_2021 | 1079 | Various 2D materials + properties in JARVIS-DFT database computed with OptB88vdW + | dft_2d | 1109 | Various 2D materials properties + in JARVIS-DFT database computed with OptB88vdW + | dft_3d_2021 | 55723 | Various 3D materials properties in + JARVIS-DFT database computed with + OptB88vdW and TBmBJ methods + | dft_3d | 75993 | Various 3D materials + properties in JARVIS-DFT database computed with OptB88vdW and TBmBJ methods + | edos_pdos | 48469 | Normalized electron and phonon density + of states with interpolated values and fixed number of bins + | halide_peroskites | 229 | Halide perovskite dataset + | hmof | 137651 | Hypothetical MOF database + | hopv | 4855 | Various properties of molecules + in HOPV15 dataset + | interfacedb | 593 | Interface property dataset + | jff | 2538 | Various 3D materials properties in + JARVIS-FF database computed with several force-fields + | m3gnet_mpf_1.5mil | 1.5 million | 1.5 million structures and their energy, + forces and stresses in MP + | m3gnet_mpf | 168k | 168k structures and their energy, + forces and stresses in MP + | megnet2 | 133k | 133k materials and their + formation energy in MP + | megnet | 69239 | Formation energy and bandgaps + of 3D materials properties in Materials project database + as on 2018, used in megnet + | mlearn | 1730 | Machine learning force-field + for elements datasets + | mp_3d_2020 | 127k | CFID descriptors for materials project + | mp_3d | 84k | CFID descriptors for 84k materials project + | mxene275 | 275 | MXene dataset + | ocp100k | 149886 | Open Catalyst 100000 training, + rest validation and test dataset + | ocp10k | 59886 | Open Catalyst 10000 training, + rest validation and test dataset + | ocp_all | 510214 | Open Catalyst 460328 training, + rest validation and test dataset + | omdb | 12500 | Bandgaps for organic polymers + in OMDB database + | oqmd_3d_no_cfid | 817636 | Formation energies + and bandgaps of 3D materials from OQMD database + | oqmd_3d | 460k | CFID descriptors for 460k materials in OQMD + | pdbbind_core | 195 | Bio-molecular complexes database + from PDBBind core + | pdbbind | 11189 | Bio-molecular complexes database + from PDBBind v2015 + | polymer_genome | 1073 | Electronic bandgap and diecltric constants + of crystall ine polymer in polymer genome database + | qe_tb | 829574 | Various 3D materials properties + in JARVIS-QETB database + | qm9_dgl | 130829 | Various properties of molecules + in QM9 dgl database + | qm9_std_jctc | 130829 | Various properties of molecules + in QM9 database + | qmof | 20425 | Bandgaps and total energies of + metal organic frameowrks in QMOF database + | raw_files | 144895 | Figshare links to download + raw calculations VASP files from JARVIS-DFT + | snumat | 10481 | Bandgaps with hybrid functional + | ssub | 1726 | SSUB formation energy + for chemical formula dataset + | stm | 1132 | 2D materials STM images + in JARVIS-STM database + | supercon_2d | 161 | 2D superconductor DFT dataset + | supercon_3d | 1058 | 3D superconductor DFT dataset + | supercon_chem | 16414 | Superconductor chemical formula dataset + | surfacedb | 607 | Surface property dataset + | tinnet_N | 329 | TinNet Nitrogen catalyst dataset + | tinnet_OH | 748 | TinNet OH group catalyst dataset + | tinnet_O | 747 | TinNet Oxygen catalyst dataset + | twod_matpd | 6351 | Formation energy and bandgaps + of 2D materials properties in 2DMatPedia database + | vacancydb | 464 | Vacancy formation energy dataset + | wtbh_electron | 1440 | 3D and 2D materials + Wannier tight-binding Hamiltonian database + for electrons with spin-orbit coupling in JARVIS-WTB (Keyword: 'WANN') + | wtbh_phonon | 15502 | 3D and 2D materials + Wannier tight-binding Hamiltonian + for phonons at Gamma with finite difference (Keyword:FD-ELAST) + ------------------------------------------------------------------------------- + dft_3d (3D-materials curated data) Data Format (Example)** + + The dataset contains metadata for JARVIS-DFT data for 3D materials. + Specifically, the `dft_3d` dataset is a list of dictionaries, + where each sample (`dict`) contains keys such as: + + Basic Information: + ------------------ + - jid (str): Unique Jarvis material ID + - formula (str): Chemical formula + - search (str): Elemental search keyword + - spg (int): Space group number (same as spg_number) + - spg_number (int): Space group number + - spg_symbol (str): Space group symbol + - crys (str): Crystal system (e.g., tetragonal) + - dimensionality (str): Material dimensionality (e.g., 3D bulk) + - typ (str): Material type (e.g., bulk, monolayer) + - reference (str): Cross-reference ID from Materials Project + - icsd (str): ICSD database ID (if available) + - xml_data_link (str): Link to full DFT result in XML format + - raw_files (List): Raw files (if available) + + Crystal Structure: + ------------------ + - atoms (dict[str, list[Any]]): + - lattice_mat (List): Lattice matrix + - coords (List): Atomic coordinates + - elements (List): Element types + - abc (List): Lattice parameters + - angles (List): Lattice angles + - cartesian (bool): Whether coordinates are Cartesian + - props (List): properties + - nat (int): Number of atoms in the unit cell + - density (float): Material density + + DFT Calculation Settings: + ------------------------- + - func (str): Exchange-correlation functional used (e.g. OptB88vdW) + - encut (int): Plane-wave energy cutoff + - kpoint_length_unit (int): k-point sampling density + + Thermodynamic Properties: + ------------------------- + - formation_energy_peratom (float): Formation energy per atom + - optb88vdw_total_energy (float): Total DFT energy + - ehull (float): Energy above the convex hull (measures stability) + - exfoliation_energy (float): + Exfoliation energies for van der Waals bonded materials + + Electronic Properties: + ---------------------- + - optb88vdw_bandgap (float): Band gap from OptB88vdW functional + - mbj_bandgap (float): Band gap from modified Becke-Johnson (MBJ) functional + - hse_gap (float): Band gap from HSE hybrid functional + - effective_masses_300K (dict): Effective masses of electrons and holes at 300K + - avg_elec_mass (float): Average effective mass of electrons + - avg_hole_mass (float): Average effective mass of holes + + Magnetic Properties: + -------------------- + - magmom_outcar (float): Initial magnetic moment (from OSZICAR file) + - magmom_oszicar (float): Final magnetic moment (from OUTCAR file) + + Dielectric and Optical Properties: + ---------------------------------- + - epsx (float): Dielectric tensor component along x-axis + - epsy (float): Dielectric tensor component along y-axis + - epsz (float): Dielectric tensor component along z-axis + - mepsx (float): Electronic contribution to dielectric constant along x + - mepsy (float): Electronic contribution to dielectric constant along y + - mepsz (float): Electronic contribution to dielectric constant along z + - slme (float): Spectroscopy limited maximum efficiency + + Elastic and Mechanical Properties: + ---------------------------------- + - elastic_tensor (List): Elastic tensor matrix + - bulk_modulus_kv (float): Bulk modulus + - shear_modulus_gv (float): Shear modulus + - poisson (float): Poisson ratio + - max_ir_mode (float): Maximum infrared (IR) mode intensity + - min_ir_mode (float): Minimum infrared (IR) mode intensity + - max_efg (float): Maximum electric field gradient + - efg (float): Electric field gradients + + Thermoelectric Properties: + -------------------------- + - n_seebeck (float): Seebeck coefficient for n-type carriers + - p_seebeck (float): Seebeck coefficient for p-type carriers + - ncond (float): Electrical conductivity for n-type carriers + - pcond (float): Electrical conductivity for p-type carriers + - nkappa (float): Thermal conductivity for n-type carriers + - pkappa (float): Thermal conductivity for p-type carriers + - n-powerfact (float): Power factor for n-type + - p-powerfact (float): Power factor for p-type + + Vibrational and Phonon Properties: + ---------------------------------- + - modes (List): Phonon modes + - maxdiff_mesh (float): Maximum difference in mesh calculations + - maxdiff_bz (float): Maximum difference in BZ calculations + + Piezoelectric and Dielectric Tensor (DFPT): + -------------------------------------------- + - dfpt_piezo_max_eij (float): + Max piezoelectric tensor (strain-charge form) + - dfpt_piezo_max_dij (float): + Max piezoelectric tensor (stress-charge form) + - dfpt_piezo_max_dielectric (float): + Max total dielectric constant + - dfpt_piezo_max_dielectric_electronic (float): + Electronic part of dielectric constant + - dfpt_piezo_max_dielectric_ionic (float): + Ionic part of dielectric constant + + Superconductivity: + ------------------ + - Tc_supercon (float): Superconducting critical temperature + + + **Notes:** + - Missing values are represented as `na` + + + Args: + path (str): The path of the dataset, + if path is not exists, it will be downloaded. + + jarvis_data_name (str): The name of the jarvis dataset. Default is "custom". + + property_names (Union[str, List[str]]): Property names you want to use, + for jarvis dataset. + + url (Optional[str], optional): Custom dataset download URL. If provided, + the dataset will be downloaded from this URL instead of checking the + registry. This supports specific datasets like jdft_2d. + + build_structure_cfg (Dict, optional): The configs for building the pymatgen + structure from cif string, if not specified, the default setting will be + used. Defaults to None. + + build_graph_cfg (Dict, optional): The configs for building the graph from + structure. Defaults to None. + + transforms (Optional[Callable], optional): The preprocess transforms for each + sample. Defaults to None. + + cache_path (Optional[str], optional): If a cache_path is set, structures and + graph will be read directly from this path; if the cache does not exist, + the converted structures and graph will be saved to this path. Defaults + to None. + + overwrite (bool, optional): Overwrite the existing cache file at the given cache + path if it already exists. Defaults to False. + + filter_unvalid (bool, optional): Whether to filter out unvalid samples. Defaults + to True. + + """ + + def __init__( + self, + path: str, + jarvis_data_name: str = "custom", # Default to custom if url is provided + property_names: Union[str, List[str]] = None, + url: Optional[str] = None, # New argument + build_structure_cfg: Dict = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, + ): + super().__init__() + + self.url = url + + # 1. Determine Path and Filename logic + # If URL is explicitly provided (Adapter logic), use it to determine filename + if self.url is not None: + zip_basename = osp.basename(self.url) + # e.g. jdft_2d-4-26-2020.zip + self.path = osp.join(path, zip_basename) + logger.info(f"Using provided URL: {self.url}") + else: + # Original logic: Lookup via jarvis_data_name + db_info = get_db_info() + if jarvis_data_name not in db_info: + raise ValueError(f"Unknown dataset name: {jarvis_data_name}") + + _, jarvis_data_filename, _, _ = db_info[jarvis_data_name] + self.path = osp.join(path, jarvis_data_filename + ".zip") + + # Obtain property names + if isinstance(property_names, str): + property_names = [property_names] + self.property_names = property_names if property_names is not None else [] + + # Handle structure_cfg + if build_structure_cfg is None: + build_structure_cfg = { + "format": "jarvis", + "primitive": False, + "niggli": True, + "num_cpus": 1, + } + logger.message( + "The build_structure_cfg is not set, will use the default " + f"configs: {build_structure_cfg}" + ) + self.build_structure_cfg = build_structure_cfg + + self.build_graph_cfg = build_graph_cfg + + # Determine cache directory name suffix + if build_graph_cfg is not None: + graph_converter_name = re.sub( + r"(?", // Crystal structure in CIF format + "1": "", + // ... + }, + "material_id": { + "0": "mvc-8139", // Unique material identifier + "1": "mvc-600", + // ... + }, + "formation_energy_per_atom": { // Formation energy (eV/atom) + "0": -1.8169, + "1": -1.8948, + // ... + }, + "band_gap": { // Electronic band gap (eV) + "0": 0.0149, + "1": 0.0, + // ... + }, + "G": { // Shear modulus (GPa) + "0": 45.0, + "1": null, // Missing value indicator + // ... + }, + "K": { // Bulk modulus (GPa) + "0": 91.0, + "1": null, // Missing value indicator + // ... + } + } + ``` + + **Notes** + - Missing values are represented as `null` in JSON and converted to `NaN` during + loading + - CIF parsing requires additional dependencies (e.g., pymatgen) + - For custom data, ensure index consistency across all fields + + + Args: + path (str, optional): The path of the dataset, if path is not exists, it will + be downloaded. Defaults to "./data/mp18/mp.2018.6.1.json". + property_names (Optional[list[str]], optional): Property names you want to use, + for mp2018.6.1, the property_names should be selected from + ["formation_energy_per_atom", "band_gap", "G", "K"]. Defaults to None. + build_structure_cfg (Dict, optional): The configs for building the pymatgen + structure from cif string, if not specified, the default setting will be + used. Defaults to None. + build_graph_cfg (Dict, optional): The configs for building the graph from + structure. Defaults to None. + transforms (Optional[Callable], optional): The preprocess transforms for each + sample. Defaults to None. + cache_path (Optional[str], optional): If a cache_path is set, structures and + graph will be read directly from this path; if the cache does not exist, + the converted structures and graph will be saved to this path. Defaults + to None. + overwrite (bool, optional): Overwrite the existing cache file at the given cache + path if it already exists. Defaults to False. + filter_unvalid (bool, optional): Whether to filter out unvalid samples. Defaults + to True. + """ + + name = "mp2018_train_60k" + url = "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2018/mp2018_train_60k.zip" + md5 = "216202f16a5081358798e15c060facee" + + def __init__( + self, + path: str = "./data/mp18/mp.2018.6.1.json", + property_names: Optional[list[str]] = None, + build_structure_cfg: Dict = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, # for compatibility + ): + super().__init__() + + if not osp.exists(path): + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + path = osp.join(root_path, self.name, osp.basename(path)) + + self.path = path + if isinstance(property_names, str): + property_names = [property_names] + + if build_structure_cfg is None: + build_structure_cfg = { + "format": "cif_str", + "primitive": False, + "niggli": True, + "num_cpus": 1, + } + logger.message( + "The build_structure_cfg is not set, will use the default " + f"configs: {build_structure_cfg}" + ) + + self.property_names = property_names if property_names is not None else [] + self.build_structure_cfg = build_structure_cfg + self.build_graph_cfg = build_graph_cfg + self.transforms = transforms + + if cache_path is not None: + self.cache_path = cache_path + else: + # for example: + # path = ./data/mp2018_train_60k/mp2018_train_60k_train.json + # cache_path = ./data/mp2018_train_60k_cache/mp2018_train_60k_train + self.cache_path = osp.join( + osp.split(path)[0] + "_cache", osp.splitext(osp.basename(path))[0] + ) + logger.info(f"Cache path: {self.cache_path}") + + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + + self.cache_exists = True if osp.exists(self.cache_path) else False + self.row_data, self.num_samples = self.read_data(path) + logger.info(f"Load {self.num_samples} samples from {path}") + self.property_data = self.read_property_data(self.row_data, self.property_names) + + if self.cache_exists and not overwrite: + logger.warning( + "Cache enabled. If a cache file exists, it will be automatically " + "read and current settings will be ignored. Please ensure that the " + "settings used in match your current settings." + ) + try: + build_structure_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl") + ) + if is_equal(build_structure_cfg_cache, build_structure_cfg): + logger.info( + "The cached build_structure_cfg configuration matches " + "the current settings. Reusing previously generated" + " structural data to optimize performance." + ) + else: + logger.warning( + "build_structure_cfg is different from " + "build_structure_cfg_cache. Will rebuild the structures and " + "graphs." + ) + logger.warning( + "If you want to use the cached structures and graphs, please " + "ensure that the settings used in match your current settings." + ) + overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_structure_cfg.pkl from cache. " + "Will rebuild the structures and graphs(if need)." + ) + overwrite = True + + if build_graph_cfg is not None and not overwrite: + try: + build_graph_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl") + ) + if is_equal(build_graph_cfg_cache, build_graph_cfg): + logger.info( + "The cached build_structure_cfg configuration " + "matches the current settings. Reusing previously " + "generated structural data to optimize performance." + ) + else: + logger.warning( + "build_graph_cfg is different from build_graph_cfg_cache" + ". Will rebuild the graphs." + ) + logger.warning( + "If you want to use the cached structures and graphs, " + "please ensure that the settings used in match your " + "current settings." + ) + overwrite = True + + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_graph_cfg.pkl from cache. " + "Will rebuild the graphs." + ) + overwrite = True + + structure_cache_path = osp.join(self.cache_path, "structures") + graph_cache_path = osp.join(self.cache_path, "graphs") + if overwrite or not self.cache_exists: + # convert strucutes and graphs + # only rank 0 process do the conversion + if dist.get_rank() == 0: + # save build_structure_cfg and build_graph_cfg to cache file + os.makedirs(self.cache_path, exist_ok=True) + self.save_to_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl"), + build_structure_cfg, + ) + self.save_to_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl"), build_graph_cfg + ) + # convert strucutes + structures = BuildStructure(**build_structure_cfg)( + self.row_data["structure"] + ) + # save structures to cache file + os.makedirs(structure_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(structure_cache_path, f"{i:010d}.pkl"), + structures[i], + ) + logger.info( + f"Save {self.num_samples} structures to {structure_cache_path}" + ) + + if build_graph_cfg is not None: + converter = build_graph_converter(build_graph_cfg) + graphs = converter(structures) + # save graphs to cache file + os.makedirs(graph_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(graph_cache_path, f"{i:010d}.pkl"), graphs[i] + ) + logger.info(f"Save {self.num_samples} graphs to {graph_cache_path}") + + # sync all processes + if dist.is_initialized(): + dist.barrier() + self.structures = [ + osp.join(structure_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + if build_graph_cfg is not None: + self.graphs = [ + osp.join(graph_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + else: + self.graphs = None + + assert ( + len(self.structures) == self.num_samples + ), "The number of structures must be equal to the number of samples." + assert ( + self.graphs is None or len(self.graphs) == self.num_samples + ), "The number of graphs must be equal to the number of samples." + + # filter by property data, since some samples may have no valid properties + if filter_unvalid: + self.filter_unvalid_by_property() + + def read_data(self, path: str): + """Read the data from the given json path. + + Args: + path (str): Path to the data. + """ + json_data = read_json(path) + num_samples = len(json_data["structure"]) + + idxs = list(json_data["structure"]) + data = defaultdict(list) + for key in json_data.keys(): + for idx in idxs: + data[key].append(json_data[key][idx]) + return data, num_samples + + def filter_unvalid_by_property(self): + for property_name in self.property_names: + data = self.property_data[property_name] + reserve_idx = [] + for i, data_item in enumerate(data): + if isinstance(data_item, str) or ( + data_item is not None and not math.isnan(data_item) + ): + reserve_idx.append(i) + for key in self.property_data.keys(): + self.property_data[key] = [ + self.property_data[key][i] for i in reserve_idx + ] + + self.row_data = [self.row_data[i] for i in reserve_idx] + self.structures = [self.structures[i] for i in reserve_idx] + if self.graphs is not None: + self.graphs = [self.graphs[i] for i in reserve_idx] + logger.warning( + f"Filter out {len(reserve_idx)} samples with valid properties: " + f"{property_name}" + ) + self.num_samples = len(self.row_data) + logger.warning(f"Remaining {self.num_samples} samples after filtering.") + + def read_property_data(self, data: Dict, property_names: list[str]): + """Read the property data from the given data and property names. + + Args: + data (Dict): Data that contains the property data. + property_names (list[str]): Property names. + """ + property_data = {} + for property_name in property_names: + if property_name not in data: + raise ValueError(f"{property_name} not found in the data") + property_data[property_name] = [ + data[property_name][i] for i in range(self.num_samples) + ] + return property_data + + def save_to_cache(self, cache_path: str, data: Any): + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def load_from_cache(self, cache_path: str): + if osp.exists(cache_path): + with open(cache_path, "rb") as f: + data = pickle.load(f) + return data + else: + raise FileNotFoundError(f"No such file or directory: {cache_path}") + + def get_structure_array(self, structure): + atom_types = np.array([site.specie.Z for site in structure]) + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + structure_array = { + "frac_coords": ConcatData(structure.frac_coords.astype("float32")), + "cart_coords": ConcatData(structure.cart_coords.astype("float32")), + "atom_types": ConcatData(atom_types), + "lattice": ConcatData(lattice.reshape(1, 3, 3)), + "lengths": ConcatData(lengths), + "angles": ConcatData(angles), + "num_atoms": ConcatData(np.array([tuple(atom_types.shape)[0]])), + } + return structure_array + + def __getitem__(self, idx: int): + """Get item at index idx.""" + data = {} + # get graph + if self.graphs is not None: + graph = self.graphs[idx] + if isinstance(graph, str): + graph = self.load_from_cache(graph) + data["graph"] = graph + else: + structure = self.structures[idx] + if isinstance(structure, str): + structure = self.load_from_cache(structure) + data["structure_array"] = self.get_structure_array(structure) + for property_name in self.property_names: + if property_name in self.property_data: + data[property_name] = np.array( + [self.property_data[property_name][idx]] + ).astype("float32") + else: + raise KeyError(f"Property {property_name} not found.") + + data["id"] = ( + self.property_data["id"][idx] if "id" in self.property_data else idx + ) + data = self.transforms(data) if self.transforms is not None else data + + return data + + def __len__(self): + return self.num_samples diff --git a/ppmat/datasets/mp2024_dataset.py b/ppmat/datasets/mp2024_dataset.py new file mode 100644 index 00000000..25ec91ca --- /dev/null +++ b/ppmat/datasets/mp2024_dataset.py @@ -0,0 +1,700 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import annotations + +import math +import os +import os.path as osp +import pickle +import re +from typing import Any +from typing import Callable +from typing import Dict +from typing import Optional + +import numpy as np +import paddle.distributed as dist +from paddle.io import Dataset + +from ppmat.datasets.build_structure import BuildStructure +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.models import build_graph_converter +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils.io import count_samples_json_lines +from ppmat.utils.io import read_json_lines +from ppmat.utils.misc import is_equal + + +class MP2024Dataset(Dataset): + """MP2024 Dataset Handler + + **Dataset Overview** + + - **Preprocessed Version**: + ``` + ┌───────────────────┬─────────┬─────────┬─────────┐ + │ Dataset Partition │ Train │ Val │ Test │ + ├───────────────────┼─────────┼─────────┼─────────┤ + │ Sample Count │ 130000 │ 10000 │ 15361 │ + └───────────────────┴─────────┴─────────┴─────────┘ + ``` + Download preprocessed data: https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2024/mp2024_train_130k.zip # noqa + + **Data Format** + Each sample in the dataset is represented as a `dict` with the following keys and + value types: + + General Identifiers: + -------------------- + - '_id': `dict` — Unique identifier for the sample. + - 'material_id': `str` — Unique identifier for Materials Project. + - 'database_IDs': `dict` — Other database identifiers. + - 'task_ids': `list` — Related task identifiers. + - 'last_updated': `dict` — Last update timestamp. + - `deprecated`: `bool` — Whether the material entry is deprecated. + - `deprecation_reasons`: `str` — Reasons for deprecation, if any. + - 'builder_meta': `dict` — Metadata about the dataset construction tools and + environment. + - 'emmet_version': `str` — Version of the Emmet library used to process the + data. + - 'pymatgen_version': `str` — Version of the Pymatgen library used to process + the data. + - 'pull_request' + - 'database_version' + - 'build_date' + - 'license' + - 'origins': `list` — Source information for structure, energy, magnetism, etc. + - 'name': `str` — The property type or task name (e.g., 'structure', 'energy', + 'magnetism'). + - 'task_id': `str` — The computation task ID associated with this property. + - 'last_updated': `dict` — Dictionary containing the timestamp of the last + update for this property source. + - 'warnings': `list` — Any known issues or notes about the entry. + + Chemical Information: + --------------------- + - `formula_pretty`: `str` — Human-readable chemical formula. + - `formula_anonymous`: `str` — Element-anonymized formula (e.g., "ABC3"). + - `chemsys`: `str` — Chemical system (alphabetically sorted element symbols). + + Symmetry Data: + -------------- + - 'symmetry': `dict` — Symmetry information of the crystal structure. + - 'crystal_system': `str` — The crystal system. + - 'symbol': `str` — Space group symbol of the structure. + - 'number': `int` — International space group number. + - 'point_group': `str` — Point group classification. + - 'symprec': `float` — Tolerance used in symmetry detection. + - 'version': `str` — Version of the software used for symmetry analysis. + + Composition and Structure: + -------------------------- + - `nsites`: `int` — Number of atomic sites. + - `elements`: `list` — Element symbols present. + - `nelements`: `int` — Number of distinct elements. + - `composition`: `dict` — Elemental amounts. + - `composition_reduced`: `dict` — Reduced stoichiometry. + - `structure`: `dict` — Full crystal structure. **Details as follows:** + - `@module`: `str` — Python module where the structure class is defined, e.g., + `'pymatgen.core.structure'`. + - `@class`: `str` — Class name of the structure, e.g., `'Structure'`. + - `charge`: `int` — Net charge of the entire structure. + - `lattice`: `dict` — Lattice information: + - `matrix`: `list` — 3x3 lattice vectors defining the unit cell. + - `pbc`: `list[bool]` — Periodic boundary conditions flags for each spatial + direction. + - `a`, `b`, `c`: `float` — Lattice constants lengths. + - `alpha`, `beta`, `gamma`: `float` — Lattice angles in degrees. + - `volume`: `float` — Volume of the unit cell. + - `properties`: `dict` — Optional additional properties related to the + structure. + - `sites`: `list[dict]` — List of atomic sites, each site including: + - `species`: `list[dict]` — List of species at the site, with: + - `element`: `str` — Chemical element symbol. + - `occu`: `float` — Occupancy of the element at the site. + - `abc`: `list[float]` — Fractional coordinates within the unit cell. + - `xyz`: `list[float]` — Cartesian coordinates in Ångstroms. + - `properties`: `dict` — Site-specific properties, e.g., magnetic moment + (`magmom`). + - `label`: `str` — Element label for the site. + + Thermodynamic Properties: + ------------------------- + - `volume`: `float` — Cell volume. + - `density`: `float` — Density. + - `density_atomic`: `float` — Atomic density. + - `uncorrected_energy_per_atom`: `float` — Uncorrected energy per atom. + - `energy_per_atom`: `float` — Final total energy per atom. + - `formation_energy_per_atom`: `float` — Formation energy per atom. + - `energy_above_hull`: `float` — Energy above convex hull (thermodynamic stability). + - `equilibrium_reaction_energy_per_atom`: `float` — Equilibrium reaction energy per + atom. + - `is_stable`: `bool` — Whether the material is thermodynamically stable. + - `decomposes_to`: `list` — Decomposition products. + + + Electronic Properties: + ---------------------- + - `band_gap`: `float` — Band gap. + - `cbm`: `float` — Conduction band minimum. + - `vbm`: `float` — Valence band maximum. + - `efermi`: `float` — Fermi energy. + - `is_gap_direct`: `bool` — Whether the band gap is direct. + - `is_metal`: `bool` — Whether the material is metallic. + - `es_source_calc_id` + - `bandstructure` + - `dos`: Density of states. **Details as follows:** + - `total`: `dict` — Total density of states aggregated over all elements and + orbitals. Contains spin channels keyed by `'1'` (spin up) and `'-1'` (spin + down), each holding: + - `task_id`: `str` — Identifier of the calculation task. + - `band_gap`: `float` — Band gap energy in eV. + - `cbm`: `float` — Conduction band minimum energy in eV. + - `vbm`: `float` — Valence band maximum energy in eV. + - `efermi`: `float` — Fermi energy in eV. + - `spin_polarization`: `float` or `None` — Degree of spin polarization. + - `elemental`: `dict` — Density of states resolved by element symbol. Each + element maps to: + - `total`: `dict` — Total DOS for that element (with same spin structure + as above). + - Orbital-resolved DOS: keys like `'s'`, `'p'`, `'d'`, each mapping + spin-resolved DOS dicts. + - `orbital`: `dict` — Density of states resolved by orbital type (`'s'`, `'p'`, + `'d'`), with spin-resolved data similar to above. + - `magnetic_ordering`: `str` — Magnetic ordering of the system, e.g., `'FM'` + (ferromagnetic). + - `dos_energy_up`: `float` — Spin-up DOS energy + - `dos_energy_down`: `float` — Spin-down DOS energy. + + + Magnetic Properties: + -------------------- + - `is_magnetic`: `bool` — Whether the material is magnetic. + - `ordering`: `str` — Magnetic ordering type (e.g., 'FM', 'AFM'). + - `total_magnetization`: `float` — Total magnetization. + - `total_magnetization_normalized_vol`: `float` — Magnetization per unit volume. + - `total_magnetization_normalized_formula_units`: `float` — Magnetization per + formula unit. + - `num_magnetic_sites`: `int` — Number of magnetic sites. + - `num_unique_magnetic_sites`: `int` — Number of unique magnetic sites. + - `types_of_magnetic_species`: `list` — Magnetic element types. + + + Mechanical Properties: + ---------------------- + - `bulk_modulus`: float` — Bulk modulus. + - `shear_modulus`: `float` — Shear modulus. + - `universal_anisotropy`: `float` — Universal anisotropy index. + - `homogeneous_poisson`: `float` — Homogeneous Poisson's ratio. + + + Surface Properties: + ------------------- + - `weighted_surface_energy_EV_PER_ANG2`: `float` — Weighted surface energy. + - `weighted_surface_energy`: `float` — Surface energy. + - `weighted_work_function` + - `surface_anisotropy`: `float` — Surface anisotropy. + - `shape_factor`: `float` — Shape factor describing surface morphology. + - `has_reconstructed`: `bool` — Indicates if surface reconstruction has occurred. + + XAS: + ---- + - 'xas' + + ---- + - 'grain_boundaries' + + Electronic Energy: + ------------------ + - 'e_total' + - 'e_ionic' + - 'e_electronic' + - 'n' + - 'e_ij_max' + + Other Fields: + ------------- + - `possible_species`: `list` — Estimated possible oxidation states. + - `has_props`: `dict` — Flags indicating presence of specific property data, e.g., + 'materials', 'thermo', 'xas', 'grain_boundaries', 'chemenv', + 'electronic_structure', 'absorption', + 'bandstructure', 'dos', 'magnetism', 'elasticity', 'dielectric', + 'piezoelectric', 'surface_properties', + 'oxi_states', 'provenance', 'charge_density', 'eos', 'phonon', + 'insertion_electrodes', 'substrates'. + - `theoretical`: `bool` — Whether the structure is theoretical. + - `property_name`: `str` + + + **Notes** + - Missing values are represented as `None` + - CIF parsing requires additional dependencies (e.g., pymatgen) + - For custom data, ensure index consistency across all fields + + + Args: + path (str): The path of the dataset, if path is not exists, it will + be downloaded. + property_names (Optional[list[str]], optional): Property names you want to use, + for mp2018.6.1, the property_names should be selected from + ["formation_energy_per_atom", "band_gap", "G", "K"]. Defaults to None. + build_structure_cfg (Dict, optional): The configs for building the pymatgen + structure from cif string, if not specified, the default setting will be + used. Defaults to None. + build_graph_cfg (Dict, optional): The configs for building the graph from + structure. Defaults to None. + transforms (Optional[Callable], optional): The preprocess transforms for each + sample. Defaults to None. + cache_path (Optional[str], optional): If a cache_path is set, structures and + graph will be read directly from this path; if the cache does not exist, + the converted structures and graph will be saved to this path. Defaults + to None. + overwrite (bool, optional): Overwrite the existing cache file at the given cache + path if it already exists. Defaults to False. + filter_unvalid (bool, optional): Whether to filter out unvalid samples. Defaults + to True. + """ + + name = "mp2024_train_130k" + url = "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2024/mp2024_train_130k.zip" # noqa + md5 = "6aa4d9f52e3f39270719e163465fcea8" + + def __init__( + self, + path: str, + property_names: Optional[list[str]] = None, + build_structure_cfg: Dict = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, # for compatibility + ): + super().__init__() + + if not osp.exists(path): + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + path = osp.join(root_path, self.name, osp.basename(path)) + + self.path = path + if isinstance(property_names, str): + property_names = [property_names] + + if build_structure_cfg is None: + build_structure_cfg = { + "format": "dict", + "primitive": False, + "niggli": True, + "num_cpus": 1, + } + logger.message( + "The build_structure_cfg is not set, will use the default " + f"configs: {build_structure_cfg}" + ) + + self.property_names = property_names if property_names is not None else [] + self.build_structure_cfg = build_structure_cfg + self.build_graph_cfg = build_graph_cfg + self.transforms = transforms + + if cache_path is not None: + self.cache_path = cache_path + else: + # for example: + # path = ./data/mp2024_train_130k/mp2024_train.txt + # cache_path = ./data/mp2024_train_130k_cache_find_points_in_spheres_cutoff_4/mp2024_train # noqa + graph_converter_name = re.sub( + r"(?, + "uncorrected_total_energy": float, # Raw VASP output [eV] + "corrected_total_energy": float, # VASP total energy after MP2020 + # compatibility [eV] + "energy_per_atom": float, # Corrected energy per atom, this + # is the energy label used to train + # CHGNet [eV/atom] + "ef_per_atom": float, # Formation energy [eV/atom] + "e_per_atom_relaxed": float, # Corrected energy per atom of the + # relaxed structure, this is the + # energy you can find for the mp-id + # on materials project website + #[eV/atom] + "ef_per_atom_relaxed": float, # Relaxed formation energy [eV/atom] + "force": List[float], # Atomic forces [eV/Å] + "stress": List[float], # Stress tensor [kBar] + "magmom": List[float] or None, # Magmom on the atoms [μB] + "bandgap": float # Bandgap [eV] + }, + "frame-id-1": {...}, + ... + }, + "mp-id-1": {...}, + ... + + } + + Notes: + 1. Frame ID Format: + 'task_id-calc_id-ionic_step' where: + - calc_id: 0 (second relaxation) or 1 (first relaxation) in double relaxation + workflows + + 2. Energy Compatibility: + MP2020 corrections are applied to unify GGA/GGA+U energy scales. + The 'energy_per_atom' field contains these corrected values used for CHGNet + training. See pymatgen compatibility documentation: + https://pymatgen.org/pymatgen.entries.html#pymatgen.entries.compatibility.Compatibility + + 3. Magnetic Moment Handling: + Missing MAGMOM values are represented as None (not zero). + CHGNet uses absolute DFT magmom values directly from this dataset. + Unit conversion is handled automatically when using the provided dataset loader. + Reference implementation: + https://github.com/CederGroupHub/chgnet/blob/main/chgnet/data/dataset.py + + 4. Stress Units: + VASP raw stress values (kBar) are converted to GPa for CHGNet using: + stress_gpa = -0.1 * vasp_stress_kbar + This conversion is automatically applied when loading the dataset. + + + Args: + path (str, optional): The path of the dataset, if path is not exists, it will + be downloaded. + property_names (Optional[list[str]], optional): Property names you want to use, + for mp2018.6.1, the property_names should be selected from + ["formation_energy_per_atom", "band_gap", "G", "K"]. Defaults to None. + build_structure_cfg (Dict, optional): The configs for building the pymatgen + structure from cif string, if not specified, the default setting will be + used. Defaults to None. + build_graph_cfg (Dict, optional): The configs for building the graph from + structure. Defaults to None. + transforms (Optional[Callable], optional): The preprocess transforms for each + sample. Defaults to None. + cache_path (Optional[str], optional): If a cache_path is set, structures and + graph will be read directly from this path; if the cache does not exist, + the converted structures and graph will be saved to this path. Defaults + to None. + overwrite (bool, optional): Overwrite the existing cache file at the given cache + path if it already exists. Defaults to False. + filter_unvalid (bool, optional): Whether to filter out unvalid samples. Defaults + to True. + """ + + name = "MPtrj_2022.9_full" + url = "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mptrj/MPtrj_2022.9_full.zip" + md5 = "949069910f4ce1f1ed8c49a8d6ae5c5e" + + def __init__( + self, + path: str, + property_names: Optional[list[str]] = None, + build_structure_cfg: Dict = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, # for compatibility + ): + super().__init__() + + if not osp.exists(path): + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + path = osp.join(root_path, self.name, osp.basename(path)) + + self.path = path + if isinstance(property_names, str): + property_names = [property_names] + + if build_structure_cfg is None: + build_structure_cfg = { + "format": "dict", + "primitive": False, + "niggli": False, + "num_cpus": 1, + } + logger.message( + "The build_structure_cfg is not set, will use the default " + f"configs: {build_structure_cfg}" + ) + + self.property_names = property_names if property_names is not None else [] + self.build_structure_cfg = build_structure_cfg + self.build_graph_cfg = build_graph_cfg + self.transforms = transforms + + if cache_path is not None: + self.cache_path = cache_path + else: + # for example: + # path = ./data/MPtrj_2022.9_full/train.json + # cache_path = ./data/MPtrj_2022.9_full/train + self.cache_path = osp.join( + osp.split(path)[0] + "_cache", osp.splitext(osp.basename(path))[0] + ) + logger.info(f"Cache path: {self.cache_path}") + + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + + self.cache_exists = True if osp.exists(self.cache_path) else False + self.row_data = self.read_data(path) + self.keys = [ + (mp_id, graph_id) + for mp_id, dct in self.row_data.items() + for graph_id in dct + ] + self.num_samples = len(self.keys) + logger.info(f"Load {self.num_samples} samples from {path}") + + if self.cache_exists and not overwrite: + logger.warning( + "Cache enabled. If a cache file exists, it will be automatically " + "read and current settings will be ignored. Please ensure that the " + "settings used in match your current settings." + ) + try: + build_structure_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl") + ) + if is_equal(build_structure_cfg_cache, build_structure_cfg): + logger.info( + "The cached build_structure_cfg configuration matches " + "the current settings. Reusing previously generated" + " structural data to optimize performance." + ) + else: + logger.warning( + "build_structure_cfg is different from " + "build_structure_cfg_cache. Will rebuild the structures and " + "graphs." + ) + logger.warning( + "If you want to use the cached structures and graphs, please " + "ensure that the settings used in match your current settings." + ) + overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_structure_cfg.pkl from cache. " + "Will rebuild the structures and graphs(if need)." + ) + overwrite = True + + if build_graph_cfg is not None and not overwrite: + try: + build_graph_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl") + ) + if is_equal(build_graph_cfg_cache, build_graph_cfg): + logger.info( + "The cached build_structure_cfg configuration " + "matches the current settings. Reusing previously " + "generated structural data to optimize performance." + ) + else: + logger.warning( + "build_graph_cfg is different from build_graph_cfg_cache" + ". Will rebuild the graphs." + ) + logger.warning( + "If you want to use the cached structures and graphs, " + "please ensure that the settings used in match your " + "current settings." + ) + overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_graph_cfg.pkl from cache. " + "Will rebuild the graphs." + ) + overwrite = True + + structure_cache_path = osp.join(self.cache_path, "structures") + graph_cache_path = osp.join(self.cache_path, "graphs") + if overwrite or not self.cache_exists: + # convert strucutes and graphs + # only rank 0 process do the conversion + if dist.get_rank() == 0: + # save build_structure_cfg and build_graph_cfg to cache file + os.makedirs(self.cache_path, exist_ok=True) + self.save_to_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl"), + build_structure_cfg, + ) + self.save_to_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl"), build_graph_cfg + ) + # convert strucutes + structure_str = [] + for mp_id, graph_ids in self.keys: + structure_str.append(self.row_data[mp_id][graph_ids]["structure"]) + structures = BuildStructure(**build_structure_cfg)(structure_str) + # save structures to cache file + os.makedirs(structure_cache_path, exist_ok=True) + for i, (mp_id, graph_ids) in enumerate(self.keys): + self.save_to_cache( + osp.join(structure_cache_path, f"{mp_id}_{graph_ids}.pkl"), + structures[i], + ) + logger.info( + f"Save {self.num_samples} structures to {structure_cache_path}" + ) + + if build_graph_cfg is not None: + converter = build_graph_converter(build_graph_cfg) + graphs = converter(structures) + # save graphs to cache file + os.makedirs(graph_cache_path, exist_ok=True) + for i, (mp_id, graph_ids) in enumerate(self.keys): + self.save_to_cache( + osp.join(graph_cache_path, f"{mp_id}_{graph_ids}.pkl"), + graphs[i], + ) + logger.info(f"Save {self.num_samples} graphs to {graph_cache_path}") + + # sync all processes + if dist.is_initialized(): + dist.barrier() + self.structures = defaultdict(dict) + for i, (mp_id, graph_ids) in enumerate(self.keys): + self.structures[mp_id][graph_ids] = osp.join( + structure_cache_path, f"{mp_id}_{graph_ids}.pkl" + ) + if build_graph_cfg is not None: + self.graphs = defaultdict(dict) + for mp_id, graph_ids in self.keys: + self.graphs[mp_id][graph_ids] = osp.join( + graph_cache_path, f"{mp_id}_{graph_ids}.pkl" + ) + else: + self.graphs = None + + # filter by property data, since some samples may have no valid properties + if filter_unvalid: + self.filter_unvalid_by_property() + + def read_data(self, path: str): + """Read the data from the given json path. + + Args: + path (str): Path to the data. + """ + json_data = read_json(path) + return json_data + + def filter_unvalid_by_property(self): + for property_name in self.property_names: + reserve_idx = [] + delete_id = [] + for i, (mp_id, graph_ids) in enumerate(self.keys): + property_value = self.row_data[mp_id][graph_ids][property_name] + if isinstance(property_value, str) or ( + property_value is not None and not math.isnan(property_value) + ): + reserve_idx.append(i) + else: + delete_id.append([mp_id, graph_ids]) + + self.keys = [self.keys[i] for i in reserve_idx] + for mp_id, graph_ids in delete_id: + del self.row_data[mp_id][graph_ids] + + del self.structures[mp_id][graph_ids] + if self.graphs is not None: + del self.graphs[mp_id][graph_ids] + logger.warning( + f"Filter out {len(reserve_idx)} samples with valid properties: " + f"{property_name}" + ) + self.num_samples = len(self.keys) + logger.warning(f"Remaining {self.num_samples} samples after filtering.") + + def read_property_data(self, data: Dict, property_names: list[str]): + """Read the property data from the given data and property names. + + Args: + data (Dict): Data that contains the property data. + property_names (list[str]): Property names. + """ + property_data = {} + for property_name in property_names: + if property_name not in data: + raise ValueError(f"{property_name} not found in the data") + property_data[property_name] = [ + data[property_name][i] for i in range(self.num_samples) + ] + return property_data + + def save_to_cache(self, cache_path: str, data: Any): + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def load_from_cache(self, cache_path: str): + if osp.exists(cache_path): + with open(cache_path, "rb") as f: + data = pickle.load(f) + return data + else: + raise FileNotFoundError(f"No such file or directory: {cache_path}") + + def get_structure_array(self, structure): + atom_types = np.array([site.specie.Z for site in structure]) + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + structure_array = { + "frac_coords": ConcatData(structure.frac_coords.astype("float32")), + "cart_coords": ConcatData(structure.cart_coords.astype("float32")), + "atom_types": ConcatData(atom_types), + "lattice": ConcatData(lattice.reshape(1, 3, 3)), + "lengths": ConcatData(lengths), + "angles": ConcatData(angles), + "num_atoms": ConcatData(np.array([tuple(atom_types.shape)[0]])), + } + return structure_array + + def __getitem__(self, idx: int): + """Get item at index idx.""" + mp_id, graph_id = self.keys[idx] + data = {} + # get graph + if self.graphs is not None: + graph = self.graphs[mp_id][graph_id] + if isinstance(graph, str): + graph = self.load_from_cache(graph) + data["graph"] = graph + else: + structure = self.structures[mp_id][graph_id] + if isinstance(structure, str): + structure = self.load_from_cache(structure) + data["structure_array"] = self.get_structure_array(structure) + + row_data = self.row_data[mp_id][graph_id] + for property_name in self.property_names: + if property_name in row_data.keys(): + value = row_data[property_name] + if isinstance(value, str): + data[property_name] = value + elif property_name in ["force", "stress", "magmom"]: + num_atoms = ( + data["graph"].node_feat["num_atoms"] + if "graph" in data.keys() + else data["structure_array"]["num_atoms"].data + ) + num_atoms = num_atoms[0] + if value is None: + if property_name == "force": + value = np.full((num_atoms, 3), np.nan) + elif property_name == "stress": + value = np.full((3, 3), np.nan) + elif property_name == "magmom": + value = np.full((num_atoms,), np.nan) + + if property_name == "stress": + value = [value] + elif property_name == "magmom": + value = np.abs(np.array(value).reshape([-1, 1])) + data[property_name] = ConcatNumpyWarper(value).astype("float32") + else: + data[property_name] = np.array([value]).astype("float32") + else: + raise KeyError(f"Property {property_name} not found.") + + data["id"] = idx + data = self.transforms(data) if self.transforms is not None else data + + return data + + def __len__(self): + return self.num_samples diff --git a/ppmat/datasets/msd_nmr_dataset.py b/ppmat/datasets/msd_nmr_dataset.py new file mode 100644 index 00000000..f3e08798 --- /dev/null +++ b/ppmat/datasets/msd_nmr_dataset.py @@ -0,0 +1,1615 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import annotations + +import json +import os +import os.path as osp +import pickle +from typing import Any +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +import numpy as np +import paddle +import paddle.distributed as dist +import pandas as pd +import pgl +from paddle.io import Dataset +from rdkit import Chem +from rdkit import RDLogger +from rdkit.Chem.rdchem import BondType as BT + +from ppmat.datasets.build_molecule import BuildMolecule +from ppmat.datasets.build_spectrum import build_spectrum_converter +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.models import build_graph_converter +from ppmat.models.diffnmr.utils import diffgraphformer_utils as utils +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils.ext_rdkit import build_molecule_with_partial_charges +from ppmat.utils.ext_rdkit import compute_molecular_metrics +from ppmat.utils.ext_rdkit import mol2smiles +from ppmat.utils.misc import is_equal + + +class MSDnmrDataset(Dataset): + """Multimodal Spectrum Dataset‑Nuclear Magnetic Resonance subset handler. + + This class provides utilities for loading and processing the MSD NMR dataset. + The dataset contains preprocess dataset includes SMILES of molecules, tokenized + input of NMR and atom counts of molecules. Tokenized input includs chemical shift, + multiplicity, intensity etc. + The total dataset is divided into three parts: training, validation, and testing + and devided into 4 parts by number of atoms per molecules. + + **Dataset Overview** + - **Source**: Original data available at + https://github.com/rxn4chemistry/multimodal-spectroscopic-dataset + - **Preprocessed Version**: + ``` + ┌───────────────────┬─────────┬─────────┬─────────┬──────────┐ + │ Dataset Partition │ Train │ Val │ Test │ Total │ + ├───────────────────┼─────────┼─────────┼─────────┼──────────┤ + │ n<15 │ 109,358 │ 6,076 │ 6,075 │ 121509 │ + ├───────────────────┼─────────┼─────────┼─────────┼──────────┤ + │ n<20 │ 235,512 │ 13,085 │ 13,084 │ 261681 │ + ├───────────────────┼─────────┼─────────┼─────────┼──────────┤ + │ n<25 │ 351,273 │ 19,516 │ 19,515 │ 390,304 │ + ├───────────────────┼─────────┼─────────┼─────────┼──────────┤ + │ n<35 │ 517,319 │ 28,741 │ 28,739 │ 574,799 │ + └───────────────────┴─────────┴─────────┴─────────┴──────────┘ + ``` + Download preprocessed data: + https://paddle-org.bj.bcebos.com/paddlematerial/datasets/msd/msd_nmr.zip + + **Data Format** + The dataset is stored in CSV format with the following structure: + ```CSV + smiles,tokenized_input,atom_count + + The tokenized_input is stored as a JSON-style dictionary with two top-level keys: + "1HNMR" : a list of proton (^1H) NMR signals + "13CNMR" : a list of carbon (^13C) NMR chemical shifts + + Each element in the "1HNMR" list represents a single proton signal and is itself + a five-element array in the form: + [chemical_shift_ppm, line_width_ppm, multiplicity, integration, coupling_constants] + + - chemical_shift_ppm: float – the chemical shift δ value in parts per million. + - line_width_ppm : float – the peak width (or half-height width) in ppm. + - multiplicity : str – the splitting pattern, e.g.: + * "t" : triplet + * "dd" : doublet of doublets + * "td" : triplet of doublet + * "ddt" : doublet of doublet of triplet + * "qt" : quartet of triplet + (other patterns may appear depending on the spectrum). + - integration : str – the number of protons represented by the signal, + expressed as a string like "1H", "2H", "3H", etc. + - coupling_constants: list of floats – a list of J couplings (Hz) associated + with this signal; an empty list means no couplings were reported. + + The "13CNMR" entry is simply a list of float values, where each value is a carbon + chemical shift in ppm. No additional information (such as line widths or couplings) + is provided for the carbon spectra. + ``` + + Args: + path (str or List[str]): Path to a CSV file (or list of CSV files) + containing the raw dataset. Each file should have columns such + as 'smiles', 'tokenized_input' and 'atom_count'. If multiple + files are provided, they will be concatenated. + vocab_peakwidth_path (str): Path to a CSV file defining the + vocabulary for NMR peak widths. The file should have a column + named 'Value' whose unique entries are mapped to integer IDs. + vocab_split_path (str): Path to a CSV file defining the vocabulary + for NMR splitting types. The file should have a column named + 'Type' whose unique entries are mapped to integer IDs. + remove_h (bool): Whether to remove hydrogen atoms from the graph + representation. When ``True``, hydrogens are stripped and the + remaining node features are shifted accordingly. + seq_len_H1 (int): Maximum sequence length for ¹H NMR tokens. 1H + spectra shorter than this will be padded; longer sequences are + truncated. + seq_len_C13 (int): Maximum sequence length for ¹³C NMR tokens. + cache (bool, optional): If ``True``, processed graphs will be cached + to a ``*.pkl`` file next to the input CSV. Subsequent runs + reuse the cache when the file exists, speeding up initialization. + Defaults to ``True``. + **kwargs: Additional keyword arguments to configure dataset behaviour. + Recognised keys include: + - ``guidance_target`` (str): one of {'mu','homo','both'}, used + when training a regressor to select which target(s) to return. + - ``regressor``: boolean or object indicating whether a + regression model is being trained, which affects the + transform applied to the labels. + + """ + + name = "msd_nmr" + url = "https://paddle-org.bj.bcebos.com/paddlematerial/datasets/msd/msd_nmr.zip" + md5 = "bcd731f6d4075a93c11641fdebd1d6bd" + + def __init__( + self, + path: Union[str, List[str]], + vocab_peakwidth_path: str, + vocab_split_path: str, + data_flag: str, + max_atoms: int, + build_molecule_cfg: Optional[Dict[str, Any]] = None, + build_graph_cfg: Optional[Dict[str, Any]] = None, + build_spectrum_cfg: Optional[Dict[str, Any]] = None, + transforms: Optional[Any] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs: Any, + ) -> None: + super().__init__() + + # Download the dataset if the provided path does not exist + if not osp.exists(path): + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + if data_flag == "n<15": + subdataset_name = "msd_nmr_nless15" + elif data_flag == "n<20": + subdataset_name = "msd_nmr_nless20" + elif data_flag == "n<30": + subdataset_name = "msd_nmr_nless30" + elif data_flag == "n<35": + subdataset_name = "msd_nmr_nless35" + else: + raise ValueError( + f"Unknown data_flag: {data_flag}. " + "Expected one of {'n<15', 'n<20', 'n<30', 'n<35'}." + ) + path = osp.join(root_path, self.name, subdataset_name, osp.basename(path)) + + self.path = path + + # Config dicts controlling molecule and graph construction + if build_molecule_cfg is None: + build_molecule_cfg = { + "format": "smiles", + "sanitize": False, + "add_hs": False, + "remove_hs": False, + "kekulize": False, + } + logger.message( + "The build_molecule_cfg is not set, will use the default " + f"configs: {build_molecule_cfg}" + ) + self.build_molecule_cfg = build_molecule_cfg + + if build_graph_cfg is None: + build_graph_cfg = { + "atom_vocab": { + "H": 0, + "C": 1, + "N": 2, + "O": 3, + "F": 4, + "P": 5, + "S": 6, + "Cl": 7, + "Br": 8, + "I": 9, + }, + "bond_vocab": {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3}, + "remove_h": False, + "add_self_loops": False, + "edge_mode": "bidirectional", + "num_cpus": 1, + } + logger.message( + "The build_graph_cfg is not set, will use the default " + f"configs: {build_graph_cfg}" + ) + self.build_graph_cfg = build_graph_cfg + + if build_spectrum_cfg is None: + build_spectrum_cfg = { + "__class_name__": "BuildSpectrumNMR", # 指定要实例化的类名 + "__init_params__": { # 类初始化参数 + "seq_len_H1": 32, # 1H谱序列长度 + "seq_len_C13": 32, # 13C谱序列长度 + "j_len": 6, # 耦合常数维度 + "unk_token": "", # 未知token + "integral_offset": 1, # 积分偏移量 + "num_cpus": 1, # 并行线程数 + }, + } + logger.message( + "The build_spectrum_cfg is not set, will use the default " + f"configs: {build_spectrum_cfg}" + ) + self.build_spectrum_cfg = build_spectrum_cfg + + self.transforms = transforms + self.vocabs = self._build_vocab(vocab_peakwidth_path, vocab_split_path) + + if cache_path is not None: + self.cache_path = cache_path + else: + self.cache_path = osp.join( + osp.split(path)[0] + "_cache", osp.splitext(osp.basename(path))[0] + ) + logger.info(f"Cache path: {self.cache_path}") + + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + + self.cache_exists = True if osp.exists(self.cache_path) else False + self.raw_data, self.num_samples = self.read_data(path) + logger.info(f"Load {self.num_samples} samples from {path}") + + if self.cache_exists and not overwrite: + logger.warning( + "Cache enabled. If a cache file exists, it will be automatically " + "read and current settings will be ignored. Please ensure that the " + "settings used in match your current settings." + ) + try: + build_molecule_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_molecule_cfg.pkl") + ) + if is_equal(build_molecule_cfg_cache, build_molecule_cfg): + logger.info( + "The cached build_molecule_cfg configuration matches " + "the current settings. Reusing previously generated" + " structural data to optimize performance." + ) + else: + logger.warning( + "build_molecule_cfg is different from " + "build_molecule_cfgg_cache. Will rebuild the molecules and " + "graphs." + ) + logger.warning( + "If you want to use the cached molecules and graphs, please " + "ensure that the settings used in match your current settings." + ) + overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_molecules_cfg.pkl from cache. " + "Will rebuild the molecules and graphs(if need)." + ) + overwrite = True + + if build_graph_cfg is not None and not overwrite: + try: + build_graph_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl") + ) + if is_equal(build_graph_cfg_cache, build_graph_cfg): + logger.info( + "The cached build_molecule_cfg configuration " + "matches the current settings. Reusing previously " + "generated molecular data to optimize performance." + ) + else: + logger.warning( + "build_graph_cfg is different from build_graph_cfg_cache" + ". Will rebuild the graphs." + ) + logger.warning( + "If you want to use the cached molecules and graphs, " + "please ensure that the settings used in match your " + "current settings." + ) + overwrite = True + + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_graph_cfg.pkl from cache. " + "Will rebuild the graphs." + ) + overwrite = True + + if build_spectrum_cfg is not None and not overwrite: + try: + build_spectrum_cfg_cache = self.load_from_cache( + osp.join(self.cache_path, "build_spectrum_cfg.pkl") + ) + if is_equal(build_spectrum_cfg_cache, build_spectrum_cfg): + logger.info( + "The cached build_spectrum_cfg configuration " + "matches the current settings. Reusing previously " + "generated spectrum data to optimize performance." + ) + else: + logger.warning( + "build_spectrum_cfg is different from " + "build_spectrum_cfg_cache. Will rebuild the spectrums." + ) + logger.warning( + "If you want to use the cached spectrums, " + "please ensure that the settings used in match your " + "current settings." + ) + overwrite = True + + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_spectrum_cfg.pkl from cache. " + "Will rebuild the spectrums." + ) + overwrite = True + + molecule_cache_path = osp.join(self.cache_path, "molecules") + graph_cache_path = osp.join(self.cache_path, "graphs") + spectrum_cache_path = osp.join(self.cache_path, "spectrums") + + if overwrite or not self.cache_exists: + # convert strucutes and graphs + # only rank 0 process do the conversion + if dist.get_rank() == 0: + # save build_molecule_cfg and build_graph_cfg and build_spechtrum_cfg + # to cache file + os.makedirs(self.cache_path, exist_ok=True) + + self.save_to_cache( + osp.join(self.cache_path, "build_molecule_cfg.pkl"), + build_molecule_cfg, + ) + self.save_to_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl"), build_graph_cfg + ) + self.save_to_cache( + osp.join(self.cache_path, "build_spectrum_cfg.pkl"), + build_spectrum_cfg, + ) + + # convert strucutes + molecules = BuildMolecule(**build_molecule_cfg)(self.raw_data["smiles"]) + # save molecules to cache file + os.makedirs(molecule_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(molecule_cache_path, f"{i:010d}.pkl"), + molecules[i], + ) + logger.info( + f"Save {self.num_samples} molecules to {molecule_cache_path}" + ) + # convert graphs + if build_graph_cfg is not None: + converter = build_graph_converter(build_graph_cfg) + graphs = converter(molecules) + # save graphs to cache file + os.makedirs(graph_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(graph_cache_path, f"{i:010d}.pkl"), graphs[i] + ) + logger.info(f"Save {self.num_samples} graphs to {graph_cache_path}") + # convert spectrums + if build_spectrum_cfg is not None: + converter = build_spectrum_converter( + build_spectrum_cfg, vocabs=self.vocabs, strict=True + ) + spectrums = converter(self.raw_data["tokenized_nmr"]) + # save spectrums to cache file + os.makedirs(spectrum_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(spectrum_cache_path, f"{i:010d}.pkl"), spectrums[i] + ) + logger.info( + f"Save {self.num_samples} spectrums to {spectrum_cache_path}" + ) + + # sync all processes + if dist.is_initialized(): + dist.barrier() + self.molecules = [ + osp.join(molecule_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + if build_graph_cfg is not None: + self.graphs = [ + osp.join(graph_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + else: + self.graphs = None + if build_spectrum_cfg is not None: + self.spectrums = [ + osp.join(spectrum_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + else: + self.spectrums = None + self.properties = self.get_property_data(self.raw_data) # represent "y" + + assert ( + len(self.molecules) == self.num_samples + ), "The number of molecules must be equal to the number of samples." + assert ( + self.graphs is None or len(self.graphs) == self.num_samples + ), "The number of graphs must be equal to the number of samples." + + # filter data by specific requirement such as max atom number + if filter_unvalid: + self.filter_by_atom_count_raw(max_atoms=max_atoms) + + def __getitem__(self, idx: int) -> Tuple[pgl.Graph, Dict[str, Any]]: + """Get item at index idx.""" + data = {} + + # get graph + if self.graphs is not None: + graph = self.graphs[idx] + if isinstance(graph, str): + graph = self.load_from_cache(graph) + data["graph"] = graph + else: + molecule = self.molecules[idx] + if isinstance(molecule, str): + molecule = self.load_from_cache(molecule) + data["molecule_array"] = self.get_molecule_array(molecule) + + # get spectrum + if self.spectrums is not None: + spectrum = self.spectrums[idx] + if isinstance(spectrum, str): + spectrum = self.load_from_cache(spectrum) + data["spectrum"] = spectrum + + # get property-like data "y" + if self.properties is not None: + property = self.properties[idx] + atom_count = self.raw_data["atom_count"][idx] + if isinstance(property, str): + property = self.load_from_cache(property) + data["property"] = { + "y": property, + "atom_count": atom_count, + } + + # data = self.transforms(data) if self.transforms is not None else data + + return data + + def __len__(self) -> int: + return self.num_samples + + def read_data( + self, csv_path: Union[str, List[str]] + ) -> Tuple[List[str], List[dict], List[int], int]: + """Read MSD-NMR raw CSV file(s) and return parsed columns. + + Expected CSV schema (3 columns in order): + 1) smiles (str) + 2) tokenized_input (JSON str) (e.g., '{"1HNMR":[...], "13CNMR":[...]}') + 3) atom_count (int) + + Args: + csv_path (str | List[str]): Path to a CSV file, a directory containing CSVs, + or a list of CSV file paths. + + Returns: + raw_data (dict): { + "smiles": List[str], + "tokenized_nmr": List[dict|list], # parsed from tokenized_input + "atom_count": List[int], + } + num_samples (int) + """ + # 1) Collect CSV files + if isinstance(csv_path, (list, tuple)): + file_list = list(csv_path) + elif osp.isdir(csv_path): + file_list = [ + osp.join(csv_path, f) + for f in os.listdir(csv_path) + if f.endswith(".csv") + ] + file_list.sort() + else: + file_list = [csv_path] + + if len(file_list) == 0: + return [], [], [], 0 + + # 2) Read and concatenate + frames = [] + for p in file_list: + df = pd.read_csv(p) + frames.append(df) + df = pd.concat(frames, ignore_index=True) + + # 3) Normalize/rename columns if needed + # Preferred canonical names: 'smiles', 'tokenized_input', 'atom_count' + cols = [c.lower().strip() for c in df.columns.tolist()] + rename_map = {} + # Attempt to map by known names; fall back to position + # (0: smiles, 1: tokenized_input, 2: atom_count) + if "smiles" not in cols: + rename_map[df.columns[0]] = "smiles" + else: + # Make sure exact canonical name + rename_map[df.columns[cols.index("smiles")]] = "smiles" + + if "tokenized_input" not in cols: + # If user used a different header, assume second column + rename_map[df.columns[1]] = "tokenized_input" + else: + rename_map[df.columns[cols.index("tokenized_input")]] = "tokenized_input" + + if "atom_count" not in cols: + rename_map[df.columns[2]] = "atom_count" + else: + rename_map[df.columns[cols.index("atom_count")]] = "atom_count" + + df = df.rename(columns=rename_map) + + # 4) Parse tokenized_input JSON (if it's a string) + if "tokenized_input" not in df.columns: + raise ValueError("Column 'tokenized_input' not found after normalization.") + + def _parse_json(x): + if isinstance(x, (dict, list)): + return x + if pd.isna(x): + return None + # ensure it's a JSON string + if not isinstance(x, str): + x = str(x) + return json.loads(x) + + df["tokenized_input"] = df["tokenized_input"].apply(_parse_json) + + # 5) Ensure atom_count is integer + if "atom_count" not in df.columns: + raise ValueError("Column 'atom_count' not found after normalization.") + + df["atom_count"] = pd.to_numeric(df["atom_count"], errors="coerce").astype( + "Int64" + ) + + # 6) Drop invalid rows (any of the three columns invalid) + valid_mask = ( + df["smiles"].astype(str).str.len().gt(0) + & df["tokenized_input"].notna() + & df["atom_count"].notna() + ) + df = df.loc[valid_mask].reset_index(drop=True) + + # 7) Build outputs + raw_data: Dict[str, List[Any]] = { + "smiles": df["smiles"].astype(str).tolist(), + "tokenized_nmr": df["tokenized_input"].tolist(), + "atom_count": [int(v) for v in df["atom_count"].tolist()], + } + num_samples = len(df) + + return raw_data, num_samples + + def save_to_cache(self, cache_path: str, data: Any): + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def load_from_cache(self, cache_path: str): + if osp.exists(cache_path): + with open(cache_path, "rb") as f: + data = pickle.load(f) + return data + else: + raise FileNotFoundError(f"No such file or directory: {cache_path}") + + def filter_by_atom_count_raw( + self, + min_atoms: int | None = None, + max_atoms: int | None = None, + allowed: set[int] | list[int] | tuple[int, ...] | None = None, + inplace: bool = True, + ): + """ + Filter samples based on raw_data['atom_count']. + + Criteria (AND): + - min_atoms: keep if count >= min_atoms (if provided) + - max_atoms: keep if count <= max_atoms (if provided) + - allowed: keep if count ∈ allowed (if provided) + + Returns: + reserve_idx (List[int]): kept indices (when inplace=True, also mutates + datasets). + + Usage: + # filter by atom count range [5, 20] + dataset.filter_by_atom_count_raw(min_atoms=5, max_atoms=20) + + # filter by specific atom counts ∈ {10, 12, 14} + dataset.filter_by_atom_count_raw(allowed={10, 12, 14}) + + # return filtered indices without modifying data + idx = dataset.filter_by_atom_count_raw(min_atoms=6, inplace=False) + """ + # 1) Read atom counts from raw data (required source) raw_data['atom_count'] + if not hasattr(self, "raw_data") or "atom_count" not in self.raw_data: + raise ValueError("raw_data['atom_count'] is required for filtering.") + + counts = np.asarray(self.raw_data["atom_count"], dtype=np.int64).reshape(-1) + n = counts.shape[0] + keep = np.ones(n, dtype=bool) + + # 2) Apply filtering criteria (combined with AND) + if min_atoms is not None: + keep &= counts >= int(min_atoms) + if max_atoms is not None: + keep &= counts <= int(max_atoms) + if allowed is not None: + allowed_arr = np.asarray(list(allowed), dtype=np.int64) + keep &= np.isin(counts, allowed_arr) + + reserve_idx = np.nonzero(keep)[0].tolist() + filtered_out = n - len(reserve_idx) + + # If not mutating the dataset, return the indices only + if not inplace: + return reserve_idx + + # 3) Slice all containers that are aligned to raw_data length + def _slice_list(lst): + return [lst[i] for i in reserve_idx] + + # 3.1 raw_data: slice list-like values with length n + for k, v in list(self.raw_data.items()): + if isinstance(v, list) and len(v) == n: + self.raw_data[k] = _slice_list(v) + + # 3.2 property_data: slice when aligned + if hasattr(self, "property_data") and isinstance(self.property_data, dict): + for k, v in list(self.property_data.items()): + if isinstance(v, list) and len(v) == n: + self.property_data[k] = _slice_list(v) + + # 3.3 other parallel containers (if present and aligned) + for attr in ("raw_data", "molecules", "graphs", "metas"): + if hasattr(self, attr): + seq = getattr(self, attr) + if isinstance(seq, list) and len(seq) == n: + setattr(self, attr, _slice_list(seq)) + + # 4) Update dataset size and log + if hasattr(self, "num_samples"): + self.num_samples = len(reserve_idx) + + try: + from ppmat.utils import logger + + logger.warning( + f"[filter_by_atom_count_raw] filtered_out={filtered_out}, " + f"remaining={self.num_samples}, criteria: " + f"min={min_atoms}, max={max_atoms}, " + f"allowed={set(allowed) if allowed is not None else None}" + ) + except Exception: + pass + + return reserve_idx + + def get_property_data(self, data): + property = np.zeros([len(data["smiles"]), 0], dtype=np.float32) + return property + + def get_molecule_array(self, molecule): + """ + Return graph-ready arrays (not a pgl.Graph): + - num_nodes: [1] int64 + - edges: [E, 2] int64 (sorted) + - node_feat: [N, A] float32 (A = len(atom_vocab)) + - edge_feat: [E, K] float32 (K = len(bond_vocab) + 1, 0 reserved) + """ + # ---- config / defaults (reuse same knobs as MolecularGraphConverter) ---- + atom_vocab = getattr( + self, + "atom_vocab", + { + "H": 0, + "C": 1, + "N": 2, + "O": 3, + "F": 4, + "P": 5, + "S": 6, + "Cl": 7, + "Br": 8, + "I": 9, + }, + ) + bond_vocab = getattr( + self, "bond_vocab", (BT.SINGLE, BT.DOUBLE, BT.TRIPLE, BT.AROMATIC) + ) + remove_h = bool(getattr(self, "remove_h", False)) + add_self = bool(getattr(self, "add_self_loops", False)) + edge_mode = getattr(self, "edge_mode", "bidirectional") + + # ---- RDKit Mol ---- + mol = Chem.MolFromSmiles(molecule) if isinstance(molecule, str) else molecule + if mol is None: + raise ValueError(f"Invalid molecule/SMILES: {molecule}") + if remove_h: + mol = Chem.RemoveHs(mol) + N = mol.GetNumAtoms() + if N == 0: + # empty arrays for consistency + return { + "num_nodes": ConcatData(np.asarray([0], dtype=np.int64)), + "edges": ConcatData(np.zeros((0, 2), dtype=np.int64)), + "node_feat": ConcatData( + np.zeros((0, len(atom_vocab)), dtype=np.float32) + ), + "edge_feat": ConcatData( + np.zeros((0, len(bond_vocab) + 1), dtype=np.float32) + ), + } + + # ---- node_feat (one-hot over atom_vocab) ---- + idxs = [] + for atom in mol.GetAtoms(): + sym = atom.GetSymbol() + if sym not in atom_vocab: + raise ValueError(f"Unknown atom symbol '{sym}' not in atom_vocab") + idxs.append(atom_vocab[sym]) + idxs = np.asarray(idxs, dtype=np.int64) # [N] + node_feat = np.eye(len(atom_vocab), dtype=np.float32)[idxs] # [N, A] + + # ---- edges & edge_feat (bond one-hot over bond_vocab + 0) ---- + rows, cols, etypes = [], [], [] + bt2id = {bt: i + 1 for i, bt in enumerate(bond_vocab)} # 0 reserved + + def push(u, v, et): + rows.append(u) + cols.append(v) + etypes.append(et) + + for b in mol.GetBonds(): + u, v = b.GetBeginAtomIdx(), b.GetEndAtomIdx() + et = bt2id.get(b.GetBondType(), 0) + + if edge_mode == "directed": + push(u, v, et) + elif edge_mode == "undirected": + uu, vv = (u, v) if u < v else (v, u) + push(uu, vv, et) + elif edge_mode == "bidirectional": + push(u, v, et) + push(v, u, et) + else: + raise ValueError(f"Unknown edge_mode: {edge_mode}") + + # dedup for undirected + if edge_mode == "undirected" and rows: + pair = np.stack([np.asarray(rows), np.asarray(cols)], axis=1) # [E,2] + ety = np.asarray(etypes) + view = pair.view([("r", pair.dtype), ("c", pair.dtype)])[:, 0] + _, keep = np.unique(view, return_index=True) + pair, ety = pair[keep], ety[keep] + rows, cols, etypes = pair[:, 0].tolist(), pair[:, 1].tolist(), ety.tolist() + + if add_self: + for i in range(N): + rows.append(i) + cols.append(i) + etypes.append(0) + + if rows: + row_np = np.asarray(rows, dtype=np.int64) + col_np = np.asarray(cols, dtype=np.int64) + et_np = np.asarray(etypes, dtype=np.int64) + # deterministic order + order = np.argsort(row_np * N + col_np, kind="mergesort") + row_np, col_np, et_np = row_np[order], col_np[order], et_np[order] + edges = np.stack([row_np, col_np], axis=1).astype(np.int64) # [E,2] + edge_feat = np.eye(len(bond_vocab) + 1, dtype=np.float32)[et_np] # [E,K] + else: + edges = np.zeros((0, 2), dtype=np.int64) + edge_feat = np.zeros((0, len(bond_vocab) + 1), dtype=np.float32) + + # ---- pack arrays (mirrors the 4 graph arguments) ---- + molecule_array = { + "num_nodes": ConcatData(np.asarray([N], dtype=np.int64)), + "edges": ConcatData(edges), # [E, 2] int64 + "node_feat": ConcatData(node_feat), # [N, A] float32 + "edge_feat": ConcatData(edge_feat), # [E, K] float32 + } + return molecule_array + + # ------------------------------------------------------------------ + # Internal data preparation methods + # These mirror the functionality previously provided by ``MMSnmrData`` and + # are kept private within the dataset class to simplify usage. + + def _build_vocab(self, peakwidth_path: str, split_path: str): + """ + Populate the peak width and split vocabularies from CSV files. + Return {'peakwidth': {...}, 'split': {...}} vocab dicts from CSVs. + """ + + def uniq_keep_order(xs): + seen, out = set(), [] + for x in xs: + if x is None: + continue + s = str(x).strip() + if s and s not in seen: + seen.add(s) + out.append(s) + return out + + df_pw = pd.read_csv(peakwidth_path) + df_sp = pd.read_csv(split_path) + + pw_tokens = uniq_keep_order(df_pw["Value"].tolist()) + sp_tokens = uniq_keep_order(df_sp["Type"].tolist()) + + vocab_peakwidth = {"": 0, "": 1} + vocab_peakwidth.update({t: i + 2 for i, t in enumerate(pw_tokens)}) + + vocab_split = {"": 0, "": 1} + vocab_split.update({t: i + 2 for i, t in enumerate(sp_tokens)}) + + return {"peakwidth": vocab_peakwidth, "split": vocab_split} + + +class MSDnmrinfos: + def __init__(self, dataloaders, cfg, recompute_statistics=False): + self.remove_h = cfg["build_graph_cfg"]["__init_params__"]["remove_h"] + self.dataflag = cfg["data_flag"] + self.need_to_strip = ( + False # to indicate whether we need to ignore one output from the model + ) + + self.atom_encoder = ( + {"H": 0, "C": 1, "N": 2, "O": 3, "F": 4} + if not self.remove_h + else { + "C": 0, + "N": 1, + "O": 2, + "F": 3, + "P": 4, + "S": 5, + "Cl": 6, + "Br": 7, + "I": 8, + } + ) + self.atom_decoder = list(self.atom_encoder.keys()) + self.num_atom_types = len(self.atom_encoder) + self.valencies = ( + [1, 4, 3, 2, 1] if not self.remove_h else [4, 3, 2, 1, 3, 2, 1, 1, 1] + ) + self.atom_weights = ( + {0: 1, 1: 12, 2: 14, 3: 16, 4: 19} + if not self.remove_h + else { + 0: 12, + 1: 14, + 2: 16, + 3: 19, + 4: 30.97, + 5: 32.07, + 6: 35.45, + 7: 79.9, + 8: 126.9, + } + ) + if self.dataflag == "n<15": + self.max_n_nodes = 29 if not self.remove_h else 15 + self.max_weight = 390 if not self.remove_h else 564 + + self.n_nodes = ( + paddle.to_tensor( + [ + 0, + 0, + 0, + 1.5287e-05, + 3.0574e-05, + 3.8217e-05, + 9.1721e-05, + 0.00015287, + 0.00049682, + 0.0013147, + 0.0036918, + 0.0080486, + 0.016732, + 0.03078, + 0.051654, + 0.078085, + 0.10566, + 0.1297, + 0.13332, + 0.1387, + 0.094802, + 0.10063, + 0.033845, + 0.048628, + 0.0054421, + 0.014698, + 0.00045096, + 0.0027211, + 0.0, + 0.00026752, + ] + ) + if not self.remove_h + else paddle.to_tensor( + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.000657983182463795, + 0.0034172674641013145, + 0.009784846566617489, + 0.019774870947003365, + 0.04433957487344742, + 0.07253380119800568, + 0.10895635187625885, + 0.14755095541477203, + 0.17605648934841156, + 0.19964483380317688, + 0.21728302538394928, + ] + ) + ) + self.node_types = ( + paddle.to_tensor([0.5122, 0.3526, 0.0562, 0.0777, 0.0013]) + if not self.remove_h + else paddle.to_tensor( + [ + 0.7162184715270996, + 0.09598348289728165, + 0.12478094547986984, + 0.01828921213746071, + 0.0004915347089990973, + 0.014545895159244537, + 0.01616295613348484, + 0.011324135586619377, + 0.002203370677307248, + ] + ) + ) + self.edge_types = ( + paddle.to_tensor([0.88162, 0.11062, 0.0059875, 0.0017758, 0]) + if not self.remove_h + else paddle.to_tensor( + [ + 0.8293983340263367, + 0.09064729511737823, + 0.011958839371800423, + 0.0011387828271836042, + 0.0668567642569542, + ] + ) + ) + elif self.dataflag == "n<20": + self.max_n_nodes = 29 if not self.remove_h else 20 + self.max_weight = 390 if not self.remove_h else 631 + self.n_nodes = paddle.to_tensor( + [ + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 1.465040404582396150e-04, + 7.087133126333355904e-04, + 2.005274174734950066e-03, + 4.010548349469900131e-03, + 9.273706004023551941e-03, + 1.550195924937725067e-02, + 2.318426594138145447e-02, + 3.164304420351982117e-02, + 3.758744522929191589e-02, + 4.201003536581993103e-02, + 4.522579908370971680e-02, + 4.758085310459136963e-02, + 4.873823374509811401e-02, + 5.004395171999931335e-02, + 4.889755696058273315e-02, + 4.859539121389389038e-02, + 4.685382544994354248e-02, + 4.636486992239952087e-02, + 4.473684355616569519e-02, + 4.392923787236213684e-02, + 4.205032438039779663e-02, + 4.190198704600334167e-02, + 3.956525027751922607e-02, + 3.861114010214805603e-02, + 3.698311373591423035e-02, + 3.511701896786689758e-02, + 3.210086748003959656e-02, + 2.951690368354320526e-02, + 2.601728774607181549e-02, + 2.254880405962467194e-02, + 1.854924298822879791e-02, + ] + ) + self.node_types = paddle.to_tensor( + [ + 7.415896058082580566e-01, + 9.485986828804016113e-02, + 1.080681160092353821e-01, + 2.368708699941635132e-02, + 3.370510821696370840e-04, + 1.273731887340545654e-02, + 1.297908369451761246e-02, + 4.853925667703151703e-03, + 8.879197412170469761e-04, + ] + ) + self.edge_types = paddle.to_tensor( + [ + 9.066669344902038574e-01, + 4.404582828283309937e-02, + 5.253293085843324661e-03, + 3.737418155651539564e-04, + 4.366017505526542664e-02, + ] + ) + elif self.dataflag == "n<25": + self.max_n_nodes = 29 if not self.remove_h else 25 + self.max_weight = 390 if not self.remove_h else 998 + self.n_nodes = paddle.to_tensor( + [ + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 1.465040404582396150e-04, + 7.087133126333355904e-04, + 2.005274174734950066e-03, + 4.010548349469900131e-03, + 9.273706004023551941e-03, + 1.550195924937725067e-02, + 2.318426594138145447e-02, + 3.164304420351982117e-02, + 3.758744522929191589e-02, + 4.201003536581993103e-02, + 4.522579908370971680e-02, + 4.758085310459136963e-02, + 4.873823374509811401e-02, + 5.004395171999931335e-02, + 4.889755696058273315e-02, + 4.859539121389389038e-02, + 4.685382544994354248e-02, + 4.636486992239952087e-02, + 4.473684355616569519e-02, + 4.392923787236213684e-02, + 4.205032438039779663e-02, + 4.190198704600334167e-02, + 3.956525027751922607e-02, + 3.861114010214805603e-02, + 3.698311373591423035e-02, + 3.511701896786689758e-02, + 3.210086748003959656e-02, + 2.951690368354320526e-02, + 2.601728774607181549e-02, + 2.254880405962467194e-02, + 1.854924298822879791e-02, + ] + ) + self.node_types = paddle.to_tensor( + [ + 7.415896058082580566e-01, + 9.485986828804016113e-02, + 1.080681160092353821e-01, + 2.368708699941635132e-02, + 3.370510821696370840e-04, + 1.273731887340545654e-02, + 1.297908369451761246e-02, + 4.853925667703151703e-03, + 8.879197412170469761e-04, + ] + ) + self.edge_types = paddle.to_tensor( + [ + 9.066669344902038574e-01, + 4.404582828283309937e-02, + 5.253293085843324661e-03, + 3.737418155651539564e-04, + 4.366017505526542664e-02, + ] + ) + elif self.dataflag == "n<35": + self.max_n_nodes = 29 if not self.remove_h else 35 + self.max_weight = 390 if not self.remove_h else 1094 + self.n_nodes = paddle.to_tensor( + [ + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 0.000000000000000000e00, + 1.465040404582396150e-04, + 7.087133126333355904e-04, + 2.005274174734950066e-03, + 4.010548349469900131e-03, + 9.273706004023551941e-03, + 1.550195924937725067e-02, + 2.318426594138145447e-02, + 3.164304420351982117e-02, + 3.758744522929191589e-02, + 4.201003536581993103e-02, + 4.522579908370971680e-02, + 4.758085310459136963e-02, + 4.873823374509811401e-02, + 5.004395171999931335e-02, + 4.889755696058273315e-02, + 4.859539121389389038e-02, + 4.685382544994354248e-02, + 4.636486992239952087e-02, + 4.473684355616569519e-02, + 4.392923787236213684e-02, + 4.205032438039779663e-02, + 4.190198704600334167e-02, + 3.956525027751922607e-02, + 3.861114010214805603e-02, + 3.698311373591423035e-02, + 3.511701896786689758e-02, + 3.210086748003959656e-02, + 2.951690368354320526e-02, + 2.601728774607181549e-02, + 2.254880405962467194e-02, + 1.854924298822879791e-02, + ] + ) + self.node_types = paddle.to_tensor( + [ + 7.415896058082580566e-01, + 9.485986828804016113e-02, + 1.080681160092353821e-01, + 2.368708699941635132e-02, + 3.370510821696370840e-04, + 1.273731887340545654e-02, + 1.297908369451761246e-02, + 4.853925667703151703e-03, + 8.879197412170469761e-04, + ] + ) + self.edge_types = paddle.to_tensor( + [ + 9.066669344902038574e-01, + 4.404582828283309937e-02, + 5.253293085843324661e-03, + 3.737418155651539564e-04, + 4.366017505526542664e-02, + ] + ) + else: + logger.message("invalid dataflag: %s", self.dataflag) + self.complete_infos(n_nodes=self.n_nodes, node_types=self.node_types) + self.valency_distribution = paddle.zeros(3 * self.max_n_nodes - 2) + if self.dataflag == "n<15": + if not self.remove_h: + self.valency_distribution[0:6] = paddle.to_tensor( + [0, 0.5136, 0.0840, 0.0554, 0.3456, 0.0012] + ) + else: + self.valency_distribution[0:7] = paddle.to_tensor( + [ + 0.000000000000000000e00, + 1.856458932161331177e-01, + 2.707855999469757080e-01, + 3.008204102516174316e-01, + 2.362315803766250610e-01, + 3.544347826391458511e-03, + 2.972166286781430244e-03, + ] + ) + elif self.dataflag == "n<20": + if not self.remove_h: + self.valency_distribution[0:6] = paddle.to_tensor( + [0, 0.5136, 0.0840, 0.0554, 0.3456, 0.0012] + ) + else: + self.valency_distribution[0:7] = paddle.to_tensor( + [ + 0.000000000000000000e00, + 1.382219046354293823e-01, + 2.489367425441741943e-01, + 3.354085683822631836e-01, + 2.695656120777130127e-01, + 3.342652227729558945e-03, + 4.524504765868186951e-03, + ] + ) + elif self.dataflag == "n<25": + if not self.remove_h: + self.valency_distribution[0:6] = paddle.to_tensor( + [0, 0.5136, 0.0840, 0.0554, 0.3456, 0.0012] + ) + else: + self.valency_distribution[0:7] = paddle.to_tensor( + [ + 0.000000000000000000e00, + 1.382219046354293823e-01, + 2.489367425441741943e-01, + 3.354085683822631836e-01, + 2.695656120777130127e-01, + 3.342652227729558945e-03, + 4.524504765868186951e-03, + ] + ) + elif self.dataflag == "n<35": + if not self.remove_h: + self.valency_distribution[0:6] = paddle.to_tensor( + [0, 0.5136, 0.0840, 0.0554, 0.3456, 0.0012] + ) + else: + self.valency_distribution[0:7] = paddle.to_tensor( + [ + 0.000000000000000000e00, + 1.382219046354293823e-01, + 2.489367425441741943e-01, + 3.354085683822631836e-01, + 2.695656120777130127e-01, + 3.342652227729558945e-03, + 4.524504765868186951e-03, + ] + ) + if recompute_statistics: + self.n_nodes = dataloaders.node_counts() + self.node_types = dataloaders.node_types() + self.edge_types = dataloaders.edge_counts() + self.valency_distribution = dataloaders.valency_count(self.max_n_nodes) + + self.train_smiles = get_train_smiles( + cfg, dataloaders.train_dataloader, self, evaluate_dataset=False + ) + + def complete_infos(self, n_nodes, node_types): + self.input_dims = None + self.output_dims = None + self.num_classes = len(node_types) + self.max_n_nodes = len(n_nodes) - 1 + self.nodes_dist = DistributionNodes(n_nodes) + + def compute_input_output_dims( + self, dataloader, extra_features, domain_features, conditionDim=0 + ): + data = next(iter(dataloader())) + graph = data["graph"] + spectrum = data["spectrum"] + property = data["property"] + ex_dense, node_mask = utils.to_dense( + paddle.to_tensor(graph.node_feat["feat"]), + paddle.to_tensor(graph.edges.T), + paddle.to_tensor(graph.edge_feat["feat"]), + paddle.to_tensor(graph.graph_node_id), + ) + example_data = { + "X_t": ex_dense.X, + "E_t": ex_dense.E, + "y_t": spectrum, + "node_mask": node_mask, + } + + self.input_dims = { + "X": graph.node_feat["feat"].shape[1], + "E": graph.edge_feat["feat"].shape[1], + "y": property["y"].shape[1] + 1, + } # + 1 due to time conditioning + ex_extra_feat = extra_features(example_data) + self.input_dims["X"] += ex_extra_feat.X.shape[-1] + self.input_dims["E"] += ex_extra_feat.E.shape[-1] + self.input_dims["y"] += ex_extra_feat.y.shape[-1] + + ex_extra_molecular_feat = domain_features(example_data) + self.input_dims["X"] += ex_extra_molecular_feat.X.shape[-1] + self.input_dims["E"] += ex_extra_molecular_feat.E.shape[-1] + self.input_dims["y"] += ex_extra_molecular_feat.y.shape[-1] + + self.input_dims["y"] += conditionDim + + self.output_dims = { + "X": graph.node_feat["feat"].shape[1], + "E": graph.edge_feat["feat"].shape[1], + "y": 0, + } + + +def get_train_smiles(cfg, dataloader, dataset_infos, evaluate_dataset=False): + if evaluate_dataset: + assert ( + dataset_infos is not None + ), "If wanting to evaluate dataset, need to pass dataset_infos" + if not osp.exists(cfg["datadir"]): + logger.message( + "The dataset directory is not found. Will save it to default path now." + ) + root_path = download.get_datasets_path_from_url( + MSDnmrDataset.url, MSDnmrDataset.md5 + ) + path = osp.join(root_path, MSDnmrDataset.name, osp.basename(cfg["datadir"])) + if cfg["data_flag"] == "n<15": + subdataset_name = "msd_nmr_nless15" + elif cfg["data_flag"] == "n<20": + subdataset_name = "msd_nmr_nless20" + elif cfg["data_flag"] == "n<30": + subdataset_name = "msd_nmr_nless30" + elif cfg["data_flag"] == "n<35": + subdataset_name = "msd_nmr_nless35" + else: + raise ValueError( + f"Unknown data_flag: {cfg['data_flag']}. Expected one of " + f"{'n<15', 'n<20', 'n<30', 'n<35'}." + ) + path = osp.join(root_path, MSDnmrDataset.name, subdataset_name) + + remove_h = cfg["build_graph_cfg"]["__init_params__"]["remove_h"] + atom_decoder = dataset_infos.atom_decoder + + smiles_file_name = "train_smiles_no_h.npy" if remove_h else "train_smiles_h.npy" + smiles_path = os.path.join(path + "_cache", "train", smiles_file_name) + if os.path.exists(smiles_path): + logger.message("Dataset smiles were found") + train_smiles = np.load(smiles_path) + else: + logger.message("Computing dataset smiles...") + train_smiles = compute_MSDnmr_smiles(atom_decoder, dataloader, remove_h) + np.save(smiles_path, np.array(train_smiles)) + + if evaluate_dataset: + all_molecules = [] + for i, data in enumerate(dataloader): + dense_data, node_mask = utils.to_dense( + data.x, data.edge_index, data.edge_attr, data.graph_node_id + ) + dense_data = dense_data.mask(node_mask, collapse=True) + X, E = dense_data.X, dense_data.E + for k in range(X.shape[0]): + n = int(paddle.sum((X != -1)[k, :])) + atom_types = X[k, :n].cpu() + edge_types = E[k, :n, :n].cpu() + all_molecules.append([atom_types, edge_types]) + logger.message( + "Evaluating the dataset -- number of molecules to evaluate", + len(all_molecules), + ) + metrics = compute_molecular_metrics( + molecule_list=all_molecules, + train_smiles=train_smiles, + dataset_info=dataset_infos, + ) + logger.info(metrics[0]) + return train_smiles + + +def compute_MSDnmr_smiles(atom_decoder, dataloader, remove_h): + logger.message(f"Converting MSDnmr dataset to SMILES for remove_h={remove_h}...") + mols_smiles = [] + len_train = len(dataloader) + invalid = 0 + disconnected = 0 + for i, batch in enumerate(dataloader): + RDLogger.DisableLog("rdApp.*") + if i % 1000 == 0: + logger.message( + f"Converting MSDnmr dataset to SMILES {float(i)/len_train:.2%}" + ) + + logger.info(f"compute_MSDnmr_smiles i: {i:d}") + dense_data, node_mask = utils.to_dense( + paddle.to_tensor(batch["graph"].node_feat["feat"], dtype="float32"), + paddle.to_tensor(batch["graph"].edges.T, dtype="int64"), + paddle.to_tensor(batch["graph"].edge_feat["feat"], dtype="float32"), + paddle.to_tensor(batch["graph"].graph_node_id, dtype="int64"), + ) + dense_data = dense_data.mask(node_mask, collapse=True) + X, E = dense_data.X, dense_data.E + n_nodes = [int(paddle.sum((X != -1)[j, :])) for j in range(X.shape[0])] + molecule_list = [] + for k in range(X.shape[0]): + n = n_nodes[k] + atom_types = X[k, :n].cpu() + edge_types = E[k, :n, :n].cpu() + molecule_list.append([atom_types, edge_types]) + for _, molecule in enumerate(molecule_list): + mol = build_molecule_with_partial_charges( + molecule[0], molecule[1], atom_decoder + ) + smile = mol2smiles(mol) + if smile is not None: + mols_smiles.append(smile) + mol_frags = Chem.rdmolops.GetMolFrags( + mol, asMols=True, sanitizeFrags=True + ) + if len(mol_frags) > 1: + logger.info(f"Disconnected molecule {mol}, {mol_frags}") + disconnected += 1 + else: + logger.info("Invalid molecule obtained.") + invalid += 1 + + logger.info(f"Number of invalid molecules {invalid}") + logger.info(f"Number of disconnected molecules {disconnected}") + + return mols_smiles + + +class DataLoaderCollection: + def __init__(self, train_dataloader, val_dataloader=None, test_dataloader=None): + self.train_dataloader = train_dataloader + self.val_dataloader = val_dataloader + self.test_dataloader = test_dataloader + + def node_counts(self, max_nodes_possible=300): + all_counts = paddle.zeros(max_nodes_possible) + for loader in [self.train_dataloader(), self.val_dataloader()]: + for data, other_data in loader: + unique, counts = np.unique(data.graph_node_id, return_counts=True) + for count in counts: + all_counts[count] += 1 + max_index = max(all_counts.nonzero()) + all_counts = all_counts[: max_index + 1] + all_counts = all_counts / all_counts.sum() + return all_counts + + def node_types(self): + num_classes = None + for data, other_data in self.train_dataloader(): + num_classes = data.node_feat["feat"].shape[1] + break + + counts = paddle.zeros(num_classes) + + for i, (data, other_data) in enumerate(self.train_dataloader()): + counts += data.node_feat["feat"].sum(axis=0) + + counts = counts / counts.sum() + return counts + + def edge_counts(self): + num_classes = None + for data, other_data in self.train_dataloader(): + num_classes = data.edge_feat["feat"].shape[1] + break + + d = paddle.zeros(num_classes, dtype=paddle.float32) + + for i, (data, other_data) in enumerate(self.train_dataloader()): + unique, counts = np.unique(data.graph_node_id, return_counts=True) + + all_pairs = 0 + for count in counts: + all_pairs += count * (count - 1) + + num_edges = data.edges.T.shape[1] + num_non_edges = all_pairs - num_edges + + edge_types = data.edge_feat["feat"].sum(axis=0) + assert num_non_edges >= 0 + d[0] += num_non_edges + d[1:] += edge_types[1:] + + d = d / d.sum() + return d + + def valency_count(self, max_n_nodes): + valencies = paddle.zeros( + 3 * max_n_nodes - 2 + ) # Max valency possible if everything is connected + + # No bond, single bond, double bond, triple bond, aromatic bond + multiplier = paddle.to_tensor([0, 1, 2, 3, 1.5]) + + for data, other_data in self.train_dataloader(): + n = data.node_feat["feat"].shape[0] + + for atom in range(n): + edges = data.edge_feat["feat"][data.edges.T[0] == atom] + edges_total = edges.sum(axis=0) + valency = (edges_total * multiplier).sum() + valencies[valency.astype("int64").item()] += 1 + valencies = valencies / valencies.sum() + return valencies + + +class DistributionNodes(object): + def __init__(self, histogram): + """Compute the distribution of the number of nodes in the dataset, + and sample from this distribution. + historgram: dict. The keys are num_nodes, the values are counts + """ + if type(histogram) == dict: + max_n_nodes = max(histogram.keys()) + prob = paddle.zeros(shape=max_n_nodes + 1) + for num_nodes, count in histogram.items(): + prob[num_nodes] = count + else: + prob = histogram + self.prob = prob / prob.sum() + self.m = paddle.distribution.Categorical(prob) + + def sample_n(self, n_samples): + idx = self.m.sample((n_samples,)) + return idx + + def log_prob(self, batch_n_nodes): + assert len(tuple(batch_n_nodes.shape)) == 1 + p = self.prob.to(batch_n_nodes.place) + probas = p[batch_n_nodes] + log_p = paddle.log(x=probas + 1e-30) + return log_p + + +class SelecTargetTransform: + """Dynamically select specific dimensions or targets from the data.""" + + def __init__( + self, + target_indices: Union[int, Tuple[int, ...]], + apply_keys: Tuple[str, ...] = ("input", "label"), + ): + if isinstance(target_indices, int): + target_indices = (target_indices,) + self.target_indices = target_indices + self.apply_keys = apply_keys + + def __call__(self, data): + for key in self.apply_keys: + assert key in data, f"Key {key} does not exist in data." + target = data[key] + if isinstance(target, np.ndarray): + data[key] = target[..., self.target_indices] + return data + + +class RemoveYTransform: + def __init__(self): + pass + + def __call__(self, data): + data.y = np.zeros((1, 0), dtype="float32") + return data + + +class SelectMuTransform: + def __init__(self): + pass + + def __call__(self, data): + data.y = data.y[..., :1] + return data + + +class SelectHOMOTransform: + def __init__(self): + pass + + def __call__(self, data): + data.y = data.y[..., 1:] + return data diff --git a/ppmat/datasets/num_atom_crystal_dataset.py b/ppmat/datasets/num_atom_crystal_dataset.py new file mode 100644 index 00000000..3031f7de --- /dev/null +++ b/ppmat/datasets/num_atom_crystal_dataset.py @@ -0,0 +1,95 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import numbers + +import numpy as np +import paddle + +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.datasets.num_atom_dists import NUM_ATOMS_DISTRIBUTIONS +from ppmat.utils import paddle_aux # noqa + + +class NumAtomsCrystalDataset(paddle.io.Dataset): + def __init__( + self, + total_num, + formula=None, + dist_name="ALEX_MP_20", + prop_names=None, + prop_values=None, + ): + super().__init__() + + self.total_num = total_num + self.formula = formula + if formula is not None: + # self.chem_list = self.get_structure(formula) + raise NotImplementedError() + else: + self.chem_list = None + + assert dist_name in NUM_ATOMS_DISTRIBUTIONS + distribution = NUM_ATOMS_DISTRIBUTIONS.get(dist_name) + self.distribution = distribution + + self.num_atoms = np.random.choice( + list(self.distribution.keys()), + size=total_num, + p=list(self.distribution.values()), + ) + self.prop_names = prop_names + self.prop_values = prop_values + if prop_names is not None and prop_values is not None: + assert len(prop_names) == len(prop_values) + self.prop_flag = True + else: + self.prop_flag = False + + # def get_structure(self, formula): + # composition = chemparse.parse_formula(formula) + # chem_list = [] + # for elem in composition: + # num_int = int(composition[elem]) + # chem_list.extend([DEFAULT_ELEMENTS.index(elem)] * num_int) + # return chem_list + + def __len__(self) -> int: + return self.total_num + + def __getitem__(self, index): + data = {} + if self.chem_list is None: + num_atom = self.num_atoms[index] + data["structure_array"] = { + "num_atoms": ConcatData(np.array([num_atom])), + } + + else: + data["structure_array"] = { + "num_atoms": ConcatData(np.array([len(self.chem_list)])), + "atom_types": ConcatData(np.array(self.chem_list)), + } + + data["id"] = index + + if self.prop_flag: + for prop_name, prop_value in zip(self.prop_names, self.prop_values): + if isinstance(prop_value, numbers.Number): + data[prop_name] = np.array([prop_value]).astype("float32") + else: + data[prop_name] = prop_value + return data diff --git a/ppmat/datasets/num_atom_dists.py b/ppmat/datasets/num_atom_dists.py new file mode 100644 index 00000000..7944fac8 --- /dev/null +++ b/ppmat/datasets/num_atom_dists.py @@ -0,0 +1,94 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# NUM_ATOM_DIST = { +# "perov_5": [0, 0, 0, 0, 0, 1], +# "carbon_24": [ +# 0.0, +# 0.0, +# 0.0, +# 0.0, +# 0.0, +# 0.0, +# 0.3250697750779839, +# 0.0, +# 0.27795107535708424, +# 0.0, +# 0.15383352487276308, +# 0.0, +# 0.11246100804465604, +# 0.0, +# 0.04958134953209654, +# 0.0, +# 0.038745690362830404, +# 0.0, +# 0.019044491873255624, +# 0.0, +# 0.010178952552946971, +# 0.0, +# 0.007059596125430964, +# 0.0, +# 0.006074536200952225, +# ], +# "mp_20": [ +# 0.0, +# 0.0021742334905660377, +# 0.021079009433962265, +# 0.019826061320754717, +# 0.15271226415094338, +# 0.047132959905660375, +# 0.08464770047169812, +# 0.021079009433962265, +# 0.07808814858490566, +# 0.03434551886792453, +# 0.0972877358490566, +# 0.013303360849056603, +# 0.09669811320754718, +# 0.02155807783018868, +# 0.06522700471698113, +# 0.014372051886792452, +# 0.06703272405660378, +# 0.00972877358490566, +# 0.053176591981132074, +# 0.010576356132075472, +# 0.08995430424528301, +# ], +# } + + +NUM_ATOMS_DISTRIBUTIONS = { + "ALEX_MP_20": { + (1): 0.0002303828963737732, + (2): 0.002804088967292211, + (3): 0.019342289742695216, + (4): 0.1636343889258233, + (5): 0.04668051158167732, + (6): 0.07808005476530565, + (7): 0.027247714272549548, + (8): 0.1150400537121267, + (9): 0.048984340545415055, + (10): 0.12620539622566992, + (11): 0.03577352703049611, + (12): 0.14591300741832927, + (13): 0.0060031200426537475, + (14): 0.028628366058675234, + (15): 0.02022761830161729, + (16): 0.04473213051520198, + (17): 0.0013033089566287742, + (18): 0.038699389814443035, + (19): 0.0070135136024644384, + (20): 0.04345679662456145, + } +} diff --git a/ppmat/datasets/oc20_s2ef_dataset.py b/ppmat/datasets/oc20_s2ef_dataset.py new file mode 100644 index 00000000..2f0f20d1 --- /dev/null +++ b/ppmat/datasets/oc20_s2ef_dataset.py @@ -0,0 +1,868 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json # noqa +import os +import os.path as osp +import pickle +import urllib.request +from typing import Any +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +import numpy as np +import paddle.distributed as dist +from paddle.io import Dataset + +# Attempt to import tqdm for progress visualization +try: + from tqdm import tqdm +except ImportError: + + def tqdm(iterable, **kwargs): + return iterable + + +try: + import pyarrow as pa + import pyarrow.parquet as pq +except Exception as _e: # pragma: no cover # noqa + pq = None + pa = None + +from pymatgen.core import Element +from pymatgen.core import Lattice +from pymatgen.core import Structure + +from ppmat.models import build_graph_converter +from ppmat.utils import logger +from ppmat.utils.misc import is_equal # noqa + +# ----------------------------------------------------------------------------- +# OC20 S2EF Dataset Registry +# ----------------------------------------------------------------------------- +OC20_S2EF_TRAIN_2M_URLS = [ + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0000.parquet", # noqa + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0001.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0002.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0003.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0004.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0005.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0006.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0007.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0008.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0009.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0010.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0011.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0012.parquet", + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OC20/s2ef_train_2M/0013.parquet", +] + + +class OC20S2EFDataset(Dataset): + """ + Open Catalyst 2020 (OC20) S2EF (Structure to Energy and Forces) Dataset Handler. + + **Overview** + This dataset handler reads data from Parquet shards, designed specifically for + large-scale molecular dynamics datasets like OC20. It manages the full lifecycle + of data preparation: + 1. **Downloading**: Fetches Parquet shards from provided URLs if not present + locally. + 2. **Parsing & Caching**: Reads Parquet files, robustly handling schema + variations. It extracts atomic structures and properties, caching them as + efficient Pickle files. + *Note: Includes fallback mechanisms to synthesize dummy geometry if explicit* + *coordinates are missing in the source file (e.g., metadata-only shards).* + 3. **Graph Construction**: Optionally converts crystal structures into graph + representations using a specified graph converter (e.g., Radius Graph), + with support for caching. + 4. **Loading**: Provides random access to samples via `__getitem__`. + + **Directory Structure** + The `cache_path` will be structured as follows: + - `oc20_s2ef_shards/`: Raw Parquet files. + - `oc20_s2ef_cache_{converter}_cutoff_{val}/`: Root cache directory. + - `structures/`: Individual pickled `pymatgen.Structure` objects. + - `properties/`: Pickled lists of property arrays. + - `graphs/`: Individual pickled graph objects (if configured). + + Args: + path (str): Root directory to store downloaded shards and cache files. + If the path does not exist, it will be created. + + urls (Union[str, List[str]], optional): List of URLs or a single URL to + download the Parquet shards from. If None, defaults to + `OC20_S2EF_TRAIN_2M_URLS`. + + property_names (Union[str, List[str]]): List of target property names to load + (e.g., `["energy", "forces"]`). This argument is mandatory. + + url_indices (List[int], optional): If provided, selects a specific subset of + the `urls` list based on indices. Useful for distributed training data + splitting. Defaults to None. + + build_graph_cfg (Dict, optional): Configuration dictionary for building graphs + from structures (e.g., cutoff radius, max neighbors). If None, graphs + will not be generated. Defaults to None. + + transforms (Optional[Callable], optional): A callable transform function + to apply to each sample (dictionary) before returning. Defaults to None. + + cache_path (Optional[str], optional): Explicit path for the cache directory. + If None, a default path is generated under `path` based on the graph + converter configuration. Defaults to None. + + overwrite (bool, optional): If True, forces the rebuilding of structures, + properties, and graphs, ignoring existing cache files. Defaults to False. + + filter_unvalid (bool, optional): If True, filters out samples containing + NaN/Inf values in properties or corrupted graphs. Defaults to True. + + **kwargs: Additional keyword arguments for compatibility. + """ + + def __init__( + self, + path: str, + urls: Optional[Union[str, List[str]]] = None, + property_names: Optional[Union[str, List[str]]] = None, + *, + url_indices: Optional[List[int]] = None, + build_graph_cfg: Optional[Dict] = None, + transforms: Optional[Any] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, + ) -> None: + super().__init__() + + if property_names is None: + raise ValueError("property_names must be provided for OC20S2EFDataset") + + if isinstance(property_names, str): + property_names = [property_names] + self.property_names = list(property_names) if property_names else [] + + # Handle URLs configuration + urls_list: Union[str, List[str], None] = urls + if urls_list is None: + urls_list = OC20_S2EF_TRAIN_2M_URLS + + if isinstance(urls_list, str): + urls_list = [urls_list] + else: + urls_list = list(urls_list) + + if url_indices is not None: + urls_list = [urls_list[i] for i in url_indices if 0 <= i < len(urls_list)] + self.urls = urls_list + + # Configure paths + os.makedirs(path, exist_ok=True) + self.shard_dir = osp.join(path, "oc20_s2ef_shards") + os.makedirs(self.shard_dir, exist_ok=True) + + # Generate cache directory naming based on graph config + if build_graph_cfg is not None: + graph_converter_name = build_graph_cfg["__class_name__"] + cutoff_name = str( + int(build_graph_cfg.get("__init_params__", {}).get("cutoff", 5)) + ) + else: + graph_converter_name = "none" + cutoff_name = "none" + + base_cache = cache_path if cache_path is not None else path + self.cache_path = osp.join( + base_cache, + f"oc20_s2ef_cache_{graph_converter_name}_cutoff_{cutoff_name}", + ) + if dist.get_rank() == 0: + logger.info(f"Cache path: {self.cache_path}") + os.makedirs(self.cache_path, exist_ok=True) + + self.transforms = transforms + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + self.build_graph_cfg = build_graph_cfg + # Get graph_batch_size from kwargs, default to 100 for memory efficiency + self.graph_batch_size = kwargs.get("graph_batch_size", 100) + + # define sub-directories for cache + self.structures_dir = osp.join(self.cache_path, "structures") + self.graphs_dir = osp.join(self.cache_path, "graphs") + self.props_dir = osp.join(self.cache_path, "properties") + + if dist.get_rank() == 0: + os.makedirs(self.structures_dir, exist_ok=True) + os.makedirs(self.graphs_dir, exist_ok=True) + os.makedirs(self.props_dir, exist_ok=True) + + # 1) Download and ensure shard files exist locally + local_shards = self._ensure_shards() + + # 2) Check or build Structures and Properties cache + # Only rank 0 performs the build process to avoid race conditions + if dist.get_rank() == 0: + self._prepare_structures_and_properties(local_shards) + + if dist.is_initialized(): + dist.barrier() + + # 3) Check or build Graphs cache (if configuration provided) + if self.build_graph_cfg is not None: + if dist.get_rank() == 0: + self._prepare_graphs() + if dist.is_initialized(): + dist.barrier() + + # 4) Load file lists and property data into memory + # Sort files to ensure consistency across distributed ranks + self.structures = [ + osp.join(self.structures_dir, f) + for f in sorted(os.listdir(self.structures_dir)) + if f.endswith(".pkl") + ] + + if self.build_graph_cfg is not None: + self.graphs = [ + osp.join(self.graphs_dir, f) + for f in sorted(os.listdir(self.graphs_dir)) + if f.endswith(".pkl") + ] + else: + self.graphs = None + + logger.info("Loading properties into memory...") + self.property_data = { + pname: self._load_pickle(osp.join(self.props_dir, f"{pname}.pkl")) + for pname in self.property_names + } + + # 5) Filter invalid data based on properties and graphs + if self.filter_unvalid: + self._filter_by_properties() + if self.graphs is not None: + self._filter_by_graphs() + + # 6) Ensure data length consistency across all arrays + self._ensure_length_consistency() + + self.num_samples = len(self.structures) + logger.info(f"Final OC20S2EFDataset samples: {self.num_samples}") + + def _prepare_structures_and_properties(self, local_shards): + """ + Check if structures and properties are cached; rebuild if missing + or overwrite is True. + """ + num_cached = self._count_files(self.structures_dir) + # Check if all property files exist + props_exist = all( + osp.exists(osp.join(self.props_dir, f"{p}.pkl")) + for p in self.property_names + ) + + # Use a completion flag to ensure the previous build was successful + struct_done_flag = osp.join(self.structures_dir, "completed.flag") + is_complete = osp.exists(struct_done_flag) + + should_build = ( + self.overwrite or num_cached == 0 or not props_exist or not is_complete + ) + + if should_build: + logger.info("Building structures and properties from raw shards...") + # Clean old data to prevent mixing files + self._clean_dir(self.structures_dir) + self._clean_dir(self.props_dir) + + self._build_structures_and_properties( + local_shards, self.structures_dir, self.props_dir + ) + # Write completion flag + with open(struct_done_flag, "w") as f: + f.write("done") + else: + logger.info(f"Using cached structures ({num_cached}) and properties.") + + def _prepare_graphs(self): + """ + Check if graphs are cached; rebuild if missing, incomplete, + or overwrite is True. + """ + num_structs = self._count_files(self.structures_dir) + num_graphs = self._count_files(self.graphs_dir) + + # Use a completion flag for graphs + graph_done_flag = osp.join(self.graphs_dir, "completed.flag") + is_complete = osp.exists(graph_done_flag) + + # Condition: Not overwrite, marked complete, and counts match + if not self.overwrite and is_complete and num_graphs == num_structs: + logger.info(f"Using cached graphs ({num_graphs}).") + return + + logger.info( + f"Rebuilding graphs. (Structs: {num_structs}, Graphs: {num_graphs}, " + f"Complete: {is_complete}, Overwrite: {self.overwrite})" + ) + + self._clean_dir(self.graphs_dir) + converter = build_graph_converter(self.build_graph_cfg) + self._build_graphs(converter, self.structures_dir, self.graphs_dir) + + # Write completion flag + with open(graph_done_flag, "w") as f: + f.write("done") + + def _build_graphs(self, converter, structures_dir: str, graphs_dir: str) -> None: + """ + Builds graph objects from structures using a SINGLE global progress bar. + + This method processes structures in batches to manage memory usage, while + providing a unified progress visualization. + """ + import gc + import sys + + # Context manager to temporarily suppress stderr + class SuppressStderr: + def __init__(self): + self.null_fds = [os.open(os.devnull, os.O_RDWR)] + self.save_fds = [os.dup(2)] # Backup stderr (fd 2) + + def __enter__(self): + # Redirect stderr to devnull + os.dup2(self.null_fds[0], 2) + + def __exit__(self, *_): + # Restore stderr + os.dup2(self.save_fds[0], 2) + for fd in self.null_fds + self.save_fds: + os.close(fd) + + # Get file list + files = sorted([f for f in os.listdir(structures_dir) if f.endswith(".pkl")]) + total = len(files) + if total == 0: + logger.warning("No structures found to convert!") + return + + # Use configurable batch size to avoid OOM (Out of Memory) errors + # Can be set via graph_batch_size parameter in dataset config + batch_size = self.graph_batch_size + + logger.info(f"Converting {total} structures to graphs...") + logger.info(f"Using batch size: {batch_size} to manage memory usage") + + # 1. Create global progress bar + pbar = tqdm(total=total, desc="Graph Conversion", unit="sample") + + for start_idx in range(0, total, batch_size): + end_idx = min(start_idx + batch_size, total) + batch_files = files[start_idx:end_idx] + + try: + # Load structures for current batch + structures = [ + self._load_pickle(osp.join(structures_dir, f)) for f in batch_files + ] + + # 2. Convert to graphs (Suppress internal progress bars if any) + try: + with SuppressStderr(): + graphs = converter(structures) + except Exception: + # Fallback if low-level FD manipulation fails + graphs = converter(structures) + + # Save graphs + for f, g in zip(batch_files, graphs): + self._save_pickle(osp.join(graphs_dir, f), g) + + # 3. Update global progress bar + pbar.update(len(batch_files)) + + except Exception as e: + # Restore stderr to print error + sys.stderr = sys.__stderr__ + logger.warning(f"Batch {start_idx}-{end_idx} failed: {e}") + + finally: + if "structures" in locals(): + del structures + if "graphs" in locals(): + del graphs + gc.collect() + + pbar.close() + logger.info("Graph conversion completed.") + + def _ensure_length_consistency(self): + """ + Ensures consistency in length across structures, graphs, and all + property arrays. Truncates data to the minimum length found. + """ + lengths = [len(self.structures)] + if self.graphs is not None: + lengths.append(len(self.graphs)) + for p in self.property_names: + lengths.append(len(self.property_data[p])) + + min_len = min(lengths) + + if any(length != min_len for length in lengths): + logger.warning( + f"Data length mismatch detected (lengths={lengths}). " + f"Truncating to minimum length: {min_len}." + ) + self.structures = self.structures[:min_len] + if self.graphs is not None: + self.graphs = self.graphs[:min_len] + for p in self.property_names: + self.property_data[p] = self.property_data[p][:min_len] + + def _clean_dir(self, directory: str): + """Cleans a directory by removing all .pkl and .flag files.""" + for f in os.listdir(directory): + if f.endswith(".pkl") or f.endswith(".flag"): + try: + os.remove(osp.join(directory, f)) + except OSError: + pass + + def _ensure_shards(self) -> List[str]: + """ + Ensures all shard files are present locally. Downloads missing shards. + """ + local_files: List[str] = [] + for url in self.urls: + filename = osp.basename(url) + local_path = osp.join(self.shard_dir, filename) + + # Simple download logic + if (url.startswith("http") or url.startswith("https")) and ( + self.overwrite or not osp.exists(local_path) + ): + if dist.get_rank() == 0: + tmp = local_path + ".downloading" + logger.message(f"Downloading shard: {url}") + try: + urllib.request.urlretrieve(url, tmp) + os.replace(tmp, local_path) + except Exception as e: + if osp.exists(tmp): + os.remove(tmp) + raise RuntimeError(f"Download failed: {e}") + if dist.is_initialized(): + dist.barrier() + local_files.append(local_path if osp.exists(local_path) else url) + return local_files + + def _count_files(self, directory: str) -> int: + """Counts the number of .pkl files in a directory.""" + try: + return len([n for n in os.listdir(directory) if n.endswith(".pkl")]) + except Exception: + return 0 + + @staticmethod + def _save_pickle(path: str, obj: Any) -> None: + with open(path, "wb") as f: + pickle.dump(obj, f) + + @staticmethod + def _load_pickle(path: str) -> Any: + with open(path, "rb") as f: + return pickle.load(f) + + def _build_structures_and_properties( + self, shard_paths: List[str], structures_dir: str, props_dir: str + ) -> None: + """ + Builds structure objects and extracts properties from Parquet shards. + + **CRITICAL NOTE**: + This method contains robust fallback logic to handle datasets that may lack + explicit geometry information (e.g., `pos` or `cell` columns). In such cases, + it **synthesizes dummy structures** (random positions, default lattice) to + allow the data pipeline to function. + + While this enables the pipeline to run on metadata-only or partial datasets, + **models trained on this synthesized data will be physically meaningless** + regarding geometric potentials. + """ + # Initialize buffers for properties + prop_buffers: Dict[str, List[Any]] = {p: [] for p in self.property_names} + sample_index = 0 + + for shard in shard_paths: + logger.message(f"Reading shard: {shard}") + try: + pf = pq.ParquetFile(shard) + except Exception as e: + logger.warning(f"Failed to open shard {shard}: {e}") + continue + + # Get actual columns present in the file + schema_names = set(pf.schema.names) + if sample_index == 0: + logger.info(f"Parquet Schema columns: {list(schema_names)}") + + # Define column alias mapping for flexible schema matching + col_map = { + "atomic_numbers": ["atomic_numbers", "z", "atom_types"], + "pos": ["pos", "positions", "coords"], + "cell": ["cell", "lattice", "cell_relaxed", "lattice_mat"], + "energy": ["energy", "y", "total_energy", "E"], + "reference_energy": ["reference_energy", "ref_energy", "y_ref"], + "forces": ["forces", "force", "F"], + "sid": ["sid", "id", "structure_id"], + "element": ["element", "elements", "elements_symbol"], + "num_atoms_col": ["num_atoms", "nat", "natoms"], + } + + # Select the best matching column name for each field + chosen = {} + for k, cand in col_map.items(): + chosen[k] = next((c for c in cand if c in schema_names), None) + + # Determine which columns to read from the parquet file + cols_to_read = list({c for c in chosen.values() if c is not None}) + + # Safety check: ensure we have at least something to define a "row" + if not cols_to_read: + raise RuntimeError(f"No usable columns found in {shard}!") + + total_rows = pf.metadata.num_rows if pf.metadata else 0 + pbar = tqdm( + total=total_rows, desc=f"Processing Shard {osp.basename(shard)}" + ) + + for rg in range(pf.num_row_groups): + try: + tbl = pf.read_row_group(rg, columns=cols_to_read) + data = tbl.to_pydict() + except Exception as e: + logger.warning(f"Failed to read row group {rg} in {shard}: {e}") + continue + + # Retrieve batch data for key columns + atoms_batch = data.get(chosen["atomic_numbers"]) + pos_batch = data.get(chosen["pos"]) + cell_batch = data.get(chosen["cell"]) + elem_batch = data.get(chosen["element"]) + + # Determine number of rows in this batch. + # Since 'pos' or 'atoms' might be missing, checking other columns + # like 'energy' or 'element'. + nrows = 0 + for col_data in data.values(): + if col_data is not None and hasattr(col_data, "__len__"): + nrows = len(col_data) + break + + # Iterate through each sample in the batch + for i in range(nrows): + try: + # --- Step 1: Determine Atomic Numbers (Z) --- + z = None + # Case A: Explicit atomic numbers column exists + if ( + atoms_batch is not None + and i < len(atoms_batch) + and atoms_batch[i] is not None + ): + val = atoms_batch[i] + if isinstance(val, (list, np.ndarray)): + z = np.asarray(val, dtype=int) + else: + z = np.array([int(val)]) + + # Case B: Derive from Element symbols (e.g. "Ag", "Au") + elif elem_batch is not None and i < len(elem_batch): + el_raw = elem_batch[i] + # Handle single string (e.g. "Ag") or list + if isinstance(el_raw, str): + z = np.array([Element(el_raw).Z]) + elif isinstance(el_raw, (list, tuple, np.ndarray)): + z = np.array([Element(s).Z for s in el_raw]) + + # Case C: Fallback (Dummy Hydrogen) + if z is None: + # Use num_atoms column if available to set size + n_atoms = 1 + if chosen["num_atoms_col"] and data.get( + chosen["num_atoms_col"] + ): + n_atoms = int(data[chosen["num_atoms_col"]][i]) + z = np.ones(n_atoms, dtype=int) # Dummy Hydrogen + + # --- Step 2: Determine Positions (Pos) --- + if ( + pos_batch is not None + and i < len(pos_batch) + and pos_batch[i] is not None + ): + pos = np.asarray(pos_batch[i], dtype=float) + # Safety: align dimensions with Z + if pos.shape[0] != z.shape[0]: + min_len = min(pos.shape[0], z.shape[0]) + pos = pos[:min_len] + z = z[:min_len] + else: + # WARNING: SYNTHESIZING DUMMY POSITIONS + # Generate random coordinates to prevent build errors. + pos = np.random.rand(len(z), 3) * 10.0 + + # --- Step 3: Determine Lattice (Cell) --- + if ( + cell_batch is not None + and i < len(cell_batch) + and cell_batch[i] is not None + ): + matrix = np.asarray(cell_batch[i], dtype=float) + if matrix.size == 9: + matrix = matrix.reshape(3, 3) + # Validate determinant to ensure non-singular cell + if np.abs(np.linalg.det(matrix)) < 1e-3: + lattice = Lattice.cubic(20.0) + else: + lattice = Lattice(matrix) + else: + # WARNING: SYNTHESIZING DUMMY LATTICE + lattice = Lattice.cubic(20.0) + + # --- Step 4: Build Pymatgen Structure --- + structure = Structure( + lattice, + z, + pos, + coords_are_cartesian=True, + to_unit_cell=True, + ) + + # Save structure pickle + self._save_pickle( + osp.join(structures_dir, f"{sample_index:010d}.pkl"), + structure, + ) + + # --- Step 5: Extract Properties --- + for pname in self.property_names: + val = None + + # Special handling for energy + if pname == "energy": + e_col = chosen["energy"] + if e_col and data.get(e_col): + val = data[e_col][i] + # Ensure energy is converted to numpy array for consistency + # Store as scalar value (not array) to maintain type consistency + if np.isscalar(val): + val = float(val) # Store as Python float + else: + val = float(np.asarray(val, dtype=float).item()) # Convert array to scalar + elif chosen["reference_energy"] and data.get( + chosen["reference_energy"] + ): + val = data[chosen["reference_energy"]][i] + # Ensure energy is converted to numpy array for consistency + if np.isscalar(val): + val = float(val) # Store as Python float + else: + val = float(np.asarray(val, dtype=float).item()) # Convert array to scalar + + # Special handling for forces + elif pname == "forces": + f_col = chosen["forces"] + if f_col and data.get(f_col): + val = np.asarray(data[f_col][i], dtype=float) + else: + # Fallback: dummy zero forces + val = np.zeros((len(z), 3)) + + # Generic property handling + else: + c = chosen.get(pname) + if not c and pname in data: + c = pname + if c and data.get(c): + val = data[c][i] + # Ensure property is converted to appropriate format + # For scalar properties, store as Python float/int + # For array properties, store as numpy array + if val is not None: + if np.isscalar(val): + # Store scalar as Python native type for consistency + val = float(val) if isinstance(val, (float, np.floating)) else int(val) if isinstance(val, (int, np.integer)) else val + else: + # Store array as numpy array + val = np.asarray(val, dtype=float) + + prop_buffers[pname].append(val) + + sample_index += 1 + except Exception as e: + if sample_index == 0: + logger.warning( + f"Error building structure at index {i}: {e}" + ) + continue + + pbar.update(nrows) + pbar.close() + + # Check if we successfully processed any samples + logger.info(f"Processed total {sample_index} samples.") + if sample_index == 0: + raise RuntimeError( + "0 samples processed! The dataset might be empty or incompatible. " + f"Schema found: {list(schema_names)}" + ) + + # Save all properties to disk + logger.info("Saving property caches...") + for pname, arr in prop_buffers.items(): + self._save_pickle(osp.join(props_dir, f"{pname}.pkl"), arr) + + def _filter_by_properties(self) -> None: + """ + Filter out samples that contain invalid property values (e.g., NaN, Inf). + Operation is performed in-memory. + """ + if not self.property_names: + return + + total = len(self.structures) + keep = [] + + # Check properties for each sample + for i in range(total): + is_valid = True + for pname in self.property_names: + val = self.property_data[pname][i] + if val is None: + is_valid = False + break + + # Check for NaN/Inf in scalars + if isinstance(val, (float, int, np.floating, np.integer)): + if np.isnan(val) or np.isinf(val): + is_valid = False + break + # Check for NaN/Inf in arrays/lists + elif isinstance(val, (list, np.ndarray)): + arr = np.asarray(val) + if not np.all(np.isfinite(arr)): + is_valid = False + break + + if is_valid: + keep.append(i) + + if len(keep) < total: + logger.warning( + f"Filtering: Dropping {total - len(keep)} samples " + "due to invalid properties." + ) + self.structures = [self.structures[i] for i in keep] + if self.graphs: + self.graphs = [self.graphs[i] for i in keep] + for pname in self.property_names: + self.property_data[pname] = [self.property_data[pname][i] for i in keep] + + def _filter_by_graphs(self) -> None: + """ + Filter out samples with invalid or missing graphs. + Since graphs are rebuilt fully if mismatch occurs, this is mostly a + sanity check. + """ + pass + + def __getitem__(self, idx: int) -> Dict[str, Any]: + data: Dict[str, Any] = {} + if self.graphs is not None: + graph = self.graphs[idx] + if isinstance(graph, str): + graph = self._load_pickle(graph) + data["graph"] = graph + else: + structure = self.structures[idx] + if isinstance(structure, str): + structure = self._load_pickle(structure) + + # Format structure data compatible with JarvisDataset standards + atom_types = np.array([site.specie.Z for site in structure]) + lattice = structure.lattice.matrix.astype("float32") + + data["structure_array"] = { + "frac_coords": structure.frac_coords.astype("float32"), + "cart_coords": structure.cart_coords.astype("float32"), + "atom_types": atom_types, + "lattice": lattice, + "lengths": np.array(structure.lattice.abc, dtype="float32"), + "angles": np.array(structure.lattice.angles, dtype="float32"), + "num_atoms": np.array([len(atom_types)], dtype="int64"), + } + + for pname in self.property_names: + v = self.property_data[pname][idx] + # Ensure consistent dimensionality for output tensors + # Convert to numpy array and ensure proper shape for tensor conversion + if v is None: + # Handle None values + if pname == "energy": + data[pname] = np.array([0.0], dtype="float32") + elif pname == "forces": + # Get number of atoms from structure if available + if self.graphs is None and idx < len(self.structures): + structure = self.structures[idx] + if isinstance(structure, str): + structure = self._load_pickle(structure) + n_atoms = len(structure) + else: + n_atoms = 1 + data[pname] = np.zeros((n_atoms, 3), dtype="float32") + else: + data[pname] = np.array([0.0], dtype="float32") + elif np.isscalar(v): + # For scalar values, wrap in array but keep as 1D array + # This ensures it can be properly converted to tensor + data[pname] = np.array([float(v)], dtype="float32") + else: + # For array values, ensure it's a proper numpy array + v_array = np.asarray(v, dtype="float32") + # Ensure at least 1D and handle 0D arrays + if v_array.ndim == 0: + # 0D array (scalar array), convert to 1D + v_array = np.array([float(v_array)], dtype="float32") + elif v_array.ndim > 0: + # Ensure contiguous array for better tensor conversion + v_array = np.ascontiguousarray(v_array, dtype="float32") + data[pname] = v_array + + data["id"] = idx + data = self.transforms(data) if self.transforms is not None else data + return data + + def __len__(self) -> int: + return self.num_samples diff --git a/ppmat/datasets/omol25_dataset.py b/ppmat/datasets/omol25_dataset.py new file mode 100644 index 00000000..9b5846cb --- /dev/null +++ b/ppmat/datasets/omol25_dataset.py @@ -0,0 +1,741 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import ast +import json +import os +import os.path as osp +import pickle +import sys +import zlib +from typing import Any +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +import lmdb +import numpy as np +import paddle.distributed as dist +from paddle.io import Dataset + +try: + from tqdm import tqdm +except ImportError: + + def tqdm(iterable, **kwargs): + return iterable + + +from pymatgen.core import Lattice +from pymatgen.core import Structure + +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.models import build_graph_converter +from ppmat.utils import logger + + +class OMol25Dataset(Dataset): + + """OMol25 Dataset Handler + + This class provides utilities for loading and processing the OMol25 + dataset, which is utilized in molecular property prediction models such as CHGNet + and MEGNet. The implementation supports efficient loading from LMDB shards, + automatic graph construction, and smart decompression of molecular data. + + **Dataset Overview** + - **Source**: Large-scale molecular dataset hosted by PaddleMaterials, containing + DFT-calculated properties for millions of equilibrium. + ``` + ┌───────────────────┬──────────────────────────────────┐ + │ Storage Format │ LMDB (Lightning Memory-Mapped DB)│ + ├───────────────────┼──────────────────────────────────┤ + │ Total Samples │ ~4,000,000 (Full Train Set) │ + ├───────────────────┼──────────────────────────────────┤ + │ Data Type │ Small Organic Molecules │ + └───────────────────┴──────────────────────────────────┘ + ``` + The dataset can be downloaded from: https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OMol25/train_4M.tar.gz + + **Data Format** + The dataset is structured as LMDB files where each entry is a Zlib-compressed + JSON or Pickle object containing structural information and quantum chemical labels: + + | Key / Attribute | Description | Unit | + |---------------------------|-------------------------------------|---------------| + | `atomic_numbers` (Z) | List of atomic numbers | - | + | `positions` | 3D Cartesian coordinates | Å (Angstrom) | + | `u0` | Internal Energy at 0K | eV | + | `gap` | HOMO-LUMO Gap | eV | + | `homo` | Highest Occupied Molecular Orbital | eV | + | `lumo` | Lowest Unoccupied Molecular Orbital | eV | + | `dipole` | Dipole Moment magnitude | Debye | + | `forces` | Atomic Forces (Nx3 array) | eV/Å | + + **Example Data Object (Decoded):** + ```json + { + "atomic_numbers": [6, 1, 1, 1, 1], + "positions": [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], ...], + "energy": -40.5, + "data": { + "homo_lumo_gap": 6.5, + "dipole_moment": 0.0 + } + } + ``` + + Args: + path (str): The root directory to store downloaded shards and cache files. + If the path does not exist, it will be created. + urls (Optional[Union[str, List[str]]], optional): List of URLs or a single URL + to download the LMDB shards from. If None, defaults to the standard + OMol25 training set URL. + property_names (Optional[Union[str, List[str]]], optional): List of target + property names to load (e.g., `["u0"]`, `["gap"]`, `["dipole"]`). + **This argument is mandatory.** + url_indices (Optional[List[int]], optional): If provided, selects a specific + subset of the `urls` list based on indices. Useful for distributed + training or testing on a subset. Defaults to None. + build_graph_cfg (Dict, optional): Configuration dictionary for building graphs + from structures (e.g., cutoff radius). If provided, graphs will be + constructed and cached. Defaults to None. + transforms (Optional[Callable], optional): A callable transform function + to apply to each sample before returning. Defaults to None. + cache_path (Optional[str], optional): Explicit path for the cache directory. + If None, a default path is generated under `path` based on the graph + converter configuration. Defaults to None. + overwrite (bool, optional): If True, forces the rebuilding of structures, + properties, and graphs, ignoring existing cache files. Defaults to False. + filter_unvalid (bool, optional): If True, filters out samples containing + NaN/Inf values in properties. Defaults to True. + """ + + url = "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OMol25/train_4M.tar.gz" + + def __init__( + self, + path: str, + urls: Optional[Union[str, List[str]]] = None, + property_names: Optional[Union[str, List[str]]] = None, + *, + url_indices: Optional[List[int]] = None, + build_graph_cfg: Optional[Dict] = None, + transforms: Optional[Any] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, + ) -> None: + super().__init__() + if property_names is None: + raise ValueError("property_names required") + self.property_names = ( + list(property_names) + if isinstance(property_names, str) + else (list(property_names) if property_names else []) + ) + + # Handle URLs configuration + # Priority: Constructor Argument > Class Attribute + target_urls = urls + if target_urls is None: + target_urls = [self.url] + + self.urls = ( + target_urls + if isinstance(target_urls, list) + else ([target_urls] if isinstance(target_urls, str) else []) + ) + if url_indices: + self.urls = [self.urls[i] for i in url_indices if 0 <= i < len(self.urls)] + + # Configure paths + os.makedirs(path, exist_ok=True) + self.root_path = path + self.raw_dir = osp.join(path, "omol25_raw") + os.makedirs(self.raw_dir, exist_ok=True) + + # Generate cache directory based on graph converter config + gc_name = build_graph_cfg["__class_name__"] if build_graph_cfg else "none" + cutoff = ( + str(int(build_graph_cfg.get("__init_params__", {}).get("cutoff", 5))) + if build_graph_cfg + else "none" + ) + self.cache_path = osp.join( + cache_path if cache_path else path, + f"omol25_cache_{gc_name}_cutoff_{cutoff}", + ) + + if dist.get_rank() == 0: + logger.info(f"Cache path: {self.cache_path}") + os.makedirs(self.cache_path, exist_ok=True) + + self.transforms = transforms + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + self.build_graph_cfg = build_graph_cfg + + # Define sub-directories for cache + self.structures_dir = osp.join(self.cache_path, "structures") + self.graphs_dir = osp.join(self.cache_path, "graphs") + self.props_dir = osp.join(self.cache_path, "properties") + + if dist.get_rank() == 0: + os.makedirs(self.structures_dir, exist_ok=True) + os.makedirs(self.graphs_dir, exist_ok=True) + os.makedirs(self.props_dir, exist_ok=True) + + # 1. Ensure raw data exists (Download & Extract) + local_files = self._ensure_data() + + # 2. Build structures and properties + if dist.get_rank() == 0: + self._prepare_structures_and_properties(local_files) + if dist.is_initialized(): + dist.barrier() + + # 3. Build graphs (if configured) + if self.build_graph_cfg and dist.get_rank() == 0: + self._prepare_graphs() + if self.build_graph_cfg and dist.is_initialized(): + dist.barrier() + + # 4. Load file lists into memory + self.structures = [ + osp.join(self.structures_dir, f) + for f in sorted(os.listdir(self.structures_dir)) + if f.endswith(".pkl") + ] + self.graphs = ( + [ + osp.join(self.graphs_dir, f) + for f in sorted(os.listdir(self.graphs_dir)) + if f.endswith(".pkl") + ] + if self.build_graph_cfg + else None + ) + + logger.info("Loading properties...") + self.property_data = { + p: self._load_pickle(osp.join(self.props_dir, f"{p}.pkl")) + for p in self.property_names + } + + # 5. Filter invalid data + if self.filter_unvalid: + self._filter_by_properties() + self._ensure_length_consistency() + self.num_samples = len(self.structures) + logger.info(f"Final Samples: {self.num_samples}") + + def _prepare_structures_and_properties(self, local_files): + num_cached = self._count_files(self.structures_dir) + is_complete = osp.exists(osp.join(self.structures_dir, "completed.flag")) + if self.overwrite or num_cached == 0 or not is_complete: + self._clean_dir(self.structures_dir) + self._clean_dir(self.props_dir) + self._build_structures_and_properties( + local_files, self.structures_dir, self.props_dir + ) + with open(osp.join(self.structures_dir, "completed.flag"), "w") as f: + f.write("done") + else: + logger.info(f"Using cached data: {num_cached}") + + def _prepare_graphs(self): + if not self.overwrite and osp.exists( + osp.join(self.graphs_dir, "completed.flag") + ): + return + self._clean_dir(self.graphs_dir) + converter = build_graph_converter(self.build_graph_cfg) + self._build_graphs(converter, self.structures_dir, self.graphs_dir) + with open(osp.join(self.graphs_dir, "completed.flag"), "w") as f: + f.write("done") + + def _build_graphs(self, converter, s_dir, g_dir): + class SuppressStderr: + def __init__(self): + self.null_fds = [os.open(os.devnull, os.O_RDWR)] + self.save_fds = [os.dup(2)] + + def __enter__(self): + os.dup2(self.null_fds[0], 2) + + def __exit__(self, *_): + os.dup2(self.save_fds[0], 2) + for fd in self.null_fds + self.save_fds: + os.close(fd) + + files = sorted([f for f in os.listdir(s_dir) if f.endswith(".pkl")]) + if not files: + return + + # Global progress bar + pbar = tqdm(total=len(files), desc="Graph Conversion", unit="sample") + batch_size = 1000 + + for i in range(0, len(files), batch_size): + batch = files[i : i + batch_size] + try: + structs = [self._load_pickle(osp.join(s_dir, f)) for f in batch] + + # Attempt to suppress converter output + try: + with SuppressStderr(): + graphs = converter(structs) + except Exception: + # Fallback if suppression fails + graphs = converter(structs) + + for f, g in zip(batch, graphs): + self._save_pickle(osp.join(g_dir, f), g) + pbar.update(len(batch)) + except Exception as e: + sys.stderr = sys.__stderr__ + logger.warning(f"Graph convert error: {e}") + pbar.close() + + def _build_structures_and_properties( + self, file_paths: List[str], structures_dir: str, props_dir: str + ) -> None: + prop_buffers = {p: [] for p in self.property_names} + sample_index = 0 + + # Helper function to decode ASE's special dictionary format for numpy arrays + def smart_decode_item(item): + if isinstance(item, dict) and "__ndarray__" in item: + content = item["__ndarray__"] + if isinstance(content, list) and len(content) >= 3: + dtype = "float64" + candidates = [] + for x in content: + if isinstance(x, str): + dtype = x + elif isinstance(x, list): + candidates.append(x) + shape, data = None, None + + # Heuristic to identify shape vs data + if len(candidates) == 2: + c1, c2 = candidates[0], candidates[1] + l1, l2 = len(c1), len(c2) + # Shape is usually short, Data is usually long + if l1 <= 5 and l2 > 5: + shape, data = c1, c2 + elif l2 <= 5 and l1 > 5: + shape, data = c2, c1 + else: + data, shape = c1, c2 # Default order + try: + if data is not None: + arr = np.array(data, dtype=dtype) + if shape: + try: + arr = arr.reshape(shape) + except Exception: + pass + return arr + except Exception: + pass + return item + return item + + for filepath in file_paths: + logger.message(f"Reading LMDB (Smart Unpacker): {filepath}") + try: + env = lmdb.open( + filepath, + subdir=False, + readonly=True, + lock=False, + readahead=False, + meminit=False, + ) + except Exception as e: + logger.warning(f"Open Error: {e}") + continue + + with env.begin() as txn: + cursor = txn.cursor() + total = env.stat()["entries"] + pbar = tqdm(total=total, desc=f"Processing {osp.basename(filepath)}") + + for key, value in cursor: + try: + # Skip non-integer keys (metadata) + try: + _ = int(key.decode("ascii")) + except ValueError: + continue + + # Attempt to decode payload (Zlib -> Pickle -> JSON -> AST) + raw_obj = None + payload = value + try: + payload = zlib.decompress(value) + except Exception: + pass + + try: + raw_obj = pickle.loads(payload) + except Exception: + try: + raw_obj = json.loads(payload.decode("utf-8")) + except Exception: + try: + raw_obj = ast.literal_eval(payload.decode("utf-8")) + except Exception: + continue + + # Standardize to dictionary + row_data = {} + if isinstance(raw_obj, dict): + row_data = raw_obj + elif hasattr(raw_obj, "__dict__"): + row_data = raw_obj.__dict__ + else: + row_data = raw_obj + + def get_v(obj, k): + val = ( + obj.get(k) + if isinstance(obj, dict) + else getattr(obj, k, None) + ) + return smart_decode_item(val) + + # Extract atoms and positions + z = get_v(row_data, "numbers") + if z is None: + z = get_v(row_data, "atomic_numbers") + pos = get_v(row_data, "positions") + if z is None or pos is None: + continue + + # Build Structure + lattice = Lattice.cubic(50.0) + if isinstance(z, dict): + z = smart_decode_item(z) + if isinstance(pos, dict): + pos = smart_decode_item(pos) + + z = np.array(z, dtype=int) + pos = np.array(pos, dtype=float) + + structure = Structure( + lattice, + z, + pos, + coords_are_cartesian=True, + to_unit_cell=True, + ) + self._save_pickle( + osp.join(structures_dir, f"{sample_index:010d}.pkl"), + structure, + ) + + # Extract properties + extra = get_v(row_data, "data") or {} + for pname in self.property_names: + val = get_v(row_data, pname) + if val is None and isinstance(extra, dict): + val = extra.get(pname) + # Property aliases + if val is None: + if pname == "gap" and isinstance(extra, dict): + val = extra.get("homo_lumo_gap") + elif pname == "u0": + val = get_v(row_data, "energy") + + val = smart_decode_item(val) + # Fill missing forces with zeros + if pname == "forces" and val is None: + val = np.zeros((len(z), 3)) + prop_buffers[pname].append(val) + + sample_index += 1 + pbar.update(1) + except Exception: + continue + pbar.close() + env.close() + + logger.info(f"Processed total {sample_index} samples.") + if sample_index == 0: + raise RuntimeError("0 samples processed!") + + logger.info("Saving props...") + for pname, arr in prop_buffers.items(): + self._save_pickle(osp.join(props_dir, f"{pname}.pkl"), arr) + + def _ensure_data(self): + lmdb_files = [] + for root, _, files in os.walk(self.raw_dir): + for file in files: + if file.endswith(".aselmdb"): + lmdb_files.append(osp.join(root, file)) + + # Check if we need to download + if not lmdb_files: + logger.warning(f"No .aselmdb files found in {self.raw_dir}") + + if self.urls: + for url in self.urls: + if not url: + continue + filename = osp.basename(url) + local_path = osp.join(self.root_path, filename) + + if dist.get_rank() == 0: + try: + # === PROGRESS BAR ADDED HERE === + class TqdmUpTo(tqdm): + def update_to(self, b=1, bsize=1, tsize=None): + if tsize is not None: + self.total = tsize + self.update(b * bsize - self.n) + + logger.message(f"Downloading {url}...") + import urllib.request + + # Using TqdmUpTo as reporthook + with TqdmUpTo( + unit="B", + unit_scale=True, + unit_divisor=1024, + miniters=1, + desc=filename, + ) as t: + urllib.request.urlretrieve( + url, local_path, reporthook=t.update_to + ) + # ============================== + + if filename.endswith("tar.gz"): + logger.info(f"Extracting {filename}...") + import tarfile + + with tarfile.open(local_path, "r:gz") as tar: + tar.extractall(path=self.raw_dir) + logger.info("Extraction complete.") + + except Exception as e: + logger.warning(f"Download/Extract failed: {e}") + + if dist.is_initialized(): + dist.barrier() + + # Re-check for files after potential download + for root, _, files in os.walk(self.raw_dir): + for file in files: + if file.endswith(".aselmdb"): + lmdb_files.append(osp.join(root, file)) + + return sorted(lmdb_files) + + def _clean_dir(self, d): + for f in os.listdir(d): + if f.endswith(".pkl") or f.endswith(".flag"): + os.remove(osp.join(d, f)) + + def _count_files(self, d): + return len([n for n in os.listdir(d) if n.endswith(".pkl")]) + + def _ensure_length_consistency(self): + length_list = [len(self.structures)] + if self.graphs: + length_list.append(len(self.graphs)) + for p in self.property_names: + length_list.append(len(self.property_data[p])) + m = min(length_list) + if any(x != m for x in length_list): + self.structures = self.structures[:m] + if self.graphs: + self.graphs = self.graphs[:m] + for p in self.property_names: + self.property_data[p] = self.property_data[p][:m] + + def _filter_by_properties(self) -> None: + if not self.property_names: + return + total = len(self.structures) + keep = [] + for i in range(total): + is_valid = True + for pname in self.property_names: + val = self.property_data[pname][i] + if val is None: + is_valid = False + break + if isinstance(val, (float, int, np.floating, np.integer)): + if np.isnan(val) or np.isinf(val): + is_valid = False + break + elif isinstance(val, (list, np.ndarray)): + arr = np.asarray(val) + if not np.all(np.isfinite(arr)): + is_valid = False + break + if is_valid: + keep.append(i) + + if len(keep) < total: + logger.warning(f"Filtering: Dropping {total - len(keep)} samples.") + self.structures = [self.structures[i] for i in keep] + if self.graphs: + self.graphs = [self.graphs[i] for i in keep] + for pname in self.property_names: + self.property_data[pname] = [self.property_data[pname][i] for i in keep] + + def _filter_by_graphs(self) -> None: + pass + + def _load_pickle(self, p): + with open(p, "rb") as f: + return pickle.load(f) + + def _save_pickle(self, p, o): + with open(p, "wb") as f: + pickle.dump(o, f) + + def __getitem__(self, idx): + global _DEBUG_PRINT_ONCE + data = {} + if self.graphs: + g = self.graphs[idx] + graph_obj = self._load_pickle(g) if isinstance(g, str) else g + + # Debug: Print keys once + if not _DEBUG_PRINT_ONCE: + if hasattr(graph_obj, "node_feat"): + print(f"\n[DEBUG] Node Keys: {graph_obj.node_feat.keys()}") + if hasattr(graph_obj, "edge_feat"): + print(f"[DEBUG] Edge Keys: {graph_obj.edge_feat.keys()}") + _DEBUG_PRINT_ONCE = True + + # --- PATCH 1: Composition Feature (Dim 94) --- + source_key = None + for k in ["atom_types", "atom_type", "type", "atomic_numbers", "Z"]: + if k in graph_obj.node_feat: + source_key = k + break + + atom_codes = None + if source_key: + atom_codes = graph_obj.node_feat[source_key] + else: + # Fallback to structure file + try: + s_path = self.structures[idx] + s = self._load_pickle(s_path) if isinstance(s_path, str) else s_path + atom_codes = np.array([site.specie.Z for site in s], dtype="int64") + graph_obj.node_feat["atom_type"] = atom_codes + except Exception: + pass + + # Create One-Hot Embedding (94 elements) + if atom_codes is not None: + if not isinstance(atom_codes, np.ndarray): + atom_codes = np.array(atom_codes) + N = atom_codes.shape[0] + padded_fea = np.zeros((N, 94), dtype="float32") + for i, z in enumerate(atom_codes.flatten()): + idx_val = int(z) - 1 + if 0 <= idx_val < 94: + padded_fea[i, idx_val] = 1.0 + graph_obj.node_feat["composition_fea"] = padded_fea + + # --- PATCH 2: Missing 'atom_graph' --- + if "atom_graph" not in graph_obj.edge_feat: + if hasattr(graph_obj, "edges"): + edges = graph_obj.edges + if not isinstance(edges, np.ndarray): + edges = np.array(edges) + graph_obj.edge_feat["atom_graph"] = edges.astype("int32") + else: + graph_obj.edge_feat["atom_graph"] = np.zeros((0, 2), dtype="int32") + + # --- PATCH 3: Missing 'bond_graph' & Indices --- + if "bond_graph" not in graph_obj.edge_feat: + graph_obj.edge_feat["bond_graph"] = np.zeros((0, 2), dtype="int32") + if "bond_line_graph_index" not in graph_obj.edge_feat: + graph_obj.edge_feat["bond_line_graph_index"] = np.zeros( + (0,), dtype="int32" + ) + + # --- PATCH 4: Missing 'directed2undirected' & 'undirected2directed' --- + num_edges = 0 + if hasattr(graph_obj, "num_edges"): + num_edges = graph_obj.num_edges + elif hasattr(graph_obj, "edges"): + num_edges = len(graph_obj.edges) + + # Hack: Assume 1-to-1 mapping + idx_range = np.arange(num_edges, dtype="int32") + if "directed2undirected" not in graph_obj.edge_feat: + graph_obj.edge_feat["directed2undirected"] = idx_range + + if "undirected2directed" not in graph_obj.edge_feat: + graph_obj.edge_feat["undirected2directed"] = idx_range + + # --- PATCH 5: Angle Index (Dummy) --- + if "angle_graph_index" not in graph_obj.edge_feat: + graph_obj.edge_feat["angle_graph_index"] = np.zeros((0,), dtype="int32") + + data["graph"] = graph_obj + else: + s = self.structures[idx] + if isinstance(s, str): + s = self._load_pickle(s) + z = np.array([site.specie.Z for site in s]) + lattice_matrix = s.lattice.matrix.astype("float32") + data["structure_array"] = { + "frac_coords": ConcatData(s.frac_coords.astype("float32")), + "cart_coords": ConcatData(s.cart_coords.astype("float32")), + "atom_types": ConcatData(z), + "lattice": ConcatData(lattice_matrix.reshape(1, 3, 3)), + "lengths": ConcatData( + np.array(s.lattice.abc, dtype="float32").reshape(1, 3) + ), + "angles": ConcatData( + np.array(s.lattice.angles, dtype="float32").reshape(1, 3) + ), + "num_atoms": ConcatData(np.array([len(z)], dtype="int64")), + } + + for pname in self.property_names: + v = self.property_data[pname][idx] + if v is None: + v = 0.0 + val_arr = np.array(v, dtype="float32") + if val_arr.ndim == 0: + val_arr = val_arr.reshape(1) + + # Assign to original key + data[pname] = val_arr + # Create alias for CHGNet + data["energy_per_atom"] = val_arr + + data["id"] = idx + return self.transforms(data) if self.transforms else data + + def __len__(self): + return self.num_samples diff --git a/ppmat/datasets/qm9_dataset.py b/ppmat/datasets/qm9_dataset.py new file mode 100644 index 00000000..fec8889c --- /dev/null +++ b/ppmat/datasets/qm9_dataset.py @@ -0,0 +1,766 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import annotations + +import math +import os +import os.path as osp +import pickle ## for dump/load +from collections import defaultdict +from typing import Any +from typing import Callable +from typing import Dict +from typing import Optional +from typing import Union +from typing import List + +import numpy as np +import paddle.distributed as dist +from paddle.io import Dataset + +from ppmat.datasets.build_structure import BuildStructure +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.models import build_graph_converter +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils.io import read_json +from ppmat.utils.misc import is_equal + +# Attempt to import tqdm for progress visualization +try: + from tqdm import tqdm +except ImportError: + def tqdm(iterable, **kwargs): + return iterable + +try: + import ase.io + import ase.data + import ase.build + from pymatgen.io.ase import AseAtomsAdaptor + + read = ase.io.read + symbols = ase.data.atomic_numbers + ASE_AVAILABLE = True + +except ImportError: + + def dummy_read(*args, **kwargs): + """ + If ASE is not installed, this pseudo-read function will throw an error when called. + In the `__init__` method of `QM9Dataset`, if `read` is not needed immediately, + you can simply return `None` or an empty list. However, if it is needed, the error will be more explicit. + + """ + raise RuntimeError( + "Atomic Simulation Environment (ASE) is required but not installed. " + "Please install it (e.g., pip install ase) to use QM9Dataset." + ) + read = dummy_read + symbols = None + AseAtomsAdaptor = None + ASE_AVAILABLE = False + print("Warning: ASE (Atomic Simulation Environment) not found. Data parsing functionality is disabled.") + +class QM9Dataset(Dataset): + """ + QM9 (GDB-9) Dataset Handler + In order to adapt to the CHGNet model, I made a forced mapping from 'lumo' to 'energy_per_atom'. + The CHGNet model is used to run machine learning potentials, and the QM9 dataset may not be very suitable. + LUMO is a property. Please be aware of this when using it to avoid misunderstandings. + This code is for research purposes only and does not represent the optimal approach.——by wwaawwaaee + + **Dataset Overview** + this class downloads QM9 primiry(end with .xyz)and transfered into + the input structures and quantum chemical property labels required + by graph neural network (GNN) models.(maybe) + + **dataset format** + ----------------- + - raw data: qm9.zip () + - struncture file: a sample corresponds to a seperate .xyz file + - attribute(label): 19 quantum chemical properties are embedded in each .xyz file's + second line comment + + **source**:Original data available at https://figshare.com/ndownloader/files/3195389 + + The dataset can also be found at https://paddle-org.bj.bcebos.com/paddlematerials/datasets/qm9/dsgdb9nsd.xyz.tar.bz2 + + **Key Properties List (Available for 'property_names' argument)** + ----------------------------------------------------------------- + 1. mu (Dipole Moment, Debye) + 2. alpha (Isotropic Polarizability, Bohr^3) + 3. homo (HOMO Energy, Hartree) + 4. lumo (LUMO Energy, Hartree) + 5. gap (LUMO-HOMO Gap, Hartree) + 6. U0 (Internal Energy at 0 K, Hartree) + sly + # ... (remaining 13 properties here in their correct order) + + **__getitem__ Sample Contract** + ---------------------------------------- + - 'atom_types': np.ndarray (dtype=int64) - Atomic numbers (Z). + - 'coords': np.ndarray (dtype=float32) - 3D Cartesian coordinates in Angstrom. + - [property_name]: np.ndarray (dtype=float32) - The target label value (e.g., 'lumo'). + - 'graph': (Optional) The graph object constructed by the converter (if configured). + + Args: + path (str): The root directory to store downloaded and cache files. + property_names (Union[str, List[str]]): The name(s) of the target property + to predict. Must be selected from the list above. Defaults to 'lumo'. + build_graph_cfg (Dict, optional): Configuration dictionary for building + the graph representation from the molecular structure (e.g., cutoff radius). + Defaults to None (structure is returned instead of graph). + transforms (Optional[Callable], optional): A preprocessing function to apply + to the sample dictionary. Defaults to None. + cache_path (Optional[str], optional): Explicit path for the cache directory. + Defaults to None. + overwrite (bool, optional): If True, forces the rebuilding of caches. + Defaults to False. + filter_unvalid (bool, optional): Whether to filter out corrupted samples. + Defaults to True. + """ + + url = "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/qm9/dsgdb9nsd.xyz.tar.bz2" + name = "qm9" + md5 = "AD1EBD51EE7F5B3A6E32E974E5D54012" + + # Official QM9 second-line property order (including tag/index) + PROP_ORDER = [ + "tag", # textual tag / molecule identifier (often 'gdb ...') + "index", # numeric index (maps to vals_float[0] after removing 'gdb') + "A", # rotational constant A (GHz) + "B", # rotational constant B (GHz) + "C", # rotational constant C (GHz) + "mu", # dipole moment (Debye) + "alpha", # isotropic polarizability (Bohr^3) + "homo", # HOMO energy (Hartree) + "lumo", # LUMO energy (Hartree) + "gap", # LUMO-HOMO gap (Hartree) + "r2", # electronic spatial extent (Bohr^2) + "zpve", # zero point vibrational energy (Hartree) + "U0", # internal energy at 0K (Hartree) + "U", # internal energy at 298.15 K (Hartree) + "H", # enthalpy at 298.15 K (Hartree) + "G", # free energy at 298.15 K (Hartree) + "Cv", # heat capacity at 298.15 K (cal/mol/K) + ] + + def __init__( + self, + path: str, + url: Optional[str] = None, + property_names: Union[str, List[str]] = None, + *, + url_indices: Optional[List[int]] = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + **kwargs, + ) -> None: + super().__init__() + + # Use the ASE_AVAILABLE flag and AseAtomsAdaptor presence to validate dependencies + if not ASE_AVAILABLE or AseAtomsAdaptor is None: + raise RuntimeError( + "QM9Dataset requires 'ase' and 'pymatgen'. " + "Please install them via: pip install ase pymatgen" + ) + + if property_names is None: + raise ValueError("property_names must be provided for QM9Dataset") + + if isinstance(property_names,str): + property_names = [property_names] + self.property_names = list(property_names) if property_names else [] + + # Handle URLs configuration + self.url = url if url is not None else self.url + + #Path Configuration + os.makedirs(path, exist_ok=True) + self.raw_dir = osp.join(path, "raw_qm9") + os.makedirs(self.raw_dir, exist_ok=True) + + self.raw_xyz_path = osp.join(self.raw_dir, "dsgdb9nsd.xyz") + + # Generate cache directory naming based on graph config + if build_graph_cfg is not None: + graph_converter_name = build_graph_cfg.get("__class_name__", "custom") + cutoff_name = str( + int(build_graph_cfg.get("__init_params__", {}).get("cutoff", 5)) + ) + else: + graph_converter_name = "none" + cutoff_name = "none" + + base_cache = cache_path if cache_path is not None else path #determine the final path + self.cache_path = osp.join( + base_cache, + f"qm9_cache_{graph_converter_name}_cutoff_{cutoff_name}", + ) + + self.transforms = transforms + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + self.build_graph_cfg = build_graph_cfg + + # define sub-directories for cache + self.structures_dir = osp.join(self.cache_path, "structures") + self.graphs_dir = osp.join(self.cache_path, "graphs") + self.props_dir = osp.join(self.cache_path, "properties") + + if dist.get_rank() == 0: + logger.info(f"Cache path: {self.cache_path}") + os.makedirs(self.structures_dir, exist_ok=True) + os.makedirs(self.graphs_dir, exist_ok=True) + os.makedirs(self.props_dir, exist_ok=True) + + # =========== data operation ============== + + # 1) Download and ensure shard files exist locally + local_raw_file = self._ensure_raw_data() + + # 2) Check or build Structures and Properties cache + if dist.get_rank() == 0: + self._prepare_structures_and_properties(local_raw_file) + # Only rank 0 performs the build process to avoid race conditions + + if dist.is_initialized(): + dist.barrier() + + # 3) Check or build Graphs cache (if configuration provided) + if self.build_graph_cfg is not None: + if dist.get_rank() == 0: + self._prepare_graphs() + if dist.is_initialized(): + dist.barrier() + + PROPERTY_FILE_MAP = { + "energy_per_atom": "lumo", # cheat the model of the way it gets the data + } + # 4) Load file lists and property data into memory + self.structures = [ + osp.join(self.structures_dir, f) + for f in sorted(os.listdir(self.structures_dir)) + if f.endswith(".pkl") + ] + + if self.build_graph_cfg is not None: + self.graphs = [ + osp.join(self.graphs_dir, f) + for f in sorted(os.listdir(self.graphs_dir)) + if f.endswith(".pkl") + ] + else: + self.graphs = None + + logger.info(f"Loading properties {self.property_names} into memory...") + + self.property_data = {} + for pname in self.property_names: + + # Determine the actual file name: use the mapping table if available; otherwise, use the configuration name itself + file_name = PROPERTY_FILE_MAP.get(pname, pname) + + file_path = osp.join(self.props_dir, f"{file_name}.pkl") + + if not osp.exists(file_path): + raise FileNotFoundError( + f"[QM9 Map Error]can't find the file: {file_path}. " + f"(require label: {pname}, actually find the file: {file_name}.pkl)" + ) + + # Although the name of file is lumo.pkl,The key stored in the dictionary is still pname (such as energy_per_atom) + self.property_data[pname] = self._load_pickle(file_path) + + # self.property_data = { + # pname: self._load_pickle(osp.join(self.props_dir, f"{pname}.pkl")) + # for pname in self.property_names + # } + + + # Sort files to ensure consistency across distributed ranks + # 5) Filter invalid data based on properties and graphs + if self.filter_unvalid: + self._filter_by_properties() + if self.graphs is not None: + self._filter_by_graphs() + # 6) Ensure data length consistency across all arrays + self._ensure_length_consistency() + + self.num_samples = len(self.structures) + logger.info(f"Final QM9Dataset samples: {self.num_samples}") + + + def _prepare_structures_and_properties(self, raw_file_path: str): + """ + Check if structures and properties are cached; rebuild if missing + or overwrite is True. + """ + + num_cached = self._count_files(self.structures_dir) + + # Check if all property files exist + props_exist = all( + osp.exists(osp.join(self.props_dir, f"{p}.pkl")) + for p in self.property_names + ) + + # Use a completion flag to ensure the previous build was successful + struct_done_flag = osp.join(self.structures_dir, "completed.flag") + is_complete = osp.exists(struct_done_flag) + + + should_build = ( + self.overwrite or num_cached == 0 or not props_exist or not is_complete + ) + + if should_build: + if dist.get_rank() == 0: + logger.info("Building structures and properties from raw QM9 file...") + + # Clean old data to prevent mixing files + self._clean_dir(self.structures_dir) + self._clean_dir(self.props_dir) + + self._build_structures_and_properties( + raw_file_path, self.structures_dir, self.props_dir + ) + + # Write completion flag + with open(struct_done_flag, "w") as f: + f.write("done") + else: + logger.info(f"Using cached structures ({num_cached}) and properties.") + + + def _prepare_graphs(self): + """ + Check if graphs are cached; rebuild if missing, incomplete, + or overwrite is True. + """ + num_structs = self._count_files(self.structures_dir) + num_graphs = self._count_files(self.graphs_dir) + + # Use a completion flag for graphs + graph_done_flag = osp.join(self.graphs_dir, "completed.flag") + is_complete = osp.exists(graph_done_flag) + + # Condition: Not overwrite, marked complete, and counts match + if not self.overwrite and is_complete and num_graphs == num_structs: + logger.info(f"Using cached graphs ({num_graphs}).") + return + + logger.info( + f"Rebuilding graphs. (Structs: {num_structs}, Graphs: {num_graphs}, " + f"Complete: {is_complete}, Overwrite: {self.overwrite})" + ) + + self._clean_dir(self.graphs_dir) + converter = build_graph_converter(self.build_graph_cfg) + self._build_graphs(converter, self.structures_dir, self.graphs_dir) + + # Write completion flag + with open(graph_done_flag, "w") as f: + f.write("done") + + def _build_graphs(self, converter, structures_dir: str, graphs_dir: str) -> None: + """ + Builds graph objects from structures using a SINGLE global progress bar. + + This method processes structures in batches to manage memory usage, while + providing a unified progress visualization. + """ + import gc + import sys + + # Context manager to temporarily suppress stderr + class SuppressStderr: + def __init__(self): + self.null_fds = [os.open(os.devnull, os.O_RDWR)] + self.save_fds = [os.dup(2)] # Backup stderr (fd 2) + + def __enter__(self): + # Redirect stderr to devnull + os.dup2(self.null_fds[0], 2) + + def __exit__(self, *_): + # Restore stderr + os.dup2(self.save_fds[0], 2) + for fd in self.null_fds + self.save_fds: + os.close(fd) + + # Get file list + files = sorted([f for f in os.listdir(structures_dir) if f.endswith(".pkl")]) + total = len(files) + if total == 0: + logger.warning("No structures found to convert!") + return + + batch_size = 2000 # Define batch size + + logger.info(f"Converting {total} structures to graphs...") + + # 1. Create global progress bar + pbar = tqdm(total=total, desc="Graph Conversion", unit="sample") + + for start_idx in range(0, total, batch_size): + end_idx = min(start_idx + batch_size, total) + batch_files = files[start_idx:end_idx] + + try: + # Load structures for current batch + structures = [ + self._load_pickle(osp.join(structures_dir, f)) for f in batch_files + ] + + # 2. Convert to graphs (Suppress internal progress bars if any) + try: + with SuppressStderr(): + graphs = converter(structures) + except Exception: + # Fallback if low-level FD manipulation fails + graphs = converter(structures) + + # Save graphs + for f, g in zip(batch_files, graphs): + self._save_pickle(osp.join(graphs_dir, f), g) + + # 3. Update global progress bar + pbar.update(len(batch_files)) + + except Exception as e: + # Restore stderr to print error + sys.stderr = sys.__stderr__ + logger.warning(f"Batch {start_idx}-{end_idx} failed: {e}") + + finally: + if "structures" in locals(): + del structures + if "graphs" in locals(): + del graphs + gc.collect() + + pbar.close() + logger.info("Graph conversion completed.") + + def _ensure_length_consistency(self): + """ + Ensures consistency in length across structures, graphs, and all + property arrays. Truncates data to the minimum length found. + """ + lengths = [len(self.structures)] + if self.graphs is not None: + lengths.append(len(self.graphs)) + for p in self.property_names: + lengths.append(len(self.property_data[p])) + + min_len = min(lengths) + + if any(length != min_len for length in lengths): + logger.warning( + f"Data length mismatch detected (lengths={lengths}). " + f"Truncating to minimum length: {min_len}." + ) + self.structures = self.structures[:min_len] + if self.graphs is not None: + self.graphs = self.graphs[:min_len] + for p in self.property_names: + self.property_data[p] = self.property_data[p][:min_len] + + + def _clean_dir(self, directory: str): + """Cleans a directory by removing all .pkl and .flag files.""" + for f in os.listdir(directory): + if f.endswith(".pkl") or f.endswith(".flag"): + try: + os.remove(osp.join(directory, f)) + except OSError: + pass + + + def _ensure_raw_data(self) -> str: + """ + downloading self.url -> self.raw_xyz_path + """ + # 1. if the final file exists , return. + if osp.exists(self.raw_xyz_path): + return self.raw_xyz_path + + # 2. prepare the path to download + tar_filename = "qm9_raw.tar.bz2" + tar_path = osp.join(self.raw_dir, tar_filename) + + # 3. downloading logic + if not osp.exists(tar_path): + if dist.get_rank() == 0: + logger.info(f"Downloading QM9 from {self.url}...") + import urllib.request + try: + urllib.request.urlretrieve(self.url, tar_path) + except Exception as e: + raise RuntimeError(f"Download failed: {e}") + if dist.is_initialized(): + dist.barrier() + + # 4. extacting logic + if dist.get_rank() == 0: + logger.info("Extracting QM9...") + import tarfile + try: + with tarfile.open(tar_path, "r:bz2") as tar: + tar.extractall(path=self.raw_dir) + except Exception as e: + raise RuntimeError(f"Extraction failed: {e}") + + if dist.is_initialized(): + dist.barrier() + + # 5. final check + # Case A:single file exists. + if osp.exists(self.raw_xyz_path): + return self.raw_xyz_path + + + # Case B:merge these .xyz files into a big file. + xyz_files = [f for f in os.listdir(self.raw_dir) if f.endswith(".xyz") and f != "dsgdb9nsd.xyz"] + if len(xyz_files) > 0: + logger.info(f"Found {len(xyz_files)} xyz files, merging into dsgdb9nsd.xyz...") + merged_path = self.raw_xyz_path + + if osp.exists(merged_path): + os.remove(merged_path) + + with open(merged_path, "w") as fout: # use "w" model to rewrite + for fname in tqdm(sorted(xyz_files), desc="Merging XYZ files"): + full_path = osp.join(self.raw_dir, fname) + try: + with open(full_path, "r") as fin: + lines = fin.readlines() + + if not lines: continue + natoms = int(lines[0].strip()) + + # 1. Number of atoms written + fout.write(f"{natoms}\n") + # 2. Write attribute line + prop_line = lines[1].replace('*^', 'e').replace('\t', ' ') + fout.write(prop_line) + # 3. Write coordinate lines (only take natoms lines) + for i in range(2, 2 + natoms): + coord_line = lines[i].replace('*^', 'e').replace('\t', ' ') + fout.write(coord_line) + + except Exception as e: + logger.warning(f"Error processing {fname}: {e}") + continue + return merged_path + # Case C: None + raise RuntimeError( + f"Decompression is complete, but I couldn't find dsgdb9nsd.xyz or any .xyz files under {self.raw_dir}!" + "Please check what files are actually included in the downloaded compressed package." + ) + + def _count_files(self, directory: str) -> int: + """Counts the number of .pkl files in a directory.""" + try: + return len([n for n in os.listdir(directory) if n.endswith(".pkl")]) + except Exception: + return 0 + + @staticmethod + def _save_pickle(path: str, obj: Any) -> None: + with open(path, "wb") as f: + pickle.dump(obj, f) + + @staticmethod + def _load_pickle(path: str) -> Any: + with open(path, "rb") as f: + return pickle.load(f) + + def _build_structures_and_properties(self, raw_path: str, struct_dir: str, prop_dir: str) -> None: + """ + Core Constructor Function:analyse XYZ -> Pymatgen Structure -> Pickle + """ + logger.info(f"Parsing {raw_path} using ASE...") + + # 1. Read all data into memory (QM9 is about 100MB, which can easily fit into memory) + atoms_collection = read(raw_path, index=':') + + # 2. Read text lines to parse attributes (ASE attribute parsing is sometimes unreliable; manual parsing is more stable) + with open(raw_path, 'r') as f: + lines = f.readlines() + + prop_buffers = defaultdict(list) + current_line = 0 + valid_count = 0 + + total = len(atoms_collection) + pbar = tqdm(total=total, desc="Processing QM9") + + for i, atoms in enumerate(atoms_collection): + try: + num_atoms = len(atoms) + prop_line = lines[current_line + 1] + + # clean the property line. + prop_line_cleaned = prop_line.replace('*^', 'e').replace('\t', ' ') + raw_vals = prop_line_cleaned.split() + + vals_float = [] + for val_str in raw_vals: + try: + vals_float.append(float(val_str)) + except ValueError: + # for strings like 'gdb' + vals_float.append(0.0) + + # Mapping Attribute + for k, key in enumerate(self.PROP_ORDER): + if key in ['tag', 'index']: + continue + + # Alignment index: k=2 is 'A', corresponding to raw_vals[2] + if k < len(vals_float): + prop_buffers[key].append(vals_float[k]) + else: + prop_buffers[key].append(np.nan) + + # --- B. building Structure (Fake crystal cell) --- + # Set up a large box to prevent the model from reporting errors due to the absence of cells + atoms.set_cell([20.0, 20.0, 20.0]) + atoms.center() + atoms.pbc = True + structure = AseAtomsAdaptor.get_structure(atoms) + + # --- C. save the struncture --- + self._save_pickle(osp.join(struct_dir, f"{i:06d}.pkl"), structure) + + # Update pointer + current_line += (num_atoms + 2) + valid_count += 1 + pbar.update(1) + + except Exception as e: + logger.warning(f"Error processing molecule {i}: {e}. Skipping block.") + current_line += (len(atoms) + 2) + continue + + pbar.close() + + if valid_count == 0: + raise RuntimeError("No valid samples processed from QM9 file!") + + # --- D.Save attribute array --- + logger.info("Saving property arrays...") + for key, val_list in prop_buffers.items(): + self._save_pickle( + osp.join(prop_dir, f"{key}.pkl"), + np.array(val_list, dtype=np.float32) + ) + + + def _filter_by_properties(self) -> None: + """ + Filter out samples that contain invalid property values (e.g., NaN, Inf). + Operation is performed in-memory. + """ + if not self.property_names: + return + + total = len(self.structures) + keep = [] + + # Check properties for each sample + for i in range(total): + is_valid = True + for pname in self.property_names: + val = self.property_data[pname][i] + if val is None: + is_valid = False + break + + # Check for NaN/Inf in scalars + if isinstance(val, (float, int, np.floating, np.integer)): + if np.isnan(val) or np.isinf(val): + is_valid = False + break + # Check for NaN/Inf in arrays/lists + elif isinstance(val, (list, np.ndarray)): + arr = np.asarray(val) + if not np.all(np.isfinite(arr)): + is_valid = False + break + + if is_valid: + keep.append(i) + + if len(keep) < total: + logger.warning( + f"Filtering: Dropping {total - len(keep)} samples " + "due to invalid properties." + ) + self.structures = [self.structures[i] for i in keep] + if self.graphs: + self.graphs = [self.graphs[i] for i in keep] + # stay property_data 为 numpy.ndarray(Indexing with numpy) + for pname in self.property_names: + arr = self.property_data[pname] + # arr may already be numpy array; this keeps dtype and shape consistent + self.property_data[pname] = arr[keep] + + def _filter_by_graphs(self) -> None: + """ + Filter out samples with invalid or missing graphs. + Since graphs are rebuilt fully if mismatch occurs, this is mostly a + sanity check. + """ + pass + + def __len__(self) -> int: + return self.num_samples + + def __getitem__(self, idx: int) -> Dict[str, Any]: + data = {} + # 1. loading the info + if self.graphs is not None: + data["graph"] = self._load_pickle(self.graphs[idx]) + else: + struct = self._load_pickle(self.structures[idx]) + # turn into dictionary format + data["pos"] = np.array(struct.cart_coords, dtype='float32') + data["atomic_numbers"] = np.array([s.specie.Z for s in struct], dtype='int64') + data["cell"] = np.array(struct.lattice.matrix, dtype='float32') + data["natoms"] = len(struct) + data["pbc"] = np.array([True, True, True], dtype=bool) + + # 2. loading the properties + for pname in self.property_names: + val = self.property_data[pname][idx] + # data[pname] = np.array([val], dtype='float32') + if pname == 'lumo': + data['energy_per_atom'] = np.array([val], dtype='float32') + else: + data[pname] = np.array([val], dtype='float32') + + # 3. data transforms + if self.transforms is not None: + data = self.transforms(data) + + return data \ No newline at end of file diff --git a/ppmat/datasets/sfin_dataset.py b/ppmat/datasets/sfin_dataset.py new file mode 100644 index 00000000..1e2fcbe2 --- /dev/null +++ b/ppmat/datasets/sfin_dataset.py @@ -0,0 +1,441 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import annotations + +import os +import os.path as osp +import pickle +from typing import Any +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple + +import numpy as np +import paddle +import paddle.distributed as dist +from paddle.io import Dataset +from PIL import Image + +from ppmat.datasets.build_matched_name import build_matched_name_samples +from ppmat.datasets.build_matched_name import build_prediction_samples +from ppmat.utils import download +from ppmat.utils import io +from ppmat.utils import logger +from ppmat.utils.misc import is_equal + + +class SFINDataset(Dataset): + """SFIN Dataset Handler. + + This class loads paired STEM images for the SFIN spectrum enhancement + benchmark. Each noisy image is paired with two supervision targets: + ``gt_enhance`` for denoised image restoration and ``gt_detect`` for + structure/detail detection. + + **Dataset Overview** + - **Source**: Original data from the SFIN STEM image enhancement benchmark. + - **Preprocessed Version**: + ``` + ┌───────────────────┬─────────┬─────────┐ + │ Dataset Partition │ Train │ Val/Test│ + ├───────────────────┼─────────┼─────────┤ + │ HAADF │ 1,000 │ 100 │ + │ BF │ 1,000 │ 100 │ + └───────────────────┴─────────┴─────────┘ + ``` + Download preprocessed data: + https://paddle-org.bj.bcebos.com/paddlematerials/datasets/SFIN/sfin_haadf.zip + https://paddle-org.bj.bcebos.com/paddlematerials/datasets/SFIN/sfin_bf.zip + + **Data Format** + The dataset is stored as paired PNG images. A sample is matched by file name + across the following folders: + + | Folder | Description | Example Value | + |--------------|------------------------------------------|---------------| + | `noisy` | Low-dose noisy STEM input image | 0001.png | + | `gt_enhance` | Ground-truth enhanced/restored image | 0001.png | + | `gt_detect` | Ground-truth structure/detail label | 0001.png | + + **Example Row:** + ```python + { + "noisy": Tensor(shape=[1, H, W]), + "gt_enhance": Tensor(shape=[1, H, W]), + "gt_detect": Tensor(shape=[1, H, W]), + "name": "0001", + "id": 0, + } + ``` + + Args: + path (str, optional): The path of the dataset root. The folder name + should be ``sfin_haadf`` or ``sfin_bf`` for automatic download. + Defaults to ``./sfin_haadf``. + split (str, optional): Dataset split, selected from ``train``, ``val`` + and ``test``. ``val`` uses the same files as ``test``. Defaults to + ``train``. + target_subdir (Optional[str], optional): Target folder used as the + training label. Set to ``None`` for prediction-only input loading. + Defaults to ``gt_enhance``. + data_count (Optional[int], optional): If set, only the first + ``data_count`` samples are used. Defaults to None. + build_samples_cfg (Optional[Dict[str, Any]], optional): Configuration + for matching noisy and target files by name. Defaults to indexed + matching. + transforms (Optional[Callable], optional): Preprocess transforms for + each sample. Defaults to None. + cache_path (Optional[str], optional): Explicit path for the cache + directory. Defaults to None. + overwrite (bool, optional): Whether to rebuild existing cache files. + Defaults to False. + """ + + name = "sfin" + url = ( + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/" + "SFIN/sfin_haadf.zip" + ) + md5 = "f96dea9ac1f722d6ca55c7e49c1b3a41" + bf_url = ( + "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/" + "SFIN/sfin_bf.zip" + ) + bf_md5 = "74ec1c1959e162669cc8cbbc8713bda0" + label_subdirs = ("gt_enhance", "gt_detect") + + def __init__( + self, + path: str = "./sfin_haadf", + split: str = "train", + target_subdir: Optional[str] = "gt_enhance", + data_count: Optional[int] = None, + build_samples_cfg: Optional[Dict[str, Any]] = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + overwrite: bool = False, + ): + super().__init__() + + if split not in ("train", "val", "test"): + raise ValueError( + f"Unsupported split '{split}', expected 'train', 'val' or 'test'." + ) + if target_subdir is not None and target_subdir not in self.label_subdirs: + raise ValueError( + f"Unsupported target_subdir '{target_subdir}', expected " + "'gt_enhance', 'gt_detect', or None." + ) + if data_count is not None and int(data_count) < 0: + raise ValueError("data_count must be None or a non-negative integer.") + + self.path = path + self.dataset_name = osp.basename(osp.normpath(path)) + self.split = "test" if split == "val" else split + self.target_subdir = target_subdir + self.data_count = int(data_count) if data_count is not None else None + self.transforms = transforms + self.cache_path = cache_path + self.overwrite = overwrite + self.url, self.md5 = self._get_dataset_url_md5() + + if not osp.exists(path): + if self.url is None: + raise FileNotFoundError(f"Dataset root not found: {path}") + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + path = self._get_downloaded_dataset_path(root_path) + self.path = path + + if build_samples_cfg is None: + build_samples_cfg = {"match_mode": "indexed"} + logger.message( + "The build_samples_cfg is not set, will use the default " + f"configs: {build_samples_cfg}" + ) + self.build_samples_cfg = build_samples_cfg + self.sample_builder = build_matched_name_samples(build_samples_cfg) + + self.data_root = osp.join(self.path, self.split) + self.noisy_root = osp.join(self.data_root, "noisy") + self.target_roots = { + name: osp.join(self.data_root, name) for name in self.label_subdirs + } + self.target_root = ( + self.target_roots[self.target_subdir] + if self.target_subdir is not None + else None + ) + + self.row_data, self.num_samples = self.read_data(self.path) + self.samples = self.row_data["samples"] + self.file_names = self.row_data["name"] + self._prepare_cache() + logger.info(f"Load {self.num_samples} samples from {self.path}") + + def _get_dataset_url_md5(self) -> Tuple[Optional[str], Optional[str]]: + """Return download metadata for known SFIN dataset folders.""" + if self.dataset_name == "sfin_haadf": + return self.url, self.md5 + if self.dataset_name == "sfin_bf": + return self.bf_url, self.bf_md5 + return None, None + + def _get_downloaded_dataset_path(self, root_path: str) -> str: + """Resolve the dataset root returned by the shared download utility.""" + for candidate in (root_path, osp.join(root_path, self.dataset_name)): + if osp.isdir(osp.join(candidate, self.split, "noisy")): + return candidate + return osp.join(root_path, self.dataset_name) + + def read_data(self, path: str) -> Tuple[Dict[str, List[Any]], int]: + """Read image file names and build matched sample metadata.""" + if not osp.isdir(self.noisy_root): + raise FileNotFoundError(f"Noisy directory not found: {self.noisy_root}") + + noisy_files = io.list_files_by_suffix(self.noisy_root, ".png") + if self.target_subdir is None: + samples = build_prediction_samples(noisy_files) + else: + for label_name, target_root in self.target_roots.items(): + if not osp.isdir(target_root): + raise FileNotFoundError( + f"Target directory not found: {target_root}" + ) + + target_files = io.list_files_by_suffix(self.target_root, ".png") + samples = self.sample_builder( + noisy_files, + target_files, + self.noisy_root, + self.target_root, + ".png", + ) + self._add_label_files(samples, noisy_files) + + if self.data_count is not None: + samples = samples[: self.data_count] + if not samples and self.data_count != 0: + raise FileNotFoundError(f"No samples found under {self.noisy_root}.") + + row_data = { + "samples": samples, + "noisy": [sample["noisy"] for sample in samples], + "name": [sample["name"] for sample in samples], + } + if self.target_subdir is not None: + row_data["target"] = [sample["target"] for sample in samples] + for label_name in self.label_subdirs: + row_data[label_name] = [sample[label_name] for sample in samples] + return row_data, len(samples) + + def _add_label_files(self, samples: List[Dict[str, str]], noisy_files: List[str]): + """Attach both SFIN label paths to matched samples by image name.""" + for label_name, target_root in self.target_roots.items(): + if label_name == self.target_subdir: + for sample in samples: + sample[label_name] = sample["target"] + continue + + label_files = io.list_files_by_suffix(target_root, ".png") + label_samples = self.sample_builder( + noisy_files, + label_files, + self.noisy_root, + target_root, + ".png", + ) + label_file_by_name = { + sample["name"]: sample["target"] for sample in label_samples + } + for sample in samples: + sample[label_name] = label_file_by_name[sample["name"]] + + def _prepare_cache(self): + if self.cache_path is None: + target_name = ( + self.target_subdir if self.target_subdir is not None else "predict" + ) + self.cache_path = osp.join( + f"{self.path}_cache", self.split, str(target_name) + ) + logger.info(f"Cache path: {self.cache_path}") + + sample_cache_path = osp.join(self.cache_path, "samples") + sample_done_flag = osp.join(sample_cache_path, "completed.flag") + cache_cfg = self._cache_cfg() + cache_cfg_path = osp.join(self.cache_path, "cache_cfg.pkl") + + cache_exists = osp.exists(self.cache_path) + if cache_exists and not self.overwrite: + logger.warning( + "Cache enabled. If a cache file exists, it will be automatically " + "read and current settings will be ignored. Please ensure that the " + "settings used in match your current settings." + ) + + rebuild_cache = ( + self.overwrite + or not cache_exists + or not self._is_cache_valid( + sample_cache_path, sample_done_flag, cache_cfg_path, cache_cfg + ) + ) + if rebuild_cache and self._rank() == 0: + self._build_cache(sample_cache_path, sample_done_flag, cache_cfg_path) + + if dist.is_initialized(): + dist.barrier() + + self.cache_files = [ + osp.join(sample_cache_path, f"{idx:010d}.pkl") + for idx in range(self.num_samples) + ] + if not all(osp.exists(cache_file) for cache_file in self.cache_files): + raise RuntimeError( + f"No complete cached SFIN samples found under {sample_cache_path}." + ) + + def _cache_cfg(self) -> Dict[str, Any]: + return { + "build_samples_cfg": self.build_samples_cfg, + "path": osp.abspath(self.path), + "split": self.split, + "target_subdir": self.target_subdir, + "sample_names": self.file_names, + "num_samples": self.num_samples, + } + + def _is_cache_valid( + self, + sample_cache_path: str, + sample_done_flag: str, + cache_cfg_path: str, + cache_cfg: Dict[str, Any], + ) -> bool: + try: + cache_cfg_saved = self.load_from_cache(cache_cfg_path) + except Exception as e: + logger.warning(e) + return False + + if not is_equal(cache_cfg_saved, cache_cfg): + logger.warning("cache_cfg is different from current config.") + return False + + num_cached = self._count_cache_files(sample_cache_path) + if osp.exists(sample_done_flag) and num_cached == self.num_samples: + logger.info(f"Using cached SFIN samples ({num_cached}).") + return True + + logger.warning( + f"Cached SFIN samples are incomplete " + f"(cached={num_cached}, expected={self.num_samples})." + ) + return False + + def _build_cache( + self, + sample_cache_path: str, + sample_done_flag: str, + cache_cfg_path: str, + ): + os.makedirs(self.cache_path, exist_ok=True) + os.makedirs(sample_cache_path, exist_ok=True) + self._clean_cache_dir(sample_cache_path) + self.save_to_cache(cache_cfg_path, self._cache_cfg()) + + logger.message(f"Caching {self.num_samples} SFIN samples to {sample_cache_path}") + for idx in range(self.num_samples): + self.save_to_cache( + osp.join(sample_cache_path, f"{idx:010d}.pkl"), + self._serialize_item(self._build_item(idx)), + ) + with open(sample_done_flag, "w") as f: + f.write("done") + + @staticmethod + def _rank() -> int: + return dist.get_rank() if dist.is_initialized() else 0 + + @staticmethod + def _count_cache_files(cache_path: str) -> int: + if not osp.isdir(cache_path): + return 0 + return len([name for name in os.listdir(cache_path) if name.endswith(".pkl")]) + + @staticmethod + def _clean_cache_dir(cache_path: str): + for file_name in os.listdir(cache_path): + if file_name.endswith(".pkl") or file_name.endswith(".flag"): + os.remove(osp.join(cache_path, file_name)) + + def _build_item(self, idx: int) -> Dict[str, Any]: + data = { + "noisy": self._load_gray_image( + osp.join(self.noisy_root, self.row_data["noisy"][idx]) + ), + "name": self.row_data["name"][idx], + "id": idx, + } + + if self.target_subdir is not None: + for label_name, target_root in self.target_roots.items(): + data[label_name] = self._load_gray_image( + osp.join(target_root, self.row_data[label_name][idx]) + ) + return data + + def _load_gray_image(self, file_path: str) -> paddle.Tensor: + image = Image.open(file_path).convert("L") + image_array = np.asarray(image, dtype=np.float32) + return paddle.to_tensor(image_array).unsqueeze(0) + + @staticmethod + def _serialize_item(data: Dict[str, Any]) -> Dict[str, Any]: + return { + key: value.detach().cpu().numpy() + if isinstance(value, paddle.Tensor) + else value + for key, value in data.items() + } + + @staticmethod + def _deserialize_item(data: Dict[str, Any]) -> Dict[str, Any]: + return { + key: paddle.to_tensor(value) if isinstance(value, np.ndarray) else value + for key, value in data.items() + } + + def save_to_cache(self, cache_path: str, data: Any): + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def load_from_cache(self, cache_path: str): + if not osp.exists(cache_path): + raise FileNotFoundError(f"No such file or directory: {cache_path}") + with open(cache_path, "rb") as f: + return pickle.load(f) + + def __getitem__(self, idx: int): + data = self._deserialize_item(self.load_from_cache(self.cache_files[idx])) + data = self.transforms(data) if self.transforms is not None else data + return data + + def __len__(self): + return self.num_samples diff --git a/ppmat/datasets/small_density_dataset.py b/ppmat/datasets/small_density_dataset.py new file mode 100644 index 00000000..56c32d86 --- /dev/null +++ b/ppmat/datasets/small_density_dataset.py @@ -0,0 +1,310 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import absolute_import +from __future__ import annotations + +import os +import os.path as osp +import pickle +from typing import Any, Callable, Dict, List, Optional, Tuple + +import numpy as np +import paddle +import paddle.distributed as dist + +from ppmat.datasets.geometric_data_type.data import Data +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils.misc import is_equal + +ATOM_TYPES: Dict[str, np.ndarray] = { + # Atom order matches legacy dataset: 0=C, 1=H, 2=O. + "benzene": np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1], dtype="int64"), + "ethanol": np.array([0, 0, 2, 1, 1, 1, 1, 1, 1], dtype="int64"), + "phenol": np.array([0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1], dtype="int64"), + "resorcinol": np.array( + [0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 1, 1, 1, 1], dtype="int64" + ), + "ethane": np.array([0, 0, 1, 1, 1, 1, 1, 1], dtype="int64"), + "malonaldehyde": np.array([2, 0, 0, 0, 2, 1, 1, 1, 1], dtype="int64"), +} + + +class SmallDensityDataset(paddle.io.Dataset): + """MD17 small-molecule electron-density dataset with caching and auto-download. + + The dataset stores FFT-domain electron-density coefficients for six MD17 + molecules (benzene, ethanol, phenol, resorcinol, ethane, malonaldehyde). + This handler mirrors :mod:`mp20_dataset` patterns: automatic download if the + data root is missing, conversion through factory-style builders, and per- + sample caching into ``.pkl`` files (structures, densities, metadata) to + avoid recomputing FFT inversions on every run. + + Raw layout (after extracting ``md17_es.tar.gz``): + root/ + / + _train/{structures.npy,dft_densities.npy,...} + _test/{structures.npy,dft_densities.npy,...} + + Args: + root: Dataset root. If missing and ``auto_download`` is True, the MD17 + archive is pulled and unpacked automatically. + mol_name: One of the supported MD17 molecule names. + split: ``train``, ``validation`` (alias of ``test``), or ``test``. + n_grid: Cube grid resolution per axis. + grid_size: Physical box size (Angstrom) for the grid. + cache_path: Optional cache directory. Defaults to ``//__cache``. + overwrite: Force rebuilding cache even if it exists. + transforms: Optional callable applied to the (g, density, grid, info) + tuple before returning. + auto_download: Download and extract the dataset if ``root`` is missing. + """ + + name = "md17_es" + url = "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/MD17_ES/md17_es.tar.gz" + md5 = None + + def __init__( + self, + root: str = "./data/data_md", + mol_name: str = "ethanol", + split: str = "train", + n_grid: int = 50, + grid_size: float = 20.0, + cache_path: Optional[str] = None, + overwrite: bool = False, + transforms: Optional[Callable] = None, + auto_download: bool = True, + **kwargs, # compatibility with unused config fields + ): + super().__init__() + del kwargs + + if mol_name not in ATOM_TYPES: + raise ValueError(f"Unsupported molecule {mol_name}. Options: {list(ATOM_TYPES)}") + if split not in {"train", "validation", "test"}: + raise ValueError("split must be one of ['train', 'validation', 'test']") + + self.mol_name = mol_name + self.user_split = split + self.split = "test" if split == "validation" else split + self.n_grid = int(n_grid) + self.grid_size = float(grid_size) + self.transforms = transforms + + self.root = self._prepare_root(root, auto_download) + self.data_path = osp.join(self.root, mol_name, f"{mol_name}_{self.split}") + if not osp.exists(self.data_path): + raise FileNotFoundError( + f"Data path {self.data_path} not found. " + "Please check the root path or set auto_download=True." + ) + + if cache_path is None: + self.cache_path = osp.join( + self.root, mol_name, f"{mol_name}_{self.split}_cache" + ) + else: + self.cache_path = cache_path + + cell_np = np.eye(3, dtype="float32") * self.grid_size + self.cell = paddle.to_tensor(cell_np, place=paddle.CPUPlace()) + + self.samples: List[str] = [] + self.grid_coord: paddle.Tensor + self._prepare_cache(overwrite) + self.num_samples = len(self.samples) + + def _prepare_root(self, root: str, auto_download: bool) -> str: + if osp.exists(root): + return root + if not auto_download: + raise FileNotFoundError( + f"Dataset root {root} not found and auto_download=False." + ) + logger.message( + f"Dataset root {root} not found. Downloading {self.name} from {self.url}." + ) + downloaded_root = download.get_datasets_path_from_url(self.url, self.md5) + logger.message(f"Downloaded and extracted to {downloaded_root}") + return downloaded_root + + def _prepare_cache(self, overwrite: bool) -> None: + sample_dir = osp.join(self.cache_path, "samples") + cache_cfg_path = osp.join(self.cache_path, "dataset_cfg.pkl") + grid_cache_path = osp.join(self.cache_path, "grid.pkl") + cache_exists = osp.exists(sample_dir) + + expected_cfg = { + "mol_name": self.mol_name, + "split": self.split, + "n_grid": self.n_grid, + "grid_size": self.grid_size, + "data_path": self.data_path, + } + + if cache_exists and not overwrite: + try: + cached_cfg = self._load_from_cache(cache_cfg_path) + if not is_equal(cached_cfg, expected_cfg): + logger.warning( + "Cache configuration differs from current settings. " + "Will rebuild cache to avoid stale artifacts." + ) + overwrite = True + except Exception as e: + logger.warning(e) + logger.warning("Failed to read cached config. Will rebuild cache.") + overwrite = True + + if overwrite or not cache_exists: + self._build_cache(sample_dir, cache_cfg_path, grid_cache_path, expected_cfg) + + if dist.is_initialized(): + dist.barrier() + + self.samples = sorted( + [ + osp.join(sample_dir, fname) + for fname in os.listdir(sample_dir) + if fname.endswith(".pkl") + ] + ) + if len(self.samples) == 0: + raise RuntimeError(f"No cached samples found under {sample_dir}") + + grid_np = self._load_from_cache(grid_cache_path) + self.grid_coord = paddle.to_tensor( + grid_np, dtype="float32", place=paddle.CPUPlace() + ) + + def _build_cache( + self, + sample_dir: str, + cache_cfg_path: str, + grid_cache_path: str, + expected_cfg: Dict[str, Any], + ) -> None: + rank = dist.get_rank() if dist.is_initialized() else 0 + if rank != 0: + return + + os.makedirs(sample_dir, exist_ok=True) + logger.message(f"Building cache at {self.cache_path}") + + structures_path = osp.join(self.data_path, "structures.npy") + density_path = osp.join(self.data_path, "dft_densities.npy") + if not osp.exists(structures_path) or not osp.exists(density_path): + raise FileNotFoundError( + f"Cannot locate expected files under {self.data_path}. " + "Expected structures.npy and dft_densities.npy." + ) + + atom_type = ATOM_TYPES[self.mol_name] + structures = np.load(structures_path).astype("float32") + densities_fft = np.load(density_path) + densities = self._convert_fft(densities_fft) + num_samples = structures.shape[0] + + grid_coord = self._generate_grid() + self._save_to_cache(grid_cache_path, grid_coord) + self._save_to_cache(cache_cfg_path, expected_cfg) + + cell_np = np.eye(3, dtype="float32") * self.grid_size + for idx in range(num_samples): + sample = { + "atom_type": atom_type, + "atom_coord": structures[idx], + "density": densities[idx], + "shape": [self.n_grid, self.n_grid, self.n_grid], + "cell": cell_np, + "file_name": f"{self.mol_name}_{self.split}_{idx:06d}", + } + self._save_to_cache(osp.join(sample_dir, f"{idx:010d}.pkl"), sample) + logger.info(f"Cached {num_samples} samples to {sample_dir}") + + def _convert_fft(self, fft_coeff: np.ndarray) -> np.ndarray: + """Convert FFT coefficients to real-space densities.""" + logger.message( + f"Precomputing {self.split} density from FFT coefficients with n_grid={self.n_grid} ..." + ) + coeff = paddle.to_tensor( + data=fft_coeff, dtype="float32", place=paddle.CPUPlace() + ).to("complex64") + d = coeff.reshape([-1, self.n_grid, self.n_grid, self.n_grid]) + hf = self.n_grid // 2 + + d[:, :hf] = (d[:, :hf] - d[:, hf:] * 1.0j) / 2 + d[:, hf:] = paddle.flip(x=d[:, 1 : hf + 1], axis=[1]).conj() + d = paddle.fft.ifft(x=d, axis=1) + + d[:, :, :hf] = (d[:, :, :hf] - d[:, :, hf:] * 1.0j) / 2 + d[:, :, hf:] = paddle.flip(x=d[:, :, 1 : hf + 1], axis=[2]).conj() + d = paddle.fft.ifft(x=d, axis=2) + + d[..., :hf] = (d[..., :hf] - d[..., hf:] * 1.0j) / 2 + d[..., hf:] = paddle.flip(x=d[..., 1 : hf + 1], axis=[3]).conj() + d = paddle.fft.ifft(x=d, axis=3) + + result = paddle.flip( + x=d.real().reshape([-1, self.n_grid**3]), axis=[-1] + ).detach() + return result.numpy() + + def _generate_grid(self) -> np.ndarray: + x = np.linspace( + start=self.grid_size / self.n_grid, + stop=self.grid_size, + num=self.n_grid, + dtype="float32", + ) + grid = np.stack(np.meshgrid(x, x, x, indexing="ij"), axis=-1).reshape(-1, 3) + return grid + + def _save_to_cache(self, cache_path: str, data: Any) -> None: + os.makedirs(osp.dirname(cache_path), exist_ok=True) + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def _load_from_cache(self, cache_path: str) -> Any: + if not osp.exists(cache_path): + raise FileNotFoundError(f"No such file or directory: {cache_path}") + with open(cache_path, "rb") as f: + return pickle.load(f) + + def __getitem__(self, idx: int) -> Tuple[Data, paddle.Tensor, paddle.Tensor, Dict]: + sample = self._load_from_cache(self.samples[idx]) + atom_type = paddle.to_tensor( + sample["atom_type"], dtype="int64", place=paddle.CPUPlace() + ) + atom_coord = paddle.to_tensor( + sample["atom_coord"], dtype="float32", place=paddle.CPUPlace() + ) + density = paddle.to_tensor(sample["density"], dtype="float32", place=paddle.CPUPlace()) + + g = Data(x=atom_type, pos=atom_coord) + info = { + "cell": self.cell, + "shape": sample["shape"], + "file_name": sample["file_name"], + } + + data_tuple = (g, density, self.grid_coord, info) + if self.transforms is not None: + data_tuple = self.transforms(data_tuple) + return data_tuple + + def __len__(self) -> int: + return self.num_samples diff --git a/ppmat/datasets/split_mptrj_data.py b/ppmat/datasets/split_mptrj_data.py new file mode 100644 index 00000000..97babc3f --- /dev/null +++ b/ppmat/datasets/split_mptrj_data.py @@ -0,0 +1,93 @@ +import json +import os +import random + + +def none_to_zero(value): + if value is None: + return 0.0 + if isinstance(value, str): + if value.lower() == 'none': + return 0.0 + try: + return float(value) + except ValueError: + raise ValueError(f"Invalid numeric value: {value}") + return value + +def split_dataset_by_mpid( + input_json: str, + output_dir: str, + train_ratio: float = 0.8, + val_ratio: float = 0.1, + test_ratio: float = 0.1, + random_seed: int = 42, +) -> None: + """ + Randomly splits a JSON dataset into train/val/test subsets based on mp-id + + Args: + input_json: Path to input JSON file + output_dir: Path to output directory + train_ratio: Training set ratio (default: 0.8) + val_ratio: Validation set ratio (default: 0.1) + test_ratio: Test set ratio (default: 0.1), if 0, no test set will be created + random_seed: Random seed for reproducibility (default: 42) + """ + # check if the sum of ratios is 1 + total_ratio = train_ratio + val_ratio + test_ratio + if not (total_ratio == 1.0): + raise ValueError(f"Total ratio should be equal to 1 but got {total_ratio}.") + + # load the json file + with open(input_json, "r") as f: + data = json.load(f) + + # get all mp-ids, shuffle them a + mp_ids = list(data.keys()) + random.seed(random_seed) + random.shuffle(mp_ids) + print(f"Loaded {len(mp_ids)} entries") + + # split them into train/val/test sets + total = len(mp_ids) + train_split = int(total * train_ratio) + val_split = train_split + int(total * val_ratio) + + train_mpids = set(mp_ids[:train_split]) + print(f"Train set size: {len(train_mpids)}") + val_mpids = set(mp_ids[train_split:val_split]) + print(f"Val set size: {len(val_mpids)}") + if test_ratio > 0: + test_mpids = set(mp_ids[val_split:]) + print(f"Test set size: {len(test_mpids)}") + + # make output dir + os.makedirs(output_dir, exist_ok=True) + + # save function + def save_split(mpid_set: set, filename: str): + subset = {mpid: data[mpid] for mpid in mpid_set} + with open(os.path.join(output_dir, filename), "w") as f: + json.dump(subset, f, indent=2) + + save_split(train_mpids, "train.json") + print(f"Saved training splits to {output_dir}") + save_split(val_mpids, "val.json") + print(f"Saved validation splits to {output_dir}") + if test_ratio > 0: + save_split(test_mpids, "test.json") + print(f"Saved testing splits to {output_dir}") + + +# This code is used to split the Mptrj_2022.9_full.json dataset into train/val/test +# subsets based on mp-id +if __name__ == "__main__": + split_dataset_by_mpid( + input_json="./data/MPtrj_2022.9_full.json", + output_dir="./data/MPtrj_2022.9_full", + train_ratio=0.8, + val_ratio=0.1, + test_ratio=0.1, + random_seed=42, + ) diff --git a/ppmat/datasets/tmqm_dataset.py b/ppmat/datasets/tmqm_dataset.py new file mode 100644 index 00000000..dd6c4db3 --- /dev/null +++ b/ppmat/datasets/tmqm_dataset.py @@ -0,0 +1,1045 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import annotations + +import math +import os +import os.path as osp +import pickle +from typing import Any +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional + +import numpy as np +import paddle.distributed as dist +from ase import Atoms +from paddle.io import Dataset +from pymatgen.io.ase import AseAtomsAdaptor + +from ppmat.datasets.build_structure import BuildStructure +from ppmat.datasets.custom_data_type import ConcatData +from ppmat.models import build_graph_converter +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils.misc import is_equal + + +class TmqmDataset(Dataset): + """tmQM Dataset Handler. + + The tmQM dataset is a comprehensive quantum chemistry database + for transition metal complexes, containing multiple complementary + data files: .xyz files provide molecular geometry structures optimized + at the GFN2-xTB level; .csv files include SMILES molecular representations + as well as quantum chemical properties calculated at the TPSSh/def2SVP level, + including electronic energy, dispersion energy, dipole moment, metal charge, + HOMO/LUMO energy gap and energy, and polarizability; .q files provide the + natural atomic charge distribution calculated at the TPSSh/def2SVP level; + .BO files contain Wiberg bond orders and atomic valence indices calculated + at the GFN2-xTB level (with the exception of polarizability, which is + calculated separately at the GFN2-xTB level). + + For model utility, we provide the option: "Whether to use charge and chemical + bond data" If you want to use it, the settings are as follows: + use use_atomic_charge: True + use_chemical_bonding: True + + Args: + path (str): File path to the dataset file. + + Electronic_E_key (Optional[str], optional): + Electronic energy of the system in atomic units. + Defaults to "Electronic_E". + + Dispersion_E_key (Optional[str], optional): + Dispersion correction energy in atomic units. + Defaults to "Dispersion_E". + + Dipole_M_key (Optional[str], optional): + Dipole moment vector in atomic units. + Defaults to "Dipole_M". + + Metal_q_key (Optional[str], optional): + Partial charge on the metal atom in atomic units. + Defaults to "Metal_q". + + HL_Gap_key (Optional[str], optional): + HOMO-LUMO gap energy in electron volts (eV). + Defaults to "HL_Gap". + + HOMO_Energy_key (Optional[str], optional): + Highest Occupied Molecular Orbital energy in electron volts (eV). + Defaults to "HOMO_Energy". + + LUMO_Energy_key (Optional[str], optional): + Lowest Unoccupied Molecular Orbital energy in electron volts (eV). + Defaults to "LUMO_Energy". + + Polarizability_key (Optional[str], optional): + Isotropic polarizability in atomic units. + Defaults to "Polarizability". + + SMILES_key (Optional[str], optional): + Simplified Molecular Input Line Entry System representation + of the molecule. Defaults to "SMILES". + + build_structure_cfg (Dict, optional): + The configs for building the structure.Defaults to None. + + build_graph_cfg (Dict, optional): + The configs for building the graph.Defaults to None. + + transforms (Optional[Callable], optional): + The preprocess transforms for each sample.Defaults to None. + + cache_path (Optional[str], optional): + If a cache_path is set, structures and graph will be read directly + from this path; if the cache does not exist, the converted structures + and graph will be saved to this path. Defaults to None. + + overwrite (bool, optional): + Overwrite the existing cache file at the given path if it already exists. + Defaults to False. + filter_unvalid (bool, optional): + Whether to filter out invalid samples. Defaults to True. + use_atomic_charge (bool, optional): + Whether to use atomic charge information. Defaults to True. + use_chemical_bonding (bool, optional): + Whether to use chemical bonding information. Defaults to True. + """ + + name = "tmqm_train_108k" + url = "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/tmQM/tmQM.zip" + md5 = "292f42fbabcd19ba08e9a2878d7f5995" + + # Optional attachment information + url_charge = "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/tmQM/tmQM_X.q.gz" # noqa + md5_charge = "501c42f8479c740ffbe0b0ebe25c2ab8" + url_bond = "https://paddle-org.bj.bcebos.com/paddlematerials/datasets/tmQM/tmQM_X.BO.gz" # noqa + md5_bond = "b8892367c50942b45332e0550be2ba9f" + + def __init__( + self, + path: str, + path_charge: str = None, + path_bond: str = None, + electronic_e_key: Optional[str] = None, + dispersion_e_key: Optional[str] = None, + dipole_m_key: Optional[str] = None, + metal_q_key: Optional[str] = None, + hl_gap_key: Optional[str] = None, + homo_energy_key: Optional[str] = None, + lumo_energy_key: Optional[str] = None, + polarizability_key: Optional[str] = None, + smiles_key: Optional[str] = None, + build_structure_cfg: Dict = None, + build_graph_cfg: Dict = None, + transforms: Optional[Callable] = None, + cache_path: Optional[str] = None, + cache_path_charge: Optional[str] = None, + cache_path_bond: Optional[str] = None, + overwrite: bool = False, + filter_unvalid: bool = True, + # Whether to use additional information for training + use_atomic_charge: bool = True, + use_chemical_bonding: bool = True, + **kwargs, # for compatibility + ): + super().__init__() + + self.use_atomic_charge = use_atomic_charge + self.use_chemical_bonding = use_chemical_bonding + + if not osp.exists(path): + logger.message("The dataset is not found. Will download it now.") + root_path = download.get_datasets_path_from_url(self.url, self.md5) + if root_path.endswith("/tmQM/tmQM"): + root_path = root_path[:-4] + # /home/aistudio/.paddlemat/datasets/tmQM/tmQM.xyz + path = osp.join(root_path, osp.basename(path)) + + if use_atomic_charge and path_charge is not None: + logger.message("Use atomic charge dataset. Will download it now.") + root_path_charge = download.get_datasets_path_from_url( + self.url_charge, self.md5_charge + ) + path_charge = osp.join(root_path_charge, "tmQM_X.q") + + if use_chemical_bonding and path_bond is not None: + logger.message("Use chemical bonding dataset. Will download it now.") + root_path_bond = download.get_datasets_path_from_url( + self.url_bond, self.md5_bond + ) + path_bond = osp.join(root_path_bond, "tmQM_X.BO") + + # Add decompression logic for gz + if use_atomic_charge and path_charge is not None: + logger.message("Use atomic charge dataset. Will download it now.") + root_path_charge = download.get_datasets_path_from_url( + self.url_charge, self.md5_charge + ) + + gz_file = root_path_charge + decompressed_file = osp.join(osp.dirname(gz_file), "tmQM_X.q") + + if gz_file.endswith(".gz") and not osp.exists(decompressed_file): + logger.message(f"Decompressing {gz_file}...") + import gzip + + with gzip.open(gz_file, "rb") as f_in: + with open(decompressed_file, "wb") as f_out: + f_out.write(f_in.read()) + + path_charge = decompressed_file + + if use_chemical_bonding and path_bond is not None: + logger.message("Use chemical bonding dataset. Will download it now.") + root_path_bond = download.get_datasets_path_from_url( + self.url_bond, self.md5_bond + ) + + gz_file = root_path_bond + decompressed_file = osp.join(osp.dirname(gz_file), "tmQM_X.BO") + + if gz_file.endswith(".gz") and not osp.exists(decompressed_file): + logger.message(f"Decompressing {gz_file}...") + import gzip + + with gzip.open(gz_file, "rb") as f_in: + with open(decompressed_file, "wb") as f_out: + f_out.write(f_in.read()) + + path_bond = decompressed_file + + self.path = path + self.path_charge = path_charge + self.path_bond = path_bond + self.electronic_e_key = electronic_e_key + self.dispersion_e_key = dispersion_e_key + self.dipole_m_key = dipole_m_key + self.metal_q_key = metal_q_key + self.hl_gap_key = hl_gap_key + self.homo_energy_key = homo_energy_key + self.lumo_energy_key = lumo_energy_key + self.polarizability_key = polarizability_key + self.smiles_key = smiles_key + + self.property_names = [] + if electronic_e_key is not None: + self.property_names.append(electronic_e_key) + if dispersion_e_key is not None: + self.property_names.append(dispersion_e_key) + if dipole_m_key is not None: + self.property_names.append(dipole_m_key) + if metal_q_key is not None: + self.property_names.append(metal_q_key) + if hl_gap_key is not None: + self.property_names.append(hl_gap_key) + if homo_energy_key is not None: + self.property_names.append(homo_energy_key) + if lumo_energy_key is not None: + self.property_names.append(lumo_energy_key) + if polarizability_key is not None: + self.property_names.append(polarizability_key) + if smiles_key is not None: + self.property_names.append(smiles_key) + + if build_structure_cfg is None: + build_structure_cfg = { + "format": "ase_atoms", + "primitive": False, + "niggli": False, + "num_cpus": 1, + } + logger.message( + "The build_structure_cfg is not set, will use the default " + f"configs: {build_structure_cfg}" + ) + + self.build_structure_cfg = build_structure_cfg + self.build_graph_cfg = build_graph_cfg + self.transforms = transforms + + if cache_path is not None: + self.cache_path = cache_path + else: + # for example: + # path = ./data/tmqm_train_108k/tmQM.xyz + # cache_path= ./data/tmqm_train_108k_cache/tmQM + self.cache_path = osp.join( + osp.split(path)[0] + "_cache", osp.splitext(osp.basename(path))[0] + ) + logger.info(f"Cache path: {self.cache_path}") + + if use_atomic_charge and path_charge is not None: + if cache_path_charge is not None: + self.cache_path_charge = cache_path_charge + else: + self.cache_path_charge = osp.join( + osp.split(path)[0] + "_cache", + osp.splitext(osp.basename(path_charge))[0], + ) + logger.info(f"Cache path of charge: {self.cache_path_charge}") + + if use_chemical_bonding and path_bond is not None: + if cache_path_bond is not None: + self.cache_path_bond = cache_path_bond + else: + self.cache_path_bond = osp.join( + osp.split(path)[0] + "_cache", + osp.splitext(osp.basename(path_bond))[0], + ) + logger.info(f"Cache path of bond: {self.cache_path_bond}") + + self.overwrite = overwrite + self.filter_unvalid = filter_unvalid + + # Initializing the cache of the path has a flag + self.cache_exists = True if osp.exists(self.cache_path) else False + + # Read master data + self.row_data, self.num_samples = self.read_data(path) + logger.info(f"Load {self.num_samples} samples from {path}") + self.property_data = self.read_property_data(self.row_data) + + # Read supplemental data + self.charge_data = None + self.bond_data = None + + if self.use_atomic_charge and path_charge is not None: + self.cache_exists_charge = osp.exists(self.cache_path_charge) + self.charge_data = self.read_charge_data(path_charge) + logger.info(f"Load charge data from {path_charge}") + + if self.use_chemical_bonding and path_bond is not None: + self.cache_exists_bond = osp.exists(self.cache_path_bond) + self.bond_data = self.read_bond_data(path_bond) + logger.info(f"Load bond data from {path_bond}") + + structure_cache_path = osp.join(self.cache_path, "structures") + graph_cache_path = osp.join(self.cache_path, "graphs") + + # Check the cache configuration + overwrite_orig = self._check_cache_config( + self.cache_path, build_structure_cfg, build_graph_cfg, overwrite + ) + + if self.cache_exists and not overwrite_orig: + missing_files = self._check_cache_integrity( + structure_cache_path, graph_cache_path + ) + if missing_files: + logger.warning("Found missing cache files, will regenerate cache") + overwrite_orig = True + + if overwrite_orig or not self.cache_exists: + + if dist.get_rank() == 0: + + os.makedirs(self.cache_path, exist_ok=True) + self.save_to_cache( + osp.join(self.cache_path, "build_structure_cfg.pkl"), + build_structure_cfg, + ) + self.save_to_cache( + osp.join(self.cache_path, "build_graph_cfg.pkl"), build_graph_cfg + ) + + structures = BuildStructure(**build_structure_cfg)(self.row_data) + + if len(structures) > 0: + sample_structure = structures[0] + logger.info(f"Structure object type: {type(sample_structure)}") + logger.info(f"Structure object attributes: {dir(sample_structure)}") + # If you use supplementary data, incorporate it into the structure + if self.use_atomic_charge and self.charge_data is not None: + structures = self._integrate_charge_data( + structures, self.charge_data + ) # noqa + + if self.use_chemical_bonding and self.bond_data is not None: + structures = self._integrate_bond_data(structures, self.bond_data) + + # Save the structure to the cache file + os.makedirs(structure_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(structure_cache_path, f"{i:010d}.pkl"), + structures[i], + ) + logger.info( + f"Save {self.num_samples} structures to {structure_cache_path}" + ) + + if build_graph_cfg is not None: + converter = build_graph_converter(build_graph_cfg) + graphs = converter(structures) + # Save the diagram to a cache file + os.makedirs(graph_cache_path, exist_ok=True) + for i in range(self.num_samples): + self.save_to_cache( + osp.join(graph_cache_path, f"{i:010d}.pkl"), graphs[i] + ) + logger.info(f"Save {self.num_samples} graphs to {graph_cache_path}") + + # Synchronize all processes + if dist.is_initialized(): + dist.barrier() + + self.structures = [ + osp.join(structure_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + + if build_graph_cfg is not None: + self.graphs = [ + osp.join(graph_cache_path, f"{i:010d}.pkl") + for i in range(self.num_samples) + ] + else: + self.graphs = None + + assert ( + len(self.structures) == self.num_samples + ), "The number of structures must be equal to the number of samples." + assert ( + self.graphs is None or len(self.graphs) == self.num_samples + ), "The number of graphs must be equal to the number of samples." + + # Filter invalid samples based on attribute data + if filter_unvalid: + self.filter_unvalid_by_property() + + def _check_cache_config( + self, cache_path, build_structure_cfg, build_graph_cfg, overwrite + ): + + local_overwrite = overwrite + cache_exists = osp.exists(cache_path) + + if cache_exists and not local_overwrite: + logger.warning( + f"Cache enabled for {cache_path}. If a cache file exists, " + "it will be automatically read and current settings will be ignored. " + "Please ensure that the settings used in match your current settings." + ) + try: + build_structure_cfg_cache = self.load_from_cache( + osp.join(cache_path, "build_structure_cfg.pkl") + ) + if is_equal(build_structure_cfg_cache, build_structure_cfg): + logger.info( + "The cached build_structure_cfg configuration matches " + "the current settings. Reusing previously generated" + " structural data to optimize performance." + ) + else: + logger.warning( + "build_structure_cfg is different from " + "build_structure_cfg_cache. Will rebuild the structures and " + "graphs." + ) + local_overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_structure_cfg.pkl from cache. " + "Will rebuild the structures and graphs(if need)." + ) + local_overwrite = True + + if build_graph_cfg is not None and not local_overwrite: + try: + build_graph_cfg_cache = self.load_from_cache( + osp.join(cache_path, "build_graph_cfg.pkl") + ) + if is_equal(build_graph_cfg_cache, build_graph_cfg): + logger.info( + "The cached build_graph_cfg configuration " + "matches the current settings." + ) + else: + logger.warning( + "build_graph_cfg is different from build_graph_cfg_cache" + ". Will rebuild the graphs." + ) + local_overwrite = True + except Exception as e: + logger.warning(e) + logger.warning( + "Failed to load builded_graph_cfg.pkl from cache. " + "Will rebuild the graphs." + ) + local_overwrite = True + + return local_overwrite + + def read_charge_data(self, path_charge: str): + # Read atomic charge properties + charge_data = [] + try: + with open(path_charge, "r") as f: + current_sample_charges = [] + for line in f: + line = line.strip() + if not line: + continue + + if line.startswith("CSD_code ="): + + if current_sample_charges: + charge_data.append(current_sample_charges) + current_sample_charges = [] + continue + + if line.startswith("Total charge") or not line: + continue + + # Analyze atomic charge row: Element symbol + charge value + parts = line.split() + if len(parts) >= 2: + try: + + charge = float(parts[1]) + current_sample_charges.append(charge) + except ValueError: + + continue + + if current_sample_charges: + charge_data.append(current_sample_charges) + + logger.info(f"Loaded charge data for {len(charge_data)} samples") + + # Verify data consistency + if len(charge_data) != self.num_samples: + logger.warning( + f"Charge data samples ({len(charge_data)}) don't match " + f"main data samples ({self.num_samples})" + ) + + except Exception as e: + logger.warning(f"Error reading charge data from {path_charge}: {e}") + return None + + return charge_data + + def read_bond_data(self, path_bond: str): + # Read key-level data + bond_data = [] + try: + with open(path_bond, "r") as f: + current_sample_bonds = [] + for line in f: + line = line.strip() + if not line: + continue + + if line.startswith("CSD_code ="): + + if current_sample_bonds: + bond_data.append(current_sample_bonds) + current_sample_bonds = [] + continue + + parts = line.split() + if len(parts) >= 4: + try: + atom_idx = int(parts[0]) - 1 + element = parts[1] + total_bond_order = float(parts[2]) + + neighbors = [] + i = 3 + while i < len(parts): + if i + 2 < len(parts): + neighbor_element = parts[i] + neighbor_idx = int(parts[i + 1]) - 1 + bond_order = float(parts[i + 2]) + + neighbors.append( + { + "element": neighbor_element, + "index": neighbor_idx, + "bond_order": bond_order, + } + ) + i += 3 + else: + break + + current_sample_bonds.append( + { + "atom_index": atom_idx, + "element": element, + "total_bond_order": total_bond_order, + "neighbors": neighbors, + } + ) + except (ValueError, IndexError) as e: + logger.warning(f"Error parsing bond: {line}, error: {e}") + continue + + if current_sample_bonds: + bond_data.append(current_sample_bonds) + + logger.info(f"Loaded bond data for {len(bond_data)} samples") + + if len(bond_data) != self.num_samples: + logger.warning( + f"Bond data samples ({len(bond_data)}) don't match " + f"main data samples ({self.num_samples})" + ) + + except Exception as e: + logger.warning(f"Error reading bond data from {path_bond}: {e}") + return None + + return bond_data + + def _integrate_charge_data(self, structures, charge_data): + + if charge_data is None or len(structures) != len(charge_data): + logger.warning("Mismatch between structures and charge data length") + return structures + + for i, (structure, charges) in enumerate(zip(structures, charge_data)): + + if len(structure) != len(charges): + logger.warning( + f"Sample {i}: Number of atoms in structure ({len(structure)}) " + f"doesn't match number of charges ({len(charges)})" + ) + continue + + if hasattr(structure, "site_properties"): + structure.add_site_property("charge", charges) + + elif hasattr(structure, "arrays"): + structure.arrays["charge"] = np.array(charges, dtype="float32") + else: + structure.info["atomic_charges"] = charges + + logger.info("Successfully integrated charge data into structures") + return structures + + def _integrate_bond_data(self, structures, bond_data): + + if bond_data is None or len(structures) != len(bond_data): + logger.warning("Mismatch between structures and bond data length") + return structures + + for i, (structure, bonds) in enumerate(zip(structures, bond_data)): + if len(structure) != len(bonds): + logger.warning(f"Sample {i}: Atom count mismatch") + continue + + n_atoms = len(structure) + bond_order_matrix = np.zeros((n_atoms, n_atoms), dtype="float32") + + for bond_entry in bonds: + atom_i = bond_entry["atom_index"] + for neighbor in bond_entry["neighbors"]: + atom_j = neighbor["index"] + bond_order = neighbor["bond_order"] + bond_order_matrix[atom_i, atom_j] = bond_order + bond_order_matrix[atom_j, atom_i] = bond_order + + try: + + structure.bond_order_matrix = bond_order_matrix + structure.bond_data = bonds + except AttributeError: + + if hasattr(structure, "info"): + structure.info["bond_order_matrix"] = bond_order_matrix + structure.info["bond_data"] = bonds + else: + logger.warning(f"Cannot add bond data: {type(structure)}") + continue + + logger.info("Successfully integrated bond data into structures") + return structures + + def get_structure_array(self, structure): + atom_types = np.array([site.specie.Z for site in structure]) + + lattice = np.eye(3, dtype="float32") + lengths = np.array([1.0, 1.0, 1.0], dtype="float32").reshape(1, 3) + angles = np.array([90.0, 90.0, 90.0], dtype="float32").reshape(1, 3) + + structure_array = { + "frac_coords": ConcatData(structure.frac_coords.astype("float32")), + "cart_coords": ConcatData(structure.cart_coords.astype("float32")), + "atom_types": ConcatData(atom_types), + "lattice": ConcatData(lattice.reshape(1, 3, 3)), + "lengths": ConcatData(lengths), + "angles": ConcatData(angles), + "num_atoms": ConcatData(np.array([tuple(atom_types.shape)[0]])), + } + + if self.use_atomic_charge: + if ( + hasattr(structure, "site_properties") + and "charge" in structure.site_properties + ): # naqo + charges = np.array(structure.site_properties["charge"], dtype="float32") + structure_array["atomic_charges"] = ConcatData(charges) + elif hasattr(structure, "atomic_charges"): + charges = np.array(structure.atomic_charges, dtype="float32") + structure_array["atomic_charges"] = ConcatData(charges) + + if self.use_chemical_bonding: + if hasattr(structure, "bond_order_matrix"): + + bond_matrix = structure.bond_order_matrix + structure_array["bond_orders"] = bond_matrix + elif ( + hasattr(structure, "site_properties") + and "bond_orders" in structure.site_properties + ): # naqo + + bond_orders = np.array( + structure.site_properties["bond_orders"], dtype="float32" + ) + structure_array["atomic_bond_orders"] = ConcatData(bond_orders) + + if hasattr(structure, "bond_data"): + structure_array["bond_data"] = structure.bond_data + + return structure_array + + def _parse_comment_line(self, comment: str): + # Parsing attributes in comment lines + properties = {} + if not comment: + return properties + + try: + parts = comment.split() + for part in parts: + if "=" in part: + key, value = part.split("=", 1) + if value.lower() == "nan": + properties[key] = float("nan") + else: + try: + if "." in value: + properties[key] = float(value) + else: + properties[key] = int(value) + except ValueError: + properties[key] = value + except Exception as e: + logger.warning(f"Comment line parsing error: {e}") + + return properties + + def _add_virtual_lattice(self, atoms): + # Add an effective virtual lattice to molecular data + import numpy as np + + if hasattr(atoms, "cell") and atoms.cell.rank == 3: + + if np.linalg.det(atoms.cell) > 1e-6: + return + + coords = atoms.positions + if len(coords) > 0: + min_coords = coords.min(axis=0) + max_coords = coords.max(axis=0) + size = max_coords - min_coords + + padding = max(10.0, np.max(size) * 0.5) + cell_size = size + padding + + atoms.set_cell(np.diag(cell_size)) + + center = (min_coords + max_coords) / 2 + lattice_center = atoms.cell.lengths() / 2 + atoms.positions += lattice_center - center + else: + + atoms.set_cell(np.eye(3) * 20.0) + + atoms.set_pbc([False, False, False]) + + def _manual_xyz_parser(self, path: str): + + atoms_list = [] + + with open(path, "r", encoding="utf-8", errors="ignore") as f: + content = f.read() + + structures = [s.strip() for s in content.split("\n\n") if s.strip()] + + for struct_idx, struct_content in enumerate(structures): + lines = [ + line.strip() for line in struct_content.split("\n") if line.strip() + ] + + if len(lines) < 2: + logger.warning( + f"Skip structure {struct_idx}: Insufficient number of lines" + ) + continue + + try: + natoms_line = lines[0] + try: + natoms = int(natoms_line) + except ValueError: + import re + + numbers = re.findall(r"\d+", natoms_line) + if numbers: + natoms = int(numbers[0]) + logger.warning(f"{struct_idx}: Inferring the number of atoms") + else: + logger.warning( + f"{struct_idx}: The number of atoms cannot be resolved" + ) + continue + + comment_line = lines[1] if len(lines) > 1 else "" + + # Resolve atomic coordinates + symbols = [] + positions = [] + atom_lines = ( + lines[2 : 2 + natoms] if len(lines) >= 2 + natoms else lines[2:] + ) + + for atom_line in atom_lines: + parts = atom_line.split() + if len(parts) >= 4: + symbol = parts[0] + try: + coords = [float(x) for x in parts[1:4]] + symbols.append(symbol) + positions.append(coords) + except ValueError: + logger.warning( + f"{struct_idx}: Coordinates cannot be resolved" + ) + + if len(symbols) != natoms: + logger.warning( + f"{struct_idx}: expect {natoms} atoms, actual {len(symbols)} " + ) + if len(symbols) == 0: + continue + + from ase import Atoms + + atoms = Atoms(symbols=symbols, positions=positions) + + self._add_virtual_lattice(atoms) + + properties = self._parse_comment_line(comment_line) + atoms.info.update(properties) + + atoms_list.append(atoms) + + except Exception as e: + logger.warning(f"Structure {struct_idx} Parsing error: {e}") + continue + + if not atoms_list: + raise ValueError("Didn't find an effective structure") + + return atoms_list + + def read_data(self, path: str, format: str = None): + logger.info("Parse to read xyz files...") + + try: + atoms_list = self._manual_xyz_parser(path) + logger.info(f"Successful reading {len(atoms_list)} structure") + return atoms_list, len(atoms_list) + except Exception as e: + logger.error(f"Parsing failed: {e}") + raise + + def atoms_to_structure(self, atoms: Atoms): + return AseAtomsAdaptor().get_structure(atoms) + + def filter_unvalid_by_property(self): + for property_name in self.property_names: + data = self.property_data[property_name] + reserve_idx = [] + for i, data_item in enumerate(data): + if isinstance(data_item, str) or ( + data_item is not None and not math.isnan(data_item) + ): + reserve_idx.append(i) + for key in self.property_data.keys(): + self.property_data[key] = [ + self.property_data[key][i] for i in reserve_idx + ] + + self.row_data = [self.row_data[i] for i in reserve_idx] + self.structures = [self.structures[i] for i in reserve_idx] + if self.graphs is not None: + self.graphs = [self.graphs[i] for i in reserve_idx] + logger.warning( + f"Filter out {len(reserve_idx)} samples with valid properties: " + f"{property_name}" + ) + self.num_samples = len(self.row_data) + logger.warning(f"Remaining {self.num_samples} samples after filtering.") + + def read_property_data(self, data: List[Atoms]): + """Read the property data from the given data and property names. + + Args: + data (List[Atoms]): List of ASE Atoms objects. + """ + property_data = {} + + if self.electronic_e_key is not None: + property_data[self.electronic_e_key] = [ + data[i].info.get("Electronic_E", np.nan) + for i in range(self.num_samples) + ] + + if self.dispersion_e_key is not None: + property_data[self.dispersion_e_key] = [ + data[i].info.get("Dispersion_E", np.nan) + for i in range(self.num_samples) + ] + + if self.dipole_m_key is not None: + property_data[self.dipole_m_key] = [ + data[i].info.get("Dipole_M", np.nan) for i in range(self.num_samples) + ] + + if self.metal_q_key is not None: + property_data[self.metal_q_key] = [ + data[i].info.get("Metal_q", np.nan) for i in range(self.num_samples) + ] + + if self.hl_gap_key is not None: + property_data[self.hl_gap_key] = [ + data[i].info.get("HL_Gap", np.nan) for i in range(self.num_samples) + ] + + if self.homo_energy_key is not None: + property_data[self.homo_energy_key] = [ + data[i].info.get("HOMO_Energy", np.nan) for i in range(self.num_samples) + ] + + if self.lumo_energy_key is not None: + property_data[self.lumo_energy_key] = [ + data[i].info.get("LUMO_Energy", np.nan) for i in range(self.num_samples) + ] + + if self.polarizability_key is not None: + property_data[self.polarizability_key] = [ + data[i].info.get("Polarizability", np.nan) + for i in range(self.num_samples) + ] + + if self.smiles_key is not None: + property_data[self.smiles_key] = [ + data[i].info.get("SMILES", None) for i in range(self.num_samples) + ] + + return property_data + + def save_to_cache(self, cache_path: str, data: Any): + with open(cache_path, "wb") as f: + pickle.dump(data, f) + + def load_from_cache(self, cache_path: str): + if osp.exists(cache_path): + with open(cache_path, "rb") as f: + data = pickle.load(f) + return data + else: + raise FileNotFoundError(f"No such file or directory: {cache_path}") + + def _check_cache_integrity(self, structure_cache_path, graph_cache_path): + + missing_files = [] + + for i in range(min(100, self.num_samples)): + cache_file = osp.join(structure_cache_path, f"{i:010d}.pkl") + if not osp.exists(cache_file): + missing_files.append(cache_file) + break + + if self.build_graph_cfg is not None: + for i in range(min(100, self.num_samples)): + cache_file = osp.join(graph_cache_path, f"{i:010d}.pkl") + if not osp.exists(cache_file): + missing_files.append(cache_file) + break + + return missing_files + + def __getitem__(self, idx: int): + """Get item at index idx.""" + data = {} + # get graph + if self.graphs is not None: + graph = self.graphs[idx] + if isinstance(graph, str): + + if osp.exists(graph): + graph = self.load_from_cache(graph) + else: + + logger.warning(f"Graph cache file {graph} not found") + + structure = self.structures[idx] + if isinstance(structure, str) and osp.exists(structure): + structure = self.load_from_cache(structure) + if self.build_graph_cfg is not None and structure is not None: + converter = build_graph_converter(self.build_graph_cfg) + graph = converter([structure])[0] + else: + graph = None + data["graph"] = graph + else: + structure = self.structures[idx] + if isinstance(structure, str): + structure = self.load_from_cache(structure) + data["structure_array"] = self.get_structure_array(structure) + + for property_name in self.property_names: + + if property_name in self.property_data: + # SMILES is a string type + if property_name == self.smiles_key: + data[property_name] = self.property_data[property_name][idx] + else: + # Other numeric attributes are converted to numpy arrays + data[property_name] = np.array( + [self.property_data[property_name][idx]] + ).astype("float32") + else: + raise KeyError(f"Property {property_name} not found.") + # Use indexes as IDs + data["id"] = idx + data = self.transforms(data) if self.transforms is not None else data + + return data + + def __len__(self): + return self.num_samples diff --git a/ppmat/datasets/transform/__init__.py b/ppmat/datasets/transform/__init__.py new file mode 100644 index 00000000..c514cf98 --- /dev/null +++ b/ppmat/datasets/transform/__init__.py @@ -0,0 +1,100 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import traceback +from typing import Any +from typing import Tuple + +from paddle import vision + +from ppmat.datasets.transform.dataset import custom_scaling +from ppmat.datasets.transform.dataset import mean_std_scaling +from ppmat.datasets.transform.dataset import no_scaling +from ppmat.datasets.transform.dataset import rmsd_scaling +from ppmat.datasets.transform.post_process import PowerData +from ppmat.datasets.transform.post_process import UnNormalize +from ppmat.datasets.transform.preprocess import Abs +from ppmat.datasets.transform.preprocess import LatticePolarDecomposition +from ppmat.datasets.transform.preprocess import Log10 +from ppmat.datasets.transform.preprocess import Normalize +from ppmat.datasets.transform.preprocess import Scale +from ppmat.utils import logger + +__all__ = [ + "Normalize", + "Log10", + "UnNormalize", + "PowerData", + "LatticePolarDecomposition", + "Scale", + "Abs", + "no_scaling", + "mean_std_scaling", + "rmsd_scaling", + "custom_scaling", +] + + +class Compose(vision.Compose): + """Custom Compose for multiple items in given data.""" + + def __call__(self, *data: Tuple[Any, ...]): + for f in self.transforms: + try: + # NOTE: This is different from vision.Compose to allow receive + # multiple data items + data = f(*data) + except Exception as e: + stack_info = traceback.format_exc() + logger.info( + f"fail to perform transform [{f}] with error: " + f"{e} and stack:\n{str(stack_info)}" + ) + raise e + return data + + +def build_transforms(cfg): + if not cfg: + return None + cfg = copy.deepcopy(cfg) + transform_list = [] + for _item in cfg: + transform_cls = _item.pop("__class_name__") + init_params = _item.pop("__init_params__") + transform = eval(transform_cls)(**init_params) + transform_list.append(transform) + + return vision.Compose(transform_list) + + +def build_post_transforms(cfg): + if not cfg: + return None + cfg = copy.deepcopy(cfg) + transform_list = [] + for _item in cfg: + transform_cls = _item.pop("__class_name__") + init_params = _item.pop("__init_params__") + transform = eval(transform_cls)(**init_params) + transform_list.append(transform) + + return vision.Compose(transform_list) + + +def run_dataset_transform(trans_func, *args, **kwargs): + result = eval(trans_func)(*args, **kwargs) + + return result diff --git a/ppmat/datasets/transform/dataset.py b/ppmat/datasets/transform/dataset.py new file mode 100644 index 00000000..824c18e2 --- /dev/null +++ b/ppmat/datasets/transform/dataset.py @@ -0,0 +1,83 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +from paddle.io import DataLoader +from typing import Union, List + +__all__ = [ + "no_scaling", + "mean_std_scaling", + "rmsd_scaling", + "custom_scaling", + ] + + +def no_scaling( + train_loader: DataLoader, + target: Union[str, List[str]], + **kwargs + ): + return 0.0, 1.0 + + +def mean_std_scaling( + train_loader: DataLoader, + target: Union[str, List[str]], + **kwargs + ): + target_list = [] + + if isinstance(target, list): + if len(target) == 1: + target = target[0] + else: + raise NotImplementedError("Current mean_std_scaling only supports single-target data") + + for _, batch_data in enumerate(train_loader): + target_list.append(batch_data[target]) + graph_target = paddle.concat(target_list, axis=0) # [total_n_graphs] + mean = paddle.mean(graph_target).numpy() + std = paddle.std(graph_target).numpy() + return mean, std + + +def rmsd_scaling( + train_loader: DataLoader, + target: Union[str, List[str]], + **kwargs + ): + raise NotImplementedError("rmsd_scaling has been removed") + # else: + # for batch in train_dataset: + # target_list.append(batch.target) # {[n_graphs*n_atoms,3], + # vector_target = torch.cat(target_list, dim=0) # {[total_n_graphs*n_atoms,3], } + # mean = to_numpy(torch.mean(vector_target)).item() + # std = to_numpy(torch.std(vector_target)).item() + + +def custom_scaling( + train_loader: DataLoader, + target: Union[str, List[str]], + **kwargs + ): + if len(kwargs) == 0: + raise ValueError("custom_scaling requires at least one parameter (e.g., 'mean' and 'std', or 'rmsd').") + + if "mean" in kwargs and "std" in kwargs: + return float(kwargs["mean"]), float(kwargs["std"]) + elif "rmsd" in kwargs: + return 0.0, float(kwargs["rmsd"]) + else: + raise ValueError("Required keyword arguments not found. Please check or modify the 'custom_scaling' function.") diff --git a/ppmat/datasets/transform/post_process.py b/ppmat/datasets/transform/post_process.py new file mode 100644 index 00000000..e0f3ebc1 --- /dev/null +++ b/ppmat/datasets/transform/post_process.py @@ -0,0 +1,109 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Optional +from typing import Tuple +from typing import Union + +import numpy as np + +__all__ = [ + "UnNormalize", + "PowerData", +] + + +class UnNormalize: + """UnNormalize the data. + + Args: + mean (Union[np.ndarray, Tuple[float, ...]]): Mean of the data + std (Union[np.ndarray, Tuple[float, ...]]): Standard deviation of the data + apply_keys (Optional[Tuple[str, ...]]): Keys that need to be denormalized. + If `None`, all keys will be normalized. Defaults to None. + """ + + def __init__( + self, + mean: Union[np.ndarray, Tuple[float, ...]], + std: Union[np.ndarray, Tuple[float, ...]], + apply_keys: Optional[Tuple[str, ...]] = None, + ): + + self.mean = mean + self.std = std + if apply_keys is not None: + self.apply_keys = ( + [apply_keys] if isinstance(apply_keys, str) else apply_keys + ) + else: + self.apply_keys = None + + def __call__(self, data): + if self.apply_keys is None: + apply_keys = data.keys() + else: + apply_keys = self.apply_keys + for key in apply_keys: + if key not in data: + continue + data[key] = data[key] * self.std + self.mean + return data + + +class PowerData: + """Power Data. + + Args: + base (Optional[int]): Base of the power. Defaults to None. + exp (Optional[int]): Exponent of the power. Defaults to None. + apply_keys (Optional[Tuple[str, ...]]): Keys that need to be powered. + If `None`, all keys will be powered. Defaults to None. + """ + + def __init__( + self, + base: Optional[int] = None, + exp: Optional[int] = None, + apply_keys: Optional[Tuple[str, ...]] = None, + ): + assert ( + base is not None or exp is not None + ), "Base or exponent must be specified." + assert base is None or exp is None, "Base and exponent must be specified." + + self.base = base + self.exp = exp + if apply_keys is not None: + self.apply_keys = ( + [apply_keys] if isinstance(apply_keys, str) else apply_keys + ) + else: + self.apply_keys = None + + def __call__(self, data): + if self.apply_keys is None: + apply_keys = data.keys() + else: + apply_keys = self.apply_keys + for key in apply_keys: + if key not in data: + continue + if self.base is not None: + data[key] = self.base ** data[key] + else: + data[key] = data[key] ** self.exp + return data diff --git a/ppmat/datasets/transform/preprocess.py b/ppmat/datasets/transform/preprocess.py new file mode 100644 index 00000000..62abf242 --- /dev/null +++ b/ppmat/datasets/transform/preprocess.py @@ -0,0 +1,203 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Dict +from typing import Optional +from typing import Sequence +from typing import Tuple +from typing import Union + +import numpy as np +import paddle + +from ppmat.utils.paddle_aux import dim2perm + +__all__ = [ + "Normalize", + "Log10", + "LatticePolarDecomposition", + "Scale", + "Abs", +] + + +class Normalize: + """Normalize data class.""" + + def __init__( + self, + mean: Union[np.ndarray, Tuple[float, ...]], + std: Union[np.ndarray, Tuple[float, ...]], + apply_keys: Optional[Tuple[str, ...]] = None, + ): + self.mean = mean + self.std = std + if apply_keys is not None: + self.apply_keys = ( + [apply_keys] if isinstance(apply_keys, str) else apply_keys + ) + else: + self.apply_keys = None + + def __call__(self, data): + if self.apply_keys is None: + apply_keys = data.keys() + else: + apply_keys = self.apply_keys + for key in apply_keys: + if key not in data: + continue + data[key] = (data[key] - self.mean) / self.std + return data + + +class Log10: + """Calculates the base-10 logarithm of the data, element-wise.""" + + def __init__( + self, + apply_keys: Optional[Tuple[str, ...]] = None, + ): + if apply_keys is not None: + self.apply_keys = ( + [apply_keys] if isinstance(apply_keys, str) else apply_keys + ) + else: + self.apply_keys = None + + def __call__(self, data): + if self.apply_keys is None: + apply_keys = data.keys() + else: + apply_keys = self.apply_keys + for key in apply_keys: + if key not in data: + continue + data[key] = np.log10(data[key]) + return data + + +class Scale: + """Calculates the base-10 logarithm of the data, element-wise.""" + + def __init__( + self, + scale: float, + apply_keys: Optional[Tuple[str, ...]] = None, + ): + if apply_keys is not None: + self.apply_keys = ( + [apply_keys] if isinstance(apply_keys, str) else apply_keys + ) + else: + self.apply_keys = None + self.scale = scale + + def __call__(self, data): + if self.apply_keys is None: + apply_keys = data.keys() + else: + apply_keys = self.apply_keys + for key in apply_keys: + if key not in data: + continue + data[key] = data[key] * self.scale + return data + + +class Abs: + def __init__( + self, + apply_keys: Optional[Tuple[str, ...]] = None, + ): + if apply_keys is not None: + self.apply_keys = ( + [apply_keys] if isinstance(apply_keys, str) else apply_keys + ) + else: + self.apply_keys = None + + def __call__(self, data): + if self.apply_keys is None: + apply_keys = data.keys() + else: + apply_keys = self.apply_keys + for key in apply_keys: + if key not in data: + continue + data[key] = np.abs(data[key]) + return data + + +class LatticePolarDecomposition: + """Lattice Polar Decomposition""" + + def __init__(self, by_numpy_or_paddle="paddle"): + + assert by_numpy_or_paddle in ["numpy", "paddle"] + self.by_numpy_or_paddle = by_numpy_or_paddle + + def __call__(self, data): + lattice = data["structure_array"]["lattice"].data + + if self.by_numpy_or_paddle == "numpy": + lattice_symm = self.compute_lattice_polar_decomposition_np(lattice) + else: + lattice = paddle.to_tensor(lattice) + lattice_symm = self.compute_lattice_polar_decomposition_paddle(lattice) + lattice_symm = lattice_symm.numpy() + data["structure_array"]["lattice"].data = lattice_symm + return data + + def compute_lattice_polar_decomposition_np( + self, lattice_matrix: np.ndarray + ) -> np.ndarray: + + U, S, Vh = np.linalg.svd(lattice_matrix, full_matrices=True) + S_square = np.diag(S.squeeze()) + + V = Vh.transpose(0, 2, 1) + U = U @ Vh + + P = V @ S_square @ Vh + P_prime = U @ P @ U.transpose(0, 2, 1) + + return P_prime + + def compute_lattice_polar_decomposition_paddle( + self, lattice_matrix: paddle.Tensor + ) -> paddle.Tensor: + W, S, V_transp = paddle.linalg.svd(full_matrices=True, x=lattice_matrix) + S_square = paddle.diag_embed(input=S) + V = V_transp.transpose(perm=dim2perm(V_transp.ndim, 1, 2)) + U = W @ V_transp + P = V @ S_square @ V_transp + P_prime = U @ P @ U.transpose(perm=dim2perm(U.ndim, 1, 2)) + symm_lattice_matrix = P_prime + return symm_lattice_matrix + + +class SetProperty: + def __init__(self, property_name: str, value: (float | Sequence[str])): + self.property_name = property_name + self.value = ( + paddle.to_tensor(data=value, dtype="float32") + if isinstance(value, float) or isinstance(value, int) + else value + ) + + def __call__(self, data: Dict): + return data.update(**{self.property_name: self.value}) diff --git a/ppmat/losses/__init__.py b/ppmat/losses/__init__.py new file mode 100644 index 00000000..e5258105 --- /dev/null +++ b/ppmat/losses/__init__.py @@ -0,0 +1,56 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy + +from ppmat.losses.l1_loss import HuberLoss +from ppmat.losses.l1_loss import L1Loss +from ppmat.losses.l1_loss import MAELoss +from ppmat.losses.l1_loss import SmoothL1Loss +from ppmat.losses.loss_warper import LossWarper +from ppmat.losses.mse_loss import MSELoss + +__all__ = [ + "MSELoss", + "L1Loss", + "SmoothL1Loss", + "MAELoss", + "HuberLoss", + "LossWarper", + "build_loss", +] + + +def build_loss(cfg): + """Build loss. + + Args: + cfg (DictConfig): Loss config. + + Returns: + Loss: Callable loss object. + """ + cfg = copy.deepcopy(cfg) + + loss_cls = cfg.pop("__class_name__") + init_params = cfg.pop("__init_params__") + if loss_cls == "LossWarper": + losses_cfg = init_params.pop("loss_fn") + loss_fn = {} + for key in losses_cfg.keys(): + loss_fn[key] = build_loss(losses_cfg[key]) + init_params["loss_fn"] = loss_fn + + loss = eval(loss_cls)(**init_params) + return loss diff --git a/ppmat/losses/diffnmr_loss.py b/ppmat/losses/diffnmr_loss.py new file mode 100644 index 00000000..633292d5 --- /dev/null +++ b/ppmat/losses/diffnmr_loss.py @@ -0,0 +1,121 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +import paddle.nn as nn + +from ppmat.metrics.diffnmr_metric import CrossEntropyMetric + + +class TrainLossDiscrete(nn.Layer): + """Train with Cross Entropy""" + + def __init__(self, lambda_train): + super().__init__() + self.node_loss = CrossEntropyMetric() + self.edge_loss = CrossEntropyMetric() + self.y_loss = CrossEntropyMetric() + self.lambda_train = lambda_train + + def forward( + self, + masked_pred_X, + masked_pred_E, + pred_y, + true_X, + true_E, + true_y, + ): + """ + Compute train metrics + masked_pred_X : tensor -- (bs, n, dx) + masked_pred_E : tensor -- (bs, n, n, de) + pred_y : tensor -- (bs, ) + true_X : tensor -- (bs, n, dx) + true_E : tensor -- (bs, n, n, de) + true_y : tensor -- (bs, ) + """ + # reshape tensor + true_X = paddle.reshape(true_X, [-1, true_X.shape[-1]]) # (bs * n, dx) + true_E = paddle.reshape(true_E, [-1, true_E.shape[-1]]) # (bs * n * n, de) + masked_pred_X = paddle.reshape( + masked_pred_X, [-1, masked_pred_X.shape[-1]] + ) # (bs * n, dx) + masked_pred_E = paddle.reshape( + masked_pred_E, [-1, masked_pred_E.shape[-1]] + ) # (bs * n * n, de) + + # Apply mask to remove masked rows + mask_X = paddle.sum(true_X != 0.0, axis=-1) > 0 # (bs * n,) + mask_E = paddle.sum(true_E != 0.0, axis=-1) > 0 # (bs * n * n,) + + flat_true_X = true_X[mask_X] + flat_pred_X = masked_pred_X[mask_X] + + flat_true_E = true_E[mask_E] + flat_pred_E = masked_pred_E[mask_E] + + # calculate cross entropy loss + loss_X = ( + self.node_loss(flat_pred_X, flat_true_X) + if true_X.numel() > 0 + else paddle.to_tensor(0.0) + ) + loss_E = ( + self.edge_loss(flat_pred_E, flat_true_E) + if true_E.numel() > 0 + else paddle.to_tensor(0.0) + ) + loss_y = ( + self.y_loss(pred_y, true_y) if true_y.numel() > 0 else paddle.to_tensor(0.0) + ) + + # return weighted loss + Sloss = loss_X + loss_E + loss_y + Wloss = loss_X + self.lambda_train[0] * loss_E + self.lambda_train[1] * loss_y + + return { + "loss": Wloss, + "batch_CE": Sloss, + "X_CE": loss_X, + "E_CE": loss_E, + "Y_CE": loss_y, + } + + def reset(self): + # reset all cross entropy metric + for metric in [self.node_loss, self.edge_loss, self.y_loss]: + metric.reset() + + def log_epoch_metrics(self): + epoch_node_loss = ( + self.node_loss.accumulate().item() + if self.node_loss.total_samples > 0 + else -1 + ) + epoch_edge_loss = ( + self.edge_loss.accumulate().item() + if self.edge_loss.total_samples > 0 + else -1 + ) + epoch_y_loss = ( + self.y_loss.accumulate().item() if self.y_loss.total_samples > 0 else -1 + ) + + to_log = { + "train_epoch/x_CE": epoch_node_loss, + "train_epoch/E_CE": epoch_edge_loss, + "train_epoch/y_CE": epoch_y_loss, + } + return to_log diff --git a/ppmat/losses/l1_loss.py b/ppmat/losses/l1_loss.py new file mode 100644 index 00000000..bc8caf61 --- /dev/null +++ b/ppmat/losses/l1_loss.py @@ -0,0 +1,72 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from typing_extensions import Literal + + +class L1Loss(nn.Layer): + r"""Class for l1 loss.""" + + def __init__( + self, + reduction: Literal["mean", "sum"] = "mean", + ): + super().__init__() + if reduction not in ["mean", "sum"]: + raise ValueError( + f"reduction should be 'mean' or 'sum', but got {reduction}" + ) + self.reduction = reduction + + def forward(self, pred, label) -> paddle.Tensor: + + loss = F.l1_loss(pred, label, self.reduction) + return loss + + +class MAELoss(L1Loss): + r"""Class for mean absolute error loss.""" + pass + + +class SmoothL1Loss(nn.Layer): + r"""Class for smooth l1 loss.""" + + def __init__( + self, + reduction: Literal["mean", "sum"] = "mean", + delta: float = 1.0, + ): + super().__init__() + if reduction not in ["mean", "sum"]: + raise ValueError( + f"reduction should be 'mean' or 'sum', but got {reduction}" + ) + self.reduction = reduction + self.delta = delta + + def forward(self, pred, label) -> paddle.Tensor: + + loss = F.smooth_l1_loss(pred, label, self.reduction, delta=self.delta) + return loss + + +class HuberLoss(SmoothL1Loss): + r"""Class for huber loss.""" + pass diff --git a/ppmat/losses/loss_warper.py b/ppmat/losses/loss_warper.py new file mode 100644 index 00000000..05328774 --- /dev/null +++ b/ppmat/losses/loss_warper.py @@ -0,0 +1,46 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Dict +from typing import Optional + +import paddle +import paddle.nn as nn + + +class LossWarper(nn.Layer): + r"""Class for loss warp.""" + + def __init__( + self, + loss_fn: Dict[str, nn.Layer], + weights: Optional[Dict[str, float]] = None, + ): + super().__init__() + self.loss_fn = loss_fn + self.weights = weights + + def forward(self, pred, label) -> paddle.Tensor: + losses = {} + for key in self.loss_fn: + losses[key] = self.loss_fn[key](pred[key], label[key]) + + loss = 0 + for key in losses: + if self.weights is not None: + loss += self.weights[key] * losses[key] + losses["loss"] = loss + return losses diff --git a/ppmat/losses/mse_loss.py b/ppmat/losses/mse_loss.py new file mode 100644 index 00000000..92df488a --- /dev/null +++ b/ppmat/losses/mse_loss.py @@ -0,0 +1,40 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from typing_extensions import Literal + + +class MSELoss(nn.Layer): + r"""Class for mean squared error loss.""" + + def __init__( + self, + reduction: Literal["mean", "sum"] = "mean", + ): + super().__init__() + if reduction not in ["mean", "sum"]: + raise ValueError( + f"reduction should be 'mean' or 'sum', but got {reduction}" + ) + self.reduction = reduction + + def forward(self, pred, label) -> paddle.Tensor: + + loss = F.mse_loss(pred, label, self.reduction) + return loss diff --git a/ppmat/metrics/__init__.py b/ppmat/metrics/__init__.py new file mode 100644 index 00000000..acb6d511 --- /dev/null +++ b/ppmat/metrics/__init__.py @@ -0,0 +1,74 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy + +import paddle # noqa + +from ppmat.metrics.csp_metric import CSPMetric +from ppmat.metrics.diffnmr_streaming_adapter import DiffNMRStreamingAdapter +from ppmat.metrics.sfin_metric import SFINStreamingAdapter + +__all__ = [ + "build_metric", + "CSPMetric", + "DiffNMRStreamingAdapter", + "SFINStreamingAdapter", + # "DiffNMRMetric", + # "NLL", "CrossEntropyMetric", "SumExceptBatchMetric", "SumExceptBatchKL", +] + + +class IgnoreNanMetricWrapper: + def __init__(self, **metric_cfg): + self._metric_cfg = metric_cfg + self._metric = build_metric(self._metric_cfg) + + def __call__(self, pred, label): + + valid_value_indices = ~paddle.isnan(label) + valid_label = label[valid_value_indices] + valid_pred = pred[valid_value_indices] + if valid_label.numel() > 0: + metric_value = self._metric(valid_pred, valid_label) + else: + metric_value = paddle.nan + return metric_value + + +def build_metric(cfg): + """Build metric. + + Args: + cfg (DictConfig): Metric config. + + Returns: + Metric: Callable Metric object. + """ + if cfg is None: + return None + cfg = copy.deepcopy(cfg) + + if "__class_name__" not in cfg: + assert isinstance(cfg, dict) + metric_dict = {} + for key, sub_cfg in cfg.items(): + metric_dict[key] = build_metric(sub_cfg) + return metric_dict + + class_name = cfg.pop("__class_name__") + init_params = cfg.pop("__init_params__") + + metric = eval(class_name)(**init_params) + return metric diff --git a/ppmat/metrics/csp_metric.py b/ppmat/metrics/csp_metric.py new file mode 100644 index 00000000..59a5e5fa --- /dev/null +++ b/ppmat/metrics/csp_metric.py @@ -0,0 +1,86 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Any + +import numpy as np +import pandas as pd +from p_tqdm import p_map +from pymatgen.analysis.structure_matcher import StructureMatcher +from tqdm import tqdm + +from ppmat.metrics.utils import Crystal +from ppmat.metrics.utils import get_crys_from_cif + +# Warning: the smact package version is 2.5.5, +# different version may cause slight differences in accuracy. + + +class CSPMetric: + # the crystal structure prediction metrics class + def __init__(self, gt_file_path, stol=0.5, angle_tol=10, ltol=0.3): + + assert gt_file_path.endswith(".csv"), "gt_file_path should be a CSV file" + self.gt_file_path = gt_file_path + self.matcher = StructureMatcher(stol=stol, angle_tol=angle_tol, ltol=ltol) + self.gt_crys = None + + def get_match_rate_and_rms(self, pred_crys, gt_crys): + assert len(pred_crys) == len(gt_crys) + + def process_one(pred, gt, is_valid): + if not is_valid: + return None + try: + rms_dist = self.matcher.get_rms_dist(pred.structure, gt.structure) + rms_dist = None if rms_dist is None else rms_dist[0] + return rms_dist + except Exception: + return None + + validity = [(c1.valid and c2.valid) for c1, c2 in zip(pred_crys, gt_crys)] + rms_dists = [] + for i in tqdm(range(len(pred_crys)), desc="Computing RMS distance"): + rms_dists.append(process_one(pred_crys[i], gt_crys[i], validity[i])) + rms_dists = np.array(rms_dists) + match_rate = sum(rms_dists != None) / len(pred_crys) # noqa + mean_rms_dist = rms_dists[rms_dists != None].mean() # noqa + return {"match_rate": match_rate, "rms_dist": mean_rms_dist} + + def __call__(self, pred_data, gt_data=None) -> Any: + + pred_crys = p_map(lambda x: Crystal(x), pred_data, desc="Loading predictions") + # the following line is equivalent to the above line, but it is slower, + # it is used for debugging purposes + # pred_crys = [] + # for i in tqdm(range(len(pred_data))): + # pred_crys.append(Crystal(pred_data[i])) + + if gt_data is not None: + gt_crys = p_map( + lambda x: Crystal(x), gt_data, desc="Loading ground truth from data" + ) + else: + if self.gt_crys is None: + # read the ground truth from csv file + csv = pd.read_csv(self.gt_file_path) + self.gt_crys = p_map( + get_crys_from_cif, csv["cif"], desc="Loading ground truth from CSV" + ) + gt_crys = self.gt_crys + + metrics = self.get_match_rate_and_rms(pred_crys, gt_crys) + return metrics diff --git a/ppmat/metrics/diffnmr_metric.py b/ppmat/metrics/diffnmr_metric.py new file mode 100644 index 00000000..fdfa87bb --- /dev/null +++ b/ppmat/metrics/diffnmr_metric.py @@ -0,0 +1,882 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pathlib import Path +from typing import Any +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from rdkit import Chem +from rdkit.Chem import DataStructs +from rdkit.Chem import RDKFingerprint + +from ppmat.models.diffnmr.utils import diffgraphformer_utils as utils +from ppmat.schedulers import scheduling_diffnmr +from ppmat.utils.ext_rdkit import compute_molecular_metrics + +# ========================= +# Utilities +# ========================= + + +def _is_dist(): + try: + import paddle.distributed as dist + + return dist.is_initialized() and dist.get_world_size() > 1 + except Exception: + return False + + +def _all_reduce_sum_(t: paddle.Tensor) -> paddle.Tensor: + """Inplace SUM all_reduce if distributed; returns t.""" + if _is_dist(): + import paddle.distributed as dist + + dist.all_reduce(t, op=dist.ReduceOp.SUM) + return t + + +def _to_f32(x) -> paddle.Tensor: + return ( + paddle.to_tensor(x, dtype="float32") + if not isinstance(x, paddle.Tensor) + else x.astype("float32") + ) + + +def _l1_normalize(x: paddle.Tensor, eps: float = 1e-12) -> paddle.Tensor: + x = x.astype("float32") + s = paddle.sum(x) + return x / paddle.maximum(s, _to_f32(eps)) + + +# ========================= +# Scalar Metrics (fixed bugs) +# ========================= + + +class SumExceptBatchMetric(paddle.metric.Metric): + """Sum over all dims then average per-sample (batch).""" + + def __init__(self): + super().__init__() + self.reset() + + def name(self): + return self.__class__.__name__ + + def reset(self): + self._sum = _to_f32(0.0) + self._n = _to_f32(0.0) + + def update(self, values: paddle.Tensor): + self._sum += paddle.sum(values) + self._n += _to_f32(values.shape[0]) + + def accumulate(self): + num = _all_reduce_sum_(self._sum.clone()) + den = _all_reduce_sum_(self._n.clone()) + return num / paddle.maximum(den, _to_f32(1.0)) + + def __call__(self, values: paddle.Tensor): + self.reset() + self.update(values) + return self.accumulate() + + +class SumExceptBatchKL(paddle.metric.Metric): + """ + KL with robust handling of logits/probs: + update(p, q) treats p,q as logits by default (safer). + You can pass log_input/log_target=True if providing log-probs. + """ + + def __init__(self, log_input: bool = False, log_target: bool = False): + super().__init__() + self.log_input = log_input + self.log_target = log_target + self.reset() + + def name(self): + return self.__class__.__name__ + + def reset(self): + self._sum = _to_f32(0.0) + self._n = _to_f32(0.0) + + def update(self, p: paddle.Tensor, q: paddle.Tensor): + x = p if self.log_input else F.log_softmax(p, axis=-1) + y = q if self.log_target else F.softmax(q, axis=-1) + kl = F.kl_div(x, y, reduction="sum", log_target=self.log_target) + self._sum += kl + self._n += _to_f32(p.shape[0]) + + def accumulate(self): + num = _all_reduce_sum_(self._sum.clone()) + den = _all_reduce_sum_(self._n.clone()) + return num / paddle.maximum(den, _to_f32(1.0)) + + def __call__(self, p: paddle.Tensor, q: paddle.Tensor): + self.reset() + self.update(p, q) + return self.accumulate() + + +class CrossEntropyMetric(paddle.metric.Metric): + """Average CE for one-hot targets; fixed accumulate and no unintended resets.""" + + def __init__(self): + super().__init__() + self.reset() + + def name(self): + return self.__class__.__name__ + + def reset(self): + self._sum = _to_f32(0.0) + self._n = _to_f32(0.0) + + def update(self, logits: paddle.Tensor, target_onehot: paddle.Tensor): + target = paddle.argmax(target_onehot, axis=-1) + ce = F.cross_entropy(logits, target, reduction="sum") + self._sum += ce + self._n += _to_f32(logits.shape[0]) + + def accumulate(self): + num = _all_reduce_sum_(self._sum.clone()) + den = _all_reduce_sum_(self._n.clone()) + return num / paddle.maximum(den, _to_f32(1.0)) + + def __call__(self, logits: paddle.Tensor, target_onehot: paddle.Tensor): + self.reset() + self.update(logits, target_onehot) + return self.accumulate() + + +class NLL(paddle.metric.Metric): + """Streaming Negative Log-Likelihood mean.""" + + def __init__(self): + super().__init__() + self.reset() + + def name(self): + return self.__class__.__name__ + + def reset(self): + self._sum = _to_f32(0.0) + self._num = _to_f32(0.0) + + def update(self, batch_nll: paddle.Tensor): + self._sum += paddle.sum(batch_nll) + self._num += _to_f32(batch_nll.numel()) + + def accumulate(self): + num = _all_reduce_sum_(self._sum.clone()) + den = _all_reduce_sum_(self._num.clone()) + out = num / paddle.maximum(den, _to_f32(1.0)) + self.reset() + return out + + def __call__(self, batch_nll: paddle.Tensor): + self.update(batch_nll) + return self.accumulate() + + +# ========================= +# CE Refactor (vectorized + per-class stats + top1) +# ========================= + + +class _CETracker: + """ + Overall CE on masked positions + per-class CE and counts + top1 acc. + Vectorized, device-side accumulation, distributed-safe. + """ + + def __init__( + self, + num_classes: int, + class_names: Optional[List[str]] = None, + prefix: str = "", + ): + self.C = num_classes + self.class_names = class_names or [str(i) for i in range(num_classes)] + self.prefix = prefix.rstrip("/") + self.reset() + + def reset(self): + self._loss_sum = _to_f32(0.0) + self._count = _to_f32(0.0) + self._correct_sum = _to_f32(0.0) + self._loss_per_cls = paddle.zeros([self.C], dtype="float32") + self._cnt_per_cls = paddle.zeros([self.C], dtype="float32") + + @staticmethod + def _flatten_logits_targets( + logits: paddle.Tensor, target_onehot: paddle.Tensor + ) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Flatten to [N, C] and build valid mask from one-hot (any non-zero). + """ + C = target_onehot.shape[-1] + t = paddle.reshape(target_onehot, [-1, C]) + mask = paddle.any(t != 0.0, axis=-1) # [N] + ll = paddle.reshape(logits, [-1, C]) + return ll, t, mask + + def update(self, logits: paddle.Tensor, target_onehot: paddle.Tensor): + l, t, mask = self._flatten_logits_targets(logits, target_onehot) # noqa + if paddle.sum(mask).item() == 0: + return + target_idx = paddle.argmax(t, axis=-1) + # CE per-sample + loss_vec = F.cross_entropy(l, target_idx, reduction="none") # [N] + # mask + loss_vec = paddle.masked_select(loss_vec, mask) + target_idx = paddle.masked_select(target_idx, mask) + # overall + self._loss_sum += paddle.sum(loss_vec) + self._count += _to_f32(loss_vec.shape[0]) + # accuracy + pred_idx = paddle.argmax(l, axis=-1) + correct = (pred_idx == paddle.argmax(t, axis=-1)).astype("float32") + correct = paddle.masked_select(correct, mask) + self._correct_sum += paddle.sum(correct) + # per-class (vectorized) + oh = F.one_hot(target_idx, num_classes=self.C).astype("float32") # [Nm, C] + self._loss_per_cls += paddle.sum(oh * loss_vec.unsqueeze(-1), axis=0) + self._cnt_per_cls += paddle.sum(oh, axis=0) + + def compute(self) -> Dict[str, float]: + # distributed reduction + loss_sum = _all_reduce_sum_(self._loss_sum.clone()) + count = _all_reduce_sum_(self._count.clone()) + correct = _all_reduce_sum_(self._correct_sum.clone()) + loss_cls = _all_reduce_sum_(self._loss_per_cls.clone()) + cnt_cls = _all_reduce_sum_(self._cnt_per_cls.clone()) + + out: Dict[str, float] = {} + ce = (loss_sum / paddle.maximum(count, _to_f32(1.0))).item() + acc = (correct / paddle.maximum(count, _to_f32(1.0))).item() + if self.prefix: + out[f"{self.prefix}/ce"] = ce + out[f"{self.prefix}/acc_top1"] = acc + # per-class ce + for i, name in enumerate(self.class_names): + denom = paddle.maximum(cnt_cls[i], _to_f32(1.0)) + val = (loss_cls[i] / denom).item() + out[f"{self.prefix}/ce_class_{name}"] = val + else: + out["ce"] = ce + out["acc_top1"] = acc + for i, name in enumerate(self.class_names): + denom = paddle.maximum(cnt_cls[i], _to_f32(1.0)) + val = (loss_cls[i] / denom).item() + out[f"ce_class_{name}"] = val + return out + + +class TrainMolecularMetricsDiscrete(nn.Layer): + """ + Training/validation metrics: + - Atom overall CE + per-class CE + top1 + - Bond overall CE + per-class CE + top1 + """ + + def __init__(self, dataset_infos): + super().__init__() + atom_names = list(dataset_infos.atom_decoder) # e.g. ['H','C','N',...] + self.atom_ce = _CETracker( + num_classes=len(atom_names), class_names=atom_names, prefix="train/atom" + ) + # Bond: NoBond=0, Single=1, Double=2, Triple=3, Aromatic=4 + bond_names = ["NoBond", "Single", "Double", "Triple", "Aromatic"] + self.bond_ce = _CETracker( + num_classes=len(bond_names), class_names=bond_names, prefix="train/bond" + ) + + def forward(self, masked_pred_X, masked_pred_E, true_X, true_E, log: bool = False): + self.atom_ce.update(masked_pred_X, true_X) + self.bond_ce.update(masked_pred_E, true_E) + if not log: + return {} + out = {} + out.update(self.atom_ce.compute()) + out.update(self.bond_ce.compute()) + return out + + def reset(self): + self.atom_ce.reset() + self.bond_ce.reset() + + def log_epoch_metrics(self) -> Dict[str, float]: + out = {} + out.update( + { + k.replace("train/", "train_epoch/"): v + for k, v in self.atom_ce.compute().items() + } + ) + out.update( + { + k.replace("train/", "train_epoch/"): v + for k, v in self.bond_ce.compute().items() + } + ) + return out + + +# ========================= +# Sampling-time Metrics (vectorized counters + stable bins) +# ========================= + + +class _NHistogram: + def __init__(self, max_n: int): + self.max_n = max_n + self.hist = paddle.zeros([max_n + 1], "float32") + + def update(self, molecules): + # gather node counts then bincount + ns = [int(atom_types.shape[0]) for atom_types, _ in molecules] + if len(ns) == 0: + return + idx = paddle.to_tensor(ns, dtype="int64") + self.hist += paddle.bincount(idx, minlength=self.max_n + 1).astype("float32") + + def accumulate(self): + return _l1_normalize(self.hist) + + def __call__(self, molecules): + self.update(molecules) + return self.accumulate() + + def __getitem__(self, i): + return self.hist[i] + + +class _NodeHistogram: + def __init__(self, num_atom_types: int): + self.C = num_atom_types + self.hist = paddle.zeros([num_atom_types], "float32") + + def update(self, molecules): + # concat all atom types -> bincount + arrs = [] + for atom_types, _ in molecules: + a = paddle.to_tensor(atom_types, dtype="int64") + # mask should already be trimmed; keep assert + if (a == -1).any(): + raise AssertionError("mask error: atom_types contains -1") + arrs.append(a) + if not arrs: + return + flat = paddle.concat(arrs, axis=0) + self.hist += paddle.bincount(flat, minlength=self.C).astype("float32") + + def accumulate(self): + return _l1_normalize(self.hist) + + def __call__(self, molecules): + self.update(molecules) + return self.accumulate() + + def __getitem__(self, i): + return self.hist[i] + + +class _EdgeHistogram: + def __init__(self, num_edge_types: int): + self.C = num_edge_types + self.hist = paddle.zeros([num_edge_types], "float32") + + def update(self, molecules): + # collect upper-triangular edge types of all mols, then bincount + arrs = [] + for _, edge_types in molecules: + e = paddle.to_tensor(edge_types) + mask = paddle.triu(paddle.ones_like(e), diagonal=1).astype("bool") + arrs.append(e[mask]) + if not arrs: + return + flat = paddle.concat(arrs).astype("int64") + self.hist += paddle.bincount(flat, minlength=self.C).astype("float32") + + def accumulate(self): + return _l1_normalize(self.hist) + + def __call__(self, molecules): + self.update(molecules) + return self.accumulate() + + def __getitem__(self, i): + return self.hist[i] + + +class _ValencyHistogram: + """ + Discrete bins with 0.5 step: index = round(valency*2) + Using length = 3*max_n - 2 (covers [0, 0.5, 1, ..., 3n-2]/2). + Aromatic bond (4) is treated as 1.5 degree contribution. + """ + + def __init__(self, max_n): + self.L = 3 * max_n - 2 + self.hist = paddle.zeros([self.L], "float32") + + def update(self, molecules): + arrs = [] + for _, edge_types in molecules: + e = paddle.to_tensor(edge_types, dtype="float32") + e = paddle.where(e == 4.0, _to_f32(1.5), e) # Aromatic=1.5 + val = paddle.sum(e, axis=0) # [n] + idx = paddle.round(val * 2.0).astype("int64") + # clip to valid range just in case + idx = paddle.clip(idx, 0, self.L - 1) + arrs.append(idx) + if not arrs: + return + flat = paddle.concat(arrs) + self.hist += paddle.bincount(flat, minlength=self.L).astype("float32") + + def accumulate(self): + return _l1_normalize(self.hist) + + def __call__(self, molecules): + self.update(molecules) + return self.accumulate() + + def __getitem__(self, i): + return self.hist[i] + + +class _HistMAE(paddle.metric.Metric): + """MAE between predicted histogram and a fixed target histogram (streaming).""" + + def __init__(self, target_hist: paddle.Tensor, name_prefix: str = ""): + super().__init__() + assert paddle.abs(paddle.sum(target_hist) - 1.0) < 1e-3 + self.target = target_hist.astype("float32") + self.prefix = name_prefix + self.reset() + + def name(self): + return f"{self.prefix}HistMAE" if self.prefix else "HistMAE" + + def reset(self): + self._sum = _to_f32(0.0) + self._n = _to_f32(0.0) + + def update(self, pred_hist: paddle.Tensor): + p = _l1_normalize(pred_hist) + self._sum += paddle.sum(paddle.abs(p - self.target)) + self._n += _to_f32(1.0) + + def accumulate(self): + num = _all_reduce_sum_(self._sum.clone()) + den = _all_reduce_sum_(self._n.clone()) + return num / paddle.maximum(den, _to_f32(1.0)) + + def __call__(self, pred_hist: paddle.Tensor): + self.update(pred_hist) + return self.accumulate() + + +class SamplingMolecularMetrics(nn.Layer): + """ + Sampling/eval metrics: + 1) exact SMILES match accuracy + 2) RDKit quality metrics (Validity/Uniqueness/Novelty/ConnComp + stats) + 3) Histogram MAE on n-nodes / atom-types / bond-types / valency + 4) Optional retrieval top-k (molVec-spectrumVec), with CSV similarity dump. + """ + + def __init__( + self, + dataset_infos: Any, + train_smiles: List[str], + clip: Optional[nn.Layer] = None, + num_candidate: int = 1, + ): + super().__init__() + self.di = dataset_infos + self.train_smiles = train_smiles + self.num_candidate = num_candidate + self.atom_decoder = dataset_infos.atom_decoder + if clip: + self.clip = clip + self.spectrumVec = clip.spectrum_encoder + self.molVec = clip.graph_encoder + + # target histograms + self.register_buffer("target_n", _l1_normalize(_to_f32(dataset_infos.n_nodes))) + self.register_buffer( + "target_nodes", _l1_normalize(_to_f32(dataset_infos.node_types)) + ) + self.register_buffer( + "target_edges", _l1_normalize(_to_f32(dataset_infos.edge_types)) + ) + self.register_buffer( + "target_val", _l1_normalize(_to_f32(dataset_infos.valency_distribution)) + ) + + # online counters + self.gen_n = _NHistogram(dataset_infos.max_n_nodes) + self.gen_nodes = _NodeHistogram(dataset_infos.output_dims["X"]) + self.gen_edges = _EdgeHistogram(dataset_infos.output_dims["E"]) + self.gen_val = _ValencyHistogram(dataset_infos.max_n_nodes) + + # MAEs + self.mae_n = _HistMAE(self.target_n, "n/") + self.mae_nodes = _HistMAE(self.target_nodes, "node/") + self.mae_edges = _HistMAE(self.target_edges, "edge/") + self.mae_val = _HistMAE(self.target_val, "valency/") + + def forward( + self, + samples: Dict[str, Any], + current_epoch: int, + local_rank: int, + output_dir: str, + flag_test=False, + log_each_molecule=False, + ) -> Dict[str, Any]: + to_log: Dict[str, Any] = {} + pred, true = samples["pred"], samples["true"] + total = samples["n_all"] + + # 1) exact match + hit = 0 + for p, t in zip(pred, true): + mg = scheduling_diffnmr.mol_from_graphs(self.atom_decoder, *p) + mt = scheduling_diffnmr.mol_from_graphs(self.atom_decoder, *t) + if Chem.MolToSmiles(mg, True) == Chem.MolToSmiles(mt, True): + hit += 1 + to_log.update( + {"Accuracy": hit / total, "Right Number": hit, "Total Number": total} + ) + + # 2) RDKit global metrics + stability, rdkit_metrics, all_smiles = compute_molecular_metrics( + pred, self.train_smiles, self.di + ) + if local_rank == 0: + to_log.update(stability) + val, uniq, nov, conn = rdkit_metrics[0] + to_log.update( + { + "Validity": val, + "Uniqueness": uniq, + "Novelty": nov, + "Connected Components": conn, + } + ) + for k, v in rdkit_metrics[2].items(): + to_log[k] = v + + # 3) Histogram MAE (streaming, cross-batch safe) + g_n = self.gen_n(pred) + self.mae_n(g_n) + g_nd = self.gen_nodes(pred) + self.mae_nodes(g_nd) + g_ed = self.gen_edges(pred) + self.mae_edges(g_ed) + g_val = self.gen_val(pred) + self.mae_val(g_val) + + if local_rank == 0: + to_log["Gen n distribution"] = g_n + to_log["Gen node distribution"] = g_nd + to_log["Gen edge distribution"] = g_ed + to_log["Gen valency distribution"] = g_val + to_log["basic_metrics/n_mae"] = self.mae_n.accumulate() + to_log["basic_metrics/node_mae"] = self.mae_nodes.accumulate() + to_log["basic_metrics/edge_mae"] = self.mae_edges.accumulate() + to_log["basic_metrics/valency_mae"] = self.mae_val.accumulate() + + # 4) per-type deltas (diagnostics) + for i, atom_type in enumerate(self.atom_decoder): + to_log[f"molecular_metrics/{atom_type}_dist"] = float( + (g_nd[i] - self.target_nodes[i]).item() + ) + for j, bond_type in enumerate( + ["No bond", "Single", "Double", "Triple", "Aromatic"] + ): + to_log[f"molecular_metrics/bond_{bond_type}_dist"] = float( + (g_ed[j] - self.target_edges[j]).item() + ) + for k in range(min(6, g_val.shape[0])): + to_log[f"molecular_metrics/valency_{k}_dist"] = float( + (g_val[k] - self.target_val[k]).item() + ) + + # 5) retrieval top-k (optional) + if "candidates" in samples and samples["batch_condition"] is None: + to_log.update( + self._retrieval_metrics( + samples, + output_dir, + current_epoch, + local_rank, + verbose=log_each_molecule, + ) + ) + + # 6) dump SMILES + if flag_test and local_rank == 0: + file = Path(output_dir) / "graphs" / f"final_smiles_e_{current_epoch}.txt" + file.parent.mkdir(parents=True, exist_ok=True) + file.write_text("\n".join(s if s is not None else "" for s in all_smiles)) + return to_log + + # Vectorized retrieval top-k (same logic, streamlined) + def _retrieval_metrics( + self, + samples: Dict[str, Any], + output_dir: str, + epoch: int, + local_rank: int, + *, + verbose=False, + ) -> Dict[str, float]: + cand_lists = samples["candidates"] # List[C][B] + cand_X = samples["candidates_X"] # List[C][B, n_max, d_x] or np arrays + cand_E = samples["candidates_E"] # List[C][B, n_max, n_max, d_e] + cond_y = samples["batch_condition"] # list(4) of tensors for NMR encoder + atom_counts = samples["node_mask_meta"] # [B] + true_list = samples["true"] + B, C = len(true_list), len(cand_lists) + + if isinstance(cand_X, list): + cand_X = [paddle.to_tensor(x) for x in cand_X] + cand_X = paddle.stack(cand_X, axis=0) # [C,B,n_max,d_x] + cand_E = [paddle.to_tensor(x) for x in cand_E] + cand_E = paddle.stack(cand_E, axis=0) # [C,B,n_max,n_max,d_e] + + # node mask + n_max = int(paddle.max(paddle.stack(atom_counts)).item()) + arange = paddle.arange(n_max, dtype="int64") + node_mask = arange.unsqueeze(0).expand([B, n_max]) < paddle.stack( + atom_counts + ).unsqueeze(1) + + with paddle.no_grad(): + # text/NMR embedding once + nmr_emb = self.spectrumVec(cond_y) # [B, d] + # flatten candidates + X_flat = cand_X.reshape([C * B, *cand_X.shape[2:]]) # [C·B,n_max,d_x] + E_flat = cand_E.reshape([C * B, *cand_E.shape[2:]]) # [C·B,n_max,n_max,d_e] + node_mask_flat = node_mask.tile([C, 1]) # [C·B, n_max] + y_flat = paddle.zeros([C * B, 0], dtype=X_flat.dtype) + + z_t = ( + utils.PlaceHolder(X=X_flat, E=E_flat, y=y_flat) + .type_as(X_flat) + .mask(node_mask_flat) + ) + + extra = scheduling_diffnmr.compute_extra_data( + self.clip, + {"X_t": z_t.X, "E_t": z_t.E, "y_t": z_t.y, "node_mask": node_mask_flat}, + isPure=True, + ) + X_in = paddle.concat([z_t.X.astype("float32"), extra.X], axis=2) + E_in = paddle.concat([z_t.E.astype("float32"), extra.E], axis=3) + y_in = paddle.concat([z_t.y.astype("float32"), extra.y], axis=1) + + mol_flat: paddle.Tensor = self.molVec( + X_in, E_in, y_in, node_mask_flat + ) # [C·B, d] + mol_embs = mol_flat.reshape([C, B, -1]) # [C,B,d] + + sims = F.cosine_similarity( + nmr_emb.unsqueeze(0).expand([C, -1, -1]), mol_embs, axis=-1 + ) # [C,B] + max_idx = paddle.argmax(sims, axis=0) # [B] + top5_idx = paddle.topk(sims, k=min(5, C), axis=0)[1] # [k,B] + top10_idx = paddle.topk(sims, k=min(10, C), axis=0)[1] # [k,B] + + hit1 = hit5 = hit10 = 0 + csv_records: List[Dict[str, str]] = [] + + for i in range(B): + m_true = scheduling_diffnmr.mol_from_graphs( + self.atom_decoder, *true_list[i] + ) + s_true = Chem.MolToSmiles(m_true, True) + + # top-1 + sel = int(max_idx[i]) + m_pred = scheduling_diffnmr.mol_from_graphs( + self.atom_decoder, *cand_lists[sel][i] + ) + s_pred = Chem.MolToSmiles(m_pred, True) + if s_pred == s_true: + hit1 += 1 + + # top-5 / top-10 + for sel in top5_idx[:, i].astype("int64").tolist(): + if ( + Chem.MolToSmiles( + scheduling_diffnmr.mol_from_graphs( + self.atom_decoder, *cand_lists[sel][i] + ), + True, + ) + == s_true + ): + hit5 += 1 + break + for sel in top10_idx[:, i].astype("int64").tolist(): + if ( + Chem.MolToSmiles( + scheduling_diffnmr.mol_from_graphs( + self.atom_decoder, *cand_lists[sel][i] + ), + True, + ) + == s_true + ): + hit10 += 1 + break + + # fingerprint sim for top-1 + try: + sim = DataStructs.FingerprintSimilarity( + RDKFingerprint(m_pred), RDKFingerprint(m_true) + ) + except Exception: + sim = 0.0 + csv_records.append({"SMILES": s_true, "Similarity": f"{sim:.4f}"}) + if verbose: + print( + f"[GT {i+1}/{B}] top1={'OK' if s_pred==s_true else 'NO'} " + f"sim={sim:.3f}" + ) + + if local_rank == 0: + csv_path = Path(output_dir) / f"similarity_results_e{epoch}.csv" + import pandas as pd + + pd.DataFrame(csv_records).to_csv(csv_path, index=False) + + ks = (1, 5, 10) + hits = (hit1, hit5, hit10) + return { + f"retrieval_top{k}": h / len(true_list) for k, h in zip(ks, hits) if C >= k + } + + def reset(self): + for m in [self.mae_n, self.mae_nodes, self.mae_edges, self.mae_val]: + m.reset() + + +# ========================= +# Unified adapter for build_metric +# ========================= + + +class DiffNMRMetric: + """ + __init_params__: + mode: "train" | "sample" + dataset_infos: required for both + train_smiles: required for sample + clip: optional for sample + num_candidate: int, default 1 + """ + + def __init__( + self, + mode: str, + dataset_infos: Any = None, + train_smiles: Optional[List[str]] = None, + clip: Optional[nn.Layer] = None, + num_candidate: int = 1, + ): + self.mode = mode + self._dataset_infos = dataset_infos + self._train_smiles = train_smiles + self._clip = clip + self._num_candidate = num_candidate + self.impl = None + + # If the object is in the configuration, construct it directly. + if self._ready(): + self._build_impl() + + def bind(self, *, dataset_infos=None, train_smiles=None, clip=None): + """Inject real objects at runtime within the Trainer""" + if dataset_infos is not None: + self._dataset_infos = dataset_infos + if train_smiles is not None: + self._train_smiles = train_smiles + if clip is not None: + self._clip = clip + if self.impl is None and self._ready(): + self._build_impl() + + def _ready(self) -> bool: + if self.mode == "train": + return self._dataset_infos is not None + if self.mode == "sample": + return (self._dataset_infos is not None) and ( + self._train_smiles is not None + ) + return False + + def _build_impl(self): + if self.mode == "train": + self.impl = TrainMolecularMetricsDiscrete(self._dataset_infos) + elif self.mode == "sample": + self.impl = SamplingMolecularMetrics( + self._dataset_infos, self._train_smiles, self._clip, self._num_candidate + ) + else: + raise ValueError(f"Unknown mode: {self.mode}") + + def __call__(self, pred, label=None, **kwargs): + if self.impl is None: + raise RuntimeError( + "DiffNMRMetric is not bound yet. Call .bind(dataset_infos=..., " + "train_smiles=..., clip=...) before using." + ) + if self.mode == "train": + return self.impl( + pred["masked_pred_X"], + pred["masked_pred_E"], + label["true_X"], + label["true_E"], + log=kwargs.get("log", False), + ) + else: + return self.impl( + pred, + kwargs.get("current_epoch", 0), + kwargs.get("local_rank", 0), + kwargs.get("output_dir", "."), + kwargs.get("flag_test", False), + kwargs.get("log_each_molecule", False), + ) + + def reset(self): + if hasattr(self.impl, "reset") and self.impl is not None: + self.impl.reset() diff --git a/ppmat/metrics/diffnmr_streaming_adapter.py b/ppmat/metrics/diffnmr_streaming_adapter.py new file mode 100644 index 00000000..cbb05067 --- /dev/null +++ b/ppmat/metrics/diffnmr_streaming_adapter.py @@ -0,0 +1,337 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any +from typing import Dict +from typing import Optional + +import paddle + +from ppmat.metrics.diffnmr_metric import DiffNMRMetric +from ppmat.metrics.diffnmr_metric import SamplingMolecularMetrics +from ppmat.metrics.streaming_base import StreamingMetricBase +from ppmat.schedulers import scheduling_diffnmr + + +class DiffNMRStreamingAdapter(StreamingMetricBase): + """ + Minimal, robust streaming adapter for DiffNMR. + + Contract expected from model.forward(...): + result["pred_dict"] : {"masked_pred_X", "masked_pred_E", "pred_y"} + result["label_dict"] : {"true_X", "true_E", "true_y"} + result or batch : {"node_mask"} + result (optional) : {"noisy_data"}; if missing, adapter recomputes. + + Train: accumulates CE/Top-k via DiffNMRMetric (no logging noise). + Eval : accumulates NLL (and KL/logp if compute_val_loss supports it). + Sample : + exact SMILES match accuracy + RDKit quality metrics (Validity/Uniqueness/Novelty/ConnComp + stats) + Histogram MAE on n-nodes / atom-types / bond-types / valency + Optional retrieval top-k (molVec-nmrVec), with CSV similarity dump + """ + + def __init__( + self, + *, + t_scale: float = 1.0, # multiply eval NLL/terms by T if you want + dataset_infos: Any = None, + ): + self.t_scale = float(t_scale) + self.train_core = DiffNMRMetric(mode="train", dataset_infos=dataset_infos) + self.model: Optional[paddle.nn.Layer] = None + self.eval_acc = EvalAccumulator() + self.sample_core = None + self.reset() + + # ---- lifecycle ---- + def bind(self, **runtime_objs): + """Receive runtime objects (model, dataset_infos, clip, ...).""" + self.model = runtime_objs.get("model", self.model) + if hasattr(self.train_core, "bind"): + # Only pass what DiffNMRMetric.bind accepts (keep it simple) + try: + self.train_core.bind( + **{k: v for k, v in runtime_objs.items() if k != "model"} + ) + except TypeError: + pass + clip = runtime_objs.get("clip", None) + train_smiles = runtime_objs.get("train_smiles", []) + num_candidate = runtime_objs.get("num_candidate", 1) + dataset_infos = runtime_objs.get("dataset_infos", None) + if self.sample_core is None and dataset_infos is not None: + self.sample_core = SamplingMolecularMetrics( + dataset_infos=dataset_infos, + train_smiles=train_smiles, + clip=clip, + num_candidate=num_candidate, + ) + + def reset(self): + if hasattr(self.train_core, "reset"): + self.train_core.reset() + self.eval_acc.reset() + self._right, self._total = 0, 0 + if self.sample_core is not None: + self.sample_core.reset() + + # ---- streaming entrypoints ---- + def update_step(self, *, result: Dict[str, Any], batch: Any, stage: str): + if stage == "train": + self._update_train(result, batch) + elif stage == "eval": + self._update_eval(result, batch) + elif stage == "sample": + self._update_sample(result, batch) + + def compute_epoch(self, *, stage: str) -> Dict[str, float]: + if stage == "train": + return self._finalize_train() + if stage == "eval": + return self.eval_acc.finalize() + if stage == "sample": + return self._finalize_sample() + return {} + + # ---- train path ---- + def _update_train(self, result: Dict[str, Any], batch: Any): + pred = result.get("pred_dict") or {} + lab = result.get("label_dict") or {} + # Require exactly four tensors; skip silently if anything missing + masked_pred_X = pred.get("masked_pred_X", None) + masked_pred_E = pred.get("masked_pred_E", None) + true_X = lab.get("true_X", None) + true_E = lab.get("true_E", None) + if any(v is None for v in (masked_pred_X, masked_pred_E, true_X, true_E)): + return + self.train_core( + pred={"masked_pred_X": masked_pred_X, "masked_pred_E": masked_pred_E}, + label={"true_X": true_X, "true_E": true_E}, + log=False, + ) + + def _finalize_train(self) -> Dict[str, float]: + out: Dict[str, float] = {} + impl = getattr(self.train_core, "impl", None) + if impl is not None and hasattr(impl, "log_epoch_metrics"): + res = impl.log_epoch_metrics() or {} + # Already returns flat dict of scalar metrics; cast to float + for k, v in res.items(): + out[str(k)] = float(v) + # reset train core for next epoch + if hasattr(self.train_core, "reset"): + self.train_core.reset() + return out + + def _finalize_sample(self) -> Dict[str, float]: + if self._total == 0: + return {} + # out = { + # "Accuracy": self._right / float(self._total), + # "basic_metrics/n_mae": float(self.sample_core.mae_n.accumulate()), + # "basic_metrics/node_mae": float(self.sample_core.mae_nodes.accumulate()), + # "basic_metrics/edge_mae": float(self.sample_core.mae_edges.accumulate()), + # "basic_metrics/valency_mae": float(self.sample_core.mae_val.accumulate()), + # } + return self.sample_metric_dict + + # ---- eval path ---- + def _update_eval(self, result: Dict[str, Any], batch: Any): + assert ( + self.model is not None + ), "Adapter missing model. Call adapter.bind(model=...) first." + pred = result.get("pred_dict") or {} + lab = result.get("label_dict") or {} + node_mask = _coalesce( + result.get("node_mask", None), + batch.get("node_mask", None) if isinstance(batch, dict) else None, + ) + + # Need all six tensors + pred_X = pred.get("masked_pred_X", None) + pred_E = pred.get("masked_pred_E", None) + pred_y = pred.get("pred_y", None) + true_X = lab.get("true_X", None) + true_E = lab.get("true_E", None) + true_y = lab.get("true_y", None) + if any( + v is None + for v in (pred_X, pred_E, pred_y, true_X, true_E, true_y, node_mask) + ): + return + + # Prefer cache; else recompute noise + noisy = result.get("noisy_data", None) + if noisy is None: + flag = bool(getattr(self.model, "flag_use_formula", False)) + noisy = scheduling_diffnmr.apply_noise( + self.model, true_X, true_E, true_y, node_mask, flag + ) + + # Pack predictions to match compute_val_loss signature + Pred = type("Pred", (), {}) + pred_obj = Pred() + pred_obj.X, pred_obj.E, pred_obj.y = pred_X, pred_E, pred_y + + # Try to get detailed terms if supported; fallback to scalar + batch_spectrum = batch["spectrum"] + condition_H1nmr = paddle.to_tensor(batch_spectrum["H_nmr"]) + condition_C13nmr = paddle.to_tensor(batch_spectrum["C_nmr"]) + num_H_peak = paddle.to_tensor(batch_spectrum["num_H_peak"]) + num_C_peak = paddle.to_tensor(batch_spectrum["num_C_peak"]) + condition_Spectrum = [condition_H1nmr, num_H_peak, condition_C13nmr, num_C_peak] + try: + terms = scheduling_diffnmr.compute_val_loss( + self.model, + pred_obj, + noisy, + true_X, + true_E, + true_y, + node_mask, + condition=condition_Spectrum, + return_terms=True, # or True in test mode + ) + except TypeError: + # Older signature without 'test' or different arg order + terms = scheduling_diffnmr.compute_val_loss( + self.model, pred_obj, noisy, true_X, true_E, true_y, node_mask, [] + ) + + B = int(true_X.shape[0]) + # Accept: dict with pieces OR scalar tensor/float + if isinstance(terms, dict): + # Optional scale by T (if you want NLL per trajectory step) + for k in ("nll", "X_kl", "E_kl", "X_logp", "E_logp"): + if k in terms and terms[k] is not None: + self.eval_acc.add( + key=_name_map(k), + value=terms[k], + batch_size=B, + scale=self.t_scale, + ) + else: + self.eval_acc.add( + key="val_nll", value=terms, batch_size=B, scale=self.t_scale + ) + + def _update_sample(self, result: Dict[str, Any], batch: Any): + if self.sample_core is None: + return + self.sample_metric_dict = self.sample_core( + samples=result["samples"], + current_epoch=result.get("epoch_id", 0), + local_rank=result.get("local_rank", 0), + output_dir=result.get("output_dir", "."), + flag_test=False, + ) + self._right += int(self.sample_metric_dict.get("Right Number", 0)) + self._total += int(self.sample_metric_dict.get("Total Number", 0)) + + +# ------------------------- +# small helpers / accumulator +# ------------------------- + + +def _name_map(k: str) -> str: + return { + "nll": "val_nll", + "X_kl": "val_X_kl", + "E_kl": "val_E_kl", + "X_logp": "val_X_logp", + "E_logp": "val_E_logp", + }.get(k, k) + + +class EvalAccumulator: + """ + Pre-key accumulator: + - supports scalar (mean) or vector ([B]) tensors/number + - keeps {key: sum} and {key: denom} separately + - optional scale (e.g., multiply by T) + - optional custom denom (override batch size for that key) + """ + + def __init__(self): + self.reset() + + def reset(self): + self._sum: Dict[str, float] = {} + self._den: Dict[str, int] = {} + + @staticmethod + def _to_float(x) -> float: + if isinstance(x, paddle.Tensor): + return ( + float(x.numpy().item()) + if x.numel() == 1 + else float(paddle.sum(x).numpy().item()) + ) + return float(x) + + def add( + self, + *, + key: str, + value, + batch_size: Optional[int] = None, + scale: float = 1.0, + denom: Optional[float] = None, + ): + """ + value: + - tensor [B] → treat as sum(vector) + - tensor scalar / python number → treat as mean and multiply by denom (or + batch_size) + denom: + - if provided, use it as denominator for this (key, step) + - else: if value is vector → len(vector) + if value is scalar → batch_size (fallback 1) + """ + if value is None: + return + + if isinstance(value, paddle.Tensor) and value.numel() > 1: + # vector → sum directly; denom = length + v_sum = float(paddle.sum(value).numpy().item()) * float(scale) + d = float(value.shape[0]) if denom is None else float(denom) + else: + # scalar → assume it's mean; multiply by denom/batch_size + mean_val = self._to_float(value) * float(scale) + if denom is None: + d = float(batch_size if batch_size is not None else 1.0) + else: + d = float(denom) + v_sum = mean_val * d + + self._sum[key] = self._sum.get(key, 0.0) + v_sum + self._den[key] = self._den.get(key, 0.0) + d + + def finalize(self) -> Dict[str, float]: + out = {} + for k, s in self._sum.items(): + d = max(self._den.get(k, 0.0), 1.0) + out[k] = s / d + return out + + +def _coalesce(*vals): + """Return first value that is not None (NO truthiness on tensors).""" + for v in vals: + if v is not None: + return v + return None diff --git a/ppmat/metrics/sfin_metric.py b/ppmat/metrics/sfin_metric.py new file mode 100644 index 00000000..821f7c79 --- /dev/null +++ b/ppmat/metrics/sfin_metric.py @@ -0,0 +1,253 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Dict +from typing import Optional +from typing import Sequence +from typing import Set + +import paddle + +from ppmat.metrics.streaming_base import StreamingMetricBase +from ppmat.metrics.streaming_base import _all_reduce_sum_ + + +def calc_psnr( + pred: paddle.Tensor, + label: paddle.Tensor, + data_range: float = 255.0, + eps: float = 1e-12, +) -> paddle.Tensor: + """Compute batch PSNR for image tensors with shape [N, C, H, W].""" + pred = pred.astype("float64") + label = label.astype("float64") + diff = (pred - label) / data_range + mse = paddle.mean(diff * diff) + mse = paddle.maximum(mse, paddle.to_tensor(eps, dtype=mse.dtype)) + return -10.0 * paddle.log10(mse) + + +def _gaussian_window_2d( + channels: int, + win_size: int = 11, + win_sigma: float = 1.5, + dtype: str = "float32", +) -> paddle.Tensor: + coords = paddle.arange(win_size, dtype=dtype) - (win_size // 2) + gauss = paddle.exp(-(coords**2) / (2.0 * (win_sigma**2))) + gauss = gauss / paddle.sum(gauss) + window_2d = gauss.unsqueeze(1) * gauss.unsqueeze(0) + window = window_2d.reshape([1, 1, win_size, win_size]) + return paddle.tile(window, [channels, 1, 1, 1]) + + +def calc_ssim( + pred: paddle.Tensor, + label: paddle.Tensor, + data_range: float = 255.0, + win_size: int = 11, + win_sigma: float = 1.5, + k1: float = 0.01, + k2: float = 0.03, + nonnegative_ssim: bool = False, +) -> paddle.Tensor: + """Compute batch SSIM for image tensors with shape [N, C, H, W].""" + if pred.shape != label.shape: + raise ValueError( + f"Input images should have the same dimensions, got {pred.shape} and {label.shape}." + ) + if len(pred.shape) != 4: + raise ValueError( + f"Input images should be 4-d tensors [N, C, H, W], got shape {pred.shape}." + ) + if win_size % 2 != 1: + raise ValueError("win_size must be odd.") + + pred = pred.astype("float32") + label = label.astype("float32") + + channels = pred.shape[1] + window = _gaussian_window_2d( + channels=channels, + win_size=win_size, + win_sigma=win_sigma, + dtype=pred.dtype, + ) + + mu1 = paddle.nn.functional.conv2d(pred, window, stride=1, padding=0, groups=channels) + mu2 = paddle.nn.functional.conv2d(label, window, stride=1, padding=0, groups=channels) + + mu1_sq = mu1 * mu1 + mu2_sq = mu2 * mu2 + mu1_mu2 = mu1 * mu2 + + sigma1_sq = paddle.nn.functional.conv2d( + pred * pred, window, stride=1, padding=0, groups=channels + ) - mu1_sq + sigma2_sq = paddle.nn.functional.conv2d( + label * label, window, stride=1, padding=0, groups=channels + ) - mu2_sq + sigma12 = paddle.nn.functional.conv2d( + pred * label, window, stride=1, padding=0, groups=channels + ) - mu1_mu2 + + c1 = (k1 * data_range) ** 2 + c2 = (k2 * data_range) ** 2 + c1 = paddle.to_tensor(c1, dtype=pred.dtype) + c2 = paddle.to_tensor(c2, dtype=pred.dtype) + + cs_map = (2.0 * sigma12 + c2) / (sigma1_sq + sigma2_sq + c2) + ssim_map = ((2.0 * mu1_mu2 + c1) / (mu1_sq + mu2_sq + c1)) * cs_map + + if nonnegative_ssim: + ssim_map = paddle.nn.functional.relu(ssim_map) + + return paddle.mean(ssim_map) + + +class PSNRMetric: + def __init__(self, data_range: float = 255.0, eps: float = 1e-12): + self.data_range = data_range + self.eps = eps + + def __call__(self, pred: paddle.Tensor, label: paddle.Tensor): + return calc_psnr( + pred=pred, + label=label, + data_range=self.data_range, + eps=self.eps, + ) + + +class SSIMMetric: + def __init__( + self, + data_range: float = 255.0, + win_size: int = 11, + win_sigma: float = 1.5, + k1: float = 0.01, + k2: float = 0.03, + nonnegative_ssim: bool = False, + ): + self.data_range = data_range + self.win_size = win_size + self.win_sigma = win_sigma + self.k1 = k1 + self.k2 = k2 + self.nonnegative_ssim = nonnegative_ssim + + def __call__(self, pred: paddle.Tensor, label: paddle.Tensor): + return calc_ssim( + pred=pred, + label=label, + data_range=self.data_range, + win_size=self.win_size, + win_sigma=self.win_sigma, + k1=self.k1, + k2=self.k2, + nonnegative_ssim=self.nonnegative_ssim, + ) + + +class SFINStreamingAdapter(StreamingMetricBase): + """Streaming PSNR/SSIM adapter for SFIN image restoration.""" + + def __init__( + self, + target_name: str, + pred_name: Optional[str] = None, + psnr_name: str = "psnr", + ssim_name: str = "ssim", + data_range: float = 255.0, + eps: float = 1e-12, + win_size: int = 11, + win_sigma: float = 1.5, + k1: float = 0.01, + k2: float = 0.03, + nonnegative_ssim: bool = False, + stages: Optional[Sequence[str]] = None, + ): + self.target_name = target_name + self.pred_name = pred_name or target_name + self.psnr_name = psnr_name + self.ssim_name = ssim_name + self.data_range = data_range + self.eps = eps + self.win_size = win_size + self.win_sigma = win_sigma + self.k1 = k1 + self.k2 = k2 + self.nonnegative_ssim = nonnegative_ssim + self.stages: Set[str] = set(stages or ("train", "eval")) + self.reset() + + def reset(self): + self._sse = 0.0 + self._numel = 0.0 + self._ssim_sum = 0.0 + self._ssim_count = 0.0 + + def update_step(self, *, result: Dict, batch: Dict, stage: str): + if stage not in self.stages: + return + pred_dict = result.get("pred_dict", {}) + if self.pred_name not in pred_dict or self.target_name not in batch: + return + + with paddle.no_grad(): + pred = pred_dict[self.pred_name] + label = batch[self.target_name] + + pred64 = pred.astype("float64") + label64 = label.astype("float64") + diff = pred64 - label64 + self._sse += float(paddle.sum(diff * diff).numpy().item()) + self._numel += float(pred.numel()) + + ssim = calc_ssim( + pred=pred, + label=label, + data_range=self.data_range, + win_size=self.win_size, + win_sigma=self.win_sigma, + k1=self.k1, + k2=self.k2, + nonnegative_ssim=self.nonnegative_ssim, + ) + batch_size = float(pred.shape[0]) + self._ssim_sum += float(ssim.numpy().item()) * batch_size + self._ssim_count += batch_size + + def compute_epoch(self, *, stage: str) -> Dict[str, float]: + if stage not in self.stages or self._numel <= 0: + return {} + + values = paddle.to_tensor( + [self._sse, self._numel, self._ssim_sum, self._ssim_count], + dtype="float64", + ) + values = _all_reduce_sum_(values) + sse, numel, ssim_sum, ssim_count = [float(v) for v in values.numpy()] + + mse = max(sse / max(numel, 1.0), self.eps) + psnr = 10.0 * paddle.log10( + paddle.to_tensor((self.data_range**2) / mse, dtype="float64") + ) + ssim = ssim_sum / max(ssim_count, 1.0) + return { + self.psnr_name: float(psnr.numpy().item()), + self.ssim_name: float(ssim), + } diff --git a/ppmat/metrics/streaming_base.py b/ppmat/metrics/streaming_base.py new file mode 100644 index 00000000..4e51047c --- /dev/null +++ b/ppmat/metrics/streaming_base.py @@ -0,0 +1,62 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any +from typing import Dict + +import paddle + + +def _all_reduce_sum_(t: paddle.Tensor) -> paddle.Tensor: + try: + import paddle.distributed as dist + + if dist.is_initialized() and dist.get_world_size() > 1: + dist.all_reduce(t, op=dist.ReduceOp.SUM) + except Exception: + pass + return t + + +class StreamingMetricBase: + """ + Generic streaming-metric interface: supports multi-input / multi-output / + cross-step accumulation, and optional per-stage execution (train/eval/sample). + Any new model metric can be reused by the Trainer as long as it implements + these methods. + """ + + # Optional: late-binding runtime objects (dataset infos, encoders, etc.) + def bind(self, **runtime_objs): + """Inject runtime dependencies (dataset_infos / train_smiles / clip / ...).""" + return + + # Required: called once per step to accumulate internal state + def update_step(self, *, result: Dict[str, Any], batch: Any, stage: str): + """ + Args: + result: model forward output (should contain some of pred_dict / loss_dict / + label_dict) + batch: the original batch object of this step (usually a dict) + stage: "train" | "eval" | "sample" + """ + raise NotImplementedError + + # Required: compute final scalars at the end of an epoch, return {name: float} + def compute_epoch(self, *, stage: str) -> Dict[str, float]: + raise NotImplementedError + + # Required: clear internal accumulators (typically called at epoch end) + def reset(self): + raise NotImplementedError diff --git a/ppmat/metrics/utils.py b/ppmat/metrics/utils.py new file mode 100644 index 00000000..deff7dc5 --- /dev/null +++ b/ppmat/metrics/utils.py @@ -0,0 +1,205 @@ +import itertools +import warnings +from collections import Counter + +import numpy as np +import paddle +import smact +from matminer.featurizers.composition.composite import ElementProperty +from matminer.featurizers.site.fingerprint import CrystalNNFingerprint +from pymatgen.core import Element +from pymatgen.core.composition import Composition +from pymatgen.core.lattice import Lattice +from pymatgen.core.structure import Structure +from scipy.linalg import polar +from smact.screening import pauling_test + +from ppmat.utils.crystal import lattices_to_params_shape_numpy + +# Ignore warnings +warnings.filterwarnings("ignore", category=UserWarning) + + +# Warning: the smact package version is 2.5.5, +# different version may cause slight differences in accuracy. + + +CrystalNNFP = CrystalNNFingerprint.from_preset("ops") +CompFP = ElementProperty.from_preset("magpie") + + +def smact_validity(comp, count, use_pauling_test=True, include_alloys=True): + elem_symbols = tuple([Element.from_Z(elem).symbol for elem in comp]) + space = smact.element_dictionary(elem_symbols) + smact_elems = [e[1] for e in space.items()] + electronegs = [e.pauling_eneg for e in smact_elems] + ox_combos = [e.oxidation_states for e in smact_elems] + if len(set(elem_symbols)) == 1: + return True + if include_alloys: + is_metal_list = [(elem_s in smact.metals) for elem_s in elem_symbols] + if all(is_metal_list): + return True + threshold = np.max(count) + oxn = 1 + for oxc in ox_combos: + oxn *= len(oxc) + if oxn > 10000000.0: + return False + for ox_states in itertools.product(*ox_combos): + stoichs = [(c,) for c in count] + cn_e, cn_r = smact.neutral_ratios( + ox_states, stoichs=stoichs, threshold=threshold + ) + if cn_e: + if use_pauling_test: + try: + electroneg_OK = pauling_test(ox_states, electronegs) + except TypeError: + electroneg_OK = True + else: + electroneg_OK = True + if electroneg_OK: + return True + return False + + +def structure_validity(crystal, cutoff=0.5): + dist_mat = crystal.distance_matrix + dist_mat = dist_mat + np.diag(np.ones(tuple(dist_mat.shape)[0]) * (cutoff + 10.0)) + if dist_mat.min() < cutoff or crystal.volume < 0.1: + return False + else: + return True + + +class Crystal(object): + def __init__(self, crys_array_dict): + if isinstance(crys_array_dict["frac_coords"], paddle.Tensor): + self.frac_coords = crys_array_dict["frac_coords"].cpu().numpy() + else: + self.frac_coords = np.array(crys_array_dict["frac_coords"]) + if isinstance(crys_array_dict["atom_types"], paddle.Tensor): + self.atom_types = crys_array_dict["atom_types"].cpu().numpy() + else: + self.atom_types = np.array(crys_array_dict["atom_types"]) + + if "lengths" in crys_array_dict and "angles" in crys_array_dict: + if isinstance(crys_array_dict["lengths"], paddle.Tensor): + self.lengths = crys_array_dict["lengths"].cpu().numpy() + else: + self.lengths = np.array(crys_array_dict["lengths"]) + if isinstance(crys_array_dict["angles"], paddle.Tensor): + self.angles = crys_array_dict["angles"].cpu().numpy() + else: + self.angles = np.array(crys_array_dict["angles"]) + else: + if isinstance(crys_array_dict["lattice"], paddle.Tensor): + lattice = crys_array_dict["lattice"].cpu().numpy() + else: + lattice = np.array([crys_array_dict["lattice"]]) + self.lengths, self.angles = lattices_to_params_shape_numpy(lattice) + self.lengths, self.angles = self.lengths[0], self.angles[0] + self.dict = { + "frac_coords": self.frac_coords, + "atom_types": self.atom_types, + "lengths": self.lengths, + "angles": self.angles, + } + if len(tuple(self.atom_types.shape)) > 1: + self.dict["atom_types"] = np.argmax(self.atom_types, axis=-1) + 1 + self.atom_types = np.argmax(self.atom_types, axis=-1) + 1 + self.get_structure() + self.get_composition() + self.get_validity() + self.get_fingerprints() + + def get_structure(self): + if min(self.lengths.tolist()) < 0: + self.constructed = False + self.invalid_reason = "non_positive_lattice" + if ( + np.isnan(self.lengths).any() + or np.isnan(self.angles).any() + or np.isnan(self.frac_coords).any() + ): + self.constructed = False + self.invalid_reason = "nan_value" + else: + try: + self.structure = Structure( + lattice=Lattice.from_parameters( + *(self.lengths.tolist() + self.angles.tolist()) + ), + species=self.atom_types, + coords=self.frac_coords, + coords_are_cartesian=False, + ) + self.constructed = True + if self.structure.volume < 0.1: + self.constructed = False + self.invalid_reason = "unrealistically_small_lattice" + except Exception: + self.constructed = False + self.invalid_reason = "construction_raises_exception" + + def get_composition(self): + elem_counter = Counter(self.atom_types) + composition = [ + (elem, elem_counter[elem]) for elem in sorted(elem_counter.keys()) + ] + elems, counts = list(zip(*composition)) + counts = np.array(counts) + counts = counts / np.gcd.reduce(counts) + self.elems = elems + self.comps = tuple(counts.astype("int").tolist()) + + def get_validity(self): + self.comp_valid = smact_validity(self.elems, self.comps) + if self.constructed: + self.struct_valid = structure_validity(self.structure) + else: + self.struct_valid = False + self.valid = self.comp_valid and self.struct_valid + + def get_fingerprints(self): + elem_counter = Counter(self.atom_types) + comp = Composition(elem_counter) + self.comp_fp = CompFP.featurize(comp) + try: + site_fps = [ + CrystalNNFP.featurize(self.structure, i) + for i in range(len(self.structure)) + ] + except Exception: + self.valid = False + self.comp_fp = None + self.struct_fp = None + return + self.struct_fp = np.array(site_fps).mean(axis=0) + + +def get_crys_from_cif(cif, polar_decompose=False): + structure = Structure.from_str(cif, fmt="cif") + lattice = structure.lattice + + atom_types = np.array([site.specie.Z for site in structure]) + + if polar_decompose: + lattice_m = lattice.matrix + _, lattice_m = polar(lattice.matrix) + lengths, angles = lattices_to_params_shape_numpy(lattice_m) + crys_array_dict = { + "frac_coords": structure.frac_coords, + "atom_types": atom_types, + "lengths": lengths, + "angles": angles, + } + else: + crys_array_dict = { + "frac_coords": structure.frac_coords, + "atom_types": atom_types, + "lengths": np.array(lattice.abc), + "angles": np.array(lattice.angles), + } + return Crystal(crys_array_dict) diff --git a/ppmat/models/__init__.py b/ppmat/models/__init__.py new file mode 100644 index 00000000..601c2772 --- /dev/null +++ b/ppmat/models/__init__.py @@ -0,0 +1,242 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import inspect +import os +import os.path as osp +from typing import Any +from typing import Dict +from typing import Optional + +from omegaconf import OmegaConf + +from ppmat.models.chgnet.chgnet import CHGNet +from ppmat.models.chgnet.chgnet_graph_converter import CHGNetGraphConverter +from ppmat.models.comformer.comformer import iComformer +from ppmat.models.comformer.comformer_graph_converter import ComformerGraphConverter +from ppmat.models.common.graph_converter import CrystalNN +from ppmat.models.common.graph_converter import FindPointsInSpheres +from ppmat.models.common.graph_converter import MolecularGraphConverter +from ppmat.models.diffcsp.diffcsp import DiffCSP +from ppmat.models.diffnmr.diffnmr import DiffNMR +from ppmat.models.diffnmr.diffnmr import DiffPrior +from ppmat.models.diffnmr.diffnmr import MolecularGraphFormer +from ppmat.models.diffnmr.diffnmr import NMRNetCLIP +from ppmat.models.dimenetpp.dimenetpp import DimeNetPlusPlus +from ppmat.models.mattergen.mattergen import MatterGen +from ppmat.models.mattergen.mattergen import MatterGenWithCondition +from ppmat.models.mattersim.m3gnet import M3GNet +from ppmat.models.mattersim.m3gnet_graph_converter import M3GNetGraphConvertor +from ppmat.models.megnet.megnet import MEGNetPlus +from ppmat.models.infgcn.infgcn import InfGCN +from ppmat.models.mateno.mateno import MatENO +from ppmat.models.sfin.sfin import SFIN +<<<<<<< HEAD +from ppmat.models.sgequidiff.diffusion_model import EquivariantDiffusionModel +from ppmat.models.sgequidiff.wrappers import SGEQUIDiffSampler +from ppmat.datasets.asu_mp20_dataset import AsymmetricUnitDataset +======= +>>>>>>> upstream/develop +from ppmat.utils import download +from ppmat.utils import logger +from ppmat.utils import save_load + +__all__ = [ + "iComformer", + "ComformerGraphConverter", + "DiffCSP", + "FindPointsInSpheres", + "MEGNetPlus", + "MatterGen", + "MatterGenWithCondition", + "DimeNetPlusPlus", + "CrystalNN", + "CHGNetGraphConverter", + "CHGNet", + "M3GNetGraphConvertor", + "M3GNet", + "MolecularGraphConverter", + "MolecularGraphFormer", + "NMRNetCLIP", + "DiffPrior", + "DiffNMR", + "InfGCN", + "MatENO", + "SFIN", +] + +# Warning: The key of the dictionary must be consistent with the file name of the value +MODEL_REGISTRY = { + "comformer_mp2018_train_60k_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_mp2018_train_60k_e_form.zip", + "comformer_mp2018_train_60k_band_gap": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_mp2018_train_60k_band_gap.zip", + "comformer_mp2018_train_60k_G": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_mp2018_train_60k_G.zip", + "comformer_mp2018_train_60k_K": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_mp2018_train_60k_K.zip", + "comformer_mp2024_train_130k_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_mp2024_train_130k_e_form.zip", + "comformer_jarvis_dft_2d_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_jarvis_dft_2d_e_form.zip", + "comformer_jarvis_dft_3d_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_jarvis_dft_3d_e_form.zip", + "comformer_jarvis_alex_pbe_2d_all_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/comformer/comformer_jarvis_alex_pbe_2d_all_e_form.zip", + "megnet_mp2018_train_60k_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_mp2018_train_60k_e_form.zip", + "megnet_mp2018_train_60k_band_gap": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_mp2018_train_60k_band_gap.zip", + "megnet_mp2018_train_60k_G": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_mp2018_train_60k_G.zip", + "megnet_mp2018_train_60k_K": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_mp2018_train_60k_K.zip", + "megnet_mp2024_train_130k_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_mp2024_train_130k_e_form.zip", + "megnet_jarvis_dft_2d_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_jarvis_dft_2d_e_form.zip", + "megnet_jarvis_dft_3d_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_jarvis_dft_3d_e_form.zip", + "megnet_jarvis_alex_pbe_2d_all_e_form": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/property_prediction/megnet/megnet_jarvis_alex_pbe_2d_all_e_form.zip", + "diffcsp_mp20": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/diffcsp/diffcsp_mp20.zip", + "mattergen_mp20": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20.zip", + "mattergen_mp20_chemical_system": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_chemical_system.zip", + "mattergen_mp20_dft_band_gap": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_dft_band_gap.zip", + "mattergen_mp20_dft_bulk_modulus": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_dft_bulk_modulus.zip", + "mattergen_mp20_dft_mag_density": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_dft_mag_density.zip", + "mattergen_alex_mp20": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip", + "mattergen_alex_mp20_dft_band_gap": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_dft_band_gap.zip", + "mattergen_alex_mp20_chemical_system": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_chemical_system.zip", + "mattergen_alex_mp20_dft_mag_density": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_dft_mag_density.zip", + "mattergen_alex_mp20_ml_bulk_modulus": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_ml_bulk_modulus.zip", + "mattergen_alex_mp20_space_group": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_space_group.zip", + "mattergen_alex_mp20_chemical_system_energy_above_hull": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.zip", + "mattergen_alex_mp20_dft_mag_density_hhi_score": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.zip", + "chgnet_mptrj": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/chgnet/chgnet_mptrj.zip", + "dimenetpp_mp2018_train_60k_e_form": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/property_prediction/dimenet%2B%2B/dimenetpp_mp2018_train_60k_e_form.zip", + "dimenetpp_mp2018_train_60k_band_gap": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/property_prediction/dimenet%2B%2B/dimenetpp_mp2018_train_60k_band_gap.zip", + "dimenetpp_mp2018_train_60k_G": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/property_prediction/dimenet%2B%2B/dimenetpp_mp2018_train_60k_G.zip", + "dimenetpp_mp2018_train_60k_K": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/property_prediction/dimenet%2B%2B/dimenetpp_mp2018_train_60k_K.zip", + "mattersim_1M": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/mattersim/mattersim_1M.zip", + "mattersim_5M": "https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/interatomic_potentials/mattersim/mattersim_5M.zip", + "mattergen_ml2ddb": "https://paddle-org.bj.bcebos.com/paddlematerial/workflow/ml2ddb/mattergen_ml2ddb.zip", + "mattergen_ml2ddb_chemical_system": "https://paddle-org.bj.bcebos.com/paddlematerial/workflow/ml2ddb/mattergen_ml2ddb_chemical_system.zip", + "mattergen_ml2ddb_space_group": "https://paddle-org.bj.bcebos.com/paddlematerial/workflow/ml2ddb/mattergen_ml2ddb_space_group.zip", + "sfin_haadf_enhance": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_haadf_enhance.zip", + "sfin_haadf_detect": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_haadf_detect.zip", + "sfin_bf_enhance": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_bf_enhance.zip", + "sfin_bf_detect": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_bf_detect.zip", +} + + +def build_graph_converter(cfg: Dict): + """Build graph converter. + + Args: + cfg (Dict): Graph converter config. + """ + if cfg is None: + return None + cfg = copy.deepcopy(cfg) + class_name = cfg.pop("__class_name__") + init_params = cfg.pop("__init_params__") + graph_converter = eval(class_name)(**init_params) + logger.debug(str(graph_converter)) + + return graph_converter + + +def build_model( + cfg: Dict[str, Any], + strict_unused: bool = False, # True → raise if some runtime deps are not consumed + override: bool = True, # True → runtime_deps override same-named __init_params__ + **runtime_deps, +): + """Build Model. + + Args: + cfg (Dict): Model config. + { + "__class_name__": "pkg.module.MyModel", + "__init_params__": { "encoder_cfg": {...}, "decoder_cfg": {...}, ... } + # Only serializable hyperparameters + } + strict_unused : bool, optional (default: False) + If True, raise a TypeError when any key in `runtime_deps` is not consumed + by the model constructor (i.e., the constructor does not accept that name). + override : bool, optional (default: True) + Conflict policy when a key exists in both `__init_params__` and + `runtime_deps`. If True, the value from `runtime_deps` wins; otherwise the + config value is kept and the runtime value is ignored. + runtime_deps: Runtime objects, such as dataset_infos=... + + Returns: + nn.Layer: Model object. + """ + if cfg is None: + return None + cfg = copy.deepcopy(cfg) + class_name = cfg.pop("__class_name__") + init_params = cfg.pop("__init_params__") + + cls = eval(class_name) + + sig = inspect.signature(cls.__init__) + accepts_kwargs = any(p.kind == p.VAR_KEYWORD for p in sig.parameters.values()) + + params = dict(init_params) + consumed = set() + + if accepts_kwargs: + if override: + params.update(runtime_deps) + else: + for k, v in runtime_deps.items(): + if k in sig.parameters: + if override or (k not in params): + params[k] = v + consumed.add(k) + + if strict_unused: + unused = set(runtime_deps.keys()) - consumed + if unused: + raise TypeError( + f"Unused runtime deps for {class_name}: {sorted(unused)} " + f"(constructor params: {list(sig.parameters.keys())})" + ) + + model = cls(**params) + logger.debug(str(model)) + + return model + + +def build_model_from_name(model_name: str, weights_name: Optional[str] = None): + path = download.get_weights_path_from_url(MODEL_REGISTRY[model_name]) + path = osp.join(path, model_name) + logger.info(f"Save model and configuration files in path: {path}") + config_path = osp.join(path, f"{model_name}.yaml") + if not osp.exists(config_path): + logger.warning( + f"Config file not found: {config_path}, try find other yaml files." + ) + file_list = os.listdir(path) + find_list = [] + for file in file_list: + if file.endswith(".yaml") or file.endswith(".yml"): + find_list.append(osp.join(path, file)) + if len(find_list) == 1: + config_path = find_list[0] + else: + raise ValueError( + f"Multiple yaml files found: {find_list}, must be only one" + ) + logger.warning(f"Find config file: {config_path}, using this file.") + + config = OmegaConf.load(config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + model = build_model(model_config) + + save_load.load_pretrain(model, path, weights_name) + + return model, config diff --git a/ppmat/models/chgnet/chgnet.py b/ppmat/models/chgnet/chgnet.py new file mode 100644 index 00000000..52c39628 --- /dev/null +++ b/ppmat/models/chgnet/chgnet.py @@ -0,0 +1,1763 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# This code is adapted from https://github.com/CederGroupHub/chgnet + + +from __future__ import annotations + +import collections +import itertools +from collections.abc import Sequence +from typing import TYPE_CHECKING + +import numpy as np +import paddle +from pymatgen.core import Structure + +from ppmat.models.chgnet.prefitted_weights import MPF_prefitted_data +from ppmat.models.chgnet.prefitted_weights import MPTrj_prefitted_data +from ppmat.utils import logger +from ppmat.utils.crystal import frac_to_cart_coords + +if TYPE_CHECKING: + from pathlib import Path + + +def aggregate( + data: paddle.Tensor, owners: paddle.Tensor, average=True, num_owner=None +) -> paddle.Tensor: + """Aggregate rows in data by specifying the owners. + + Args: + data (Tensor): data tensor to aggregate [n_row, feature_dim] + owners (Tensor): specify the owner of each row [n_row, 1] + average (bool): if True, average the rows, if False, sum the rows. + Default = True + num_owner (int, optional): the number of owners, this is needed if the + max idx of owner is not presented in owners tensor + Default = None + + Returns: + output (Tensor): [num_owner, feature_dim] + """ + bin_count = paddle.bincount(x=owners.cast("int32")) + bin_count = paddle.where( + bin_count != 0, bin_count, paddle.ones([1], dtype=bin_count.dtype) + ) + if num_owner is not None and tuple(bin_count.shape)[0] != num_owner: + difference = num_owner - tuple(bin_count.shape)[0] + bin_count = paddle.concat( + x=[bin_count, paddle.ones(shape=difference, dtype=bin_count.dtype)] + ) + + output0 = paddle.zeros( + shape=[tuple(bin_count.shape)[0], tuple(data.shape)[1]], dtype=data.dtype + ) + output0.stop_gradient = False + output = output0.index_add(axis=0, index=owners.cast("int32"), value=data) + + # this is a atternative to the above code, + # from ppmat.utils.scatter import scatter + # start = time.time() + # output = scatter(data, owners.cast("int32"), dim=0) + # if bin_count.shape[0] > output.shape[0]: + # diff = paddle.zeros( + # shape=[bin_count.shape[0] - output.shape[0], output.shape[1]] + # ) + # diff.stop_gradient = False + # output = paddle.concat( + # x=[output, diff], + # ) + + if average: + output = (output.T / bin_count).T + return output + + +class MLP(paddle.nn.Layer): + """Multi-Layer Perceptron used for non-linear regression.""" + + def __init__( + self, + input_dim: int, + output_dim: int = 1, + hidden_dim: int | Sequence[int] | None = (64, 64), + dropout: float = 0, + bias: bool = True, + ) -> None: + """Initialize the MLP. + + Args: + input_dim (int): the input dimension + output_dim (int): the output dimension + hidden_dim (list[int] | int]): a list of integers or a single integer + representing the number of hidden units in each layer of the MLP. + Default = [64, 64] + dropout (float): the dropout rate before each linear layer. Default: 0 + bias (bool): whether to use bias in each Linear layers. + Default = True + """ + super().__init__() + if hidden_dim is None or hidden_dim == 0: + layers = [ + paddle.nn.Dropout(p=dropout), + paddle.nn.Linear( + in_features=input_dim, out_features=output_dim, bias_attr=bias + ), + ] + elif isinstance(hidden_dim, int): + layers = [ + paddle.nn.Linear( + in_features=input_dim, out_features=hidden_dim, bias_attr=bias + ), + paddle.nn.Silu(), + paddle.nn.Dropout(p=dropout), + paddle.nn.Linear( + in_features=hidden_dim, out_features=output_dim, bias_attr=bias + ), + ] + elif isinstance(hidden_dim, Sequence): + layers = [ + paddle.nn.Linear( + in_features=input_dim, out_features=hidden_dim[0], bias_attr=bias + ), + paddle.nn.Silu(), + ] + if len(hidden_dim) != 1: + for h_in, h_out in itertools.pairwise(hidden_dim): + layers.append( + paddle.nn.Linear( + in_features=h_in, out_features=h_out, bias_attr=bias + ) + ) + layers.append(paddle.nn.Silu()) + layers.append(paddle.nn.Dropout(p=dropout)) + layers.append( + paddle.nn.Linear( + in_features=hidden_dim[-1], out_features=output_dim, bias_attr=bias + ) + ) + else: + raise TypeError( + f"hidden_dim={hidden_dim!r} must be an integer, a list of integers, " + "or None." + ) + self.layers = paddle.nn.Sequential(*layers) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """Performs a forward pass through the MLP. + + Args: + x (Tensor): a tensor of shape (batch_size, input_dim) + + Returns: + Tensor: a tensor of shape (batch_size, output_dim) + """ + return self.layers(x) + + +class GatedMLP(paddle.nn.Layer): + """Gated MLP, similar model structure is used in CGCNN and M3GNet.""" + + def __init__( + self, + input_dim: int, + output_dim: int, + hidden_dim: int | list[int] | None = None, + dropout: float = 0, + bias: bool = True, + ) -> None: + """Initialize a gated MLP. + + Args: + input_dim (int): the input dimension + output_dim (int): the output dimension + hidden_dim (list[int] | int]): a list of integers or a single integer + representing the number of hidden units in each layer of the MLP. + Default = None + dropout (float): the dropout rate before each linear layer. + Default: 0 + bias (bool): whether to use bias in each Linear layers. + Default = True + """ + super().__init__() + self.mlp_core = MLP( + input_dim=input_dim, + output_dim=output_dim, + hidden_dim=hidden_dim, + dropout=dropout, + bias=bias, + ) + self.mlp_gate = MLP( + input_dim=input_dim, + output_dim=output_dim, + hidden_dim=hidden_dim, + dropout=dropout, + bias=bias, + ) + self.activation = paddle.nn.Silu() + self.sigmoid = paddle.nn.Sigmoid() + + self.bn1 = paddle.nn.LayerNorm(output_dim) + self.bn2 = paddle.nn.LayerNorm(output_dim) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """Performs a forward pass through the MLP. + + Args: + x (Tensor): a tensor of shape (batch_size, input_dim) + + Returns: + Tensor: a tensor of shape (batch_size, output_dim) + """ + core = self.activation(self.bn1(self.mlp_core(x))) + gate = self.sigmoid(self.bn2(self.mlp_gate(x))) + return core * gate + + +class AtomRef(paddle.nn.Layer): + """A linear regression for elemental energy. + From: https://github.com/materialsvirtuallab/m3gnet/. + """ + + def __init__(self, is_intensive: bool = True, max_num_elements: int = 94) -> None: + """Initialize an AtomRef model.""" + super().__init__() + self.is_intensive = is_intensive + self.max_num_elements = max_num_elements + self.fc = paddle.nn.Linear( + in_features=max_num_elements, out_features=1, bias_attr=False + ) + self.fitted = False + + def forward(self, graphs) -> paddle.Tensor: + """Get the energy of a list of graphs. + + Args: + graphs: a list of Crystal Graph to compute + + Returns: + energy (tensor) + """ + if not self.fitted: + raise ValueError("composition model needs to be fitted first!") + composition_feas = graphs.node_feat["composition_fea"] + return self._get_energy(composition_feas) + + def _get_energy(self, composition_feas: paddle.Tensor) -> paddle.Tensor: + """Predict the energy given composition encoding. + + Args: + composition_feas: batched atom feature matrix of shape + [batch_size, total_num_elements]. + + Returns: + prediction associated with each composition [batchsize]. + """ + return self.fc(composition_feas) # .flatten() + + def fit( + self, + structures_or_graphs, + energies: Sequence[float], + ) -> None: + """Fit the model to a list of crystals and energies. + + Args: + structures_or_graphs: Any iterable of pymatgen structures and/or graphs. + energies (list[float]): Target energies. + """ + num_data = len(energies) + composition_feas = paddle.zeros(shape=[num_data, self.max_num_elements]) + e = paddle.zeros(shape=[num_data]) + for index, (structure, energy) in enumerate( + zip(structures_or_graphs, energies, strict=True) + ): + if isinstance(structure, Structure): + atomic_number = paddle.to_tensor( + [site.specie.Z for site in structure], dtype="int32" + ) + else: + atomic_number = structure.node_feat["atom_types"] + composition_fea = paddle.bincount( + atomic_number - 1, minlength=self.max_num_elements + ) + if self.is_intensive: + composition_fea = composition_fea / atomic_number.shape[0] + composition_feas[index, :] = composition_fea + e[index] = energy + + # Use numpy for pinv + self.feature_matrix = composition_feas.detach().numpy() + self.energies = e.detach().numpy() + state_dict = collections.OrderedDict() + weight = ( + np.linalg.pinv(self.feature_matrix.T @ self.feature_matrix) + @ self.feature_matrix.T + @ self.energies + ) + state_dict["weight"] = paddle.to_tensor(data=weight).view(94, 1) + self.fc.set_state_dict(state_dict) + self.fitted = True + + def get_site_energies(self, graphs) -> list[paddle.Tensor]: + """Predict the site energies given a list of CrystalGraphs. + + Args: + graphs: a list of Crystal Graph to compute + + Returns: + a list of tensors corresponding to site energies of each graph [batchsize]. + """ + return [ + self.fc.state_dict()["weight"][0, graph.node_feat["atom_types"] - 1] + for graph in graphs + ] + + def initialize_from(self, dataset: str) -> None: + """Initialize pre-fitted weights from a dataset.""" + if dataset in {"MPtrj", "MPtrj_e"}: + self.initialize_from_MPtrj() + elif dataset == "MPF": + self.initialize_from_MPF() + else: + raise NotImplementedError(f"dataset={dataset!r} not supported yet") + + def initialize_from_MPtrj(self) -> None: + """Initialize pre-fitted weights from MPtrj dataset.""" + state_dict = collections.OrderedDict() + state_dict["weight"] = paddle.to_tensor(data=MPTrj_prefitted_data).view([94, 1]) + self.fc.set_state_dict(state_dict=state_dict) + self.is_intensive = True + self.fitted = True + + def initialize_from_MPF(self) -> None: + """Initialize pre-fitted weights from MPF dataset.""" + state_dict = collections.OrderedDict() + state_dict["weight"] = paddle.to_tensor(data=MPF_prefitted_data).view([94, 1]) + self.fc.set_state_dict(state_dict=state_dict) + self.is_intensive = False + self.fitted = True + + def initialize_from_numpy(self, file_name: str | Path) -> None: + """Initialize pre-fitted weights from numpy file.""" + atom_ref_np = np.load(file_name) + state_dict = collections.OrderedDict() + state_dict["weight"] = paddle.to_tensor(data=atom_ref_np).view([1, 94]) + self.fc.set_state_dict(state_dict=state_dict) + self.is_intensive = False + self.fitted = True + + +class Fourier(paddle.nn.Layer): + """Fourier Expansion for angle features.""" + + def __init__(self, order: int = 5, learnable: bool = False) -> None: + """Initialize the Fourier expansion. + + Args: + order (int): the maximum order, refer to the N in eq 1 in CHGNet paper + Default = 5 + learnable (bool): whether to set the frequencies as learnable parameters + Default = False + """ + super().__init__() + self.order = order + if learnable: + self.frequencies = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.arange(start=1, end=order + 1, dtype="float32"), + trainable=True, + ) + else: + self.register_buffer( + name="frequencies", + tensor=paddle.arange(start=1, end=order + 1, dtype="float32"), + ) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """Apply Fourier expansion to a feature Tensor.""" + # The following is the original implementation. As index does not currently + # support high-order gradients, an alternative implementation was used + # result = paddle.zeros(shape=[tuple(x.shape)[0], 1 + 2 * self.order], + # dtype=x.dtype) + result = paddle.ones(shape=[tuple(x.shape)[0], 1], dtype=x.dtype) + result = result / paddle.sqrt(x=paddle.to_tensor(data=[2.0])) + + tmp = paddle.outer(x=x, y=self.frequencies) + # The following is the original implementation. As index does not currently + # support high-order gradients, an alternative implementation was used + # result[:, 1:self.order + 1] = paddle.sin(x=tmp) + # result[:, self.order + 1:] = paddle.cos(x=tmp) + result = paddle.concat([result, paddle.sin(tmp), paddle.cos(tmp)], axis=1) + + return result / np.sqrt(np.pi) + + +class RadialBessel(paddle.nn.Layer): + """1D Bessel Basis + from: https://github.com/TUM-DAML/gemnet_pytorch/. + """ + + def __init__( + self, + num_radial: int = 9, + cutoff: float = 5, + learnable: bool = False, + smooth_cutoff: int = 5, + ) -> None: + """Initialize the SmoothRBF function. + + Args: + num_radial (int): Controls maximum frequency + Default = 9 + cutoff (float): Cutoff distance in Angstrom. + Default = 5 + learnable (bool): whether to set the frequencies learnable + Default = False + smooth_cutoff (int): smooth cutoff strength + Default = 5 + """ + super().__init__() + self.num_radial = num_radial + self.inv_cutoff = 1 / cutoff + self.norm_const = (2 * self.inv_cutoff) ** 0.5 + if learnable: + self.frequencies = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor( + data=np.pi * np.arange(1, self.num_radial + 1, dtype=np.float32), + dtype="float32", + ), + trainable=True, + ) + else: + self.register_buffer( + name="frequencies", + tensor=np.pi + * paddle.arange(start=1, end=self.num_radial + 1, dtype="float32"), + ) + if smooth_cutoff is not None: + self.smooth_cutoff = CutoffPolynomial( + cutoff=cutoff, cutoff_coeff=smooth_cutoff + ) + else: + self.smooth_cutoff = None + + def forward( + self, dist: paddle.Tensor, return_smooth_factor: bool = False + ) -> paddle.Tensor | tuple[paddle.Tensor, paddle.Tensor]: + """Apply Bessel expansion to a feature Tensor. + + Args: + dist (Tensor): tensor of distances [n, 1] + return_smooth_factor (bool): whether to return the smooth factor + Default = False + + Returns: + out (Tensor): tensor of Bessel distances [n, dim] + where the expanded dimension will be num_radial + smooth_factor (Tensor): tensor of smooth factors [n, 1] + """ + dist = dist[:, None] + d_scaled = dist * self.inv_cutoff + out = self.norm_const * paddle.sin(x=self.frequencies * d_scaled) / dist + if self.smooth_cutoff is not None: + smooth_factor = self.smooth_cutoff(dist) + out = smooth_factor * out + if return_smooth_factor: + return out, smooth_factor + return out + + +class CutoffPolynomial(paddle.nn.Layer): + """Polynomial soft-cutoff function for atom graph + ref: https://github.com/TUM-DAML/gemnet_pytorch/blob/-/gemnet/model/layers/envelope.py. + """ + + def __init__(self, cutoff: float = 5, cutoff_coeff: float = 5) -> None: + """Initialize the polynomial cutoff function. + + Args: + cutoff (float): cutoff radius (A) in atom graph construction + Default = 5 + cutoff_coeff (float): the strength of soft-Cutoff + 0 will disable the cutoff, returning 1 at every r + for positive numbers > 0, the smaller cutoff_coeff is, the faster this + function decays. Default = 5. + """ + super().__init__() + self.cutoff = cutoff + self.p = cutoff_coeff + self.a = -(self.p + 1) * (self.p + 2) / 2 + self.b = self.p * (self.p + 2) + self.c = -self.p * (self.p + 1) / 2 + + def forward(self, r: paddle.Tensor) -> paddle.Tensor: + """Polynomial cutoff function. + + Args: + r (Tensor): radius distance tensor + + Returns: + polynomial cutoff functions: decaying from 1 at r=0 to 0 at r=cutoff + """ + if self.p != 0: + r_scaled = r / self.cutoff + env_val = ( + 1 + + self.a * r_scaled**self.p + + self.b * r_scaled ** (self.p + 1) + + self.c * r_scaled ** (self.p + 2) + ) + return paddle.where( + condition=r_scaled < 1, x=env_val, y=paddle.zeros_like(x=r_scaled) + ) + return paddle.ones(shape=tuple(r.shape), dtype=r.dtype) + + +class AtomEmbedding(paddle.nn.Layer): + """Encode an atom by its atomic number using a learnable embedding layer.""" + + def __init__(self, atom_feature_dim: int, max_num_elements: int = 94) -> None: + """Initialize the Atom featurizer. + + Args: + atom_feature_dim (int): dimension of atomic embedding. + max_num_elements (int): maximum number of elements in the dataset. + Default = 94 + """ + super().__init__() + # The original implementation is using paddle.nn.Embedding + # self.embedding = paddle.nn.Embedding(num_embeddings= + # max_num_elements, embedding_dim=atom_feature_dim) + self.max_num_elements = max_num_elements + self.embedding = paddle.nn.Linear( + max_num_elements, atom_feature_dim, bias_attr=False + ) + + def forward(self, atomic_numbers: paddle.Tensor) -> paddle.Tensor: + """Convert the structure to a atom embedding tensor. + + Args: + atomic_numbers (Tensor): [n_atom, 1]. + + Returns: + atom_fea (Tensor): atom embeddings [n_atom, atom_feature_dim]. + """ + atomic_numbers = paddle.nn.functional.one_hot( + atomic_numbers, self.max_num_elements + ) + return self.embedding(atomic_numbers) + + +class BondEncoder(paddle.nn.Layer): + """Encode a chemical bond given the positions of two atoms using Gaussian + distance. + """ + + def __init__( + self, + atom_graph_cutoff: float = 5, + bond_graph_cutoff: float = 3, + num_radial: int = 9, + cutoff_coeff: int = 5, + learnable: bool = False, + ) -> None: + """Initialize the bond encoder. + + Args: + atom_graph_cutoff (float): The cutoff for constructing AtomGraph default = 5 + bond_graph_cutoff (float): The cutoff for constructing BondGraph default = 3 + num_radial (int): The number of radial component. Default = 9 + cutoff_coeff (int): Strength for graph cutoff smoothness. Default = 5 + learnable(bool): Whether the frequency in rbf expansion is learnable. + Default = False + """ + super().__init__() + self.rbf_expansion_ag = RadialBessel( + num_radial=num_radial, + cutoff=atom_graph_cutoff, + smooth_cutoff=cutoff_coeff, + learnable=learnable, + ) + self.rbf_expansion_bg = RadialBessel( + num_radial=num_radial, + cutoff=bond_graph_cutoff, + smooth_cutoff=cutoff_coeff, + learnable=learnable, + ) + + def forward( + self, + center: paddle.Tensor, + neighbor: paddle.Tensor, + undirected2directed: paddle.Tensor, + image: paddle.Tensor, + lattice: paddle.Tensor, + ) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """Compute the pairwise distance between 2 3d coordinates. + + Args: + center (Tensor): 3d cartesian coordinates of center atoms [n_bond, 3] + neighbor (Tensor): 3d cartesian coordinates of neighbor atoms [n_bond, 3] + undirected2directed (Tensor): mapping from undirected bond to one of its + directed bond [n_bond] + image (Tensor): the periodic image specifying the location of neighboring + atom [n_bond, 3] + lattice (Tensor): the lattice of this structure [3, 3] + + Returns: + bond_basis_ag (Tensor): the bond basis in AtomGraph [n_bond, num_radial] + bond_basis_ag (Tensor): the bond basis in BondGraph [n_bond, num_radial] + bond_vectors (Tensor): normalized bond vectors, for tracking the bond + directions [n_bond, 3] + """ + neighbor = neighbor + image @ lattice + bond_vectors = center - neighbor + bond_lengths = paddle.linalg.norm(x=bond_vectors, axis=1) + bond_vectors = bond_vectors / bond_lengths[:, None] + undirected_bond_lengths = paddle.gather( + x=bond_lengths, axis=0, index=undirected2directed + ) + bond_basis_ag = self.rbf_expansion_ag(undirected_bond_lengths) + bond_basis_bg = self.rbf_expansion_bg(undirected_bond_lengths) + return bond_basis_ag, bond_basis_bg, bond_vectors + + +class AngleEncoder(paddle.nn.Layer): + """Encode an angle given the two bond vectors using Fourier Expansion.""" + + def __init__(self, num_angular: int = 9, learnable: bool = True) -> None: + """Initialize the angle encoder. + + Args: + num_angular (int): number of angular basis to use. Must be an odd integer. + learnable (bool): whether to set the frequencies of the Fourier expansion + as learnable parameters. Default = False + """ + super().__init__() + if num_angular % 2 != 1: + raise ValueError(f"num_angular={num_angular!r} must be an odd integer") + circular_harmonics_order = (num_angular - 1) // 2 + self.fourier_expansion = Fourier( + order=circular_harmonics_order, learnable=learnable + ) + + def forward(self, bond_i: paddle.Tensor, bond_j: paddle.Tensor) -> paddle.Tensor: + """Compute the angles between normalized vectors. + + Args: + bond_i (Tensor): normalized left bond vector [n_angle, 3] + bond_j (Tensor): normalized right bond vector [n_angle, 3] + + Returns: + angle_fea (Tensor): expanded cos_ij [n_angle, angle_feature_dim] + """ + cosine_ij = paddle.sum(x=bond_i * bond_j, axis=1) * (1 - 1e-06) + angle = paddle.acos(x=cosine_ij) + return self.fourier_expansion(angle) + + +class AtomConv(paddle.nn.Layer): + """A convolution Layer to update atom features.""" + + def __init__( + self, + atom_fea_dim: int, + bond_fea_dim: int, + hidden_dim: int = 64, + dropout: float = 0, + use_mlp_out: bool = True, + mlp_out_bias: bool = False, + resnet: bool = True, + ) -> None: + """Initialize the AtomConv layer. + + Args: + atom_fea_dim (int): The dimensionality of the input atom features. + bond_fea_dim (int): The dimensionality of the input bond features. + hidden_dim (int, optional): The dimensionality of the hidden layers in the + gated MLP. + Default = 64 + dropout (float, optional): The dropout rate to apply to the gated MLP. + Default = 0. + use_mlp_out (bool, optional): Whether to apply an MLP output layer to the + updated atom features. + Default = True + mlp_out_bias (bool): whether to use bias in the output MLP Linear layer. + Default = False + resnet (bool, optional): Whether to apply a residual connection to the + updated atom features. + Default = True + gMLP_norm (str, optional): The name of the normalization layer to use on the + gated MLP. Must be one of "batch", "layer", or None. + Default = None + """ + super().__init__() + self.use_mlp_out = use_mlp_out + self.resnet = resnet + self.activation = paddle.nn.Silu() + self.twoBody_atom = GatedMLP( + input_dim=2 * atom_fea_dim + bond_fea_dim, + output_dim=atom_fea_dim, + hidden_dim=hidden_dim, + dropout=dropout, + ) + if self.use_mlp_out: + self.mlp_out = MLP( + input_dim=atom_fea_dim, + output_dim=atom_fea_dim, + hidden_dim=0, + bias=mlp_out_bias, + ) + + def forward( + self, + atom_feas: paddle.Tensor, + bond_feas: paddle.Tensor, + bond_weights: paddle.Tensor, + atom_graph: paddle.Tensor, + directed2undirected: paddle.Tensor, + ) -> paddle.Tensor: + """Forward pass of AtomConv module that updates the atom features and + optionally bond features. + + Args: + atom_feas (Tensor): Input tensor with shape + [num_batch_atoms, atom_fea_dim] + bond_feas (Tensor): Input tensor with shape + [num_undirected_bonds, bond_fea_dim] + bond_weights (Tensor): AtomGraph bond weights with shape + [num_undirected_bonds, bond_fea_dim] + atom_graph (Tensor): Directed AtomGraph adjacency list with shape + [num_directed_bonds, 2] + directed2undirected (Tensor): Index tensor that maps directed bonds to + undirected bonds.with shape + [num_undirected_bonds] + + Returns: + Tensor: the updated atom features tensor with shape + [num_batch_atom, atom_fea_dim] + + Notes: + - num_batch_atoms = sum(num_atoms) in batch + """ + center_atoms = paddle.gather(x=atom_feas, axis=0, index=atom_graph[:, 0]) + nbr_atoms = paddle.gather(x=atom_feas, axis=0, index=atom_graph[:, 1]) + bonds = paddle.gather(x=bond_feas, axis=0, index=directed2undirected) + messages = paddle.concat(x=[center_atoms, bonds, nbr_atoms], axis=1) + messages = self.twoBody_atom(messages) + bond_weight = paddle.gather(x=bond_weights, axis=0, index=directed2undirected) + messages *= bond_weight + new_atom_feas = aggregate( + messages, atom_graph[:, 0], average=False, num_owner=len(atom_feas) + ) + if self.use_mlp_out: + new_atom_feas = self.mlp_out(new_atom_feas) + if self.resnet: + new_atom_feas += atom_feas + return new_atom_feas + + +class BondConv(paddle.nn.Layer): + """A convolution Layer to update bond features.""" + + def __init__( + self, + atom_fea_dim: int, + bond_fea_dim: int, + angle_fea_dim: int, + hidden_dim: int = 64, + dropout: float = 0, + use_mlp_out: bool = True, + mlp_out_bias: bool = False, + resnet=True, + ) -> None: + """Initialize the BondConv layer. + + Args: + atom_fea_dim (int): The dimensionality of the input atom features. + bond_fea_dim (int): The dimensionality of the input bond features. + angle_fea_dim (int): The dimensionality of the input angle features. + hidden_dim (int, optional): The dimensionality of the hidden layers + in the gated MLP. + Default = 64 + dropout (float, optional): The dropout rate to apply to the gated MLP. + Default = 0. + use_mlp_out (bool, optional): Whether to apply an MLP output layer to the + updated atom features. + Default = True + mlp_out_bias (bool): whether to use bias in the output MLP Linear layer. + Default = False + resnet (bool, optional): Whether to apply a residual connection to the + updated atom features. + Default = True + gMLP_norm (str, optional): The name of the normalization layer to use on the + gated MLP. Must be one of "batch", "layer", or None. + Default = None + """ + super().__init__() + self.use_mlp_out = use_mlp_out + self.resnet = resnet + self.activation = paddle.nn.Silu() + self.twoBody_bond = GatedMLP( + input_dim=atom_fea_dim + 2 * bond_fea_dim + angle_fea_dim, + output_dim=bond_fea_dim, + hidden_dim=hidden_dim, + dropout=dropout, + ) + if self.use_mlp_out: + self.mlp_out = MLP( + input_dim=bond_fea_dim, + output_dim=bond_fea_dim, + hidden_dim=0, + bias=mlp_out_bias, + ) + + def forward( + self, + atom_feas: paddle.Tensor, + bond_feas: paddle.Tensor, + bond_weights: paddle.Tensor, + angle_feas: paddle.Tensor, + bond_graph: paddle.Tensor, + ) -> paddle.Tensor: + """Update the bond features. + + Args: + atom_feas (Tensor): atom features tensor with shape + [num_batch_atoms, atom_fea_dim] + bond_feas (Tensor): bond features tensor with shape + [num_undirected_bonds, bond_fea_dim] + bond_weights (Tensor): BondGraph bond weights with shape + [num_undirected_bonds, bond_fea_dim] + angle_feas (Tensor): angle features tensor with shape + [num_batch_angles, angle_fea_dim] + bond_graph (Tensor): Directed BondGraph tensor with shape + [num_batched_angles, 3] + + Returns: + new_bond_feas (Tensor): bond feature tensor with shape + [num_undirected_bonds, bond_fea_dim] + + Notes: + - num_batch_atoms = sum(num_atoms) in batch + """ + center_atoms = paddle.gather( + x=atom_feas, axis=0, index=bond_graph[:, 0].cast("int32") + ) + bond_feas_i = paddle.gather( + x=bond_feas, axis=0, index=bond_graph[:, 1].cast("int32") + ) + bond_feas_j = paddle.gather( + x=bond_feas, axis=0, index=bond_graph[:, 2].cast("int32") + ) + total_fea = paddle.concat( + x=[bond_feas_i, bond_feas_j, angle_feas, center_atoms], axis=1 + ) + bond_update = self.twoBody_bond(total_fea) + bond_weights_i = paddle.gather( + x=bond_weights, axis=0, index=bond_graph[:, 1].cast("int32") + ) + bond_weights_j = paddle.gather( + x=bond_weights, axis=0, index=bond_graph[:, 2].cast("int32") + ) + bond_update = bond_update * bond_weights_i * bond_weights_j + new_bond_feas = aggregate( + bond_update, bond_graph[:, 1], average=False, num_owner=len(bond_feas) + ) + if self.use_mlp_out: + new_bond_feas = self.mlp_out(new_bond_feas) + if self.resnet: + new_bond_feas += bond_feas + return new_bond_feas + + +class AngleUpdate(paddle.nn.Layer): + """Update angle features.""" + + def __init__( + self, + atom_fea_dim: int, + bond_fea_dim: int, + angle_fea_dim: int, + hidden_dim: int = 0, + dropout: float = 0, + resnet: bool = True, + ) -> None: + """Initialize the AngleUpdate layer. + + Args: + atom_fea_dim (int): The dimensionality of the input atom features. + bond_fea_dim (int): The dimensionality of the input bond features. + angle_fea_dim (int): The dimensionality of the input angle features. + hidden_dim (int, optional): The dimensionality of the hidden layers + in the gated MLP. + Default = 0 + dropout (float, optional): The dropout rate to apply to the gated MLP. + Default = 0. + resnet (bool, optional): Whether to apply a residual connection to the + updated atom features. + Default = True + """ + super().__init__() + self.resnet = resnet + self.activation = paddle.nn.Silu() + self.twoBody_bond = GatedMLP( + input_dim=atom_fea_dim + 2 * bond_fea_dim + angle_fea_dim, + output_dim=angle_fea_dim, + hidden_dim=hidden_dim, + dropout=dropout, + ) + + def forward( + self, + atom_feas: paddle.Tensor, + bond_feas: paddle.Tensor, + angle_feas: paddle.Tensor, + bond_graph: paddle.Tensor, + ) -> paddle.Tensor: + """Update the angle features using bond graph. + + Args: + atom_feas (Tensor): atom features tensor with shape + [num_batch_atoms, atom_fea_dim] + bond_feas (Tensor): bond features tensor with shape + [num_undirected_bonds, bond_fea_dim] + angle_feas (Tensor): angle features tensor with shape + [num_batch_angles, angle_fea_dim] + bond_graph (Tensor): Directed BondGraph tensor with shape + [num_batched_angles, 3] + + Returns: + new_angle_feas (Tensor): angle features tensor with shape + [num_batch_angles, angle_fea_dim] + + Notes: + - num_batch_atoms = sum(num_atoms) in batch + """ + bond_graph = bond_graph.astype("int64") + center_atoms = paddle.gather(x=atom_feas, axis=0, index=bond_graph[:, 0]) + bond_feas_i = paddle.gather(x=bond_feas, axis=0, index=bond_graph[:, 1]) + bond_feas_j = paddle.gather(x=bond_feas, axis=0, index=bond_graph[:, 2]) + total_fea = paddle.concat( + x=[bond_feas_i, bond_feas_j, angle_feas, center_atoms], axis=1 + ) + new_angle_feas = self.twoBody_bond(total_fea) + + if self.resnet: + new_angle_feas += angle_feas + return new_angle_feas + + +class GraphPooling(paddle.nn.Layer): + """Pooling the sub-graphs in the batched graph.""" + + def __init__(self, *, average: bool = False) -> None: + """Args: + average (bool): whether to average the features. + """ + super().__init__() + self.average = average + + def forward( + self, atom_feas: paddle.Tensor, atom_owner: paddle.Tensor + ) -> paddle.Tensor: + """Merge the atom features that belong to same graph in a batched graph. + + Args: + atom_feas (Tensor): batched atom features after convolution layers. + [num_batch_atoms, atom_fea_dim or 1] + atom_owner (Tensor): graph indices for each atom. + [num_batch_atoms] + + Returns: + crystal_feas (Tensor): crystal feature matrix. + [n_crystals, atom_fea_dim or 1] + """ + return aggregate(atom_feas, atom_owner, average=self.average) + + +class GraphAttentionReadOut(paddle.nn.Layer): + """Multi Head Attention Read Out Layer + merge the information from atom_feas to crystal_fea. + """ + + def __init__( + self, + atom_fea_dim: int, + num_head: int = 3, + hidden_dim: int = 32, + average=False, + ) -> None: + """Initialize the layer. + + Args: + atom_fea_dim (int): atom feature dimension + num_head (int): number of attention heads used + hidden_dim (int): dimension of hidden layer + average (bool): whether to average the features + """ + super().__init__() + self.key = MLP( + input_dim=atom_fea_dim, output_dim=num_head, hidden_dim=hidden_dim + ) + self.softmax = paddle.nn.Softmax(axis=0) + self.average = average + + def forward( + self, atom_feas: paddle.Tensor, atom_owner: paddle.Tensor + ) -> paddle.Tensor: + """Merge the atom features that belong to same graph in a batched graph. + + Args: + atom_feas (Tensor): batched atom features after convolution layers. + [num_batch_atoms, atom_fea_dim] + atom_owner (Tensor): graph indices for each atom. + [num_batch_atoms] + + Returns: + crystal_feas (Tensor): crystal feature matrix. + [n_crystals, atom_fea_dim] + """ + crystal_feas = [] + weights = self.key(atom_feas) + bin_count = paddle.bincount(x=atom_owner) + start_index = 0 + for n_atom in bin_count: + atom_fea = atom_feas[start_index : start_index + n_atom, :] + weight = self.softmax(weights[start_index : start_index + n_atom, :]) + crystal_fea = (atom_fea.T @ weight).reshape([-1]) + if self.average: + crystal_fea /= n_atom + crystal_feas.append(crystal_fea) + start_index += n_atom + return paddle.stack(x=crystal_feas, axis=0) + + +class CHGNet(paddle.nn.Layer): + """Crystal Hamiltonian Graph neural Network. A model that takes in a crystal graph + and output energy, force, magmom, stress. + + https://www.nature.com/articles/s42256-023-00716-3 + + Args: + atom_fea_dim (int): atom feature vector embedding dimension. Default = 64 + bond_fea_dim (int): bond feature vector embedding dimension. Default = 64 + angle_fea_dim (int): angle feature vector embedding dimension. Default = 64 + bond_fea_dim (int): angle feature vector embedding dimension. Default = 64 + composition_model (nn.Layer, str): attach a composition model to + predict energy or initialize a pretrained linear regression (AtomRef). + The default 'MPtrj' is the atom reference energy linear regression + trained on all Materials Project relaxation trajectories. Default = 'MPtrj' + num_radial (int): number of radial basis used in bond basis expansion. Default + to 31. + num_angular (int): number of angular basis used in angle basis expansion. + Default = 31. + n_conv (int): number of interaction blocks. Default = 4 + Note: last interaction block contain only an atom_conv layer + atom_conv_hidden_dim (List or int): hidden dimensions of atom convolution + layers. Default = 64 + update_bond (bool): whether to use bond_conv_layer in bond graph to update bond + embeddings. Default = True. + bond_conv_hidden_dim (List or int): hidden dimensions of bond convolution + layers. Default = 64 + update_angle (bool): whether to use angle_update_layer to update angle + embeddings. Default = True + angle_layer_hidden_dim (List or int): hidden dimensions of angle layers. + Default = 0 + conv_dropout (float): dropout rate in all conv_layers. + Default = 0 + read_out (str): method for pooling layer, 'ave' for standard + average pooling, 'attn' for multi-head attention. + Default = "ave" + mlp_hidden_dims (int or list): readout multilayer perceptron + hidden dimensions. + Default = [64, 64] + mlp_dropout (float): dropout rate in readout MLP. + Default = 0. + is_intensive (bool): whether the energy training label is intensive + i.e. energy per atom. + Default = True + mlp_first (bool): whether to apply mlp first then pooling. + if set to True, then CHGNet is essentially calculating energy for each + atom, them sum them up, this is used for the pretrained model + Default = True + atom_graph_cutoff (float): cutoff radius (A) in creating atom_graph, + this need to be consistent with the value in training dataloader + Default = 5 + bond_graph_cutoff (float): cutoff radius (A) in creating bond_graph, + this need to be consistent with value in training dataloader + Default = 3 + cutoff_coeff (float): cutoff strength used in graph smooth cutoff function. + the smaller this coeff is, the smoother the basis is + Default = 5 + learnable_rbf (bool): whether to set the frequencies in rbf and Fourier + basis functions learnable. + Default = True + return_site_energies (bool): whether to return per-site energies, + only available if mlp_first == True. Default = False + return_atom_feas (bool): whether to return the atom features before last + conv layer. Default = False + return_crystal_feas (bool): whether to return crystal feature. Default = False + **kwargs: Additional keyword arguments + + """ + + def __init__( + self, + atom_fea_dim: int = 64, + bond_fea_dim: int = 64, + angle_fea_dim: int = 64, + composition_model: str | paddle.nn.Layer = "MPtrj", + num_radial: int = 31, + num_angular: int = 31, + n_conv: int = 4, + atom_conv_hidden_dim: Sequence[int] | int = 64, + update_bond: bool = True, + bond_conv_hidden_dim: Sequence[int] | int = 64, + update_angle: bool = True, + angle_layer_hidden_dim: Sequence[int] | int = 0, + conv_dropout: float = 0, + read_out: str = "ave", + mlp_hidden_dims: Sequence[int] | int = (64, 64, 64), + mlp_dropout: float = 0, + mlp_first: bool = True, + is_intensive: bool = True, + atom_graph_cutoff: float = 6, + bond_graph_cutoff: float = 3, + cutoff_coeff: int = 8, + learnable_rbf: bool = True, + is_freeze: bool = False, + property_names: Sequence[str] | None = None, + return_site_energies: bool = False, + return_atom_feas: bool = False, + return_crystal_feas: bool = False, + loss_type: str = "mse_loss", + huber_loss_delta: float = 0.1, + loss_weights_dict: dict | None = None, + **kwargs, + ) -> None: + super().__init__() + self.atom_fea_dim = atom_fea_dim + self.bond_fea_dim = bond_fea_dim + self.is_intensive = is_intensive + self.n_conv = n_conv + self.is_freeze = is_freeze + + support_property_names = ["energy_per_atom", "force", "stress", "magmom"] + support_loss_weights_dict = { + "energy_per_atom": 1.0, + "force": 1.0, + "stress": 0.1, + "magmom": 0.1, + } + if property_names is None: + property_names = support_property_names + else: + for property_name in property_names: + assert ( + property_name in support_property_names + ), f"{property_name} is not supported, please choose from " + f"{support_property_names}" + self.property_names = property_names + if loss_weights_dict is None: + loss_weights_dict = { + key: support_loss_weights_dict[key] for key in property_names + } + self.loss_weights_dict = loss_weights_dict + + self.return_site_energies = return_site_energies + self.return_atom_feas = return_atom_feas + self.return_crystal_feas = return_crystal_feas + + if isinstance(composition_model, paddle.nn.Layer): + self.composition_model = composition_model + elif isinstance(composition_model, str): + self.composition_model = AtomRef(is_intensive=is_intensive) + self.composition_model.initialize_from(composition_model) + else: + self.composition_model = None + if self.composition_model is not None: + for param in self.composition_model.parameters(): + param.stop_gradient = True + self.atom_embedding = AtomEmbedding(atom_feature_dim=atom_fea_dim) + self.bond_basis_expansion = BondEncoder( + atom_graph_cutoff=atom_graph_cutoff, + bond_graph_cutoff=bond_graph_cutoff, + num_radial=num_radial, + cutoff_coeff=cutoff_coeff, + learnable=learnable_rbf, + ) + self.bond_embedding = paddle.nn.Linear( + in_features=num_radial, out_features=bond_fea_dim, bias_attr=False + ) + self.bond_weights_ag = paddle.nn.Linear( + in_features=num_radial, out_features=atom_fea_dim, bias_attr=False + ) + self.bond_weights_bg = paddle.nn.Linear( + in_features=num_radial, out_features=bond_fea_dim, bias_attr=False + ) + self.angle_basis_expansion = AngleEncoder( + num_angular=num_angular, learnable=learnable_rbf + ) + self.angle_embedding = paddle.nn.Linear( + in_features=num_angular, out_features=angle_fea_dim, bias_attr=False + ) + + mlp_out_bias = kwargs.pop("mlp_out_bias", False) + atom_graph_layers = [ + AtomConv( + atom_fea_dim=atom_fea_dim, + bond_fea_dim=bond_fea_dim, + hidden_dim=atom_conv_hidden_dim, + dropout=conv_dropout, + use_mlp_out=True, + mlp_out_bias=mlp_out_bias, + resnet=True, + ) + for _ in range(n_conv) + ] + self.atom_conv_layers = paddle.nn.LayerList(sublayers=atom_graph_layers) + if update_bond: + bond_graph_layers = [ + BondConv( + atom_fea_dim=atom_fea_dim, + bond_fea_dim=bond_fea_dim, + angle_fea_dim=angle_fea_dim, + hidden_dim=bond_conv_hidden_dim, + dropout=conv_dropout, + use_mlp_out=True, + mlp_out_bias=mlp_out_bias, + resnet=True, + ) + for _ in range(n_conv - 1) + ] + self.bond_conv_layers = paddle.nn.LayerList(sublayers=bond_graph_layers) + else: + self.bond_conv_layers = [None for _ in range(n_conv - 1)] + if update_angle: + angle_layers = [ + AngleUpdate( + atom_fea_dim=atom_fea_dim, + bond_fea_dim=bond_fea_dim, + angle_fea_dim=angle_fea_dim, + hidden_dim=angle_layer_hidden_dim, + dropout=conv_dropout, + resnet=True, + ) + for _ in range(n_conv - 1) + ] + self.angle_layers = paddle.nn.LayerList(sublayers=angle_layers) + else: + self.angle_layers = [None for _ in range(n_conv - 1)] + self.site_wise = paddle.nn.Linear(in_features=atom_fea_dim, out_features=1) + self.readout_norm = paddle.nn.LayerNorm(atom_fea_dim) + self.mlp_first = mlp_first + if mlp_first: + self.read_out_type = "sum" + input_dim = atom_fea_dim + self.pooling = GraphPooling(average=False) + elif read_out in {"attn", "weighted"}: + self.read_out_type = "attn" + num_heads = kwargs.pop("num_heads", 3) + self.pooling = GraphAttentionReadOut( + atom_fea_dim, num_head=num_heads, average=True + ) + input_dim = atom_fea_dim * num_heads + else: + self.read_out_type = "ave" + input_dim = atom_fea_dim + self.pooling = GraphPooling(average=True) + if kwargs.pop("final_mlp", "MLP") in {"normal", "MLP"}: + self.mlp = MLP( + input_dim=input_dim, + hidden_dim=mlp_hidden_dims, + output_dim=1, + dropout=mlp_dropout, + ) + else: + self.mlp = paddle.nn.Sequential( + GatedMLP( + input_dim=input_dim, + hidden_dim=mlp_hidden_dims, + output_dim=mlp_hidden_dims[-1], + dropout=mlp_dropout, + ), + paddle.nn.Linear(in_features=mlp_hidden_dims[-1], out_features=1), + ) + if is_freeze: + self.freeze_weights() + logger.info("Some weights are frozen.") + + self.loss_type = loss_type + if loss_type == "mse_loss": + self.loss_fn = paddle.nn.MSELoss() + elif loss_type == "smooth_l1_loss" or loss_type == "huber_loss": + self.loss_fn = paddle.nn.SmoothL1Loss(delta=huber_loss_delta) + self.huber_loss_delta = huber_loss_delta + elif loss_type == "l1_loss": + self.loss_fn = paddle.nn.L1Loss() + else: + raise ValueError(f"Unknown loss type {loss_type}.") + + def freeze_weights(self) -> None: + for layer in [ + self.atom_embedding, + self.bond_embedding, + self.angle_embedding, + self.bond_basis_expansion, + self.angle_basis_expansion, + self.atom_conv_layers[:3], + self.bond_conv_layers, + self.angle_layers, + ]: + for param in layer.parameters(): + param.stop_gradient = True + + def forward(self, data, return_loss=True, return_prediction=True): + assert ( + return_loss or return_prediction + ), "At least one of return_loss or return_prediction must be True." + ( + energy, + force, + stress, + magmom, + site_energies, + atom_feas, + crystal_feas, + ) = self._forward(data) + + pred_dict = { + "energy_per_atom": energy, + "force": force, + "stress": stress, + "magmom": magmom, + } + + loss_dict = {} + if return_loss: + loss = 0.0 + for property_name in self.property_names: + label = data[property_name] + pred = pred_dict[property_name] + + valid_value_indices = ~paddle.isnan(label) + valid_label = label[valid_value_indices] + valid_pred = pred[valid_value_indices] + + if valid_label.numel() > 0: + loss_property = self.loss_fn( + input=valid_pred, + label=valid_label, + ) + + loss_dict[property_name] = loss_property + loss += loss_property * self.loss_weights_dict[property_name] + # else: + # loss_dict[property_name] = 0.0 + loss_dict["loss"] = loss + + prediction = {} + if return_prediction: + for property_name in self.property_names: + prediction[property_name] = pred_dict[property_name] + if self.return_site_energies: + prediction["site_energies"] = site_energies + if self.return_atom_feas: + prediction["atom_feas"] = atom_feas + if self.return_crystal_feas: + prediction["crystal_feas"] = crystal_feas + + return {"loss_dict": loss_dict, "pred_dict": prediction} + + def _forward( + self, + batch_data, + ) -> dict[str, paddle.Tensor]: + """Get prediction associated with input graphs""" + # The data in data['graph'] is numpy.ndarray, convert it to paddle.Tensor + batch_data["graph"] = batch_data["graph"].tensor() + + graphs = batch_data["graph"] + comp_energy = ( + 0 if self.composition_model is None else self.composition_model(graphs) + ) + + atom_graph = graphs.edge_feat["atom_graph"].astype("int32") + num_atoms = graphs.node_feat["num_atoms"].astype("int32") + num_edges = graphs.edge_feat["num_edges"].astype("int32") + batch_size = graphs.num_graph + atom_owners = graphs.graph_node_id + directed2undirected = graphs.edge_feat["directed2undirected"].astype("int32") + undirected2directed = graphs.edge_feat["undirected2directed"].astype("int32") + + atomic_numbers = graphs.node_feat["atom_types"].astype("int32") + + frac_coords = graphs.node_feat["frac_coords"] + frac_coords.stop_gradient = False + lattice = graphs.node_feat["lattice"] + lattice.stop_gradient = False + + if "stress" not in self.property_names: + strains = None + volumes = None + else: + strains = paddle.to_tensor( + paddle.zeros([batch_size, 3, 3], dtype="float32"), stop_gradient=False + ) + lattice = paddle.matmul( + lattice, paddle.eye(3, dtype="float32")[None, :, :] + strains + ) + + volumes = paddle.dot( + lattice[:, 0], paddle.cross(x=lattice[:, 1], y=lattice[:, 2], axis=-1) + ) + volumes.stop_gradient = True + + if "stress" not in self.property_names: + # 使用einsum 与 @ 计算矩阵乘法有误差 + atom_positions = frac_to_cart_coords( + frac_coords, + num_atoms=num_atoms, + lattices=lattice, + ) + else: + atom_positions = [] + start = 0 + for i in range(batch_size): + end = start + num_atoms[i] + atom_positions.append(frac_coords[start:end] @ lattice[i]) + start = end + atom_positions = paddle.concat(atom_positions) + + # Stores the edge information of each crystal pattern, shape=[2, N], Where N is + # the number of edges, + # Each element represents the index of two atoms + atom_graph = graphs.edge_feat["atom_graph"] + num_atom_graph = graphs.edge_feat["num_atom_graph"] + num_atoms_cumsum = paddle.cumsum(num_atoms).astype('int32') + num_atoms_cumsum = paddle.concat( + [paddle.zeros(1, dtype=num_atoms_cumsum.dtype), num_atoms_cumsum] + ) + num_atoms_cumsum = num_atoms_cumsum[:-1] + # Convert the index to the index of the overall graph + atom_graph_offset = paddle.repeat_interleave(num_atoms_cumsum, num_atom_graph) + atom_graph = atom_graph + atom_graph_offset[:, None] + + # Calculate the vector and distance of each edge in the crystal diagram + center = atom_positions[atom_graph[:, 0]] + neighbor = atom_positions[atom_graph[:, 1]] + image = graphs.edge_feat["image"] + + if "stress" not in self.property_names: + lattice_edges = paddle.repeat_interleave( + x=lattice, repeats=num_edges, axis=0 + ) + offset = paddle.einsum("bi,bij->bj", image, lattice_edges) + else: + offset = [] + start = 0 + for i in range(batch_size): + end = start + num_edges[i] + offset.append(image[start:end] @ lattice[i]) + start = end + + offset = paddle.concat(offset) + + neighbor = neighbor + offset + bond_vectors = center - neighbor + bond_lengths = paddle.linalg.norm(x=bond_vectors, axis=1) + bond_vectors = bond_vectors / bond_lengths[:, None] + + # Accumulate the number of edges in each crystal pattern and add it as an + # offset to the index of each edge vector + num_edges_cumsum = paddle.cumsum(num_edges).astype('int32') + num_edges_cumsum = paddle.concat( + [paddle.zeros(1, dtype=num_edges_cumsum.dtype), num_edges_cumsum] + ) + num_edges_cumsum = num_edges_cumsum[:-1] + + undirected2directed_offset = paddle.repeat_interleave( + num_edges_cumsum, graphs.edge_feat["undirected2directed_len"] + ) + undirected2directed = undirected2directed + undirected2directed_offset + + # Extract the length corresponding to the undirected edge + undirected_bond_lengths = paddle.gather( + x=bond_lengths, axis=0, index=undirected2directed + ) + + bond_bases_ag = self.bond_basis_expansion.rbf_expansion_ag( + undirected_bond_lengths + ) + bond_bases_bg = self.bond_basis_expansion.rbf_expansion_bg( + undirected_bond_lengths + ) + + num_bond_graph = graphs.edge_feat["num_bond_graph"] + bond_vec_index_offset = paddle.repeat_interleave( + num_edges_cumsum, num_bond_graph + ) + + undirected2directed_len_cumsum = paddle.cumsum( + graphs.edge_feat["undirected2directed_len"] + ).astype('int32') + undirected2directed_len_cumsum = paddle.concat( + [ + paddle.zeros(1, dtype=undirected2directed_len_cumsum.dtype), + undirected2directed_len_cumsum, + ] + ) + undirected2directed_len_cumsum = undirected2directed_len_cumsum[:-1] + + if num_bond_graph.max() != 0: + bond_vecs_i_index = ( + graphs.edge_feat["bond_graph"][:, 2] + bond_vec_index_offset + ) + bond_vecs_j_index = ( + graphs.edge_feat["bond_graph"][:, 4] + bond_vec_index_offset + ) + bond_vecs_i = paddle.gather(x=bond_vectors, axis=0, index=bond_vecs_i_index) + bond_vecs_j = paddle.gather(x=bond_vectors, axis=0, index=bond_vecs_j_index) + angle_bases = self.angle_basis_expansion(bond_vecs_i, bond_vecs_j) + + bond_graph_new = paddle.zeros([graphs.edge_feat["bond_graph"].shape[0], 3]) + offset_tmp = paddle.repeat_interleave(num_atoms_cumsum, num_bond_graph) + bond_graph_new[:, 0] = graphs.edge_feat["bond_graph"][:, 0] + offset_tmp + + offset_tmp = paddle.repeat_interleave( + undirected2directed_len_cumsum, num_bond_graph + ) + bond_graph_new[:, 1] = graphs.edge_feat["bond_graph"][:, 1] + offset_tmp + bond_graph_new[:, 2] = graphs.edge_feat["bond_graph"][:, 3] + offset_tmp + else: + angle_bases = paddle.to_tensor(data=[]) + bond_graph_new = paddle.to_tensor(data=[]) + + offset_tmp = paddle.repeat_interleave(undirected2directed_len_cumsum, num_edges) + directed2undirected = directed2undirected + offset_tmp + + ( + energy, + force, + stress, + magmom, + site_energies, + atom_feas, + crystal_feas, + ) = self._compute( + atomic_numbers=atomic_numbers, + bond_bases_ag=bond_bases_ag, + bond_bases_bg=bond_bases_bg, + angle_bases=angle_bases, + batched_atom_graph=atom_graph, + batched_bond_graph=bond_graph_new, + atom_owners=atom_owners, + directed2undirected=directed2undirected, + atom_positions=atom_positions, # atom_positions_list, + strains=strains, + volumes=volumes, + ) + + energy += comp_energy + + if self.return_site_energies and self.composition_model is not None: + site_energy_shifts = self.composition_model.get_site_energies(graphs) + site_energies = [ + (i + j) for i, j in zip(site_energies, site_energy_shifts, strict=True) + ] + + return energy, force, stress, magmom, site_energies, atom_feas, crystal_feas + + def _compute( + self, + atomic_numbers, + bond_bases_ag, + bond_bases_bg, + angle_bases, + batched_atom_graph, + batched_bond_graph, + atom_owners, + directed2undirected, + atom_positions, # atom_positions_list, + strains, + volumes, + ) -> dict: + """Get Energy, Force, Stress, Magmom associated with input graphs + force = - d(Energy)/d(atom_positions) + stress = 1/V * d(Energy)/d(strain). + + Returns: + prediction (dict): containing the fields: + e (Tensor) : energy of structures [batch_size, 1] + f (Tensor) : force on atoms [num_batch_atoms, 3] + s (Tensor) : stress of structure [3 * batch_size, 3] + m (Tensor) : magnetic moments of sites [num_batch_atoms, 3] + """ + + energy, force, stress, magmom = None, None, None, None + site_energies, atom_feas, crystal_feas = None, None, None + + atoms_per_graph = paddle.bincount(x=atom_owners) + + atom_feas = self.atom_embedding(atomic_numbers - 1) + bond_feas = self.bond_embedding(bond_bases_ag) + bond_weights_ag = self.bond_weights_ag(bond_bases_ag) + bond_weights_bg = self.bond_weights_bg(bond_bases_bg) + if len(angle_bases) != 0: + angle_feas = self.angle_embedding(angle_bases) + for idx, (atom_layer, bond_layer, angle_layer) in enumerate( + zip( + self.atom_conv_layers[:-1], + self.bond_conv_layers, + self.angle_layers, + strict=False, + ) + ): + atom_feas = atom_layer( + atom_feas=atom_feas, + bond_feas=bond_feas, + bond_weights=bond_weights_ag, + atom_graph=batched_atom_graph, + directed2undirected=directed2undirected, + ) + if len(angle_bases) != 0 and bond_layer is not None: + bond_feas = bond_layer( + atom_feas=atom_feas, + bond_feas=bond_feas, + bond_weights=bond_weights_bg, + angle_feas=angle_feas, + bond_graph=batched_bond_graph, + ) + if angle_layer is not None: + angle_feas = angle_layer( + atom_feas=atom_feas, + bond_feas=bond_feas, + angle_feas=angle_feas, + bond_graph=batched_bond_graph, + ) + if idx == self.n_conv - 2: + if self.return_atom_feas: + atom_feas = paddle.split( + x=atom_feas, num_or_sections=atoms_per_graph.tolist() + ) + if "magmom" in self.property_names: + magmom = paddle.abs(x=self.site_wise(atom_feas)) + # magmom = list( + # paddle.split( + # x=magmom.reshape([-1]), + # num_or_sections=atoms_per_graph.tolist(), + # ) + # ) + else: + magmom = None + atom_feas = self.atom_conv_layers[-1]( + atom_feas=atom_feas, + bond_feas=bond_feas, + bond_weights=bond_weights_ag, + atom_graph=batched_atom_graph, + directed2undirected=directed2undirected, + ) + if self.readout_norm is not None: + atom_feas = self.readout_norm(atom_feas) + + if self.mlp_first: + energies = self.mlp(atom_feas) + energy = self.pooling(energies, atom_owners) # .reshape([-1]) + if self.return_site_energies: + site_energies = paddle.split( + x=energies.squeeze(axis=1), num_or_sections=atoms_per_graph.tolist() + ) + if self.return_crystal_feas: + crystal_feas = self.pooling(atom_feas, atom_owners) + else: + crystal_feas = self.pooling(atom_feas, atom_owners) + energy = self.mlp(crystal_feas) * atoms_per_graph # .reshape([-1]) + if self.return_crystal_feas: + crystal_feas = crystal_feas + + if "force" in self.property_names: + force = paddle.grad( + outputs=energy.sum(), + inputs=atom_positions, + create_graph=self.training, + retain_graph=self.training, + ) + if isinstance(atom_positions, paddle.Tensor): + force = force[0] + force = -1 * force + + if "stress" in self.property_names: + stress = paddle.grad( + outputs=energy.sum(), + inputs=strains, + create_graph=self.training, + retain_graph=self.training, + ) + if isinstance(strains, paddle.Tensor): + stress = stress[0] + scale = 1 / volumes * 160.21766208 + stress = stress * scale[:, None, None] + + if self.is_intensive: + energy /= atoms_per_graph.unsqueeze(-1).cast("float32") + return energy, force, stress, magmom, site_energies, atom_feas, crystal_feas + + def _prediction_to_numpy(self, prediction): + for key in prediction.keys(): + if isinstance(prediction[key], list): + prediction[key] = [ + prediction[key][i].numpy() for i in range(len(prediction[key])) + ] + else: + prediction[key] = prediction[key].numpy() + if key == "stress" and len(prediction["stress"].shape) == 3: + prediction[key] = prediction[key][0] + if key == "magmom" and isinstance(prediction[key], list): + prediction[key] = prediction[key][0] + if key == "energy_pre_atom" and isinstance(prediction[key], np.ndarray): + prediction[key] = prediction[key][0] + return prediction + + def predict(self, graphs): + if isinstance(graphs, list): + results = [] + for graph in graphs: + result = self.forward( + { + "graph": graph, + }, + return_loss=False, + return_prediction=True, + ) + prediction = result["pred_dict"] + prediction = self._prediction_to_numpy(prediction) + results.append(prediction) + return results + + else: + data = { + "graph": graphs, + } + result = self.forward( + data, + return_loss=False, + return_prediction=True, + ) + prediction = result["pred_dict"] + prediction = self._prediction_to_numpy(prediction) + return prediction diff --git a/ppmat/models/chgnet/chgnet_graph_converter.py b/ppmat/models/chgnet/chgnet_graph_converter.py new file mode 100644 index 00000000..dd0cabaf --- /dev/null +++ b/ppmat/models/chgnet/chgnet_graph_converter.py @@ -0,0 +1,524 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/CederGroupHub/chgnet + +from __future__ import annotations + +import sys +from abc import ABC +from abc import abstractmethod +from typing import Optional + +import numpy as np +import pgl +from p_tqdm import p_map +from pymatgen.core.structure import Structure + + +class Node: + """A node in a graph.""" + + def __init__(self, index: int, info: dict | None = None) -> None: + """Initialize a Node. + + Args: + index (int): the index of this node + info (dict, optional): any additional information about this node. + """ + self.index = index + self.info = info + self.neighbors: dict[int, list[DirectedEdge | UndirectedEdge]] = {} + + def add_neighbor(self, index, edge) -> None: + """Draw an directed edge between self and the node specified by index. + + Args: + index (int): the index of neighboring node + edge (DirectedEdge): an DirectedEdge object pointing from self to the node. + """ + if index not in self.neighbors: + self.neighbors[index] = [edge] + else: + self.neighbors[index].append(edge) + + +class Edge(ABC): + """Abstract base class for edges in a graph.""" + + def __init__( + self, nodes: list, index: int | None = None, info: dict | None = None + ) -> None: + """Initialize an Edge.""" + self.nodes = nodes + self.index = index + self.info = info + + def __repr__(self) -> str: + """String representation of this edge.""" + nodes, index, info = self.nodes, self.index, self.info + return f"{type(self).__name__}(nodes={nodes!r}, index={index!r}, info={info!r})" + + def __hash__(self) -> int: + """Hash this edge.""" + img = (self.info or {}).get("image") + img_str = "" if img is None else img.tobytes() + return hash((self.nodes[0], self.nodes[1], img_str)) + + @abstractmethod + def __eq__(self, other: object) -> bool: + """Check if two edges are equal.""" + raise NotImplementedError + + +class UndirectedEdge(Edge): + """An undirected/bi-directed edge in a graph.""" + + __hash__ = Edge.__hash__ + + def __eq__(self, other: object) -> bool: + """Check if two undirected edges are equal.""" + return set(self.nodes) == set(other.nodes) and self.info == other.info + + +class DirectedEdge(Edge): + """A directed edge in a graph.""" + + __hash__ = Edge.__hash__ + + def make_undirected(self, index: int, info: dict | None = None) -> UndirectedEdge: + """Make a directed edge undirected.""" + info = info or {} + info["distance"] = self.info["distance"] + return UndirectedEdge(self.nodes, index, info) + + def __eq__(self, other: object) -> bool: + """Check if the two directed edges are equal. + + Args: + other (DirectedEdge): another DirectedEdge to compare to + + Returns: + bool: True if other is the same directed edge, or if other is the directed + edge with reverse direction of self, else False. + """ + if not isinstance(other, DirectedEdge): + return False + self_img = (self.info or {}).get("image") + other_img = (other.info or {}).get("image") + none_img = self_img is other_img is None + if self.nodes == other.nodes and (none_img or all(self_img == other_img)): + print( + ( + "the two directed edges are equal but this operation " + "is not supposed to happen" + ), + file=sys.stderr, + ) + return True + return self.nodes == other.nodes[::-1] and ( + none_img or all(self_img == -1 * other_img) + ) + + +class GraphUtils: + """A graph for storing the neighbor information of atoms.""" + + def __init__(self, nodes: list[Node]) -> None: + """Initialize a Graph from a list of nodes.""" + self.nodes = nodes + self.directed_edges: dict[frozenset[int], list[DirectedEdge]] = {} + self.directed_edges_list: list[DirectedEdge] = [] + self.undirected_edges: dict[frozenset[int], list[UndirectedEdge]] = {} + self.undirected_edges_list: list[UndirectedEdge] = [] + + def add_edge( + self, center_index, neighbor_index, image, distance, dist_tol: float = 1e-06 + ) -> None: + """Add an directed edge to the graph. + + Args: + center_index (int): center node index + neighbor_index (int): neighbor node index + image (np.array): the periodic cell image the neighbor is from + distance (float): distance between center and neighbor. + dist_tol (float): tolerance for distance comparison between edges. + Default = 1e-6 + """ + directed_edge_index = len(self.directed_edges_list) + this_directed_edge = DirectedEdge( + [center_index, neighbor_index], + index=directed_edge_index, + info={"image": image, "distance": distance}, + ) + tmp = frozenset([center_index, neighbor_index]) + if tmp not in self.undirected_edges: + this_directed_edge.info["undirected_edge_index"] = len( + self.undirected_edges_list + ) + this_undirected_edge = this_directed_edge.make_undirected( + index=len(self.undirected_edges_list), + info={"directed_edge_index": [directed_edge_index]}, + ) + self.undirected_edges[tmp] = [this_undirected_edge] + self.undirected_edges_list.append(this_undirected_edge) + self.nodes[center_index].add_neighbor(neighbor_index, this_directed_edge) + self.directed_edges_list.append(this_directed_edge) + else: + for undirected_edge in self.undirected_edges[tmp]: + if ( + abs(undirected_edge.info["distance"] - distance) < dist_tol + and len(undirected_edge.info["directed_edge_index"]) == 1 + ): + added_dir_edge = self.directed_edges_list[ + undirected_edge.info["directed_edge_index"][0] + ] + if added_dir_edge == this_directed_edge: + this_directed_edge.info[ + "undirected_edge_index" + ] = added_dir_edge.info["undirected_edge_index"] + self.nodes[center_index].add_neighbor( + neighbor_index, this_directed_edge + ) + self.directed_edges_list.append(this_directed_edge) + undirected_edge.info["directed_edge_index"].append( + directed_edge_index + ) + return + this_directed_edge.info["undirected_edge_index"] = len( + self.undirected_edges_list + ) + this_undirected_edge = this_directed_edge.make_undirected( + index=len(self.undirected_edges_list), + info={"directed_edge_index": [directed_edge_index]}, + ) + self.undirected_edges[tmp].append(this_undirected_edge) + self.undirected_edges_list.append(this_undirected_edge) + self.nodes[center_index].add_neighbor(neighbor_index, this_directed_edge) + self.directed_edges_list.append(this_directed_edge) + + def adjacency_list(self) -> tuple[list[list[int]], list[int]]: + """Get the adjacency list + Return: + graph: the adjacency list + [[0, 1], + [0, 2], + ... + [5, 2] + ... ]] + the fist column specifies center/source node, + the second column specifies neighbor/destination node + directed2undirected: + [0, 1, ...] + a list of length = num_directed_edge that specifies + the undirected edge index corresponding to the directed edges + represented in each row in the graph adjacency list. + """ + graph = [edge.nodes for edge in self.directed_edges_list] + directed2undirected = [ + edge.info["undirected_edge_index"] for edge in self.directed_edges_list + ] + return graph, directed2undirected + + def line_graph_adjacency_list(self, cutoff) -> tuple[list[list[int]], list[int]]: + """Get the line graph adjacency list. + + Args: + cutoff (float): a float to indicate the maximum edge length to be included + in constructing the line graph, this is used to decrease computation + complexity + + Return: + line_graph: + [[0, 1, 1, 2, 2], + [0, 1, 1, 4, 23], + [1, 4, 23, 5, 66], + ... ... ] + the fist column specifies node(atom) index at this angle, + the second column specifies 1st undirected edge(left bond) index, + the third column specifies 1st directed edge(left bond) index, + the fourth column specifies 2nd undirected edge(right bond) index, + the fifth column specifies 2nd directed edge(right bond) index,. + undirected2directed: + [32, 45, ...] + a list of length = num_undirected_edge that + maps the undirected edge index to one of its directed edges indices + """ + if len(self.directed_edges_list) != 2 * len(self.undirected_edges_list): + raise ValueError( + f"Error: number of directed edges={len(self.directed_edges_list)} " + f"!= 2 * number of undirected edges={len(self.undirected_edges_list)}" + "!This indicates directed edges are not complete" + ) + line_graph = [] + undirected2directed = [] + for u_edge in self.undirected_edges_list: + undirected2directed.append(u_edge.info["directed_edge_index"][0]) + if u_edge.info["distance"] > cutoff: + continue + if len(u_edge.info["directed_edge_index"]) != 2: + raise ValueError( + f"Did not find 2 Directed_edges !!!undirected edge {u_edge} " + "has:edge.info['directed_edge_index'] = " + f"{u_edge.info['directed_edge_index']}len directed_edges_list = " + f"{len(self.directed_edges_list)}len undirected_edges_list = " + f"{len(self.undirected_edges_list)}" + ) + for center, dir_edge in zip( + u_edge.nodes, u_edge.info["directed_edge_index"], strict=True + ): + for directed_edges in self.nodes[center].neighbors.values(): + for directed_edge in directed_edges: + if directed_edge.index == dir_edge: + continue + if directed_edge.info["distance"] < cutoff: + line_graph.append( + [ + center, + u_edge.index, + dir_edge, + directed_edge.info["undirected_edge_index"], + directed_edge.index, + ] + ) + return line_graph, undirected2directed + + def undirected2directed(self) -> list[int]: + """The index map from undirected_edge index to one of its directed_edge + index. + """ + return [ + undirected_edge.info["directed_edge_index"][0] + for undirected_edge in self.undirected_edges_list + ] + + def as_dict(self) -> dict: + """Return dictionary serialization of a Graph.""" + return { + "nodes": self.nodes, + "directed_edges": self.directed_edges, + "directed_edges_list": self.directed_edges_list, + "undirected_edges": self.undirected_edges, + "undirected_edges_list": self.undirected_edges_list, + } + + def __repr__(self) -> str: + """Return string representation of the Graph.""" + num_nodes = len(self.nodes) + num_directed_edges = len(self.directed_edges_list) + num_undirected_edges = len(self.undirected_edges_list) + return ( + f"Graph(num_nodes={num_nodes!r}, num_directed_edges={num_directed_edges!r}," + f" num_undirected_edges={num_undirected_edges!r})" + ) + + +class CHGNetGraphConverter: + """Convert a structure to a CHGNet graph. + + https://www.nature.com/articles/s42256-023-00716-3 + + Args: + cutoff (float, optional): Cutoff distance. Defaults to 5.0. + pbc (tuple[int, int, int], optional): Periodic boundary conditions. + Defaults to (1, 1, 1). + neighbor_strategy (str, optional): Strategy to determine neighbors. + Defaults to "k-nearest". + num_classes (int, optional): Number of classes. Defaults to 95. + atom_graph_cutoff (float, optional): Atom graph cutoff. Defaults to 6.0. + bond_graph_cutoff (float, optional): Bond graph cutoff. Defaults to 3.0. + num_cpus (Optional[int], optional): Number of CPUs to use. Defaults to None. + """ + + def __init__( + self, + cutoff: float = 5.0, + pbc: tuple[int, int, int] = (1, 1, 1), + num_classes: int = 95, + atom_graph_cutoff: float = 6.0, # only used for method='chgnet_graph' + bond_graph_cutoff: float = 3.0, # only used for method='chgnet_graph' + num_cpus: Optional[int] = None, + **kwargs, # any additional arguments + ) -> None: + + self.cutoff = cutoff + self.pbc = np.array(pbc, dtype=int) + self.num_classes = num_classes + self.atom_graph_cutoff = atom_graph_cutoff + self.bond_graph_cutoff = bond_graph_cutoff + + self.num_cpus = num_cpus + self.eps = 1e-8 + + def __call__(self, structure: Structure): + if isinstance(structure, Structure): + graph = self.get_graph_by_chgnet_graph(structure) + elif isinstance(structure, list): + graph = p_map( + self.get_graph_by_chgnet_graph, + structure, + num_cpus=self.num_cpus, + ) + # the following code is equivalent to the above line, it is slower, + # but easier to debug. + # graph = [ + # self.get_graph_by_chgnet_graph(struc) for struc in structure + # ] + return graph + + def get_graph_by_chgnet_graph(self, structure: Structure): + n_atoms = len(structure) + + # for graph + center_index, neighbor_index, image, distance = structure.get_neighbor_list( + r=self.atom_graph_cutoff, sites=structure.sites, numerical_tol=1e-08 + ) + graph_utils = GraphUtils([Node(index=idx) for idx in range(n_atoms)]) + for ii, jj, img, dist in zip( + center_index, neighbor_index, image, distance, strict=True + ): + graph_utils.add_edge( + center_index=ii, neighbor_index=jj, image=img, distance=dist + ) + atom_graph, directed2undirected = graph_utils.adjacency_list() + bond_graph, undirected2directed = graph_utils.line_graph_adjacency_list( + cutoff=self.bond_graph_cutoff + ) + n_isolated_atoms = len({*range(n_atoms)} - {*center_index}) + + edge_indices = [ + (idx1, idx2) for idx1, idx2 in zip(center_index, neighbor_index) + ] + if len(edge_indices) == 0: + edge_indices = np.zeros((0, 2), dtype="int64") + if len(bond_graph) == 0: + bond_graph = np.zeros((0, 5)).astype(np.int32) + graph = self.build_pgl_graph( + structure, + edge_indices=edge_indices, + to_jimages=image, + edge_features={ + "atom_graph": np.asarray(atom_graph, dtype=np.int32), + "bond_graph": np.asarray(bond_graph, dtype=np.int32), + "directed2undirected": np.asarray(directed2undirected, dtype=np.int32), + "undirected2directed": np.asarray(undirected2directed, dtype=np.int32), + "directed2undirected_len": np.array( + [len(directed2undirected)], dtype=np.int32 + ), + "undirected2directed_len": np.array( + [len(undirected2directed)], dtype=np.int32 + ), + "image": np.asarray(image, dtype="float32"), + }, + ) + + atom_types = graph.node_feat["atom_types"] + composition_fea = np.bincount(atom_types - 1, minlength=self.num_classes - 1) + composition_fea = composition_fea / atom_types.shape[0] + graph.node_feat["composition_fea"] = np.asarray([composition_fea]).astype( + np.float32 + ) + + graph.edge_feat["bond_vec"] = ( + graph.edge_feat["bond_vec"] / graph.edge_feat["bond_dist"][:, None] + ) + + graph.edge_feat["undirected_bond_lengths"] = graph.edge_feat["bond_dist"][ + undirected2directed + ] + + if len(bond_graph) != 0: + graph.edge_feat["bond_vec_i"] = graph.edge_feat["bond_vec"][ + np.asarray(bond_graph)[:, 2] + ] + graph.edge_feat["bond_vec_j"] = graph.edge_feat["bond_vec"][ + np.asarray(bond_graph)[:, 4] + ] + else: + graph.edge_feat["bond_vec_i"] = np.zeros((0, 3), dtype=np.float32) + graph.edge_feat["bond_vec_j"] = np.zeros((0, 3), dtype=np.float32) + + graph.edge_feat["num_atom_graph"] = np.array([len(atom_graph)], dtype=np.int32) + graph.edge_feat["num_bond_graph"] = np.array([len(bond_graph)], dtype=np.int32) + + if n_isolated_atoms: + graph.node_feat["isolation_flag"] = np.array([1]) + else: + graph.node_feat["isolation_flag"] = np.array([0]) + + return graph + + def build_pgl_graph( + self, + structure: Structure, + edge_indices, + to_jimages, + node_features=None, + edge_features=None, + ): + assert node_features is None or isinstance(node_features, dict) + assert edge_features is None or isinstance(edge_features, dict) + + # get atom types + atom_types = np.array([site.specie.Z for site in structure]) + + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + # convert to numpy array + edge_indices = np.array(edge_indices) + if to_jimages is not None: + to_jimages = np.array(to_jimages) + num_atoms = tuple(atom_types.shape)[0] + + # After multiple graph batch operations by the dataloader, + # graph.num_nodes remains an integer, which is the sum of the number of + # nodes in all graphs + graph = pgl.Graph(edge_indices, num_nodes=num_atoms) + # node features: frac_coords, cart_coords, atom_types + graph.node_feat["frac_coords"] = structure.frac_coords.astype("float32") + graph.node_feat["cart_coords"] = structure.cart_coords.astype("float32") + graph.node_feat["atom_types"] = atom_types + + # graph features: lengths, angles, lattice, num_atoms + # Due to the inability of pgl.graph to store graph level features, + # we will store these features under node_feat + graph.node_feat["lengths"] = lengths + graph.node_feat["angles"] = angles + graph.node_feat["lattice"] = lattice.reshape(1, 3, 3) + # graph.node_feat['num_atoms'] is different from graph.num_nodes + # After multiple graph batch operations by the dataloader, + # graph.node_feat['num_atoms'] is a tensor of shape (batch_size), + # where each value is the number of atoms in the corresponding graph. + graph.node_feat["num_atoms"] = np.array([num_atoms]) + # edge features: pbc_offset, bond_vec, bond_dist + if to_jimages is not None: + graph.edge_feat["pbc_offset"] = to_jimages + offset = np.matmul(to_jimages, lattice) + dst_pos = graph.node_feat["cart_coords"][graph.edges[:, 1]] + offset + src_pos = graph.node_feat["cart_coords"][graph.edges[:, 0]] + bond_vec = dst_pos - src_pos + bond_dist = np.linalg.norm(bond_vec, axis=1) + graph.edge_feat["bond_vec"] = bond_vec.astype("float32") + graph.edge_feat["bond_dist"] = bond_dist.astype("float32") + graph.edge_feat["num_edges"] = np.array([edge_indices.shape[0]]) + + if node_features is not None: + graph.node_feat.update(node_features) + if edge_features is not None: + graph.edge_feat.update(edge_features) + return graph diff --git a/ppmat/models/chgnet/prefitted_weights.py b/ppmat/models/chgnet/prefitted_weights.py new file mode 100644 index 00000000..2bcf1311 --- /dev/null +++ b/ppmat/models/chgnet/prefitted_weights.py @@ -0,0 +1,209 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +MPTrj_prefitted_data = [ + -3.4431, + -0.1279, + -2.83, + -3.4737, + -7.4946, + -8.2354, + -8.1611, + -8.3861, + -5.7498, + -0.0236, + -1.7406, + -1.6788, + -4.2833, + -6.2002, + -6.1315, + -5.8405, + -3.8795, + -0.0703, + -1.5668, + -3.4451, + -7.0549, + -9.1465, + -9.2594, + -9.3514, + -8.9843, + -8.0228, + -6.4955, + -5.6057, + -3.4002, + -0.9217, + -3.2499, + -4.9164, + -4.781, + -5.0191, + -3.3316, + 0.513, + -1.4043, + -3.2175, + -7.4994, + -9.3816, + -10.4386, + -9.9539, + -7.9555, + -8.544, + -7.3245, + -5.2771, + -1.9014, + -0.4034, + -2.6002, + -4.0054, + -4.1156, + -3.9928, + -2.7003, + 2.217, + -1.9671, + -3.718, + -6.8133, + -7.3502, + -6.0712, + -6.1699, + -5.1471, + -6.1925, + -11.5829, + -15.8841, + -5.9994, + -6.0798, + -5.9513, + -6.04, + -5.9773, + -2.5091, + -6.0767, + -10.6666, + -11.8761, + -11.8491, + -10.7397, + -9.61, + -8.4755, + -6.207, + -3.0337, + 0.4726, + -1.6425, + -3.1295, + -3.3328, + -0.1221, + -0.3448, + -0.4364, + -0.1661, + -0.368, + -4.1869, + -8.4233, + -10.0467, + -12.0953, + -12.5228, + -14.253, +] + + +MPF_prefitted_data = [ + -3.4654, + -0.62617, + -3.4622, + -4.7758, + -8.0362, + -8.4038, + -7.7681, + -7.3892, + -4.9472, + -5.4833, + -2.4783, + -2.0202, + -5.1548, + -7.9121, + -6.9135, + -4.6228, + -3.0155, + -2.1285, + -2.3174, + -4.7595, + -8.1742, + -11.421, + -8.9229, + -8.4901, + -8.1664, + -6.5826, + -5.2614, + -4.4841, + -3.2737, + -1.3498, + -3.6264, + -4.6727, + -4.1316, + -3.6755, + -2.803, + 6.4728, + -2.2469, + -4.251, + -10.245, + -11.666, + -11.802, + -8.6551, + -9.3641, + -7.5716, + -5.699, + -4.9716, + -1.8871, + -0.67951, + -2.7488, + -3.7945, + -3.3883, + -2.5588, + -1.9621, + 9.9793, + -2.5566, + -4.8803, + -8.8604, + -9.0537, + -7.9431, + -8.1259, + -6.3212, + -8.3025, + -12.289, + -17.31, + -7.5512, + -8.1959, + -8.3493, + -7.2591, + -8.417, + -3.3873, + -7.6823, + -12.63, + -13.626, + -9.5299, + -11.84, + -9.799, + -7.5561, + -5.469, + -2.6508, + 0.41746, + -2.3255, + -3.483, + -3.1808, + -0.016934, + -0.036191, + -0.010842, + 0.01317, + -0.065371, + -5.4892, + -10.335, + -11.13, + -14.312, + -14.7, + -15.473, +] diff --git a/ppmat/models/comformer/comformer.py b/ppmat/models/comformer/comformer.py new file mode 100644 index 00000000..3fb0c9bd --- /dev/null +++ b/ppmat/models/comformer/comformer.py @@ -0,0 +1,513 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/divelab/AIRS/tree/main/OpenMat/ComFormer + +import math +from typing import Optional +from typing import Tuple +from typing import Union + +import numpy as np +import paddle +import paddle.nn as nn + +from ppmat.models.common.message_passing.message_passing import MessagePassing +from ppmat.utils.scatter import scatter + + +class RBFExpansion(paddle.nn.Layer): + """Expand interatomic distances with radial basis functions.""" + + def __init__( + self, + vmin: float = 0, + vmax: float = 8, + bins: int = 40, + lengthscale: Optional[float] = None, + ): + super().__init__() + self.vmin = vmin + self.vmax = vmax + self.bins = bins + self.register_buffer( + name="centers", + tensor=paddle.linspace(start=self.vmin, stop=self.vmax, num=self.bins), + ) + if lengthscale is None: + self.lengthscale = np.diff(self.centers).mean() + self.gamma = 1 / self.lengthscale + else: + self.lengthscale = lengthscale + self.gamma = 1 / lengthscale**2 + + def forward(self, distance: paddle.Tensor) -> paddle.Tensor: + """Apply RBF expansion to interatomic distance tensor.""" + return paddle.exp( + x=-self.gamma * (distance.unsqueeze(axis=1) - self.centers) ** 2 + ) + + +class ComformerConv(MessagePassing): + _alpha: paddle.Tensor + + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + heads: int = 1, + concat: bool = True, + beta: bool = False, + dropout: float = 0.0, + edge_dim: Optional[int] = None, + root_weight: bool = True, + **kwargs, + ): + kwargs.setdefault("aggr", "add") + super(ComformerConv, self).__init__(node_dim=0, **kwargs) + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.beta = beta and root_weight + self.root_weight = root_weight + self.concat = concat + self.dropout = dropout + self.edge_dim = edge_dim + self._alpha = None + if isinstance(in_channels, int): + in_channels = in_channels, in_channels + self.lin_key = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_query = paddle.nn.Linear( + in_features=in_channels[1], out_features=heads * out_channels + ) + self.lin_value = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_edge = paddle.nn.Linear( + in_features=edge_dim, out_features=heads * out_channels + ) + self.lin_concate = paddle.nn.Linear( + in_features=heads * out_channels, out_features=out_channels + ) + self.lin_msg_update = paddle.nn.Sequential( + paddle.nn.Linear(in_features=out_channels * 3, out_features=out_channels), + paddle.nn.Silu(), + paddle.nn.Linear(in_features=out_channels, out_features=out_channels), + ) + self.softplus = paddle.nn.Softplus() + self.silu = paddle.nn.Silu() + self.key_update = paddle.nn.Sequential( + paddle.nn.Linear(in_features=out_channels * 3, out_features=out_channels), + paddle.nn.Silu(), + paddle.nn.Linear(in_features=out_channels, out_features=out_channels), + ) + self.bn = paddle.nn.BatchNorm1D(num_features=out_channels) + self.bn_att = paddle.nn.BatchNorm1D(num_features=out_channels) + self.sigmoid = paddle.nn.Sigmoid() + + def forward( + self, + x: paddle.Tensor, + edge_index, + edge_attr=None, + ): + H, C = self.heads, self.out_channels + if isinstance(x, paddle.Tensor): + x = (x, x) + query = self.lin_query(x[1]).reshape([-1, H, C]) + key = self.lin_key(x[0]).reshape([-1, H, C]) + value = self.lin_value(x[0]).reshape([-1, H, C]) + out = self.propagate( + edge_index, + query=query, + key=key, + value=value, + edge_attr=edge_attr, + size=None, + ) + out = out.reshape([-1, self.heads * self.out_channels]) + out = self.lin_concate(out) + return self.softplus(x[1] + self.bn(out)) + + def message( + self, + query_i: paddle.Tensor, + key_i: paddle.Tensor, + key_j: paddle.Tensor, + value_j: paddle.Tensor, + value_i: paddle.Tensor, + edge_attr: paddle.Tensor, + ) -> paddle.Tensor: + edge_attr = self.lin_edge(edge_attr).reshape( + [-1, self.heads, self.out_channels] + ) + key_j = self.key_update(paddle.concat(x=(key_i, key_j, edge_attr), axis=-1)) + alpha = query_i * key_j / math.sqrt(self.out_channels) + out = self.lin_msg_update( + paddle.concat(x=(value_i, value_j, edge_attr), axis=-1) + ) + out = out * self.sigmoid( + self.bn_att(alpha.reshape([-1, self.out_channels])).reshape( + [-1, self.heads, self.out_channels] + ) + ) + return out + + +class ComformerConv_edge(paddle.nn.Layer): + def __init__( + self, + in_channels: Union[int, Tuple[int, int]], + out_channels: int, + heads: int = 1, + concat: bool = True, + beta: bool = False, + dropout: float = 0.0, + edge_dim: Optional[int] = None, + root_weight: bool = True, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.heads = heads + self.beta = beta and root_weight + self.root_weight = root_weight + self.concat = concat + self.dropout = dropout + self.edge_dim = edge_dim + if isinstance(in_channels, int): + in_channels = in_channels, in_channels + self.lemb = paddle.nn.Embedding(num_embeddings=3, embedding_dim=32) + self.embedding_dim = 32 + self.lin_key = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_query = paddle.nn.Linear( + in_features=in_channels[1], out_features=heads * out_channels + ) + self.lin_value = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_key_e1 = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_value_e1 = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_key_e2 = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_value_e2 = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_key_e3 = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_value_e3 = paddle.nn.Linear( + in_features=in_channels[0], out_features=heads * out_channels + ) + self.lin_edge = paddle.nn.Linear( + in_features=edge_dim, out_features=heads * out_channels, bias_attr=False + ) + self.lin_edge_len = paddle.nn.Linear( + in_features=in_channels[0] + self.embedding_dim, out_features=in_channels[0] + ) + self.lin_concate = paddle.nn.Linear( + in_features=heads * out_channels, out_features=out_channels + ) + self.lin_msg_update = paddle.nn.Sequential( + paddle.nn.Linear(in_features=out_channels * 3, out_features=out_channels), + paddle.nn.Silu(), + paddle.nn.Linear(in_features=out_channels, out_features=out_channels), + ) + self.silu = paddle.nn.Silu() + self.softplus = paddle.nn.Softplus() + self.key_update = paddle.nn.Sequential( + paddle.nn.Linear(in_features=out_channels * 3, out_features=out_channels), + paddle.nn.Silu(), + paddle.nn.Linear(in_features=out_channels, out_features=out_channels), + ) + self.bn_att = paddle.nn.BatchNorm1D(num_features=out_channels) + self.bn = paddle.nn.BatchNorm1D(num_features=out_channels) + self.sigmoid = paddle.nn.Sigmoid() + + def forward( + self, + edge: paddle.Tensor, + edge_nei_len: paddle.Tensor = None, + edge_nei_angle: paddle.Tensor = None, + ): + H, C = self.heads, self.out_channels + if isinstance(edge, paddle.Tensor): + edge = (edge, edge) + + query_x = ( + self.lin_query(edge[1]) + .reshape([-1, H, C]) + .unsqueeze(axis=1) + .tile(repeat_times=[1, 3, 1, 1]) + ) + key_x = ( + self.lin_key(edge[0]) + .reshape([-1, H, C]) + .unsqueeze(axis=1) + .tile(repeat_times=[1, 3, 1, 1]) + ) + value_x = ( + self.lin_value(edge[0]) + .reshape([-1, H, C]) + .unsqueeze(axis=1) + .tile(repeat_times=[1, 3, 1, 1]) + ) + + key_y = paddle.concat( + x=( + self.lin_key_e1(edge_nei_len[:, 0, :]).reshape([-1, 1, H, C]), + self.lin_key_e2(edge_nei_len[:, 1, :]).reshape([-1, 1, H, C]), + self.lin_key_e3(edge_nei_len[:, 2, :]).reshape([-1, 1, H, C]), + ), + axis=1, + ) + value_y = paddle.concat( + x=( + self.lin_value_e1(edge_nei_len[:, 0, :]).reshape([-1, 1, H, C]), + self.lin_value_e2(edge_nei_len[:, 1, :]).reshape([-1, 1, H, C]), + self.lin_value_e3(edge_nei_len[:, 2, :]).reshape([-1, 1, H, C]), + ), + axis=1, + ) + edge_xy = self.lin_edge(edge_nei_angle).reshape([-1, 3, H, C]) + key = self.key_update(paddle.concat(x=(key_x, key_y, edge_xy), axis=-1)) + alpha = query_x * key / math.sqrt(self.out_channels) + out = self.lin_msg_update(paddle.concat(x=(value_x, value_y, edge_xy), axis=-1)) + out = out * self.sigmoid( + self.bn_att(alpha.reshape([-1, self.out_channels])).reshape( + [-1, 3, self.heads, self.out_channels] + ) + ) + out = out.reshape([-1, 3, self.heads * self.out_channels]) + out = self.lin_concate(out) + out = out.sum(axis=1) + return self.softplus(edge[1] + self.bn(out)) + + +def bond_cosine(r1, r2): + bond_cosine = paddle.sum(x=r1 * r2, axis=-1) / ( + paddle.linalg.norm(x=r1, axis=-1) * paddle.linalg.norm(x=r2, axis=-1) + ) + bond_cosine = paddle.clip(x=bond_cosine, min=-1, max=1) + return bond_cosine + + +class iComformer(nn.Layer): + """Complete and Efficient Graph Transformers for Crystal Material Property + Prediction, https://arxiv.org/pdf/2403.11857 + + Args: + conv_layers (int, optional): The number of ComformerConv layers. + Defaults to 4. + edge_layers (int, optional): The number of ComformerConv_edge layers. + Defaults to 1. + atom_input_features (int, optional): The dimension of input features. + Defaults to 92. + edge_features (int, optional): The dimension of edge feature. Defaults to 256. + triplet_input_features (int, optional): The dimension of triplet feature. + Defaults to 256. + node_features (int, optional): The dimension of node feature. Defaults to 256. + fc_features (int, optional): The input dimension of the fully connected layer. + Defaults to 256. + output_features (int, optional): The output dimension. Defaults to 1. + node_layer_head (int, optional): Heads of the node layer. Defaults to 1. + edge_layer_head (int, optional): Heads of the edge layer. Defaults to 1. + property_name (Optional[str], optional): Property name of the + prediction data. Defaults to "formation_energy_per_atom". + data_mean (float, optional): Mean of the training data. Defaults to 0.0. + data_std (float, optional): Standard deviation of the training data. + Defaults to 1.0. + loss_type (str, optional): Loss type, can be 'mse_loss' or 'l1_loss'. Defaults + to "mse_loss". + """ + + def __init__( + self, + conv_layers: int = 4, + edge_layers: int = 1, + atom_input_features: int = 92, + edge_features: int = 256, + triplet_input_features: int = 256, + node_features: int = 256, + fc_features: int = 256, + output_features: int = 1, + node_layer_head: int = 1, + edge_layer_head: int = 1, + property_name: Optional[str] = "formation_energy_per_atom", + data_mean: float = 0.0, + data_std: float = 1.0, + loss_type: str = "mse_loss", + ): + super().__init__() + self.conv_layers = conv_layers + self.edge_layers = edge_layers + self.atom_input_features = atom_input_features + self.edge_features = edge_features + self.triplet_input_features = triplet_input_features + self.node_features = node_features + self.fc_features = fc_features + self.output_features = output_features + self.node_layer_head = node_layer_head + self.edge_layer_head = edge_layer_head + if isinstance(property_name, list): + self.property_name = property_name[0] + else: + assert isinstance(property_name, str) + self.property_name = property_name + self.register_buffer(tensor=paddle.to_tensor(data_mean), name="data_mean") + self.register_buffer(tensor=paddle.to_tensor(data_std), name="data_std") + + self.atom_embedding = nn.Linear( + in_features=self.atom_input_features, out_features=self.node_features + ) + self.rbf = nn.Sequential( + RBFExpansion(vmin=-4.0, vmax=0.0, bins=self.edge_features), + nn.Linear(in_features=self.edge_features, out_features=self.node_features), + nn.Softplus(), + ) + self.rbf_angle = nn.Sequential( + RBFExpansion(vmin=-1.0, vmax=1.0, bins=self.triplet_input_features), + nn.Linear( + in_features=self.triplet_input_features, out_features=self.node_features + ), + nn.Softplus(), + ) + self.att_layers = nn.LayerList( + sublayers=[ + ComformerConv( + in_channels=self.node_features, + out_channels=self.node_features, + heads=self.node_layer_head, + edge_dim=self.node_features, + ) + for _ in range(self.conv_layers) + ] + ) + self.edge_update_layer = ComformerConv_edge( + in_channels=self.edge_features, + out_channels=self.node_features, + heads=self.edge_layer_head, + edge_dim=self.node_features, + ) + self.fc = nn.Sequential( + nn.Linear(in_features=self.node_features, out_features=self.fc_features), + nn.Silu(), + ) + self.fc_out = nn.Linear( + in_features=self.fc_features, out_features=self.output_features + ) + if loss_type == "mse_loss": + self.loss_fn = paddle.nn.functional.mse_loss + elif loss_type == "l1_loss": + self.loss_fn = paddle.nn.functional.l1_loss + else: + raise ValueError(f"Unknown loss type {loss_type}.") + + def normalize(self, tensor): + return (tensor - self.data_mean) / self.data_std + + def unnormalize(self, tensor): + return tensor * self.data_std + self.data_mean + + def _forward(self, data) -> paddle.Tensor: + # The data in data['graph'] is numpy.ndarray, convert it to paddle.Tensor + data["graph"] = data["graph"].tensor() + + batch_idx = data["graph"].graph_node_id + edges = data["graph"].edges.T.contiguous() + + node_features = self.atom_embedding( + data["graph"].node_feat["node_feat"].cast("float32") + ) + edge_feat = -0.75 / paddle.linalg.norm(x=data["graph"].edge_feat["r"], axis=1) + edge_nei_len = -0.75 / paddle.linalg.norm( + x=data["graph"].edge_feat["nei"], axis=-1 + ) + edge_nei_angle = bond_cosine( + data["graph"].edge_feat["nei"], + data["graph"].edge_feat["r"].unsqueeze(1).tile(repeat_times=[1, 3, 1]), + ) + num_edge = tuple(edge_feat.shape)[0] + edge_features = self.rbf(edge_feat) + edge_nei_len = self.rbf(edge_nei_len.reshape([-1])).reshape([num_edge, 3, -1]) + edge_nei_angle = self.rbf_angle(edge_nei_angle.reshape([-1])).reshape( + [num_edge, 3, -1] + ) + node_features = self.att_layers[0](node_features, edges, edge_features) + + edge_features = self.edge_update_layer( + edge_features, edge_nei_len, edge_nei_angle + ) + for i in range(1, len(self.att_layers)): + node_features = self.att_layers[i](node_features, edges, edge_features) + + features = scatter(node_features, batch_idx, dim=0, reduce="mean") + features = self.fc(features) + result = self.fc_out(features) + return result + + def forward(self, data, return_loss=True, return_prediction=True): + assert ( + return_loss or return_prediction + ), "At least one of return_loss or return_prediction must be True." + pred = self._forward(data) + + loss_dict = {} + if return_loss: + label = data[self.property_name] + label = self.normalize(label) + loss = self.loss_fn( + input=pred, + label=label, + ) + loss_dict["loss"] = loss + + prediction = {} + if return_prediction: + pred = self.unnormalize(pred) + prediction[self.property_name] = pred + return {"loss_dict": loss_dict, "pred_dict": prediction} + + @paddle.no_grad() + def predict(self, graphs): + if isinstance(graphs, list): + results = [] + for graph in graphs: + result = self._forward( + { + "graph": graph, + } + ) + result = self.unnormalize(result).numpy()[0, 0] + result = {self.property_name: result} + results.append(result) + return results + + else: + data = { + "graph": graphs, + } + result = self._forward(data) + result = self.unnormalize(result).numpy()[0, 0] + result = {self.property_name: result} + return result diff --git a/ppmat/models/comformer/comformer_graph_converter.py b/ppmat/models/comformer/comformer_graph_converter.py new file mode 100644 index 00000000..a53d113c --- /dev/null +++ b/ppmat/models/comformer/comformer_graph_converter.py @@ -0,0 +1,409 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/divelab/AIRS/tree/main/OpenMat/ComFormer + +from __future__ import annotations + +from collections import defaultdict +from typing import Optional + +import numpy as np +import pgl +from jarvis.core.atoms import Atoms +from jarvis.core.specie import get_node_attributes +from p_tqdm import p_map +from pymatgen.core.structure import Structure + + +def same_line(a, b): + a_new = a / (sum(a**2) ** 0.5) + b_new = b / (sum(b**2) ** 0.5) + flag = False + if abs(sum(a_new * b_new) - 1.0) < 1e-5: + flag = True + elif abs(sum(a_new * b_new) + 1.0) < 1e-5: + flag = True + else: + flag = False + return flag + + +def same_plane(a, b, c): + flag = False + if abs(np.dot(np.cross(a, b), c)) < 1e-5: + flag = True + return flag + + +def angle_from_array(a, b, lattice): + a_new = np.dot(a, lattice) + b_new = np.dot(b, lattice) + assert a_new.shape == a.shape + value = sum(a_new * b_new) + length = (sum(a_new**2) ** 0.5) * (sum(b_new**2) ** 0.5) + cos = value / length + angle = np.arccos(cos) + return angle / np.pi * 180.0 + + +def correct_coord_sys(a, b, c, lattice): + a_new = np.dot(a, lattice) + b_new = np.dot(b, lattice) + c_new = np.dot(c, lattice) + assert a_new.shape == a.shape + plane_vec = np.cross(a_new, b_new) + value = sum(plane_vec * c_new) + length = (sum(plane_vec**2) ** 0.5) * (sum(c_new**2) ** 0.5) + cos = value / length + angle = np.arccos(cos) + return angle / np.pi * 180.0 <= 90.0 + + +def canonize_edge( + src_id, + dst_id, + src_image, + dst_image, +): + """Compute canonical edge representation. + + Sort vertex ids shift periodic images so the first vertex is in (0,0,0) image. + """ + # store directed edges src_id <= dst_id + if dst_id < src_id: + src_id, dst_id = dst_id, src_id + src_image, dst_image = dst_image, src_image + + # shift periodic images so that src is in (0,0,0) image + if not np.array_equal(src_image, (0, 0, 0)): + shift = src_image + src_image = tuple(np.subtract(src_image, shift)) + dst_image = tuple(np.subtract(dst_image, shift)) + + assert src_image == (0, 0, 0) + + return src_id, dst_id, src_image, dst_image + + +def nearest_neighbor_edges_submit( + atoms=None, + cutoff=8, + max_neighbors=12, + use_canonize=False, + use_lattice=False, +): + """Construct k-NN edge list.""" + lat = atoms.lattice + all_neighbors_now = atoms.get_all_neighbors(r=cutoff) + min_nbrs = min(len(neighborlist) for neighborlist in all_neighbors_now) + + attempt = 0 + if min_nbrs < max_neighbors: + lat = atoms.lattice + if cutoff < max(lat.a, lat.b, lat.c): + r_cut = max(lat.a, lat.b, lat.c) + else: + r_cut = 2 * cutoff + attempt += 1 + return nearest_neighbor_edges_submit( + atoms=atoms, + use_canonize=use_canonize, + cutoff=r_cut, + max_neighbors=max_neighbors, + use_lattice=use_lattice, + ) + + edges = defaultdict(set) + # lattice correction process + r_cut = max(lat.a, lat.b, lat.c) + 1e-2 + all_neighbors = atoms.get_all_neighbors(r=r_cut) + neighborlist = all_neighbors[0] + neighborlist = sorted(neighborlist, key=lambda x: x[2]) + ids = np.array([nbr[1] for nbr in neighborlist]) + images = np.array([nbr[3] for nbr in neighborlist]) + images = images[ids == 0] + lat1 = images[0] + # finding lat2 + start = 1 + for i in range(start, len(images)): + lat2 = images[i] + if not same_line(lat1, lat2): + start = i + break + # finding lat3 + for i in range(start, len(images)): + lat3 = images[i] + if not same_plane(lat1, lat2, lat3): + break + # find the invariant corner + if angle_from_array(lat1, lat2, lat.matrix) > 90.0: + lat2 = -lat2 + if angle_from_array(lat1, lat3, lat.matrix) > 90.0: + lat3 = -lat3 + # find the invariant coord system + if not correct_coord_sys(lat1, lat2, lat3, lat.matrix): + lat1 = -lat1 + lat2 = -lat2 + lat3 = -lat3 + + # lattice correction end + for site_idx, neighborlist in enumerate(all_neighbors_now): + + # sort on distance + neighborlist = sorted(neighborlist, key=lambda x: x[2]) + distances = np.array([nbr[2] for nbr in neighborlist]) + ids = np.array([nbr[1] for nbr in neighborlist]) + images = np.array([nbr[3] for nbr in neighborlist]) + + # find the distance to the k-th nearest neighbor + max_dist = distances[max_neighbors - 1] + ids = ids[distances <= max_dist] + images = images[distances <= max_dist] + distances = distances[distances <= max_dist] + for dst, image in zip(ids, images): + src_id, dst_id, src_image, dst_image = canonize_edge( + site_idx, dst, (0, 0, 0), tuple(image) + ) + if use_canonize: + edges[(src_id, dst_id)].add(dst_image) + else: + edges[(site_idx, dst)].add(tuple(image)) + + if use_lattice: + edges[(site_idx, site_idx)].add(tuple(lat1)) + edges[(site_idx, site_idx)].add(tuple(lat2)) + edges[(site_idx, site_idx)].add(tuple(lat3)) + + return edges, lat1, lat2, lat3 + + +def build_undirected_edgedata( + atoms=None, + edges={}, + a=None, + b=None, + c=None, +): + """Build undirected graph data from edge set.""" + # second pass: construct *undirected* graph + u, v, r, nei, atom_lat = [], [], [], [], [] + v1, v2, v3 = ( + atoms.lattice.cart_coords(a), + atoms.lattice.cart_coords(b), + atoms.lattice.cart_coords(c), + ) + atom_lat.append([v1, v2, v3]) + for (src_id, dst_id), images in edges.items(): + + for dst_image in images: + # fractional coordinate for periodic image of dst + dst_coord = atoms.frac_coords[dst_id] + dst_image + # cartesian displacement vector pointing from src -> dst + d = atoms.lattice.cart_coords(dst_coord - atoms.frac_coords[src_id]) + for uu, vv, dd in [(src_id, dst_id, d), (dst_id, src_id, -d)]: + u.append(uu) + v.append(vv) + r.append(dd) + nei.append([v1, v2, v3]) + + u = np.asarray(u, dtype="int64") + v = np.asarray(v, dtype="int64") + r = np.asarray(r, dtype="float32") + nei = np.asarray(nei, dtype="float32") + atom_lat = np.asarray(atom_lat, dtype="float32") + return u, v, r, nei, atom_lat + + +def atom_multigraph( + atoms=None, + neighbor_strategy="k-nearest", + cutoff=4.0, + max_neighbors=25, + atom_features="cgcnn", + use_canonize: bool = False, + use_lattice: bool = True, +): + if neighbor_strategy == "k-nearest": + edges, a, b, c = nearest_neighbor_edges_submit( + atoms=atoms, + cutoff=cutoff, + max_neighbors=max_neighbors, + use_canonize=use_canonize, + use_lattice=use_lattice, + ) + u, v, r, nei, atom_lat = build_undirected_edgedata(atoms, edges, a, b, c) + else: + raise ValueError("Not implemented yet", neighbor_strategy) + + # # build up atom attribute tensor + sps_features = [] + for _, s in enumerate(atoms.elements): + feat = list(get_node_attributes(s, atom_features=atom_features)) + sps_features.append(feat) + node_features = np.array(sps_features) + atom_lat = atom_lat.repeat(node_features.shape[0], axis=0) + edge_index = np.stack([u, v], axis=1) + + return edge_index, node_features, r, nei, atom_lat + + +class ComformerGraphConverter: + """Convert a structure to a comformer graph. + + https://arxiv.org/pdf/2403.11857 + + Args: + cutoff (float, optional): Cutoff distance. Defaults to 5.0. + pbc (tuple[int, int, int], optional): Periodic boundary conditions. + Defaults to (1, 1, 1). + neighbor_strategy (str, optional): Strategy to determine neighbors. + Defaults to "k-nearest". + max_neighbors (int, optional): Maximum number of neighbors. Defaults to 25. + atom_features (str, optional): Atom features. Defaults to "cgcnn". + use_canonize (bool, optional): Whether to use canonize. Defaults to True. + use_lattice (bool, optional): Whether to use lattice. Defaults to True. + num_cpus (Optional[int], optional): Number of CPUs to use. Defaults to None. + """ + + def __init__( + self, + cutoff: float = 5.0, + pbc: tuple[int, int, int] = (1, 1, 1), + neighbor_strategy: str = "k-nearest", + max_neighbors: int = 25, + atom_features: str = "cgcnn", + use_canonize: bool = True, + use_lattice: bool = True, + num_cpus: Optional[int] = None, + **kwargs, # any additional arguments + ) -> None: + + self.cutoff = cutoff + self.pbc = np.array(pbc, dtype=int) + self.neighbor_strategy = neighbor_strategy + self.max_neighbors = max_neighbors + self.atom_features = atom_features + self.use_canonize = use_canonize + self.use_lattice = use_lattice + + self.num_cpus = num_cpus + self.eps = 1e-8 + + def __call__(self, structure: Structure): + if isinstance(structure, Structure): + graph = self.get_graph_by_comformer_graph(structure) + elif isinstance(structure, list): + graph = p_map( + self.get_graph_by_comformer_graph, + structure, + num_cpus=self.num_cpus, + ) + # the following code is equivalent to the above line, it is slower, + # but easier to debug. + # graph = [ + # self.get_graph_by_comformer_graph(struc) for struc in structure + # ] + return graph + + def get_graph_by_comformer_graph(self, structure: Structure): + # Convert pymatgen structure to jarvis atoms + lattice_mat = structure.lattice.matrix + coords = structure.frac_coords + elements = [site.specie.symbol for site in structure] + atoms = Atoms(lattice_mat=lattice_mat, coords=coords, elements=elements) + edge_index, node_features, r, nei, atom_lat = atom_multigraph( + atoms, + neighbor_strategy=self.neighbor_strategy, + cutoff=self.cutoff, + max_neighbors=self.max_neighbors, + atom_features=self.atom_features, + use_canonize=self.use_canonize, + use_lattice=self.use_lattice, + ) + graph = self.build_pgl_graph( + structure, + edge_indices=edge_index, + to_jimages=None, + node_features={"node_feat": node_features, "atom_lat": atom_lat}, + edge_features={ + "r": r, + "nei": nei, + }, + ) + return graph + + def build_pgl_graph( + self, + structure: Structure, + edge_indices, + to_jimages, + node_features=None, + edge_features=None, + ): + assert node_features is None or isinstance(node_features, dict) + assert edge_features is None or isinstance(edge_features, dict) + + # get atom types + atom_types = np.array([site.specie.Z for site in structure]) + + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + # convert to numpy array + edge_indices = np.array(edge_indices) + if to_jimages is not None: + to_jimages = np.array(to_jimages) + num_atoms = tuple(atom_types.shape)[0] + + # After multiple graph batch operations by the dataloader, + # graph.num_nodes remains an integer, which is the sum of the number of + # nodes in all graphs + graph = pgl.Graph(edge_indices, num_nodes=num_atoms) + # node features: frac_coords, cart_coords, atom_types + graph.node_feat["frac_coords"] = structure.frac_coords.astype("float32") + graph.node_feat["cart_coords"] = structure.cart_coords.astype("float32") + graph.node_feat["atom_types"] = atom_types + + # graph features: lengths, angles, lattice, num_atoms + # Due to the inability of pgl.graph to store graph level features, + # we will store these features under node_feat + graph.node_feat["lengths"] = lengths + graph.node_feat["angles"] = angles + graph.node_feat["lattice"] = lattice.reshape(1, 3, 3) + # graph.node_feat['num_atoms'] is different from graph.num_nodes + # After multiple graph batch operations by the dataloader, + # graph.node_feat['num_atoms'] is a tensor of shape (batch_size), + # where each value is the number of atoms in the corresponding graph. + graph.node_feat["num_atoms"] = np.array([num_atoms]) + # edge features: pbc_offset, bond_vec, bond_dist + if to_jimages is not None: + graph.edge_feat["pbc_offset"] = to_jimages + offset = np.matmul(to_jimages, lattice) + dst_pos = graph.node_feat["cart_coords"][graph.edges[:, 1]] + offset + src_pos = graph.node_feat["cart_coords"][graph.edges[:, 0]] + bond_vec = dst_pos - src_pos + bond_dist = np.linalg.norm(bond_vec, axis=1) + graph.edge_feat["bond_vec"] = bond_vec.astype("float32") + graph.edge_feat["bond_dist"] = bond_dist.astype("float32") + graph.edge_feat["num_edges"] = np.array([edge_indices.shape[0]]) + + if node_features is not None: + graph.node_feat.update(node_features) + if edge_features is not None: + graph.edge_feat.update(edge_features) + return graph diff --git a/ppmat/models/common/activation.py b/ppmat/models/common/activation.py new file mode 100644 index 00000000..939d50b0 --- /dev/null +++ b/ppmat/models/common/activation.py @@ -0,0 +1,118 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import paddle +from ppmat.models.common.e3nn import o3 + + +class ScaledSiLU(paddle.nn.Layer): + def __init__(self): + super().__init__() + self.scale_factor = 1 / 0.6 + self._activation = paddle.nn.Silu() + + def forward(self, x: paddle.Tensor): + return self._activation(x) * self.scale_factor + + +class SiQU(paddle.nn.Layer): + def __init__(self): + super().__init__() + self._activation = paddle.nn.Silu() + + def forward(self, x: paddle.Tensor): + return x * self._activation(x) + +class ScalarActivation(paddle.nn.Layer): + """ + Use the invariant scalar features to gate higher order equivariant features. + Adapted from `e3nn.nn.Gate`. + """ + + def __init__(self, irreps_in, act_scalars, act_gates): + """ + :param irreps_in: input representations + :param act_scalars: scalar activation function + :param act_gates: gate activation function (for higher order features) + """ + super(ScalarActivation, self).__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.num_spherical = len(self.irreps_in) + irreps_scalars = self.irreps_in[0:1] + irreps_gates = irreps_scalars * (self.num_spherical - 1) + irreps_gated = self.irreps_in[1:] + self.act_scalars = Activation(irreps_scalars, [act_scalars]) + self.act_gates = Activation( + irreps_gates, [act_gates] * (self.num_spherical - 1) + ) + self.extract = Extract( + self.irreps_in, + [irreps_scalars, irreps_gated], + instructions=[(0,), tuple(range(1, self.irreps_in.lmax + 1))], + ) + self.mul = o3.ElementwiseTensorProduct(irreps_gates, irreps_gated) + + def forward(self, features): + scalars, gated = self.extract(features) + scalars_out = self.act_scalars(scalars) + if tuple(gated.shape)[-1]: + gates = self.act_gates( + scalars.tile(repeat_times=[1, self.num_spherical - 1]) + ) + gated_out = self.mul(gates, gated) + features = paddle.concat(x=[scalars_out, gated_out], axis=-1) + else: + features = scalars_out + return features + + +class NormActivation(paddle.nn.Layer): + """ + Use the norm of the higher order equivariant features to gate themselves. + Idea from the TFN paper. + """ + + def __init__( + self, + irreps_in, + act_scalars=paddle.nn.functional.silu, + act_vectors=paddle.nn.functional.sigmoid, + ): + """ + :param irreps_in: input representations + :param act_scalars: scalar activation function + :param act_vectors: vector activation function (for the norm of higher order features) + """ + super(NormActivation, self).__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.scalar_irreps = self.irreps_in[0:1] + self.vector_irreps = self.irreps_in[1:] + self.act_scalars = act_scalars + self.act_vectors = act_vectors + self.scalar_idx = self.irreps_in[0].mul + inner_out = o3.Irreps([(mul, (0, 1)) for mul, _ in self.vector_irreps]) + self.inner_prod = o3.TensorProduct( + self.vector_irreps, + self.vector_irreps, + inner_out, + [(i, i, i, "uuu", False) for i in range(len(self.vector_irreps))], + ) + self.mul = o3.ElementwiseTensorProduct(inner_out, self.vector_irreps) + + def forward(self, features): + scalars = self.act_scalars(features[..., : self.scalar_idx]) + vectors = features[..., self.scalar_idx :] + norm = paddle.sqrt(x=self.inner_prod(vectors, vectors) + 1e-08) + act = self.act_vectors(norm) + vectors_out = self.mul(act, vectors) + return paddle.concat(x=[scalars, vectors_out], axis=-1) \ No newline at end of file diff --git a/ppmat/models/common/basis_utils.py b/ppmat/models/common/basis_utils.py new file mode 100644 index 00000000..51eeb1be --- /dev/null +++ b/ppmat/models/common/basis_utils.py @@ -0,0 +1,274 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/basis_utils.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" +from typing import Any +from typing import List + +import numpy as np +import sympy as sym +from scipy import special as sp +from scipy.optimize import brentq + + +def Jn(r: np.array, n: int) -> np.array: + """ + numerical spherical bessel functions of order n + """ + return sp.spherical_jn(n, r) + + +def Jn_zeros(n: int, k: int) -> np.array: + """ + Compute the first k zeros of the spherical bessel functions up to order n (excluded) + """ + zerosj = np.zeros((n, k), dtype="float32") + zerosj[0] = np.arange(1, k + 1) * np.pi + points = np.arange(1, k + n) * np.pi + racines = np.zeros(k + n - 1, dtype="float32") + for i in range(1, n): + for j in range(k + n - 1 - i): + foo = brentq(Jn, points[j], points[j + 1], (i,)) + racines[j] = foo + points = racines + zerosj[i][:k] = racines[:k] + return zerosj + + +def spherical_bessel_formulas(n: int) -> List[Any]: + """ + Computes the sympy formulas for the spherical bessel functions up to order n + (excluded) + """ + x = sym.symbols("x") + j = [sym.sin(x) / x] + a = sym.sin(x) / x + for i in range(1, n): + b = sym.diff(a, x) / x + j += [sym.simplify(b * (-x) ** i)] + a = sym.simplify(b) + return j + + +def bessel_basis(n: int, k: int) -> List[Any]: + """ + Compute the sympy formulas for the normalized and rescaled spherical bessel + functions up to order n (excluded) and maximum frequency k (excluded). + + Returns: + bess_basis: list + Bessel basis formulas taking in a single argument x. + Has length n where each element has length k. -> In total n*k many. + """ + zeros = Jn_zeros(n, k) + normalizer = [] + for order in range(n): + normalizer_tmp = [] + for i in range(k): + normalizer_tmp += [0.5 * Jn(zeros[order, i], order + 1) ** 2] + normalizer_tmp = 1 / np.array(normalizer_tmp) ** 0.5 + normalizer += [normalizer_tmp] + f = spherical_bessel_formulas(n) + x = sym.symbols("x") + bess_basis = [] + for order in range(n): + bess_basis_tmp = [] + for i in range(k): + bess_basis_tmp += [ + sym.simplify( + normalizer[order][i] * f[order].subs(x, zeros[order, i] * x) + ) + ] + bess_basis += [bess_basis_tmp] + return bess_basis + + +def sph_harm_prefactor(l_degree: int, m_order: int) -> float: + """Computes the constant pre-factor for the spherical harmonic of degree l and + order m. + + Parameters + ---------- + l_degree: int + Degree of the spherical harmonic. l >= 0 + m_order: int + Order of the spherical harmonic. -l <= m <= l + + Returns + ------- + factor: float + + """ + return ( + (2 * l_degree + 1) + / (4 * np.pi) + * np.math.factorial(l_degree - abs(m_order)) + / np.math.factorial(l_degree + abs(m_order)) + ) ** 0.5 + + +def associated_legendre_polynomials( + L_maxdegree: int, zero_m_only: bool = True, pos_m_only: bool = True +) -> List[List[Any]]: + """Computes string formulas of the associated legendre polynomials up to degree L + (excluded). + + Parameters + ---------- + L_maxdegree: int + Degree up to which to calculate the associated legendre polynomials (degree + L is excluded). + zero_m_only: bool + If True only calculate the polynomials for the polynomials where m=0. + pos_m_only: bool + If True only calculate the polynomials for the polynomials where m>=0. + Overwritten by zero_m_only. + + Returns + ------- + polynomials: list + Contains the sympy functions of the polynomials (in total L many if + zero_m_only is True else L^2 many). + """ + z = sym.symbols("z") + P_l_m = [ + [sym.Integer(0) for _ in range(2 * l_degree + 1)] + for l_degree in range(L_maxdegree) + ] + P_l_m[0][0] = sym.Integer(1) + if L_maxdegree > 0: + if zero_m_only: + P_l_m[1][0] = z + for l_degree in range(2, L_maxdegree): + P_l_m[l_degree][0] = sym.simplify( + ( + (2 * l_degree - 1) * z * P_l_m[l_degree - 1][0] + - (l_degree - 1) * P_l_m[l_degree - 2][0] + ) + / l_degree + ) + else: + for l_degree in range(1, L_maxdegree): + P_l_m[l_degree][l_degree] = sym.simplify( + (1 - 2 * l_degree) + * (1 - z**2) ** 0.5 + * P_l_m[l_degree - 1][l_degree - 1] + ) + for m_order in range(0, L_maxdegree - 1): + P_l_m[m_order + 1][m_order] = sym.simplify( + (2 * m_order + 1) * z * P_l_m[m_order][m_order] + ) + for l_degree in range(2, L_maxdegree): + for m_order in range(l_degree - 1): + P_l_m[l_degree][m_order] = sym.simplify( + ( + (2 * l_degree - 1) * z * P_l_m[l_degree - 1][m_order] + - (l_degree + m_order - 1) * P_l_m[l_degree - 2][m_order] + ) + / (l_degree - m_order) + ) + if not pos_m_only: + for l_degree in range(1, L_maxdegree): + for m_order in range(1, l_degree + 1): + P_l_m[l_degree][-m_order] = sym.simplify( + (-1) ** m_order + * np.math.factorial(l_degree - m_order) + / np.math.factorial(l_degree + m_order) + * P_l_m[l_degree][m_order] + ) + return P_l_m + + +def real_sph_harm( + L_maxdegree: int, use_theta: bool, use_phi: bool = True, zero_m_only: bool = True +) -> List[List[Any]]: + """ + Computes formula strings of the the real part of the spherical harmonics up to + degree L (excluded).Variables are either spherical coordinates phi and theta (or + cartesian coordinates x,y,z) on the UNIT SPHERE. + + Parameters + ---------- + L_maxdegree: int + Degree up to which to calculate the spherical harmonics (degree L is + excluded). + use_theta: bool + - True: Expects the input of the formula strings to contain theta. + - False: Expects the input of the formula strings to contain z. + use_phi: bool + - True: Expects the input of the formula strings to contain phi. + - False: Expects the input of the formula strings to contain x and y. + Does nothing if zero_m_only is True + zero_m_only: bool + If True only calculate the harmonics where m=0. + + Returns + ------- + Y_lm_real: list + Computes formula strings of the the real part of the spherical harmonics up + to degree L (where degree L is not excluded). + In total L^2 many sph harm exist up to degree L (excluded). However, if + zero_m_only only is True then the total count is reduced to be only L many. + """ + z = sym.symbols("z") + P_l_m = associated_legendre_polynomials(L_maxdegree, zero_m_only) + if zero_m_only: + Y_l_m = [sym.zeros(1) for l_degree in range(L_maxdegree)] + else: + Y_l_m = [(sym.zeros(1) * (2 * l_degree + 1)) for l_degree in range(L_maxdegree)] + if use_theta: + theta = sym.symbols("theta") + for l_degree in range(L_maxdegree): + for m_order in range(len(P_l_m[l_degree])): + P_l_m[l_degree][m_order] = P_l_m[l_degree][m_order].subs( + z, sym.cos(theta) + ) + for l_degree in range(L_maxdegree): + Y_l_m[l_degree][0] = sym.simplify( + sph_harm_prefactor(l_degree, 0) * P_l_m[l_degree][0] + ) + if not zero_m_only: + phi = sym.symbols("phi") + for l_degree in range(1, L_maxdegree): + for m_order in range(1, l_degree + 1): + Y_l_m[l_degree][m_order] = sym.simplify( + 2**0.5 + * (-1) ** m_order + * sph_harm_prefactor(l_degree, m_order) + * P_l_m[l_degree][m_order] + * sym.cos(m_order * phi) + ) + for m_order in range(1, l_degree + 1): + Y_l_m[l_degree][-m_order] = sym.simplify( + 2**0.5 + * (-1) ** m_order + * sph_harm_prefactor(l_degree, -m_order) + * P_l_m[l_degree][m_order] + * sym.sin(m_order * phi) + ) + if not use_phi: + x = sym.symbols("x") + y = sym.symbols("y") + for l_degree in range(L_maxdegree): + for m_order in range(len(Y_l_m[l_degree])): + assert isinstance(Y_l_m[l_degree][m_order], int) + Y_l_m[l_degree][m_order] = sym.simplify( + Y_l_m[l_degree][m_order].subs(phi, sym.atan2(y, x)) + ) + return Y_l_m diff --git a/ppmat/models/common/e3nn/__init__.py b/ppmat/models/common/e3nn/__init__.py new file mode 100644 index 00000000..261ee69d --- /dev/null +++ b/ppmat/models/common/e3nn/__init__.py @@ -0,0 +1,44 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__version__ = "0.5.1" +from typing import Dict + +_OPT_DEFAULTS: Dict[str, bool] = dict( + specialized_code=True, optimize_einsums=True, jit_script_fx=True +) + + +def set_optimization_defaults(**kwargs) -> None: + """Globally set the default optimization settings. + + Parameters + ---------- + **kwargs + Keyword arguments to set the default optimization settings. + """ + for k, v in kwargs.items(): + if k not in _OPT_DEFAULTS: + raise ValueError(f"Unknown optimization option: {k}") + _OPT_DEFAULTS[k] = v + + +def get_optimization_defaults() -> Dict[str, bool]: + """Get the global default optimization settings.""" + return dict(_OPT_DEFAULTS) + + +from . import io as io +from . import nn as nn +from . import o3 as o3 diff --git a/ppmat/models/common/e3nn/io/__init__.py b/ppmat/models/common/e3nn/io/__init__.py new file mode 100644 index 00000000..9fd6ae61 --- /dev/null +++ b/ppmat/models/common/e3nn/io/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._cartesian_tensor import CartesianTensor +from ._spherical_tensor import SphericalTensor + +__all__ = ["CartesianTensor", "SphericalTensor"] \ No newline at end of file diff --git a/ppmat/models/common/e3nn/io/_cartesian_tensor.py b/ppmat/models/common/e3nn/io/_cartesian_tensor.py new file mode 100644 index 00000000..787b2ebe --- /dev/null +++ b/ppmat/models/common/e3nn/io/_cartesian_tensor.py @@ -0,0 +1,135 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Optional + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.paddle_utils import * + + +class CartesianTensor(o3.Irreps): + """representation of a cartesian tensor into irreps + + Parameters + ---------- + formula : str + + Examples + -------- + + >>> import torch + >>> CartesianTensor("ij=-ji") + 1x1e + + >>> x = CartesianTensor("ijk=-jik=-ikj") + >>> x.from_cartesian(torch.ones(3, 3, 3)) + tensor([0.]) + + >>> x.from_vectors(torch.ones(3), torch.ones(3), torch.ones(3)) + tensor([0.]) + + >>> x = CartesianTensor("ij=ji") + >>> t = torch.arange(9).to(torch.float).view(3,3) + >>> y = x.from_cartesian(t) + >>> z = x.to_cartesian(y) + >>> torch.allclose(z, (t + t.T)/2, atol=1e-5) + True + """ + + formula: str + indices: str + + def __new__(cls, formula): + indices = formula.split("=")[0].replace("-", "") + rtp = o3.ReducedTensorProducts(formula, **{i: "1o" for i in indices}) + ret = super().__new__(cls, rtp.irreps_out) + ret.formula = formula + ret.indices = indices + return ret + + def from_cartesian(self, data, rtp=None): + """convert cartesian tensor into irreps + + Parameters + ---------- + data : `torch.Tensor` + cartesian tensor of shape ``(..., 3, 3, 3, ...)`` + + Returns + ------- + `torch.Tensor` + irreps tensor of shape ``(..., self.dim)`` + """ + if rtp is None: + rtp = self.reduced_tensor_products(data) + Q = rtp.change_of_basis.flatten(-len(self.indices)) + return data.flatten(start_axis=-len(self.indices)) @ Q.T + + def from_vectors(self, *xs, rtp=None): + """convert :math:`x_1 \\otimes x_2 \\otimes x_3 \\otimes \\dots` + + Parameters + ---------- + xs : list of `torch.Tensor` + list of vectors of shape ``(..., 3)`` + + Returns + ------- + `torch.Tensor` + irreps tensor of shape ``(..., self.dim)`` + """ + if rtp is None: + rtp = self.reduced_tensor_products(xs[0]) + return rtp(*xs) + + def to_cartesian(self, data, rtp=None): + """convert irreps tensor to cartesian tensor + + This is the symmetry-aware inverse operation of ``from_cartesian()``. + + Parameters + ---------- + data : `torch.Tensor` + irreps tensor of shape ``(..., D)``, where D is the dimension of the irreps, + i.e. ``D=self.dim``. + + Returns + ------- + `torch.Tensor` + cartesian tensor of shape ``(..., 3, 3, 3, ...)`` + """ + if rtp is None: + rtp = self.reduced_tensor_products(data) + Q = rtp.change_of_basis + cartesian_tensor = data @ Q.flatten(start_axis=-len(self.indices)) + shape = list(tuple(data.shape)[:-1]) + list(tuple(Q.shape)[1:]) + cartesian_tensor = cartesian_tensor.view(shape) + return cartesian_tensor + + def reduced_tensor_products( + self, data: Optional[paddle.Tensor] = None + ) -> o3.ReducedTensorProducts: + """reduced tensor products + + Returns + ------- + `e3nn.ReducedTensorProducts` + reduced tensor products + """ + rtp = o3.ReducedTensorProducts(self.formula, **{i: "1o" for i in self.indices}) + if data is not None: + rtp = rtp.to(device=data.place, dtype=data.dtype) + return rtp diff --git a/ppmat/models/common/e3nn/io/_spherical_tensor.py b/ppmat/models/common/e3nn/io/_spherical_tensor.py new file mode 100644 index 00000000..bbf3bcb2 --- /dev/null +++ b/ppmat/models/common/e3nn/io/_spherical_tensor.py @@ -0,0 +1,439 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections import namedtuple +from math import pi + +import paddle +import scipy.signal + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.o3 import FromS2Grid +from ppmat.models.common.e3nn.o3 import ToS2Grid +from ppmat.models.common.e3nn.paddle_utils import * + + +def _find_peaks_2d(x): + iii = [] + for i in range(tuple(x.shape)[0]): + jj, _ = scipy.signal.find_peaks(x[i, :]) + iii += [(i, j) for j in jj] + jjj = [] + for j in range(tuple(x.shape)[1]): + ii, _ = scipy.signal.find_peaks(x[:, j]) + jjj += [(i, j) for i in ii] + return list(set(iii).intersection(set(jjj))) + + +class SphericalTensor(o3.Irreps): + """representation of a signal on the sphere + + A `SphericalTensor` contains the coefficients :math:`A^l` of a function :math:`f` defined on the sphere + + .. math:: + f(x) = \\sum_{l=0}^{l_\\mathrm{max}} A^l \\cdot Y^l(x) + + + The way this function is transformed by parity :math:`f \\longrightarrow P f` is described by the two parameters :math:`p_v` + and :math:`p_a` + + .. math:: + (P f)(x) &= p_v f(p_a x) + + &= \\sum_{l=0}^{l_\\mathrm{max}} p_v p_a^l A^l \\cdot Y^l(x) + + + Parameters + ---------- + lmax : int + :math:`l_\\mathrm{max}` + + p_val : {+1, -1} + :math:`p_v` + + p_arg : {+1, -1} + :math:`p_a` + + + Examples + -------- + + >>> SphericalTensor(3, 1, 1) + 1x0e+1x1e+1x2e+1x3e + + >>> SphericalTensor(3, 1, -1) + 1x0e+1x1o+1x2e+1x3o + """ + + def __new__(cls, lmax, p_val, p_arg): + return super().__new__( + cls, [(1, (l, p_val * p_arg**l)) for l in range(lmax + 1)] + ) + + def with_peaks_at(self, vectors, values=None): + """Create a spherical tensor with peaks + + The peaks are located in :math:`\\vec r_i` and have amplitude :math:`\\|\\vec r_i \\|` + + Parameters + ---------- + vectors : `torch.Tensor` + :math:`\\vec r_i` tensor of shape ``(N, 3)`` + + values : `torch.Tensor`, optional + value on the peak, tensor of shape ``(N)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(self.dim,)`` + + Examples + -------- + >>> s = SphericalTensor(4, 1, -1) + >>> pos = torch.tensor([ + ... [1.0, 0.0, 0.0], + ... [3.0, 4.0, 0.0], + ... ]) + >>> x = s.with_peaks_at(pos) + >>> s.signal_xyz(x, pos).long() + tensor([1, 5]) + + >>> val = torch.tensor([ + ... -1.5, + ... 2.0, + ... ]) + >>> x = s.with_peaks_at(pos, val) + >>> s.signal_xyz(x, pos) + tensor([-1.5000, 2.0000]) + """ + if values is not None: + vectors, values = paddle.broadcast_tensors( + input=[vectors, values[..., None]] + ) + values = values[..., 0] + if vectors.size == 0: + return paddle.zeros(shape=tuple(vectors.shape)[:-2] + (self.dim,)) + assert ( + self[0][1].p == 1 + ), "since the value is set by the radii who is even, p_val has to be 1" + assert vectors.dim() == 2 and tuple(vectors.shape)[1] == 3 + if values is None: + values = vectors.norm(axis=1) + vectors = vectors[values != 0] + values = values[values != 0] + coeff = o3.spherical_harmonics(self, vectors, normalize=True) + A = paddle.einsum("ai,bi->ab", coeff, coeff) + solution = paddle.linalg.lstsq(A, values).solution.reshape(-1) + assert ( + values - A @ solution + ).abs().max_func() < 1e-05 * values.abs().max_func() + return solution @ coeff + + def sum_of_diracs( + self, positions: paddle.Tensor, values: paddle.Tensor + ) -> paddle.Tensor: + """Sum (almost-) dirac deltas + + .. math:: + + f(x) = \\sum_i v_i \\delta^L(\\vec r_i) + + where :math:`\\delta^L` is the apporximation of a dirac delta. + + Parameters + ---------- + positions : `torch.Tensor` + :math:`\\vec r_i` tensor of shape ``(..., N, 3)`` + + values : `torch.Tensor` + :math:`v_i` tensor of shape ``(..., N)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., self.dim)`` + + Examples + -------- + >>> s = SphericalTensor(7, 1, -1) + >>> pos = torch.tensor([ + ... [1.0, 0.0, 0.0], + ... [0.0, 1.0, 0.0], + ... ]) + >>> val = torch.tensor([ + ... -1.0, + ... 1.0, + ... ]) + >>> x = s.sum_of_diracs(pos, val) + >>> s.signal_xyz(x, torch.eye(3)).mul(10.0).round() + tensor([-10., 10., -0.]) + + >>> s.sum_of_diracs(torch.empty(1, 0, 2, 3), torch.empty(2, 0, 1)).shape + torch.Size([2, 0, 64]) + + >>> s.sum_of_diracs(torch.randn(1, 3, 2, 3), torch.randn(2, 1, 1)).shape + torch.Size([2, 3, 64]) + """ + positions, values = paddle.broadcast_tensors( + input=[positions, values[..., None]] + ) + values = values[..., 0] + if positions.size == 0: + return paddle.zeros(shape=tuple(values.shape)[:-1] + (self.dim,)) + y = o3.spherical_harmonics(self, positions, True) + v = values[..., None] + return 4 * pi / (self.lmax + 1) ** 2 * (y * v).sum(axis=-2) + + def from_samples_on_s2( + self, positions: paddle.Tensor, values: paddle.Tensor, res=100 + ) -> paddle.Tensor: + """Convert a set of position on the sphere and values into a spherical tensor + + Parameters + ---------- + positions : `torch.Tensor` + tensor of shape ``(..., N, 3)`` + + values : `torch.Tensor` + tensor of shape ``(..., N)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., self.dim)`` + + Examples + -------- + >>> s = SphericalTensor(2, 1, 1) + >>> pos = torch.tensor([ + ... [ + ... [0.0, 0.0, 1.0], + ... [0.0, 0.0, -1.0], + ... ], + ... [ + ... [0.0, 1.0, 0.0], + ... [0.0, -1.0, 0.0], + ... ], + ... ], dtype=torch.float64) + >>> val = torch.tensor([ + ... [ + ... 1.0, + ... -1.0, + ... ], + ... [ + ... 1.0, + ... -1.0, + ... ], + ... ], dtype=torch.float64) + >>> s.from_samples_on_s2(pos, val, res=200).long() + tensor([[0, 0, 0, 3, 0, 0, 0, 0, 0], + [0, 0, 3, 0, 0, 0, 0, 0, 0]]) + + >>> pos = torch.empty(2, 0, 10, 3) + >>> val = torch.empty(2, 0, 10) + >>> s.from_samples_on_s2(pos, val) + tensor([], size=(2, 0, 9)) + + """ + positions, values = paddle.broadcast_tensors( + input=[positions, values[..., None]] + ) + values = values[..., 0] + if positions.size == 0: + return paddle.zeros(shape=tuple(values.shape)[:-1] + (self.dim,)) + positions = paddle.nn.functional.normalize(x=positions, axis=-1) + size = tuple(positions.shape)[:-2] + n = tuple(positions.shape)[-2] + positions = positions.reshape(-1, n, 3) + values = values.reshape(-1, n) + s2 = FromS2Grid( + res=res, + lmax=self.lmax, + normalization="integral", + dtype=values.dtype, + device=values.place, + ) + pos = s2.grid.reshape(1, -1, 3) + cd = paddle.cdist(x=pos, y=positions) + i = paddle.arange(end=len(values)).view(-1, 1) + j = cd.argmin(axis=2) + val = values[i, j] + val = val.reshape(*size, s2.res_beta, s2.res_alpha) + return s2(val) + + def norms(self, signal): + """The norms of each l component + + Parameters + ---------- + signal : `torch.Tensor` + tensor of shape ``(..., dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., lmax+1)`` + + Examples + -------- + Examples + -------- + >>> s = SphericalTensor(1, 1, -1) + >>> s.norms(torch.tensor([1.5, 0.0, 3.0, 4.0])) + tensor([1.5000, 5.0000]) + """ + i = 0 + norms = [] + for _, ir in self: + norms += [signal[..., i : i + ir.dim].norm(axis=-1)] + i += ir.dim + return paddle.stack(x=norms, axis=-1) + + def signal_xyz(self, signal, r): + """Evaluate the signal on given points on the sphere + + .. math:: + + f(\\vec x / \\|\\vec x\\|) + + Parameters + ---------- + signal : `torch.Tensor` + tensor of shape ``(*A, self.dim)`` + + r : `torch.Tensor` + tensor of shape ``(*B, 3)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(*A, *B)`` + + Examples + -------- + >>> s = SphericalTensor(3, 1, -1) + >>> s.signal_xyz(s.randn(2, 1, 3, -1), torch.randn(2, 4, 3)).shape + torch.Size([2, 1, 3, 2, 4]) + """ + sh = o3.spherical_harmonics(self, r, normalize=True) + dim = (self.lmax + 1) ** 2 + output = paddle.einsum( + "bi,ai->ab", sh.reshape(-1, dim), signal.reshape(-1, dim) + ) + return output.reshape(tuple(signal.shape)[:-1] + tuple(r.shape)[:-1]) + + def signal_on_grid(self, signal, res=100, normalization="integral"): + """Evaluate the signal on a grid on the sphere""" + Ret = namedtuple("Return", "grid, values") + s2 = ToS2Grid(lmax=self.lmax, res=res, normalization=normalization) + return Ret(s2.grid, s2(signal)) + + def plotly_surface( + self, + signals, + centers=None, + res=100, + radius=True, + relu=False, + normalization="integral", + ): + """Create traces for plotly + + Examples + -------- + >>> import plotly.graph_objects as go + >>> x = SphericalTensor(4, +1, +1) + >>> traces = x.plotly_surface(x.randn(-1)) + >>> traces = [go.Surface(**d) for d in traces] + >>> fig = go.Figure(data=traces) + """ + signals = signals.reshape(-1, self.dim) + if centers is None: + centers = [None] * len(signals) + else: + centers = centers.reshape(-1, 3) + traces = [] + for signal, center in zip(signals, centers): + r, f = self.plot(signal, center, res, radius, relu, normalization) + traces += [ + dict( + x=r[:, :, 0].numpy(), + y=r[:, :, 1].numpy(), + z=r[:, :, 2].numpy(), + surfacecolor=f.numpy(), + ) + ] + return traces + + def plot( + self, + signal, + center=None, + res=100, + radius=True, + relu=False, + normalization="integral", + ): + """Create surface in order to make a plot""" + assert signal.dim() == 1 + r, f = self.signal_on_grid(signal, res, normalization) + f = f.relu() if relu else f + r[0] = paddle.to_tensor(data=[0.0, 1.0, 0.0], dtype=r.dtype) + r[-1] = paddle.to_tensor(data=[0.0, -1.0, 0.0], dtype=r.dtype) + f[0] = f[0].mean() + f[-1] = f[-1].mean() + r = paddle.concat(x=[r, r[:, :1]], axis=1) + f = paddle.concat(x=[f, f[:, :1]], axis=1) + if radius: + r *= f.abs().unsqueeze(axis=-1) + if center is not None: + r += center + return r, f + + def find_peaks(self, signal, res=100): + """Locate peaks on the sphere + + Examples + -------- + >>> s = SphericalTensor(4, 1, -1) + >>> pos = torch.tensor([ + ... [4.0, 0.0, 4.0], + ... [0.0, 5.0, 0.0], + ... ]) + >>> x = s.with_peaks_at(pos) + >>> pos, val = s.find_peaks(x) + >>> pos[val > 4.0].mul(10).round().abs() + tensor([[ 7., 0., 7.], + [ 0., 10., 0.]]) + >>> val[val > 4.0].mul(10).round().abs() + tensor([57., 50.]) + """ + x1, f1 = self.signal_on_grid(signal, res) + abc = paddle.to_tensor(data=[pi / 2, pi / 2, pi / 2]) + R = o3.angles_to_matrix(*abc) + D = self.D_from_matrix(R) + r_signal = D @ signal + rx2, f2 = self.signal_on_grid(r_signal, res) + x2 = paddle.einsum("ij,baj->bai", R.T, rx2) + ij = _find_peaks_2d(f1) + x1p = paddle.stack(x=[x1[i, j] for i, j in ij]) + f1p = paddle.stack(x=[f1[i, j] for i, j in ij]) + ij = _find_peaks_2d(f2) + x2p = paddle.stack(x=[x2[i, j] for i, j in ij]) + f2p = paddle.stack(x=[f2[i, j] for i, j in ij]) + mask = paddle.cdist(x=x1p, y=x2p) < 2 * pi / res + x = paddle.concat(x=[x1p[mask.sum(axis=1) == 0], x2p]) + f = paddle.concat(x=[f1p[mask.sum(axis=1) == 0], f2p]) + return x, f diff --git a/ppmat/models/common/e3nn/math/__init__.py b/ppmat/models/common/e3nn/math/__init__.py new file mode 100644 index 00000000..d6e753a8 --- /dev/null +++ b/ppmat/models/common/e3nn/math/__init__.py @@ -0,0 +1,35 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._linalg import complete_basis +from ._linalg import direct_sum +from ._linalg import orthonormalize +from ._normalize_activation import moment +from ._normalize_activation import normalize2mom +from ._reduce import germinate_formulas +from ._reduce import reduce_permutation +from ._soft_one_hot_linspace import soft_one_hot_linspace +from ._soft_unit_step import soft_unit_step + +__all__ = [ + "complete_basis", + "direct_sum", + "orthonormalize", + "moment", + "normalize2mom", + "soft_unit_step", + "soft_one_hot_linspace", + "germinate_formulas", + "reduce_permutation", +] diff --git a/ppmat/models/common/e3nn/math/_linalg.py b/ppmat/models/common/e3nn/math/_linalg.py new file mode 100644 index 00000000..715a18c5 --- /dev/null +++ b/ppmat/models/common/e3nn/math/_linalg.py @@ -0,0 +1,110 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Tuple + +import paddle + + +def direct_sum(*matrices): + """Direct sum of matrices, put them in the diagonal""" + front_indices = tuple(matrices[0].shape)[:-2] + m = sum(x.shape[-2] for x in matrices) + n = sum(x.shape[-1] for x in matrices) + total_shape = list(front_indices) + [m, n] + out = paddle.zeros(shape=total_shape, dtype=matrices[0].dtype) + i, j = 0, 0 + for x in matrices: + m, n = tuple(x.shape)[-2:] + out[..., i : i + m, j : j + n] = x + i += m + j += n + return out + + +def orthonormalize( + original: paddle.Tensor, eps: float = 1e-09 +) -> Tuple[paddle.Tensor, paddle.Tensor]: + """orthonomalize vectors + + Parameters + ---------- + original : `torch.Tensor` + list of the original vectors :math:`x` + + eps : float + a small number + + Returns + ------- + final : `torch.Tensor` + list of orthonomalized vectors :math:`y` + + matrix : `torch.Tensor` + the matrix :math:`A` such that :math:`y = A x` + """ + assert original.dim() == 2 + dim = tuple(original.shape)[1] + final = [] + matrix = [] + for i, x in enumerate(original): + cx = paddle.zeros(shape=len(original), dtype=x.dtype) + cx[i] = 1 + for j, y in enumerate(final): + c = paddle.dot(x=x, y=y) + x = x - c * y + cx = cx - c * matrix[j] + if x.norm() > 2 * eps: + c = 1 / x.norm() + x = c * x + cx = c * cx + x[x.abs() < eps] = 0 + cx[cx.abs() < eps] = 0 + c = x[x.nonzero()[0, 0]].sign() + x = c * x + cx = c * cx + final += [x] + matrix += [cx] + final = ( + paddle.stack(x=final) + if len(final) > 0 + else paddle.zeros(shape=(0, dim), dtype=original.dtype) + ) + matrix = ( + paddle.stack(x=matrix) + if len(matrix) > 0 + else paddle.zeros(shape=(0, len(original)), dtype=original.dtype) + ) + return final, matrix + + +def complete_basis(vecs: paddle.Tensor, eps: float = 1e-09) -> paddle.Tensor: + assert vecs.dim() == 2 + dim = tuple(vecs.shape)[1] + base = [(x / x.norm()) for x in vecs] + expand = [] + for x in paddle.eye(num_rows=dim, dtype=vecs.dtype): + for y in base + expand: + x -= paddle.dot(x=x, y=y) * y + if x.norm() > 2 * eps: + x /= x.norm() + x[x.abs() < eps] = paddle.zeros(shape=(), dtype=x.dtype) + x *= x[x.nonzero()[0, 0]].sign() + expand += [x] + expand = ( + paddle.stack(x=expand) + if len(expand) > 0 + else paddle.zeros(shape=[0, dim], dtype=vecs.dtype) + ) + return expand diff --git a/ppmat/models/common/e3nn/math/_normalize_activation.py b/ppmat/models/common/e3nn/math/_normalize_activation.py new file mode 100644 index 00000000..1c56cc57 --- /dev/null +++ b/ppmat/models/common/e3nn/math/_normalize_activation.py @@ -0,0 +1,61 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn.paddle_utils import * +from ppmat.models.common.e3nn.util import explicit_default_types + + +def moment(f, n, dtype=None, device=None): + """ + compute n th moment + for z normal + """ + dtype, device = explicit_default_types(dtype, device) + gen = paddle.framework.core.default_cpu_generator().manual_seed(0) + z = paddle.randn(shape=[1000000], dtype="float64").to(dtype=dtype, device=device) + return f(z).pow(y=n).mean() + + +class normalize2mom(paddle.nn.Layer): + _is_id: bool + cst: float + + def __init__(self, f, dtype=None, device=None): + super().__init__() + if device is None and isinstance(f, paddle.nn.Layer): + from e3nn.util._argtools import _get_device + + device = _get_device(f) + with paddle.no_grad(): + cst = moment(f, 2, dtype="float64", device="cpu").pow(y=-0.5).item() + if abs(cst - 1) < 0.0001: + self._is_id = True + else: + self._is_id = False + self.f = f + self.cst = cst + + def forward(self, x): + if self._is_id: + return self.f(x) + else: + return self.f(x).multiply( + paddle.to_tensor(self.cst) + ) + + @staticmethod + def _make_tracing_inputs(n: int): + return [{"forward": (paddle.zeros(shape=(1,)),)}] diff --git a/ppmat/models/common/e3nn/math/_reduce.py b/ppmat/models/common/e3nn/math/_reduce.py new file mode 100644 index 00000000..256caec1 --- /dev/null +++ b/ppmat/models/common/e3nn/math/_reduce.py @@ -0,0 +1,100 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import itertools + +import paddle + +from ppmat.models.common.e3nn.math import perm +from ppmat.models.common.e3nn.paddle_utils import * + + +def germinate_formulas(formula): + formulas = [ + (-1 if f.startswith("-") else 1, f.replace("-", "")) for f in formula.split("=") + ] + s0, f0 = formulas[0] + assert s0 == 1 + for _s, f in formulas: + if len(set(f)) != len(f) or set(f) != set(f0): + raise RuntimeError(f"{f} is not a permutation of {f0}") + if len(f0) != len(f): + raise RuntimeError(f"{f0} and {f} don't have the same number of indices") + formulas = {(s, tuple(f.index(i) for i in f0)) for s, f in formulas} + while True: + n = len(formulas) + formulas = formulas.union([(s, perm.inverse(p)) for s, p in formulas]) + formulas = formulas.union( + [ + (s1 * s2, perm.compose(p1, p2)) + for s1, p1 in formulas + for s2, p2 in formulas + ] + ) + if len(formulas) == n: + break + return f0, formulas + + +def reduce_permutation(f0, formulas, dtype=None, device=None, **dims): + """ + Parameters + ---------- + f0 : str + + formulas : list of tuple (int, str) + + dims : dict of str -> int + + Examples + -------- + >>> Q, ret = reduce_permutation(*germinate_formulas("ij=-ji"), i=2) + >>> Q.shape, len(ret) + (torch.Size([1, 2, 2]), 1) + """ + for _s, p in formulas: + f = "".join(f0[i] for i in p) + for i, j in zip(f0, f): + if i in dims and j in dims and dims[i] != dims[j]: + raise RuntimeError(f"dimension of {i} and {j} should be the same") + if i in dims: + dims[j] = dims[i] + if j in dims: + dims[i] = dims[j] + for i in f0: + if i not in dims: + raise RuntimeError(f"index {i} has no dimension associated to it") + dims = [dims[i] for i in f0] + full_base = list(itertools.product(*(range(d) for d in dims))) + base = set() + for x in full_base: + xs = {(s, tuple(x[i] for i in p)) for s, p in formulas} + if (-1, x) not in xs: + base.add(frozenset({frozenset(xs), frozenset({(-s, x) for s, x in xs})})) + base = sorted([sorted([sorted(xs) for xs in x]) for x in base]) + d_sym = len(base) + Q = paddle.zeros(shape=[d_sym, len(full_base)], dtype=dtype) + ret = [] + for i, x in enumerate(base): + x = max(x, key=lambda xs: sum(s for s, x in xs)) + ret.append(x) + for s, e in x: + j = 0 + for k, d in zip(e, dims): + j *= d + j += k + Q[i, j] = s / len(x) ** 0.5 + new_shape = [d_sym] + dims + Q = Q.reshape(new_shape) + return Q, ret diff --git a/ppmat/models/common/e3nn/math/_soft_one_hot_linspace.py b/ppmat/models/common/e3nn/math/_soft_one_hot_linspace.py new file mode 100644 index 00000000..1b3faaaa --- /dev/null +++ b/ppmat/models/common/e3nn/math/_soft_one_hot_linspace.py @@ -0,0 +1,159 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import paddle + +from ppmat.models.common.e3nn.paddle_utils import * + +# from ppmat.models.common.e3nn.math import soft_unit_step +from ._soft_unit_step import soft_unit_step + + +def soft_one_hot_linspace( + x: paddle.Tensor, start, end, number, basis=None, cutoff=None +): + """Projection on a basis of functions + + Returns a set of :math:`\\{y_i(x)\\}_{i=1}^N`, + + .. math:: + + y_i(x) = \\frac{1}{Z} f_i(x) + + where :math:`x` is the input and :math:`f_i` is the ith basis function. + :math:`Z` is a constant defined (if possible) such that, + + .. math:: + + \\langle \\sum_{i=1}^N y_i(x)^2 \\rangle_x \\approx 1 + + See the last plot below. + Note that ``bessel`` basis cannot be normalized. + + Parameters + ---------- + x : `torch.Tensor` + tensor of shape :math:`(...)` + + start : float + minimum value span by the basis + + end : float + maximum value span by the basis + + number : int + number of basis functions :math:`N` + + basis : {'gaussian', 'cosine', 'smooth_finite', 'fourier', 'bessel'} + choice of basis family; note that due to the :math:`1/x` term, ``bessel`` basis does not satisfy the normalization of + other basis choices + + cutoff : bool + if ``cutoff=True`` then for all :math:`x` outside of the interval defined by ``(start, end)``, + :math:`\\forall i, \\; f_i(x) \\approx 0` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., N)` + + Examples + -------- + + .. jupyter-execute:: + :hide-code: + + import torch + from e3nn.math import soft_one_hot_linspace + import matplotlib.pyplot as plt + + .. jupyter-execute:: + + bases = ['gaussian', 'cosine', 'smooth_finite', 'fourier', 'bessel'] + x = torch.linspace(-1.0, 2.0, 100) + + .. jupyter-execute:: + + fig, axss = plt.subplots(len(bases), 2, figsize=(9, 6), sharex=True, sharey=True) + + for axs, b in zip(axss, bases): + for ax, c in zip(axs, [True, False]): + plt.sca(ax) + plt.plot(x, soft_one_hot_linspace(x, -0.5, 1.5, number=4, basis=b, cutoff=c)) + plt.plot([-0.5]*2, [-2, 2], 'k-.') + plt.plot([1.5]*2, [-2, 2], 'k-.') + plt.title(f"{b}" + (" with cutoff" if c else "")) + + plt.ylim(-1, 1.5) + plt.tight_layout() + + .. jupyter-execute:: + + fig, axss = plt.subplots(len(bases), 2, figsize=(9, 6), sharex=True, sharey=True) + + for axs, b in zip(axss, bases): + for ax, c in zip(axs, [True, False]): + plt.sca(ax) + plt.plot(x, soft_one_hot_linspace(x, -0.5, 1.5, number=4, basis=b, cutoff=c).pow(2).sum(1)) + plt.plot([-0.5]*2, [-2, 2], 'k-.') + plt.plot([1.5]*2, [-2, 2], 'k-.') + plt.title(f"{b}" + (" with cutoff" if c else "")) + + plt.ylim(0, 2) + plt.tight_layout() + """ + if cutoff not in [True, False]: + raise ValueError("cutoff must be specified") + if not cutoff: + values = paddle.linspace(start=start, stop=end, num=number, dtype=x.dtype) + step = values[1] - values[0] + else: + values = paddle.linspace(start=start, stop=end, num=number + 2, dtype=x.dtype) + step = values[1] - values[0] + values = values[1:-1] + diff = (x[..., None] - values) / step + if basis == "gaussian": + scale = paddle.to_tensor(1.12, dtype=x.dtype) + return diff.pow(y=2).neg().exp().divide(scale) + mask = paddle.cast((diff < 1) & (-1 < diff), dtype=x.dtype) + return paddle.cos(x=math.pi / 2 * diff) * mask + if basis == "smooth_finite": + return ( + 1.14136 + * paddle.exp(x=paddle.to_tensor(data=2.0)) + * soft_unit_step(diff + 1) + * soft_unit_step(1 - diff) + ) + if basis == "fourier": + x = (x[..., None] - start) / (end - start) + if not cutoff: + i = paddle.arange(start=0, end=number, dtype=x.dtype) + return paddle.cos(x=math.pi * i * x) / math.sqrt(0.25 + number / 2) + else: + i = paddle.arange(start=1, end=number + 1, dtype=x.dtype) + mask = paddle.cast((0 < x) & (x < 1), dtype=x.dtype) + return paddle.sin(x=math.pi * i * x) / math.sqrt(0.25 + number / 2) * mask + if basis == "bessel": + x = x[..., None] - start + c = end - start + bessel_roots = paddle.arange(start=1, end=number + 1, dtype=x.dtype) * math.pi + out = math.sqrt(2 / c) * paddle.sin(x=bessel_roots * x / c) / x + if not cutoff: + return out + else: + mask = paddle.cast((x / c < 1) & (0 < x), dtype=x.dtype) + return out * mask + raise ValueError(f'basis="{basis}" is not a valid entry') diff --git a/ppmat/models/common/e3nn/math/_soft_unit_step.py b/ppmat/models/common/e3nn/math/_soft_unit_step.py new file mode 100644 index 00000000..52449a6a --- /dev/null +++ b/ppmat/models/common/e3nn/math/_soft_unit_step.py @@ -0,0 +1,70 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + + +class _SoftUnitStep(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x): + ctx.save_for_backward(x) + y = paddle.zeros_like(x=x) + m = x > 0.0 + y[m] = (-1 / x[m]).exp() + return y + + @staticmethod + def backward(ctx, dy): + (x,) = ctx.saved_tensor() + dx = paddle.zeros_like(x=x) + m = x > 0.0 + xm = x[m] + dx[m] = (-1 / xm).exp() / xm.pow(y=2) + return dx * dy + + +def soft_unit_step(x): + """smooth :math:`C^\\infty` version of the unit step function + + .. math:: + + x \\mapsto \\theta(x) e^{-1/x} + + + Parameters + ---------- + x : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(...)` + + Examples + -------- + + .. jupyter-execute:: + :hide-code: + + import torch + from e3nn.math import soft_unit_step + import matplotlib.pyplot as plt + + .. jupyter-execute:: + + x = torch.linspace(-1.0, 10.0, 1000) + plt.plot(x, soft_unit_step(x)); + """ + return _SoftUnitStep.apply(x) diff --git a/ppmat/models/common/e3nn/math/perm.py b/ppmat/models/common/e3nn/math/perm.py new file mode 100644 index 00000000..8b3c25be --- /dev/null +++ b/ppmat/models/common/e3nn/math/perm.py @@ -0,0 +1,157 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math +import random +from typing import Optional +from typing import Set +from typing import Tuple + +import paddle + +from ppmat.models.common.e3nn.math import complete_basis +from ppmat.models.common.e3nn.paddle_utils import * + +TY_PERM = Tuple[int] + + +def is_perm(p: TY_PERM): + return sorted(set(p)) == list(range(len(p))) + + +def identity(n: int) -> TY_PERM: + return tuple(i for i in range(n)) + + +def compose(p1: TY_PERM, p2: TY_PERM) -> TY_PERM: + """ + compute p1 . p2 + """ + assert is_perm(p1) and is_perm(p2) + assert len(p1) == len(p2) + return tuple(p1[p2[i]] for i in range(len(p1))) + + +def inverse(p: TY_PERM) -> TY_PERM: + """ + compute the inverse permutation + """ + return tuple(p.index(i) for i in range(len(p))) + + +def rand(n: int) -> TY_PERM: + i = random.randint(0, math.factorial(n) - 1) + return from_int(i, n) + + +def from_int(i: int, n: int) -> TY_PERM: + pool = list(range(n)) + p = [] + for _ in range(n): + j = i % n + i = i // n + p.append(pool.pop(j)) + n -= 1 + return tuple(p) + + +def to_int(p: TY_PERM) -> int: + n = len(p) + pool = list(range(n)) + i = 0 + m = 1 + for j in p: + k = pool.index(j) + i += k * m + m *= len(pool) + pool.pop(k) + return i + + +def group(n: int) -> Set[TY_PERM]: + return {from_int(i, n) for i in range(math.factorial(n))} + + +def germinate(subset: Set[TY_PERM]) -> Set[TY_PERM]: + while True: + n = len(subset) + subset = subset.union([inverse(p) for p in subset]) + subset = subset.union([compose(p1, p2) for p1 in subset for p2 in subset]) + if len(subset) == n: + return subset + + +def is_group(g: Set[TY_PERM]) -> bool: + if len(g) == 0: + return False + n = len(next(iter(g))) + for p in g: + assert len(p) == n, p + if identity(n) not in g: + return False + for p in g: + if inverse(p) not in g: + return False + for p1 in g: + for p2 in g: + if compose(p1, p2) not in g: + return False + return True + + +def to_cycles(p: TY_PERM) -> Set[Tuple[int]]: + n = len(p) + cycles = set() + for i in range(n): + c = [i] + while p[i] != c[0]: + i = p[i] + c += [i] + if len(c) >= 2: + i = c.index(min(c)) + c = c[i:] + c[:i] + cycles.add(tuple(c)) + return cycles + + +def sign(p: TY_PERM) -> int: + s = 1 + for c in to_cycles(p): + if len(c) % 2 == 0: + s = -s + return s + + +def standard_representation( + p: TY_PERM, + dtype: Optional[paddle.dtype] = None, + device: Optional[paddle.dtype] = None, +) -> paddle.Tensor: + """irrep of Sn of dimension n - 1""" + A = complete_basis(paddle.ones(shape=[1, len(p)], dtype=dtype), eps=0.1 / len(p)) + return A @ natural_representation(p) @ A.T + + +def natural_representation( + p: TY_PERM, + dtype: Optional[paddle.dtype] = None, + device: Optional[paddle.dtype] = None, +) -> paddle.Tensor: + """natural representation of Sn""" + n = len(p) + ip = inverse(p) + d = paddle.zeros(shape=[n, n], dtype=dtype) + for a in range(n): + d[a, ip[a]] = 1 + return d diff --git a/ppmat/models/common/e3nn/nn/__init__.py b/ppmat/models/common/e3nn/nn/__init__.py new file mode 100644 index 00000000..8eb364e9 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/__init__.py @@ -0,0 +1,39 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._activation import Activation +from ._batchnorm import BatchNorm +from ._dropout import Dropout +from ._extract import Extract +from ._extract import ExtractIr +from ._fc import FullyConnectedNet +from ._gate import Gate +from ._identity import Identity +from ._normact import NormActivation +from ._s2act import S2Activation +from ._so3act import SO3Activation + +__all__ = [ + "Extract", + "ExtractIr", + "BatchNorm", + "FullyConnectedNet", + "Activation", + "Gate", + "Identity", + "S2Activation", + "SO3Activation", + "NormActivation", + "Dropout", +] diff --git a/ppmat/models/common/e3nn/nn/_activation.py b/ppmat/models/common/e3nn/nn/_activation.py new file mode 100644 index 00000000..da744098 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_activation.py @@ -0,0 +1,119 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.math import normalize2mom +from ppmat.models.common.e3nn.paddle_utils import * + + +class Activation(paddle.nn.Layer): + """Scalar activation function. + + Odd scalar inputs require activation functions with a defined parity (odd or even). + + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + representation of the input + + acts : list of function or None + list of activation functions, `None` if non-scalar or identity + + Examples + -------- + + >>> a = Activation("256x0o", [torch.abs]) + >>> a.irreps_out + 256x0e + + >>> a = Activation("256x0o+16x1e", [None, None]) + >>> a.irreps_out + """ + + def __init__(self, irreps_in, acts): + super().__init__() + irreps_in = o3.Irreps(irreps_in) # + if len(irreps_in) != len(acts): # + raise ValueError( + f"Irreps in and number of activation functions does not match: {len(acts), (irreps_in, acts)}" + ) + acts = [(normalize2mom(act) if act is not None else None) for act in acts] + + irreps_out = [] + for (mul, (l_in, p_in)), act in zip(irreps_in, acts): + if act is not None: + if l_in != 0: + raise ValueError( + "Activation: cannot apply an activation function to a non-scalar input." + ) + x = paddle.linspace(start=0, stop=10, num=256) # + a1, a2 = act(x), act(-x) + if (a1 - a2).abs().max_func() < 1e-05: + p_act = 1 + elif (a1 + a2).abs().max_func() < 1e-05: + p_act = -1 + else: + p_act = 0 + p_out = p_act if p_in == -1 else p_in + irreps_out.append((mul, (0, p_out))) + if p_out == 0: + raise ValueError( + "Activation: the parity is violated! The input scalar is odd but the activation is neither even nor odd." + ) + else: + irreps_out.append((mul, (l_in, p_in))) + self.irreps_in = irreps_in + self.irreps_out = o3.Irreps(irreps_out) + self.acts = paddle.nn.LayerList(sublayers=acts) + assert len(self.irreps_in) == len(self.acts) + + def __repr__(self): + acts = "".join([("x" if a is not None else " ") for a in self.acts]) + return f"{self.__class__.__name__} [{acts}] ({self.irreps_in} -> {self.irreps_out})" + + def forward(self, features, dim=-1): + """evaluate + + Parameters + ---------- + features : `torch.Tensor` + tensor of shape ``(...)`` + + Returns + ------- + `torch.Tensor` + tensor of shape the same shape as the input + """ + output = [] + index = 0 + for (mul, ir), act in zip(self.irreps_in, self.acts): + if act is not None: + start_0 = features.shape[dim] + index if index < 0 else index + output.append( + act(paddle.slice(features, [dim], [start_0], [start_0 + mul])) + ) + else: + start_1 = features.shape[dim] + index if index < 0 else index + output.append( + paddle.slice(features, [dim], [start_1], [start_1 + mul * ir.dim]) + ) + index += mul * ir.dim + if len(output) > 1: + return paddle.concat(x=output, axis=dim) + elif len(output) == 1: + return output[0] + else: + return paddle.zeros_like(x=features) diff --git a/ppmat/models/common/e3nn/nn/_batchnorm.py b/ppmat/models/common/e3nn/nn/_batchnorm.py new file mode 100644 index 00000000..2fd09b28 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_batchnorm.py @@ -0,0 +1,196 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.paddle_utils import * + + +class BatchNorm(paddle.nn.Layer): + """Batch normalization for orthonormal representations + + It normalizes by the norm of the representations. + Note that the norm is invariant only for orthonormal representations. + Irreducible representations `wigner_D` are orthonormal. + + Parameters + ---------- + irreps : `o3.Irreps` + representation + + eps : float + avoid division by zero when we normalize by the variance + + momentum : float + momentum of the running average + + affine : bool + do we have weight and bias parameters + + reduce : {'mean', 'max'} + method used to reduce + + instance : bool + apply instance norm instead of batch norm + """ + + def __init__( + self, + irreps, + eps=1e-05, + momentum=0.1, + affine=True, + reduce="mean", + instance=False, + normalization="component", + ): + super().__init__() + self.irreps = o3.Irreps(irreps) + self.eps = eps + self.momentum = momentum + self.affine = affine + self.instance = instance + num_scalar = sum(mul for mul, ir in self.irreps if ir.is_scalar()) + num_features = self.irreps.num_irreps + if self.instance: + self.register_buffer(name="running_mean", tensor=None) + self.register_buffer(name="running_var", tensor=None) + else: + self.register_buffer( + name="running_mean", tensor=paddle.zeros(shape=num_scalar) + ) + self.register_buffer( + name="running_var", tensor=paddle.ones(shape=num_features) + ) + if affine: + self.weight = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.ones(shape=num_features) + ) + self.bias = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.zeros(shape=num_scalar) + ) + else: + self.add_parameter(name="weight", parameter=None) + self.add_parameter(name="bias", parameter=None) + assert isinstance(reduce, str), "reduce should be passed as a string value" + assert reduce in ["mean", "max"], "reduce needs to be 'mean' or 'max'" + self.reduce = reduce + assert normalization in [ + "norm", + "component", + ], "normalization needs to be 'norm' or 'component'" + self.normalization = normalization + + def __repr__(self): + return f"{self.__class__.__name__} ({self.irreps}, eps={self.eps}, momentum={self.momentum})" + + def _roll_avg(self, curr, update): + return (1 - self.momentum) * curr + self.momentum * update.detach() + + def forward(self, input): + """evaluate + + Parameters + ---------- + input : `torch.Tensor` + tensor of shape ``(batch, ..., irreps.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(batch, ..., irreps.dim)`` + """ + batch, *size, dim = tuple(input.shape) + input = input.reshape(batch, -1, dim) + if self.training and not self.instance: + new_means = [] + new_vars = [] + fields = [] + ix = 0 + irm = 0 + irv = 0 + iw = 0 + ib = 0 + for mul, ir in self.irreps: + d = ir.dim + field = input[:, :, ix : ix + mul * d] + ix += mul * d + field = field.reshape(batch, -1, mul, d) + if ir.is_scalar(): + if self.training or self.instance: + if self.instance: + field_mean = field.mean(axis=1).reshape(batch, mul) + else: + field_mean = field.mean(axis=[0, 1]).reshape(mul) + new_means.append( + self._roll_avg( + self.running_mean[irm : irm + mul], field_mean + ) + ) + else: + field_mean = self.running_mean[irm : irm + mul] + irm += mul + field = field - field_mean.reshape(-1, 1, mul, 1) + if self.training or self.instance: + if self.normalization == "norm": + field_norm = field.pow(y=2).sum(axis=3) + elif self.normalization == "component": + field_norm = field.pow(y=2).mean(axis=3) + else: + raise ValueError( + "Invalid normalization option {}".format(self.normalization) + ) + if self.reduce == "mean": + field_norm = field_norm.mean(axis=1) + elif self.reduce == "max": + field_norm = field_norm.max_func(1).values + else: + raise ValueError("Invalid reduce option {}".format(self.reduce)) + if not self.instance: + field_norm = field_norm.mean(axis=0) + new_vars.append( + self._roll_avg(self.running_var[irv : irv + mul], field_norm) + ) + else: + field_norm = self.running_var[irv : irv + mul] + irv += mul + field_norm = (field_norm + self.eps).pow(y=-0.5) + if self.affine: + weight = self.weight[iw : iw + mul] + iw += mul + field_norm = field_norm * weight + field = field * field_norm.reshape(-1, 1, mul, 1) + if self.affine and ir.is_scalar(): + bias = self.bias[ib : ib + mul] + ib += mul + field += bias.reshape(mul, 1) + fields.append(field.reshape(batch, -1, mul * d)) + if ix != dim: + fmt = "`ix` should have reached input.size(-1) ({}), but it ended at {}" + msg = fmt.format(dim, ix) + raise AssertionError(msg) + if self.training and not self.instance: + assert irm == self.running_mean.size + assert irv == self.running_var.shape[0] + if self.affine: + assert iw == self.weight.shape[0] + assert ib == self.bias.size + if self.training and not self.instance: + if len(new_means) > 0: + paddle.assign(paddle.concat(x=new_means), output=self.running_mean) + if len(new_vars) > 0: + paddle.assign(paddle.concat(x=new_vars), output=self.running_var) + output = paddle.concat(x=fields, axis=2) + return output.reshape(batch, *size, dim) diff --git a/ppmat/models/common/e3nn/nn/_dropout.py b/ppmat/models/common/e3nn/nn/_dropout.py new file mode 100644 index 00000000..825fa72d --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_dropout.py @@ -0,0 +1,89 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.paddle_utils import * + + +class Dropout(paddle.nn.Layer): + """Equivariant Dropout + + :math:`A_{zai}` is the input and :math:`B_{zai}` is the output where + + - ``z`` is the batch index + - ``a`` any non-batch and non-irrep index + - ``i`` is the irrep index, for instance if ``irreps="0e + 2x1e"`` then ``i=2`` select the *second vector* + + .. math:: + + B_{zai} = + rac{x_{zi}}{1-p} A_{zai} + + where :math:`p` is the dropout probability and :math:`x` is a Bernoulli random variable with parameter :math:`1-p`. + + Parameters + ---------- + irreps : `o3.Irreps` + representation + + p : float + probability to drop + """ + + def __init__(self, irreps, p): + super().__init__() + self.irreps = o3.Irreps(irreps) + self.p = p + + def __repr__(self): + return f"{self.__class__.__name__} ({self.irreps}, p={self.p})" + + def forward(self, x): + """evaluate + + Parameters + ---------- + input : `torch.Tensor` + tensor of shape ``(batch, ..., irreps.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(batch, ..., irreps.dim)`` + """ + if not self.training: + return x + batch = tuple(x.shape)[0] + noises = [] + for mul, (l, _p) in self.irreps: + dim = 2 * l + 1 + noise = paddle.empty(shape=[batch, mul], dtype=x.dtype) + if self.p >= 1: + noise.fill_(value=0) + elif self.p <= 0: + noise.fill_(value=1) + else: + """Not Support auto convert *.bernoulli_, please judge whether it is Pytorch API and convert by yourself""" + noise = paddle.bernoulli(paddle.full_like(noise, 1 - self.p)) + noise = noise / (1 - self.p) + noise = ( + noise[:, :, None].expand(shape=[-1, -1, dim]).reshape(batch, mul * dim) + ) + noises.append(noise) + noise = paddle.concat(x=noises, axis=-1) + while noise.dim() < x.dim(): + noise = noise[:, None] + return x * noise diff --git a/ppmat/models/common/e3nn/nn/_extract.py b/ppmat/models/common/e3nn/nn/_extract.py new file mode 100644 index 00000000..47283c02 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_extract.py @@ -0,0 +1,98 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 + + +class Extract(paddle.nn.Layer): + def __init__(self, irreps_in, irreps_outs, instructions, squeeze_out: bool = False): + r"""Extract sub sets of irreps + + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + representation of the input + + irreps_outs : list of `e3nn.o3.Irreps` + list of representation of the outputs + + instructions : list of tuple of int + list of tuples, one per output continaing each ``len(irreps_outs[i])`` int + + squeeze_out : bool, default False + if ``squeeze_out`` and only one output exists, a ``paddle.Tensor`` will be returned instead of a + ``Tuple[paddle.Tensor]`` + """ + super().__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.irreps_outs = tuple(o3.Irreps(irreps) for irreps in irreps_outs) + self.instructions = instructions + self.squeeze_out = squeeze_out + + assert len(self.irreps_outs) == len(self.instructions) + for irreps_out, ins in zip(self.irreps_outs, self.instructions): + assert len(irreps_out) == len(ins) + + def forward(self, x): + assert x.shape[-1] == self.irreps_in.dim, "invalid input shape" + + out = [] + for irreps in self.irreps_outs: + out.append(paddle.zeros(list(x.shape[:-1]) + [irreps.dim], dtype=x.dtype)) + for i, (irreps_out, ins) in enumerate(zip(self.irreps_outs, self.instructions)): + if ins == tuple(range(len(self.irreps_in))): + out[i] = paddle.assign(x) + else: + for s_out, i_in in zip(irreps_out.slices(), ins): + i_start = self.irreps_in[:i_in].dim + i_len = self.irreps_in[i_in].dim + x_slice = x.slice([-1], [i_start], [i_start + i_len]) + if len(out[i].shape) == 1: + out[i][s_out.start : s_out.stop] = x_slice + else: + idx = [slice(None)] * ( + len(out[i].shape) - 1 + ) + idx.append( + slice(s_out.start, s_out.stop) + ) + out[i][tuple(idx)] = x_slice + + if self.squeeze_out and len(out) == 1: + return out[0] + return tuple(out) + + +class ExtractIr(Extract): + def __init__(self, irreps_in, ir): + r"""Extract ``ir`` from irreps + + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + representation of the input + + ir : `e3nn.o3.Irrep` + representation to extract + """ + ir = o3.Irrep(ir) + irreps_in = o3.Irreps(irreps_in) + self.irreps_out = o3.Irreps([mul_ir for mul_ir in irreps_in if mul_ir.ir == ir]) + instructions = [ + tuple(i for i, mul_ir in enumerate(irreps_in) if mul_ir.ir == ir) + ] + + super().__init__(irreps_in, [self.irreps_out], instructions, squeeze_out=True) diff --git a/ppmat/models/common/e3nn/nn/_fc.py b/ppmat/models/common/e3nn/nn/_fc.py new file mode 100644 index 00000000..6f79ddd7 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_fc.py @@ -0,0 +1,97 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import List + +import paddle + +from ppmat.models.common.e3nn.math import normalize2mom + + +class _Layer(paddle.nn.Layer): + h_in: float + h_out: float + var_in: float + var_out: float + _profiling_str: str + + def __init__(self, h_in, h_out, act, var_in, var_out): + super().__init__() + self.weight = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[h_in, h_out]) + ) + self.act = act + self.h_in = h_in + self.h_out = h_out + self.var_in = var_in + self.var_out = var_out + self._profiling_str = repr(self) + + def __repr__(self): + act = self.act + if hasattr(act, "__name__"): + act = act.__name__ + elif isinstance(act, paddle.nn.Layer): + act = act.__class__.__name__ + return f"Layer({self.h_in}->{self.h_out}, act={act})" + + def forward(self, x: paddle.Tensor): + if self.act is not None: + w = self.weight / (self.h_in * self.var_in) ** 0.5 + x = x @ w + x = self.act(x) + x = x * self.var_out**0.5 + else: + w = self.weight / (self.h_in * self.var_in / self.var_out) ** 0.5 + x = x @ w + return x + + +class FullyConnectedNet(paddle.nn.Sequential): + """Fully-connected Neural Network + + Parameters + ---------- + hs : list of int + input, internal and output dimensions + + act : function + activation function :math:`\\phi`, it will be automatically normalized by a scaling factor such that + + .. math:: + + \\int_{-\\infty}^{\\infty} \\phi(z)^2 \\frac{e^{-z^2/2}}{\\sqrt{2\\pi}} dz = 1 + """ + + hs: List[int] + + def __init__(self, hs, act=None, variance_in=1, variance_out=1, out_act=False): + super().__init__() + self.hs = list(hs) + if act is not None: + act = normalize2mom(act) + var_in = variance_in + for i, (h1, h2) in enumerate(zip(self.hs, self.hs[1:])): + if i == len(self.hs) - 2: + var_out = variance_out + a = act if out_act else None + else: + var_out = 1 + a = act + layer = _Layer(h1, h2, a, var_in, var_out) + setattr(self, f"layer{i}", layer) + var_in = var_out + + def __repr__(self): + return f"{self.__class__.__name__}{self.hs}" diff --git a/ppmat/models/common/e3nn/nn/_gate.py b/ppmat/models/common/e3nn/nn/_gate.py new file mode 100644 index 00000000..07bab3c2 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_gate.py @@ -0,0 +1,158 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.nn import Activation +from ppmat.models.common.e3nn.nn import Extract + + +class _Sortcut(paddle.nn.Layer): + def __init__(self, *irreps_outs): + super().__init__() + self.irreps_outs = tuple(o3.Irreps(irreps).simplify() for irreps in irreps_outs) + irreps_in = sum(self.irreps_outs, o3.Irreps([])) + i = 0 + instructions = [] + for irreps_out in self.irreps_outs: + instructions += [tuple(range(i, i + len(irreps_out)))] + i += len(irreps_out) + assert len(irreps_in) == i, (len(irreps_in), i) + irreps_in, p, _ = paddle.sort(x=irreps_in), paddle.argsort(x=irreps_in) + instructions = [tuple(p[i] for i in x) for x in instructions] + self.cut = Extract(irreps_in, self.irreps_outs, instructions) + self.irreps_in = irreps_in.simplify() + + def forward(self, x): + return self.cut(x) + + +class Gate(paddle.nn.Layer): + """Gate activation function. + + The gate activation is a direct sum of two sets of irreps. The first set + of irreps is ``irreps_scalars`` passed through activation functions + ``act_scalars``. The second set of irreps is ``irreps_gated`` multiplied + by the scalars ``irreps_gates`` passed through activation functions + ``act_gates``. Mathematically, this can be written as: + + .. math:: + \\left(\\bigoplus_i \\phi_i(x_i) \\right) \\oplus \\left(\\bigoplus_j \\phi_j(g_j) y_j \\right) + + where :math:`x_i` and :math:`\\phi_i` are from ``irreps_scalars`` and + ``act_scalars``, and :math:`g_j`, :math:`\\phi_j`, and :math:`y_j` are + from ``irreps_gates``, ``act_gates``, and ``irreps_gated``. + + The parameters passed in should adhere to the following conditions: + + 1. ``len(irreps_scalars) == len(act_scalars)``. + 2. ``len(irreps_gates) == len(act_gates)``. + 3. ``irreps_gates.num_irreps == irreps_gated.num_irreps``. + + Parameters + ---------- + irreps_scalars : `e3nn.o3.Irreps` + Representation of the scalars that will be passed through the + activation functions ``act_scalars``. + + act_scalars : list of function or None + Activation functions acting on the scalars. + + irreps_gates : `e3nn.o3.Irreps` + Representation of the scalars that will be passed through the + activation functions ``act_gates`` and multiplied by the + ``irreps_gated``. + + act_gates : list of function or None + Activation functions acting on the gates. The number of functions in + the list should match the number of irrep groups in ``irreps_gates``. + + irreps_gated : `e3nn.o3.Irreps` + Representation of the gated tensors. + ``irreps_gates.num_irreps == irreps_gated.num_irreps`` + + Examples + -------- + + >>> g = Gate("16x0o", [torch.tanh], "32x0o", [torch.tanh], "16x1e+16x1o") + >>> g.irreps_out + 16x0o+16x1o+16x1e + """ + + def __init__( + self, irreps_scalars, act_scalars, irreps_gates, act_gates, irreps_gated + ): + super().__init__() + irreps_scalars = o3.Irreps(irreps_scalars) + irreps_gates = o3.Irreps(irreps_gates) + irreps_gated = o3.Irreps(irreps_gated) + if len(irreps_gates) > 0 and irreps_gates.lmax > 0: + raise ValueError( + f"Gate scalars must be scalars, instead got irreps_gates = {irreps_gates}" + ) + if len(irreps_scalars) > 0 and irreps_scalars.lmax > 0: + raise ValueError( + f"Scalars must be scalars, instead got irreps_scalars = {irreps_scalars}" + ) + if irreps_gates.num_irreps != irreps_gated.num_irreps: + raise ValueError( + f"There are {irreps_gated.num_irreps} irreps in irreps_gated, but a different number ({irreps_gates.num_irreps}) of gate scalars in irreps_gates" + ) + self.sc = _Sortcut(irreps_scalars, irreps_gates, irreps_gated) + self.irreps_scalars, self.irreps_gates, self.irreps_gated = self.sc.irreps_outs + self._irreps_in = self.sc.irreps_in + self.act_scalars = Activation(irreps_scalars, act_scalars) + irreps_scalars = self.act_scalars.irreps_out + self.act_gates = Activation(irreps_gates, act_gates) + irreps_gates = self.act_gates.irreps_out + self.mul = o3.ElementwiseTensorProduct(irreps_gated, irreps_gates) + irreps_gated = self.mul.irreps_out + self._irreps_out = irreps_scalars + irreps_gated + + def __repr__(self): + return f"{self.__class__.__name__} ({self.irreps_in} -> {self.irreps_out})" + + def forward(self, features): + """Evaluate the gated activation function. + + Parameters + ---------- + features : `torch.Tensor` + tensor of shape ``(..., irreps_in.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., irreps_out.dim)`` + """ + scalars, gates, gated = self.sc(features) + scalars = self.act_scalars(scalars) + if tuple(gates.shape)[-1]: + gates = self.act_gates(gates) + gated = self.mul(gated, gates) + features = paddle.concat(x=[scalars, gated], axis=-1) + else: + features = scalars + return features + + @property + def irreps_in(self): + """Input representations.""" + return self._irreps_in + + @property + def irreps_out(self): + """Output representations.""" + return self._irreps_out diff --git a/ppmat/models/common/e3nn/nn/_identity.py b/ppmat/models/common/e3nn/nn/_identity.py new file mode 100644 index 00000000..8ced4254 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_identity.py @@ -0,0 +1,45 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 + + +class Identity(paddle.nn.Layer): + """Identity operation + + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + + irreps_out : `e3nn.o3.Irreps` + """ + + def __init__(self, irreps_in, irreps_out): + super().__init__() + self.irreps_in = o3.Irreps(irreps_in).simplify() + self.irreps_out = o3.Irreps(irreps_out).simplify() + assert self.irreps_in == self.irreps_out + output_mask = paddle.concat( + x=[paddle.ones(shape=mul * (2 * l + 1)) for mul, (l, _p) in self.irreps_out] + ) + self.register_buffer(name="output_mask", tensor=output_mask) + + def __repr__(self): + return f"{self.__class__.__name__}({self.irreps_in} -> {self.irreps_out})" + + def forward(self, features): + """evaluate""" + return features diff --git a/ppmat/models/common/e3nn/nn/_normact.py b/ppmat/models/common/e3nn/nn/_normact.py new file mode 100644 index 00000000..2937bec0 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_normact.py @@ -0,0 +1,112 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Callable +from typing import Optional + +import paddle + +from ppmat.models.common.e3nn import o3 + + +class NormActivation(paddle.nn.Layer): + """Norm-based activation function + Applies a scalar nonlinearity to the norm of each irrep and ouputs a (normalized) version of that irrep multiplied by the + scalar output of the scalar nonlinearity. + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + representation of the input + scalar_nonlinearity : callable + scalar nonlinearity such as ``torch.sigmoid`` + normalize : bool + whether to normalize the input features before multiplying them by the scalars from the nonlinearity + epsilon : float, optional + when ``normalize``ing, norms smaller than ``epsilon`` will be clamped up to ``epsilon`` to avoid division by zero and + NaN gradients. Not allowed when ``normalize`` is False. + bias : bool + whether to apply a learnable additive bias to the inputs of the ``scalar_nonlinearity`` + Examples + -------- + >>> n = NormActivation("2x1e", torch.sigmoid) + >>> feats = torch.ones(1, 2*3) + >>> print(feats.reshape(1, 2, 3).norm(dim=-1)) + tensor([[1.7321, 1.7321]]) + >>> print(torch.sigmoid(feats.reshape(1, 2, 3).norm(dim=-1))) + tensor([[0.8497, 0.8497]]) + >>> print(n(feats).reshape(1, 2, 3).norm(dim=-1)) + tensor([[0.8497, 0.8497]]) + """ + + epsilon: Optional[float] + _eps_squared: float + + def __init__( + self, + irreps_in, + scalar_nonlinearity: Callable, + normalize: bool = True, + epsilon: Optional[float] = None, + bias: bool = False, + ): + super().__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.irreps_out = o3.Irreps(irreps_in) + if epsilon is None and normalize: + epsilon = 1e-08 + elif epsilon is not None and not normalize: + raise ValueError("epsilon and normalize = False don't make sense together") + elif not epsilon > 0: + raise ValueError( + f"epsilon {epsilon} is invalid, must be strictly positive." + ) + self.epsilon = epsilon + if self.epsilon is not None: + self._eps_squared = epsilon * epsilon + else: + self._eps_squared = 0.0 + self.norm = o3.Norm(irreps_in, squared=epsilon is not None) + self.scalar_nonlinearity = scalar_nonlinearity + self.normalize = normalize + self.bias = bias + if self.bias: + self.biases = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.zeros(shape=irreps_in.num_irreps) + ) + self.scalar_multiplier = o3.ElementwiseTensorProduct( + irreps_in1=self.norm.irreps_out, irreps_in2=irreps_in + ) + + def forward(self, features): + """evaluate + Parameters + ---------- + features : `torch.Tensor` + tensor of shape ``(..., irreps_in.dim)`` + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., irreps_in.dim)`` + """ + norms = self.norm(features) + if self._eps_squared > 0: + norms[norms < self._eps_squared] = self._eps_squared + norms = norms.sqrt() + nonlin_arg = norms + if self.bias: + nonlin_arg = nonlin_arg + self.biases + scalings = self.scalar_nonlinearity(nonlin_arg) + if self.normalize: + scalings = scalings / norms + return self.scalar_multiplier(scalings, features) diff --git a/ppmat/models/common/e3nn/nn/_s2act.py b/ppmat/models/common/e3nn/nn/_s2act.py new file mode 100644 index 00000000..d1eb68d1 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_s2act.py @@ -0,0 +1,134 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.math import normalize2mom +from ppmat.models.common.e3nn.paddle_utils import * + + +class S2Activation(paddle.nn.Layer): + """Apply non linearity on the signal on the sphere + + | Maps to the sphere, apply the non linearity point wise and project back. + | The signal on the sphere is a quasiregular representation of :math:`O(3)` and we can apply a pointwise operation on + | these representations. + + .. math:: \\{A^l\\}_l \\mapsto \\{\\int \\phi(\\sum_l A^l \\cdot Y^l(x)) Y^j(x) dx\\}_j + + Parameters + ---------- + irreps : `o3.Irreps` + input representation of the form ``[(1, (l, p_val * (p_arg)^l)) for l in [0, ..., lmax]]`` + + act : function + activation function :math:`\\phi` + + res : int + resolution of the grid on the sphere (the higher the more accurate) + + normalization : {'norm', 'component'} + + lmax_out : int, optional + maximum ``l`` of the output + + random_rot : bool + rotate randomly the grid + + Examples + -------- + >>> from e3nn import io + >>> m = S2Activation(io.SphericalTensor(5, p_val=+1, p_arg=-1), torch.tanh, 100) + """ + + def __init__( + self, + irreps: o3.Irreps, + act, + res, + normalization="component", + lmax_out=None, + random_rot=False, + ): + super().__init__() + irreps = o3.Irreps(irreps).simplify() + _, (_, p_val) = irreps[0] + _, (lmax, _) = irreps[-1] + assert all(mul == 1 for mul, _ in irreps) + assert irreps.ls == list(range(lmax + 1)) + if all(p == p_val for _, (l, p) in irreps): + p_arg = 1 + elif all(p == p_val * (-1) ** l for _, (l, p) in irreps): + p_arg = -1 + else: + assert False, "the parity of the input is not well defined" + self.irreps_in = irreps + if lmax_out is None: + lmax_out = lmax + if p_val in (0, +1): + self.irreps_out = o3.Irreps( + [(1, (l, p_val * p_arg**l)) for l in range(lmax_out + 1)] + ) + if p_val == -1: + x = paddle.linspace(start=0, stop=10, num=256) + a1, a2 = act(x), act(-x) + if (a1 - a2).abs().max_func() < a1.abs().max_func() * 1e-10: + self.irreps_out = o3.Irreps( + [(1, (l, p_arg**l)) for l in range(lmax_out + 1)] + ) + elif (a1 + a2).abs().max_func() < a1.abs().max_func() * 1e-10: + self.irreps_out = o3.Irreps( + [(1, (l, -(p_arg**l))) for l in range(lmax_out + 1)] + ) + else: + raise ValueError("warning! the parity is violated") + self.to_s2 = o3.ToS2Grid(lmax, res, normalization=normalization) + self.from_s2 = o3.FromS2Grid( + res, lmax_out, normalization=normalization, lmax_in=lmax + ) + self.act = normalize2mom(act) + self.random_rot = random_rot + + def __repr__(self): + return f"{self.__class__.__name__} ({self.irreps_in} -> {self.irreps_out})" + + def forward(self, features): + """evaluate + + Parameters + ---------- + + features : `torch.Tensor` + tensor :math:`\\{A^l\\}_l` of shape ``(..., self.irreps_in.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., self.irreps_out.dim)`` + """ + assert tuple(features.shape)[-1] == self.irreps_in.dim + if self.random_rot: + abc = o3.rand_angles(dtype=features.dtype, device=features.place) + features = paddle.einsum( + "ij,...j->...i", self.irreps_in.D_from_angles(*abc), features + ) + features = self.to_s2(features) + features = self.act(features) + features = self.from_s2(features) + if self.random_rot: + features = paddle.einsum( + "ij,...j->...i", self.irreps_out.D_from_angles(*abc).T, features + ) + return features diff --git a/ppmat/models/common/e3nn/nn/_so3act.py b/ppmat/models/common/e3nn/nn/_so3act.py new file mode 100644 index 00000000..ea750919 --- /dev/null +++ b/ppmat/models/common/e3nn/nn/_so3act.py @@ -0,0 +1,82 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn.math import normalize2mom +from ppmat.models.common.e3nn.o3 import SO3Grid + + +class SO3Activation(paddle.nn.Layer): + """Apply non linearity on the signal on SO(3) + + Parameters + ---------- + lmax_in : int + input lmax + + lmax_out : int + output lmax + + act : function + activation function :math:`\\phi` + + resolution : int + SO(3) grid resolution + + normalization : {'norm', 'component'} + """ + + def __init__( + self, + lmax_in, + lmax_out, + act, + resolution, + *, + normalization="component", + aspect_ratio=2, + ): + super().__init__() + self.grid_in = SO3Grid( + lmax_in, resolution, normalization=normalization, aspect_ratio=aspect_ratio + ) + self.grid_out = SO3Grid( + lmax_out, resolution, normalization=normalization, aspect_ratio=aspect_ratio + ) + self.act = normalize2mom(act) + self.lmax_in = lmax_in + self.lmax_out = lmax_out + + def __repr__(self): + return f"{self.__class__.__name__} ({self.lmax_in} -> {self.lmax_out})" + + def forward(self, features): + """evaluate + + Parameters + ---------- + + features : `torch.Tensor` + tensor of shape ``(..., self.irreps_in.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., self.irreps_out.dim)`` + """ + features = self.grid_in.to_grid(features) + features = self.act(features) + features = self.grid_out.from_grid(features) + return features diff --git a/ppmat/models/common/e3nn/o3/__init__.py b/ppmat/models/common/e3nn/o3/__init__.py new file mode 100644 index 00000000..92568e7a --- /dev/null +++ b/ppmat/models/common/e3nn/o3/__init__.py @@ -0,0 +1,132 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._angular_spherical_harmonics import Legendre +from ._angular_spherical_harmonics import SphericalHarmonicsAlphaBeta +from ._angular_spherical_harmonics import spherical_harmonics_alpha +from ._angular_spherical_harmonics import spherical_harmonics_alpha_beta +from ._irreps import Irrep +from ._irreps import Irreps +from ._linear import Linear +from ._norm import Norm +from ._reduce import ReducedTensorProducts +from ._rotation import angles_to_axis_angle +from ._rotation import angles_to_matrix +from ._rotation import angles_to_quaternion +from ._rotation import angles_to_xyz +from ._rotation import axis_angle_to_angles +from ._rotation import axis_angle_to_matrix +from ._rotation import axis_angle_to_quaternion +from ._rotation import compose_angles +from ._rotation import compose_axis_angle +from ._rotation import compose_quaternion +from ._rotation import identity_angles +from ._rotation import identity_quaternion +from ._rotation import inverse_angles +from ._rotation import inverse_quaternion +from ._rotation import matrix_to_angles +from ._rotation import matrix_to_axis_angle +from ._rotation import matrix_to_quaternion +from ._rotation import matrix_x +from ._rotation import matrix_y +from ._rotation import matrix_z +from ._rotation import quaternion_to_angles +from ._rotation import quaternion_to_axis_angle +from ._rotation import quaternion_to_matrix +from ._rotation import rand_angles +from ._rotation import rand_axis_angle +from ._rotation import rand_matrix +from ._rotation import rand_quaternion +from ._rotation import xyz_to_angles +from ._s2grid import FromS2Grid +from ._s2grid import ToS2Grid +from ._s2grid import irfft +from ._s2grid import rfft +from ._s2grid import s2_grid +from ._s2grid import spherical_harmonics_s2_grid +from ._so3grid import SO3Grid +from ._spherical_harmonics import SphericalHarmonics +from ._spherical_harmonics import spherical_harmonics +from ._tensor_product import ElementwiseTensorProduct +from ._tensor_product import FullTensorProduct +from ._tensor_product import FullyConnectedTensorProduct +from ._tensor_product import Instruction +from ._tensor_product import TensorProduct +from ._tensor_product import TensorSquare +from ._wigner import change_basis_real_to_complex +from ._wigner import so3_generators +from ._wigner import su2_generators +from ._wigner import wigner_3j +from ._wigner import wigner_D + +__all__ = [ + "rand_matrix", # + "identity_angles", + "rand_angles", + "compose_angles", + "inverse_angles", + "identity_quaternion", + "rand_quaternion", + "compose_quaternion", + "inverse_quaternion", + "rand_axis_angle", + "compose_axis_angle", + "matrix_x", + "matrix_y", + "matrix_z", + "angles_to_matrix", + "matrix_to_angles", + "angles_to_quaternion", + "matrix_to_quaternion", + "axis_angle_to_quaternion", + "quaternion_to_axis_angle", + "matrix_to_axis_angle", + "angles_to_axis_angle", + "axis_angle_to_matrix", + "quaternion_to_matrix", + "quaternion_to_angles", + "axis_angle_to_angles", + "angles_to_xyz", + "xyz_to_angles", + "wigner_D", + "wigner_3j", + "change_basis_real_to_complex", + "su2_generators", + "so3_generators", + "Irrep", + "Irreps", + "irrep", + "Instruction", + "TensorProduct", + "FullyConnectedTensorProduct", + "ElementwiseTensorProduct", + "FullTensorProduct", + "TensorSquare", + "SphericalHarmonics", + "spherical_harmonics", + "SphericalHarmonicsAlphaBeta", + "spherical_harmonics_alpha_beta", + "spherical_harmonics_alpha", + "Legendre", + "ReducedTensorProducts", + "s2_grid", + "spherical_harmonics_s2_grid", + "rfft", + "irfft", + "ToS2Grid", + "FromS2Grid", + "SO3Grid", + "Linear", + "Norm", +] \ No newline at end of file diff --git a/ppmat/models/common/e3nn/o3/_angular_spherical_harmonics.py b/ppmat/models/common/e3nn/o3/_angular_spherical_harmonics.py new file mode 100644 index 00000000..65933fb9 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_angular_spherical_harmonics.py @@ -0,0 +1,216 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +import paddle.nn as nn + +from ppmat.models.common.e3nn.paddle_utils import * + +"""Spherical Harmonics as functions of Euler angles +""" +import math +from typing import List +from typing import Tuple + +from sympy import Integer +from sympy import Poly +from sympy import diff +from sympy import factorial +from sympy import pi +from sympy import sqrt +from sympy import symbols + +from ppmat.models.common.e3nn import o3 + + +class SphericalHarmonicsAlphaBeta(paddle.nn.Layer): + """JITable module version of :meth:`e3nn.o3.spherical_harmonics_alpha_beta`. + + Parameters are identical to :meth:`e3nn.o3.spherical_harmonics_alpha_beta`. + """ + + normalization: str + _ls_list: List[int] + _lmax: int + + def __init__(self, l, normalization="integral"): + super().__init__() + if isinstance(l, o3.Irreps): + ls = [l for mul, (l, p) in l for _ in range(mul)] + elif isinstance(l, int): + ls = [l] + else: + ls = list(l) + self._ls_list = ls + self._lmax = max(ls) + self.legendre = Legendre(ls) + self.normalization = normalization + + def forward(self, alpha: paddle.Tensor, beta: paddle.Tensor) -> paddle.Tensor: + y, z = beta.cos(), beta.sin() + sha = spherical_harmonics_alpha(self._lmax, alpha.flatten()) + shy = self.legendre(y.flatten(), z.flatten()) + out = _mul_m_lm([(1, l) for l in self._ls_list], sha, shy) + if self.normalization == "norm": + out.divide_( + y=paddle.to_tensor( + paddle.concat( + x=[ + ( + math.sqrt(2 * l + 1) + / math.sqrt(4 * math.pi) + * paddle.ones(shape=2 * l + 1, dtype=out.dtype) + ) + for l in self._ls_list + ] + ) + ) + ) + elif self.normalization == "component": + out.multiply_(y=paddle.to_tensor(math.sqrt(4 * math.pi))) + return out.reshape(tuple(alpha.shape) + (tuple(shy.shape)[1],)) + + +def spherical_harmonics_alpha_beta(l, alpha, beta, *, normalization="integral"): + """Spherical harmonics of :math:`\\vec r = R_y(\\alpha) R_x(\\beta) e_y` + + .. math:: Y^l(\\alpha, \\beta) = S^l(\\alpha) P^l(\\cos(\\beta)) + + where :math:`P^l` are the `Legendre` polynomials + + + Parameters + ---------- + l : int or list of int + degree of the spherical harmonics. + + alpha : `torch.Tensor` + tensor of shape ``(...)``. + + beta : `torch.Tensor` + tensor of shape ``(...)``. + + Returns + ------- + `torch.Tensor` + a tensor of shape ``(..., 2l+1)`` + """ + sh = SphericalHarmonicsAlphaBeta(l, normalization=normalization) + return sh(alpha, beta) + + +def spherical_harmonics_alpha(l: int, alpha: paddle.Tensor) -> paddle.Tensor: + """:math:`S^l(\\alpha)` of `spherical_harmonics_alpha_beta` + + Parameters + ---------- + l : int + degree of the spherical harmonics. + + alpha : `torch.Tensor` + tensor of shape ``(...)``. + + Returns + ------- + `torch.Tensor` + a tensor of shape ``(..., 2l+1)`` + """ + alpha = alpha.unsqueeze(axis=-1) + m = paddle.arange(start=1, end=l + 1, dtype=alpha.dtype) + cos = paddle.cos(x=m * alpha) + m = paddle.arange(start=l, end=0, step=-1, dtype=alpha.dtype) + sin = paddle.sin(x=m * alpha) + out = paddle.concat( + x=[math.sqrt(2) * sin, paddle.ones_like(x=alpha), math.sqrt(2) * cos], + axis=alpha.ndim - 1, + ) + return out + + +class Legendre(nn.Layer): + def __init__(self, ls): + super().__init__() + self.ls = ls + + def forward(self, z: paddle.Tensor, y: paddle.Tensor) -> paddle.Tensor: + out_shape = list(z.shape) + [sum(2 * l + 1 for l in self.ls)] + out = paddle.zeros(out_shape, dtype=z.dtype) + + i = 0 + for l in self.ls: + leg = [] + for m in range(l + 1): + p = _poly_legendre(l, m) + x = paddle.zeros_like(z) + + for (zn, yn), c in p.items(): + x += float(c) * paddle.pow(z, zn) * paddle.pow(y, yn) + + leg.append(paddle.unsqueeze(x, axis=-1)) + + for m in range(-l, l + 1): + out_slice = paddle.slice(out, axes=[-1], starts=[i], ends=[i + 1]) + paddle.assign(leg[abs(m)], out_slice) + i += 1 + + return out + + +def _poly_legendre(l, m): + """ + polynomial coefficients of legendre + + y = sqrt(1 - z^2) + """ + z, y = symbols("z y", real=True) + return Poly(_sympy_legendre(l, m), domain="R", gens=(z, y)).as_dict() + + +def _sympy_legendre(l, m): + """ + en.wikipedia.org/wiki/Associated_Legendre_polynomials + - remove two times (-1)^m + - use another normalization such that P(l, -m) = P(l, m) + - remove (-1)^l + + y = sqrt(1 - z^2) + """ + l = Integer(l) + m = Integer(abs(m)) + z, y = symbols("z y", real=True) + ex = 1 / (2**l * factorial(l)) * y**m * diff((z**2 - 1) ** l, z, l + m) + ex *= sqrt((2 * l + 1) / (4 * pi) * factorial(l - m) / factorial(l + m)) + return ex + + +def _mul_m_lm( + mul_l: List[Tuple[int, int]], x_m: paddle.Tensor, x_lm: paddle.Tensor +) -> paddle.Tensor: + """ + multiply tensor [..., l * m] by [..., m] + """ + l_max = tuple(x_m.shape)[-1] // 2 + out = [] + i = 0 + for mul, l in mul_l: + d = mul * (2 * l + 1) + x1 = x_lm[..., i : i + d] + x1 = x1.reshape(tuple(x1.shape)[:-1] + (mul, 2 * l + 1)) + x2 = x_m[..., l_max - l : l_max + l + 1] + x2 = x2.reshape(tuple(x2.shape)[:-1] + (1, 2 * l + 1)) + x = x1 * x2 + x = x.reshape(tuple(x.shape)[:-2] + (d,)) + out.append(x) + i += d + return paddle.concat(x=out, axis=-1) diff --git a/ppmat/models/common/e3nn/o3/_irreps.py b/ppmat/models/common/e3nn/o3/_irreps.py new file mode 100644 index 00000000..cbcdb42b --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_irreps.py @@ -0,0 +1,733 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections +import itertools +from typing import List +from typing import Union + +import paddle + +from ppmat.models.common.e3nn.math import direct_sum +from ppmat.models.common.e3nn.math import perm +from ppmat.models.common.e3nn.paddle_utils import * + +from . import _rotation +from . import _wigner + + +class Irrep(tuple): + """Irreducible representation of :math:`O(3)` + + This class does not contain any data, it is a structure that describe the representation. + It is typically used as argument of other classes of the library to define the input and output representations of + functions. + + Parameters + ---------- + l : int + non-negative integer, the degree of the representation, :math:`l = 0, 1, \\dots` + + p : {1, -1} + the parity of the representation + + Examples + -------- + Create a scalar representation (:math:`l=0`) of even parity. + + >>> Irrep(0, 1) + 0e + + Create a pseudotensor representation (:math:`l=2`) of odd parity. + + >>> Irrep(2, -1) + 2o + + Create a vector representation (:math:`l=1`) of the parity of the spherical harmonics (:math:`-1^l` gives odd parity). + + >>> Irrep("1y") + 1o + + >>> Irrep("2o").dim + 5 + + >>> Irrep("2e") in Irrep("1o") * Irrep("1o") + True + + >>> Irrep("1o") + Irrep("2o") + 1x1o+1x2o + """ + + def __new__(cls, l: Union[int, "Irrep", str, tuple], p=None): + if p is None: + if isinstance(l, Irrep): + return l + if isinstance(l, str): + try: + name = l.strip() + l = int(name[:-1]) + assert l >= 0 + p = {"e": 1, "o": -1, "y": (-1) ** l}[name[-1]] + except Exception: + raise ValueError(f'unable to convert string "{name}" into an Irrep') + elif isinstance(l, tuple): + l, p = l + if not isinstance(l, int) or l < 0: + raise ValueError(f"l must be positive integer, got {l}") + if p not in (-1, 1): + raise ValueError(f"parity must be on of (-1, 1), got {p}") + return super().__new__(cls, (l, p)) + + @property + def l(self) -> int: + """The degree of the representation, :math:`l = 0, 1, \\dots`.""" + return self[0] + + @property + def p(self) -> int: + """The parity of the representation, :math:`p = \\pm 1`.""" + return self[1] + + def __repr__(self): + p = {(+1): "e", (-1): "o"}[self.p] + return f"{self.l}{p}" + + @classmethod + def iterator(cls, lmax=None): + """Iterator through all the irreps of :math:`O(3)` + + Examples + -------- + >>> it = Irrep.iterator() + >>> next(it), next(it), next(it), next(it) + (0e, 0o, 1o, 1e) + """ + for l in itertools.count(): + yield Irrep(l, (-1) ** l) + yield Irrep(l, -((-1) ** l)) + if l == lmax: + break + + def D_from_angles(self, alpha, beta, gamma, k=None): + """Matrix :math:`p^k D^l(\\alpha, \\beta, \\gamma)` + + (matrix) Representation of :math:`O(3)`. :math:`D` is the representation of :math:`SO(3)`, see `wigner_D`. + + Parameters + ---------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + Rotation :math:`\\alpha` around Y axis, applied third. + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + Rotation :math:`\\beta` around X axis, applied second. + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + Rotation :math:`\\gamma` around Y axis, applied first. + + k : `torch.Tensor`, optional + tensor of shape :math:`(...)` + How many times the parity is applied. + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 2l+1, 2l+1)` + + See Also + -------- + o3.wigner_D + Irreps.D_from_angles + """ + if k is None: + k = paddle.zeros_like(x=alpha) + alpha, beta, gamma, k = paddle.broadcast_tensors(input=[alpha, beta, gamma, k]) + return ( + _wigner.wigner_D(self.l, alpha, beta, gamma) * self.p ** k[..., None, None] + ) + + def D_from_quaternion(self, q, k=None): + """Matrix of the representation, see `Irrep.D_from_angles` + + Parameters + ---------- + q : `torch.Tensor` + tensor of shape :math:`(..., 4)` + + k : `torch.Tensor`, optional + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 2l+1, 2l+1)` + """ + return self.D_from_angles(*_rotation.quaternion_to_angles(q), k) + + def D_from_matrix(self, R): + """Matrix of the representation, see `Irrep.D_from_angles` + + Parameters + ---------- + R : `torch.Tensor` + tensor of shape :math:`(..., 3, 3)` + + k : `torch.Tensor`, optional + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 2l+1, 2l+1)` + + Examples + -------- + >>> m = Irrep(1, -1).D_from_matrix(-torch.eye(3)) + >>> m.long() + tensor([[-1, 0, 0], + [ 0, -1, 0], + [ 0, 0, -1]]) + """ + d = paddle.linalg.det(x=R).sign() + R = d[..., None, None] * R + k = (1 - d) / 2 + return self.D_from_angles(*_rotation.matrix_to_angles(R), k) + + def D_from_axis_angle(self, axis, angle): + """Matrix of the representation, see `Irrep.D_from_angles` + + Parameters + ---------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 2l+1, 2l+1)` + """ + return self.D_from_angles(*_rotation.axis_angle_to_angles(axis, angle)) + + @property + def dim(self) -> int: + """The dimension of the representation, :math:`2 l + 1`.""" + return 2 * self.l + 1 + + def is_scalar(self) -> bool: + """Equivalent to ``l == 0 and p == 1``""" + return self.l == 0 and self.p == 1 + + def __mul__(self, other): + """Generate the irreps from the product of two irreps. + + Returns + ------- + generator of `e3nn.o3.Irrep` + """ + other = Irrep(other) + p = self.p * other.p + lmin = abs(self.l - other.l) + lmax = self.l + other.l + for l in range(lmin, lmax + 1): + yield Irrep(l, p) + + def count(self, _value): + raise NotImplementedError + + def index(self, _value): + raise NotImplementedError + + def __rmul__(self, other): + """ + >>> 3 * Irrep('1e') + 3x1e + """ + assert isinstance(other, int) + return Irreps([(other, self)]) + + def __add__(self, other): + return Irreps(self) + Irreps(other) + + def __contains__(self, _object): + raise NotImplementedError + + def __len__(self): + raise NotImplementedError + + +class _MulIr(tuple): + def __new__(cls, mul, ir=None): + if ir is None: + mul, ir = mul + assert isinstance(mul, int) + assert isinstance(ir, Irrep) + return super().__new__(cls, (mul, ir)) + + @property + def mul(self) -> int: + return self[0] + + @property + def ir(self) -> Irrep: + return self[1] + + @property + def dim(self) -> int: + return self.mul * self.ir.dim + + def __repr__(self): + return f"{self.mul}x{self.ir}" + + def __getitem__(self, item) -> Union[int, Irrep]: + return super().__getitem__(item) + + def count(self, _value): + raise NotImplementedError + + def index(self, _value): + raise NotImplementedError + + +class Irreps(tuple): + """Direct sum of irreducible representations of :math:`O(3)` + + This class does not contain any data, it is a structure that describe the representation. + It is typically used as argument of other classes of the library to define the input and output representations of + functions. + + Attributes + ---------- + dim : int + the total dimension of the representation + + num_irreps : int + number of irreps. the sum of the multiplicities + + ls : list of int + list of :math:`l` values + + lmax : int + maximum :math:`l` value + + Examples + -------- + Create a representation of 100 :math:`l=0` of even parity and 50 pseudo-vectors. + + >>> x = Irreps([(100, (0, 1)), (50, (1, 1))]) + >>> x + 100x0e+50x1e + + >>> x.dim + 250 + + Create a representation of 100 :math:`l=0` of even parity and 50 pseudo-vectors. + + >>> Irreps("100x0e + 50x1e") + 100x0e+50x1e + + >>> Irreps("100x0e + 50x1e + 0x2e") + 100x0e+50x1e+0x2e + + >>> Irreps("100x0e + 50x1e + 0x2e").lmax + 1 + + >>> Irrep("2e") in Irreps("0e + 2e") + True + + Empty Irreps + + >>> Irreps(), Irreps("") + (, ) + """ + + def __new__(cls, irreps=None) -> Union[_MulIr, "Irreps"]: + if isinstance(irreps, Irreps): + return super().__new__(cls, irreps) + out = [] + if isinstance(irreps, Irrep): + out.append(_MulIr(1, Irrep(irreps))) + elif isinstance(irreps, str): + try: + if irreps.strip() != "": + for mul_ir in irreps.split("+"): + if "x" in mul_ir: + mul, ir = mul_ir.split("x") + mul = int(mul) + ir = Irrep(ir) + else: + mul = 1 + ir = Irrep(mul_ir) + assert isinstance(mul, int) and mul >= 0 + out.append(_MulIr(mul, ir)) + except Exception: + raise ValueError(f'Unable to convert string "{irreps}" into an Irreps') + elif irreps is None: + pass + else: + for mul_ir in irreps: + mul = None + ir = None + if isinstance(mul_ir, str): + mul = 1 + ir = Irrep(mul_ir) + elif isinstance(mul_ir, Irrep): + mul = 1 + ir = mul_ir + elif isinstance(mul_ir, _MulIr): + mul, ir = mul_ir + elif len(mul_ir) == 2: + mul, ir = mul_ir + ir = Irrep(ir) + if not (isinstance(mul, int) and mul >= 0 and ir is not None): + raise ValueError(f'Unable to interpret "{mul_ir}" as an irrep.') + out.append(_MulIr(mul, ir)) + return super().__new__(cls, out) + + @staticmethod + def spherical_harmonics(lmax, p=-1): + """representation of the spherical harmonics + + Parameters + ---------- + lmax : int + maximum :math:`l` + + p : {1, -1} + the parity of the representation + + Returns + ------- + `e3nn.o3.Irreps` + representation of :math:`(Y^0, Y^1, \\dots, Y^{\\mathrm{lmax}})` + + Examples + -------- + + >>> Irreps.spherical_harmonics(3) + 1x0e+1x1o+1x2e+1x3o + + >>> Irreps.spherical_harmonics(4, p=1) + 1x0e+1x1e+1x2e+1x3e+1x4e + """ + return Irreps([(1, (l, p**l)) for l in range(lmax + 1)]) + + def slices(self): + """List of slices corresponding to indices for each irrep. + + Examples + -------- + + >>> Irreps('2x0e + 1e').slices() + [slice(0, 2, None), slice(2, 5, None)] + """ + s = [] + i = 0 + for mul_ir in self: + s.append(slice(i, i + mul_ir.dim)) + i += mul_ir.dim + return s + + def randn( + self, + *size, + normalization="component", + requires_grad=False, + dtype=None, + device=None, + ): + """Random tensor. + + Parameters + ---------- + *size : list of int + size of the output tensor, needs to contains a ``-1`` + + normalization : {'component', 'norm'} + + Returns + ------- + `torch.Tensor` + tensor of shape ``size`` where ``-1`` is replaced by ``self.dim`` + + Examples + -------- + + >>> Irreps("5x0e + 10x1o").randn(5, -1, 5, normalization='norm').shape + torch.Size([5, 35, 5]) + + >>> random_tensor = Irreps("2o").randn(2, -1, 3, normalization='norm') + >>> random_tensor.norm(dim=1).sub(1).abs().max().item() < 1e-5 + True + """ + di = size.index(-1) + lsize = size[:di] + rsize = size[di + 1 :] + if normalization == "component": + out_5 = paddle.randn(shape=[*lsize, self.dim, *rsize], dtype=dtype) + out_5.stop_gradient = not requires_grad + return out_5 + elif normalization == "norm": + out_6 = paddle.zeros(shape=[*lsize, self.dim, *rsize], dtype=dtype) + out_6.stop_gradient = not requires_grad + x = out_6 + with paddle.no_grad(): + for s, (mul, ir) in zip(self.slices(), self): + r = paddle.randn(shape=[*lsize, mul, ir.dim, *rsize], dtype=dtype) + r.divide_( + y=paddle.to_tensor(r.norm(p=2, axis=di + 1, keepdim=True)) + ) + start_6 = x.shape[di] + s.start if s.start < 0 else s.start + paddle.assign( + r.reshape(*lsize, -1, *rsize), + output=paddle.slice( + x, [di], [start_6], [start_6 + mul * ir.dim] + ), + ) + return x + else: + raise ValueError("Normalization needs to be 'norm' or 'component'") + + def __getitem__(self, i) -> Union[_MulIr, "Irreps"]: + x = super().__getitem__(i) + if isinstance(i, slice): + return Irreps(x) + return x + + def __contains__(self, ir) -> bool: + ir = Irrep(ir) + return ir in (irrep for _, irrep in self) + + def count(self, ir) -> int: + """Multiplicity of ``ir``. + + Parameters + ---------- + ir : `e3nn.o3.Irrep` + + Returns + ------- + `int` + total multiplicity of ``ir`` + """ + ir = Irrep(ir) + return sum(mul for mul, irrep in self if ir == irrep) + + def index(self, _object): + raise NotImplementedError + + def __add__(self, irreps): + irreps = Irreps(irreps) + return Irreps(super().__add__(irreps)) + + def __mul__(self, other): + """ + >>> (Irreps('2x1e') * 3).simplify() + 6x1e + """ + if isinstance(other, Irreps): + raise NotImplementedError( + "Use o3.TensorProduct for this, see the documentation" + ) + return Irreps(super().__mul__(other)) + + def __rmul__(self, other): + """ + >>> 2 * Irreps('0e + 1e') + 1x0e+1x1e+1x0e+1x1e + """ + return Irreps(super().__rmul__(other)) + + def simplify(self) -> "Irreps": + """Simplify the representations. + + Returns + ------- + `e3nn.o3.Irreps` + + Examples + -------- + + Note that simplify does not sort the representations. + + >>> Irreps("1e + 1e + 0e").simplify() + 2x1e+1x0e + + Equivalent representations which are separated from each other are not combined. + + >>> Irreps("1e + 1e + 0e + 1e").simplify() + 2x1e+1x0e+1x1e + """ + out = [] + for mul, ir in self: + if out and out[-1][1] == ir: + out[-1] = out[-1][0] + mul, ir + elif mul > 0: + out.append((mul, ir)) + return Irreps(out) + + def remove_zero_multiplicities(self): + """Remove any irreps with multiplicities of zero. + + Returns + ------- + `e3nn.o3.Irreps` + + Examples + -------- + + >>> Irreps("4x0e + 0x1o + 2x3e").remove_zero_multiplicities() + 4x0e+2x3e + + """ + out = [(mul, ir) for mul, ir in self if mul > 0] + return Irreps(out) + + def sort(self): + """Sort the representations. + + Returns + ------- + irreps : `e3nn.o3.Irreps` + p : tuple of int + inv : tuple of int + + Examples + -------- + + >>> Irreps("1e + 0e + 1e").sort().irreps + 1x0e+1x1e+1x1e + + >>> Irreps("2o + 1e + 0e + 1e").sort().p + (3, 1, 0, 2) + + >>> Irreps("2o + 1e + 0e + 1e").sort().inv + (2, 1, 3, 0) + """ + Ret = collections.namedtuple("sort", ["irreps", "p", "inv"]) + out = [(ir, i, mul) for i, (mul, ir) in enumerate(self)] + out = sorted(out) + inv = tuple(i for _, i, _ in out) + p = perm.inverse(inv) + irreps = Irreps([(mul, ir) for ir, _, mul in out]) + return Ret(irreps, p, inv) + + @property + def dim(self) -> int: + return sum(mul * ir.dim for mul, ir in self) + + @property + def num_irreps(self) -> int: + return sum(mul for mul, _ in self) + + @property + def ls(self) -> List[int]: + return [l for mul, (l, p) in self for _ in range(mul)] + + @property + def lmax(self) -> int: + if len(self) == 0: + raise ValueError("Cannot get lmax of empty Irreps") + return max(self.ls) + + def __repr__(self): + return "+".join(f"{mul_ir}" for mul_ir in self) + + def D_from_angles(self, alpha, beta, gamma, k=None): + """Matrix of the representation + + Parameters + ---------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + + k : `torch.Tensor`, optional + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., \\mathrm{dim}, \\mathrm{dim})` + """ + return direct_sum( + *[ + ir.D_from_angles(alpha, beta, gamma, k) + for mul, ir in self + for _ in range(mul) + ] + ) + + def D_from_quaternion(self, q, k=None): + """Matrix of the representation + + Parameters + ---------- + q : `torch.Tensor` + tensor of shape :math:`(..., 4)` + + k : `torch.Tensor`, optional + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., \\mathrm{dim}, \\mathrm{dim})` + """ + return self.D_from_angles(*_rotation.quaternion_to_angles(q), k) + + def D_from_matrix(self, R): + """Matrix of the representation + + Parameters + ---------- + R : `torch.Tensor` + tensor of shape :math:`(..., 3, 3)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., \\mathrm{dim}, \\mathrm{dim})` + """ + d = paddle.linalg.det(x=R).sign() + R = d[..., None, None] * R + k = (1 - d) / 2 + return self.D_from_angles(*_rotation.matrix_to_angles(R), k) + + def D_from_axis_angle(self, axis, angle): + """Matrix of the representation + + Parameters + ---------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., \\mathrm{dim}, \\mathrm{dim})` + """ + return self.D_from_angles(*_rotation.axis_angle_to_angles(axis, angle)) diff --git a/ppmat/models/common/e3nn/o3/_linear.py b/ppmat/models/common/e3nn/o3/_linear.py new file mode 100644 index 00000000..f9b532ba --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_linear.py @@ -0,0 +1,386 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Callable +from typing import List +from typing import NamedTuple +from typing import Optional +from typing import Tuple +from typing import Union + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.util import prod +from ppmat.models.common.e3nn.util.codegen import CodeGenMixin + +from ._tensor_product._codegen import _sum_tensors + + +class Instruction(NamedTuple): + i_in: int + i_out: int + path_shape: tuple + path_weight: float + + +class Linear(CodeGenMixin, paddle.nn.Layer): + r"""Linear operation equivariant to O(3)""" + + weight_numel: int + internal_weights: bool + shared_weights: bool + + def __init__( + self, + irreps_in, + irreps_out, + *, + f_in: Optional[int] = None, + f_out: Optional[int] = None, + internal_weights: Optional[bool] = None, + shared_weights: Optional[bool] = None, + instructions: Optional[List[Tuple[int, int]]] = None, + biases: Union[bool, List[bool]] = False, + path_normalization: str = "element", + ): + super().__init__() + + assert path_normalization in ["element", "path"] + + irreps_in = o3.Irreps(irreps_in) + irreps_out = o3.Irreps(irreps_out) + + if instructions is None: + # By default, make all possible connections + instructions = [ + (i_in, i_out) + for i_in, (_, ir_in) in enumerate(irreps_in) + for i_out, (_, ir_out) in enumerate(irreps_out) + if ir_in == ir_out + ] + + instructions = [ + Instruction( + i_in=i_in, + i_out=i_out, + path_shape=(irreps_in[i_in].mul, irreps_out[i_out].mul), + path_weight=1, + ) + for i_in, i_out in instructions + ] + + def alpha(ins): + x = sum( + irreps_in[i.i_in if path_normalization == "element" else ins.i_in].mul + for i in instructions + if i.i_out == ins.i_out + ) + if f_in is not None: + x *= f_in + return 1.0 if x == 0 else x + + instructions = [ + Instruction( + i_in=ins.i_in, + i_out=ins.i_out, + path_shape=ins.path_shape, + path_weight=alpha(ins) ** (-0.5), + ) + for ins in instructions + ] + + for ins in instructions: + if not ins.i_in < len(irreps_in): + raise IndexError(f"{ins.i_in} is not a valid index for irreps_in") + if not ins.i_out < len(irreps_out): + raise IndexError(f"{ins.i_out} is not a valid index for irreps_out") + if not ( + ins.i_in == -1 or irreps_in[ins.i_in].ir == irreps_out[ins.i_out].ir + ): + raise ValueError( + f"{ins.i_in} and {ins.i_out} do not have the same irrep" + ) + + if biases is None: + biases = len(irreps_out) * (False,) + if isinstance(biases, bool): + biases = [biases and ir.is_scalar() for _, ir in irreps_out] + + assert len(biases) == len(irreps_out) + assert all(ir.is_scalar() or (not b) for b, (_, ir) in zip(biases, irreps_out)) + + instructions += [ + Instruction(i_in=-1, i_out=i_out, path_shape=(mul_ir.dim,), path_weight=1.0) + for i_out, (bias, mul_ir) in enumerate(zip(biases, irreps_out)) + if bias + ] + + if shared_weights is False and internal_weights is None: + internal_weights = False + + if shared_weights is None: + shared_weights = True + + if internal_weights is None: + internal_weights = True + + assert shared_weights or not internal_weights + self.internal_weights = internal_weights + self.shared_weights = shared_weights + + self.irreps_in = irreps_in + self.irreps_out = irreps_out + self.instructions = instructions + + # Generate forward function and weight sizes + self.forward_fn, self.weight_numel, self.bias_numel = _codegen_linear( + self.irreps_in, + self.irreps_out, + self.instructions, + f_in, + f_out, + shared_weights=shared_weights, + ) + + # Generate weights + if internal_weights and self.weight_numel > 0: + assert self.shared_weights, "Having internal weights impose shared weights" + weight_shape = ((f_in, f_out) if f_in is not None else ()) + ( + self.weight_numel, + ) + self.weight = self.create_parameter( + shape=weight_shape, default_initializer=paddle.nn.initializer.Normal() + ) + else: + # Avoid storing zero-sized tensors on the module: Paddle DataParallel + # synchronizes buffers across ranks and does not support numel == 0. + # When weight_numel == 0 (or weights are external), we create an empty + # tensor on-the-fly in forward if needed. + self.weight = None + + # Generate biases + if internal_weights and self.bias_numel > 0: + assert self.shared_weights, "Having internal weights impose shared weights" + bias_shape = ((f_out,) if f_out is not None else ()) + (self.bias_numel,) + self.bias = self.create_parameter( + shape=bias_shape, + default_initializer=paddle.nn.initializer.Constant(value=0.0), + ) + else: + self.bias = None + + # Compute output mask + if self.irreps_out.dim > 0: + output_mask = paddle.concat( + [ + ( + paddle.ones([mul_ir.dim]) + if any( + (ins.i_out == i_out) and (0 not in ins.path_shape) + for ins in self.instructions + ) + else paddle.zeros([mul_ir.dim]) + ) + for i_out, mul_ir in enumerate(self.irreps_out) + ] + ) + else: + output_mask = paddle.ones([0]) + self.register_buffer("output_mask", output_mask) + + def forward( + self, + features, + weight: Optional[paddle.Tensor] = None, + bias: Optional[paddle.Tensor] = None, + ): + if weight is None: + if self.weight_numel > 0 and not self.internal_weights: + raise RuntimeError( + "Weights must be provided when internal_weights = False" + ) + if self.weight is None: + weight = paddle.to_tensor( + [], dtype=features.dtype, place=features.place + ) + else: + weight = self.weight + if bias is None: + if self.bias_numel > 0 and not self.internal_weights: + raise RuntimeError( + "Biases must be provided when internal_weights = False" + ) + if self.bias is None: + bias = paddle.to_tensor([], dtype=features.dtype, place=features.place) + else: + bias = self.bias + return self.forward_fn(features, weight, bias) + + +def _codegen_linear( + irreps_in: o3.Irreps, + irreps_out: o3.Irreps, + instructions: List[Instruction], + f_in: Optional[int] = None, + f_out: Optional[int] = None, + shared_weights: bool = False, +) -> Tuple[Callable, int, int]: + # Remove empty instructions + instructions = [ins for ins in instructions if 0 not in ins.path_shape] + + def forward_fn( + x: paddle.Tensor, ws: paddle.Tensor, bs: paddle.Tensor + ) -> paddle.Tensor: + if f_in is None: + size = x.shape[:-1] + outsize = size + [irreps_out.dim] + else: + size = x.shape[:-2] + outsize = size + [f_out, irreps_out.dim] + + bias_numel = sum(irreps_out[i.i_out].dim for i in instructions if i.i_in == -1) + + if bias_numel > 0: + if f_out is None: + bs = bs.reshape([-1, bias_numel]) + else: + bs = bs.reshape([-1, f_out, bias_numel]) + + if len(instructions) == 0 and bias_numel == 0: + return paddle.zeros(outsize, dtype=x.dtype) + + if f_in is None: + x = x.reshape([-1, irreps_in.dim]) + else: + x = x.reshape([-1, f_in, irreps_in.dim]) + batch_out = x.shape[0] + + weight_numel = sum( + prod(ins.path_shape) for ins in instructions if ins.i_in != -1 + ) + if weight_numel > 0: + ws = ( + ws.reshape([-1, weight_numel]) + if f_in is None + else ws.reshape([-1, f_in, f_out, weight_numel]) + ) + + # Extract individual input irreps + if len(irreps_in) == 1: + x_list = [ + x.reshape( + [batch_out] + + ([] if f_in is None else [f_in]) + + [irreps_in[0].mul, irreps_in[0].ir.dim] + ) + ] + else: + x_list = [] + start = 0 + for mul_ir in irreps_in: + x_slice = paddle.slice(x, [-1], [start], [start + mul_ir.dim]) + x_list.append( + x_slice.reshape( + [batch_out] + + ([] if f_in is None else [f_in]) + + [mul_ir.mul, mul_ir.ir.dim] + ) + ) + start += mul_ir.dim + + z = "" if shared_weights else "z" + flat_weight_index = 0 + flat_bias_index = 0 + out_list = [] + + # Process instructions + for ins in instructions: + mul_ir_out = irreps_out[ins.i_out] + + if ins.i_in == -1: + # Handle bias + b = paddle.slice( + bs, + [-1], + [flat_bias_index], + [flat_bias_index + prod(ins.path_shape)], + ) + flat_bias_index += prod(ins.path_shape) + out_list += [ + (ins.path_weight * b).reshape( + [1] + ([] if f_out is None else [f_out]) + [mul_ir_out.dim] + ) + ] + else: + mul_ir_in = irreps_in[ins.i_in] + if mul_ir_in.dim == 0 or mul_ir_out.dim == 0: + continue + + path_nweight = prod(ins.path_shape) + w = ( + ws + if len(instructions) == 1 + else paddle.slice( + ws, + [-1], + [flat_weight_index], + [flat_weight_index + path_nweight], + ) + ) + w = w.reshape( + ([] if shared_weights else [-1]) + + ([] if f_in is None else [f_in, f_out]) + + list(ins.path_shape) + ) + flat_weight_index += path_nweight + + if f_in is None: + ein_out = paddle.einsum(f"{z}uw,zui->zwi", w, x_list[ins.i_in]) + else: + ein_out = paddle.einsum(f"{z}xyuw,zxui->zywi", w, x_list[ins.i_in]) + + ein_out = ins.path_weight * ein_out + out_list += [ + ein_out.reshape( + [batch_out] + + ([] if f_out is None else [f_out]) + + [mul_ir_out.dim] + ) + ] + + # Combine outputs + out = [ + _sum_tensors( + [out for ins, out in zip(instructions, out_list) if ins.i_out == i_out], + shape=[batch_out] + + ([] if f_out is None else [f_out]) + + [mul_ir_out.dim], + like=x, + ) + for i_out, mul_ir_out in enumerate(irreps_out) + if mul_ir_out.mul > 0 + ] + + if len(out) > 1: + out = paddle.concat(out, axis=-1) + else: + out = out[0] + + return out.reshape(outsize) + + weight_numel = sum(prod(ins.path_shape) for ins in instructions if ins.i_in != -1) + bias_numel = sum(irreps_out[i.i_out].dim for i in instructions if i.i_in == -1) + + return forward_fn, weight_numel, bias_numel diff --git a/ppmat/models/common/e3nn/o3/_norm.py b/ppmat/models/common/e3nn/o3/_norm.py new file mode 100644 index 00000000..d3ee21e3 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_norm.py @@ -0,0 +1,76 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.common.e3nn import o3 + + +class Norm(paddle.nn.Layer): + """Norm of each irrep in a direct sum of irreps. + + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + representation of the input + + squared : bool, optional + Whether to return the squared norm. ``False`` by default, i.e. the norm itself (sqrt of squared norm) is returned. + + Examples + -------- + Compute the norms of 17 vectors. + + >>> norm = Norm("17x1o") + >>> norm(torch.randn(17 * 3)).shape + torch.Size([17]) + """ + + squared: bool + + def __init__(self, irreps_in, squared: bool = False): + super().__init__() + irreps_in = o3.Irreps(irreps_in).simplify() + irreps_out = o3.Irreps([(mul, "0e") for mul, _ in irreps_in]) + instr = [ + (i, i, i, "uuu", False, ir.dim) for i, (mul, ir) in enumerate(irreps_in) + ] + self.tp = o3.TensorProduct( + irreps_in, irreps_in, irreps_out, instr, irrep_normalization="component" + ) + self.irreps_in = irreps_in + self.irreps_out = irreps_out.simplify() + self.squared = squared + + def __repr__(self): + return f"{self.__class__.__name__}({self.irreps_in})" + + def forward(self, features): + """Compute norms of irreps in ``features``. + + Parameters + ---------- + features : `torch.Tensor` + tensor of shape ``(..., irreps_in.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., irreps_out.dim)`` + """ + out = self.tp(features, features) + if self.squared: + return out + else: + return out.relu().sqrt() diff --git a/ppmat/models/common/e3nn/o3/_reduce.py b/ppmat/models/common/e3nn/o3/_reduce.py new file mode 100644 index 00000000..a1b39a93 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_reduce.py @@ -0,0 +1,283 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import collections + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.math import germinate_formulas +from ppmat.models.common.e3nn.math import orthonormalize +from ppmat.models.common.e3nn.math import reduce_permutation +from ppmat.models.common.e3nn.util import explicit_default_types +from ppmat.models.common.e3nn.util.codegen import CodeGenMixin + +_TP = collections.namedtuple("tp", "op, args") +_INPUT = collections.namedtuple("input", "tensor, start, stop") + + +def _wigner_nj( + *irrepss, normalization="component", filter_ir_mid=None, dtype=None, device=None +): + irrepss = [o3.Irreps(irreps) for irreps in irrepss] + if filter_ir_mid is not None: + filter_ir_mid = [o3.Irrep(ir) for ir in filter_ir_mid] + + if len(irrepss) == 1: + (irreps,) = irrepss + ret = [] + e = paddle.eye(irreps.dim, dtype=dtype) + i = 0 + for mul, ir in irreps: + for _ in range(mul): + sl = slice(i, i + ir.dim) + ret += [(ir, _INPUT(0, sl.start, sl.stop), e[sl])] + i += ir.dim + return ret + + *irrepss_left, irreps_right = irrepss + ret = [] + for ir_left, path_left, C_left in _wigner_nj( + *irrepss_left, + normalization=normalization, + filter_ir_mid=filter_ir_mid, + dtype=dtype, + ): + i = 0 + for mul, ir in irreps_right: + for ir_out in ir_left * ir: + if filter_ir_mid is not None and ir_out not in filter_ir_mid: + continue + + C = o3.wigner_3j(ir_out.l, ir_left.l, ir.l, dtype=dtype) + if normalization == "component": + C *= ir_out.dim**0.5 + if normalization == "norm": + C *= ir_left.dim**0.5 * ir.dim**0.5 + + C = paddle.einsum( + "jk,ijl->ikl", C_left.reshape([-1, C_left.shape[-1]]), C + ) + C = C.reshape( + [ir_out.dim] + [irreps.dim for irreps in irrepss_left] + [ir.dim] + ) + + for u in range(mul): + E = paddle.zeros( + [ir_out.dim] + + [irreps.dim for irreps in irrepss_left] + + [irreps_right.dim], + dtype=dtype, + ) + sl = slice(i + u * ir.dim, i + (u + 1) * ir.dim) + E[..., sl] = C + ret += [ + ( + ir_out, + _TP( + op=(ir_left, ir, ir_out), + args=( + path_left, + _INPUT(len(irrepss_left), sl.start, sl.stop), + ), + ), + E, + ) + ] + i += mul * ir.dim + + return sorted(ret, key=lambda x: x[0]) + + +def _get_ops(path): + if isinstance(path, _INPUT): + return + assert isinstance(path, _TP) + yield path.op + for op in _get_ops(path.args[0]): + yield op + + +class ReducedTensorProducts(CodeGenMixin, paddle.nn.Layer): + def __init__( + self, formula, filter_ir_out=None, filter_ir_mid=None, eps=1e-9, **irreps + ): + super().__init__() + + if filter_ir_out is not None: + try: + filter_ir_out = [o3.Irrep(ir) for ir in filter_ir_out] + except ValueError: + raise ValueError( + f"filter_ir_out (={filter_ir_out}) must be an iterable of e3nn.o3.Irrep" + ) + + if filter_ir_mid is not None: + try: + filter_ir_mid = [o3.Irrep(ir) for ir in filter_ir_mid] + except ValueError: + raise ValueError( + f"filter_ir_mid (={filter_ir_mid}) must be an iterable of e3nn.o3.Irrep" + ) + + f0, formulas = germinate_formulas(formula) + + irreps = {i: o3.Irreps(irs) for i, irs in irreps.items()} + + for i in irreps: + if len(i) != 1: + raise TypeError(f"got an unexpected keyword argument '{i}'") + + for _sign, p in formulas: + f = "".join(f0[i] for i in p) + for i, j in zip(f0, f): + if i in irreps and j in irreps and irreps[i] != irreps[j]: + raise RuntimeError(f"irreps of {i} and {j} should be the same") + if i in irreps: + irreps[j] = irreps[i] + if j in irreps: + irreps[i] = irreps[j] + + for i in f0: + if i not in irreps: + raise RuntimeError(f"index {i} has no irreps associated to it") + + for i in irreps: + if i not in f0: + raise RuntimeError( + f"index {i} has an irreps but does not appear in the fomula" + ) + + base_perm, _ = reduce_permutation( + f0, formulas, dtype="float64", **{i: irs.dim for i, irs in irreps.items()} + ) + + Ps = collections.defaultdict(list) + + for ir, path, base_o3 in _wigner_nj( + *[irreps[i] for i in f0], filter_ir_mid=filter_ir_mid, dtype="float64" + ): + if filter_ir_out is None or ir in filter_ir_out: + Ps[ir].append((path, base_o3)) + + outputs = [] + change_of_basis = [] + irreps_out = [] + + P = base_perm.reshape([base_perm.shape[0], -1]) + PP = paddle.matmul(P, P.t()) + + for ir in Ps: + mul = len(Ps[ir]) + paths = [path for path, _ in Ps[ir]] + base_o3 = paddle.stack([R for _, R in Ps[ir]]) + + R = base_o3.reshape([base_o3.shape[0], ir.dim, -1]) + + proj_s = [] + for j in range(ir.dim): + RR = paddle.matmul(R[:, j], R[:, j].t()) + RP = paddle.matmul(R[:, j], P.t()) + + prob = paddle.concat( + [ + paddle.concat([RR, -RP], axis=1), + paddle.concat([-RP.t(), PP], axis=1), + ], + axis=0, + ) + + eigenvalues, eigenvectors = paddle.linalg.eigh(prob) + X = eigenvectors[:, eigenvalues < eps][:mul].t() + proj_s.append(paddle.matmul(X.t(), X)) + + break + + for p in proj_s: + assert ( + paddle.max(paddle.abs(p - proj_s[0])) < eps + ), f"found different solutions for irrep {ir}" + + X, _ = orthonormalize(proj_s[0], eps) + + for x in X: + C = paddle.einsum("u,ui...->i...", x, base_o3) + correction = (ir.dim / paddle.sum(C.pow(2))) ** 0.5 + C = correction * C + + outputs.append( + [ + ((correction * v).item(), p) + for v, p in zip(x, paths) + if abs(v) > eps + ] + ) + change_of_basis.append(C) + irreps_out.append((1, ir)) + + dtype, _ = explicit_default_types(None, None) + self.change_of_basis = paddle.concat(change_of_basis).astype(dtype) + + tps = set() + for vp_list in outputs: + for v, p in vp_list: + for op in _get_ops(p): + tps.add(op) + + self.outputs = outputs + self.tps = list(tps) + + self.tensor_products = paddle.nn.LayerDict() + for i, op in enumerate(self.tps): + tp = o3.TensorProduct(op[0], op[1], op[2], [(0, 0, 0, "uuu", False)]) + self.tensor_products[f"tp{i}"] = tp + + self.irreps_in = [irreps[i] for i in f0] + self.irreps_out = o3.Irreps(irreps_out).simplify() + self.f0 = f0 + self.eps = eps + + def forward(self, *xs): + values = dict() + + def evaluate(path): + if path in values: + return values[path] + + if isinstance(path, _INPUT): + out = xs[path.tensor] + if (path.start, path.stop) != (0, self.irreps_in[path.tensor].dim): + out = paddle.slice(out, [-1], [path.start], [path.stop]) + if isinstance(path, _TP): + x1 = evaluate(path.args[0]) + x2 = evaluate(path.args[1]) + tp_idx = self.tps.index(path.op) + out = self.tensor_products[f"tp{tp_idx}"](x1, x2) + values[path] = out + return out + + outs = [] + for vp_list in self.outputs: + v, p = vp_list[0] + out = evaluate(p) + if abs(v - 1.0) > self.eps: + out = v * out + for v, p in vp_list[1:]: + t = evaluate(p) + if abs(v - 1.0) > self.eps: + t = v * t + out = out + t + outs.append(out) + + return paddle.concat(outs, axis=-1) diff --git a/ppmat/models/common/e3nn/o3/_rotation.py b/ppmat/models/common/e3nn/o3/_rotation.py new file mode 100644 index 00000000..fe1235b3 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_rotation.py @@ -0,0 +1,758 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import paddle + +from ppmat.models.common.e3nn.paddle_utils import * + + +def rand_matrix(*shape, requires_grad=False, dtype=None, device=None): + """random rotation matrix + + Parameters + ---------- + *shape : int + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape}, 3, 3)` + """ + R = angles_to_matrix(*rand_angles(*shape, dtype=dtype, device=device)) + out_7 = R.detach() + out_7.stop_gradient = not requires_grad + return out_7 + + +def identity_angles(*shape, requires_grad=False, dtype=None, device=None): + """angles of the identity rotation + + Parameters + ---------- + *shape : int + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + + beta : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + + gamma : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + """ + abc = paddle.zeros(shape=[3, *shape], dtype=dtype) + out_8 = abc[0] + out_8.stop_gradient = not requires_grad + out_9 = abc[1] + out_9.stop_gradient = not requires_grad + out_10 = abc[2] + out_10.stop_gradient = not requires_grad + return out_8, out_9, out_10 + + +def rand_angles(*shape, requires_grad=False, dtype=None, device=None): + """random rotation angles + + Parameters + ---------- + *shape : int + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + + beta : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + + gamma : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + """ + if dtype is None: + dtype = paddle.get_default_dtype() + alpha, gamma = 2 * math.pi * paddle.rand(shape=[2, *shape], dtype=dtype) + # beta = paddle.rand(shape=shape, dtype=dtype).mul(2.0).sub(1.0).acos() + beta = paddle.acos( + 2.0 * paddle.rand(shape=shape, dtype=dtype) - 1.0 + ) # modified in 2025 0407 because of error + out_11 = alpha.detach() + out_11.stop_gradient = not requires_grad + alpha = out_11 + out_12 = beta.detach() + out_12.stop_gradient = not requires_grad + beta = out_12 + out_13 = gamma.detach() + out_13.stop_gradient = not requires_grad + gamma = out_13 + return alpha, beta, gamma + + +def compose_angles(a1, b1, c1, a2, b2, c2): + """compose angles + + Computes :math:`(a, b, c)` such that :math:`R(a, b, c) = R(a_1, b_1, c_1) \\circ R(a_2, b_2, c_2)` + + Parameters + ---------- + a1 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied second) + + b1 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied second) + + c1 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied second) + + a2 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied first) + + b2 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied first) + + c2 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied first) + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + """ + a1, b1, c1, a2, b2, c2 = paddle.broadcast_tensors(input=[a1, b1, c1, a2, b2, c2]) + return matrix_to_angles(angles_to_matrix(a1, b1, c1) @ angles_to_matrix(a2, b2, c2)) + + +def inverse_angles(a, b, c): + """angles of the inverse rotation + + Parameters + ---------- + a : `torch.Tensor` + tensor of shape :math:`(...)` + + b : `torch.Tensor` + tensor of shape :math:`(...)` + + c : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + """ + return -c, -b, -a + + +def identity_quaternion(*shape, requires_grad=False, dtype=None, device=None): + """quaternion of identity rotation + + Parameters + ---------- + *shape : int + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape}, 4)` + """ + q = paddle.zeros(shape=[*shape, 4], dtype=dtype) + q[..., 0] = 1 + out_14 = q.detach() + out_14.stop_gradient = not requires_grad + q = out_14 + return q + + +def rand_quaternion(*shape, requires_grad=False, dtype=None, device=None): + """generate random quaternion + + Parameters + ---------- + *shape : int + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape}, 4)` + """ + q = angles_to_quaternion(*rand_angles(*shape, dtype=dtype, device=device)) + out_15 = q.detach() + out_15.stop_gradient = not requires_grad + q = out_15 + return q + + +def compose_quaternion(q1, q2): + """compose two quaternions: :math:`q_1 \\circ q_2` + + Parameters + ---------- + q1 : `torch.Tensor` + tensor of shape :math:`(..., 4)`, (applied second) + + q2 : `torch.Tensor` + tensor of shape :math:`(..., 4)`, (applied first) + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 4)` + """ + q1, q2 = paddle.broadcast_tensors(input=[q1, q2]) + return paddle.stack( + x=[ + q1[..., 0] * q2[..., 0] + - q1[..., 1] * q2[..., 1] + - q1[..., 2] * q2[..., 2] + - q1[..., 3] * q2[..., 3], + q1[..., 1] * q2[..., 0] + + q1[..., 0] * q2[..., 1] + + q1[..., 2] * q2[..., 3] + - q1[..., 3] * q2[..., 2], + q1[..., 0] * q2[..., 2] + - q1[..., 1] * q2[..., 3] + + q1[..., 2] * q2[..., 0] + + q1[..., 3] * q2[..., 1], + q1[..., 0] * q2[..., 3] + + q1[..., 1] * q2[..., 2] + - q1[..., 2] * q2[..., 1] + + q1[..., 3] * q2[..., 0], + ], + axis=-1, + ) + + +def inverse_quaternion(q): + """inverse of a quaternion + + Works only for unit quaternions. + + Parameters + ---------- + q : `torch.Tensor` + tensor of shape :math:`(..., 4)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 4)` + """ + q = q.clone() + q[..., 1:].neg_() + return q + + +def rand_axis_angle(*shape, requires_grad=False, dtype=None, device=None): + """generate random rotation as axis-angle + + Parameters + ---------- + *shape : int + + Returns + ------- + axis : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape}, 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(\\mathrm{shape})` + """ + axis, angle = angles_to_axis_angle(*rand_angles(*shape, dtype=dtype, device=device)) + out_16 = axis.detach() + out_16.stop_gradient = not requires_grad + axis = out_16 + out_17 = angle.detach() + out_17.stop_gradient = not requires_grad + angle = out_17 + return axis, angle + + +def compose_axis_angle(axis1, angle1, axis2, angle2): + """compose :math:`(\\vec x_1, \\alpha_1)` with :math:`(\\vec x_2, \\alpha_2)` + + Parameters + ---------- + axis1 : `torch.Tensor` + tensor of shape :math:`(..., 3)`, (applied second) + + angle1 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied second) + + axis2 : `torch.Tensor` + tensor of shape :math:`(..., 3)`, (applied first) + + angle2 : `torch.Tensor` + tensor of shape :math:`(...)`, (applied first) + + Returns + ------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + """ + return quaternion_to_axis_angle( + compose_quaternion( + axis_angle_to_quaternion(axis1, angle1), + axis_angle_to_quaternion(axis2, angle2), + ) + ) + + +def matrix_x(angle: paddle.Tensor) -> paddle.Tensor: + """matrix of rotation around X axis + + Parameters + ---------- + angle : `torch.Tensor` + tensor of any shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + c = angle.cos() + s = angle.sin() + o = paddle.ones_like(x=angle) + z = paddle.zeros_like(x=angle) + return paddle.stack( + x=[ + paddle.stack(x=[o, z, z], axis=-1), + paddle.stack(x=[z, c, -s], axis=-1), + paddle.stack(x=[z, s, c], axis=-1), + ], + axis=-2, + ) + + +def matrix_y(angle: paddle.Tensor) -> paddle.Tensor: + """matrix of rotation around Y axis + + Parameters + ---------- + angle : `torch.Tensor` + tensor of any shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + c = angle.cos() + s = angle.sin() + o = paddle.ones_like(x=angle) + z = paddle.zeros_like(x=angle) + return paddle.stack( + x=[ + paddle.stack(x=[c, z, s], axis=-1), + paddle.stack(x=[z, o, z], axis=-1), + paddle.stack(x=[-s, z, c], axis=-1), + ], + axis=-2, + ) + + +def matrix_z(angle: paddle.Tensor) -> paddle.Tensor: + """matrix of rotation around Z axis + + Parameters + ---------- + angle : `torch.Tensor` + tensor of any shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + c = angle.cos() + s = angle.sin() + o = paddle.ones_like(x=angle) + z = paddle.zeros_like(x=angle) + return paddle.stack( + x=[ + paddle.stack(x=[c, -s, z], axis=-1), + paddle.stack(x=[s, c, z], axis=-1), + paddle.stack(x=[z, z, o], axis=-1), + ], + axis=-2, + ) + + +def angles_to_matrix(alpha, beta, gamma): + """conversion from angles to matrix + + Parameters + ---------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + matrices of shape :math:`(..., 3, 3)` + """ + alpha, beta, gamma = paddle.broadcast_tensors(input=[alpha, beta, gamma]) + return matrix_y(alpha) @ matrix_x(beta) @ matrix_y(gamma) + + +def matrix_to_angles(R): + """conversion from matrix to angles + + Parameters + ---------- + R : `torch.Tensor` + matrices of shape :math:`(..., 3, 3)` + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + """ + assert paddle.allclose( + x=paddle.linalg.det(x=R), y=paddle.ones_like(paddle.linalg.det(x=R)) + ).item() + x = R @ paddle.to_tensor(data=[0.0, 1.0, 0.0], dtype=R.dtype) + a, b = xyz_to_angles(x) + R = ( + angles_to_matrix(a, b, paddle.zeros_like(x=a)).transpose( + perm=dim2perm(angles_to_matrix(a, b, paddle.zeros_like(x=a)).ndim, -1, -2) + ) + @ R + ) + c = paddle.atan2(x=R[..., 0, 2], y=R[..., 0, 0]) + return a, b, c + + +def angles_to_quaternion(alpha, beta, gamma): + """conversion from angles to quaternion + + Parameters + ---------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + matrices of shape :math:`(..., 4)` + """ + alpha, beta, gamma = paddle.broadcast_tensors(input=[alpha, beta, gamma]) + qa = axis_angle_to_quaternion( + paddle.to_tensor(data=[0.0, 1.0, 0.0], dtype=alpha.dtype), alpha + ) + qb = axis_angle_to_quaternion( + paddle.to_tensor(data=[1.0, 0.0, 0.0], dtype=beta.dtype), beta + ) + qc = axis_angle_to_quaternion( + paddle.to_tensor(data=[0.0, 1.0, 0.0], dtype=gamma.dtype), gamma + ) + return compose_quaternion(qa, compose_quaternion(qb, qc)) + + +def matrix_to_quaternion(R): + """conversion from matrix :math:`R` to quaternion :math:`q` + + Parameters + ---------- + R : `torch.Tensor` + tensor of shape :math:`(..., 3, 3)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 4)` + """ + return axis_angle_to_quaternion(*matrix_to_axis_angle(R)) + + +def axis_angle_to_quaternion(xyz, angle): + """convertion from axis-angle to quaternion + + Parameters + ---------- + xyz : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 4)` + """ + xyz, angle = paddle.broadcast_tensors(input=[xyz, angle[..., None]]) + xyz = paddle.nn.functional.normalize(x=xyz, axis=-1) + c = paddle.cos(x=angle[..., :1] / 2) + s = paddle.sin(x=angle / 2) + return paddle.concat(x=[c, xyz * s], axis=-1) + + +def quaternion_to_axis_angle(q): + """convertion from quaternion to axis-angle + + Parameters + ---------- + q : `torch.Tensor` + tensor of shape :math:`(..., 4)` + + Returns + ------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + """ + angle = 2 * paddle.acos(x=q[..., 0].clip(min=-1, max=1)) + axis = paddle.nn.functional.normalize(x=q[..., 1:], axis=-1) + return axis, angle + + +def matrix_to_axis_angle(R): + """conversion from matrix to axis-angle + + Parameters + ---------- + R : `torch.Tensor` + tensor of shape :math:`(..., 3, 3)` + + Returns + ------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + """ + assert paddle.allclose( + x=paddle.linalg.det(x=R), y=paddle.to_tensor(data=1, dtype=R.dtype) + ).item() + tr = R[..., 0, 0] + R[..., 1, 1] + R[..., 2, 2] + angle = paddle.acos(x=tr.sub(1).div(2).clip(min=-1, max=1)) + axis = paddle.stack( + x=[ + R[..., 2, 1] - R[..., 1, 2], + R[..., 0, 2] - R[..., 2, 0], + R[..., 1, 0] - R[..., 0, 1], + ], + axis=-1, + ) + axis = paddle.nn.functional.normalize(x=axis, axis=-1) + return axis, angle + + +def angles_to_axis_angle(alpha, beta, gamma): + """conversion from angles to axis-angle + + Parameters + ---------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + """ + return matrix_to_axis_angle(angles_to_matrix(alpha, beta, gamma)) + + +def axis_angle_to_matrix(axis, angle): + """conversion from axis-angle to matrix + + Parameters + ---------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 3, 3)` + """ + axis, angle = paddle.broadcast_tensors(input=[axis, angle[..., None]]) + alpha, beta = xyz_to_angles(axis) + R = angles_to_matrix(alpha, beta, paddle.zeros_like(x=beta)) + Ry = matrix_y(angle[..., 0]) + return R @ Ry @ R.transpose(perm=dim2perm(R.ndim, -2, -1)) + + +def quaternion_to_matrix(q): + """convertion from quaternion to matrix + + Parameters + ---------- + q : `torch.Tensor` + tensor of shape :math:`(..., 4)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 3, 3)` + """ + return axis_angle_to_matrix(*quaternion_to_axis_angle(q)) + + +def quaternion_to_angles(q): + """convertion from quaternion to angles + + Parameters + ---------- + q : `torch.Tensor` + tensor of shape :math:`(..., 4)` + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + """ + return matrix_to_angles(quaternion_to_matrix(q)) + + +def axis_angle_to_angles(axis, angle): + """convertion from axis-angle to angles + + Parameters + ---------- + axis : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + angle : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + """ + return matrix_to_angles(axis_angle_to_matrix(axis, angle)) + + +def angles_to_xyz(alpha, beta): + """convert :math:`(\\alpha, \\beta)` into a point :math:`(x, y, z)` on the sphere + + Parameters + ---------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + + Returns + ------- + `torch.Tensor` + tensor of shape :math:`(..., 3)` + + Examples + -------- + + >>> angles_to_xyz(torch.tensor(1.7), torch.tensor(0.0)).abs() + tensor([0., 1., 0.]) + """ + alpha, beta = paddle.broadcast_tensors(input=[alpha, beta]) + x = paddle.sin(x=beta) * paddle.sin(x=alpha) + y = paddle.cos(x=beta) + z = paddle.sin(x=beta) * paddle.cos(x=alpha) + return paddle.stack(x=[x, y, z], axis=-1) + + +def xyz_to_angles(xyz): + """convert a point :math:`\\vec r = (x, y, z)` on the sphere into angles :math:`(\\alpha, \\beta)` + + .. math:: + + \\vec r = R(\\alpha, \\beta, 0) \\vec e_z + + + Parameters + ---------- + xyz : `torch.Tensor` + tensor of shape :math:`(..., 3)` + + Returns + ------- + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + """ + xyz = paddle.nn.functional.normalize(x=xyz, p=2, axis=-1) + xyz = xyz.clip(min=-1, max=1) + beta = paddle.acos(x=xyz[..., 1]) + alpha = paddle.atan2(x=xyz[..., 0], y=xyz[..., 2]) + return alpha, beta diff --git a/ppmat/models/common/e3nn/o3/_s2grid.py b/ppmat/models/common/e3nn/o3/_s2grid.py new file mode 100644 index 00000000..ceb14c07 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_s2grid.py @@ -0,0 +1,558 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.paddle_utils import * +from ppmat.models.common.e3nn.util import explicit_default_types + +"""Transformation between two representations of a signal on the sphere. + +.. math:: f: S^2 \\longrightarrow \\mathbb{R} + +is a signal on the sphere. + +One representation that we like to call "spherical tensor" is + +.. math:: f(x) = \\sum_{l=0}^{l_{\\mathit{max}}} F^l \\cdot Y^l(x) + +it is made of :math:`(l_{\\mathit{max}} + 1)^2` real numbers represented in the above formula by the familly of vectors +:math:`F^l \\in \\mathbb{R}^{2l+1}`. + +Another representation is the discretization around the sphere. For this representation we chose a particular grid of size +:math:`(N, M)` + +.. math:: + + x_{ij} &= (\\sin(\\beta_i) \\sin(\\alpha_j), \\cos(\\beta_i), \\sin(\\beta_i) \\cos(\\alpha_j)) + + \\beta_i &= \\pi (i + 0.5) / N + + \\alpha_j &= 2 \\pi j / M + +In the code, :math:`N` is called ``res_beta`` and :math:`M` is ``res_alpha``. + +The discrete representation is therefore + +.. math:: \\{ h_{ij} = f(x_{ij}) \\}_{ij} +""" + + +def _quadrature_weights(b, dtype=None, device=None): + """ + function copied from ``lie_learn.spaces.S3`` + + Compute quadrature weights for the grid used by Kostelec & Rockmore [1, 2]. + """ + k = paddle.arange(end=b) + w = paddle.to_tensor( + data=[ + ( + 2.0 + / b + * paddle.sin(x=math.pi * (2.0 * j + 1.0) / (4.0 * b)) + * ( + 1.0 + / (2 * k + 1) + * paddle.sin(x=(2 * j + 1) * (2 * k + 1) * math.pi / (4.0 * b)) + ).sum() + ) + for j in paddle.arange(end=2 * b) + ], + dtype=dtype, + place=device, + ) + w /= 2.0 * (2 * b) ** 2 + return w + + +def s2_grid(res_beta, res_alpha, dtype=None, device=None): + """grid on the sphere + + Parameters + ---------- + res_beta : int + :math:`N` + + res_alpha : int + :math:`M` + + dtype : torch.dtype or None + ``dtype`` of the returned tensors. If ``None`` then set to ``torch.get_default_dtype()``. + + device : torch.device or None + ``device`` of the returned tensors. If ``None`` then set to the default device of the current context. + + Returns + ------- + betas : `torch.Tensor` + tensor of shape ``(res_beta)`` + + alphas : `torch.Tensor` + tensor of shape ``(res_alpha)`` + """ + dtype, device = explicit_default_types(dtype, device) + i = paddle.arange(dtype=dtype, end=res_beta) + betas = (i + 0.5) / res_beta * math.pi + i = paddle.arange(dtype=dtype, end=res_alpha) + alphas = i / res_alpha * 2 * math.pi + return betas, alphas + + +def spherical_harmonics_s2_grid(lmax, res_beta, res_alpha, dtype=None, device=None): + """spherical harmonics evaluated on the grid on the sphere + + .. math:: + + f(x) = \\sum_{l=0}^{l_{\\mathit{max}}} F^l \\cdot Y^l(x) + + f(\\beta, \\alpha) = \\sum_{l=0}^{l_{\\mathit{max}}} F^l \\cdot S^l(\\alpha) P^l(\\cos(\\beta)) + + Parameters + ---------- + lmax : int + :math:`l_{\\mathit{max}}` + + res_beta : int + :math:`N` + + res_alpha : int + :math:`M` + + Returns + ------- + betas : `torch.Tensor` + tensor of shape ``(res_beta)`` + + alphas : `torch.Tensor` + tensor of shape ``(res_alpha)`` + + shb : `torch.Tensor` + tensor of shape ``(res_beta, (lmax + 1)**2)`` + + sha : `torch.Tensor` + tensor of shape ``(res_alpha, 2 lmax + 1)`` + """ + betas, alphas = s2_grid(res_beta, res_alpha, dtype=dtype, device=device) + shb = o3.Legendre(list(range(lmax + 1)))(betas.cos(), betas.sin().abs()) + sha = o3.spherical_harmonics_alpha(lmax, alphas) + return betas, alphas, shb, sha + + +def _complete_lmax_res(lmax, res_beta, res_alpha): + """ + try to use FFT + i.e. 2 * lmax + 1 == res_alpha + """ + if res_beta is None: + if lmax is not None: + res_beta = 2 * (lmax + 1) + elif res_alpha is not None: + res_beta = 2 * ((res_alpha + 1) // 2) + else: + raise ValueError("All the entries are None") + if res_alpha is None: + if lmax is not None: + if res_beta is not None: + res_alpha = max(2 * lmax + 1, res_beta - 1) + else: + res_alpha = 2 * lmax + 1 + elif res_beta is not None: + res_alpha = res_beta - 1 + if lmax is None: + lmax = min(res_beta // 2 - 1, (res_alpha - 1) // 2) + assert res_beta % 2 == 0 + assert lmax + 1 <= res_beta // 2 + return lmax, res_beta, res_alpha + + +def _expand_matrix(ls, like=None, dtype=None, device=None): + """ + convertion matrix between a flatten vector (L, m) like that + (0, 0) (1, -1) (1, 0) (1, 1) (2, -2) (2, -1) (2, 0) (2, 1) (2, 2) + + and a bidimensional matrix representation like that + (0, 0) + (1, -1) (1, 0) (1, 1) + (2, -2) (2, -1) (2, 0) (2, 1) (2, 2) + + :return: tensor [l, m, l * m] + """ + lmax = max(ls) + if like is None: + m = paddle.zeros( + shape=[len(ls), 2 * lmax + 1, sum(2 * l + 1 for l in ls)], dtype=dtype + ) + else: + m = paddle.zeros( + shape=(len(ls), 2 * lmax + 1, sum(2 * l + 1 for l in ls)), dtype=dtype + ) + i = 0 + for j, l in enumerate(ls): + m[j, lmax - l : lmax + l + 1, i : i + 2 * l + 1] = paddle.eye( + num_rows=2 * l + 1, dtype=dtype + ) + i += 2 * l + 1 + return m + + +def rfft(x, l): + """Real fourier transform + + Parameters + ---------- + x : `torch.Tensor` + tensor of shape ``(..., 2 l + 1)`` + + res : int + output resolution, has to be an odd number + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., res)`` + + Examples + -------- + + >>> lmax = 8 + >>> res = 101 + >>> _betas, _alphas, _shb, sha = spherical_harmonics_s2_grid(lmax, res, res) + >>> x = torch.randn(res) + >>> (rfft(x, lmax) - x @ sha).abs().max().item() < 1e-4 + True + """ + *size, res = tuple(x.shape) + x = x.reshape(-1, res) + x = paddle.fft.rfft(x=x, axis=1) + x = paddle.concat( + x=[ + x[:, 1 : l + 1].imag().flip(axis=1).mul(-math.sqrt(2)), + x[:, :1].real(), + x[:, 1 : l + 1].real().mul(math.sqrt(2)), + ], + axis=1, + ) + return x.reshape(*size, 2 * l + 1) + + +def irfft(x, res): + """Inverse of the real fourier transform + + Parameters + ---------- + x : `torch.Tensor` + tensor of shape ``(..., 2 l + 1)`` + + res : int + output resolution, has to be an odd number + + Returns + ------- + `torch.Tensor` + positions on the sphere, tensor of shape ``(..., res, 3)`` + + Examples + -------- + + >>> lmax = 8 + >>> res = 101 + >>> _betas, _alphas, _shb, sha = spherical_harmonics_s2_grid(lmax, res, res) + >>> x = torch.randn(2 * lmax + 1) + >>> (irfft(x, res) - sha @ x).abs().max().item() < 1e-4 + True + """ + assert res % 2 == 1 + *size, sm = tuple(x.shape) + x = x.reshape(-1, sm) + x = paddle.concat( + x=[ + paddle.zeros(shape=(tuple(x.shape)[0], (res - sm) // 2), dtype=x.dtype), + x, + paddle.zeros(shape=(tuple(x.shape)[0], (res - sm) // 2), dtype=x.dtype), + ], + axis=-1, + ) + assert tuple(x.shape)[1] == res + l = res // 2 + x = paddle.complex( + real=paddle.concat( + x=[x[:, l : l + 1], x[:, l + 1 :].div(math.sqrt(2))], axis=1 + ), + imag=paddle.concat( + x=[ + paddle.zeros_like(x=x[:, :1]), + x[:, :l].flip(axis=-1).div(-math.sqrt(2)), + ], + axis=1, + ), + ) + x = paddle.fft.irfft(x=x, n=res, axis=1) * res + return x.reshape(*size, res) + + +class ToS2Grid(paddle.nn.Layer): + """Transform spherical tensor into signal on the sphere + + The inverse transformation of `FromS2Grid` + + Parameters + ---------- + lmax : int + res : int, tuple of int + resolution in ``beta`` and in ``alpha`` + + normalization : {'norm', 'component', 'integral'} + dtype : torch.dtype or None, optional + device : torch.device or None, optional + + Examples + -------- + + >>> m = ToS2Grid(6, (100, 101)) + >>> x = torch.randn(3, 49) + >>> m(x).shape + torch.Size([3, 100, 101]) + + + `ToS2Grid` and `FromS2Grid` are inverse of each other + + >>> m = ToS2Grid(6, (100, 101)) + >>> k = FromS2Grid((100, 101), 6) + >>> x = torch.randn(3, 49) + >>> y = k(m(x)) + >>> (x - y).abs().max().item() < 1e-4 + True + + Attributes + ---------- + grid : `torch.Tensor` + positions on the sphere, tensor of shape ``(res_beta, res_alpha, 3)`` + """ + + def __init__( + self, lmax=None, res=None, normalization="component", dtype=None, device=None + ): + super().__init__() + assert normalization in ["norm", "component", "integral"] or paddle.is_tensor( + x=normalization + ), "normalization needs to be 'norm', 'component' or 'integral'" + if isinstance(res, int) or res is None: + lmax, res_beta, res_alpha = _complete_lmax_res(lmax, res, None) + else: + lmax, res_beta, res_alpha = _complete_lmax_res(lmax, *res) + betas, alphas, shb, sha = spherical_harmonics_s2_grid( + lmax, res_beta, res_alpha, dtype=dtype, device=device + ) + n = None + if normalization == "component": + n = ( + math.sqrt(4 * math.pi) + * paddle.to_tensor( + data=[(1 / math.sqrt(2 * l + 1)) for l in range(lmax + 1)], + dtype=betas.dtype, + ) + / math.sqrt(lmax + 1) + ) + if normalization == "norm": + n = ( + math.sqrt(4 * math.pi) + * paddle.ones(shape=lmax + 1, dtype=betas.dtype) + / math.sqrt(lmax + 1) + ) + if normalization == "integral": + n = paddle.ones(shape=lmax + 1, dtype=betas.dtype) + if paddle.is_tensor(x=normalization): + n = normalization + m = _expand_matrix(range(lmax + 1), dtype=dtype, device=device) + shb = paddle.einsum("lmj,bj,lmi,l->mbi", m, shb, m, n) + self.lmax, self.res_beta, self.res_alpha = lmax, res_beta, res_alpha + self.register_buffer(name="alphas", tensor=alphas) + self.register_buffer(name="betas", tensor=betas) + self.register_buffer(name="sha", tensor=sha) + self.register_buffer(name="shb", tensor=shb) + + def __repr__(self): + return f"{self.__class__.__name__}(lmax={self.lmax} res={self.res_beta}x{self.res_alpha} (beta x alpha))" + + @property + def grid(self): + beta, alpha = paddle.meshgrid(self.betas, self.alphas) + return o3.angles_to_xyz(alpha, beta) + + def forward(self, x): + """Evaluate + + Parameters + ---------- + x : `torch.Tensor` + tensor of shape ``(..., (l+1)^2)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``[..., beta, alpha]`` + """ + size = tuple(x.shape)[:-1] + x = x.reshape(-1, tuple(x.shape)[-1]) + x = paddle.einsum("mbi,zi->zbm", self.shb, x) + sa, sm = tuple(self.sha.shape) + if sa >= sm and sa % 2 == 1: + x = irfft(x, sa) + else: + x = paddle.einsum("am,zbm->zba", self.sha, x) + return x.reshape(*size, *tuple(x.shape)[1:]) + + def _make_tracing_inputs(self, n: int): + return [{"forward": (paddle.randn(shape=self.lmax**2),)} for _ in range(n)] + + +class FromS2Grid(paddle.nn.Layer): + """Transform signal on the sphere into spherical tensor + + The inverse transformation of `ToS2Grid` + + Parameters + ---------- + res : int, tuple of int + resolution in ``beta`` and in ``alpha`` + + lmax : int + normalization : {'norm', 'component', 'integral'} + lmax_in : int, optional + dtype : torch.dtype or None, optional + device : torch.device or None, optional + + Examples + -------- + + >>> m = FromS2Grid((100, 101), 6) + >>> x = torch.randn(3, 100, 101) + >>> m(x).shape + torch.Size([3, 49]) + + + `ToS2Grid` and `FromS2Grid` are inverse of each other + + >>> m = FromS2Grid((100, 101), 6) + >>> k = ToS2Grid(6, (100, 101)) + >>> x = torch.randn(3, 100, 101) + >>> x = k(m(x)) # remove high frequencies + >>> y = k(m(x)) + >>> (x - y).abs().max().item() < 1e-4 + True + + Attributes + ---------- + grid : `torch.Tensor` + positions on the sphere, tensor of shape ``(res_beta, res_alpha, 3)`` + + """ + + def __init__( + self, + res=None, + lmax=None, + normalization="component", + lmax_in=None, + dtype=None, + device=None, + ): + super().__init__() + assert normalization in ["norm", "component", "integral"] or paddle.is_tensor( + x=normalization + ), "normalization needs to be 'norm', 'component' or 'integral'" + if isinstance(res, int) or res is None: + lmax, res_beta, res_alpha = _complete_lmax_res(lmax, res, None) + else: + lmax, res_beta, res_alpha = _complete_lmax_res(lmax, *res) + if lmax_in is None: + lmax_in = lmax + betas, alphas, shb, sha = spherical_harmonics_s2_grid( + lmax, res_beta, res_alpha, dtype=dtype, device=device + ) + n = None + if normalization == "component": + n = ( + math.sqrt(4 * math.pi) + * paddle.to_tensor( + data=[math.sqrt(2 * l + 1) for l in range(lmax + 1)], + dtype=betas.dtype, + ) + * math.sqrt(lmax_in + 1) + ) + if normalization == "norm": + n = ( + math.sqrt(4 * math.pi) + * paddle.ones(shape=lmax + 1, dtype=betas.dtype) + * math.sqrt(lmax_in + 1) + ) + if normalization == "integral": + n = 4 * math.pi * paddle.ones(shape=lmax + 1, dtype=betas.dtype) + if paddle.is_tensor(x=normalization): + n = normalization + m = _expand_matrix(range(lmax + 1), dtype=dtype, device=device) + assert res_beta % 2 == 0 + qw = ( + _quadrature_weights(res_beta // 2, dtype=dtype, device=device) + * res_beta**2 + / res_alpha + ) + shb = paddle.einsum("lmj,bj,lmi,l,b->mbi", m, shb, m, n, qw) + self.lmax, self.res_beta, self.res_alpha = lmax, res_beta, res_alpha + self.register_buffer(name="alphas", tensor=alphas) + self.register_buffer(name="betas", tensor=betas) + self.register_buffer(name="sha", tensor=sha) + self.register_buffer(name="shb", tensor=shb) + + def __repr__(self): + return f"{self.__class__.__name__}(lmax={self.lmax} res={self.res_beta}x{self.res_alpha} (beta x alpha))" + + @property + def grid(self): + beta, alpha = paddle.meshgrid(self.betas, self.alphas) + return o3.angles_to_xyz(alpha, beta) + + def forward(self, x): + """Evaluate + + Parameters + ---------- + x : `torch.Tensor` + tensor of shape ``[..., beta, alpha]`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., (l+1)^2)`` + """ + size = tuple(x.shape)[:-2] + res_beta, res_alpha = tuple(x.shape)[-2:] + x = x.reshape(-1, res_beta, res_alpha) + sa, sm = tuple(self.sha.shape) + if sm <= sa and sa % 2 == 1: + x = rfft(x, sm // 2) + else: + x = paddle.einsum("am,zba->zbm", self.sha, x) + x = paddle.einsum("mbi,zbm->zi", self.shb, x) + return x.reshape(*size, tuple(x.shape)[1]) + + def _make_tracing_inputs(self, n: int): + return [ + {"forward": (paddle.randn(shape=[self.res_beta, self.res_alpha]),)} + for _ in range(n) + ] diff --git a/ppmat/models/common/e3nn/o3/_so3grid.py b/ppmat/models/common/e3nn/o3/_so3grid.py new file mode 100644 index 00000000..dafb04f8 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_so3grid.py @@ -0,0 +1,109 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ._s2grid import _quadrature_weights +from ._s2grid import s2_grid +from ._wigner import wigner_D + + +def flat_wigner(lmax, alpha, beta, gamma): + return paddle.concat( + x=[ + ((2 * l + 1) ** 0.5 * wigner_D(l, alpha, beta, gamma).flatten(-2)) + for l in range(lmax + 1) + ], + axis=-1, + ) + + +class SO3Grid(paddle.nn.Layer): + """Apply non linearity on the signal on SO(3) + + Parameters + ---------- + lmax : int + irreps representation ``[(2 * l + 1, (l, p_val)) for l in [0, ..., lmax]]`` + + resolution : int + SO(3) grid resolution + + normalization : {'norm', 'component'} + + aspect_ratio : float + default value (2) should be optimal + """ + + def __init__(self, lmax, resolution, *, normalization="component", aspect_ratio=2): + super().__init__() + assert normalization == "component" + nb = 2 * resolution + na = round(2 * aspect_ratio * resolution) + b, a = s2_grid(nb, na) + self.register_buffer( + name="D", + tensor=flat_wigner( + lmax, a[:, None, None], b[None, :, None], a[None, None, :] + ), + ) + qw = _quadrature_weights(nb // 2) * nb**2 / na**2 + self.register_buffer(name="qw", tensor=qw) + self.register_buffer(name="alpha", tensor=a) + self.register_buffer(name="beta", tensor=b) + self.register_buffer(name="gamma", tensor=a) + self.res_alpha = na + self.res_beta = nb + self.res_gamma = na + + def __repr__(self): + return f"{self.__class__.__name__} ({self.lmax})" + + def to_grid(self, features): + """evaluate + + Parameters + ---------- + + features : `torch.Tensor` + tensor of shape ``(..., self.irreps.dim)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., self.res_alpha, self.res_beta, self.res_gamma)`` + """ + return ( + paddle.einsum("...i,abci->...abc", features, self.D) + / tuple(self.D.shape)[-1] ** 0.5 + ) + + def from_grid(self, features): + """evaluate + + Parameters + ---------- + + features : `torch.Tensor` + tensor of shape ``(..., self.res_alpha, self.res_beta, self.res_gamma)`` + + Returns + ------- + `torch.Tensor` + tensor of shape ``(..., self.irreps.dim)`` + """ + return ( + paddle.einsum("...abc,abci,b->...i", features, self.D, self.qw) + * tuple(self.D.shape)[-1] ** 0.5 + ) diff --git a/ppmat/models/common/e3nn/o3/_spherical_harmonics.py b/ppmat/models/common/e3nn/o3/_spherical_harmonics.py new file mode 100644 index 00000000..baff2351 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_spherical_harmonics.py @@ -0,0 +1,2066 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +"""Spherical Harmonics as polynomials of x, y, z +""" +import math +from typing import Any +from typing import List +from typing import Union + +import sympy +from sympy.printing.pycode import pycode + +from ppmat.models.common.e3nn import o3 + + +class SphericalHarmonics(paddle.nn.Layer): + """JITable module version of :meth:`e3nn.o3.spherical_harmonics`. + + Parameters are identical to :meth:`e3nn.o3.spherical_harmonics`. + """ + + normalize: bool + normalization: str + _ls_list: List[int] + _lmax: int + _is_range_lmax: bool + _prof_str: str + + def __init__( + self, + irreps_out: Union[int, List[int], str, o3.Irreps], + normalize: bool, + normalization: str = "integral", + irreps_in: Any = None, + ): + super().__init__() + self.normalize = normalize + self.normalization = normalization + assert normalization in ["integral", "component", "norm"] + if isinstance(irreps_out, str): + irreps_out = o3.Irreps(irreps_out) + if isinstance(irreps_out, o3.Irreps) and irreps_in is None: + for mul, (l, p) in irreps_out: + if l % 2 == 1 and p == 1: + irreps_in = o3.Irreps("1e") + if irreps_in is None: + irreps_in = o3.Irreps("1o") + irreps_in = o3.Irreps(irreps_in) + if irreps_in not in (o3.Irreps("1x1o"), o3.Irreps("1x1e")): + raise ValueError( + f"irreps_in for SphericalHarmonics must be either a vector (`1x1o`) or a pseudovector (`1x1e`), not `{irreps_in}`" + ) + self.irreps_in = irreps_in + input_p = irreps_in[0].ir.p + if isinstance(irreps_out, o3.Irreps): + ls = [] + for mul, (l, p) in irreps_out: + if p != input_p**l: + raise ValueError( + f"irreps_out `{irreps_out}` passed to SphericalHarmonics asked for an output of l = {l} with parity p = {p}, which is inconsistent with the input parity {input_p} — the output parity should have been p = {input_p ** l}" + ) + ls.extend([l] * mul) + elif isinstance(irreps_out, int): + ls = [irreps_out] + else: + ls = list(irreps_out) + irreps_out = o3.Irreps([(1, (l, input_p**l)) for l in ls]).simplify() + self.irreps_out = irreps_out + self._ls_list = ls + self._lmax = max(ls) + self._is_range_lmax = ls == list(range(max(ls) + 1)) + self._prof_str = f"spherical_harmonics({ls})" + _lmax = 11 + if self._lmax > _lmax: + raise NotImplementedError( + f"spherical_harmonics maximum l implemented is {_lmax}, send us an email to ask for more" + ) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + if self.normalize: + x = paddle.nn.functional.normalize(x=x, axis=-1) + sh = _spherical_harmonics(self._lmax, x[..., 0], x[..., 1], x[..., 2]) + if not self._is_range_lmax: + sh = paddle.concat( + x=[sh[..., l * l : (l + 1) * (l + 1)] for l in self._ls_list], axis=-1 + ) + if self.normalization == "integral": + sh = sh / paddle.to_tensor(math.sqrt(4 * math.pi)) + elif self.normalization == "norm": + sh = sh / paddle.to_tensor( + paddle.concat( + x=[ + ( + math.sqrt(2 * l + 1) + * paddle.ones(shape=2 * l + 1, dtype=sh.dtype) + ) + for l in self._ls_list + ] + ) + ) + + return sh + + +def spherical_harmonics( + l: Union[int, List[int], str, o3.Irreps], + x: paddle.Tensor, + normalize: bool, + normalization: str = "integral", +): + """Spherical harmonics + + .. image:: https://user-images.githubusercontent.com/333780/79220728-dbe82c00-7e54-11ea-82c7-b3acbd9b2246.gif + + | Polynomials defined on the 3d space :math:`Y^l: \\mathbb{R}^3 \\longrightarrow \\mathbb{R}^{2l+1}` + | Usually restricted on the sphere (with ``normalize=True``) :math:`Y^l: S^2 \\longrightarrow \\mathbb{R}^{2l+1}` + | who satisfies the following properties: + + * are polynomials of the cartesian coordinates ``x, y, z`` + * is equivariant :math:`Y^l(R x) = D^l(R) Y^l(x)` + * are orthogonal :math:`\\int_{S^2} Y^l_m(x) Y^j_n(x) dx = \\text{cste} \\; \\delta_{lj} \\delta_{mn}` + + The value of the constant depends on the choice of normalization. + + It obeys the following property: + + .. math:: + + Y^{l+1}_i(x) &= \\text{cste}(l) \\; & C_{ijk} Y^l_j(x) x_k + + \\partial_k Y^{l+1}_i(x) &= \\text{cste}(l) \\; (l+1) & C_{ijk} Y^l_j(x) + + Where :math:`C` are the `wigner_3j`. + + .. note:: + + This function match with this table of standard real spherical harmonics from Wikipedia_ + when ``normalize=True``, ``normalization='integral'`` and is called with the argument in the order ``y,z,x`` + (instead of ``x,y,z``). + + .. _Wikipedia: https://en.wikipedia.org/wiki/Table_of_spherical_harmonics#Real_spherical_harmonics + + Parameters + ---------- + l : int or list of int + degree of the spherical harmonics. + + x : `torch.Tensor` + tensor :math:`x` of shape ``(..., 3)``. + + normalize : bool + whether to normalize the ``x`` to unit vectors that lie on the sphere before projecting onto the spherical harmonics + + normalization : {'integral', 'component', 'norm'} + normalization of the output tensors --- note that this option is independent of ``normalize``, which controls the + processing of the *input*, rather than the output. + Valid options: + * *component*: :math:`\\|Y^l(x)\\|^2 = 2l+1, x \\in S^2` + * *norm*: :math:`\\|Y^l(x)\\| = 1, x \\in S^2`, ``component / sqrt(2l+1)`` + * *integral*: :math:`\\int_{S^2} Y^l_m(x)^2 dx = 1`, ``component / sqrt(4pi)`` + + Returns + ------- + `torch.Tensor` + a tensor of shape ``(..., 2l+1)`` + + .. math:: Y^l(x) + + Examples + -------- + + >>> spherical_harmonics(0, torch.randn(2, 3), False, normalization='component') + tensor([[1.], + [1.]]) + + See Also + -------- + wigner_D + wigner_3j + + """ + sh = SphericalHarmonics(l, normalize, normalization) + return sh(x) + + +def _spherical_harmonics( + lmax: int, x: paddle.Tensor, y: paddle.Tensor, z: paddle.Tensor +) -> paddle.Tensor: + sh_0_0 = paddle.ones_like(x=x) + if lmax == 0: + return paddle.stack(x=[sh_0_0], axis=-1) + sh_1_0 = math.sqrt(3) * x + sh_1_1 = math.sqrt(3) * y + sh_1_2 = math.sqrt(3) * z + if lmax == 1: + return paddle.stack(x=[sh_0_0, sh_1_0, sh_1_1, sh_1_2], axis=-1) + sh_2_0 = math.sqrt(15) * x * z + sh_2_1 = math.sqrt(15) * x * y + # y2 = y.pow(y=2) # torch 版本 + y2 = paddle.pow(y, 2) + # x2z2 = x.pow(y=2) + z.pow(y=2) # torch 版本 + x2z2 = paddle.pow(x, 2) + paddle.pow(z, 2) # 或者直接使用 x**2 + z**2 + sh_2_2 = math.sqrt(5) * (y2 - 1 / 2 * x2z2) + sh_2_3 = math.sqrt(15) * y * z + sh_2_4 = 1 / 2 * math.sqrt(15) * (z.pow(y=2) - x.pow(y=2)) + if lmax == 2: + return paddle.stack( + x=[sh_0_0, sh_1_0, sh_1_1, sh_1_2, sh_2_0, sh_2_1, sh_2_2, sh_2_3, sh_2_4], + axis=-1, + ) + sh_3_0 = 1 / 6 * math.sqrt(42) * (sh_2_0 * z + sh_2_4 * x) + sh_3_1 = math.sqrt(7) * sh_2_0 * y + sh_3_2 = 1 / 8 * math.sqrt(168) * (4.0 * y2 - x2z2) * x + sh_3_3 = 1 / 2 * math.sqrt(7) * y * (2.0 * y2 - 3.0 * x2z2) + sh_3_4 = 1 / 8 * math.sqrt(168) * z * (4.0 * y2 - x2z2) + sh_3_5 = math.sqrt(7) * sh_2_4 * y + sh_3_6 = 1 / 6 * math.sqrt(42) * (sh_2_4 * z - sh_2_0 * x) + if lmax == 3: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + ], + axis=-1, + ) + sh_4_0 = 3 / 4 * math.sqrt(2) * (sh_3_0 * z + sh_3_6 * x) + sh_4_1 = ( + 3 / 4 * sh_3_0 * y + + 3 / 8 * math.sqrt(6) * sh_3_1 * z + + 3 / 8 * math.sqrt(6) * sh_3_5 * x + ) + sh_4_2 = ( + -3 / 56 * math.sqrt(14) * sh_3_0 * z + + 3 / 14 * math.sqrt(21) * sh_3_1 * y + + 3 / 56 * math.sqrt(210) * sh_3_2 * z + + 3 / 56 * math.sqrt(210) * sh_3_4 * x + + 3 / 56 * math.sqrt(14) * sh_3_6 * x + ) + sh_4_3 = ( + -3 / 56 * math.sqrt(42) * sh_3_1 * z + + 3 / 28 * math.sqrt(105) * sh_3_2 * y + + 3 / 28 * math.sqrt(70) * sh_3_3 * x + + 3 / 56 * math.sqrt(42) * sh_3_5 * x + ) + sh_4_4 = ( + -3 / 28 * math.sqrt(42) * sh_3_2 * x + + 3 / 7 * math.sqrt(7) * sh_3_3 * y + - 3 / 28 * math.sqrt(42) * sh_3_4 * z + ) + sh_4_5 = ( + -3 / 56 * math.sqrt(42) * sh_3_1 * x + + 3 / 28 * math.sqrt(70) * sh_3_3 * z + + 3 / 28 * math.sqrt(105) * sh_3_4 * y + - 3 / 56 * math.sqrt(42) * sh_3_5 * z + ) + sh_4_6 = ( + -3 / 56 * math.sqrt(14) * sh_3_0 * x + - 3 / 56 * math.sqrt(210) * sh_3_2 * x + + 3 / 56 * math.sqrt(210) * sh_3_4 * z + + 3 / 14 * math.sqrt(21) * sh_3_5 * y + - 3 / 56 * math.sqrt(14) * sh_3_6 * z + ) + sh_4_7 = ( + -3 / 8 * math.sqrt(6) * sh_3_1 * x + + 3 / 8 * math.sqrt(6) * sh_3_5 * z + + 3 / 4 * sh_3_6 * y + ) + sh_4_8 = 3 / 4 * math.sqrt(2) * (-sh_3_0 * x + sh_3_6 * z) + if lmax == 4: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + ], + axis=-1, + ) + sh_5_0 = 1 / 10 * math.sqrt(110) * (sh_4_0 * z + sh_4_8 * x) + sh_5_1 = ( + 1 / 5 * math.sqrt(11) * sh_4_0 * y + + 1 / 5 * math.sqrt(22) * sh_4_1 * z + + 1 / 5 * math.sqrt(22) * sh_4_7 * x + ) + sh_5_2 = ( + -1 / 30 * math.sqrt(22) * sh_4_0 * z + + 4 / 15 * math.sqrt(11) * sh_4_1 * y + + 1 / 15 * math.sqrt(154) * sh_4_2 * z + + 1 / 15 * math.sqrt(154) * sh_4_6 * x + + 1 / 30 * math.sqrt(22) * sh_4_8 * x + ) + sh_5_3 = ( + -1 / 30 * math.sqrt(66) * sh_4_1 * z + + 1 / 15 * math.sqrt(231) * sh_4_2 * y + + 1 / 30 * math.sqrt(462) * sh_4_3 * z + + 1 / 30 * math.sqrt(462) * sh_4_5 * x + + 1 / 30 * math.sqrt(66) * sh_4_7 * x + ) + sh_5_4 = ( + -1 / 15 * math.sqrt(33) * sh_4_2 * z + + 2 / 15 * math.sqrt(66) * sh_4_3 * y + + 1 / 15 * math.sqrt(165) * sh_4_4 * x + + 1 / 15 * math.sqrt(33) * sh_4_6 * x + ) + sh_5_5 = ( + -1 / 15 * math.sqrt(110) * sh_4_3 * x + + 1 / 3 * math.sqrt(11) * sh_4_4 * y + - 1 / 15 * math.sqrt(110) * sh_4_5 * z + ) + sh_5_6 = ( + -1 / 15 * math.sqrt(33) * sh_4_2 * x + + 1 / 15 * math.sqrt(165) * sh_4_4 * z + + 2 / 15 * math.sqrt(66) * sh_4_5 * y + - 1 / 15 * math.sqrt(33) * sh_4_6 * z + ) + sh_5_7 = ( + -1 / 30 * math.sqrt(66) * sh_4_1 * x + - 1 / 30 * math.sqrt(462) * sh_4_3 * x + + 1 / 30 * math.sqrt(462) * sh_4_5 * z + + 1 / 15 * math.sqrt(231) * sh_4_6 * y + - 1 / 30 * math.sqrt(66) * sh_4_7 * z + ) + sh_5_8 = ( + -1 / 30 * math.sqrt(22) * sh_4_0 * x + - 1 / 15 * math.sqrt(154) * sh_4_2 * x + + 1 / 15 * math.sqrt(154) * sh_4_6 * z + + 4 / 15 * math.sqrt(11) * sh_4_7 * y + - 1 / 30 * math.sqrt(22) * sh_4_8 * z + ) + sh_5_9 = ( + -1 / 5 * math.sqrt(22) * sh_4_1 * x + + 1 / 5 * math.sqrt(22) * sh_4_7 * z + + 1 / 5 * math.sqrt(11) * sh_4_8 * y + ) + sh_5_10 = 1 / 10 * math.sqrt(110) * (-sh_4_0 * x + sh_4_8 * z) + if lmax == 5: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + ], + axis=-1, + ) + sh_6_0 = 1 / 6 * math.sqrt(39) * (sh_5_0 * z + sh_5_10 * x) + sh_6_1 = ( + 1 / 6 * math.sqrt(13) * sh_5_0 * y + + 1 / 12 * math.sqrt(130) * sh_5_1 * z + + 1 / 12 * math.sqrt(130) * sh_5_9 * x + ) + sh_6_2 = ( + -1 / 132 * math.sqrt(286) * sh_5_0 * z + + 1 / 33 * math.sqrt(715) * sh_5_1 * y + + 1 / 132 * math.sqrt(286) * sh_5_10 * x + + 1 / 44 * math.sqrt(1430) * sh_5_2 * z + + 1 / 44 * math.sqrt(1430) * sh_5_8 * x + ) + sh_6_3 = ( + -1 / 132 * math.sqrt(858) * sh_5_1 * z + + 1 / 22 * math.sqrt(429) * sh_5_2 * y + + 1 / 22 * math.sqrt(286) * sh_5_3 * z + + 1 / 22 * math.sqrt(286) * sh_5_7 * x + + 1 / 132 * math.sqrt(858) * sh_5_9 * x + ) + sh_6_4 = ( + -1 / 66 * math.sqrt(429) * sh_5_2 * z + + 2 / 33 * math.sqrt(286) * sh_5_3 * y + + 1 / 66 * math.sqrt(2002) * sh_5_4 * z + + 1 / 66 * math.sqrt(2002) * sh_5_6 * x + + 1 / 66 * math.sqrt(429) * sh_5_8 * x + ) + sh_6_5 = ( + -1 / 66 * math.sqrt(715) * sh_5_3 * z + + 1 / 66 * math.sqrt(5005) * sh_5_4 * y + + 1 / 66 * math.sqrt(3003) * sh_5_5 * x + + 1 / 66 * math.sqrt(715) * sh_5_7 * x + ) + sh_6_6 = ( + -1 / 66 * math.sqrt(2145) * sh_5_4 * x + + 1 / 11 * math.sqrt(143) * sh_5_5 * y + - 1 / 66 * math.sqrt(2145) * sh_5_6 * z + ) + sh_6_7 = ( + -1 / 66 * math.sqrt(715) * sh_5_3 * x + + 1 / 66 * math.sqrt(3003) * sh_5_5 * z + + 1 / 66 * math.sqrt(5005) * sh_5_6 * y + - 1 / 66 * math.sqrt(715) * sh_5_7 * z + ) + sh_6_8 = ( + -1 / 66 * math.sqrt(429) * sh_5_2 * x + - 1 / 66 * math.sqrt(2002) * sh_5_4 * x + + 1 / 66 * math.sqrt(2002) * sh_5_6 * z + + 2 / 33 * math.sqrt(286) * sh_5_7 * y + - 1 / 66 * math.sqrt(429) * sh_5_8 * z + ) + sh_6_9 = ( + -1 / 132 * math.sqrt(858) * sh_5_1 * x + - 1 / 22 * math.sqrt(286) * sh_5_3 * x + + 1 / 22 * math.sqrt(286) * sh_5_7 * z + + 1 / 22 * math.sqrt(429) * sh_5_8 * y + - 1 / 132 * math.sqrt(858) * sh_5_9 * z + ) + sh_6_10 = ( + -1 / 132 * math.sqrt(286) * sh_5_0 * x + - 1 / 132 * math.sqrt(286) * sh_5_10 * z + - 1 / 44 * math.sqrt(1430) * sh_5_2 * x + + 1 / 44 * math.sqrt(1430) * sh_5_8 * z + + 1 / 33 * math.sqrt(715) * sh_5_9 * y + ) + sh_6_11 = ( + -1 / 12 * math.sqrt(130) * sh_5_1 * x + + 1 / 6 * math.sqrt(13) * sh_5_10 * y + + 1 / 12 * math.sqrt(130) * sh_5_9 * z + ) + sh_6_12 = 1 / 6 * math.sqrt(39) * (-sh_5_0 * x + sh_5_10 * z) + if lmax == 6: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + ], + axis=-1, + ) + sh_7_0 = 1 / 14 * math.sqrt(210) * (sh_6_0 * z + sh_6_12 * x) + sh_7_1 = ( + 1 / 7 * math.sqrt(15) * sh_6_0 * y + + 3 / 7 * math.sqrt(5) * sh_6_1 * z + + 3 / 7 * math.sqrt(5) * sh_6_11 * x + ) + sh_7_2 = ( + -1 / 182 * math.sqrt(390) * sh_6_0 * z + + 6 / 91 * math.sqrt(130) * sh_6_1 * y + + 3 / 91 * math.sqrt(715) * sh_6_10 * x + + 1 / 182 * math.sqrt(390) * sh_6_12 * x + + 3 / 91 * math.sqrt(715) * sh_6_2 * z + ) + sh_7_3 = ( + -3 / 182 * math.sqrt(130) * sh_6_1 * z + + 3 / 182 * math.sqrt(130) * sh_6_11 * x + + 3 / 91 * math.sqrt(715) * sh_6_2 * y + + 5 / 182 * math.sqrt(858) * sh_6_3 * z + + 5 / 182 * math.sqrt(858) * sh_6_9 * x + ) + sh_7_4 = ( + 3 / 91 * math.sqrt(65) * sh_6_10 * x + - 3 / 91 * math.sqrt(65) * sh_6_2 * z + + 10 / 91 * math.sqrt(78) * sh_6_3 * y + + 15 / 182 * math.sqrt(78) * sh_6_4 * z + + 15 / 182 * math.sqrt(78) * sh_6_8 * x + ) + sh_7_5 = ( + -5 / 91 * math.sqrt(39) * sh_6_3 * z + + 15 / 91 * math.sqrt(39) * sh_6_4 * y + + 3 / 91 * math.sqrt(390) * sh_6_5 * z + + 3 / 91 * math.sqrt(390) * sh_6_7 * x + + 5 / 91 * math.sqrt(39) * sh_6_9 * x + ) + sh_7_6 = ( + -15 / 182 * math.sqrt(26) * sh_6_4 * z + + 12 / 91 * math.sqrt(65) * sh_6_5 * y + + 2 / 91 * math.sqrt(1365) * sh_6_6 * x + + 15 / 182 * math.sqrt(26) * sh_6_8 * x + ) + sh_7_7 = ( + -3 / 91 * math.sqrt(455) * sh_6_5 * x + + 1 / 13 * math.sqrt(195) * sh_6_6 * y + - 3 / 91 * math.sqrt(455) * sh_6_7 * z + ) + sh_7_8 = ( + -15 / 182 * math.sqrt(26) * sh_6_4 * x + + 2 / 91 * math.sqrt(1365) * sh_6_6 * z + + 12 / 91 * math.sqrt(65) * sh_6_7 * y + - 15 / 182 * math.sqrt(26) * sh_6_8 * z + ) + sh_7_9 = ( + -5 / 91 * math.sqrt(39) * sh_6_3 * x + - 3 / 91 * math.sqrt(390) * sh_6_5 * x + + 3 / 91 * math.sqrt(390) * sh_6_7 * z + + 15 / 91 * math.sqrt(39) * sh_6_8 * y + - 5 / 91 * math.sqrt(39) * sh_6_9 * z + ) + sh_7_10 = ( + -3 / 91 * math.sqrt(65) * sh_6_10 * z + - 3 / 91 * math.sqrt(65) * sh_6_2 * x + - 15 / 182 * math.sqrt(78) * sh_6_4 * x + + 15 / 182 * math.sqrt(78) * sh_6_8 * z + + 10 / 91 * math.sqrt(78) * sh_6_9 * y + ) + sh_7_11 = ( + -3 / 182 * math.sqrt(130) * sh_6_1 * x + + 3 / 91 * math.sqrt(715) * sh_6_10 * y + - 3 / 182 * math.sqrt(130) * sh_6_11 * z + - 5 / 182 * math.sqrt(858) * sh_6_3 * x + + 5 / 182 * math.sqrt(858) * sh_6_9 * z + ) + sh_7_12 = ( + -1 / 182 * math.sqrt(390) * sh_6_0 * x + + 3 / 91 * math.sqrt(715) * sh_6_10 * z + + 6 / 91 * math.sqrt(130) * sh_6_11 * y + - 1 / 182 * math.sqrt(390) * sh_6_12 * z + - 3 / 91 * math.sqrt(715) * sh_6_2 * x + ) + sh_7_13 = ( + -3 / 7 * math.sqrt(5) * sh_6_1 * x + + 3 / 7 * math.sqrt(5) * sh_6_11 * z + + 1 / 7 * math.sqrt(15) * sh_6_12 * y + ) + sh_7_14 = 1 / 14 * math.sqrt(210) * (-sh_6_0 * x + sh_6_12 * z) + if lmax == 7: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + sh_7_0, + sh_7_1, + sh_7_2, + sh_7_3, + sh_7_4, + sh_7_5, + sh_7_6, + sh_7_7, + sh_7_8, + sh_7_9, + sh_7_10, + sh_7_11, + sh_7_12, + sh_7_13, + sh_7_14, + ], + axis=-1, + ) + sh_8_0 = 1 / 4 * math.sqrt(17) * (sh_7_0 * z + sh_7_14 * x) + sh_8_1 = ( + 1 / 8 * math.sqrt(17) * sh_7_0 * y + + 1 / 16 * math.sqrt(238) * sh_7_1 * z + + 1 / 16 * math.sqrt(238) * sh_7_13 * x + ) + sh_8_2 = ( + -1 / 240 * math.sqrt(510) * sh_7_0 * z + + 1 / 60 * math.sqrt(1785) * sh_7_1 * y + + 1 / 240 * math.sqrt(46410) * sh_7_12 * x + + 1 / 240 * math.sqrt(510) * sh_7_14 * x + + 1 / 240 * math.sqrt(46410) * sh_7_2 * z + ) + sh_8_3 = ( + 1 + / 80 + * math.sqrt(2) + * ( + -math.sqrt(85) * sh_7_1 * z + + math.sqrt(2210) * sh_7_11 * x + + math.sqrt(85) * sh_7_13 * x + + math.sqrt(2210) * sh_7_2 * y + + math.sqrt(2210) * sh_7_3 * z + ) + ) + sh_8_4 = ( + 1 / 40 * math.sqrt(935) * sh_7_10 * x + + 1 / 40 * math.sqrt(85) * sh_7_12 * x + - 1 / 40 * math.sqrt(85) * sh_7_2 * z + + 1 / 10 * math.sqrt(85) * sh_7_3 * y + + 1 / 40 * math.sqrt(935) * sh_7_4 * z + ) + sh_8_5 = ( + 1 + / 48 + * math.sqrt(2) + * ( + math.sqrt(102) * sh_7_11 * x + - math.sqrt(102) * sh_7_3 * z + + math.sqrt(1122) * sh_7_4 * y + + math.sqrt(561) * sh_7_5 * z + + math.sqrt(561) * sh_7_9 * x + ) + ) + sh_8_6 = ( + 1 / 16 * math.sqrt(34) * sh_7_10 * x + - 1 / 16 * math.sqrt(34) * sh_7_4 * z + + 1 / 4 * math.sqrt(17) * sh_7_5 * y + + 1 / 16 * math.sqrt(102) * sh_7_6 * z + + 1 / 16 * math.sqrt(102) * sh_7_8 * x + ) + sh_8_7 = ( + -1 / 80 * math.sqrt(1190) * sh_7_5 * z + + 1 / 40 * math.sqrt(1785) * sh_7_6 * y + + 1 / 20 * math.sqrt(255) * sh_7_7 * x + + 1 / 80 * math.sqrt(1190) * sh_7_9 * x + ) + sh_8_8 = ( + -1 / 60 * math.sqrt(1785) * sh_7_6 * x + + 1 / 15 * math.sqrt(255) * sh_7_7 * y + - 1 / 60 * math.sqrt(1785) * sh_7_8 * z + ) + sh_8_9 = ( + -1 / 80 * math.sqrt(1190) * sh_7_5 * x + + 1 / 20 * math.sqrt(255) * sh_7_7 * z + + 1 / 40 * math.sqrt(1785) * sh_7_8 * y + - 1 / 80 * math.sqrt(1190) * sh_7_9 * z + ) + sh_8_10 = ( + -1 / 16 * math.sqrt(34) * sh_7_10 * z + - 1 / 16 * math.sqrt(34) * sh_7_4 * x + - 1 / 16 * math.sqrt(102) * sh_7_6 * x + + 1 / 16 * math.sqrt(102) * sh_7_8 * z + + 1 / 4 * math.sqrt(17) * sh_7_9 * y + ) + sh_8_11 = ( + 1 + / 48 + * math.sqrt(2) + * ( + math.sqrt(1122) * sh_7_10 * y + - math.sqrt(102) * sh_7_11 * z + - math.sqrt(102) * sh_7_3 * x + - math.sqrt(561) * sh_7_5 * x + + math.sqrt(561) * sh_7_9 * z + ) + ) + sh_8_12 = ( + 1 / 40 * math.sqrt(935) * sh_7_10 * z + + 1 / 10 * math.sqrt(85) * sh_7_11 * y + - 1 / 40 * math.sqrt(85) * sh_7_12 * z + - 1 / 40 * math.sqrt(85) * sh_7_2 * x + - 1 / 40 * math.sqrt(935) * sh_7_4 * x + ) + sh_8_13 = ( + 1 + / 80 + * math.sqrt(2) + * ( + -math.sqrt(85) * sh_7_1 * x + + math.sqrt(2210) * sh_7_11 * z + + math.sqrt(2210) * sh_7_12 * y + - math.sqrt(85) * sh_7_13 * z + - math.sqrt(2210) * sh_7_3 * x + ) + ) + sh_8_14 = ( + -1 / 240 * math.sqrt(510) * sh_7_0 * x + + 1 / 240 * math.sqrt(46410) * sh_7_12 * z + + 1 / 60 * math.sqrt(1785) * sh_7_13 * y + - 1 / 240 * math.sqrt(510) * sh_7_14 * z + - 1 / 240 * math.sqrt(46410) * sh_7_2 * x + ) + sh_8_15 = ( + -1 / 16 * math.sqrt(238) * sh_7_1 * x + + 1 / 16 * math.sqrt(238) * sh_7_13 * z + + 1 / 8 * math.sqrt(17) * sh_7_14 * y + ) + sh_8_16 = 1 / 4 * math.sqrt(17) * (-sh_7_0 * x + sh_7_14 * z) + if lmax == 8: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + sh_7_0, + sh_7_1, + sh_7_2, + sh_7_3, + sh_7_4, + sh_7_5, + sh_7_6, + sh_7_7, + sh_7_8, + sh_7_9, + sh_7_10, + sh_7_11, + sh_7_12, + sh_7_13, + sh_7_14, + sh_8_0, + sh_8_1, + sh_8_2, + sh_8_3, + sh_8_4, + sh_8_5, + sh_8_6, + sh_8_7, + sh_8_8, + sh_8_9, + sh_8_10, + sh_8_11, + sh_8_12, + sh_8_13, + sh_8_14, + sh_8_15, + sh_8_16, + ], + axis=-1, + ) + sh_9_0 = 1 / 6 * math.sqrt(38) * (sh_8_0 * z + sh_8_16 * x) + sh_9_1 = 1 / 9 * math.sqrt(19) * (sh_8_0 * y + 2 * sh_8_1 * z + 2 * sh_8_15 * x) + sh_9_2 = ( + -1 / 306 * math.sqrt(646) * sh_8_0 * z + + 4 / 153 * math.sqrt(646) * sh_8_1 * y + + 2 / 153 * math.sqrt(4845) * sh_8_14 * x + + 1 / 306 * math.sqrt(646) * sh_8_16 * x + + 2 / 153 * math.sqrt(4845) * sh_8_2 * z + ) + sh_9_3 = ( + -1 / 306 * math.sqrt(1938) * sh_8_1 * z + + 1 / 306 * math.sqrt(67830) * sh_8_13 * x + + 1 / 306 * math.sqrt(1938) * sh_8_15 * x + + 1 / 51 * math.sqrt(1615) * sh_8_2 * y + + 1 / 306 * math.sqrt(67830) * sh_8_3 * z + ) + sh_9_4 = ( + 1 / 306 * math.sqrt(58786) * sh_8_12 * x + + 1 / 153 * math.sqrt(969) * sh_8_14 * x + - 1 / 153 * math.sqrt(969) * sh_8_2 * z + + 2 / 153 * math.sqrt(4522) * sh_8_3 * y + + 1 / 306 * math.sqrt(58786) * sh_8_4 * z + ) + sh_9_5 = ( + 1 / 153 * math.sqrt(12597) * sh_8_11 * x + + 1 / 153 * math.sqrt(1615) * sh_8_13 * x + - 1 / 153 * math.sqrt(1615) * sh_8_3 * z + + 1 / 153 * math.sqrt(20995) * sh_8_4 * y + + 1 / 153 * math.sqrt(12597) * sh_8_5 * z + ) + sh_9_6 = ( + 1 / 153 * math.sqrt(10659) * sh_8_10 * x + + 1 / 306 * math.sqrt(9690) * sh_8_12 * x + - 1 / 306 * math.sqrt(9690) * sh_8_4 * z + + 2 / 51 * math.sqrt(646) * sh_8_5 * y + + 1 / 153 * math.sqrt(10659) * sh_8_6 * z + ) + sh_9_7 = ( + 1 / 306 * math.sqrt(13566) * sh_8_11 * x + - 1 / 306 * math.sqrt(13566) * sh_8_5 * z + + 1 / 153 * math.sqrt(24871) * sh_8_6 * y + + 1 / 306 * math.sqrt(35530) * sh_8_7 * z + + 1 / 306 * math.sqrt(35530) * sh_8_9 * x + ) + sh_9_8 = ( + 1 / 153 * math.sqrt(4522) * sh_8_10 * x + - 1 / 153 * math.sqrt(4522) * sh_8_6 * z + + 4 / 153 * math.sqrt(1615) * sh_8_7 * y + + 1 / 51 * math.sqrt(1615) * sh_8_8 * x + ) + sh_9_9 = ( + 1 / 51 * math.sqrt(323) * (-2 * sh_8_7 * x + 3 * sh_8_8 * y - 2 * sh_8_9 * z) + ) + sh_9_10 = ( + -1 / 153 * math.sqrt(4522) * sh_8_10 * z + - 1 / 153 * math.sqrt(4522) * sh_8_6 * x + + 1 / 51 * math.sqrt(1615) * sh_8_8 * z + + 4 / 153 * math.sqrt(1615) * sh_8_9 * y + ) + sh_9_11 = ( + 1 / 153 * math.sqrt(24871) * sh_8_10 * y + - 1 / 306 * math.sqrt(13566) * sh_8_11 * z + - 1 / 306 * math.sqrt(13566) * sh_8_5 * x + - 1 / 306 * math.sqrt(35530) * sh_8_7 * x + + 1 / 306 * math.sqrt(35530) * sh_8_9 * z + ) + sh_9_12 = ( + 1 / 153 * math.sqrt(10659) * sh_8_10 * z + + 2 / 51 * math.sqrt(646) * sh_8_11 * y + - 1 / 306 * math.sqrt(9690) * sh_8_12 * z + - 1 / 306 * math.sqrt(9690) * sh_8_4 * x + - 1 / 153 * math.sqrt(10659) * sh_8_6 * x + ) + sh_9_13 = ( + 1 / 153 * math.sqrt(12597) * sh_8_11 * z + + 1 / 153 * math.sqrt(20995) * sh_8_12 * y + - 1 / 153 * math.sqrt(1615) * sh_8_13 * z + - 1 / 153 * math.sqrt(1615) * sh_8_3 * x + - 1 / 153 * math.sqrt(12597) * sh_8_5 * x + ) + sh_9_14 = ( + 1 / 306 * math.sqrt(58786) * sh_8_12 * z + + 2 / 153 * math.sqrt(4522) * sh_8_13 * y + - 1 / 153 * math.sqrt(969) * sh_8_14 * z + - 1 / 153 * math.sqrt(969) * sh_8_2 * x + - 1 / 306 * math.sqrt(58786) * sh_8_4 * x + ) + sh_9_15 = ( + -1 / 306 * math.sqrt(1938) * sh_8_1 * x + + 1 / 306 * math.sqrt(67830) * sh_8_13 * z + + 1 / 51 * math.sqrt(1615) * sh_8_14 * y + - 1 / 306 * math.sqrt(1938) * sh_8_15 * z + - 1 / 306 * math.sqrt(67830) * sh_8_3 * x + ) + sh_9_16 = ( + -1 / 306 * math.sqrt(646) * sh_8_0 * x + + 2 / 153 * math.sqrt(4845) * sh_8_14 * z + + 4 / 153 * math.sqrt(646) * sh_8_15 * y + - 1 / 306 * math.sqrt(646) * sh_8_16 * z + - 2 / 153 * math.sqrt(4845) * sh_8_2 * x + ) + sh_9_17 = 1 / 9 * math.sqrt(19) * (-2 * sh_8_1 * x + 2 * sh_8_15 * z + sh_8_16 * y) + sh_9_18 = 1 / 6 * math.sqrt(38) * (-sh_8_0 * x + sh_8_16 * z) + if lmax == 9: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + sh_7_0, + sh_7_1, + sh_7_2, + sh_7_3, + sh_7_4, + sh_7_5, + sh_7_6, + sh_7_7, + sh_7_8, + sh_7_9, + sh_7_10, + sh_7_11, + sh_7_12, + sh_7_13, + sh_7_14, + sh_8_0, + sh_8_1, + sh_8_2, + sh_8_3, + sh_8_4, + sh_8_5, + sh_8_6, + sh_8_7, + sh_8_8, + sh_8_9, + sh_8_10, + sh_8_11, + sh_8_12, + sh_8_13, + sh_8_14, + sh_8_15, + sh_8_16, + sh_9_0, + sh_9_1, + sh_9_2, + sh_9_3, + sh_9_4, + sh_9_5, + sh_9_6, + sh_9_7, + sh_9_8, + sh_9_9, + sh_9_10, + sh_9_11, + sh_9_12, + sh_9_13, + sh_9_14, + sh_9_15, + sh_9_16, + sh_9_17, + sh_9_18, + ], + axis=-1, + ) + sh_10_0 = 1 / 10 * math.sqrt(105) * (sh_9_0 * z + sh_9_18 * x) + sh_10_1 = ( + 1 / 10 * math.sqrt(21) * sh_9_0 * y + + 3 / 20 * math.sqrt(42) * sh_9_1 * z + + 3 / 20 * math.sqrt(42) * sh_9_17 * x + ) + sh_10_2 = ( + -1 / 380 * math.sqrt(798) * sh_9_0 * z + + 3 / 95 * math.sqrt(399) * sh_9_1 * y + + 3 / 380 * math.sqrt(13566) * sh_9_16 * x + + 1 / 380 * math.sqrt(798) * sh_9_18 * x + + 3 / 380 * math.sqrt(13566) * sh_9_2 * z + ) + sh_10_3 = ( + -3 / 380 * math.sqrt(266) * sh_9_1 * z + + 1 / 95 * math.sqrt(6783) * sh_9_15 * x + + 3 / 380 * math.sqrt(266) * sh_9_17 * x + + 3 / 190 * math.sqrt(2261) * sh_9_2 * y + + 1 / 95 * math.sqrt(6783) * sh_9_3 * z + ) + sh_10_4 = ( + 3 / 95 * math.sqrt(665) * sh_9_14 * x + + 3 / 190 * math.sqrt(133) * sh_9_16 * x + - 3 / 190 * math.sqrt(133) * sh_9_2 * z + + 4 / 95 * math.sqrt(399) * sh_9_3 * y + + 3 / 95 * math.sqrt(665) * sh_9_4 * z + ) + sh_10_5 = ( + 21 / 380 * math.sqrt(190) * sh_9_13 * x + + 1 / 190 * math.sqrt(1995) * sh_9_15 * x + - 1 / 190 * math.sqrt(1995) * sh_9_3 * z + + 3 / 38 * math.sqrt(133) * sh_9_4 * y + + 21 / 380 * math.sqrt(190) * sh_9_5 * z + ) + sh_10_6 = ( + 7 / 380 * math.sqrt(1482) * sh_9_12 * x + + 3 / 380 * math.sqrt(1330) * sh_9_14 * x + - 3 / 380 * math.sqrt(1330) * sh_9_4 * z + + 21 / 95 * math.sqrt(19) * sh_9_5 * y + + 7 / 380 * math.sqrt(1482) * sh_9_6 * z + ) + sh_10_7 = ( + 3 / 190 * math.sqrt(1729) * sh_9_11 * x + + 21 / 380 * math.sqrt(38) * sh_9_13 * x + - 21 / 380 * math.sqrt(38) * sh_9_5 * z + + 7 / 190 * math.sqrt(741) * sh_9_6 * y + + 3 / 190 * math.sqrt(1729) * sh_9_7 * z + ) + sh_10_8 = ( + 3 / 190 * math.sqrt(1463) * sh_9_10 * x + + 7 / 190 * math.sqrt(114) * sh_9_12 * x + - 7 / 190 * math.sqrt(114) * sh_9_6 * z + + 6 / 95 * math.sqrt(266) * sh_9_7 * y + + 3 / 190 * math.sqrt(1463) * sh_9_8 * z + ) + sh_10_9 = ( + 3 / 190 * math.sqrt(798) * sh_9_11 * x + - 3 / 190 * math.sqrt(798) * sh_9_7 * z + + 3 / 190 * math.sqrt(4389) * sh_9_8 * y + + 1 / 190 * math.sqrt(21945) * sh_9_9 * x + ) + sh_10_10 = ( + -3 / 190 * math.sqrt(1995) * sh_9_10 * z + - 3 / 190 * math.sqrt(1995) * sh_9_8 * x + + 1 / 19 * math.sqrt(399) * sh_9_9 * y + ) + sh_10_11 = ( + 3 / 190 * math.sqrt(4389) * sh_9_10 * y + - 3 / 190 * math.sqrt(798) * sh_9_11 * z + - 3 / 190 * math.sqrt(798) * sh_9_7 * x + + 1 / 190 * math.sqrt(21945) * sh_9_9 * z + ) + sh_10_12 = ( + 3 / 190 * math.sqrt(1463) * sh_9_10 * z + + 6 / 95 * math.sqrt(266) * sh_9_11 * y + - 7 / 190 * math.sqrt(114) * sh_9_12 * z + - 7 / 190 * math.sqrt(114) * sh_9_6 * x + - 3 / 190 * math.sqrt(1463) * sh_9_8 * x + ) + sh_10_13 = ( + 3 / 190 * math.sqrt(1729) * sh_9_11 * z + + 7 / 190 * math.sqrt(741) * sh_9_12 * y + - 21 / 380 * math.sqrt(38) * sh_9_13 * z + - 21 / 380 * math.sqrt(38) * sh_9_5 * x + - 3 / 190 * math.sqrt(1729) * sh_9_7 * x + ) + sh_10_14 = ( + 7 / 380 * math.sqrt(1482) * sh_9_12 * z + + 21 / 95 * math.sqrt(19) * sh_9_13 * y + - 3 / 380 * math.sqrt(1330) * sh_9_14 * z + - 3 / 380 * math.sqrt(1330) * sh_9_4 * x + - 7 / 380 * math.sqrt(1482) * sh_9_6 * x + ) + sh_10_15 = ( + 21 / 380 * math.sqrt(190) * sh_9_13 * z + + 3 / 38 * math.sqrt(133) * sh_9_14 * y + - 1 / 190 * math.sqrt(1995) * sh_9_15 * z + - 1 / 190 * math.sqrt(1995) * sh_9_3 * x + - 21 / 380 * math.sqrt(190) * sh_9_5 * x + ) + sh_10_16 = ( + 3 / 95 * math.sqrt(665) * sh_9_14 * z + + 4 / 95 * math.sqrt(399) * sh_9_15 * y + - 3 / 190 * math.sqrt(133) * sh_9_16 * z + - 3 / 190 * math.sqrt(133) * sh_9_2 * x + - 3 / 95 * math.sqrt(665) * sh_9_4 * x + ) + sh_10_17 = ( + -3 / 380 * math.sqrt(266) * sh_9_1 * x + + 1 / 95 * math.sqrt(6783) * sh_9_15 * z + + 3 / 190 * math.sqrt(2261) * sh_9_16 * y + - 3 / 380 * math.sqrt(266) * sh_9_17 * z + - 1 / 95 * math.sqrt(6783) * sh_9_3 * x + ) + sh_10_18 = ( + -1 / 380 * math.sqrt(798) * sh_9_0 * x + + 3 / 380 * math.sqrt(13566) * sh_9_16 * z + + 3 / 95 * math.sqrt(399) * sh_9_17 * y + - 1 / 380 * math.sqrt(798) * sh_9_18 * z + - 3 / 380 * math.sqrt(13566) * sh_9_2 * x + ) + sh_10_19 = ( + -3 / 20 * math.sqrt(42) * sh_9_1 * x + + 3 / 20 * math.sqrt(42) * sh_9_17 * z + + 1 / 10 * math.sqrt(21) * sh_9_18 * y + ) + sh_10_20 = 1 / 10 * math.sqrt(105) * (-sh_9_0 * x + sh_9_18 * z) + if lmax == 10: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + sh_7_0, + sh_7_1, + sh_7_2, + sh_7_3, + sh_7_4, + sh_7_5, + sh_7_6, + sh_7_7, + sh_7_8, + sh_7_9, + sh_7_10, + sh_7_11, + sh_7_12, + sh_7_13, + sh_7_14, + sh_8_0, + sh_8_1, + sh_8_2, + sh_8_3, + sh_8_4, + sh_8_5, + sh_8_6, + sh_8_7, + sh_8_8, + sh_8_9, + sh_8_10, + sh_8_11, + sh_8_12, + sh_8_13, + sh_8_14, + sh_8_15, + sh_8_16, + sh_9_0, + sh_9_1, + sh_9_2, + sh_9_3, + sh_9_4, + sh_9_5, + sh_9_6, + sh_9_7, + sh_9_8, + sh_9_9, + sh_9_10, + sh_9_11, + sh_9_12, + sh_9_13, + sh_9_14, + sh_9_15, + sh_9_16, + sh_9_17, + sh_9_18, + sh_10_0, + sh_10_1, + sh_10_2, + sh_10_3, + sh_10_4, + sh_10_5, + sh_10_6, + sh_10_7, + sh_10_8, + sh_10_9, + sh_10_10, + sh_10_11, + sh_10_12, + sh_10_13, + sh_10_14, + sh_10_15, + sh_10_16, + sh_10_17, + sh_10_18, + sh_10_19, + sh_10_20, + ], + axis=-1, + ) + sh_11_0 = 1 / 22 * math.sqrt(506) * (sh_10_0 * z + sh_10_20 * x) + sh_11_1 = ( + 1 / 11 * math.sqrt(23) * sh_10_0 * y + + 1 / 11 * math.sqrt(115) * sh_10_1 * z + + 1 / 11 * math.sqrt(115) * sh_10_19 * x + ) + sh_11_2 = ( + -1 / 462 * math.sqrt(966) * sh_10_0 * z + + 2 / 231 * math.sqrt(4830) * sh_10_1 * y + + 1 / 231 * math.sqrt(45885) * sh_10_18 * x + + 1 / 231 * math.sqrt(45885) * sh_10_2 * z + + 1 / 462 * math.sqrt(966) * sh_10_20 * x + ) + sh_11_3 = ( + -1 / 154 * math.sqrt(322) * sh_10_1 * z + + 1 / 154 * math.sqrt(18354) * sh_10_17 * x + + 1 / 154 * math.sqrt(322) * sh_10_19 * x + + 1 / 77 * math.sqrt(3059) * sh_10_2 * y + + 1 / 154 * math.sqrt(18354) * sh_10_3 * z + ) + sh_11_4 = ( + 1 / 154 * math.sqrt(16422) * sh_10_16 * x + + 1 / 77 * math.sqrt(161) * sh_10_18 * x + - 1 / 77 * math.sqrt(161) * sh_10_2 * z + + 2 / 77 * math.sqrt(966) * sh_10_3 * y + + 1 / 154 * math.sqrt(16422) * sh_10_4 * z + ) + sh_11_5 = ( + 2 / 231 * math.sqrt(8211) * sh_10_15 * x + + 1 / 231 * math.sqrt(2415) * sh_10_17 * x + - 1 / 231 * math.sqrt(2415) * sh_10_3 * z + + 1 / 231 * math.sqrt(41055) * sh_10_4 * y + + 2 / 231 * math.sqrt(8211) * sh_10_5 * z + ) + sh_11_6 = ( + 2 / 77 * math.sqrt(805) * sh_10_14 * x + + 1 / 154 * math.sqrt(1610) * sh_10_16 * x + - 1 / 154 * math.sqrt(1610) * sh_10_4 * z + + 4 / 77 * math.sqrt(322) * sh_10_5 * y + + 2 / 77 * math.sqrt(805) * sh_10_6 * z + ) + sh_11_7 = ( + 1 / 22 * math.sqrt(230) * sh_10_13 * x + + 1 / 22 * math.sqrt(46) * sh_10_15 * x + - 1 / 22 * math.sqrt(46) * sh_10_5 * z + + 1 / 11 * math.sqrt(115) * sh_10_6 * y + + 1 / 22 * math.sqrt(230) * sh_10_7 * z + ) + sh_11_8 = ( + 1 / 66 * math.sqrt(1794) * sh_10_12 * x + + 1 / 33 * math.sqrt(138) * sh_10_14 * x + - 1 / 33 * math.sqrt(138) * sh_10_6 * z + + 4 / 33 * math.sqrt(69) * sh_10_7 * y + + 1 / 66 * math.sqrt(1794) * sh_10_8 * z + ) + sh_11_9 = ( + 1 / 77 * math.sqrt(2093) * sh_10_11 * x + + 1 / 77 * math.sqrt(966) * sh_10_13 * x + - 1 / 77 * math.sqrt(966) * sh_10_7 * z + + 1 / 77 * math.sqrt(6279) * sh_10_8 * y + + 1 / 77 * math.sqrt(2093) * sh_10_9 * z + ) + sh_11_10 = ( + 1 / 77 * math.sqrt(3542) * sh_10_10 * x + + 1 / 154 * math.sqrt(4830) * sh_10_12 * x + - 1 / 154 * math.sqrt(4830) * sh_10_8 * z + + 2 / 77 * math.sqrt(1610) * sh_10_9 * y + ) + sh_11_11 = ( + 1 / 21 * math.sqrt(483) * sh_10_10 * y + - 1 / 231 * math.sqrt(26565) * sh_10_11 * z + - 1 / 231 * math.sqrt(26565) * sh_10_9 * x + ) + sh_11_12 = ( + 1 / 77 * math.sqrt(3542) * sh_10_10 * z + + 2 / 77 * math.sqrt(1610) * sh_10_11 * y + - 1 / 154 * math.sqrt(4830) * sh_10_12 * z + - 1 / 154 * math.sqrt(4830) * sh_10_8 * x + ) + sh_11_13 = ( + 1 / 77 * math.sqrt(2093) * sh_10_11 * z + + 1 / 77 * math.sqrt(6279) * sh_10_12 * y + - 1 / 77 * math.sqrt(966) * sh_10_13 * z + - 1 / 77 * math.sqrt(966) * sh_10_7 * x + - 1 / 77 * math.sqrt(2093) * sh_10_9 * x + ) + sh_11_14 = ( + 1 / 66 * math.sqrt(1794) * sh_10_12 * z + + 4 / 33 * math.sqrt(69) * sh_10_13 * y + - 1 / 33 * math.sqrt(138) * sh_10_14 * z + - 1 / 33 * math.sqrt(138) * sh_10_6 * x + - 1 / 66 * math.sqrt(1794) * sh_10_8 * x + ) + sh_11_15 = ( + 1 / 22 * math.sqrt(230) * sh_10_13 * z + + 1 / 11 * math.sqrt(115) * sh_10_14 * y + - 1 / 22 * math.sqrt(46) * sh_10_15 * z + - 1 / 22 * math.sqrt(46) * sh_10_5 * x + - 1 / 22 * math.sqrt(230) * sh_10_7 * x + ) + sh_11_16 = ( + 2 / 77 * math.sqrt(805) * sh_10_14 * z + + 4 / 77 * math.sqrt(322) * sh_10_15 * y + - 1 / 154 * math.sqrt(1610) * sh_10_16 * z + - 1 / 154 * math.sqrt(1610) * sh_10_4 * x + - 2 / 77 * math.sqrt(805) * sh_10_6 * x + ) + sh_11_17 = ( + 2 / 231 * math.sqrt(8211) * sh_10_15 * z + + 1 / 231 * math.sqrt(41055) * sh_10_16 * y + - 1 / 231 * math.sqrt(2415) * sh_10_17 * z + - 1 / 231 * math.sqrt(2415) * sh_10_3 * x + - 2 / 231 * math.sqrt(8211) * sh_10_5 * x + ) + sh_11_18 = ( + 1 / 154 * math.sqrt(16422) * sh_10_16 * z + + 2 / 77 * math.sqrt(966) * sh_10_17 * y + - 1 / 77 * math.sqrt(161) * sh_10_18 * z + - 1 / 77 * math.sqrt(161) * sh_10_2 * x + - 1 / 154 * math.sqrt(16422) * sh_10_4 * x + ) + sh_11_19 = ( + -1 / 154 * math.sqrt(322) * sh_10_1 * x + + 1 / 154 * math.sqrt(18354) * sh_10_17 * z + + 1 / 77 * math.sqrt(3059) * sh_10_18 * y + - 1 / 154 * math.sqrt(322) * sh_10_19 * z + - 1 / 154 * math.sqrt(18354) * sh_10_3 * x + ) + sh_11_20 = ( + -1 / 462 * math.sqrt(966) * sh_10_0 * x + + 1 / 231 * math.sqrt(45885) * sh_10_18 * z + + 2 / 231 * math.sqrt(4830) * sh_10_19 * y + - 1 / 231 * math.sqrt(45885) * sh_10_2 * x + - 1 / 462 * math.sqrt(966) * sh_10_20 * z + ) + sh_11_21 = ( + -1 / 11 * math.sqrt(115) * sh_10_1 * x + + 1 / 11 * math.sqrt(115) * sh_10_19 * z + + 1 / 11 * math.sqrt(23) * sh_10_20 * y + ) + sh_11_22 = 1 / 22 * math.sqrt(506) * (-sh_10_0 * x + sh_10_20 * z) + if lmax == 11: + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + sh_7_0, + sh_7_1, + sh_7_2, + sh_7_3, + sh_7_4, + sh_7_5, + sh_7_6, + sh_7_7, + sh_7_8, + sh_7_9, + sh_7_10, + sh_7_11, + sh_7_12, + sh_7_13, + sh_7_14, + sh_8_0, + sh_8_1, + sh_8_2, + sh_8_3, + sh_8_4, + sh_8_5, + sh_8_6, + sh_8_7, + sh_8_8, + sh_8_9, + sh_8_10, + sh_8_11, + sh_8_12, + sh_8_13, + sh_8_14, + sh_8_15, + sh_8_16, + sh_9_0, + sh_9_1, + sh_9_2, + sh_9_3, + sh_9_4, + sh_9_5, + sh_9_6, + sh_9_7, + sh_9_8, + sh_9_9, + sh_9_10, + sh_9_11, + sh_9_12, + sh_9_13, + sh_9_14, + sh_9_15, + sh_9_16, + sh_9_17, + sh_9_18, + sh_10_0, + sh_10_1, + sh_10_2, + sh_10_3, + sh_10_4, + sh_10_5, + sh_10_6, + sh_10_7, + sh_10_8, + sh_10_9, + sh_10_10, + sh_10_11, + sh_10_12, + sh_10_13, + sh_10_14, + sh_10_15, + sh_10_16, + sh_10_17, + sh_10_18, + sh_10_19, + sh_10_20, + sh_11_0, + sh_11_1, + sh_11_2, + sh_11_3, + sh_11_4, + sh_11_5, + sh_11_6, + sh_11_7, + sh_11_8, + sh_11_9, + sh_11_10, + sh_11_11, + sh_11_12, + sh_11_13, + sh_11_14, + sh_11_15, + sh_11_16, + sh_11_17, + sh_11_18, + sh_11_19, + sh_11_20, + sh_11_21, + sh_11_22, + ], + axis=-1, + ) + sh_12_0 = 5 / 12 * math.sqrt(6) * (sh_11_0 * z + sh_11_22 * x) + sh_12_1 = ( + 5 / 12 * sh_11_0 * y + + 5 / 24 * math.sqrt(22) * sh_11_1 * z + + 5 / 24 * math.sqrt(22) * sh_11_21 * x + ) + sh_12_2 = ( + -5 / 552 * math.sqrt(46) * sh_11_0 * z + + 5 / 138 * math.sqrt(253) * sh_11_1 * y + + 5 / 552 * math.sqrt(10626) * sh_11_2 * z + + 5 / 552 * math.sqrt(10626) * sh_11_20 * x + + 5 / 552 * math.sqrt(46) * sh_11_22 * x + ) + sh_12_3 = ( + -5 / 552 * math.sqrt(138) * sh_11_1 * z + + 5 / 276 * math.sqrt(2415) * sh_11_19 * x + + 5 / 92 * math.sqrt(161) * sh_11_2 * y + + 5 / 552 * math.sqrt(138) * sh_11_21 * x + + 5 / 276 * math.sqrt(2415) * sh_11_3 * z + ) + sh_12_4 = ( + 5 / 276 * math.sqrt(2185) * sh_11_18 * x + - 5 / 276 * math.sqrt(69) * sh_11_2 * z + + 5 / 276 * math.sqrt(69) * sh_11_20 * x + + 5 / 69 * math.sqrt(115) * sh_11_3 * y + + 5 / 276 * math.sqrt(2185) * sh_11_4 * z + ) + sh_12_5 = ( + 5 / 184 * math.sqrt(874) * sh_11_17 * x + + 5 / 276 * math.sqrt(115) * sh_11_19 * x + - 5 / 276 * math.sqrt(115) * sh_11_3 * z + + 5 / 276 * math.sqrt(2185) * sh_11_4 * y + + 5 / 184 * math.sqrt(874) * sh_11_5 * z + ) + sh_12_6 = ( + 5 + / 552 + * math.sqrt(3) + * ( + math.sqrt(2346) * sh_11_16 * x + + math.sqrt(230) * sh_11_18 * x + - math.sqrt(230) * sh_11_4 * z + + 12 * math.sqrt(23) * sh_11_5 * y + + math.sqrt(2346) * sh_11_6 * z + ) + ) + sh_12_7 = ( + 5 / 138 * math.sqrt(391) * sh_11_15 * x + + 5 / 552 * math.sqrt(966) * sh_11_17 * x + - 5 / 552 * math.sqrt(966) * sh_11_5 * z + + 5 / 276 * math.sqrt(2737) * sh_11_6 * y + + 5 / 138 * math.sqrt(391) * sh_11_7 * z + ) + sh_12_8 = ( + 5 / 138 * math.sqrt(345) * sh_11_14 * x + + 5 / 276 * math.sqrt(322) * sh_11_16 * x + - 5 / 276 * math.sqrt(322) * sh_11_6 * z + + 10 / 69 * math.sqrt(46) * sh_11_7 * y + + 5 / 138 * math.sqrt(345) * sh_11_8 * z + ) + sh_12_9 = ( + 5 / 552 * math.sqrt(4830) * sh_11_13 * x + + 5 / 92 * math.sqrt(46) * sh_11_15 * x + - 5 / 92 * math.sqrt(46) * sh_11_7 * z + + 5 / 92 * math.sqrt(345) * sh_11_8 * y + + 5 / 552 * math.sqrt(4830) * sh_11_9 * z + ) + sh_12_10 = ( + 5 / 552 * math.sqrt(4186) * sh_11_10 * z + + 5 / 552 * math.sqrt(4186) * sh_11_12 * x + + 5 / 184 * math.sqrt(230) * sh_11_14 * x + - 5 / 184 * math.sqrt(230) * sh_11_8 * z + + 5 / 138 * math.sqrt(805) * sh_11_9 * y + ) + sh_12_11 = ( + 5 / 276 * math.sqrt(3289) * sh_11_10 * y + + 5 / 276 * math.sqrt(1794) * sh_11_11 * x + + 5 / 552 * math.sqrt(2530) * sh_11_13 * x + - 5 / 552 * math.sqrt(2530) * sh_11_9 * z + ) + sh_12_12 = ( + -5 / 276 * math.sqrt(1518) * sh_11_10 * x + + 5 / 23 * math.sqrt(23) * sh_11_11 * y + - 5 / 276 * math.sqrt(1518) * sh_11_12 * z + ) + sh_12_13 = ( + 5 / 276 * math.sqrt(1794) * sh_11_11 * z + + 5 / 276 * math.sqrt(3289) * sh_11_12 * y + - 5 / 552 * math.sqrt(2530) * sh_11_13 * z + - 5 / 552 * math.sqrt(2530) * sh_11_9 * x + ) + sh_12_14 = ( + -5 / 552 * math.sqrt(4186) * sh_11_10 * x + + 5 / 552 * math.sqrt(4186) * sh_11_12 * z + + 5 / 138 * math.sqrt(805) * sh_11_13 * y + - 5 / 184 * math.sqrt(230) * sh_11_14 * z + - 5 / 184 * math.sqrt(230) * sh_11_8 * x + ) + sh_12_15 = ( + 5 / 552 * math.sqrt(4830) * sh_11_13 * z + + 5 / 92 * math.sqrt(345) * sh_11_14 * y + - 5 / 92 * math.sqrt(46) * sh_11_15 * z + - 5 / 92 * math.sqrt(46) * sh_11_7 * x + - 5 / 552 * math.sqrt(4830) * sh_11_9 * x + ) + sh_12_16 = ( + 5 / 138 * math.sqrt(345) * sh_11_14 * z + + 10 / 69 * math.sqrt(46) * sh_11_15 * y + - 5 / 276 * math.sqrt(322) * sh_11_16 * z + - 5 / 276 * math.sqrt(322) * sh_11_6 * x + - 5 / 138 * math.sqrt(345) * sh_11_8 * x + ) + sh_12_17 = ( + 5 / 138 * math.sqrt(391) * sh_11_15 * z + + 5 / 276 * math.sqrt(2737) * sh_11_16 * y + - 5 / 552 * math.sqrt(966) * sh_11_17 * z + - 5 / 552 * math.sqrt(966) * sh_11_5 * x + - 5 / 138 * math.sqrt(391) * sh_11_7 * x + ) + sh_12_18 = ( + 5 + / 552 + * math.sqrt(3) + * ( + math.sqrt(2346) * sh_11_16 * z + + 12 * math.sqrt(23) * sh_11_17 * y + - math.sqrt(230) * sh_11_18 * z + - math.sqrt(230) * sh_11_4 * x + - math.sqrt(2346) * sh_11_6 * x + ) + ) + sh_12_19 = ( + 5 / 184 * math.sqrt(874) * sh_11_17 * z + + 5 / 276 * math.sqrt(2185) * sh_11_18 * y + - 5 / 276 * math.sqrt(115) * sh_11_19 * z + - 5 / 276 * math.sqrt(115) * sh_11_3 * x + - 5 / 184 * math.sqrt(874) * sh_11_5 * x + ) + sh_12_20 = ( + 5 / 276 * math.sqrt(2185) * sh_11_18 * z + + 5 / 69 * math.sqrt(115) * sh_11_19 * y + - 5 / 276 * math.sqrt(69) * sh_11_2 * x + - 5 / 276 * math.sqrt(69) * sh_11_20 * z + - 5 / 276 * math.sqrt(2185) * sh_11_4 * x + ) + sh_12_21 = ( + -5 / 552 * math.sqrt(138) * sh_11_1 * x + + 5 / 276 * math.sqrt(2415) * sh_11_19 * z + + 5 / 92 * math.sqrt(161) * sh_11_20 * y + - 5 / 552 * math.sqrt(138) * sh_11_21 * z + - 5 / 276 * math.sqrt(2415) * sh_11_3 * x + ) + sh_12_22 = ( + -5 / 552 * math.sqrt(46) * sh_11_0 * x + - 5 / 552 * math.sqrt(10626) * sh_11_2 * x + + 5 / 552 * math.sqrt(10626) * sh_11_20 * z + + 5 / 138 * math.sqrt(253) * sh_11_21 * y + - 5 / 552 * math.sqrt(46) * sh_11_22 * z + ) + sh_12_23 = ( + -5 / 24 * math.sqrt(22) * sh_11_1 * x + + 5 / 24 * math.sqrt(22) * sh_11_21 * z + + 5 / 12 * sh_11_22 * y + ) + sh_12_24 = 5 / 12 * math.sqrt(6) * (-sh_11_0 * x + sh_11_22 * z) + return paddle.stack( + x=[ + sh_0_0, + sh_1_0, + sh_1_1, + sh_1_2, + sh_2_0, + sh_2_1, + sh_2_2, + sh_2_3, + sh_2_4, + sh_3_0, + sh_3_1, + sh_3_2, + sh_3_3, + sh_3_4, + sh_3_5, + sh_3_6, + sh_4_0, + sh_4_1, + sh_4_2, + sh_4_3, + sh_4_4, + sh_4_5, + sh_4_6, + sh_4_7, + sh_4_8, + sh_5_0, + sh_5_1, + sh_5_2, + sh_5_3, + sh_5_4, + sh_5_5, + sh_5_6, + sh_5_7, + sh_5_8, + sh_5_9, + sh_5_10, + sh_6_0, + sh_6_1, + sh_6_2, + sh_6_3, + sh_6_4, + sh_6_5, + sh_6_6, + sh_6_7, + sh_6_8, + sh_6_9, + sh_6_10, + sh_6_11, + sh_6_12, + sh_7_0, + sh_7_1, + sh_7_2, + sh_7_3, + sh_7_4, + sh_7_5, + sh_7_6, + sh_7_7, + sh_7_8, + sh_7_9, + sh_7_10, + sh_7_11, + sh_7_12, + sh_7_13, + sh_7_14, + sh_8_0, + sh_8_1, + sh_8_2, + sh_8_3, + sh_8_4, + sh_8_5, + sh_8_6, + sh_8_7, + sh_8_8, + sh_8_9, + sh_8_10, + sh_8_11, + sh_8_12, + sh_8_13, + sh_8_14, + sh_8_15, + sh_8_16, + sh_9_0, + sh_9_1, + sh_9_2, + sh_9_3, + sh_9_4, + sh_9_5, + sh_9_6, + sh_9_7, + sh_9_8, + sh_9_9, + sh_9_10, + sh_9_11, + sh_9_12, + sh_9_13, + sh_9_14, + sh_9_15, + sh_9_16, + sh_9_17, + sh_9_18, + sh_10_0, + sh_10_1, + sh_10_2, + sh_10_3, + sh_10_4, + sh_10_5, + sh_10_6, + sh_10_7, + sh_10_8, + sh_10_9, + sh_10_10, + sh_10_11, + sh_10_12, + sh_10_13, + sh_10_14, + sh_10_15, + sh_10_16, + sh_10_17, + sh_10_18, + sh_10_19, + sh_10_20, + sh_11_0, + sh_11_1, + sh_11_2, + sh_11_3, + sh_11_4, + sh_11_5, + sh_11_6, + sh_11_7, + sh_11_8, + sh_11_9, + sh_11_10, + sh_11_11, + sh_11_12, + sh_11_13, + sh_11_14, + sh_11_15, + sh_11_16, + sh_11_17, + sh_11_18, + sh_11_19, + sh_11_20, + sh_11_21, + sh_11_22, + sh_12_0, + sh_12_1, + sh_12_2, + sh_12_3, + sh_12_4, + sh_12_5, + sh_12_6, + sh_12_7, + sh_12_8, + sh_12_9, + sh_12_10, + sh_12_11, + sh_12_12, + sh_12_13, + sh_12_14, + sh_12_15, + sh_12_16, + sh_12_17, + sh_12_18, + sh_12_19, + sh_12_20, + sh_12_21, + sh_12_22, + sh_12_23, + sh_12_24, + ], + axis=-1, + ) + + +def _generate_spherical_harmonics(lmax, device=None): + """code used to generate the code above + + based on `wigner_3j` + """ + paddle.set_default_dtype(d="float64") + + def to_frac(x: float): + from fractions import Fraction + + s = 1 if x >= 0 else -1 + x = x**2 + x = Fraction(x).limit_denominator() + x = s * sympy.sqrt(x) + x = sympy.simplify(x) + return x + + print("sh_0_0 = torch.ones_like(x)") + print("if lmax == 0:") + print(" return torch.stack([") + print(" sh_0_0,") + print(" ], dim=-1)") + print() + x_var, y_var, z_var = sympy.symbols("x y z") + polynomials = [sympy.sqrt(3) * x_var, sympy.sqrt(3) * y_var, sympy.sqrt(3) * z_var] + + def sub_z1(p, names, polynormz): + p = p.subs(x_var, 0).subs(y_var, 1).subs(z_var, 0) + for n, c in zip(names, polynormz): + p = p.subs(n, c) + return p + + poly_evalz = [sub_z1(p, [], []) for p in polynomials] + for l in range(1, lmax + 1): + sh_variables = sympy.symbols(" ".join(f"sh_{l}_{m}" for m in range(2 * l + 1))) + for n, p in zip(sh_variables, polynomials): + print(f"{n} = {pycode(p)}") + print(f"if lmax == {l}:") + u = ",\n ".join( + ", ".join(f"sh_{j}_{m}" for m in range(2 * j + 1)) for j in range(l + 1) + ) + print(f" return torch.stack([\n {u}\n ], dim=-1)") + print() + if l == lmax: + break + polynomials = [ + sum( + to_frac(c.item()) * v * sh + for cj, v in zip(cij, [x_var, y_var, z_var]) + for c, sh in zip(cj, sh_variables) + ) + for cij in o3.wigner_3j(l + 1, 1, l, device=device) + ] + poly_evalz = [sub_z1(p, sh_variables, poly_evalz) for p in polynomials] + norm = sympy.sqrt(sum(p**2 for p in poly_evalz)) + polynomials = [(sympy.sqrt(2 * l + 3) * p / norm) for p in polynomials] + poly_evalz = [(sympy.sqrt(2 * l + 3) * p / norm) for p in poly_evalz] + polynomials = [sympy.simplify(p, full=True) for p in polynomials] diff --git a/ppmat/models/common/e3nn/o3/_tensor_product/__init__.py b/ppmat/models/common/e3nn/o3/_tensor_product/__init__.py new file mode 100644 index 00000000..d5578245 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_tensor_product/__init__.py @@ -0,0 +1,29 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._instruction import Instruction +from ._sub import ElementwiseTensorProduct +from ._sub import FullTensorProduct +from ._sub import FullyConnectedTensorProduct +from ._sub import TensorSquare +from ._tensor_product import TensorProduct + +__all__ = [ + "Instruction", + "TensorProduct", + "FullyConnectedTensorProduct", + "ElementwiseTensorProduct", + "FullTensorProduct", + "TensorSquare", +] diff --git a/ppmat/models/common/e3nn/o3/_tensor_product/_codegen.py b/ppmat/models/common/e3nn/o3/_tensor_product/_codegen.py new file mode 100644 index 00000000..8df8a2f1 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_tensor_product/_codegen.py @@ -0,0 +1,738 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from math import sqrt +from typing import Callable +from typing import List + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.util import prod + +from ._instruction import Instruction + + +def reshape(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) + else: + return paddle.reshape(self, list(args)) + elif kwargs: + assert "shape" in kwargs + return paddle.reshape(self, shape=kwargs["shape"]) + + +setattr(paddle.Tensor, "reshape", reshape) + + +def max_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.maximum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.max(self, *args, **kwargs), paddle.argmax( + self, *args, **kwargs + ) + else: + ret = paddle.max(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "max_func", max_class_func) + + +def _sum_tensors(xs: List[paddle.Tensor], shape: list, like: paddle.Tensor): + if len(xs) > 0: + out = xs[0] + for x in xs[1:]: + out = out + x + return out + return paddle.zeros(shape=shape, dtype=like.dtype) + + +def codegen_tensor_product_right( + irreps_in1: o3.Irreps, + irreps_in2: o3.Irreps, + irreps_out: o3.Irreps, + instructions: List[Instruction], + shared_weights: bool = False, + specialized_code: bool = True, + optimize_einsums: bool = True, +) -> Callable: + """ """ + filtered_instructions = [ins for ins in instructions if 0 not in ins.path_shape] + w3j_dict = {} + for ins in filtered_instructions: + i_in1, i_in2, i_out = ins.i_in1, ins.i_in2, ins.i_out + mul_ir_in1 = irreps_in1[i_in1] + mul_ir_in2 = irreps_in2[i_in2] + mul_ir_out = irreps_out[i_out] + if (mul_ir_in1.ir.l, mul_ir_in2.ir.l, mul_ir_out.ir.l) not in w3j_dict: + w3j_dict[mul_ir_in1.ir.l, mul_ir_in2.ir.l, mul_ir_out.ir.l] = o3.wigner_3j( + mul_ir_in1.ir.l, mul_ir_in2.ir.l, mul_ir_out.ir.l + ) + + def tp_right(x2: paddle.Tensor, weights: paddle.Tensor = None) -> paddle.Tensor: + if not filtered_instructions: + batch_shape = tuple(x2.shape)[:-1] + return paddle.zeros( + shape=batch_shape + (irreps_in1.dim, irreps_out.dim), dtype=x2.dtype + ) + batch_shape = tuple(x2.shape)[:-1] + batch_size = prod(batch_shape) + x2_flat = x2.reshape(batch_size, irreps_in2.dim) + x2_parts = [] + for i, mul_ir in enumerate(irreps_in2): + slice_idx = irreps_in2.slices()[i] + x2_parts.append( + x2_flat[:, slice_idx].reshape(batch_size, mul_ir.mul, mul_ir.ir.dim) + ) + result = paddle.zeros( + shape=[batch_size, irreps_in1.dim, irreps_out.dim], dtype=x2.dtype + ) + weight_idx = 0 + for ins in filtered_instructions: + i_in1, i_in2, i_out = ins.i_in1, ins.i_in2, ins.i_out + mul_ir_in1 = irreps_in1[i_in1] + mul_ir_in2 = irreps_in2[i_in2] + mul_ir_out = irreps_out[i_out] + if mul_ir_in1.dim == 0 or mul_ir_in2.dim == 0 or mul_ir_out.dim == 0: + continue + x2_part = x2_parts[i_in2] + in1_slice = irreps_in1.slices()[i_in1] + out_slice = irreps_out.slices()[i_out] + in1_dim = mul_ir_in1.ir.dim + in2_dim = mul_ir_in2.ir.dim + out_dim = mul_ir_out.ir.dim + in1_mul = mul_ir_in1.mul + in2_mul = mul_ir_in2.mul + out_mul = mul_ir_out.mul + in1_l = mul_ir_in1.ir.l + in2_l = mul_ir_in2.ir.l + out_l = mul_ir_out.ir.l + e1 = paddle.eye(num_rows=in1_mul, dtype=x2.dtype) + e2 = paddle.eye(num_rows=in2_mul, dtype=x2.dtype) + i1 = paddle.eye(num_rows=in1_dim, dtype=x2.dtype) + if ins.has_weight: + weight_size = prod(ins.path_shape) + if shared_weights: + w = weights[weight_idx : weight_idx + weight_size].reshape( + ins.path_shape + ) + else: + w = weights.reshape(batch_size, -1)[ + :, weight_idx : weight_idx + weight_size + ] + w = w.reshape(batch_size, *ins.path_shape) + weight_idx += weight_size + if ins.connection_mode == "uvw": + if ins.has_weight: + if specialized_code and (in1_l, in2_l, out_l) == (0, 0, 0): + x2_reshaped = x2_part.reshape(batch_size, in2_mul) + if shared_weights: + path_result = paddle.einsum("uvw,bv->buw", w, x2_reshaped) + else: + path_result = paddle.einsum("buvw,bv->buw", w, x2_reshaped) + path_result = path_result.reshape(batch_size, in1_mul, out_mul) + elif specialized_code and in1_l == 0: + if shared_weights: + path_result = paddle.einsum("uvw,bvi->buwi", w, x2_part) + else: + path_result = paddle.einsum("buvw,bvi->buwi", w, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul, out_mul * out_dim + ) + path_result = path_result / sqrt(out_dim) + elif specialized_code and in2_l == 0: + x2_reshaped = x2_part.reshape(batch_size, in2_mul) + if shared_weights: + path_result = paddle.einsum( + "uvw,ij,bv->buiwj", w, i1, x2_reshaped + ) + else: + path_result = paddle.einsum( + "buvw,ij,bv->buiwj", w, i1, x2_reshaped + ) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + path_result = path_result / sqrt(out_dim) + elif specialized_code and out_l == 0: + if shared_weights: + path_result = paddle.einsum("uvw,bvi->buiw", w, x2_part) + else: + path_result = paddle.einsum("buvw,bvi->buiw", w, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul + ) + path_result = path_result / sqrt(in1_dim) + else: + w3j = w3j_dict[in1_l, in2_l, out_l] + if shared_weights: + path_result = paddle.einsum( + "uvw,ijk,bvj->buiwk", w, w3j, x2_part + ) + else: + path_result = paddle.einsum( + "buvw,ijk,bvj->buiwk", w, w3j, x2_part + ) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + else: + w3j = w3j_dict[in1_l, in2_l, out_l] + path_result = paddle.einsum("ijk,bvj->bvik", w3j, x2_part) + path_result = path_result.reshape( + batch_size, in2_mul * in1_dim, out_dim + ) + elif ins.connection_mode == "uuw": + if ins.has_weight: + if specialized_code and (in1_l, in2_l, out_l) == (0, 0, 0): + x2_reshaped = x2_part.reshape(batch_size, in2_mul) + if shared_weights: + path_result = paddle.einsum( + "u,uw,bu->buw", w, e2, x2_reshaped + ) + else: + path_result = paddle.einsum( + "bu,uw,bu->buw", w, e2, x2_reshaped + ) + path_result = path_result.reshape(batch_size, in1_mul, out_mul) + elif specialized_code and in1_l == 0: + if shared_weights: + path_result = paddle.einsum( + "u,uw,bui->buwi", w, e2, x2_part + ) + else: + path_result = paddle.einsum( + "bu,uw,bui->buwi", w, e2, x2_part + ) + path_result = path_result.reshape( + batch_size, in1_mul, out_mul * out_dim + ) + path_result = path_result / sqrt(out_dim) + elif specialized_code and in2_l == 0: + x2_reshaped = x2_part.reshape(batch_size, in2_mul) + if shared_weights: + path_result = paddle.einsum( + "u,ij,uw,bu->buiwj", w, i1, e2, x2_reshaped + ) + else: + path_result = paddle.einsum( + "bu,ij,uw,bu->buiwj", w, i1, e2, x2_reshaped + ) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + path_result = path_result / sqrt(out_dim) + elif specialized_code and out_l == 0: + if shared_weights: + path_result = paddle.einsum( + "u,uw,bui->buiw", w, e2, x2_part + ) + else: + path_result = paddle.einsum( + "bu,uw,bui->buiw", w, e2, x2_part + ) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul + ) + path_result = path_result / sqrt(in1_dim) + else: + w3j = w3j_dict[in1_l, in2_l, out_l] + if shared_weights: + path_result = paddle.einsum( + "u,ijk,uw,buj->buiwk", w, w3j, e1, x2_part + ) + else: + path_result = paddle.einsum( + "bu,ijk,uw,buj->buiwk", w, w3j, e1, x2_part + ) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + elif specialized_code and (in1_l, in2_l, out_l) == (0, 0, 0): + x2_reshaped = x2_part.reshape(batch_size, in2_mul) + path_result = paddle.einsum("uw,bu->buw", e2, x2_reshaped) + path_result = path_result.reshape(batch_size, in1_mul, out_mul) + elif specialized_code and (in1_l, in2_l, out_l) == (1, 1, 1): + w3j = w3j_dict[in1_l, in2_l, out_l] + path_result = paddle.einsum("ijk,uw,buj->buiwk", w3j, e1, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + elif specialized_code and in1_l == 0: + path_result = paddle.einsum("uw,bui->buwi", e2, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul, out_mul * out_dim + ) + path_result = path_result / sqrt(out_dim) + elif specialized_code and in2_l == 0: + x2_reshaped = x2_part.reshape(batch_size, in2_mul) + path_result = paddle.einsum("ij,uw,bu->buiwj", i1, e2, x2_reshaped) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + path_result = path_result / sqrt(out_dim) + elif specialized_code and out_l == 0: + path_result = paddle.einsum("uw,bui->buiw", e2, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul + ) + path_result = path_result / sqrt(in1_dim) + else: + w3j = w3j_dict[in1_l, in2_l, out_l] + path_result = paddle.einsum("ijk,uw,buj->buiwk", w3j, e1, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + elif ins.connection_mode == "uvuv": + if ins.has_weight: + w3j = w3j_dict[in1_l, in2_l, out_l] + if shared_weights: + path_result = paddle.einsum( + "uv,ijk,uw,bvj->buiwvk", w, w3j, e1, x2_part + ) + else: + path_result = paddle.einsum( + "buv,ijk,uw,bvj->buiwvk", w, w3j, e1, x2_part + ) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + else: + w3j = w3j_dict[in1_l, in2_l, out_l] + path_result = paddle.einsum("ijk,uw,bvj->buiwvk", w3j, e1, x2_part) + path_result = path_result.reshape( + batch_size, in1_mul * in1_dim, out_mul * out_dim + ) + elif ins.connection_mode in ["uvu Callable: + w3j_dict = {} + for ins in instructions: + if 0 in ins.path_shape: + continue + mul_ir_in1 = irreps_in1[ins.i_in1] + mul_ir_in2 = irreps_in2[ins.i_in2] + mul_ir_out = irreps_out[ins.i_out] + key = mul_ir_in1.ir.l, mul_ir_in2.ir.l, mul_ir_out.ir.l + if key not in w3j_dict: + w3j_dict[key] = o3.wigner_3j( + mul_ir_in1.ir.l, mul_ir_in2.ir.l, mul_ir_out.ir.l + ) + filtered_instructions = [ins for ins in instructions if 0 not in ins.path_shape] + + def tp_forward( + x1: paddle.Tensor, x2: paddle.Tensor, weights: paddle.Tensor = None + ) -> paddle.Tensor: + if len(filtered_instructions) == 0: + if shared_weights: + output_shape = tuple( + paddle.broadcast_tensors( + input=[ + paddle.zeros(shape=tuple(x1.shape)[:-1]), + paddle.zeros(shape=tuple(x2.shape)[:-1]), + ] + )[0].shape + ) + else: + output_shape = tuple( + paddle.broadcast_tensors( + input=[ + paddle.zeros(shape=tuple(x1.shape)[:-1]), + paddle.zeros(shape=tuple(x2.shape)[:-1]), + paddle.zeros(shape=tuple(weights.shape)[:-1]), + ] + )[0].shape + ) + return paddle.zeros(shape=output_shape + (irreps_out.dim,), dtype=x1.dtype) + if shared_weights: + output_shape = tuple( + paddle.broadcast_tensors( + input=[ + paddle.zeros(shape=tuple(x1.shape)[:-1]), + paddle.zeros(shape=tuple(x2.shape)[:-1]), + ] + )[0].shape + ) + x1 = x1.broadcast_to(shape=output_shape + (-1,)) + x2 = x2.broadcast_to(shape=output_shape + (-1,)) + else: + output_shape = tuple( + paddle.broadcast_tensors( + input=[ + paddle.zeros(shape=tuple(x1.shape)[:-1]), + paddle.zeros(shape=tuple(x2.shape)[:-1]), + paddle.zeros(shape=tuple(weights.shape)[:-1]), + ] + )[0].shape + ) + x1 = x1.broadcast_to(shape=output_shape + (-1,)) + x2 = x2.broadcast_to(shape=output_shape + (-1,)) + weights = weights.broadcast_to(shape=output_shape + (-1,)) + final_output_shape = output_shape + (irreps_out.dim,) + x1 = x1.reshape(-1, irreps_in1.dim) + x2 = x2.reshape(-1, irreps_in2.dim) + batch_numel = tuple(x1.shape)[0] + weight_numel = sum( + prod(ins.path_shape) for ins in filtered_instructions if ins.has_weight + ) + if weight_numel > 0 and weights is not None: + weights = weights.reshape(-1, weight_numel) + if len(irreps_in1) == 1: + x1_list = [x1.reshape(batch_numel, irreps_in1[0].mul, irreps_in1[0].ir.dim)] + else: + x1_list = [] + for i, mul_ir in zip(irreps_in1.slices(), irreps_in1): + x1_list.append(x1[:, i].reshape(batch_numel, mul_ir.mul, mul_ir.ir.dim)) + x2_list = [] + if len(irreps_in2) == 1: + x2_list.append( + x2.reshape(batch_numel, irreps_in2[0].mul, irreps_in2[0].ir.dim) + ) + else: + for i, mul_ir in zip(irreps_in2.slices(), irreps_in2): + x2_list.append(x2[:, i].reshape(batch_numel, mul_ir.mul, mul_ir.ir.dim)) + z = "" if shared_weights else "z" + xx_dict = {} + flat_weight_index = 0 + outputs = [] + for ins in filtered_instructions: + mul_ir_in1 = irreps_in1[ins.i_in1] + mul_ir_in2 = irreps_in2[ins.i_in2] + mul_ir_out = irreps_out[ins.i_out] + assert mul_ir_in1.ir.p * mul_ir_in2.ir.p == mul_ir_out.ir.p + assert ( + abs(mul_ir_in1.ir.l - mul_ir_in2.ir.l) + <= mul_ir_out.ir.l + <= mul_ir_in1.ir.l + mul_ir_in2.ir.l + ) + if mul_ir_in1.dim == 0 or mul_ir_in2.dim == 0 or mul_ir_out.dim == 0: + continue + x1_tensor = x1_list[ins.i_in1] + x2_tensor = x2_list[ins.i_in2] + assert ins.connection_mode in [ + "uvw", + "uvu", + "uvv", + "uuw", + "uuu", + "uvuv", + "uvuzuij", x1_tensor, x2_tensor) + else: + xx_dict[key] = paddle.einsum("zui,zvj->zuvij", x1_tensor, x2_tensor) + xx = xx_dict[key] + l1l2l3 = mul_ir_in1.ir.l, mul_ir_in2.ir.l, mul_ir_out.ir.l + w3j = w3j_dict.get(l1l2l3, None) + if ins.connection_mode == "uvw": + assert ins.has_weight + if specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + f"{z}uvw,zu,zv->zw", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + f"{z}uvw,zu,zvj->zwj", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + f"{z}uvw,zui,zv->zwi", + w, + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum( + f"{z}uvw,zui,zvi->zw", w, x1_tensor, x2_tensor + ) / sqrt(mul_ir_in1.ir.dim) + else: + result = paddle.einsum(f"{z}uvw,ijk,zuvij->zwk", w, w3j, xx) + elif ins.connection_mode == "uvu": + assert mul_ir_in1.mul == mul_ir_out.mul + if ins.has_weight: + if specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + f"{z}uv,zu,zv->zu", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + f"{z}uv,zu,zvj->zuj", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + f"{z}uv,zui,zv->zui", + w, + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum( + f"{z}uv,zui,zvi->zu", w, x1_tensor, x2_tensor + ) / sqrt(mul_ir_in1.ir.dim) + else: + result = paddle.einsum(f"{z}uv,ijk,zuvij->zuk", w, w3j, xx) + else: + result = paddle.einsum("ijk,zuvij->zuk", w3j, xx) + elif ins.connection_mode == "uvv": + assert mul_ir_in2.mul == mul_ir_out.mul + if ins.has_weight: + if specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + f"{z}uv,zu,zv->zv", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + f"{z}uv,zu,zvj->zvj", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + f"{z}uv,zui,zv->zvi", + w, + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum( + f"{z}uv,zui,zvi->zv", w, x1_tensor, x2_tensor + ) / sqrt(mul_ir_in1.ir.dim) + else: + result = paddle.einsum(f"{z}uv,ijk,zuvij->zvk", w, w3j, xx) + elif specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + "zu,zv->zv", + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + "zu,zvj->zvj", + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + "zui,zv->zvi", + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum("zui,zvi->zv", x1_tensor, x2_tensor) / sqrt( + mul_ir_in1.ir.dim + ) + else: + result = paddle.einsum("ijk,zuvij->zvk", w3j, xx) + elif ins.connection_mode == "uuw": + assert mul_ir_in1.mul == mul_ir_in2.mul + if ins.has_weight: + if specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + f"{z}uw,zu,zu->zw", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + f"{z}uw,zu,zuj->zwj", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + f"{z}uw,zui,zu->zwi", + w, + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum( + f"{z}uw,zui,zui->zw", w, x1_tensor, x2_tensor + ) / sqrt(mul_ir_in1.ir.dim) + else: + result = paddle.einsum(f"{z}uw,ijk,zuij->zwk", w, w3j, xx) + else: + assert mul_ir_out.mul == 1 + result = paddle.einsum("ijk,zuij->zk", w3j, xx) + elif ins.connection_mode == "uuu": + assert mul_ir_in1.mul == mul_ir_in2.mul == mul_ir_out.mul + if ins.has_weight: + if specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + f"{z}u,zu,zu->zu", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and l1l2l3 == (1, 1, 1): + result = paddle.einsum( + f"{z}u,zui->zui", + w, + paddle.cross(x=x1_tensor, y=x2_tensor, axis=2), + ) / sqrt(2 * 3) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + f"{z}u,zu,zuj->zuj", + w, + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + f"{z}u,zui,zu->zui", + w, + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum( + f"{z}u,zui,zui->zu", w, x1_tensor, x2_tensor + ) / sqrt(mul_ir_in1.ir.dim) + else: + result = paddle.einsum(f"{z}u,ijk,zuij->zuk", w, w3j, xx) + elif specialized_code and l1l2l3 == (0, 0, 0): + result = paddle.einsum( + "zu,zu->zu", + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) + elif specialized_code and l1l2l3 == (1, 1, 1): + result = paddle.cross(x=x1_tensor, y=x2_tensor, axis=2) * ( + 1.0 / sqrt(2 * 3) + ) + elif specialized_code and mul_ir_in1.ir.l == 0: + result = paddle.einsum( + "zu,zuj->zuj", + x1_tensor.reshape(batch_numel, mul_ir_in1.dim), + x2_tensor, + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_in2.ir.l == 0: + result = paddle.einsum( + "zui,zu->zui", + x1_tensor, + x2_tensor.reshape(batch_numel, mul_ir_in2.dim), + ) / sqrt(mul_ir_out.ir.dim) + elif specialized_code and mul_ir_out.ir.l == 0: + result = paddle.einsum("zui,zui->zu", x1_tensor, x2_tensor) / sqrt( + mul_ir_in1.ir.dim + ) + else: + result = paddle.einsum("ijk,zuij->zuk", w3j, xx) + elif ins.connection_mode == "uvuv": + assert mul_ir_in1.mul * mul_ir_in2.mul == mul_ir_out.mul + if ins.has_weight: + result = paddle.einsum(f"{z}uv,ijk,zuvij->zuvk", w, w3j, xx) + else: + result = paddle.einsum("ijk,zuvij->zuvk", w3j, xx) + elif ins.connection_mode == "uvuzwk", w, w3j, xx_subset) + else: + result = paddle.einsum("ijk,zwij->zwk", w3j, xx_subset) + elif ins.connection_mode == "uzwk", w, w3j, xx_subset) + result = ins.path_weight * result + outputs.append(result.reshape(batch_numel, mul_ir_out.dim)) + final_outputs = [] + for i_out, mul_ir_out in enumerate(irreps_out): + if mul_ir_out.mul > 0: + relevant_outputs = [ + out + for ins, out in zip(filtered_instructions, outputs) + if ins.i_out == i_out + ] + final_outputs.append( + _sum_tensors( + relevant_outputs, (batch_numel, mul_ir_out.dim), like=x1 + ) + ) + if len(final_outputs) > 1: + result = paddle.concat(x=final_outputs, axis=1) + elif len(final_outputs) == 1: + result = final_outputs[0] + else: + return paddle.zeros(shape=final_output_shape, dtype=x1.dtype) + return result.reshape(final_output_shape) + + return tp_forward diff --git a/ppmat/models/common/e3nn/o3/_tensor_product/_instruction.py b/ppmat/models/common/e3nn/o3/_tensor_product/_instruction.py new file mode 100644 index 00000000..51ab116e --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_tensor_product/_instruction.py @@ -0,0 +1,25 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import NamedTuple + + +class Instruction(NamedTuple): + i_in1: int + i_in2: int + i_out: int + connection_mode: str + has_weight: bool + path_weight: float + path_shape: tuple diff --git a/ppmat/models/common/e3nn/o3/_tensor_product/_sub.py b/ppmat/models/common/e3nn/o3/_tensor_product/_sub.py new file mode 100644 index 00000000..cd366093 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_tensor_product/_sub.py @@ -0,0 +1,437 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Iterator +from typing import Optional + +import paddle + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.util import prod + +from ._tensor_product import TensorProduct + + +class FullyConnectedTensorProduct(TensorProduct): + """Fully-connected weighted tensor product + + All the possible path allowed by :math:`|l_1 - l_2| \\leq l_{out} \\leq l_1 + l_2` are made. + The output is a sum on different paths: + + .. math:: + + z_w = \\sum_{u,v} w_{uvw} x_u \\otimes y_v + \\cdots \\text{other paths} + + where :math:`u,v,w` are the indices of the multiplicities. + + Parameters + ---------- + irreps_in1 : `e3nn.o3.Irreps` + representation of the first input + + irreps_in2 : `e3nn.o3.Irreps` + representation of the second input + + irreps_out : `e3nn.o3.Irreps` + representation of the output + + irrep_normalization : {'component', 'norm'} + see `e3nn.o3.TensorProduct` + + path_normalization : {'element', 'path'} + see `e3nn.o3.TensorProduct` + + internal_weights : bool + see `e3nn.o3.TensorProduct` + + shared_weights : bool + see `e3nn.o3.TensorProduct` + """ + + def __init__( + self, + irreps_in1, + irreps_in2, + irreps_out, + irrep_normalization: str = None, + path_normalization: str = None, + **kwargs, + ): + irreps_in1 = o3.Irreps(irreps_in1) + irreps_in2 = o3.Irreps(irreps_in2) + irreps_out = o3.Irreps(irreps_out) + instr = [ + (i_1, i_2, i_out, "uvw", True, 1.0) + for i_1, (_, ir_1) in enumerate(irreps_in1) + for i_2, (_, ir_2) in enumerate(irreps_in2) + for i_out, (_, ir_out) in enumerate(irreps_out) + if ir_out in ir_1 * ir_2 + ] + super().__init__( + irreps_in1, + irreps_in2, + irreps_out, + instr, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + **kwargs, + ) + + +class ElementwiseTensorProduct(TensorProduct): + """Elementwise connected tensor product. + + .. math:: + + z_u = x_u \\otimes y_u + + where :math:`u` runs over the irreps. Note that there are no weights. + The output representation is determined by the two input representations. + + Parameters + ---------- + irreps_in1 : `e3nn.o3.Irreps` + representation of the first input + + irreps_in2 : `e3nn.o3.Irreps` + representation of the second input + + filter_ir_out : iterator of `e3nn.o3.Irrep`, optional + filter to select only specific `e3nn.o3.Irrep` of the output + + irrep_normalization : {'component', 'norm'} + see `e3nn.o3.TensorProduct` + + Examples + -------- + Elementwise scalar product + + >>> ElementwiseTensorProduct("5x1o + 5x1e", "10x1e", ["0e", "0o"]) + ElementwiseTensorProduct(5x1o+5x1e x 10x1e -> 5x0o+5x0e | 10 paths | 0 weights) + + """ + + def __init__( + self, + irreps_in1, + irreps_in2, + filter_ir_out=None, + irrep_normalization: str = None, + **kwargs, + ): + irreps_in1 = o3.Irreps(irreps_in1).simplify() + irreps_in2 = o3.Irreps(irreps_in2).simplify() + if filter_ir_out is not None: + try: + filter_ir_out = [o3.Irrep(ir) for ir in filter_ir_out] + except ValueError: + raise ValueError( + f"filter_ir_out (={filter_ir_out}) must be an iterable of e3nn.o3.Irrep" + ) + assert irreps_in1.num_irreps == irreps_in2.num_irreps + irreps_in1 = list(irreps_in1) + irreps_in2 = list(irreps_in2) + i = 0 + while i < len(irreps_in1): + mul_1, ir_1 = irreps_in1[i] + mul_2, ir_2 = irreps_in2[i] + if mul_1 < mul_2: + irreps_in2[i] = mul_1, ir_2 + irreps_in2.insert(i + 1, (mul_2 - mul_1, ir_2)) + if mul_2 < mul_1: + irreps_in1[i] = mul_2, ir_1 + irreps_in1.insert(i + 1, (mul_1 - mul_2, ir_1)) + i += 1 + out = [] + instr = [] + for i, ((mul, ir_1), (mul_2, ir_2)) in enumerate(zip(irreps_in1, irreps_in2)): + assert mul == mul_2 + for ir in ir_1 * ir_2: + if filter_ir_out is not None and ir not in filter_ir_out: + continue + i_out = len(out) + out.append((mul, ir)) + instr += [(i, i, i_out, "uuu", False)] + super().__init__( + irreps_in1, + irreps_in2, + out, + instr, + irrep_normalization=irrep_normalization, + **kwargs, + ) + + +class FullTensorProduct(TensorProduct): + """Full tensor product between two irreps. + + .. math:: + + z_{uv} = x_u \\otimes y_v + + where :math:`u` and :math:`v` run over the irreps. Note that there are no weights. + The output representation is determined by the two input representations. + + Parameters + ---------- + irreps_in1 : `e3nn.o3.Irreps` + representation of the first input + + irreps_in2 : `e3nn.o3.Irreps` + representation of the second input + + filter_ir_out : iterator of `e3nn.o3.Irrep`, optional + filter to select only specific `e3nn.o3.Irrep` of the output + + irrep_normalization : {'component', 'norm'} + see `e3nn.o3.TensorProduct` + """ + + def __init__( + self, + irreps_in1: o3.Irreps, + irreps_in2: o3.Irreps, + filter_ir_out: Iterator[o3.Irrep] = None, + irrep_normalization: str = None, + **kwargs, + ): + irreps_in1 = o3.Irreps(irreps_in1).simplify() + irreps_in2 = o3.Irreps(irreps_in2).simplify() + if filter_ir_out is not None: + try: + filter_ir_out = [o3.Irrep(ir) for ir in filter_ir_out] + except ValueError: + raise ValueError( + f"filter_ir_out (={filter_ir_out}) must be an iterable of e3nn.o3.Irrep" + ) + out = [] + instr = [] + for i_1, (mul_1, ir_1) in enumerate(irreps_in1): + for i_2, (mul_2, ir_2) in enumerate(irreps_in2): + for ir_out in ir_1 * ir_2: + if filter_ir_out is not None and ir_out not in filter_ir_out: + continue + i_out = len(out) + out.append((mul_1 * mul_2, ir_out)) + instr += [(i_1, i_2, i_out, "uvuv", False)] + out = o3.Irreps(out) + out, p, _ = out.sort() # Irrreps类中有sort方法,paconvert转换后会报错, 这里不应该转换,sort函数被误会了。 + + # out, p, _ = paddle.sort(x=out), paddle.argsort(x=out) # 这里经过paconvert转换后会报错 + instr = [ + (i_1, i_2, p[i_out], mode, train) for i_1, i_2, i_out, mode, train in instr + ] + super().__init__( + irreps_in1, + irreps_in2, + out, + instr, + irrep_normalization=irrep_normalization, + **kwargs, + ) + + +def _square_instructions_full(irreps_in, filter_ir_out=None, irrep_normalization=None): + """Generate instructions for square tensor product. + + Parameters + ---------- + irreps_in : `e3nn.o3.Irreps` + representation of the input + + filter_ir_out : iterator of `e3nn.o3.Irrep`, optional + filter to select only specific `e3nn.o3.Irrep` of the output + + irrep_normalization : {'component', 'norm', 'none'} + see `e3nn.o3.TensorProduct` + + Returns + ------- + irreps_out : `e3nn.o3.Irreps` + representation of the output + + instr : list of tuple + list of instructions + + """ + irreps_out = [] + instr = [] + for i_1, (mul_1, ir_1) in enumerate(irreps_in): + for i_2, (mul_2, ir_2) in enumerate(irreps_in): + for ir_out in ir_1 * ir_2: + if filter_ir_out is not None and ir_out not in filter_ir_out: + continue + if irrep_normalization == "component": + alpha = ir_out.dim + if irrep_normalization == "norm": + alpha = ir_1.dim * ir_2.dim + if irrep_normalization == "none": + alpha = 1 + if i_1 < i_2: + i_out = len(irreps_out) + irreps_out.append((mul_1 * mul_2, ir_out)) + instr += [(i_1, i_2, i_out, "uvuv", False, alpha)] + elif i_1 == i_2: + i = i_1 + mul = mul_1 + if mul > 1: + i_out = len(irreps_out) + irreps_out.append((mul * (mul - 1) // 2, ir_out)) + instr += [(i, i, i_out, "uvu 1: + instr += [(i, i, i_out, "u {self.irreps_out.simplify()} | {npath} paths | {self.weight_numel} weights)" + + def forward(self, x, weight: Optional[paddle.Tensor] = None): + return super().forward(x, x, weight) diff --git a/ppmat/models/common/e3nn/o3/_tensor_product/_tensor_product.py b/ppmat/models/common/e3nn/o3/_tensor_product/_tensor_product.py new file mode 100644 index 00000000..f8d60c84 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_tensor_product/_tensor_product.py @@ -0,0 +1,595 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import warnings +from math import sqrt +from typing import Any +from typing import List +from typing import Optional +from typing import Union + +import matplotlib +import matplotlib.pyplot as plt +import paddle +from matplotlib import patches +from matplotlib.path import Path + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.util import prod + +from ._codegen import codegen_tensor_product_left_right +from ._codegen import codegen_tensor_product_right +from ._instruction import Instruction + + +class TensorProduct(paddle.nn.Layer): + instructions: List[Any] + shared_weights: bool + internal_weights: bool + weight_numel: int + + def __init__( + self, + irreps_in1: o3.Irreps, + irreps_in2: o3.Irreps, + irreps_out: o3.Irreps, + instructions: List[tuple], + in1_var: Optional[Union[List[float], paddle.Tensor]] = None, + in2_var: Optional[Union[List[float], paddle.Tensor]] = None, + out_var: Optional[Union[List[float], paddle.Tensor]] = None, + irrep_normalization: str = None, + path_normalization: str = None, + internal_weights: Optional[bool] = None, + shared_weights: Optional[bool] = None, + compile_left_right: bool = True, + compile_right: bool = False, + normalization=None, + _specialized_code: Optional[bool] = None, + _optimize_einsums: Optional[bool] = None, + ): + super().__init__() + if normalization is not None: + warnings.warn( + "`normalization` have given up, please use `irrep_normalization`", + DeprecationWarning, + ) + irrep_normalization = normalization + if irrep_normalization is None: + irrep_normalization = "component" + if path_normalization is None: + path_normalization = "element" + assert irrep_normalization in ["component", "norm", "none"] + assert path_normalization in ["element", "path", "none"] + self.irreps_in1 = o3.Irreps(irreps_in1) + self.irreps_in2 = o3.Irreps(irreps_in2) + self.irreps_out = o3.Irreps(irreps_out) + instructions = [(x if len(x) == 6 else x + (1.0,)) for x in instructions] + instructions = [ + Instruction( + i_in1=i_in1, + i_in2=i_in2, + i_out=i_out, + connection_mode=connection_mode, + has_weight=has_weight, + path_weight=path_weight, + path_shape={ + "uvw": ( + self.irreps_in1[i_in1].mul, + self.irreps_in2[i_in2].mul, + self.irreps_out[i_out].mul, + ), + "uvu": (self.irreps_in1[i_in1].mul, self.irreps_in2[i_in2].mul), + "uvv": (self.irreps_in1[i_in1].mul, self.irreps_in2[i_in2].mul), + "uuw": (self.irreps_in1[i_in1].mul, self.irreps_out[i_out].mul), + "uuu": (self.irreps_in1[i_in1].mul,), + "uvuv": (self.irreps_in1[i_in1].mul, self.irreps_in2[i_in2].mul), + "uvu 0.0: + alpha /= x + alpha *= out_var[ins.i_out] + alpha *= ins.path_weight + normalization_coefficients += [sqrt(alpha)] + self.instructions = [ + Instruction( + ins.i_in1, + ins.i_in2, + ins.i_out, + ins.connection_mode, + ins.has_weight, + alpha, + ins.path_shape, + ) + for ins, alpha in zip(instructions, normalization_coefficients) + ] + if internal_weights is None: + internal_weights = False + if shared_weights is None: + shared_weights = True + if not shared_weights and internal_weights: + raise ValueError( + "when internal_weights == True, the shared_weights must be True" + ) + self.internal_weights = internal_weights + self.shared_weights = shared_weights + self.weight_numel = sum( + prod(ins.path_shape) for ins in self.instructions if ins.has_weight + ) + if internal_weights and self.weight_numel > 0: + assert self.shared_weights, "Having internal weights impose shared weights" + self.weight = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[self.weight_numel]) + ) + else: + # Avoid registering zero-sized tensors as buffers: Paddle DataParallel + # synchronizes buffers across ranks and does not support numel == 0. + # For cases where weights are not used (weight_numel == 0) or are + # provided externally (internal_weights == False), we create the + # appropriate empty tensor on-the-fly in forward. + self.weight = None + if self.irreps_out.dim > 0: + output_mask = paddle.concat( + x=[ + ( + paddle.ones(shape=mul * ir.dim) + if any( + ins.i_out == i_out + and ins.path_weight != 0 + and 0 not in ins.path_shape + for ins in self.instructions + ) + else paddle.zeros(shape=mul * ir.dim) + ) + for i_out, (mul, ir) in enumerate(self.irreps_out) + ] + ) + else: + output_mask = paddle.ones(shape=[0]) + self.register_buffer(name="output_mask", tensor=output_mask) + self._specialized_code = ( + True if _specialized_code is None else _specialized_code + ) + self._optimize_einsums = ( + False if _optimize_einsums is None else _optimize_einsums + ) + if compile_left_right: + self._tp_forward = codegen_tensor_product_left_right( + self.irreps_in1, + self.irreps_in2, + self.irreps_out, + self.instructions, + self.shared_weights, + self._specialized_code, + self._optimize_einsums, + ) + else: + self._tp_forward = None + if compile_right: + self._tp_right = codegen_tensor_product_right( + self.irreps_in1, + self.irreps_in2, + self.irreps_out, + self.instructions, + self.shared_weights, + self._specialized_code, + self._optimize_einsums, + ) + else: + self._tp_right = None + + def __repr__(self): + npath = sum(prod(i.path_shape) for i in self.instructions) + return f"{self.__class__.__name__}({self.irreps_in1.simplify()} x {self.irreps_in2.simplify()} -> {self.irreps_out.simplify()} | {npath} paths | {self.weight_numel} weights)" + + def _prep_weights_python( + self, weight: Optional[Union[paddle.Tensor, List[paddle.Tensor]]] + ) -> Optional[paddle.Tensor]: + if isinstance(weight, list): + weight_shapes = [ + ins.path_shape for ins in self.instructions if ins.has_weight + ] + if not self.shared_weights: + weight = [ + w.reshape(-1, prod(shape)) + for w, shape in zip(weight, weight_shapes) + ] + else: + weight = [ + w.reshape(prod(shape)) for w, shape in zip(weight, weight_shapes) + ] + return paddle.concat(x=weight, axis=-1) + else: + return weight + + def _get_weights( + self, + weight: Optional[Union[paddle.Tensor, List[paddle.Tensor]]], + like: Optional[paddle.Tensor] = None, + ) -> paddle.Tensor: + weight = self._prep_weights_python(weight) + if weight is None: + if self.weight_numel > 0 and not self.internal_weights: + raise RuntimeError( + "Weights must be provided when the TensorProduct does not have `internal_weights`" + ) + if self.weight is None: + dtype = getattr(like, "dtype", None) + place = getattr(like, "place", None) + return paddle.to_tensor([], dtype=dtype, place=place) + return self.weight + + if self.shared_weights: + assert tuple(weight.shape) == ( + self.weight_numel, + ), "Invalid weight shape" + else: + assert tuple(weight.shape)[-1] == self.weight_numel, "Invalid weight shape" + assert ( + weight.ndim > 1 + ), "When shared weights is false, weights must have batch dimension" + return weight + + def right(self, y, weight=None): + assert ( + self._tp_right is not None + ), "The right function is not compiled, please set compile_right=True when creating the TensorProduct." + assert ( + tuple(y.shape)[-1] == self.irreps_in2.dim + ), f"The last dimension of y should be{self.irreps_in2.dim}" + real_weight = self._get_weights(weight, like=y) + return self._tp_right(y, real_weight) + + def forward(self, x, y, weight=None): + assert ( + self._tp_forward is not None + ), "The forward function is not complied, please set compile_left_right=True when creating the TensorProduct" + assert ( + tuple(x.shape)[-1] == self.irreps_in1.dim + ), f"The last dimension of x should be {self.irreps_in1.dim}" + assert ( + tuple(y.shape)[-1] == self.irreps_in2.dim + ), f"the last dimesion of y is {self.irreps_in2.dim}" + real_weight = self._get_weights(weight, like=x) + return self._tp_forward(x, y, real_weight) + + def weight_view_for_instruction(self, instruction_idx, weight=None): + if not self.instructions[instruction_idx].has_weight: + raise ValueError(f"{instruction_idx} have not weights") + offset = sum( + prod(ins.path_shape) + for ins in self.instructions[:instruction_idx] + if ins.has_weight + ) + ins = self.instructions[instruction_idx] + weight = self._get_weights(weight) + batch_shape = tuple(weight.shape)[:-1] + start_0 = weight.shape[-1] + offset if offset < 0 else offset + return paddle.slice( + weight, [-1], [start_0], [start_0 + prod(ins.path_shape)] + ).view(batch_shape + ins.path_shape) + + def weight_views(self, weight=None, yield_instruction=False): + weight = self._get_weights(weight) + batch_shape = tuple(weight.shape)[:-1] + offset = 0 + for ins_i, ins in enumerate(self.instructions): + if ins.has_weight: + flat_size = prod(ins.path_shape) + start_1 = weight.shape[-1] + offset if offset < 0 else offset + this_weight = paddle.slice( + weight, [-1], [start_1], [start_1 + flat_size] + ).view(batch_shape + ins.path_shape) + offset += flat_size + if yield_instruction: + yield ins_i, ins, this_weight + else: + yield this_weight + + def visualize( + self, + weight: Optional[paddle.Tensor] = None, + plot_weight: bool = True, + aspect_ratio=1, + ax=None, + ): + """Visualize the connectivity of this `e3nn.o3.TensorProduct` + + Parameters + ---------- + weight : `torch.Tensor`, optional + like ``weight`` argument to ``forward()`` + + plot_weight : `bool`, default True + Whether to color paths by the sum of their weights. + + ax : ``matplotlib.Axes``, default None + The axes to plot on. If ``None``, a new figure will be created. + + Returns + ------- + (fig, ax) + The figure and axes on which the plot was drawn. + """ + import numpy as np + + def _intersection(x, u, y, v): + u2 = np.sum(u**2) + v2 = np.sum(v**2) + uv = np.sum(u * v) + det = u2 * v2 - uv**2 + mu = np.sum((u * uv - v * u2) * (y - x)) / det + return y + mu * v + + if ax is None: + ax = plt.gca() + fig = ax.get_figure() + verts = [ + np.array([np.cos(a * 2 * np.pi / 6), np.sin(a * 2 * np.pi / 6)]) + for a in range(6) + ] + verts = np.asarray(verts) + if not (aspect_ratio in ["auto"] or isinstance(aspect_ratio, (float, int))): + raise ValueError( + f"aspect_ratio must be 'auto' or a float or int, got {aspect_ratio}" + ) + if aspect_ratio == "auto": + factor = 0.2 / 2 + min_aspect = 1 / 2 + h_factor = max(len(self.irreps_in2), len(self.irreps_in1)) + w_factor = len(self.irreps_out) + if h_factor / w_factor < min_aspect: + h_factor = min_aspect * w_factor + verts[:, 1] *= h_factor * factor + verts[:, 0] *= w_factor * factor + if isinstance(aspect_ratio, (float, int)): + factor = 0.1 * max( + len(self.irreps_in2), len(self.irreps_in1), len(self.irreps_out) + ) + verts[:, 1] *= factor + verts[:, 0] *= aspect_ratio * factor + codes = [ + Path.MOVETO, + Path.LINETO, + Path.MOVETO, + Path.LINETO, + Path.MOVETO, + Path.LINETO, + ] + path = Path(verts, codes) + patch = patches.PathPatch(path, facecolor="none", lw=1, zorder=2) + ax.add_patch(patch) + n = len(self.irreps_in1) + b, a = verts[2:4] + c_in1 = (a + b) / 2 + s_in1 = [(a + (i + 1) / (n + 1) * (b - a)) for i in range(n)] + n = len(self.irreps_in2) + b, a = verts[:2] + c_in2 = (a + b) / 2 + s_in2 = [(a + (i + 1) / (n + 1) * (b - a)) for i in range(n)] + n = len(self.irreps_out) + a, b = verts[4:6] + s_out = [(a + (i + 1) / (n + 1) * (b - a)) for i in range(n)] + if weight is None and not self.internal_weights: + plot_weight = False + elif plot_weight: + with paddle.no_grad(): + path_weight = [] + for ins_i, ins in enumerate(self.instructions): + if ins.has_weight: + this_weight = self.weight_view_for_instruction( + ins_i, weight=weight + ).cpu() + path_weight.append(this_weight.pow(y=2).mean()) + else: + path_weight.append(0) + path_weight = np.asarray(path_weight) + path_weight /= np.abs(path_weight).max() + cmap = matplotlib.cm.get_cmap("Blues") + for ins_index, ins in enumerate(self.instructions): + y = _intersection(s_in1[ins.i_in1], c_in1, s_in2[ins.i_in2], c_in2) + verts = [] + codes = [] + verts += [s_out[ins.i_out], y] + codes += [Path.MOVETO, Path.LINETO] + verts += [s_in1[ins.i_in1], y] + codes += [Path.MOVETO, Path.LINETO] + verts += [s_in2[ins.i_in2], y] + codes += [Path.MOVETO, Path.LINETO] + if plot_weight: + color = ( + cmap(0.5 + 0.5 * path_weight[ins_index]) + if ins.has_weight + else "black" + ) + else: + color = "green" if ins.has_weight else "black" + ax.add_patch( + patches.PathPatch( + Path(verts, codes), + facecolor="none", + edgecolor=color, + alpha=0.5, + ls="-", + lw=1.5, + ) + ) + padding = 3 + fontsize = 10 + + def format_ir(mul_ir): + if mul_ir.mul == 1: + return f"${mul_ir.ir}$" + return f"${mul_ir.mul} \\times {mul_ir.ir}$" + + for i, mul_ir in enumerate(self.irreps_in1): + ax.annotate( + format_ir(mul_ir), + s_in1[i], + horizontalalignment="right", + textcoords="offset points", + xytext=(-padding, 0), + fontsize=fontsize, + ) + for i, mul_ir in enumerate(self.irreps_in2): + ax.annotate( + format_ir(mul_ir), + s_in2[i], + horizontalalignment="left", + textcoords="offset points", + xytext=(padding, 0), + fontsize=fontsize, + ) + for i, mul_ir in enumerate(self.irreps_out): + ax.annotate( + format_ir(mul_ir), + s_out[i], + horizontalalignment="center", + verticalalignment="top", + rotation=90, + textcoords="offset points", + xytext=(0, -padding), + fontsize=fontsize, + ) + ax.set_xlim(-2, 2) + ax.set_ylim(-2, 2) + ax.axis("equal") + ax.axis("off") + return fig, ax + + +def reshape(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) + else: + return paddle.reshape(self, list(args)) + elif kwargs: + assert "shape" in kwargs + return paddle.reshape(self, shape=kwargs["shape"]) + + +setattr(paddle.Tensor, "reshape", reshape) + + +def view(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list, str)): + return paddle.view(self, args[0]) + else: + return paddle.view(self, list(args)) + elif kwargs: + return paddle.view(self, shape_or_dtype=list(kwargs.values())[0]) + + +setattr(paddle.Tensor, "view", view) + + +def max_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.maximum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.max(self, *args, **kwargs), paddle.argmax( + self, *args, **kwargs + ) + else: + ret = paddle.max(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "max_func", max_class_func) diff --git a/ppmat/models/common/e3nn/o3/_tensor_product/tensor_product_pre_visualization.png b/ppmat/models/common/e3nn/o3/_tensor_product/tensor_product_pre_visualization.png new file mode 100644 index 00000000..4fb72dce Binary files /dev/null and b/ppmat/models/common/e3nn/o3/_tensor_product/tensor_product_pre_visualization.png differ diff --git a/ppmat/models/common/e3nn/o3/_wigner.py b/ppmat/models/common/e3nn/o3/_wigner.py new file mode 100644 index 00000000..9a8b6a96 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/_wigner.py @@ -0,0 +1,266 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +"""Core functions of :math:`SO(3)` +""" +import functools +import math + +from ppmat.models.common.e3nn.util import explicit_default_types + + +def su2_generators(j) -> paddle.Tensor: + m = paddle.arange(start=-j, end=j, dtype="float32") + raising = paddle.diag(x=-paddle.sqrt(x=j * (j + 1) - m * (m + 1)), offset=-1) + m = paddle.arange(start=-j + 1, end=j + 1, dtype="float32") + lowering = paddle.diag(x=paddle.sqrt(x=j * (j + 1) - m * (m - 1)), offset=1) + m = paddle.arange(start=-j, end=j + 1, dtype="float32") + raising = paddle.cast(raising, dtype="complex64") + lowering = paddle.cast(lowering, dtype="complex64") + return paddle.stack( + x=[ + 0.5 * (raising + lowering), + paddle.diag(x=1.0j * m), + -0.5j * (raising - lowering), + ], + axis=0, + ) + + +def change_basis_real_to_complex(l: int, dtype=None, device=None) -> paddle.Tensor: + q = paddle.zeros(shape=(2 * l + 1, 2 * l + 1), dtype="complex128") + for m in range(-l, 0): + q[l + m, l + abs(m)] = 1 / 2**0.5 + q[l + m, l - abs(m)] = -1.0j / 2**0.5 + q[l, l] = 1 + for m in range(1, l + 1): + q[l + m, l + abs(m)] = (-1) ** m / 2**0.5 + q[l + m, l - abs(m)] = 1.0j * (-1) ** m / 2**0.5 + q = (-1.0j) ** l * q + dtype, device = explicit_default_types(dtype, device) + if isinstance(dtype, str): + if dtype.lower() == "float32": + dtype = paddle.float32 + elif dtype.lower() == "float64": + dtype = paddle.float64 + dtype = {paddle.float32: paddle.complex64, paddle.float64: paddle.complex128}[dtype] + q = q.astype(dtype) + if isinstance(device, paddle.CUDAPlace): + q = q.cuda(device.device_id) + elif isinstance(device, paddle.CPUPlace): + q = q.cpu() + q = q.clone() + return q + + +def so3_generators(l) -> paddle.Tensor: + X = su2_generators(l) + Q = change_basis_real_to_complex(l) + X = paddle.conj(x=Q.T) @ X @ Q + assert paddle.all(x=paddle.abs(x=paddle.imag(x=X)) < 1e-05) + return paddle.real(x=X) + + +def wigner_D(l, alpha, beta, gamma): + """Wigner D matrix representation of :math:`SO(3)`. + + It satisfies the following properties: + + * :math:`D(\\text{identity rotation}) = \\text{identity matrix}` + * :math:`D(R_1 \\circ R_2) = D(R_1) \\circ D(R_2)` + * :math:`D(R^{-1}) = D(R)^{-1} = D(R)^T` + * :math:`D(\\text{rotation around Y axis})` has some property that allows us to use FFT in `ToS2Grid` + + Parameters + ---------- + l : int + :math:`l` + + alpha : `torch.Tensor` + tensor of shape :math:`(...)` + Rotation :math:`\\alpha` around Y axis, applied third. + + beta : `torch.Tensor` + tensor of shape :math:`(...)` + Rotation :math:`\\beta` around X axis, applied second. + + gamma : `torch.Tensor` + tensor of shape :math:`(...)` + Rotation :math:`\\gamma` around Y axis, applied first. + + Returns + ------- + `torch.Tensor` + tensor :math:`D^l(\\alpha, \\beta, \\gamma)` of shape :math:`(2l+1, 2l+1)` + """ + alpha, beta, gamma = paddle.broadcast_tensors(input=[alpha, beta, gamma]) + alpha = alpha[..., None, None] % (2 * math.pi) + beta = beta[..., None, None] % (2 * math.pi) + gamma = gamma[..., None, None] % (2 * math.pi) + X = so3_generators(l) + return ( + paddle.linalg.matrix_exp(alpha * X[1]) + @ paddle.linalg.matrix_exp(beta * X[0]) + @ paddle.linalg.matrix_exp(gamma * X[1]) + ) + + +def wigner_3j(l1, l2, l3, dtype=None, device=None): + """Wigner 3j symbols :math:`C_{lmn}`. + + It satisfies the following two properties: + + .. math:: + + C_{lmn} = C_{ijk} D_{il}(g) D_{jm}(g) D_{kn}(g) \\qquad \\forall g \\in SO(3) + + where :math:`D` are given by `wigner_D`. + + .. math:: + + C_{ijk} C_{ijk} = 1 + + Parameters + ---------- + l1 : int + :math:`l_1` + + l2 : int + :math:`l_2` + + l3 : int + :math:`l_3` + + dtype : torch.dtype or None + ``dtype`` of the returned tensor. If ``None`` then set to ``torch.get_default_dtype()``. + + device : torch.device or None + ``device`` of the returned tensor. If ``None`` then set to the default device of the current context. + + Returns + ------- + `torch.Tensor` + tensor :math:`C` of shape :math:`(2l_1+1, 2l_2+1, 2l_3+1)` + """ + assert abs(l2 - l3) <= l1 <= l2 + l3 + assert isinstance(l1, int) and isinstance(l2, int) and isinstance(l3, int) + C = _so3_clebsch_gordan(l1, l2, l3) + dtype, device = explicit_default_types(dtype, device) + return C.to(dtype=dtype, device=device).clone() + + +@functools.lru_cache(maxsize=None) +def _so3_clebsch_gordan(l1, l2, l3): + Q1 = change_basis_real_to_complex(l1, dtype="float64") + Q2 = change_basis_real_to_complex(l2, dtype="float64") + Q3 = change_basis_real_to_complex(l3, dtype="float64") + C = _su2_clebsch_gordan(l1, l2, l3).to(dtype="complex128") + C = paddle.einsum("ij,kl,mn,ikn->jlm", Q1, Q2, paddle.conj(x=Q3.T), C) + assert paddle.all(x=paddle.abs(x=paddle.imag(x=C)) < 1e-05) + C = paddle.real(x=C) + C = C / paddle.linalg.norm(x=C) + return C + + +@functools.lru_cache(maxsize=None) +def _su2_clebsch_gordan(j1, j2, j3): + """Calculates the Clebsch-Gordon matrix + for SU(2) coupling j1 and j2 to give j3. + Parameters + ---------- + j1 : float + Total angular momentum 1. + j2 : float + Total angular momentum 2. + j3 : float + Total angular momentum 3. + Returns + ------- + cg_matrix : numpy.array + Requested Clebsch-Gordan matrix. + """ + assert isinstance(j1, (int, float)) + assert isinstance(j2, (int, float)) + assert isinstance(j3, (int, float)) + mat = paddle.zeros( + shape=(int(2 * j1 + 1), int(2 * j2 + 1), int(2 * j3 + 1)), dtype="float64" + ) + if int(2 * j3) in range(int(2 * abs(j1 - j2)), int(2 * (j1 + j2)) + 1, 2): + for m1 in (x / 2 for x in range(-int(2 * j1), int(2 * j1) + 1, 2)): + for m2 in (x / 2 for x in range(-int(2 * j2), int(2 * j2) + 1, 2)): + if abs(m1 + m2) <= j3: + mat[ + int(j1 + m1), int(j2 + m2), int(j3 + m1 + m2) + ] = _su2_clebsch_gordan_coeff((j1, m1), (j2, m2), (j3, m1 + m2)) + return mat + + +def _su2_clebsch_gordan_coeff(idx1, idx2, idx3): + """Calculates the Clebsch-Gordon coefficient + for SU(2) coupling (j1,m1) and (j2,m2) to give (j3,m3). + Parameters + ---------- + j1 : float + Total angular momentum 1. + j2 : float + Total angular momentum 2. + j3 : float + Total angular momentum 3. + m1 : float + z-component of angular momentum 1. + m2 : float + z-component of angular momentum 2. + m3 : float + z-component of angular momentum 3. + Returns + ------- + cg_coeff : float + Requested Clebsch-Gordan coefficient. + """ + from fractions import Fraction + from math import factorial + + j1, m1 = idx1 + j2, m2 = idx2 + j3, m3 = idx3 + if m3 != m1 + m2: + return 0 + vmin = int(max([-j1 + j2 + m3, -j1 + m1, 0])) + vmax = int(min([j2 + j3 + m1, j3 - j1 + j2, j3 + m3])) + + def f(n): + assert n == round(n) + return factorial(round(n)) + + C = ( + (2.0 * j3 + 1.0) + * Fraction( + f(j3 + j1 - j2) + * f(j3 - j1 + j2) + * f(j1 + j2 - j3) + * f(j3 + m3) + * f(j3 - m3), + f(j1 + j2 + j3 + 1) * f(j1 - m1) * f(j1 + m1) * f(j2 - m2) * f(j2 + m2), + ) + ) ** 0.5 + S = 0 + for v in range(vmin, vmax + 1): + S += (-1) ** int(v + j2 + m2) * Fraction( + f(j2 + j3 + m1 - v) * f(j1 - m1 + v), + f(v) * f(j3 - j1 + j2 - v) * f(j3 + m3 - v) * f(v + j1 - j2 - m3), + ) + C = C * S + return C diff --git a/ppmat/models/common/e3nn/o3/irrep/__init__.py b/ppmat/models/common/e3nn/o3/irrep/__init__.py new file mode 100644 index 00000000..efb51b96 --- /dev/null +++ b/ppmat/models/common/e3nn/o3/irrep/__init__.py @@ -0,0 +1,52 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Allows for clean lookup of Irreducible representations of :math:`O(3)` + +Examples +-------- +Create a scalar representation (:math:`l=0`) of even parity. + +>>> from e3nn.o3 import irrep +>>> irrep.l0e == Irrep("0e") +True + +>>> from e3nn.o3.irrep import l1o, l2o +>>> l1o + l2o == Irrep("1o") + Irrep("2o") +True +""" + +from .._irreps import Irrep + + +def __getattr__(name: str): + """Creates an Irreps obeject by reflection + + Parameters + ---------- + name : string + the o3 object name prefixed by l. Example: l1o == Irrep("1o") + + Returns + ------- + `e3nn.o3.Irrep` + irreducible representation of :math:`O(3)` + """ + prefix, *ir = name + if prefix != "l" or not ir: + raise AttributeError(f"'e3nn.o3.irrep' module has no attribute '{name}'") + try: + return Irrep("".join(ir)) + except (ValueError, AssertionError): + raise AttributeError(f"'e3nn.o3.irrep' module has no attribute '{name}'") \ No newline at end of file diff --git a/ppmat/models/common/e3nn/paddle_utils.py b/ppmat/models/common/e3nn/paddle_utils.py new file mode 100644 index 00000000..f6c73ffc --- /dev/null +++ b/ppmat/models/common/e3nn/paddle_utils.py @@ -0,0 +1,186 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + + +def max_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.maximum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.max(self, *args, **kwargs), paddle.argmax( + self, *args, **kwargs + ) + else: + ret = paddle.max(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "max_func", max_class_func) + + +def reshape(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) + else: + return paddle.reshape(self, list(args)) + elif kwargs: + assert "shape" in kwargs + return paddle.reshape(self, shape=kwargs["shape"]) + + +setattr(paddle.Tensor, "reshape", reshape) + + +def mul(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + + return paddle.multiply(self, y) + + +setattr(paddle.Tensor, "mul", mul) +setattr(paddle.Tensor, "multiply", mul) + + +def add(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + if "alpha" in kwargs: + alpha = kwargs["alpha"] + if alpha != 1: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(alpha * y) + else: + y = alpha * y + else: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + return paddle.add(self, y) + + +setattr(paddle.Tensor, "add", add) + + +def sub(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + if "alpha" in kwargs: + alpha = kwargs["alpha"] + if alpha != 1: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(alpha * y) + else: + y = alpha * y + else: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + return paddle.subtract(self, y) + + +setattr(paddle.Tensor, "sub", sub) +setattr(paddle.Tensor, "subtract", sub) + + +def dim2perm(ndim, dim0, dim1): + perm = list(range(ndim)) + perm[dim0], perm[dim1] = perm[dim1], perm[dim0] + return perm + + +def min_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.minimum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.minimum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.min(self, *args, **kwargs), paddle.argmin( + self, *args, **kwargs + ) + else: + ret = paddle.min(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "min_func", min_class_func) + + +def div(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + + res = paddle.divide(self, y) + + if "rounding_mode" in kwargs: + rounding_mode = kwargs["rounding_mode"] + if rounding_mode == "trunc": + res = paddle.trunc(res) + elif rounding_mode == "floor": + res = paddle.floor(res) + + return res + + +setattr(paddle.Tensor, "div", div) +setattr(paddle.Tensor, "divide", div) + + +def view(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list, str)): + return paddle.view(self, args[0]) + else: + return paddle.view(self, list(args)) + elif kwargs: + return paddle.view(self, shape_or_dtype=list(kwargs.values())[0]) + + +setattr(paddle.Tensor, "view", view) \ No newline at end of file diff --git a/ppmat/models/common/e3nn/util/__init__.py b/ppmat/models/common/e3nn/util/__init__.py new file mode 100644 index 00000000..b53c6469 --- /dev/null +++ b/ppmat/models/common/e3nn/util/__init__.py @@ -0,0 +1,33 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .default_type import explicit_default_types +from .default_type import torch_get_default_device +from .default_type import torch_get_default_tensor_type + + +def prod(x): + """Compute the product of a sequence.""" + out = 1 + for a in x: + out *= a + return out + + +__all__ = [ + "torch_get_default_tensor_type", + "torch_get_default_device", + "explicit_default_types", + "prod", +] diff --git a/ppmat/models/common/e3nn/util/_argtools.py b/ppmat/models/common/e3nn/util/_argtools.py new file mode 100644 index 00000000..b53c6469 --- /dev/null +++ b/ppmat/models/common/e3nn/util/_argtools.py @@ -0,0 +1,33 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .default_type import explicit_default_types +from .default_type import torch_get_default_device +from .default_type import torch_get_default_tensor_type + + +def prod(x): + """Compute the product of a sequence.""" + out = 1 + for a in x: + out *= a + return out + + +__all__ = [ + "torch_get_default_tensor_type", + "torch_get_default_device", + "explicit_default_types", + "prod", +] diff --git a/ppmat/models/common/e3nn/util/_context.py b/ppmat/models/common/e3nn/util/_context.py new file mode 100644 index 00000000..4c7ea338 --- /dev/null +++ b/ppmat/models/common/e3nn/util/_context.py @@ -0,0 +1,14 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/ppmat/models/common/e3nn/util/codegen/__init__.py b/ppmat/models/common/e3nn/util/codegen/__init__.py new file mode 100644 index 00000000..82fe0621 --- /dev/null +++ b/ppmat/models/common/e3nn/util/codegen/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._mixin import CodeGenMixin + +__all__ = ["CodeGenMixin"] diff --git a/ppmat/models/common/e3nn/util/codegen/_mixin.py b/ppmat/models/common/e3nn/util/codegen/_mixin.py new file mode 100644 index 00000000..1bdeaf1c --- /dev/null +++ b/ppmat/models/common/e3nn/util/codegen/_mixin.py @@ -0,0 +1,38 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# from opt_einsum_fx import jitable + + +class CodeGenMixin: + + def _codegen_register(self, funcs): + if not hasattr(self, "__codegen__"): + self.__codegen__ = [] + self.__codegen__.extend(funcs.keys()) + for fname, func in funcs.items(): + setattr(self, fname, func) + + def __getstate__(self): + if hasattr(super(CodeGenMixin, self), "__getstate__"): + out = super(CodeGenMixin, self).__getstate__() + else: + out = self.__dict__ + return out + + def __setstate__(self, d): + if hasattr(super(CodeGenMixin, self), "__setstate__"): + super(CodeGenMixin, self).__setstate__(d) + else: + self.__dict__.update(d) diff --git a/ppmat/models/common/e3nn/util/default_type.py b/ppmat/models/common/e3nn/util/default_type.py new file mode 100644 index 00000000..11422292 --- /dev/null +++ b/ppmat/models/common/e3nn/util/default_type.py @@ -0,0 +1,44 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Optional +from typing import Tuple +from typing import Union + +import paddle + + +def torch_get_default_tensor_type(): + return str(paddle.empty(shape=[0]).dtype) + + +def _torch_get_default_dtype() -> paddle.dtype: + """A torchscript-compatible version of torch.get_default_dtype()""" + return paddle.empty(shape=[0]).dtype + + +def torch_get_default_device() -> Union[paddle.CPUPlace, paddle.CUDAPlace]: + return paddle.empty(shape=[0]).place + + +def explicit_default_types( + dtype: Optional[paddle.dtype] = None, + device: Optional[Union[paddle.CPUPlace, paddle.CUDAPlace]] = None, +) -> Tuple[paddle.dtype, Union[paddle.CPUPlace, paddle.CUDAPlace]]: + """A torchscript-compatible type resolver""" + if dtype is None: + dtype = _torch_get_default_dtype() + if device is None: + device = torch_get_default_device() + return dtype, device diff --git a/ppmat/models/common/e3nn/util/jit.py b/ppmat/models/common/e3nn/util/jit.py new file mode 100644 index 00000000..3e13e9c6 --- /dev/null +++ b/ppmat/models/common/e3nn/util/jit.py @@ -0,0 +1,56 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import inspect + +import paddle + +_E3NN_COMPILE_MODE = "__e3nn_compile_mode__" +_VALID_MODES = "trace", "script", "unsupported", None + + +def compile_mode(mode: str): + if mode not in _VALID_MODES: + raise ValueError("Invalid compile mode") + + def decorator(obj): + if not (inspect.isclass(obj) and issubclass(obj, paddle.nn.Layer)): + raise TypeError( + "@e3nn.util.jit.compile_mode can only decorate classes derived from paddle.nn.Layer" + ) + setattr(obj, _E3NN_COMPILE_MODE, mode) + return obj + + return decorator + + +def get_compile_mode(mod: paddle.nn.Layer) -> str: + if hasattr(mod, _E3NN_COMPILE_MODE): + mode = getattr(mod, _E3NN_COMPILE_MODE) + else: + mode = getattr(type(mod), _E3NN_COMPILE_MODE, None) + assert mode in _VALID_MODES, "Invalid compile mode `%r`" % mode + return mode + + +def compile(mod: paddle.nn.Layer, **kwargs): + return mod + + +def script(mod: paddle.nn.Layer, **kwargs): + return mod + + +def trace(mod: paddle.nn.Layer, **kwargs): + return mod \ No newline at end of file diff --git a/ppmat/models/common/e3nn/util/paddle_utils.py b/ppmat/models/common/e3nn/util/paddle_utils.py new file mode 100644 index 00000000..f6c73ffc --- /dev/null +++ b/ppmat/models/common/e3nn/util/paddle_utils.py @@ -0,0 +1,186 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + + +def max_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.maximum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.max(self, *args, **kwargs), paddle.argmax( + self, *args, **kwargs + ) + else: + ret = paddle.max(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "max_func", max_class_func) + + +def reshape(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) + else: + return paddle.reshape(self, list(args)) + elif kwargs: + assert "shape" in kwargs + return paddle.reshape(self, shape=kwargs["shape"]) + + +setattr(paddle.Tensor, "reshape", reshape) + + +def mul(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + + return paddle.multiply(self, y) + + +setattr(paddle.Tensor, "mul", mul) +setattr(paddle.Tensor, "multiply", mul) + + +def add(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + if "alpha" in kwargs: + alpha = kwargs["alpha"] + if alpha != 1: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(alpha * y) + else: + y = alpha * y + else: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + return paddle.add(self, y) + + +setattr(paddle.Tensor, "add", add) + + +def sub(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + if "alpha" in kwargs: + alpha = kwargs["alpha"] + if alpha != 1: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(alpha * y) + else: + y = alpha * y + else: + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + return paddle.subtract(self, y) + + +setattr(paddle.Tensor, "sub", sub) +setattr(paddle.Tensor, "subtract", sub) + + +def dim2perm(ndim, dim0, dim1): + perm = list(range(ndim)) + perm[dim0], perm[dim1] = perm[dim1], perm[dim0] + return perm + + +def min_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.minimum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.minimum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.min(self, *args, **kwargs), paddle.argmin( + self, *args, **kwargs + ) + else: + ret = paddle.min(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "min_func", min_class_func) + + +def div(self, *args, **kwargs): + if "other" in kwargs: + y = kwargs["other"] + elif "y" in kwargs: + y = kwargs["y"] + else: + y = args[0] + + if not isinstance(y, paddle.Tensor): + y = paddle.to_tensor(y) + + res = paddle.divide(self, y) + + if "rounding_mode" in kwargs: + rounding_mode = kwargs["rounding_mode"] + if rounding_mode == "trunc": + res = paddle.trunc(res) + elif rounding_mode == "floor": + res = paddle.floor(res) + + return res + + +setattr(paddle.Tensor, "div", div) +setattr(paddle.Tensor, "divide", div) + + +def view(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list, str)): + return paddle.view(self, args[0]) + else: + return paddle.view(self, list(args)) + elif kwargs: + return paddle.view(self, shape_or_dtype=list(kwargs.values())[0]) + + +setattr(paddle.Tensor, "view", view) \ No newline at end of file diff --git a/ppmat/models/common/graph_converter.py b/ppmat/models/common/graph_converter.py new file mode 100644 index 00000000..2cb13ac7 --- /dev/null +++ b/ppmat/models/common/graph_converter.py @@ -0,0 +1,658 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import annotations + +from typing import Dict +from typing import List +from typing import Optional +from typing import Sequence +from typing import Tuple +from typing import Union + +import numpy as np +import paddle +import pgl +from p_tqdm import p_map +from pymatgen.analysis import local_env +from pymatgen.analysis.graphs import StructureGraph +from pymatgen.core.structure import Structure +from pymatgen.optimization.neighbors import find_points_in_spheres +from rdkit import Chem +from rdkit.Chem.rdchem import BondType as BT + +from ppmat.utils import logger +from ppmat.utils.crystal import lattice_params_to_matrix + + +class FindPointsInSpheres: + """Convert crystal structure to graph representation using spherical neighborhood + search. + + This tool identifies neighboring atoms within a cutoff radius for each atom in a + crystal structure, building a graph representation suitable for material analysis + applications. + + Args: + cutoff (float, optional): Cutoff radius (in Ångström) for neighborhood search. + Defaults to 5.0. + pbc (tuple[int, int, int], optional):Periodic boundary conditions along x/y/z + axes. Each element 0 (disabled) or 1 (enabled). Defaults to (1, 1, 1). + num_cpus (Optional[int], optional): Number of CPU cores for parallel processing: + - None: Auto-detect all available cores (recommended) + - Positive integer: Explicit core count. + Defaults to None. + eps (float, optional): Floating-point tolerance for numerical comparisons. + Defaults to 1e-8. + **kwargs: Reserved for future expansion (currently unused parameters) + """ + + def __init__( + self, + cutoff: float = 5.0, + pbc: tuple[int, int, int] = (1, 1, 1), + num_cpus: Optional[int] = None, + eps: float = 1e-8, + **kwargs, + ) -> None: + self.cutoff = cutoff + self.pbc = np.array(pbc, dtype=int) + self.num_cpus = num_cpus + self.eps = eps + + def __call__(self, structure: Structure): + if isinstance(structure, Structure): + graph = self.get_graph_by_find_points_in_spheres(structure) + elif isinstance(structure, list): + graph = p_map( + self.get_graph_by_find_points_in_spheres, + structure, + num_cpus=self.num_cpus, + ) + # the following code is equivalent to the above line, it is slower, + # but easier to debug. + # graph = [ + # self.get_graph_by_find_points_in_spheres(struc) + # for struc in structure + # ] + else: + raise TypeError("The input must be a pymatgen.Structure or a list of them.") + return graph + + def get_graph_by_find_points_in_spheres(self, structure: Structure): + lattice_matrix = structure.lattice.matrix + cart_coords = structure.cart_coords + + cutoff = self.cutoff + attempt = 3 + while attempt > 0: + src_id, dst_id, images, bond_dist = find_points_in_spheres( + cart_coords, + cart_coords, + r=cutoff, + pbc=self.pbc, + lattice=lattice_matrix, + tol=self.eps, + ) + exclude_self = (src_id != dst_id) | (bond_dist > self.eps) + src_id, dst_id, images, bond_dist = ( + src_id[exclude_self], + dst_id[exclude_self], + images[exclude_self], + bond_dist[exclude_self], + ) + + edge_indices = [(u, v) for u, v in zip(src_id, dst_id)] + to_jimages = np.array(images, dtype="float32") + if len(edge_indices) == 0: + logger.warning( + f"No edges found within cutoff {cutoff:.5f}. Trying again with " + "larger cutoff." + ) + cutoff *= 2 + attempt -= 1 + else: + break + if len(edge_indices) == 0: + logger.warning( + f"No edges found within cutoff {cutoff:.5f}. Set graph is None." + ) + graph = None + else: + graph = self.build_pgl_graph(structure, edge_indices, to_jimages) + return graph + + def build_pgl_graph( + self, + structure: Structure, + edge_indices, + to_jimages, + node_features=None, + edge_features=None, + ): + assert node_features is None or isinstance(node_features, dict) + assert edge_features is None or isinstance(edge_features, dict) + + # get atom types + atom_types = np.array([site.specie.Z for site in structure]) + + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + # convert to numpy array + edge_indices = np.array(edge_indices) + if to_jimages is not None: + to_jimages = np.array(to_jimages) + num_atoms = tuple(atom_types.shape)[0] + + # After multiple graph batch operations by the dataloader, + # graph.num_nodes remains an integer, which is the sum of the number of + # nodes in all graphs + graph = pgl.Graph(edge_indices, num_nodes=num_atoms) + # node features: frac_coords, cart_coords, atom_types + graph.node_feat["frac_coords"] = structure.frac_coords.astype("float32") + graph.node_feat["cart_coords"] = structure.cart_coords.astype("float32") + graph.node_feat["atom_types"] = atom_types + + # graph features: lengths, angles, lattice, num_atoms + # Due to the inability of pgl.graph to store graph level features, + # we will store these features under node_feat + graph.node_feat["lengths"] = lengths + graph.node_feat["angles"] = angles + graph.node_feat["lattice"] = lattice.reshape(1, 3, 3) + # graph.node_feat['num_atoms'] is different from graph.num_nodes + # After multiple graph batch operations by the dataloader, + # graph.node_feat['num_atoms'] is a tensor of shape (batch_size), + # where each value is the number of atoms in the corresponding graph. + graph.node_feat["num_atoms"] = np.array([num_atoms]) + # edge features: pbc_offset, bond_vec, bond_dist + if to_jimages is not None: + graph.edge_feat["pbc_offset"] = to_jimages + offset = np.matmul(to_jimages, lattice) + dst_pos = graph.node_feat["cart_coords"][graph.edges[:, 1]] + offset + src_pos = graph.node_feat["cart_coords"][graph.edges[:, 0]] + bond_vec = dst_pos - src_pos + bond_dist = np.linalg.norm(bond_vec, axis=1) + graph.edge_feat["bond_vec"] = bond_vec.astype("float32") + graph.edge_feat["bond_dist"] = bond_dist.astype("float32") + graph.edge_feat["num_edges"] = np.array([edge_indices.shape[0]]) + + if node_features is not None: + graph.node_feat.update(node_features) + if edge_features is not None: + graph.edge_feat.update(edge_features) + return graph + + +class CrystalNN: + """Convert crystal structure to graph representation using + CrystalNN-based graph generator method. + + This class uses pymatgen's CrystalNN local environment strategy to + convert a pymatgen Structure into a PGL graph (pgl.Graph), + capturing atomic connectivity under periodic boundary conditions. + + Core methods: + - __init__: Configure neighbor search parameters and parallelism. + - __call__: Accepts a single Structure or a list and returns + a graph or list of graphs. + - get_graph_by_crystalnn: Converts one Structure into a PGL graph. + - build_pgl_graph: Assembles node/edge features into a PGL graph. + + Args: + cutoff (float): + Maximum neighbor search distance (in Å). Atom pairs farther + apart than this are not considered bonded. + pbc (tuple[int, int, int]): + Periodic boundary flags along (a, b, c) axes. + 1 enables periodicity, 0 disables it. + num_cpus (Optional[int]): + Number of CPU cores to use when processing a list of structures + in parallel. If None, processes sequentially. + eps (float): + Small constant for numerical stability (e.g., to avoid division + by zero). + """ + + def __init__( + self, + cutoff: float = 5.0, + pbc: tuple[int, int, int] = (1, 1, 1), + num_cpus: Optional[int] = None, + eps: float = 1e-8, + ): + self.cutoff = cutoff + self.pbc = np.array(pbc, dtype=int) + self.num_cpus = num_cpus + self.eps = eps + self.CrystalNN = local_env.CrystalNN( + distance_cutoffs=None, x_diff_weight=-1, porous_adjustment=False + ) + + def __call__(self, structure: Structure): + if isinstance(structure, Structure): + graph = self.get_graph_by_crystalnn(structure) + elif isinstance(structure, list): + graph = p_map( + self.get_graph_by_crystalnn, structure, num_cpus=self.num_cpus + ) + # the following code is equivalent to the above line, it is slower, + # but easier to debug. + # graph = [self.get_graph_by_crystalnn(struc) for struc in structure] + else: + raise TypeError("The input must be a pymatgen.Structure or a list of them.") + return graph + + def get_graph_by_crystalnn(self, structure: Structure): + + try: + structure_graph = StructureGraph.with_local_env_strategy( + structure, self.CrystalNN + ) + except Exception: + search_cutoff = 10 + while True: + try: + crystalNN_tmp = local_env.CrystalNN( + distance_cutoffs=None, + x_diff_weight=-1, + porous_adjustment=False, + search_cutoff=search_cutoff, + ) + structure_graph = StructureGraph.from_local_env_strategy( + structure, crystalNN_tmp + ) + logger.info( + "Successfully generated graph by CrystalNN with " + f"search_cutoff={search_cutoff}." + ) + break + except Exception: + search_cutoff += 2 + logger.info(f"Searching for new search_cutoff{search_cutoff}...") + if search_cutoff > 40: + logger.info( + "Failed to generate graph by CrystalNN with " + f"search_cutoff={search_cutoff}. " + ) + break + + # atom_types = np.array(structure.atomic_numbers) + lattice_parameters = structure.lattice.parameters + lengths = lattice_parameters[:3] + angles = lattice_parameters[3:] + assert np.allclose( + structure.lattice.matrix, lattice_params_to_matrix(*lengths, *angles) + ) + + edge_indices, to_jimages = [], [] + for i, j, to_jimage in structure_graph.graph.edges(data="to_jimage"): + edge_indices.append([j, i]) + to_jimages.append(to_jimage) + edge_indices.append([i, j]) + to_jimages.append(tuple(-tj for tj in to_jimage)) + + graph = self.build_pgl_graph(structure, edge_indices, to_jimages) + return graph + + def build_pgl_graph( + self, + structure: Structure, + edge_indices, + to_jimages, + node_features=None, + edge_features=None, + ): + assert node_features is None or isinstance(node_features, dict) + assert edge_features is None or isinstance(edge_features, dict) + + # get atom types + atom_types = np.array([site.specie.Z for site in structure]) + + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + # convert to numpy array + edge_indices = np.array(edge_indices) + if to_jimages is not None: + to_jimages = np.array(to_jimages) + num_atoms = tuple(atom_types.shape)[0] + + # After multiple graph batch operations by the dataloader, + # graph.num_nodes remains an integer, which is the sum of the number of + # nodes in all graphs + graph = pgl.Graph(edge_indices, num_nodes=num_atoms) + # node features: frac_coords, cart_coords, atom_types + graph.node_feat["frac_coords"] = structure.frac_coords.astype("float32") + graph.node_feat["cart_coords"] = structure.cart_coords.astype("float32") + graph.node_feat["atom_types"] = atom_types + + # graph features: lengths, angles, lattice, num_atoms + # Due to the inability of pgl.graph to store graph level features, + # we will store these features under node_feat + graph.node_feat["lengths"] = lengths + graph.node_feat["angles"] = angles + graph.node_feat["lattice"] = lattice.reshape(1, 3, 3) + # graph.node_feat['num_atoms'] is different from graph.num_nodes + # After multiple graph batch operations by the dataloader, + # graph.node_feat['num_atoms'] is a tensor of shape (batch_size), + # where each value is the number of atoms in the corresponding graph. + graph.node_feat["num_atoms"] = np.array([num_atoms]) + # edge features: pbc_offset, bond_vec, bond_dist + if to_jimages is not None: + graph.edge_feat["pbc_offset"] = to_jimages + offset = np.matmul(to_jimages, lattice) + dst_pos = graph.node_feat["cart_coords"][graph.edges[:, 1]] + offset + src_pos = graph.node_feat["cart_coords"][graph.edges[:, 0]] + bond_vec = dst_pos - src_pos + bond_dist = np.linalg.norm(bond_vec, axis=1) + graph.edge_feat["bond_vec"] = bond_vec.astype("float32") + graph.edge_feat["bond_dist"] = bond_dist.astype("float32") + graph.edge_feat["num_edges"] = np.array([edge_indices.shape[0]]) + + if node_features is not None: + graph.node_feat.update(node_features) + if edge_features is not None: + graph.edge_feat.update(edge_features) + return graph + + +class MolecularGraphConverter: + """Convert RDKit Mol into PGL Graph. + + Args: + remove_h (bool): Controls whether hydrogen atoms are removed before building + the molecular graph. Defaults to False。 + atom_vocab (Optional[Dict[str,int]]): A dictionary mapping atomic symbols + (e.g., "C", "O", "N") to unique integer indices for one-hot encoding. + bond_vocab (Optional[Tuple[BT,...]]): A tuple defining the bond types + (e.g., SINGLE, DOUBLE, AROMATIC) and their order for one-hot encoding. + add_self_loops (bool): Adds self-loops to the graph (edges connecting each + node to itself). + num_cpus (Optional[int]): Number of CPUs for parallel graph construction. + Defaults to 1。 + """ + + def __init__( + self, + atom_vocab: Optional[Dict[str, int]] = None, + bond_vocab: Optional[Tuple[BT, ...]] = None, + remove_h: bool = True, + add_self_loops: bool = False, + edge_mode: str = "bidirectional", + num_cpus: Optional[int] = None, + ) -> None: + if atom_vocab is None: + if remove_h is False: + atom_vocab = { + "H": 0, + "C": 1, + "N": 2, + "O": 3, + "F": 4, + "P": 5, + "S": 6, + "Cl": 7, + "Br": 8, + "I": 9, + } + else: + atom_vocab = { + "C": 0, + "N": 1, + "O": 2, + "F": 3, + "P": 4, + "S": 5, + "Cl": 6, + "Br": 7, + "I": 8, + } + if bond_vocab is None: + bond_vocab = (BT.SINGLE, BT.DOUBLE, BT.TRIPLE, BT.AROMATIC) + + self.atom_vocab = dict(atom_vocab) + self.bond_vocab = tuple(bond_vocab) + self.remove_h = remove_h + self.add_self_loops = add_self_loops + self.edge_mode = edge_mode + self.num_cpus = 1 if num_cpus is None else int(num_cpus) + + @staticmethod + def build_one( + mol: Chem.Mol, + remove_h: bool, + atom_vocab: Dict[str, int], + bond_vocab: Tuple[BT, ...], + add_self_loops: bool, + edge_mode: str = "bidirectional", + ) -> Optional[pgl.Graph]: + if mol is None: + return None + if remove_h: + mol = Chem.RemoveHs(mol) + + N = mol.GetNumAtoms() + if N == 0: + return None + + # 1) Node Features: One-hot encoding of atomic symbols. + idxs: List[int] = [] + for atom in mol.GetAtoms(): + sym = atom.GetSymbol() + if sym not in atom_vocab: + return None # Unknown Elements: Can be replaced with an extended + # vocabulary or placeholder + idxs.append(atom_vocab[sym]) + idxs_np = np.asarray(idxs, dtype=np.int64) # [N] + x = np.eye(len(atom_vocab), dtype=np.float32)[idxs_np] # [N, num_atom_types] + + # 2) Build the edges first (construct edge_index/edge_attr) + rows, cols, etypes = [], [], [] + bt2id = {bt: i + 1 for i, bt in enumerate(bond_vocab)} # 0 for empty values + + def push(u, v, et): + rows.append(u) + cols.append(v) + etypes.append(et) + + for b in mol.GetBonds(): + u, v = b.GetBeginAtomIdx(), b.GetEndAtomIdx() + et = bt2id.get(bond_name(b.GetBondType()), 0) + if edge_mode == "directed": + push(u, v, et) + elif edge_mode == "undirected": + uu, vv = (u, v) if u < v else (v, u) + push(uu, vv, et) + elif edge_mode == "bidirectional": + push(u, v, et) + push(v, u, et) + else: + raise ValueError(f"Unknown edge_mode: {edge_mode}") + + if len(rows) == 0: + edge_index = np.empty((2, 0), dtype=np.int64) + edge_attr = np.empty((0, len(bond_vocab) + 1), dtype=np.float32) + else: + row_np = np.asarray(rows, dtype=np.int64) + col_np = np.asarray(cols, dtype=np.int64) + et_np = np.asarray(etypes, dtype=np.int64) + edge_attr = np.eye(len(bond_vocab) + 1, dtype=np.float32)[et_np] # [E, K] + # Deterministic ordering by (row, col) + order = np.argsort(row_np * max(1, N) + col_np, kind="mergesort") + row_np, col_np, edge_attr = row_np[order], col_np[order], edge_attr[order] + edge_index = np.stack([row_np, col_np], axis=0) # [2, E] + + # 3)Hydrogen removal on the graph (masking+relabeling). The Mol keep unchanged. + if remove_h: + h_id = atom_vocab.get("H", None) + if h_id is not None: + to_keep_nodes = idxs_np != h_id # keep only non-H atoms + edge_index, edge_attr = subgraph( + subset=to_keep_nodes, + edge_index=edge_index, + edge_attr=edge_attr, + relabel_nodes=True, + num_nodes=N, + ) + # Remove the H channel from node features and filter rows to kept nodes + keep_cols = np.array( + [i for i in range(len(atom_vocab)) if i != h_id], dtype=np.int64 + ) + x = x[to_keep_nodes][:, keep_cols] + else: + # If "H" is not in the vocab, we leave the graph/features as-is. + pass + + # 4) (Optional) Add self-loops based on the updated node count + N_new = int(x.shape[0]) + edges_e2 = edge_index.T.astype(np.int64) # [E,2] + if add_self_loops and N_new > 0: + self_e2 = np.stack([np.arange(N_new), np.arange(N_new)], axis=1).astype( + np.int64 + ) + self_ea = np.eye(len(bond_vocab) + 1, dtype=np.float32)[ + np.zeros((N_new,), dtype=np.int64) + ] + edges_e2 = np.concatenate([edges_e2, self_e2], axis=0) + edge_attr = np.concatenate([edge_attr, self_ea], axis=0) + + # 5) Return a PGL graph. (If running in worker processes, consider returning + # NumPy arrays and wrapping into pgl.Graph) + return pgl.Graph( + num_nodes=int(x.shape[0]), + edges=edges_e2, + node_feat={"feat": x}, + edge_feat={"feat": edge_attr}, + ) + + def __call__( + self, mols: Union[Sequence[Chem.Mol], Chem.Mol] + ) -> Union[List[pgl.Graph], pgl.Graph, None]: + if isinstance(mols, (list, tuple)): + return p_map( + MolecularGraphConverter.build_one, + mols, + [self.remove_h] * len(mols), + [self.atom_vocab] * len(mols), + [self.bond_vocab] * len(mols), + [self.add_self_loops] * len(mols), + [self.edge_mode] * len(mols), + num_cpus=self.num_cpus, + desc="Building graphs", + dynamic_ncols=True, + mininterval=0.2, + ) + else: + return MolecularGraphConverter.build_one( + mols, + self.remove_h, + self.atom_vocab, + self.bond_vocab, + self.add_self_loops, + self.edge_mode, + ) + + +def subgraph( + subset: Union[np.ndarray, List[int]], + edge_index: np.ndarray, + edge_attr: Optional[np.ndarray] = None, + relabel_nodes: bool = False, + num_nodes: Optional[int] = None, + *, + return_edge_mask: bool = False, +) -> Union[Tuple[paddle.Tensor], Tuple[paddle.Tensor]]: + """ + Build the induced subgraph for the nodes specified by `subset`, in NumPy only. + + Args: + subset: Node subset as a boolean mask of shape (N,) or as an index list/array. + edge_index: Array of shape [2, E] with directed edges (u, v), dtype int64. + edge_attr: Optional edge features of shape [E, D]; filtered alongside edges. + relabel_nodes: If True, remap kept nodes to a compact 0..K-1 range. + num_nodes: Total number of nodes N (inferred if None). + return_edge_mask: If True, also return the boolean mask over original edges. + + Returns: + (edge_index_new, edge_attr_new[, edge_mask]) + - edge_index_new: [2, E_kept] int64 + - edge_attr_new: [E_kept, D] or None + - edge_mask: [E] bool (only if return_edge_mask=True) + """ + + edge_index = np.asarray(edge_index, dtype=np.int64) + E = edge_index.shape[1] + assert edge_index.shape[0] == 2, "edge_index must be [2, E]" + + # Normalize `subset` to a boolean node mask of length N + if isinstance(subset, (list, tuple, np.ndarray)) and ( + not np.asarray(subset).dtype == bool + ): + subset = np.asarray(subset, dtype=np.int64) + if num_nodes is None: + num_nodes = int(edge_index.max()) + 1 if E > 0 else (int(subset.max()) + 1) + node_mask = np.zeros((num_nodes,), dtype=bool) + node_mask[subset] = True + else: + node_mask = np.asarray(subset, dtype=bool) + if num_nodes is None: + num_nodes = node_mask.shape[0] + + # Keep edges whose both endpoints are inside the node subset + src = edge_index[0] + dst = edge_index[1] + edge_mask = node_mask[src] & node_mask[dst] + keep_idx = np.nonzero(edge_mask)[0] + + if keep_idx.size == 0: + new_edge_index = np.empty((2, 0), dtype=np.int64) + new_edge_attr = ( + np.empty((0, edge_attr.shape[1]), dtype=edge_attr.dtype) + if edge_attr is not None + else None + ) + if return_edge_mask: + return new_edge_index, new_edge_attr, edge_mask + return new_edge_index, new_edge_attr + + # Filter edges (and attributes) by mask + new_edge_index = edge_index[:, keep_idx] + new_edge_attr = edge_attr[keep_idx] if edge_attr is not None else None + + # Optionally remap node ids to 0..K-1 over the kept nodes + if relabel_nodes: + subset_idx = np.nonzero(node_mask)[0] + mapping = -np.ones((num_nodes,), dtype=np.int64) + mapping[subset_idx] = np.arange(subset_idx.shape[0], dtype=np.int64) + new_edge_index = mapping[new_edge_index] + + if return_edge_mask: + return new_edge_index, new_edge_attr, edge_mask + return new_edge_index, new_edge_attr + + +def bond_name(bt): + # Compatible across RDKit versions + try: + return bt.name + except AttributeError: + return str(bt).split(".")[-1] diff --git a/stability_prediction/models/initializer.py b/ppmat/models/common/initializer.py similarity index 82% rename from stability_prediction/models/initializer.py rename to ppmat/models/common/initializer.py index 7a3ac204..f5afa210 100644 --- a/stability_prediction/models/initializer.py +++ b/ppmat/models/common/initializer.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -23,7 +23,9 @@ from __future__ import annotations +import functools import math +import operator import numpy as np import paddle @@ -70,14 +72,14 @@ def norm_cdf(x): if (mean < a - 2 * std) or (mean > b + 2 * std): print( - f"mean({mean}) is more than 2 std({std}) from [a, b]([{a}, {b}]) in _no_grad_trunc_normal_. " - "The distribution of values may be incorrect." + f"mean({mean}) is more than 2 std({std}) from [a, b]([{a}, {b}]) in " + "_no_grad_trunc_normal_. The distribution of values may be incorrect." ) with paddle.no_grad(): # Values are generated by using a truncated uniform distribution and # then using the inverse CDF for the normal distribution. # Get upper and lower cdf values - l = norm_cdf((a - mean) / std) + l = norm_cdf((a - mean) / std) # noqa u = norm_cdf((b - mean) / std) # Uniformly fill tensor with values from [l, u], then translate to @@ -118,12 +120,6 @@ def uniform_(tensor: paddle.Tensor, a: float, b: float) -> paddle.Tensor: Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.uniform_(param, -1, 1) """ return _no_grad_uniform_(tensor, a, b) @@ -140,12 +136,6 @@ def normal_( Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.normal_(param, 0, 1) """ return _no_grad_normal_(tensor, mean, std) @@ -162,18 +152,13 @@ def trunc_normal_( Args: tensor (paddle.Tensor): Paddle Tensor. mean (float, optional): The mean of the normal distribution. Defaults to 0.0. - std (float, optional): The standard deviation of the normal distribution. Defaults to 1.0. + std (float, optional): The standard deviation of the normal distribution. + Defaults to 1.0. a (float, optional): The minimum cutoff value. Defaults to -2.0. b (float, optional): The maximum cutoff value. Defaults to 2.0. Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.trunc_normal_(param, 0.0, 1.0) """ return _no_grad_trunc_normal_(tensor, mean, std, a, b) @@ -187,12 +172,6 @@ def constant_(tensor: paddle.Tensor, value: float = 0.0) -> paddle.Tensor: Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.constant_(param, 2) """ return _no_grad_fill_(tensor, value) @@ -205,12 +184,6 @@ def ones_(tensor: paddle.Tensor) -> paddle.Tensor: Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.ones_(param) """ return _no_grad_fill_(tensor, 1) @@ -223,12 +196,6 @@ def zeros_(tensor: paddle.Tensor) -> paddle.Tensor: Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.zeros_(param) """ return _no_grad_fill_(tensor, 0) @@ -280,11 +247,6 @@ def xavier_uniform_( Returns: paddle.Tensor: Initialized tensor. - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.xavier_uniform_(param) """ fan_in, fan_out = _calculate_fan_in_and_fan_out(tensor, reverse=reverse) std = gain * math.sqrt(2.0 / float(fan_in + fan_out)) @@ -306,11 +268,6 @@ def xavier_normal_( Returns: paddle.Tensor: Initialized tensor. - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.xavier_normal_(param) """ fan_in, fan_out = _calculate_fan_in_and_fan_out(tensor, reverse=reverse) std = gain * math.sqrt(2.0 / float(fan_in + fan_out)) @@ -379,18 +336,13 @@ def kaiming_uniform_( Defaults to 0. mode (Literal["fan_in", "fan_out"], optional): ["fan_in", "fan_out"]. Defaults to "fan_in". - nonlinearity (str, optional): Nonlinearity method name. Defaults to "leaky_relu". + nonlinearity (str, optional): Nonlinearity method name. + Defaults to "leaky_relu". reverse (bool, optional): Tensor data format order, False by default as [fout, fin, ...].. Defaults to False. Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.kaiming_uniform_(param) """ fan = _calculate_correct_fan(tensor, mode, reverse) gain = _calculate_gain(nonlinearity, a) @@ -414,17 +366,12 @@ def kaiming_normal_( Defaults to 0. mode (Literal["fan_in", "fan_out"], optional): Either 'fan_in' (default) or 'fan_out'. Defaults to "fan_in". - nonlinearity (str, optional): Nonlinearity method name. Defaults to "leaky_relu". + nonlinearity (str, optional): Nonlinearity method name. + Defaults to "leaky_relu". reverse (bool, optional): Tensor data format order. Defaults to False. Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.kaiming_normal_(param) """ fan = _calculate_correct_fan(tensor, mode, reverse) gain = _calculate_gain(nonlinearity, a) @@ -437,12 +384,6 @@ def linear_init_(module: nn.Layer) -> None: Args: module (nn.Layer): Linear Layer to be initialized. - - Examples: - >>> import paddle - >>> import ppsci - >>> layer = paddle.nn.Linear(128, 256) - >>> ppsci.utils.initializer.linear_init_(layer) """ # kaiming_uniform_(module.weight, a=math.sqrt(5)) fan_in, _ = _calculate_fan_in_and_fan_out(module.weight, reverse=True) @@ -459,12 +400,6 @@ def lstm_init_(module: nn.Layer) -> None: Args: module (nn.Layer): Linear Layer to be initialized. - - Examples: - >>> import paddle - >>> import ppsci - >>> layer = paddle.nn.Linear(128, 256) - >>> ppsci.utils.initializer.linear_init_(layer) """ # kaiming_uniform_(module.weight, a=math.sqrt(5)) fan_in, _ = _calculate_fan_in_and_fan_out(module.weight_hh_l0, reverse=True) @@ -482,12 +417,6 @@ def conv_init_(module: nn.Layer) -> None: Args: module (nn.Layer): Convolution Layer to be initialized. - - Examples: - >>> import paddle - >>> import ppsci - >>> layer = paddle.nn.Conv2D(4, 16, 2) - >>> ppsci.utils.initializer.conv_init_(layer) """ kaiming_uniform_(module.weight, a=math.sqrt(5)) if module.bias is not None: @@ -505,12 +434,6 @@ def glorot_normal_(tensor: paddle.Tensor) -> paddle.Tensor: Returns: paddle.Tensor: Initialized tensor. - - Examples: - >>> import paddle - >>> import ppsci - >>> param = paddle.empty((128, 256), "float32") - >>> param = ppsci.utils.initializer.glorot_normal_(param) """ assert ( tensor.ndim == 2 @@ -521,3 +444,49 @@ def glorot_normal_(tensor: paddle.Tensor) -> paddle.Tensor: trunc_normal_(tensor) tensor.set_value(tensor * stddev) return tensor + + +def _standardize(kernel): + """ + Makes sure that N*Var(W) = 1 and E[W] = 0 + """ + eps = 1e-06 + if len(tuple(kernel.shape)) == 3: + axis = 0, 1 + else: + axis = 1 + var, mean = tuple( + [ + paddle.var(kernel, axis=axis, unbiased=True, keepdim=True), + paddle.mean(kernel, axis=axis, keepdim=True), + ] + ) + var.nan_to_num_() + kernel = (kernel - mean) / (var + eps) ** 0.5 + return kernel + + +def he_orthogonal_init(tensor): + """ + Generate a weight matrix with variance according to He initialization. + Based on a random (semi-)orthogonal matrix neural networks + are expected to learn better when features are decorrelated + (stated by eg. "Reducing overfitting in deep networks by decorrelating + representations", + "Dropout: a simple way to prevent neural networks from overfitting", + "Exact solutions to the nonlinear dynamics of learning in deep linear + neural networks") + """ + init_Orthogonal = paddle.nn.initializer.Orthogonal() + init_Orthogonal(tensor) + if len(tuple(tensor.shape)) == 3: + fan_in = functools.reduce(operator.mul, tuple(tensor.shape)[:-1], 1) + + else: + fan_in = tuple(tensor.shape)[0] + stop_gradient = tensor.stop_gradient + with paddle.no_grad(): + tensor.data = _standardize(tensor.data) + tensor.data *= (1 / fan_in) ** 0.5 + tensor.stop_gradient = stop_gradient + return tensor diff --git a/ppmat/models/common/message_passing/inspector.py b/ppmat/models/common/message_passing/inspector.py new file mode 100644 index 00000000..72219235 --- /dev/null +++ b/ppmat/models/common/message_passing/inspector.py @@ -0,0 +1,86 @@ +import inspect +import re +from collections import OrderedDict +from typing import Any +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional +from typing import Set + +from .typing import parse_types + + +class Inspector(object): + def __init__(self, base_class: Any): + self.base_class: Any = base_class + self.params: Dict[str, Dict[str, Any]] = {} + + def inspect(self, func: Callable, pop_first: bool = False) -> Dict[str, Any]: + params = inspect.signature(func).parameters + params = OrderedDict(params) + if pop_first: + params.popitem(last=False) + self.params[func.__name__] = params + + def keys(self, func_names: Optional[List[str]] = None) -> Set[str]: + keys = [] + for func in func_names or list(self.params.keys()): + keys += self.params[func].keys() + return set(keys) + + def __implements__(self, cls, func_name: str) -> bool: + if cls.__name__ == "MessagePassing": + return False + if func_name in cls.__dict__.keys(): + return True + return any(self.__implements__(c, func_name) for c in cls.__bases__) + + def implements(self, func_name: str) -> bool: + return self.__implements__(self.base_class.__class__, func_name) + + def types(self, func_names: Optional[List[str]] = None) -> Dict[str, str]: + out: Dict[str, str] = {} + for func_name in func_names or list(self.params.keys()): + func = getattr(self.base_class, func_name) + arg_types = parse_types(func)[0][0] + for key in self.params[func_name].keys(): + if key in out and out[key] != arg_types[key]: + raise ValueError( + f"Found inconsistent types for argument {key}. Expected type" + f" {out[key]} but found type {arg_types[key]}." + ) + out[key] = arg_types[key] + return out + + def distribute(self, func_name, kwargs: Dict[str, Any]): + out = {} + for key, param in self.params[func_name].items(): + data = kwargs.get(key, inspect.Parameter.empty) + if data is inspect.Parameter.empty: + if param.default is inspect.Parameter.empty: + raise TypeError(f"Required parameter {key} is empty.") + data = param.default + out[key] = data + return out + + +def func_header_repr(func: Callable, keep_annotation: bool = True) -> str: + source = inspect.getsource(func) + signature = inspect.signature(func) + if keep_annotation: + return "".join(re.split("(\\).*?:.*?\\n)", source, maxsplit=1)[:2]).strip() + params_repr = ["self"] + for param in signature.parameters.values(): + params_repr.append(param.name) + if param.default is not inspect.Parameter.empty: + params_repr[-1] += f"={param.default}" + return f"def {func.__name__}({', '.join(params_repr)}):" + + +def func_body_repr(func: Callable, keep_annotation: bool = True) -> str: + source = inspect.getsource(func) + body_repr = re.split("\\).*?:.*?\\n", source, maxsplit=1)[1] + if not keep_annotation: + body_repr = re.sub("\\s*# type:.*\\n", "", body_repr) + return body_repr diff --git a/ppmat/models/common/message_passing/message_passing.py b/ppmat/models/common/message_passing/message_passing.py new file mode 100644 index 00000000..f9b3b07d --- /dev/null +++ b/ppmat/models/common/message_passing/message_passing.py @@ -0,0 +1,401 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from the following repository: +# https://github.com/rusty1s/pytorch_geometric + +from collections import OrderedDict +from inspect import Parameter +from typing import List +from typing import Optional +from typing import Set +from typing import Tuple + +import paddle + +from ppmat.utils import paddle_aux # noqa +from ppmat.utils.scatter import scatter + +from .inspector import Inspector + +Adj = paddle.Tensor +Size = Optional[Tuple[int, int]] + + +def expand_left(src: paddle.Tensor, dim: int, dims: int) -> paddle.Tensor: + for _ in range(dims + dim if dim < 0 else dim): + src = src.unsqueeze(axis=0) + return src + + +class MessagePassing(paddle.nn.Layer): + """Base class for creating message passing layers of the form + + .. math:: + \\mathbf{x}_i^{\\prime} = \\gamma_{\\mathbf{\\Theta}} \\left( \\mathbf{x}_i, + \\square_{j \\in \\mathcal{N}(i)} \\, \\phi_{\\mathbf{\\Theta}} + \\left(\\mathbf{x}_i, \\mathbf{x}_j,\\mathbf{e}_{j,i}\\right) \\right), + + where :math:`\\square` denotes a differentiable, permutation invariant + function, *e.g.*, sum, mean, min, max or mul, and + :math:`\\gamma_{\\mathbf{\\Theta}}` and :math:`\\phi_{\\mathbf{\\Theta}}` denote + differentiable functions such as MLPs. + See `here `__ for the accompanying tutorial. + + Args: + aggr (string, optional): The aggregation scheme to use + (:obj:`"add"`, :obj:`"mean"`, :obj:`"min"`, :obj:`"max"`, + :obj:`"mul"` or :obj:`None`). (default: :obj:`"add"`) + flow (string, optional): The flow direction of message passing + (:obj:`"source_to_target"` or :obj:`"target_to_source"`). + (default: :obj:`"source_to_target"`) + node_dim (int, optional): The axis along which to propagate. + (default: :obj:`-2`) + decomposed_layers (int, optional): The number of feature decomposition + layers, as introduced in the `"Optimizing Memory Efficiency of + Graph Neural Networks on Edge Computing Platforms" + `_ paper. + Feature decomposition reduces the peak memory usage by slicing + the feature dimensions into separated feature decomposition layers + during GNN aggregation. + This method can accelerate GNN execution on CPU-based platforms + (*e.g.*, 2-3x speedup on the + :class:`~torch_geometric.datasets.Reddit` dataset) for common GNN + models such as :class:`~torch_geometric.nn.models.GCN`, + :class:`~torch_geometric.nn.models.GraphSAGE`, + :class:`~torch_geometric.nn.models.GIN`, etc. + However, this method is not applicable to all GNN operators + available, in particular for operators in which message computation + can not easily be decomposed, *e.g.* in attention-based GNNs. + The selection of the optimal value of :obj:`decomposed_layers` + depends both on the specific graph dataset and available hardware + resources. + A value of :obj:`2` is suitable in most cases. + Although the peak memory usage is directly associated with the + granularity of feature decomposition, the same is not necessarily + true for execution speedups. (default: :obj:`1`) + """ + + special_args: Set[str] = { + "edge_index", + "adj_t", + "edge_index_i", + "edge_index_j", + "size", + "size_i", + "size_j", + "ptr", + "index", + "dim_size", + } + + def __init__( + self, + aggr: Optional[str] = "add", + flow: str = "source_to_target", + node_dim: int = -2, + decomposed_layers: int = 1, + ): + super().__init__() + self.aggr = aggr + assert self.aggr in ["add", "sum", "mean", "min", "max", "mul", None] + self.flow = flow + assert self.flow in ["source_to_target", "target_to_source"] + self.node_dim = node_dim + self.decomposed_layers = decomposed_layers + self.inspector = Inspector(self) + self.inspector.inspect(self.message) + self.inspector.inspect(self.aggregate, pop_first=True) + self.inspector.inspect(self.message_and_aggregate, pop_first=True) + self.inspector.inspect(self.update, pop_first=True) + self.inspector.inspect(self.edge_update) + self.__user_args__ = self.inspector.keys( + ["message", "aggregate", "update"] + ).difference(self.special_args) + self.__fused_user_args__ = self.inspector.keys( + ["message_and_aggregate", "update"] + ).difference(self.special_args) + self.__edge_user_args__ = self.inspector.keys(["edge_update"]).difference( + self.special_args + ) + self.fuse = self.inspector.implements("message_and_aggregate") + self._explain = False + self._edge_mask = None + self._loop_mask = None + self._apply_sigmoid = True + self._propagate_forward_pre_hooks = OrderedDict() + self._propagate_forward_hooks = OrderedDict() + self._message_forward_pre_hooks = OrderedDict() + self._message_forward_hooks = OrderedDict() + self._aggregate_forward_pre_hooks = OrderedDict() + self._aggregate_forward_hooks = OrderedDict() + self._message_and_aggregate_forward_pre_hooks = OrderedDict() + self._message_and_aggregate_forward_hooks = OrderedDict() + self._edge_update_forward_pre_hooks = OrderedDict() + self._edge_update_forward_hooks = OrderedDict() + + def __check_input__(self, edge_index, size): + the_size: List[Optional[int]] = [None, None] + if isinstance(edge_index, paddle.Tensor): + assert edge_index.dtype == paddle.int64 + assert edge_index.dim() == 2 + assert edge_index.shape[0] == 2 + if size is not None: + the_size[0] = size[0] + the_size[1] = size[1] + return the_size + raise ValueError("`MessagePassing.propagate` only supports `paddle.Tensor`.") + + def __set_size__(self, size: List[Optional[int]], dim: int, src: paddle.Tensor): + the_size = size[dim] + if the_size is None: + size[dim] = src.shape[self.node_dim] + elif the_size != src.shape[self.node_dim]: + raise ValueError( + f"Encountered tensor with size {src.shape[self.node_dim]} in " + f"dimension {self.node_dim}, but expected size {the_size}." + ) + + def __lift__(self, src, edge_index, dim): + if isinstance(edge_index, paddle.Tensor): + index = edge_index[dim] + if index.is_contiguous(): + index = index.contiguous() + + return src.index_select(axis=self.node_dim, index=index) + raise ValueError + + def __collect__(self, args, edge_index, size, kwargs): + i, j = (1, 0) if self.flow == "source_to_target" else (0, 1) + out = {} + for arg in args: + if arg[-2:] not in ["_i", "_j"]: + out[arg] = kwargs.get(arg, Parameter.empty) + else: + dim = j if arg[-2:] == "_j" else i + data = kwargs.get(arg[:-2], Parameter.empty) + if isinstance(data, (tuple, list)): + assert len(data) == 2 + if isinstance(data[1 - dim], paddle.Tensor): + self.__set_size__(size, 1 - dim, data[1 - dim]) + data = data[dim] + if isinstance(data, paddle.Tensor): + self.__set_size__(size, dim, data) + data = self.__lift__(data, edge_index, dim) + out[arg] = data + if isinstance(edge_index, paddle.Tensor): + out["adj_t"] = None + out["edge_index"] = edge_index + out["edge_index_i"] = edge_index[i] + out["edge_index_j"] = edge_index[j] + out["ptr"] = None + out["index"] = out["edge_index_i"] + out["size"] = size + out["size_i"] = size[1] if size[1] is not None else size[0] + out["size_j"] = size[0] if size[0] is not None else size[1] + out["dim_size"] = out["size_i"] + return out + + def propagate(self, edge_index: Adj, size: Size = None, **kwargs): + """The initial call to start propagating messages. + + Args: + edge_index (Tensor or SparseTensor): A :obj:`torch.LongTensor` or a + :obj:`torch_sparse.SparseTensor` that defines the underlying + graph connectivity/message passing flow. + :obj:`edge_index` holds the indices of a general (sparse) + assignment matrix of shape :obj:`[N, M]`. + If :obj:`edge_index` is of type :obj:`torch.LongTensor`, its + shape must be defined as :obj:`[2, num_messages]`, where + messages from nodes in :obj:`edge_index[0]` are sent to + nodes in :obj:`edge_index[1]` + (in case :obj:`flow="source_to_target"`). + If :obj:`edge_index` is of type + :obj:`torch_sparse.SparseTensor`, its sparse indices + :obj:`(row, col)` should relate to :obj:`row = edge_index[1]` + and :obj:`col = edge_index[0]`. + The major difference between both formats is that we need to + input the *transposed* sparse adjacency matrix into + :func:`propagate`. + size (tuple, optional): The size :obj:`(N, M)` of the assignment + matrix in case :obj:`edge_index` is a :obj:`LongTensor`. + If set to :obj:`None`, the size will be automatically inferred + and assumed to be quadratic. + This argument is ignored in case :obj:`edge_index` is a + :obj:`torch_sparse.SparseTensor`. (default: :obj:`None`) + **kwargs: Any additional data which is needed to construct and + aggregate messages, and to update node embeddings. + """ + decomposed_layers = 1 if self._explain else self.decomposed_layers + for hook in self._propagate_forward_pre_hooks.values(): + res = hook(self, (edge_index, size, kwargs)) + if res is not None: + edge_index, size, kwargs = res + size = self.__check_input__(edge_index, size) + if isinstance(edge_index, paddle.Tensor) or not self.fuse: + if decomposed_layers > 1: + user_args = self.__user_args__ + decomp_args = {a[:-2] for a in user_args if a[-2:] == "_j"} + decomp_kwargs = { + a: kwargs[a].chunk(chunks=decomposed_layers, axis=-1) + for a in decomp_args + } + decomp_out = [] + for i in range(decomposed_layers): + if decomposed_layers > 1: + for arg in decomp_args: + kwargs[arg] = decomp_kwargs[arg][i] + coll_dict = self.__collect__( + self.__user_args__, edge_index, size, kwargs + ) + msg_kwargs = self.inspector.distribute("message", coll_dict) + for hook in self._message_forward_pre_hooks.values(): + res = hook(self, (msg_kwargs,)) + if res is not None: + msg_kwargs = res[0] if isinstance(res, tuple) else res + out = self.message(**msg_kwargs) + for hook in self._message_forward_hooks.values(): + res = hook(self, (msg_kwargs,), out) + if res is not None: + out = res + if self._explain: + edge_mask = self._edge_mask + if self._apply_sigmoid: + edge_mask = edge_mask.sigmoid() + if out.shape[self.node_dim] != edge_mask.shape[0]: + edge_mask = edge_mask[self._loop_mask] + loop = paddle.ones(shape=size[0], dtype=edge_mask.dtype) + edge_mask = paddle.concat(x=[edge_mask, loop], axis=0) + assert out.shape[self.node_dim] == edge_mask.shape[0] + out = out * edge_mask.view([-1] + [1] * (out.dim() - 1)) + aggr_kwargs = self.inspector.distribute("aggregate", coll_dict) + for hook in self._aggregate_forward_pre_hooks.values(): + res = hook(self, (aggr_kwargs,)) + if res is not None: + aggr_kwargs = res[0] if isinstance(res, tuple) else res + out = self.aggregate(out, **aggr_kwargs) + for hook in self._aggregate_forward_hooks.values(): + res = hook(self, (aggr_kwargs,), out) + if res is not None: + out = res + update_kwargs = self.inspector.distribute("update", coll_dict) + out = self.update(out, **update_kwargs) + if decomposed_layers > 1: + decomp_out.append(out) + if decomposed_layers > 1: + out = paddle.concat(x=decomp_out, axis=-1) + for hook in self._propagate_forward_hooks.values(): + res = hook(self, (edge_index, size, kwargs), out) + if res is not None: + out = res + return out + + def edge_updater(self, edge_index: Adj, **kwargs): + """The initial call to compute or update features for each edge in the + graph. + + Args: + edge_index (Tensor or SparseTensor): A :obj:`torch.LongTensor` or a + :obj:`torch_sparse.SparseTensor` that defines the underlying + graph connectivity/message passing flow. + See :meth:`propagate` for more information. + **kwargs: Any additional data which is needed to compute or update + features for each edge in the graph. + """ + for hook in self._edge_update_forward_pre_hooks.values(): + res = hook(self, (edge_index, kwargs)) + if res is not None: + edge_index, kwargs = res + size = self.__check_input__(edge_index, size=None) + coll_dict = self.__collect__(self.__edge_user_args__, edge_index, size, kwargs) + edge_kwargs = self.inspector.distribute("edge_update", coll_dict) + out = self.edge_update(**edge_kwargs) + for hook in self._edge_update_forward_hooks.values(): + res = hook(self, (edge_index, kwargs), out) + if res is not None: + out = res + return out + + def message(self, x_j: paddle.Tensor) -> paddle.Tensor: + """Constructs messages from node :math:`j` to node :math:`i` + in analogy to :math:`\\phi_{\\mathbf{\\Theta}}` for each edge in + :obj:`edge_index`. + This function can take any argument as input which was initially + passed to :meth:`propagate`. + Furthermore, tensors passed to :meth:`propagate` can be mapped to the + respective nodes :math:`i` and :math:`j` by appending :obj:`_i` or + :obj:`_j` to the variable name, *.e.g.* :obj:`x_i` and :obj:`x_j`. + """ + return x_j + + def aggregate( + self, + inputs: paddle.Tensor, + index: paddle.Tensor, + ptr: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, + ) -> paddle.Tensor: + """Aggregates messages from neighbors as + :math:`\\square_{j \\in \\mathcal{N}(i)}`. + + Takes in the output of message computation as first argument and any + argument which was initially passed to :meth:`propagate`. + + By default, this function will delegate its call to scatter functions + that support "add", "mean", "min", "max" and "mul" operations as + specified in :meth:`__init__` by the :obj:`aggr` argument. + """ + if ptr is not None: + # ptr = expand_left(ptr, dim=self.node_dim, dims=inputs.dim()) + # return segment_csr(inputs, ptr, reduce=self.aggr) + raise NotImplementedError() + else: + return scatter( + inputs, index, dim=self.node_dim, dim_size=dim_size, reduce=self.aggr + ) + + def message_and_aggregate(self, adj_t) -> paddle.Tensor: + """Fuses computations of :func:`message` and :func:`aggregate` into a + single function. + If applicable, this saves both time and memory since messages do not + explicitly need to be materialized. + This function will only gets called in case it is implemented and + propagation takes place based on a :obj:`torch_sparse.SparseTensor`. + """ + raise NotImplementedError + + def update(self, inputs: paddle.Tensor) -> paddle.Tensor: + """Updates node embeddings in analogy to + :math:`\\gamma_{\\mathbf{\\Theta}}` for each node + :math:`i \\in \\mathcal{V}`. + Takes in the output of aggregation as first argument and any argument + which was initially passed to :meth:`propagate`. + """ + return inputs + + def edge_update(self) -> paddle.Tensor: + """Computes or updates features for each edge in the graph. + This function can take any argument as input which was initially passed + to :meth:`edge_updater`. + Furthermore, tensors passed to :meth:`edge_updater` can be mapped to + the respective nodes :math:`i` and :math:`j` by appending :obj:`_i` or + :obj:`_j` to the variable name, *.e.g.* :obj:`x_i` and :obj:`x_j`. + """ + raise NotImplementedError + + def __repr__(self) -> str: + if hasattr(self, "in_channels") and hasattr(self, "out_channels"): + return f"{self.__class__.__name__}({self.in_channels}, {self.out_channels})" + return f"{self.__class__.__name__}()" diff --git a/ppmat/models/common/message_passing/typing.py b/ppmat/models/common/message_passing/typing.py new file mode 100644 index 00000000..4f9e281c --- /dev/null +++ b/ppmat/models/common/message_passing/typing.py @@ -0,0 +1,103 @@ +import inspect +import re +from collections import OrderedDict +from itertools import product +from typing import Callable +from typing import Dict +from typing import List +from typing import Tuple + +import pyparsing as pp + + +def split_types_repr(types_repr: str) -> List[str]: + out = [] + i = depth = 0 + for j, char in enumerate(types_repr): + if char == "[": + depth += 1 + elif char == "]": + depth -= 1 + elif char == "," and depth == 0: + out.append(types_repr[i:j].strip()) + i = j + 1 + out.append(types_repr[i:].strip()) + return out + + +def sanitize(type_repr: str): + type_repr = re.sub("", "\\1", type_repr) + type_repr = type_repr.replace("typing.", "") + type_repr = type_repr.replace("torch_sparse.tensor.", "") + type_repr = type_repr.replace("Adj", "Union[Tensor, SparseTensor]") + sexp = pp.nestedExpr(opener="[", closer="]") + tree = sexp.parseString(f"[{type_repr.replace(',', ' ')}]").asList()[0] + + def union_to_optional_(tree): + for i in range(len(tree)): + e, n = tree[i], tree[i + 1] if i + 1 < len(tree) else [] + if e == "Union" and n[-1] == "NoneType": + tree[i] = "Optional" + tree[i + 1] = tree[i + 1][:-1] + elif e == "Union" and "NoneType" in n: + idx = n.index("NoneType") + n[idx] = [n[idx - 1]] + n[idx - 1] = "Optional" + elif isinstance(e, list): + tree[i] = union_to_optional_(e) + return tree + + tree = union_to_optional_(tree) + type_repr = re.sub("\\'|\\\"", "", str(tree)[1:-1]).replace(", [", "[") + return type_repr + + +def param_type_repr(param) -> str: + if param.annotation is inspect.Parameter.empty: + return "torch.Tensor" + return sanitize(re.split(":|=".strip(), str(param))[1]) + + +def return_type_repr(signature) -> str: + return_type = signature.return_annotation + if return_type is inspect.Parameter.empty: + return "torch.Tensor" + elif str(return_type)[:6] != " List[Tuple[Dict[str, str], str]]: + source = inspect.getsource(func) + signature = inspect.signature(func) + iterator = re.finditer("#\\s*type:\\s*\\((.*)\\)\\s*->\\s*(.*)\\s*\\n", source) + matches = list(iterator) + if len(matches) > 0: + out = [] + args = list(signature.parameters.keys()) + for match in matches: + arg_types_repr, return_type = match.groups() + arg_types = split_types_repr(arg_types_repr) + arg_types = OrderedDict((k, v) for k, v in zip(args, arg_types)) + return_type = return_type.split("#")[0].strip() + out.append((arg_types, return_type)) + return out + else: + ps = signature.parameters + arg_types = OrderedDict((k, param_type_repr(v)) for k, v in ps.items()) + return [(arg_types, return_type_repr(signature))] + + +def resolve_types( + arg_types: Dict[str, str], return_type_repr: str +) -> List[Tuple[List[str], str]]: + out = [] + for type_repr in arg_types.values(): + if type_repr[:5] == "Union": + out.append(split_types_repr(type_repr[6:-1])) + else: + out.append([type_repr]) + return [(x, return_type_repr) for x in product(*out)] diff --git a/ppmat/models/common/orbital.py b/ppmat/models/common/orbital.py new file mode 100644 index 00000000..75870192 --- /dev/null +++ b/ppmat/models/common/orbital.py @@ -0,0 +1,161 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import paddle + +from ppmat.models.common.e3nn import o3 + +from ppmat.utils.paddle_aux import view + + +class GaussianOrbital(paddle.nn.Layer): + """ + Gaussian-type orbital + + .. math:: + \\psi_{n\\ell m}(\\mathbf{r})=\\sqrt{\\frac{2(2a_n)^{\\ell+3/2}}{\\Gamma(\\ell+3/2)}} + \\exp(-a_n r^2) r^\\ell Y_{\\ell}^m(\\hat{\\mathbf{r}}) + + """ + + def __init__(self, gauss_start, gauss_end, num_gauss, lmax=7): + super(GaussianOrbital, self).__init__() + self.gauss_start = gauss_start + self.gauss_end = gauss_end + self.num_gauss = num_gauss + self.lmax = lmax + self.lc2lcm = BroadcastGTOTensor(lmax, num_gauss, src="lc", dst="lcm") + self.m2lcm = BroadcastGTOTensor(lmax, num_gauss, src="m", dst="lcm") + self.gauss: paddle.Tensor + self.lognorm: paddle.Tensor + self.register_buffer( + name="gauss", + tensor=paddle.linspace(start=gauss_start, stop=gauss_end, num=num_gauss), + ) + self.register_buffer(name="lognorm", tensor=self._generate_lognorm()) + + def _generate_lognorm(self): + power = (paddle.arange(end=self.lmax + 1) + 1.5).unsqueeze(axis=-1) + numerator = power * paddle.log(x=2 * self.gauss).unsqueeze(axis=0) + math.log(2) + denominator = paddle.lgamma(x=power) + lognorm = (numerator - denominator) / 2 + return lognorm.view(-1) + + def forward(self, vec): + """ + Evaluate the basis functions + :param vec: un-normalized vectors of (..., 3) + :return: basis values of (..., (l+1)^2 * c) + """ + + r = vec.norm(axis=-1) + 1e-08 + spherical = o3.spherical_harmonics( + list(range(self.lmax + 1)), + vec / r[..., None], + normalize=False, + normalization="integral", + ) + r = r.unsqueeze(axis=-1) + lognorm = self.lognorm * paddle.ones_like(x=r) + exponent = -self.gauss * (r * r) + poly = paddle.arange(dtype="float32", end=self.lmax + 1) * paddle.log(x=r) + log = exponent.unsqueeze(axis=-2) + poly.unsqueeze(axis=-1) + log_flat = log.view(*tuple(log.shape)[:-2], -1) + radial = paddle.exp(x=paddle.add(log_flat, lognorm)) + # Use explicit elementwise multiplication to avoid potential issues + # with Python's `*` dispatch on Tensor-like objects. + return paddle.multiply(self.lc2lcm(radial), self.m2lcm(spherical)) + + +class BroadcastGTOTensor(paddle.nn.Layer): + """ + Broadcast between spherical tensors of the Gaussian Type Orbitals (GTOs): + + .. math:: + \\{a_{clm}, 1\\le c\\le c_{max}, 0\\le\\ell\\le\\ell_{max}, -\\ell\\le m\\le\\ell\\} + + For efficiency reason, the feature tensor is indexed by l, c, m. + For example, for lmax = 3, cmax = 2, we have a tensor of 1s2s 1p2p 1d2d 1f2f. + Currently, we support the following broadcasting: + lc -> lcm; + m -> lcm. + """ + + def __init__(self, lmax, cmax, src="lc", dst="lcm"): + super(BroadcastGTOTensor, self).__init__() + assert src in ["lc", "m"] + assert dst in ["lcm"] + self.src = src + self.dst = dst + self.lmax = lmax + self.cmax = cmax + if src == "lc": + self.src_dim = (lmax + 1) * cmax + else: + self.src_dim = (lmax + 1) ** 2 + self.dst_dim = (lmax + 1) ** 2 * cmax + if src == "lc": + indices = self._generate_lc2lcm_indices() + else: + indices = self._generate_m2lcm_indices() + self.register_buffer(name="indices", tensor=indices) + + def _generate_lc2lcm_indices(self): + """ + lc -> lcm + .. math:: + 1s2s 1p2p → 1s2s 1p_x1p_y1p_z2p_x2p_y2p_z + [0, 1, 2, 2, 2, 3, 3, 3] + + :return: (lmax+1)^2 * cmax + """ + indices = [ + (l * self.cmax + c) + for l in range(self.lmax + 1) + for c in range(self.cmax) + for _ in range(2 * l + 1) + ] + return paddle.to_tensor(data=indices, dtype="int64") + + def _generate_m2lcm_indices(self): + """ + m -> lcm + .. math:: + s p_x p_y p_z → 1s2s 1p_x1p_y1p_z2p_x2p_y2p_z + [0, 0, 1, 2, 3, 1, 2, 3] + + :return: (lmax+1)^2 * cmax + """ + indices = [ + (l * l + m) + for l in range(self.lmax + 1) + for _ in range(self.cmax) + for m in range(2 * l + 1) + ] + return paddle.to_tensor(data=indices, dtype="int64") + + def forward(self, x): + """ + Apply broadcasting to x. + :param x: (..., src_dim) + :return: (..., dst_dim) + """ + assert ( + x.shape[-1] == self.src_dim + ), f"Input dimension mismatch! Should be {self.src_dim}, but got {x.shape[-1]} instead!" + if self.src == self.dst: + return x + return x[..., self.indices] diff --git a/ppmat/models/common/radial_basis.py b/ppmat/models/common/radial_basis.py new file mode 100644 index 00000000..96c0be86 --- /dev/null +++ b/ppmat/models/common/radial_basis.py @@ -0,0 +1,219 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/radial_basis.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" + +import math + +import numpy as np +import paddle +from paddle import Tensor +from scipy.special import binom + + +class GaussianSmearing(paddle.nn.Layer): + def __init__( + self, + start: float = 0.0, + stop: float = 5.0, + num_gaussians: int = 50, + ): + super(GaussianSmearing, self).__init__() + offset = paddle.linspace(start, stop, num_gaussians) + self.coeff = -0.5 / (offset[1] - offset[0]).item() ** 2 + self.register_buffer("offset", offset) + + def forward(self, dist: Tensor) -> Tensor: + dist = dist.view(-1, 1) - self.offset.view(1, -1) + return paddle.exp(self.coeff * paddle.pow(dist, 2)) + + +class PolynomialEnvelope(paddle.nn.Layer): + """ + Polynomial envelope function that ensures a smooth cutoff. + + Parameters + ---------- + exponent: int + Exponent of the envelope function. + """ + + def __init__(self, exponent): + super().__init__() + assert exponent > 0 + self.p = exponent + self.a = -(self.p + 1) * (self.p + 2) / 2 + self.b = self.p * (self.p + 2) + self.c = -self.p * (self.p + 1) / 2 + + def forward(self, d_scaled): + env_val = ( + 1 + + self.a * d_scaled**self.p + + self.b * d_scaled ** (self.p + 1) + + self.c * d_scaled ** (self.p + 2) + ) + return paddle.where( + condition=d_scaled < 1, x=env_val, y=paddle.zeros_like(x=d_scaled) + ) + + +class ExponentialEnvelope(paddle.nn.Layer): + """ + Exponential envelope function that ensures a smooth cutoff, + as proposed in Unke, Chmiela, Gastegger, Schütt, Sauceda, Müller 2021. + SpookyNet: Learning Force Fields with Electronic Degrees of Freedom + and Nonlocal Effects + """ + + def __init__(self): + super().__init__() + + def forward(self, d_scaled): + env_val = paddle.exp(x=-(d_scaled**2) / ((1 - d_scaled) * (1 + d_scaled))) + return paddle.where( + condition=d_scaled < 1, x=env_val, y=paddle.zeros_like(x=d_scaled) + ) + + +class SphericalBesselBasis(paddle.nn.Layer): + """ + 1D spherical Bessel basis + + Parameters + ---------- + num_radial: int + Controls maximum frequency. + cutoff: float + Cutoff distance in Angstrom. + """ + + def __init__(self, num_radial: int, cutoff: float): + super().__init__() + self.norm_const = math.sqrt(2 / cutoff**3) + self.frequencies = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor( + data=np.pi * np.arange(1, num_radial + 1, dtype=np.float32) + ), + trainable=True, + ) + + def forward(self, d_scaled): + return ( + self.norm_const + / d_scaled[:, None] + * paddle.sin(x=self.frequencies * d_scaled[:, None]) + ) + + +class BernsteinBasis(paddle.nn.Layer): + """ + Bernstein polynomial basis, + as proposed in Unke, Chmiela, Gastegger, Schütt, Sauceda, Müller 2021. + SpookyNet: Learning Force Fields with Electronic Degrees of Freedom + and Nonlocal Effects + + Parameters + ---------- + num_radial: int + Controls maximum frequency. + pregamma_initial: float + Initial value of exponential coefficient gamma. + Default: gamma = 0.5 * a_0**-1 = 0.94486, + inverse softplus -> pregamma = log e**gamma - 1 = 0.45264 + """ + + def __init__(self, num_radial: int, pregamma_initial: float = 0.45264): + super().__init__() + prefactor = binom(num_radial - 1, np.arange(num_radial)) + self.register_buffer( + name="prefactor", + tensor=paddle.to_tensor(data=prefactor, dtype="float32"), + persistable=False, + ) + self.pregamma = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor(data=pregamma_initial, dtype="float32"), + trainable=True, + ) + self.softplus = paddle.nn.Softplus() + exp1 = paddle.arange(end=num_radial) + self.register_buffer(name="exp1", tensor=exp1[None, :], persistable=False) + exp2 = num_radial - 1 - exp1 + self.register_buffer(name="exp2", tensor=exp2[None, :], persistable=False) + + def forward(self, d_scaled): + gamma = self.softplus(self.pregamma) + exp_d = paddle.exp(x=-gamma * d_scaled)[:, None] + return self.prefactor * exp_d**self.exp1 * (1 - exp_d) ** self.exp2 + + +class RadialBasis(paddle.nn.Layer): + """ + + Parameters + ---------- + num_radial: int + Controls maximum frequency. + cutoff: float + Cutoff distance in Angstrom. + rbf: dict = {"name": "gaussian"} + Basis function and its hyperparameters. + envelope: dict = {"name": "polynomial", "exponent": 5} + Envelope function and its hyperparameters. + """ + + def __init__( + self, + num_radial: int, + cutoff: float, + rbf: dict = {"name": "gaussian"}, + envelope: dict = {"name": "polynomial", "exponent": 5}, + ): + super().__init__() + self.num_radial = num_radial + self.inv_cutoff = 1 / cutoff + + env_name = envelope["name"].lower() + env_hparams = envelope.copy() + del env_hparams["name"] + if env_name == "polynomial": + self.envelope = PolynomialEnvelope(**env_hparams) + elif env_name == "exponential": + self.envelope = ExponentialEnvelope() + else: + raise ValueError(f"Unknown envelope function '{env_name}'.") + rbf_name = rbf["name"].lower() + rbf_hparams = rbf.copy() + del rbf_hparams["name"] + if rbf_name == "gaussian": + self.rbf = GaussianSmearing( + start=0, stop=1, num_gaussians=num_radial, **rbf_hparams + ) + elif rbf_name == "spherical_bessel": + self.rbf = SphericalBesselBasis(num_radial=num_radial, cutoff=cutoff) + elif rbf_name == "bernstein": + self.rbf = BernsteinBasis(num_radial=num_radial, **rbf_hparams) + else: + raise ValueError(f"Unknown radial basis function '{rbf_name}'.") + + def forward(self, d): + d_scaled = d * self.inv_cutoff + env = self.envelope(d_scaled) + return env[:, None] * self.rbf(d_scaled) diff --git a/ppmat/models/common/sinusoidal_embedding.py b/ppmat/models/common/sinusoidal_embedding.py new file mode 100644 index 00000000..593ef6ca --- /dev/null +++ b/ppmat/models/common/sinusoidal_embedding.py @@ -0,0 +1,29 @@ +import math + +import numpy as np +import paddle + + +def uniform_sample_t(batch_size, timesteps): + times = np.random.choice(np.arange(1, timesteps + 1), batch_size) + return paddle.to_tensor(times) + + +class SinusoidalEmbeddings(paddle.nn.Layer): + def __init__(self, dim): + super().__init__() + self.dim = dim + half_dim = dim // 2 + embeddings = math.log(10000) / (half_dim - 1) + self.embeddings = paddle.exp(x=paddle.arange(end=half_dim) * -embeddings) + + def forward(self, origin): + origin = origin.astype(paddle.get_default_dtype()) + embeddings = origin[:, None] * self.embeddings[None, :] + embeddings = paddle.concat(x=(embeddings.sin(), embeddings.cos()), axis=-1) + return embeddings + + +class SinusoidalPosEmbeddings(SinusoidalEmbeddings): + def __init__(dim): + super().__init__(dim) diff --git a/ppmat/models/common/spherical_basis.py b/ppmat/models/common/spherical_basis.py new file mode 100644 index 00000000..2c7cf506 --- /dev/null +++ b/ppmat/models/common/spherical_basis.py @@ -0,0 +1,96 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Adapted from https://github.com/FAIR-Chem/fairchem/blob/main/src/fairchem/core/models/gemnet/layers/spherical_basis.py. +Copyright (c) Facebook, Inc. and its affiliates. + +This source code is licensed under the MIT license found at https://github.com/FAIR-Chem/fairchem/blob/main/LICENSE.md. + +""" + + +import paddle +import sympy as sym + +from ppmat.models.common.basis_utils import real_sph_harm +from ppmat.models.common.radial_basis import GaussianSmearing +from ppmat.models.common.radial_basis import RadialBasis +from ppmat.utils import paddle_aux # noqa + + +class CircularBasisLayer(paddle.nn.Layer): + """ + 2D Fourier Bessel Basis + + Parameters + ---------- + num_spherical: int + Controls maximum frequency. + radial_basis: RadialBasis + Radial basis functions + cbf: dict + Name and hyperparameters of the cosine basis function + efficient: bool + Whether to use the "efficient" summation order + """ + + def __init__( + self, + num_spherical: int, + radial_basis: RadialBasis, + cbf: dict, + efficient: bool = False, + ): + super().__init__() + self.radial_basis = radial_basis + self.efficient = efficient + cbf_name = cbf["name"].lower() + cbf_hparams = cbf.copy() + del cbf_hparams["name"] + if cbf_name == "gaussian": + self.cosφ_basis = GaussianSmearing( + start=-1, stop=1, num_gaussians=num_spherical, **cbf_hparams + ) + elif cbf_name == "spherical_harmonics": + Y_lm = real_sph_harm(num_spherical, use_theta=False, zero_m_only=True) + sph_funcs = [] + z = sym.symbols("z") + modules = {"sin": paddle.sin, "cos": paddle.cos, "sqrt": paddle.sqrt} + m_order = 0 + for l_degree in range(len(Y_lm)): + if l_degree == 0: + first_sph = sym.lambdify([z], Y_lm[l_degree][m_order], modules) + sph_funcs.append(lambda z: paddle.zeros_like(x=z) + first_sph(z)) + else: + sph_funcs.append( + sym.lambdify([z], Y_lm[l_degree][m_order], modules) + ) + self.cosφ_basis = lambda cosφ: paddle.stack( + x=[f(cosφ) for f in sph_funcs], axis=1 + ) + else: + raise ValueError(f"Unknown cosine basis function '{cbf_name}'.") + + def forward(self, D_ca, cosφ_cab, id3_ca): + rbf = self.radial_basis(D_ca) + cbf = self.cosφ_basis(cosφ_cab) + if not self.efficient: + rbf = rbf[id3_ca] + out = (rbf[:, None, :] * cbf[:, :, None]).view( + -1, tuple(rbf.shape)[-1] * tuple(cbf.shape)[-1] + ) + return (out,) + else: + return rbf[None, :, :], cbf diff --git a/ppmat/models/common/time_embedding.py b/ppmat/models/common/time_embedding.py new file mode 100644 index 00000000..dbf605be --- /dev/null +++ b/ppmat/models/common/time_embedding.py @@ -0,0 +1,72 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import math + +import numpy as np +import paddle + +from ppmat.models.common.sinusoidal_embedding import SinusoidalEmbeddings + + +def uniform_sample_t(batch_size, timesteps): + times = np.random.choice(np.arange(0, timesteps), batch_size) + return paddle.to_tensor(times) + + +class UniformTimestepSampler: + """Samples diffusion timesteps uniformly over the training time.""" + + def __init__(self, *, min_t: float, max_t: float): + """Initializes the sampler. + + Args: + min_t (float): Smallest timestep that will be seen during training. + max_t (float): Largest timestep that will be seen during training. + """ + super().__init__() + self.min_t = min_t + self.max_t = max_t + + def __call__( + self, + batch_size: int, + ) -> paddle.float32: + return paddle.rand(shape=[batch_size]) * (self.max_t - self.min_t) + self.min_t + + +class SinusoidalTimeEmbeddings(SinusoidalEmbeddings): + def __init__(self, dim): + super().__init__(dim) + + +class NoiseLevelEncoding(paddle.nn.Layer): + def __init__(self, d_model: int, dropout: float = 0.0): + super().__init__() + self.dropout = paddle.nn.Dropout(p=dropout) + self.d_model = d_model + div_term = paddle.exp( + x=paddle.arange(start=0, end=d_model, step=2) + * (-math.log(10000.0) / d_model) + ) + self.register_buffer(name="div_term", tensor=div_term) + + def forward(self, t: paddle.Tensor) -> paddle.Tensor: + """ + Args: + t: Tensor, shape [batch_size] + """ + x = paddle.zeros(shape=(tuple(t.shape)[0], self.d_model)) + x[:, 0::2] = paddle.sin(x=t[:, None] * self.div_term[None]) + x[:, 1::2] = paddle.cos(x=t[:, None] * self.div_term[None]) + return self.dropout(x) diff --git a/ppmat/models/diffcsp/diffcsp.py b/ppmat/models/diffcsp/diffcsp.py new file mode 100644 index 00000000..05721eb1 --- /dev/null +++ b/ppmat/models/diffcsp/diffcsp.py @@ -0,0 +1,533 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import math + +import paddle +import paddle.nn as nn +from tqdm import tqdm + +from ppmat.models.common import initializer +from ppmat.models.common.time_embedding import SinusoidalTimeEmbeddings +from ppmat.models.common.time_embedding import uniform_sample_t +from ppmat.schedulers import build_scheduler +from ppmat.utils import paddle_aux # noqa +from ppmat.utils.crystal import lattice_params_to_matrix_paddle + + +def p_wrapped_normal(x, sigma, N=10, T=1.0): + p_ = 0 + for i in range(-N, N + 1): + p_ += paddle.exp(x=-((x + T * i) ** 2) / 2 / sigma**2) + return p_ + + +def d_log_p_wrapped_normal(x, sigma, N=10, T=1.0): + p_ = 0 + for i in range(-N, N + 1): + exp1 = paddle.exp(x=-((x + T * i) ** 2) / 2 / sigma**2) + p_ += (x + T * i) / sigma**2 * exp1 + return p_ / p_wrapped_normal(x, sigma, N, T) + + +class SinusoidsEmbedding(paddle.nn.Layer): + def __init__(self, n_frequencies=10, n_space=3): + super().__init__() + self.n_frequencies = n_frequencies + self.n_space = n_space + self.frequencies = 2 * math.pi * paddle.arange(end=self.n_frequencies) + self.dim = self.n_frequencies * 2 * self.n_space + + def forward(self, x): + emb = x.unsqueeze(axis=-1) * self.frequencies[None, None, :] + emb = emb.reshape([-1, self.n_frequencies * self.n_space]) + emb = paddle.concat(x=(emb.sin(), emb.cos()), axis=-1) + return emb + + +class CSPLayer(paddle.nn.Layer): + """Message passing layer for cspnet.""" + + def __init__( + self, + hidden_dim=128, + prop_dim=512, + act_fn=paddle.nn.Silu(), + dis_emb=None, + ln=False, + ip=True, + ): + super(CSPLayer, self).__init__() + self.dis_dim = 3 + self.dis_emb = dis_emb + self.ip = ip + if dis_emb is not None: + self.dis_dim = dis_emb.dim + self.edge_mlp = paddle.nn.Sequential( + paddle.nn.Linear( + in_features=hidden_dim * 2 + 9 + self.dis_dim, out_features=hidden_dim + ), + act_fn, + paddle.nn.Linear(in_features=hidden_dim, out_features=hidden_dim), + act_fn, + ) + self.node_mlp = paddle.nn.Sequential( + paddle.nn.Linear(in_features=hidden_dim * 2, out_features=hidden_dim), + act_fn, + paddle.nn.Linear(in_features=hidden_dim, out_features=hidden_dim), + act_fn, + ) + + self.prop_mlp = paddle.nn.Sequential( + paddle.nn.Linear(in_features=prop_dim, out_features=hidden_dim), + act_fn, + paddle.nn.Linear(in_features=hidden_dim, out_features=hidden_dim), + act_fn, + ) + + self.ln = ln + if self.ln: + self.layer_norm = paddle.nn.LayerNorm(normalized_shape=hidden_dim) + + def edge_model( + self, + node_features, + frac_coords, + lattices, + edge_index, + edge2graph, + frac_diff=None, + ): + hi, hj = node_features[edge_index[0]], node_features[edge_index[1]] + if frac_diff is None: + xi, xj = frac_coords[edge_index[0]], frac_coords[edge_index[1]] + frac_diff = (xj - xi) % 1.0 + if self.dis_emb is not None: + frac_diff = self.dis_emb(frac_diff) + if self.ip: + x = lattices + perm_0 = list(range(x.ndim)) + perm_0[-1] = -2 + perm_0[-2] = -1 + lattice_ips = lattices @ x.transpose(perm=perm_0) + else: + lattice_ips = lattices + + lattice_ips_flatten = lattice_ips.reshape([-1, 9]) + lattice_ips_flatten_edges = lattice_ips_flatten[edge2graph] + edges_input = paddle.concat( + x=[hi, hj, lattice_ips_flatten_edges, frac_diff], axis=1 + ) + edge_features = self.edge_mlp(edges_input) + return edge_features + + def node_model(self, node_features, edge_features, edge_index): + agg = paddle.geometric.segment_mean(edge_features, edge_index[0]) + agg = paddle.concat(x=[node_features, agg], axis=1) + out = self.node_mlp(agg) + return out + + def forward( + self, + node_features, + frac_coords, + lattices, + edge_index, + edge2graph, + frac_diff=None, + num_atoms=None, + property_emb=None, + property_mask=None, + ): + if property_emb is not None: + property_features = self.prop_mlp(property_emb) + if property_mask is not None: + property_features = property_features * property_mask + property_features = paddle.repeat_interleave( + property_features, num_atoms, axis=0 + ) + node_features = node_features + property_features + + node_input = node_features + if self.ln: + node_features = self.layer_norm(node_input) + edge_features = self.edge_model( + node_features, frac_coords, lattices, edge_index, edge2graph, frac_diff + ) + node_output = self.node_model(node_features, edge_features, edge_index) + return node_input + node_output + + +class CSPNet(paddle.nn.Layer): + """CSPNet model, based on https://arxiv.org/abs/2309.04475 + + Args: + hidden_dim (int, optional): Hidden dimension. Defaults to 128. + latent_dim (int, optional): Latent space dimension for time embedding. + Defaults to 256. + num_layers (int, optional): Number of CSPLayer. Defaults to 4. + act_fn (str, optional): Activation function type. Defaults to "silu". + dis_emb (str, optional): Distance embedding method, can be 'sin' or 'none'. + Defaults to "sin". + num_freqs (int, optional): Number of frequency components (effective only when + dis_emb='sin'). Defaults to 10. + edge_style (str, optional): Edge feature encoding method. Must be set to 'fc' + (fully connected atomic interactions). Default: "fc". + ln (bool, optional): Enable LayerNorm after CSPLayer. Defaults to False. + ip (bool, optional): Apply lattice inner product for O(3)-invariance. Defaults + to True. + smooth (bool, optional): Atomic number encoding method. True: Linear layer, + False: Embedding layer. Defaults to False. + pred_type (bool, optional): Enable atom type prediction. Defaults to False. + prop_dim (int, optional): Property feature dimension for scalar property + guidance. Defaults to 512. + pred_scalar (bool, optional): Enable scalar property prediction. Defaults to + False. + num_classes (Optional[int], optional): Number of atom type classes. Defaults + to None. + """ + + def __init__( + self, + hidden_dim: int = 128, + latent_dim: int = 256, + num_layers: int = 4, + act_fn: str = "silu", + dis_emb: str = "sin", + num_freqs: int = 10, + edge_style: str = "fc", + ln: bool = False, + ip: bool = True, + smooth: bool = False, + pred_type: bool = False, + prop_dim: int = 512, + pred_scalar: bool = False, + num_classes: int = 100, + ): + super(CSPNet, self).__init__() + self.ip = ip + self.smooth = smooth + self.num_classes = num_classes + + if self.smooth: + self.node_embedding = paddle.nn.Linear( + in_features=self.num_classes, out_features=hidden_dim + ) + else: + self.node_embedding = paddle.nn.Embedding( + num_embeddings=self.num_classes, embedding_dim=hidden_dim + ) + self.atom_latent_emb = paddle.nn.Linear( + in_features=hidden_dim + latent_dim, out_features=hidden_dim + ) + if act_fn == "silu": + self.act_fn = paddle.nn.Silu() + if dis_emb == "sin": + self.dis_emb = SinusoidsEmbedding(n_frequencies=num_freqs) + elif dis_emb == "none": + self.dis_emb = None + self.prop_dim = prop_dim + for i in range(0, num_layers): + self.add_sublayer( + name="csp_layer_%d" % i, + sublayer=CSPLayer( + hidden_dim, + prop_dim=self.prop_dim, + act_fn=self.act_fn, + dis_emb=self.dis_emb, + ln=ln, + ip=ip, + ), + ) + self.num_layers = num_layers + self.coord_out = paddle.nn.Linear( + in_features=hidden_dim, out_features=3, bias_attr=False + ) + self.lattice_out = paddle.nn.Linear( + in_features=hidden_dim, out_features=9, bias_attr=False + ) + self.pred_type = pred_type + self.ln = ln + self.edge_style = edge_style + if self.ln: + self.final_layer_norm = paddle.nn.LayerNorm(normalized_shape=hidden_dim) + if self.pred_type: + self.type_out = paddle.nn.Linear( + in_features=hidden_dim, out_features=self.num_classes + ) + self.pred_scalar = pred_scalar + if self.pred_scalar: + self.scalar_out = paddle.nn.Linear(in_features=hidden_dim, out_features=1) + + def select_symmetric_edges(self, tensor, mask, reorder_idx, inverse_neg): + tensor_directed = tensor[mask] + sign = 1 - 2 * inverse_neg + tensor_cat = paddle.concat(x=[tensor_directed, sign * tensor_directed]) + tensor_ordered = tensor_cat[reorder_idx] + return tensor_ordered + + def gen_edges(self, num_atoms, frac_coords): + if self.edge_style == "fc": + cum_num_atoms = paddle.cumsum(x=num_atoms) + indices_pp = [] + rows = paddle.arange(num_atoms.max()) + ind1, ind2 = paddle.meshgrid(rows, rows) + index = paddle.stack(x=[ind1, ind2], axis=0) + for n, cum_n in zip(num_atoms, cum_num_atoms): + offset = cum_n - n + indices_pp.append(index[:, :n, :n].reshape((2, -1)) + offset) + indices_pp = paddle.concat(x=indices_pp, axis=1) + fc_edges = indices_pp + return fc_edges, (frac_coords[fc_edges[1]] - frac_coords[fc_edges[0]]) % 1.0 + else: + raise NotImplementedError("Edge style '%s'" % self.edge_style) + + def forward( + self, + t, + atom_types, + frac_coords, + lattices, + num_atoms, + node2graph, + property_emb=None, + property_mask=None, + ): + edges, frac_diff = self.gen_edges(num_atoms, frac_coords) + edge2graph = node2graph[edges[0]] + node_features = self.node_embedding(atom_types) + + t_per_atom = t.repeat_interleave(repeats=num_atoms, axis=0) + node_features = paddle.concat(x=[node_features, t_per_atom], axis=1) + node_features = self.atom_latent_emb(node_features) + + for i in range(0, self.num_layers): + node_features = eval("self.csp_layer_%d" % i)( + node_features, + frac_coords, + lattices, + edges, + edge2graph, + frac_diff=frac_diff, + num_atoms=num_atoms, + property_emb=property_emb, + property_mask=property_mask, + ) + if self.ln: + node_features = self.final_layer_norm(node_features) + coord_out = self.coord_out(node_features) + graph_features = paddle.geometric.segment_mean(node_features, node2graph) + if self.pred_scalar: + return self.scalar_out(graph_features) + lattice_out = self.lattice_out(graph_features) + lattice_out = lattice_out.reshape([-1, 3, 3]) + if self.ip: + lattice_out = paddle.einsum("bij,bjk->bik", lattice_out, lattices) + if self.pred_type: + type_out = self.type_out(node_features) + return lattice_out, coord_out, type_out + return lattice_out, coord_out + + +class DiffCSP(paddle.nn.Layer): + """Crystal Structure Prediction by Joint Equivariant Diffusion + + https://arxiv.org/abs/2309.04475 + + Args: + decoder_cfg (dict): Decoder layer configuration. See `CSPNet` for more details. + lattice_noise_scheduler_cfg (dict): Noise scheduler configuration for lattice. + coord_noise_scheduler_cfg (dict): Noise scheduler configuration for coordinate. + num_train_timesteps (int): Number of diffusion steps. Defaults to 1000. + time_dim (int): Time embedding dimension. Defaults to 256. + lattice_loss_weight (float, optional): Lattice loss weight. Defaults to 1.0. + coord_loss_weight (float, optional): Coordinate loss weight. Defaults to 1.0. + """ + + def __init__( + self, + decoder_cfg: dict, + lattice_noise_scheduler_cfg: dict, + coord_noise_scheduler_cfg: dict, + num_train_timesteps: int = 1000, + time_dim: int = 256, + lattice_loss_weight: float = 1.0, + coord_loss_weight: float = 1.0, + ) -> None: + + super().__init__() + + self.decoder = CSPNet(**decoder_cfg) + + self.lattice_scheduler = build_scheduler(lattice_noise_scheduler_cfg) + self.coord_scheduler = build_scheduler(coord_noise_scheduler_cfg) + + self.num_train_timesteps = num_train_timesteps + self.time_dim = time_dim + self.lattice_loss_weight = lattice_loss_weight + self.coord_loss_weight = coord_loss_weight + + self.time_embedding = SinusoidalTimeEmbeddings(time_dim) + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + initializer.linear_init_(m) + elif isinstance(m, nn.Embedding): + initializer.normal_(m.weight) + elif isinstance(m, nn.LSTM): + initializer.lstm_init_(m) + + def forward(self, batch, **kwargs): + + structure_array = batch["structure_array"] + batch_size = structure_array["num_atoms"].shape[0] + batch_idx = paddle.repeat_interleave( + paddle.arange(batch_size), repeats=structure_array["num_atoms"] + ) + + times = uniform_sample_t(batch_size, self.num_train_timesteps) + times_per_atom = times.repeat_interleave(repeats=structure_array["num_atoms"]) + + time_emb = self.time_embedding(times) + + if "lattice" in structure_array.keys(): + lattices = structure_array["lattice"] + else: + lattices = lattice_params_to_matrix_paddle( + structure_array["lengths"], structure_array["angles"] + ) + + frac_coords = structure_array["frac_coords"] + rand_l, rand_x = paddle.randn( + shape=lattices.shape, dtype=lattices.dtype + ), paddle.randn(shape=frac_coords.shape, dtype=frac_coords.dtype) + + input_lattice = self.lattice_scheduler.add_noise( + lattices, rand_l, timesteps=times + ) + + input_frac_coords = self.coord_scheduler.add_noise( + frac_coords, rand_x, timesteps=times_per_atom + ) + input_frac_coords = input_frac_coords % 1.0 + + pred_l, pred_x = self.decoder( + time_emb, + structure_array["atom_types"] - 1, + input_frac_coords, + input_lattice, + structure_array["num_atoms"], + batch_idx, + ) + + sigmas_per_atom = self.coord_scheduler.discrete_sigmas[times_per_atom][:, None] + sigmas_norm_per_atom = self.coord_scheduler.discrete_sigmas_norm[ + times_per_atom + ][:, None] + + tar_x = d_log_p_wrapped_normal( + sigmas_per_atom * rand_x, sigmas_per_atom + ) / paddle.sqrt(x=sigmas_norm_per_atom) + + loss_lattice = paddle.nn.functional.mse_loss(input=pred_l, label=rand_l) + loss_coord = paddle.nn.functional.mse_loss(input=pred_x, label=tar_x) + loss = ( + self.lattice_loss_weight * loss_lattice + + self.coord_loss_weight * loss_coord + ) + loss_dict = { + "loss": loss, + "loss_lattice": loss_lattice, + "loss_coord": loss_coord, + } + + return { + "loss_dict": loss_dict, + } + + @paddle.no_grad() + def sample(self, batch_data, num_inference_steps=1000, **kwargs): + structure_array = batch_data["structure_array"] + batch_size = structure_array["num_atoms"].shape[0] + batch_idx = paddle.repeat_interleave( + paddle.arange(batch_size), repeats=structure_array["num_atoms"] + ) + l_T, x_T = paddle.randn(shape=[batch_size, 3, 3]), paddle.rand( + shape=[structure_array["num_atoms"].sum(), 3] + ) + l_t, x_t = l_T, x_T + + self.lattice_scheduler.set_timesteps(num_inference_steps) + self.coord_scheduler.set_timesteps(num_inference_steps) + + for lattice_t, coord_t in tqdm( + zip(self.lattice_scheduler.timesteps, self.coord_scheduler.timesteps), + total=num_inference_steps, + desc="Sampling...", + ): + time_emb = self.time_embedding( + paddle.ones([batch_size], dtype="int64") * lattice_t + ) + pred_l, pred_x = self.decoder( + time_emb, + structure_array["atom_types"] - 1, + x_t, + l_t, + structure_array["num_atoms"], + batch_idx, + ) + x_t = self.coord_scheduler.step_correct(pred_x, coord_t, x_t).prev_sample + + pred_l, pred_x = self.decoder( + time_emb, + structure_array["atom_types"] - 1, + x_t, + l_t, + structure_array["num_atoms"], + batch_idx, + ) + output = self.coord_scheduler.step_pred( + pred_x, + coord_t, + x_t, + ) + x_t, x_t_mean = output.prev_sample, output.prev_sample_mean + + l_t = self.lattice_scheduler.step( + pred_l, + lattice_t, + l_t, + ).prev_sample + + x_t = x_t % 1.0 + + x_t = x_t_mean % 1.0 + + start_idx = 0 + result = [] + for i in range(batch_size): + end_idx = start_idx + structure_array["num_atoms"][i] + result.append( + { + "num_atoms": structure_array["num_atoms"][i].tolist(), + "atom_types": structure_array["atom_types"][ + start_idx:end_idx + ].tolist(), + "frac_coords": x_t[start_idx:end_idx].tolist(), + "lattice": l_t[i].tolist(), + } + ) + start_idx += structure_array["num_atoms"][i] + + return {"result": result} diff --git a/ppmat/models/diffnmr/diffnmr.py b/ppmat/models/diffnmr/diffnmr.py new file mode 100644 index 00000000..c3ad924e --- /dev/null +++ b/ppmat/models/diffnmr/diffnmr.py @@ -0,0 +1,1260 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import random + +import paddle +import paddle.nn as nn +from einops import rearrange +from einops import repeat +from tqdm import tqdm + +from ppmat.losses.diffnmr_loss import TrainLossDiscrete +from ppmat.metrics.diffnmr_metric import NLL +from ppmat.metrics.diffnmr_metric import SumExceptBatchKL +from ppmat.metrics.diffnmr_metric import SumExceptBatchMetric +from ppmat.models.common import initializer +from ppmat.models.diffnmr.diffusion_prior import DiffPriorNetwork +from ppmat.models.diffnmr.graph_transformer import GraphTransformer +from ppmat.models.diffnmr.graph_transformer import MolecularEncoder +from ppmat.models.diffnmr.nmr_encoder import NMR_encoder +from ppmat.models.diffnmr.nmr_encoder import NMR_encoder_H +from ppmat.models.diffnmr.utils import diffgraphformer_utils +from ppmat.models.diffnmr.utils.diffprior_utils import default +from ppmat.models.diffnmr.utils.diffprior_utils import exists +from ppmat.models.diffnmr.utils.diffprior_utils import freeze_model_and_make_eval_ +from ppmat.models.diffnmr.utils.diffprior_utils import l2norm +from ppmat.schedulers import scheduling_diffnmr +from ppmat.schedulers.scheduling_diffnmr import DiscreteUniformTransition +from ppmat.schedulers.scheduling_diffnmr import MarginalUniformTransition +from ppmat.schedulers.scheduling_diffnmr import PredefinedNoiseScheduleDiscrete +from ppmat.schedulers.scheduling_diffprior import NoiseScheduler +from ppmat.utils import logger + + +class MolecularGraphFormer(nn.Layer): + def __init__( + self, + encoder_cfg, + decoder_cfg, + diffmodel_cfg, + extra_features=None, + domain_features=None, + dataset_infos=None, + visualization_tools=None, + ) -> None: + super().__init__() + + # configure general variables settings + self.T = diffmodel_cfg["diffusion_steps"] + + # configure datasets inter-varibles + input_dims = dataset_infos.input_dims + output_dims = dataset_infos.output_dims + self.dataset_info = dataset_infos + + self.visualization_tools = visualization_tools + self.extra_features = extra_features + self.domain_features = domain_features + + # configure noise scheduler + self.noise_schedule = PredefinedNoiseScheduleDiscrete( + diffmodel_cfg["diffusion_noise_schedule"], + timesteps=self.T, + ) + + # configure model + self.con_input_dim = copy.deepcopy(input_dims) + self.con_input_dim["y"] = 12 + self.con_output_dim = dataset_infos.output_dims + + self.encoder = MolecularEncoder( + n_layers=encoder_cfg["num_layers"], + input_dims=self.con_input_dim, + hidden_mlp_dims=encoder_cfg["hidden_mlp_dims"], + hidden_dims=encoder_cfg["hidden_dims"], + output_dims=self.con_output_dim, + act_fn_in=nn.ReLU(), + act_fn_out=nn.ReLU(), + ) + + self.decoder = GraphTransformer( + n_layers=decoder_cfg["num_layers"], + input_dims=input_dims, + hidden_mlp_dims=decoder_cfg["hidden_mlp_dims"], + hidden_dims=decoder_cfg["hidden_dims"], + output_dims=output_dims, + act_fn_in=nn.ReLU(), + act_fn_out=nn.ReLU(), + ) + + # configure loss calculation with initialization of transition model + self.Xdim = input_dims["X"] + self.Edim = input_dims["E"] + self.ydim = input_dims["y"] + self.Xdim_output = output_dims["X"] + self.Edim_output = output_dims["E"] + self.ydim_output = output_dims["y"] + self.node_dist = dataset_infos.nodes_dist + + # Transition Model + if diffmodel_cfg["transition"] == "uniform": + self.transition_model = DiscreteUniformTransition( + x_classes=self.Xdim_output, + e_classes=self.Edim_output, + y_classes=self.ydim_output, + ) + x_limit = paddle.ones([self.Xdim_output]) / self.Xdim_output + e_limit = paddle.ones([self.Edim_output]) / self.Edim_output + y_limit = paddle.ones([self.ydim_output]) / self.ydim_output + self.limit_dist = diffgraphformer_utils.PlaceHolder( + X=x_limit, E=e_limit, y=y_limit + ) + + elif diffmodel_cfg["transition"] == "marginal": + node_types = self.dataset_info.node_types.astype("float32") + x_marginals = node_types / paddle.sum(node_types) + + edge_types = self.dataset_info.edge_types.astype("float32") + e_marginals = edge_types / paddle.sum(edge_types) + logger.info("Marginal distribution of classes:") + logger.info(f"{x_marginals.tolist()} for nodes") + logger.info(f"{e_marginals.tolist()} for edges") + + self.transition_model = MarginalUniformTransition( + x_marginals=x_marginals, + e_marginals=e_marginals, + y_classes=self.ydim_output, + ) + self.limit_dist = diffgraphformer_utils.PlaceHolder( + X=x_marginals, + E=e_marginals, + y=paddle.ones([self.ydim_output]) / self.ydim_output, + ) + + # configure loss + self.train_loss = TrainLossDiscrete(diffmodel_cfg["lambda_train"]) + + # configure training setting and other properties + self.best_val_nll = 1e8 + self.val_counter = 0 + + # set use formula for training and sample or not + self.flag_use_formula = diffmodel_cfg.get("flag_use_formula", False) + + def forward(self, batch): + batch_graph = batch["graph"] + batch_property = batch["property"] + + # 0. Guard empty-edge batches + if batch_graph.edges.T.size == 0: + print("Found a batch with no edges. Skipping.") + return None + # 1. Convert sparse graph to dense tensors and apply node mask + dense_data, node_mask = diffgraphformer_utils.to_dense( + paddle.to_tensor(batch_graph.node_feat["feat"]), + paddle.to_tensor(batch_graph.edges.T), + paddle.to_tensor(batch_graph.edge_feat["feat"]), + paddle.to_tensor(batch_graph.graph_node_id), + ) + dense_data = dense_data.mask(node_mask) + X, E = dense_data.X, dense_data.E + y = paddle.to_tensor(batch_property["y"]) + + # 2. Add noise and compute extra features + noisy_data = scheduling_diffnmr.apply_noise( + self, X, E, y, node_mask, self.flag_use_formula + ) + extra_data = scheduling_diffnmr.compute_extra_data(self, noisy_data) + + # Decoder inputs (noisy + extra features) + input_X = paddle.concat( + [noisy_data["X_t"].astype("float32"), extra_data.X], axis=2 + ).astype(dtype="float32") + input_E = paddle.concat( + [noisy_data["E_t"].astype("float32"), extra_data.E], axis=3 + ).astype(dtype="float32") + input_y = paddle.hstack( + [noisy_data["y_t"].astype("float32"), extra_data.y] + ).astype(dtype="float32") + + # 3. Encoder condition vector from clean inputs + extra features + z_t = ( + diffgraphformer_utils.PlaceHolder(X=X, E=E, y=y).type_as(X).mask(node_mask) + ) + extra_data_pure = scheduling_diffnmr.compute_extra_data( + self, + {"X_t": z_t.X, "E_t": z_t.E, "y_t": z_t.y, "node_mask": node_mask}, + isPure=True, + ) + input_X_pure = paddle.concat( + [z_t.X.astype("float32"), extra_data_pure.X], axis=2 + ).astype(dtype="float32") + input_E_pure = paddle.concat( + [z_t.E.astype("float32"), extra_data_pure.E], axis=3 + ).astype(dtype="float32") + input_y_pure = paddle.hstack( + x=(z_t.y.astype("float32"), extra_data_pure.y) + ).astype(dtype="float32") + + # obtain the condition vector from output of encoder + conditionVec = self.encoder(input_X_pure, input_E_pure, input_y_pure, node_mask) + # complete input_y for decoder + input_y = paddle.hstack(x=(input_y, conditionVec)).astype(dtype="float32") + + # 4. Decoder forward + # Convention: pred.X and pred.E are logits with shapes [B, n, Cx] and + # [B, n, n, Ce] + pred = self.decoder(input_X, input_E, input_y, node_mask) + + # 5. Compute training loss + loss_dict = self.train_loss( + masked_pred_X=pred.X, + masked_pred_E=pred.E, + pred_y=pred.y, + true_X=X, + true_E=E, + true_y=paddle.to_tensor(batch_property["y"]), + ) + + # 6. Assemble outputs for Trainer & streaming metrics + # Predictions: provide masked_pred_X/E; mirror X_logits/E_logits for legacy + # paths + pred_dict = { + "masked_pred_X": pred.X, + "masked_pred_E": pred.E, + "pred_y": pred.y, + } + # Labels: provide true_X/true_E; node_mask is optional but useful for some + # metrics + label_dict = { + "true_X": X, + "true_E": E, + "true_y": y, + } + + result = { + "loss_dict": loss_dict, + "pred_dict": pred_dict, + "label_dict": label_dict, + "node_mask": node_mask, + "noisy_data": noisy_data, + } + + return result + + +class NMRNetCLIP(nn.Layer): + def __init__( + self, + graph_encoder: dict, + spectrum_encoder: dict, + dataset_infos=None, + extra_features=None, + domain_features=None, + **kwargs, + ): + super().__init__() + self.name = kwargs.get("__name__") + + self.dataset_info = dataset_infos + self.extra_features = extra_features + self.domain_features = domain_features + + self.con_input_dim = copy.deepcopy(dataset_infos.input_dims) + self.con_input_dim["y"] = 12 + self.con_output_dim = dataset_infos.output_dims + + self.graph_encoder = MolecularEncoder( + n_layers=graph_encoder["n_layers_GT"], + input_dims=self.con_input_dim, + hidden_mlp_dims=graph_encoder["hidden_mlp_dims"], + hidden_dims=graph_encoder["hidden_dims"], + output_dims=self.con_output_dim, + act_fn_in=paddle.nn.ReLU(), + act_fn_out=paddle.nn.ReLU(), + ) + if graph_encoder["pretrained_model_path"] is not None: + # load graph encoder model from pretrained model + state_dict = paddle.load(graph_encoder["pretrained_model_path"]) + encoder_state_dict = { + k[len("encoder.") :]: v + for k, v in state_dict.items() + if k.startswith("encoder.") + } + self.graph_encoder.set_state_dict(encoder_state_dict) + for param in self.graph_encoder.parameters(): + param.stop_gradient = True + self.graph_encoder.eval() + + if kwargs.get("onlyH", False): + self.flag_onlyH = True + self.spectrum_encoder = NMR_encoder_H( + dim_H=spectrum_encoder["dim_enc_H"], + dimff_H=spectrum_encoder["dimff_enc_H"], + dim_C=spectrum_encoder["dim_enc_C"], + dimff_C=spectrum_encoder["dimff_enc_C"], + hidden_dim=spectrum_encoder["ffn_hidden"], + n_head=spectrum_encoder["n_head"], + num_layers=spectrum_encoder["n_layers"], + drop_prob=spectrum_encoder["drop_prob"], + peakwidthemb_num=spectrum_encoder["peakwidthemb_num"], + integralemb_num=spectrum_encoder["integralemb_num"], + ) + else: + self.flag_onlyH = False + self.spectrum_encoder = NMR_encoder( + dim_H=spectrum_encoder["dim_enc_H"], + dimff_H=spectrum_encoder["dimff_enc_H"], + dim_C=spectrum_encoder["dim_enc_C"], + dimff_C=spectrum_encoder["dimff_enc_C"], + hidden_dim=spectrum_encoder["ffn_hidden"], + n_head=spectrum_encoder["n_head"], + num_layers=spectrum_encoder["n_layers"], + drop_prob=spectrum_encoder["drop_prob"], + peakwidthemb_num=spectrum_encoder["peakwidthemb_num"], + integralemb_num=spectrum_encoder["integralemb_num"], + ) + # for init model weights + self.spectrum_encoder.apply(self._init_weights) + + self.seq_len_H1 = spectrum_encoder["seq_len_H1"] # TODO remove later + self.seq_len_C13 = spectrum_encoder["seq_len_C13"] # TODO remove later + self.tem = 2 # TODO remove later + + # for Prior Training + if ( + "pretrained_model_path" in spectrum_encoder + and spectrum_encoder["pretrained_model_path"] is not None + ): + # load graph encoder model from pretrained model + state_dict = paddle.load(spectrum_encoder["pretrained_model_path"]) + encoder_state_dict = { + k[len("spectrum_encoder.") :]: v + for k, v in state_dict.items() + if k.startswith("spectrum_encoder.") + } + # encoder_state_dict = { + # k[len("encoder.") :]: v + # for k, v in state_dict.items() + # if k.startswith("encoder.") + # } # TODO: prior training, revise it and check + self.spectrum_encoder.set_state_dict(encoder_state_dict) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + initializer.linear_init_(m) + elif isinstance(m, nn.Embedding): + initializer.normal_(m.weight) + + def forward(self, batch): + batch_graph = batch["graph"] + batch_property = batch["property"] + batch_spectrum = batch["spectrum"] + + batch_length = batch_graph.num_graph + # transfer to dense graph from sparse graph + if paddle.to_tensor(batch_graph.edges.T).numel() == 0: + print("Found a batch with no edges. Skipping.") + return None + dense_data, node_mask = diffgraphformer_utils.to_dense( + paddle.to_tensor(batch_graph.node_feat["feat"]), + paddle.to_tensor(batch_graph.edges.T).contiguous(), + paddle.to_tensor(batch_graph.edge_feat["feat"]), + paddle.to_tensor(batch_graph.graph_node_id), + ) + dense_data = dense_data.mask(node_mask) + X, E = dense_data.X, dense_data.E + y = paddle.to_tensor(batch_property["y"]) + + # get NMR embedded vector + # prepare NMR vectors + condition_H1nmr = paddle.to_tensor(batch_spectrum["H_nmr"]).reshape( + batch_length, self.seq_len_H1, -1 + ) + condition_C13nmr = paddle.to_tensor(batch_spectrum["C_nmr"]).reshape( + batch_length, self.seq_len_C13 + ) + num_H_peak = paddle.to_tensor(batch_spectrum["num_H_peak"]) + num_C_peak = paddle.to_tensor(batch_spectrum["num_C_peak"]) + conditionAll = [condition_H1nmr, num_H_peak, condition_C13nmr, num_C_peak] + if self.flag_onlyH is True: + global_H, _ = self.spectrum_encoder(conditionAll) + condition_nmr = global_H + else: + condition_nmr = self.spectrum_encoder(conditionAll) + + # get graph embedded vector + # prepare the extra feature for encoder input without noisy + z_t = ( + diffgraphformer_utils.PlaceHolder(X=X, E=E, y=y).type_as(X).mask(node_mask) + ) + extra_data_pure = scheduling_diffnmr.compute_extra_data( + self, + {"X_t": z_t.X, "E_t": z_t.E, "y_t": z_t.y, "node_mask": node_mask}, + isPure=True, + ) + # prepare the input data for encoder combining extra features + input_X_pure = paddle.concat( + [z_t.X.astype("float32"), extra_data_pure.X], axis=2 + ).astype(dtype="float32") + input_E_pure = paddle.concat( + [z_t.E.astype("float32"), extra_data_pure.E], axis=3 + ).astype(dtype="float32") + input_y_pure = paddle.hstack( + x=(z_t.y.astype("float32"), extra_data_pure.y) + ).astype(dtype="float32") + # obtain the condition vector from output of encoder + condition_graph = self.graph_encoder( + input_X_pure, input_E_pure, input_y_pure, node_mask + ) + + # compute similarity between graph and NMR + V1_f = condition_graph # Assuming V1 is a feature obtained from molecular graph + V2_f, _ = condition_nmr # Assume V2 is a feature obtained from NMR spectrum + V1_e = paddle.nn.functional.normalize(x=V1_f, p=2, axis=1) + V2_e = paddle.nn.functional.normalize(x=V2_f, p=2, axis=1) + logits = paddle.matmul(x=V1_e, y=V2_e.T) * paddle.exp( + x=paddle.to_tensor(data=self.tem) + ) + n = V1_f.shape[0] + labels = paddle.arange(end=n) + loss_fn = paddle.nn.CrossEntropyLoss() + loss_v1 = loss_fn(logits, labels) + loss_v2 = loss_fn(logits.T, labels) + loss = (loss_v1 + loss_v2) / 2 + + loss_dict = {"loss": loss} + + return {"loss_dict": loss_dict} + + +class DiffNMR(nn.Layer): + def __init__( + self, + encoder_cfg, + decoder_cfg, + diffmodel_cfg, + dataset_infos, + extra_features, + domain_features, + clip, + connector_cfg = None, + ) -> None: + super().__init__() + + # configure general variables settings + self.T = diffmodel_cfg["diffusion_steps"] + + # configure datasets inter-varibles + input_dims = dataset_infos.input_dims + output_dims = dataset_infos.output_dims + self.dataset_info = dataset_infos + + self.dataset_info = dataset_infos + self.extra_features = extra_features + self.domain_features = domain_features + + # configure noise scheduler + self.noise_schedule = PredefinedNoiseScheduleDiscrete( + diffmodel_cfg["diffusion_noise_schedule"], + timesteps=self.T, + ) + + # set spectrum encoder model + if encoder_cfg.get("onlyH", False): + self.flag_onlyH = True + self.encoder = NMR_encoder_H( + dim_H=encoder_cfg["dim_enc_H"], + dimff_H=encoder_cfg["dimff_enc_H"], + dim_C=encoder_cfg["dim_enc_C"], + dimff_C=encoder_cfg["dimff_enc_C"], + hidden_dim=encoder_cfg["ffn_hidden"], + n_head=encoder_cfg["n_head"], + num_layers=encoder_cfg["n_layers"], + drop_prob=encoder_cfg["drop_prob"], + peakwidthemb_num=encoder_cfg["peakwidthemb_num"], + integralemb_num=encoder_cfg["integralemb_num"], + ) + else: + self.flag_onlyH = False + self.encoder = NMR_encoder( + dim_H=encoder_cfg["dim_enc_H"], + dimff_H=encoder_cfg["dimff_enc_H"], + dim_C=encoder_cfg["dim_enc_C"], + dimff_C=encoder_cfg["dimff_enc_C"], + hidden_dim=encoder_cfg["ffn_hidden"], + n_head=encoder_cfg["n_head"], + num_layers=encoder_cfg["n_layers"], + drop_prob=encoder_cfg["drop_prob"], + peakwidthemb_num=encoder_cfg["peakwidthemb_num"], + integralemb_num=encoder_cfg["integralemb_num"], + ) + # load spectrum encoder model from pretrained model + state_dict = paddle.load(encoder_cfg["pretrained_path"]) + prefixes = ("spectrum_encoder.", "encoder.") + encoder_state_dict = { + k[len(pref) :]: v + for k, v in state_dict.items() + for pref in prefixes + if k.startswith(pref) + } + self.encoder.set_state_dict(encoder_state_dict) + + # set graph decoder model + self.decoder = GraphTransformer( + n_layers=decoder_cfg["num_layers"], + input_dims=input_dims, + hidden_mlp_dims=decoder_cfg["hidden_mlp_dims"], + hidden_dims=decoder_cfg["hidden_dims"], + output_dims=output_dims, + act_fn_in=nn.ReLU(), + act_fn_out=nn.ReLU(), + ) + # load graph decoder model from pretrained model + state_dict = paddle.load(decoder_cfg["pretrained_path"]) + decoder_state_dict = { + k[len("decoder.") :]: v + for k, v in state_dict.items() + if k.startswith("decoder.") + } + self.decoder.set_state_dict(decoder_state_dict) + + # set connector model + self.connector_flag = False + if connector_cfg and connector_cfg["__name__"] == "DiffPrior": + self.connector_flag = True + self.connector = DiffPrior( + sample_cfg=connector_cfg["sample_cfg"], + connector_cfg=connector_cfg["model_cfg"], + clip=clip, + ) + state_dict = paddle.load(connector_cfg["pretrained_model_path"]) + connector_state_dict = { + k[len("connector.") :]: v + for k, v in state_dict.items() + if k.startswith("connector.") + } + self.connector.set_state_dict(connector_state_dict) + else: + self.connector = nn.Identity() + + # configure loss calculation with initialization of transition model + self.Xdim = input_dims["X"] + self.Edim = input_dims["E"] + self.ydim = input_dims["y"] + self.Xdim_output = output_dims["X"] + self.Edim_output = output_dims["E"] + self.ydim_output = output_dims["y"] + self.node_dist = dataset_infos.nodes_dist + + # Transition Model + if diffmodel_cfg["transition"] == "uniform": + self.transition_model = DiscreteUniformTransition( + x_classes=self.Xdim_output, + e_classes=self.Edim_output, + y_classes=self.ydim_output, + ) + x_limit = paddle.ones([self.Xdim_output]) / self.Xdim_output + e_limit = paddle.ones([self.Edim_output]) / self.Edim_output + y_limit = paddle.ones([self.ydim_output]) / self.ydim_output + self.limit_dist = diffgraphformer_utils.PlaceHolder( + X=x_limit, E=e_limit, y=y_limit + ) + + elif diffmodel_cfg["transition"] == "marginal": + node_types = self.dataset_info.node_types.astype("float32") + x_marginals = node_types / paddle.sum(node_types) + + edge_types = self.dataset_info.edge_types.astype("float32") + e_marginals = edge_types / paddle.sum(edge_types) + logger.info( + f"Marginal distribution of classes: {x_marginals.tolist()} for nodes, " + ) + logger.info(f"{e_marginals.tolist()} for edges") + + self.transition_model = MarginalUniformTransition( + x_marginals=x_marginals, + e_marginals=e_marginals, + y_classes=self.ydim_output, + ) + self.limit_dist = diffgraphformer_utils.PlaceHolder( + X=x_marginals, + E=e_marginals, + y=paddle.ones([self.ydim_output]) / self.ydim_output, + ) + + self.train_loss = TrainLossDiscrete(diffmodel_cfg["lambda_train"]) + + self.best_val_nll = 1e8 + self.val_counter = 0 + self.vocabDim = decoder_cfg["vocab_dim"] + + self.val_nll = NLL() + self.val_X_kl = SumExceptBatchKL() + self.val_E_kl = SumExceptBatchKL() + self.val_X_logp = SumExceptBatchMetric() + self.val_E_logp = SumExceptBatchMetric() + + self.test_nll = NLL() + self.test_X_kl = SumExceptBatchKL() + self.test_E_kl = SumExceptBatchKL() + self.test_X_logp = SumExceptBatchMetric() + self.test_E_logp = SumExceptBatchMetric() + + self.seq_len_H1 = encoder_cfg["seq_len_H1"] # TODO remove later + self.seq_len_C13 = encoder_cfg["seq_len_C13"] # TODO remove later + self.tem = 2 # TODO remove later + + # set use formula for training and sample or not + self.flag_use_formula = diffmodel_cfg.get("flag_use_formula", False) + + def make_src_mask(self, src): + src_mask = (src != 0).unsqueeze(1).unsqueeze(2) + return src_mask + + def forward(self, batch): + batch_graph = batch["graph"] + batch_property = batch["property"] + batch_spectrum = batch["spectrum"] + + # 0. Guard empty-edge batches + if batch_graph.edges.T.size == 0: + print("Found a batch with no edges. Skipping.") + return None + + # 1. Convert sparse graph to dense tensors and apply node mask + dense_data, node_mask = diffgraphformer_utils.to_dense( + paddle.to_tensor(batch_graph.node_feat["feat"]), + paddle.to_tensor(batch_graph.edges.T), + paddle.to_tensor(batch_graph.edge_feat["feat"]), + paddle.to_tensor(batch_graph.graph_node_id), + ) + dense_data = dense_data.mask(node_mask) + X, E = dense_data.X, dense_data.E + y = paddle.to_tensor(batch_property["y"]) + + # 2. Add noise and compute extra features + noisy_data = scheduling_diffnmr.apply_noise( + self, X, E, y, node_mask, self.flag_use_formula + ) + extra_data = scheduling_diffnmr.compute_extra_data(self, noisy_data) + + # Decoder inputs (noisy + extra features) + input_X = paddle.concat( + [noisy_data["X_t"].astype("float32"), extra_data.X], axis=2 + ).astype(dtype="float32") + input_E = paddle.concat( + [noisy_data["E_t"].astype("float32"), extra_data.E], axis=3 + ).astype(dtype="float32") + input_y = paddle.hstack( + [noisy_data["y_t"].astype("float32"), extra_data.y] + ).astype(dtype="float32") + + # 3. get NMR embedded vector + # prepare NMR vectors + batch_length = batch_graph.num_graph + condition_H1nmr = paddle.to_tensor(batch_spectrum["H_nmr"]).reshape( + batch_length, self.seq_len_H1, -1 + ) # TODO: optimize self.seq_len_H1 + condition_C13nmr = paddle.to_tensor(batch_spectrum["C_nmr"]).reshape( + batch_length, self.seq_len_C13 + ) + num_H_peak = paddle.to_tensor(batch_spectrum["num_H_peak"]) + num_C_peak = paddle.to_tensor(batch_spectrum["num_C_peak"]) + condition_Spectrum = [condition_H1nmr, num_H_peak, condition_C13nmr, num_C_peak] + if self.flag_onlyH is True: + global_H, _ = self.encoder(condition_Spectrum) + embeddings_spectrum, _ = global_H + else: + embeddings_spectrum, _ = self.encoder(condition_Spectrum) + + if self.connector_flag is True: + embeddings_spectrum = self.connector.sample(embeddings_spectrum) + + input_y = paddle.concat([input_y, embeddings_spectrum], axis=1).astype( + "float32" + ) + + # 4. Decoder forward + # Convention: pred.X and pred.E are logits with shapes [B, n, Cx] and + # [B, n, n, Ce] + pred = self.decoder(input_X, input_E, input_y, node_mask) + + # 5. Compute training loss + loss_dict = self.train_loss( + masked_pred_X=pred.X, + masked_pred_E=pred.E, + pred_y=pred.y, + true_X=X, + true_E=E, + true_y=paddle.to_tensor(batch_property["y"]), + ) + + # 6. Assemble outputs for Trainer & streaming metrics + # Predictions: provide masked_pred_X/E; mirror X_logits/E_logits for legacy + # paths + pred_dict = { + "masked_pred_X": pred.X, + "masked_pred_E": pred.E, + "pred_y": pred.y, + } + # Labels: provide true_X/true_E; node_mask is optional but useful for some + # metrics + label_dict = { + "true_X": X, + "true_E": E, + "true_y": y, + } + + result = { + "loss_dict": loss_dict, + "pred_dict": pred_dict, + "label_dict": label_dict, + "node_mask": node_mask, + "noisy_data": noisy_data, + } + + return result + + @paddle.no_grad() + def sample(self, batch, i): + batch_graph, other_data = batch + + # transfer to dense graph from sparse graph + if batch_graph.edges.T.numel() == 0: + print("Found a batch with no edges. Skipping.") + return None + + # process data + ( + dense_data, + noisy_data, + node_mask, + extra_data, + input_X, + input_E, + input_y, + ) = self.preprocess_data(batch_graph, other_data) + X, E = dense_data.X, dense_data.E + + # set condition + batch_length = X.shape[0] + conditionVec = other_data["conditionVec"] + y_condition = conditionVec.reshape(batch_length, self.vocabDim) + + # forward of the model + pred = self.forward_MultiModalModel( + input_X, input_E, input_y, node_mask, y_condition + ) + + # evaluate the loss especially in the inference stage + loss = self.train_loss( + masked_pred_X=pred.X, + masked_pred_E=pred.E, + pred_y=pred.y, + true_X=X, + true_E=E, + true_y=other_data["y"], + ) + + batch_length = other_data["y"].shape[0] + conditionAll = other_data["conditionVec"] + conditionAll = conditionAll.reshape(batch_length, self.vocabDim) + + nll = scheduling_diffnmr.compute_val_loss( + self, + pred, + noisy_data, + dense_data.X, + dense_data.E, + other_data["y"], + node_mask, + condition=conditionAll, + test=False, + ) + loss["nll"] = nll + + # save the data for visualization + self.val_y_collection.append(other_data["conditionVec"]) + self.val_atomCount.append(paddle.to_tensor(other_data["atom_count"])) + self.val_data_X.append(X) + self.val_data_E.append(E) + + return loss + + +# PP-DiffNMR +class DiffPrior(nn.Layer): + def __init__( + self, + sample_cfg: dict, + connector_cfg: dict, + clip: nn.Layer, + ): + super().__init__() + + self.clip = clip + self.timesteps = sample_cfg["timesteps"] # TODO: check + self.sample_timesteps = default(sample_cfg["sample_timesteps"], self.timesteps) + self.noise_scheduler = NoiseScheduler( + beta_schedule=sample_cfg["beta_schedule"], + timesteps=sample_cfg["timesteps"], + loss_type=sample_cfg["loss_type"], + ) + if exists(clip): + freeze_model_and_make_eval_(clip) + self.clip = clip + else: + self.clip = None + self.net = DiffPriorNetwork(**connector_cfg) + self.graph_embed_dim = sample_cfg["graph_embed_dim"] + + assert ( + self.net.dim == self.graph_embed_dim + ), f"your diffusion prior network has a dimension of {self.net.dim}, \ + but you set your image embedding dimension (keyword graph_embed_dim) \ + on DiffPrior to {self.graph_embed_dim}" + + self.cond_drop_prob = default(sample_cfg["cond_drop_prob"], 0.0) + self.spectrum_cond_drop_prob = default( + sample_cfg["spectrum_cond_drop_prob"], self.cond_drop_prob + ) + self.graph_cond_drop_prob = default( + sample_cfg["graph_cond_drop_prob"], self.cond_drop_prob + ) + + self.can_classifier_guidance = ( + self.spectrum_cond_drop_prob > 0.0 and self.graph_cond_drop_prob > 0.0 + ) + self.condition_on_spectrum_encodings = default( + sample_cfg["condition_on_spectrum_encodings"], True + ) + + self.predict_x_start = sample_cfg["predict_x_start"] + self.predict_v = sample_cfg["predict_v"] + + self.graph_embed_scale = default( + sample_cfg["graph_embed_scale"], sample_cfg["graph_embed_dim"] ** 0.5 + ) + + self.sampling_clamp_l2norm = sample_cfg["sampling_clamp_l2norm"] + self.sampling_final_clamp_l2norm = sample_cfg["sampling_final_clamp_l2norm"] + + self.training_clamp_l2norm = sample_cfg["training_clamp_l2norm"] + self.init_graph_embed_l2norm = sample_cfg["init_graph_embed_l2norm"] + + # TODO: maybe could remove this dummy buffer + self.register_buffer( + name="_dummy", tensor=paddle.to_tensor(data=[True]), persistable=False + ) + + def forward(self, batch): + + batch_graph = batch["graph"] + batch_property = batch.get("property", {}) + batch_spectrum = batch.get("spectrum", {}) + + # 1. obtain the graph embeddings + if "graph_embed" in batch: + graph_embed = batch["graph_embed"] + elif "graph" in batch: + dense_data, node_mask = diffgraphformer_utils.to_dense( + paddle.to_tensor(batch_graph.node_feat["feat"]), + paddle.to_tensor(batch_graph.edges.T).contiguous(), + paddle.to_tensor(batch_graph.edge_feat["feat"]), + paddle.to_tensor(batch_graph.graph_node_id), + ) + dense_data = dense_data.mask(node_mask) + X, E = dense_data.X, dense_data.E + y = paddle.to_tensor(batch_property["y"]) + z_t = ( + diffgraphformer_utils.PlaceHolder(X=X, E=E, y=y) + .type_as(X) + .mask(node_mask) + ) + extra_data_pure = scheduling_diffnmr.compute_extra_data( + self.clip, + {"X_t": z_t.X, "E_t": z_t.E, "y_t": z_t.y, "node_mask": node_mask}, + isPure=True, + ) + input_X_pure = paddle.concat( + [z_t.X.astype("float32"), extra_data_pure.X], axis=2 + ).astype(dtype="float32") + input_E_pure = paddle.concat( + [z_t.E.astype("float32"), extra_data_pure.E], axis=3 + ).astype(dtype="float32") + input_y_pure = paddle.hstack( + x=(z_t.y.astype("float32"), extra_data_pure.y) + ).astype(dtype="float32") + # obtain the condition vector from output of encoder + graph_embed = self.clip.graph_encoder( + input_X_pure, input_E_pure, input_y_pure, node_mask + ) + + # 2. obtain the spectrum embeddings + spectrum_cond = {} + if "spectrum_embed" in batch: + spectrum_cond["spectrum_embed"] = batch["spectrum_embed"] + if self.condition_on_spectrum_encodings: + spectrum_cond["spectrum_encodings"] = batch["spectrum_encodings"] + elif "spectrum" in batch: + condition_H1nmr = paddle.to_tensor(batch_spectrum["H_nmr"]) + condition_C13nmr = paddle.to_tensor(batch_spectrum["C_nmr"]) + num_H_peak = paddle.to_tensor(batch_spectrum["num_H_peak"]) + num_C_peak = paddle.to_tensor(batch_spectrum["num_C_peak"]) + condition_Spectrum = [ + condition_H1nmr, + num_H_peak, + condition_C13nmr, + num_C_peak, + ] + spectrum_embed, spectrum_encodings = self.clip.spectrum_encoder( + condition_Spectrum + ) + spectrum_cond["spectrum_embed"] = spectrum_embed + if self.condition_on_spectrum_encodings: + spectrum_cond["spectrum_encodings"] = spectrum_encodings + + # 3. diffusion process + batch_size = graph_embed.shape[0] + times = self.noise_scheduler.sample_random_times(batch_size) + graph_embed *= self.graph_embed_scale + + # 4. calculate loss + loss_dict = self.p_losses(graph_embed, times, spectrum_cond=spectrum_cond) + + # 5. retrun restults + return { + "loss_dict": loss_dict, + "pred_dict": { + "graph_embed": graph_embed, + "spectrum_embed": spectrum_cond.get("spectrum_embed"), + "times": times, + }, + "label_dict": {"graph": batch_graph, "property": batch_property}, + } + + def generate_embed_vector(self, batch): + batch_graph, other_data = batch + batch_length = batch_graph.num_graph + # transfer to dense graph from sparse graph + if batch_graph.edges.T.numel() == 0: + print("Found a batch with no edges. Skipping.") + return None + dense_data, node_mask = diffgraphformer_utils.to_dense( + batch_graph.node_feat["feat"], + batch_graph.edges.T.contiguous(), + batch_graph.edge_feat["feat"], + batch_graph.graph_node_id, + ) + dense_data = dense_data.mask(node_mask) + graph_X, graph_E = ( + dense_data.X, + dense_data.E, + ) + graph_y = paddle.zeros(shape=[graph_X.shape[0], 1024]).cuda(blocking=True) + + clip_graph_embeds = self.clip.graph_encoder( + graph_X, graph_E, graph_y, node_mask + ) + + spectrum_conditionVec = other_data["conditionVec"] + spectrum_conditionVec = spectrum_conditionVec.reshape( + [batch_length, self.config["CLIP"]["nmr_encoder"]["max_len"]] + ) + + assert isinstance( + spectrum_conditionVec, paddle.Tensor + ), "nmr_spectrum_conditionVec should be a tensor, but got type {}".format( + type(spectrum_conditionVec) + ) + spectrum_srcMask = self.clip.make_src_mask(spectrum_conditionVec) + + clip_spectrum_embeds = self.clip.spectrum_encoder( + spectrum_conditionVec, spectrum_srcMask + ) + clip_spectrum_embeds = clip_spectrum_embeds.reshape( + [clip_spectrum_embeds.shape[0], -1] + ) + clip_spectrum_embeds = self.clip.spectrum_encoder_projector( + clip_spectrum_embeds + ) + + return clip_graph_embeds, clip_spectrum_embeds + + def p_losses(self, moleculargraph_embed, times, spectrum_cond, noise=None): + noise = default( + noise, + lambda: paddle.randn( + shape=moleculargraph_embed.shape, dtype=moleculargraph_embed.dtype + ), + ) + + moleculargraph_embed_noisy = self.noise_scheduler.q_sample( + x_start=moleculargraph_embed, t=times, noise=noise + ) + + self_cond = None + if self.net.self_cond and random.random() < 0.5: + with paddle.no_grad(): + self_cond = self.net( + moleculargraph_embed_noisy, times, **spectrum_cond + ).detach() + + pred = self.net( + moleculargraph_embed_noisy, + times, + self_cond=self_cond, + spectrum_cond_drop_prob=self.spectrum_cond_drop_prob, + graph_cond_drop_prob=self.graph_cond_drop_prob, + **spectrum_cond, + ) + + if self.predict_x_start and self.training_clamp_l2norm: + pred = self.l2norm_clamp_embed(pred) + + if self.predict_v: + target = self.noise_scheduler.calculate_v( + moleculargraph_embed, times, noise + ) + elif self.predict_x_start: + target = moleculargraph_embed + else: + target = noise + + loss = self.noise_scheduler.loss_fn(pred, target) + + return {"loss": loss} + + def l2norm_clamp_embed(self, graph): + return l2norm(graph) * self.graph_embed_scale + + @paddle.no_grad() + def sample( + self, + spectrum_embeds, + spectrum_encodings, + num_samples_per_batch=2, + cond_scale=1.0, + timesteps=None, # mask + ): + timesteps = default(timesteps, self.sample_timesteps) + + spectrum_embeds = repeat( + spectrum_embeds, "b ... -> (b r) ...", r=num_samples_per_batch + ) + # mask = repeat(mask, "b ... -> (b r) ...", r=num_samples_per_batch) + + batch_size = tuple(spectrum_embeds.shape)[0] + graph_embed_dim = self.graph_embed_dim + + # spectrum_embeds = self.clip.spectrum_encoder(spectrum, mask) + # spectrum_embeds = spectrum_embeds.reshape([spectrum_embeds.shape[0], -1]) + # spectrum_embeds = self.clip.spectrum_encoder_projector(spectrum_embeds) + + spectrum_cond = dict(spectrum_embed=spectrum_embeds) + + if self.condition_on_spectrum_encodings: + spectrum_cond = {**spectrum_cond, "spectrum_encodings": spectrum_encodings} + + graph_embeds = self.p_sample_loop( + (batch_size, graph_embed_dim), + spectrum_cond=spectrum_cond, + cond_scale=cond_scale, + timesteps=timesteps, + ) + + # retrieve original unscaled image embed + + spectrum_embeds = spectrum_cond["spectrum_embed"] + + spectrum_embeds = rearrange( + spectrum_embeds, "(b r) d -> b r d", r=num_samples_per_batch + ) + graph_embeds = rearrange( + graph_embeds, "(b r) d -> b r d", r=num_samples_per_batch + ) + + spectrum_image_sims = paddle.einsum( + "b r d, b r d -> b r", l2norm(spectrum_embeds), l2norm(graph_embeds) + ) + top_sim_indices = spectrum_image_sims.topk(k=1)[1] + + top_sim_indices = repeat(top_sim_indices, "b 1 -> b 1 d", d=graph_embed_dim) + + top_graph_embeds = graph_embeds.take_along_axis( + axis=1, indices=top_sim_indices, broadcast=False + ) + return rearrange(top_graph_embeds, "b 1 d -> b d") + + @paddle.no_grad() + def p_sample_loop(self, *args, timesteps=None, **kwargs): + timesteps = default(timesteps, self.noise_scheduler.num_timesteps) + assert timesteps <= self.noise_scheduler.num_timesteps + is_ddim = timesteps < self.noise_scheduler.num_timesteps + if not is_ddim: + normalized_graph_embed = self.p_sample_loop_ddpm(*args, **kwargs) + else: + normalized_graph_embed = self.p_sample_loop_ddim( + *args, **kwargs, timesteps=timesteps + ) + graph_embed = normalized_graph_embed / self.graph_embed_scale + return graph_embed + + @paddle.no_grad() + def p_sample_loop_ddpm(self, shape, spectrum_cond, cond_scale=1.0): + batch = shape[0] + graph_embed = paddle.randn(shape=shape) + x_start = None + if self.init_graph_embed_l2norm: + graph_embed = l2norm(graph_embed) * self.graph_embed_scale + for i in tqdm( + reversed(range(0, self.noise_scheduler.num_timesteps)), + desc="diffprior sampling", + total=self.noise_scheduler.num_timesteps, + ): + times = paddle.full(shape=(batch,), fill_value=i, dtype="int64") + self_cond = x_start if self.net.self_cond else None + graph_embed, x_start = self.p_sample( + graph_embed, + times, + spectrum_cond=spectrum_cond, + self_cond=self_cond, + cond_scale=cond_scale, + ) + if self.sampling_final_clamp_l2norm and self.predict_x_start: + graph_embed = self.l2norm_clamp_embed(graph_embed) + return graph_embed + + @paddle.no_grad() + def p_sample_loop_ddim( + self, shape, spectrum_cond, *, timesteps, eta=1.0, cond_scale=1.0 + ): + batch, alphas, total_timesteps = ( + shape[0], + self.noise_scheduler.alphas_cumprod_prev, + self.noise_scheduler.num_timesteps, + ) + times = paddle.linspace(start=-1.0, stop=total_timesteps, num=timesteps + 1)[ + :-1 + ] + times = list(reversed(times.astype(dtype="int32").tolist())) + time_pairs = list(zip(times[:-1], times[1:])) + graph_embed = paddle.randn(shape=shape) + x_start = None + if self.init_graph_embed_l2norm: + graph_embed = l2norm(graph_embed) * self.graph_embed_scale + for time, time_next in tqdm(time_pairs, desc="diffprior sampling"): + alpha = alphas[time] + alpha_next = alphas[time_next] + time_cond = paddle.full(shape=(batch,), fill_value=time, dtype="int64") + self_cond = x_start if self.net.self_cond else None + pred = self.net.forward_with_cond_scale( + graph_embed, + time_cond, + self_cond=self_cond, + cond_scale=cond_scale, + **spectrum_cond, + ) + if self.predict_v: + x_start = self.noise_scheduler.predict_start_from_v( + graph_embed, t=time_cond, v=pred + ) + elif self.predict_x_start: + x_start = pred + else: + x_start = self.noise_scheduler.predict_start_from_noise( + graph_embed, t=time_cond, noise=pred + ) + if not self.predict_x_start: + x_start.clip_(min=-1.0, max=1.0) + if self.predict_x_start and self.sampling_clamp_l2norm: + x_start = self.l2norm_clamp_embed(x_start) + pred_noise = self.noise_scheduler.predict_noise_from_start( + graph_embed, t=time_cond, x0=x_start + ) + if time_next < 0: + graph_embed = x_start + continue + c1 = ( + eta * ((1 - alpha / alpha_next) * (1 - alpha_next) / (1 - alpha)).sqrt() + ) + c2 = (1 - alpha_next - paddle.square(x=c1)).sqrt() + noise = ( + paddle.randn(shape=graph_embed.shape, dtype=graph_embed.dtype) + if time_next > 0 + else 0.0 + ) + graph_embed = x_start * alpha_next.sqrt() + c1 * noise + c2 * pred_noise + if self.predict_x_start and self.sampling_final_clamp_l2norm: + graph_embed = self.l2norm_clamp_embed(graph_embed) + return graph_embed + + @paddle.no_grad() + def p_sample( + self, + x, + t, + spectrum_cond=None, + self_cond=None, + clip_denoised=True, + cond_scale=1.0, + ): + ( + b, + *_, + ) = x.shape + model_mean, _, model_log_variance, x_start = self.p_mean_variance( + x=x, + t=t, + spectrum_cond=spectrum_cond, + self_cond=self_cond, + clip_denoised=clip_denoised, + cond_scale=cond_scale, + ) + noise = paddle.randn(shape=x.shape, dtype=x.dtype) + nonzero_mask = (1 - (t == 0).astype(dtype="float32")).reshape( + b, *((1,) * (len(tuple(x.shape)) - 1)) + ) + pred = model_mean + nonzero_mask * (0.5 * model_log_variance).exp() * noise + return pred, x_start + + def p_mean_variance( + self, x, t, spectrum_cond, self_cond=None, clip_denoised=False, cond_scale=1.0 + ): + assert not ( + cond_scale != 1.0 and not self.can_classifier_guidance + ), "the model was not trained with conditional dropout, and thus one cannot \ + use classifier free guidance (cond_scale anything other than 1)" + pred = self.net.forward_with_cond_scale( + x, t, cond_scale=cond_scale, self_cond=self_cond, **spectrum_cond + ) + if self.predict_v: + x_start = self.noise_scheduler.predict_start_from_v(x, t=t, v=pred) + elif self.predict_x_start: + x_start = pred + else: + x_start = self.noise_scheduler.predict_start_from_noise(x, t=t, noise=pred) + if clip_denoised and not self.predict_x_start: + x_start.clip_(min=-1.0, max=1.0) + if self.predict_x_start and self.sampling_clamp_l2norm: + x_start = l2norm(x_start) * self.graph_embed_scale + ( + model_mean, + posterior_variance, + posterior_log_variance, + ) = self.noise_scheduler.q_posterior(x_start=x_start, x_t=x, t=t) + return model_mean, posterior_variance, posterior_log_variance, x_start diff --git a/ppmat/models/diffnmr/diffusion_prior.py b/ppmat/models/diffnmr/diffusion_prior.py new file mode 100644 index 00000000..cb35f6b2 --- /dev/null +++ b/ppmat/models/diffnmr/diffusion_prior.py @@ -0,0 +1,535 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import paddle +import paddle.nn as nn +from einops import rearrange +from einops import repeat +from einops.layers.paddle import Rearrange +from paddle.incubate.nn.functional import fused_rotary_position_embedding + +from ppmat.models.common.sinusoidal_embedding import SinusoidalPosEmbeddings +from ppmat.models.diffnmr.utils.diffprior_utils import default +from ppmat.models.diffnmr.utils.diffprior_utils import exists +from ppmat.models.diffnmr.utils.diffprior_utils import l2norm + + +class DiffPriorNetwork(nn.Layer): + def __init__( + self, + dim, + num_timesteps=None, + num_time_embeds=1, + num_graph_embeds=1, + num_spectrum_embeds=1, + max_spectrum_len=256, + self_cond=False, + **kwargs, + ): + super().__init__() + self.dim = dim + self.num_time_embeds = num_time_embeds + self.num_graph_embeds = num_graph_embeds + self.num_spectrum_embeds = num_spectrum_embeds + self.to_spectrum_embeds = paddle.nn.Sequential( + paddle.nn.Linear(in_features=dim, out_features=dim * num_spectrum_embeds) + if num_spectrum_embeds > 1 + else paddle.nn.Identity(), + Rearrange("b (n d) -> b n d", n=num_spectrum_embeds), + ) + self.continuous_embedded_time = not exists(num_timesteps) + self.to_time_embeds = paddle.nn.Sequential( + paddle.nn.Embedding( + num_embeddings=num_timesteps, embedding_dim=dim * num_time_embeds + ) + if exists(num_timesteps) + else paddle.nn.Sequential( + SinusoidalPosEmbeddings(dim), MLP(dim, dim * num_time_embeds) + ), + Rearrange("b (n d) -> b n d", n=num_time_embeds), + ) + self.to_graph_embeds = paddle.nn.Sequential( + paddle.nn.Linear(in_features=dim, out_features=dim * num_graph_embeds) + if num_graph_embeds > 1 + else paddle.nn.Identity(), + Rearrange("b (n d) -> b n d", n=num_graph_embeds), + ) + self.learned_query = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[dim]) + ) + self.causal_transformer = CausalTransformer(dim=dim, **kwargs) + self.max_spectrum_len = max_spectrum_len + self.null_spectrum_encodings = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[1, max_spectrum_len, dim]) + ) + self.null_spectrum_embeds = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[1, num_spectrum_embeds, dim]) + ) + self.null_graph_embed = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[1, dim]) + ) + self.self_cond = self_cond + + def forward_with_cond_scale(self, *args, cond_scale=1.0, **kwargs): + logits = self.forward(*args, **kwargs) + + if cond_scale == 1: + return logits + + null_logits = self.forward( + *args, spectrum_cond_drop_prob=1.0, graph_cond_drop_prob=1, **kwargs + ) + return null_logits + (logits - null_logits) * cond_scale + + def forward( + self, + graph_embed, + diffusion_timesteps, + *, + spectrum_embed, + spectrum_encodings=None, + self_cond=None, + spectrum_cond_drop_prob=0.0, + graph_cond_drop_prob=0.0, + ): + batch, dim, dtype = ( + *tuple(graph_embed.shape), + graph_embed.dtype, + ) + + # num_time_embeds, num_graph_embeds, num_spectrum_embeds = ( + # self.num_time_embeds, + # self.num_graph_embeds, + # self.num_spectrum_embeds, + # ) # TODO: check it from original dalle2 repo + + # setup self conditioning + if self.self_cond: + self_cond = default( + self_cond, lambda: paddle.zeros(shape=[batch, self.dim], dtype=dtype) + ) + self_cond = rearrange(self_cond, "b d -> b 1 d") + + # in section 2.2 of DALLE-2 paper, last paragraph + # "..consisting of encoded spectrum, CLIP spectrum embedding, diffusion timestep + # embedding, noised CLIP image embedding, final embedding for prediction" + spectrum_embed = self.to_spectrum_embeds(spectrum_embed) + graph_embed = self.to_graph_embeds(graph_embed) + + # classifier free guidance masks + spectrum_keep_mask = prob_mask_like((batch,), 1 - spectrum_cond_drop_prob) + spectrum_keep_mask = rearrange(spectrum_keep_mask, "b -> b 1 1") + + image_keep_mask = prob_mask_like((batch,), 1 - graph_cond_drop_prob) + image_keep_mask = rearrange(image_keep_mask, "b -> b 1 1") + if not exists(spectrum_encodings): + spectrum_encodings = paddle.empty(shape=(batch, 0, dim), dtype=dtype) + + # make spectrum encodings optional + # although the paper seems to suggest it is present + if not exists(spectrum_encodings): + spectrum_encodings = paddle.empty(shape=(batch, 0, dim), dtype=dtype) + + if spectrum_encodings.shape[1] == 0: + mask = paddle.zeros(shape=(batch, 0), dtype=bool) + else: + mask = paddle.any(x=spectrum_encodings != 0.0, axis=-1) + + # replace any padding in the spectrum encodings with learned + # padding tokens unique across position + spectrum_encodings = spectrum_encodings[:, : self.max_spectrum_len] + mask = mask[:, : self.max_spectrum_len] + + spectrum_len = tuple(spectrum_encodings.shape)[-2] + remainder = self.max_spectrum_len - spectrum_len + + if remainder > 0: + spectrum_encodings = nn.functional.pad( + x=spectrum_encodings, + pad=(0, 0, 0, remainder), + value=0.0, + pad_from_left_axis=False, + ) + mask = mask.astype(paddle.int32) + mask = nn.functional.pad( + x=mask, pad=(0, remainder), value=0, pad_from_left_axis=False + ).astype("bool") + + # mask out spectrum encodings with null encodings + null_spectrum_encodings = self.null_spectrum_encodings.to( + spectrum_encodings.dtype + ) + + spectrum_encodings = paddle.where( + condition=rearrange(mask, "b n -> b n 1").clone() & spectrum_keep_mask, + x=spectrum_encodings, + y=null_spectrum_encodings, + ) + + # mask out spectrum embeddings with null spectrum embeddings + null_spectrum_embeds = self.null_spectrum_embeds.to(spectrum_embed.dtype) + + spectrum_embed = paddle.where( + condition=spectrum_keep_mask, x=spectrum_embed, y=null_spectrum_embeds + ) + + # mask out image embeddings with null image embeddings + null_graph_embed = self.null_graph_embed.to(graph_embed.dtype) + + graph_embed = paddle.where( + condition=image_keep_mask, x=graph_embed, y=null_graph_embed + ) + + # whether spectrum embedding is used for conditioning depends on whether + # spectrum encodings are available for attention (for classifier free guidance, + # even though it seems from the paper it was not used in the prior ddpm, + # as the objective is different) + # but let's just do it right + if self.continuous_embedded_time: + diffusion_timesteps = diffusion_timesteps.astype(dtype) + + time_embed = self.to_time_embeds(diffusion_timesteps) + + learned_queries = repeat(self.learned_query, "d -> b 1 d", b=batch) + + if self.self_cond: + learned_queries = paddle.concat(x=(self_cond, learned_queries), axis=-2) + + tokens = paddle.concat( + x=( + spectrum_encodings, + spectrum_embed, + time_embed, + graph_embed, + learned_queries, + ), + axis=-2, + ) + + # attend + tokens = self.causal_transformer(tokens) + + # get learned query, which should predict image embedding (per DDPM timestep) + pred_graph_embed = tokens[..., -1, :] + + return pred_graph_embed + + +class CausalTransformer(nn.Layer): + def __init__( + self, + *, + dim, + depth, + dim_head=64, + heads=8, + ff_mult=4, + norm_in=False, + norm_out=True, + attn_dropout=0.0, + ff_dropout=0.0, + final_proj=True, + normformer=False, + rotary_emb=True, + ): + super().__init__() + self.init_norm = ( + LayerNorm(dim) if norm_in else nn.Identity() + ) # from latest BLOOM model and Yandex's YaLM + + self.rel_pos_bias = RelPosBias(heads=heads) + + rotary_emb = fused_rotary_position_embedding if rotary_emb else None + + self.layers = nn.LayerList([]) + for _ in range(depth): + self.layers.append( + nn.LayerList( + [ + Attention( + dim=dim, + causal=True, + dim_head=dim_head, + heads=heads, + dropout=attn_dropout, + rotary_emb=rotary_emb, + ), + FeedForward( + dim=dim, + mult=ff_mult, + dropout=ff_dropout, + post_activation_norm=normformer, + ), + ] + ) + ) + + self.norm = ( + LayerNorm(dim, stable=True) if norm_out else nn.Identity() + ) # unclear in paper whether they projected after the classic layer norm for + # the final denoised image embedding, or just had the transformer + # output it directly: plan on offering both options + + self.project_out = ( + nn.Linear(dim, dim, bias_attr=False) if final_proj else nn.Identity() + ) + + def forward(self, x): + n = x.shape[1] + + x = self.init_norm(x) + + attn_bias = self.rel_pos_bias(n, n + 1) + + for attn, ff in self.layers: + x = attn(x, attn_bias=attn_bias) + x + x = ff(x) + x + + out = self.norm(x) + return self.project_out(out) + + +class MLP(paddle.nn.Layer): + def __init__(self, dim_in, dim_out, *, expansion_factor=2.0, depth=2, norm=False): + super().__init__() + hidden_dim = int(expansion_factor * dim_out) + norm_fn = ( # noqa + lambda: paddle.nn.LayerNorm(normalized_shape=hidden_dim) + if norm + else paddle.nn.Identity() + ) + layers = [ + paddle.nn.Sequential( + paddle.nn.Linear(in_features=dim_in, out_features=hidden_dim), + paddle.nn.Silu(), + norm_fn(), + ) + ] + for _ in range(depth - 1): + layers.append( + paddle.nn.Sequential( + paddle.nn.Linear(in_features=hidden_dim, out_features=hidden_dim), + paddle.nn.Silu(), + norm_fn(), + ) + ) + layers.append(paddle.nn.Linear(in_features=hidden_dim, out_features=dim_out)) + self.net = paddle.nn.Sequential(*layers) + + def forward(self, x): + return self.net(x.astype(dtype="float32")) + + +class LayerNorm(paddle.nn.Layer): + def __init__(self, dim, eps=1e-05, fp16_eps=0.001, stable=False): + super().__init__() + self.eps = eps + self.fp16_eps = fp16_eps + self.stable = stable + self.g = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.ones(shape=dim) + ) + + def forward(self, x): + eps = self.eps if x.dtype == "float32" else self.fp16_eps + if self.stable: + x = x / x.amax(axis=-1, keepdim=True).detach() + var = paddle.var(x=x, axis=-1, unbiased=False, keepdim=True) + mean = paddle.mean(x=x, axis=-1, keepdim=True) + return (x - mean) * (var + eps).rsqrt() * self.g + + +class RelPosBias(paddle.nn.Layer): + def __init__(self, heads=8, num_buckets=32, max_distance=128): + super().__init__() + self.num_buckets = num_buckets + self.max_distance = max_distance + self.relative_attention_bias = paddle.nn.Embedding( + num_embeddings=num_buckets, embedding_dim=heads + ) + + @staticmethod + def _relative_position_bucket(relative_position, num_buckets=32, max_distance=128): + n = -relative_position + n = paddle.maximum(n, paddle.zeros_like(x=n)) + max_exact = num_buckets // 2 + is_small = n < max_exact + val_if_large = max_exact + ( + paddle.log(x=n.astype(dtype="float32") / max_exact) + / math.log(max_distance / max_exact) + * (num_buckets - max_exact) + ).astype(dtype="int64") + val_if_large = paddle.min( + paddle.stack( + [ + val_if_large, + paddle.full_like(x=val_if_large, fill_value=num_buckets - 1), + ] + ), + axis=0, + ) + return paddle.where(condition=is_small, x=n, y=val_if_large) + + def forward(self, i, j): + q_pos = paddle.arange(dtype="int64", end=i) + k_pos = paddle.arange(dtype="int64", end=j) + rel_pos = rearrange(k_pos, "j -> 1 j") - rearrange(q_pos, "i -> i 1") + rp_bucket = self._relative_position_bucket( + rel_pos, num_buckets=self.num_buckets, max_distance=self.max_distance + ) + values = self.relative_attention_bias(rp_bucket) + return rearrange(values, "i j h -> h i j") + + +class Attention(nn.Layer): + def __init__( + self, + dim, + *, + dim_head=64, + heads=8, + dropout=0.0, + causal=False, + rotary_emb=None, + cosine_sim=True, + cosine_sim_scale=16, + ): + super().__init__() + self.scale = cosine_sim_scale if cosine_sim else dim_head**-0.5 + self.cosine_sim = cosine_sim + self.heads = heads + inner_dim = dim_head * heads + self.causal = causal + self.norm = LayerNorm(dim) + self.dropout = paddle.nn.Dropout(p=dropout) + self.null_kv = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.randn(shape=[2, dim_head]) + ) + self.to_q = paddle.nn.Linear( + in_features=dim, out_features=inner_dim, bias_attr=False + ) + self.to_kv = paddle.nn.Linear( + in_features=dim, out_features=dim_head * 2, bias_attr=False + ) + self.rotary_emb = rotary_emb + self.to_out = paddle.nn.Sequential( + paddle.nn.Linear(in_features=inner_dim, out_features=dim, bias_attr=False), + LayerNorm(dim), + ) + + def forward(self, x, mask=None, attn_bias=None): + b, n = tuple(x.shape)[:2] # 获取输入的batch_size和序列长度 + x = self.norm(x) # 归一化 + + q, k, v = self.to_q(x), *self.to_kv(x).chunk( + chunks=2, axis=-1 + ) # q linear mapping; generate concatenated representation of kv, + # split evenly into k and v along the -1 dimension + + # Multi-head splitting and scaling + q = rearrange(q, "b n (h d) -> b n h d", h=self.heads) + q = q * self.scale # 有助于数值稳定 + k = rearrange(k, "b n (h d) -> b n h d", h=1) + + # Apply rotary position encoding + if exists(self.rotary_emb): + q, k, _ = self.rotary_emb(q, k) + q = rearrange(q, "b n h d -> b h n d", h=self.heads) + k = rearrange(k, "b n h d -> b n (h d)", h=1) + + # Add empty key-value kv + nk, nv = map( + lambda t: repeat(t, "d -> b 1 d", b=b), self.null_kv.unbind(axis=-2) + ) + k = paddle.concat(x=(nk, k), axis=-2) + v = paddle.concat(x=(nv, v), axis=-2) + + # Optional cosine similarity normalization + if self.cosine_sim: + q, k = map(l2norm, (q, k)) # Normalize their lengths to 1, + # and the attention score computation becomes cosine similarity + + # Quadratic scaling + q, k = map(lambda t: t * math.sqrt(self.scale), (q, k)) + + # Compute similarity matrix + sim = paddle.einsum("b h i d, b j d -> b h i j", q, k) + # i represents the position in the query sequence, j represents the + # position in the key sequence + + # Add attention bias + if exists(attn_bias): + sim = sim + attn_bias # 调整注意力分数 + + # Masking processing + max_neg_value = -paddle.finfo(dtype=sim.dtype).max + if exists(mask): + mask = paddle.nn.functional.pad( + x=mask, pad=(1, 0), value=True, pad_from_left_axis=False + ) + mask = rearrange(mask, "b j -> b 1 1 j") + sim = sim.masked_fill(mask=~mask, value=max_neg_value) + + # Causal masking processing + if self.causal: + i, j = tuple(sim.shape)[-2:] + causal_mask = paddle.ones(shape=(i, j), dtype="bool").triu( + diagonal=j - i + 1 + ) + sim = sim.masked_fill(mask=causal_mask, value=max_neg_value) + + # Compute attention weights and apply Dropout + attn = paddle.nn.functional.softmax(sim, axis=-1, dtype="float32") + attn = attn.astype(sim.dtype) + attn = self.dropout(attn) + + # Compute attention output + out = paddle.einsum("b h i j, b j d -> b h i d", attn, v) + out = rearrange(out, "b h n d -> b n (h d)") + return self.to_out(out) + + +def FeedForward(dim, mult=4, dropout=0.0, post_activation_norm=False): + """post-activation norm https://arxiv.org/abs/2110.09456""" + inner_dim = int(mult * dim) + return paddle.nn.Sequential( + LayerNorm(dim), + paddle.nn.Linear(in_features=dim, out_features=inner_dim * 2, bias_attr=False), + SwiGLU(), + LayerNorm(inner_dim) if post_activation_norm else paddle.nn.Identity(), + paddle.nn.Dropout(p=dropout), + paddle.nn.Linear(in_features=inner_dim, out_features=dim, bias_attr=False), + ) + + +class SwiGLU(paddle.nn.Layer): + """used successfully in https://arxiv.org/abs/2204.0231""" + + def forward(self, x): + x, gate = x.chunk(chunks=2, axis=-1) + return x * paddle.nn.functional.silu(x=gate) + + +def prob_mask_like(shape, prob): + if prob == 1: + return paddle.ones(shape=shape, dtype="bool") + elif prob == 0: + return paddle.zeros(shape=shape, dtype="bool") + else: + return ( + paddle.zeros(shape=shape).astype(dtype="float32").uniform_(min=0, max=1) + < prob + ) diff --git a/ppmat/models/diffnmr/extra_features_graph.py b/ppmat/models/diffnmr/extra_features_graph.py new file mode 100644 index 00000000..7ef94341 --- /dev/null +++ b/ppmat/models/diffnmr/extra_features_graph.py @@ -0,0 +1,522 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.diffnmr.utils import diffgraphformer_utils + + +class DummyExtraFeatures: + def __init__(self): + """This class does not compute anything, just returns empty tensors.""" + + def __call__(self, noisy_data): + X = noisy_data["X_t"] + E = noisy_data["E_t"] + y = noisy_data["y_t"] + + empty_x = paddle.zeros(shape=X.shape[:-1] + [0], dtype=X.dtype) + empty_e = paddle.zeros(shape=E.shape[:-1] + [0], dtype=E.dtype) + empty_y = paddle.zeros(shape=[y.shape[0], 0], dtype=y.dtype) + + return diffgraphformer_utils.PlaceHolder(X=empty_x, E=empty_e, y=empty_y) + + +class ExtraFeatures: + def __init__(self, extra_features_type, dataset_infos): + self.max_n_nodes = dataset_infos.max_n_nodes + self.ncycles = NodeCycleFeatures() + self.features_type = extra_features_type + if extra_features_type in ["eigenvalues", "all"]: + self.eigenfeatures = EigenFeatures(mode=extra_features_type) + + def __call__(self, noisy_data): + # n: (bs,1) + mask_sum = paddle.sum(noisy_data["node_mask"], axis=1, keepdim=False) # (bs,) + n = paddle.unsqueeze(mask_sum, axis=1) / self.max_n_nodes # (bs,1) + + # x_cycles, y_cycles: (bs, ?) + x_cycles, y_cycles = self.ncycles(noisy_data) # (bs, n_cycles) + + if self.features_type == "cycles": + E = noisy_data["E_t"] + extra_edge_attr = paddle.zeros(shape=E.shape[:-1] + [0], dtype=E.dtype) + + # 等效于 torch.hstack((n, y_cycles)) => concat along axis=1 + # 假设 n shape (bs,1), y_cycles shape (bs,k) + # => result shape (bs, 1+k) + y_stacked = paddle.concat([n, y_cycles], axis=1) + + return diffgraphformer_utils.PlaceHolder( + X=x_cycles, E=extra_edge_attr, y=y_stacked + ) + + elif self.features_type == "eigenvalues": + eigenfeatures = self.eigenfeatures(noisy_data) + E = noisy_data["E_t"] + extra_edge_attr = paddle.zeros(shape=E.shape[:-1] + [0], dtype=E.dtype) + + n_components, batched_eigenvalues = eigenfeatures # (bs,1), (bs,10) + + # hstack => concat along axis=1 + y_stacked = paddle.concat( + [n, y_cycles, n_components.astype(n.dtype), batched_eigenvalues], axis=1 + ) + + return diffgraphformer_utils.PlaceHolder( + X=x_cycles, E=extra_edge_attr, y=y_stacked + ) + + elif self.features_type == "all": + eigenfeatures = self.eigenfeatures(noisy_data) + E = noisy_data["E_t"] + extra_edge_attr = paddle.zeros(shape=E.shape[:-1] + [0], dtype=E.dtype) + + ( + n_components, + batched_eigenvalues, + nonlcc_indicator, + k_lowest_eigvec, + ) = eigenfeatures + # X = concat [x_cycles, nonlcc_indicator, k_lowest_eigvec] along last dim + X_cat = paddle.concat( + [x_cycles, nonlcc_indicator, k_lowest_eigvec], axis=-1 + ) + + # y = hstack => concat along axis=1 + y_stacked = paddle.concat( + [n, y_cycles, n_components.astype(n.dtype), batched_eigenvalues], axis=1 + ) + + return diffgraphformer_utils.PlaceHolder( + X=X_cat, E=extra_edge_attr, y=y_stacked + ) + + else: + raise ValueError(f"Features type {self.features_type} not implemented") + + +class NodeCycleFeatures: + def __init__(self): + self.kcycles = KNodeCycles() + + def __call__(self, noisy_data): + # adj_matrix: (bs, n, n), 取 E_t[...,1:] 并在最后一维 sum => shape (bs, n, n) + E_t = noisy_data["E_t"] + adj_matrix = paddle.sum(E_t[..., 1:], axis=-1).astype("float32") # (bs, n, n) + + x_cycles, y_cycles = self.kcycles.k_cycles( + adj_matrix=adj_matrix + ) # (bs, n_cycles) + + # x_cycles 与 node_mask 对应位置相乘 + node_mask = paddle.unsqueeze(noisy_data["node_mask"], axis=-1) # (bs, n, 1) + x_cycles = x_cycles.astype(adj_matrix.dtype) * node_mask.astype( + adj_matrix.dtype + ) + + # Avoid large values when the graph is dense + x_cycles = x_cycles / 10 + y_cycles = y_cycles / 10 + + # 类似 x_cycles[x_cycles > 1] = 1 + # Paddle 不支持直接 in-place boolean mask;需要先构造mask再赋值 + bool_mask_x = x_cycles > 1 + bool_mask_y = y_cycles > 1 + x_cycles = paddle.where(bool_mask_x, paddle.ones_like(x_cycles), x_cycles) + y_cycles = paddle.where(bool_mask_y, paddle.ones_like(y_cycles), y_cycles) + + return x_cycles, y_cycles + + +class EigenFeatures: + """ + Code taken from : https://github.com/Saro00/DGN/blob/master/models/pytorch/eigen_agg.py + """ + + def __init__(self, mode): + """mode: 'eigenvalues' or 'all'""" + self.mode = mode + + def __call__(self, noisy_data): + E_t = noisy_data["E_t"] + mask = noisy_data["node_mask"].astype("float32") + A = paddle.sum(E_t[..., 1:], axis=-1).astype("float32") # (bs, n, n) + A = A * paddle.unsqueeze(mask, axis=1) * paddle.unsqueeze(mask, axis=2) + + L = compute_laplacian(A, normalize=False) + + # 添加正则化项以防止计算失败 + n_ = L.shape[-1] + eps_eye = paddle.eye(n_, dtype=L.dtype) * 1e-6 + L = L + eps_eye + # 强制对称化 + L = (L + paddle.transpose(L, perm=[0, 2, 1])) / 2 + + # 构造对 mask 外节点的惩罚项 + mask_diag = paddle.eye(n_, dtype=L.dtype) * (2 * n_) + mask_diag = paddle.unsqueeze(mask_diag, axis=0) # (1, n, n) + # (~mask) => paddle.logical_not + # mask_bool = mask.astype("bool") + mask_diag = ( + mask_diag + * paddle.logical_not(paddle.unsqueeze(mask, 1)).astype(mask_diag.dtype) + * paddle.logical_not(paddle.unsqueeze(mask, 2)).astype(mask_diag.dtype) + ) + + L = ( + L * paddle.unsqueeze(mask, axis=1) * paddle.unsqueeze(mask, axis=2) + + mask_diag + ) + + if self.mode == "eigenvalues": + # paddle.linalg.eigvalsh => (bs, n) + eigvals = paddle.linalg.eigvalsh(L) # (bs, n) + sum_mask = paddle.sum(mask, axis=1, keepdim=True) + eigvals = eigvals.astype(A.dtype) / sum_mask # (bs,n) + + n_connected_comp, batch_eigenvalues = get_eigenvalues_features(eigvals) + return (n_connected_comp.astype(A.dtype), batch_eigenvalues.astype(A.dtype)) + + elif self.mode == "all": + try: + eigvals, eigvectors = paddle.linalg.eigh(L) # (bs,n), (bs,n,n) + except Exception as e: + print(f"Warning: Eigen decomposition failed with linalg.eigh: {e}") + # 回退到 SVD + U, S, Vh = paddle.linalg.svd(L) + eigvals = S + eigvectors = paddle.transpose(Vh, perm=[0, 2, 1]) + print("Using SVD as fallback method.") + + sum_mask = paddle.sum(mask, axis=1, keepdim=True) + eigvals = eigvals.astype(A.dtype) / sum_mask + eigvectors = ( + eigvectors + * paddle.unsqueeze(mask, axis=2) + * paddle.unsqueeze(mask, axis=1) + ) + + # Retrieve eigenvalues features + n_connected_comp, batch_eigenvalues = get_eigenvalues_features(eigvals) + + # Retrieve eigenvectors features + nonlcc_indicator, k_lowest_eigvec = get_eigenvectors_features( + vectors=eigvectors, node_mask=mask, n_connected=n_connected_comp + ) + return ( + n_connected_comp, + batch_eigenvalues, + nonlcc_indicator, + k_lowest_eigvec, + ) + else: + raise NotImplementedError(f"Mode {self.mode} is not implemented") + + +def compute_laplacian(adjacency, normalize: bool): + """ + adjacency : batched adjacency matrix (bs, n, n) + normalize: can be None, 'sym' or 'rw' + """ + diag = paddle.sum(adjacency, axis=-1) # (bs, n) + n = diag.shape[-1] + D = paddle.diag_embed(diag) # (bs, n, n) + combinatorial = D - adjacency # (bs, n, n) + + if not normalize: + return (combinatorial + paddle.transpose(combinatorial, perm=[0, 2, 1])) / 2 + + diag0 = diag.clone() + diag = paddle.where(diag == 0, paddle.to_tensor(1e-12, dtype=diag.dtype), diag) + diag_norm = 1.0 / paddle.sqrt(diag) # (bs, n) + D_norm = paddle.diag_embed(diag_norm) # (bs, n, n) + eye_n = paddle.unsqueeze(paddle.eye(n, dtype=adjacency.dtype), axis=0) # (1, n, n) + + L = eye_n - D_norm @ adjacency @ D_norm + # For nodes where diag0 == 0, set their corresponding positions to 0 + zero_mask = (diag0 == 0).astype(L.dtype) # (bs, n) + # Need to broadcast to (bs, n, n), can first use unsqueeze + zero_mask_2d = paddle.unsqueeze(zero_mask, axis=-1) # (bs, n, 1) + zero_mask_2d = paddle.matmul( + zero_mask_2d, paddle.ones_like(zero_mask_2d).transpose([0, 2, 1]) + ) + # Set the corresponding position in L to 0 + L = paddle.where(zero_mask_2d > 0, paddle.zeros_like(L), L) + return (L + paddle.transpose(L, perm=[0, 2, 1])) / 2 + + +def get_eigenvalues_features(eigenvalues, k=5): + """ + eigenvalues: (bs, n) + k: num of non zero eigenvalues to keep + """ + ev = eigenvalues + bs, n = ev.shape + # n_connected_components = (ev < 1e-5).sum(dim=-1) + n_connected_components = paddle.sum(ev < 1e-5, axis=-1) # (bs,) + + # TODO:Assertion: May need to handle errors here or add a check + # assert (n_connected_components > 0).all(), "some assert..." + + to_extend = max(n_connected_components.numpy()) + k - n + if to_extend > 0: + fill_val = paddle.full(shape=[bs, to_extend], fill_value=2.0, dtype=ev.dtype) + ev_extended = paddle.concat([ev, fill_val], axis=1) # (bs, n+to_extend) + else: + ev_extended = ev + + # indices => shape (bs,k) + # range(k) + n_connected_components.unsqueeze(1) + range_k = paddle.arange(k, dtype="int64") # (k,) + range_k = paddle.unsqueeze(range_k, axis=0) # (1,k) + indices = range_k + paddle.unsqueeze( + n_connected_components.astype("int64"), axis=1 + ) # (bs,k) + + first_k_ev = batch_gather_2d(ev_extended, indices) + + n_connected_components = paddle.unsqueeze(n_connected_components, axis=-1) # (bs,1) + return n_connected_components, first_k_ev + + +def batch_gather_2d(data, index): + bs, m = data.shape + _, k = index.shape + row_idx = paddle.arange(bs, dtype="int64") + row_idx = paddle.unsqueeze(row_idx, axis=-1) # (bs,1) + row_idx = paddle.expand(row_idx, [bs, k]) # (bs,k) + + flat_indices = paddle.stack([row_idx.flatten(), index.flatten()], axis=1) + + gathered = paddle.gather_nd(data, flat_indices) # (bs*k,) + + gathered = paddle.reshape(gathered, [bs, k]) + return gathered + + +def get_eigenvectors_features(vectors, node_mask, n_connected, k=2): + """ + vectors (bs, n, n) : eigenvectors of Laplacian IN COLUMNS + returns: + not_lcc_indicator : indicator vectors of largest connected component (lcc) for + each graph -- (bs, n, 1) + k_lowest_eigvec : k first eigenvectors for the largest connected component + -- (bs, n, k) + """ + bs, n = vectors.shape[0], vectors.shape[1] + first_ev = paddle.round(vectors[:, :, 0] * 10**3) * node_mask + random = paddle.randn(shape=[bs, n]) * (~node_mask.astype("bool")).astype("float32") + first_ev = first_ev + random * 10**3 + most_common = paddle.mode(x=first_ev, axis=1)[0] # TODO + mask = ~(first_ev == most_common.unsqueeze(axis=1)) + not_lcc_indicator = ( + (mask * node_mask.astype("bool")).unsqueeze(axis=-1).astype(dtype="float32") + ) + + # Get the eigenvectors corresponding to the first nonzero eigenvalues + to_extend = max(n_connected) + k - n + if to_extend > 0: + vectors = paddle.concat( + x=( + vectors, + paddle.zeros(shape=[bs, n, to_extend]).astype(dtype=vectors.dtype), + ), + axis=2, + ) + indices = paddle.arange(end=k).astype(dtype=vectors.dtype).astype( + dtype="int64" + ).unsqueeze(axis=0).unsqueeze(axis=0) + n_connected.unsqueeze(axis=2) + indices = indices.expand(shape=[-1, n, -1]) + first_k_ev = paddle.take_along_axis( + arr=vectors, axis=2, indices=indices, broadcast=False + ) + first_k_ev = first_k_ev * node_mask.unsqueeze(axis=2) + return not_lcc_indicator, first_k_ev + + +# ====================================== +# 8. batch_trace, batch_diagonal +# ====================================== +def batch_trace(X): + """ + X: shape (bs, n, n) + Return the trace for each sample trace => shape (bs,) + """ + diag = paddle.diagonal(X, axis1=-2, axis2=-1) # (bs, n) + return paddle.sum(diag, axis=-1) + + +def batch_diagonal(X): + """ + X: shape (bs, n, n) + Return its diagonal => (bs, n) + """ + return paddle.diagonal(X, axis1=-2, axis2=-1) + + +# ====================================== +# 9. KNodeCycles +# ====================================== +class KNodeCycles: + """Builds cycle counts for each node in a graph.""" + + def __init__(self): + super().__init__() + + def calculate_kpowers(self): + self.k1_matrix = self.adj_matrix.astype("float32") + self.d = paddle.sum(self.adj_matrix, axis=-1) # (bs,n) + self.k2_matrix = paddle.matmul( + self.k1_matrix, self.adj_matrix.astype("float32") + ) + self.k3_matrix = paddle.matmul( + self.k2_matrix, self.adj_matrix.astype("float32") + ) + self.k4_matrix = paddle.matmul( + self.k3_matrix, self.adj_matrix.astype("float32") + ) + self.k5_matrix = paddle.matmul( + self.k4_matrix, self.adj_matrix.astype("float32") + ) + self.k6_matrix = paddle.matmul( + self.k5_matrix, self.adj_matrix.astype("float32") + ) + + def k3_cycle(self): + c3 = batch_diagonal(self.k3_matrix) + x3 = (c3 / 2.0).unsqueeze(-1).astype("float32") + y3 = (paddle.sum(c3, axis=-1) / 6.0).unsqueeze(-1).astype("float32") + return x3, y3 + + def k4_cycle(self): + diag_a4 = batch_diagonal(self.k4_matrix) # (bs,n) + c4 = ( + diag_a4 + - self.d * (self.d - 1) + - paddle.sum( + paddle.matmul(self.adj_matrix, paddle.unsqueeze(self.d, axis=-1)), + axis=-1, + ) + ) + x4 = (c4 / 2.0).unsqueeze(-1).astype("float32") + y4 = (paddle.sum(c4, axis=-1) / 8.0).unsqueeze(-1).astype("float32") + return x4, y4 + + def k5_cycle(self): + diag_a5 = batch_diagonal(self.k5_matrix) # (bs,n) + triangles = batch_diagonal(self.k3_matrix) / 2.0 # (bs,n) + + joint_cycles = self.k2_matrix * self.adj_matrix # (bs,n,n) + prod = 2 * paddle.matmul(joint_cycles, self.d.unsqueeze(-1)).squeeze(-1) + prod2 = 2 * paddle.matmul(self.adj_matrix, triangles.unsqueeze(-1)).squeeze(-1) + + c5 = diag_a5 - prod - 4.0 * self.d * triangles - prod2 + 10.0 * triangles + x5 = (c5 / 2.0).unsqueeze(-1).astype("float32") + y5 = (paddle.sum(c5, axis=-1) / 10.0).unsqueeze(-1).astype("float32") + return x5, y5 + + def k6_cycle(self): + term_1_t = batch_trace(self.k6_matrix) + term_2_t = batch_trace(paddle.pow(self.k3_matrix, 2.0)) + term3_t = paddle.sum( + self.adj_matrix * paddle.pow(self.k2_matrix, 2.0), axis=[-2, -1] + ) + d_t4 = batch_diagonal(self.k2_matrix) + a_4_t = batch_diagonal(self.k4_matrix) + term_4_t = paddle.sum(d_t4 * a_4_t, axis=-1) + term_5_t = batch_trace(self.k4_matrix) + term_6_t = batch_trace(self.k3_matrix) + term_7_t = paddle.sum(paddle.pow(batch_diagonal(self.k2_matrix), 3.0), axis=-1) + term8_t = paddle.sum(self.k3_matrix, axis=[-2, -1]) + term9_t = paddle.sum(paddle.pow(batch_diagonal(self.k2_matrix), 2.0), axis=-1) + term10_t = batch_trace(self.k2_matrix) + + c6_t = ( + term_1_t + - 3.0 * term_2_t + + 9.0 * term3_t + - 6.0 * term_4_t + + 6.0 * term_5_t + - 4.0 * term_6_t + + 4.0 * term_7_t + + 3.0 * term8_t + - 12.0 * term9_t + + 4.0 * term10_t + ) + y6 = (c6_t / 12.0).unsqueeze(-1).astype("float32") + return None, y6 + + def k_cycles(self, adj_matrix, verbose=False): + """ + adj_matrix: (bs, n, n) + return: (kcyclesx, kcyclesy) + """ + self.adj_matrix = adj_matrix + self.calculate_kpowers() + + k3x, k3y = self.k3_cycle() + assert paddle.all(k3x >= -0.1) + + k4x, k4y = self.k4_cycle() + assert paddle.all(k4x >= -0.1) + + k5x, k5y = self.k5_cycle() + assert paddle.all(k5x >= -0.1), k5x + + _, k6y = self.k6_cycle() + assert paddle.all(k6y >= -0.1) + + kcyclesx = paddle.concat([k3x, k4x, k5x], axis=-1) # (bs, n, 3) + kcyclesy = paddle.concat([k3y, k4y, k5y, k6y], axis=-1) # (bs, ncycles?) + return kcyclesx, kcyclesy + + +# ============== +# Some auxiliary functions +# ============== + + +def paddle_mode(tensor, axis=1): + """ + approximate torch.mode(...).values function, returning the most frequently + occurring element along the given axis. + Note: Now, Paddle does not have a direct mode API, so here's a simplified approach: + 1. turn tensor into numpy + 2. call scipy.stats or numpy method to find mode + 3. return paddle.Tensor + If your scenario has high performance requirements, you may implement a more + efficient native statistical method for Paddle. + """ + import numpy as np + + data_np = tensor.numpy() + # Calculate the mode for each row + # if you have scipy, then you can use scipy.stats.mode directly: + # from scipy.stats import mode + # m = mode(data_np, axis=axis, keepdims=False).mode + # here is pure inplementation of numpy: + bs = data_np.shape[0] + modes = [] + for i in range(bs): + vals, counts = np.unique(data_np[i], return_counts=True) + max_count_idx = np.argmax(counts) + modes.append(vals[max_count_idx]) + modes_np = np.array(modes).reshape([-1]) # shape (bs,) + return paddle.to_tensor(modes_np, dtype=tensor.dtype) + + +def round_to_decimals(tensor, decimals=3): + factor = 10**decimals + return paddle.round(tensor * factor) / factor diff --git a/ppmat/models/diffnmr/extra_features_molecular_graph.py b/ppmat/models/diffnmr/extra_features_molecular_graph.py new file mode 100644 index 00000000..cba944d0 --- /dev/null +++ b/ppmat/models/diffnmr/extra_features_molecular_graph.py @@ -0,0 +1,140 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle + +from ppmat.models.diffnmr.utils import diffgraphformer_utils + + +class ExtraMolecularFeatures: + def __init__(self, dataset_infos): + """ + dataset_infos: + - remove_h: whether to remove hydrogens (bool) + - valencies: dict or list, maximum/possible valences for each atom + - max_weight: maximum value used for normalizing molecular weight + - atom_weights: dict, recording the atomic weight of each type of atom + (such as {'H':1, 'C':12, ...}) + """ + self.charge = ChargeFeature( + remove_h=dataset_infos.remove_h, valencies=dataset_infos.valencies + ) + self.valency = ValencyFeature() + self.weight = WeightFeature( + max_weight=dataset_infos.max_weight, atom_weights=dataset_infos.atom_weights + ) + + def __call__(self, noisy_data): + """ + Calculate and concatenate molecule/atom additional features: + Atomic charge (charge) + Atomic actual valence (valency) + Molecular weight (weight) Return diffgraphformer_utils.PlaceHolder in (X, E, y) + format. + """ + # charge / valency => (bs, n, 1) + charge = paddle.unsqueeze(self.charge(noisy_data), axis=-1) + valency = paddle.unsqueeze(self.valency(noisy_data), axis=-1) + # weight => (bs, 1) + weight = self.weight(noisy_data) + + # Edge-level additional features are defaulted to empty (bs, n, n, 0) + E_t = noisy_data["E_t"] + extra_edge_attr = paddle.zeros(shape=E_t.shape[:-1] + [0], dtype=E_t.dtype) + + # Concatenate charge and valence to the last dimension X: (bs, n, 2) + x_cat = paddle.concat([charge, valency], axis=-1) + + return diffgraphformer_utils.PlaceHolder(X=x_cat, E=extra_edge_attr, y=weight) + + +class ChargeFeature: + def __init__(self, remove_h, valencies): + self.remove_h = remove_h + self.valencies = valencies + + def __call__(self, noisy_data): + """ + Estimate the net charge of each atom = (ideal valence - current bonding number). + bond_orders = [0, 1, 2, 3, 1.5] + represent: no bond / single bond / double bond / triple bond / aromatic bond. + """ + E_t = noisy_data["E_t"] + dtype_ = E_t.dtype + + bond_orders = paddle.to_tensor([0, 1, 2, 3, 1.5], dtype=dtype_) + bond_orders = paddle.reshape(bond_orders, [1, 1, 1, -1]) # (1,1,1,5) + + # E_t * bond_orders => (bs, n, n, de),取 argmax => (bs, n, n),再 sum => (bs,n) + weighted_E = E_t * bond_orders + current_valencies = paddle.argmax(weighted_E, axis=-1) # (bs, n, n) + current_valencies = paddle.sum(current_valencies, axis=-1) # (bs, n) + + # Calculate ideal valence state + X_t = noisy_data["X_t"] + valency_tensor = paddle.to_tensor( + self.valencies, dtype=X_t.dtype + ) # shape (dx,) + valency_tensor = paddle.reshape(valency_tensor, [1, 1, -1]) # (1,1,dx) + X_val = X_t * valency_tensor # (bs, n, dx) + normal_valencies = paddle.argmax(X_val, axis=-1) # (bs, n) + + # Charge = (Ideal Valence - Current Bonding Number) + charge = normal_valencies - current_valencies + return charge.astype(X_t.dtype) + + +class ValencyFeature: + def __init__(self): + pass + + def __call__(self, noisy_data): + """ + Calculate the actual valence state of each atom + (determined solely by the current bond type). + """ + E_t = noisy_data["E_t"] + dtype_ = E_t.dtype + orders = paddle.to_tensor([0, 1, 2, 3, 1.5], dtype=dtype_) + orders = paddle.reshape(orders, [1, 1, 1, -1]) # (1,1,1,5) + + E_weighted = E_t * orders # (bs, n, n, de) + valencies = paddle.argmax(E_weighted, axis=-1) # (bs, n, n) + valencies = paddle.sum(valencies, axis=-1) # (bs, n) + + X_t = noisy_data["X_t"] + return valencies.astype(X_t.dtype) + + +class WeightFeature: + def __init__(self, max_weight, atom_weights): + """Set weights for each type of atom based on their atomic weight. + + Args: + max_weight (Int): Max weight of atom + to normalize the total molecular mass. + atom_weights (Dict): Atomic weight of each atom. + """ + self.max_weight = max_weight + self.atom_weight_list = paddle.to_tensor( + list(atom_weights.values()), dtype="float32" + ) + + def __call__(self, noisy_data): + X = paddle.argmax(noisy_data["X_t"], axis=-1) # (bs, n) + X_weights = self.atom_weight_list[X] # (bs, n) + return ( + X_weights.sum(axis=-1).unsqueeze(-1).astype(noisy_data["X_t"].dtype) + / self.max_weight + ) # (bs, 1) diff --git a/ppmat/models/diffnmr/graph_transformer.py b/ppmat/models/diffnmr/graph_transformer.py new file mode 100644 index 00000000..58d0e0f1 --- /dev/null +++ b/ppmat/models/diffnmr/graph_transformer.py @@ -0,0 +1,547 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import paddle +import paddle.nn as nn +from paddle.nn import functional as F + +from ppmat.models.diffnmr.utils import diffgraphformer_utils +from ppmat.schedulers import scheduling_diffnmr + + +class GraphTransformer(nn.Layer): + """ + n_layers : int -- number of layers + dims : dict -- contains dimensions for each feature type + """ + + def __init__( + self, + n_layers: int, + input_dims: dict, + hidden_mlp_dims: dict, + hidden_dims: dict, + output_dims: dict, + act_fn_in=nn.ReLU(), + act_fn_out=nn.ReLU(), + ): + super().__init__() + self.n_layers = n_layers + self.out_dim_X = output_dims["X"] + self.out_dim_E = output_dims["E"] + self.out_dim_y = output_dims["y"] + + self.mlp_in_X = nn.Sequential( + nn.Linear(input_dims["X"], hidden_mlp_dims["X"]), + act_fn_in, + nn.Linear(hidden_mlp_dims["X"], hidden_dims["dx"]), + act_fn_in, + ) + + self.mlp_in_E = nn.Sequential( + nn.Linear(input_dims["E"], hidden_mlp_dims["E"]), + act_fn_in, + nn.Linear(hidden_mlp_dims["E"], hidden_dims["de"]), + act_fn_in, + ) + + self.mlp_in_y = nn.Sequential( + nn.Linear(input_dims["y"], hidden_mlp_dims["y"]), + act_fn_in, + nn.Linear(hidden_mlp_dims["y"], hidden_dims["dy"]), + act_fn_in, + ) + + self.tf_layers = nn.LayerList( + [ + XEyTransformerLayer( + dx=hidden_dims["dx"], + de=hidden_dims["de"], + dy=hidden_dims["dy"], + n_head=hidden_dims["n_head"], + dim_ffX=hidden_dims["dim_ffX"], + dim_ffE=hidden_dims["dim_ffE"], + ) + for _ in range(n_layers) + ] + ) + + self.mlp_out_X = ( + nn.Sequential( + nn.Linear(hidden_dims["dx"], hidden_mlp_dims["X"]), + act_fn_out, + nn.Linear(hidden_mlp_dims["X"], output_dims["X"]), + ) + if output_dims["X"] != 0 + else self.mlp_with_empty + ) + + self.mlp_out_E = ( + nn.Sequential( + nn.Linear(hidden_dims["de"], hidden_mlp_dims["E"]), + act_fn_out, + nn.Linear(hidden_mlp_dims["E"], output_dims["E"]), + ) + if output_dims["E"] != 0 + else self.mlp_with_empty + ) + + self.mlp_out_y = ( + nn.Sequential( + nn.Linear(hidden_dims["dy"], hidden_mlp_dims["y"]), + act_fn_out, + nn.Linear(hidden_mlp_dims["y"], output_dims["y"]), + ) + if output_dims["y"] != 0 + else self.mlp_with_empty + ) + + def mlp_with_empty(self, x): + new_shape = x.shape[:-1] + [0] + res = diffgraphformer_utils.return_empty(x, shape=new_shape) + return res + + def forward(self, X, E, y, node_mask): + bs, n = X.shape[0], X.shape[1] + diag_mask = paddle.eye(n) + diag_mask = ~diag_mask.astype(E.dtype).astype("bool") + diag_mask = diag_mask.unsqueeze(0).unsqueeze(-1).expand([bs, -1, -1, -1]) + + X_to_out = X[..., : self.out_dim_X] + E_to_out = E[..., : self.out_dim_E] + y_to_out = y[..., : self.out_dim_y] + + # Initial processing for X, E, y + new_E = self.mlp_in_E(E) + new_E = (new_E + new_E.transpose([0, 2, 1, 3])) / 2 + X = self.mlp_in_X(X) + y = self.mlp_in_y(y) + + after_in = diffgraphformer_utils.PlaceHolder(X, E=new_E, y=y).mask(node_mask) + X, E, y = after_in.X, after_in.E, after_in.y + + # Transformer layers + for layer in self.tf_layers: + X, E, y = layer(X, E, y, node_mask) + + # Output layers + X = self.mlp_out_X(X) + E = self.mlp_out_E(E) + y = self.mlp_out_y(y) + + X = X + X_to_out + E = (E + E_to_out) * diag_mask.astype(E.dtype) + y = y + y_to_out + + # Symmetrize E + E = 0.5 * (E + paddle.transpose(E, perm=[0, 2, 1, 3])) + + return diffgraphformer_utils.PlaceHolder(X=X, E=E, y=y).mask(node_mask) + + +class MolecularEncoder(nn.Layer): + """ + n_layers : int -- number of layers + dims : dict -- contains dimensions for each feature type + """ + + def __init__( + self, + n_layers: int, + input_dims: dict, + hidden_mlp_dims: dict, + hidden_dims: dict, + output_dims: dict, + act_fn_in=nn.ReLU(), + act_fn_out=nn.ReLU(), + ): + super().__init__() + self.n_layers = n_layers + self.out_dim_X = output_dims["X"] + self.out_dim_E = output_dims["E"] + self.out_dim_y = output_dims["y"] + + self.mlp_in_X = nn.Sequential( + nn.Linear(input_dims["X"], hidden_mlp_dims["X"]), + act_fn_in, + nn.Linear(hidden_mlp_dims["X"], hidden_dims["dx"]), + act_fn_in, + ) + + self.mlp_in_E = nn.Sequential( + nn.Linear(input_dims["E"], hidden_mlp_dims["E"]), + act_fn_in, + nn.Linear(hidden_mlp_dims["E"], hidden_dims["de"]), + act_fn_in, + ) + + self.mlp_in_y = nn.Sequential( + nn.Linear(input_dims["y"], hidden_mlp_dims["y"]), + act_fn_in, + nn.Linear(hidden_mlp_dims["y"], hidden_dims["dy"]), + act_fn_in, + ) + + self.tf_layers = nn.LayerList( + [ + XEyTransformerLayer( + dx=hidden_dims["dx"], + de=hidden_dims["de"], + dy=hidden_dims["dy"], + n_head=hidden_dims["n_head"], + dim_ffX=hidden_dims["dim_ffX"], + dim_ffE=hidden_dims["dim_ffE"], + ) + for _ in range(n_layers) + ] + ) + + self.mlp_out_X = nn.Sequential( + nn.Linear(hidden_dims["dx"], hidden_mlp_dims["X"]), + act_fn_out, + nn.Linear(hidden_mlp_dims["X"], 512), + ) + + def forward(self, X, E, y, node_mask): + """ + X: (bs, n, input_dims['X']) + E: (bs, n, n, input_dims['E']) + y: (bs, input_dims['y']) + node_mask: (bs, n) + """ + bs, n = X.shape[0], X.shape[1] + + diag_mask = paddle.eye(n, dtype="int64") # (n, n) + diag_mask = paddle.logical_not(diag_mask) + diag_mask = ( + diag_mask.unsqueeze(0).unsqueeze(-1).expand([bs, -1, -1, -1]) + ) # (bs,n,n,1) + + # MLP in + new_E = self.mlp_in_E(E) + # symmetrize + E_t = paddle.transpose(new_E, perm=[0, 2, 1, 3]) + new_E = (new_E + E_t) / 2.0 + + X = self.mlp_in_X(X) + Y = self.mlp_in_y(y) + + after_in = diffgraphformer_utils.PlaceHolder(X, E=new_E, y=Y).mask(node_mask) + X, E, Y = after_in.X, after_in.E, after_in.y + + for layer in self.tf_layers: + X, E, Y = layer(X, E, Y, node_mask) + + # Output + X = self.mlp_out_X(X) # (bs, n, 512) + X_mean = paddle.mean(X, axis=1) # (bs, 512) + + return X_mean + + +class XEyTransformerLayer(nn.Layer): + """Transformer that updates node, edge and global features + d_x: node features + d_e: edge features + dz : global features + n_head: the number of heads in the multi_head_attention + dim_feedforward: the dimension of the feedforward network model after self-attention + dropout: dropout probablility. 0 to disable + layer_norm_eps: eps value in layer normalizations. + """ + + def __init__( + self, + dx: int, + de: int, + dy: int, + n_head: int, + dim_ffX: int = 2048, + dim_ffE: int = 128, + dim_ffy: int = 2048, + dropout: float = 0, # TODO: 0.1, + layer_norm_eps: float = 1e-5, + ) -> None: + super().__init__() + + self.self_attn = NodeEdgeBlock(dx, de, dy, n_head) + + self.linX1 = nn.Linear(dx, dim_ffX) + self.linX2 = nn.Linear(dim_ffX, dx) + self.normX1 = nn.LayerNorm(dx, epsilon=layer_norm_eps) + self.normX2 = nn.LayerNorm(dx, epsilon=layer_norm_eps) + self.dropoutX1 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + self.dropoutX2 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + self.dropoutX3 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + + self.linE1 = nn.Linear(de, dim_ffE) + self.linE2 = nn.Linear(dim_ffE, de) + self.normE1 = nn.LayerNorm(de, epsilon=layer_norm_eps) + self.normE2 = nn.LayerNorm(de, epsilon=layer_norm_eps) + self.dropoutE1 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + self.dropoutE2 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + self.dropoutE3 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + + self.lin_y1 = nn.Linear(dy, dim_ffy) + self.lin_y2 = nn.Linear(dim_ffy, dy) + self.norm_y1 = nn.LayerNorm(dy, epsilon=layer_norm_eps) + self.norm_y2 = nn.LayerNorm(dy, epsilon=layer_norm_eps) + self.dropout_y1 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + self.dropout_y2 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + self.dropout_y3 = nn.Dropout(dropout) if dropout > 0.0 else nn.Identity() + + self.activation = F.relu + + def forward(self, X, E, y, node_mask): + """Pass the input through the encoder layer. + X: (bs, n, d) + E: (bs, n, n, d) + y: (bs, dy) + node_mask: (bs, n) Mask for the src keys per batch (optional) + Output: newX, newE, new_y with the same shape. + """ + newX, newE, new_y = self.self_attn(X, E, y, node_mask=node_mask) + + newX_d = self.dropoutX1(newX) + X = self.normX1(X + newX_d) + + newE_d = self.dropoutE1(newE) + E = self.normE1(E + newE_d) + + new_y_d = self.dropout_y1(new_y) + y = self.norm_y1(y + new_y_d) + + ff_outputX = self.linX2(self.dropoutX2(self.activation(self.linX1(X)))) + ff_outputX = self.dropoutX3(ff_outputX) + X = self.normX2(X + ff_outputX) + + ff_outputE = self.linE2(self.dropoutE2(self.activation(self.linE1(E)))) + ff_outputE = self.dropoutE3(ff_outputE) + E = self.normE2(E + ff_outputE) + + ff_output_y = self.lin_y2(self.dropout_y2(self.activation(self.lin_y1(y)))) + ff_output_y = self.dropout_y3(ff_output_y) + y = self.norm_y2(y + ff_output_y) + + return X, E, y + + +class NodeEdgeBlock(nn.Layer): + """Self attention layer that also updates the representations on the edges.""" + + def __init__(self, dx, de, dy, n_head): + super().__init__() + assert dx % n_head == 0, f"dx: {dx} -- n_head: {n_head}" + self.dx = dx + self.de = de + self.dy = dy + self.df = int(dx / n_head) + self.n_head = n_head + + # Attention + self.q = nn.Linear(dx, dx) + self.k = nn.Linear(dx, dx) + self.v = nn.Linear(dx, dx) + + # FiLM E to X + self.e_add = nn.Linear(de, dx) + self.e_mul = nn.Linear(de, dx) + + # FiLM y to E + self.y_e_mul = nn.Linear(dy, dx) + self.y_e_add = nn.Linear(dy, dx) + + # FiLM y to X + self.y_x_mul = nn.Linear(dy, dx) + self.y_x_add = nn.Linear(dy, dx) + + # Process y + self.y_y = nn.Linear(dy, dy) + self.x_y = Xtoy(dx, dy) + self.e_y = Etoy(de, dy) + + # Output layers + self.x_out = nn.Linear(dx, dx) + self.e_out = nn.Linear(dx, de) + self.y_out = nn.Sequential(nn.Linear(dy, dy), nn.ReLU(), nn.Linear(dy, dy)) + + def forward(self, X, E, y, node_mask): + """ + :param X: bs, n, d node features + :param E: bs, n, n, d edge features + :param y: bs, dz global features + :param node_mask: bs, n + :return: newX, newE, new_y with the same shape. + """ + bs, n, _ = X.shape + x_mask = paddle.unsqueeze(node_mask, axis=-1).astype(X.dtype) # bs, n, 1 + e_mask1 = paddle.unsqueeze(x_mask, axis=2) # bs, n, 1, 1 + e_mask2 = paddle.unsqueeze(x_mask, axis=1) # bs, 1, n, 1 + + # 1. Map X to keys and queries + Q = self.q(X) * x_mask + K = self.k(X) * x_mask + scheduling_diffnmr.assert_correctly_masked(Q, x_mask) + + # 2. Reshape to (bs, n, n_head, df) with dx = n_head * df + Q = paddle.reshape(Q, (Q.shape[0], Q.shape[1], self.n_head, self.df)) + K = paddle.reshape(K, (K.shape[0], K.shape[1], self.n_head, self.df)) + + Q = paddle.unsqueeze(Q, axis=2) # (bs, 1, n, n_head, df) (bs, n, 1, n_head, df) + K = paddle.unsqueeze(K, axis=1) # (bs, n, 1, n head, df) (bs, 1, n, n_head, df) + + # Compute unnormalized attentions. Y is (bs, n, n, n_head, df) + Y = Q * K + Y = Y / math.sqrt(Y.shape[-1]) + scheduling_diffnmr.assert_correctly_masked(Y, (e_mask1 * e_mask2).unsqueeze(-1)) + + E1 = self.e_mul(E) * e_mask1 * e_mask2 # bs, n, n, dx + E1 = paddle.reshape( + E1, (E.shape[0], E.shape[1], E.shape[2], self.n_head, self.df) + ) + + E2 = self.e_add(E) * e_mask1 * e_mask2 # bs, n, n, dx + E2 = paddle.reshape( + E2, (E.shape[0], E.shape[1], E.shape[2], self.n_head, self.df) + ) + + # Incorporate edge features to the self attention scores. + Y = Y * (E1 + 1) + E2 # (bs, n, n, n_head, df) + + # Incorporate y to E + newE = paddle.flatten(Y, start_axis=3) # bs, n, n, dx + ye1 = paddle.unsqueeze( + paddle.unsqueeze(self.y_e_add(y), axis=1), axis=1 + ) # bs, 1, 1, de + ye2 = paddle.unsqueeze(paddle.unsqueeze(self.y_e_mul(y), axis=1), axis=1) + newE = ye1 + (ye2 + 1) * newE + + # Output E + newE = self.e_out(newE) * e_mask1 * e_mask2 + scheduling_diffnmr.assert_correctly_masked(newE, e_mask1 * e_mask2) + + # Compute attentions. attn is still (bs, n, n, n_head, df) + softmax_mask = paddle.expand( + e_mask2, shape=(-1, n, -1, self.n_head) + ) # bs, 1, n, 1 bs,n,n,n_head + attn = masked_softmax(Y, softmax_mask, axis=2) # bs, n, n, n_head, df + + V = self.v(X) * x_mask # bs, n, dx + V = paddle.reshape(V, (V.shape[0], V.shape[1], self.n_head, self.df)) + V = paddle.unsqueeze(V, axis=1) # (bs, 1, n, n_head, df) + + # Compute weighted values + weighted_V = attn * V + weighted_V = paddle.sum(weighted_V, axis=2) + + # Send output to input dim + weighted_V = paddle.flatten(weighted_V, start_axis=2) # bs, n, dx + + # Incorporate y to X + yx1 = paddle.unsqueeze(self.y_x_add(y), axis=1) + yx2 = paddle.unsqueeze(self.y_x_mul(y), axis=1) + newX = yx1 + (yx2 + 1) * weighted_V + + # Output X + newX = self.x_out(newX) * x_mask + + # Process y based on X axnd E + y = self.y_y(y) + e_y = self.e_y(E, e_mask1, e_mask2) + x_y = self.x_y(X, x_mask) + new_y = y + x_y + e_y + new_y = self.y_out(new_y) # bs, dy + + return newX, newE, new_y + + +class Xtoy(nn.Layer): + def __init__(self, dx, dy): + """Map node features to global features""" + super().__init__() + self.lin = paddle.nn.Linear(in_features=4 * dx, out_features=dy) + + def forward(self, X, x_mask): + """X: bs, n, dx.""" + x_mask = paddle.expand(x_mask, shape=[-1, -1, X.shape[-1]]) + float_imask = 1 - x_mask.astype("float32") + m = paddle.sum(X, axis=1) / paddle.sum(x_mask, axis=1) + mi = paddle.min(X + 1e6 * float_imask, axis=1) + ma = paddle.max(X - 1e6 * float_imask, axis=1) + std = paddle.sum((X - m.unsqueeze(1)) ** 2 * x_mask, axis=1) / paddle.sum( + x_mask, axis=1 + ) + z = paddle.concat([m, mi, ma, std], axis=1) + out = self.lin(z) + return out + + +class Etoy(nn.Layer): + def __init__(self, d, dy): + """Map edge features to global features.""" + super().__init__() + self.lin = paddle.nn.Linear(in_features=4 * d, out_features=dy) + + def forward(self, E, e_mask1, e_mask2): + """ + E: bs, n, n, de + Features relative to the diagonal of E could potentially be added. + """ + mask = paddle.expand(e_mask1 * e_mask2, shape=[-1, -1, -1, E.shape[-1]]) + float_imask = 1 - mask.astype("float32") + divide = paddle.sum(mask, axis=(1, 2)) + m = paddle.sum(E, axis=(1, 2)) / divide + mi = paddle.min(paddle.min(E + 1e6 * float_imask, axis=2), axis=1) + ma = paddle.max(paddle.max(E - 1e6 * float_imask, axis=2), axis=1) + std = ( + paddle.sum((E - m.unsqueeze(1).unsqueeze(1)) ** 2 * mask, axis=(1, 2)) + / divide + ) + z = paddle.concat([m, mi, ma, std], axis=1) + out = self.lin(z) + return out + + +def masked_softmax(x, mask, axis=-1): + """ + Perform softmax over masked values in `x`. + + Args: + x: Tensor, the input data. + mask: Tensor, the binary mask of the same shape as `x`. + axis: The axis to apply softmax. + + Returns: + Tensor with masked softmax applied. + """ + if paddle.sum(mask) == 0: + return x + + # TODO: ndim check: only support adding dimensions backwards now + x_dims = x.ndim + mask_dims = mask.ndim + if mask_dims < x_dims: + diff = x_dims - mask_dims + mask = paddle.unsqueeze(mask, axis=[-1] * diff) + repeat_times = [1] * mask_dims + [x.shape[i] for i in range(mask_dims, x_dims)] + mask = paddle.tile(mask, repeat_times=repeat_times) + + x_masked = x.clone() + x_masked = paddle.where( + mask == 0, paddle.to_tensor(-float("inf"), dtype=x.dtype), x_masked + ) + + return paddle.nn.functional.softmax(x_masked, axis=axis) diff --git a/ppmat/models/diffnmr/nmr_encoder.py b/ppmat/models/diffnmr/nmr_encoder.py new file mode 100644 index 00000000..6170ceea --- /dev/null +++ b/ppmat/models/diffnmr/nmr_encoder.py @@ -0,0 +1,608 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F + + +class H1nmr_encoder(nn.Layer): + def __init__( + self, + d_model, + dim_feedforward, + n_head, + num_layers, + drop_prob, + peakwidthemb_num, + integralemb_num, + ): + super(H1nmr_encoder, self).__init__() + + # for src padding mask + self.num_heads = n_head + + self.embed = H1nmr_embedding( + dim=d_model, + drop_prob=drop_prob, + peakwidthemb_num=peakwidthemb_num, + integralemb_num=integralemb_num, + ) + + # Transformer Encoder + encoder_layer = nn.TransformerEncoderLayer( + d_model=d_model, + nhead=n_head, + dim_feedforward=dim_feedforward, + dropout=drop_prob, + ) + self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) + + def forward(self, x, src_mask): + # input format: [batch, len_peak, feat_dim] + x_emb = self.embed(x, src_mask) + + # process for src_key_padding_mask + pad_mask = src_mask == 1 + bsz, src_len, _ = x_emb.shape + pad_mask = pad_mask.reshape([bsz, 1, 1, src_len]).expand( + [-1, self.num_heads, src_len, -1] + ) + + out = self.encoder(src=x_emb, src_mask=pad_mask) + return out + + +class C13nmr_encoder(nn.Layer): + def __init__(self, d_model, dim_feedforward, n_head, num_layers, drop_prob): + super(C13nmr_encoder, self).__init__() + + # for src padding mask + self.num_heads = n_head + + self.embed = C13nmr_embedding(dim=d_model, drop_prob=drop_prob) + # Transformer Encoder + encoder_layer = nn.TransformerEncoderLayer( + d_model=d_model, + nhead=n_head, + dim_feedforward=dim_feedforward, + dropout=drop_prob, + normalize_before=False, + ) + self.encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers) + + def forward(self, x, src_mask): + # input format: [batch, len_peak, feat_dim] + x_emb = self.embed(x, src_mask) + + # process for src_key_padding_mask + pad_mask = src_mask == 1 + bsz, src_len, _ = x_emb.shape + pad_mask = pad_mask.reshape([bsz, 1, 1, src_len]).expand( + [-1, self.num_heads, src_len, -1] + ) + + out = self.encoder(src=x_emb, src_mask=pad_mask) + return out + + +class MaskedAttentionPool(nn.Layer): + def __init__(self, dim): + super(MaskedAttentionPool, self).__init__() + self.attention = nn.Sequential( + nn.Linear(dim, 128), + nn.Tanh(), + nn.Linear(128, 1), + ) # 移除了Softmax,需手动处理 + + def forward(self, x, mask=None): + # x: [batch, seq_len, dim] + # mask: [batch, seq_len] (1: valid,0: pad) + attn_scores = self.attention(x) # [batch, seq_len, 1] + + # add mask processing + if mask is not None: + # Set the attention scores at padding positions to -∞, + # resulting in zero weight after Softmax + attn_scores = attn_scores.masked_fill( + mask.unsqueeze(-1) == 0, -float("inf") + ) + + attn_weights = F.softmax(attn_scores, axis=1) # [batch, seq_len, 1] + return (x * attn_weights).sum(axis=1) # [batch, dim] + + +class NMR_fusion(nn.Layer): + def __init__( + self, + dim_h=1024, + dim_c=256, + hidden_dim=512, + n_head=8, + out_dim=512, + bi_crossattn_fusion_mode="", + pool_mode="", + crossmodal_fusion_mode="", + ): + super(NMR_fusion, self).__init__() + + # projection layer + self.proj_h = nn.Linear(dim_h, hidden_dim) + self.proj_c = nn.Linear(dim_c, hidden_dim) + # Bidirectional cross-attention + self.cross_attn_ab = nn.MultiHeadAttention(hidden_dim, num_heads=n_head) + self.cross_attn_ba = nn.MultiHeadAttention(hidden_dim, num_heads=n_head) + + self.bi_crossattn_fusion_mode = bi_crossattn_fusion_mode + self.pool_mode = pool_mode + self.crossmodal_fusion = crossmodal_fusion_mode + + self.hidden_dim = hidden_dim + self.out_dim = out_dim + + self.gate_linear = nn.Linear(hidden_dim, 1) + self.attn_pool = MaskedAttentionPool(dim=self.hidden_dim) + self.weighted_sum = nn.Linear(1024, 1) + self.concat_linear = nn.Linear(1024, 512) + + # for src padding mask + self.num_heads = n_head + + def masked_mean_pool(self, tensor, mask): + # tensor: [batch, seq_len, dim] + # mask: [batch, seq_len] (1: valid,0: pad) + lengths = mask.sum(axis=1, keepdim=True) # [batch, 1] + masked = tensor * mask.unsqueeze(-1) # zero out padding positions + return masked.sum(axis=1) / (lengths + 1e-6) # [batch, dim] + + def forward(self, tensor_Hnmr, mask_H, tensor_Cnmr, mask_C): + + max_len_H = mask_H.sum(axis=-1).max().item() + mask_H = mask_H[:, : int(max_len_H)] + tensor_Hnmr = tensor_Hnmr[:, : int(max_len_H), :] + max_len_C = mask_C.sum(axis=-1).max().item() + mask_C = mask_C[:, : int(max_len_C)] + tensor_Cnmr = tensor_Cnmr[:, : int(max_len_C), :] + + # project to uniform dimension + H_aligned = self.proj_h(tensor_Hnmr) # [B, Lh, D] + C_aligned = self.proj_c(tensor_Cnmr) # [B, Lc, D] + + # bidirectonal cross-attention + pad_mask_H = mask_H == 1 + bsz_H, src_len_H, _ = H_aligned.shape + pad_mask_C = mask_C == 1 + bsz_C, src_len_C, _ = C_aligned.shape + pad_mask_H = pad_mask_H.reshape([bsz_H, 1, 1, src_len_H]).expand( + [-1, self.num_heads, src_len_C, -1] + ) + pad_mask_C = pad_mask_C.reshape([bsz_C, 1, 1, src_len_C]).expand( + [-1, self.num_heads, src_len_H, -1] + ) + + attn_H2C = self.cross_attn_ab( + query=H_aligned, + key=C_aligned, + value=C_aligned, + attn_mask=pad_mask_C, + ) + attn_C2H = self.cross_attn_ba( + query=C_aligned, + key=H_aligned, + value=H_aligned, + attn_mask=pad_mask_H, + ) + + # combine the cross-attention output of two modalities with the origin features + if self.bi_crossattn_fusion_mode == "concat": + # Method 1: Concatenate outputs from two directions + fused_H = paddle.concat([H_aligned, attn_H2C], axis=-1) # [B, Lh, 2*D] + fused_C = paddle.concat([C_aligned, attn_C2H], axis=-1) # [B, Lc, 2*D] + + elif self.bi_crossattn_fusion_mode == "add": + # Method 2: Residual connection + fused_H = H_aligned + attn_H2C # [B, Lh, 2*D] + fused_C = C_aligned + attn_C2H # [B, Lc, 2*D] + + elif self.bi_crossattn_fusion_mode == "gated": + # Method 3: Gated Fusion (Adaptive Weights) + gate_H = F.sigmoid(self.gate_linear(attn_H2C)) + fused_H = (1 - gate_H) * H_aligned + gate_H * attn_H2C + gate_C = F.sigmoid(self.gate_linear(attn_C2H)) + fused_C = (1 - gate_C) * C_aligned + gate_C * attn_C2H + + else: + fused_H, fused_C = attn_H2C, attn_C2H + + # Intra-modal Aggregation (Temporal Pooling) + if self.pool_mode == "mean_pool": + # method 1:average pooling + global_H = self.masked_mean_pool(fused_H, mask_H) # [B, Dh] + global_C = self.masked_mean_pool(fused_C, mask_C) # [B, Dc] + + elif self.pool_mode == "attn_pool": + # Apply attention pooling to each of the two modalities separately + global_H = self.attn_pool(fused_H, mask_H) # [B, D*] + global_C = self.attn_pool(fused_C, mask_C) # [B, D*] + + # cross-modal fusion (obtained spectrum_embedding) + if self.crossmodal_fusion == "concat_linear": + merged = paddle.concat([global_H, global_C], axis=-1) # [B, 2D*] + global_output = self.concat_linear(merged) # [B, D] + elif self.crossmodal_fusion == "weighted_sum": + merged = paddle.concat([global_H, global_C], axis=-1) + # option + # merged = global_H + global_C + gate = F.sigmoid(self.weighted_sum(merged)) # [B, 1] + global_output = gate * global_H + (1 - gate) * global_C # [B, D*] + else: + global_output = (global_H, global_C) + + + spectrum_token_enc = paddle.concat([fused_H, fused_C], axis=1) # [B, Lh+Lc, D or 2*D] + spectrum_token_mask = paddle.concat([mask_H, mask_C], axis=1) # [B, Lh+Lc] + + return global_output, (spectrum_token_enc, spectrum_token_mask) + + +class NMR_fusion_H(nn.Layer): + def __init__( + self, + dim_h=1024, + dim_c=256, + hidden_dim=512, + n_head=8, + out_dim=512, + bi_crossattn_fusion_mode="", + pool_mode="", + crossmodal_fusion_mode="", + ): + super(NMR_fusion, self).__init__() + + # projection layer + self.proj_h = nn.Linear(dim_h, hidden_dim) + self.proj_c = nn.Linear(dim_c, hidden_dim) + + self.hidden_dim = hidden_dim + self.out_dim = out_dim + + self.attn_pool = MaskedAttentionPool(dim=self.hidden_dim) + + # for src padding mask + self.num_heads = n_head + + def masked_mean_pool(self, tensor, mask): + # tensor: [batch, seq_len, dim] + # mask: [batch, seq_len] (1: valid,0: pad) + lengths = mask.sum(axis=1, keepdim=True) # [batch, 1] + masked = tensor * mask.unsqueeze(-1) # zero out padding positions + return masked.sum(axis=1) / (lengths + 1e-6) # [batch, dim] + + def forward(self, tensor_Hnmr, mask_H, tensor_Cnmr, mask_C): + + max_len_H = mask_H.sum(axis=-1).max().item() + mask_H = mask_H[:, : int(max_len_H)] + tensor_Hnmr = tensor_Hnmr[:, : int(max_len_H), :] + max_len_C = mask_C.sum(axis=-1).max().item() + mask_C = mask_C[:, : int(max_len_C)] + tensor_Cnmr = tensor_Cnmr[:, : int(max_len_C), :] + + # project to uniform dimension + H_aligned = self.proj_h(tensor_Hnmr) + C_aligned = self.proj_c(tensor_Cnmr) + + fused_H = H_aligned + fused_C = C_aligned + + # Apply attention pooling to each of the two modalities separately + global_H = self.attn_pool(fused_H, mask_H) + global_C = self.attn_pool(fused_C, mask_C) + + return global_H, global_C + + +class NMR_encoder(nn.Layer): + def __init__( + self, + dim_H, + dimff_H, + dim_C, + dimff_C, + hidden_dim, + n_head, + num_layers, + drop_prob, + peakwidthemb_num, + integralemb_num, + ): + super(NMR_encoder, self).__init__() + self.H1nmr_encoder = H1nmr_encoder( + d_model=dim_H, + dim_feedforward=dimff_H, + n_head=n_head, + num_layers=num_layers, + drop_prob=drop_prob, + peakwidthemb_num=peakwidthemb_num, + integralemb_num=integralemb_num, + ) + + self.C13nmr_encoder = C13nmr_encoder( + d_model=dim_C, + dim_feedforward=dimff_C, + n_head=n_head, + num_layers=num_layers, + drop_prob=drop_prob, + ) + + self.NMR_fusion = NMR_fusion( + dim_H, + dim_C, + hidden_dim, + n_head, + bi_crossattn_fusion_mode="add", + pool_mode="attn_pool", + crossmodal_fusion_mode="concat_linear", + ) + + def create_mask(self, batch_size, max_seq_len, num_peak): + + mask = paddle.zeros([batch_size, max_seq_len], dtype="float32") + for i, length in enumerate(num_peak): + mask[i, :length] = 1 + return mask + + def forward(self, condition): + H1nmr, num_H_peak, C13nmr, num_C_peak = condition + + batch_size, max_seq_len_H, _ = H1nmr.shape + mask_H = self.create_mask(batch_size, max_seq_len_H, num_H_peak) + _, max_seq_len_C = C13nmr.shape + mask_C = self.create_mask(batch_size, max_seq_len_C, num_C_peak) + + h_feat = self.H1nmr_encoder(H1nmr, mask_H) # [batch, h_seq, h_dim] + c_feat = self.C13nmr_encoder(C13nmr, mask_C) # [batch, c_seq, c_dim] + + fused_feat = self.NMR_fusion( + h_feat, mask_H, c_feat, mask_C + ) # [batch, fusion_dim] + + return fused_feat + + +class NMR_encoder_H(nn.Layer): + def __init__( + self, + dim_H, + dimff_H, + dim_C, + dimff_C, + hidden_dim, + n_head, + num_layers, + drop_prob, + peakwidthemb_num, + integralemb_num, + ): + super(NMR_encoder_H, self).__init__() + self.H1nmr_encoder = H1nmr_encoder( + d_model=dim_H, + dim_feedforward=dimff_H, + n_head=n_head, + num_layers=num_layers, + drop_prob=drop_prob, + peakwidthemb_num=peakwidthemb_num, + integralemb_num=integralemb_num, + ) + + self.C13nmr_encoder = C13nmr_encoder( + d_model=dim_C, + dim_feedforward=dimff_C, + n_head=n_head, + num_layers=num_layers, + drop_prob=drop_prob, + ) + + self.NMR_fusion = NMR_fusion_H( + dim_H, + dim_C, + hidden_dim, + n_head, + bi_crossattn_fusion_mode="gated", + pool_mode="attn_pool", + crossmodal_fusion_mode="weighted_sum", + ) + + def create_mask(self, batch_size, max_seq_len, num_peak): + + mask = paddle.zeros([batch_size, max_seq_len], dtype="float32") + for i, length in enumerate(num_peak): + mask[i, :length] = 1 + return mask + + def forward(self, condition): + H1nmr, num_H_peak, C13nmr, num_C_peak = condition + + batch_size, max_seq_len_H, _ = H1nmr.shape + mask_H = self.create_mask(batch_size, max_seq_len_H, num_H_peak) + _, max_seq_len_C = C13nmr.shape + mask_C = self.create_mask(batch_size, max_seq_len_C, num_C_peak) + + h_feat = self.H1nmr_encoder(H1nmr, mask_H) # [batch, h_seq, h_dim] + c_feat = self.C13nmr_encoder(C13nmr, mask_C) # [batch, c_seq, c_dim] + + global_H, global_C = self.NMR_fusion( + h_feat, mask_H, c_feat, mask_C + ) # [batch, fusion_dim] + + return global_H, global_C + + +class RBFEncoder(nn.Layer): + def __init__(self, min, max, bins): + super(RBFEncoder, self).__init__() + self.centers = self.create_parameter( + shape=[bins], + default_initializer=nn.initializer.Assign(paddle.linspace(min, max, bins)), + ) + self.centers.stop_gradient = True + self.sigma = (max - min) / (bins - 1) # adaptive bandwidth + + def forward(self, x): + # x: (...,) + diff = x.unsqueeze(-1) - self.centers # (..., bins) + return paddle.exp(-0.5 * (diff / self.sigma).pow(2)) + + +class RBFEncoder_Jcouple(nn.Layer): + def __init__(self, min1=0, max1=26, bins1=131, min2=27, max2=58, bins2=32): + super(RBFEncoder_Jcouple, self).__init__() + + centers1 = paddle.linspace(min1, max1, bins1) + sigma1 = (max1 - min1) / (bins1 - 1) # 20/99 ≈ 0.202 + + centers2 = paddle.linspace(min2, max2, bins2) + sigma2 = (max2 - min2) / (bins2 - 1) # 30/29 ≈ 1.034 + + # 合并参数 + self.centers = self.create_parameter( + shape=[bins1 + bins2], + default_initializer=nn.initializer.Assign( + paddle.concat([centers1, centers2]) + ), + ) + self.centers.stop_gradient = True + self.sigma = self.create_parameter( + shape=[bins1 + bins2], + default_initializer=nn.initializer.Assign( + paddle.concat( + [paddle.full([bins1], sigma1), paddle.full([bins2], sigma2)] + ) + ), + ) + self.sigma.stop_gradient = True + + def forward(self, x): + diff = x.unsqueeze(-1) - self.centers # (..., 130) + return paddle.exp(-0.5 * (diff / self.sigma).pow(2)) + + +class H1nmr_embedding(nn.Layer): + def __init__( + self, + split_dim=64, + peakwidth_dim=40, + integral_dim=32, + H_shift_min=-1, + H_shift_max=10, + H_shift_bin=111, + min_j=0, + max_j=58, + j_bins1=131, + j_bins2=32, + hidden=1024, + dim=1024, + drop_prob=0.1, + peakwidthemb_num=70, + integralemb_num=26, + ): + super(H1nmr_embedding, self).__init__() + + self.shift_emb = RBFEncoder( + min=H_shift_min, max=H_shift_max, bins=H_shift_bin + ) # Covering common 1H ranges + + self.peakwidth_emb = nn.Embedding( + peakwidthemb_num, peakwidth_dim, padding_idx=0 + ) + + self.split_emb = nn.Embedding( + 116, split_dim, padding_idx=0 + ) # Supports 116 split patterns + + self.integral_emb = nn.Embedding(integralemb_num, integral_dim, padding_idx=0) + + self.J_emb = RBFEncoder_Jcouple( + min1=min_j, max1=26, bins1=j_bins1, min2=27, max2=max_j, bins2=j_bins2 + ) + + self.d_model = ( + split_dim + peakwidth_dim + integral_dim + H_shift_bin + j_bins1 + j_bins2 + ) + + self.peak_fuser = peak_fuser(self.d_model, dim, drop_prob) + + def forward(self, h1nmr, src_mask): + + hnmr = h1nmr + + h_shift, peakwidth, split, integral, j_couple = ( + hnmr[:, :, 0], + hnmr[:, :, 1], + hnmr[:, :, 2], + hnmr[:, :, 3], + hnmr[:, :, 4:], + ) + + h_shift_emb = self.shift_emb(h_shift) * src_mask.unsqueeze(-1) + peakwidth_emb = self.peakwidth_emb(peakwidth.astype("int64")) + split_emb = self.split_emb(split.astype("int64")) + integral_emb = self.integral_emb((integral + 1).astype("int64")) + + J_emb = self.J_emb(j_couple) + J_emb = paddle.sum(J_emb, axis=-2) * src_mask.unsqueeze(-1) + + hnmr_emb = paddle.concat( + [h_shift_emb, peakwidth_emb, split_emb, integral_emb, J_emb], axis=-1 + ) + hnmr_emb = self.peak_fuser(hnmr_emb) + + return hnmr_emb + + +class C13nmr_embedding(nn.Layer): + def __init__( + self, + C_shift_min=-15, + C_shift_max=229, + C_bins=245, + hidden=512, + dim=256, + drop_prob=0.1, + ): + super(C13nmr_embedding, self).__init__() + + self.shift_emb = RBFEncoder(min=C_shift_min, max=C_shift_max, bins=C_bins) + + self.peak_fuser = peak_fuser(C_bins, dim, drop_prob) + + def forward(self, c13nmr, src_mask): + + cnmr = c13nmr + + c_shift_emb = self.shift_emb(cnmr) * src_mask.unsqueeze(-1) + + cnmr_emb = self.peak_fuser(c_shift_emb) + + return cnmr_emb + + +class peak_fuser(nn.Layer): + def __init__(self, d_model, hidden, drop_prob=0.1): + super(peak_fuser, self).__init__() + self.net = nn.Sequential( + nn.Linear(d_model, hidden), nn.GELU(), nn.Dropout(drop_prob) + ) + + def forward(self, x): + return self.net(x) diff --git a/ppmat/models/diffnmr/utils/diffgraphformer_utils.py b/ppmat/models/diffnmr/utils/diffgraphformer_utils.py new file mode 100644 index 00000000..afddfe13 --- /dev/null +++ b/ppmat/models/diffnmr/utils/diffgraphformer_utils.py @@ -0,0 +1,281 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +from pgl.math import segment_sum + + +class PlaceHolder: + """ + Container for batched graph tensors with convenience utilities. + + Purpose + ------- + Encapsulates (X, E, y) for a batch of graphs and provides: + 1) `type_as(x)`: align dtypes of X/E/y to `x.dtype`. + 2) `mask(node_mask, collapse=False)`: apply a node mask to X and E. + + Attributes + ---------- + X : paddle.Tensor + Node features or per-class distributions. Shape: (B, N, F). + E : paddle.Tensor + Edge features or per-class distributions. Shape: (B, N, N, D). + Expected to be symmetric on node axes: E[:, i, j, :] == E[:, j, i, :]. + y : paddle.Tensor + Target tensor; shape is task-dependent. + + Methods + ------- + type_as(x: paddle.Tensor) -> PlaceHolder + Cast X, E, y to `x.dtype` and return self (in-place). + mask(node_mask, collapse: bool = False) -> PlaceHolder + Apply node-wise masking and return self (in-place). + - `node_mask`: shape (B, N), values in {0,1}/bool. + - If `collapse == False`: + * X *= x_mask where x_mask has shape (B, N, 1). + * E *= e_mask1 * e_mask2, where e_mask1=(B,N,1,1), e_mask2=(B,1,N,1). + * Verifies symmetry of E after masking and raises ValueError if violated. + - If `collapse == True`: + * X = argmax(X, axis=-1) -> shape (B, N), integer labels. + * E = argmax(E, axis=-1) -> shape (B, N, N), integer labels. + * Any masked node (0) is set to -1 in X; any edge touching a masked node is + set to -1 in E. + * Use -1 as a sentinel/padding id; change if your downstream code requires + a different pad id. + """ + + def __init__(self, X, E, y): + self.X = X + self.E = E + self.y = y + + def type_as(self, x: paddle.Tensor): + self.X = self.X.astype(x.dtype) + self.E = self.E.astype(x.dtype) + self.y = self.y.astype(x.dtype) + return self + + def mask(self, node_mask, collapse=False): + # x_mask = node_mask.unsqueeze(-1) + x_mask = paddle.unsqueeze(node_mask, axis=-1).astype(self.X.dtype) # (bs, n, 1) + e_mask1 = paddle.unsqueeze(x_mask, axis=2) # (bs, n, 1, 1) + e_mask2 = paddle.unsqueeze(x_mask, axis=1) # (bs, 1, n, 1) + + if collapse: + # self.X = torch.argmax(self.X, dim=-1) + self.X = paddle.argmax(self.X, axis=-1) # (bs,n) + self.E = paddle.argmax(self.E, axis=-1) # (bs,n,n) + + # self.X[node_mask == 0] = -1 + zero_mask = node_mask == 0 + self.X = paddle.where( + zero_mask, paddle.full_like(self.X, fill_value=-1), self.X + ) + + # e_mask => (bs,n,n) shape (由 e_mask1 * e_mask2 => (bs,n,n,1)?) + e_mask = paddle.squeeze(e_mask1 * e_mask2, axis=-1) # (bs,n,n) + self.E = paddle.where( + e_mask == 0, paddle.full_like(self.E, fill_value=-1), self.E + ) + else: + # self.X = self.X * x_mask + self.X = self.X * x_mask + # self.E = self.E * e_mask1 * e_mask2 + self.E = self.E * e_mask1 * e_mask2 + + E = self.E.astype("float32") + if not paddle.allclose(E, paddle.transpose(E, perm=[0, 2, 1, 3])): + raise ValueError("E is not symmetric after masking.") + return self + + +def to_dense(x, edge_index, edge_attr, batch): + """ + Convert sparse graph data to dense format (PaddlePaddle version) (Paddle version) + Args: + x (paddle.Tensor): node feature matrix, shape (N, F) + edge_index (paddle.Tensor): edge index matrix, shape (2, E) + edge_attr (paddle.Tensor): edge attribute matrix, shape (E, D) + batch (paddle.Tensor): node-to-graph batch index vector, shape (N, ) + Returns: + PlaceHolder: Contains the densified node feature matrix and adjacency matrix + """ + X, node_mask = to_dense_batch(x=x, batch=batch) + # remove self-loops + edge_index, edge_attr = remove_self_loops(edge_index, edge_attr) + + max_num_nodes = X.shape[1] + E = to_dense_adj( + edge_index=edge_index, + batch=batch, + edge_attr=edge_attr, + max_num_nodes=max_num_nodes, + ) + E = encode_no_edge(E) + + return PlaceHolder(X=X, E=E, y=None), node_mask + + +def to_dense_batch(x, batch, fill_value=0, max_num_nodes=None, batch_size=None): + """Transfrom a batch of graphs to a dense node feature tensor and + provide the mask holing the positions of dummy nodes + + Args: + x (paddle.tensor): The feature map of nodes + batch (pgl.Graph): The graph holing the graph node id + fill_value (bool): The value of dummy nodes. Default: 0. + max_node_nodes: The dimension of nodes in dense batch. Default: None. + batch_size (int, optional): The batch size. Default: None. + + Returns: + + out (paddle.tensor): Returns a dense node feature tensor + (shape = [batch_size,max_num_nodes,-1]) + mask (paddle.tensor): Return a mask indicating the position of + dummy nodes (shape = [batch_size, max_num_nodes]) + + """ + if batch is None and max_num_nodes is None: + mask = paddle.ones(shape=[1, x.shape[0]], dtype="bool") + return paddle.unsqueeze(x, axis=0), mask + + if batch is None: + batch = paddle.zeros(shape=[x.shape[0]], dtype="int64") + + if batch_size is None: + batch_size = (batch.max().item()) + 1 + + num_nodes = segment_sum(paddle.ones([x.shape[0]]), batch) + cum_nodes = paddle.concat([paddle.zeros([1]), num_nodes.cumsum(0)]).astype( + batch.dtype + ) + + if max_num_nodes is None: + max_num_nodes = int(num_nodes.max()) + + idx = paddle.arange(batch.shape[0], dtype=batch.dtype) + idx = (idx - cum_nodes[batch]) + (batch * max_num_nodes) + + size = [batch_size * max_num_nodes] + list(x.shape)[1:] + out = paddle.full(size, fill_value).astype(x.dtype) + out = paddle.scatter(out, idx, x) + out = out.reshape([batch_size, max_num_nodes] + list(x.shape)[1:]) + + mask = paddle.zeros(batch_size * max_num_nodes, dtype=paddle.bool) + mask[idx] = 1 + mask = mask.reshape([batch_size, max_num_nodes]) + + return out, mask + + +def remove_self_loops(edge_index, edge_attr=None): + mask = edge_index[0] != edge_index[1] + edge_index = edge_index[:, mask] + + if edge_attr is not None: + edge_attr = edge_attr[mask] + + return edge_index, edge_attr + + +def to_dense_adj( + edge_index, + batch=None, + edge_attr=None, + max_num_nodes=None, + batch_size=None, +): + if batch is None: + max_index = int(edge_index.max()) + 1 if edge_index.numel() > 0 else 0 + batch = paddle.zeros(shape=[max_index], dtype="int64") + + if batch_size is None: + batch_size = int(batch.max()) + 1 if batch.numel() > 0 else 1 + + one = paddle.ones_like(batch, dtype=paddle.float32) + num_nodes = segment_sum(one, batch) + cum_nodes = paddle.concat([paddle.zeros([1]), num_nodes.cumsum(0)]).astype( + edge_index.dtype + ) + + idx0 = batch[edge_index[0]].astype(edge_index.dtype) + idx1 = edge_index[0] - cum_nodes[batch][edge_index[0]] + idx2 = edge_index[1] - cum_nodes[batch][edge_index[1]] + + if max_num_nodes is None: + max_num_nodes = int(num_nodes.max()) + elif (idx1.numel() > 0 and idx1.max() >= max_num_nodes) or ( + idx2.numel() > 0 and idx2.max() >= max_num_nodes + ): + mask = (idx1 < max_num_nodes) & (idx2 < max_num_nodes) + idx0 = idx0[mask] + idx1 = idx1[mask] + idx2 = idx2[mask] + edge_attr = None if edge_attr is None else edge_attr[mask] + + if edge_attr is None: + edge_attr = paddle.ones(shape=[idx0.numel()], dtype=edge_index.dtype) + + size = [batch_size, max_num_nodes, max_num_nodes] + size.extend(list(edge_attr.shape[1:])) + flattened_size = batch_size * max_num_nodes * max_num_nodes + + idx = idx0 * max_num_nodes * max_num_nodes + idx1 * max_num_nodes + idx2 + adj_partial = segment_sum(edge_attr, idx) + adj = paddle.zeros([flattened_size, edge_attr.shape[1]], dtype=paddle.float32) + index = paddle.arange(idx.max() + 1) + adj[index] = adj_partial + adj = paddle.reshape(adj, size) + + return adj + + +def encode_no_edge(E): + assert len(E.shape) == 4 + if E.shape[-1] == 0: + return E + no_edge = paddle.sum(E, axis=3) == 0 + first_elt = E[:, :, :, 0] + first_elt = paddle.where(no_edge, paddle.ones_like(first_elt), first_elt) + E[:, :, :, 0] = first_elt + diag = paddle.eye(E.shape[1], dtype="int32").unsqueeze(0).tile([E.shape[0], 1, 1]) + diag = diag.astype("bool") + E = paddle.where(diag.unsqueeze(-1), paddle.zeros_like(E), E) + return E + + +def return_empty(x, shape=None): + if shape is not None: + return paddle.empty(shape, dtype="float32") + return paddle.empty(x.shape, dtype="float32") + + +# =========================== +# test +# =========================== +if __name__ == "__main__": + import paddle + + # create test data + x = paddle.arange(15).reshape([5, 3]) # 5 nodes,every node has 3 dimension feature + edge_index = paddle.to_tensor([[0, 1, 2], [1, 2, 0]], dtype="int64") + edge_attr = paddle.ones([3, 2]) * 2 # 3 edge,every edge has 2 dimension feature + batch = paddle.to_tensor([0, 0, 1, 1, 1], dtype="int64") + + # test to_dense function + placeholder, node_mask = to_dense(x, edge_index, edge_attr, batch) + print("X Shape:", placeholder.X.shape) + print("E Shape:", placeholder.E.shape) + print("Node Mask:", node_mask.shape) diff --git a/ppmat/models/diffnmr/utils/diffprior_utils.py b/ppmat/models/diffnmr/utils/diffprior_utils.py new file mode 100644 index 00000000..e1d134ae --- /dev/null +++ b/ppmat/models/diffnmr/utils/diffprior_utils.py @@ -0,0 +1,59 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +from paddle import nn + + +# helper functions +def exists(val): + return val is not None + + +def l2norm(t): + return nn.functional.normalize(x=t, axis=-1) + + +def default(val, d): + if exists(val): + return val + return d() if callable(d) else d + + +def first(arr, d=None): + if len(arr) == 0: + return d + return arr[0] + + +def log(t, eps=1e-12): + return paddle.log(t.clamp(min=eps)) + + +def set_module_requires_grad_(module, requires_grad): + for param in module.parameters(): + param.stop_gradient = not requires_grad + + +def freeze_all_layers_(module): + set_module_requires_grad_(module, False) + + +def unfreeze_all_layers_(module): + set_module_requires_grad_(module, True) + + +def freeze_model_and_make_eval_(model): + model.eval() + freeze_all_layers_(model) diff --git a/ppmat/models/dimenetpp/dimenetpp.py b/ppmat/models/dimenetpp/dimenetpp.py new file mode 100644 index 00000000..dd2bc063 --- /dev/null +++ b/ppmat/models/dimenetpp/dimenetpp.py @@ -0,0 +1,552 @@ +from functools import partial +from typing import Callable +from typing import Optional + +import paddle +import sympy as sym +from paddle.nn.functional import swish + +from ppmat.models.common.basis_utils import bessel_basis +from ppmat.models.common.basis_utils import real_sph_harm +from ppmat.utils.crystal import get_pbc_distances +from ppmat.utils.scatter import scatter + +"""This module is adapted from https://github.com/Open-Catalyst-Project/ocp/tree/master/ocpmodels/models +""" + + +class Envelope(paddle.nn.Layer): + def __init__(self, exponent: int): + super().__init__() + self.p = exponent + 1 + self.a = -(self.p + 1) * (self.p + 2) / 2 + self.b = self.p * (self.p + 2) + self.c = -self.p * (self.p + 1) / 2 + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + p, a, b, c = self.p, self.a, self.b, self.c + x_pow_p0 = x.pow(y=p - 1) + x_pow_p1 = x_pow_p0 * x + x_pow_p2 = x_pow_p1 * x + return (1.0 / x + a * x_pow_p0 + b * x_pow_p1 + c * x_pow_p2) * (x < 1.0).to( + x.dtype + ) + + +class BesselBasisLayer(paddle.nn.Layer): + def __init__( + self, num_radial: int, cutoff: float = 5.0, envelope_exponent: int = 5 + ): + super().__init__() + self.cutoff = cutoff + self.envelope = Envelope(envelope_exponent) + self.freq = paddle.create_parameter( + shape=paddle.empty( + shape=[ + num_radial, + ] + ).shape, + dtype=paddle.empty( + shape=[ + num_radial, + ] + ) + .numpy() + .dtype, + default_initializer=paddle.nn.initializer.Assign( + paddle.empty( + shape=[ + num_radial, + ] + ) + ), + ) + self.freq.stop_gradient = False + + def forward(self, dist: paddle.Tensor) -> paddle.Tensor: + dist = dist.unsqueeze(axis=-1) / self.cutoff + return self.envelope(dist) * (self.freq * dist).sin() + + +class SphericalBasisLayer(paddle.nn.Layer): + def __init__( + self, + num_spherical: int, + num_radial: int, + cutoff: float = 5.0, + envelope_exponent: int = 5, + ): + super().__init__() + assert num_radial <= 64 + self.num_spherical = num_spherical + self.num_radial = num_radial + self.cutoff = cutoff + self.envelope = Envelope(envelope_exponent) + bessel_forms = bessel_basis(num_spherical, num_radial) + sph_harm_forms = real_sph_harm(num_spherical, True, True, True) + self.sph_funcs = [] + self.bessel_funcs = [] + x, theta = sym.symbols("x theta") + modules = {"sin": paddle.sin, "cos": paddle.cos} + for i in range(num_spherical): + if i == 0: + sph1 = sym.lambdify([theta], sph_harm_forms[i][0], modules)(0) + self.sph_funcs.append(partial(self._sph_to_tensor, sph1)) + else: + sph = sym.lambdify([theta], sph_harm_forms[i][0], modules) + self.sph_funcs.append(sph) + for j in range(num_radial): + bessel = sym.lambdify([x], bessel_forms[i][j], modules) + self.bessel_funcs.append(bessel) + + @staticmethod + def _sph_to_tensor(sph, x: paddle.Tensor) -> paddle.Tensor: + return paddle.zeros_like(x=x) + sph + + def forward( + self, dist: paddle.Tensor, angle: paddle.Tensor, idx_kj: paddle.Tensor + ) -> paddle.Tensor: + dist = dist / self.cutoff + rbf = paddle.stack(x=[f(dist) for f in self.bessel_funcs], axis=1) + rbf = self.envelope(dist).unsqueeze(axis=-1) * rbf + cbf = paddle.stack(x=[f(angle) for f in self.sph_funcs], axis=1) + n, k = self.num_spherical, self.num_radial + out = (rbf[idx_kj].reshape([-1, n, k]) * cbf.reshape([-1, n, 1])).reshape( + [-1, n * k] + ) + return out + + +class EmbeddingBlock(paddle.nn.Layer): + def __init__( + self, num_embeddings, num_radial: int, hidden_channels: int, act: Callable + ): + super().__init__() + self.act = act + self.emb = paddle.nn.Embedding( + num_embeddings=num_embeddings, embedding_dim=hidden_channels + ) + self.lin_rbf = paddle.nn.Linear( + in_features=num_radial, out_features=hidden_channels + ) + self.lin = paddle.nn.Linear( + in_features=3 * hidden_channels, out_features=hidden_channels + ) + + def forward( + self, x: paddle.Tensor, rbf: paddle.Tensor, i: paddle.Tensor, j: paddle.Tensor + ) -> paddle.Tensor: + x = self.emb(x) + rbf = self.act(self.lin_rbf(rbf)) + return self.act(self.lin(paddle.concat(x=[x[i], x[j], rbf], axis=-1))) + + +class ResidualLayer(paddle.nn.Layer): + def __init__(self, hidden_channels: int, act: Callable): + super().__init__() + self.act = act + self.lin1 = paddle.nn.Linear( + in_features=hidden_channels, out_features=hidden_channels + ) + self.lin2 = paddle.nn.Linear( + in_features=hidden_channels, out_features=hidden_channels + ) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + return x + self.act(self.lin2(self.act(self.lin1(x)))) + + +class InteractionPPBlock(paddle.nn.Layer): + def __init__( + self, + hidden_channels, + int_emb_size, + basis_emb_size, + num_spherical, + num_radial, + num_before_skip, + num_after_skip, + act=swish, + ): + super(InteractionPPBlock, self).__init__() + self.act = act + self.lin_rbf1 = paddle.nn.Linear( + in_features=num_radial, out_features=basis_emb_size, bias_attr=False + ) + self.lin_rbf2 = paddle.nn.Linear( + in_features=basis_emb_size, out_features=hidden_channels, bias_attr=False + ) + self.lin_sbf1 = paddle.nn.Linear( + in_features=num_spherical * num_radial, + out_features=basis_emb_size, + bias_attr=False, + ) + self.lin_sbf2 = paddle.nn.Linear( + in_features=basis_emb_size, out_features=int_emb_size, bias_attr=False + ) + self.lin_kj = paddle.nn.Linear( + in_features=hidden_channels, out_features=hidden_channels + ) + self.lin_ji = paddle.nn.Linear( + in_features=hidden_channels, out_features=hidden_channels + ) + self.lin_down = paddle.nn.Linear( + in_features=hidden_channels, out_features=int_emb_size, bias_attr=False + ) + self.lin_up = paddle.nn.Linear( + in_features=int_emb_size, out_features=hidden_channels, bias_attr=False + ) + self.layers_before_skip = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(hidden_channels, act) for _ in range(num_before_skip) + ] + ) + self.lin = paddle.nn.Linear( + in_features=hidden_channels, out_features=hidden_channels + ) + self.layers_after_skip = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(hidden_channels, act) for _ in range(num_after_skip) + ] + ) + + def forward(self, x, rbf, sbf, idx_kj, idx_ji): + x_ji = self.act(self.lin_ji(x)) + x_kj = self.act(self.lin_kj(x)) + rbf = self.lin_rbf1(rbf) + rbf = self.lin_rbf2(rbf) + x_kj = x_kj * rbf + x_kj = self.act(self.lin_down(x_kj)) + sbf = self.lin_sbf1(sbf) + sbf = self.lin_sbf2(sbf) + x_kj = x_kj[idx_kj] * sbf + x_kj = scatter(x_kj, idx_ji, dim=0, dim_size=x.shape[0]) + x_kj = self.act(self.lin_up(x_kj)) + h = x_ji + x_kj + for layer in self.layers_before_skip: + h = layer(h) + h = self.act(self.lin(h)) + x + for layer in self.layers_after_skip: + h = layer(h) + return h + + +class OutputPPBlock(paddle.nn.Layer): + def __init__( + self, + num_radial, + hidden_channels, + out_emb_channels, + out_channels, + num_layers, + act=swish, + ): + super(OutputPPBlock, self).__init__() + self.act = act + self.lin_rbf = paddle.nn.Linear( + in_features=num_radial, out_features=hidden_channels, bias_attr=False + ) + self.lin_up = paddle.nn.Linear( + in_features=hidden_channels, out_features=out_emb_channels, bias_attr=True + ) + self.lins = paddle.nn.LayerList() + for _ in range(num_layers): + self.lins.append( + paddle.nn.Linear( + in_features=out_emb_channels, out_features=out_emb_channels + ) + ) + self.lin = paddle.nn.Linear( + in_features=out_emb_channels, out_features=out_channels, bias_attr=False + ) + + def forward(self, x, rbf, i, num_nodes=None): + x = self.lin_rbf(rbf) * x + x = scatter(x, i, dim=0, dim_size=num_nodes) + x = self.lin_up(x) + for lin in self.lins: + x = self.act(lin(x)) + return self.lin(x) + + +class DimeNetPlusPlus(paddle.nn.Layer): + """ + Fast and Uncertainty-Aware Directional Message Passing for + Non-Equilibrium Molecules, https://arxiv.org/abs/2011.14115 + + Args: + out_channels (int): The number of output channels for the final prediction. + hidden_channels (int, optional): The dimensionality of hidden feature + vectors in each convolutional layer. Defaults to 128. + num_blocks (int, optional): The number of interaction blocks to stack. + Defaults to 4. + int_emb_size (int, optional): The size of the embedding vector + for each atom index. Defaults to 64. + basis_emb_size (int, optional): The size of the basis embedding used + in the interaction layers. Defaults to 8. + out_emb_channels (int, optional): The number of channels after the final + embedding layer before readout. Defaults to 256. + num_spherical (int, optional): The number of spherical basis functions to use. + Defaults to 7. + num_embeddings (int, optional): The number of distinct atom types to embed. + Defaults to 95. + num_radial (int, optional): The number of radial basis functions to use. + Defaults to 6. + otf_graph (bool, optional): Whether to construct the interaction graph + on-the-fly during training. Defaults to False. + cutoff (float, optional): The cutoff distance (in Å) for neighbor interactions. + Defaults to 10.0. + max_num_neighbors (int, optional): The maximum number of neighbors to consider + for each atom. Defaults to 20. + envelope_exponent (int, optional): The exponent used in the cutoff envelope + function to control smooth decay. Defaults to 5. + num_before_skip (int, optional): The number of convolutional layers + before each skip connection. Defaults to 1. + num_after_skip (int, optional): The number of convolutional layers + after each skip connection. Defaults to 2. + num_output_layers (int, optional): The number of fully connected layers + used to produce the final output. Defaults to 3. + readout (str, optional): The method for aggregating atom features into + a graph-level feature (“mean” or “sum”). Defaults to "mean". + property_names (Optional[str], optional): A comma-separated list of + target property names to predict. Defaults to "formation_energy_per_atom". + data_mean (float, optional): The mean used for normalizing target values. + Defaults to 0.0. + data_std (float, optional): The standard deviation used for + normalizing target values. Defaults to 1.0. + loss_type (str, optional): Loss type, can be 'mse_loss' or 'l1_loss'. + Defaults to "l1_loss". + act (str, optional): The activation function. Defaults to swish. + """ + + def __init__( + self, + out_channels: int, + hidden_channels: int = 128, + num_blocks: int = 4, + int_emb_size: int = 64, + basis_emb_size: int = 8, + out_emb_channels: int = 256, + num_spherical: int = 7, + num_embeddings: int = 95, + num_radial: int = 6, + otf_graph: bool = False, + cutoff: float = 10.0, + max_num_neighbors: int = 20, + envelope_exponent: int = 5, + num_before_skip: int = 1, + num_after_skip: int = 2, + num_output_layers: int = 3, + readout: str = "mean", + property_names: Optional[str] = "formation_energy_per_atom", + data_mean: float = 0.0, + data_std: float = 1.0, + loss_type: str = "l1_loss", + act: str = "swish", + ): + super().__init__() + # store hyperparams + self.out_channels = out_channels + self.cutoff = cutoff + self.max_num_neighbors = max_num_neighbors + self.otf_graph = otf_graph + self.readout = readout + if isinstance(property_names, list): + self.property_names = property_names[0] + else: + assert isinstance(property_names, str) + self.property_names = property_names + self.register_buffer( + tensor=paddle.to_tensor(data_mean), name="data_mean" + ) + self.register_buffer( + tensor=paddle.to_tensor(data_std), name="data_std" + ) + + # basis layers + self.rbf = BesselBasisLayer(num_radial, cutoff, envelope_exponent) + self.sbf = SphericalBasisLayer( + num_spherical, num_radial, cutoff, envelope_exponent + ) + + # act func + if act == "swish": + act = swish + else: + raise ValueError(f"Invalid activation function: {act}") + + # embedding and blocks + self.emb = EmbeddingBlock(num_embeddings, num_radial, hidden_channels, act) + self.output_blocks = paddle.nn.LayerList( + [ + OutputPPBlock( + num_radial, + hidden_channels, + out_emb_channels, + out_channels, + num_output_layers, + act, + ) + for _ in range(num_blocks + 1) + ] + ) + self.interaction_blocks = paddle.nn.LayerList( + [ + InteractionPPBlock( + hidden_channels, + int_emb_size, + basis_emb_size, + num_spherical, + num_radial, + num_before_skip, + num_after_skip, + act, + ) + for _ in range(num_blocks) + ] + ) + + if loss_type == "mse_loss": + self.loss_fn = paddle.nn.functional.mse_loss + elif loss_type == "l1_loss": + self.loss_fn = paddle.nn.functional.l1_loss + else: + raise ValueError(f"Unknown loss type {loss_type}.") + + def triplets(self, edge_index, num_nodes): + row, col = edge_index + value = paddle.arange(1, row.shape[0] + 1, dtype="int64") + # build matrix of edge ids per target + n = col.shape[0] + rows = paddle.arange(n).unsqueeze(1) + cols = paddle.arange(n).unsqueeze(0) + mask = (col.unsqueeze(1) == col.unsqueeze(0)) & (cols <= rows) + col_ = mask.astype("int64").sum(axis=1) - 1 + mat = paddle.scatter_nd( + paddle.stack([col, col_], axis=1), + value, + shape=[num_nodes, col_.max().item() + 1], + ) + idx_kj = mat[row][mat[row] > 0] - 1 + tmp = paddle.nonzero(mat[row], as_tuple=False) + idx_ji = tmp[:, 0] + idx_k = paddle.index_select(row, idx_kj, axis=0) + idx_j = paddle.index_select(row, idx_ji, axis=0) + idx_i = paddle.index_select(col, idx_ji, axis=0) + mask2 = idx_i != idx_k + return ( + col, + row, + idx_i[mask2], + idx_j[mask2], + idx_k[mask2], + idx_kj[mask2], + idx_ji[mask2], + ) + + def normalize(self, tensor): + return (tensor - self.data_mean) / self.data_std + + def unnormalize(self, tensor): + return tensor * self.data_std + self.data_mean + + def _forward(self, data): + # The data in data['graph'] is numpy.ndarray, convert it to paddle.Tensor + data["graph"] = data["graph"].tensor() + + # unpack graph dict + graph = data["graph"] + batch = graph.graph_node_id + lattices = graph.node_feat["lattice"] + pos = graph.node_feat["cart_coords"] + frac = graph.node_feat["frac_coords"] + edge_index = graph.edges + to_jimages = graph.edge_feat["pbc_offset"] + num_atoms = graph.node_feat["num_atoms"] + num_bonds = graph.edge_feat["num_edges"] + atom_types = graph.node_feat["atom_types"] + + out = get_pbc_distances( + frac, + edge_index.T, + lattices, + to_jimages, + num_atoms, + num_bonds, + return_offsets=True, + ) + edge_index = out["edge_index"] + dist = out["distances"] + offsets = out["offsets"] + j, i, idx_i, idx_j, idx_k, idx_kj, idx_ji = self.triplets( + edge_index, num_nodes=atom_types.shape[0] + ) + # compute angles + pos_i = pos[idx_i] + pos_j = pos[idx_j] + pos_ji = pos_j - pos_i + offsets[idx_ji] + pos_kj = pos[idx_k] - pos_j + offsets[idx_kj] + a = (pos_ji * pos_kj).sum(axis=-1) + b = paddle.cross(pos_ji, pos_kj).norm(axis=-1) + angle = paddle.atan2(b, a) + + # basis expansions + rbf = self.rbf(dist) + sbf = self.sbf(dist, angle, idx_kj) + x = self.emb(atom_types, rbf, i, j) + + # output and interactions + P = self.output_blocks[0](x, rbf, i, num_nodes=pos.shape[0]) + for interact, out_block in zip(self.interaction_blocks, self.output_blocks[1:]): + x = interact(x, rbf, sbf, idx_kj, idx_ji) + P += out_block(x, rbf, i, num_nodes=pos.shape[0]) + + # readout + energy = scatter(P, batch, dim=0, reduce=self.readout) + return energy + + def forward(self, data, return_loss=True, return_prediction=True): + assert ( + return_loss or return_prediction + ), "At least one of return_loss or return_prediction must be True." + pred = self._forward(data) + + loss_dict = {} + if return_loss: + label = data[self.property_names] + label = self.normalize(label) + loss = self.loss_fn( + input=pred, + label=label, + ) + loss_dict["loss"] = loss + + prediction = {} + if return_prediction: + pred = self.unnormalize(pred) + prediction[self.property_names] = pred + return {"loss_dict": loss_dict, "pred_dict": prediction} + + @paddle.no_grad() + def predict(self, graphs): + if isinstance(graphs, list): + results = [] + for graph in graphs: + result = self._forward( + { + "graph": graph, + } + ) + result = self.unnormalize(result).numpy()[0, 0] + result = {self.property_names: result} + results.append(result) + return results + + else: + data = { + "graph": graphs, + } + result = self._forward(data) + result = self.unnormalize(result).numpy()[0, 0] + result = {self.property_names: result} + return result diff --git a/ppmat/models/infgcn/infgcn.py b/ppmat/models/infgcn/infgcn.py new file mode 100644 index 00000000..047408aa --- /dev/null +++ b/ppmat/models/infgcn/infgcn.py @@ -0,0 +1,423 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +from paddle_scatter import scatter + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.math import soft_one_hot_linspace +from ppmat.models.common.e3nn.nn import Activation +from ppmat.models.common.e3nn.nn import Extract +from ppmat.models.common.e3nn.nn import FullyConnectedNet +from ppmat.models.common.orbital import GaussianOrbital +from ppmat.models.common.activation import ScalarActivation +from ppmat.models.common.activation import NormActivation + +from ppmat.datasets.graph_utils.infgcn_graph_utils import radius +from ppmat.datasets.graph_utils.infgcn_graph_utils import radius_graph + + +class GCNLayer(paddle.nn.Layer): + def __init__( + self, + irreps_in, + irreps_out, + irreps_edge, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=True, + use_sc=True, + irrep_normalization="component", + path_normalization="element", + ): + """ + A single InfGCN layer for Tensor Product-based message passing. + If the tensor product is fully connected, we have (for every path) + + .. math:: + z_w=\\sum_{uv}w_{uvw}x_u\\otimes y_v=\\sum_{u}w_{uw}x_u \\otimes y + + Else, we have + + .. math:: + z_u=x_u\\otimes \\sum_v w_{uv}y_v=w_u (x_u\\otimes y) + + Here, uvw are radial (channel) indices of the first input, second input, and output, respectively. + Notice that in our model, the second input is always the spherical harmonics of the edge vector, + so the index v can be safely ignored. + + :param irreps_in: irreducible representations of input node features + :param irreps_out: irreducible representations of output node features + :param irreps_edge: irreducible representations of edge features + :param radial_embed_size: embedding size of the edge length + :param num_radial_layer: number of hidden layers in the radial network + :param radial_hidden_size: hidden size of the radial network + :param is_fc: whether to use fully connected tensor product + :param use_sc: whether to use self-connection + :param irrep_normalization: representation normalization passed to the `o3.FullyConnectedTensorProduct` + :param path_normalization: path normalization passed to the `o3.FullyConnectedTensorProduct` + """ + super(GCNLayer, self).__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.irreps_out = o3.Irreps(irreps_out) + self.irreps_edge = o3.Irreps(irreps_edge) + self.radial_embed_size = radial_embed_size + self.num_radial_layer = num_radial_layer + self.radial_hidden_size = radial_hidden_size + self.is_fc = is_fc + self.use_sc = use_sc + + if self.is_fc: + self.tp = o3.FullyConnectedTensorProduct( + self.irreps_in, + self.irreps_edge, + self.irreps_out, + internal_weights=False, + shared_weights=False, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + ) + else: + instr = [ + (i_1, i_2, i_out, "uvu", True) + for i_1, (_, ir_1) in enumerate(self.irreps_in) + for i_2, (_, ir_edge) in enumerate(self.irreps_edge) + for i_out, (_, ir_out) in enumerate(self.irreps_out) + if ir_out in ir_1 * ir_edge + ] + self.tp = o3.TensorProduct( + self.irreps_in, + self.irreps_edge, + self.irreps_out, + instr, + internal_weights=False, + shared_weights=False, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + ) + self.fc = FullyConnectedNet( # activation function , it will be automatically normalized by a scaling factor + [radial_embed_size] + + num_radial_layer * [radial_hidden_size] + + [self.tp.weight_numel], + paddle.nn.functional.silu, + ) + self.sc = None + if self.use_sc: + self.sc = o3.Linear(self.irreps_in, self.irreps_out) + + def forward(self, edge_index, node_feat, edge_feat, edge_embed, dim_size=None): + src, dst = edge_index + weight = self.fc(edge_embed) # FFN + out = self.tp(node_feat[src], edge_feat, weight=weight) # Tensor Product [num_edges, tp.irreps_out.dim] + + out = scatter(out, dst, dim=0, dim_size=dim_size, reduce="sum") # message aggregation + + if self.use_sc: + out = out + self.sc(node_feat) + return out + + +def pbc_vec(vec, cell): + """ + Apply periodic boundary condition to the vector + :param vec: original vector of (N, K, 3) + :param cell: cell frame of (N, 3, 3) + :return: shortest vector of (N, K, 3) + """ + coord = vec @ paddle.linalg.inv(x=cell) + coord = coord - paddle.round(coord) + pbc_vec = coord @ cell + return pbc_vec.detach() + + +class InfGCN(paddle.nn.Layer): + def __init__( + self, + n_atom_type, + num_radial, + num_spherical, + radial_embed_size, + radial_hidden_size, + num_radial_layer=2, + num_gcn_layer=3, + cutoff=3.0, + grid_cutoff=3.0, + is_fc=True, + gauss_start=0.5, + gauss_end=5.0, + activation="norm", + residual=True, + pbc=False, + target_name="density", + loss_eps=1e-8, + **kwargs, + ): + """ + Implement the InfGCN model for electron density estimation + :param n_atom_type: number of atom types + :param num_radial: number of radial basis + :param num_spherical: maximum number of spherical harmonics for each radial basis, + number of spherical basis will be (num_spherical + 1)^2 + :param radial_embed_size: embedding size of the edge length + :param radial_hidden_size: hidden size of the radial network + :param num_radial_layer: number of hidden layers in the radial network + :param num_gcn_layer: number of InfGCN layers + :param cutoff: cutoff distance for building the molecular graph + :param grid_cutoff: cutoff distance for building the grid-atom graph + :param is_fc: whether the InfGCN layer should use fully connected tensor product + :param gauss_start: start coefficient of the Gaussian radial basis + :param gauss_end: end coefficient of the Gaussian radial basis + :param activation: activation type for the InfGCN layer, can be ['scalar', 'norm'] + :param residual: whether to use the residue prediction layer + :param pbc: whether the data satisfy the periodic boundary condition + """ + super(InfGCN, self).__init__() + self.n_atom_type = n_atom_type + self.num_radial = num_radial + self.num_spherical = num_spherical + self.radial_embed_size = radial_embed_size + self.radial_hidden_size = radial_hidden_size + self.num_radial_layer = num_radial_layer + self.num_gcn_layer = num_gcn_layer + self.cutoff = cutoff + self.grid_cutoff = grid_cutoff + self.is_fc = is_fc + self.gauss_start = gauss_start + self.gauss_end = gauss_end + self.activation = activation + self.residual = residual + self.pbc = pbc + self.target_name = target_name + self.loss_eps = loss_eps + assert activation in ["scalar", "norm"] + self.embedding = paddle.nn.Embedding( + num_embeddings=n_atom_type, embedding_dim=num_radial + ) + self.irreps_sh = o3.Irreps.spherical_harmonics(num_spherical, p=1) + self.irreps_feat = (self.irreps_sh * num_radial).sort().irreps.simplify() + + self.gcns = paddle.nn.LayerList( + sublayers=[ + GCNLayer( + f"{num_radial}x0e" if i == 0 else self.irreps_feat, + self.irreps_feat, + self.irreps_sh, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=is_fc, + **kwargs, + ) + for i in range(num_gcn_layer) + ] + ) + if self.activation == "scalar": + self.act = ScalarActivation( + self.irreps_feat, + paddle.nn.functional.silu, + paddle.nn.functional.sigmoid, + ) + else: + self.act = NormActivation(self.irreps_feat) + self.residue = None + if self.residual: + self.residue = GCNLayer( + self.irreps_feat, + "0e", + self.irreps_sh, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + is_fc=True, + use_sc=False, + **kwargs, + ) + self.orbital = GaussianOrbital( + gauss_start, gauss_end, num_radial, num_spherical + ) + self._criterion = paddle.nn.MSELoss(reduction="mean") + + def forward(self, batch): + """ + Expect a dict batch containing: + - density: electronic density true labels [BS, Grids] + - density_mask: optional mask for sampled grid points + - grid_coord: [B, G, 3] grid coordinates: BS, Grids, Coord + - graph: PGL Batch graph with batch/pos/ptr/x + - batch: map node to graph, number infer to index of batch + - pos: coord of atom [n, 3] + - ptr: refer to start ptr for index of batch in total atom numbers + - x: node feat represent to atom type + - infos: list of dicts, length list = BS, dict: + - cell: lattice vector [3*3] + - shape: grid shape, 3 dimension + - file_name: orginal file name + """ + + # 1.prepare dataset + density = batch["density"] # true label + mask = batch["density_mask"] + grid = batch["grid_coord"].astype("float32") + graph = batch["graph"] # input of model + infos = batch.get("infos", None) + + # 2. preprocess for devices location + device = paddle.get_device() + graph = graph.to(device) + grid = grid.astype("float32").to(device) + if density is not None: + density = density.astype("float32").to(device) + if mask is not None: + mask = mask.astype("float32").to(device) + prepared_infos = self._prepare_infos(infos, device) + + # 3. forward + pred = self._forward_density(graph.x, graph.pos, grid, graph.batch, prepared_infos) + + # 4. mask pred + loss_dict = {} + masked_pred = pred + if mask is not None: + mask = mask.astype(pred.dtype) + masked_pred = pred * mask + + # 5.calculate loss and NMAE + if density is not None: + if mask is not None: + label_masked = density * mask + denom = paddle.sum(mask) + self.loss_eps + loss = paddle.sum((masked_pred - label_masked) ** 2) / denom + # Normalized MAE (original InfGCN): + # mae = sum(|pred - density|) / sum(density) + mae = paddle.sum(paddle.abs(masked_pred - label_masked)) / ( + paddle.sum(label_masked) + self.loss_eps + ) + else: + label_masked = density + loss = self._criterion(pred, label_masked) + mae = paddle.sum(paddle.abs(pred - label_masked)) / ( + paddle.sum(label_masked) + self.loss_eps + ) + loss_dict["loss"] = loss + loss_dict["mae"] = mae + + pred_dict = {self.target_name: masked_pred} + return {"loss_dict": loss_dict, "pred_dict": pred_dict} + + def _prepare_infos(self, infos, device): + if infos is None: + return None + prepared_infos = [] + for info in infos: + cur = dict(info) if isinstance(info, dict) else info + if isinstance(cur, dict) and "cell" in cur and hasattr(cur["cell"], "to"): + cur["cell"] = cur["cell"].to(device) + prepared_infos.append(cur) + return prepared_infos + + def _forward_density(self, atom_types, atom_coord, grid, batch, infos): + """ + Network forward with memory optimization + :param atom_types: atom types of (N,) + :param atom_coord: atom coordinates of (N, 3) + :param grid: coordinates at grid points of (G, K, 3) + :param batch: batch index for each node of (N,) + :param infos: list of dictionary containing additional information + :return: predicted value at each grid point of (G, K) + """ + + # cell = None + # if infos is not None and len(infos) > 0 and "cell" in infos[0]: + # cell = paddle.stack(x=[info["cell"] for info in infos], axis=0).to(batch.place) + cell = paddle.stack(x=[info["cell"] for info in infos], axis=0).to(batch.place) #[BS, 3, 3] + feat = self.embedding(atom_types) + + edge_index = radius_graph(atom_coord, self.cutoff, batch, loop=False) + src, dst = edge_index + edge_vec = atom_coord[src] - atom_coord[dst] # coord vector + edge_len = edge_vec.norm(axis=-1) + 1e-08 # L2 norm, equal to distance + + edge_feat = o3.spherical_harmonics( # angular features(directional), [D_edge_index, 2l+1] + list(range(self.num_spherical + 1)), # degree of the spherical harmonics + edge_vec / edge_len[..., None], # e.g. edge vector + normalize=False, # whether to normalize the x to unit vectors that lie on the sphere for input + normalization="integral", # normalization of the output tensors + ) + + edge_embed = soft_one_hot_linspace( # radial features, [D_edge_index, radial_embed_size] + edge_len, + start=0.0, + end=self.cutoff, + number=self.radial_embed_size, # The number of radial basis functions. + basis="gaussian", # Uses Gaussian functions as the radial basis. + cutoff=False,# Disables the cutoff/smoothing function at the boundary. + ) * (self.radial_embed_size**0.5) # enhance signal feature due to normalization of output + + for i, gcn in enumerate(self.gcns): + feat = gcn( + edge_index, feat, edge_feat, edge_embed, dim_size=atom_types.shape[0] + ) + if i != self.num_gcn_layer - 1: + feat = self.act(feat) + + n_graph, n_sample = grid.shape[0], grid.shape[1] + if self.residual: + grid_flat = grid.view(-1, 3) + grid_batch = paddle.arange(end=n_graph).repeat_interleave(repeats=n_sample) + grid_dst, node_src = radius( + atom_coord, grid_flat, self.grid_cutoff, batch, grid_batch + ) + grid_edge = grid_flat[grid_dst] - atom_coord[node_src] + if grid_edge.shape[0] != 0: + grid_len = paddle.linalg.norm(x=grid_edge, axis=-1) + 1e-08 + grid_edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical + 1)), + grid_edge / (grid_len[..., None] + 1e-08), + normalize=False, + normalization="integral", + ) + grid_edge_embed = soft_one_hot_linspace( + grid_len, + start=0.0, + end=self.grid_cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ) * (self.radial_embed_size**0.5) + + residue = self.residue( + (node_src, grid_dst), + feat, + grid_edge_feat, + grid_edge_embed, + dim_size=grid_flat.shape[0], + ) + else: + residue = paddle.zeros([grid_flat.shape[0], 1], dtype=feat.dtype) + else: + residue = 0.0 + + sample_vec = grid[batch] - atom_coord.unsqueeze(axis=-2) # The displacement (relative position) vectors from each atom to each sampled grid point. [N_atom, N_grid, 3] + if self.pbc and cell is not None: + sample_vec = pbc_vec(sample_vec, cell) + + orbital = self.orbital(sample_vec) # Map the displacement vector at each grid point to a set of Gaussian-type orbital (GTO) basis function values, i.e., a discrete basis expansion of (\psi_{n\ell m}(\mathbf{r})). [N_atom, N_grid,batch, (lmax+1)^2 * num_gauss] + density = (orbital * feat.unsqueeze(axis=1)).sum(axis=-1) # linear combination [n_atom, n_grid] + density = scatter(density, batch, dim=0, reduce="sum") # molecular/cell density + + if self.residual: + density = density + residue.view(*tuple(density.shape)) + + return density diff --git a/ppmat/models/mateno/mateno.py b/ppmat/models/mateno/mateno.py new file mode 100644 index 00000000..ad67e11c --- /dev/null +++ b/ppmat/models/mateno/mateno.py @@ -0,0 +1,456 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import paddle +from paddle_scatter import scatter + +from ppmat.datasets.graph_utils.infgcn_graph_utils import radius, radius_graph + +from ppmat.models.common.e3nn import o3 +from ppmat.models.common.e3nn.math import soft_one_hot_linspace +from ppmat.models.common.orbital import BroadcastGTOTensor +from ppmat.models.common.activation import ScalarActivation +from ppmat.models.common.activation import NormActivation + + +class LogGaussianOrbital(paddle.nn.Layer): + """ + Gaussian orbital with log-spaced bases for better multi-scale coverage. + """ + + def __init__(self, gauss_start: float, gauss_end: float, num_gauss: int, lmax: int = 7): + super().__init__() + self.gauss_start = gauss_start + self.gauss_end = gauss_end + self.num_gauss = num_gauss + self.lmax = lmax + + self.lc2lcm = BroadcastGTOTensor(lmax, num_gauss, src="lc", dst="lcm") + self.m2lcm = BroadcastGTOTensor(lmax, num_gauss, src="m", dst="lcm") + + # log-spaced radial bases (was linear in the reference Paddle implementation) + self.register_buffer( + name="gauss", + tensor=paddle.logspace( + start=paddle.log(paddle.to_tensor(gauss_start)), + stop=paddle.log(paddle.to_tensor(gauss_end)), + num=num_gauss, + base=paddle.exp(paddle.to_tensor(1.0)), + ), + ) + self.register_buffer(name="lognorm", tensor=self._generate_lognorm()) + + def _generate_lognorm(self): + power = (paddle.arange(end=self.lmax + 1) + 1.5).unsqueeze(axis=-1) + numerator = power * paddle.log(x=2 * self.gauss).unsqueeze(axis=0) + paddle.log( + paddle.to_tensor(2.0) + ) + denominator = paddle.lgamma(x=power) + lognorm = (numerator - denominator) / 2 + return lognorm.view(-1) + + def forward(self, vec: paddle.Tensor) -> paddle.Tensor: + r = vec.norm(axis=-1) + 1e-8 + spherical = o3.spherical_harmonics( + list(range(self.lmax + 1)), + vec / r[..., None], + normalize=False, + normalization="integral", + ) + r = r.unsqueeze(axis=-1) + lognorm = self.lognorm * paddle.ones_like(x=r) + exponent = -self.gauss * (r * r) + poly = paddle.arange(dtype="float32", end=self.lmax + 1) * paddle.log(x=r) + log = exponent.unsqueeze(axis=-2) + poly.unsqueeze(axis=-1) + radial = paddle.exp(x=log.view(*tuple(log.shape)[:-2], -1) + lognorm) + return self.lc2lcm(radial) * self.m2lcm(spherical) + + +class EnhancedGCNLayer(paddle.nn.Layer): + """ + GCN layer with optional atom-type-aware modulation of tensor-product weights. + """ + + def __init__( + self, + irreps_in, + irreps_out, + irreps_edge, + radial_embed_size, + num_radial_layer, + radial_hidden_size, + n_atom_type, + is_fc=True, + use_sc=False, + irrep_normalization="component", + path_normalization="element", + ): + super().__init__() + self.irreps_in = o3.Irreps(irreps_in) + self.irreps_out = o3.Irreps(irreps_out) + self.irreps_edge = o3.Irreps(irreps_edge) + self.radial_embed_size = radial_embed_size + self.is_fc = is_fc + self.use_sc = use_sc + + if self.is_fc: + self.tp = o3.FullyConnectedTensorProduct( + self.irreps_in, + self.irreps_edge, + self.irreps_out, + internal_weights=False, + shared_weights=False, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + ) + else: + instr = [ + (i_1, i_2, i_out, "uvu", True) + for i_1, (_, ir_1) in enumerate(self.irreps_in) + for i_2, (_, ir_edge) in enumerate(self.irreps_edge) + for i_out, (_, ir_out) in enumerate(self.irreps_out) + if ir_out in ir_1 * ir_edge + ] + self.tp = o3.TensorProduct( + self.irreps_in, + self.irreps_edge, + self.irreps_out, + instr, + internal_weights=False, + shared_weights=False, + irrep_normalization=irrep_normalization, + path_normalization=path_normalization, + ) + + self.fc = paddle.nn.Sequential( + paddle.nn.Linear(radial_embed_size, radial_hidden_size), + paddle.nn.Silu(), + *sum( + [ + [paddle.nn.Linear(radial_hidden_size, radial_hidden_size), paddle.nn.Silu()] + for _ in range(num_radial_layer - 1) + ], + [], + ), + paddle.nn.Linear(radial_hidden_size, self.tp.weight_numel), + ) + + self.sc = None + if self.use_sc: + self.sc = o3.Linear(self.irreps_in, self.irreps_out) + + # atom-type conditioning branch + self.atom_attr_embedding = paddle.nn.Sequential( + paddle.nn.Linear(n_atom_type, radial_hidden_size), + paddle.nn.Silu(), + paddle.nn.Linear(radial_hidden_size, radial_hidden_size), + ) + self.atom_edge_influence = paddle.nn.Sequential( + paddle.nn.Linear(radial_hidden_size + radial_embed_size, radial_hidden_size), + paddle.nn.Silu(), + paddle.nn.Linear(radial_hidden_size, radial_hidden_size), + ) + self.weight_modulator = paddle.nn.Sequential( + paddle.nn.Linear(radial_hidden_size, radial_hidden_size // 2), + paddle.nn.Silu(), + paddle.nn.Linear(radial_hidden_size // 2, 1), + paddle.nn.Sigmoid(), + ) + + def forward( + self, + edge_index, + node_feat, + edge_feat, + edge_embed, + node_attrs=None, + dim_size=None, + ): + src, dst = edge_index + base_weights = self.fc(edge_embed) + + if node_attrs is not None: + atom_features = self.atom_attr_embedding(node_attrs) + atom_edge_features = paddle.concat(x=[atom_features[src], edge_embed], axis=-1) + edge_modulation = self.atom_edge_influence(atom_edge_features) + weight_scaling = self.weight_modulator(edge_modulation) + adjusted_weights = base_weights * (1.0 + weight_scaling) + else: + adjusted_weights = base_weights + + out = self.tp(node_feat[src], edge_feat, weight=adjusted_weights) + out = scatter(out, dst, dim=0, dim_size=dim_size, reduce="sum") + if self.use_sc and self.sc is not None: + out = out + self.sc(node_feat) + return out + + +class MatENO(paddle.nn.Layer): + """ + Paddle version of the optimized InfGCN: wider embedding, log-spaced orbitals, + atom-type-aware message passing, and grid residue. + """ + + def __init__( + self, + n_atom_type: int, + num_radial: int, + num_spherical: int, + radial_embed_size: int, + radial_hidden_size: int, + num_radial_layer: int = 2, + num_gcn_layer: int = 3, + cutoff: float = 3.0, + grid_cutoff: float = 3.0, + gauss_start: float = 0.5, + gauss_end: float = 5.0, + activation: str = "norm", + residual: bool = True, + pbc: bool = False, + is_fc: bool = True, + embedding_dim: int = 512, + max_num_neighbors: int = 32, + target_name: str = "density", + label_key: str = "density", + mask_key: str = "density_mask", + loss_eps: float = 1e-8, + **kwargs, + ): + super().__init__() + assert activation in ["scalar", "norm"] + + self.n_atom_type = n_atom_type + self.num_radial = num_radial + self.num_spherical = num_spherical + self.radial_embed_size = radial_embed_size + self.radial_hidden_size = radial_hidden_size + self.num_radial_layer = num_radial_layer + self.num_gcn_layer = num_gcn_layer + self.cutoff = cutoff + self.grid_cutoff = grid_cutoff + self.activation = activation + self.residual = residual + self.pbc = pbc + self.max_num_neighbors = max_num_neighbors + self.target_name = target_name + self.label_key = label_key + self.mask_key = mask_key + self.loss_eps = loss_eps + self._criterion = paddle.nn.MSELoss(reduction="mean") + + self.embedding = paddle.nn.Embedding(num_embeddings=n_atom_type, embedding_dim=embedding_dim) + self._init_embeddings() + + self.irreps_sh = o3.Irreps.spherical_harmonics(num_spherical, p=1) + self.irreps_feat = (self.irreps_sh * num_radial).sort().irreps.simplify() + + self.gcns = paddle.nn.LayerList( + [ + EnhancedGCNLayer( + irreps_in=(f"{embedding_dim}x0e" if i == 0 else self.irreps_feat), + irreps_out=self.irreps_feat, + irreps_edge=self.irreps_sh, + radial_embed_size=radial_embed_size, + num_radial_layer=num_radial_layer, + radial_hidden_size=radial_hidden_size, + n_atom_type=n_atom_type, + is_fc=(True if i == 0 else is_fc), + use_sc=False, + ) + for i in range(num_gcn_layer) + ] + ) + + self.act = ( + ScalarActivation(self.irreps_feat, paddle.nn.functional.silu, paddle.nn.functional.sigmoid) + if activation == "scalar" + else NormActivation(self.irreps_feat) + ) + + self.residue = None + if self.residual: + self.residue = EnhancedGCNLayer( + irreps_in=self.irreps_feat, + irreps_out=o3.Irreps("0e"), + irreps_edge=self.irreps_sh, + radial_embed_size=radial_embed_size, + num_radial_layer=num_radial_layer, + radial_hidden_size=radial_hidden_size, + n_atom_type=n_atom_type, + is_fc=True, + use_sc=False, + ) + + self.orbital = LogGaussianOrbital(gauss_start, gauss_end, num_radial, num_spherical) + + def _init_embeddings(self): + paddle.nn.initializer.XavierUniform()(self.embedding.weight) + + def forward(self, *args, **kwargs): + if len(args) == 1 and isinstance(args[0], dict): + return self._forward_with_batch(args[0]) + return self._forward_density(*args, **kwargs) + + def _forward_with_batch(self, batch): + graph = batch["graph"] + density = batch.get(self.label_key, None) + grid = batch["grid_coord"] + infos = batch.get("infos", None) + mask = batch.get(self.mask_key, None) + + device = paddle.get_device() + graph = graph.to(device) + grid = grid.astype("float32").to(device) + if density is not None: + density = density.astype("float32").to(device) + if mask is not None: + mask = mask.astype("float32").to(device) + prepared_infos = self._prepare_infos(infos, device) + + pred = self._forward_density(graph.x, graph.pos, grid, graph.batch, prepared_infos) + + loss_dict = {} + masked_pred = pred + if mask is not None: + mask = mask.astype(pred.dtype) + masked_pred = pred * mask + + if density is not None: + if mask is not None: + label_masked = density * mask + denom = paddle.sum(mask) + self.loss_eps + loss = paddle.sum((masked_pred - label_masked) ** 2) / denom + mae = paddle.sum(paddle.abs(masked_pred - label_masked)) / denom + else: + label_masked = density + loss = self._criterion(pred, label_masked) + mae = paddle.mean(paddle.abs(pred - label_masked)) + loss_dict["loss"] = loss + loss_dict["mae"] = mae + + pred_dict = {self.target_name: masked_pred} + return {"loss_dict": loss_dict, "pred_dict": pred_dict} + + def _prepare_infos(self, infos, device): + if infos is None: + return None + prepared_infos = [] + for info in infos: + cur = dict(info) if isinstance(info, dict) else info + if isinstance(cur, dict) and "cell" in cur and hasattr(cur["cell"], "to"): + cur["cell"] = cur["cell"].to(device) + prepared_infos.append(cur) + return prepared_infos + + def _forward_density(self, atom_types, atom_coord, grid, batch, infos): + cell = None + if infos is not None and len(infos) > 0: + first_info = infos[0] + if isinstance(first_info, dict) and "cell" in first_info: + cell = paddle.stack(x=[info["cell"] for info in infos], axis=0).astype(atom_coord.dtype) + + feat = self.embedding(atom_types) + node_attrs = paddle.nn.functional.one_hot(atom_types, self.n_atom_type).astype("float32") + + edge_index = radius_graph( + atom_coord, + self.cutoff, + batch, + loop=False, + max_num_neighbors=self.max_num_neighbors, + ) + src, dst = edge_index + edge_vec = atom_coord[src] - atom_coord[dst] + edge_len = paddle.norm(edge_vec, axis=-1) + 1e-8 + edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical + 1)), + edge_vec / edge_len[..., None], + normalize=False, + normalization="integral", + ) + edge_embed = soft_one_hot_linspace( + edge_len, + start=0.0, + end=self.cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ) * (self.radial_embed_size**0.5) + + for i, gcn in enumerate(self.gcns): + feat = gcn(edge_index, feat, edge_feat, edge_embed, node_attrs, dim_size=atom_types.shape[0]) + if i != self.num_gcn_layer - 1: + feat = self.act(feat) + + n_graph, n_sample = grid.shape[0], grid.shape[1] + if self.residual: + grid_flat = grid.reshape([-1, 3]) + grid_batch = paddle.arange(n_graph, dtype="int64").repeat_interleave(repeats=n_sample) + grid_dst, node_src = radius( + atom_coord, + grid_flat, + self.grid_cutoff, + batch, + grid_batch, + max_num_neighbors=self.max_num_neighbors, + ) + grid_edge = grid_flat[grid_dst] - atom_coord[node_src] + if grid_edge.shape[0] != 0: + grid_len = paddle.norm(grid_edge, axis=-1) + 1e-8 + grid_edge_feat = o3.spherical_harmonics( + list(range(self.num_spherical + 1)), + grid_edge / (grid_len[..., None] + 1e-8), + normalize=False, + normalization="integral", + ) + grid_edge_embed = soft_one_hot_linspace( + grid_len, + start=0.0, + end=self.grid_cutoff, + number=self.radial_embed_size, + basis="gaussian", + cutoff=False, + ) * (self.radial_embed_size**0.5) + + residue = self.residue( + edge_index=(node_src, grid_dst), + node_feat=feat, + edge_feat=grid_edge_feat, + edge_embed=grid_edge_embed, + node_attrs=node_attrs, + dim_size=grid_flat.shape[0], + ) + else: + residue = paddle.zeros([grid_flat.shape[0], 1], dtype=feat.dtype) + else: + residue = 0.0 + + sample_vec = grid[batch] - atom_coord.unsqueeze(axis=-2) + if self.pbc and cell is not None: + sample_vec = self._pbc_vec(sample_vec, cell[batch]) + orbital = self.orbital(sample_vec) + density = (orbital * feat.unsqueeze(axis=1)).sum(axis=-1) + density = scatter(density, batch, dim=0, reduce="sum") + + if self.residual: + density = density + residue.reshape(density.shape) + + return density + + @staticmethod + def _pbc_vec(vec, cell): + coord = vec @ paddle.linalg.inv(cell) + coord = coord - paddle.round(coord) + pbc_vec = coord @ cell + return pbc_vec.detach() diff --git a/ppmat/models/mattergen/gemnet-dT.json b/ppmat/models/mattergen/gemnet-dT.json new file mode 100644 index 00000000..6e7ebd87 --- /dev/null +++ b/ppmat/models/mattergen/gemnet-dT.json @@ -0,0 +1,20 @@ +{ + "AtomUpdate_1_sum": 1.220463752746582, + "AtomUpdate_2_sum": 0.9690994620323181, + "AtomUpdate_3_sum": 0.8903237581253052, + "OutBlock_0_had": 16.161039352416992, + "OutBlock_0_sum": 1.6437848806381226, + "OutBlock_1_had": 13.54678726196289, + "OutBlock_1_sum": 1.1077653169631958, + "OutBlock_2_had": 12.754337310791016, + "OutBlock_2_sum": 0.9477927684783936, + "OutBlock_3_had": 13.484951972961426, + "OutBlock_3_sum": 0.9059251546859741, + "TripInteraction_1_had_rbf": 18.873615264892578, + "TripInteraction_1_sum_cbf": 7.996850490570068, + "TripInteraction_2_had_rbf": 16.10817527770996, + "TripInteraction_2_sum_cbf": 7.614634037017822, + "TripInteraction_3_had_rbf": 15.01930046081543, + "TripInteraction_3_sum_cbf": 7.025179862976074, + "comment": "tri_gaussian128, from https://github.com/FAIR-Chem/fairchem/blob/main/configs/s2ef/all/gemnet/scaling_factors/gemnet-dT.json" +} diff --git a/ppmat/models/mattergen/globals.py b/ppmat/models/mattergen/globals.py new file mode 100644 index 00000000..d0393241 --- /dev/null +++ b/ppmat/models/mattergen/globals.py @@ -0,0 +1,27 @@ +# 版权所有(C)2026 苏州国家实验室、百度飞桨团队 +# 本代码由苏州国家实验室与百度飞桨团队合作开发完成。 +# 其中,苏州国家实验室提供模型框架设计思路,百度飞桨团队负责代码实现。 +# 双方对本代码及相关成果享有同等权利。 + +# Copyright (C) 2026 Suzhou National Laboratory and Baidu PaddlePaddle team +# This code was jointly developed by Suzhou National Laboratory and Baidu PaddlePaddle team. +# Suzhou National Laboratory provided the design concept for the model framework, +# and Baidu PaddlePaddle team was responsible for the code implementation. +# Both parties shall have equal rights to use this code and related work products. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +_USE_UNCONDITIONAL_EMBEDDING = "_USE_UNCONDITIONAL_EMBEDDING" + +MAX_ATOMIC_NUM = 100 diff --git a/ppmat/models/mattergen/mattergen.py b/ppmat/models/mattergen/mattergen.py new file mode 100644 index 00000000..0f48626d --- /dev/null +++ b/ppmat/models/mattergen/mattergen.py @@ -0,0 +1,2938 @@ +# 版权所有(C)2026 苏州国家实验室、百度飞桨团队 +# 本代码由苏州国家实验室与百度飞桨团队合作开发完成。 +# 其中,苏州国家实验室提供模型框架设计思路,百度飞桨团队负责代码实现。 +# 双方对本代码及相关成果享有同等权利。 + +# Copyright (C) 2026 Suzhou National Laboratory and Baidu PaddlePaddle team +# This code was jointly developed by Suzhou National Laboratory and Baidu PaddlePaddle team. +# Suzhou National Laboratory provided the design concept for the model framework, +# and Baidu PaddlePaddle team was responsible for the code implementation. +# Both parties shall have equal rights to use this code and related work products. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import math +import os +import sys +from collections.abc import Callable +from typing import Any +from typing import Dict +from typing import List +from typing import Literal +from typing import Optional +from typing import Tuple + +import numpy as np +import paddle +from tqdm import tqdm + +from ppmat.models.common.activation import ScaledSiLU +from ppmat.models.common.activation import SiQU +from ppmat.models.common.initializer import he_orthogonal_init +from ppmat.models.common.radial_basis import RadialBasis +from ppmat.models.common.spherical_basis import CircularBasisLayer +from ppmat.models.common.time_embedding import NoiseLevelEncoding +from ppmat.models.common.time_embedding import UniformTimestepSampler +from ppmat.models.mattergen.globals import _USE_UNCONDITIONAL_EMBEDDING +from ppmat.models.mattergen.globals import MAX_ATOMIC_NUM +from ppmat.models.mattergen.property_embeddings import PropertyEmbedding +from ppmat.models.mattergen.property_embeddings import SetConditionalEmbeddingType +from ppmat.models.mattergen.property_embeddings import SetEmbeddingType +from ppmat.models.mattergen.property_embeddings import SetPropertyScalers +from ppmat.models.mattergen.property_embeddings import SetUnconditionalEmbeddingType +from ppmat.models.mattergen.property_embeddings import get_use_unconditional_embedding +from ppmat.schedulers import build_scheduler +from ppmat.utils import logger +from ppmat.utils import paddle_aux # noqa +from ppmat.utils.crystal import frac_to_cart_coords_with_lattice +from ppmat.utils.crystal import lattice_params_to_matrix_paddle +from ppmat.utils.io import read_value_json +from ppmat.utils.io import update_json +from ppmat.utils.misc import aggregate_per_sample +from ppmat.utils.misc import make_noise_symmetric_preserve_variance +from ppmat.utils.misc import ragged_range +from ppmat.utils.misc import repeat_blocks +from ppmat.utils.paddle_aux import dim2perm +from ppmat.utils.scatter import scatter + + +def inner_product_normalized(x: paddle.Tensor, y: paddle.Tensor) -> paddle.Tensor: + """ + Calculate the inner product between the given normalized vectors, + giving a result between -1 and 1. + """ + return paddle.sum(x=x * y, axis=-1).clip(min=-1, max=1) + + +def get_max_neighbors_mask( + natoms: paddle.Tensor, + index: paddle.Tensor, + atom_distance_squared: paddle.Tensor, + max_num_neighbors_threshold: int, +) -> tuple[paddle.Tensor, paddle.Tensor]: + """ + Give a mask that filters out edges so that each atom has at most + `max_num_neighbors_threshold` neighbors. + Assumes that `index` is sorted. + """ + num_atoms = natoms.sum() + + # Temporary use of alternative methods, no longer using paddle_scatter + # https://github.com/PFCCLab/paddle_scatter/tree/main + # ================================================================================== + # ones = paddle.ones(shape=[1], dtype=index.dtype).expand_as(y=index) + # num_neighbors = segment_coo(ones, index, dim_size=num_atoms) + + num_neighbors = paddle.zeros(shape=num_atoms) + num_neighbors.index_add_(axis=0, index=index, value=paddle.ones(shape=len(index))) + num_neighbors = num_neighbors.astype(dtype="int64") + # ================================================================================== + + # Temporary use of alternative methods, no longer using paddle_scatter + # https://github.com/PFCCLab/paddle_scatter/tree/main + # ================================================================================== + # max_num_neighbors = num_neighbors.max() + # num_neighbors_thresholded = num_neighbors.clip(max=max_num_neighbors_threshold) + # image_indptr = paddle.zeros(shape=tuple(natoms.shape)[0] + 1, dtype="int64") + # image_indptr[1:] = paddle.cumsum(x=natoms, axis=0) + # num_neighbors_image = segment_csr(num_neighbors_thresholded, image_indptr) + + max_num_neighbors = paddle.max(x=num_neighbors).astype(dtype="int64") + _max_neighbors = copy.deepcopy(num_neighbors) + _max_neighbors[ + _max_neighbors > max_num_neighbors_threshold + ] = max_num_neighbors_threshold + _num_neighbors = paddle.zeros(shape=num_atoms + 1).astype(dtype="int64") + _natoms = paddle.zeros(shape=tuple(natoms.shape)[0] + 1).astype(dtype="int64") + _num_neighbors[1:] = paddle.cumsum(x=_max_neighbors, axis=0) + _natoms[1:] = paddle.cumsum(x=natoms, axis=0) + num_neighbors_image = _num_neighbors[_natoms[1:]] - _num_neighbors[_natoms[:-1]] + # ================================================================================== + + if ( + max_num_neighbors <= max_num_neighbors_threshold + or max_num_neighbors_threshold <= 0 + ): + mask_num_neighbors = paddle.to_tensor(data=[True], dtype=bool).expand_as( + y=index + ) + return mask_num_neighbors, num_neighbors_image + distance_sort = paddle.full( + shape=[num_atoms * max_num_neighbors], fill_value=np.inf + ) + index_neighbor_offset = paddle.cumsum(x=num_neighbors, axis=0) - num_neighbors + index_neighbor_offset_expand = paddle.repeat_interleave( + x=index_neighbor_offset, repeats=num_neighbors + ) + index_sort_map = ( + index * max_num_neighbors + + paddle.arange(end=len(index)) + - index_neighbor_offset_expand # noqa + ) + distance_sort.scatter_(index_sort_map, atom_distance_squared) + distance_sort = distance_sort.view(num_atoms, max_num_neighbors) + distance_sort, index_sort = paddle.sort(x=distance_sort, axis=1), paddle.argsort( + x=distance_sort, axis=1 + ) + distance_sort = distance_sort[:, :max_num_neighbors_threshold] + index_sort = index_sort[:, :max_num_neighbors_threshold] + index_sort = index_sort + index_neighbor_offset.view(-1, 1).expand( + shape=[-1, max_num_neighbors_threshold] + ) + mask_finite = paddle.isfinite(x=distance_sort) + index_sort = paddle.masked_select(x=index_sort, mask=mask_finite) + mask_num_neighbors = paddle.zeros(shape=len(index), dtype=bool) + mask_num_neighbors.index_fill_(axis=0, index=index_sort, value=True) + return mask_num_neighbors, num_neighbors_image + + +def radius_graph_pbc_ocp( + pos: paddle.Tensor, + pbc: paddle.Tensor | None, + natoms: paddle.Tensor, + cell: paddle.Tensor, + radius: float, + max_num_neighbors_threshold: int, + max_cell_images_per_dim: int = sys.maxsize, +) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """Function computing the graph in periodic boundary conditions on a (batched) set + of positions and cells. + + This function is copied from + https://github.com/Open-Catalyst-Project/ocp/blob/main/ocpmodels/common/utils.py, + commit 480eb9279ec4a5885981f1ee588c99dcb38838b5 + + Args: + pos (LongTensor): Atomic positions in cartesian coordinates + :obj:`[n, 3]` + pbc (BoolTensor): indicates periodic boundary conditions per structure. + :obj:`[n_structures, 3]` + natoms (IntTensor): number of atoms per structure. Has shape + :obj:`[n_structures]` + cell (Tensor): atomic cell. Has shape + :obj:`[n_structures, 3, 3]` + radius (float): cutoff radius distance + max_num_neighbors_threshold (int): Maximum number of neighbours to consider. + + Returns: + edge_index (IntTensor): index of atoms in edges. Has shape + :obj:`[n_edges, 2]` + cell_offsets (IntTensor): cell displacement w.r.t. their original position of + atoms in edges. Has shape + :obj:`[n_edges, 3, 3]` + num_neighbors_image (IntTensor): Number of neighbours per cell image. + :obj:`[n_structures]` + offsets (LongTensor): cartesian displacement w.r.t. their original position of + atoms in edges. Has shape + :obj:`[n_edges, 3, 3]` + atom_distance (LongTensor): edge length. Has shape + :obj:`[n_edges]` + """ + batch_size = len(natoms) + pbc_ = [False, False, False] + if pbc is not None: + pbc = paddle.atleast_2d(pbc) + for i in range(3): + if not paddle.any(x=pbc[:, i]).item(): + pbc_[i] = False + elif paddle.all(x=pbc[:, i]).item(): + pbc_[i] = True + else: + raise RuntimeError( + "Different structures in the batch have different PBC " + "configurations. This is not currently supported." + ) + natoms_squared = (natoms**2).astype(dtype="int64") + index_offset = paddle.cumsum(x=natoms, axis=0) - natoms + index_offset_expand = paddle.repeat_interleave( + x=index_offset, repeats=natoms_squared + ) + natoms_expand = paddle.repeat_interleave(x=natoms, repeats=natoms_squared) + num_atom_pairs = paddle.sum(x=natoms_squared) + index_squared_offset = paddle.cumsum(x=natoms_squared, axis=0) - natoms_squared + index_squared_offset = paddle.repeat_interleave( + x=index_squared_offset, repeats=natoms_squared + ) + atom_count_squared = paddle.arange(end=num_atom_pairs) - index_squared_offset + + index1_tmp = paddle.divide(x=atom_count_squared, y=natoms_expand) + index1 = paddle.floor(index1_tmp).astype("int64") + index_offset_expand + index2 = atom_count_squared % natoms_expand + index_offset_expand + pos1 = paddle.index_select(x=pos, axis=0, index=index1) + pos2 = paddle.index_select(x=pos, axis=0, index=index2) + cross_a2a3 = paddle.cross(x=cell[:, 1], y=cell[:, 2], axis=-1) + cell_vol = paddle.sum(x=cell[:, 0] * cross_a2a3, axis=-1, keepdim=True) + if pbc_[0]: + inv_min_dist_a1 = paddle.linalg.norm(x=cross_a2a3 / cell_vol, p=2, axis=-1) + rep_a1 = paddle.ceil(x=radius * inv_min_dist_a1) + else: + rep_a1 = paddle.zeros(shape=[1], dtype=cell.dtype) + if pbc_[1]: + cross_a3a1 = paddle.cross(x=cell[:, 2], y=cell[:, 0], axis=-1) + inv_min_dist_a2 = paddle.linalg.norm(x=cross_a3a1 / cell_vol, p=2, axis=-1) + rep_a2 = paddle.ceil(x=radius * inv_min_dist_a2) + else: + rep_a2 = paddle.zeros(shape=[1], dtype=cell.dtype) + if pbc_[2]: + cross_a1a2 = paddle.cross(x=cell[:, 0], y=cell[:, 1], axis=-1) + inv_min_dist_a3 = paddle.linalg.norm(x=cross_a1a2 / cell_vol, p=2, axis=-1) + rep_a3 = paddle.ceil(x=radius * inv_min_dist_a3) + else: + rep_a3 = paddle.zeros(shape=[1], dtype=cell.dtype) + max_rep = [ + min(int(rep_a1.max()), max_cell_images_per_dim), + min(int(rep_a2.max()), max_cell_images_per_dim), + min(int(rep_a3.max()), max_cell_images_per_dim), + ] + cells_per_dim = [ + paddle.arange(start=-rep, end=rep + 1, dtype="float32") for rep in max_rep + ] # noqa + cell_offsets = paddle.cartesian_prod(x=cells_per_dim) + num_cells = len(cell_offsets) + cell_offsets_per_atom = cell_offsets.view(1, num_cells, 3).tile( + repeat_times=[len(index2), 1, 1] + ) + cell_offsets = paddle.transpose( + x=cell_offsets, perm=dim2perm(cell_offsets.ndim, 0, 1) + ) # noqa + cell_offsets_batch = cell_offsets.view(1, 3, num_cells).expand( + shape=[batch_size, -1, -1] + ) # noqa + data_cell = paddle.transpose(x=cell, perm=dim2perm(cell.ndim, 1, 2)) + pbc_offsets = paddle.bmm(x=data_cell, y=cell_offsets_batch) + pbc_offsets_per_atom = paddle.repeat_interleave( + x=pbc_offsets, repeats=natoms_squared, axis=0 + ) # noqa + pos1 = pos1.view(-1, 3, 1).expand(shape=[-1, -1, num_cells]) + pos2 = pos2.view(-1, 3, 1).expand(shape=[-1, -1, num_cells]) + index1 = index1.view(-1, 1).tile(repeat_times=[1, num_cells]).view(-1) + index2 = index2.view(-1, 1).tile(repeat_times=[1, num_cells]).view(-1) + pos2 = pos2 + pbc_offsets_per_atom + atom_distance_squared = paddle.sum(x=(pos1 - pos2) ** 2, axis=1) + atom_distance_squared = atom_distance_squared.view(-1) + mask_within_radius = paddle.less_equal( + x=atom_distance_squared, y=paddle.to_tensor(radius * radius) + ) + mask_not_same = paddle.greater_than( + x=atom_distance_squared, y=paddle.to_tensor(0.0001) + ) # noqa + mask = paddle.logical_and(x=mask_within_radius, y=mask_not_same) + index1 = paddle.masked_select(x=index1, mask=mask) + index2 = paddle.masked_select(x=index2, mask=mask) + cell_offsets = paddle.masked_select( + x=cell_offsets_per_atom.view(-1, 3), mask=mask.view(-1, 1).expand(shape=[-1, 3]) + ) + cell_offsets = cell_offsets.view(-1, 3) + atom_distance_squared = paddle.masked_select(x=atom_distance_squared, mask=mask) + mask_num_neighbors, num_neighbors_image = get_max_neighbors_mask( + natoms=natoms, + index=index1, + atom_distance_squared=atom_distance_squared, + max_num_neighbors_threshold=max_num_neighbors_threshold, + ) + if not paddle.all(x=mask_num_neighbors): + index1 = paddle.masked_select(x=index1, mask=mask_num_neighbors) + index2 = paddle.masked_select(x=index2, mask=mask_num_neighbors) + atom_distance_squared = paddle.masked_select( + x=atom_distance_squared, mask=mask_num_neighbors + ) + cell_offsets = paddle.masked_select( + x=cell_offsets.view(-1, 3), + mask=mask_num_neighbors.view(-1, 1).expand(shape=[-1, 3]), + ) + cell_offsets = cell_offsets.view(-1, 3) + edge_index = paddle.stack(x=(index2, index1)) + cell_repeated = paddle.repeat_interleave( + x=cell, repeats=num_neighbors_image, axis=0 + ) # noqa + offsets = ( + -cell_offsets.astype(dtype="float32") + .view(-1, 1, 3) + .bmm(y=cell_repeated.astype(dtype="float32")) + .view(-1, 3) + ) + return ( + edge_index, + cell_offsets, + num_neighbors_image, + offsets, + paddle.sqrt(x=atom_distance_squared), + ) + + +def get_pbc_distances( + coords: paddle.Tensor, + edge_index: paddle.Tensor, + lattice: paddle.Tensor, + to_jimages: paddle.Tensor, + num_atoms: paddle.Tensor, + num_bonds: paddle.Tensor, + coord_is_cart: bool = False, + return_offsets: bool = False, + return_distance_vec: bool = False, +) -> paddle.Tensor: + if coord_is_cart: + pos = coords + else: + lattice_nodes = paddle.repeat_interleave(x=lattice, repeats=num_atoms, axis=0) + pos = paddle.einsum("bi,bij->bj", coords, lattice_nodes) + j_index, i_index = edge_index + distance_vectors = pos[j_index] - pos[i_index] + lattice_edges = paddle.repeat_interleave(x=lattice, repeats=num_bonds, axis=0) + offsets = paddle.einsum( + "bi,bij->bj", to_jimages.astype(dtype="float32"), lattice_edges + ) # noqa + distance_vectors += offsets + distances = distance_vectors.norm(axis=-1) + out = {"edge_index": edge_index, "distances": distances} + if return_distance_vec: + out["distance_vec"] = distance_vectors + if return_offsets: + out["offsets"] = offsets + return out + + +def radius_graph_pbc( + cart_coords: paddle.Tensor, + lattice: paddle.Tensor, + num_atoms: paddle.Tensor, + radius: float, + max_num_neighbors_threshold: int, + max_cell_images_per_dim: int = 10, + topk_per_pair: (paddle.Tensor | None) = None, +) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """Computes pbc graph edges under pbc. + + topk_per_pair: (num_atom_pairs,), select topk edges per atom pair + + Note: topk should take into account self-self edge for (i, i) + + Keyword arguments + ----------------- + cart_cords.shape=[Ntotal, 3] -- concatenate all atoms over all crystals + lattice.shape=[Ncrystal, 3, 3] + num_atoms.shape=[Ncrystal] + max_cell_images_per_dim -- constrain the max. number of cell images per + dimension in event that infinitesimal angles between + lattice vectors are encountered. + + WARNING: It is possible (and has been observed) that for rare cases when periodic + atom images are on or close to the cut off radius boundary, doing these operations + in 32 bit floating point can lead to atoms being spuriously considered within or + outside of the cut off radius. This can lead to invariance of the neighbour list + under global translation of all atoms in the unit cell. For the rare cases where + this was observed, switching to 64 bit precision solved the issue. Since all graph + embeddings should taper messages from neighbours to zero at the cut off radius, + the effect of these errors in 32-bit should be negligible in practice. + """ + assert topk_per_pair is None, "non None values of topk_per_pair is not supported" + edge_index, unit_cell, num_neighbors_image, _, _ = radius_graph_pbc_ocp( + pos=cart_coords, + cell=lattice, + natoms=num_atoms, + pbc=paddle.to_tensor(data=[True, True, True], dtype="float32") + .to("bool") + .to(cart_coords.place), + radius=radius, + max_num_neighbors_threshold=max_num_neighbors_threshold, + max_cell_images_per_dim=max_cell_images_per_dim, + ) + return edge_index, unit_cell, num_neighbors_image + + +def edge_score_to_lattice_score_frac_symmetric( + score_d: paddle.Tensor, + edge_index: paddle.Tensor, + edge_vectors: paddle.Tensor, + batch: paddle.Tensor, +) -> paddle.Tensor: + """Converts a score per edge into a score for the atom coordinates and/or the + lattice matrix via the chain rule. This method explicitly takes into account the + fact that the cartesian coordinates depend on the lattice via the fractional + coordinates. Moreover, we make sure to get a symmetric update: + D_cart_norm @ Phi @ D_cart_norm^T, where Phi is a |E| x |E| diagonal matrix with + the predicted edge scores + + Args: + score_d (paddle.Tensor, [num_edges,]): A score per edge in the graph. + edge_index (paddle.Tensor, [2, num_edges]): The edge indices in the graph. + edge_vectors (paddle.Tensor, [num_edges, 3]): The vectors connecting the source + of each edge to the target. + lattice_matrix (paddle.Tensor, [num_nodes, 3, 3]): The lattice matrices for + each crystal in num_nodes. + batch (paddle.Tensor, [num_nodes,]): The pointer indicating for each atom which + molecule in the batch it belongs to. + + Returns: + paddle.Tensor: The predicted lattice score. + """ + batch_edge = batch[edge_index[0]] + unit_edge_vectors_cart = edge_vectors / edge_vectors.norm(axis=-1, keepdim=True) + score_lattice = scatter( + score_d[:, None, None] + * (unit_edge_vectors_cart[:, :, None] @ unit_edge_vectors_cart[:, None, :]), + batch_edge, + dim=0, + dim_size=batch.max() + 1, + reduce="add", + ) + score_lattice = score_lattice.transpose([0, -1, -2]) + return score_lattice + + +class AtomEmbedding(paddle.nn.Layer): + """Atom Embedding Layer. + This layer embeds the atomic number of each atom into a vector of size `emb_size`. + The atomic number is assumed to be in the range [1, `MAX_ATOMIC_NUM`]. + + Args: + emb_size (int): Embedding dimension, i.e. the length of the embedding vector. + with_mask_type (bool, optional): Whether to add an extra mask token. Defaults + to False. + """ + + def __init__(self, emb_size: int, with_mask_type=False): + super().__init__() + self.emb_size = emb_size + self.embeddings = paddle.nn.Embedding( + num_embeddings=MAX_ATOMIC_NUM + int(with_mask_type), embedding_dim=emb_size + ) + init_Uniform = paddle.nn.initializer.Uniform(low=-np.sqrt(3), high=np.sqrt(3)) + init_Uniform(self.embeddings.weight) + + def forward(self, Z): + h = self.embeddings(Z - 1) + return h + + +class AutomaticFit: + """ + All added variables are processed in the order of creation. + """ + + activeVar = None + queue = None + fitting_mode = False + + def __init__(self, variable, scale_file, name): + self.variable = variable + self.scale_file = scale_file + self._name = name + self._fitted = False + self.load_maybe() + if AutomaticFit.fitting_mode and not self._fitted: + if AutomaticFit.activeVar is None: + AutomaticFit.activeVar = self + AutomaticFit.queue = [] + else: + self._add2queue() + + @classmethod + def reset(self): + AutomaticFit.activeVar = None + AutomaticFit.all_processed = False + + @classmethod + def fitting_completed(self): + return AutomaticFit.queue is None + + @classmethod + def set2fitmode(self): + AutomaticFit.reset() + AutomaticFit.fitting_mode = True + + def _add2queue(self): + logger.debug(f"Add {self._name} to queue.") + for var in AutomaticFit.queue: + if self._name == var._name: + raise ValueError( + f"Variable with the same name ({self._name}) was already added to " + "queue!" + ) + AutomaticFit.queue += [self] + + def set_next_active(self): + """ + Set the next variable in the queue that should be fitted. + """ + queue = AutomaticFit.queue + if len(queue) == 0: + logger.debug("Processed all variables.") + AutomaticFit.queue = None + AutomaticFit.activeVar = None + return + AutomaticFit.activeVar = queue.pop(0) + + def load_maybe(self): + """ + Load variable from file or set to initial value of the variable. + """ + value = read_value_json(self.scale_file, self._name) + if value is None: + logger.debug( + f"Initialize variable {self._name}' to {self.variable.numpy():.3f}" + ) + else: + self._fitted = True + logger.debug(f"Set scale factor {self._name} : {value}") + with paddle.no_grad(): + paddle.assign(paddle.to_tensor(data=value), output=self.variable) + + +class AutoScaleFit(AutomaticFit): + """ + Class to automatically fit the scaling factors depending on the observed variances. + + Parameters + ---------- + variable: paddle.Tensor + Variable to fit. + scale_file: str + Path to the json file where to store/load from the scaling factors. + """ + + def __init__(self, variable, scale_file, name): + super().__init__(variable, scale_file, name) + if not self._fitted: + self._init_stats() + + def _init_stats(self): + self.variance_in = 0 + self.variance_out = 0 + self.nSamples = 0 + + @paddle.no_grad() + def observe(self, x, y): + """ + Observe variances for input x and output y. + The scaling factor alpha is calculated s.t. Var(alpha * y) ~ Var(x) + """ + if self._fitted: + return + if AutomaticFit.activeVar == self: + nSamples = tuple(y.shape)[0] + self.variance_in += ( + paddle.mean(x=paddle.var(x=x, axis=0)).to(dtype="float32") * nSamples + ) + self.variance_out += ( + paddle.mean(x=paddle.var(x=y, axis=0)).to(dtype="float32") * nSamples + ) + self.nSamples += nSamples + + @paddle.no_grad() + def fit(self): + """ + Fit the scaling factor based on the observed variances. + """ + if AutomaticFit.activeVar == self: + if self.variance_in == 0: + raise ValueError( + f"Did not track the variable {self._name}. Add observe calls to " + "track the variance before and after." + ) + self.variance_in = self.variance_in / self.nSamples + self.variance_out = self.variance_out / self.nSamples + ratio = self.variance_out / self.variance_in + value = paddle.sqrt(x=1 / ratio) + logger.info( + f"Variable: {self._name}, Var_in: {self.variance_in.item():.3f}, " + f"Var_out: {self.variance_out.item():.3f}, Ratio: {ratio:.3f} => " + f"Scaling factor: {value:.3f}" + ) + paddle.assign(self.variable * value, output=self.variable) + update_json(self.scale_file, {self._name: float(self.variable.item())}) + self.set_next_active() + + +class ScalingFactor(paddle.nn.Layer): + """ + Scale the output y of the layer s.t. the (mean) variance wrt. to the reference + input x_ref is preserved. + + Parameters + ---------- + scale_file: str + Path to the json file where to store/load from the scaling factors. + name: str + Name of the scaling factor + """ + + def __init__(self, scale_file, name, device=None): + super().__init__() + self.scale_factor = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor(data=1.0, place=device), trainable=False + ) + self.autofit = AutoScaleFit(self.scale_factor, scale_file, name) + + def forward(self, x_ref, y): + y = y * self.scale_factor + self.autofit.observe(x_ref, y) + return y + + +class Dense(paddle.nn.Layer): + """Combines dense layer with scaling for swish activation. + + Args: + in_features (int): Input dimension for the linear layer. + out_features (int): Output dimension for the linear layer. + bias (bool, optional): Whether to add a bias term. Defaults to False. + activation (Optional[str], optional): Name of the activation function, support + 'swish', 'silu', 'siqu. If None, no activation will be applied. Defaults to + None. + """ + + def __init__( + self, + in_features: int, + out_features: int, + bias: bool = False, + activation: Optional[str] = None, + ): + super().__init__() + self.linear = paddle.nn.Linear( + in_features=in_features, out_features=out_features, bias_attr=bias + ) + self.reset_parameters() + if isinstance(activation, str): + activation = activation.lower() + if activation in ["swish", "silu"]: + self._activation = ScaledSiLU() + elif activation == "siqu": + self._activation = SiQU() + elif activation is None: + self._activation = paddle.nn.Identity() + else: + raise NotImplementedError( + "Activation function not implemented for GemNet (yet)." + ) + + def reset_parameters(self, initializer: Callable = he_orthogonal_init): + initializer(self.linear.weight) + if self.linear.bias is not None: + self.linear.bias.data.fill_(value=0) + + def forward(self, x: paddle.Tensor): + x = self.linear(x) + x = self._activation(x) + return x + + +class EdgeEmbedding(paddle.nn.Layer): + """Edge embedding based on the concatenation of atom embeddings and subsequent dense + layer. + + Args: + atom_features (int): Atom embedding size. + edge_features (int): Edge embedding size. + out_features (int): Output embedding size. + activation (str, optional): Name of the activation function. Defaults to None. + """ + + def __init__( + self, + atom_features: int, + edge_features: int, + out_features: int, + activation: Optional[str] = None, + ): + super().__init__() + in_features = 2 * atom_features + edge_features + self.dense = Dense(in_features, out_features, activation=activation, bias=False) + + def forward(self, h, m_rbf, idx_s, idx_t): + h_s = h[idx_s] + h_t = h[idx_t] + m_st = paddle.concat(x=[h_s, h_t, m_rbf], axis=-1) + m_st = self.dense(m_st) + return m_st + + +class EfficientInteractionDownProjection(paddle.nn.Layer): + """Down projection in the efficient reformulation.""" + + def __init__(self, num_spherical: int, num_radial: int, emb_size_interm: int): + super().__init__() + self.num_spherical = num_spherical + self.num_radial = num_radial + self.emb_size_interm = emb_size_interm + self.reset_parameters() + + def reset_parameters(self): + self.weight = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.empty( + shape=(self.num_spherical, self.num_radial, self.emb_size_interm) + ), + trainable=True, + ) + he_orthogonal_init(self.weight) + + def forward(self, rbf, sph, id_ca, id_ragged_idx): + num_edges = tuple(rbf.shape)[1] + rbf_W1 = paddle.matmul(x=rbf, y=self.weight) + rbf_W1 = rbf_W1.transpose(perm=[1, 2, 0]) + if tuple(sph.shape)[0] == 0: + Kmax = 0 + else: + Kmax = max( + paddle.max(x=id_ragged_idx + 1), + paddle.to_tensor(data=0).to(id_ragged_idx.place), + ) + sph2 = paddle.zeros( + shape=[num_edges, Kmax, self.num_spherical], dtype=sph.dtype + ) + sph2[id_ca, id_ragged_idx] = sph + sph2 = paddle.transpose(x=sph2, perm=dim2perm(sph2.ndim, 1, 2)) + return rbf_W1, sph2 + + +class InteractionBlockTripletsOnly(paddle.nn.Layer): + """Interaction block for GemNet-T/dT.""" + + def __init__( + self, + emb_size_atom, + emb_size_edge, + emb_size_trip, + emb_size_rbf, + emb_size_cbf, + emb_size_bil_trip, + num_before_skip, + num_after_skip, + num_concat, + num_atom, + activation=None, + scale_file=None, + name="Interaction", + ): + super().__init__() + self.name = name + self.skip_connection_factor = 2.0**-0.5 + block_nr = name.split("_")[-1] + self.dense_ca = Dense( + emb_size_edge, emb_size_edge, activation=activation, bias=False + ) + self.trip_interaction = TripletInteraction( + emb_size_edge=emb_size_edge, + emb_size_trip=emb_size_trip, + emb_size_bilinear=emb_size_bil_trip, + emb_size_rbf=emb_size_rbf, + emb_size_cbf=emb_size_cbf, + activation=activation, + scale_file=scale_file, + name=f"TripInteraction_{block_nr}", + ) + self.layers_before_skip = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(emb_size_edge, activation=activation) + for i in range(num_before_skip) + ] + ) + self.layers_after_skip = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(emb_size_edge, activation=activation) + for i in range(num_after_skip) + ] + ) + self.atom_update = AtomUpdateBlock( + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_rbf=emb_size_rbf, + nHidden=num_atom, + activation=activation, + scale_file=scale_file, + name=f"AtomUpdate_{block_nr}", + ) + self.concat_layer = EdgeEmbedding( + emb_size_atom, emb_size_edge, emb_size_edge, activation=activation + ) + self.residual_m = paddle.nn.LayerList( + sublayers=[ + ResidualLayer(emb_size_edge, activation=activation) + for _ in range(num_concat) + ] + ) + self.inv_sqrt_2 = 1 / math.sqrt(2.0) + + def forward( + self, + h, + m, + rbf3, + cbf3, + id3_ragged_idx, + id_swap, + id3_ba, + id3_ca, + rbf_h, + idx_s, + idx_t, + ): + x_ca_skip = self.dense_ca(m) + x3 = self.trip_interaction( + m, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca + ) + x = x_ca_skip + x3 + x = x * self.inv_sqrt_2 + for i, layer in enumerate(self.layers_before_skip): + x = layer(x) + m = m + x + m = m * self.inv_sqrt_2 + for i, layer in enumerate(self.layers_after_skip): + m = layer(m) + h2 = self.atom_update(h, m, rbf_h, idx_t) + h = h + h2 + h = h * self.skip_connection_factor + m2 = self.concat_layer(h, m, idx_s, idx_t) + for i, layer in enumerate(self.residual_m): + m2 = layer(m2) + m = m + m2 + m = m * self.inv_sqrt_2 + return h, m + + +class EfficientInteractionBilinear(paddle.nn.Layer): + """ + Efficient reformulation of the bilinear layer and subsequent summation. + """ + + def __init__(self, emb_size: int, emb_size_interm: int, units_out: int): + super().__init__() + self.emb_size = emb_size + self.emb_size_interm = emb_size_interm + self.units_out = units_out + self.reset_parameters() + + def reset_parameters(self): + out_0 = paddle.empty( + shape=(self.emb_size, self.emb_size_interm, self.units_out) + ) + out_0.stop_gradient = not True + self.weight = paddle.base.framework.EagerParamBase.from_tensor(tensor=out_0) + he_orthogonal_init(self.weight) + + def forward(self, basis, m, id_reduce, id_ragged_idx): + rbf_W1, sph = basis + nEdges = tuple(rbf_W1.shape)[0] + if nEdges == 0: + logger.warning(f"Zero graph edges found in {self.__class__}") + return paddle.zeros(shape=(0, 0)) + Kmax = max( + paddle.max(x=id_ragged_idx) + 1, + paddle.to_tensor(data=0).to(id_ragged_idx.place), + ) + m2 = paddle.zeros(shape=[nEdges, Kmax, self.emb_size], dtype=m.dtype) + m2[id_reduce, id_ragged_idx] = m + sum_k = paddle.matmul(x=sph, y=m2) + rbf_W1_sum_k = paddle.matmul(x=rbf_W1, y=sum_k) + m_ca = paddle.matmul(x=rbf_W1_sum_k.transpose(perm=[2, 0, 1]), y=self.weight) + m_ca = paddle.sum(x=m_ca, axis=0) + return m_ca + + +class TripletInteraction(paddle.nn.Layer): + """ + Triplet-based message passing block. + """ + + def __init__( + self, + emb_size_edge, + emb_size_trip, + emb_size_bilinear, + emb_size_rbf, + emb_size_cbf, + activation=None, + scale_file=None, + name="TripletInteraction", + **kwargs, + ): + super().__init__() + self.name = name + self.dense_ba = Dense( + emb_size_edge, emb_size_edge, activation=activation, bias=False + ) + self.mlp_rbf = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) + self.scale_rbf = ScalingFactor(scale_file=scale_file, name=name + "_had_rbf") + self.mlp_cbf = EfficientInteractionBilinear( + emb_size_trip, emb_size_cbf, emb_size_bilinear + ) + self.scale_cbf_sum = ScalingFactor( + scale_file=scale_file, name=name + "_sum_cbf" + ) + self.down_projection = Dense( + emb_size_edge, emb_size_trip, activation=activation, bias=False + ) + self.up_projection_ca = Dense( + emb_size_bilinear, emb_size_edge, activation=activation, bias=False + ) + self.up_projection_ac = Dense( + emb_size_bilinear, emb_size_edge, activation=activation, bias=False + ) + self.inv_sqrt_2 = 1 / math.sqrt(2.0) + + def forward(self, m, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca): + """ + Returns + ------- + m: paddle.Tensor, shape=(nEdges, emb_size_edge) + Edge embeddings (c->a). + """ + x_ba = self.dense_ba(m) + rbf_emb = self.mlp_rbf(rbf3) + x_ba2 = x_ba * rbf_emb + x_ba = self.scale_rbf(x_ba, x_ba2) + x_ba = self.down_projection(x_ba) + x_ba = x_ba[id3_ba] + x = self.mlp_cbf(cbf3, x_ba, id3_ca, id3_ragged_idx) + x = self.scale_cbf_sum(x_ba, x) + x_ca = self.up_projection_ca(x) + x_ac = self.up_projection_ac(x) + x_ac = x_ac[id_swap] + x3 = x_ca + x_ac + x3 = x3 * self.inv_sqrt_2 + return x3 + + +class ResidualLayer(paddle.nn.Layer): + """ + Residual block with output scaled by 1/sqrt(2). + """ + + def __init__( + self, units: int, nLayers: int = 2, layer: Callable = Dense, **layer_kwargs + ): + super().__init__() + self.dense_mlp = paddle.nn.Sequential( + *[ + layer(in_features=units, out_features=units, bias=False, **layer_kwargs) + for _ in range(nLayers) + ] + ) + self.inv_sqrt_2 = 1 / math.sqrt(2) + + def forward(self, input: paddle.Tensor): + x = self.dense_mlp(input) + x = input + x + x = x * self.inv_sqrt_2 + return x + + +class AtomUpdateBlock(paddle.nn.Layer): + """ + Aggregate the message embeddings of the atoms + """ + + def __init__( + self, + emb_size_atom: int, + emb_size_edge: int, + emb_size_rbf: int, + nHidden: int, + activation=None, + scale_file=None, + name: str = "atom_update", + ): + super().__init__() + self.name = name + self.dense_rbf = Dense(emb_size_rbf, emb_size_edge, activation=None, bias=False) + self.scale_sum = ScalingFactor(scale_file=scale_file, name=name + "_sum") + self.layers = self.get_mlp(emb_size_edge, emb_size_atom, nHidden, activation) + + def get_mlp( + self, units_in: int, units: int, nHidden: int, activation: str + ) -> paddle.nn.LayerList: + dense1 = Dense(units_in, units, activation=activation, bias=False) + mlp = [dense1] + res = [ + ResidualLayer(units, nLayers=2, activation=activation) + for i in range(nHidden) + ] + mlp += res + return paddle.nn.LayerList(sublayers=mlp) + + def forward( + self, + h: paddle.Tensor, + m: paddle.Tensor, + rbf: paddle.Tensor, + id_j: paddle.Tensor, + ) -> paddle.Tensor: + nAtoms = tuple(h.shape)[0] + mlp_rbf = self.dense_rbf(rbf) + x = m * mlp_rbf + x2 = scatter(x, id_j, dim=0, dim_size=nAtoms, reduce="sum") + x = self.scale_sum(m, x2) + for layer in self.layers: + x = layer(x) + return x + + +class OutputBlock(AtomUpdateBlock): + """ + Combines the atom update block and subsequent final dense layer. + """ + + def __init__( + self, + emb_size_atom: int, + emb_size_edge: int, + emb_size_rbf: int, + nHidden: int, + num_targets: int, + activation=None, + direct_forces=True, + output_init="HeOrthogonal", + scale_file=None, + name: str = "output", + **kwargs, + ): + super().__init__( + name=name, + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_rbf=emb_size_rbf, + nHidden=nHidden, + activation=activation, + scale_file=scale_file, + ) + assert isinstance(output_init, str) + self.output_init = output_init.lower() + self.direct_forces = direct_forces + self.seq_energy = self.layers + self.out_energy = Dense(emb_size_atom, num_targets, bias=False, activation=None) + if self.direct_forces: + self.scale_rbf_F = ScalingFactor(scale_file=scale_file, name=name + "_had") + self.seq_forces = self.get_mlp( + emb_size_edge, emb_size_edge, nHidden, activation + ) + self.out_forces = Dense( + emb_size_edge, num_targets, bias=False, activation=None + ) + self.dense_rbf_F = Dense( + emb_size_rbf, emb_size_edge, activation=None, bias=False + ) + self.reset_parameters() + + def reset_parameters(self): + if self.output_init == "heorthogonal": + self.out_energy.reset_parameters(he_orthogonal_init) + if self.direct_forces: + self.out_forces.reset_parameters(he_orthogonal_init) + elif self.output_init == "zeros": + self.out_energy.reset_parameters(paddle.nn.initializer.Constant) + if self.direct_forces: + self.out_forces.reset_parameters(paddle.nn.initializer.Constant) + else: + raise UserWarning(f"Unknown output_init: {self.output_init}") + + # def forward( + # self, + # h: paddle.Tensor, + # m: paddle.Tensor, + # rbf: paddle.Tensor, + # id_j: paddle.Tensor, + # ) -> Tuple[paddle.Tensor, paddle.Tensor]: + # nAtoms = tuple(h.shape)[0] + # rbf_emb_E = self.dense_rbf(rbf) + # x = m * rbf_emb_E + # x_E = scatter(x, id_j, dim=0, dim_size=nAtoms, reduce="sum") + # x_E = self.scale_sum(m, x_E) + # for layer in self.seq_energy: + # x_E = layer(x_E) + # x_E = self.out_energy(x_E) + # if self.direct_forces: + # x_F = m + # for i, layer in enumerate(self.seq_forces): + # x_F = layer(x_F) + # rbf_emb_F = self.dense_rbf_F(rbf) + # x_F_rbf = x_F * rbf_emb_F + # x_F = self.scale_rbf_F(x_F, x_F_rbf) + # x_F = self.out_forces(x_F) + # else: + # x_F = 0 + # return 0, x_F + + def forward( + self, + h: paddle.Tensor, + m: paddle.Tensor, + rbf: paddle.Tensor, + id_j: paddle.Tensor, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + if self.direct_forces: + x_F = m + for i, layer in enumerate(self.seq_forces): + x_F = layer(x_F) + rbf_emb_F = self.dense_rbf_F(rbf) + x_F_rbf = x_F * rbf_emb_F + x_F = self.scale_rbf_F(x_F, x_F_rbf) + x_F = self.out_forces(x_F) + else: + x_F = 0 + return 0, x_F + + +class RBFBasedLatticeUpdateBlock(paddle.nn.Layer): + def __init__( + self, + emb_size: int, + activation: str, + emb_size_rbf: int, + emb_size_edge: int, + num_heads: int = 1, + ): + super().__init__() + self.num_out = num_heads + self.mlp = paddle.nn.Sequential( + Dense(emb_size, emb_size, activation=activation), Dense(emb_size, emb_size) + ) + self.dense_rbf_F = Dense( + emb_size_rbf, emb_size_edge, activation=None, bias=False + ) + self.out_forces = Dense(emb_size_edge, num_heads, bias=False, activation=None) + + def compute_score_per_edge( + self, edge_emb: paddle.Tensor, rbf: paddle.Tensor + ) -> paddle.Tensor: + x_F = self.mlp(edge_emb) + rbf_emb_F = self.dense_rbf_F(rbf) + x_F_rbf = x_F * rbf_emb_F + x_F = self.out_forces(x_F_rbf) + return x_F + + +class RBFBasedLatticeUpdateBlockFrac(RBFBasedLatticeUpdateBlock): + def __init__( + self, + emb_size: int, + activation: str, + emb_size_rbf: int, + emb_size_edge: int, + num_heads: int = 1, + ): + super().__init__( + emb_size=emb_size, + activation=activation, + emb_size_rbf=emb_size_rbf, + emb_size_edge=emb_size_edge, + num_heads=num_heads, + ) + + def forward( + self, + edge_emb: paddle.Tensor, + edge_index: paddle.Tensor, + distance_vec: paddle.Tensor, + lattice: paddle.Tensor, + batch: paddle.Tensor, + rbf: paddle.Tensor, + normalize_score: bool = True, + ) -> paddle.Tensor: + edge_scores = self.compute_score_per_edge(edge_emb=edge_emb, rbf=rbf) + if normalize_score: + num_edges = scatter( + paddle.ones_like(x=distance_vec[:, 0]), batch[edge_index[0]] + ) + edge_scores /= num_edges[batch[edge_index[0]], None] + outs = [] + for i in range(self.num_out): + lattice_update = edge_score_to_lattice_score_frac_symmetric( + score_d=edge_scores[:, i], + edge_index=edge_index, + edge_vectors=distance_vec, + batch=batch, + ) + outs.append(lattice_update) + outs = paddle.stack(x=outs, axis=-1).sum(axis=-1) + return outs + + +class GemNetT(paddle.nn.Layer): + """GemNet-T, triplets-only variant of GemNet. This is a decoder model of MatterGen. + + Args: + num_targets (int): Number of targets for output. In Gemnet, it means the number + of the energy and force. Defaults to 1. + latent_dim (int): The dimension of the latent space. + atom_embedding_cfg (dict): The configuration of the atom embedding. + num_spherical (int, optional): Controls maximum frequency of CircularBasisLayer. + Defaults to 7. + num_radial (int, optional): Controls maximum frequency of RadialBasis. Defaults + to 128. + num_blocks (int, optional): Number of interaction blocks. Defaults to 3. + emb_size_atom (int, optional): Embedding size of the atoms. Defaults to 512. + emb_size_edge (int, optional): Embedding size of the edges. Defaults to 512. + emb_size_trip (int, optional): Embedding size in the triplet message passing + block. Defaults to 64. + emb_size_rbf (int, optional): Embedding size of the radial basis transformation. + Defaults to 16. + emb_size_cbf (int, optional): Embedding size of the circular basis + transformation. Defaults to 16. + emb_size_bil_trip (int, optional): Embedding size of the edge embeddings in the + triplet-based message passing block after the bilinear layer. Defaults to + 64. + num_before_skip (int, optional): Number of residual blocks before the first + skip connection. Defaults to 1. + num_after_skip (int, optional): Number of residual blocks after the first skip + connection. Defaults to 2. + num_concat (int, optional): Number of residual blocks after the concatenation. + Defaults to 1. + num_atom (int, optional): Number of residual blocks in the atom embedding + blocks. Defaults to 3. + cutoff (float, optional): Embedding cutoff for interactomic directions in + Angstrom. Defaults to 6.0. + max_neighbors (int, optional): Maximum neighbors per atom. Defaults to 50. + rbf (dict, optional): Name and hyperparameters of the radial basis function. + Defaults to {"name": "gaussian"}. + envelope (dict, optional): Name and hyperparameters of the envelope function. + Defaults to {"name": "polynomial", "exponent": 5}. + cbf (dict, optional): Name and hyperparameters of the cosine basis function. + Defaults to {"name": "spherical_harmonics"}. + otf_graph (bool, optional): Whether to use On-The-Fly graph. Defaults to False. + output_init (str, optional): Initialization method for the final dense layer. + Defaults to "HeOrthogonal". + activation (str, optional): Name of the activation function. Defaults to + "swish". + max_cell_images_per_dim (int, optional): Maximum cell images per dimension. + Defaults to 5. + """ + + def __init__( + self, + num_targets: int, # 1 + latent_dim: int, # 512 + atom_embedding_cfg: dict, # emb_size=512, with_mask_type=True + num_spherical: int = 7, + num_radial: int = 128, + num_blocks: int = 3, + emb_size_atom: int = 512, + emb_size_edge: int = 512, + emb_size_trip: int = 64, + emb_size_rbf: int = 16, + emb_size_cbf: int = 16, + emb_size_bil_trip: int = 64, + num_before_skip: int = 1, + num_after_skip: int = 2, + num_concat: int = 1, + num_atom: int = 3, + cutoff: float = 6.0, + max_neighbors: int = 50, + rbf: dict = {"name": "gaussian"}, + envelope: dict = {"name": "polynomial", "exponent": 5}, + cbf: dict = {"name": "spherical_harmonics"}, + otf_graph: bool = False, + output_init: str = "HeOrthogonal", + activation: str = "swish", + max_cell_images_per_dim: int = 5, + **kwargs, + ): + super().__init__() + # scale_file = "ppmat/models/mattergen/gemnet-dT.json" + scale_file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "gemnet-dT.json" + ) + self.num_targets = num_targets + assert num_blocks > 0 + self.num_blocks = num_blocks + atom_embedding = AtomEmbedding(**atom_embedding_cfg) + emb_dim_atomic_number = getattr(atom_embedding, "emb_size") + self.cutoff = cutoff + self.max_neighbors = max_neighbors + self.max_cell_images_per_dim = max_cell_images_per_dim + self.otf_graph = otf_graph + self.angle_edge_emb = paddle.nn.Sequential( + paddle.nn.Linear(in_features=emb_size_edge + 3, out_features=emb_size_edge), + paddle.nn.ReLU(), + paddle.nn.Linear(in_features=emb_size_edge, out_features=emb_size_edge), + ) + AutomaticFit.reset() + self.radial_basis = RadialBasis( + num_radial=num_radial, cutoff=cutoff, rbf=rbf, envelope=envelope + ) + radial_basis_cbf3 = RadialBasis( + num_radial=num_radial, cutoff=cutoff, rbf=rbf, envelope=envelope + ) + self.cbf_basis3 = CircularBasisLayer( + num_spherical, radial_basis=radial_basis_cbf3, cbf=cbf, efficient=True + ) + self.lattice_out_blocks = paddle.nn.LayerList( + sublayers=[ + RBFBasedLatticeUpdateBlockFrac( + emb_size_edge, activation, emb_size_rbf, emb_size_edge + ) + for _ in range(num_blocks + 1) + ] + ) + self.mlp_rbf_lattice = Dense( + num_radial, emb_size_rbf, activation=None, bias=False + ) + self.mlp_rbf3 = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.mlp_cbf3 = EfficientInteractionDownProjection( + num_spherical, num_radial, emb_size_cbf + ) + self.mlp_rbf_h = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.mlp_rbf_out = Dense(num_radial, emb_size_rbf, activation=None, bias=False) + self.atom_emb = atom_embedding + self.atom_latent_emb = paddle.nn.Linear( + in_features=emb_dim_atomic_number + latent_dim, out_features=emb_size_atom + ) + self.edge_emb = EdgeEmbedding( + emb_size_atom, num_radial, emb_size_edge, activation=activation + ) + out_blocks = [] + int_blocks = [] + interaction_block = InteractionBlockTripletsOnly + for i in range(num_blocks): + int_blocks.append( + interaction_block( + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_trip=emb_size_trip, + emb_size_rbf=emb_size_rbf, + emb_size_cbf=emb_size_cbf, + emb_size_bil_trip=emb_size_bil_trip, + num_before_skip=num_before_skip, + num_after_skip=num_after_skip, + num_concat=num_concat, + num_atom=num_atom, + activation=activation, + scale_file=scale_file, + name=f"IntBlock_{i + 1}", + ) + ) + for i in range(num_blocks + 1): + out_blocks.append( + OutputBlock( + emb_size_atom=emb_size_atom, + emb_size_edge=emb_size_edge, + emb_size_rbf=emb_size_rbf, + nHidden=num_atom, + num_targets=num_targets, + activation=activation, + output_init=output_init, + direct_forces=True, + scale_file=scale_file, + name=f"OutBlock_{i}", + ) + ) + self.out_blocks = paddle.nn.LayerList(sublayers=out_blocks) + self.int_blocks = paddle.nn.LayerList(sublayers=int_blocks) + self.shared_parameters = [ + (self.mlp_rbf3, self.num_blocks), + (self.mlp_cbf3, self.num_blocks), + (self.mlp_rbf_h, self.num_blocks), + (self.mlp_rbf_out, self.num_blocks + 1), + ] + + def get_triplets( + self, edge_index: paddle.Tensor, num_atoms: int + ) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Get all b->a for each edge c->a. + It is possible that b=c, as long as the edges are distinct. + + Returns + ------- + id3_ba: paddle.Tensor, shape (num_triplets,) + Indices of input edge b->a of each triplet b->a<-c + id3_ca: paddle.Tensor, shape (num_triplets,) + Indices of output edge c->a of each triplet b->a<-c + id3_ragged_idx: paddle.Tensor, shape (num_triplets,) + Indices enumerating the copies of id3_ca for creating a padded matrix + """ + idx_s, idx_t = edge_index + value = paddle.arange(start=1, end=idx_s.shape[0] + 1, dtype=idx_s.dtype) + + def custom_bincount(x, minlength=0): + unique, counts = paddle.unique(x, return_counts=True) + max_val = paddle.max(unique).numpy().item() if len(unique) > 0 else -1 + length = (max_val + 1) if (max_val + 1) > minlength else minlength + result = paddle.zeros([length], dtype="int64") + if len(unique) > 0: + result = paddle.scatter_nd(unique.unsqueeze(1), counts, result.shape) + return result + + n = idx_t.shape[0] + rows = paddle.arange(n).unsqueeze(1) # [0,1,2,...,n-1]^T + cols = paddle.arange(n).unsqueeze(0) # [0,1,2,...,n-1] + mask = (idx_t.unsqueeze(1) == idx_t.unsqueeze(0)) & (cols <= rows) + col = mask.sum(axis=1).astype("int64") - 1 + rows = idx_t + indices = paddle.stack([rows, col], axis=1) + + shape = [num_atoms.item(), col.max().item() + 1] + result = paddle.scatter_nd(indices, value, shape) + mat = result + + id3_ba = mat[idx_t][mat[idx_t] > 0] - 1 + tmp_r = paddle.nonzero(mat[idx_t], as_tuple=False) + id3_ca = tmp_r[:, 0] + + mask = id3_ba != id3_ca + id3_ba = id3_ba[mask] + id3_ca = id3_ca[mask] + + num_triplets = custom_bincount(id3_ca, minlength=idx_s.shape[0]) + + id3_ragged_idx = ragged_range(num_triplets) + return id3_ba, id3_ca, id3_ragged_idx + + def select_symmetric_edges(self, tensor, mask, reorder_idx, inverse_neg): + tensor_directed = tensor[mask] + sign = 1 - 2 * inverse_neg + tensor_cat = paddle.concat(x=[tensor_directed, sign * tensor_directed]) + tensor_ordered = tensor_cat[reorder_idx] + return tensor_ordered + + def reorder_symmetric_edges( + self, + edge_index: paddle.Tensor, + cell_offsets: paddle.Tensor, + neighbors: paddle.Tensor, + edge_dist: paddle.Tensor, + edge_vector: paddle.Tensor, + ) -> Tuple[ + paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor + ]: + """ + Reorder edges to make finding counter-directional edges easier. + + Some edges are only present in one direction in the data, + since every atom has a maximum number of neighbors. Since we only use i->j + edges here, we lose some j->i edges and add others by + making it symmetric. + We could fix this by merging edge_index with its counter-edges, + including the cell_offsets, and then running paddle.unique. + But this does not seem worth it. + """ + mask_sep_atoms = edge_index[0] < edge_index[1] + cell_earlier = ( + (cell_offsets[:, 0] < 0) + | (cell_offsets[:, 0] == 0) & (cell_offsets[:, 1] < 0) + | (cell_offsets[:, 0] == 0) + & (cell_offsets[:, 1] == 0) + & (cell_offsets[:, 2] < 0) + ) + mask_same_atoms = edge_index[0] == edge_index[1] + mask_same_atoms &= cell_earlier + mask = mask_sep_atoms | mask_same_atoms + edge_index_new = edge_index[mask[None, :].expand(shape=[2, -1])].view(2, -1) + edge_index_cat = paddle.concat( + x=[ + edge_index_new, + paddle.stack(x=[edge_index_new[1], edge_index_new[0]], axis=0), + ], + axis=1, + ) + batch_edge = paddle.repeat_interleave( + x=paddle.arange(end=neighbors.shape[0]), repeats=neighbors + ) + batch_edge = batch_edge[mask] + neighbors_new = 2 * paddle.bincount(x=batch_edge, minlength=neighbors.shape[0]) + edge_reorder_idx = repeat_blocks( + neighbors_new // 2, + repeats=2, + continuous_indexing=True, + repeat_inc=edge_index_new.shape[1], + ) + edge_index_new = edge_index_cat[:, edge_reorder_idx] + cell_offsets_new = self.select_symmetric_edges( + cell_offsets, mask, edge_reorder_idx, True + ) + edge_dist_new = self.select_symmetric_edges( + edge_dist, mask, edge_reorder_idx, False + ) + edge_vector_new = self.select_symmetric_edges( + edge_vector, mask, edge_reorder_idx, True + ) + return ( + edge_index_new, + cell_offsets_new, + neighbors_new, + edge_dist_new, + edge_vector_new, + ) + + def generate_interaction_graph( + self, + cart_coords: paddle.Tensor, + lattice: paddle.Tensor, + num_atoms: paddle.Tensor, + edge_index: paddle.Tensor = None, + to_jimages: paddle.Tensor = None, + num_bonds: paddle.Tensor = None, + ): + if self.otf_graph: + edge_index, to_jimages, num_bonds = radius_graph_pbc( + cart_coords=cart_coords, + lattice=lattice, + num_atoms=num_atoms, + radius=self.cutoff, + max_num_neighbors_threshold=self.max_neighbors, + max_cell_images_per_dim=self.max_cell_images_per_dim, + ) + + out = get_pbc_distances( + cart_coords, + edge_index, + lattice, + to_jimages, + num_atoms, + num_bonds, + coord_is_cart=True, + return_offsets=True, + return_distance_vec=True, + ) + edge_index = out["edge_index"] + D_st = out["distances"] + V_st = -out["distance_vec"] / D_st[:, None] + edge_index, cell_offsets, neighbors, D_st, V_st = self.reorder_symmetric_edges( + edge_index, to_jimages, num_bonds, D_st, V_st + ) + block_sizes = neighbors // 2 + block_sizes = paddle.masked_select(x=block_sizes, mask=block_sizes > 0) + + id_swap = repeat_blocks( + block_sizes, + repeats=2, + continuous_indexing=False, + start_idx=block_sizes[0], + block_inc=block_sizes[:-1] + block_sizes[1:], + repeat_inc=-block_sizes, + ) + + id3_ba, id3_ca, id3_ragged_idx = self.get_triplets( + edge_index, num_atoms=num_atoms.sum() + ) + return ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + cell_offsets, + ) + + def forward( + self, + z: paddle.Tensor, + frac_coords: paddle.Tensor, + atom_types: paddle.Tensor, + num_atoms: paddle.Tensor, + batch: paddle.Tensor, + lattice: Optional[paddle.Tensor] = None, + ): + """ + args: + z: (N_cryst, num_latent) + frac_coords: (N_atoms, 3) + atom_types: (N_atoms, ) with D3PM need to use atomic number + num_atoms: (N_cryst,) + batch: (N_atoms, ) + lattice: (N_cryst, 3, 3) (optional, either lengths and angles or lattice + must be passed) + """ + assert lattice is not None + distorted_lattice = lattice + pos = frac_to_cart_coords_with_lattice( + frac_coords, num_atoms, lattice=distorted_lattice + ) + atomic_numbers = atom_types.cast(dtype="int64") + ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + to_jimages, + ) = self.generate_interaction_graph( + pos, + distorted_lattice, + num_atoms, + ) + + idx_s, idx_t = edge_index + cosφ_cab = inner_product_normalized(V_st[id3_ca], V_st[id3_ba]) + rad_cbf3, cbf3 = self.cbf_basis3(D_st, cosφ_cab, id3_ca) + rbf = self.radial_basis(D_st) + h = self.atom_emb(atomic_numbers) + if z is not None: + z_per_atom = z[batch] + h = paddle.concat(x=[h, z_per_atom], axis=1) + h = self.atom_latent_emb(h) + m = self.edge_emb(h, rbf, idx_s, idx_t) + batch_edge = batch[edge_index[0]] + cosines = paddle.nn.functional.cosine_similarity( + x1=V_st[:, None], x2=distorted_lattice[batch_edge], axis=-1 + ) + m = paddle.concat(x=[m, cosines], axis=-1) + m = self.angle_edge_emb(m) + rbf3 = self.mlp_rbf3(rbf) + cbf3 = self.mlp_cbf3(rad_cbf3, cbf3, id3_ca, id3_ragged_idx) + rbf_h = self.mlp_rbf_h(rbf) + rbf_out = self.mlp_rbf_out(rbf) + E_t, F_st = self.out_blocks[0](h, m, rbf_out, idx_t) + distance_vec = V_st * D_st[:, None] + + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update = self.lattice_out_blocks[0]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + + for i in range(self.num_blocks): + h, m = self.int_blocks[i]( + h=h, + m=m, + rbf3=rbf3, + cbf3=cbf3, + id3_ragged_idx=id3_ragged_idx, + id_swap=id_swap, + id3_ba=id3_ba, + id3_ca=id3_ca, + rbf_h=rbf_h, + idx_s=idx_s, + idx_t=idx_t, + ) + E, F = self.out_blocks[i + 1](h, m, rbf_out, idx_t) + F_st += F + E_t += E + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update += self.lattice_out_blocks[i + 1]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + # nMolecules = paddle.max(x=batch) + 1 + # E_t = scatter(E_t, batch, dim=0, dim_size=nMolecules, reduce="sum") + F_st_vec = F_st[:, :, None] * V_st[:, None, :] + F_t = scatter(F_st_vec, idx_t, dim=0, dim_size=num_atoms.sum(), reduce="add") + F_t = F_t.squeeze(axis=1) + + return h, F_t, lattice_update + + +class GemNetTCtrl(GemNetT): + def __init__(self, condition_on_adapt: List[str], *args, **kwargs): + super().__init__(*args, **kwargs) + self.condition_on_adapt = condition_on_adapt + self.cond_adapt_layers = paddle.nn.LayerDict() + self.cond_mixin_layers = paddle.nn.LayerDict() + self.emb_size_atom = ( + kwargs["emb_size_atom"] if "emb_size_atom" in kwargs else 512 + ) + for cond in condition_on_adapt: + adapt_layers = [] + mixin_layers = [] + for _ in range(self.num_blocks): + adapt_layers.append( + paddle.nn.Sequential( + paddle.nn.Linear( + in_features=self.emb_size_atom * 2, + out_features=self.emb_size_atom, + ), + paddle.nn.ReLU(), + paddle.nn.Linear( + in_features=self.emb_size_atom, + out_features=self.emb_size_atom, + ), + ) + ) + mixin_layers.append( + paddle.nn.Linear( + in_features=self.emb_size_atom, + out_features=self.emb_size_atom, + bias_attr=False, + ) + ) + init_Constant = paddle.nn.initializer.Constant(value=0.0) + init_Constant(mixin_layers[-1].weight) + self.cond_adapt_layers[cond] = paddle.nn.LayerList(sublayers=adapt_layers) + self.cond_mixin_layers[cond] = paddle.nn.LayerList(sublayers=mixin_layers) + + def forward( + self, + z: paddle.Tensor, + frac_coords: paddle.Tensor, + atom_types: paddle.Tensor, + num_atoms: paddle.Tensor, + batch: paddle.Tensor, + lattice: paddle.Tensor, + cond_adapt: Optional[Dict[str, paddle.Tensor]] = None, + cond_adapt_mask: Optional[Dict[str, paddle.Tensor]] = None, + ): + assert lattice is not None + distorted_lattice = lattice + pos = frac_to_cart_coords_with_lattice( + frac_coords, num_atoms, lattice=distorted_lattice + ) + atomic_numbers = atom_types.cast(dtype="int64") + ( + edge_index, + neighbors, + D_st, + V_st, + id_swap, + id3_ba, + id3_ca, + id3_ragged_idx, + to_jimages, + ) = self.generate_interaction_graph(pos, distorted_lattice, num_atoms) + idx_s, idx_t = edge_index + cosφ_cab = inner_product_normalized(V_st[id3_ca], V_st[id3_ba]) + rad_cbf3, cbf3 = self.cbf_basis3(D_st, cosφ_cab, id3_ca) + rbf = self.radial_basis(D_st) + h = self.atom_emb(atomic_numbers) + if z is not None: + z_per_atom = z[batch] + h = paddle.concat(x=[h, z_per_atom], axis=1) + h = self.atom_latent_emb(h) + m = self.edge_emb(h, rbf, idx_s, idx_t) + batch_edge = batch[edge_index[0]] + cosines = paddle.nn.functional.cosine_similarity( + x1=V_st[:, None], x2=distorted_lattice[batch_edge], axis=-1 + ) + m = paddle.concat(x=[m, cosines], axis=-1) + m = self.angle_edge_emb(m) + rbf3 = self.mlp_rbf3(rbf) + cbf3 = self.mlp_cbf3(rad_cbf3, cbf3, id3_ca, id3_ragged_idx) + rbf_h = self.mlp_rbf_h(rbf) + rbf_out = self.mlp_rbf_out(rbf) + E_t, F_st = self.out_blocks[0](h, m, rbf_out, idx_t) + distance_vec = V_st * D_st[:, None] + lattice_update = None + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update = self.lattice_out_blocks[0]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + if cond_adapt is not None and cond_adapt_mask is not None: + cond_adapt_per_atom = {} + cond_adapt_mask_per_atom = {} + for cond in self.condition_on_adapt: + cond_adapt_per_atom[cond] = cond_adapt[cond][batch] + cond_adapt_mask_per_atom[cond] = 1.0 - cond_adapt_mask[cond][ + batch + ].astype(dtype="float32") + for i in range(self.num_blocks): + h_adapt = paddle.zeros_like(x=h) + for cond in self.condition_on_adapt: + h_adapt_cond = self.cond_adapt_layers[cond][i]( + paddle.concat(x=[h, cond_adapt_per_atom[cond]], axis=-1) + ) + h_adapt_cond = self.cond_mixin_layers[cond][i](h_adapt_cond) + h_adapt += cond_adapt_mask_per_atom[cond] * h_adapt_cond + h = h + h_adapt + h, m = self.int_blocks[i]( + h=h, + m=m, + rbf3=rbf3, + cbf3=cbf3, + id3_ragged_idx=id3_ragged_idx, + id_swap=id_swap, + id3_ba=id3_ba, + id3_ca=id3_ca, + rbf_h=rbf_h, + idx_s=idx_s, + idx_t=idx_t, + ) + E, F = self.out_blocks[i + 1](h, m, rbf_out, idx_t) + F_st += F + E_t += E + rbf_lattice = self.mlp_rbf_lattice(rbf) + lattice_update += self.lattice_out_blocks[i + 1]( + edge_emb=m, + edge_index=edge_index, + distance_vec=distance_vec, + lattice=distorted_lattice, + batch=batch, + rbf=rbf_lattice, + normalize_score=True, + ) + F_st_vec = F_st[:, :, None] * V_st[:, None, :] + F_t = scatter(F_st_vec, idx_t, dim=0, dim_size=num_atoms.sum(), reduce="add") + F_t = F_t.squeeze(axis=1) + return h, F_t, lattice_update + + +def get_property_embeddings( + batch, property_embeddings: paddle.nn.LayerDict +) -> paddle.Tensor: + """ + Keyword arguments + ----------------- + property_embeddings: paddle.nn.ModuleDict[PropertyToConditonOn, PropertyEmbedding] + -- a dictionary of property embeddings. The keys are the names of the + conditional fields in the batch. + """ + ordered_keys = sorted(property_embeddings.keys()) + if len(ordered_keys) > 0: + return paddle.concat( + x=[property_embeddings[k].forward(batch=batch) for k in ordered_keys], + axis=-1, + ) + else: + return paddle.to_tensor(data=[], place=batch["num_atoms"].place) + + +def get_chemgraph_from_denoiser_output( + pred_atom_types: paddle.Tensor, + pred_lattice_eps: paddle.Tensor, + pred_cart_pos_eps: paddle.Tensor, + training: bool, + element_mask_func: (Callable | None), + x_input, + batch_idx, +): + """ + Convert raw denoiser output to Dict and optionally apply masking to element logits. + + Keyword arguments + ----------------- + pred_atom_atoms: predicted logits for atom types + pred_lattice_eps: predicted lattice noise + pred_cart_pos_eps: predicted cartesian position noise + training: whether or not the model is in training mode - logit masking is only + applied when sampling + element_mask_func: when not training, a function can be applied to mask logits for + certain atom types + x_input: the nosiy state input to the score model, contains the lattice to convert + cartesisan to fractional noise. + batch_idx: the index of the batch. + """ + if not training and element_mask_func: + pred_atom_types = element_mask_func( + logits=pred_atom_types, x=x_input, batch_idx=x_input.get_batch_idx("pos") + ) + replace_dict = dict( + frac_coords=( + x_input["lattice"] + .inverse() + .transpose(perm=dim2perm(x_input["lattice"].inverse().ndim, 1, 2))[ + batch_idx + ] + @ pred_cart_pos_eps.unsqueeze(axis=-1) + ).squeeze(axis=-1), + lattice=pred_lattice_eps, + atom_types=pred_atom_types, + ) + return replace_dict + + +class GemNetTDenoiser(paddle.nn.Layer): + """A dinoiser that uses a GemNet to denoise the input. + + Args: + gemnet_cfg (dict): configuration for the GemNet + gemnet_type (str, optional): Type of GemNet to use, either 'GemNetT' or + 'GemNetTCtrl'. Defaults to 'GemNetT'. + hidden_dim (int, optional): Number of hidden dimensions in the GemNet. + Defaults to 512. + denoise_atom_types (bool, optional): Whether to denoise the atom types. + Defaults to True. + atom_type_diffusion (str, optional): Which type of atom type diffusion to use. + Defaults to "mask". + property_embeddings (paddle.nn.LayerDict | None, optional): A dictionary of + property embeddings. Defaults to None. + """ + + def __init__( + self, + gemnet_cfg: dict, + gemnet_type: str = "GemNetT", + hidden_dim: int = 512, + denoise_atom_types: bool = True, + atom_type_diffusion: str = ["mask", "uniform"][0], + property_embeddings: (paddle.nn.LayerDict | None) = None, + property_embeddings_adapt_cfg: (Dict | None) = None, # todo + # element_mask_func: (Callable | None) = None, # todo + ): + + super(GemNetTDenoiser, self).__init__() + if gemnet_type == "GemNetT": + self.gemnet = GemNetT(**gemnet_cfg) + elif gemnet_type == "GemNetTCtrl": + self.gemnet = GemNetTCtrl(**gemnet_cfg) + else: + raise NotImplementedError(f"{gemnet_type} not implemented.") + self.gemnet_cfg = gemnet_cfg + self.gemnet_type = gemnet_type + + self.noise_level_encoding = NoiseLevelEncoding(hidden_dim) + self.hidden_dim = hidden_dim + self.denoise_atom_types = denoise_atom_types + self.atom_type_diffusion = atom_type_diffusion + self.property_embeddings = paddle.nn.LayerDict( + sublayers=property_embeddings or {} + ) + with_mask_type = self.denoise_atom_types and "mask" in self.atom_type_diffusion + self.fc_atom = paddle.nn.Linear( + in_features=hidden_dim, out_features=MAX_ATOMIC_NUM + int(with_mask_type) + ) + self.property_embeddings_adapt_cfg = property_embeddings_adapt_cfg + if property_embeddings_adapt_cfg is not None: + self.property_embeddings_adapt = paddle.nn.LayerDict() + for key, config in property_embeddings_adapt_cfg.items(): + property_embedding_layer = PropertyEmbedding(**config) + self.property_embeddings_adapt[key] = property_embedding_layer + else: + self.property_embeddings_adapt = None + # self.element_mask_func = element_mask_func + + def forward(self, x, t: paddle.Tensor): + """ + args: + x: tuple containing: + frac_coords: (N_atoms, 3) + lattice: (N_cryst, 3, 3) + atom_types: (N_atoms, ), need to use atomic number e.g. H = 1 or ion + state + num_atoms: (N_cryst,) + batch: (N_atoms,) + t: (N_cryst,): timestep per crystal + returns: + tuple of: + predicted epsilon: (N_atoms, 3) + lattice update: (N_crystals, 3, 3) + predicted atom types: (N_atoms, MAX_ATOMIC_NUM) + """ + frac_coords, lattice, atom_types, num_atoms, batch = ( + x["frac_coords"], + x["lattice"], + x["atom_types"], + x["num_atoms"], + x["batch"], + ) + t_enc = self.noise_level_encoding(t) + z_per_crystal = t_enc + property_embedding_values = get_property_embeddings( + batch=x, property_embeddings=self.property_embeddings + ) + if len(property_embedding_values) > 0: + z_per_crystal = paddle.concat( + x=[z_per_crystal, property_embedding_values], axis=-1 + ) + if self.property_embeddings_adapt is not None: + conditions_adapt_dict = {} + conditions_adapt_mask_dict = {} + for ( + cond_field, + property_embedding, + ) in self.property_embeddings_adapt.items(): + conditions_adapt_mask_dict[ + cond_field + ] = get_use_unconditional_embedding(batch=x, cond_field=cond_field) + + conditions_adapt_dict[cond_field] = property_embedding.forward( + data=x[cond_field], + use_unconditional_embedding=conditions_adapt_mask_dict[cond_field], + ) + node_embeddings, pred_cart_pos_eps, pred_lattice_eps = self.gemnet( + z=z_per_crystal, + frac_coords=frac_coords, + atom_types=atom_types, + num_atoms=num_atoms, + batch=batch, + lattice=lattice, + cond_adapt=conditions_adapt_dict, + cond_adapt_mask=conditions_adapt_mask_dict, + ) + + else: + node_embeddings, pred_cart_pos_eps, pred_lattice_eps = self.gemnet( + z=z_per_crystal, + frac_coords=frac_coords, + atom_types=atom_types, + num_atoms=num_atoms, + batch=batch, + lattice=lattice, + ) + + pred_atom_types = self.fc_atom(node_embeddings) + + return get_chemgraph_from_denoiser_output( + pred_atom_types=pred_atom_types, + pred_lattice_eps=pred_lattice_eps, + pred_cart_pos_eps=pred_cart_pos_eps, + training=self.training, + element_mask_func=None, + x_input=x, + batch_idx=batch, + ) + + @property + def cond_fields_model_was_trained_on(self): + """ + We adopt the convention that all property embeddings are stored in + paddle.nn.LayerDicts of name property_embeddings or property_embeddings_adapt + in the case of a fine tuned model. + + This function returns the list of all field names that a given score model was + trained to condition on. + """ + return list(self.property_embeddings) + + +def get_pbc_offsets(pbc: paddle.Tensor, max_offset_integer: int = 3) -> paddle.Tensor: + """Build the Cartesian product of integer offsets of the periodic boundary. That is, + if dim=3 and max_offset_integer=1 we build the (2*1 + 1)^3 = 27 possible + combinations of the Cartesian product of (i,j,k) for i,j,k in + -max_offset_integer, ..., max_offset_integer. Then, we construct the tensor of + integer offsets of the pbc vectors, + i.e., L_{ijk} = row_stack([i * l_1, j * l_2, k * l_3]). + + Args: + pbc (paddle.Tensor, [batch_size, dim, dim]): The input pbc matrix. + max_offset_integer (int): The maximum integer offset per dimension to consider + for the Cartesian product. Defaults to 3. + + Returns: + paddle.Tensor, [batch_size, (2 * max_offset_integer + 1)^dim, dim]: The tensor + containing the integer offsets of the pbc vectors. + """ + offset_range = paddle.arange(start=-max_offset_integer, end=max_offset_integer + 1) + meshgrid = paddle.stack( + x=list( + [i.T for i in paddle.meshgrid(offset_range, offset_range, offset_range)] + ), + axis=-1, + ) + offset = ( + pbc[:, None, None, None] * meshgrid[None, :, :, :, :, None].astype("float32") + ).sum(axis=-2) + pbc_offset_per_molecule = offset.reshape([tuple(pbc.shape)[0], -1, 3]) + return pbc_offset_per_molecule + + +def wrapped_normal_score( + x: paddle.Tensor, + mean: paddle.Tensor, + wrapping_boundary: paddle.Tensor, + variance_diag: paddle.Tensor, + batch: paddle.Tensor, + max_offset_integer: int = 3, +) -> paddle.Tensor: + """Approximate the the score of a 3D wrapped normal distribution with diagonal + covariance matrix w.r.t. x via a truncated sum. + See docstring of `wrapped_normal_score` for details about the arguments + + Args: + x (paddle.Tensor, [num_atoms, dim]) + mean (paddle.Tensor, [num_atoms, dim]) + wrapping_boundary (paddle.Tensor, [num_molecules, dim, dim]) + variance_diag (paddle.Tensor, [num_atoms,]) + batch (paddle.Tensor, [num_atoms, ]) + max_offset_integer (int), Defaults to 3. + + Returns: + paddle.Tensor, [num_atoms, dim]: The approximated score of the wrapped normal + distribution. + """ + offset_add = get_pbc_offsets(wrapping_boundary, max_offset_integer) + diffs_k = (x - mean)[:, None] + offset_add[batch] + dists_sqr_k = diffs_k.pow(y=2).sum(axis=-1) + score_softmax = paddle.nn.functional.softmax( + x=-dists_sqr_k / (2 * variance_diag[:, None]), axis=-1 + ) + score = -(score_softmax[:, :, None] * diffs_k).sum(axis=-2) / variance_diag[:, None] + return score + + +def wrapped_normal_loss( + *, + corruption, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx: Optional[paddle.Tensor], + batch_size: int, + x: paddle.Tensor, + noisy_x: paddle.Tensor, + reduce: Literal["sum", "mean"], + batch, + **_, +) -> paddle.Tensor: + """Compute the loss for a wrapped normal distribution. + Compares the score of the wrapped normal distribution to the score of the score + model. + """ + assert len(t) == batch_size + _, std = corruption.marginal_prob( + x=paddle.zeros(shape=(tuple(x.shape)[0], 1)), + t=t, + batch_idx=batch_idx, + num_atoms=batch["num_atoms"], + ) + pred: paddle.Tensor = score_model_output + if pred.ndim != 2: + raise NotImplementedError + assert hasattr( + corruption, "wrapping_boundary" + ), "SDE must be a WrappedSDE, i.e., must have a wrapping boundary." + wrapping_boundary = corruption.wrapping_boundary + wrapping_boundary = wrapping_boundary * paddle.eye(num_rows=tuple(x.shape)[-1])[ + None + ].expand(shape=[batch_size, -1, -1]) + target = ( + wrapped_normal_score( + x=noisy_x, + mean=x, + wrapping_boundary=wrapping_boundary, + variance_diag=std.squeeze() ** 2, + batch=batch_idx, + ) + * std + ) + delta = target - pred + losses = delta.square() + return aggregate_per_sample(losses, batch_idx, reduce=reduce, batch_size=batch_size) + + +class MatterGen(paddle.nn.Layer): + """MatterGen: A generative model for inorganic materials design. + https://www.nature.com/articles/s41586-025-08628-5 + + Args: + decoder_cfg (dict): Decoder configuration. + lattice_noise_scheduler_cfg (dict): Lattice noise scheduler configuration. + coord_noise_scheduler_cfg (dict): Coordinate noise scheduler configuration. + atom_noise_scheduler_cfg (dict): Atom type noise scheduler configuration. + num_train_timesteps (int, optional): Number of training steps for diffusion. + Defaults to 1000. + max_t (float, optional): Maximum diffusion time. Defaults to 1.0. + time_dim (int, optional): Time dimension. Defaults to 256. + lattice_loss_weight (float, optional): Lattice loss weight. Defaults to 1.0. + coord_loss_weight (float, optional): Coordinate loss weight. Defaults to 0.1. + atom_loss_weight (float, optional): Atom type loss weight. Defaults to 1.0. + d3pm_hybrid_lambda (float, optional): D3PM hybrid lambda. Defaults to 0.01. + """ + + def __init__( + self, + decoder_cfg: dict, + lattice_noise_scheduler_cfg: dict, + coord_noise_scheduler_cfg: dict, + atom_noise_scheduler_cfg: dict, + num_train_timesteps: int = 1000, + max_t: float = 1.0, + time_dim: int = 256, + lattice_loss_weight: float = 1.0, + coord_loss_weight: float = 0.1, + atom_loss_weight: float = 1.0, + d3pm_hybrid_lambda: float = 0.01, + ) -> None: + super().__init__() + self.model = GemNetTDenoiser(**decoder_cfg) + + self.lattice_scheduler = build_scheduler(lattice_noise_scheduler_cfg) + self.coord_scheduler = build_scheduler(coord_noise_scheduler_cfg) + self.atom_scheduler = build_scheduler(atom_noise_scheduler_cfg) + + self.num_train_timesteps = num_train_timesteps + self.max_t = max_t + self.time_dim = time_dim + self.lattice_loss_weight = lattice_loss_weight + self.coord_loss_weight = coord_loss_weight + self.atom_loss_weight = atom_loss_weight + self.d3pm_hybrid_lambda = d3pm_hybrid_lambda + + self.timestep_sampler = UniformTimestepSampler(min_t=1e-05, max_t=max_t) + + def forward(self, batch) -> Any: + structure_array = batch["structure_array"] + num_atoms = structure_array["num_atoms"] + batch_size = structure_array["num_atoms"].shape[0] + batch_idx = paddle.repeat_interleave( + paddle.arange(batch_size), repeats=structure_array["num_atoms"] + ) + times = self.timestep_sampler(batch_size) + + # coord noise + frac_coords = structure_array["frac_coords"] % 1.0 + rand_x = paddle.randn(shape=frac_coords.shape, dtype=frac_coords.dtype) + + input_frac_coords = self.coord_scheduler.add_noise( + frac_coords, + rand_x, + timesteps=times, + batch_idx=batch_idx, + num_atoms=num_atoms, + ) + + # lattice noise + if "lattice" in structure_array.keys(): + lattices = structure_array["lattice"] + else: + lattices = lattice_params_to_matrix_paddle( + structure_array["lengths"], structure_array["angles"] + ) + + rand_l = paddle.randn(shape=lattices.shape, dtype=lattices.dtype) + rand_l = make_noise_symmetric_preserve_variance(rand_l) + + input_lattice = self.lattice_scheduler.add_noise( + lattices, + rand_l, + timesteps=times, + num_atoms=structure_array["num_atoms"], + ) + + # atom noise + atom_type = structure_array["atom_types"] + atom_type_zero_based = atom_type - 1 + + input_atom_type_zero_based = self.atom_scheduler.add_noise( + atom_type_zero_based, + timesteps=times, + batch_idx=batch_idx, + ) + input_atom_type = input_atom_type_zero_based + 1 + + noise_batch = { + "frac_coords": input_frac_coords, + "lattice": input_lattice, + "atom_types": input_atom_type, + "num_atoms": structure_array["num_atoms"], + "batch": batch_idx, + } + + score_model_output = self.model(noise_batch, times) + + # coord loss + loss_coord = wrapped_normal_loss( + corruption=self.coord_scheduler, + score_model_output=score_model_output["frac_coords"], + t=times, + batch_idx=batch_idx, + batch_size=batch_size, + x=frac_coords, + noisy_x=input_frac_coords, + reduce="sum", + batch=structure_array, + ) + + # lattice loss + loss_lattice = (score_model_output["lattice"] + rand_l).square() + loss_lattice = loss_lattice.mean(axis=[1, 2]) + + # atom type loss + ( + loss_atom_type, + base_loss_atom_type, + cross_entropy_atom_type, + ) = self.atom_scheduler.compute_loss( + score_model_output=score_model_output["atom_types"], + t=times, + batch_idx=batch_idx, + batch_size=batch_size, + x=atom_type_zero_based, + noisy_x=input_atom_type_zero_based, + reduce="sum", + d3pm_hybrid_lambda=self.d3pm_hybrid_lambda, + ) + + loss_coord = loss_coord.mean() + loss_lattice = loss_lattice.mean() + loss_atom_type = loss_atom_type.mean() + base_loss_atom_type = base_loss_atom_type.mean() + cross_entropy_atom_type = cross_entropy_atom_type.mean() + + loss = ( + self.coord_loss_weight * loss_coord + + self.lattice_loss_weight * loss_lattice + + self.atom_loss_weight * loss_atom_type + ) + return { + "loss_dict": { + "loss": loss, + "loss_coord": loss_coord, + "loss_lattice": loss_lattice, + "loss_atom_type": loss_atom_type, + "base_loss_atom_type": base_loss_atom_type, + "cross_entropy_atom_type": cross_entropy_atom_type, + } + } + + @paddle.no_grad() + def sample( + self, + batch_data, + num_inference_steps=1000, + _eps_t=0.001, + n_step_corrector: int = 1, + record: bool = False, + ): + structure_array = batch_data["structure_array"] + num_atoms = structure_array["num_atoms"] + batch_size = num_atoms.shape[0] + batch_idx = paddle.repeat_interleave( + paddle.arange(batch_size), repeats=num_atoms + ) + + # get the initial noise + lattice = self.lattice_scheduler.prior_sampling( + shape=(batch_size, 3, 3), num_atoms=num_atoms + ) + frac_coords = self.coord_scheduler.prior_sampling( + shape=(num_atoms.sum(), 3), num_atoms=num_atoms, batch_idx=batch_idx + ) + atom_types_zero_based = self.atom_scheduler.prior_sampling( + shape=(num_atoms.sum(),) + ) + atom_types = atom_types_zero_based + 1 + + # update the structure_array with the initial noise + structure_array.update( + { + "frac_coords": frac_coords, + "lattice": lattice, + "atom_types": atom_types, + } + ) + structure_array["batch"] = batch_idx + + timesteps = paddle.linspace(self.max_t, stop=_eps_t, num=num_inference_steps) + dt = -paddle.to_tensor(data=(self.max_t - _eps_t) / (num_inference_steps - 1)) + recorded_samples = [] + for i in tqdm(range(num_inference_steps), desc="Sampling..."): + t = paddle.full(shape=(batch_size,), fill_value=timesteps[i]) + for _ in range(n_step_corrector): + score_out = self.model(structure_array, t) + + if record: + recorded_samples.append(structure_array) + + score_out["frac_coords"] = ( + score_out["frac_coords"] + / self.coord_scheduler.marginal_prob( + structure_array["frac_coords"], + t=t, + batch_idx=batch_idx, + num_atoms=num_atoms, + )[1] + ) + score_out["lattice"] = ( + score_out["lattice"] + / self.lattice_scheduler.marginal_prob( + structure_array["lattice"], t=t, num_atoms=num_atoms + )[1] + ) + + frac_coords, _ = self.coord_scheduler.step_correct( + model_output=score_out["frac_coords"], + timestep=t, + sample=structure_array["frac_coords"], + batch_idx=batch_idx, + ) + cell, _ = self.lattice_scheduler.step_correct( + structure_array["lattice"], + batch_idx=None, + score=score_out["lattice"], + t=t, + ) + structure_array.update( + { + "frac_coords": frac_coords, + "lattice": cell, + } + ) + score_out = self.model(structure_array, t) + + if record: + recorded_samples.append(structure_array) + + score_out["frac_coords"] = ( + score_out["frac_coords"] + / self.coord_scheduler.marginal_prob( + structure_array["frac_coords"], + t=t, + batch_idx=batch_idx, + num_atoms=num_atoms, + )[1] + ) + score_out["lattice"] = ( + score_out["lattice"] + / self.lattice_scheduler.marginal_prob( + structure_array["lattice"], t=t, num_atoms=num_atoms + )[1] + ) + + frac_coords, frac_coords_mean = self.coord_scheduler.step_pred( + frac_coords, + t=t, + dt=dt, + batch_idx=batch_idx, + score=score_out["frac_coords"], + num_atoms=num_atoms, + ) + + cell, cell_mean = self.lattice_scheduler.step_pred( + cell, + t=t, + dt=dt, + batch_idx=None, + score=score_out["lattice"], + num_atoms=num_atoms, + ) + atom_type, atom_type_mean = self.atom_scheduler.step( + x=structure_array["atom_types"] - 1, + t=t, + batch_idx=batch_idx, + score=score_out["atom_types"], + ) + atom_type += 1 + atom_type_mean += 1 + + structure_array.update( + {"frac_coords": frac_coords, "lattice": cell, "atom_types": atom_type} + ) + structure_array_mean = { + "frac_coords": frac_coords_mean, + "lattice": cell_mean, + "atom_types": atom_type_mean, + "num_atoms": num_atoms, + } + + start_idx = 0 + result = [] + for i in range(batch_size): + end_idx = start_idx + num_atoms[i] + # for mattertgen, we need to use the mean value of the predicted structure + result.append( + { + "num_atoms": num_atoms[i].tolist(), + "atom_types": structure_array_mean["atom_types"][ + start_idx:end_idx + ].tolist(), + "frac_coords": structure_array_mean["frac_coords"][ + start_idx:end_idx + ].tolist(), + "lattice": structure_array_mean["lattice"][i].tolist(), + } + ) + # result.append( + # { + # "num_atoms": num_atoms[i].tolist(), + # "atom_types": structure_array["atom_types"][ + # start_idx:end_idx + # ].tolist(), + # "frac_coords": structure_array["frac_coords"][ + # start_idx:end_idx + # ].tolist(), + # "lattice": structure_array["lattice"][i].tolist(), + # } + # ) + start_idx += num_atoms[i] + + return {"result": result} + + +class MatterGenWithCondition(paddle.nn.Layer): + """MatterGenWithCondition: A generative model for inorganic materials design. + https://www.nature.com/articles/s41586-025-08628-5 + + Args: + set_embedding_type_cfg (dict): SetEmbeddingType configuration. + condition_names (list): Attribute name as a conditional constraint. + decoder_cfg (dict): Decoder configuration. + lattice_noise_scheduler_cfg (dict): Lattice noise scheduler configuration. + coord_noise_scheduler_cfg (dict): Coordinate noise scheduler configuration. + atom_noise_scheduler_cfg (dict): Atom type noise scheduler configuration. + num_train_timesteps (int, optional): Number of training steps for diffusion. + Defaults to 1000. + max_t (float, optional): Maximum diffusion time. Defaults to 1.0. + time_dim (int, optional): Time dimension. Defaults to 256. + lattice_loss_weight (float, optional): Lattice loss weight. Defaults to 1.0. + coord_loss_weight (float, optional): Coordinate loss weight. Defaults to 0.1. + atom_loss_weight (float, optional): Atom type loss weight. Defaults to 1.0. + d3pm_hybrid_lambda (float, optional): D3PM hybrid lambda. Defaults to 0.01. + """ + + def __init__( + self, + set_embedding_type_cfg: dict, + condition_names: list, + decoder_cfg: dict, + lattice_noise_scheduler_cfg: dict, + coord_noise_scheduler_cfg: dict, + atom_noise_scheduler_cfg: dict, + num_train_timesteps: int = 1000, + max_t: float = 1.0, + time_dim: int = 256, + lattice_loss_weight: float = 1.0, + coord_loss_weight: float = 0.1, + atom_loss_weight: float = 1.0, + d3pm_hybrid_lambda: float = 0.01, + ) -> None: + super().__init__() + self.set_embedding_type_cfg = set_embedding_type_cfg + self.condition_names = condition_names + + self.set_embedding_type = SetEmbeddingType(**set_embedding_type_cfg) + + self.model = GemNetTDenoiser(**decoder_cfg) + + self.lattice_scheduler = build_scheduler(lattice_noise_scheduler_cfg) + self.coord_scheduler = build_scheduler(coord_noise_scheduler_cfg) + self.atom_scheduler = build_scheduler(atom_noise_scheduler_cfg) + + self.num_train_timesteps = num_train_timesteps + self.max_t = max_t + self.time_dim = time_dim + self.lattice_loss_weight = lattice_loss_weight + self.coord_loss_weight = coord_loss_weight + self.atom_loss_weight = atom_loss_weight + self.d3pm_hybrid_lambda = d3pm_hybrid_lambda + + self.timestep_sampler = UniformTimestepSampler(min_t=1e-05, max_t=max_t) + + def before_train(self, trainer): + # This function serves as a pre-training hook, designed to execute + # initialization/setup operations before the training pipeline begins. It + # follows a dependency injection pattern - the Trainer instance must be fully + # initialized before this hook is injected as a callback parameter into the + # training workflow. + set_property_scalers = SetPropertyScalers() + set_property_scalers.on_fit_start( + train_dataloader=trainer.train_dataloader, model=self + ) + + def forward(self, batch) -> Any: + structure_array = batch["structure_array"] + use_unconditional_embedding = self.set_embedding_type( + batch, self.condition_names + ) + + num_atoms = structure_array["num_atoms"] + batch_size = structure_array["num_atoms"].shape[0] + batch_idx = paddle.repeat_interleave( + paddle.arange(batch_size), repeats=structure_array["num_atoms"] + ) + times = self.timestep_sampler(batch_size) + + # coord noise + frac_coords = structure_array["frac_coords"] % 1.0 + rand_x = paddle.randn(shape=frac_coords.shape, dtype=frac_coords.dtype) + + input_frac_coords = self.coord_scheduler.add_noise( + frac_coords, + rand_x, + timesteps=times, + batch_idx=batch_idx, + num_atoms=num_atoms, + ) + + # lattice noise + if "lattice" in structure_array.keys(): + lattices = structure_array["lattice"] + else: + lattices = lattice_params_to_matrix_paddle( + structure_array["lengths"], structure_array["angles"] + ) + + rand_l = paddle.randn(shape=lattices.shape, dtype=lattices.dtype) + rand_l = make_noise_symmetric_preserve_variance(rand_l) + + input_lattice = self.lattice_scheduler.add_noise( + lattices, + rand_l, + timesteps=times, + num_atoms=structure_array["num_atoms"], + ) + + # atom noise + atom_type = structure_array["atom_types"] + atom_type_zero_based = atom_type - 1 + + input_atom_type_zero_based = self.atom_scheduler.add_noise( + atom_type_zero_based, + timesteps=times, + batch_idx=batch_idx, + ) + input_atom_type = input_atom_type_zero_based + 1 + + noise_batch = { + "frac_coords": input_frac_coords, + "lattice": input_lattice, + "atom_types": input_atom_type, + "num_atoms": structure_array["num_atoms"], + "batch": batch_idx, + _USE_UNCONDITIONAL_EMBEDDING: use_unconditional_embedding, + } + for condition_name in self.condition_names: + noise_batch[condition_name] = batch[condition_name] + + score_model_output = self.model(noise_batch, times) + + # coord loss + loss_coord = wrapped_normal_loss( + corruption=self.coord_scheduler, + score_model_output=score_model_output["frac_coords"], + t=times, + batch_idx=batch_idx, + batch_size=batch_size, + x=frac_coords, + noisy_x=input_frac_coords, + reduce="sum", + batch=structure_array, + ) + + # lattice loss + loss_lattice = (score_model_output["lattice"] + rand_l).square() + loss_lattice = loss_lattice.mean(axis=[1, 2]) + + # atom type loss + ( + loss_atom_type, + base_loss_atom_type, + cross_entropy_atom_type, + ) = self.atom_scheduler.compute_loss( + score_model_output=score_model_output["atom_types"], + t=times, + batch_idx=batch_idx, + batch_size=batch_size, + x=atom_type_zero_based, + noisy_x=input_atom_type_zero_based, + reduce="sum", + d3pm_hybrid_lambda=self.d3pm_hybrid_lambda, + ) + + loss_coord = loss_coord.mean() + loss_lattice = loss_lattice.mean() + loss_atom_type = loss_atom_type.mean() + base_loss_atom_type = base_loss_atom_type.mean() + cross_entropy_atom_type = cross_entropy_atom_type.mean() + + loss = ( + self.coord_loss_weight * loss_coord + + self.lattice_loss_weight * loss_lattice + + self.atom_loss_weight * loss_atom_type + ) + return { + "loss_dict": { + "loss": loss, + "loss_coord": loss_coord, + "loss_lattice": loss_lattice, + "loss_atom_type": loss_atom_type, + "base_loss_atom_type": base_loss_atom_type, + "cross_entropy_atom_type": cross_entropy_atom_type, + } + } + + @paddle.no_grad() + def _score_fn( + self, + structure_array, + t, + batch_idx, + num_atoms, + guidance_scale: float = 2.0, + ): + if not hasattr(self, "set_conditional_embedding_type"): + self.set_conditional_embedding_type = SetConditionalEmbeddingType() + if not hasattr(self, "set_unconditional_embedding_type"): + self.set_unconditional_embedding_type = SetUnconditionalEmbeddingType() + + conditional_embedding = self.set_conditional_embedding_type( + structure_array, self.condition_names + ) + uunconditional_embedding = self.set_unconditional_embedding_type( + structure_array, self.condition_names + ) + + structure_array[_USE_UNCONDITIONAL_EMBEDDING] = conditional_embedding + score_out_cond = self.model(structure_array, t) + + score_out_cond["frac_coords"] = ( + score_out_cond["frac_coords"] + / self.coord_scheduler.marginal_prob( + structure_array["frac_coords"], + t=t, + batch_idx=batch_idx, + num_atoms=num_atoms, + )[1] + ) + score_out_cond["lattice"] = ( + score_out_cond["lattice"] + / self.lattice_scheduler.marginal_prob( + structure_array["lattice"], t=t, num_atoms=num_atoms + )[1] + ) + + structure_array[_USE_UNCONDITIONAL_EMBEDDING] = uunconditional_embedding + score_out_uncond = self.model(structure_array, t) + + score_out_uncond["frac_coords"] = ( + score_out_uncond["frac_coords"] + / self.coord_scheduler.marginal_prob( + structure_array["frac_coords"], + t=t, + batch_idx=batch_idx, + num_atoms=num_atoms, + )[1] + ) + score_out_uncond["lattice"] = ( + score_out_uncond["lattice"] + / self.lattice_scheduler.marginal_prob( + structure_array["lattice"], t=t, num_atoms=num_atoms + )[1] + ) + + score_out_uncond.update( + { + "frac_coords": paddle.lerp( + x=score_out_uncond["frac_coords"], + y=score_out_cond["frac_coords"], + weight=guidance_scale, + ), + "lattice": paddle.lerp( + x=score_out_uncond["lattice"], + y=score_out_cond["lattice"], + weight=guidance_scale, + ), + "atom_types": paddle.lerp( + x=score_out_uncond["atom_types"], + y=score_out_cond["atom_types"], + weight=guidance_scale, + ), + } + ) + return score_out_uncond + + @paddle.no_grad() + def sample( + self, + batch_data, + num_inference_steps=1000, + _eps_t=0.001, + n_step_corrector: int = 1, + record: bool = False, + guidance_scale: float = 2.0, + ): + structure_array = batch_data["structure_array"] + num_atoms = structure_array["num_atoms"] + batch_size = num_atoms.shape[0] + batch_idx = paddle.repeat_interleave( + paddle.arange(batch_size), repeats=num_atoms + ) + + # get the initial noise + lattice = self.lattice_scheduler.prior_sampling( + shape=(batch_size, 3, 3), num_atoms=num_atoms + ) + frac_coords = self.coord_scheduler.prior_sampling( + shape=(num_atoms.sum(), 3), num_atoms=num_atoms, batch_idx=batch_idx + ) + atom_types_zero_based = self.atom_scheduler.prior_sampling( + shape=(num_atoms.sum(),) + ) + atom_types = atom_types_zero_based + 1 + + # update the structure_array with the initial noise + structure_array.update( + { + "frac_coords": frac_coords, + "lattice": lattice, + "atom_types": atom_types, + } + ) + structure_array["batch"] = batch_idx + for condition_name in self.condition_names: + structure_array[condition_name] = batch_data[condition_name] + + timesteps = paddle.linspace(self.max_t, stop=_eps_t, num=num_inference_steps) + dt = -paddle.to_tensor(data=(self.max_t - _eps_t) / (num_inference_steps - 1)) + recorded_samples = [] + for i in tqdm(range(num_inference_steps), desc="Sampling..."): + t = paddle.full(shape=(batch_size,), fill_value=timesteps[i]) + for _ in range(n_step_corrector): + score_out = self._score_fn( + structure_array, t, batch_idx, num_atoms, guidance_scale + ) + + if record: + recorded_samples.append(structure_array) + frac_coords, _ = self.coord_scheduler.step_correct( + model_output=score_out["frac_coords"], + timestep=t, + sample=structure_array["frac_coords"], + batch_idx=batch_idx, + ) + cell, _ = self.lattice_scheduler.step_correct( + structure_array["lattice"], + batch_idx=None, + score=score_out["lattice"], + t=t, + ) + structure_array.update( + { + "frac_coords": frac_coords, + "lattice": cell, + } + ) + score_out = self._score_fn( + structure_array, t, batch_idx, num_atoms, guidance_scale + ) + + if record: + recorded_samples.append(structure_array) + + frac_coords, frac_coords_mean = self.coord_scheduler.step_pred( + frac_coords, + t=t, + dt=dt, + batch_idx=batch_idx, + score=score_out["frac_coords"], + num_atoms=num_atoms, + ) + + cell, cell_mean = self.lattice_scheduler.step_pred( + cell, + t=t, + dt=dt, + batch_idx=None, + score=score_out["lattice"], + num_atoms=num_atoms, + ) + atom_type, atom_type_mean = self.atom_scheduler.step( + x=structure_array["atom_types"] - 1, + t=t, + batch_idx=batch_idx, + score=score_out["atom_types"], + ) + atom_type += 1 + atom_type_mean += 1 + + structure_array.update( + {"frac_coords": frac_coords, "lattice": cell, "atom_types": atom_type} + ) + structure_array_mean = { + "frac_coords": frac_coords_mean, + "lattice": cell_mean, + "atom_types": atom_type_mean, + "num_atoms": num_atoms, + } + + start_idx = 0 + result = [] + for i in range(batch_size): + end_idx = start_idx + num_atoms[i] + # for mattertgen, we need to use the mean value of the predicted structure + result.append( + { + "num_atoms": num_atoms[i].tolist(), + "atom_types": structure_array_mean["atom_types"][ + start_idx:end_idx + ].tolist(), + "frac_coords": structure_array_mean["frac_coords"][ + start_idx:end_idx + ].tolist(), + "lattice": structure_array_mean["lattice"][i].tolist(), + } + ) + # result.append( + # { + # "num_atoms": num_atoms[i].tolist(), + # "atom_types": structure_array["atom_types"][ + # start_idx:end_idx + # ].tolist(), + # "frac_coords": structure_array["frac_coords"][ + # start_idx:end_idx + # ].tolist(), + # "lattice": structure_array["lattice"][i].tolist(), + # } + # ) + start_idx += num_atoms[i] + + return {"result": result} diff --git a/ppmat/models/mattergen/property_embeddings.py b/ppmat/models/mattergen/property_embeddings.py new file mode 100644 index 00000000..53b3897f --- /dev/null +++ b/ppmat/models/mattergen/property_embeddings.py @@ -0,0 +1,597 @@ +# 版权所有(C)2026 苏州国家实验室、百度飞桨团队 +# 本代码由苏州国家实验室与百度飞桨团队合作开发完成。 +# 其中,苏州国家实验室提供模型框架设计思路,百度飞桨团队负责代码实现。 +# 双方对本代码及相关成果享有同等权利。 + +# Copyright (C) 2026 Suzhou National Laboratory and Baidu PaddlePaddle team +# This code was jointly developed by Suzhou National Laboratory and Baidu PaddlePaddle team. +# Suzhou National Laboratory provided the design concept for the model framework, +# and Baidu PaddlePaddle team was responsible for the code implementation. +# Both parties shall have equal rights to use this code and related work products. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import math +from collections import defaultdict +from functools import lru_cache +from typing import Dict +from typing import Sequence +from typing import TypeVar +from typing import Union + +import paddle +import paddle.distributed as dist +from pymatgen.core import Element +from tqdm.auto import tqdm + +from ppmat.models.mattergen.globals import _USE_UNCONDITIONAL_EMBEDDING +from ppmat.models.mattergen.globals import MAX_ATOMIC_NUM + +TensorOrStringType = TypeVar("TensorOrStringType", paddle.Tensor, list[str]) + + +@lru_cache +def get_atomic_number(symbol: str) -> int: + return Element(symbol).Z + + +def get_use_unconditional_embedding(batch, cond_field: str) -> paddle.bool: + """ + Returns + ------- + paddle.BoolTensor, shape=(n_structures_in_batch, 1) -- whether to use the + unconditional embedding for cond_field. When True, we use unconditional + embedding. + + NOTE: When _USE_UNCONDITIONAL_EMBEDDING is not in batch or cond_field is not + in batch[_USE_UNCONDITIONAL_EMBEDDING] we return a paddle.BoolTensor with + True values. + """ + try: + return batch[_USE_UNCONDITIONAL_EMBEDDING][cond_field] + except KeyError: + return paddle.ones_like(x=batch["num_atoms"], dtype="bool").reshape(-1, 1) + + +def tensor_is_not_nan(x: paddle.Tensor) -> paddle.bool: + """ + Keyword arguments + ----------------- + x: paddle.Tensor, shape = (n_structures_in_batch, Ndim) -- labels for a single + conditional field. We assume that when a label is not present, the + corresponding value is specified as paddle.nan. + + Returns + ------- + paddle.BoolTensor, shape = (n_structures_in_batch,) -- index i is True if x[i] + contains no NaNs + """ + return paddle.all( + x=paddle.reshape( + x=paddle.logical_not(x=paddle.isnan(x=x)), shape=(tuple(x.shape)[0], -1) + ), + axis=1, + ) + + +def data_is_not_nan( + x: Union[paddle.Tensor, list[str | None], list[list[str] | None]] +) -> paddle.bool: + """ + Returns (n_structures_in_batch,) paddle.BoolTensor of whether the conditional values + for a given property are not nan. + + """ + if isinstance(x, paddle.Tensor): + return tensor_is_not_nan(x=x) + else: + return paddle.to_tensor(data=[(_x is not None) for _x in x]) + + +class SetEmbeddingType: + def __init__(self, p_unconditional: float, dropout_fields_iid: bool = False): + """ + In PropertyEmbedding.forward we choose to concatenate either an unconditional + embedding (ignores the value of a property) or a conditional embedding + (depends on the value of a property) to the tensor that is input to the first + node layer of each atom. This utility sets the internal state of batch_data to + randomly select either the conditional or unconditional embedding for each + structure in the batch. + + This utility operates in 2 modes: + 1) dropout_fields_iid = True -- We randomly assign which conditional fields are + unconditional and which are conditional for fields that are not nan + independently of whether all conditional fields are not nan for that + structure. This means that for a structure conditioned on (y1,y2) we can + generate embeddings corresponding to p(x), p(x|y1), p(x|y2), p(x|y1,y2). + 2) dropout_fields_iid = False - We assign conditional or unconditional + embeddings to all conditional fields of a single structure simultaneously. + This means that for a structure conditioned on (y1,y2) we can only generate + embeddings corresponding to p(x) and p(|y1,y2). + + Keyword args: + ------------- + p_unconditional: float -- the probability of using the unconditional embedding + in the score model. + dropout_fields_iid: bool -- whether to mask the conditional embedding of fields + independently and identically distributed according to p_unconditional. If + False, the score model is only exposed to two scenarios: 1) all conditional + fields have their unconditional embedding. 2) all conditional fields have + their conditional embedding. If True, the score model is exposed to all + possible combinations of conditional fields having their unconditional or + conditional embeddings, ie the score model will learn p(x), p(x|y1), + p(x_y2), p(x|y1,y2),... + + Note: when dropout_fields_iid=False, the conditional embedding will only be + used when all conditional fields have data present. If no single data point + has data present for all conditional fields, then the score model will only + be exposed to the unconditional embedding state p(x) and the joint + p(x|y1,y2,...) will not be learned. + """ + self.p_unconditional = p_unconditional + self.dropout_fields_iid = dropout_fields_iid + + def __call__(self, x, cond_fields): + if len(cond_fields) == 0: + return x + else: + batch_size = len(x[cond_fields[0]]) + data_is_not_nan_dict: Dict[str, paddle.Tensor] = { + cond_field: data_is_not_nan(x=x[cond_field]) + for cond_field in cond_fields + } + alldata_is_not_nan: paddle.bool = paddle.all( + x=paddle.concat( + x=[ + cond_data_not_nan.reshape(-1, 1) + for cond_data_not_nan in data_is_not_nan_dict.values() + ], + axis=1, + ), + axis=1, + ) + use_unconditional_embedding: Dict[str, paddle.Tensor] = {} + for cond_field in cond_fields: + embedding_type = paddle.ones(shape=(batch_size, 1), dtype="bool") + if self.dropout_fields_iid: + cond_data_is_not_nan = data_is_not_nan_dict[cond_field] + else: + cond_data_is_not_nan = alldata_is_not_nan + embedding_type[cond_data_is_not_nan] = ( + paddle.rand(shape=(cond_data_is_not_nan.sum(), 1)) + <= self.p_unconditional + ) + use_unconditional_embedding[cond_field] = embedding_type + return use_unconditional_embedding + + +class SetUnconditionalEmbeddingType: + def __call__(self, x, cond_fields): + use_unconditional_embedding = { + cond_field: paddle.ones(shape=(len(x[cond_field]), 1), dtype="bool") + for cond_field in cond_fields + } + return use_unconditional_embedding + + +class SetConditionalEmbeddingType: + def __call__(self, x, cond_fields): + use_unconditional_embedding = {} + for cond_field in cond_fields: + use_unconditional_embedding[cond_field] = paddle.zeros( + shape=(len(x[cond_field]), 1), dtype="bool" + ) + return use_unconditional_embedding + + +class BaseUnconditionalEmbeddingModule(paddle.nn.Layer): + only_depends_on_shape_of_input: bool + hidden_dim: int + + +class EmbeddingVector(BaseUnconditionalEmbeddingModule): + only_depends_on_shape_of_input: bool = True + + def __init__(self, hidden_dim: int): + super().__init__() + self.embedding = paddle.nn.Embedding(num_embeddings=1, embedding_dim=hidden_dim) + self.hidden_dim = hidden_dim + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """ + This forward depends only on the shape of x and returns a tensor of zeros. + """ + return self.embedding(paddle.zeros(shape=len(x), dtype="int64")) + + +class SpaceGroupEmbeddingVector(BaseUnconditionalEmbeddingModule): + only_depends_on_shape_of_input: bool = True + + def __init__(self, hidden_dim: int): + super().__init__() + self.embedding = paddle.nn.Embedding( + num_embeddings=230, embedding_dim=hidden_dim + ) + self.hidden_dim = hidden_dim + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """ + Return embedding of the space group, 1 is subtracted from the space group + number to make it zero-indexed. + """ + return self.embedding(x.astype(dtype="int64") - 1) + + +class ZerosEmbedding(BaseUnconditionalEmbeddingModule): + """ + Return a [n_crystals_in_batch, self.hidden_dim] tensor of zeros. This is helpfuln + as the unconditional embedding for a property included in the adapter module if we + do not want to change the unconditional score of the base model when properties are + added in the adapter module. + """ + + only_depends_on_shape_of_input: bool = True + + def __init__(self, hidden_dim: int): + super().__init__() + self.hidden_dim = hidden_dim + + def forward(self, x: (paddle.Tensor | list[str])) -> paddle.Tensor: + """ + This forward depends only on the shape of x. + """ + return paddle.zeros(shape=[len(x), self.hidden_dim]) + + +class ChemicalSystemMultiHotEmbedding(paddle.nn.Layer): + def __init__(self, hidden_dim: int): + super().__init__() + self.hidden_dim = hidden_dim + self.embedding = paddle.nn.Linear( + in_features=MAX_ATOMIC_NUM + 1, out_features=hidden_dim + ) + + @property + def device(self): + return self.parameters()[0].place + # return next(self.parameters()).place + + @staticmethod + def _sequence_to_multi_hot( + x: Sequence[str], device: (paddle.CPUPlace, paddle.CUDAPlace, str) + ) -> paddle.Tensor: + """ + Converts a sequence of unique elements present in a single structure to a + multi-hot vectors of 1s (present) and 0s (not present) for each unique element. + + Returns + ------- + paddle.Tensor, shape = (1, MAX_ATOMIC_NUM + 1) + """ + chemical_system_numbers: paddle.int64 = paddle.to_tensor( + data=[get_atomic_number(symbol=_element) for _element in x], + dtype="int64", + place=device, + ) + chemical_system_condition = paddle.zeros(shape=MAX_ATOMIC_NUM + 1) + chemical_system_condition[chemical_system_numbers] = 1.0 + return chemical_system_condition.reshape(1, -1) + + @staticmethod + def sequences_to_multi_hot( + x: list[list[str]], device: (paddle.CPUPlace, paddle.CUDAPlace, str) + ) -> paddle.Tensor: + """ + Convert a list of sequences of unique elements present in a list of structures + to a multi-hot tensor of 1s (present) and 0s (not present) for each unique + element. + + Returns + ------- + paddle.Tensor, shape = (n_structures_in_batch, MAX_ATOMIC_NUM + 1) + """ + return paddle.concat( + x=[ + ChemicalSystemMultiHotEmbedding._sequence_to_multi_hot( + _x, device=device + ) + for _x in x + ], + axis=0, + ) + + @staticmethod + def convert_to_list_of_str(x: (list[str] | list[list[str]])) -> list[list[str]]: + """ + Returns + ------- + list[list[str]] -- a list of length n_structures_in_batch of chemical systems + for each structure where the chemical system is specified as a list of unique + elements in the structure. + """ + if isinstance(x[0], str): + x = [_x.split("-") for _x in x if isinstance(_x, str)] + return x + + def forward(self, x: (list[str] | list[list[str]])) -> paddle.Tensor: + """ + Keyword arguments + ----------------- + x: Union[list[str], list[Sequence[str]]] -- if elements are a string, they are + assumed to be a '-' delimited list of unique elements. If a sequence of + strings, it is assumed to be a list of unique elements in the structure. + """ + x = self.convert_to_list_of_str(x=x) + multi_hot_representation: paddle.Tensor = self.sequences_to_multi_hot( + x=x, device=self.device + ) + return self.embedding(multi_hot_representation) + + +def paddle_nanstd(x: paddle.Tensor, dim: int, unbiased: bool) -> paddle.Tensor: + data_is_present = paddle.all( + x=paddle.reshape( + x=paddle.logical_not(x=paddle.isnan(x=x)), shape=(tuple(x.shape)[0], -1) + ), # noqa + axis=1, + ) + return paddle.std(x=x[data_is_present], axis=dim, unbiased=unbiased) + + +class StandardScalerPaddle(paddle.nn.Layer): + """Normalizes the targets of a dataset.""" + + def __init__( + self, + means: (paddle.Tensor | None) = None, + stds: (paddle.Tensor | None) = None, + stats_dim: tuple[int] = (1,), + ): + super().__init__() + self.register_buffer( + name="means", + tensor=paddle.atleast_1d(means) + if means is not None + else paddle.zeros(shape=stats_dim), # noqa + ) + self.register_buffer( + name="stds", + tensor=paddle.atleast_1d(stds) + if stds is not None + else paddle.ones(shape=stats_dim), # noqa + ) + + def fit(self, X: paddle.Tensor): + means: paddle.Tensor = paddle.atleast_1d(paddle.nanmean(x=X, axis=0)) # noqa + stds: paddle.Tensor = paddle.atleast_1d( + paddle_nanstd(X, dim=0, unbiased=False) + 1e-5 + ) + assert tuple(means.shape) == tuple( + self.means.shape + ), f"Mean shape mismatch: {tuple(means.shape)} != {tuple(self.means.shape)}" + assert tuple(stds.shape) == tuple( + self.stds.shape + ), f"Std shape mismatch: {tuple(stds.shape)} != {tuple(self.stds.shape)}" + self.means = means + self.stds = stds + + def transform(self, X: paddle.Tensor) -> paddle.Tensor: + assert self.means is not None and self.stds is not None + return (X - self.means) / self.stds + + def inverse_transform(self, X: paddle.Tensor) -> paddle.Tensor: + assert self.means is not None and self.stds is not None + return X * self.stds + self.means + + def copy(self) -> "StandardScalerPaddle": + return StandardScalerPaddle( + means=self.means.clone().detach(), stds=self.stds.clone().detach() + ) + + def forward(self, X: paddle.Tensor) -> paddle.Tensor: + return self.transform(X) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(means: {self.means.tolist() if self.means is not None else None}, stds: {self.stds.tolist() if self.stds is not None else None})" # noqa + + +class PropertyEmbedding(paddle.nn.Layer): + def __init__( + self, + # name: str, + conditional_embedding_module_name: str, + conditional_embedding_module_cfg: dict, + unconditional_embedding_module_name: str, + unconditional_embedding_module_cfg: dict, + scaler_name: str, + scaler_cfg: dict, + ): + super().__init__() + # self.name = name + self.conditional_embedding_module_name = conditional_embedding_module_name + self.conditional_embedding_module_cfg = conditional_embedding_module_cfg + self.unconditional_embedding_module_name = unconditional_embedding_module_name + self.unconditional_embedding_module_cfg = unconditional_embedding_module_cfg + self.scaler_name = scaler_name + self.scaler_cfg = scaler_cfg + + if conditional_embedding_module_name == "ChemicalSystemMultiHotEmbedding": + self.conditional_embedding_module = ChemicalSystemMultiHotEmbedding( + **conditional_embedding_module_cfg + ) + elif conditional_embedding_module_name == "NoiseLevelEncoding": + self.conditional_embedding_module = NoiseLevelEncoding( + **conditional_embedding_module_cfg + ) + elif conditional_embedding_module_name == "SpaceGroupEmbeddingVector": + self.conditional_embedding_module = SpaceGroupEmbeddingVector( + **conditional_embedding_module_cfg + ) + else: + raise ValueError( + "Invalid conditional_embedding_module_name: " + f"{conditional_embedding_module_name}" + ) + + if unconditional_embedding_module_name == "ZerosEmbedding": + self.unconditional_embedding_module = ZerosEmbedding( + **unconditional_embedding_module_cfg + ) + else: + raise ValueError( + "Invalid unconditional_embedding_module_name: " + f"{unconditional_embedding_module_name}" + ) + + if scaler_name == "Identity": + self.scaler = paddle.nn.Identity(**scaler_cfg) + elif scaler_name == "StandardScalerPaddle": + self.scaler = StandardScalerPaddle(**scaler_cfg) + else: + raise ValueError(f"Invalid scaler_name: {scaler_name}") + + def forward(self, data, use_unconditional_embedding) -> paddle.Tensor: + if ( + paddle.all(x=use_unconditional_embedding) + and self.unconditional_embedding_module.only_depends_on_shape_of_input + ): + return self.unconditional_embedding_module(x=data) + else: + # data = batch[self.name] + if isinstance(data, paddle.Tensor) and data.dim() == 2: + data = data.squeeze(axis=-1) + data = self.scaler(data) + conditional_embedding: paddle.Tensor = self.conditional_embedding_module( + data + ) + unconditional_embedding: paddle.Tensor = ( + self.unconditional_embedding_module(x=data) + ) + return paddle.where( + condition=use_unconditional_embedding, + x=unconditional_embedding, + y=conditional_embedding, + ) + + def fit_scaler(self, all_data): + if isinstance(self.scaler, paddle.nn.Identity): + return + self.scaler.fit(all_data) + + +def get_property_embeddings( + batch, property_embeddings: paddle.nn.LayerDict +) -> paddle.Tensor: + """ + Keyword arguments + ----------------- + property_embeddings: paddle.nn.ModuleDict[PropertyToConditonOn, PropertyEmbedding] + -- a dictionary of property embeddings. The keys are the names of the + conditional fields in the batch. + """ + ordered_keys = sorted(property_embeddings.keys()) + if len(ordered_keys) > 0: + return paddle.concat( + x=[property_embeddings[k].forward(batch=batch) for k in ordered_keys], + axis=-1, + ) + else: + return paddle.to_tensor(data=[], place=batch["num_atoms"].place) + + +def set_conditional_property_values(batch, properties: str): + not_numeric = [k for k, v in properties.items() if not isinstance(v, (int, float))] + cond_values = { + k: ( + [properties[k]] * len(batch["num_atoms"]) + if k in not_numeric + else paddle.full_like(x=batch["num_atoms"], fill_value=v).reshape(-1, 1) + ) + for k, v in properties.items() + } + return batch.replace(**cond_values) + + +def maybe_to_tensor(values: list[TensorOrStringType]) -> TensorOrStringType: + if isinstance(values[0], paddle.Tensor): + return paddle.concat(x=values) + return [el for x in values for el in x] + + +class SetPropertyScalers: + """ + Utility callback; at the start of training, this computes the mean and std of the + property data and adds the property scalers to the model. + """ + + @staticmethod + def _compute_property_scalers( + train_dataloader, + property_embeddings: paddle.nn.LayerDict, + ): + property_values = defaultdict(list) + property_names = [ + name + for name, p in property_embeddings.items() + if not isinstance(p.scaler, paddle.nn.Identity) + ] + if len(property_names) == 0: + return + for batch in tqdm(train_dataloader, desc="Fitting property scalers"): + for property_name in property_names: + property_values[property_name].append(batch[property_name]) + for property_name in property_names: + values = maybe_to_tensor(values=property_values[property_name]) + if dist.is_initialized(): + if isinstance(values, paddle.Tensor): + values_list = [] + dist.all_gather(values_list, values) + values = paddle.concat(x=values_list) + else: + print(f"Property {property_name} cannot be gathered") + property_embeddings[property_name].fit_scaler(all_data=values) + + def on_fit_start(self, train_dataloader, model): + model = model.model + self._compute_property_scalers( + train_dataloader=train_dataloader, + property_embeddings=model.property_embeddings, + ) + if hasattr(model, "property_embeddings_adapt"): + self._compute_property_scalers( + train_dataloader=train_dataloader, + property_embeddings=model.property_embeddings_adapt, + ) + + +class NoiseLevelEncoding(paddle.nn.Layer): + def __init__(self, d_model: int, dropout: float = 0.0): + super().__init__() + self.dropout = paddle.nn.Dropout(p=dropout) + self.d_model = d_model + div_term = paddle.exp( + x=paddle.arange(start=0, end=d_model, step=2) + * (-math.log(10000.0) / d_model) + ) + self.register_buffer(name="div_term", tensor=div_term) + + def forward(self, t: paddle.Tensor) -> paddle.Tensor: + """ + Args: + t: Tensor, shape [batch_size] + """ + x = paddle.zeros(shape=(tuple(t.shape)[0], self.d_model)) + x[:, 0::2] = paddle.sin(x=t[:, None] * self.div_term[None]) + x[:, 1::2] = paddle.cos(x=t[:, None] * self.div_term[None]) + return self.dropout(x) diff --git a/ppmat/models/mattersim/m3gnet.py b/ppmat/models/mattersim/m3gnet.py new file mode 100644 index 00000000..b04b206e --- /dev/null +++ b/ppmat/models/mattersim/m3gnet.py @@ -0,0 +1,1386 @@ +import logging +import math +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +import numpy as np +import paddle +from ase import Atoms +from ase.units import GPa +from sklearn.gaussian_process import GaussianProcessRegressor +from sklearn.gaussian_process.kernels import DotProduct +from sklearn.gaussian_process.kernels import Hyperparameter +from sklearn.gaussian_process.kernels import Kernel + +from ppmat.utils.paddle_aux import dim2perm +from ppmat.utils.scatter import scatter +from ppmat.utils.scatter import scatter_mean + + +def solver(X, y, regressor: Optional[str] = "NormalizedGaussianProcess", **kwargs): + if regressor == "GaussianProcess": + return gp(X, y, **kwargs) + elif regressor == "NormalizedGaussianProcess": + return normalized_gp(X, y, **kwargs) + else: + raise NotImplementedError(f"{regressor} is not implemented") + + +def normalized_gp(X, y, **kwargs): + feature_rms = 1.0 / np.sqrt(np.average(X**2, axis=0)) + feature_rms = np.nan_to_num(feature_rms, 1) + y_mean = paddle.sum(x=y) / paddle.sum(x=X) + mean, std = base_gp( + X, + y - (paddle.sum(X, axis=1) * y_mean).reshape(y.shape), + NormalizedDotProduct, + {"diagonal_elements": feature_rms}, + **kwargs, + ) + return mean + y_mean, std + + +def gp(X, y, **kwargs): + return base_gp( + X, y, DotProduct, {"sigma_0": 0, "sigma_0_bounds": "fixed"}, **kwargs + ) + + +def base_gp( + X, + y, + kernel, + kernel_kwargs, + alpha: Optional[float] = 0.1, + max_iteration: int = 20, + stride: Optional[int] = 1, +): + if len(tuple(y.shape)) == 1: + y = y.reshape([-1, 1]) + if stride is not None: + X = X[::stride] + y = y[::stride] + not_fit = True + iteration = 0 + mean = None + std = None + while not_fit: + print(f"GP fitting iteration {iteration} {alpha}") + try: + _kernel = kernel(**kernel_kwargs) + gpr = GaussianProcessRegressor(kernel=_kernel, random_state=0, alpha=alpha) + gpr = gpr.fit(X, y) + vec = paddle.diag(x=paddle.ones(shape=tuple(X.shape)[1])) + mean, std = gpr.predict(vec, return_std=True) + mean = paddle.to_tensor( + data=mean, dtype=paddle.get_default_dtype() + ).reshape([-1]) + std = paddle.to_tensor(data=std, dtype=paddle.get_default_dtype()).reshape( + [-1] + ) + likelihood = gpr.log_marginal_likelihood() + res = paddle.sqrt( + x=paddle.square( + x=paddle.matmul(x=X, y=mean.reshape([-1, 1])) - y + ).mean() + ) + print( + f"""GP fitting: alpha {alpha}: + residue {res} + mean {mean} std {std} + log marginal likelihood {likelihood}""" + ) + not_fit = False + except Exception as e: + print(f"GP fitting failed for alpha={alpha} and {e.args}") + if alpha == 0 or alpha is None: + logging.info("try a non-zero alpha") + not_fit = False + raise ValueError( + f"""Please set the {alpha} to non-zero value. +The dataset energy is rank deficient to be solved with GP""" + ) + else: + alpha = alpha * 2 + iteration += 1 + logging.debug(f" increase alpha to {alpha}") + if iteration >= max_iteration or not_fit is False: + raise ValueError( + """Please set the per species shift and scale to zeros and ones. +The dataset energy is to diverge to be solved with GP""" + ) + return mean, std + + +class NormalizedDotProduct(Kernel): + """Dot-Product kernel. + .. math:: + k(x_i, x_j) = x_i \\cdot A \\cdot x_j + """ + + def __init__(self, diagonal_elements): + self.diagonal_elements = diagonal_elements + self.A = np.diag(diagonal_elements) + + def __call__(self, X, Y=None, eval_gradient=False): + """Return the kernel k(X, Y) and optionally its gradient. + Parameters + ---------- + X : ndarray of shape (n_samples_X, n_features) + Left argument of the returned kernel k(X, Y) + Y : ndarray of shape (n_samples_Y, n_features), default=None + Right argument of the returned kernel k(X, Y). If None, k(X, X) + if evaluated instead. + eval_gradient : bool, default=False + Determines whether the gradient with respect to the log of + the kernel hyperparameter is computed. + Only supported when Y is None. + Returns + ------- + K : ndarray of shape (n_samples_X, n_samples_Y) + Kernel k(X, Y) + K_gradient : ndarray of shape (n_samples_X, n_samples_X, n_dims), optional + The gradient of the kernel k(X, X) with respect to the log of the + hyperparameter of the kernel. Only returned when `eval_gradient` + is True. + """ + X = np.atleast_2d(X) + if Y is None: + K = X.dot(y=self.A).dot(y=X.T) + else: + if eval_gradient: + raise ValueError("Gradient can only be evaluated when Y is None.") + K = X.dot(y=self.A).dot(y=Y.T) + if eval_gradient: + return K, np.empty((tuple(X.shape)[0], tuple(X.shape)[0], 0)) + else: + return K + + def diag(self, X): + """Returns the diagonal of the kernel k(X, X). + The result of this method is identical to np.diag(self(X)); however, + it can be evaluated more efficiently since only the diagonal is + evaluated. + Parameters + ---------- + X : ndarray of shape (n_samples_X, n_features) + Left argument of the returned kernel k(X, Y). + Returns + ------- + K_diag : ndarray of shape (n_samples_X,) + Diagonal of kernel k(X, X). + """ + return np.einsum("ij,ij,jj->i", X, X, self.A) + + def __repr__(self): + return "" + + def is_stationary(self): + """Returns whether the kernel is stationary.""" + return False + + @property + def hyperparameter_diagonal_elements(self): + return Hyperparameter("diagonal_elements", "numeric", "fixed") + + +DATA_INDEX = { + "total_energy": 0, + "forces": 2, + "per_atom_energy": 1, + "per_species_energy": 0, +} + + +class AtomScaling(paddle.nn.Layer): + """ + Atomic extensive property rescaling module + """ + + def __init__( + self, + atoms: list[Atoms] = None, + total_energy: list[float] = None, + forces: list[np.ndarray] = None, + atomic_numbers: list[np.ndarray] = None, + num_atoms: list[float] = None, + max_z: int = 94, + scale_key: str = None, + shift_key: str = None, + init_scale: Union[paddle.Tensor, float] = None, + init_shift: Union[paddle.Tensor, float] = None, + trainable_scale: bool = False, + trainable_shift: bool = False, + verbose: bool = False, + **kwargs, + ): + """ + Args: + forces: a list of atomic forces (np.ndarray) in each graph + max_z: (int) maximum atomic number + - if scale_key or shift_key is specified, + max_z should be equal to the maximum atomic_number. + scale_key: valid options are: + - total_energy_std + - per_atom_energy_std + - per_species_energy_std + - forces_rms + - per_species_forces_rms (default) + shift_key: valid options are: + - total_energy_mean + - per_atom_energy_mean + - per_species_energy_mean : + default option is gaussian regression (NequIP) + - per_species_energy_mean_linear_reg : + an alternative choice is linear regression (M3GNet) + init_scale (paddle.Tensor or float) + init_shift (paddle.Tensor or float) + """ + super().__init__() + self.max_z = max_z + if scale_key or shift_key: + total_energy = paddle.to_tensor(data=np.array(total_energy)) + forces = ( + paddle.to_tensor(data=np.concatenate(forces, axis=0)) + if forces is not None + else None + ) + if atomic_numbers is None: + atomic_numbers = [atom.get_atomic_numbers() for atom in atoms] + atomic_numbers = ( + paddle.to_tensor(data=np.concatenate(atomic_numbers, axis=0)) + .squeeze(axis=-1) + .astype(dtype="int64") + ) + if num_atoms is None: + num_atoms = [atom.positions.shape[0] for atom in atoms] + num_atoms = paddle.to_tensor(data=np.array(num_atoms)) + per_atom_energy = total_energy / num_atoms + data_list = [total_energy, per_atom_energy, forces] + assert ( + tuple(num_atoms.shape)[0] == tuple(total_energy.shape)[0] + ), "num_atoms and total_energy should have the same size, " + f"but got {tuple(num_atoms.shape)[0]} and {tuple(total_energy.shape)[0]}" + if forces is not None: + assert ( + tuple(forces.shape)[0] == tuple(atomic_numbers.shape)[0] + ), "forces and atomic_numbers should have the same length, " + f"but got {tuple(forces.shape)[0]} and {tuple(atomic_numbers.shape)[0]}" + if ( + scale_key == "per_species_energy_std" + and shift_key == "per_species_energy_mean" + and init_shift is None + and init_scale is None + ): + init_shift, init_scale = self.get_gaussian_statistics( + atomic_numbers, num_atoms, total_energy + ) + else: + if shift_key and init_shift is None: + init_shift = self.get_statistics( + shift_key, max_z, data_list, atomic_numbers, num_atoms + ) + if scale_key and init_scale is None: + init_scale = self.get_statistics( + scale_key, max_z, data_list, atomic_numbers, num_atoms + ) + if init_scale is None: + init_scale = paddle.ones(shape=max_z + 1) + elif isinstance(init_scale, float): + init_scale = paddle.to_tensor(data=init_scale).tile(repeat_times=max_z + 1) + else: + assert tuple(init_scale.shape)[0] == max_z + 1 + if init_shift is None: + init_shift = paddle.zeros(shape=max_z + 1) + elif isinstance(init_shift, float): + init_shift = paddle.to_tensor(data=init_shift).tile(repeat_times=max_z + 1) + else: + assert tuple(init_shift.shape)[0] == max_z + 1 + init_shift = init_shift.astype(dtype="float32") + init_scale = init_scale.astype(dtype="float32") + if trainable_scale is True: + self.scale = paddle.base.framework.EagerParamBase.from_tensor( + tensor=init_scale + ) + else: + self.register_buffer(name="scale", tensor=init_scale) + if trainable_shift is True: + self.shift = paddle.base.framework.EagerParamBase.from_tensor( + tensor=init_shift + ) + else: + self.register_buffer(name="shift", tensor=init_shift) + if verbose is True: + print("Current scale: ", init_scale) + print("Current shift: ", init_shift) + + def transform( + self, atomic_energies: paddle.Tensor, atomic_numbers: paddle.Tensor + ) -> paddle.Tensor: + """ + Take the origin values from model and get the transformed values + """ + curr_shift = self.shift[atomic_numbers] + curr_scale = self.scale[atomic_numbers] + normalized_energies = curr_scale * atomic_energies + curr_shift + return normalized_energies + + def inverse_transform( + self, atomic_energies: paddle.Tensor, atomic_numbers: paddle.Tensor + ) -> paddle.Tensor: + """ + Take the transformed values and get the original values + """ + curr_shift = self.shift[atomic_numbers] + curr_scale = self.scale[atomic_numbers] + unnormalized_energies = (atomic_energies - curr_shift) / curr_scale + return unnormalized_energies + + def forward( + self, atomic_energies: paddle.Tensor, atomic_numbers: paddle.Tensor + ) -> paddle.Tensor: + """ + Atomic_energies and atomic_numbers should have the same size + """ + return self.transform(atomic_energies, atomic_numbers) + + def get_statistics( + self, key, max_z, data_list, atomic_numbers, num_atoms + ) -> paddle.Tensor: + """ + Valid key: + scale_key: valid options are: + - total_energy_mean + - per_atom_energy_mean + - per_species_energy_mean + - per_species_energy_mean_linear_reg : + an alternative choice is linear regression + shift_key: valid options are: + - total_energy_std + - per_atom_energy_std + - per_species_energy_std + - forces_rms + - per_species_forces_rms + """ + data = None + for data_key in DATA_INDEX: + if data_key in key: + data = data_list[DATA_INDEX[data_key]] + assert data is not None + statistics = None + if "mean" in key: + if "per_species" in key: + n_atoms = paddle.repeat_interleave( + paddle.arange(0, num_atoms.numel()), repeats=num_atoms + ) + if "linear_reg" in key: + features = bincount( + atomic_numbers, n_atoms, minlength=self.max_z + 1 + ).numpy() + data = data.numpy() + assert features.ndim == 2 + features = features[(features > 0).any(axis=1)] + statistics = np.linalg.pinv(features.T.dot(y=features)).dot( + features.T.dot(y=data) + ) + statistics = paddle.to_tensor(data=statistics) + else: + N = bincount(atomic_numbers, num_atoms, minlength=self.max_z + 1) + assert N.ndim == 2 + N = N[(N > 0).astype("bool").any(axis=1)] + N = N.astype(paddle.get_default_dtype()) + statistics, _ = solver( + N, data, regressor="NormalizedGaussianProcess" + ) + else: + statistics = paddle.mean(x=data).item() + elif "std" in key: + if "per_species" in key: + print( + "Warning: calculating per_species_energy_std for full periodic " + "table systems is risky, please use per_species_forces_rms instead." + ) + n_atoms = paddle.repeat_interleave( + paddle.arange(0, num_atoms.numel(0)), repeats=num_atoms + ) + N = bincount(atomic_numbers, n_atoms, minlength=self.max_z + 1) + assert N.ndim == 2 + N = N[(N > 0).astype("bool").any(axis=1)] + N = N.astype(paddle.get_default_dtype()) + _, statistics = solver(N, data, regressor="NormalizedGaussianProcess") + else: + statistics = paddle.std(x=data).item() + elif "rms" in key: + if "per_species" in key: + square = scatter_mean( + data.square(), atomic_numbers, dim=0, dim_size=max_z + 1 + ) + statistics = square.mean(axis=-1) + else: + statistics = paddle.sqrt(x=paddle.mean(x=data.square())).item() + if isinstance(statistics, paddle.Tensor) is not True: + statistics = paddle.to_tensor(data=statistics).tile(repeat_times=max_z + 1) + assert tuple(statistics.shape)[0] == max_z + 1 + return statistics + + def get_gaussian_statistics( + self, + atomic_numbers: paddle.Tensor, + num_atoms: paddle.Tensor, + total_energy: paddle.Tensor, + ): + """ + Get the gaussian process mean and variance + """ + n_atoms = paddle.repeat_interleave( + paddle.arange(0, num_atoms.numel()), repeats=num_atoms + ) + N = bincount(atomic_numbers, n_atoms, minlength=self.max_z + 1) + assert N.ndim == 2 + N = N[(N > 0).astype("bool").any(axis=1)] + N = N.astype(paddle.get_default_dtype()) + mean, std = solver(N, total_energy, regressor="NormalizedGaussianProcess") + assert tuple(mean.shape)[0] == self.max_z + 1 + assert tuple(std.shape)[0] == self.max_z + 1 + return mean, std + + +def bincount( + input: paddle.Tensor, batch: Optional[paddle.Tensor] = None, minlength: int = 0 +): + assert input.ndim == 1 + if batch is None: + return paddle.bincount(x=input, minlength=minlength) + else: + assert tuple(batch.shape) == tuple(input.shape) + length = input.max().item() + 1 + if minlength == 0: + minlength = length + if length > minlength: + raise ValueError( + f"minlength {minlength} too small for input with integers up to and " + f"including {length}" + ) + input_ = input + batch * minlength + num_batch = batch.max() + 1 + return paddle.bincount(x=input_, minlength=minlength * num_batch).reshape( + num_batch, minlength + ) + + +class LinearLayer(paddle.nn.Layer): + def __init__(self, in_dim, out_dim, bias=True): + super().__init__() + self.linear = paddle.nn.Linear( + in_features=in_dim, out_features=out_dim, bias_attr=bias + ) + + def forward(self, x): + return self.linear(x) + + +class SigmoidLayer(paddle.nn.Layer): + def __init__(self, in_dim, out_dim, bias=True): + super().__init__() + self.linear = paddle.nn.Linear( + in_features=in_dim, out_features=out_dim, bias_attr=bias + ) + self.sigmoid = paddle.nn.Sigmoid() + + def forward(self, x): + return self.sigmoid(self.linear(x)) + + +class SwishLayer(paddle.nn.Layer): + def __init__(self, in_dim, out_dim, bias=True): + super().__init__() + self.linear = paddle.nn.Linear( + in_features=in_dim, out_features=out_dim, bias_attr=bias + ) + self.sigmoid = paddle.nn.Sigmoid() + + def forward(self, x): + x = self.linear(x) + return x * self.sigmoid(x) + + +class GatedMLP(paddle.nn.Layer): + def __init__( + self, + in_dim: int, + out_dims: list, + activation: Union[list[Union[str, None]], str] = "swish", + use_bias: bool = True, + ): + super().__init__() + input_dim = in_dim + if isinstance(activation, str) or activation is None: + activation = [activation] * len(out_dims) + else: + assert len(activation) == len( + out_dims + ), "activation and out_dims must have the same length" + module_list_g = [] + for i in range(len(out_dims)): + if activation[i] == "swish": + module_list_g.append(SwishLayer(input_dim, out_dims[i], bias=use_bias)) + elif activation[i] == "sigmoid": + module_list_g.append( + SigmoidLayer(input_dim, out_dims[i], bias=use_bias) + ) + elif activation[i] is None: + module_list_g.append(LinearLayer(input_dim, out_dims[i], bias=use_bias)) + input_dim = out_dims[i] + module_list_sigma = [] + activation[-1] = "sigmoid" + input_dim = in_dim + for i in range(len(out_dims)): + if activation[i] == "swish": + module_list_sigma.append( + SwishLayer(input_dim, out_dims[i], bias=use_bias) + ) + elif activation[i] == "sigmoid": + module_list_sigma.append( + SigmoidLayer(input_dim, out_dims[i], bias=use_bias) + ) + elif activation[i] is None: + module_list_sigma.append( + LinearLayer(input_dim, out_dims[i], bias=use_bias) + ) + else: + raise NotImplementedError + input_dim = out_dims[i] + self.g = paddle.nn.Sequential(*module_list_g) + self.sigma = paddle.nn.Sequential(*module_list_sigma) + + def forward(self, x): + return self.g(x) * self.sigma(x) + + +class MLP(paddle.nn.Layer): + def __init__( + self, + in_dim: int, + out_dims: list, + activation: Union[list[Union[str, None]], str, None] = "swish", + use_bias: bool = True, + ): + super().__init__() + input_dim = in_dim + if isinstance(activation, str) or activation is None: + activation = [activation] * len(out_dims) + else: + assert len(activation) == len( + out_dims + ), "activation and out_dims must have the same length" + module_list = [] + for i in range(len(out_dims)): + if activation[i] == "swish": + module_list.append(SwishLayer(input_dim, out_dims[i], bias=use_bias)) + elif activation[i] == "sigmoid": + module_list.append(SigmoidLayer(input_dim, out_dims[i], bias=use_bias)) + elif activation[i] is None: + module_list.append(LinearLayer(input_dim, out_dims[i], bias=use_bias)) + else: + raise NotImplementedError + input_dim = out_dims[i] + self.mlp = paddle.nn.Sequential(*module_list) + + def forward(self, x): + return self.mlp(x) + + +def polynomial(r: paddle.Tensor, cutoff: float) -> paddle.Tensor: + """ + Polynomial cutoff function + Args: + r (tf.Tensor): radius distance tensor + cutoff (float): cutoff distance + Returns: polynomial cutoff functions + """ + ratio = paddle.divide(x=r, y=paddle.to_tensor(cutoff)) + result = ( + 1 + - 6 * paddle.pow(x=ratio, y=5) + + 15 * paddle.pow(x=ratio, y=4) + - 10 * paddle.pow(x=ratio, y=3) + ) + return paddle.clip(x=result, min=0.0) + + +class ThreeDInteraction(paddle.nn.Layer): + def __init__(self, max_n, max_l, cutoff, units, spherecal_dim, threebody_cutoff): + super().__init__() + self.atom_mlp = SigmoidLayer(in_dim=units, out_dim=spherecal_dim) + self.edge_gate_mlp = GatedMLP( + in_dim=spherecal_dim, out_dims=[units], activation="swish", use_bias=False + ) + self.cutoff = cutoff + self.threebody_cutoff = threebody_cutoff + + def forward( + self, + edge_attr, + three_basis, + atom_attr, + edge_index, + three_body_index, + edge_length, + num_edges, + num_triple_ij, + ): + atom_mask = ( + self.atom_mlp(atom_attr)[edge_index[0][three_body_index[:, 1]]] + * polynomial(edge_length[three_body_index[:, 0]], self.threebody_cutoff) + * polynomial(edge_length[three_body_index[:, 1]], self.threebody_cutoff) + ) + three_basis = three_basis * atom_mask + index_map = paddle.arange(end=paddle.sum(x=num_edges).item()).to( + edge_length.place + ) + index_map = paddle.repeat_interleave(x=index_map, repeats=num_triple_ij).to( + edge_length.place + ) + e_ij_tuda = scatter( + three_basis, + index_map, + dim=0, + reduce="sum", + dim_size=paddle.sum(x=num_edges).item(), + ) + edge_attr_prime = edge_attr + self.edge_gate_mlp(e_ij_tuda) + return edge_attr_prime + + +class AtomLayer(paddle.nn.Layer): + """ + v_i'=v_i+sum(phi(v+i,v_j,e_ij',u)W*e_ij^0) + """ + + def __init__(self, atom_attr_dim, edge_attr_dim, spherecal_dim): + super().__init__() + self.gated_mlp = GatedMLP( + in_dim=2 * atom_attr_dim + spherecal_dim, out_dims=[128, 64, atom_attr_dim] + ) + self.edge_layer = LinearLayer(in_dim=edge_attr_dim, out_dim=1) + + def forward(self, atom_attr, edge_attr, edge_index, edge_attr_prime, num_atoms): + feat = paddle.concat( + x=[atom_attr[edge_index[0]], atom_attr[edge_index[1]], edge_attr_prime], + axis=1, + ) + atom_attr_prime = self.gated_mlp(feat) * self.edge_layer(edge_attr) + atom_attr_prime = scatter( + atom_attr_prime, + edge_index[1], + dim=0, + dim_size=paddle.sum(x=num_atoms).item(), + ) + return atom_attr_prime + atom_attr + + +class EdgeLayer(paddle.nn.Layer): + """e_ij'=e_ij+phi(v_i,v_j,e_ij,u)W*e_ij^0""" + + def init(self, atom_attr_dim, edge_attr_dim, spherecal_dim): + super().__init__() + self.gated_mlp = GatedMLP( + in_dim=2 * atom_attr_dim + spherecal_dim, out_dims=[128, 64, edge_attr_dim] + ) + self.edge_layer = LinearLayer(in_dim=edge_attr_dim, out_dim=1) + + def forward(self, atom_attr, edge_attr, edge_index, edge_attr_prime): + feat = paddle.concat( + x=[atom_attr[edge_index[0]], atom_attr[edge_index[1]], edge_attr_prime], + axis=1, + ) + edge_attr_prime = self.gated_mlp(feat) * self.edge_layer(edge_attr) + return edge_attr_prime + edge_attr + + +class MainBlock(paddle.nn.Layer): + """ + MainBlock for Message Passing in M3GNet + """ + + def __init__(self, max_n, max_l, cutoff, units, spherical_dim, threebody_cutoff): + super().__init__() + self.gated_mlp_atom = GatedMLP( + in_dim=2 * units + units, out_dims=[units, units], activation="swish" + ) + self.edge_layer_atom = SwishLayer( + in_dim=spherical_dim, out_dim=units, bias=False + ) + self.gated_mlp_edge = GatedMLP( + in_dim=2 * units + units, out_dims=[units, units], activation="swish" + ) + self.edge_layer_edge = LinearLayer( + in_dim=spherical_dim, out_dim=units, bias=False + ) + self.three_body = ThreeDInteraction( + max_n, max_l, cutoff, units, max_n * max_l, threebody_cutoff + ) + + def forward( + self, + atom_attr, + edge_attr, + edge_attr_zero, + edge_index, + three_basis, + three_body_index, + edge_length, + num_edges, + num_triple_ij, + num_atoms, + ): + # threebody interaction + edge_attr = self.three_body( + edge_attr, + three_basis, + atom_attr, + edge_index, + three_body_index, + edge_length, + num_edges, + num_triple_ij.view(-1), + ) + # update bond feature + feat = paddle.concat( + x=[atom_attr[edge_index[0]], atom_attr[edge_index[1]], edge_attr], axis=1 + ) + edge_attr = edge_attr + self.gated_mlp_edge(feat) * self.edge_layer_edge( + edge_attr_zero + ) + + # update atom feature + feat = paddle.concat( + x=[atom_attr[edge_index[0]], atom_attr[edge_index[1]], edge_attr], axis=1 + ) + atom_attr_prime = self.gated_mlp_atom(feat) * self.edge_layer_atom( + edge_attr_zero + ) + atom_attr = atom_attr + scatter( + atom_attr_prime, + edge_index[0], + dim=0, + dim_size=paddle.sum(x=num_atoms).item(), + ) + + return atom_attr, edge_attr + + +class BesselBasis(paddle.nn.Layer): + def __init__(self, r_max, num_basis=8, trainable=True): + """Radial Bessel Basis, as proposed in + DimeNet: https://arxiv.org/abs/2003.03123 + + Parameters + ---------- + r_max : float + Cutoff radius + + num_basis : int + Number of Bessel Basis functions + + trainable : bool + Train the :math:`n \\pi` part or not. + """ + super(BesselBasis, self).__init__() + self.trainable = trainable + self.num_basis = num_basis + self.r_max = float(r_max) + self.prefactor = 2.0 / self.r_max + bessel_weights = ( + paddle.linspace(start=1.0, stop=num_basis, num=num_basis) * math.pi + ) + if self.trainable: + self.bessel_weights = paddle.base.framework.EagerParamBase.from_tensor( + tensor=bessel_weights + ) + else: + self.register_buffer(name="bessel_weights", tensor=bessel_weights) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """ + Evaluate Bessel Basis for input x. + + Parameters + ---------- + x : paddle.Tensor + Input + """ + numerator = paddle.sin( + x=self.bessel_weights * x.unsqueeze(axis=-1) / self.r_max + ) + return self.prefactor * (numerator / x.unsqueeze(axis=-1)) + + +class SmoothBesselBasis(paddle.nn.Layer): + def __init__(self, r_max, max_n=10): + """Smooth Radial Bessel Basis, as proposed + in DimeNet: https://arxiv.org/abs/2003.03123 + This is an orthogonal basis with first + and second derivative at the cutoff + equals to zero. The function was derived from + the order 0 spherical Bessel function, + and was expanded by the different zero roots + Ref: + https://arxiv.org/pdf/1907.02374.pdf + Args: + r_max: paddle.Tensor distance tensor + max_n: int, max number of basis, expanded by the zero roots + Returns: expanded spherical harmonics with + derivatives smooth at boundary + Parameters + ---------- + """ + super(SmoothBesselBasis, self).__init__() + self.max_n = max_n + n = paddle.arange(start=0, end=max_n).astype(dtype="float32")[None, :] + PI = 3.1415926535897 + SQRT2 = 1.41421356237 + fnr = ( + (-1) ** n + * SQRT2 + * PI + / r_max**1.5 + * (n + 1) + * (n + 2) + / paddle.sqrt(x=2 * n**2 + 6 * n + 5) + ) + en = n**2 * (n + 2) ** 2 / (4 * (n + 1) ** 4 + 1) + dn = [paddle.to_tensor(data=1.0).astype(dtype="float32")] + for i in range(1, max_n): + dn.append(1 - en[0, i] / dn[-1]) + dn = paddle.stack(x=dn) + self.register_buffer(name="dn", tensor=dn) + self.register_buffer(name="en", tensor=en) + self.register_buffer(name="fnr_weights", tensor=fnr) + self.register_buffer( + name="n_1_pi_cutoff", + tensor=( + (paddle.arange(start=0, end=max_n).astype(dtype="float32") + 1) + * PI + / r_max + ).reshape(1, -1), + ) + self.register_buffer( + name="n_2_pi_cutoff", + tensor=( + (paddle.arange(start=0, end=max_n).astype(dtype="float32") + 2) + * PI + / r_max + ).reshape(1, -1), + ) + self.register_buffer(name="r_max", tensor=paddle.to_tensor(data=r_max)) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """ + Evaluate Smooth Bessel Basis for input x. + + Parameters + ---------- + x : paddle.Tensor + Input + """ + x_1 = x.unsqueeze(axis=-1) * self.n_1_pi_cutoff + x_2 = x.unsqueeze(axis=-1) * self.n_2_pi_cutoff + fnr = self.fnr_weights * (paddle.sin(x=x_1) / x_1 + paddle.sin(x=x_2) / x_2) + gn = [fnr[:, 0]] + for i in range(1, self.max_n): + gn.append( + 1 + / paddle.sqrt(x=self.dn[i]) + * (fnr[:, i] + paddle.sqrt(x=self.en[0, i] / self.dn[i - 1]) * gn[-1]) + ) + return paddle.transpose( + x=paddle.stack(x=gn), perm=dim2perm(paddle.stack(x=gn).ndim, 1, 0) + ) + + +def _spherical_harmonics(lmax: int, x: paddle.Tensor) -> paddle.Tensor: + sh_0_0 = paddle.ones_like(x=x) * 0.5 * math.sqrt(1.0 / math.pi) + if lmax == 0: + return paddle.stack(x=[sh_0_0], axis=-1) + sh_1_1 = math.sqrt(3.0 / (4.0 * math.pi)) * x + if lmax == 1: + return paddle.stack(x=[sh_0_0, sh_1_1], axis=-1) + sh_2_2 = math.sqrt(5.0 / (16.0 * math.pi)) * (3.0 * x**2 - 1.0) + if lmax == 2: + return paddle.stack(x=[sh_0_0, sh_1_1, sh_2_2], axis=-1) + sh_3_3 = math.sqrt(7.0 / (16.0 * math.pi)) * x * (5.0 * x**2 - 3.0) + if lmax == 3: + return paddle.stack(x=[sh_0_0, sh_1_1, sh_2_2, sh_3_3], axis=-1) + raise ValueError("lmax must be less than 8") + + +class SphericalBasisLayer(paddle.nn.Layer): + def __init__(self, max_n, max_l, cutoff): + super(SphericalBasisLayer, self).__init__() + assert max_l <= 4, "lmax must be less than 5" + assert max_n <= 4, "max_n must be less than 5" + self.max_n = max_n + self.max_l = max_l + self.cutoff = cutoff + self.register_buffer( + name="factor", + tensor=paddle.sqrt(x=paddle.to_tensor(data=2.0 / self.cutoff**3)), + ) + self.coef = paddle.zeros(shape=[4, 9, 4]) + self.coef[0, 0, :] = paddle.to_tensor( + data=[ + 3.14159274101257, + 6.28318548202515, + 9.42477798461914, + 12.5663709640503, + ] + ) + self.coef[1, :4, :] = paddle.to_tensor( + data=[ + [ + -1.02446483277785, + -1.00834335996107, + -1.00419641763893, + -1.00252381898662, + ], + [4.49340963363647, 7.7252516746521, 10.9041213989258, 14.0661935806274], + [ + 0.22799275301076, + 0.130525632358311, + 0.092093290316619, + 0.0712718627992818, + ], + [4.49340963363647, 7.7252516746521, 10.9041213989258, 14.0661935806274], + ] + ) + self.coef[2, :6, :] = paddle.to_tensor( + data=[ + [ + -1.04807944170731, + -1.01861796359391, + -1.01002272174988, + -1.00628955560036, + ], + [5.76345920562744, 9.09501171112061, 12.322940826416, 15.5146026611328], + [ + 0.545547077361439, + 0.335992298618515, + 0.245888396928293, + 0.194582402961821, + ], + [5.76345920562744, 9.09501171112061, 12.322940826416, 15.5146026611328], + [ + 0.0946561878721665, + 0.0369424811413594, + 0.0199537107571916, + 0.0125418876146463, + ], + [5.76345920562744, 9.09501171112061, 12.322940826416, 15.5146026611328], + ] + ) + self.coef[3, :8, :] = paddle.to_tensor( + data=[ + [1.06942831392075, 1.0292173312802, 1.01650804843248, 1.01069656069999], + [6.9879322052002, 10.4171180725098, 13.6980228424072, 16.9236221313477], + [ + 0.918235852195231, + 0.592803493701152, + 0.445250264272671, + 0.358326327374518, + ], + [6.9879322052002, 10.4171180725098, 13.6980228424072, 16.9236221313477], + [ + 0.328507713452024, + 0.142266673367543, + 0.0812617757677838, + 0.0529328657590962, + ], + [6.9879322052002, 10.4171180725098, 13.6980228424072, 16.9236221313477], + [ + 0.0470107184508114, + 0.0136570088173405, + 0.0059323726279831, + 0.00312775039221944, + ], + [6.9879322052002, 10.4171180725098, 13.6980228424072, 16.9236221313477], + ] + ) + + def forward(self, r, theta_val): + r = r / self.cutoff + rbfs = [] + for j in range(self.max_l): + rbfs.append(paddle.sin(x=self.coef[0, 0, j] * r) / r) + if self.max_n > 1: + for j in range(self.max_l): + rbfs.append( + ( + self.coef[1, 0, j] * r * paddle.cos(x=self.coef[1, 1, j] * r) + + self.coef[1, 2, j] * paddle.sin(x=self.coef[1, 3, j] * r) + ) + / r**2 + ) + if self.max_n > 2: + for j in range(self.max_l): + rbfs.append( + ( + self.coef[2, 0, j] + * r**2 + * paddle.sin(x=self.coef[2, 1, j] * r) + - self.coef[2, 2, j] + * r + * paddle.cos(x=self.coef[2, 3, j] * r) + + self.coef[2, 4, j] * paddle.sin(x=self.coef[2, 5, j] * r) + ) + / r**3 + ) + if self.max_n > 3: + for j in range(self.max_l): + rbfs.append( + ( + self.coef[3, 0, j] + * r**3 + * paddle.cos(x=self.coef[3, 1, j] * r) + - self.coef[3, 2, j] + * r**2 + * paddle.sin(x=self.coef[3, 3, j] * r) + - self.coef[3, 4, j] + * r + * paddle.cos(x=self.coef[3, 5, j] * r) + + self.coef[3, 6, j] + * paddle.sin(x=self.coef[3, 7, j] * r) + ) + / r**4 + ) + rbfs = paddle.stack(x=rbfs, axis=-1) + rbfs = rbfs * self.factor + cbfs = _spherical_harmonics(self.max_l - 1, paddle.cos(x=theta_val)) + cbfs = cbfs.repeat_interleave(repeats=self.max_n, axis=1) + return rbfs * cbfs + + +class M3GNet(paddle.nn.Layer): + """ + M3GNet + """ + + def __init__( + self, + num_blocks: int = 4, + units: int = 128, + max_l: int = 4, + max_n: int = 4, + cutoff: float = 5.0, + max_z: int = 94, + threebody_cutoff: float = 4.0, + energy_key: str = "energy", + force_key: str = "force", + stress_key: str = "stress", + loss_type: str = "smooth_l1_loss", + huber_loss_delta: float = 0.1, + loss_weights_dict: dict | None = None, + **kwargs, + ): + super().__init__() + self.energy_key = energy_key + self.force_key = force_key + self.stress_key = stress_key + + self.rbf = SmoothBesselBasis(r_max=cutoff, max_n=max_n) + self.sbf = SphericalBasisLayer(max_n=max_n, max_l=max_l, cutoff=cutoff) + self.edge_encoder = MLP( + in_dim=max_n, out_dims=[units], activation="swish", use_bias=False + ) + module_list = [ + MainBlock(max_n, max_l, cutoff, units, max_n, threebody_cutoff) + for i in range(num_blocks) + ] + self.graph_conv = paddle.nn.LayerList(sublayers=module_list) + self.final = GatedMLP( + in_dim=units, + out_dims=[units, units, 1], + activation=["swish", "swish", None], + ) + self.apply(self.init_weights) + self.atom_embedding = MLP( + in_dim=max_z + 1, out_dims=[units], activation=None, use_bias=False + ) + self.atom_embedding.apply(self.init_weights_uniform) + self.normalizer = AtomScaling(verbose=False, max_z=max_z) + self.max_z = max_z + self.model_args = { + "num_blocks": num_blocks, + "units": units, + "max_l": max_l, + "max_n": max_n, + "cutoff": cutoff, + "max_z": max_z, + "threebody_cutoff": threebody_cutoff, + } + + self.loss_type = loss_type + + self.loss_weights_dict = loss_weights_dict + if loss_type == "mse_loss": + self.loss_fn = paddle.nn.MSELoss() + elif loss_type == "smooth_l1_loss" or loss_type == "huber_loss": + self.loss_fn = paddle.nn.SmoothL1Loss(delta=huber_loss_delta) + self.huber_loss_delta = huber_loss_delta + elif loss_type == "l1_loss": + self.loss_fn = paddle.nn.L1Loss() + else: + raise ValueError(f"Unknown loss type {loss_type}.") + + def _forward(self, batch_data: Dict[str, paddle.Tensor]) -> paddle.Tensor: + # The data in data['graph'] is numpy.ndarray, convert it to paddle.Tensor + batch_data["graph"] = batch_data["graph"].tensor() + graph = batch_data["graph"] + + pos = graph.node_feat["cart_coords"] + cell = graph.node_feat["lattice"] + pbc_offsets = graph.edge_feat["pbc_offset"].astype(dtype="float32") + atom_attr = ( + graph.node_feat["atom_types"].astype(dtype="float32").reshape([-1, 1]) + ) + edge_index = graph.edges.astype(dtype="int64").transpose([1, 0]).contiguous() + three_body_indices = graph.edge_feat["three_body_indices"].astype(dtype="int64") + num_three_body = graph.edge_feat["num_three_body"] + + num_bonds = graph.edge_feat["num_edges"] + num_triple_ij = graph.edge_feat["num_triple_ij"] + num_atoms = graph.node_feat["num_atoms"] + num_graphs = graph.num_graph + batch = graph.graph_node_id + + if self.force_key is not None: + pos.stop_gradient = False + + if self.stress_key is not None: + strain = paddle.zeros_like(x=input["cell"]) + volume = paddle.linalg.det(x=input["cell"]) + strain.stop_gradient = False + input["cell"] = paddle.matmul( + x=input["cell"], y=paddle.eye(num_rows=3)[None, ...] + strain + ) + strain_augment = paddle.repeat_interleave( + x=strain, repeats=input["num_atoms"], axis=0 + ) + pos = paddle.einsum( + "bi, bij -> bj", + pos, + paddle.eye(num_rows=3)[None, ...] + strain_augment, + ) + volume = paddle.linalg.det(x=input["cell"]) + + # -------------------------------------------------------------# + cumsum = paddle.cumsum(x=num_bonds, axis=0) - num_bonds + index_bias = paddle.repeat_interleave( + x=cumsum, repeats=num_three_body, axis=0 + ).unsqueeze(axis=-1) + three_body_indices = three_body_indices + index_bias + + # === Refer to the implementation of M3GNet, === + # === we should re-compute the following attributes === + # edge_length, edge_vector(optional), triple_edge_length, theta_jik + atoms_batch = paddle.repeat_interleave( + paddle.arange(0, num_atoms.numel()), repeats=num_atoms + ) + edge_batch = atoms_batch[edge_index[0]] + edge_vector = pos[edge_index[0]] - ( + pos[edge_index[1]] + + paddle.einsum("bi, bij->bj", pbc_offsets, cell[edge_batch]) + ) + edge_length = paddle.linalg.norm(x=edge_vector, axis=1) + vij = edge_vector[three_body_indices[:, 0].clone()] + vik = edge_vector[three_body_indices[:, 1].clone()] + rij = edge_length[three_body_indices[:, 0].clone()] + rik = edge_length[three_body_indices[:, 1].clone()] + cos_jik = paddle.sum(x=vij * vik, axis=1) / (rij * rik) + # eps = 1e-7 avoid nan in paddle.acos function + cos_jik = paddle.clip(x=cos_jik, min=-1.0 + 1e-07, max=1.0 - 1e-07) + triple_edge_length = rik.view(-1) + edge_length = edge_length.unsqueeze(axis=-1) + atomic_numbers = atom_attr.squeeze(axis=1).astype(dtype="int64") + + # featurize + atom_attr = self.atom_embedding(self.one_hot_atoms(atomic_numbers)) + edge_attr = self.rbf(edge_length.view(-1)) + edge_attr_zero = edge_attr # e_ij^0 + edge_attr = self.edge_encoder(edge_attr) + three_basis = self.sbf(triple_edge_length, paddle.acos(x=cos_jik)) + + # Main Loop + for idx, conv in enumerate(self.graph_conv): + atom_attr, edge_attr = conv( + atom_attr, + edge_attr, + edge_attr_zero, + edge_index, + three_basis, + three_body_indices, + edge_length, + num_bonds, + num_triple_ij, + num_atoms, + ) + energies_i = self.final(atom_attr).view(-1) # [batch_size*num_atoms] + energies_i = self.normalizer(energies_i, atomic_numbers) + energies = scatter(energies_i, batch, dim=0, dim_size=num_graphs) + energies = energies.unsqueeze(-1) + + forces = None + stresses = None + if self.force_key is not None and self.stress_key is None: + + grad_outputs: List[Optional[paddle.Tensor]] = [paddle.ones_like(x=energies)] + grad = paddle.grad( + outputs=[energies], + inputs=[pos], + grad_outputs=grad_outputs, + create_graph=self.training, + ) + + # Dump out gradient for forces + force_grad = grad[0] + if force_grad is not None: + forces = paddle.neg(x=force_grad) + if self.force_key is not None and self.stress_key is not None: + + grad_outputs: List[Optional[paddle.Tensor]] = [paddle.ones_like(x=energies)] + + grad = paddle.grad( + outputs=[energies], + inputs=[pos, strain], + grad_outputs=grad_outputs, + create_graph=self.training, + retain_graph=True, + ) + + # Dump out gradient for forces and stresses + force_grad = grad[0] + stress_grad = grad[1] + + if force_grad is not None: + forces = paddle.neg(x=force_grad) + + if stress_grad is not None: + stresses = ( + 1 / volume[:, None, None] * stress_grad / GPa + ) # 1/GPa = 160.21766208 + energies = energies / graph.node_feat["num_atoms"].unsqueeze(-1).astype( + dtype="float32" + ) + return energies, forces, stresses + + def forward(self, data, return_loss=True, return_prediction=True): + assert ( + return_loss or return_prediction + ), "At least one of return_loss or return_prediction must be True." + ( + energy, + force, + stress, + ) = self._forward(data) + + pred_dict = {} + if self.energy_key is not None: + pred_dict[self.energy_key] = energy + if self.force_key is not None: + pred_dict[self.force_key] = force + if self.stress_key is not None: + pred_dict[self.stress_key] = stress + + loss_dict = {} + if return_loss: + loss = 0.0 + for property_name in pred_dict.keys(): + label = data[property_name] + pred = pred_dict[property_name] + valid_value_indices = ~paddle.isnan(label) + valid_label = label[valid_value_indices] + valid_pred = pred[valid_value_indices] + + if valid_label.numel() > 0: + loss_property = self.loss_fn( + input=valid_pred, + label=valid_label, + ) + + loss_dict[property_name] = loss_property + loss += loss_property * self.loss_weights_dict[property_name] + loss_dict["loss"] = loss + + prediction = {} + if return_prediction: + prediction = pred_dict + + return {"loss_dict": loss_dict, "pred_dict": prediction} + + def _prediction_to_numpy(self, prediction): + for key in prediction.keys(): + if isinstance(prediction[key], list): + prediction[key] = [ + prediction[key][i].numpy() for i in range(len(prediction[key])) + ] + else: + prediction[key] = prediction[key].numpy() + if key == "stress" and len(prediction["stress"].shape) == 3: + prediction[key] = prediction[key][0] + if key == "magmom" and isinstance(prediction[key], list): + prediction[key] = prediction[key][0] + if key == "energy_pre_atom" and isinstance(prediction[key], np.ndarray): + prediction[key] = prediction[key][0] + return prediction + + def predict(self, graphs): + if isinstance(graphs, list): + results = [] + for graph in graphs: + result = self.forward( + { + "graph": graph, + }, + return_loss=False, + return_prediction=True, + ) + prediction = result["pred_dict"] + prediction = self._prediction_to_numpy(prediction) + results.append(prediction) + return results + + else: + data = { + "graph": graphs, + } + result = self.forward( + data, + return_loss=False, + return_prediction=True, + ) + prediction = result["pred_dict"] + prediction = self._prediction_to_numpy(prediction) + return prediction + + def init_weights(self, m): + if isinstance(m, paddle.nn.Linear): + init_XavierUniform = paddle.nn.initializer.XavierUniform() + init_XavierUniform(m.weight) + + def init_weights_uniform(self, m): + if isinstance(m, paddle.nn.Linear): + init_Uniform = paddle.nn.initializer.Uniform(low=-0.05, high=0.05) + init_Uniform(m.weight) + + def one_hot_atoms(self, species): + return paddle.nn.functional.one_hot( + num_classes=self.max_z + 1, x=species + ).astype(dtype="float32") + + def set_normalizer(self, normalizer: AtomScaling): + self.normalizer = normalizer + + def get_model_args(self): + return self.model_args diff --git a/ppmat/models/mattersim/m3gnet_graph_converter.py b/ppmat/models/mattersim/m3gnet_graph_converter.py new file mode 100644 index 00000000..fe9d33e6 --- /dev/null +++ b/ppmat/models/mattersim/m3gnet_graph_converter.py @@ -0,0 +1,320 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import annotations + +import warnings +from typing import Optional +from typing import Tuple + +import ase +import numpy as np +import pgl +from ase import Atoms +from p_tqdm import p_map +from pymatgen.core.structure import Structure +from pymatgen.optimization.neighbors import find_points_in_spheres + +from .threebody_indices import compute_threebody as _compute_threebody + +warnings.filterwarnings("once", category=UserWarning) +""" +Supported Properties: + - "num_nodes"(set by default) ## int + - "num_edges"(set by default) ## int + - "num_atoms" ## int + - "num_bonds" ## int + - "atom_attr" ## tensor [num_atoms,atom_attr_dim=1] + - "atom_pos" ## tensor [num_atoms,3] + - "edge_length" ## tensor [num_edges,1] + - "edge_vector" ## tensor [num_edges,3] + - "edge_index" ## tensor [2,num_edges] + - "three_body_indices" ## tensor [num_three_body,2] + - "num_three_body" ## int + - "num_triple_ij" ## tensor [num_edges,1] + - "num_triple_i" ## tensor [num_atoms,1] + - "num_triple_s" ## tensor [1,1] + - "theta_jik" ## tensor [num_three_body,1] + - "triple_edge_length" ## tensor [num_three_body,1] + - "phi" ## tensor [num_three_body,1] + - "energy" ## float + - "forces" ## tensor [num_atoms,3] + - "stress" ## tensor [3,3] +""" +""" +Computing various graph based operations (M3GNet) +""" + + +def compute_threebody_indices( + bond_atom_indices: np.array, + bond_length: np.array, + n_atoms: int, + atomic_number: np.array, + threebody_cutoff: Optional[float] = None, +): + """ + Given a graph without threebody indices, add the threebody indices + according to a threebody cutoff radius + Args: + bond_atom_indices: np.array, [n_atoms, 2] + bond_length: np.array, [n_atoms] + n_atoms: int + atomic_number: np.array, [n_atoms] + threebody_cutoff: float, threebody cutoff radius + + Returns: + triple_bond_indices, n_triple_ij, n_triple_i, n_triple_s + + """ + n_atoms = np.array(n_atoms).reshape(1) + atomic_number = atomic_number.reshape(-1, 1) + n_bond = tuple(bond_atom_indices.shape)[0] + if n_bond > 0 and threebody_cutoff is not None: + valid_three_body = bond_length <= threebody_cutoff + ij_reverse_map = np.where(valid_three_body)[0] + original_index = np.arange(n_bond)[valid_three_body] + bond_atom_indices = bond_atom_indices[valid_three_body, :] + else: + ij_reverse_map = None + original_index = np.arange(n_bond) + if tuple(bond_atom_indices.shape)[0] > 0: + bond_indices, n_triple_ij, n_triple_i, n_triple_s = _compute_threebody( + np.ascontiguousarray(bond_atom_indices, dtype="int32"), + np.array(n_atoms, dtype="int32"), + ) + if ij_reverse_map is not None: + n_triple_ij_ = np.zeros(shape=(n_bond,), dtype="int32") + n_triple_ij_[ij_reverse_map] = n_triple_ij + n_triple_ij = n_triple_ij_ + bond_indices = original_index[bond_indices] + bond_indices = np.array(bond_indices, dtype="int32") + else: + bond_indices = np.reshape(np.array([], dtype="int32"), [-1, 2]) + if n_bond == 0: + n_triple_ij = np.array([], dtype="int32") + else: + n_triple_ij = np.array([0] * n_bond, dtype="int32") + n_triple_i = np.array([0] * len(atomic_number), dtype="int32") + n_triple_s = np.array([0], dtype="int32") + return bond_indices, n_triple_ij, n_triple_i, n_triple_s + + +def get_fixed_radius_bonding( + structure: ase.Atoms, + cutoff: float = 5.0, + numerical_tol: float = 1e-08, +) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + """ + Get graph representations from structure within cutoff + Args: + structure (pymatgen Structure or molecule) + cutoff (float): cutoff radius + numerical_tol (float): numerical tolerance + + Returns: + center_indices, neighbor_indices, images, distances + """ + pbc_ = np.array(structure.pbc, dtype=int) + lattice_matrix = np.ascontiguousarray(structure.cell[:], dtype=float) + cart_coords = np.ascontiguousarray(np.array(structure.positions), dtype=float) + r = float(cutoff) + center_indices, neighbor_indices, images, distances = find_points_in_spheres( + cart_coords, + cart_coords, + r=r, + pbc=pbc_, + lattice=lattice_matrix, + tol=numerical_tol, + ) + center_indices = center_indices.astype(np.int64) + neighbor_indices = neighbor_indices.astype(np.int64) + images = images.astype(np.int64) + distances = distances.astype(float) + exclude_self = (center_indices != neighbor_indices) | (distances > numerical_tol) + return ( + center_indices[exclude_self], + neighbor_indices[exclude_self], + images[exclude_self], + distances[exclude_self], + ) + + +class M3GNetGraphConvertor: + """ + Convert ase.Atoms to Graph + """ + + def __init__( + self, + cutoff: float = 5.0, + has_threebody: bool = True, + threebody_cutoff: float = 4.0, + num_cpus: Optional[int] = None, + ): + self.cutoff = cutoff + self.threebody_cutoff = threebody_cutoff + self.has_threebody = has_threebody + self.num_cpus = num_cpus + + def __call__(self, structure: Structure): + if isinstance(structure, Structure): + graph = self.get_graph_by_m3gnet_graph(structure) + elif isinstance(structure, list): + graph = p_map( + self.get_graph_by_m3gnet_graph, + structure, + num_cpus=self.num_cpus, + ) + # the following code is equivalent to the above line, it is slower, + # but easier to debug. + # graph = [ + # self.get_graph_by_m3gnet_graph(struc) + # for struc in structure + # ] + else: + raise TypeError("The input must be a pymatgen.Structure or a list of them.") + return graph + + def get_graph_by_m3gnet_graph(self, structure: Structure): + atoms = structure.to_ase_atoms() + if isinstance(atoms, Atoms): + pbc_ = np.array(atoms.pbc, dtype=int) + if np.all(pbc_ < 0.01): + min_x = np.min(atoms.positions[:, 0]) + min_y = np.min(atoms.positions[:, 1]) + min_z = np.min(atoms.positions[:, 2]) + max_x = np.max(atoms.positions[:, 0]) + max_y = np.max(atoms.positions[:, 1]) + max_z = np.max(atoms.positions[:, 2]) + x_len = max_x - min_x + max(self.cutoff, self.threebody_cutoff) * 5 + y_len = max_y - min_y + max(self.cutoff, self.threebody_cutoff) * 5 + z_len = max_z - min_z + max(self.cutoff, self.threebody_cutoff) * 5 + max_len = max(x_len, y_len, z_len) + x_len = y_len = z_len = max_len + lattice_matrix = np.eye(3) * max_len + pbc_ = np.array([1, 1, 1], dtype=int) + warnings.warn( + "No PBC detected, using a large supercell with size " + f"{x_len}x{y_len}x{z_len} Angstrom**3", + UserWarning, + ) + atoms.set_cell(lattice_matrix) + atoms.set_pbc(pbc_) + elif np.all(abs(atoms.cell) < 1e-05): + raise ValueError("Cell vectors are too small") + else: + raise ValueError("structure type not supported") + scaled_pos = atoms.get_scaled_positions() + scaled_pos = np.mod(scaled_pos, 1) + atoms.set_scaled_positions(scaled_pos) + + ( + sent_index, + receive_index, + shift_vectors, + distances, + ) = get_fixed_radius_bonding(atoms, self.cutoff) + edge_indices = [(u, v) for u, v in zip(sent_index, receive_index)] + to_jimages = np.array(shift_vectors, dtype="float32") + + edge_features = {} + if self.has_threebody: + ( + triple_bond_index, + n_triple_ij, + n_triple_i, + n_triple_s, + ) = compute_threebody_indices( + bond_atom_indices=np.asarray(edge_indices), + bond_length=distances, + n_atoms=atoms.positions.shape[0], + atomic_number=atoms.get_atomic_numbers(), + threebody_cutoff=self.threebody_cutoff, + ) + + edge_features["num_three_body"] = np.array([triple_bond_index.shape[0]]) + edge_features["three_body_indices"] = triple_bond_index.astype("int64") + edge_features["num_triple_ij"] = n_triple_ij.astype("int64").reshape(-1, 1) + + graph = self.build_pgl_graph( + structure, edge_indices, to_jimages, edge_features=edge_features + ) + + return graph + + def build_pgl_graph( + self, + structure: Structure, + edge_indices, + to_jimages, + node_features=None, + edge_features=None, + ): + assert node_features is None or isinstance(node_features, dict) + assert edge_features is None or isinstance(edge_features, dict) + + # get atom types + atom_types = np.array([site.specie.Z for site in structure]) + + # get lattice parameters and matrix + lattice_parameters = structure.lattice.parameters + lengths = np.array(lattice_parameters[:3], dtype="float32").reshape(1, 3) + angles = np.array(lattice_parameters[3:], dtype="float32").reshape(1, 3) + lattice = structure.lattice.matrix.astype("float32") + + # convert to numpy array + edge_indices = np.array(edge_indices) + if to_jimages is not None: + to_jimages = np.array(to_jimages) + num_atoms = tuple(atom_types.shape)[0] + + # After multiple graph batch operations by the dataloader, + # graph.num_nodes remains an integer, which is the sum of the number of + # nodes in all graphs + graph = pgl.Graph(edge_indices, num_nodes=num_atoms) + # node features: frac_coords, cart_coords, atom_types + graph.node_feat["frac_coords"] = structure.frac_coords.astype("float32") + graph.node_feat["cart_coords"] = structure.cart_coords.astype("float32") + graph.node_feat["atom_types"] = atom_types + + # graph features: lengths, angles, lattice, num_atoms + # Due to the inability of pgl.graph to store graph level features, + # we will store these features under node_feat + graph.node_feat["lengths"] = lengths + graph.node_feat["angles"] = angles + graph.node_feat["lattice"] = lattice.reshape(1, 3, 3) + # graph.node_feat['num_atoms'] is different from graph.num_nodes + # After multiple graph batch operations by the dataloader, + # graph.node_feat['num_atoms'] is a tensor of shape (batch_size), + # where each value is the number of atoms in the corresponding graph. + graph.node_feat["num_atoms"] = np.array([num_atoms]) + # edge features: pbc_offset, bond_vec, bond_dist + if to_jimages is not None: + graph.edge_feat["pbc_offset"] = to_jimages + offset = np.matmul(to_jimages, lattice) + dst_pos = graph.node_feat["cart_coords"][graph.edges[:, 1]] + offset + src_pos = graph.node_feat["cart_coords"][graph.edges[:, 0]] + bond_vec = dst_pos - src_pos + bond_dist = np.linalg.norm(bond_vec, axis=1) + graph.edge_feat["bond_vec"] = bond_vec.astype("float32") + graph.edge_feat["bond_dist"] = bond_dist.astype("float32") + graph.edge_feat["num_edges"] = np.array([edge_indices.shape[0]]) + + if node_features is not None: + graph.node_feat.update(node_features) + if edge_features is not None: + graph.edge_feat.update(edge_features) + return graph diff --git a/ppmat/models/mattersim/threebody_indices.pyx b/ppmat/models/mattersim/threebody_indices.pyx new file mode 100644 index 00000000..b1dabcab --- /dev/null +++ b/ppmat/models/mattersim/threebody_indices.pyx @@ -0,0 +1,94 @@ +# cython: boundscheck=False +# cython: wraparound=False +# cython: nonecheck=False +# cython: cdivision=True +# cython: profile=True +# cython: language_level=3 +# distutils: language = c +# distutils: define_macros=NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION + +cimport numpy as np + +import numpy as np + +from libc.stdlib cimport free +from libc.stdlib cimport malloc +from libc.string cimport memset + + +def compute_threebody(const int[:, ::1] bond_atom_indices, + const int[::1] n_atoms): + """ + Calculate the three body indices from pair atom indices + Args: + bond_atom_indices (np.ndarray): pair atom indices + n_atoms (int): number of atoms + Returns: + triple_bond_indices (np.ndarray): bond indices that form three-body + py_n_triple_ij (np.ndarray): number of three-body angles for each bond + py_n_triple_i (np.ndarray): number of three-body angles each atom + py_n_triple_s (np.ndarray): number of three-body angles for each + structure + """ + cdef int i, j, k + cdef int n_bond = bond_atom_indices.shape[0] + cdef int n_atom = 0 + cdef int n_struct = n_atoms.shape[0] + for i in range(n_struct): + n_atom += n_atoms[i] + + cdef int* n_bond_per_atom = malloc(n_atom * sizeof(int)) + memset(n_bond_per_atom, 0, n_atom * sizeof(int)) + + for i in range(n_bond): + n_bond_per_atom[bond_atom_indices[i, 0]] += 1 + + cdef int* n_triple_i = malloc(n_atom * sizeof(int)) + cdef int* n_triple_ij = malloc(n_bond * sizeof(int)) + cdef int* n_triple_s = malloc(n_struct * sizeof(int)) + + memset(n_triple_s, 0, n_struct * sizeof(int)) + + cdef int n_triple = 0 + cdef int n_triple_temp + cdef int start = 0 + + for i in range(n_atom): + n_triple_temp = n_bond_per_atom[i] * (n_bond_per_atom[i] - 1) + for j in range(n_bond_per_atom[i]): + n_triple_ij[start + j] = n_bond_per_atom[i] - 1 + n_triple += n_triple_temp + n_triple_i[i] = n_triple_temp + start += n_bond_per_atom[i] + + cdef np.ndarray triple_bond_indices = np.empty(shape=(n_triple, 2), + dtype=np.int32) + + start = 0 + cdef int index = 0 + for i in range(n_atom): + for j in range(n_bond_per_atom[i]): + for k in range(n_bond_per_atom[i]): + if j != k: + triple_bond_indices[index, 0] = start + j + triple_bond_indices[index, 1] = start + k + index += 1 + start += n_bond_per_atom[i] + + start = 0 + cdef int end = start + cdef int n_atom_temp + for i in range(n_struct): + end += n_atoms[i] + for j in range(start, end): + n_triple_s[i] += n_triple_i[j] + start = end + py_n_triple_ij = np.array(n_triple_ij) + py_n_triple_i = np.array(n_triple_i) + py_n_triple_s = np.array(n_triple_s) + + free(n_triple_ij) + free(n_triple_i) + free(n_triple_s) + free(n_bond_per_atom) + return triple_bond_indices, py_n_triple_ij, py_n_triple_i, py_n_triple_s diff --git a/ppmat/models/megnet/megnet.py b/ppmat/models/megnet/megnet.py new file mode 100644 index 00000000..cb310fa4 --- /dev/null +++ b/ppmat/models/megnet/megnet.py @@ -0,0 +1,860 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import math +from collections.abc import Sequence +from typing import Callable +from typing import Literal +from typing import Optional + +import paddle +import paddle.nn as nn +import pgl +from paddle.nn import Linear +from pgl.math import segment_softmax +from pgl.math import segment_sum + +from ppmat.models.common import initializer +from ppmat.utils import logger + + +class GaussianExpansion(paddle.nn.Layer): + """Gaussian Radial Expansion. + + The bond distance is expanded to a vector of shape [m], where m is the number of + Gaussian basis centers. + """ + + def __init__( + self, + initial: float = 0.0, + final: float = 4.0, + num_centers: int = 20, + width: (None | float) = 0.5, + ): + """ + Args: + initial: Location of initial Gaussian basis center. + final: Location of final Gaussian basis center + num_centers: Number of Gaussian Basis functions + width: Width of Gaussian Basis functions. + """ + super().__init__() + out_0 = paddle.create_parameter( + shape=paddle.linspace(start=initial, stop=final, num=num_centers).shape, + dtype=paddle.linspace(start=initial, stop=final, num=num_centers) + .numpy() + .dtype, + default_initializer=paddle.nn.initializer.Assign( + paddle.linspace(start=initial, stop=final, num=num_centers) + ), + ) + out_0.stop_gradient = not False + self.centers = out_0 + if width is None: + self.width = 1.0 / paddle.diff(x=self.centers).mean() + else: + self.width = width + + def reset_parameters(self): + """Reinitialize model parameters.""" + out_1 = paddle.create_parameter( + shape=self.centers.shape, + dtype=self.centers.numpy().dtype, + default_initializer=paddle.nn.initializer.Assign(self.centers), + ) + out_1.stop_gradient = not False + self.centers = out_1 + + def forward(self, bond_dists): + """Expand distances. + + Args: + bond_dists : + Bond (edge) distances between two atoms (nodes) + + Returns: + A vector of expanded distance with shape [num_centers] + """ + diff = bond_dists[:, None] - self.centers[None, :] + return paddle.exp(x=-self.width * diff**2) + + +class BondExpansion(paddle.nn.Layer): + """Expand pair distances into a set of spherical bessel or gaussian functions.""" + + def __init__( + self, + max_l: int = 3, + max_n: int = 3, + cutoff: float = 5.0, + rbf_type: Literal["SphericalBessel", "Gaussian"] = "SphericalBessel", + smooth: bool = False, + initial: float = 0.0, + final: float = 5.0, + num_centers: int = 100, + width: float = 0.5, + ) -> None: + """ + Args: + max_l (int): order of angular part + max_n (int): order of radial part + cutoff (float): cutoff radius + rbf_type (str): type of radial basis function .i.e. + either "SphericalBessel" or 'Gaussian' + smooth (bool): whether apply the smooth version of spherical bessel + functions or not + initial (float): initial point for gaussian expansion + final (float): final point for gaussian expansion + num_centers (int): Number of centers for gaussian expansion. + width (float): width of gaussian function. + """ + super().__init__() + self.max_n = max_n + self.cutoff = cutoff + self.max_l = max_l + self.smooth = smooth + self.num_centers = num_centers + self.width = width + self.initial = initial + self.final = final + self.rbf_type = rbf_type + if rbf_type.lower() == "sphericalbessel": + raise NotImplementedError("Not implemented yet") + elif rbf_type.lower() == "gaussian": + self.rbf = GaussianExpansion(initial, final, num_centers, width) + else: + raise ValueError( + "Undefined rbf_type, please use SphericalBessel or Gaussian instead." + ) + + def forward(self, bond_dist: paddle.Tensor): + """Forward. + + Args: + bond_dist: Bond distance + + Return: + bond_basis: Radial basis functions + """ + bond_basis = self.rbf(bond_dist) + return bond_basis + + +class MLP(paddle.nn.Layer): + """An implementation of a multi-layer perceptron.""" + + def __init__( + self, + dims: Sequence[int], + activation: (Callable[[paddle.Tensor], paddle.Tensor] | None) = None, + activate_last: bool = False, + bias_last: bool = True, + ) -> None: + super().__init__() + self._depth = len(dims) - 1 + self.layers = paddle.nn.LayerList() + bias_attr = paddle.ParamAttr(initializer=paddle.nn.initializer.XavierNormal()) + for i, (in_dim, out_dim) in enumerate(zip(dims[:-1], dims[1:])): + if i < self._depth - 1: + self.layers.append( + paddle.nn.Linear( + in_features=in_dim, out_features=out_dim, bias_attr=bias_attr + ) + ) + if activation is not None: + self.layers.append(activation) + else: + if bias_last: + bias_last = bias_attr + self.layers.append( + paddle.nn.Linear( + in_features=in_dim, out_features=out_dim, bias_attr=bias_last + ) + ) + if activation is not None and activate_last: + self.layers.append(activation) + + @property + def last_linear(self) -> (Linear | None): + """:return: The last linear layer.""" + for layer in reversed(self.layers): + if isinstance(layer, paddle.nn.Linear): + return layer + raise RuntimeError + + @property + def depth(self) -> int: + """Returns depth of MLP.""" + return self._depth + + @property + def in_features(self) -> int: + """Return input features of MLP.""" + return self.layers[0].in_features + + @property + def out_features(self) -> int: + """Returns output features of MLP.""" + for layer in reversed(self.layers): + if isinstance(layer, paddle.nn.Linear): + return layer.out_features + raise RuntimeError + + def forward(self, inputs): + """Applies all layers in turn.""" + x = inputs + for layer in self.layers: + x = layer(x) + return x + + +class SoftPlus2(paddle.nn.Layer): + """SoftPlus2 activation function: + out = log(exp(x)+1) - log(2) + softplus function that is 0 at x=0, the implementation aims at avoiding overflow. + """ + + def __init__(self) -> None: + """Initializes the SoftPlus2 class.""" + super().__init__() + self.ssp = paddle.nn.Softplus() + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + """Evaluate activation function given the input tensor x. + + Args: + x (paddle.tensor): Input tensor + + Returns: + out (paddle.tensor): Output tensor + """ + return self.ssp(x) - math.log(2.0) + + +class EmbeddingBlock(paddle.nn.Layer): + """Embedding block for generating node, bond and state features.""" + + def __init__( + self, + degree_rbf: int, + activation: paddle.nn.Layer, + dim_node_embedding: int, + dim_edge_embedding: (int | None) = None, + dim_state_feats: (int | None) = None, + ntypes_node: (int | None) = None, + include_state: bool = False, + dim_state_embedding: (int | None) = None, + ): + """ + Args: + degree_rbf (int): number of rbf + activation (nn.Module): activation type + dim_node_embedding (int): dimensionality of node features + dim_edge_embedding (int): dimensionality of edge features + dim_state_feats: dimensionality of state features + ntypes_node: number of node labels + include_state: Whether to include state embedding + dim_state_embedding: dimensionality of state embedding. + """ + super().__init__() + self.include_state = include_state + self.dim_node_embedding = dim_node_embedding + self.dim_edge_embedding = dim_edge_embedding + self.dim_state_feats = dim_state_feats + self.ntypes_node = ntypes_node + self.dim_state_embedding = dim_state_embedding + self.activation = activation + + self.layer_node_embedding = paddle.nn.Embedding( + num_embeddings=ntypes_node, embedding_dim=dim_node_embedding + ) + + if dim_edge_embedding is not None: + dim_edges = [degree_rbf, dim_edge_embedding] + self.layer_edge_embedding = MLP( + dim_edges, activation=activation, activate_last=True + ) + + def forward(self, node_attr, edge_attr, state_attr): + """Output embedded features. + + Args: + node_attr: node attribute + edge_attr: edge attribute + state_attr: state attribute + + Returns: + node_feat: embedded node features + edge_feat: embedded edge features + state_feat: embedded state features + """ + if self.ntypes_node is not None: + node_feat = self.layer_node_embedding(node_attr) + else: + node_feat = self.layer_node_embedding(node_attr.to("float32")) + if self.dim_edge_embedding is not None: + edge_feat = self.layer_edge_embedding(edge_attr.to("float32")) + else: + edge_feat = edge_attr + if self.include_state is True: + state_feat = state_attr + else: + state_feat = None + return node_feat, edge_feat, state_feat + + +class MEGNetGraphConv(paddle.nn.Layer): + """A MEGNet graph convolution layer in DGL.""" + + def __init__( + self, + edge_func: paddle.nn.Layer, + node_func: paddle.nn.Layer, + state_func: paddle.nn.Layer, + ) -> None: + """ + Args: + edge_func: Edge update function. + node_func: Node update function. + state_func: Global state update function. + """ + super().__init__() + self.edge_func = edge_func + self.node_func = node_func + self.state_func = state_func + + @staticmethod + def from_dims( + edge_dims: list[int], + node_dims: list[int], + state_dims: list[int], + activation: paddle.nn.Layer, + ) -> MEGNetGraphConv: + """Create a MEGNet graph convolution layer from dimensions. + + Args: + edge_dims (list[int]): Edge dimensions. + node_dims (list[int]): Node dimensions. + state_dims (list[int]): State dimensions. + activation (Module): Activation function. + + Returns: + MEGNetGraphConv: MEGNet graph convolution layer. + """ + edge_update = MLP(edge_dims, activation, activate_last=True) + node_update = MLP(node_dims, activation, activate_last=True) + attr_update = MLP(state_dims, activation, activate_last=True) + return MEGNetGraphConv(edge_update, node_update, attr_update) + + def edge_update(self, graph, node_feat, edge_feat, u): + vi = node_feat[graph.edges[:, 0]] # shape: [num_edges, 32] + vj = node_feat[graph.edges[:, 1]] # shape: [num_edges, 32] + u = u[graph.edges[:, 0]] # shape: [num_edges, 32] + edge_feat = paddle.concat( + [vi, vj, edge_feat, u], axis=1 + ) # shape: [num_edges, 32+32+32+32] = [num_edges, 128] + edge_feat = self.edge_func( + edge_feat + ) # input shape: [num_edges, 128], out shape: [num_edges, 32] + return edge_feat + + def node_update(self, graph, node_feat, edge_feat, u): + src, dst, eid = graph.sorted_edges(sort_by="dst") + # node_feat_e = paddle.geometric.segment_mean(edge_feat[eid], dst) + node_feat_e = self.sorted_segment_mean( + edge_feat[eid], dst, graph.num_nodes.item() + ) + node_feat = paddle.concat([node_feat, node_feat_e, u], axis=1) + node_feat = self.node_func(node_feat) + return node_feat + + def state_update(self, graph, node_feat, edge_feat, state_feat): + u_edge_feat = paddle.geometric.segment_mean(edge_feat, graph.graph_edge_id) + u_node_feat = paddle.geometric.segment_mean(node_feat, graph.graph_node_id) + state = paddle.concat([state_feat, u_edge_feat, u_node_feat], axis=1) + state_feat = self.state_func(state) + return state_feat + + @staticmethod + def sorted_segment_mean(data, segment_ids, num_segments): + """ + Custom Paddle op to replicate TensorFlow's `unsorted_segment_sum` + + Args: + data (Tensor [N, D]): N is the number of edges, and D is the feature + dimension. + segment_ids (Tensor [N]): Each value is the segment ID (int). + num_segments (int): Total number of segments (e.g., number of nodes). + + Returns: + Tensor [num_segments, D] + """ + + feat_dim = data.shape[1] + + # Initialize output and count tensors + result = paddle.zeros(shape=[num_segments, feat_dim]) + count = paddle.zeros(shape=[num_segments, feat_dim]) + + # Expand segment_ids to match data's shape [N, D] + segment_ids_exp = paddle.unsqueeze(segment_ids, axis=1) + segment_ids_exp = paddle.expand(segment_ids_exp, shape=[-1, feat_dim]) + + # Accumulate values into result tensor (Note: must assign the returned tensor) + result = paddle.put_along_axis( + arr=result, indices=segment_ids_exp, values=data, axis=0, reduce="add" + ) + + # Accumulate counts + ones = paddle.ones_like(data) + count = paddle.put_along_axis( + arr=count, indices=segment_ids_exp, values=ones, axis=0, reduce="add" + ) + count = paddle.clip(count, min=1.0) + + return result / count + + def forward( + self, + graph: pgl.Graph, + edge_feat: paddle.Tensor, + node_feat: paddle.Tensor, + state_feat: paddle.Tensor, + ) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """Perform sequence of edge->node->attribute updates. + + Args: + graph: Input g + edge_feat: Edge features, shape: [num_edges, 32] + node_feat: Node features, shape: [num_nodes, 32] + state_feat: Graph attributes (global state) + + Returns: + (edge features, node features, graph attributes) + """ + batch_num_nodes = graph._graph_node_index + batch_num_nodes = batch_num_nodes[1:] - batch_num_nodes[:-1] + u = paddle.repeat_interleave( + state_feat, batch_num_nodes, axis=0 + ) # shape: [num_nodes, 32] + + edge_feat = self.edge_update(graph, node_feat, edge_feat, u) + node_feat = self.node_update(graph, node_feat, edge_feat, u) + state_feat = self.state_update(graph, node_feat, edge_feat, state_feat) + return edge_feat, node_feat, state_feat + + +class MEGNetBlock(paddle.nn.Layer): + """A MEGNet block comprising a sequence of update operations.""" + + def __init__( + self, + dims: list[int], + conv_hiddens: list[int], + act: paddle.nn.Layer, + dropout: (float | None) = None, + skip: bool = True, + ) -> None: + """ + Init the MEGNet block with key parameters. + + Args: + dims: Dimension of dense layers before graph convolution. + conv_hiddens: Architecture of hidden layers of graph convolution. + act: Activation type. + dropout: Randomly zeroes some elements in the input tensor with given + probability (0 < x < 1) according to a Bernoulli distribution. + skip: Residual block. + """ + super().__init__() + self.has_dense = len(dims) > 1 + self.activation = act + conv_dim = dims[-1] + out_dim = conv_hiddens[-1] + mlp_kwargs = { + "dims": dims, + "activation": self.activation, + "activate_last": True, + "bias_last": True, + } + self.edge_func = MLP(**mlp_kwargs) if self.has_dense else paddle.nn.Identity() + self.node_func = MLP(**mlp_kwargs) if self.has_dense else paddle.nn.Identity() + self.state_func = MLP(**mlp_kwargs) if self.has_dense else paddle.nn.Identity() + edge_in = 2 * conv_dim + conv_dim + conv_dim + node_in = out_dim + conv_dim + conv_dim + attr_in = out_dim + out_dim + conv_dim + self.conv = MEGNetGraphConv.from_dims( + edge_dims=[edge_in, *conv_hiddens], + node_dims=[node_in, *conv_hiddens], + state_dims=[attr_in, *conv_hiddens], + activation=self.activation, + ) + self.dropout = paddle.nn.Dropout(p=dropout) if dropout else None + self.skip = skip + + def forward( + self, + graph: pgl.Graph, + edge_feat: paddle.Tensor, + node_feat: paddle.Tensor, + state_feat: paddle.Tensor, + ) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """MEGNetBlock forward pass. + + Args: + graph (pgl.Graph): A Graph. + edge_feat (Tensor): Edge features, shape [num_edges, 32] + node_feat (Tensor): Node features, shape [num_nodes, 32] + state_feat (Tensor): Graph attributes (global state), shape [batch_size, 32] + + Returns: + tuple[Tensor, Tensor, Tensor]: Updated (edge features, + node features, graph attributes) + """ + inputs = edge_feat, node_feat, state_feat + edge_feat = self.edge_func(edge_feat) + node_feat = self.node_func(node_feat) + state_feat = self.state_func(state_feat) + edge_feat, node_feat, state_feat = self.conv( + graph, edge_feat, node_feat, state_feat + ) + if self.dropout: + edge_feat = self.dropout(edge_feat) + node_feat = self.dropout(node_feat) + state_feat = self.dropout(state_feat) + if self.skip: + edge_feat = edge_feat + inputs[0] + node_feat = node_feat + inputs[1] + state_feat = state_feat + inputs[2] + return edge_feat, node_feat, state_feat + + +class Set2Set(nn.Layer): + """Implementation of Graph Global Pooling "Set2Set". + + Reference Paper: ORDER MATTERS: SEQUENCE TO SEQUENCE + + Args: + input_dim (int): dimentional size of input + n_iters: number of iteration + n_layers: number of LSTM layers + Return: + output_feat: output feature of set2set pooling with shape [batch, 2*dim]. + """ + + def __init__(self, input_dim, n_iters, n_layers=1): + super(Set2Set, self).__init__() + self.input_dim = input_dim + self.output_dim = 2 * input_dim + self.n_iters = n_iters + self.n_layers = n_layers + self.lstm = paddle.nn.LSTM( + input_size=self.output_dim, + hidden_size=self.input_dim, + num_layers=n_layers, + time_major=True, + ) + + def forward(self, graph, x): + """Forward function of Graph Global Pooling "Set2Set". + + Args: + graph: the graph object from (:code:`Graph`) + x: A tensor with shape (num_nodes, feature_size). + Return: + output_feat: A tensor with shape (num_nodes, output_size). + """ + graph_id = graph.graph_node_id + batch_size = graph_id.max() + 1 + h = ( + paddle.zeros((self.n_layers, batch_size, self.input_dim)), + paddle.zeros((self.n_layers, batch_size, self.input_dim)), + ) + q_star = paddle.zeros((batch_size, self.output_dim)) + for _ in range(self.n_iters): + q, h = self.lstm(q_star.unsqueeze(0), h) + q = q.reshape((batch_size, self.input_dim)) + e = (x * q.index_select(graph_id, axis=0)).sum(axis=-1, keepdim=True) + a = segment_softmax(e, graph_id) + r = segment_sum(a * x, graph_id) + q_star = paddle.concat([q, r], axis=-1) + + return q_star + + +class EdgeSet2Set(paddle.nn.Layer): + """Implementation of Set2Set.""" + + def __init__(self, input_dim: int, n_iters: int, n_layers: int) -> None: + """:param input_dim: The size of each input sample. + :param n_iters: The number of iterations. + :param n_layers: The number of recurrent layers. + """ + super().__init__() + self.input_dim = input_dim + self.output_dim = 2 * input_dim + self.n_iters = n_iters + self.n_layers = n_layers + self.lstm = paddle.nn.LSTM( + input_size=self.output_dim, + hidden_size=self.input_dim, + num_layers=n_layers, + time_major=True, + direction="forward", + ) + + def forward(self, graph, x): + """Forward function of Graph Global Pooling "Set2Set". + + Args: + graph: the graph object from (:code:`Graph`) + x: A tensor with shape (num_nodes, feature_size). + Return: + output_feat: A tensor with shape (num_nodes, output_size). + """ + graph_id = graph.graph_edge_id + batch_size = graph_id.max() + 1 + h = ( + paddle.zeros((self.n_layers, batch_size, self.input_dim)), + paddle.zeros((self.n_layers, batch_size, self.input_dim)), + ) + q_star = paddle.zeros((batch_size, self.output_dim)) + for _ in range(self.n_iters): + q, h = self.lstm(q_star.unsqueeze(0), h) + q = q.reshape((batch_size, self.input_dim)) + e = (x * q.index_select(graph_id, axis=0)).sum(axis=-1, keepdim=True) + a = segment_softmax(e, graph_id) + r = segment_sum(a * x, graph_id) + q_star = paddle.concat([q, r], axis=-1) + + return q_star + + +class MEGNetPlus(paddle.nn.Layer): + """MegNet: Graph Networks as a Universal Machine Learning Framework for Molecules + and Crystals + + https://arxiv.org/abs/1812.05055 + + Args: + dim_node_embedding (int, optional): Dimensionality of node (atom) feature + embeddings. Defaults to 16. + dim_edge_embedding (int, optional): Dimensionality of edge (bond) feature + embeddings. Defaults to 100. + dim_state_embedding (int, optional): Dimensionality of state (graph-level) + features. Defaults to 2. + nblocks (int, optional): Number of graph convolution blocks. Defaults to 3. + hidden_layer_sizes_input (tuple[int, ...], optional): MLP sizes for input + feature encoding. Defaults to (64, 32). + hidden_layer_sizes_conv (tuple[int, ...], optional): MLP sizes for convolution + layers. Defaults to (64, 64, 32). + hidden_layer_sizes_output (tuple[int, ...], optional): MLP sizes for output + head. Defaults to (32, 16). + nlayers_set2set (int, optional): Number of LSTM layers in Set2Set pooling. + Defaults to 1. + niters_set2set (int, optional): Number of Set2Set iterations. Defaults to 2. + include_state (bool, optional): Whether to include state features in processing. + Defaults to True. + dropout (float, optional): Dropout rate for regularization. Defaults to 0.0. + max_element_types (int, optional): Maximum number of atomic species supported. + Defaults to 119. + bond_expansion_cfg (_type_, optional): Radial basis function configuration for + bond distance encoding. Defaults to None. + property_name (Optional[str], optional): Target property name for prediction. + Defaults to "formation_energy_per_atom". + data_mean (float, optional): Mean of the training data. Defaults to 0.0. + data_std (float, optional): Standard deviation of the training data. Defaults + to 1.0. + """ + + def __init__( + self, + dim_node_embedding: int = 16, + dim_edge_embedding: int = 100, + dim_state_embedding: int = 2, + nblocks: int = 3, + hidden_layer_sizes_input: tuple[int, ...] = (64, 32), + hidden_layer_sizes_conv: tuple[int, ...] = (64, 64, 32), + hidden_layer_sizes_output: tuple[int, ...] = (32, 16), + nlayers_set2set: int = 1, + niters_set2set: int = 2, + include_state: bool = True, + dropout: float = 0.0, + max_element_types: int = 119, + bond_expansion_cfg=None, + property_name: Optional[str] = "formation_energy_per_atom", + data_mean: float = 0.0, + data_std: float = 1.0, + # loss_cfg:dict = {}, + ): + # loss = build_loss(loss_cfg) + super().__init__() + self.max_element_types = max_element_types + if bond_expansion_cfg is None: + bond_expansion_cfg = { + "rbf_type": "Gaussian", + "initial": 0.0, + "final": 5.0, + "num_centers": 100, + "width": 0.5, + } + logger.info(f"Using bond expansion configuration: {bond_expansion_cfg}") + + self.bond_expansion = BondExpansion(**bond_expansion_cfg) + + if isinstance(property_name, list): + self.property_name = property_name[0] + else: + assert isinstance(property_name, str) + self.property_name = property_name + self.register_buffer(tensor=paddle.to_tensor(data_mean), name="data_mean") + self.register_buffer(tensor=paddle.to_tensor(data_std), name="data_std") + + node_dims = [dim_node_embedding, *hidden_layer_sizes_input] + edge_dims = [dim_edge_embedding, *hidden_layer_sizes_input] + state_dims = [dim_state_embedding, *hidden_layer_sizes_input] + + activation = SoftPlus2() + self.embedding = EmbeddingBlock( + degree_rbf=dim_edge_embedding, + dim_node_embedding=dim_node_embedding, + ntypes_node=max_element_types, + include_state=include_state, + dim_state_embedding=dim_state_embedding, + activation=activation, + ) + self.edge_encoder = MLP(edge_dims, activation, activate_last=True) + self.node_encoder = MLP(node_dims, activation, activate_last=True) + self.state_encoder = MLP(state_dims, activation, activate_last=True) + dim_blocks_in = hidden_layer_sizes_input[-1] + dim_blocks_out = hidden_layer_sizes_conv[-1] + block_args = { + "conv_hiddens": hidden_layer_sizes_conv, + "dropout": dropout, + "act": activation, + "skip": True, + } + blocks = [MEGNetBlock(dims=[dim_blocks_in], **block_args)] + [ + MEGNetBlock(dims=[dim_blocks_out, *hidden_layer_sizes_input], **block_args) + for _ in range(nblocks - 1) + ] + self.blocks = paddle.nn.LayerList(sublayers=blocks) + s2s_kwargs = {"n_iters": niters_set2set, "n_layers": nlayers_set2set} + self.edge_s2s = EdgeSet2Set(dim_blocks_out, **s2s_kwargs) + self.node_s2s = Set2Set(dim_blocks_out, **s2s_kwargs) + + self.fc_out = MLP( + dims=[ + 2 * 2 * dim_blocks_out + dim_blocks_out, + *hidden_layer_sizes_output, + 1, + ], + activation=activation, + activate_last=False, + ) + + self.dropout = paddle.nn.Dropout(p=dropout) if dropout else None + self.include_state_embedding = include_state + self.apply(self._init_weights) + + def _init_weights(self, m): + if isinstance(m, nn.Linear): + initializer.linear_init_(m) + elif isinstance(m, nn.Embedding): + initializer.normal_(m.weight) + elif isinstance(m, nn.LSTM): + initializer.lstm_init_(m) + + def _forward(self, data): + # The data in data['graph'] is numpy.ndarray, convert it to paddle.Tensor + g = data["graph"].tensor() + # print(data["id"]) + batch_size = g.num_graph + state_attr = paddle.zeros([batch_size, 2]) + node_attr = g.node_feat["atom_types"] + edge_attr = self.bond_expansion(g.edge_feat["bond_dist"]) + node_feat, edge_feat, state_feat = self.embedding( + node_attr, edge_attr, state_attr + ) + edge_feat = self.edge_encoder(edge_feat) + node_feat = self.node_encoder(node_feat) + state_feat = self.state_encoder(state_feat) + for block in self.blocks: + output = block(g, edge_feat, node_feat, state_feat) + edge_feat, node_feat, state_feat = output + node_vec = self.node_s2s(g, node_feat) + edge_vec = self.edge_s2s(g, edge_feat) + + vec = paddle.concat([node_vec, edge_vec, state_feat], axis=1) + if self.dropout: + vec = self.dropout(vec) + + result = self.fc_out(vec) + + return result + + def normalize(self, tensor): + return (tensor - self.data_mean) / self.data_std + + def unnormalize(self, tensor): + return tensor * self.data_std + self.data_mean + + def forward(self, data, return_loss=True, return_prediction=True): + assert ( + return_loss or return_prediction + ), "At least one of return_loss or return_prediction must be True." + pred = self._forward(data) + + loss_dict = {} + if return_loss: + label = data[self.property_name] + label = self.normalize(label) + loss = paddle.nn.functional.mse_loss( + input=pred, + label=label, + ) + loss_dict["loss"] = loss + + prediction = {} + if return_prediction: + pred = self.unnormalize(pred) + prediction[self.property_name] = pred + return {"loss_dict": loss_dict, "pred_dict": prediction} + + @paddle.no_grad() + def predict(self, graphs): + if isinstance(graphs, list): + results = [] + for graph in graphs: + result = self._forward( + { + "graph": graph, + } + ) + result = self.unnormalize(result).numpy()[0, 0] + result = {self.property_name: result} + results.append(result) + return results + + else: + data = { + "graph": graphs, + } + result = self._forward(data) + result = self.unnormalize(result).numpy()[0, 0] + result = {self.property_name: result} + return result diff --git a/ppmat/models/sfin/__init__.py b/ppmat/models/sfin/__init__.py new file mode 100644 index 00000000..1e72cd97 --- /dev/null +++ b/ppmat/models/sfin/__init__.py @@ -0,0 +1,29 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ppmat.models.sfin.sfin import FFC +from ppmat.models.sfin.sfin import SFIB +from ppmat.models.sfin.sfin import SFIN +from ppmat.models.sfin.sfin import FourierUnit +from ppmat.models.sfin.sfin import ResnetBlock +from ppmat.models.sfin.sfin import SpectralTransform + +__all__ = [ + "SFIN", + "FourierUnit", + "SpectralTransform", + "FFC", + "SFIB", + "ResnetBlock", +] diff --git a/ppmat/models/sfin/sfin.py b/ppmat/models/sfin/sfin.py new file mode 100644 index 00000000..53b8ca38 --- /dev/null +++ b/ppmat/models/sfin/sfin.py @@ -0,0 +1,365 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +SFIN: Noise Calibration and Spatial-Frequency Interactive Network for STEM Image Enhancement +Paper: CVPR 2025 - https://arxiv.org/pdf/2504.02555 +""" + +from typing import Dict + +import paddle +import paddle.nn as nn + +# BatchNorm semantic alignment: +# PyTorch: running = (1 - m_torch) * running + m_torch * batch. +# Paddle: running = m_paddle * running + (1 - m_paddle) * batch. +# so m_paddle = 1 - m_torch = 0.9 +TORCH_BN_MOMENTUM = 0.1 +PADDLE_BN_MOMENTUM = 1.0 - TORCH_BN_MOMENTUM +BN_EPSILON = 1e-5 + + +def _kaiming_uniform_attr(): + return paddle.ParamAttr( + initializer=nn.initializer.KaimingUniform( + negative_slope=5**0.5, + mode="fan_in", + nonlinearity="leaky_relu", + ) + ) + + +def _uniform_attr(bound: float): + return paddle.ParamAttr(initializer=nn.initializer.Uniform(-bound, bound)) + + +def _bn_aligned(num_features: int) -> nn.BatchNorm2D: + """Create BatchNorm2D with PyTorch-aligned momentum semantics.""" + return nn.BatchNorm2D(num_features, momentum=PADDLE_BN_MOMENTUM, epsilon=BN_EPSILON) + + +class FourierUnit(nn.Layer): + """Fourier Unit for processing frequency domain features.""" + + def __init__(self, in_channels: int, out_channels: int): + super(FourierUnit, self).__init__() + + self.conv_layer = nn.Conv2D( + in_channels=in_channels * 2 + 2, + out_channels=out_channels * 2, + kernel_size=1, + stride=1, + padding=0, + bias_attr=False, + weight_attr=_kaiming_uniform_attr(), + ) + self.bn = _bn_aligned(out_channels * 2) + self.relu = nn.ReLU() + + def forward(self, x): + batch = x.shape[0] + fft_dim = (-2, -1) + + # Real FFT with ortho normalization + ffted = paddle.fft.rfftn(x, axes=fft_dim, norm="ortho") + + # Split into real/imaginary parts + ffted_real = paddle.real(ffted) # (B, C, H, W/2+1) + ffted_imag = paddle.imag(ffted) # (B, C, H, W/2+1) + ffted = paddle.stack([ffted_real, ffted_imag], axis=-1) # (B, C, H, W/2+1, 2) + + # Permute to (B, C, 2, H, W/2+1) + ffted = ffted.transpose([0, 1, 4, 2, 3]) # (B, C, 2, H, W/2+1) + ffted = ffted.reshape([batch, -1] + list(ffted.shape[3:])) # (B, C*2, H, W/2+1) + + height, width = ffted.shape[-2:] + coords_vert = paddle.linspace(0, 1, height).reshape([1, 1, height, 1]) + coords_vert = coords_vert.expand([x.shape[0], 1, height, width]) + + coords_hor = paddle.linspace(0, 1, width).reshape([1, 1, 1, width]) + coords_hor = coords_hor.expand([x.shape[0], 1, height, width]) + + # Concatenate coordinates and FFT features + ffted = paddle.concat([coords_vert, coords_hor, ffted], axis=1) # (B, C*2+2, H, W/2+1) + + # Process through convolution + ffted = self.conv_layer(ffted) + ffted = self.relu(self.bn(ffted)) # (B, C*2, H, W/2+1) + + # Reshape back to complex format. + ffted = ffted.reshape([batch, -1, 2] + list(ffted.shape[2:])) + ffted = ffted.transpose([0, 1, 3, 4, 2]) # (B, C, H, W/2+1, 2) + + # Convert back to complex tensor + ffted = paddle.complex(ffted[..., 0], ffted[..., 1]) # (B, C, H, W/2+1) complex + + # Inverse FFT with exact shape matching + output = paddle.fft.irfftn(ffted, s=x.shape[-2:], axes=fft_dim, norm="ortho") + return output + + +class SpectralTransform(nn.Layer): + """Spectral Transform block combining spatial and frequency domain processing.""" + + def __init__(self, in_channels: int): + super(SpectralTransform, self).__init__() + st1_fan_in = (in_channels // 2) * 3 * 3 + st1_bias_bound = 1.0 / st1_fan_in**0.5 + + st2_fan_in = in_channels * 3 * 3 + st2_bias_bound = 1.0 / st2_fan_in**0.5 + + self.conv1 = nn.Conv2D( + in_channels // 2, + in_channels // 2, + 3, + padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(st1_bias_bound), + ) + self.fu = FourierUnit(in_channels // 2, in_channels // 2) + self.conv2 = nn.Conv2D( + in_channels, + in_channels // 2, + 3, + padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(st2_bias_bound), + ) + + def forward(self, x): + x1 = self.conv1(x) + x2 = self.fu(x1) + x = self.conv2(paddle.concat([x, x2], axis=1)) + return x + + +class FFC(nn.Layer): + """Fast Fourier Convolution block for spatial-frequency interaction.""" + + def __init__(self, in_channels: int): + super(FFC, self).__init__() + ffc_fan_in = (in_channels // 2) * 3 * 3 + ffc_bias_bound = 1.0 / ffc_fan_in**0.5 + + self.convl2l = nn.Conv2D( + in_channels // 2, in_channels // 2, 3, padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(ffc_bias_bound), + ) + self.convl2g = nn.Conv2D( + in_channels // 2, in_channels // 2, 3, padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(ffc_bias_bound), + ) + self.convg2l = nn.Conv2D( + in_channels // 2, in_channels // 2, 3, padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(ffc_bias_bound), + ) + self.convg2g = SpectralTransform(in_channels) + + def forward(self, x): + if isinstance(x, tuple): + x_l, x_g = x + else: + C = x.shape[1] + x_l, x_g = paddle.split(x, [C // 2, C // 2], axis=1) + + out_xl = self.convl2l(x_l) + self.convg2l(x_g) + out_xg = self.convl2g(x_l) + self.convg2g(x_g) + return out_xl, out_xg + + +class SFIB(nn.Layer): + """Spatial-Frequency Interactive Block.""" + + def __init__(self, in_channels: int): + super(SFIB, self).__init__() + self.ffc = FFC(in_channels) + self.bn_l = _bn_aligned(in_channels // 2) + self.bn_g = _bn_aligned(in_channels // 2) + self.act_l = nn.ReLU() + self.act_g = nn.ReLU() + + def forward(self, x): + x_l, x_g = self.ffc(x) + x_l = self.act_l(self.bn_l(x_l)) + x_g = self.act_g(self.bn_g(x_g)) + return x_l, x_g + + +class ResnetBlock(nn.Layer): + """Residual block with SFIB.""" + + def __init__(self, in_channels: int): + super().__init__() + self.in_channels = in_channels + self.conv1 = SFIB(in_channels) + self.conv2 = SFIB(in_channels) + + def forward(self, x): + x_l, x_g = paddle.split( + x, [self.in_channels // 2, self.in_channels // 2], axis=1 + ) + id_l, id_g = x_l, x_g + x_l, x_g = self.conv1((x_l, x_g)) + x_l, x_g = self.conv2((x_l, x_g)) + + x_l = id_l + x_l + x_g = id_g + x_g + + out = paddle.concat([x_l, x_g], axis=1) + return out + + +class SFIN(nn.Layer): + """ + SFIN: Noise Calibration and Spatial-Frequency Interactive Network for STEM Image Enhancement. + + Args: + in_channels (int): Number of input channels (default: 1 for grayscale images) + base_channels (int): Base number of channels (default: 64) + num_blocks (int): Number of ResNet blocks (default: 8) + input_name (str): Dataset input key for noisy STEM images. + target_name (str): Dataset target key and prediction key. + loss_type (str): Loss function type, either ``l1`` or ``mse``. + loss_weight (float): Loss scaling weight. + + Reference: + Li et al., "Noise Calibration and Spatial-Frequency Interactive Network for + STEM Image Enhancement", CVPR 2025. + https://arxiv.org/pdf/2504.02555 + """ + + def __init__( + self, + in_channels: int = 1, + base_channels: int = 64, + num_blocks: int = 8, + input_name: str = "noisy", + target_name: str = "gt_enhance", + loss_type: str = "l1", + loss_weight: float = 1.0, + ): + super(SFIN, self).__init__() + self.in_channels = in_channels + self.base_channels = base_channels + self.num_blocks = num_blocks + self.input_name = input_name + self.target_name = target_name + self.loss_type = loss_type.lower() + self.loss_weight = loss_weight + + if self.loss_type == "l1": + self.criterion = nn.L1Loss() + elif self.loss_type == "mse": + self.criterion = nn.MSELoss() + else: + raise ValueError( + f"Unsupported loss_type '{loss_type}', expected 'l1' or 'mse'." + ) + + blocks = [ResnetBlock(base_channels) for _ in range(num_blocks)] + self.body = nn.Sequential(*blocks) + + # Head convolution initialization + head_fan_in = in_channels * 3 * 3 + head_bias_bound = 1.0 / head_fan_in**0.5 + self.head_conv = nn.Conv2D( + in_channels, base_channels, 3, padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(head_bias_bound), + ) + + # Tail convolution initialization + tail_fan_in = base_channels * 3 * 3 + tail_bias_bound = 1.0 / tail_fan_in**0.5 + self.tail_conv = nn.Conv2D( + base_channels, in_channels, 3, padding=1, + weight_attr=_kaiming_uniform_attr(), + bias_attr=_uniform_attr(tail_bias_bound), + ) + + def _forward_tensor(self, x: paddle.Tensor) -> paddle.Tensor: + """ + Tensor-only forward pass of SFIN. + + Args: + x: Input tensor of shape (B, C, H, W) + + Returns: + Enhanced image tensor of shape (B, C, H, W) + """ + x = self.head_conv(x) + shortcut = x + x = self.body(x) + x = x + shortcut + x = self.tail_conv(x) + return x + + def forward(self, batch): + """ + Unified forward for both: + 1) tensor -> enhanced tensor (for direct use / legacy scripts) + 2) dict -> trainer-ready output with loss_dict and pred_dict + """ + if isinstance(batch, dict): + if self.input_name not in batch: + raise KeyError( + f"SFIN expects '{self.input_name}' in batch, but got keys: " + f"{list(batch.keys())}" + ) + if self.target_name not in batch: + raise KeyError( + f"SFIN expects '{self.target_name}' in batch, but got keys: " + f"{list(batch.keys())}" + ) + + x = batch[self.input_name] + enhanced = self._forward_tensor(x) + + pred_dict = { + self.target_name: enhanced, + } + label = batch[self.target_name] + loss = self.criterion(enhanced, label) * self.loss_weight + loss_dict = {"loss": loss} + + return {"loss_dict": loss_dict, "pred_dict": pred_dict} + + return self._forward_tensor(batch) + + def predict(self, batch: Dict) -> Dict: + """ + Prediction interface for spectrum enhancement predictor entries. + + Args: + batch: Dictionary containing the configured input key. + + Returns: + Dictionary containing the configured prediction key + """ + if isinstance(batch, dict): + if self.input_name not in batch: + raise KeyError( + f"SFIN expects '{self.input_name}' in batch, but got keys: " + f"{list(batch.keys())}" + ) + x = batch[self.input_name] + enhanced = self._forward_tensor(x) + return {self.target_name: enhanced} + + return self._forward_tensor(batch) diff --git a/ppmat/models/sgequidiff/__init__.py b/ppmat/models/sgequidiff/__init__.py new file mode 100644 index 00000000..b64c8e83 --- /dev/null +++ b/ppmat/models/sgequidiff/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ppmat.models.sgequidiff.diffusion_model import EquivariantDiffusionModel +from ppmat.models.sgequidiff.diffusion_model import EquivariantDiffusionModelConfig + +__all__ = [ + "EquivariantDiffusionModel", + "EquivariantDiffusionModelConfig", +] diff --git a/ppmat/models/sgequidiff/constants.py b/ppmat/models/sgequidiff/constants.py new file mode 100644 index 00000000..98cd34ab --- /dev/null +++ b/ppmat/models/sgequidiff/constants.py @@ -0,0 +1,312 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +NUM_ELEMENTS: int = 98 +NUM_SPACE_GROUPS: int = 230 +MAX_WYCKOFF_SITES: int = 27 + + +lattice_parameter_ranges = { + "mp_20": { + "min_lattice_length": 2.0, + "max_lattice_length": 133.0, + "min_lattice_angle": 60.0, + "max_lattice_angle": 135.0, + }, + "mpts_52": { + "min_lattice_length": 0.98, + "max_lattice_length": 189.5, + "min_lattice_angle": 60.0, + "max_lattice_angle": 135.0, + }, +} +max_atoms_per_dataset = { + "mp_20": 20, + "mpts_52": 52, +} + +chemical_symbols = [ + # 0 + "X", + # 1 + "H", "He", + # 2 + "Li", "Be", "B", "C", "N", "O", "F", "Ne", + # 3 + "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", + # 4 + "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", + "Ga", "Ge", "As", "Se", "Br", "Kr", + # 5 + "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", + "In", "Sn", "Sb", "Te", "I", "Xe", + # 6 + "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", + "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", + "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", + # 7 + "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", + "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", + "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og", +] + +from ppmat.utils.crystal import OFFSET_LIST + +PRETRAINED_WEIGHT_URLS = { + "mp_20": { + "diffusion": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_diffusion_snapshot.pdparams", + "lattice": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_lattice_snapshot.pdparams", + "space_group": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_space_group_snapshot.pdparams", + "wyckoff": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_wyckoff-transformer_snapshot.pdparams", + }, + "mpts_52": { + "diffusion": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_diffusion_snapshot.pdparams", + "lattice": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_lattice_snapshot.pdparams", + "space_group": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_space_group_snapshot.pdparams", + "wyckoff": "https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_wyckoff-transformer_snapshot.pdparams", + }, +} + +spgroup_data = { + 1: ["aP", False], + 2: ["aP", True], + 3: ["mP", False], + 4: ["mP", False], + 5: ["mC", False], + 6: ["mP", False], + 7: ["mP", False], + 8: ["mC", False], + 9: ["mC", False], + 10: ["mP", True], + 11: ["mP", True], + 12: ["mC", True], + 13: ["mP", True], + 14: ["mP", True], + 15: ["mC", True], + 16: ["oP", False], + 17: ["oP", False], + 18: ["oP", False], + 19: ["oP", False], + 20: ["oC", False], + 21: ["oC", False], + 22: ["oF", False], + 23: ["oI", False], + 24: ["oI", False], + 25: ["oP", False], + 26: ["oP", False], + 27: ["oP", False], + 28: ["oP", False], + 29: ["oP", False], + 30: ["oP", False], + 31: ["oP", False], + 32: ["oP", False], + 33: ["oP", False], + 34: ["oP", False], + 35: ["oC", False], + 36: ["oC", False], + 37: ["oC", False], + 38: ["oA", False], + 39: ["oA", False], + 40: ["oA", False], + 41: ["oA", False], + 42: ["oF", False], + 43: ["oF", False], + 44: ["oI", False], + 45: ["oI", False], + 46: ["oI", False], + 47: ["oP", True], + 48: ["oP", True], + 49: ["oP", True], + 50: ["oP", True], + 51: ["oP", True], + 52: ["oP", True], + 53: ["oP", True], + 54: ["oP", True], + 55: ["oP", True], + 56: ["oP", True], + 57: ["oP", True], + 58: ["oP", True], + 59: ["oP", True], + 60: ["oP", True], + 61: ["oP", True], + 62: ["oP", True], + 63: ["oC", True], + 64: ["oC", True], + 65: ["oC", True], + 66: ["oC", True], + 67: ["oC", True], + 68: ["oC", True], + 69: ["oF", True], + 70: ["oF", True], + 71: ["oI", True], + 72: ["oI", True], + 73: ["oI", True], + 74: ["oI", True], + 75: ["tP", False], + 76: ["tP", False], + 77: ["tP", False], + 78: ["tP", False], + 79: ["tI", False], + 80: ["tI", False], + 81: ["tP", False], + 82: ["tI", False], + 83: ["tP", True], + 84: ["tP", True], + 85: ["tP", True], + 86: ["tP", True], + 87: ["tI", True], + 88: ["tI", True], + 89: ["tP", False], + 90: ["tP", False], + 91: ["tP", False], + 92: ["tP", False], + 93: ["tP", False], + 94: ["tP", False], + 95: ["tP", False], + 96: ["tP", False], + 97: ["tI", False], + 98: ["tI", False], + 99: ["tP", False], + 100: ["tP", False], + 101: ["tP", False], + 102: ["tP", False], + 103: ["tP", False], + 104: ["tP", False], + 105: ["tP", False], + 106: ["tP", False], + 107: ["tI", False], + 108: ["tI", False], + 109: ["tI", False], + 110: ["tI", False], + 111: ["tP", False], + 112: ["tP", False], + 113: ["tP", False], + 114: ["tP", False], + 115: ["tP", False], + 116: ["tP", False], + 117: ["tP", False], + 118: ["tP", False], + 119: ["tI", False], + 120: ["tI", False], + 121: ["tI", False], + 122: ["tI", False], + 123: ["tP", True], + 124: ["tP", True], + 125: ["tP", True], + 126: ["tP", True], + 127: ["tP", True], + 128: ["tP", True], + 129: ["tP", True], + 130: ["tP", True], + 131: ["tP", True], + 132: ["tP", True], + 133: ["tP", True], + 134: ["tP", True], + 135: ["tP", True], + 136: ["tP", True], + 137: ["tP", True], + 138: ["tP", True], + 139: ["tI", True], + 140: ["tI", True], + 141: ["tI", True], + 142: ["tI", True], + 143: ["hP", False], + 144: ["hP", False], + 145: ["hP", False], + 146: ["hR", False], + 147: ["hP", True], + 148: ["hR", True], + 149: ["hP", False], + 150: ["hP", False], + 151: ["hP", False], + 152: ["hP", False], + 153: ["hP", False], + 154: ["hP", False], + 155: ["hR", False], + 156: ["hP", False], + 157: ["hP", False], + 158: ["hP", False], + 159: ["hP", False], + 160: ["hR", False], + 161: ["hR", False], + 162: ["hP", True], + 163: ["hP", True], + 164: ["hP", True], + 165: ["hP", True], + 166: ["hR", True], + 167: ["hR", True], + 168: ["hP", False], + 169: ["hP", False], + 170: ["hP", False], + 171: ["hP", False], + 172: ["hP", False], + 173: ["hP", False], + 174: ["hP", False], + 175: ["hP", True], + 176: ["hP", True], + 177: ["hP", False], + 178: ["hP", False], + 179: ["hP", False], + 180: ["hP", False], + 181: ["hP", False], + 182: ["hP", False], + 183: ["hP", False], + 184: ["hP", False], + 185: ["hP", False], + 186: ["hP", False], + 187: ["hP", False], + 188: ["hP", False], + 189: ["hP", False], + 190: ["hP", False], + 191: ["hP", True], + 192: ["hP", True], + 193: ["hP", True], + 194: ["hP", True], + 195: ["cP", False], + 196: ["cF", False], + 197: ["cI", False], + 198: ["cP", False], + 199: ["cI", False], + 200: ["cP", True], + 201: ["cP", True], + 202: ["cF", True], + 203: ["cF", True], + 204: ["cI", True], + 205: ["cP", True], + 206: ["cI", True], + 207: ["cP", False], + 208: ["cP", False], + 209: ["cF", False], + 210: ["cF", False], + 211: ["cI", False], + 212: ["cP", False], + 213: ["cP", False], + 214: ["cI", False], + 215: ["cP", False], + 216: ["cF", False], + 217: ["cI", False], + 218: ["cP", False], + 219: ["cF", False], + 220: ["cI", False], + 221: ["cP", True], + 222: ["cP", True], + 223: ["cP", True], + 224: ["cP", True], + 225: ["cF", True], + 226: ["cF", True], + 227: ["cF", True], + 228: ["cF", True], + 229: ["cI", True], + 230: ["cI", True], +} diff --git a/ppmat/models/sgequidiff/data_utils.py b/ppmat/models/sgequidiff/data_utils.py new file mode 100644 index 00000000..c1facede --- /dev/null +++ b/ppmat/models/sgequidiff/data_utils.py @@ -0,0 +1,985 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Crystal data utilities: coordinate conversion, graph construction, space-group lattice params, +diffusion helpers: hull test, ASU wrapping, score computation. +""" +from typing import Tuple, Optional, Union + +import numpy as np +import paddle +from scipy.spatial import ConvexHull + +import ppmat.models.sgequidiff.global_vars as global_vars +from ppmat.models.sgequidiff.constants import OFFSET_LIST, MAX_WYCKOFF_SITES +from ppmat.utils.scatter import scatter +from ppmat.utils.crystal import lattice_params_to_matrix_paddle +from ppmat.utils.crystal import frac_to_cart_coords as _crystal_frac_to_cart + + +def _scatter_min_with_argmin_gpu_safe( + src: paddle.Tensor, + index: paddle.Tensor, + dim_size: Optional[int] = None, +) -> Tuple[paddle.Tensor, paddle.Tensor]: + """ + GPU-safe scatter_min + argmin. + """ + if dim_size is None: + dim_size = int(index.max().item()) + 1 + + n = src.shape[0] + sort_key = index.cast(paddle.float64) * (float(n) + 1.0) + src.cast(paddle.float64) + sorted_order = paddle.argsort(sort_key) + sorted_index = index[sorted_order] + sorted_src = src[sorted_order] + + group_first = paddle.concat([ + paddle.to_tensor([True], dtype=paddle.bool), + sorted_index[1:] != sorted_index[:-1], + ]) + first_pos = paddle.nonzero(group_first).squeeze(1) + group_ids = sorted_index[first_pos] + argmin_orig_idx = sorted_order[first_pos] + min_vals_group = sorted_src[first_pos] + + min_vals = paddle.full([dim_size], float('inf'), dtype=src.dtype) + argmin = paddle.full([dim_size], dim_size, dtype=paddle.int64) + min_vals = paddle.scatter(min_vals, group_ids, min_vals_group) + argmin = paddle.scatter(argmin, group_ids, argmin_orig_idx) + return min_vals, argmin + +def _scatter_min_indices_gpu_safe( + ov_row: paddle.Tensor, + ov_col: paddle.Tensor, + n_total: int, +) -> paddle.Tensor: + """ + Return smallest ov_col per ov_row. GPU-safe. Missing rows return self-index. + """ + if ov_row.shape[0] == 0: + return paddle.arange(n_total, dtype=paddle.int64) + + sort_key = ov_row.cast(paddle.int64) * n_total + ov_col.cast(paddle.int64) + sorted_order = paddle.argsort(sort_key) + sorted_row = ov_row[sorted_order] + sorted_col = ov_col[sorted_order] + + row_first = paddle.concat([ + paddle.to_tensor([True], dtype=paddle.bool), + sorted_row[1:] != sorted_row[:-1], + ]) + first_pos = paddle.nonzero(row_first).squeeze(1) + unique_rows = sorted_row[first_pos] + min_cols = sorted_col[first_pos] + + result = paddle.arange(n_total, dtype=paddle.float32) + result = paddle.scatter(result, unique_rows, min_cols.cast(paddle.float32)) + return result.cast(paddle.int64) + +def scatter_min_with_argmin( + src: paddle.Tensor, + index: paddle.Tensor, + dim_size: Optional[int] = None, +) -> Tuple[paddle.Tensor, paddle.Tensor]: + """ + scatter_min + argmin. GPU-safe pure Paddle impl. + """ + return _scatter_min_with_argmin_gpu_safe(src, index, dim_size) + + +def frac_to_cart_coords( + frac_coords: paddle.Tensor, + num_atoms_per_crystal: paddle.Tensor, + lattice_lengths: Optional[paddle.Tensor] = None, + lattice_angles: Optional[paddle.Tensor] = None, + lattice_matrix: Optional[paddle.Tensor] = None, +) -> paddle.Tensor: + """Fractional -> Cartesian coordinates.""" + if lattice_matrix is None: + lattice_matrix = lattice_params_to_matrix_paddle(lattice_lengths, lattice_angles) + return _crystal_frac_to_cart(frac_coords, num_atoms_per_crystal, lattices=lattice_matrix) + + +def lattice_transform_and_log_prob_mask( + spacegroup: int, + device: str = "cpu", +) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Return transform matrices and mask for space-group constrained lattice params. + """ + if 1 <= spacegroup <= 2: + length_matrix = paddle.eye(3) + angle_matrix = paddle.eye(3) + angle_vector = paddle.zeros([3]) + log_prob_mask = paddle.ones([6]) + elif 3 <= spacegroup <= 15: + length_matrix = paddle.eye(3) + angle_matrix = paddle.to_tensor( + [[0.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 0.0]] + ) + angle_vector = paddle.to_tensor([90.0, 0.0, 90.0]) + log_prob_mask = paddle.to_tensor([1.0, 1.0, 1.0, 0.0, 1.0, 0.0]) + elif 16 <= spacegroup <= 74: + length_matrix = paddle.eye(3) + angle_matrix = paddle.zeros([3, 3]) + angle_vector = paddle.to_tensor([90.0, 90.0, 90.0]) + log_prob_mask = paddle.to_tensor([1.0, 1.0, 1.0, 0.0, 0.0, 0.0]) + elif 75 <= spacegroup <= 142: + length_matrix = paddle.to_tensor( + [[1.0, 1.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 1.0]] + ) + angle_matrix = paddle.zeros([3, 3]) + angle_vector = paddle.to_tensor([90.0, 90.0, 90.0]) + log_prob_mask = paddle.to_tensor([1.0, 0.0, 1.0, 0.0, 0.0, 0.0]) + elif 143 <= spacegroup <= 194: + length_matrix = paddle.to_tensor( + [[1.0, 1.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 1.0]] + ) + angle_matrix = paddle.zeros([3, 3]) + angle_vector = paddle.to_tensor([90.0, 90.0, 120.0]) + log_prob_mask = paddle.to_tensor([1.0, 0.0, 1.0, 0.0, 0.0, 0.0]) + elif 195 <= spacegroup <= 230: + length_matrix = paddle.to_tensor( + [[1.0, 1.0, 1.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] + ) + angle_matrix = paddle.zeros([3, 3]) + angle_vector = paddle.to_tensor([90.0, 90.0, 90.0]) + log_prob_mask = paddle.to_tensor([1.0, 0.0, 0.0, 0.0, 0.0, 0.0]) + else: + raise AttributeError(f"Invalid space group: {spacegroup}") + return length_matrix, angle_matrix, angle_vector, log_prob_mask + + +def primitive_lattice_matrix_from_conventional_lattice_params( + space_group_indices: paddle.Tensor, + conventional_lattice_lengths: Optional[paddle.Tensor] = None, + conventional_lattice_angles: Optional[paddle.Tensor] = None, + conventional_lattice_matrix: Optional[paddle.Tensor] = None, +) -> paddle.Tensor: + """ + Compute primitive lattice matrix from conventional lattice params. + """ + if conventional_lattice_matrix is None: + conventional_lattice_matrix = lattice_params_to_matrix_paddle( + conventional_lattice_lengths, conventional_lattice_angles + ) + P_matrices = global_vars.conventional_to_primitive_P_matrices[space_group_indices] + return paddle.bmm(P_matrices, conventional_lattice_matrix) + +def construct_fully_connected_graphs_with_periodic_boundaries( + cart_coords: paddle.Tensor, + lattice_matrix: paddle.Tensor, + num_nodes_per_crystal: paddle.Tensor, + break_minimum_edge_ties: bool = False, +) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Build fully-connected graph with PBC (minimum image convention). + """ + batch_size = num_nodes_per_crystal.shape[0] + atom_pos = cart_coords + + num_atoms_per_crystal_sqr = (num_nodes_per_crystal ** 2).cast(paddle.int64) + + first_node_index_per_crystal = ( + paddle.cumsum(num_nodes_per_crystal, axis=0) - num_nodes_per_crystal + ) + first_node_index_per_crystal_expand = paddle.repeat_interleave( + first_node_index_per_crystal, num_atoms_per_crystal_sqr + ) + num_atoms_per_crystal_expand = paddle.repeat_interleave( + num_nodes_per_crystal, num_atoms_per_crystal_sqr + ) + + num_atom_pairs = paddle.sum(num_atoms_per_crystal_sqr) + index_sqr_offset = ( + paddle.cumsum(num_atoms_per_crystal_sqr, axis=0) - num_atoms_per_crystal_sqr + ) + index_sqr_offset = paddle.repeat_interleave(index_sqr_offset, num_atoms_per_crystal_sqr) + atom_count_sqr = paddle.arange(int(num_atom_pairs.item())) - index_sqr_offset + + destination_index = ( + paddle.floor_divide(atom_count_sqr, num_atoms_per_crystal_expand) + + first_node_index_per_crystal_expand + ) + source_index = ( + atom_count_sqr % num_atoms_per_crystal_expand + + first_node_index_per_crystal_expand + ) + map_edge_to_crystal = paddle.arange(batch_size).repeat_interleave( + num_atoms_per_crystal_sqr, axis=0 + ) + + n_edges_per_crystal_before_masking = num_atoms_per_crystal_sqr + + source_position = atom_pos[source_index] + destination_position = atom_pos[destination_index] + + num_supercell_images = len(OFFSET_LIST) + supercell_frac_offsets = paddle.to_tensor(OFFSET_LIST, dtype=paddle.float32) + batch_supercell_frac_offsets = supercell_frac_offsets.unsqueeze(0).expand( + [batch_size, num_supercell_images, 3] + ) + pbc_frac_offsets_per_source_atom = paddle.repeat_interleave( + batch_supercell_frac_offsets, n_edges_per_crystal_before_masking, axis=0 + ) + + pbc_cart_offsets_per_source_atom = paddle.bmm( + pbc_frac_offsets_per_source_atom, + paddle.repeat_interleave( + lattice_matrix, n_edges_per_crystal_before_masking, axis=0 + ), + ) + + destination_position = destination_position.unsqueeze(1).expand([-1, num_supercell_images, -1]) + source_position = ( + source_position.unsqueeze(1).expand([-1, num_supercell_images, -1]) + + pbc_cart_offsets_per_source_atom + ) + + source_index = source_index.unsqueeze(1).expand([-1, num_supercell_images]) + destination_index = destination_index.unsqueeze(1).expand([-1, num_supercell_images]) + map_edge_to_crystal = map_edge_to_crystal.unsqueeze(1).expand([-1, num_supercell_images]) + + inter_atom_distances = (source_position - destination_position).norm(axis=-1) + + mask = paddle.logical_or( + source_index != destination_index, + inter_atom_distances > 1e-5, + ) + + destination_index = destination_index[mask] + source_index = source_index[mask] + map_edge_to_crystal = map_edge_to_crystal[mask] + pbc_frac_offsets_per_source_atom = pbc_frac_offsets_per_source_atom.reshape( + [-1, 3] + )[mask.reshape([-1])] + pbc_cart_offsets_per_source_atom = pbc_cart_offsets_per_source_atom.reshape( + [-1, 3] + )[mask.reshape([-1])] + + source_position_flat = atom_pos[source_index] + destination_position_flat = atom_pos[destination_index] + inter_atom_distances = ( + destination_position_flat + - source_position_flat + - pbc_cart_offsets_per_source_atom + ).norm(axis=-1) + + ( + destination_index, + source_index, + pbc_frac_offsets_per_source_atom, + num_edges_per_crystal, + ) = get_smallest_edge_per_primal_node_pair( + dst_idx=destination_index, + src_idx=source_index, + map_edge_to_crystal=map_edge_to_crystal, + inter_atom_distances=inter_atom_distances, + pbc_frac_offsets_per_source_atom=pbc_frac_offsets_per_source_atom, + num_nodes_per_crystal=num_nodes_per_crystal, + break_minimum_edge_ties=break_minimum_edge_ties, + ) + return ( + destination_index, + source_index, + pbc_frac_offsets_per_source_atom, + num_edges_per_crystal, + ) + +def get_smallest_edge_per_primal_node_pair( + dst_idx: paddle.Tensor, + src_idx: paddle.Tensor, + map_edge_to_crystal: paddle.Tensor, + inter_atom_distances: paddle.Tensor, + pbc_frac_offsets_per_source_atom: paddle.Tensor, + num_nodes_per_crystal: paddle.Tensor, + break_minimum_edge_ties: bool, +) -> Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor, paddle.Tensor]: + """ + Keep minimum edge per node pair (minimum image convention). + """ + edges = paddle.stack([dst_idx, src_idx], axis=-1) + unique_edges, map_edge_to_unique = paddle.unique(edges, axis=0, return_inverse=True) + + min_inter_atom_distances, smallest_edge_idxs = scatter_min_with_argmin( + src=inter_atom_distances, + index=map_edge_to_unique, + dim_size=unique_edges.shape[0], + ) + + batch_size = num_nodes_per_crystal.shape[0] + + if break_minimum_edge_ties: + edges = edges[smallest_edge_idxs] + pbc_frac_offsets_per_source_atom = pbc_frac_offsets_per_source_atom[smallest_edge_idxs] + num_edges_per_crystal = (num_nodes_per_crystal ** 2).cast(paddle.int64) + else: + cutoff_distances = 1e-4 + min_inter_atom_distances[map_edge_to_unique] + keep_edge_mask = inter_atom_distances < cutoff_distances + indices_to_keep = paddle.nonzero(keep_edge_mask).reshape([-1]) + + edges = edges[indices_to_keep] + pbc_frac_offsets_per_source_atom = pbc_frac_offsets_per_source_atom[indices_to_keep] + + num_edges_per_crystal = scatter( + src=paddle.ones([edges.shape[0]], dtype=paddle.float32), + index=map_edge_to_crystal[indices_to_keep], + dim_size=batch_size, + reduce="sum", + ).cast(paddle.int64) + + dst_idx = edges[:, 0] + src_idx = edges[:, 1] + return dst_idx, src_idx, pbc_frac_offsets_per_source_atom, num_edges_per_crystal + +def ocp_get_pbc_distances( + coords: paddle.Tensor, + source_id: paddle.Tensor, + destination_id: paddle.Tensor, + lattice: paddle.Tensor, + pbc_frac_offsets_per_source_node: paddle.Tensor, + num_edges_per_crystal: paddle.Tensor, + return_offsets: bool = False, + return_distance_vec: bool = False, +) -> dict: + """Compute interatomic distances under PBC.""" + neighbors = num_edges_per_crystal.cast(paddle.int64) + lattice = paddle.repeat_interleave(lattice, neighbors, axis=0) + offsets = ( + pbc_frac_offsets_per_source_node.cast(paddle.float32) + .unsqueeze(1) + .bmm(lattice.cast(paddle.float32)) + .reshape([-1, 3]) + ) + distance_vectors = coords[source_id] + offsets - coords[destination_id] + distances = distance_vectors.norm(axis=-1) + edge_index = paddle.stack([source_id, destination_id], axis=0) + + out = {"edge_index": edge_index, "distances": distances} + if return_distance_vec: + out["distance_vec"] = distance_vectors + if return_offsets: + out["offsets"] = offsets + return out + + +def batched_convert_asu_frac_coords_to_primitive_cartesian_coords( + asu_frac_coords: paddle.Tensor, + asu_element_indices: paddle.Tensor, + asu_wyckoff_indices: paddle.Tensor, + n_coords_per_asu: paddle.Tensor, + conventional_lattice_matrix: paddle.Tensor, + space_group_indices: paddle.Tensor, + return_cartesian_coords: bool = True, + return_node_is_original: bool = False, + map_frac_coords_to_0_1_unit_cell: bool = True, + get_primitive_cell: bool = True, +) -> tuple: + """ + Batch expand ASU fractional coords to primitive cell Cartesian coords. + """ + batch_size = n_coords_per_asu.shape[0] + num_asu_nodes_per_crystal = n_coords_per_asu + + conventional_to_primitive_transformations = ( + global_vars.conventional_to_primitive_invP_matrices[space_group_indices] + ) + + padded_gc_mats = global_vars.padded_general_wyckoff_matrices[space_group_indices] + padded_gc_trans = global_vars.padded_general_wyckoff_translations[space_group_indices] + padded_gc_mask = global_vars.padded_general_wyckoff_ops_mask[space_group_indices] + general_wyckoff_multiplicity_per_crystal = padded_gc_mask.cast(paddle.int64).sum(axis=1) + + # expand ops to each ASU atom + n_total_asu = asu_frac_coords.shape[0] + + def _repeat_interleave_along_asu(tensor_B_X): + if tensor_B_X.dtype == paddle.bool: + return paddle.repeat_interleave( + tensor_B_X.cast(paddle.int32), num_asu_nodes_per_crystal, axis=0 + ).cast(paddle.bool) + return paddle.repeat_interleave( + tensor_B_X, num_asu_nodes_per_crystal, axis=0 + ) + + padded_gc_mats = _repeat_interleave_along_asu(padded_gc_mats) + padded_gc_trans = _repeat_interleave_along_asu(padded_gc_trans) + padded_gc_mask = _repeat_interleave_along_asu(padded_gc_mask) + + stacked_gc_mats = padded_gc_mats[padded_gc_mask].reshape([-1, 3, 3]) + stacked_gc_trans = padded_gc_trans[ + padded_gc_mask.unsqueeze(-1).unsqueeze(-1).expand_as(padded_gc_trans) + ].reshape([-1, 1, 3]) + + # orbit ASU atoms to conventional cell + asu_multiplicity_per_asu_atom = general_wyckoff_multiplicity_per_crystal.repeat_interleave( + num_asu_nodes_per_crystal, axis=0 + ) + asu_frac_coords_repeated = asu_frac_coords.repeat_interleave( + asu_multiplicity_per_asu_atom, axis=0 + ).unsqueeze(1) + + conventional_frac_coords = ( + paddle.bmm(asu_frac_coords_repeated, stacked_gc_mats) + stacked_gc_trans + ) + if map_frac_coords_to_0_1_unit_cell: + conventional_frac_coords = conventional_frac_coords % 1.0 + + if get_primitive_cell: + stacked_c2p = paddle.repeat_interleave( + conventional_to_primitive_transformations, + num_asu_nodes_per_crystal * general_wyckoff_multiplicity_per_crystal, + axis=0, + ) + primitive_frac_coords = paddle.bmm( + conventional_frac_coords, stacked_c2p + ).squeeze(1) + else: + primitive_frac_coords = conventional_frac_coords.reshape([-1, 3]) + + if map_frac_coords_to_0_1_unit_cell: + primitive_frac_coords = primitive_frac_coords % 1.0 + + map_node_to_crystal = paddle.arange(batch_size).repeat_interleave( + num_asu_nodes_per_crystal * general_wyckoff_multiplicity_per_crystal, axis=0 + ) + + # de-duplicate overlapping atoms + orbit_size_per_asu = asu_multiplicity_per_asu_atom + orbit_size_sqr = (orbit_size_per_asu ** 2).cast(paddle.int64) + + first_asu_atom_index_per_orbit = ( + paddle.cumsum(orbit_size_per_asu, axis=0) - orbit_size_per_asu + ) + first_idx_expand = paddle.repeat_interleave(first_asu_atom_index_per_orbit, orbit_size_sqr) + orbit_size_expand = paddle.repeat_interleave(orbit_size_per_asu, orbit_size_sqr) + + if return_node_is_original: + node_is_original = paddle.zeros( + [primitive_frac_coords.shape[0]], dtype=paddle.bool + ) + node_is_original[first_asu_atom_index_per_orbit] = True + + num_atom_pairs = orbit_size_sqr.sum().item() + index_sqr_offset = ( + paddle.cumsum(orbit_size_sqr, axis=0) - orbit_size_sqr + ).repeat_interleave(orbit_size_sqr) + atom_pair_indices = paddle.arange(int(num_atom_pairs)) - index_sqr_offset + + row_index = paddle.floor_divide(atom_pair_indices, orbit_size_expand) + first_idx_expand + col_index = atom_pair_indices % orbit_size_expand + first_idx_expand + + row_coords = primitive_frac_coords[row_index] + col_coords = primitive_frac_coords[col_index] + + overlapping_mask = paddle.all( + paddle.abs( + (row_coords - col_coords + 0.5) % 1.0 - 0.5 + ) < 1e-6, axis=1 + ) + + overlapping_col = col_index[overlapping_mask] + overlapping_row = row_index[overlapping_mask] + + min_col_per_row = _scatter_min_indices_gpu_safe( + overlapping_row, overlapping_col, primitive_frac_coords.shape[0] + ) + unique_non_overlapping_atom_indices = paddle.unique(min_col_per_row) + + primitive_frac_coords = primitive_frac_coords[unique_non_overlapping_atom_indices] + map_node_to_crystal = map_node_to_crystal[unique_non_overlapping_atom_indices] + if return_node_is_original: + node_is_original = node_is_original[unique_non_overlapping_atom_indices] + + num_prim_nodes_per_crystal = scatter( + src=paddle.ones([map_node_to_crystal.shape[0]], dtype=paddle.int64), + index=map_node_to_crystal, + dim_size=batch_size, + reduce="sum", + ) + assert num_prim_nodes_per_crystal.shape[0] == batch_size + + # get Wyckoff and element indices from ASU + map_prim_to_asu = paddle.arange(asu_frac_coords.shape[0]).repeat_interleave( + asu_multiplicity_per_asu_atom, axis=0 + )[unique_non_overlapping_atom_indices] + primitive_wyckoff_indices = asu_wyckoff_indices[map_prim_to_asu] + primitive_element_indices = asu_element_indices[map_prim_to_asu] + asu_frac_coords_of_prim_atoms = asu_frac_coords[map_prim_to_asu] + + # compute primitive lattice matrix + primitive_lattice_matrix = primitive_lattice_matrix_from_conventional_lattice_params( + space_group_indices=space_group_indices, + conventional_lattice_matrix=conventional_lattice_matrix, + ) + + if return_cartesian_coords: + out_coords = frac_to_cart_coords( + primitive_frac_coords, + num_prim_nodes_per_crystal, + lattice_matrix=primitive_lattice_matrix, + ) + else: + out_coords = primitive_frac_coords + + if return_node_is_original: + return ( + out_coords, + primitive_element_indices, + primitive_wyckoff_indices, + num_prim_nodes_per_crystal, + primitive_lattice_matrix, + map_prim_to_asu, + node_is_original, + asu_frac_coords_of_prim_atoms, + ) + else: + return ( + out_coords, + primitive_element_indices, + primitive_wyckoff_indices, + num_prim_nodes_per_crystal, + primitive_lattice_matrix, + map_prim_to_asu, + asu_frac_coords_of_prim_atoms, + ) + + +def _scatter_argmax_gpu_safe( + src: paddle.Tensor, + index: paddle.Tensor, + dim_size: int, +) -> paddle.Tensor: + """ + Return global indices of original elements that maximize src per group. + Pure Paddle implementation, GPU safe (equivalent to torch_scatter.scatter_max argmax version). + """ + n = src.shape[0] + sort_key = index.cast(paddle.float64) * (float(n) + 1.0) - src.cast(paddle.float64) + sorted_order = paddle.argsort(sort_key) + sorted_index = index[sorted_order] + + group_first = paddle.concat([ + paddle.to_tensor([True], dtype=paddle.bool), + sorted_index[1:] != sorted_index[:-1], + ]) + first_pos = paddle.nonzero(group_first).squeeze(1) + group_ids = sorted_index[first_pos] + argmax_orig_idx = sorted_order[first_pos] + + result = paddle.zeros([dim_size], dtype=paddle.int64) + result = paddle.scatter(result, group_ids, argmax_orig_idx) + return result + +def atoms_are_in_hull( + supercell_frac_coords: paddle.Tensor, + hull_equations: paddle.Tensor, + epsilon: float = -1e-5, +) -> paddle.Tensor: + """ + Check if each point in supercell is inside Wyckoff shape hull. + """ + n_atoms, n_images, _ = supercell_frac_coords.shape + n_shapes = hull_equations.shape[1] + n_bounds = hull_equations.shape[2] + + coords_flat = supercell_frac_coords.reshape([-1, 3]) + hulls_expanded = hull_equations.unsqueeze(1).expand( + [n_atoms, n_images, n_shapes, n_bounds, 4] + ).reshape([n_atoms * n_images, n_shapes, n_bounds, 4]) + + normals = hulls_expanded[..., :3] + offsets = hulls_expanded[..., 3] + + # (n*img, 1, 1, 3) @ (n*img, n_shapes, n_bounds, 3) -> sum + dots = ( + coords_flat[:, None, None, :] * normals + ).sum(axis=-1) + + inside = (dots < -offsets - epsilon).all(axis=-1) + return inside.reshape([n_atoms, n_images, n_shapes]) + + +def get_wyckoff_shape_hull_equations() -> Tuple[paddle.Tensor, paddle.Tensor]: + """ + Compute hull equations for each 0/1/2/3D Wyckoff shape (bounded shapes included). + """ + asu_wyckoff_dict = global_vars.asu_wyckoff_dict + max_num_shape_bounds = max(2, 5, global_vars.max_simplicial_hull_facets) + + padded_hull_equations = -1.0 * paddle.nn.functional.one_hot( + paddle.to_tensor(3), num_classes=4 + ).unsqueeze(0).unsqueeze(0).unsqueeze(0).unsqueeze(0).expand( + [230, MAX_WYCKOFF_SITES, global_vars.max_shapes_per_wyckoff, max_num_shape_bounds, 4] + ).cast(paddle.float32).clone() + + mask_padded_hull_equations = paddle.zeros( + [230, MAX_WYCKOFF_SITES, global_vars.max_shapes_per_wyckoff], + dtype=paddle.bool, + ) + + for sg_num in range(1, 231): + sg_dict = asu_wyckoff_dict[str(sg_num)] + for wp_idx, wp_letter in enumerate(sg_dict["ordered_wyckoff_letters"]): + wp_dict = sg_dict[wp_letter] + dim = int(wp_dict["dim"]) + + if dim == 0: + shape_idx = 0 + mask_padded_hull_equations[sg_num - 1, wp_idx, shape_idx] = True + vertex = wp_dict["vertices"].astype("float64").reshape(-1) + eps = 1e-4 + hull_equations = np.zeros((6, 4)) + hull_equations[:3, :3] = np.eye(3) + hull_equations[3:, :3] = -np.eye(3) + hull_equations[:3, -1] = -(vertex + eps) + hull_equations[3:, -1] = -(-vertex + eps) + padded_hull_equations[sg_num - 1, wp_idx, shape_idx, :6] = paddle.to_tensor( + hull_equations, dtype=paddle.float32 + ) + + elif dim == 1: + for shape_idx, line_segment in enumerate(wp_dict["vertices"].astype("float64")): + mask_padded_hull_equations[sg_num - 1, wp_idx, shape_idx] = True + eps = 1e-4 + line_dir = line_segment[1] - line_segment[0] + line_dir /= np.linalg.norm(line_dir) + normal1 = np.cross(line_dir, np.random.rand(3))[np.newaxis, :] + normal1 /= np.linalg.norm(normal1) + normal2 = np.cross(line_dir, normal1) + normal2 /= np.linalg.norm(normal2) + p1 = eps * normal1 + p2 = eps * normal2 + bounding_polytope = np.concatenate([ + line_segment + (p1 + p2), + line_segment + (p1 - p2), + line_segment + (-p1 + p2), + line_segment + (-p1 - p2), + ], axis=0) + hull = ConvexHull(bounding_polytope) + n_facets = hull.equations.shape[0] + padded_hull_equations[sg_num - 1, wp_idx, shape_idx, :n_facets] = paddle.to_tensor( + hull.equations, dtype=paddle.float32 + ) + + elif dim == 2: + for shape_idx, polygon_vertices in enumerate(wp_dict["vertices"]): + mask_padded_hull_equations[sg_num - 1, wp_idx, shape_idx] = True + polygon_vertices = polygon_vertices.astype("float64") + ab = polygon_vertices[1] - polygon_vertices[0] + ac = polygon_vertices[2] - polygon_vertices[0] + normal = np.cross(ab, ac) + normal /= np.linalg.norm(normal) + bounding = np.concatenate([ + polygon_vertices + 1e-4 * normal, + polygon_vertices - 1e-4 * normal, + ], axis=0) + hull = ConvexHull(bounding) + n_facets = hull.equations.shape[0] + padded_hull_equations[sg_num - 1, wp_idx, shape_idx, :n_facets] = paddle.to_tensor( + hull.equations, dtype=paddle.float32 + ) + + elif dim == 3: + shape_idx = 0 + mask_padded_hull_equations[sg_num - 1, wp_idx, shape_idx] = True + hull = ConvexHull(wp_dict["vertices"].astype("float64")) + n_facets = hull.equations.shape[0] + padded_hull_equations[sg_num - 1, wp_idx, shape_idx, :n_facets] = paddle.to_tensor( + hull.equations, dtype=paddle.float32 + ) + + return padded_hull_equations, mask_padded_hull_equations + + +@paddle.no_grad() +def wrap_frac_coords_into_asu( + frac_coords: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + space_group_indices: paddle.Tensor, + num_atoms_per_asu: paddle.Tensor, + hull_equations: paddle.Tensor, + hull_equations_mask: paddle.Tensor, +) -> Tuple[paddle.Tensor, paddle.Tensor]: + """ + Map noisy fractional coordinates back to canonical ASU via group operations. + """ + n_asu_atoms = frac_coords.shape[0] + frac_coords = frac_coords % 1.0 + + ( + conventional_cell_frac_coords, + _, + _, + _, + _, + map_conventional_to_asu_coord, + _, + ) = batched_convert_asu_frac_coords_to_primitive_cartesian_coords( + asu_frac_coords=frac_coords, + asu_element_indices=paddle.zeros_like(wyckoff_indices), + asu_wyckoff_indices=wyckoff_indices, + n_coords_per_asu=num_atoms_per_asu, + conventional_lattice_matrix=paddle.zeros( + [space_group_indices.shape[0], 3, 3], dtype=paddle.float32 + ), + space_group_indices=space_group_indices, + return_cartesian_coords=False, + get_primitive_cell=False, + ) + + # supercell expansion + inside/outside test + supercell_frac_translations = paddle.to_tensor(OFFSET_LIST, dtype=paddle.float32) + supercell_frac_coords = ( + conventional_cell_frac_coords.unsqueeze(1) + supercell_frac_translations.unsqueeze(0) + ) + hull_eq_expanded = hull_equations[map_conventional_to_asu_coord] + wyckoff_shape_exists = hull_equations_mask[map_conventional_to_asu_coord] + + supercell_in_wyckoff = ( + atoms_are_in_hull(supercell_frac_coords, hull_eq_expanded, epsilon=-1e-5) + & wyckoff_shape_exists.unsqueeze(1) + ) + + supercell_in_any_wyckoff = supercell_in_wyckoff.any(axis=-1) + conv_atom_has_image_in_asu = supercell_in_any_wyckoff.any(axis=-1) + + indices_of_conv_atoms_in_asu = _scatter_argmax_gpu_safe( + src=conv_atom_has_image_in_asu.cast(paddle.float32), + index=map_conventional_to_asu_coord, + dim_size=n_asu_atoms, + ) + assert indices_of_conv_atoms_in_asu.shape[0] == n_asu_atoms + + # select representative conventional atom supercell coords for each ASU atom + supercell_frac_coords_in_asu = supercell_frac_coords[indices_of_conv_atoms_in_asu] + asu_atom_is_inside = supercell_in_wyckoff[indices_of_conv_atoms_in_asu] + supercell_in_any_in_asu = supercell_in_any_wyckoff[indices_of_conv_atoms_in_asu] + + lattice_translation_into_asu_idx = paddle.argmax( + supercell_in_any_in_asu.cast(paddle.float32), axis=-1 + ) + + atom_indices = paddle.arange(n_asu_atoms) + wrapped_asu_frac_coords = supercell_frac_coords_in_asu[ + atom_indices, lattice_translation_into_asu_idx + ] + wrapped_asu_wyckoff_shape_indices = paddle.argmax( + asu_atom_is_inside[atom_indices, lattice_translation_into_asu_idx].cast(paddle.float32), + axis=-1, + ) + + return wrapped_asu_frac_coords, wrapped_asu_wyckoff_shape_indices + +@paddle.no_grad() +def p_asu_wrapped_normal( + noisy_frac_coord: paddle.Tensor, + conventional_frac_coords: paddle.Tensor, + map_conventional_to_asu_frac_coords: paddle.Tensor, + n_lattice_translations: int = 5, + sigma: Union[float, paddle.Tensor] = 1.0, +) -> paddle.Tensor: + """ + Compute isotropic Gaussian sum over equivalent positions in ASU. Without prefactor 1/(2pi*sigma). + """ + t = paddle.arange(-n_lattice_translations, n_lattice_translations + 1, dtype=paddle.float32) + translations = paddle.stack( + paddle.meshgrid(t, t, t, indexing="ij"), axis=-1 + ).reshape([-1, 3]) + + noisy_x_minus_gt = ( + noisy_frac_coord[map_conventional_to_asu_frac_coords].unsqueeze(1) + - (conventional_frac_coords.unsqueeze(1) + translations.unsqueeze(0)) + ) + + diff_sq = (noisy_x_minus_gt ** 2).sum(axis=-1) + gaussian = paddle.exp(-diff_sq / (2 * sigma ** 2)) + p = gaussian.sum(axis=1) + + # scatter: conventional -> ASU + p_asu = scatter( + src=p, + index=map_conventional_to_asu_frac_coords, + dim=0, + dim_size=noisy_frac_coord.shape[0], + reduce="sum", + ) + return p_asu + +@paddle.no_grad() +def d_log_p_asu_wrapped_normal( + noisy_frac_coord: paddle.Tensor, + conventional_frac_coords: paddle.Tensor, + map_conventional_to_asu_frac_coords: paddle.Tensor, + n_lattice_translations: int = 5, + sigma: Union[float, paddle.Tensor] = 1.0, +) -> paddle.Tensor: + """ + Compute gradient of log ASU-wrapped normal probability (i.e. ground truth score). + """ + if isinstance(sigma, float): + sigma_conv = paddle.full([conventional_frac_coords.shape[0], 1], sigma) + else: + sigma_conv = sigma[map_conventional_to_asu_frac_coords].unsqueeze(1) + + t = paddle.arange(-n_lattice_translations, n_lattice_translations + 1, dtype=paddle.float32) + translations = paddle.stack( + paddle.meshgrid(t, t, t, indexing="ij"), axis=-1 + ).reshape([-1, 3]) + + noisy_x_minus_gt = ( + noisy_frac_coord[map_conventional_to_asu_frac_coords].unsqueeze(1) + - (conventional_frac_coords.unsqueeze(1) + translations.unsqueeze(0)) + ) + + diff_sq = (noisy_x_minus_gt ** 2).sum(axis=-1, keepdim=True) + gaussian = paddle.exp(-diff_sq / (2 * sigma_conv.unsqueeze(-1) ** 2)) + numerator = -(gaussian * noisy_x_minus_gt).sum(axis=1) + + n_asu_atoms = noisy_frac_coord.shape[0] + numerator_asu = paddle.stack( + [ + scatter( + src=numerator[:, d], + index=map_conventional_to_asu_frac_coords, + dim=0, + dim_size=n_asu_atoms, + reduce="sum", + ) + for d in range(3) + ], + axis=1, + ) + + denominator = p_asu_wrapped_normal( + noisy_frac_coord, + conventional_frac_coords, + map_conventional_to_asu_frac_coords, + n_lattice_translations, + sigma_conv, + ) * (sigma if isinstance(sigma, float) else sigma ** 2) + return numerator_asu / denominator.unsqueeze(-1) + +def get_space_group_ops_and_conventional_atoms( + frac_coords: paddle.Tensor, + element_indices: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + space_group_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, +) -> tuple: + """ + Get space group operations (mod lattice translation) and de-duplicated conventional cell atoms. + """ + batch_size = n_atoms_per_xtal.shape[0] + + padded_gc_mats = global_vars.padded_general_wyckoff_matrices[space_group_indices] + padded_gc_inv_mats = global_vars.padded_inverse_general_wyckoff_matrices[space_group_indices] + padded_gc_trans = global_vars.padded_general_wyckoff_translations[space_group_indices] + padded_gc_mask = global_vars.padded_general_wyckoff_ops_mask[space_group_indices] + + general_wyckoff_multiplicity = padded_gc_mask.cast(paddle.int64).sum(axis=1) + + padded_gc_mats = paddle.repeat_interleave(padded_gc_mats, n_atoms_per_xtal, axis=0) + padded_gc_inv_mats = paddle.repeat_interleave(padded_gc_inv_mats, n_atoms_per_xtal, axis=0) + padded_gc_trans = paddle.repeat_interleave(padded_gc_trans, n_atoms_per_xtal, axis=0) + padded_gc_mask = paddle.repeat_interleave( + padded_gc_mask.cast(paddle.int32), n_atoms_per_xtal, axis=0 + ).cast(paddle.bool) + + stacked_mats = padded_gc_mats[padded_gc_mask].reshape([-1, 3, 3]) + stacked_inv_mats = padded_gc_inv_mats[padded_gc_mask].reshape([-1, 3, 3]) + stacked_trans = padded_gc_trans[ + padded_gc_mask.unsqueeze(-1).unsqueeze(-1).expand_as(padded_gc_trans) + ].reshape([-1, 1, 3]) + + mult_per_asu_atom = general_wyckoff_multiplicity.repeat_interleave(n_atoms_per_xtal, axis=0) + + frac_coords_repeated = frac_coords.repeat_interleave( + mult_per_asu_atom, axis=0 + ).unsqueeze(1) + + conventional_frac_coords_with_dupes = ( + paddle.bmm(frac_coords_repeated, stacked_mats) + stacked_trans + ) % 1.0 + conventional_frac_coords = conventional_frac_coords_with_dupes.reshape([-1, 3]) + + # de-duplicate + orbit_size_per_asu = mult_per_asu_atom + orbit_size_sqr = (orbit_size_per_asu ** 2).cast(paddle.int64) + first_idx = paddle.cumsum(orbit_size_per_asu, axis=0) - orbit_size_per_asu + first_idx_expand = paddle.repeat_interleave(first_idx, orbit_size_sqr) + orbit_size_expand = paddle.repeat_interleave(orbit_size_per_asu, orbit_size_sqr) + + n_pairs = int(orbit_size_sqr.sum().item()) + offset = (paddle.cumsum(orbit_size_sqr, axis=0) - orbit_size_sqr).repeat_interleave(orbit_size_sqr) + pair_ids = paddle.arange(n_pairs) - offset + row_ids = paddle.floor_divide(pair_ids, orbit_size_expand) + first_idx_expand + col_ids = pair_ids % orbit_size_expand + first_idx_expand + + row_coords = conventional_frac_coords[row_ids] + col_coords = conventional_frac_coords[col_ids] + overlapping = paddle.all( + paddle.abs((row_coords - col_coords + 0.5) % 1.0 - 0.5) < 1e-6, axis=1 + ) + + ov_col = col_ids[overlapping] + ov_row = row_ids[overlapping] + min_col_per_row = _scatter_min_indices_gpu_safe(ov_row, ov_col, conventional_frac_coords.shape[0]) + + unique_non_overlapping_atom_indices, inverse_indices = paddle.unique( + min_col_per_row, return_inverse=True + ) + + conventional_frac_coords = conventional_frac_coords[unique_non_overlapping_atom_indices] + + map_conv_to_asu_with_dupes = paddle.arange(frac_coords.shape[0]).repeat_interleave( + orbit_size_per_asu, axis=0 + ) + map_conventional_to_asu_atom = map_conv_to_asu_with_dupes[unique_non_overlapping_atom_indices] + conventional_wyckoff_indices = wyckoff_indices[map_conventional_to_asu_atom] + conventional_element_indices = element_indices[map_conventional_to_asu_atom] + + return ( + stacked_inv_mats, # A_ops: (n_general_wyckoff_ops, 3, 3) + stacked_trans, # t_ops: (n_general_wyckoff_ops, 1, 3) + inverse_indices, # (n_general_wyckoff_ops,) + map_conv_to_asu_with_dupes, # (n_general_wyckoff_ops,) + conventional_wyckoff_indices, + conventional_element_indices, + conventional_frac_coords, + unique_non_overlapping_atom_indices, + ) + +def get_wyckoff_projected_gaussian_noise( + space_group_indices: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + wyckoff_shape_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + sigma: Union[float, paddle.Tensor], +) -> paddle.Tensor: + """ + Generate Gaussian noise projected onto Wyckoff subspace. + """ + n_asu_atoms = wyckoff_indices.shape[0] + unprojected_noise = sigma * paddle.randn([n_asu_atoms, 3]) + sg_per_atom = space_group_indices.repeat_interleave(n_atoms_per_xtal, axis=0) + projection_matrices = global_vars.noise_projection_matrices[ + sg_per_atom, wyckoff_indices, wyckoff_shape_indices + ] + projected_noise = paddle.bmm( + unprojected_noise.unsqueeze(1), projection_matrices + ).reshape([-1, 3]) + return projected_noise \ No newline at end of file diff --git a/ppmat/models/sgequidiff/diffusion_model.py b/ppmat/models/sgequidiff/diffusion_model.py new file mode 100644 index 00000000..4151d3d2 --- /dev/null +++ b/ppmat/models/sgequidiff/diffusion_model.py @@ -0,0 +1,546 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""EquivariantDiffusionModel and NoiseScheduler.""" +import dataclasses +from typing import Any, Dict, Optional + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F + +import ppmat.models.sgequidiff.global_vars as global_vars +from ppmat.datasets.asu_crystal import uniformly_sample_point_in_asu_wyckoff_site +from ppmat.models.sgequidiff.data_utils import ( + get_wyckoff_shape_hull_equations, + wrap_frac_coords_into_asu, + d_log_p_asu_wrapped_normal, + get_space_group_ops_and_conventional_atoms, + get_wyckoff_projected_gaussian_noise, +) +from ppmat.models.sgequidiff.non_equivariant_drift_modules import ( + FourierTimeEmbeddings, + TorusMLP, + GNN, + GNNConfig, + CSPNet, + CSPNetConfig, +) +from ppmat.utils.scatter import scatter as paddle_scatter + + +@dataclasses.dataclass +class EquivariantDiffusionModelConfig: + """Diffusion model hyperparameter config.""" + num_wn_lattice_translations: int = 5 + noise_scheduler_num_monte_carlo_samples: int = 10_000 + num_timesteps: int = 1000 + sigma_min: float = 0.002 + sigma_max: float = 0.5 + time_emb_dim: int = 256 + model_type: str = "mlp" # ["mlp", "gnn", "cspnet"] + num_plane_wave_freqs: int = 64 + subsample_group_operations: bool = False + + gnn_config: Optional[GNNConfig] = None + cspnet_config: Optional[CSPNetConfig] = None + noise_scheduler_cfg: Optional[dict] = None + +class EquivariantDiffusionModel(nn.Layer): + """Space-group equivariant diffusion model modeling crystal coords in ASU.""" + + def __init__( + self, + config: Optional[EquivariantDiffusionModelConfig] = None, + num_wn_lattice_translations: int = 5, + noise_scheduler_num_monte_carlo_samples: int = 10_000, + num_timesteps: int = 1000, + sigma_min: float = 0.002, + sigma_max: float = 0.5, + time_emb_dim: int = 256, + model_type: str = "mlp", + num_plane_wave_freqs: int = 64, + subsample_group_operations: bool = False, + gnn_config: Any = None, + cspnet_config: Any = None, + noise_scheduler_cfg: Optional[dict] = None, + ): + if config is None: + if isinstance(gnn_config, dict): + gnn_config = GNNConfig(**gnn_config) + if isinstance(cspnet_config, dict): + cspnet_config = CSPNetConfig(**cspnet_config) + config = EquivariantDiffusionModelConfig( + num_wn_lattice_translations=num_wn_lattice_translations, + noise_scheduler_num_monte_carlo_samples=noise_scheduler_num_monte_carlo_samples, + num_timesteps=num_timesteps, + sigma_min=sigma_min, + sigma_max=sigma_max, + time_emb_dim=time_emb_dim, + model_type=model_type, + num_plane_wave_freqs=num_plane_wave_freqs, + subsample_group_operations=subsample_group_operations, + gnn_config=gnn_config, + cspnet_config=cspnet_config, + noise_scheduler_cfg=noise_scheduler_cfg, + ) + self.validate_config(config) + super().__init__() + self.config = config + self.num_wn_lattice_translations = config.num_wn_lattice_translations + + if config.noise_scheduler_cfg: + from ppmat.schedulers import build_scheduler + self.noise_scheduler = build_scheduler(config.noise_scheduler_cfg) + else: + from ppmat.schedulers.scheduling_asu_ve_sde import ASUVESDEScheduler + self.noise_scheduler = ASUVESDEScheduler( + num_timesteps=config.num_timesteps, + sigma_min=config.sigma_min, + sigma_max=config.sigma_max, + num_lattice_translations=config.num_wn_lattice_translations, + num_monte_carlo_samples=config.noise_scheduler_num_monte_carlo_samples, + ) + self.time_embedder = FourierTimeEmbeddings(dim=config.time_emb_dim) + from ppmat.models.sgequidiff.global_vars import embedding_tools, set_global_embedding_tools + if embedding_tools is None: + set_global_embedding_tools(element_embedding_json_path="cgcnn_atom_init.json") + self.non_equivariant_drift_model = self.get_non_equivariant_drift_module( + config, self.time_embedder + ) + + ( + padded_hull_equations, + mask_padded_hull_equations, + ) = get_wyckoff_shape_hull_equations() + + self.register_buffer("padded_hull_equations", padded_hull_equations) + self.register_buffer("padded_hull_equations_mask", mask_padded_hull_equations) + + self._wyckoff_shape_decomposition_dict = None + + @property + def wyckoff_shape_decomposition_dict(self) -> dict: + """Lazy-load wyckoff_shape_decomposition.pkl.""" + if self._wyckoff_shape_decomposition_dict is None: + import pickle + from ppmat.models.sgequidiff.global_vars import SHAPE_DECOMP_DICT_PATH, _ensure_wyckoff_shape_decomp + _ensure_wyckoff_shape_decomp() + with open(str(SHAPE_DECOMP_DICT_PATH), "rb") as f: + self._wyckoff_shape_decomposition_dict = pickle.load(f) + return self._wyckoff_shape_decomposition_dict + + def compute_loss( + self, + asu_frac_coords: paddle.Tensor, + element_indices: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + space_group_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + wyckoff_shape_indices: paddle.Tensor, + lattice_matrices: paddle.Tensor, + lattice_lengths: paddle.Tensor, + lattice_angles: paddle.Tensor, + ) -> paddle.Tensor: + """Compute training loss (score matching).""" + sampled_timesteps = self.noise_scheduler.uniform_sample_timestep( + batch_size=space_group_indices.shape[0] + ) + time_embeddings = self.time_embedder(sampled_timesteps.cast(paddle.float32)) + + sampled_timesteps = sampled_timesteps.repeat_interleave(n_atoms_per_xtal, axis=0) + time_embeddings = time_embeddings.repeat_interleave(n_atoms_per_xtal, axis=0) + sigmas = self.noise_scheduler.sigmas[sampled_timesteps].detach() + + _sg_per_asu_atom = space_group_indices.repeat_interleave(n_atoms_per_xtal, axis=0) + + with paddle.no_grad(): + projected_noise = get_wyckoff_projected_gaussian_noise( + space_group_indices, + wyckoff_indices, + wyckoff_shape_indices, + n_atoms_per_xtal, + sigmas.unsqueeze(1), + ) + noisy_asu_frac_coords = asu_frac_coords.detach() + projected_noise + + ( + noisy_asu_frac_coords, + wyckoff_shape_indices, + ) = wrap_frac_coords_into_asu( + noisy_asu_frac_coords, + wyckoff_indices, + space_group_indices, + n_atoms_per_xtal, + self.padded_hull_equations[_sg_per_asu_atom, wyckoff_indices].clone(), + self.padded_hull_equations_mask[_sg_per_asu_atom, wyckoff_indices].clone(), + ) + + ( + _, + _, + _, + map_conventional_to_asu_atom, + conventional_wyckoff_indices, + conventional_element_indices, + conventional_frac_coords, + unique_non_overlapping_atom_indices, + ) = get_space_group_ops_and_conventional_atoms( + asu_frac_coords, + element_indices, + wyckoff_indices, + space_group_indices, + n_atoms_per_xtal, + ) + map_unique_conventional_to_asu = map_conventional_to_asu_atom[ + unique_non_overlapping_atom_indices + ] + + ground_truth_scores = d_log_p_asu_wrapped_normal( + noisy_asu_frac_coords, + conventional_frac_coords, + map_unique_conventional_to_asu, + self.num_wn_lattice_translations, + sigmas, + ) + + # Avoid Paddle's AssignOutGradNode issue with shared computation graphs + noisy_asu_frac_coords = noisy_asu_frac_coords.detach() + wyckoff_shape_indices = wyckoff_shape_indices.detach() + ground_truth_scores = ground_truth_scores.detach() + _sg_per_asu_atom = _sg_per_asu_atom.detach() + sampled_timesteps = sampled_timesteps.detach() + + predicted_scores = self.predict_equivariant_vectors( + time_embeddings, + noisy_asu_frac_coords, + element_indices, + wyckoff_indices, + space_group_indices, + n_atoms_per_xtal, + lattice_matrices=lattice_matrices, + lattice_lengths=lattice_lengths, + lattice_angles=lattice_angles, + ) + + score_norms = self.noise_scheduler.sigma_norms[ + _sg_per_asu_atom, wyckoff_indices, sampled_timesteps + ] + loss = F.mse_loss( + predicted_scores, + ground_truth_scores / (score_norms.unsqueeze(1) + 1e-8), + ) + return loss + + @paddle.no_grad() + def sample( + self, + wyckoff_indices: paddle.Tensor, + element_indices: paddle.Tensor, + space_group_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + lattice_matrices: paddle.Tensor, + lattice_lengths: paddle.Tensor, + lattice_angles: paddle.Tensor, + snr: float = 0.4, + max_step_size: float = 1e6, + ) -> paddle.Tensor: + """Variance-exploding Predictor-Corrector SDE sampling.""" + num_asu_atoms: int = wyckoff_indices.shape[0] + num_crystals: int = space_group_indices.shape[0] + time_start: int = self.noise_scheduler.num_timesteps + + space_group_indices_per_atom = space_group_indices.repeat_interleave(n_atoms_per_xtal, axis=0) + + x_T, wyckoff_shape_indices = uniformly_sample_point_in_asu_wyckoff_site( + space_group_numbers=[str(1 + int(sg_idx)) for sg_idx in space_group_indices_per_atom.tolist()], + wyckoff_letters=[chr(97 + int(idx)) if int(idx) <= 25 else chr(39 + int(idx)) for idx in wyckoff_indices.tolist()], + dictionary_of_wyckoffs_in_asu=global_vars.asu_wyckoff_dict, + dictionary_of_wyckoff_shape_decompositions=self.wyckoff_shape_decomposition_dict, + hull_equations_3d=global_vars.asu_hull_equations, n_samples_per_wyckoff=1, + return_sampled_wyckoff_shape_indices=True, + ) + x_T = x_T.squeeze(1) + wyckoff_shape_indices = wyckoff_shape_indices.squeeze(1) + + wyckoff_dims = global_vars.wyckoff_dimension_tensor[space_group_indices_per_atom, wyckoff_indices] + proj_matrices = global_vars.noise_projection_matrices[space_group_indices_per_atom, wyckoff_indices, wyckoff_shape_indices] + + def _predict_and_project(x, sigma_norm): + te = self.time_embedder(paddle.to_tensor([0], dtype=paddle.float32)).expand([num_asu_atoms, -1]) + score = sigma_norm.unsqueeze(1) * self.predict_equivariant_vectors( + te, x, element_indices, wyckoff_indices, space_group_indices, n_atoms_per_xtal, + lattice_matrices=lattice_matrices, lattice_lengths=lattice_lengths, lattice_angles=lattice_angles, + ) + return paddle.bmm(score.unsqueeze(1), proj_matrices).reshape([-1, 3]) + + def _wyckoff_noise(): + return get_wyckoff_projected_gaussian_noise( + space_group_indices, wyckoff_indices, wyckoff_shape_indices, n_atoms_per_xtal, 1.0, + ) + + x_t_plus_1 = x_T + for t in range(time_start - 1, 0, -1): + sn_t1 = self.noise_scheduler.sigma_norms[space_group_indices_per_atom, wyckoff_indices, t + 1] + sn_t = self.noise_scheduler.sigma_norms[space_group_indices_per_atom, wyckoff_indices, t] + + score_pred = _predict_and_project(x_t_plus_1, sn_t1) + x_t = self.noise_scheduler.step_pred(x_t_plus_1, score_pred, t, _wyckoff_noise()) + + score_corr = _predict_and_project(x_t, sn_t) + x_t = self.noise_scheduler.step_correct(x_t, score_corr, _wyckoff_noise(), snr, max_step_size) + + x_t = self.project_point_onto_wyckoff_shape(x_t, space_group_indices_per_atom, wyckoff_indices, wyckoff_shape_indices, wyckoff_dims) + x_t_plus_1 = x_t + + x_final = x_t_plus_1 % 1.0 + x_final, _ = wrap_frac_coords_into_asu( + x_final, + wyckoff_indices, + space_group_indices, + n_atoms_per_xtal, + self.padded_hull_equations[space_group_indices_per_atom, wyckoff_indices], + self.padded_hull_equations_mask[space_group_indices_per_atom, wyckoff_indices], + ) + return x_final.unsqueeze(0) + + def forward(self, batch_data: Dict) -> Dict: + """Training entry: unpack batch, compute loss, return BaseTrainer-compatible dict.""" + from ppmat.models.sgequidiff.data_utils import lattice_params_to_matrix_paddle + + space_group_indices = batch_data["space_group_indices"] + lattice_lengths = batch_data["lattice_lengths"] + lattice_angles = batch_data["lattice_angles"] + lattice_matrices = batch_data.get( + "lattice_matrices", + lattice_params_to_matrix_paddle(lattice_lengths, lattice_angles), + ) + padded_element_indices = batch_data["element_indices"] + padded_wyckoff_indices = batch_data["wyckoff_indices"] + padded_wyckoff_shape_indices = batch_data["wyckoff_shape_indices"] + padded_frac_coords = batch_data["frac_coords"] + atoms_mask = batch_data["atoms_mask"] + + flat_mask = atoms_mask.reshape([-1]) + selected_indices = paddle.nonzero(flat_mask).reshape([-1]) + + batch_size = padded_element_indices.shape[0] + max_atoms = padded_element_indices.shape[1] + selected_xtal_indices = paddle.floor_divide(selected_indices, max_atoms) + n_atoms_per_xtal = paddle.zeros([batch_size], dtype="int64") + n_atoms_per_xtal = paddle.scatter_nd_add( + n_atoms_per_xtal, + selected_xtal_indices.reshape([-1, 1]), + paddle.ones_like(selected_xtal_indices, dtype="int64"), + ) + + element_indices = paddle.gather( + padded_element_indices.reshape([-1]), selected_indices + ) + wyckoff_indices = paddle.gather( + padded_wyckoff_indices.reshape([-1]), selected_indices + ) + wyckoff_shape_indices = paddle.gather( + padded_wyckoff_shape_indices.reshape([-1]), selected_indices + ) + asu_frac_coords = paddle.gather( + padded_frac_coords.reshape([-1, 3]), selected_indices, axis=0 + ) + + loss = self.compute_loss( + asu_frac_coords=asu_frac_coords, + element_indices=element_indices, + wyckoff_indices=wyckoff_indices, + space_group_indices=space_group_indices, + n_atoms_per_xtal=n_atoms_per_xtal, + wyckoff_shape_indices=wyckoff_shape_indices, + lattice_matrices=lattice_matrices, + lattice_lengths=lattice_lengths, + lattice_angles=lattice_angles, + ) + return {"loss_dict": {"loss": loss}} + + def predict_equivariant_vectors( + self, + time_embeddings: paddle.Tensor, + frac_coords: paddle.Tensor, + element_indices: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + space_group_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + lattice_matrices: Optional[paddle.Tensor] = None, + lattice_lengths: Optional[paddle.Tensor] = None, + lattice_angles: Optional[paddle.Tensor] = None, + differentiate_graph_construction: bool = False, + ) -> paddle.Tensor: + """Equivariant vector field: mean(A^-1 @ f(Ax + t)).""" + frac_coords = frac_coords % 1.0 + + ( + A_inv_ops, + t_ops, + inverse_indices, + map_conventional_to_asu_atom, + conventional_wyckoff_indices, + conventional_element_indices, + frac_coords_of_conv_atoms, + unique_non_overlapping_atom_indices, + ) = get_space_group_ops_and_conventional_atoms( + frac_coords, + element_indices, + wyckoff_indices, + space_group_indices, + n_atoms_per_xtal, + ) + + map_asu_atom_to_xtal = paddle.arange(space_group_indices.shape[0]).repeat_interleave( + n_atoms_per_xtal, axis=0 + ) + map_unique_conventional_to_asu = map_conventional_to_asu_atom[ + unique_non_overlapping_atom_indices + ] + + n_conv_atoms_per_xtal = paddle_scatter( + src=paddle.ones([conventional_wyckoff_indices.shape[0]], dtype=paddle.int64), + index=map_asu_atom_to_xtal[map_unique_conventional_to_asu], + dim=0, + dim_size=space_group_indices.shape[0], + reduce="sum", + ) + + non_equivariant_output = self.non_equivariant_drift_model( + frac_coords=frac_coords_of_conv_atoms, + element_indices=conventional_element_indices, + n_atoms_per_xtal=n_conv_atoms_per_xtal, + lattice_matrices=lattice_matrices, + lattice_lengths=lattice_lengths, + lattice_angles=lattice_angles, + time_embeddings=time_embeddings[map_unique_conventional_to_asu], + ) + + src = paddle.bmm( + non_equivariant_output[inverse_indices].unsqueeze(1), + A_inv_ops, + ).squeeze(1) + + vector_field = paddle_scatter( + src=src, + index=map_conventional_to_asu_atom, + dim=0, + dim_size=frac_coords.shape[0], + reduce="mean", + ) + return vector_field + + @paddle.no_grad() + def uniform_prior_log_prob( + self, + wyckoff_indices: paddle.Tensor, + space_group_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + ) -> paddle.Tensor: + """Uniform prior log-probability.""" + sg_per_atom = space_group_indices.repeat_interleave(n_atoms_per_xtal, axis=0) + wyckoff_volumes = global_vars.wyckoff_shape_volumes[ + sg_per_atom, wyckoff_indices + ].sum(axis=-1) + return paddle.where( + wyckoff_volumes == 0.0, + paddle.zeros_like(wyckoff_volumes), + paddle.log(1.0 / wyckoff_volumes), + ) + + @staticmethod + def validate_config(config: EquivariantDiffusionModelConfig) -> None: + assert ( + config.sigma_min > 0.0 + and isinstance(config.time_emb_dim, int) + and config.time_emb_dim > 0 + and config.model_type in ["mlp", "gnn", "cspnet"] + ) + + @staticmethod + def get_non_equivariant_drift_module( + config: EquivariantDiffusionModelConfig, + time_embedder: FourierTimeEmbeddings, + ) -> nn.Layer: + """Create non-equivariant drift module from config.""" + if config.model_type == "mlp": + return TorusMLP(time_embedder, config.num_plane_wave_freqs) + elif config.model_type == "gnn": + return GNN(config.gnn_config, time_embedder) + elif config.model_type == "cspnet": + return CSPNet(config.cspnet_config, time_embedder) + else: + raise AttributeError(f"Unknown model_type: {config.model_type}") + + @staticmethod + def project_point_onto_wyckoff_shape( + points: paddle.Tensor, + space_group_indices_repeated: paddle.Tensor, + wyckoff_indices: paddle.Tensor, + wyckoff_shape_indices: paddle.Tensor, + wyckoff_dims: paddle.Tensor, + ) -> paddle.Tensor: + """Project points to Wyckoff subspace (1D->line, 2D->plane).""" + def project_to_lines(pts, p0s, dirs): + dirs = dirs / (dirs.norm(axis=-1, keepdim=True) + 1e-12) + v = pts - p0s + t = (v * dirs).sum(axis=-1, keepdim=True) + return p0s + t * dirs + + def project_to_planes(pts, p0s, normals): + normals = normals / (normals.norm(axis=-1, keepdim=True) + 1e-12) + v = pts - p0s + dist = (v * normals).sum(axis=-1, keepdim=True) + return pts - dist * normals + + wyckoff_dim_is_1 = (wyckoff_dims == 1) + wyckoff_dim_is_2 = (wyckoff_dims == 2) + + if wyckoff_dim_is_1.any(): + mask = wyckoff_dim_is_1 + pts_1d = project_to_lines( + points[mask], + global_vars.point_per_1d_wyckoff_line[ + space_group_indices_repeated[mask], + wyckoff_indices[mask], + wyckoff_shape_indices[mask], + ], + global_vars.line_directions_of_1d_wyckoffs[ + space_group_indices_repeated[mask], + wyckoff_indices[mask], + wyckoff_shape_indices[mask], + ], + ) + points = paddle.scatter(points, paddle.where(mask)[0], pts_1d, overwrite=True) + + if wyckoff_dim_is_2.any(): + mask = wyckoff_dim_is_2 + pts_2d = project_to_planes( + points[mask], + global_vars.point_per_2d_wyckoff_plane[ + space_group_indices_repeated[mask], + wyckoff_indices[mask], + wyckoff_shape_indices[mask], + ], + global_vars.plane_normals_of_2d_wyckoffs[ + space_group_indices_repeated[mask], + wyckoff_indices[mask], + wyckoff_shape_indices[mask], + ], + ) + points = paddle.scatter(points, paddle.where(mask)[0], pts_2d, overwrite=True) + + return points \ No newline at end of file diff --git a/ppmat/models/sgequidiff/global_vars.py b/ppmat/models/sgequidiff/global_vars.py new file mode 100644 index 00000000..5f4f54e1 --- /dev/null +++ b/ppmat/models/sgequidiff/global_vars.py @@ -0,0 +1,586 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Space group global precomputed variables and EmbeddingTools.""" +import json +import os +from ppmat.utils import logger +from fractions import Fraction +from pathlib import Path +from typing import List, Optional, Tuple, Union + +import numpy as np +import paddle +import paddle.nn.functional as F +from pymatgen.symmetry.groups import SpaceGroup as _PymatgenSpaceGroup +from scipy.spatial import ConvexHull + +from ppmat.models.sgequidiff.constants import ( + MAX_WYCKOFF_SITES, + NUM_ELEMENTS, + NUM_SPACE_GROUPS, +) +from ppmat.models.sgequidiff.constants import spgroup_data + +_THIS_FILE = Path(__file__).resolve() + +_MODULE_DIR = _THIS_FILE.parent + +_ENV_DATA_DIR_STR = os.getenv("SGEQUI_DATA_DIR") +if _ENV_DATA_DIR_STR: + _ENV_DATA_DIR = Path(_ENV_DATA_DIR_STR) + if _ENV_DATA_DIR.exists(): + DATA_DIRECTORY = _ENV_DATA_DIR + else: + logger.info(f"Warning: SGEQUI_DATA_DIR '{_ENV_DATA_DIR}' does not exist, trying fallback paths") +else: + _CANDIDATE_DIRS = [ + _MODULE_DIR / "resources", + ] + + _TARGET_FILE = "wyckoff_positions/clean_wyckoffs_in_asu_v6.json" + DATA_DIRECTORY = None + + for _d in _CANDIDATE_DIRS: + if (_d / _TARGET_FILE).exists(): + DATA_DIRECTORY = _d + break + + if DATA_DIRECTORY is None: + _candidate_paths = "\n".join([f" \u2022 {d}" for d in _CANDIDATE_DIRS]) + raise FileNotFoundError( + f"Cannot find SGEQUI data directory.\n" + f"\nTried paths:\n{_candidate_paths}\n" + f"\nSolutions:\n" + f" 1. Run setup script: python ppmat/models/sgequidiff/setup_data.py\n" + f" 2. Copy data to module directory: {str(_CANDIDATE_DIRS[0])}\n" + f" 3. Set environment variable: export SGEQUI_DATA_DIR=/your/data/path\n" + f" 4. Check if data exists in the directories above\n" + f"\nRequired file: {_TARGET_FILE}" + ) + +from pathlib import Path as _Path + +def _resolve_data_dir() -> _Path: + if DATA_DIRECTORY is None: + raise RuntimeError("DATA_DIRECTORY was not initialized properly") + return DATA_DIRECTORY + +ASU_DICT_PATH: str = (_resolve_data_dir() / "wyckoff_positions/clean_wyckoffs_in_asu_v6.json").as_posix() + +SHAPE_DECOMP_DICT_PATH: Path = _resolve_data_dir() / "wyckoff_shape_decomposition.pkl" + +def _ensure_wyckoff_shape_decomp() -> None: + """Ensure wyckoff_shape_decomposition.pkl exists.""" + if SHAPE_DECOMP_DICT_PATH.exists(): + return + from ppmat.models.sgequidiff.wyckoff_shape_decomp_builder import ( + build_wyckoff_shape_decomposition_dict, + ) + build_wyckoff_shape_decomposition_dict(str(SHAPE_DECOMP_DICT_PATH), ASU_DICT_PATH) + +embedding_tools = None + +def string_to_fraction(string: str) -> Fraction: + return Fraction(string) + +def load_dictionary_of_wyckoff_sites_in_asus( + json_filepath: str = ASU_DICT_PATH, +) -> dict: + """Load Wyckoff site dictionary within ASU.""" + try: + with open(json_filepath) as file: + wyckoffs_dict = json.load(file) + except json.JSONDecodeError as e: + raise json.JSONDecodeError( + f"JSON format error in file {json_filepath}:\n{str(e)}\n" + f"Please check if data file is complete.", + doc=e.doc, + pos=e.pos, + ) from e + + convert_string_array_to_fractions = np.vectorize(string_to_fraction) + for space_group_number in wyckoffs_dict.keys(): + for wyckoff_letter in wyckoffs_dict[space_group_number]["ordered_wyckoff_letters"]: + wyckoff_site_dict = wyckoffs_dict[space_group_number][wyckoff_letter] + wyckoff_dof = int(wyckoff_site_dict["dim"]) + + if wyckoff_dof != 2: + wyckoff_site_dict["vertices"] = convert_string_array_to_fractions( + wyckoff_site_dict["vertices"] + ) + wyckoff_site_dict["vertices_tensor"] = paddle.to_tensor( + wyckoff_site_dict["vertices"].astype("float32"), + dtype=paddle.float32, + ) + else: + all_faces: List[np.ndarray] = [] + all_faces_tensors = [] + for face in wyckoff_site_dict["vertices"]: + face_array = convert_string_array_to_fractions(face) # (n_face_vertices, 3) + all_faces.append(face_array) + all_faces_tensors.append( + paddle.to_tensor(face_array.astype("float32"), dtype=paddle.float32) + ) + wyckoff_site_dict["vertices"] = all_faces + wyckoff_site_dict["vertices_tensors"] = all_faces_tensors + wyckoff_site_dict["dim"] = int(wyckoff_site_dict["dim"]) + + if wyckoff_site_dict["dim"] == 2: + wyckoff_site_dict["plane_coefficients"] = convert_string_array_to_fractions( + wyckoff_site_dict["plane_coefficients"] + ).tolist() + + return wyckoffs_dict + +asu_wyckoff_dict = load_dictionary_of_wyckoff_sites_in_asus(ASU_DICT_PATH) + +padded_general_wyckoff_matrices = paddle.zeros([230, 192, 3, 3]) +padded_inverse_general_wyckoff_matrices = paddle.zeros([230, 192, 3, 3]) +padded_general_wyckoff_translations = paddle.zeros([230, 192, 1, 3]) +padded_general_wyckoff_ops_mask = paddle.zeros([230, 192], dtype=paddle.bool) + +for space_group_number in range(1, 231): + _sg = _PymatgenSpaceGroup.from_int_number(space_group_number) + _ops = list(_sg.symmetry_ops) + + _identity_idx = next( + ( + i for i, op in enumerate(_ops) + if np.allclose(op.rotation_matrix, np.eye(3), atol=1e-6) + and np.allclose(op.translation_vector, np.zeros(3), atol=1e-6) + ), + 0, + ) + if _identity_idx != 0: + _ops = [_ops[_identity_idx]] + [_ops[j] for j in range(len(_ops)) if j != _identity_idx] + + tensor_wyckoff_rotations = [] + tensor_wyckoff_inv_rotations = [] + tensor_wyckoff_translations = [] + for symmetry_rep in _ops: + rotation = paddle.to_tensor( + symmetry_rep.rotation_matrix, dtype=paddle.float32 + ) + tensor_wyckoff_rotations.append(rotation.T) + tensor_wyckoff_inv_rotations.append(paddle.linalg.inv(rotation).T) + tensor_wyckoff_translations.append( + paddle.to_tensor( + symmetry_rep.translation_vector, dtype=paddle.float32 + ).unsqueeze(0) + ) + + tensor_wyckoff_rotations = paddle.stack(tensor_wyckoff_rotations, axis=0) + tensor_wyckoff_inv_rotations = paddle.stack(tensor_wyckoff_inv_rotations, axis=0) + tensor_wyckoff_translations = paddle.stack(tensor_wyckoff_translations, axis=0) + + n_ops = tensor_wyckoff_rotations.shape[0] + padded_general_wyckoff_matrices[space_group_number - 1, :n_ops] = ( + tensor_wyckoff_rotations + ) + padded_inverse_general_wyckoff_matrices[space_group_number - 1, :n_ops] = ( + tensor_wyckoff_inv_rotations + ) + padded_general_wyckoff_translations[space_group_number - 1, :n_ops] = ( + tensor_wyckoff_translations + ) + padded_general_wyckoff_ops_mask[space_group_number - 1, :n_ops] = True + + assert ( + paddle.equal_all( + padded_general_wyckoff_matrices[space_group_number - 1, 0], + paddle.eye(3) + ).item() + and + paddle.equal_all( + padded_general_wyckoff_translations[space_group_number - 1, 0], + paddle.zeros([1, 3]) + ).item() + and + padded_general_wyckoff_ops_mask[space_group_number - 1][0].item() == True + ) + +_eye3 = paddle.to_tensor([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]], dtype=paddle.float32) +_P_identity = _eye3.clone() +_invP_identity = _eye3.clone() + +conventional_to_primitive_transforms: dict = { + "cP": {"P": _P_identity, "invP": _invP_identity}, + "tP": {"P": _P_identity, "invP": _invP_identity}, + "hP": {"P": _P_identity, "invP": _invP_identity}, + "oP": {"P": _P_identity, "invP": _invP_identity}, + "mP": {"P": _P_identity, "invP": _invP_identity}, + "aP": {"P": _P_identity, "invP": _invP_identity}, + "cF": { + "P": paddle.to_tensor( + [[-0.5, -0.5, 0.0], [-0.5, 0.0, -0.5], [0.0, -0.5, -0.5]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[-1.0, -1.0, 1.0], [-1.0, 1.0, -1.0], [1.0, -1.0, -1.0]], dtype=paddle.float32 + ), + }, + "oF": { + "P": paddle.to_tensor( + [[-0.5, -0.5, 0.0], [-0.5, 0.0, -0.5], [0.0, -0.5, -0.5]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[-1.0, -1.0, 1.0], [-1.0, 1.0, -1.0], [1.0, -1.0, -1.0]], dtype=paddle.float32 + ), + }, + "cI": { + "P": paddle.to_tensor( + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [-0.5, -0.5, 0.5]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 2.0]], dtype=paddle.float32 + ), + }, + "tI": { + "P": paddle.to_tensor( + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [-0.5, -0.5, 0.5]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 2.0]], dtype=paddle.float32 + ), + }, + "oI": { + "P": paddle.to_tensor( + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [-0.5, -0.5, 0.5]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 2.0]], dtype=paddle.float32 + ), + }, + "hR": { + "P": (1.0 / 3.0) + * paddle.to_tensor( + [[-3.0, -3.0, 0.0], [-3.0, 0.0, 0.0], [-2.0, -1.0, -1.0]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[0.0, -1.0, 0.0], [-1.0, 1.0, 0.0], [1.0, 1.0, -3.0]], dtype=paddle.float32 + ), + }, + "oC": { + "P": paddle.to_tensor( + [[-0.5, -0.5, 0.0], [-0.5, 0.5, 0.0], [0.0, 0.0, -1.0]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[-1.0, -1.0, 0.0], [-1.0, 1.0, 0.0], [0.0, 0.0, -1.0]], dtype=paddle.float32 + ), + }, + "oA": { + "P": paddle.to_tensor( + [[0.0, -0.5, -0.5], [-1.0, 0.0, 0.0], [0.0, 0.5, -0.5]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[0.0, -1.0, 0.0], [-1.0, 0.0, 1.0], [-1.0, 0.0, -1.0]], dtype=paddle.float32 + ), + }, + "mC": { + "P": paddle.to_tensor( + [[0.0, 0.0, 1.0], [-1.0, 0.0, 0.0], [0.5, -0.5, 0.0]], dtype=paddle.float32 + ), + "invP": paddle.to_tensor( + [[0.0, -1.0, 0.0], [0.0, -1.0, -2.0], [1.0, 0.0, 0.0]], dtype=paddle.float32 + ), + }, +} + +conventional_to_primitive_P_matrices = [] +conventional_to_primitive_invP_matrices = [] +for space_group_number in range(1, 231): + bravais_lattice_string = spgroup_data[space_group_number][0] + conventional_to_primitive_P_matrices.append( + conventional_to_primitive_transforms[bravais_lattice_string]["P"] + ) + conventional_to_primitive_invP_matrices.append( + conventional_to_primitive_transforms[bravais_lattice_string]["invP"] + ) +conventional_to_primitive_P_matrices = paddle.stack( + conventional_to_primitive_P_matrices, axis=0 +) +conventional_to_primitive_invP_matrices = paddle.stack( + conventional_to_primitive_invP_matrices, axis=0 +) + +wyckoff_dimension_tensor = -1 * paddle.ones([230, 27], dtype=paddle.int64) +for space_group_number in range(1, 231): + sorted_wyckoff_letters = asu_wyckoff_dict[str(space_group_number)][ + "ordered_wyckoff_letters" + ] + for wyckoff_index, wyckoff_letter in enumerate(sorted_wyckoff_letters): + wyckoff_dim = asu_wyckoff_dict[str(space_group_number)][wyckoff_letter]["dim"] + wyckoff_dimension_tensor[space_group_number - 1, wyckoff_index] = wyckoff_dim + +def _project_onto_1d_subspace(line: paddle.Tensor) -> paddle.Tensor: + """Project to 1D subspace, return (3,3) projection matrix.""" + projection_matrix = (line.T @ line) / (line ** 2).sum() + return projection_matrix + +def _project_onto_2d_subspace( + facet_vertices: paddle.Tensor, return_plane_normal: bool = False +) -> Union[paddle.Tensor, Tuple[paddle.Tensor, paddle.Tensor]]: + """Project to 2D subspace, return (3,3) projection matrix.""" + ab = facet_vertices[0] - facet_vertices[1] + bc = facet_vertices[1] - facet_vertices[2] + plane_normal = paddle.linalg.cross(ab, bc) + + v1 = paddle.linalg.cross(ab, plane_normal).reshape([1, 3]) + v2 = ab.reshape([1, 3]) + + projection_matrix = ( + (v1.T @ v1) / (v1 ** 2).sum() + (v2.T @ v2) / (v2 ** 2).sum() + ) + if return_plane_normal: + return projection_matrix, plane_normal + else: + return projection_matrix + +num_space_groups = 230 +max_wyckoffs_per_space_group = 27 +max_shapes_per_wyckoff = 4 + +noise_projection_matrices = paddle.zeros( + [num_space_groups, max_wyckoffs_per_space_group, max_shapes_per_wyckoff, 3, 3] +) +wyckoff_shape_volumes = paddle.zeros( + [num_space_groups, max_wyckoffs_per_space_group, max_shapes_per_wyckoff] +) +point_per_1d_wyckoff_line = paddle.zeros( + [num_space_groups, max_wyckoffs_per_space_group, max_shapes_per_wyckoff, 3] +) +line_directions_of_1d_wyckoffs = paddle.zeros( + [num_space_groups, max_wyckoffs_per_space_group, max_shapes_per_wyckoff, 3] +) +point_per_2d_wyckoff_plane = paddle.zeros( + [num_space_groups, max_wyckoffs_per_space_group, max_shapes_per_wyckoff, 3] +) +plane_normals_of_2d_wyckoffs = paddle.zeros( + [num_space_groups, max_wyckoffs_per_space_group, max_shapes_per_wyckoff, 3] +) + +for sg_num in range(1, 231): + sg_dict = asu_wyckoff_dict[str(sg_num)] + wyckoff_projection_matrices = paddle.zeros([max_shapes_per_wyckoff, 3, 3]) + for i, wyckoff_letter in enumerate(sg_dict["ordered_wyckoff_letters"]): + wyckoff_dict = sg_dict[wyckoff_letter] + + shape_volumes: List[float] = wyckoff_dict["volumes"] + wyckoff_shape_volumes[sg_num - 1, i, :len(shape_volumes)] = paddle.to_tensor( + shape_volumes, dtype=paddle.float32 + ) + + dim = int(wyckoff_dict["dim"]) + if dim == 0: + wyckoff_projection_matrices[0] = paddle.zeros([3, 3]) + elif dim == 1: + for j, line_segment in enumerate(wyckoff_dict["vertices"]): + line_segment = line_segment.astype("float32") + line = paddle.to_tensor(line_segment[1] - line_segment[0]).reshape([1, 3]) + projection_matrix = _project_onto_1d_subspace(line) # (3, 3) + wyckoff_projection_matrices[j] = projection_matrix + + point_per_1d_wyckoff_line[sg_num - 1, i, j] = paddle.to_tensor( + line_segment[1] + ).reshape([3]) + line_directions_of_1d_wyckoffs[sg_num - 1, i, j] = line.reshape([3]) + elif dim == 2: + for j, facet_vertices in enumerate(wyckoff_dict["vertices"]): + projection_matrix, plane_normal = _project_onto_2d_subspace( + paddle.to_tensor(facet_vertices.astype("float32")), + return_plane_normal=True, + ) + wyckoff_projection_matrices[j] = projection_matrix + + point_per_2d_wyckoff_plane[sg_num - 1, i, j] = paddle.to_tensor( + facet_vertices.astype("float32")[0] + ) + plane_normals_of_2d_wyckoffs[sg_num - 1, i, j] = plane_normal + elif dim == 3: + wyckoff_projection_matrices[0] = paddle.eye(3) + else: + raise AttributeError + noise_projection_matrices[sg_num - 1, i] = wyckoff_projection_matrices + +max_simplicial_hull_facets = 16 + +# initialize padding so inside test is always True +asu_hull_equations = -1.0 * paddle.nn.functional.one_hot( + paddle.to_tensor(3), num_classes=4 +).unsqueeze(0).unsqueeze(0).expand([230, max_simplicial_hull_facets, 4]).cast(paddle.float32) +asu_hull_equations_mask = paddle.zeros([230, max_simplicial_hull_facets], dtype=paddle.bool) + +for sg in range(1, 231): + sg_dict = asu_wyckoff_dict[str(sg)] + general_wyckoff_letter = sg_dict["ordered_wyckoff_letters"][-1] + general_wyckoff_dict = sg_dict[general_wyckoff_letter] + + assert general_wyckoff_dict["dim"] == 3 + asu_vertices: np.ndarray = general_wyckoff_dict["vertices"] + + hull = ConvexHull(asu_vertices.astype("float64")) + equations = hull.equations + n_simplicial_facets = equations.shape[0] + + asu_hull_equations[sg - 1, :n_simplicial_facets] = paddle.to_tensor( + equations, dtype=paddle.float32 + ) + asu_hull_equations_mask[sg - 1, :n_simplicial_facets] = True + +max_vertices_per_wyckoff_shape = 10 + + +class EmbeddingTools: + """Element/space-group/Wyckoff embedding tools. Singleton, accessed via embedding_tools.""" + + @paddle.no_grad() + def __init__( + self, + space_group_embedding_json_path: Optional[str] = None, + element_embedding_json_path: Optional[str] = None, + wyckoff_embedding_json_path: Optional[str] = None, + chemistry_embedding_type: str = "identity", + device: str = "cpu", + ): + self.space_group_embedding_dict = None + self.element_embedding_dict = None + self.wyckoff_embedding_dict = None + self.chemistry_embedding_type = chemistry_embedding_type + self.device = device + + data_directory = DATA_DIRECTORY + + if space_group_embedding_json_path is not None: + fp = Path(data_directory / space_group_embedding_json_path).as_posix() + with open(fp, "r") as file: + self.space_group_embedding_dict = json.load(file) + self.space_group_embedding_length = len( + self.space_group_embedding_dict["1"] + ) + self.space_group_embedding_tensor = paddle.to_tensor( + [ + self.space_group_embedding_dict[str(sg_num)] + for sg_num in range(1, 231) + ], + dtype=paddle.float32, + ) + else: + self.space_group_embedding_length = NUM_SPACE_GROUPS + + if element_embedding_json_path is not None: + fp = Path(data_directory / element_embedding_json_path).as_posix() + with open(fp, "r") as file: + self.element_embedding_dict = json.load(file) + self.element_embedding_length = len(self.element_embedding_dict["0"]) + self.element_embedding_tensor = paddle.to_tensor( + [ + self.element_embedding_dict[str(atomic_number)] + for atomic_number in range(NUM_ELEMENTS + 1) + ], + dtype=paddle.float32, + ) + else: + self.element_embedding_length = NUM_ELEMENTS + + if wyckoff_embedding_json_path is not None: + fp = Path(data_directory / wyckoff_embedding_json_path).as_posix() + with open(fp, "r") as file: + self.wyckoff_embedding_dict = json.load(file) + self.wyckoff_embedding_length = len( + self.wyckoff_embedding_dict["1"]["a"] + ) + + wyckoff_emb_list = [] + n_wyckoffs_list = [] + for sg_num in range(1, 231): + wyckoff_dict_of_sg = self.wyckoff_embedding_dict[str(sg_num)] + letters = list(wyckoff_dict_of_sg.keys()) + + wyckoff_ascii = [ord(l) for l in letters] + wyckoff_idxs = [ + ai - 97 if ai >= 97 else ai - 65 + 26 for ai in wyckoff_ascii + ] + sorted_letters = [ + l + for l, _ in sorted( + zip(letters, wyckoff_idxs), key=lambda pair: pair[1] + ) + ] + + emb_array = paddle.to_tensor( + [wyckoff_dict_of_sg[l] for l in sorted_letters], + dtype=paddle.float32, + ) + padding = paddle.zeros( + [MAX_WYCKOFF_SITES - len(letters), self.wyckoff_embedding_length] + ) + wyckoff_emb_list.append(paddle.concat([emb_array, padding], axis=0)) + n_wyckoffs_list.append(len(letters)) + + self.wyckoff_embedding_tensor = paddle.stack(wyckoff_emb_list, axis=0) + self.n_wyckoffs_per_space_group = paddle.to_tensor( + n_wyckoffs_list, dtype=paddle.int64 + ) + else: + self.wyckoff_embedding_length = MAX_WYCKOFF_SITES + + def get_space_group_embedding(self, space_group_index: paddle.Tensor) -> paddle.Tensor: + """Get space group embedding.""" + assert space_group_index.dtype == paddle.int64 + if self.space_group_embedding_dict is None: + return F.one_hot(space_group_index, NUM_SPACE_GROUPS).cast(paddle.float32) + else: + return self.space_group_embedding_tensor[space_group_index] + + @paddle.no_grad() + def get_element_embedding(self, atomic_number: paddle.Tensor) -> paddle.Tensor: + """Get element embedding.""" + assert atomic_number.dtype == paddle.int64 + if self.element_embedding_dict is None: + return F.one_hot( + atomic_number - 1, NUM_ELEMENTS + ).cast(paddle.float32) + else: + return self.element_embedding_tensor[atomic_number] + + @paddle.no_grad() + def get_wyckoff_embedding( + self, + wyckoff_index: paddle.Tensor, + space_group_index: paddle.Tensor, + ) -> paddle.Tensor: + """Get Wyckoff embedding by index and space group.""" + if self.wyckoff_embedding_dict is None: + return F.one_hot(wyckoff_index, MAX_WYCKOFF_SITES).cast(paddle.float32) + else: + valid_mask = self.n_wyckoffs_per_space_group[space_group_index] > wyckoff_index + assert valid_mask.all().item(), "Invalid space group-Wyckoff index pairs" + return self.wyckoff_embedding_tensor[space_group_index, wyckoff_index, :] + +def set_global_embedding_tools( + space_group_embedding_json_path: Optional[str] = None, + element_embedding_json_path: Optional[str] = None, + wyckoff_embedding_json_path: Optional[str] = None, + chemistry_embedding_type: str = "identity", + device: str = "cpu", +) -> None: + """Initialize and set global embedding_tools.""" + global embedding_tools + embedding_tools = EmbeddingTools( + space_group_embedding_json_path=space_group_embedding_json_path, + element_embedding_json_path=element_embedding_json_path, + wyckoff_embedding_json_path=wyckoff_embedding_json_path, + chemistry_embedding_type=chemistry_embedding_type, + device=device, + ) \ No newline at end of file diff --git a/ppmat/models/sgequidiff/lattice_sampler.py b/ppmat/models/sgequidiff/lattice_sampler.py new file mode 100644 index 00000000..a9b9343e --- /dev/null +++ b/ppmat/models/sgequidiff/lattice_sampler.py @@ -0,0 +1,519 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Lattice sampler: SpaceGroupEncoder, TelescopingDiscreteLatticeSampler。""" +import dataclasses +import math +from typing import Optional + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle.distribution import Categorical + +import ppmat.models.sgequidiff.global_vars as global_vars +from ppmat.models.sgequidiff.data_utils import lattice_transform_and_log_prob_mask +from ppmat.models.sgequidiff.non_equivariant_drift_modules import FourierLinear, Swish + + +class SpaceGroupEncoder(nn.Layer): + def __init__(self, hidden_channels: int = 128, space_group_embedding_dim: int = 64): + super().__init__() + self.net = nn.Sequential( + nn.Linear(global_vars.embedding_tools.space_group_embedding_length, hidden_channels), + Swish(), + nn.Linear(hidden_channels, space_group_embedding_dim), + Swish(), + ) + + def forward(self, space_group_indices): + return self.net(global_vars.embedding_tools.get_space_group_embedding(space_group_indices)) + +@dataclasses.dataclass +class LatticeSamplerConfig: + input_dimension: int + hidden_dimension: int + num_hidden_layers: int = 1 + use_fourier_features: Optional[bool] = True + max_fourier_frequency: Optional[float] = 64.0 + num_fourier_frequencies: Optional[int] = 16 + lattice_lengths_transform: str = "identity" + model_type: str = "telescoping_discrete" + min_lattice_length: float = 2.0 + max_lattice_length: float = 133.0 + min_lattice_angle: float = 60.0 + max_lattice_angle: float = 135.0 + gradient_attenuation_factor: float = 1.0 + n_bins: int = 100 + n_telescopes: int = 2 + lattice_length_bin_embedder_fourier_scale: float = 10.0 + lattice_angle_bin_embedder_fourier_scale: float = 10.0 + lattice_length_embedder_fourier_scale: float = 20.0 + lattice_angle_embedder_fourier_scale: float = 1.0 + lattice_param_dim: int = 112 + n_emb_layers: int = 4 + +class TelescopingDiscreteLatticeSampler(nn.Layer): + def __init__(self, config: LatticeSamplerConfig): + super().__init__() + self.config = config + self.MAX_LATTICE_LENGTH = config.max_lattice_length + self.MIN_LATTICE_LENGTH = config.min_lattice_length + self.MAX_LATTICE_ANGLE = config.max_lattice_angle + self.MIN_LATTICE_ANGLE = config.min_lattice_angle + self.length_transform = lambda x: x + self.inv_length_transform = lambda x: x + + bravais_data = [lattice_transform_and_log_prob_mask(sg) for sg in range(1, 231)] + bravais_length_transforms = paddle.stack([d[0] for d in bravais_data], axis=0) + bravais_angle_transforms = paddle.stack([d[1] for d in bravais_data], axis=0) + bravais_angle_offsets = paddle.stack([d[2] for d in bravais_data], axis=0) + bravais_log_prob_masks = paddle.stack([d[3] for d in bravais_data], axis=0) + self.register_buffer("bravais_length_transforms", bravais_length_transforms) + self.register_buffer("bravais_angle_transforms", bravais_angle_transforms) + self.register_buffer("bravais_angle_offsets", bravais_angle_offsets) + self.register_buffer("bravais_log_prob_masks", bravais_log_prob_masks) + + self.n_bins = self.config.n_bins + self.n_telescopes = self.config.n_telescopes + self.min_bin_edge = -4.0 + self.max_bin_edge = 4.0 + + self.space_group_encoder = SpaceGroupEncoder( + hidden_channels=256, + space_group_embedding_dim=self.config.input_dimension, + ) + + self.lattice_param_dim = self.config.lattice_param_dim + + self.lattice_length_embedder = nn.Sequential( + FourierLinear( + input_dim=1, + num_fourier_frequencies=128, + scale=self.config.lattice_length_embedder_fourier_scale, + num_layers=self.config.n_emb_layers, + output_dim=512, + use_bias=True, + ), + nn.Linear(512, self.lattice_param_dim), + nn.Silu(), + ) + + self.lattice_angle_embedder = nn.Sequential( + FourierLinear( + input_dim=1, + num_fourier_frequencies=128, + scale=self.config.lattice_angle_embedder_fourier_scale, + num_layers=self.config.n_emb_layers, + output_dim=256, + use_bias=True, + ), + nn.Linear(256, self.lattice_param_dim), + nn.Silu(), + ) + + self.length_bin_embedder = nn.Sequential( + FourierLinear( + input_dim=2, + num_fourier_frequencies=128, + scale=self.config.lattice_length_bin_embedder_fourier_scale, + output_dim=256, + num_layers=self.config.n_emb_layers, + use_bias=True, + ), + nn.Linear(256, self.config.hidden_dimension), + nn.Silu(), + ) + + self.angle_bin_embedder = nn.Sequential( + FourierLinear( + input_dim=2, + num_fourier_frequencies=128, + scale=self.config.lattice_angle_bin_embedder_fourier_scale, + output_dim=256, + num_layers=self.config.n_emb_layers, + use_bias=True, + ), + nn.Linear(256, self.config.hidden_dimension), + nn.Silu(), + ) + + self.bin_conditioning_info_dim = ( + self.config.input_dimension + 6 * self.lattice_param_dim + 6 + ) + + self.bin_logit_head = nn.Sequential( + nn.Linear( + self.config.hidden_dimension + self.bin_conditioning_info_dim, + self.config.hidden_dimension, + ), + nn.Silu(), + nn.Linear(self.config.hidden_dimension, 6), + ) + + self.register_buffer("grid_pts", paddle.linspace(0, 1, self.n_bins + 1)) + + + angle_offsets = self.bravais_angle_offsets.clone() + unconstrained_angle_mask = (angle_offsets == 0.0) + angle_offsets[unconstrained_angle_mask] = self.MIN_LATTICE_ANGLE + _normed_params = self._get_normed_lattice_parameters( + self.MIN_LATTICE_LENGTH * paddle.ones_like(self.bravais_angle_offsets), + angle_offsets, + self.min_bin_edge, + self.max_bin_edge, + norm_gamma_separately=False, + ) + _discretized_normed_params = self.get_discretized_normed_lattice_params( + _normed_params, angle_offsets[:, :2] + ) + _discretized_normed_angle_offsets = _discretized_normed_params[:, 3:] + _discretized_normed_angle_offsets[unconstrained_angle_mask] = 0.0 + self.register_buffer( + "discretized_normed_bravais_angle_offsets", + _discretized_normed_angle_offsets, + ) + + @paddle.no_grad() + def _get_normed_lattice_parameters( + self, + lattice_lengths, + lattice_angles, + min_normed_param: float = -1.0, + max_normed_param: float = 1.0, + norm_gamma_separately: bool = True, + ): + normed_param_range = max_normed_param - min_normed_param + normed_lattice_lengths = ( + normed_param_range + * ( + (self.length_transform(lattice_lengths) - self.length_transform(self.MIN_LATTICE_LENGTH)) + / (self.length_transform(self.MAX_LATTICE_LENGTH) - self.length_transform(self.MIN_LATTICE_LENGTH)) + ) + + min_normed_param + ) + + if norm_gamma_separately: + min_gamma_angle, max_gamma_angle = self.get_valid_gamma_angle_interval( + alpha_and_beta_angles=lattice_angles[:, :2] + ) + else: + min_gamma_angle = self.MIN_LATTICE_ANGLE + max_gamma_angle = self.MAX_LATTICE_ANGLE + + normed_lattice_angles = paddle.concat( + [ + normed_param_range + * ( + (lattice_angles[:, :2] - self.MIN_LATTICE_ANGLE) + / (self.MAX_LATTICE_ANGLE - self.MIN_LATTICE_ANGLE) + ) + + min_normed_param, + normed_param_range + * ( + (lattice_angles[:, -1] - min_gamma_angle) + / (max_gamma_angle - min_gamma_angle) + ).unsqueeze(-1) + + min_normed_param, + ], + axis=1, + ) + return paddle.concat([normed_lattice_lengths, normed_lattice_angles], axis=1) + + def get_valid_gamma_angle_interval(self, alpha_and_beta_angles): + cos_alpha = paddle.cos(alpha_and_beta_angles[:, 0] * math.pi / 180.0) + cos_beta = paddle.cos(alpha_and_beta_angles[:, 1] * math.pi / 180.0) + cos_alpha_sq = cos_alpha ** 2 + cos_beta_sq = cos_beta ** 2 + term1 = cos_alpha * cos_beta + inner = 4 * cos_alpha_sq * cos_beta_sq - 4 * (cos_alpha_sq + cos_beta_sq - 1) + inner = paddle.clip(inner, min=0.0) + term2 = 0.5 * paddle.sqrt(inner) + gamma_min = paddle.acos(paddle.clip(term1 + term2, min=-1.0, max=1.0)) * 180.0 / math.pi + gamma_max = paddle.acos(paddle.clip(term1 - term2, min=-1.0, max=1.0)) * 180.0 / math.pi + return ( + paddle.clip(gamma_min, min=self.MIN_LATTICE_ANGLE, max=self.MAX_LATTICE_ANGLE), + paddle.clip(gamma_max, min=self.MIN_LATTICE_ANGLE, max=self.MAX_LATTICE_ANGLE), + ) + + @paddle.no_grad() + def get_discretized_normed_lattice_params(self, normed_lattice_parameters, raw_alpha_and_beta_angles): + batch_size = normed_lattice_parameters.shape[0] + _batch_idxs = paddle.arange(batch_size) + discretized_normed_lattice_parameters = paddle.zeros_like(normed_lattice_parameters) + for i in range(6): + min_bin_edge = self.min_bin_edge * paddle.ones([batch_size]) + max_bin_edge = self.max_bin_edge * paddle.ones([batch_size]) + x = normed_lattice_parameters[:, i] + for j in range(self.n_telescopes): + bin_edges = min_bin_edge.unsqueeze(-1) + (max_bin_edge - min_bin_edge).unsqueeze(-1) * self.grid_pts.unsqueeze(0) + bins = paddle.stack([bin_edges[:, :-1], bin_edges[:, 1:]], axis=-1) + normalized_x = (x - min_bin_edge) / (max_bin_edge - min_bin_edge) + bin_idxs = paddle.bucketize(normalized_x, self.grid_pts[1:]) + bin_idxs = paddle.clip(bin_idxs, max=self.n_bins - 1) + chosen_bins = bins[_batch_idxs, bin_idxs] + min_bin_edge = chosen_bins[:, 0] + max_bin_edge = chosen_bins[:, 1] + discretized_normed_lattice_parameters[:, i] = paddle.mean(chosen_bins, axis=-1) + + min_gamma, max_gamma = self.get_valid_gamma_angle_interval(raw_alpha_and_beta_angles) + min_normed_gamma = (self.max_bin_edge - self.min_bin_edge) * ( + (min_gamma - self.MIN_LATTICE_ANGLE) / (self.MAX_LATTICE_ANGLE - self.MIN_LATTICE_ANGLE) + ) + self.min_bin_edge + max_normed_gamma = (self.max_bin_edge - self.min_bin_edge) * ( + (max_gamma - self.MIN_LATTICE_ANGLE) / (self.MAX_LATTICE_ANGLE - self.MIN_LATTICE_ANGLE) + ) + self.min_bin_edge + gammas_lt_min = discretized_normed_lattice_parameters[:, -1] < min_normed_gamma + gammas_gt_max = discretized_normed_lattice_parameters[:, -1] > max_normed_gamma + + if paddle.any(gammas_lt_min | gammas_gt_max): + bin_edges = (self.max_bin_edge - self.min_bin_edge) * paddle.linspace(0, 1, self.n_telescopes * self.n_bins + 1) + self.min_bin_edge + bin_midpoints = paddle.mean(paddle.stack([bin_edges[:-1], bin_edges[1:]], axis=-1), axis=-1) + if paddle.any(gammas_lt_min): + valid_bin_indices = paddle.argmax( + (bin_midpoints.unsqueeze(0) > min_normed_gamma[gammas_lt_min].unsqueeze(-1)).cast("int32"), axis=-1) + discretized_normed_lattice_parameters[:, -1][gammas_lt_min] = bin_midpoints[valid_bin_indices] + if paddle.any(gammas_gt_max): + valid_bin_indices = paddle.argmax( + (bin_midpoints.unsqueeze(0) < max_normed_gamma[gammas_gt_max].unsqueeze(-1)).cast("int32"), axis=-1) + discretized_normed_lattice_parameters[:, -1][gammas_gt_max] = bin_midpoints[valid_bin_indices] + return discretized_normed_lattice_parameters + + @paddle.no_grad() + def forward(self, space_group_indices): + """ + Sample 6 lattice parameters constrained by the Bravais lattices. + + Args: + space_group_indices: (batch_size,) int64, 0-indexed + + Returns: + lengths: (batch_size, 3) + angles: (batch_size, 3) + log_pfs: (batch_size,) + regularizer: (batch_size,) + """ + batch_size = space_group_indices.shape[0] + sg_features = self.space_group_encoder(space_group_indices) + + num_angles = 3 + num_lengths = 3 + num_lattice_parameters = num_angles + num_lengths + + lattice_params_transform = paddle.concat( + ( + paddle.to_tensor( + [self.length_transform(self.MAX_LATTICE_LENGTH) + - self.length_transform(self.MIN_LATTICE_LENGTH)] + ).expand([batch_size, num_lengths]), + paddle.to_tensor( + [self.MAX_LATTICE_ANGLE - self.MIN_LATTICE_ANGLE] + ).expand([batch_size, num_angles]), + ), + axis=1, + ) + + lattice_params_offset = paddle.concat( + ( + paddle.to_tensor( + [self.length_transform(self.MIN_LATTICE_LENGTH)] + ).expand([batch_size, num_lengths]), + paddle.to_tensor( + [self.MIN_LATTICE_ANGLE] + ).expand([batch_size, num_angles]), + ), + axis=1, + ) + + normed_lattice_parameters = paddle.zeros([batch_size, num_lattice_parameters]) + current_lattice_embedding = paddle.zeros( + [batch_size, 6 * self.lattice_param_dim] + ) + log_pfs = [] + lattice_mask = paddle.zeros([6]) + regularizer = paddle.zeros([batch_size]) + alpha_and_beta_angles = None + bravais_length_transforms = self.bravais_length_transforms[space_group_indices] + bravais_angle_transforms = self.bravais_angle_transforms[space_group_indices] + discretized_normed_bravais_angle_offsets = ( + self.discretized_normed_bravais_angle_offsets[space_group_indices] + ) + + for i in range(num_lattice_parameters): + if i > 0: + if i < 4: + current_lattice_embedding[ + :, self.lattice_param_dim * (i - 1):self.lattice_param_dim * i + ] = self.lattice_length_embedder( + normed_lattice_parameters[:, i - 1].unsqueeze(-1) + ) + else: + current_lattice_embedding[ + :, self.lattice_param_dim * (i - 1):self.lattice_param_dim * i + ] = self.lattice_angle_embedder( + normed_lattice_parameters[:, i - 1].unsqueeze(-1) + ) + + current_state_features = paddle.concat( + [ + sg_features, + current_lattice_embedding, + lattice_mask.unsqueeze(0).expand([batch_size, 6]) + ], axis=1 + )[:, None, :].expand([batch_size, self.n_bins, -1]) + + if i == 5: + alpha_and_beta_angles = ( + (normed_lattice_parameters[:, 3:5] - self.min_bin_edge) + / (self.max_bin_edge - self.min_bin_edge) + ) * lattice_params_transform[:, 3:5] + lattice_params_offset[:, 3:5] + + sample, log_prob = self._sample_and_log_prob( + lattice_param_index=i, + bin_embedder=self.length_bin_embedder if i < 3 else self.angle_bin_embedder, + batch_size=batch_size, + z=current_state_features, + alpha_and_beta_angles=alpha_and_beta_angles, + enforce_gamma_bounds=(i == (num_lattice_parameters - 1)), + ) + + normed_lattice_parameters[:, i] = sample + lattice_mask[i] = 1.0 + log_pfs.append(log_prob) + + # Apply Bravais lattice constraints + if i < 3: + normed_lattice_parameters[:, :3] = paddle.bmm( + normed_lattice_parameters[:, :3].unsqueeze(1), + bravais_length_transforms + ).squeeze(1) + else: + normed_lattice_parameters[:, 3:] = paddle.bmm( + normed_lattice_parameters[:, 3:].unsqueeze(1), + bravais_angle_transforms + ).squeeze(1) + discretized_normed_bravais_angle_offsets + + log_pfs = paddle.stack(log_pfs, axis=1) + + lattice_parameters = ( + (normed_lattice_parameters - self.min_bin_edge) + / (self.max_bin_edge - self.min_bin_edge) + ) * lattice_params_transform + lattice_params_offset + + lengths = self.inv_length_transform(lattice_parameters[:, :num_lengths]) + angles = lattice_parameters[:, num_lengths:] + + log_pf_masks = self.bravais_log_prob_masks[space_group_indices] + log_pfs = (log_pfs * log_pf_masks).sum(axis=1) + + if self.config.gradient_attenuation_factor != 1.0: + log_pfs_detach = log_pfs.detach() + log_pfs = ( + self.config.gradient_attenuation_factor * log_pfs + - self.config.gradient_attenuation_factor * log_pfs_detach + + log_pfs_detach + ) + + return lengths, angles, log_pfs, regularizer + + def _sample_and_log_prob( + self, + lattice_param_index: int, + bin_embedder, + batch_size: int, + z=None, + x=None, + alpha_and_beta_angles=None, + enforce_gamma_bounds: bool = False, + ): + assert 0 <= lattice_param_index < 6 + if z is None: + z = paddle.zeros([batch_size, self.n_bins, self.bin_conditioning_info_dim]) + + if enforce_gamma_bounds: + assert alpha_and_beta_angles is not None + min_gamma, max_gamma = self.get_valid_gamma_angle_interval( + alpha_and_beta_angles + ) + min_gamma = min_gamma.unsqueeze(-1) + max_gamma = max_gamma.unsqueeze(-1) + + min_normed_gamma = (self.max_bin_edge - self.min_bin_edge) * ( + (min_gamma - self.MIN_LATTICE_ANGLE) + / (self.MAX_LATTICE_ANGLE - self.MIN_LATTICE_ANGLE) + ) + self.min_bin_edge + max_normed_gamma = (self.max_bin_edge - self.min_bin_edge) * ( + (max_gamma - self.MIN_LATTICE_ANGLE) + / (self.MAX_LATTICE_ANGLE - self.MIN_LATTICE_ANGLE) + ) + self.min_bin_edge + + _batch_idxs = paddle.arange(batch_size) + min_bin_edge = self.min_bin_edge * paddle.ones([batch_size]) + max_bin_edge = self.max_bin_edge * paddle.ones([batch_size]) + log_probs = paddle.zeros([batch_size]) + + for j in range(self.n_telescopes): + bin_edges = ( + min_bin_edge.unsqueeze(-1) + (max_bin_edge - min_bin_edge).unsqueeze(-1) + * self.grid_pts.unsqueeze(0).expand([batch_size, -1]) + ) + bins = paddle.stack([bin_edges[:, :-1], bin_edges[:, 1:]], axis=-1) + + # bin_embedder: (batch_size, n_bins, 2) -> (batch_size, n_bins, hidden_dim) + bin_emb = bin_embedder(bins.reshape([-1, 2])).reshape( + [batch_size, self.n_bins, -1] + ) + + bin_logits = self.bin_logit_head( + paddle.concat([bin_emb, z], axis=-1) + )[:, :, lattice_param_index] + + if enforce_gamma_bounds: + if j < self.n_telescopes - 1: + epsilon = (bin_edges[0, 1] - bin_edges[0, 0]) / self.n_bins + zero_prob_bins_mask = ( + (bins[:, :, 1] - epsilon < min_normed_gamma) + | (bins[:, :, 0] + epsilon > max_normed_gamma) + ) + else: + bin_midpoints = paddle.mean(bins, axis=-1) + zero_prob_bins_mask = ( + (bin_midpoints < min_normed_gamma) + | (bin_midpoints > max_normed_gamma) + ) + + if paddle.any(paddle.all(zero_prob_bins_mask, axis=-1)): + raise NotImplementedError("All bins were invalid") + + bin_logits = bin_logits + zero_prob_bins_mask.cast("float32") * ( + paddle.where(zero_prob_bins_mask, paddle.to_tensor(-float('inf')), paddle.to_tensor(0.0)) + ) + + if x is None: + dist = Categorical(logits=bin_logits) + bin_idxs = dist.sample([1]).squeeze(0) + else: + normalized_x = (x - min_bin_edge) / (max_bin_edge - min_bin_edge) + bin_idxs = paddle.bucketize(normalized_x, self.grid_pts[1:]) + + log_probs = log_probs + paddle.take_along_axis( + F.log_softmax(bin_logits, axis=-1), bin_idxs.unsqueeze(-1), axis=-1 + ).squeeze(-1) + + chosen_bins = bins[_batch_idxs, bin_idxs] + min_bin_edge = chosen_bins[:, 0] + max_bin_edge = chosen_bins[:, 1] + + samples = paddle.mean(chosen_bins, axis=-1) + return samples, log_probs \ No newline at end of file diff --git a/ppmat/models/sgequidiff/non_equivariant_drift_modules.py b/ppmat/models/sgequidiff/non_equivariant_drift_modules.py new file mode 100644 index 00000000..73749113 --- /dev/null +++ b/ppmat/models/sgequidiff/non_equivariant_drift_modules.py @@ -0,0 +1,820 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Non-equivariant drift modules: GNN (PBC message passing) and CSPNet (from DiffCSP).""" +import dataclasses +import math +from typing import Optional, Tuple +from contextlib import nullcontext + +import paddle +import paddle.nn as nn +import ppmat.models.sgequidiff.global_vars as global_vars +from ppmat.models.sgequidiff.constants import lattice_parameter_ranges, NUM_ELEMENTS +from ppmat.models.sgequidiff.data_utils import ( + construct_fully_connected_graphs_with_periodic_boundaries, + frac_to_cart_coords, + ocp_get_pbc_distances, +) +from ppmat.utils.scatter import scatter as paddle_scatter +from ppmat.models.common.time_embedding import SinusoidalTimeEmbeddings as FourierTimeEmbeddings + +def get_plane_wave_frequencies( + num_freqs: int, + max_freq: int = 512, + fourier_scale: float = 1.0, + isotropic_plane_waves: bool = False, +) -> paddle.Tensor: + """Return (3, num_freqs) plane wave frequency tensor.""" + if isotropic_plane_waves: + plane_wave_freqs = paddle.linspace( + 1, num_freqs, num_freqs + ).unsqueeze(0).expand([3, num_freqs]) + else: + freqs_1d_grid = paddle.linspace(-max_freq, max_freq, 1 + 2 * max_freq) + freqs_1d_grid = freqs_1d_grid[freqs_1d_grid != 0.0] + normal = paddle.distribution.Normal( + paddle.to_tensor([0.0]), paddle.to_tensor([fourier_scale]) + ) + probs = normal.log_prob(freqs_1d_grid).exp() + + plane_wave_freqs = paddle.empty([3, 0]) + samples_per_iter = 2 * num_freqs + max_iters = 100 + iteration = 0 + while plane_wave_freqs.shape[-1] < num_freqs and iteration <= max_iters: + iteration += 1 + kx = freqs_1d_grid[paddle.multinomial(probs, num_samples=samples_per_iter, replacement=True)] + ky = freqs_1d_grid[paddle.multinomial(probs, num_samples=samples_per_iter, replacement=True)] + kz = freqs_1d_grid[paddle.multinomial(probs, num_samples=samples_per_iter, replacement=True)] + plane_wave_freqs = paddle.concat( + [plane_wave_freqs, paddle.stack([kx, ky, kz])], axis=-1 + ) + _, unique_idx = paddle.unique(plane_wave_freqs, axis=-1, return_index=True) + plane_wave_freqs = plane_wave_freqs[:, unique_idx] + return plane_wave_freqs[:, :num_freqs] + +def plane_wave_fourier_features( + x: paddle.Tensor, plane_wave_freqs: paddle.Tensor +) -> paddle.Tensor: + """Plane wave Fourier features for 3D points.""" + v = 2 * math.pi * x @ plane_wave_freqs + return paddle.concat([v.sin(), v.cos()], axis=-1) + +class TorusMLP(nn.Layer): + """Simple MLP drift model based on Fourier features.""" + + def __init__( + self, + time_embedder: FourierTimeEmbeddings, + num_plane_wave_freqs: int, + ): + super().__init__() + self.time_embedder = time_embedder + self.num_plane_wave_freqs = num_plane_wave_freqs + plane_wave_freqs = get_plane_wave_frequencies(num_freqs=num_plane_wave_freqs) + self.register_buffer("plane_wave_freqs", plane_wave_freqs) + self.layers = nn.Sequential( + nn.Linear(2 * self.num_plane_wave_freqs + time_embedder.dim, 128), + nn.Silu(), + nn.Linear(128, 128), + nn.Silu(), + nn.Linear(128, 128), + nn.Silu(), + nn.Linear(128, 128), + nn.Silu(), + nn.Linear(128, 3), + ) + + def forward( + self, + frac_coords: paddle.Tensor, + element_indices: paddle.Tensor, + time_embeddings: paddle.Tensor, + *args, + **kwargs, + ) -> paddle.Tensor: + return self.layers( + paddle.concat( + [ + plane_wave_fourier_features(frac_coords, self.plane_wave_freqs), + time_embeddings, + ], + axis=-1, + ) + ) + +class GaussianSmearing(nn.Layer): + """Gaussian distance smearing.""" + + def __init__(self, start: float = 0.0, stop: float = 5.0, num_gaussians: int = 50): + super().__init__() + offset = paddle.linspace(start, stop, num_gaussians) + self.coeff = -0.5 / (offset[1] - offset[0]).item() ** 2 + self.register_buffer("offset", offset) + + def forward(self, dist: paddle.Tensor) -> paddle.Tensor: + dist = dist.reshape([-1, 1]) - self.offset.reshape([1, -1]) + return paddle.exp(self.coeff * dist ** 2) + +def custom_he_orthogonal_(weight: paddle.Tensor, gain: float = 1.0) -> paddle.Tensor: + """He initialization + orthogonalization.""" + with paddle.no_grad(): + fan_in = weight.shape[1] + assert fan_in > 1 + + nn.initializer.Orthogonal()(weight) + eps = 1e-6 + mean = weight.mean(axis=1, keepdim=True) + var = weight.std(axis=1, keepdim=True) + result = gain * math.sqrt(1 / fan_in) * ((weight - mean) / (var + eps).sqrt()) + paddle.assign(result, weight) + return weight + +class NodeAndEdgeEmbedder(nn.Layer): + """Node and edge initial embedding module.""" + + def __init__( + self, + num_cartesian_distance_gaussians: int, + edge_hidden_dim: int, + atom_hidden_dim: int, + fourier_frac_edge_dim: int, + gaussian_cart_edge_dim: int, + time_emb_dim: int, + activation: nn.Layer, + use_frac_coords_in_node_emb: bool, + ): + super().__init__() + self.act = activation + self.use_frac_coords_in_node_emb = use_frac_coords_in_node_emb + + if use_frac_coords_in_node_emb: + self.frac_pos_emb = nn.Linear(fourier_frac_edge_dim, atom_hidden_dim) + self.ele_emb = nn.Linear( + global_vars.embedding_tools.element_embedding_length, atom_hidden_dim + ) + self.atom_emb1 = nn.Linear(2 * atom_hidden_dim, atom_hidden_dim) + else: + self.atom_emb1 = nn.Linear( + global_vars.embedding_tools.element_embedding_length, atom_hidden_dim + ) + self.atom_emb2 = nn.Linear(atom_hidden_dim + time_emb_dim, atom_hidden_dim) + + self.edge_emb1 = nn.Linear( + fourier_frac_edge_dim + gaussian_cart_edge_dim + 6, edge_hidden_dim, bias_attr=False + ) + self.edge_emb2 = nn.Linear(edge_hidden_dim, edge_hidden_dim, bias_attr=False) + self._reset_parameters() + + def _reset_parameters(self): + custom_he_orthogonal_(self.atom_emb1.weight, gain=2.0) + paddle.assign(paddle.zeros_like(self.atom_emb1.bias), self.atom_emb1.bias) + custom_he_orthogonal_(self.atom_emb2.weight, gain=2.0) + paddle.assign(paddle.zeros_like(self.atom_emb2.bias), self.atom_emb2.bias) + custom_he_orthogonal_(self.edge_emb1.weight, gain=2.0) + custom_he_orthogonal_(self.edge_emb2.weight, gain=2.0) + + def forward( + self, + element_indices: paddle.Tensor, + time_embeddings: paddle.Tensor, + fourier_relative_frac_pos: paddle.Tensor, + gaussian_cart_dists: paddle.Tensor, + normed_lattice_params: paddle.Tensor, + fourier_atom_frac_pos: Optional[paddle.Tensor] = None, + ) -> dict: + e = self.edge_emb1( + paddle.concat([fourier_relative_frac_pos, gaussian_cart_dists, normed_lattice_params], axis=-1) + ) + e = self.act(e) + e = self.act(self.edge_emb2(e)) + + if self.use_frac_coords_in_node_emb: + frac_pos_emb = self.act(self.frac_pos_emb(fourier_atom_frac_pos)) + ele_emb_out = self.act( + self.ele_emb( + global_vars.embedding_tools.get_element_embedding(1 + element_indices) + ) + ) + h = self.atom_emb1(paddle.concat([frac_pos_emb, ele_emb_out], axis=-1)) + else: + h = self.atom_emb1( + global_vars.embedding_tools.get_element_embedding(1 + element_indices) + ) + h = self.act(h) + h = self.act(self.atom_emb2(paddle.concat([h, time_embeddings], axis=-1))) + return {"h": h, "e": e} + +class InteractionBlock(nn.Layer): + """Custom message passing GNN layer.""" + + def __init__( + self, + hidden_channels: int, + edge_hidden_dim: int, + activation: nn.Layer, + graph_norm: bool = True, + use_vpa: bool = True, + ): + super().__init__() + self.act = activation + self.hidden_channels = hidden_channels + self.use_graph_norm = graph_norm + self.use_vpa = use_vpa + + if use_vpa: + self.aggregator = VariancePreservingAggregation() + if graph_norm: + self.graph_norm = GraphNorm(hidden_channels) + + self.lin_geom = nn.Linear( + edge_hidden_dim + 2 * hidden_channels, hidden_channels, bias_attr=False + ) + self.lin_h = nn.Linear(hidden_channels, hidden_channels) + self.out_layer = nn.Linear(hidden_channels, hidden_channels) + self.skipinit_gain = self.create_parameter( + [], default_initializer=nn.initializer.Constant(0.0) + ) + self._reset_parameters() + + def _reset_parameters(self): + custom_he_orthogonal_(self.lin_geom.weight, gain=4.0) + custom_he_orthogonal_(self.out_layer.weight, gain=3.0) + paddle.assign(paddle.zeros_like(self.out_layer.bias), self.out_layer.bias) + custom_he_orthogonal_(self.lin_h.weight, gain=3.0) + paddle.assign(paddle.zeros_like(self.lin_h.bias), self.lin_h.bias) + + def forward( + self, + h: paddle.Tensor, + edge_index: paddle.Tensor, + e: paddle.Tensor, + map_node_to_graph: Optional[paddle.Tensor] = None, + num_graphs: Optional[int] = None, + ) -> paddle.Tensor: + """Message passing + aggregation.""" + src_ids = edge_index[0] + dst_ids = edge_index[1] + + e_full = paddle.concat([e, h[src_ids], h[dst_ids]], axis=1) + e_full = self.act(self.lin_geom(e_full)) + + # message: m_ij = h_j * e_ij + messages = h[src_ids] * e_full + + n_nodes = h.shape[0] + n_nodes = h.shape[0] + if self.use_vpa: + h_agg = self.aggregator(messages, dst_ids, dim_size=n_nodes) + else: + h_agg = paddle_scatter(messages, dst_ids, dim=0, dim_size=n_nodes, reduce="sum") + + if self.use_graph_norm: + h_agg = self.graph_norm(h_agg, map_node_to_graph, num_graphs) + h_agg = self.act(h_agg) + h_agg = self.act(self.lin_h(h_agg)) + h_agg = self.act(self.out_layer(h_agg)) + + return self.skipinit_gain * h_agg + +@dataclasses.dataclass +@dataclasses.dataclass +class GNNConfig: + num_plane_wave_freqs: int = 64 + num_cartesian_distance_gaussians: int = 64 + edge_hidden_dim: int = 256 + atom_hidden_dim: int = 256 + use_vpa: bool = True + use_graph_norm: bool = True + num_msg_pass_steps: int = 5 + cutoff: float = 7.0 + use_frac_coords_in_node_emb: bool = False + dataset_name: str = "mp_20" + +class GNN(nn.Layer): + """GNN non-equivariant drift module.""" + + def __init__(self, config: GNNConfig, time_embedder: FourierTimeEmbeddings): + super().__init__() + self.config = config + self.time_embedder = time_embedder + self.num_plane_wave_freqs = config.num_plane_wave_freqs + self.num_cartesian_distance_gaussians = config.num_cartesian_distance_gaussians + self.edge_hidden_dim = config.edge_hidden_dim + self.atom_hidden_dim = config.atom_hidden_dim + self.use_graph_norm = config.use_graph_norm + self.use_vpa = config.use_vpa + self.num_msg_pass_steps = config.num_msg_pass_steps + self.cutoff = config.cutoff + + plane_wave_freqs = get_plane_wave_frequencies( + num_freqs=self.num_plane_wave_freqs + ) + self.register_buffer("plane_wave_freqs", plane_wave_freqs) + + self.gaussian_smearing = GaussianSmearing( + 0.0, self.cutoff, self.num_cartesian_distance_gaussians + ) + self.activation = Swish() + self.embed_block = NodeAndEdgeEmbedder( + self.num_cartesian_distance_gaussians, + self.edge_hidden_dim, + self.atom_hidden_dim, + 2 * self.num_plane_wave_freqs, + self.num_cartesian_distance_gaussians, + self.time_embedder.dim, + self.activation, + self.config.use_frac_coords_in_node_emb, + ) + self.interaction_blocks = nn.LayerList( + [ + InteractionBlock( + hidden_channels=self.atom_hidden_dim, + edge_hidden_dim=self.edge_hidden_dim, + activation=self.activation, + graph_norm=self.use_graph_norm, + use_vpa=self.use_vpa, + ) + for _ in range(self.num_msg_pass_steps) + ] + ) + self.mlp_skip_co = nn.Linear( + (self.num_msg_pass_steps + 1) * self.atom_hidden_dim, + self.atom_hidden_dim, + ) + self.mlp_out = nn.Linear(self.atom_hidden_dim, 3) + + def forward( + self, + frac_coords: paddle.Tensor, + element_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + lattice_matrices: paddle.Tensor, + lattice_lengths: paddle.Tensor, + lattice_angles: paddle.Tensor, + time_embeddings: paddle.Tensor, + differentiate_graph_construction: bool = False, + ) -> paddle.Tensor: + """GNN forward pass, returns (n_atoms, 3).""" + cm = paddle.no_grad() if not differentiate_graph_construction else nullcontext() + with cm: + ( + map_atom_to_xtal, + edge_index, + relative_fractional_positions, + cartesian_distances, + num_edges_per_crystal, + ) = self.construct_graphs(frac_coords, n_atoms_per_xtal, lattice_matrices) + fourier_relative_frac_pos = plane_wave_fourier_features( + relative_fractional_positions, self.plane_wave_freqs + ) + gaussian_smeared_cart_dists = self.gaussian_smearing(cartesian_distances) + normed_lattice_params = self.norm_lattice_params( + lattice_lengths, lattice_angles + ).repeat_interleave(num_edges_per_crystal, axis=0) + + if self.config.use_frac_coords_in_node_emb: + fourier_atom_frac_pos = plane_wave_fourier_features( + frac_coords, self.plane_wave_freqs + ) + else: + fourier_atom_frac_pos = None + + embed_out = self.embed_block( + element_indices, + time_embeddings, + fourier_relative_frac_pos, + gaussian_smeared_cart_dists, + normed_lattice_params, + fourier_atom_frac_pos, + ) + node_latents = embed_out["h"] + edge_latents = embed_out["e"] + + skip_connection_elements = [] + for interaction in self.interaction_blocks: + skip_connection_elements.append(node_latents) + node_latents = node_latents + interaction( + node_latents, + edge_index, + edge_latents, + map_atom_to_xtal, + lattice_matrices.shape[0], + ) + + skip_connection_elements.append(node_latents) + node_latents = self.mlp_skip_co(paddle.concat(skip_connection_elements, axis=1)) + out_vectors = self.mlp_out(node_latents) + return out_vectors + + @staticmethod + def construct_graphs( + frac_coords: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + lattice_matrices: paddle.Tensor, + ) -> tuple: + """Construct PBC graph structure.""" + n_crystals = lattice_matrices.shape[0] + n_nodes = frac_coords.shape[0] + atom_counts = n_atoms_per_xtal.cast("int64").reshape([-1]) + cumulative = paddle.cumsum(atom_counts, axis=0) + node_ids = paddle.arange(n_nodes, dtype=cumulative.dtype).reshape([-1, 1]) + map_atom_to_xtal = (node_ids >= cumulative.reshape([1, -1])).cast("int64").sum(axis=1) + map_atom_to_xtal = paddle.clip(map_atom_to_xtal, min=0, max=n_crystals - 1) + + cart_coords = frac_to_cart_coords( + frac_coords, n_atoms_per_xtal, lattice_matrix=lattice_matrices + ) + ( + destination_ids, + source_ids, + source_node_image_offsets, + num_edges_per_crystal, + ) = construct_fully_connected_graphs_with_periodic_boundaries( + cart_coords=cart_coords, + lattice_matrix=lattice_matrices, + num_nodes_per_crystal=n_atoms_per_xtal, + ) + out = ocp_get_pbc_distances( + coords=cart_coords, + source_id=source_ids, + destination_id=destination_ids, + lattice=lattice_matrices, + pbc_frac_offsets_per_source_node=source_node_image_offsets, + num_edges_per_crystal=num_edges_per_crystal, + ) + cartesian_distances = out["distances"] + edge_index = out["edge_index"] + relative_fractional_positions = frac_coords[source_ids] - frac_coords[destination_ids] + return ( + map_atom_to_xtal, + edge_index, + relative_fractional_positions, + cartesian_distances, + num_edges_per_crystal, + ) + + @paddle.no_grad() + def norm_lattice_params( + self, lattice_lengths: paddle.Tensor, lattice_angles: paddle.Tensor + ) -> paddle.Tensor: + """Normalize lattice parameters to [-1, 1].""" + param_ranges = lattice_parameter_ranges[self.config.dataset_name] + min_len = param_ranges["min_lattice_length"] + max_len = param_ranges["max_lattice_length"] + min_ang = param_ranges["min_lattice_angle"] + max_ang = param_ranges["max_lattice_angle"] + + normed_lengths = 2.0 * (lattice_lengths - min_len) / (max_len - min_len) - 1.0 + normed_angles = 2.0 * (lattice_angles - min_ang) / (max_ang - min_ang) - 1.0 + return paddle.concat([normed_lengths, normed_angles], axis=-1) + +class CSPLayer(nn.Layer): + """CSPNet message passing layer.""" + + def __init__( + self, + hidden_dim: int = 128, + act_fn: nn.Layer = None, + dis_emb=None, + ln: bool = False, + ): + super().__init__() + if act_fn is None: + act_fn = nn.Silu() + self.dis_dim = 3 + self.dis_emb = dis_emb + if dis_emb is not None: + self.dis_dim = dis_emb.dim + self.edge_mlp = nn.Sequential( + nn.Linear(hidden_dim * 2 + 6 + self.dis_dim, hidden_dim), + act_fn, + nn.Linear(hidden_dim, hidden_dim), + act_fn, + ) + self.node_mlp = nn.Sequential( + nn.Linear(hidden_dim * 2, hidden_dim), + act_fn, + nn.Linear(hidden_dim, hidden_dim), + act_fn, + ) + self.ln = ln + if self.ln: + self.layer_norm = nn.LayerNorm(hidden_dim) + + def edge_model( + self, + node_features: paddle.Tensor, + frac_coords: paddle.Tensor, + lattice_rep: paddle.Tensor, + edge_index: paddle.Tensor, + edge2graph: paddle.Tensor, + frac_diff: Optional[paddle.Tensor] = None, + ) -> paddle.Tensor: + hi = node_features[edge_index[0]] + hj = node_features[edge_index[1]] + if frac_diff is None: + xi = frac_coords[edge_index[0]] + xj = frac_coords[edge_index[1]] + frac_diff = (xj - xi) % 1.0 + if self.dis_emb is not None: + frac_diff = self.dis_emb(frac_diff) + lattice_rep_edges = lattice_rep[edge2graph] + edges_input = paddle.concat([hi, hj, lattice_rep_edges, frac_diff], axis=1) + return self.edge_mlp(edges_input) + + def node_model( + self, + node_features: paddle.Tensor, + edge_features: paddle.Tensor, + edge_index: paddle.Tensor, + ) -> paddle.Tensor: + agg = paddle_scatter( + edge_features, + edge_index[0], + dim=0, + dim_size=node_features.shape[0], + reduce="mean", + ) + agg = paddle.concat([node_features, agg], axis=1) + return self.node_mlp(agg) + + def forward( + self, + node_features: paddle.Tensor, + frac_coords: paddle.Tensor, + lattices: paddle.Tensor, + edge_index: paddle.Tensor, + edge2graph: paddle.Tensor, + frac_diff: Optional[paddle.Tensor] = None, + ) -> paddle.Tensor: + node_input = node_features + if self.ln: + node_features = self.layer_norm(node_input) + edge_features = self.edge_model( + node_features, frac_coords, lattices, edge_index, edge2graph, frac_diff + ) + node_output = self.node_model(node_features, edge_features, edge_index) + return node_input + node_output + +@dataclasses.dataclass +@dataclasses.dataclass +class CSPNetConfig: + hidden_dim: int = 256 + num_msg_pass_steps: int = 6 + ln: bool = False + act_fn: str = "silu" + dis_emb: str = "sin" + num_freqs: int = 128 + dense: bool = False + +class CSPNet(nn.Layer): + """CSPNet from DiffCSP architecture.""" + + def __init__(self, config: CSPNetConfig, time_embedder: nn.Layer): + super().__init__() + latent_dim = time_embedder.dim + num_layers = config.num_msg_pass_steps + max_atoms = NUM_ELEMENTS + hidden_dim = config.hidden_dim + num_freqs = config.num_freqs + act_fn_str = config.act_fn + dis_emb_str = config.dis_emb + dense = config.dense + ln = config.ln + + self.node_embedding = nn.Embedding(max_atoms, hidden_dim) + self.atom_latent_emb = nn.Linear(hidden_dim + latent_dim, hidden_dim) + + if act_fn_str == "silu": + self.act_fn = nn.Silu() + if dis_emb_str == "sin": + freqs = 2 * math.pi * paddle.arange(num_freqs, dtype=paddle.float32) + + class _SinusoidEmbedding(paddle.nn.Layer): + def __init__(self, freq_tensor, nf): + super().__init__() + self.dim = nf * 2 * 3 + self._freq = freq_tensor + + def forward(self, x): + emb = (x.unsqueeze(-1) * self._freq).reshape([-1, num_freqs * 3]) + return paddle.concat([emb.sin(), emb.cos()], axis=-1).detach() + + self.dis_emb = _SinusoidEmbedding(freqs, num_freqs) + elif dis_emb_str == "none": + self.dis_emb = None + + for i in range(num_layers): + self.add_sublayer( + f"csp_layer_{i}", + CSPLayer(hidden_dim, self.act_fn, self.dis_emb, ln=ln), + ) + self.num_layers = num_layers + self.dense = dense + + hidden_dim_before_out = hidden_dim + if self.dense: + hidden_dim_before_out = hidden_dim_before_out * (num_layers + 1) + + self.coord_out = nn.Linear(hidden_dim_before_out, 3, bias_attr=False) + self.ln = ln + if self.ln: + self.final_layer_norm = nn.LayerNorm(hidden_dim) + + def gen_edges( + self, num_atoms: paddle.Tensor, frac_coords: paddle.Tensor + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Generate fully-connected edges.""" + lis = [ + paddle.ones([n, n], dtype=paddle.float32) + for n in num_atoms.numpy().tolist() + ] + fc_graph = paddle.block_diag(lis) + fc_edges = paddle.nonzero(fc_graph).T + frac_diff = (frac_coords[fc_edges[1]] - frac_coords[fc_edges[0]]) % 1.0 + return fc_edges, frac_diff + + def forward( + self, + frac_coords: paddle.Tensor, + element_indices: paddle.Tensor, + n_atoms_per_xtal: paddle.Tensor, + lattice_matrices: paddle.Tensor, + lattice_lengths: paddle.Tensor, + lattice_angles: paddle.Tensor, + time_embeddings: paddle.Tensor, + *args, + **kwargs, + ) -> paddle.Tensor: + """CSPNet forward pass.""" + n_crystals = n_atoms_per_xtal.shape[0] + node2graph = paddle.arange(n_crystals).repeat_interleave(n_atoms_per_xtal, axis=0) + atom_types = element_indices + lattices = paddle.concat([lattice_lengths, lattice_angles], axis=-1) + + edges, frac_diff = self.gen_edges(n_atoms_per_xtal, frac_coords) + edge2graph = node2graph[edges[0]] + node_features = self.node_embedding(atom_types) + node_features = paddle.concat([node_features, time_embeddings], axis=-1) + node_features = self.atom_latent_emb(node_features) + + h_list = [node_features] + for i in range(self.num_layers): + # self.sublayers(name) returns all sublayer list in Paddle, cannot index by name; use getattr + node_features = getattr(self, f"csp_layer_{i}")( + node_features, frac_coords, lattices, edges, edge2graph, frac_diff=frac_diff + ) + if i != self.num_layers - 1: + h_list.append(node_features) + + if self.ln: + node_features = self.final_layer_norm(node_features) + h_list.append(node_features) + + if self.dense: + node_features = paddle.concat(h_list, axis=-1) + + return self.coord_out(node_features) +"""GNN submodules: Swish, GraphNorm, VPA, FourierLinear etc.""" +import math +from typing import Optional + +import paddle +import paddle.nn as nn +from ppmat.utils.scatter import scatter as paddle_scatter_scatter + + +class Swish(nn.Layer): + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + return nn.functional.silu(x) / 0.6 + +class VariancePreservingAggregation(nn.Layer): + """Variance preserving aggregation: vpa(X) = sum(X) / sqrt(|X|).""" + + def forward( + self, + src: paddle.Tensor, + index: paddle.Tensor, + dim_size: Optional[int] = None, + ) -> paddle.Tensor: + if dim_size is None: + dim_size = int(index.max().item()) + 1 + + sum_agg = paddle_scatter_scatter( + src, index, dim=0, dim_size=dim_size, reduce="sum" + ) + counts = paddle_scatter_scatter( + paddle.ones([src.shape[0]], dtype=src.dtype), + index, + dim=0, + dim_size=dim_size, + reduce="sum", + ) + return paddle.nan_to_num(sum_agg / paddle.sqrt(counts).unsqueeze(-1)) + +class FourierLinear(nn.Layer): + """Fourier feature encoding for 3D points.""" + + def __init__( + self, + input_dim: int, + num_fourier_frequencies: int, + scale: float, + output_dim: int, + num_layers: int = 1, + use_bias: bool = False, + ): + super().__init__() + assert num_layers >= 1 + self.num_fourier_frequencies = num_fourier_frequencies + self.scale = scale + self.output_dim = output_dim + self.num_layers = num_layers + + if self.scale > 0: + self.fourier_freqs = paddle.create_parameter( + shape=[input_dim, num_fourier_frequencies], + dtype="float32", + default_initializer=nn.initializer.Normal(std=scale), + ) + self.fourier_freqs.stop_gradient = True + in_dim = input_dim + 2 * num_fourier_frequencies + self.layer = nn.Linear(in_dim, output_dim, bias_attr=use_bias) + else: + in_dim = input_dim + self.layer = nn.Linear(in_dim, output_dim, bias_attr=use_bias) + self.weight = self.layer.weight + if num_layers > 1: + self.layers = nn.LayerList( + [nn.Linear(output_dim, output_dim) for _ in range(num_layers - 1)] + ) + + def forward(self, x: paddle.Tensor) -> paddle.Tensor: + if self.scale > 0: + with paddle.no_grad(): + v = 2 * math.pi * x @ self.fourier_freqs + v = paddle.concat([x, v.sin(), v.cos()], axis=-1) + else: + v = x + v = self.layer(v) + if self.num_layers > 1: + for layer in self.layers: + v = nn.functional.silu(layer(v)) + v + return v + +class GraphNorm(nn.Layer): + """Graph normalization layer.""" + + def __init__(self, in_channels: int, eps: float = 1e-5): + super().__init__() + self.in_channels = in_channels + self.eps = eps + self.weight = self.create_parameter( + [in_channels], + default_initializer=nn.initializer.Constant(1.0), + ) + self.bias = self.create_parameter( + [in_channels], + default_initializer=nn.initializer.Constant(0.0), + ) + self.mean_scale = self.create_parameter( + [in_channels], + default_initializer=nn.initializer.Constant(1.0), + ) + + def forward( + self, + x: paddle.Tensor, + map_node_to_graph: paddle.Tensor, + num_graphs: int, + ) -> paddle.Tensor: + sorted_order = paddle.argsort(map_node_to_graph) + sorted_map = map_node_to_graph[sorted_order] + sorted_x = x[sorted_order] + + mean = paddle_scatter_scatter( + sorted_x, sorted_map, dim=0, dim_size=num_graphs, reduce="mean" + ) + + out = x - mean[map_node_to_graph] * self.mean_scale + + sorted_out = out[sorted_order] + var = paddle_scatter_scatter( + sorted_out ** 2, sorted_map, dim=0, dim_size=num_graphs, reduce="mean" + ) + + std = (var + self.eps).sqrt()[map_node_to_graph].clip(min=1.0) + return self.weight * out / std + self.bias \ No newline at end of file diff --git a/ppmat/models/sgequidiff/resources/cgcnn_atom_init.json b/ppmat/models/sgequidiff/resources/cgcnn_atom_init.json new file mode 100644 index 00000000..7f6b7640 --- /dev/null +++ b/ppmat/models/sgequidiff/resources/cgcnn_atom_init.json @@ -0,0 +1 @@ +{"0": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "1": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "3": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "4": [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "5": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "6": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "7": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "8": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "9": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "10": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "11": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "12": [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "13": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "14": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "15": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "16": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "17": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "18": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "19": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], "20": [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "21": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "22": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "23": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "24": [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "25": [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "26": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "27": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "28": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "29": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "30": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "31": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "32": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "33": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "34": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "35": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "36": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], "37": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "38": [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], "39": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "40": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "41": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "42": [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "43": [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "44": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "45": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "46": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "47": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "48": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "49": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "50": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "51": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "52": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "53": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "54": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], "55": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "56": [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], "57": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "58": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "59": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "60": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "61": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "62": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "63": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "64": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "65": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "66": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "67": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "68": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "69": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "70": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "71": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "72": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "73": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "74": [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "75": [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "76": [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "77": [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "78": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "79": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "80": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "81": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "82": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "83": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "84": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "85": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "86": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "87": [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "88": [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], "89": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "90": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "91": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "92": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "93": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "94": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "95": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "96": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "97": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "98": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "99": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "100": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} \ No newline at end of file diff --git a/ppmat/models/sgequidiff/resources/init_tokens/space_group_features/space_group_embeddings_62dim.json b/ppmat/models/sgequidiff/resources/init_tokens/space_group_features/space_group_embeddings_62dim.json new file mode 100644 index 00000000..49b1de0f --- /dev/null +++ b/ppmat/models/sgequidiff/resources/init_tokens/space_group_features/space_group_embeddings_62dim.json @@ -0,0 +1 @@ +{"1": [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "2": [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "3": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "4": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "5": [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "6": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "7": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "8": [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "9": [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "10": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "11": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "12": [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "13": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "14": [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "15": [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "16": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "17": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "18": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "19": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "20": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "21": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "22": [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "23": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "24": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "25": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "26": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "27": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "28": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "29": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "30": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "31": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "32": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "33": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "34": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "35": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "36": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "37": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "38": [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "39": [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "40": [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "41": [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "42": [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "43": [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "44": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "45": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "46": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "47": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "48": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "49": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "50": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "51": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "52": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "53": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "54": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "55": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "56": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "57": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "58": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "59": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "60": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], "61": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], "62": [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "63": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "64": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "65": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "66": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "67": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "68": [0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "69": [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "70": [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "71": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "72": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "73": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "74": [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "75": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "76": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "77": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "78": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "79": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "80": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "81": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "82": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "83": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "84": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "85": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "86": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "87": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "88": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "89": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "90": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "91": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "92": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "93": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "94": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "95": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "96": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "97": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "98": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "99": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "100": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "101": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "102": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "103": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "104": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "105": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "106": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "107": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "108": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "109": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "110": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "111": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "112": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "113": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "114": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "115": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "116": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "117": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "118": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "119": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "120": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "121": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "122": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "123": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], "124": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], "125": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], "126": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], "127": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "128": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "129": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "130": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "131": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "132": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "133": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "134": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], "135": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], "136": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], "137": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], "138": [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], "139": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "140": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "141": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "142": [0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "143": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "144": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "145": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "146": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "147": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "148": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "149": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "150": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "151": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "152": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "153": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "154": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "155": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "156": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "157": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "158": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "159": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "160": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "161": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "162": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "163": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "164": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "165": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "166": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "167": [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "168": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "169": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "170": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "171": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "172": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "173": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "174": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "175": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "176": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "177": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "178": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "179": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "180": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "181": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "182": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "183": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "184": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "185": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "186": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "187": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "188": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "189": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "190": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "191": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "192": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "193": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "194": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "195": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "196": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "197": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "198": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "199": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "200": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "201": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "202": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "203": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "204": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "205": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "206": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "207": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "208": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "209": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "210": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "211": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "212": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "213": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "214": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "215": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "216": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "217": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "218": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "219": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "220": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "221": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "222": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "223": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "224": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "225": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "226": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "227": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "228": [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "229": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "230": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]} \ No newline at end of file diff --git a/ppmat/models/sgequidiff/resources/init_tokens/wyckoff_features/wyckoff_embeddings_231dim.json b/ppmat/models/sgequidiff/resources/init_tokens/wyckoff_features/wyckoff_embeddings_231dim.json new file mode 100644 index 00000000..f49e3f38 --- /dev/null +++ b/ppmat/models/sgequidiff/resources/init_tokens/wyckoff_features/wyckoff_embeddings_231dim.json @@ -0,0 +1 @@ +{"1": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "2": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "3": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "4": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0]}, "5": {"c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "6": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0]}, "7": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "8": {"b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0]}, "9": {"a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "10": {"o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "11": {"f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "12": {"j": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "i": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "13": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "14": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "15": {"f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "16": {"u": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "t": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "s": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "r": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "q": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "17": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 0.0, 0.6078572869300842, 0.423005610704422, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622306942939758, 8.90180388068984e-07, -1.5893254712295857e-08, 0.13873986899852753, -0.8783795833587646, -0.5617464780807495, 0.27052220702171326, -0.20048415660858154, 0.17397953569889069, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.6078572869300842, 0.423005610704422, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622306942939758, 8.90180388068984e-07, -1.5893254712295857e-08, 0.13873986899852753, -0.8783795833587646, -0.5617464780807495, 0.27052220702171326, -0.20048415660858154, 0.17397953569889069, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0]}, "18": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "19": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "20": {"c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "21": {"l": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "k": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "j": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "i": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "22": {"k": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "j": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.6078572869300842, 0.423005610704422, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622306942939758, 8.90180388068984e-07, -1.5893254712295857e-08, 0.13873986899852753, -0.8783795833587646, -0.5617464780807495, 0.27052220702171326, -0.20048415660858154, 0.17397953569889069, 1.0], "i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.6078572869300842, 0.423005610704422, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622306942939758, 8.90180388068984e-07, -1.5893254712295857e-08, 0.13873986899852753, -0.8783795833587646, -0.5617464780807495, 0.27052220702171326, -0.20048415660858154, 0.17397953569889069, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -3.973643103449831e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.0344628281891346, -0.2089928835630417, -0.8331294655799866, 1.525963284620957e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.4339791536331177, 0.1901615411043167, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "23": {"k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "24": {"d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0]}, "25": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "26": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0]}, "27": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "28": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "29": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "30": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "31": {"b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854228377342224, 2.7975288503512274e-06, 0.6000000238418579, -0.004891640041023493, 0.8295891880989075, 0.435690313577652, 0.1862967163324356, 0.4692026674747467, 0.08411922305822372, 1.0]}, "32": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "33": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "34": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "35": {"f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854228377342224, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "36": {"b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, -5.9604645663569045e-09, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0]}, "37": {"d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "38": {"f": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "e": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "d": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "c": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "b": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "a": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "39": {"d": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "40": {"c": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "b": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "a": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "41": {"b": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "a": [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "42": {"e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "43": {"b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "44": {"e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, -5.9604645663569045e-09, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "45": {"c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "46": {"c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "47": {"A": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "z": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "y": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "x": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "w": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "v": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "u": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "t": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "s": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "r": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "q": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "48": {"m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.9868215517249155e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.034462820738554, -0.2089928835630417, -0.8331294655799866, 1.5259630572472815e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.43397918343544006, 0.1901615411043167, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -3.973643103449831e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.0344628281891346, -0.2089928835630417, -0.8331294655799866, 1.525963284620957e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.4339791536331177, 0.1901615411043167, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252993285655975, 0.7818323969841003, -0.9009736180305481, 3.815961520103883e-07, 1.1924879750324635e-08, 0.9009693264961243, -0.7818314433097839, -0.22252397239208221, 0.9749258160591125, -0.6234887838363647, -0.43387386202812195, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.6078572869300842, 0.423005610704422, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622306942939758, 8.90180388068984e-07, -1.5893254712295857e-08, 0.13873986899852753, -0.8783795833587646, -0.5617464780807495, 0.27052220702171326, -0.20048415660858154, 0.17397953569889069, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "49": {"r": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "q": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382623314857483, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "50": {"m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252993285655975, 0.7818323969841003, -0.9009736180305481, 3.815961520103883e-07, 1.1924879750324635e-08, 0.9009693264961243, -0.7818314433097839, -0.22252397239208221, 0.9749258160591125, -0.6234887838363647, -0.43387386202812195, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.9868215517249155e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.034462820738554, -0.2089928835630417, -0.8331294655799866, 1.5259630572472815e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.43397918343544006, 0.1901615411043167, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -3.973643103449831e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.0344628281891346, -0.2089928835630417, -0.8331294655799866, 1.525963284620957e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.4339791536331177, 0.1901615411043167, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "51": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "52": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "53": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463375449180603, -0.23360633850097656, 0.2259555608034134, -0.36854225397109985, 2.7975288503512274e-06, 0.6000000238418579, -0.004891646094620228, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "54": {"f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "55": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "56": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252993285655975, 0.7818323969841003, -0.9009736180305481, 3.815961520103883e-07, 1.1924879750324635e-08, 0.9009693264961243, -0.7818314433097839, -0.22252397239208221, 0.9749258160591125, -0.6234887838363647, -0.43387386202812195, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "57": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "58": {"h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382623314857483, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "59": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, 0.0, -1.1920929132713809e-08, 0.0, 5.9604645663569045e-09, 1.1920929132713809e-08, -1.1920929132713809e-08, 0.0, -2.2737367883136385e-14, -4.371139183945161e-08, -0.623489499092102, -0.9749277830123901, -0.9009689092636108, -0.43388158082962036, 0.22252050042152405, 0.7818328738212585, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854228377342224, 2.7975288503512274e-06, 0.6000000238418579, -0.004891640041023493, 0.8295891880989075, 0.435690313577652, 0.1862967163324356, 0.4692026674747467, 0.08411922305822372, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "60": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "61": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "62": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "63": {"h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "64": {"g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "65": {"r": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "q": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "p": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "o": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "n": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "m": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "l": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "k": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "j": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "66": {"m": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "l": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382623314857483, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "k": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "j": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "i": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "67": {"o": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "n": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "m": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, -5.9604645663569045e-09, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "l": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "k": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "68": {"i": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "h": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "69": {"p": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "o": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382738053798676, 0.0324217863380909, 0.08411655575037003, 0.12004075199365616, 0.6453744173049927, 0.5239564180374146, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "n": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "m": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "l": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "k": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "70": {"h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.24040895700454712, 0.03724895045161247, 3.4969110629390343e-07, 0.8613673448562622, 0.19249248504638672, 0.41135740280151367, 0.6302127242088318, 0.26173174381256104, 0.6870490908622742, 0.006328781601041555, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7396504282951355, -0.2745634615421295, 0.21063528954982758, 0.3089073598384857, -0.361807256937027, 0.8060722351074219, -0.7278967499732971, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.974928081035614, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.974928081035614, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0, 0.23570223152637482, -0.018319308757781982, 0.29885077476501465, -0.2089931219816208, 0.00493544340133667, -0.4339800775051117, 0.7235705852508545, 2.0981467514502583e-06, -0.23570221662521362, -0.08026228100061417, 0.10457292944192886, 0.16666699945926666, 0.04380263760685921, -0.2089938521385193, -0.4546533524990082, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687304496765, 0.9937122464179993, -0.9749279618263245, 0.8467235565185547, -0.6234899163246155, 0.3302779197692871, 6.993822694312257e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438838362693787, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8047378063201904, 0.044077396392822266, 0.4079764783382416, 0.4816805422306061, -0.021355440840125084, 0.8545541763305664, -0.29592251777648926, 1.0, -3.973643103449831e-08, -0.13873916864395142, 0.9202178120613098, -0.7044058442115784, -0.04858136177062988, -0.20048582553863525, 0.6619952917098999, 3.0518206131091574e-06, 5.960464477539063e-08, -0.6078574657440186, 0.3219989538192749, 0.5617448091506958, -0.4311518967151642, -0.09654862433671951, -0.4159616529941559, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059196472168, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.4969113471561286e-07, 0.876995325088501, 0.011361360549926758, 0.12210747599601746, 0.668117344379425, 0.31722837686538696, 0.2793160080909729, -0.037129808217287064, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071066498756409, -0.4338839054107666, 0.11196467280387878, 0.22252076864242554, -0.5320330858230591, 0.7818313241004944, -0.9438838362693787, 1.0, 4.470348358154297e-08, -0.2637394666671753, 0.04736186936497688, -0.15674521028995514, 0.1804766058921814, -0.07548506557941437, 0.7194550633430481, 4.2280403249606024e-06, 7.450580596923828e-08, -0.06019701436161995, -0.09834746271371841, -0.1249997615814209, -0.14392639696598053, -0.15674401819705963, -0.16421379148960114, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.70710688829422, 0.6234904527664185, 0.8467234373092651, -0.43388378620147705, -0.9438862800598145, 0.22251832485198975, 0.9937126636505127, 5.404259809438372e-06, -0.7071066498756409, -0.7818309664726257, 0.5320332646369934, 0.9009688496589661, -0.3302706182003021, -0.9749284982681274, 0.11196046322584152, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "71": {"o": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "n": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382623314857483, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "m": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951534792780876, 0.6112627983093262, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "l": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "72": {"k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.032421790063381195, 0.08411654084920883, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382623314857483, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "73": {"f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "74": {"j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.6078572869300842, 0.423005610704422, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622306942939758, 8.90180388068984e-07, -1.5893254712295857e-08, 0.13873986899852753, -0.8783795833587646, -0.5617464780807495, 0.27052220702171326, -0.20048415660858154, 0.17397953569889069, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "75": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "76": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "77": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "78": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0]}, "79": {"c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "80": {"b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537027955055, 0.6112627983093262, 1.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.049515385180711746, 0.6112627983093262, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718393325805664, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0]}, "81": {"h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "82": {"g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "83": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "84": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382623314857483, 0.08411641418933868, 0.6453768014907837, 1.0, -4.371138828673793e-08, -0.48746389150619507, -0.2169422209262848, 0.39091551303863525, 0.3909142315387726, -0.2169414460659027, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.049515388906002045, 0.6112627983093262, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "85": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.3245476715439963e-08, 0.0, -6.622738357719982e-09, -1.3245476715439963e-08, 1.3245476715439963e-08, 0.0, 2.5263741904144217e-14, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "86": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.3245476715439963e-08, 0.0, -6.622738357719982e-09, -1.3245476715439963e-08, 1.3245476715439963e-08, 0.0, 2.5263741904144217e-14, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "87": {"i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "88": {"f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912862211465836, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912865191698074, 0.023583684116601944, 0.06873830407857895, 0.19249340891838074, 0.6302125453948975, 0.6870497465133667, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.2357022613286972, -0.018319308757781982, 0.29885077476501465, -0.2089931219816208, 0.00493544340133667, -0.4339801073074341, 0.7235705852508545, 2.0981467514502583e-06, -0.23570223152637482, -0.08026228100061417, 0.10457292944192886, 0.16666699945926666, 0.0438026487827301, -0.2089938372373581, -0.4546533524990082, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -0.70710688829422, 0.6234904527664185, 0.8467234373092651, -0.43388378620147705, -0.9438862800598145, 0.22251832485198975, 0.9937126636505127, 5.404259809438372e-06, -0.7071066498756409, -0.7818309664726257, 0.5320332646369934, 0.9009688496589661, -0.3302706182003021, -0.9749284982681274, 0.11196046322584152, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "89": {"p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "90": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "91": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.974928081035614, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "92": {"b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "93": {"p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -0.333333283662796, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.059482354670763016, 0.04297361895442009, -0.3003222644329071, -0.37077102065086365, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "94": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "95": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.974928081035614, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.74845538936097e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282002449036, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057245955104e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.22251145541667938, 0.6234912276268005, -0.9009647369384766, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "96": {"b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "97": {"k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "98": {"g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0, 0.7071068286895752, -0.9009687304496765, 0.9937122464179993, -0.9749279618263245, 0.8467235565185547, -0.6234899163246155, 0.3302779197692871, 6.993822694312257e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438838362693787, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -0.3333333134651184, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.05948235094547272, 0.042973607778549194, -0.3003222346305847, -0.37077102065086365, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537027955055, 0.6112627983093262, 1.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537027955055, 0.6112627983093262, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "99": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "100": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.6258851289749146, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030787944793701, 0.5169733166694641, 0.7857141494750977, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "101": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "102": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "103": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "104": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "105": {"f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.018114078789949417, 0.7331851720809937, 0.5463463664054871, -0.27983370423316956, -0.408426433801651, 0.433951199054718, 1.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.018114054575562477, 0.7331851720809937, 0.5463463664054871, -0.27983373403549194, -0.4084263741970062, 0.433951199054718, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, -5.9604645663569045e-09, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.531913161277771, 0.5420581698417664, 0.8226884007453918, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "106": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "107": {"e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.01811407133936882, 0.7331851720809937, 0.5463463068008423, -0.27983370423316956, -0.4084263741970062, 0.433951199054718, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "108": {"d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.6258851289749146, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030787944793701, 0.5169733166694641, 0.7857141494750977, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "109": {"c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999995678663254, -0.36053434014320374, -0.17299585044384003, 0.3084356188774109, 0.2617258131504059, -0.2927401065826416, -0.5010659098625183, 1.3987644251756137e-06, 0.0, 0.287516325712204, 0.7579430341720581, 0.6404737234115601, 0.12603969871997833, 0.06681588292121887, 0.6283198595046997, 1.0, 0.09999994933605194, -0.3605343699455261, -0.17299585044384003, 0.3084355890750885, 0.2617258131504059, -0.2927400767803192, -0.5010659098625183, 1.3987645388624514e-06, 0.0, 0.287516325712204, 0.7579430341720581, 0.6404737234115601, 0.12603971362113953, 0.06681589782238007, 0.6283197999000549, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414212942123413, 0.06382738798856735, 0.032421790063381195, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537027955055, 0.6112627983093262, 1.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.049515385180711746, 0.6112627983093262, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718393325805664, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0]}, "110": {"b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0]}, "111": {"o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "112": {"n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "113": {"f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.6258851289749146, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030787944793701, 0.5169733166694641, 0.7857141494750977, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "114": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "115": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.018114078789949417, 0.7331851720809937, 0.5463463664054871, -0.27983370423316956, -0.408426433801651, 0.433951199054718, 1.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.018114054575562477, 0.7331851720809937, 0.5463463664054871, -0.27983373403549194, -0.4084263741970062, 0.433951199054718, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, -5.9604645663569045e-09, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.531913161277771, 0.5420581698417664, 0.8226884007453918, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "116": {"j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -0.333333283662796, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.059482354670763016, 0.04297361895442009, -0.3003222644329071, -0.37077102065086365, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "117": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "118": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -0.3333333134651184, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.05948235094547272, 0.042973607778549194, -0.3003222346305847, -0.37077102065086365, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "119": {"j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999994933605194, -0.36053434014320374, -0.17299585044384003, 0.3084356188774109, 0.2617258131504059, -0.292740136384964, -0.5010659098625183, 1.3987644251756137e-06, 0.0, 0.2875162959098816, 0.7579430341720581, 0.6404737234115601, 0.12603971362113953, 0.06681591272354126, 0.6283198595046997, 1.0, 0.09999995678663254, -0.36053434014320374, -0.17299585044384003, 0.3084356188774109, 0.2617258131504059, -0.2927401065826416, -0.5010659098625183, 1.3987644251756137e-06, 0.0, 0.2875162959098816, 0.7579430341720581, 0.6404737234115601, 0.12603969871997833, 0.06681588292121887, 0.6283197999000549, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382738798856735, 0.03242179751396179, 0.08411654084920883, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "120": {"i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "121": {"j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "122": {"e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 0.0, 0.6078572273254395, 0.4230055809020996, -0.7044053077697754, -0.3392200171947479, -0.09654784202575684, -0.7622308135032654, 8.90180388068984e-07, -1.5893252935939017e-08, 0.13873988389968872, -0.8783795833587646, -0.5617464780807495, 0.2705221474170685, -0.20048415660858154, 0.1739795207977295, 1.0, 0.7071068286895752, -0.9009687304496765, 0.9937122464179993, -0.9749279618263245, 0.8467235565185547, -0.6234899163246155, 0.3302779197692871, 6.993822694312257e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438838362693787, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.049515385180711746, 0.6112627983093262, 1.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537027955055, 0.6112627983093262, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.037129778414964676, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "123": {"u": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "t": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "s": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "r": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "q": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007450997829437, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.45259732007980347, 0.6250003576278687, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007449507713318, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.4525972902774811, 0.6250003576278687, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "124": {"n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "125": {"n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.3571428656578064, -0.2654883563518524, 0.06513231247663498, -0.00901527889072895, 0.3096117675304413, 0.3405342102050781, 0.041629042476415634, 0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, -0.3571428656578064, -0.2654883563518524, 0.06513231247663498, -0.00901527889072895, 0.3096117675304413, 0.3405342102050781, 0.041629042476415634, 0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "126": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.3245476715439963e-08, 0.0, -6.622738357719982e-09, -1.3245476715439963e-08, 1.3245476715439963e-08, 0.0, 2.5263741904144217e-14, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "127": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.6258851289749146, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030787944793701, 0.5169733166694641, 0.7857141494750977, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260963916778564, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "128": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "129": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.3571428656578064, -0.2654883563518524, 0.06513231247663498, -0.00901527889072895, 0.3096117675304413, 0.3405342102050781, 0.041629042476415634, 0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, 0.3571428656578064, 0.2654883563518524, -0.06513231247663498, 0.00901527889072895, -0.3096117675304413, -0.3405342102050781, -0.041629042476415634, -0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5, -0.3909158408641815, -0.11126065254211426, 0.2169416844844818, 0.4504849314689636, 0.4874640107154846, 0.31174397468566895, -6.993822125878069e-07, 0.09999994933605194, -0.46114063262939453, -0.7774350643157959, -0.7108721137046814, -0.2904933989048004, 0.3002684712409973, 0.8036495447158813, 1.0, 0.5, 0.39091581106185913, 0.11126065254211426, -0.2169416844844818, -0.4504849314689636, -0.4874640107154846, -0.31174397468566895, 6.993822125878069e-07, 0.09999994933605194, -0.46114063262939453, -0.7774350643157959, -0.7108721137046814, -0.2904933989048004, 0.3002684712409973, 0.8036495447158813, 1.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, -5.9604645663569045e-09, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "130": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.3245476715439963e-08, 0.0, -6.622738357719982e-09, -1.3245476715439963e-08, 1.3245476715439963e-08, 0.0, 2.5263741904144217e-14, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "131": {"r": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "q": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.018114054575562477, 0.7331851720809937, 0.5463463664054871, -0.27983373403549194, -0.4084263741970062, 0.433951199054718, 1.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.018114078789949417, 0.7331851720809937, 0.5463463664054871, -0.27983370423316956, -0.408426433801651, 0.433951199054718, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414212942123413, 0.06382738053798676, 0.032421790063381195, 0.08411654829978943, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.531913161277771, 0.5420581698417664, 0.8226884007453918, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825320899486542, 0.04951540753245354, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "132": {"p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650633215904236, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069282054901, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650628745555878, -0.7201823592185974, 0.026789750903844833, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.216505229473114, -0.375, 0.23007452487945557, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.2561146914958954, 0.45259732007980347, 0.6250003576278687, -4.371138828673793e-08, -0.48746389150619507, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.04951539635658264, 0.6112627983093262, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "133": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.3245476715439963e-08, 0.0, -6.622738357719982e-09, -1.3245476715439963e-08, 1.3245476715439963e-08, 0.0, 2.5263741904144217e-14, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, -0.5690355896949768, 0.03971235826611519, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "134": {"n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.3571428656578064, -0.2654883563518524, 0.06513231247663498, -0.00901527889072895, 0.3096117675304413, 0.3405342102050781, 0.041629042476415634, 0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, -0.3571428656578064, -0.2654883563518524, 0.06513231247663498, -0.00901527889072895, 0.3096117675304413, 0.3405342102050781, 0.041629042476415634, 0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "135": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912711709737778, 0.06873814761638641, 0.6302149891853333, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "136": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650633215904236, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069282054901, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650628745555878, -0.7201823592185974, 0.026789750903844833, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.216505229473114, -0.375, 0.23007452487945557, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.2561146914958954, 0.45259732007980347, 0.6250003576278687, -4.371138828673793e-08, -0.48746389150619507, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746341466903687, 1.3987644251756137e-06, 0.0, 0.3887391984462738, 0.9504842758178711, 0.8117451667785645, 0.18825319409370422, 0.04951539635658264, 0.6112627983093262, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "137": {"h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.3245476715439963e-08, 0.0, -6.622738357719982e-09, -1.3245476715439963e-08, 1.3245476715439963e-08, 0.0, 2.5263741904144217e-14, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -5.9604645663569045e-09, 0.0, 8.940697071579962e-09, 1.7881394143159923e-08, -5.9604645663569045e-09, 0.0, -1.1368683941568192e-14, 0.09999998658895493, -0.46114057302474976, -0.7774350643157959, -0.7108720541000366, -0.2904933989048004, 0.3002684414386749, 0.8036495447158813, 1.0, 0.0, 0.0, 0.0, 5.9604645663569045e-09, 1.1920929132713809e-08, 0.0, 0.0, 0.0, 0.09999999403953552, -0.46114057302474976, -0.7774350643157959, -0.7108720541000366, -0.2904933989048004, 0.3002684414386749, 0.8036495447158813, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382738798856735, 0.03242179751396179, 0.08411654084920883, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "138": {"j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.3571428656578064, -0.2654883563518524, 0.06513231247663498, -0.00901527889072895, 0.3096117675304413, 0.3405342102050781, 0.041629042476415634, 0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, 0.3571428656578064, 0.2654883563518524, -0.06513231247663498, 0.00901527889072895, -0.3096117675304413, -0.3405342102050781, -0.041629042476415634, -0.12371756136417389, 0.12371786683797836, -0.670930027961731, -0.7736690640449524, -0.72006756067276, -0.5048803687095642, 0.3194417357444763, 0.6280345320701599, 0.785714328289032, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "139": {"o": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526700854301453, -0.05989290028810501, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.529586672782898, 0.20636089146137238, 0.23732516169548035, -0.32522544264793396, -0.2651694416999817, -0.5068963170051575, -0.22002656757831573, 6.993822125878069e-07, 0.529586672782898, 0.09937819093465805, 0.02674015983939171, 0.07423052936792374, 0.16661743819713593, 0.6356276273727417, 0.6288021802902222, 1.0], "n": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.09999995678663254, -0.6042662858963013, -0.2814669609069824, 0.5038933753967285, 0.45718294382095337, -0.40121084451675415, -0.7447975873947144, 2.0981467514502583e-06, -0.5, -0.01811407133936882, 0.7331851720809937, 0.5463463068008423, -0.27983370423316956, -0.4084263741970062, 0.433951199054718, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414212942123413, 0.06382738053798676, 0.032421790063381195, 0.08411654829978943, 0.12004073709249496, 0.6453744173049927, 0.5239564180374146, 1.0], "m": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414212942123413, 0.06382738053798676, 0.032421790063381195, 0.08411655575037003, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0], "l": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007449507713318, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.4525972902774811, 0.6250003576278687, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "140": {"m": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.625885009765625, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030788242816925, 0.5169733166694641, 0.7857141494750977, 0.12371790409088135, -0.3590250611305237, -0.2356572151184082, 0.32054784893989563, 0.3205474019050598, -0.23565673828125, -0.3590250015258789, 0.12371865659952164, 0.3571428656578064, 0.6258851289749146, 0.7397782206535339, 0.6448469758033752, 0.49800893664360046, 0.4030787944793701, 0.5169733166694641, 0.7857141494750977, 0.529586672782898, 0.20636089146137238, 0.23732516169548035, -0.32522544264793396, -0.2651694416999817, -0.5068963170051575, -0.22002656757831573, 6.993822125878069e-07, 0.529586672782898, 0.09937819093465805, 0.02674015983939171, 0.07423052936792374, 0.16661743819713593, 0.6356276273727417, 0.6288021802902222, 1.0], "l": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0], "k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "141": {"i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.09999995678663254, -0.36053434014320374, -0.17299585044384003, 0.3084356188774109, 0.2617258131504059, -0.2927401065826416, -0.5010659098625183, 1.3987644251756137e-06, 0.0, 0.287516325712204, 0.7579430341720581, 0.6404737234115601, 0.12603969871997833, 0.06681588292121887, 0.6283198595046997, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.09999999403953552, -0.46114057302474976, -0.7774350643157959, -0.7108720541000366, -0.2904933989048004, 0.3002684414386749, 0.8036495447158813, 1.0, 0.35937944054603577, -0.1910426765680313, 0.2642155587673187, -0.5146691799163818, 0.5137341618537903, -0.1833401620388031, -0.06506305932998657, 3.4969110629390343e-07, 0.8676185607910156, 0.12004003673791885, 0.2956574261188507, 0.645374596118927, 0.28393039107322693, 0.5239558815956116, -0.011054635047912598, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.974928081035614, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.48746392130851746, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.48746344447135925, 1.3987645388624514e-06, 0.0, 0.38873913884162903, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537027955055, 0.6112627983093262, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.371139183945161e-08, -0.623489499092102, -0.9749278426170349, -0.9009688496589661, -0.43388161063194275, 0.22252051532268524, 0.7818328738212585, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "142": {"g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111108213663101, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693464756012, 0.7365496158599854, 0.6214435696601868, 0.11912708729505539, 0.06873814761638641, 0.6302149891853333, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.11111105978488922, -0.4431018531322479, -0.7554914355278015, -0.6897502541542053, -0.2745613753795624, 0.308907151222229, 0.8060736060142517, 1.0, 0.35679009556770325, -0.30635011196136475, 0.3676113486289978, -0.5025780200958252, 0.4735686480998993, -0.2404089719057083, 0.03724895045161247, 3.4969110629390343e-07, 0.861367404460907, 0.19249248504638672, 0.4113573431968689, 0.630212664604187, 0.26173174381256104, 0.687049150466919, 0.0063288211822509766, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.974928081035614, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -4.371138473402425e-08, -0.4874638617038727, -0.2169422060251236, 0.39091551303863525, 0.3909142315387726, -0.2169414609670639, -0.4874633848667145, 1.398764311488776e-06, 0.0, 0.3887392282485962, 0.9504842758178711, 0.8117451667785645, 0.18825316429138184, 0.04951537773013115, 0.6112627983093262, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749279618263245, 0.6234879493713379, -1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059196472168, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210747599601746, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "143": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 7.152772951712905e-08, 0.10859064757823944, -0.3948224186897278, 0.5142247676849365, -0.3720747232437134, 0.3159335255622864, -0.2858535051345825, 2.797529077724903e-06, 0.8181818127632141, 0.024785172194242477, 0.8198556303977966, 0.4100812077522278, 0.2967226505279541, 0.6560442447662354, 0.0652456283569336, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0]}, "144": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.48112523555755615, -0.4763127565383911, 0.34643104672431946, -0.36762693524360657, 0.5187768936157227, -0.5201715230941772, 0.3511309325695038, -0.2886756360530853, 0.277777761220932, 0.6986225843429565, 0.2762693166732788, 0.39620739221572876, 0.5591052174568176, 0.4148232042789459, 0.5150127410888672, 0.16666728258132935]}, "145": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.48112523555755615, -0.4763127565383911, 0.34643104672431946, -0.36762693524360657, 0.5187768936157227, -0.5201715230941772, 0.3511309325695038, -0.2886756360530853, 0.277777761220932, 0.6986225843429565, 0.2762693166732788, 0.39620739221572876, 0.5591052174568176, 0.4148232042789459, 0.5150127410888672, 0.16666728258132935]}, "146": {"b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.4723775088787079, -0.47433528304100037, 0.37207335233688354, -0.39144057035446167, 0.5151087045669556, -0.5142247080802917, 0.3719139099121094, -0.3149188160896301, 0.27272722125053406, 0.695722222328186, 0.29671838879585266, 0.42187240719795227, 0.5551519393920898, 0.41008082032203674, 0.5454956889152527, 0.18181881308555603], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.5773503184318542, -0.4980645179748535, 0.06436535716056824, -0.10567697137594223, 0.5591263175010681, -0.585586428642273, 0.12251785397529602, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.051329605281353, 0.11389260739088058, 0.6025913953781128, 0.4669899344444275, 0.1797000616788864, 2.4504132056790695e-07]}, "147": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "148": {"f": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.4391024708747864, -0.22925862669944763, -0.43728429079055786, 0.3937944173812866, 0.27595746517181396, -0.39482182264328003, -0.16918493807315826, 0.3149181008338928, 0.7605478167533875, 0.7432382702827454, 0.2105851173400879, 0.15455295145511627, 0.7031250596046448, 0.8198562860488892, 0.05218677222728729, 0.18181782960891724], "e": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "c": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.45534181594848633, -0.0895216166973114, -0.5609334707260132, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307504028081894, -2.384185791015625e-07, 0.7886751294136047, 0.2902219891548157, 0.2701314687728882, 0.21076315641403198, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07], "b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "149": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17483966052532196, -0.449042409658432, -0.07837789505720139, -0.023457685485482216, 0.4109886884689331, -0.3378807306289673, 0.21261660754680634, -1.0083118695547455e-06, -0.03050210513174534, 0.37998971343040466, 0.015374280512332916, -0.008007258176803589, 0.24626219272613525, -0.010290730744600296, 0.17216436564922333, 7.82310962677002e-07, 0.17483966052532196, -0.4490424394607544, -0.07837788760662079, -0.023457681760191917, 0.4109886884689331, -0.3378807008266449, 0.21261660754680634, -1.0083118695547455e-06, -0.030502093955874443, 0.3799896538257599, 0.01537427306175232, -0.008007258176803589, 0.24626219272613525, -0.01029073167592287, 0.17216436564922333, 7.847945084904495e-07, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17483966052532196, -0.449042409658432, -0.07837789505720139, -0.023457685485482216, 0.4109886884689331, -0.3378807306289673, 0.21261662244796753, -1.0083118695547455e-06, -0.03050210140645504, 0.37998971343040466, 0.01537428330630064, -0.008007258176803589, 0.24626219272613525, -0.01029073167592287, 0.17216436564922333, 7.649262556697067e-07, 0.17483966052532196, -0.4490424394607544, -0.07837789505720139, -0.02345767617225647, 0.4109886884689331, -0.3378807306289673, 0.21261660754680634, -1.0086359907290898e-06, -0.03050210140645504, 0.3799896538257599, 0.01537428330630064, -0.008007258176803589, 0.24626219272613525, -0.010290741920471191, 0.17216436564922333, 7.698933472966019e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "150": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "151": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.44045576453208923, -0.21761387586593628, -0.44758838415145874, 0.4057295024394989, 0.2617063522338867, -0.39568984508514404, -0.14419034123420715, 0.288674920797348, 0.7628917098045349, 0.7054869532585144, 0.2155473232269287, 0.15923713147640228, 0.6668140888214111, 0.8216588497161865, 0.044476933777332306, 0.16666632890701294], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.050042688846588135, -0.13393166661262512, 0.1882966160774231, -0.014952193014323711, -0.04650520160794258, -0.6513679027557373, 2.161746124329511e-06, -9.934107758624577e-09, -0.01142196822911501, 0.2781111001968384, 0.15016140043735504, 0.01192427147179842, -0.09656926989555359, 0.14867424964904785, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.5855864882469177, -0.06436721235513687, 0.11598248034715652, -0.4696063697338104, 2.797528622977552e-06, 0.3333333432674408, -0.041163306683301926, 0.8414856791496277, 0.46699032187461853, 0.05133165419101715, 0.24084067344665527, 0.1071869507431984, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.6234894394874573, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262378573417664, -0.5000008940696716], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.5855864882469177, -0.06436721235513687, 0.11598248034715652, -0.4696063697338104, 2.797528622977552e-06, 0.3333333432674408, -0.041163306683301926, 0.8414856791496277, 0.46699032187461853, 0.05133165419101715, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, -0.050042688846588135, -0.13393166661262512, 0.1882966160774231, -0.014952193014323711, -0.04650520160794258, -0.6513679027557373, 2.161746124329511e-06, -9.934107758624577e-09, -0.01142196822911501, 0.2781111001968384, 0.15016140043735504, 0.01192427147179842, -0.09656926989555359, 0.14867424964904785, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "152": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.44045576453208923, -0.21761387586593628, -0.44758838415145874, 0.4057295024394989, 0.2617063522338867, -0.39568984508514404, -0.14419034123420715, 0.288674920797348, 0.7628917098045349, 0.7054869532585144, 0.2155473232269287, 0.15923713147640228, 0.6668140888214111, 0.8216588497161865, 0.044476933777332306, 0.16666632890701294], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "153": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.44045576453208923, -0.21761387586593628, -0.44758838415145874, 0.4057295024394989, 0.2617063522338867, -0.39568984508514404, -0.14419034123420715, 0.288674920797348, 0.7628917098045349, 0.7054869532585144, 0.2155473232269287, 0.15923713147640228, 0.6668140888214111, 0.8216588497161865, 0.044476933777332306, 0.16666632890701294], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.5855864882469177, -0.06436721235513687, 0.11598248034715652, -0.4696063697338104, 2.797528622977552e-06, 0.3333333432674408, -0.041163306683301926, 0.8414856791496277, 0.46699032187461853, 0.05133165419101715, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, -0.050042688846588135, -0.13393166661262512, 0.1882966160774231, -0.014952193014323711, -0.04650520160794258, -0.6513679027557373, 2.161746124329511e-06, -9.934107758624577e-09, -0.01142196822911501, 0.2781111001968384, 0.15016140043735504, 0.01192427147179842, -0.09656926989555359, 0.14867424964904785, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "154": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.44045576453208923, -0.21761387586593628, -0.44758838415145874, 0.4057295024394989, 0.2617063522338867, -0.39568984508514404, -0.14419034123420715, 0.288674920797348, 0.7628917098045349, 0.7054869532585144, 0.2155473232269287, 0.15923713147640228, 0.6668140888214111, 0.8216588497161865, 0.044476933777332306, 0.16666632890701294], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "155": {"f": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.4391024708747864, -0.22925862669944763, -0.43728429079055786, 0.3937944173812866, 0.27595746517181396, -0.39482182264328003, -0.16918493807315826, 0.3149181008338928, 0.7605478167533875, 0.7432382702827454, 0.2105851173400879, 0.15455295145511627, 0.7031250596046448, 0.8198562860488892, 0.05218677222728729, 0.18181782960891724], "e": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7216878533363342, -0.7144691348075867, 0.5196465849876404, -0.551440417766571, 0.778165340423584, -0.7802572846412659, 0.5266963839530945, -0.4330134391784668, -0.08333338052034378, 0.5479339361190796, -0.08559602499008179, 0.09431108832359314, 0.33865785598754883, 0.12223482877016068, 0.272519052028656, -0.24999910593032837, -2.9802322387695312e-08, -0.699503481388092, 0.10803348571062088, -0.25177648663520813, 0.5123830437660217, -0.25266233086586, 0.3745265305042267, -4.867712846134964e-07, -0.3333333134651184, 0.007009575609117746, -0.057668525725603104, -0.03411874175071716, -0.24195170402526855, -0.35799142718315125, 0.08118154853582382, -5.513429641723633e-07, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.6234894394874573, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262378573417664, -0.5000008940696716], "d": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.45534181594848633, -0.0895216166973114, -0.5609334707260132, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307504028081894, -2.384185791015625e-07, 0.7886751294136047, 0.2902219891548157, 0.2701314687728882, 0.21076315641403198, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07], "b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "156": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371788918972015, -0.5932809710502625, 0.29385900497436523, -0.46995624899864197, 0.46995338797569275, -0.29385989904403687, 0.5932801961898804, -0.12371887266635895, -0.0714285597205162, 0.232845738530159, -0.06707162410020828, 0.03521804139018059, 0.0352153442800045, -0.06707138568162918, 0.23284311592578888, -0.0714288279414177, 0.12371789664030075, -0.5932809114456177, 0.29385900497436523, -0.46995624899864197, 0.4699534773826599, -0.29385989904403687, 0.5932801365852356, -0.12371887266635895, -0.07142855226993561, 0.2328457534313202, -0.06707163155078888, 0.03521807864308357, 0.03521537780761719, -0.06707140058279037, 0.23284313082695007, -0.0714288204908371, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1154700443148613, -0.5942205190658569, 0.12822549045085907, -0.27467867732048035, 0.4696098268032074, -0.29032161831855774, 0.3891199231147766, -6.675720101156912e-07, -0.06666667014360428, 0.23321440815925598, -0.029266802594065666, 0.020584169775247574, 0.035189833492040634, -0.06626389920711517, 0.15271688997745514, -3.97364289028701e-07, 0.1154700368642807, -0.5942205190658569, 0.12822547554969788, -0.27467867732048035, 0.4696098268032074, -0.2903216779232025, 0.3891199231147766, -6.675720101156912e-07, -0.0666666328907013, 0.23321442306041718, -0.02926681749522686, 0.020584162324666977, 0.035189833492040634, -0.06626391410827637, 0.15271688997745514, -3.97364289028701e-07, 5.245366452300004e-08, -0.021431565284729004, -0.39950987696647644, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026376724243, 0.08411922305822372, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0]}, "157": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295890688896179, 0.435690313577652, 0.1862967312335968, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0]}, "158": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "159": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "160": {"c": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.12371788918972015, -0.5932809710502625, 0.29385900497436523, -0.46995624899864197, 0.46995338797569275, -0.29385989904403687, 0.5932801961898804, -0.12371887266635895, -0.0714285597205162, 0.232845738530159, -0.06707162410020828, 0.03521804139018059, 0.0352153442800045, -0.06707138568162918, 0.23284311592578888, -0.0714288279414177, 0.12371789664030075, -0.5932809114456177, 0.29385900497436523, -0.46995624899864197, 0.4699534773826599, -0.29385989904403687, 0.5932801365852356, -0.12371887266635895, -0.07142855226993561, 0.2328457534313202, -0.06707163155078888, 0.03521807864308357, 0.03521537780761719, -0.06707140058279037, 0.23284313082695007, -0.0714288204908371, 0.49487167596817017, -0.47942012548446655, 0.3061359226703644, -0.330205500125885, 0.5245410799980164, -0.5295165181159973, 0.31847190856933594, -0.2474363148212433, 0.2857142388820648, 0.7031803131103516, 0.2441350668668747, 0.35587671399116516, 0.5653175711631775, 0.4222756028175354, 0.46711090207099915, 0.14285768568515778], "b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1154700443148613, -0.5942205190658569, 0.12822549045085907, -0.27467867732048035, 0.4696098268032074, -0.29032161831855774, 0.3891199231147766, -6.675720101156912e-07, -0.06666667014360428, 0.23321440815925598, -0.029266802594065666, 0.020584169775247574, 0.035189833492040634, -0.06626389920711517, 0.15271688997745514, -3.97364289028701e-07, 0.1154700368642807, -0.5942205190658569, 0.12822547554969788, -0.27467867732048035, 0.4696098268032074, -0.2903216779232025, 0.3891199231147766, -6.675720101156912e-07, -0.0666666328907013, 0.23321442306041718, -0.02926681749522686, 0.020584162324666977, 0.035189833492040634, -0.06626391410827637, 0.15271688997745514, -3.97364289028701e-07, 0.5196152925491333, -0.4850134551525116, 0.23360474407672882, -0.2628469467163086, 0.5349166989326477, -0.5463374853134155, 0.2596856951713562, -0.17320556938648224, 0.29999998211860657, 0.7113842368125916, 0.18629343807697296, 0.28328147530555725, 0.5764997005462646, 0.43568992614746094, 0.38088762760162354, 0.10000045597553253], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.5773503184318542, -0.4980645179748535, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.585586428642273, 0.12251785397529602, -4.76837158203125e-07, 0.3333333134651184, 0.7305266857147217, 0.051329612731933594, 0.11389260739088058, 0.6025913953781128, 0.4669899344444275, 0.1797000616788864, 2.384185791015625e-07]}, "161": {"b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.4391024708747864, -0.22925862669944763, -0.43728429079055786, 0.3937944173812866, 0.27595746517181396, -0.39482182264328003, -0.16918493807315826, 0.3149181008338928, 0.7605478167533875, 0.7432382702827454, 0.2105851173400879, 0.15455295145511627, 0.7031250596046448, 0.8198562860488892, 0.05218677222728729, 0.18181782960891724], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.45534181594848633, -0.0895216166973114, -0.5609334707260132, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307504028081894, -2.384185791015625e-07, 0.7886751294136047, 0.2902219891548157, 0.2701314687728882, 0.21076315641403198, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07]}, "162": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411639928817749, 0.6453768014907837, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.22767098248004913, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017500281333923, 0.30271539092063904, -1.5397866945932037e-06, -0.3943375051021576, 0.0294527318328619, -0.020581046119332314, -0.12990714609622955, -0.11006701737642288, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.051329609006643295, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.433856423067482e-07, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.22767101228237152, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017499536275864, 0.3027154207229614, -1.5497207641601562e-06, -0.39433753490448, 0.0294527318328619, -0.020581046119332314, -0.12990713119506836, -0.11006700992584229, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.0513296015560627, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.384185791015625e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "163": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.5188278555870056, 0.27347180247306824, 0.1914835125207901, -0.28584954142570496, -0.33255690336227417, -0.4998299777507782, -0.25337836146354675, 6.993822694312257e-07, 0.5188278555870056, 0.13169710338115692, 0.02157502807676792, 0.06524324417114258, 0.2089599221944809, 0.6267667412757874, 0.7241164445877075, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17483966052532196, -0.449042409658432, -0.07837789505720139, -0.023457685485482216, 0.4109886884689331, -0.3378807306289673, 0.21261660754680634, -1.0083118695547455e-06, -0.03050210513174534, 0.37998971343040466, 0.015374280512332916, -0.008007258176803589, 0.24626219272613525, -0.010290730744600296, 0.17216436564922333, 7.82310962677002e-07, 0.17483966052532196, -0.4490424394607544, -0.07837788760662079, -0.023457681760191917, 0.4109886884689331, -0.3378807008266449, 0.21261660754680634, -1.0083118695547455e-06, -0.030502093955874443, 0.3799896538257599, 0.01537427306175232, -0.008007258176803589, 0.24626219272613525, -0.01029073167592287, 0.17216436564922333, 7.847945084904495e-07, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "164": {"j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1556091010570526, -0.3810589909553528, -0.3716519773006439, 0.1319364756345749, 0.40664640069007874, 4.5980726781635894e-07, -0.22490385174751282, 0.296295166015625, -0.25229206681251526, 0.12212818115949631, 0.3571431338787079, 0.047089654952287674, -0.1997583657503128, -0.08626820147037506, 0.11504309624433517, 0.29432836174964905, 0.33926263451576233, -0.35222166776657104, 0.3590250611305237, -0.359406054019928, 0.35323768854141235, -0.34053438901901245, 0.32145506143569946, -0.2962963283061981, 0.5380063652992249, 0.5619357228279114, 0.625885009765625, 0.4708811342716217, 0.7182384133338928, 0.37914153933525085, 0.8074502348899841, 0.2943301796913147, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3098077178001404, -0.4735395312309265, -0.2628381550312042, 0.08363181352615356, 0.2656996250152588, -0.010716783814132214, 0.22017018496990204, 0.17320406436920166, -0.33660250902175903, -0.051190853118896484, -0.0024454116355627775, -0.11336145550012589, -0.226156085729599, -0.4628336429595947, 0.07441852986812592, 0.10000012814998627, 0.5196152925491333, -0.485013484954834, 0.23360475897789001, -0.2628469467163086, 0.5349166989326477, -0.5463374853134155, 0.2596856951713562, -0.17320556938648224, 0.30000001192092896, 0.7113842368125916, 0.18629343807697296, 0.28328147530555725, 0.5764996409416199, 0.43568986654281616, 0.3808876574039459, 0.10000045597553253, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854228377342224, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "165": {"g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.5188278555870056, 0.27347180247306824, 0.1914835125207901, -0.28584954142570496, -0.33255690336227417, -0.4998299777507782, -0.25337836146354675, 6.993822694312257e-07, 0.5188278555870056, 0.13169710338115692, 0.02157502807676792, 0.06524324417114258, 0.2089599221944809, 0.6267667412757874, 0.7241164445877075, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "166": {"i": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.12371788918972015, -0.5932809710502625, 0.29385900497436523, -0.46995624899864197, 0.46995338797569275, -0.29385989904403687, 0.5932801961898804, -0.12371887266635895, -0.0714285597205162, 0.232845738530159, -0.06707162410020828, 0.03521804139018059, 0.0352153442800045, -0.06707138568162918, 0.23284311592578888, -0.0714288279414177, 0.12371789664030075, -0.5932809114456177, 0.29385900497436523, -0.46995624899864197, 0.4699534773826599, -0.29385989904403687, 0.5932801365852356, -0.12371887266635895, -0.07142855226993561, 0.2328457534313202, -0.06707163155078888, 0.03521807864308357, 0.03521537780761719, -0.06707140058279037, 0.23284313082695007, -0.0714288204908371, 0.4425823390483856, -0.19931496679782867, -0.46378058195114136, 0.4244846701622009, 0.23931176960468292, -0.39705392718315125, -0.10491309314966202, 0.24743559956550598, 0.766575038433075, 0.6461634039878845, 0.2233450561761856, 0.16659799218177795, 0.6097537279129028, 0.8244913816452026, 0.0323614738881588, 0.14285683631896973], "h": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.1154700443148613, -0.5942205190658569, 0.12822549045085907, -0.27467867732048035, 0.4696098268032074, -0.29032161831855774, 0.3891199231147766, -6.675720101156912e-07, -0.06666667014360428, 0.23321440815925598, -0.029266802594065666, 0.020584169775247574, 0.035189833492040634, -0.06626389920711517, 0.15271688997745514, -3.97364289028701e-07, 0.1154700368642807, -0.5942205190658569, 0.12822547554969788, -0.27467867732048035, 0.4696098268032074, -0.2903216779232025, 0.3891199231147766, -6.675720101156912e-07, -0.0666666328907013, 0.23321442306041718, -0.02926681749522686, 0.020584162324666977, 0.035189833492040634, -0.06626391410827637, 0.15271688997745514, -3.97364289028701e-07, 0.4464101791381836, -0.1663769632577896, -0.4929264187812805, 0.4582439363002777, 0.1990014910697937, -0.3995092511177063, -0.034214042127132416, 0.17320485413074493, 0.773205041885376, 0.5393809676170349, 0.2373809814453125, 0.17984752357006073, 0.507045328617096, 0.82958984375, 0.01055364590138197, 0.09999974071979523], "g": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.16666661202907562, -0.08209637552499771, -0.1974087506532669, 0.07879257202148438, -0.04212166741490364, -0.3765937387943268, 0.063856340944767, 0.866023600101471, -0.28867509961128235, 0.0061524310149252415, -0.24754227697849274, -0.255436509847641, 0.012993116863071918, -0.30032262206077576, -0.8521661758422852, -0.5000031590461731, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "f": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "c": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.45534181594848633, -0.0895216166973114, -0.560933530330658, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307503879070282, -2.384185791015625e-07, 0.7886751294136047, 0.29022201895713806, 0.2701314687728882, 0.2107631415128708, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07], "b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "167": {"f": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.2508017420768738, 0.2238733172416687, -0.36116471886634827, 0.37191352248191833, -0.25538894534111023, -0.21744896471500397, 0.5074964761734009, -0.31491848826408386, 0.9360048174858093, 0.03374345600605011, 0.5747904777526855, 0.5454970002174377, 0.04832238331437111, 0.9527065753936768, 0.37454909086227417, 0.18181833624839783], "e": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -2.9802322387695312e-08, -0.699503481388092, 0.10803347826004028, -0.2517765164375305, 0.5123830437660217, -0.25266233086586, 0.3745265305042267, -4.867712846134964e-07, -0.333333283662796, 0.007009585853666067, -0.0576685331761837, -0.03411873057484627, -0.24195168912410736, -0.35799145698547363, 0.08118156343698502, -5.513429641723633e-07, 0.7216878533363342, -0.7144691348075867, 0.5196465849876404, -0.551440417766571, 0.778165340423584, -0.7802572846412659, 0.5266963839530945, -0.4330134391784668, -0.08333337306976318, 0.5479339361190796, -0.08559602499008179, 0.09431108832359314, 0.33865785598754883, 0.12223482877016068, 0.272519052028656, -0.24999909102916718, 0.5, 0.29475513100624084, -0.9009687304496765, 0.9308738112449646, -0.365342378616333, -0.43388357758522034, 0.9555726051330566, -0.8660257458686829, 0.866025447845459, -0.9555729031562805, 0.4338839054107666, 0.3653411567211151, -0.9308732151985168, 0.9009689688682556, -0.2947559654712677, -0.49999961256980896], "d": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.3245476715439963e-08, -0.5370154976844788, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034851551055908, 0.5370143055915833, -9.5367431640625e-07, 1.3245476715439963e-08, 0.21076315641403198, -0.04116329178214073, 0.028632858768105507, 0.02863057516515255, -0.04116324335336685, 0.21076062321662903, -5.496872859112045e-07, -2.6490953430879927e-08, -0.5370155572891235, 0.18034754693508148, -0.38208165764808655, 0.3820783197879791, -0.18034853041172028, 0.5370143055915833, -9.5367431640625e-07, 9.934107758624577e-09, 0.21076315641403198, -0.041163284331560135, 0.028632858768105507, 0.02863054722547531, -0.041163232177495956, 0.21076063811779022, -5.563099989558395e-07, 0.2529396712779999, 0.4278619885444641, -0.12297895550727844, 0.1225179061293602, -0.44930288195610046, -0.21880146861076355, 0.5867235660552979, -1.1920928955078125e-07, 0.943983793258667, 0.06448978930711746, 0.1957198977470398, 0.17970077693462372, 0.08501306176185608, 0.958632230758667, 0.43302133679389954, 4.635916894812908e-08], "b": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.5, 0.29475513100624084, -0.9009687900543213, 0.9308737516403198, -0.365342378616333, -0.43388357758522034, 0.9555726051330566, -0.8660256862640381, 0.866025447845459, -0.9555728435516357, 0.4338839054107666, 0.3653411269187927, -0.9308732151985168, 0.9009689688682556, -0.2947559654712677, -0.49999961256980896]}, "168": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 6.799549367997315e-08, 0.08451245725154877, -0.3956904411315918, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.2762733995914459, 0.6214439868927002, 0.06874074041843414, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0]}, "169": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.44045576453208923, -0.21761387586593628, -0.44758838415145874, 0.4057295024394989, 0.2617063522338867, -0.39568984508514404, -0.14419034123420715, 0.288674920797348, 0.7628917098045349, 0.7054869532585144, 0.2155473232269287, 0.15923713147640228, 0.6668140888214111, 0.8216588497161865, 0.044476933777332306, 0.16666632890701294]}, "170": {"a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.44045576453208923, -0.21761387586593628, -0.44758838415145874, 0.4057295024394989, 0.2617063522338867, -0.39568984508514404, -0.14419034123420715, 0.288674920797348, 0.7628917098045349, 0.7054869532585144, 0.2155473232269287, 0.15923713147640228, 0.6668140888214111, 0.8216588497161865, 0.044476933777332306, 0.16666632890701294]}, "171": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.12371782213449478, 0.15076671540737152, -0.508745014667511, 0.5358102917671204, -0.5358127951622009, 0.508743405342102, -0.1507716178894043, 0.12372084707021713, 0.7857142686843872, -0.33384642004966736, 0.5132837891578674, 0.01729876920580864, 0.0173030998557806, 0.5132851004600525, -0.33384498953819275, 0.785713791847229, 0.12371796369552612, -0.009014810435473919, -0.08410529047250748, 0.13609324395656586, -0.13609372079372406, 0.08410466462373734, 0.009012894704937935, -0.12371645867824554, 0.7857142686843872, 0.36620065569877625, 0.717779278755188, 0.5185272097587585, 0.5185287594795227, 0.7177802920341492, 0.366201251745224, 0.7857145071029663, 0.49487167596817017, -0.47942012548446655, 0.3061359226703644, -0.330205500125885, 0.5245410799980164, -0.5295165181159973, 0.31847190856933594, -0.2474363148212433, 0.2857142388820648, 0.7031803131103516, 0.2441350668668747, 0.35587671399116516, 0.5653175711631775, 0.4222756028175354, 0.46711090207099915, 0.14285768568515778], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5053235292434692, -0.5498670339584351, 0.8461968302726746, 0.19624227285385132, -0.028645165264606476, -0.7945820093154907, 3.7300387702998705e-06, -0.3333333432674408, -0.44867050647735596, 0.8084751963615417, 0.3414871096611023, -0.48983287811279297, -0.3928157389163971, -0.15197120606899261, 1.0, -5.828185578593548e-08, -0.6499518752098083, -0.2892562747001648, 0.5212206840515137, 0.52121901512146, -0.2892552614212036, -0.6499512195587158, 1.8650193851499353e-06, -0.3333333432674408, 0.18498560786247253, 0.9339790344238281, 0.7489935755729675, -0.08232907205820084, -0.26731282472610474, 0.48168373107910156, 1.0, 0.5773503184318542, -0.4980645179748535, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.585586428642273, 0.12251785397529602, -4.76837158203125e-07, 0.3333333134651184, 0.7305266857147217, 0.051329612731933594, 0.11389260739088058, 0.6025913953781128, 0.4669899344444275, 0.1797000616788864, 2.384185791015625e-07], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5773503184318542, -0.4980645179748535, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333134651184, 0.7305266857147217, 0.0513296015560627, 0.11389261484146118, 0.6025913953781128, 0.4669899642467499, 0.1797000616788864, 2.4835267709022446e-07]}, "172": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.12371782213449478, 0.15076671540737152, -0.508745014667511, 0.5358102917671204, -0.5358127951622009, 0.508743405342102, -0.1507716178894043, 0.12372084707021713, 0.7857142686843872, -0.33384642004966736, 0.5132837891578674, 0.01729876920580864, 0.0173030998557806, 0.5132851004600525, -0.33384498953819275, 0.785713791847229, 0.12371796369552612, -0.009014810435473919, -0.08410529047250748, 0.13609324395656586, -0.13609372079372406, 0.08410466462373734, 0.009012894704937935, -0.12371645867824554, 0.7857142686843872, 0.36620065569877625, 0.717779278755188, 0.5185272097587585, 0.5185287594795227, 0.7177802920341492, 0.366201251745224, 0.7857145071029663, 0.49487167596817017, -0.47942012548446655, 0.3061359226703644, -0.330205500125885, 0.5245410799980164, -0.5295165181159973, 0.31847190856933594, -0.2474363148212433, 0.2857142388820648, 0.7031803131103516, 0.2441350668668747, 0.35587671399116516, 0.5653175711631775, 0.4222756028175354, 0.46711090207099915, 0.14285768568515778], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5053235292434692, -0.5498670339584351, 0.8461968302726746, 0.19624227285385132, -0.028645165264606476, -0.7945820093154907, 3.7300387702998705e-06, -0.3333333432674408, -0.44867050647735596, 0.8084751963615417, 0.3414871096611023, -0.48983287811279297, -0.3928157389163971, -0.15197120606899261, 1.0, -5.828185578593548e-08, -0.6499518752098083, -0.2892562747001648, 0.5212206840515137, 0.52121901512146, -0.2892552614212036, -0.6499512195587158, 1.8650193851499353e-06, -0.3333333432674408, 0.18498560786247253, 0.9339790344238281, 0.7489935755729675, -0.08232907205820084, -0.26731282472610474, 0.48168373107910156, 1.0, 0.5773503184318542, -0.4980645179748535, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.585586428642273, 0.12251785397529602, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.051329612731933594, 0.11389260739088058, 0.602591335773468, 0.4669899344444275, 0.1797000616788864, 2.4172993562388e-07], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.74845538936097e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282002449036, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057245955104e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.22251145541667938, 0.6234912276268005, -0.9009647369384766, 1.0, 1.74845538936097e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282002449036, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057245955104e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.22251145541667938, 0.6234912276268005, -0.9009647369384766, 1.0, 0.5773503184318542, -0.4980645179748535, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.333333283662796, 0.7305266857147217, 0.051329612731933594, 0.11389261484146118, 0.6025913953781128, 0.4669899046421051, 0.1797000616788864, 2.384185791015625e-07]}, "173": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "174": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.09090905636548996, -0.37207335233688354, -0.17699098587036133, 0.31593379378318787, 0.2734702229499817, -0.28584933280944824, -0.4998292922973633, 1.3987645388624514e-06, 0.0, 0.29671841859817505, 0.7754468321800232, 0.6560439467430115, 0.1316954791545868, 0.06524312496185303, 0.6267691254615784, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15850938856601715, -0.5514615774154663, -0.026479780673980713, 0.10175228118896484, 0.2116870880126953, -0.22105015814304352, 0.2711775302886963, -0.09796494990587234, -0.05150286480784416, 0.11978425830602646, 0.4569069445133209, 0.24781112372875214, -0.04844524338841438, 0.15196281671524048, 0.2867613732814789, 0.19849741458892822, 0.15850940346717834, -0.5514615178108215, -0.026479775086045265, 0.10175225883722305, 0.2116870880126953, -0.22105015814304352, 0.2711775004863739, -0.09796494990587234, -0.05150284245610237, 0.11978424340486526, 0.4569069445133209, 0.24781112372875214, -0.048445235937833786, 0.15196280181407928, 0.2867613732814789, 0.19849741458892822, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15850940346717834, -0.5514615178108215, -0.026479775086045265, 0.10175225883722305, 0.2116870880126953, -0.22105015814304352, 0.2711775004863739, -0.09796494990587234, -0.05150286480784416, 0.11978425830602646, 0.4569069445133209, 0.24781112372875214, -0.04844522476196289, 0.15196281671524048, 0.2867613732814789, 0.19849741458892822, 0.15850938856601715, -0.5514615774154663, -0.026479780673980713, 0.10175228118896484, 0.2116870880126953, -0.22105015814304352, 0.2711775302886963, -0.09796494990587234, -0.05150286480784416, 0.11978425830602646, 0.4569069445133209, 0.24781112372875214, -0.04844522476196289, 0.15196281671524048, 0.2867613732814789, 0.19849741458892822, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "175": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.07320515811443329, -0.3265649378299713, -0.1356326788663864, 0.2239733636379242, 0.1514234095811844, -0.24314317107200623, -0.23899264633655548, 0.34641027450561523, -0.4732050895690918, -0.050564955919981, 0.5365599393844604, 0.442744642496109, -0.18821153044700623, -0.4652792811393738, -0.05704188346862793, 0.399998277425766, 0.3663902282714844, -0.23454992473125458, 0.1742645800113678, -0.07288289070129395, 0.237043097615242, -0.46195587515830994, -0.20867054164409637, -0.3464100956916809, 0.15176376700401306, 0.5645985007286072, 0.7244660258293152, 0.7374101877212524, 0.45116615295410156, 0.26207900047302246, 0.5100952386856079, 0.4000008702278137, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.07320515811443329, -0.3265649378299713, -0.1356326788663864, 0.2239733636379242, 0.1514234095811844, -0.24314317107200623, -0.23899264633655548, 0.34641027450561523, -0.4732050895690918, -0.05056494474411011, 0.5365599393844604, 0.44274458289146423, -0.18821153044700623, -0.4652792513370514, -0.05704189091920853, 0.399998277425766, 0.3663902282714844, -0.23454992473125458, 0.1742645800113678, -0.07288289070129395, 0.237043097615242, -0.46195587515830994, -0.20867054164409637, -0.3464100956916809, 0.15176376700401306, 0.5645984411239624, 0.7244659662246704, 0.7374101877212524, 0.45116615295410156, 0.26207900047302246, 0.5100952386856079, 0.4000008702278137, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "176": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.5188278555870056, 0.27347180247306824, 0.1914835125207901, -0.28584954142570496, -0.33255690336227417, -0.4998299777507782, -0.25337836146354675, 6.993822694312257e-07, 0.5188278555870056, 0.13169710338115692, 0.02157502807676792, 0.06524324417114258, 0.2089599221944809, 0.6267667412757874, 0.7241164445877075, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15850938856601715, -0.5514615774154663, -0.026479780673980713, 0.10175228118896484, 0.2116870880126953, -0.22105015814304352, 0.2711775302886963, -0.09796494990587234, -0.05150286480784416, 0.11978425830602646, 0.4569069445133209, 0.24781112372875214, -0.04844524338841438, 0.15196281671524048, 0.2867613732814789, 0.19849741458892822, 0.15850940346717834, -0.5514615178108215, -0.026479775086045265, 0.10175225883722305, 0.2116870880126953, -0.22105015814304352, 0.2711775004863739, -0.09796494990587234, -0.05150284245610237, 0.11978424340486526, 0.4569069445133209, 0.24781112372875214, -0.048445235937833786, 0.15196280181407928, 0.2867613732814789, 0.19849741458892822, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "177": {"n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.22767098248004913, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017500281333923, 0.30271539092063904, -1.5397866945932037e-06, -0.3943375051021576, 0.0294527318328619, -0.020581046119332314, -0.12990714609622955, -0.11006701737642288, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.051329609006643295, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.433856423067482e-07, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.22767101228237152, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017499536275864, 0.3027154207229614, -1.5497207641601562e-06, -0.39433753490448, 0.0294527318328619, -0.020581046119332314, -0.12990713119506836, -0.11006700992584229, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.0513296015560627, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.384185791015625e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "178": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.2509799003601074, 0.24087238311767578, -0.341315895318985, 0.35113054513931274, -0.27154842019081116, -0.21756169199943542, 0.5140987038612366, -0.2886752486228943, 0.9366697669029236, 0.03630565106868744, 0.543201208114624, 0.5150139331817627, 0.05137993395328522, 0.9532004594802856, 0.37942180037498474, 0.16666680574417114], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.5855864882469177, -0.06436721235513687, 0.11598248034715652, -0.4696063697338104, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, -0.050042688846588135, -0.13393166661262512, 0.1882966160774231, -0.014952193014323711, -0.04650519788265228, -0.6513679027557373, 2.161746124329511e-06, -1.9868215517249155e-08, -0.01142196822911501, 0.2781111001968384, 0.15016140043735504, 0.011924256570637226, -0.0965692475438118, 0.14867424964904785, 1.0, 0.5, 0.29475513100624084, -0.9009687304496765, 0.9308738112449646, -0.365342378616333, -0.43388357758522034, 0.9555726051330566, -0.8660257458686829, 0.866025447845459, -0.9555729031562805, 0.4338839054107666, 0.3653411567211151, -0.9308732151985168, 0.9009689688682556, -0.2947559654712677, -0.49999961256980896], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "179": {"c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216580152511597, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 6.799549367997315e-08, 0.08451245725154877, -0.3956904709339142, 0.520171582698822, -0.3464324176311493, 0.29927095770835876, -0.30116623640060425, 2.7975288503512274e-06, 0.7777777910232544, 0.019289467483758926, 0.8216581344604492, 0.41482365131378174, 0.27627336978912354, 0.6214439868927002, 0.06874074041843414, 1.0, 0.2509799003601074, 0.24087238311767578, -0.341315895318985, 0.35113054513931274, -0.27154842019081116, -0.21756169199943542, 0.5140987038612366, -0.2886752486228943, 0.9366697669029236, 0.03630565106868744, 0.543201208114624, 0.5150139331817627, 0.05137993395328522, 0.9532004594802856, 0.37942180037498474, 0.16666680574417114], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.5, 0.29475513100624084, -0.9009687900543213, 0.930873692035675, -0.365342378616333, -0.43388357758522034, 0.9555726051330566, -0.8660256862640381, 0.866025447845459, -0.9555728435516357, 0.4338839054107666, 0.36534109711647034, -0.9308732151985168, 0.9009689688682556, -0.2947559654712677, -0.49999961256980896], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "180": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.12371782213449478, 0.15076671540737152, -0.508745014667511, 0.5358102917671204, -0.5358127951622009, 0.508743405342102, -0.1507716178894043, 0.12372084707021713, 0.7857142686843872, -0.33384642004966736, 0.5132837891578674, 0.01729876920580864, 0.0173030998557806, 0.5132851004600525, -0.33384498953819275, 0.785713791847229, 0.12371796369552612, -0.009014810435473919, -0.08410529047250748, 0.13609324395656586, -0.13609372079372406, 0.08410466462373734, 0.009012894704937935, -0.12371645867824554, 0.7857142686843872, 0.36620065569877625, 0.717779278755188, 0.5185272097587585, 0.5185287594795227, 0.7177802920341492, 0.366201251745224, 0.7857145071029663, 0.4425823390483856, -0.19931496679782867, -0.46378058195114136, 0.4244846701622009, 0.23931176960468292, -0.39705392718315125, -0.10491309314966202, 0.24743559956550598, 0.766575038433075, 0.6461634039878845, 0.2233450561761856, 0.16659799218177795, 0.6097537279129028, 0.8244913816452026, 0.0323614738881588, 0.14285683631896973], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3333333134651184, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.05948235094547272, 0.042973607778549194, -0.3003222346305847, -0.37077102065086365, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.74845538936097e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282002449036, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057245955104e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.22251145541667938, 0.6234912276268005, -0.9009647369384766, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5053235292434692, -0.5498670935630798, 0.8461968302726746, 0.19624227285385132, -0.028645165264606476, -0.7945820689201355, 3.7300387702998705e-06, -0.3333333432674408, -0.44867050647735596, 0.8084751963615417, 0.3414871096611023, -0.48983293771743774, -0.3928157389163971, -0.15197119116783142, 1.0, -5.828185578593548e-08, -0.6499518752098083, -0.2892562747001648, 0.5212206840515137, 0.52121901512146, -0.2892552614212036, -0.6499512195587158, 1.8650193851499353e-06, -0.3333333432674408, 0.18498563766479492, 0.9339790344238281, 0.7489935755729675, -0.08232906460762024, -0.26731282472610474, 0.48168373107910156, 1.0, 0.45534181594848633, -0.0895216166973114, -0.560933530330658, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307503879070282, -2.384185791015625e-07, 0.7886751294136047, 0.29022201895713806, 0.2701314687728882, 0.2107631415128708, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.45534181594848633, -0.0895216166973114, -0.560933530330658, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307504028081894, -2.384185791015625e-07, 0.7886751294136047, 0.2902219891548157, 0.2701314687728882, 0.21076315641403198, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7484555314695172e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282598495483, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057700702455e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.2225114405155182, 0.6234912276268005, -0.9009647369384766, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "181": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.12371782213449478, 0.15076671540737152, -0.508745014667511, 0.5358102917671204, -0.5358127951622009, 0.508743405342102, -0.1507716178894043, 0.12372084707021713, 0.7857142686843872, -0.33384642004966736, 0.5132837891578674, 0.01729876920580864, 0.0173030998557806, 0.5132851004600525, -0.33384498953819275, 0.785713791847229, 0.12371796369552612, -0.009014810435473919, -0.08410529047250748, 0.13609324395656586, -0.13609372079372406, 0.08410466462373734, 0.009012894704937935, -0.12371645867824554, 0.7857142686843872, 0.36620065569877625, 0.717779278755188, 0.5185272097587585, 0.5185287594795227, 0.7177802920341492, 0.366201251745224, 0.7857145071029663, 0.4425823390483856, -0.19931496679782867, -0.46378058195114136, 0.4244846701622009, 0.23931176960468292, -0.39705392718315125, -0.10491309314966202, 0.24743559956550598, 0.766575038433075, 0.6461634039878845, 0.2233450561761856, 0.16659799218177795, 0.6097537279129028, 0.8244913816452026, 0.0323614738881588, 0.14285683631896973], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.333333283662796, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.059482354670763016, 0.04297361895442009, -0.3003222644329071, -0.37077102065086365, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3333333134651184, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.05948235094547272, 0.042973607778549194, -0.3003222346305847, -0.37077102065086365, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.333333283662796, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.059482354670763016, 0.04297361895442009, -0.3003222644329071, -0.37077102065086365, 1.0, -0.333333283662796, -0.035719990730285645, -0.19740895926952362, 0.2606106996536255, 0.009809434413909912, 0.3765932619571686, -0.769930899143219, 2.924727596109733e-06, -1.9868215517249155e-08, -0.07417353242635727, 0.24754194915294647, 0.059482354670763016, 0.04297361895442009, -0.3003222644329071, -0.37077102065086365, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5053235292434692, -0.5498670935630798, 0.8461968302726746, 0.19624227285385132, -0.028645165264606476, -0.7945820689201355, 3.7300387702998705e-06, -0.3333333432674408, -0.44867050647735596, 0.8084751963615417, 0.3414871096611023, -0.48983293771743774, -0.3928157389163971, -0.15197119116783142, 1.0, -5.828185578593548e-08, -0.6499518752098083, -0.2892562747001648, 0.5212206840515137, 0.52121901512146, -0.2892552614212036, -0.6499512195587158, 1.8650193851499353e-06, -0.3333333432674408, 0.18498563766479492, 0.9339790344238281, 0.7489935755729675, -0.08232906460762024, -0.26731282472610474, 0.48168373107910156, 1.0, 0.45534181594848633, -0.0895216166973114, -0.5609334707260132, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307504028081894, -2.384185791015625e-07, 0.7886751294136047, 0.2902219891548157, 0.2701314687728882, 0.21076315641403198, 0.26739224791526794, 0.8414863348007202, -0.04033128544688225, -1.5894572413799324e-07], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.74845538936097e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282002449036, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057245955104e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.22251145541667938, 0.6234912276268005, -0.9009647369384766, 1.0, 1.74845538936097e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282002449036, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057245955104e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.22251145541667938, 0.6234912276268005, -0.9009647369384766, 1.0, 0.45534181594848633, -0.0895216166973114, -0.560933530330658, 0.5370155572891235, 0.10494416952133179, -0.4052382707595825, 0.1307504028081894, -2.384185791015625e-07, 0.7886751294136047, 0.2902219891548157, 0.2701314687728882, 0.21076315641403198, 0.26739221811294556, 0.841486394405365, -0.04033128544688225, -1.5894572413799324e-07], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7484555314695172e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282598495483, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057700702455e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.2225114405155182, 0.6234912276268005, -0.9009647369384766, 1.0, 1.7484555314695172e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282598495483, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057700702455e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.2225114405155182, 0.6234912276268005, -0.9009647369384766, 1.0, 0.866025447845459, -0.563319981098175, -0.781831681728363, 0.6801729202270508, 0.6801748871803284, -0.7818312644958496, -0.5633214116096497, 0.8660249710083008, 0.4999999701976776, 0.8262388110160828, -0.623489499092102, -0.7330517172813416, 0.7330498695373535, 0.6234900951385498, -0.8262379169464111, -0.5000008344650269], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.7484555314695172e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282598495483, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057700702455e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.2225114405155182, 0.6234912276268005, -0.9009647369384766, 1.0, 1.7484555314695172e-07, 0.43388497829437256, -0.7818323969841003, 0.9749282598495483, -0.9749301075935364, 0.781830370426178, -0.4338923394680023, 5.595057700702455e-06, 0.9999999403953552, -0.9009683132171631, 0.6234886646270752, -0.2225193828344345, -0.2225114405155182, 0.6234912276268005, -0.9009647369384766, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "182": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.5188278555870056, 0.27347180247306824, 0.1914835125207901, -0.28584954142570496, -0.33255690336227417, -0.4998299777507782, -0.25337836146354675, 6.993822694312257e-07, 0.5188278555870056, 0.13169710338115692, 0.02157502807676792, 0.06524324417114258, 0.2089599221944809, 0.6267667412757874, 0.7241164445877075, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17483966052532196, -0.449042409658432, -0.07837789505720139, -0.023457685485482216, 0.4109886884689331, -0.3378807306289673, 0.21261660754680634, -1.0083118695547455e-06, -0.03050210513174534, 0.37998971343040466, 0.015374280512332916, -0.008007258176803589, 0.24626219272613525, -0.010290730744600296, 0.17216436564922333, 7.82310962677002e-07, 0.17483966052532196, -0.4490424394607544, -0.07837788760662079, -0.023457681760191917, 0.4109886884689331, -0.3378807008266449, 0.21261660754680634, -1.0083118695547455e-06, -0.030502093955874443, 0.3799896538257599, 0.01537427306175232, -0.008007258176803589, 0.24626219272613525, -0.01029073167592287, 0.17216436564922333, 7.847945084904495e-07, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "183": {"f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1556091010570526, -0.3810589909553528, -0.3716519773006439, 0.1319364756345749, 0.40664640069007874, 4.5980726781635894e-07, -0.22490385174751282, 0.296295166015625, -0.25229206681251526, 0.12212818115949631, 0.3571431338787079, 0.047089654952287674, -0.1997583657503128, -0.08626820147037506, 0.11504309624433517, 0.29432836174964905, 0.33926263451576233, -0.35222166776657104, 0.3590250611305237, -0.359406054019928, 0.35323768854141235, -0.34053438901901245, 0.32145506143569946, -0.2962963283061981, 0.5380063652992249, 0.5619357228279114, 0.625885009765625, 0.4708811342716217, 0.7182384133338928, 0.37914153933525085, 0.8074502348899841, 0.2943301796913147, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3098077178001404, -0.4735395312309265, -0.2628381550312042, 0.08363181352615356, 0.2656996250152588, -0.010716783814132214, 0.22017018496990204, 0.17320406436920166, -0.33660250902175903, -0.051190853118896484, -0.0024454116355627775, -0.11336145550012589, -0.226156085729599, -0.4628336429595947, 0.07441852986812592, 0.10000012814998627, 0.5196152925491333, -0.485013484954834, 0.23360475897789001, -0.2628469467163086, 0.5349166989326477, -0.5463374853134155, 0.2596856951713562, -0.17320556938648224, 0.30000001192092896, 0.7113842368125916, 0.18629343807697296, 0.28328147530555725, 0.5764996409416199, 0.43568986654281616, 0.3808876574039459, 0.10000045597553253, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854228377342224, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854231357574463, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163306683301926, 0.8414857387542725, 0.46699032187461853, 0.05133165046572685, 0.24084067344665527, 0.1071869507431984, 1.0]}, "184": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "185": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411639928817749, 0.6453768014907837, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "186": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1556091010570526, -0.3810589909553528, -0.3716519773006439, 0.1319364756345749, 0.40664640069007874, 4.5980726781635894e-07, -0.22490385174751282, 0.296295166015625, -0.25229206681251526, 0.12212818115949631, 0.3571431338787079, 0.047089654952287674, -0.1997583657503128, -0.08626820147037506, 0.11504309624433517, 0.29432836174964905, 0.33926263451576233, -0.35222166776657104, 0.3590250611305237, -0.359406054019928, 0.35323768854141235, -0.34053438901901245, 0.32145506143569946, -0.2962963283061981, 0.5380063652992249, 0.5619357228279114, 0.625885009765625, 0.4708811342716217, 0.7182384133338928, 0.37914153933525085, 0.8074502348899841, 0.2943301796913147, 6.244484040962561e-08, 0.04667530581355095, -0.397054523229599, 0.5295165777206421, -0.3061373829841614, 0.27308687567710876, -0.32522913813591003, 2.7975288503512274e-06, 0.7142857313156128, 0.010653359815478325, 0.8244906663894653, 0.42227602005004883, 0.24413886666297913, 0.5670720934867859, 0.0742330551147461, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3098077178001404, -0.4735395312309265, -0.2628381550312042, 0.08363181352615356, 0.2656996250152588, -0.010716783814132214, 0.22017018496990204, 0.17320406436920166, -0.33660250902175903, -0.051190853118896484, -0.0024454116355627775, -0.11336145550012589, -0.226156085729599, -0.4628336429595947, 0.07441852986812592, 0.10000012814998627, 0.5196152925491333, -0.485013484954834, 0.23360475897789001, -0.2628469467163086, 0.5349166989326477, -0.5463374853134155, 0.2596856951713562, -0.17320556938648224, 0.30000001192092896, 0.7113842368125916, 0.18629343807697296, 0.28328147530555725, 0.5764996409416199, 0.43568986654281616, 0.3808876574039459, 0.10000045597553253, 5.245366452300004e-08, -0.021431565284729004, -0.39950984716415405, 0.5463374853134155, -0.23360633850097656, 0.2259555608034134, -0.36854228377342224, 2.7975288503512274e-06, 0.6000000238418579, -0.004891633987426758, 0.8295891880989075, 0.435690313577652, 0.18629670143127441, 0.4692026674747467, 0.08411922305822372, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 2.91409261166109e-08, -0.18034760653972626, -0.40523895621299744, 0.585586428642273, -0.06436721235513687, 0.11598248034715652, -0.4696063995361328, 2.797528622977552e-06, 0.3333333134651184, -0.041163284331560135, 0.8414857387542725, 0.46699032187461853, 0.05133163928985596, 0.24084067344665527, 0.1071869507431984, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "187": {"o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.12371788918972015, -0.5932809710502625, 0.29385900497436523, -0.46995624899864197, 0.46995338797569275, -0.29385989904403687, 0.5932801961898804, -0.12371887266635895, -0.0714285597205162, 0.232845738530159, -0.06707162410020828, 0.03521804139018059, 0.0352153442800045, -0.06707138568162918, 0.23284311592578888, -0.0714288279414177, 0.12371789664030075, -0.5932809114456177, 0.29385900497436523, -0.46995624899864197, 0.4699534773826599, -0.29385989904403687, 0.5932801365852356, -0.12371887266635895, -0.07142855226993561, 0.2328457534313202, -0.06707163155078888, 0.03521807864308357, 0.03521537780761719, -0.06707140058279037, 0.23284313082695007, -0.0714288204908371, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1154700443148613, -0.5942205190658569, 0.12822549045085907, -0.27467867732048035, 0.4696098268032074, -0.29032161831855774, 0.3891199231147766, -6.675720101156912e-07, -0.06666667014360428, 0.23321440815925598, -0.029266802594065666, 0.020584169775247574, 0.035189833492040634, -0.06626389920711517, 0.15271688997745514, -3.97364289028701e-07, 0.1154700368642807, -0.5942205190658569, 0.12822547554969788, -0.27467867732048035, 0.4696098268032074, -0.2903216779232025, 0.3891199231147766, -6.675720101156912e-07, -0.0666666328907013, 0.23321442306041718, -0.02926681749522686, 0.020584162324666977, 0.035189833492040634, -0.06626391410827637, 0.15271688997745514, -3.97364289028701e-07, 0.19999997317790985, -0.23360474407672882, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387670993805, -0.5146682858467102, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.4692023694515228, 0.06382622569799423, 0.0841163918375969, 0.6453768610954285, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650633215904236, -0.6354800462722778, 0.37899261713027954, -0.5358622074127197, 0.5358598232269287, -0.3789933919906616, 0.6354794502258301, -0.21650731563568115, -0.125, 0.24940767884254456, -0.08650287985801697, 0.04015703499317169, 0.04015401005744934, -0.08650249242782593, 0.24940498173236847, -0.1250000298023224, 0.21650633215904236, -0.6354800462722778, 0.37899261713027954, -0.5358622074127197, 0.5358598232269287, -0.3789933919906616, 0.6354795098304749, -0.21650731563568115, -0.125, 0.24940767884254456, -0.08650290966033936, 0.04015703499317169, 0.04015401005744934, -0.08650249242782593, 0.24940498173236847, -0.125, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.21650633215904236, -0.6354800462722778, 0.37899261713027954, -0.5358622074127197, 0.5358598232269287, -0.3789933919906616, 0.6354795098304749, -0.21650731563568115, -0.125, 0.24940767884254456, -0.08650287985801697, 0.04015703499317169, 0.04015401005744934, -0.08650250732898712, 0.24940499663352966, -0.1250000298023224, 0.21650633215904236, -0.6354800462722778, 0.37899261713027954, -0.5358622074127197, 0.5358598232269287, -0.3789933919906616, 0.6354794502258301, -0.21650731563568115, -0.125, 0.24940767884254456, -0.08650288730859756, 0.04015703499317169, 0.04015401005744934, -0.08650250732898712, 0.24940499663352966, -0.1250000298023224, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19245007634162903, -0.6323571801185608, 0.09347742795944214, -0.20307666063308716, 0.527964174747467, -0.3636370897293091, 0.2905236482620239, -4.8345987124776e-07, -0.1111110970377922, 0.24818192422389984, -0.021335814148187637, 0.015218377113342285, 0.03956266865134239, -0.0829976499080658, 0.11402104794979095, -2.914004824106087e-07, 0.19245007634162903, -0.6323571801185608, 0.09347744286060333, -0.20307666063308716, 0.527964174747467, -0.3636370897293091, 0.2905236482620239, -4.8345987124776e-07, -0.1111111119389534, 0.24818192422389984, -0.021335814148187637, 0.015218370594084263, 0.03956266865134239, -0.082997627556324, 0.11402104794979095, -2.914004824106087e-07, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19245007634162903, -0.6323571801185608, 0.09347742795944214, -0.20307666063308716, 0.527964174747467, -0.3636370897293091, 0.2905236482620239, -4.8345987124776e-07, -0.1111110970377922, 0.24818192422389984, -0.021335814148187637, 0.015218370594084263, 0.039562661200761795, -0.0829976350069046, 0.11402106285095215, -2.914004824106087e-07, 0.19245007634162903, -0.6323571801185608, 0.09347744286060333, -0.20307666063308716, 0.527964174747467, -0.3636370897293091, 0.2905236482620239, -4.8345987124776e-07, -0.11111108958721161, 0.24818192422389984, -0.021335817873477936, 0.015218377113342285, 0.039562661200761795, -0.08299765735864639, 0.11402104794979095, -2.8808912588829116e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "188": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.5188278555870056, 0.27347180247306824, 0.1914835125207901, -0.28584954142570496, -0.33255690336227417, -0.4998299777507782, -0.25337836146354675, 6.993822694312257e-07, 0.5188278555870056, 0.13169710338115692, 0.02157502807676792, 0.06524324417114258, 0.2089599221944809, 0.6267667412757874, 0.7241164445877075, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15850938856601715, -0.5514615774154663, -0.026479780673980713, 0.10175228118896484, 0.2116870880126953, -0.22105015814304352, 0.2711775302886963, -0.09796494990587234, -0.05150286480784416, 0.11978425830602646, 0.4569069445133209, 0.24781112372875214, -0.04844524338841438, 0.15196281671524048, 0.2867613732814789, 0.19849741458892822, 0.15850940346717834, -0.5514615178108215, -0.026479775086045265, 0.10175225883722305, 0.2116870880126953, -0.22105015814304352, 0.2711775004863739, -0.09796494990587234, -0.05150284245610237, 0.11978424340486526, 0.4569069445133209, 0.24781112372875214, -0.048445235937833786, 0.15196280181407928, 0.2867613732814789, 0.19849741458892822, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17483966052532196, -0.449042409658432, -0.07837789505720139, -0.023457685485482216, 0.4109886884689331, -0.3378807306289673, 0.21261662244796753, -1.0083118695547455e-06, -0.03050210140645504, 0.37998971343040466, 0.01537428330630064, -0.008007258176803589, 0.24626219272613525, -0.01029073167592287, 0.17216436564922333, 7.649262556697067e-07, 0.17483966052532196, -0.4490424394607544, -0.07837789505720139, -0.02345767617225647, 0.4109886884689331, -0.3378807306289673, 0.21261660754680634, -1.0086359907290898e-06, -0.03050210140645504, 0.3799896538257599, 0.01537428330630064, -0.008007258176803589, 0.24626219272613525, -0.010290741920471191, 0.17216436564922333, 7.698933472966019e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "189": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.11111107468605042, -0.34643104672431946, -0.16811293363571167, 0.29927119612693787, 0.24737153947353363, -0.3011621832847595, -0.5025772452354431, 1.3987644251756137e-06, 0.0, 0.2762693166732788, 0.7365496158599854, 0.6214435696601868, 0.11912710219621658, 0.0687381848692894, 0.6302149891853333, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.07320515811443329, -0.3265649378299713, -0.1356326788663864, 0.2239733636379242, 0.1514234095811844, -0.24314317107200623, -0.23899264633655548, 0.34641027450561523, -0.4732050895690918, -0.050564955919981, 0.5365599393844604, 0.442744642496109, -0.18821153044700623, -0.4652792811393738, -0.05704188346862793, 0.399998277425766, 0.3663902282714844, -0.23454992473125458, 0.1742645800113678, -0.07288289070129395, 0.237043097615242, -0.46195587515830994, -0.20867054164409637, -0.3464100956916809, 0.15176376700401306, 0.5645985007286072, 0.7244660258293152, 0.7374101877212524, 0.45116615295410156, 0.26207900047302246, 0.5100952386856079, 0.4000008702278137, -8.742277657347586e-08, -0.9749277830123901, -0.4338844418525696, 0.7818310260772705, 0.7818284630775452, -0.4338828921318054, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999998807907104], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.07320515811443329, -0.3265649378299713, -0.1356326788663864, 0.2239733636379242, 0.1514234095811844, -0.24314317107200623, -0.23899264633655548, 0.34641027450561523, -0.4732050895690918, -0.05056494474411011, 0.5365599393844604, 0.44274458289146423, -0.18821153044700623, -0.4652792513370514, -0.05704189091920853, 0.399998277425766, 0.3663902282714844, -0.23454992473125458, 0.1742645800113678, -0.07288289070129395, 0.237043097615242, -0.46195587515830994, -0.20867054164409637, -0.3464100956916809, 0.15176376700401306, 0.5645984411239624, 0.7244659662246704, 0.7374101877212524, 0.45116615295410156, 0.26207900047302246, 0.5100952386856079, 0.4000008702278137, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411639928817749, 0.6453768014907837, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "190": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.086459681391716, -0.5358858108520508, -0.004701852798461914, 0.022372690960764885, 0.29074418544769287, -0.20920270681381226, 0.20574377477169037, -0.05343541130423546, -0.028092455118894577, 0.19349756836891174, 0.4108109474182129, 0.29056864976882935, 0.01561149675399065, 0.08066524565219879, 0.32503414154052734, 0.29008933901786804, 0.08645965903997421, -0.5358858108520508, -0.004701852798461914, 0.02237270027399063, 0.29074418544769287, -0.20920267701148987, 0.20574374496936798, -0.05343543365597725, -0.028092460706830025, 0.19349759817123413, 0.4108109474182129, 0.29056864976882935, 0.015611518174409866, 0.08066526800394058, 0.32503417134284973, 0.29008933901786804, 0.5188278555870056, 0.27347180247306824, 0.1914835125207901, -0.28584954142570496, -0.33255690336227417, -0.4998299777507782, -0.25337836146354675, 6.993822694312257e-07, 0.5188278555870056, 0.13169710338115692, 0.02157502807676792, 0.06524324417114258, 0.2089599221944809, 0.6267667412757874, 0.7241164445877075, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15850938856601715, -0.5514615774154663, -0.026479780673980713, 0.10175228118896484, 0.2116870880126953, -0.22105015814304352, 0.2711775302886963, -0.09796494990587234, -0.05150286480784416, 0.11978425830602646, 0.4569069445133209, 0.24781112372875214, -0.04844524338841438, 0.15196281671524048, 0.2867613732814789, 0.19849741458892822, 0.15850940346717834, -0.5514615178108215, -0.026479775086045265, 0.10175225883722305, 0.2116870880126953, -0.22105015814304352, 0.2711775004863739, -0.09796494990587234, -0.05150284245610237, 0.11978424340486526, 0.4569069445133209, 0.24781112372875214, -0.048445235937833786, 0.15196280181407928, 0.2867613732814789, 0.19849741458892822, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "191": {"r": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.1556091010570526, -0.3810589909553528, -0.3716519773006439, 0.1319364756345749, 0.40664640069007874, 4.5980726781635894e-07, -0.22490385174751282, 0.296295166015625, -0.25229206681251526, 0.12212818115949631, 0.3571431338787079, 0.047089654952287674, -0.1997583657503128, -0.08626820147037506, 0.11504309624433517, 0.29432836174964905, 0.33926263451576233, -0.35222166776657104, 0.3590250611305237, -0.359406054019928, 0.35323768854141235, -0.34053438901901245, 0.32145506143569946, -0.2962963283061981, 0.5380063652992249, 0.5619357228279114, 0.625885009765625, 0.4708811342716217, 0.7182384133338928, 0.37914153933525085, 0.8074502348899841, 0.2943301796913147, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413509666919708, 0.6754254102706909, 0.5670717358589172, 0.09937679767608643, 0.07423041015863419, 0.6356299519538879, 1.0], "q": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.05580952763557434, -0.25307804346084595, -0.4334486126899719, 0.07269136607646942, 0.4789164364337921, 8.940696716308594e-07, -0.31989210844039917, 0.3020099103450775, -0.3165111541748047, 0.2026176005601883, 0.3750002682209015, -0.07625791430473328, -0.19649556279182434, 0.049515336751937866, 0.07895809412002563, 0.14007540047168732, 0.3772032558917999, -0.38366949558258057, 0.3845618963241577, -0.37965965270996094, 0.36886489391326904, -0.3522031605243683, 0.3298276662826538, -0.3020119369029999, 0.5665110945701599, 0.39205214381217957, 0.65092933177948, 0.3053596019744873, 0.7382363080978394, 0.2191278040409088, 0.8217034339904785, 0.1400773525238037, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "p": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.05580953508615494, -0.25307804346084595, -0.4334486126899719, 0.07269136607646942, 0.4789164066314697, 8.940696716308594e-07, -0.31989210844039917, 0.3020099103450775, -0.3165111243724823, 0.2026176005601883, 0.3750002682209015, -0.07625791430473328, -0.19649557769298553, 0.04951532185077667, 0.07895808666944504, 0.14007540047168732, 0.3772032558917999, -0.38366949558258057, 0.3845618963241577, -0.37965965270996094, 0.36886489391326904, -0.3522031605243683, 0.3298276662826538, -0.3020119369029999, 0.5665110945701599, 0.39205214381217957, 0.65092933177948, 0.3053596019744873, 0.7382363080978394, 0.2191278040409088, 0.8217034339904785, 0.1400773525238037, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "o": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.3098077178001404, -0.4735395312309265, -0.2628381550312042, 0.08363181352615356, 0.2656996250152588, -0.010716783814132214, 0.22017018496990204, 0.17320406436920166, -0.33660250902175903, -0.051190853118896484, -0.0024454116355627775, -0.11336145550012589, -0.226156085729599, -0.4628336429595947, 0.07441852986812592, 0.10000012814998627, 0.5196152925491333, -0.485013484954834, 0.23360475897789001, -0.2628469467163086, 0.5349166989326477, -0.5463374853134155, 0.2596856951713562, -0.17320556938648224, 0.30000001192092896, 0.7113842368125916, 0.18629343807697296, 0.28328147530555725, 0.5764996409416199, 0.43568986654281616, 0.3808876574039459, 0.10000045597553253, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0], "n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.22767098248004913, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017500281333923, 0.30271539092063904, -1.5397866945932037e-06, -0.3943375051021576, 0.0294527318328619, -0.020581046119332314, -0.12990714609622955, -0.11006701737642288, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.051329609006643295, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.433856423067482e-07, -8.742278367890322e-08, -0.9749278426170349, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268889427185, 2.797529077724903e-06, -1.0, -0.2225215882062912, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252558171749115, 0.9999999403953552], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.22767101228237152, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017499536275864, 0.3027154207229614, -1.5497207641601562e-06, -0.39433753490448, 0.0294527318328619, -0.020581046119332314, -0.12990713119506836, -0.11006700992584229, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.0513296015560627, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.384185791015625e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "192": {"m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.07320515811443329, -0.3265649378299713, -0.1356326788663864, 0.2239733636379242, 0.1514234095811844, -0.24314317107200623, -0.23899264633655548, 0.34641027450561523, -0.4732050895690918, -0.05056494474411011, 0.5365599393844604, 0.44274458289146423, -0.18821153044700623, -0.4652792513370514, -0.05704189091920853, 0.399998277425766, 0.3663902282714844, -0.23454992473125458, 0.1742645800113678, -0.07288289070129395, 0.237043097615242, -0.46195587515830994, -0.20867054164409637, -0.3464100956916809, 0.15176376700401306, 0.5645984411239624, 0.7244659662246704, 0.7374101877212524, 0.45116615295410156, 0.26207900047302246, 0.5100952386856079, 0.4000008702278137, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.22767098248004913, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017500281333923, 0.30271539092063904, -1.5397866945932037e-06, -0.3943375051021576, 0.0294527318328619, -0.020581046119332314, -0.12990714609622955, -0.11006701737642288, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.051329609006643295, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.433856423067482e-07, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "193": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.1368945986032486, -0.47365033626556396, -0.21997970342636108, 0.28160974383354187, 0.2744227647781372, -0.1832888126373291, -0.27384984493255615, 0.2886756360530853, -0.4295583963394165, -0.047879934310913086, 0.5093076229095459, 0.38576358556747437, -0.2418752759695053, -0.4477004408836365, 0.04742063581943512, 0.49999868869781494, 0.2997751832008362, -0.34206122159957886, 0.15692958235740662, -0.06442080438137054, 0.3293609023094177, -0.4131767153739929, -0.1208227351307869, -0.288674920797348, 0.13986873626708984, 0.5517568588256836, 0.7000862956047058, 0.709474503993988, 0.41189563274383545, 0.24298948049545288, 0.5709266066551208, 0.5000005960464478, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.993822125878069e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870497465133667, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253740966320038, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.09999998658895493, -0.11680237948894501, -0.06452475488185883, 0.11297786235809326, 0.06626869738101959, -0.18426939845085144, -0.2573341727256775, 6.993822125878069e-07, 0.5, 0.5931466817855835, 0.7827008962631226, 0.7346011400222778, 0.5319131016731262, 0.5420582294464111, 0.8226884007453918, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414212942123413, 0.06382738053798676, 0.032421790063381195, 0.08411655575037003, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.07320515811443329, -0.3265649378299713, -0.1356326788663864, 0.2239733636379242, 0.1514234095811844, -0.24314317107200623, -0.23899264633655548, 0.34641027450561523, -0.4732050895690918, -0.050564955919981, 0.5365599393844604, 0.442744642496109, -0.18821153044700623, -0.4652792811393738, -0.05704188346862793, 0.399998277425766, 0.3663902282714844, -0.23454992473125458, 0.1742645800113678, -0.07288289070129395, 0.237043097615242, -0.46195587515830994, -0.20867054164409637, -0.3464100956916809, 0.15176376700401306, 0.5645985007286072, 0.7244660258293152, 0.7374101877212524, 0.45116615295410156, 0.26207900047302246, 0.5100952386856079, 0.4000008702278137, 1.0, 0.781831681728363, 0.22252130508422852, -0.4338833689689636, -0.9009698629379272, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749277830123901, -0.9009690284729004, -0.43388158082962036, 0.22252050042152405, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.22767101228237152, -0.4000203311443329, -0.221121147274971, 0.0587615966796875, 0.2628510594367981, -0.09017499536275864, 0.3027154207229614, -1.5497207641601562e-06, -0.39433753490448, 0.0294527318328619, -0.020581046119332314, -0.12990713119506836, -0.11006700992584229, -0.4875713884830475, 0.16462868452072144, 1.3013681154916412e-06, 0.5773503184318542, -0.4980645477771759, 0.06436536461114883, -0.10567697137594223, 0.5591263771057129, -0.5855864882469177, 0.12251784652471542, -4.76837158203125e-07, 0.3333333432674408, 0.7305266857147217, 0.0513296015560627, 0.11389261484146118, 0.602591335773468, 0.4669899046421051, 0.1797000616788864, 2.384185791015625e-07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851869106293, -0.14904122054576874, 0.14903080463409424, 0.43388256430625916, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.733051598072052, -0.9009682536125183, -0.9888309836387634, -0.9888326525688171, -0.9009694457054138, -0.7330562472343445, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277234077454, -0.9972038269042969, 0.9972041249275208, -0.974928081035614, 0.9308750033378601, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252170741558075, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.1666666567325592, -0.03218268230557442, -0.03522718325257301, 0.05799126997590065, -0.019856909289956093, -0.23480182886123657, -0.2664024531841278, 6.99382155744388e-07, 0.5, 0.5256648063659668, 0.6543400883674622, 0.6204202175140381, 0.49043747782707214, 0.5535918474197388, 0.8340597152709961, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749279618263245, -0.6234879493713379, 1.3987645388624514e-06, -4.371139183945161e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "194": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.12371788918972015, -0.5932809710502625, 0.29385900497436523, -0.46995624899864197, 0.46995338797569275, -0.29385989904403687, 0.5932801961898804, -0.12371887266635895, -0.0714285597205162, 0.232845738530159, -0.06707162410020828, 0.03521804139018059, 0.0352153442800045, -0.06707138568162918, 0.23284311592578888, -0.0714288279414177, 0.12371789664030075, -0.5932809114456177, 0.29385900497436523, -0.46995624899864197, 0.4699534773826599, -0.29385989904403687, 0.5932801365852356, -0.12371887266635895, -0.07142855226993561, 0.2328457534313202, -0.06707163155078888, 0.03521807864308357, 0.03521537780761719, -0.06707140058279037, 0.23284313082695007, -0.0714288204908371, 0.529586672782898, 0.20636089146137238, 0.23732516169548035, -0.32522544264793396, -0.2651694416999817, -0.5068963170051575, -0.22002656757831573, 6.993822125878069e-07, 0.529586672782898, 0.09937819093465805, 0.02674015983939171, 0.07423052936792374, 0.16661743819713593, 0.6356276273727417, 0.6288021802902222, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.1154700443148613, -0.5942205190658569, 0.12822549045085907, -0.27467867732048035, 0.4696098268032074, -0.29032161831855774, 0.389119952917099, -6.675720101156912e-07, -0.06666665524244308, 0.23321440815925598, -0.029266802594065666, 0.020584141835570335, 0.035189833492040634, -0.06626387685537338, 0.15271688997745514, -3.97364289028701e-07, 0.1154700368642807, -0.5942205190658569, 0.12822547554969788, -0.27467867732048035, 0.4696098268032074, -0.2903216779232025, 0.3891199231147766, -6.675720101156912e-07, -0.06666665524244308, 0.23321440815925598, -0.029266806319355965, 0.02058415859937668, 0.035189833492040634, -0.06626389175653458, 0.15271687507629395, -3.9339064983323624e-07, 0.5414212942123413, 0.13253889977931976, 0.2877509295940399, -0.3685389459133148, -0.19104324281215668, -0.5146691799163818, -0.18333959579467773, 6.993822125878069e-07, 0.5414212942123413, 0.06382737308740616, 0.0324217788875103, 0.08411655575037003, 0.12004075199365616, 0.6453744173049927, 0.5239564180374146, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.21650633215904236, -0.6354800462722778, 0.37899261713027954, -0.5358622074127197, 0.5358598232269287, -0.3789933919906616, 0.6354794502258301, -0.21650731563568115, -0.125, 0.24940767884254456, -0.08650287985801697, 0.04015703499317169, 0.04015401005744934, -0.08650249242782593, 0.24940498173236847, -0.1250000298023224, 0.21650633215904236, -0.6354800462722778, 0.37899261713027954, -0.5358622074127197, 0.5358598232269287, -0.3789933919906616, 0.6354795098304749, -0.21650731563568115, -0.125, 0.24940767884254456, -0.08650290966033936, 0.04015703499317169, 0.04015401005744934, -0.08650249242782593, 0.24940498173236847, -0.125, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19245007634162903, -0.6323571801185608, 0.09347742795944214, -0.20307666063308716, 0.527964174747467, -0.3636370897293091, 0.2905236482620239, -4.8345987124776e-07, -0.1111111268401146, 0.24818192422389984, -0.021335814148187637, 0.015218383632600307, 0.03956267610192299, -0.0829976499080658, 0.11402104794979095, -2.914004824106087e-07, 0.19245007634162903, -0.6323571801185608, 0.09347744286060333, -0.20307666063308716, 0.527964174747467, -0.3636370897293091, 0.2905236482620239, -4.8345987124776e-07, -0.1111111119389534, 0.24818192422389984, -0.021335817873477936, 0.015218383632600307, 0.03956267610192299, -0.0829976499080658, 0.11402104794979095, -2.8808912588829116e-07, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234896183013916, -0.9749277830123901, -0.9009689688682556, -0.433881551027298, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.973643103449831e-08, -0.8055233359336853, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.270522803068161, 0.8055214881896973, -1.430511474609375e-06, -0.5, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385906517505646, -0.5000008940696716, -1.9868215517249155e-08, -0.8055232167243958, 0.2705213129520416, -0.573122501373291, 0.5731174945831299, -0.2705227732658386, 0.8055214881896973, -1.430511474609375e-06, -0.4999999701976776, -0.18385523557662964, -0.5617449283599854, -0.45705071091651917, -0.45705413818359375, -0.5617448687553406, -0.18385905027389526, -0.5000007748603821, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8660253882408142, -0.9308736324310303, 0.9749277830123901, -0.9972038269042969, 0.9972041845321655, -0.974928081035614, 0.9308749437332153, -0.8660264015197754, -0.5000000596046448, 0.3653411865234375, -0.22252169251441956, 0.0747295618057251, 0.07472431659698486, -0.22252027690410614, 0.3653380572795868, -0.49999842047691345, -0.866025447845459, -0.6801729798316956, -0.4338851571083069, -0.14904122054576874, 0.14903080463409424, 0.43388253450393677, 0.680168092250824, 0.8660235404968262, -0.49999991059303284, -0.7330516576766968, -0.9009681940078735, -0.9888309836387634, -0.9888325929641724, -0.9009694457054138, -0.7330561876296997, -0.5000032186508179, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "195": {"j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.141421377658844, -0.0637044757604599, -0.43191999197006226, 0.5077183842658997, -0.016226518899202347, -0.11060422658920288, -0.11241958290338516, 1.7166769339382881e-06, 0.2585786283016205, 0.37028759717941284, 0.638835608959198, 0.35549646615982056, 0.42954128980636597, 0.2577275335788727, 0.15790481865406036, 1.0, 0.141421377658844, -0.0637044757604599, -0.43191999197006226, 0.5077183842658997, -0.016226518899202347, -0.11060424149036407, -0.11241958290338516, 1.7166769339382881e-06, 0.2585786283016205, 0.37028759717941284, 0.638835608959198, 0.35549646615982056, 0.42954134941101074, 0.2577275335788727, 0.15790481865406036, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.576172411441803, 0.45572835206985474, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, -0.050042688846588135, -0.13393166661262512, 0.1882966160774231, -0.014952193014323711, -0.04650520160794258, -0.6513679027557373, 2.161746124329511e-06, -9.934107758624577e-09, -0.01142196822911501, 0.2781111001968384, 0.15016140043735504, 0.011924262158572674, -0.0965692475438118, 0.14867424964904785, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -9.934107758624577e-09, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "196": {"h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.49184274673461914, -0.18483121693134308, -0.11479385942220688, 0.2784704864025116, -0.14937065541744232, -0.5281657576560974, -0.3676467835903168, -0.09796354919672012, -0.21816955506801605, -0.23051412403583527, 0.3026740550994873, 0.037086743861436844, -0.31130334734916687, 0.0965563952922821, 0.47907963395118713, 0.6984977126121521, 0.49184274673461914, 0.18360580503940582, -0.027899736538529396, -0.1446279138326645, -0.33651745319366455, -0.5177556872367859, -0.3852574825286865, 0.09796497225761414, 0.21816949546337128, 0.23149137198925018, 0.3225070536136627, 0.24084031581878662, 0.0773133933544159, 0.14216823875904083, 0.4650362432003021, 0.6984970569610596, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6666666865348816, 0.45883679389953613, 0.34169068932533264, 0.3663436472415924, 0.5220394730567932, 0.7408401370048523, 0.9272775650024414, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.014952123165130615, 0.010164514183998108, -0.04650523141026497, -0.010236476548016071, -0.6513661742210388, -0.17415060102939606, 1.0808730621647555e-06, -2.3510830615691702e-08, 0.01192388404160738, -0.04453359544277191, -0.0965692475438118, -0.004929696675390005, 0.1486697942018509, 0.218378484249115, 1.0, 0.5690355896949768, -0.03971235454082489, 0.40541115403175354, -0.4696037471294403, -0.018082132562994957, -0.5328059792518616, -0.09773667901754379, 6.993822694312257e-07, 0.5690355896949768, -0.01912449300289154, 0.045678939670324326, 0.10718391090631485, 0.011361762881278992, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, -4.967053879312289e-09, 0.0, 0.0, 4.967053879312289e-09, 0.0, 0.0, -9.473903425812318e-15, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718393325805664, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "197": {"f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.748455247252423e-08, -0.4981796145439148, -0.41669711470603943, 0.664084255695343, 0.2741110920906067, -0.10396367311477661, -0.6717345118522644, 2.7975288503512274e-06, -0.20000000298023224, -0.11370662599802017, 0.8652788400650024, 0.5295903086662292, -0.21859845519065857, -0.2158832550048828, 0.15332241356372833, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.576172411441803, 0.45572835206985474, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "198": {"b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.1428571194410324, -0.3061359226703644, -0.1541617065668106, 0.2730870842933655, 0.2063593566417694, -0.32522526383399963, -0.5068954825401306, 1.3987644251756137e-06, 0.0, 0.24413511157035828, 0.6754254102706909, 0.5670717358589172, 0.09937679022550583, 0.0742303729057312, 0.6356299519538879, 1.0, 0.12371788173913956, -0.6900835633277893, -0.1086585521697998, 0.3043029010295868, 0.5892168283462524, -0.3872085213661194, -0.42411893606185913, -0.12371645867824554, -0.3571428656578064, 0.21075071394443512, 0.7687646150588989, 0.6526702046394348, -0.05989287421107292, -0.2609138786792755, 0.4650629162788391, 0.7857145071029663, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4285714328289032, 0.6507081389427185, 0.9717053174972534, 0.8924258351325989, 0.5361446738243103, 0.45686593651771545, 0.7778644561767578, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.019125064834952354, 0.10718376189470291, 0.668119490146637, 1.0, 5.2977520148544954e-09, -9.934107758624577e-09, -4.967053879312289e-09, 0.0, 0.0, 4.967053879312289e-09, 0.0, 0.0, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "199": {"c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.09796419739723206, -0.20682744681835175, -0.08725392818450928, 0.20261915028095245, 0.00983904767781496, 0.08094079792499542, -0.32898664474487305, 0.15850992500782013, 0.6348361372947693, 0.4689192473888397, 0.9828238487243652, 0.6204202771186829, 0.6779282689094543, 0.4510009288787842, 0.7112319469451904, 0.8848360180854797], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.5230118632316589, -0.06109599396586418, -0.19881506264209747, 0.24151365458965302, -0.04051078110933304, -0.7262457013130188, -0.6163264513015747, 1.8862192519009113e-06, -0.5230118632316589, -0.2676796019077301, -0.06956849992275238, -0.19260038435459137, -0.3595321476459503, -0.3497421443462372, 0.3872663676738739, 1.0, 0.4444443881511688, -0.08582046627998352, -0.0939391553401947, 0.15464337170124054, -0.05295174568891525, -0.6261382102966309, -0.7104066014289856, 1.8650193851499353e-06, -0.3333333432674408, -0.26489388942718506, 0.0782402977347374, -0.012212727218866348, -0.3588334321975708, -0.19042165577411652, 0.5574926733970642, 1.0, 0.5230118632316589, 0.24737310409545898, 0.20931082963943481, -0.30116239190101624, -0.3063506782054901, -0.5025780200958252, -0.24040821194648743, 6.99382155744388e-07, 0.5230118632316589, 0.11912863701581955, 0.02358368970453739, 0.06873830407857895, 0.19249339401721954, 0.6302125453948975, 0.6870498061180115, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0]}, "200": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.09796419739723206, -0.20682744681835175, -0.08725392818450928, 0.20261915028095245, 0.00983904767781496, 0.08094079792499542, -0.32898664474487305, 0.15850992500782013, 0.6348361372947693, 0.4689192473888397, 0.9828238487243652, 0.6204202771186829, 0.6779282689094543, 0.4510009288787842, 0.7112319469451904, 0.8848360180854797], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.1082531288266182, -0.8475551009178162, -0.20354732871055603, 0.46172279119491577, 0.7110218405723572, -0.4472782015800476, -0.614835798740387, -0.10825119912624359, -0.6875, 0.003776445984840393, 0.7729111909866333, 0.6019589900970459, -0.33327969908714294, -0.5785419344902039, 0.3375614285469055, 0.8125001788139343, 0.1082531288266182, -0.8475551009178162, -0.20354732871055603, 0.46172279119491577, 0.7110218405723572, -0.4472782015800476, -0.614835798740387, -0.10825119912624359, -0.6875, 0.003776445984840393, 0.7729111909866333, 0.6019589900970459, -0.33327966928482056, -0.5785419344902039, 0.3375614285469055, 0.8125001788139343, 0.21650633215904236, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069282054901, 0.375, 0.6509292721748352, 0.5693697929382324, 0.47260963916778564, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411642163991928, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "201": {"h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.20000000298023224, 0.3995092511177063, 0.21370649337768555, -0.3685387969017029, -0.31588199734687805, -0.23360474407672882, -0.4295898973941803, 6.358250175253488e-07, -3.258413272533289e-08, -0.31859779357910156, -0.9363085627555847, -0.76528000831604, -0.15212008357048035, 0.053318630903959274, 0.5386915802955627, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.19999995827674866, -0.29879164695739746, -0.5799422860145569, -0.5207751989364624, -0.14710526168346405, 0.3780163824558258, 0.8254663348197937, 1.0, -0.5414213538169861, -0.13253889977931976, -0.2877509593963623, 0.3685389459133148, 0.19104324281215668, 0.5146692395210266, 0.18333959579467773, -6.993822125878069e-07, 0.14142130315303802, -0.5855684876441956, -0.7575494050979614, -0.6762710809707642, -0.4535118639469147, 0.33438265323638916, 0.436689555644989, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.974928081035614, 0.6234879493713379, -1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.9868215517249155e-08, 0.02476024627685547, -0.39524662494659424, 0.4230985641479492, 0.007845659740269184, -0.11856025457382202, -0.07641392946243286, 3.8149082115523925e-07, -2.715344749049109e-08, 0.011923898942768574, -0.04453359916806221, -0.0965692475438118, -0.004929701332002878, 0.1486697942018509, 0.21837849915027618, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 9.934107758624577e-09, 0.0, -4.967053879312289e-09, -9.934107758624577e-09, 0.0, 0.0, 0.0, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "202": {"i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.384775847196579, -0.4223814010620117, -0.032305847853422165, 0.270459920167923, -0.0305742509663105, -0.16979631781578064, -0.6479379534721375, 1.939190497068921e-06, -0.2765367031097412, -0.07976244390010834, 0.5404466390609741, 0.07421676814556122, -0.020438741892576218, -0.09349095821380615, 0.2962486445903778, 1.0, 0.38477587699890137, -0.016226375475525856, -0.20538480579853058, -0.1106041893362999, -0.03504284471273422, -0.1124173179268837, -0.14463798701763153, 8.583384669691441e-07, 0.27653664350509644, 0.42954021692276, 0.5009423494338989, 0.25772738456726074, -0.01116037368774414, 0.15790387988090515, 0.6976150274276733, 1.0, 0.2765367031097412, 0.325711190700531, -0.08876504749059677, -0.21147465705871582, -0.005149233154952526, -0.1289297640323639, -0.321871817111969, 3.4969110629390343e-07, 0.7847759127616882, 0.36889567971229553, 0.2558859884738922, 0.5761724710464478, 0.6099673509597778, 0.4557274281978607, 0.7228654623031616, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007449507713318, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.4525972902774811, 0.6250003576278687, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.014952133409678936, 0.010164514183998108, -0.04650522768497467, -0.010236461646854877, -0.6513662934303284, -0.17415060102939606, 1.0808730621647555e-06, -2.715344749049109e-08, 0.011923898942768574, -0.04453359916806221, -0.0965692475438118, -0.004929701332002878, 0.1486697942018509, 0.21837849915027618, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "203": {"g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4242641031742096, -0.31588342785835266, 0.20870821177959442, -0.23360471427440643, 0.3610832095146179, -0.4295896887779236, 0.30145540833473206, 3.179125087626744e-07, 0.4242640435695648, -0.15212151408195496, 0.02351590432226658, 0.05331888049840927, -0.2268841713666916, 0.5386881828308105, -0.8615143895149231, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7656854391098022, -0.14710712432861328, 0.28957176208496094, 0.37801656126976013, -0.22562651336193085, 0.8254650235176086, -0.5551069974899292, 1.0, -0.4242641031742096, 0.31588345766067505, -0.2087082415819168, 0.23360474407672882, -0.3610832095146179, 0.42958974838256836, -0.30145540833473206, -3.17912480340965e-07, 0.4242640435695648, -0.15212151408195496, 0.02351590245962143, 0.05331888049840927, -0.2268841713666916, 0.5386881828308105, -0.8615143895149231, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.2357022762298584, 0.0741734728217125, -0.3146277666091919, 0.26061081886291504, 0.03732301667332649, -0.30032289028167725, 0.2822403907775879, 6.359937287925277e-08, 0.23570223152637482, 0.03572006896138191, -0.035449933260679245, -0.05948236212134361, -0.02345152758061886, 0.376592755317688, -0.806601345539093, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.974928081035614, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.974928081035614, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4394899606704712, 0.024232978001236916, -0.0325176864862442, 0.17132321000099182, -0.3631981909275055, -0.34315115213394165, 0.08510995656251907, 6.146181590338529e-07, 0.17124398052692413, -0.0030224984511733055, -0.13965590298175812, -0.19966337084770203, 0.23533190786838531, 0.1454460769891739, -0.1445913016796112, 1.0, -0.2421756386756897, 0.012054350227117538, -0.07274791598320007, 0.3552039563655853, -0.38265496492385864, 0.06515795737504959, 0.14568738639354706, -2.3312739472203248e-07, 0.852909505367279, 0.022266706451773643, 0.21739713847637177, 0.6059717535972595, 0.20436710119247437, 0.4710620641708374, -0.12339404225349426, 1.0, -0.41341960430145264, 0.006824155803769827, -0.0808931440114975, 0.4342442452907562, -0.17906978726387024, 0.1161004826426506, 0.0081753795966506, -3.602909828259726e-07, 0.6816655993461609, 0.011406117118895054, 0.14510662853717804, 0.25967341661453247, -0.11963585019111633, 0.43043673038482666, -0.07527679949998856, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "204": {"h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.14142131805419922, -0.5404525995254517, -0.4491073191165924, 0.6254650950431824, 0.49149090051651, -0.4405234754085541, -0.4156118333339691, 1.7166770476251259e-06, -0.5414213538169861, 0.2614726424217224, 0.6745253205299377, 0.4493965208530426, 0.02464616298675537, -0.42735838890075684, 0.22710800170898438, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.5761724710464478, 0.45572835206985474, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.1082531288266182, -0.8475551009178162, -0.20354732871055603, 0.46172279119491577, 0.7110218405723572, -0.4472782015800476, -0.614835798740387, -0.10825119912624359, -0.6875, 0.003776445984840393, 0.7729111909866333, 0.6019589900970459, -0.33327966928482056, -0.5785419344902039, 0.3375614285469055, 0.8125001788139343, 0.21650631725788116, -0.5523721575737, -0.138569638133049, 0.2535577714443207, 0.50285804271698, -0.3823010325431824, -0.31965339183807373, 8.702593845555384e-07, -1.4901161193847656e-08, 0.4405019283294678, 0.6071118116378784, 0.5265185832977295, 0.24216163158416748, 0.0872577577829361, 0.4008346199989319, 0.6250000596046448, 0.10825317353010178, -0.19228097796440125, -0.15196451544761658, 0.18275049328804016, 0.1827504187822342, -0.15196427702903748, -0.19228103756904602, 0.10825347155332565, 0.6875, 0.82546466588974, 0.7846848964691162, 0.7363048195838928, 0.7636945247650146, 0.7153151035308838, 0.6745359897613525, 0.8124998807907104], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "205": {"d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.09796419739723206, -0.20682744681835175, -0.08725392818450928, 0.20261915028095245, 0.00983904767781496, 0.08094079792499542, -0.32898664474487305, 0.15850992500782013, 0.6348361372947693, 0.4689192473888397, 0.9828238487243652, 0.6204202771186829, 0.6779282689094543, 0.4510009288787842, 0.7112319469451904, 0.8848360180854797], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "206": {"e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.0513296015560627, 0.3086802065372467, 0.24084044992923737, -0.019125044345855713, 0.10718374699354172, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.21816949546337128, 0.29546356201171875, 0.044564347714185715, -0.23480188846588135, -0.2156657576560974, -0.02339244820177555, 0.011262376792728901, -0.09796401858329773, 0.8251760601997375, 0.540379524230957, 0.3376798629760742, 0.4794183075428009, 0.7476077079772949, 0.7955694794654846, 0.6765062212944031, 0.6984972357749939], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "207": {"k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.748455247252423e-08, -0.4981796145439148, -0.41669711470603943, 0.664084255695343, 0.2741110920906067, -0.10396367311477661, -0.6717345118522644, 2.7975288503512274e-06, -0.20000000298023224, -0.11370662599802017, 0.8652788400650024, 0.5295903086662292, -0.21859845519065857, -0.2158832550048828, 0.15332241356372833, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.576172411441803, 0.45572835206985474, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "208": {"m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.4285714328289032, 0.05651991814374924, -0.028600702062249184, 0.03743026778101921, -0.16275040805339813, -0.5417928695678711, -0.5457596778869629, 1.3987644251756137e-06, 0.0, -0.04507313296198845, 0.12530764937400818, 0.07772481441497803, -0.07837598025798798, 0.12366043776273727, 0.6843643188476562, 1.0, 0.4285714328289032, 0.05651993304491043, -0.028600702062249184, 0.03743026778101921, -0.16275040805339813, -0.5417928099632263, -0.5457596778869629, 1.3987644251756137e-06, -1.7029899268550253e-08, -0.04507312551140785, 0.12530766427516937, 0.07772480696439743, -0.07837599515914917, 0.12366043776273727, 0.6843643188476562, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7142857313156128, 0.5361458659172058, 0.43573489785194397, 0.45686599612236023, 0.5903195142745972, 0.7778629660606384, 0.9376664757728577, 1.0], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.784517765045166, 0.39581990242004395, -0.0812804102897644, -0.028645014390349388, -0.45168039202690125, -0.872427225112915, -0.4370262622833252, 1.4305641116152401e-06, -0.2845178544521332, -0.29025864601135254, -0.5548370480537415, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.784517765045166, 0.39581990242004395, -0.0812804102897644, -0.028645029291510582, -0.45168039202690125, -0.872427225112915, -0.4370262324810028, 1.4305642253020778e-06, -0.2845177948474884, -0.29025864601135254, -0.5548370480537415, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, -0.5690355896949768, 0.03971235826611519, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.045678943395614624, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.784517765045166, 0.39581990242004395, -0.081280417740345, -0.028645018115639687, -0.45168039202690125, -0.872427225112915, -0.4370262622833252, 1.4305642253020778e-06, -0.2845178544521332, -0.29025864601135254, -0.5548369884490967, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.784517765045166, 0.39581990242004395, -0.0812804102897644, -0.028645018115639687, -0.45168033242225647, -0.8724272847175598, -0.4370262324810028, 1.4305642253020778e-06, -0.2845178246498108, -0.29025864601135254, -0.5548370480537415, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, -9.934107758624577e-09, 0.0, 4.967053879312289e-09, 9.934107758624577e-09, 0.0, 0.0, 0.0, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "209": {"j": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.2741134464740753, 0.04673590138554573, -0.10396382957696915, -0.3842162489891052, -0.6717334389686584, -0.5690781474113464, 1.3987644251756137e-06, -3.5762788286319847e-08, -0.21859805285930634, -0.20476298034191132, -0.21588334441184998, -0.18502767384052277, 0.15331843495368958, 0.7136048674583435, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.3506041467189789, 0.21002884209156036, 0.2396123856306076, 0.42644739151000977, 0.6890082359313965, 0.9127331972122192, 1.0], "i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474614918231964, -0.30032244324684143, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.014952133409678936, 0.010164514183998108, -0.04650522768497467, -0.010236461646854877, -0.6513662934303284, -0.17415060102939606, 1.0808730621647555e-06, -2.715344749049109e-08, 0.011923898942768574, -0.04453359916806221, -0.0965692475438118, -0.004929701332002878, 0.1486697942018509, 0.21837849915027618, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "210": {"h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5825155973434448, -0.24760454893112183, -0.006875147577375174, -0.025704331696033478, 0.3063262403011322, -0.6646873950958252, 0.2147313952445984, 7.629815854670596e-07, -2.6490953430879927e-08, 0.19745789468288422, 0.030121922492980957, -0.05337579548358917, 0.1475178450345993, 0.15171021223068237, -0.2692669928073883, 1.0, 0.17881155014038086, -0.1029682457447052, 0.32463037967681885, -0.17995299398899078, 0.13170793652534485, -0.2480945587158203, -0.0114979213103652, 1.7484555314695172e-07, 0.8026028275489807, -0.013287173584103584, 0.2572407126426697, 0.26569345593452454, -0.22816795110702515, 0.7248312830924988, -0.33534786105155945, 1.0, 0.17881155014038086, -0.1029682457447052, 0.32463037967681885, -0.17995299398899078, 0.13170793652534485, -0.2480945587158203, -0.011497927829623222, 1.7484555314695172e-07, 0.8026028871536255, -0.013287173584103584, 0.25724074244499207, 0.2656934857368469, -0.22816793620586395, 0.7248312830924988, -0.33534783124923706, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.8047378659248352, 0.03446110337972641, 0.09078339487314224, -0.20899300277233124, 0.01924089528620243, -0.8331288695335388, 0.1845037341117859, 7.629815286236408e-07, -2.9802322387695312e-08, -0.027481814846396446, -0.3977474272251129, -0.43397894501686096, 0.009265671484172344, 0.19015581905841827, -0.23136252164840698, 1.0, 0.3535534143447876, -0.45048439502716064, 0.49685609340667725, -0.487464040517807, 0.42336177825927734, -0.3117449879646301, 0.16513895988464355, 3.49691077872194e-07, 0.7559223175048828, -0.19490325450897217, 0.2599705755710602, 0.3521006107330322, -0.27669429779052734, 0.818192720413208, -0.6199031472206116, 1.0, 0.3535534143447876, -0.45048439502716064, 0.49685609340667725, -0.487464040517807, 0.42336177825927734, -0.3117449879646301, 0.16513895988464355, 3.49691077872194e-07, 0.7559223175048828, -0.19490325450897217, 0.2599705755710602, 0.3521006107330322, -0.27669429779052734, 0.818192720413208, -0.6199031472206116, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3632633686065674, -0.01659080758690834, -0.021087011322379112, 0.16087426245212555, 0.589937686920166, -0.15349291265010834, -0.0668523758649826, 1.5577101066810428e-06, -1.9868215517249155e-08, 0.013230686075985432, 0.09238829463720322, 0.33405885100364685, 0.2840970456600189, 0.03503385931253433, 0.08382976055145264, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8769953846931458, 0.011361360549926758, 0.12210748344659805, 0.668117344379425, 0.31722837686538696, 0.2793159782886505, -0.037129808217287064, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "211": {"j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.0513296015560627, 0.3086802065372467, 0.24084044992923737, -0.019125044345855713, 0.10718374699354172, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.21816949546337128, 0.29546356201171875, 0.044564347714185715, -0.23480188846588135, -0.2156657576560974, -0.02339244820177555, 0.011262376792728901, -0.09796401858329773, 0.8251760601997375, 0.540379524230957, 0.3376798629760742, 0.4794183075428009, 0.7476077079772949, 0.7955694794654846, 0.6765062212944031, 0.6984972357749939], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.784517765045166, 0.39581990242004395, -0.081280417740345, -0.028645018115639687, -0.45168039202690125, -0.872427225112915, -0.4370262622833252, 1.4305642253020778e-06, -0.2845178544521332, -0.29025864601135254, -0.5548369884490967, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.784517765045166, 0.39581990242004395, -0.0812804102897644, -0.028645018115639687, -0.45168033242225647, -0.8724272847175598, -0.4370262324810028, 1.4305642253020778e-06, -0.2845178246498108, -0.29025864601135254, -0.5548370480537415, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "212": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.5283645391464233, 0.25865092873573303, 0.009385956451296806, 0.24067534506320953, 0.008921929635107517, -0.33440348505973816, -0.06660822778940201, 0.12371856719255447, 0.06048846244812012, 0.22040264308452606, 0.08068045228719711, 0.007003051694482565, 0.18024857342243195, 0.11141543090343475, 0.40531325340270996, 0.7857140302658081, 0.21435143053531647, -0.3003399074077606, 0.14686094224452972, -0.06496237218379974, 0.14453326165676117, -0.10578135401010513, -0.5913813710212708, 0.1237189844250679, -0.12880782783031464, 0.18323823809623718, 0.022673683241009712, 0.32526895403862, -0.13310496509075165, -0.012970387935638428, 0.13464149832725525, 0.7857141494750977, -0.18798120319843292, 0.32511261105537415, -0.1039048284292221, 0.016909467056393623, -0.18799729645252228, 0.07504863291978836, 0.19497916102409363, -0.12371844053268433, 0.35720857977867126, -0.11713528633117676, 0.2927069365978241, 0.006695619784295559, 0.13237206637859344, 0.21131129562854767, 0.5051526427268982, 0.7857142686843872], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.7396504282951355, -0.21466240286827087, 0.046870775520801544, -0.1340295374393463, 0.3259778320789337, -0.7858624458312988, 0.45383426547050476, 5.510539722308749e-07, -3.311369312086754e-08, 0.17118743062019348, -0.20535396039485931, -0.27831560373306274, 0.15698140859603882, 0.1793675720691681, -0.5690943598747253, 1.0, 0.5825155973434448, -0.29494231939315796, 0.4611154794692993, -0.46430471539497375, 0.2902999818325043, -0.6301996111869812, 0.41278406977653503, 1.1868369256262667e-06, 0.15713483095169067, -0.18054266273975372, -0.060403287410736084, -0.01493040844798088, -0.15965494513511658, 0.2543310821056366, -0.5432999134063721, 1.0, -0.07856741547584534, -0.02472449652850628, 0.10487592220306396, -0.08687027543783188, -0.012441005557775497, 0.10010762512683868, -0.0940801352262497, -2.1199790367631977e-08, 0.6150593161582947, 0.04129162058234215, 0.2601676881313324, 0.30129286646842957, -0.022054128348827362, 0.6952337026596069, -0.4661487936973572, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.45346274971961975, 0.0467066764831543, -0.23867975175380707, -0.2862589657306671, 0.296307235956192, -0.05790916085243225, 0.17772547900676727, 2.22545097017246e-07, 0.5510938763618469, 0.5004540085792542, 0.26911911368370056, 0.3244965076446533, 0.3244950473308563, 0.14533860981464386, 0.14004839956760406, 1.0, 0.45346274971961975, -0.47900405526161194, 0.22848528623580933, -0.26149898767471313, 0.4224902093410492, -0.059478554874658585, -0.3277650773525238, 1.2080190572305582e-06, 0.325901597738266, -0.15876682102680206, 0.37574657797813416, 0.31257253885269165, 0.06247224286198616, 0.13846221566200256, -0.26306474208831787, 1.0, -0.09019932895898819, 0.460922509431839, -0.11936340481042862, -0.27130696177482605, 0.15149225294589996, -0.038258373737335205, 0.10923396795988083, -8.58327894093236e-07, 0.325901597738266, -0.15876680612564087, 0.37574657797813416, 0.31257256865501404, 0.06247223541140556, 0.13846221566200256, -0.26306477189064026, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "213": {"e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.21435143053531647, -0.24547620117664337, -0.14215488731861115, 0.2948090136051178, -0.013949649408459663, -0.08967772871255875, 0.0003315721114631742, -0.12371748685836792, 0.12880778312683105, 0.25203511118888855, -0.043292250484228134, 0.15201279520988464, 0.19599005579948425, 0.05758301541209221, 0.6065142750740051, 0.7857142686843872, 0.18798111379146576, 0.041853904724121094, -0.22061607241630554, 0.015777740627527237, 0.22070755064487457, -0.15930065512657166, -0.44909921288490295, -0.12371735274791718, -0.35720863938331604, 0.34302639961242676, 0.21863703429698944, -0.009045626036822796, 0.06444825977087021, -0.15782301127910614, 0.3025002181529999, 0.7857151031494141, 0.5283645391464233, 0.2586509585380554, 0.009385956451296806, 0.24067534506320953, 0.008921929635107517, -0.33440348505973816, -0.06660822778940201, 0.12371856719255447, 0.06048846244812012, 0.22040264308452606, 0.0806804746389389, 0.007003043312579393, 0.18024857342243195, 0.11141544580459595, 0.40531325340270996, 0.7857140302658081], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.5825155973434448, 0.110385000705719, -0.3892425298690796, 0.2778167724609375, 0.05617765709757805, -0.6781401038169861, 0.43782174587249756, 3.3912638741639967e-07, -0.15713487565517426, 0.32772207260131836, -0.2544921636581421, -0.3723166584968567, 0.32650861144065857, 0.04428808391094208, -0.5233336091041565, 1.0, 0.07856737077236176, -0.034754641354084015, -0.018392907455563545, 0.18139781057834625, -0.00948568806052208, -0.39184510707855225, 0.43352508544921875, 2.564401256677229e-06, -0.6150593161582947, -0.03329288959503174, 0.27990710735321045, 0.25577133893966675, 0.023478098213672638, -0.5829494595527649, -0.1954512894153595, 1.0, 0.7396504878997803, -0.21466243267059326, 0.04687078669667244, -0.1340295523405075, 0.3259778618812561, -0.7858625054359436, 0.45383426547050476, 5.510539722308749e-07, -2.6490953430879927e-08, 0.17118743062019348, -0.2053539752960205, -0.27831560373306274, 0.15698140859603882, 0.1793675720691681, -0.5690943598747253, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.45346271991729736, 0.048197418451309204, -0.36888864636421204, 0.4074212312698364, 0.31226253509521484, -0.11366516351699829, 0.32940420508384705, 1.4305641116152401e-06, -0.3259016275405884, 0.5023233890533447, 0.23939990997314453, -0.009561995975673199, 0.2913636863231659, -0.09894350916147232, 0.2610079348087311, 1.0, 0.0901992991566658, 0.05222079157829285, -0.27057310938835144, 0.07522163540124893, -0.04561273381114006, -0.025607243180274963, 0.2807755172252655, 1.4623637980548665e-06, -0.325901597738266, 0.48469528555870056, 0.2867460250854492, 0.40700244903564453, -0.15739144384860992, -0.14135029911994934, 0.04795658960938454, 1.0, 0.45346274971961975, 0.0467066764831543, -0.23867976665496826, -0.2862589657306671, 0.296307235956192, -0.057909172028303146, 0.17772547900676727, 2.22545097017246e-07, 0.5510937571525574, 0.5004540085792542, 0.2691190838813782, 0.3244965076446533, 0.3244950473308563, 0.14533863961696625, 0.14004839956760406, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, -0.70710688829422, 0.6234904527664185, 0.8467234373092651, -0.43388378620147705, -0.9438862800598145, 0.22251832485198975, 0.9937126636505127, 5.404259809438372e-06, -0.7071066498756409, -0.7818309664726257, 0.5320332646369934, 0.9009688496589661, -0.3302706182003021, -0.9749284982681274, 0.11196046322584152, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552]}, "214": {"i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.15489235520362854, -0.18025410175323486, 0.44569477438926697, -0.4407218098640442, 0.18773221969604492, 0.0967080295085907, -0.20016014575958252, 0.09772885590791702, 0.3710055649280548, -0.1518678218126297, 0.07858406007289886, -0.036746665835380554, -0.14367884397506714, 0.4944750666618347, -0.8443411588668823, 0.9529364109039307, 0.10238391160964966, -0.04110652208328247, 0.23595139384269714, 0.003069773316383362, 0.21375814080238342, -0.013137176632881165, 0.04729309305548668, -0.054235413670539856, 0.7429324388504028, -0.27712687849998474, 0.15400265157222748, 0.19069920480251312, -0.5286065340042114, 0.5772095322608948, -0.9507538676261902, 0.7623789310455322, 0.547782301902771, -0.37202686071395874, 0.07359384000301361, -0.05030639469623566, 0.3515220284461975, -0.5817458033561707, 0.3879578709602356, 0.09772937744855881, 0.33166903257369995, 0.059514835476875305, -0.12050959467887878, -0.052362583577632904, 0.04076272249221802, 0.35627859830856323, -0.8364125490188599, 0.952936053276062], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.05662953853607178, -0.2995259463787079, 0.2867182195186615, -0.06833379715681076, 0.29449886083602905, -0.12430846691131592, 0.04542432725429535, -1.059992094099016e-08, 0.6250360012054443, -0.13700897991657257, 0.14172571897506714, 0.11114120483398438, -0.4027230143547058, 0.5979418158531189, -0.3775281608104706, 1.0, 0.12108781933784485, -0.006027168594300747, 0.03637395799160004, -0.17760200798511505, 0.19132746756076813, -0.0325789712369442, -0.07284369319677353, 1.1656369736101624e-07, 0.7637362480163574, -0.28546881675720215, 0.11534558236598969, 0.371053010225296, -0.24894598126411438, 0.6143262386322021, -0.6416324377059937, 1.0, 0.6816656589508057, 0.004662871360778809, 0.11115428060293198, -0.5039085149765015, 0.1854834258556366, -0.39381012320518494, 0.05332586541771889, 6.146181590338529e-07, 0.41341957449913025, -0.012446973472833633, -0.12346798926591873, -0.04554637894034386, -0.10942880064249039, 0.20897060632705688, -0.05375681445002556, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.32487547397613525, -0.3185287415981293, 0.3273811340332031, -0.3186972141265869, 0.45411190390586853, 0.16790011525154114, 0.09782636910676956, -4.980545327271102e-07, 0.11461443454027176, -0.15143758058547974, -0.1430368423461914, -0.3481955826282501, -0.04775526747107506, 0.3129512071609497, -0.44684261083602905, 1.0, -0.35679009556770325, 0.30635011196136475, -0.3676113486289978, 0.5025780200958252, -0.4735686480998993, 0.24040895700454712, -0.03724895045161247, -3.4969110629390343e-07, 0.7962799072265625, -0.12614838778972626, 0.21401621401309967, 0.4574395716190338, -0.07872006297111511, 0.6385672092437744, -0.4256453514099121, 1.0, 0.649121880531311, -0.3071470856666565, 0.41213053464889526, -0.7592202425003052, 0.4613109827041626, -0.3239304721355438, 0.10191725939512253, 5.934184059697145e-07, 0.649121880531311, -0.147914320230484, 0.04643605649471283, 0.17328685522079468, -0.2898617386817932, 0.4061957597732544, -0.2912639081478119, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.2357022762298584, -0.0741734728217125, 0.3146277666091919, -0.26061081886291504, -0.03732301667332649, 0.30032289028167725, -0.2822403907775879, -6.359937287925277e-08, 0.23570223152637482, 0.03572006896138191, -0.035449933260679245, -0.05948236212134361, -0.02345152758061886, 0.376592755317688, -0.806601345539093, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8047378659248352, 0.044077396392822266, 0.4079764783382416, 0.4816804826259613, -0.02135542966425419, 0.8545541763305664, -0.29592251777648926, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8047378659248352, 0.044077396392822266, 0.4079764783382416, 0.4816804826259613, -0.02135542966425419, 0.8545541763305664, -0.29592251777648926, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8047378659248352, 0.044077396392822266, 0.4079764783382416, 0.4816804826259613, -0.02135542966425419, 0.8545541763305664, -0.29592251777648926, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7071067690849304, -0.22252042591571808, 0.9438832998275757, -0.7818324565887451, -0.11196905374526978, 0.900968611240387, -0.8467212319374084, -1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "215": {"j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.748455247252423e-08, -0.4981796145439148, -0.41669711470603943, 0.664084255695343, 0.2741110920906067, -0.10396367311477661, -0.6717345118522644, 2.7975288503512274e-06, -0.20000000298023224, -0.11370662599802017, 0.8652788400650024, 0.5295903086662292, -0.21859845519065857, -0.2158832550048828, 0.15332241356372833, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.576172411441803, 0.45572835206985474, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.9537518269885368e-08, -0.5494036078453064, -0.30216071009635925, 0.4578831195831299, 0.32394543290138245, -0.1317235380411148, -0.4255252182483673, 2.092855538649019e-06, -0.25, -0.12539805471897125, 0.6274415850639343, 0.36515012383461, -0.25834110379219055, -0.2735268771648407, 0.09712549299001694, 0.7499998211860657, 0.21650636196136475, -0.6083088517189026, -0.0834498479962349, 0.21624337136745453, 0.5486437678337097, -0.40842512249946594, -0.29801714420318604, -0.07216782122850418, -0.125, 0.3703594505786896, 0.6196925044059753, 0.544488251209259, 0.14708586037158966, -0.027199724689126015, 0.4180888235569, 0.6250001788139343, 0.21650636196136475, -0.3845619261264801, -0.30392903089523315, 0.3655010163784027, 0.3655008375644684, -0.30392855405807495, -0.38456204533576965, 0.2165069580078125, 0.375, 0.6509292721748352, 0.5693697333335876, 0.47260963916778564, 0.5273890495300293, 0.4306302070617676, 0.3490718901157379, 0.6249997615814209], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.050042688846588135, -0.13393166661262512, 0.1882966160774231, -0.014952193014323711, -0.04650519788265228, -0.6513679027557373, 2.161746124329511e-06, -9.934107758624577e-09, -0.01142196822911501, 0.2781111001968384, 0.15016140043735504, 0.011924277059733868, -0.09656926244497299, 0.14867424964904785, 1.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.0513296015560627, 0.3086802363395691, 0.24084043502807617, -0.01912505365908146, 0.10718376189470291, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "216": {"i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.2741134464740753, 0.04673590138554573, -0.10396382957696915, -0.3842162489891052, -0.6717334389686584, -0.5690781474113464, 1.3987644251756137e-06, -3.5762788286319847e-08, -0.21859805285930634, -0.20476298034191132, -0.21588334441184998, -0.18502767384052277, 0.15331843495368958, 0.7136048674583435, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.3506041467189789, 0.21002884209156036, 0.2396123856306076, 0.42644739151000977, 0.6890082359313965, 0.9127331972122192, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.6082531809806824, 0.11472977697849274, 0.04197584092617035, -0.09016282856464386, -0.19905595481395721, -0.6786144375801086, -0.4715706706047058, 1.1310297622912913e-06, -2.880899430124373e-08, -0.09149383008480072, -0.18390804529190063, -0.18722522258758545, -0.09585995972156525, 0.15488915145397186, 0.5913337469100952, 0.8125000596046448, 0.5457531809806824, 0.25961628556251526, -0.12690457701683044, 0.038674548268318176, -0.2985096573829651, -0.5175623297691345, -0.18477657437324524, 4.3512972069947864e-07, 0.5457531809806824, 0.12502464652061462, -0.01429864764213562, -0.00882720947265625, 0.18756650388240814, 0.6490025520324707, 0.5280631184577942, 0.6249999403953552, 0.0, -3.725290298461914e-09, 0.0, 0.0, -3.725290298461914e-09, 7.450580596923828e-09, 0.0, -1.7410997088518343e-09, 0.6082531809806824, 0.14674478769302368, 0.18863753974437714, 0.20780426263809204, 0.22093525528907776, 0.6960663199424744, 0.7563428282737732, 0.8125000596046448], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333333283662796, -0.08232637494802475, -0.31661856174468994, -0.2673126757144928, 0.044078946113586426, 0.481680303812027, 0.8545553088188171, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.014952123165130615, 0.010164514183998108, -0.04650523141026497, -0.010236476548016071, -0.6513661742210388, -0.17415060102939606, 1.0808730621647555e-06, -2.3510830615691702e-08, 0.01192388404160738, -0.04453359544277191, -0.0965692475438118, -0.004929696675390005, 0.1486697942018509, 0.218378484249115, 1.0, 0.5690355896949768, -0.03971235454082489, 0.40541115403175354, -0.4696037471294403, -0.018082132562994957, -0.5328059792518616, -0.09773667901754379, 6.993822694312257e-07, 0.5690355896949768, -0.01912449300289154, 0.045678939670324326, 0.10718391090631485, 0.011361762881278992, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, -4.967053879312289e-09, 0.0, 0.0, 4.967053879312289e-09, 0.0, 0.0, -9.473903425812318e-15, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718393325805664, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "217": {"h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.14142131805419922, -0.5404525995254517, -0.4491073191165924, 0.6254650950431824, 0.49149090051651, -0.4405234754085541, -0.4156118333339691, 1.7166770476251259e-06, -0.5414213538169861, 0.2614726424217224, 0.6745253205299377, 0.4493965208530426, 0.02464616298675537, -0.42735838890075684, 0.22710800170898438, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.5761724710464478, 0.45572835206985474, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.21650628745555878, -0.7201823592185974, 0.026789750903844833, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.216505229473114, -0.375, 0.23007452487945557, 0.6448538303375244, 0.5804275274276733, -0.04306572675704956, -0.2561146914958954, 0.4525972902774811, 0.6250003576278687, 0.21650631725788116, -0.5523721575737, -0.138569638133049, 0.2535577714443207, 0.50285804271698, -0.3823010325431824, -0.31965339183807373, 8.702593845555384e-07, 0.0, 0.4405019283294678, 0.6071118116378784, 0.5265185832977295, 0.24216167628765106, 0.08725777268409729, 0.4008346199989319, 0.6250001192092896, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "218": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.15850938856601715, -0.6079297661781311, -0.26128169894218445, 0.5534034371376038, 0.28125742077827454, -0.275503545999527, -0.32230526208877563, -0.09796354174613953, -0.21816952526569366, 0.10689546912908554, 0.9444780945777893, 0.6079914569854736, -0.10392505675554276, 0.038888026028871536, 0.42222294211387634, 0.6984977126121521, 0.09796419739723206, -0.20682744681835175, -0.08725392818450928, 0.20261915028095245, 0.00983904767781496, 0.08094079792499542, -0.32898664474487305, 0.15850992500782013, 0.6348361372947693, 0.4689192473888397, 0.9828238487243652, 0.6204202771186829, 0.6779282689094543, 0.4510009288787842, 0.7112319469451904, 0.8848360180854797], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "219": {"h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.2741134464740753, 0.04673590138554573, -0.10396382957696915, -0.3842162489891052, -0.6717334389686584, -0.5690781474113464, 1.3987644251756137e-06, -3.5762788286319847e-08, -0.21859805285930634, -0.20476298034191132, -0.21588334441184998, -0.18502767384052277, 0.15331843495368958, 0.7136048674583435, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.3506041467189789, 0.21002884209156036, 0.2396123856306076, 0.42644739151000977, 0.6890082359313965, 0.9127331972122192, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, -9.934107758624577e-09, 0.0, 4.967053879312289e-09, 9.934107758624577e-09, 0.0, 0.0, 0.0, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "220": {"e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5230118632316589, -0.06109599396586418, -0.19881507754325867, 0.2415136694908142, -0.04051078110933304, -0.7262457013130188, -0.6163265109062195, 1.8862192519009113e-06, -0.5230119228363037, -0.2676796019077301, -0.06956847757101059, -0.19260035455226898, -0.3595321476459503, -0.3497421443462372, 0.3872663676738739, 1.0, 0.5230118632316589, -0.06109599396586418, -0.19881506264209747, 0.24151365458965302, -0.04051075503230095, -0.7262457609176636, -0.6163264513015747, 1.8862192519009113e-06, -0.5230119228363037, -0.2676796019077301, -0.06956849992275238, -0.19260038435459137, -0.35953211784362793, -0.3497421443462372, 0.3872663676738739, 1.0, 0.42571884393692017, 0.061667364090681076, -0.0017885168781504035, 0.052654776722192764, -0.2644512355327606, -0.4472237825393677, -0.21234911680221558, 9.272096122003859e-07, 0.3950633406639099, 0.2761867642402649, 0.11198683828115463, 0.22583863139152527, 0.32925647497177124, 0.3356611728668213, 0.6901557445526123, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.5230118632316589, -0.06109599396586418, -0.19881506264209747, 0.24151365458965302, -0.04051078110933304, -0.7262457013130188, -0.6163264513015747, 1.8862192519009113e-06, -0.5230118632316589, -0.2676796019077301, -0.06956849992275238, -0.19260038435459137, -0.3595321476459503, -0.3497421443462372, 0.3872663676738739, 1.0, 0.45442110300064087, -0.06939873099327087, -0.12088632583618164, 0.4008340537548065, 0.16225048899650574, -0.5393532514572144, -0.5045294761657715, 2.3206744117487688e-06, -0.6256651282310486, -0.27697038650512695, -0.0037634107284247875, -0.09249275922775269, -0.2688031494617462, -0.29589900374412537, 0.4030492901802063, 1.0, 0.6256651282310486, 0.2598135769367218, 0.11869295686483383, -0.4012700319290161, -0.31258097290992737, -0.40849754214286804, -0.14316099882125854, 7.09982089119876e-07, 0.45442116260528564, 0.1184300035238266, -0.023230604827404022, -0.09058219939470291, -0.029554001986980438, 0.4599868059158325, 0.6296849846839905, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "221": {"n": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.14142131805419922, -0.5404525995254517, -0.4491073191165924, 0.6254650950431824, 0.49149090051651, -0.4405234754085541, -0.4156118333339691, 1.7166770476251259e-06, -0.5414213538169861, 0.2614726424217224, 0.6745253205299377, 0.4493965208530426, 0.02464616298675537, -0.42735838890075684, 0.22710800170898438, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624804973602, 0.0841163769364357, 0.6453768014907837, 1.0, 0.1414213478565216, -0.37517932057380676, 0.11196555942296982, -0.038619399070739746, 0.32571038603782654, -0.21147458255290985, -0.12892977893352509, 6.993822125878069e-07, 0.5414213538169861, 0.46871891617774963, 0.8025866746902466, 0.7692022323608398, 0.36889463663101196, 0.5761724710464478, 0.45572835206985474, 1.0], "m": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.21650628745555878, -0.7201823592185974, 0.026789750903844833, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.216505229473114, -0.375, 0.23007452487945557, 0.6448538303375244, 0.5804275274276733, -0.04306572675704956, -0.2561146914958954, 0.4525972902774811, 0.6250003576278687, 0.21650631725788116, -0.5523721575737, -0.138569638133049, 0.2535577714443207, 0.50285804271698, -0.3823010325431824, -0.31965339183807373, 8.702593845555384e-07, 0.0, 0.4405019283294678, 0.6071118116378784, 0.5265185832977295, 0.24216167628765106, 0.08725777268409729, 0.4008346199989319, 0.6250001192092896, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209], "l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007449507713318, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.4525972902774811, 0.6250003576278687, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007450997829437, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.45259732007980347, 0.6250003576278687, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260963916778564, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "222": {"i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.5414213538169861, 0.5413941144943237, 0.587942898273468, -0.7585097551345825, -0.23545332252979279, 0.31861746311187744, -0.4665392339229584, 1.5895624301265343e-06, -0.1414213478565216, 0.25951749086380005, -0.5576777458190918, -0.133514404296875, 0.4321250915527344, -0.524574875831604, -0.08156563341617584, 1.0, 0.0, 0.2913002371788025, 0.2516275942325592, -0.4071580469608307, -0.11501030623912811, -0.16401486098766327, -0.8047699928283691, 1.2716500350506976e-06, -0.20000000298023224, 0.06648757308721542, -0.5225099325180054, -0.3246991038322449, 0.09171900898218155, -0.34058114886283875, 0.18368873000144958, 1.0, 0.5414213538169861, 0.6003796458244324, 0.06943410634994507, -0.2989490032196045, -0.473682165145874, -0.608784019947052, -0.38494324684143066, 9.537375262880232e-07, -0.14142140746116638, 0.001085734344087541, -0.8073787689208984, -0.7097839117050171, 0.13339856266975403, -0.07796235382556915, 0.275917649269104, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252993285655975, 0.7818323969841003, -0.9009736180305481, 3.815961520103883e-07, 1.1924879750324635e-08, 0.9009693264961243, -0.7818314433097839, -0.22252397239208221, 0.9749258160591125, -0.6234887838363647, -0.43387386202812195, 1.0, -1.9868215517249155e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.034462820738554, -0.2089928835630417, -0.8331294655799866, 1.5259630572472815e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.43397918343544006, 0.1901615411043167, 1.0, -1.9868215517249155e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.034462820738554, -0.2089928835630417, -0.8331294655799866, 1.5259630572472815e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.43397918343544006, 0.1901615411043167, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252993285655975, 0.7818323969841003, -0.9009736180305481, 3.815961520103883e-07, 1.1924879750324635e-08, 0.9009693264961243, -0.7818314433097839, -0.22252397239208221, 0.9749258160591125, -0.6234887838363647, -0.43387386202812195, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.9868215517249155e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.034462820738554, -0.2089928835630417, -0.8331294655799866, 1.5259630572472815e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.43397918343544006, 0.1901615411043167, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "223": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.333333283662796, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, 0.0, 0.0513296015560627, 0.3086802065372467, 0.24084044992923737, -0.019125044345855713, 0.10718374699354172, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.03971381112933159, -0.46960365772247314, -0.5328049659729004, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718374699354172, 0.668119490146637, 1.0, 0.21816949546337128, 0.29546356201171875, 0.044564347714185715, -0.23480188846588135, -0.2156657576560974, -0.02339244820177555, 0.011262376792728901, -0.09796401858329773, 0.8251760601997375, 0.540379524230957, 0.3376798629760742, 0.4794183075428009, 0.7476077079772949, 0.7955694794654846, 0.6765062212944031, 0.6984972357749939], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382624059915543, 0.08411641418933868, 0.6453768014907837, 1.0, 0.19999997317790985, -0.23360475897789001, -0.12904950976371765, 0.22595572471618652, 0.13253739476203918, -0.3685387969017029, -0.514668345451355, 1.3987644251756137e-06, 0.0, 0.18629345297813416, 0.5654018521308899, 0.46920233964920044, 0.06382622569799423, 0.08411641418933868, 0.6453768014907837, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.784517765045166, 0.39581990242004395, -0.081280417740345, -0.028645018115639687, -0.45168039202690125, -0.872427225112915, -0.4370262622833252, 1.4305642253020778e-06, -0.2845178544521332, -0.29025864601135254, -0.5548369884490967, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.784517765045166, 0.39581990242004395, -0.0812804102897644, -0.028645029291510582, -0.45168039202690125, -0.872427225112915, -0.4370262324810028, 1.4305642253020778e-06, -0.2845177948474884, -0.29025864601135254, -0.5548370480537415, -0.6006457209587097, -0.2275513857603073, -0.07412860542535782, 0.4696367681026459, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "224": {"l": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, -0.21816955506801605, -0.06498292833566666, 0.1792670488357544, -0.2669844329357147, 0.3452846109867096, -0.21166323125362396, -0.5861396193504333, -0.097963847219944, -0.49184274673461914, 0.2882300317287445, -0.2695414125919342, 0.08740907907485962, 0.0004898309707641602, -0.4934377670288086, 0.14533860981464386, 0.6984977722167969, 0.2181694507598877, 0.0665111243724823, 0.0989651009440422, 0.0258090291172266, 0.07635225355625153, -0.2538145184516907, -0.591151773929596, 0.09796582907438278, -0.49184274673461914, -0.2878812253475189, -0.3082128167152405, -0.279741495847702, -0.3367368280887604, -0.47313880920410156, 0.12337783724069595, 0.6984972953796387, 0.6666666865348816, 0.3587331771850586, 0.07603346556425095, -0.15895043313503265, -0.47034189105033875, -0.7222657799720764, -0.5781464576721191, 1.398764311488776e-06, -2.9802322387695312e-08, -0.2860799729824066, -0.3331238031387329, -0.3300642967224121, -0.22650332748889923, 0.164852112531662, 0.7249762415885925, 1.0], "k": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -4.5849727570157484e-08, -0.2444116473197937, -0.03839671239256859, 0.09587579220533371, 0.2644214630126953, -0.2781898081302643, -0.8767594695091248, 1.917214376589982e-06, -0.5384615659713745, -0.055785536766052246, 0.07973095029592514, 0.07645797729492188, -0.21087095141410828, -0.5776684284210205, 0.20011970400810242, 1.0, 0.4409269690513611, -0.18410348892211914, 0.11665615439414978, -0.0945843756198883, 0.12471004575490952, -0.6316983103752136, -0.5408690571784973, -0.1332331895828247, -0.4615384638309479, -0.19987724721431732, -0.12282086163759232, -0.11234292387962341, -0.3201923966407776, -0.34313634037971497, 0.40912267565727234, 0.7692309617996216, 0.6716962456703186, 0.1560594141483307, 0.06792126595973969, -0.1377348154783249, -0.23582719266414642, -0.7268478870391846, -0.45743969082832336, 1.07014227523905e-06, -3.3012106825935916e-08, -0.12445307523012161, -0.29758220911026, -0.2860095798969269, -0.113568015396595, 0.16589806973934174, 0.5736140608787537, 0.7692307829856873], "j": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.5690356492996216, 0.02748183347284794, 0.3454429805278778, -0.2089933156967163, 0.02015736699104309, 0.19015590846538544, -0.2940625846385956, 2.8611282232304802e-06, -0.569035530090332, -0.03446108102798462, 0.21705679595470428, 0.43397843837738037, 0.007053891662508249, -0.8331287503242493, -0.03312927484512329, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0], "i": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.5690356492996216, 0.02748183347284794, 0.3454430103302002, -0.2089933156967163, 0.020157357677817345, 0.19015590846538544, -0.2940625846385956, 2.8611284506041557e-06, -0.569035530090332, -0.03446108102798462, 0.21705681085586548, 0.433978408575058, 0.007053872104734182, -0.8331288695335388, -0.03312927484512329, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252993285655975, 0.7818323969841003, -0.9009736180305481, 3.815961520103883e-07, 1.1924879750324635e-08, 0.9009693264961243, -0.7818314433097839, -0.22252397239208221, 0.9749258160591125, -0.6234887838363647, -0.43387386202812195, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "g": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.9868215517249155e-08, 0.08026224374771118, 0.137375608086586, -0.20899319648742676, 0.034462820738554, -0.2089928835630417, -0.8331294655799866, 1.5259630572472815e-06, -0.3333333432674408, 0.0183193888515234, -0.2852635681629181, -0.16666753590106964, -0.027483105659484863, -0.43397918343544006, 0.1901615411043167, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "f": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023907918948680162, -0.7699264883995056, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474614918231964, -0.30032241344451904, -0.02122117020189762, -0.3707776963710785, 0.15744060277938843, 1.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023907918948680162, -0.7699264883995056, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474614918231964, -0.30032241344451904, -0.02122117020189762, -0.3707776963710785, 0.15744060277938843, 1.0, 0.5690355896949768, -0.014952133409678936, 0.010164514183998108, -0.04650522768497467, -0.010236461646854877, -0.6513662934303284, -0.17415058612823486, 1.0808730621647555e-06, -2.715344749049109e-08, 0.011923909187316895, -0.04453359916806221, -0.09656926244497299, -0.004929701332002878, 0.1486697942018509, 0.218378484249115, 1.0], "d": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.43388283252716064, 0.6234899163246155, -0.9749271869659424, 0.22252991795539856, 0.7818323373794556, -0.9009736180305481, 3.8159618043209775e-07, 1.1924880638503055e-08, 0.9009693264961243, -0.7818313837051392, -0.22252395749092102, 0.9749258756637573, -0.6234887838363647, -0.43387386202812195, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552], "b": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "225": {"l": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.2741134464740753, 0.04673590138554573, -0.10396382957696915, -0.3842162489891052, -0.6717334389686584, -0.5690781474113464, 1.3987644251756137e-06, -3.5762788286319847e-08, -0.21859805285930634, -0.20476298034191132, -0.21588334441184998, -0.18502767384052277, 0.15331843495368958, 0.7136048674583435, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.2765367031097412, 0.325711190700531, -0.08876504749059677, -0.21147465705871582, -0.005149233154952526, -0.1289297640323639, -0.321871817111969, 3.4969110629390343e-07, 0.7847759127616882, 0.36889567971229553, 0.2558859884738922, 0.5761724710464478, 0.6099673509597778, 0.4557274281978607, 0.7228654623031616, 1.0], "k": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6443375945091248, 0.10391175001859665, 0.05503792688250542, -0.11305578798055649, -0.18039864301681519, -0.706174373626709, -0.4436023235321045, 1.044106284098234e-06, -3.476937493473997e-08, -0.08286671340465546, -0.24113677442073822, -0.2347629815340042, -0.08687522262334824, 0.1611795276403427, 0.5562624335289001, 0.75, 0.6026709079742432, 0.2564394772052765, -0.11266881227493286, 0.010150216519832611, -0.29248687624931335, -0.5726821422576904, -0.2740424871444702, 0.07216925919055939, 0.4888354539871216, 0.13162140548229218, -0.14064453542232513, -0.13380062580108643, 0.19715158641338348, 0.6050459742546082, 0.49682775139808655, 0.6249998807907104, 0.375, 0.26914671063423157, -0.1696118712425232, 0.12424758076667786, -0.31657809019088745, -0.3522028923034668, 0.08302116394042969, -0.21650606393814087, 0.71650630235672, 0.10523438453674316, 0.3647390305995941, 0.3660930395126343, 0.1588113158941269, 0.7808723449707031, 0.6217692494392395, 0.6250000596046448], "j": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4999999701976776, 0.14718389511108398, 0.0027895495295524597, -0.02148394286632538, -0.2550278306007385, -0.5959347486495972, -0.5554757118225098, 1.3987644251756137e-06, -2.9802322387695312e-08, -0.1173751950263977, -0.01222178339958191, -0.04461193084716797, -0.12281417846679688, 0.13601794838905334, 0.6965478658676147, 1.0, 0.375, 0.26914671063423157, -0.1696118712425232, 0.12424758821725845, -0.31657809019088745, -0.3522028923034668, 0.08302116394042969, -0.21650607883930206, 0.7165063619613647, 0.10523438453674316, 0.36473900079727173, 0.3660930395126343, 0.1588113009929657, 0.7808723449707031, 0.6217692494392395, 0.6250001192092896, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474613428115845, -0.30032241344451904, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.014952133409678936, 0.010164514183998108, -0.04650522768497467, -0.010236461646854877, -0.6513662934303284, -0.17415060102939606, 1.0808730621647555e-06, -2.715344749049109e-08, 0.011923898942768574, -0.04453359916806221, -0.0965692475438118, -0.004929701332002878, 0.1486697942018509, 0.21837849915027618, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124498590826988, 0.045678943395614624, 0.10718391090631485, 0.011361747980117798, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.03971235826611519, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718390345573425, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "226": {"j": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6000000238418579, 0.2741134464740753, 0.04673590138554573, -0.10396382957696915, -0.3842162489891052, -0.6717334389686584, -0.5690781474113464, 1.3987644251756137e-06, -3.5762788286319847e-08, -0.21859805285930634, -0.20476298034191132, -0.21588334441184998, -0.18502767384052277, 0.15331843495368958, 0.7136048674583435, 1.0, 0.5414213538169861, 0.13253891468048096, 0.2877509593963623, -0.3685389757156372, -0.19104325771331787, -0.5146692395210266, -0.18333959579467773, 6.993822125878069e-07, 0.5414213538169861, 0.06382739543914795, 0.03242180496454239, 0.08411653339862823, 0.12004073709249496, 0.6453744769096375, 0.5239564180374146, 1.0, 0.2765367031097412, 0.325711190700531, -0.08876504749059677, -0.21147465705871582, -0.005149233154952526, -0.1289297640323639, -0.321871817111969, 3.4969110629390343e-07, 0.7847759127616882, 0.36889567971229553, 0.2558859884738922, 0.5761724710464478, 0.6099673509597778, 0.4557274281978607, 0.7228654623031616, 1.0], "i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4999999701976776, 0.14718389511108398, 0.0027895495295524597, -0.02148394286632538, -0.2550278306007385, -0.5959347486495972, -0.5554757118225098, 1.3987644251756137e-06, -2.9802322387695312e-08, -0.1173751950263977, -0.01222178339958191, -0.04461193084716797, -0.12281417846679688, 0.13601794838905334, 0.6965478658676147, 1.0, 0.375, 0.26914671063423157, -0.1696118712425232, 0.12424758821725845, -0.31657809019088745, -0.3522028923034668, 0.08302116394042969, -0.21650607883930206, 0.7165063619613647, 0.10523438453674316, 0.36473900079727173, 0.3660930395126343, 0.1588113009929657, 0.7808723449707031, 0.6217692494392395, 0.6250001192092896, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0]}, "227": {"i": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.38672953844070435, 0.2551691234111786, -0.07126295566558838, -0.012276334688067436, -0.24142439663410187, -0.4072606563568115, -0.05717923864722252, 4.2690385271271225e-07, 0.38672953844070435, 0.12288301438093185, -0.008029354736208916, 0.0028021421749144793, 0.15169747173786163, 0.5106884837150574, 0.1634087860584259, 1.0, -0.2390046864748001, 0.11615810543298721, -0.3599223494529724, 0.35902515053749084, -0.10155439376831055, 0.20992867648601532, -0.2093077003955841, -0.12371810525655746, 0.9114484786987305, 0.46875351667404175, 0.48245787620544434, 0.5169718265533447, 0.44597798585891724, 0.9340843558311462, 0.38657888770103455, 0.7857142686843872, -0.5887600779533386, 0.16274897754192352, -0.4894541800022125, 0.5417929887771606, -0.10546153783798218, 0.5457608103752136, 0.03659173473715782, -6.993822125878069e-07, 0.5887600183486938, -0.07837585359811783, 0.055148329585790634, 0.123660609126091, -0.06626609712839127, 0.6843621134757996, 0.10457350313663483, 1.0], "h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3400733768939972, 0.1781681627035141, -0.23191197216510773, 0.16745758056640625, -0.15962855517864227, -0.37536704540252686, -0.04610245302319527, 3.137157307264715e-07, 0.3400733768939972, 0.08580125868320465, -0.02613016590476036, -0.03822088986635208, 0.100301593542099, 0.4706950783729553, 0.13175266981124878, 0.8333333134651184, -0.30698028206825256, 0.09637236595153809, -0.3163135349750519, 0.4568437337875366, -0.27031421661376953, 0.19585683941841125, -0.08995118737220764, -0.0962253138422966, 0.890125036239624, 0.25726208090782166, 0.3048363924026489, 0.5136839151382446, 0.3415035009384155, 0.7085043787956238, 0.17718474566936493, 0.8333333134651184, -0.6090787053108215, 0.1734297275543213, -0.4087708592414856, 0.6144120097160339, -0.22161442041397095, 0.4283682405948639, -0.0020902950782328844, -6.464002808570513e-07, 0.6090787053108215, -0.08351942151784897, 0.04605749994516373, 0.14023536443710327, -0.1392499804496765, 0.5371564626693726, -0.005973762832581997, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.2357022613286972, 0.0741734728217125, -0.3146277666091919, 0.26061081886291504, 0.03732301667332649, -0.30032286047935486, 0.2822404205799103, 6.359936577382541e-08, 0.23570223152637482, 0.03572006896138191, -0.03544993698596954, -0.05948236584663391, -0.02345152758061886, 0.376592755317688, -0.8066014647483826, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.974928081035614, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.974928081035614, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2568660080432892, 0.01911892555654049, -0.09416822344064713, 0.36148130893707275, -0.5544177889823914, -0.09816224128007889, 0.035413067787885666, 5.404365310823778e-07, 0.2568660080432892, 0.009207174181938171, -0.010610138066112995, -0.08250557631254196, 0.34836503863334656, 0.1230912134051323, -0.10120568424463272, 1.0, -0.36326345801353455, 0.018081525340676308, -0.1091218814253807, 0.5328059196472168, -0.5739824175834656, 0.09773693233728409, 0.21853107213974, -3.4969113471561286e-07, 0.8769953846931458, 0.011361360549926758, 0.12210748344659805, 0.668117344379425, 0.31722837686538696, 0.2793159782886505, -0.03712980076670647, 1.0, -0.6201295256614685, 0.010236243717372417, -0.12133971601724625, 0.6513662934303284, -0.26860472559928894, 0.174150750041008, 0.012263059616088867, -5.404365310823778e-07, 0.620129406452179, -0.004929527640342712, 0.013671745546162128, 0.14866989850997925, -0.1687760353088379, 0.2183779925107956, 0.0350460410118103, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -0.781831681728363, -0.22252130508422852, 0.433883398771286, 0.900969922542572, 0.9749280214309692, 0.6234879493713379, -1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7071067690849304, 0.22252042591571808, -0.9438832998275757, 0.7818324565887451, 0.11196905374526978, -0.900968611240387, 0.8467212319374084, 1.9079809021604888e-07, -0.7071068286895752, 0.9749280214309692, -0.330279141664505, -0.6234886050224304, 0.9937117099761963, -0.4338843524456024, -0.5320367217063904, 0.9999999403953552, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "228": {"h": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.38672953844070435, 0.2551691234111786, -0.07126295566558838, -0.012276334688067436, -0.24142439663410187, -0.4072606563568115, -0.05717923864722252, 4.2690385271271225e-07, 0.38672953844070435, 0.12288301438093185, -0.008029354736208916, 0.0028021421749144793, 0.15169747173786163, 0.5106884837150574, 0.1634087860584259, 1.0, -0.2390046864748001, 0.11615810543298721, -0.3599223494529724, 0.35902515053749084, -0.10155439376831055, 0.20992867648601532, -0.2093077003955841, -0.12371810525655746, 0.9114484786987305, 0.46875351667404175, 0.48245787620544434, 0.5169718265533447, 0.44597798585891724, 0.9340843558311462, 0.38657888770103455, 0.7857142686843872, -0.5887600779533386, 0.16274897754192352, -0.4894541800022125, 0.5417929887771606, -0.10546153783798218, 0.5457608103752136, 0.03659173473715782, -6.993822125878069e-07, 0.5887600183486938, -0.07837585359811783, 0.055148329585790634, 0.123660609126091, -0.06626609712839127, 0.6843621134757996, 0.10457350313663483, 1.0], "g": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -0.5690355896949768, 0.039712369441986084, -0.40541115403175354, 0.4696038067340851, 0.01808212138712406, 0.5328059792518616, 0.09773667901754379, -6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "f": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8047378659248352, 0.044077396392822266, 0.4079764783382416, 0.4816804826259613, -0.02135542966425419, 0.8545541763305664, -0.29592251777648926, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.974928081035614, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.974928081035614, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.99382155744388e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837170600891, 1.0], "e": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2568660080432892, 0.019118905067443848, -0.09416822344064713, 0.36148130893707275, -0.5544177889823914, -0.09816224128007889, 0.035413067787885666, 5.404365310823778e-07, 0.2568659782409668, 0.009207178838551044, -0.010610133409500122, -0.08250557631254196, 0.34836503863334656, 0.12309122085571289, -0.10120566934347153, 1.0, -0.36326345801353455, 0.018081525340676308, -0.1091218814253807, 0.5328059196472168, -0.5739824175834656, 0.09773693233728409, 0.21853107213974, -3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210747599601746, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0, -0.36326345801353455, 0.018081525340676308, -0.1091218814253807, 0.5328059196472168, -0.5739824175834656, 0.09773693233728409, 0.21853107213974, -3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0], "d": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "c": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "b": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0]}, "229": {"l": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.384775847196579, -0.4223814010620117, -0.032305847853422165, 0.270459920167923, -0.0305742509663105, -0.16979631781578064, -0.6479379534721375, 1.939190497068921e-06, -0.2765367031097412, -0.07976244390010834, 0.5404466390609741, 0.07421676814556122, -0.020438741892576218, -0.09349095821380615, 0.2962486445903778, 1.0, 0.38477587699890137, -0.016226375475525856, -0.20538480579853058, -0.1106041893362999, -0.03504284471273422, -0.1124173179268837, -0.14463798701763153, 8.583384669691441e-07, 0.27653664350509644, 0.42954021692276, 0.5009423494338989, 0.25772738456726074, -0.01116037368774414, 0.15790387988090515, 0.6976150274276733, 1.0, 0.2765367031097412, 0.325711190700531, -0.08876504749059677, -0.21147465705871582, -0.005149233154952526, -0.1289297640323639, -0.321871817111969, 3.4969110629390343e-07, 0.7847759127616882, 0.36889567971229553, 0.2558859884738922, 0.5761724710464478, 0.6099673509597778, 0.4557274281978607, 0.7228654623031616, 1.0], "k": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.14718389511108398, 0.0027895495295524597, -0.02148393914103508, -0.2550278604030609, -0.5959347486495972, -0.5554757118225098, 1.3987644251756137e-06, -1.4901161193847656e-08, -0.1173751950263977, -0.01222178339958191, -0.04461193084716797, -0.12281417846679688, 0.13601793348789215, 0.6965478658676147, 1.0, 0.4375, 0.20816528797149658, -0.08341115713119507, 0.05138182267546654, -0.2858029901981354, -0.474068820476532, -0.23622725903987885, -0.10825234651565552, 0.3582531809806824, -0.0060704052448272705, 0.1762586236000061, 0.16074055433273315, 0.017998553812503815, 0.45844516158103943, 0.6591585874557495, 0.8125000596046448, 0.375, 0.26914671063423157, -0.1696118712425232, 0.12424758076667786, -0.31657809019088745, -0.3522028923034668, 0.08302116394042969, -0.21650606393814087, 0.7165063619613647, 0.10523439943790436, 0.36473900079727173, 0.3660930395126343, 0.1588113009929657, 0.7808723449707031, 0.6217692494392395, 0.6250001192092896], "j": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.21650631725788116, -0.7201822996139526, 0.026789747178554535, 0.14161455631256104, 0.640215277671814, -0.4606734812259674, -0.25474467873573303, -0.21650519967079163, -0.375, 0.23007449507713318, 0.6448538303375244, 0.5804275870323181, -0.04306572675704956, -0.256114661693573, 0.4525972902774811, 0.6250003576278687, 0.21650634706020355, -0.3845619559288025, -0.30392903089523315, 0.3655009865760803, 0.3655008375644684, -0.30392855405807495, -0.38456207513809204, 0.2165069431066513, 0.375, 0.65092933177948, 0.5693697929382324, 0.47260966897010803, 0.5273890495300293, 0.4306302070617676, 0.3490719199180603, 0.6249997615814209, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "i": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5690355896949768, 0.009808103553950787, -0.3850821256637573, 0.37659335136413574, -0.0023908019065856934, -0.7699265480041504, -0.2505645155906677, 1.4623637980548665e-06, -0.5690355896949768, 0.04297228530049324, -0.13474614918231964, -0.30032244324684143, -0.021221160888671875, -0.3707776963710785, 0.15744058787822723, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, 0.0, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -8.74227694680485e-08, -0.9749277234077454, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.974926769733429, 2.797528622977552e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252555191516876, 0.9999999403953552, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124487414956093, 0.04567895457148552, 0.10718389600515366, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0, 0.5690355896949768, -0.039712369441986084, 0.40541115403175354, -0.4696038067340851, -0.01808212138712406, -0.5328059792518616, -0.09773667901754379, 6.99382155744388e-07, 0.5690355896949768, -0.019124507904052734, 0.04567893221974373, 0.10718391090631485, 0.011361758224666119, 0.6681172847747803, 0.27931639552116394, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.3333333134651184, -0.06436536461114883, -0.07045436650514603, 0.1159825399518013, -0.039713818579912186, -0.46960365772247314, -0.5328049063682556, 1.398764311488776e-06, -1.9868215517249155e-08, 0.051329612731933594, 0.3086802363395691, 0.24084044992923737, -0.019125064834952354, 0.10718375444412231, 0.668119490146637, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -8.742277657347586e-08, -0.9749277830123901, -0.4338844120502472, 0.7818310260772705, 0.7818284630775452, -0.4338829219341278, -0.9749268293380737, 2.7975288503512274e-06, -1.0, -0.2225216031074524, 0.9009685516357422, 0.6234903931617737, -0.6234936118125916, -0.9009692072868347, 0.22252556681632996, 0.9999999403953552, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}, "230": {"h": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.1920929132713809e-08, 0.0, 0.0, 0.0, 1.1368683941568192e-14, 0.7656853795051575, -0.14710712432861328, 0.28957176208496094, 0.3780166208744049, -0.22562651336193085, 0.8254650235176086, -0.555107057094574, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7656853795051575, -0.14710712432861328, 0.28957176208496094, 0.3780166208744049, -0.22562651336193085, 0.8254650235176086, -0.555107057094574, 1.0, 0.7694452404975891, -0.10398683696985245, 0.4083102345466614, -0.49550729990005493, 0.046318940818309784, -0.7175503969192505, -0.17361614108085632, 0.0866033285856247, 0.4328426718711853, -0.24032552540302277, -0.30753421783447266, -0.24468448758125305, -0.2130609005689621, 0.5640896558761597, -0.04744412750005722, 0.8499999046325684], "g": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.3535534143447876, -0.45048436522483826, 0.49685612320899963, -0.48746398091316223, 0.42336177825927734, -0.31174495816230774, 0.16513895988464355, 3.4969113471561286e-07, 0.7920510172843933, -0.21126127243041992, 0.11703607439994812, 0.4453190863132477, -0.10740237683057785, 0.5305736660957336, -0.4905068576335907, 1.0, 0.0, 0.0, 0.0, -9.934107758624577e-09, 0.0, 0.0, 0.0, -9.473903425812318e-15, 0.7920510172843933, -0.21126127243041992, 0.11703606694936752, 0.4453190863132477, -0.10740238428115845, 0.5305736660957336, -0.4905068576335907, 1.0, 0.8769953846931458, -0.002390960929915309, 0.1335575431585312, -0.7699267268180847, -0.03677304461598396, -0.2505645453929901, 0.19400493800640106, 7.311818990274332e-07, 0.3632633686065674, -0.021220406517386436, -0.09476397186517715, -0.37077757716178894, -0.6547804474830627, 0.15743999183177948, 0.10722187906503677, 1.0], "f": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.8047378659248352, 0.044077396392822266, 0.4079764783382416, 0.4816804826259613, -0.02135542966425419, 0.8545541763305664, -0.29592251777648926, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.974928081035614, -0.6234879493713379, 1.398764311488776e-06, -4.371138473402425e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388161063194275, 0.22252048552036285, 0.7818329334259033, 1.0], "e": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0, 0.36326345801353455, -0.018081525340676308, 0.1091218814253807, -0.5328059792518616, 0.5739824175834656, -0.09773693233728409, -0.21853107213974, 3.49691077872194e-07, 0.8769953846931458, 0.011361360549926758, 0.12210746854543686, 0.668117344379425, 0.31722840666770935, 0.2793160080909729, -0.03712980076670647, 1.0], "d": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, -0.7071068286895752, 0.9009687900543213, -0.9937121868133545, 0.9749280214309692, -0.8467235565185547, 0.6234899759292603, -0.3302779197692871, -6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "c": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.781831681728363, 0.22252130508422852, -0.433883398771286, -0.900969922542572, -0.9749280214309692, -0.6234879493713379, 1.3987644251756137e-06, -4.371138828673793e-08, -0.6234895586967468, -0.9749278426170349, -0.9009690284729004, -0.43388158082962036, 0.22252048552036285, 0.7818329334259033, 1.0], "b": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0, 0.7071068286895752, -0.9009687900543213, 0.9937121868133545, -0.9749280214309692, 0.8467235565185547, -0.6234899759292603, 0.3302779197692871, 6.993822125878069e-07, 0.7071067690849304, -0.4338839054107666, 0.11196466535329819, 0.22252075374126434, -0.5320331454277039, 0.7818313241004944, -0.9438837766647339, 1.0], "a": [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]}} \ No newline at end of file diff --git a/ppmat/models/sgequidiff/resources/wyckoff_positions/clean_wyckoffs_in_asu_v6.json b/ppmat/models/sgequidiff/resources/wyckoff_positions/clean_wyckoffs_in_asu_v6.json new file mode 100644 index 00000000..53f27466 --- /dev/null +++ b/ppmat/models/sgequidiff/resources/wyckoff_positions/clean_wyckoffs_in_asu_v6.json @@ -0,0 +1 @@ +{"1": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1", "0"], ["0", "1", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1", "0"], ["1", "1", "1"]], "dim": "3", "volumes": [0.9999999999999999]}, "ordered_wyckoff_letters": ["a"], "hall_number": 1}, "2": {"a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1", "0"], ["0", "1", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1", "0"], ["1/2", "1", "1"]], "dim": "3", "volumes": [0.5]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 2}, "3": {"a": {"vertices": [[["0", "0", "0"], ["0", "1", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["0", "1", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "1", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["1/2", "1", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [1.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1", "0", "0"], ["1", "0", "1/2"], ["1", "1", "0"], ["1", "1", "1/2"]], "dim": "3", "volumes": [0.49999999999999994]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 3}, "4": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1", "0", "0"], ["1", "0", "1/2"], ["1", "1", "0"], ["1", "1", "1/2"]], "dim": "3", "volumes": [0.49999999999999994]}, "ordered_wyckoff_letters": ["a"], "hall_number": 6}, "5": {"a": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]], [["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]], [["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 9}, "6": {"a": {"vertices": [[["0", "0", "0"], ["1", "0", "0"], ["1", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1", "0", "0"]], "volumes": [1.0000000000000002]}, "b": {"vertices": [[["0", "1/2", "1"], ["1", "1/2", "1"], ["1", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1", "0", "-1/2"]], "volumes": [1.0000000000000002]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1/2", "0"], ["1", "1/2", "1"]], "dim": "3", "volumes": [0.49999999999999994]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 18}, "7": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1/2", "0"], ["1", "1/2", "1"]], "dim": "3", "volumes": [0.49999999999999994]}, "ordered_wyckoff_letters": ["a"], "hall_number": 21}, "8": {"a": {"vertices": [[["0", "0", "0"], ["1", "0", "0"], ["1", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1", "0", "0"]], "volumes": [1.0000000000000002]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1/4", "0"], ["1", "1/4", "1"]], "dim": "3", "volumes": [0.24999999999999992]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 30}, "9": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1/4", "0"], ["1", "1/4", "1"]], "dim": "3", "volumes": [0.24999999999999992]}, "ordered_wyckoff_letters": ["a"], "hall_number": 39}, "10": {"i": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1/2", "0", "0"]], "volumes": [0.4999999999999998]}, "n": {"vertices": [[["0", "1/2", "1"], ["1/2", "1/2", "1"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/2", "0", "-1/4"]], "volumes": [0.4999999999999998]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "o": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"], "hall_number": 57}, "11": {"e": {"vertices": [[["0", "1/4", "1"], ["1", "1/4", "1"], ["1", "1/4", "0"], ["0", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1", "0", "-1/4"]], "volumes": [1.0000000000000002]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1/4", "0"], ["1", "1/4", "1"]], "dim": "3", "volumes": [0.24999999999999992]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 60}, "12": {"g": {"vertices": [[["0", "0", "0"], ["0", "1/4", "0"]], [["1/2", "1/4", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "1/4", "1/2"], ["0", "0", "1/2"]], [["1/2", "0", "1/2"], ["1/2", "1/4", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "i": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1/2", "0", "0"]], "volumes": [0.4999999999999998]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 63}, "13": {"e": {"vertices": [[["0", "1", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [1.0]}, "f": {"vertices": [[["1/2", "0", "1/4"], ["1/2", "1", "1/4"]]], "dim": "1", "volumes": [1.0]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1", "0"], ["1/2", "1", "1/2"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 72}, "14": {"a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1", "0", "0"], ["1", "0", "1"], ["1", "1/4", "0"], ["1", "1/4", "1"]], "dim": "3", "volumes": [0.24999999999999992]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 81}, "15": {"e": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]], [["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 90}, "16": {"i": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "o": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "p": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "q": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "r": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "s": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "t": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "u": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"], "hall_number": 108}, "17": {"a": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]], [["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [[["0", "0", "1/4"], ["0", "1/2", "1/4"]], [["0", "1/2", "3/4"], ["0", "0", "3/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]], [["1/2", "0", "3/4"], ["1/2", "1/2", "3/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 109}, "18": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 112}, "19": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a"], "hall_number": 115}, "20": {"a": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]], [["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 116}, "21": {"e": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["0", "1/2", "0"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["0", "0", "1/2"], ["1/4", "0", "1/2"]], [["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["1/4", "1/4", "1"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [1.0]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 119}, "22": {"e": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["0", "0", "0"], ["0", "1/4", "0"]], [["0", "1/4", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/4", "1/4", "3/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "0", "1/4"]], [["1/4", "0", "3/4"], ["1/4", "1/4", "3/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "j": {"vertices": [[["0", "1/4", "1/4"], ["1/4", "1/4", "1/4"]], [["1/4", "1/4", "3/4"], ["0", "1/4", "3/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "3/4"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 122}, "23": {"e": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 123}, "24": {"a": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]], [["1/2", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/4", "0", "0"], ["1/4", "1/2", "0"]], [["1/4", "1/2", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [[["0", "1/4", "0"], ["0", "1/4", "1/2"]], [["1/2", "1/4", "1/2"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 124}, "25": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["1/2", "1/2", "1"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [1.0]}, "e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1/2", "0", "0"]], "volumes": [0.4999999999999998]}, "f": {"vertices": [[["0", "1/2", "1"], ["1/2", "1/2", "1"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/2", "0", "-1/4"]], "volumes": [0.4999999999999998]}, "g": {"vertices": [[["0", "0", "1"], ["0", "1/2", "1"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/2", "0", "0", "0"]], "volumes": [0.4999999999999998]}, "h": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["1/2", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "0", "0", "-1/4"]], "volumes": [0.4999999999999998]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 125}, "26": {"a": {"vertices": [[["0", "0", "1"], ["0", "1/2", "1"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/2", "0", "0", "0"]], "volumes": [0.4999999999999998]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["1/2", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "0", "0", "-1/4"]], "volumes": [0.4999999999999998]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 128}, "27": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 134}, "28": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/4", "0", "0"], ["1/4", "1", "0"], ["1/4", "1", "1"], ["1/4", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1", "0", "0", "-1/4"]], "volumes": [1.0000000000000002]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1", "0"], ["0", "1", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1", "0"], ["1/4", "1", "1"]], "dim": "3", "volumes": [0.24999999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 137}, "29": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1", "0"], ["0", "1", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1", "0"], ["1/4", "1", "1"]], "dim": "3", "volumes": [0.24999999999999986]}, "ordered_wyckoff_letters": ["a"], "hall_number": 143}, "30": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]], [["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1", "0"], ["1/2", "1", "1/2"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 149}, "31": {"a": {"vertices": [[["0", "0", "1"], ["0", "1/2", "1"], ["0", "1/2", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["1/2", "0", "1"]]], "dim": "2", "plane_coefficients": [["1/2", "0", "0", "0"], ["-1/2", "0", "0", "-1/4"]], "volumes": [0.4999999999999998, 0.4999999999999998]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 155}, "32": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 161}, "33": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a"], "hall_number": 164}, "34": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 170}, "35": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/4", "1/4", "1"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["0", "0", "1"]], [["0", "1/2", "1"], ["1/4", "1/2", "1"], ["1/4", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["0", "-1/4", "0", "-1/8"]], "volumes": [0.24999999999999994, 0.24999999999999994]}, "e": {"vertices": [[["0", "0", "1"], ["0", "1/2", "1"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/2", "0", "0", "0"]], "volumes": [0.4999999999999998]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 173}, "36": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"], ["-1/4", "0", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 176}, "37": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["1/4", "1/4", "1"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 182}, "38": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]], [["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"]], [["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["0", "-1/4", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "d": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006]}, "e": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "0", "0", "-1/8"]], "volumes": [0.25000000000000006]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 185}, "39": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "1/4", "1"], ["1/2", "1/4", "1"], ["1/2", "1/4", "0"], ["0", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/2", "0", "-1/8"]], "volumes": [0.4999999999999998]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 191}, "40": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/4", "0", "0"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"], ["1/4", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "0", "0", "-1/8"]], "volumes": [0.4999999999999998]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 197}, "41": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 203}, "42": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/4", "1/4", "1/2"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "0", "1"], ["0", "1/4", "1"], ["0", "1/4", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.24999999999999994]}, "d": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"]], "volumes": [0.24999999999999994]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 209}, "43": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 212}, "44": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]], [["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"]], [["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["0", "-1/4", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "d": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"], ["-1/4", "0", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 215}, "45": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 218}, "46": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/4", "0", "0"], ["1/4", "1", "0"], ["1/4", "1", "1/2"], ["1/4", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/2", "0", "0", "-1/8"]], "volumes": [0.5000000000000003]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1", "0"], ["1/4", "1", "1/2"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 221}, "47": {"i": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "o": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "p": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "q": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "r": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "s": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "t": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "u": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006]}, "v": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "0", "0", "-1/8"]], "volumes": [0.25000000000000006]}, "w": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"]], "volumes": [0.25000000000000006]}, "x": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/8"]], "volumes": [0.25000000000000006]}, "y": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "z": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/4", "-1/8"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "A": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A"], "hall_number": 227}, "48": {"g": {"vertices": [[["0", "1/4", "1/4"], ["1/4", "1/4", "1/4"]], [["0", "-1/4", "3/4"], ["1/4", "-1/4", "3/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["1/4", "1/4", "3/4"], ["0", "1/4", "3/4"]], [["1/4", "-1/4", "1/4"], ["0", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "i": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/4", "-1/4", "3/4"], ["1/4", "1/4", "3/4"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["1/4", "1/4", "3/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/4", "-1/4", "1/4"], ["1/4", "-1/4", "3/4"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "-1/4", "3/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "3/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "m": {"vertices": [["0", "-1/4", "0"], ["0", "-1/4", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"], "hall_number": 229}, "49": {"i": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "n": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "o": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "p": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "q": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"], ["0", "0", "-1/4", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "r": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r"], "hall_number": 230}, "50": {"g": {"vertices": [[["0", "1/4", "0"], ["1/4", "1/4", "0"]], [["1/4", "3/4", "0"], ["0", "3/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["1/4", "1/4", "1/2"], ["0", "1/4", "1/2"]], [["0", "3/4", "1/2"], ["1/4", "3/4", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "i": {"vertices": [[["1/4", "3/4", "0"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/4", "1/4", "1/2"], ["1/4", "3/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/4", "3/4", "1/2"], ["1/4", "3/4", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "3/4", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "3/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "m": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1", "0"], ["1/4", "1", "1/2"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"], "hall_number": 234}, "51": {"e": {"vertices": [[["1/4", "0", "0"], ["1/4", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "f": {"vertices": [[["1/4", "1/2", "1"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [1.0]}, "g": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"]], "volumes": [0.24999999999999994]}, "j": {"vertices": [[["0", "1/2", "1"], ["1/4", "1/2", "1"], ["1/4", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/8"]], "volumes": [0.24999999999999994]}, "k": {"vertices": [[["1/4", "0", "0"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"], ["1/4", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "0", "0", "-1/8"]], "volumes": [0.4999999999999998]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 239}, "52": {"c": {"vertices": [[["1/4", "0", "0"], ["1/4", "0", "1/2"]], [["3/4", "0", "1/2"], ["3/4", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [[["1", "1/4", "1/4"], ["0", "1/4", "1/4"]]], "dim": "1", "volumes": [1.0]}, "a": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/4", "0"], ["0", "1/4", "1/2"], ["1", "0", "0"], ["1", "0", "1/2"], ["1", "1/4", "0"], ["1", "1/4", "1/2"]], "dim": "3", "volumes": [0.12499999999999999]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 245}, "53": {"e": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/4", "1", "1/4"], ["1/4", "0", "1/4"]]], "dim": "1", "volumes": [1.0]}, "h": {"vertices": [[["0", "0", "1/4"], ["0", "1", "1/4"], ["0", "1", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1", "0"], ["1/2", "1", "1/4"], ["1/2", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"], ["-1/4", "0", "0", "-1/8"]], "volumes": [0.24999999999999994, 0.24999999999999994]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1", "0"], ["0", "1", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1", "0"], ["1/2", "1", "1/4"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 251}, "54": {"c": {"vertices": [[["0", "0", "1/4"], ["0", "1/2", "1/4"]], [["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [[["1/4", "0", "0"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["1/4", "1/2", "1/2"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 257}, "55": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "h": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/4", "-1/8"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 263}, "56": {"c": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["1/4", "3/4", "1/2"], ["1/4", "3/4", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1", "0"], ["0", "1", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1", "0"], ["1/4", "1", "1/2"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 266}, "57": {"c": {"vertices": [[["0", "1/4", "0"], ["1/2", "1/4", "0"]], [["1/2", "3/4", "0"], ["0", "3/4", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"], ["1/2", "1", "1/4"], ["0", "1", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/2", "-1/8"]], "volumes": [0.4999999999999998]}, "a": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1", "0"], ["0", "1", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1", "0"], ["1/2", "1", "1/4"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 269}, "58": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"], ["0", "0", "-1/4", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 275}, "59": {"a": {"vertices": [[["1/4", "1/4", "1"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "-1/4", "1"]]], "dim": "1", "volumes": [1.0]}, "e": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"], ["1/4", "-1/4", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "0", "0", "-1/8"]], "volumes": [0.4999999999999998]}, "f": {"vertices": [[["0", "1/4", "1"], ["1/4", "1/4", "1"], ["1/4", "1/4", "0"], ["0", "1/4", "0"]], [["0", "-1/4", "0"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1"], ["0", "-1/4", "1"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/16"], ["0", "1/4", "0", "-1/16"]], "volumes": [0.24999999999999994, 0.24999999999999994]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "-1/4", "0"], ["0", "-1/4", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 279}, "60": {"c": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]], [["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 284}, "61": {"a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 290}, "62": {"c": {"vertices": [[["0", "1/4", "1"], ["1/2", "1/4", "1"], ["1/2", "1/4", "0"], ["0", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/2", "0", "-1/8"]], "volumes": [0.4999999999999998]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 292}, "63": {"c": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]], [["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5, 0.5]}, "e": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "0", "1/4"], ["0", "1/2", "1/4"], ["0", "1/2", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["1/8", "0", "0", "0"], ["-1/8", "0", "0", "-1/16"]], "volumes": [0.1250000000000001, 0.1250000000000001]}, "g": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/4", "-1/16"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 298}, "64": {"d": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "e": {"vertices": [[["1/4", "0", "1/4"], ["1/4", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 304}, "65": {"g": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["0", "1/2", "0"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "0", "1/2"], ["1/4", "0", "1/2"]], [["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "i": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["1/4", "1/4", "1/2"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006]}, "o": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["0", "0", "1/2"]], [["0", "1/2", "1/2"], ["1/4", "1/2", "1/2"], ["1/4", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/8", "0", "0"], ["0", "-1/8", "0", "-1/16"]], "volumes": [0.12499999999999997, 0.12499999999999997]}, "p": {"vertices": [[["0", "1/2", "0"], ["1/4", "1/2", "0"], ["1/4", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/8", "0"]], "volumes": [0.12499999999999997]}, "q": {"vertices": [[["0", "0", "1/2"], ["1/4", "0", "1/2"], ["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/8", "-1/16"]], "volumes": [0.12499999999999997]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "r": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r"], "hall_number": 310}, "66": {"g": {"vertices": [[["0", "0", "1/4"], ["1/4", "0", "1/4"]], [["1/4", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "k": {"vertices": [[["1/4", "1/4", "1/2"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["0", "1/2", "0"], ["1/4", "1/2", "0"], ["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"], ["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/8", "0"], ["0", "0", "-1/8", "-1/16"]], "volumes": [0.12499999999999997, 0.12499999999999997]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "m": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"], "hall_number": 313}, "67": {"g": {"vertices": [[["0", "1/4", "0"], ["0", "1/4", "1/2"]], [["1/2", "1/4", "1/2"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "h": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "0", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["1/4", "0", "0"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "k": {"vertices": [[["1/4", "1/4", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25]}, "l": {"vertices": [[["1/4", "0", "1/2"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "0", "1/2"], ["0", "1/4", "1/2"], ["0", "1/4", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["1/8", "0", "0", "0"], ["-1/8", "0", "0", "-1/16"]], "volumes": [0.12499999999999997, 0.12499999999999997]}, "n": {"vertices": [[["0", "1/4", "1/2"], ["1/2", "1/4", "1/2"], ["1/2", "1/4", "0"], ["0", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/16"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["1/4", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "o": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/4", "0"], ["0", "1/4", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/2"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"], "hall_number": 316}, "68": {"e": {"vertices": [[["1/2", "1/4", "1/4"], ["0", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "1/4", "1/4"], ["0", "0", "1/4"]], [["1/2", "0", "1/4"], ["1/2", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["0", "1/4", "0"], ["0", "1/4", "1/4"]], [["1/2", "1/4", "1/4"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["1/4", "0", "1/2"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/4", "0"], ["0", "1/4", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/2"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 323}, "69": {"g": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "0", "0"], ["0", "1/4", "0"]], [["0", "1/4", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "i": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "k": {"vertices": [[["1/4", "0", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "l": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "m": {"vertices": [[["0", "0", "1/2"], ["0", "1/4", "1/2"], ["0", "1/4", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/8", "0", "0", "0"]], "volumes": [0.12499999999999997]}, "n": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "1/8", "0", "0"]], "volumes": [0.12499999999999997]}, "o": {"vertices": [[["0", "1/4", "0"], ["1/4", "1/4", "0"], ["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"], ["1/4", "1/4", "1/2"], ["0", "1/4", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/16", "0"], ["0", "0", "-1/16", "-1/32"]], "volumes": [0.06250000000000001, 0.06250000000000001]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "p": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/4", "0"], ["0", "1/4", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]], "dim": "3", "volumes": [0.03125000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"], "hall_number": 334}, "70": {"e": {"vertices": [[["0", "1/8", "1/8"], ["1/8", "1/8", "1/8"]], [["0", "-1/8", "7/8"], ["1/8", "-1/8", "7/8"]], [["1/8", "1/8", "5/8"], ["0", "1/8", "5/8"]], [["1/8", "-1/8", "3/8"], ["0", "-1/8", "3/8"]]], "dim": "1", "volumes": [0.125, 0.125, 0.125, 0.125]}, "f": {"vertices": [[["1/8", "1/8", "1/8"], ["1/8", "-1/8", "1/8"]], [["1/8", "-1/8", "5/8"], ["1/8", "1/8", "5/8"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/8", "1/8", "5/8"], ["1/8", "1/8", "1/8"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["1/8", "1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/8", "1/8", "5/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "-1/8", "0"], ["0", "-1/8", "1"], ["0", "1/8", "0"], ["0", "1/8", "1"], ["1/8", "-1/8", "0"], ["1/8", "-1/8", "1"], ["1/8", "1/8", "0"], ["1/8", "1/8", "1"]], "dim": "3", "volumes": [0.03124999999999999]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 336}, "71": {"e": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["0", "1/2", "0"], ["1/4", "1/2", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006]}, "m": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["0", "0", "1/2"]], [["0", "1/2", "1/2"], ["1/4", "1/2", "1/2"], ["1/4", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/8", "0", "0"], ["0", "-1/8", "0", "-1/16"]], "volumes": [0.12499999999999997, 0.12499999999999997]}, "n": {"vertices": [[["0", "1/2", "0"], ["1/4", "1/2", "0"], ["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"], ["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/8", "0"], ["0", "0", "-1/8", "-1/16"]], "volumes": [0.12499999999999997, 0.12499999999999997]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "o": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"], "hall_number": 337}, "72": {"f": {"vertices": [[["0", "0", "1/4"], ["1/4", "0", "1/4"]], [["1/4", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["0", "1/2", "0"], ["1/4", "1/2", "0"], ["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"], ["1/4", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/8", "0"], ["0", "0", "-1/8", "-1/16"]], "volumes": [0.12499999999999997, 0.12499999999999997]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 338}, "73": {"c": {"vertices": [[["0", "0", "1/4"], ["1/4", "0", "1/4"]], [["0", "1/2", "1/4"], ["1/4", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "d": {"vertices": [[["1/4", "1/2", "0"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["0", "1/4", "0"], ["0", "1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/4", "0", "0"], ["1/4", "0", "1/2"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 341}, "74": {"e": {"vertices": [[["0", "1/4", "0"], ["0", "1/4", "1"]]], "dim": "1", "volumes": [1.0]}, "f": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/4", "0", "1/2"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "0", "1/4"]], [["1/4", "0", "3/4"], ["1/4", "1/4", "3/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "0", "1"], ["0", "1/4", "1"], ["0", "1/4", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.24999999999999994]}, "i": {"vertices": [[["0", "1/4", "1"], ["1/4", "1/4", "1"], ["1/4", "1/4", "0"], ["0", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/16"]], "volumes": [0.24999999999999994]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "3/4"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 343}, "75": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "1/2", "1"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 349}, "76": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a"], "hall_number": 350}, "77": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]], [["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 351}, "78": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a"], "hall_number": 352}, "79": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 353}, "80": {"a": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25, 0.25, 0.25]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1", "0"], ["0", "1", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1", "0"], ["1/2", "1", "1/4"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 354}, "81": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.25]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 355}, "82": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 356}, "83": {"g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "k": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/4", "-1/8"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 357}, "84": {"g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"], ["0", "0", "-1/4", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 358}, "85": {"c": {"vertices": [[["1/4", "1/4", "1/2"], ["1/4", "1/4", "0"]], [["-1/4", "-1/4", "1/2"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "f": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "-1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/2"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 360}, "86": {"e": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"]], [["-1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "a": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/2"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 362}, "87": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 363}, "88": {"e": {"vertices": [[["0", "1/4", "1/8"], ["0", "1/4", "5/8"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "1/4", "1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "1/4", "5/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/4", "0"], ["0", "1/4", "1"], ["1/4", "0", "0"], ["1/4", "0", "1"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 365}, "89": {"g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "k": {"vertices": [[["0", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "l": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "o": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "p": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"], "hall_number": 366}, "90": {"c": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]], [["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "f": {"vertices": [[["0", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 367}, "91": {"a": {"vertices": [[["0", "0", "0"], ["0", "1", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "1", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["0", "1", "1/8"], ["1", "0", "1/8"]]], "dim": "1", "volumes": [1.4142135623730951]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/8"], ["0", "1", "0"], ["0", "1", "1/8"], ["1", "0", "0"], ["1", "0", "1/8"], ["1", "1", "0"], ["1", "1", "1/8"]], "dim": "3", "volumes": [0.12499999999999993]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 368}, "92": {"a": {"vertices": [[["1", "1", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.4142135623730951]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/8"], ["0", "1", "0"], ["0", "1", "1/8"], ["1", "0", "0"], ["1", "0", "1/8"], ["1", "1", "0"], ["1", "1", "1/8"]], "dim": "3", "volumes": [0.12499999999999993]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 369}, "93": {"g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "j": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["1/2", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "o": {"vertices": [[["0", "1", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "p": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1", "0"], ["0", "1", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1", "0"], ["1/2", "1", "1/4"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"], "hall_number": 370}, "94": {"c": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "f": {"vertices": [[["0", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 371}, "95": {"a": {"vertices": [[["1", "1", "0"], ["1", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "1", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["0", "0", "1/8"], ["1", "1", "1/8"]]], "dim": "1", "volumes": [1.4142135623730951]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/8"], ["0", "1", "0"], ["0", "1", "1/8"], ["1", "0", "0"], ["1", "0", "1/8"], ["1", "1", "0"], ["1", "1", "1/8"]], "dim": "3", "volumes": [0.12499999999999993]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 372}, "96": {"a": {"vertices": [[["1", "1", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.4142135623730951]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/8"], ["0", "1", "0"], ["0", "1", "1/8"], ["1", "0", "0"], ["1", "0", "1/8"], ["1", "1", "0"], ["1", "1", "1/8"]], "dim": "3", "volumes": [0.12499999999999993]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 373}, "97": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 374}, "98": {"c": {"vertices": [[["0", "0", "1/8"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/8"]], [["1/2", "0", "0"], ["1/2", "0", "1/8"]], [["1/2", "1/2", "1/8"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.125, 0.125, 0.125, 0.125]}, "d": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "e": {"vertices": [[["1/2", "1/2", "0"], ["0", "1", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "f": {"vertices": [[["1/2", "1/4", "1/8"], ["0", "1/4", "1/8"]], [["0", "3/4", "1/8"], ["1/2", "3/4", "1/8"]]], "dim": "1", "volumes": [0.5, 0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/8"], ["0", "1", "0"], ["0", "1", "1/8"], ["1/2", "0", "0"], ["1/2", "0", "1/8"], ["1/2", "1", "0"], ["1/2", "1", "1/8"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 375}, "99": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "1/2", "0", "0"]], "volumes": [0.7071067811865475]}, "e": {"vertices": [[["0", "1/2", "0"], ["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "1"]]], "dim": "2", "plane_coefficients": [["1/2", "0", "0", "0"]], "volumes": [0.4999999999999998]}, "f": {"vertices": [[["0", "1/2", "1"], ["1/2", "1/2", "1"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/2", "0", "-1/4"]], "volumes": [0.4999999999999998]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 376}, "100": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/2", "0", "1"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["0", "1/2", "1"], ["1/2", "0", "1"], ["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["-1/2", "-1/2", "0", "-1/4"]], "volumes": [0.7071067811865475]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 377}, "101": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "1/2", "0", "0"]], "volumes": [0.7071067811865475]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 378}, "102": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "1/2", "0", "0"]], "volumes": [0.7071067811865475]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 379}, "103": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 380}, "104": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 381}, "105": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]], [["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "d": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"]], [["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "e": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/8"], ["-1/4", "0", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 382}, "106": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 383}, "107": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "b": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "d": {"vertices": [[["0", "1/2", "0"], ["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "1/2"]], [["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"], ["0", "-1/4", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 384}, "108": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "0", "1/2"], ["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["-1/4", "-1/4", "0", "-1/8"]], "volumes": [0.3535533905932738]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 385}, "109": {"a": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25, 0.25, 0.25]}, "b": {"vertices": [[["0", "0", "1/4"], ["0", "1/2", "1/4"], ["0", "1/2", "0"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]], [["0", "1/2", "1/4"], ["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]], [["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["0", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["1/8", "0", "0", "0"], ["-1/8", "0", "0", "-1/16"], ["0", "-1/8", "0", "-1/16"], ["0", "1/8", "0", "0"]], "volumes": [0.1250000000000001, 0.1250000000000001, 0.1250000000000001, 0.1250000000000001]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 386}, "110": {"a": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 387}, "111": {"g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["0", "0", "1"]]], "dim": "2", "plane_coefficients": [["-1/2", "1/2", "0", "0"]], "volumes": [0.7071067811865475]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "o": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"], "hall_number": 388}, "112": {"g": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "l": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "m": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "n": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"], "hall_number": 389}, "113": {"c": {"vertices": [[["1/2", "0", "1"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["0", "1/2", "1"], ["1/2", "0", "1"], ["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["-1/2", "-1/2", "0", "-1/4"]], "volumes": [0.7071067811865475]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 390}, "114": {"c": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 391}, "115": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]], [["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5, 0.5]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["0", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "j": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"]], [["0", "0", "1/2"], ["0", "1/2", "1/2"], ["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "k": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/8"], ["-1/4", "0", "0", "-1/8"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 392}, "116": {"e": {"vertices": [[["1/2", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "f": {"vertices": [[["0", "1", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1", "0"], ["0", "1", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1", "0"], ["1/2", "1", "1/4"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 393}, "117": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.12500000000000003]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 394}, "118": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["1/2", "0", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "g": {"vertices": [[["0", "1/2", "1/4"], ["1/2", "1", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1", "0"], ["0", "1", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1", "0"], ["1/2", "1", "1/4"]], "dim": "3", "volumes": [0.125]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 395}, "119": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["0", "0", "1/4"]], [["0", "0", "1/4"], ["0", "1/2", "1/4"], ["0", "1/2", "0"], ["0", "0", "0"]], [["0", "1/2", "1/4"], ["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]], [["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "1/8", "0", "0"], ["1/8", "0", "0", "0"], ["0", "-1/8", "0", "-1/16"], ["-1/8", "0", "0", "-1/16"]], "volumes": [0.1250000000000001, 0.1250000000000001, 0.1250000000000001, 0.1250000000000001]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 396}, "120": {"e": {"vertices": [[["0", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "f": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 397}, "121": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 398}, "122": {"c": {"vertices": [[["0", "0", "1/8"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/2", "0", "1/8"]], [["1/2", "1/2", "1/8"], ["1/2", "1/2", "0"]], [["0", "1/2", "0"], ["0", "1/2", "1/8"]]], "dim": "1", "volumes": [0.125, 0.125, 0.125, 0.125]}, "d": {"vertices": [[["1/2", "1/4", "1/8"], ["0", "1/4", "1/8"]], [["0", "3/4", "1/8"], ["1/2", "3/4", "1/8"]]], "dim": "1", "volumes": [0.5, 0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1/8"], ["0", "1", "0"], ["0", "1", "1/8"], ["1/2", "0", "0"], ["1/2", "0", "1/8"], ["1/2", "1", "0"], ["1/2", "1", "1/8"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 399}, "123": {"g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "k": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "l": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "o": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "p": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.125]}, "q": {"vertices": [[["0", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/4", "-1/8"]], "volumes": [0.12499999999999989]}, "r": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "s": {"vertices": [[["0", "1/2", "0"], ["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["1/4", "0", "0", "0"]], "volumes": [0.25000000000000006]}, "t": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/8"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "u": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u"], "hall_number": 400}, "124": {"g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["0", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "k": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "n": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"], "hall_number": 401}, "125": {"g": {"vertices": [[["-1/4", "-1/4", "1/2"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/4", "-1/4", "1/2"], ["1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "0"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "j": {"vertices": [[["-1/4", "-1/4", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.3535533905932738]}, "k": {"vertices": [[["1/4", "-1/4", "0"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["-1/4", "-1/4", "1/2"], ["1/4", "-1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["-1/4", "1/4", "1/2"], ["1/4", "-1/4", "1/2"], ["1/4", "-1/4", "0"], ["-1/4", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["-1/4", "-1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["-1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "-1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "-1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "n": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"], "hall_number": 403}, "126": {"e": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"]], [["-1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["-1/4", "-1/4", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["1/4", "-1/4", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["-1/4", "-1/4", "1/4"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/4"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 405}, "127": {"e": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["0", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.12499999999999989]}, "j": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/4", "-1/8"]], "volumes": [0.125]}, "k": {"vertices": [[["0", "1/2", "1/2"], ["1/2", "0", "1/2"], ["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["-1/4", "-1/4", "0", "-1/8"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 406}, "128": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["0", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 407}, "129": {"c": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]], [["-1/4", "-1/4", "1/2"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "f": {"vertices": [[["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "0", "0"], ["-1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "h": {"vertices": [[["-1/4", "1/4", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.3535533905932738]}, "i": {"vertices": [[["-1/4", "1/4", "1/2"], ["1/4", "1/4", "1/2"], ["1/4", "1/4", "0"], ["-1/4", "1/4", "0"]], [["-1/4", "1/4", "0"], ["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "-1/4", "0", "-1/16"], ["1/4", "0", "0", "-1/16"]], "volumes": [0.25000000000000006, 0.25000000000000006]}, "j": {"vertices": [[["-1/4", "-1/4", "0"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"], ["-1/4", "-1/4", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["-1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "1/4", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 409}, "130": {"c": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"]], [["-1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "e": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["-1/4", "1/4", "1/4"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/4"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 411}, "131": {"g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]], [["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "j": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "o": {"vertices": [[["0", "0", "1/4"], ["0", "1/2", "1/4"], ["0", "1/2", "0"], ["0", "0", "0"]], [["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["0", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["1/8", "0", "0", "0"], ["0", "1/8", "0", "0"]], "volumes": [0.1250000000000001, 0.1250000000000001]}, "p": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["1/2", "0", "1/4"]], [["0", "1/2", "1/4"], ["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["-1/8", "0", "0", "-1/16"], ["0", "-1/8", "0", "-1/16"]], "volumes": [0.1250000000000001, 0.1250000000000001]}, "q": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "r": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r"], "hall_number": 412}, "132": {"g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "j": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "k": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "l": {"vertices": [[["0", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "m": {"vertices": [[["1/2", "1/2", "1/4"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5]}, "n": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"], ["0", "0", "-1/4", "-1/8"]], "volumes": [0.125, 0.12499999999999989]}, "o": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "p": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"], "hall_number": 413}, "133": {"f": {"vertices": [[["-1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/4", "-1/4", "0"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/4", "0", "0"], ["1/4", "-1/4", "0"]], [["-1/4", "-1/4", "0"], ["-1/4", "0", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "j": {"vertices": [[["-1/4", "-1/4", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["-1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["-1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/4"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 415}, "134": {"g": {"vertices": [[["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"]], [["1/4", "-1/4", "1/4"], ["1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["-1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["-1/4", "-1/4", "1/4"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["-1/4", "1/4", "1/4"], ["-1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "0", "0"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "l": {"vertices": [[["-1/4", "-1/4", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.3535533905932738]}, "m": {"vertices": [[["-1/4", "1/4", "1/2"], ["1/4", "-1/4", "1/2"], ["1/4", "-1/4", "0"], ["-1/4", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["-1/4", "-1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["-1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["-1/4", "-1/4", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "n": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/2"]], "dim": "3", "volumes": [0.0625]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"], "hall_number": 417}, "135": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["0", "1/2", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 418}, "136": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "g": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"], ["0", "0", "-1/4", "-1/8"]], "volumes": [0.125, 0.12499999999999989]}, "j": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 419}, "137": {"c": {"vertices": [[["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"]], [["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "d": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"]], [["-1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["-1/4", "1/4", "1/4"], ["1/4", "-1/4", "1/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "g": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"], ["1/4", "-1/4", "1/4"]], [["-1/4", "1/4", "1/4"], ["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"], ["-1/4", "1/4", "0"]], [["-1/4", "-1/4", "1/4"], ["-1/4", "1/4", "1/4"], ["-1/4", "1/4", "0"], ["-1/4", "-1/4", "0"]], [["-1/4", "-1/4", "0"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"], ["-1/4", "-1/4", "1/4"]]], "dim": "2", "plane_coefficients": [["-1/8", "0", "0", "-1/32"], ["0", "-1/8", "0", "-1/32"], ["1/8", "0", "0", "-1/32"], ["0", "1/8", "0", "-1/32"]], "volumes": [0.1250000000000001, 0.1250000000000001, 0.1250000000000001, 0.1250000000000001]}, "a": {"vertices": [["1/4", "-1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/4"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"], ["1/4", "-1/4", "0"], ["1/4", "-1/4", "1/4"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]], "dim": "3", "volumes": [0.062499999999999986]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 421}, "138": {"e": {"vertices": [[["-1/4", "-1/4", "1/2"], ["-1/4", "-1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["-1/4", "1/4", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.3535533905932738]}, "h": {"vertices": [[["0", "0", "0"], ["-1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "i": {"vertices": [[["-1/4", "-1/4", "0"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"], ["-1/4", "-1/4", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "1/4", "0", "0"]], "volumes": [0.3535533905932738]}, "a": {"vertices": [["-1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["-1/4", "-1/4", "0"], ["-1/4", "-1/4", "1/2"], ["-1/4", "1/4", "0"], ["-1/4", "1/4", "1/2"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/2"]], "dim": "3", "volumes": [0.06250000000000001]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 423}, "139": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["0", "1/2", "0"], ["0", "1/2", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["0", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.3535533905932738]}, "l": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.125]}, "m": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["-1/8", "1/8", "0", "0"]], "volumes": [0.17677669529663678]}, "n": {"vertices": [[["0", "1/2", "0"], ["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "1/4"]], [["0", "1/2", "1/4"], ["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["1/8", "0", "0", "0"], ["0", "-1/8", "0", "-1/16"]], "volumes": [0.1250000000000001, 0.1250000000000001]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "o": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"]], "dim": "3", "volumes": [0.031249999999999993]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"], "hall_number": 424}, "140": {"f": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/2", "0", "1/4"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["0", "0", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.3535533905932738]}, "j": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.12499999999999989]}, "l": {"vertices": [[["0", "1/2", "1/4"], ["1/2", "0", "1/4"], ["1/2", "0", "0"], ["0", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["-1/8", "-1/8", "0", "-1/16"]], "volumes": [0.17677669529663678]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "m": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"]], "dim": "3", "volumes": [0.031249999999999993]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"], "hall_number": 425}, "141": {"e": {"vertices": [[["0", "1/4", "0"], ["0", "1/4", "1/8"]], [["0", "-1/4", "1/8"], ["0", "-1/4", "0"]], [["1/2", "1/4", "1/8"], ["1/2", "1/4", "0"]], [["1/2", "-1/4", "0"], ["1/2", "-1/4", "1/8"]]], "dim": "1", "volumes": [0.125, 0.125, 0.125, 0.125]}, "f": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "-1/4", "1/8"], ["1/2", "1/4", "1/8"]]], "dim": "1", "volumes": [0.7071067811865476]}, "h": {"vertices": [[["0", "-1/4", "1/8"], ["0", "1/4", "1/8"], ["0", "1/4", "0"], ["0", "-1/4", "0"]], [["1/2", "-1/4", "0"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/8"], ["1/2", "-1/4", "1/8"]], [["0", "-1/4", "0"], ["1/2", "-1/4", "0"], ["1/2", "-1/4", "1/8"], ["0", "-1/4", "1/8"]], [["0", "1/4", "1/8"], ["1/2", "1/4", "1/8"], ["1/2", "1/4", "0"], ["0", "1/4", "0"]]], "dim": "2", "plane_coefficients": [["1/16", "0", "0", "0"], ["-1/16", "0", "0", "-1/32"], ["0", "1/16", "0", "-1/64"], ["0", "-1/16", "0", "-1/64"]], "volumes": [0.062499999999999986, 0.062499999999999986, 0.062499999999999986, 0.062499999999999986]}, "a": {"vertices": [["0", "-1/4", "1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/4", "1/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "-1/4", "0"], ["0", "-1/4", "1/8"], ["0", "1/4", "0"], ["0", "1/4", "1/8"], ["1/2", "-1/4", "0"], ["1/2", "-1/4", "1/8"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/8"]], "dim": "3", "volumes": [0.03124999999999999]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 427}, "142": {"d": {"vertices": [[["0", "-1/4", "1/8"], ["0", "-1/4", "0"]], [["1/2", "-1/4", "0"], ["1/2", "-1/4", "1/8"]]], "dim": "1", "volumes": [0.125, 0.125]}, "e": {"vertices": [[["1/4", "-1/4", "0"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["0", "1/4", "1/8"], ["1/2", "-1/4", "1/8"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "-1/4", "1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "-1/4", "1/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "-1/4", "0"], ["0", "-1/4", "1/8"], ["0", "1/4", "0"], ["0", "1/4", "1/8"], ["1/2", "-1/4", "0"], ["1/2", "-1/4", "1/8"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/8"]], "dim": "3", "volumes": [0.03124999999999999]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 429}, "143": {"a": {"vertices": [[["0", "0", "1"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/3", "2/3", "1"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["0", "1/2", "0"], ["0", "1/2", "1"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.3333333333333335]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 430}, "144": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1/3"], ["0", "1", "0"], ["0", "1", "1/3"], ["1", "0", "0"], ["1", "0", "1/3"], ["1", "1", "0"], ["1", "1", "1/3"]], "dim": "3", "volumes": [0.3333333333333334]}, "ordered_wyckoff_letters": ["a"], "hall_number": 431}, "145": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1/3"], ["0", "1", "0"], ["0", "1", "1/3"], ["1", "0", "0"], ["1", "0", "1/3"], ["1", "1", "0"], ["1", "1", "1/3"]], "dim": "3", "volumes": [0.3333333333333334]}, "ordered_wyckoff_letters": ["a"], "hall_number": 432}, "146": {"a": {"vertices": [[["0", "0", "1/3"], ["0", "0", "0"]], [["2/3", "1/3", "1/3"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/3"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/3"], ["0", "1/2", "0"], ["0", "1/2", "1/3"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/3"], ["1/2", "0", "0"], ["1/2", "0", "1/3"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/3"]], "dim": "3", "volumes": [0.11111111111111112]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 433}, "147": {"c": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 435}, "148": {"c": {"vertices": [[["0", "0", "1/6"], ["0", "0", "0"]], [["2/3", "1/3", "1/6"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/6"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.16666666666666666, 0.16666666666666666, 0.16666666666666666]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/3", "2/3", "1/6"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/3", "1/6", "1/6"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1/2", "0"], ["0", "1/2", "1/6"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/6"], ["1/2", "0", "0"], ["1/2", "0", "1/6"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/6"]], "dim": "3", "volumes": [0.05555555555555555]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 436}, "149": {"g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "0", "0"], ["1/3", "2/3", "0"]], [["1/2", "0", "0"], ["2/3", "1/3", "0"]], [["2/3", "1/3", "0"], ["0", "0", "0"]], [["1/3", "2/3", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.7453559924999299, 0.3726779962499649, 0.7453559924999299, 0.3726779962499649]}, "k": {"vertices": [[["1/3", "2/3", "1/2"], ["0", "0", "1/2"]], [["2/3", "1/3", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["2/3", "1/3", "1/2"]], [["0", "1/2", "1/2"], ["1/3", "2/3", "1/2"]]], "dim": "1", "volumes": [0.7453559924999299, 0.3726779962499649, 0.7453559924999299, 0.3726779962499649]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/3", "2/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 438}, "150": {"c": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "e": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "f": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 439}, "151": {"a": {"vertices": [[["1", "1/2", "0"], ["0", "0", "0"]], [["0", "1/2", "0"], ["1", "1", "0"]]], "dim": "1", "volumes": [1.118033988749895, 1.118033988749895]}, "b": {"vertices": [[["1/2", "1", "1/6"], ["0", "0", "1/6"]], [["1/2", "0", "1/6"], ["1", "1", "1/6"]]], "dim": "1", "volumes": [1.118033988749895, 1.118033988749895]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1", "0"], ["0", "1", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.16666666666666666]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 440}, "152": {"a": {"vertices": [[["0", "0", "0"], ["1", "1", "0"]]], "dim": "1", "volumes": [1.4142135623730951]}, "b": {"vertices": [[["0", "1", "1/6"], ["0", "0", "1/6"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1", "0"], ["0", "1", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.16666666666666666]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 441}, "153": {"a": {"vertices": [[["1", "1/2", "0"], ["0", "0", "0"]], [["0", "1/2", "0"], ["1", "1", "0"]]], "dim": "1", "volumes": [1.118033988749895, 1.118033988749895]}, "b": {"vertices": [[["0", "1", "1/6"], ["1", "0", "1/6"]]], "dim": "1", "volumes": [1.4142135623730951]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1", "0"], ["0", "1", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.16666666666666666]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 442}, "154": {"a": {"vertices": [[["1", "1", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.4142135623730951]}, "b": {"vertices": [[["0", "0", "1/6"], ["1", "0", "1/6"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1", "0"], ["0", "1", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.16666666666666666]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 443}, "155": {"c": {"vertices": [[["0", "0", "1/6"], ["0", "0", "0"]], [["2/3", "1/3", "1/6"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/6"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.16666666666666666, 0.16666666666666666, 0.16666666666666666]}, "d": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "e": {"vertices": [[["1/3", "2/3", "1/6"], ["1/3", "0", "1/6"]], [["0", "1/3", "1/6"], ["1/3", "2/3", "1/6"]]], "dim": "1", "volumes": [0.6666666666666666, 0.4714045207910317]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/3", "2/3", "1/6"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1/2", "0"], ["0", "1/2", "1/6"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/6"], ["1/2", "0", "0"], ["1/2", "0", "1/6"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/6"]], "dim": "3", "volumes": [0.05555555555555555]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 444}, "156": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["1/3", "2/3", "1"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["1/3", "2/3", "0"], ["1/3", "2/3", "1"], ["2/3", "1/3", "1"], ["2/3", "1/3", "0"]], [["0", "0", "0"], ["0", "0", "1"], ["1/3", "2/3", "1"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "0"], ["2/3", "1/3", "1"], ["0", "0", "1"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/3", "-1/3", "0", "-1/3"], ["2/3", "-1/3", "0", "0"], ["-1/3", "2/3", "0", "0"]], "volumes": [0.4714045207910316, 0.7453559924999297, 0.7453559924999301]}, "e": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.1666666666666666]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 446}, "157": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"], ["0", "0", "1"], ["0", "0", "0"]], [["0", "0", "1"], ["1/2", "1/2", "1"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/2", "0", "0"], ["1/2", "-1/2", "0", "0"]], "volumes": [0.5000000000000002, 0.7071067811865475]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.1666666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 447}, "158": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 448}, "159": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 449}, "160": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1/3"]], [["2/3", "1/3", "1/3"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/3"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]}, "b": {"vertices": [[["1/3", "2/3", "0"], ["1/3", "2/3", "1/3"], ["2/3", "1/3", "1/3"], ["2/3", "1/3", "0"]], [["0", "0", "0"], ["0", "0", "1/3"], ["1/3", "2/3", "1/3"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "0"], ["2/3", "1/3", "1/3"], ["0", "0", "1/3"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/9", "-1/9", "0", "-1/9"], ["2/9", "-1/9", "0", "0"], ["-1/9", "2/9", "0", "0"]], "volumes": [0.1571348402636771, 0.24845199749997646, 0.24845199749997648]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/3"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/3"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/3"]], "dim": "3", "volumes": [0.055555555555555525]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 450}, "161": {"a": {"vertices": [[["0", "0", "1/6"], ["0", "0", "0"]], [["2/3", "1/3", "1/6"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/6"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.16666666666666666, 0.16666666666666666, 0.16666666666666666]}, "b": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1/2", "0"], ["0", "1/2", "1/6"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/6"], ["1/2", "0", "0"], ["1/2", "0", "1/6"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/6"]], "dim": "3", "volumes": [0.05555555555555555]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 452}, "162": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"]], [["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "j": {"vertices": [[["2/3", "1/3", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["2/3", "1/3", "1/2"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "k": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["1/4", "-1/4", "0", "0"]], "volumes": [0.25000000000000017, 0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333336]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 454}, "163": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["1/3", "2/3", "1/4"], ["0", "0", "1/4"]], [["2/3", "1/3", "1/4"], ["1/2", "0", "1/4"]], [["0", "0", "1/4"], ["2/3", "1/3", "1/4"]], [["0", "1/2", "1/4"], ["1/3", "2/3", "1/4"]]], "dim": "1", "volumes": [0.7453559924999299, 0.3726779962499649, 0.7453559924999299, 0.3726779962499649]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.08333333333333331]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 455}, "164": {"c": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"], ["1/2", "0", "1"]], [["0", "0", "1"], ["2/3", "1/3", "1"], ["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/3", "1/6", "0", "-1/6"], ["1/3", "-2/3", "0", "0"]], "volumes": [0.37267799624996484, 0.7453559924999306]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.08333333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 456}, "165": {"c": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "d": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "f": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]], [["0", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.08333333333333331]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 457}, "166": {"c": {"vertices": [[["0", "0", "0"], ["0", "0", "1/6"]], [["2/3", "1/3", "1/6"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/6"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.16666666666666666, 0.16666666666666666, 0.16666666666666666]}, "f": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "g": {"vertices": [[["1/3", "2/3", "1/6"], ["1/3", "1/6", "1/6"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/3", "2/3", "0"], ["1/3", "2/3", "1/6"], ["2/3", "1/3", "1/6"], ["2/3", "1/3", "0"]], [["0", "0", "0"], ["0", "0", "1/6"], ["1/3", "2/3", "1/6"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "0"], ["2/3", "1/3", "1/6"], ["0", "0", "1/6"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/18", "-1/18", "0", "-1/18"], ["1/9", "-1/18", "0", "0"], ["-1/18", "1/9", "0", "0"]], "volumes": [0.07856742013183861, 0.12422599874998821, 0.12422599874998833]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/3", "2/3", "1/6"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/3", "1/6", "1/6"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/6"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/6"]], "dim": "3", "volumes": [0.027777777777777776]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 458}, "167": {"c": {"vertices": [[["0", "0", "1/12"], ["0", "0", "0"]], [["2/3", "1/3", "1/12"], ["2/3", "1/3", "0"]], [["1/3", "2/3", "1/12"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.08333333333333333, 0.08333333333333333, 0.08333333333333333]}, "e": {"vertices": [[["0", "1/3", "1/12"], ["2/3", "1/3", "1/12"]], [["2/3", "1/3", "1/12"], ["1/3", "0", "1/12"]]], "dim": "1", "volumes": [0.6666666666666666, 0.4714045207910317]}, "a": {"vertices": [["2/3", "1/3", "1/12"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1/12"], ["0", "1/2", "0"], ["0", "1/2", "1/12"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/12"], ["1/2", "0", "0"], ["1/2", "0", "1/12"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/12"]], "dim": "3", "volumes": [0.027777777777777773]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 460}, "168": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "1"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.1666666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 462}, "169": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1", "0"], ["0", "1", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.16666666666666666]}, "ordered_wyckoff_letters": ["a"], "hall_number": 463}, "170": {"a": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["0", "1", "0"], ["0", "1", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.16666666666666666]}, "ordered_wyckoff_letters": ["a"], "hall_number": 464}, "171": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1/3"]]], "dim": "1", "volumes": [0.3333333333333333]}, "b": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/3"]], [["1/2", "0", "1/3"], ["1/2", "0", "0"]], [["1", "1/2", "1/3"], ["1", "1/2", "0"]]], "dim": "1", "volumes": [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/3"], ["1", "0", "0"], ["1", "0", "1/3"], ["1", "1", "0"], ["1", "1", "1/3"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 465}, "172": {"a": {"vertices": [[["1", "1", "1/3"], ["1", "1", "0"]]], "dim": "1", "volumes": [0.3333333333333333]}, "b": {"vertices": [[["1/2", "1/2", "1/3"], ["1/2", "1/2", "0"]], [["1/2", "0", "0"], ["1/2", "0", "1/3"]], [["1", "1/2", "0"], ["1", "1/2", "1/3"]]], "dim": "1", "volumes": [0.3333333333333333, 0.3333333333333333, 0.3333333333333333]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/3"], ["1", "0", "0"], ["1", "0", "1/3"], ["1", "1", "0"], ["1", "1", "1/3"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 466}, "173": {"a": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5, 0.5]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 467}, "174": {"g": {"vertices": [[["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "1/2", "0"], ["1/3", "2/3", "0"], ["2/3", "1/3", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/6", "0"]], "volumes": [0.33333333333333326]}, "k": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"], ["2/3", "1/3", "1/2"], ["1/3", "2/3", "1/2"], ["0", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/6", "-1/12"]], "volumes": [0.33333333333333315]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/3", "2/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["0", "1/2", "0"], ["0", "1/2", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.16666666666666669]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 468}, "175": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["2/3", "1/3", "0"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/6", "0"]], "volumes": [0.1666666666666665]}, "k": {"vertices": [[["1/2", "0", "1/2"], ["2/3", "1/3", "1/2"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/12", "-1/24"]], "volumes": [0.16666666666666663]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333336]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 469}, "176": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"], ["2/3", "1/3", "1/4"], ["1/3", "2/3", "1/4"], ["0", "1/2", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/6", "-1/24"]], "volumes": [0.33333333333333315]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.08333333333333331]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 470}, "177": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"]], [["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "m": {"vertices": [[["2/3", "1/3", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["2/3", "1/3", "1/2"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "n": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333336]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"], "hall_number": 471}, "178": {"a": {"vertices": [[["1", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["0", "0", "1/12"], ["1", "1/2", "1/12"]], [["1", "1", "1/12"], ["0", "1/2", "1/12"]]], "dim": "1", "volumes": [1.118033988749895, 1.118033988749895]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/12"], ["0", "1", "0"], ["0", "1", "1/12"], ["1", "0", "0"], ["1", "0", "1/12"], ["1", "1", "0"], ["1", "1", "1/12"]], "dim": "3", "volumes": [0.08333333333333329]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 472}, "179": {"a": {"vertices": [[["1", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["0", "1", "1/12"], ["1", "0", "1/12"]]], "dim": "1", "volumes": [1.4142135623730951]}, "c": {"vertices": [["0", "0", "0"], ["0", "0", "1/12"], ["0", "1", "0"], ["0", "1", "1/12"], ["1", "0", "0"], ["1", "0", "1/12"], ["1", "1", "0"], ["1", "1", "1/12"]], "dim": "3", "volumes": [0.08333333333333329]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 473}, "180": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/6"]]], "dim": "1", "volumes": [0.16666666666666666]}, "f": {"vertices": [[["1/2", "0", "1/6"], ["1/2", "0", "0"]], [["1", "1/2", "1/6"], ["1", "1/2", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/6"]]], "dim": "1", "volumes": [0.16666666666666666, 0.16666666666666666, 0.16666666666666666]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1", "0", "1/6"], ["1", "1/2", "1/6"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["1", "1", "0"]]], "dim": "1", "volumes": [1.118033988749895]}, "j": {"vertices": [[["0", "0", "1/6"], ["1", "1/2", "1/6"]]], "dim": "1", "volumes": [1.118033988749895]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/6"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1", "1/2", "1/6"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.08333333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 474}, "181": {"e": {"vertices": [[["1", "1", "0"], ["1", "1", "1/6"]]], "dim": "1", "volumes": [0.16666666666666666]}, "f": {"vertices": [[["1/2", "0", "1/6"], ["1/2", "0", "0"]], [["1", "1/2", "0"], ["1", "1/2", "1/6"]], [["1/2", "1/2", "1/6"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.16666666666666666, 0.16666666666666666, 0.16666666666666666]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1", "1", "1/6"], ["1/2", "1/2", "1/6"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["1/2", "0", "0"], ["1", "1", "0"]]], "dim": "1", "volumes": [1.118033988749895]}, "j": {"vertices": [[["1", "0", "1/6"], ["1/2", "1/2", "1/6"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["1", "1", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1", "1", "1/6"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/2", "1/6"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["0", "0", "1/6"], ["1", "0", "0"], ["1", "0", "1/6"], ["1", "1", "0"], ["1", "1", "1/6"]], "dim": "3", "volumes": [0.08333333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 475}, "182": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "h": {"vertices": [[["1/3", "2/3", "1/4"], ["0", "0", "1/4"]], [["2/3", "1/3", "1/4"], ["1/2", "0", "1/4"]], [["0", "0", "1/4"], ["2/3", "1/3", "1/4"]], [["0", "1/2", "1/4"], ["1/3", "2/3", "1/4"]]], "dim": "1", "volumes": [0.7453559924999299, 0.3726779962499649, 0.7453559924999299, 0.3726779962499649]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.08333333333333331]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 476}, "183": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1"]]], "dim": "1", "volumes": [1.0]}, "b": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "1"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [1.0]}, "d": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1"], ["0", "0", "1"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/2", "0", "0"]], "volumes": [0.5000000000000002]}, "e": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"], ["1/2", "0", "1"]], [["0", "0", "1"], ["2/3", "1/3", "1"], ["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/3", "1/6", "0", "-1/6"], ["1/3", "-2/3", "0", "0"]], "volumes": [0.37267799624996484, 0.7453559924999306]}, "f": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.08333333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 477}, "184": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333336]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 478}, "185": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "c": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["1/4", "-1/4", "0", "0"]], "volumes": [0.25000000000000017, 0.3535533905932738]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333336]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 479}, "186": {"a": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "b": {"vertices": [[["2/3", "1/3", "1"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [1.0]}, "c": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"], ["1/2", "0", "1"]], [["0", "0", "1"], ["2/3", "1/3", "1"], ["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/3", "1/6", "0", "-1/6"], ["1/3", "-2/3", "0", "0"]], "volumes": [0.37267799624996484, 0.7453559924999306]}, "d": {"vertices": [["0", "0", "0"], ["0", "0", "1"], ["1/2", "0", "0"], ["1/2", "0", "1"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1"]], "dim": "3", "volumes": [0.08333333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 480}, "187": {"g": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["2/3", "1/3", "0"], ["1/3", "2/3", "0"]], [["1/3", "2/3", "0"], ["0", "0", "0"]], [["0", "0", "0"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.4714045207910317, 0.7453559924999299, 0.7453559924999299]}, "k": {"vertices": [[["1/3", "2/3", "1/2"], ["2/3", "1/3", "1/2"]], [["0", "0", "1/2"], ["1/3", "2/3", "1/2"]], [["2/3", "1/3", "1/2"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.4714045207910317, 0.7453559924999299, 0.7453559924999299]}, "l": {"vertices": [[["0", "0", "0"], ["1/3", "2/3", "0"], ["2/3", "1/3", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/3", "0"]], "volumes": [0.1666666666666668]}, "m": {"vertices": [[["2/3", "1/3", "1/2"], ["1/3", "2/3", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/3", "-1/6"]], "volumes": [0.16666666666666674]}, "n": {"vertices": [[["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]], [["0", "0", "0"], ["0", "0", "1/2"], ["1/3", "2/3", "1/2"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"], ["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/6", "-1/6", "0", "-1/6"], ["1/3", "-1/6", "0", "0"], ["-1/6", "1/3", "0", "0"]], "volumes": [0.23570226039551587, 0.37267799624996484, 0.37267799624996506]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/3", "2/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "o": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"], "hall_number": 481}, "188": {"g": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["0", "0", "0"], ["1/3", "2/3", "0"]], [["1/2", "0", "0"], ["2/3", "1/3", "0"]], [["2/3", "1/3", "0"], ["0", "0", "0"]], [["1/3", "2/3", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.7453559924999299, 0.3726779962499649, 0.7453559924999299, 0.3726779962499649]}, "k": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"], ["2/3", "1/3", "1/4"], ["1/3", "2/3", "1/4"], ["0", "1/2", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/6", "-1/24"]], "volumes": [0.33333333333333315]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/3", "2/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.08333333333333331]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 482}, "189": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "g": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "h": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"], ["0", "0", "0"]], [["0", "0", "1/2"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"], ["1/4", "-1/4", "0", "0"]], "volumes": [0.25000000000000017, 0.3535533905932738]}, "j": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["2/3", "1/3", "0"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/6", "0"]], "volumes": [0.1666666666666665]}, "k": {"vertices": [[["1/2", "0", "1/2"], ["2/3", "1/3", "1/2"], ["1/2", "1/2", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/12", "-1/24"]], "volumes": [0.16666666666666663]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.08333333333333336]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 483}, "190": {"e": {"vertices": [[["0", "0", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "h": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"], ["2/3", "1/3", "1/4"], ["1/3", "2/3", "1/4"], ["0", "1/2", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/6", "-1/24"]], "volumes": [0.33333333333333315]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["0", "1/2", "0"], ["0", "1/2", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.08333333333333331]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 484}, "191": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "j": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["0", "0", "1/2"], ["1/2", "0", "1/2"]]], "dim": "1", "volumes": [0.5]}, "l": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"]], [["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "m": {"vertices": [[["2/3", "1/3", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["2/3", "1/3", "1/2"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "n": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/2"], ["0", "0", "1/2"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/4", "0", "0"]], "volumes": [0.25000000000000017]}, "o": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"], ["1/2", "0", "1/2"]], [["0", "0", "1/2"], ["2/3", "1/3", "1/2"], ["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/6", "1/12", "0", "-1/12"], ["1/6", "-1/3", "0", "0"]], "volumes": [0.18633899812498245, 0.3726779962499647]}, "p": {"vertices": [[["0", "0", "0"], ["2/3", "1/3", "0"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/6", "0"]], "volumes": [0.0833333333333333]}, "q": {"vertices": [[["1/2", "0", "1/2"], ["2/3", "1/3", "1/2"], ["0", "0", "1/2"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/6", "-1/12"]], "volumes": [0.08333333333333329]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/2"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "1/2"]], "dim": "0", "volumes": [0.0]}, "r": {"vertices": [["0", "0", "0"], ["0", "0", "1/2"], ["1/2", "0", "0"], ["1/2", "0", "1/2"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/2"]], "dim": "3", "volumes": [0.041666666666666664]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r"], "hall_number": 485}, "192": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["1/2", "0", "1/4"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "k": {"vertices": [[["2/3", "1/3", "1/4"], ["1/2", "0", "1/4"]], [["0", "0", "1/4"], ["2/3", "1/3", "1/4"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "l": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "0"], ["2/3", "1/3", "0"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/6", "0"]], "volumes": [0.1666666666666665]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "m": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.041666666666666664]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"], "hall_number": 486}, "193": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["0", "0", "1/4"], ["1/2", "0", "1/4"]], [["0", "0", "1/4"], ["1/2", "1/2", "1/4"]]], "dim": "1", "volumes": [0.5, 0.7071067811865476]}, "h": {"vertices": [[["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["1/2", "0", "0"], ["2/3", "1/3", "0"]], [["2/3", "1/3", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.3726779962499649, 0.7453559924999299]}, "j": {"vertices": [[["1/2", "0", "1/4"], ["2/3", "1/3", "1/4"], ["1/2", "1/2", "1/4"], ["0", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/12", "-1/48"]], "volumes": [0.16666666666666663]}, "k": {"vertices": [[["1/2", "0", "0"], ["1/2", "0", "1/4"], ["0", "0", "1/4"], ["0", "0", "0"]], [["0", "0", "1/4"], ["1/2", "1/2", "1/4"], ["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "1/8", "0", "0"], ["1/8", "-1/8", "0", "0"]], "volumes": [0.12499999999999996, 0.17677669529663678]}, "a": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["1/2", "0", "0"], ["1/2", "0", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.041666666666666664]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 487}, "194": {"e": {"vertices": [[["0", "0", "0"], ["0", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "1", "volumes": [0.25, 0.25]}, "h": {"vertices": [[["0", "0", "1/4"], ["1/3", "2/3", "1/4"]], [["2/3", "1/3", "1/4"], ["0", "0", "1/4"]], [["1/3", "2/3", "1/4"], ["2/3", "1/3", "1/4"]]], "dim": "1", "volumes": [0.7453559924999299, 0.7453559924999299, 0.4714045207910317]}, "i": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "j": {"vertices": [[["2/3", "1/3", "1/4"], ["1/3", "2/3", "1/4"], ["0", "0", "1/4"]]], "dim": "2", "plane_coefficients": [["0", "0", "-1/3", "-1/12"]], "volumes": [0.16666666666666674]}, "k": {"vertices": [[["0", "0", "0"], ["0", "0", "1/4"], ["1/3", "2/3", "1/4"], ["1/3", "2/3", "0"]], [["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"], ["0", "0", "1/4"], ["0", "0", "0"]], [["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["2/3", "1/3", "1/4"], ["2/3", "1/3", "0"]]], "dim": "2", "plane_coefficients": [["1/6", "-1/12", "0", "0"], ["-1/12", "1/6", "0", "0"], ["-1/12", "-1/12", "0", "-1/12"]], "volumes": [0.18633899812498228, 0.18633899812498256, 0.11785113019775789]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/3", "2/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["2/3", "1/3", "1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "0", "1/4"], ["1/3", "2/3", "0"], ["1/3", "2/3", "1/4"], ["2/3", "1/3", "0"], ["2/3", "1/3", "1/4"]], "dim": "3", "volumes": [0.04166666666666666]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 488}, "195": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "1/2"]], [["1/2", "1/2", "1/2"], ["0", "1", "0"]]], "dim": "1", "volumes": [0.8660254037844386, 0.8660254037844386]}, "f": {"vertices": [[["0", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "1", "0"], ["1/2", "1/2", "1/2"], ["1", "0", "0"]], "dim": "3", "volumes": [0.08333333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 489}, "196": {"e": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["0", "0", "0"], ["1/4", "1/4", "-1/4"]], [["1/4", "1/4", "-1/4"], ["1/2", "0", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193, 0.4330127018922193, 0.4330127018922193]}, "f": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "-1/4"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.02083333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 490}, "197": {"c": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "d": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1", "0", "0"]], "dim": "3", "volumes": [0.04166666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f"], "hall_number": 491}, "198": {"a": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]], [["0", "1/2", "-1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386, 0.8660254037844386]}, "b": {"vertices": [["0", "0", "0"], ["0", "1/2", "-1/2"], ["0", "1/2", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.08333333333333334]}, "ordered_wyckoff_letters": ["a", "b"], "hall_number": 492}, "199": {"a": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "b": {"vertices": [[["1/4", "0", "0"], ["1/4", "1/2", "0"]], [["1/4", "1/2", "1/4"], ["1/2", "1/2", "1/4"]], [["1/2", "1/4", "0"], ["1/2", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5, 0.25, 0.25]}, "c": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.04166666666666668]}, "ordered_wyckoff_letters": ["a", "b", "c"], "hall_number": 493}, "200": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "j": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"], ["0", "1/2", "0"], ["1/2", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "k": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], [["1/2", "1/2", "0"], ["0", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "2", "plane_coefficients": [["-1/4", "0", "0", "-1/8"], ["0", "-1/4", "0", "-1/8"]], "volumes": [0.12499999999999994, 0.125]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.04166666666666668]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 494}, "201": {"e": {"vertices": [[["0", "0", "0"], ["-1/4", "-1/4", "-1/4"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "f": {"vertices": [[["-1/4", "-1/4", "-1/4"], ["1/4", "-1/4", "-1/4"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/4", "-1/4", "-1/4"], ["1/4", "1/4", "-1/4"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["-1/4", "-1/4", "-1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "-1/4", "-1/4"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["-1/4", "-1/4", "-1/4"], ["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"], ["3/4", "-1/4", "-1/4"]], "dim": "3", "volumes": [0.04166666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 496}, "202": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "g": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.12500000000000008]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.010416666666666668]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 497}, "203": {"e": {"vertices": [[["0", "0", "0"], ["-1/8", "-1/8", "-1/8"]], [["3/8", "-1/8", "-1/8"], ["1/8", "1/8", "1/8"]], [["1/4", "0", "-1/4"], ["3/8", "-1/8", "-1/8"]]], "dim": "1", "volumes": [0.21650635094610965, 0.4330127018922193, 0.21650635094610965]}, "f": {"vertices": [[["3/8", "-1/8", "-1/8"], ["-1/8", "-1/8", "-1/8"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["-1/8", "-1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["3/8", "-1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "0", "-1/4"]], "dim": "0", "volumes": [0.0]}, "g": {"vertices": [["-1/8", "-1/8", "-1/8"], ["1/8", "1/8", "-3/8"], ["1/8", "1/8", "1/8"], ["3/8", "-1/8", "-1/8"]], "dim": "3", "volumes": [0.010416666666666663]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g"], "hall_number": 499}, "204": {"d": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "e": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.4330127018922193]}, "g": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"], ["1/2", "1/2", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"], ["-1/4", "0", "0", "-1/8"]], "volumes": [0.125, 0.125]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.02083333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 500}, "205": {"c": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.04166666666666668]}, "ordered_wyckoff_letters": ["a", "b", "c", "d"], "hall_number": 501}, "206": {"c": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.4330127018922193]}, "d": {"vertices": [[["1/4", "0", "0"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.020833333333333332]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 502}, "207": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "h": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "j": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "k": {"vertices": [["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1", "0", "0"]], "dim": "3", "volumes": [0.04166666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"], "hall_number": 503}, "208": {"g": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["0", "0", "0"], ["1/4", "1/4", "-1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "h": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "j": {"vertices": [[["1/2", "1/2", "0"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "k": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/2", "0"]], [["1/4", "1/4", "1/4"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738, 0.3535533905932738]}, "l": {"vertices": [[["1/4", "1/2", "0"], ["1/4", "1/4", "-1/4"]], [["1/2", "1/4", "0"], ["1/4", "1/4", "-1/4"]]], "dim": "1", "volumes": [0.3535533905932738, 0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "-1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/2", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["1/4", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "m": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.041666666666666664]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"], "hall_number": 504}, "209": {"e": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "g": {"vertices": [[["0", "0", "0"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "h": {"vertices": [[["1/4", "1/4", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "i": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"]], "dim": "3", "volumes": [0.010416666666666663]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 505}, "210": {"e": {"vertices": [[["1/8", "1/8", "1/8"], ["0", "0", "0"]], [["3/8", "-1/8", "1/8"], ["1/2", "0", "0"]], [["0", "0", "0"], ["1/8", "-1/8", "1/8"]], [["1/2", "0", "0"], ["3/8", "1/8", "1/8"]]], "dim": "1", "volumes": [0.21650635094610965, 0.21650635094610965, 0.21650635094610965, 0.21650635094610965]}, "f": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/8", "1/8", "1/8"], ["3/8", "1/8", "-1/8"]], [["1/8", "1/8", "1/8"], ["3/8", "-1/8", "1/8"]]], "dim": "1", "volumes": [0.3535533905932738, 0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/8", "1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["3/8", "-1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["1/8", "-1/8", "1/8"], ["1/8", "1/8", "-1/8"], ["1/8", "1/8", "1/8"], ["3/8", "-1/8", "1/8"], ["3/8", "1/8", "-1/8"], ["3/8", "1/8", "1/8"], ["1/2", "0", "0"]], "dim": "3", "volumes": [0.01041666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 506}, "211": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.4330127018922193]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "1/2", "0"]], [["1/4", "1/4", "1/4"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738, 0.3535533905932738]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.020833333333333332]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 507}, "212": {"c": {"vertices": [[["1/8", "1/8", "1/8"], ["0", "0", "0"]], [["0", "1/2", "-1/2"], ["3/8", "1/8", "-1/8"]]], "dim": "1", "volumes": [0.21650635094610965, 0.649519052838329]}, "d": {"vertices": [[["1/8", "5/8", "-3/8"], ["1/8", "1/8", "1/8"]], [["3/8", "1/8", "-1/8"], ["3/8", "3/8", "1/8"]], [["1/8", "1/8", "1/8"], ["3/8", "1/8", "-1/8"]]], "dim": "1", "volumes": [0.7071067811865476, 0.3535533905932738, 0.3535533905932738]}, "a": {"vertices": [["1/8", "1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["3/8", "1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["0", "0", "0"], ["0", "1/2", "-1/2"], ["1/4", "1/4", "1/4"], ["1/4", "3/4", "-1/4"], ["3/8", "1/8", "-1/8"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.04166666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 508}, "213": {"c": {"vertices": [[["3/8", "3/8", "3/8"], ["0", "0", "0"]], [["1/2", "1/2", "0"], ["3/8", "5/8", "1/8"]]], "dim": "1", "volumes": [0.649519052838329, 0.21650635094610965]}, "d": {"vertices": [[["3/8", "3/8", "3/8"], ["3/8", "5/8", "1/8"]], [["3/8", "5/8", "1/8"], ["-1/8", "1/8", "1/8"]], [["1/8", "5/8", "3/8"], ["3/8", "3/8", "3/8"]]], "dim": "1", "volumes": [0.3535533905932738, 0.7071067811865476, 0.3535533905932738]}, "a": {"vertices": [["3/8", "3/8", "3/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["3/8", "5/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["-1/4", "1/4", "1/4"], ["0", "0", "0"], ["0", "1/2", "1/2"], ["1/4", "3/4", "1/4"], ["3/8", "3/8", "3/8"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.041666666666666664]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 509}, "214": {"e": {"vertices": [[["1/8", "1/8", "1/8"], ["-1/8", "-1/8", "-1/8"]]], "dim": "1", "volumes": [0.4330127018922193]}, "f": {"vertices": [[["-3/8", "0", "1/4"], ["1/8", "0", "1/4"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/8", "-1/8", "1/8"], ["1/8", "0", "1/4"]], [["-1/4", "-1/8", "0"], ["-3/8", "-1/8", "1/8"]], [["-1/8", "1/8", "1/8"], ["-3/8", "-1/8", "1/8"]]], "dim": "1", "volumes": [0.1767766952966369, 0.1767766952966369, 0.3535533905932738]}, "h": {"vertices": [[["1/8", "0", "1/4"], ["1/8", "1/8", "1/8"]], [["1/8", "1/8", "1/8"], ["-1/8", "1/8", "3/8"]], [["-1/8", "-1/8", "1/8"], ["-1/4", "-1/8", "0"]]], "dim": "1", "volumes": [0.1767766952966369, 0.3535533905932738, 0.1767766952966369]}, "a": {"vertices": [["1/8", "1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["-3/8", "-1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/8", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["-1/4", "-1/8", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["-3/8", "-1/8", "1/8"], ["-3/8", "1/8", "3/8"], ["-1/8", "-1/8", "-1/8"], ["-1/8", "1/8", "1/8"], ["1/8", "-1/8", "1/8"], ["1/8", "1/8", "1/8"], ["1/8", "1/8", "3/8"]], "dim": "3", "volumes": [0.02083333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 510}, "215": {"e": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]], [["1", "0", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.8660254037844386, 0.8660254037844386]}, "f": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["0", "0", "0"], ["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]], [["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1", "0", "0"]], [["1", "0", "0"], ["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "-1/4", "0", "0"], ["-1/4", "-1/4", "0", "-1/4"], ["0", "1/2", "-1/2", "0"]], "volumes": [0.176776695296637, 0.17677669529663684, 0.35355339059327373]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1", "0", "0"]], "dim": "3", "volumes": [0.04166666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 511}, "216": {"e": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["0", "0", "0"], ["1/4", "1/4", "-1/4"]], [["1/4", "1/4", "-1/4"], ["1/2", "0", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193, 0.4330127018922193, 0.4330127018922193]}, "f": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["1/4", "1/4", "-1/4"], ["0", "0", "0"], ["1/4", "1/4", "1/4"]], [["0", "0", "0"], ["1/2", "0", "0"], ["1/4", "1/4", "1/4"]], [["1/4", "1/4", "-1/4"], ["1/2", "0", "0"], ["0", "0", "0"]], [["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/4", "1/4", "-1/4"]]], "dim": "2", "plane_coefficients": [["1/8", "-1/8", "0", "0"], ["0", "1/8", "-1/8", "0"], ["0", "1/8", "1/8", "0"], ["-1/8", "-1/8", "0", "-1/16"]], "volumes": [0.08838834764831845, 0.08838834764831845, 0.08838834764831845, 0.08838834764831845]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "-1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"]], "dim": "3", "volumes": [0.010416666666666663]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 512}, "217": {"c": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/4", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"], ["1/2", "1/2", "1/2"]], [["1/2", "1/2", "1/2"], ["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "-1/4", "0", "0"], ["0", "1/4", "-1/4", "0"]], "volumes": [0.17677669529663684, 0.176776695296637]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.02083333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 513}, "218": {"e": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "f": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["0", "1/2", "0"], ["1/4", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/4", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.04166666666666668]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 514}, "219": {"e": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["0", "0", "0"], ["1/4", "1/4", "-1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "f": {"vertices": [[["1/4", "0", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "0", "0"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "-1/4"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"]], "dim": "3", "volumes": [0.010416666666666663]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 515}, "220": {"c": {"vertices": [[["1/2", "1/2", "1/2"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193]}, "d": {"vertices": [[["1/4", "3/8", "0"], ["1/4", "1/2", "0"]], [["1/4", "1/2", "1/4"], ["1/2", "1/2", "1/4"]], [["1/2", "1/4", "1/8"], ["1/2", "1/4", "1/4"]]], "dim": "1", "volumes": [0.125, 0.25, 0.125]}, "a": {"vertices": [["1/4", "3/8", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/4", "1/8"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"], ["1/4", "1/2", "0"], ["1/4", "1/2", "1/4"], ["1/2", "1/4", "0"], ["1/2", "1/4", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.020833333333333343]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e"], "hall_number": 516}, "221": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "1/2"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "1/2", "1/2"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.8660254037844386]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "i": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "j": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/2", "1/2"]]], "dim": "1", "volumes": [0.7071067811865476]}, "k": {"vertices": [[["1/2", "0", "0"], ["0", "0", "0"], ["1/2", "1/2", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.125]}, "l": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["-1/4", "0", "0", "-1/8"]], "volumes": [0.125]}, "m": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"], ["1/2", "1/2", "1/2"]], [["1/2", "1/2", "1/2"], ["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/4", "-1/4", "0", "0"], ["0", "1/4", "-1/4", "0"]], "volumes": [0.17677669529663684, 0.176776695296637]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "n": {"vertices": [["0", "0", "0"], ["1/2", "0", "0"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"]], "dim": "3", "volumes": [0.02083333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"], "hall_number": 517}, "222": {"e": {"vertices": [[["1/4", "1/4", "1/4"], ["3/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/2", "1/2", "1/2"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193]}, "g": {"vertices": [[["3/4", "1/2", "1/4"], ["3/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["3/4", "1/4", "1/4"], ["3/4", "3/4", "3/4"]]], "dim": "1", "volumes": [0.7071067811865476]}, "a": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["3/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["3/4", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["1/4", "1/4", "1/4"], ["3/4", "1/4", "1/4"], ["3/4", "3/4", "1/4"], ["3/4", "3/4", "3/4"]], "dim": "3", "volumes": [0.02083333333333334]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 519}, "223": {"f": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/4", "1/2", "0"], ["0", "1/2", "0"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.4330127018922193]}, "j": {"vertices": [[["1/4", "1/2", "0"], ["1/4", "1/4", "1/4"]], [["1/4", "1/4", "1/4"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738, 0.3535533905932738]}, "k": {"vertices": [[["0", "1/2", "0"], ["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.25000000000000006]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "e": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["0", "1/2", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.020833333333333332]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 520}, "224": {"e": {"vertices": [[["1/2", "1/2", "1/2"], ["1/4", "1/4", "1/4"]], [["1/4", "1/4", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "g": {"vertices": [[["1/4", "1/4", "1/4"], ["3/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["3/4", "1/2", "1/4"], ["3/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "i": {"vertices": [[["3/4", "1/2", "1/4"], ["1/2", "1/2", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "j": {"vertices": [[["1/2", "1/2", "1/2"], ["3/4", "1/2", "1/4"]]], "dim": "1", "volumes": [0.3535533905932738]}, "k": {"vertices": [[["3/4", "3/4", "1/4"], ["1/2", "1/2", "0"], ["1/4", "1/4", "1/4"], ["1/2", "1/2", "1/2"]], [["1/4", "1/4", "1/4"], ["3/4", "1/4", "1/4"], ["1/2", "1/2", "1/2"]], [["1/2", "1/2", "0"], ["3/4", "1/4", "1/4"], ["1/4", "1/4", "1/4"]]], "dim": "2", "plane_coefficients": [["1/8", "-1/8", "0", "0"], ["0", "1/8", "-1/8", "0"], ["0", "1/8", "1/8", "1/16"]], "volumes": [0.1767766952966369, 0.08838834764831845, 0.08838834764831845]}, "a": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "1/2", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/2", "1/2", "1/2"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["3/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "f": {"vertices": [["3/4", "1/2", "1/4"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["1/4", "1/4", "1/4"], ["1/2", "1/2", "0"], ["1/2", "1/2", "1/2"], ["3/4", "1/4", "1/4"], ["3/4", "3/4", "1/4"]], "dim": "3", "volumes": [0.02083333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 522}, "225": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.4330127018922193, 0.4330127018922193]}, "g": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/4", "1/4", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "i": {"vertices": [[["1/2", "0", "0"], ["1/4", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "j": {"vertices": [[["1/4", "1/4", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/8", "0"]], "volumes": [0.06249999999999999]}, "k": {"vertices": [[["0", "0", "0"], ["1/4", "1/4", "1/4"], ["1/4", "1/4", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"], ["0", "0", "0"]], [["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/16", "-1/16", "0", "0"], ["0", "1/8", "-1/8", "0"], ["-1/16", "-1/16", "0", "-1/32"]], "volumes": [0.04419417382415925, 0.08838834764831843, 0.04419417382415921]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"]], "dim": "3", "volumes": [0.005208333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 523}, "226": {"e": {"vertices": [[["0", "0", "0"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.25]}, "f": {"vertices": [[["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.4330127018922193]}, "h": {"vertices": [[["1/4", "1/4", "1/4"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "i": {"vertices": [[["1/4", "1/4", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/8", "0"]], "volumes": [0.06249999999999999]}, "a": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "j": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"]], "dim": "3", "volumes": [0.005208333333333333]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"], "hall_number": 524}, "227": {"e": {"vertices": [[["0", "0", "0"], ["-1/8", "-1/8", "-1/8"]], [["-1/8", "-1/8", "-1/8"], ["0", "0", "-1/4"]], [["1/4", "0", "-1/4"], ["3/8", "-1/8", "-1/8"]], [["3/8", "-1/8", "-1/8"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.21650635094610965, 0.21650635094610965, 0.21650635094610965, 0.21650635094610965]}, "f": {"vertices": [[["-1/8", "-1/8", "-1/8"], ["3/8", "-1/8", "-1/8"]]], "dim": "1", "volumes": [0.5]}, "h": {"vertices": [[["0", "0", "0"], ["1/4", "0", "-1/4"]]], "dim": "1", "volumes": [0.3535533905932738]}, "g": {"vertices": [[["0", "0", "-1/4"], ["-1/8", "-1/8", "-1/8"], ["0", "0", "0"]], [["1/4", "0", "0"], ["3/8", "-1/8", "-1/8"], ["1/4", "0", "-1/4"]], [["0", "0", "0"], ["-1/8", "-1/8", "-1/8"], ["3/8", "-1/8", "-1/8"], ["1/4", "0", "0"]], [["1/4", "0", "-1/4"], ["3/8", "-1/8", "-1/8"], ["-1/8", "-1/8", "-1/8"], ["0", "0", "-1/4"]]], "dim": "2", "plane_coefficients": [["1/32", "-1/32", "0", "0"], ["-1/32", "-1/32", "0", "-1/128"], ["0", "1/16", "-1/16", "0"], ["0", "1/16", "1/16", "-1/64"]], "volumes": [0.02209708691207961, 0.02209708691207961, 0.06629126073623878, 0.06629126073623878]}, "a": {"vertices": [["-1/8", "-1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["3/8", "-1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/4", "0", "-1/4"]], "dim": "0", "volumes": [0.0]}, "i": {"vertices": [["-1/8", "-1/8", "-1/8"], ["0", "0", "-1/4"], ["0", "0", "0"], ["1/4", "0", "-1/4"], ["1/4", "0", "0"], ["3/8", "-1/8", "-1/8"]], "dim": "3", "volumes": [0.005208333333333335]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i"], "hall_number": 526}, "228": {"e": {"vertices": [[["0", "0", "0"], ["-1/8", "-1/8", "-1/8"]], [["3/8", "-1/8", "-1/8"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.21650635094610965, 0.21650635094610965]}, "f": {"vertices": [[["-1/8", "-1/8", "-1/8"], ["1/8", "-1/8", "-1/8"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["0", "0", "-1/4"], ["1/4", "0", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "a": {"vertices": [["-1/8", "-1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/4", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/8", "-1/8", "-1/8"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["-1/8", "-1/8", "-1/8"], ["0", "0", "-1/4"], ["0", "0", "0"], ["1/4", "0", "-1/4"], ["1/4", "0", "0"], ["3/8", "-1/8", "-1/8"]], "dim": "3", "volumes": [0.005208333333333335]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 528}, "229": {"e": {"vertices": [[["0", "0", "0"], ["1/2", "0", "0"]]], "dim": "1", "volumes": [0.5]}, "f": {"vertices": [[["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.4330127018922193]}, "g": {"vertices": [[["1/2", "0", "0"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.25]}, "h": {"vertices": [[["1/2", "1/2", "0"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.7071067811865476]}, "i": {"vertices": [[["1/4", "1/4", "1/4"], ["1/2", "1/4", "0"]]], "dim": "1", "volumes": [0.3535533905932738]}, "j": {"vertices": [[["1/2", "1/2", "0"], ["1/2", "0", "0"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["0", "0", "1/4", "0"]], "volumes": [0.12500000000000008]}, "k": {"vertices": [[["0", "0", "0"], ["1/4", "1/4", "1/4"], ["1/2", "1/2", "0"]], [["1/2", "0", "0"], ["1/4", "1/4", "1/4"], ["0", "0", "0"]]], "dim": "2", "plane_coefficients": [["1/8", "-1/8", "0", "0"], ["0", "1/8", "-1/8", "0"]], "volumes": [0.08838834764831845, 0.08838834764831843]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/2", "0", "0"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/4", "1/4", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["1/2", "1/4", "0"]], "dim": "0", "volumes": [0.0]}, "l": {"vertices": [["0", "0", "0"], ["1/4", "1/4", "1/4"], ["1/2", "0", "0"], ["1/2", "1/2", "0"]], "dim": "3", "volumes": [0.010416666666666668]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], "hall_number": 529}, "230": {"e": {"vertices": [[["1/8", "1/8", "1/8"], ["0", "0", "0"]]], "dim": "1", "volumes": [0.21650635094610965]}, "f": {"vertices": [[["1/8", "0", "1/4"], ["-1/8", "0", "1/4"]]], "dim": "1", "volumes": [0.25]}, "g": {"vertices": [[["1/8", "0", "1/4"], ["1/8", "1/8", "1/8"]], [["0", "1/8", "1/4"], ["1/8", "1/8", "1/8"]], [["-1/8", "-1/8", "1/8"], ["0", "-1/8", "1/4"]], [["1/8", "-1/8", "1/8"], ["1/8", "0", "1/4"]]], "dim": "1", "volumes": [0.1767766952966369, 0.1767766952966369, 0.1767766952966369, 0.1767766952966369]}, "a": {"vertices": [["0", "0", "0"]], "dim": "0", "volumes": [0.0]}, "b": {"vertices": [["1/8", "1/8", "1/8"]], "dim": "0", "volumes": [0.0]}, "c": {"vertices": [["1/8", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "d": {"vertices": [["-1/8", "0", "1/4"]], "dim": "0", "volumes": [0.0]}, "h": {"vertices": [["-1/8", "-1/8", "1/8"], ["-1/8", "-1/8", "1/4"], ["-1/8", "1/8", "1/8"], ["-1/8", "1/8", "1/4"], ["0", "0", "0"], ["1/8", "-1/8", "1/8"], ["1/8", "-1/8", "1/4"], ["1/8", "1/8", "1/8"], ["1/8", "1/8", "1/4"]], "dim": "3", "volumes": [0.01041666666666667]}, "ordered_wyckoff_letters": ["a", "b", "c", "d", "e", "f", "g", "h"], "hall_number": 530}} \ No newline at end of file diff --git a/ppmat/models/sgequidiff/weight_utils.py b/ppmat/models/sgequidiff/weight_utils.py new file mode 100644 index 00000000..938cb853 --- /dev/null +++ b/ppmat/models/sgequidiff/weight_utils.py @@ -0,0 +1,164 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""SGEquiDiff weight download and loading utilities.""" + +from __future__ import annotations + +import os +import os.path as osp +from typing import Dict, Optional + +import paddle +import requests + +from ppmat.models.sgequidiff.constants import PRETRAINED_WEIGHT_URLS +from ppmat.utils import logger + +SGEQUIDIFF_WEIGHTS_HOME = osp.join( + osp.expanduser("~/.paddlemat/weights"), "sgequidiff" +) +DOWNLOAD_RETRY_LIMIT = 3 + + +def download_weight_file(url: str, dataset_name: str, sub_module: str) -> str: + """Download a single weight file to local cache.""" + cache_dir = osp.join(SGEQUIDIFF_WEIGHTS_HOME, dataset_name) + os.makedirs(cache_dir, exist_ok=True) + + fname = url.rstrip("/").split("/")[-1] + local_path = osp.join(cache_dir, fname) + + if osp.exists(local_path): + logger.info(f"Cached: {local_path}") + return local_path + + retry_cnt = 0 + while retry_cnt < DOWNLOAD_RETRY_LIMIT: + try: + logger.info(f"Downloading {dataset_name}/{sub_module} from {url}") + resp = requests.get(url, stream=True, timeout=300) + resp.raise_for_status() + + total_size = int(resp.headers.get("content-length", 0)) + downloaded = 0 + with open(local_path, "wb") as f: + for chunk in resp.iter_content(chunk_size=8192): + f.write(chunk) + downloaded += len(chunk) + logger.info(f"Done: {local_path}") + return local_path + except requests.RequestException as e: + retry_cnt += 1 + if retry_cnt >= DOWNLOAD_RETRY_LIMIT: + raise RuntimeError( + f"Download failed (retried {DOWNLOAD_RETRY_LIMIT} times): {url}\nError: {e}" + ) + logger.warning(f"Retry {retry_cnt}/{DOWNLOAD_RETRY_LIMIT} ...") + + raise RuntimeError(f"Download failed: {url}") + + +# 4 sub-modules (diffusion/lattice/space_group/wyckoff), not single-file like framework load_pretrain +def download_all_weights( + dataset_name: str = "mp_20", +) -> Dict[str, str]: + """Download all sub-module weights for a given dataset.""" + if dataset_name not in PRETRAINED_WEIGHT_URLS: + raise ValueError( + f"Unknown dataset: {dataset_name}, supported: {list(PRETRAINED_WEIGHT_URLS.keys())}" + ) + + urls = PRETRAINED_WEIGHT_URLS[dataset_name] + local_paths = {} + for sub_module, url in urls.items(): + local_paths[sub_module] = download_weight_file(url, dataset_name, sub_module) + + return local_paths + + +def load_pretrained_weights( + model: paddle.nn.Layer, + dataset_name: str = "mp_20", + weight_dir: Optional[str] = None, + verbose: bool = True, +) -> int: + """Load pretrained weights into a model.""" + if weight_dir is not None: + if not osp.isdir(weight_dir): + raise FileNotFoundError(f"Weight directory does not exist: {weight_dir}") + local_paths = {} + urls = PRETRAINED_WEIGHT_URLS.get(dataset_name, {}) + for sub_module_key, url in urls.items(): + fname = url.rstrip("/").split("/")[-1] + candidate = osp.join(weight_dir, fname) + if osp.exists(candidate): + local_paths[sub_module_key] = candidate + if len(local_paths) == 0: + for f in os.listdir(weight_dir): + if f.endswith(".pdparams") and dataset_name in f: + for key in ["diffusion", "lattice", "space_group", "wyckoff"]: + if key in f: + local_paths[key] = osp.join(weight_dir, f) + else: + local_paths = download_all_weights(dataset_name) + + if verbose: + logger.info(f"Dataset: {dataset_name}, found {len(local_paths)} weight files") + + submodule_attr_map = { + "diffusion": "atom_coord_diffusion_model", + "lattice": "lattice_sampler", + "space_group": "space_group_sampler", + "wyckoff": "wyckoff_and_element_sampler", + } + + loaded_count = 0 + search_roots = [model] + if hasattr(model, "diffusion_model"): + search_roots.append(model.diffusion_model) + + for sub_module_key, local_path in local_paths.items(): + attr_name = submodule_attr_map.get(sub_module_key) + if attr_name is None: + if verbose: + logger.warning(f"Unknown sub-module: {sub_module_key}") + continue + + submodule = None + for root in search_roots: + submodule = getattr(root, attr_name, None) + if submodule is not None: + break + + if submodule is None: + if verbose: + logger.warning(f"Attribute {attr_name} not found in model") + continue + + try: + state_dict = paddle.load(local_path) + submodule.set_state_dict(state_dict) + loaded_count += 1 + if verbose: + n_params = len(state_dict) + logger.info(f"Loaded {sub_module_key:12s} -> {attr_name:30s} ({n_params} params)") + except Exception as e: + if verbose: + logger.warning(f"Failed {sub_module_key}: {e}") + + if verbose: + logger.info(f"Successfully loaded {loaded_count}/{len(local_paths)} weight files") + + return loaded_count diff --git a/ppmat/models/sgequidiff/wrappers.py b/ppmat/models/sgequidiff/wrappers.py new file mode 100644 index 00000000..ec8387fd --- /dev/null +++ b/ppmat/models/sgequidiff/wrappers.py @@ -0,0 +1,412 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Wrappers and samplers for SGEquiDiff.""" + +from __future__ import annotations + +import dataclasses +from typing import Any, Dict, List, Optional + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F +from paddle.distribution import Categorical + +from ppmat.models.sgequidiff.constants import chemical_symbols, lattice_parameter_ranges +from ppmat.datasets.asu_crystal import ASUCrystal +from ppmat.models.sgequidiff.data_utils import lattice_params_to_matrix_paddle +from ppmat.models.sgequidiff.diffusion_model import ( + EquivariantDiffusionModel, + EquivariantDiffusionModelConfig, +) +from ppmat.models.sgequidiff.global_vars import set_global_embedding_tools +from ppmat.models.sgequidiff.lattice_sampler import ( + LatticeSamplerConfig, + TelescopingDiscreteLatticeSampler, +) +from ppmat.models.sgequidiff.non_equivariant_drift_modules import ( + CSPNetConfig, + GNNConfig, +) +from ppmat.models.sgequidiff.weight_utils import load_pretrained_weights +from ppmat.models.sgequidiff.wyckoff_transformer import ( + WyckoffElementTransformer, + WyckoffElementTransformerConfig, +) +from ppmat.utils import logger + + +class SpaceGroupSampler(nn.Layer): + def __init__(self): + super().__init__() + self.marginal_space_group_logits = paddle.create_parameter( + shape=[230], + dtype="float32", + default_initializer=nn.initializer.Constant(1.0), + ) + + def sample_and_log_prob(self, batch_size: int = 1, temperature: float = 1.0): + log_probs = F.log_softmax(self.marginal_space_group_logits, axis=-1) + log_probs = log_probs.unsqueeze(0).expand([batch_size, -1]) + + dist = Categorical(logits=log_probs / temperature) + sample = dist.sample([1]).squeeze(0) + + sample_log_probs = paddle.take_along_axis( + log_probs, sample.unsqueeze(-1), axis=-1 + ).squeeze(-1) + return sample, sample_log_probs + + def log_prob(self, space_group_indices): + normed_logits = F.log_softmax(self.marginal_space_group_logits, axis=-1) + return normed_logits[space_group_indices] + + +@dataclasses.dataclass +class CrystalSamplerConfig: + diffusion_model_config: EquivariantDiffusionModelConfig + lattice_model_config: LatticeSamplerConfig + transformer_config: WyckoffElementTransformerConfig + lattice_length_noise: Optional[float] = 0.0 + lattice_angle_noise: Optional[float] = 0.0 + space_group_grad_weight: Optional[float] = 1.0 + lattice_grad_weight: Optional[float] = 1.0 + wyckoff_element_grad_weight: Optional[float] = 1.0 + frac_coord_grad_weight: Optional[float] = 1.0 + + +class CrystalSampler(nn.Layer): + """Full crystal sampler combining all submodules.""" + + def __init__(self, config: CrystalSamplerConfig): + super().__init__() + self.config = config + self.atom_coord_diffusion_model = EquivariantDiffusionModel( + config.diffusion_model_config, + ) + self.space_group_sampler = SpaceGroupSampler() + self.lattice_sampler = TelescopingDiscreteLatticeSampler( + config.lattice_model_config, + ) + self.wyckoff_and_element_sampler = WyckoffElementTransformer( + config.transformer_config, + ) + + @paddle.no_grad() + def sample_crystal( + self, + batch_size: int, + diffusion_snr: float = 0.4, + temperature: float = 1.0, + space_group_numbers=None, + lattice_parameters=None, + wyckoff_element_data=None, + ) -> List[ASUCrystal]: + """Full crystal sampling pipeline.""" + + if space_group_numbers is None: + space_group_indices, space_group_log_prob = ( + self.sample_and_log_prob_space_group(batch_size, temperature) + ) + else: + assert space_group_numbers.shape[0] == batch_size + space_group_indices = space_group_numbers - 1 + space_group_log_prob = paddle.zeros_like(space_group_indices) + + if lattice_parameters is None: + lattice_lengths, lattice_angles, lattice_log_prob = ( + self.sample_and_log_prob_lattice_parameters(space_group_indices) + ) + else: + lattice_lengths = lattice_parameters[:, :3] + lattice_angles = lattice_parameters[:, 3:] + lattice_log_prob = paddle.zeros([lattice_lengths.shape[0]]) + + lattice_matrices = lattice_params_to_matrix_paddle(lattice_lengths, lattice_angles) + + if wyckoff_element_data is None: + ( + element_indices, + wyckoff_indices, + n_asu_atoms_per_xtal, + elements_log_prob, + wyckoffs_log_prob, + termination_log_prob, + ) = self.sample_and_log_prob_elements_and_wyckoffs( + lattice_lengths, lattice_angles, space_group_indices, temperature + ) + else: + element_indices = wyckoff_element_data["element_indices"] + wyckoff_indices = wyckoff_element_data["wyckoff_indices"] + n_asu_atoms_per_xtal = wyckoff_element_data["n_asu_atoms_per_xtal"] + + frac_coords = self.sample_frac_coords( + wyckoff_indices, + element_indices, + space_group_indices, + n_asu_atoms_per_xtal, + lattice_matrices, + lattice_lengths, + lattice_angles, + snr=diffusion_snr, + max_step_size=1e6, + ) + + asu_crystals = [] + atom_offsets = paddle.concat( + [ + paddle.cumsum(n_asu_atoms_per_xtal, axis=0) - n_asu_atoms_per_xtal, + n_asu_atoms_per_xtal.sum().unsqueeze(0), + ], + axis=0, + ) + for i in range(n_asu_atoms_per_xtal.shape[0]): + asu_crystals.append( + ASUCrystal( + space_group_number=1 + space_group_indices[i], + conventional_lattice_lengths=lattice_lengths[i], + conventional_lattice_angles=lattice_angles[i], + element_indices=element_indices[atom_offsets[i]:atom_offsets[i + 1]], + wyckoff_indices=wyckoff_indices[atom_offsets[i]:atom_offsets[i + 1]], + conventional_frac_coords=frac_coords[atom_offsets[i]:atom_offsets[i + 1]], + ) + ) + return asu_crystals + + def sample_and_log_prob_space_group(self, batch_size, temperature=1.0): + return self.space_group_sampler.sample_and_log_prob(batch_size, temperature) + + def sample_and_log_prob_lattice_parameters(self, space_group_indices): + lengths, angles, log_probs, regularizer = self.lattice_sampler(space_group_indices) + return lengths, angles, log_probs + + def sample_and_log_prob_elements_and_wyckoffs( + self, lattice_lengths, lattice_angles, space_group_indices, temperature=1.0 + ): + return self.wyckoff_and_element_sampler.sample_and_log_prob( + lattice_lengths, lattice_angles, space_group_indices, temperature + ) + + def sample_frac_coords( + self, + wyckoff_indices, + element_indices, + space_group_indices, + n_asu_atoms_per_xtal, + lattice_matrices, + lattice_lengths, + lattice_angles, + snr=0.4, + max_step_size=1e6, + ): + trajectory = self.atom_coord_diffusion_model.sample( + wyckoff_indices, + element_indices, + space_group_indices, + n_asu_atoms_per_xtal, + lattice_matrices, + lattice_lengths, + lattice_angles, + snr, + max_step_size, + ) + return trajectory[0] + + +class SGEQUIDiffSampler(nn.Layer): + """Wrapper that adapts CrystalSampler to the PaddleMaterials sampling interface. + + This wrapper provides a ``sample(batch_data)`` method compatible with + ``structure_generation/sample.py``, translating between the standard + ``batch_data`` dict format and CrystalSampler's native API. + + Args: + dataset_name: Dataset name, e.g. ``"mp_20"`` or ``"mpts_52"``. + diffusion_snr: SNR for the diffusion sampling step. + temperature: Sampling temperature. + weight_dir: Optional local directory containing the 4 weight files. + If ``None``, weights are auto-downloaded from BOS. + """ + + def __init__( + self, + dataset_name: str = "mp_20", + diffusion_snr: float = 0.4, + temperature: float = 1.0, + weight_dir: Optional[str] = None, + num_timesteps: int = 1000, + noise_scheduler_num_monte_carlo_samples: int = 2500, + num_wn_lattice_translations: int = 3, + **kwargs, + ): + super().__init__() + self.dataset_name = dataset_name + self.diffusion_snr = diffusion_snr + self.temperature = temperature + + lr = lattice_parameter_ranges.get( + dataset_name, lattice_parameter_ranges["mp_20"] + ) + + gnn_cfg = GNNConfig( + num_plane_wave_freqs=96, + num_cartesian_distance_gaussians=96, + edge_hidden_dim=128, + atom_hidden_dim=256, + use_vpa=True, + use_graph_norm=True, + num_msg_pass_steps=5, + cutoff=10.0, + use_frac_coords_in_node_emb=True, + dataset_name=dataset_name, + ) + diff_cfg = EquivariantDiffusionModelConfig( + model_type="gnn", + num_timesteps=num_timesteps, + noise_scheduler_num_monte_carlo_samples=noise_scheduler_num_monte_carlo_samples, + num_wn_lattice_translations=num_wn_lattice_translations, + sigma_min=0.002, + sigma_max=0.5, + time_emb_dim=128, + num_plane_wave_freqs=96, + gnn_config=gnn_cfg, + ) + lattice_cfg = LatticeSamplerConfig( + input_dimension=128, + hidden_dimension=256, + min_lattice_length=lr["min_lattice_length"], + max_lattice_length=lr["max_lattice_length"], + min_lattice_angle=lr["min_lattice_angle"], + max_lattice_angle=lr["max_lattice_angle"], + lattice_param_dim=32, + n_emb_layers=2, + lattice_length_bin_embedder_fourier_scale=2.0, + lattice_angle_bin_embedder_fourier_scale=1.0, + lattice_length_embedder_fourier_scale=5.0, + lattice_angle_embedder_fourier_scale=1.0, + ) + we_cfg = WyckoffElementTransformerConfig( + hidden_dim=256, + dataset_name=dataset_name, + num_heads=2, + num_hidden_layers=4, + dropout_rate=0.1, + ) + sampler_cfg = CrystalSamplerConfig( + diffusion_model_config=diff_cfg, + lattice_model_config=lattice_cfg, + transformer_config=we_cfg, + ) + + # Initialize global embedding tools BEFORE building CrystalSampler, + # because CrystalSampler.__init__ -> GNN.__init__ requires embedding_tools + set_global_embedding_tools( + element_embedding_json_path="cgcnn_atom_init.json", + space_group_embedding_json_path="init_tokens/space_group_features/space_group_embeddings_62dim.json", + wyckoff_embedding_json_path="init_tokens/wyckoff_features/wyckoff_embeddings_231dim.json", + chemistry_embedding_type="identity", + ) + + self.crystal_sampler = CrystalSampler(sampler_cfg) + + # Load pretrained weights + load_pretrained_weights( + self.crystal_sampler, + dataset_name=dataset_name, + weight_dir=weight_dir, + verbose=True, + ) + + logger.info( + f"[SGEQUIDiffSampler] Initialized: dataset={dataset_name}, " + f"snr={diffusion_snr}, temperature={temperature}" + ) + + @paddle.no_grad() + def sample(self, batch_data: Dict, **kwargs) -> Dict: + """Sample crystals compatible with ``structure_generation/sample.py``. + + Args: + batch_data: Dict with key ``"structure_array"`` containing at + least ``"num_atoms"`` (a 1-D int tensor of batch sizes). + SGEQuiDiff is an **unconditional** generator, so the actual + atom counts in *batch_data* are ignored -- they only + determine the *batch size*. + + Returns: + Dict with key ``"result"`` mapping to a list of dicts, each + containing: + - ``"num_atoms"``: int + - ``"atom_types"``: list[int] (1-indexed atomic numbers) + - ``"frac_coords"``: list[list[float]] + - ``"lengths"``: list[float] (a, b, c in Angstrom) + - ``"angles"``: list[float] (alpha, beta, gamma in degrees) + """ + structure_array = batch_data["structure_array"] + num_atoms_tensor = structure_array["num_atoms"] + batch_size = num_atoms_tensor.shape[0] + + # SGEQuiDiff is unconditional: generate from noise + crystals = self.crystal_sampler.sample_crystal( + batch_size=batch_size, + diffusion_snr=self.diffusion_snr, + temperature=self.temperature, + ) + + # Convert ASUCrystal objects to the standard result format + # expected by BuildStructure(format="array") + result = [] + for crystal in crystals: + # Filter out placeholder elements (X, X0+, empty) + valid_indices = [] + for idx in crystal.element_indices.tolist(): + if 0 <= idx < len(chemical_symbols): + elem = chemical_symbols[idx] + if elem not in ("X", "X0+", ""): + valid_indices.append(idx) + + if len(valid_indices) == 0: + logger.warning("Generated crystal has no valid elements, skipping.") + continue + + # Extract valid atoms + frac_coords = crystal.conventional_frac_coords + valid_mask = [] + for i, idx in enumerate(crystal.element_indices.tolist()): + if 0 <= idx < len(chemical_symbols): + elem = chemical_symbols[idx] + if elem not in ("X", "X0+", ""): + valid_mask.append(i) + + valid_frac_coords = frac_coords[valid_mask].numpy().tolist() + valid_atom_types = [ + crystal.element_indices[i].item() + 1 # 1-indexed atomic number + for i in valid_mask + ] + + lengths = crystal.conventional_lattice_lengths.numpy().tolist() + angles = crystal.conventional_lattice_angles.numpy().tolist() + + result.append( + { + "num_atoms": len(valid_atom_types), + "atom_types": valid_atom_types, + "frac_coords": valid_frac_coords, + "lengths": lengths, + "angles": angles, + } + ) + + return {"result": result} \ No newline at end of file diff --git a/ppmat/models/sgequidiff/wyckoff_shape_decomp_builder.py b/ppmat/models/sgequidiff/wyckoff_shape_decomp_builder.py new file mode 100644 index 00000000..e0a81064 --- /dev/null +++ b/ppmat/models/sgequidiff/wyckoff_shape_decomp_builder.py @@ -0,0 +1,148 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Wyckoff shape decomposition dict builder using scipy instead of meshpy.""" +import json +import os +import pickle +from ppmat.utils import logger + +import numpy as np +from scipy.spatial import ConvexHull + +def _to_array(region) -> np.ndarray: + """Convert vertex list to numpy array, supporting fraction strings like "1/2".""" + if isinstance(region, np.ndarray): + return region.astype(np.float64) + result = [] + for pt in region: + if isinstance(pt, (list, tuple)): + coords = [] + for c in pt: + if isinstance(c, str): + # support fraction strings like "1/2" + coords.append(float(eval(c))) + else: + coords.append(float(c)) + result.append(coords) + else: + result.append([float(pt)]) + return np.array(result, dtype=np.float64) + + +def _fan_triangulate_convex_polygon_3d(vertices_3d: np.ndarray): + """Fan triangulation of convex polygon in 3D (from centroid).""" + n = len(vertices_3d) + if n < 3: + return np.zeros((0, 3, 3), dtype=np.float64), np.zeros(0, dtype=np.float64) + + centroid = vertices_3d.mean(axis=0) + triangles = [] + areas = [] + for i in range(n): + v0 = centroid + v1 = vertices_3d[i] + v2 = vertices_3d[(i + 1) % n] + tri = np.stack([v0, v1, v2], axis=0) # (3, 3) + # triangle area = 0.5 * |cross(v1-v0, v2-v0)| + area = 0.5 * np.linalg.norm(np.cross(v1 - v0, v2 - v0)) + triangles.append(tri) + areas.append(area) + return np.array(triangles, dtype=np.float64), np.array(areas, dtype=np.float64) + +def _compute_3d_convex_hull_volume(vertices: np.ndarray) -> float: + """Compute volume of a 3D convex polytope.""" + if len(vertices) < 4: + return 0.0 + try: + hull = ConvexHull(vertices) + return float(hull.volume) + except Exception: + # degenerate case (all points coplanar, etc.) + return 0.0 + +def build_wyckoff_shape_decomposition_dict( + output_path: str, + asu_dict_path: str, +) -> None: + """Build Wyckoff shape decomposition dict and persist to pickle.""" + if os.path.exists(output_path): + return + + os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True) + + logger.info(f"[wyckoff_shape_decomp_builder] building {output_path} ...") + + with open(asu_dict_path, "r") as f: + asu_dict = json.load(f) + + shape_decomposition_dict = {} + + for sg, sg_dict in asu_dict.items(): + sg_shape_info = {} + + for wyckoff_letter in sg_dict["ordered_wyckoff_letters"]: + geometry = sg_dict[wyckoff_letter] + site_dim = int(geometry["dim"]) + + if site_dim == 0: + wyckoff_shapes_info = {"dim": 0, "volumes": None} + + elif site_dim == 1: + wyckoff_shapes_info = {"dim": 1, "volumes": []} + for interval in geometry["vertices"]: + arr = _to_array(interval) # (2, 3) + if arr.shape[0] >= 2: + diff = arr[1] - arr[0] # (3,) + length = float(np.linalg.norm(diff)) + else: + length = 0.0 + wyckoff_shapes_info["volumes"].append(length) + + elif site_dim == 2: + wyckoff_shapes_info = { + "dim": 2, + "volumes": [], + "facet_triangles": [], + "facet_triangle_areas": [], + "max_triangles_per_facet": 0, + } + max_tri = 0 + for facet in geometry["vertices"]: + arr = _to_array(facet) # (n_v, 3) + triangles, areas = _fan_triangulate_convex_polygon_3d(arr) + total_area = float(areas.sum()) if len(areas) > 0 else 0.0 + wyckoff_shapes_info["volumes"].append(total_area) + wyckoff_shapes_info["facet_triangles"].append(triangles) + wyckoff_shapes_info["facet_triangle_areas"].append(areas) + max_tri = max(max_tri, len(triangles)) + wyckoff_shapes_info["max_triangles_per_facet"] = max_tri + + elif site_dim == 3: + wyckoff_shapes_info = {"dim": 3, "volumes": []} + arr = _to_array(geometry["vertices"]) # (n_v, 3) + vol = _compute_3d_convex_hull_volume(arr) + wyckoff_shapes_info["volumes"].append(vol) + + else: + raise ValueError(f"Wyckoff site dimensionality must be in [0, 1, 2, 3], got: {site_dim}") + + sg_shape_info[wyckoff_letter] = wyckoff_shapes_info + + shape_decomposition_dict[sg] = sg_shape_info + + with open(output_path, "wb") as f: + pickle.dump(shape_decomposition_dict, f, protocol=pickle.HIGHEST_PROTOCOL) + + logger.info(f"[wyckoff_shape_decomp_builder] done -> {output_path}") \ No newline at end of file diff --git a/ppmat/models/sgequidiff/wyckoff_transformer.py b/ppmat/models/sgequidiff/wyckoff_transformer.py new file mode 100644 index 00000000..9bb017f9 --- /dev/null +++ b/ppmat/models/sgequidiff/wyckoff_transformer.py @@ -0,0 +1,617 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Wyckoff and Element Transformer: autoregressive sampling of Wyckoff positions and elements. + +""" +import dataclasses +import math + +import paddle +import paddle.nn as nn +import paddle.nn.functional as F + +import ppmat.models.sgequidiff.global_vars as global_vars +from ppmat.models.sgequidiff.constants import ( + NUM_ELEMENTS, NUM_SPACE_GROUPS, MAX_WYCKOFF_SITES, + lattice_parameter_ranges, + max_atoms_per_dataset, +) +from ppmat.models.sgequidiff.lattice_sampler import SpaceGroupEncoder +from ppmat.models.sgequidiff.non_equivariant_drift_modules import FourierLinear, Swish + + +class CustomMultiheadAttention(nn.Layer): + """Custom MHA matching _qkv_weight/_qkv_bias format from PT weights.""" + def __init__(self, embed_dim, num_heads, dropout=0.0, bias=True, + kdim=None, vdim=None): + super().__init__() + self.embed_dim = embed_dim + self.num_heads = num_heads + self.head_dim = embed_dim // num_heads + assert self.head_dim * num_heads == embed_dim + + self.kdim = kdim if kdim is not None else embed_dim + self.vdim = vdim if vdim is not None else embed_dim + + self._qkv_weight = paddle.create_parameter( + shape=[3 * embed_dim, self.kdim], + dtype="float32", + default_initializer=nn.initializer.XavierUniform(), + ) + self._qkv_bias = paddle.create_parameter( + shape=[3 * embed_dim], + dtype="float32", + default_initializer=nn.initializer.Constant(0.0), + ) + self.out_proj = nn.Linear(embed_dim, embed_dim) + + def forward(self, query, key, value, need_weights=False, + attn_mask=None, key_padding_mask=None): + batch_size = query.shape[0] + seq_q = query.shape[1] + seq_k = key.shape[1] + + embed_dim = self.embed_dim + + W_q = self._qkv_weight[:embed_dim] + W_k = self._qkv_weight[embed_dim:2*embed_dim] + W_v = self._qkv_weight[2*embed_dim:] + b_q = self._qkv_bias[:embed_dim] + b_k = self._qkv_bias[embed_dim:2*embed_dim] + b_v = self._qkv_bias[2*embed_dim:] + + q = paddle.matmul(query, W_q) + b_q + k = paddle.matmul(key, W_k) + b_k + v = paddle.matmul(value, W_v) + b_v + + q = q.reshape([batch_size, seq_q, self.num_heads, self.head_dim]).transpose([0, 2, 1, 3]) + k = k.reshape([batch_size, seq_k, self.num_heads, self.head_dim]).transpose([0, 2, 1, 3]) + v = v.reshape([batch_size, seq_k, self.num_heads, self.head_dim]).transpose([0, 2, 1, 3]) + + scale = math.sqrt(self.head_dim) + attn_weights = paddle.matmul(q, k.transpose([0, 1, 3, 2])) / scale + + if attn_mask is not None: + if attn_mask.dtype == paddle.bool: + attn_weights = paddle.where( + attn_mask.unsqueeze(1) if attn_mask.dim() == 3 else attn_mask, + paddle.full_like(attn_weights, float('-inf')), + attn_weights, + ) + else: + attn_weights = attn_weights + attn_mask + + if key_padding_mask is not None: + mask = key_padding_mask.unsqueeze(1).unsqueeze(2) + attn_weights = paddle.where( + mask, + paddle.full_like(attn_weights, float('-inf')), + attn_weights, + ) + + attn_weights = F.softmax(attn_weights, axis=-1) + + attn_weights = paddle.where( + paddle.isnan(attn_weights), + paddle.zeros_like(attn_weights), + attn_weights, + ) + + attn_output = paddle.matmul(attn_weights, v) + attn_output = attn_output.transpose([0, 2, 1, 3]).reshape( + [batch_size, seq_q, self.embed_dim] + ) + + output = self.out_proj(attn_output) + + if need_weights: + avg_weights = attn_weights.mean(axis=1) + return output, avg_weights + + return output, None + +class SpaceGroupAndLatticeEncoder(nn.Layer): + """Encode space group index and lattice parameters.""" + def __init__(self, hidden_dim: int, dataset_name: str): + super().__init__() + self.hidden_dim = hidden_dim + self.dataset_name = dataset_name + lattice_param_range_dict = lattice_parameter_ranges[self.dataset_name] + self.lattice_length_range = ( + lattice_param_range_dict["max_lattice_length"] + - lattice_param_range_dict["min_lattice_length"] + ) + self.lattice_angle_range = ( + lattice_param_range_dict["max_lattice_angle"] + - lattice_param_range_dict["min_lattice_angle"] + ) + self.space_group_encoder = SpaceGroupEncoder( + hidden_channels=self.hidden_dim, + space_group_embedding_dim=math.floor(self.hidden_dim / 2), + ) + self.lattice_encoder = FourierLinear( + input_dim=6, + num_fourier_frequencies=64, + scale=1.0, + output_dim=math.ceil(self.hidden_dim / 2), + use_bias=True, + ) + + def forward(self, space_group_indices, lattice_lengths, lattice_angles): + normed_lattice_params = paddle.concat( + [ + lattice_lengths / self.lattice_length_range, + lattice_angles / self.lattice_angle_range, + ], + axis=-1, + ) + emb = paddle.concat( + [ + self.space_group_encoder(space_group_indices), + self.lattice_encoder(normed_lattice_params), + ], + axis=-1, + ) + return emb + +class TransformerDecoderLayer(nn.Layer): + def __init__( + self, + hidden_dim: int = 64, + num_heads: int = 4, + num_hidden_layers: int = 1, + dropout_rate: float = 0.0, + ): + super().__init__() + self.hidden_dim = hidden_dim + self.num_heads = num_heads + self.num_hidden_layers = num_hidden_layers + self.layernorm = nn.LayerNorm(hidden_dim) + self.dropout = nn.Dropout(p=dropout_rate) + self.mha = CustomMultiheadAttention( + embed_dim=hidden_dim, + num_heads=num_heads, + ) + self.linear1 = nn.Linear(hidden_dim, hidden_dim) + self.linear2 = nn.Linear(hidden_dim, hidden_dim) + self.activation = nn.GELU() + + def forward(self, x, attn_mask=None, key_padding_mask=None, **kwargs): + x_norm = self.layernorm(x) + attn_out = self.mha( + query=x_norm, key=x_norm, value=x_norm, + attn_mask=attn_mask, + key_padding_mask=key_padding_mask, + )[0] + x = x + attn_out + x = self.dropout(x) + x = x + self.linear2(self.dropout(self.activation(self.linear1(x)))) + return self.dropout(x) + +@dataclasses.dataclass +class WyckoffElementTransformerConfig: + hidden_dim: int + dataset_name: str + num_heads: int = 4 + num_hidden_layers: int = 1 + dropout_rate: float = 0.0 + +class WyckoffElementTransformer(nn.Layer): + """Matches original PT code structure and weight format exactly.""" + def __init__(self, config: WyckoffElementTransformerConfig): + super().__init__() + self.config = config + self.hidden_dim = config.hidden_dim + self.num_heads = config.num_heads + self.num_hidden_layers = config.num_hidden_layers + self.dropout_rate = config.dropout_rate + + assert self.hidden_dim % 2 == 0 + self.wyckoff_dim = int(self.hidden_dim / 2) + self.element_dim = int(self.hidden_dim / 2) + + self.wyckoff_emb = nn.Linear( + global_vars.embedding_tools.wyckoff_embedding_length, self.wyckoff_dim + ) + self.element_emb = nn.Linear( + global_vars.embedding_tools.element_embedding_length, self.element_dim + ) + + nn.initializer.XavierUniform()(self.element_emb.weight) + + self.stop_key = paddle.create_parameter( + shape=[1, 1, self.wyckoff_dim], + dtype="float32", + default_initializer=nn.initializer.Normal(), + ) + self.seed_wyckoff_embedding = paddle.create_parameter( + shape=[1, 1, self.wyckoff_dim], + dtype="float32", + default_initializer=nn.initializer.Normal(), + ) + self.seed_element_embedding = paddle.create_parameter( + shape=[1, 1, self.element_dim], + dtype="float32", + default_initializer=nn.initializer.Normal(), + ) + + self.space_group_and_lattice_emb = SpaceGroupAndLatticeEncoder( + self.hidden_dim, config.dataset_name + ) + + self.atom_embedder = nn.Sequential( + nn.Linear( + self.hidden_dim + self.wyckoff_dim + self.element_dim, + self.hidden_dim, + ), + Swish(), + nn.Linear(self.hidden_dim, self.hidden_dim), + Swish(), + ) + + self.hidden_layers = nn.LayerList([ + TransformerDecoderLayer( + hidden_dim=self.hidden_dim, + num_heads=self.num_heads, + num_hidden_layers=self.num_hidden_layers, + dropout_rate=self.dropout_rate, + ) + for _ in range(self.num_hidden_layers) + ]) + + self.wyckoff_mha = CustomMultiheadAttention( + embed_dim=int(self.hidden_dim / 2), + num_heads=1, + kdim=self.wyckoff_dim, + vdim=self.wyckoff_dim, + ) + + d = int(self.hidden_dim / 2) + self.wyckoff_dim + self.mix_xtal_and_wyckoff_mlp = nn.Sequential( + nn.Linear(d, int(self.hidden_dim / 2)), + Swish(), + nn.Linear(int(self.hidden_dim / 2), int(self.hidden_dim / 2)), + Swish(), + nn.Linear(int(self.hidden_dim / 2), int(self.hidden_dim / 2)), + Swish(), + ) + + self.element_keys_mlp = nn.Sequential( + nn.Linear(self.element_dim, self.element_dim), + Swish(), + nn.Linear(self.element_dim, self.element_dim), + Swish(), + nn.Linear(self.element_dim, self.element_dim), + Swish(), + ) + + self.element_mha = CustomMultiheadAttention( + embed_dim=int(self.hidden_dim / 2), + num_heads=1, + kdim=self.element_dim, + vdim=self.element_dim, + ) + + self.register_buffer( + "valid_wyckoff_positions_mask", + paddle.zeros([NUM_SPACE_GROUPS, MAX_WYCKOFF_SITES], dtype="bool"), + ) + self.register_buffer( + "zero_dimensional_wyckoff_mask", + paddle.zeros([NUM_SPACE_GROUPS, MAX_WYCKOFF_SITES], dtype="bool"), + ) + + @paddle.no_grad() + def sample_and_log_prob( + self, + lattice_lengths, + lattice_angles, + space_group_indices, + temperature: float = 1.0, + ): + """Autoregressively sample Wyckoff positions and elements.""" + assert temperature > 0.0 + max_allowed_atoms = max_atoms_per_dataset[self.config.dataset_name] + n_crystals = space_group_indices.shape[0] + + global_context = self.space_group_and_lattice_emb( + space_group_indices, lattice_lengths, lattice_angles + )[:, None, :] + + padded_wyckoff_embeddings = self.seed_wyckoff_embedding.expand( + [n_crystals, 1, -1] + ) + padded_element_embeddings = self.seed_element_embedding.expand( + [n_crystals, 1, -1] + ) + + atom_tokens = paddle.concat( + [ + global_context, + padded_wyckoff_embeddings, + padded_element_embeddings, + ], + axis=-1, + ) + + wyckoff_exists = self.valid_wyckoff_positions_mask[space_group_indices] + + _xtal_indices_list = [] + _existing_wyckoff_indices_list = [] + for b in range(n_crystals): + sg_idx = int(space_group_indices[b]) + for wp_idx in range(MAX_WYCKOFF_SITES): + if wyckoff_exists[b, wp_idx]: + _xtal_indices_list.append(b) + _existing_wyckoff_indices_list.append(wp_idx) + + if len(_xtal_indices_list) > 0: + _xtal_indices = paddle.to_tensor(_xtal_indices_list, dtype="int64") + _existing_wyckoff_indices = paddle.to_tensor( + _existing_wyckoff_indices_list, dtype="int64" + ) + wyckoff_keys = self.wyckoff_emb( + global_vars.embedding_tools.get_wyckoff_embedding( + wyckoff_index=_existing_wyckoff_indices, + space_group_index=space_group_indices[_xtal_indices], + ) + ) + else: + wyckoff_keys = paddle.zeros([0, self.wyckoff_dim]) + + padded_wyckoff_keys = paddle.zeros( + [n_crystals, MAX_WYCKOFF_SITES, self.wyckoff_dim] + ) + if len(_xtal_indices_list) > 0: + padded_wyckoff_keys[_xtal_indices, _existing_wyckoff_indices] = wyckoff_keys + + padded_wyckoff_keys = paddle.concat( + [self.stop_key.expand([n_crystals, 1, -1]), padded_wyckoff_keys], + axis=1, + ) + + wyckoff_padding_mask = paddle.concat( + [ + paddle.zeros([n_crystals, 1], dtype="bool"), + ~wyckoff_exists, + ], + axis=1, + ) + + _element_keys = self.element_keys_mlp( + self.element_emb( + global_vars.embedding_tools.get_element_embedding( + atomic_number=1 + paddle.arange(NUM_ELEMENTS, dtype="int64") + ) + ) + )[None, ...] + + wyckoff_attn_mask = paddle.zeros( + [n_crystals, 1, 1 + MAX_WYCKOFF_SITES], dtype="bool" + ) + wyckoff_attn_mask[:, :, 0] = True + + crystal_is_complete = paddle.zeros([n_crystals], dtype="bool") + n_asu_atoms_per_xtal = paddle.zeros([n_crystals], dtype="int64") + padded_wyckoff_indices = paddle.full( + [n_crystals, max_allowed_atoms], fill_value=-1, dtype="int64" + ) + padded_element_indices = paddle.full( + [n_crystals, max_allowed_atoms], fill_value=-1, dtype="int64" + ) + padded_wyckoff_probs = paddle.full( + [n_crystals, max_allowed_atoms], fill_value=-1.0 + ) + padded_element_probs = paddle.full( + [n_crystals, max_allowed_atoms], fill_value=-1.0 + ) + termination_probs = paddle.zeros([n_crystals]) + + iteration = 0 + arange_n_crystals = paddle.arange(n_crystals, dtype="int64") + + while iteration < max_allowed_atoms and not crystal_is_complete.all(): + atom_tokens = self.atom_embedder(atom_tokens) + + seq_len = atom_tokens.shape[1] + causal_mask = paddle.triu( + paddle.ones([seq_len, seq_len], dtype="bool"), diagonal=1 + ) + + for layer in self.hidden_layers: + atom_tokens = layer( + atom_tokens, + attn_mask=causal_mask, + ) + + incomplete_mask = ~crystal_is_complete + n_incomplete = int(incomplete_mask.sum()) + + last_pos = n_asu_atoms_per_xtal[incomplete_mask] + incomplete_indices = arange_n_crystals[incomplete_mask] + + atom_tokens_last = atom_tokens[incomplete_mask] + _idx = paddle.arange(n_incomplete, dtype="int64") + atom_tokens_flat = atom_tokens_last[_idx, last_pos] + + atom_z_wyckoff = atom_tokens_flat[:, :self.wyckoff_dim] + atom_z_element = atom_tokens_flat[:, self.wyckoff_dim:] + + wyckoff_keys_batch = padded_wyckoff_keys[incomplete_mask] + wyckoff_padding_batch = wyckoff_padding_mask[incomplete_mask] + wyckoff_attn_batch = wyckoff_attn_mask + + wyckoff_and_stop_probs = self.wyckoff_mha( + query=atom_z_wyckoff[:, None, :], + key=wyckoff_keys_batch, + value=wyckoff_keys_batch, + need_weights=True, + key_padding_mask=wyckoff_padding_batch, + attn_mask=wyckoff_attn_batch, + )[1] + + if temperature != 1.0: + wyckoff_and_stop_probs = F.softmax( + paddle.log(wyckoff_and_stop_probs + 1e-12) / temperature, axis=-1 + ) + + wyckoff_or_stop_sample = paddle.multinomial( + wyckoff_and_stop_probs.squeeze(1), num_samples=1 + ).squeeze(-1) + + sampled_stop_token = (wyckoff_or_stop_sample == 0) + sampled_wyckoff_indices = wyckoff_or_stop_sample[~sampled_stop_token] - 1 + + if (~sampled_stop_token).sum() > 0: + sampled_wyckoff_probs = paddle.take_along_axis( + wyckoff_and_stop_probs[~sampled_stop_token].squeeze(1), + (1 + sampled_wyckoff_indices[:, None]), + axis=1, + ).squeeze(-1) + else: + sampled_wyckoff_probs = paddle.zeros([0]) + + termination_probs[incomplete_mask] = ( + sampled_stop_token.cast("float32") + * wyckoff_and_stop_probs[:, 0, 0] + ) + + idxs_of_xtals_to_update = arange_n_crystals[incomplete_mask][~sampled_stop_token] + if idxs_of_xtals_to_update.shape[0] > 0: + padded_wyckoff_indices[idxs_of_xtals_to_update, iteration] = sampled_wyckoff_indices + padded_wyckoff_probs[idxs_of_xtals_to_update, iteration] = sampled_wyckoff_probs + n_asu_atoms_per_xtal[idxs_of_xtals_to_update] += 1 + + iteration += 1 + crystal_is_complete[incomplete_mask] = sampled_stop_token + + if (~crystal_is_complete).sum() > 0: + if sampled_wyckoff_indices.shape[0] > 0: + sampled_wyckoff_embeddings = self.wyckoff_emb( + global_vars.embedding_tools.get_wyckoff_embedding( + wyckoff_index=sampled_wyckoff_indices, + space_group_index=space_group_indices[idxs_of_xtals_to_update], + ) + ) + else: + sampled_wyckoff_embeddings = paddle.zeros([0, self.wyckoff_dim]) + + if sampled_wyckoff_indices.shape[0] > 0: + atom_z_element_mixed = self.mix_xtal_and_wyckoff_mlp( + paddle.concat( + [atom_z_element[~sampled_stop_token], sampled_wyckoff_embeddings], + axis=-1, + ) + ) + else: + atom_z_element_mixed = paddle.zeros([0, int(self.hidden_dim / 2)]) + + element_keys = _element_keys.expand( + [atom_z_element_mixed.shape[0], -1, -1] + ) + + element_attn_mask = paddle.zeros( + [atom_z_element_mixed.shape[0], 1, NUM_ELEMENTS], + dtype="bool", + ) + + element_probs = self.element_mha( + query=atom_z_element_mixed[:, None, :], + key=element_keys, + value=element_keys, + need_weights=True, + attn_mask=element_attn_mask, + )[1] + + if temperature != 1.0: + element_probs = F.softmax( + paddle.log(element_probs + 1e-12) / temperature, axis=-1 + ) + + sampled_element_indices = paddle.multinomial( + element_probs.squeeze(1), num_samples=1 + ).squeeze(-1) + sampled_element_probs = paddle.take_along_axis( + element_probs.squeeze(1), + sampled_element_indices[:, None], + axis=1, + ).squeeze(-1) + + padded_element_indices[idxs_of_xtals_to_update, iteration - 1] = sampled_element_indices + padded_element_probs[idxs_of_xtals_to_update, iteration - 1] = sampled_element_probs + + sampled_element_embeddings = self.element_emb( + global_vars.embedding_tools.get_element_embedding( + atomic_number=1 + sampled_element_indices + ) + ) + + padded_sampled_wyckoff = paddle.zeros([n_crystals, self.wyckoff_dim]) + padded_sampled_element = paddle.zeros([n_crystals, self.element_dim]) + padded_sampled_wyckoff[idxs_of_xtals_to_update] = sampled_wyckoff_embeddings + padded_sampled_element[idxs_of_xtals_to_update] = sampled_element_embeddings + + padded_wyckoff_embeddings = paddle.concat( + [ + padded_wyckoff_embeddings, + padded_sampled_wyckoff[:, None, :], + ], + axis=1, + ) + padded_element_embeddings = paddle.concat( + [ + padded_element_embeddings, + padded_sampled_element[:, None, :], + ], + axis=1, + ) + + incomplete_mask_new = ~crystal_is_complete + if incomplete_mask_new.sum() > 0: + global_context_expanded = global_context[incomplete_mask_new].expand( + [-1, 1 + iteration, -1] + ) + atom_tokens = paddle.concat( + [ + global_context_expanded, + padded_wyckoff_embeddings[incomplete_mask_new], + padded_element_embeddings[incomplete_mask_new], + ], + axis=-1, + ) + + atom_mask = ( + paddle.arange(max_allowed_atoms, dtype="int64")[None, :] + < n_asu_atoms_per_xtal[:, None] + ) + + element_indices = padded_element_indices[atom_mask] + wyckoff_indices = padded_wyckoff_indices[atom_mask] + _element_probs = padded_element_probs[atom_mask] + _wyckoff_probs = padded_wyckoff_probs[atom_mask] + + elements_log_prob = paddle.log(_element_probs + 1e-12) + wyckoffs_log_prob = paddle.log(_wyckoff_probs + 1e-12) + termination_log_prob = paddle.log(termination_probs + 1e-12) + + return ( + element_indices, + wyckoff_indices, + n_asu_atoms_per_xtal, + elements_log_prob, + wyckoffs_log_prob, + termination_log_prob, + ) \ No newline at end of file diff --git a/ppmat/optimizer/__init__.py b/ppmat/optimizer/__init__.py new file mode 100644 index 00000000..39f7859f --- /dev/null +++ b/ppmat/optimizer/__init__.py @@ -0,0 +1,107 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +from typing import Dict +from typing import Tuple + +import paddle +import paddle.nn as nn + +from ppmat.optimizer import lr_scheduler +from ppmat.optimizer.optimizer import LBFGS +from ppmat.optimizer.optimizer import SGD +from ppmat.optimizer.optimizer import Adam +from ppmat.optimizer.optimizer import AdamW +from ppmat.optimizer.optimizer import Momentum +from ppmat.optimizer.optimizer import OptimizerList +from ppmat.optimizer.optimizer import RMSProp + +__all__ = [ + "LBFGS", + "SGD", + "Adam", + "AdamW", + "Momentum", + "RMSProp", + "OptimizerList", + "lr_scheduler", +] + + +def build_lr_scheduler(cfg: Dict, epochs: int, iters_per_epoch: int): + """Build learning rate scheduler. + + Args: + cfg (Dict): Learning rate scheduler config. + epochs (int): Total epochs. + iters_per_epoch (int): Number of iterations of one epoch. + + Returns: + LRScheduler: Learning rate scheduler. + """ + cfg = copy.deepcopy(cfg) + cfg.update({"epochs": epochs, "iters_per_epoch": iters_per_epoch}) + lr_scheduler_cls = cfg.pop("__class_name__") + init_params = cfg.pop("__init_params__") + lr_scheduler_ = getattr(lr_scheduler, lr_scheduler_cls)( + epochs=epochs, iters_per_epoch=iters_per_epoch, **init_params + ) + return lr_scheduler_() + + +def build_optimizer( + cfg: Dict, model_list: Tuple[nn.Layer, ...], epochs: int, iters_per_epoch: int +): + """Build optimizer and learning rate scheduler + + Args: + cfg (Dict): Learning rate scheduler config. + model_list (Tuple[nn.Layer, ...]): Tuple of model(s). + epochs (int): Total epochs. + iters_per_epoch (int): Number of iterations of one epoch. + + Returns: + Optimizer, LRScheduler: Optimizer and learning rate scheduler. + """ + # build lr_scheduler + cfg = copy.deepcopy(cfg) + init_params = cfg.pop("__init_params__") + lr_cfg = init_params.pop("lr") + if isinstance(lr_cfg, float): + lr_scheduler = lr_cfg + else: + lr_scheduler = build_lr_scheduler(lr_cfg, epochs, iters_per_epoch) + + # build optimizer + opt_cls = cfg.pop("__class_name__") + if "clip_norm" in cfg: + clip_norm = cfg.pop("clip_norm") + grad_clip = paddle.nn.ClipGradByNorm(clip_norm=clip_norm) + elif "clip_norm_global" in cfg: + clip_norm = cfg.pop("clip_norm_global") + grad_clip = paddle.nn.ClipGradByGlobalNorm(clip_norm=clip_norm) + elif "clip_value" in cfg: + clip_value = cfg.pop("clip_value") + grad_clip = paddle.nn.ClipGradByValue(clip_value) + else: + grad_clip = None + + optimizer = eval(opt_cls)( + learning_rate=lr_scheduler, grad_clip=grad_clip, **init_params + )(model_list) + + if isinstance(lr_scheduler, float): + return optimizer, None + return optimizer, lr_scheduler diff --git a/ppmat/optimizer/lr_scheduler.py b/ppmat/optimizer/lr_scheduler.py new file mode 100644 index 00000000..11fae53b --- /dev/null +++ b/ppmat/optimizer/lr_scheduler.py @@ -0,0 +1,880 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file adapted from https://github.com/PaddlePaddle/PaddleScience + +from __future__ import annotations + +import abc +import math +from typing import List +from typing import Literal +from typing import Tuple +from typing import Union + +from paddle.optimizer import lr + +from ppmat.utils import logger + + +class LRBase: + """Base class for custom learning rates. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + warmup_epoch (int): Number of warmup epochs. + warmup_start_lr (float): Start learning rate within warmup. + last_epoch (int): Last epoch. + by_epoch (bool): Learning rate decays by epoch when by_epoch is True, + else by iter. + verbose (bool): If True, prints a message to stdout for each update. + Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + warmup_epoch: int, + warmup_start_lr: float, + last_epoch: int, + by_epoch: bool, + verbose: bool = False, + ) -> None: + """Initialize and record the necessary parameters.""" + super().__init__() + if warmup_epoch >= epochs: + msg = ( + "When using warm up, the value of 'Global.epochs' should be greater " + "than value of 'Optimizer.lr.warmup_epoch'. The value of " + f"'Optimizer.lr.warmup_epoch' has been set to {epochs}." + ) + logger.warning(msg) + warmup_epoch = epochs + self.epochs = epochs + self.iters_per_epoch = iters_per_epoch + self.learning_rate = learning_rate + self.warmup_epoch = warmup_epoch + self.warmup_steps = ( + self.warmup_epoch + if by_epoch + else round(self.warmup_epoch * self.iters_per_epoch) + ) + self.warmup_start_lr = warmup_start_lr + self.last_epoch = last_epoch + self.by_epoch = by_epoch + self.verbose = verbose + + @abc.abstractmethod + def __call__(self, *args, **kwargs) -> lr.LRScheduler: + """Generate an learning rate scheduler. + + Returns: + lr.LinearWarmup: learning rate scheduler. + """ + pass + + def linear_warmup( + self, learning_rate: Union[float, lr.LRScheduler] + ) -> lr.LinearWarmup: + """Add an Linear Warmup before learning_rate. + + Args: + learning_rate (Union[float, lr.LRScheduler]): Original learning rate without + warmup. + + Returns: + lr.LinearWarmup: learning rate scheduler with warmup. + """ + warmup_lr = lr.LinearWarmup( + learning_rate=learning_rate, + warmup_steps=self.warmup_steps, + start_lr=self.warmup_start_lr, + end_lr=self.learning_rate, + last_epoch=self.last_epoch, + verbose=self.verbose, + ) + return warmup_lr + + +class Constant(lr.LRScheduler): + """Constant learning rate Class implementation. + + Args: + learning_rate (float): The initial learning rate. + last_epoch (int, optional): The index of last epoch. Default: -1. + """ + + def __init__(self, learning_rate: float, last_epoch: int = -1): + self.learning_rate = learning_rate + self.last_epoch = last_epoch + super().__init__() + + def get_lr(self) -> float: + """Always return the same learning rate""" + return self.learning_rate + + +class Linear(LRBase): + """Linear learning rate decay. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + end_lr (float, optional): The minimum final learning rate. Defaults to 0.0. + power (float, optional): Power of polynomial. Defaults to 1.0. + cycle (bool, optional): Whether the learning rate rises again. If True, + then the learning rate will rise when it decrease to ``end_lr`` . + If False, the learning rate is monotone decreasing. Defaults to False. + warmup_epoch (int): Number of warmup epochs. + warmup_start_lr (float): Start learning rate within warmup. + last_epoch (int): Last epoch. + by_epoch (bool): Learning rate decays by epoch when by_epoch is True, + else by iter. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + end_lr: float = 0.0, + power: float = 1.0, + cycle: bool = False, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.decay_steps = (epochs - self.warmup_epoch) * iters_per_epoch + self.end_lr = end_lr + self.power = power + self.cycle = cycle + self.warmup_steps = round(self.warmup_epoch * iters_per_epoch) + if self.by_epoch: + self.decay_steps = self.epochs - self.warmup_epoch + + def __call__(self): + learning_rate = ( + lr.PolynomialDecay( + learning_rate=self.learning_rate, + decay_steps=self.decay_steps, + end_lr=self.end_lr, + power=self.power, + cycle=self.cycle, + last_epoch=self.last_epoch, + ) + if self.decay_steps > 0 + else Constant(self.learning_rate) + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class ExponentialDecay(LRBase): + """ExponentialDecay learning rate decay. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + gamma (float): The decay rate. + decay_steps (int): The number of steps to decay. + warmup_epoch (int): Number of warmup epochs. + warmup_start_lr (float): Start learning rate within warmup. + last_epoch (int): Last epoch. + by_epoch (bool): Learning rate decays by epoch when by_epoch is True, + else by iter. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + gamma: float, + decay_steps: int, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.decay_steps = decay_steps + self.gamma = gamma + self.warmup_steps = round(self.warmup_epoch * iters_per_epoch) + if self.by_epoch: + self.decay_steps /= iters_per_epoch + + def __call__(self): + learning_rate = lr.ExponentialDecay( + learning_rate=self.learning_rate, + gamma=self.gamma ** (1 / self.decay_steps), + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class Cosine(LRBase): + """Cosine learning rate decay. + + lr = 0.05 * (math.cos(epoch * (math.pi / epochs)) + 1) + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + eta_min (float, optional): Minimum learning rate. Defaults to 0.0. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + eta_min: float = 0.0, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + T_max=None, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.T_max = (self.epochs - self.warmup_epoch) * self.iters_per_epoch + self.eta_min = eta_min + if self.by_epoch: + self.T_max = self.epochs - self.warmup_epoch + if T_max is not None: + self.T_max = T_max + + def __call__(self): + learning_rate = ( + lr.CosineAnnealingDecay( + learning_rate=self.learning_rate, + T_max=self.T_max, + eta_min=self.eta_min, + last_epoch=self.last_epoch, + ) + if self.T_max > 0 + else Constant(self.learning_rate) + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class Step(LRBase): + """Step learning rate decay. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): Learning rate. + step_size (int): The interval to update. + gamma (float, optional): The Ratio that the learning rate will be reduced. + ``new_lr = origin_lr * gamma``. It should be less than 1.0. Default: 0.1. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + step_size: int, + gamma: float, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.step_size = step_size * iters_per_epoch + self.gamma = gamma + if self.by_epoch: + self.step_size = step_size + + def __call__(self): + learning_rate = lr.StepDecay( + learning_rate=self.learning_rate, + step_size=self.step_size, + gamma=self.gamma, + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class Piecewise(LRBase): + """Piecewise learning rate decay + + Args: + epochs (int): Total epoch(s) + iters_per_epoch (int): Number of iterations within an epoch + decay_epochs (Tuple[int, ...]): A list of steps numbers. The type of element + in the list is python int. + values (Tuple[float, ...]): Tuple of learning rate values that will be picked + during different epoch boundaries. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + decay_epochs: Tuple[int, ...], + values: Tuple[float, ...], + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + values[0], + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.values = values + self.boundaries_steps = [e * iters_per_epoch for e in decay_epochs] + if self.by_epoch is True: + self.boundaries_steps = decay_epochs + + def __call__(self): + learning_rate = lr.PiecewiseDecay( + boundaries=self.boundaries_steps, + values=self.values, + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class MultiStepDecay(LRBase): + """MultiStepDecay learning rate decay + + Args: + epochs (int): Total epoch(s) + iters_per_epoch (int): Number of iterations within an epoch + learning_rate (float): Learning rate + milestones (Tuple[int, ...]): Tuple of each boundaries. should be increasing. + gamma (float, optional): The Ratio that the learning rate will be reduced. + `new_lr = origin_lr * gamma`. It should be less than 1.0. Defaults to 0.1. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + milestones: Tuple[int, ...], + gamma: float = 0.1, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.milestones = [x * iters_per_epoch for x in milestones] + self.gamma = gamma + if self.by_epoch: + self.milestones = milestones + + def __call__(self): + learning_rate = lr.MultiStepDecay( + learning_rate=self.learning_rate, + milestones=self.milestones, + gamma=self.gamma, + last_epoch=self.last_epoch, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class CosineAnnealingWarmRestarts(lr.LRScheduler): + """The implementation of cosine annealing schedule with warm restarts. + + Args: + learning_rate (float): Learning rate + T_0 (int): Number of iterations for the first restart. + T_mult (int, optional): A factor increases T_i after a restart. Defaults to 1. + eta_min (float, optional): Minimum learning rate. Defaults to 0. + last_epoch (int, optional): The index of last epoch. Defaults to -1. + verbose (bool, optional): If `True`, prints a message to stdout for each + update. Defaults to False. + """ + + def __init__( + self, + learning_rate: float, + T_0: int, + T_mult: int = 1, + eta_min: float = 0.0, + last_epoch: int = -1, + verbose: bool = False, + ): + if T_0 <= 0 or not isinstance(T_0, int): + raise ValueError(f"Expected positive integer T_0, but got {T_0}") + if T_mult < 1 or not isinstance(T_mult, int): + raise ValueError(f"Expected integer T_mult >= 1, but got {T_mult}") + self.T_0 = T_0 + self.T_i = T_0 + self.T_mult = T_mult + self.eta_min = eta_min + self.T_cur = last_epoch + super().__init__(learning_rate, last_epoch, verbose) + + def get_lr(self): + return ( + self.eta_min + + (self.base_lr - self.eta_min) + * (1 + math.cos(math.pi * self.T_cur / self.T_i)) + / 2 + ) + + def step(self, epoch=None): + if epoch is None and self.last_epoch < 0: + epoch = 0 + + if epoch is None: + epoch = self.last_epoch + 1 + self.T_cur = self.T_cur + 1 + if self.T_cur >= self.T_i: + self.T_cur = self.T_cur - self.T_i + self.T_i = self.T_i * self.T_mult + else: + if epoch < 0: + raise ValueError(f"Expected non-negative epoch, but got {epoch}") + if epoch >= self.T_0: + if self.T_mult == 1: + self.T_cur = epoch % self.T_0 + else: + n = int( + math.log( + (epoch / self.T_0 * (self.T_mult - 1) + 1), self.T_mult + ) + ) + self.T_cur = epoch - self.T_0 * (self.T_mult**n - 1) / ( + self.T_mult - 1 + ) + self.T_i = self.T_0 * self.T_mult ** (n) + else: + self.T_i = self.T_0 + self.T_cur = epoch + self.last_epoch = math.floor(epoch) + self.last_lr = self.get_lr() + + +class CosineWarmRestarts(LRBase): + """Set the learning rate using a cosine annealing schedule with warm restarts. + + Args: + epochs (int): Total epoch(s) + iters_per_epoch (int): Number of iterations within an epoch + learning_rate (float): Learning rate + T_0 (int): Number of iterations for the first restart. + T_mult (int): A factor increases T_i after a restart + eta_min (float, optional): Minimum learning rate. Defaults to 0.0. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + T_0: int, + T_mult: int, + eta_min: float = 0.0, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.T_0 = T_0 + self.T_mult = T_mult + self.eta_min = eta_min + if self.by_epoch is False: + self.T_0 = T_0 * iters_per_epoch + + def __call__(self): + learning_rate = CosineAnnealingWarmRestarts( + learning_rate=self.learning_rate, + T_0=self.T_0, + T_mult=self.T_mult, + eta_min=self.eta_min, + last_epoch=self.last_epoch, + verbose=self.verbose, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class OneCycleLR(LRBase): + """Sets the learning rate according to the one cycle learning rate scheduler. + The scheduler adjusts the learning rate from an initial learning rate to the + maximum learning rate and then from that maximum learning rate to the minimum + learning rate, which is much less than the initial learning rate. + + It has been proposed in [Super-Convergence: Very Fast Training of Neural Networks + Using Large Learning Rates](https://arxiv.org/abs/1708.07120). + + Please note that the default behavior of this scheduler follows the fastai + implementation of one cycle, which claims that **"unpublished work has shown even + better results by using only two phases"**. If you want the behavior of this + scheduler to be consistent with the paper, please set `three_phase=True`. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + max_learning_rate (float): The maximum learning rate. It is a python float + number. Functionally, it defines the initial learning rate by + `divide_factor` . + divide_factor (float, optional): Initial learning rate will be determined by + initial_learning_rate = max_learning_rate / divide_factor. Defaults to 25.0. + end_learning_rate (float, optional): The minimum learning rate during training, + it should be much less than initial learning rate. Defaults to 0.0001. + phase_pct (float): The percentage of total steps which used to increasing + learning rate. Defaults to 0.3. + anneal_strategy (str, optional): Strategy of adjusting learning rate. "cos" for + cosine annealing, "linear" for linear annealing. Defaults to "cos". + three_phase (bool, optional): Whether to use three phase. Defaults to False. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup. + Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + max_learning_rate: float, + divide_factor: float = 25.0, + end_learning_rate: float = 0.0001, + phase_pct: float = 0.3, + anneal_strategy: str = "cos", + three_phase: bool = False, + warmup_epoch: int = 0, + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = False, + ): + super().__init__( + epochs, + iters_per_epoch, + max_learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.total_steps = epochs + if not by_epoch: + self.total_steps *= iters_per_epoch + self.divide_factor = divide_factor + self.end_learning_rate = end_learning_rate + self.phase_pct = phase_pct + self.anneal_strategy = anneal_strategy + self.three_phase = three_phase + + def __call__(self): + learning_rate = lr.OneCycleLR( + max_learning_rate=self.learning_rate, + total_steps=self.total_steps, + divide_factor=self.divide_factor, + end_learning_rate=self.end_learning_rate, + phase_pct=self.phase_pct, + anneal_strategy=self.anneal_strategy, + three_phase=self.three_phase, + last_epoch=self.last_epoch, + verbose=self.verbose, + ) + + if self.warmup_steps > 0: + learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + return learning_rate + + +class ReduceOnPlateau(LRBase): + """ReduceOnPlateau learning rate scheduler. + + Reduce learning rate when metrics has stopped descending. Models often benefit + from reducing the learning rate by 2 to 10 times once model performance has no + longer improvement. + + The metrics is the one which has been pass into step, it must + be 1-D Tensor with shape [1]. When metrics stop descending for a patience number of + epochs, the learning rate will be reduced to learning_rate * factor . (Specially, + mode can also be set to 'max , in this case, when metrics stop ascending for a + patience number of epochs, the learning rate will be reduced.) + + In addition, After each reduction, it will wait a cooldown number of epochs before + resuming above operation. + + Args: + epochs (int): Total epoch(s). + iters_per_epoch (int): Number of iterations within an epoch. + learning_rate (float): The initial learning rate. It is a python float number. + indicator (Literal["train_loss", "eval_loss", "train_metric", "eval_metric"]): + Type of metrics. + indicator_name (str): The name of the metric. + mode (str, optional): ``'min'`` or ``'max'`` can be selected. Normally, it is + ``'min'`` , which means that the learning rate will reduce when ``loss`` + stops descending. Specially, if it's set to ``'max'`` , the learning + rate will reduce when ``loss`` stops ascending. Default: ``'min'`` . + factor (float, optional): The Ratio that the learning rate will be reduced. + ``new_lr = origin_lr * factor`` . It should be less than 1.0. Default: 0.1. + patience (int, optional): When ``loss`` doesn't improve for this number of + epochs, learing rate will be reduced. Default: 10. + threshold (float, optional): ``threshold`` and ``threshold_mode`` will + determine the minimum change of ``loss`` . This make tiny changes of + ``loss`` will be ignored. Default: 1e-4. + threshold_mode (str, optional): ``'rel'`` or ``'abs'`` can be selected. + In ``'rel'`` mode, the minimum change of ``loss`` is + ``last_loss * threshold`` , where ``last_loss`` is ``loss`` in last + epoch. In ``'abs'`` mode, the minimum change of ``loss`` is ``threshold`` . + Default: ``'rel'`` . + cooldown (int, optional): The number of epochs to wait before resuming normal + operation. Default: 0. + min_lr (float, optional): The lower bound of the learning rate after reduction. + Default: 0. + epsilon (float, optional): Minimal decay applied to lr. If the difference + between new and old lr is smaller than epsilon, the update is ignored. + Default: 1e-8. + warmup_epoch (int, optional): The epoch numbers for LinearWarmup, this learning + rate does not currently support warmup. Defaults to 0. + warmup_start_lr (float, optional): Start learning rate within warmup. + Defaults to 0.0. + last_epoch (int, optional): Last epoch. Defaults to -1. + by_epoch (bool, optional): Learning rate decays by epoch when by_epoch is True, + else by iter. Defaults to False. + """ + + def __init__( + self, + epochs: int, + iters_per_epoch: int, + learning_rate: float, + indicator: Literal["train_loss", "eval_loss", "train_metric", "eval_metric"], + indicator_name: str, + mode: str = "min", + factor: float = 0.1, + patience: int = 10, + threshold: float = 1e-4, + threshold_mode: str = "rel", + cooldown: int = 0, + min_lr: float = 0.0, + epsilon=1e-8, + warmup_epoch: int = 0, # this lr do not support warmup, so set to 0 + warmup_start_lr: float = 0.0, + last_epoch: int = -1, + by_epoch: bool = True, + ): + super().__init__( + epochs, + iters_per_epoch, + learning_rate, + warmup_epoch, + warmup_start_lr, + last_epoch, + by_epoch, + ) + self.indicator = indicator + self.indicator_name = indicator_name + assert by_epoch, "ReduceOnPlateau only support by_epoch=True" + + self.decay_steps = (epochs - self.warmup_epoch) * iters_per_epoch + self.mode = mode + self.factor = factor + self.patience = patience + self.threshold = threshold + self.threshold_mode = threshold_mode + self.cooldown = cooldown + self.min_lr = min_lr + self.epsilon = epsilon + + self.warmup_steps = round(self.warmup_epoch * iters_per_epoch) + + def __call__(self): + learning_rate = lr.ReduceOnPlateau( + learning_rate=self.learning_rate, + mode=self.mode, + factor=self.factor, + patience=self.patience, + threshold=self.threshold, + threshold_mode=self.threshold_mode, + cooldown=self.cooldown, + min_lr=self.min_lr, + epsilon=self.epsilon, + ) + + # Todo: warmup + # if self.warmup_steps > 0: + # learning_rate = self.linear_warmup(learning_rate) + + setattr(learning_rate, "by_epoch", self.by_epoch) + setattr(learning_rate, "indicator", self.indicator) + setattr(learning_rate, "indicator_name", self.indicator_name) + return learning_rate + + +class SchedulerList: + """SchedulerList which wrap more than one scheduler. + + Args: + scheduler_list (Tuple[lr.LRScheduler, ...]): Schedulers listed in a tuple. + """ + + def __init__(self, scheduler_list: Tuple[lr.LRScheduler, ...]): + super().__init__() + self._sch_list = scheduler_list + self.by_epoch = False + + def step(self): + for sch in self._sch_list: + sch.step() + + def get_lr(self) -> float: + """Return learning rate of first scheduler""" + return self._sch_list[0].get_lr() + + def _state_keys(self) -> List[str]: + return ["last_epoch", "last_lr"] + + def __len__(self) -> int: + return len(self._sch_list) + + def __getitem__(self, idx): + return self._sch_list[idx] + + def __setitem__(self, idx, sch): + raise NotImplementedError("Can not modify any item in SchedulerList.") diff --git a/ppmat/optimizer/optimizer.py b/ppmat/optimizer/optimizer.py new file mode 100644 index 00000000..c119dd16 --- /dev/null +++ b/ppmat/optimizer/optimizer.py @@ -0,0 +1,522 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file adapted from https://github.com/PaddlePaddle/PaddleScience + +from __future__ import annotations + +from typing import TYPE_CHECKING +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +from paddle import nn +from paddle import optimizer as optim +from paddle import regularizer +from paddle.incubate import optimizer as incubate_optim +from typing_extensions import Literal + +from ppmat.utils import logger +from ppmat.utils import misc + +if TYPE_CHECKING: + import paddle + +__all__ = ["SGD", "Momentum", "Adam", "RMSProp", "AdamW", "LBFGS", "OptimizerList"] + + +class SGD: + """Stochastic Gradient Descent. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler], optional): The learning rate + used to update parameter(s). Defaults to 0.001. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]): + Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler] = 0.001, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + ): + self.learning_rate = learning_rate + self.weight_decay = weight_decay + self.grad_clip = grad_clip + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.SGD( + learning_rate=self.learning_rate, + parameters=parameters, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + ) + return opt + + +class Momentum: + """Simple Momentum optimizer with velocity state. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler]): The learning rate + used to update parameter(s). + momentum (float): Momentum factor. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]): + Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + use_nesterov (bool, optional): Whether to use nesterov momentum. + Defaults to False. + no_weight_decay_name (Optional[str]): List of names of no weight decay + parameters split by white space. Defaults to None. + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler], + momentum: float, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + use_nesterov: bool = False, + no_weight_decay_name: Optional[str] = None, + ): + super().__init__() + self.learning_rate = learning_rate + self.momentum = momentum + self.weight_decay = weight_decay + self.grad_clip = grad_clip + self.use_nesterov = use_nesterov + self.no_weight_decay_name_list = ( + no_weight_decay_name.split() if no_weight_decay_name else [] + ) + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = None + if len(self.no_weight_decay_name_list) > 0: + params_with_decay = [] + params_without_decay = [] + for m in model_list: + params = [ + p + for n, p in m.named_parameters() + if not any(nd in n for nd in self.no_weight_decay_name_list) + ] + params_with_decay.extend(params) + params = [ + p + for n, p in m.named_parameters() + if any(nd in n for nd in self.no_weight_decay_name_list) + ] + params_without_decay.extend(params) + parameters = [ + {"params": params_with_decay, "weight_decay": self.weight_decay}, + {"params": params_without_decay, "weight_decay": 0.0}, + ] + else: + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.Momentum( + learning_rate=self.learning_rate, + momentum=self.momentum, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + use_nesterov=self.use_nesterov, + parameters=parameters, + ) + if hasattr(opt, "_use_multi_tensor"): + opt = optim.Momentum( + learning_rate=self.learning_rate, + momentum=self.momentum, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + parameters=parameters, + use_nesterov=self.use_nesterov, + use_multi_tensor=True, + ) + return opt + + +class Adam: + """Adam: A Method for Stochastic Optimization. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler], optional): The learning rate + used to update parameter(s). Defaults to 0.001. + beta1 (float, optional): The exponential decay rate for the 1st moment + estimates. Defaults to 0.9. + beta2 (float, optional): The exponential decay rate for the 2nd moment + estimates. Defaults to 0.999. + epsilon (float, optional): A small float value for numerical stability. + Defaults to 1e-08. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]) + : Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + lazy_mode (bool, optional): Whether to enable lazy mode for moving-average. + Defaults to False. + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler] = 0.001, + beta1: float = 0.9, + beta2: float = 0.999, + epsilon: float = 1e-08, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + lazy_mode: bool = False, + amsgrad: bool = False, + ): + self.learning_rate = learning_rate + self.beta1 = beta1 + self.beta2 = beta2 + self.epsilon = epsilon + self.learning_rate = learning_rate + self.weight_decay = weight_decay + self.grad_clip = grad_clip + self.lazy_mode = lazy_mode + self.amsgrad = amsgrad + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.Adam( + learning_rate=self.learning_rate, + beta1=self.beta1, + beta2=self.beta2, + epsilon=self.epsilon, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + lazy_mode=self.lazy_mode, + parameters=parameters, + amsgrad=self.amsgrad, + ) + return opt + + +class LBFGS: + """The L-BFGS is a quasi-Newton method for solving an unconstrained optimization + problem over a differentiable function. Closely related is the Newton method + for minimization. + + Args: + learning_rate (float, optional): The learning rate + used to update parameter(s). Defaults to 1.0. + max_iter (int, optional): Maximal number of iterations per optimization step. + Defaults to 1. + max_eval (Optional[int]): Maximal number of function evaluations per + optimization step. Defaults to None. + tolerance_grad (float, optional): Termination tolerance on first order + optimality. Defaults to 1e-07. + tolerance_change (float, optional): Termination tolerance on function + value/parameter changes. Defaults to 1e-09. + history_size (int, optional): Update history size. Defaults to 100. + line_search_fn (Optional[Literal["strong_wolfe"]]): Either 'strong_wolfe' or + None. Defaults to "strong_wolfe". + """ + + def __init__( + self, + learning_rate: float = 1.0, + max_iter: int = 1, + max_eval: Optional[int] = None, + tolerance_grad: float = 1e-07, + tolerance_change: float = 1e-09, + history_size: int = 100, + line_search_fn: Optional[Literal["strong_wolfe"]] = "strong_wolfe", + ): + self.lr = learning_rate + self.max_iter = max_iter + self.max_eval = max_eval + self.tolerance_grad = tolerance_grad + self.tolerance_change = tolerance_change + self.history_size = history_size + self.line_search_fn = line_search_fn + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + try: + opt = getattr(optim, "LBFGS")( + learning_rate=self.lr, + max_iter=self.max_iter, + max_eval=self.max_eval, + tolerance_grad=self.tolerance_grad, + tolerance_change=self.tolerance_change, + history_size=self.history_size, + line_search_fn=self.line_search_fn, + parameters=parameters, + ) + except AttributeError: + opt = getattr(incubate_optim, "LBFGS")( + learning_rate=self.lr, + max_iter=self.max_iter, + max_eval=self.max_eval, + tolerance_grad=self.tolerance_grad, + tolerance_change=self.tolerance_change, + history_size=self.history_size, + line_search_fn=self.line_search_fn, + parameters=parameters, + ) + return opt + + +class RMSProp: + """Root Mean Squared Propagation (RMSProp) is an unpublished, adaptive learning + rate method. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler]): The learning rate + used to update parameter(s) + rho (float, optional): Factor ρ in equation. Defaults to 0.95. + epsilon (float, optional): Factor ϵ in equation as a smoothing term. + Defaults to 1e-6. + momentum (float, optional):β in equation is the momentum term. Defaults to 0.0. + weight_decay (Optional[Union[float, regularizer.L1Decay, regularizer.L2Decay]]): + Regularization strategy. Defaults to None. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler], + rho: float = 0.95, + epsilon: float = 1e-6, + momentum: float = 0.0, + weight_decay: Optional[ + Union[float, regularizer.L1Decay, regularizer.L2Decay] + ] = None, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + ): + super().__init__() + self.learning_rate = learning_rate + self.momentum = momentum + self.rho = rho + self.epsilon = epsilon + self.weight_decay = weight_decay + self.grad_clip = grad_clip + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + opt = optim.RMSProp( + learning_rate=self.learning_rate, + momentum=self.momentum, + rho=self.rho, + epsilon=self.epsilon, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + parameters=parameters, + ) + return opt + + +class AdamW: + """AdamW is implemented based on DECOUPLED WEIGHT DECAY REGULARIZATION. + + Args: + learning_rate (Union[float, optim.lr.LRScheduler], optional): The learning rate + used to update parameter(s). Defaults to 0.001. + beta1 (float, optional): The exponential decay rate for the 1st moment + estimates. Defaults to 0.9. + beta2 (float, optional): The exponential decay rate for the 2nd moment + estimates. Defaults to 0.999. + epsilon (float, optional): A small float value for numerical stability. + Defaults to 1e-8. + weight_decay (float, optional): Regularization coefficient. Defaults to 0.01. + grad_clip (Optional[Union[nn.ClipGradByNorm, nn.ClipGradByValue, + nn.ClipGradByGlobalNorm]]): Gradient clipping strategy. Defaults to None. + no_weight_decay_name (Optional[str]): List of names of no weight decay + parameters split by white space. Defaults to None. + one_dim_param_no_weight_decay (bool, optional): Apply no weight decay on + 1-D parameter(s). Defaults to False. + """ + + def __init__( + self, + learning_rate: Union[float, optim.lr.LRScheduler] = 0.001, + beta1: float = 0.9, + beta2: float = 0.999, + epsilon: float = 1e-8, + weight_decay: float = 0.001, + grad_clip: Optional[ + Union[nn.ClipGradByNorm, nn.ClipGradByValue, nn.ClipGradByGlobalNorm] + ] = None, + no_weight_decay_name: Optional[str] = None, + one_dim_param_no_weight_decay: bool = False, + amsgrad: bool = False, + multi_precision: bool = False, + ): + super().__init__() + self.learning_rate = learning_rate + self.beta1 = beta1 + self.beta2 = beta2 + self.epsilon = epsilon + self.grad_clip = grad_clip + self.weight_decay = weight_decay + self.no_weight_decay_name_list = ( + no_weight_decay_name.split() if no_weight_decay_name else [] + ) + self.one_dim_param_no_weight_decay = one_dim_param_no_weight_decay + self.amsgrad = amsgrad + self.multi_precision = multi_precision + + def __call__(self, model_list: Union[nn.Layer, Tuple[nn.Layer, ...]]): + # model_list is None in static graph + if not isinstance(model_list, (tuple, list)): + model_list = (model_list,) + parameters = ( + sum([m.parameters() for m in model_list], []) if model_list else None + ) + + # TODO(gaotingquan): Model_list is None when in static graph, "no_weight_decay" + # not work. + if model_list is None: + if ( + self.one_dim_param_no_weight_decay + or len(self.no_weight_decay_name_list) != 0 + ): + msg = '"AdamW" does not support setting "no_weight_decay" in static ' + +"graph. Please use dynamic graph." + logger.error(Exception(msg)) + raise Exception(msg) + + self.no_weight_decay_param_name_list = ( + [ + p.name + for model in model_list + for n, p in model.named_parameters() + if any(nd in n for nd in self.no_weight_decay_name_list) + ] + if model_list + else [] + ) + + if self.one_dim_param_no_weight_decay: + self.no_weight_decay_param_name_list += ( + [ + p.name + for model in model_list + for n, p in model.named_parameters() + if len(p.shape) == 1 + ] + if model_list + else [] + ) + + opt = optim.AdamW( + learning_rate=self.learning_rate, + beta1=self.beta1, + beta2=self.beta2, + epsilon=self.epsilon, + parameters=parameters, + weight_decay=self.weight_decay, + grad_clip=self.grad_clip, + apply_decay_param_fun=self._apply_decay_param_fun, + amsgrad=self.amsgrad, + multi_precision=self.multi_precision, + ) + return opt + + def _apply_decay_param_fun(self, name): + return name not in self.no_weight_decay_param_name_list + + +class OptimizerList: + """OptimizerList which wrap more than one optimizer. + NOTE: LBFGS is not supported yet. + + Args: + optimizer_list (Tuple[optim.Optimizer, ...]): Optimizers listed in a tuple. + """ + + def __init__(self, optimizer_list: Tuple[optim.Optimizer, ...]): + super().__init__() + self._opt_list = optimizer_list + if "LBFGS" in set(misc.typename(opt) for opt in optimizer_list): + raise ValueError("LBFGS is not supported in OptimizerList yet.") + + def step(self): + for opt in self._opt_list: + opt.step() + + def clear_grad(self): + for opt in self._opt_list: + opt.clear_grad() + + def get_lr(self) -> float: + """Return learning rate of first optimizer""" + return self._opt_list[0].get_lr() + + def set_state_dict(self, state_dicts: List[Dict[str, "paddle.Tensor"]]): + for i, opt in enumerate(self._opt_list): + opt.set_state_dict(state_dicts[i]) + + def state_dict(self) -> List[Dict[str, "paddle.Tensor"]]: + state_dicts = [opt.state_dict() for opt in self._opt_list] + return state_dicts + + def __len__(self) -> int: + return len(self._opt_list) + + def __getitem__(self, idx): + return self._opt_list[idx] + + def __setitem__(self, idx, opt): + raise NotImplementedError("Can not modify any item in OptimizerList.") + + def __iter__(self): + yield from iter(self._opt_list) diff --git a/ppmat/predictor/__init__.py b/ppmat/predictor/__init__.py new file mode 100644 index 00000000..34a0df0d --- /dev/null +++ b/ppmat/predictor/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ppmat.predictor.base import BasePredictor + +__all__ = [ + "BasePredictor", +] diff --git a/ppmat/predictor/base.py b/ppmat/predictor/base.py new file mode 100644 index 00000000..afb3f0cf --- /dev/null +++ b/ppmat/predictor/base.py @@ -0,0 +1,245 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import os.path as osp +from typing import Optional + +import paddle +import pandas as pd +from omegaconf import OmegaConf +from pymatgen.core import Structure +from tqdm import tqdm + +from ppmat.datasets.transform import build_post_transforms +from ppmat.models import build_graph_converter +from ppmat.models import build_model +from ppmat.models import build_model_from_name +from ppmat.utils import logger +from ppmat.utils import save_load + + +class BasePredictor: + """ + + This class provides an interface for predicting properties of crystalline + structures using pre-trained deep learning models. + + Supports two initialization modes: + + 1. **Automatic Model Loading** + Specify `model_name` and `weights_name` to automatically download + and load pre-trained weights from the `MODEL_REGISTRY`. + + 2. **Custom Model Loading** + Provide explicit `config_path` and `checkpoint_path` to load + custom-trained models from local files. + + Args: + model_name (Optional[str], optional): + Name of the pre-defined model architecture + from the `MODEL_REGISTRY` registry. + When specified, associated weights + will be automatically downloaded. Defaults to None. + + weights_name (Optional[str], optional): + Specific pre-trained weight identifier. + Used only when `model_name` is provided. Valid options include: + - 'best.pdparams' (highest validation performance) + - 'latest.pdparams' (most recent training checkpoint) + - Custom weight files ending with '.pdparams' + Defaults to None. + + config_path (Optional[str], optional): + Path to model configuration file (YAML) + for custom models. Required when not using predefined `model_name`. + Defaults to None. + + checkpoint_path (Optional[str], optional): + Path to model checkpoint file + (.pdparams) for custom models. Required when not using predefined + `model_name`. Defaults to None. + """ + + def __init__( + self, + model_name: Optional[str] = None, + weights_name: Optional[str] = None, + config_path: Optional[str] = None, + checkpoint_path: Optional[str] = None, + work_dir: Optional[str] = None, + device: Optional[str] = "cpu", + ): + + self.model_name = model_name + self.device = device + self.config_path = config_path and osp.join(work_dir, config_path) + self.checkpoint_path = checkpoint_path and osp.join(work_dir, checkpoint_path) + self.weights_name = weights_name and osp.join(work_dir, weights_name) + + def load_inference_model(self, interface_type: Optional[str] = None): + # if model_name is not None, + # then config_path and checkpoint_path must be provided + if self.model_name is None: + assert self.config_path is not None and self.checkpoint_path is not None, ( + "config_path and checkpoint_path must be provided " + "when model_name is None." + ) + logger.info( + f"Loading configuration from {self.config_path} " + f"and model from {self.checkpoint_path}." + ) + + config = OmegaConf.load(self.config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + if interface_type: + model_config = self.modify_model_config(interface_type, model_config) + else: + logger.info("No interface, use the model directly") + model = build_model(model_config) + save_load.load_pretrain(model, self.checkpoint_path) + else: + logger.info("Since model_name is given, downloading it...") + model, config = build_model_from_name(self.model_name, self.weights_name) + if interface_type: + model_config = config.get("Model") + config["Model"] = self.modify_model_config(interface_type, model_config) + else: + logger.info("No interface, use the model directly") + + self.model = model + self.config = config + + self.model.eval() + + self.predict_config = config.get("Predict", None) + self.eval_with_no_grad = self.predict_config.get("eval_with_no_grad", True) + + if self.predict_config is not None: + graph_converter_config = self.predict_config.get("graph_converter", None) + if graph_converter_config is not None: + self.graph_converter_fn = build_graph_converter(graph_converter_config) + else: + self.graph_converter_fn = None + + self.post_transforms_cfg = self.predict_config.get("post_transforms", None) + if self.post_transforms_cfg is not None: + self.post_transforms = build_post_transforms(self.post_transforms_cfg) + else: + self.post_transforms = None + + def modify_model_config( + self, + interface_type, + model_config, + ): + # TODO: support more models + if interface_type == "ase": + logger.info("Integrate ASE calculator") + if model_config["__class_name__"] == "CHGNet": + # CHGNet by default predicts energy per atom; + # convert it to total energy + model_config["__init_params__"]["is_intensive"] = False + logger.warning( + "CHGNet by default predicts energy per atom; " + "change 'is_intensive' to False to " + "predict total energy for ASE integration." + ) + elif model_config["__class_name__"] == "M3GNet": + pass + else: + raise NotImplementedError( + f"The model '{model_config.get('__class_name__')}' " + f"is not yet supported with ASE integration.\n" + f"Please ensure that the model predicts total energy, " + f"or manually adjust parameter according to the model.\n" + f"If this model should be supported, " + f"please add a special handling case here." + ) + elif interface_type == "lammps": + pass + return model_config + + def collect_structures( + self, + file_path: str, + ): + """ + pymatgen.core.Structure supported formats include: + CIF, POSCAR/CONTCAR, CHGCAR, LOCPOT, vasprun.xml, CSSR, + Netcdf and pymatgen's JSON-serialized structures. + + Args: + file_path (str): + The path of the input file or directory. + """ + if osp.isdir(file_path): + all_files = [ + osp.join(file_path, f) + for f in os.listdir(file_path) + if f.endswith(".cif") + ] + else: + all_files = [file_path] + logger.info(f"Load {len(all_files)} structures from {file_path}") + + # Read raw file + structures = [] + for file in tqdm(all_files): + try: + # read file by pymatgen package + structure = Structure.from_file(file) + structures.append(structure) + except Exception as e: + logger.warning("Error reading file: {}, skip it.\n{}".format(file, e)) + logger.info("Successfully read raw files and convert to pymatgen format") + return all_files, structures + + def graph_converter(self, structure): + if self.graph_converter_fn is None: + return structure + return self.graph_converter_fn(structure) + + def post_process(self, data): + if self.post_transforms is None: + return data + return self.post_transforms(data) + + def get_predict( + self, + files: list, + structures: list, + ): + results = [] + for structure in tqdm(structures): + data = self.graph_converter(structure) + data = data.tensor() + if self.eval_with_no_grad: + with paddle.no_grad(): + out = self.model.predict(data) + else: + out = self.model.predict(data) + out = self.post_process(out) + results.append(out) + + # save file names and output to csv file + if not results: + raise ValueError("No results to save csv file.") + df = pd.DataFrame(results) + df.insert(0, "file_name", files) + df.to_csv("results_pred_property.csv", index=False) + logger.info("Saved the prediction results.") diff --git a/ppmat/predictor/structures.py b/ppmat/predictor/structures.py new file mode 100644 index 00000000..8c31e0b1 --- /dev/null +++ b/ppmat/predictor/structures.py @@ -0,0 +1,77 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os + +from ase.build import bulk +from hydra.utils import instantiate +from pymatgen.io.ase import AseAtomsAdaptor + +from ppmat.utils import logger + + +def get_structure_from_file(work_dir, system, predictor): + """ + Reads structure data from specified file path. + Args: + work_dir: working directory + system: system configuration + predictor: predictor object for processing structure data + """ + + system["file_path"] = os.path.join(work_dir, system["file_path"]) + logger.info(f"Loading structures from files: {system['file_path']}.") + files, structures = predictor.collect_structures(file_path=system["file_path"]) + return files, structures + + +def get_structure_from_ase(system): + """ + Generates pymatgen Structure objects from ASE Atoms objects. + Args: + system: system configuration containing structure information + """ + + files, structures = [], [] + for i, s in enumerate(system["structures"]): + element = s["element"] + atom = bulk(element) + if "repeat" in s: + atom = atom.repeat(s["repeat"]) + structure = AseAtomsAdaptor().get_structure(atom) + formula = atom.get_chemical_formula() # Get chemical formula + structures.append(structure) + files.append(f"structure_{i}_{formula}") + logger.info(f"Using ASE provided structures (count: {len(structures)})") + return files, structures + + +def build_init_structures(config, predictor): + """ + Loads structure data from either file or ASE interface according to system config + Args: + config: system configuration + predictor: Predictor object for processing structure data + """ + + system = instantiate(config["System"]) + if system["interface"] == "load_file": + work_dir = config["Run"]["work_dir"] + files, structures = get_structure_from_file(work_dir, system, predictor) + elif system["interface"] == "ase": + files, structures = get_structure_from_ase(system) + else: + pass + return files, structures diff --git a/ppmat/sampler/__init__.py b/ppmat/sampler/__init__.py new file mode 100644 index 00000000..675cf5cb --- /dev/null +++ b/ppmat/sampler/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/ppmat/sampler/base_sampler.py b/ppmat/sampler/base_sampler.py new file mode 100644 index 00000000..90fe2e8a --- /dev/null +++ b/ppmat/sampler/base_sampler.py @@ -0,0 +1,975 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import os +import time +from typing import Dict +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +import numpy as np +import paddle +import paddle.nn.functional as F +import pandas as pd +from omegaconf import OmegaConf +from tqdm import tqdm + +from ppmat.datasets import build_dataloader +from ppmat.datasets import build_dataset_infos +from ppmat.datasets import set_signal_handlers +from ppmat.datasets.msd_nmr_dataset import DataLoaderCollection +from ppmat.datasets.transform import build_post_transforms +from ppmat.metrics import DiffNMRStreamingAdapter +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.models import build_model_from_name +from ppmat.models.diffnmr.extra_features_graph import DummyExtraFeatures +from ppmat.models.diffnmr.extra_features_graph import ExtraFeatures +from ppmat.models.diffnmr.extra_features_molecular_graph import ExtraMolecularFeatures +from ppmat.models.diffnmr.utils import diffgraphformer_utils +from ppmat.schedulers import scheduling_diffnmr +from ppmat.utils import logger +from ppmat.utils import save_load +from ppmat.utils.visualization import MolecularVisualization + + +class MolecularSampler: + """Molecular Sampler. + + This class provides an interface for sampling structures using pre-trained deep + learning models. Supports two initialization modes: + + 1. **Automatic Model Loading** + Specify `model_name` and `weights_name` to automatically download + and load pre-trained weights from the `MODEL_REGISTRY`. + + 2. **Custom Model Loading** + Provide explicit `config_path` and `checkpoint_path` to load + custom-trained models from local files. + + Args: + model_name (Optional[str], optional): Name of the pre-defined model architecture + from the `MODEL_REGISTRY` registry. When specified, associated weights + will be automatically downloaded. Defaults to None. + + weights_name (Optional[str], optional): Specific pre-trained weight identifier. + Used only when `model_name` is provided. Valid options include: + - 'best.pdparams' (highest validation performance) + - 'latest.pdparams' (most recent training checkpoint) + - Custom weight files ending with '.pdparams' + Defaults to None. + + config_path (Optional[str], optional): Path to model configuration file (YAML) + for custom models. Required when not using predefined `model_name`. + Defaults to None. + checkpoint_path (Optional[str], optional): Path to model checkpoint file + (.pdparams) for custom models. Required when not using predefined + `model_name`. Defaults to None. + """ + + def __init__( + self, + model_name: Optional[str] = None, + weights_name: Optional[str] = None, + config_path: Optional[str] = None, + checkpoint_path: Optional[str] = None, + ): + # if model_name is not None, then config_path and checkpoint_path must be + # provided + if model_name is None: + assert ( + config_path is not None and checkpoint_path is not None + ), "config_path and checkpoint_path must be provided when model_name is " + "None." + + logger.info(f"Loading model from {config_path} and {checkpoint_path}.") + + config = OmegaConf.load(config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + + # TODO: optimize in the future + set_signal_handlers() + train_data_cfg = config["Dataset"].get("train") + train_loader = build_dataloader(train_data_cfg) + + val_data_cfg = config["Dataset"].get("val") + val_loader = build_dataloader(val_data_cfg) + + test_data_cfg = config["Dataset"].get("test") + test_loader = build_dataloader(test_data_cfg) + + # build datasetinfo + dataloaders = DataLoaderCollection(train_loader, val_loader, test_loader) + dataset_infos = build_dataset_infos( + dataloaders=dataloaders, cfg=config, recompute_statistics=False + ) + train_smiles = dataset_infos.train_smiles + + # extra features + if ( + config["Model"]["__init_params__"]["diffmodel_cfg"]["extra_features"] + is not None + ): + extra_features = ExtraFeatures( + config["Model"]["__init_params__"]["diffmodel_cfg"][ + "extra_features" + ], + dataset_infos=dataset_infos, + ) + domain_features = ExtraMolecularFeatures( + dataset_infos=dataset_infos, + ) + else: + extra_features = DummyExtraFeatures() + domain_features = DummyExtraFeatures() + fallback_loader = train_loader or val_loader or test_loader + dataset_infos.compute_input_output_dims( + dataloader=fallback_loader, + extra_features=extra_features, + domain_features=domain_features, + conditionDim=config["Model"]["__init_params__"]["diffmodel_cfg"][ + "conditdim" + ], + ) + + # CLIP for sample metric + model_cfg = config["CLIP"] + self.clip = build_model( + model_cfg, + extra_features=extra_features, + domain_features=domain_features, + dataset_infos=dataset_infos, + ) + + # visualization tools + self.visualization_tools = MolecularVisualization( + dataset_infos=dataset_infos, + output_dir=config["Trainer"]["output_dir"], + ) + + model_cfg = config["Model"] + model = build_model( + model_cfg, + extra_features=extra_features, + domain_features=domain_features, + dataset_infos=dataset_infos, + visualization_tools=self.visualization_tools, + clip=self.clip, + ) + + self.pretrained_model_path = ( + checkpoint_path + if checkpoint_path is not None + else config.get("pretrained_model_path", None) + ) + self.pretrained_weight_name = ( + weights_name + if weights_name is not None + else config.get("pretrained_weight_name", None) + ) + save_load.load_pretrain( + model, self.pretrained_model_path, self.pretrained_weight_name + ) + + else: + logger.info("Since model_name is given, downloading it...") + model, config = build_model_from_name(model_name, weights_name) + + self.model = model + self.config = config + + self.model.eval() + + # sample config + sample_config = config.get("Sampler", None) + self.sample_config = sample_config + self.samp_per_val = sample_config["sample_every_val"] + self.visual_num = sample_config["visual_num"] + self.chains_left_to_save = sample_config["chains_to_save"] + self.number_chain_steps = sample_config["number_chain_steps"] + self.sample_batch_iters = sample_config["sample_batch_iters"] + self.metric_dict_sample = sample_config.get("out_dict", None) + self.flag_retrival_sampling = sample_config.get("flag_retrival_sampling", False) + self.flag_use_formula = sample_config.get("flag_use_formula", False) + self.flag_retrival_initilization = sample_config.get( + "flag_retrival_initilization", False + ) + self.num_candidates = sample_config.get("num_candidates", 1) + + self.post_transforms_cfg = self.sample_config.get("post_transforms", None) + if self.post_transforms_cfg is not None: + self.post_transforms = build_post_transforms(self.post_transforms_cfg) + else: + self.post_transforms = None + + # runtime info + self.rank = ( + int(paddle.distributed.get_rank()) + if paddle.distributed.is_initialized() + else 0 + ) + self.output_dir = self.config.get("Sampler", {}).get("output_dir", "./outputs") + os.makedirs(self.output_dir, exist_ok=True) + + if self.clip is not None: + setattr(self.model, "clip", self.clip) + + self.molecular_vectors, self.smiles_list = self._init_retrieval_bank( + self.sample_config, + ) + + self.streaming = DiffNMRStreamingAdapter( + t_scale=float(self.sample_config.get("t_scale", 1.0)), + dataset_infos=dataset_infos, + ) + self.streaming.bind( + model=self.model, + dataset_infos=dataset_infos, + clip=self.clip, + train_smiles=train_smiles, + num_candidate=self.num_candidates, + ) + setattr(self.model, "streaming_adapter", self.streaming) + + def compute_metric( + self, + save_path=None, + ): + self.output_dir = save_path if save_path is not None else self.output_dir + metrics_cfg = self.sample_config.get("metrics") + assert metrics_cfg is not None, "metrics config must be provided." + metrics_fn = build_metric(metrics_cfg) + + total_results = self.sample_by_dataloader( + self.output_dir, + ) + + metric = metrics_fn(total_results) + return metric + + def post_process(self, data): + if self.post_transforms is None: + return data + return self.post_transforms(data) + + def sample(self, data, sample_params=None): + if sample_params is None: + sample_params = {} + assert isinstance(sample_params, dict), "sample_params must be a dict or None." + pred_data = self.model.sample(data, **sample_params) + pred_data = self.post_process(pred_data) + return pred_data + + def sample_by_dataloader( + self, + save_path=None, + ): + self.output_dir = save_path if save_path is not None else self.output_dir + dataset_cfg = self.sample_config["data"] + data_loader = build_dataloader(dataset_cfg) + + # build_molecule_cfg = self.sample_config["build_molecule_cfg"] + # molecule_converter = BuildMolecule(**build_molecule_cfg) + + logger.info(f"Total iterations: {len(data_loader)}") + logger.info("Start sampling process...") + + self.model.eval() + epoch_id = 0 + + data_length = len(data_loader) + logger.message(f"Start to sample ... | Total Batches: {data_length}") + start = time.time() + + # sample epoch + metric_dict = self.sample_epoch( + data_loader, + epoch_id, + keep_onehot=self.flag_retrival_sampling, + num_candidates=self.num_candidates, + ) + + # log eval sample metric info + if paddle.distributed.get_rank() == 0: + msg = "Sample:" + msg += f" | sample_metric cost: {time.time() - start:.5f}s" + for k, v in metric_dict.items(): + if isinstance(v, paddle.Tensor): + v = v.item() if v.numel() == 1 else v.tolist() + if self.metric_dict_sample is None or k in self.metric_dict_sample: + msg += ( + f" | {k}(metric): {', '.join(f'{x:.5f}' for x in v)}" + if isinstance(v, (list, tuple)) + else f" | {k}(metric): {v:.5f}" + ) + logger.info(msg) + + @paddle.no_grad() + def sample_epoch( + self, + dataloader: paddle.io.DataLoader, + epoch_id: int, + num_candidates: int = 1, + keep_onehot: bool = False, + ): + """Run **one full sampling pass** over ``dataloader`` and collect metrics. + + This wrapper repeatedly calls :func:`sample_batch` to generate *multiple* + candidate molecules for every ground‑truth graph in the batch. The first + candidate of each batch is treated as the *default prediction* used for + classical metrics (validity, novelty, etc.). All *num_candidates* variants + can optionally be forwarded to *retrieval‑based* metrics that compare + `molVec` embeddings against an NMR‑condition embedding. + + Parameters + ---------- + self : TrainerLike + Trainer / Runner object that holds the diffusion ``model``, runtime + configs, logging utilities, etc. + dataloader : paddle.io.DataLoader + Yields tuples ``(graph, aux_data)`` where `graph` is a *pgl* style + MiniBatchGraph and `aux_data` is a dict containing scalar labels, + condition vectors and atom counts. TODO: recheck details. + epoch_id : int + Current epoch index – propagated to the metric logger so that saved + artefacts (csv / images) are grouped by epoch. + num_candidates : int, default 1 + How many independent candidate graphs to sample **per ground‑truth** + (first one is *pred*, remained serve retrieval evaluation). + keep_onehot : bool, default ``True`` + If *True* each candidate also returns padded one‑hot tensors + ``X_hot / E_hot`` that are later required by the `molVec` encoder. If + retrieval metrics are disabled you can set this to *False* to save + memory. + + Returns + ------- + dict + A flattened dictionary of scalar metrics produced by + :class:`SamplingMolecularMetrics` (top‑k accuracy, RDKit validity, + histogram MAE, etc.). + + Workflow + -------- + 1. Initialise an empty ``samples`` dict – this will be the *single* payload + passed to :pyclass:`SamplingMolecularMetrics`. + 2. Iterate over the dataloader + • convert sparse PGL graph → dense tensors (node/edge one‑hot). + • build four‑branch NMR condition vector. + • call :func:`sample_batch` ``num_candidates`` times. + • aggregate predictions, ground‑truth and (optionally) one‑hot tensors. + 3. Early‑exit when ``iters_left`` hits zero + 4. Call the metric layer *once* – avoids repeated RDKit initialisation and + keeps logging atomic. + """ + # Put the model in eval‑mode so layers like dropout / batch‑norm are frozen + self.model.eval() + + # used for early‑stopping a long dataloader when we only need a subset. + max_iters: int = self.sample_batch_iters + + # 1. pre‑allocate the data structure that SamplingMolecularMetrics expects + samples: Dict[str, Union[list, int]] = { + "pred": [], # first candidate of each ground‑truth + "true": [], # ground‑truth graphs + "n_all": 0, # total number of GT molecules processed + "node_mask_meta": [], # node mask metadata for each batch + "batch_condition": [], # 4‑branch NMR condition + "dict": ( + self.model._layers + if isinstance(self.model, paddle.DataParallel) + else self.model + ).dataset_info.atom_decoder, # id → element symbol + } + if keep_onehot: + # For retrieval metrics we need to keep *all* candidates & their one‑hot + samples["candidates"] = [[] for _ in range(num_candidates)] + samples["candidates_X"] = [[] for _ in range(num_candidates)] + samples["candidates_E"] = [[] for _ in range(num_candidates)] + + # 2. main loop over DataLoader + for iter_id, batch_data in enumerate(dataloader): + batch_graph = batch_data["graph"] + batch_property = batch_data["property"] + batch_spectrum = batch_data["spectrum"] + + # 2.a convert sparse graph to dense (one‑hot padded) representation + dense_data, node_mask = diffgraphformer_utils.to_dense( + paddle.to_tensor(batch_graph.node_feat["feat"]), + paddle.to_tensor(batch_graph.edges.T), + paddle.to_tensor(batch_graph.edge_feat["feat"]), + paddle.to_tensor(batch_graph.graph_node_id), + ) + dense_data = dense_data.mask(node_mask) # remove padding rows + + # basic batch tensors + batch_atomCount = paddle.to_tensor( + batch_property["atom_count"] + ) # [B] number of atoms + batch_y = paddle.to_tensor(batch_property["y"]) # labels (unused here) + batch_X, batch_E = dense_data.X, dense_data.E # one‑hot Node / Edge + bs = len(batch_y) # batch size + + # 2.b build four‑branch NMR condition tensor list + if hasattr(self.model, "seq_len_H1"): + cond_H = paddle.to_tensor(batch_spectrum["H_nmr"]) + cond_C = paddle.to_tensor(batch_spectrum["C_nmr"]) + num_H_peak = paddle.to_tensor(batch_spectrum["num_H_peak"]) + num_C_peak = paddle.to_tensor(batch_spectrum["num_C_peak"]) + batch_nmr = [cond_H, num_H_peak, cond_C, num_C_peak] + else: + batch_nmr = None # TODO: re‑implement for single‑branch condition + + # 2.c call `sample_batch` `num_candidates` times + for c_idx in range(num_candidates): + kwargs = dict( + model=self.model._layers + if isinstance(self.model, paddle.DataParallel) + else self.model, + batch_id=iter_id, + num_nodes=batch_atomCount, + batch_condition=batch_nmr, + batch_X=batch_X, + batch_E=batch_E, + batch_y=batch_y, + batch_size=bs, + visual_num=self.visual_num, + keep_chain=self.chains_left_to_save, + number_chain_steps=self.number_chain_steps, + return_onehot=keep_onehot, + flag_useformula=self.flag_use_formula, + iter_idx=c_idx, + ) + if self.flag_retrival_initilization: + kwargs.update( + retrival_initilization=self.flag_retrival_initilization, + clip=self.clip, + molecular_vectors=self.molecular_vectors, + smiles_list=self.smiles_list, + ) + res = self.sample_batch(**kwargs) + + if keep_onehot: + mol_pred, mol_true, X_hot, E_hot = res + samples["candidates"][c_idx].extend(mol_pred) + samples["candidates_X"][c_idx].extend(X_hot) + samples["candidates_E"][c_idx].extend(E_hot) + else: + mol_pred, mol_true = res # only discrete tensors + + # first candidate → default prediction for classical metrics + if c_idx == 0: + samples["pred"].extend(mol_pred) + samples["true"].extend(mol_true) + # samples["n_all"] += len(batch_y) # TODO right? + + # 2‑d) meta‑info used by retrieval metrics + if batch_nmr is not None: + samples["batch_condition"] = [None for _ in range(4)] + for i, t in enumerate(batch_nmr): + if samples["batch_condition"][i] is None: + samples["batch_condition"][i] = paddle.to_tensor(t) + else: + samples["batch_condition"][i] = paddle.concat( + [samples["batch_condition"][i], paddle.to_tensor(t)], axis=0 + ) + samples["node_mask_meta"].extend(batch_atomCount) + samples["n_all"] += bs + + # 2‑e) Early‑stop check + # We exit the loop once the number of processed mini‑batches reaches + # `max_iters`. + if iter_id + 1 >= max_iters: + break + + # 3. Pass everything to SamplingMolecularMetrics (single call) + self.streaming.update_step( + result={ + "samples": samples, + "epoch_id": epoch_id, + "local_rank": self.rank, + "output_dir": self.output_dir, + }, + batch=None, + stage="sample", + ) + metric_dict = self.streaming.compute_epoch(stage="sample") + + return metric_dict + + @paddle.no_grad() + def sample_batch( + self, + model, + batch_id: int, + batch_size: int, + batch_condition: List[paddle.Tensor], + number_chain_steps: int, + keep_chain: int, + visual_num: int, + batch_X: paddle.Tensor, + batch_E: paddle.Tensor, + batch_y: paddle.Tensor, + iter_idx: int, + num_nodes: Union[int, paddle.Tensor] = None, + flag_useformula: bool = False, + return_onehot: bool = False, + retrival_initilization: bool = False, + clip: paddle.nn.Layer = None, + molecular_vectors: paddle.Tensor = None, + smiles_list: List = None, + ) -> Union[Tuple[List, List], Tuple[List, List, paddle.Tensor, paddle.Tensor],]: + """Reverse–diffusion sampling in **Paddle dynamic graph**. + + Parameters + ---------- + model : DiffusionModelLike + The generator. Must expose attributes `T`, `node_dist`, `limit_dist`, + and method `sample_p_zs_given_zt`. + batch_id : int + Index of the current batch – used only for logging / visualisation. + batch_size : int + Number of graphs to sample in this call. + batch_condition : list[paddle.Tensor] + Four‑branch conditioning vector (¹H‑NMR, ¹H peaks, ¹³C‑NMR, ¹³C peaks). + number_chain_steps : int + How many intermediate frames to keep for visualisation. + keep_chain : int + Number of graph chains to retain (B‑dim truncation). + visual_num : int + Number of final samples to render via `visualization_tools`. + batch_X / batch_E : paddle.Tensor + One‑hot ground‑truth node / edge feature tensors (used for guidance or + as *oracle formula* when ``flag_useformula`` is True). + batch_y : paddle.Tensor + Additional labels (if any) required by the model. + iter_idx : int + Current iteration index for obtain candidates for retrival. + num_nodes : int | paddle.Tensor | None + Number of nodes per graph. When *None* the model samples from its own + learned distribution. + flag_useformula : bool + If *True* force the sampled node features to exactly equal the + provided one‑hot `batch_X` (for strict formula reconstruction). + return_onehot : bool + Whether to return the *padded* one‑hot tensors (`X_hot`, `E_hot`) in + addition to discrete index lists – required by molVec retrieval. + retrival_initilization : bool, default False + Whether to enable **retrieval‑based initialization**. + If True, the model will fetch the closest reference molecules + (using `molecular_vectors`) and use them as the first step of + the diffusion / sampling chain instead of pure noise. + clip : paddle.nn.Layer | None, default None + optional projection/clipping layer applied to latent features before + retrieval. + molecular_vectors : paddle.Tensor | None, default None + 2‑D tensor [N, D] containing embeddings of the reference molecule library + smiles_list : list[str] | None, default None + list of SMILES strings corresponding to those reference embeddings + + Returns + ------- + If ``return_onehot`` is **False** (default): + (molecule_list, molecule_list_true) + If ``return_onehot`` is **True**: + (molecule_list, molecule_list_true, X_hot, E_hot) + + Where + ``molecule_list[i] == [atom_index_vector, bond_matrix]`` and + ``molecule_list_true`` follows the same structure for ground‑truth. + """ + + # 1. Determine node counts and create a boolean mask for padded positions + if num_nodes is None: + # Sample number of nodes from the model's learned distribution + n_nodes = model.node_dist.sample_n(batch_size) + elif isinstance(num_nodes, int): + n_nodes = paddle.full([batch_size], num_nodes, dtype="int64") + else: + n_nodes = paddle.to_tensor(num_nodes) # assume Tensor + + n_max: int = int(paddle.max(n_nodes).item()) # ***largest graph size*** + + # `node_mask[b, i] == True` if node *i* is real for graph *b* + arange = paddle.arange(n_max).unsqueeze(0).expand([batch_size, n_max]) + node_mask = arange < n_nodes.unsqueeze(1) + + # 2. Initialise z_T with (categorical) noise and prepare trajectory buffers + # z(n_samples, n_nodes, n_features) + z_T = scheduling_diffnmr.sample_discrete_feature_noise( + limit_dist=model.limit_dist, node_mask=node_mask + ) + X_t, E_t, y_t = z_T.X, z_T.E, z_T.y + + chain_X = paddle.zeros([number_chain_steps, keep_chain, n_max], dtype="int64") + chain_E = paddle.zeros( + [number_chain_steps, keep_chain, n_max, n_max], dtype="int64" + ) + + # 3. Retrieval Initialization(Optional) + if retrival_initilization and batch_condition is not None: + logger.info("Sampling Initializing using Retrieval Method.") + output = clip.spectrum_encoder(batch_condition) + + similarities = self._batched_cosine_similarity( + output, molecular_vectors, 128 + ) + top_k = 1 + top_k_values, top_k_indices = paddle.topk(similarities, k=top_k, axis=1) + + if iter_idx == 0: + cols = 8 + lines = [] + for start in range(0, len(top_k_values), cols): + chunk = top_k_values[start : start + cols] + line = " | ".join( + f"{start+j} : {v.item():.3f}" for j, v in enumerate(chunk) + ) + lines.append(line) + logger.info( + "Highest Similarities (SampleID:Value)\n" + "\n".join(lines) + ) + + result_smiles = [] + for i in range(batch_size): + idx = top_k_indices[i].item() + result_smiles.append(smiles_list[idx]) + + node_list = [] + adj_matrix_list = [] + + for i in range(batch_size): + smiles = result_smiles[i] + current_node_mask = node_mask[i] + node_tensor_onehot, adjacency_matrix_onehot = graphs_from_mol( + smiles, current_node_mask, i, X_t, E_t + ) + node_list.append(node_tensor_onehot) + adj_matrix_list.append(adjacency_matrix_onehot) + + X_t = paddle.stack(node_list, axis=0) + E_t = paddle.stack(adj_matrix_list, axis=0) + + assert (E_t == paddle.transpose(E_t, [0, 2, 1])).all() + assert number_chain_steps < model.T + else: + logger.info("Start Initializing using Random Method.") + + # 4. Main reverse‑diffusion loop: t = T → 1 (s = t‑1) + for s_int in tqdm( + range(model.T - 1, -1, -1), + desc=f"Batch {batch_id} RepeatIter {iter_idx} sampling {model.T}→0", + unit="step", + ): + s_arr = paddle.full([batch_size, 1], float(s_int)) + t_arr = s_arr + 1.0 + s_norm, t_norm = s_arr / model.T, t_arr / model.T + + # One reverse‑diffusion step + sampled_s, discrete_sampled_s = scheduling_diffnmr.step( + model, + s=s_norm, + t=t_norm, + X_t=X_t, + E_t=E_t, + y_t=y_t, + node_mask=node_mask, + conditionVec=batch_condition, + batch_X=batch_X, + batch_E=batch_E, + batch_y=batch_y, + ) + X_t, E_t, y_t = sampled_s.X, sampled_s.E, sampled_s.y + if flag_useformula is True: + # Force atom types to match the provided formula (oracle guidance) + X_t = batch_X + + # save intermediate frames for the first `keep_chain` graphs + write_index = (s_int * number_chain_steps) // model.T + chain_X[write_index] = discrete_sampled_s.X[:keep_chain] + chain_E[write_index] = discrete_sampled_s.E[:keep_chain] + + # 5. Collapse padding → obtain discrete indices; optionally keep one‑hot + # Make a *clone* of `sampled_s` so that collapsing will not overwrite the + # one‑hot information we still need for molVec retrieval. + sampled_copy = copy.deepcopy(sampled_s) + + # 5‑a. Get discrete indices from the cloned tensor (padding removed) + sampled_collapse = sampled_copy.mask(node_mask, collapse=True) + X_idx, E_idx = sampled_collapse.X, sampled_collapse.E # [B, …] + if flag_useformula: + # Ensure indices follow the oracle molecular formula when required + X_idx = paddle.argmax(batch_X, axis=-1) + + # 5‑b. Optionally obtain **un‑collapsed** one‑hot tensors for retrieval. + if return_onehot: + # Call mask *without* collapse on the ORIGINAL `sampled_s`, which still + # contains one‑hot embeddings; shape stays [B, n_max, feat] + X_hot = sampled_s.mask(node_mask).X.numpy() + E_hot = sampled_s.mask(node_mask).E.numpy() + if flag_useformula: + # When formula guidance is enabled, the node one‑hot should exactly + # match the provided ground‑truth. + X_hot = batch_X.numpy() + X_hot = [X_hot[i] for i in range(X_hot.shape[0])] + E_hot = [E_hot[i] for i in range(E_hot.shape[0])] + else: + X_hot = E_hot = None + + # 6. Assemble Python lists for downstream RDKit / metrics + mol_list, mol_true = [], [] + n_nodes_np = n_nodes.numpy() + batch_X_idx = paddle.argmax(batch_X, axis=-1).numpy() + batch_E_idx = paddle.argmax(batch_E, axis=-1).numpy() + for i in range(batch_size): + n = n_nodes_np[i] + mol_list.append( + [ + X_idx[i, :n].numpy(), + E_idx[i, :n, :n].numpy(), + ] + ) + mol_true.append( + [ + batch_X_idx[i, :n], + batch_E_idx[i, :n, :n], + ] + ) + + # 7. Optional visualisation via model.visualization_tools + if self.visualization_tools is not None: + # 7.a Prepare the chain for visualization and saving + if keep_chain > 0: + # pick the last frame of the chain add the top index of chain_X/E(index + # 0) + final_X_chain = X_idx[:keep_chain] + final_E_chain = E_idx[:keep_chain] + chain_X[ + 0 + ] = final_X_chain # Overwrite last frame with the resulting X, E + chain_E[0] = final_E_chain + + # revers time sequence for visualization + chain_X = scheduling_diffnmr.reverse_tensor(chain_X) + chain_E = scheduling_diffnmr.reverse_tensor(chain_E) + + # Repeat last frame to see final sample better + chain_X = paddle.concat( + [chain_X, chain_X[-1:].tile([10, 1, 1])], axis=0 + ) + chain_E = paddle.concat( + [chain_E, chain_E[-1:].tile([10, 1, 1, 1])], axis=0 + ) + assert chain_X.shape[0] == (number_chain_steps + 10) + + # 7.b use visulize tools + num_mols = chain_X.shape[1] + # draw animation of diffusion process of generated molecules + for i in range(num_mols): + chain_X_np = chain_X[:, i, :].numpy() + chain_E_np = chain_E[:, i, :, :].numpy() + self.visualization_tools.visualize_chain( + batch_id, i, chain_X_np, chain_E_np + ) + # draw picture of predicted and true molecules + self.visualization_tools.visualizeNmr( + batch_id, + mol_list, + mol_true, + visual_num, + ) + + if return_onehot: + return mol_list, mol_true, X_hot, E_hot + return mol_list, mol_true + + def _init_retrieval_bank(self, cfg): + """ + load the molecular vector library for retrieval initialization/evaluation + from configuration + """ + if not cfg: + return None, None + path = cfg.get("retrival_database_path", None) + if path is None or not os.path.exists(path): + logger.warning(f"[retrieval_bank] path missing or not found: {path}") + return None, None + + ext = os.path.splitext(path)[1].lower() + embs, smiles = None, None + try: + if ext == ".csv": + data = pd.read_csv(path) + data["molecularRep"] = data["molecularRep"].apply( + lambda x: np.fromstring(x.strip("[]"), sep=" ") + ) + # to paddle tensor + embs = paddle.to_tensor( + np.stack(data["molecularRep"].values), dtype="float32" + ) + smiles = data["smiles"].tolist() + else: + raise ValueError(f"Unsupported retrieval bank ext: {ext}") + except Exception as e: + logger.warning(f"[retrieval_bank] load failed: {e}") + return None, None + + return embs, smiles + + def _batched_cosine_similarity(self, output, molecular_vectors, batch_size_cut): + similarities = [] + for i in range(0, molecular_vectors.shape[0], batch_size_cut): + batch_vectors = molecular_vectors[i : i + batch_size_cut] + sim = F.cosine_similarity( + output.unsqueeze(1), batch_vectors.unsqueeze(0), axis=-1 + ) # [batch_size, batch_size_cut] + similarities.append(sim) + return paddle.concat(similarities, axis=1) # [batch_size, N] + + +def graphs_from_mol(smiles, node_mask, i, X, E): + """ + Convert an SMILES string into graph presentation (node features & adjacency). + + Parameters + ---------- + smiles : str + The molecule in SMILES format. + + node_mask : paddle.Tensor, shape [max_nodes] + Boolean / 0‑1 mask telling how many node slots are valid + for *this* molecule inside the batch tensor. + + i : int + Index of the current sample in the mini‑batch (1st dimension of X/E). + + X : paddle.Tensor, shape [B, max_nodes, n_atom_types] + Pre‑allocated batch buffer for node one‑hot features. + Will be updated in‑place at index `i`. + + E : paddle.Tensor, shape [B, max_nodes, max_nodes, n_bond_types] + Pre‑allocated batch buffer for adjacency one‑hot tensors. + Will be updated in‑place at index `i`. + + + Returns: + node_list: A one-hot encoded list representing atom types. + adjacency_matrix: A 3D numpy array (one-hot encoded) representing the adjacency + matrix of the molecule. + """ + from rdkit import Chem + + num_trueAtoms = paddle.sum(node_mask) + + # dictionary to map atom symbols to integer values + atom_encoder = { + "C": 0, + "N": 1, + "O": 2, + "F": 3, + "P": 4, + "S": 5, + "Cl": 6, + "Br": 7, + "I": 8, + } + atom_encoder_len = len(atom_encoder) # Number of distinct atom types + # print(f'graphs_from_mol_smiles{smiles}') + # initialize the node list + node_list = [] + mol = Chem.MolFromSmiles(smiles) + if mol is None: + print(f"Invalid SMILES or parsing failed: {smiles}") + return X[i], E[i] + + for atom in mol.GetAtoms(): + symbol = atom.GetSymbol() + # print(f'symbol{symbol}') + if symbol in atom_encoder: + node_list.append(atom_encoder[symbol]) + else: + raise ValueError(f"Atom symbol {symbol} not in atom_encoder") + + # initialize adjacency matrix + num_atoms = len(node_list) + node_tensor = paddle.to_tensor(node_list, dtype="int64") + node_mask_len = node_mask.shape[0] + padding = paddle.full((node_mask_len - num_atoms,), fill_value=-1, dtype="int64") + node_tensor = paddle.concat((node_tensor, padding)) + num_atoms_max = len(node_tensor) + + # Convert node_tensor to one-hot + node_tensor_onehot = F.one_hot( + node_tensor.clip(min=0), num_classes=atom_encoder_len + ).astype( + "float32" + ) # Ignore -1 for num_classes + node_tensor_onehot[node_tensor == -1] = 0 # Set -1 positions to all-zero vectors + if num_atoms >= num_trueAtoms: + X[i][:num_trueAtoms] = node_tensor_onehot[:num_trueAtoms] + node_tensor_onehot = X[i] + else: + X[i][:num_atoms] = node_tensor_onehot[:num_atoms] + node_tensor_onehot = X[i] + + adjacency_matrix = np.full((num_atoms_max, num_atoms_max), -1, dtype="int") + adjacency_matrix[:num_atoms, :num_atoms] = 0 + + for bond in mol.GetBonds(): + start_idx = bond.GetBeginAtomIdx() + end_idx = bond.GetEndAtomIdx() + + # determine bond type + bond_type = bond.GetBondType() + if bond_type == Chem.rdchem.BondType.SINGLE: + bond_value = 1 + elif bond_type == Chem.rdchem.BondType.DOUBLE: + bond_value = 2 + elif bond_type == Chem.rdchem.BondType.TRIPLE: + bond_value = 3 + elif bond_type == Chem.rdchem.BondType.AROMATIC: + bond_value = 4 + else: + bond_value = 0 + + # populate adjacency matrix (symmetric) + adjacency_matrix[start_idx, end_idx] = bond_value + adjacency_matrix[end_idx, start_idx] = bond_value + + # Convert adjacency_matrix to one-hot + max_bond_type = 4 # Maximum bond type value (single, double, triple, aromatic) + adjacency_matrix_tensor = paddle.to_tensor(adjacency_matrix, dtype="int64") + adjacency_matrix_onehot = F.one_hot( + adjacency_matrix_tensor.clip(min=0), num_classes=max_bond_type + 1 + ).astype("float32") + adjacency_matrix_onehot[ + adjacency_matrix_tensor == -1 + ] = 0 # Set -1 positions to all-zero vectors + + if num_atoms >= num_trueAtoms: + E[i][:num_trueAtoms, :num_trueAtoms] = adjacency_matrix_onehot[ + :num_trueAtoms, :num_trueAtoms + ] + adjacency_matrix_onehot = E[i] + else: + E[i][:num_atoms, :num_atoms] = adjacency_matrix_onehot[:num_atoms, :num_atoms] + adjacency_matrix_onehot = E[i] + + return node_tensor_onehot, adjacency_matrix_onehot diff --git a/ppmat/schedulers/__init__.py b/ppmat/schedulers/__init__.py new file mode 100644 index 00000000..5e119f9b --- /dev/null +++ b/ppmat/schedulers/__init__.py @@ -0,0 +1,67 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +from typing import Dict + +import ppmat.schedulers.scheduling_wrapped_sde_ve as scheduling_wrapped_sde_ve # noqa +from ppmat.schedulers.scheduling_d3pm import D3PMScheduler +from ppmat.schedulers.scheduling_ddpm import DDPMScheduler +from ppmat.schedulers.scheduling_diffprior import NoiseScheduler +from ppmat.schedulers.scheduling_lattice_vp import LatticeVPSDEScheduler +from ppmat.schedulers.scheduling_sde_ve import ScoreSdeVeScheduler +from ppmat.schedulers.scheduling_sde_ve import ScoreSdeVeSchedulerWrapped +from ppmat.schedulers.scheduling_asu_ve_sde import ASUVESDEScheduler + +NumAtomsVarianceAdjustedWrappedVESDE = ( + scheduling_wrapped_sde_ve.NumAtomsVarianceAdjustedWrappedVESDE +) +__all__ = [ + "build_scheduler", + "DDPMScheduler", + "ScoreSdeVeScheduler", + "ScoreSdeVeSchedulerWrapped", + "LatticeVPSDEScheduler", + "NumAtomsVarianceAdjustedWrappedVESDE", + "D3PMScheduler", + "NoiseScheduler", + "ASUVESDEScheduler", +] + + +def build_scheduler(cfg: Dict): + """Build scheduler. + + Args: + cfg (Dict): Scheduler config. + + Returns: + scheduler: Scheduler object. + """ + if cfg is None: + return None + cfg = copy.deepcopy(cfg) + + if "__class_name__" not in cfg: + assert isinstance(cfg, dict) + scheduler_dict = {} + for key, sub_cfg in cfg.items(): + scheduler_dict[key] = build_scheduler(sub_cfg) + return scheduler_dict + + class_name = cfg.pop("__class_name__") + init_params = cfg.pop("__init_params__") + + scheduler = eval(class_name)(**init_params) + return scheduler diff --git a/ppmat/schedulers/scheduling_asu_ve_sde.py b/ppmat/schedulers/scheduling_asu_ve_sde.py new file mode 100644 index 00000000..1145f9be --- /dev/null +++ b/ppmat/schedulers/scheduling_asu_ve_sde.py @@ -0,0 +1,229 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ASU-wrapped VE-SDE scheduler with space-group-aware sigma norms.""" + +import math +import os + +import numpy as np +import paddle +import paddle.nn as nn + +from ppmat.utils import logger + +MAX_WYCKOFF_SITES = 27 + + +class ASUVESDEScheduler(nn.Layer): + """VE-SDE scheduler with ASU-wrapped sigma norms for space-group-aware score matching.""" + + def __init__( + self, + num_timesteps: int, + sigma_min: float = 0.01, + sigma_max: float = 0.5, + sigma_norm_type: str = "asu_wrapped", + num_lattice_translations: int = 5, + num_monte_carlo_samples: int = 10_000, + ): + super().__init__() + self.num_timesteps = num_timesteps + self.sigma_min = sigma_min + self.sigma_max = sigma_max + self.num_lattice_translations = num_lattice_translations + + sigmas = paddle.to_tensor( + np.exp(np.linspace(np.log(sigma_min), np.log(sigma_max), num_timesteps)), + dtype=paddle.float32, + ) + + if sigma_norm_type == "unwrapped": + _sigma_norms = self._sigma_norm_unwrapped(sigmas) + elif sigma_norm_type == "asu_wrapped": + _sigma_norms = self._sigma_norm_asu_wrapped(sigmas, num_monte_carlo_samples) + else: + raise AttributeError(f"Unknown sigma_norm_type: {sigma_norm_type}") + + self.register_buffer( + "sigmas", + paddle.concat([paddle.zeros([1]), sigmas], axis=0), + ) + self.register_buffer( + "sigma_norms", + paddle.concat( + [paddle.ones([230, MAX_WYCKOFF_SITES, 1]), _sigma_norms], + axis=-1, + ), + ) + + def uniform_sample_timestep(self, batch_size: int) -> paddle.Tensor: + """Uniformly sample integer timesteps in [1, num_timesteps].""" + return paddle.randint( + low=1, + high=self.num_timesteps + 1, + shape=[batch_size], + dtype=paddle.int64, + ) + + def d_sigma_sq_dt(self, t: float) -> float: + """d(sigma^2)/dt for ODE sampling.""" + t = max(t, 1e-5) + T = float(self.num_timesteps) + sigma_ratio = self.sigma_max / self.sigma_min + return 2 * (self.sigma_min / (T - 1)) * math.log(sigma_ratio) * (sigma_ratio ** ((t - 1) / (T - 1))) + + @paddle.no_grad() + def _sigma_norm_unwrapped(self, sigmas: paddle.Tensor) -> paddle.Tensor: + sigma_norms = 1.0 / sigmas + return sigma_norms[None, None, :].expand([230, MAX_WYCKOFF_SITES, -1]) + + @paddle.no_grad() + def _sigma_norm_asu_wrapped( + self, sigmas: paddle.Tensor, num_monte_carlo_samples: int = 10_000, + ) -> paddle.Tensor: + """Monte Carlo estimate of expected score L2 norm for ASU-wrapped normal.""" + from ppmat.models.sgequidiff.global_vars import DATA_DIRECTORY, _ensure_wyckoff_shape_decomp + from ppmat.datasets.asu_crystal import uniformly_sample_point_in_asu_wyckoff_site + from ppmat.models.sgequidiff.data_utils import ( + get_space_group_ops_and_conventional_atoms, + d_log_p_asu_wrapped_normal, + ) + + num_timesteps = sigmas.shape[0] + num_lattice_translations = self.num_lattice_translations + + cache_filename = os.path.join( + str(DATA_DIRECTORY), + f"expected_score_norms_minSigma{float(sigmas[0]):0.3f}" + f"_maxSigma{float(sigmas[-1]):0.3f}" + f"_T{num_timesteps}_{num_monte_carlo_samples}MCsamples" + f"_{num_lattice_translations}LatticeTranslations.pdparams", + ) + logger.info(f"Checking cache: {cache_filename}") + logger.info(f"Cache exists: {os.path.exists(cache_filename)}") + if os.path.exists(cache_filename): + logger.info(f"Loading sigma norms from: {cache_filename}") + sigma_norms = paddle.load(cache_filename) + logger.info(f"Successfully loaded sigma_norms with shape: {sigma_norms.shape}") + return sigma_norms + logger.info(f"Cache not found, computing sigma_norms...") + + _ensure_wyckoff_shape_decomp() + import pickle + with open(DATA_DIRECTORY / "wyckoff_shape_decomposition.pkl", "rb") as f: + wyckoff_shape_decomp_dict = pickle.load(f) + + import ppmat.models.sgequidiff.global_vars as global_vars + asu_wyckoff_dict = global_vars.asu_wyckoff_dict + sigma_norms = paddle.zeros([230, MAX_WYCKOFF_SITES, num_timesteps], dtype=paddle.float32) + + for sg_num in range(230, 0, -1): + sg_dict = asu_wyckoff_dict[str(sg_num)] + wyckoff_letters = sg_dict["ordered_wyckoff_letters"] + + x0s, wsi = uniformly_sample_point_in_asu_wyckoff_site( + space_group_numbers=[str(sg_num)] * len(wyckoff_letters), + wyckoff_letters=wyckoff_letters, + dictionary_of_wyckoffs_in_asu=asu_wyckoff_dict, + dictionary_of_wyckoff_shape_decompositions=wyckoff_shape_decomp_dict, + hull_equations_3d=global_vars.asu_hull_equations, + n_samples_per_wyckoff=num_monte_carlo_samples, + return_sampled_wyckoff_shape_indices=True, + ) + + space_group_idx = paddle.to_tensor([sg_num - 1], dtype=paddle.int64) + + for i, letter in enumerate(wyckoff_letters): + _wyckoff_idx = paddle.to_tensor([i], dtype=paddle.int64) + _wyckoff_idx_expanded = _wyckoff_idx.expand([num_monte_carlo_samples]) + + _, _, _, map_conv_to_asu, _, _, orbited_x, unique_indices = ( + get_space_group_ops_and_conventional_atoms( + x0s[i], + paddle.zeros_like(_wyckoff_idx_expanded), + _wyckoff_idx_expanded, + space_group_idx, + n_atoms_per_xtal=paddle.to_tensor( + [num_monte_carlo_samples], dtype=paddle.int64 + ), + ) + ) + map_unique_conv_to_asu = map_conv_to_asu[unique_indices] + + _chunks = min(200, num_timesteps) + for sigma_idxs in paddle.chunk( + paddle.arange(num_timesteps), chunks=_chunks + ): + batch_sigmas = sigmas[sigma_idxs] + norms = [] + for t_idx, sigma in enumerate(batch_sigmas.tolist()): + noise = paddle.randn([num_monte_carlo_samples, 3]) * sigma + xts = x0s[i] + noise + + scores = d_log_p_asu_wrapped_normal( + xts, orbited_x, map_unique_conv_to_asu, + num_lattice_translations, sigma, + ) + norm_t = ((scores ** 2).sum(axis=-1)).sqrt().mean() + norms.append(float(norm_t.item())) + + sigma_norms[sg_num - 1, i, sigma_idxs] = paddle.to_tensor( + norms, dtype=paddle.float32 + ) + + paddle.save(sigma_norms, cache_filename) + logger.info(f"Saved sigma norms to: {cache_filename}") + return sigma_norms + + @paddle.no_grad() + def step_pred(self, x: paddle.Tensor, score: paddle.Tensor, t: int, noise: paddle.Tensor) -> paddle.Tensor: + """Predictor step: x_{t} = x_{t+1} + (sigma_{t+1}^2 - sigma_t^2) * score + sqrt(sigma_{t+1}^2 - sigma_t^2) * noise.""" + sigma_sq_diff = self.sigmas[t + 1] ** 2 - self.sigmas[t] ** 2 + return x + sigma_sq_diff * score + paddle.sqrt(sigma_sq_diff) * noise + + @paddle.no_grad() + def step_correct( + self, x: paddle.Tensor, score: paddle.Tensor, noise: paddle.Tensor, + snr: float = 0.4, max_step_size: float = 1e6, + ) -> paddle.Tensor: + """Corrector (Langevin) step: x = x + step_size * score + sqrt(2 * step_size) * noise.""" + noise_norm = ((noise ** 2).sum(axis=-1)).sqrt().mean() + grad_norm = ((score ** 2).sum(axis=-1)).sqrt().mean() + step_size = 2 * (snr * noise_norm / (grad_norm + 1e-12)) ** 2 + step_size = paddle.where(noise == 0.0, paddle.zeros_like(noise), step_size * paddle.ones_like(noise)) + step_size = paddle.nan_to_num(step_size, nan=0.0, posinf=max_step_size, neginf=-max_step_size) + return x + step_size * score + paddle.sqrt(2 * step_size) * noise + + @paddle.no_grad() + def get_interpolated_sigma_norm_t(self, t, space_group_indices, wyckoff_indices): + """Interpolate sigma_norm at real time t.""" + t_val = float(t.item()) + assert 0.0 <= t_val <= self.num_timesteps + + t_below = int(math.floor(t_val)) + t_above = int(math.ceil(t_val)) + if t_below == t_above: + if t_below == 0: + t_below, t_above = 0, 1 + elif t_below == self.num_timesteps: + t_above = self.num_timesteps + t_below = self.num_timesteps - 1 + else: + t_above = t_below + 1 + + p = (t_val - t_below) / max(t_above - t_below, 1) + sn_below = self.sigma_norms[space_group_indices, wyckoff_indices, t_below] + sn_above = self.sigma_norms[space_group_indices, wyckoff_indices, t_above] + return (1 - p) * sn_below + p * sn_above diff --git a/ppmat/schedulers/scheduling_d3pm.py b/ppmat/schedulers/scheduling_d3pm.py new file mode 100644 index 00000000..5f9b3298 --- /dev/null +++ b/ppmat/schedulers/scheduling_d3pm.py @@ -0,0 +1,481 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Literal +from typing import Optional +from typing import Tuple +from typing import Union + +import paddle + +from ppmat.utils.misc import aggregate_per_sample +from ppmat.utils.misc import maybe_expand + + +class D3PMScheduler: + """D3PM Scheduler + + Args: + num_train_timesteps (int, optional): Number of training timesteps. Defaults to + 1000. + beta_start (float, optional): Beta start. Defaults to 0.001. + beta_end (float, optional): Beta end. Defaults to 0.1. + beta_schedule (str, optional): Beta schedule. Defaults to "standard". + scale (float, optional): Scale, used when `beta_schedule` is set to `standard`. + Defaults to 1.0. + dim (int, optional): Total dimension. Defaults to 101. + """ + + def __init__( + self, + num_train_timesteps: int = 1000, + beta_start: float = 0.001, + beta_end: float = 0.1, + beta_schedule: str = "standard", + scale: float = 1.0, + dim: int = 101, + ): + self.num_train_timesteps = num_train_timesteps + self.beta_start = beta_start + self.beta_end = beta_end + self.beta_schedule = beta_schedule + self.scale = scale + self.dim = dim + + if beta_schedule == "standard": + steps = paddle.linspace( + 0, num_train_timesteps - 1, num_train_timesteps, dtype=paddle.float32 + ) + self.betas = 1 / (scale * num_train_timesteps - steps) + else: + raise NotImplementedError( + f"{beta_schedule} does is not implemented for {self.__class__}" + ) + + self.alphas = paddle.concat( + [paddle.to_tensor([1.0], dtype=paddle.float32), 1.0 - self.betas], + ) + self.state = paddle.cumprod(x=self.alphas, dim=0) + self.state[-1] = 0.0 + + def to_discrete_time(self, t, N, T): + return (t * (N - 1) / T).astype(dtype="int64") + + def get_qt_given_q0( + self, + q0, + t, + return_logits: bool = False, + make_one_hot=False, + epsilon=1e-20, + ): + if make_one_hot: + assert q0.dtype in ["int32", "int64", paddle.int32, paddle.int64] + q0 = paddle.eye(num_rows=self.dim)[q0] + assert q0.dtype in ["float32", paddle.float32] + assert len(tuple(q0.shape)) == 2 + p = self.state[t] + non_mask_prob = p[:, None] * q0[:, :-1] + mask_prob = 1 - non_mask_prob.sum(axis=-1) + prob_at_time_t = ( + mask_prob[:, None] * paddle.eye(num_rows=self.dim)[self.dim - 1][None] + ) + prob_at_time_t[:, :-1] = non_mask_prob + prob_at_time_t = paddle.where(condition=t[:, None] == 0, x=q0, y=prob_at_time_t) + if return_logits: + return paddle.log(x=prob_at_time_t + epsilon) + else: + return prob_at_time_t + + def add_noise( + self, + original_samples: paddle.Tensor, + timesteps: paddle.Tensor, + batch_idx: paddle.Tensor = None, + ) -> paddle.Tensor: + # only support absorbing state + # Q_t[i][j] = 1, when i = j = m + # = 1 - β_t, when i = j ≠ m + # = β_t, when j = m and i ≠ m + + # for example, for atom type, original_samples = [32, 2, 5, 6] + original_samples = paddle.eye(num_rows=self.dim)[original_samples] + + timesteps = ( + maybe_expand( + self.to_discrete_time(t=timesteps, N=self.num_train_timesteps, T=1.0), + batch_idx, + ) + + 1 + ) + + p = self.state[timesteps] + non_mask_prob = p[:, None] * original_samples[:, :-1] + mask_prob = 1 - non_mask_prob.sum(axis=-1) + prob_at_time_t = ( + mask_prob[:, None] * paddle.eye(num_rows=self.dim)[self.dim - 1][None] + ) + prob_at_time_t[:, :-1] = non_mask_prob + prob_at_time_t = paddle.where( + condition=timesteps[:, None] == 0, x=original_samples, y=prob_at_time_t + ) + + logits = paddle.log(x=prob_at_time_t + 1e-20) + noisy_samples = paddle.distribution.Categorical(logits=logits).sample() + + return noisy_samples + + def qt_reverse( + self, qt_plus_1, t, return_logits=False, make_one_hot=False, epsilon=1e-20 + ): + """Get q(x_{t+1} | x_t), for each possible value of x_t. Thus, the rows of the + output do not sum to 1. + + Args: + qt_plus_1: an array of floats specifying a distribution over q(x_{t+1} | x_0). + t: t in q(x_{t+1} | x_t). + return_logits: if True, return the output logits + make_one_hot: if True, will convert q(x_{t+1}) to floats if needed. + epsilon: a small number to normalize logits conversion with, if needed. + + Returns: + q(x_{t+1} | x_t), shape [num_samples, num_classes]. + """ + if make_one_hot: + assert qt_plus_1.dtype in ["int64", "int32", paddle.int32, paddle.int64] + qt_plus_1 = paddle.eye(num_rows=self.dim)[qt_plus_1] + assert qt_plus_1.dtype in ["float32", paddle.float32] + beta = self.betas[t] + non_mask_prob = (1 - beta)[:, None] * qt_plus_1[:, :-1] + beta[ + :, None + ] * qt_plus_1[:, -1:] + prob_at_time_t = ( + paddle.eye(num_rows=self.dim)[self.dim - 1][None] * qt_plus_1[:, -1:] + ) + prob_at_time_t[:, :-1] = non_mask_prob + if return_logits: + return paddle.log(x=prob_at_time_t + epsilon) + else: + return prob_at_time_t + + def sample_and_compute_posterior_q( + self, + x_0, + t, + samples=None, + transition_probs=None, + return_logits=True, + return_transition_probs=False, + transition_probs_in_logits=True, + make_one_hot=True, + epsilon=1e-20, + step_size=1, + ): + + if make_one_hot: + assert x_0.dtype in ["int64", "int32", paddle.int32, paddle.int64] + x_0 = paddle.eye(num_rows=self.dim)[x_0].reshape( + tuple(x_0.shape) + (self.dim,) + ) + assert x_0.dtype in ["float32", paddle.float32] + assert t.dtype in ["int64", "int32", paddle.int32, paddle.int64] + prob_at_time_t = self.get_qt_given_q0(q0=x_0, t=t) + prob_at_time_t_plus_one = self.get_qt_given_q0(q0=x_0, t=t + step_size) + + if samples is None and transition_probs is not None: + raise ValueError("samples were not provided but transition_probs were.") + if samples is None: + logits = paddle.log(x=prob_at_time_t_plus_one + epsilon) + samples = paddle.distribution.Categorical(logits=logits).sample() + if transition_probs is None: + if step_size > 1: + transition_probs = paddle.eye(num_rows=self.dim)[samples] + for i in range(step_size): + transition_probs = self.qt_reverse( + qt_plus_1=transition_probs, + make_one_hot=False, + t=t + step_size - 1 - i, + ) + else: + transition_probs = self.qt_reverse( + qt_plus_1=samples, make_one_hot=True, t=t + ) + if not transition_probs_in_logits and not return_logits: + raise ValueError( + "Cannot exclude transition probs from logits if return_logits is false." + ) + if return_logits: + posterior_logits = paddle.log(x=prob_at_time_t + epsilon) + if transition_probs_in_logits: + posterior_logits += paddle.log(x=transition_probs + epsilon) + if return_transition_probs: + return posterior_logits, samples, transition_probs + else: + return posterior_logits, samples + else: + raise NotImplementedError() + # posterior = transition_probs * prob_at_time_t + # denominator = paddle.sum(denominator, axis=-1, keepdim=True) + + # posterior = posterior / denominator + # if return_transition_probs: + # return posterior, samples, transition_probs + # else: + # return posterior, samples + + def p_forward( + self, + logits, + x_t, + t, + predict_x0=True, + return_x0=False, + return_logits=False, + special_case_x0=False, + transition_probs=None, + transition_probs_in_logits=True, + maximum_likelihood=False, + epsilon=1e-20, + step_size=1, + ): + """Returns probabilities from the reverse process p(x_{t-1} | x_t). + + Args: + logits: the logits for the model's predictions at time t. + x_t: the current value of x_t to condition on. + t: the timestep t. + predict_x0: if True, assumes the model output corresponds to its prediction + for p(x_0 | x_t). Otherwise assumes model predicts p(x_{t-1} | x_t). + return_x0: if True, will return probs for x_0 as well as x_{t-1}. + return_logits: if True, will return logits instead of probabilities. + special_case_x0: if True, will directly predict x0 instead of using the + forward process probabilities. + transition_probs: if provided, q(x_{t+1} | x_t) probs to reuse. + transition_probs_in_logits: if False, will ignore transition probs in logits + (only allowed if return_logits is True). This is because this term is + independent of theta. + maximum_likelihood: if true, will draw the most likely x0 before applying + the forward process. + epsilon: a small number. + step_size: step size to compute posterior from. + + Returns: + probabilities for q(x_{t-1} | x_t) (and probabilities for x0 if predict_x0 + is True) + """ + assert not (step_size > 1 and not predict_x0) + + probs = paddle.nn.functional.softmax(logits, axis=-1) + if not predict_x0: + retval = logits if return_logits else probs + if return_x0: + return retval, None + else: + return retval + if maximum_likelihood: + probs = probs.argmax(axis=-1) + qt_probs, _ = self.sample_and_compute_posterior_q( + x_0=probs, + t=t - step_size, + make_one_hot=maximum_likelihood, + return_logits=return_logits, + transition_probs_in_logits=transition_probs_in_logits, + transition_probs=transition_probs, + samples=x_t, + epsilon=epsilon, + step_size=step_size, + ) + retval_x0 = logits if return_logits else probs + retval = qt_probs + mask = (t == step_size) & paddle.to_tensor(special_case_x0) + retval = ( + mask[:, None].astype(retval_x0.dtype) * retval_x0 + + mask.logical_not()[:, None].astype(retval.dtype) * retval + ) + if return_x0: + return retval, retval_x0 + else: + return retval + + def compute_kl_reverse_process( + self, + x_start, + t, + x_t_plus_1, + logits, + predict_x0: bool = True, + log_space: bool = False, + label_smoothing: float = 0.0, + hybrid_lambda: float = 0.0, + use_cached_transition: bool = True, + target_mask: Optional[paddle.Tensor] = None, + step_size: int = 1, + ): + """ + Computes KL divergence between reverse process and forward process. + """ + assert x_start.dtype in ["int32", "int64", paddle.int32, paddle.int64] + if step_size > 1 and not predict_x0: + raise ValueError("cannot skip steps when not predicting x0.") + q_t, x_t_plus_1, transition_probs = self.sample_and_compute_posterior_q( + x_0=x_start, + t=t, + return_logits=log_space, + return_transition_probs=True, + step_size=step_size, + samples=x_t_plus_1, + ) + + transition_probs = transition_probs if use_cached_transition else None + p_t = self.p_forward( + logits=logits, + x_t=x_t_plus_1, + t=t + step_size, + predict_x0=predict_x0, + return_x0=predict_x0 and hybrid_lambda > 0.0, + return_logits=log_space, + transition_probs=transition_probs, + step_size=step_size, + ) + hybrid_loss = paddle.to_tensor(data=0.0, place=x_start.place) + if predict_x0 and hybrid_lambda > 0.0: + p_t, p_0 = p_t + if log_space: + cross_entropy = paddle.nn.functional.cross_entropy( + input=p_0, + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + else: + cross_entropy = paddle.nn.functional.cross_entropy( + input=(p_0 + 1e-07).log(), + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + hybrid_loss = hybrid_lambda * cross_entropy + assert ( + not q_t.isnan().astype("bool").any() + and not p_t.isnan().astype("bool").any() + ) + if log_space: + d1 = paddle.distribution.Categorical(logits=q_t) + d2 = paddle.distribution.Categorical(logits=p_t) + kl = paddle.distribution.kl_divergence(p=d1, q=d2) + cross_entropy = paddle.nn.functional.cross_entropy( + input=p_t, + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + else: + d1 = paddle.distribution.Categorical(logits=(q_t + 1e-07).log()) + d2 = paddle.distribution.Categorical(logits=(p_t + 1e-07).log()) + kl = paddle.distribution.kl_divergence(p=d1, q=d2) + cross_entropy = paddle.nn.functional.cross_entropy( + input=(p_t + 1e-07).log(), + label=x_start, + label_smoothing=label_smoothing, + reduction="none", + ) + if target_mask is not None: + kl = kl * target_mask + cross_entropy = cross_entropy * target_mask + hybrid_loss = hybrid_loss * target_mask + mask = t == 0 + base_loss = ( + mask.astype(cross_entropy.dtype) * cross_entropy + + mask.logical_not().astype(kl.dtype) * kl + ) + loss = base_loss + hybrid_loss + return loss, base_loss, cross_entropy + + def compute_loss( + self, + score_model_output: paddle.Tensor, + t: paddle.Tensor, + batch_idx, + batch_size: int, + x: paddle.Tensor, + noisy_x: paddle.Tensor, + reduce: Literal["sum", "mean"], + d3pm_hybrid_lambda: float = 0.0, + ) -> paddle.Tensor: + t = maybe_expand(self.to_discrete_time(t, N=1000, T=1.0), batch_idx) + loss, base_loss, cross_entropy = self.compute_kl_reverse_process( + x.astype(dtype="int64"), + t, + logits=score_model_output, + log_space=True, + hybrid_lambda=d3pm_hybrid_lambda, + x_t_plus_1=noisy_x.astype(dtype="int64"), + ) + loss_per_structure = aggregate_per_sample( + loss, batch_idx=batch_idx, reduce=reduce, batch_size=batch_size + ) + base_loss_per_structure = aggregate_per_sample( + base_loss, batch_idx=batch_idx, reduce=reduce, batch_size=batch_size + ) + cross_entropy_per_structure = aggregate_per_sample( + cross_entropy, batch_idx=batch_idx, reduce=reduce, batch_size=batch_size + ) + return loss_per_structure, base_loss_per_structure, cross_entropy_per_structure + + def prior_sampling( + self, + shape: Union[list, Tuple], + ) -> paddle.Tensor: + """Generate one sample from the prior distribution, $p_T(x)$.""" + sample = paddle.full(shape=shape, fill_value=self.dim - 1, dtype="int64") + return sample + + def step( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + ): + """ + Takes the atom types at time t and returns the atom types at time t-1, + sampled using the learned reverse atom diffusion model. + + Look at https://github.com/google-research/google-research/blob/master/d3pm/text/diffusion.py + """ + t = self.to_discrete_time(t=t, N=self.num_train_timesteps, T=1.0) + + class_logits = score + x_sample = paddle.distribution.Categorical(logits=class_logits).sample() + + class_probs = paddle.nn.functional.softmax(x=class_logits, axis=-1) + # class_expected = paddle.argmax(x=class_probs, axis=-1) + + class_logits, _ = self.sample_and_compute_posterior_q( + x_0=class_probs, + t=t[batch_idx].to("int64"), + make_one_hot=False, + samples=x, + return_logits=True, + ) + x_sample = paddle.distribution.Categorical(logits=class_logits).sample() + + class_expected = paddle.argmax( + x=paddle.nn.functional.softmax( + x=class_logits.to(class_probs.dtype), axis=-1 + ), + axis=-1, + ) + + return x_sample, class_expected diff --git a/ppmat/schedulers/scheduling_ddpm.py b/ppmat/schedulers/scheduling_ddpm.py new file mode 100644 index 00000000..58655bbe --- /dev/null +++ b/ppmat/schedulers/scheduling_ddpm.py @@ -0,0 +1,652 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# This file is adapted from https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers + +import math +from dataclasses import dataclass +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +import numpy as np +import paddle + +from ppmat.utils.paddle_utils import randn_tensor + + +@dataclass +class DDPMSchedulerOutput: + """ + Output class for the scheduler's `step` function output. + + Args: + prev_sample (`paddle.Tensor` of shape `(batch_size, num_channels, height, + width)` for images): Computed sample `(x_{t-1})` of previous timestep. + `prev_sample` should be used as next model input in the denoising loop. + pred_original_sample (`paddle.Tensor` of shape `(batch_size, num_channels, + height, width)` for images): The predicted denoised sample `(x_{0})` based + on the model output from the current timestep. `pred_original_sample` can + be used to preview progress or for guidance. + """ + + prev_sample: paddle.Tensor + pred_original_sample: Optional[paddle.Tensor] = None + + +def betas_for_alpha_bar( + num_diffusion_timesteps, + max_beta=0.999, + alpha_transform_type="cosine", +): + """ + Create a beta schedule that discretizes the given alpha_t_bar function, which + defines the cumulative product of (1-beta) over time from t = [0,1]. + + Contains a function alpha_bar that takes an argument t and transforms it to the + cumulative product of (1-beta) up to that part of the diffusion process. + + + Args: + num_diffusion_timesteps (`int`): the number of betas to produce. + max_beta (`float`): the maximum beta to use; use values lower than 1 to + prevent singularities. + alpha_transform_type (`str`, *optional*, default to `cosine`): the type of + noise schedule for alpha_bar. Choose from `cosine` or `exp` + + Returns: + betas (`np.ndarray`): the betas used by the scheduler to step the model outputs + """ + if alpha_transform_type == "cosine": + + def alpha_bar_fn(t): + return math.cos((t + 0.008) / 1.008 * math.pi / 2) ** 2 + + elif alpha_transform_type == "exp": + + def alpha_bar_fn(t): + return math.exp(t * -12.0) + + else: + raise ValueError(f"Unsupported alpha_tranform_type: {alpha_transform_type}") + + betas = [] + for i in range(num_diffusion_timesteps): + t1 = i / num_diffusion_timesteps + t2 = (i + 1) / num_diffusion_timesteps + betas.append(min(1 - alpha_bar_fn(t2) / alpha_bar_fn(t1), max_beta)) + return paddle.to_tensor(betas, dtype=paddle.float32) + + +def rescale_zero_terminal_snr(betas): + """ + Rescales betas to have zero terminal SNR Based on + https://arxiv.org/pdf/2305.08891.pdf (Algorithm 1) + + + Args: + betas (`paddle.Tensor`): + the betas that the scheduler is being initialized with. + + Returns: + `paddle.Tensor`: rescaled betas with zero terminal SNR + """ + # Convert betas to alphas_bar_sqrt + alphas = 1.0 - betas + alphas_cumprod = paddle.cumprod(alphas, dim=0) + alphas_bar_sqrt = alphas_cumprod.sqrt() + + # Store old values. + alphas_bar_sqrt_0 = alphas_bar_sqrt[0].clone() + alphas_bar_sqrt_T = alphas_bar_sqrt[-1].clone() + + # Shift so the last timestep is zero. + alphas_bar_sqrt -= alphas_bar_sqrt_T + + # Scale so the first timestep is back to the old value. + alphas_bar_sqrt *= alphas_bar_sqrt_0 / (alphas_bar_sqrt_0 - alphas_bar_sqrt_T) + + # Convert alphas_bar_sqrt to betas + alphas_bar = alphas_bar_sqrt**2 # Revert sqrt + alphas = alphas_bar[1:] / alphas_bar[:-1] # Revert cumprod + alphas = paddle.concat([alphas_bar[0:1], alphas]) + betas = 1 - alphas + + return betas + + +class DDPMScheduler: + """ + `DDPMScheduler` explores the connections between denoising score matching and + Langevin dynamics sampling. + + This model inherits from [`SchedulerMixin`] and [`ConfigMixin`]. Check the + superclass documentation for the generic methods the library implements for all + schedulers such as loading and saving. + + Args: + num_train_timesteps (`int`, defaults to 1000): + The number of diffusion steps to train the model. + beta_start (`float`, defaults to 0.0001): + The starting `beta` value of inference. + beta_end (`float`, defaults to 0.02): + The final `beta` value. + beta_schedule (`str`, defaults to `"linear"`): + The beta schedule, a mapping from a beta range to a sequence of betas for + stepping the model. Choose from `linear`, `scaled_linear`, or + `squaredcos_cap_v2`. + variance_type (`str`, defaults to `"fixed_small"`): + Clip the variance when adding noise to the denoised sample. Choose from + `fixed_small`, `fixed_small_log`, `fixed_large`, `fixed_large_log`, + `learned` or `learned_range`. + clip_sample (`bool`, defaults to `True`): + Clip the predicted sample for numerical stability. + clip_sample_range (`float`, defaults to 1.0): + The maximum magnitude for sample clipping. Valid only when + `clip_sample=True`. + prediction_type (`str`, defaults to `epsilon`, *optional*): + Prediction type of the scheduler function; can be `epsilon` (predicts the + noise of the diffusion process), `sample` (directly predicts the noisy + sample`) or `v_prediction` (see section 2.4 of [Imagen + Video](https://imagen.research.google/video/paper.pdf) paper). + thresholding (`bool`, defaults to `False`): + Whether to use the "dynamic thresholding" method. This is unsuitable for + latent-space diffusion models such as Stable Diffusion. + dynamic_thresholding_ratio (`float`, defaults to 0.995): + The ratio for the dynamic thresholding method. Valid only when + `thresholding=True`. + sample_max_value (`float`, defaults to 1.0): + The threshold value for dynamic thresholding. Valid only when + `thresholding=True`. + timestep_spacing (`str`, defaults to `"leading"`): + The way the timesteps should be scaled. Refer to Table 2 of the + [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) + for more information. + steps_offset (`int`, defaults to 0): + An offset added to the inference steps. You can use a combination of + `offset=1` and `set_alpha_to_one=False` to make the last step use step 0 + for the previous alpha product like in Stable Diffusion. + rescale_betas_zero_snr (`bool`, defaults to `False`): + Whether to rescale the betas to have zero terminal SNR. This enables + the model to generate very bright and dark samples instead of limiting it + to samples with medium brightness. + """ + + def __init__( + self, + num_train_timesteps: int = 1000, + beta_start: float = 0.0001, + beta_end: float = 0.02, + beta_schedule: str = "linear", + trained_betas: Optional[Union[np.ndarray, List[float]]] = None, + variance_type: str = "fixed_small", + clip_sample: bool = True, + prediction_type: str = "epsilon", + thresholding: bool = False, + dynamic_thresholding_ratio: float = 0.995, + clip_sample_range: float = 1.0, + sample_max_value: float = 1.0, + timestep_spacing: str = "leading", + steps_offset: int = 0, + rescale_betas_zero_snr: int = False, + ): + self.num_train_timesteps = num_train_timesteps + self.beta_start = beta_start + self.beta_end = beta_end + self.beta_schedule = beta_schedule + self.trained_betas = trained_betas + self.variance_type = variance_type + self.clip_sample = clip_sample + self.prediction_type = prediction_type + self.thresholding = thresholding + self.dynamic_thresholding_ratio = dynamic_thresholding_ratio + self.clip_sample_range = clip_sample_range + self.sample_max_value = sample_max_value + self.timestep_spacing = timestep_spacing + self.steps_offset = steps_offset + self.rescale_betas_zero_snr = rescale_betas_zero_snr + + if trained_betas is not None: + self.betas = paddle.to_tensor(trained_betas, dtype=paddle.float32) + elif beta_schedule == "linear": + self.betas = paddle.linspace( + beta_start, beta_end, num_train_timesteps, dtype=paddle.float32 + ) + elif beta_schedule == "scaled_linear": + # this schedule is very specific to the latent diffusion model. + self.betas = ( + paddle.linspace( + beta_start**0.5, + beta_end**0.5, + num_train_timesteps, + dtype=paddle.float32, + ) + ** 2 + ) + elif beta_schedule == "squaredcos_cap_v2": + # Glide cosine schedule + self.betas = betas_for_alpha_bar(num_train_timesteps) + elif beta_schedule == "sigmoid": + # GeoDiff sigmoid schedule + betas = paddle.linspace(-6, 6, num_train_timesteps) + self.betas = ( + paddle.nn.functional.sigmoid(betas) * (beta_end - beta_start) + + beta_start + ) + else: + raise NotImplementedError( + f"{beta_schedule} does is not implemented for {self.__class__}" + ) + + # Rescale for zero SNR + if rescale_betas_zero_snr: + self.betas = rescale_zero_terminal_snr(self.betas) + + self.alphas = 1.0 - self.betas + self.alphas_cumprod = paddle.cumprod(self.alphas, 0) + self.one = paddle.to_tensor(1.0) + + # standard deviation of the initial noise distribution + self.init_noise_sigma = 1.0 + + # setable values + self.custom_timesteps = False + self.num_inference_steps = None + self.timesteps = paddle.to_tensor( + np.arange(0, num_train_timesteps)[::-1].copy() + ) + + self.variance_type = variance_type + + def scale_model_input( + self, sample: paddle.Tensor, timestep: Optional[int] = None + ) -> paddle.Tensor: + """ + Ensures interchangeability with schedulers that need to scale the denoising + model input depending on the current timestep. + + Args: + sample (`paddle.Tensor`): + The input sample. + timestep (`int`, *optional*): + The current timestep in the diffusion chain. + + Returns: + `paddle.Tensor`: + A scaled input sample. + """ + return sample + + def set_timesteps( + self, + num_inference_steps: Optional[int] = None, + timesteps: Optional[List[int]] = None, + ): + """ + Sets the discrete timesteps used for the diffusion chain (to be run before + inference). + + Args: + num_inference_steps (`int`): + The number of diffusion steps used when generating samples with a + pre-trained model. If used, `timesteps` must be `None`. + timesteps (`List[int]`, *optional*): + Custom timesteps used to support arbitrary spacing between timesteps. + If `None`, then the default timestep spacing strategy of equal spacing + between timesteps is used. If `timesteps` is passed, + `num_inference_steps` must be `None`. + + """ + if num_inference_steps is not None and timesteps is not None: + raise ValueError( + "Can only pass one of `num_inference_steps` or `custom_timesteps`." + ) + + if timesteps is not None: + for i in range(1, len(timesteps)): + if timesteps[i] >= timesteps[i - 1]: + raise ValueError("`custom_timesteps` must be in descending order.") + + if timesteps[0] >= self.num_train_timesteps: + raise ValueError( + f"`timesteps` must start before `self.train_timesteps`:" + f" {self.num_train_timesteps}." + ) + + timesteps = np.array(timesteps, dtype=np.int64) + self.custom_timesteps = True + else: + if num_inference_steps > self.num_train_timesteps: + raise ValueError( + f"`num_inference_steps`: {num_inference_steps} cannot be larger " + f"than `self.train_timesteps`: {self.num_train_timesteps} as the " + "unet model trained with this scheduler can only handle" + f" maximal {self.num_train_timesteps} timesteps." + ) + + self.num_inference_steps = num_inference_steps + self.custom_timesteps = False + + # "linspace", "leading", "trailing" corresponds to annotation of + # Table 2. of https://arxiv.org/abs/2305.08891 + if self.timestep_spacing == "linspace": + timesteps = ( + np.linspace(0, self.num_train_timesteps - 1, num_inference_steps) + .round()[::-1] + .copy() + .astype(np.int64) + ) + elif self.timestep_spacing == "leading": + step_ratio = self.num_train_timesteps // self.num_inference_steps + # creates integer timesteps by multiplying by ratio + # casting to int to avoid issues when num_inference_step is power of 3 + timesteps = ( + (np.arange(0, num_inference_steps) * step_ratio) + .round()[::-1] + .copy() + .astype(np.int64) + ) + timesteps += self.steps_offset + elif self.timestep_spacing == "trailing": + step_ratio = self.num_train_timesteps / self.num_inference_steps + # creates integer timesteps by multiplying by ratio + # casting to int to avoid issues when num_inference_step is power of 3 + timesteps = np.round( + np.arange(self.num_train_timesteps, 0, -step_ratio) + ).astype(np.int64) + timesteps -= 1 + else: + raise ValueError( + f"{self.timestep_spacing} is not supported. Please make sure to " + "choose one of 'linspace', 'leading' or 'trailing'." + ) + + self.timesteps = paddle.to_tensor(timesteps) + + def _get_variance(self, t, predicted_variance=None, variance_type=None): + prev_t = self.previous_timestep(t) + + alpha_prod_t = self.alphas_cumprod[t] + alpha_prod_t_prev = self.alphas_cumprod[prev_t] if prev_t >= 0 else self.one + current_beta_t = 1 - alpha_prod_t / alpha_prod_t_prev + + # For t > 0, compute predicted variance βt (see formula (6) and (7) from https://arxiv.org/pdf/2006.11239.pdf) + # and sample from it to get previous sample + # x_{t-1} ~ N(pred_prev_sample, variance) == add variance to pred_sample + variance = (1 - alpha_prod_t_prev) / (1 - alpha_prod_t) * current_beta_t + + # we always take the log of variance, so clamp it to ensure it's not 0 + variance = paddle.clip(variance, min=1e-20) + + if variance_type is None: + variance_type = self.variance_type + + # hacks - were probably added for training stability + if variance_type == "fixed_small": + variance = variance + # for rl-diffuser https://arxiv.org/abs/2205.09991 + elif variance_type == "fixed_small_log": + variance = paddle.log(variance) + variance = paddle.exp(0.5 * variance) + elif variance_type == "fixed_large": + variance = current_beta_t + elif variance_type == "fixed_large_log": + # Glide max_log + variance = paddle.log(current_beta_t) + elif variance_type == "learned": + return predicted_variance + elif variance_type == "learned_range": + min_log = paddle.log(variance) + max_log = paddle.log(current_beta_t) + frac = (predicted_variance + 1) / 2 + variance = frac * max_log + (1 - frac) * min_log + + return variance + + def _threshold_sample(self, sample: paddle.Tensor) -> paddle.Tensor: + """ + "Dynamic thresholding: At each sampling step we set s to a certain percentile + absolute pixel value in xt0 (the prediction of x_0 at timestep t), and if + s > 1, then we threshold xt0 to the range [-s, s] and then divide by s. + Dynamic thresholding pushes saturated pixels (those near -1 and 1) inwards, + thereby actively preventing pixels from saturation at each step. We find that + dynamic thresholding results in significantly better photorealism as well as + better image-text alignment, especially when using very large guidance weights." + + https://arxiv.org/abs/2205.11487 + """ + dtype = sample.dtype + batch_size, channels, *remaining_dims = sample.shape + + if dtype not in (paddle.float32, paddle.float64): + sample = sample.cast( + "float32" + ) # upcast for quantile calculation, and clamp not implemented for cpu half + + # Flatten sample for doing quantile calculation along each image + sample = sample.reshape([batch_size, channels * np.prod(remaining_dims)]) + + abs_sample = sample.abs() # "a certain percentile absolute pixel value" + + s = paddle.quantile(abs_sample, self.dynamic_thresholding_ratio, axis=1) + # NOTE paddle.clip donot support min > max + if self.sample_max_value < 1: + s = paddle.ones_like(s) * self.sample_max_value + else: + s = paddle.clip( + s, min=1, max=self.sample_max_value + ) # When clip to min=1, equivalent to standard clipping to [-1, 1] + s = s.unsqueeze(1) # (batch_size, 1) because clip will broadcast along axis=0 + sample = ( + paddle.clip(sample, -s, s) / s + ) # "we threshold xt0 to the range [-s, s] and then divide by s" + + sample = sample.reshape([batch_size, channels, *remaining_dims]) + sample = sample.cast(dtype) + + return sample + + def step( + self, + model_output: paddle.Tensor, + timestep: int, + sample: paddle.Tensor, + generator=None, + return_dict: bool = True, + ) -> Union[DDPMSchedulerOutput, Tuple]: + """ + Predict the sample from the previous timestep by reversing the SDE. This + function propagates the diffusion process from the learned model outputs + (most often the predicted noise). + + Args: + model_output (`paddle.Tensor`): + The direct output from learned diffusion model. + timestep (`float`): + The current discrete timestep in the diffusion chain. + sample (`paddle.Tensor`): + A current instance of a sample created by the diffusion process. + generator (`paddle.Generator`, *optional*): + A random number generator. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a + [`~schedulers.scheduling_ddpm.DDPMSchedulerOutput`] or `tuple`. + + Returns: + [`~schedulers.scheduling_ddpm.DDPMSchedulerOutput`] or `tuple`: + If return_dict is `True`, + [`~schedulers.scheduling_ddpm.DDPMSchedulerOutput`] is returned, + otherwise a tuple is returned where the first element is the sample + tensor. + + """ + t = timestep + + prev_t = self.previous_timestep(t) + + if model_output.shape[1] == sample.shape[1] * 2 and self.variance_type in [ + "learned", + "learned_range", + ]: + model_output, predicted_variance = paddle.split( + model_output, + [sample.shape[1], model_output.shape[1] - sample.shape[1]], + axis=1, + ) + else: + predicted_variance = None + + # 1. compute alphas, betas + alpha_prod_t = self.alphas_cumprod[t] + alpha_prod_t_prev = self.alphas_cumprod[prev_t] if prev_t >= 0 else self.one + beta_prod_t = 1 - alpha_prod_t + beta_prod_t_prev = 1 - alpha_prod_t_prev + current_alpha_t = alpha_prod_t / alpha_prod_t_prev + current_beta_t = 1 - current_alpha_t + + # 2. compute predicted original sample from predicted noise also called + # "predicted x_0" of formula (15) from https://arxiv.org/pdf/2006.11239.pdf + if self.prediction_type == "epsilon": + pred_original_sample = ( + sample - beta_prod_t ** (0.5) * model_output + ) / alpha_prod_t ** (0.5) + elif self.prediction_type == "sample": + pred_original_sample = model_output + elif self.prediction_type == "v_prediction": + pred_original_sample = (alpha_prod_t**0.5) * sample - ( + beta_prod_t**0.5 + ) * model_output + else: + raise ValueError( + f"prediction_type given as {self.prediction_type} must be one of " + "`epsilon`, `sample` or `v_prediction` for the DDPMScheduler." + ) + + # 3. Clip or threshold "predicted x_0" + if self.thresholding: + pred_original_sample = self._threshold_sample(pred_original_sample) + elif self.clip_sample: + pred_original_sample = pred_original_sample.clip( + -self.clip_sample_range, self.clip_sample_range + ) + + # 4. Compute coefficients for pred_original_sample x_0 and current sample x_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + pred_original_sample_coeff = ( + alpha_prod_t_prev ** (0.5) * current_beta_t + ) / beta_prod_t + current_sample_coeff = current_alpha_t ** (0.5) * beta_prod_t_prev / beta_prod_t + + # 5. Compute predicted previous sample µ_t + # See formula (7) from https://arxiv.org/pdf/2006.11239.pdf + pred_prev_sample = ( + pred_original_sample_coeff * pred_original_sample + + current_sample_coeff * sample + ) + + # 6. Add noise + variance = 0 + if t > 0: + variance_noise = randn_tensor( + model_output.shape, generator=generator, dtype=model_output.dtype + ) + if self.variance_type == "fixed_small_log": + variance = ( + self._get_variance(t, predicted_variance=predicted_variance) + * variance_noise + ) + elif self.variance_type == "learned_range": + variance = self._get_variance(t, predicted_variance=predicted_variance) + variance = paddle.exp(0.5 * variance) * variance_noise + else: + variance = ( + self._get_variance(t, predicted_variance=predicted_variance) ** 0.5 + ) * variance_noise + + pred_prev_sample = pred_prev_sample + variance + + if not return_dict: + return (pred_prev_sample,) + + return DDPMSchedulerOutput( + prev_sample=pred_prev_sample, pred_original_sample=pred_original_sample + ) + + def add_noise( + self, + original_samples: paddle.Tensor, + noise: paddle.Tensor, + timesteps: paddle.Tensor, + ) -> paddle.Tensor: + # Fix 0D tensor + if paddle.is_tensor(timesteps) and timesteps.ndim == 0: + timesteps = timesteps.unsqueeze(0) + # Make sure alphas_cumprod and timestep have same dtype as original_samples + alphas_cumprod = self.alphas_cumprod.cast(dtype=original_samples.dtype) + + sqrt_alpha_prod = alphas_cumprod[timesteps] ** 0.5 + sqrt_alpha_prod = sqrt_alpha_prod.flatten() + while len(sqrt_alpha_prod.shape) < len(original_samples.shape): + sqrt_alpha_prod = sqrt_alpha_prod.unsqueeze(-1) + + sqrt_one_minus_alpha_prod = (1 - alphas_cumprod[timesteps]) ** 0.5 + sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.flatten() + while len(sqrt_one_minus_alpha_prod.shape) < len(original_samples.shape): + sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.unsqueeze(-1) + + noisy_samples = ( + sqrt_alpha_prod * original_samples + sqrt_one_minus_alpha_prod * noise + ) + return noisy_samples + + def get_velocity( + self, sample: paddle.Tensor, noise: paddle.Tensor, timesteps: paddle.Tensor + ) -> paddle.Tensor: + # Make sure alphas_cumprod and timestep have same dtype as sample + alphas_cumprod = self.alphas_cumprod.cast(dtype=sample.dtype) + + sqrt_alpha_prod = alphas_cumprod[timesteps] ** 0.5 + sqrt_alpha_prod = sqrt_alpha_prod.flatten() + while len(sqrt_alpha_prod.shape) < len(sample.shape): + sqrt_alpha_prod = sqrt_alpha_prod.unsqueeze(-1) + + sqrt_one_minus_alpha_prod = (1 - alphas_cumprod[timesteps]) ** 0.5 + sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.flatten() + while len(sqrt_one_minus_alpha_prod.shape) < len(sample.shape): + sqrt_one_minus_alpha_prod = sqrt_one_minus_alpha_prod.unsqueeze(-1) + + velocity = sqrt_alpha_prod * noise - sqrt_one_minus_alpha_prod * sample + return velocity + + def __len__(self): + return self.num_train_timesteps + + def previous_timestep(self, timestep): + if self.custom_timesteps: + index = (self.timesteps == timestep).nonzero(as_tuple=True)[0][0] + if index == self.timesteps.shape[0] - 1: + prev_t = paddle.to_tensor(-1) + else: + prev_t = self.timesteps[index + 1] + else: + num_inference_steps = ( + self.num_inference_steps + if self.num_inference_steps + else self.num_train_timesteps + ) + prev_t = timestep - self.num_train_timesteps // num_inference_steps + + return prev_t diff --git a/ppmat/schedulers/scheduling_diffnmr.py b/ppmat/schedulers/scheduling_diffnmr.py new file mode 100644 index 00000000..d7b51dfe --- /dev/null +++ b/ppmat/schedulers/scheduling_diffnmr.py @@ -0,0 +1,1391 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import numpy as np +import paddle +import paddle.nn.functional as F +import rdkit +from rdkit import Chem + +from ppmat.models.diffnmr.utils import diffgraphformer_utils + + +def sum_except_batch(x): + x_reshaped = paddle.reshape(x, [x.shape[0], -1]) + return paddle.sum(x_reshaped, axis=-1) + + +def assert_correctly_masked(variable, node_mask): + mask_int = node_mask.astype("int64") + masked = variable * (1 - mask_int).astype(variable.dtype) + if paddle.max(paddle.abs(masked)).item() >= 1e-4: + raise ValueError("Variables not masked properly.") + + +def sample_gaussian(size): + return paddle.randn(shape=size) + + +def sample_gaussian_with_mask(size, node_mask): + x = paddle.randn(shape=size) + x = x.astype(node_mask.dtype) + x_masked = x * node_mask + return x_masked + + +def clip_noise_schedule(alphas2, clip_value=0.001): + """ + For a noise schedule given by alpha^2, this clips alpha_t / alpha_t-1. + This may help improve stability during sampling. + """ + alphas2 = np.concatenate([np.ones(1), alphas2], axis=0) + alphas_step = alphas2[1:] / alphas2[:-1] + + alphas_step = np.clip(alphas_step, a_min=clip_value, a_max=1.0) + alphas2 = np.cumprod(alphas_step, axis=0) + + return alphas2 + + +def cosine_beta_schedule(timesteps, s=0.008, raise_to_power: float = 1): + """ + Cosine schedule as proposed in https://openreview.net/forum?id=-NEXDKk8gZ + """ + steps = timesteps + 2 + x = np.linspace(0, steps, steps) + alphas_cumprod = np.cos(((x / steps) + s) / (1 + s) * np.pi * 0.5) ** 2 + alphas_cumprod = alphas_cumprod / alphas_cumprod[0] + betas = 1 - (alphas_cumprod[1:] / alphas_cumprod[:-1]) + betas = np.clip(betas, a_min=0, a_max=0.999) + alphas = 1.0 - betas + alphas_cumprod = np.cumprod(alphas, axis=0) + + if raise_to_power != 1: + alphas_cumprod = np.power(alphas_cumprod, raise_to_power) + + return alphas_cumprod + + +def cosine_beta_schedule_discrete(timesteps, s=0.008): + """Cosine schedule as proposed in https://openreview.net/forum?id=-NEXDKk8gZ.""" + steps = timesteps + 2 + x = np.linspace(0, steps, steps) + + alphas_cumprod = np.cos(0.5 * np.pi * ((x / steps) + s) / (1 + s)) ** 2 + alphas_cumprod = alphas_cumprod / alphas_cumprod[0] + alphas = alphas_cumprod[1:] / alphas_cumprod[:-1] + betas = 1 - alphas + return betas.squeeze() + + +def custom_beta_schedule_discrete(timesteps, average_num_nodes=50, s=0.008): + """ + Cosine schedule with modifications for a discrete setting. + """ + steps = timesteps + 2 + x = np.linspace(0, steps, steps) + alphas_cumprod = np.cos(0.5 * np.pi * ((x / steps) + s) / (1 + s)) ** 2 + alphas_cumprod = alphas_cumprod / alphas_cumprod[0] + alphas = alphas_cumprod[1:] / alphas_cumprod[:-1] + betas = 1 - alphas + + assert timesteps >= 100 + + p = 4 / 5 # 1 - 1 / num_edge_classes + num_edges = average_num_nodes * (average_num_nodes - 1) / 2 + + # First 100 steps: only a few updates per graph + updates_per_graph = 1.2 + beta_first = updates_per_graph / (p * num_edges) + + betas[betas < beta_first] = beta_first + return np.array(betas) + + +def gaussian_KL(q_mu, q_sigma): + """ + KL divergence between a normal distribution (q) and + the standard normal distribution. + """ + # 原: sum_except_batch((torch.log(1 / q_sigma) + 0.5*(q_sigma**2 + q_mu**2) - 0.5)) + inside = paddle.log(1.0 / q_sigma) + 0.5 * (q_sigma**2 + q_mu**2) - 0.5 + return sum_except_batch(inside) + + +def cdf_std_gaussian(x): + return 0.5 * (1.0 + paddle.erf(x / math.sqrt(2))) + + +def SNR(gamma): + """Computes signal to noise ratio (alpha^2/sigma^2) given gamma.""" + return paddle.exp(-gamma) + + +def inflate_batch_array(array, target_shape): + """ + Inflates the batch array (array) with only a single axis (batch_size, ...) + to match the target shape. + """ + shape0 = array.shape[0] + new_shape = [shape0] + [1] * (len(target_shape) - 1) + return paddle.reshape(array, new_shape) + + +def sigma(gamma, target_shape): + """Computes sigma given gamma.""" + sig = paddle.sqrt(F.sigmoid(gamma)) + return inflate_batch_array(sig, target_shape) + + +def alpha(gamma, target_shape): + """Computes alpha given gamma.""" + sig = paddle.sqrt(F.sigmoid(-gamma)) + return inflate_batch_array(sig, target_shape) + + +def check_mask_correct(variables, node_mask): + for var in variables: + if var.numel() > 0: # 说明张量非空 + assert_correctly_masked(var, node_mask) + + +def check_tensor_same_size(*args): + for i, arg in enumerate(args): + if i == 0: + continue + if args[0].shape != arg.shape: + raise ValueError("Tensors have different shapes.") + + +def sigma_and_alpha_t_given_s( + gamma_t: paddle.Tensor, gamma_s: paddle.Tensor, target_size: paddle.shape +): + """ + Computes sigma_t_given_s and alpha_t_given_s for sampling. + """ + part = paddle.softplus(gamma_s) - paddle.softplus(gamma_t) + sigma2_t = -paddle.expm1(part) + sigma2_t_given_s = inflate_batch_array(sigma2_t, target_size) + + log_alpha2_t = F.logsigmoid(-gamma_t) + log_alpha2_s = F.logsigmoid(-gamma_s) + log_alpha2_t_given_s = log_alpha2_t - log_alpha2_s + + alpha_t_given_s_ = paddle.exp(0.5 * log_alpha2_t_given_s) + alpha_t_given_s_ = inflate_batch_array(alpha_t_given_s_, target_size) + + sigma_t_given_s = paddle.sqrt(sigma2_t_given_s) + + return sigma2_t_given_s, sigma_t_given_s, alpha_t_given_s_ + + +def reverse_tensor(x): + idx = paddle.arange(x.shape[0] - 1, -1, -1, dtype="int64") + return paddle.index_select(x, index=idx, axis=0) + + +def sample_feature_noise(X_size, E_size, y_size, node_mask): + """ + Standard normal noise for all features. Output size: X.size(), E.size(), y.size(). + """ + epsX = sample_gaussian(X_size) + epsE = sample_gaussian(E_size) + epsy = sample_gaussian(y_size) + + float_mask = node_mask.astype("float32") + epsX = epsX.astype(float_mask.dtype) + epsE = epsE.astype(float_mask.dtype) + epsy = epsy.astype(float_mask.dtype) + + # Get upper triangular part of edge noise, without main diagonal + upper_triangular_mask = paddle.zeros_like(epsE) + + row_idx, col_idx = np.triu_indices(n=epsE.shape[1], k=1) + row_idx_t = paddle.to_tensor(row_idx, dtype="int64") + col_idx_t = paddle.to_tensor(col_idx, dtype="int64") + + for b in range(epsE.shape[0]): + upper_triangular_mask[b, row_idx_t, col_idx_t, :] = 1.0 + + epsE = epsE * upper_triangular_mask + epsE_T = paddle.transpose(epsE, perm=[0, 2, 1, 3]) + epsE = epsE + epsE_T + + # assert (epsE == torch.transpose(epsE, 1, 2)).all() + # Paddle : + eq_ = paddle.all(epsE == epsE_T) + if not eq_.item(): + raise ValueError("epsE is not symmetric!") + + return diffgraphformer_utils.PlaceHolder(X=epsX, E=epsE, y=epsy).mask(node_mask) + + +def sample_normal(mu_X, mu_E, mu_y, sigma_, node_mask): + """ + Samples from a Normal distribution. + """ + eps = sample_feature_noise(mu_X.shape, mu_E.shape, mu_y.shape, node_mask) + eps = eps.astype(mu_X.dtype) # 如果需要与 mu_X 同 dtype + + X = mu_X + sigma_ * eps.X + E = mu_E + paddle.unsqueeze(sigma_, 1) * eps.E + y = mu_y + paddle.squeeze(sigma_, axis=1) * eps.y + return diffgraphformer_utils.PlaceHolder(X=X, E=E, y=y) + + +def check_issues_norm_values(gamma_func, norm_val1, norm_val2, num_stdevs=8): + """ + Check if 1 / norm_value is still larger than 10 * standard deviation. + """ + zeros = paddle.zeros([1, 1], dtype="float32") + gamma_0 = gamma_func(zeros) + # sigma_0: + sig0 = sigma(gamma_0, zeros.shape).item() + max_norm_value = max(norm_val1, norm_val2) + if sig0 * num_stdevs > 1.0 / max_norm_value: + raise ValueError( + f"Value for normalization {max_norm_value} too large " + f"with sigma_0={sig0:.5f}." + ) + + +def sample_discrete_features(probX, probE, node_mask): + """Sample features from multinomial distribution with given probabilities + (probX, probE). + + Args: + probX: node features with shape (bs, n, dx_out) + probE: edge features with shape (bs, n, n, de_out) + node_mask: node mask + """ + bs, n, _ = probX.shape + + # Noise X + # The masked rows should define probability distributions as well + probX[~node_mask] = 1 / probX.shape[-1] + # Flatten the probability tensor to sample with multinomial + probX = probX.reshape([bs * n, -1]) # (bs * n, dx_out) + # Sample X + X_t = paddle.multinomial(probX, num_samples=1).reshape([bs, n]) # (bs, n) + + # Noise E + # The masked rows should define probability distributions as well + inverse_edge_mask = ~(node_mask.unsqueeze(1) * node_mask.unsqueeze(2)).unsqueeze(-1) + diag_mask = paddle.eye(n).unsqueeze(0).expand([bs, -1, -1]).unsqueeze(-1) + probE = paddle.where( + inverse_edge_mask, paddle.full_like(probE, 1 / probE.shape[-1]), probE + ) + probE = paddle.where( + diag_mask.astype(paddle.bool), + paddle.full_like(probE, 1 / probE.shape[-1]), + probE, + ) + probE = probE.reshape([bs * n * n, -1]) # (bs * n * n, de_out) + # Sample E + E_t = paddle.multinomial(probE, num_samples=1).reshape([bs, n, n]) # (bs, n, n) + E_t = paddle.triu(E_t, diagonal=1) + E_t = E_t + paddle.transpose(E_t, [0, 2, 1]) + + # Create a placeholder for y, since it's not used in this function + y = paddle.zeros([bs, 0], dtype=X_t.dtype) + + return diffgraphformer_utils.PlaceHolder(X=X_t, E=E_t, y=y) + + +def compute_posterior_distribution(M, M_t, Qt_M, Qsb_M, Qtb_M): + """ + M, M_t: shape (bs, N, d) or (bs, N) and flattened + compute xt @ Qt.T * x0 @ Qsb / x0 @ Qtb @ xt.T + """ + # Flatten + bs = M.shape[0] + M_flat = paddle.reshape(M, [bs, -1, M.shape[-1]]) # e.g. (bs, N, d) + M_t_flat = paddle.reshape(M_t, [bs, -1, M_t.shape[-1]]).astype("float32") + + Qt_M_T = paddle.transpose(Qt_M, perm=[0, 2, 1]) # (bs, d, d) + + left_term = paddle.matmul(M_t_flat, Qt_M_T) # (bs, N, d) + right_term = paddle.matmul(M_flat, Qsb_M) # (bs, N, d) + product = left_term * right_term # (bs, N, d) + + denom = paddle.matmul(M_flat, Qtb_M) # (bs, N, d) + denom = paddle.sum(denom * M_t_flat, axis=-1) # (bs, N) + + denom_ = paddle.unsqueeze(denom, axis=-1) # (bs, N, 1) + # avoid zero div + zero_mask = denom_ == 0.0 + denom_ = paddle.where(zero_mask, paddle.ones_like(denom_), denom_) + + prob = product / denom_ + return prob + + +def compute_batched_over0_posterior_distribution_(X_t, Qt, Qsb, Qtb): + """ + Compute xt @ Qt.T * x0 @ Qsb / x0 @ Qtb @ xt.T for each possible value of x0 + """ + X_t = X_t.astype("float32") + Qt_T = paddle.transpose(Qt, perm=[0, 2, 1]).astype("float32") + + left_term = paddle.matmul(X_t, Qt_T) # (bs, N, d_t-1) + left_term = paddle.unsqueeze(left_term, axis=2) # (bs, N, 1, d_t-1) + + right_term = paddle.unsqueeze(Qsb, axis=1) # (bs, 1, d0, d_t-1) + numerator = left_term * right_term # (bs, N, d0, d_t-1) + + denominator = paddle.matmul( + Qtb, paddle.transpose(X_t, perm=[0, 2, 1]) + ) # (bs, d0, N) + denominator = paddle.transpose(denominator, perm=[0, 2, 1]) # (bs, N, d0) + denominator = paddle.unsqueeze(denominator, axis=-1) # (bs, N, d0, 1) + + zero_mask = denominator == 0.0 + denominator = paddle.where(zero_mask, paddle.ones_like(denominator), denominator) + + return numerator / denominator + + +def compute_batched_over0_posterior_distribution(X_t, Qt, Qsb, Qtb): + """ + Flatten edge features to (bs, N, dt). + Then compute the posterior distribution. (Same logic as the '_' version) + """ + # Flatten + X_t_f = X_t.flatten(start_axis=1, stop_axis=-2).astype("float32") # (bs, N, dt) + + Qt_T = paddle.transpose(Qt, perm=[0, 2, 1]) # (bs, dt, d_t-1) + left_term = paddle.matmul(X_t_f, Qt_T) # (bs, N, d_t-1) + left_term = paddle.unsqueeze(left_term, axis=2) # (bs, N, 1, d_t-1) + right_term = paddle.unsqueeze(Qsb, axis=1) # (bs, 1, d0, d_t-1) + numerator = left_term * right_term # (bs, N, d0, d_t-1) + + X_t_transposed = paddle.transpose(X_t_f, perm=[0, 2, 1]) # (bs, dt, N) + prod = paddle.matmul(Qtb, X_t_transposed) # (bs, d0, N) + prod = paddle.transpose(prod, perm=[0, 2, 1]) # (bs, N, d0) + + denominator = paddle.unsqueeze(prod, axis=-1) # (bs, N, d0, 1) + zero_mask = denominator == 0 + denominator = paddle.where( + zero_mask, paddle.full_like(denominator, 1e-6), denominator + ) + + return numerator / denominator + + +def mask_distributions(true_X, true_E, pred_X, pred_E, node_mask): + """ + Set masked rows to arbitrary distributions, so they don't contribute to loss. + Then renormalize. + """ + dtype_ = true_X.dtype + + row_X = paddle.zeros([true_X.shape[-1]], dtype=dtype_) + row_X[0] = 1.0 + row_E = paddle.zeros([true_E.shape[-1]], dtype=dtype_) + row_E[0] = 1.0 + + n_ = node_mask.shape[1] + diag_mask = paddle.eye(n_, dtype="int32").astype("bool") + diag_mask_bs = diag_mask.unsqueeze(0).expand([node_mask.shape[0], n_, n_]) + + mask_bool = node_mask.astype("bool") + mask_not = paddle.logical_not(mask_bool) + + row_X_bc = row_X.unsqueeze(0).unsqueeze(0) # shape (1,1,dx) + row_X_bc = paddle.expand( + row_X_bc, [mask_not.shape[0], mask_not.shape[1], row_X.shape[0]] + ) + + true_X = paddle.where(paddle.unsqueeze(mask_not, axis=-1), row_X_bc, true_X) + pred_X = paddle.where(paddle.unsqueeze(mask_not, axis=-1), row_X_bc, pred_X) + + # Edge + mask_2d = paddle.unsqueeze(mask_bool, axis=1) & paddle.unsqueeze(mask_bool, axis=2) + inv_mask_2d = paddle.logical_not(mask_2d) + # + diag => unify + comb_mask = paddle.logical_or(inv_mask_2d, diag_mask_bs) + + row_E_bc = row_E.unsqueeze(0).unsqueeze(0).unsqueeze(0) # shape (1,1,1,de) + row_E_bc = paddle.expand( + row_E_bc, + [comb_mask.shape[0], comb_mask.shape[1], comb_mask.shape[2], row_E.shape[0]], + ) + + true_E = paddle.where(paddle.unsqueeze(comb_mask, axis=-1), row_E_bc, true_E) + pred_E = paddle.where(paddle.unsqueeze(comb_mask, axis=-1), row_E_bc, pred_E) + + # + 1e-7 + eps_ = 1e-7 + true_X = true_X + eps_ + pred_X = pred_X + eps_ + true_E = true_E + eps_ + pred_E = pred_E + eps_ + + # normalize + sum_true_X = paddle.sum(true_X, axis=-1, keepdim=True) + sum_pred_X = paddle.sum(pred_X, axis=-1, keepdim=True) + sum_true_E = paddle.sum(true_E, axis=-1, keepdim=True) + sum_pred_E = paddle.sum(pred_E, axis=-1, keepdim=True) + + true_X = true_X / sum_true_X + pred_X = pred_X / sum_pred_X + true_E = true_E / sum_true_E + pred_E = pred_E / sum_pred_E + + return true_X, true_E, pred_X, pred_E + + +def posterior_distributions(X, E, y, X_t, E_t, y_t, Qt, Qsb, Qtb): + """ + Compute posterior distribution for X, E. + """ + prob_X = compute_posterior_distribution( + M=X, M_t=X_t, Qt_M=Qt.X, Qsb_M=Qsb.X, Qtb_M=Qtb.X + ) # (bs, n, dx) + prob_E = compute_posterior_distribution( + M=E, M_t=E_t, Qt_M=Qt.E, Qsb_M=Qsb.E, Qtb_M=Qtb.E + ) # (bs, n*n, de) + return diffgraphformer_utils.PlaceHolder(X=prob_X, E=prob_E, y=y_t) + + +def sample_discrete_feature_noise(limit_dist, node_mask): + """ + Sample from the limit distribution of the diffusion process + (multinomial with prob = limit_dist). + """ + bs, n_max = node_mask.shape + # x_limit => shape (bs, n_max, dx) + x_limit = paddle.unsqueeze(limit_dist.X, axis=0) # (1, dx) + x_limit = paddle.unsqueeze(x_limit, axis=0) # (1,1,dx) + x_limit = paddle.expand(x_limit, [bs, n_max, x_limit.shape[-1]]) # (bs, n_max, dx) + + e_limit = paddle.unsqueeze(limit_dist.E, axis=0) # (1, de) + e_limit = paddle.unsqueeze(e_limit, axis=0) # (1,1,de) + e_limit = paddle.unsqueeze(e_limit, axis=0) # (1,1,1,de) + e_limit = paddle.expand( + e_limit, [bs, n_max, n_max, e_limit.shape[-1]] + ) # (bs, n_max, n_max, de) + + y_limit = paddle.unsqueeze(limit_dist.y, axis=0) # (1, dy) + if y_limit.shape[-1] == 0: + y_limit = paddle.zeros([bs, 0], dtype=y_limit.dtype) + else: + y_limit = paddle.expand(y_limit, [bs, y_limit.shape[-1]]) # (bs, dy) + + # multinomial for X + # flatten => (bs*n_max, dx) + X_probs_flat = paddle.reshape(x_limit, [bs * n_max, -1]) + X_idx = paddle.multinomial(X_probs_flat, num_samples=1) + X_idx = paddle.reshape(X_idx, [bs, n_max]) # (bs, n_max) + + # multinomial for E + E_probs_flat = paddle.reshape(e_limit, [bs * n_max * n_max, -1]) + E_idx = paddle.multinomial(E_probs_flat, num_samples=1) + E_idx = paddle.reshape(E_idx, [bs, n_max, n_max]) + + U_y = paddle.zeros([bs, 0], dtype=X_idx.dtype) + + # one_hot + X_onehot = F.one_hot(X_idx, num_classes=x_limit.shape[-1]).astype("float32") + E_onehot = F.one_hot(E_idx, num_classes=e_limit.shape[-1]).astype("float32") + + # Get upper triangular part for E + row_idx, col_idx = np.triu_indices(n=n_max, k=1) + row_idx_t = paddle.to_tensor(row_idx, dtype="int64") + col_idx_t = paddle.to_tensor(col_idx, dtype="int64") + + E_upper = paddle.zeros_like(E_onehot) + for b in range(bs): + E_upper[b, row_idx_t, col_idx_t] = E_onehot[b, row_idx_t, col_idx_t] + + E_sym = E_upper + paddle.transpose(E_upper, perm=[0, 2, 1, 3]) + # check symmetry + eq_ = paddle.all(E_sym == paddle.transpose(E_sym, perm=[0, 2, 1, 3])) + if not eq_.item(): + raise ValueError("Discrete feature noise E is not symmetric!") + + ph = diffgraphformer_utils.PlaceHolder(X=X_onehot, E=E_sym, y=U_y) + return ph.mask(node_mask) + + +@paddle.no_grad() +def step( + model, s, t, X_t, E_t, y_t, node_mask, conditionVec, batch_X, batch_E, batch_y +): + """ + sample from p(z_s | z_t) : take one step of reverse diffusion + """ + beta_t = model.noise_schedule(t_normalized=t) + alpha_s_bar = model.noise_schedule.get_alpha_bar(t_normalized=s) + alpha_t_bar = model.noise_schedule.get_alpha_bar(t_normalized=t) + + # retrieve transitions matrix + Qtb = model.transition_model.get_Qt_bar(alpha_t_bar) + Qsb = model.transition_model.get_Qt_bar(alpha_s_bar) + Qt = model.transition_model.get_Qt(beta_t) + + # prepare neural net input + noisy_data = { + "X_t": X_t, + "E_t": E_t, + "y_t": y_t, + "t": t, + "node_mask": node_mask, + } + extra_data = compute_extra_data(model, noisy_data) + + # input_X for decoder + input_X = paddle.concat( + [noisy_data["X_t"].astype("float32"), extra_data.X.astype(dtype="float32")], + axis=2, + ) + + # input_E for decoder + input_E = paddle.concat( + [noisy_data["E_t"].astype("float32"), extra_data.E.astype(dtype="float32")], + axis=3, + ) + + # partial input_y for decoder + input_y = paddle.hstack( + [noisy_data["y_t"].astype("float32"), extra_data.y.astype(dtype="float32")] + ) + + from ppmat.models.diffnmr.diffnmr import DiffNMR + + if isinstance(model, DiffNMR): + if model.flag_onlyH is True: + global_H, _ = model.encoder(conditionVec) + embeddings_spectrum = global_H + else: + embeddings_spectrum, (spectrum_encoding, _) = model.encoder(conditionVec) + if model.connector_flag is True: + embeddings_spectrum = model.connector.sample(embeddings_spectrum, spectrum_encoding) + input_y = paddle.concat([input_y, embeddings_spectrum], axis=1).astype( + "float32" + ) + + # 4. Decoder forward + # Convention: pred.X and pred.E are logits with shapes [B, n, Cx] and + # [B, n, n, Ce] + pred = model.decoder(input_X, input_E, input_y, node_mask) + else: + # prepare the extra feature for encoder input without noisy + batch_values = ( + diffgraphformer_utils.PlaceHolder(X=batch_X, E=batch_E, y=batch_y) + .type_as(batch_X) + .mask(node_mask) + ) + extra_data_pure = compute_extra_data( + model, + { + "X_t": batch_values.X, + "E_t": batch_values.E, + "y_t": batch_values.y, + "node_mask": node_mask, + }, + isPure=True, + ) + # prepare the input data for encoder combining extra features + input_X_pure = paddle.concat( + [batch_values.X.astype("float32"), extra_data_pure.X], axis=2 + ).astype(dtype="float32") + input_E_pure = paddle.concat( + [batch_values.E.astype("float32"), extra_data_pure.E], axis=3 + ).astype(dtype="float32") + input_y_pure = paddle.hstack( + x=(batch_values.y.astype("float32"), extra_data_pure.y) + ).astype(dtype="float32") + # obtain the condition vector from output of encoder + conditionVec = model.encoder( + input_X_pure, input_E_pure, input_y_pure, node_mask + ) + # complete input_y for decoder + input_y = paddle.hstack(x=(input_y, conditionVec)).astype(dtype="float32") + + # forward of decoder with encoder output as condition vector of input of decoder + pred = model.decoder(input_X, input_E, input_y, node_mask) + + pred_X = F.softmax(pred.X, axis=-1) + pred_E = F.softmax(pred.E, axis=-1) + + # compute posterior distribution + p_s_and_t_given_0_X = compute_batched_over0_posterior_distribution( + X_t=X_t, Qt=Qt.X, Qsb=Qsb.X, Qtb=Qtb.X + ) + p_s_and_t_given_0_E = compute_batched_over0_posterior_distribution( + X_t=E_t, Qt=Qt.E, Qsb=Qsb.E, Qtb=Qtb.E + ) + + # compute node probability + weighted_X = pred_X.unsqueeze(-1) * p_s_and_t_given_0_X + unnormalized_prob_X = paddle.sum(weighted_X, axis=2) + unnormalized_prob_X = paddle.where( + paddle.sum(unnormalized_prob_X, axis=-1, keepdim=True) == 0, + paddle.to_tensor(1e-5, dtype=unnormalized_prob_X.dtype), + unnormalized_prob_X, + ) + prob_X = unnormalized_prob_X / paddle.sum( + unnormalized_prob_X, axis=-1, keepdim=True + ) + + # compute edge probability + pred_E = pred_E.reshape([X_t.shape[0], -1, pred.E.shape[-1]]) + weighted_E = pred_E.unsqueeze(-1) * p_s_and_t_given_0_E + unnormalized_prob_E = paddle.sum(weighted_E, axis=-2) + unnormalized_prob_E = paddle.where( + paddle.sum(unnormalized_prob_E, axis=-1, keepdim=True) == 0, + paddle.to_tensor(1e-5, dtype=unnormalized_prob_E.dtype), + unnormalized_prob_E, + ) + prob_E = unnormalized_prob_E / paddle.sum( + unnormalized_prob_E, axis=-1, keepdim=True + ) + prob_E = prob_E.reshape([X_t.shape[0], X_t.shape[1], X_t.shape[1], -1]) + + assert ((prob_X.sum(axis=-1) - 1).abs().max() < 1e-4).all() + assert ((prob_E.sum(axis=-1) - 1).abs() < 1e-4).all() + + # sample from p(z_s | z_t) + sampled_s = sample_discrete_features(prob_X, prob_E, node_mask) + X_s = F.one_hot(sampled_s.X, num_classes=model.Xdim_output) + E_s = F.one_hot(sampled_s.E, num_classes=model.Edim_output) + + assert (E_s == paddle.transpose(E_s, [0, 1, 2])).all() + assert (X_t.shape == X_s.shape) and (E_t.shape == E_s.shape) + + out_one_hot = diffgraphformer_utils.PlaceHolder( + X=X_s, E=E_s, y=paddle.zeros([y_t.shape[0], 0]) + ) + out_discrete = diffgraphformer_utils.PlaceHolder( + X=X_s, E=E_s, y=paddle.zeros([y_t.shape[0], 0]) + ) + + return out_one_hot.mask(node_mask), out_discrete.mask(node_mask, collapse=True) + + +# ------------------------- +# Noise & Q +# ------------------------- +def apply_noise(model, X, E, y, node_mask, flag_use_formula=None): + """ + Sample noise and apply it to the data. + """ + t_int = paddle.randint( + low=1, high=model.T + 1, shape=[X.shape[0], 1], dtype="int64" + ).astype("float32") + s_int = t_int - 1 + + t_float = t_int / model.T # nomarlize for stablizing training diffusion model + s_float = s_int / model.T + + beta_t = model.noise_schedule(t_normalized=t_float) + alpha_s_bar = model.noise_schedule.get_alpha_bar(t_normalized=s_float) + alpha_t_bar = model.noise_schedule.get_alpha_bar(t_normalized=t_float) + + Qtb = model.transition_model.get_Qt_bar(alpha_t_bar) + assert (abs(Qtb.X.sum(axis=2) - 1.0) < 1e-4).all(), Qtb.X.sum(axis=2) - 1 + assert (abs(Qtb.E.sum(axis=2) - 1.0) < 1e-4).all() + + probX = paddle.matmul(X, Qtb.X) # (bs, n, dx_out) + probE = paddle.matmul(E, Qtb.E.unsqueeze(1)) # (bs, n, n, de_out) + + sampled_t = sample_discrete_features(probX=probX, probE=probE, node_mask=node_mask) + + X_t = F.one_hot(sampled_t.X, num_classes=model.Xdim_output).astype("int64") + if flag_use_formula is True: + X_t = X + E_t = F.one_hot(sampled_t.E, num_classes=model.Edim_output).astype("int64") + assert (X.shape == X_t.shape) and (E.shape == E_t.shape) + + z_t = ( + diffgraphformer_utils.PlaceHolder(X=X_t, E=E_t, y=y) + .type_as(X_t) + .mask(node_mask) + ) + + noisy_data = { + "t_int": t_int, + "t": t_float, + "beta_t": beta_t, + "alpha_s_bar": alpha_s_bar, + "alpha_t_bar": alpha_t_bar, + "X_t": z_t.X, + "E_t": z_t.E, + "y_t": z_t.y, + "node_mask": node_mask, + } + return noisy_data + + +def compute_extra_data(model, noisy_data, isPure=False): + # mix extra_features with domain_features and + # noisy_data into X/E/y final inputs. domain_features + extra_features = model.extra_features(noisy_data) + extra_molecular_features = model.domain_features(noisy_data) + + extra_X = concat_without_empty( + [extra_features.X, extra_molecular_features.X], axis=-1 + ) + extra_E = concat_without_empty( + [extra_features.E, extra_molecular_features.E], axis=-1 + ) + extra_y = concat_without_empty( + [extra_features.y, extra_molecular_features.y], axis=-1 + ) + + if not isPure: + t = noisy_data["t"] + extra_y = concat_without_empty([extra_y, t], axis=1) + + return diffgraphformer_utils.PlaceHolder(X=extra_X, E=extra_E, y=extra_y) + + +def concat_without_empty(tensor_lst, axis=-1): + new_lst = [t.astype("float32") for t in tensor_lst if 0 not in t.shape] + if new_lst == []: + return diffgraphformer_utils.return_empty(tensor_lst[0]) + return paddle.concat(new_lst, axis=axis) + + +# ------------------------- +# KL prior +# ------------------------- +def kl_prior(model, X, E, node_mask): + """ + KL between q(zT|x) and prior p(zT)=Uniform(...) + """ + bs = X.shape[0] + ones = paddle.ones([bs, 1], dtype="float32") + Ts = model.T * ones + alpha_t_bar = model.noise_schedule.get_alpha_bar(t_int=Ts) # (bs,1) + + Qtb = model.transition_model.get_Qt_bar(alpha_t_bar) + probX = paddle.matmul(X, Qtb.X) # (bs,n,dx_out) + probE = paddle.matmul(E, Qtb.E.unsqueeze(1)) # (bs,n,n,de_out) + + # limit distribution + limit_X = model.limit_dist.X.unsqueeze(0).unsqueeze(0) # shape (1,1,dx_out) + limit_X = paddle.expand(limit_X, [bs, X.shape[1], model.Xdim_output]) + + limit_E = model.limit_dist.E.unsqueeze(0).unsqueeze(0).unsqueeze(0) + limit_E = paddle.expand(limit_E, [bs, E.shape[1], E.shape[2], model.Edim_output]) + + # mask + limit_dist_X, limit_dist_E, probX, probE = mask_distributions( + true_X=limit_X.clone(), + true_E=limit_E.clone(), + pred_X=probX, + pred_E=probE, + node_mask=node_mask, + ) + + kl_distance_X = F.kl_div( + input=paddle.log(probX + 1e-10), label=limit_dist_X, reduction="none" + ) + kl_distance_E = F.kl_div( + input=paddle.log(probE + 1e-10), label=limit_dist_E, reduction="none" + ) + klX_sum = sum_except_batch(kl_distance_X) + klE_sum = sum_except_batch(kl_distance_E) + return klX_sum + klE_sum + + +def compute_val_loss( + model, pred, noisy_data, X, E, y, node_mask, condition, return_terms=False +): + """ + Validation/Test VLB (NLL) with optional stateless return of decomposed terms. + + Args: + model: diffusion model with transition_model, node_dist, etc. + pred: namespace or object with .X/.E/.y logits. + noisy_data: dict produced by apply_noise (alpha_t_bar, beta_t, ...). + X, E, y: one-hot labels (same shapes as training). + node_mask: [B, N] boolean/int mask. + condition: reserved (as in original). + return_terms: if True, return per-sample vector terms dict instead of a + scalar. + + Returns: + If return_terms=False: + - Scalar tensor (mean NLL) if stateless path; + - Or model.(test|val)_nll(...) result (kept for backward-compat). + If return_terms=True: + - Dict[str, Tensor[B]] with keys: + {"nll", "X_kl", "E_kl", "X_logp", "E_logp"}. + """ + # 1.log p(N): number of nodes prior + t = noisy_data["t"] + N = paddle.sum(node_mask, axis=1).astype("int64") + log_pN = model.node_dist.log_prob(N) + + # 2. KL(q(z_T|x), p(z_T)) => uniform prior + kl_prior_ = kl_prior(model, X, E, node_mask) + + # 3. Stepwise diffusion loss + if return_terms is True: + (loss_all_t, xkl_vec, e_dl_vec) = compute_Lt( + model, X, E, y, pred, noisy_data, node_mask, return_terms + ) + else: + loss_all_t = compute_Lt( + model, X, E, y, pred, noisy_data, node_mask, return_terms + ) + xkl_vec = e_dl_vec = None + + # 4. reconstruction loss + prob0 = reconstruction_logp(model, t, X, E, node_mask, condition) + loss_term_0_x = X * paddle.log(prob0.X + 1e-10) # avoid log(0) + loss_term_0_e = E * paddle.log(prob0.E + 1e-10) + + # Reduce to per-sample vectors + x_logp_vec = _sum_over_non_batch_dims(loss_term_0_x) # [B] + e_logp_vec = _sum_over_non_batch_dims(loss_term_0_e) # [B] + rec_logp_vec = x_logp_vec + e_logp_vec # [B] + + # combine + # nlls = -log pN + KL_prior + stepwise_terms - recon_logp + nlls = -log_pN + kl_prior_ + loss_all_t - rec_logp_vec + + return { + "nll": nlls, # [B] + "X_logp": x_logp_vec, # [B] + "E_logp": e_logp_vec, # [B] + "X_kl": xkl_vec, # [B] + "E_kl": e_dl_vec, # [B] + } + + +def compute_Lt(model, X, E, y, pred, noisy_data, node_mask, return_terms: bool = False): + """ + Step-wise diffusion term for VLB at validation/test. + + Returns + ------- + if return_terms is False: + loss_all_t : Tensor[B] == model.T * (x_kl + e_kl) + else: + (loss_all_t, x_kl, e_kl) : 3 Tensors[B] + x_kl, e_kl are per-sample KL(P_true || P_pred) contributions (already scaled + by model.T). + """ + # 1. logits -> probabilities + pred_probs_X = F.softmax(pred.X, axis=-1) + pred_probs_E = F.softmax(pred.E, axis=-1) + pred_probs_y = F.softmax(pred.y, axis=-1) + + # 2. schedules + Qtb = model.transition_model.get_Qt_bar(noisy_data["alpha_t_bar"]) + Qsb = model.transition_model.get_Qt_bar(noisy_data["alpha_s_bar"]) + Qt = model.transition_model.get_Qt(noisy_data["beta_t"]) + + # 3. true / predicted posterior distributions + bs, n, _ = X.shape + # compute true posterior distribution + prob_true = posterior_distributions( + X=X, + E=E, + y=y, + X_t=noisy_data["X_t"], + E_t=noisy_data["E_t"], + y_t=noisy_data["y_t"], + Qt=Qt, + Qsb=Qsb, + Qtb=Qtb, + ) + prob_true.E = paddle.reshape(prob_true.E, [bs, n, n, -1]) + + # compute predicted posterior distribution + prob_pred = posterior_distributions( + X=pred_probs_X, + E=pred_probs_E, + y=pred_probs_y, + X_t=noisy_data["X_t"], + E_t=noisy_data["E_t"], + y_t=noisy_data["y_t"], + Qt=Qt, + Qsb=Qsb, + Qtb=Qtb, + ) + prob_pred.E = paddle.reshape(prob_pred.E, [bs, n, n, -1]) + + # 4. mask invalid nodes/edges + (prob_true_X, prob_true_E, prob_pred_X, prob_pred_E,) = mask_distributions( + true_X=prob_true.X, + true_E=prob_true.E, + pred_X=prob_pred.X, + pred_E=prob_pred.E, + node_mask=node_mask, + ) + + # 5) KL(P_true || P_pred) = sum P_true * (log P_true - log P_pred) + log_true_X = _safe_log(prob_true_X) + log_pred_X = _safe_log(prob_pred_X) + x_kl_per = prob_true_X * (log_true_X - log_pred_X) # [B, N, Dx] + x_kl_vec = paddle.sum(x_kl_per, axis=-1) # [B, N] + x_kl_vec = paddle.sum(x_kl_vec, axis=-1) # [B] + + log_true_E = _safe_log(prob_true_E) + log_pred_E = _safe_log(prob_pred_E) + e_kl_per = prob_true_E * (log_true_E - log_pred_E) # [B, N, N, De] + e_kl_vec = paddle.sum(e_kl_per, axis=-1) # [B, N, N] + e_kl_vec = paddle.sum(e_kl_vec, axis=[1, 2]) # [B] + + # 6) scale by T and combine + x_term = model.T * x_kl_vec # [B] + e_term = model.T * e_kl_vec # [B] + loss_all_t = x_term + e_term # [B] + + if return_terms: + return loss_all_t, x_term, e_term + else: + return loss_all_t + + +def reconstruction_logp(model, t, X, E, node_mask, condition_Spectrum): + """ + L0: - log p(X,E|z0) + sample randomly from X0, E0, then perform a forward pass + """ + t_zeros = paddle.zeros_like(t) + beta_0 = model.noise_schedule(t_zeros) + Q0 = model.transition_model.get_Qt(beta_t=beta_0) + + probX0 = paddle.matmul(X, Q0.X) + # E => broadcast + probE0 = paddle.matmul(E, Q0.E.unsqueeze(1)) + + sampled0 = sample_discrete_features(probX0, probE0, node_mask) # TODO + X0 = F.one_hot(sampled0.X, num_classes=model.Xdim_output) + E0 = F.one_hot(sampled0.E, num_classes=model.Edim_output) + y0 = sampled0.y + assert (X.shape == X0.shape) and (E.shape == E0.shape) + + sampled_0 = diffgraphformer_utils.PlaceHolder(X=X0, E=E0, y=y0).mask( + node_mask + ) # TODO new add for step4 + + # noisy_data + noisy_data = { + "X_t": sampled_0.X, + "E_t": sampled_0.E, + "y_t": sampled_0.y, + "node_mask": node_mask, + "t": paddle.zeros([X0.shape[0], 1]).astype(y0.dtype), + } + + extra_data = compute_extra_data(model, noisy_data) + + # input_X + input_X = paddle.concat( + [noisy_data["X_t"].astype("float32"), extra_data.X], axis=2 + ).astype(dtype="float32") + + # input_E + input_E = paddle.concat( + [noisy_data["E_t"].astype("float32"), extra_data.E], axis=3 + ).astype(dtype="float32") + + # partial input_y for decoder + input_y = paddle.hstack([noisy_data["y_t"].astype("float32"), extra_data.y]).astype( + dtype="float32" + ) + + ########################################################### + from ppmat.models.diffnmr.diffnmr import DiffNMR + + if model.__class__ is DiffNMR: + if model.flag_onlyH is True: + global_H, _ = model.encoder(condition_Spectrum) + embeddings_spectrum = global_H + else: + embeddings_spectrum = model.encoder(condition_Spectrum) + input_y = paddle.concat([input_y, embeddings_spectrum], axis=1).astype( + "float32" + ) + + # 4. Decoder forward + # Convention: pred.X and pred.E are logits with shapes [B, n, Cx] and + # [B, n, n, Ce] + pred0 = model.decoder(input_X, input_E, input_y, node_mask) + else: + # prepare the extra feature for encoder input without noisy + z_t = ( + diffgraphformer_utils.PlaceHolder(X=X0, E=E0, y=y0) + .type_as(X) + .mask(node_mask) + ) + extra_data_pure = compute_extra_data( + model, + {"X_t": z_t.X, "E_t": z_t.E, "y_t": z_t.y, "node_mask": node_mask}, + isPure=True, + ) + # prepare the input data for encoder combining extra features + input_X_pure = paddle.concat( + [z_t.X.astype("float32"), extra_data_pure.X], axis=2 + ).astype(dtype="float32") + input_E_pure = paddle.concat( + [z_t.E.astype("float32"), extra_data_pure.E], axis=3 + ).astype(dtype="float32") + input_y_pure = paddle.hstack( + x=(z_t.y.astype("float32"), extra_data_pure.y) + ).astype(dtype="float32") + # obtain the condition vector from output of encoder + conditionVec = model.encoder( + input_X_pure, input_E_pure, input_y_pure, node_mask + ) + # complete input_y for decoder + input_y = paddle.hstack(x=(input_y, conditionVec)).astype(dtype="float32") + + # forward of decoder with encoder output as condition vector of input of decoder + pred0 = model.decoder(input_X, input_E, input_y, node_mask) # TODO: uniform + ############################################################ + + probX0 = F.softmax(pred0.X, axis=-1) + probE0 = F.softmax(pred0.E, axis=-1) + proby0 = F.softmax(pred0.y, axis=-1) + + ones_X = paddle.ones([model.Xdim_output], dtype=probX0.dtype) + ones_E = paddle.ones([model.Edim_output], dtype=probE0.dtype) + + node_mask_3d = node_mask.unsqueeze(-1) + probX0 = paddle.where(~node_mask_3d, ones_X, probX0) + + edge_mask = node_mask.unsqueeze(1) * node_mask.unsqueeze(2) + edge_mask_4d = edge_mask.unsqueeze(-1) + probE0 = paddle.where(~edge_mask_4d, ones_E, probE0) + + diag_mask = paddle.eye(probE0.shape[1], dtype="int64").astype("bool") + diag_mask = diag_mask.unsqueeze(0).expand([probE0.shape[0], -1, -1]) + diag_mask_4d = diag_mask.unsqueeze(-1) + probE0 = paddle.where(diag_mask_4d, ones_E, probE0) + + return diffgraphformer_utils.PlaceHolder(X=probX0, E=probE0, y=proby0) + + +# ----------------------- +# molecule visualization/comparision +# ----------------------- +def mol_from_graphs(atom_decoder, node_list, adjacency_matrix): + """ + Convert discrete graph (atom indices, adjacency) to rdkit Mol + """ + mol = Chem.RWMol() + + node_to_idx = {} + for i, nd in enumerate(node_list): + if nd == -1: + continue + a = Chem.Atom(atom_decoder[int(nd)]) + molIdx = mol.AddAtom(a) + node_to_idx[i] = molIdx + + for ix, row in enumerate(adjacency_matrix): + for iy, bond in enumerate(row): + if iy <= ix: + continue + if bond == 1: + bond_type = Chem.rdchem.BondType.SINGLE + elif bond == 2: + bond_type = Chem.rdchem.BondType.DOUBLE + elif bond == 3: + bond_type = Chem.rdchem.BondType.TRIPLE + elif bond == 4: + bond_type = Chem.rdchem.BondType.AROMATIC + else: + continue + mol.AddBond(node_to_idx[ix], node_to_idx[iy], bond_type) + + try: + mol = mol.GetMol() + except rdkit.Chem.KekulizeException: + print("Can't kekulize molecule") + mol = None + return mol + + +def _safe_log(p: paddle.Tensor, eps: float = 1e-10) -> paddle.Tensor: + # Avoid log(0) + return paddle.log(paddle.clip(p, eps, 1.0)) + + +def _sum_over_non_batch_dims(x: paddle.Tensor) -> paddle.Tensor: + """Reduce tensor into [B] by summing over all non-batch dims.""" + if x is None: + return None + if x.ndim <= 1: + return x + axes = list(range(1, x.ndim)) + return paddle.sum(x, axis=axes) + + +class PredefinedNoiseSchedule(paddle.nn.Layer): + """ + Predefined noise schedule. Essentially creates a lookup array for + predefined (non-learned) noise schedules. + """ + + def __init__(self, noise_schedule, timesteps): + super(PredefinedNoiseSchedule, self).__init__() + self.timesteps = timesteps + if noise_schedule == "cosine": + alphas2 = cosine_beta_schedule(timesteps) + elif noise_schedule == "custom": + raise NotImplementedError() + else: + raise ValueError(noise_schedule) + sigmas2 = 1 - alphas2 + log_alphas2 = np.log(alphas2) + log_sigmas2 = np.log(sigmas2) + log_alphas2_to_sigmas2 = log_alphas2 - log_sigmas2 + self.gamma = paddle.base.framework.EagerParamBase.from_tensor( + tensor=paddle.to_tensor(data=-log_alphas2_to_sigmas2).astype( + dtype="float32" + ), + trainable=False, + ) + + def forward(self, t): + t_int = paddle.round(t * self.timesteps).astype(dtype="int64") + return self.gamma[t_int] + + +class PredefinedNoiseScheduleDiscrete(paddle.nn.Layer): + """ + Predefined noise schedule. Essentially creates a lookup array for + predefined (non-learned) noise schedules. + """ + + def __init__(self, noise_schedule, timesteps): + super(PredefinedNoiseScheduleDiscrete, self).__init__() + self.timesteps = timesteps + if noise_schedule == "cosine": + betas = cosine_beta_schedule_discrete(timesteps) + elif noise_schedule == "custom": + betas = custom_beta_schedule_discrete(timesteps) + else: + raise NotImplementedError(noise_schedule) + self.register_buffer( + name="betas", tensor=paddle.to_tensor(data=betas).astype(dtype="float32") + ) + self.alphas = 1 - paddle.clip(x=self.betas, min=0, max=0.9999) + log_alpha = paddle.log(x=self.alphas) + log_alpha_bar = paddle.cumsum(x=log_alpha, axis=0) + self.alphas_bar = paddle.exp(x=log_alpha_bar) + + def forward(self, t_normalized=None, t_int=None): + assert int(t_normalized is None) + int(t_int is None) == 1 + if t_int is None: + t_int = paddle.round(t_normalized * self.timesteps) + return self.betas[t_int.astype(dtype="int64")] + + def get_alpha_bar(self, t_normalized=None, t_int=None): + assert int(t_normalized is None) + int(t_int is None) == 1 + if t_int is None: + t_int = paddle.round(t_normalized * self.timesteps) + return self.alphas_bar[t_int.astype(dtype="int64")] + + +class DiscreteUniformTransition: + def __init__(self, x_classes: int, e_classes: int, y_classes: int): + self.X_classes = x_classes + self.E_classes = e_classes + self.y_classes = y_classes + self.u_x = paddle.ones(shape=[1, self.X_classes, self.X_classes]) + if self.X_classes > 0: + self.u_x = self.u_x / self.X_classes + self.u_e = paddle.ones(shape=[1, self.E_classes, self.E_classes]) + if self.E_classes > 0: + self.u_e = self.u_e / self.E_classes + self.u_y = paddle.ones(shape=[1, self.y_classes, self.y_classes]) + if self.y_classes > 0: + self.u_y = self.u_y / self.y_classes + + def get_Qt(self, beta_t): + """Returns one-step transition matrices for X and E, from step t - 1 to step t. + Qt = (1 - beta_t) * I + beta_t / K + + beta_t: (bs) noise level between 0 and 1 + returns: qx (bs, dx, dx), qe (bs, de, de), qy (bs, dy, dy). + """ + beta_t = beta_t.unsqueeze(axis=1) + q_x = beta_t * self.u_x + (1 - beta_t) * paddle.eye( + num_rows=self.X_classes + ).unsqueeze(axis=0) + q_e = beta_t * self.u_e + (1 - beta_t) * paddle.eye( + num_rows=self.E_classes + ).unsqueeze(axis=0) + q_y = beta_t * self.u_y + (1 - beta_t) * paddle.eye( + num_rows=self.y_classes + ).unsqueeze(axis=0) + return diffgraphformer_utils.PlaceHolder(X=q_x, E=q_e, y=q_y) + + def get_Qt_bar(self, alpha_bar_t): + """Returns t-step transition matrices for X and E, from step 0 to step t. + Qt = prod(1 - beta_t) * I + (1 - prod(1 - beta_t)) / K + + alpha_bar_t: (bs) Product of the (1 - beta_t) for each time step from 0 to t. + returns: qx (bs, dx, dx), qe (bs, de, de), qy (bs, dy, dy). + """ + alpha_bar_t = alpha_bar_t.unsqueeze(axis=1) + q_x = ( + alpha_bar_t * paddle.eye(num_rows=self.X_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_x + ) + q_e = ( + alpha_bar_t * paddle.eye(num_rows=self.E_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_e + ) + q_y = ( + alpha_bar_t * paddle.eye(num_rows=self.y_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_y + ) + return diffgraphformer_utils.PlaceHolder(X=q_x, E=q_e, y=q_y) + + +class MarginalUniformTransition: + def __init__(self, x_marginals, e_marginals, y_classes): + self.X_classes = len(x_marginals) + self.E_classes = len(e_marginals) + self.y_classes = y_classes + self.x_marginals = x_marginals + self.e_marginals = e_marginals + self.u_x = ( + x_marginals.unsqueeze(axis=0) + .expand(shape=[self.X_classes, -1]) + .unsqueeze(axis=0) + ) + self.u_e = ( + e_marginals.unsqueeze(axis=0) + .expand(shape=[self.E_classes, -1]) + .unsqueeze(axis=0) + ) + self.u_y = paddle.ones(shape=[1, self.y_classes, self.y_classes]) + if self.y_classes > 0: + self.u_y = self.u_y / self.y_classes + + def get_Qt(self, beta_t): + """Returns one-step transition matrices for X and E, from step t - 1 to step t. + Qt = (1 - beta_t) * I + beta_t / K + + beta_t: (bs) noise level between 0 and 1 + returns: qx (bs, dx, dx), qe (bs, de, de), qy (bs, dy, dy).""" + beta_t = beta_t.unsqueeze(axis=1) + q_x = ( + ( + beta_t * self.u_x + + (1 - beta_t) * paddle.eye(num_rows=self.X_classes).unsqueeze(axis=0) + ) + if self.X_classes != 0 + else diffgraphformer_utils.return_empty + ) + q_e = ( + ( + beta_t * self.u_e + + (1 - beta_t) * paddle.eye(num_rows=self.E_classes).unsqueeze(axis=0) + ) + if self.E_classes != 0 + else diffgraphformer_utils.return_empty + ) + q_y = ( + ( + beta_t * self.u_y + + (1 - beta_t) * paddle.eye(num_rows=self.y_classes).unsqueeze(axis=0) + ) + if self.y_classes != 0 + else diffgraphformer_utils.return_empty + ) + return diffgraphformer_utils.PlaceHolder(X=q_x, E=q_e, y=q_y) + + def get_Qt_bar(self, alpha_bar_t): + """Returns t-step transition matrices for X and E, from step 0 to step t. + Qt = prod(1 - beta_t) * I + (1 - prod(1 - beta_t)) * K + + alpha_bar_t: (bs) Product of the (1 - beta_t) for each time step from 0 to t. + returns: qx (bs, dx, dx), qe (bs, de, de), qy (bs, dy, dy). + """ + alpha_bar_t = alpha_bar_t.unsqueeze(axis=1) + q_x = ( + ( + alpha_bar_t * paddle.eye(num_rows=self.X_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_x + ) + if self.X_classes != 0 + else diffgraphformer_utils.return_empty + ) + q_e = ( + ( + alpha_bar_t * paddle.eye(num_rows=self.E_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_e + ) + if self.E_classes != 0 + else diffgraphformer_utils.return_empty + ) + q_y = ( + ( + alpha_bar_t * paddle.eye(num_rows=self.y_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_y + ) + if self.y_classes != 0 + else diffgraphformer_utils.return_empty + ) + return diffgraphformer_utils.PlaceHolder(X=q_x, E=q_e, y=q_y) + + +class AbsorbingStateTransition: + def __init__(self, abs_state: int, x_classes: int, e_classes: int, y_classes: int): + self.X_classes = x_classes + self.E_classes = e_classes + self.y_classes = y_classes + self.u_x = paddle.zeros(shape=[1, self.X_classes, self.X_classes]) + self.u_x[:, :, abs_state] = 1 + self.u_e = paddle.zeros(shape=[1, self.E_classes, self.E_classes]) + self.u_e[:, :, abs_state] = 1 + self.u_y = paddle.zeros(shape=[1, self.y_classes, self.y_classes]) + self.u_e[:, :, abs_state] = 1 + + def get_Qt(self, beta_t): + """Returns two transition matrix for X and E""" + beta_t = beta_t.unsqueeze(axis=1) + q_x = beta_t * self.u_x + (1 - beta_t) * paddle.eye( + num_rows=self.X_classes + ).unsqueeze(axis=0) + q_e = beta_t * self.u_e + (1 - beta_t) * paddle.eye( + num_rows=self.E_classes + ).unsqueeze(axis=0) + q_y = beta_t * self.u_y + (1 - beta_t) * paddle.eye( + num_rows=self.y_classes + ).unsqueeze(axis=0) + return q_x, q_e, q_y + + def get_Qt_bar(self, alpha_bar_t): + """beta_t: (bs) + Returns transition matrices for X and E""" + alpha_bar_t = alpha_bar_t.unsqueeze(axis=1) + q_x = ( + alpha_bar_t * paddle.eye(num_rows=self.X_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_x + ) + q_e = ( + alpha_bar_t * paddle.eye(num_rows=self.E_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_e + ) + q_y = ( + alpha_bar_t * paddle.eye(num_rows=self.y_classes).unsqueeze(axis=0) + + (1 - alpha_bar_t) * self.u_y + ) + return q_x, q_e, q_y diff --git a/ppmat/schedulers/scheduling_diffprior.py b/ppmat/schedulers/scheduling_diffprior.py new file mode 100644 index 00000000..2ca9564e --- /dev/null +++ b/ppmat/schedulers/scheduling_diffprior.py @@ -0,0 +1,269 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import math + +import numpy +import paddle + +from ppmat.models.diffnmr.utils.diffprior_utils import default +from ppmat.models.diffnmr.utils.diffprior_utils import first +from ppmat.models.diffnmr.utils.diffprior_utils import log + + +class NoiseScheduler(paddle.nn.Layer): + def __init__( + self, + *, + beta_schedule, + timesteps, + loss_type, + p2_loss_weight_gamma=0.0, + p2_loss_weight_k=1, + ): + super().__init__() + if beta_schedule == "cosine": + betas = cosine_beta_schedule(timesteps) + elif beta_schedule == "linear": + betas = linear_beta_schedule(timesteps) + elif beta_schedule == "quadratic": + betas = quadratic_beta_schedule(timesteps) + elif beta_schedule == "jsd": + betas = 1.0 / paddle.linspace(start=timesteps, stop=1, num=timesteps) + elif beta_schedule == "sigmoid": + betas = sigmoid_beta_schedule(timesteps) + else: + raise NotImplementedError() + alphas = 1.0 - betas + alphas_cumprod = paddle.cumprod(alphas, dim=0) + alphas_cumprod_prev = paddle.nn.functional.pad( + x=alphas_cumprod[:-1], pad=(1, 0), value=1.0, pad_from_left_axis=False + ) + (timesteps,) = tuple(betas.shape) + self.num_timesteps = int(timesteps) + if loss_type == "l1": + loss_fn = paddle.nn.functional.l1_loss + elif loss_type == "l2": + loss_fn = paddle.nn.functional.mse_loss + elif loss_type == "huber": + loss_fn = paddle.nn.functional.smooth_l1_loss + else: + raise NotImplementedError() + self.loss_type = loss_type + self.loss_fn = loss_fn + register_buffer = lambda name, val: self.register_buffer( # noqa + name=name, tensor=val.to("float32") + ) + register_buffer("betas", betas) + register_buffer("alphas_cumprod", alphas_cumprod) + register_buffer("alphas_cumprod_prev", alphas_cumprod_prev) + register_buffer("sqrt_alphas_cumprod", paddle.sqrt(x=alphas_cumprod)) + register_buffer( + "sqrt_one_minus_alphas_cumprod", paddle.sqrt(x=1.0 - alphas_cumprod) + ) + register_buffer( + "log_one_minus_alphas_cumprod", paddle.log(x=1.0 - alphas_cumprod) + ) + register_buffer( + "sqrt_recip_alphas_cumprod", paddle.sqrt(x=1.0 / alphas_cumprod) + ) + register_buffer( + "sqrt_recipm1_alphas_cumprod", paddle.sqrt(x=1.0 / alphas_cumprod - 1) + ) + posterior_variance = ( + betas * (1.0 - alphas_cumprod_prev) / (1.0 - alphas_cumprod) + ) + register_buffer("posterior_variance", posterior_variance) + register_buffer( + "posterior_log_variance_clipped", + paddle.log(x=posterior_variance.clip(min=1e-20)), + ) + register_buffer( + "posterior_mean_coef1", + betas * paddle.sqrt(x=alphas_cumprod_prev) / (1.0 - alphas_cumprod), + ) + register_buffer( + "posterior_mean_coef2", + (1.0 - alphas_cumprod_prev) + * paddle.sqrt(x=alphas) + / (1.0 - alphas_cumprod), + ) + self.has_p2_loss_reweighting = p2_loss_weight_gamma > 0.0 + register_buffer( + "p2_loss_weight", + (p2_loss_weight_k + alphas_cumprod / (1 - alphas_cumprod)) + ** -p2_loss_weight_gamma, + ) + + def sample_random_times(self, batch): + return paddle.randint( + low=0, high=self.num_timesteps, shape=(batch,), dtype="int64" + ) + + def q_posterior(self, x_start, x_t, t): + posterior_mean = ( + extract(self.posterior_mean_coef1, t, tuple(x_t.shape)) * x_start + + extract(self.posterior_mean_coef2, t, tuple(x_t.shape)) * x_t + ) + posterior_variance = extract(self.posterior_variance, t, tuple(x_t.shape)) + posterior_log_variance_clipped = extract( + self.posterior_log_variance_clipped, t, tuple(x_t.shape) + ) + return (posterior_mean, posterior_variance, posterior_log_variance_clipped) + + def q_sample(self, x_start, t, noise=None): + noise = default( + noise, lambda: paddle.randn(shape=x_start.shape, dtype=x_start.dtype) + ) + return ( + extract(self.sqrt_alphas_cumprod, t, tuple(x_start.shape)) * x_start + + extract(self.sqrt_one_minus_alphas_cumprod, t, tuple(x_start.shape)) + * noise + ) + + def calculate_v(self, x_start, t, noise=None): + return ( + extract(self.sqrt_alphas_cumprod, t, tuple(x_start.shape)) * noise + - extract(self.sqrt_one_minus_alphas_cumprod, t, tuple(x_start.shape)) + * x_start + ) + + def q_sample_from_to(self, x_from, from_t, to_t, noise=None): + shape = tuple(x_from.shape) + noise = default( + noise, lambda: paddle.randn(shape=x_from.shape, dtype=x_from.dtype) + ) + alpha = extract(self.sqrt_alphas_cumprod, from_t, shape) + sigma = extract(self.sqrt_one_minus_alphas_cumprod, from_t, shape) + alpha_next = extract(self.sqrt_alphas_cumprod, to_t, shape) + sigma_next = extract(self.sqrt_one_minus_alphas_cumprod, to_t, shape) + return ( + x_from * (alpha_next / alpha) + + noise * (sigma_next * alpha - sigma * alpha_next) / alpha + ) + + def predict_start_from_v(self, x_t, t, v): + return ( + extract(self.sqrt_alphas_cumprod, t, tuple(x_t.shape)) * x_t + - extract(self.sqrt_one_minus_alphas_cumprod, t, tuple(x_t.shape)) * v + ) + + def predict_start_from_noise(self, x_t, t, noise): + return ( + extract(self.sqrt_recip_alphas_cumprod, t, tuple(x_t.shape)) * x_t + - extract(self.sqrt_recipm1_alphas_cumprod, t, tuple(x_t.shape)) * noise + ) + + def predict_noise_from_start(self, x_t, t, x0): + return ( + extract(self.sqrt_recip_alphas_cumprod, t, tuple(x_t.shape)) * x_t - x0 + ) / extract(self.sqrt_recipm1_alphas_cumprod, t, tuple(x_t.shape)) + + def p2_reweigh_loss(self, loss, times): + if not self.has_p2_loss_reweighting: + return loss + return loss * extract(self.p2_loss_weight, times, tuple(loss.shape)) + + +def extract(a, t, x_shape): + b, *_ = tuple(t.shape) + out = a.take_along_axis(axis=-1, indices=t, broadcast=False) + return out.reshape(b, *((1,) * (len(x_shape) - 1))) + + +def meanflat(x): + return x.mean(axis=tuple(range(1, len(tuple(x.shape))))) + + +def normal_kl(mean1, logvar1, mean2, logvar2): + return 0.5 * ( + -1.0 + + logvar2 + - logvar1 + + paddle.exp(x=logvar1 - logvar2) + + (mean1 - mean2) ** 2 * paddle.exp(x=-logvar2) + ) + + +def approx_standard_normal_cdf(x): + return 0.5 * ( + 1.0 + + paddle.nn.functional.tanh(x=(2.0 / math.pi) ** 0.5 * (x + 0.044715 * x**3)) + ) + + +def discretized_gaussian_log_likelihood(x, *, means, log_scales, thres=0.999): + assert tuple(x.shape) == tuple(means.shape) == tuple(log_scales.shape) + eps = 1e-12 if x.dtype == "float32" else 0.001 + centered_x = x - means + inv_stdv = paddle.exp(x=-log_scales) + plus_in = inv_stdv * (centered_x + 1.0 / 255.0) + cdf_plus = approx_standard_normal_cdf(plus_in) + min_in = inv_stdv * (centered_x - 1.0 / 255.0) + cdf_min = approx_standard_normal_cdf(min_in) + log_cdf_plus = log(cdf_plus, eps=eps) + log_one_minus_cdf_min = log(1.0 - cdf_min, eps=eps) + cdf_delta = cdf_plus - cdf_min + log_probs = paddle.where( + condition=x < -thres, + x=log_cdf_plus, + y=paddle.where( + condition=x > thres, x=log_one_minus_cdf_min, y=log(cdf_delta, eps=eps) + ), + ) + return log_probs + + +def cosine_beta_schedule(timesteps, s=0.008): + """ + cosine schedule as proposed in https://openreview.net/forum?id=-NEXDKk8gZ + """ + steps = timesteps + 1 + x = paddle.linspace(start=0, stop=timesteps, num=steps, dtype="float64") + alphas_cumprod = paddle.cos(x=(x / timesteps + s) / (1 + s) * numpy.pi * 0.5) ** 2 + alphas_cumprod = alphas_cumprod / first(alphas_cumprod) + betas = 1 - alphas_cumprod[1:] / alphas_cumprod[:-1] + return paddle.clip(x=betas, min=0, max=0.999) + + +def linear_beta_schedule(timesteps): + scale = 1000 / timesteps + beta_start = scale * 0.0001 + beta_end = scale * 0.02 + return paddle.linspace( + start=beta_start, stop=beta_end, num=timesteps, dtype="float64" + ) + + +def quadratic_beta_schedule(timesteps): + scale = 1000 / timesteps + beta_start = scale * 0.0001 + beta_end = scale * 0.02 + return ( + paddle.linspace( + start=beta_start**0.5, + stop=beta_end**0.5, + num=timesteps, + dtype="float64", + ) + ** 2 + ) + + +def sigmoid_beta_schedule(timesteps): + scale = 1000 / timesteps + beta_start = scale * 0.0001 + beta_end = scale * 0.02 + betas = paddle.linspace(start=-6, stop=6, num=timesteps, dtype="float64") + return paddle.nn.functional.sigmoid(x=betas) * (beta_end - beta_start) + beta_start diff --git a/ppmat/schedulers/scheduling_lattice_vp.py b/ppmat/schedulers/scheduling_lattice_vp.py new file mode 100644 index 00000000..a1d89be6 --- /dev/null +++ b/ppmat/schedulers/scheduling_lattice_vp.py @@ -0,0 +1,234 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import paddle + +from ppmat.utils import logger +from ppmat.utils.crystal import compute_lattice_polar_decomposition +from ppmat.utils.misc import expand +from ppmat.utils.misc import make_noise_symmetric_preserve_variance +from ppmat.utils.misc import maybe_expand + + +class LatticeVPSDEScheduler: + """Lattice Variance Preserving SDE Scheduler. + + Args: + beta_min (float, optional): Minimum beta value. Defaults to 0.1. + beta_max (float, optional): Maximum beta value. Defaults to 20. + limit_density (float, optional): Limit density. Defaults to 0.05. + limit_var_scaling_constant (float, optional): Scaling constant for limiting + variance. Defaults to 0.25. + snr (float, optional): Signal-to-Noise ratio. Defaults to 0.2. + max_step_size (int, optional): Maximum allowed integration step size to ensure + numerical stability. Defaults to 1,000,000. + """ + + def __init__( + self, + beta_min: float = 0.1, + beta_max: float = 20, + limit_density: float = 0.05, + limit_var_scaling_constant: float = 0.25, + snr: float = 0.2, + max_step_size: int = 1000000, + ): + self.beta_min = beta_min + self.beta_max = beta_max + self.limit_density = limit_density + self.limit_var_scaling_constant = limit_var_scaling_constant + + self.T = 1.0 + self.snr = snr + self.max_step_size = max_step_size + + def beta(self, t: paddle.Tensor) -> paddle.Tensor: + return self.beta_min + t * (self.beta_max - self.beta_min) + + def _marginal_mean_coeff(self, t: paddle.Tensor) -> paddle.Tensor: + log_mean_coeff = ( + -0.25 * t**2 * (self.beta_max - self.beta_min) - 0.5 * t * self.beta_min + ) + return paddle.exp(x=log_mean_coeff) + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + num_atoms: paddle.Tensor, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + mean_coeff = self._marginal_mean_coeff(t) + limit_mean = self.get_limit_mean(x=x, num_atoms=num_atoms) + limit_var = self.get_limit_var(x=x, num_atoms=num_atoms) + mean_coeff_expanded = maybe_expand(mean_coeff, batch=None, like=x) + mean = mean_coeff_expanded * x + (1 - mean_coeff_expanded) * limit_mean + std = paddle.sqrt(x=(1.0 - mean_coeff_expanded**2) * limit_var) + return mean, std + + def get_limit_mean(self, x: paddle.Tensor, num_atoms=None) -> paddle.Tensor: + return paddle.pow( + x=paddle.eye(num_rows=3).expand(shape=x.shape) + * num_atoms[:, None, None].astype("float32") + / self.limit_density, + y=1.0 / 3, + ) + + def get_limit_var(self, x: paddle.Tensor, num_atoms) -> paddle.Tensor: + """ + Returns the element-wise variance of the limit distribution. + NOTE: even though we have a different limit variance per data + dimension we still sample IID for each element per data point. + We do NOT do any correlated sampling over data dimensions per + data point. + + Return shape=x.shape + """ + n_atoms_expanded = expand(num_atoms, tuple(x.shape)) + n_atoms_expanded = paddle.tile(x=n_atoms_expanded, repeat_times=(1, 3, 3)).cast( + "float32" + ) + out = ( + paddle.pow(x=n_atoms_expanded, y=2.0 / 3) * self.limit_var_scaling_constant + ) + return out + + def add_noise( + self, + original_samples: paddle.Tensor, + noise: paddle.Tensor, + timesteps: paddle.Tensor, + num_atoms: paddle.Tensor, + ) -> paddle.Tensor: + mean, std = self.marginal_prob( + x=original_samples, t=timesteps, num_atoms=num_atoms + ) + if noise is None: + z = paddle.randn(shape=original_samples.shape, dtype=original_samples.dtype) + noise = make_noise_symmetric_preserve_variance(z) + return mean + expand(std, tuple(noise.shape)) * noise + + def prior_sampling( + self, + shape: (list | tuple), + num_atoms: paddle.Tensor, + ) -> paddle.Tensor: + x_sample = paddle.randn(shape=shape) + x_sample = make_noise_symmetric_preserve_variance(x_sample) + limit_mean = self.get_limit_mean(x=x_sample, num_atoms=num_atoms) + limit_var = self.get_limit_var(x=x_sample, num_atoms=num_atoms) + return x_sample * limit_var.sqrt() + limit_mean + + def get_alpha(self, t: paddle.Tensor) -> paddle.Tensor: + alpha = 1 - self.beta(t) * self.T / 1000 + return alpha + + def step_correct( + self, + x: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + t: paddle.Tensor, + ): + alpha = self.get_alpha(t) + noise = paddle.randn(shape=x.shape, dtype=x.dtype) + noise = make_noise_symmetric_preserve_variance(noise) + grad_norm_square = ( + paddle.square(x=score).reshape(tuple(score.shape)[0], -1).sum(axis=1) + ) + noise_norm_square = ( + paddle.square(x=noise).reshape(tuple(noise.shape)[0], -1).sum(axis=1) + ) + grad_norm = grad_norm_square.sqrt().mean() + noise_norm = noise_norm_square.sqrt().mean() + step_size = (self.snr * noise_norm / grad_norm) ** 2 * 2 * alpha + step_size = paddle.minimum( + x=step_size, y=paddle.to_tensor(self.max_step_size, dtype="float32") + ) + if grad_norm == 0: + step_size[:] = self.max_step_size + step_size = maybe_expand(step_size, batch_idx, score) + mean = x + step_size * score + x = mean + paddle.sqrt(x=step_size * 2) * noise + x = compute_lattice_polar_decomposition(x) + mean = compute_lattice_polar_decomposition(mean) + return x, mean + + def step_pred( + self, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + num_atoms, + ): + x_coeff, score_coeff, std = self._get_coeffs( + x=x, t=t, dt=dt, batch_idx=batch_idx, num_atoms=num_atoms + ) + mean_coeff = 1 - x_coeff + z = make_noise_symmetric_preserve_variance( + paddle.randn(shape=x_coeff.shape, dtype=x_coeff.dtype) + ) + mean = ( + x_coeff * x + + score_coeff * score + + mean_coeff * self.get_limit_mean(x=x, num_atoms=num_atoms) + ) + sample = mean + std * z + return sample, mean + + def mean_coeff_and_std( + self, + x: paddle.Tensor, + t: paddle.Tensor, + num_atoms=None, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + """Returns mean coefficient and standard deviation of marginal distribution at + time t.""" + mean_coeff = self._marginal_mean_coeff(t) + std = self.marginal_prob(x, t, num_atoms)[1] + return maybe_expand(mean_coeff, batch=None, like=x), std + + def _get_coeffs(self, x, t, dt, batch_idx, num_atoms): + """ + Compute coefficients for ancestral sampling. + This is in a separate method to make it easier to test.""" + + s = t + dt + alpha_t, sigma_t = self.mean_coeff_and_std(x=x, t=t, num_atoms=num_atoms) + if batch_idx is None: + is_time_zero = s <= 0 + else: + is_time_zero = s[batch_idx] <= 0 + alpha_s, sigma_s = self.mean_coeff_and_std(x=x, t=s, num_atoms=num_atoms) + sigma_s[is_time_zero] = 0 + sigma2_t_given_s = sigma_t**2 - sigma_s**2 * alpha_t**2 / alpha_s**2 + sigma_t_given_s = paddle.sqrt(x=sigma2_t_given_s) + std = sigma_t_given_s * sigma_s / sigma_t + min_alpha_t_given_s = 0.001 + alpha_t_given_s = alpha_t / alpha_s + if paddle.any(x=alpha_t_given_s < min_alpha_t_given_s): + logger.warning( + f"Clipping alpha_t_given_s to {min_alpha_t_given_s} to avoid " + "divide-by-zero. You should probably change something else to avoid " + "this." + ) + alpha_t_given_s = paddle.clip( + x=alpha_t_given_s, min=min_alpha_t_given_s, max=1 + ) + score_coeff = sigma2_t_given_s / alpha_t_given_s + x_coeff = 1.0 / alpha_t_given_s + std[is_time_zero] = 0 + return x_coeff, score_coeff, std diff --git a/ppmat/schedulers/scheduling_sde_ve.py b/ppmat/schedulers/scheduling_sde_ve.py new file mode 100644 index 00000000..b9d32892 --- /dev/null +++ b/ppmat/schedulers/scheduling_sde_ve.py @@ -0,0 +1,551 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is adapted from https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers + +import math +from dataclasses import dataclass +from typing import Optional +from typing import Tuple +from typing import Union + +import paddle + +from ppmat.utils.paddle_utils import randn_tensor + + +def p_wrapped_normal(x, sigma, N=10, T=1.0): + p_ = 0 + for i in range(-N, N + 1): + p_ += paddle.exp(x=-((x + T * i) ** 2) / 2 / sigma**2) + return p_ + + +def d_log_p_wrapped_normal(x, sigma, N=10, T=1.0): + p_ = 0 + for i in range(-N, N + 1): + exp1 = paddle.exp(x=-((x + T * i) ** 2) / 2 / sigma**2) + p_ += (x + T * i) / sigma**2 * exp1 + return p_ / p_wrapped_normal(x, sigma, N, T) + + +def sigma_norm(sigma, T=1.0, sn=10000): + sigmas = sigma[None, :].tile([sn, 1]) + nprandom = paddle.randn(shape=sigmas.shape, dtype=sigmas.dtype) + x_sample = sigma * nprandom + x_sample = x_sample % T + normal_ = d_log_p_wrapped_normal(x_sample, sigmas, T=T) + return (normal_**2).mean(axis=0) + + +@dataclass +class SdeVeOutput: + """ + Output class for the scheduler's `step` function output. + + Args: + prev_sample (`paddle.Tensor` of shape `(batch_size, num_channels, + height, width)` for images): Computed sample `(x_{t-1})` of previous + timestep. `prev_sample` should be used as next model input in the + denoising loop. + prev_sample_mean (`paddle.Tensor` of shape `(batch_size, num_channels, + height, width)` for images): Mean averaged `prev_sample` over previous + timesteps. + """ + + prev_sample: paddle.Tensor + prev_sample_mean: paddle.Tensor + + +@dataclass +class SchedulerOutput: + """ + Base class for the output of a scheduler's `step` function. + + Args: + prev_sample (`paddle.Tensor` of shape `(batch_size, num_channels, height, + width)` for images): Computed sample `(x_{t-1})` of previous timestep. + `prev_sample` should be used as next model input in the denoising loop. + """ + + prev_sample: paddle.Tensor + + +class ScoreSdeVeScheduler: + """ + `ScoreSdeVeScheduler` is a variance exploding stochastic differential equation + (SDE) scheduler. + + This model inherits from [`SchedulerMixin`] and [`ConfigMixin`]. Check the + superclass documentation for the generic methods the library implements for all + schedulers such as loading and saving. + + Args: + num_train_timesteps (`int`, defaults to 1000): + The number of diffusion steps to train the model. + snr (`float`, defaults to 0.15): + A coefficient weighting the step from the `model_output` sample (from the + network) to the random noise. + sigma_min (`float`, defaults to 0.01): + The initial noise scale for the sigma sequence in the sampling procedure. + The minimum sigma should mirror the distribution of the data. + sigma_max (`float`, defaults to 1348.0): + The maximum value used for the range of continuous timesteps passed into + the model. + sampling_eps (`float`, defaults to 1e-5): + The end value of sampling where timesteps decrease progressively from 1 to + epsilon. + correct_steps (`int`, defaults to 1): + The number of correction steps performed on a produced sample. + """ + + order = 1 + + def __init__( + self, + num_train_timesteps: int = 2000, + snr: float = 0.15, + sigma_min: float = 0.01, + sigma_max: float = 1348.0, + sampling_eps: float = 1e-5, + correct_steps: int = 1, + ): + self.num_train_timesteps = num_train_timesteps + self.snr = snr + self.sigma_min = sigma_min + self.sigma_max = sigma_max + self.sampling_eps = sampling_eps + self.correct_steps = correct_steps + + # standard deviation of the initial noise distribution + self.init_noise_sigma = sigma_max + + # setable values + self.timesteps = None + + self.set_sigmas(num_train_timesteps, sigma_min, sigma_max, sampling_eps) + + def scale_model_input( + self, sample: paddle.Tensor, timestep: Optional[int] = None + ) -> paddle.Tensor: + """ + Ensures interchangeability with schedulers that need to scale the denoising + model input depending on the current timestep. + + Args: + sample (`paddle.Tensor`): + The input sample. + timestep (`int`, *optional*): + The current timestep in the diffusion chain. + + Returns: + `paddle.Tensor`: + A scaled input sample. + """ + return sample + + def set_timesteps(self, num_inference_steps: int, sampling_eps: float = None): + """ + Sets the continuous timesteps used for the diffusion chain (to be run before + inference). + + Args: + num_inference_steps (`int`): + The number of diffusion steps used when generating samples with a + pre-trained model. + sampling_eps (`float`, *optional*): + The final timestep value (overrides value given during scheduler + instantiation). + + """ + sampling_eps = sampling_eps if sampling_eps is not None else self.sampling_eps + + self.timesteps = paddle.linspace(1, sampling_eps, num_inference_steps) + + def set_sigmas( + self, + num_inference_steps: int, + sigma_min: float = None, + sigma_max: float = None, + sampling_eps: float = None, + ): + """ + Sets the noise scales used for the diffusion chain (to be run before + inference). The sigmas control the weight of the `drift` and `diffusion` + components of the sample update. + + Args: + num_inference_steps (`int`): + The number of diffusion steps used when generating samples with a + pre-trained model. + sigma_min (`float`, optional): + The initial noise scale value (overrides value given during scheduler + instantiation). + sigma_max (`float`, optional): + The final noise scale value (overrides value given during scheduler + instantiation). + sampling_eps (`float`, optional): + The final timestep value (overrides value given during scheduler + instantiation). + + """ + sigma_min = sigma_min if sigma_min is not None else self.sigma_min + sigma_max = sigma_max if sigma_max is not None else self.sigma_max + sampling_eps = sampling_eps if sampling_eps is not None else self.sampling_eps + if self.timesteps is None: + self.set_timesteps(num_inference_steps, sampling_eps) + + self.sigmas = sigma_min * (sigma_max / sigma_min) ** ( + self.timesteps / sampling_eps + ) + self.discrete_sigmas = paddle.exp( + paddle.linspace( + math.log(sigma_min), math.log(sigma_max), num_inference_steps + ) + ) + self.sigmas = paddle.to_tensor( + [sigma_min * (sigma_max / sigma_min) ** t for t in self.timesteps] + ) + + def get_adjacent_sigma(self, timesteps, t): + # NOTE (TODO, junnyu) BUG in PaddlePaddle, here is the issue https://github.com/PaddlePaddle/Paddle/issues/56335 + index = timesteps - 1 + if (index < 0).all(): + index += self.discrete_sigmas.shape[0] + return paddle.where( + timesteps == 0, + paddle.zeros_like(t), + self.discrete_sigmas[index], + ) + + def step_pred( + self, + model_output: paddle.Tensor, + timestep: int, + sample: paddle.Tensor, + generator: Optional[paddle.Generator] = None, + return_dict: bool = True, + ) -> Union[SdeVeOutput, Tuple]: + """ + Predict the sample from the previous timestep by reversing the SDE. This + function propagates the diffusion process from the learned model outputs + (most often the predicted noise). + + Args: + model_output (`paddle.Tensor`): + The direct output from learned diffusion model. + timestep (`int`): + The current discrete timestep in the diffusion chain. + sample (`paddle.Tensor`): + A current instance of a sample created by the diffusion process. + generator (`paddle.Generator`, *optional*): + A random number generator. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a + [`~schedulers.scheduling_sde_ve.SdeVeOutput`] or `tuple`. + + Returns: + [`~schedulers.scheduling_sde_ve.SdeVeOutput`] or `tuple`: + If return_dict is `True`, [`~schedulers.scheduling_sde_ve.SdeVeOutput`] + is returned, otherwise a tuple is returned where the first element is + the sample tensor. + + """ + if self.timesteps is None: + raise ValueError( + "`self.timesteps` is not set, you need to run 'set_timesteps' after " + "creating the scheduler" + ) + + timestep = timestep * paddle.ones( + [ + sample.shape[0], + ] + ) # paddle.repeat_interleave(timestep, sample.shape[0]) + timesteps = (timestep * (len(self.timesteps) - 1)).cast("int64") + + # NOTE(laixinlu) convert sigmas to the dtype of the model output + if self.discrete_sigmas.dtype != model_output.dtype: + self.discrete_sigmas = self.discrete_sigmas.cast(model_output.dtype) + + sigma = self.discrete_sigmas[timesteps] + adjacent_sigma = self.get_adjacent_sigma(timesteps, timestep) + drift = paddle.zeros_like(sample) + diffusion = (sigma**2 - adjacent_sigma**2) ** 0.5 + + # equation 6 in the paper: the model_output modeled by the network is + # grad_x log pt(x) also equation 47 shows the analog from SDE models to + # ancestral sampling methods + diffusion = diffusion.flatten() + while len(diffusion.shape) < len(sample.shape): + diffusion = diffusion.unsqueeze(-1) + drift = drift - diffusion**2 * model_output + + # equation 6: sample noise for the diffusion term of + noise = randn_tensor(sample.shape, generator=generator, dtype=sample.dtype) + prev_sample_mean = ( + sample - drift + ) # subtract because `dt` is a small negative timestep + # TODO is the variable diffusion the correct scaling term for the noise? + prev_sample = ( + prev_sample_mean + diffusion * noise + ) # add impact of diffusion field g + + if not return_dict: + return (prev_sample, prev_sample_mean) + + return SdeVeOutput(prev_sample=prev_sample, prev_sample_mean=prev_sample_mean) + + def step_correct( + self, + model_output: paddle.Tensor, + sample: paddle.Tensor, + generator: Optional[paddle.Generator] = None, + return_dict: bool = True, + ) -> Union[SchedulerOutput, Tuple]: + """ + Correct the predicted sample based on the `model_output` of the network. This + is often run repeatedly after making the prediction for the previous timestep. + + Args: + model_output (`paddle.Tensor`): + The direct output from learned diffusion model. + sample (`paddle.Tensor`): + A current instance of a sample created by the diffusion process. + generator (`paddle.Generator`, *optional*): + A random number generator. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a + [`~schedulers.scheduling_sde_ve.SdeVeOutput`] or `tuple`. + + Returns: + [`~schedulers.scheduling_sde_ve.SdeVeOutput`] or `tuple`: + If return_dict is `True`, [`~schedulers.scheduling_sde_ve.SdeVeOutput`] + is returned, otherwise a tuple is returned where the first element is + the sample tensor. + + """ + if self.timesteps is None: + raise ValueError( + "`self.timesteps` is not set, you need to run 'set_timesteps' after " + "creating the scheduler" + ) + + # NOTE(laixinlu) convert sigmas to the dtype of the model output + if self.sigmas.dtype != model_output.dtype: + self.sigmas = self.sigmas.cast(model_output.dtype) + + # For small batch sizes, the paper "suggest replacing norm(z) with sqrt(d), + # where d is the dim. of z" sample noise for correction + noise = randn_tensor(sample.shape, generator=generator) + + # compute step size from the model_output, the noise, and the snr + grad_norm = paddle.norm( + model_output.reshape([model_output.shape[0], -1]), axis=-1 + ).mean() + noise_norm = paddle.norm(noise.reshape([noise.shape[0], -1]), axis=-1).mean() + step_size = (self.snr * noise_norm / grad_norm) ** 2 * 2 + step_size = step_size * paddle.ones((sample.shape[0],)) + # self.repeat_scalar(step_size, sample.shape[0]) + + # compute corrected sample: model_output term and noise term + step_size = step_size.flatten() + while len(step_size.shape) < len(sample.shape): + step_size = step_size.unsqueeze(-1) + prev_sample_mean = sample + step_size * model_output + prev_sample = prev_sample_mean + ((step_size * 2) ** 0.5) * noise + + if not return_dict: + return (prev_sample,) + + return SchedulerOutput(prev_sample=prev_sample) + + def add_noise( + self, + original_samples: paddle.Tensor, + noise: paddle.Tensor, + timesteps: paddle.Tensor, + ) -> paddle.Tensor: + # Fix 0D tensor + if paddle.is_tensor(timesteps) and timesteps.ndim == 0: + timesteps = timesteps.unsqueeze(0) + # Make sure sigmas and timesteps have the same dtype as original_samples + sigmas = self.discrete_sigmas[timesteps] + sigmas = sigmas.flatten() + while len(sigmas.shape) < len(noise.shape): + sigmas = sigmas.unsqueeze(-1) + noise = ( + noise * sigmas + if noise is not None + else paddle.randn(original_samples.shape, dtype=original_samples.dtype) + * sigmas + ) + noisy_samples = noise + original_samples + return noisy_samples + + def __len__(self): + return self.num_train_timesteps + + +class ScoreSdeVeSchedulerWrapped(ScoreSdeVeScheduler): + """ + `ScoreSdeVeScheduler` is a variance exploding stochastic differential + equation (SDE) scheduler. + + This model inherits from [`SchedulerMixin`] and [`ConfigMixin`]. Check the + superclass documentation for the generic methods the library implements for all + schedulers such as loading and saving. + + Args: + num_train_timesteps (`int`, defaults to 1000): + The number of diffusion steps to train the model. + snr (`float`, defaults to 0.15): + A coefficient weighting the step from the `model_output` sample (from the + network) to the random noise. + sigma_min (`float`, defaults to 0.01): + The initial noise scale for the sigma sequence in the sampling procedure. + The minimum sigma should mirror the distribution of the data. + sigma_max (`float`, defaults to 1348.0): + The maximum value used for the range of continuous timesteps passed into + the model. + sampling_eps (`float`, defaults to 1e-5): + The end value of sampling where timesteps decrease progressively from 1 to + epsilon. + correct_steps (`int`, defaults to 1): + The number of correction steps performed on a produced sample. + """ + + order = 1 + + def __init__( + self, + num_train_timesteps: int = 2000, + snr: float = 0.15, + sigma_min: float = 0.01, + sigma_max: float = 1348.0, + sampling_eps: float = 1e-5, + correct_steps: int = 1, + ): + super().__init__( + num_train_timesteps=num_train_timesteps, + snr=snr, + sigma_min=sigma_min, + sigma_max=sigma_max, + sampling_eps=sampling_eps, + correct_steps=correct_steps, + ) + self.discrete_sigmas_norm = sigma_norm(self.discrete_sigmas) + + def step_correct( + self, + model_output: paddle.Tensor, + timestep: float, + sample: paddle.Tensor, + generator: Optional[paddle.Generator] = None, + return_dict: bool = True, + ) -> Union[SchedulerOutput, Tuple]: + timestep_discrete = (timestep * (len(self.timesteps) - 1)).cast("int64") + sigma_norm = self.discrete_sigmas_norm[timestep_discrete] + model_output = model_output * sigma_norm**0.5 + + if self.timesteps is None: + raise ValueError( + "`self.timesteps` is not set, you need to run 'set_timesteps' after " + "creating the scheduler" + ) + + # NOTE(laixinlu) convert sigmas to the dtype of the model output + if self.sigmas.dtype != model_output.dtype: + self.sigmas = self.sigmas.cast(model_output.dtype) + + # For small batch sizes, the paper "suggest replacing norm(z) with sqrt(d), + # where d is the dim. of z" sample noise for correction + noise = randn_tensor(sample.shape, generator=generator) + + step_size = ( + self.snr + * (self.discrete_sigmas[timestep_discrete] / self.discrete_sigmas[0]) ** 2 + ) + # compute corrected sample: model_output term and noise term + # step_size = step_size.flatten() + # while len(step_size.shape) < len(sample.shape): + # step_size = step_size.unsqueeze(-1) + prev_sample_mean = sample - step_size * model_output + prev_sample = prev_sample_mean + ((step_size * 2) ** 0.5) * noise + + if not return_dict: + return (prev_sample,) + + return SchedulerOutput(prev_sample=prev_sample) + + def step_pred( + self, + model_output: paddle.Tensor, + timestep: float, + sample: paddle.Tensor, + generator: Optional[paddle.Generator] = None, + return_dict: bool = True, + ) -> Union[SchedulerOutput, Tuple]: + timestep_discrete = (timestep * (len(self.timesteps) - 1)).cast("int64") + sigma_norm = self.discrete_sigmas_norm[timestep_discrete] + model_output = model_output * sigma_norm**0.5 + + if self.timesteps is None: + raise ValueError( + "`self.timesteps` is not set, you need to run 'set_timesteps' after " + "creating the scheduler" + ) + + # timestep = timestep * paddle.ones( + # [ + # sample.shape[0], + # ] + # ) # paddle.repeat_interleave(timestep, sample.shape[0]) + + # NOTE(laixinlu) convert sigmas to the dtype of the model output + if self.discrete_sigmas.dtype != model_output.dtype: + self.discrete_sigmas = self.discrete_sigmas.cast(model_output.dtype) + + sigma = self.discrete_sigmas[timestep_discrete] + adjacent_sigma = self.get_adjacent_sigma(timestep_discrete, timestep) + drift = paddle.zeros_like(sample) + diffusion = (sigma**2 - adjacent_sigma**2) ** 0.5 + + # equation 6 in the paper: the model_output modeled by the network is + # grad_x log pt(x) also equation 47 shows the analog from SDE models to + # ancestral sampling methods + # diffusion = diffusion.flatten() + # while len(diffusion.shape) < len(sample.shape): + # diffusion = diffusion.unsqueeze(-1) + drift = drift + diffusion**2 * model_output + + # equation 6: sample noise for the diffusion term of + noise = randn_tensor(sample.shape, generator=generator, dtype=sample.dtype) + prev_sample_mean = ( + sample - drift + ) # subtract because `dt` is a small negative timestep + # TODO is the variable diffusion the correct scaling term for the noise? + diffusion2 = adjacent_sigma / sigma + # diffusion2 = diffusion2.flatten() + # while len(diffusion2.shape) < len(sample.shape): + # diffusion2 = diffusion2.unsqueeze(-1) + + prev_sample = ( + prev_sample_mean + diffusion * diffusion2 * noise + ) # add impact of diffusion field g + + if not return_dict: + return (prev_sample, prev_sample_mean) + + return SdeVeOutput(prev_sample=prev_sample, prev_sample_mean=prev_sample_mean) diff --git a/ppmat/schedulers/scheduling_wrapped_sde_ve.py b/ppmat/schedulers/scheduling_wrapped_sde_ve.py new file mode 100644 index 00000000..82f73b69 --- /dev/null +++ b/ppmat/schedulers/scheduling_wrapped_sde_ve.py @@ -0,0 +1,266 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from typing import Optional +from typing import Tuple + +import paddle + +from ppmat.utils import logger +from ppmat.utils.misc import maybe_expand +from ppmat.utils.scatter import scatter + + +def wrap_at_boundary(x: paddle.Tensor, wrapping_boundary: float) -> paddle.Tensor: + """Wrap x at the boundary given by wrapping_boundary. + Args: + x: tensor of shape (batch_size, dim) + wrapping_boundary: float): wrap at [0, wrapping_boundary] in all dimensions. + Returns: + wrapped_x: tensor of shape (batch_size, dim) + """ + return paddle.remainder(x=x, y=paddle.to_tensor(wrapping_boundary)) + + +class NumAtomsVarianceAdjustedWrappedVESDE: + """Variance-adjusted wrapped Variational Exponential SDE (VESDE) with atomic number + scaling. + + This implementation modifies the standard VESDE by scaling the variance using the + cubic root of the number of atoms. The goal is to reduce the influence by the cell + size on the variance of the fractional coordinates. + + Args: + wrapping_boundary (float | paddle.Tensor, optional): Defines the periodic + boundary range [0, wrapping_boundary] applied uniformly across all + dimensions. Defaults to 1.0. + sigma_min (float, optional): Minimum noise scale for the diffusion process. + This value should be tuned to match the data distribution's inherent noise + level. Defaults to 0.01. + + sigma_max (float, optional): Maximum noise scale controlling the upper bound of + the noise schedule. Larger values allow for more aggressive diffusion but + may require smaller step sizes. Defaults to 5.0. + + snr (float): Signal-to-Noise Ratio parameter balancing deterministic vs + stochastic components in the SDE. Lower values increase stochasticity. + Defaults to 0.4. + + max_step_size (int): Maximum allowed integration step size to ensure numerical + stability. Defaults to 1,000,000. + """ + + def __init__( + self, + wrapping_boundary: (float | paddle.Tensor) = 1.0, + sigma_min: float = 0.01, + sigma_max: float = 5.0, + snr: float = 0.4, + max_step_size: int = 1000000, + ): + self.sigma_min = sigma_min + self.sigma_max = sigma_max + + self.wrapping_boundary = wrapping_boundary + + self.snr = snr + self.max_step_size = max_step_size + + def std_scaling(self, num_atoms) -> paddle.Tensor: + return num_atoms ** (-1 / 3) + + def marginal_prob( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: paddle.Tensor, + num_atoms: paddle.Tensor, + ) -> tuple[paddle.Tensor, paddle.Tensor]: + mean = x + std = maybe_expand( + self.sigma_min * (self.sigma_max / self.sigma_min) ** t, batch_idx, x + ) + std_scale = self.std_scaling(num_atoms) + std = std * maybe_expand(std_scale, batch_idx, like=std) + return mean, std + + def wrap(self, x): + return wrap_at_boundary(x, self.wrapping_boundary) + + def sample_marginal( + self, + x: paddle.Tensor, + noise: paddle.Tensor, + t: paddle.Tensor, + batch_idx: paddle.Tensor, + num_atoms: paddle.Tensor, + ) -> paddle.Tensor: + """Sample marginal for x(t) given x(0). + Returns: + sampled x(t) + """ + mean, std = self.marginal_prob( + x=x, t=t, batch_idx=batch_idx, num_atoms=num_atoms + ) + if noise is None: + noise = paddle.randn(shape=x.shape, dtype=x.dtype) + return mean + std * noise + + def add_noise( + self, + original_samples: paddle.Tensor, + noise: paddle.Tensor, + timesteps: paddle.Tensor, + batch_idx: paddle.Tensor, + num_atoms: paddle.Tensor, + ) -> paddle.Tensor: + if (original_samples > self.wrapping_boundary).astype("bool").any() or ( + original_samples < 0 + ).astype("bool").any(): + logger.warning( + "Wrapped SDE has received input outside of the wrapping boundary." + ) + noisy_x = self.sample_marginal( + x=original_samples, + noise=noise, + t=timesteps, + batch_idx=batch_idx, + num_atoms=num_atoms, + ) + return self.wrap(noisy_x) + + def prior_sampling( + self, + shape: (list | tuple), + num_atoms: paddle.Tensor, + batch_idx: paddle.Tensor, + ) -> paddle.Tensor: + std_scale = self.std_scaling(num_atoms) + prior_sample = paddle.randn(shape=shape) * self.sigma_max + return self.wrap( + prior_sample * maybe_expand(std_scale, batch_idx, like=prior_sample) + ) + + def step_correct( + self, + model_output: paddle.Tensor, + timestep: paddle.Tensor, + sample: paddle.Tensor, + batch_idx: paddle.Tensor, + ): + + prev_sample, prev_sample_mean = self.step_given_score( + x=sample, score=model_output, t=timestep, batch_idx=batch_idx + ) + return self.wrap(prev_sample), self.wrap(prev_sample_mean) + + def step_given_score(self, x, batch_idx, score, t): + alpha = self.get_alpha(t) + snr = self.snr + noise = paddle.randn(shape=score.shape, dtype=score.dtype) + grad_norm_square = ( + paddle.square(x=score).reshape(tuple(score.shape)[0], -1).sum(axis=1) + ) + noise_norm_square = ( + paddle.square(x=noise).reshape(tuple(noise.shape)[0], -1).sum(axis=1) + ) + if batch_idx is None: + grad_norm = grad_norm_square.sqrt().mean() + noise_norm = noise_norm_square.sqrt().mean() + else: + grad_norm = paddle.sqrt( + x=scatter(grad_norm_square, dim=-1, index=batch_idx, reduce="add") + ).mean() + noise_norm = paddle.sqrt( + x=scatter(noise_norm_square, dim=-1, index=batch_idx, reduce="add") + ).mean() + step_size = (snr * noise_norm / grad_norm) ** 2 * 2 * alpha + step_size = paddle.minimum( + x=step_size, y=paddle.to_tensor(self.max_step_size, dtype="float32") + ) + if grad_norm == 0: + step_size[:] = self.max_step_size + step_size = maybe_expand(step_size, batch_idx, score) + mean = x + step_size * score + x = mean + paddle.sqrt(x=step_size * 2) * noise + return x, mean + + def get_alpha(self, t: paddle.Tensor) -> paddle.Tensor: + alpha = paddle.ones_like(x=t) + return alpha + + def step_pred( + self, + x: paddle.Tensor, + t: paddle.Tensor, + dt: paddle.Tensor, + batch_idx: paddle.Tensor, + score: paddle.Tensor, + num_atoms, + ): + x_coeff, score_coeff, std = self._get_coeffs( + x=x, t=t, dt=dt, batch_idx=batch_idx, num_atoms=num_atoms + ) + z = paddle.randn(shape=x_coeff.shape, dtype=x_coeff.dtype) + mean = x_coeff * x + score_coeff * score + sample = mean + std * z + return sample, mean + + def _get_coeffs(self, x, t, dt, batch_idx, num_atoms): + """ + Compute coefficients for ancestral sampling. + This is in a separate method to make it easier to test.""" + s = t + dt + alpha_t, sigma_t = self.mean_coeff_and_std( + x=x, t=t, batch_idx=batch_idx, num_atoms=num_atoms + ) + if batch_idx is None: + is_time_zero = s <= 0 + else: + is_time_zero = s[batch_idx] <= 0 + alpha_s, sigma_s = self.mean_coeff_and_std( + x=x, t=s, batch_idx=batch_idx, num_atoms=num_atoms + ) + sigma_s[is_time_zero] = 0 + sigma2_t_given_s = sigma_t**2 - sigma_s**2 * alpha_t**2 / alpha_s**2 + sigma_t_given_s = paddle.sqrt(x=sigma2_t_given_s) + std = sigma_t_given_s * sigma_s / sigma_t + min_alpha_t_given_s = 0.001 + alpha_t_given_s = alpha_t / alpha_s + if paddle.any(x=alpha_t_given_s < min_alpha_t_given_s): + logger.warning( + f"Clipping alpha_t_given_s to {min_alpha_t_given_s} to avoid " + "divide-by-zero. You should probably change something else to avoid " + "this." + ) + alpha_t_given_s = paddle.clip( + x=alpha_t_given_s, min=min_alpha_t_given_s, max=1 + ) + score_coeff = sigma2_t_given_s / alpha_t_given_s + x_coeff = 1.0 / alpha_t_given_s + std[is_time_zero] = 0 + return x_coeff, score_coeff, std + + def mean_coeff_and_std( + self, + x: paddle.Tensor, + t: paddle.Tensor, + batch_idx: Optional[paddle.Tensor] = None, + num_atoms=None, + ) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Returns mean coefficient and standard deviation of marginal distribution at + time t. + """ + return self.marginal_prob(paddle.ones_like(x=x), t, batch_idx, num_atoms) diff --git a/ppmat/trainer/__init__.py b/ppmat/trainer/__init__.py new file mode 100644 index 00000000..41a848b7 --- /dev/null +++ b/ppmat/trainer/__init__.py @@ -0,0 +1,11 @@ +from ppmat.trainer.base_trainer import BaseTrainer + +__all__ = ["BaseTrainer", "build_trainer"] + + +def build_trainer(cfg, **kwargs): + + class_name = cfg.get("__class_name__", "BaseTrainer") + init_params = cfg.get("__init_params__", {}) + trainer = eval(class_name)(**init_params, **kwargs) + return trainer diff --git a/ppmat/trainer/base_trainer.py b/ppmat/trainer/base_trainer.py new file mode 100644 index 00000000..fc4af4d0 --- /dev/null +++ b/ppmat/trainer/base_trainer.py @@ -0,0 +1,1078 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import contextlib +import functools +import os.path as osp +import sys +import time +from collections import OrderedDict +from collections import defaultdict +from typing import Dict +from typing import Literal +from typing import Optional +from typing import Set + +import paddle +import paddle.distributed as dist +from paddle import amp +from paddle import nn +from paddle import optimizer as optim +from paddle.distributed import fleet +from paddle.distributed.fleet.utils import hybrid_parallel_util as hpu +from paddle.optimizer.lr import ReduceOnPlateau + +from ppmat.trainer.trainer_state import TrainerState +from ppmat.trainer.utils import compute_batch_size +from ppmat.trainer.utils import log_paddle_version +from ppmat.utils import AverageMeter +from ppmat.utils import logger +from ppmat.utils import misc +from ppmat.utils import save_load + + +class BaseTrainer: + """Base Trainer for training model. A simple but feature-complete training and + eval loop for model training. + + Args: + config (Dict): Training configuration. + model (nn.Layer): Model to be trained, which should inherit `paddle.nn.Layer` + class. + train_dataloader (Optional[paddle.io.DataLoader], optional): Training + dataloader for training. Defaults to None. + val_dataloader (Optional[paddle.io.DataLoader], optional): Validation + dataloader for evaluation. Defaults to None. + optimizer (Optional[optim.Optimizer], optional): Optimizer for training. + Defaults to None. + lr_scheduler (Optional[optim.lr.LRScheduler], optional): Learning Rate + Scheduler. Defaults to None. + compute_metric_func_dict (Optional[Dict], optional): Compute metric function + dictionary. Defaults to None. + + Notice: + support 2 types metric integration method. recommend metric module first. if + metirc calc is complicated using multipul inputs and outputs of models, could + use stream metric. + """ + + def __init__( + self, + config: Dict, + model: nn.Layer, + train_dataloader: Optional[paddle.io.DataLoader] = None, + val_dataloader: Optional[paddle.io.DataLoader] = None, + optimizer: Optional[optim.Optimizer] = None, + lr_scheduler: Optional[optim.lr.LRScheduler] = None, + compute_metric_func_dict: Optional[Dict] = None, + ): + # 1. initialize arguments + self.model = model + self.optimizer = optimizer + self.train_dataloader = train_dataloader + self.val_dataloader = val_dataloader + self.lr_scheduler = lr_scheduler + self.compute_metric_func_dict = compute_metric_func_dict + + self.config = config + + if optimizer is None: + self.use_amp = False + logger.info("Optimizer is None, AMP is disabled.") + + # 2. get config from config file, and set default values if not provided. + self.max_epochs = config["max_epochs"] + self.output_dir = config["output_dir"] + self.save_freq = config["save_freq"] + self.log_freq = config["log_freq"] + self.start_eval_epoch = config["start_eval_epoch"] + self.eval_freq = config["eval_freq"] + self.seed = config["seed"] + self.pretrained_model_path = config.get("pretrained_model_path", None) + self.pretrained_weight_name = config.get("pretrained_weight_name", None) + self.resume_from_checkpoint = config.get("resume_from_checkpoint", None) + self.compute_metric_during_train = config["compute_metric_during_train"] + self.use_amp = config.get("use_amp", False) + self.amp_level = config.get("amp_level", "O1") + self.metric_strategy_during_eval = config.get( + "metric_strategy_during_eval", "step" + ) + self.eval_with_no_grad = config.get("eval_with_no_grad", True) + self.gradient_accumulation_steps = config.get("gradient_accumulation_steps", 1) + + # Optional global step budget (used by some tasks such as InfGCN). + # This mirrors the historical `max_iter` semantics but is kept + # optional to avoid affecting existing users. + self.max_train_steps = config.get("max_iter", None) + + self.use_visualdl = config.get("use_visualdl", False) + self.use_wandb = config.get("use_wandb", False) + self.wandb_config = config.get("wandb_config", {}) + self.use_tensorboard = config.get("use_tensorboard", False) + + if self.use_amp: + logger.info(f"Using AMP with level {self.amp_level}.") + + # 3. set distributed environment, if world_size > 1, initialize distributed + # environment + self.rank = dist.get_rank() + self.world_size = dist.get_world_size() + # initialize distributed environment + if self.world_size > 1: + fleet.init(is_collective=True) + logger.warning( + f"Detected 'world_size'({self.world_size}) > 1, it is recommended to " + "scale up the learning rate and reduce the 'epochs' or " + "'iters_per_epoch' according to the 'world_size' both linearly if you " + "are training model." + ) + + # 4. load pretrained model, usually used for transfer learning + if self.pretrained_model_path is not None: + save_load.load_pretrain( + self.model, self.pretrained_model_path, self.pretrained_weight_name + ) + + # 5. set automatic mixed precision(AMP) configuration + self.scaler = paddle.amp.GradScaler(True) if self.use_amp else None + if self.use_amp: + self.model, self.optimizer = amp.decorate( + self.model, + self.optimizer, + self.amp_level, + save_dtype="float32", + ) + + # 6. wrap model and optimizer to parallel object + if self.world_size > 1: + if isinstance(self.model, paddle.DataParallel): + raise ValueError( + "Given model is already wrapped by paddle.DataParallel." + "Please do not wrap your model with DataParallel " + "before 'RegressionTrainer.__init__' and keep it's type " + "as 'nn.Layer'." + ) + + self.model = fleet.distributed_model(self.model) + if self.optimizer is not None: + self.optimizer = fleet.distributed_optimizer(self.optimizer) + + # 7. set VisualDL tool + self.visualdl_writer = None + if self.use_visualdl: + try: + import visualdl as vdl + except ModuleNotFoundError: + raise ModuleNotFoundError( + "Please install 'visualdl' with `pip install visualdl` first." + ) + with misc.RankZeroOnly(self.rank) as is_master: + if is_master: + self.visualdl_writer = vdl.LogWriter( + osp.join(self.output_dir, "vdl") + ) + logger.info( + "VisualDL is enabled for logging, you can view it by running:\n" + f"visualdl --logdir {self.visualdl_writer._logdir} --port 8080" + "\n For more information about how to use VisualDL, please refer to:" + "https://www.paddlepaddle.org.cn/paddle/visualdl" + ) + + # 8. set WandB tool + self.wandb_writer = None + if self.use_wandb: + try: + import wandb + except ModuleNotFoundError: + raise ModuleNotFoundError( + "Please install 'wandb' with `pip install wandb` first." + ) + with misc.RankZeroOnly(self.rank) as is_master: + if is_master: + self.wandb_writer = wandb.init(**self.wandb_config) + + # 9. set TensorBoardX tool + self.tensorboard_writer = None + if self.use_tensorboard: + try: + import tensorboardX + except ModuleNotFoundError: + raise ModuleNotFoundError( + "Please install 'tensorboardX' with `pip install tensorboardX` " + "first." + ) + with misc.RankZeroOnly(self.rank) as is_master: + if is_master: + self.tensorboard_writer = tensorboardX.SummaryWriter( + osp.join(self.output_dir, "tensorboard") + ) + logger.message( + "TensorboardX is enabled for logging, you can view it by " + f"running:\ntensorboard --logdir {self.tensorboard_writer.logdir}" + ) + + # 10. log paddle version + log_paddle_version() + + # 11. initialize metric modules (optional null) + self.metric_modules: Dict[str, object] = {} + + # 12. read out_dict (prefer Trainer.out_dict; fallback to Trainer.log.out_dict) + log_cfg = ( + self.config.get("log", {}) + if isinstance(self.config.get("log", {}), dict) + else {} + ) + self.out_dict_cfg = self.config.get( + "out_dict", log_cfg.get("out_dict", None) + ) # None → print all + + def get_num_trainable_parameters(self): + """ + Get the number of trainable parameters. + """ + return sum( + p.numel() for p in self.model.parameters() if p.stop_gradient is False + ) + + def autocast_context_manager( + self, enable: bool, level: Literal["O0", "O1", "O2", "OD"] = "O1" + ) -> contextlib.AbstractContextManager: + """Smart autocast context manager for Auto Mix Precision. + + Args: + enable (bool): Enable autocast. + level (Literal["O0", "O1", "O2", "OD"]): Autocast level. + + Returns: + contextlib.AbstractContextManager: Smart autocast context manager. + """ + if enable: + ctx_manager = amp.auto_cast(level=level) + else: + ctx_manager = ( + contextlib.nullcontext() + if sys.version_info >= (3, 7) + else contextlib.suppress() + ) + return ctx_manager + + def no_sync_context_manager( + self, + enable: bool, + ddp_model: paddle.DataParallel, + ) -> contextlib.AbstractContextManager: + """Smart no_sync context manager for given model. + NOTE: Only `paddle.DataParallel` object has `no_sync` interface. + + Args: + enable (bool): Enable no_sync. + + Returns: + contextlib.AbstractContextManager: Smart no_sync context manager. + """ + if enable: + if not isinstance(self.model, paddle.DataParallel): + raise TypeError( + "no_sync interface is only for model with type " + f"paddle.DataParallel, but got type {misc.typename(ddp_model)}" + ) + ctx_manager = ddp_model.no_sync() + else: + ctx_manager = ( + contextlib.nullcontext() + if sys.version_info >= (3, 7) + else contextlib.suppress() + ) + return ctx_manager + + @functools.lru_cache() + def no_grad_context_manager( + self, enable: bool + ) -> contextlib.AbstractContextManager: + """Smart no_grad context manager. + + Args: + enable (bool): Enable no_grad. + + Returns: + contextlib.AbstractContextManager: Smart no_grad context manager. + """ + if enable: + ctx_manager = paddle.no_grad() + else: + ctx_manager = ( + contextlib.nullcontext() + if sys.version_info >= (3, 7) + else contextlib.suppress() + ) + return ctx_manager + + def eval_epoch(self, dataloader: paddle.io.DataLoader): + """Evaluate model on a dataset. + + Args: + dataloader (paddle.io.DataLoader): Dataloader for evaluation. + """ + # set model to eval mode + self.model.eval() + # initialize eval loss, metric, cost info + loss_info = {} + metric_info = {} + time_info = { + "reader_cost": AverageMeter(name="reader_cost", postfix="s"), + "batch_cost": AverageMeter(name="batch_cost", postfix="s"), + } + + # update training state + self.state.max_steps_in_eval_epoch = len(dataloader) + self.state.step_in_eval_epoch = 0 + + num_eval_samples = len(dataloader.dataset) + + # initialize all_pred_dict and all_label_dict + all_pred_dict = defaultdict(list) + all_label_dict = defaultdict(list) + + # Start timing for reading data and the entire batch + reader_tic = time.perf_counter() + batch_tic = time.perf_counter() + + # start to evaluate + for _, batch_data in enumerate(dataloader): + reader_cost = time.perf_counter() - reader_tic + time_info["reader_cost"].update(reader_cost) + + # auto compute batch size + batch_size = self.guess_batch_size(batch_data, dataloader) + # update training state + self.state.step_in_eval_epoch += 1 + + # forward model + with self.autocast_context_manager( + self.use_amp, self.amp_level + ), self.no_grad_context_manager(self.eval_with_no_grad): + result = self.model(batch_data) + loss_dict = result.get("loss_dict", {}) + + # update loss and metric for log + for key in loss_dict: + if key not in loss_info: + loss_info[key] = AverageMeter(key) + loss_info[key].update(float(loss_dict[key]), batch_size) + + # get prediction + pred_dict = result.get("pred_dict", {}) + + # stream metric lightweight hook + self._update_streaming_metrics( + result=result, batch=batch_data, stage="eval" + ) + + # compute metric during evaluation or gathering all predictions and labels + if self.compute_metric_func_dict is not None: + # Step strategy: compute metric each step + if self.metric_strategy_during_eval == "step": + # compute metric for each step + for ( + key, + compute_metric_func, + ) in self.compute_metric_func_dict.items(): + pred = pred_dict[key] + label = batch_data[key] + metric = compute_metric_func(pred, label) + if key not in metric_info: + metric_info[key] = AverageMeter(key) + metric_info[key].update(float(metric), batch_size) + # Epoch strategy: gather and compute once + else: + # gather all predictions and labels + for key, pred in pred_dict.items(): + pred = pred.detach() if hasattr(pred, "detach") else pred + if self.world_size > 1: + pred = misc.all_gather(pred) + all_pred_dict[key].append(pred) + label_keys = self.compute_metric_func_dict.keys() + for key in label_keys: + label = batch_data[key] + label = label.detach() if hasattr(label, "detach") else label + if self.world_size > 1: + label = misc.all_gather(label) + all_label_dict[key].append(label) + + batch_cost = time.perf_counter() - batch_tic + time_info["batch_cost"].update(batch_cost) + + # log the current step + if ( + self.state.step_in_eval_epoch % self.config["log_freq"] == 0 + or self.state.step_in_eval_epoch == self.state.max_steps_in_eval_epoch + or self.state.step_in_eval_epoch == 1 + ): + + logs: OrderedDict[str, float] = {} + for name, average_meter in time_info.items(): + logs[name] = average_meter.val + for name, average_meter in loss_info.items(): + logs[name + "(loss)"] = average_meter.val + for name, average_meter in metric_info.items(): + logs[name + "(metric)"] = average_meter.val + + display_logs = self._filter_out_dict(logs, stage="eval") + + msg = f"Eval: Epoch [{self.state.epoch}/{self.config['max_epochs']}]" + msg += ( + f" | Step: [{self.state.step_in_eval_epoch}/" + + f"{self.state.max_steps_in_eval_epoch}]" + ) + if logs is not None: + for key, val in display_logs.items(): + msg += f" | {key}: {val:.6f}" + logger.info(msg) + batch_tic = time.perf_counter() + reader_tic = time.perf_counter() + + # compute metric for whole epoch + if ( + self.metric_strategy_during_eval == "epoch" + and self.compute_metric_func_dict is not None + ): + # concatenate gathered tensors and compute + for key, compute_metric_func in self.compute_metric_func_dict.items(): + + + pred = paddle.concat(all_pred_dict[key])[:num_eval_samples] + label = paddle.concat(all_label_dict[key])[:num_eval_samples] + metric = compute_metric_func(pred, label) + if key not in metric_info: + metric_info[key] = AverageMeter(key) + metric_info[key].update(float(metric), num_eval_samples) + + # stream metric lightweight hook + _extra_stream = self._compute_streaming_metrics(stage="eval") + for k, v in _extra_stream.items(): + if k not in metric_info: + metric_info[k] = AverageMeter(k) + metric_info[k].update(float(v), 1) + + return time_info, loss_info, metric_info + + def guess_batch_size(self, input_data, dataloader): + try: + batch_size = compute_batch_size(input_data, dataloader) + return batch_size + except Exception as e: + logger.debug( + f"Failed to calculate batch size due to error: {e}. Falling back " + "to default batch size by dataloader." + ) + try: + batch_size = dataloader.batch_sampler.batch_size + return batch_size + except Exception as e: + logger.debug( + f"Failed to calculate batch size due to error: {e}. Falling back " + "to default batch size of 1." + ) + batch_size = 1 + + return batch_size + + def train_epoch(self, dataloader: paddle.io.DataLoader): + """Train program for one epoch. + Args: + dataloader (paddle.io.DataLoader): The dataloader used for training. + """ + # set model to train mode + self.model.train() + # initialize train loss, metric, cost info + loss_info = {} + metric_info = {} + time_info = { + "reader_cost": AverageMeter(name="reader_cost", postfix="s"), + "batch_cost": AverageMeter(name="batch_cost", postfix="s"), + } + + # update training state + self.state.max_steps_in_train_epoch = ( + len(dataloader) // self.gradient_accumulation_steps + ) + if len(dataloader) % self.gradient_accumulation_steps != 0: + self.state.max_steps_in_train_epoch += 1 + # If a global step budget is given, clamp the epoch-local + # max_steps so that we never exceed the remaining budget. + if self.max_train_steps is not None: + remaining = self.max_train_steps - self.state.global_step + if remaining <= 0: + logger.info( + "Max train steps (%d) already reached; skip further training.", + self.max_train_steps, + ) + self.state.max_steps_in_train_epoch = 0 + self.state.step_in_train_epoch = 0 + return time_info, loss_info, metric_info + if remaining < self.state.max_steps_in_train_epoch: + self.state.max_steps_in_train_epoch = remaining + self.state.step_in_train_epoch = 0 + + # Start timing for reading data and the entire batch + reader_tic = time.perf_counter() + batch_tic = time.perf_counter() + # start training loop + for iter_id, batch_data in enumerate(dataloader): + # Optional global-step based early stop. + if ( + self.max_train_steps is not None + and self.state.global_step >= self.max_train_steps + ): + break + reader_cost = time.perf_counter() - reader_tic + time_info["reader_cost"].update(reader_cost) + # auto compute batch size + batch_size = self.guess_batch_size(batch_data, dataloader) + + # run forward, maybe use amp + with self.no_sync_context_manager(self.world_size > 1, self.model): + with self.autocast_context_manager(self.use_amp, self.amp_level): + result = self.model(batch_data) + loss_dict = result["loss_dict"] + loss = loss_dict["loss"] + + # run backward, maybe use amp + if self.use_amp: + loss_scaled = self.scaler.scale(loss) + loss_scaled.backward() + else: + loss.backward() + + # when the number of iterations is multiple of gradient_accumulation_steps, + # we need to update parameters + if (iter_id + 1) % self.gradient_accumulation_steps != 0 and ( + iter_id + 1 + ) != len(dataloader): + continue + + # update training state + self.state.step_in_train_epoch += 1 + self.state.global_step += 1 + + if self.world_size > 1: + # fuse + allreduce manually before optimization if use DDP + no_sync + hpu.fused_allreduce_gradients(list(self.model.parameters()), None) + + # update parameters + if self.use_amp: + self.scaler.minimize(self.optimizer, loss_scaled) + else: + + self.optimizer.step() + self.optimizer.clear_grad() + + # stream metric lightweight hook + self._update_streaming_metrics( + result=result, batch=batch_data, stage="train" + ) + + # update loss and metric for log + for key in loss_dict: + if key not in loss_info: + loss_info[key] = AverageMeter(key) + loss_info[key].update(float(loss_dict[key]), batch_size) + + if self.compute_metric_during_train and self.compute_metric_func_dict is not None: + pred_dict = result.get("pred_dict", {}) + for key, compute_metric_func in self.compute_metric_func_dict.items(): + if key not in pred_dict: + continue + pred = pred_dict[key] + label = batch_data[key] + metric = compute_metric_func(pred, label) + if key not in metric_info: + metric_info[key] = AverageMeter(key) + metric_info[key].update(float(metric), batch_size) + + batch_cost = time.perf_counter() - batch_tic + time_info["batch_cost"].update(batch_cost) + + # log training info + if ( + self.state.step_in_train_epoch % self.config["log_freq"] == 0 + or self.state.step_in_train_epoch == self.state.max_steps_in_train_epoch + or self.state.step_in_train_epoch == 1 + ): + + logs: OrderedDict[str, float] = {} + if self.optimizer is not None: + logs["lr"] = self.optimizer.get_lr() + for name, average_meter in time_info.items(): + logs[name] = average_meter.val + for name, average_meter in loss_info.items(): + logs[name + "(loss)"] = average_meter.val + for name, average_meter in metric_info.items(): + logs[name + "(metric)"] = average_meter.val + + display_logs = self._filter_out_dict(logs, stage="train") + + msg = f"Train: Epoch [{self.state.epoch}/{self.config['max_epochs']}]" + msg += ( + f" | Step: [{self.state.step_in_train_epoch}/" + + f"{self.state.max_steps_in_train_epoch}]" + ) + if logs is not None: + for key, val in display_logs.items(): + msg += f" | {key}: {val:.6f}" + logger.info(msg) + # log training info to visualdl, wandb, tensorboard + logger.scalar( + tag="train(step)", + metric_dict=logs, + step=self.state.global_step, + visualdl_writer=self.visualdl_writer, + wandb_writer=self.wandb_writer, + tensorboard_writer=self.tensorboard_writer, + ) + + # update learning rate by epoch + if self.lr_scheduler is not None and not self.lr_scheduler.by_epoch: + self.lr_scheduler.step() + + batch_tic = time.perf_counter() + reader_tic = time.perf_counter() + return time_info, loss_info, metric_info + + def train( + self, + train_dataloader: Optional[paddle.io.DataLoader] = None, + val_dataloader: Optional[paddle.io.DataLoader] = None, + resume_from_checkpoint: Optional[str] = None, + ) -> None: + """Start a new training process.""" + + if train_dataloader is None: + assert ( + self.train_dataloader is not None + ), "train_dataloader is None, please set it or pass to the constructor." + train_dataloader = self.train_dataloader + else: + self.train_dataloader = train_dataloader + if val_dataloader is None: + val_dataloader = self.val_dataloader + else: + self.val_dataloader = val_dataloader + if val_dataloader is None: + logger.warning( + "No validation dataset provided, evaluation during training will be " + "skipped." + ) + + if hasattr(self.model, "before_train"): + self.model.before_train(self) + + self.state = TrainerState() + # load model checkpoint, usually used for resume training + resume_from_checkpoint = ( + resume_from_checkpoint + if resume_from_checkpoint is not None + else self.resume_from_checkpoint + ) + if resume_from_checkpoint is not None: + if self.pretrained_model_path is not None: + logger.warning( + "Detected 'pretrained_model_path' is given, weights in which might" + " be overridden by weights loaded from given 'checkpoint_path'." + ) + loaded_state = save_load.load_checkpoint( + self.resume_from_checkpoint, + self.model, + self.optimizer, + self.scaler, + ) + self.state = TrainerState.from_dict(loaded_state) + + logger.info("Training start...") + trainable_params = self.get_num_trainable_parameters() + logger.info(f"Number of trainable parameters: {trainable_params/1e6:.2f}M") + + # train loop + for _ in range(self.state.epoch, self.max_epochs): + # Optional global-step based early stop (max_iter semantics). + if ( + self.max_train_steps is not None + and self.state.global_step >= self.max_train_steps + ): + logger.info( + "Reached max_iter (max_train_steps=%d); stopping training.", + self.max_train_steps, + ) + break + + self.state.epoch += 1 + # train one epoch + train_time_info, train_loss_info, train_metric_info = self.train_epoch( + train_dataloader + ) + + # stream metric lightweight hook + _extra_stream = self._compute_streaming_metrics(stage="train") + for k, v in _extra_stream.items(): + if k not in train_metric_info: + train_metric_info[k] = AverageMeter(k) + train_metric_info[k].update(float(v), 1) + + # log training info + logs: OrderedDict[str, float] = {} + for name, average_meter in train_time_info.items(): + logs[name] = average_meter.avg + for name, average_meter in train_loss_info.items(): + logs[name + "(loss)"] = average_meter.avg + for name, average_meter in train_metric_info.items(): + logs[name + "(metric)"] = average_meter.avg + + display_logs = self._filter_out_dict(logs, stage="train") + + msg = f"Train: Epoch [{self.state.epoch}/{self.config['max_epochs']}]" + if logs is not None: + for key, val in display_logs.items(): + msg += f" | {key}: {val:.6f}" + logger.info(msg) + # Temporary disable wandb_writer, since it is not support step less the + # current step(self.state.global_step) + logger.scalar( + tag="train(epoch)", + metric_dict=logs, + step=self.state.epoch, + visualdl_writer=self.visualdl_writer, + # wandb_writer=self.wandb_writer, + tensorboard_writer=self.tensorboard_writer, + ) + + # save checkpoint when epoch is divisible by save_freq + if ( + self.state.epoch % self.config["save_freq"] == 0 + or self.state.epoch == self.config["max_epochs"] + or self.state.epoch == 1 + ): + save_load.save_checkpoint( + self.model, + self.optimizer, + self.state.to_dict(), + self.scaler, + output_dir=self.output_dir, + prefix=f"epoch_{self.state.epoch}", + ) + + # Always save latest when training begins + save_load.save_checkpoint( + self.model, + self.optimizer, + self.state.to_dict(), + self.scaler, + output_dir=self.output_dir, + prefix="latest", + print_log=(self.state.epoch == 1), + ) + + # evaluate model when epoch is divisible by eval_freq + if ( + self.state.epoch % self.config["eval_freq"] == 0 + or self.state.epoch == self.config["max_epochs"] + or self.state.epoch == 1 + ) and val_dataloader is not None: + + eval_time_info, eval_loss_info, eval_metric_info = self.eval_epoch( + val_dataloader + ) + + # stream metric lightweight hook + _extra_stream = self._compute_streaming_metrics(stage="eval") + for k, v in _extra_stream.items(): + if k not in eval_metric_info: + eval_metric_info[k] = AverageMeter(k) + eval_metric_info[k].update(float(v), 1) + + # log evaluation info + logs: OrderedDict[str, float] = {} + for name, average_meter in eval_time_info.items(): + logs[name] = average_meter.avg + for name, average_meter in eval_loss_info.items(): + logs[name + "(loss)"] = average_meter.avg + for name, average_meter in eval_metric_info.items(): + logs[name + "(metric)"] = average_meter.avg + + display_logs = self._filter_out_dict(logs, stage="eval") + + msg = f"Eval: Epoch [{self.state.epoch}/{self.config['max_epochs']}]" + if logs is not None: + for key, val in display_logs.items(): + msg += f" | {key}: {val:.6f}" + logger.info(msg) + # Temporary disable wandb_writer, since it is not support step less the + # current step(self.state.global_step) + logger.scalar( + tag="eval(epoch)", + metric_dict=logs, + step=self.state.epoch, + visualdl_writer=self.visualdl_writer, + # wandb_writer=self.wandb_writer, + tensorboard_writer=self.tensorboard_writer, + ) + else: + eval_loss_info, eval_metric_info = None, None + # save best model when best_metric is better than previous best_metric + save_best_flag = self._determine_best_metric( + train_loss_info, train_metric_info, eval_loss_info, eval_metric_info + ) + if save_best_flag: + save_load.save_checkpoint( + self.model, + self.optimizer, + self.state.to_dict(), + self.scaler, + output_dir=self.output_dir, + prefix="best", + ) + # update learning rate by epoch + if self.lr_scheduler is not None and self.lr_scheduler.by_epoch: + if isinstance(self.lr_scheduler, ReduceOnPlateau): + if self.lr_scheduler.indicator == "train_loss": + indicator_value = train_loss_info[ + self.lr_scheduler.indicator_name + ].avg + elif self.lr_scheduler.indicator == "train_metric": + indicator_value = train_metric_info[ + self.lr_scheduler.indicator_name + ].avg + elif self.lr_scheduler.indicator == "eval_loss": + if eval_loss_info is None: + indicator_value = None + else: + indicator_value = eval_loss_info[ + self.lr_scheduler.indicator_name + ].avg + elif self.lr_scheduler.indicator == "eval_metric": + if eval_metric_info is None: + indicator_value = None + else: + indicator_value = eval_metric_info[ + self.lr_scheduler.indicator_name + ].avg + else: + raise ValueError( + "Unsupported lr scheduler indicator: " + f"{self.lr_scheduler.indicator}" + ) + if indicator_value is not None: + self.lr_scheduler.step(metrics=indicator_value) + else: + self.lr_scheduler.step() + + def _determine_best_metric( + self, train_loss_info, train_metric_info, eval_loss_info, eval_metric_info + ): + best_metric_indicator = self.config.get("best_metric_indicator", None) + if best_metric_indicator is None: + return False + name_for_best_metric = self.config.get("name_for_best_metric", None) + if best_metric_indicator is not None: + assert ( + name_for_best_metric is not None + ), "name_for_best_metric must be specified when best_metric_indicator is " + "specified." + + greater_is_better = self.config["greater_is_better"] + if best_metric_indicator == "train_loss": + self.state.cur_metric = train_loss_info[name_for_best_metric].avg + elif best_metric_indicator == "train_metric": + self.state.cur_metric = train_metric_info[name_for_best_metric].avg + elif best_metric_indicator == "eval_loss": + if eval_loss_info is not None: + self.state.cur_metric = eval_loss_info[name_for_best_metric].avg + else: + logger.warning("No eval_loss info found, skip saving best model.") + return False + elif best_metric_indicator == "eval_metric": + if eval_metric_info is not None: + self.state.cur_metric = eval_metric_info[name_for_best_metric].avg + else: + logger.warning("No eval_metric info found, skip saving best model.") + return False + else: + raise ValueError( + f"Unsupported best_metric_indicator: {best_metric_indicator}" + ) + + if self.state.best_metric is None: + self.state.best_metric = self.state.cur_metric + self.state.best_epoch = self.state.epoch + return True + elif greater_is_better: + if self.state.cur_metric > self.state.best_metric: + self.state.best_metric = self.state.cur_metric + self.state.best_epoch = self.state.epoch + return True + else: + if self.state.cur_metric < self.state.best_metric: + self.state.best_metric = self.state.cur_metric + self.state.best_epoch = self.state.epoch + return True + return False + + def eval(self, dataloader: paddle.io.DataLoader): + assert dataloader is not None, "dataloader is None, please set it first" + self.state = TrainerState() + logger.info("Start evaluating...") + logger.info( + f"Number of samples in evaluation dataset: {len(dataloader.dataset)}" + ) + time_info, loss_info, metric_info = self.eval_epoch(dataloader) + logs: OrderedDict[str, float] = {} + for name, average_meter in time_info.items(): + logs[name] = average_meter.avg + for name, average_meter in loss_info.items(): + logs[name + "(loss)"] = average_meter.avg + for name, average_meter in metric_info.items(): + logs[name + "(metric)"] = average_meter.avg + + display_logs = self._filter_out_dict(logs, stage="eval") + msg = "Eval:" + if logs is not None: + for key, val in display_logs.items(): + msg += f" | {key}: {val:.6f}" + logger.info(msg) + + return time_info, loss_info, metric_info + + def attach_metrics(self, metric_cfg=None, **runtime_objs): + """ + metric_cfg: a dict produced by build_metric(cfg.Metric), or a manually + provided collection of metric objects. + runtime_objs: dataset_infos / train_smiles / clip / ... forwarded uniformly + to each metric via metric.bind(...). + """ + from ppmat.metrics import build_metric as _build # 惰性导入 + + if not metric_cfg: + return + mods = _build(metric_cfg) + if isinstance(mods, dict): + self.metric_modules = mods + elif mods is not None: + self.metric_modules = {"default": mods} + else: + self.metric_modules = {} + for m in self.metric_modules.values(): + if hasattr(m, "bind"): + m.bind(**runtime_objs) + + def _update_streaming_metrics(self, *, result, batch, stage: str): + # Generic step hook: update if the metric exposes it; skip otherwise. + for _, m in self.metric_modules.items(): + if hasattr(m, "update_step"): + m.update_step(result=result, batch=batch, stage=stage) + + def _compute_streaming_metrics(self, *, stage: str) -> Dict[str, float]: + # Generic epoch hook: aggregate all registered streaming metrics. + all_out = {} + for name, m in self.metric_modules.items(): + if hasattr(m, "compute_epoch"): + try: + out = m.compute_epoch(stage=stage) or {} + # Optional prefixing: + # all_out.update({f"{name}/{k}": v for k, v in out.items()}) + all_out.update(out) + except Exception as e: + logger.debug(f"[metric:{name}] compute_epoch skipped: {e}") + if hasattr(m, "reset"): + try: + m.reset() + except Exception: + pass + return all_out + + def _to_name_set(self, obj) -> Optional[Set[str]]: + """ + Normalize YAML values into a Python set. + - list/tuple/set -> set + - dict -> dict.keys() + - str -> {str} + - None -> None (means "no filter") + """ + if obj is None: + return None + if isinstance(obj, (set, list, tuple)): + return set(obj) + if isinstance(obj, dict): + return set(obj.keys()) + return {str(obj)} + + def _name_matches(self, base: str, stage: str, allowed: Optional[Set[str]]) -> bool: + """ + Check whether a base metric name is allowed for a given stage. + Supports common aliases, e.g.: + - train: "loss" ~ "train_loss" ~ "train/loss" + - eval: "nll" ~ "val_nll" ~ "eval/nll" + """ + if allowed is None: + return True + if base in allowed: + return True + if f"{stage}_{base}" in allowed: + return True + if stage == "eval" and f"val_{base}" in allowed: + return True + if f"{stage}/{base}" in allowed: + return True + return False + + def _filter_out_dict(self, logs: Dict[str, float], stage: str) -> Dict[str, float]: + """ + Keep only items permitted by out_dict for this stage. + We pass through keys ending with "(loss)" or "(metric)" only; + others (e.g., lr/reader_cost/batch_cost) are suppressed from console output. + """ + cfg = self.out_dict_cfg + if cfg is None: + return logs # not configured → print everything + if not cfg: + return {} # empty dict → print nothing + + loss_cfg = cfg.get("loss", {}) + metric_cfg = cfg.get("metric", {}) + sel_loss = ( + self._to_name_set(loss_cfg.get(stage)) + if isinstance(loss_cfg, dict) + else self._to_name_set(loss_cfg) + ) + sel_metric = ( + self._to_name_set(metric_cfg.get(stage)) + if isinstance(metric_cfg, dict) + else self._to_name_set(metric_cfg) + ) + + from collections import OrderedDict + + filtered = OrderedDict() + for k, v in logs.items(): + if k.endswith("(loss)"): + base = k[: -len("(loss)")] + if self._name_matches(base, stage, sel_loss): + filtered[k] = v + elif k.endswith("(metric)"): + base = k[: -len("(metric)")] + if self._name_matches(base, stage, sel_metric): + filtered[k] = v + # else: skip non-loss/metric entries from console output + return filtered diff --git a/ppmat/trainer/trainer_state.py b/ppmat/trainer/trainer_state.py new file mode 100644 index 00000000..13ebbf37 --- /dev/null +++ b/ppmat/trainer/trainer_state.py @@ -0,0 +1,90 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is heavily adapted from: +# https://github.com/huggingface/transformers/tree/main/src/transformers/callbacks.py + + +import dataclasses +import json +from dataclasses import dataclass +from typing import Optional + + +@dataclass +class TrainerState: + """A class containing the [`Trainer`] inner state that will be saved. + + + + In all this class, one step is to be understood as one update step. When using + gradient accumulation, one update step may require several forward and backward + passes: if you use `gradient_accumulation_steps=n`, then one update step requires + going through *n* batches. + + + + Args: + epoch (int, optional): Only set during training, will represent the epoch the + training is at. Defaults to 0. + global_step (int, optional): During training, represents the number of update + steps completed. Defaults to 0. + step_in_train_epoch (int, optional): During training, represents the number of + update steps completed within the current epoch. Defaults to 0. + step_in_eval_epoch (int, optional): During evaluation, represents the number of + update steps completed within the current epoch. Defaults to 0. + max_steps_in_train_epoch (int, optional): The number of update steps to do + during the current training epoch. Defaults to 0. + max_steps_in_eval_epoch (int, optional): The number of update steps to do + during the current evaluation epoch. Defaults to 0. + cur_metric (Optional[float]): The current metric value. Defaults to None. + best_metric (Optional[float]): The best metric value. Defaults to None. + best_epoch (Optional[int]): The epoch where the best metric was reached. + Defaults to None. + """ + + # training state, updated during training + epoch: int = 0 + global_step: int = 0 + step_in_train_epoch: int = 0 + step_in_eval_epoch: int = 0 + + max_steps_in_train_epoch: int = 0 + max_steps_in_eval_epoch: int = 0 + + cur_metric: Optional[float] = None + best_metric: Optional[float] = None + best_epoch: Optional[int] = None + + def to_dict(self): + return dataclasses.asdict(self) + + @staticmethod + def from_dict(dict_data): + return TrainerState(**dict_data) + + def save_to_json(self, json_path: str): + """Save the content of this instance in JSON format inside `json_path`.""" + json_string = ( + json.dumps(dataclasses.asdict(self), indent=2, sort_keys=True) + "\n" + ) + with open(json_path, "w", encoding="utf-8") as f: + f.write(json_string) + + @classmethod + def load_from_json(json_path: str): + """Create an instance from the content of `json_path`.""" + with open(json_path, encoding="utf-8") as f: + text = f.read() + return TrainerState(**json.loads(text)) diff --git a/ppmat/trainer/utils.py b/ppmat/trainer/utils.py new file mode 100644 index 00000000..bbc04a30 --- /dev/null +++ b/ppmat/trainer/utils.py @@ -0,0 +1,84 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Dict +from typing import Sequence +from typing import Union + +import paddle +import paddle.distributed as dist +from packaging import version + +from ppmat.utils import logger + + +def log_paddle_version(): + # log paddlepaddle's version + if version.Version(paddle.__version__) != version.Version("0.0.0"): + paddle_version = paddle.__version__ + if version.Version(paddle.__version__) < version.Version("3.0.0"): + logger.warning( + f"Detected paddlepaddle version is '{paddle_version}', " + "currently it is recommended to use release 3.0.0 or develop " + "version." + ) + else: + paddle_version = f"develop({paddle.version.commit[:7]})" + + logger.info(f"Using paddlepaddle {paddle_version}") + + +def compute_batch_size( + input_dict: Dict[str, Union[paddle.Tensor, Sequence[paddle.Tensor]]] +) -> int: + """Compute batch size from given input dict. + + NOTE: Returned `batch_size` might be inaccurate, but it won't affect the correctness + of the training results because `batch_size` is now only used for timing. + + Args: + input_dict (Dict[str, Union[paddle.Tensor, Sequence[paddle.Tensor]]]): Given + input dict. + + Returns: + int: Batch size of input dict. + """ + for _, value in input_dict.items(): + if hasattr(value, "shape"): + return value.shape[0] + elif hasattr(value, "__len__"): # Might be inaccurate here. + return len(value) + raise ValueError("Unsupported type of input dict value.") + + +def scale_shared_grads(module): + """Divide the gradients of the layers that are shared across multiple blocks by the + number the weights are shared for + """ + with paddle.no_grad(): + + def scale_grad(param, scale_factor): + if param.grad is None: + return + g_data = param.grad + new_grads = g_data / scale_factor + param.grad = new_grads # .copy_(new_grads) + + if isinstance(module, dist.parallel.DataParallel): + module = module._layers + if hasattr(module, "model") and hasattr(module.model, "shared_parameters"): + for layer, num_blocks in module.model.shared_parameters: + scale_grad(layer, num_blocks) diff --git a/ppmat/utils/__init__.py b/ppmat/utils/__init__.py new file mode 100644 index 00000000..8b5fb924 --- /dev/null +++ b/ppmat/utils/__init__.py @@ -0,0 +1,36 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from ppmat.utils import ema +from ppmat.utils import logger +from ppmat.utils import misc +from ppmat.utils.misc import AverageMeter +from ppmat.utils.misc import format_time_manual +from ppmat.utils.misc import set_random_seed +from ppmat.utils.save_load import load_checkpoint +from ppmat.utils.save_load import load_pretrain +from ppmat.utils.save_load import save_checkpoint + +__all__ = [ + logger, + misc, + ema, + AverageMeter, + format_time_manual, + set_random_seed, + load_checkpoint, + load_pretrain, + save_checkpoint, +] diff --git a/ppmat/utils/crystal.py b/ppmat/utils/crystal.py new file mode 100644 index 00000000..b4a8f787 --- /dev/null +++ b/ppmat/utils/crystal.py @@ -0,0 +1,428 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import copy + +import numpy as np +import paddle + +from ppmat.utils import paddle_aux # noqa: F401 +from ppmat.utils.paddle_aux import dim2perm + +OFFSET_LIST = [ + [-1, -1, -1], + [-1, -1, 0], + [-1, -1, 1], + [-1, 0, -1], + [-1, 0, 0], + [-1, 0, 1], + [-1, 1, -1], + [-1, 1, 0], + [-1, 1, 1], + [0, -1, -1], + [0, -1, 0], + [0, -1, 1], + [0, 0, -1], + [0, 0, 0], + [0, 0, 1], + [0, 1, -1], + [0, 1, 0], + [0, 1, 1], + [1, -1, -1], + [1, -1, 0], + [1, -1, 1], + [1, 0, -1], + [1, 0, 0], + [1, 0, 1], + [1, 1, -1], + [1, 1, 0], + [1, 1, 1], +] + + +def lattice_params_to_matrix_paddle(lengths, angles): + """Batched paddle version to compute lattice matrix from params. + + lengths: paddle.Tensor of shape (N, 3), unit A + angles: paddle.Tensor of shape (N, 3), unit degree + """ + angles_r = paddle.deg2rad(x=angles) + coses = paddle.cos(x=angles_r) + sins = paddle.sin(x=angles_r) + val = (coses[:, 0] * coses[:, 1] - coses[:, 2]) / (sins[:, 0] * sins[:, 1]) + val = paddle.clip(x=val, min=-1.0, max=1.0) + gamma_star = paddle.acos(x=val) + vector_a = paddle.stack( + x=[ + lengths[:, 0] * sins[:, 1], + paddle.zeros(shape=lengths.shape[0]), + lengths[:, 0] * coses[:, 1], + ], + axis=1, + ) + vector_b = paddle.stack( + x=[ + -lengths[:, 1] * sins[:, 0] * paddle.cos(x=gamma_star), + lengths[:, 1] * sins[:, 0] * paddle.sin(x=gamma_star), + lengths[:, 1] * coses[:, 0], + ], + axis=1, + ) + vector_c = paddle.stack( + x=[ + paddle.zeros(shape=lengths.shape[0]), + paddle.zeros(shape=lengths.shape[0]), + lengths[:, 2], + ], + axis=1, + ) + return paddle.stack(x=[vector_a, vector_b, vector_c], axis=1) + + +def lattices_to_params_shape_paddle(lattices): + lengths = paddle.sqrt(x=paddle.sum(x=lattices**2, axis=-1)) + angles = paddle.zeros_like(x=lengths) + for i in range(3): + j = (i + 1) % 3 + k = (i + 2) % 3 + angles[..., i] = paddle.clip( + x=paddle.sum(x=lattices[..., j, :] * lattices[..., k, :], axis=-1) + / (lengths[..., j] * lengths[..., k]), + min=-1.0, + max=1.0, + ) + angles = paddle.acos(x=angles) * 180.0 / np.pi + return lengths, angles + + +def lattices_to_params_shape_numpy(lattices): + lengths = np.sum(lattices**2, axis=-1) ** 0.5 + angles = np.zeros_like(lengths) + for i in range(3): + j = (i + 1) % 3 + k = (i + 2) % 3 + angles[..., i] = np.clip( + np.sum(lattices[..., j, :] * lattices[..., k, :], axis=-1) + / (lengths[..., j] * lengths[..., k]), + a_min=-1.0, + a_max=1.0, + ) + angles = np.arccos(angles) * 180.0 / np.pi + return lengths, angles + + +def lattices_to_params_shape(lattices): + if isinstance(lattices, np.ndarray): + return lattices_to_params_shape_numpy(lattices) + elif isinstance(lattices, paddle.Tensor): + return lattices_to_params_shape_paddle(lattices) + else: + raise TypeError(f"Unsupported type {type(lattices)}.") + + +def lattice_params_to_matrix(a, b, c, alpha, beta, gamma): + """Converts lattice from abc, angles to matrix. + https://github.com/materialsproject/pymatgen/blob/b789d74639aa851d7e5ee427a765d9fd5a8d1079/pymatgen/core/lattice.py#L311 + """ + angles_r = np.radians([alpha, beta, gamma]) + cos_alpha, cos_beta, cos_gamma = np.cos(angles_r) + sin_alpha, sin_beta, sin_gamma = np.sin(angles_r) + + val = (cos_alpha * cos_beta - cos_gamma) / (sin_alpha * sin_beta) + val = abs_cap(val) + gamma_star = np.arccos(val) + + vector_a = [a * sin_beta, 0.0, a * cos_beta] + vector_b = [ + -b * sin_alpha * np.cos(gamma_star), + b * sin_alpha * np.sin(gamma_star), + b * cos_alpha, + ] + vector_c = [0.0, 0.0, float(c)] + return np.array([vector_a, vector_b, vector_c]) + + +def abs_cap(val, max_abs_val=1): + """ + Returns the value with its absolute value capped at max_abs_val. + Particularly useful in passing values to trignometric functions where + numerical errors may result in an argument > 1 being passed in. + https://github.com/materialsproject/pymatgen/blob/b789d74639aa851d7e5ee427a765d9fd5a8d1079/pymatgen/util/num.py#L15 + Args: + val (float): Input value. + max_abs_val (float): The maximum absolute value for val. Defaults to 1. + Returns: + val if abs(val) < 1 else sign of val * max_abs_val. + """ + return max(min(val, max_abs_val), -max_abs_val) + + +def get_pbc_distances( + coords, + edge_index, + lattice, + to_jimages, + num_atoms, + num_bonds, + coord_is_cart=False, + return_offsets=False, + return_distance_vec=False, +): + # lattice = lattice_params_to_matrix_paddle(lengths, angles) + if coord_is_cart: + pos = coords + else: + lattice_nodes = paddle.repeat_interleave(x=lattice, repeats=num_atoms, axis=0) + pos = paddle.einsum("bi,bij->bj", coords, lattice_nodes) + j_index, i_index = edge_index + distance_vectors = pos[j_index] - pos[i_index] + lattice_edges = paddle.repeat_interleave(x=lattice, repeats=num_bonds, axis=0) + offsets = paddle.einsum( + "bi,bij->bj", to_jimages.astype(dtype="float32"), lattice_edges + ) + distance_vectors += offsets + distances = distance_vectors.norm(axis=-1) + out = {"edge_index": edge_index, "distances": distances} + if return_distance_vec: + out["distance_vec"] = distance_vectors + if return_offsets: + out["offsets"] = offsets + return out + + +def radius_graph_pbc( + cart_coords, + lattice, + num_atoms, + radius, + max_num_neighbors_threshold, + device, + topk_per_pair=None, +): + """Computes pbc graph edges under pbc.""" + batch_size = len(num_atoms) + atom_pos = cart_coords + num_atoms_per_image = num_atoms + num_atoms_per_image_sqr = (num_atoms_per_image**2).astype(dtype="int64") + index_offset = paddle.cumsum(x=num_atoms_per_image, axis=0) - num_atoms_per_image + index_offset_expand = paddle.repeat_interleave( + x=index_offset, repeats=num_atoms_per_image_sqr + ) + num_atoms_per_image_expand = paddle.repeat_interleave( + x=num_atoms_per_image, repeats=num_atoms_per_image_sqr + ) + num_atom_pairs = paddle.sum(x=num_atoms_per_image_sqr) + index_sqr_offset = ( + paddle.cumsum(x=num_atoms_per_image_sqr, axis=0) - num_atoms_per_image_sqr + ) + index_sqr_offset = paddle.repeat_interleave( + x=index_sqr_offset, repeats=num_atoms_per_image_sqr + ) + atom_count_sqr = paddle.arange(end=num_atom_pairs) - index_sqr_offset + index1 = (atom_count_sqr // num_atoms_per_image_expand).astype( + dtype="int64" + ) + index_offset_expand + index2 = (atom_count_sqr % num_atoms_per_image_expand).astype( + dtype="int64" + ) + index_offset_expand + pos1 = paddle.index_select(x=atom_pos, axis=0, index=index1) + pos2 = paddle.index_select(x=atom_pos, axis=0, index=index2) + unit_cell = paddle.to_tensor(data=OFFSET_LIST, place=device).astype(dtype="float32") + num_cells = len(unit_cell) + unit_cell_per_atom = unit_cell.view(1, num_cells, 3).repeat(len(index2), 1, 1) + x = unit_cell + perm_1 = list(range(x.ndim)) + perm_1[0] = 1 + perm_1[1] = 0 + unit_cell = paddle.transpose(x=x, perm=perm_1) + unit_cell_batch = unit_cell.view(1, 3, num_cells).expand(shape=[batch_size, -1, -1]) + + x = lattice + perm_2 = list(range(x.ndim)) + perm_2[1] = 2 + perm_2[2] = 1 + data_cell = paddle.transpose(x=x, perm=perm_2) + pbc_offsets = paddle.bmm(x=data_cell, y=unit_cell_batch) + pbc_offsets_per_atom = paddle.repeat_interleave( + x=pbc_offsets, repeats=num_atoms_per_image_sqr, axis=0 + ) + pos1 = pos1.view(-1, 3, 1).expand(shape=[-1, -1, num_cells]) + pos2 = pos2.view(-1, 3, 1).expand(shape=[-1, -1, num_cells]) + index1 = index1.view(-1, 1).repeat(1, num_cells).view(-1) + index2 = index2.view(-1, 1).repeat(1, num_cells).view(-1) + pos2 = pos2 + pbc_offsets_per_atom + atom_distance_sqr = paddle.sum(x=(pos1 - pos2) ** 2, axis=1) + if topk_per_pair is not None: + assert topk_per_pair.shape[0] == num_atom_pairs + atom_distance_sqr_sort_index = paddle.argsort(x=atom_distance_sqr, axis=1) + assert tuple(atom_distance_sqr_sort_index.shape) == (num_atom_pairs, num_cells) + atom_distance_sqr_sort_index = ( + atom_distance_sqr_sort_index + + paddle.arange(end=num_atom_pairs)[:, None] * num_cells + ).view(-1) + topk_mask = paddle.arange(end=num_cells)[None, :] < topk_per_pair[:, None] + topk_mask = topk_mask.view(-1) + topk_indices = atom_distance_sqr_sort_index.masked_select(mask=topk_mask) + topk_mask = paddle.zeros(shape=num_atom_pairs * num_cells) + topk_mask.put_along_axis_(axis=0, indices=topk_indices, values=1.0) + topk_mask = topk_mask.astype(dtype="bool") + atom_distance_sqr = atom_distance_sqr.view(-1) + mask_within_radius = paddle.less_equal( + x=atom_distance_sqr, y=paddle.to_tensor(radius * radius, dtype="float32") + ) + mask_not_same = paddle.greater_than( + x=atom_distance_sqr, y=paddle.to_tensor(0.0001, dtype="float32") + ) + mask = paddle.logical_and(x=mask_within_radius, y=mask_not_same) + index1 = paddle.masked_select(x=index1, mask=mask) + index2 = paddle.masked_select(x=index2, mask=mask) + unit_cell = paddle.masked_select( + x=unit_cell_per_atom.view(-1, 3), mask=mask.view(-1, 1).expand(shape=[-1, 3]) + ) + unit_cell = unit_cell.view(-1, 3) + if topk_per_pair is not None: + topk_mask = paddle.masked_select(x=topk_mask, mask=mask) + num_neighbors = paddle.zeros(shape=len(cart_coords)) + num_neighbors.index_add_(axis=0, index=index1, value=paddle.ones(shape=len(index1))) + num_neighbors = num_neighbors.astype(dtype="int64") + max_num_neighbors = paddle.max(x=num_neighbors).astype(dtype="int64") + _max_neighbors = copy.deepcopy(num_neighbors) + _max_neighbors[ + _max_neighbors > max_num_neighbors_threshold + ] = max_num_neighbors_threshold + _num_neighbors = paddle.zeros(shape=len(cart_coords) + 1).astype(dtype="int64") + _natoms = paddle.zeros(shape=tuple(num_atoms.shape)[0] + 1).astype(dtype="int64") + _num_neighbors[1:] = paddle.cumsum(x=_max_neighbors, axis=0) + _natoms[1:] = paddle.cumsum(x=num_atoms, axis=0) + num_neighbors_image = _num_neighbors[_natoms[1:]] - _num_neighbors[_natoms[:-1]] + if ( + max_num_neighbors <= max_num_neighbors_threshold + or max_num_neighbors_threshold <= 0 + ): + if topk_per_pair is None: + return paddle.stack(x=(index2, index1)), unit_cell, num_neighbors_image + else: + return ( + paddle.stack(x=(index2, index1)), + unit_cell, + num_neighbors_image, + topk_mask, + ) + atom_distance_sqr = paddle.masked_select(x=atom_distance_sqr, mask=mask) + distance_sort = paddle.zeros(shape=len(cart_coords) * max_num_neighbors).fill_( + value=radius * radius + 1.0 + ) + index_neighbor_offset = paddle.cumsum(x=num_neighbors, axis=0) - num_neighbors + index_neighbor_offset_expand = paddle.repeat_interleave( + x=index_neighbor_offset, repeats=num_neighbors + ) + index_sort_map = ( + index1 * max_num_neighbors + + paddle.arange(end=len(index1)) + - index_neighbor_offset_expand + ) + distance_sort.scatter_(index_sort_map, atom_distance_sqr) + distance_sort = distance_sort.view(len(cart_coords), max_num_neighbors) + distance_sort, index_sort = paddle.sort(x=distance_sort, axis=1), paddle.argsort( + x=distance_sort, axis=1 + ) + distance_sort = distance_sort[:, :max_num_neighbors_threshold] + index_sort = index_sort[:, :max_num_neighbors_threshold] + index_sort = index_sort + index_neighbor_offset.view(-1, 1).expand( + shape=[-1, max_num_neighbors_threshold] + ) + mask_within_radius = paddle.less_equal( + x=distance_sort, y=paddle.to_tensor(radius * radius, dtype="float32") + ) + index_sort = paddle.masked_select(x=index_sort, mask=mask_within_radius) + mask_num_neighbors = paddle.zeros(shape=len(index1)).astype(dtype="bool") + mask_num_neighbors.index_fill_(axis=0, index=index_sort, value=True) + index1 = paddle.masked_select(x=index1, mask=mask_num_neighbors) + index2 = paddle.masked_select(x=index2, mask=mask_num_neighbors) + unit_cell = paddle.masked_select( + x=unit_cell.view(-1, 3), + mask=mask_num_neighbors.view(-1, 1).expand(shape=[-1, 3]), + ) + unit_cell = unit_cell.view(-1, 3) + if topk_per_pair is not None: + topk_mask = paddle.masked_select(x=topk_mask, mask=mask_num_neighbors) + edge_index = paddle.stack(x=(index2, index1)) + if topk_per_pair is None: + return edge_index, unit_cell, num_neighbors_image + else: + return edge_index, unit_cell, num_neighbors_image, topk_mask + + +def radius_graph_pbc_wrapper( + frac_coords, lattices, num_atoms, radius, max_num_neighbors_threshold, device +): + cart_coords = frac_to_cart_coords( + frac_coords, num_atoms=num_atoms, lattices=lattices + ) + return radius_graph_pbc( + cart_coords, lattices, num_atoms, radius, max_num_neighbors_threshold, device + ) + + +def frac_to_cart_coords( + frac_coords, num_atoms, lengths=None, angles=None, lattices=None +): + assert (lengths is not None and angles is not None) or lattices is not None + if lattices is None: + lattices = lattice_params_to_matrix_paddle(lengths, angles) + lattice_nodes = paddle.repeat_interleave(x=lattices, repeats=num_atoms, axis=0) + pos = paddle.einsum("bi,bij->bj", frac_coords, lattice_nodes) + return pos + + +def frac_to_cart_coords_with_lattice( + frac_coords: paddle.Tensor, num_atoms: paddle.Tensor, lattice: paddle.Tensor +) -> paddle.Tensor: + lattice_nodes = paddle.repeat_interleave(x=lattice, repeats=num_atoms, axis=0) + pos = paddle.einsum("bi,bij->bj", frac_coords, lattice_nodes) + return pos + + +def cart_to_frac_coords( + cart_coords, num_atoms, lengths=None, angles=None, lattices=None +): + assert (lengths is not None and angles is not None) or lattices is not None + if lattices is None: + lattices = lattice_params_to_matrix_paddle(lengths, angles) + inv_lattice = paddle.linalg.pinv(x=lattices) + inv_lattice_nodes = paddle.repeat_interleave( + x=inv_lattice, repeats=num_atoms, axis=0 + ) + frac_coords = paddle.einsum("bi,bij->bj", cart_coords, inv_lattice_nodes) + return frac_coords % 1.0 + + +def polar_decomposition(x): + vecU, vals, vecV = paddle.linalg.svd(x) + P = ( + vecV.transpose([0, 2, 1]).multiply(vals.view([vals.shape[0], 1, vals.shape[1]])) + @ vecV + ) + U = vecU @ vecV + return U, P + + +def compute_lattice_polar_decomposition(lattice_matrix: paddle.Tensor) -> paddle.Tensor: + W, S, V_transp = paddle.linalg.svd(full_matrices=True, x=lattice_matrix) + S_square = paddle.diag_embed(input=S) + V = V_transp.transpose(perm=dim2perm(V_transp.ndim, 1, 2)) + U = W @ V_transp + P = V @ S_square @ V_transp + P_prime = U @ P @ U.transpose(perm=dim2perm(U.ndim, 1, 2)) + symm_lattice_matrix = P_prime + return symm_lattice_matrix diff --git a/ppmat/utils/download.py b/ppmat/utils/download.py new file mode 100644 index 00000000..4b961bf7 --- /dev/null +++ b/ppmat/utils/download.py @@ -0,0 +1,313 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import hashlib +import os +import os.path as osp +import shutil +import tarfile +import time +import zipfile + +import requests +import tqdm + +from ppmat.utils import logger +from ppmat.utils import misc + +__all__ = ["get_weights_path_from_url"] + +WEIGHTS_HOME = osp.expanduser("~/.paddlemat/weights") +DATASETS_HOME = osp.expanduser("~/.paddlemat/datasets") + +DOWNLOAD_RETRY_LIMIT = 3 + + +def is_url(path): + """ + Whether path is URL. + + Args: + path (str): URL string or not. + """ + return path.startswith("http://") or path.startswith("https://") + + +def get_weights_path_from_url(url, md5sum=None): + """Get weights path from WEIGHT_HOME, if not exists, + download it from url. + + Args: + url (str): Download url + md5sum (str): md5 sum of download package + + Returns: + str: a local path to save downloaded weights. + """ + path = get_path_from_url(url, WEIGHTS_HOME, md5sum) + return path + + +def get_datasets_path_from_url(url, md5sum=None): + """Get datasets path from DATASETS_HOME, if not exists, + download it from url. + + Args: + url (str): Download url + md5sum (str): md5 sum of download package + + Returns: + str: a local path to save downloaded weights. + """ + path = get_path_from_url(url, DATASETS_HOME, md5sum) + return path + + +def _map_path(url, root_dir): + # parse path after download under root_dir + fname = osp.split(url)[-1] + fpath = fname + return osp.join(root_dir, fpath) + + +def get_path_from_url(url, root_dir, md5sum=None, check_exist=True, decompress=True): + """Download from given url to root_dir. + if file or directory specified by url is exists under + root_dir, return the path directly, otherwise download + from url and decompress it, return the path. + + Args: + url (str): Download url + root_dir (str): Root dir for downloading, it should be + WEIGHTS_HOME or DATASET_HOME + md5sum (str): md5 sum of download package + + Returns: + str: a local path to save downloaded models & weights & datasets. + """ + if not is_url(url): + raise ValueError(f"Given url({url}) is not valid") + # parse path after download to decompress under root_dir + fullpath = _map_path(url, root_dir) + # Mainly used to solve the problem of downloading data from different + # machines in the case of multiple machines. Different nodes will download + # data, and the same node will only download data once. + rank_id_curr_node = int(os.environ.get("PADDLE_RANK_IN_NODE", 0)) + + if osp.exists(fullpath) and check_exist and _md5check(fullpath, md5sum): + logger.message(f"Found {fullpath} exists, skip downloading.") + else: + with misc.RankZeroOnly(rank_id_curr_node) as is_master: + if is_master: + fullpath = _download(url, root_dir, md5sum) + + if decompress and (tarfile.is_tarfile(fullpath) or zipfile.is_zipfile(fullpath)): + with misc.RankZeroOnly(rank_id_curr_node) as is_master: + if is_master: + fullpath = _decompress(fullpath) + else: + fullpath = _get_extract_dir(fullpath) + + return fullpath + + +def _download(url, path, md5sum=None): + """ + Download from url, save to path. + + url (str): Download url + path (str): Download to given path + """ + if not osp.exists(path): + os.makedirs(path) + + fname = osp.split(url)[-1] + fullname = osp.join(path, fname) + retry_cnt = 0 + + while not (osp.exists(fullname) and _md5check(fullname, md5sum)): + if retry_cnt < DOWNLOAD_RETRY_LIMIT: + retry_cnt += 1 + else: + raise RuntimeError(f"Download from {url} failed. " "Retry limit reached") + + logger.message(f"Downloading {fname} from {url}") + + try: + req = requests.get(url, stream=True) + except Exception as e: # requests.exceptions.ConnectionError + logger.warning( + f"Downloading {fname} from {url} failed {retry_cnt + 1} times with " + f"exception {str(e)}" + ) + time.sleep(1) + continue + + if req.status_code != 200: + raise RuntimeError( + f"Downloading from {url} failed with code " f"{req.status_code}!" + ) + + # For protecting download interrupted, download to + # tmp_fullname firstly, move tmp_fullname to fullname + # after download finished + tmp_fullname = fullname + "_tmp" + total_size = req.headers.get("content-length") + with open(tmp_fullname, "wb") as f: + if total_size: + with tqdm.tqdm(total=(int(total_size) + 1023) // 1024) as pbar: + for chunk in req.iter_content(chunk_size=1024): + f.write(chunk) + pbar.update(1) + else: + for chunk in req.iter_content(chunk_size=1024): + if chunk: + f.write(chunk) + shutil.move(tmp_fullname, fullname) + logger.message(f"Finish downloading pretrained model and saved to {fullname}") + + return fullname + + +def _md5check(fullname, md5sum=None): + if md5sum is None: + return True + + logger.message(f"File {fullname} md5 checking...") + md5 = hashlib.md5() + with open(fullname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + md5.update(chunk) + calc_md5sum = md5.hexdigest() + + if calc_md5sum != md5sum: + logger.error( + f"File {fullname} md5 check failed, {calc_md5sum}(calc) != " + f"{md5sum}(base)" + ) + return False + return True + + +def _decompress(fname): + """ + Decompress for zip and tar file + """ + logger.message(f"Decompressing {fname}...") + + # For protecting decompressing interrupted, + # decompress to fpath_tmp directory firstly, if decompress + # succeed, move decompress files to fpath and delete + # fpath_tmp and remove download compress file. + + if tarfile.is_tarfile(fname): + uncompressed_path = _uncompress_file_tar(fname) + elif zipfile.is_zipfile(fname): + uncompressed_path = _uncompress_file_zip(fname) + else: + raise TypeError(f"Unsupported compress file type {fname}") + + return uncompressed_path + + +def _get_extract_dir(filepath): + return os.path.splitext(filepath)[0] + + +def _uncompress_file_zip(filepath): + if not os.path.exists(filepath): + raise FileNotFoundError(f"{filepath} not found") + + file_dir = _get_extract_dir(filepath) + + with zipfile.ZipFile(filepath, "r") as files: + if files.testzip() is not None: + raise IOError(f"{filepath} is broken") + + file_list = files.namelist() + if _is_a_single_file(file_list): + rootpath = file_list[0] + uncompressed_path = os.path.join(file_dir, rootpath) + + for item in file_list: + files.extract(item, file_dir) + + elif _is_a_single_dir(file_list): + rootpath = os.path.splitext(file_list[0])[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + + for item in file_list: + files.extract(item, file_dir) + + else: + rootpath = os.path.splitext(filepath)[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + if not os.path.exists(uncompressed_path): + os.makedirs(uncompressed_path) + for item in file_list: + files.extract(item, os.path.join(file_dir, rootpath)) + + return uncompressed_path + + +def _uncompress_file_tar(filepath, mode="r:*"): + with tarfile.open(filepath, mode) as files: + file_list = files.getnames() + + file_dir = _get_extract_dir(filepath) + + if _is_a_single_file(file_list): + rootpath = file_list[0] + uncompressed_path = os.path.join(file_dir, rootpath) + for item in file_list: + files.extract(item, file_dir) + elif _is_a_single_dir(file_list): + rootpath = os.path.splitext(file_list[0])[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + for item in file_list: + files.extract(item, file_dir) + else: + rootpath = os.path.splitext(filepath)[0].split(os.sep)[-1] + uncompressed_path = os.path.join(file_dir, rootpath) + if not os.path.exists(uncompressed_path): + os.makedirs(uncompressed_path) + + for item in file_list: + files.extract(item, os.path.join(file_dir, rootpath)) + + return uncompressed_path + + +def _is_a_single_file(file_list): + if len(file_list) == 1 and file_list[0].find(os.sep) < -1: + return True + return False + + +def _is_a_single_dir(file_list): + new_file_list = [] + for file_path in file_list: + if "/" in file_path: + file_path = file_path.replace("/", os.sep) + elif "\\" in file_path: + file_path = file_path.replace("\\", os.sep) + new_file_list.append(file_path) + + file_name = new_file_list[0].split(os.sep)[0] + for i in range(1, len(new_file_list)): + if file_name != new_file_list[i].split(os.sep)[0]: + return False + return True diff --git a/ppmat/utils/eager_comp_setting.py b/ppmat/utils/eager_comp_setting.py new file mode 100644 index 00000000..95e0dd9f --- /dev/null +++ b/ppmat/utils/eager_comp_setting.py @@ -0,0 +1,73 @@ +import paddle +from paddle.framework import core + +EAGER_COMP_OP_BLACK_LIST = [ + "abs_grad", + "cast_grad", + "concat_grad", + "cos_double_grad", + "cos_grad", + "cumprod_grad", + "cumsum_grad", + "dropout_grad", + "erf_grad", + "exp_grad", + "expand_grad", + "floor_grad", + "gather_grad", + "gather_nd_grad", + "gelu_grad", + "group_norm_grad", + "instance_norm_grad", + "layer_norm_grad", + "leaky_relu_grad", + "log_grad", + "max_grad", + "pad_grad", + "pow_double_grad", + "pow_grad", + "prod_grad", + "relu_grad", + "roll_grad", + "rsqrt_grad", + "scatter_grad", + "scatter_nd_add_grad", + "sigmoid_grad", + "silu_grad", + "sin_double_grad", + "sin_grad", + "slice_grad", + "split_grad", + "sqrt_grad", + "stack_grad", + "sum_grad", + "tanh_double_grad", + "tanh_grad", + "topk_grad", + "transpose_grad", + "add_double_grad", + "add_grad", + "assign_grad", + "batch_norm_grad", + "divide_grad", + "elementwise_pow_grad", + "maximum_grad", + "min_grad", + "minimum_grad", + "multiply_grad", + "subtract_grad", + "tile_grad", +] +EAGER_COMP_OP_BLACK_LIST = list(set(EAGER_COMP_OP_BLACK_LIST)) + + +def setting_eager_mode(enable=True, white_list=None): + core.set_prim_eager_enabled(enable) + if enable: + new_black_list = EAGER_COMP_OP_BLACK_LIST + if white_list is not None: + assert isinstance(white_list, list) + for op in white_list: + if op in new_black_list: + new_black_list.remove(op) + paddle.framework.core._set_prim_backward_blacklist(*new_black_list) diff --git a/ppmat/utils/ema.py b/ppmat/utils/ema.py new file mode 100644 index 00000000..03a87c7c --- /dev/null +++ b/ppmat/utils/ema.py @@ -0,0 +1,149 @@ +# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import itertools +from typing import Dict +from typing import Optional + +import paddle +from paddle import nn + +__all__ = [ + "AveragedModel", + "ExponentialMovingAverage", + "StochasticWeightAverage", +] + + +class AveragedModel(nn.Layer): + """Base class for Averaged Model. + + Args: + model (nn.Layer): The model to be averaged. + decay (float): The decay rate for averaging. + """ + + def __init__(self, model: nn.Layer, decay: Optional[float] = None): + super().__init__() + self.model = model # As a quick reference to online model + self.decay = decay + + self.params_shadow: Dict[str, paddle.Tensor] = {} # ema param or buffer + self.params_backup: Dict[str, paddle.Tensor] = {} # used for apply and restore + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + self.params_shadow[name] = param_or_buffer.clone().detach() + + self.register_buffer("n_avg", paddle.to_tensor(0, "int64"), True) + + def _update_fn_( + self, + shadow_param: paddle.Tensor, + model_param: paddle.Tensor, + step: paddle.Tensor, + ): + raise NotImplementedError("AveragedModel._update_fn_ should be implemented.") + + def update(self): + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + if not param_or_buffer.stop_gradient: + assert ( + name in self.params_shadow + ), f"Parameter: {name} should be in params_shadow dict, but not found." + + # only update floating and complex data + if paddle.is_floating_point(param_or_buffer) or paddle.is_complex( + param_or_buffer + ): + with paddle.no_grad(): + self._update_fn_( + self.params_shadow[name], + param_or_buffer, + self.n_avg, + ) + self.n_avg += 1 + + def apply_shadow(self): + """Set averaged model parameters to online model.""" + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + if name in self.params_shadow: + stop_gradient = param_or_buffer.stop_gradient + with paddle.no_grad(): + self.params_backup[name] = paddle.assign(param_or_buffer) + paddle.assign(self.params_shadow[name], param_or_buffer) + param_or_buffer.stop_gradient = stop_gradient + + def restore(self): + """Restore online model parameters from backup parameter dict.""" + assert self.params_backup, ( + "params_backup should not be empty, may be caused by calling 'restore' " + "before 'apply_shadow'." + ) + for name, param_or_buffer in itertools.chain( + self.model.named_parameters(), self.model.named_buffers() + ): + if name in self.params_backup: + assert name in self.params_shadow + stop_gradient = param_or_buffer.stop_gradient + with paddle.no_grad(): + paddle.assign(self.params_backup[name], param_or_buffer) + param_or_buffer.stop_gradient = stop_gradient + + self.params_backup = {} + + def set_state_dict(self, state_dict: Dict[str, paddle.Tensor]): + assert ( + "n_avg" in state_dict + ), "state_dict should contain 'n_avg' key, but not found." + self.n_avg.set_value(state_dict.pop("n_avg")) + self.params_shadow.update(state_dict) + + def state_dict(self) -> Dict[str, paddle.Tensor]: + return { + **self.params_shadow, + "n_avg": self.n_avg, + } + + +class ExponentialMovingAverage(AveragedModel): + r"""Implements the exponential moving average (EMA) of the model.""" + + def __init__(self, model: nn.Layer, decay: float = 0.9): + super().__init__(model, decay) + + def _update_fn_(self, shadow_param, model_param, step): + shadow_param.lerp_(model_param, 1.0 - self.decay) + + +class StochasticWeightAverage(AveragedModel): + r"""Implements the stochastic weight averaging (SWA) of the model. + + Args: + model (nn.Layer): The model to be averaged. + """ + + def __init__(self, model: nn.Layer): + super().__init__(model, None) + self.n_avg += 1 # Set to 1 for model already initialized + + def _update_fn_(self, shadow_param, model_param, step): + dynamic_decay = step / (step + 1) + shadow_param.lerp_(model_param, 1.0 - dynamic_decay) diff --git a/ppmat/utils/ext_rdkit.py b/ppmat/utils/ext_rdkit.py new file mode 100644 index 00000000..740cdc4e --- /dev/null +++ b/ppmat/utils/ext_rdkit.py @@ -0,0 +1,360 @@ +from __future__ import annotations + +import re + +import numpy as np +import paddle +from rdkit import Chem + +from ppmat.utils import logger + +allowed_bonds = { + "H": 1, + "C": 4, + "N": 3, + "O": 2, + "F": 1, + "B": 3, + "Al": 3, + "Si": 4, + "P": [3, 5], + "S": 4, + "Cl": 1, + "As": 3, + "Br": 1, + "I": 1, + "Hg": [1, 2], + "Bi": [3, 5], + "Se": [2, 4, 6], +} +bond_dict = [ + None, + Chem.rdchem.BondType.SINGLE, + Chem.rdchem.BondType.DOUBLE, + Chem.rdchem.BondType.TRIPLE, + Chem.rdchem.BondType.AROMATIC, +] +ATOM_VALENCY = {6: 4, 7: 3, 8: 2, 9: 1, 15: 3, 16: 2, 17: 1, 35: 1, 53: 1} + + +class BasicMolecularMetrics(object): + """ + Generate and evaluate the sturcte of molecules + """ + + def __init__(self, dataset_info, train_smiles=None): + self.atom_decoder = dataset_info.atom_decoder + self.dataset_info = dataset_info + # Retrieve dataset smiles only for qm9 currently + self.dataset_smiles_list = train_smiles + + def compute_validity(self, generated): + """ + generated: list of couples (positions, atom_types) for generated molecules + """ + valid = [] + num_components = [] + all_smiles = [] + for graph in generated: + atom_types, edge_types = graph + atom_types = paddle.to_tensor(atom_types) + edge_types = paddle.to_tensor(edge_types) + mol = build_molecule(atom_types, edge_types, self.dataset_info.atom_decoder) + smiles = mol2smiles(mol) + try: + mol_frags = Chem.rdmolops.GetMolFrags( + mol, asMols=True, sanitizeFrags=True + ) + num_components.append(len(mol_frags)) + largest_mol = max(mol_frags, default=mol, key=lambda m: m.GetNumAtoms()) + smiles = mol2smiles(largest_mol) + if smiles is not None: + valid.append(smiles) + all_smiles.append(smiles) + except Exception as e: + logger.debug(f"Error in GetMolFrags: {e}") + all_smiles.append(None) + except Chem.rdchem.AtomValenceException: + logger.debug("Valence error in GetmolFrags") + all_smiles.append(None) + except Chem.rdchem.KekulizeException: + logger.debug("Can't kekulize molecule") + all_smiles.append(None) + else: + if smiles is None: + all_smiles.append(None) + return valid, len(valid) / len(generated), np.array(num_components), all_smiles + + def compute_uniqueness(self, valid): + """valid: list of SMILES strings.""" + return list(set(valid)), len(set(valid)) / len(valid) + + def compute_novelty(self, unique): + num_novel = 0 + novel = [] + if self.dataset_smiles_list is None: + print("Dataset smiles is None, novelty computation skipped") + return 1, 1 + for smiles in unique: + if smiles not in self.dataset_smiles_list: + novel.append(smiles) + num_novel += 1 + return novel, num_novel / len(unique) + + def compute_relaxed_validity(self, generated): + valid = [] + for graph in generated: + atom_types, edge_types = graph + atom_types = paddle.to_tensor(atom_types) + edge_types = paddle.to_tensor(edge_types) + mol = build_molecule_with_partial_charges( + atom_types, edge_types, self.dataset_info.atom_decoder + ) + smiles = mol2smiles(mol) + if smiles is not None: + try: + mol_frags = Chem.rdmolops.GetMolFrags( + mol, asMols=True, sanitizeFrags=True + ) + largest_mol = max( + mol_frags, default=mol, key=lambda m: m.GetNumAtoms() + ) + smiles = mol2smiles(largest_mol) + valid.append(smiles) + except Chem.rdchem.AtomValenceException: + logger.info("Valence error in GetmolFrags") + except Chem.rdchem.KekulizeException: + logger.info("Can't kekulize molecule") + return valid, len(valid) / len(generated) + + def evaluate(self, generated): + """generated: list of pairs (positions: n x 3, atom_types: n [int]) + the positions and atom types should already be masked.""" + _, validity, num_components, all_smiles = self.compute_validity(generated) + nc_mu = num_components.mean() if len(num_components) > 0 else 0 + nc_min = num_components.min() if len(num_components) > 0 else 0 + nc_max = num_components.max() if len(num_components) > 0 else 0 + + relaxed_valid, relaxed_validity = self.compute_relaxed_validity(generated) + + if relaxed_validity > 0: + unique, uniqueness = self.compute_uniqueness(relaxed_valid) + if self.dataset_smiles_list is not None: + _, novelty = self.compute_novelty(unique) + else: + novelty = -1.0 + else: + novelty = -1.0 + uniqueness = 0.0 + unique = [] + return ( + [validity, relaxed_validity, uniqueness, novelty], + unique, + dict(nc_min=nc_min, nc_max=nc_max, nc_mu=nc_mu), + all_smiles, + ) + + +def mol2smiles(mol): + try: + Chem.SanitizeMol(mol) + except ValueError: + return None + return Chem.MolToSmiles(mol) + + +def build_molecule(atom_types, edge_types, atom_decoder, verbose=False): + if verbose: + print("building new molecule") + mol = Chem.RWMol() + for atom in atom_types: + a = Chem.Atom(atom_decoder[atom.item()]) + mol.AddAtom(a) + if verbose: + print("Atom added: ", atom.item(), atom_decoder[atom.item()]) + edge_types = paddle.triu(x=edge_types) + all_bonds = paddle.nonzero(x=edge_types) + for i, bond in enumerate(all_bonds): + if bond[0].item() != bond[1].item(): + mol.AddBond( + bond[0].item(), + bond[1].item(), + bond_dict[edge_types[bond[0], bond[1]].item()], + ) + if verbose: + print( + "bond added:", + bond[0].item(), + bond[1].item(), + edge_types[bond[0], bond[1]].item(), + bond_dict[edge_types[bond[0], bond[1]].item()], + ) + return mol + + +def build_molecule_with_partial_charges( + atom_types, edge_types, atom_decoder, verbose=False +): + if verbose: + print("\nbuilding new molecule") + mol = Chem.RWMol() + for atom in atom_types: + a = Chem.Atom(atom_decoder[atom.item()]) + mol.AddAtom(a) + if verbose: + print("Atom added: ", atom.item(), atom_decoder[atom.item()]) + edge_types = paddle.triu(x=edge_types) + all_bonds = paddle.nonzero(x=edge_types) + for i, bond in enumerate(all_bonds): + if bond[0].item() != bond[1].item(): + mol.AddBond( + bond[0].item(), + bond[1].item(), + bond_dict[edge_types[bond[0], bond[1]].item()], + ) + if verbose: + print( + "bond added:", + bond[0].item(), + bond[1].item(), + edge_types[bond[0], bond[1]].item(), + bond_dict[edge_types[bond[0], bond[1]].item()], + ) + flag, atomid_valence = check_valency(mol) + if verbose: + print("flag, valence", flag, atomid_valence) + if flag: + continue + else: + assert len(atomid_valence) == 2 + idx = atomid_valence[0] + v = atomid_valence[1] + an = mol.GetAtomWithIdx(idx).GetAtomicNum() + if verbose: + print("atomic num of atom with a large valence", an) + if an in (7, 8, 16) and v - ATOM_VALENCY[an] == 1: + mol.GetAtomWithIdx(idx).SetFormalCharge(1) + return mol + + +def check_valency(mol): + try: + Chem.SanitizeMol(mol, sanitizeOps=Chem.SanitizeFlags.SANITIZE_PROPERTIES) + return True, None + except ValueError as e: + e = str(e) + p = e.find("#") + e_sub = e[p:] + atomid_valence = list(map(int, re.findall("\\d+", e_sub))) + return False, atomid_valence + + +def correct_mol(m): + mol = m + no_correct = False + flag, _ = check_valency(mol) + if flag: + no_correct = True + while True: + flag, atomid_valence = check_valency(mol) + if flag: + break + else: + assert len(atomid_valence) == 2 + idx = atomid_valence[0] + queue = [] + check_idx = 0 + for b in mol.GetAtomWithIdx(idx).GetBonds(): + type = int(b.GetBondType()) + queue.append((b.GetIdx(), type, b.GetBeginAtomIdx(), b.GetEndAtomIdx())) + if type == 12: + check_idx += 1 + queue.sort(key=lambda tup: tup[1], reverse=True) + if queue[-1][1] == 12: + return None, no_correct + elif len(queue) > 0: + start = queue[check_idx][2] + end = queue[check_idx][3] + t = queue[check_idx][1] - 1 + mol.RemoveBond(start, end) + if t >= 1: + mol.AddBond(start, end, bond_dict[t]) + return mol, no_correct + + +def valid_mol_can_with_seg(m, largest_connected_comp=True): + if m is None: + return None + sm = Chem.MolToSmiles(m, isomericSmiles=True) + if largest_connected_comp and "." in sm: + vsm = [(s, len(s)) for s in sm.split(".")] + vsm.sort(key=lambda tup: tup[1], reverse=True) + mol = Chem.MolFromSmiles(vsm[0][0]) + else: + mol = Chem.MolFromSmiles(sm) + return mol + + +def check_stability( + atom_types, edge_types, dataset_info, debug=False, atom_decoder=None +): + if atom_decoder is None: + atom_decoder = dataset_info.atom_decoder + n_bonds = np.zeros(len(atom_types), dtype="int") + for i in range(len(atom_types)): + for j in range(i + 1, len(atom_types)): + n_bonds[i] += abs((edge_types[i, j] + edge_types[j, i]) / 2) + n_bonds[j] += abs((edge_types[i, j] + edge_types[j, i]) / 2) + n_stable_bonds = 0 + for atom_type, atom_n_bond in zip(atom_types, n_bonds): + possible_bonds = allowed_bonds[atom_decoder[atom_type]] + if type(possible_bonds) == int: + is_stable = possible_bonds == atom_n_bond + else: + is_stable = atom_n_bond in possible_bonds + if not is_stable and debug: + logger.info( + "Invalid bonds for molecule %s with %d bonds" + % (atom_decoder[atom_type], atom_n_bond) + ) + n_stable_bonds += int(is_stable) + molecule_stable = n_stable_bonds == len(atom_types) + return molecule_stable, n_stable_bonds, len(atom_types) + + +def compute_molecular_metrics(molecule_list, train_smiles, dataset_info): + """molecule_list: (dict)""" + if not dataset_info.remove_h: + logger.info("Analyzing molecule stability...") + molecule_stable = 0 + nr_stable_bonds = 0 + n_atoms = 0 + n_molecules = len(molecule_list) + for i, mol in enumerate(molecule_list): + atom_types, edge_types = mol + validity_results = check_stability(atom_types, edge_types, dataset_info) + molecule_stable += int(validity_results[0]) + nr_stable_bonds += int(validity_results[1]) + n_atoms += int(validity_results[2]) + fraction_mol_stable = molecule_stable / float(n_molecules) + fraction_atm_stable = nr_stable_bonds / float(n_atoms) + validity_dict = { + "mol_stable": fraction_mol_stable, + "atm_stable": fraction_atm_stable, + } + else: + validity_dict = {"mol_stable": -1, "atm_stable": -1} + metrics = BasicMolecularMetrics(dataset_info, train_smiles) + rdkit_metrics = metrics.evaluate(molecule_list) + all_smiles = rdkit_metrics[-1] + return validity_dict, rdkit_metrics, all_smiles + + +if __name__ == "__main__": + smiles_mol = "C1CCC1" + print("Smiles mol %s" % smiles_mol) + chem_mol = Chem.MolFromSmiles(smiles_mol) + block_mol = Chem.MolToMolBlock(chem_mol) + print("Block mol:") + print(block_mol) +use_rdkit = True diff --git a/ppmat/utils/fix_pgl.py b/ppmat/utils/fix_pgl.py new file mode 100644 index 00000000..745ed2bb --- /dev/null +++ b/ppmat/utils/fix_pgl.py @@ -0,0 +1,62 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +import pkg_resources + + +def get_library_path(library_name): + distribution = pkg_resources.get_distribution(library_name) + location = distribution.location + return os.path.abspath(location) + + +def read_file(file_path): + with open(file_path, "r", encoding="utf-8") as file: + content = file.read() + return content + + +def write_file(file_path, content): + with open(file_path, "w", encoding="utf-8") as file: + file.write(content) + + +library_path = get_library_path("pgl") +file_paths = ["pgl/math.py", "pgl/utils/helper.py", "pgl/utils/op.py"] + +# replace "fluid" with "base" +for file_path in file_paths: + full_path = os.path.join(library_path, file_path) + print(f"Processing {full_path}, replacing 'fluid' with 'base'...") + content = read_file(full_path) + new_content = content.replace("paddle.fluid", "paddle.base") + new_content = new_content.replace("paddle.base.core as core", "paddle.base as core") + new_content = new_content.replace( + "from paddle.base.layers import core", "from paddle.base import core" + ) + write_file(full_path, new_content) + +# delete "overwrite" paramters in "pgl/utils/helper.py" +file_paths = ["pgl/utils/helper.py"] +for file_path in file_paths: + full_path = os.path.join(library_path, file_path) + print(f"Processing {full_path}, deleting 'overwrite' paramters...") + content = read_file(full_path) + new_content = content.replace( + "return _C_ops.scatter(x, index, updates, 'overwrite', overwrite)", + "return _C_ops.scatter(x, index, updates, overwrite)", + ) + write_file(full_path, new_content) diff --git a/ppmat/utils/io.py b/ppmat/utils/io.py new file mode 100644 index 00000000..28a326e8 --- /dev/null +++ b/ppmat/utils/io.py @@ -0,0 +1,136 @@ +# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import ast +import hashlib +import json +import os +import os.path as osp +from typing import List + +import numpy as np + + +def count_samples_json_lines(path: str): + """Fast count of samples in a line-delimited JSON file.""" + with open(path, "r") as f: + return sum(1 for _ in f) + + +def read_json_lines(path): + """ + Read all lines from a line-delimited JSON file, + extracting all properties into a dictionary of lists. + """ + property_data = {} + + with open(path, "r") as f: + for idx, line in enumerate(f): + content = ast.literal_eval(line.strip()) + # if idx == 301: + # break + if idx == 0: + all_property_names = list(content.keys()) + # print("all_property_names:", all_property_names) + property_data = {name: [] for name in all_property_names} + + for property_name in all_property_names: + if property_name not in content: + raise ValueError( + f"'{property_name}' not found in line {idx + 1} of file" + ) + property_data[property_name].append(content[property_name]) + return property_data + + +def read_json(path): + """ """ + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + with open(path, "r") as f: + content = json.load(f) + return content + + +def list_files_by_suffix(path: str, suffix: str) -> List[str]: + """List files under path with the given suffix.""" + if not osp.isdir(path): + raise FileNotFoundError(f"Directory not found: {path}") + file_names = sorted( + file_name for file_name in os.listdir(path) if file_name.endswith(suffix) + ) + if not file_names: + raise FileNotFoundError(f"No files ending with {suffix} found under {path}.") + return file_names + + +def update_json(path, data): + """ """ + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + content = read_json(path) + content.update(data) + write_json(path, content) + + +def write_json(path, data): + """ """ + if not path.endswith(".json"): + raise UserWarning(f"Path {path} is not a json-path.") + + def handler(obj: object) -> (int | object): + """Convert numpy int64 to int. + + Fixes TypeError: Object of type int64 is not JSON serializable + reported in https://github.com/CederGroupHub/chgnet/issues/168. + + Returns: + int | object: object for serialization + """ + if isinstance(obj, np.integer): + return int(obj) + return obj + + with open(path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4, default=handler) + + +def read_value_json(path, key): + """ """ + content = read_json(path) + if key in content.keys(): + return content[key] + else: + return None + + +def calc_md5(fullname): + md5 = hashlib.md5() + fullname = os.path.expanduser(fullname) + with open(fullname, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + md5.update(chunk) + calc_md5sum = md5.hexdigest() + + return calc_md5sum + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Calculate MD5 hash of a file") + parser.add_argument("filename", help="Path to the file to hash") + args = parser.parse_args() + + md5 = calc_md5(args.filename) + print(md5) diff --git a/ppmat/utils/logger.py b/ppmat/utils/logger.py new file mode 100644 index 00000000..bdef7e66 --- /dev/null +++ b/ppmat/utils/logger.py @@ -0,0 +1,269 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import functools +import logging +import os +import sys +from typing import TYPE_CHECKING +from typing import Callable +from typing import Dict +from typing import Optional + +import colorlog +import paddle.distributed as dist + +from ppmat.utils import misc + +if TYPE_CHECKING: + import visualdl # isort:skip + import wandb # isort:skip + import tensorboardX as tbd + +_logger: logging.Logger = None + +# INFO(20) is white(no color) +# use custom log level `MESSAGE` for printing message in color +_MESSAGE_LEVEL = 25 + +_COLORLOG_CONFIG = { + "DEBUG": "green", + "WARNING": "yellow", + "ERROR": "red", + "MESSAGE": "cyan", +} + +__all__ = [ + "init_logger", + "set_log_level", + "info", + "message", + "debug", + "warning", + "error", + "scalar", +] + + +def init_logger( + name: str = "ppmat", + log_file: Optional[str] = None, + log_level: int = logging.INFO, +) -> None: + """Initialize and get a logger by name. + + If the logger has not been initialized, this method will initialize the logger by + adding one or two handlers, otherwise the initialized logger will be directly + returned. During initialization, a StreamHandler will always be added. If `log_file` + is specified a FileHandler will also be added. + + Args: + name (str, optional): Logger name. Defaults to "ppmat". + log_file (Optional[str]): The log filename. If specified, a FileHandler + will be added to the logger. Defaults to None. + log_level (int, optional): The logger level. Note that only the process of + rank 0 is affected, and other processes will set the level to + "Error" thus be silent most of the time. Defaults to logging.INFO. + """ + # Add custom log level MESSAGE(25), between WARNING(30) and INFO(20) + logging.addLevelName(_MESSAGE_LEVEL, "MESSAGE") + + if isinstance(log_level, str): + log_level = getattr(logging, log_level.upper()) + + global _logger + + # get a clean logger + _logger = logging.getLogger(name) + _logger.handlers.clear() + + # add stream_handler, output to stdout such as terminal + stream_formatter = colorlog.ColoredFormatter( + "%(log_color)s[%(asctime)s] %(name)s %(levelname)s: %(message)s", + datefmt="%Y/%m/%d %H:%M:%S", + log_colors=_COLORLOG_CONFIG, + ) + stream_handler = logging.StreamHandler(stream=sys.stdout) + stream_handler.setFormatter(stream_formatter) + stream_handler._name = "stream_handler" + _logger.addHandler(stream_handler) + + # add file_handler, output to log_file(if specified), only for rank 0 device + if log_file is not None and dist.get_rank() == 0: + log_file_folder = os.path.dirname(log_file) + if len(log_file_folder): + os.makedirs(log_file_folder, exist_ok=True) + file_formatter = logging.Formatter( + "[%(asctime)s] %(name)s %(levelname)s: %(message)s", + datefmt="%Y/%m/%d %H:%M:%S", + ) + file_handler = logging.FileHandler(log_file, "a") # append mode + file_handler.setFormatter(file_formatter) + file_handler._name = "file_handler" + _logger.addHandler(file_handler) + + if dist.get_rank() == 0: + _logger.setLevel(log_level) + else: + _logger.setLevel(logging.ERROR) + + _logger.propagate = False + + +def set_log_level(log_level: int): + """Set logger level, only message of level >= `log_level` will be printed. + + Built-in log level are below: + + CRITICAL = 50, + FATAL = 50, + ERROR = 40, + WARNING = 30, + WARN = 30, + INFO = 20, + DEBUG = 10, + NOTSET = 0. + + Args: + log_level (int): Log level. + """ + if dist.get_rank() == 0: + _logger.setLevel(log_level) + else: + _logger.setLevel(logging.ERROR) + + +def ensure_logger(log_func: Callable) -> Callable: + """ + A decorator which automatically initialize `logger` by default arguments + when init_logger() is not called manually. + """ + + @functools.wraps(log_func) + def wrapped_log_func(msg, *args): + if _logger is None: + init_logger() + _logger.warning( + "Logger has already been automatically initialized as `log_file` is " + "set to None by default, information will only be printed to terminal " + "without writting to any file." + ) + + log_func(msg, *args) + + return wrapped_log_func + + +@ensure_logger +@misc.run_at_rank0 +def info(msg, *args): + _logger.info(msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def message(msg, *args): + _logger.log(_MESSAGE_LEVEL, msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def debug(msg, *args): + _logger.debug(msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def warning(msg, *args): + _logger.warning(msg, *args) + + +@ensure_logger +@misc.run_at_rank0 +def error(msg, *args): + _logger.error(msg, *args) + + +def scalar( + tag: str, + metric_dict: Dict[str, float], + step: int, + visualdl_writer: Optional["visualdl.LogWriter"] = None, + wandb_writer: Optional["wandb.run"] = None, + tensorboard_writer: Optional["tbd.SummaryWriter"] = None, +): + """This function will add scalar data to VisualDL or WandB for plotting curve(s). + + Args: + tag (str): The tag of the metric. + metric_dict (Dict[str, float]): Metrics dict with metric name and value. + step (int): The step of the metric. + visualdl_writer (Optional[visualdl.LogWriter]): VisualDL writer to record + metrics. Defaults to None. + wandb_writer (Optional[wandb.run]): Run object of WandB to record metrics. + Defaults to None. + tensorboard_writer (Optional[tbd.SummaryWriter]): Run object of WandB to record + metrics. Defaults to None. + """ + tag_metric_dict = {f"{tag}_{k}": v for k, v in metric_dict.items()} + if visualdl_writer is not None: + with misc.RankZeroOnly() as is_master: + if is_master: + for name, value in tag_metric_dict.items(): + visualdl_writer.add_scalar(name, value, step) + if wandb_writer is not None: + with misc.RankZeroOnly() as is_master: + if is_master: + wandb_writer.log(data=tag_metric_dict, step=step) + + if tensorboard_writer is not None: + with misc.RankZeroOnly() as is_master: + if is_master: + for name, value in tag_metric_dict.items(): + tensorboard_writer.add_scalar(name, value, global_step=step) + + +def advertise(): + """ + Show the advertising message like the following: + + =========================================================== + == PaddleMaterials is powered by PaddlePaddle ! == + =========================================================== + == == + == For more info please go to the following website. == + == == + == https://github.com/PaddlePaddle/PaddleMaterials == + =========================================================== + """ + + _copyright = "PaddleMaterials is powered by PaddlePaddle !" + ad = "Please refer to the following website for more info." + website = "https://github.com/PaddlePaddle/PaddleMaterials" + AD_LEN = 6 + len(max([_copyright, ad, website], key=len)) + + info( + "\n{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n".format( + "=" * (AD_LEN + 4), + "=={}==".format(_copyright.center(AD_LEN)), + "=" * (AD_LEN + 4), + "=={}==".format(" " * AD_LEN), + "=={}==".format(ad.center(AD_LEN)), + "=={}==".format(" " * AD_LEN), + "=={}==".format(website.center(AD_LEN)), + "=" * (AD_LEN + 4), + ) + ) diff --git a/ppmat/utils/misc.py b/ppmat/utils/misc.py new file mode 100644 index 00000000..fd831009 --- /dev/null +++ b/ppmat/utils/misc.py @@ -0,0 +1,846 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import collections +import functools +import random +import time +from contextlib import ContextDecorator +from typing import Callable +from typing import Dict +from typing import List +from typing import Literal +from typing import Optional +from typing import Sequence +from typing import Tuple +from typing import Union + +import numpy as np +import paddle +from paddle import distributed as dist + +from ppmat.utils import logger +from ppmat.utils.paddle_aux import dim2perm +from ppmat.utils.scatter import scatter + +__all__ = [ + "AverageMeter", + "PrettyOrderedDict", + "Prettydefaultdict", + "RankZeroOnly", + "Timer", + "format_time_manual", + "all_gather", + "concat_dict_list", + "convert_to_array", + "convert_to_dict", + "stack_dict_list", + "cartesian_product", + "combine_array_with_time", + "set_random_seed", + "run_on_eval_mode", + "run_at_rank0", +] + + +class AverageMeter: + """ + Computes and stores the average and current value + Code was based on https://github.com/pytorch/examples/blob/master/imagenet/main.py + """ + + def __init__(self, name="", fmt="f", postfix="", need_avg=True, smooth_window=1): + self.name = name + self.fmt = fmt + self.postfix = postfix + self.need_avg = need_avg + self.smooth_window = smooth_window + self.reset() + + def reset(self): + """Reset.""" + self.val = 0 + self.avg = 0 + self.sum = 0 + self.count = 0 + self.history = [] + + def update(self, val, n=1): + """Update.""" + self.val = val + self.sum += val * n + self.count += n + self.avg = self.sum / self.count + self.history.append(val) + + @property + def smooth_avg(self): + if len(self.history) >= self.smooth_window: + avg = sum(self.history[-self.smooth_window :]) / self.smooth_window + else: + avg = sum(self.history) / len(self.history) + return avg + + @property + def avg_info(self): + if isinstance(self.avg, paddle.Tensor): + self.avg = float(self.avg) + return f"{self.name}: {self.avg:.5f}" + + @property + def total(self): + return f"{self.name}_sum: {self.sum:{self.fmt}}{self.postfix}" + + @property + def total_minute(self): + return f"{self.name} {self.sum / 60:{self.fmt}}{self.postfix} min" + + @property + def mean(self): + return ( + f"{self.name}: {self.avg:{self.fmt}}{self.postfix}" if self.need_avg else "" + ) + + @property + def value(self): + return f"{self.name}: {self.val:{self.fmt}}{self.postfix}" + + +class PrettyOrderedDict(collections.OrderedDict): + """ + The ordered dict which can be prettily printed. + + Examples: + >>> import ppsci + >>> dic = ppsci.utils.misc.PrettyOrderedDict() + >>> dic.update({'a':1, 'b':2, 'c':3}) + >>> print(dic) + ('a', 1)('b', 2)('c', 3) + """ + + def __str__(self): + return "".join([str((k, v)) for k, v in self.items()]) + + +class Prettydefaultdict(collections.defaultdict): + """ + The default dict which can be prettily printed. + + Examples: + >>> import ppsci + >>> dic = ppsci.utils.misc.Prettydefaultdict() + >>> dic.update({'a':1, 'b':2, 'c':3}) + >>> print(dic) + ('a', 1)('b', 2)('c', 3) + """ + + def __str__(self): + return "".join([str((k, v)) for k, v in self.items()]) + + +class RankZeroOnly: + """ + A context manager that ensures the code inside it is only executed by the process + with rank zero. All rank will be synchronized by `dist.barrier` in + distributed environment. + + NOTE: Always used for time consuming code blocks, such as initialization of log + writer, saving result to disk, etc. + + Args: + rank (Optional[int]): The rank of the current process. If not provided, + it will be obtained from `dist.get_rank()`. + + Examples: + >>> import paddle.distributed as dist + >>> with RankZeroOnly(dist.get_rank()) as is_master: + ... if is_master: + ... # code here which should only be executed in the master process + ... pass + """ + + def __init__(self, rank: Optional[int] = None): + """ + Enter the context and check if the current process is the master. + + Args: + rank (Optional[int]): The rank of the current process. If not provided, + it will be obtained from `dist.get_rank()`. + """ + super().__init__() + self.rank = rank if (rank is not None) else dist.get_rank() + self.is_master = self.rank == 0 + + def __enter__(self) -> bool: + """ + Enter the context and check if the current process is the master. + + Returns: + bool: True if the current process is the master (rank zero), + False otherwise. + """ + return self.is_master + + def __exit__(self, exc_type, exc_value, traceback): + if dist.get_world_size() > 1: + dist.barrier() + + +class Timer(ContextDecorator): + """Count time cost for code block within context. + + Args: + name (str, optional): Name of timer discriminate different code block. + Defaults to "Timer". + auto_print (bool, optional): Whether print time cost when exit context. + Defaults to True. + """ + + interval: float # Time cost for code within Timer context + + def __init__(self, name: str = "Timer", auto_print: bool = True): + super().__init__() + self.name = name + self.auto_print = auto_print + + def __enter__(self): + paddle.device.synchronize() + self.start_time = time.perf_counter() + return self + + def __exit__(self, type, value, traceback): + paddle.device.synchronize() + self.end_time = time.perf_counter() + self.interval = self.end_time - self.start_time + if self.auto_print: + logger.message(f"{self.name}.time_cost = {self.interval:.2f} s") + + def start(self, name: str = "Timer"): + """Push a new timer context. + + Args: + name (str, optional): Name of code block to be clocked. Defaults to "Timer". + """ + paddle.device.synchronize() + self.start_time = time.perf_counter() + + def end(self): + """End current timer context and print time cost.""" + paddle.device.synchronize() + self.end_time = time.perf_counter() + self.interval = self.end_time - self.start_time + if self.auto_print: + logger.message(f"{self.name}.time_cost = {self.interval:.2f} s") + + +def format_time_manual(seconds): + seconds = int(seconds) + hours = seconds // 3600 + remainder = seconds % 3600 + minutes = remainder // 60 + seconds = remainder % 60 + return f"{hours:02d}h-{minutes:02d}m-{seconds:02d}s" + + +def convert_to_dict(array: np.ndarray, keys: Tuple[str, ...]) -> Dict[str, np.ndarray]: + """Split given array into single channel array at axis -1 in order of given keys. + + Args: + array (np.ndarray): Array to be split. + keys (Tuple[str, ...]): Keys used in split. + + Returns: + Dict[str, np.ndarray]: Split dict. + + Examples: + >>> import numpy as np + >>> import ppsci + >>> arr = np.array([[1., 2., 3.], [4., 5., 6.]]) + >>> result = ppsci.utils.misc.convert_to_dict(arr, ("x", "y", "z")) + >>> print(arr.shape) + (2, 3) + >>> for k, v in result.items(): + ... print(k, v.shape) + x (2, 1) + y (2, 1) + z (2, 1) + """ + if array.shape[-1] != len(keys): + raise ValueError( + f"dim of array({array.shape[-1]}) must equal to " f"len(keys)({len(keys)})" + ) + + split_array = np.split(array, len(keys), axis=-1) + return {key: split_array[i] for i, key in enumerate(keys)} + + +def all_gather( + tensor: paddle.Tensor, concat: bool = True, axis: int = 0 +) -> Union[paddle.Tensor, List[paddle.Tensor]]: + """Gather tensor from all devices, concatenate them along given axis if specified. + + Args: + tensor (paddle.Tensor): Tensor to be gathered from all GPUs. + concat (bool, optional): Whether to concatenate gathered Tensors. + Defaults to True. + axis (int, optional): Axis which concatenated along. Defaults to 0. + + Returns: + Union[paddle.Tensor, List[paddle.Tensor]]: Gathered Tensors. + + Examples: + >>> import paddle + >>> import ppsci + >>> import paddle.distributed as dist + >>> dist.init_parallel_env() # doctest: +SKIP + >>> if dist.get_rank() == 0: # doctest: +SKIP + ... data = paddle.to_tensor([[1, 2, 3], [4, 5, 6]]) + ... else: + ... data = paddle.to_tensor([[7, 8, 9], [10, 11, 12]]) + >>> result = ppsci.utils.misc.all_gather(data) # doctest: +SKIP + >>> print(result.numpy()) # doctest: +SKIP + [[ 1 2 3] + [ 4 5 6] + [ 7 8 9] + [10 11 12]] + """ + result: List[paddle.Tensor] = [] + + # NOTE: Put tensor to CUDAPlace from CUDAPinnedPlace to use communication. + if tensor.place.is_cuda_pinned_place(): + tensor = tensor.cuda() + + # TODO(HydrogenSulfate): As non-contiguous(strided) tensor is not supported in + # dist.all_gather, manually convert given Tensor to contiguous below. Strided tensor + # will be supported in future. + dist.all_gather(result, tensor.contiguous()) + + if concat: + return paddle.concat(result, axis) + return result + + +def convert_to_array(dict_: Dict[str, np.ndarray], keys: Tuple[str, ...]) -> np.ndarray: + """Concatenate arrays in axis -1 in order of given keys. + + Args: + dict_ (Dict[str, np.ndarray]): Dict contains arrays. + keys (Tuple[str, ...]): Concatenate keys used in concatenation. + + Returns: + np.ndarray: Concatenated array. + + Examples: + >>> import numpy as np + >>> import ppsci + >>> dic = {"x": np.array([[1., 2.], [3., 4.]]), + ... "y": np.array([[5., 6.], [7., 8.]]), + ... "z": np.array([[9., 10.], [11., 12.]])} + >>> result = ppsci.utils.misc.convert_to_array(dic, ("x", "z")) + >>> print(result) + [[ 1. 2. 9. 10.] + [ 3. 4. 11. 12.]] + """ + return np.concatenate([dict_[key] for key in keys], axis=-1) + + +def concat_dict_list( + dict_list: Sequence[Dict[str, np.ndarray]] +) -> Dict[str, np.ndarray]: + """Concatenate arrays in tuple of dicts at axis 0. + + Args: + dict_list (Sequence[Dict[str, np.ndarray]]): Sequence of dicts. + + Returns: + Dict[str, np.ndarray]: A dict with concatenated arrays for each key. + + """ + ret = {} + for key in dict_list[0].keys(): + ret[key] = np.concatenate([_dict[key] for _dict in dict_list], axis=0) + return ret + + +def stack_dict_list( + dict_list: Sequence[Dict[str, np.ndarray]] +) -> Dict[str, np.ndarray]: + """Stack arrays in tuple of dicts at axis 0. + + Args: + dict_list (Sequence[Dict[str, np.ndarray]]): Sequence of dicts. + + Returns: + Dict[str, np.ndarray]: A dict with stacked arrays for each key. + """ + ret = {} + for key in dict_list[0].keys(): + ret[key] = np.stack([_dict[key] for _dict in dict_list], axis=0) + return ret + + +def typename(obj: object) -> str: + """Return type name of given object. + + Args: + obj (object): Python object which is instantiated from a class. + + Returns: + str: Class name of given object. + """ + return obj.__class__.__name__ + + +def combine_array_with_time(x: np.ndarray, t: Tuple[int, ...]) -> np.ndarray: + """Combine given data x with time sequence t. + Given x with shape (N, D) and t with shape (T, ), + this function will repeat t_i for N times and will concat it with data x for each + t_i in t, finally return the stacked result, which is of shape (N×T, D+1). + + Args: + x (np.ndarray): Points data with shape (N, D). + t (Tuple[int, ...]): Time sequence with shape (T, ). + + Returns: + np.ndarray: Combined data with shape of (N×T, D+1). + + Examples: + >>> import numpy as np + >>> import ppsci + >>> data_point = np.arange(10).reshape((2, 5)) + >>> time = (1, 2, 3) + >>> result = ppsci.utils.misc.combine_array_with_time(data_point, time) + >>> print(result) + [[1. 0. 1. 2. 3. 4.] + [1. 5. 6. 7. 8. 9.] + [2. 0. 1. 2. 3. 4.] + [2. 5. 6. 7. 8. 9.] + [3. 0. 1. 2. 3. 4.] + [3. 5. 6. 7. 8. 9.]] + """ + nx = len(x) + tx = [] + for ti in t: + tx.append( + np.hstack( + (np.full([nx, 1], float(ti), dtype=paddle.get_default_dtype()), x) + ) + ) + tx = np.vstack(tx) + return tx + + +def cartesian_product(*arrays: np.ndarray) -> np.ndarray: + """Cartesian product for input sequence of array(s). + + Reference: https://stackoverflow.com/questions/11144513/cartesian-product-of-x-and-y-array-points-into-single-array-of-2d-points + + Assume shapes of input arrays are: $(N_1,), (N_2,), (N_3,), ..., (N_M,)$, + then the cartesian product result will be shape of $(N_1xN_2xN_3x...xN_M, M)$. + + Args: + arrays (np.ndarray): Input arrays. + + Returns: + np.ndarray: Cartesian product result of shape $(N_1xN_2xN_3x...xN_M, M)$. + + Examples: + >>> t = np.array([1, 2]) + >>> x = np.array([10, 20]) + >>> y = np.array([100, 200]) + >>> txy = cartesian_product(t, x, y) + >>> print(txy) + [[ 1 10 100] + [ 1 10 200] + [ 1 20 100] + [ 1 20 200] + [ 2 10 100] + [ 2 10 200] + [ 2 20 100] + [ 2 20 200]] + """ + la = len(arrays) + dtype = np.result_type(*arrays) + arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype) + for i, a in enumerate(np.ix_(*arrays)): + arr[..., i] = a + return arr.reshape(-1, la) + + +def set_random_seed(seed: int): + """Set numpy, random, paddle random_seed to given seed. + + Args: + seed (int): Random seed. + """ + paddle.seed(seed) + np.random.seed(seed) + random.seed(seed) + + +def run_on_eval_mode(func: Callable) -> Callable: + """A decorator automatically running given class method in eval mode and keep + training state unchanged after function finished. + + Args: + func (Callable): Class method which is expected running in eval mode. + + Returns: + Callable: Decorated class method. + """ + + @functools.wraps(func) + def function_with_eval_state(self, *args, **kwargs): + # log original state + train_state = self.model.training + + # switch to eval mode + if train_state: + self.model.eval() + + # run func in eval mode + result = func(self, *args, **kwargs) + + # restore state + if train_state: + self.model.train() + + return result + + return function_with_eval_state + + +def run_at_rank0(func: Callable) -> Callable: + """A decorator that allow given function run only at rank 0 to avoid + multiple logs or other events. Usually effected in distributed environment. + + Args: + func (Callable): Given function. + + Returns: + Callable: Wrapped function which will only run at at rank 0, + skipped at other rank. + + Examples: + >>> import paddle + >>> from ppsci.utils import misc + >>> @misc.run_at_rank0 + ... def func(): + ... print(f"now_rank is {paddle.distributed.get_rank()}") + >>> func() + now_rank is 0 + """ + + @functools.wraps(func) + def wrapped_func(*args, **kwargs): + if dist.get_rank() == 0: + return func(*args, **kwargs) + + return wrapped_func + + +def ragged_range(sizes: paddle.Tensor) -> paddle.Tensor: + """Multiple concatenated ranges. + + Examples + -------- + sizes = [1 4 2 3] + Return: [0 0 1 2 3 0 1 0 1 2] + """ + assert sizes.dim() == 1 + if sizes.sum() == 0: + return paddle.empty(shape=[0], dtype=sizes.dtype) + sizes_nonzero = sizes > 0 + if not paddle.all(x=sizes_nonzero): + sizes = paddle.masked_select(x=sizes, mask=sizes_nonzero) + id_steps = paddle.ones(shape=sizes.sum(), dtype="int64") + id_steps[0] = 0 + insert_index = sizes[:-1].cumsum(axis=0) + insert_val = (1 - sizes)[:-1] + id_steps[insert_index] = insert_val + res = id_steps.cumsum(axis=0) + return res + + +def repeat_blocks( + sizes: paddle.Tensor, + repeats: paddle.Tensor, + continuous_indexing: bool = True, + start_idx: int = 0, + block_inc: int = 0, + repeat_inc: int = 0, +) -> paddle.Tensor: + """Repeat blocks of indices. + Adapted from https://stackoverflow.com/questions/51154989/numpy-vectorized-function-to-repeat-blocks-of-consecutive-elements + + continuous_indexing: Whether to keep increasing the index after each block + start_idx: Starting index + block_inc: Number to increment by after each block, + either global or per block. Shape: len(sizes) - 1 + repeat_inc: Number to increment by after each repetition, + either global or per block + + Examples + -------- + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = False + Return: [0 0 0 0 1 2 0 1 2 0 1 0 1 0 1] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True + Return: [0 0 0 1 2 3 1 2 3 4 5 4 5 4 5] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True ; + repeat_inc = 4 + Return: [0 4 8 1 2 3 5 6 7 4 5 8 9 12 13] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True ; + start_idx = 5 + Return: [5 5 5 6 7 8 6 7 8 9 10 9 10 9 10] + sizes = [1,3,2] ; repeats = [3,2,3] ; continuous_indexing = True ; + block_inc = 1 + Return: [0 0 0 2 3 4 2 3 4 6 7 6 7 6 7] + sizes = [0,3,2] ; repeats = [3,2,3] ; continuous_indexing = True + Return: [0 1 2 0 1 2 3 4 3 4 3 4] + sizes = [2,3,2] ; repeats = [2,0,2] ; continuous_indexing = True + Return: [0 1 0 1 5 6 5 6] + """ + assert sizes.dim() == 1 + assert all(sizes >= 0) + sizes_nonzero = sizes > 0 + if not paddle.all(x=sizes_nonzero): + assert block_inc == 0 + sizes = paddle.masked_select(x=sizes, mask=sizes_nonzero) + if isinstance(repeats, paddle.Tensor): + repeats = paddle.masked_select(x=repeats, mask=sizes_nonzero) + if isinstance(repeat_inc, paddle.Tensor): + repeat_inc = paddle.masked_select(x=repeat_inc, mask=sizes_nonzero) + if isinstance(repeats, paddle.Tensor): + assert all(repeats >= 0) + insert_dummy = repeats[0] == 0 + if insert_dummy: + one = paddle.ones(shape=[1], dtype=sizes.dtype) + zero = paddle.zeros(shape=[1], dtype=sizes.dtype) + sizes = paddle.concat(x=(one, sizes)) + repeats = paddle.concat(x=(one, repeats)) + if isinstance(block_inc, paddle.Tensor): + block_inc = paddle.concat(x=(zero, block_inc)) + if isinstance(repeat_inc, paddle.Tensor): + repeat_inc = paddle.concat(x=(zero, repeat_inc)) + else: + assert repeats >= 0 + insert_dummy = False + r1 = paddle.repeat_interleave(x=paddle.arange(end=len(sizes)), repeats=repeats) + N = (sizes * repeats).sum() + id_ar = paddle.ones(shape=N, dtype="int64") + id_ar[0] = 0 + insert_index = sizes[r1[:-1]].cumsum(axis=0) + insert_val = (1 - sizes)[r1[:-1]] + if isinstance(repeats, paddle.Tensor) and paddle.any(x=repeats == 0): + diffs = r1[1:] - r1[:-1] + indptr = paddle.concat( + x=(paddle.zeros(shape=[1], dtype=sizes.dtype), diffs.cumsum(axis=0)) + ) + if continuous_indexing: + # insert_val += segment_csr(sizes[: r1[-1]], indptr, reduce="sum") + raise NotImplementedError() + if isinstance(block_inc, paddle.Tensor): + # insert_val += segment_csr(block_inc[: r1[-1]], indptr, reduce="sum") + raise NotImplementedError() + else: + insert_val += block_inc * (indptr[1:] - indptr[:-1]) + if insert_dummy: + insert_val[0] -= block_inc + else: + idx = r1[1:] != r1[:-1] + if continuous_indexing: + insert_val[idx] = 1 + idx = paddle.where(condition=idx)[0].flatten() + insert_val[idx] += block_inc + if isinstance(repeat_inc, paddle.Tensor): + insert_val += repeat_inc[r1[:-1]] + if isinstance(repeats, paddle.Tensor): + repeat_inc_inner = repeat_inc[repeats > 0][:-1] + else: + repeat_inc_inner = repeat_inc[:-1] + else: + insert_val += repeat_inc + repeat_inc_inner = repeat_inc + if isinstance(repeats, paddle.Tensor): + repeats_inner = repeats[repeats > 0][:-1] + else: + repeats_inner = repeats + idx = r1[1:] != r1[:-1] + idx = paddle.where(condition=idx)[0].flatten() + insert_val[idx] -= repeat_inc_inner * repeats_inner + id_ar[insert_index] = insert_val + if insert_dummy: + id_ar = id_ar[1:] + if continuous_indexing: + id_ar[0] -= 1 + id_ar[0] += start_idx + res = id_ar.cumsum(axis=0) + return res + + +def aggregate_per_sample( + data_per_row: paddle.Tensor, + batch_idx: (paddle.Tensor | None), + reduce: Literal["sum", "mean"], + batch_size: int, +): + """ + Aggregate (potentially) batched input tensor to get a scalar for each sample in the + batch. + E.g., (num_atoms, d1, d2, ..., dn) -> (batch_size, d1, d2, ..., dn) -> (batch_size,) + where the first aggregation only happens when batch_idx is provided. + + Args: + data_per_row: shape (num_nodes, any_more_dims). May contain multiple nodes per + sample. + batch_idx: shape (num_nodes,). Indicates which sample each row belongs to. If + not provided, then we assume the first dimension is the batch dimension. + reduce: determines how to aggregate over nodes within each sample. (Aggregation + over samples and within dims for one node is always mean.) + batch_size: number of samples in the batch. + + Returns: + Scalar for each sample, shape (batch_size,). + + """ + data_per_row = paddle.mean( + x=data_per_row.reshape([tuple(data_per_row.shape)[0], -1]), axis=1 + ) + if batch_idx is None: + data_per_sample = data_per_row + else: + data_per_sample = scatter( + src=data_per_row, index=batch_idx, dim_size=batch_size, reduce=reduce + ) + return data_per_sample + + +def expand(a, x_shape, left=False): + a_dim = len(tuple(a.shape)) + if left: + return a.reshape(*((1,) * (len(x_shape) - a_dim) + tuple(a.shape))) + else: + return a.reshape([*(tuple(a.shape) + (1,) * (len(x_shape) - a_dim))]) + + +def _broadcast_like(x, like): + """ + add broadcast dimensions to x so that it can be broadcast over ``like`` + """ + if like is None: + return x + return x[(...,) + (None,) * (like.ndim - x.ndim)] + + +def maybe_expand( + x: paddle.Tensor, batch: Optional[paddle.Tensor], like: paddle.Tensor = None +) -> paddle.Tensor: + """ + + Args: + x: shape (batch_size, ...) + batch: shape (num_thingies,) with integer entries in the range [0, batch_size), + indicating which sample each thingy belongs to + like: shape x.shape + potential additional dimensions + Returns: + expanded x with shape (num_thingies,), or if given like.shape, containing value + of x for each thingy. + If `batch` is None, just returns `x` unmodified, to avoid pointless work if you + have exactly one thingy per sample. + """ + x = _broadcast_like(x, like) + if batch is None: + return x + else: + return x[batch] + + +def make_noise_symmetric_preserve_variance(noise: paddle.Tensor) -> paddle.Tensor: + """Makes the noise matrix symmetric, preserving the variance. Assumes i.i.d. noise + for each dimension. + + Args: + noise (paddle.Tensor): Input noise matrix, must be a batched square matrix, + i.e., have shape (batch_size, dim, dim). + + Returns: + paddle.Tensor: The symmetric noise matrix, with the same variance as the input. + """ + assert ( + len(tuple(noise.shape)) == 3 and tuple(noise.shape)[1] == tuple(noise.shape)[2] + ), "Symmetric noise only works for square-matrix-shaped data." + return ( + 1 + / 2**0.5 + * (1 - paddle.eye(num_rows=3)[None]) + * (noise + noise.transpose(perm=dim2perm(noise.ndim, 1, 2))) + + paddle.eye(num_rows=3)[None] * noise + ) + + +def is_equal(dict1, dict2): + """Recursively compares two potentially nested structures for deep equality + + This function performs a thorough comparison of dictionaries, lists, tuples, + and other basic data types, handling nested structures at any depth. It supports: + + - Dictionary comparison (order-insensitive for keys) + - List/tuple comparison (order-sensitive) + - Type-sensitive comparisons (e.g., int vs float, list vs tuple) + - Mixed structure comparisons (dicts containing lists containing dicts, etc.) + + Args: + dict1 (dict/list/tuple/any): First structure to compare + dict2 (dict/list/tuple/any): Second structure to compare + + Returns: + bool: True if structures are deeply equal, False otherwise + + Notes: + - For dictionaries: Key order doesn't matter, but key-value pairs must match + - For sequences: Element order matters (lists/tuples are order-sensitive) + - Basic types (int, str, etc.) are compared using normal equality + - Different container types are considered unequal (e.g., list vs tuple) + - Recursive structures (circular references) will cause infinite recursion + """ + + # type check + if type(dict1) != type(dict2): + return False + + # compare dicts + if isinstance(dict1, dict): + if len(dict1) != len(dict2): + return False + for key in dict1: + if key not in dict2: + return False + if not is_equal(dict1[key], dict2[key]): + return False + return True + + # compare lists/tuples + elif isinstance(dict1, (list, tuple)): + if len(dict1) != len(dict2): + return False + for i in range(len(dict1)): + if not is_equal(dict1[i], dict2[i]): + return False + return True + + # compare basic types + else: + return dict1 == dict2 diff --git a/ppmat/utils/paddle_aux.py b/ppmat/utils/paddle_aux.py new file mode 100644 index 00000000..e2132bb5 --- /dev/null +++ b/ppmat/utils/paddle_aux.py @@ -0,0 +1,195 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is generated by PaConvert ToolKit, please Don't edit it! + +# Provide low-level tensor operations and framework extensions for PaddlePaddle. +import paddle + + +def min_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.minimum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.minimum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.min(self, *args, **kwargs), paddle.argmin( + self, *args, **kwargs + ) + else: + ret = paddle.min(self, *args, **kwargs) + + return ret + + +def max_class_func(self, *args, **kwargs): + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(self, *args, **kwargs) + elif len(args) == 1 and isinstance(args[0], paddle.Tensor): + ret = paddle.maximum(self, *args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 1: + ret = paddle.max(self, *args, **kwargs), paddle.argmax( + self, *args, **kwargs + ) + else: + ret = paddle.max(self, *args, **kwargs) + + return ret + + +setattr(paddle.Tensor, "min", min_class_func) +setattr(paddle.Tensor, "max", max_class_func) + + +def reshape(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) + else: + return paddle.reshape(self, list(args)) + elif kwargs: + assert "shape" in kwargs + return paddle.reshape(self, shape=kwargs["shape"]) + + +setattr(paddle.Tensor, "reshape", reshape) + + +def min(*args, **kwargs): + if "input" in kwargs: + kwargs["x"] = kwargs.pop("input") + + out_v = None + if "out" in kwargs: + out_v = kwargs.pop("out") + + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.minimum(*args, **kwargs) + elif len(args) == 2 and isinstance(args[1], paddle.Tensor): + ret = paddle.minimum(*args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 2: + if out_v: + ret = paddle.min(*args, **kwargs), paddle.argmin(*args, **kwargs) + paddle.assign(ret[0], out_v[0]) + paddle.assign(ret[1], out_v[1]) + return out_v + else: + ret = paddle.min(*args, **kwargs), paddle.argmin(*args, **kwargs) + return ret + else: + ret = paddle.min(*args, **kwargs) + return ret + + if out_v: + paddle.assign(ret, out_v) + return out_v + else: + return ret + + +def max(*args, **kwargs): + if "input" in kwargs: + kwargs["x"] = kwargs.pop("input") + + out_v = None + if "out" in kwargs: + out_v = kwargs.pop("out") + + if "other" in kwargs: + kwargs["y"] = kwargs.pop("other") + ret = paddle.maximum(*args, **kwargs) + elif len(args) == 2 and isinstance(args[1], paddle.Tensor): + ret = paddle.maximum(*args, **kwargs) + else: + if "dim" in kwargs: + kwargs["axis"] = kwargs.pop("dim") + + if "axis" in kwargs or len(args) >= 2: + if out_v: + ret = paddle.max(*args, **kwargs), paddle.argmax(*args, **kwargs) + paddle.assign(ret[0], out_v[0]) + paddle.assign(ret[1], out_v[1]) + return out_v + else: + ret = paddle.max(*args, **kwargs), paddle.argmax(*args, **kwargs) + return ret + return out_v + else: + ret = paddle.max(*args, **kwargs) + return ret + + if out_v: + paddle.assign(ret, out_v) + return out_v + else: + return ret + + +def view(self, *args, **kwargs): + if args: + if len(args) == 1: + if isinstance(args[0], (tuple, list)): + return paddle.reshape(self, args[0]) # To change reshape => view + elif isinstance(args[0], str): + return paddle.view(self, args[0]) + else: + return paddle.reshape(self, list(args)) # To change reshape => view + else: + return paddle.reshape(self, list(args)) # To change reshape => view + elif kwargs: + key = [k for k in kwargs.keys()] + if "dtype" in kwargs: + return paddle.view(self, shape_or_dtype=kwargs[key[0]]) + else: + return paddle.reshape( + self, shape=kwargs[key[0]] + ) # To change reshape => view + + +setattr(paddle.Tensor, "view", view) + + +def repeat(self, *args, **kwargs): + if args: + if len(args) == 1 and isinstance(args[0], (tuple, list)): + return paddle.tile(self, args[0]) + else: + return paddle.tile(self, list(args)) + elif kwargs: + assert "repeats" in kwargs + return paddle.tile(self, repeat_times=kwargs["repeats"]) + + +setattr(paddle.Tensor, "repeat", repeat) + + +def dim2perm(ndim, dim0, dim1): + perm = list(range(ndim)) + perm[dim0], perm[dim1] = perm[dim1], perm[dim0] + return perm diff --git a/ppmat/utils/paddle_utils.py b/ppmat/utils/paddle_utils.py new file mode 100644 index 00000000..13c574b0 --- /dev/null +++ b/ppmat/utils/paddle_utils.py @@ -0,0 +1,384 @@ +# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# Offer higher-level utilities for model trainig and management. +""" +Paddle utilities: Utilities related to Paddle +""" +import contextlib +import importlib.util +import sys +import threading +import time +from contextlib import contextmanager +from typing import List +from typing import Optional +from typing import Tuple +from typing import Union + +import paddle +from paddle.fft import fftn +from paddle.fft import fftshift +from paddle.fft import ifftn +from paddle.fft import ifftshift + +if sys.version_info < (3, 8): # noqa + import importlib_metadata # noqa +else: # noqa + import importlib.metadata as importlib_metadata # noqa + +# dummpy decorator, we do not use it +def maybe_allow_in_graph(cls): + return cls + + +def is_paddle_available(): + _paddle_available = importlib.util.find_spec("paddle") is not None + if _paddle_available: + try: + import paddle # noqa + + _paddle_version = paddle.__version__ + except importlib_metadata.PackageNotFoundError: + _paddle_available = False + + +class RNGStatesTracker: + def __init__(self): + self.states_ = {} + self.mutex = threading.Lock() + + def reset(self): + with self.mutex: + self.states_ = {} + + def remove(self, generator_name=None): + with self.mutex: + if generator_name is not None: + del self.states_[generator_name] + + def manual_seed(self, seed, generator_name=None): + with self.mutex: + if generator_name is None: + generator_name = str(time.time()) + if generator_name in self.states_: + raise ValueError("state {} already exists".format(generator_name)) + orig_rng_state = paddle.get_cuda_rng_state() + paddle.seed(seed) + self.states_[generator_name] = paddle.get_cuda_rng_state() + paddle.set_cuda_rng_state(orig_rng_state) + return generator_name + + @contextlib.contextmanager + def rng_state(self, generator_name=None): + if generator_name is not None: + if generator_name not in self.states_: + raise ValueError("state {} does not exist".format(generator_name)) + with self.mutex: + orig_cuda_rng_state = paddle.get_cuda_rng_state() + paddle.set_cuda_rng_state(self.states_[generator_name]) + try: + yield + finally: + self.states_[generator_name] = paddle.get_cuda_rng_state() + paddle.set_cuda_rng_state(orig_cuda_rng_state) + else: + yield + + +RNG_STATE_TRACKER = RNGStatesTracker() + + +def get_rng_state_tracker(*args, **kwargs): + return RNG_STATE_TRACKER + + +paddle.Generator = get_rng_state_tracker + +randn = paddle.randn +rand = paddle.rand +randint = paddle.randint + + +@paddle.jit.not_to_static +def randn_pt(shape, dtype=None, name=None, **kwargs): + generator = kwargs.get("generator", None) + is_bfloat16 = "bfloat16" in str(dtype) or "bfloat16" in paddle.get_default_dtype() + if is_bfloat16: + if generator is None: + return randn(shape, dtype=paddle.bfloat16, name=name) + else: + with get_rng_state_tracker().rng_state(generator): + return randn(shape, dtype=paddle.bfloat16, name=name) + else: + if generator is None: + return randn(shape, dtype=dtype, name=name) + else: + with get_rng_state_tracker().rng_state(generator): + return randn(shape, dtype=dtype, name=name) + + +@paddle.jit.not_to_static +def rand_pt(shape, dtype=None, name=None, **kwargs): + generator = kwargs.get("generator", None) + if generator is None: + return rand(shape, dtype=dtype, name=name) + else: + with get_rng_state_tracker().rng_state(generator): + return rand(shape, dtype=dtype, name=name) + + +@paddle.jit.not_to_static +def randint_pt(low=0, high=None, shape=[1], dtype=None, name=None, **kwargs): + generator = kwargs.get("generator", None) + if generator is None: + return randint(low=low, high=high, shape=shape, dtype=dtype, name=name) + else: + with get_rng_state_tracker().rng_state(generator): + return randint(low=low, high=high, shape=shape, dtype=dtype, name=name) + + +@paddle.jit.not_to_static +def randn_like_pt(x, dtype=None, name=None, **kwargs): + generator = kwargs.get("generator", None) + if dtype is None: + dtype = x.dtype + return randn_pt(x.shape, dtype=dtype, generator=generator, name=name, **kwargs) + + +paddle.randn = randn_pt +paddle.rand = rand_pt +paddle.randint = randint_pt +paddle.randn_like = randn_like_pt + + +def randn_tensor( + shape: Union[Tuple, List], + generator: Optional[Union[List["paddle.Generator"], "paddle.Generator"]] = None, + dtype: Optional["paddle.dtype"] = None, + *kwargs, +): + """A helper function to create random tensors with the desired `dtype`. When + passing a list of generators, you can seed each batch size individually. If CPU + generators are passed, the tensor + is always created on the CPU. + """ + # make sure generator list of length 1 is treated like a non-list + if isinstance(generator, list) and len(generator) == 1: + generator = generator[0] + + if isinstance(generator, (list, tuple)): + batch_size = shape[0] + shape = (1,) + tuple(shape[1:]) + latents = [ + randn_pt(shape, generator=generator[i], dtype=dtype) + for i in range(batch_size) + ] + latents = paddle.concat(latents, axis=0) + else: + latents = randn_pt(shape, generator=generator, dtype=dtype) + + return latents + + +def rand_tensor( + shape: Union[Tuple, List], + generator: Optional[Union[List["paddle.Generator"], "paddle.Generator"]] = None, + dtype: Optional["paddle.dtype"] = None, + *kwargs, +): + """A helper function to create random tensors with the desired `dtype`. When + passing a list of generators, you can seed each batch size individually. If CPU + generators are passed, the tensor is always created on the CPU. + """ + # make sure generator list of length 1 is treated like a non-list + if isinstance(generator, list) and len(generator) == 1: + generator = generator[0] + + if isinstance(generator, (list, tuple)): + batch_size = shape[0] + shape = [ + 1, + ] + shape[1:] + latents = [ + rand_pt(shape, generator=generator[i], dtype=dtype) + for i in range(batch_size) + ] + latents = paddle.concat(latents, axis=0) + else: + latents = rand_pt(shape, generator=generator, dtype=dtype) + + return latents + + +def randint_tensor( + low=0, + high=None, + shape: Union[Tuple, List] = [1], + generator: Optional["paddle.Generator"] = None, + dtype: Optional["paddle.dtype"] = None, + *kwargs, +): + """This is a helper function that allows to create random tensors on the desired + `device` with the desired `dtype`. When passing a list of generators one can seed + each batched size individually. If CPU generators are passed the tensor + will always be created on CPU. + """ + latents = randint_pt( + low=low, high=high, shape=shape, dtype=dtype, generator=generator + ) + + return latents + + +if not hasattr(paddle, "dtype_guard"): + + @contextmanager + def dtype_guard(dtype="float32"): + origin_dtype = paddle.get_default_dtype() + paddle.set_default_dtype(dtype) + try: + yield + finally: + paddle.set_default_dtype(origin_dtype) + + paddle.dtype_guard = dtype_guard + +if not hasattr(paddle, "device_guard"): + + @contextmanager + def device_guard(device="cpu", dev_id=0): + device = device.replace("cuda", "gpu") + if ":" in device: + device, dev_id = device.split(":") + origin_device = paddle.device.get_device() + if device == "cpu": + paddle.set_device(device) + elif device in ["gpu", "xpu", "npu"]: + paddle.set_device("{}:{}".format(device, dev_id)) + try: + yield + finally: + paddle.set_device(origin_device) + + paddle.device_guard = device_guard + +_init_weights = True + + +@contextmanager +def no_init_weights(_enable=True): + """ + Context manager to globally disable weight initialization to speed up loading large + models. + + TODO(Patrick): Delete safety argument `_enable=True` at next major version. . + """ + global _init_weights + old_init_weights = _init_weights + if _enable: + _init_weights = False + try: + yield + finally: + _init_weights = old_init_weights + + +def is_compiled_module(module) -> bool: + """Check whether the module was compiled with torch.compile()""" + return False + + +def fourier_filter(x_in: paddle.Tensor, threshold: int, scale: int) -> paddle.Tensor: + """Fourier filter as introduced in FreeU (https://arxiv.org/abs/2309.11497). + + This version of the method comes from here: + https://github.com/huggingface/diffusers/pull/5164#issuecomment-1732638706 + """ + x = x_in + B, C, H, W = x.shape + + # Non-power of 2 images must be float32 + if (W & (W - 1)) != 0 or (H & (H - 1)) != 0: + x = x.cast(dtype=paddle.float32) + + # FFT + x_freq = fftn(x, axes=(-2, -1)) + x_freq = fftshift(x_freq, axes=(-2, -1)) + + B, C, H, W = x_freq.shape + mask = paddle.ones((B, C, H, W)) + + crow, ccol = H // 2, W // 2 + mask[ + ..., crow - threshold : crow + threshold, ccol - threshold : ccol + threshold + ] = scale + x_freq = x_freq * mask + + # IFFT + x_freq = ifftshift(x_freq, axes=(-2, -1)) + x_filtered = ifftn(x_freq, axes=(-2, -1)).real + + return x_filtered.cast(dtype=x_in.dtype) + + +def apply_freeu( + resolution_idx: int, + hidden_states: paddle.Tensor, + res_hidden_states: paddle.Tensor, + **freeu_kwargs, +) -> Tuple[paddle.Tensor, paddle.Tensor]: + """Applies the FreeU mechanism as introduced in https: + //arxiv.org/abs/2309.11497. Adapted from the official code repository: https://github.com/ChenyangSi/FreeU. + + Args: + resolution_idx (`int`): Integer denoting the UNet block where FreeU is being + applied. + hidden_states (`paddle.Tensor`): Inputs to the underlying block. + res_hidden_states (`paddle.Tensor`): Features from the skip block corresponding + to the underlying block. + s1 (`float`): Scaling factor for stage 1 to attenuate the contributions of the + skip features. + s2 (`float`): Scaling factor for stage 2 to attenuate the contributions of the + skip features. + b1 (`float`): Scaling factor for stage 1 to amplify the contributions of + backbone features. + b2 (`float`): Scaling factor for stage 2 to amplify the contributions of + backbone features. + """ + if resolution_idx == 0: + num_half_channels = hidden_states.shape[1] // 2 + hidden_states[:, :num_half_channels] = ( + hidden_states[:, :num_half_channels] * freeu_kwargs["b1"] + ) + res_hidden_states = fourier_filter( + res_hidden_states, threshold=1, scale=freeu_kwargs["s1"] + ) + if resolution_idx == 1: + num_half_channels = hidden_states.shape[1] // 2 + hidden_states[:, :num_half_channels] = ( + hidden_states[:, :num_half_channels] * freeu_kwargs["b2"] + ) + res_hidden_states = fourier_filter( + res_hidden_states, threshold=1, scale=freeu_kwargs["s2"] + ) + + return hidden_states, res_hidden_states + + +def dim2perm(ndim, dim0, dim1): + perm = list(range(ndim)) + perm[dim0], perm[dim1] = perm[dim1], perm[dim0] + return perm diff --git a/ppmat/utils/save_load.py b/ppmat/utils/save_load.py new file mode 100644 index 00000000..8116d67f --- /dev/null +++ b/ppmat/utils/save_load.py @@ -0,0 +1,271 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +import re +from typing import TYPE_CHECKING +from typing import Any +from typing import Dict +from typing import Optional + +import paddle + +from ppmat.utils import download +from ppmat.utils import logger + +if TYPE_CHECKING: + from paddle import amp + from paddle import nn + from paddle import optimizer + + from ppmat.utils import ema + + +__all__ = [ + "load_checkpoint", + "save_checkpoint", + "load_pretrain", +] + + +def _load_pretrain_from_path(path: str, model: nn.Layer): + """Load pretrained model from given path. + + Args: + path (str): File path of pretrained model, i.e. `/path/to/model.pdparams`. + model (nn.Layer): Model with parameters. + """ + if not (os.path.isdir(path) or os.path.exists(f"{path}.pdparams")): + raise FileNotFoundError( + f"Pretrained model path {path}.pdparams does not exists." + ) + param_state_dict = paddle.load(f"{path}.pdparams") + if "state_dict" in param_state_dict: + param_state_dict = param_state_dict["state_dict"] + + missing_keys_unexpected_keys = model.set_state_dict(param_state_dict) + if ( + missing_keys_unexpected_keys is not None + and len(missing_keys_unexpected_keys) == 2 + ): + missing_keys, unexpected_keys = missing_keys_unexpected_keys + if missing_keys: + logger.warning( + f"There are missing keys when loading checkpoint: {missing_keys}, " + "and corresponding parameters will be initialized by default." + ) + if unexpected_keys: + logger.warning( + f"There are redundant keys: {unexpected_keys}, " + "and corresponding weights will be ignored." + ) + + logger.message(f"Finish loading pretrained model from: {path}.pdparams") + + +def load_pretrain(model: nn.Layer, path: str, weights_name: Optional[str] = None): + """ + Load pretrained model from given path or URL. + + Args: + model (nn.Layer): Neural network model to load weights into. + path (str): Path specification which can be: + 1. Local directory containing model files (e.g., '/path/to/model') + 2. Local weight file (e.g., '/path/to/model.pdparams') + 3. Remote compressed archive (e.g., 'https://xxx.com/model.zip') + + Supported formats: + - Directory should contain '*.pdparams' files + - Archive should contain '*.pdparams' file + + weights_name (Optional[str]): Explicit weight filename when: + - Loading from directory (defaults to 'model.pdparams') + - Archive contains multiple parameter files + Defaults to None. + """ + if path.startswith("http"): + # download from path(url) and get its' physical path + path = download.get_weights_path_from_url(path) + + if os.path.isdir(path): + flag = False + + if weights_name is not None: + for root, _, files in os.walk(path): + for name in files: + if os.path.basename(name) == weights_name: + path = os.path.join(root, name) + flag = True + break + if not flag: + raise ValueError(f"No such file named {weights_name} in dir {path}") + else: + logger.info( + "No weights_name specified. Searching for .pdparams files in the " + "following priority order:\n" + "\t1. best.pdparams (highest priority)\n" + "\t2. latest.pdparams\n" + "\t3. epoch_XXX.pdparams (sorted numerically in descending order, " + "e.g., epoch_10 > epoch_5)\n" + "\t4. Other .pdparams files (e.g., custom_name.pdparams)" + ) + epoch_pattern = re.compile(r"^epoch_(\d+)\.pdparams$") + best, latest, epochs, others = None, None, [], [] + for root, _, files in os.walk(path): + for name in files: + if name == "best.pdparams": + best = os.path.join(root, name) + elif name == "latest.pdparams": + latest = os.path.join(root, name) + elif name.endswith(".pdparams"): + match = epoch_pattern.match(name) + if match: + epochs.append( + (int(match.group(1)), os.path.join(root, name)) + ) + else: + others.append(os.path.join(root, name)) + if best is not None: + path = best + elif latest is not None: + path = latest + elif len(epochs) > 0: + epochs.sort(key=lambda x: -x[0]) + path = epochs[0][1] + elif len(others) > 0: + path = others[0] + else: + raise ValueError(f"No valid weight file found in dir {path}") + + # remove ".pdparams" in suffix of path for convenient + if path.endswith(".pdparams"): + path = os.path.splitext(path)[0] + _load_pretrain_from_path(path, model) + + +def load_checkpoint( + path: str, + model: nn.Layer, + optimizer: optimizer.Optimizer, + grad_scaler: Optional[amp.GradScaler] = None, +) -> Dict[str, Any]: + """Load from checkpoint. + + Args: + path (str): Path for checkpoint. + model (nn.Layer): Model with parameters. + optimizer (optimizer.Optimizer): Optimizer for model. + grad_scaler (Optional[amp.GradScaler]): GradScaler for AMP. Defaults to None. + ema_model: Optional[ema.AveragedModel]: Average model. Defaults to None. + + Returns: + Dict[str, Any]: Loaded metric information. + """ + if not os.path.exists(f"{path}.pdparams"): + raise FileNotFoundError(f"{path}.pdparams not exist.") + if not os.path.exists(f"{path}.pdopt"): + raise FileNotFoundError(f"{path}.pdopt not exist.") + if grad_scaler is not None and not os.path.exists(f"{path}.pdscaler"): + raise FileNotFoundError(f"{path}.scaler not exist.") + + # load state dict + param_dict = paddle.load(f"{path}.pdparams") + optim_dict = paddle.load(f"{path}.pdopt") + metric_dict = paddle.load(f"{path}.pdstates") + if grad_scaler is not None: + scaler_dict = paddle.load(f"{path}.pdscaler") + + # set state dict + missing_keys_unexpected_keys = model.set_state_dict(param_dict) + if ( + missing_keys_unexpected_keys is not None + and len(missing_keys_unexpected_keys) == 2 + ): + missing_keys, unexpected_keys = missing_keys_unexpected_keys + if missing_keys: + logger.warning( + f"There are missing keys when loading checkpoint: {missing_keys}, " + "and corresponding parameters will be initialized by default." + ) + if unexpected_keys: + logger.warning( + f"There are redundant keys: {unexpected_keys}, " + "and corresponding weights will be ignored." + ) + + optimizer.set_state_dict(optim_dict) + if grad_scaler is not None: + grad_scaler.load_state_dict(scaler_dict) + + logger.message(f"Finish loading checkpoint from {path}") + return metric_dict + + +def save_checkpoint( + model: nn.Layer, + optimizer: Optional[optimizer.Optimizer], + metric: Dict[str, float], + grad_scaler: Optional[amp.GradScaler] = None, + output_dir: Optional[str] = None, + prefix: str = "model", + print_log: bool = True, + ema_model: Optional[ema.AveragedModel] = None, +): + """ + Save checkpoint, including model params, optimizer params, metric information. + + Args: + model (nn.Layer): Model with parameters. + optimizer (Optional[optimizer.Optimizer]): Optimizer for model. + metric (Dict[str, float]): Metric information, such as + {"RMSE": 0.1, "MAE": 0.2}. + grad_scaler (Optional[amp.GradScaler]): GradScaler for AMP. Defaults to None. + output_dir (Optional[str]): Directory for checkpoint storage. + prefix (str, optional): Prefix for storage. Defaults to "model". + print_log (bool, optional): Whether print saving log information, mainly for + keeping log tidy without duplicate 'Finish saving checkpoint ...' + log strings. Defaults to True. + ema_model: Optional[ema.AveragedModel]: Average model. Defaults to None. + """ + if paddle.distributed.get_rank() != 0: + return + + if output_dir is None: + logger.warning("output_dir is None, skip save_checkpoint") + return + + ckpt_dir = os.path.join(output_dir, "checkpoints") + ckpt_path = os.path.join(ckpt_dir, prefix) + os.makedirs(ckpt_dir, exist_ok=True) + + paddle.save(model.state_dict(), f"{ckpt_path}.pdparams") + if optimizer: + paddle.save(optimizer.state_dict(), f"{ckpt_path}.pdopt") + paddle.save(metric, f"{ckpt_path}.pdstates") + if grad_scaler is not None: + paddle.save(grad_scaler.state_dict(), f"{ckpt_path}.pdscaler") + + if ema_model: + paddle.save(ema_model.state_dict(), f"{ckpt_path}_ema.pdparams") + + if print_log: + log_str = f"Finish saving checkpoint to: {ckpt_path}" + if prefix == "latest": + log_str += ( + "(latest checkpoint will be saved every epoch as expected, " + "but this log will be printed only once for tidy logging)" + ) + logger.message(log_str) diff --git a/ppmat/utils/scatter.py b/ppmat/utils/scatter.py new file mode 100644 index 00000000..b5de6495 --- /dev/null +++ b/ppmat/utils/scatter.py @@ -0,0 +1,119 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This code is adapted from https://github.com/rusty1s/pytorch_scatter/blob/master/torch_scatter/scatter.py + +from typing import Optional + +import paddle + + +def _broadcast(src: paddle.Tensor, other: paddle.Tensor, dim: int): + if dim < 0: + dim = other.dim() + dim + if src.dim() == 1: + for _ in range(0, dim): + src = src.unsqueeze(0) + for _ in range(src.dim(), other.dim()): + src = src.unsqueeze(-1) + src = src.expand(other.shape) + return src + + +def _scatter_sum( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +) -> paddle.Tensor: + index = _broadcast(index, src, dim) + if out is None: + size = list(src.shape) + if dim_size is not None: + size[dim] = dim_size + elif index.numel() == 0: + size[dim] = 0 + else: + size[dim] = int(index.max()) + 1 + out = paddle.zeros(size, dtype=src.dtype) + return paddle.put_along_axis( + arr=out, indices=index, values=src, axis=dim, reduce="add" + ) + + +def _scatter_mean( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +) -> paddle.Tensor: + out = _scatter_sum(src, index, dim, out, dim_size) + dim_size = out.shape[dim] + + index_dim = dim + if index_dim < 0: + index_dim = index_dim + src.dim() + if index.dim() <= index_dim: + index_dim = index.dim() - 1 + + ones = paddle.ones(index.shape, dtype=src.dtype) + count = _scatter_sum(ones, index, index_dim, None, dim_size) + count[count < 1] = 1 + count = _broadcast(count, out, dim) + if out.is_floating_point(): + out = paddle.divide(out, count) + else: + out = paddle.floor_divide(out, count) + return out + + +def scatter( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, + reduce: str = "sum", +) -> paddle.Tensor: + """ + Implement paddle version API like torch_scatter.scatter + """ + if reduce == "sum" or reduce == "add": + return _scatter_sum(src, index, dim, out, dim_size) + elif reduce == "mean": + return _scatter_mean(src, index, dim, out, dim_size) + else: + raise ValueError("Only support add or mean") + + +def scatter_mean( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +): + return _scatter_mean(src, index, dim, out, dim_size) + + +def scatter_sum( + src: paddle.Tensor, + index: paddle.Tensor, + dim: int = -1, + out: Optional[paddle.Tensor] = None, + dim_size: Optional[int] = None, +): + return _scatter_sum(src, index, dim, out, dim_size) diff --git a/ppmat/utils/visualization.py b/ppmat/utils/visualization.py new file mode 100644 index 00000000..45799438 --- /dev/null +++ b/ppmat/utils/visualization.py @@ -0,0 +1,239 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +import imageio +import matplotlib.pyplot as plt +import networkx as nx +import numpy as np +import rdkit +from rdkit import Chem +from rdkit import RDLogger +from rdkit.Chem import AllChem +from rdkit.Chem import Draw +from rdkit.Geometry import Point3D + +from ppmat.utils import logger + + +class MolecularVisualization: + def __init__(self, dataset_infos, output_dir): + self.dataset_infos = dataset_infos + self.result_path = os.path.join(output_dir, "graph/") + + def mol_from_graphs(self, node_list, adjacency_matrix): + """ + Convert graphs to rdkit molecules + node_list: the nodes of a batch of nodes (bs x n) + adjacency_matrix: the adjacency_matrix of the molecule (bs x n x n) + """ + atom_decoder = self.dataset_infos.atom_decoder + mol = Chem.RWMol() + node_to_idx = {} + for i in range(len(node_list)): + if node_list[i] == -1: + continue + a = Chem.Atom(atom_decoder[int(node_list[i])]) + molIdx = mol.AddAtom(a) + node_to_idx[i] = molIdx + for ix, row in enumerate(adjacency_matrix): + for iy, bond in enumerate(row): + if iy <= ix: + continue + if bond == 1: + bond_type = Chem.rdchem.BondType.SINGLE + elif bond == 2: + bond_type = Chem.rdchem.BondType.DOUBLE + elif bond == 3: + bond_type = Chem.rdchem.BondType.TRIPLE + elif bond == 4: + bond_type = Chem.rdchem.BondType.AROMATIC + else: + continue + mol.AddBond(node_to_idx[ix], node_to_idx[iy], bond_type) + try: + mol = mol.GetMol() + except rdkit.Chem.KekulizeException: + logger.info("Can't kekulize molecule") + mol = None + return mol + + def visualize(self, path: str, molecules: list, num_molecules_to_visualize: int): + if not os.path.exists(path): + os.makedirs(path) + logger.info(f"Visualizing {num_molecules_to_visualize} of {len(molecules)}") + if num_molecules_to_visualize > len(molecules): + logger.info(f"Shortening to {len(molecules)}") + num_molecules_to_visualize = len(molecules) + for i in range(num_molecules_to_visualize): + file_path = os.path.join(path, "molecule_{}.png".format(i)) + mol = self.mol_from_graphs(molecules[i][0].numpy(), molecules[i][1].numpy()) + try: + Draw.MolToFile(mol, file_path) + except rdkit.Chem.KekulizeException: + logger.info("Can't kekulize molecule") + + def visualizeNmr( + self, + batch_id, + molecules: list, + molecules_true, + num_molecules_to_visualize: int, + ): + path = os.path.join(self.result_path, f"batch_{batch_id}_predicted") + path_true = os.path.join(self.result_path, f"batch_{batch_id}_true") + if not os.path.exists(path): + os.makedirs(path) + if not os.path.exists(path_true): + os.makedirs(path_true) + if num_molecules_to_visualize > len(molecules): + logger.info(f"Sampling: Shortening to {len(molecules)}") + num_molecules_to_visualize = len(molecules) + for i in range(num_molecules_to_visualize): + file_path = os.path.join(path, "molecule_{}.png".format(i)) + file_path_true = os.path.join(path_true, "molecule_{}.png".format(i)) + mol = self.mol_from_graphs(molecules[i][0], molecules[i][1]) + mol_true = self.mol_from_graphs(molecules_true[i][0], molecules_true[i][1]) + try: + Draw.MolToFile(mol, file_path) + Draw.MolToFile(mol_true, file_path_true) + except rdkit.Chem.KekulizeException: + logger.info("Can't kekulize molecule") + + def visualize_chain(self, batch_id, i, nodes_list, adjacency_matrix): + path = os.path.join(self.result_path, f"chain/molecule_{batch_id}_{i}") + os.makedirs(path, exist_ok=True) + RDLogger.DisableLog("rdApp.*") + mols = [ + self.mol_from_graphs(nodes_list[i], adjacency_matrix[i]) + for i in range(nodes_list.shape[0]) + ] + final_molecule = mols[-1] + AllChem.Compute2DCoords(final_molecule) + coords = [] + for i, atom in enumerate(final_molecule.GetAtoms()): + positions = final_molecule.GetConformer().GetAtomPosition(i) + coords.append((positions.x, positions.y, positions.z)) + for i, mol in enumerate(mols): + AllChem.Compute2DCoords(mol) + conf = mol.GetConformer() + for j, atom in enumerate(mol.GetAtoms()): + x, y, z = coords[j] + conf.SetAtomPosition(j, Point3D(x, y, z)) + save_paths = [] + num_frams = nodes_list.shape[0] + for frame in range(num_frams): + file_name = os.path.join(path, "fram_{}.png".format(frame)) + Draw.MolToFile( + mols[frame], file_name, size=(300, 300), legend=f"Frame {frame}" + ) + save_paths.append(file_name) + imgs = [imageio.imread(fn) for fn in save_paths] + gif_path = os.path.join( + os.path.dirname(path), "{}.gif".format(path.split("/")[-1]) + ) + imgs.extend([imgs[-1]] * 10) + imageio.mimsave(gif_path, imgs, subrectangles=True, duration=20) + try: + img = Draw.MolsToGridImage(mols, molsPerRow=10, subImgSize=(200, 200)) + img.save( + os.path.join(path, "{}_grid_image.png".format(path.split("/")[-1])) + ) + except Chem.rdchem.KekulizeException: + logger.info("Can't kekulize molecule") + return mols + + +class NonMolecularVisualization: + def to_networkx(self, node_list, adjacency_matrix): + """ + Convert graphs to networkx graphs + node_list: the nodes of a batch of nodes (bs x n) + adjacency_matrix: the adjacency_matrix of the molecule (bs x n x n) + """ + graph = nx.Graph() + for i in range(len(node_list)): + if node_list[i] == -1: + continue + graph.add_node(i, number=i, symbol=node_list[i], color_val=node_list[i]) + rows, cols = np.where(adjacency_matrix >= 1) + edges = zip(rows.tolist(), cols.tolist()) + for edge in edges: + edge_type = adjacency_matrix[edge[0]][edge[1]] + graph.add_edge( + edge[0], edge[1], color=float(edge_type), weight=3 * edge_type + ) + return graph + + def visualize_non_molecule( + self, graph, pos, path, iterations=100, node_size=100, largest_component=False + ): + if largest_component: + CGs = [graph.subgraph(c) for c in nx.connected_components(graph)] + CGs = sorted(CGs, key=lambda x: x.number_of_nodes(), reverse=True) + graph = CGs[0] + if pos is None: + pos = nx.spring_layout(graph, iterations=iterations) + w, U = np.linalg.eigh(nx.normalized_laplacian_matrix(graph).toarray()) + vmin, vmax = np.min(U[:, 1]), np.max(U[:, 1]) + m = max(np.abs(vmin), vmax) + vmin, vmax = -m, m + plt.figure() + nx.draw( + graph, + pos, + font_size=5, + node_size=node_size, + with_labels=False, + node_color=U[:, 1], + cmap=plt.cm.coolwarm, + vmin=vmin, + vmax=vmax, + edge_color="grey", + ) + plt.tight_layout() + plt.savefig(path) + plt.close("all") + + def visualize(self, path: str, graphs: list, num_graphs_to_visualize: int): + if not os.path.exists(path): + os.makedirs(path) + for i in range(num_graphs_to_visualize): + file_path = os.path.join(path, "graph_{}.png".format(i)) + graph = self.to_networkx(graphs[i][0].numpy(), graphs[i][1].numpy()) + self.visualize_non_molecule(graph=graph, pos=None, path=file_path) + im = plt.imread(file_path) # noqa + + def visualize_chain(self, path, nodes_list, adjacency_matrix): + graphs = [ + self.to_networkx(nodes_list[i], adjacency_matrix[i]) + for i in range(nodes_list.shape[0]) + ] + final_graph = graphs[-1] + final_pos = nx.spring_layout(final_graph, seed=0) + save_paths = [] + num_frams = nodes_list.shape[0] + for frame in range(num_frams): + file_name = os.path.join(path, "fram_{}.png".format(frame)) + self.visualize_non_molecule( + graph=graphs[frame], pos=final_pos, path=file_name + ) + save_paths.append(file_name) + imgs = [imageio.imread(fn) for fn in save_paths] + gif_path = os.path.join( + os.path.dirname(path), "{}.gif".format(path.split("/")[-1]) + ) + imgs.extend([imgs[-1]] * 10) + imageio.mimsave(gif_path, imgs, subrectangles=True, duration=20) diff --git a/ppmatSim/README.md b/ppmatSim/README.md new file mode 100644 index 00000000..00b77f62 --- /dev/null +++ b/ppmatSim/README.md @@ -0,0 +1,132 @@ + +# Simulation Tasks +This section explains how to run Molecular Dynamics (MD) or structure optimization tasks using the ASE interface. These tasks are executed via the ppmatSim/main.py script. + +You can override any YAML parameter directly from the command line using parameter=value, or write your own YAML configuration. + +The Hydra output directory automatically includes the job name and timestamp, so results are well organized and won't be overwritten. + +| Section | Parameter | Description | +| ------------------ | ----------------- | -------------------------------------------------------------- | +| `device` | `cuda` | Device for computations (`cpu` or `cuda`) | +| `model/load_model` | `model_name` | Pre-trained model name | +| | `config_path` | Path to YAML config (used with checkpoint) | +| | `checkpoint_path` | Path to model checkpoint (*.pdparams) | +| `system` | `load_system` | Load initial system from file | +| | `ase_create` | Generate system using ASE | +| `task` | `md`, `opt` | Task type: `md` for molecular dynamics, `opt` for optimization | +| `calculator` | `ase` | Backend interface (ASE in this case) | + + +## 1. Running Molecular Dynamics (MD) Simulation (with ASE backend) + +The MD simulation is implemented in the function +ASECalculator.run_md() within ppmat/calculator/ase.py + +By default, it uses the ASE Langevin integrator for time evolution: +```bash +dyn = Langevin( + atoms, + timestep=timestep * units.fs, + temperature_K=temperature, + friction=0.01 / units.fs, +) +``` +This setup enables NVT dynamics with stochastic thermalization, suitable for general-purpose molecular simulations. + +Example Usage: +```bash +# Option A: Use a pre-trained model by name +python ppmatSim/main.py --config-name md_ase Model.model_name='chgnet_mptrj' + +python ppmatSim/main.py --config-name md_ase Model.model_name='mattersim_1M' + +# Option B: Use a custom config and checkpoint +python ppmatSim/main.py --config-name md_ase Model.config_path='your config path(*.yaml)' Model.checkpoint_path='your checkpoint path(*.pdparams)' + +python ppmatSim/main.py --config-name md_ase Model.config_path='your config path(*.yaml)' Model.checkpoint_path='your checkpoint path(*.pdparams)' +``` + +After the simulation, the generated trajectory (.traj) file can be easily converted to an .xyz file for visualization: +```bash +# Trajectory file (.traj) can be converted to XYZ file: +ase convert .traj .xyz +``` + + +Customization Example: + +Users can easily replace the default integrator with other ASE MD engines, such as IsotropicMTKNPT for NPT ensemble simulations or custom pre-relaxation steps.For example: +```bash +from ase.optimize import QuasiNewton +from ase.geometry.analysis import Analysis +from ase.md.velocitydistribution import ( + MaxwellBoltzmannDistribution, + Stationary, + ZeroRotation, +) +from ase.md.nose_hoover_chain import IsotropicMTKNPT +from ase.md.analysis import DiffusionCoefficient + +# Quick relaxation of the initial structure +qn = QuasiNewton(atoms) +qn.run(fmax=0.001, steps=10) + +# Initialize velocities and remove net translation/rotation +MaxwellBoltzmannDistribution(atoms, temperature_K=300) +Stationary(atoms) +ZeroRotation(atoms) + +# Run MD with NPT ensemble +dyn = IsotropicMTKNPT( + atoms=atoms, + timestep=timestep * units.fs, + temperature_K=temperature, + pressure_au=1 * units.bar, + tdamp=100, + pdamp=1000, + logfile=log_file, +) + +``` +This flexibility allows users to test different thermodynamic ensembles or thermostats/barostats directly within the ASE interface. + +> Coming soon: Examples for running MD with the **LAMMPS backend** will be provided in the next release. + + +## 2. Running Structure Optimization (with ASE backend) + +Structure optimization is supported through ASE’s built-in optimizers. +In the source code, the optimizer class and filter type can be specified via configuration. + +The filter (e.g., FrechetCellFilter) is used to apply optimization constraints on both atomic positions and cell parameters, ensuring stable relaxation for periodic systems. + +Available Optimizers +```bash +FIRE +BFGS +LBFGS +MDMin +GPMin +LBFGSLineSearch +BFGSLineSearch +``` + +Default Settings +```bash +optimizer: "LBFGS" +filter: "FrechetCellFilter" +``` + +Example Usage: +```bash +# Option A: Use a pre-trained model by name +python ppmatSim/main.py --config-name optimizer_ase Model.model_name='chgnet_mptrj' + +python ppmatSim/main.py --config-name optimizer_ase Model.model_name='mattersim_1M' + +# Option B: Use a custom config and checkpoint +python ppmatSim/main.py --config-name optimizer_ase Model.config_path='your config path(*.yaml)' Model.checkpoint_path='your checkpoint path(*.pdparams)' + +python ppmatSim/main.py --config-name optimizer_ase Model.config_path='your config path(*.yaml)' Model.checkpoint_path='your checkpoint path(*.pdparams)' +``` diff --git a/ppmatSim/configs/Calculator/ase.yaml b/ppmatSim/configs/Calculator/ase.yaml new file mode 100644 index 00000000..86de9f4e --- /dev/null +++ b/ppmatSim/configs/Calculator/ase.yaml @@ -0,0 +1,2 @@ +_target_: ppmat.calculator.ase.ASECalculator +type: ase diff --git a/ppmatSim/configs/Logger/default.yaml b/ppmatSim/configs/Logger/default.yaml new file mode 100644 index 00000000..cd701585 --- /dev/null +++ b/ppmatSim/configs/Logger/default.yaml @@ -0,0 +1,5 @@ +log_file: out.log # Resolved to ${hydra:run.dir}/out.log +log_level: INFO # Logging level +# use_visualdl: False # Use VisualDL +# use_wandb: False # Use Weights & Biases (wandb) +# use_tensorboard: False # Use TensorBoard diff --git a/ppmatSim/configs/Model/load_model.yaml b/ppmatSim/configs/Model/load_model.yaml new file mode 100644 index 00000000..632536ea --- /dev/null +++ b/ppmatSim/configs/Model/load_model.yaml @@ -0,0 +1,4 @@ +model_name: null +config_path: null +weights_name: null +checkpoint_path: null diff --git a/ppmatSim/configs/Run/default.yaml b/ppmatSim/configs/Run/default.yaml new file mode 100644 index 00000000..2c714ab8 --- /dev/null +++ b/ppmatSim/configs/Run/default.yaml @@ -0,0 +1,7 @@ +experiment: null +work_dir: ${hydra:runtime.cwd} + +# data_dir: ${run.work_dir}/data +# path: ${run.work_dir}/runs +# id: ${uuid:1} +# ckpt_path: null diff --git a/ppmatSim/configs/System/ase_create.yaml b/ppmatSim/configs/System/ase_create.yaml new file mode 100644 index 00000000..9fd82ad8 --- /dev/null +++ b/ppmatSim/configs/System/ase_create.yaml @@ -0,0 +1,7 @@ +interface: ase +structures: + - element: Fe + - element: Cu + - element: Mg + type: fcc + repeat: [4, 4, 4] diff --git a/ppmatSim/configs/System/load_system.yaml b/ppmatSim/configs/System/load_system.yaml new file mode 100644 index 00000000..f216a083 --- /dev/null +++ b/ppmatSim/configs/System/load_system.yaml @@ -0,0 +1,4 @@ +interface: load_file +file_path: ppmatSim/example_data/cifs +# position_unit_input: Angstrom +# mass_unit_input: 1.0 diff --git a/ppmatSim/configs/Task/md.yaml b/ppmatSim/configs/Task/md.yaml new file mode 100644 index 00000000..b190dbd4 --- /dev/null +++ b/ppmatSim/configs/Task/md.yaml @@ -0,0 +1,6 @@ +_target_: ppmat.calculator.ase.MDSimulationTask + +temperature: 300 # Temperature in Kelvin +timestep: 0.1 # Timestep for MD simulation in fs +steps: 1000 # Number of MD steps +interval: 1 # Interval to save trajectory diff --git a/ppmatSim/configs/Task/opt.yaml b/ppmatSim/configs/Task/opt.yaml new file mode 100644 index 00000000..cfd2e8b0 --- /dev/null +++ b/ppmatSim/configs/Task/opt.yaml @@ -0,0 +1,6 @@ +_target_: ppmat.calculator.ase.OptimizationTask + +optimizer: LBFGS # Optimizer name +filter: FrechetCellFilter # Filter name +fmax: 0.05 # Maximum force tolerance +steps: 100 # Number of steps diff --git a/ppmatSim/configs/md_ase.yaml b/ppmatSim/configs/md_ase.yaml new file mode 100644 index 00000000..55ec21a2 --- /dev/null +++ b/ppmatSim/configs/md_ase.yaml @@ -0,0 +1,23 @@ +# @package _global_ +device: cuda + +defaults: + - /Run: default # Runtime settings + - /Logger: default # Logging settings + - /Model: load_model # Load model weights (can be pre-trained or checkpoint) + - /System: load_system # System initialization: + # 'load_system': load pre-existing structure + # 'ase_create': generate system using ASE + - /Task: md # Task type: + # 'md' for molecular dynamics + # 'opt' for optimization + - /Calculator: ase # Calculator interface (ASE in this case) + - override hydra/job_logging: disabled # Disable Hydra's default job logging + - _self_ + +hydra: + job: + name: md_ase # Hydra job name (used in output directories) + chdir: True # Change working directory to run.dir + run: + dir: ./out_${hydra:job.name}/${now:%Y%m%d_%H%M%S} # Output directory diff --git a/ppmatSim/configs/optimizer_ase.yaml b/ppmatSim/configs/optimizer_ase.yaml new file mode 100644 index 00000000..28bf410e --- /dev/null +++ b/ppmatSim/configs/optimizer_ase.yaml @@ -0,0 +1,23 @@ +# @package _global_ +device: cuda + +defaults: + - /Run: default # Runtime settings + - /Logger: default # Logging settings + - /Model: load_model # Load model weights (can be pre-trained or checkpoint) + - /System: ase_create # System initialization: + # 'load_system': load pre-existing structure + # 'ase_create': generate system using ASE + - /Task: opt # Task type: + # 'md' for molecular dynamics + # 'opt' for optimization + - /Calculator: ase # Calculator interface (ASE in this case) + - override hydra/job_logging: disabled # Disable Hydra's default job logging + - _self_ + +hydra: + job: + name: optimizer_ase # Hydra job name (used in output directories) + chdir: True # Change working directory to run.dir + run: + dir: ./out_${hydra:job.name}/${now:%Y%m%d_%H%M%S} # Output directory diff --git a/ppmatSim/configs/potential.yaml b/ppmatSim/configs/potential.yaml new file mode 100644 index 00000000..b11384c7 --- /dev/null +++ b/ppmatSim/configs/potential.yaml @@ -0,0 +1,17 @@ +# @package _global_ +device: cuda + +defaults: + - /Run: default + - /Logger: default + - /Model: load_model + - /System: load_system # load_system, ase_create + - override hydra/job_logging: disabled + - _self_ + +hydra: + job: + name: potential + chdir: True # change working directory to run.dir + run: + dir: ./out_${hydra:job.name}/${now:%Y%m%d_%H%M%S} # output directory diff --git a/ppmatSim/configs/property.yaml b/ppmatSim/configs/property.yaml new file mode 100644 index 00000000..48f14e40 --- /dev/null +++ b/ppmatSim/configs/property.yaml @@ -0,0 +1,17 @@ +# @package _global_ +device: cuda + +defaults: + - /Run: default + - /Logger: default + - /Model: load_model + - /System: ase_create # load_system, ase_create + - override hydra/job_logging: disabled + - _self_ + +hydra: + job: + name: property + chdir: True # change working directory to run.dir + run: + dir: ./out_${hydra:job.name}/${now:%Y%m%d_%H%M%S} # output directory diff --git a/ppmatSim/example_data/cifs/Al.cif b/ppmatSim/example_data/cifs/Al.cif new file mode 100644 index 00000000..a4e5ad67 --- /dev/null +++ b/ppmatSim/example_data/cifs/Al.cif @@ -0,0 +1,34 @@ +# generated using pymatgen +data_Al +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.03892969 +_cell_length_b 4.03892969 +_cell_length_c 4.03892969 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural Al +_chemical_formula_sum Al4 +_cell_volume 65.88687052 +_cell_formula_units_Z 4 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_type_symbol + _atom_type_oxidation_number + Al0+ 0.0 +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Al0+ Al0 1 0.00000000 0.00000000 0.00000000 1 + Al0+ Al1 1 0.00000000 0.50000000 0.50000000 1 + Al0+ Al2 1 0.50000000 0.00000000 0.50000000 1 + Al0+ Al3 1 0.50000000 0.50000000 0.00000000 1 diff --git a/ppmatSim/example_data/cifs/AlCu.cif b/ppmatSim/example_data/cifs/AlCu.cif new file mode 100644 index 00000000..32e6fc1a --- /dev/null +++ b/ppmatSim/example_data/cifs/AlCu.cif @@ -0,0 +1,36 @@ +# generated using pymatgen +data_AlCu +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 4.05572184 +_cell_length_b 6.31517560 +_cell_length_c 6.32456864 +_cell_angle_alpha 65.48687748 +_cell_angle_beta 71.36152755 +_cell_angle_gamma 71.43809003 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural AlCu +_chemical_formula_sum 'Al5 Cu5' +_cell_volume 136.37894604 +_cell_formula_units_Z 5 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Al Al0 1 0.50000000 0.50000000 0.50000000 1 + Al Al1 1 0.84514971 0.46048356 0.84957741 1 + Al Al2 1 0.15485029 0.53951644 0.15042259 1 + Al Al3 1 0.62316791 0.99377092 0.76059171 1 + Al Al4 1 0.37683209 0.00622908 0.23940829 1 + Cu Cu5 1 0.00000000 0.00000000 0.00000000 1 + Cu Cu6 1 0.73969721 0.24150696 0.27583163 1 + Cu Cu7 1 0.26030279 0.75849304 0.72416837 1 + Cu Cu8 1 0.89095358 0.77254544 0.44562536 1 + Cu Cu9 1 0.10904642 0.22745456 0.55437464 1 diff --git a/ppmatSim/example_data/cifs/mp-18767-LiMnO2.cif b/ppmatSim/example_data/cifs/mp-18767-LiMnO2.cif new file mode 100644 index 00000000..7e04fa34 --- /dev/null +++ b/ppmatSim/example_data/cifs/mp-18767-LiMnO2.cif @@ -0,0 +1,40 @@ +# generated using pymatgen +data_LiMnO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 2.86877900 +_cell_length_b 4.63447500 +_cell_length_c 5.83250700 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural LiMnO2 +_chemical_formula_sum 'Li2 Mn2 O4' +_cell_volume 77.54484024 +_cell_formula_units_Z 2 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_type_symbol + _atom_type_oxidation_number + Li+ 1.0 + Mn3+ 3.0 + O2- -2.0 +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Li+ Li0 1 0.50000000 0.50000000 0.37975050 1 + Li+ Li1 1 0.00000000 0.00000000 0.62024950 1 + Mn3+ Mn2 1 0.50000000 0.50000000 0.86325250 1 + Mn3+ Mn3 1 0.00000000 0.00000000 0.13674750 1 + O2- O4 1 0.50000000 0.00000000 0.36082450 1 + O2- O5 1 0.00000000 0.50000000 0.09851350 1 + O2- O6 1 0.50000000 0.00000000 0.90148650 1 + O2- O7 1 0.00000000 0.50000000 0.63917550 1 diff --git a/ppmatSim/main.py b/ppmatSim/main.py new file mode 100644 index 00000000..dac5abfb --- /dev/null +++ b/ppmatSim/main.py @@ -0,0 +1,76 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os + +import hydra +from hydra.utils import instantiate +from omegaconf import DictConfig +from omegaconf import OmegaConf + +from ppmat.predictor import BasePredictor +from ppmat.predictor.structures import build_init_structures +from ppmat.utils import logger + + +@hydra.main(config_path="configs", version_base=None) +def main(cfg: DictConfig): + # Save the loaded config + OmegaConf.save(cfg, "config_saved.yaml") + + # Initialize logger + log_file = cfg.Logger.get("log_file", "out.log") + logger.init_logger(log_file=log_file, log_level=cfg.get("log_level", "INFO")) + logger.info("[PPMaterial] Logger initialized") + logger.info(f"Working directory: {os.getcwd()}") + logger.info(f"Log file path : {os.path.abspath(log_file)}") + + # Initialize the model + load_model = instantiate(cfg.Model) + predictor = BasePredictor( + work_dir=cfg.Run.work_dir, device=cfg.device, **load_model + ) + + # Detect interface type and interface object + if cfg.get("Calculator") is not None: + # Read interface type + interface_type = cfg.Calculator.get("type", None) + logger.info(f"Interface type is {interface_type}") + # Load inference model + predictor.load_inference_model(interface_type=interface_type) + # Initialize the interface object + interface_obj = instantiate(cfg.Calculator, predictor=predictor) + logger.info(f"Interface object is {interface_obj}") + else: + # Load inference model + predictor.load_inference_model(interface_type=None) + + # Load structures + files, structures = build_init_structures(cfg, predictor) + + if cfg.get("Task") is not None: + # Initialize the task + task = instantiate(cfg.Task) + # Run the task + task(interface_obj, structures) + else: + predictor.get_predict(files, structures) + + logger.info("All tasks finished successfully.") + + +if __name__ == "__main__": + main() diff --git a/property_prediction/README.md b/property_prediction/README.md new file mode 100644 index 00000000..4d3e265e --- /dev/null +++ b/property_prediction/README.md @@ -0,0 +1,44 @@ +# Property Prediction + +## 1.Introduction + +Property Prediction (PP) targets rapid, first-principles-level estimation of key crystalline properties—formation energy, band gap, elastic moduli, ionic conductivity, and more—without performing new density-functional-theory calculations. The workflow mirrors modern ML interatomic-potential pipelines but shifts the label space from forces to scalar and tensor observables. Starting from crystal structure files (CIF), an automated converter builds atom–bond graphs enriched with chemical descriptors and symmetry-aware positional encodings. Equivariant graph neural networks, or transformer-based variants, are then trained on tens of thousands of reference entries. By collapsing months of high-throughput DFT time into minutes of GPU inference, PP empowers data-driven discovery of semiconductors, catalysts and functional + +## 2.Models Matrix + +| **Supported Functions** | **[MEGNet](./configs/megnet/README.md)** | **[Comfomer](./configs/comformer/README.md)** | **GemNet** | **[DimeNet++](./configs/dimenet++/README.md)** | +| -------------------------------------------- | :--------------------------------------: | :-------------------------------------------: | :--------: | :--------------------------------------------: | +| **Forward Prediction · Materials Properties**| | | | | +| Formation energy | ✅ | ✅ | 🚧 | ✅ | +| Band gap | ✅ | ✅ | 🚧 | ✅ | +| Bulk modulus | ✅ | ✅ | 🚧 | ✅ | +| Shear modulus | ✅ | ✅ | 🚧 | ✅ | +| Young’s modulus | ✅ | ✅ | 🚧 | ✅ | +| Adsorption energy | 🚧 | 🚧 | 🚧 | 🚧 | +| Electron density | — | — | — | — | +| **ML Capabilities · Training** | | | | | +| Single-GPU | ✅ | ✅ | 🚧 | ✅ | +| Distributed training | ✅ | ✅ | 🚧 | ✅ | +| Mixed precision (AMP) | — | — | — | — | +| Fine-tuning | ✅ | ✅ | 🚧 | ✅ | +| Uncertainty / Active Learning | — | — | — | — | +| Dynamic→Static graphs | — | — | — | — | +| Compiler (CINN) opt. | — | — | — | — | +| **ML Capabilities · Predict** | | | | | +| Distillation / Pruning | — | — | — | — | +| Standard inference | ✅ | ✅ | 🚧 | ✅ | +| Distributed inference | — | — | — | — | +| Compiler-level inference | — | — | — | — | +| **Datasets** | | | | | +| **Materials Project** | | | | | +| MP2024 | ✅ | ✅ | — | — | +| MP2020 | ✅ | ✅ | — | — | +| MP2018 | ✅ | ✅ | 🚧 | — | +| **JARVIS** | | | | | +| dft_2d | ✅ | ✅ | — | ✅ | +| dft_3d | ✅ | ✅ | — | — | +| **Alexandria** | | | | | +| pbe_2d | ✅ | ✅ | 🚧 | — | +| **ML2DDB🌟** | ✅ | ✅ | ✅ | ✅ | + +**Notice**:🌟 represent originate research work published from paddlematerials toolkit diff --git a/property_prediction/configs/comformer/README.md b/property_prediction/configs/comformer/README.md new file mode 100644 index 00000000..b2492c11 --- /dev/null +++ b/property_prediction/configs/comformer/README.md @@ -0,0 +1,270 @@ +# ComFormer + +[COMPLETE AND EFFICIENT GRAPH TRANSFORMERS FOR CRYSTAL MATERIAL PROPERTY PREDICTION](https://arxiv.org/pdf/2403.11857) + +## Abstract + +Crystal structures are characterized by atomic bases within a primitive unit cell that repeats along a regular lattice throughout 3D space. The periodic and infinite nature of crystals poses unique challenges for geometric graph representation learning. Specifically, constructing graphs that effectively capture the complete geometric information of crystals and handle chiral crystals remains an unsolved and challenging problem. In this paper, we introduce a novel approach that utilizes the periodic patterns of unit cells to establish the lattice-based representation for each atom, enabling efficient and expressive graph representations of crystals. Furthermore, we propose ComFormer, a SE(3) transformer designed specifically for crystalline materials. ComFormer includes two variants; namely, iComFormer that employs invariant geometric descriptors of Euclidean distances and angles, and eComFormer that utilizes equivariant vector representations. Experimental results demonstrate the state-of-the-art predictive accuracy of ComFormer variants on various tasks across three widely-used crystal benchmarks. + + +![ComFormer pipeline](../../docs/ComFormer_pipline.png) + +## Datasets: + +The primary datasets employed in the evaluation of ComFormer include the Materials Project (MP), JARVIS-DFT, and the Alexandria Material Project. These datasets provide the ground-truth labels derived from Density Functional Theory (DFT) calculations, which serve as the target for the supervised learning process. The preprocessing and partitioning of these datasets are critical for ensuring the generalizability of the model. + +The MP2018.6.1 dataset represents a foundational benchmark for the field, encompassing a curated set of inorganic crystals with calculated thermodynamic and electronic properties. The MP2024 subset significantly expands the scale of the training data, allowing for the observation of model saturation and the benefits of large-scale pre-training. JARVIS-DFT datasets are particularly valued for their high-precision calculations and the inclusion of diverse properties like the energy above the convex hull ($E_{hull}$), which is a critical indicator of material stability. + +- MP2018.6.1: + + The original dataset can download from [here](https://figshare.com/ndownloader/files/15087992). Following the methodology outlined in the Comformer paper, we randomly partitioned the dataset into subsets, with the specific sample sizes for each subset detailed in the table below. + + | Dataset | Train | Val | Test | Properties | + | :--------------------------------------------------------------------------: | :---: | :---: | :---: | :---------: | + | [mp2018_train_60k](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2018/mp2018_train_60k.zip) | 60000 | 5000 | 4239 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G) | + +- MP2024 + + | Dataset | Train | Val | Test | Properties | + | :--------------------------------------------------------------------------: | :---: | :---: | :---: | :---------: | + | [mp2024_train_130k](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2024/mp2024_train_130k.zip) | 130000 | 10000 | 15361 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G) | + +- Jarvis + + The original dataset can download from [here](https://github.com/usnistgov/jarvis). + | Dataset | Count | Properties | + | :----: | :---: | :---------: | + | dft_2d | 1109 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + | dft_3d_2021 | 55723 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + | dft_3d | 75993| Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + +- Alexandria Material Project + + | Dataset | Count | Properties | + | :---: | :---: | :---------: | + | pbe_2d | 100000 | Formation Energy, et al. | + + +## Model + +ComFormer is an $SE(3)$ transformer framework designed specifically for crystalline materials, with its core principle involving the use of periodic patterns of unit cells to establish a lattice-based representation for each atom. By selecting lattice points with minimum non-zero norms as local coordinate axes, this mechanism ensures geometric completeness, enabling the model to uniquely distinguish various structures—including chiral crystals—and effectively resolving representation instability issues caused by the non-uniqueness of unit cell selection. + +The framework consists of two variants: iComFormer, which employs $SE(3)$ invariant geometric descriptors (such as Euclidean distances and angles) to predict scalar properties like formation energy and band gaps; and eComFormer, which introduces $SO(3)$ equivariant vector representations to capture more complex physical symmetries. In terms of computational performance, ComFormer optimizes node-wise and edge-wise transformer layers to integrate angular information without relying on high-complexity line graphs, maintaining a complexity of $O(nk)$ (where $n$ denotes the number of atoms and $k$ denotes the average number of neighbors) and demonstrating exceptional efficiency in large-scale material screening tasks. + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetPropertyMAE(Val / Test dataset)GPUsTraining timeConfigCheckpoint | Log
comformer_mp2018_train_60k_e_formmp2018_train_60kForm. Energy(meV/atom)16.4 / 18.14~12 hourscomformer_mp2018_train_60k_e_formcheckpoint | log
comformer_mp2018_train_60k_band_gapmp2018_train_60kBand Gap(eV)0.223 / 0.2094~12 hourscomformer_mp2018_train_60k_band_gapcheckpoint | log
comformer_mp2018_train_60k_Kmp2018_train_60kBulk Modulus( log(GPa) )0.0346 / 0.04164~0.5 hourscomformer_mp2018_train_60k_kcheckpoint | log
comformer_mp2018_train_60k_Gmp2018_train_60kShear Modulus( log(GPa) )0.0615 / 0.06514~0.5 hourscomformer_mp2018_train_60k_Gcheckpoint | log
comformer_mp2024_train_130k_e_formmp2024_train_130kForm. Energy(meV/atom) 28.475 / 28.3311~88 hourscomformer_mp2024_train_130k_e_formcheckpoint | log
comformer_jarvis_dft_2d_e_formJarvis_dft_2dForm. Energy(meV/atom) 225.444 / 191.8761~0.2 hourscomformer_jarvis_dft_2d_train_e_formcheckpoint | log
comformer_jarvis_dft_3d_e_formJarvis_dft_3dForm. Energy(meV/atom) 35.101 / 35.496 1~12 hourscomformer_jarvis_dft_3d_train_e_formcheckpoint | log
comformer_jarvis_alex_pbe_2d_all_e_formAlex_pbe_2d_allForm. Energy(meV/atom) 29.164 / 28.991 1~20 hourscomformer_jarvis_alex_pbe_2d_train_e_formcheckpoint | log
+ +**Note:** The original [Comformer paper](https://arxiv.org/abs/2403.11857) used the `Jarvis dft_3d_2021` dataset. + +### Training +```bash +# formation energy per atom +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml + +# band gap +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml + +# bulk modulus +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml + +# shear modulus +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml +``` + +### Validation +```bash +# Adjust program behavior on-the-fly using command-line parameters – this provides a convenient way to customize settings without modifying the configuration file directly. +# such as: --Global.do_eval=True + +# formation energy per atom +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# band gap +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# bulk modulus +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# shear modulus +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' +``` + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. + +# formation energy per atom +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# band gap +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# bulk modulus +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# shear modulus +python property_prediction/train.py -c property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' +``` + +### Prediction + +You can replace the `--model_name` parameter at `Mode 1` with other model names from the `results` table. + +```bash +# This command is used to predict the properties of new crystal structures using a trained model. +# Note: The model_name and weights_name parameters are used to specify the pre-trained model and its corresponding weights. The cif_file_path parameter is used to specify the path to the CIF files for which properties need to be predicted. +# The prediction results will be saved in a CSV file specified by the save_path parameter. Default save_path is 'result.csv'. + +# formation energy per atom + +# Mode 1: Leverage a pre-trained machine learning model for crystal formation energy prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='comformer_mp2018_train_60k_e_form' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal formation energy prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + + +# band gap + +# Mode 1: Leverage a pre-trained machine learning model for crystal band gap prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='comformer_mp2018_train_60k_band_gap' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal band gap prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + +# bulk modulus + +# Mode 1: Leverage a pre-trained machine learning model for crystal bulk modulus prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='comformer_mp2018_train_60k_K' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal bulk modulus prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + + +# shear modulus + +# Mode 1: Leverage a pre-trained machine learning model for crystal shear modulus prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='comformer_mp2018_train_60k_G' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal shear modulus prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' +``` + + +## Citation +``` +@inproceedings{yan2024complete, + title={Complete and Efficient Graph Transformers for Crystal Material Property Prediction}, + author={Yan, Keqiang and Fu, Cong and Qian, Xiaofeng and Qian, Xiaoning and Ji, Shuiwang}, + booktitle={International Conference on Learning Representations}, + year={2024} +} +``` diff --git a/property_prediction/configs/comformer/comformer_jarvis_alex_pbe_2d_train_e_form.yaml b/property_prediction/configs/comformer/comformer_jarvis_alex_pbe_2d_train_e_form.yaml new file mode 100644 index 00000000..82aca3bd --- /dev/null +++ b/property_prediction/configs/comformer/comformer_jarvis_alex_pbe_2d_train_e_form.yaml @@ -0,0 +1,144 @@ +Global: + # for jarvis dataset, the property name is: + # "formation_energy_peratom" + + label_names: ["e_form"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "alex_pbe_2d_all" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 4 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_jarvis_alex_pbe_2d_all_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "e_form" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.001 + by_epoch: True + + +Metric: + e_form: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/comformer/comformer_jarvis_dft_2d_train_e_form.yaml b/property_prediction/configs/comformer/comformer_jarvis_dft_2d_train_e_form.yaml new file mode 100644 index 00000000..c683bdea --- /dev/null +++ b/property_prediction/configs/comformer/comformer_jarvis_dft_2d_train_e_form.yaml @@ -0,0 +1,144 @@ +Global: + # for jarvis dataset, the property name is: + # "formation_energy_peratom" + + label_names: ["formation_energy_peratom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_2d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 4 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_jarvis_dft_2d_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_peratom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.001 + by_epoch: True + + +Metric: + formation_energy_peratom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/comformer/comformer_jarvis_dft_3d_train_e_form.yaml b/property_prediction/configs/comformer/comformer_jarvis_dft_3d_train_e_form.yaml new file mode 100644 index 00000000..fd35aaec --- /dev/null +++ b/property_prediction/configs/comformer/comformer_jarvis_dft_3d_train_e_form.yaml @@ -0,0 +1,144 @@ +Global: + # for jarvis dataset, the property name is: + # "formation_energy_peratom" + + label_names: ["formation_energy_peratom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 4 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_jarvis_dft_3d_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_peratom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.001 + by_epoch: True + + +Metric: + formation_energy_peratom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml b/property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml new file mode 100644 index 00000000..6624baac --- /dev/null +++ b/property_prediction/configs/comformer/comformer_mp2018_train_60k_G.yaml @@ -0,0 +1,173 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["G"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_mp2018_train_60k_G + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "G" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 3 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + data_mean: 0.0 + data_std: 1.0 + +Metric: + G: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.0001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "G" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 # 16 for 4 GPUs, total batch size = 16 * 4 = 64 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "G" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "G" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True + post_transforms: + - __class_name__: PowerData + __init_params__: + exp: 10 + apply_keys: "G" diff --git a/property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml b/property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml new file mode 100644 index 00000000..8b81977f --- /dev/null +++ b/property_prediction/configs/comformer/comformer_mp2018_train_60k_K.yaml @@ -0,0 +1,177 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["K"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + max_neighbors: 16 + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_mp2018_train_60k_K + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "K" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 3 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + data_mean: 0.0 + data_std: 1.0 + +Metric: + K: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.0001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "K" + cache_path: "./data/mp2018_train_60k_cache_comformer_max_neighbors_16/mp.2018.6.1_train" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 # 16 for 4 GPUs, total batch size = 16 * 4 = 64 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "K" + cache_path: "./data/mp2018_train_60k_cache_comformer_max_neighbors_16/mp.2018.6.1_val" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "K" + cache_path: "./data/mp2018_train_60k_cache_comformer_max_neighbors_16/mp.2018.6.1_test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True + post_transforms: + - __class_name__: PowerData + __init_params__: + exp: 10 + apply_keys: "K" diff --git a/property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml b/property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml new file mode 100644 index 00000000..c531ea04 --- /dev/null +++ b/property_prediction/configs/comformer/comformer_mp2018_train_60k_band_gap.yaml @@ -0,0 +1,160 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["band_gap"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_mp2018_train_60k_band_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "band_gap" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 4 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + data_mean: 1.3462 + data_std: 1.6214 + loss_type: 'l1_loss' + +Metric: + band_gap: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Linear + __init_params__: + learning_rate: 0.0005 + end_lr: 1.0e-05 + by_epoch: false + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 # 16 for 4 GPUs, total batch size = 16 * 4 = 64 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml b/property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml new file mode 100644 index 00000000..824cf0b0 --- /dev/null +++ b/property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml @@ -0,0 +1,158 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["formation_energy_per_atom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_mp2018_train_60k_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 4 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + data_mean: -1.6519 + data_std: 1.0694 + +Metric: + formation_energy_per_atom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 # 16 for 4 GPUs, total batch size = 16 * 4 = 64 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/comformer/comformer_mp2024_train_130k_e_form.yaml b/property_prediction/configs/comformer/comformer_mp2024_train_130k_e_form.yaml new file mode 100644 index 00000000..f9fb5b7c --- /dev/null +++ b/property_prediction/configs/comformer/comformer_mp2024_train_130k_e_form.yaml @@ -0,0 +1,165 @@ +Global: + # for mp2024 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["formation_energy_per_atom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: ComformerGraphConverter + __init_params__: + cutoff: 4.0 + num_cpus: 10 + + +Dataset: + train: + dataset: + __class_name__: MP2024Dataset + __init_params__: + path: "./data/mp2024_train_130k/mp2024_train.txt" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 16 # 16 for 4 GPUs, total batch size = 16 * 4 = 64 + val: + dataset: + __class_name__: MP2024Dataset + __init_params__: + path: "./data/mp2024_train_130k/mp2024_val.txt" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP2024Dataset + __init_params__: + path: "./data/mp2024_train_130k/mp2024_test.txt" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + + transform: + __class_name__: mean_std_scaling + __init_params__: {} + + +Model: + __class_name__: iComformer + __init_params__: + conv_layers: 4 + edge_layers: 1 + atom_input_features: 92 + edge_features: 256 + triplet_input_features: 256 + node_features: 256 + fc_features: 256 + output_features: 1 + node_layer_head: 1 + edge_layer_head: 1 + property_name: ${Global.label_names} + # data_mean: -1.6519 + # data_std: 1.0694 + + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/comformer_mp2024_train_130k_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: AdamW + __init_params__: + lr: + __class_name__: OneCycleLR + __init_params__: + max_learning_rate: 0.001 + by_epoch: True + + +Metric: + formation_energy_per_atom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/dimenet++/README.md b/property_prediction/configs/dimenet++/README.md new file mode 100644 index 00000000..c2a3373f --- /dev/null +++ b/property_prediction/configs/dimenet++/README.md @@ -0,0 +1,313 @@ +# DimeNet++ + +[Fast and Uncertainty-Aware Directional Message Passing for Non-Equilibrium Molecules](https://arxiv.org/abs/2011.14115) + +## Abstract + +Many important tasks in chemistry revolve around molecules during reactions. This requires predictions far from the equilibrium, while most recent work in machine learning for molecules has been focused on equilibrium or near-equilibrium states. In this paper we aim to extend this scope in three ways. First, we propose the DimeNet++ model, which is 8x faster and 10% more accurate than the original DimeNet on the QM9 benchmark of equilibrium molecules. Second, we validate DimeNet++ on highly reactive molecules by developing the challenging COLL dataset, which contains distorted configurations of small molecules during collisions. Finally, we investigate ensembling and mean-variance estimation for uncertainty quantification with the goal of accelerating the exploration of the vast space of non-equilibrium structures. Our DimeNet++ implementation as well as the COLL dataset are available online. + + +![DimeNet++](../../docs/DimeNet++.png) + +## Datasets: + +The primary datasets employed in the evaluation of ComFormer include the Materials Project (MP). The dataset provides the ground-truth labels derived from Density Functional Theory (DFT) calculations, which serve as the target for the supervised learning process. The preprocessing and partitioning of these datasets are critical for ensuring the generalizability of the model. + +The MP2018.6.1 dataset represents a foundational benchmark for the field, encompassing a curated set of inorganic crystals with calculated thermodynamic and electronic properties. + +- MP2018.6.1: + + The original dataset can download from [here](https://figshare.com/ndownloader/files/15087992). Following the methodology outlined in the Comformer paper, we randomly partitioned the dataset into subsets, with the specific sample sizes for each subset detailed in the table below. + + | Dataset | Train | Val | Test | Properties | + | :--------------------------------------------------------------------------: | :---: | :---: | :---: | :---------: | + | [mp2018_train_60k](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2018/mp2018_train_60k.zip) | 60000 | 5000 | 4239 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G) | + +## Model + +DimeNet++ is a directional message passing neural network designed for accurate and efficient prediction of molecular energies and forces, particularly for non-equilibrium molecular configurations. It builds upon the original DimeNet architecture by preserving its physically motivated directional message passing mechanism while substantially improving computational efficiency and predictive accuracy through architectural refinements. + +### Graph representation and embeddings + +A molecular system is represented as a graph ( G = (V, E) ), where nodes ( i \in V ) correspond to atoms and directed edges ( j \to i \in E ) correspond to interatomic interactions within a cutoff radius. Unlike conventional atom-centered GNNs, DimeNet++ associates learnable embeddings with **directed edges**, enabling explicit encoding of geometric directionality. + +Each directed edge ( j \to i ) is characterized by the interatomic distance ( d_{ji} ), which is expanded using a radial basis function (RBF): + +```math +\mathbf{e}^{\text{RBF}}_{ji} = \text{RBF}(d_{ji}) +``` + +To capture angular information, DimeNet++ further considers atom triplets ( k \to j \to i ), where the bond angle ( \alpha_{kji} ) together with distance ( d_{kj} ) is expanded using a spherical basis function (SBF): + +```math +\mathbf{a}^{\text{SBF}}_{kji} = \text{SBF}(d_{kj}, \alpha_{kji}) +``` + +These basis representations enable a joint encoding of distances and angles, which is essential for modeling anisotropic interactions and directional bonding effects. + +### Directional message passing + +The core of DimeNet++ is its **directional message passing** scheme, where messages are propagated along directed edges rather than between atoms. Each directed edge ( j \to i ) is associated with a message embedding ( \mathbf{m}_{ji}^{(l)} ) at layer ( l ). + +The update of a message embedding consists of two steps: interaction aggregation and message update. First, messages incoming to atom ( j ) from its neighbors ( k \neq i ) are aggregated through an interaction function: + +```math +\mathbf{z}_{ji}^{(l)} = +\sum_{k \in \mathcal{N}(j) \setminus \{i\}} +f_{\text{int}}\!\left( +\mathbf{m}_{kj}^{(l)}, +\mathbf{e}^{\text{RBF}}_{ji}, +\mathbf{a}^{\text{SBF}}_{kji} +\right) +``` + +The aggregated interaction is then combined with the current message embedding to produce the updated message: + +```math +\mathbf{m}_{ji}^{(l+1)} = +f_{\text{update}}\!\left( +\mathbf{m}_{ji}^{(l)}, \mathbf{z}_{ji}^{(l)} +\right) +``` + +Here, ( f_{\text{int}} ) and ( f_{\text{update}} ) are learnable neural network modules. + +### Efficient interaction modeling in DimeNet++ + +In the original DimeNet, the interaction function ( f_{\text{int}} ) relied on a bilinear transformation between message embeddings and basis representations, which incurred significant computational cost due to the large number of edge triplets. DimeNet++ replaces this bilinear layer with a more efficient **Hadamard (element-wise) product**, while maintaining expressiveness by introducing multilayer perceptrons (MLPs) applied to the basis functions: + +```math +f_{\text{int}}(\mathbf{m}, \mathbf{e}, \mathbf{a}) += +\left( \text{MLP}_{\text{RBF}}(\mathbf{e}) +\odot +\text{MLP}_{\text{SBF}}(\mathbf{a}) \right) +\odot +\mathbf{m} +``` + +This modification significantly reduces computational complexity while preserving or improving predictive accuracy. + +### Embedding hierarchy and residual connections + +To further improve efficiency, DimeNet++ introduces an **embedding hierarchy** through down-projection and up-projection layers. Message embeddings are projected to a lower-dimensional space during the costly interaction steps and projected back afterward: + +```math +\mathbf{m}^{\downarrow} = \mathbf{W}_{\downarrow} \mathbf{m}, +\quad +\mathbf{m}^{\uparrow} = \mathbf{W}_{\uparrow} \mathbf{m}^{\downarrow} +``` + +Residual connections are applied throughout the network to stabilize training and facilitate deeper architectures: + +```math +\mathbf{m}_{ji}^{(l+1)} = +\mathbf{m}_{ji}^{(l)} + \Delta \mathbf{m}_{ji}^{(l)} +``` + +Empirically, DimeNet++ achieves comparable or better performance using fewer interaction layers than the original DimeNet. + +### Atomic representations and output + +Although message passing is performed on directed edges, atomic representations are obtained by aggregating incoming messages for each atom: + +```math +\mathbf{t}_i^{(l)} = +\sum_{j \in \mathcal{N}(i)} +\mathbf{W}_{\text{out}} \mathbf{m}_{ji}^{(l)} +``` + +The final atomic embeddings are passed through an output network to predict atomic energy contributions. The total molecular energy is computed as a sum over atoms: + +```math +E = \sum_i E_i +``` + +Atomic forces are obtained by differentiating the predicted energy with respect to atomic positions, ensuring full energy–force consistency: + +```math +\mathbf{F}_i = - \frac{\partial E}{\partial \mathbf{x}_i} +``` + +### Model stacking and training characteristics + +DimeNet++ stacks multiple directional message passing layers to enable information propagation from local to longer-range interactions. The model is trained using the Adam optimizer, and mixed precision is avoided due to numerical stability issues arising from the high accuracy requirements of energy and force predictions. + +Through its architectural improvements, DimeNet++ achieves up to an **8× speedup** over DimeNet while improving prediction accuracy, making it well suited for large-scale simulations of reactive and non-equilibrium molecular systems. + + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetPropertyMAE(Val / Test dataset)GPUsTraining timeConfigCheckpoint | Log
dimenetpp_mp2018_train_60k_e_formmp2018_train_60kForm. Energy(eV/atom)0.030738 / 0.032307419 hours 54 mindimenet++_mp2018_train_60k_e_formcheckpoint | log
dimenetpp_mp2018_train_60k_band_gapmp2018_train_60kBand Gap(eV)0.270737 / 0.282961423 hoursdimenet++_mp2018_train_60k_band_gapcheckpoint | log
dimenetpp_mp2018_train_60k_Kmp2018_train_60kBulk modulus(GPa)8.068773 / 7.0319674~1 hour 38 mindimenet++_mp2018_train_60k_kcheckpoint | log
dimenetpp_mp2018_train_60k_Gmp2018_train_60kShear modulus(GPa)8.083622 / 7.1222384~1 hour 38 mindimenet++_mp2018_train_60k_Gcheckpoint | log
+ +### Training +```bash +# formation energy per atom +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml + +# band gap +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml + +# bulk modulus +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml + +# shear modulus +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml +``` + +### Validation +```bash +# Adjust program behavior on-the-fly using command-line parameters – this provides a convenient way to customize settings without modifying the configuration file directly. +# such as: --Global.do_eval=True + +# formation energy per atom +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# band gap +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# bulk modulus +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# shear modulus +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' +``` + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. + +# formation energy per atom +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# band gap +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# bulk modulus +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' + +# shear modulus +python property_prediction/train.py -c property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml Global.do_test=True Global.do_train=False Global.do_eval=False Trainer.pretrained_model_path='your model path(*.pdparams)' +``` + +### Prediction + +You can replace the `--model_name` parameter at `Mode 1` with other model names from the `results` table. + +```bash +# This command is used to predict the properties of new crystal structures using a trained model. +# Note: The model_name and weights_name parameters are used to specify the pre-trained model and its corresponding weights. The cif_file_path parameter is used to specify the path to the CIF files for which properties need to be predicted. +# The prediction results will be saved in a CSV file specified by the save_path parameter. Default save_path is 'result.csv'. + +# formation energy per atom + +# Mode 1: Leverage a pre-trained machine learning model for crystal formation energy prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='dimenetpp_mp2018_train_60k_e_form' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal formation energy prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/dimenet++/dimenetpp_mp2018_train_60k_e_form.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + + +# band gap + +# Mode 1: Leverage a pre-trained machine learning model for crystal band gap prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='dimenetpp_mp2018_train_60k_band_gap' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal band gap prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/dimenetpp/dimenetpp_mp2018_train_60k_band_gap.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + +# bulk modulus + +# Mode 1: Leverage a pre-trained machine learning model for crystal bulk modulus prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='dimenetpp_mp2018_train_60k_K' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal bulk modulus prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/dimenetpp/dimenetpp_mp2018_train_60k_K.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' + + +# shear modulus + +# Mode 1: Leverage a pre-trained machine learning model for crystal shear modulus prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py --model_name='dimenetpp_mp2018_train_60k_G' --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal shear modulus prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py --config_path='property_prediction/configs/dimenetpp/dimenet++_mp2018_train_60k_G.yaml' --checkpoint_path='you_checkpoint_path.pdparams' --cif_file_path='./property_prediction/example_data/cifs/' +``` + + +## Citation +``` +@article{gasteiger2020fast, + title={Fast and Uncertainty-Aware Directional Message Passing for Non-Equilibrium Molecules}, + author={Gasteiger, Johannes and Giri, Shankari and Margraf, Johannes T. and Günnemann, Stephan}, + journal={arXiv preprint arXiv:2011.14115}, + year={2020} +} +``` diff --git a/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml new file mode 100644 index 00000000..883d34db --- /dev/null +++ b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_G.yaml @@ -0,0 +1,169 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["G"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: CrystalNN + __init_params__: + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/dimenetpp_mp2018_train_60k_G + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "G" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: DimeNetPlusPlus + __init_params__: + # layer parameters + out_channels: 1 + hidden_channels: 128 + num_blocks: 4 + int_emb_size: 64 + basis_emb_size: 8 + out_emb_channels: 256 + num_spherical: 7 + num_embeddings: 95 + num_radial: 6 + otf_graph: false + cutoff: 7.0 + max_num_neighbors: 20 + envelope_exponent: 5 + num_before_skip: 1 + num_after_skip: 2 + num_output_layers: 3 + readout: mean + # predict value name + property_names: ${Global.label_names} + # data preprocess parameters + data_mean: 0.0 + data_std: 1.0 + # loss + loss_type: 'l1_loss' + +Metric: + G: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 32 # 32 for 4 GPUs, total batch size = 32 * 4 = 128 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml new file mode 100644 index 00000000..b24677b3 --- /dev/null +++ b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_K.yaml @@ -0,0 +1,169 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["K"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: CrystalNN + __init_params__: + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/dimenetpp_mp2018_train_60k_K + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "K" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: DimeNetPlusPlus + __init_params__: + # layer parameters + out_channels: 1 + hidden_channels: 128 + num_blocks: 4 + int_emb_size: 64 + basis_emb_size: 8 + out_emb_channels: 256 + num_spherical: 7 + num_embeddings: 95 + num_radial: 6 + otf_graph: false + cutoff: 7.0 + max_num_neighbors: 20 + envelope_exponent: 5 + num_before_skip: 1 + num_after_skip: 2 + num_output_layers: 3 + readout: mean + # predict value name + property_names: ${Global.label_names} + # data preprocess parameters + data_mean: 0.0 + data_std: 1.0 + # loss + loss_type: 'l1_loss' + +Metric: + K: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 32 # 32 for 4 GPUs, total batch size = 32 * 4 = 128 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml new file mode 100644 index 00000000..7da220bf --- /dev/null +++ b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_band_gap.yaml @@ -0,0 +1,167 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["band_gap"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: CrystalNN + __init_params__: + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/dimenetpp_mp2018_train_60k_band_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "band_gap" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: DimeNetPlusPlus + __init_params__: + # layer parameters + out_channels: 1 + hidden_channels: 128 + num_blocks: 4 + int_emb_size: 64 + basis_emb_size: 8 + out_emb_channels: 256 + num_spherical: 7 + num_embeddings: 95 + num_radial: 6 + otf_graph: false + cutoff: 7.0 + max_num_neighbors: 20 + envelope_exponent: 5 + num_before_skip: 1 + num_after_skip: 2 + num_output_layers: 3 + readout: mean + # predict value name + property_names: ${Global.label_names} + # data preprocess parameters + data_mean: 1.3462 + data_std: 1.6214 + # loss + loss_type: 'l1_loss' + +Metric: + band_gap: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 32 # 32 for 4 GPUs, total batch size = 32 * 4 = 128 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml new file mode 100644 index 00000000..b5518afd --- /dev/null +++ b/property_prediction/configs/dimenet++/dimenet++_mp2018_train_60k_e_form.yaml @@ -0,0 +1,169 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["formation_energy_per_atom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: CrystalNN + __init_params__: + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/dimenetpp_mp2018_train_60k_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: DimeNetPlusPlus + __init_params__: + # layer parameters + out_channels: 1 + hidden_channels: 128 + num_blocks: 4 + int_emb_size: 64 + basis_emb_size: 8 + out_emb_channels: 256 + num_spherical: 7 + num_embeddings: 95 + num_radial: 6 + otf_graph: false + cutoff: 7.0 + max_num_neighbors: 20 + envelope_exponent: 5 + num_before_skip: 1 + num_after_skip: 2 + num_output_layers: 3 + readout: mean + # predict value name + property_names: ${Global.label_names} + # data preprocess parameters + data_mean: -1.6519675510987046 + data_std: 1.0694354273392233 + # loss + loss_type: 'l1_loss' + +Metric: + formation_energy_per_atom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 32 # 32 for 4 GPUs, total batch size = 32 * 4 = 128 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/README.md b/property_prediction/configs/megnet/README.md new file mode 100644 index 00000000..29c37323 --- /dev/null +++ b/property_prediction/configs/megnet/README.md @@ -0,0 +1,540 @@ +# MegNet + +[Graph Networks as a Universal Machine Learning Framework for Molecules and Crystals](https://arxiv.org/abs/1812.05055) + +## Abstract + +Graph networks are a new machine learning (ML) paradigm that supports both relational reasoning and combinatorial generalization. Here, we develop universal MatErials Graph Network (MEGNet) models for accurate property prediction in both molecules and crystals. We demonstrate that the MEGNet models outperform prior ML models such as the SchNet in 11 out of 13 properties of the QM9 molecule data set. Similarly, we show that MEGNet models trained on ∼60,000 crystals in the Materials Project substantially outperform prior ML models in the prediction of the formation energies, band gaps and elastic modulus of crystals, achieving better than DFT accuracy over a much larger data set. We present two new strategies to address data limitations common in materials science and chemistry. First, we demonstrate a physically-intuitive approach to unify four separate molecular MEGNet models for the internal energy at 0 K and room temperature, enthalpy and Gibbs free energy into a single free energy MEGNet model by incorporating the temperature, pressure and entropy as global state inputs. Second, we show that the learned element embeddings in MEGNet models encode periodic chemical trends and can be transfer-learned from a property model trained on a larger data set (formation energies) to improve property models with smaller amounts of data (band gaps and elastic modulus). + + +![MegNet Overview](../../docs/megnet.png) + +## Datasets: + +The primary datasets employed in the evaluation of ComFormer include the Materials Project (MP), JARVIS-DFT, and the Alexandria Material Project. These datasets provide the ground-truth labels derived from Density Functional Theory (DFT) calculations, which serve as the target for the supervised learning process. The preprocessing and partitioning of these datasets are critical for ensuring the generalizability of the model. + +The MP2018.6.1 dataset represents a foundational benchmark for the field, encompassing a curated set of inorganic crystals with calculated thermodynamic and electronic properties. The MP2024 subset significantly expands the scale of the training data, allowing for the observation of model saturation and the benefits of large-scale pre-training. JARVIS-DFT datasets are particularly valued for their high-precision calculations and the inclusion of diverse properties like the energy above the convex hull ($E_{hull}$), which is a critical indicator of material stability. + +- MP2018.6.1: + + The original dataset can download from [here](https://figshare.com/ndownloader/files/15087992). Following the methodology outlined in the Comformer paper, we randomly partitioned the dataset into subsets, with the specific sample sizes for each subset detailed in the table below. + + | Dataset | Train | Val | Test | Properties | + | :--------------------------------------------------------------------------: | :---: | :---: | :---: | :---------: | + | [mp2018_train_60k](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2018/mp2018_train_60k.zip) | 60000 | 5000 | 4239 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G) | + +- MP2024 + + | Dataset | Train | Val | Test | Properties | + | :--------------------------------------------------------------------------: | :---: | :---: | :---: | :---------: | + | [mp2024_train_130k](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp2024/mp2024_train_130k.zip) | 130000 | 10000 | 15361 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G) | + +- Jarvis + + The original dataset can download from [here](https://github.com/usnistgov/jarvis). + | Dataset | Count | Properties | + | :----: | :---: | :---------: | + | dft_2d | 1109 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + | dft_3d | 75993| Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + | cfid_3d | 55723 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + | dft_3d_2021 | 55723 | Formation Energy, Band Gap, Bulk Modulus(K), Shear Modulus(G), $E_{hull}$, et al. | + +- Alexandria Material Project + + | Dataset | Count | Properties | + | :---: | :---: | :---------: | + | pbe_2d | 100000 | Formation Energy, et al. | + +- Matbench + + The Matbench benchmark dataset for materials property prediction. The original dataset can be downloaded from [here](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/matbench/matbench.zip/). + + | Dataset | Property | Count | + | :---: | :---: | :---: | + | mp_e_form | Formation Energy (eV/atom) | 132752 | + | mp_gap | Band Gap (eV) | 106113 | + | G | Shear Modulus (GPa) | 10987 | + | K | Bulk Modulus (GPa) | 10987 | + +- OMol25: + + The OMol25 dataset is widely used for benchmarking molecular modeling methods that predict quantum chemical properties (such as internal energy, HOMO-LUMO gap, and dipole moment) given molecular structures. We conducted experiments based on the CHGNet model on this dataset. + For more information and the download link, please visit [here](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/OMol25/train_4M.tar.gz). + + | Dataset | Count | + | :---: | :---: | + | OMol25 | 4000000 | + +## Model +MEGNet represents material systems as graphs composed of three fundamental elements: nodes ((V)), edges ((E)), and a global state ((u)). Nodes represent atoms and encode attributes such as atomic number, hybridization state, chirality, ring size, and aromaticity. Edges represent chemical bonds or neighborhood relationships between atoms, incorporating bond types, interatomic distances, and topological features. The global state vector stores system-level information, such as molecular weight, temperature, pressure, and entropy, enabling unified modeling of state-dependent properties such as free energy. For crystalline systems, edges are defined based on a cutoff radius to determine atomic neighborhoods, and spatial distances are expanded using Gaussian basis functions, whereas molecular systems can include richer node and edge attributes. + +MEGNet achieves information fusion among atoms, edges, and the global state through three successive update steps. + +### Edge update + +The updated attribute of each edge is determined by its own attributes, the attributes of the atoms it connects, and the global state: + +```math +e_k' = \phi_e \left( v_{s_k} \oplus v_{r_k} \oplus e_k \oplus u \right) +``` + +where (\phi_e) denotes the edge update function, (\oplus) represents vector concatenation, and (s_k) and (r_k) are the indices of the two atoms connected by edge (k). + +### Node update + +The updated attribute of each node is determined by its own attributes, the updated attributes of all connected edges, and the global state. First, a local aggregation over incident edges is performed: + +```math +\bar{v}_i^{\,e} = \frac{1}{N_i^e} \sum_{k=1}^{N_i^e} \left\{ e_k' \right\}_{r_k = i} +``` + +The aggregated edge information is then combined with the node’s original attributes and the global state to update the node features: + +```math +v_i' = \phi_v \left( \bar{v}_i^{\,e} \oplus v_i \oplus u \right) +``` + +where (N_i^e) denotes the number of edges connected to atom (i), and (\phi_v) is the node update function. This step is equivalent to performing a local convolution on each atom, allowing its features to incorporate the influence of neighboring atoms. + +### Global state update + +The updated global state is determined by its original attributes as well as all updated atom and edge attributes in the graph. First, global aggregations over edges and nodes are computed: + +```math +\bar{u}^{\,e} = \frac{1}{N^e} \sum_{k=1}^{N^e} e_k' +``` + +```math +\bar{u}^{\,v} = \frac{1}{N^v} \sum_{i=1}^{N^v} v_i' +``` + +The global state is then updated as: + +```math +u' = \phi_u \left( \bar{u}^{\,e} \oplus \bar{u}^{\,v} \oplus u \right) +``` + +where (N^e) and (N^v) denote the total numbers of edges and nodes, respectively. By stacking multiple MEGNet modules, information among atoms, edges, and the global state can be propagated over multiple rounds, enabling the modeling of interactions ranging from local neighborhoods to long-range effects. + +In terms of model architecture, two fully connected (Dense) layers are added before each MEGNet module for input preprocessing to enhance model flexibility. Residual connections are employed within the modules to support deep training and reduce the risk of overfitting. A Dense layer combined with a message-passing module constitutes one block, and multiple such blocks can be stacked to form a deep model. In the final readout stage, the set2set operation is used to encode sets of atomic and edge attributes into fixed-length vectors, which are then concatenated with the global state vector and passed through a multilayer perceptron to produce the final output. This design enables the prediction of material properties such as energy, band gap, or elastic modulus. + +MEGNet is trained using the Adam optimizer with an initial learning rate of 0.001, which is dynamically reduced to 0.0001 during training. Most models converge within 1,000 epochs, while free-energy-related models typically require 2,000 to 4,000 epochs. + + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetPropertyMAE(Val / Test dataset)GPUsTraining timeConfigCheckpoint | Log
megnet_mp2018_train_60k_e_formmp2018_train_60kForm. Energy(meV/atom)28.3 / 26.51~15 hoursmegnet_mp2018_train_60k_e_formcheckpoint | log
megnet_mp2018_train_60k_band_gapmp2018_train_60kband gap 0.2962 / 0.29341~20 hoursmegnet_mp2018_train_60k_band_gapcheckpoint | log
megnet_mp2018_train_60k_Gmp2018_train_60kG0.0836 / 0.09621~1.5 hoursmegnet_mp2018_train_60k_Gcheckpoint | log
megnet_mp2018_train_60k_Kmp2018_train_60kK0.0512 / 0.05851~1.5 hoursmegnet_mp2018_train_60k_Kcheckpoint | log
megnet_mp2024_train_130k_e_formmp2024_train_130kForm. Energy(meV/atom)40.7 / 41.01~48 hoursmegnet_mp2024_train_130k_e_formcheckpoint | log
megnet_jarvis_dft_2d_e_formJarvis_dft_2dForm. Energy(meV/atom)313.910 / 286.372 1~0.25 hoursmegnet_jarvis_dft_2d_e_formcheckpoint | log
megnet_jarvis_dft_3d_e_formJarvis_dft_3dForm. Energy(meV/atom) 50.728 / 49.318 1~20 hoursmegnet_jarvis_dft_3d_e_formcheckpoint | log
megnet_jarvis_cfid_3d_e_formJarvis_cfid_3dForm. Energy(meV/atom) 0.056092 / 0.057279 1~18 hoursmegnet_jarvis_cfid_3d_e_formcheckpoint | log
megnet_jarvis_cfid_3d_band_gapJarvis_cfid_3dBand Gap(eV) 0.172418 / 0.162828 1~12.5 hoursmegnet_jarvis_cfid_3d_band_gapcheckpoint | log
megnet_jarvis_cfid_3d_shear_modulusJarvis_cfid_3dShear Modulus(G) 0.121244 / 0.117699 1~4.5 hoursmegnet_jarvis_cfid_3d_shear_moduluscheckpoint | log
megnet_jarvis_cfid_3d_bulk_modulusJarvis_cfid_3dBulk Modulus(K) 0.138926 / 0.141083 1~4.5 hoursmegnet_jarvis_cfid_3d_bulk_moduluscheckpoint | log
megnet_jarvis_dft_3d_2021_e_formJarvis_dft_3d_2021Form. Energy(meV/atom) 0.048386 / 0.049537 1~12.5 hoursmegnet_jarvis_dft_3d_e_formcheckpoint | log
megnet_jarvis_alex_pbe_2d_all_e_formAlex_pbe_2d_allForm. Energy(meV/atom) 62.708 / 62.972 1~34 hoursmegnet_jarvis_alex_pbe_2d_all_e_formcheckpoint | log
megnet_jarvis_dft_2d_bandgapJarvis_dft_2d_2020Band Gap(eV) - 1 - megnet_jarvis_dft_2d_bandgapcheckpoint | log
megnet_matbench_e_formMatbenchForm. Energy(eV/atom) 2.084808/ 2.072724 1~40 hoursmegnet_matbench_e_formcheckpoint | log
megnet_matbench_band_gapMatbenchBand Gap(eV) 0.225403 / 0.226996 1~8 hoursmegnet_matbench_band_gapcheckpoint | log
megnet_matbench_shear_modulusMatbenchShear Modulus (G) 0.098680 / 0.093513 1~4 hoursmegnet_matbench_shear_moduluscheckpoint | log
megnet_matbench_bulk_modulusMatbenchBulk Modulus (K) 0.080528 / 0.077150 1~4 hoursmegnet_matbench_bulk_moduluscheckpoint | log
megnet_tmqm_train_108k_dipole_mtmQM_108kDipole Moment (Debye) - 1 - megnet_tmqm_train_108k_dipole_mcheckpoint | log
megnet_tmqm_train_108k_dispersion_etmQM_108kDispersion Energy (Hartree) - 1 - megnet_tmqm_train_108k_dispersion_echeckpoint | log
megnet_tmqm_train_108k_electronic_etmQM_108kElectronic Energy (Hartree) - 1 - megnet_tmqm_train_108k_electronic_echeckpoint | log
megnet_tmqm_train_108k_hl_gaptmQM_108kHOMO-LUMO Gap (eV) - 1 - megnet_tmqm_train_108k_hl_gapcheckpoint | log
megnet_tmqm_train_108k_homo_energytmQM_108kHOMO Energy (eV) - 1 - megnet_tmqm_train_108k_homo_energycheckpoint | log
megnet_tmqm_train_108k_lumo_energytmQM_108kLUMO Energy (eV) - 1 - megnet_tmqm_train_108k_lumo_energycheckpoint | log
megnet_tmqm_train_108k_metal_qtmQM_108kMetal Charge (e) - 1 - megnet_tmqm_train_108k_metal_qcheckpoint | log
megnet_tmqm_train_108k_polarizabilitytmQM_108kPolarizability (Bohr³) - 1 - megnet_tmqm_train_108k_polarizabilitycheckpoint | log
megnet_omol25_dipoleOMol25 - - - - ~ ~ megnet_omol25_dipolecheckpoint | log
megnet_omol25_gapOMol25 - - - - ~ ~ megnet_omol25_gapcheckpoint | log
megnet_omol25_homoOMol25 - - - - ~ ~ megnet_omol25_homocheckpoint | log
megnet_omol25_lumoOMol25 - - - - ~ ~ megnet_omol25_lumocheckpoint | log
megnet_omol25_u0OMol25 - - - - ~ ~ megnet_omol25_u0checkpoint | log
+ +### Training +```bash +# formation energy per atom +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" property_prediction/train.py -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml +# single-gpu training +python property_prediction/train.py -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml + +``` + +### Validation +```bash +# Run model evaluation on the validation dataset. +# Adjust program behavior on-the-fly using command-line parameters – this provides a convenient way to customize settings without modifying the configuration file directly. +# Trainer.pretrained_model_path specifies the path to the saved model checkpoint to be loaded. +# such as: --Global.do_eval=True + +# formation energy per atom +python property_prediction/train.py \ + -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml \ + Global.do_train=False \ + Global.do_eval=True \ + Global.do_test=False \ + Trainer.pretrained_model_path=output/megnet_mp2018_train_60k_e_form/checkpoints +``` + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. + +# formation energy per atom +python property_prediction/train.py \ + -c property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml \ + Global.do_train=False \ + Global.do_test=True \ + Global.do_eval=False \ + Trainer.pretrained_model_path=output/megnet_mp2018_train_60k_e_form/checkpoints + +``` + +### Prediction + +You can replace the `--model_name` parameter at `Mode 1` with other model names from the `results` table. + +```bash +# This command is used to predict the properties of new crystal structures using a trained model. +# Note: The model_name and weights_name parameters are used to specify the pre-trained model and its corresponding weights. The cif_file_path parameter is used to specify the path to the CIF files for which properties need to be predicted. +# The prediction results will be saved in a CSV file specified by the save_path parameter. Default save_path is 'result.csv'. + +# formation energy per atom + +# Mode 1: Leverage a pre-trained machine learning model for crystal formation energy prediction. The implementation includes automated model download functionality, eliminating the need for manual configuration. +python property_prediction/predict.py \ + --model_name='megnet_mp2018_train_60k_e_form' \ + --cif_file_path='./property_prediction/example_data/cifs/' + +# Mode2: Use a custom configuration file and checkpoint for crystal formation energy prediction. This approach allows for more flexibility and customization. +python property_prediction/predict.py \ + --config_path='property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml' \ + --checkpoint_path='you_checkpoint_path.pdparams' \ + --cif_file_path='./property_prediction/example_data/cifs/' + +``` + + +## Citation +``` +@article{chen2019graph, + title={Graph networks as a universal machine learning framework for molecules and crystals}, + author={Chen, Chi and Ye, Weike and Zuo, Yunxing and Zheng, Chen and Ong, Shyue Ping}, + journal={Chemistry of Materials}, + volume={31}, + number={9}, + pages={3564--3572}, + year={2019}, + publisher={ACS Publications} +} +``` diff --git a/property_prediction/configs/megnet/megnet_jarvis_alex_pbe_2d_all_e_form.yaml b/property_prediction/configs/megnet/megnet_jarvis_alex_pbe_2d_all_e_form.yaml new file mode 100644 index 00000000..2c5ea039 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_alex_pbe_2d_all_e_form.yaml @@ -0,0 +1,148 @@ +Global: + # for jarvis dataset, the property name is: + # "formation_energy_peratom" + + label_names: ["e_form"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "alex_pbe_2d_all" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # data_mean: -1.6519 + # data_std: 1.0694 + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_alex_pbe_2d_all_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "e_form" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + e_form: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_alex_scan_3d_all_band_gap.yaml b/property_prediction/configs/megnet/megnet_jarvis_alex_scan_3d_all_band_gap.yaml new file mode 100644 index 00000000..38adc25f --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_alex_scan_3d_all_band_gap.yaml @@ -0,0 +1,147 @@ +Global: + # For JARVIS alex_scan_3d_all dataset, available property names include: + # "e_form", "band_gap_ind" + # This config focuses on band gap prediction + + label_names: ["band_gap_ind"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "alex_scan_3d_all" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_alex_scan_3d_all_bandgap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "band_gap_ind" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + band_gap_ind: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_alex_scan_3d_all_e_form.yaml b/property_prediction/configs/megnet/megnet_jarvis_alex_scan_3d_all_e_form.yaml new file mode 100644 index 00000000..60f01e25 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_alex_scan_3d_all_e_form.yaml @@ -0,0 +1,147 @@ +Global: + # For JARVIS alex_scan_3d_all dataset, available property names include: + # "e_form", "band_gap_ind" + # This config focuses on formation energy prediction + + label_names: ["e_form"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "alex_scan_3d_all" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_alex_scan_3d_all_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "e_form" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + e_form: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_band_gap.yaml b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_band_gap.yaml new file mode 100644 index 00000000..21f998a7 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_band_gap.yaml @@ -0,0 +1,150 @@ +Global: + # For JARVIS cfid_3d dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on band gap prediction + + label_names: ["optb88vdw_bandgap"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "cfid_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_cfid_3d_optb88vdw_bandgap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "optb88vdw_bandgap" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + optb88vdw_bandgap: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_bulk_modulus.yaml b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_bulk_modulus.yaml new file mode 100644 index 00000000..2e5ab73a --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_bulk_modulus.yaml @@ -0,0 +1,153 @@ +Global: + # For JARVIS cfid_3d dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on bulk modulus prediction + + label_names: ["bulk_modulus_kv"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "cfid_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + transforms: + - __class_name__: Scale + __init_params__: + scale: 0.01 + apply_keys: "bulk_modulus_kv" + loader: + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + transform: + __class_name__: no_scaling + __init_params__: {} + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_cfid_3d_bulk_modulus_kv + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "bulk_modulus_kv" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + bulk_modulus_kv: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_e_form.yaml b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_e_form.yaml new file mode 100644 index 00000000..664de7ae --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_e_form.yaml @@ -0,0 +1,147 @@ +Global: + # For JARVIS cfid_3d dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on formation energy prediction + + label_names: ["formation_energy_peratom"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "cfid_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_cfid_3d_formation_energy_peratom + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_peratom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + formation_energy_peratom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_shear_modulus.yaml b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_shear_modulus.yaml new file mode 100644 index 00000000..7be9cfa3 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_cfid_3d_shear_modulus.yaml @@ -0,0 +1,152 @@ +Global: + # For JARVIS cfid_3d dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on shear modulus prediction + + label_names: ["shear_modulus_gv"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "cfid_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + transforms: + - __class_name__: Scale + __init_params__: + scale: 0.01 + apply_keys: "shear_modulus_gv" + loader: + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: no_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_cfid_3d_shear_modulus_gv + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "shear_modulus_gv" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + shear_modulus_gv: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_2d_bandgap.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_2d_bandgap.yaml new file mode 100644 index 00000000..bf92c474 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_2d_bandgap.yaml @@ -0,0 +1,112 @@ +Global: + label_names: ["optb88vdw_bandgap"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + overwrite: True + path: "./data/jarvis_2d" + jarvis_data_name: "dft_2d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis_2d" + # Filter invalid automatically handles 'na' strings in bandgap + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_jarvis_dft_2d_bandgap + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "optb88vdw_bandgap" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + optb88vdw_bandgap: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_2d_e_form.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_2d_e_form.yaml new file mode 100644 index 00000000..de584e3b --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_2d_e_form.yaml @@ -0,0 +1,148 @@ +Global: + # for jarvis dataset, the property name is: + # "formation_energy_peratom" + + label_names: ["formation_energy_peratom"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_2d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # data_mean: -1.6519 + # data_std: 1.0694 + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_dft_2d_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_peratom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + formation_energy_peratom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_band_gap.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_band_gap.yaml new file mode 100644 index 00000000..6c1db5cf --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_band_gap.yaml @@ -0,0 +1,147 @@ +Global: + # For JARVIS dft_3d_2021 dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on band gap prediction + + label_names: ["optb88vdw_bandgap"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_3d_2021" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_dft_3d_2021_optb88vdw_bandgap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "optb88vdw_bandgap" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + optb88vdw_bandgap: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_bulk_modulus.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_bulk_modulus.yaml new file mode 100644 index 00000000..81361298 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_bulk_modulus.yaml @@ -0,0 +1,152 @@ +Global: + # For JARVIS dft_3d_2021 dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on bulk modulus prediction + + label_names: ["bulk_modulus_kv"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_3d_2021" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + transforms: + - __class_name__: Scale + __init_params__: + scale: 0.01 + apply_keys: "bulk_modulus_kv" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_dft_3d_2021_bulk_modulus_kv + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "bulk_modulus_kv" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + bulk_modulus_kv: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_e_form.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_e_form.yaml new file mode 100644 index 00000000..92618919 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_e_form.yaml @@ -0,0 +1,147 @@ +Global: + # For JARVIS dft_3d_2021 dataset, available property names include: + # "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" + # This config focuses on formation energy prediction + + label_names: ["formation_energy_peratom"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_3d_2021" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_dft_3d_2021_formation_energy_peratom + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_peratom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + formation_energy_peratom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_shear_modulus.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_shear_modulus.yaml new file mode 100644 index 00000000..3f65836a --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_2021_shear_modulus.yaml @@ -0,0 +1,152 @@ +Global: +# For JARVIS cfid_3d dataset, available property names include: +# "formation_energy_peratom", "optb88vdw_bandgap", "bulk_modulus_kv", "shear_modulus_gv" +# This config focuses on shear modulus prediction + + label_names: ["shear_modulus_gv"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "cfid_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + transforms: + - __class_name__: Scale + __init_params__: + scale: 0.01 + apply_keys: "shear_modulus_gv" + loader: + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: no_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_cfid_3d_shear_modulus_gv + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "shear_modulus_gv" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + shear_modulus_gv: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_jarvis_dft_3d_e_form.yaml b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_e_form.yaml new file mode 100644 index 00000000..9d7d371e --- /dev/null +++ b/property_prediction/configs/megnet/megnet_jarvis_dft_3d_e_form.yaml @@ -0,0 +1,148 @@ +Global: + # for jarvis dataset, the property name is: + # "formation_energy_peratom" + + label_names: ["formation_energy_peratom"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Dataset: + dataset: + __class_name__: JarvisDataset + __init_params__: + path: "./data/jarvis" + jarvis_data_name: "dft_3d" + property_names: ${Global.label_names} + build_structure_cfg: + format: jarvis + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/jarvis" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # data_mean: -1.6519 + # data_std: 1.0694 + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_jarvis_dft_3d_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_peratom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + formation_energy_peratom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_matbench_band_gap.yaml b/property_prediction/configs/megnet/megnet_matbench_band_gap.yaml new file mode 100644 index 00000000..2620c0d3 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_matbench_band_gap.yaml @@ -0,0 +1,150 @@ +Global: + # for matbench dataset, the property name is: + # "gap pbe" (band gap) + label_names: ["gap pbe"] + do_train: True + do_eval: True + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 # Standard cutoff for MEGNet + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 1000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_matbench_band_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 50 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "gap pbe" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # Data statistics for matbench band gap dataset + # Mean: 0.769148 eV, Std: 1.286880 eV (from 10k sample analysis) + data_mean: 0.769148 + data_std: 1.286880 + +Metric: + "gap pbe": + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + # Use split_dataset_ratio to automatically split the dataset + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + + dataset: + __class_name__: MatbenchDataset + __init_params__: + data_dir: "./data/matbench" + property_names: ${Global.label_names} + build_structure_cfg: + format: structure # Already Structure objects, no conversion needed + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/matbench_cache_megnet_band_gap" + # max_samples: null # Use all samples (~106k) + overwrite: False # Don't overwrite cache unless necessary + filter_unvalid: True + num_workers: 8 # Increase for full dataset + use_shared_memory: False + + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 64 # Adjust based on GPU memory + + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_matbench_bulk_modulus.yaml b/property_prediction/configs/megnet/megnet_matbench_bulk_modulus.yaml new file mode 100644 index 00000000..631f20dc --- /dev/null +++ b/property_prediction/configs/megnet/megnet_matbench_bulk_modulus.yaml @@ -0,0 +1,150 @@ +Global: + # for matbench dataset, the property name is: + # "log10(K_VRH)" (log10 of bulk modulus) + label_names: ["log10(K_VRH)"] + do_train: True + do_eval: True + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 # Standard cutoff for MEGNet + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 1000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_matbench_bulk_modulus + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 50 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "log10(K_VRH)" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # Data statistics for matbench bulk modulus dataset + # Mean: 1.880446, Std: 0.369314 (from full dataset analysis) + data_mean: 1.880446 + data_std: 0.369314 + +Metric: + "log10(K_VRH)": + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + # Use split_dataset_ratio to automatically split the dataset + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + + dataset: + __class_name__: MatbenchDataset + __init_params__: + data_dir: "./data/matbench" + property_names: ${Global.label_names} + build_structure_cfg: + format: structure # Already Structure objects, no conversion needed + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/matbench_cache_megnet_bulk_modulus" + # max_samples: null # Use all samples (~11k) + overwrite: False # Don't overwrite cache unless necessary + filter_unvalid: True + num_workers: 8 # Increase for full dataset + use_shared_memory: False + + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 64 # Adjust based on GPU memory + + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: false + drop_last: false + batch_size: 64 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_matbench_e_form.yaml b/property_prediction/configs/megnet/megnet_matbench_e_form.yaml new file mode 100644 index 00000000..882874bf --- /dev/null +++ b/property_prediction/configs/megnet/megnet_matbench_e_form.yaml @@ -0,0 +1,150 @@ +Global: + # for matbench dataset, the property name is: + # "e_form" (formation energy per atom) + label_names: ["e_form"] + do_train: True + do_eval: True + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 # Standard cutoff for MEGNet + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 1000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_matbench_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 50 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "e_form" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # Data statistics for matbench formation energy dataset + # Mean: 0.556506 eV/atom, Std: 0.578879 eV/atom (from 10k sample analysis) + data_mean: 0.556506 + data_std: 0.578879 + +Metric: + e_form: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + # Use split_dataset_ratio to automatically split the dataset + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + + dataset: + __class_name__: MatbenchDataset + __init_params__: + # data_dir: "./data/matbench" # Will auto-download if not specified + property_names: ${Global.label_names} + build_structure_cfg: + format: structure # Already Structure objects, no conversion needed + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/matbench_cache_megnet_e_form" + # max_samples: null # Use all samples (~132k) + overwrite: False # Don't overwrite cache unless necessary + filter_unvalid: True + num_workers: 8 # Increase for full dataset + use_shared_memory: False + + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 64 # Adjust based on GPU memory + + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_matbench_shear_modulus.yaml b/property_prediction/configs/megnet/megnet_matbench_shear_modulus.yaml new file mode 100644 index 00000000..f0e8f462 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_matbench_shear_modulus.yaml @@ -0,0 +1,150 @@ +Global: + # for matbench dataset, the property name is: + # "log10(G_VRH)" (log10 of shear modulus) + label_names: ["log10(G_VRH)"] + do_train: True + do_eval: True + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 # Standard cutoff for MEGNet + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 1000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_matbench_shear_modulus + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 50 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "log10(G_VRH)" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + # Data statistics for matbench shear modulus dataset + # Mean: 1.553639, Std: 0.371598 (from full dataset analysis) + data_mean: 1.553639 + data_std: 0.371598 + +Metric: + "log10(G_VRH)": + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + # Use split_dataset_ratio to automatically split the dataset + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + + dataset: + __class_name__: MatbenchDataset + __init_params__: + data_dir: "./data/matbench" + property_names: ${Global.label_names} + build_structure_cfg: + format: structure # Already Structure objects, no conversion needed + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/matbench_cache_megnet_shear_modulus" + # max_samples: null # Use all samples (~11k) + overwrite: False # Don't overwrite cache unless necessary + filter_unvalid: True + num_workers: 8 # Increase for full dataset + use_shared_memory: False + + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 64 # Adjust based on GPU memory + + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: false + drop_last: false + batch_size: 64 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_mp2018_train_60k_G.yaml b/property_prediction/configs/megnet/megnet_mp2018_train_60k_G.yaml new file mode 100644 index 00000000..cc35e903 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_mp2018_train_60k_G.yaml @@ -0,0 +1,190 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["G"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_train" + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "G" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_val" + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "G" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_test" + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "G" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + transform: + __class_name__: no_scaling + __init_params__: {} + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_mp2018_train_60k_G + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "G" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + G: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True + post_transforms: + - __class_name__: PowerData + __init_params__: + exp: 10 + apply_keys: "G" diff --git a/property_prediction/configs/megnet/megnet_mp2018_train_60k_K.yaml b/property_prediction/configs/megnet/megnet_mp2018_train_60k_K.yaml new file mode 100644 index 00000000..e03a758b --- /dev/null +++ b/property_prediction/configs/megnet/megnet_mp2018_train_60k_K.yaml @@ -0,0 +1,190 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["K"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_train" + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "K" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_val" + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "K" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_test" + transforms: + - __class_name__: Log10 + __init_params__: + apply_keys: "K" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + transform: + __class_name__: no_scaling + __init_params__: {} + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_mp2018_train_60k_K + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "K" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + K: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True + post_transforms: + - __class_name__: PowerData + __init_params__: + exp: 10 + apply_keys: "K" diff --git a/property_prediction/configs/megnet/megnet_mp2018_train_60k_band_gap.yaml b/property_prediction/configs/megnet/megnet_mp2018_train_60k_band_gap.yaml new file mode 100644 index 00000000..11dcc933 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_mp2018_train_60k_band_gap.yaml @@ -0,0 +1,173 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["band_gap"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_train" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_val" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + transform: + __class_name__: no_scaling + __init_params__: {} + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_mp2018_train_60k_band_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "band_gap" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + band_gap: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml b/property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml new file mode 100644 index 00000000..6ddf359b --- /dev/null +++ b/property_prediction/configs/megnet/megnet_mp2018_train_60k_e_form.yaml @@ -0,0 +1,166 @@ +Global: + # for mp2018 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["formation_energy_per_atom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_mp2018_train_60k_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + data_mean: -1.6519 + data_std: 1.0694 + +Metric: + formation_energy_per_atom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + train: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_train.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_train" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_val.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_val" + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: MP2018Dataset + __init_params__: + path: "./data/mp2018_train_60k/mp.2018.6.1_test.json" + property_names: ${Global.label_names} + build_structure_cfg: + format: cif_str + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2018_train_60k_cache_find_points_in_spheres_cutoff_4/mp.2018.6.1_test" + + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_mp2024_train_130k_e_form.yaml b/property_prediction/configs/megnet/megnet_mp2024_train_130k_e_form.yaml new file mode 100644 index 00000000..e28aebfe --- /dev/null +++ b/property_prediction/configs/megnet/megnet_mp2024_train_130k_e_form.yaml @@ -0,0 +1,173 @@ +Global: + # for mp2024 dataset, the property names are: + # "formation_energy_per_atom", + # "band_gap", + # "G", + # "K" + label_names: ["formation_energy_per_atom"] + do_train: True + do_eval: False + do_test: False + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + + +Dataset: + train: + dataset: + __class_name__: MP2024Dataset + __init_params__: + path: "./data/mp2024_train_130k/mp2024_train.txt" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2024_train_130k_cache_find_points_in_spheres_cutoff_4/mp2024_train" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + + val: + dataset: + __class_name__: MP2024Dataset + __init_params__: + path: "./data/mp2024_train_130k/mp2024_val.txt" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2024_train_130k_cache_find_points_in_spheres_cutoff_4/mp2024_val" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + test: + dataset: + __class_name__: MP2024Dataset + __init_params__: + path: "./data/mp2024_train_130k/mp2024_test.txt" + property_names: ${Global.label_names} + build_structure_cfg: + format: dict + num_cpus: 10 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/mp2024_train_130k_cache_find_points_in_spheres_cutoff_4/mp2024_test" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + + transform: + __class_name__: mean_std_scaling + __init_params__: {} + + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_mp2024_train_130k_e_form + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "formation_energy_per_atom" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + + +Metric: + formation_energy_per_atom: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_omol25_dipole.yaml b/property_prediction/configs/megnet/megnet_omol25_dipole.yaml new file mode 100644 index 00000000..ab710bcc --- /dev/null +++ b/property_prediction/configs/megnet/megnet_omol25_dipole.yaml @@ -0,0 +1,106 @@ +Global: + + label_names: ["dipole"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 5.0 + num_cpus: 10 + +Dataset: + train: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 + + val: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_omol25_dipole + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "dipole" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + dipole: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_omol25_gap.yaml b/property_prediction/configs/megnet/megnet_omol25_gap.yaml new file mode 100644 index 00000000..ee9bbd2e --- /dev/null +++ b/property_prediction/configs/megnet/megnet_omol25_gap.yaml @@ -0,0 +1,106 @@ +Global: + + label_names: ["gap"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 5.0 + num_cpus: 10 + +Dataset: + train: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 + + val: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_omol25_gap + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "gap" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + gap: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_omol25_homo.yaml b/property_prediction/configs/megnet/megnet_omol25_homo.yaml new file mode 100644 index 00000000..11ee0a7c --- /dev/null +++ b/property_prediction/configs/megnet/megnet_omol25_homo.yaml @@ -0,0 +1,106 @@ +Global: + + label_names: ["homo"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 5.0 + num_cpus: 10 + +Dataset: + train: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 + + val: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_omol25_homo + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "homo" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + homo: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_omol25_lumo.yaml b/property_prediction/configs/megnet/megnet_omol25_lumo.yaml new file mode 100644 index 00000000..ce78c28f --- /dev/null +++ b/property_prediction/configs/megnet/megnet_omol25_lumo.yaml @@ -0,0 +1,106 @@ +Global: + + label_names: ["lumo"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 5.0 + num_cpus: 10 + +Dataset: + train: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 + + val: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_omol25_dipole + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "dipole" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + dipole: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_omol25_u0.yaml b/property_prediction/configs/megnet/megnet_omol25_u0.yaml new file mode 100644 index 00000000..5cfb66e1 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_omol25_u0.yaml @@ -0,0 +1,106 @@ +Global: + + label_names: ["u0"] + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 5.0 + num_cpus: 10 + +Dataset: + train: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 128 + + val: + dataset: + __class_name__: OMol25Dataset + __init_params__: + path: "./data/omol25" + property_names: ${Global.label_names} + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/omol25" + num_workers: 4 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/megnet_omol25_u0 + save_freq: 100 + log_freq: 20 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'eval_metric' + name_for_best_metric: "u0" + greater_is_better: False + compute_metric_during_train: True + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Metric: + u0: + __class_name__: paddle.nn.L1Loss + __init_params__: {} + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_dipole_m.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_dipole_m.yaml new file mode 100644 index 00000000..df4d4a38 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_dipole_m.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["dipole_m"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_dipole_m + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "dipole_m" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + dipole_m: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + dipole_m_key: "dipole_m" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_dispersion_e.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_dispersion_e.yaml new file mode 100644 index 00000000..88e9bca0 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_dispersion_e.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["dispersion_e"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_dispersion_e + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "dispersion_e" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + dispersion_e: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + dispersion_e_key: "dispersion_e" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_electronic_e.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_electronic_e.yaml new file mode 100644 index 00000000..9588029e --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_electronic_e.yaml @@ -0,0 +1,164 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["electronic_e"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_electronic_e + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "electronic_e" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + data_mean: -1.6519 + data_std: 1.0694 + +Metric: + electronic_e: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + electronic_e_key: "electronic_e" + property_names: ${Global.label_names} + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_hl_gap.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_hl_gap.yaml new file mode 100644 index 00000000..d0d4f47c --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_hl_gap.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["hl_gap"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_hl_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "hl_gap" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + hl_gap: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + hl_gap_key: "hl_gap" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_homo_energy.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_homo_energy.yaml new file mode 100644 index 00000000..e3ee06a5 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_homo_energy.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["homo_energy"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_homo_energy + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "homo_energy" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + homo_energy: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + homo_energy_key: "homo_energy" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_lumo_energy.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_lumo_energy.yaml new file mode 100644 index 00000000..e51f6d78 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_lumo_energy.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["lumo_energy"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_lumo_energy + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "lumo_energy" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + lumo_energy: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + lumo_energy_key: "lumo_energy" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_metal_q.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_metal_q.yaml new file mode 100644 index 00000000..d59e473b --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_metal_q.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["metal_q"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_metal_q + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "metal_q" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + metal_q: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + metal_q_key: "metal_q" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/configs/megnet/megnet_tmqm_train_108k_polarizability.yaml b/property_prediction/configs/megnet/megnet_tmqm_train_108k_polarizability.yaml new file mode 100644 index 00000000..adccb0f8 --- /dev/null +++ b/property_prediction/configs/megnet/megnet_tmqm_train_108k_polarizability.yaml @@ -0,0 +1,161 @@ +Global: + # for tmqm dataset, the property names are: + # "electronic_e", + # "dispersion_e", + # "dipole_m", + # "metal_q", + # "hl_gap", + # "homo_energy" + # "lumo_energy" + # "polarizability" + # "smiles" + + label_names: ["polarizability"] + do_train: True + do_eval: False + do_test: False + + + graph_converter: + __class_name__: FindPointsInSpheres + __init_params__: + cutoff: 4.0 + num_cpus: 10 + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/megnet_tmqm_train_108k_polarizability + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: null #'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "polarizability" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: True # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'epoch' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MEGNetPlus + __init_params__: + dim_node_embedding: 16 + dim_edge_embedding: 100 + dim_state_embedding: 2 + nblocks: 3 + nlayers_set2set: 1 + niters_set2set: 2 + bond_expansion_cfg: + rbf_type: "Gaussian" + initial: 0.0 + final: 5.0 + num_centers: 100 + width: 0.5 + property_name: ${Global.label_names} + +Metric: + polarizability: + __class_name__: paddle.nn.L1Loss #MAEMetric + __init_params__: {} + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: Cosine + __init_params__: + learning_rate: 0.001 + eta_min: 0.0001 + by_epoch: True + +Dataset: + dataset: + __class_name__: TmqmDataset + __init_params__: + path: "./data/tmQM/tmQM.xyz" + path_charge: "./data/tmQM/tmQM_X.q" + path_bond: "./data/tmQM/tmQM_X.BO" + polarizability_key: "polarizability" + # Determine whether to use the data files of charge and bond + use_atomic_charge: True + use_chemical_bonding: True + build_structure_cfg: + format: "ase_atoms" + primitive: false + niggli: false + num_cpus: 1 + build_graph_cfg: ${Global.graph_converter} + cache_path: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4/tmQM" + cache_path_charge: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_charge/tmQM_charge" + cache_path_bond: "./data/tmqm_train_108k_cache_find_points_in_spheres_cutoff_4_bond/tmQM_bond" + num_workers: 4 + use_shared_memory: False + split_dataset_ratio: + train: 0.8 + val: 0.1 + test: 0.1 + transform: + __class_name__: mean_std_scaling + __init_params__: {} + train_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + val_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + test_sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 # 128 for 1 GPUs, total batch size = 128 * 1 = 128 + +Predict: + graph_converter: ${Global.graph_converter} + eval_with_no_grad: True diff --git a/property_prediction/docs/ComFormer_pipline.png b/property_prediction/docs/ComFormer_pipline.png new file mode 100644 index 00000000..625544a3 Binary files /dev/null and b/property_prediction/docs/ComFormer_pipline.png differ diff --git a/property_prediction/docs/DimeNet++.png b/property_prediction/docs/DimeNet++.png new file mode 100644 index 00000000..006c8dac Binary files /dev/null and b/property_prediction/docs/DimeNet++.png differ diff --git a/property_prediction/docs/megnet.png b/property_prediction/docs/megnet.png new file mode 100644 index 00000000..11babefa Binary files /dev/null and b/property_prediction/docs/megnet.png differ diff --git a/property_prediction/example_data/cifs/mp-18767-LiMnO2.cif b/property_prediction/example_data/cifs/mp-18767-LiMnO2.cif new file mode 100644 index 00000000..7e04fa34 --- /dev/null +++ b/property_prediction/example_data/cifs/mp-18767-LiMnO2.cif @@ -0,0 +1,40 @@ +# generated using pymatgen +data_LiMnO2 +_symmetry_space_group_name_H-M 'P 1' +_cell_length_a 2.86877900 +_cell_length_b 4.63447500 +_cell_length_c 5.83250700 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 90.00000000 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 1 +_chemical_formula_structural LiMnO2 +_chemical_formula_sum 'Li2 Mn2 O4' +_cell_volume 77.54484024 +_cell_formula_units_Z 2 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' +loop_ + _atom_type_symbol + _atom_type_oxidation_number + Li+ 1.0 + Mn3+ 3.0 + O2- -2.0 +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Li+ Li0 1 0.50000000 0.50000000 0.37975050 1 + Li+ Li1 1 0.00000000 0.00000000 0.62024950 1 + Mn3+ Mn2 1 0.50000000 0.50000000 0.86325250 1 + Mn3+ Mn3 1 0.00000000 0.00000000 0.13674750 1 + O2- O4 1 0.50000000 0.00000000 0.36082450 1 + O2- O5 1 0.00000000 0.50000000 0.09851350 1 + O2- O6 1 0.50000000 0.00000000 0.90148650 1 + O2- O7 1 0.00000000 0.50000000 0.63917550 1 diff --git a/property_prediction/predict.py b/property_prediction/predict.py new file mode 100644 index 00000000..3866bcba --- /dev/null +++ b/property_prediction/predict.py @@ -0,0 +1,235 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import os.path as osp +from collections import defaultdict +from typing import Optional + +import paddle +import pandas as pd +from omegaconf import OmegaConf +from pymatgen.core import Structure +from tqdm import tqdm + +from ppmat.datasets.transform import build_post_transforms +from ppmat.models import build_graph_converter +from ppmat.models import build_model +from ppmat.models import build_model_from_name +from ppmat.utils import logger +from ppmat.utils import save_load + + +class PropertyPredictor: + """Property predictor. + + This class provides an interface for predicting properties of crystalline + structures using pre-trained deep learning models. Supports two initialization + modes: + + 1. **Automatic Model Loading** + Specify `model_name` and `weights_name` to automatically download + and load pre-trained weights from the `MODEL_REGISTRY`. + + 2. **Custom Model Loading** + Provide explicit `config_path` and `checkpoint_path` to load + custom-trained models from local files. + + Args: + model_name (Optional[str], optional): Name of the pre-defined model architecture + from the `MODEL_REGISTRY` registry. When specified, associated weights + will be automatically downloaded. Defaults to None. + + weights_name (Optional[str], optional): Specific pre-trained weight identifier. + Used only when `model_name` is provided. Valid options include: + - 'best.pdparams' (highest validation performance) + - 'latest.pdparams' (most recent training checkpoint) + - Custom weight files ending with '.pdparams' + Defaults to None. + + config_path (Optional[str], optional): Path to model configuration file (YAML) + for custom models. Required when not using predefined `model_name`. + Defaults to None. + checkpoint_path (Optional[str], optional): Path to model checkpoint file + (.pdparams) for custom models. Required when not using predefined + `model_name`. Defaults to None. + """ + + def __init__( + self, + model_name: Optional[str] = None, + weights_name: Optional[str] = None, + config_path: Optional[str] = None, + checkpoint_path: Optional[str] = None, + ): + # if model_name is not None, then config_path and checkpoint_path must be + # provided + if model_name is None: + assert ( + config_path is not None and checkpoint_path is not None + ), "config_path and checkpoint_path must be provided when model_name is " + "None." + + logger.info(f"Loading model from {config_path} and {checkpoint_path}.") + + config = OmegaConf.load(config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + model = build_model(model_config) + save_load.load_pretrain(model, checkpoint_path) + + else: + logger.info("Since model_name is given, downloading it...") + model, config = build_model_from_name(model_name, weights_name) + + self.model = model + self.config = config + + self.model.eval() + + predict_config = config.get("Predict", None) + self.predict_config = predict_config + self.eval_with_no_grad = predict_config.get("eval_with_no_grad", True) + + self.graph_converter_fn = None + if self.predict_config is not None: + graph_converter_config = predict_config.get("graph_converter", None) + if graph_converter_config is not None: + self.graph_converter_fn = build_graph_converter(graph_converter_config) + + self.post_transforms_cfg = predict_config.get("post_transforms", None) + if self.post_transforms_cfg is not None: + self.post_transforms = build_post_transforms(self.post_transforms_cfg) + else: + self.post_transforms = None + + def graph_converter(self, structure): + if self.graph_converter_fn is None: + return structure + return self.graph_converter_fn(structure) + + def post_process(self, data): + if self.post_transforms is None: + return data + return self.post_transforms(data) + + def from_structures(self, structures): + + data = self.graph_converter(structures) + if self.eval_with_no_grad: + with paddle.no_grad(): + out = self.model.predict(data) + else: + out = self.model.predict(data) + out = self.post_process(out) + return out + + def from_cif_file(self, cif_file_path, save_path=None): + if save_path is not None: + assert save_path.endswith(".csv"), "save_path must end with .csv" + if osp.isdir(cif_file_path): + cif_files = [ + osp.join(cif_file_path, f) + for f in os.listdir(cif_file_path) + if f.endswith(".cif") + ] + results = [] + for cif_file in tqdm(cif_files): + structure = Structure.from_file(cif_file) + result = self.from_structures(structure) + results.append(result) + if save_path is not None: + + keys = list(results[0].keys()) + result_properties = defaultdict(list) + for key in keys: + for r in results: + result_properties[key].append(r[key]) + + # save cif_files and result to csv file + df = pd.DataFrame({"cif_file": cif_files, **result_properties}) + df.to_csv(save_path, index=False) + logger.info(f"Saved the prediction result to {save_path}") + + return results + else: + structure = Structure.from_file(cif_file_path) + result = self.from_structures(structure) + + keys = list(result.keys()) + result_properties = defaultdict(list) + for key in keys: + result_properties[key].append(result[key]) + + if save_path is not None: + df = pd.DataFrame({"cif_file": [cif_file_path], **result_properties}) + df.to_csv(save_path, index=False) + logger.info(f"Saved the prediction result to {save_path}") + + return result + + +if __name__ == "__main__": + + argparse = argparse.ArgumentParser() + argparse.add_argument( + "--model_name", + type=str, + default=None, + help="Model name.", + ) + argparse.add_argument( + "--weights_name", + type=str, + default=None, + help="Weights name, e.g., best.pdparams, latest.pdparams.", + ) + argparse.add_argument( + "--config_path", + type=str, + default=None, + help="Path to the configuration file.", + ) + argparse.add_argument( + "--checkpoint_path", + type=str, + default=None, + help="Path to the checkpoint file.", + ) + argparse.add_argument( + "--cif_file_path", + type=str, + default="./property_prediction/example_data/cifs/", + help="Path to the CIF file whose material properties you want to predict.", + ) + argparse.add_argument( + "--save_path", + type=str, + default="result.csv", + help="Path to save the prediction result.", + ) + args = argparse.parse_args() + + predictor = PropertyPredictor( + model_name=args.model_name, + weights_name=args.weights_name, + config_path=args.config_path, + checkpoint_path=args.checkpoint_path, + ) + + results = predictor.from_cif_file(args.cif_file_path, args.save_path) + print(results) diff --git a/property_prediction/train.py b/property_prediction/train.py new file mode 100644 index 00000000..cde90a56 --- /dev/null +++ b/property_prediction/train.py @@ -0,0 +1,196 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import argparse +import datetime +import os +import os.path as osp + +import paddle.distributed as dist +import paddle.distributed.fleet as fleet +from omegaconf import OmegaConf + +from ppmat.datasets import build_dataloader +from ppmat.datasets import set_signal_handlers +from ppmat.datasets.transform import run_dataset_transform +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.optimizer import build_optimizer +from ppmat.trainer.base_trainer import BaseTrainer +from ppmat.utils import logger +from ppmat.utils import misc + + +def read_independent_dataloader_config(config): + """ + Args: + config (dict): config dict + """ + if config["Global"].get("do_train", True): + train_data_cfg = config["Dataset"].get("train") + assert ( + train_data_cfg is not None + ), "train_data_cfg must be defined, when do_train is true" + train_loader = build_dataloader(train_data_cfg) + else: + train_loader = None + + if config["Global"].get("do_eval", False) or config["Global"].get("do_train", True): + val_data_cfg = config["Dataset"].get("val") + if val_data_cfg is not None: + val_loader = build_dataloader(val_data_cfg) + else: + logger.info("No validation dataset defined.") + val_loader = None + else: + val_loader = None + + if config["Global"].get("do_test", False): + test_data_cfg = config["Dataset"].get("test") + assert ( + test_data_cfg is not None + ), "test_data_cfg must be defined, when do_test is true" + test_loader = build_dataloader(test_data_cfg) + else: + test_loader = None + return train_loader, val_loader, test_loader + + +if __name__ == "__main__": + if dist.get_world_size() > 1: + fleet.init(is_collective=True) + + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config", + type=str, + default="./property_prediction/configs/comformer/comformer_mp2018_train_60k_e_form.yaml", + help="Path to config file", + ) + + args, dynamic_args = parser.parse_known_args() + + # load config and merge with cli args + config = OmegaConf.load(args.config) + cli_config = OmegaConf.from_dotlist(dynamic_args) + config = OmegaConf.merge(config, cli_config) + + # set random seed + seed = config["Trainer"].get("seed", 42) + misc.set_random_seed(seed) + logger.info(f"Set random seed to {seed}") + + # add timestamp to output_dir + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + base_output_dir = config["Trainer"]["output_dir"] + config["Trainer"]["output_dir"] = f"{base_output_dir}_t_{timestamp}_s_{seed}" + + # save config to output_dir, only rank 0 process will do this + if dist.get_rank() == 0: + os.makedirs(config["Trainer"]["output_dir"], exist_ok=True) + config_name = os.path.basename(args.config) + OmegaConf.save(config, osp.join(config["Trainer"]["output_dir"], config_name)) + # convert to dict + config = OmegaConf.to_container(config, resolve=True) + + # init logger + logger_path = osp.join(config["Trainer"]["output_dir"], "run.log") + logger.init_logger(log_file=logger_path) + logger.info(f"Logger saved to {logger_path}") + + # build dataloader from config + set_signal_handlers() + if config["Dataset"].get("split_dataset_ratio") is not None: + # Split the dataset into train/val/test and build corresponding dataloaders + loader = build_dataloader(config["Dataset"]) + train_loader = loader.get("train", None) + val_loader = loader.get("val", None) + test_loader = loader.get("test", None) + else: + # Use pre-split (independent) train/val/test datasets and build dataloaders + train_loader, val_loader, test_loader = read_independent_dataloader_config( + config + ) + + # build model from config + model_cfg = config["Model"] + + # scaling dataset + if "transform" in config["Dataset"] and config["Global"].get("do_train", False): + dataset_trans_cfg = config["Dataset"].get("transform") + if dataset_trans_cfg is not None: + trans_func = dataset_trans_cfg.pop("__class_name__") + trans_parms = dataset_trans_cfg.pop("__init_params__") + logger.info(f"Using transform function: {trans_func}") + else: + trans_func = "no_scaling" + trans_parms = {} + logger.warning("No transform specified, using 'no_scaling' instead.") + # TODO: To temporarily use functional calling methods, transform should be + # wrapped as a class and called using the build method + data_mean, data_std = run_dataset_transform( + trans_func, train_loader, config["Global"]["label_names"], **trans_parms + ) + logger.info( + f"Target is {config['Global']['label_names']}, data mean is {data_mean}, " + f"data std is {data_std}" + ) + model_cfg["__init_params__"]["data_mean"] = data_mean + model_cfg["__init_params__"]["data_std"] = data_std + + model = build_model(model_cfg) + + # build optimizer and learning rate scheduler from config + if config.get("Optimizer") is not None and config["Global"].get("do_train", True): + assert ( + train_loader is not None + ), "train_loader must be defined when optimizer is defined." + assert ( + config["Trainer"].get("max_epochs") is not None + ), "max_epochs must be defined when optimizer is defined." + optimizer, lr_scheduler = build_optimizer( + config["Optimizer"], + model, + config["Trainer"]["max_epochs"], + len(train_loader), + ) + else: + optimizer, lr_scheduler = None, None + + # build metric from config + metric_cfg = config.get("Metric") + if metric_cfg is not None: + metric_func = build_metric(metric_cfg) + else: + metric_func = None + + # initialize trainer + trainer = BaseTrainer( + config["Trainer"], + model, + train_dataloader=train_loader, + val_dataloader=val_loader, + optimizer=optimizer, + lr_scheduler=lr_scheduler, + compute_metric_func_dict=metric_func, + ) + + if config["Global"].get("do_train", True): + trainer.train() + if config["Global"].get("do_eval", False): + logger.info("Evaluating on validation set") + time_info, loss_info, metric_info = trainer.eval(val_loader) + if config["Global"].get("do_test", False): + logger.info("Evaluating on test set") + time_info, loss_info, metric_info = trainer.eval(test_loader) diff --git a/requirements.txt b/requirements.txt index d3ebc5b6..0c8da8a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,13 +1,37 @@ +ase==3.23.0 colorlog==6.8.2 -matplotlib==3.9.0 -numpy==2.0.0 -paddlepaddle_gpu==2.6.1 -pandas==2.2.2 -pgl==2.2.3 -pymatgen==2024.6.10 -PyYAML==6.0.1 -PyYAML==6.0.1 -scipy==1.14.0 +Cython==3.0.12 +hydra-core==1.3.2 +einops==0.8.0 +importlib_metadata==8.6.1 +jarvis_tools==2025.5.30 +lmdb==1.7.5 +lz4==4.4.5 +matminer==0.9.2 +numpy==1.26.4 +omegaconf==2.3.0 +omegaconf==2.3.0 +p_tqdm==1.4.0 +packaging==25.0 +pandas==2.3.0 +pgl==2.2.6 +Pillow==11.1.0 +pyarrow==15.0.2 +pymatgen==2024.10.29 +pymatgen_analysis_defects==2025.1.18 +pymatgen_analysis_diffusion==2024.7.15 +pyparsing==3.2.3 +pytest==8.3.5 +rdkit==2024.9.1 +Requests==2.32.4 +scikit_learn==1.7.0 +scipy==1.13.1 +setuptools==68.2.2 +setuptools-scm==8.3.1 +SMACT==2.5.5 sympy==1.12.1 +tensorboardX==2.6.2.2 tqdm==4.66.4 -typing_extensions==4.12.2 +typing_extensions==4.14.0 +visualdl==2.5.3 +wandb==0.18.3 diff --git a/research/DiffNMR/README.md b/research/DiffNMR/README.md new file mode 100644 index 00000000..345c3a6b --- /dev/null +++ b/research/DiffNMR/README.md @@ -0,0 +1,155 @@ +# DiffNMR + +[DiffNMR: Diffusion Models for Nuclear Magnetic Resonance Spectra Elucidation](https://doi.org/10.48550/arXiv.2507.08854) + +**Qingsong Yang**#, **Binglan Wu**#, \*\*Xuwei Liu, Bo Chen, Wei Li, Gen Long, Xin Chen, Mingjun Xiao + +1 Department of Computer Science, University of Science and Technology of China (USTC) + +2 Suzhou Laboratory + +3 Baidu Inc. + +# Equal contribution · Corresponding authors + +--- + +## Abstract + +DiffNMR is an end-to-end framework that infers **molecular structures directly from 1H/13C NMR spectra** using a **conditional discrete diffusion model**. It holistically refines molecular graphs through denoising steps (instead of autoregressive token-by-token generation), improving global consistency and reducing error accumulation. The system couples a **two-stage pretraining** pipeline—(i) **Diffusion Autoencoder (Diff-AE)** for molecular representation + graph decoder pretraining and (ii) **contrastive alignment** between spectra and molecular representations—with a domain-tailored **NMR encoder** that leverages **RBF encodings** for chemical shifts and coupling constants. Inference further benefits from **similarity-based filtering** and optional **retrieval-initialized sampling**, yielding strong Top‑k accuracy and high Tanimoto similarity across molecule sizes. + +![DiffNMR Overview](https://paddle-org.bj.bcebos.com/paddlematerials/docs/diffnmr_overview.png) + +--- + +## Highlights + +* **End-to-end spectrum→structure** on 1H & 13C NMR. +* **Discrete graph diffusion** (denoise molecular graphs instead of autoregressive SMILES). +* **NMR encoder** with **RBF** embeddings for shifts (and J-coupling) + learnable embeddings for multiplicity & integrals; **bi-directional cross‑attention** to fuse 1H/13C information. +* **Two-stage pretraining**: Diff‑AE (molecular encoder + graph diffusion decoder) → **contrastive learning** to align NMR & molecular spaces. +* **Inference enhancements**: **similarity filtering** (cosine scoring in latent space) and **retrieval‑initialized sampling**. + +--- + +## Dataset & Metrics + +* **MSD multimodal spectroscopic dataset**: \~7.9e5 molecules (from USPTO), each with simulated **1H NMR**, **13C NMR**, **HSQC**, **IR**, **MS**; molecules span **5–35 heavy atoms**. +* **Evaluation**: **Top‑k accuracy** (exact‑match structure among top candidates) and **Tanimoto similarity** (Morgan fp, radius 2, 2048 bits). + +> Observations +> +> * **1H+13C** outperforms single‑modality inputs. +> * Providing **molecular formula** improves accuracy across sizes. +> * **Similarity filtering** and **retrieval initialization** substantially boost Top‑1 accuracy and average Tanimoto, especially for larger molecules. + +--- + +## Method at a Glance + +**Architecture** + +* **Molecular encoder** (graph transformer) → compact molecular representation. +* **Graph diffusion decoder** (discrete denoising on nodes/edges). +* **NMR encoder**: RBF(δ) for shifts; embeddings for multiplicity/integrals; RBF(J) for couplings; transformers per modality; **bi‑directional cross‑attention** (1H↔13C); pooled & fused to a conditioning vector. + +**Training** + +1. **Stage‑1: Diff‑AE** — pretrain molecular encoder + diffusion decoder via reconstruction. +2. **Stage‑2: Contrastive** — freeze molecular encoder; train NMR encoder to align to the molecular space with **InfoNCE**. +3. **Fine‑tuning** — end‑to‑end spectra→graph with diffusion decoder conditioned on NMR embedding. + +**Inference** + +* **Similarity filtering**: rank sampled candidates by cosine similarity between predicted molecule & input NMR embeddings. +* **Retrieval initialization** (start from nearest neighbor in latent space) improves Top‑1 accuracy. +* **Use formula** outputs atoms enforced to reset according to formula. + +--- + +## Results (summary) + +* **1H+13C** achieves the best Top‑1/Top‑k; adding **molecular formula** improves all sizes (≤15/≤20/≤25 HAC). +* **Similarity filtering** and **retrieval initialization** notably improve **Top‑1** and **avg. Tanimoto**, with the largest gains on higher HAC. + +![Results Table1](https://paddle-org.bj.bcebos.com/paddlematerials/docs/DiffNMR_Table1.png) +![Results Table2](https://paddle-org.bj.bcebos.com/paddlematerials/docs/DiffNMR_Table2.png) + +--- + +## Repository Layout + +``` +PaddleMaterials/ + spectrum_elucidation/ + configs/DiffNMR/ + DiffNMR_DiffGraphFormer.yaml + DiffNMR_NMRNet.yaml + DiffNMR.yaml + train.py + sample.py +``` + +--- + +## How to Use +Refer to the [install doc](../../Install.md) to install PaddleMaterials. + +### 1. Prepare Vocabulary Table & Retrieval Database: +```bash +cd spectrum_elucidation +wget https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/vocab.tar.gz +tar -xvf vocab.tar.gz +wget https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/retrival_database.zip +unzip retrival_database.zip +``` + +### 2. Generate molecular structures from NMR spectra with DiffNMR: +```bash +cd pretrained +wget https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_nless15_best.pdparams +cd .. +python spectrum_elucidation/sample.py --config_path='spectrum_elucidation/configs/diffnmr/DiffNMR.yaml' --weights_name='DiffNMR_nless15_best.pdparams' --save_path='result_diffnmr_nless15/' --checkpoint_path="pretrained" +``` + +### 3. Generate molecular structures with Retrieval-initializion/Similarity Filtering/Formula: +revise the `spectrum_elucidation/configs/diffnmr/DiffNMR.py` and replace the following arguments according to your needs: +```yaml +flag_retrival_sampling: True +flag_use_formula: True +flag_retrival_initilization: True +num_candidates: 1 # recommend set to 20 for retrieval-sampling similarity filtering +``` +run the command reference to step 2. + +--- + +## Citation + +If you use DiffNMR, please cite: + +```bibtex +@misc{yang2025diffnmr, + title = {DiffNMR: Diffusion Models for Nuclear Magnetic Resonance Spectra Elucidation}, + author = {Yang, Qingsong and Wu, Binglan and Liu, Xuwei and Chen, Bo and Li, Wei and Long, Gen and Chen, Xin and Xiao, Mingjun}, + year = {2025}, + eprint = {2507.08854}, + archivePrefix = {arXiv}, + primaryClass = {physics.chem-ph}, + doi = {10.48550/arXiv.2507.08854}, + url = {https://arxiv.org/abs/2507.08854} +} +``` + +--- + +## License + +This repository is released under the Apache-2.0 license (unless otherwise stated). See `LICENSE` for details. + +## Acknowledgements + +Supported by the National Science and Technology Major Project (2023ZD0120702) and Basic Research Program of Jiangsu (BK20231215). We thank contributors of PaddlePaddle & PaddleMaterials + +--- + diff --git a/research/ML2DDB/README.md b/research/ML2DDB/README.md new file mode 100644 index 00000000..f4d4e910 --- /dev/null +++ b/research/ML2DDB/README.md @@ -0,0 +1,129 @@ +# ML2DDB + +[Monolayer Two-dimensional Materials Database (ML2DDB) and Applications](https://arxiv.org/pdf/2507.00584) + +Zhongwei Liua, b, #, +Zhimin Zhangc, #, +Xuwei Liuc, #, +Mingjia Yaob, +Xin Hea, +Yuanhui Sunb, *, +Xin Chenb, *, +Lijun Zhanga, b, * + +a +State Key Laboratory of Integrated Optoelectronics, Key Laboratory of Automobile Materials of MOE and College of Materials Science and Engineering, Jilin University, Changchun 130012, China + +b Suzhou Laboratory, Suzhou, 215123, China + +c Baidu Inc., Beijing, P.R. China. + +# These authors contributed equally to this work. + +E-mail: sunyh@szlab.ac.cn; chenx01@szlab.ac.cn; lijun_zhang@jlu.edu.cn + +## Abstract + +The discovery of two-dimensional (2D) materials with tailored properties is critical to meet the increasing demands of high-performance applications across flexible electronics, optoelectronics, catalysis, and energy storage. However, current 2D material databases are constrained by limited scale and compositional diversity. In this study, we introduce a scalable active learning workflow that integrates deep neural networks with density functional theory (DFT) calculations to efficiently explore a vast set of candidate structures. These structures are generated through physics-informed elemental substitution strategies, enabling broad and systematic discovery of stable 2D materials. Through six iterative screening cycles, we established the creation of the Monolayer 2D Materials Database (ML2DDB), which contains 242,546 DFT-validated stable structures—an order-of-magnitude increase over the largest known 2D materials databases. In particular, the number of ternary and quaternary compounds showed the most significant increase. Combining this database with a generative diffusion model, we demonstrated effective structure generation under specified chemistry and symmetry constraints. This work accomplished an organically interconnected loop of 2D material data expansion and application, which provides a new paradigm for the discovery of new materials. + +![ML2DDB](https://paddle-org.bj.bcebos.com/paddlescience/docs/ML2DDB/ml2ddb.png) + +## Dataset of 2D materials + +We developed ML2DDB, a large-scale 2D material database containing >242k DFT-validated monolayer structures (𝐸hull𝐷𝐹𝑇 <50 meV/atom), representing a 10× increase over existing datasets. Key features: + +- Broad elemental coverage: 81 elements across the periodic table (excluding radioactive/noble gases). +- Enhanced diversity: Significantly more compounds with 3–4 distinct elements compared to prior work. +- Structural richness: Diverse prototypes and cation-anion combinations. +- Extended resource: >1M candidate structures (𝐸hullMLIP <200 meV/atom) for future studies. + +![dataset](https://paddle-org.bj.bcebos.com/paddlescience/docs/ML2DDB/ml2ddb_dataset.png) + +## Diffusion model generation of S.U.N. materials + +The capability to generate S.U.N. (stable, unique, new) 2D materials are prerequisites for diffusion models. We considered a generated structure as stable with 𝐸hull𝐷𝐹𝑇 < 100 meV/atom with respect to ML2DDB. The unique is specified whether a generated structure matches any other structure generated in the same batch or not, and the new is whether it is identical to any of the structures in ML2DDB. As shown in Figure 5b, we performed DFT structure optimization on 1024 structures to evaluate the stable attribute. The results show that 74.8% of them are considered stable (𝐸hull𝐷𝐹𝑇 < 100 meV/atom), which is comparable to the success rate of 3D stable structure generation of MatterGen. When the constraint is set to 𝐸hull𝐷𝐹𝑇 < 0 meV/atom, our method achieved a success rate of 59.6%, which is significantly higher than that of MatterGen (~13%). In addition, the Root-mean-square displacement (RMSD) of the generated structure is lower than 0.26 Å compared to the DFT relaxation structure, which is still less than the radius of the hydrogen atom (0.53 Å). For the generation of unique structures, the success rate accounts for 100% when generating one thousand structures. The rate only decreases 4.4% when generating ten thousand structures. For the generation of new structures, the rate decreases from 100% to 73.5% when the generated structures grow from one thousand to two thousand. This indicates that our model has a relatively excellent ability to generate completely new stable structures. + +![dataset](https://paddle-org.bj.bcebos.com/paddlescience/docs/ML2DDB/gen_2d.png) + +## Conclusion + +This study establishes a novel framework integrating active learning workflows with conditional diffusion-based structural generation, achieving unprecedented expansion of 2D materials databases. Key contributions include: + +1. **Dataset Advancement** + - Created ML2DDB containing >242,546 thermodynamically stable 2D materials (E_hull^DFT <50 meV/atom), exceeding existing databases by ≥10x + - Achieved 1100% and 960% growth in ternary/quaternary compounds respectively + - Generated >1 million candidate structures (𝐸hullMLIP <200 meV/atom) +2. **Methodological Innovation** + - Developed MLIP model with 92.36% accuracy in stability classification + - Enabled phase diagram generation and space group-specific design through diffusion model integration + - Demonstrated applicability to nonlinear optical and ferroelectric materials discovery + + +## How to use + +Refer to the [install doc](../../Install.md) to install PaddleMaterials. + +#### 1. Generate new 2D materials: + ```bash + python structure_generation/sample.py --model_name='mattergen_ml2ddb' --mode='by_dataloader' --save_path='results_mattergen_ml2ddb' + ``` + You can download the pre-trained model from [here](https://paddle-org.bj.bcebos.com/paddlematerial/workflow/ml2ddb/mattergen_ml2ddb.zip) and modify the `total_num` parameter in the configuration file to generate more structures. + + ```bash + ... + Sample: + data: + dataset: + ... + total_num: 16 + ... + ``` + Then you can generate more structures: + ```bash + python structure_generation/sample.py --config_path='your config path after modify' --checkpoint_path='your downloaded checkpoint path(*.pdparams)' --mode='by_dataloader' --save_path='results_mattergen_ml2ddb' + ``` + + +#### 2. Generate new 2D materials with specific chemical system: + ```bash + python structure_generation/sample.py --model_name='mattergen_ml2ddb_chemical_system' --mode='by_dataloader' --save_path='results_mattergen_ml2ddb_chemical_system' + ``` + The above command will generate structures with specific chemical system `Si` and `Mo`, if you want to generate structures with other chemical systems, you can download the pre-trained model from [here](https://paddle-org.bj.bcebos.com/paddlematerial/workflow/ml2ddb/mattergen_ml2ddb_chemical_system.zip) and modify the `prop_values` parameter in the configuration file. + + ```bash + ... + Sample: + data: + dataset: + ... + prop_values: ['Mo-Si'] + ... + ``` + Then you can generate structures with specific chemical system: + ```bash + python structure_generation/sample.py --config_path='your config path after modify' --checkpoint_path='your downloaded checkpoint path(*.pdparams)' --mode='by_dataloader' --save_path='results_mattergen_ml2ddb_chemical_system' + ``` + + +#### 3. Generate new 2D materials with specific space group: + ```bash + python structure_generation/sample.py --model_name='mattergen_ml2ddb_space_group' --mode='by_dataloader' --save_path='results_mattergen_ml2ddb_space_group' + ``` + The above command will generate structures with specific space group `11`, if you want to generate structures with other space groups, you can download the pre-trained model from [here](https://paddle-org.bj.bcebos.com/paddlematerial/workflow/ml2ddb/mattergen_ml2ddb_space_group.zip) and modify the `prop_values` parameter in the configuration file. + + ```bash + ... + Sample: + data: + dataset: + ... + prop_values: [11] + ... + ``` + Then you can generate structures with specific space group: + ```bash + python structure_generation/sample.py --config_path='your config path after modify' --checkpoint_path='your downloaded checkpoint path(*.pdparams)' --mode='by_dataloader' --save_path='results_mattergen_ml2ddb_space_group' + ``` + + +**Notice:** The ML2DDB dataset, along with the property prediction model built upon it and the corresponding workflow scripts, will be released soon. diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..a1a71aa2 --- /dev/null +++ b/setup.py @@ -0,0 +1,69 @@ +import numpy as np +import setuptools +from Cython.Build import cythonize +from setuptools import Extension + +""" +Setup configuration +""" + + +extensions = [ + Extension( + "ppmat.models.mattersim.threebody_indices", + ["ppmat/models/mattersim/threebody_indices.pyx"], + include_dirs=[np.get_include()], + ) +] + + +def get_readme() -> str: + """get README""" + with open("README.md", encoding="utf-8") as f: + return f.read() + + +def get_requirements() -> list: + """get requirements from PaddleMaterials/requirements.txt""" + req_list = [] + with open("requirements.txt", "r") as f: + req_list = f.read().splitlines() + return req_list + + +if __name__ == "__main__": + setuptools.setup( + name="ppmat", + author="PaddlePaddle", + url="https://github.com/PaddlePaddle/PaddleMaterials", + description=( + "PaddleMaterials is a data-driven deep learning toolkit based on " + "PaddlePaddle for material science." + ), + long_description=get_readme(), + long_description_content_type="text/markdown", + packages=setuptools.find_packages( + exclude=( + "docs", + "examples", + "jointContribution", + "test", + "interatomic_potentials", + "property_prediction", + "structure_generation", + ) + ), + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + ], + install_requires=get_requirements(), + use_scm_version=True, + setup_requires=["setuptools_scm"], + ext_modules=cythonize(extensions), + ) diff --git a/spectrum_elucidation/README.md b/spectrum_elucidation/README.md new file mode 100644 index 00000000..fe32e880 --- /dev/null +++ b/spectrum_elucidation/README.md @@ -0,0 +1,48 @@ +# SE-Spectrum Elucidation + +## 1.Introduction + +Spectrum Elucidation(SE) focuses on automatically (or semi‑automatically) deducing molecular scaffolds, functional groups, and 3‑D conformations of organic materials from multimodal spectral data—typically 1D/2D NMR, IR, Raman, and MS. The workflow combines experimental spectroscopy, cheminformatics, and machine learning. Efficient spectrum elucidation dramatically shortens the discovery cycle for organic semiconductors, optoelectronic materials, and functional polymers while reducing synthesis‑and‑test costs. + +## 2.Model Matrix + +| **Supported Functions** | **🌟[DiffNMR](./configs/diffnmr/README.md)** | **[AtomSegNet](./configs/atomsegnet/README.md)** | +| -------------------------------------------- | :------------------------------------------: | :----------------------------------------------: | +| **Support Material Types** | | | +| Organic Materials | ✅ | | +| Inorganic Materials | - | ✅ | +| **Inverse Elucidate Molecules** | | | +| NMR to Molecular Structure | ✅ | - | +| **Inverse Elucidate Crystalline** | | - | +| STEM to Crystatl Structures | - | - | +| XRD to Crystatl Structures | - | - | +| Atom segmentation | - | - | +| **ML Capabilities · Training** | | - | +| Single-GPU | ✅ | - | +| Distributed training | ✅ | - | +| Mixed precision (AMP) | — | - | +| Fine-tuning | ✅ | - | +| Uncertainty / Active Learning | — | - | +| Dynamic→Static graphs | — | - | +| Compiler (CINN) opt. | — | - | +| **ML Capabilities · Predict** | | | +| Distillation / Pruning | — | - | +| Standard inference | ✅ | - | +| Distributed inference | — | - | +| Compiler-level inference | — | - | +| Retrival initilization | ✅ | - | +| Similarity filter | ✅ | - | +| Formula included | ✅ | - | +| **Datasets** | | | +| **Multimodal Spectroscopic** | | | +| NMR(Nuclear Magnetic Resonance) | ✅ | - | +| n<15 | ✅ | - | +| n<20 | ✅ | - | +| n<25 | ✅ | - | +| n<35 | ✅ | - | +| IR(InfraRed) | - | - | +| MS(Mass Spectrum) | - | - | +| **TEMImageNet** | - | - | + + +**Notice**:🌟 represent originate research work published from paddlematerial toolkit diff --git a/spectrum_elucidation/configs/diffnmr/DiffNMR.yaml b/spectrum_elucidation/configs/diffnmr/DiffNMR.yaml new file mode 100644 index 00000000..00fcc8d8 --- /dev/null +++ b/spectrum_elucidation/configs/diffnmr/DiffNMR.yaml @@ -0,0 +1,299 @@ +Global: + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 500 + + molecule_converter: + format: "smiles" + sanitize: False + add_hs: False + remove_hs: False + kekulize: False + num_cpus: 10 + + graph_converter: + __class_name__: MolecularGraphConverter + __init_params__: + atom_vocab: {"C": 0, "N":1, "O": 2, "F": 3, "P": 4, "S": 5, "Cl": 6, "Br": 7, "I": 8} # {H: 0, C: 1, N: 2, O: 3, F: 4, P: 5, S: 6, Cl: 7, Br: 8, I: 9} + bond_vocab: {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3} + remove_h: true + add_self_loops: false + edge_mode: bidirectional + num_cpus: 10 + + spectrum_converter: + __class_name__: BuildSpectrumNMR + __init_params__: + seq_len_H1: 20 # 1H spectrum sequence length + seq_len_C13: 75 # 13C spectrum sequence length + j_len: 6 # J-coupling dimension + integral_offset: 1 # Integral offset + unk_token: "" # Unknown token identifier + dtype: "float32" # Data type + num_cpus: 10 # Number of parallel threads + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/DiffNMR/DiffNMR + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: # please set your pretrained model path here when run trainer.test + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + # visualdl log dict + out_dict: + loss: + train: ["loss"] + eval: ["loss"] + metric: + train: [] + eval: ["val_nll"] + sample: ["Accuracy"] + +Sampler: + sample_every_val: 500 + visual_num: 10 # number of visualize molecules in the sample + chains_to_save: 5 # less sample batch size, select representative sample in sample batch for visualize + number_chain_steps: 10 # Number of frames in each gif + sample_batch_iters: 100 # Number of sample batches + flag_retrival_sampling: False + flag_use_formula: False + flag_retrival_initilization: False + num_candidates: 1 + retrival_database_path: ./spectrum_elucidation/retrival_database/mol_rep_15.csv + pretrained_model_path: ./pretrained/DiffNMR_nless15_best.pdparams + output_dir: ./output/DiffNMR/DiffNMR/sample + out_dict: {"Accuracy"} + data: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 256 + + +Model: + __class_name__: DiffNMR + __init_params__: + encoder_cfg: + __name__: NMRNetCLIP + pretrained_path: "./pretrained/DiffNMR_NMRNet_nless15_best.pdparams" + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.0 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + onlyH: False # True if set NMRNet only encode H Spectrum info + decoder_cfg: + __name__: DiffGraphFormer + pretrained_path: "./pretrained/DiffNMR_DiffGraphFormer_nless15_best.pdparams" + hidden_mlp_dims: { + 'X': 256, + 'E': 128, + 'y': 256 + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256 + } + num_layers: 5 + vocab_dim: 256 + diffmodel_cfg: + type: 'discrete_condition' + transition: 'marginal' # uniform or marginal + model: 'graph_tf' + diffusion_steps: 500 + diffusion_noise_schedule: 'cosine' # 'cosine', 'polynomial_2' + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + lambda_train: [5, 0] + conditdim: 512 + + +CLIP: + __class_name__: NMRNetCLIP + __init_params__: + spectrum_encoder: + pretrained_model_path: "./pretrained/DiffNMR_NMRNet_nless15_best.pdparams" + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.1 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + graph_encoder: + pretrained_model_path: "./pretrained/DiffNMR_DiffGraphFormer_nless15_best.pdparams" + n_layers_GT: 5 + hidden_mlp_dims: { + "X": 256, + "E": 128, + "y": 256, + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256, + } + diffmodel_cfg: # to be deleted + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 + +Optimizer: + __class_name__: AdamW + __init_params__: + beta1: 0.9 + beta2: 0.999 + weight_decay: 1e-12 + amsgrad: True + epsilon: 1e-8 + lr: 0.0002 + +Metric: + __class_name__: DiffNMRStreamingAdapter + __init_params__: + dataset_infos: null # insert by Trainer when runtime + +Dataset: + train: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/train.csv" + datadir: "./data/MSD_nmr" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + val: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/val.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + test: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 256 + +DataInfo: + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 \ No newline at end of file diff --git a/spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml b/spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml new file mode 100644 index 00000000..8d9a486d --- /dev/null +++ b/spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml @@ -0,0 +1,295 @@ +Global: + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 500 + + molecule_converter: + format: "smiles" + sanitize: False + add_hs: False + remove_hs: False + kekulize: False + num_cpus: 10 + + graph_converter: + __class_name__: MolecularGraphConverter + __init_params__: + atom_vocab: {"C": 0, "N":1, "O": 2, "F": 3, "P": 4, "S": 5, "Cl": 6, "Br": 7, "I": 8} # {H: 0, C: 1, N: 2, O: 3, F: 4, P: 5, S: 6, Cl: 7, Br: 8, I: 9} + bond_vocab: {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3} + remove_h: true + add_self_loops: false + edge_mode: bidirectional + num_cpus: 10 + + spectrum_converter: + __class_name__: BuildSpectrumNMR + __init_params__: + seq_len_H1: 20 # 1H spectrum sequence length + seq_len_C13: 75 # 13C spectrum sequence length + j_len: 6 # J-coupling dimension + integral_offset: 1 # Integral offset + unk_token: "" # Unknown token identifier + dtype: "float32" # Data type + num_cpus: 10 # Number of parallel threads + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/DiffNMR/DiffGraphFormer + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: ./pretrained/DiffNMR_DiffGraphFormer_nless15_init.pdparams # please set your pretrained model path here when run trainer.test + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_metric' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "val_nll" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + # visualdl log dict + out_dict: + loss: + train: ["loss"] + eval: ["loss"] + metric: + train: [] + eval: ["val_nll"] + +Sampler: + sample_every_val: 500 + visual_num: 10 # number of visualize molecules in the sample + chains_to_save: 5 # less sample batch size, select representative sample in sample batch for visualize + number_chain_steps: 10 # Number of frames in each gif + sample_batch_iters: 1 # Number of sample batches + flag_retrival_sampling: False + flag_use_formula: False + flag_retrival_initilization: False + num_candidates: 1 + retrival_database_path: ./spectrum_elucidation/retrival_database/mol_rep_15.csv + pretrained_model_path: ./pretrained/DiffNMR_DiffGraphFormer_nless15_best.pdparams + output_dir: ./output/DiffNMR/DiffGraphFormer/sample + out_dict: {"Accuracy"} + data: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 8 + + +Model: + __class_name__: MolecularGraphFormer + __init_params__: + encoder_cfg: + hidden_mlp_dims: { + 'X': 256, + 'E': 128, + 'y': 256 + } + hidden_dims: { + 'dx': 256, # The dimensions should satisfy dx % n_head == 0 + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256 + } + num_layers: 5 + decoder_cfg: + hidden_mlp_dims: { + 'X': 256, + 'E': 128, + 'y': 256 + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256 + } + num_layers: 5 + diffmodel_cfg: + type: 'discrete_condition' + transition: 'marginal' # uniform or marginal + model: 'graph_tf' + diffusion_steps: 500 + diffusion_noise_schedule: 'cosine' # 'cosine', 'polynomial_2' + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + lambda_train: [5, 0] + conditdim: 512 + flag_use_formula: ${Sampler.flag_use_formula} + +CLIP: + __class_name__: NMRNetCLIP + __init_params__: + spectrum_encoder: + pretrained_model_path: "./pretrained/DiffNMR_NMRNet_nless15_best.pdparams" + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.1 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + graph_encoder: + pretrained_model_path: "./pretrained/DiffNMR_DiffGraphFormer_nless15_best.pdparams" + n_layers_GT: 5 + hidden_mlp_dims: { + "X": 256, + "E": 128, + "y": 256, + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256, + } + diffmodel_cfg: # to be deleted + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 + +Optimizer: + __class_name__: AdamW + __init_params__: + beta1: 0.9 + beta2: 0.999 + weight_decay: 1e-12 + amsgrad: True + epsilon: 1e-8 + lr: 0.0002 + +Metric: + __class_name__: DiffNMRStreamingAdapter + __init_params__: + dataset_infos: null # insert by Trainer when runtime + +Dataset: + train: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/train.csv" + datadir: "./data/MSD_nmr" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + val: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/val.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + test: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 256 + +DataInfo: + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 \ No newline at end of file diff --git a/spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml b/spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml new file mode 100644 index 00000000..c917c229 --- /dev/null +++ b/spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml @@ -0,0 +1,216 @@ +Global: + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 500 + + molecule_converter: + format: "smiles" + sanitize: False + add_hs: False + remove_hs: False + kekulize: False + num_cpus: 10 + + graph_converter: + __class_name__: MolecularGraphConverter + __init_params__: + atom_vocab: {"C": 0, "N":1, "O": 2, "F": 3, "P": 4, "S": 5, "Cl": 6, "Br": 7, "I": 8} # {H: 0, C: 1, N: 2, O: 3, F: 4, P: 5, S: 6, Cl: 7, Br: 8, I: 9} + bond_vocab: {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3} + remove_h: true + add_self_loops: false + edge_mode: bidirectional + num_cpus: 10 + + spectrum_converter: + __class_name__: BuildSpectrumNMR + __init_params__: + seq_len_H1: 20 # 1H spectrum sequence length + seq_len_C13: 75 # 13C spectrum sequence length + j_len: 6 # J-coupling dimension + integral_offset: 1 # Integral offset + unk_token: "" # Unknown token identifier + dtype: "float32" # Data type + num_cpus: 10 # Number of parallel threads + +Trainer: + # Max epochs to train + max_epochs: 500 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/DiffNMR/NMRNet + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null # please set your pretrained model path here when run trainer.test + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + # visualdl log dict + out_dict: + loss: + train: ["loss"] + eval: ["loss"] + metric: + train: [] + eval: ["val_nll"] + sample: ["Accuracy"] + +Model: + __class_name__: NMRNetCLIP + __init_params__: + spectrum_encoder: + pretrained_model_path: null + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.1 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + graph_encoder: + pretrained_model_path: "./output/DiffNMR/DiffGraphFormer/checkpoints/latest.pdparams" + n_layers_GT: 5 + hidden_mlp_dims: { + "X": 256, + "E": 128, + "y": 256, + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256, + } + diffmodel_cfg: # to be deleted + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 + + +Optimizer: + __class_name__: AdamW + __init_params__: + beta1: 0.9 + beta2: 0.999 + weight_decay: 1e-12 + amsgrad: True + epsilon: 1e-8 + lr: 0.0002 + +Metric: + __class_name__: DiffNMRStreamingAdapter + __init_params__: + dataset_infos: null # insert by Trainer when runtime + +Dataset: + train: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/train.csv" + datadir: "./data/MSD_nmr" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + val: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/val.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + test: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 256 + +DataInfo: + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 \ No newline at end of file diff --git a/spectrum_elucidation/configs/diffnmr/PP-DiffNMR.yaml b/spectrum_elucidation/configs/diffnmr/PP-DiffNMR.yaml new file mode 100644 index 00000000..82fda86b --- /dev/null +++ b/spectrum_elucidation/configs/diffnmr/PP-DiffNMR.yaml @@ -0,0 +1,326 @@ +Global: + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 500 + + molecule_converter: + format: "smiles" + sanitize: False + add_hs: False + remove_hs: False + kekulize: False + num_cpus: 10 + + graph_converter: + __class_name__: MolecularGraphConverter + __init_params__: + atom_vocab: {"C": 0, "N":1, "O": 2, "F": 3, "P": 4, "S": 5, "Cl": 6, "Br": 7, "I": 8} # {H: 0, C: 1, N: 2, O: 3, F: 4, P: 5, S: 6, Cl: 7, Br: 8, I: 9} + bond_vocab: {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3} + remove_h: true + add_self_loops: false + edge_mode: bidirectional + num_cpus: 10 + + spectrum_converter: + __class_name__: BuildSpectrumNMR + __init_params__: + seq_len_H1: 20 # 1H spectrum sequence length + seq_len_C13: 75 # 13C spectrum sequence length + j_len: 6 # J-coupling dimension + integral_offset: 1 # Integral offset + unk_token: "" # Unknown token identifier + dtype: "float32" # Data type + num_cpus: 10 # Number of parallel threads + +Trainer: + # Max epochs to train + max_epochs: 1000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/DiffNMR_CHnmr/DiffGraphFormer/train + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: # please set your pretrained model path here when run trainer.test + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + # visualdl log dict + out_dict: + loss: + train: ["loss"] + eval: ["loss"] + metric: + train: [] + eval: ["val_nll"] + sample: ["Accuracy"] + +Sampler: + sample_every_val: 500 + visual_num: 10 # number of visualize molecules in the sample + chains_to_save: 5 # less sample batch size, select representative sample in sample batch for visualize + number_chain_steps: 10 # Number of frames in each gif + sample_batch_iters: 100 # Number of sample batches + flag_retrival_sampling: False + flag_use_formula: False + flag_retrival_initilization: False + num_candidates: 1 + retrival_database_path: ./spectrum_elucidation/retrival_database/mol_rep_15.csv + pretrained_model_path: ./pretrained/DiffNMR_nless15_best.pdparams + output_dir: ./output/DiffNMR/DiffNMR/sample + out_dict: {"Accuracy"} + data: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 256 + + +Model: + __class_name__: DiffNMR + __init_params__: + encoder_cfg: + __name__: NMRNetCLIP + pretrained_path: ./output/DiffNMR/NMRNet/checkpoints/best.pdparams # "./pretrained/step2_best.pdparams" #"/home/liuxuwei01/PaddleMaterial/output/step2_init_weight.pdparams" #"./output/step2_best.pdparams" + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.0 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + decoder_cfg: + __name__: DiffGraphFormer + pretrained_path: ./output/DiffNMR/DiffGraphFormer/checkpoints/latest.pdparams # "./pretrained/step1_best.pdparams" + hidden_mlp_dims: { + 'X': 256, + 'E': 128, + 'y': 256 + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256 + } + num_layers: 5 + vocab_dim: 256 + diffmodel_cfg: + type: 'discrete_condition' + transition: 'marginal' # uniform or marginal + model: 'graph_tf' + diffusion_steps: 500 + diffusion_noise_schedule: 'cosine' # 'cosine', 'polynomial_2' + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + lambda_train: [5, 0] + conditdim: 512 + connector_cfg: # if no connector set null + __name__: DiffPrior + pretrained_model_path: ./output/DiffNMR_CHnmr/DiffGraphFormer/train/checkpoints/best.pdparams + model_cfg: + dim: 512 + num_timesteps: 1000 + num_time_embeds: 1 + num_graph_embeds: 1 + num_spectrum_embeds: 1 + max_spectrum_len: 256 + self_cond: False + depth: 6 + dim_head: 64 + heads: 8 + sample_cfg: + graph_embed_dim: 512 + timesteps: 1000 + sample_timesteps: 64 + cond_drop_prob: 0.1 + spectrum_cond_drop_prob: 0.05 + graph_cond_drop_prob: 0.05 + loss_type: "l2" + predict_x_start: true + predict_v: false + beta_schedule: "cosine" + condition_on_spectrum_encodings: false + sampling_clamp_l2norm: false + sampling_final_clamp_l2norm: false + training_clamp_l2norm: false + init_graph_embed_l2norm: false + graph_embed_scale: null + + +CLIP: + __class_name__: NMRNetCLIP + __init_params__: + spectrum_encoder: + pretrained_model_path: "./pretrained/DiffNMR_NMRNet_nless15_best.pdparams" + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.1 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + graph_encoder: + pretrained_model_path: "./pretrained/DiffNMR_DiffGraphFormer_nless15_best.pdparams" + n_layers_GT: 5 + hidden_mlp_dims: { + "X": 256, + "E": 128, + "y": 256, + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256, + } + diffmodel_cfg: # to be deleted + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 + +Optimizer: + __class_name__: AdamW + __init_params__: + beta1: 0.9 + beta2: 0.999 + weight_decay: 1e-12 + amsgrad: True + epsilon: 1e-8 + lr: 0.0002 + + +Dataset: + train: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/train.csv" + datadir: "./data/MSD_nmr" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + val: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/val.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + test: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 64 + + +DataInfo: + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 \ No newline at end of file diff --git a/spectrum_elucidation/configs/diffnmr/PP-DiffNMR_DiffPrior.yaml b/spectrum_elucidation/configs/diffnmr/PP-DiffNMR_DiffPrior.yaml new file mode 100644 index 00000000..308184af --- /dev/null +++ b/spectrum_elucidation/configs/diffnmr/PP-DiffNMR_DiffPrior.yaml @@ -0,0 +1,281 @@ +Global: + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 500 + + molecule_converter: + format: "smiles" + sanitize: False + add_hs: False + remove_hs: False + kekulize: False + num_cpus: 10 + + graph_converter: + __class_name__: MolecularGraphConverter + __init_params__: + atom_vocab: {"C": 0, "N":1, "O": 2, "F": 3, "P": 4, "S": 5, "Cl": 6, "Br": 7, "I": 8} # {H: 0, C: 1, N: 2, O: 3, F: 4, P: 5, S: 6, Cl: 7, Br: 8, I: 9} + bond_vocab: {"SINGLE": 0, "DOUBLE": 1, "TRIPLE": 2, "AROMATIC": 3} + remove_h: true + add_self_loops: false + edge_mode: bidirectional + num_cpus: 10 + + spectrum_converter: + __class_name__: BuildSpectrumNMR + __init_params__: + seq_len_H1: 20 # 1H spectrum sequence length + seq_len_C13: 75 # 13C spectrum sequence length + j_len: 6 # J-coupling dimension + integral_offset: 1 # Integral offset + unk_token: "" # Unknown token identifier + dtype: "float32" # Data type + num_cpus: 10 # Number of parallel threads + +Trainer: + # Max epochs to train + max_epochs: 2000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/DiffNMR/DiffPrior/train + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 1 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: # please set your pretrained model path here when run trainer.test + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + + # visualdl log dict + out_dict: + loss: + train: ["loss"] + eval: ["loss"] + metric: + train: [] + eval: ["val_nll"] + sample: ["Accuracy"] + +Sampler: + sample_every_val: 500 + visual_num: 10 # number of visualize molecules in the sample + chains_to_save: 5 # less sample batch size, select representative sample in sample batch for visualize + number_chain_steps: 10 # Number of frames in each gif + sample_batch_iters: 100 # Number of sample batches + flag_retrival_sampling: False + flag_use_formula: False + flag_retrival_initilization: False + num_candidates: 1 + retrival_database_path: ./spectrum_elucidation/retrival_database/mol_rep_15.csv + pretrained_model_path: ./pretrained/DiffNMR_nless15_best.pdparams + output_dir: ./output/PP-DiffNMR/DiffNMR/sample + out_dict: {"Accuracy"} + data: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 8 + + +Model: + __class_name__: DiffPrior + __init_params__: + connector_cfg: + dim: 512 + num_timesteps: 1000 + num_time_embeds: 1 + num_graph_embeds: 1 + num_spectrum_embeds: 1 + max_spectrum_len: 256 + self_cond: False + depth: 6 + dim_head: 64 + heads: 8 + sample_cfg: + graph_embed_dim: 512 + timesteps: 1000 + sample_timesteps: 64 + cond_drop_prob: 0.1 + spectrum_cond_drop_prob: 0.05 + graph_cond_drop_prob: 0.05 + loss_type: "l2" + predict_x_start: true + predict_v: false + beta_schedule: "cosine" + condition_on_spectrum_encodings: false + sampling_clamp_l2norm: false + sampling_final_clamp_l2norm: false + training_clamp_l2norm: false + init_graph_embed_l2norm: false + graph_embed_scale: null + + +CLIP: + __class_name__: NMRNetCLIP + __init_params__: + spectrum_encoder: + pretrained_model_path: "./pretrained/DiffNMR_NMRNet_nless15_best.pdparams" + dim_enc_H: 1024 + dimff_enc_H: 2048 + dim_enc_C: 256 + dimff_enc_C: 512 + ffn_hidden: 512 + n_head: 8 + n_layers: 3 + drop_prob: 0.1 # 0.0 + seq_len_H1: 20 + seq_len_C13: 75 + peakwidthemb_num: 70 + integralemb_num: 26 + graph_encoder: + pretrained_model_path: "./pretrained/DiffNMR_DiffGraphFormer_nless15_best.pdparams" + n_layers_GT: 5 + hidden_mlp_dims: { + "X": 256, + "E": 128, + "y": 256, + } + hidden_dims: { + 'dx': 256, + 'de': 64, + 'dy': 256, + 'n_head': 8, + 'dim_ffX': 256, + 'dim_ffE': 128, + 'dim_ffy': 256, + } + diffmodel_cfg: # to be deleted + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 + + +Optimizer: + __class_name__: AdamW + __init_params__: + beta1: 0.9 + beta2: 0.999 + weight_decay: 1e-12 + amsgrad: True + epsilon: 1e-8 + lr: 0.0002 + + +Dataset: + train: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/train.csv" + datadir: "./data/MSD_nmr" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + val: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/val.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + test: + dataset: + __class_name__: MSDnmrDataset + __init_params__: + path: "./data/MSD_nmr/test.csv" + vocab_peakwidth_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/delta_distribution.csv" + vocab_split_path: "./spectrum_elucidation/vocab/nless15/H1_statistic/split_type_distribution.csv" + cache: True + data_flag: "n<15" + max_atoms: 15 + build_molecule_cfg: ${Global.molecule_converter} + build_graph_cfg: ${Global.graph_converter} + build_spectrum_cfg: ${Global.spectrum_converter} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 64 + + +DataInfo: + extra_features: 'all' # 'all', 'cycles', 'eigenvalues' or null + conditdim: 512 \ No newline at end of file diff --git a/spectrum_elucidation/configs/diffnmr/README.md b/spectrum_elucidation/configs/diffnmr/README.md new file mode 100644 index 00000000..0dbe3df1 --- /dev/null +++ b/spectrum_elucidation/configs/diffnmr/README.md @@ -0,0 +1,166 @@ +# DiffNMR + +[DiffNMR: Diffusion Models for Nuclear Magnetic Resonance Spectra Elucidation](https://arxiv.org/abs/2507.08854) + +## Abstract + +Nuclear Magnetic Resonance (NMR) spectroscopy is a central characterization method for molecular structure elucidation, yet interpreting NMR spectra to deduce molecular structures remains challenging due to the complexity of spectral data and the vastness of the chemical space. In this work, we introduce DiffNMR, a novel end-to-end framework that leverages a conditional discrete diffusion model for de novo molecular structure elucidation from NMR spectra. DiffNMR refines molecular graphs iteratively through a diffusion-based generative process, ensuring global consistency and mitigating error accumulation inherent in autoregressive methods. The framework integrates a two-stage pretraining strategy that aligns spectral and molecular representations via diffusion autoencoder (Diff-AE) and contrastive learning, the incorporation of retrieval initialization and similarity filtering during inference, and a specialized NMR encoder with radial basis function (RBF) encoding for chemical shifts, preserving continuity and chemical correlation. Experimental results demonstrate that DiffNMR achieves competitive performance for NMR-based structure elucidation, offering an efficient and robust solution for automated molecular analysis. + +![DiffNMR Overview](../../docs/diffnmr_overview.png) + +## Datasets: + +- MSD-NMR: + + MSD-NMR Multimodal-Spectroscopic-Dataset (MSD-NMR) is a comprehensive dataset for molecular structure elucidation from NMR spectra. It contains 121,509 spectra, each corresponding to a molecular structure with up to 15 heavy atoms. Up to 574,799 spectra with up to 35 heavy atoms. The dataset is divided into training, validation, and test sets. + + | Dataset | train | val | test | total | + |:--------|------:|----:|-----:|------:| + | [MSD-NMR](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/msd/msd_nmr.zip) | | | | | + | n<15 | 109,358 | 6,076 | 6,075 | 121,509 | + | n<20 | 235,512 | 13,085 | 13,084 | 261,681 | + | n<25 | 351,273 | 19,516 | 19,515 | 390,304 | + | n<35 | 517,319 | 28,741 | 28,739 | 574,799 | + +## Data Preparation + +To set up the DiffNMR environment, please follow these steps: + +1. Download the required files: + - Vocabulary list: [vocab.tar.gz](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/vocab.tar.gz) + - Retrieval database: [retrival_database.zip](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/retrival_database.zip) + +2. Place the downloaded files in the `spectrum_elucidation` directory + +3. Decompress the files using the following commands: + ```bash + tar -xvzf vocab.tar.gz + unzip retrival_database.zip + ``` + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModelDatasetLossNegative log likelihoodGPUsTraining timeConfigCheckpoint | Log
diffnmr_diffgraphfromer_msdnmr_nless15msdnmr_nless151.94661866.0286214~34.15 hoursDiffNMR_DiffGraphFormercheckpoint | log
diffnmr_nmrnet_msdnmr_nless15msdnmr_nless153.217951-4~6.5 hoursDiffNMR_NMRNetcheckpoint | log
diffnmr_msdnmr_nless15msdnmr_nless151.94661866.0286214~30.24 hoursDiffNMRcheckpoint | log
+ +Note: please refer to the following pretrained weights: +- [DiffNMR_DiffGraphFormer_nless15_best.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_DiffGraphFormer_nless15_best.pdparams) +- [DiffNMR_DiffGraphFormer_nless15_init.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_DiffGraphFormer_nless15_init.pdparams) +- [DiffNMR_NMRNet_nless15_best.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_NMRNet_nless15_best.pdparams) +- [DiffNMR_NMRNet_nless15_init.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_NMRNet_nless15_init.pdparams) +- [DiffNMR_NMRNet_nless15_init_v2.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_NMRNet_nless15_init_v2.pdparams) +- [DiffNMR_nless15_best.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_nless15_best.pdparams) +- [DiffNMR_nless15_onlyH_best.pdparams](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_elucidation/diffnmr/DiffNMR_nless15_onlyH_best.pdparams) + +### Training +```bash +## 2 stage pretraining +### stage 1: pretrain Diff-AE of Molecular Encoder and Molecular Decoder +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml +# single-gpu training +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml +### stage 2: pretrain NMR Spectrum Encoder NMRNet by CLIP +python -m paddle.distributed.launch --gpus="0,1,2,3" spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml +# single-gpu training +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml +## fine-tuning +# multi-gpu training, we use 4 gpus here +python -m paddle.distributed.launch --gpus="0,1,2,3" spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR.yaml +# single-gpu training +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR.yaml +``` + +### Validation +```bash +# Adjust program behavior on-the-fly using command-line parameters – this provides a convenient way to customize settings without modifying the configuration file directly. +# such as: --Global.do_eval=True +## 2 stage pretraining +### stage 1: pretrain Diff-AE of Molecular Encoder and Molecular Decoder +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' +### stage 2: pretrain NMR Spectrum Encoder NMRNet by CLIP +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' +## fine-tuning +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='your model path(*.pdparams)' +``` + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. +## 2 stage pretraining +### stage 1: pretrain Diff-AE of Molecular Encoder and Molecular Decoder +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_DiffGraphFormer.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='your model path(*.pdparams)' +### stage 2: pretrain NMR Spectrum Encoder NMRNet by CLIP +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR_NMRNet.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='your model path(*.pdparams)' +## fine-tuning +python spectrum_elucidation/train.py -c spectrum_elucidation/configs/diffnmr/DiffNMR.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='your model path(*.pdparams)' +``` + +### Sample +```bash +# This command is used to predict the crystal structure using a trained model. +# Note: The model_name and weights_name parameters are used to specify the pre-trained model and its corresponding weights. +# The prediction results will be saved in the folder specified by the `save_path` parameter, with the default set to `result`. + +# Mode 1: Use a custom configuration file and checkpoint for crystal structure prediction. This approach allows for more flexibility and customization. +python spectrum_elucidation/sample.py --config_path='spectrum_elucidation/configs/diffnmr/DiffNMR.yaml' --weights_name='DiffNMR_nless15_best.pdparams' --save_path='result_diffnmr_nless15/' --checkpoint_path="pretrained" + +``` + +## Citation +``` +@article{yang2025diffnmr, + title={DiffNMR: Diffusion Models for Nuclear Magnetic Resonance Spectra Elucidation}, + author= {Yang, Qingsong and Wu, Binglan and Liu, Xuwei and Chen, Bo and Li, Wei and Long, Gen and Chen, Xin and Xiao, Mingjun}, + journal={arXiv preprint arXiv:2507.08854}, + year={2025} +} +``` diff --git a/spectrum_elucidation/docs/diffnmr_overview.png b/spectrum_elucidation/docs/diffnmr_overview.png new file mode 100644 index 00000000..f5225ec7 Binary files /dev/null and b/spectrum_elucidation/docs/diffnmr_overview.png differ diff --git a/spectrum_elucidation/sample.py b/spectrum_elucidation/sample.py new file mode 100644 index 00000000..88cb6f93 --- /dev/null +++ b/spectrum_elucidation/sample.py @@ -0,0 +1,73 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse + +from ppmat.sampler.base_sampler import MolecularSampler +from ppmat.utils import logger + +if __name__ == "__main__": + + argparse = argparse.ArgumentParser() + + argparse.add_argument("--model_name", type=str, default=None) + argparse.add_argument( + "--weights_name", + type=str, + default=None, + help="Weights name, e.g., best.pdparams, latest.pdparams.", + ) + argparse.add_argument( + "--config_path", + type=str, + default=None, + help="Path to the configuration file.", + ) + argparse.add_argument( + "--checkpoint_path", + type=str, + default=None, + help="Path to the checkpoint file.", + ) + argparse.add_argument("--save_path", type=str, default="results") + argparse.add_argument( + "--mode", + type=str, + choices=[ + "by_dataloader", + "compute_metric", + ], + default="by_dataloader", + ) + + args = argparse.parse_args() + + sampler = MolecularSampler( + model_name=args.model_name, + weights_name=args.weights_name, + config_path=args.config_path, + checkpoint_path=args.checkpoint_path, + ) + if args.mode == "compute_metric": + metric_result = sampler.compute_metric( + save_path=args.save_path, + ) + for metric_name, metric_value in metric_result.items(): + logger.info(f"{metric_name}: {metric_value}") + elif args.mode == "by_dataloader": + result = sampler.sample_by_dataloader( + save_path=args.save_path, + ) + else: + raise ValueError(f"Unknown mode: {args.mode}") diff --git a/spectrum_elucidation/train.py b/spectrum_elucidation/train.py new file mode 100644 index 00000000..8926e118 --- /dev/null +++ b/spectrum_elucidation/train.py @@ -0,0 +1,212 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import os.path as osp + +import paddle.distributed as dist +from omegaconf import OmegaConf + +from ppmat.datasets import build_dataloader +from ppmat.datasets import build_dataset_infos +from ppmat.datasets import set_signal_handlers +from ppmat.datasets.msd_nmr_dataset import DataLoaderCollection +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.models.diffnmr.extra_features_graph import DummyExtraFeatures +from ppmat.models.diffnmr.extra_features_graph import ExtraFeatures +from ppmat.models.diffnmr.extra_features_molecular_graph import ExtraMolecularFeatures +from ppmat.optimizer import build_optimizer +from ppmat.trainer.base_trainer import BaseTrainer +from ppmat.utils import logger +from ppmat.utils import misc +from ppmat.utils.visualization import MolecularVisualization + +if dist.get_world_size() > 1: + dist.fleet.init(is_collective=True) + +if __name__ == "__main__": + # parse arguments + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config", + type=str, + default="./spectrum_elucidation/configs/DiffNMR.yaml", + help="Path to config file", + ) + + args, dynamic_args = parser.parse_known_args() + + # load config and merge with cli args + config = OmegaConf.load(args.config) + cli_config = OmegaConf.from_dotlist(dynamic_args) + config = OmegaConf.merge(config, cli_config) + + # save config to output_dir, only rank 0 process will do this + if dist.get_rank() == 0: + os.makedirs(config["Trainer"]["output_dir"], exist_ok=True) + config_name = os.path.basename(args.config) + OmegaConf.save(config, osp.join(config["Trainer"]["output_dir"], config_name)) + # convert config to dict + config = OmegaConf.to_container(config, resolve=True) + + # init logger + logger_path = osp.join(config["Trainer"]["output_dir"], "run.log") + logger.init_logger(log_file=logger_path) + logger.info(f"Logger saved to {logger_path}") + + # set random seed + seed = config["Trainer"].get("seed", 42) + misc.set_random_seed(seed) + logger.info(f"Set random seed to {seed}") + + # load dataloader from config + set_signal_handlers() + if config["Global"].get("do_train", True): + train_data_cfg = config["Dataset"].get("train") + assert ( + train_data_cfg is not None + ), "train_data_cfg must be defined, when do_train is true" + train_loader = build_dataloader(train_data_cfg) + else: + train_loader = None + + if config["Global"].get("do_eval", False) or config["Global"].get("do_train", True): + val_data_cfg = config["Dataset"].get("val") + if val_data_cfg is not None: + val_loader = build_dataloader(val_data_cfg) + else: + logger.info("No validation dataset defined.") + val_loader = None + else: + val_loader = None + + if config["Global"].get("do_test", False): + test_data_cfg = config["Dataset"].get("test") + assert ( + test_data_cfg is not None + ), "test_data_cfg must be defined, when do_test is true" + test_loader = build_dataloader(test_data_cfg) + else: + test_loader = None + + # build datasetinfo + dataloaders = DataLoaderCollection(train_loader, val_loader, test_loader) + dataset_infos = build_dataset_infos( + dataloaders=dataloaders, cfg=config, recompute_statistics=False + ) + train_smiles = dataset_infos.train_smiles + + # extra features + if config.get("DataInfo", None) is not None: + extra_features = ExtraFeatures( + config["DataInfo"]["extra_features"], + dataset_infos=dataset_infos, + ) + domain_features = ExtraMolecularFeatures( + dataset_infos=dataset_infos, + ) + fallback_loader = train_loader or val_loader or test_loader + dataset_infos.compute_input_output_dims( + dataloader=fallback_loader, + extra_features=extra_features, + domain_features=domain_features, + conditionDim=config["DataInfo"]["conditdim"], + ) + else: + extra_features = DummyExtraFeatures() + domain_features = DummyExtraFeatures() + + # CLIP for sample metric + if config.get("CLIP", None) is not None: + model_cfg = config["CLIP"] + clip_module = build_model( + model_cfg, + extra_features=extra_features, + domain_features=domain_features, + dataset_infos=dataset_infos, + ) + else: + clip_module = None + + # visualization tools + visualization_tools = MolecularVisualization( + dataset_infos=dataset_infos, + output_dir=config["Trainer"]["output_dir"], + ) + + # build model from config + model_cfg = config["Model"] + model = build_model( + model_cfg, + extra_features=extra_features, + domain_features=domain_features, + dataset_infos=dataset_infos, + visualization_tools=visualization_tools, + clip=clip_module, + ) + + # build optimizer and learning rate scheduler from config + if config.get("Optimizer") is not None and config["Global"].get("do_train", True): + assert ( + train_loader is not None + ), "train_loader must be defined when optimizer is defined." + assert ( + config["Trainer"].get("max_epochs") is not None + ), "max_epochs must be defined when optimizer is defined." + optimizer, lr_scheduler = build_optimizer( + config["Optimizer"], + model, + config["Trainer"]["max_epochs"], + len(train_loader), + ) + else: + optimizer, lr_scheduler = None, None + + # build metric from config + metric_cfg = config.get("Metric") + if metric_cfg is not None: + metric_func = build_metric(metric_cfg) + else: + metric_func = None + + # initialize trainer + trainer = BaseTrainer( + config["Trainer"], + model, + train_dataloader=train_loader, + val_dataloader=val_loader, + optimizer=optimizer, + lr_scheduler=lr_scheduler, + compute_metric_func_dict=None, + ) + + trainer.attach_metrics( + metric_cfg, + dataset_infos=dataset_infos, + train_smiles=train_smiles, + clip=clip_module, + model=model, + ) + + if config["Global"].get("do_train", True): + trainer.train() + if config["Global"].get("do_eval", False): + logger.info("Evaluating on validation set") + time_info, loss_info, metric_info = trainer.eval(val_loader) + if config["Global"].get("do_test", False): + logger.info("Evaluating on test set") + time_info, loss_info, metric_info = trainer.eval(test_loader) diff --git a/spectrum_enhancement/README.md b/spectrum_enhancement/README.md new file mode 100644 index 00000000..9141454f --- /dev/null +++ b/spectrum_enhancement/README.md @@ -0,0 +1,37 @@ +# SE-Spectrum Enhancement + +## 1.Introduction + +Spectrum Enhancement (SE) targets reconstruction and denoising of noisy +spectral or microscopy observations. In materials characterization workflows, +low-dose or low-signal acquisitions often reduce image quality and make +atomic-scale structure analysis harder. SE models learn to recover cleaner +signals from paired noisy and reference data, improving downstream inspection +of crystal structures, defects, and local material morphology. + +The current PaddleMaterials SE workflow focuses on STEM image enhancement. +Given noisy HAADF or BF STEM inputs, the model predicts a configured target +image (`gt_enhance` or `gt_detect`) and supports training, evaluation, and +prediction with the common PaddleMaterials trainer/predictor style. + +## 2.Models Matrix + +| **Supported Functions** | **[SFIN](./configs/sfin/README.md)** | +| ----------------------------------- | ------------------------------------ | +| **Support Data Types** | | +|  STEM images | ✅ | +|  HAADF / BF inputs | ✅ | +| **Spectrum Enhancement** | | +|  Image denoising/enhancement | ✅ | +|  Detection target restoration | ✅ | +| **ML Capabilities · Training** | | +|  Single-GPU | ✅ | +|  Distributed Train | - | +|  Mixed Precision | - | +|  Fine-tuning | ✅ | +| **ML Capabilities · Predict** | | +|  Standard inference | ✅ | +|  Distributed inference | - | +| **Dataset** | | +|  HAADF STEM | ✅ | +|  BF STEM | ✅ | diff --git a/spectrum_enhancement/configs/sfin/README.md b/spectrum_enhancement/configs/sfin/README.md new file mode 100644 index 00000000..908cc27d --- /dev/null +++ b/spectrum_enhancement/configs/sfin/README.md @@ -0,0 +1,229 @@ +# SFIN + +[Noise Calibration and Spatial-Frequency Interactive Network for STEM Image Enhancement](https://arxiv.org/pdf/2504.02555) + +## Abstract + +Scanning transmission electron microscopy (STEM) images often suffer from +severe noise and missing structural details under low-dose acquisition. +SFIN introduces a noise calibration and spatial-frequency interaction network +for paired STEM image restoration. PaddleMaterials provides four SFIN configs +covering HAADF and BF inputs, with `gt_enhance` and `gt_detect` as the two +supervised targets. `gt_enhance` is the image enhancement target, used to +recover a clean STEM image with improved contrast and structural details. +`gt_detect` is the detection-oriented target, used to highlight structural +features such as atom-column responses for downstream structure localization. + +## Datasets + +SFIN uses two paired STEM image datasets: HAADF and BF. Each dataset contains +`train` and `test` splits. A sample is one noisy grayscale input paired with +two labels, `gt_enhance` and `gt_detect`. + +| Dataset | Train | Val/Test | Labels | +| :---: | :---: | :---: | :---: | +| [HAADF](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/SFIN/sfin_haadf.zip) | 1000 | 100 | `gt_enhance`, `gt_detect` | +| [BF](https://paddle-org.bj.bcebos.com/paddlematerials/datasets/SFIN/sfin_bf.zip) | 1000 | 100 | `gt_enhance`, `gt_detect` | + +## Model + +

+ SFIN model architecture +

+ +SFIN contains a noise calibration module and a spatial-frequency interaction +network. The noise calibration module estimates and suppresses low-dose +acquisition noise before restoration. The spatial-frequency interaction +network combines spatial-domain features, which preserve local morphology and +atom-column structures, with frequency-domain features, which capture global +periodic and contrast information. Their interaction helps recover fine +structural details while reducing noise and artifacts. + +Training objective: + +```math +\mathcal{L} = \left\| \hat{I} - I_{gt} \right\|_1 +``` + +## Metric + +Predictions and targets are evaluated with value range `[0, 255]`. For `N` +images with shape `C x H x W`, the global mean squared error is computed over +all pixels: + +```math +\mathrm{MSE}_{global} += \frac{1}{NCHW} +\sum_{n=1}^{N}\sum_{c=1}^{C}\sum_{h=1}^{H}\sum_{w=1}^{W} +\left(\hat{I}_{nchw} - I_{nchw}\right)^2 +``` + +```math +\mathrm{PSNR}_{global} += 10\log_{10} +\left( +\frac{L^2}{\max(\mathrm{MSE}_{global}, \epsilon)} +\right), +\quad L=255,\ \epsilon=10^{-12} +``` + +SSIM is computed on raw tensors using an `11 x 11` Gaussian window with +`sigma=1.5`: + +```math +\mathrm{SSIM}(x,y) += +\frac{(2\mu_x\mu_y + C_1)(2\sigma_{xy} + C_2)} +{(\mu_x^2 + \mu_y^2 + C_1)(\sigma_x^2 + \sigma_y^2 + C_2)} +``` + +where `C1=(0.01L)^2`, `C2=(0.03L)^2`, and `L=255`. The reported SSIM is the +mean value of the SSIM map over all evaluated images. + +## Results + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model NameDatasetTargetPSNR / SSIM(Test dataset)GPUsTraining timeConfigCheckpoint | Log
sfin_haadf_enhanceHAADF testgt_enhance37.440395 / 0.9674521 (V100-32GB)~21.5 hourssfin_haadf_enhancecheckpoint
sfin_haadf_detectHAADF testgt_detect26.013702 / 0.9644921 (V100-32GB)~21.2 hourssfin_haadf_detectcheckpoint
sfin_bf_enhanceBF testgt_enhance31.339841 / 0.9927081 (V100-32GB)~19.1 hourssfin_bf_enhancecheckpoint
sfin_bf_detectBF testgt_detect23.826540 / 0.9433091 (V100-32GB)~21.3 hourssfin_bf_detectcheckpoint
+ +## Command + +### Training + +```bash +# HAADF enhance +python spectrum_enhancement/train.py \ + -c spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml + +# HAADF detect +python spectrum_enhancement/train.py \ + -c spectrum_enhancement/configs/sfin/sfin_haadf_detect.yaml + +# BF enhance +python spectrum_enhancement/train.py \ + -c spectrum_enhancement/configs/sfin/sfin_bf_enhance.yaml + +# BF detect +python spectrum_enhancement/train.py \ + -c spectrum_enhancement/configs/sfin/sfin_bf_detect.yaml +``` + +### Validation + +```bash +# Use Global.do_eval=True and provide a checkpoint path. +python spectrum_enhancement/train.py \ + -c spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml \ + Global.do_train=False \ + Global.do_eval=True \ + Global.do_test=False \ + Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Testing + +```bash +# Evaluate on the test dataset. +python spectrum_enhancement/train.py \ + -c spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml \ + Global.do_train=False \ + Global.do_eval=False \ + Global.do_test=True \ + Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Prediction + +Pretrained prediction is available through registered model names: + +```bash +# Mode 1: use registered pretrained weights by model name. +python spectrum_enhancement/predict.py \ + --model_name sfin_haadf_enhance \ + --split val +``` + +Or override the checkpoint and data path explicitly: + +```bash +# Mode 2: custom config + checkpoint + local noisy-image directory. +python spectrum_enhancement/predict.py \ + --config_path spectrum_enhancement/configs/sfin/sfin_bf_detect.yaml \ + --checkpoint_path https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_bf_detect.zip \ + --input_path ./sfin_bf/test/noisy \ + --split val \ + --output_dir ./output/sfin_predictions +``` + +When `--input_path` is provided, prediction only reads noisy input images and +does not require the target sub-directory to exist. Without `--input_path`, +prediction reads the selected split from the config. + +## References + +- Reference implementation: [HeasonLee/SFIN](https://github.com/HeasonLee/SFIN) +- Paper: [Noise Calibration and Spatial-Frequency Interactive Network for STEM Image Enhancement](https://arxiv.org/pdf/2504.02555) + +## Citation + +```bibtex +@inproceedings{li2025sfin, + title={Noise Calibration and Spatial-Frequency Interactive Network for STEM Image Enhancement}, + author={Li, Hesong and Wu, Ziqi and Shao, Ruiwen and Zhang, Tao and Fu, Ying}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2025} +} +``` diff --git a/spectrum_enhancement/configs/sfin/sfin_bf_detect.yaml b/spectrum_enhancement/configs/sfin/sfin_bf_detect.yaml new file mode 100644 index 00000000..8b0c513d --- /dev/null +++ b/spectrum_enhancement/configs/sfin/sfin_bf_detect.yaml @@ -0,0 +1,107 @@ +Global: + do_train: True + do_eval: True + do_test: False + prim_eager_enabled: False + +Trainer: + max_epochs: 500 + seed: 42 + output_dir: ./output/sfin_bf_detect + save_freq: 100 + log_freq: 100 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: "O1" + eval_with_no_grad: True + gradient_accumulation_steps: 1 + + best_metric_indicator: null + name_for_best_metric: null + greater_is_better: True + + compute_metric_during_train: True + metric_strategy_during_eval: "epoch" + + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: SFIN + __init_params__: + in_channels: 1 + base_channels: 64 + num_blocks: 8 + input_name: "noisy" + target_name: "gt_detect" + loss_type: "l1" + loss_weight: 1.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: MultiStepDecay + __init_params__: + learning_rate: 2.0e-4 + milestones: [250, 400, 425, 450, 475] + gamma: 0.5 + by_epoch: True + beta1: 0.9 + beta2: 0.999 + epsilon: 1.0e-8 + weight_decay: 0.0 + +Metric: + __class_name__: SFINStreamingAdapter + __init_params__: + target_name: "gt_detect" + data_range: 255.0 + +Predict: + eval_with_no_grad: True + checkpoint_path: https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_bf_detect.zip + +Dataset: + train: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_bf" + split: "train" + target_subdir: "gt_detect" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 8 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + val: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_bf" + split: "val" + target_subdir: "gt_detect" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + test: ${Dataset.val} diff --git a/spectrum_enhancement/configs/sfin/sfin_bf_enhance.yaml b/spectrum_enhancement/configs/sfin/sfin_bf_enhance.yaml new file mode 100644 index 00000000..456b5789 --- /dev/null +++ b/spectrum_enhancement/configs/sfin/sfin_bf_enhance.yaml @@ -0,0 +1,107 @@ +Global: + do_train: True + do_eval: True + do_test: False + prim_eager_enabled: False + +Trainer: + max_epochs: 434 + seed: 42 + output_dir: ./output/sfin_bf_enhance + save_freq: 50 + log_freq: 100 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: "O1" + eval_with_no_grad: True + gradient_accumulation_steps: 1 + + best_metric_indicator: null + name_for_best_metric: null + greater_is_better: True + + compute_metric_during_train: True + metric_strategy_during_eval: "epoch" + + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: SFIN + __init_params__: + in_channels: 1 + base_channels: 64 + num_blocks: 8 + input_name: "noisy" + target_name: "gt_enhance" + loss_type: "l1" + loss_weight: 1.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: MultiStepDecay + __init_params__: + learning_rate: 2.0e-4 + milestones: [250, 400, 425, 450, 475] + gamma: 0.5 + by_epoch: True + beta1: 0.9 + beta2: 0.999 + epsilon: 1.0e-8 + weight_decay: 0.0 + +Metric: + __class_name__: SFINStreamingAdapter + __init_params__: + target_name: "gt_enhance" + data_range: 255.0 + +Predict: + eval_with_no_grad: True + checkpoint_path: https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_bf_enhance.zip + +Dataset: + train: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_bf" + split: "train" + target_subdir: "gt_enhance" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 8 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + val: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_bf" + split: "val" + target_subdir: "gt_enhance" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + test: ${Dataset.val} diff --git a/spectrum_enhancement/configs/sfin/sfin_haadf_detect.yaml b/spectrum_enhancement/configs/sfin/sfin_haadf_detect.yaml new file mode 100644 index 00000000..c8f6947d --- /dev/null +++ b/spectrum_enhancement/configs/sfin/sfin_haadf_detect.yaml @@ -0,0 +1,107 @@ +Global: + do_train: True + do_eval: True + do_test: False + prim_eager_enabled: False + +Trainer: + max_epochs: 500 + seed: 42 + output_dir: ./output/sfin_haadf_detect + save_freq: 100 + log_freq: 100 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: "O1" + eval_with_no_grad: True + gradient_accumulation_steps: 1 + + best_metric_indicator: null + name_for_best_metric: null + greater_is_better: True + + compute_metric_during_train: True + metric_strategy_during_eval: "epoch" + + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: SFIN + __init_params__: + in_channels: 1 + base_channels: 64 + num_blocks: 8 + input_name: "noisy" + target_name: "gt_detect" + loss_type: "l1" + loss_weight: 1.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: MultiStepDecay + __init_params__: + learning_rate: 2.0e-4 + milestones: [250, 400, 425, 450, 475] + gamma: 0.5 + by_epoch: True + beta1: 0.9 + beta2: 0.999 + epsilon: 1.0e-8 + weight_decay: 0.0 + +Metric: + __class_name__: SFINStreamingAdapter + __init_params__: + target_name: "gt_detect" + data_range: 255.0 + +Predict: + eval_with_no_grad: True + checkpoint_path: https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_haadf_detect.zip + +Dataset: + train: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_haadf" + split: "train" + target_subdir: "gt_detect" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 8 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + val: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_haadf" + split: "val" + target_subdir: "gt_detect" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + test: ${Dataset.val} diff --git a/spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml b/spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml new file mode 100644 index 00000000..febea822 --- /dev/null +++ b/spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml @@ -0,0 +1,107 @@ +Global: + do_train: True + do_eval: True + do_test: False + prim_eager_enabled: False + +Trainer: + max_epochs: 500 + seed: 42 + output_dir: ./output/sfin_haadf_enhance + save_freq: 100 + log_freq: 100 + start_eval_epoch: 1 + eval_freq: 1 + pretrained_model_path: null + pretrained_weight_name: null + resume_from_checkpoint: null + use_amp: False + amp_level: "O1" + eval_with_no_grad: True + gradient_accumulation_steps: 1 + + best_metric_indicator: null + name_for_best_metric: null + greater_is_better: True + + compute_metric_during_train: True + metric_strategy_during_eval: "epoch" + + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: SFIN + __init_params__: + in_channels: 1 + base_channels: 64 + num_blocks: 8 + input_name: "noisy" + target_name: "gt_enhance" + loss_type: "l1" + loss_weight: 1.0 + +Optimizer: + __class_name__: Adam + __init_params__: + lr: + __class_name__: MultiStepDecay + __init_params__: + learning_rate: 2.0e-4 + milestones: [250, 400, 425, 450, 475] + gamma: 0.5 + by_epoch: True + beta1: 0.9 + beta2: 0.999 + epsilon: 1.0e-8 + weight_decay: 0.0 + +Metric: + __class_name__: SFINStreamingAdapter + __init_params__: + target_name: "gt_enhance" + data_range: 255.0 + +Predict: + eval_with_no_grad: True + checkpoint_path: https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/spectrum_enhancement/sfin/sfin_haadf_enhance.zip + +Dataset: + train: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_haadf" + split: "train" + target_subdir: "gt_enhance" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 8 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + val: + dataset: + __class_name__: SFINDataset + __init_params__: + path: "./sfin_haadf" + split: "val" + target_subdir: "gt_enhance" + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 1 + loader: + num_workers: 0 + use_shared_memory: False + collate_fn: DefaultCollator + + test: ${Dataset.val} diff --git a/spectrum_enhancement/docs/sfin_architecture.jpg b/spectrum_enhancement/docs/sfin_architecture.jpg new file mode 100644 index 00000000..4be3f397 Binary files /dev/null and b/spectrum_enhancement/docs/sfin_architecture.jpg differ diff --git a/spectrum_enhancement/predict.py b/spectrum_enhancement/predict.py new file mode 100644 index 00000000..47ddc1a3 --- /dev/null +++ b/spectrum_enhancement/predict.py @@ -0,0 +1,385 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import copy +import os.path as osp +import shutil +import tempfile +from contextlib import contextmanager +from pathlib import Path +from typing import Optional + +import numpy as np +import paddle +from omegaconf import OmegaConf +from PIL import Image +from tqdm import tqdm + +from ppmat.datasets import build_dataloader +from ppmat.datasets.transform import build_post_transforms +from ppmat.models import build_model +from ppmat.models import build_model_from_name +from ppmat.utils import logger +from ppmat.utils import save_load + + +class SpectrumPredictor: + """Spectrum enhancement predictor. + + Dataset prediction uses the configured ``Dataset.`` branch directly, + keeping prediction aligned with the training/evaluation data interface. + """ + + def __init__( + self, + model_name: Optional[str] = None, + weights_name: Optional[str] = None, + config_path: Optional[str] = None, + checkpoint_path: Optional[str] = None, + ): + # Match the common predictor pattern: registered models are loaded by + # model_name; custom models require both config_path and checkpoint_path. + if model_name is None: + assert config_path is not None and checkpoint_path is not None, ( + "config_path and checkpoint_path must be provided when model_name is " + "None." + ) + logger.info( + f"Loading configuration from {config_path} and model from " + f"{checkpoint_path}." + ) + + config = OmegaConf.load(config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + model = build_model(model_config) + save_load.load_pretrain(model, checkpoint_path) + else: + logger.info("Since model_name is given, downloading it...") + model, config = build_model_from_name(model_name, weights_name) + + self.model = model + self.config = config + self.model.eval() + + predict_config = config.get("Predict", None) + self.predict_config = predict_config if predict_config is not None else {} + self.eval_with_no_grad = self.predict_config.get("eval_with_no_grad", True) + self.post_transforms_cfg = self.predict_config.get("post_transforms", None) + if self.post_transforms_cfg is not None: + self.post_transforms = build_post_transforms(self.post_transforms_cfg) + else: + self.post_transforms = None + + model_init = self.config.get("Model", {}).get("__init_params__", {}) + self.input_name = model_init.get("input_name", "noisy") + self.target_name = model_init.get("target_name", "gt_enhance") + + def post_process(self, data): + if self.post_transforms is None: + return data + return self.post_transforms(data) + + def predict_batch(self, batch): + if self.eval_with_no_grad: + with paddle.no_grad(): + out = self.model.predict(batch) + else: + out = self.model.predict(batch) + return self.post_process(out) + + def _get_prediction_tensor(self, output) -> paddle.Tensor: + if not isinstance(output, dict): + raise TypeError(f"Expected dict output, but got {type(output)}.") + if self.target_name not in output: + raise KeyError( + f"Prediction key '{self.target_name}' not found in output keys " + f"{list(output.keys())}." + ) + return output[self.target_name] + + @staticmethod + def _tensor_to_image(pred: paddle.Tensor) -> np.ndarray: + pred = paddle.clip(pred, min=0.0, max=255.0) + pred = pred.squeeze().detach().cpu().numpy() + if pred.ndim == 3 and pred.shape[0] in (1, 3): + pred = np.transpose(pred, (1, 2, 0)) + if pred.ndim == 3 and pred.shape[-1] == 1: + pred = pred[..., 0] + return pred.astype(np.uint8) + + @staticmethod + def _normalize_split(split: str) -> str: + return "val" if split == "validation" else split + + @staticmethod + def _normalize_file_name(file_name, default_name: str) -> str: + if isinstance(file_name, (list, tuple)): + file_name = file_name[0] if file_name else default_name + if isinstance(file_name, str): + return file_name + return default_name + + @staticmethod + def _save_image( + pred: np.ndarray, + output_dir: Path, + file_name: str, + file_suffix: str = ".png", + ) -> Path: + if Path(file_name).suffix == "": + file_name = f"{file_name}{file_suffix}" + save_path = output_dir / file_name + Image.fromarray(pred).save(save_path) + return save_path + + def _predict_from_dataset_cfg( + self, + dataset_cfg, + output_dir: str, + ): + dataloader = build_dataloader(copy.deepcopy(dataset_cfg)) + output_dir = Path(output_dir) + output_dir.mkdir(parents=True, exist_ok=True) + + file_suffix = ( + dataset_cfg.get("dataset", {}) + .get("__init_params__", {}) + .get("file_suffix", ".png") + ) + saved_paths = [] + for idx, batch in enumerate(tqdm(dataloader)): + output = self.predict_batch(batch) + pred = self._get_prediction_tensor(output) + if len(pred.shape) >= 4: + pred_list = [pred[i] for i in range(pred.shape[0])] + else: + pred_list = [pred] + + names = batch.get("name") + for batch_idx, pred_item in enumerate(pred_list): + if isinstance(names, (list, tuple)): + name = names[batch_idx] if batch_idx < len(names) else None + else: + name = names + file_name = self._normalize_file_name( + name, f"{idx * len(pred_list) + batch_idx}{file_suffix}" + ) + saved_paths.append( + self._save_image( + self._tensor_to_image(pred_item), + output_dir, + file_name, + file_suffix, + ) + ) + return saved_paths + + @staticmethod + def _is_image_file(path: Path) -> bool: + return path.is_file() and path.suffix.lower() in { + ".png", + ".jpg", + ".jpeg", + ".bmp", + ".tif", + ".tiff", + } + + @contextmanager + def _dataset_cfg_from_input_path( + self, + input_path: str, + split: str = "test", + ): + split = self._normalize_split(split) + dataset_cfg = copy.deepcopy(self.config.get("Dataset", {}).get(split, None)) + if dataset_cfg is None: + raise KeyError(f"Dataset.{split} is not defined in config.") + + init_params = dataset_cfg.get("dataset", {}).get("__init_params__", {}) + dataset_split = init_params.get("split", "test") + disk_split = "test" if dataset_split == "val" else dataset_split + noisy_subdir = init_params.get("noisy_subdir", "noisy") + input_path = Path(input_path) + + if not input_path.exists(): + raise FileNotFoundError(f"Input path not found: {input_path}") + + init_params["target_subdir"] = None + init_params.pop("target_name", None) + + if input_path.is_file(): + with tempfile.TemporaryDirectory( + prefix="ppmat_spectrum_predict_" + ) as temp_dir: + temp_root = Path(temp_dir) + staged_noisy_dir = temp_root / disk_split / noisy_subdir + staged_noisy_dir.mkdir(parents=True, exist_ok=True) + shutil.copy2(input_path, staged_noisy_dir / input_path.name) + init_params["path"] = str(temp_root) + yield dataset_cfg + return + + if (input_path / disk_split / noisy_subdir).is_dir(): + init_params["path"] = str(input_path) + yield dataset_cfg + return + + if input_path.name == noisy_subdir and input_path.parent.name in ( + "train", + "test", + ): + init_params["path"] = str(input_path.parent.parent) + init_params["split"] = input_path.parent.name + yield dataset_cfg + return + + image_files = [ + file_path + for file_path in sorted(input_path.iterdir()) + if self._is_image_file(file_path) + ] + if not image_files: + raise FileNotFoundError(f"No image files found under {input_path}.") + + with tempfile.TemporaryDirectory(prefix="ppmat_spectrum_predict_") as temp_dir: + temp_root = Path(temp_dir) + staged_noisy_dir = temp_root / disk_split / noisy_subdir + staged_noisy_dir.mkdir(parents=True, exist_ok=True) + for image_file in image_files: + shutil.copy2(image_file, staged_noisy_dir / image_file.name) + init_params["path"] = str(temp_root) + logger.info(f"Load {len(image_files)} noisy images from {input_path}") + yield dataset_cfg + + def from_dataset( + self, + split: str = "test", + output_dir: str = "./output/spectrum_enhancement/predictions", + ): + split = self._normalize_split(split) + dataset_cfg = self.config.get("Dataset", {}).get(split, None) + if dataset_cfg is None: + raise KeyError(f"Dataset.{split} is not defined in config.") + return self._predict_from_dataset_cfg(dataset_cfg, output_dir) + + def from_image_path( + self, + input_path: str, + output_dir: str = "./output/spectrum_enhancement/predictions", + split: str = "test", + ): + with self._dataset_cfg_from_input_path(input_path, split) as dataset_cfg: + return self._predict_from_dataset_cfg(dataset_cfg, output_dir) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--model_name", type=str, default=None, help="Model name.") + parser.add_argument( + "--weights_name", + type=str, + default=None, + help="Weights name, e.g., best.pdparams, latest.pdparams.", + ) + parser.add_argument( + "--config_path", + type=str, + default=None, + help="Path to the configuration file.", + ) + parser.add_argument( + "--checkpoint_path", + type=str, + default=None, + help=( + "Path to the checkpoint file. If omitted in custom-model mode, " + "Predict.checkpoint_path in the config is used." + ), + ) + parser.add_argument( + "--input_path", + type=str, + default=None, + help=( + "Path to noisy image file or directory. If omitted, predict from " + "Dataset. in the config." + ), + ) + parser.add_argument( + "--split", + type=str, + default="test", + choices=["train", "val", "validation", "test"], + help="Dataset split used when input_path is omitted.", + ) + parser.add_argument( + "--output_dir", + type=str, + default=None, + help="Path to save prediction images.", + ) + parser.add_argument( + "--device", + type=str, + default="gpu" if paddle.device.cuda.device_count() > 0 else "cpu", + choices=["cpu", "gpu"], + help="Device to run inference.", + ) + args = parser.parse_args() + + paddle.set_device(args.device) + + checkpoint_path = args.checkpoint_path + if args.model_name is None and checkpoint_path is None: + if args.config_path is not None: + config = OmegaConf.load(args.config_path) + config = OmegaConf.to_container(config, resolve=True) + predict_config = config.get("Predict", None) + if predict_config is not None: + checkpoint_path = predict_config.get("checkpoint_path", None) + + predictor = SpectrumPredictor( + model_name=args.model_name, + weights_name=args.weights_name, + config_path=args.config_path, + checkpoint_path=checkpoint_path, + ) + + if args.output_dir is not None: + output_dir = args.output_dir + else: + trainer_output_dir = predictor.config.get("Trainer", {}).get("output_dir") + if trainer_output_dir: + output_dir = osp.join(trainer_output_dir, "predictions") + elif args.config_path: + output_dir = osp.join("./output", Path(args.config_path).stem, "predictions") + elif args.model_name: + output_dir = osp.join("./output", args.model_name, "predictions") + else: + output_dir = "./output/spectrum_enhancement/predictions" + + if args.input_path is not None: + saved_paths = predictor.from_image_path(args.input_path, output_dir, args.split) + else: + saved_paths = predictor.from_dataset(args.split, output_dir) + logger.info(f"Saved {len(saved_paths)} predictions to {output_dir}") + + +if __name__ == "__main__": + main() diff --git a/spectrum_enhancement/train.py b/spectrum_enhancement/train.py new file mode 100644 index 00000000..8c5436c5 --- /dev/null +++ b/spectrum_enhancement/train.py @@ -0,0 +1,182 @@ +# Copyright (c) 2026 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import argparse +import datetime +import os +import os.path as osp +from typing import Any +from typing import Dict + +import paddle.distributed as dist +import paddle.distributed.fleet as fleet +from omegaconf import OmegaConf + +from ppmat.datasets import build_dataloader +from ppmat.datasets import set_signal_handlers +from ppmat.models import build_model +from ppmat.optimizer import build_optimizer +from ppmat.trainer.base_trainer import BaseTrainer +from ppmat.utils import logger +from ppmat.utils import misc +from ppmat.utils.eager_comp_setting import setting_eager_mode + + +def read_independent_dataloader_config(config: Dict[str, Any]): + if config["Global"].get("do_train", True): + train_data_cfg = config["Dataset"].get("train") + assert train_data_cfg is not None, ( + "train_data_cfg must be defined when Global.do_train is True" + ) + train_loader = build_dataloader(train_data_cfg) + else: + train_loader = None + + if config["Global"].get("do_eval", False) or config["Global"].get("do_train", True): + val_data_cfg = config["Dataset"].get("val") + if val_data_cfg is not None: + val_loader = build_dataloader(val_data_cfg) + else: + logger.info("No validation dataset defined.") + val_loader = None + else: + val_loader = None + + if config["Global"].get("do_test", False): + test_data_cfg = config["Dataset"].get("test") + assert test_data_cfg is not None, ( + "test_data_cfg must be defined when Global.do_test is True" + ) + test_loader = build_dataloader(test_data_cfg) + else: + test_loader = None + return train_loader, val_loader, test_loader + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--case", + type=str, + default=None, + help=argparse.SUPPRESS, + ) + parser.add_argument( + "-c", + "--config", + type=str, + default="./spectrum_enhancement/configs/sfin/sfin_haadf_enhance.yaml", + help="Path to config file.", + ) + parser.add_argument( + "--append_timestamp", + action="store_true", + help="Append timestamp to Trainer.output_dir.", + ) + return parser.parse_known_args() + + +def main(): + if dist.get_world_size() > 1: + fleet.init(is_collective=True) + + args, dynamic_args = parse_args() + + cfg = OmegaConf.load(args.config) + cli_cfg = OmegaConf.from_dotlist(dynamic_args) + cfg = OmegaConf.merge(cfg, cli_cfg) + + if args.append_timestamp or cfg["Trainer"].get("append_timestamp", False): + seed = cfg["Trainer"].get("seed", 42) + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + base_output_dir = cfg["Trainer"]["output_dir"] + cfg["Trainer"]["output_dir"] = f"{base_output_dir}_t_{timestamp}_s_{seed}" + + if dist.get_rank() == 0: + os.makedirs(cfg["Trainer"]["output_dir"], exist_ok=True) + config_name = os.path.basename(args.config) + OmegaConf.save(cfg, osp.join(cfg["Trainer"]["output_dir"], config_name)) + + config = OmegaConf.to_container(cfg, resolve=True) + + logger_path = osp.join(config["Trainer"]["output_dir"], "run.log") + logger.init_logger(log_file=logger_path) + logger.info(f"Logger saved to {logger_path}") + + seed = config["Trainer"].get("seed", 42) + misc.set_random_seed(seed) + logger.info(f"Set random seed to {seed}") + + enabled = config["Global"].get("prim_eager_enabled", False) + white_list = config["Global"].get("prim_backward_white_list", None) + setting_eager_mode(enabled, white_list) + + model_cfg = config["Model"] + + set_signal_handlers() + if config["Dataset"].get("split_dataset_ratio") is not None: + loader = build_dataloader(config["Dataset"]) + train_loader = loader.get("train", None) + val_loader = loader.get("val", None) + test_loader = loader.get("test", None) + else: + train_loader, val_loader, test_loader = read_independent_dataloader_config( + config + ) + + model = build_model(model_cfg) + + if config.get("Optimizer") is not None and config["Global"].get("do_train", True): + assert train_loader is not None, ( + "train_loader must be defined when Optimizer is provided." + ) + assert config["Trainer"].get("max_epochs") is not None, ( + "Trainer.max_epochs must be defined when Optimizer is provided." + ) + optimizer, lr_scheduler = build_optimizer( + config["Optimizer"], + model, + config["Trainer"]["max_epochs"], + len(train_loader), + ) + else: + optimizer, lr_scheduler = None, None + + metric_cfg = config.get("Metric") + + trainer = BaseTrainer( + config["Trainer"], + model, + train_dataloader=train_loader, + val_dataloader=val_loader, + optimizer=optimizer, + lr_scheduler=lr_scheduler, + compute_metric_func_dict=None, + ) + trainer.attach_metrics(metric_cfg, model=model) + + if config["Global"].get("do_train", True): + trainer.train() + if config["Global"].get("do_eval", False): + logger.info("Evaluating on validation set") + trainer.eval(val_loader) + if config["Global"].get("do_test", False): + logger.info("Evaluating on test set") + trainer.eval(test_loader) + + +if __name__ == "__main__": + main() diff --git a/stability_prediction/configs/megnet_2d.yaml b/stability_prediction/configs/megnet_2d.yaml deleted file mode 100644 index 085c6ffd..00000000 --- a/stability_prediction/configs/megnet_2d.yaml +++ /dev/null @@ -1,45 +0,0 @@ - -dataset: - structures_path: "./data/2D_structure/structures_0621.pickle" - ehull_path: "./data/2D_structure/ehulls_0621.pickle" - # energy_path: "./data/2D_structure/energys_0621.pickle" - energy_path: null - ehull_clip: [-4, 4] - energy_clip: [-8, 2] - # select: [0.0, 0.5] - - cutoff: 4.0 - split_list: [0.9, 0.05, 0.05] - # split_list: [0.8, 0.1, 0.1] - -loss_weight: - ehull: 1.0 - energy: 1.0 - -model: - dim_node_embedding: 16 - dim_edge_embedding: 100 - dim_state_embedding: 2 - nblocks: 3 - hidden_layer_sizes_input: [64, 32] - hidden_layer_sizes_conv: [64, 64, 32] - nlayers_set2set: 1 - niters_set2set: 2 - hidden_layer_sizes_output: [32, 16] - is_classification: False - activation_type: "softplus2" - cutoff: 4.0 - gauss_width: 0.5 - dropout: 0.5 - num_predictions: 2 - # pretrained: './checkpoints/megnet_2d_v1/best.pdparams' - - -lr_cfg: - T_max: 1000 - eta_min: 0.00001 - learning_rate: 0.0005 -epochs: 2000 -batch_size: 128 - -save_path: "./checkpoints/megnet_2d_debug" diff --git a/stability_prediction/configs/megnet_3d.yaml b/stability_prediction/configs/megnet_3d.yaml deleted file mode 100644 index 9afc352c..00000000 --- a/stability_prediction/configs/megnet_3d.yaml +++ /dev/null @@ -1,33 +0,0 @@ - -dataset: - structures_path: "./data/structures.pickle" - mp_ids_path: "./data/mp_ids.pickle" - ehull_path: "./data/formation_energy.pickle" - - cutoff: 4.0 - split_list: [0.9, 0.05, 0.05] - -model: - dim_node_embedding: 16 - dim_edge_embedding: 100 - dim_state_embedding: 2 - nblocks: 3 - hidden_layer_sizes_input: [64, 32] - hidden_layer_sizes_conv: [64, 64, 32] - nlayers_set2set: 1 - niters_set2set: 2 - hidden_layer_sizes_output: [32, 16] - is_classification: False - activation_type: "softplus2" - cutoff: 4.0 - gauss_width: 0.5 - - -lr_cfg: - T_max: 1000 - eta_min: 0.00001 - learning_rate: 0.001 -epochs: 2000 -batch_size: 128 - -save_path: "./checkpoints/megnet_3d_debug" diff --git a/stability_prediction/data/2D_structure/cif_structure.tar.gz b/stability_prediction/data/2D_structure/cif_structure.tar.gz deleted file mode 100644 index 6fb1bbf6..00000000 Binary files a/stability_prediction/data/2D_structure/cif_structure.tar.gz and /dev/null differ diff --git a/stability_prediction/data/2D_structure/ehull_0621.csv b/stability_prediction/data/2D_structure/ehull_0621.csv deleted file mode 100644 index 7fc77bb3..00000000 --- a/stability_prediction/data/2D_structure/ehull_0621.csv +++ /dev/null @@ -1,21685 +0,0 @@ -cif,formula,energy,ehull -Ti4B3Cl2_164_19117.vasp,Ti4B3Cl2,-5.62949547,-0.06511333222222748 -Si1Sn1_156_16371.vasp,SiSn,-1.955340985,-1.7639782025000001 -V1S2_187_19919.vasp,VS2,-3.7471862066666666,0.007772626666666671 -Si2Cl8_7_16400.vasp,Si2Cl8,-2.113067556,0.08649700000000005 -Au2S2Br2_59_1511.vasp,Au2S2Br2,-0.41199002333333334,0.2735256171527771 -Sr1Br3_191_17033.vasp,SrBr3,-0.7866595775,0.5941009125000001 -V1As2Au1S6_5_19767.vasp,VAs2AuS6,-2.567038605,0.551746447166662 -Bi2Te1O2_164_2552.vasp,Bi2TeO2,-2.736076354,0.3583711093333306 -Sn4S1I1Br1Cl1O4_1_16955.vasp,Sn4SIBrClO4,-2.7267810591666666,0.22270415868055515 -Cu2I4O12_11_5176.vasp,Cu2I4O12,-2.392145552777778,0.14389623902777532 -Ca4Co2S6Cl2_129_3211.vasp,Ca4Co2S6Cl2,-2.6889137564285717,0.08636915205356877 -Na1Tl1Cl4O12_2_11948.vasp,NaTlCl4O12,-2.405960846666667,0.23282762509259003 -Co4S4I4_14_4086.vasp,Co4S4I4,-1.6382772149999998,0.06162266465277652 -V4Cu4O14_13_20321.vasp,V4Cu4O14,-4.070620285454545,0.22024941590909108 -Os2Se4_11_13889.vasp,Os2Se4,-3.3072146100000004,0.2374066499999996 -Sb2Cl10_11_15561.vasp,Sb2Cl10,-1.0514033,0.06286087749999991 -Li4Al4Cl16_14_10153.vasp,Li4Al4Cl16,-2.3921841487499997,0.07284641291666683 -Ti2Br6_189_18905.vasp,Ti2Br6,-2.51524485625,0.21102496375000035 -Ca2P4O12_2_3095.vasp,Ca2P4O12,-5.465551092777778,0.16368664916666642 -Ta2Os2S8_11_17818.vasp,Ta2Os2S8,-4.624130181666667,0.23529486541666644 -Sn2S2O8_31_16840.vasp,Sn2S2O8,-4.126544160833333,0.14527822643228855 -Nd2Cl6_59_13236.vasp,Nd2Cl6,-2.9897516975,0.12132606999999984 -Ge12Rh4_127_6634.vasp,Ge12Rh4,-3.02537700125,-0.3053111018749999 -In2Ga1S3I2Br1Cl1_1_8440.vasp,In2GaS3I2BrCl,-1.543702021,0.17481010896874738 -Nb3Te2I1Br1_25_13027.vasp,Nb3Te2IBr,-3.299598012857143,0.08567581632652432 -Zr1Se2_115_21443.vasp,ZrSe2,-3.5727716533333336,0.5173811874999998 -Zr2As2Se6_2_21505.vasp,Zr2As2Se6,-3.3098303909999998,0.22701528916666458 -Sr3Au2Cl2O4_123_17350.vasp,Sr3Au2Cl2O4,-2.6936803045454543,0.18114123329003895 -Si4Bi8_26_16487.vasp,Si4Bi8,-1.9796337908333335,-0.6716721108333347 -N2_164_11790.vasp,N2,-5.327988845,0.20576177750000024 -Mg3P3_25_10558.vasp,Mg3P3,-2.0532968,0.6621965568124965 -Ta6Te28Pd6_11_18160.vasp,Ta6Te28Pd6,-2.463521137,0.032747318541664364 -Zr4Te4Br4_31_21853.vasp,Zr4Te4Br4,-2.7573523525,0.19006604694444174 -Zr1Pd1F6_5_21401.vasp,ZrPdF6,-3.19036277625,0.21837071499999983 -Ti2As2Se6_2_18881.vasp,Ti2As2Se6,-3.5299369609999998,0.23630612766666426 -Cr3Ni1Se3S1Br1Cl2_1_4568.vasp,Cr3NiSe3SBrCl2,-1.9911083954545454,0.0130922671212034 -Cd2Cu2Se2F2_26_3495.vasp,Cd2Cu2Se2F2,-0.54813155875,-0.057249925312499936 -Ag2O4_2_344.vasp,Ag2O4,-1.5214779516666666,0.5089783487499985 -Au2Se4F2_4_1556.vasp,Au2Se4F2,-1.03726613125,0.3516478551562501 -Si2F8_1_16403.vasp,Si2F8,-3.807115322,0.043136435000000084 -Na1Co1Te6As2_149_11849.vasp,NaCoTe6As2,-1.697186109,0.24165174799999756 -Mn3Se1Br4O2_1_11406.vasp,Mn3SeBr4O2,-2.25633071,0.002853180285706608 -K2Br2Cl8_127_9007.vasp,K2Br2Cl8,-0.5005395625,0.14024073333333276 -Tl4Ge4Se10_5_19605.vasp,Tl4Ge4Se10,-1.9219505105555557,0.21475216111111117 -Ta3Te14Pt3_6_17994.vasp,Ta3Te14Pt3,-2.5717349835,0.08662584366666705 -Ca2Br4_51_2965.vasp,Ca2Br4,-1.6999213566666667,0.2302123066666668 -V2W2S8_25_20230.vasp,V2W2S8,-4.1552220725,-0.04144333083333329 -Ni1Au1F5_1_13259.vasp,NiAuF5,-0.88774248,0.15444065035714183 -Ni5Ir1S6I3Br1_1_13773.vasp,Ni5IrS6I3Br,-1.1384188125,0.08158560550781237 -Cr1In2S4_164_4205.vasp,CrIn2S4,-2.5584944514285715,0.20755185285714073 -In2Au2S4I3Br1_1_8380.vasp,In2Au2S4I3Br,-1.0071455666666667,0.14610602765624883 -Mg4Sb8O16_1_10582.vasp,Mg4Sb8O16,-4.141595373571429,0.1984003207142857 -Na2B2H6N8O2_51_11977.vasp,Na2B2H6N8O2,-4.9507471495,-1.6801362015833385 -Pb2Cl2_129_14238.vasp,Pb2Cl2,-0.8864440875,0.41006672875 -Ag2Hg2Se2I2_26_304.vasp,Ag2Hg2Se2I2,0.32618774125,-0.24355129375000004 -Mg1Sb2O5_6_10398.vasp,MgSb2O5,-4.23706817625,0.24003609031250006 -Cr2As2S10_129_4308.vasp,Cr2As2S10,-2.8739349978571425,0.4284084507589261 -Li4Zn2Si2_164_10255.vasp,Li4Zn2Si2,-1.3294119275,0.31633537374999987 -Mn2Mo2O8F2_129_11141.vasp,Mn2Mo2O8F2,-4.29740271,0.20474121285713887 -W2I8_1_20506.vasp,W2I8,-0.694949921,0.41507533279166686 -Sr2H8Br4O4_53_17240.vasp,Sr2H8Br4O4,-3.473673217222222,0.07878755898147816 -Na2Os2C2Br8O4_31_12244.vasp,Na2Os2C2Br8O4,-2.86792222,0.09495487555554805 -Ir1S1Cl1_156_8756.vasp,IrSCl,-2.6206246233333332,0.09233843166666666 -K2C2O8F6_4_9018.vasp,K2C2O8F6,-2.783545845,0.6171236426388811 -Mn1Cu1Cl2_6_10682.vasp,MnCuCl2,-0.800682935,0.9432722874999999 -Li1As2Pd1S6_5_9653.vasp,LiAs2PdS6,-2.606264104,0.37589389984374744 -Cu1Te2W1S1_6_4994.vasp,CuTe2WS,-2.158787658,0.3234535365000003 -Cu4Se2O12_14_5466.vasp,Cu4Se2O12,-2.659814846666667,0.34709368104166094 -Ga1Ni5Cl2_123_6221.vasp,GaNi5Cl2,-0.12360118,-0.01906274927685958 -Ca2Fe2Si2_129_3018.vasp,Ca2Fe2Si2,-1.7343598216666667,0.07436968541666439 -Re1Te2Cl12_2_15025.vasp,ReTe2Cl12,-1.3340410126666666,0.5206512112777721 -Ba2H8S6_26_1998.vasp,Ba2H8S6,-3.23996360375,0.055685025624999884 -K2La2Si2Se8_4_9210.vasp,K2La2Si2Se8,-3.1142333114285714,0.09181086857142828 -Ga1Ag1As2Se6_149_6111.vasp,GaAgAs2Se6,-1.94773735,0.24357342883333125 -Al2H4Pb2O4F6_2_866.vasp,Al2H4Pb2O4F6,-4.0027231527777785,0.137440129999999 -Tl1Fe5I2_123_19269.vasp,TlFe5I2,0.13454452375,1.505177195312499 -Cu2H8C10S2N6_4_5137.vasp,Cu2H8C10S2N6,-5.3330997771428565,0.30159691434522845 -Bi2As2S8_11_2420.vasp,Bi2As2S8,-2.5759278066666664,-0.06756499614583805 -Cd1Se2F2_12_3425.vasp,CdSe2F2,-0.895385528,0.7171891013333335 -Ba2Zr1S4_123_2091.vasp,Ba2ZrS4,-2.4034499714285715,1.655502035714286 -Ge2As6_164_6743.vasp,Ge2As6,-2.86562074375,-0.6767826718750002 -In1Ge1Pb1S1I2_1_8262.vasp,InGePbSI2,-1.36072516,0.12158038222222012 -Mn4N3O2_164_11442.vasp,Mn4N3O2,-4.570637863333333,0.5567929406944345 -Ni1Ge1Te2_21_13318.vasp,NiGeTe2,-1.2627079,-0.11718417520833502 -K2H14C6O6_12_9116.vasp,K2H14C6O6,-4.664337503571429,0.16284638620535252 -Ag2F2_51_257.vasp,Ag2F2,-0.43654558,0.309501575 -Mg1B2F8_164_10339.vasp,MgB2F8,-4.015027192727273,-0.4598785913636396 -As2Au2Se6_2_1190.vasp,As2Au2Se6,-1.4952692920000001,0.308990182833331 -Be4_67_2290.vasp,Be4,-2.7989949825,-0.5478371974999998 -Ca2Te2Au1Cl2_38_3132.vasp,Ca2Te2AuCl2,-1.2382637442857143,0.3063881642857116 -Au2Br4O12_4_1456.vasp,Au2Br4O12,-1.821326641111111,0.36207288502314694 -P1S1F1_156_13941.vasp,PSF,-2.8638877733333334,0.4518127953992991 -Sn1Ge1I2O2_1_16633.vasp,SnGeI2O2,-2.59591684,0.2041843143055555 -Fe2O4_59_5896.vasp,Fe2O4,-3.5109746633333336,0.2309664312499966 -Pt2N2Cl2_59_14638.vasp,Pt2N2Cl2,-2.6693450550000004,0.29622483999999605 -Hf2C2F2_164_7466.vasp,Hf2C2F2,-5.756428578333334,0.9760384112499938 -Si2O2_129_16419.vasp,Si2O2,-4.8709825225,0.6839894249999993 -Ba2Cu1S2F2_38_1968.vasp,Ba2CuS2F2,-2.593701534285714,0.42447693114582813 -K1F1_123_8895.vasp,KF,-1.910739865,-0.43329260000000014 -Ba1P2H12_2_1851.vasp,BaP2H12,-3.1286810673333334,1.3573385491666596 -Bi1Br2_115_2319.vasp,BiBr2,-0.5666720533333334,0.3663876494444435 -Sr2H8O6_1_17245.vasp,Sr2H8O6,-4.278327535625,0.07623562854166677 -Au2O4_2_1503.vasp,Au2O4,-1.6512725683333331,0.4247151168749974 -Ta4V2O12_12_18136.vasp,Ta4V2O12,-6.725954646111111,0.18743049722221614 -Co1O2_187_3806.vasp,CoO2,-3.23450474,-0.13733830791666946 -Hf1Zr1Ti1H1Cl2O4_1_7407.vasp,HfZrTiHCl2O4,-5.508268592,0.4841526336666593 -Cu2O1_191_5195.vasp,Cu2O,-0.41087271000000003,1.7671240220833315 -Sn2P1O6_162_16801.vasp,Sn2PO6,-4.336973727777778,0.513401277268513 -Hf3Ta1Te4I4_1_7732.vasp,Hf3TaTe4I4,-2.9608673975,0.409222947916663 -Hg4Se4_10_8090.vasp,Hg4Se4,0.2520171625,-0.5399876025000001 -Pt2Br2N2_59_14597.vasp,Pt2Br2N2,-2.4582387866666666,0.33945716124999614 -Zn2F2_164_21073.vasp,Zn2F2,-0.4294165775,0.16893065562499998 -Mg1U1_156_10410.vasp,MgU,-3.437280275,0.541317653333333 -Hf3Tl2Cu2Se8_12_7744.vasp,Hf3Tl2Cu2Se8,-3.07040777,0.12269802133333085 -Ba1Ta2O7_123_1864.vasp,BaTa2O7,-6.155083577,0.454438372624997 -Te6Pt2_11_18681.vasp,Te6Pt2,-1.453427965,0.32340906041666667 -Nb2Ni2Se6_11_12782.vasp,Nb2Ni2Se6,-2.823108384,0.11004532477777615 -Co2C2Cl2_59_3882.vasp,Co2C2Cl2,-3.0112115916666666,0.5302091608333299 -Bi2Pb2Se5_164_2500.vasp,Bi2Pb2Se5,-2.036230961111111,-0.001006268472223959 -In1Ni3P2S7_1_8289.vasp,InNi3P2S7,-2.078489193076923,0.30375764801682215 -Np2S6_51_13784.vasp,Np2S6,-4.80283168,0.52493281875 -V1B4H4S6Cl1_1_19774.vasp,VB4H4S6Cl,-3.6306768725,0.6813687029427035 -Sc2Te5S13_1_16184.vasp,Sc2Te5S13,-2.5138254265,0.3346722774791669 -Ga4Bi20_26_6542.vasp,Ga4Bi20,-1.1317628641666666,-0.5602230383333342 -Pt2S2Br2_59_14652.vasp,Pt2S2Br2,-1.69053315,0.06584115666666501 -Ag2P12_31_346.vasp,Ag2P12,-2.975270146428571,0.42181059428571177 -Na1Sn2As2_164_11936.vasp,NaSn2As2,-1.9232652399999999,0.2190780559999983 -Cu1Ge1As1W3Se5S1Cl4_1_4877.vasp,CuGeAsW3Se5SCl4,-2.3368863375,0.5207851442187499 -Bi2Br2N2_59_2429.vasp,Bi2Br2N2,-2.3858144016666665,0.0031103230555538097 -Mn1Nb3S8_187_10824.vasp,MnNb3S8,-4.411051339166667,0.1511124267708257 -Ta2I4_11_17764.vasp,Ta2I4,-2.4151786766666667,0.3869131654761843 -Ti4C3Cl2_164_19128.vasp,Ti4C3Cl2,-6.614682158888889,-0.24352831444445 -Co2P4S6Cl4_1_3972.vasp,Co2P4S6Cl4,-2.544855873125,0.314074584440102 -Fe1Cu1S2I2_6_5668.vasp,FeCuS2I2,-0.9427740349999999,-0.07345987284722197 -Al2I6_162_880.vasp,Al2I6,-0.8988761625,0.08293010374999998 -Rb2Al2H16N8_85_14766.vasp,Rb2Al2H16N8,-4.462142067499999,-1.795590465357148 -Si1Cl4_123_16329.vasp,SiCl4,-1.642212716,0.5573518399999999 -Li2Ti2N2F2_59_10096.vasp,Li2Ti2N2F2,-5.44670940375,0.07220184125000007 -Au2S2_129_1515.vasp,Au2S2,-0.468658365,0.5431302 -Li6S10F2_11_10271.vasp,Li6S10F2,-2.658818256111111,0.19609954583333078 -Si2P6_164_16429.vasp,Si2P6,-3.777359195,-0.6130712306249997 -V2Cl10_1_20027.vasp,V2Cl10,-1.6035536041666667,0.04250550666666486 -Na1Tl1I4O12_2_11949.vasp,NaTlI4O12,-2.6173242955555556,0.09642109633679985 -Cu3Se1S1Br5_1_5385.vasp,Cu3SeSBr5,-0.44683445099999997,0.16658887712499876 -Mn2Ga2Te5_164_11084.vasp,Mn2Ga2Te5,-1.684369972222222,0.17703707274584746 -P8S20_14_14154.vasp,P8S20,-3.0484346160714284,0.14158282107142872 -Sr2H8S4I4_53_17250.vasp,Sr2H8S4I4,-2.5235036061111114,0.0597574818518492 -As4Au2S12_12_1316.vasp,As4Au2S12,-2.2193481366666665,0.5425209045833308 -Ru1S1I2_47_15290.vasp,RuSI2,-1.3934489825,0.21753640835937493 -In2Fe1O4_164_8428.vasp,In2FeO4,-3.6078265157142857,0.2900507040476161 -Y2Mn2S2O5_123_20757.vasp,Y2Mn2S2O5,-5.119119536363637,0.2363245249020296 -Se2_164_16292.vasp,Se2,-1.461238985,0.8467495683333333 -Mn1Te2_115_10911.vasp,MnTe2,-1.31689584,0.4588998799999999 -Hf1I1Cl1O1_1_7194.vasp,HfIClO,-3.94883316,0.52707953015625 -Zr1Sc1I1N1Cl1_156_21432.vasp,ZrScINCl,-4.188238286,0.14322439166666545 -Sc2Br4Cl2_8_16044.vasp,Sc2Br4Cl2,-2.4660542975,0.049096206249997665 -Er2Bi2O6_147_5547.vasp,Er2Bi2O6,-4.863271779,0.3547344058750004 -Mn1Cu1S2I3_1_10689.vasp,MnCuS2I3,-0.9637348214285714,0.15477771645833352 -Sb2Te2I2_2_15716.vasp,Sb2Te2I2,-1.2089036716666668,0.14440889499999976 -K1Cl1O3_156_8890.vasp,KClO3,-2.309089376,0.25639769099999743 -Zn2In4Se8O24_14_21115.vasp,Zn2In4Se8O24,-3.55901865,0.04118546315789473 -U2Ge4_2_19710.vasp,U2Ge4,-4.873585106666667,0.4623566016666598 -K2Hg4S8Cl6_31_9183.vasp,K2Hg4S8Cl6,-0.835453023,0.26527379556249864 -Zn1C6N4_115_20908.vasp,ZnC6N4,-5.652556632727273,0.8948954461363519 -Cu4S2I2Br2O1_1_5443.vasp,Cu4S2I2Br2O,-0.63037577,0.35380069791125157 -Al1P2Au1Se6_149_705.vasp,AlP2AuSe6,-2.3381563400000003,0.0412368500000001 -Sc3H2S2N2_187_16208.vasp,Sc3H2S2N2,-4.829204481111111,-0.9574386972222291 -K1V3Se2O12_143_8954.vasp,KV3Se2O12,-4.652072637222222,0.08051863277777827 -V1Cd1S2_8_19795.vasp,VCdS2,-1.807831965,0.01363787624999957 -P2W8Br22_59_14063.vasp,P2W8Br22,-2.196571066875,0.06283519005208349 -Hf3Mo1I3Br5_1_7715.vasp,Hf3MoI3Br5,-2.439059346666667,0.3540147334027747 -Ru2S2_129_15342.vasp,Ru2S2,-3.5010956125,0.25944852500000026 -Nd1Si2_123_13227.vasp,NdSi2,-3.2485742,0.9148449388888843 -Cs1Ge1O2_156_4639.vasp,CsGeO2,-2.9595299575,0.7545098135937501 -Ga1S2Br1_8_6259.vasp,GaS2Br,-1.979756795,0.29282112546874983 -Al1Cd1In1O4_156_623.vasp,AlCdInO4,-3.7229562128571425,0.3470328878273792 -Sr3F6_5_17372.vasp,Sr3F6,-3.6547080666666667,0.15880860333333358 -Zn2Sb4O8_26_21156.vasp,Zn2Sb4O8,-3.3909535650000002,0.30120262321428337 -Pd2O2_47_14446.vasp,Pd2O2,-1.82343606,0.8165129975000001 -B2O3_164_1689.vasp,B2O3,-5.981784768,0.8725496073333341 -Ga2Co1Te4_164_6329.vasp,Ga2CoTe4,-1.69163277,0.11766877095237938 -Te4C4_57_18582.vasp,Te4C4,-2.87707946375,1.9669761195833333 -Re2Se4_11_15085.vasp,Re2Se4,-4.080492655,0.0812711833333335 -Sr2Cd1In1Au1O5_99_17171.vasp,Sr2CdInAuO5,-2.539753693,0.576144484714901 -Sn1As2S4_164_16601.vasp,SnAs2S4,-2.7841383,0.05571956767856889 -Nb1Zn1Se1S1_156_12618.vasp,NbZnSeS,-2.619156155,0.15984055800480557 -K2C2Br2N4O8_2_9012.vasp,K2C2Br2N4O8,-4.135806441111111,0.3844505100925888 -Hf1O2_115_7250.vasp,HfO2,-7.037997523333334,0.7494963749999997 -Cu1Rh1S2Br2_6_4951.vasp,CuRhS2Br2,-1.4155286383333332,0.3165213360784285 -Pd1C6Br2N2F4_25_14349.vasp,PdC6Br2N2F4,-4.542130529333334,0.2753483897222164 -P12Se12_7_13906.vasp,P12Se12,-2.7049819533333337,0.36395354135416635 -Er2Fe2Ge4_129_5558.vasp,Er2Fe2Ge4,-2.40733841125,0.31983009874999996 -Co2As4S6I4_11_3856.vasp,Co2As4S6I4,-1.99220592625,0.3253085887335472 -Ca1Cl2_115_2817.vasp,CaCl2,-2.099495333333333,0.12873580500000026 -Ag2P2O6_1_349.vasp,Ag2P2O6,-4.040574514,0.1931992719999993 -Na2Zr2Cu2Te6_11_12348.vasp,Na2Zr2Cu2Te6,-1.88118325,0.19172340583333347 -Mn2Te2_129_11306.vasp,Mn2Te2,-1.6353946675,0.2108430231896552 -C3O6_5_2763.vasp,C3O6,-5.843106362222223,0.35098919111111115 -P2F2_11_13973.vasp,P2F2,-3.2270226175,0.34244334583333047 -Al1Tl1Cd1S4_156_752.vasp,AlTlCdS4,-2.0145506485714284,0.10850395651785366 -Rb2Te2N2Cl6O6_4_14954.vasp,Rb2Te2N2Cl6O6,-2.264651695,0.5530457460770166 -Ba4As4S8F4_14_2134.vasp,Ba4As4S8F4,-3.3541452305,0.17609060074999716 -Te1Ir3S4I1Br1_1_18296.vasp,TeIr3S4IBr,-2.198809969,0.2610224159833271 -Pt2I1Cl1O2_1_14625.vasp,Pt2IClO2,-1.6726450466666665,0.34832604916666554 -Hf1Sc1I2Br2_25_7296.vasp,HfScI2Br2,-2.0950150183333336,0.4419353144444419 -Al1Si1S3_1_741.vasp,AlSiS3,-3.173190786,0.5925136953749961 -As8S20_14_1402.vasp,As8S20,-2.7062947460714284,0.5555972883928548 -Os1S1Br2_47_13814.vasp,OsSBr2,-2.021718545,0.34613850843749994 -Ni4Br4O4_14_13742.vasp,Ni4Br4O4,-1.3482854033333334,-0.133207870000001 -In6H1Br5O8_1_8708.vasp,In6HBr5O8,-2.811734671,0.2445526411874972 -Na2Bi10O16_2_11990.vasp,Na2Bi10O16,-3.588509333928571,0.08803629464285445 -Sn3Sb4_5_16930.vasp,Sn3Sb4,-1.6067579985714284,0.29329100598214275 -Sb2S2I2_59_15679.vasp,Sb2S2I2,-1.6404016733333335,-0.6367505366666668 -Mn1Sn1Se2_6_10897.vasp,MnSnSe2,-1.80818004,0.12418597314654956 -V3H4O8_8_20270.vasp,V3H4O8,-4.857325948,0.2719219817777745 -Bi4I12_14_2613.vasp,Bi4I12,-0.414061876875,0.07569214937499996 -Sb16Br4_10_15421.vasp,Sb16Br4,-1.8645133015,0.10312618399999862 -Zn2Cl2_129_21057.vasp,Zn2Cl2,0.75312787,0.60406443609375 -Ag2Bi2S4_26_196.vasp,Ag2Bi2S4,-1.48340080875,0.26169785916666677 -Sc1Ge3_187_15938.vasp,ScGe3,-2.6362119575,0.5605516699999997 -Mn1H8C10Se2N6_12_10768.vasp,MnH8C10Se2N6,-5.662963744074074,-1.6504335264197538 -Cr1Si1S2I1Br1_6_4266.vasp,CrSiS2IBr,-2.4375818466666668,0.092733903484843 -K2Cd4S6I6O2_31_9052.vasp,K2Cd4S6I6O2,-0.7935425119999999,0.31262666989583143 -Ta2Os2Se8_11_17819.vasp,Ta2Os2Se8,-3.9717215825000003,0.14812861833333324 -Te1Pb1_156_18322.vasp,TePb,-1.158715625,-1.2194828 -Ru2O6_2_15335.vasp,Ru2O6,-4.0255210275,0.5365551703125 -Mg2N1_164_10488.vasp,Mg2N,-2.7168344033333334,0.31565371486111005 -Cd2Te6Pt4_164_3603.vasp,Cd2Te6Pt4,-1.0025569691666667,0.09343101916666541 -Tc2S2_129_18236.vasp,Tc2S2,-5.5827797725,0.37811905 -Ge2Br2_129_6755.vasp,Ge2Br2,-1.62601014,0.15081282625000003 -Mn2Sb2Te4F2_26_11258.vasp,Mn2Sb2Te4F2,-1.790034258,0.3531808254999982 -Na2Cd4Te2S6I6_31_12049.vasp,Na2Cd4Te2S6I6,-0.7292196175,0.05164053045833128 -Sr2Cu1S2Br2_38_17200.vasp,Sr2CuS2Br2,-2.007724802857143,0.024990806190472115 -Hf2I5Br1_1_7522.vasp,Hf2I5Br,-2.09149593375,0.29143383722221605 -In1Cu1Te6As2_149_8240.vasp,InCuTe6As2,-1.34078573,0.28200866416666526 -Sr2Mn2Ge2_129_17275.vasp,Sr2Mn2Ge2,-1.6579399916666666,0.40316840091953865 -Sb2S2F2_59_15676.vasp,Sb2S2F2,-2.6005609,0.3421612399999976 -Y1Be5_1_20607.vasp,YBe5,-2.823492293333333,0.7342937775640994 -Nb2Te1Se3_99_12903.vasp,Nb2TeSe3,-3.7562365750000004,0.2828952709027778 -Zr1Nb1Se1Cl1_25_21356.vasp,ZrNbSeCl,-3.59521573,0.5713238747916627 -Cu2Te6P2_162_5360.vasp,Cu2Te6P2,-1.348433149,0.3629550943333333 -Nb2P2S6_162_12806.vasp,Nb2P2S6,-4.123757832,-0.12461059902778082 -Ag1Ge1I2_6_60.vasp,AgGeI2,-0.4728405725,0.08210419937499996 -Sr2Au2_191_17136.vasp,Sr2Au2,0.302218865,0.34511861625 -Al2Se2_12_971.vasp,Al2Se2,-2.818966585,0.12939246000000004 -Na2Hf1H6S6_147_12143.vasp,Na2HfH6S6,-3.415658572,0.11661971683333361 -Mn1Au3S1Br2Cl1O4_1_10644.vasp,MnAu3SBr2ClO4,-1.4936928875,0.583890831875 -Ga1P1_156_6229.vasp,GaP,-2.71230666,-0.5687816799999998 -Ge2C2Br2_59_6760.vasp,Ge2C2Br2,-2.975958123333333,0.914032324166663 -Zn2Fe4S10_11_21078.vasp,Zn2Fe4S10,-1.770486859375,-0.02047739950000016 -Nb4Sn2S8_55_13158.vasp,Nb4Sn2S8,-4.139683803571429,0.36374244571428216 -Er2H4Cl2O4_11_5560.vasp,Er2H4Cl2O4,-4.661013476666667,0.07854272500000015 -Sc1Si5_47_16003.vasp,ScSi5,-3.568968248333333,-0.16509261166666955 -Ta4Te12I2_2_18124.vasp,Ta4Te12I2,-2.7156185805555553,0.16606471296296088 -Ag2Sb4Te3I2_6_421.vasp,Ag2Sb4Te3I2,-0.8993384172727272,0.2287315186363611 -Ag1S1I1Br1_1_110.vasp,AgSIBr,-0.3033666725,0.20777372281250006 -Ge2W1S3I2_1_6896.vasp,Ge2WS3I2,-2.56812554125,0.12894538718749993 -Mo1Se2_115_11549.vasp,MoSe2,-2.3512422266666664,0.6941709966666672 -Hg1Br2_164_7843.vasp,HgBr2,0.51480021,0.08788287666666666 -Ho1Se1_8_8120.vasp,HoSe,-2.84632201,0.95332493 -Na6Te2S8F2_11_12448.vasp,Na6Te2S8F2,-2.28161307,0.06246819909722001 -Hg2S2N2Cl2O6_26_7997.vasp,Hg2S2N2Cl2O6,-2.6476427971428573,0.4331052715178486 -V2H2S2N1_164_20078.vasp,V2H2S2N,-4.127149064285715,0.0021534430519387637 -Zr1Sc1Se1Cl1O1_8_21436.vasp,ZrScSeClO,-4.395659258,0.15297607900000032 -Ta4Co8S8_59_18028.vasp,Ta4Co8S8,-3.8200309590000003,0.10236823000000017 -Nb2Cl4O2_25_12681.vasp,Nb2Cl4O2,-4.3197235175,0.05765152000000029 -Nb4Si2S8_55_13155.vasp,Nb4Si2S8,-4.766880961428571,0.1399552790043197 -Ge8Ir2_125_6971.vasp,Ge8Ir2,-3.181975431,-0.028877753333336642 -Al1B4_47_612.vasp,AlB4,-4.604332756,-0.14922343466666588 -Cu1Se2_164_4976.vasp,CuSe2,-0.9122569033333333,-0.6961668483333333 -Ca2P4H12O18_2_3092.vasp,Ca2P4H12O18,-4.951462779722222,0.04449903555555501 -Pb8Se8O24_14_14340.vasp,Pb8Se8O24,-3.60796200375,0.04911279324999995 -As2Cl8_1_1206.vasp,As2Cl8,-1.196600984,0.1183784404999999 -Mn1Ga2S4_156_10726.vasp,MnGa2S4,-2.8617924757142856,0.03451584142857156 -Ta1H2_187_17550.vasp,TaH2,-4.435267416666666,0.2817415883333343 -Cu2Te4_14_5357.vasp,Cu2Te4,-0.4525638783333333,0.4496850638888881 -Bi2Cl6_162_2448.vasp,Bi2Cl6,-1.3532003775,0.062093082499999896 -Mg4Sn8O16_59_10587.vasp,Mg4Sn8O16,-4.040613675,0.21515179107142446 -Er2Co2Si4_129_5556.vasp,Er2Co2Si4,-3.40571055375,0.4754510516666629 -K2Ru2N2Cl10O2_2_9321.vasp,K2Ru2N2Cl10O2,-2.291164777777778,-0.003999779166671713 -Ti2Br6_2_18906.vasp,Ti2Br6,-2.60978456125,0.11648525875000004 -Y1S1Br1_25_20662.vasp,YSBr,-4.047572176666667,0.2361047549999995 -Hg4Br4O12_13_8068.vasp,Hg4Br4O12,-1.3889624475,0.3199536538750005 -Pd2Cl2O4_2_14411.vasp,Pd2Cl2O4,-2.0165773,0.23947543385416692 -Hf2I1Br3O2_8_7508.vasp,Hf2IBr3O2,-4.209928515,0.1983011792187503 -Mg3_123_10571.vasp,Mg3,0.26466149,-0.14958691833333332 -Hg3F6_143_8057.vasp,Hg3F6,-0.36635770777777776,0.08038584805555554 -V1S2O8_164_19915.vasp,VS2O8,-4.600553654545454,0.05727262022726887 -Mo2H6_11_11617.vasp,Mo2H6,-3.1499297225,1.81169925625 -As8O16_26_1399.vasp,As8O16,-4.270401307916667,0.17080187749999132 -Ga1Sn3S6Br2_6_6287.vasp,GaSn3S6Br2,-2.2037002083333332,0.11475206333333365 -Mo1W3Se8_25_11559.vasp,MoW3Se8,-3.6139346758333333,-0.6714054916666667 -Hf4H2N3O2_164_7785.vasp,Hf4H2N3O2,-6.823641257272727,0.45610476659089527 -Si8Pt2_100_16550.vasp,Si8Pt2,-3.4815158429999995,-0.22651721699999916 -Ni4Sb4Se4_13_13762.vasp,Ni4Sb4Se4,-1.2631513508333334,0.4132062449999998 -Al2N6_164_895.vasp,Al2N6,-5.24650081,0.6873069512500005 -Ga1Os1S2I1Cl3_1_6227.vasp,GaOsS2ICl3,-2.0067475875,0.37047900992187494 -Au4Cl4O4F4_14_1569.vasp,Au4Cl4O4F4,-0.64233884875,0.4701824630729166 -Mn2Br6_191_11035.vasp,Mn2Br6,-0.7942944525,0.31405410375 -Te2Pt2S6_11_18488.vasp,Te2Pt2S6,-2.2796573479999998,0.11459622224999766 -K2Fe2P2N2O14_2_9102.vasp,K2Fe2P2N2O14,-4.545380800454546,0.04715298272727164 -Mg1F2_164_10357.vasp,MgF2,-3.427739486666667,-0.30711381500000057 -Tl2Br6_26_19386.vasp,Tl2Br6,-0.25452303875,0.16990097406250004 -Pt2I6_189_14636.vasp,Pt2I6,0.13779452125,0.46618557671874983 -K8P8H4O26_1_9555.vasp,K8P8H4O26,-4.724235533260869,0.09934418146738677 -Li1V1F4_10_9806.vasp,LiVF4,-3.578389963333333,-0.475847866666669 -Sr2Bi4O8_11_17146.vasp,Sr2Bi4O8,-3.940885477142857,0.04073237785714312 -Li1Sb3_187_9787.vasp,LiSb3,-1.7951136525,0.5849549046875001 -Nb4Ge4O14_26_13081.vasp,Nb4Ge4O14,-5.907586473636363,-0.0002779255681848447 -Be2Pb2F8_59_2264.vasp,Be2Pb2F8,-3.3233550708333333,0.16272430708333352 -Cr2Se2_164_4501.vasp,Cr2Se2,-2.7756117525,0.3899897699999999 -Nd1S3_191_13225.vasp,NdS3,-3.0154139,0.9610121948281253 -Ta4Te16Pd3_2_18129.vasp,Ta4Te16Pd3,-2.578529302173913,0.08099327249999422 -In2S2Br2_59_8543.vasp,In2S2Br2,-1.7968520966666668,0.06978606916666674 -Nb3C2O2_187_12962.vasp,Nb3C2O2,-7.326368675714286,0.0972196593452237 -Sr2Cu2H8O8_47_17213.vasp,Sr2Cu2H8O8,-3.813962672,0.135099330277775 -Sn2Br2O2_59_16744.vasp,Sn2Br2O2,-2.4941996333333334,0.2699058066666664 -W2Se4_11_20553.vasp,W2Se4,-3.77420072,-0.38274034999999973 -Cu2Re1I6_147_5236.vasp,Cu2ReI6,-0.43823399,0.21755404358796232 -Mn2Sb2Br2O4_10_11231.vasp,Mn2Sb2Br2O4,-3.2246783530000003,0.11535473599999957 -Sc2Nb1Br2N2_5_16108.vasp,Sc2NbBr2N2,-4.833095191428571,0.20827947015871517 -Ta4Te2O16_13_18130.vasp,Ta4Te2O16,-5.777388526818182,0.17049047738635936 -Fe4C3O2F2_164_6075.vasp,Fe4C3O2F2,-2.9528647672727275,1.5478535299999858 -Li2O2F2_129_10031.vasp,Li2O2F2,-2.6545481233333335,0.5721342520833304 -Pd2S2Br2_59_14458.vasp,Pd2S2Br2,-1.3504408983333331,0.07816914166666677 -Cu2N6_49_5193.vasp,Cu2N6,-4.48028198125,0.06713428562500035 -Ba1I1Cl1_156_1838.vasp,BaICl,-1.89535321,0.2669389216666669 -Tl1Pd5I2_123_19322.vasp,TlPd5I2,-0.605065415,0.4860595657812499 -Pd3N6_147_14504.vasp,Pd3N6,-2.9405159888888885,1.2979667061111078 -Sr4Cu4O6_1_17427.vasp,Sr4Cu4O6,-2.3335633692857143,1.0152306807142797 -Hg2I2N2O6_26_7969.vasp,Hg2I2N2O6,-2.599205663333333,0.05217616083333354 -Zr1As2_164_21248.vasp,ZrAs2,-3.6140544,-0.42904138500000055 -Cs2C2S8Cl6_1_4673.vasp,Cs2C2S8Cl6,-2.1548635394444444,0.3430284608680523 -As4S6_7_1365.vasp,As4S6,-2.898571028,0.6209239004999998 -Cd1Sn2S2Cl2_12_3432.vasp,CdSn2S2Cl2,-1.4744246728571428,0.11792786142856848 -K2Mg1O10F4_2_9221.vasp,K2MgO10F4,-2.325038724705882,0.8236176748529389 -Cu2H4O4_31_5128.vasp,Cu2H4O4,-3.2457566819999997,0.3270854444166673 -Ag2Te4P2_26_482.vasp,Ag2Te4P2,-1.21845365125,0.3893609701136357 -Hg2Br2_47_7947.vasp,Hg2Br2,1.2222852525,0.4315516975000001 -Li1In1Br4O12_2_9728.vasp,LiInBr4O12,-2.549350182777778,0.18903649090276975 -Zn2Sb2Te6_147_21149.vasp,Zn2Sb2Te6,-0.7514137,0.3779900566666651 -Nb1Br2_115_12480.vasp,NbBr2,-2.3140040266666664,0.6473054945833298 -Ga2Pd1Se4_164_6434.vasp,Ga2PdSe4,-2.1453121057142854,0.026642367142855672 -Zr2Sb2S6_2_21663.vasp,Zr2Sb2S6,-3.739594143,0.22663037566666464 -Hf2Mn3Br3Cl1O5_1_7530.vasp,Hf2Mn3Br3ClO5,-4.274733084285715,0.26897857424568256 -Cr1P2_187_4233.vasp,CrP2,-3.659515556666667,0.5507322983333327 -Mg2B4H16_26_10426.vasp,Mg2B4H16,-3.709863968636364,0.020855252196969154 -K2Cd4Te2S6Cl6_31_9071.vasp,K2Cd4Te2S6Cl6,-1.013076847,0.24293180004166426 -Ta2Se2F2_59_17871.vasp,Ta2Se2F2,-4.651676356666667,0.18595267466665666 -Nb1In2H1S3Br3_1_12529.vasp,NbIn2HS3Br3,-2.479354421,0.370564459749998 -K2C2Se2O6F6_1_9028.vasp,K2C2Se2O6F6,-3.2862475511111113,0.45881579874999645 -Tl18Se9_143_19195.vasp,Tl18Se9,-0.9054267681481482,0.17685887629629626 -B2Au2S2Br2_31_1653.vasp,B2Au2S2Br2,-1.54925794875,1.3470463527083334 -Ag2H4C6I2_2_280.vasp,Ag2H4C6I2,-3.9918693671428573,0.41679601285714174 -Cr1F2_164_4169.vasp,CrF2,-3.2590364,0.02661071333333065 -Sb1Mo1Se3_1_15469.vasp,SbMoSe3,-2.216753084,0.549605931499998 -Zr2Br2_164_21524.vasp,Zr2Br2,-2.9753611325,0.09796515500000025 -Rh2Se2Cl2_11_15235.vasp,Rh2Se2Cl2,-2.0371259616666664,0.08849516500000032 -Sn2P2O6F2_7_16816.vasp,Sn2P2O6F2,-4.60712375,0.04362180708333341 -Zn3Au1_191_21201.vasp,Zn3Au,1.9687629125,0.5355377915624999 -Cu1I2_187_4910.vasp,CuI2,0.5115809333333333,0.31408334263888904 -B2Ru1_123_1697.vasp,B2Ru,-4.303058623333333,1.3457352416666657 -Cu2H4C2I2N4_2_5117.vasp,Cu2H4C2I2N4,-3.825686097857143,0.20458675898808595 -Ge2Cl2_164_6769.vasp,Ge2Cl2,-1.8487493225,0.16989026124999984 -V1Ag1As2Se6_5_19748.vasp,VAgAs2Se6,-2.172898633,0.19770184959999829 -Sr1O2F2_164_17068.vasp,SrO2F2,-2.453102856,1.1778726645000006 -Ga2Se2Br2_31_6466.vasp,Ga2Se2Br2,-1.8527003533333335,0.023666049166666703 -Ga2H2O4_31_6375.vasp,Ga2H2O4,-4.346966185,-0.5680197412500001 -Al1Br2_115_615.vasp,AlBr2,-1.2874502933333334,0.45797704277777623 -Br3N1_1_2706.vasp,Br3N,-0.8471218675,0.5314669706250001 -Os2N2Cl2_59_13856.vasp,Os2N2Cl2,-3.99121083,0.0011051937499970688 -Ga6O9_150_6584.vasp,Ga6O9,-4.436899503999999,-0.3688152067500028 -Si2Se2_31_16450.vasp,Si2Se2,-2.9797187175,0.1118873826562502 -Al2Ni1Se4_164_898.vasp,Al2NiSe4,-2.3260987514285714,0.010395414285713 -Cu9Pb2Se4Cl4O16_10_5507.vasp,Cu9Pb2Se4Cl4O16,-2.334384361142857,0.28325696824999114 -Mn2C2F2_59_11045.vasp,Mn2C2F2,-3.7043287516666665,0.7657800766666629 -Pt2Br2_12_14601.vasp,Pt2Br2,-0.9654363225,0.46423228812499995 -Mn2As2Se4Br2_26_10979.vasp,Mn2As2Se4Br2,-2.066041719,0.09001955791666394 -Nb3S1I7_156_13001.vasp,Nb3SI7,-2.27895785,0.08118896818181831 -Ag1As1Se2Cl2_1_3.vasp,AgAsSe2Cl2,-1.2843218733333333,1.1596897677777724 -Te1Pt2Se1_8_18329.vasp,TePt2Se,-1.52963318,0.49743992531250003 -V1H4N4Cl1O6_1_19856.vasp,VH4N4ClO6,-4.45139295375,0.1504082308033854 -Fe1Pd1S2I1Br1_6_5738.vasp,FePdS2IBr,-1.4244770233333333,-0.2361465058333334 -Sb1Au3S4_156_15436.vasp,SbAu3S4,-0.98092135125,0.46230704562499986 -Fe2Se2_67_5980.vasp,Fe2Se2,-0.9090264175,0.47436641999999996 -Pb1S2_187_14202.vasp,PbS2,-2.1306270266666667,-0.8092431302083346 -Y4N3Cl2_164_20830.vasp,Y4N3Cl2,-6.1858412677777785,-0.1974154133333399 -Ca2Bi4S8_11_2957.vasp,Ca2Bi4S8,-2.559838127142857,-0.6800620321428595 -Al1Cu1Sb2S6_149_645.vasp,AlCuSb2S6,-2.3906231989999998,0.3762411189374979 -Ga1Pt3Br3N3Cl1O1_1_6248.vasp,GaPt3Br3N3ClO,-2.5529901991666666,0.30745277593749787 -Cd2Sb2S4I2_11_3562.vasp,Cd2Sb2S4I2,-1.223623641,-0.32486747449999986 -Nb2Cl2_129_12680.vasp,Nb2Cl2,-3.255507185,0.9568708180357091 -Ag2C2S2F2_31_222.vasp,Ag2C2S2F2,-2.33899529875,0.7200141805468749 -Tl2Se2I2_59_19529.vasp,Tl2Se2I2,-0.5788036033333334,0.4826677861111102 -Sc4S6_65_16262.vasp,Sc4S6,-4.205796187,0.3806392735000008 -Sc2B1F2_164_16033.vasp,Sc2BF2,-4.317594138,-0.23556665816666889 -Li2Co2P2O8_11_9863.vasp,Li2Co2P2O8,-4.775859466428571,0.020030367380948322 -Fe1Ge1S1Br3_1_5680.vasp,FeGeSBr3,-1.6024751383333333,-0.04307884718750288 -Ni1Bi1_187_13280.vasp,NiBi,0.67675515,1.6856232512499998 -Mn2Sb2Te2Mo1_1_11253.vasp,Mn2Sb2Te2Mo,-1.7982591757142856,0.2571347414285696 -Ta2O2_6_17812.vasp,Ta2O2,-6.614717455,1.123555259000001 -Na12Ge4Te12_14_11804.vasp,Na12Ge4Te12,-1.631495639642857,0.13417282214285559 -K4Hg2I8_11_9462.vasp,K4Hg2I8,0.05504579642857143,-0.2728236738095234 -Nb2Se2I1Br1_6_12872.vasp,Nb2Se2IBr,-3.396397856666667,-0.19520670910714966 -Te2Ru2_67_18520.vasp,Te2Ru2,-1.90090463,1.11432789375 -Te2P2H2S10_4_18437.vasp,Te2P2H2S10,-2.720895579375,0.13165708489583353 -Th2N2Cl2_129_18726.vasp,Th2N2Cl2,-6.134721258333333,0.15170425166666668 -V2B1Cl2_164_19986.vasp,V2BCl2,-3.48851389,0.21194073600000007 -Er2Se2I2_59_5574.vasp,Er2Se2I2,-2.830859788333333,0.04425130833333357 -K2Mn2Sb2_129_9243.vasp,K2Mn2Sb2,-1.0114682133333333,0.3501701325862058 -Ca2O8F4_125_3081.vasp,Ca2O8F4,-2.593945012857143,0.9717549978571394 -Cr1Sb2Te6Au1_149_4257.vasp,CrSb2Te6Au,-1.285831001,0.3036610944999979 -Tl1In1Cl6_5_19293.vasp,TlInCl6,-1.04654395375,0.04558451124999996 -Sb4S6_11_15817.vasp,Sb4S6,-2.6626031990000003,0.14138992100000003 -In2Te1S1I2_1_8611.vasp,In2TeSI2,-1.0997331316666668,0.1611483474999999 -In2Si2Te2_164_8605.vasp,In2Si2Te2,-2.2070554666666666,-0.28699977000000165 -Al2Te3P2S3_1_1014.vasp,Al2Te3P2S3,-2.775435368,0.37494643587500015 -Be1As2S4F4_5_2214.vasp,BeAs2S4F4,-2.7742204527272727,0.6258730066287819 -Na2Cd4Se2O6F6_31_12039.vasp,Na2Cd4Se2O6F6,-2.0861492779999997,0.2260603520000002 -Zn2Te2_129_21185.vasp,Zn2Te2,0.088613675,0.211294535 -Na12Si4Te12_14_11805.vasp,Na12Si4Te12,-1.793646882142857,0.15349766285714295 -Te2Mo2N1_164_18408.vasp,Te2Mo2N,-3.427056628,0.12899905400000033 -Ga1Rh2I1Cl1O2_6_6255.vasp,GaRh2IClO2,-2.262427462857143,0.5979266967857089 -W1O2_191_20444.vasp,WO2,-4.218039963333333,2.049659805306116 -Bi2O2_164_2484.vasp,Bi2O2,-2.8443890475,0.4484174749999985 -Hg2P2S6_147_7980.vasp,Hg2P2S6,-2.035116839,0.0784565934999999 -Ti2S1I1Br1N1_6_18991.vasp,Ti2SIBrN,-4.579034993333333,0.14497487291666156 -Ge2P2_164_6815.vasp,Ge2P2,-3.609521435,-0.5000356299999997 -Mg2Sb4_12_10511.vasp,Mg2Sb4,-1.491789595,0.21838917374999844 -Fe3H2C2_187_6053.vasp,Fe3H2C2,-3.0664742685714286,1.2162238228571391 -Ga8Te12_14_6593.vasp,Ga8Te12,-1.686285479,0.12373850620000007 -Ni1Ir3S8_1_13374.vasp,NiIr3S8,-2.8643614208333332,-0.0864425732291689 -Zn2Te1S1I1_8_21175.vasp,Zn2TeSI,-0.21989551999999998,0.34347991409166667 -P4C3_5_14077.vasp,P4C3,-5.05287085,0.737552031428566 -Rh2F2_129_15188.vasp,Rh2F2,-0.8311951075,1.6716656233333311 -Ni2Sb2Te5_8_13618.vasp,Ni2Sb2Te5,-1.0344173877777778,0.2263320679365054 -Ti4Te4Cl4_31_19166.vasp,Ti4Te4Cl4,-3.4751738383333333,0.16189435738094549 -Sr2Co1Br2O2_123_17187.vasp,Sr2CoBr2O2,-1.6157944985714285,1.4655218464285666 -Ba2C2S2N2Cl2_11_1933.vasp,Ba2C2S2N2Cl2,-4.633854027,-0.06838674991667337 -Ti3B2Te2H2_187_19070.vasp,Ti3B2Te2H2,-4.596343267777778,0.35867898833332923 -Ag2Br6_162_208.vasp,Ag2Br6,0.29320466625,0.24195905875 -Cd2H2_2_3510.vasp,Cd2H2,-0.10874476,0.8977360000000001 -Mn2H2S2N1_164_11094.vasp,Mn2H2S2N,-3.4621394800000003,-1.40180934101191 -Na1Sb2Pd1Se6_149_11930.vasp,NaSb2PdSe6,-1.843859219,0.3240058571666644 -Ho2Se6_51_8150.vasp,Ho2Se6,-2.8219865575,-0.3952394962499999 -Ag4Br4O4F4_1_504.vasp,Ag4Br4O4F4,-0.6370731525,0.5027150200000001 -Li2H8Cl2O4_2_9957.vasp,Li2H8Cl2O4,-3.873424050625,0.0411951445833334 -Zr1Ti1S2I2_6_21474.vasp,ZrTiS2I2,-3.6737921383333334,-0.10781103996528563 -Cr2Sb2O6_162_4479.vasp,Cr2Sb2O6,-4.650523625,0.03330274175000003 -Ni1C2S2N2_12_13293.vasp,NiC2S2N2,-4.741822345714286,0.08097973494046565 -Na8Pb4O8_13_12453.vasp,Na8Pb4O8,-2.9648736815,0.04119913100000039 -Na2H14C8O14_2_12095.vasp,Na2H14C8O14,-5.099099329736842,0.061055467763147186 -Ba3Ni2Cl2O5_123_2120.vasp,Ba3Ni2Cl2O5,-3.213630601666667,-0.13779156083333655 -P6H2O12_4_14135.vasp,P6H2O12,-5.176054631,0.04839637138332842 -Cu4S2O12_14_5444.vasp,Cu4S2O12,-2.880268662777778,0.4622980311111079 -Ni2Te2P1_187_13664.vasp,Ni2Te2P,-1.29708214,0.0817110705416659 -Mn3C2O2_187_11364.vasp,Mn3C2O2,-4.6232983,0.26689481738094845 -In4Cl8_2_8671.vasp,In4Cl8,-1.2597354491666668,0.1542544191666666 -As2W2_12_1312.vasp,As2W2,-4.207406885,0.6993025958333268 -K4Cl2_51_9431.vasp,K4Cl2,-0.3656586683333333,0.1590975549999995 -Tl1P2Au1Se6_149_19315.vasp,TlP2AuSe6,-1.887808847,0.12150625559374828 -Re2I2_2_15051.vasp,Re2I2,-3.128069235,0.5562350247222194 -Ti2Te2Cl2_59_19037.vasp,Ti2Te2Cl2,-3.5138322133333335,0.12323598238094524 -Na2Ag1O2_12_11960.vasp,Na2AgO2,-2.051086964,0.03354847983333342 -Au2I2_67_1489.vasp,Au2I2,0.59323003,0.07950710875 -K4Cr4Cl4O12_14_9437.vasp,K4Cr4Cl4O12,-3.7052589333333334,-0.2320532087326429 -Hf2S2Br2_59_7567.vasp,Hf2S2Br2,-4.246552011666666,-0.005793841250008036 -Cr1Cu1Sb2Te6_143_4156.vasp,CrCuSb2Te6,-1.35648588,0.2566769270833319 -Pr2I2O2_129_14546.vasp,Pr2I2O2,-4.517313288333333,0.05571415500000043 -Te4P4Pd4_13_18607.vasp,Te4P4Pd4,-2.280479515,0.2083239358333332 -Tl8S4O12_14_19650.vasp,Tl8S4O12,-3.1433810537499998,0.20897717895833345 -Y1Sb2S4_123_20668.vasp,YSb2S4,-3.457664094285714,0.25162482038690226 -As1S1Br1_156_1167.vasp,AsSBr,-2.1288691633333334,0.10480305999999961 -Cd1Bi1I1Br1_1_3279.vasp,CdBiIBr,0.1599360725,0.0757937367708329 -Cu2B4H4I2N2_2_5034.vasp,Cu2B4H4I2N2,-3.5764468078571428,0.49303906328570557 -Mn2C1Cl2_164_11037.vasp,Mn2CCl2,-3.001837152,0.1309032219999935 -B1Te1_156_1638.vasp,BTe,-2.454787395,1.4115981325 -Na2Ni1_187_12235.vasp,Na2Ni,0.7602125733333334,1.435715066666666 -Hf2S4I1Br1_1_7579.vasp,Hf2S4IBr,-3.76804987875,0.31840143835937557 -Co2Te4F2_11_4044.vasp,Co2Te4F2,-1.72982294625,0.11905081768749759 -Ga2H14N4_10_6374.vasp,Ga2H14N4,-3.9424015304999998,-3.5602605175000046 -Fe2P2S7_6_5918.vasp,Fe2P2S7,-2.5153781736363636,0.12282697700412659 -Bi1Se2_187_2395.vasp,BiSe2,-1.6142228133333332,0.5273683705555534 -Ge3Bi4_5_6907.vasp,Ge3Bi4,-1.786089487142857,-0.588032507857144 -Cu2Sb4S12_10_5275.vasp,Cu2Sb4S12,-2.1886565711111112,0.2623021672569421 -Ge1O1_156_6681.vasp,GeO,-4.148842245,0.05787582437499994 -Ni2P2O6_162_13559.vasp,Ni2P2O6,-3.8540869239999997,0.7369997995000004 -Te2P2S1_164_18441.vasp,Te2P2S,-2.552316288,0.29846764124999636 -Li2Nb12Cl38_51_10008.vasp,Li2Nb12Cl38,-2.9699432925,0.05081985230769259 -Sn4Br1Cl3O4_1_16938.vasp,Sn4BrCl3O4,-2.7467320025,0.1813300602083332 -Ni1Sn1Se4_1_13425.vasp,NiSnSe4,-1.4591119483333335,0.3558018816666665 -Sr2Cd1In1Cu1O5_99_17173.vasp,Sr2CdInCuO5,-2.853465495,0.44459699322916285 -Mo3O8_12_11718.vasp,Mo3O8,-4.988236889090909,0.22133569984848034 -Mn1Sb1W1Se3_6_10867.vasp,MnSbWSe3,-2.921665056666667,-0.09994432805555786 -Ge2S2I1Cl1_1_6825.vasp,Ge2S2ICl,-2.2187468083333335,0.15651708052083313 -Au2Se1S1Br1Cl1_1_1536.vasp,Au2SeSBrCl,-0.415499675,0.2511468807812495 -Ti1C1F2_1_18753.vasp,TiCF2,-4.6268602775,0.5716184533333215 -Sn2P1_164_16804.vasp,Sn2P,-2.0358901533333333,-0.5925100166666682 -K1Sn1As1_156_8938.vasp,KSnAs,-1.1012502266666666,0.23730494999999996 -C1Cl4_123_2726.vasp,CCl4,-0.8704651999999999,1.0051422600000002 -Nb2Ir1Se2I3_1_12757.vasp,Nb2IrSe2I3,-2.52191235125,0.5497318619696899 -Sb2P2_1_15629.vasp,Sb2P2,-2.9656469875,0.19913454125000007 -Gd2Ge1Br2_164_6613.vasp,Gd2GeBr2,-2.936170566,-0.35212577599999983 -Si2Te2Cl2_59_16455.vasp,Si2Te2Cl2,-2.059114333333333,0.2919837649999979 -Co2H8N4O16_14_3921.vasp,Co2H8N4O16,-4.321994935999999,0.015259361777778535 -Ge2Ru1_123_6819.vasp,Ge2Ru,-3.2807558033333333,0.3149757143749974 -Na1Ga1Te6As2_5_11870.vasp,NaGaTe6As2,-1.589304853,0.2928553743571396 -Nb4Re2O16_2_13134.vasp,Nb4Re2O16,-6.3169662886363644,-0.017517506193186705 -Mo2As4O12_4_11565.vasp,Mo2As4O12,-4.738755165555556,0.048524050888888226 -Ga1Si1Te3_143_6281.vasp,GaSiTe3,-1.6353928020000001,0.48785298721428094 -Ga4Te4Br4_14_6576.vasp,Ga4Te4Br4,-1.4780252333333335,0.05171900666666662 -Ag4S4Cl4_14_548.vasp,Ag4S4Cl4,-0.7703311583333333,0.18850972645833253 -Zr1Mn1Nb2Zn1Se1S5Br4_1_21325.vasp,ZrMnNb2ZnSeS5Br4,-2.9401276286666667,0.31805849093333083 -Sr1Au2S8_89_17027.vasp,SrAu2S8,-1.966584350909091,0.13444047153408667 -Ga1Cu1Ag1S4I1Br2_1_6157.vasp,GaCuAgS4IBr2,-1.1860348520000001,0.253147478944442 -Al4Te4I4_14_1102.vasp,Al4Te4I4,-1.6197346608333334,0.061318525833333304 -Y2Br2O2_129_20699.vasp,Y2Br2O2,-5.459866016666666,0.034753446666667465 -Hg2Te2F2_59_8029.vasp,Hg2Te2F2,-0.0031678566666666665,0.4967818203160912 -Ru2Se2_164_15359.vasp,Ru2Se2,-2.7080951,0.7373417362500001 -Os2Se2Cl2_59_13881.vasp,Os2Se2Cl2,-2.593186101666667,0.34544902624999674 -Hf4C3Cl2_164_7773.vasp,Hf4C3Cl2,-6.567839155555556,0.032596751851845074 -Ga2Fe2Te5_187_6361.vasp,Ga2Fe2Te5,-1.5969977366666666,0.09207250867724748 -Hf1Te1S1_156_7320.vasp,HfTeS,-4.464763323333334,0.13795443999999946 -Ca2C4_67_2972.vasp,Ca2C4,-4.289869416666667,1.2884301816666612 -V4F16_14_20322.vasp,V4F16,-3.2590476635,0.021301785499999948 -V1Ag1O1F4_1_19755.vasp,VAgOF4,-2.8129941214285714,-0.31627314160715053 -Bi8Te8S4_2_2701.vasp,Bi8Te8S4,-1.5976649895,0.3057348124999999 -Au2Cl4O12_4_1472.vasp,Au2Cl4O12,-1.9369192094444445,0.3378677617824064 -K1V1P2H2O6_156_8953.vasp,KVP2H2O6,-4.7559257116666664,0.1670778996343856 -Pb6F16_1_14327.vasp,Pb6F16,-2.317057147272727,0.0873048986363616 -Os2S2Br2_59_13865.vasp,Os2S2Br2,-2.828994328333333,0.3148104095833304 -Te1Rh2S1I2_6_18332.vasp,TeRh2SI2,-1.56438763,0.18512366194444219 -In1Ni1Te2Br2_1_8286.vasp,InNiTe2Br2,-0.713268015,0.20415825958333192 -Na2Hf1_187_12146.vasp,Na2Hf,-1.58587403,0.6448796666666647 -Cu2Se1Cl2O1_1_5288.vasp,Cu2SeCl2O,-1.1777136316666665,0.14580538659722164 -Li2Ca2_11_9854.vasp,Li2Ca2,-0.132727455,0.724601968125 -W1I2_187_20438.vasp,WI2,-0.8966217766666666,1.1740687763888888 -Cu1Ag1Se2_156_4828.vasp,CuAgSe2,-0.4999917375,0.09882235916666676 -Na4Zn2Si2_12_12433.vasp,Na4Zn2Si2,-0.5565135275,0.0530586637499999 -Sn2Te6P2_147_16903.vasp,Sn2Te6P2,-1.8137109519999999,-0.36150626033333466 -Pt2S2_187_14663.vasp,Pt2S2,-1.9726985525,0.6423826074999999 -Sm2H4I6O20_2_16573.vasp,Sm2H4I6O20,-3.4698144734375,0.13018181583333366 -Ga2Te2Cl2_59_6499.vasp,Ga2Te2Cl2,-1.5113933666666668,-0.6469961608333334 -Sr2Te2Au1F2_38_17326.vasp,Sr2Te2AuF2,-1.655764464285714,0.606060409285711 -K1Te2_115_8944.vasp,KTe2,-0.6386370233333333,0.4385870424999979 -Hf1Mn1W1Se1S3I2Br1_1_7227.vasp,HfMnWSeS3I2Br,-2.7370061110000004,0.4234904616249966 -W1Se1O1_156_20453.vasp,WSeO,-4.82070099,0.008879079319721594 -K2Br1_164_9006.vasp,K2Br,-0.16566042333333333,0.10314779666666646 -Ga2Cu1S1Br3Cl1_1_6340.vasp,Ga2CuSBr3Cl,-1.26306116875,0.13546903510416602 -Fe2Cl2_129_5836.vasp,Fe2Cl2,0.033640105,1.8313153624999998 -S2_164_15388.vasp,S2,-1.874873485,0.7430113143750001 -Re6Se8Br2_2_15129.vasp,Re6Se8Br2,-4.217495908125,0.06437156374999997 -Rb2Hg4Se2S6F6_31_14882.vasp,Rb2Hg4Se2S6F6,-1.0095803235,0.35056189240624774 -Ca2H2I2_129_3032.vasp,Ca2H2I2,-1.9876485833333335,0.04665362666666639 -Ti1O2_164_18821.vasp,TiO2,-7.067317673333334,0.19653685166666612 -Au2S1I4_1_1507.vasp,Au2SI4,0.24891342142857145,0.22129335949404594 -P2Au2S2_7_13955.vasp,P2Au2S2,-1.8743416466666665,0.26444475916666677 -Ga4Br4_57_6546.vasp,Ga4Br4,-1.31951663375,0.04489981625000006 -Al2Te4_12_1019.vasp,Al2Te4,-1.8798789983333333,0.19271509135416254 -Zn4W4O16_53_21234.vasp,Zn4W4O16,-4.474202869583333,0.42698650874999977 -Rb1_191_14765.vasp,Rb,1.47795429,0.2685589800000001 -Bi1Te2_115_2408.vasp,BiTe2,-0.9550249966666667,0.6130675744444428 -V1Ga2S4_164_19835.vasp,VGa2S4,-3.146853734285714,0.13399299535714015 -Yb1Al2Ge2_164_20851.vasp,YbAl2Ge2,-2.7848043799999997,-0.9096371199999997 -Ag4O4F8_14_535.vasp,Ag4O4F8,-0.95476059375,0.5111077315625 -Co2I6_189_3929.vasp,Co2I6,-0.02082527375,0.380933075 -Nb2Se4Cl4_12_12883.vasp,Nb2Se4Cl4,-2.9983152669999997,0.0467281585238033 -Lu1As2_21_10290.vasp,LuAs2,-2.85810247,0.5147617066666639 -Ba2Cd1In1Ag1O5_99_1938.vasp,Ba2CdInAgO5,-2.597245161,0.5870425144583286 -Ge6N8_187_6964.vasp,Ge6N8,-4.608336242857143,0.6897454135714289 -Rb2Hg4Te2S6Br6_31_14888.vasp,Rb2Hg4Te2S6Br6,-0.6559151055,0.15538412581249705 -Mo1Pb1O4_3_11536.vasp,MoPbO4,-4.45285596,0.36160763500000037 -Ir2S2Cl2_11_8814.vasp,Ir2S2Cl2,-2.6141029066666666,0.09886014833333334 -In1Ga1S2_8_8258.vasp,InGaS2,-2.4761430075,0.09155532249999987 -Ru2Se2_129_15357.vasp,Ru2Se2,-2.95921544,0.48622139625000016 -Ge1Te1O4_35_6712.vasp,GeTeO4,-4.010857301666666,0.30900440812499985 -Al2Cd1Se4_164_786.vasp,Al2CdSe4,-2.173484567142857,0.15646641000000017 -Ca2I4_51_3057.vasp,Ca2I4,-1.084471575,0.1881396896666665 -Ta4Cr2O16_2_18032.vasp,Ta4Cr2O16,-6.235714948636363,0.03145809721590531 -Ca2Ag1S2Cl2_123_2908.vasp,Ca2AgS2Cl2,-1.8213058657142855,0.2519047806696387 -Ru2Se2F2_59_15355.vasp,Ru2Se2F2,-2.5554636816666667,0.41778179583332986 -Ga2Ni2Te5_156_6411.vasp,Ga2Ni2Te5,-1.1233171611111112,0.041824137333332734 -Cr1B4H4S6Cl1_2_4118.vasp,CrB4H4S6Cl,-3.631840253125,0.7062749494270834 -Fe1Ni1I1Br1_1_5724.vasp,FeNiIBr,0.078655525,0.18697088828125003 -Mo2S2_12_11671.vasp,Mo2S2,-3.39111021,0.77578793125 -Li4V4O12_13_10246.vasp,Li4V4O12,-5.188915848500001,0.15593938149999964 -Mg2Te6As2_162_10526.vasp,Mg2Te6As2,-1.6244420430000002,0.23689419516666493 -Ir1I2_164_8738.vasp,IrI2,-0.7376288066666666,0.5902554099999989 -Al2Se2Cl2_31_961.vasp,Al2Se2Cl2,-2.653481166666667,0.038493388333332934 -Ba2Fe2Si2_129_1983.vasp,Ba2Fe2Si2,-1.7439761766666668,0.12068312291666411 -Ta2Sb2Se6_12_17866.vasp,Ta2Sb2Se6,-3.47096291,0.28519565649999823 -Sb2Cl2_129_15566.vasp,Sb2Cl2,-1.25550099,0.5185159174999984 -Cr2Te2_129_4525.vasp,Cr2Te2,-2.2528226475,0.2880549949999962 -Ag2Te2_187_461.vasp,Ag2Te2,-0.0489112675,0.30872117541666666 -Ni1As1_187_13256.vasp,NiAs,-0.403658895,4.014044329017853 -W3N2Cl2_187_20561.vasp,W3N2Cl2,-4.8442281199999995,-0.03401599261905053 -Cu2S2_187_5252.vasp,Cu2S2,-1.0652189975,0.2971847141666668 -Zr4B3S2_164_21807.vasp,Zr4B3S2,-5.212263854444444,0.2628697099999955 -Zn2As4O6F4_31_21032.vasp,Zn2As4O6F4,-3.218656306875,0.18338424218750005 -K2Cd4Se2S6Cl6_31_9063.vasp,K2Cd4Se2S6Cl6,-1.0187803555000001,0.31084857120833076 -Mg1V4O10_25_10412.vasp,MgV4O10,-5.268608101333333,0.2233629468333289 -Zr2Br5Cl1_1_21527.vasp,Zr2Br5Cl,-2.3418302725,0.17461483374999975 -Er2S2Cl2_59_5568.vasp,Er2S2Cl2,-3.7836489849999997,0.013988268333333664 -Ca4Te4S12_14_3246.vasp,Ca4Te4S12,-2.468425156,0.07135055108333094 -Si2Sb2O6_162_16439.vasp,Si2Sb2O6,-5.039509842999999,0.3778391989999984 -Y2C1I2_164_20710.vasp,Y2CI2,-4.149003823999999,0.02912391506665879 -Se4F4_2_16299.vasp,Se4F4,-1.75534109125,0.3463666015625 -Hg1Pb1Se1S1_1_7894.vasp,HgPbSeS,-0.8085749175,-0.8680105775 -Mn1Sn1Au2S1Br1Cl3O3_1_10887.vasp,MnSnAu2SBrCl3O3,-1.7781689908333334,0.6366250018229108 -Pd3S3I2Br4_1_14507.vasp,Pd3S3I2Br4,-0.7378528133333333,0.27351287625 -Rh1O2_187_15161.vasp,RhO2,-2.9240363533333333,1.2066035049999995 -Na2H14C8O12_2_12094.vasp,Na2H14C8O12,-5.073657018611112,0.08245189958332633 -Mn6Br18_164_11464.vasp,Mn6Br18,-0.9185746037500001,0.18977395249999984 -Sn3Te1O6_1_16932.vasp,Sn3TeO6,-3.65040661,0.43186933116666226 -Y1I2_123_20642.vasp,YI2,-2.251998423333333,0.15076438611110904 -Te4Au4I4_14_18575.vasp,Te4Au4I4,-0.06827587083333334,0.10014892583333332 -Ga2I6_1_6393.vasp,Ga2I6,-0.52482537,0.08834309062500001 -Ru2S2_164_15344.vasp,Ru2S2,-3.2579374325,0.5026067050000003 -Li4Cr4O14_2_10178.vasp,Li4Cr4O14,-4.760766396363636,-0.21184368384470142 -Th1F2_187_18715.vasp,ThF2,-4.393235736666667,0.6087427191666615 -Sn2Sb2Cl2O6_7_16854.vasp,Sn2Sb2Cl2O6,-3.37998258,0.36628037861111085 -Tb2Br6_162_18185.vasp,Tb2Br6,-2.30237444375,0.05455525374999981 -Hf1Rh1S2Br2_6_7272.vasp,HfRhS2Br2,-3.1602259349999997,0.2732907066304295 -Ir2Se2_129_8841.vasp,Ir2Se2,-2.581292125,0.4863276668750003 -Ta4Pd6S10_59_18090.vasp,Ta4Pd6S10,-3.7001533295,0.1493873117999982 -Mn1Ge1S2Br2_6_10740.vasp,MnGeS2Br2,-2.1947444783333334,0.025348232604166743 -Sr1Si1Ag1Ge1I2_1_17082.vasp,SrSiAgGeI2,-1.366175045,0.01748728223342033 -H4Au4S4Cl4_2_7063.vasp,H4Au4S4Cl4,-1.464934909375,0.15099701562500012 -Te2Au4_4_18378.vasp,Te2Au4,0.29800035166666666,1.0828690133333327 -Tc4I10_2_18249.vasp,Tc4I10,-1.6422259378571429,0.49741220047618484 -P2H6Pb2C2O6_7_13982.vasp,P2H6Pb2C2O6,-4.791088539444444,0.022324980185185694 -Ba2Ag1Te2I2_38_1896.vasp,Ba2AgTe2I2,-1.2262965242857145,0.2373346701413654 -Sc1S2_187_15990.vasp,ScS2,-3.6824598833333333,0.5758838003124973 -Al1Ga1Hg1Se4_156_663.vasp,AlGaHgSe4,-1.7948083971428572,0.18992636857142686 -In1S2F2_12_8328.vasp,InS2F2,-1.7926028760000001,0.8162845328124978 -Re6Te8Br2_2_15134.vasp,Re6Te8Br2,-3.64999597375,0.011453705892852994 -Te2Mo1_115_18401.vasp,Te2Mo,-1.50844355,0.6024506999999999 -Ir1Pd1Se1I1O1_1_8748.vasp,IrPdSeIO,-2.016295812,0.40551854405146726 -Bi1Cl3_187_2328.vasp,BiCl3,-0.94727976,0.4680137 -Re1Au2F6_1_14992.vasp,ReAu2F6,-1.7975620088888888,0.9149485733333305 -Ge2Te2_164_6886.vasp,Ge2Te2,-2.346088605,-0.8828472799999998 -Sb2As4H2O12_4_15539.vasp,Sb2As4H2O12,-4.238107782,0.1903774690416623 -Mn2Ga2Se5_164_11081.vasp,Mn2Ga2Se5,-2.3519330688888886,-0.005180535268201447 -Fe4O6_13_6085.vasp,Fe4O6,-3.3134827639999997,0.5054137902500004 -Te1P1Br1_156_18315.vasp,TePBr,-1.59242577,0.40635103666666483 -Te1W1S1_156_18336.vasp,TeWS,-3.6638907133333336,0.09485758749999973 -Rh2Br2_129_15174.vasp,Rh2Br2,-0.58206696,1.1538540133333317 -Cd1In2F8_5_3374.vasp,CdIn2F8,-2.1091708845454544,0.10697486999999883 -Co2F6_12_3899.vasp,Co2F6,-2.35261952625,0.04236668875000005 -Na3As1_187_12349.vasp,Na3As,-1.16450525,0.26615976416666665 -Cd2I2O3_1_3519.vasp,Cd2I2O3,-0.9778645671428572,0.37203027555952217 -Rb1F1_187_14729.vasp,RbF,-1.778087055,-0.358882535 -Na1Au1S2O8_2_11824.vasp,NaAuS2O8,-3.6364796824999996,0.17368601416666696 -Ca4Sn4O8_2_3242.vasp,Ca4Sn4O8,-3.8928399875,-0.6559690550000006 -Bi1Pt1_187_2360.vasp,BiPt,-0.70735423,0.8583654525 -Ge1Bi1Se1S1_1_6647.vasp,GeBiSeS,-2.3231243475,-0.0835978746874999 -Bi2Mo1_164_2471.vasp,Bi2Mo,-1.5926628333333335,0.5083280666666647 -Sr1Pb1S2O8_1_17074.vasp,SrPbS2O8,-4.472531608333333,0.13589608249999596 -Cd2F2_129_3503.vasp,Cd2F2,0.163440175,0.3219646312500002 -Fe2Sb2Pd2_129_5951.vasp,Fe2Sb2Pd2,-1.0164891183333333,1.0465125972222205 -Br8O16_14_2715.vasp,Br8O16,-1.8952532387499998,0.34070092874999847 -Ni2S4_4_13596.vasp,Ni2S4,-1.7953347616666668,0.04827582874999781 -Tl1Cu1As2Se6_149_19251.vasp,TlCuAs2Se6,-1.708860685,0.28636268168055135 -Ca4Al2Pb2F18_2_3204.vasp,Ca4Al2Pb2F18,-3.6289755565384616,0.03288726807691578 -Hg3Se1O6_5_8067.vasp,Hg3SeO6,-1.7584764979999998,0.15074285729166603 -Ca2P2O8_13_3089.vasp,Ca2P2O8,-5.141347634166666,0.28702425406249565 -Cs2Hg4Te2I6O6_31_4744.vasp,Cs2Hg4Te2I6O6,-1.0566542405,0.1693885453749968 -As1Pd1O3_1_1162.vasp,AsPdO3,-3.182912698,0.5377888362499954 -K2H6Pd1O6_147_9153.vasp,K2H6PdO6,-3.5939257586666664,0.05138553866666706 -Na2Ti2C2I2_59_12324.vasp,Na2Ti2C2I2,-4.0141405125,-0.01857756250000009 -Ta4C3Cl2_164_18011.vasp,Ta4C3Cl2,-6.874904247777778,0.007948609999996359 -Hf1Bi2S1I2_38_7121.vasp,HfBi2SI2,-2.09896004,0.1724075529166651 -Tl4N4_14_19611.vasp,Tl4N4,-1.92447983375,0.7362365175000002 -As6Pb6_2_1388.vasp,As6Pb6,-1.7306429558333332,0.3876422616666668 -W2I2O2_59_20499.vasp,W2I2O2,-3.432548465,0.7366466958474991 -P4O8_156_14095.vasp,P4O8,-4.733527621666666,0.6600325506666639 -Tc4F10_13_18247.vasp,Tc4F10,-3.7269416385714287,0.2120497048214246 -Co2As2S5_8_3845.vasp,Co2As2S5,-2.7141898066666665,0.5417744477339151 -Os3S4_164_13892.vasp,Os3S4,-3.9050442385714286,0.6202633249999945 -Al2S2Cl2_59_936.vasp,Al2S2Cl2,-3.0312099666666668,0.018960468333333313 -Ba2P4S12_2_2046.vasp,Ba2P4S12,-3.2458106166666667,0.1122300235763827 -Ca2Sn4H12_2_3130.vasp,Ca2Sn4H12,-2.4342601966666666,0.035811423888886806 -Na2Cu2Se2_129_12069.vasp,Na2Cu2Se2,-1.1644119066666667,0.12062459666666658 -Ge2Se4_12_6876.vasp,Ge2Se4,-2.2521602583333333,0.35197261888888853 -As2Br10_51_1191.vasp,As2Br10,-0.42250965916666666,0.354934459166666 -Na1Be2F6_164_11827.vasp,NaBe2F6,-3.258777297777778,0.18828086437499714 -K2Zr1H6S6_147_9397.vasp,K2ZrH6S6,-3.1462616393333334,0.042292858833333336 -Eu1Sn3_187_5596.vasp,EuSn3,-1.1327035525,-0.7398453 -V2P2O10_85_20135.vasp,V2P2O10,-5.594324065714285,0.09336294500000086 -Pb6S2O12_51_14335.vasp,Pb6S2O12,-3.8112241654999996,0.11307654043750062 -Na8Fe4O8_13_12449.vasp,Na8Fe4O8,-2.866162247,0.18985364099999757 -Mg2_65_10541.vasp,Mg2,1.026346595,0.6120981866666666 -Sb4O6_7_15787.vasp,Sb4O6,-4.216192805,0.04129766249999989 -V1Se2_10_19929.vasp,VSe2,-2.6219688766666667,0.5246348416666664 -Li2Sn1H6O6_147_10068.vasp,Li2SnH6O6,-4.270107032666667,0.07962160813333363 -Ca3Co2O6_1_3162.vasp,Ca3Co2O6,-3.813795806363636,0.2717754640909029 -Na2Br2O6_11_11994.vasp,Na2Br2O6,-2.520826816,0.12728255399999977 -Ag1Bi1As2Se6_143_22.vasp,AgBiAs2Se6,-1.866954755,0.7863794729166614 -Ru1I2O1_47_15271.vasp,RuI2O,-1.97307841,0.143770782109375 -Ta1B2Ir3Pd2C1Se3S1I1Cl2_1_17508.vasp,TaB2Ir3Pd2CSe3SICl2,-3.17709738375,0.24373799275972197 -Sn2As2C2S6F6_7_16715.vasp,Sn2As2C2S6F6,-2.9275540538888887,0.5713811251003026 -Cu1S1_156_4955.vasp,CuS,-0.84972679,0.5126769216666668 -Hg12Sb4As4S12_14_7832.vasp,Hg12Sb4As4S12,-0.803707976875,0.09626965227370698 -Co2O2_187_3946.vasp,Co2O2,-3.25069753,-0.28352977999999984 -P4S6_11_14115.vasp,P4S6,-3.185874322,0.19937586940624685 -Zn2W2O5_6_21192.vasp,Zn2W2O5,-3.972327762222222,0.328283291088431 -H4Au2C4S8_2_7055.vasp,H4Au2C4S8,-3.382656491111111,0.3191779964583238 -Ag2Ge2S6_51_264.vasp,Ag2Ge2S6,-2.15826302,0.15844080624999757 -Bi2C2O4_59_2439.vasp,Bi2C2O4,-3.5571289,1.5373214231249999 -Sb2Mo1_187_15601.vasp,Sb2Mo,-2.3680408933333332,0.394552259523806 -Al4Te4Cl4_14_1101.vasp,Al4Te4Cl4,-2.1728441591666665,0.05508846750000007 -Ga2Cl2_129_6319.vasp,Ga2Cl2,-1.4179160375,0.14833656125000005 -Nb3Cl8_156_12968.vasp,Nb3Cl8,-3.1038084354545457,0.07070967863636302 -Te3As4Au2Cl2_6_18544.vasp,Te3As4Au2Cl2,-1.3146432245454547,0.1722749376893927 -Hg2Te2_129_8034.vasp,Hg2Te2,0.7284278625,0.25246084083333337 -Ca1Zn1S1I1Cl1O1_1_2899.vasp,CaZnSIClO,-1.9706350400000001,0.21096558113541664 -As2Pd2S5_8_1268.vasp,As2Pd2S5,-2.4073957622222224,0.43917930961110796 -Tl2O4_12_19475.vasp,Tl2O4,-2.1051837066666668,0.7128145747916634 -Co2Bi4S6Br4_2_3872.vasp,Co2Bi4S6Br4,-1.894544606875,0.1695862290104138 -Tl2Zn1Te4_156_19567.vasp,Tl2ZnTe4,-0.46512796714285715,0.2753739685714283 -Hf2Sb2O6_162_7585.vasp,Hf2Sb2O6,-5.956567229,0.28733040399999854 -In1Au1F4_3_8194.vasp,InAuF4,-1.651225635,0.4176373818518495 -Ti1Sb1P1_156_18843.vasp,TiSbP,-4.222767733333334,0.7421253041666614 -Si1N2F6_164_16348.vasp,SiN2F6,-2.4734114711111115,1.1146203520370332 -Ge1I4_123_6675.vasp,GeI4,-0.145348842,0.45157707175000006 -Ca3Ag2Cl2O4_123_3143.vasp,Ca3Ag2Cl2O4,-2.72857936,-0.028392224952158818 -Cd1Pb2Br2O2_12_3389.vasp,CdPb2Br2O2,-1.933643257142857,0.0801790271428573 -Mo2Br2Cl2O2_35_11569.vasp,Mo2Br2Cl2O2,-2.84654993125,0.03078569249999985 -Ta2Ge2P2_129_17741.vasp,Ta2Ge2P2,-5.058578266666667,0.13866345499999433 -Nb2I2O4_11_12746.vasp,Nb2I2O4,-5.216415565,-0.07260065234375013 -Li1Pd1S1F1_1_9778.vasp,LiPdSF,-2.534851415,0.10093508750000013 -Co1H4C2I2N6_6_3748.vasp,CoH4C2I2N6,-4.263794942,0.24882317483332195 -Mg2Cr4O10_59_10446.vasp,Mg2Cr4O10,-4.755160929375,0.01774922828125025 -Hg1I1O1F1_156_7878.vasp,HgIOF,-0.1374795525,0.6876812671875 -K2Ni2Sb2_12_9270.vasp,K2Ni2Sb2,-0.32092255833333333,0.1277862407142853 -V2C1O2_164_20019.vasp,V2CO2,-5.765570874,0.09165107034342856 -V2B1F2_164_19987.vasp,V2BF2,-4.070502094,-0.04680699866667104 -Tl4Pd2C8N8_53_19617.vasp,Tl4Pd2C8N8,-5.21174974,-0.02215651484849359 -Y4Te6_1_20840.vasp,Y4Te6,-3.4783715280000003,0.41171464899999943 -Ga2Ni2Se5_164_6409.vasp,Ga2Ni2Se5,-1.6898678366666666,-0.030463358333335244 -Bi2Sb2O6_7_2525.vasp,Bi2Sb2O6,-3.976135061,0.04982171136363012 -Al1In1Hg1Te4_156_679.vasp,AlInHgTe4,-1.0315081157142856,0.17264649285714295 -Bi1Te2H1S6_1_2404.vasp,BiTe2HS6,-2.282257131,-0.07261009279166936 -Ni1B4H4C2F2_47_13270.vasp,NiB4H4C2F2,-3.9737550076923074,0.7507202330875905 -Li2As2O6_162_9825.vasp,Li2As2O6,-4.473739113,0.0714136690000009 -Ag2Te4_6_485.vasp,Ag2Te4,-0.52713412,0.23521609416666667 -Rb2C2Se2O6F6_4_14795.vasp,Rb2C2Se2O6F6,-3.2849892944444448,0.45717971157407045 -Na2Mg1H4O10_2_12187.vasp,Na2MgH4O10,-3.5168963352941174,0.127890678284304 -Ce2Se6_129_3681.vasp,Ce2Se6,-3.2559215525,0.17207136520833322 -Rb2H2N2O6_4_14846.vasp,Rb2H2N2O6,-3.8209560375000002,0.3413875829444364 -K3Mo2Cl9_174_9403.vasp,K3Mo2Cl9,-1.7168841321428572,0.10378996595237933 -Ge4O10_30_6932.vasp,Ge4O10,-4.263735716428571,0.4026867266071397 -Cr1I1Cl1_156_4197.vasp,CrICl,-1.1704822933333332,0.4468501499999986 -Nb2I2O1_8_12744.vasp,Nb2I2O,-3.765418536,0.2597606623333273 -Te1Au2_191_18290.vasp,TeAu2,0.50064103,1.285509691666666 -Tl3Co1_187_19574.vasp,Tl3Co,0.3236878125,0.5831741450000001 -Hf3C2S2_187_7696.vasp,Hf3C2S2,-6.681944904285714,0.15197620714284477 -Co2P2Se5_8_3965.vasp,Co2P2Se5,-2.4719987477777776,0.4030243111111088 -Cu2Sb2S6_162_5267.vasp,Cu2Sb2S6,-1.79395515,0.43040857924999787 -Ta6Se18_11_18151.vasp,Ta6Se18,-3.9763732104166665,0.07343550520833331 -Hf4Se4Cl4_31_7815.vasp,Hf4Se4Cl4,-3.9652930825,0.057899198124996776 -Rh2S2Br2_11_15214.vasp,Rh2S2Br2,-2.114601131666667,0.060641949999999945 -Li1Sb2Pd1Se6_5_9784.vasp,LiSb2PdSe6,-1.9760757219999998,0.2765353856666648 -K2H6C4O6_2_9142.vasp,K2H6C4O6,-4.873905146666667,0.13176073854165993 -Ba5Y1_1_2204.vasp,Ba5Y,-0.09581952666666667,0.9326062124999971 -Sm2N2O10_4_16579.vasp,Sm2N2O10,-5.009450849285714,0.04837933982142095 -Zr1Mo2S8_164_21332.vasp,ZrMo2S8,-3.2545850081818184,0.6154606303977206 -Nb2Cl2_164_12679.vasp,Nb2Cl2,-4.010819685,0.20155831803570856 -Na2V4O10_11_12334.vasp,Na2V4O10,-5.144109976875,0.12767868874999477 -Mn3I2O2_1_11392.vasp,Mn3I2O2,-2.4881011714285712,0.22992752948275763 -Li2Ag1_187_9819.vasp,Li2Ag,-0.6495167666666667,0.6348151191666653 -In1Ni1S1Br2Cl1_1_8282.vasp,InNiSBr2Cl,-1.1057060066666666,0.12613998902777662 -Mo2C2F2_59_11589.vasp,Mo2C2F2,-4.35848349,0.3780441797222174 -Tl1H2O2_164_19281.vasp,TlH2O2,-3.360849118,0.18604768508333108 -Fe2Te4O12_2_6014.vasp,Fe2Te4O12,-3.6001707488888885,0.17337227729166682 -Ir2S2_187_8822.vasp,Ir2S2,-3.1354349725,0.6970915858333289 -Ag2F2_129_253.vasp,Ag2F2,-0.3050961025,0.44095105249999994 -Mn1Sb2F12_2_10869.vasp,MnSb2F12,-2.5637229346666666,0.022681738666666895 -Bi2Br2_2_2434.vasp,Bi2Br2,-0.8612088,-0.04469702416666746 -Ta2Cl4O4_12_17694.vasp,Ta2Cl4O4,-4.196596022,0.5914722284999949 -Zn2W2F10_13_21191.vasp,Zn2W2F10,-2.555243741428572,0.3432121430357101 -Ca4Fe2Cl2O6_129_3214.vasp,Ca4Fe2Cl2O6,-3.825565152142857,-0.06492035357143222 -Cr3H2N2O2_187_4556.vasp,Cr3H2N2O2,-4.807750906666667,0.018974924629625245 -Tl2Cu2H2S2O10_11_19402.vasp,Tl2Cu2H2S2O10,-3.5276545033333333,0.131044532249993 -Cd1H1Cl1O1_156_3327.vasp,CdHClO,-2.0856989775,0.1282795775000003 -Zr1Al5Ni2_123_21242.vasp,ZrAl5Ni2,-1.83507200875,0.6198940949999998 -Sc1Nb2S1Br1N2Cl1_25_15965.vasp,ScNb2SBrN2Cl,-5.18963479625,0.332476690208325 -Al1Ge1Te3_143_668.vasp,AlGeTe3,-1.66219347,0.166659513812498 -Ni4F8_14_13745.vasp,Ni4F8,-1.5123435374999998,-0.24079774916666663 -Mn1Nb1Cu1S2Br2_1_10804.vasp,MnNbCuS2Br2,-2.403512117142857,0.41037138871651385 -K4Ru2N2Cl10O2_31_9500.vasp,K4Ru2N2Cl10O2,-2.3703452625,0.05590906800000006 -Y1Sb2_21_20669.vasp,YSb2,-3.01821848,0.2628557741666637 -Te6As4_11_18649.vasp,Te6As4,-1.983491219,0.129984192 -Ga1Te4_8_6295.vasp,GaTe4,-1.2221693139999998,0.5409205680000004 -In2I6_162_8481.vasp,In2I6,-0.34702359125,0.04649280250000004 -Nb2Si2P2_129_12891.vasp,Nb2Si2P2,-5.233323478333333,0.3595734783333331 -Os1O2_115_13808.vasp,OsO2,-4.294550563333334,1.2082274433333327 -Ta3N2O2_187_17969.vasp,Ta3N2O2,-7.729164398571428,0.3841197123809379 -Sr3Mn2S5Cl2_123_17387.vasp,Sr3Mn2S5Cl2,-2.7294065166666663,0.1327556941666641 -Ta6Sn2Se12_26_18157.vasp,Ta6Sn2Se12,-4.1571040255,0.17412256649999613 -Mg2Ni3O8_10_10492.vasp,Mg2Ni3O8,-3.1079268192307694,-0.28834089009616015 -Os1Ru1Cl6_5_13813.vasp,OsRuCl6,-1.82209321375,0.04374367203124996 -Co1H4C4N2F2_47_3756.vasp,CoH4C4N2F2,-5.112781053846154,0.19978446336536787 -Sr2S8I4_125_17307.vasp,Sr2S8I4,-1.65491603,0.39217958059523617 -V2As2S6_2_19981.vasp,V2As2S6,-3.3264772049999998,0.13045808237499745 -Co1Ni3Se1I3_1_3799.vasp,CoNi3SeI3,0.05536264,0.1485269264204541 -Ga1Br2_115_6143.vasp,GaBr2,-0.98223743,0.32448269916666683 -Te4Au2Cl2_1_18566.vasp,Te4Au2Cl2,-0.49695617875,0.21765079375000007 -Co4As4S4_29_4076.vasp,Co4As4S4,-2.6471899675,0.6287506241666665 -Mg2Bi4_12_10432.vasp,Mg2Bi4,-0.8444838183333333,-0.15358201277777836 -P6Pd3_157_14142.vasp,P6Pd3,-2.707502626666667,0.7810597383333331 -V2Te2I2_59_20208.vasp,V2Te2I2,-1.60444021,0.2785143599999984 -Na4B1O4_38_12365.vasp,Na4BO4,-3.799401985555556,0.3732465115740703 -Ti1Cu2S4_111_18774.vasp,TiCu2S4,-2.6675509642857143,0.24300670401785152 -Rb2C4O6F6_2_14798.vasp,Rb2C4O6F6,-4.399620237222222,-0.06624966277778033 -Hf2B1Se2_164_7440.vasp,Hf2BSe2,-5.265795558,-0.09216036299999897 -Nb1F2_187_12506.vasp,NbF2,-4.08361634,0.5665061166666618 -Ta1Br5_10_17522.vasp,TaBr5,-1.7765615,0.3779043700000002 -Te2Pt2_164_18490.vasp,Te2Pt2,-1.71834492,0.17920864999999986 -Si6Bi6_2_16527.vasp,Si6Bi6,-2.4774470933333332,-0.7489385708333332 -Ta4Fe8Te8_59_18044.vasp,Ta4Fe8Te8,-2.4982856129999997,-0.035192287888890394 -Cr2O2_6_4438.vasp,Cr2O2,-3.803523075,1.321775924999995 -As18F4_11_1130.vasp,As18F4,-2.9988640463636362,0.12240595348484584 -Te2Mo2Br2_59_18404.vasp,Te2Mo2Br2,-1.693088615,0.2938494820833333 -Li1Fe2O1F5_8_9701.vasp,LiFe2OF5,-2.8422079355555554,0.13014391986110815 -Fe1I2_187_5717.vasp,FeI2,0.00321103,0.004905854166666667 -Ca2Ag1Te2F2_38_2918.vasp,Ca2AgTe2F2,-1.6502771585714286,0.5664523308333296 -Sc4H2N3O2_164_16242.vasp,Sc4H2N3O2,-5.910236672727273,-0.5035083481818283 -Li2U1O4_123_10103.vasp,Li2UO4,-5.487869147142858,0.888170975714285 -Fe2I6_189_5867.vasp,Fe2I6,0.15045374375,0.401068793125 -Sc1Te2_115_16015.vasp,ScTe2,-2.165607593333333,0.6627542819444427 -Sr3Co2S5Cl2_123_17363.vasp,Sr3Co2S5Cl2,-2.6280541008333334,0.17559566197916399 -Si2Sb2Se6_12_16441.vasp,Si2Sb2Se6,-2.490401513,0.32396463862499814 -Cr2Te2F2_59_4520.vasp,Cr2Te2F2,-2.311207955,0.1587035849999947 -Nb3I2N2_6_12979.vasp,Nb3I2N2,-5.183645494285714,0.16098597904760947 -Pd2Se2_129_14492.vasp,Pd2Se2,-1.26071987,0.46613584249999995 -Mg1Te2F2_8_10408.vasp,MgTe2F2,-1.41800385,1.0830858556666665 -Bi1Te2_164_2410.vasp,BiTe2,-1.2223686966666667,0.34572387444444286 -Mn2Bi1Sb1Se1I1Br1_1_10998.vasp,Mn2BiSbSeIBr,-1.40341259,0.12127226410714054 -Cu1F1_156_4873.vasp,CuF,-0.55082554,0.8190767800000001 -Os1O1F2_47_13807.vasp,OsOF2,-3.5343870675,0.1223799537499895 -Tl4Se4Cl4_14_19626.vasp,Tl4Se4Cl4,-1.0385016925,0.34915969861110996 -V2Te4Pd1_164_20218.vasp,V2Te4Pd,-2.064181724285714,0.06304873984126758 -Y1Mg2_187_20646.vasp,YMg2,-1.03230472,0.33070923333333213 -Yb2Se2I2_59_20887.vasp,Yb2Se2I2,-2.856548848333333,-0.5864664894444467 -Fe2As2S7_6_5785.vasp,Fe2As2S7,-2.4273599790909093,0.22847912386363345 -Mn1Au1Se1S1I2_25_10643.vasp,MnAuSeSI2,-0.9203235383333334,0.25976731899305244 -Zr1Ta1Pd1Pt1S3Br4N1_1_21450.vasp,ZrTaPdPtS3Br4N,-3.1417171883333332,0.20418815333332388 -Pb2F8_7_14246.vasp,Pb2F8,-1.936906511,-0.005121179000000087 -Ni2P1Se2_187_13556.vasp,Ni2PSe2,-1.631461706,0.16990776608333036 -Re2Se2_129_15081.vasp,Re2Se2,-4.496875155,0.5494500587500006 -Sr4Cu4Sn2O14_26_17429.vasp,Sr4Cu4Sn2O14,-3.372777155833333,0.2961605716666631 -Nb1P2_187_12555.vasp,NbP2,-4.747876716666666,0.8484579000000005 -Ni3Se2S2Br1_8_13722.vasp,Ni3Se2S2Br,-1.00211451,0.2556703359375 -Cr1Te2_115_4276.vasp,CrTe2,-1.56019932,0.38284681888888916 -Nb2S1I1Cl1_1_12833.vasp,Nb2SICl,-3.565683978,0.23443503727777038 -Ba1B2Se6_12_1806.vasp,BaB2Se6,-3.0905884766666665,0.10427049777777819 -H2W2N1_164_7034.vasp,H2W2N,-4.962131996,-1.9671025092222263 -Ga2N6_164_6397.vasp,Ga2N6,-4.87522637125,0.392159205 -Pt2I4_2_14634.vasp,Pt2I4,-0.22032894,0.295026645 -Cu4S1O10_1_5442.vasp,Cu4SO10,-2.67563252,0.43693960199999693 -Si6Cl16_1_16529.vasp,Si6Cl16,-2.0512422731818183,0.2201936004545424 -Ca2Ge4H12_2_3024.vasp,Ca2Ge4H12,-2.9020429055555557,0.63033962833333 -Sr3Mn2I2O5_123_17385.vasp,Sr3Mn2I2O5,-3.6426480491666666,0.011929634722222193 -In3Os2_123_8650.vasp,In3Os2,-2.132434184,1.741300852 -Pt2F4_2_14622.vasp,Pt2F4,-1.4341014533333334,0.38349947916666394 -Bi1Pd1_187_2357.vasp,BiPd,-0.418091255,0.9155971224999999 -Na1Ti2H1O5_1_11946.vasp,NaTi2HO5,-5.970853475555555,0.15520377333994295 -Ba3Fe2I2O5_123_2107.vasp,Ba3Fe2I2O5,-3.321402138333333,0.06444373374999723 -Cu4S16Br4N16_14_5441.vasp,Cu4S16Br4N16,-3.4018845992499998,-0.09679041837499913 -Sb4Te3Au2F2_6_15832.vasp,Sb4Te3Au2F2,-1.14538749,0.6098417706666646 -As4Pd4Se4_13_1352.vasp,As4Pd4Se4,-2.1883067825,0.33673748916666657 -Mg3As3_25_10542.vasp,Mg3As3,-1.61495793,0.5802677809999996 -P1Au3O4_156_13910.vasp,PAu3O4,-2.41214010375,1.0234172437499995 -Ta2S2I2_59_17848.vasp,Ta2S2I2,-3.942378123333333,0.11165404770833032 -Ag1Te1Au1I1_6_138.vasp,AgTeAuI,0.20161057,0.24219224125 -Ni1Br1Cl1_156_13284.vasp,NiBrCl,-0.41192265,-0.27962519666666663 -Ag2O4F2_4_342.vasp,Ag2O4F2,-1.8128250575,0.10611568500000002 -Na1Ni1As2S6_149_11911.vasp,NaNiAs2S6,-2.318507931,0.4714686742187477 -Bi10Te10_26_2295.vasp,Bi10Te10,-1.21894674,0.30089025999999985 -Mg2Fe2Sn2_129_10454.vasp,Mg2Fe2Sn2,-0.4092405416666667,0.14877900611110947 -Ti2Sb2O6_162_19012.vasp,Ti2Sb2O6,-5.687696398,0.2420176109999986 -V2Sb2S6_162_20173.vasp,V2Sb2S6,-3.092566923,0.2997657155 -Hf1Zr3Se8_1_7421.vasp,HfZr3Se8,-3.9838849133333336,0.26568428312500014 -Rb1Ti1Te2_156_14762.vasp,RbTiTe2,-2.4238147925,0.29029050603447654 -B6Au1N6O2F4_6_1772.vasp,B6AuN6O2F4,-5.296430684736842,0.5430846986549629 -Ti1Co1Se2I1Br1_6_18766.vasp,TiCoSe2IBr,-2.5798584,0.07215714077777156 -Al4O6_164_1078.vasp,Al4O6,-5.936654771,0.1868800669999997 -Na2Hg4S8F6_31_12160.vasp,Na2Hg4S8F6,-1.147641121,0.31843994782291585 -K2Na2Os2N2O4F10_59_9251.vasp,K2Na2Os2N2O4F10,-3.0260343595454544,0.26353808460858 -H4Pb2O4_31_7068.vasp,H4Pb2O4,-3.7284611560000003,0.11169823504166539 -H2C4O4_6_6994.vasp,H2C4O4,-5.760882327,0.34740538808333365 -K2Cl2O4_51_9077.vasp,K2Cl2O4,-1.96973345125,0.42198625875000007 -B2H2Pb4O8_12_1670.vasp,B2H2Pb4O8,-4.56908416875,0.13880038062499978 -Ir4C12_127_8860.vasp,Ir4C12,-5.353431600625,2.0366171818749996 -Ag1I1_156_82.vasp,AgI,0.6004717,0.25299839500000004 -Fe1Rh1Se2_156_5740.vasp,FeRhSe2,-1.532489655,0.6964041759374999 -Sc6N4Cl6_1_16274.vasp,Sc6N4Cl6,-4.558734508125,-0.022414853749999963 -Mg3Si1_99_10562.vasp,Mg3Si,-0.704635585,-0.05594082458333338 -Ga1Sb2Au1Se6_149_6267.vasp,GaSb2AuSe6,-1.6888094630000001,0.32962242991666424 -Mn1Zn1I1Br1O1_6_10941.vasp,MnZnIBrO,-1.285938134,0.19810750975000008 -P4O8_11_14094.vasp,P4O8,-4.924431731666666,0.4691284406666639 -Ag2Te6P2_147_487.vasp,Ag2Te6P2,-1.266370876,0.33423797242424025 -Sc1Br2_123_15912.vasp,ScBr2,-2.14518793,0.24252538833333093 -Rb2Ru2N2Cl8O4_7_14928.vasp,Rb2Ru2N2Cl8O4,-2.4566561944444443,0.20600438680554625 -Ca1Au2O8_89_2803.vasp,CaAu2O8,-2.6719258336363634,0.337176630909088 -Cd2H4S2O8_31_3512.vasp,Cd2H4S2O8,-3.633405934375,0.09083525744791732 -Ge2P2C2O6F6_7_6799.vasp,Ge2P2C2O6F6,-4.4424136488888895,0.27946662388887655 -Ag1Pd1Br1Cl5_1_101.vasp,AgPdBrCl5,-0.33201439,0.13573380614583333 -B4Te6_1_1769.vasp,B4Te6,-2.75386092,0.6536046533333334 -Li2H6Pd1O6_147_9950.vasp,Li2H6PdO6,-3.9907986393333332,0.0793805998333339 -P2Br8_2_13965.vasp,P2Br8,-0.9661032009999999,0.09896365974999799 -Ta1Mn1I1Cl3O2_8_17563.vasp,TaMnICl3O2,-3.46700093625,0.1258994127343695 -Mn2V1Br4O4_1_11333.vasp,Mn2VBr4O4,-3.0922404645454544,-0.011067520056823765 -Rb2Nb8Br22_51_14903.vasp,Rb2Nb8Br22,-2.4412969609375,0.08698178093749975 -Ti2Te2C1_12_19036.vasp,Ti2Te2C,-5.243863402000001,-0.30134822799999994 -Tm1Bi2_21_19660.vasp,TmBi2,-1.6721122599999998,-0.32015012500000095 -Mn2Te2H4O8_7_11297.vasp,Mn2Te2H4O8,-3.998884208125,0.36662129171875035 -Hf1Zr1S3I1Cl2_8_7393.vasp,HfZrS3ICl2,-3.49094120625,0.28495734622395275 -Na1Ni1Te6As2_149_11920.vasp,NaNiTe6As2,-1.396287025,0.2965109277499988 -Zr2Ti2Se8_6_21724.vasp,Zr2Ti2Se8,-4.0303488775,0.2509684704166668 -Li2Fe2Si2O8_11_9914.vasp,Li2Fe2Si2O8,-4.917226742142858,-0.01213260928571458 -Li1Co1Te6As2_5_9676.vasp,LiCoTe6As2,-1.8331105440000002,-0.17434189133333589 -Na4Br2O1_123_12371.vasp,Na4Br2O,-1.2161237828571427,0.8075282171428566 -Mn2B1Cl2_164_10991.vasp,Mn2BCl2,-2.546610442,0.30416140150000026 -Nb4Br16_14_13040.vasp,Nb4Br16,-1.8395840665,0.30202194849999975 -Sr2Br2_164_17152.vasp,Sr2Br2,-1.11307115,0.34894191500000016 -Ti2Br2N1O1_6_18896.vasp,Ti2Br2NO,-5.481141458333333,-0.09460005041666997 -Ga1C1_38_6146.vasp,GaC,-3.4107931,1.1948190950000002 -H2Pd1O2_164_7009.vasp,H2PdO2,-3.283887186,0.35581916416666703 -As4Au2Se3F2_6_1320.vasp,As4Au2Se3F2,-1.6714310372727275,0.5249432151298663 -V2H2N1O2_164_20075.vasp,V2H2NO2,-5.07633346,0.07402841261903237 -Ca1Ag1I1Br1_6_2791.vasp,CaAgIBr,-0.399552015,0.61806140875 -Ta2Br10_51_17663.vasp,Ta2Br10,-1.7784837108333333,0.3759821591666668 -As2F6_31_1211.vasp,As2F6,-2.75144375125,0.08884324812499989 -Ba2Sn2F8_129_2061.vasp,Ba2Sn2F8,-3.2564739516666665,0.02963765250000039 -Ta4Te6_11_18133.vasp,Ta4Te6,-4.017868726,0.16026014400000044 -In2S2Cl2_59_8545.vasp,In2S2Cl2,-1.9865204416666666,0.05648663333333137 -Rb1I2_25_14741.vasp,RbI2,0.02470093666666667,0.39547958874999967 -Hf1Te1Br1O1_1_7316.vasp,HfTeBrO,-4.3270939575,0.2577382681250002 -Hf1Ga1Se2_156_7168.vasp,HfGaSe2,-3.5683176425,0.2512708000000008 -Mn1Ge1Cl6_149_10734.vasp,MnGeCl6,-1.620046315,0.08795368718749996 -Cu2Br2N2_59_5048.vasp,Cu2Br2N2,-1.3323520383333334,0.7653510324999977 -Ca1Cu2F12_115_2826.vasp,CaCu2F12,-1.157732712,-0.01887499033333346 -U1B2O6_5_19694.vasp,UB2O6,-7.143353713333334,0.08324389222222184 -Ru2S2Cl2_59_15338.vasp,Ru2S2Cl2,-2.6319144683333335,0.22800968944444122 -Sm2S2I2_164_16581.vasp,Sm2S2I2,-3.3131950700000004,0.04485780333333311 -Si4Te4_29_16521.vasp,Si4Te4,-2.522820315,0.0028676162499996494 -Te3P4Au2Cl2_6_18555.vasp,Te3P4Au2Cl2,-1.6063360354545453,0.37098467621211706 -Rh2S4_11_15226.vasp,Rh2S4,-2.77503282,0.40573508333333064 -Zr2C1F2_164_21532.vasp,Zr2CF2,-5.456399806,0.09243179999999995 -Hf2F2_129_7486.vasp,Hf2F2,-3.8812273925,1.4657037931250003 -Re1I2_115_15006.vasp,ReI2,-1.3716939866666669,0.9740419129629606 -Li2Fe3O6_1_9916.vasp,Li2Fe3O6,-3.67636766,0.29711185488636027 -Cu4O4F4_14_5432.vasp,Cu4O4F4,-1.75294911,0.27937370208333134 -Nb4O12_11_13117.vasp,Nb4O12,-5.880988826875,0.19743477687500044 -Ce2Te6_129_3684.vasp,Ce2Te6,-2.573024475,-0.6289186275 -Ti1Mn2O6_12_18799.vasp,TiMn2O6,-5.212843795555555,0.1849808649999951 -Li2Cu1As1_187_9878.vasp,Li2CuAs,-1.750729135,0.23360045625000003 -Hf2P1S2_164_7551.vasp,Hf2PS2,-5.666528544,0.09094810850000057 -Cr2Se2S2_6_4498.vasp,Cr2Se2S2,-2.9090081383333337,0.3053519299999996 -Ti2Se2Cl2_59_19020.vasp,Ti2Se2Cl2,-4.036697213333333,-0.4648851095238171 -Hf1Ti1S1Cl3_1_7332.vasp,HfTiSCl3,-3.8110238683333333,0.21115659069443948 -Hf4Se1S3I1Br3_3_7812.vasp,Hf4SeS3IBr3,-4.069305036666667,-0.0005564728125085905 -V1Ag1Cl4_2_19751.vasp,VAgCl4,-1.4078361583333334,0.12338984583333179 -U2S6_59_19722.vasp,U2S6,-5.121380205,0.0603477649999995 -Sn2As2H2S6_7_16718.vasp,Sn2As2H2S6,-2.6292089408333332,0.24598067364583076 -Cu1H6Pb4S2O14_2_4903.vasp,CuH6Pb4S2O14,-3.912106685185185,0.157174084907404 -Rh2I2_164_15197.vasp,Rh2I2,-0.6781099525,0.7603178424999988 -Sb2Pd3S8_164_15657.vasp,Sb2Pd3S8,-2.184932851538462,0.28792111038461066 -Co2As1S2_187_3840.vasp,Co2AsS2,-2.707905164,0.3538533124166644 -Ni2As1Se1S1_1_13443.vasp,Ni2AsSeS,-1.2249758160000002,0.5409778444166632 -Ho2S2Br2_59_8143.vasp,Ho2S2Br2,-3.5522941733333333,0.03483983833333326 -K2Pb2Br6O2_26_9295.vasp,K2Pb2Br6O2,-1.31793168,0.24320520479166396 -Be2Cl4_2_2248.vasp,Be2Cl4,-2.4457570233333334,0.20424638999999978 -V2Mo1I1Br1O3_1_20102.vasp,V2MoIBrO3,-3.88533264125,0.02416947624999491 -Hf2S3Br2_1_7578.vasp,Hf2S3Br2,-4.126239581428572,0.28988928285713733 -Fe2Te6_11_6027.vasp,Fe2Te6,-1.0908955775,0.5232397979166665 -Si2S2_31_16436.vasp,Si2S2,-3.4776884125,0.18076576499999997 -Cr2Cu1O6_12_4360.vasp,Cr2CuO6,-4.152909294444445,-0.018385303472226777 -Cr3C2O2_187_4549.vasp,Cr3C2O2,-5.152390464285714,-0.19482367148269386 -Zr2Te1S1_6_21698.vasp,Zr2TeS,-4.01494699,-0.19926621000000044 -Rb3Mo2Br9_187_14958.vasp,Rb3Mo2Br9,-1.128970455,0.14147104946428446 -As2Os2O6_12_1233.vasp,As2Os2O6,-4.667402265,0.3458890194999948 -In2Fe2S5_187_8436.vasp,In2Fe2S5,-2.4918066511111108,-0.20844418055555747 -Al2Pd1Se4_164_930.vasp,Al2PdSe4,-2.5297352957142856,0.07266975785714153 -Ba2Mg2Pb2_129_2020.vasp,Ba2Mg2Pb2,0.22115269666666668,0.9823233666666666 -Nb3B2H2O2_187_12945.vasp,Nb3B2H2O2,-5.8241456255555555,0.31052569638888405 -Be2Sn4_12_2270.vasp,Be2Sn4,-1.5540022633333335,-2.5418986583333325 -Na2Sn2O2_129_12306.vasp,Na2Sn2O2,-2.546169895,0.39327181569444214 -Ti2H2N1O2_164_18947.vasp,Ti2H2NO2,-6.267372317142857,-0.6271902136904846 -Ga2Cl6_26_6323.vasp,Ga2Cl6,-1.50338778625,0.12279502124999997 -Na2Cu1S2_12_12067.vasp,Na2CuS2,-1.484320664,0.09487297474999828 -Na2P2H14O12_5_12257.vasp,Na2P2H14O12,-4.451639970666666,0.07561003009721771 -Ti1Pd1Br2O1_1_18828.vasp,TiPdBr2O,-3.193334832,0.4495518955000007 -Sr4Fe2S6Br2_129_17437.vasp,Sr4Fe2S6Br2,-2.589777084285714,-0.216527132500004 -Li1Ga1P2O6_5_9710.vasp,LiGaP2O6,-5.024559941,0.226678579159995 -Nb3I8_156_12982.vasp,Nb3I8,-1.8898055536363636,0.09841274363636354 -C4Se4_57_2771.vasp,C4Se4,-3.254739775,1.9574172066666666 -Cr4B3Cl2_164_4588.vasp,Cr4B3Cl2,-3.6353496355555555,0.20382429013888542 -Fe2Sb2S4Cl2_26_5954.vasp,Fe2Sb2S4Cl2,-2.274588708,-0.20691292100000147 -Cs1Sn1S2_156_4650.vasp,CsSnS2,-1.73013966,0.46616496968750043 -Mn2Ge1Br6O1_8_11085.vasp,Mn2GeBr6O,-1.788241317,0.0066228968125002785 -Mn1Mo1Cl4O2_65_10792.vasp,MnMoCl4O2,-2.78774216875,0.024024284999999868 -Ag4N4O12_14_533.vasp,Ag4N4O12,-3.422346262,0.08221252200000029 -Y7F10_2_20849.vasp,Y7F10,-4.589857223529412,0.4001814693137209 -V1Ge1Br1N1Cl1_6_19838.vasp,VGeBrNCl,-3.171640502,0.3915805870000004 -Na2Ru2N2Cl8O4_7_12280.vasp,Na2Ru2N2Cl8O4,-2.667302818888889,0.09355113509259 -Ga2Hg1Se4_164_6384.vasp,Ga2HgSe4,-1.5901640442857143,0.18091867428571407 -K2Ru2C2I8O4_31_9316.vasp,K2Ru2C2I8O4,-2.169808318888889,0.18230139333333156 -V2O2F2_164_20119.vasp,V2O2F2,-4.480808181666666,0.03032867944444062 -Ni2Ag1O4_187_13440.vasp,Ni2AgO4,-2.32901806,-0.41548030553571874 -Nb4Cr2O16_13_13064.vasp,Nb4Cr2O16,-5.974675091818182,-0.10449008943182803 -Ca2S8Br4_125_3112.vasp,Ca2S8Br4,-1.7958202785714286,0.5273140339285695 -Hf2Se1S4_8_7601.vasp,Hf2SeS4,-4.4532167157142855,0.5408653061904742 -Ag2B4H4I2N2_1_187.vasp,Ag2B4H4I2N2,-3.5049570314285714,0.4844059697142784 -Cr4S10_11_4621.vasp,Cr4S10,-2.981257000714286,0.36153786205356864 -Ni2Sb2Te4Br2_10_13615.vasp,Ni2Sb2Te4Br2,-0.8886377270000001,0.257557898571426 -Sb4S4O2_11_15815.vasp,Sb4S4O2,-3.178796793,0.10969544283333077 -Fe2Te4H2_2_6013.vasp,Fe2Te4H2,-1.66054044,0.76708843 -Li2Mg1Se2S8F4_2_9975.vasp,Li2MgSe2S8F4,-2.4904770141176473,0.3075641139215627 -Au2O2_10_1501.vasp,Au2O2,-1.1927465725,0.014701400000000087 -Ni2Te2_123_13670.vasp,Ni2Te2,-0.3740912575,0.18898566749999954 -V1Br4_123_19790.vasp,VBr4,-1.1123712559999999,0.28548131600000026 -Ba2Br2_129_1927.vasp,Ba2Br2,-1.0299627025,0.73125217 -Ag1S2_115_112.vasp,AgS2,-1.0854500266666667,0.43266421635416674 -Sb2Te6P2_8_15738.vasp,Sb2Te6P2,-1.875723932,0.32816382899999846 -Li2Rh1_187_10049.vasp,Li2Rh,-1.6775212166666666,0.93185001 -Cu1As1I1N2Cl1_6_4835.vasp,CuAsIN2Cl,-2.286413521666667,0.3911970999999964 -Li2Mo1F6_65_10003.vasp,Li2MoF6,-3.311925897777778,0.13286710555555548 -Sn6N6_2_16991.vasp,Sn6N6,-3.5563226033333333,-2.093159034583333 -Zr2Te2C1_164_21701.vasp,Zr2Te2C,-4.584927410000001,-0.06534655800000033 -Bi2Sb2_1_2532.vasp,Bi2Sb2,-1.575709015,0.12513894999999997 -Zr1P2O6F2_164_21392.vasp,ZrP2O6F2,-5.644040231818182,0.04005266454545442 -Cr1Ag1Te3Se1Br1_1_4109.vasp,CrAgTe3SeBr,-1.0804518785714285,0.3099241655952369 -Nb4Ni2O10_59_13099.vasp,Nb4Ni2O10,-5.69694406,0.2868615829687505 -Y2N1O2_164_20760.vasp,Y2NO2,-6.754626399999999,0.38497800499998736 -In4F4_57_8672.vasp,In4F4,-2.07168260625,0.3596573470833313 -Mo4N3Cl2_164_11748.vasp,Mo4N3Cl2,-4.297676388888889,0.2841342337036994 -Sr1Cu2O8_89_17043.vasp,SrCu2O8,-2.8999573881818184,0.2638448077272695 -Hf2Se2_187_7608.vasp,Hf2Se2,-4.3925683325,0.17464648250000003 -K2Os2C2I8O4_31_9276.vasp,K2Os2C2I8O4,-2.454626721111111,0.30004303354166467 -Ga1Ag1Se2Cl2_6_6128.vasp,GaAgSe2Cl2,-1.18930686,0.3238858334722202 -Ni2O2_10_13548.vasp,Ni2O2,-1.988827315,-0.16297846999999988 -In4N4_127_8677.vasp,In4N4,-2.45213984125,1.58003203 -Al1Ni1Se2_1_693.vasp,AlNiSe2,-1.85471692,0.06163040511904669 -Rh2Se2I2_59_15240.vasp,Rh2Se2I2,-1.6157439333333334,0.0899419069444427 -Ag4F8_13_513.vasp,Ag4F8,-0.6707998825,0.1646366191666666 -Te6W2_11_18686.vasp,Te6W2,-2.33385887625,0.34276102666666675 -U4Te10_10_19739.vasp,U4Te10,-3.8158925457142856,0.048468437857143165 -P1Pb2Se6_162_13932.vasp,PPb2Se6,-1.9049256399999999,0.44681929067129417 -Al1Ag1P2O6_149_597.vasp,AlAgP2O6,-4.729217082,0.439302058409091 -Mn2Al2Se5_187_10956.vasp,Mn2Al2Se5,-2.7905312588888886,-0.14320107415709032 -Rb2Cd4Se2S6Br6_31_14819.vasp,Rb2Cd4Se2S6Br6,-0.859099431,0.28866041633333084 -Na2H2Pd1_123_12102.vasp,Na2H2Pd,-1.795966974,0.049434680000000286 -Ta4Cl16_14_18017.vasp,Ta4Cl16,-2.8540438795,0.10144960050000051 -Sc4C3_164_16234.vasp,Sc4C3,-5.162830257142857,0.22427058857142868 -K4Nb6Cl18_12_9483.vasp,K4Nb6Cl18,-2.765729827142857,0.0625774692857144 -Zr1Ni3Se6Br2_1_21383.vasp,ZrNi3Se6Br2,-1.6239998491666665,0.2053444114583305 -Mn3Hg2S8_10_11390.vasp,Mn3Hg2S8,-1.9599218407692307,0.4302670467307681 -Mo1O2_115_11525.vasp,MoO2,-4.7373098266666664,0.574595285 -Nb2Co4Te6_11_12702.vasp,Nb2Co4Te6,-2.421633416666667,0.09511887902777522 -Ga2O3_1_6419.vasp,Ga2O3,-4.280094874,-0.2120105767500038 -C8O12_14_2782.vasp,C8O12,-6.079554219,0.3067643199999941 -Li1P3_10_9776.vasp,LiP3,-3.04547017,0.722422456874996 -Nb1H4_123_12517.vasp,NbH4,-3.027244242,1.5089345400000007 -V1Cl1F1_156_19796.vasp,VClF,-2.7483022233333334,0.062899442222218 -Sb4Pt4Se4_13_15811.vasp,Sb4Pt4Se4,-2.1641087591666666,0.41971036500000025 -Cr2Ni1Te4_164_4433.vasp,Cr2NiTe4,-1.541281607142857,0.09895628571428353 -Cu5Sn1As2S4I3Cl5_1_5491.vasp,Cu5SnAs2S4I3Cl5,-1.0122119365,0.235602496292481 -K4Se4S8_13_9513.vasp,K4Se4S8,-1.899334510625,0.23156127618055156 -Ag4S4Cl4F4_14_546.vasp,Ag4S4Cl4F4,-0.9259954925,0.26753159480468747 -Tl4As20_26_19587.vasp,Tl4As20,-2.5522410591666667,0.12063860708333296 -Nb6Sn2S12_26_13200.vasp,Nb6Sn2S12,-4.3743212935,0.26377814349999973 -V4Te2_129_20374.vasp,V4Te2,-2.86620205,0.5320576533333334 -Ga1Os3S4Br4_8_6228.vasp,GaOs3S4Br4,-2.6587897958333335,0.3690052662499983 -Al2Te2I14_7_1005.vasp,Al2Te2I14,-0.3689285666666666,0.10685741555555511 -Al4Bi8Te8Br4Cl16_13_1062.vasp,Al4Bi8Te8Br4Cl16,-1.68341090825,0.09947196000000025 -Tl4O6_7_19613.vasp,Tl4O6,-1.973172144,0.7369930345 -Nb2Mo2O11_164_12762.vasp,Nb2Mo2O11,-5.92488564,0.053405681333332566 -Pb2Br2F2_129_14217.vasp,Pb2Br2F2,-1.9484029933333333,0.09985215999999997 -Mn1Ag1N2Cl2_6_10613.vasp,MnAgN2Cl2,-2.318614756666667,0.3033079216666652 -Nb2P2Se6_1_12809.vasp,Nb2P2Se6,-3.5520404020000003,0.22905520037499594 -Cu2H8C12S2N4Cl4_11_5140.vasp,Cu2H8C12S2N4Cl4,-4.90345590125,0.28030991788690285 -Ta1P2_164_17597.vasp,TaP2,-5.300660586666667,0.7007635416666664 -Ba1Al1Sn4O7_156_1802.vasp,BaAlSn4O7,-4.034059357692308,0.4294751767307645 -Mg1Al2S4_164_10334.vasp,MgAl2S4,-3.4504061871428573,0.1112737807142854 -Ti2H2N1_164_18948.vasp,Ti2H2N,-6.021152584,-0.045619167999999544 -Zn1S1F1_1_21001.vasp,ZnSF,-1.1767605833333332,0.45512967014583133 -Zr2Sc1S6Br1_1_21668.vasp,Zr2ScS6Br,-4.031854818,0.21999341224999602 -Tm1Ag1P2Se6_149_19657.vasp,TmAgP2Se6,-2.585338578,0.07073333150000005 -Pt1S2Cl6_2_14587.vasp,PtS2Cl6,-1.1184910177777778,0.09357824222222066 -Bi1Sb1I1Br1_1_2377.vasp,BiSbIBr,-0.9047723275,0.25299274291666346 -Ni1H4C6Cl2_47_13345.vasp,NiH4C6Cl2,-4.582598447692307,0.34353189999999295 -K1C1N1_1_8887.vasp,KCN,-4.79292203,0.3141957966666604 -As1Br2_164_1136.vasp,AsBr2,-0.9547267333333332,0.44153708222222093 -Cd2P4O20_14_3532.vasp,Cd2P4O20,-3.985485010769231,0.40039954971153513 -H2Ru2_164_7027.vasp,H2Ru2,-2.967429165,1.544423685 -Ge3Cl2O5_1_6908.vasp,Ge3Cl2O5,-3.914273952,0.16302982750000083 -N12O24_1_11769.vasp,N12O24,-4.564734087222223,0.13830924861110994 -Ga1Ag1Sb2O6_5_6121.vasp,GaAgSb2O6,-3.587051371,0.35902376612500064 -U2F6_59_19708.vasp,U2F6,-5.04422617125,0.3884290679166664 -W2O2_187_20519.vasp,W2O2,-5.47191048,0.9832411389795861 -Ge2Cl6_1_6771.vasp,Ge2Cl6,-1.63552732625,0.13674455343749803 -Ni1C4N2Cl2_47_13296.vasp,NiC4N2Cl2,-4.186587157777778,0.9599184335185134 -B2Te3_164_1716.vasp,B2Te3,-2.460706898,0.9467586753333334 -Te2As1_187_18350.vasp,Te2As,-1.6685645833333334,0.3546292186111095 -K8Hg4S8_57_9554.vasp,K8Hg4S8,-0.8072655449999999,0.1804839815000001 -Sr2La2Br10_11_17269.vasp,Sr2La2Br10,-2.1908895685714285,0.010293378571429312 -Tl2Pd4O6_164_19486.vasp,Tl2Pd4O6,-2.4304022816666664,0.21871041164351412 -Mn3Si1S2_187_11411.vasp,Mn3SiS2,-2.8734756249999998,0.44252556697916035 -Ge3N4_156_6911.vasp,Ge3N4,-4.103092787142857,1.194988869285715 -Nb4Fe8Se8_59_13076.vasp,Nb4Fe8Se8,-2.6677710255,0.7576980830000006 -Sb1Mo1Cl1O5_1_15466.vasp,SbMoClO5,-4.0711757075,0.16729666649999886 -Cr4C3O2_164_4596.vasp,Cr4C3O2,-5.203798528888889,-0.11951844911111587 -K2Hg4Se2Br6O6_31_9186.vasp,K2Hg4Se2Br6O6,-1.2898172730000002,0.08654570200000045 -Ca1In2N2_164_2853.vasp,CaIn2N2,-3.1452292660000003,0.9355457459999998 -S3N2Cl2_1_15390.vasp,S3N2Cl2,-2.8834160814285714,0.32603271419642643 -Ca3Ni2S5I2_123_3196.vasp,Ca3Ni2S5I2,-1.8775044133333332,0.12618382809374568 -Tl2As6_164_19366.vasp,Tl2As6,-1.98667503625,0.39768487137499675 -Rb1Pb1O2_156_14747.vasp,RbPbO2,-2.4661944575,0.39542077640624773 -Al2Te2_2_1012.vasp,Al2Te2,-1.982257155,0.3234950324999999 -Zr1Ni1I1Br1N1_1_21377.vasp,ZrNiIBrN,-2.777871534,0.50509235 -Ni1Bi2_123_13282.vasp,NiBi2,-0.47094193999999995,0.41421552833333336 -Mn2P2Se4F2_26_11200.vasp,Mn2P2Se4F2,-2.560246205,0.31370439093517904 -As8O12_4_1397.vasp,As8O12,-4.405890584,0.07934698800000017 -As2Br6_162_1195.vasp,As2Br6,-1.113467425,0.05593129749999992 -Hf1Mo1I1Cl1O2_1_7233.vasp,HfMoIClO2,-4.451318635,0.3505885312500001 -Ge1Cl2_187_6660.vasp,GeCl2,-1.8338565966666664,0.13333764000000015 -Cr3Mo1N2Cl4O2_1_4560.vasp,Cr3MoN2Cl4O2,-3.680454714166667,0.07841857569444066 -Co1B3_187_3698.vasp,CoB3,-2.96653876,2.2923920966666667 -Y2H2N1_164_20741.vasp,Y2H2N,-5.331211720000001,0.010866275999999786 -Zr2Br2Cl4_1_21517.vasp,Zr2Br2Cl4,-2.62864939875,0.15972635750000008 -Ga4P4_127_6561.vasp,Ga4P4,-2.50838638125,-0.3648614012499998 -Na2Ni1H4Se2O10_2_12233.vasp,Na2NiH4Se2O10,-3.610821853684211,0.025201538728063966 -Sb8S10Cl4_11_15875.vasp,Sb8S10Cl4,-2.3775424095454545,0.141114127272725 -Y2S2I2_164_20773.vasp,Y2S2I2,-3.9407174266666662,0.04183424166666683 -Mn2Bi2Te4I2_10_11026.vasp,Mn2Bi2Te4I2,-1.165407209,0.26846029127586213 -Ru2I6_162_15325.vasp,Ru2I6,-0.7243517875,-0.11812090999999991 -Co2P1S2_187_3954.vasp,Co2PS2,-2.991215182,0.3445839249166648 -In2Bi4Se8Br2_11_8384.vasp,In2Bi4Se8Br2,-1.7833141425,0.10792005187499976 -B1Sb1_187_1636.vasp,BSb,-3.18256411,1.0397120754166667 -Hf1Ge1Se1S1I1Br1_6_7180.vasp,HfGeSeSIBr,-3.0783889183333333,0.18832879555554816 -Ge2Sb2H6C2S6_7_6846.vasp,Ge2Sb2H6C2S6,-3.5419808488888886,0.21727831266202677 -Y4S2N3F2_164_20834.vasp,Y4S2N3F2,-5.384648518181819,0.6739317405302918 -Zr2C1S2_164_21535.vasp,Zr2CS2,-5.585249645999999,0.13221682799999446 -Li4P8W2O26_2_10217.vasp,Li4P8W2O26,-5.491210743,0.12775911133749096 -Ni2Sb2Br2O4_10_13604.vasp,Ni2Sb2Br2O4,-2.462440806,0.31293518825 -Cu2Cl4_127_5085.vasp,Cu2Cl4,-0.22963635000000002,0.2595187533333333 -Ga2Sn2Te2_164_6496.vasp,Ga2Sn2Te2,-1.5538144033333332,-1.1341554211111111 -P2Rh2_129_14040.vasp,P2Rh2,-3.539735905,0.3971142883333332 -Sb1Pd2Se2_187_15484.vasp,SbPd2Se2,-1.76505914,0.2804015095000003 -Hg4Mo2O8_13_8078.vasp,Hg4Mo2O8,-2.796526255,0.07379784428571456 -Ta2Fe4Se2S2_51_17733.vasp,Ta2Fe4Se2S2,-3.138604874,0.7643049533333308 -Hg1S2_164_7910.vasp,HgS2,-0.31207946000000003,0.6980243797916658 -Mn3Ge1W2Se8_1_11382.vasp,Mn3GeW2Se8,-2.4118434585714286,0.4530127445833283 -P2Pb2O6F2_7_14007.vasp,P2Pb2O6F2,-4.581762790833333,0.051909901458333074 -Sn1Au1Br2N2F1_1_16603.vasp,SnAuBr2N2F,-1.8741991714285715,0.8053697452083262 -Ni2C8_1_13491.vasp,Ni2C8,-6.016636794,0.7524235340000003 -Tl4S6_1_19622.vasp,Tl4S6,-1.560037577,0.24019832774999772 -Pd1S2_164_14386.vasp,PdS2,-2.12479139,0.19302081416666672 -K4V4O4F16_14_9528.vasp,K4V4O4F16,-3.383119236428571,0.04733062648808863 -Li1Al1As2O6_5_9636.vasp,LiAlAs2O6,-4.527642038,0.41135317633332436 -K2H4I6O2_7_9131.vasp,K2H4I6O2,-1.898690442857143,0.04719496083333084 -B6Pd1N2Cl2F4_25_1787.vasp,B6PdN2Cl2F4,-4.033325236,0.7076224107222138 -Na2Tb2Cl8_2_12313.vasp,Na2Tb2Cl8,-2.570500055833333,0.08211284249999773 -Mn2As2Se4Br2_10_10980.vasp,Mn2As2Se4Br2,-2.072614667,0.0834466099166643 -In18Te9_143_8175.vasp,In18Te9,-1.0359909603703703,0.7308794262962948 -Ta2F8_1_17725.vasp,Ta2F8,-4.348407971,0.19938522779999912 -Ta6Si2Te12_26_18155.vasp,Ta6Si2Te12,-3.785667059,0.07407058700000002 -Na2C2O6F2_4_11998.vasp,Na2C2O6F2,-4.250341588333334,0.13862658104166348 -Te4Pd2F2_1_18614.vasp,Te4Pd2F2,-1.38339517125,0.3087574114062498 -Ni3Au1F8_2_13696.vasp,Ni3AuF8,-1.2203816825,-0.03176062500000243 -Mo1Rh1Se3S1_6_11540.vasp,MoRhSe3S,-2.7718095050000002,0.26790870874999984 -Sr2C2S6Cl2_59_17162.vasp,Sr2C2S6Cl2,-3.2336362925,0.30768699223957446 -Ag1F2_164_52.vasp,AgF2,-0.5896743233333334,0.24576217833333325 -Ga2Fe2S5_187_6357.vasp,Ga2Fe2S5,-2.8312938155555556,-0.3276662855555581 -Tl1Cu1P2S6_149_19253.vasp,TlCuP2S6,-2.5169868170000003,0.15204835074999967 -V1Sb2Te6Au1_149_19923.vasp,VSb2Te6Au,-1.416560987,0.302491496833333 -Tl1Te2_115_19352.vasp,TlTe2,-0.53789085,0.5470987477777765 -Sn2As2O6F2_7_16721.vasp,Sn2As2O6F2,-3.818345845,0.23569245083333312 -Al2Te2Cl2_59_999.vasp,Al2Te2Cl2,-2.0498855716666666,0.17804705499999995 -La5F8_1_9631.vasp,La5F8,-3.9203960953846155,0.4116098238461506 -Sc1Ag1Sb2Te6_149_15894.vasp,ScAgSb2Te6,-1.544924509,0.2855464436666652 -Ni2Se4F2_6_13648.vasp,Ni2Se4F2,-1.36580450875,0.2444306177083333 -W2O2_10_20520.vasp,W2O2,-5.265326035,1.189825583979586 -Sc2Te6As2_157_16185.vasp,Sc2Te6As2,-2.4005509409999997,0.19602531400000034 -Bi2As2Se6_157_2421.vasp,Bi2As2Se6,-2.150534043,0.2041950305000002 -Sn2Sb2C2S6F6_7_16853.vasp,Sn2Sb2C2S6F6,-2.8054427938888886,0.6432404360416639 -Cr2H2C1O2_164_4394.vasp,Cr2H2CO2,-4.658624868571429,0.12182382714284756 -Zn2H8Se2N4_4_21105.vasp,Zn2H8Se2N4,-3.606825223125,-3.1456158815625015 -Zn1Pd3Se4S4_1_20995.vasp,ZnPd3Se4S4,-1.6646663375,0.2557221700729152 -Zn1Fe1I1Cl1O2_1_20928.vasp,ZnFeIClO2,-1.7752728549999999,0.20657699735155655 -Os2F2_164_13846.vasp,Os2F2,-3.4421373875,0.3643882328750001 -Mn2F6_12_11065.vasp,Mn2F6,-2.80607855375,-0.4618743274999999 -Bi2P4O14_2_2497.vasp,Bi2P4O14,-4.9687485425,0.22756817656249637 -Rh2Se4_11_15245.vasp,Rh2Se4,-2.3180725966666667,0.35559790999999974 -Cr2P4_2_4459.vasp,Cr2P4,-3.45428128,0.7559665749999995 -Sc2I2_164_16095.vasp,Sc2I2,-1.802615785,0.17229233083333106 -Ca2Te2Au1I2_38_3134.vasp,Ca2Te2AuI2,-0.8583316814285714,0.27676885271428364 -Ta4Ni2Te10_59_18067.vasp,Ta4Ni2Te10,-2.898083593125,0.061680028958331024 -Ag2As4Cl2O3_6_162.vasp,Ag2As4Cl2O3,-2.428230959090909,0.2576498060606026 -Cu8H8C4O20_14_5501.vasp,Cu8H8C4O20,-3.8834378364999997,0.25576959233333096 -Ca1C2_164_2815.vasp,CaC2,-1.7982616666666666,3.7800379316666612 -C1Br4_123_2723.vasp,CBr4,-0.389046204,1.229046806 -Zr2Se2I1Br1_6_21675.vasp,Zr2Se2IBr,-3.20284715,0.04202397173610484 -V1C2O6_147_19792.vasp,VC2O6,-5.910507398888889,0.111535994999995 -Pb4O4_57_14314.vasp,Pb4O4,-3.27556997875,-0.1344883190624999 -K2C2S6_2_9023.vasp,K2C2S6,-3.095327277,0.29296995800000003 -Sr3Co2S5I2_123_17364.vasp,Sr3Co2S5I2,-2.3879535725000003,0.13728121253471914 -Zr2Cd2_129_21547.vasp,Zr2Cd2,-0.632046065,0.32072826 -Hf2Te2N1_164_7635.vasp,Hf2Te2N,-5.2502650420000005,0.1761752600000004 -H2W3C2O2_187_7036.vasp,H2W3C2O2,-5.609385123333333,0.33082937010202984 -Y5Cl8_10_20842.vasp,Y5Cl8,-3.4781034607692307,0.16478083416666278 -N4O6_7_11794.vasp,N4O6,-4.684098266,0.10201579849999476 -H4Pd1C8Cl2_25_7079.vasp,H4PdC8Cl2,-5.0007015746666665,0.4639822622222165 -Hf2Zr1Pd1Br1Cl3O4_1_7666.vasp,Hf2ZrPdBrCl3O4,-4.884916475,0.25966204312499797 -Cu2O4F2_4_5202.vasp,Cu2O4F2,-2.05628731625,0.30724574187499987 -Ta2Cu1Mo1I4O4_1_17717.vasp,Ta2CuMoI4O4,-3.623185374166667,0.3001476709722237 -Li1Co3O6_1_9679.vasp,LiCo3O6,-3.896397425,-0.03964373425000578 -Te2P1_164_18434.vasp,Te2P,-2.003877536666667,0.3926449627777757 -Ta12Br28_53_17498.vasp,Ta12Br28,-3.0541524737500003,0.08155901399999976 -Yb2Cu2Pb2Se6_51_20870.vasp,Yb2Cu2Pb2Se6,-2.287158045,-0.2587265785763906 -Mo2I8_1_11629.vasp,Mo2I8,-0.480930991,0.18237203870833385 -Ga2Co2S5_187_6331.vasp,Ga2Co2S5,-2.78570515,0.055131368240738166 -K2Te2H6N2O6_1_9373.vasp,K2Te2H6N2O6,-3.7921366672222216,0.08858348217592427 -Bi2Au2O4_26_2424.vasp,Bi2Au2O4,-2.22812306875,0.8853934959374976 -Fe2W2Se2O12_113_6038.vasp,Fe2W2Se2O12,-4.383940555555555,0.20160331898147765 -Bi2As2S6_157_2418.vasp,Bi2As2S6,-2.587788359,-0.10132994625000025 -V1Te4O12_1_19945.vasp,VTe4O12,-3.8595265782352937,0.20820668801470255 -Ba4Mn2Cl2O6_129_2161.vasp,Ba4Mn2Cl2O6,-4.040983629285714,0.025808041705663393 -Ni2Ge8_50_13507.vasp,Ni2Ge8,-2.28385499,-0.2887960394999999 -Sc1Cu1Sb2O6_149_15927.vasp,ScCuSb2O6,-4.208674485,0.5308595061249997 -Ba2Ag1P1_156_1884.vasp,Ba2AgP,-1.07548945,0.36741206375000024 -In2Se2O8F2_11_8584.vasp,In2Se2O8F2,-3.1133542592857144,0.4047418758928541 -Ge1I2_164_6673.vasp,GeI2,-1.14041714,0.07840811666666658 -Cu2Bi2Se4_26_5043.vasp,Cu2Bi2Se4,-1.27488400125,0.19564823093749995 -Tb2Cl6_59_18190.vasp,Tb2Cl6,-2.912701935,0.026965160000000044 -Cu1F2_164_4874.vasp,CuF2,-1.0446101333333333,0.25245522666666664 -Hf2Zr1Ti1Br8_1_7668.vasp,Hf2ZrTiBr8,-2.922079485833333,0.2038883255555517 -Co2As2Pd2_129_3843.vasp,Co2As2Pd2,-1.9651632666666667,0.37875979999999987 -Ir2Pd2Se8_2_8807.vasp,Ir2Pd2Se8,-2.1824057975,-0.08169404541666647 -Ag2S4_6_395.vasp,Ag2S4,-1.2925010366666667,0.2256132063541667 -Na2Ti2C2F2_59_12323.vasp,Na2Ti2C2F2,-4.74995314125,0.04801320125000008 -Li1Al1Sb2Se6_5_9647.vasp,LiAlSb2Se6,-2.291910661,0.36155577033333086 -Li1Fe2Sb1Br1Cl1O4_1_9702.vasp,LiFe2SbBrClO4,-3.155790081,0.20917641589999603 -Al1Fe5Cl2_123_658.vasp,AlFe5Cl2,-0.87694718875,1.1638402604166653 -Li6Te2S8F2_11_10281.vasp,Li6Te2S8F2,-2.600981911111111,0.23533981104166424 -Ti1Mo1N1Cl2O1_8_18802.vasp,TiMoNCl2O,-4.707246845,0.19155652458332972 -Al2As2Se6_162_763.vasp,Al2As2Se6,-2.599809694,0.17951520850000002 -Zr4S4Cl4_31_21842.vasp,Zr4S4Cl4,-3.847683539166667,0.20068920749999997 -Te4O6F4_2_18599.vasp,Te4O6F4,-3.156481121428571,0.09458220857142896 -Cu2Se2_59_5306.vasp,Cu2Se2,-0.8028592225,0.10781296333333346 -Zr2Ge4_129_21574.vasp,Zr2Ge4,-3.7362407733333334,0.4199009349999998 -Zr1Nb1I2O2_8_21346.vasp,ZrNbI2O2,-4.349999736666667,0.4226464024999954 -Sr3Sb3_25_17398.vasp,Sr3Sb3,-0.9097222033333333,1.1639018733333337 -Tl2Ge2S6_162_19427.vasp,Tl2Ge2S6,-2.358140526,0.2496010226874974 -Cu2Cl2_156_5081.vasp,Cu2Cl2,-0.329806835,0.30633671875 -Fe2I2_164_5865.vasp,Fe2I2,0.0044064575,0.550644890625 -Li2Ti2C2Cl2_59_10091.vasp,Li2Ti2C2Cl2,-4.86759086125,0.2017074137499999 -V1Bi2_187_19782.vasp,VBi2,-1.6379697733333334,0.3029816766666651 -Nb1N1O1F1_8_12538.vasp,NbNOF,-5.528425275,0.6437208277083215 -Mn1Sn1Se1Br2Cl2_1_10896.vasp,MnSnSeBr2Cl2,-1.3308375914285713,0.2686439797619014 -Co2I2O2_59_3924.vasp,Co2I2O2,-2.2841507983333336,-0.38236347212963107 -Sr4Se4O12_14_17475.vasp,Sr4Se4O12,-4.1205037465,0.11299721900000037 -Li2Nb1P2O8_2_10009.vasp,Li2NbP2O8,-5.488558846923078,0.3145434113076858 -Mn1Co1Br2O1_1_10667.vasp,MnCoBr2O,-2.11485975,0.1051359879999969 -Mo2F6_189_11608.vasp,Mo2F6,-2.94590235625,-0.1358671618749998 -Tb2Sb2S4O2_129_18207.vasp,Tb2Sb2S4O2,-4.344648832,-0.003142059500004568 -Ga2_51_6523.vasp,Ga2,-1.452439355,-0.35754037500000013 -K4C4N28_14_9419.vasp,K4C4N28,-5.958454201666666,-0.541119213101855 -Pb2O1_8_14261.vasp,Pb2O,-2.1092990366666666,0.42748410979166485 -Mn4I10_13_11440.vasp,Mn4I10,-0.37660124,0.19282160883928606 -Nb2Te2_129_12913.vasp,Nb2Te2,-3.8986117225,-0.2659394916666711 -As4S6_4_1362.vasp,As4S6,-2.874147675,0.6453472534999998 -Al1S4_8_726.vasp,AlS4,-2.624063976,0.5545253035625002 -Mn2Se1Br1Cl2_1_11266.vasp,Mn2SeBrCl2,-1.7597037516666667,0.0326202810416667 -Ga4Se2S2_11_6570.vasp,Ga4Se2S2,-2.3297487825,0.30260768875 -Sr4As4S8Cl4_14_17405.vasp,Sr4As4S8Cl4,-2.8309598145,0.24616810975000025 -Zr3Tl2Cu2S8_12_21798.vasp,Zr3Tl2Cu2S8,-3.276698848,0.12535359516666666 -Na1In1P2O6_5_11885.vasp,NaInP2O6,-4.766991619000001,0.19879737393749342 -Co3Si1S2_187_4070.vasp,Co3SiS2,-2.709334645,0.26308390205127574 -Na2Cd4Se2S6Cl6_31_12041.vasp,Na2Cd4Se2S6Cl6,-1.1138035135000002,0.32556086412499685 -Zr4S4Br4_7_21841.vasp,Zr4S4Br4,-3.6124048633333334,0.19831927166666619 -Ag2Pt1C4O10_10_370.vasp,Ag2PtC4O10,-4.346842969411765,0.5736983302941163 -Te4I4_2_18590.vasp,Te4I4,-0.45639407875,0.12413343125000004 -Al2Te2Cl2_31_1000.vasp,Al2Te2Cl2,-2.1894343666666667,0.038498259999999895 -Cu6Bi2Te4Cl2O16_31_5494.vasp,Cu6Bi2Te4Cl2O16,-2.723935347333333,0.31142670849999665 -V1Ag1P2S6_5_19757.vasp,VAgP2S6,-3.004764646,0.057584110760417806 -Zr1S2N1_156_21413.vasp,ZrS2N,-4.2692218075,0.8709522211249949 -Ti1Co1Pd1Se4_8_18762.vasp,TiCoPdSe4,-2.797444182857143,0.23238631760800255 -Cu2Hg2S2Cl2_26_5155.vasp,Cu2Hg2S2Cl2,-0.26861704875,0.1317790158333334 -K4H2Br2O2_11_9452.vasp,K4H2Br2O2,-2.299994822,0.09906844599999998 -Ba4Te8As4H4_14_2194.vasp,Ba4Te8As4H4,-2.2584844570000002,0.5835363713333306 -Sr4Co2Cl2O6_129_17416.vasp,Sr4Co2Cl2O6,-3.866941240714286,-0.1487738427381028 -B2Sb2_129_1708.vasp,B2Sb2,-3.2021344475,1.0201417379166664 -Ti8Se1S1N4Cl6_6_19186.vasp,Ti8SeSN4Cl6,-5.730877726,-0.31185365682500876 -Nb3Cl2O4F1_1_12966.vasp,Nb3Cl2O4F,-5.37386464,0.21985945195832368 -Ti3Te2H2C2_6_19110.vasp,Ti3Te2H2C2,-5.088287042222222,0.2876671598148093 -Y2S1Cl2O1_1_20767.vasp,Y2SCl2O,-4.74449339,0.3967336225000002 -Na2H16C10O10_2_12096.vasp,Na2H16C10O10,-5.097283741842105,0.16835195861840502 -Mo1P2_187_11533.vasp,MoP2,-3.7722509800000004,0.6610830733333333 -Ge2Br2N2_59_6753.vasp,Ge2Br2N2,-3.406036256666667,0.09157605222221687 -Mn3S4Br1_143_11402.vasp,Mn3S4Br,-2.5550736375,0.21526576781249718 -Te4Pb4_57_18611.vasp,Te4Pb4,-1.184173375,-1.2449405500000001 -Ni2Se2Br1Cl1_8_13629.vasp,Ni2Se2BrCl,-0.7051979716666666,0.10282851166666673 -Ca2Ni1O3_38_3076.vasp,Ca2NiO3,-3.7329685099999996,-0.29583764166666915 -Re2H2_164_15048.vasp,Re2H2,-5.1712254975,1.0916590400000001 -V1Cu1S2_156_19816.vasp,VCuS2,-2.49001805,0.531255308 -Mn1Bi1Sb1S1Br1_1_10648.vasp,MnBiSbSBr,-1.615066136,0.4803118343749983 -Te8Os6_11_18704.vasp,Te8Os6,-2.8405954778571427,-0.11206834642857633 -Mn4Cl10_13_11431.vasp,Mn4Cl10,-1.4739972035714286,0.1623776124999985 -U2Pb4_2_19719.vasp,U2Pb4,-3.08850733,0.5874315049999965 -Ca1Sn2_164_2888.vasp,CaSn2,-0.61047525,0.17130155166666594 -Tl2O2F2_59_19467.vasp,Tl2O2F2,-2.1531217983333333,0.1940174374999999 -Re4O8_2_15111.vasp,Re4O8,-6.138368008333334,0.10877587750000028 -In2Co1O4_164_8407.vasp,In2CoO4,-3.511416537142857,0.2211585144642827 -Ge1Sb1Br4_1_6702.vasp,GeSbBr4,-1.2253464766666666,0.2122771212499984 -Li4Mo4S8_2_10204.vasp,Li4Mo4S8,-3.430435344375,0.1360633840625003 -Fe2F6_162_5848.vasp,Fe2F6,-2.18083388375,-0.35709314125 -Mn2In2S5_164_11124.vasp,Mn2In2S5,-2.60270322,-0.01133271277777781 -In2C4F14_10_8398.vasp,In2C4F14,-3.057482027,0.45838510499999985 -Ca2Eu2Cu2Cl2O6_129_3011.vasp,Ca2Eu2Cu2Cl2O6,-4.101418597142858,-0.5608239495238176 -Pb1W1O4_3_14211.vasp,PbWO4,-4.988406896666667,0.3725931124999997 -Fe2C1O2_164_5828.vasp,Fe2CO2,-3.564143428,1.024261608000001 -V4Zn2O10_59_20380.vasp,V4Zn2O10,-4.49202400625,0.3169827256249995 -Re2Se2_164_15083.vasp,Re2Se2,-4.5331700825,0.5131551312500005 -I4_55_8163.vasp,I4,0.56219706,0.18092609187500003 -Ti2Bi4O10_59_18893.vasp,Ti2Bi4O10,-4.8802273275,0.3291319437499949 -Ga1Ag1I2_1_6114.vasp,GaAgI2,-0.2089515575,0.5132568528205114 -Hg3I6_143_8060.vasp,Hg3I6,0.9220475633333334,0.0491673061111112 -K10Ag4As6Se18_26_8872.vasp,K10Ag4As6Se18,-1.524267564736842,0.15485553052631595 -Sc1Cu1P2O6_149_15924.vasp,ScCuP2O6,-5.02019365,0.4277235397999921 -Cu2Sn2O6_51_5319.vasp,Cu2Sn2O6,-3.041264215,0.564582761249997 -Ni4Pb12_55_13754.vasp,Ni4Pb12,-0.339288146875,1.001851443125 -B4Br4_57_1748.vasp,B4Br4,-1.53330383125,1.7931098706944413 -Nb9Te18_12_13212.vasp,Nb9Te18,-3.300579958888889,0.08834040222222184 -Ca3Mn2S5I2_123_3189.vasp,Ca3Mn2S5I2,-2.3892985833333333,0.1771953578333303 -Ni2P2S6_162_13565.vasp,Ni2P2S6,-2.4711231959999997,0.13960271022221693 -Ce1Se2_10_3653.vasp,CeSe2,-2.4639306199999997,1.3373970858333335 -Hf3Ti1Se1S3Br4_1_7741.vasp,Hf3TiSeS3Br4,-4.152988560833333,-0.04008301854167484 -N2F10_51_11782.vasp,N2F10,-0.5382247241666667,0.7916382614583333 -K2Fe1C4O4_21_9098.vasp,K2FeC4O4,-4.83833984,0.4838454690909018 -Cd2Cu2Se2Cl2_26_3494.vasp,Cd2Cu2Se2Cl2,-0.28937328375,-0.0777057728125 -Al2O3_6_917.vasp,Al2O3,-5.738936534,0.38459830399999984 -Ga2Ge2Te6_162_6368.vasp,Ga2Ge2Te6,-1.8310989459999998,-0.2150329832666663 -Co1Pb2C6N6_12_3809.vasp,CoPb2C6N6,-5.84850497,0.08600301066665886 -Ga2Ni2Se5_187_6407.vasp,Ga2Ni2Se5,-1.6976096299999999,-0.03820515166666849 -P2_164_14065.vasp,P2,-3.975699885,0.0702961000000002 -As2H6Pb2C2O6_7_1216.vasp,As2H6Pb2C2O6,-4.309644405555556,0.1676666027777669 -Re1Cl2_187_14999.vasp,ReCl2,-2.25110782,1.0382115074074045 -Li4As4S8_14_10158.vasp,Li4As4S8,-3.107253686875,0.08286223937499981 -H8Os2_123_7092.vasp,H8Os2,-3.528695782,1.5096015880000004 -Pb2Se2I2_59_14288.vasp,Pb2Se2I2,-1.0547820083333332,0.34012368142360916 -Hf1Zr1I2N1_25_7380.vasp,HfZrI2N,-3.959924748,0.5296206385000004 -Tm2H8C6O16_2_19680.vasp,Tm2H8C6O16,-5.57043077,0.06936995226562526 -P4O8_2_14091.vasp,P4O8,-5.1771768641666664,0.21638330816666362 -Tl4Ge2Se6_2_19603.vasp,Tl4Ge2Se6,-1.7680082041666667,0.14821189583333338 -Ga2Fe2S5_8_6358.vasp,Ga2Fe2S5,-2.8315646444444442,-0.32793711444444673 -Cr2Ni1S4_164_4430.vasp,Cr2NiS4,-2.80077064,0.07047029999999976 -Ta4Ge2S8_55_18045.vasp,Ta4Ge2S8,-4.852146516428571,0.020174425238092653 -Ag1Sn1S2I1Br1_1_135.vasp,AgSnS2IBr,-1.0381875916666667,0.227333769479165 -Al1Rh2Se3Br2_1_719.vasp,AlRh2Se3Br2,-1.8832664725,0.594270865104164 -Ca1Te2_115_2895.vasp,CaTe2,-1.1286747033333333,0.48545276555555406 -Mn1Zn1Cl2_1_10939.vasp,MnZnCl2,-0.441833185,0.5226811817834052 -Ti2Se10_59_19016.vasp,Ti2Se10,-3.152303665,0.07192767583333337 -Nb3Pt3Se14_6_12996.vasp,Nb3Pt3Se14,-3.0495549275,0.0897255897986049 -Ba2Br4O8_125_1928.vasp,Ba2Br4O8,-2.6076539435714285,0.1873374526190461 -Hf1Co1H6_149_7149.vasp,HfCoH6,-3.38074911625,0.870904194374996 -Zr3H2C2Se2_38_21764.vasp,Zr3H2C2Se2,-4.923089135555555,0.39295553935184024 -Mn3Ge1Se1S1Br1_156_11379.vasp,Mn3GeSeSBr,-2.119773937142857,0.31891281494046836 -Sb4C3_5_15772.vasp,Sb4C3,-3.6217841842857146,1.161536461428566 -Na2P2Pd2_12_12259.vasp,Na2P2Pd2,-1.9895833200000002,0.14784603222222015 -Ni3Ge1Se2_187_13700.vasp,Ni3GeSe2,-1.0723603333333334,0.15858703282051023 -Ta1Sb1As1_156_17610.vasp,TaSbAs,-4.18899909,0.4863884758333291 -Au1Cl2_164_1419.vasp,AuCl2,0.20907608333333336,0.267235335 -Bi10S10_26_2293.vasp,Bi10S10,-2.0064743445,-0.7174780978333342 -K2U2Cl2O6_11_9382.vasp,K2U2Cl2O6,-5.608945272500001,0.052763379166666624 -Mn2Te2S8_31_11303.vasp,Mn2Te2S8,-2.3079491441666664,0.5070657538194429 -Ta2Se4Br4_12_17878.vasp,Ta2Se4Br4,-2.9291050160000003,0.12801889530768928 -Ru2I2_164_15323.vasp,Ru2I2,-1.19737995,0.6060892899999984 -Rb1C12_191_14724.vasp,RbC12,-7.409522054615384,0.035037916923070345 -Si1Br2_187_16322.vasp,SiBr2,-1.5086334499999998,0.2956496983333311 -Ti3B2Cl2_187_19057.vasp,Ti3B2Cl2,-5.387808231428571,-0.08867881750000395 -Tl2S2_164_19506.vasp,Tl2S2,-1.3306839675,0.2651397135937501 -Be1Br2_115_2215.vasp,BeBr2,-1.9909769400000001,0.09725968666666662 -Y3C2Cl2_187_20789.vasp,Y3C2Cl2,-5.235499062857143,0.20229051174105972 -Ta4Pt2Se14_11_18093.vasp,Ta4Pt2Se14,-3.6168012634999998,0.09060646649999415 -Nb2Fe4Te6_11_12724.vasp,Nb2Fe4Te6,-1.9585362491666667,0.6879542251388886 -Ni2Bi2Cl2O4_10_13465.vasp,Ni2Bi2Cl2O4,-2.292837627,0.21578308400000024 -Ca2I4_2_3056.vasp,Ca2I4,-0.8810082083333333,0.39160305633333325 -Sc1Nb1Cl2O1_1_15958.vasp,ScNbCl2O,-4.206146964,0.4707194402142818 -Li2Te2P2O10_11_10086.vasp,Li2Te2P2O10,-4.66078248125,0.1327778949999956 -Li1In1P2Se6_5_9733.vasp,LiInP2Se6,-2.548028456,0.10528803650000018 -Cs2P2H6O6F2_2_4766.vasp,Cs2P2H6O6F2,-4.112601634444444,0.046683309333320766 -Fe2B1O2F2_164_5800.vasp,Fe2BO2F2,-2.29383188,1.9786141626984102 -Ni1H4C2N4F2_47_13336.vasp,NiH4C2N4F2,-4.495732026923077,0.3037834182564022 -Sr2Ag1S2I2_2_17107.vasp,Sr2AgS2I2,-1.5997993257142855,-0.10427486671131159 -Ta2Te8Rh2_11_17928.vasp,Ta2Te8Rh2,-2.8435873283333333,0.09993577208333315 -In1Ni2_187_8288.vasp,InNi2,1.09746681,1.3630982029166658 -Ce1Si2Au4_47_3656.vasp,CeSi2Au4,-1.2258705814285715,0.44301826285714285 -Ge2Sb2C2S6F6_7_6841.vasp,Ge2Sb2C2S6F6,-2.977520504444444,0.6526237136111082 -Ni1Pd2Se2S4I1_1_13403.vasp,NiPd2Se2S4I,-1.495602858,0.27584183168749854 -Cd1Pd3I1Cl3O4_1_3405.vasp,CdPd3ICl3O4,-1.4037464275,0.3493449517245356 -Ge1S2_115_6699.vasp,GeS2,-3.06038515,0.09713288104166651 -Li2Ge1S6F6_147_9925.vasp,Li2GeS6F6,-2.273204748,0.615902410194445 -Ti2Ge4_129_18943.vasp,Ti2Ge4,-4.289454650000001,0.4898871466666659 -Ge2Sb2S6Cl2_7_6852.vasp,Ge2Sb2S6Cl2,-2.3798369508333335,0.33936009010416646 -Ge2O2_129_6792.vasp,Ge2O2,-4.350457335,-0.14373926562499983 -Zn2S2_164_21144.vasp,Zn2S2,-0.970006355,0.2216537395 -Ca1H1I1O1_6_2842.vasp,CaHIO,-3.0736347475,0.2734680637500002 -Mg2Mo2S2O12_4_10482.vasp,Mg2Mo2S2O12,-4.64846429,0.2051695161700302 -Pd4Br1Cl3O4_1_14514.vasp,Pd4BrCl3O4,-1.7279155433333333,0.2170985781249981 -Fe1Mo1Se2S3_1_5720.vasp,FeMoSe2S3,-2.5842845171428572,0.26761854261904255 -Hf4Br4O4_7_7772.vasp,Hf4Br4O4,-5.079260165833333,0.3954868261111084 -Cs2H6Se2N2O6_1_4723.vasp,Cs2H6Se2N2O6,-3.754942105,0.1773608296527741 -Na8Hg4S8_29_12451.vasp,Na8Hg4S8,-1.3131875835,0.17579164425000005 -Ca3Ag2S4I2_123_3147.vasp,Ca3Ag2S4I2,-1.7156190045454545,-0.1857010482386394 -Na2H4C2S6_7_12108.vasp,Na2H4C2S6,-3.239712602142857,0.36350952339285114 -Pd2Se2O6_11_14488.vasp,Pd2Se2O6,-3.148189822,0.07234874800000002 -Cu2W1S4_1_5364.vasp,Cu2WS4,-2.480594774285714,0.2147496252380927 -Ge1H2O2_164_6668.vasp,GeH2O2,-4.086605624,0.17980833091666693 -In2Te2_123_8627.vasp,In2Te2,-0.980175305,0.404833715 -Sr2In1Hg1Au1S5_99_17267.vasp,Sr2InHgAuS5,-1.6763448799999998,0.2797901511874973 -K2H2C2O6_4_9119.vasp,K2H2C2O6,-4.843695524166667,-0.03378490249999988 -Ag2S4Cl2_1_389.vasp,Ag2S4Cl2,-1.2664104475,0.10719141593750003 -Cd1Pd1S2I2_6_3401.vasp,CdPdS2I2,-0.6235349516666667,0.25761676902777775 -Ag2I2_67_318.vasp,Ag2I2,0.4912707925,0.1437974875 -Pb2I4O12_13_14253.vasp,Pb2I4O12,-2.795196577777778,0.08565669777777751 -Ag2Sb2Te6_147_406.vasp,Ag2Sb2Te6,-0.872417242,0.35238629683333167 -Sr1Cu2S8_89_17044.vasp,SrCu2S8,-2.0577038163636363,0.17081742304923797 -In2Cl6_162_8403.vasp,In2Cl6,-1.3957257725,0.04523966749999997 -Na4S4N1_5_12408.vasp,Na4S4N,-2.3462804333333334,0.3741983024999975 -Zn1H16C11N2O6_1_20947.vasp,ZnH16C11N2O6,-5.238428751944444,0.1747395080555476 -Mn1I2_187_10771.vasp,MnI2,-0.39007729,0.33779452833333334 -Sb2Pt2O6_162_15660.vasp,Sb2Pt2O6,-3.3332643859999997,0.5627161749999977 -As1C1_38_1140.vasp,AsC,-3.980156485,1.6835984999999996 -Sm1Sn2_123_16560.vasp,SmSn2,-1.68090444,-0.18174730333333322 -In2Se4_12_8597.vasp,In2Se4,-1.7488215616666667,0.2894443855555535 -C3N4_5_2762.vasp,C3N4,-7.09196711,-0.2524064225000049 -Gd2Br2O2_129_6599.vasp,Gd2Br2O2,-4.799714531666667,0.05956171166666646 -Sb4O4F12_2_15781.vasp,Sb4O4F12,-2.9264868905,0.18672278730356806 -Rh1I2_187_15157.vasp,RhI2,-0.24669154000000001,0.6438971999999991 -Tl6H2S4O18_7_19642.vasp,Tl6H2S4O18,-3.6519804226666666,0.1415934000166592 -Tl1Se1_156_19343.vasp,TlSe,-0.681933235,0.6179464060416666 -Al2Si2Se2_164_986.vasp,Al2Si2Se2,-3.3876590033333334,0.03173684166666657 -Ca2Sn1S1Cl1O2_1_3126.vasp,Ca2SnSClO2,-3.07067465,0.2154730630357088 -Te6N4_7_18659.vasp,Te6N4,-2.754531526,0.4020401770000005 -Cu1Sb1P2Se6_143_4963.vasp,CuSbP2Se6,-2.2325896530000002,0.10205130690624764 -Na2Mo6P4O28_11_12215.vasp,Na2Mo6P4O28,-5.2357724415,0.031993492937499646 -Ca3F6_12_3172.vasp,Ca3F6,-3.7212577644444442,0.12249053222222228 -Li2Fe2F8_26_9907.vasp,Li2Fe2F8,-2.7623429116666665,0.01859723333333374 -Nb1Bi2_164_12475.vasp,NbBi2,-2.70951539,-0.23919127666666862 -Sm2P3Pt6_115_16580.vasp,Sm2P3Pt6,-3.2110808063636367,0.04327947045454561 -Nb12Cl28_53_12457.vasp,Nb12Cl28,-3.216798567,0.08963609724999655 -Hf1Fe1Se2I3Br1_1_7163.vasp,HfFeSe2I3Br,-1.84683533,0.26763872640624997 -Sc2H2O4_1_16085.vasp,Sc2H2O4,-5.38543572625,0.35792785057291665 -Pt2Pb1_164_14647.vasp,Pt2Pb,-0.64548811,1.3106332249999983 -As2I6_31_1223.vasp,As2I6,-0.5169720075,0.16860022124999996 -V2P2O6_162_20138.vasp,V2P2O6,-5.298098443,0.2749828759999948 -Ru1S1Cl2_47_15286.vasp,RuSCl2,-1.9645612525,0.3728150365131555 -Nb2C1O2_164_12662.vasp,Nb2CO2,-7.170172622,0.1219922744166606 -Ge1Se2_187_6710.vasp,GeSe2,-2.1801968933333336,0.4239359838888883 -N1O2_1_11776.vasp,NO2,-4.485344183333333,0.21769915249999983 -Hf1Mn1I1Cl1_6_7214.vasp,HfMnICl,-2.2392976425,0.64395386140625 -Ni2Bi1Se2_187_13462.vasp,Ni2BiSe2,-0.9046275579999999,0.06337224216666609 -Os1F2_115_13799.vasp,OsF2,-2.29950865,0.8130428738333308 -Nb2S4I4_12_12855.vasp,Nb2S4I4,-2.780612106,0.05058386000000015 -In2H14C4_10_8459.vasp,In2H14C4,-3.5742917734999997,0.8243524345000006 -Sb2F6_12_15576.vasp,Sb2F6,-2.60619464625,0.5099387687500001 -Pd1F2_115_14361.vasp,PdF2,-0.66285393,0.7743952883333332 -Fe1I2_115_5715.vasp,FeI2,0.23382147,0.23551629416666667 -Sc1Sb1Cl2O2_1_15991.vasp,ScSbCl2O2,-3.992586465,0.04901038045138373 -Te2Os1_115_18420.vasp,Te2Os,-2.19683473,0.005038938333333132 -Ba2Ag1S2F2_38_1887.vasp,Ba2AgS2F2,-2.440361702857143,0.5067233949999973 -Ta6Si2S12_26_18153.vasp,Ta6Si2S12,-5.177663444,0.12817447344443544 -Cr2Cu1S6_2_4362.vasp,Cr2CuS6,-2.520361266666667,0.36391892212962657 -Hf1As2O6F2_164_7107.vasp,HfAs2O6F2,-4.878747336363636,0.09352162988635881 -Os2S6_11_13878.vasp,Os2S6,-3.41315645875,0.4649028704687499 -Hf2S1I2N1_1_7562.vasp,Hf2SI2N,-4.40976084,0.38422591249999605 -P8S12_2_14153.vasp,P8S12,-3.2342904925,0.15095969890624739 -Mo1W3S8_21_11557.vasp,MoW3S8,-3.963905200833333,0.3194417450000002 -Ca2H3_164_3035.vasp,Ca2H3,-2.11393278,0.3924185264999974 -Ag2Se1S2I2_1_425.vasp,Ag2SeS2I2,-0.6193292357142858,0.25979432601190117 -Ti2Se2Br2_59_19019.vasp,Ti2Se2Br2,-3.8004863866666665,-0.6730018687500023 -Al2Fe1S4_164_826.vasp,Al2FeS4,-3.400690302857143,-0.16354759446428768 -Na1Al1Br4O12_2_11809.vasp,NaAlBr4O12,-2.7454296577777777,0.23838796149304575 -Sb1H1S2O6_1_15453.vasp,SbHS2O6,-4.154597059,0.11010200524999292 -Hg1O2_2_7890.vasp,HgO2,-1.0021212566666666,0.6308302543055543 -Pb2Se2F2_59_14287.vasp,Pb2Se2F2,-1.9586211966666667,0.41885931670138665 -Y4H2N3O2_164_20824.vasp,Y4H2N3O2,-6.484259823636364,-0.8515639261931893 -Co2Sb2S4I2_10_4001.vasp,Co2Sb2S4I2,-1.960558206,-0.26217340258333577 -H4Au4I4O4_14_7060.vasp,H4Au4I4O4,-1.680763436875,0.2504132118541669 -K2Pd1Se2_47_9300.vasp,K2PdSe2,-0.777364654,0.6060988239999999 -Cs2Hg4Se2Cl6O6_31_4736.vasp,Cs2Hg4Se2Cl6O6,-1.408534985,0.13343337566666658 -Nb1I2_187_12523.vasp,NbI2,-1.9098132133333332,0.4524899216666636 -Ga2Br6_26_6315.vasp,Ga2Br6,-1.0746917175,0.07940173250000004 -Te2Pd1_187_18464.vasp,Te2Pd,-1.13601679,0.3530277466666667 -Sr1H2S2_1_17055.vasp,SrH2S2,-3.145542548,-0.011481618499999735 -Gd2I6_59_6619.vasp,Gd2I6,-1.59368277875,0.05355370124999981 -V2Cl8_14_20040.vasp,V2Cl8,-1.817554472,0.03389731400000007 -Os1I2O1_47_13802.vasp,OsI2O,-2.331202845,0.2777594121874998 -Mo2Se4_11_11694.vasp,Mo2Se4,-2.9650916316666667,0.08032159166666686 -Cd1H1I1O1_156_3328.vasp,CdHIO,-1.66510743,0.12860550645833335 -Ba2La2I10_11_2016.vasp,Ba2La2I10,-1.6074873142857142,0.13830991857142716 -Nb4C3Cl2_164_13043.vasp,Nb4C3Cl2,-6.35124594,0.006244742962956629 -In1Si1Te1Cl1_1_8350.vasp,InSiTeCl,-1.670816825,0.26970455562500006 -Ag2Mo1Se4_111_327.vasp,Ag2MoSe4,-1.455525894285714,0.015305074285712816 -Cu4Te8O20_14_5490.vasp,Cu4Te8O20,-3.1426827425,0.2996335531250005 -Ag4Ru4F28_14_539.vasp,Ag4Ru4F28,-1.6485345852777777,0.017344869999999846 -Tc1Br2_164_18217.vasp,TcBr2,-2.5522967333333333,0.41061738333332753 -Zr1Nb1Se1S2I1Br2_1_21358.vasp,ZrNbSeS2IBr2,-3.09536931,0.054189630156238566 -Ag2O4_14_343.vasp,Ag2O4,-1.475969625,0.554486675416665 -Ti3B2S2F2_8_19065.vasp,Ti3B2S2F2,-4.853477735555555,0.3803065905555516 -Hg2Sb2S4Cl2_11_8008.vasp,Hg2Sb2S4Cl2,-1.255858912,0.1951520625000001 -V2H2N1_164_20076.vasp,V2H2N,-4.495933198,0.179268086 -Hg2Se2Br2_59_8015.vasp,Hg2Se2Br2,0.15529099166666668,0.29126011597222085 -Ca3N3_25_3190.vasp,Ca3N3,-2.9333534,1.1404324021874999 -Co2Bi2Se4Cl2_10_3866.vasp,Co2Bi2Se4Cl2,-1.6839324990000002,0.26499137993333105 -Cd1Pb2O2F2_12_3392.vasp,CdPb2O2F2,-2.4256707285714287,0.08483261666666486 -B2Br6_12_1655.vasp,B2Br6,-1.292295135,0.6168327687499999 -Cd2Br2_164_3478.vasp,Cd2Br2,0.815101955,0.1268153043750001 -Ni1C2N4Cl2F4_47_13292.vasp,NiC2N4Cl2F4,-2.976999825384615,0.7323172149358913 -Te6P4_7_18675.vasp,Te6P4,-2.151196986,0.41027286200000035 -Dy1Cu2S2_164_5510.vasp,DyCu2S2,-2.0976736639999998,0.8383568165000006 -Ca2Cu1Se2I2_38_3005.vasp,Ca2CuSe2I2,-1.3858179257142855,0.10561160723809249 -Ir2I8_1_8793.vasp,Ir2I8,-0.42730112699999995,0.17041858437500046 -Te4Au2Cl2_17_18565.vasp,Te4Au2Cl2,-0.48407695875,0.23053001375000004 -Mn1Re2S8_147_10847.vasp,MnRe2S8,-3.58435887,0.5027982732954484 -Nb3C1S1Br2O1_8_12959.vasp,Nb3CSBr2O,-4.9937764625,0.24497006525390708 -Hg2Au2Se2F2_26_7932.vasp,Hg2Au2Se2F2,-0.0093540725,0.31799419 -Si4Se8_14_16516.vasp,Si4Se8,-3.054235605,0.07118951187500011 -As2Se2O1_5_1299.vasp,As2Se2O,-3.021711266,0.2107179346666639 -H4Au1C6N6O2_6_7052.vasp,H4AuC6N6O2,-5.653554582105263,0.33331004972221345 -Hg2Sb2Se6_147_8012.vasp,Hg2Sb2Se6,-1.04316816,0.051138704333331036 -Cd1O1_187_3384.vasp,CdO,-1.08013604,0.47502582333333354 -Li2Mn3F8_164_10001.vasp,Li2Mn3F8,-3.0227112000000003,-0.10502913846154138 -Zn4P6S18_12_21224.vasp,Zn4P6S18,-2.5941832417857142,0.046852086464287235 -Sc2C1Br2_164_16049.vasp,Sc2CBr2,-3.911774834,0.030807432000000023 -Ga2H6N2F6_28_6381.vasp,Ga2H6N2F6,-3.660671455625,0.21241735625000002 -Cd2S2_129_3548.vasp,Cd2S2,-0.4080329625,0.33338074875 -Hg2S2Br2_11_7993.vasp,Hg2S2Br2,-0.039111150000000004,0.2440623478124983 -Al1Cu1Te6As2_149_649.vasp,AlCuTe6As2,-1.558522212,0.04523964616666515 -Ir3Pd1S1I2Cl2O3_1_8853.vasp,Ir3PdSI2Cl2O3,-2.3506569025,0.5662986549305514 -Li2V1C2O6_147_10104.vasp,Li2VC2O6,-5.501627511818182,0.10966746522726822 -Sm2Bi4Se8_26_16565.vasp,Sm2Bi4Se8,-2.497450570714286,0.2138611636309511 -V2Br2_164_20004.vasp,V2Br2,-2.0927431475,0.43927256750000043 -Nb1V3O10_115_12613.vasp,NbV3O10,-5.768052672857143,0.09610009249999951 -Cd2I2O2_1_3517.vasp,Cd2I2O2,-0.5474117883333333,0.36447602769841236 -V2Te2_164_20215.vasp,V2Te2,-2.5230158975,0.2522292053571402 -Ir3Cl1O6_8_8850.vasp,Ir3ClO6,-3.571267897,0.6289674422499951 -Mn1Ag1Br4_1_10609.vasp,MnAgBr4,-0.6504036616666666,0.05648666749999931 -Hg1F2_2_7854.vasp,HgF2,-0.36705930333333336,0.07968425249999994 -Ag2Se1S4_21_426.vasp,Ag2SeS4,-1.0704112399999999,0.524786582499999 -Cd2Cu2Te2Br2_26_3497.vasp,Cd2Cu2Te2Br2,0.09479533375,0.04690327562500002 -Ba1Sn2_164_1860.vasp,BaSn2,-0.5235343633333334,0.7169779866666666 -K4Hg2Br8_11_9459.vasp,K4Hg2Br8,-0.34742939857142857,0.07287930333333241 -K4Se10_4_9511.vasp,K4Se10,-1.5625177692857142,0.3705611335714285 -Cu2S4F2_4_5258.vasp,Cu2S4F2,-1.72861322125,0.08009401643229164 -Co4Ge12_35_4079.vasp,Co4Ge12,-2.748985998125,0.0697248306249999 -Tl2Se3_164_19536.vasp,Tl2Se3,-1.1758523379999999,0.25458370100000005 -Hg4Te2Mo2O12_28_8091.vasp,Hg4Te2Mo2O12,-2.9837461789999997,0.12145275537500089 -Ti1S2_164_18840.vasp,TiS2,-5.038216346666666,0.09109899999999982 -Mn1Os1Se2I3Cl1_1_10834.vasp,MnOsSe2I3Cl,-1.33825435875,0.3688498182812501 -Si1Te1_123_16374.vasp,SiTe,-1.961554365,0.5641335662499998 -Sb4Se6_7_15827.vasp,Sb4Se6,-2.151958767,0.2086610630000001 -Ga2S4_12_6454.vasp,Ga2S4,-2.504138258333333,0.36644044989583074 -Cs2H6C2O8_4_4714.vasp,Cs2H6C2O8,-3.304054812777778,1.3999919406481438 -Cr2S2F2_59_4464.vasp,Cr2S2F2,-3.0928358449999998,0.14801819499999747 -Al2S2I1Br1_6_939.vasp,Al2S2IBr,-2.573113053333333,0.07564509215277515 -Tl1Fe5Cl2_123_19267.vasp,TlFe5Cl2,-0.24095800375,1.542766943749999 -Hf3H2Se2N2_187_7711.vasp,Hf3H2Se2N2,-5.42370628,0.5791151005555495 -Cd2Cl2O2_59_3483.vasp,Cd2Cl2O2,-0.86448269,0.4208918568749974 -Ta3S2N2F2_187_17985.vasp,Ta3S2N2F2,-5.58504644,0.7732989107142729 -Cu2C6Br2N2F8_2_5074.vasp,Cu2C6Br2N2F8,-3.836996207,0.12375727526041061 -U2Se6_59_19727.vasp,U2Se6,-4.4171780275,0.05682337749999977 -Nb2Sb1I2O1_1_12857.vasp,Nb2SbI2O,-3.567643275,0.2504580224074042 -Sn1Br2_164_16619.vasp,SnBr2,-1.0955632233333332,0.07142836166666688 -Ta2Te10Pt2_6_17893.vasp,Ta2Te10Pt2,-2.220942665714286,0.38019842428571415 -Be2N1_164_2260.vasp,Be2N,-4.7240413666666665,0.5942851256249962 -Ta4B3S2_164_18008.vasp,Ta4B3S2,-6.819130757777778,0.24994607666666058 -Nb4Se12_11_13149.vasp,Nb4Se12,-3.67296391,0.06543487499999978 -Nb4Se12Br2_2_13146.vasp,Nb4Se12Br2,-3.2503934316666667,0.12284670101851536 -Na2C2N2O2_31_11997.vasp,Na2C2N2O2,-5.56764827375,-0.05671023572917233 -Ga2Se2_12_6479.vasp,Ga2Se2,-2.2635217275,0.15393577999999986 -K2Hg4Cl6O8_31_9173.vasp,K2Hg4Cl6O8,-1.1633947340000002,0.24170302824999737 -K2Hg4Se2S6Cl6_31_9191.vasp,K2Hg4Se2S6Cl6,-0.7863968915,0.2553948748124987 -Cr2Cd2O6_12_4348.vasp,Cr2Cd2O6,-3.393318108,0.15783914544443803 -Nb2Br8_1_12659.vasp,Nb2Br8,-1.943517318,0.19808869699999976 -Au2Se1S1Br2_1_1537.vasp,Au2SeSBr2,-0.3836374066666666,0.1919518916319437 -Ir2N2Cl2_59_8794.vasp,Ir2N2Cl2,-3.4179947416666665,0.3331029119444413 -Cd2Bi2S4F2_11_3473.vasp,Cd2Bi2S4F2,-1.564751599,0.015036081999997453 -Ga2Co2S5_164_6333.vasp,Ga2Co2S5,-2.7577847855555557,0.08305173268518251 -Bi2Sb2S6_7_2528.vasp,Bi2Sb2S6,-2.422966678,-0.29425916949999964 -La2I2_164_9597.vasp,La2I2,-1.939339485,0.29417359749999994 -As2Rh2Se6_162_1285.vasp,As2Rh2Se6,-2.487000244,0.2724582650526294 -In1F2_187_8244.vasp,InF2,-2.1322429066666664,0.3788591800000001 -V2Br2O3_12_20002.vasp,V2Br2O3,-4.0547238185714285,0.09461293392856707 -Cu2F6_12_5097.vasp,Cu2F6,-1.0189332775,-0.2104365225 -V1Se2_164_19931.vasp,VSe2,-3.09614528,0.05045843833333308 -Ge2S1Br1_1_6820.vasp,Ge2SBr,-2.4241005525,-0.41011514250000003 -Mo1Au2O4_111_11490.vasp,MoAu2O4,-2.6169191942857144,0.8720982442857101 -Hg2Sb2F14_2_8003.vasp,Hg2Sb2F14,-1.7955219705555558,0.047674738749998946 -Cr2Cu2Sb4Te12_13_4374.vasp,Cr2Cu2Sb4Te12,-1.3439415215000001,0.2692212855833317 -Li2W1_187_10138.vasp,Li2W,-2.529755546666667,0.8111386611111082 -Li1Al1As2S6_5_9637.vasp,LiAlAs2S6,-3.030101973,0.47426184493749757 -Cr2H2S2N1_164_4400.vasp,Cr2H2S2N,-3.739992717142857,0.2956992523610982 -Cu2H8C12N10_2_5138.vasp,Cu2H8C12N10,-5.86787805625,-1.3701794476562539 -Hf1I1F1_156_7196.vasp,HfIF,-3.26482098,0.6507683320833234 -Mn1Ag1Br4Cl2_1_10608.vasp,MnAgBr4Cl2,-0.55272584875,0.11197744208333232 -Hg1I2_187_7881.vasp,HgI2,1.0305119666666667,0.1576317094444445 -W2O4F4_26_20521.vasp,W2O4F4,-4.837184209,-0.053666037000000166 -Sc2Br6_59_16048.vasp,Sc2Br6,-2.18755560125,0.14065768249999966 -V2S2_187_20163.vasp,V2S2,-3.5240887075,0.1313238209374954 -Sb2P2O8_26_15623.vasp,Sb2P2O8,-4.985066045833333,0.3183068508333333 -Te4Mo3_12_18596.vasp,Te4Mo3,-2.06943229,0.4244570228571427 -B2N1_164_1683.vasp,B2N,-4.6899606,2.5656183277777713 -Sr3Fe2S2O5_123_17377.vasp,Sr3Fe2S2O5,-3.5845404733333335,0.37316010083332746 -Tl4N20_26_19609.vasp,Tl4N20,-4.746139295833333,-0.1700667637500014 -Ca1Si3Ir1_99_2882.vasp,CaSi3Ir,-3.02328811,0.8784745919999999 -Li1Ga1P2S6_5_9711.vasp,LiGaP2S6,-3.211532867,0.0129790900481708 -Ti1Bi2O6_99_18744.vasp,TiBi2O6,-4.271345301111111,0.7306652188194357 -K1In1Cl4O12_2_8910.vasp,KInCl4O12,-2.5199916594444445,0.21217429277777544 -Hf1Sc1I2N1O1_6_7297.vasp,HfScI2NO,-4.944914428333333,0.08833367916666113 -Zr3Sc1Br4O4_8_21782.vasp,Zr3ScBr4O4,-4.693300281666667,0.18077875958333323 -Li2S4Cl2_113_10057.vasp,Li2S4Cl2,-1.7758692,0.9029947721875 -Y2Cu6O12_1_20726.vasp,Y2Cu6O12,-3.2226295790000004,0.5100768922499948 -Na4S12_13_12406.vasp,Na4S12,-2.376410739375,0.14127426828125023 -V1B4H4Cl1O6_1_19772.vasp,VB4H4ClO6,-4.91442817125,0.7563060944444354 -Sn2I2_129_16784.vasp,Sn2I2,-0.502723345,-0.6179016479166667 -Nb2O2_129_12792.vasp,Nb2O2,-5.655722175,0.8637711183333332 -P2Se5_8_14054.vasp,P2Se5,-2.4355664785714284,0.3072488983928551 -P2Ru2Se6_162_14044.vasp,P2Ru2Se6,-2.912679516,0.38539115044444106 -K2B2H6Se2S6_1_8992.vasp,K2B2H6Se2S6,-2.9212525777777776,0.28032831949073583 -Pd2S8_11_14479.vasp,Pd2S8,-2.2483984670000003,0.18944277525000008 -Hf1Ta1S1I2_8_7314.vasp,HfTaSI2,-3.6446266659999997,0.38670993175000046 -H2Pd1_115_7012.vasp,H2Pd,-2.06731273,1.4581362683333303 -Au2S3Cl1_1_1520.vasp,Au2S3Cl,-0.8884605633333332,0.29494628708333237 -Sb1Se1S1_1_15501.vasp,SbSeS,-2.33358782,0.19306875211805052 -Sc4Te6_1_16265.vasp,Sc4Te6,-2.787430908,0.2922461909999998 -Cr2O6_11_4443.vasp,Cr2O6,-4.50407573,-0.05128789015625035 -V4O8F4_14_20349.vasp,V4O8F4,-4.788766954375,-0.30046836093750384 -Ba10Co2_26_1797.vasp,Ba10Co2,0.37232556333333333,0.977792428333332 -Nb4Co2O10_59_13052.vasp,Nb4Co2O10,-5.8717096725,0.3426759164062503 -Os1Cl2_115_13796.vasp,OsCl2,-1.6579212033333333,0.6747277924999957 -Li2Mn2F6_162_9994.vasp,Li2Mn2F6,-3.148371564,-0.19818822199999975 -Sb1Br2_187_15441.vasp,SbBr2,-0.8937236133333334,0.33675150249999886 -Al4Bi4_127_1061.vasp,Al4Bi4,-1.02957625875,0.41584817125 -Li6Si1_191_10277.vasp,Li6Si,-1.8830639814285715,0.21825013171428354 -Cd2Cu4O6_59_3501.vasp,Cd2Cu4O6,-1.5455208941666667,0.621392059027776 -Ti4S4F4_31_19159.vasp,Ti4S4F4,-4.8169890075,-0.2295913683333377 -Re1Ag2F6_2_14988.vasp,ReAg2F6,-1.9721916877777776,0.20667693833333178 -Ti2Br2_129_18901.vasp,Ti2Br2,-3.57794745,0.6088523075000003 -Cd2As2N2O10_31_3453.vasp,Cd2As2N2O10,-3.7105766075,0.22188815143749324 -Ge1Pb2S1I2_6_6691.vasp,GePb2SI2,-1.40592048,-0.4591271777777794 -V1Bi1As1_156_19779.vasp,VBiAs,-2.51935052,0.20747235055554888 -Na2Cd4Te2Cl6O6_31_12044.vasp,Na2Cd4Te2Cl6O6,-1.7542767405,0.2522976432916663 -In2Ni1O4_164_8489.vasp,In2NiO4,-3.0364659442857147,0.3700179916071401 -Sc3C2S2F2_187_16201.vasp,Sc3C2S2F2,-4.050087850000001,1.0789129401058073 -Zn2Ga2S5_156_21082.vasp,Zn2Ga2S5,-2.022138951111111,0.1950019632222202 -As2P2O8_11_1239.vasp,As2P2O8,-5.119953838333333,0.07597446541666297 -Te2Pb2F2_59_18452.vasp,Te2Pb2F2,-1.7033494266666667,0.38703717527777615 -Na4P2H10C6O14_4_12400.vasp,Na4P2H10C6O14,-5.0305553863888886,0.1276295712152654 -Cu2B2I2O2_31_5027.vasp,Cu2B2I2O2,-2.41595287875,0.9294626415755136 -V3H2C2Se2_6_20264.vasp,V3H2C2Se2,-4.2672644433333335,0.4077244790476091 -Cu1Ge1O3_25_4882.vasp,CuGeO3,-3.616618098,0.3032766317499973 -As4S8_31_1366.vasp,As4S8,-2.703463354166667,0.6657632194791634 -K2Ru2S2N2Cl10_2_9324.vasp,K2Ru2S2N2Cl10,-2.089418575,0.11082450916666091 -Gd2C1F2_164_6605.vasp,Gd2CF2,-4.811227532,0.14144050799999963 -Te1Mo2W2Se1S1Cl1_6_18311.vasp,TeMo2W2SeSCl,-3.4603839425,0.3977920311458334 -Cu2Te2_129_5333.vasp,Cu2Te2,-0.4343923325,0.13308820249999997 -Ta4N3Cl2_1_18059.vasp,Ta4N3Cl2,-6.468941526666667,0.6120712922222087 -Tc3Cl8_1_18240.vasp,Tc3Cl8,-2.79987539,0.27739754893938984 -Tb1N2_21_18174.vasp,TbN2,-5.606851933333334,0.20908589416666112 -Al4O6_31_1079.vasp,Al4O6,-5.9839084,0.13962643799999963 -Tb1Pb2_123_18176.vasp,TbPb2,-1.2414500733333333,-0.2186109283333333 -Al1Sb2Au1S6_149_729.vasp,AlSb2AuS6,-2.3007439990000003,0.3474863219374975 -Zn4Si2O8_11_21226.vasp,Zn4Si2O8,-3.814336535,0.23772864952380957 -Cu2Te2_187_5334.vasp,Cu2Te2,-0.245162955,0.32231758 -Ti1Bi1Sb1_156_18742.vasp,TiBiSb,-3.1978384666666666,0.1486244666666634 -Fe2F2_164_5846.vasp,Fe2F2,-1.92994595,0.6533603674999998 -Ti1Zn1Se2_1_18874.vasp,TiZnSe2,-2.44369713,-0.15881337770032405 -Hg2H2Cl2O8_28_7963.vasp,Hg2H2Cl2O8,-2.2459877664285712,0.20228835559523506 -Ta1I2_164_17557.vasp,TaI2,-2.1537252700000002,0.6483665721428509 -Ag2Te3P4I2_6_474.vasp,Ag2Te3P4I2,-1.510792221818182,0.2627939590909057 -Sb2Cl2O2_59_15565.vasp,Sb2Cl2O2,-2.866766605,0.2645400172222221 -Cu1I2O2_1_4908.vasp,CuI2O2,-1.1592219460000002,0.1753646916 -Li6O3_157_10269.vasp,Li6O3,-3.814844145555556,-0.11655435555555593 -Ge1S2_187_6701.vasp,GeS2,-2.6801086400000003,0.47740939104166635 -Na4S2O10_51_12407.vasp,Na4S2O10,-3.030536244375,1.0811892239062502 -Sb3Pt1Se1S2Br4O1_1_15757.vasp,Sb3PtSeS2Br4O,-1.9718702225,-0.02388398037500672 -P4Pt4S4_13_14105.vasp,P4Pt4S4,-3.30056074,0.16135481416666653 -Fe2Se2Cl2_59_5972.vasp,Fe2Se2Cl2,-1.5305311583333332,0.4555368491666668 -Tl1Cu1P2Se6_149_19254.vasp,TlCuP2Se6,-1.987272404,0.20939301110416458 -Ta4Se6_11_18112.vasp,Ta4Se6,-4.833064725,0.11634099199999959 -Sr4Mn2Bi4O12_53_17443.vasp,Sr4Mn2Bi4O12,-4.033042655,0.005065360289961851 -Bi1O2_164_2352.vasp,BiO2,-3.395235683333333,0.37231516260416386 -Mn2Nb2Te6_11_11164.vasp,Mn2Nb2Te6,-2.667078725,0.10476856794252676 -K4Na4H48C4O36_7_9480.vasp,K4Na4H48C4O36,-4.361132520833333,0.04367741381076384 -Co2C2O7_1_3884.vasp,Co2C2O7,-4.860571201818182,0.14397170374999751 -Cd1B4C2I2F4_10_3274.vasp,CdB4C2I2F4,-3.4341819253846158,0.5098937225213594 -Zr1Sb2H2O6_164_21423.vasp,ZrSb2H2O6,-4.543979742727273,0.5246614757575658 -In1Ag1As2O6_149_8176.vasp,InAgAs2O6,-3.476463527,0.360155893333329 -Bi2Se2I2_11_2542.vasp,Bi2Se2I2,-1.1792586616666667,0.21042373999999997 -Mn2Bi2Se4I2_26_11019.vasp,Mn2Bi2Se4I2,-1.542203093,0.14299868942856886 -Sm2I2O2_129_16575.vasp,Sm2I2O2,-4.488067543333334,0.05356446166666551 -K2Cl2F8_127_9076.vasp,K2Cl2F8,-1.1222031391666667,0.1332526291666667 -Nb1Tl1Br4O1_3_12607.vasp,NbTlBr4O,-2.5729529057142857,0.05302095714285748 -Cd1B4H4N2Cl2_1_3276.vasp,CdB4H4N2Cl2,-3.9552920530769233,0.5411816619999981 -Te2Rh2Br2_59_18497.vasp,Te2Rh2Br2,-1.56925921,0.12148452499999984 -Mn1Si1Se1O1_1_10885.vasp,MnSiSeO,-3.4512711975,0.7379187503124998 -Mn3Cu1O8_12_11375.vasp,Mn3CuO8,-3.8029769708333334,0.2375253914583304 -Li1Ti2Se4_164_9802.vasp,LiTi2Se4,-4.249310385714286,0.013515559999996096 -Os2F6_162_13848.vasp,Os2F6,-2.7409631025,0.024601373062497767 -Ta1Bi1Te2_25_17513.vasp,TaBiTe2,-2.566452365,0.5892643322499991 -Ge4Pb4S12_14_6939.vasp,Ge4Pb4S12,-2.7881907055,0.07124261500000006 -Al2S2F2_59_938.vasp,Al2S2F2,-3.6559402433333332,0.19685821874999654 -In1Cu1Sb2S6_149_8235.vasp,InCuSb2S6,-2.113787244,0.33668590843749757 -Zn2P2S6_162_21131.vasp,Zn2P2S6,-2.392987535,0.05390745573749345 -Na2Ru2S2N2Cl10_1_12282.vasp,Na2Ru2S2N2Cl10,-2.18088449,0.20360713847222023 -Ta2Mn2S6_11_17771.vasp,Ta2Mn2S6,-4.3477644490000005,0.14537473566666237 -Te2Au2_187_18371.vasp,Te2Au2,-0.039730175,0.38890647250000004 -Ca3C1_99_3158.vasp,Ca3C,-0.83391403,1.6555453318749955 -Ca3Cl2O6_157_3159.vasp,Ca3Cl2O6,-2.861408059090909,0.6435730515909034 -Al2Te2_164_1010.vasp,Al2Te2,-2.21650882,0.08924336749999995 -Ti1V1Se1Cl1_8_18866.vasp,TiVSeCl,-3.558713215,0.21645227672618317 -Tl4Hg6S8_1_19607.vasp,Tl4Hg6S8,-0.4372391855555555,0.15912542444444444 -Ta4Fe4Se8_53_18041.vasp,Ta4Fe4Se8,-3.353537348125,0.7127393231249997 -V3C2S2F2_187_20251.vasp,V3C2S2F2,-4.1322208244444445,0.20609851986624506 -Nb2Zn1Mo1H3O8_1_12942.vasp,Nb2ZnMoH3O8,-5.058745283333334,0.32532929166666225 -Cr2Mo2O10_85_4418.vasp,Cr2Mo2O10,-5.014752179285714,-0.03767210752976588 -Nb6Te18_11_13203.vasp,Nb6Te18,-2.8435429295833337,0.07263878177083005 -Nb1S2_123_12561.vasp,NbS2,-4.609329413333334,0.34805599166666656 -Ag2S5_21_396.vasp,Ag2S5,-1.2190011914285714,0.4562231310714273 -Sn8Rh2_125_17008.vasp,Sn8Rh2,-1.489596736,0.545142343 -Ag2Mo1S4_111_326.vasp,Ag2MoS4,-1.940337207142857,0.21019448562499565 -Li2N4O2_31_10007.vasp,Li2N4O2,-4.93128194875,-0.15865651012500281 -Th4I16_14_18734.vasp,Th4I16,-1.83815436,0.050841621000000004 -Cu1Mo1Br2O2_6_4916.vasp,CuMoBr2O2,-2.5666563449999997,0.14501847009259294 -K2Hf2Cu2S6_51_9169.vasp,K2Hf2Cu2S6,-3.21304125,0.20381591666666665 -Cr2Mo2S8_25_4420.vasp,Cr2Mo2S8,-3.5503244633333337,0.06454144916666626 -Sb4Te2S12_18_15829.vasp,Sb4Te2S12,-2.215759516666667,0.3892855671990714 -K2C2O6_7_9017.vasp,K2C2O6,-4.715211726,0.14840237500000075 -Hf2I2N1O1_6_7513.vasp,Hf2I2NO,-5.237894385,0.19139093208333002 -Ni2Bi2Te4I2_10_13472.vasp,Ni2Bi2Te4I2,-0.573546482,0.3470567119999996 -Ti4I4O4_7_19141.vasp,Ti4I4O4,-4.719585155833333,0.27722457916666254 -Cu1S1I1Br1_1_4954.vasp,CuSIBr,-0.4755340825,0.18976533809895862 -Zn1B2C8N8_164_20898.vasp,ZnB2C8N8,-6.5656492036842105,0.4756052937719165 -Pa6Cl12O6_26_14168.vasp,Pa6Cl12O6,-5.1053589399999995,0.07887704968750064 -Sr2Au1Cl2O2_38_17124.vasp,Sr2AuCl2O2,-2.5698794,0.2618945620408111 -Ni2Br2N2_59_13478.vasp,Ni2Br2N2,-1.761103005,0.2910303258333309 -Mn1O2_115_10831.vasp,MnO2,-4.22014973,0.24465999833333285 -Os1Cl2O1_47_13795.vasp,OsCl2O,-3.0007866825,0.12311254500000013 -Hg2Se2S8F4_7_8020.vasp,Hg2Se2S8F4,-1.470784335625,0.31939291812499926 -Sc2S2Br2_59_16131.vasp,Sc2S2Br2,-3.5526085050000002,0.036046523333332914 -Br12N4_14_2704.vasp,Br12N4,-0.937351799375,0.4412370387500001 -Ca2B2S6Cl2_59_2944.vasp,Ca2B2S6Cl2,-3.1256241216666667,0.22608071130208038 -W3S4_12_20572.vasp,W3S4,-4.352596251428571,0.48356075857142256 -Ti1Ni3Te2_8_18818.vasp,TiNi3Te2,-1.4210720866666666,0.1643206014999963 -Zr2As2O6_12_21503.vasp,Zr2As2O6,-5.683096805,0.3358548423333305 -Ni4As4S4_13_13740.vasp,Ni4As4S4,-1.9663091641666668,0.32764609499999997 -Ag1H2O2_164_69.vasp,AgH2O2,-2.93797263,0.19259511816666697 -Tm1I2_164_19665.vasp,TmI2,-1.5123969233333332,0.13366996944444312 -Li6V2O4F4_13_10282.vasp,Li6V2O4F4,-4.29392525125,-0.04698769343750389 -Cr1Te2_187_4278.vasp,CrTe2,-1.8796384733333333,0.06340766555555577 -Li2H6C10O2_51_9943.vasp,Li2H6C10O2,-4.8740573035,1.1772791454999882 -Sn4S4O16_2_16957.vasp,Sn4S4O16,-4.2170228779166665,0.05479950934895532 -Mn2C1O2_164_11039.vasp,Mn2CO2,-4.483245248,0.3066284451417579 -Ba4Te2O2_129_2190.vasp,Ba4Te2O2,-3.20052883625,0.08454621179687494 -Li2Ti2I2N2_59_10094.vasp,Li2Ti2I2N2,-4.72853832375,0.12777054250000042 -Ta1Ti1Co1Se2S1I1Br1_8_17634.vasp,TaTiCoSe2SIBr,-3.32128326125,0.009082493906242384 -Ag4Hg4S4I4_51_526.vasp,Ag4Hg4S4I4,0.151253773125,0.106652840625 -Ca1Ag2O8_89_2797.vasp,CaAg2O8,-2.6889206418181817,0.1843644746212061 -Tl1F2_164_19263.vasp,TlF2,-1.5642054099999998,0.222920446666667 -Fe2Te2Br14_1_5993.vasp,Fe2Te2Br14,-0.46190092277777783,0.05899469722222217 -Co2Sb1Se2_187_3993.vasp,Co2SbSe2,-2.1087988859999998,0.26285472493333106 -Sn2S1I1Br1_1_16833.vasp,Sn2SIBr,-1.4550452200000001,0.09525537133333206 -Re2O2_129_15063.vasp,Re2O2,-5.1523003,1.4580599493750002 -Mn1Sn1S1I1Br1_1_10895.vasp,MnSnSIBr,-1.405162832,0.3798840894761895 -Cd2Te2Cl2_59_3589.vasp,Cd2Te2Cl2,-0.05546671833333333,0.11890283277777705 -Ag2Te2_51_464.vasp,Ag2Te2,-0.050549005,0.30708343791666665 -V3H5O8_8_20272.vasp,V3H5O8,-4.946386801875,0.054949872291667035 -U2N2Cl2_129_19717.vasp,U2N2Cl2,-6.713388258333333,0.14941858000000074 -Sr2Ag1S2Br2_38_17103.vasp,Sr2AgS2Br2,-1.8349549799999998,0.08513927281249611 -V2S1Br2N1_8_20150.vasp,V2SBr2N,-3.3967821033333334,0.210773514388882 -Sb1F2_115_15450.vasp,SbF2,-2.0535440333333335,0.9700820102777752 -Nb1Pd2Se1S2I1Br3_1_12556.vasp,NbPd2SeS2IBr3,-1.8000133980000002,0.08098371759999712 -Cr2H8_129_4405.vasp,Cr2H8,-3.085171258,1.8156330640000005 -Ta1Nb1S2I1Br1_6_17574.vasp,TaNbS2IBr,-3.7816482516666667,0.3061194829298582 -Mn2P2S4Br2_10_11188.vasp,Mn2P2S4Br2,-2.615212086,0.20053863684721884 -Mn4Zn2O10_59_11457.vasp,Mn4Zn2O10,-3.532988513125,0.4007552096875 -Ni2Sb2O6_162_13607.vasp,Ni2Sb2O6,-3.3561940559999996,0.024991602249998746 -W1Au2S4_1_20413.vasp,WAu2S4,-2.2586298957142854,0.2363629914285692 -Cr1Mo1Br1Cl1O2_8_4208.vasp,CrMoBrClO2,-3.2504613,0.370172378055552 -Ni2As4Cl4O6_2_13454.vasp,Ni2As4Cl4O6,-3.003898101875,-0.08456387187500009 -Fe1Te2_187_5767.vasp,FeTe2,-0.9217214666666668,0.7065304483333331 -Ag2C2I2O2_31_214.vasp,Ag2C2I2O2,-2.8166169025,0.34697295375000015 -Bi2Te4Pb4Au2S6_59_2575.vasp,Bi2Te4Pb4Au2S6,-1.6980019605555556,-0.4171036786805593 -Si2N2Cl2_59_16410.vasp,Si2N2Cl2,-4.6646817233333335,-0.35370384666667 -Ta4O10_11_18079.vasp,Ta4O10,-7.251788325714286,-0.006203929999999858 -Ta2Co4Te6_11_17713.vasp,Ta2Co4Te6,-2.620558201666667,0.20726017920138862 -Mn1Ni1F6_12_10826.vasp,MnNiF6,-2.064065795,-0.10345292999999978 -Li4S4N1_5_10220.vasp,Li4S4N,-3.116560411111111,0.05779465569444153 -Al1Tl1Cd1Te4_156_754.vasp,AlTlCdTe4,-0.9231892642857142,0.17065102952380806 -Ca2Pb4F12_2_3099.vasp,Ca2Pb4F12,-2.9386897616666667,0.13299661277777464 -Pd2Pb4Se4Cl4O12_14_14450.vasp,Pd2Pb4Se4Cl4O12,-2.9616683907692307,0.09926940499999715 -Tl1Cd1In1Se4_156_19238.vasp,TlCdInSe4,-1.2131608285714286,-0.01164786452381178 -Sb1_123_15527.vasp,Sb,-1.47548431,0.8080827625 -Os2O2_187_13859.vasp,Os2O2,-4.754565135,0.8446303474999999 -Cr2Cu2As4Se12_13_4365.vasp,Cr2Cu2As4Se12,-2.0961760099999998,0.20926799709999808 -Cd1O2F2_1_3385.vasp,CdO2F2,-1.206691266,0.8255534605000002 -Zr1Mn1Br4N1O1_1_21317.vasp,ZrMnBr4NO,-3.163576895,0.051469319687492465 -Na1Mo2Br6O2_47_11899.vasp,NaMo2Br6O2,-2.2898995536363635,0.047143487272727214 -Zr2Te2F2_59_21703.vasp,Zr2Te2F2,-3.684693396666667,0.1215284999999926 -As4Br12_14_1323.vasp,As4Br12,-1.11523808125,0.054160641249999975 -Co2W2S8Cl2_129_4057.vasp,Co2W2S8Cl2,-2.708789257142857,0.6434509146874937 -Ga2S4_2_6452.vasp,Ga2S4,-2.4673670716666667,0.4032116365624972 -Be10Ir2_26_2209.vasp,Be10Ir2,-3.13200004,0.47750927666666687 -V2Re4O18_31_20148.vasp,V2Re4O18,-5.649763845416667,0.08198199249999938 -Ta2I2N1_2_17754.vasp,Ta2I2N,-4.638233658,0.506462989952367 -Ag2Sb2Te4_26_405.vasp,Ag2Sb2Te4,-0.88719031875,0.25086766562499996 -Sn6P4O18_31_16996.vasp,Sn6P4O18,-4.734991574642857,0.18295237226190042 -K2Cd4S8I6_31_9057.vasp,K2Cd4S8I6,-0.7152784915,0.0678947857291673 -Sn1S1_123_16676.vasp,SnS,-1.871715725,0.5921144962499998 -Pb2S1Cl2O1_1_14268.vasp,Pb2SCl2O,-2.1080944516666666,-0.0606050695833332 -Sb4S4_14_15816.vasp,Sb4S4,-2.45427332,0.26298212541666444 -Li2Sb2O4_13_10061.vasp,Li2Sb2O4,-4.20199457125,0.20364644781249996 -Te2C2_59_18381.vasp,Te2C2,-3.13699023,1.7070653533333333 -Tm2S6_51_19684.vasp,Tm2S6,-3.348509625,0.4755661211718749 -Cu3Se1S3I3_1_5386.vasp,Cu3SeS3I3,-0.7284809379999999,0.1782669154702371 -Na1Au1I4O12_1_11823.vasp,NaAuI4O12,-2.442466597777778,0.13884403972222215 -Fe1Br2N2_10_5636.vasp,FeBr2N2,-1.809860976,0.9167051660000005 -Y1As2_21_20603.vasp,YAs2,-3.5236407033333332,0.6647799433333295 -Ga1Ir2Rh1S4Br4_1_6208.vasp,GaIr2RhS4Br4,-2.315443015,0.07481351499999461 -Ag8Te8_11_585.vasp,Ag8Te8,-0.1481394725,0.20949297041666665 -Li2Cr1P2O8_2_9869.vasp,Li2CrP2O8,-4.894156686923077,0.36906856039422664 -V2S2Br2_59_20152.vasp,V2S2Br2,-2.8128991649999997,0.15665654444444188 -Sr4Te8As4F4_14_17482.vasp,Sr4Te8As4F4,-2.4983547130000003,0.05593307450000007 -Ta1S2_10_17606.vasp,TaS2,-4.6713700566666665,0.7493625316666668 -Y2Cl2_164_20719.vasp,Y2Cl2,-3.57564245,0.18002145749999576 -V3C2O2_187_20250.vasp,V3C2O2,-5.868818500000001,0.08154812361110464 -Mn2I1N1Cl1O1_1_11108.vasp,Mn2INClO,-2.9233074899999996,0.1765835419791627 -Zr1Ni1H6_6_21376.vasp,ZrNiH6,-2.940519015,0.8214544750000001 -Si4P4S4_17_16502.vasp,Si4P4S4,-3.994274885,-0.6184709629166665 -Hf1Br2_115_7129.vasp,HfBr2,-2.5773693566666664,0.5846307288888861 -Fe1C2_123_5644.vasp,FeC2,-3.786603566666667,2.350903126666661 -As4P2H2O12_4_1343.vasp,As4P2H2O12,-4.8125012125,0.07504164858332896 -Sb2As2S8_11_15535.vasp,Sb2As2S8,-2.5417650675,0.5293357526041609 -Mn2V1Br2N1_1_11332.vasp,Mn2VBr2N,-2.7266119483333333,0.3240083425431004 -Ga1Cl2_187_6150.vasp,GaCl2,-1.2596594,0.4637110716666666 -Hf2Ge2Te2_129_7499.vasp,Hf2Ge2Te2,-4.106081176666667,0.08682650833333305 -Ge2Se2I2_59_6869.vasp,Ge2Se2I2,-1.7560127816666666,0.1554662852777775 -Si4B2N2_65_16486.vasp,Si4B2N2,-5.15324257,0.24326982625000038 -Sm1Pb2_123_16557.vasp,SmPb2,-1.27516284,0.0545002766666669 -Cu6O2F10_2_5496.vasp,Cu6O2F10,-1.2790691172222222,0.2630820601388872 -Fe3S2O14_164_6062.vasp,Fe3S2O14,-3.617451238421053,0.35677029067982025 -Ag8C4N8_14_584.vasp,Ag8C4N8,-3.6362086755,0.004070582333326689 -Rb2Cd4Se2S6Cl6_31_14820.vasp,Rb2Cd4Se2S6Cl6,-1.0184687085,0.11665451545833272 -Co2Se1S1Br1Cl1_1_4017.vasp,Co2SeSBrCl,-1.6398673316666665,0.37656006740740333 -Mn2P2S4Cl2_10_11191.vasp,Mn2P2S4Cl2,-2.758984304,0.21070697059721866 -Tl2Ga2F8_10_19421.vasp,Tl2Ga2F8,-2.476611445,0.2219888683333333 -Ge1Au1F6_2_6638.vasp,GeAuF6,-1.89841815,0.11929942277777661 -B13P2_164_1608.vasp,B13P2,-5.064333468666666,1.1041542212222168 -Ta4Zn4Fe2O16_1_18141.vasp,Ta4Zn4Fe2O16,-5.194243741923076,0.034884865256402886 -Dy2S2I2_59_5532.vasp,Dy2S2I2,-3.239929983333333,0.04738415666666684 -Cr2Ge2Te6_162_4389.vasp,Cr2Ge2Te6,-1.835757431,-0.38309411800000004 -Sn2P1Se6_162_16803.vasp,Sn2PSe6,-2.1596228211111113,0.15133816777777742 -Li1Fe1Pd1S3I2_8_9697.vasp,LiFePdS3I2,-1.55587737875,0.1184205359374999 -Cr1W3Se8_25_4288.vasp,CrW3Se8,-3.528496435833333,-0.2932797545833328 -Li4Mn2F12_4_10200.vasp,Li4Mn2F12,-3.019331826666667,0.06922162777777752 -Hf1Ge1Se1S1I2_6_7181.vasp,HfGeSeSI2,-2.936376585,0.1990261861111059 -Nb2W2S11_5_12941.vasp,Nb2W2S11,-4.008919530666667,0.32611603662499666 -Fe2As1Se2_187_5772.vasp,Fe2AsSe2,-1.801153618,0.24210943450000022 -Ta4Pd6Se10_59_18091.vasp,Ta4Pd6Se10,-3.2544052155000003,-0.24017646350000277 -Sr3Cu2S4Cl2_123_17370.vasp,Sr3Cu2S4Cl2,-2.165663970909091,0.07052823242423845 -K4Hg6S8_13_9464.vasp,K4Hg6S8,-0.5047532416666667,0.13564687749999943 -Nb2S3Br3_8_12849.vasp,Nb2S3Br3,-3.16030756125,0.3644543319843735 -Hg2Cl2_164_7955.vasp,Hg2Cl2,0.86931049,0.30769890750000006 -Bi1Sb2Au1Se6_143_2384.vasp,BiSb2AuSe6,-1.632242674,0.3245490076666644 -Cr1Ag1Sb2S6_149_4104.vasp,CrAgSb2S6,-2.3357750889999997,0.3096784869687479 -Bi1Se1I1_156_2389.vasp,BiSeI,-1.2013807366666667,0.188301665 -Mg4Bi2_59_10573.vasp,Mg4Bi2,-0.21787769833333334,0.4381882786111112 -Sr3Au2S4I2_123_17354.vasp,Sr3Au2S4I2,-1.79864647,0.006323886060602746 -Ga2Fe2S5_164_6359.vasp,Ga2Fe2S5,-2.8031095377777775,-0.29948200777778 -Sb2N18_2_15608.vasp,Sb2N18,-5.8541729455,-0.6454406779999996 -Cu4Se1Br2Cl4_1_5465.vasp,Cu4SeBr2Cl4,-0.37244768909090903,0.17456891999999863 -Ta1S1Br1_156_17601.vasp,TaSBr,-4.0651248,0.30309685595237734 -B2Au2Cl2O2_31_1651.vasp,B2Au2Cl2O2,-2.48434414,1.5936884905555506 -C1I4_123_2732.vasp,CI4,-0.10832374199999999,1.2099245655 -Te4Pd3_10_18618.vasp,Te4Pd3,-1.1208597928571429,0.19245835499999864 -Li4H7Rh1S3O13_143_10197.vasp,Li4H7RhS3O13,-4.1837521778571425,0.2410680854404689 -Ag1Te2_12_145.vasp,AgTe2,-0.38998216999999996,0.3723680441666667 -Ti1O1F1_8_18819.vasp,TiOF,-5.89842147,-0.07274185333333882 -Ga1Ir1S2I2_6_6207.vasp,GaIrS2I2,-2.0418981933333336,0.11832692249999455 -Sc2S1I1Br1_8_16128.vasp,Sc2SIBr,-2.99764513,0.025899260749998043 -Al1Pd5I2_123_712.vasp,AlPd5I2,-1.1278149525,-0.004406345442708459 -Mn3Se1Br1Cl3_1_11405.vasp,Mn3SeBrCl3,-1.6807760625,0.1419764279795238 -Os1F2_164_13800.vasp,OsF2,-2.4919887033333334,0.6205628204999973 -H14O8_16_6980.vasp,H14O8,-3.8739911086363636,0.38908158441287544 -Sb10Se10_26_15411.vasp,Sb10Se10,-2.0587681985,0.2890095052499977 -Nb3C2_187_12965.vasp,Nb3C2,-6.97307704,0.846557727624992 -Os1W1Se2I4_1_13829.vasp,OsWSe2I4,-1.78428714875,0.03293099468750005 -Mo2C2Br2_59_11587.vasp,Mo2C2Br2,-3.72817307,0.4953957070833266 -Hf2S2_10_7576.vasp,Hf2S2,-4.81388119,0.5912754800000002 -Ag2Pd2I6O18_2_369.vasp,Ag2Pd2I6O18,-2.320577757142857,0.09479227303571214 -Mn2Sb2Te4Cl2_26_11257.vasp,Mn2Sb2Te4Cl2,-1.56241795,0.2767345644999979 -Hf1Ge1Te3Se1_6_7183.vasp,HfGeTe3Se,-2.924739565,-0.027470229999999707 -Cr1Bi2_187_4127.vasp,CrBi2,-1.33105251,0.7138537099999984 -Mn3S2I1Br1_6_11400.vasp,Mn3S2IBr,-1.89421567,0.22663485910714143 -Na2Ni2As2_12_12236.vasp,Na2Ni2As2,-1.1475908083333333,0.15420348833333342 -As3Pb5O9_174_1315.vasp,As3Pb5O9,-3.5869511411764705,0.26565344401383806 -Bi2S2I2_59_2514.vasp,Bi2S2I2,-1.5439674333333333,0.0631381900000001 -Cu1Pd2S4_187_4942.vasp,CuPd2S4,-1.7722908214285713,0.21321013797618715 -Ni1H4C8F2_25_13353.vasp,NiH4C8F2,-5.064988558666667,0.6747578626666603 -Fe2Te4P2Br2_26_6015.vasp,Fe2Te4P2Br2,-1.637466844,-0.45590667425 -Cr2C1F2_164_4340.vasp,Cr2CF2,-3.9939614679999997,0.14920894999999557 -Ni1H4N6Cl2_47_13356.vasp,NiH4N6Cl2,-3.948737378461538,0.09486506519230228 -Sb2Te2O1_164_15719.vasp,Sb2Te2O,-2.372874706,0.27715923249999763 -Ga18Te9_143_6107.vasp,Ga18Te9,-1.5281260774074072,0.1256403931481469 -Ca2Ag1Te2Br2_38_2916.vasp,Ca2AgTe2Br2,-1.064700192857143,0.3319087394047592 -P6Pb2_164_14138.vasp,P6Pb2,-3.02091881375,0.39397250357142743 -Ti2S1Br2_1_18990.vasp,Ti2SBr2,-4.024899432,-0.03904442999999924 -Ni1H4C6Br2N2_25_13343.vasp,NiH4C6Br2N2,-4.977864266,0.2524221593333278 -Se4Cl4_12_16298.vasp,Se4Cl4,-1.18821367125,0.21996924250000005 -Au2I2O2_59_1485.vasp,Au2I2O2,-0.49070730333333334,0.6953678288333315 -Nd1_191_13231.vasp,Nd,-0.84353846,1.4873288525000001 -Na2Cr4O10_59_12064.vasp,Na2Cr4O10,-4.6071709275,-0.16022094535156273 -Al1Ga1Hg1O4_156_661.vasp,AlGaHgO4,-3.7517069542857144,0.10839855639880372 -Y4B3F2_164_20807.vasp,Y4B3F2,-4.900523333333333,0.4165691099074027 -Na2B2S2N2_31_11984.vasp,Na2B2S2N2,-4.055308575,1.0341319600000003 -B2Cl6_26_1664.vasp,B2Cl6,-2.50237598625,0.04080441875000007 -P6Se8I4_2_14146.vasp,P6Se8I4,-2.0520620127777778,0.19090823067129242 -Ta1S2_164_17608.vasp,TaS2,-5.29690872,0.12382386833333303 -Fe2Sb2S4F2_26_5955.vasp,Fe2Sb2S4F2,-2.5151054569999998,-0.03308395420000437 -Co2Ni1O6_8_3938.vasp,Co2NiO6,-3.4089491644444445,-0.5654091556944467 -Nb2H2S2N1_164_12735.vasp,Nb2H2S2N,-4.932522705714286,0.1204509352380847 -Cd1C4N2Cl2F4_47_3295.vasp,CdC4N2Cl2F4,-4.074383518461539,0.12558562826921804 -Sc3C2Cl2_187_16198.vasp,Sc3C2Cl2,-4.540852504285715,0.17407095122119254 -Ta1Cr1F6_123_17532.vasp,TaCrF6,-3.75913719625,0.45720027874999625 -Nb2B1H2_164_12631.vasp,Nb2BH2,-5.184398174,0.2722940210000009 -Ga2Te2H2S8_11_6503.vasp,Ga2Te2H2S8,-2.4874416092857143,0.2208661063095195 -K2H6C4S6_2_9143.vasp,K2H6C4S6,-3.8819009338888883,0.10340502666665663 -Zn2Sb4S6F4_31_21160.vasp,Zn2Sb4S6F4,-2.105471595625,0.3994850329999974 -Sb1Te2O6F1_1_15515.vasp,SbTe2O6F,-3.3711905969999996,0.4200274325625011 -Rh2Cl2_129_15183.vasp,Rh2Cl2,-0.699131635,1.3003720524999984 -Ir2O2_187_8797.vasp,Ir2O2,-3.6064084975,1.1796527450000003 -Sb2Se2_12_15701.vasp,Sb2Se2,-1.977963765,0.3698139387499979 -As2Ru2O6_8_1286.vasp,As2Ru2O6,-4.20413499,0.4820522434999952 -Zn2Te6As2_147_21189.vasp,Zn2Te6As2,-0.9510773240000001,0.311911301166665 -Ca2P4H16C4O12_13_3093.vasp,Ca2P4H16C4O12,-5.0115337344736846,0.02218894742687899 -P4C3_156_14076.vasp,P4C3,-5.030360014285714,0.7600628671428518 -K4P4H12N4O12_14_9489.vasp,K4P4H12N4O12,-4.6173737374999995,0.15073185444444448 -Ta4Fe2O10_59_18036.vasp,Ta4Fe2O10,-6.15038598875,0.46198401499999964 -Zr1Pt3O8_10_21410.vasp,ZrPt3O8,-4.12725571,0.32925502583333355 -Co2Se4O16_14_4027.vasp,Co2Se4O16,-3.420937955909091,0.1647638040909022 -Te2W2I2_59_18529.vasp,Te2W2I2,-2.0496874383333332,0.5081068140277778 -Ti1Ge1Te1Se1S1Br1_6_18786.vasp,TiGeTeSeSBr,-3.1350825216666665,0.03250738388888519 -Cd2As2Se6_147_3456.vasp,Cd2As2Se6,-1.450373076,-0.06994874716666885 -Hf1Zr1Br1N2Cl1_6_7376.vasp,HfZrBrN2Cl,-5.787139515,0.061437090833333485 -Na2I6O16_81_12183.vasp,Na2I6O16,-2.558903115,0.169016129583333 -Li6H2S2O8_11_10266.vasp,Li6H2S2O8,-4.376033222777778,-0.0005891530555595936 -K2H8S4Cl2_2_9163.vasp,K2H8S4Cl2,-2.703512685,0.10111051062499943 -Nb2S2I2_59_12840.vasp,Nb2S2I2,-3.610971178333333,0.08383121750000022 -Sb1Pt1_187_15485.vasp,SbPt,-1.413945985,0.8444181549999998 -Ag4S2_4_543.vasp,Ag4S2,-0.25901777333333337,0.15932591333333335 -Fe2N1Cl2_164_5880.vasp,Fe2NCl2,-2.392103284,0.39999701600000037 -Fe2Mo2S14_113_5873.vasp,Fe2Mo2S14,-2.6429485922222224,0.1304278520138863 -Cr2P4Au2Se12_13_4458.vasp,Cr2P4Au2Se12,-2.314554228,0.05110897843749829 -Sr2B2S6Cl2_59_17138.vasp,Sr2B2S6Cl2,-3.1379391991666665,0.3233142848611076 -Rb2Cd4Te2S6I6_31_14830.vasp,Rb2Cd4Te2S6I6,-0.6403017765000001,0.18814286187499796 -Rb2Cd4Se2S6F6_31_14821.vasp,Rb2Cd4Se2S6F6,-1.34506493,0.44274438445833286 -Al2Co2O5_187_802.vasp,Al2Co2O5,-4.748411274444445,-0.02770625333333876 -Eu3Se3_123_5609.vasp,Eu3Se3,-3.737151155,-0.1682829349999997 -B1C1_187_1620.vasp,BC,-6.448434995,0.7741690520833329 -Ga3Se4_164_6537.vasp,Ga3Se4,-2.323481695714286,0.12221463785714048 -Na2Mg1Se2O8F4_2_12196.vasp,Na2MgSe2O8F4,-2.758379015882353,0.5537020368872484 -Sr1Au2Br2O2_1_17024.vasp,SrAu2Br2O2,-1.46235753,0.22067183464285695 -Fe1W2Cl10_5_5768.vasp,FeW2Cl10,-2.0545910184615384,0.05757500230769086 -Pb4W4O16_14_14323.vasp,Pb4W4O16,-5.191466115416667,0.16953389374999972 -Nb1Te2_187_12604.vasp,NbTe2,-3.279189816666667,0.10973054444444408 -Co1S2_187_3819.vasp,CoS2,-2.5071004733333333,0.4836638508333335 -Fe3B2F2_187_6042.vasp,Fe3B2F2,-2.784300952857143,0.06296590714285161 -Pt5Br1Cl1O5_1_14712.vasp,Pt5BrClO5,-2.217444875,0.3331435768749973 -Ir2S4I2_5_8828.vasp,Ir2S4I2,-2.09316795,0.12853050796874976 -Ta2Cl2_164_17692.vasp,Ta2Cl2,-4.5855233675,0.5946146037500006 -Te2P1_115_18433.vasp,Te2P,-1.7108543066666666,0.6856681927777759 -Ru2Cl2_164_15308.vasp,Ru2Cl2,-1.866334965,0.7619801166666642 -Cd1H1S1F1_156_3332.vasp,CdHSF,-1.6509515625,0.292125918125 -Cr6Se4Cl2O16_2_4629.vasp,Cr6Se4Cl2O16,-3.9578790664285712,0.16015924279761573 -Mn2H2N1_164_11091.vasp,Mn2H2N,-3.623855612,-2.431970976200002 -Al2H6O6_8_869.vasp,Al2H6O6,-4.906808455714286,-0.37993294452381354 -Mn1Sn1Ge1Br1Cl1O5_1_10892.vasp,MnSnGeBrClO5,-3.56832229,0.11383993804166524 -Pb3N4_156_14302.vasp,Pb3N4,-3.0537801642857145,0.6775856714285688 -Ta2Br4O2_47_17669.vasp,Ta2Br4O2,-4.306893645,-0.0005471925000000155 -Na1Sb1Br3Cl1_1_11927.vasp,NaSbBr3Cl,-1.2639544266666667,0.1623209393749988 -Ga8S12_14_6589.vasp,Ga8S12,-2.8534292505,0.0676882394999998 -Zr2Br1Cl1O1_8_21514.vasp,Zr2BrClO,-4.046872051999999,0.31981182466666525 -Pt1N4Cl4_123_14581.vasp,PtN4Cl4,-1.6794666511111112,1.2800746622222197 -Cu2Ge1Br2O2_1_5098.vasp,Cu2GeBr2O2,-1.905331722857143,0.405041681785711 -Rb2Hg4Se2S6Cl6_31_14881.vasp,Rb2Hg4Se2S6Cl6,-0.789421778,0.2519005828124994 -Te20As8_14_18340.vasp,Te20As8,-1.6836160192857144,0.2750909190476174 -K2H2_129_9129.vasp,K2H2,-1.153668435,0.35251217 -Mg1Ga2Se4_164_10364.vasp,MgGa2Se4,-2.3745739285714285,0.056210388571428904 -N1Cl5_1_11772.vasp,NCl5,-0.6708941433333333,0.42079361249999647 -Sn2Sb6_164_16873.vasp,Sn2Sb6,-1.66968232875,0.39016587078124987 -Dy1Sb2_21_5513.vasp,DySb2,-2.339837923333333,0.6560806975925901 -Au2Br2_67_1455.vasp,Au2Br2,0.3702259575,0.07123604124999999 -Dy2I6_59_5529.vasp,Dy2I6,-1.55121182375,0.0739285462499999 -B3Os2_123_1738.vasp,B3Os2,-5.19862514,0.9626797639999998 -P8Se8O4_2_14160.vasp,P8Se8O4,-3.4093814279999997,0.2765245048666619 -In2Se2_164_8586.vasp,In2Se2,-1.8356614425,0.06775392000000013 -Zr2P2Se6_2_21629.vasp,Zr2P2Se6,-3.455679816,0.23824646399999994 -Al1Ir1Se1S1Br2_1_684.vasp,AlIrSeSBr2,-2.241122416666667,0.22968115447915927 -Ag4Sb4_51_557.vasp,Ag4Sb4,-0.4883704425,0.23412209250000005 -Ge2S2Br2_59_6822.vasp,Ge2S2Br2,-2.2303411966666666,0.1708038588541667 -Nb4V2S12_14_13178.vasp,Nb4V2S12,-4.4826442194444445,0.07715644180555215 -Sn4P4Se8S1Cl3_1_16952.vasp,Sn4P4Se8SCl3,-2.2470080305,0.18050023691145423 -Cu4S4F8_14_5455.vasp,Cu4S4F8,-1.422131086875,0.20513913296875008 -Mn4Br14_13_11425.vasp,Mn4Br14,-0.784419296111111,0.2000610772222213 -In3Rh1_187_8652.vasp,In3Rh,-0.76273608,0.904357081875 -Mn1Ge1Te2Br4_1_10751.vasp,MnGeTe2Br4,-1.26940777,0.22132847072916678 -Pt3S2I2N1_6_14692.vasp,Pt3S2I2N,-1.87709242375,0.31542532843750004 -Te2W2Cl2_59_18527.vasp,Te2W2Cl2,-2.4192461033333332,0.6233004074999963 -Fe1C6I2F4_47_5650.vasp,FeC6I2F4,-4.00461382,0.40658158086538043 -Cu2Sb2S4_26_5266.vasp,Cu2Sb2S4,-1.9401142475,0.16172579437500012 -Sr1Fe1S1Br2_1_17048.vasp,SrFeSBr2,-1.933233376,-0.0346259339999998 -Zr1Nb1S2I2_25_21353.vasp,ZrNbS2I2,-3.5265562883333335,-0.0474439676851921 -Ba2Na2_11_2032.vasp,Ba2Na2,0.380593615,0.5490975849999999 -Nb1Ni1Br1Cl1O2_1_12541.vasp,NbNiBrClO2,-3.533418688333333,0.21733946010416316 -Cr2Ag2Sb4Te12_13_4303.vasp,Cr2Ag2Sb4Te12,-1.3556941835,0.20570105212499834 -Zr1S2_164_21417.vasp,ZrS2,-4.729289836666667,0.06958073083333272 -Mn2W2S2O12_8_11341.vasp,Mn2W2S2O12,-4.696068149999999,0.2900471757070626 -Zr2Br1Cl1O2_6_21515.vasp,Zr2BrClO2,-4.8369248266666665,0.21304997333333375 -Sn8S2I12_11_17010.vasp,Sn8S2I12,-0.9438087081818182,0.08962686113636154 -V2N1_164_20112.vasp,V2N,-4.653664863333334,1.110018464444444 -Rh2Br6_162_15178.vasp,Rh2Br6,-0.9930798825,0.06982909749999999 -In1Cu1Sb2Te6_149_8237.vasp,InCuSb2Te6,-1.1493378829999998,0.3398716426666653 -Zn2P2Se6_147_21132.vasp,Zn2P2Se6,-1.821747498,0.03804966799999998 -Cd1S1Br1F1_156_3407.vasp,CdSBrF,-0.7098964,0.38289325640625005 -Mg3Sb3_25_10561.vasp,Mg3Sb3,-1.1258898933333332,0.35519929229166497 -Mn2Bi2S4Cl2_10_11009.vasp,Mn2Bi2S4Cl2,-2.213165911,0.22448732199999988 -Zn2W2O8_13_21193.vasp,Zn2W2O8,-4.772006640833333,0.12918273749999987 -Hg2Bi2S4Br2_11_7938.vasp,Hg2Bi2S4Br2,-0.998801044,0.18689190800000016 -Ti1Co3O8_164_18768.vasp,TiCo3O8,-4.51229283,-0.27129951760417126 -Sr3Ag2I2O4_123_17345.vasp,Sr3Ag2I2O4,-2.4969065118181817,-0.036280111363638845 -Sn1S2_115_16680.vasp,SnS2,-2.421308556666667,0.19182650999999984 -Zn2H4S10_7_21098.vasp,Zn2H4S10,-2.2868947725,0.20467828307812475 -Mn1Au1Se1Br1_1_10641.vasp,MnAuSeBr,-0.80543743,0.9105298690625001 -Ba2_65_2094.vasp,Ba2,1.140660545,1.532240965 -Mn2S2_123_11223.vasp,Mn2S2,-2.66745736,0.2900788624999997 -Zr3Se2N2F2_187_21785.vasp,Zr3Se2N2F2,-4.61114826,1.0074312987499905 -Zr1Ti1I1F3_1_21469.vasp,ZrTiIF3,-3.6642675866666665,0.7280749603472163 -V3B2O2_187_20243.vasp,V3B2O2,-5.23686875,0.5816579049206307 -Bi1P1W1_156_2353.vasp,BiPW,-3.5207828333333335,-0.38865172166666984 -La2C1_164_9583.vasp,La2C,-4.258799663333334,0.256181841666662 -Fe2Se2S8_31_5976.vasp,Fe2Se2S8,-2.1009466816666666,0.12440930118055327 -Rb2Hg4Se2O6F6_31_14879.vasp,Rb2Hg4Se2O6F6,-1.654168313,0.2450040219999987 -Mn2I2O2_59_11111.vasp,Mn2I2O2,-2.517841468333333,0.08951408659721949 -Hg1P1_156_7892.vasp,HgP,0.08412449,0.8797247193965518 -Cr2S2I1Br1_6_4465.vasp,Cr2S2IBr,-2.3490354566666665,-0.1488263666666665 -Sc1Te1Cl1_156_16013.vasp,ScTeCl,-2.840576693333333,0.15436611444444193 -Rb3Mn2Cl7_123_14957.vasp,Rb3Mn2Cl7,-1.4578388775000002,0.20453872958333152 -S1I2O6_5_15379.vasp,SI2O6,-3.029466231111111,0.08007335944444449 -Y1Cl2_123_20621.vasp,YCl2,-3.40350274,0.16810846472221885 -Bi2P2S6_7_2492.vasp,Bi2P2S6,-2.783918014,-0.016847256700000257 -Ni1Te2_164_13435.vasp,NiTe2,-0.7142100233333334,0.02528189666666658 -Nb2I2O2_59_12745.vasp,Nb2I2O2,-4.438232215,0.11626345944444028 -Ta2Ag2Se4O14_51_17644.vasp,Ta2Ag2Se4O14,-4.379862334090909,0.09082322181818192 -Sr5Y1_1_17492.vasp,Sr5Y,0.22424600833333333,1.1918090724999972 -Mg2I4O12_4_10469.vasp,Mg2I4O12,-2.9891303133333333,0.14644931972222208 -Cu2Se4_6_5314.vasp,Cu2Se4,-1.1012230783333334,-0.8851330233333334 -Fe3Sn1Te2_187_6070.vasp,Fe3SnTe2,-0.70702965,0.6202215137499986 -Ru2S2I1Br1_25_15340.vasp,Ru2S2IBr,-2.34533975,0.18826623177777413 -B1Mo2O2_164_1626.vasp,BMo2O2,-4.811145034,1.2920407689166673 -In1Ag1P2S6_149_8180.vasp,InAgP2S6,-2.697149702,0.06630413149999992 -Hf1Ag1Br2Cl2_1_7100.vasp,HfAgBr2Cl2,-1.9383088283333334,0.33078894562499683 -Na2C2S2N2_31_12001.vasp,Na2C2S2N2,-4.781776245,-0.06876852083333884 -Ti3B2Se2F2_8_19068.vasp,Ti3B2Se2F2,-4.542400513333333,0.2611719385185147 -Mn1H8C10N8O2_2_10767.vasp,MnH8C10N8O2,-5.881963915517241,0.38058118933907514 -Mo2Se2S2_156_11688.vasp,Mo2Se2S2,-3.4005283150000003,0.005237605833333214 -Mn1H2S2_12_10764.vasp,MnH2S2,-3.054703826,0.39975382074999555 -Au2S2_10_1519.vasp,Au2S2,-0.85197589,0.15981267500000007 -Zr1Fe1I6_5_21292.vasp,ZrFeI6,-1.0654532325,-0.13759783447916663 -Cu1Ag1Cl3O1_1_4817.vasp,CuAgCl3O,-0.5966446983333333,0.25056646187499765 -Pt3Cl2O4_1_14689.vasp,Pt3Cl2O4,-2.191175618888889,0.47861818067900996 -Pt1S2_115_14588.vasp,PtS2,-2.0110902166666667,0.6340545033333331 -Au3S2Br2_2_1562.vasp,Au3S2Br2,-0.39373973285714287,0.10632672375000002 -Sn2Br2O3_6_16745.vasp,Sn2Br2O3,-2.9047892671428572,0.19967524303571027 -Bi2S2_187_2517.vasp,Bi2S2,-1.8635202875,-0.5745240408333343 -Ag1Hg1Se4_1_80.vasp,AgHgSe4,-0.6021829716666667,-0.31037138694444566 -Co1Ni1Br1F3_1_3782.vasp,CoNiBrF3,-1.3443714416666666,0.11965218166666663 -Y2S2_129_20774.vasp,Y2S2,-5.168623715,-0.026562764999999544 -P2I4_2_13986.vasp,P2I4,-1.07759991,0.06396050166666634 -K8P8H8N8O16_14_9556.vasp,K8P8H8N8O16,-4.773529114791667,0.11828828826388893 -Zr1Nb1S2I3Cl1_1_21354.vasp,ZrNbS2I3Cl,-2.70025012875,0.0431601395312502 -Mg4H2O5_164_10577.vasp,Mg4H2O5,-4.5005941418181825,-0.3208576181818228 -Ta2O3_1_17814.vasp,Ta2O3,-6.620310704,0.8880407947999998 -Ni5Ge2Bi1Sb1Te2Mo1_8_13772.vasp,Ni5Ge2BiSbTe2Mo,-1.0036017158333335,0.4007649691111078 -Na1Sb2Pd1S6_149_11929.vasp,NaSb2PdS6,-2.224918438,0.36915111921874755 -Nd2Br2O4_11_13234.vasp,Nd2Br2O4,-4.18126815875,0.2927931675000002 -Ti3H2C2S2_187_19080.vasp,Ti3H2C2S2,-5.815973875555556,0.30024675701387105 -Li2H2Se2_4_9933.vasp,Li2H2Se2,-2.8116231566666667,0.09632474333333318 -Ga1Ge1I2_6_6191.vasp,GaGeI2,-1.1421633525,-0.0015625618749999237 -V3Ge2S6Br1Cl2_1_20261.vasp,V3Ge2S6BrCl2,-3.0280690707142854,0.14805129428570907 -Ta1Ti1Se1S1_8_17635.vasp,TaTiSeS,-5.250867295,-0.13575878090910165 -Tl1Ni5Cl2_123_19306.vasp,TlNi5Cl2,0.37625971,1.4424145362499998 -Fe2Bi4I4O6_11_5815.vasp,Fe2Bi4I4O6,-2.5881214675,-0.02536302127404153 -Mn6Cl18_164_11466.vasp,Mn6Cl18,-1.4250374045833334,0.09176660104166667 -C1F2_164_2727.vasp,CF2,-1.9562274566666666,2.15932549166666 -Nb1Cu1S1Br2_6_12499.vasp,NbCuSBr2,-2.151336282,0.49173748233332965 -K2Mn2P2O6F6_2_9241.vasp,K2Mn2P2O6F6,-4.000994582222223,-0.2463319619444484 -Ag2Hg2Te2F2_26_307.vasp,Ag2Hg2Te2F2,0.02218089625,0.2162999377370689 -Tl1Ag1P2O6_149_19201.vasp,TlAgP2O6,-3.993164995,0.46540236762499987 -Be1As2O4F4_5_2213.vasp,BeAs2O4F4,-3.815285514545455,0.11941094940908692 -Fe1Pb2C6N6_164_5736.vasp,FePb2C6N6,-5.870629743333334,0.17994623849999494 -Hf2Sn2Se8_31_7622.vasp,Hf2Sn2Se8,-3.2280814825,0.2088637225000003 -Bi8I8_12_2684.vasp,Bi8I8,-0.6805492125,-0.1984238633333338 -K2Mg1Se2O8F4_2_9224.vasp,K2MgSe2O8F4,-2.6462344811764704,0.48469570735293555 -Bi4Pd2O8_90_2634.vasp,Bi4Pd2O8,-2.9000844964285717,0.5902640935714252 -Nb2Se2F2_59_12871.vasp,Nb2Se2F2,-4.29481366,-0.030946160916674126 -Sn1Ge1Se2Br2_1_16636.vasp,SnGeSe2Br2,-1.7195864716666664,0.16597575944444465 -Os2S4_51_13877.vasp,Os2S4,-3.3011841816666667,0.9969333241666662 -Ni1H4Br2N6_47_13330.vasp,NiH4Br2N6,-3.8539006123076924,0.030591719807686248 -Sr2Br1N2_164_17149.vasp,Sr2BrN2,-2.435382578,1.2574993427499903 -Co2Se2_129_4022.vasp,Co2Se2,-1.9540741425,0.19894882483333065 -As1S1F1_156_1169.vasp,AsSF,-2.7508498199999996,0.46677491777777513 -Pb2Se2_129_14292.vasp,Pb2Se2,-1.54012921,0.4098349334375 -Ca1Ag1Se1S1I2_1_2794.vasp,CaAgSeSI2,-1.12632779,0.16976601500346675 -Sr2N1_25_17281.vasp,Sr2N,-2.0889491666666666,0.5152875033333335 -Sr1S2F2_1_17076.vasp,SrS2F2,-2.627849786,0.7074141357500008 -K4V1C7N7_5_9525.vasp,K4VC7N7,-5.5901284036842105,0.2741676060964801 -Cr2Ag2Sb4S12_13_4301.vasp,Cr2Ag2Sb4S12,-2.387456629,0.25799694696874775 -P4S8_31_14118.vasp,P4S8,-3.1689204158333335,0.11479783906249352 -Ta2Si2Bi2_129_17884.vasp,Ta2Si2Bi2,-4.384878176666667,0.08214642269840233 -Tb2H4Cl2O4_11_18200.vasp,Tb2H4Cl2O4,-4.663509239166666,0.08958109666666747 -Fe1Sn2_123_5762.vasp,FeSn2,-0.6490378099999999,-1.1316818361111105 -C1N1_187_2734.vasp,CN,-6.73165851,0.3255371883333271 -Ru1O2_115_15278.vasp,RuO2,-4.014621586666666,0.9490920783333339 -Nb4Se2Br2O2_1_13150.vasp,Nb4Se2Br2O2,-4.667361962999999,-0.11253873508929702 -Ba1Au2O8_89_1804.vasp,BaAu2O8,-2.639652832727273,0.348107304999997 -Cs2Se2N2O6F6_1_4788.vasp,Cs2Se2N2O6F6,-2.673415915,0.550165993749991 -Cr1Sb2_187_4259.vasp,CrSb2,-2.12872431,1.1273146283333306 -K4Cr4I4O24_14_9438.vasp,K4Cr4I4O24,-3.6072263127777777,-0.143656016041674 -Cs2Te2C2Cl6O6_4_4789.vasp,Cs2Te2C2Cl6O6,-2.637084968888889,0.6793282971527774 -Cd1C6Cl2F4_10_3298.vasp,CdC6Cl2F4,-3.886478876153846,0.6036597692307624 -V1P2_164_19900.vasp,VP2,-3.90832124,0.6054811516666665 -Nd4B2C2_12_13249.vasp,Nd4B2C2,-4.8199670625,0.25245818500000006 -Sn1H1S3_1_16640.vasp,SnHS3,-2.5300701620000003,0.2691603436874974 -Co1H4C4N14_2_3754.vasp,CoH4C4N14,-5.899331082608696,-1.3474990094927621 -Si1S2_187_16361.vasp,SiS2,-3.2630672966666663,0.6181552566666673 -Y2Cl6_59_20722.vasp,Y2Cl6,-3.41251827,0.04327416312499999 -Sr2Tl1Cd1Ag1S5_99_17333.vasp,Sr2TlCdAgS5,-1.593775454,0.23063099631249728 -Sc1Te3_99_16018.vasp,ScTe3,-1.970197305,0.544020540625 -Sb8O12_51_15869.vasp,Sb8O12,-3.954250039,0.3032404285000001 -Sn1F4_123_16631.vasp,SnF4,-2.4713703479999998,0.08372788399999997 -W4C3S2F2_164_20578.vasp,W4C3S2F2,-5.026802965454546,0.3794145608333215 -W2N1O2_12_20510.vasp,W2NO2,-6.226068612000001,-0.07801774348300028 -Rb2H6C4O6_2_14854.vasp,Rb2H6C4O6,-4.866400858333333,0.13525170326388314 -Gd2Bi2S4O2_129_6598.vasp,Gd2Bi2S4O2,-4.175459064,-0.5050839153333379 -Mn1Cu1W1S4_1_10697.vasp,MnCuWS4,-2.8395906014285717,0.4604634896428539 -Zr2Sn2S8_31_21692.vasp,Zr2Sn2S8,-3.5773944458333333,0.1390545477083296 -Rh2S2_187_15223.vasp,Rh2S2,-2.64522936,0.3615159398913014 -La2Pb12Br2O14_51_9606.vasp,La2Pb12Br2O14,-3.6212867639999997,0.05710632000000038 -Ni1C4N2O4F8_10_13298.vasp,NiC4N2O4F8,-3.9004833242105263,0.37333355668858526 -Sb2W2O10_85_15748.vasp,Sb2W2O10,-5.075304966428571,0.1690341498214245 -Fe3Si1Se2_187_6068.vasp,Fe3SiSe2,-1.8445770416666667,0.3283421549999976 -Hf1Ti1S1I3Br1O1_1_7334.vasp,HfTiSI3BrO,-3.3453565225,0.26819423859375036 -Bi1Pd2S2_187_2358.vasp,BiPd2S2,-1.765685258,0.1465755396249966 -Sr2I4O8_125_17258.vasp,Sr2I4O8,-2.676839107142857,0.2566154265079354 -Ag2Se2Cl2_59_430.vasp,Ag2Se2Cl2,-0.4909761483333333,0.25362561458333277 -Zn2H16C12O8_2_21093.vasp,Zn2H16C12O8,-5.107017748421053,0.10678421377192437 -Mn1Sn2C6N6_164_10900.vasp,MnSn2C6N6,-5.994893662,-0.3306116555000038 -Rh1Au1Br2O2_1_15141.vasp,RhAuBr2O2,-1.5705673649999998,0.40363772020833344 -W2C2I2_59_20478.vasp,W2C2I2,-4.371064256666666,0.2264782331944375 -Cr1C3_187_4135.vasp,CrC3,-5.24464152,1.6818987056249939 -Nb2Sn1Te2_8_12893.vasp,Nb2SnTe2,-3.161916102,-0.16179343224999965 -Ca3Cu2Br2O4_123_3166.vasp,Ca3Cu2Br2O4,-2.9719774136363637,-0.17438135363636786 -Rh2I6_189_15199.vasp,Rh2I6,-0.20854308,0.40812613249999996 -Br6N2_31_2713.vasp,Br6N2,-0.95270130375,0.42588753437500015 -Cr1Cl2O1_47_4140.vasp,CrCl2O,-2.945562115,-0.3385395133854193 -V2Cu1O6_12_20046.vasp,V2CuO6,-4.541212851111111,0.20376585944443493 -Nb1I1Br1_156_12518.vasp,NbIBr,-2.2143378433333334,0.447468484791663 -Rh4S8_2_15253.vasp,Rh4S8,-2.8385610433333333,0.3422068599999972 -Te20P8_14_18342.vasp,Te20P8,-1.8229267582142856,0.4557762065476161 -Tl2Pd4Se6_164_19488.vasp,Tl2Pd4Se6,-1.5159352625,0.1594687924999998 -In2P2S6_149_8521.vasp,In2P2S6,-2.530678526,0.46572172387499683 -Mn1Ag1Te1Br1O1_6_10621.vasp,MnAgTeBrO,-1.6296602320000002,0.17499314312499997 -Fe3Cu1N1O5_8_6049.vasp,Fe3CuNO5,-3.093916922,0.7037666031527727 -Zn2In2Se5_156_21112.vasp,Zn2In2Se5,-1.3255076022222223,0.14617142194444302 -B2Mo3S2_187_1682.vasp,B2Mo3S2,-4.3490725842857145,0.12333514928571065 -Na1Al1P2S6_5_11813.vasp,NaAlP2S6,-3.2781223859999997,0.06890178050000051 -Y2Cl6_191_20721.vasp,Y2Cl6,-3.3269435475,0.12884888562500008 -Ag1Ge1S1I1_8_62.vasp,AgGeSI,-1.2487885325,-0.296951258125 -Ba2I2Cl2_129_2001.vasp,Ba2I2Cl2,-2.0261435733333335,0.13614855833333328 -Pd4C12_1_14516.vasp,Pd4C12,-5.14858395125,1.3506468162499994 -Fe2As2S4Br2_26_5779.vasp,Fe2As2S4Br2,-2.295284934,-0.24015369870833547 -Sn4Sb4Se4_17_16966.vasp,Sn4Sb4Se4,-1.8808677241666667,-0.06882645000000154 -Ni1O2F2_164_13383.vasp,NiO2F2,-1.445929952,0.6598630395000001 -Hf1Zr1Te3Cl1_1_7406.vasp,HfZrTe3Cl,-3.06401658,0.40034736489583 -Tl2Te5_12_19557.vasp,Tl2Te5,-0.8303236985714285,0.32420820761904645 -K1Ti1O2_156_8945.vasp,KTiO2,-4.96811433,0.4438336638750009 -Ti4N3_164_19146.vasp,Ti4N3,-7.7653764785714285,0.36644984607142206 -U2H4O8_53_19713.vasp,U2H4O8,-6.124448690714286,0.11332440892857143 -Zr1Ni3Te1S1I2_6_21384.vasp,ZrNi3TeSI2,-1.1547141475,0.5297044552604152 -K2H6Pd1S6_147_9154.vasp,K2H6PdS6,-2.6290789099999996,0.09337408116666718 -Ta2Te4Br10O1_2_17912.vasp,Ta2Te4Br10O,-2.0909828211764707,-0.2471947775000023 -Ta1Br2_164_17519.vasp,TaBr2,-2.8921694833333333,0.5174547330952317 -Na1P2Pd1O6_149_11923.vasp,NaP2PdO6,-4.336452808,0.5407815237499952 -H6Pb2S4N6_2_7087.vasp,H6Pb2S4N6,-4.093922046666666,-0.42440314014757163 -Nb1Zn1S2Br1_1_12617.vasp,NbZnS2Br,-2.494012752,0.4376360800249987 -Ti2F6_2_18936.vasp,Ti2F6,-4.55764479625,-0.63869640375 -Pr2S6_129_14550.vasp,Pr2S6,-3.75706252875,0.2448182604687501 -Be2P1_164_2262.vasp,Be2P,-2.9204372766666666,0.6897827189583307 -Hf1Ni1Cl6_149_7245.vasp,HfNiCl6,-2.16227963,-0.0679697178125 -Ca2Fe2Sn2_12_3019.vasp,Ca2Fe2Sn2,-0.40219857833333333,1.075384688333332 -Ba3Fe2S5Cl2_123_2109.vasp,Ba3Fe2S5Cl2,-2.6785260466666667,-0.07867577401041892 -Co2F2_129_3897.vasp,Co2F2,-0.7626533875,1.3921148068749998 -As2W1_164_1306.vasp,As2W,-4.02494953,0.2473728491666629 -Ti2S2F2_59_18997.vasp,Ti2S2F2,-5.027434410000001,-0.44003677083333814 -Al2Ge2S2_164_847.vasp,Al2Ge2S2,-3.3548867999999996,-0.2838449623611137 -Tl3S4_164_19580.vasp,Tl3S4,-1.5790087357142857,0.16282367656249874 -Ba2Cu1Se2Br2_38_1970.vasp,Ba2CuSe2Br2,-1.910920202857143,0.18191643285714076 -Cu2C2S2Cl2_31_5066.vasp,Cu2C2S2Cl2,-2.35332012625,0.5687032927976178 -P8C6_187_14148.vasp,P8C6,-5.000357307142857,0.7900655742857086 -Ir2Se2_164_8844.vasp,Ir2Se2,-2.5333997975,0.5342199943750003 -Mn2Sb2Cl2O4_10_11233.vasp,Mn2Sb2Cl2O4,-3.391789264,0.10218437674999592 -Au4Se4S12_14_1603.vasp,Au4Se4S12,-1.534208615,0.30697037662500026 -Mn3Sn1O8_1_11415.vasp,Mn3SnO8,-4.1304435875,0.3084685324999996 -Ti4B3O2_164_19122.vasp,Ti4B3O2,-6.608077597777777,0.2883673955555499 -Rh1Se1I1_156_15168.vasp,RhSeI,-1.5681899566666668,0.13749588361110932 -B1S1_156_1634.vasp,BS,-3.75387209,1.0498126824999994 -Nb3Ir1S8_5_12983.vasp,Nb3IrS8,-4.477715069166667,-0.4904900533333336 -Ca2Cu1Te2Br2_38_3006.vasp,Ca2CuTe2Br2,-1.144005307142857,0.3125602228571404 -Rb1S2_25_14750.vasp,RbS2,-0.8785049866666667,1.225837996249996 -As4S2O12_18_1359.vasp,As4S2O12,-4.373264866111111,0.25220853277777877 -Cu2H4C4N2Cl2_2_5120.vasp,Cu2H4C4N2Cl2,-4.328413060714285,0.3856251055357032 -Sb4O8_31_15793.vasp,Sb4O8,-4.181493429166667,0.23658343791666603 -Pb2C4O8_2_14232.vasp,Pb2C4O8,-5.491030487857143,0.16910135107142255 -Li1Sn1Cl3_143_9791.vasp,LiSnCl3,-1.8091311820000002,0.23400205099999993 -Ta1Sb1P1_156_17611.vasp,TaSbP,-4.682570106666667,0.5515354308333286 -Na1Sn1N1_156_11933.vasp,NaSnN,-2.71899469,0.30015148979166384 -W8Se24_14_20598.vasp,W8Se24,-3.188386983125,-0.06779456729166666 -Ag1C12S2F4_6_39.vasp,AgC12S2F4,-4.8848139415789475,0.9298703941611772 -Y4C3O2F2_164_20814.vasp,Y4C3O2F2,-5.490182242727273,1.164218719261351 -Pt3N6_8_14691.vasp,Pt3N6,-3.558249525555555,1.2548502027777741 -Ti1F4_123_18778.vasp,TiF4,-4.264484614,0.11265418300000007 -Mo1Cl2_115_11504.vasp,MoCl2,-1.5582348466666665,0.7396013611111114 -Ga1Ge1Te3_174_6197.vasp,GaGeTe3,-1.486974988,0.12909097473333336 -Bi2Pt1_123_2506.vasp,Bi2Pt,-1.4395563166666667,0.2502970479166666 -Sb2Cl8_1_15572.vasp,Sb2Cl8,-1.2324196969999999,0.04383553949999752 -Ta6Sn2S12_26_18156.vasp,Ta6Sn2S12,-4.72010724,0.3274672015000002 -Ta4Zn4Co2O16_13_18140.vasp,Ta4Zn4Co2O16,-5.09864617076923,0.155913112692305 -Al2Br4_1_776.vasp,Al2Br4,-1.4654127966666666,0.28001453944444304 -K2Mg1H4_123_9220.vasp,K2MgH4,-1.8494271185714286,0.056053578571428675 -Na2S2F2_129_12286.vasp,Na2S2F2,-1.8506603216666668,0.4867541314583309 -Mo2S4_11_11675.vasp,Mo2S4,-3.5907965666666666,0.17532205166666692 -Pt2S8_12_14672.vasp,Pt2S8,-2.368710554,0.26553019775 -In1Cl1_99_8215.vasp,InCl,-0.701903105,0.6948690984375001 -Tl1Br2_187_19231.vasp,TlBr2,-0.3362164033333333,0.23183731041666672 -Cr1Te1O1_156_4271.vasp,CrTeO,-3.3584367499999996,0.17967981733585553 -Ni1Sb2_123_13418.vasp,NiSb2,-1.19538593,-0.6569237216666667 -In1Te6As2Au1_149_8368.vasp,InTe6As2Au,-1.279805917,0.16983611141666574 -Sn2S2_59_16844.vasp,Sn2S2,-2.29646669,0.16736353124999992 -Cu2H8C8Cl2_2_5150.vasp,Cu2H8C8Cl2,-4.5096730465,0.30541143624999945 -Hf1Ge1S2Cl2_6_7177.vasp,HfGeS2Cl2,-3.608889935,-0.00873492666667297 -Y2Si1_164_20780.vasp,Y2Si,-4.03784419,0.8410636422222171 -Ti2S2I2_59_18998.vasp,Ti2S2I2,-3.908906005,-0.23227451354167483 -Re4S4O26_32_15113.vasp,Re4S4O26,-5.015705664117647,0.033133827352941125 -Ga4S6_31_6566.vasp,Ga4S6,-2.878934161,0.04218332899999977 -W1Se2_187_20457.vasp,WSe2,-3.8093382833333336,-0.41787791333333324 -Rh1I1Cl1_8_15154.vasp,RhICl,-0.8690742733333333,0.39556506166666544 -Sb6Pb2_164_15852.vasp,Sb6Pb2,-1.58463542625,0.4600864081249998 -S20N8_1_15381.vasp,S20N8,-3.3485135885714286,0.10247573169642443 -Nb2N1_164_12767.vasp,Nb2N,-6.3548727466666675,1.2362631944444438 -Au2Se2_187_1548.vasp,Au2Se2,-0.163877355,0.512242925 -Ti3Te2C2F2_187_19108.vasp,Ti3Te2C2F2,-4.777837761111112,0.3868337398148094 -V2Cl2_164_20034.vasp,V2Cl2,-2.5430586775,0.43986867250000006 -Y3B2_187_20788.vasp,Y3B2,-4.63056031,0.5550050059999958 -Na2V2H4I4O18_4_12332.vasp,Na2V2H4I4O18,-3.670000946,0.05919404505555237 -Sr2Cu1Te2Cl2_38_17209.vasp,Sr2CuTe2Cl2,-1.3727909914285714,0.32278353571428314 -Ca1Nb1I1Br1O1_6_2858.vasp,CaNbIBrO,-3.132367428,0.4341952013333339 -Pb1Se2_115_14208.vasp,PbSe2,-1.4605774633333333,0.6087281500694427 -Ge4S4I1Br3_8_6941.vasp,Ge4S4IBr3,-2.1753304425,0.1725712601041669 -K2I2O6_11_9205.vasp,K2I2O6,-2.558031775,0.11416448725000006 -Rb2Mn2As2_129_14899.vasp,Rb2Mn2As2,-1.5487021033333335,0.12747993783524697 -Rb1Sn1S2_156_14753.vasp,RbSnS2,-1.77415689,0.4347474053125001 -Cd2Sb2S4Br2_11_3558.vasp,Cd2Sb2S4Br2,-1.360114302,-0.29831140849999976 -Ti1V1S2Br4_1_18865.vasp,TiVS2Br4,-2.70371705125,0.12206876374999998 -Ti4Te4I4_31_19168.vasp,Ti4Te4I4,-2.920790844166667,0.1960547730555482 -Cd2Bi2S4Br2_10_3469.vasp,Cd2Bi2S4Br2,-1.18362227,0.21615082250000012 -In2H10C4F4_10_8456.vasp,In2H10C4F4,-3.6868054540000004,0.49144726400000016 -Nb2Cl10_1_12672.vasp,Nb2Cl10,-2.1920513741666667,0.2814136724999998 -Cu4Te4Br4_14_5484.vasp,Cu4Te4Br4,-0.4282953383333334,0.12911162916666613 -As2Ir2O6_162_1225.vasp,As2Ir2O6,-4.217636038,0.37549760349999506 -K1Tl1I4O12_2_8952.vasp,KTlI4O12,-2.528760422222222,0.10399982560763121 -Pd1Cl2_115_14359.vasp,PdCl2,-0.34107021,0.5343958544444445 -V2O5_5_20129.vasp,V2O5,-5.450972454285714,0.007606127857142653 -Cd2I2_129_3520.vasp,Cd2I2,1.4820559,0.36222477416666665 -Hf1Zn1S2_6_7372.vasp,HfZnS2,-2.983504615,0.41842433424999986 -Na2Mg1Te2H4O8_2_12198.vasp,Na2MgTe2H4O8,-3.9249585929411768,0.1288122043464015 -Li1Mn1Cr2O6_1_9743.vasp,LiMnCr2O6,-4.690254449999999,0.06788520430208048 -Cu1Te3W1Br1_6_4998.vasp,CuTe3WBr,-1.4123947166666666,0.4005456657638883 -Rb1I1_123_14740.vasp,RbI,-0.494209775,0.12529911999999993 -Li3Fe2F9_174_10146.vasp,Li3Fe2F9,-2.779919385714286,0.1506929017857117 -Zr1Pt1S2I1Br1_1_21406.vasp,ZrPtS2IBr,-2.6708941999999998,0.17326820881943827 -Mg2Bi1_25_10429.vasp,Mg2Bi,0.11380499,0.7698709669444446 -Rh2O6_31_15210.vasp,Rh2O6,-3.0546500875,0.8826207553124998 -Zr1O2_115_21386.vasp,ZrO2,-6.494535043333333,0.6884541000000004 -Ce4Mg2_164_3688.vasp,Ce4Mg2,-1.3644051716666665,0.550784826666665 -Sc2Br2_129_16041.vasp,Sc2Br2,-1.770890995,0.6939467641666641 -V2B1S2F2_164_19992.vasp,V2BS2F2,-3.3707871985714286,0.6779931970067941 -Hf2S1Cl3_8_7560.vasp,Hf2SCl3,-3.7557502133333336,0.28359660666666264 -Hg1Pb2S2Br2_12_7899.vasp,HgPb2S2Br2,-1.1319982657142857,-0.3690746028571441 -Ca2Mn2Si2_129_3066.vasp,Ca2Mn2Si2,-2.1101485700000002,0.3573712784166603 -Re1Te2_115_15026.vasp,ReTe2,-2.6815344299999997,0.8387937600000006 -Cu2H4C6I2_2_5125.vasp,Cu2H4C6I2,-4.076942232857143,0.41184601714285457 -Sc4N3_164_16252.vasp,Sc4N3,-5.838074621428571,-0.03342729857143212 -P8Se8_4_14162.vasp,P8Se8,-2.977516150625,0.09141934406249996 -Zn1Pd1I2_1_20991.vasp,ZnPdI2,0.177306715,0.185629810625 -Ge6F16_14_6959.vasp,Ge6F16,-2.991414424545454,0.029411458636360965 -V4B3S2_164_20307.vasp,V4B3S2,-4.78270321,-0.27822385583333653 -Ag1O2_47_92.vasp,AgO2,-1.19548969,0.834966610416665 -Zr1Bi1P1_156_21253.vasp,ZrBiP,-3.326854883333333,0.5018241691666634 -Ti1Bi1Te1Se2_8_18743.vasp,TiBiTeSe2,-2.739831226,0.5515926870000003 -Re2Pd1O8_2_15072.vasp,Re2PdO8,-5.11916441,-0.3298413992045499 -Cr1Se2_187_4265.vasp,CrSe2,-2.7187326499999998,0.04775296500000037 -Hg1Cl2_187_7850.vasp,HgCl2,0.3045841166666667,0.17434594 -Hg2Bi2S4I2_11_7941.vasp,Hg2Bi2S4I2,-0.8765817200000001,0.19536123250000004 -Li4Co2P4O14_113_10175.vasp,Li4Co2P4O14,-4.9450755825,0.15793981634721677 -Ca2P1_115_3083.vasp,Ca2P,-1.2440668833333333,0.9956247949999988 -Bi8S4O8_2_2693.vasp,Bi8S4O8,-3.122349251,-0.06587913333333606 -Cd2I2_12_3521.vasp,Cd2I2,1.050678945,-0.0691521808333333 -Sc1Ge1I2O1_1_15937.vasp,ScGeI2O,-2.885134254,0.34006544550000006 -K2Sb4Se8_2_9344.vasp,K2Sb4Se8,-1.9900519342857144,0.1266635959523791 -Ta4H2N3O2_164_18051.vasp,Ta4H2N3O2,-6.827084287272727,0.7417781533636258 -N8O12_51_11803.vasp,N8O12,-3.716895359,1.0692187054999955 -Ga2F6_12_6346.vasp,Ga2F6,-2.90949542625,0.06007910375000014 -Al2Te2H2S8_11_1004.vasp,Al2Te2H2S8,-2.7896043321428574,0.2109091940773765 -Li2Ni1H2_123_10020.vasp,Li2NiH2,-2.013872886,1.2006851060000001 -K4P4O8_57_9493.vasp,K4P4O8,-4.234371694375,0.23957388899999194 -Ti3H2C2S2_1_19081.vasp,Ti3H2C2S2,-5.815916823333334,0.3003038092360931 -Sm2Se6_129_16587.vasp,Sm2Se6,-3.24687194125,0.14458127029166645 -Ni2H12C8O12_14_13508.vasp,Ni2H12C8O12,-4.961279172941176,0.23284696955881448 -Zr2I1Br1O1_1_21585.vasp,Zr2IBrO,-3.6598610899999997,0.36156806916666495 -Cu2F4_123_5093.vasp,Cu2F4,-1.1026683016666667,0.1943970583333332 -Rb2Hg4S8F6_31_14874.vasp,Rb2Hg4S8F6,-1.052066613,0.3986456098125002 -Lu2C1Cl2_164_10305.vasp,Lu2CCl2,-4.133291696,0.02867071400000043 -Sb1Te2_187_15519.vasp,SbTe2,-1.4270394666666668,0.373512887777776 -Rh4C12_2_15251.vasp,Rh4C12,-5.61134938125,1.2463809162499992 -Tl2Sb2O6_149_19515.vasp,Tl2Sb2O6,-3.5840904389999997,0.21047159399999993 -Sc2Te5O13_1_16183.vasp,Sc2Te5O13,-4.3090634395,0.16849804224999954 -Ta2Sn2P2_129_17889.vasp,Ta2Sn2P2,-3.8688713850000003,-0.26509603333333687 -Os1Se1Br1_156_13823.vasp,OsSeBr,-2.36216282,0.40489379499999734 -Lu2Sb2S4O2_12_10316.vasp,Lu2Sb2S4O2,-4.3282075650000005,0.04412236424999483 -Ta6Tl4Cl18_12_18161.vasp,Ta6Tl4Cl18,-2.914167595,0.08026298696428213 -Al4Sb4_14_1091.vasp,Al4Sb4,-2.29223522875,-0.74335230375 -In4I4_51_8676.vasp,In4I4,-0.60775536125,0.39017540875 -Ta3H2S2N2_187_17963.vasp,Ta3H2S2N2,-5.851841748888889,0.9103068001851788 -Si2As2S6_2_16382.vasp,Si2As2S6,-3.410662306,0.1220312133749979 -Na2H6C4O6_2_12116.vasp,Na2H6C4O6,-5.008662502777778,0.13106202912035947 -Ga2Ni1Te4_164_6401.vasp,Ga2NiTe4,-1.3416001185714286,0.08001082761904654 -Ga1Cu1S1I1Br1Cl1_1_6166.vasp,GaCuSIBrCl,-1.0140543516666667,0.21048349562716717 -K2B2H6S8_1_8990.vasp,K2B2H6S8,-2.9607284650000003,0.3440104016512311 -Bi2I6_162_2467.vasp,Bi2I6,-0.4151986825,0.07455534374999995 -Cs1Sn1Te2_156_4652.vasp,CsSnTe2,-0.8924578325,-0.012017529374999862 -Mg1In2Te4_164_10383.vasp,MgIn2Te4,-1.4241142614285713,0.05614066714285726 -Rh2I2O2_59_15195.vasp,Rh2I2O2,-2.223232943333333,0.28738135583333135 -In2Ge2Te6_162_8454.vasp,In2Ge2Te6,-1.714752085,-0.2950113640000013 -Tl6Sb2S8_1_19645.vasp,Tl6Sb2S8,-1.8590393675,0.08359101874999997 -Cr2P2S6_162_4451.vasp,Cr2P2S6,-3.4281014759999997,0.03654923374999708 -Ni1H4C6N2F2_25_13350.vasp,NiH4C6N2F2,-5.197580619333333,0.4380464316666547 -Pd2S4F2_6_14476.vasp,Pd2S4F2,-1.8721557625,0.3333942435156252 -K2H6C8N2O2_51_9147.vasp,K2H6C8N2O2,-4.6082167625,-0.20896631783333364 -Ca2Cl2_129_2978.vasp,Ca2Cl2,-1.5175288325,0.31268332624999995 -W2Cl10_6_20480.vasp,W2Cl10,-1.6853109216666666,0.3286038058333315 -Ce2S6_129_3676.vasp,Ce2S6,-3.7046601725,0.19581322171874982 -Zn1H16Au2C8N8_10_20946.vasp,ZnH16Au2C8N8,-4.8774347574285715,-2.733021691833343 -Ru2O2_164_15331.vasp,Ru2O2,-4.11085185,0.6614198899999997 -Al1P2Au1S6_149_704.vasp,AlP2AuS6,-2.9003191090000002,0.08005076199999794 -Mn1V1Ag1Br8_1_10919.vasp,MnVAgBr8,-0.9306472890909091,0.09031678681818056 -Nb6S18_11_13194.vasp,Nb6S18,-4.389573136666667,-0.0170628830729167 -Mg2Mo2Se2S12_18_10484.vasp,Mg2Mo2Se2S12,-2.605084922777778,0.2358645312731456 -In2H4Se2O8_11_8467.vasp,In2H4Se2O8,-3.65661682375,0.3264977221093755 -Ag4Te2O12_14_568.vasp,Ag4Te2O12,-2.445493915,0.24595066972221946 -Cs2B2S6_1_4661.vasp,Cs2B2S6,-3.014473401,0.3477465934999997 -Bi4Pb3_5_2633.vasp,Bi4Pb3,-0.8909808542857143,-0.05497652000000075 -Ba4Sb4Se8F4_2_2184.vasp,Ba4Sb4Se8F4,-2.8865008325000003,0.07370603887500016 -Tc3F8_1_18241.vasp,Tc3F8,-3.6091061672727274,0.25017932590908365 -Pt2Cl4_11_14614.vasp,Pt2Cl4,-0.7486452666666666,0.36939479500000016 -Ca3Co2S5Br2_123_3163.vasp,Ca3Co2S5Br2,-2.4767773383333336,0.1955847544791639 -Y1Sn1Se1S1Br1Cl1_25_20678.vasp,YSnSeSBrCl,-2.93643061,0.080869751145828 -Ti3S2_123_19102.vasp,Ti3S2,-5.817133935999999,-0.24705183916667117 -Sr4Cr2S2O6_1_17421.vasp,Sr4Cr2S2O6,-4.326221031428571,-0.055282523333341604 -Te2As2O10F2_4_18354.vasp,Te2As2O10F2,-3.409010225625,0.3414963290885389 -Mn1Ag1Br2O2_1_10607.vasp,MnAgBr2O2,-1.9386490500000002,0.13693002986110886 -Co1H4C6F2_47_3760.vasp,CoH4C6F2,-5.050457902307692,0.3463455276923023 -Cr4H2C3S2_164_4602.vasp,Cr4H2C3S2,-4.267576137272727,0.44423663727272067 -Fe3S2N2F2_187_6061.vasp,Fe3S2N2F2,-2.6462125666666667,0.37022271944444174 -Mn3C2O2F2_187_11363.vasp,Mn3C2O2F2,-3.406902572222222,1.0820804988888801 -Ti2P4O12_11_18984.vasp,Ti2P4O12,-6.046897997222222,0.09894337999998837 -Zr2Tl2Cu2Se6_51_21727.vasp,Zr2Tl2Cu2Se6,-2.3987955875,0.13893494583333332 -Li2Te2O6_3_10085.vasp,Li2Te2O6,-3.763309039,0.2320793626249964 -Bi2N2_1_2479.vasp,Bi2N2,-3.5295739075,-0.5292645987499998 -Al4P4_127_1082.vasp,Al4P4,-3.12097806125,-0.18637606625000025 -Co1Mo1Se2_115_3781.vasp,CoMoSe2,-2.3837260675,0.31905862250000006 -Ta2Br6_189_17673.vasp,Ta2Br6,-2.46223099625,0.3055133848437501 -V2Br10_51_19998.vasp,V2Br10,-0.9657987691666667,0.1980008591666662 -Sb2Mo2O10_13_15602.vasp,Sb2Mo2O10,-4.622163023571429,0.21354188958332876 -Ba2Tl1Cd1Ag1O5_99_2077.vasp,Ba2TlCdAgO5,-2.4314277140000002,0.37940878141666157 -Ge2Se2F2_59_6867.vasp,Ge2Se2F2,-2.5850286783333334,0.28938434611111097 -Ca2H8Se2O12_13_3049.vasp,Ca2H8Se2O12,-4.17870294125,0.04099956888888867 -Ce2Mg4_12_3670.vasp,Ce2Mg4,-0.49640638666666664,0.5263176183333325 -Al2Ni2Se5_156_905.vasp,Al2Ni2Se5,-1.9940233333333335,0.0001760411111088045 -Ti1N2_164_18806.vasp,TiN2,-6.472559633333333,0.6229444574999947 -Zn2Hg3Se6Br2_164_21106.vasp,Zn2Hg3Se6Br2,-0.047871540000000004,0.3915434528205106 -Os2O6_2_13864.vasp,Os2O6,-4.6989643925,0.12336263583332885 -Ti3H2Se2N2_1_19089.vasp,Ti3H2Se2N2,-5.532894227777778,0.5309378094444384 -Mo1P4O13_1_11535.vasp,MoP4O13,-5.354968323333334,0.12107458499998902 -Li2V2Si2O8_11_10127.vasp,Li2V2Si2O8,-5.567119585,0.19801460928570824 -In1Sb1_156_8334.vasp,InSb,-1.106049185,-0.34416840000000004 -Sb1O2_191_15473.vasp,SbO2,-2.5239455866666667,1.8941312804166666 -Gd2Sb2S4O2_129_6625.vasp,Gd2Sb2S4O2,-4.346689082,-0.0010283218333380084 -P2Pd2Se5_8_14025.vasp,P2Pd2Se5,-2.2383788533333333,0.456260939444442 -Cu2Hg2S2I2_26_5157.vasp,Cu2Hg2S2I2,0.01745166375,0.09272112583333336 -Ga1Ag1Sb2Te6_149_6124.vasp,GaAgSb2Te6,-1.196581988,0.3359622101666651 -Ga2S3_189_6451.vasp,Ga2S3,-2.57983528,0.3412822099999997 -Li6C3_12_10263.vasp,Li6C3,-3.625537108888889,0.16785402814814426 -Si1Sn1S2_6_16369.vasp,SiSnS2,-2.876573215,-0.61751217125 -Li1W2Cl6O2_47_9812.vasp,LiW2Cl6O2,-3.3104784072727274,0.017521269772721837 -Hf1N1F2_1_7238.vasp,HfNF2,-5.1353092175,0.8270600629166601 -Co2Cu1O4_187_3895.vasp,Co2CuO4,-3.442514807142857,-0.2745520019642916 -Fe2S4Cl2_11_5940.vasp,Fe2S4Cl2,-1.89502792375,-0.10425992933593753 -Nb3Se1F7_156_13011.vasp,Nb3SeF7,-4.3085146454545455,0.10235444056817844 -Cr1Cu1As2S6_5_4148.vasp,CrCuAs2S6,-2.559447991,0.49527920122916463 -Hf2C2I2_2_7469.vasp,Hf2C2I2,-5.089668465,0.34491999791666317 -Zr4C3S2F2_164_21814.vasp,Zr4C3S2F2,-5.222489148181818,0.7635743917992321 -Ag2C2S4O12F6_7_226.vasp,Ag2C2S4O12F6,-3.6149730934615385,0.141949345480761 -Ca2Gd2Cu2Cl2O6_129_3021.vasp,Ca2Gd2Cu2Cl2O6,-4.102563690714286,0.0765948009821382 -Na2H6C8S2N2_51_12122.vasp,Na2H6C8S2N2,-4.4605067245,1.0589151304999898 -Sn2Se2_12_16883.vasp,Sn2Se2,-1.7828689925,-0.20659061750000007 -Nb2Se2Cl2_59_12870.vasp,Nb2Se2Cl2,-3.7523262233333337,-0.16039525869048354 -Zr3H2N2O2_187_21766.vasp,Zr3H2N2O2,-6.015751014444444,0.5617856499999947 -V1In2S4_164_19873.vasp,VIn2S4,-2.725560817142857,0.2490994228571406 -Cd2Se2_164_3574.vasp,Cd2Se2,0.00973488,-0.373732705 -Ag1Te1Pb1I1_1_141.vasp,AgTePbI,-0.37867934,-0.14133846958333326 -Nb2I2_12_12748.vasp,Nb2I2,-2.777304005,0.6137324337499999 -Sn1S2Br2_10_16678.vasp,SnS2Br2,-1.63492846,0.11242041075000031 -Hf1Mn1Cl6_149_7211.vasp,HfMnCl6,-2.60602492,-0.09920824187499999 -Si1Cl2_164_16326.vasp,SiCl2,-1.9658900333333333,0.36543860499999725 -Hg4C4N8_29_8071.vasp,Hg4C4N8,-4.291607740625,0.006728882614936094 -Pd2S2I2_59_14462.vasp,Pd2S2I2,-1.145330145,0.15918044083333338 -Cd2S4_12_3551.vasp,Cd2S4,-1.0026258633333334,0.36427821062499877 -Zn4Sn4O8_1_21230.vasp,Zn4Sn4O8,-2.755481419375,0.2445354987499999 -V3C2Cl2_187_20248.vasp,V3C2Cl2,-4.509051931428571,0.16622018232803282 -Ca1Cl2_187_2819.vasp,CaCl2,-2.1968119733333333,0.03141916499999997 -Re1H6Au2_8_15003.vasp,ReH6Au2,-2.518912908888889,1.886557438888885 -Al4P6S18_150_1083.vasp,Al4P6S18,-3.4191567057142858,0.03844330673549179 -P8S6_26_14155.vasp,P8S6,-3.5044468749999997,0.10113204339285753 -Ni1B4H4Br2N2_47_13268.vasp,NiB4H4Br2N2,-3.8846711592307694,0.5202273825884521 -Co1C4N2F6_47_3715.vasp,CoC4N2F6,-4.537372436923077,0.10344214269229385 -Ge3P4_5_6916.vasp,Ge3P4,-3.4512020314285716,-0.20792905785714577 -As2Pd2Se5_8_1271.vasp,As2Pd2Se5,-2.0057107944444446,0.2756440489999977 -Sr3Fe2S5Cl2_123_17379.vasp,Sr3Fe2S5Cl2,-2.5041180733333332,-0.09408413208333544 -Ba2C1_164_1931.vasp,Ba2C,-1.9289290166666666,1.060859514722216 -Na1Al1Sb2O6_5_11815.vasp,NaAlSb2O6,-4.017219241,0.6727454863749998 -Ni2Te2_129_13667.vasp,Ni2Te2,-0.3111422525,0.25193467249999957 -Co2Br2N2_59_3874.vasp,Co2Br2N2,-2.815039561666667,-0.18187456416666925 -Pt2Br6_191_14607.vasp,Pt2Br6,-0.15576762,0.50467545 -Pt1I2_187_14576.vasp,PtI2,0.07703028666666667,0.5923858716666667 -Nb2Te6P2_2_12926.vasp,Nb2Te6P2,-2.921172531,0.47971012400000046 -In2Br4_6_8391.vasp,In2Br4,-0.9251034416666667,0.10634676875000004 -Te4Se2O14_31_18630.vasp,Te4Se2O14,-3.543140789,0.12359627012500018 -Mo2Cl2_129_11596.vasp,Mo2Cl2,-1.421206015,1.6444803183333334 -Sr4Mn2S2O6_129_17447.vasp,Sr4Mn2S2O6,-4.057015582142857,-0.10698182317734983 -K4P2Pd1S8_2_9488.vasp,K4P2PdS8,-2.423051416,0.15736023066666682 -B2C4N2_5_1659.vasp,B2C4N2,-7.24941067,0.7101899062500006 -Sn1S2F2_12_16679.vasp,SnS2F2,-1.797365066,0.8690956713125004 -V2Au1O6_12_19983.vasp,V2AuO6,-4.400235455555556,0.11364743555554835 -Sr2Ce1_187_17176.vasp,Sr2Ce,0.03816492666666667,1.0110668283333324 -Ca2Sb1_25_3116.vasp,Ca2Sb,-0.41739675333333337,0.9851624433333335 -Ti2Te2P1_164_19041.vasp,Ti2Te2P,-4.666339798,0.060074099999999575 -Li4Se4S8_13_10228.vasp,Li4Se4S8,-2.52430724,0.14687640934895818 -Pr1Pb5_47_14533.vasp,PrPb5,-1.0026630583333334,0.28880973666666554 -K1Bi2F7_1_8881.vasp,KBi2F7,-2.3965660140000002,0.3578333587499998 -Ca3Ag2I2O4_123_3144.vasp,Ca3Ag2I2O4,-2.4756285936363636,-0.06785308145454683 -Ta2C2Cl2_59_17683.vasp,Ta2C2Cl2,-5.87503939,0.11838367533332228 -Rb2Os2N2O2F10_11_14912.vasp,Rb2Os2N2O2F10,-3.2894071661111113,-0.20197567747476064 -Ta2Te1S3I2_1_17897.vasp,Ta2TeS3I2,-3.426285875,0.3499463251627592 -Sm2Br2O2_129_16566.vasp,Sm2Br2O2,-4.790991151666667,0.06443882333333306 -Te2Pt2Br2_59_18481.vasp,Te2Pt2Br2,-1.2977448483333334,-0.16006306083333333 -Sr2Ni1O3_38_17286.vasp,Sr2NiO3,-3.581212368333333,-0.2883704033333361 -Ta2B1Cl2_164_17651.vasp,Ta2BCl2,-5.272929238,-0.21993564249999942 -Sn2P2H2O8_7_16811.vasp,Sn2P2H2O8,-4.8467886671428575,0.07797013964285604 -Hf1I2_115_7199.vasp,HfI2,-1.8592364466666667,0.8579517999999973 -Cd1H12C12I2N6_2_3323.vasp,CdH12C12I2N6,-5.301972006060606,0.21565547429291418 -Li2H2O2_129_9928.vasp,Li2H2O2,-4.214716916666666,0.026986216666666785 -Cu4I8_13_5429.vasp,Cu4I8,0.37991518416666664,0.18241759347222236 -Co2Te6_11_4052.vasp,Co2Te6,-1.46978448375,0.15623943624999997 -Ga2H2S2O8_11_6377.vasp,Ga2H2S2O8,-4.354075772142857,-0.20419033720238844 -Tl1In1S2Br2_1_19298.vasp,TlInS2Br2,-1.3993708783333334,0.16249975447916482 -Pb1Se1_123_14205.vasp,PbSe,-1.40971196,0.5402521834374998 -Bi1S1Cl1_156_2367.vasp,BiSCl,-1.8416257633333333,0.1866484075000001 -Ba2Te2Au1Cl2_38_2065.vasp,Ba2Te2AuCl2,-1.5338817471428572,0.4345496689732108 -Bi2Te2S1_10_2561.vasp,Bi2Te2S,-1.48048593,0.42291387199999986 -Cd2Si1O4_21_3576.vasp,Cd2SiO4,-3.1419167285714282,0.574267385357143 -Hf1Bi1Se1Br1O2_1_7118.vasp,HfBiSeBrO2,-4.183001548333333,0.5291599275 -Co3Te4_164_4075.vasp,Co3Te4,-1.6527190185714284,-0.004216313333334609 -U2Si4_12_19728.vasp,U2Si4,-5.430728101666666,0.5732587689583264 -Pr2Bi2S4O2_129_14540.vasp,Pr2Bi2S4O2,-4.1861065250000005,0.0024411468333291886 -Sn2S2I2_59_16839.vasp,Sn2S2I2,-1.5130107066666667,0.15134187222222217 -Mn2Mo2O10_12_11140.vasp,Mn2Mo2O10,-4.695494071428572,-0.08675699946428866 -Ag2Se4Br2_17_440.vasp,Ag2Se4Br2,-0.81693065875,0.2890505554166666 -Co2Mo2Br2O8_129_3930.vasp,Co2Mo2Br2O8,-3.8544929114285713,0.11685297696427893 -Ca1I2_187_2850.vasp,CaI2,-1.09590333,0.17670793466666646 -Cd2S1Br1_8_3538.vasp,Cd2SBr,0.321523805,0.3480873353125 -Lu1C2_123_10292.vasp,LuC2,-5.5880284966666665,0.8757480333333272 -Nb2Pd1Se6_12_12813.vasp,Nb2PdSe6,-3.4109028266666663,0.09995868666666707 -Ca1H12Au2_115_2840.vasp,CaH12Au2,-2.332797038666667,1.4634511913809467 -Ta3S1I7_156_17984.vasp,Ta3SI7,-2.5644178209090907,0.047259678806814476 -Tl2Si2Te6_162_19543.vasp,Tl2Si2Te6,-1.597524134,0.18076551850000033 -Al2Ru1_123_931.vasp,Al2Ru,-3.0297187300000004,0.51099462 -Sr2H8Cl4O4_53_17242.vasp,Sr2H8Cl4O4,-3.63389914,0.03680942462962644 -Ti4N3F2_164_19144.vasp,Ti4N3F2,-7.197392312222222,-0.3822742040740801 -V2F10_51_20056.vasp,V2F10,-2.656175629166667,0.45738381562499963 -Cd1Sb1I1Br1O2_1_3419.vasp,CdSbIBrO2,-1.8385593199999999,0.23657289055555575 -Sc2H2C1O2_164_16077.vasp,Sc2H2CO2,-5.274639585714286,0.41511164321428184 -As2Pb2S6_147_1260.vasp,As2Pb2S6,-2.5521019750000002,0.32061049929860475 -Ga2O3_164_6421.vasp,Ga2O3,-4.461469582,-0.39338528475000367 -Sr3Ni2I2O5_123_17392.vasp,Sr3Ni2I2O5,-2.909317103333333,-0.20040386744791938 -Tl2O3_189_19474.vasp,Tl2O3,-1.857544858,0.8526203205 -Zr1Nb4Te8W1N5O1_1_21370.vasp,ZrNb4Te8WN5O,-4.817551544,0.18332503047916104 -Al2Pd1S4_164_929.vasp,Al2PdS4,-3.0736210257142855,0.20019775696428388 -Nb3Te6_12_13031.vasp,Nb3Te6,-3.3036187100000003,0.08530165111111065 -Sc2Br2_164_16043.vasp,Sc2Br2,-2.2770298275,0.18780793166666432 -Mn2W2S8Cl2_129_11343.vasp,Mn2W2S8Cl2,-2.858484652857143,0.5373227200892798 -Ge1Te2W1_25_6717.vasp,GeTe2W,-2.6676642025,0.082981588125 -Mg1O2_12_10392.vasp,MgO2,-3.1330930566666666,0.5906336454166636 -Mo2H2N1_164_11614.vasp,Mo2H2N,-4.04294048,-1.6695753827777817 -Te2Ir2Br2_11_18388.vasp,Te2Ir2Br2,-1.87308949,0.2087675155555524 -In1Se1Br2_1_8340.vasp,InSeBr2,-0.947499415,0.4155100822916667 -Ir1O2_164_8743.vasp,IrO2,-4.0195569566666665,0.624785066666667 -Fe1H4C6I2N2_25_5703.vasp,FeH4C6I2N2,-5.087229643333333,0.10247954458332842 -Ga2Fe1Te4_164_6352.vasp,Ga2FeTe4,-1.661367837142857,0.1411402497619032 -Nb2Fe4Se4_51_12722.vasp,Nb2Fe4Se4,-2.645000112,0.7804689965000007 -Zn1Hg1Se1O1_1_20957.vasp,ZnHgSeO,-0.5081198825,0.19698258624999987 -Ga2Se2F2_59_6470.vasp,Ga2Se2F2,-2.377251693333333,0.24811141833333106 -Ta2Pd1Se6_12_17826.vasp,Ta2PdSe6,-3.695214733333333,0.08770885333333389 -Ta2W2S11_1_17936.vasp,Ta2W2S11,-4.2070275666666666,0.2988223706249973 -Hg8As2I10_39_8103.vasp,Hg8As2I10,0.687413464,0.019548970333334137 -In1Ga1Te2_156_8260.vasp,InGaTe2,-1.53076553,0.1283390879166667 -K2Mg1H4S8O2_2_9217.vasp,K2MgH4S8O2,-2.714330956470588,0.38769846507352657 -In3Fe2_123_8646.vasp,In3Fe2,-0.296529398,2.0937741780000003 -Cr3S2N2_187_4578.vasp,Cr3S2N2,-4.495628745714286,0.012389068571424966 -Ag4Pd2Cl8_53_538.vasp,Ag4Pd2Cl8,-0.31649407571428567,0.1326021961904757 -Se1O3_187_16284.vasp,SeO3,-2.7451009325,0.7342271709374997 -Hf1Zr1Sc2Cl2O5_1_7397.vasp,HfZrSc2Cl2O5,-5.596933587272727,0.43617293439392757 -Ge3P2O9_174_6914.vasp,Ge3P2O9,-4.908940904285714,0.2006045813690447 -Sr3C1_25_17357.vasp,Sr3C,-0.57902543,1.6833462406249955 -Ni2H2O4_11_13510.vasp,Ni2H2O4,-3.25672452625,-0.30932542473958335 -Sb4Se2S12_4_15824.vasp,Sb4Se2S12,-2.341843343888889,0.29732880212962726 -Rb2Os2N2Cl8O4_7_14911.vasp,Rb2Os2N2Cl8O4,-2.7552436494444446,-0.014816561865081956 -Pb2Se2O8_31_14290.vasp,Pb2Se2O8,-3.5002075666666665,0.1868079820833337 -Mn2Sb2S4Cl2_26_11239.vasp,Mn2Sb2S4Cl2,-2.401936932,0.23195941841666454 -Mn2Te2Br2_59_11294.vasp,Mn2Te2Br2,-1.3780468,0.15118475541666676 -Sn1C1Cl3_156_16622.vasp,SnCCl3,-1.331916724,1.409850176 -Fe2C2F2_59_5832.vasp,Fe2C2F2,-3.2157574883333333,1.2118885266666628 -Tb2C2Br2_12_18188.vasp,Tb2C2Br2,-4.5238503366666665,0.027968020000000315 -Sb8Se8S4_2_15880.vasp,Sb8Se8S4,-2.2902079855,0.2182029411666646 -Ta2Ni4Te6_11_17807.vasp,Ta2Ni4Te6,-1.9669925741666667,0.09683497083333337 -Ca2La2I10_51_3061.vasp,Ca2La2I10,-1.454693592142857,0.17457049985714168 -Fe2H2S2N1_164_5854.vasp,Fe2H2S2N,-3.048789542857143,-1.75280463821429 -In3S4_164_8656.vasp,In3S4,-2.42178132,0.03286757214285507 -Hf1Co1S2Br2_6_7151.vasp,HfCoS2Br2,-3.1375601866666667,0.20720312284721443 -Sb2Te6Pb2_147_15739.vasp,Sb2Te6Pb2,-1.4030524979999999,-0.3470279553333348 -Na4C1O4_38_12373.vasp,Na4CO4,-3.8581709666666666,0.24715191333332986 -P4Se6_7_14125.vasp,P4Se6,-2.7371389529999997,0.17960715341666494 -As2Pt2S6_12_1278.vasp,As2Pt2S6,-2.635440408,0.40600273684999655 -Ba1Sb4O8_162_1856.vasp,BaSb4O8,-4.022048046923077,0.3977378191025602 -Ta4C3O2_164_18013.vasp,Ta4C3O2,-8.062123746666666,-0.13669597777778497 -Ti2N1_164_18967.vasp,Ti2N,-6.9239588633333335,1.1427122583333338 -Sc1Se2_187_15999.vasp,ScSe2,-3.117006643333333,0.5585206872222195 -Os2S2_164_13871.vasp,Os2S2,-4.011453135,0.6842469718749999 -Sr3Cr2S2O5_123_17365.vasp,Sr3Cr2S2O5,-4.337104629166666,-0.02539945722223047 -C4O10_30_2765.vasp,C4O10,-5.0928226485714285,0.6959969394642831 -Ti1Ag1Se2_156_18737.vasp,TiAgSe2,-2.8311767575,0.35112497125 -Ta2Nb1Se1Cl4_10_17784.vasp,Ta2NbSeCl4,-3.5713869275,0.5306369038541638 -Hf2S2_129_7573.vasp,Hf2S2,-4.83993231,0.5652243600000002 -Ta4Co2O10_59_18020.vasp,Ta4Co2O10,-6.277482745,0.27176598749999936 -Al2Se2I2_59_966.vasp,Al2Se2I2,-2.046467345,0.05773117916666681 -Cd2Te6As2_147_3600.vasp,Cd2Te6As2,-0.8808400369999999,-0.014674057833334808 -Cs2S2N2O6F6_4_4778.vasp,Cs2S2N2O6F6,-2.9785366694444444,0.4043940283333287 -K2Mn1As2S7Cl3_1_9232.vasp,K2MnAs2S7Cl3,-2.17350325,0.42005844962499195 -Hf2S2_187_7574.vasp,Hf2S2,-4.99668023,0.4084764400000003 -Cd2Te2H4S8_31_3592.vasp,Cd2Te2H4S8,-2.0901283475,0.15812073192708334 -Pt1F2_187_14573.vasp,PtF2,-0.5784545333333333,1.239146399166664 -Tl2Fe1_123_19415.vasp,Tl2Fe,0.5278109633333333,1.1128887699999994 -Mn2As2O6_162_10970.vasp,Mn2As2O6,-4.06595171,0.22512452368420677 -Bi12Se12_7_2301.vasp,Bi12Se12,-1.6642799295833333,0.1704578279166656 -P8S8O4_2_14156.vasp,P8S8O4,-3.710950241,0.3047060578499954 -Ni2H8N4O16_14_13520.vasp,Ni2H8N4O16,-4.178668754333334,-0.0757365060000037 -Ta2S4Br4_12_17858.vasp,Ta2S4Br4,-3.3306341789999996,0.07607187965078988 -W3S2N2_187_20571.vasp,W3S2N2,-5.623059168571428,-0.2956154509523854 -Ga1Pd5Cl2_123_6240.vasp,GaPd5Cl2,-1.10270621375,0.05884083623203909 -Hf1I2_187_7201.vasp,HfI2,-2.3204135766666667,0.396774669999997 -Cu1Te2As1S1_1_4992.vasp,CuTe2AsS,-1.435682158,0.4103192576666669 -In2Pt4Se6_164_8535.vasp,In2Pt4Se6,-2.006298828333333,0.17052532750000005 -Ge8Pd2_125_6973.vasp,Ge8Pd2,-2.630716514,-0.20472419299999967 -Ni1B4N2Cl2F4_47_13274.vasp,NiB4N2Cl2F4,-4.067364471538462,0.48672443487178674 -As8C4_26_1394.vasp,As8C4,-4.241947801666667,0.6042837083333286 -Sb2H2Pb2S6_7_15582.vasp,Sb2H2Pb2S6,-2.413984975,0.0004542289583315817 -Sc1I2_123_15944.vasp,ScI2,-1.45204853,0.2931802472222206 -Ni2Se2Br2_59_13630.vasp,Ni2Se2Br2,-0.7392208416666667,-0.019793295000000044 -Ta4I16_1_18055.vasp,Ta4I16,-1.5358774505,0.15331671771875022 -Zr1Br1F1_156_21265.vasp,ZrBrF,-3.297770526666667,0.303526302083329 -Li2Tl2_187_10100.vasp,Li2Tl2,-0.22408975,1.98578264 -In2S2Br1Cl1_6_8541.vasp,In2S2BrCl,-1.8904672416666666,0.06435537874999786 -Ti1Ni1Br3Cl3_1_18808.vasp,TiNiBr3Cl3,-1.70771200125,-0.04836007625000005 -Al2Br2O2_59_773.vasp,Al2Br2O2,-4.108132605,0.03187925833332894 -Mn2Nb4Zn4O16_13_11166.vasp,Mn2Nb4Zn4O16,-4.9651910784615385,0.11710025403845825 -Mn1Zn1Br1Cl1_1_10936.vasp,MnZnBrCl,-0.214088665,0.5976412751427802 -Fe1Bi2Te4_164_5634.vasp,FeBi2Te4,-1.4159696571428573,0.20818493892856949 -Mn2Mo2Se2S12_8_11149.vasp,Mn2Mo2Se2S12,-2.705833689444445,0.5080160927314783 -Cu2Mo1O4_1_5183.vasp,Cu2MoO4,-3.3176770671428573,0.4102969111904744 -In4O6_164_8678.vasp,In4O6,-3.822365166,0.21637280624999988 -Ba2Te2S8O14_11_2068.vasp,Ba2Te2S8O14,-3.9379866292307693,0.27412603868589014 -Mn2As2Br2O4_26_10962.vasp,Mn2As2Br2O4,-3.338190537,0.04349509901315046 -Sc2Te6_129_16188.vasp,Sc2Te6,-2.294155975,0.22006187062500016 -B2Sb2O6_5_1706.vasp,B2Sb2O6,-5.431543107,0.1526392481666612 -Mn1In2Te4_156_10789.vasp,MnIn2Te4,-1.33836749,0.21412154428571284 -Ta1Te2_187_17631.vasp,TaTe2,-3.633536016666667,0.11434735222222203 -Bi2I2_129_2465.vasp,Bi2I2,-0.3925659725,0.08955937666666616 -Cd1I1Br1_156_3364.vasp,CdIBr,0.31151598333333336,0.0437035373611111 -Al1Ni2_187_694.vasp,AlNi2,-0.08319322999999999,0.7133743741666667 -Y2In2Cl2_164_20752.vasp,Y2In2Cl2,-2.798022795,0.2502953505555525 -Zr1Ti1Ni1I1N1Cl1O2_1_21472.vasp,ZrTiNiINClO2,-4.54400877875,0.24570764164062456 -Ag1Au1S2_25_12.vasp,AgAuS2,-0.59470147,0.3953072949218751 -V2N1F2_164_20110.vasp,V2NF2,-4.613085656,-0.1682789611111164 -Na4P4S8_14_12404.vasp,Na4P4S8,-2.923865980625,0.15999912986606857 -C3N1_47_2760.vasp,C3N,-5.90615882,1.9127594162500001 -Au2Br6_162_1459.vasp,Au2Br6,0.35724791,0.23339833625 -Ti4N3Cl2_164_19143.vasp,Ti4N3Cl2,-6.779098752222222,-0.1558764155555612 -Y2Br2O2_164_20700.vasp,Y2Br2O2,-5.460375421666666,0.03424404166666761 -In1Sn1S2Cl1_25_8360.vasp,InSnS2Cl,-1.9201834080000002,0.3085008152499958 -Sr2Fe4S4O2_59_17222.vasp,Sr2Fe4S4O2,-2.4189311383333334,0.5656713766666647 -Mg2Te2W2S12_18_10524.vasp,Mg2Te2W2S12,-2.945340626666667,0.04930186053240454 -V1Te2_187_19944.vasp,VTe2,-2.23911583,0.1281252277777778 -P12O24_1_13904.vasp,P12O24,-5.188148432222222,0.20541174011110763 -Cs2Cd4Te2O6F6_31_4702.vasp,Cs2Cd4Te2O6F6,-1.8423021529999999,0.44598364912499744 -Tc4O14_14_18253.vasp,Tc4O14,-5.675303495555556,-0.04254144666666715 -Bi2Se1S2_1_2537.vasp,Bi2SeS2,-2.316454984,-0.4656499904999998 -Ce1P2H2O6_164_3649.vasp,CeP2H2O6,-5.237208750909091,0.3447957580151426 -Si1Se1_123_16364.vasp,SiSe,-2.48791666,0.6036894401562504 -Cr1Cl5_1_4144.vasp,CrCl5,-1.1533207566666668,0.03719762583333218 -Co2S2Cl2_59_3977.vasp,Co2S2Cl2,-2.1975537716666667,0.08308673333333338 -Ni2Mo2S8I2_129_13538.vasp,Ni2Mo2S8I2,-1.7533877507142857,0.5963146290178546 -Cr2Te4_11_4529.vasp,Cr2Te4,-1.8580221116666669,0.08502402722222224 -Ag2Sb4S3I2_6_413.vasp,Ag2Sb4S3I2,-1.3714329363636364,0.19194947499999698 -Hf1O1F2_25_7249.vasp,HfOF2,-5.7355242,0.2645595937499996 -Zr2P4H4O16_4_21630.vasp,Zr2P4H4O16,-5.7564000253846155,0.05123711730769287 -Sb4Au4_51_15770.vasp,Sb4Au4,-0.51911992875,0.9923122012499999 -Ge2Sb2H2O6_7_6843.vasp,Ge2Sb2H2O6,-3.95735738,0.4168484498958336 -Na2Cl2_129_12056.vasp,Na2Cl2,-1.853052415,0.2280964406249999 -Na2H8C6N6O8_2_12135.vasp,Na2H8C6N6O8,-5.601132392333333,-0.15497321908334416 -Ag2Se2_129_435.vasp,Ag2Se2,-0.2798987525,0.007057255000000012 -Fe2C2Cl2_59_5831.vasp,Fe2C2Cl2,-2.643488646666667,1.2604033283333294 -Ir2Se4_11_8846.vasp,Ir2Se4,-2.6701358583333334,-0.31704910249999996 -Co2H2Se4_6_3912.vasp,Co2H2Se4,-2.4469827625,0.6207475429166669 -Rh1O2_47_15159.vasp,RhO2,-3.1099007800000003,1.0207390783333326 -Nb3Te2Se1S1I2Br1_1_13028.vasp,Nb3Te2SeSI2Br,-2.957852055,0.2862602676944337 -Nb4Cl16_14_13051.vasp,Nb4Cl16,-2.526592817,0.1873006235000001 -Gd2N2O10_4_6621.vasp,Gd2N2O10,-5.019004880714285,0.14467470607142408 -Mn1Fe2N12_12_10714.vasp,MnFe2N12,-5.566122116666667,-0.4004755356111147 -Be1Cl2_164_2219.vasp,BeCl2,-2.3679586166666664,0.2820447966666668 -Fe2P2Cl2O4_26_5903.vasp,Fe2P2Cl2O4,-3.64057246,0.35443738085713905 -Fe2Sb2O4F2_26_5948.vasp,Fe2Sb2O4F2,-3.5420938810000004,0.1420747662499977 -Nb1F5_47_12508.vasp,NbF5,-3.7139182466666667,0.36092961999999984 -K2H6C2N8O2_51_9135.vasp,K2H6C2N8O2,-5.080036252499999,-1.7741551410208374 -Cu2Sb4Te3F2_6_5286.vasp,Cu2Sb4Te3F2,-1.3258136772727271,0.8344408657575717 -Tl2Au1Se4_2_19367.vasp,Tl2AuSe4,-1.0367639728571427,0.31360500190475915 -Nb2Te2Pd4S2_51_12911.vasp,Nb2Te2Pd4S2,-2.814148488,-0.09685141920454854 -Ti2O6_59_18978.vasp,Ti2O6,-6.13616574375,0.1510160990624998 -Bi2O2_187_2483.vasp,Bi2O2,-2.9656973925,0.3271091299999984 -Fe1H4C4I2N2_47_5699.vasp,FeH4C4I2N2,-4.711844041538462,0.02761649682690792 -Ba2Cd1_123_1944.vasp,Ba2Cd,0.9307663266666667,0.24311826000000003 -W1C3_187_20425.vasp,WC3,-5.602505105,1.7698720675000001 -Sc2O2_129_16112.vasp,Sc2O2,-5.2713851675,0.61932308046875 -Ca3Fe2S5Cl2_123_3177.vasp,Ca3Fe2S5Cl2,-2.4171280283333334,-0.06385738833333576 -K2H6Pb1O6_147_9151.vasp,K2H6PbO6,-3.6857553,0.038101102000000164 -Au2Br2_129_1452.vasp,Au2Br2,0.54512016,0.24613024374999998 -Mg2V8O18_85_10533.vasp,Mg2V8O18,-5.317716907857142,0.182389314999996 -Ta4Fe4S8_53_18040.vasp,Ta4Fe4S8,-3.8572800475,0.7437832195833298 -Zr2Br2O2_59_21522.vasp,Zr2Br2O2,-4.71444062,0.20441003833333315 -Ti2S2Br1Cl1_1_18993.vasp,Ti2S2BrCl,-4.267169218333334,-0.012116387833341236 -Bi2Te2_187_2565.vasp,Bi2Te2,-1.0831157525,0.43672124749999996 -Pb2Br4_12_14223.vasp,Pb2Br4,-1.0161227933333332,0.17780121666666693 -Sc4C3S2_164_16233.vasp,Sc4C3S2,-4.879429994444445,0.7473737311111046 -Ga1Ag1Br4Cl2_1_6113.vasp,GaAgBr4Cl2,-0.55277771375,0.18392240520833336 -Ta1Br2_187_17520.vasp,TaBr2,-2.8499859433333334,0.5596382730952316 -Mn1Ge2S3I1Br1_8_10755.vasp,MnGe2S3IBr,-2.2815216525,-0.027511809804687426 -Cu1Te1Cl1_6_4987.vasp,CuTeCl,-0.47702566333333335,0.2535798466666661 -Ti3Te2N2F2_8_19114.vasp,Ti3Te2N2F2,-5.0274053088888895,0.2028173780246854 -Nb2Se1I1Br1_1_12864.vasp,Nb2SeIBr,-2.981729586,0.4876807451142784 -Hg1F2_115_7852.vasp,HgF2,-0.19697862,0.2497649358333333 -Nb2Te2_187_12914.vasp,Nb2Te2,-3.44846343,0.18420880083332936 -Al2Fe1Se4_164_828.vasp,Al2FeSe4,-2.746078192857143,-0.2418053892857156 -Fe1B4C2F6_47_5624.vasp,FeB4C2F6,-4.183987674615384,0.36587554711537384 -Ga1Cu1P2S6_149_6164.vasp,GaCuP2S6,-2.821073531,0.07750911116666082 -Bi1I2_115_2341.vasp,BiI2,-0.08468454333333332,0.4025265905555551 -V1H1Br1O2_6_19846.vasp,VHBrO2,-4.078388824,0.11801026633333356 -Te3As4Au2I2_6_18546.vasp,Te3As4Au2I2,-1.1648962109090908,0.2240189815909065 -Na1Ga1Sb2O6_5_11866.vasp,NaGaSb2O6,-3.680942325,0.5971518698749956 -Zr1Pt1S2I2_1_21407.vasp,ZrPtS2I2,-2.3866425933333333,0.30291532784722053 -Cr2Ag2O8_51_4295.vasp,Cr2Ag2O8,-3.5930702041666667,-0.19805588791666962 -Sc2Cl2_164_16062.vasp,Sc2Cl2,-2.751516745,0.09210795333333088 -Sr2Cu1Br2O2_123_17196.vasp,Sr2CuBr2O2,-2.7142722685714284,0.06863182591836381 -Rh5Se10_1_15256.vasp,Rh5Se10,-2.3444892693333332,0.32918123733333315 -Sb1Te1I1_156_15511.vasp,SbTeI,-1.1089801666666668,0.24433239999999978 -K1Te2Pb1_156_8943.vasp,KTe2Pb,-0.8070208225,-0.2660064545833332 -In2Fe2Te5_187_8439.vasp,In2Fe2Te5,-1.3619819344444446,0.18880743527777588 -Cr1Cu1Se2_156_4158.vasp,CrCuSe2,-1.54416357,0.6219966193749997 -Sc1Br2N1_8_15911.vasp,ScBr2N,-3.3089836025,0.19605275124999078 -Na2Cd4S8Cl6_31_12034.vasp,Na2Cd4S8Cl6,-1.17223342,0.2981205822291664 -Ca4P4H12O16_14_3233.vasp,Ca4P4H12O16,-4.852033727777777,0.03084621592592196 -Al1Ag1As2O6_149_593.vasp,AlAgAs2O6,-3.878696565,0.48148584883332923 -Au2S1I1Br1_1_1506.vasp,Au2SIBr,-0.113398938,0.09425422225000041 -Mn2Tl2S5_156_11330.vasp,Mn2Tl2S5,-2.1380595844444445,0.5208824144444422 -Sb4S6_7_15820.vasp,Sb4S6,-2.6074711489999998,0.19652197100000057 -Cu1Ni2O4_187_4923.vasp,CuNi2O4,-2.4428937614285715,-0.21344573678571865 -Li2V4O10_59_10132.vasp,Li2V4O10,-5.27151239875,0.19824927312499518 -Sb2Mo2S6_2_15604.vasp,Sb2Mo2S6,-2.976309036,0.37026431316666486 -Hf2N2Cl2_59_7542.vasp,Hf2N2Cl2,-6.204758346666666,0.03613294333333439 -Hf3I1Br1O2_8_7712.vasp,Hf3IBrO2,-4.915606477142857,0.5336067995454448 -Al2Ga2Se6_31_845.vasp,Al2Ga2Se6,-2.690664555,0.05889525099999959 -Ba4Si2Te8_11_2189.vasp,Ba4Si2Te8,-2.2007538564285714,0.19254028357142827 -Ni2As2S5_8_13449.vasp,Ni2As2S5,-2.146593725555556,0.2382257492592601 -Eu1Bi2_6_5585.vasp,EuBi2,-1.59595467,0.030173031666666628 -K2Hg4Se2S6F6_31_9192.vasp,K2Hg4Se2S6F6,-1.0069497354999999,0.36859802390625007 -Hg2Se2Cl2_59_8016.vasp,Hg2Se2Cl2,0.05010577833333333,0.35142244222222074 -V2H2C1S2_164_20073.vasp,V2H2CS2,-4.139827531428572,-0.07778524424603916 -K2H4N2_11_9132.vasp,K2H4N2,-3.44390079875,0.013103279999999717 -Be3Bi3_25_2274.vasp,Be3Bi3,-1.8499022533333334,-0.4908893633333333 -Sr2Tl1Cu1Hg1S5_99_17338.vasp,Sr2TlCuHgS5,-1.704712458,0.1323838253593752 -Mn3Br1Cl1O2_1_11358.vasp,Mn3BrClO2,-2.741106091428571,0.3246496775184713 -Ta4Co4Te8_14_18027.vasp,Ta4Co4Te8,-3.224477146875,0.12928624927082977 -Ag2H8C6Br2N2_2_291.vasp,Ag2H8C6Br2N2,-4.454224621,0.12903549900000072 -Cr2Te2_123_4527.vasp,Cr2Te2,-2.119387445,0.42149019749999606 -Hf1O2_191_7252.vasp,HfO2,-4.22728971,3.5602041883333335 -V2F6_191_20061.vasp,V2F6,-3.366269365,-0.2931770524999999 -Ir4Pb12_127_8861.vasp,Ir4Pb12,-1.401687293125,0.8972570218750002 -Cs2Se2N2Cl6O6_4_4787.vasp,Cs2Se2N2Cl6O6,-2.340938756111111,0.41915608291666295 -Ga1Bi1_187_6141.vasp,GaBi,-0.847831445,-0.06694795750000004 -Te2P2_12_18444.vasp,Te2P2,-2.2690903175,0.5398005533333335 -Ni2Te3O8_5_13671.vasp,Ni2Te3O8,-3.1608678876923078,-0.06990193951923285 -Zr3B2H2S2_187_21736.vasp,Zr3B2H2S2,-4.647016911111112,0.3058556722222072 -Si2O2_31_16420.vasp,Si2O2,-5.144023305,0.4109486424999994 -Te4As4Pd4_13_18561.vasp,Te4As4Pd4,-1.9136557141666666,0.27219165749999996 -Ba1O2F2_5_1848.vasp,BaO2F2,-2.491831058,1.1743609125000005 -Ti1Ge1Te1Se3_1_18787.vasp,TiGeTeSe3,-3.1319843483333334,0.33298532027777594 -Na2B2H8O8_2_11979.vasp,Na2B2H8O8,-4.7867981145,0.04962443244444503 -Zr1In1Se2_8_21315.vasp,ZrInSe2,-2.8896608475,0.8106020631249997 -Fe2Sb2O7_10_5949.vasp,Fe2Sb2O7,-3.6986793899999997,0.557061325189391 -Cs2Hg4Se2I6O6_31_4737.vasp,Cs2Hg4Se2I6O6,-1.1107597595,0.04540984091666335 -K2Au2Se2_51_8978.vasp,K2Au2Se2,-0.42159948666666663,0.2946222933333334 -Te2Pd1_115_18462.vasp,Te2Pd,-1.09176163,0.39728290666666677 -Ni2Te4F2_6_13674.vasp,Ni2Te4F2,-1.00262403875,0.19361432968749995 -Na1Tl1Br4O12_2_11947.vasp,NaTlBr4O12,-2.2823668894444444,0.22611739208333081 -Te3Mo1Os1I2Br1_1_18548.vasp,Te3MoOsI2Br,-1.485127315,0.1647607533854159 -Zn1_191_21025.vasp,Zn,2.38527844,-0.011469159999999867 -Li1Al1Sb2O6_5_9645.vasp,LiAlSb2O6,-4.161529929,0.6975434042499948 -Zr4N3_164_21833.vasp,Zr4N3,-6.604282472857143,0.18106278857142222 -Cd2S2Br2_59_3543.vasp,Cd2S2Br2,-0.34836242333333334,0.34503154906249806 -H10Pb2C8S4N2_2_6977.vasp,H10Pb2C8S4N2,-4.826844173076923,-0.0447882039663523 -Ag1Br2_164_36.vasp,AgBr2,0.20776021,0.1415877633333334 -Fe2N1O2F2_164_5882.vasp,Fe2NO2F2,-2.6653406814285714,0.6384756685714219 -Ag1Pb1I4_10_98.vasp,AgPbI4,-0.03250414333333333,0.1483791433680559 -Ca1In1I2_1_2851.vasp,CaInI2,-0.66326428,0.9238424484999997 -Mn2S1Br3_1_11209.vasp,Mn2SBr3,-1.6241239533333334,0.17808775916666664 -Ga1F1_99_6183.vasp,GaF,-1.858657785,0.48602489499999796 -As2W2O10_13_1308.vasp,As2W2O10,-5.080855699285714,0.17339469624999504 -V1Se2_191_19933.vasp,VSe2,-2.0881111633333336,1.0584925549999995 -Ba2Mn3O7_1_2028.vasp,Ba2Mn3O7,-4.2212903875,0.3951696256249959 -Cr2Br6_189_4336.vasp,Cr2Br6,-1.13360645375,-0.1223549949999998 -Sc3C2_187_16202.vasp,Sc3C2,-4.923897882,0.3187902999999954 -Sr2La2Cl10_11_17270.vasp,Sr2La2Cl10,-2.710611219285714,0.12294231499999797 -Ge1H6Au1_1_6671.vasp,GeH6Au,-2.319459505,1.4882819783014094 -Tl3W2Cl9_174_19584.vasp,Tl3W2Cl9,-1.7787496342857143,0.18489502642856592 -K1Al1Cl4O12_2_8876.vasp,KAlCl4O12,-2.796405408888889,0.19405121045138207 -Y1Br2_187_20615.vasp,YBr2,-2.94613173,0.1106517294444418 -Ti2C2Br2_59_18915.vasp,Ti2C2Br2,-5.028711696666667,0.6375200366666589 -Cs1I2_25_4644.vasp,CsI2,0.08478104333333332,0.49286854624999965 -Ti8Zn2O18_85_19187.vasp,Ti8Zn2O18,-6.2520886525,0.30058823455356487 -Ti2Br2Cl2_6_18895.vasp,Ti2Br2Cl2,-3.3665331050000002,0.07654805875000004 -K2Cd4Cl6O8_31_9043.vasp,K2Cd4Cl6O8,-1.419369232,0.30295678537499837 -Sb6H2S12_4_15849.vasp,Sb6H2S12,-2.5911265765,0.2584372363124978 -C8F4_67_2781.vasp,C8F4,-5.798108012499999,0.3178311666666618 -Hf1Zr3Mn1Zn1P1Se1S7Cl5_1_7417.vasp,HfZr3MnZnPSeS7Cl5,-3.3783365395,0.24089912983239925 -Cr1Cu1Sb2S6_143_4154.vasp,CrCuSb2S6,-2.375440641,0.3215356469791646 -Nb2Br5_1_12656.vasp,Nb2Br5,-2.2219735985714286,0.4881982920535658 -Ga1Ge1Te2_8_6196.vasp,GaGeTe2,-1.8910042475,-0.1927834770833332 -As1Cl5_25_1146.vasp,AsCl5,-0.9510935333333334,0.17860185083333235 -Sc4H2C3S2_164_16240.vasp,Sc4H2C3S2,-4.676314848181819,0.582581658181812 -Fe1Br1Cl1_156_5635.vasp,FeBrCl,-1.3625601633333335,-0.0998666241666667 -Sn2W3Cl14_143_16905.vasp,Sn2W3Cl14,-2.0826106263157897,0.08371461684210502 -Na2Rh1_187_12272.vasp,Na2Rh,-0.36522838,0.8775890999999989 -Cr1I1F1_156_4198.vasp,CrIF,-1.4372744366666668,0.7854314227777757 -Zn1H6C4O6_2_20956.vasp,ZnH6C4O6,-4.9172548411764705,0.17910689764705445 -Pt2Cl2O2_59_14610.vasp,Pt2Cl2O2,-1.98574096,0.24510743935184642 -Cd1Bi1Se1I1Br1_1_3280.vasp,CdBiSeIBr,-0.44894760199999995,0.03733516530555546 -Sb2Te2Cl2O6_31_15711.vasp,Sb2Te2Cl2O6,-3.3037334716666664,0.13463772083333359 -Te2Os1_187_18422.vasp,Te2Os,-2.4305279866666667,-0.2286543183333336 -Sc5N1Cl8_10_16272.vasp,Sc5NCl8,-3.3294116414285715,-0.32134985083333945 -Pd2Se6_11_14501.vasp,Pd2Se6,-1.69195849625,0.27129120333333334 -Tl2I6_26_19443.vasp,Tl2I6,0.22459416125,0.2530650809375 -Bi2Pb6_191_2501.vasp,Bi2Pb6,-0.10164863,1.01120795875 -Fe2Te2W2O12_113_6002.vasp,Fe2Te2W2O12,-4.649684799999999,-0.008971304907411604 -C4S4_7_2769.vasp,C4S4,-4.83034294,0.5367621646874996 -Tl1I1_99_19288.vasp,TlI,0.34362234,0.7818351475 -Rb2Hg4Br6O8_31_14864.vasp,Rb2Hg4Br6O8,-1.0211016065,0.25557527456249973 -Sc2F6_147_16074.vasp,Sc2F6,-4.32884691375,-0.3276762037499994 -Tl2Si2S6_162_19541.vasp,Tl2Si2S6,-2.7279514639999998,0.3024484886874981 -Mo2S2F2_59_11664.vasp,Mo2S2F2,-3.283940558333333,0.1463142099999959 -Gd2H14C4S2O16_2_6615.vasp,Gd2H14C4S2O16,-5.044926222368421,0.059550156184198455 -Sn2N2_164_16792.vasp,Sn2N2,-3.7033601275,-2.2401965587499997 -Zn1Te1As1S2Cl1_1_21017.vasp,ZnTeAsS2Cl,-1.5633354216666666,0.5137362624340238 -Cd2Sb2O4F2_11_3555.vasp,Cd2Sb2O4F2,-2.6964690300000003,0.11478420512499588 -Sb1Se2O6F1_1_15503.vasp,SbSe2O6F,-3.343365007,0.29251370813392574 -Rh1I2_115_15155.vasp,RhI2,-0.24130776666666667,0.6492809733333325 -Na2Cu1_187_12068.vasp,Na2Cu,0.43475301666666666,1.179726576666666 -Ni2P4_11_13572.vasp,Ni2P4,-2.5791059633333333,0.6064338716666668 -In4O6_7_8679.vasp,In4O6,-3.741271041,0.2974669312499998 -Co2S4Cl2_2_3984.vasp,Co2S4Cl2,-2.18222994375,0.18272163484375015 -Sr2S8Br4_125_17305.vasp,Sr2S8Br4,-1.7994726585714285,0.48639109107142686 -Ce4Br10_11_3686.vasp,Ce4Br10,-2.41031176,0.10344058071428597 -Sb4Te4Pt4_13_15835.vasp,Sb4Te4Pt4,-1.8989126041666669,0.3725163483333329 -Cr2C1_164_4346.vasp,Cr2C,-4.132228826666666,0.3971435163333292 -Er2S6_51_5570.vasp,Er2S6,-3.62308931875,0.20515273414062496 -Ni1F2_164_13315.vasp,NiF2,-1.0362350433333334,0.23531074499999982 -Eu2Zn1Ge3_187_5607.vasp,Eu2ZnGe3,-2.0662284950000003,0.613526583333333 -Ta2B1H2_164_17655.vasp,Ta2BH2,-5.675165378,0.31233960800000116 -Cr2N1_164_4425.vasp,Cr2N,-3.90132234,0.9667924311111111 -Tm2I6_162_19682.vasp,Tm2I6,-1.53452456625,0.05511638750000003 -Bi2Se1O2_164_2533.vasp,Bi2SeO2,-2.998148896,0.27499163333333065 -Ga2Te3_143_6514.vasp,Ga2Te3,-1.4123671039999999,0.3976568812000001 -Cs1Br2F1_123_4634.vasp,CsBr2F,-0.6276746375,0.3830296878125001 -Sn1W1S4_3_16707.vasp,SnWS4,-3.2395765483333334,0.30329030999999995 -In2S4_12_8558.vasp,In2S4,-2.030885835,0.5092952840624974 -Ta2N2F2_59_17783.vasp,Ta2N2F2,-6.619477853333334,0.20767387857142405 -Pb4S4_53_14318.vasp,Pb4S4,-1.69000668125,-1.01687323625 -Li2C2Se2N2_31_9851.vasp,Li2C2Se2N2,-4.78528988125,0.03960820244791097 -Cr2N1O2_164_4424.vasp,Cr2NO2,-5.12975167,0.19823151333332856 -Si4S8_14_16509.vasp,Si4S8,-3.77904682,0.10217573333333352 -Mn1Ge1S2Cl2_1_10741.vasp,MnGeS2Cl2,-2.35735453,0.11930576718749997 -Sc3N2F2_187_16212.vasp,Sc3N2F2,-5.6052532685714285,-0.3793683576190561 -Li2Ga2H16N8_4_9921.vasp,Li2Ga2H16N8,-4.491775069642857,0.030512930178571374 -V3Te4_12_20291.vasp,V3Te4,-2.4038158014285713,0.2093499536734642 -Ge2As1Se6_162_6728.vasp,Ge2AsSe6,-2.410876243333333,0.1540900620833312 -Mo2W2Se6_3_11700.vasp,Mo2W2Se6,-3.3089394149999998,-0.19740593200000223 -Rb2B2H6Se2S6_4_14774.vasp,Rb2B2H6Se2S6,-2.930655567777778,0.2718097648379579 -Nb1I2_115_12521.vasp,NbI2,-1.6026152900000001,0.7596878449999964 -Zr1Se2_164_21445.vasp,ZrSe2,-4.0149488799999995,0.07520396083333392 -Mo4H2S2N3_164_11746.vasp,Mo4H2S2N3,-4.319062711818182,-0.7098767415151586 -Nb1Se2_164_12579.vasp,NbSe2,-4.1382087400000005,0.1176602674999998 -In2S3_164_8556.vasp,In2S3,-2.455756774,0.06888360899999979 -Mn6F18_164_11468.vasp,Mn6F18,-2.6212063495833333,-0.2770021233333333 -Ge2Au2S6_51_6745.vasp,Ge2Au2S6,-2.1283638849999997,0.1708623596249994 -Zr1Cl1F1_156_21274.vasp,ZrClF,-3.6115793466666664,0.2553460712499962 -Cr2Mo2O8_25_4419.vasp,Cr2Mo2O8,-5.0594678958333335,0.04656059402777224 -K2Ru2C2Br8O4_31_9313.vasp,K2Ru2C2Br8O4,-2.570253216111111,0.34941619333333107 -Cu2F2_164_5090.vasp,Cu2F2,-0.70758493,0.6623173899999999 -V1W1Cl6_12_19952.vasp,VWCl6,-2.1806587475,0.2069465525000002 -V4B3F2_164_20301.vasp,V4B3F2,-4.5511885422222225,0.23079364185184703 -Pd1Se6Cl2_2_14393.vasp,PdSe6Cl2,-1.5200575488888888,0.07734121319958587 -H2Pb4C1Cl6O4_1_7006.vasp,H2Pb4CCl6O4,-3.0575811076470587,0.0817766587254869 -Ni2Cl2O2_59_13492.vasp,Ni2Cl2O2,-1.6645228716666667,-0.3416316272916694 -Sb2Ru2Se6_162_15670.vasp,Sb2Ru2Se6,-2.449200175,0.4147869548999976 -Ag1Br1O2_1_32.vasp,AgBrO2,-1.4235274675,0.20704136812500007 -Sc2S5O13_1_16140.vasp,Sc2S5O13,-4.728399914500001,0.18903556857812145 -Ni2P2O7_12_13560.vasp,Ni2P2O7,-4.1828675372727275,0.19736563772727012 -Cr2Sb2S6_157_4481.vasp,Cr2Sb2S6,-2.8972138999999997,0.26785620216666495 -Rh1F2_115_15150.vasp,RhF2,-1.4408257500000001,0.8690069044444422 -Ni2Mo2S8Br2_129_13536.vasp,Ni2Mo2S8Br2,-1.8216272564285716,0.5518450164285671 -Pd2S2F2_59_14460.vasp,Pd2S2F2,-1.8205081566666665,0.1609439481481447 -Ni2F6_191_13506.vasp,Ni2F6,-0.9153748225,0.4484108712499999 -W1S1O1_156_20448.vasp,WSO,-5.289850566666667,0.08029864265305436 -Hg2Sb2O4F2_11_8005.vasp,Hg2Sb2O4F2,-2.347426106,0.3516605635862051 -Fe2H2S2_59_5855.vasp,Fe2H2S2,-2.23530681,0.6944564883333308 -Ta1Nb1Te1Br1_25_17577.vasp,TaNbTeBr,-3.9274234075,0.30212817803570746 -Tl1In1Hg1O4_156_19294.vasp,TlInHgO4,-2.307288115714286,0.2847047252976179 -Sr1Ag2S8_89_17020.vasp,SrAg2S8,-1.9336764463636364,0.151508521477269 -Sn1H2O2_164_16641.vasp,SnH2O2,-3.788221342,0.29016353816666696 -Ti2S2_2_19003.vasp,Ti2S2,-5.188498525,0.008315095000000383 -K2Ta1Cu1Se4_21_9356.vasp,K2TaCuSe4,-2.40654458875,0.12481969250000002 -Li2B2H6N8O2_51_9834.vasp,Li2B2H6N8O2,-5.1173339454999995,-1.6577665496666718 -Ti2As1Se2_164_18878.vasp,Ti2AsSe2,-4.836409556,-1.1343585623750032 -Cr4B3H2O2_164_4589.vasp,Cr4B3H2O2,-4.397137646363636,0.49683394545454096 -Te6As2Au2_2_18639.vasp,Te6As2Au2,-1.087125543,-0.05912876941666939 -Si1Br2_115_16320.vasp,SiBr2,-1.4042381933333334,0.4000449549999975 -Co2Bi2Se4Br2_10_3865.vasp,Co2Bi2Se4Br2,-1.576363666,0.2669429529333313 -Cu2I2O4_17_5170.vasp,Cu2I2O4,-1.44858621625,0.6502720107499997 -Nb2H2N1_164_12734.vasp,Nb2H2N,-5.61428234,-0.008239675999999196 -Tl1Ag1_47_19212.vasp,TlAg,1.06841531,0.6005699175 -Na2In1O2_164_12184.vasp,Na2InO2,-2.882742902,0.3586839477142797 -Hf2I4_11_7521.vasp,Hf2I4,-2.3663249266666666,0.3508633199999971 -Mn3B2H2O2_187_11353.vasp,Mn3B2H2O2,-4.065885558888889,0.2764892919444373 -W2Br4O4_26_20464.vasp,W2Br4O4,-3.889439233,0.021025846000000126 -Tl1I2_164_19290.vasp,TlI2,7.599e-05,0.1651275389583332 -In1P1F3_143_8295.vasp,InPF3,-2.116266474,0.7860034490000001 -P8O12_51_14150.vasp,P8O12,-4.698793037,0.5600107166000008 -Mg2Ti1_187_10528.vasp,Mg2Ti,-1.59530485,0.5323799644444429 -Ta4Pd2O10_59_18083.vasp,Ta4Pd2O10,-6.248532365,0.29734733625000015 -Li4Ti1S4_111_10233.vasp,Li4TiS4,-3.6311141255555555,0.05639936555555214 -Ge4Pb8S16_14_6940.vasp,Ge4Pb8S16,-2.633082086785714,0.1148911142857143 -Sb4P2S12F2_4_15798.vasp,Sb4P2S12F2,-2.6604641654999996,0.27386507610416144 -Ti3B2H2_187_19062.vasp,Ti3B2H2,-5.5740682957142855,0.15392772071428107 -Sn2As2O6_7_16723.vasp,Sn2As2O6,-4.032532392,0.2933573463333303 -Hg2Sb2S4F2_11_8009.vasp,Hg2Sb2S4F2,-1.489913994,0.3638322183333301 -K2Cd4Se2Cl6O6_31_9059.vasp,K2Cd4Se2Cl6O6,-1.681640522,0.19808388799999666 -Mn2Bi2Br2O4_6_11000.vasp,Mn2Bi2Br2O4,-2.974818054,0.24168885025861764 -Ti1Bi1P1_156_18741.vasp,TiBiP,-3.9054968233333334,0.4538298549999955 -Cd2Sb2O6_147_3556.vasp,Cd2Sb2O6,-2.686481776,0.5869659196874968 -Mg2Ge4W2O12_13_10461.vasp,Mg2Ge4W2O12,-4.7119807375,0.42821025424999526 -Zr1Mn1I6_5_21322.vasp,ZrMnI6,-1.11819005375,0.08198171708333324 -Mg1Pb2_164_10393.vasp,MgPb2,-0.48286064333333334,0.009422969999999586 -Al2H8Se4O16_14_870.vasp,Al2H8Se4O16,-4.195354272,0.021910428324995568 -In1Co5I2_123_8222.vasp,InCo5I2,-0.829165105,0.42049188562499995 -V4O10_2_20340.vasp,V4O10,-5.4673536007142856,-0.008775018571428816 -Cd2Cu2Se2Br2_26_3493.vasp,Cd2Cu2Se2Br2,-0.1555594675,-0.08808338749999998 -Mo1W3S8_25_11558.vasp,MoW3S8,-4.37349857,-0.09015162416666644 -Cd2As2O6_147_3454.vasp,Cd2As2O6,-3.04110178,0.3263689009285655 -Zr1Zn1Se1I2_1_21496.vasp,ZrZnSeI2,-1.3000723239999998,0.06664110725000016 -Na2Cd4Te2S6Cl6_31_12048.vasp,Na2Cd4Te2S6Cl6,-1.090198732,0.27554536595833046 -Na2H6Pt1O6_147_12128.vasp,Na2H6PtO6,-3.889023035333333,0.09178763133333323 -Co2F8_7_3901.vasp,Co2F8,-1.8012297409999998,0.0197643150000002 -V4Te2Se2_13_20373.vasp,V4Te2Se2,-2.90201776625,0.20436495223214 -Hf3Te2H2N2_187_7736.vasp,Hf3Te2H2N2,-4.975039975555556,0.7579440455555508 -Ta2F10_2_17718.vasp,Ta2F10,-4.2771926425,0.08976365666666641 -Nb2B1Te2_12_12637.vasp,Nb2BTe2,-4.71860821,0.1655613136666667 -Ca4N2_59_3228.vasp,Ca4N2,-2.6836719116666665,0.24631423833333344 -Bi2F6_147_2457.vasp,Bi2F6,-2.51047577,0.48483009562499957 -Cu2O2_164_5199.vasp,Cu2O2,-1.725658335,0.7471301631249999 -Ti2H2C1S2_164_18945.vasp,Ti2H2CS2,-5.226542572857142,0.23202174946428045 -V3I8_156_20274.vasp,V3I8,-1.0311965972727273,0.034274333333332296 -Hf1Zr2Se3I2_1_7414.vasp,HfZr2Se3I2,-3.19732182625,0.20152216156250025 -W2N1Cl2_164_20507.vasp,W2NCl2,-4.065343186,0.2815227850000004 -Sr1I2_164_17059.vasp,SrI2,-1.2093721433333333,0.07667121555555556 -H2Pt2_164_7022.vasp,H2Pt2,-2.3441744675,1.7546043700000002 -Li2Ta2I12_4_10079.vasp,Li2Ta2I12,-1.44130360625,0.08249916515625011 -K2H6C2Se2O6_1_9139.vasp,K2H6C2Se2O6,-3.853824962222222,0.454079728777765 -Au4Se2_51_1594.vasp,Au4Se2,0.08025058666666667,1.030108336666666 -Bi1Cl2_115_2325.vasp,BiCl2,-0.9258698133333333,0.38404303944444335 -Sr2Ag1I2O2_123_17101.vasp,Sr2AgI2O2,-2.236667232857143,0.022684144999996825 -Te2P4S12_18_18446.vasp,Te2P4S12,-2.5679046772222223,0.37873894678240433 -Na2Hg4S2Br6O6_31_12153.vasp,Na2Hg4S2Br6O6,-1.6770482279999999,0.1397498067916623 -Cr1H4C4S6F1_1_4191.vasp,CrH4C4S6F,-4.061740694375,0.3185230611718728 -Eu1In2Au1_1_5589.vasp,EuIn2Au,-0.90861955,0.4916309299999999 -Sb2Pd2Se6_12_15655.vasp,Sb2Pd2Se6,-1.8009423300000003,0.3160241068999974 -Cu1Ge1Cl6_1_4878.vasp,CuGeCl6,-1.0490036425,0.1690035621874999 -V1S1O1_156_19912.vasp,VSO,-4.554229733333334,0.12482617317609024 -Sb1I1O1_156_15459.vasp,SbIO,-2.054919696666667,0.5988200529166641 -Rh2Se2_129_15241.vasp,Rh2Se2,-2.19164849,0.2606554342045433 -Fe2H4Se2S8_4_5860.vasp,Fe2H4Se2S8,-2.632339044375,-0.07860642497395859 -Ag2Au2F8_2_174.vasp,Ag2Au2F8,-0.6698824083333333,0.1079931483333334 -Cu2P2Se5S1_1_5214.vasp,Cu2P2Se5S,-2.008249921,0.1822954580052062 -Ni4S2I1Cl1_6_13755.vasp,Ni4S2ICl,-0.5894369725,-0.13650435437500008 -Sc2I2N1_2_16090.vasp,Sc2I2N,-3.52521129,-0.004628277666668401 -In1I2_164_8274.vasp,InI2,-0.38061464333333334,0.16030551499999995 -Ta4Sn2Se8_55_18117.vasp,Ta4Sn2Se8,-3.9673015014285715,0.20798828357142485 -Ta1V1Te1Se1_25_17640.vasp,TaVTeSe,-3.8181466325,0.2802121451814435 -Co2I2_129_3927.vasp,Co2I2,-0.3171480475,0.5089905483333327 -Os6S8_11_13896.vasp,Os6S8,-3.9254585050000004,0.5998490585714227 -Ir1Pb1Br4_1_8745.vasp,IrPbBr4,-0.9432139633333333,0.513853867222219 -As2Cl6_12_1202.vasp,As2Cl6,-1.49563208,0.09727340499999992 -Mg1Br2O6_12_10345.vasp,MgBr2O6,-2.6570912555555553,0.07478709013888696 -P2Pd1_123_14019.vasp,P2Pd,-2.797786456666667,0.6907759083333329 -Cr1P2S7_5_4231.vasp,CrP2S7,-3.191383484,0.03740254246874741 -Li1Cd1Cl1O2_1_9669.vasp,LiCdClO2,-2.093343424,0.27000752533333083 -In2F6_189_8425.vasp,In2F6,-2.44647462125,0.16986378624999965 -Hf3B2_187_7688.vasp,Hf3B2,-5.882217438,0.3928915859999953 -H3Br1O1_1_7046.vasp,H3BrO,-3.3310227580000005,0.031192019874997534 -Te1Mo1Rh1S1_25_18301.vasp,TeMoRhS,-2.541721725,0.4903902183333333 -Fe2O2_129_5890.vasp,Fe2O2,-2.4049832775,1.1407420610416645 -As1O1F1_156_1154.vasp,AsOF,-3.2838694233333334,0.46298787333333324 -P4Pd4O4_13_14100.vasp,P4Pd4O4,-3.6055138816666665,0.2867018866999931 -Al3Sb3O9_157_1053.vasp,Al3Sb3O9,-4.746182829333334,0.44432982341666616 -Li3Co1Ni2O6_10_10145.vasp,Li3CoNi2O6,-3.5619281225,-0.17191120614583905 -Al2H2Se2S8_11_865.vasp,Al2H2Se2S8,-2.8341982107142853,0.27148714360118603 -Sb1As1S2I2_1_15430.vasp,SbAsS2I2,-1.7250317800000001,0.19024116854166317 -B2F2_129_1665.vasp,B2F2,-3.4434844,1.088907166111107 -Zr2Te6_59_21720.vasp,Zr2Te6,-2.68168521875,0.0766422462499996 -La4F6_12_9627.vasp,La4F6,-3.9606523350000002,0.3257484709999955 -Y2H2C1O2_164_20738.vasp,Y2H2CO2,-5.710894437142857,0.6659773385714223 -Ge6Sb6_12_6969.vasp,Ge6Sb6,-2.619102555,-0.3908312062500001 -Cd2Te2_164_3597.vasp,Cd2Te2,0.3137642375,-0.5556115175 -Cd1H4C4I2N2_10_3349.vasp,CdH4C4I2N2,-4.413192766923077,0.18292193756410133 -Pb2Se2S8_7_14291.vasp,Pb2Se2S8,-2.173812266666667,0.22143231406249764 -Mn1In2O4_156_10782.vasp,MnIn2O4,-3.852258448571429,0.13083575997382701 -Hf1Br4_123_7132.vasp,HfBr4,-2.277373424,0.29261171600000013 -Fe2S2O8_31_5935.vasp,Fe2S2O8,-3.6762611825,0.6327854591666671 -Mn4B3O2F2_164_11423.vasp,Mn4B3O2F2,-3.2241661999999995,1.0375492198412641 -Mn1Nb1S1I2N1_8_10807.vasp,MnNbSI2N,-3.1552978416666666,0.2909119553333229 -Co2Sb2Te6_162_4009.vasp,Co2Sb2Te6,-1.586779407,0.2188795493999965 -Cu4Te2S12_14_5479.vasp,Cu4Te2S12,-1.6703170427777776,0.27334293509259094 -K2Cu2Mo2O10_11_9088.vasp,K2Cu2Mo2O10,-3.710746741875,0.2107673192968751 -Mn2Bi2Se4Cl2_26_11015.vasp,Mn2Bi2Se4Cl2,-1.820458598,0.19393282441666515 -K2Ca1N4O8_12_9039.vasp,K2CaN4O8,-4.2731902360000005,0.12537962726665297 -Zr1Sb2O6F2_164_21425.vasp,ZrSb2O6F2,-4.448623119090909,0.31528280931817676 -Sc2C1O2F2_164_16053.vasp,Sc2CO2F2,-3.9203874499999998,2.0763496999999935 -Sc1Nb1Se1Br4O1_1_15961.vasp,ScNbSeBr4O,-3.20180357,0.15121113273437004 -Au1S2_115_1441.vasp,AuS2,-0.9760521633333333,0.5711018131249986 -Sr2H8S6_26_17252.vasp,Sr2H8S6,-3.18584531,-0.015105996875000138 -W2N3_187_20515.vasp,W2N3,-6.825159997999999,0.30771348200000137 -W4S8_2_20593.vasp,W4S8,-4.455255191666667,0.017343458333333395 -Ta13Te26_2_17503.vasp,Ta13Te26,-3.663161656923077,0.08472171196581213 -As2Se2_129_1301.vasp,As2Se2,-2.1581755375,0.5487094016666638 -K2Ag2Se2_129_8967.vasp,K2Ag2Se2,-0.6171547416666666,0.055090946666666696 -Pr1C5_47_14529.vasp,PrC5,-5.366017685,1.9113677512499931 -Mn2N1Cl2_164_11151.vasp,Mn2NCl2,-2.990314174,0.29246322599999997 -Ti2C2F2_59_18917.vasp,Ti2C2F2,-5.754455861666667,0.17744776055554956 -Cd1Pb2Cl2O2_12_3390.vasp,CdPb2Cl2O2,-2.09825011,0.08402620714285725 -Mo4C3_164_11740.vasp,Mo4C3,-4.858504021428572,0.6588564889285662 -As4O10_31_1330.vasp,As4O10,-4.119551081428571,0.29019897071428247 -Bi1O1_156_2348.vasp,BiO,-2.59660329,0.6962032324999985 -Rb2Cd4I6O8_31_14805.vasp,Rb2Cd4I6O8,-1.045934621,0.5443184531944429 -Cu2P4S3F2_6_5222.vasp,Cu2P4S3F2,-2.51425832,0.33719579504043 -Er2Te6_51_5576.vasp,Er2Te6,-2.01480430625,0.40096359250000013 -In1Ge1Cl3_1_8261.vasp,InGeCl3,-1.6619251519999998,-0.07455767499999966 -Li2Cu1O2_12_9881.vasp,Li2CuO2,-3.022474572,0.5405678456666649 -Ba2Au1S2I2_123_1910.vasp,Ba2AuS2I2,-1.846491277142857,0.11349886071428406 -Li2Sn4P6O20_11_10074.vasp,Li2Sn4P6O20,-5.1157669125,0.062362373937500326 -Nb1Ni7C4Se3Cl5_1_12548.vasp,NbNi7C4Se3Cl5,-2.0367570285,0.6338253812500002 -Hg6Se8O10_2_8100.vasp,Hg6Se8O10,-1.8900728625,0.03277153416666678 -Si3Ir1_187_16469.vasp,Si3Ir,-3.195777555,0.9311609259374963 -Al2Te5_12_1020.vasp,Al2Te5,-1.87999016,0.09067964071428558 -Al2Si2Te6_162_989.vasp,Al2Si2Te6,-2.335142854,0.045704624000000305 -Sr1Cl2_115_17038.vasp,SrCl2,-2.0610734133333333,0.43642433999999986 -Tl2S2Cl2_59_19499.vasp,Tl2S2Cl2,-1.1692444133333333,0.321715726458332 -Ni1Ag2H6C14N2O10_2_13253.vasp,NiAg2H6C14N2O10,-5.451809360571429,0.3641956370595161 -Hg4I8_115_8077.vasp,Hg4I8,0.9333189133333333,0.0604386561111111 -Na2C4O6F6_2_12008.vasp,Na2C4O6F6,-4.534738658333334,-0.02848480388889213 -Sc1Sb2Te6Au1_149_15995.vasp,ScSb2Te6Au,-1.5226902150000001,0.24060206131249962 -Bi2Sb2S6_157_2527.vasp,Bi2Sb2S6,-2.43982996,-0.31112245149999973 -Cr1Ga2Se4_164_4178.vasp,CrGa2Se4,-2.4560758885714287,0.07088055607142618 -Mo2S4Cl6_2_11673.vasp,Mo2S4Cl6,-2.1710429133333333,0.07642071833333342 -Hf2B1O2_164_7438.vasp,Hf2BO2,-6.961209864,0.2261628057727212 -Re1Au2Br6_2_14991.vasp,ReAu2Br6,-0.6487908511111111,0.22530149800925836 -Sn2Au2S6_51_16733.vasp,Sn2Au2S6,-1.749268686,0.2233277799999993 -Mn2Sb2Te4Br2_10_11255.vasp,Mn2Sb2Te4Br2,-1.498046596,0.18716536674999795 -V1Mo2Br1N1Cl1O2_1_19884.vasp,VMo2BrNClO2,-3.9437562625,0.37813105411458303 -Ta1Nb2Ga1Se4I4_1_17581.vasp,TaNb2GaSe4I4,-2.869412046666667,-0.149287232056887 -Sm2Br6_59_16567.vasp,Sm2Br6,-2.36959717125,0.005699853749999928 -P2Au2O6_2_13954.vasp,P2Au2O6,-3.676085867,0.7181249383333261 -Ag2I2N2_2_312.vasp,Ag2I2N2,-0.8965956133333334,0.7163390574999986 -V2Co1S4_164_20043.vasp,V2CoS4,-3.5672749357142854,0.05905812029761659 -Fe2Se6_11_5988.vasp,Fe2Se6,-1.7966610925,0.5067301145833333 -Cr2Cu1S3I1Cl1_8_4361.vasp,Cr2CuS3ICl,-2.05233271875,0.16621000940104078 -Nb1Zn1I1Br1N1O1_6_12615.vasp,NbZnIBrNO,-3.4326575733333335,0.22435568854166643 -As2Pb2C2S6F6_7_1250.vasp,As2Pb2C2S6F6,-2.9106153855555554,0.540710776898145 -Ti2C2I2_59_18918.vasp,Ti2C2I2,-4.751537965,0.3004629779166631 -As2Au2S6_12_1188.vasp,As2Au2S6,-1.900321142,0.5259302281874976 -Cr2H4Se2O10_2_4403.vasp,Cr2H4Se2O10,-4.247767770555556,-0.07650504241513115 -Os1Cl2_187_13798.vasp,OsCl2,-1.39071951,0.9419294858333289 -Pt1Se1_156_14592.vasp,PtSe,-1.340211935,0.8350891175 -Ag2W1O4_111_489.vasp,Ag2WO4,-3.424834545714286,0.1992974024999974 -Te3P4Au2F2_6_18556.vasp,Te3P4Au2F2,-1.7859830799999998,0.5646554643939345 -Cs2Os2S2N2F10_11_4763.vasp,Cs2Os2S2N2F10,-3.052580491666667,-0.09525766777778433 -Ir3Pt1Br1N1Cl3O1_1_8856.vasp,Ir3PtBrNCl3O,-2.207427866,0.8320636163333295 -Si2O1_8_16418.vasp,Si2O,-3.86722777,0.8328032116666664 -Sn2Cl4_12_16764.vasp,Sn2Cl4,-1.445875515,0.1327844433333334 -Mn2Fe1Se1Br1Cl3_1_11072.vasp,Mn2FeSeBrCl3,-1.56559384125,0.030893445781249973 -Ba2Mg2Pb2_129_2019.vasp,Ba2Mg2Pb2,0.00128476,0.7624554299999999 -B2N1_65_1684.vasp,B2N,-6.185092273333333,1.0704866544444385 -Hf2Te6Se16_2_7646.vasp,Hf2Te6Se16,-2.26130798,0.264974837083333 -B1I1_99_1624.vasp,BI,-0.9384852,1.9360336419444417 -Pb4Se2N4O16_31_14320.vasp,Pb4Se2N4O16,-4.1135641373076925,0.05734125753845262 -Tl1Hg1Cl2_1_19285.vasp,TlHgCl2,0.02707826,0.21002137375000002 -La8Si4I8O16_2_9632.vasp,La8Si4I8O16,-5.223672101388889,0.0077937319444396636 -P1Se2_164_13950.vasp,PSe2,-2.5761657266666664,0.23912078756944244 -Cd1F2_115_3306.vasp,CdF2,-0.9570011433333333,0.19196420333333342 -Ni4H8C8N12Cl4_14_13746.vasp,Ni4H8C8N12Cl4,-4.9034143044444445,0.00044096578702923495 -Pb8O12_14_14338.vasp,Pb8O12,-3.3262085249999997,0.09079690924999717 -Hg1S1Cl2_1_7906.vasp,HgSCl2,-0.2932229425,0.26356962484375 -Sn2O2_129_16797.vasp,Sn2O2,-2.85969347,0.8769519125 -Ge2I2_129_6781.vasp,Ge2I2,-1.3325737525,0.1247890962499999 -Ga2S2Cl2_31_6439.vasp,Ga2S2Cl2,-2.347905605,0.05066579666666682 -Pb2Se2Cl2_59_14286.vasp,Pb2Se2Cl2,-1.4836156950000001,0.19401330253472004 -Ca2Sb4O8_11_3120.vasp,Ca2Sb4O8,-4.411832319285714,-0.09419735614286087 -Mn2Mo2Se2O12_113_11148.vasp,Mn2Mo2Se2O12,-4.348498782222222,0.021612882916662635 -Zr1Nb1S1I2_156_21351.vasp,ZrNbSI2,-3.2644311279999996,0.10388000146666299 -Sb8N4O24_2_15867.vasp,Sb8N4O24,-4.323995887500001,0.11721096527776753 -Pt2F6_149_14623.vasp,Pt2F6,-1.29752918375,0.32579712281250006 -Ga2S2Br2_59_6438.vasp,Ga2S2Br2,-2.052252625,0.10522300249999983 -Cd4H4Se4N4O24_14_3628.vasp,Cd4H4Se4N4O24,-3.5137500397499997,0.20625391604166332 -V3B2O2F2_187_20242.vasp,V3B2O2F2,-3.8760696599999998,1.1978400264197488 -Sn6Sb6_12_17001.vasp,Sn6Sb6,-1.6525599233333335,0.1835694032291666 -Na2Nb2I12_4_12228.vasp,Na2Nb2I12,-1.11153185375,-0.07474270874999989 -Zn2Ge2S6_162_21089.vasp,Zn2Ge2S6,-2.1523015130000003,0.21887334342499676 -Y1Ti1F5_47_20684.vasp,YTiF5,-4.085173597142857,0.7247777216666569 -Ru8S10_1_15375.vasp,Ru8S10,-3.3776046111111113,0.3343393233333294 -Mn1P2H12_2_10836.vasp,MnP2H12,-2.9880035526666666,1.6768671281851817 -Hf1Mn1Br6_149_7209.vasp,HfMnBr6,-2.037065035,0.0501759490625 -Sr4Ni2Br2O6_129_17453.vasp,Sr4Ni2Br2O6,-3.246810236428572,-0.23814220035714917 -Ga2Si2Se6_162_6491.vasp,Ga2Si2Se6,-2.751578634,0.08727101512499802 -K2Te2H2_12_9371.vasp,K2Te2H2,-1.5070675916666667,0.8633829272222202 -Cd2Bi2S4I2_11_3474.vasp,Cd2Bi2S4I2,-1.066354971,0.19447388750000022 -Ba1Sn4O7_156_1861.vasp,BaSn4O7,-3.5367858808333335,0.6954312797916626 -Mn3Si1Se2_187_11412.vasp,Mn3SiSe2,-2.607229896666667,0.1940124697222192 -Hf2Se1S1I1Br1_6_7598.vasp,Hf2SeSIBr,-3.8736603499999998,0.023078607291664 -Li2H4C2O6_7_9935.vasp,Li2H4C2O6,-4.800780197857143,0.3385076908333218 -Zn2I2_129_21108.vasp,Zn2I2,1.4007798325,0.5640845540625 -Ge2As2C2O6F6_7_6729.vasp,Ge2As2C2O6F6,-3.956386690555556,0.4174300522222106 -Al1Ag1Sb2O6_149_600.vasp,AlAgSb2O6,-3.9596568499999996,0.3665413816249965 -Te2Au2F2_59_18367.vasp,Te2Au2F2,-0.5225582750000001,0.7590372545833312 -Hf1Co1F6_5_7148.vasp,HfCoF6,-3.7344592675,0.11845887874999983 -Co3Ge1Se2_187_4062.vasp,Co3GeSe2,-2.1601296766666667,0.051238612436505626 -Lu4B3C4_2_10322.vasp,Lu4B3C4,-5.5007253227272725,0.4835244609090914 -Tl2S2I2_99_19501.vasp,Tl2S2I2,-0.8533266683333333,0.3114434697916658 -Ni2Bi2I2O4_10_13466.vasp,Ni2Bi2I2O4,-1.9108020360000002,0.3036797809999999 -Ti2P2O6_162_18981.vasp,Ti2P2O6,-6.012555662,0.42640709249999426 -V1Pd1Se1S1I1Cl1_1_19903.vasp,VPdSeSICl,-1.8290005533333333,0.20460786166666306 -Ba2La2Br10_11_2014.vasp,Ba2La2Br10,-2.268731202142857,0.09192650214285525 -K2P2O6_26_9289.vasp,K2P2O6,-4.7835071110000005,0.09952222449999937 -Be4N2_59_2287.vasp,Be4N2,-4.75202728,0.5662992122916627 -Na1_191_11959.vasp,Na,0.11510879,0.43836253000000003 -Te1As1I1_156_18281.vasp,TeAsI,-1.2739185033333333,0.23797634833333325 -Cr1S1Cl2_47_4240.vasp,CrSCl2,-2.0387385025,0.16808185411458124 -K2Hg4S6O2F6_31_9181.vasp,K2Hg4S6O2F6,-1.268070273,0.3409658208611075 -Hf1P2H2S6_164_7256.vasp,HfP2H2S6,-3.531836552727273,0.3633789448863566 -Rb2Ru2C2S4Cl8_31_14924.vasp,Rb2Ru2C2S4Cl8,-2.207267081111111,0.37150651499999665 -Tb2H4Br2_164_18199.vasp,Tb2H4Br2,-3.28739278375,0.026645676249999806 -Ir4Br3Cl1O4_8_8859.vasp,Ir4Br3ClO4,-2.7858459300000002,0.44008679722221844 -Lu2H4Cl2O4_11_10311.vasp,Lu2H4Cl2O4,-4.6635856633333335,0.09470722374999951 -Fe3S4_156_6063.vasp,Fe3S4,-1.9870421228571427,-0.02483668500000169 -Ba2H16C12N12O16_2_1989.vasp,Ba2H16C12N12O16,-5.784691887758621,-0.016421330732769412 -Al2Os1_123_921.vasp,Al2Os,-3.3863342633333335,0.6294211499999998 -K2Hf1H6S6_147_9166.vasp,K2HfH6S6,-3.274823136666667,0.07242026699999982 -Te2W2_187_18533.vasp,Te2W2,-3.00848555,1.02956470625 -Ca4Se4O16_14_3239.vasp,Ca4Se4O16,-3.85825163875,0.27494216958333295 -Li2Mg1H4S10_2_9967.vasp,Li2MgH4S10,-2.847286030588235,0.04974246874999799 -Rh1Se2_115_15169.vasp,RhSe2,-1.96131002,0.7123604866666664 -As2Se1S2_164_1297.vasp,As2SeS2,-2.7816741019999998,0.4333308553333307 -Zn2Mo2S2O12_4_21118.vasp,Zn2Mo2S2O12,-4.090077635555556,0.15981591086457703 -Sb2Br9_164_15559.vasp,Sb2Br9,-0.5901962527272727,0.2071959018181817 -Al1P1S4_16_701.vasp,AlPS4,-3.3485497616666664,0.09968770583333386 -Ca2Au1S2I2_38_2937.vasp,Ca2AuS2I2,-1.5047172685714287,0.17138760342856774 -Hg2Sb2S4Br2_11_8007.vasp,Hg2Sb2S4Br2,-1.160461879,-0.07984965150000212 -Tl1P1_187_19312.vasp,TlP,-1.15936917,0.8446508332500001 -Ir2Cl4O2_65_8777.vasp,Ir2Cl4O2,-2.27920612375,0.3298551846875002 -Sn3S2Br2_1_16926.vasp,Sn3S2Br2,-1.7199618514285715,0.18808038285714113 -Cd2Cu2Te2Cl2_26_3498.vasp,Cd2Cu2Te2Cl2,-0.0384249325,0.057874440312500004 -Mn1F2_164_10704.vasp,MnF2,-2.75904995,0.05029451000000007 -Y2O2F2_164_20762.vasp,Y2O2F2,-6.310193176666666,0.13114007500000024 -K4Te4S8_13_9523.vasp,K4Te4S8,-1.76504610875,0.20756638544270825 -Li2H6Pt1O6_147_9952.vasp,Li2H6PtO6,-4.087615476,0.07170404850000045 -Na1N3_10_11907.vasp,NaN3,-4.1011731775,1.3353695850000005 -Si2As2Se6_147_16383.vasp,Si2As2Se6,-2.819167271,0.13884177479166415 -Rh2Se2_164_15243.vasp,Rh2Se2,-2.1792530625,0.2730508617045433 -Fe2Te4P2Cl2_26_6016.vasp,Fe2Te4P2Cl2,-1.748874235,0.21807974058333257 -Cd1H12C12Br2N2O2_2_3322.vasp,CdH12C12Br2N2O2,-5.179172462258064,0.13806526827956533 -Pd2Br2_129_14401.vasp,Pd2Br2,-0.1688360275,0.67177228 -Cu1Te2_187_4997.vasp,CuTe2,-0.48901193,0.4132370122222214 -Fe2O2F2_59_5889.vasp,Fe2O2F2,-3.0997602066666663,-0.16759956875000226 -Ag4Cl4O4F4_1_509.vasp,Ag4Cl4O4F4,-0.75380157,0.4354990165625 -Mg1Bi2O5_6_10342.vasp,MgBi2O5,-3.64441242,0.15800275320312512 -Na1H3C2S5_1_11874.vasp,NaH3C2S5,-3.5817772027272725,0.2525831524999932 -Hf2Tl4Pb2S8_13_7657.vasp,Hf2Tl4Pb2S8,-3.020546133125,0.16507736812499996 -Zr4I4O4_7_21828.vasp,Zr4I4O4,-4.263609813333333,0.36214463592592283 -Te2Pd2_187_18476.vasp,Te2Pd2,-0.910158605,0.27136475125000004 -Nb1Sn1S2I2_8_12588.vasp,NbSnS2I2,-2.50081063,0.000231937222222367 -Zr1Te1Br1_156_21459.vasp,ZrTeBr,-2.7350956233333332,0.2123227761111084 -K1Fe1P4H4O14_2_8897.vasp,KFeP4H4O14,-4.965518259583333,0.050117922500000134 -Hg4W2O8_13_8094.vasp,Hg4W2O8,-3.3260606314285717,0.07167038857142805 -Ga1Mo1I1Br2Cl1O2_8_6209.vasp,GaMoIBr2ClO2,-2.39934592375,0.14827940324776231 -Mn1Nb1Te4_6_10818.vasp,MnNbTe4,-2.4188292733333334,0.16352876722222187 -Zn2Br2_129_21052.vasp,Zn2Br2,1.0198502825,0.5652179953124999 -Al2Sb2Se6_162_954.vasp,Al2Sb2Se6,-2.42128626,0.23533605000000013 -Ag3As1O4_156_495.vasp,Ag3AsO4,-2.06883570375,0.3751948325000001 -Mn1Ga1Te1Se1_1_10724.vasp,MnGaTeSe,-1.7786238125,0.34898825659482746 -Cr1Br1Cl1_156_4128.vasp,CrBrCl,-1.9368993033333333,-0.007537058888890558 -Mn1Cu2S3Br2_8_10700.vasp,MnCu2S3Br2,-1.28773615375,0.22184960514648433 -Mn2Se2Br2_59_11275.vasp,Mn2Se2Br2,-1.7345443116666666,0.05430119041666681 -Ti4O8_35_19151.vasp,Ti4O8,-7.0190176325,0.2448368925000004 -K2H2S2_1_9126.vasp,K2H2S2,-2.269550425,0.14580599833333352 -Nb2S3I2Cl1_1_12850.vasp,Nb2S3I2Cl,-3.2266606425,0.15501890928570972 -Sn1S1O4_1_16675.vasp,SnSO4,-4.107773538333333,0.1640488489322885 -In2I6_26_8484.vasp,In2I6,-0.25824344125,0.13527295250000004 -Ba2Cu1O2F2_123_1965.vasp,Ba2CuO2F2,-3.3656251071428573,0.3818298157142799 -In2Co2Te5_156_8418.vasp,In2Co2Te5,-1.3758961122222222,0.1547650555555541 -Mo4H2N3_164_11745.vasp,Mo4H2N3,-4.581620304444445,-0.8511860296913625 -Mn1O2_187_10833.vasp,MnO2,-4.247711986666666,0.21709774166666662 -H2Pd2O4_11_7013.vasp,H2Pd2O4,-3.21601987875,0.2804579776041667 -Cs1Ge1Se2_156_4641.vasp,CsGeSe2,-1.6946757175,0.4393361451562501 -Y1Mn1F5_47_20650.vasp,YMnF5,-3.2419554142857145,0.9356607492857107 -Hf1Te2_164_7325.vasp,HfTe2,-3.6358859199999998,0.1123739166666673 -Na4H16Br4O8_14_12386.vasp,Na4H16Br4O8,-3.6059004721875,-0.11685240197916613 -Ca1Ru2N2_12_2870.vasp,CaRu2N2,-4.15721929,0.5904968600000007 -Ga6S6_2_6585.vasp,Ga6S6,-2.7657319408333336,0.08999455416666624 -Fe2As2Se4F2_26_5787.vasp,Fe2As2Se4F2,-2.275873688,0.25363770049999723 -Sc3B2F2_187_16194.vasp,Sc3B2F2,-4.269276955714285,-0.08646748476191152 -Li3Sn1P6O18_1_10150.vasp,Li3SnP6O18,-5.259834474642857,0.12352138737497376 -Sn4P4Se4_17_16951.vasp,Sn4P4Se4,-2.493376190833333,-0.09385861250000183 -Ti1Ni1Se1S1Br2_6_18814.vasp,TiNiSeSBr2,-2.4218685883333335,0.10077250729166154 -Mg1F2_115_10359.vasp,MgF2,-3.2637528233333337,-0.14312715166666745 -Ti2S2_164_19004.vasp,Ti2S2,-5.0804268625,0.11638675749999994 -Sr3Si1_25_17399.vasp,Sr3Si,-0.3536550225,0.835397214375 -B3H2W4S2_164_1729.vasp,B3H2W4S2,-4.9657609154545455,0.6733780386363543 -Cu2Se1Cl3_1_5289.vasp,Cu2SeCl3,-0.5262571349999999,0.22092999401666608 -Ca3Au2S4I2_123_3154.vasp,Ca3Au2S4I2,-1.7096552454545455,0.07649333763636035 -Sr2Au1Se2I2_38_17135.vasp,Sr2AuSe2I2,-1.317702162857143,0.15030327880952077 -Ta2V2S10_11_17932.vasp,Ta2V2S10,-4.305282066428572,0.025799754107138195 -Bi4Mo4O20_14_2618.vasp,Bi4Mo4O20,-4.283710321785715,2.858158520803567 -As1Br5_47_1139.vasp,AsBr5,-0.6185687983333333,0.15887531999999932 -Ag2O2_164_338.vasp,Ag2O2,-0.9522560025,0.41484655000000004 -Pb1O2_187_14195.vasp,PbO2,-2.93576545,0.5207636116666667 -Sb2P4O14_2_15633.vasp,Sb2P4O14,-5.100146769,0.1859326133749999 -Ba2H18I2O10_2_1990.vasp,Ba2H18I2O10,-4.0593054871875,0.027413521614583214 -Nb3S6_2_13007.vasp,Nb3S6,-4.843870045555556,0.11351535944444446 -In1Co5Cl2_123_8220.vasp,InCo5Cl2,-1.11630117375,0.46075695812500006 -Sn3Bi2O9_174_16910.vasp,Sn3Bi2O9,-3.7212479449999996,0.5158235703571433 -Tl2Te2I2_59_19548.vasp,Tl2Te2I2,-0.327639885,0.4884305722222215 -Sc2P2Se6_157_16121.vasp,Sc2P2Se6,-3.253206977,0.179683619208331 -Te12As12_7_18272.vasp,Te12As12,-2.01807656,0.2783503758333308 -Li2Ag2F4_11_9823.vasp,Li2Ag2F4,-2.03201697625,-0.07827256625000012 -Sr2B2S6F2_59_17139.vasp,Sr2B2S6F2,-3.4249751141666667,0.38973171986110766 -Sc1Cu1Te6As2_149_15931.vasp,ScCuTe6As2,-1.751310486,0.2674318890833318 -Na1Sn1P1_156_11934.vasp,NaSnP,-1.81114092,0.40687825833333346 -Al2I2_129_879.vasp,Al2I2,-0.75543249,0.7070986424999987 -Sr2Ni2Ge2_129_17288.vasp,Sr2Ni2Ge2,-0.9816659266666666,0.19935087124999878 -Al1Cu3Br3O4_1_651.vasp,AlCu3Br3O4,-2.0934191972727274,0.26838283505681515 -Ba4N2_59_2164.vasp,Ba4N2,-2.5168379033333332,0.1661391000000001 -Cs1C2I3N2_25_4637.vasp,CsC2I3N2,-3.33554627125,0.3167699801041606 -Zr3Al4C6_156_21732.vasp,Zr3Al4C6,-5.90096801923077,0.14426140487178815 -Te2Ir2Cl2_11_18390.vasp,Te2Ir2Cl2,-2.0367123316666667,0.2230164777777741 -Rb2Te2C2S6Cl6_1_14949.vasp,Rb2Te2C2S6Cl6,-1.9357242644444443,0.5856114887731457 -V4Cl16_14_20317.vasp,V4Cl16,-1.8268460274999998,0.024605758500000352 -Ag4H4O4F4_14_517.vasp,Ag4H4O4F4,-2.152291438125,0.17341820375000028 -Fe1H2_115_5688.vasp,FeH2,-1.80561175,0.9157235783333311 -Ca1Cu1S2Br2_1_2824.vasp,CaCuS2Br2,-1.5680924333333335,0.2874231021180534 -Ga1Ag1As2O6_149_6109.vasp,GaAgAs2O6,-3.557444325,0.3883878948333287 -Si8Ni2_125_16547.vasp,Si8Ni2,-2.935710184,-0.5945009619999997 -Ba10Rh2_26_1799.vasp,Ba10Rh2,-0.01173174,0.44820406583333294 -K2Ge1P2H2O8F2_2_9112.vasp,K2GeP2H2O8F2,-4.51630711117647,0.06889824823529533 -K2Mg1Te2H4S8_2_9227.vasp,K2MgTe2H4S8,-2.441467683529412,0.023152948700976117 -Ga5Ag1S5Cl4_1_6582.vasp,Ga5AgS5Cl4,-2.1110225,0.13991775726399736 -Nb4B3H2_164_13036.vasp,Nb4B3H2,-5.88112628,0.3179441694444396 -In2H10N4F4_10_8458.vasp,In2H10N4F4,-3.9826574514999997,0.11511631150000046 -Sn2C2S2N2F2_11_16755.vasp,Sn2C2S2N2F2,-4.330709748,0.08199279208332655 -Ni2W2S8Cl2_129_13688.vasp,Ni2W2S8Cl2,-2.2796811221428572,0.5543732556919587 -Nb4C3_164_13048.vasp,Nb4C3,-7.300901194285714,0.4660409698214212 -Hg1Br2_187_7844.vasp,HgBr2,0.6023302333333334,0.17541290000000004 -Li2Cu3F8_2_9895.vasp,Li2Cu3F8,-1.871375703076923,-0.0006560953846176387 -Nb2Se2I2_59_12873.vasp,Nb2Se2I2,-3.184053625,0.1371579916666663 -Se3N2_164_16295.vasp,Se3N2,-2.589901694,1.1263297407499966 -P8O12_1_14149.vasp,P8O12,-5.021917643,0.23688611060000042 -K2C2N2O2_31_9013.vasp,K2C2N2O2,-5.24337725375,0.07166685124999539 -Cs2Br2F8_127_4664.vasp,Cs2Br2F8,-1.2600428033333333,0.1349623375000002 -K2Nb1S2_187_9256.vasp,K2NbS2,-2.671662544,0.3241919146666608 -In2Ni1Te4_164_8492.vasp,In2NiTe4,-1.04089447,0.06746436428571345 -Hf1P2_164_7259.vasp,HfP2,-4.721952916666667,0.8938930924999999 -As4Se6_1_1373.vasp,As4Se6,-2.403858051,0.20216696400000034 -Nb2Te4F4_12_12921.vasp,Nb2Te4F4,-3.202029324,0.21393117374999604 -Cr1Ga2S4_164_4177.vasp,CrGa2S4,-2.9737697471428572,0.09100879857142585 -Mg2Mn2Si2_129_10477.vasp,Mg2Mn2Si2,-2.000068085,0.32808577972221986 -In1Br2_164_8212.vasp,InBr2,-0.80520088,0.22624933041666673 -K2Ru2I8N2O4_7_9320.vasp,K2Ru2I8N2O4,-2.0170856211111112,0.28804602770833126 -Cd1H12C10N4O4_2_3321.vasp,CdH12C10N4O4,-5.42962226516129,0.1724167872580592 -K4Ga4Te8_5_9445.vasp,K4Ga4Te8,-1.360761241875,0.13446344875000005 -Ba2H4O6_4_1994.vasp,Ba2H4O6,-4.121329891666666,0.15248740104166414 -Bi4C4S12_14_2606.vasp,Bi4C4S12,-3.1988546935,-0.0635132231875023 -Ga2Co2Se5_156_6335.vasp,Ga2Co2Se5,-2.216402441111111,0.04604886492592142 -Tl1Pt5Cl2_38_19325.vasp,TlPt5Cl2,-1.0056865775,1.4007186846875002 -Ni1O1_123_13382.vasp,NiO,-2.212942705,-0.38709386 -Pd2I4_14_14435.vasp,Pd2I4,-0.153123635,0.13808533249999996 -Ru2Br6_51_15304.vasp,Ru2Br6,-1.207702675,0.20568540125 -Ca2Ag1Se2Br2_38_2912.vasp,Ca2AgSe2Br2,-1.4235994257142859,0.17142079857142545 -C4O8_156_2768.vasp,C4O8,-4.972700555,1.2213949983333334 -La1As2_21_9560.vasp,LaAs2,-2.8112375633333335,1.2474099641666663 -Ga2Co2Te5_164_6339.vasp,Ga2Co2Te5,-1.6238339377777777,0.2535668720370352 -Zn2As4Cl4O6_31_21030.vasp,Zn2As4Cl4O6,-2.941084745625,0.08725046992187485 -Na2H6C8O8_2_12121.vasp,Na2H6C8O8,-5.481773865416667,0.09928390590277769 -Cs2Cd4S2Br6O6_31_4686.vasp,Cs2Cd4S2Br6O6,-1.8119700829999998,0.11095468456249685 -Sb1Pd1O3_8_15481.vasp,SbPdO3,-3.151910386,0.5549153572500001 -Cu2Sn2S6_51_5320.vasp,Cu2Sn2S6,-1.8661492670000002,0.28659534562499756 -P2W1_187_14055.vasp,P2W,-4.5739316400000005,0.4056263666666666 -Cu2Te3As4Br2_6_5340.vasp,Cu2Te3As4Br2,-1.4221220945454545,0.1989140375757547 -Cs4Hg2F8_11_4811.vasp,Cs4Hg2F8,-1.1640471235714285,0.2971306592857146 -Mn2W2Cl2O8_129_11337.vasp,Mn2W2Cl2O8,-4.612452787857143,0.05895202964285362 -In2Te6Pd4_164_8642.vasp,In2Te6Pd4,-1.2687236966666666,0.17775895916666662 -Ti2B1F2_164_18884.vasp,Ti2BF2,-5.6098861079999995,-0.44190354616667216 -Au2O4F2_17_1502.vasp,Au2O4F2,-1.6819291125,0.15299269892360967 -Zr6O6_99_21862.vasp,Zr6O6,-6.27054526,0.27072374666666743 -Re1Cl2_115_14997.vasp,ReCl2,-2.4983667966666667,0.7909525307407378 -K2H2Se2_11_9128.vasp,K2H2Se2,-1.9200685899999999,0.1640095216666666 -Mn2Sb2I2O4_26_11234.vasp,Mn2Sb2I2O4,-3.016213686,0.15738073124999996 -Sc7Br10_2_16275.vasp,Sc7Br10,-2.3588767035294116,0.07991010284313527 -Pd2S6_11_14478.vasp,Pd2S6,-2.19607021875,0.19676013421874994 -Na1In1Sb2O6_5_11888.vasp,NaInSb2O6,-3.575867514,0.5928979969374999 -Ca1Si2_164_2881.vasp,CaSi2,-1.87197372,1.2853509283333333 -Tl2In2Te6_31_19451.vasp,Tl2In2Te6,-0.988530884,0.5369689513333319 -V6N2O16_11_20388.vasp,V6N2O16,-5.336426330416667,0.07622669662498893 -Al2S4_12_950.vasp,Al2S4,-3.214054636666667,0.338337629687497 -Au2I2_164_1486.vasp,Au2I2,0.67854269,0.16481976875000004 -Na2Fe2P2_12_12078.vasp,Na2Fe2P2,-1.9560124366666667,0.1149000516666665 -In2Te4_1_8634.vasp,In2Te4,-1.081555765,0.3091845533333305 -Ag2H4_2_282.vasp,Ag2H4,-1.4145625266666666,1.5614863416666642 -Cu1P1Ir1S1Cl1O2_1_4933.vasp,CuPIrSClO2,-2.6443052671428573,0.9734332184285621 -P2Pb2O8_13_14011.vasp,P2Pb2O8,-4.730895275833333,0.0954958285416665 -P10_6_13902.vasp,P10,-3.9787486260000002,0.067247359 -Ta1S1O1_156_17604.vasp,TaSO,-6.118030906666667,0.1303453458333219 -V2Te8Mo2_25_20225.vasp,V2Te8Mo2,-2.194242733333333,0.044824920555555536 -Cu2Te6As2_162_5359.vasp,Cu2Te6As2,-1.139249536,0.3016589591666652 -Zr1Br1Cl1_156_21264.vasp,ZrBrCl,-2.8639478966666663,0.05301256000000043 -B4P20_26_1761.vasp,B4P20,-3.887506264166667,0.09342141749999655 -Al2Fe2S5_187_835.vasp,Al2Fe2S5,-3.2244471133333334,-0.2662772112500028 -Mg3Ge1_25_10550.vasp,Mg3Ge,-0.56285007,-0.09882373958333329 -Co1B4C2F6_47_3700.vasp,CoB4C2F6,-4.2601568030769235,0.43369273032050193 -Pb1Br2_164_14173.vasp,PbBr2,-1.1183191333333333,0.07560487666666682 -Fe2W2O8F2_129_6032.vasp,Fe2W2O8F2,-4.55104408,0.056473795178568764 -Rh1I1Br1_8_15153.vasp,RhIBr,-0.72910749,0.3598100355555546 -Bi2Te2Cl2_59_2557.vasp,Bi2Te2Cl2,-1.3729855283333334,0.1839282683333332 -Cs2C6O6F6_4_4679.vasp,Cs2C6O6F6,-4.6277108275000005,0.22552157374999382 -Au4F8_13_1571.vasp,Au4F8,-0.41927062583333335,0.3801681249074066 -Mn1Ge3S1Br1_6_10756.vasp,MnGe3SBr,-2.4821263333333334,-0.3446897055208358 -Cr2Te4_127_4530.vasp,Cr2Te4,-1.5789546266666665,0.3640915122222226 -Bi1Cl5_47_2329.vasp,BiCl5,-0.6519264816666667,0.3593608858333325 -Sb2Te4Pb1_164_15730.vasp,Sb2Te4Pb,-1.689999632857143,-0.3885719157142862 -K1Br1O3_156_8883.vasp,KBrO3,-2.143991494,0.27854392775000036 -W1Se2_115_20455.vasp,WSe2,-353.45525087333334,-350.06379050333334 -As6Pd3_147_1389.vasp,As6Pd3,-2.2440806855555557,0.6385695211111106 -V1Ga2Se4_164_19836.vasp,VGa2Se4,-2.56096365,-0.022904214642859577 -Ce2Si2I2_164_3682.vasp,Ce2Si2I2,-3.1446865833333333,0.04048213333333317 -Nb4Zn4Fe2O16_7_13184.vasp,Nb4Zn4Fe2O16,-4.915985421153846,0.08128040538461084 -Mn1Co1S2I1Cl1_6_10671.vasp,MnCoS2ICl,-1.99242894,0.14708294409721742 -Sr2P1_25_17292.vasp,Sr2P,-1.1411428466666667,0.8812416424999991 -K2Cr6Bi2O24_2_9087.vasp,K2Cr6Bi2O24,-4.40044959382353,-0.14732636493260265 -V2Se4_127_20192.vasp,V2Se4,-2.2733717616666667,0.8732319566666664 -Zr1Ti1Te1S1I2_1_21477.vasp,ZrTiTeSI2,-3.142846815,0.010062580138886501 -Ru2N2Cl2_59_15327.vasp,Ru2N2Cl2,-3.5863511566666664,0.010442438611108051 -Ba2C4S4O12F12_13_1934.vasp,Ba2C4S4O12F12,-4.072702544411764,0.18426548632352668 -Mn1Ag1Te1Se1_1_10622.vasp,MnAgTeSe,-1.03909252,0.35549107781250056 -Fe2P2Pt2_129_5913.vasp,Fe2P2Pt2,-2.0458719816666666,0.6056498758333309 -Rb1Nd2Se2_164_14745.vasp,RbNd2Se2,-2.334096216,0.4495950660000003 -Rh2Cl8_2_15187.vasp,Rh2Cl8,-0.9848157179999999,0.22246575949999992 -B2P6H10C2N2_2_1695.vasp,B2P6H10C2N2,-4.603181365454545,0.26943443863635386 -Mg2Sn4O8_12_10520.vasp,Mg2Sn4O8,-4.0646593357142855,0.1911061303571393 -Mn2Sb2Se4Br2_10_11246.vasp,Mn2Sb2Se4Br2,-1.9259203,0.08649808274999793 -Ti2Br2N1_164_18897.vasp,Ti2Br2N,-5.213439278,0.00764109319999795 -Ga4S6_1_6565.vasp,Ga4S6,-2.7331012770000003,0.1880162129999996 -Rb2Sr4I10_2_14944.vasp,Rb2Sr4I10,-0.968509885,0.20580516583333208 -Sb2Te6Mo2_12_15736.vasp,Sb2Te6Mo2,-1.859403067,0.17480651249999812 -Mn1C6Se2N4_10_10660.vasp,MnC6Se2N4,-5.515243751538462,0.6773653234615298 -Co2S2_164_3981.vasp,Co2S2,-2.5079318325,0.23255347104166413 -Ce1Si2_123_3657.vasp,CeSi2,-3.2196981566666665,0.9639863466666663 -K4Cu2Sb2S6_7_9442.vasp,K4Cu2Sb2S6,-1.76078778,0.10054061142856785 -Sc1Se3_99_16000.vasp,ScSe3,-2.7557335575,0.5779090787499999 -Te4W3_12_18635.vasp,Te4W3,-2.5891361500000003,1.023277404285708 -Sb1Pb3Se1S2Br3_1_15480.vasp,SbPb3SeS2Br3,-1.547556933,0.2762713851874988 -Sr2Te2Au1Cl2_38_17325.vasp,Sr2Te2AuCl2,-1.2942841414285715,0.403532624999997 -Hf1Bi1P1_156_7116.vasp,HfBiP,-3.8615782166666666,0.4480746024999962 -Mn1Sb1Te1Br1_8_10864.vasp,MnSbTeBr,-1.329099055,0.38871637968750006 -Cr2O2F2_59_4434.vasp,Cr2O2F2,-4.1567619166666665,0.036097194999995974 -Cr3W1O8_25_4585.vasp,Cr3WO8,-5.271345220833333,0.017066621302079366 -Sc2Se2I2_59_16157.vasp,Sc2Se2I2,-2.868153498333333,0.04459235833333386 -Zr1Bi1_25_21260.vasp,ZrBi,-1.77031964,1.3327923441666665 -Ti1P2_187_18825.vasp,TiP2,-4.8667081366666665,0.7710149541666667 -Mn3I1Br1N1O1_6_11391.vasp,Mn3IBrNO,-2.893697022857143,0.27816923616071165 -Ti2O2_10_18974.vasp,Ti2O2,-6.4423868325,0.7948303308333333 -Ta1V1Cl2F2_8_17638.vasp,TaVCl2F2,-3.4090964550000002,0.22792577321969343 -Ta4Si2S8_55_18113.vasp,Ta4Si2S8,-5.074943149285715,0.1816541949206253 -K2Fe2C12N6O6_147_9101.vasp,K2Fe2C12N6O6,-5.948228210714285,0.34484577427081786 -Co2S6_11_3989.vasp,Co2S6,-2.639174445,0.3822629024479136 -Mn1Nb1Te2S1_25_10817.vasp,MnNbTe2S,-2.9650107080000003,0.3485534835172365 -Sn1Ge1Bi1S1I1Br1_1_16632.vasp,SnGeBiSIBr,-1.57022436,-0.019330794444447276 -Zr2Si2S8_31_21686.vasp,Zr2Si2S8,-4.080123348333333,0.24706218958333337 -K2I2_129_9206.vasp,K2I2,-0.4954671025,-0.41457848249999996 -Sr2Sb4O12_2_17311.vasp,Sr2Sb4O12,-4.126020433333333,0.5003189411111117 -Al4I4_57_1073.vasp,Al4I4,-0.9601845125,0.5023466199999986 -Al2S2I2_31_940.vasp,Al2S2I2,-2.4363735766666665,0.07737018597222 -Zn2Si2S6_162_21170.vasp,Zn2Si2S6,-2.55126265,0.2541349198000007 -Hf2C2Br2_12_7462.vasp,Hf2C2Br2,-5.450758431666666,0.29935331166666224 -Hf1Sc1Cl2O2_1_7294.vasp,HfScCl2O2,-5.178777106666667,0.195536313030291 -Mn1Ge1Se2Br2_1_10750.vasp,MnGeSe2Br2,-1.901523045,0.041877089027777537 -V4C3S2_164_20315.vasp,V4C3S2,-5.434211393333333,-0.26797515984568965 -Bi2W1_187_2581.vasp,Bi2W,-2.2086126066666667,0.4418017799999978 -As8S6_11_1403.vasp,As8S6,-2.96239234,0.07626257008928289 -Ga4Cl4_28_6549.vasp,Ga4Cl4,-1.611494415,-0.0452418162499999 -Al2F6_191_822.vasp,Al2F6,-3.84016611875,0.15451322124999978 -Sc2Te2_123_16181.vasp,Sc2Te2,-2.57457901,0.6322624600000002 -Ga2Te3_164_6513.vasp,Ga2Te3,-1.285311992,0.5247119932 -Ga3Ag1Cl4O4_35_6524.vasp,Ga3AgCl4O4,-2.663827705,-0.007203465833336031 -Te6Pd2_11_18678.vasp,Te6Pd2,-1.25760920375,0.2521206379166668 -Mn1Nb2H1Br2O4_1_10819.vasp,MnNb2HBr2O4,-4.7353313329999995,0.3233509815000019 -V2C1Se2_164_20022.vasp,V2CSe2,-4.414217562,0.03006538999999986 -Ti1V2Cr1O10_115_18867.vasp,TiV2CrO10,-5.575354597142857,0.021134275133924074 -Mn1Fe1Ge2O8_12_10707.vasp,MnFeGe2O8,-4.358572353333334,0.13469863786457903 -Ni1H4C4N2Cl2_47_13341.vasp,NiH4C4N2Cl2,-4.703084193076923,0.2423063461538309 -Ba2C2O6_10_1932.vasp,Ba2C2O6,-5.525978536,0.36458006249999997 -Ho2Fe2Ge4_129_8138.vasp,Ho2Fe2Ge4,-2.43427756625,0.3922083383333299 -Au3I2O2_6_1560.vasp,Au3I2O2,-0.3157123628571429,0.9148281347142836 -B2S2_164_1699.vasp,B2S2,-4.77049035,0.033194422499999376 -Y2Ga2Br2_164_20733.vasp,Y2Ga2Br2,-3.1458485433333334,0.03141990333333311 -Rb2Os2N2Cl10O2_11_14910.vasp,Rb2Os2N2Cl10O2,-2.5056249816666667,-0.18960259329365436 -Al4Si4O18_1_1098.vasp,Al4Si4O18,-5.4995303611538455,0.31105635980768276 -Ti2Si4_129_19029.vasp,Ti2Si4,-4.963255666666667,0.45877700833333357 -Mn1Se2_187_10880.vasp,MnSe2,-2.2577223966666664,0.03730121666666708 -Cd2Ag2Se2I2_26_3448.vasp,Cd2Ag2Se2I2,0.13933204125,-0.22613840375 -Cr1S2_187_4250.vasp,CrS2,-3.41406811,0.0495450966666664 -Zr2H2Cl2_164_21578.vasp,Zr2H2Cl2,-3.581333295,0.040619498333333226 -Mn1Ir2Se2S1Br2_1_10790.vasp,MnIr2Se2SBr2,-2.0422145875,0.2793248570833287 -Ni1H8C6S4_10_13360.vasp,NiH8C6S4,-4.391723334210527,0.2551748757894655 -Li4Fe1P2O8_2_10184.vasp,Li4FeP2O8,-5.010499282,0.04000117283332916 -I12N4_7_8156.vasp,I12N4,-0.6283389125,0.4691455170312502 -C2Cl6_1_2744.vasp,C2Cl6,-1.8741310625,0.391521269375 -Nb2Te4Cl10O1_2_12919.vasp,Nb2Te4Cl10O,-2.3014770611764708,0.14269759824754497 -Cu2I3Br3_1_5174.vasp,Cu2I3Br3,0.224498485,0.2040002957552085 -Ge8O12_14_6972.vasp,Ge8O12,-4.6938968425,-0.08043028425000465 -Hg4I2O2_5_8076.vasp,Hg4I2O2,0.4245068125,0.231827886875 -Cu6Bi2Se4O16_59_5493.vasp,Cu6Bi2Se4O16,-2.881990889642857,0.32286675444195806 -Ag4Se2S12_14_558.vasp,Ag4Se2S12,-1.591217107222222,0.2312444879166653 -Re4S8_2_15114.vasp,Re4S8,-4.8703719224999995,0.06969890166666737 -Mn2Cl4_164_11053.vasp,Mn2Cl4,-1.7617033583333335,0.034099204999999744 -K2Hg4S8F6_31_9184.vasp,K2Hg4S8F6,-1.0517840939999998,0.3340467895624989 -Mn1Sn1Br2O1_1_10890.vasp,MnSnBr2O,-2.083553158,0.18070542950000013 -Nb2I6_162_12752.vasp,Nb2I6,-1.56871317625,0.2482909423437485 -Nb2H2_12_12736.vasp,Nb2H2,-4.6661184875,0.47942144999999936 -Cu1Te1Ru1I1_25_4990.vasp,CuTeRuI,-0.778536365,0.695558266874999 -Nb4S2N3F2_164_13141.vasp,Nb4S2N3F2,-5.681732058181819,0.45901065449999 -Mn2Co1C12_164_11059.vasp,Mn2CoC12,-5.394163116666666,1.4985529866666576 -Na2H6S2N10_51_12130.vasp,Na2H6S2N10,-4.535871895,-0.08430360731250153 -Re2N4_187_15059.vasp,Re2N4,-7.001972221666667,-0.518674231388895 -Co2Te3O8_5_4042.vasp,Co2Te3O8,-3.4843845976923076,0.1035957809615331 -Hg2H4S10_31_7965.vasp,Hg2H4S10,-2.065062008125,0.18014936382812496 -Ca1Ag1Br1Cl1O2_1_2788.vasp,CaAgBrClO2,-1.7836674033333333,0.3490661060416645 -Sb2Rh2S6_162_15667.vasp,Sb2Rh2S6,-2.735795794,0.3498127804736815 -Sr2Cl2F2_129_17179.vasp,Sr2Cl2F2,-3.0818249283333334,0.09077703333333309 -Zr1Co1H6_8_21282.vasp,ZrCoH6,-3.22311500375,0.8177571587500003 -Sr2Ag1S2F2_38_17106.vasp,Sr2AgS2F2,-2.2584523185714285,0.5626258349553519 -Cu2H4C12N4O8_2_5116.vasp,Cu2H4C12N4O8,-5.821854003666667,0.3861249321110991 -Sc1Se2_115_15997.vasp,ScSe2,-2.875961136666667,0.7995661938888856 -K2Br2F8_127_9008.vasp,K2Br2F8,-1.2611308016666667,0.1676759750000001 -Y1Mn1Cl2_156_20649.vasp,YMnCl2,-2.6036421325,0.5960445900323276 -Nb4Co4Te8_14_13059.vasp,Nb4Co4Te8,-2.925623350625,0.023603966250000052 -Sn2I2O2_59_16783.vasp,Sn2I2O2,-2.2623266166666665,0.27606807638888897 -Al1As2Au1O6_149_607.vasp,AlAs2AuO6,-3.75367466,0.8257814916249961 -P1Pd2S2_187_13935.vasp,PPd2S2,-2.30225262,0.4784682334999981 -Ga1Sb2Au1S6_149_6266.vasp,GaSb2AuS6,-2.080921284,0.3846066014687477 -Sb4O6_59_15788.vasp,Sb4O6,-4.140326304,0.11716416350000003 -Rb4Cr4Cl4O12_14_14968.vasp,Rb4Cr4Cl4O12,-3.7085050729166666,-0.10917802480324434 -B13As2_164_1606.vasp,B13As2,-4.93125855,0.9976644345555502 -Ru1C2_123_15263.vasp,RuC2,-4.705087310000001,2.1051116183333267 -Sc2P2O8_2_16118.vasp,Sc2P2O8,-6.028391341666667,0.22325038083333393 -Rh2Cl2O2_59_15182.vasp,Rh2Cl2O2,-2.7128405483333338,0.1718243458333304 -Ag1Sb1As2Se6_143_116.vasp,AgSbAs2Se6,-1.9255465310000002,0.7920843714166613 -Sr2I2F2_129_17255.vasp,Sr2I2F2,-2.532062965,0.053480653333333183 -Ta2Al2O8_10_17645.vasp,Ta2Al2O8,-6.446887253333333,0.45724239999999927 -Zn1In2O4_156_20966.vasp,ZnIn2O4,-3.2349525671428574,0.27906304232142565 -Ag2P2S6_162_351.vasp,Ag2P2S6,-2.317567245,0.11111631633333041 -Al1Te6P2Au1_149_750.vasp,AlTe6P2Au,-1.7181673329999998,0.08893643109722027 -Cr2Se1S1Br2_1_4490.vasp,Cr2SeSBr2,-2.3298080066666667,-0.18154220750000005 -In4Se4Cl4_14_8693.vasp,In4Se4Cl4,-1.7374158941666666,0.006658399166666662 -Sb1Te1_123_15512.vasp,SbTe,-1.258492895,0.6606896787499978 -Sn1Br2_187_16620.vasp,SnBr2,-1.0191023966666666,0.14788918833333353 -Sm2Cl2F2_129_16568.vasp,Sm2Cl2F2,-3.388849765,0.3229888286111078 -Ta2C1S2F2_164_17678.vasp,Ta2CS2F2,-4.9069404557142855,0.850909744285704 -Eu1Pb2_164_5592.vasp,EuPb2,-1.29249843,0.018992291666665495 -Ru2F2_5_15315.vasp,Ru2F2,-2.5426520925,0.5707522699999972 -Ba3Mn2S5Cl2_123_2116.vasp,Ba3Mn2S5Cl2,-2.9058579350000002,0.19126257270832991 -Sr4Ce2_12_17415.vasp,Sr4Ce2,-0.015669248333333333,0.9572326533333324 -Pd2F2_164_14421.vasp,Pd2F2,-1.0804659775,0.4094576462499998 -Li2H2S2_4_9931.vasp,Li2H2S2,-3.2066055799999997,0.08306434583333377 -Mn1Cu1Ge1I1O8_3_10684.vasp,MnCuGeIO8,-3.4201565891666665,0.1744935443749974 -Os2Cl2O2_59_13837.vasp,Os2Cl2O2,-3.4491047733333335,0.4998932058333292 -Bi1Mo1P1_156_2346.vasp,BiMoP,-2.7398378099999996,-0.06861864166666898 -Rb2Cd4Se2O6F6_31_14818.vasp,Rb2Cd4Se2O6F6,-1.9317829544999998,0.4061218432500002 -Hf1S2_187_7283.vasp,HfS2,-5.08184312,0.3599211466666663 -Ta2Te4I4_12_17916.vasp,Ta2Te4I4,-2.128128486,0.1687447138611089 -Ba2Al4Cl16_13_1899.vasp,Ba2Al4Cl16,-2.367936784090909,0.04100638227272757 -K2Os2N2O2F10_11_9282.vasp,K2Os2N2O2F10,-3.288492562777778,0.048705467222216026 -Ni2S8_12_13600.vasp,Ni2S8,-1.934216254,0.21910401999999807 -Nb4Fe4Se8_53_13073.vasp,Nb4Fe4Se8,-3.039500185625,0.6973688850000004 -Hf3Zr1N4Cl4_8_7751.vasp,Hf3ZrN4Cl4,-6.057329523333333,0.048903552500000336 -Sb2Te2Cl2_59_15712.vasp,Sb2Te2Cl2,-1.5898960083333333,0.15488821166666655 -Li2Fe2As2_129_9903.vasp,Li2Fe2As2,-1.964995565,0.17285292666666696 -Cu2Br2O4_17_5050.vasp,Cu2Br2O4,-1.61948389375,0.24893765187500017 -H2C6_164_6995.vasp,H2C6,-6.93810398875,0.04996857375000063 -B2S3_150_1702.vasp,B2S3,-4.250546443999999,0.18311292150000114 -Zr1Sc1I2O2_25_21433.vasp,ZrScI2O2,-4.342785521666666,0.17197050296295746 -Cu2C2O2F2_31_5064.vasp,Cu2C2O2F2,-3.6079725825,0.41430508624999995 -Sb4Te3Au2Cl2_6_15831.vasp,Sb4Te3Au2Cl2,-0.9864746536363637,0.3983683801818152 -Hf2Cl4O2_39_7477.vasp,Hf2Cl4O2,-4.7124984475,0.18606092906250016 -Mn2Sb2S4Br2_10_11237.vasp,Mn2Sb2S4Br2,-2.287226115,0.02852951024999742 -Na1N3_187_11908.vasp,NaN3,-3.9022295425,1.53431322 -Tl1Bi1_187_19226.vasp,TlBi,0.161335505,0.6836513587499999 -Cr8Se24_14_4632.vasp,Cr8Se24,-2.4804589965625,0.17140235302083318 -V2Ag1S6_1_19968.vasp,V2AgS6,-2.7533287377777778,0.32490795805555295 -Ga2Ni2S5_187_6404.vasp,Ga2Ni2S5,-2.185301568888889,0.07241304703703505 -Ba1Sn1S2_6_1858.vasp,BaSnS2,-2.696616685,0.34874124250000005 -Zr1Ni1I6_149_21378.vasp,ZrNiI6,-0.73839594125,0.027832311458333314 -Ni1Pd1F6_2_13395.vasp,NiPdF6,-1.34275344625,0.0417448062500001 -Ge2N2Cl2_59_6785.vasp,Ge2N2Cl2,-3.6398979083333334,0.14036575187499745 -Pb1Cl2_115_14178.vasp,PbCl2,-1.2826648533333334,0.003287528333333345 -In4Sb4_127_8689.vasp,In4Sb4,-0.8769869575,-0.11510617249999999 -Na1Sb2Pd1O6_5_11928.vasp,NaSb2PdO6,-3.445342385,0.5027788876249958 -Sc2As2O8_2_16026.vasp,Sc2As2O8,-5.201748791666667,0.21809167083333403 -Ni2Br2_129_13480.vasp,Ni2Br2,0.50442118,0.815745865 -Mg2In2S5_164_10472.vasp,Mg2In2S5,-2.639220708888889,-0.1253878869444442 -Sr8C4_59_17494.vasp,Sr8C4,-1.4233077208333331,1.4870061033333275 -Cu2C2S2Br2_31_5065.vasp,Cu2C2S2Br2,-2.20392568,0.5828105919047605 -Te4H2Pd2_6_18586.vasp,Te4H2Pd2,-1.67780793,0.6454154062500002 -Cr2Sb2O10_129_4478.vasp,Cr2Sb2O10,-4.290390926428572,0.20688358089285402 -Ta4Mn2Zn4O16_13_18056.vasp,Ta4Mn2Zn4O16,-5.218515006923076,0.12791991211538245 -Co2Bi2S4Br2_10_3862.vasp,Co2Bi2S4Br2,-1.9090043739999998,0.29039735541666734 -Ni1P3S2_8_13392.vasp,NiP3S2,-2.667185645,0.5709901144318157 -W2I2_129_20500.vasp,W2I2,-1.55543663,1.7519580772916665 -Rh2Se2_6_15244.vasp,Rh2Se2,-2.00967784,0.4426260842045431 -Ca2H2S6N2_59_3034.vasp,Ca2H2S6N2,-3.0022907441666664,0.46871923595051845 -Ca3Fe2S5I2_123_3178.vasp,Ca3Fe2S5I2,-2.2062622325,-0.09189656091666887 -Zr1Ti1S2Br1Cl1_6_21473.vasp,ZrTiS2BrCl,-4.0920342566666665,-0.09200038052084158 -Ru4Se8_13_15372.vasp,Ru4Se8,-2.5724978366666664,0.6221026233333338 -Hg2Sb2Br2O4_11_8002.vasp,Hg2Sb2Br2O4,-2.076805995,0.25774670325000093 -Cu2Br2_156_5052.vasp,Cu2Br2,-0.0841092775,0.2955700175 -Zr1Te1S1_156_21462.vasp,ZrTeS,-3.7504767033333333,0.1810009783333293 -Hf1Ti3S8_1_7342.vasp,HfTi3S8,-4.9328325075,0.27459506916666676 -V2C1Cl2_164_20016.vasp,V2CCl2,-3.983495286,0.0017714101333309307 -Nb4Te12I2_2_13166.vasp,Nb4Te12I2,-2.4915841983333333,0.10543717722222201 -Zn2Fe2F10_1_21075.vasp,Zn2Fe2F10,-1.8481607507142856,-0.12171796464285856 -V2H2C1_164_20074.vasp,V2H2C,-4.486919046,0.15778293600000026 -Cs2C2O8F6_4_4669.vasp,Cs2C2O8F6,-2.768277084444444,0.7767455079166639 -Sm2S2_129_16582.vasp,Sm2S2,-4.2133067625,0.2154075175000001 -Co2H4Se2S8_4_3919.vasp,Co2H4Se2S8,-2.656455355,0.3547131200781223 -Al2Se2_129_972.vasp,Al2Se2,-2.5393998775,0.40895916749999994 -Al2O2_123_915.vasp,Al2O2,-4.1634263425,1.3435161666666624 -H2Pd2_164_7019.vasp,H2Pd2,-1.95839922,0.9168944099999998 -Ni2H2S2_59_13511.vasp,Ni2H2S2,-1.7386606683333332,0.29740087527777603 -Pd2N4O12_14_14440.vasp,Pd2N4O12,-4.098540278333334,0.0575745994444441 -Sn2S8O2_7_16847.vasp,Sn2S8O2,-2.6800688116666667,0.3724621784374975 -Zr3B2Se2F2_5_21744.vasp,Zr3B2Se2F2,-3.9815625444444445,0.9348506991666579 -P2O3_6_13998.vasp,P2O3,-4.711286264,0.5475174896000006 -Ta2Br2O2_59_17665.vasp,Ta2Br2O2,-5.118686123333333,0.2636613292142801 -Al1Pd5Cl2_123_709.vasp,AlPd5Cl2,-1.28237002,0.4326410079166648 -Ca2C2Cl2O6_59_2967.vasp,Ca2C2Cl2O6,-4.63298997,0.2833782029166645 -Mn1Cu1S1Br2O1_8_10688.vasp,MnCuSBr2O,-1.7315806016666666,0.23406734999999512 -Li2Ta2Cl12_4_10077.vasp,Li2Ta2Cl12,-2.734832010625,0.022468626875000286 -Te6As2Ru2_162_18647.vasp,Te6As2Ru2,-2.181294461,0.44743650616666575 -Ta2Si2P2_129_17885.vasp,Ta2Si2P2,-5.603749311666667,-0.1341164483333389 -Ge1I2_187_6674.vasp,GeI2,-1.0289880033333334,0.18983725333333323 -Au4Se3S5_143_1595.vasp,Au4Se3S5,-0.9769559208333334,0.4023639131249986 -Cu2P4Se3F2_6_5226.vasp,Cu2P4Se3F2,-2.233662812727273,0.3798396384753743 -Mo2H2_164_11615.vasp,Mo2H2,-3.191402425,1.9060957975 -K2B2C2Se2_31_8982.vasp,K2B2C2Se2,-2.9613169275,1.3712867121527723 -Ba4Fe2S6Cl2_129_2153.vasp,Ba4Fe2S6Cl2,-2.8375912528571425,-0.12444747810268308 -Sm1Si5_47_16559.vasp,SmSi5,-3.56313669,-0.01900391916666999 -Mn1Sb2S4_12_10871.vasp,MnSb2S4,-2.7429180828571424,0.2391890203571408 -Bi2Te4Au2_26_2572.vasp,Bi2Te4Au2,-0.64250457625,0.631417380625 -Li1Cr1S2_156_9683.vasp,LiCrS2,-3.012906635,0.7590258599999999 -Pb2S2O6_11_14276.vasp,Pb2S2O6,-3.865990729,0.13069797949999626 -Cr1Co2O6_12_4145.vasp,CrCo2O6,-4.230115913333333,-0.6009379629861185 -Sc4N3Cl2_164_16249.vasp,Sc4N3Cl2,-5.432889618888889,-0.20837298555556005 -Gd2Te6_129_6627.vasp,Gd2Te6,-2.45910281875,-0.7200914724999998 -Na2Hg4Se2S6Cl6_31_12167.vasp,Na2Hg4Se2S6Cl6,-0.9090417855,0.24254456843750027 -N2F8_1_11786.vasp,N2F8,-1.448870845,0.19845096537499662 -Ge1As1_8_6637.vasp,GeAs,-2.79835364,0.5908046574999997 -Se8O20_14_16309.vasp,Se8O20,-3.362247061785714,0.13453308553571164 -Hg2S2_164_8001.vasp,Hg2S2,-0.0157645825,0.1904487775 -Sr2Cu1O2F2_38_17199.vasp,Sr2CuO2F2,-3.26545393,0.34040579999999454 -Nd2Te4Se2_129_13246.vasp,Nd2Te4Se2,-2.8816765,0.051140556250000024 -Y1Br2_115_20612.vasp,YBr2,-2.561840306666667,0.4949431527777748 -Ag2C6Cl2F4_2_232.vasp,Ag2C6Cl2F4,-3.6709688064285717,0.44873798214285543 -Gd1_47_6597.vasp,Gd,-0.20879667,1.8984565450000002 -Ge2Br2_5_6757.vasp,Ge2Br2,-1.89906707,-0.12224410375000005 -Ag1H4C12O2_6_73.vasp,AgH4C12O2,-5.5362961531578945,0.9115880219298231 -Mg2As1_164_10421.vasp,Mg2As,-1.0862953933333335,0.4996644069444439 -Nb1Te1O1_156_12594.vasp,NbTeO,-4.768573906666666,0.4186413770138897 -Na1W2S2Cl6_47_11955.vasp,NaW2S2Cl6,-2.4757686090909092,0.22092066602271976 -Ni1Pb2C12_12_13393.vasp,NiPb2C12,-4.736687649333334,2.025464161333332 -Bi4O8_11_2630.vasp,Bi4O8,-3.4793184641666666,0.2882323817708303 -Pt2Cl2_164_14612.vasp,Pt2Cl2,-1.2174519525,0.46402757875 -P18I4_11_13909.vasp,P18I4,-3.222537461818182,0.031339730454542636 -V1Ag1O2_156_19756.vasp,VAgO2,-3.7899517575,0.2876593325000001 -Sn2Cl2_164_16760.vasp,Sn2Cl2,-1.2061269675,-0.6739878699999999 -Sb4S6_4_15818.vasp,Sb4S6,-2.596609437,0.2073836830000002 -Mn3Te1O8_12_11416.vasp,Mn3TeO8,-4.22748349,0.16279651781249926 -Li1In1Sb2O6_5_9734.vasp,LiInSb2O6,-3.696880634,0.6327475511875003 -Ni2Se2I1Br1_6_13633.vasp,Ni2Se2IBr,-0.6145674,-0.040700965520833354 -In2Ni2Se5_164_8500.vasp,In2Ni2Se5,-1.4113419844444444,0.04491107666666505 -Li2C2S2N2_11_9849.vasp,Li2C2S2N2,-5.16446430625,-0.19615114591146443 -Mn1Ge1Se1Br3_3_10746.vasp,MnGeSeBr3,-1.457356185,0.24620374972222214 -Pb3N4_1_14303.vasp,Pb3N4,-3.968738657142857,-0.23737282142857374 -Ga2Se2I2_59_6473.vasp,Ga2Se2I2,-1.4581741866666666,0.15449664333333324 -Zr1Mo1Se1S1I1Br1_6_21329.vasp,ZrMoSeSIBr,-2.889156123333333,0.23049082392360326 -Ca2H12C4O14_2_3028.vasp,Ca2H12C4O14,-5.00585358,0.0816552198437499 -Hf3N2_187_7722.vasp,Hf3N2,-7.198607647999999,0.6610834920000004 -Te4Pd6Pb4_59_18619.vasp,Te4Pd6Pb4,-1.2562168171428572,0.2061702335714286 -Cu1Pb2Cl2O4_99_4937.vasp,CuPb2Cl2O4,-2.048205082222222,0.4254718041666645 -Ga2S2O8F2_11_6445.vasp,Ga2S2O8F2,-3.559016601428571,0.6444655997619013 -Sb4As2H2O12_4_15760.vasp,Sb4As2H2O12,-4.29781335,0.12027384504166205 -Dy2Te6_51_5536.vasp,Dy2Te6,-2.04972817625,0.4165369012500002 -Ca1F2_115_2831.vasp,CaF2,-3.34438076,0.49936753666666656 -V2Os1Se5Br2_6_20133.vasp,V2OsSe5Br2,-2.5289803429999997,0.31491844009999814 -Se4I4_2_16300.vasp,Se4I4,-0.68065144375,0.2502074773611104 -Ti4Se4F4_31_19163.vasp,Ti4Se4F4,-4.4557918325,-0.5137120047222301 -Cu2Te2_10_5335.vasp,Cu2Te2,-0.3267625625,0.24071797249999993 -Zr1Ti1Te1C1Br1_8_21476.vasp,ZrTiTeCBr,-4.35608867,0.5167849610000002 -Mo4C3F2_164_11735.vasp,Mo4C3F2,-4.698185854444445,0.1506531695370268 -Fe2O6_12_5898.vasp,Fe2O6,-3.28423460125,0.36151216875000003 -Al2Se3_164_973.vasp,Al2Se3,-2.9458421820000003,0.006782607999999968 -Tl4Cu4P4Se12_14_19600.vasp,Tl4Cu4P4Se12,-1.7303570216666666,0.1384439875000001 -Zn1Ag1I1Br1_1_20894.vasp,ZnAgIBr,0.73020725,0.5004525773809526 -V2Ag2P4S12_13_19973.vasp,V2Ag2P4S12,-3.0213941214999998,0.04095463526041798 -Cd4Br4O4_14_3620.vasp,Cd4Br4O4,-0.6442947325,0.44356179006944185 -Ga2Fe2O5_187_6355.vasp,Ga2Fe2O5,-4.186398321111111,-0.06468559131944662 -Tl2Te6Pd4_164_19560.vasp,Tl2Te6Pd4,-1.1512862841666667,0.2000807558333335 -Cd2Bi2Se4I2_10_3476.vasp,Cd2Bi2Se4I2,-0.7360016970000001,-0.055579289999999976 -Cu1B2Mo1Ir1Rh3C1Se5I1_1_4843.vasp,CuB2MoIrRh3CSe5I,-2.8781607486666667,0.31733593447914976 -Fe3Se1Br1Cl2O3_1_6065.vasp,Fe3SeBrCl2O3,-2.202645199,0.3170730800833307 -Cd2Te1I2_1_3582.vasp,Cd2TeI2,0.5474800639999999,-0.13357549566666627 -V4O4F12_14_20346.vasp,V4O4F12,-3.826733523,-0.6968269137499998 -Ba1Tl1Sn2O6_1_1873.vasp,BaTlSn2O6,-3.638108255,0.43595109056249565 -P2Os2S6_162_14000.vasp,P2Os2S6,-3.636045215,0.3640277246538379 -Pb1S1_123_14197.vasp,PbS,-1.777263135,-1.1041296900000002 -Ta3S2N2_187_17986.vasp,Ta3S2N2,-6.9534267000000005,0.3619757959523744 -Tl2V2H12S2O18_4_19562.vasp,Tl2V2H12S2O18,-4.352393245555556,0.09382132513887975 -Ag2As4S3Br2_6_165.vasp,Ag2As4S3Br2,-1.7989183527272727,0.09985254460226867 -Ga4As4_127_6540.vasp,Ga4As4,-1.99447471875,-0.29491719375000014 -Zr1Sb1P1_156_21420.vasp,ZrSbP,-3.46572628,0.9685191316666627 -Ca2Cu1Te2I2_38_3009.vasp,Ca2CuTe2I2,-0.9438975842857144,0.2308726319999977 -W2N2Cl2_59_20512.vasp,W2N2Cl2,-4.944486141666666,-0.21588946055556013 -Hf3Te1Mo1Se2S1I1Cl1_1_7733.vasp,Hf3TeMoSe2SICl,-3.737143977,0.48363647381250063 -Ta2Te2_164_17910.vasp,Ta2Te2,-4.3130014975,0.433377533749995 -Ge1B1F2_156_6640.vasp,GeBF2,-3.484318915,0.05107023277777378 -Ga2S2_123_6446.vasp,Ga2S2,-2.2575236025,0.5982028924999998 -Nb4Cl16_14_13049.vasp,Nb4Cl16,-2.5795460169999997,0.1343474235000004 -Ca2Au1S2I2_123_2936.vasp,Ca2AuS2I2,-1.4935841942857144,0.18252067771428226 -Al2Cr1O4_164_812.vasp,Al2CrO4,-5.491830384285714,0.3464942142857097 -K1C12_191_8886.vasp,KC12,-7.4033815807692305,0.034787339999993616 -Tl1Ag1Sb2O6_149_19205.vasp,TlAgSb2O6,-2.815226499,0.7598808115 -Ti2S1I1Br1_156_18992.vasp,Ti2SIBr,-3.980078666,-0.16129531829167687 -Mg4Ti4Ge8O24_14_10589.vasp,Mg4Ti4Ge8O24,-5.444361421,0.012815619124995958 -Ru2S2I2_59_15341.vasp,Ru2S2I2,-2.2393816183333333,0.0706453116666641 -As4O8_11_1340.vasp,As4O8,-4.231355063333333,0.20984812208332526 -Na2C4S6F6_2_12010.vasp,Na2C4S6F6,-3.4418816916666666,0.1926735542361021 -B2Mo3H2_187_1680.vasp,B2Mo3H2,-4.060093558571428,0.9440856499999909 -Li8Cr3Te1O12_3_10283.vasp,Li8Cr3TeO12,-4.415426604166666,0.14699973622684404 -Te6Ir2_11_18652.vasp,Te6Ir2,-1.84748003125,0.459904130138887 -Cd1B4H4Br2N2_3_3275.vasp,CdB4H4Br2N2,-3.86516024,0.542580286807691 -Co2S2_123_3983.vasp,Co2S2,-2.4684805175,0.2720047860416641 -Zn1Bi1Se1S2_8_20900.vasp,ZnBiSeS2,-1.578384842,0.2841617207375002 -Ti2Sb1Se2_164_19009.vasp,Ti2SbSe2,-4.41540517,-0.5506373129999993 -V1Mo1Br2Cl2O2_8_19876.vasp,VMoBr2Cl2O2,-3.02253676375,0.00212062348213668 -Tl2Cu6Se4_12_19407.vasp,Tl2Cu6Se4,-0.61194918,0.39442485833333213 -Mo2N1Cl2_12_11632.vasp,Mo2NCl2,-3.38984924,0.27837161666666654 -Tb2Pb1_164_18205.vasp,Tb2Pb,-1.37894634,0.7728232445833336 -Cu2Br2_51_5053.vasp,Cu2Br2,0.09600251,0.475681805 -W2I4O4_26_20502.vasp,W2I4O4,-3.640449526,0.007435178000000153 -Sb4O4F4_14_15782.vasp,Sb4O4F4,-3.60228421,0.07563867479166664 -Tl3Ir1_187_19576.vasp,Tl3Ir,-0.1900975725,0.9534687125000001 -Ta2Br8_1_17674.vasp,Ta2Br8,-2.193984587,0.2057926874375 -Cr2H2N1_164_4398.vasp,Cr2H2N,-3.994165844,-1.7735640834444477 -Sb4Au2Se3Br2_6_15766.vasp,Sb4Au2Se3Br2,-1.151537429090909,0.6624581846969664 -Sn1S2_187_16682.vasp,SnS2,-2.2827978866666667,0.3303371799999999 -V1S1F2_47_19910.vasp,VSF2,-3.236312475,-0.016303018437502814 -Bi1Br5_47_2323.vasp,BiBr5,-0.32300154333333336,0.3357325374999993 -Fe2Sb4I4O6_11_5966.vasp,Fe2Sb4I4O6,-2.88446120375,-0.2228941025000002 -K2H8I2_127_9160.vasp,K2H8I2,-1.4604830083333333,1.783653021666664 -Fe2Sb2I2O4_26_5947.vasp,Fe2Sb2I2O4,-2.872588569,-0.0032470754999995854 -Ga2O2_129_6417.vasp,Ga2O2,-3.4619540125,0.7838604099999995 -Fe1C6I2N2F4_25_5651.vasp,FeC6I2N2F4,-4.564804534,0.17405245268054917 -Ba2Cu1Te2Br2_38_1974.vasp,Ba2CuTe2Br2,-1.500117622857143,0.29592265642856824 -B6Pd1Br2N2F4_25_1782.vasp,B6PdBr2N2F4,-3.9763120499999998,0.6519151520555471 -Sb1Te2_115_15517.vasp,SbTe2,-1.2331825766666666,0.5673697777777762 -Ag2H4Br2N6_1_271.vasp,Ag2H4Br2N6,-3.5304635842857146,-0.03329745339285939 -As4W2S12_4_1376.vasp,As4W2S12,-3.255985453333333,0.4810318124305524 -Fe2H2C1_164_5851.vasp,Fe2H2C,-2.8397390380000003,1.096799356 -Te2Pb2O8_31_18454.vasp,Te2Pb2O8,-3.3686963375,0.3467298908333336 -Co1Ni1S3Cl1_1_3791.vasp,CoNiS3Cl,-1.8256299133333334,0.16872618114583077 -C6N8_187_2780.vasp,C6N8,-7.0971589307142855,-0.2575982432142907 -Mg3C1_99_10546.vasp,Mg3C,-1.1336184475,0.58477659875 -H8W2_129_7099.vasp,H8W2,-3.692935079,1.5711741430000001 -K2Cd2As2_129_9041.vasp,K2Cd2As2,-0.23609591,0.10324557666666664 -Sr8Ge4_2_17495.vasp,Sr8Ge4,-0.44036480166666664,0.8762264866666667 -Hg2Bi2Br2O4_11_7934.vasp,Hg2Bi2Br2O4,-1.8205230190000001,0.1424404479999984 -Ge3Sb2S9_174_6920.vasp,Ge3Sb2S9,-2.7886715014285715,0.2425876328125005 -Hf4Br3N4Cl1_35_7771.vasp,Hf4Br3N4Cl,-6.021214166666667,0.0401416233333336 -Li2Sb2P8O24_13_10062.vasp,Li2Sb2P8O24,-5.253425431944445,0.1595109347500001 -Fe1Ge1I2_8_5678.vasp,FeGeI2,-0.7929456725,0.1194050009374994 -Nb3Te14Pt3_6_13019.vasp,Nb3Te14Pt3,-2.4037221925,0.09500849891666696 -Zn4Ge4N8_14_21220.vasp,Zn4Ge4N8,-3.75535791625,0.3973632375 -Bi1S2_164_2374.vasp,BiS2,-2.17195106,-0.524452012604169 -Os1S1_156_13819.vasp,OsS,-3.126542455,1.569157651875 -Pt1F2_115_14571.vasp,PtF2,-0.60703826,1.2105626724999974 -Ge3As2O9_174_6901.vasp,Ge3As2O9,-4.623663507142857,0.11832776553570978 -K2Nb2Cl12_4_9261.vasp,K2Nb2Cl12,-2.227914840625,0.028708490000000086 -Be1Sn2_164_2234.vasp,BeSn2,-1.42154139,-2.409437784999999 -Se8Cl8_2_16305.vasp,Se8Cl8,-1.178580634375,0.229602279375 -Mg2Co3O8_10_10444.vasp,Mg2Co3O8,-3.78314275,-0.12667562163462187 -N4O8_1_11796.vasp,N4O8,-4.569236689166667,0.13380664666666586 -Zr3S2N2_187_21780.vasp,Zr3S2N2,-6.186938561428571,-0.009663953214284149 -Ta2Ni2Se10_51_17796.vasp,Ta2Ni2Se10,-2.8299527435714285,-0.32472230948412983 -W2Br2_129_20461.vasp,W2Br2,-1.8155099575,1.877747522083333 -Ir2O4_123_8800.vasp,Ir2O4,-3.735463028333333,0.9088789950000002 -Ta4Te12Br2_2_18122.vasp,Ta4Te12Br2,-2.799102311111111,0.12312648366666101 -Pt1Br2_164_14566.vasp,PtBr2,-0.34328054666666663,0.43901162083333334 -Sn2Br2N2_59_16743.vasp,Sn2Br2N2,-2.862815465,-0.8693067125000001 -Ba1H2Se2_12_1836.vasp,BaH2Se2,-2.759548672,0.7620264280000002 -In2Cl2_129_8401.vasp,In2Cl2,-1.08328701,0.31348519343750003 -In2Se3_164_8591.vasp,In2Se3,-1.969303516,0.015017909999999857 -In4H20N8F8_14_8675.vasp,In4H20N8F8,-4.049477638,0.048296125000000245 -Cu1S2_187_4959.vasp,CuS2,-1.3954518366666668,0.3854455709027761 -Al2Se1S1Br2_6_958.vasp,Al2SeSBr2,-2.554856505,0.05491627166666668 -K2Nb2Cu4Se8_28_9263.vasp,K2Nb2Cu4Se8,-2.05019104875,0.1654772583333316 -Tl2Fe4S6_51_19419.vasp,Tl2Fe4S6,-1.7477202191666665,0.04269557124999823 -Cr1In2Se4_164_4206.vasp,CrIn2Se4,-2.12445532,0.0979192221428552 -V1W1S2I3Br1_1_19955.vasp,VWS2I3Br,-2.00351831,0.2607340919010407 -In1Cl2_164_8217.vasp,InCl2,-1.1508364433333333,0.26315342500000005 -Hf3C2O2_187_7694.vasp,Hf3C2O2,-7.648436058571428,0.2638317845238034 -V4C3F2_164_20312.vasp,V4C3F2,-5.295352441111111,-0.006067117201651762 -Li2Cu4F10_11_9896.vasp,Li2Cu4F10,-1.7368077725,0.026351663749999976 -Ba3B1P1O7_156_2096.vasp,Ba3BPO7,-5.0995081,0.5704061985416611 -Os2S4_11_13875.vasp,Os2S4,-3.9166866099999997,0.38143089583333323 -Sr3Cl6_5_17358.vasp,Sr3Cl6,-2.2552014477777775,0.2422963055555556 -Cu2Te4Mo1_111_5354.vasp,Cu2Te4Mo,-1.0528034285714285,0.17614012714285576 -Zn4Sn2N4_12_21228.vasp,Zn4Sn2N4,-2.117377507,0.18554583050000018 -V2Se3S1_6_20191.vasp,V2Se3S,-3.0471315000000003,0.2680602632222184 -Te2Ru2_164_18519.vasp,Te2Ru2,-2.33487424,0.6803582837500002 -Er2Br6_162_5550.vasp,Er2Br6,-2.28176892625,0.052903036250000035 -Cu2Te3As4F2_6_5342.vasp,Cu2Te3As4F2,-1.6648317163636364,0.32877179727272343 -Nb3B2S2_187_12950.vasp,Nb3B2S2,-5.9918428100000005,-0.06786147785714336 -Ta4Te2_129_18131.vasp,Ta4Te2,-5.637982596666667,0.055480036666666344 -Ni3P3O12_1_13710.vasp,Ni3P3O12,-4.101130606666667,0.19384678677083178 -Na2P4H16C4N2O12_2_12261.vasp,Na2P4H16C4N2O12,-4.97048584125,0.10897816899999546 -Rb2S6I2_11_14936.vasp,Rb2S6I2,-1.3691928580000001,0.4493415796250002 -Zr1Br2_187_21271.vasp,ZrBr2,-2.6073419733333334,0.04737020000000003 -Mn2Ga2S5_156_11077.vasp,Mn2Ga2S5,-2.925789421111111,-0.015874902777777367 -Os1I2_164_13804.vasp,OsI2,-1.4068513100000002,0.3017840145833317 -Cr2C1Cl2_164_4339.vasp,Cr2CCl2,-3.4080974759999996,0.008624842666662746 -Zr2Ag2_129_21499.vasp,Zr2Ag2,-1.41677917,0.1839256949999999 -Co2Ag1S4_187_3839.vasp,Co2AgS4,-2.3110454057142857,0.11252412749999774 -Sn1Te4As2_164_16704.vasp,SnTe4As2,-1.8979002442857145,-0.37806695642857213 -Fe1Te1P2O8_6_5763.vasp,FeTeP2O8,-4.613308375833333,0.3537216410416617 -Ca1H4O4_65_2847.vasp,CaH4O4,-3.8900596955555553,0.42972762689814464 -Ag4Te4O12_14_577.vasp,Ag4Te4O12,-2.615343134,0.2555905919999999 -Ca2Au1S2Cl2_38_2934.vasp,Ca2AuS2Cl2,-1.855720967142857,0.22993527928571045 -Sc4S4Cl4_11_16258.vasp,Sc4S4Cl4,-3.6109722808333333,0.21188690750000028 -Sn1Te1_123_16699.vasp,SnTe,-0.980590715,-0.944862735 -Sc4I6_8_16248.vasp,Sc4I6,-1.771728944,0.07566882999999991 -Cd4I4Cl4O12_53_3630.vasp,Cd4I4Cl4O12,-1.87887004125,0.05578903937500024 -Sr3Ni2S5Cl2_123_17394.vasp,Sr3Ni2S5Cl2,-2.224846245833333,0.07451026526041238 -Fe1H4C8I2_25_5707.vasp,FeH4C8I2,-4.888858236666667,0.40107135216666084 -Ni1B4C2Cl2F4_47_13265.vasp,NiB4C2Cl2F4,-3.7719369723076923,0.4790742136858872 -Ti3Te2H2N2_1_19111.vasp,Ti3Te2H2N2,-5.153555224444444,0.6295186138888833 -K2Sn1H6O6_147_9350.vasp,K2SnH6O6,-3.8827439160000004,0.09570104311111116 -In2Fe1Te4_156_8433.vasp,In2FeTe4,-1.08379516,0.40546081499999864 -S6N4_31_15402.vasp,S6N4,-3.746485227,0.0377459016250008 -Zn1Te2_115_21022.vasp,ZnTe2,-0.22925918999999997,0.3764566355555551 -Ru1I2_187_15274.vasp,RuI2,-0.5953163466666667,0.4099939849999991 -Mg2Si2Ni2_129_10515.vasp,Mg2Si2Ni2,-1.3136211316666666,0.4455928391666668 -Co2Bi4Br4O6_11_3869.vasp,Co2Bi4Br4O6,-2.706138134375,0.06558026374999885 -Mo3O8_2_11716.vasp,Mo3O8,-5.102946239090909,0.1066263498484803 -Y2I6_59_20750.vasp,Y2I6,-2.0747686125,0.10175800624999987 -Cr4B3O2_164_4591.vasp,Cr4B3O2,-4.670695383333333,0.7279636025308593 -B4As4_14_1745.vasp,B4As4,-3.85490445,0.9319582612499964 -Tl1_123_19359.vasp,Tl,0.60366808,0.39135016000000006 -Sb4Au2Se3I2_6_15769.vasp,Sb4Au2Se3I2,-1.0728626545454547,0.6142222456060573 -Ni4S4Cl4_14_13757.vasp,Ni4S4Cl4,-0.9930252016666666,0.08352775687499825 -Cr1As2Au1Se6_5_4113.vasp,CrAs2AuSe6,-2.004229285,0.26395296300000015 -Sr4P4Se8Cl4_14_17462.vasp,Sr4P4Se8Cl4,-2.6410539275000002,0.11008161693750007 -Ge1O2F2_164_6682.vasp,GeO2F2,-2.182982638,1.3281822195000004 -K2Ta2I12_4_9362.vasp,K2Ta2I12,-1.19171351125,-0.10674781171874992 -Tl1Te6As2Au1_149_19353.vasp,TlTe6As2Au,-1.1685813919999999,0.12480306820833192 -Sc1Ni1Pd1Se1I4_6_15966.vasp,ScNiPdSeI4,-0.81278127625,0.24838495994791576 -Ni1H4C2I2N6_6_13334.vasp,NiH4C2I2N6,-4.094302049333333,0.31123316505554444 -Mo1O3_187_11529.vasp,MoO3,-4.163978965,0.9637443937499999 -Cs2H8I2_127_4724.vasp,Cs2H8I2,-1.4672821391666666,1.9930206508333304 -Ir1Pd4S3Br1Cl3O3_1_8749.vasp,IrPd4S3BrCl3O3,-1.9494319626666665,0.373283030259257 -Zr3Te1O8_1_21787.vasp,Zr3TeO8,-5.859569704999999,0.46672886444444006 -Fe2P1S2_187_5900.vasp,Fe2PS2,-2.401709334,-0.06883233049999982 -K2Hg4Te2S6Br6_31_9198.vasp,K2Hg4Te2S6Br6,-0.652686236,0.13290625751041574 -Cd1B4H4N2F2_10_3277.vasp,CdB4H4N2F2,-4.133130207692307,0.6036709596955045 -Na2Mn2As2_129_12212.vasp,Na2Mn2As2,-2.0445889083333335,0.10653764101851626 -Tl2Bi6_164_19376.vasp,Tl2Bi6,-0.4948721325,-0.0002802081250000421 -Cu2As4S3I2_6_5020.vasp,Cu2As4S3I2,-1.8066460545454546,0.11074108456438958 -Sr2Ce2_59_17178.vasp,Sr2Ce2,-0.3645401175,0.93554013 -Na1As2Pd1Se6_149_11822.vasp,NaAs2PdSe6,-2.0466756960000003,0.23021645241666436 -Cu2H6C10Br2N4O4_26_5135.vasp,Cu2H6C10Br2N4O4,-5.203784700357143,0.3463674386458191 -Sr2As1_164_17119.vasp,Sr2As,-1.2981821433333334,0.45533320944444267 -Ge1Bi1Sb2Te3Se1_1_6646.vasp,GeBiSb2Te3Se,-1.7560937275,0.18341166093749803 -Au1S1Cl2_1_1438.vasp,AuSCl2,-0.3185143725,0.44439589950000014 -Zr2C1Se2_164_21536.vasp,Zr2CSe2,-5.139304218,0.1514812049999923 -Al4F4_57_1069.vasp,Al4F4,-3.01969634375,0.4514168379166632 -Na1Ga1P2Se6_5_11865.vasp,NaGaP2Se6,-2.477256947,0.13096187921875058 -Cr2Se4_11_4504.vasp,Cr2Se4,-2.737596745,0.02888887000000029 -B2Au2S2I2_31_1654.vasp,B2Au2S2I2,-1.4588577325,0.6861231931249998 -Hf1Au1Se2Br2_1_7114.vasp,HfAuSe2Br2,-2.171476828333333,0.3066783058333318 -Al2Ga1Ni1S4I3Br1_1_841.vasp,Al2GaNiS4I3Br,-1.8935202183333333,0.1376560482031206 -Rb2C2Se2Cl6O6_4_14794.vasp,Rb2C2Se2Cl6O6,-2.734286036111111,0.5232026559722174 -Ta2P2Se6_12_17822.vasp,Ta2P2Se6,-3.8015982950000002,0.24744787450000016 -Ir2S2_164_8825.vasp,Ir2S2,-2.9322198875,0.9003066708333289 -Hf2I2O2_59_7517.vasp,Hf2I2O2,-4.850266258333334,0.3920176918181693 -Cr2As2Se6_157_4311.vasp,Cr2As2Se6,-2.562432954,0.18021239066666395 -Mn1Sb4_47_10875.vasp,MnSb4,-1.910585004,0.19593722400000013 -V2Si2S6_162_20194.vasp,V2Si2S6,-3.7965308010000003,0.16206527836362805 -Hf1Pd1I6_149_7268.vasp,HfPdI6,-1.09286628875,0.1492928659374999 -Cs2Br2Cl8_127_4663.vasp,Cs2Br2Cl8,-0.4924463141666667,0.13664302291666636 -Bi2C1O5_25_2438.vasp,Bi2CO5,-4.47369862625,0.26033359874999995 -Tl2Ni2S5_156_19460.vasp,Tl2Ni2S5,-1.3624777966666666,0.3892296746180522 -Sr2Cu1I2O2_123_17198.vasp,Sr2CuI2O2,-2.4203114528571428,-0.1410809353174658 -Ho2Bi2O6_147_8123.vasp,Ho2Bi2O6,-4.8642214809999995,0.35068539437500057 -Ca2Cu1S2Cl2_38_2999.vasp,Ca2CuS2Cl2,-2.0647482671428574,0.12108373547618606 -Pt1I2_115_14574.vasp,PtI2,-0.025518456666666665,0.4898371283333333 -Sb4As2O12F2_4_15762.vasp,Sb4As2O12F2,-3.750590399,0.4957692368333253 -Pt2Br2N1O1_6_14596.vasp,Pt2Br2NO,-2.11040876,0.24064112812499247 -Mo1Os2Br4O3_1_11532.vasp,MoOs2Br4O3,-2.932227052,0.3515075724999971 -Te6As2Pb2_147_18643.vasp,Te6As2Pb2,-1.589666727,-0.40005731583333487 -K2B2S2N8F6_51_8997.vasp,K2B2S2N8F6,-4.043176526,0.3807518355208206 -Ca2H2N2O6_59_3033.vasp,Ca2H2N2O6,-4.1441256975,0.5472366753749909 -Nb4Sn2Te8_55_13160.vasp,Nb4Sn2Te8,-3.0706859435714287,-0.8608252604761915 -Pd2Pb8_50_14451.vasp,Pd2Pb8,-0.87311669,0.5870722099999999 -Mn2P2O6_162_11187.vasp,Mn2P2O6,-4.845857626,0.27208813196296033 -Cu1Sn1H6_35_4983.vasp,CuSnH6,-2.1001071375,1.5749036699999999 -In4S4I4_14_8684.vasp,In4S4I4,-1.4932568733333333,0.050971559166666625 -K1Mo2Cl6O2_47_8917.vasp,KMo2Cl6O2,-2.5748421063636364,0.06187776727272709 -Te2Ru2_129_18517.vasp,Te2Ru2,-2.4799587,0.5352738237500001 -Nb4Pd2S10_13_13122.vasp,Nb4Pd2S10,-4.112709513125,0.17293494374999963 -Li2Cr4O13_5_9877.vasp,Li2Cr4O13,-4.737027246315789,-0.2285823749232535 -Ba1Tl1W2O6_1_1874.vasp,BaTlW2O6,-4.900120419,0.50015966759183 -Ru2Cl2_129_15307.vasp,Ru2Cl2,-1.274298695,1.3540163866666644 -Tl1S2F2_12_19331.vasp,TlS2F2,-1.489921526,0.6295079077500003 -Mn2C4O12_14_11049.vasp,Mn2C4O12,-5.444883275555556,0.05444302152777197 -Nb2O2F2_59_12791.vasp,Nb2O2F2,-5.643793061666667,0.08302058629629117 -Ca2Sb1_164_3115.vasp,Ca2Sb,-0.8217924566666667,0.5807667400000002 -Ge1H2C1_156_6666.vasp,GeH2C,-4.315722825,0.05825944375000092 -Pr1I2_123_14531.vasp,PrI2,-1.8607552433333332,0.018270340000000163 -Y2P1Br2_164_20764.vasp,Y2PBr2,-4.247316382,0.035265365999999965 -Li1Al1Te6As2_5_9650.vasp,LiAlTe6As2,-1.872624472,0.2456148351666651 -P4Br12_14_14074.vasp,P4Br12,-1.236817479375,0.05859302562499891 -Co1Se2_115_3822.vasp,CoSe2,-1.7679666833333334,0.713753812222222 -Li4Cu4O8_1_10183.vasp,Li4Cu4O8,-3.027516364375,0.12262575312500035 -In1Ga1S2Br1Cl1_1_8256.vasp,InGaS2BrCl,-2.0086263033333336,0.1034150606249955 -Ru2S4_127_15348.vasp,Ru2S4,-2.8869865183333334,0.7277570099999999 -Mn2S2F2_59_11216.vasp,Mn2S2F2,-2.806752858333333,0.2783417104166668 -Sn1Au1Se2_1_16609.vasp,SnAuSe2,-1.143903935,-0.017704607499999914 -Ta1Ga1N1Cl2O1_25_17545.vasp,TaGaNCl2O,-4.560393686666667,0.2662827404629551 -Nb4B3H2S2_164_13035.vasp,Nb4B3H2S2,-5.458964861818182,0.44288657545454035 -Co2Sb4S6Br4_11_4014.vasp,Co2Sb4S6Br4,-2.029061886875,-0.38739379973958593 -Sb1Mo1As1_156_15464.vasp,SbMoAs,-2.8192975766666666,0.37311825940475896 -Ni1Ge1Se2Br2_1_13317.vasp,NiGeSe2Br2,-1.316626295,0.14902560585647673 -K4P4O10F4_13_9492.vasp,K4P4O10F4,-4.329053326363636,0.11268616840908718 -Tb5Br8_10_18213.vasp,Tb5Br8,-2.1971166823076924,0.11400670461538248 -K2Mg1Cr2H4O10_2_9213.vasp,K2MgCr2H4O10,-4.365426711052632,0.06280363684210499 -In2Br2O2_59_8387.vasp,In2Br2O2,-2.6548329666666666,0.043141485000000035 -Al2H2O4_31_860.vasp,Al2H2O4,-5.42359653875,-0.7312228031250001 -Zr1Fe1Br6_5_21287.vasp,ZrFeBr6,-1.76341692375,-0.0517174387499999 -Mo2Se2Cl2_59_11684.vasp,Mo2Se2Cl2,-2.3925281233333333,0.2790965922222224 -Cu1Sb1P2S6_143_4962.vasp,CuSbP2S6,-2.784766662,0.057675996291667087 -Tl4Te4I4_14_19635.vasp,Tl4Te4I4,-0.3658282225,0.4502422347222215 -Ta2Mo2O17_164_17776.vasp,Ta2Mo2O17,-4.728219757142857,0.6770159074999972 -Ni3Se1S2Br2_1_13721.vasp,Ni3SeS2Br2,-0.851681245,0.11948061343749994 -Fe2As2O7_1_5776.vasp,Fe2As2O7,-3.9253260254545452,0.23224782266665972 -Cu2Si2O6_51_5315.vasp,Cu2Si2O6,-4.528991739,0.3060714082499967 -Al1Cu1P2Se6_149_643.vasp,AlCuP2Se6,-2.43512115,0.021327393624998192 -Tl1Cd1Ga1Te4_156_19235.vasp,TlCdGaTe4,-0.7684051385714286,0.18341241952380835 -Li2V2F8_1_10122.vasp,Li2V2F8,-3.54211331,-0.4395712133333358 -Ti2Cl2O2_59_18922.vasp,Ti2Cl2O2,-5.506354506666667,0.02688272611110598 -Be2Cr2O8_7_2252.vasp,Be2Cr2O8,-5.104369918333333,-0.0841936869791724 -Li1Al1I4O12_2_9641.vasp,LiAlI4O12,-3.16706975,0.1163777283333336 -Au2N2Cl2_59_1496.vasp,Au2N2Cl2,-1.1666662466666666,0.5787394649999986 -V1Te2Au1_156_19938.vasp,VTe2Au,-1.1140319,1.0357320658333333 -Fe2Sb2Se4I2_26_5961.vasp,Fe2Sb2Se4I2,-1.620383598,0.18100735499999981 -Mo2As2O10_85_11560.vasp,Mo2As2O10,-4.674337222857143,0.17996704308034794 -Zr1Sc3Cl4O4_3_21439.vasp,ZrSc3Cl4O4,-4.932553189166667,0.10261554999999989 -Si2Se2I2_59_16449.vasp,Si2Se2I2,-2.0381138,0.17950928774305352 -Sn2Hg1S2Cl2_12_16778.vasp,Sn2HgS2Cl2,-1.326040712857143,0.11339743535714009 -Ba1Cu1W1O5_99_1825.vasp,BaCuWO5,-4.40109252375,0.6436070357812497 -Mo3C2_187_11706.vasp,Mo3C2,-4.74382194,0.6532544904999953 -Ba1Sb2F12_1_1854.vasp,BaSb2F12,-2.837016832,-0.02363976066666673 -Co1Ni1Se2O1_47_3793.vasp,CoNiSe2O,-2.075330416,0.1440414193333336 -Sb8S8O4_2_15877.vasp,Sb8S8O4,-3.179080027,0.10941220883333092 -K2Co1C4S4N4O3_3_9081.vasp,K2CoC4S4N4O3,-4.553762302222222,0.3978115632002238 -Sb4O8_1_15789.vasp,Sb4O8,-4.183233633333333,0.23484323375000038 -Tl2Te5_1_19556.vasp,Tl2Te5,-0.8301850214285714,0.32434688476190354 -Ir1Se2_164_8762.vasp,IrSe2,-2.6381534966666664,-0.28506674083333294 -Ag2Br2_129_202.vasp,Ag2Br2,0.1836347475,0.0876086225 -Ta1Se1I1_156_17616.vasp,TaSeI,-3.32310367,0.3862072053571437 -P1Pb2S6_162_13931.vasp,PPb2S6,-2.3951802144444443,0.2359695943402757 -Sn4I2F6_18_16943.vasp,Sn4I2F6,-2.101868249166667,0.09173362548611097 -Na2Os2N2O2F10_1_12251.vasp,Na2Os2N2O2F10,-3.4013788216666665,-0.20257294500000855 -Sb2H6Pb2S6N2_7_15587.vasp,Sb2H6Pb2S6N2,-3.330407261111111,-0.11689935497396839 -Sn2S2_31_16843.vasp,Sn2S2,-2.35383246,0.10999776124999983 -Ta1Se1S1_156_17618.vasp,TaSeS,-4.93803943,-0.7155391550000001 -Hf2B1Cl2_164_7435.vasp,Hf2BCl2,-4.959932031999999,-0.20391083675000277 -Pr1Se3_191_14536.vasp,PrSe3,-2.5437245125,0.9096548477083335 -Cu2As2S6_2_5012.vasp,Cu2As2S6,-2.0528433710000002,0.45984309708333065 -Ga1F2_115_6184.vasp,GaF2,-2.38523045,0.3760467966666644 -K2Br2O6_11_9009.vasp,K2Br2O6,-2.311730962,0.11080445975000064 -Na2Ru2C2Br8O4_7_12274.vasp,Na2Ru2C2Br8O4,-2.681320126666667,0.24211945722221953 -Mg2Co1_123_10440.vasp,Mg2Co,-0.28261911666666667,0.036148374791666715 -Ti1F2_187_18776.vasp,TiF2,-4.814530136666667,-0.5297369811111153 -Tl2Zn2Te5_156_19571.vasp,Tl2Zn2Te5,-0.3693636688888889,0.2338446944444439 -Hg6Se6O20_4_8099.vasp,Hg6Se6O20,-2.4824883115625,0.09288657343750018 -Hg3As1_191_8048.vasp,Hg3As,1.6066462375,0.5683457328448276 -As2Pd2S6_12_1269.vasp,As2Pd2S6,-2.357379021,0.49879715469999675 -In8O6_11_8714.vasp,In8O6,-2.952858237142857,0.47750009214285516 -Sc3Se1Br4_1_16220.vasp,Sc3SeBr4,-2.40544421625,0.333329501874998 -Mn1Cu1Mo1S1I2O1_1_10687.vasp,MnCuMoSI2O,-1.88479101,0.5993610257142816 -Li1Mo1H1Br1Cl1O1_1_9748.vasp,LiMoHBrClO,-3.019020505,0.32426516756944 -Tl1S2_164_19334.vasp,TlS2,-1.3217664466666668,0.6147442738541666 -Sc1O1_156_15969.vasp,ScO,-5.09650513,0.7942031179687503 -Mn2P2Se4Cl2_10_11199.vasp,Mn2P2Se4Cl2,-2.3435939479999996,0.11122810287500062 -Na2S4Cl2_113_12290.vasp,Na2S4Cl2,-1.355555445,0.9939613825 -Pd1Br2_164_14347.vasp,PdBr2,-0.2755001366666667,0.29599532666666667 -Ag1Ge1Cl6_1_56.vasp,AgGeCl6,-0.94206830875,0.16721018468749993 -K1Tl1Br4O12_2_8949.vasp,KTlBr4O12,-2.2077497855555555,0.2589478469444426 -Ta4Sn2S8_55_18116.vasp,Ta4Sn2S8,-4.4447318778571425,0.4329593092857107 -Ta4Te12_2_18125.vasp,Ta4Te12,-3.04835665875,0.1246527342708299 -Li2Sn1S6F6_147_10072.vasp,Li2SnS6F6,-2.133436811333333,0.8382072490833339 -Sn2Cl2_129_16762.vasp,Sn2Cl2,-1.007406225,-0.4752671275 -Li4V2C6O18_28_10237.vasp,Li4V2C6O18,-5.632404200333334,0.16505231166666023 -As4F12_14_1327.vasp,As4F12,-2.75989886125,0.08038813812500001 -Ca1Ta2S7_123_2892.vasp,CaTa2S7,-4.044103333000001,0.3584562209999973 -Sn2Br2F2_129_16741.vasp,Sn2Br2F2,-1.8989339883333332,0.05653547750000021 -Mn2W2Cl2O6_1_11336.vasp,Mn2W2Cl2O6,-4.351510595833333,0.3785203225936993 -Na1Ga1As2O6_5_11857.vasp,NaGaAs2O6,-4.048676056,0.33794347081249576 -Sb2S1O2_164_15671.vasp,Sb2SO2,-3.4463994120000003,0.32659193966666344 -H10W2_51_6978.vasp,H10W2,-3.346477740833333,1.844573233333328 -Co1Br2_187_3710.vasp,CoBr2,-0.47377764333333333,0.5450855733333324 -Pb2O2_129_14263.vasp,Pb2O2,-2.7113977,0.42968395968750017 -Tl2N2_129_19457.vasp,Tl2N2,-1.8678102975,0.7929060537500002 -Ti2Cd2_129_18920.vasp,Ti2Cd2,-1.65113555,0.28094572000000007 -Rb2H10Ru2C2S2_4_14843.vasp,Rb2H10Ru2C2S2,-3.283729757777778,0.48808444499999687 -Hf1Pd1F6_5_7265.vasp,HfPdF6,-3.4100974125,0.037495493750000275 -Mo1Au1S2Br2_1_11489.vasp,MoAuS2Br2,-1.4682037333333333,0.3237407318750003 -Ta3Te6_2_17999.vasp,Ta3Te6,-3.6608000755555556,0.08708329333333342 -K2Mn2As2_129_9238.vasp,K2Mn2As2,-1.5811707283333334,0.11465792005746916 -Na2B2H6S2N8_51_11978.vasp,Na2B2H6S2N8,-4.605110421,0.30028289068749814 -Zr2Tl2Cu2S6_51_21726.vasp,Zr2Tl2Cu2S6,-2.9029593475,0.14988856458333322 -Ba2P1_164_2041.vasp,Ba2P,-1.8644116466666667,0.29011934083333246 -Mg2Sb2Se6_162_10505.vasp,Mg2Sb2Se6,-2.052624595,0.29306531033333105 -Tb1Sb2_21_18178.vasp,TbSb2,-2.3464539966666664,0.671477179351849 -Dy1Bi2_21_5509.vasp,DyBi2,-1.7082622799999998,-0.24846820833333452 -Hf2C1F2_164_7456.vasp,Hf2CF2,-6.040852568,0.21985906130000016 -In2Ni2Se5_187_8498.vasp,In2Ni2Se5,-1.44948492,0.00676814111110946 -Li2V2O4F4_4_10125.vasp,Li2V2O4F4,-4.372722741666666,0.09065380600694098 -In1Cu1Si1Pb1S3Br2_1_8239.vasp,InCuSiPbS3Br2,-1.9042455411111112,0.2538232379468561 -P1F5_47_13920.vasp,PF5,-3.01200448,0.09033092833333356 -Ru2S2Br1Cl1_6_15336.vasp,Ru2S2BrCl,-2.543387228333333,0.17321139888888593 -As2Au2S4_26_1187.vasp,As2Au2S4,-1.8030584875,0.5187983715625 -Cr2Te12As4Au2_13_4514.vasp,Cr2Te12As4Au2,-1.5141056305,0.19817530283333074 -Ta2B1S2F2_164_17657.vasp,Ta2BS2F2,-4.647087258571429,0.8809731705714166 -Mn4B3H2O2_164_11421.vasp,Mn4B3H2O2,-3.987156926363636,0.3752792422727186 -Nb2S2I1Br3_1_12839.vasp,Nb2S2IBr3,-2.87477406,0.09806882874999745 -Pt2I2_164_14631.vasp,Pt2I2,-0.702738965,0.52672720875 -Na2H2C2O6_4_12098.vasp,Na2H2C2O6,-5.063056531666667,-0.11220929999999996 -In2Bi2O6_149_8381.vasp,In2Bi2O6,-3.080648358,0.867717742125 -Na4Te4S8_13_12424.vasp,Na4Te4S8,-2.05076889875,0.23350092856770846 -Bi1Br2_164_2320.vasp,BiBr2,-0.6495833333333333,0.2834763694444436 -Al2H2S2O8_11_863.vasp,Al2H2S2O8,-4.903056549285714,-0.06425282967262637 -Ta4C3S2F2_164_18014.vasp,Ta4C3S2F2,-6.207000460909091,0.45340781236362127 -Co1C8Cl2F4_25_3723.vasp,CoC8Cl2F4,-4.683233377333334,0.5192045602777657 -Cd1C2Br2N4F4_1_3290.vasp,CdC2Br2N4F4,-2.9066381900000002,0.735845437435891 -Al1Te1I7_1_744.vasp,AlTeI7,-0.38596629555555556,0.08981968666666618 -Sr2La2I10_11_17271.vasp,Sr2La2I10,-1.5205818907142858,0.11443881309523662 -Sr1O10_123_17066.vasp,SrO10,-2.452818921818182,1.098941557272724 -Ni2Te4Cl2_11_13672.vasp,Ni2Te4Cl2,-0.75911231875,0.02771869531249939 -Ge1Cl4_123_6661.vasp,GeCl4,-1.229242358,0.4260761074999999 -Ta2Te2I2_59_17903.vasp,Ta2Te2I2,-2.9875254983333335,0.267520668849199 -Sn2P2Cl2O6_7_16807.vasp,Sn2P2Cl2O6,-4.268834415833333,0.0015045791666672415 -In8Te12_14_8721.vasp,In8Te12,-1.3056241659999999,0.0737454700000002 -Te6Ru2_11_18684.vasp,Te6Ru2,-1.9228564475,0.43583602416666684 -Nb1Pt1Cl2_6_12557.vasp,NbPtCl2,-2.7050244,0.538682246562497 -Ti2B1O2_12_18888.vasp,Ti2BO2,-6.775615514,0.30532752666666063 -Gd4Br6_12_6629.vasp,Gd4Br6,-2.299279765,0.0017329844999975919 -Fe4S8_7_6088.vasp,Fe4S8,-2.155264583333333,-0.21913866833333318 -Pt2O4_14_14645.vasp,Pt2O4,-2.831409965,0.716274635 -K1Sb3_187_8935.vasp,KSb3,-0.9121342975,0.7952622393750001 -K2Br2_129_9010.vasp,K2Br2,-0.92975783,0.09083503000000004 -K2Hg4Te2Cl6O6_31_9195.vasp,K2Hg4Te2Cl6O6,-1.3519090065000001,0.23110213374999614 -Nb3Se1I1N2Cl1O1_6_13012.vasp,Nb3SeIN2ClO,-5.330177747777778,0.20012139434604326 -Bi2Se2_12_2549.vasp,Bi2Se2,-1.6115027525,0.2232350049999988 -Sr3Ge1_25_17381.vasp,Sr3Ge,-0.2357492475,0.83133052125 -W4S2N3_156_20592.vasp,W4S2N3,-5.796391907777778,-0.3264740122222276 -W2Br2O2_59_20460.vasp,W2Br2O2,-4.009237033333333,0.41719997570861006 -Na2B2Se2N2_31_11986.vasp,Na2B2Se2N2,-3.81929349125,1.0814439393750002 -Ge1S1_156_6697.vasp,GeS,-3.107914,-0.85676614625 -Ti3Mo1Se1S2I3N2_1_19093.vasp,Ti3MoSeS2I3N2,-4.360653874166666,0.07625118130952124 -K2Te2Pt1_47_9376.vasp,K2Te2Pt,-0.6821787180000001,0.5227045239999999 -Pd2Br1N2Cl1_6_14397.vasp,Pd2BrN2Cl,-2.094157625,0.386824104444442 -Pb2S2_31_14281.vasp,Pb2S2,-2.1225601875,-1.4494267425 -V2F2_129_20057.vasp,V2F2,-2.681369185,0.9970651433333304 -K2Mg1Te2O8F4_2_9228.vasp,K2MgTe2O8F4,-2.655288461176471,-0.10970149993464695 -Ca2Co1O3_12_2984.vasp,Ca2CoO3,-3.892662806666667,0.11138243472221937 -Ni3Te1Mo1Se3_6_13731.vasp,Ni3TeMoSe3,-1.30164484375,0.08788714749999724 -Ge3N4_5_6912.vasp,Ge3N4,-4.977734317142857,0.320347339285715 -Ag1H6Pb1_8_79.vasp,AgH6Pb,-1.79805791125,1.8968635468750001 -Tl2Se2_187_19531.vasp,Tl2Se2,-1.0733893525,0.22649028854166664 -Nb2Co2Se10_51_12691.vasp,Nb2Co2Se10,-2.99348864,0.2063337352380925 -Sr3Ag2S4Cl2_123_17347.vasp,Sr3Ag2S4Cl2,-1.9822048336363636,0.13732232085226648 -W2I6_12_20504.vasp,W2I6,-1.044074975,0.4331986103124984 -Ag1Se2_187_130.vasp,AgSe2,-0.6691978566666666,-0.3269010283333333 -Sb1P2Au1Se6_143_15476.vasp,SbP2AuSe6,-2.152620009,0.06493346543749823 -Li4C4S4O12F12_14_10171.vasp,Li4C4S4O12F12,-4.025101933888888,0.052542006249997275 -Ti4C3O2_164_19130.vasp,Ti4C3O2,-7.659740901111111,-0.25207327703704463 -Ir1Br2_164_8727.vasp,IrBr2,-0.9761703700000001,0.7440412811111096 -Li2Mn2Bi2_129_9992.vasp,Li2Mn2Bi2,-1.4591980549999999,-0.20339664408046076 -Ta1Se2_10_17619.vasp,TaSe2,-3.9532939500000004,0.7417851916666662 -Ga1Co2S4Cl3_1_6151.vasp,GaCo2S4Cl3,-2.023031984,0.4218997335000003 -Ce2Be4_51_3663.vasp,Ce2Be4,-2.0415967983333334,0.9823383364102534 -Bi4Au4Cl24_2_2595.vasp,Bi4Au4Cl24,-0.71906032375,0.12254380437500001 -Sr2Cu1Se2I2_38_17207.vasp,Sr2CuSe2I2,-1.4831636985714287,0.05185657333333016 -Sr1H2Se2_5_17056.vasp,SrH2Se2,-2.684736122,0.720298973666667 -Ti3C2O2_187_19074.vasp,Ti3C2O2,-7.472679875714285,-0.06246533190476855 -Mn1Cr1S2I2Br2_1_10678.vasp,MnCrS2I2Br2,-1.4751280275,0.20940945453124993 -Sn6P2O12_1_16993.vasp,Sn6P2O12,-4.3769339755,0.030773222249996346 -Eu1C2_8_5586.vasp,EuC2,-5.365129846666666,1.0456947309259212 -Ag1Pb1F6_2_97.vasp,AgPbF6,-1.41805109375,0.12619717500000016 -Cu1Br1O2_10_4858.vasp,CuBrO2,-1.6411736,0.22724794562500028 -Ca4Fe2Br2O6_129_3213.vasp,Ca4Fe2Br2O6,-3.715796375,-0.08216639714286056 -Hg2Br2_2_7946.vasp,Hg2Br2,0.97589805,0.18516449499999998 -Ag2S2_59_387.vasp,Ag2S2,-0.6397874675,0.32844149734375 -Mg2Sb4O8_7_10509.vasp,Mg2Sb4O8,-4.110680903571429,0.22931479071428562 -Hf4Ti1V1C1Br4N1Cl2O2_1_7825.vasp,Hf4TiVCBr4NCl2O2,-4.931874475625,0.3603203445138832 -Si2Se2Cl2_59_16447.vasp,Si2Se2Cl2,-2.4451412583333334,0.2832356192708309 -Al2Br2N2_59_772.vasp,Al2Br2N2,-3.68082212,0.4871381913888848 -Nb4Fe4S8_53_13072.vasp,Nb4Fe4S8,-3.58674095,0.7239687595833311 -Cs1H10C12N4O10_2_4643.vasp,CsH10C12N4O10,-5.622736456486487,0.29185749645550674 -Sc1Nb1Te2_99_15963.vasp,ScNbTe2,-3.3739563225,0.39089977437499956 -Ti3I1Br1N2_1_19091.vasp,Ti3IBrN2,-5.586573395714285,0.3421228964285552 -Ag2As4Se3F2_6_171.vasp,Ag2As4Se3F2,-1.7871186000000001,1.3543822615151457 -Ca1F2_187_2833.vasp,CaF2,-3.3318098633333335,0.511938433333333 -Ga2H14C4_10_6373.vasp,Ga2H14C4,-3.7256028495000004,0.5294719444999999 -K2Mg1S2O8F4_2_9223.vasp,K2MgS2O8F4,-3.352334348823529,0.20426254161764412 -Sb4F12_14_15776.vasp,Sb4F12,-2.722718123125,0.39341529187500024 -K2Os2C2O2F10_11_9277.vasp,K2Os2C2O2F10,-3.5191856366666667,-0.060924614333343896 -As4O8_11_1339.vasp,As4O8,-4.3449615108333335,0.09624167458332478 -Al1Ag1P2Se6_149_599.vasp,AlAgP2Se6,-2.402934992,-0.0020814573437496486 -V3F8_164_20259.vasp,V3F8,-3.436291959090909,-0.3081685542424275 -Co2Te5As2_8_4048.vasp,Co2Te5As2,-1.7278771633333332,0.32911872481481314 -Si2Ni2Sb2_129_16417.vasp,Si2Ni2Sb2,-1.8696061283333334,0.3203368466666646 -K1Br2_25_8885.vasp,KBr2,-0.33553162999999997,0.6141561174999992 -Zr2Si2S2_129_21684.vasp,Zr2Si2S2,-4.827730625,0.12702950999999985 -In2Sb2_129_8569.vasp,In2Sb2,-1.337591435,-0.57571065 -Rb2Cd4S2Br6O6_31_14807.vasp,Rb2Cd4S2Br6O6,-1.8286489974999998,0.12220703984374666 -Fe2S2_187_5936.vasp,Fe2S2,-1.7299784925,0.25178658750000005 -Li4H4Se4O16_2_10196.vasp,Li4H4Se4O16,-3.873418984642857,0.08745955052380605 -Hf1Zr1Nb2Br3Cl1O4_1_7386.vasp,HfZrNb2Br3ClO4,-5.028503856666666,0.2567861268080297 -Te2Pb2Br2_59_18450.vasp,Te2Pb2Br2,-1.0573845933333332,-0.2187140205555564 -Al1Sb1_156_727.vasp,AlSb,-1.930490005,-0.38160708 -Rb2H2C2O6_4_14844.vasp,Rb2H2C2O6,-4.8333803699999995,0.09301543250000055 -K2Ta2F12_1_9361.vasp,K2Ta2F12,-3.945877850625,0.05660056437499961 -Ho2C1_164_8131.vasp,Ho2C,-4.04238225,0.4377120699999999 -Ca2Ag1Se2F2_38_2914.vasp,Ca2AgSe2F2,-1.9775509857142857,0.4375897957142818 -Li2Sn1P4O12_3_10071.vasp,Li2SnP4O12,-5.1560868352631575,0.15317189663157516 -K2Ge1S6F6_147_9113.vasp,K2GeS6F6,-2.0473535326666665,0.6627386607500005 -Sn2As1Se6_162_16712.vasp,Sn2AsSe6,-2.087738031111111,0.1950941571296252 -Zr2Sn2Te8_31_21694.vasp,Zr2Sn2Te8,-2.2465866091666666,-0.395792305833335 -Si2Sb6_164_16445.vasp,Si2Sb6,-2.23570265125,0.22450991562499978 -Li2Sc1_187_10067.vasp,Li2Sc,-1.5874227,0.2851223927777762 -Hg8Mo4O16_14_8107.vasp,Hg8Mo4O16,-2.6941432567857144,0.1761808425 -W2Se2Br2_59_20542.vasp,W2Se2Br2,-2.8573330699999997,0.1309842397222225 -In4F8_10_8673.vasp,In4F8,-2.3306373116666665,0.1804647749999999 -Bi2Cl4O2_51_2447.vasp,Bi2Cl4O2,-1.88568222875,0.35472075953125015 -Mn1Sb2Se4_164_10873.vasp,MnSb2Se4,-2.2773335342857144,0.0368629747619027 -Ge1Br2_115_6652.vasp,GeBr2,-1.3795887866666667,0.26518329333333335 -Tl2_51_19573.vasp,Tl2,0.27366045,0.061342530000000006 -Te6P2Os2_162_18666.vasp,Te6P2Os2,-2.595259835,0.1495767516666654 -Zr2Zn2_129_21731.vasp,Zr2Zn2,-0.816410455,1.4909761 -Sb1S1Br1_156_15486.vasp,SbSBr,-1.8348654266666669,-0.5594697450000001 -Ta4Se2_129_18110.vasp,Ta4Se2,-6.096352876666667,0.06806191999999989 -Mn2Se1S1O1_8_11274.vasp,Mn2SeSO,-3.130112626,-0.0062454094827602 -Te1Mo2S1I1Br1_1_18309.vasp,TeMo2SIBr,-2.0710608316666668,0.19763903659722193 -V1Mo1O3F2_1_19879.vasp,VMoO3F2,-4.35750441,0.10294464285713545 -Ag2H6C2N4_11_284.vasp,Ag2H6C2N4,-4.4353915200000005,-2.6723352001190523 -Mg1Ge1S2Cl2_1_10367.vasp,MgGeS2Cl2,-2.34830497,0.26396781802083313 -Sr1H1I1O1_156_17053.vasp,SrHIO,-3.1038187775,0.2152700900000002 -Bi6Pb2_164_2671.vasp,Bi6Pb2,-0.88566098,-0.20346345375000002 -Nb3Te3Mo1Se1_6_13029.vasp,Nb3Te3MoSe,-3.69204038125,-0.26389413359375014 -Nb2Ge2Sb2_129_12729.vasp,Nb2Ge2Sb2,-3.9558408933333333,0.3488103333333332 -P2Ir1Ru1S6_143_13990.vasp,P2IrRuS6,-3.394495981,0.30131700421874763 -Au2S2I2_59_1514.vasp,Au2S2I2,-0.2570630133333333,0.2822452054861106 -Cu1O2_65_4931.vasp,CuO2,-1.8391150333333333,0.9284652308333312 -Hf2C2Br2_164_7461.vasp,Hf2C2Br2,-5.124739941666667,0.6253718016666614 -Cr4O10_59_4613.vasp,Cr4O10,-4.882768888571428,-0.2734633282142892 -Ta6Te18_11_18159.vasp,Ta6Te18,-3.0984001366666667,0.07460925635416316 -Zr4O4F4_31_21835.vasp,Zr4O4F4,-5.303902691666667,0.5854442859722169 -Sr2Au1Se2Cl2_38_17133.vasp,Sr2AuSe2Cl2,-1.6494548442857142,0.3396626535714249 -Bi2As2O6_1_2415.vasp,Bi2As2O6,-3.9040226689999997,0.2675932310000002 -Co1Si3_187_3826.vasp,CoSi3,-2.6912261375,0.3148997499999996 -Ag2Hg2As2S6_7_296.vasp,Ag2Hg2As2S6,-1.2770859483333334,0.18283095208333208 -Nb4Ni4Se8_53_13104.vasp,Nb4Ni4Se8,-2.954754945625,-0.20520925426630665 -Li1In1P2S6_5_9732.vasp,LiInP2S6,-3.126801195,0.09290930449999957 -Ti2Te6P2_12_19048.vasp,Ti2Te6P2,-2.9911655799999997,0.4741282820000007 -H4Pd1C2Br2N6_6_7071.vasp,H4PdC2Br2N6,-4.2495380266666665,0.3316785807222109 -Hg1O2_164_7888.vasp,HgO2,-0.8875758766666667,0.7453756343055542 -Cd2Sb2S4F2_11_3561.vasp,Cd2Sb2S4F2,-1.7268833749999999,0.3353153934999975 -Li2Br2O4F8_2_9845.vasp,Li2Br2O4F8,-1.763387911875,0.4281477121874999 -K4H12C8S12_14_9451.vasp,K4H12C8S12,-3.866678588888889,0.11862737166665549 -Zr4Mn2N4Cl6_1_21829.vasp,Zr4Mn2N4Cl6,-4.5422384975,0.19976603329741388 -K4I2_51_9465.vasp,K4I2,0.14975376166666668,-0.20790751166666635 -Cu4Te2_191_5481.vasp,Cu4Te2,-0.03458781166666667,0.3973999991666659 -Nb1Br2_187_12482.vasp,NbBr2,-2.5866371200000002,0.3746724012499959 -Ge1N1F2_156_6680.vasp,GeNF2,-2.98100049,0.7609570443750002 -Ta2V2Se10_11_17933.vasp,Ta2V2Se10,-3.590756122857143,0.07196473678571103 -Y2Br6_59_20706.vasp,Y2Br6,-2.82010493625,0.08474839500000009 -Mo1N1Cl2_25_11523.vasp,MoNCl2,-3.19778243,-0.0909676185416688 -Zr2O2_164_21619.vasp,Zr2O2,-5.629546985,0.9117220216666668 -Cr1Os1W1S4Cl3_1_4227.vasp,CrOsWS4Cl3,-3.0573390839999997,0.24753175574999475 -K2Co2Bi2_129_9083.vasp,K2Co2Bi2,-0.44679512166666663,0.414446908541666 -Fe2S2Br1Cl1O1F1_1_5930.vasp,Fe2S2BrClOF,-1.9215681025,0.07606381633183895 -Ti3C2Se2F2_187_19077.vasp,Ti3C2Se2F2,-5.0998703800000005,0.21824455277777233 -Ba2Ag1Cl2O2_123_1881.vasp,Ba2AgCl2O2,-2.8020308857142857,0.027960850267854886 -Co1F2_164_3734.vasp,CoF2,-2.0663145000000003,0.24841006249999964 -Li2Ni2Sb2_12_10029.vasp,Li2Ni2Sb2,-1.27125376,0.12594920999999715 -Ag1Cl2_164_48.vasp,AgCl2,-0.037863343333333334,0.16134853000000002 -Mn2As2Se6_162_10986.vasp,Mn2As2Se6,-2.353227842,0.10654030166666417 -Li1Ni1As2S6_149_9758.vasp,LiNiAs2S6,-2.465908076,0.37398944371874787 -V1H1S2_156_19848.vasp,VHS2,-3.441334255,0.2585370753124998 -Hg6Te4_14_8102.vasp,Hg6Te4,1.0287601020000001,0.15702737942528988 -Sr1Nb2O7_123_17064.vasp,SrNb2O7,-5.820967115,0.43123562187499753 -Sn2P2H6C2S6_7_16814.vasp,Sn2P2H6C2S6,-3.7268576077777777,0.0751865838888783 -B2_51_1726.vasp,B2,-5.319887575,0.8410977233333332 -Tm2Fe2Ge4_129_19678.vasp,Tm2Fe2Ge4,-2.38826555625,0.40523605083333014 -Au2Br6_191_1460.vasp,Au2Br6,0.4984694575,0.37461988375 -K2N6O6F6_1_9250.vasp,K2N6O6F6,-3.378663238,0.27848236824999073 -Sc1Nb1Se1Br2_1_15960.vasp,ScNbSeBr2,-3.081019754,0.41988296175000017 -Cu1Ag1S2_1_4824.vasp,CuAgS2,-0.7705193675,0.41181893575520834 -Sn6Bi2_191_16981.vasp,Sn6Bi2,-0.46966510625,-2.30851572125 -Ge2As2S6_147_6741.vasp,Ge2As2S6,-2.882544997,0.21592580899999714 -Hg1Pb2Cl2O2_12_7896.vasp,HgPb2Cl2O2,-1.8815679428571428,0.09549469428571444 -Sb2Se2_2_15700.vasp,Sb2Se2,-2.07415422,0.2736234837499978 -Co2Te4H2_11_4045.vasp,Co2Te4H2,-1.9181960075,0.5213214070833334 -Li2Cr3C6O18_2_9874.vasp,Li2Cr3C6O18,-5.634107627931035,0.07898510752153667 -Li2Fe3F8_164_9915.vasp,Li2Fe3F8,-2.9464478684615383,-0.11156554846154104 -Zn1O2_164_20986.vasp,ZnO2,-1.67522762,0.9119667804166642 -Fe4H2C3S2_164_6080.vasp,Fe4H2C3S2,-3.1755323227272725,0.8101406872727214 -Ta2O2_129_17810.vasp,Ta2O2,-6.105422315,1.632850399000001 -V12O26_51_19743.vasp,V12O26,-5.6045326689473685,-0.0074106176315837935 -Tb1Cu2S2_164_18171.vasp,TbCu2S2,-2.1108170680000002,0.7534576215 -Hf2Si2Se8_31_7616.vasp,Hf2Si2Se8,-3.695271508333333,0.23135018177083388 -Re1W1O6_35_15029.vasp,ReWO6,-5.80418537875,-0.4404593471874998 -Pt2Cl4_2_14616.vasp,Pt2Cl4,-0.758480905,0.3595591566666668 -Tl2Se2Br2_1_19525.vasp,Tl2Se2Br2,-0.8128478499999999,0.34095650111111026 -Hf3Al4C6_164_7675.vasp,Hf3Al4C6,-6.317063885384615,0.12688419769230241 -U2Se10_4_19723.vasp,U2Se10,-3.5447576858333334,0.20723943527777422 -Ti4Br4O4_7_19127.vasp,Ti4Br4O4,-5.066287151666667,0.22931309944443967 -Ti2O4_11_18977.vasp,Ti2O4,-7.067529356666667,0.1963251683333329 -Mn2H2N1O2_164_11090.vasp,Mn2H2NO2,-4.384201265714286,0.6144848285714235 -Mn1H1O2_6_10760.vasp,MnHO2,-4.1626711025,0.5071729643749958 -Co4Br4O4_14_4078.vasp,Co4Br4O4,-2.4649295016666666,-0.3567884209722239 -Te8P8O4_2_18707.vasp,Te8P8O4,-2.9987665355,0.4618146143666616 -Te2Pd2I4_2_18469.vasp,Te2Pd2I4,-0.52231174875,-0.023578982750000258 -Cu4Te2_12_5480.vasp,Cu4Te2,-0.17589927166666666,0.2560885391666659 -Rb2Cd4Te2O6F6_31_14826.vasp,Rb2Cd4Te2O6F6,-1.857769833,0.497249487625 -K4Co2S4_49_9435.vasp,K4Co2S4,-1.589667272,0.24555765703703492 -V3B2H2S2_187_20239.vasp,V3B2H2S2,-4.169711924444445,0.3531375741666578 -Co2C2Br2_59_3881.vasp,Co2C2Br2,-2.7648415849999997,0.7291816749999974 -Cs2Ru2Br8N2O4_7_4768.vasp,Cs2Ru2Br8N2O4,-2.2953087227777775,0.25235099805555383 -Mg2W2S14_18_10535.vasp,Mg2W2S14,-2.965310933333333,0.1455647808333309 -Ta2Se2Cl2_59_17870.vasp,Ta2Se2Cl2,-4.095474221666667,0.09888665583332445 -Nb1As2_164_12465.vasp,NbAs2,-4.2440946833333335,0.5348379699999999 -Si12Ir4_127_16310.vasp,Si12Ir4,-4.04926858625,0.07766989468749597 -Te2Pd2_129_18474.vasp,Te2Pd2,-1.023246535,0.1582768212500001 -Al1S2F2_164_723.vasp,AlS2F2,-2.368154938,1.1709217764374962 -Bi2Cl2O2_59_2443.vasp,Bi2Cl2O2,-2.708777105,0.25951831833333383 -Zn2H12Se4O16_14_21092.vasp,Zn2H12Se4O16,-3.7785016011764707,0.042249782941172986 -Cu4Te4O12_14_5487.vasp,Cu4Te4O12,-2.894210777,0.3649875182500004 -Ca2Te2Au1Br2_38_3131.vasp,Ca2Te2AuBr2,-1.0663740228571428,0.35052182499999773 -Si4Sb8_26_16513.vasp,Si4Sb8,-2.7293418166666665,-0.2102474183333355 -Cs2H6C6O6_4_4721.vasp,Cs2H6C6O6,-5.108933657,0.19859526300000097 -V2O4_11_20128.vasp,V2O4,-5.49689174,0.1810473350000006 -W1I2_115_20436.vasp,WI2,-0.9794114866666667,1.0912790663888887 -Sr4Co2Cu4O14_26_17417.vasp,Sr4Co2Cu4O14,-3.2348237304166667,0.3419607766666599 -Te8Br8_2_18692.vasp,Te8Br8,-0.728042101875,-0.5136189290178572 -V2Se1S1I2_6_20179.vasp,V2SeSI2,-2.414839805,-0.18915324965278324 -Ag2Se4I2_1_443.vasp,Ag2Se4I2,-0.68375912125,0.2964985029166666 -Zr4Cu2Ge8_129_21818.vasp,Zr4Cu2Ge8,-3.3504503692857144,0.18689047500000022 -Ni3S1Br3Cl1O1_1_13713.vasp,Ni3SBr3ClO,-0.8532546088888888,-0.02072600785714858 -Gd2Br6_12_6603.vasp,Gd2Br6,-2.3086767775,0.0756285662499998 -Ga2Ni1O4_164_6398.vasp,Ga2NiO4,-3.695683457142857,0.24188965214285707 -Al2In2H8_3_888.vasp,Al2In2H8,-2.5185127375,0.8057056166666597 -Ti2H2C1_164_18946.vasp,Ti2H2C,-5.912679532,0.23917834799999937 -Zr2O2_129_21617.vasp,Zr2O2,-5.3594726925,1.1817963141666672 -In1P2Au1Se6_149_8299.vasp,InP2AuSe6,-2.082447926,0.07124559343749837 -Sn1Sb1As3O9_1_16683.vasp,SnSbAs3O9,-4.18247981,0.25482644053570547 -Zr4H2N3O2_164_21824.vasp,Zr4H2N3O2,-6.293128910909091,0.36109849999998933 -K2H10Ru2C2O2_1_9115.vasp,K2H10Ru2C2O2,-3.652505412222222,0.3876562049999966 -Mn2B1O2F2_164_10996.vasp,Mn2BO2F2,-2.7062046200000003,1.658586967701658 -In1Fe5Cl2_123_8247.vasp,InFe5Cl2,-0.49533932875,1.397325159375 -As2I8_2_1224.vasp,As2I8,-0.349872283,0.1223313063750004 -Nb4Te6_11_13174.vasp,Nb4Te6,-3.608265167,-0.5287514026666695 -Ag2Te2_10_466.vasp,Ag2Te2,-0.0953970075,0.26223543541666666 -Mo2I2N2_59_11621.vasp,Mo2I2N2,-3.504625055,0.25050452861111117 -La2Br2_164_9581.vasp,La2Br2,-2.3984035375,0.1883494885000001 -Na4Te4O8_13_12423.vasp,Na4Te4O8,-3.2368753575,0.2905247510416666 -Cd2S2F2_59_3545.vasp,Cd2S2F2,-0.8540978316666666,0.40383687864583145 -Te1Mo1Rh2Se3_1_18303.vasp,TeMoRh2Se3,-2.2167803085714284,0.9000370663598796 -Hf1Mn1Te2_1_7226.vasp,HfMnTe2,-2.76796361,0.5576221681896556 -Ni2Te6P2_162_13682.vasp,Ni2Te6P2,-1.363652855,0.49053476308333044 -V4Re4O22_1_20354.vasp,V4Re4O22,-5.564794570666667,0.1561899146666672 -Ca2Tl2Cl6_51_3137.vasp,Ca2Tl2Cl6,-1.7885851179999999,-0.0214830909999999 -Sr4Cu4Ni2O14_6_17426.vasp,Sr4Cu4Ni2O14,-2.954106210833333,0.14897058583333167 -Sn2Sb2O6F2_7_16861.vasp,Sn2Sb2O6F2,-3.6653836783333333,0.3541874115624999 -Zr2Si2Te2_129_21689.vasp,Zr2Si2Te2,-3.9859018616666666,0.08086934666666634 -Hg1H1I1O1_156_7860.vasp,HgHIO,-1.3009016975,0.1793087526041667 -Sr4Mn2Cl2O6_129_17445.vasp,Sr4Mn2Cl2O6,-4.041367909285714,0.030778214285714256 -Nb3I7O1_156_12981.vasp,Nb3I7O,-2.428162359090909,0.17730020101009808 -Hf2S2Cl2_59_7568.vasp,Hf2S2Cl2,-4.4921785000000005,-0.0034146947916764425 -Cu2H8C8I2_2_5151.vasp,Cu2H8C8I2,-4.3867229295,0.2877241904999994 -Mo1Br5_10_11501.vasp,MoBr5,-0.7690609666666667,0.25108853249999996 -Te2Rh2I2_59_18503.vasp,Te2Rh2I2,-1.3840723833333335,0.10425622333333306 -Tl2Cl2_59_19390.vasp,Tl2Cl2,-1.0199975725,-0.09249976249999992 -Ni1N6F6_47_13380.vasp,NiN6F6,-2.7958484323076926,0.40553126596153266 -Mn3Se2S2_1_11409.vasp,Mn3Se2S2,-2.652964277142857,0.09613561857142328 -Sn1Hg2S4_21_16647.vasp,SnHg2S4,-0.9783118014285714,0.25943943285714144 -Zr1P2_164_21395.vasp,ZrP2,-3.9980923333333336,1.1214541641666664 -Li5Zn4B4O12_1_10259.vasp,Li5Zn4B4O12,-4.5755095712000005,0.10243187289999786 -Cd1In1Ga1Se4_156_3371.vasp,CdInGaSe4,-1.6133215142857142,-0.06746721285714286 -Ag4Se4Cl4_14_563.vasp,Ag4Se4Cl4,-0.5676365975000001,0.17696516541666607 -Cr4N3F2_164_4609.vasp,Cr4N3F2,-4.663610531111111,-0.08452438358025083 -Zn1Cd1Te1Br1O2_1_20912.vasp,ZnCdTeBrO2,-1.3396450316666666,0.19214662687499995 -Tl6Se6_2_19646.vasp,Tl6Se6,-1.0143410458333333,0.28553859520833336 -Ni2O1F1_1_13543.vasp,Ni2OF,-1.5191873175,0.04306677562500005 -Mn1Sn2I1Cl1O2_1_10901.vasp,MnSn2IClO2,-2.573158108571429,0.11412196150656262 -V1Ge1W1O7_1_19844.vasp,VGeWO7,-5.3432344899999995,0.21478866174999567 -Ba2As4O12_2_1902.vasp,Ba2As4O12,-4.447896308333333,0.2478456061111105 -Tb2I6_162_18202.vasp,Tb2I6,-1.5769264825,0.058909336249999944 -Hf3B2Te2H2_187_7687.vasp,Hf3B2Te2H2,-4.539745133333334,0.5542545977777731 -Fe6P24_14_6093.vasp,Fe6P24,-3.3653945883333334,0.5115879681666664 -Sb2Ru2S6_162_15669.vasp,Sb2Ru2S6,-2.966591942,0.31657469169999386 -Tm2Te6_129_19690.vasp,Tm2Te6,-2.33780762375,-0.7629672174999997 -Hf2P1Se2_164_7552.vasp,Hf2PSe2,-5.251369508,0.07773954250000115 -Sc1Br2_115_15915.vasp,ScBr2,-1.9175660466666666,0.47014727166666437 -Tl1Cu1Sb2Se6_149_19257.vasp,TlCuSb2Se6,-1.5114120469999999,0.3872153038888851 -Li2Sb2Pd2_12_10065.vasp,Li2Sb2Pd2,-1.90048,0.06474454027777593 -Cd3Bi1_191_3610.vasp,Cd3Bi,1.9774223175,-0.015459344999999569 -Tl2S3_189_19510.vasp,Tl2S3,-1.2496975559999999,0.5505383487499977 -Co2P4O8_51_3970.vasp,Co2P4O8,-4.621314123571429,0.30550156757142144 -Sb4W2_2_15841.vasp,Sb4W2,-3.1970297083333334,0.6645173966666633 -Nb4O10_11_13116.vasp,Nb4O10,-6.665762224285714,-0.19858721946428853 -Bi2Sb2Se6_157_2530.vasp,Bi2Sb2Se6,-2.011731384,0.22029509700000016 -Be3Sn1_25_2284.vasp,Be3Sn,-2.0557875575,-1.0192750899999998 -Cu2As4S12_12_5016.vasp,Cu2As4S12,-2.279772611666667,0.5301159284143492 -Ga4Sb20_26_6568.vasp,Ga4Sb20,-1.8724139008333334,0.026320399166664954 -V1Cl2O1_47_19797.vasp,VCl2O,-3.3144002725,-0.0280157531249996 -V2Te2O1_164_20210.vasp,V2Te2O,-3.356194706,0.22988547133333004 -V2I2_164_20097.vasp,V2I2,-1.560545995,0.4893181291666666 -Ti1Pb1O3_99_18826.vasp,TiPbO3,-5.335939382,0.11951391399999967 -Pd4F8_14_14518.vasp,Pd4F8,-1.3250753491666667,0.1121738691666665 -Zr1S2O12_21_21414.vasp,ZrS2O12,-4.405330848,0.3134027543333291 -Zn12As8_115_20892.vasp,Zn12As8,0.059041147,0.3051673585 -Cr2N1Cl2_164_4422.vasp,Cr2NCl2,-3.422511074,-0.13966112377778162 -Zn2H8N4O16_14_21103.vasp,Zn2H8N4O16,-4.141490581,0.04338204988888417 -Hg2Bi2O4F2_11_7937.vasp,Hg2Bi2O4F2,-2.109849312,0.1552903073333336 -Fe1H4C2N4F2_47_5695.vasp,FeH4C2N4F2,-4.768718413846154,0.22428065958332555 -V2As2O10_129_19978.vasp,V2As2O10,-4.909949866428571,0.08546862571428715 -Cr1H2O2_164_4185.vasp,CrH2O2,-4.3062704080000005,0.22739779877777244 -Sr2H3_164_17236.vasp,Sr2H3,-2.066120014,0.33556036374999726 -Tl2S2Br1Cl1_1_19496.vasp,Tl2S2BrCl,-1.0563557366666667,0.3176758831249987 -Te4W2_11_18633.vasp,Te4W2,-2.9706889249999997,0.07420902666666684 -Cd1Sn2S2Br2_12_3431.vasp,CdSn2S2Br2,-1.3214139985714284,0.09450923285714019 -C1Se2_164_2738.vasp,CSe2,-2.6058477233333335,1.6382531155555518 -Be2As1_164_2236.vasp,Be2As,-2.4419012633333335,0.701602641666664 -Tl1Cd1In1O4_156_19236.vasp,TlCdInO4,-2.570857744285714,0.2565450034226173 -C2F2_164_2746.vasp,C2F2,-4.8127362425,0.30300982124999987 -Lu2Br2O2_129_10302.vasp,Lu2Br2O2,-4.778526903333334,0.051285071666666404 -In1S1Br2_3_8325.vasp,InSBr2,-1.108796455,0.40959263648437505 -Mn2Sb2Se4I2_10_11251.vasp,Mn2Sb2Se4I2,-1.760789166,0.08925194225000055 -Ni2Te1Br1O1_6_13652.vasp,Ni2TeBrO,-1.060836288,0.33814873437500015 -Mn3Au1Se1I1Br1Cl3O4_1_11350.vasp,Mn3AuSeIBrCl3O4,-2.2339241128571428,0.18143420854165854 -Ba2Ti3O7_1_2072.vasp,Ba2Ti3O7,-6.181554149166666,-0.015770256166671714 -Sm2Se2_129_16585.vasp,Sm2Se2,-3.6761765825,0.2696160208333329 -Co2As1Se2_187_3841.vasp,Co2AsSe2,-2.4311577499999997,0.08692954593332947 -V3Mo1S8_25_20277.vasp,V3MoS8,-3.7411002774999997,0.01664850208333357 -In1Si1S3_143_8347.vasp,InSiS3,-2.704432304,0.5361692939999985 -V1O2_191_19895.vasp,VO2,-3.5490750933333337,2.1288639816666666 -Pd2Se4_14_14500.vasp,Pd2Se4,-1.6816181183333334,0.1667186300000001 -Zr2Ti1Ge1Pt1Se4S1Cl6_1_21721.vasp,Zr2TiGePtSe4SCl6,-3.02457467,0.2776067377704263 -Er2P6H12O12_10_5565.vasp,Er2P6H12O12,-4.8303509521875,0.08659464197916333 -Zr2Te6P2_12_21718.vasp,Zr2Te6P2,-2.725079097,0.30353147199999575 -Ag2C2O2F2_31_218.vasp,Ag2C2O2F2,-3.35039794875,0.33487702312500023 -Mn1Te2_187_10913.vasp,MnTe2,-1.5033811533333334,0.2724145666666664 -P1Ir3Br1O3_1_13926.vasp,PIr3BrO3,-3.3145558875,1.3217460435416595 -Au2F2_51_1480.vasp,Au2F2,0.0866372,1.0605494355555547 -Rb1C1N1_6_14725.vasp,RbCN,-4.775793976666667,0.2977437633333264 -Co2Te2Br2_59_4032.vasp,Co2Te2Br2,-1.3121810716666666,0.10927383000000002 -Mo8Se24_14_11767.vasp,Mo8Se24,-2.6138666478125,0.24719040802083347 -Nb2Ge2P2_129_12728.vasp,Nb2Ge2P2,-4.7055825449999995,0.11509466499999688 -Sn2Se2F2_59_16878.vasp,Sn2Se2F2,-2.136641238333333,0.27953440291666687 -Zr2F6_2_21565.vasp,Zr2F6,-4.23818798375,0.3191546318750002 -Te4Pt2_4_18620.vasp,Te4Pt2,-1.5129997466666667,0.33218770166666656 -Mn2Mo2Br2O8_129_11136.vasp,Mn2Mo2Br2O8,-4.012231812857143,0.08821784767856439 -Bi2Br6_31_2436.vasp,Bi2Br6,-0.82595024875,0.16538341749999996 -Te6Pb2_1_18676.vasp,Te6Pb2,-1.20922457375,-0.45371528291666674 -Li2Nb2I12_4_10014.vasp,Li2Nb2I12,-1.2524810325,0.09527421562500016 -Cu1S2_115_4957.vasp,CuS2,-1.4043143566666665,0.37658305090277644 -B2Br6_26_1657.vasp,B2Br6,-1.8513866925,0.05774121124999998 -Bi2Br2_164_2433.vasp,Bi2Br2,-0.792805185,0.02370659083333257 -Er2S2Br2_59_5567.vasp,Er2S2Br2,-3.5363077749999996,0.03449535333333387 -Cr2H8_4_4406.vasp,Cr2H8,-3.158211596,1.7425927260000003 -Zr2I6_189_21597.vasp,Zr2I6,-1.4959983125,0.25407283749999987 -Y3B2H2_187_20787.vasp,Y3B2H2,-4.500284394285715,0.420228787857133 -Sc1Nb1Br2N1_1_15957.vasp,ScNbBr2N,-3.9637589859999998,0.6207197942222097 -Te6Mo2P2_12_18655.vasp,Te6Mo2P2,-2.1663078540000003,0.28612150199999997 -Na1P2Pd1S6_5_11924.vasp,NaP2PdS6,-2.8385141529999998,0.09919364746874693 -Sn2P2C2S6F6_7_16806.vasp,Sn2P2C2S6F6,-3.1616062544444445,0.3652753677777745 -Hf4B3Cl2_164_7761.vasp,Hf4B3Cl2,-5.6315899400000005,-0.16497151055556075 -Cu3P1S4_156_5379.vasp,Cu3PS4,-1.58695392875,0.46239982874999996 -Mn2In2O5_164_11121.vasp,Mn2In2O5,-3.7788237177777777,0.1733572887092875 -Mn1Ge1Se1S1Cl2_1_10748.vasp,MnGeSeSCl2,-1.9923608249999998,0.34595318373263895 -Ge2C2I2_59_6763.vasp,Ge2C2I2,-2.7450511966666666,0.9319658391666629 -Zr2Sb2O6_162_21662.vasp,Zr2Sb2O6,-5.58389796,0.2972968199999987 -Ba1Ni4O8_162_1847.vasp,BaNi4O8,-2.5852818284615386,0.05689181403845478 -Ge2F6_1_6774.vasp,Ge2F6,-2.88157188625,0.09280376374999966 -La2S4O14_7_9610.vasp,La2S4O14,-4.8663565345,0.0790590247499956 -Mn1Al2Te4_164_10630.vasp,MnAl2Te4,-2.0209674757142855,0.0895249374350609 -Zr4C3Cl2_164_21811.vasp,Zr4C3Cl2,-5.836843118888889,-0.24651032888889413 -Cu1Sb3Se6_143_4972.vasp,CuSb3Se6,-1.770564213,0.31177532255555146 -P8C4_26_14147.vasp,P8C4,-5.115128290833334,0.2876441691666618 -Si1Ni4S5Br2_1_16353.vasp,SiNi4S5Br2,-1.5521574341666666,0.20815285958332963 -Mn2P2Se4I2_26_11202.vasp,Mn2P2Se4I2,-2.028651722,0.17841021912221888 -Cd1Hg1S2Br1Cl1_1_3362.vasp,CdHgS2BrCl,-0.4395030933333333,0.15100505065972053 -Al1Mo2C2Br2N1O1_1_685.vasp,AlMo2C2Br2NO,-4.162435121111112,0.8453441410185059 -Ta1Bi2_187_17515.vasp,TaBi2,-3.0442342766666664,0.22963731666666432 -Na1Sn1S1Cl3_1_11935.vasp,NaSnSCl3,-1.7978143683333334,0.11081268072916434 -Cr3N2F2_187_4564.vasp,Cr3N2F2,-4.44511481,-0.06952441174603918 -Li1In1As2S6_5_9726.vasp,LiInAs2S6,-2.735487517,0.45667061343749715 -Ni2Bi1S2_187_13461.vasp,Ni2BiS2,-1.220819422,-0.11411655461111186 -In2Sn2Te2_164_8609.vasp,In2Sn2Te2,-1.2875795983333334,-1.2333814133333334 -Ca4Se4O12_14_3238.vasp,Ca4Se4O12,-4.161423961500001,1.8285760384999996 -Cu2Se1S1I1Cl1_1_5293.vasp,Cu2SeSICl,-0.7081578666666667,0.1783363189384895 -Rh1C3_187_15146.vasp,RhC3,-5.5473628025,1.310367494999999 -Nb4Pd4S8_53_13126.vasp,Nb4Pd4S8,-3.678234264375,0.2867491615301704 -K2F2_129_9097.vasp,K2F2,-1.910222,-0.4327747350000002 -Ba2Ti1O4_25_2071.vasp,Ba2TiO4,-5.632825967142857,0.15251961357142907 -Sc1F2_187_15934.vasp,ScF2,-3.8584177900000003,-0.011548289444447857 -K8Ge4Se16_14_9552.vasp,K8Ge4Se16,-1.953074570357143,0.05744241892857116 -Mo3W1S8_25_11731.vasp,Mo3WS8,-3.9424014508333336,-0.0122945208333336 -Mo2Cl4O4_26_11599.vasp,Mo2Cl4O4,-3.422469176,-0.0011243880000000317 -Ge1Ir1Se1S1I2_1_6677.vasp,GeIrSeSI2,-2.000335835,-0.03031278437500018 -Zr1Zn1Pd2O8_12_21495.vasp,ZrZnPd2O8,-3.5240230741666667,0.37181826961804987 -Cu2Te4Cl2_4_5351.vasp,Cu2Te4Cl2,-0.7661812125,0.126070405 -Na2Hg4S6Cl6O2_31_12156.vasp,Na2Hg4S6Cl6O2,-1.053912003,0.4033547611249977 -Al1H2O2_164_669.vasp,AlH2O2,-4.408674102,0.3103768335000001 -Sr2Au1Br2O2_38_17123.vasp,Sr2AuBr2O2,-2.404528312857143,0.21014627775509742 -Cr2Br2Cl2_7_4330.vasp,Cr2Br2Cl2,-1.68534234,0.24401990444444266 -Ba1P2F12_2_1850.vasp,BaP2F12,-3.3049595506666667,-0.0486490733333369 -Fe1H4C4Br2N2_47_5698.vasp,FeH4C4Br2N2,-4.85780673,0.05705076461536929 -Mg3Pb1_25_10559.vasp,Mg3Pb,-0.016584695,-0.1702071 -Ta12I28_53_17499.vasp,Ta12I28,-2.40978874375,0.08801375100000008 -Cr3B2S2_187_4545.vasp,Cr3B2S2,-4.117463,0.06390489249999609 -Cr1Cu1Te6P2_5_4164.vasp,CrCuTe6P2,-1.753928543,0.4085347988333333 -Te2_51_18541.vasp,Te2,-0.917520375,0.6542653816666666 -Zn1Sn4O8_1_21016.vasp,ZnSn4O8,-3.7243594792307695,0.21802831519230115 -Cr2Cu2S8_51_4371.vasp,Cr2Cu2S8,-2.2238846899999998,0.3707289898611088 -Sc1Ag1P2O6_149_15888.vasp,ScAgP2O6,-4.9853978240000005,0.3530412293090843 -Bi10_6_2296.vasp,Bi10,-1.047365063,-0.580497068 -Ba4Ni2Br2O6_129_2165.vasp,Ba4Ni2Br2O6,-3.243558596428571,-0.11369596591518472 -V2Sb2Se6_157_20174.vasp,V2Sb2Se6,-2.582100061,0.24497325149999827 -Gd2C1Cl2_164_6604.vasp,Gd2CCl2,-4.084294448,0.04367760925925612 -Na8Sn8H16O20_4_12454.vasp,Na8Sn8H16O20,-3.825118821153846,-0.26377650737179664 -Mn1Ge1Se1Cl2_156_10747.vasp,MnGeSeCl2,-2.0764643759999997,0.1611345000000004 -Zr1Sb1As1_156_21419.vasp,ZrSbAs,-3.2434432933333333,0.7191020816666632 -Cd1Pd1S1Br1F1_1_3399.vasp,CdPdSBrF,-0.8092033259999999,0.3855039752500003 -Ni2W2Br2O8_129_13684.vasp,Ni2W2Br2O8,-3.892322202857143,-0.02069708678571791 -Sn2S6_11_16846.vasp,Sn2S6,-2.3914466225,0.2228758773437498 -Tm2Cu2Pb2Se6_51_19677.vasp,Tm2Cu2Pb2Se6,-2.268845036666667,0.19010715958333302 -Te6Mo2As2_2_18654.vasp,Te6Mo2As2,-2.011705417,0.18609329519999795 -Zr1Ge1Te1Se3_1_21302.vasp,ZrGeTeSe3,-2.88756146,0.19566715243054988 -Zr1Sc1Br2N1O1_1_21429.vasp,ZrScBr2NO,-4.657022465,0.44099059083333314 -Ag2B2S2Cl2_31_182.vasp,Ag2B2S2Cl2,-1.61928320125,0.9233375939583333 -Al2O3_150_918.vasp,Al2O3,-5.384331642,0.7392031959999992 -Ge2As2H6C2O6_7_6734.vasp,Ge2As2H6C2O6,-4.530791056666667,0.07769033944444126 -Hf1Mn1F6_1_7212.vasp,HfMnF6,-3.978367835,0.09557391624999978 -Al2Ni2O5_187_900.vasp,Al2Ni2O5,-4.104765991111112,0.10868618333332813 -Be1F2_115_2220.vasp,BeF2,-4.175236003333334,0.1310914666666667 -Te2Mo1_187_18403.vasp,Te2Mo,-2.168824856666667,-0.05793060666666694 -As2P4O12F2_4_1246.vasp,As2P4O12F2,-4.138161462,0.8946132057499914 -Li1In1Sb2S6_5_9735.vasp,LiInSb2S6,-2.496686781,0.33772044518749733 -V1As2_164_19769.vasp,VAs2,-3.325119023333333,0.36803511999999694 -Na4Co2Cl8_11_12382.vasp,Na4Co2Cl8,-1.4909439914285714,0.12478688071428579 -Ag4Cl4O8_54_511.vasp,Ag4Cl4O8,-1.37087312375,0.372368238125 -Sb1S2F2_164_15492.vasp,SbS2F2,-1.8660062979999998,1.0486291498124978 -Dy2Cl6_162_5522.vasp,Dy2Cl6,-2.872697395,0.04949564875000023 -Hg1H4C2N4Cl2_1_7873.vasp,HgH4C2N4Cl2,-4.372438154615384,-0.035273084166670854 -W3N2F2_187_20562.vasp,W3N2F2,-5.055972732857143,0.16491044369047148 -Mn2Se2_47_11286.vasp,Mn2Se2,-2.1567773525,0.1316762987931015 -Ag1H4C12S2_6_74.vasp,AgH4C12S2,-5.270158603157895,0.8578199015295987 -Ti1O2_191_18823.vasp,TiO2,-4.31275118,2.951103345 -Na4O12_13_12399.vasp,Na4O12,-3.073578758125,-0.37445225531250004 -Co1C6I2N2F4_25_3720.vasp,CoC6I2N2F4,-4.537918543333333,0.3108250162777689 -Cs2Hg4S8Br6_31_4732.vasp,Cs2Hg4S8Br6,-0.7004590989999999,0.23816289531250023 -Al2Cl6_189_796.vasp,Al2Cl6,-2.02751952125,0.2569902325000002 -Na2Nb2Cu4S8_3_12226.vasp,Na2Nb2Cu4S8,-2.65962108375,0.13018375125000015 -Mn1Sn1Br2N1O1_1_10889.vasp,MnSnBr2NO,-2.63657343,0.44616529874999455 -Nb2S1Br1N1O2F1_1_12831.vasp,Nb2SBrNO2F,-5.14244640125,0.059206246484370895 -Al1Cu1P2O6_149_641.vasp,AlCuP2O6,-4.792377448,0.48561982889999306 -Mn2Mo1Se4Br3_1_11134.vasp,Mn2MoSe4Br3,-1.8122226399999999,0.2536540502083303 -V2C1F2_164_20017.vasp,V2CF2,-4.584203638,-0.13808928180556057 -W1O2_164_20442.vasp,WO2,-5.80534092,0.4623588486394494 -Ga1Mo1Ir1Se4_1_6210.vasp,GaMoIrSe4,-2.538595307142857,0.20358680337911217 -V1Sb2_187_19925.vasp,VSb2,-2.4279573566666666,0.4551504486111084 -Te2Rh2Cl2_11_18498.vasp,Te2Rh2Cl2,-1.7689226133333333,0.1082469966666666 -Ti4Se4Br4_31_19161.vasp,Ti4Se4Br4,-3.7001463375,-0.572661819583336 -Te1Mo1O5_6_18299.vasp,TeMoO5,-4.34962633,0.195314380357138 -Hg2Au2Se2Cl2_26_7931.vasp,Hg2Au2Se2Cl2,0.1822782125,0.47596379750000006 -Sn2S2_164_16842.vasp,Sn2S2,-2.32325352,0.14057670124999966 -W2Cl8_1_20489.vasp,W2Cl8,-1.9108121400000002,0.3339205099999998 -B2Se2_164_1710.vasp,B2Se2,-4.1409873725,0.03399741000000045 -Bi5As1Se1S2Br6_1_2661.vasp,Bi5AsSeS2Br6,-1.4883401086666666,0.08405658866666364 -Ni2As1S2_187_13442.vasp,Ni2AsS2,-1.686844782,0.26091278283333197 -Li2V2Cu4S12_1_10115.vasp,Li2V2Cu4S12,-2.274324738,0.2876735943229116 -Ba2Cd1In1Cu1S5_99_1943.vasp,Ba2CdInCuS5,-1.9032629799999998,0.4198319127500003 -Sn3As4_5_16909.vasp,Sn3As4,-2.2592694085714284,0.22567368785714292 -In1Ag1P2O6_149_8179.vasp,InAgP2O6,-4.317558384,0.29515252639284817 -Ca2N4_1_3075.vasp,Ca2N4,-4.824319863333334,0.2899097433333324 -Zn1Br2_164_20903.vasp,ZnBr2,-0.08022929333333333,0.1125101904166667 -Mn2Bi2S4I2_10_11012.vasp,Mn2Bi2S4I2,-1.910382727,0.18791874383333296 -V2Sn2Se6_162_20198.vasp,V2Sn2Se6,-2.5065966,0.20509277650000024 -Pb2C2Cl2_59_14229.vasp,Pb2C2Cl2,-2.014919205,1.69959981583333 -Hf1Rh1Se2Br1_1_7273.vasp,HfRhSe2Br,-3.10181885,0.4559064232499962 -P2Au2S4_26_13956.vasp,P2Au2S4,-2.02987012875,0.24869834749999997 -Cr2Cu2P4S12_1_4368.vasp,Cr2Cu2P4S12,-2.8539082355,0.1424751542864524 -Li1Co1As2S6_149_9671.vasp,LiCoAs2S6,-2.813734345,0.40989767696051993 -Pd4S4I3Cl1_8_14522.vasp,Pd4S4I3Cl,-1.2437564225,0.14214895505208325 -Cd2Se2I2_59_3571.vasp,Cd2Se2I2,0.04189292666666666,0.02098077583333191 -Bi4O6_4_2623.vasp,Bi4O6,-3.58105296,0.27694126799999985 -Fe2Mo2S8Br2_129_5875.vasp,Fe2Mo2S8Br2,-2.1298587014285713,0.43434594886904343 -Hg1Pb2I2O2_12_7897.vasp,HgPb2I2O2,-1.5071294371428572,0.09539396285714297 -Li2Sb2P8O24_4_10064.vasp,Li2Sb2P8O24,-5.310620198333334,0.1023161683611109 -Tl2Te2_65_19552.vasp,Tl2Te2,-0.45488555,0.49777383125 -B3H2W4_164_1730.vasp,B3H2W4,-5.438298642222223,0.6534313922222159 -Ba2Pt1_164_2048.vasp,Ba2Pt,-0.8712468266666668,0.1865333383333333 -Pt3Br2O5_1_14688.vasp,Pt3Br2O5,-2.244993844,0.5475349654999992 -Nb2S4I2_11_12854.vasp,Nb2S4I2,-3.39021369875,0.23830330687500023 -Hg1Pb2S2Cl2_12_7900.vasp,HgPb2S2Cl2,-1.280997502857143,-0.3545731035714301 -H4Au4O4F4_2_7061.vasp,H4Au4O4F4,-1.246843905625,0.929250705625 -Na1Mo2S2Cl6_47_11903.vasp,NaMo2S2Cl6,-1.969227779090909,0.2690085971590864 -Pt2O2F2_59_14641.vasp,Pt2O2F2,-2.2469523766666666,0.17510583416666492 -Mn2Au2Se3S1_1_10990.vasp,Mn2Au2Se3S,-1.39508035625,0.9015760899999998 -Sc3H2C2O2_187_16203.vasp,Sc3H2C2O2,-5.256164505555556,0.470490865092587 -Os2Br2O2_59_13831.vasp,Os2Br2O2,-3.223932721666667,0.4838523191666628 -Mn1Pb1S1I1Cl1_1_10840.vasp,MnPbSICl,-1.657080224,0.21471371333333356 -Li2Ag2F8_30_9824.vasp,Li2Ag2F8,-1.64743953,-0.2602107850000013 -Mn2As2S4I2_26_10976.vasp,Mn2As2S4I2,-2.245527667,0.3819563418333318 -V2I4_11_20098.vasp,V2I4,-1.1475664816666666,-0.04412043611111116 -Mn1Pb1Cl2_1_10839.vasp,MnPbCl2,-1.4373716075,0.2585885894396551 -Hf2S2I1Cl1_25_7570.vasp,Hf2S2ICl,-4.206764406666667,0.00023494093749087952 -Sr2C2S6F2_59_17163.vasp,Sr2C2S6F2,-3.5089845883333335,0.38579204640624104 -Cu1Bi1P2S6_143_4849.vasp,CuBiP2S6,-2.731622584,0.07729737153645244 -Mn2In2Se5_164_11127.vasp,Mn2In2Se5,-2.0865055644444443,0.0372394247317987 -Na2Mg2Cl6_162_12203.vasp,Na2Mg2Cl6,-1.936993044,0.1338786418333331 -Ta1Ga1Te2_1_17547.vasp,TaGaTe2,-2.669687245,0.629637689871791 -Na1W2Cl6O2_47_11952.vasp,NaW2Cl6O2,-3.2308722636363636,0.042712578181818284 -P4H8Pb2O8_13_14082.vasp,P4H8Pb2O8,-4.337695230909091,0.046596345899806595 -Ti1Te1S1_156_18855.vasp,TiTeS,-4.194855406666666,-0.03227507898148474 -Ta1I4_123_17559.vasp,TaI4,-1.270747074,0.41844709421875015 -Hg2Te2H4O8_31_8030.vasp,Hg2Te2H4O8,-3.12280961625,0.07491806319145378 -Fe1H4Br2N6_47_5689.vasp,FeH4Br2N6,-4.097996694615384,-0.03135244586539154 -Cr2S4_11_4472.vasp,Cr2S4,-3.363648515,0.09996469166666655 -V13Te26_2_19746.vasp,V13Te26,-2.2694071425641025,0.09783391521367513 -Tc1F2_164_18219.vasp,TcF2,-3.6601912566666663,0.5710548708333274 -Zn1O2F2_164_20984.vasp,ZnO2F2,-1.4163182859999999,0.8845745390000003 -Mn2Te2O8_31_11301.vasp,Mn2Te2O8,-3.8839345841666666,0.30345304562499964 -Ca2Ag2_191_2920.vasp,Ca2Ag2,0.6733155025,0.26067202312500004 -Cr2Se2_25_4502.vasp,Cr2Se2,-2.731642005,0.43395951750000017 -V2I10_51_20089.vasp,V2I10,-0.39647744916666666,0.17725240312499946 -Sn2Sb4S8_11_16872.vasp,Sn2Sb4S8,-2.6119948392857144,0.09480888107142649 -V4Se6_2_20369.vasp,V4Se6,-3.235824218,0.08180435449999734 -Tl2Sb2_129_19522.vasp,Tl2Sb2,-0.6659404175,0.589530651875 -Li2Nb6Cl18_2_10017.vasp,Li2Nb6Cl18,-3.030805023846154,0.06549114423076352 -P2Pd1Au1S6_1_14018.vasp,P2PdAuS6,-2.50681025,0.14878849057406776 -V4B3H2O2_164_20302.vasp,V4B3H2O2,-4.867445446363636,0.18824224409090096 -In1Pt2_38_8319.vasp,InPt2,-1.0507613866666665,0.8700053838888873 -Nb1S1O1_156_12559.vasp,NbSO,-5.685103689999999,0.2863441156250013 -Zn4Sn4O8_2_21229.vasp,Zn4Sn4O8,-2.791677976875,0.20833894125000008 -Cr2As2S6_162_4310.vasp,Cr2As2S6,-3.071753563,0.21037434837499713 -K2P2Pd2_129_9291.vasp,K2P2Pd2,-1.5929087583333335,0.16335439712962802 -Mo2C1F2_164_11582.vasp,Mo2CF2,-3.84797086,0.22548281516666147 -Li1In1Sb2Te6_5_9737.vasp,LiInSb2Te6,-1.4655562899999999,0.3611641581666652 -Mn2Se1S1Br2_25_11272.vasp,Mn2SeSBr2,-1.9651550183333333,0.09068535611110828 -K2Pt2N2Cl6_51_9309.vasp,K2Pt2N2Cl6,-1.5074358808333335,0.680787202916662 -Al2S2Br2_59_934.vasp,Al2S2Br2,-2.7744349033333333,0.009337625000000127 -Ni2Te2_187_13668.vasp,Ni2Te2,-0.0915975525,0.47147937249999955 -Zr1Ni1Ru1I1N2F3_1_21379.vasp,ZrNiRuIN2F3,-3.54846413,0.3740423009027698 -In1Pb1S2Br2_6_8302.vasp,InPbS2Br2,-1.6263437616666667,0.240708802864581 -Mg1Al2H8_164_10330.vasp,MgAl2H8,-2.886851488181818,0.32172635545454253 -Mn2Te4As2Br2_10_11312.vasp,Mn2Te4As2Br2,-1.6660550310000002,0.21940427674999619 -P4Cl12_14_14078.vasp,P4Cl12,-1.739242814375,0.05202207812499848 -Na2Sb2P4S12_4_12295.vasp,Na2Sb2P4S12,-2.9880459175,0.14085019274999988 -V3S2N2_187_20288.vasp,V3S2N2,-5.1358996957142855,0.015698652857138562 -Na1Ni1P2O6_149_11913.vasp,NaNiP2O6,-4.223009809,0.5487853842499955 -Ga4As4_2_6541.vasp,Ga4As4,-0.20690940375,1.4926481212499998 -Na2Co2Bi2_129_12059.vasp,Na2Co2Bi2,-0.8599319316666666,-0.0630068883333339 -Ru1F2_164_15269.vasp,RuF2,-2.513796473333333,0.2380940216666641 -Si2Ag2S6_51_16381.vasp,Si2Ag2S6,-2.567817355,0.17281009999999775 -Ti3H2S2N2_38_19088.vasp,Ti3H2S2N2,-5.837012854444445,-0.044034192986121545 -Ni1H3_187_13329.vasp,NiH3,-1.56246193,2.0575956900000003 -Er2Cl2O2_164_5551.vasp,Er2Cl2O2,-5.054800141666667,0.0282781416666662 -Cr1Cu1As2Se6_5_4149.vasp,CrCuAs2Se6,-2.0919199930000003,0.21352401409999752 -K4Li4H8W4O20_29_9472.vasp,K4Li4H8W4O20,-4.667678796,0.09360673825000054 -Sb2Cl10_51_15563.vasp,Sb2Cl10,-0.8258239233333334,0.2884402541666665 -Bi2S2O1_1_2515.vasp,Bi2S2O,-2.7776339820000002,-0.5226879746666688 -Ag1C1N1O1_25_40.vasp,AgCNO,-3.8537131475,0.7442472211458266 -K4Al4Te8_5_9408.vasp,K4Al4Te8,-1.65459706875,0.14225732437500005 -Na2Cd4Te2Br6O6_31_12043.vasp,Na2Cd4Te2Br6O6,-1.4569688295,0.35825351450000276 -Mo2Cl2O4_8_11595.vasp,Mo2Cl2O4,-4.03377766125,0.08906649953125001 -Li2Nb2F12_4_10013.vasp,Li2Nb2F12,-4.01405352625,-0.02135655624999977 -Sb2Os2S6_162_15619.vasp,Sb2Os2S6,-3.217745645,0.4421637377999934 -Ge2S2F2_59_6824.vasp,Ge2S2F2,-2.844963228333333,0.3061423730208337 -Na2Cd4Te2I6O6_31_12045.vasp,Na2Cd4Te2I6O6,-1.353314959,0.24470201743750075 -Cr2Fe1Te4_164_4386.vasp,Cr2FeTe4,-1.7739186471428572,0.20538067142856742 -Hf2P2O6_12_7553.vasp,Hf2P2O6,-6.3137540119999995,0.5056694282000012 -Zn2Sb4S6Cl4_31_21159.vasp,Zn2Sb4S6Cl4,-1.8064258075,0.20214625425 -Si6N8_38_16535.vasp,Si6N8,-5.616229365714285,0.20290088285714347 -Ca1Bi2O5_1_2806.vasp,CaBi2O5,-3.6372224425,0.3550551716015622 -Pd2Br2O2_59_14400.vasp,Pd2Br2O2,-1.564812005,0.2975447188888871 -Mn1Nb1Se1S1Br2_6_10811.vasp,MnNbSeSBr2,-2.9172029416666665,0.062466743541659375 -V2Cu2Sb4Te12_13_20053.vasp,V2Cu2Sb4Te12,-1.4413029425,0.3185167302777764 -C2F8_1_2748.vasp,C2F8,-3.2839955959999996,0.03140286000000003 -Ge2S2_31_6831.vasp,Ge2S2,-3.119197805,-0.8680499512500002 -Tl2Sb2S6_149_19520.vasp,Tl2Sb2S6,-2.059840789,0.2679140543749976 -Zr1Ti1Se4_10_21475.vasp,ZrTiSe4,-4.162763091666666,0.11855425625000038 -Ca1O2F2_164_2863.vasp,CaO2F2,-2.508249256,1.1408652405000002 -Sc2H2F2_164_16081.vasp,Sc2H2F2,-3.8769172933333333,-0.13076407805555854 -Nb8O18_85_13207.vasp,Nb8O18,-6.573889281538461,0.13251735471153586 -Mn3C2Cl2_187_11361.vasp,Mn3C2Cl2,-3.498051065714286,0.20766265571428122 -Al2Co2Te5_156_810.vasp,Al2Co2Te5,-1.832425327777778,0.3326075857076659 -Nb1Te2O1_8_12600.vasp,NbTe2O,-4.0216806125,0.24322229078125046 -Na2Zn4H6S4O16_2_12340.vasp,Na2Zn4H6S4O16,-3.6620982515625,0.1181547471041644 -Cu2Cl4O12_4_5084.vasp,Cu2Cl4O12,-2.1193007911111112,0.281860107499998 -Cu4I4O4F4_1_5427.vasp,Cu4I4O4F4,-0.72262482375,0.5978913347500001 -Zn2Cr4S10_6_21066.vasp,Zn2Cr4S10,-2.424734336875,0.47089059175000003 -Ag2S1Br1Cl3_1_371.vasp,Ag2SBrCl3,-0.3249325585714286,0.1976262439285703 -In2Co1Te4_164_8410.vasp,In2CoTe4,-1.385732207142857,0.11031722190476068 -Sn1As2Se4_164_16602.vasp,SnAs2Se4,-2.39395566,-0.08214397071428714 -Mn2Te4P2Br2_26_11321.vasp,Mn2Te4P2Br2,-1.7754391989999998,0.4444696601944408 -Sb1Se1F1_156_15499.vasp,SbSeF,-2.39773142,0.2986722255555534 -Cr2W2Se8_25_4540.vasp,Cr2W2Se8,-3.2525252908333333,-0.17355229833333308 -Zr1Ge1S2I4_8_21301.vasp,ZrGeS2I4,-1.965268775,0.20738638390624997 -Na2Zr1N2_164_12344.vasp,Na2ZrN2,-4.48328864,0.1479109632222137 -Mg1Ga2S4_164_10363.vasp,MgGa2S4,-2.9310483857142855,0.04613049428571436 -Mo2S2_129_11667.vasp,Mo2S2,-3.4042864875,0.7626116537500005 -Na2Sn1O6_147_12304.vasp,Na2SnO6,-2.4992593377777776,1.1828626268055524 -Na2C2S6F2_1_12002.vasp,Na2C2S6F2,-3.1251787258333334,0.26887766885416076 -Bi2F8_3_2459.vasp,Bi2F8,-2.1596905069999996,0.1502143972500003 -P2Pb6_65_14017.vasp,P2Pb6,-0.8743880125,1.14936650660714 -Hf1Br1F2_1_7127.vasp,HfBrF2,-3.7425915675,0.5229320464583302 -Sc2H2Cl2_164_16080.vasp,Sc2H2Cl2,-3.311575551666667,0.03589166166666624 -Sr2Bi2Br2O4_51_17143.vasp,Sr2Bi2Br2O4,-3.3343260720000005,0.16058015099999956 -S2N2_129_15382.vasp,S2N2,-3.505275205,0.5705425059375004 -Sr2Ag1Te2Br2_38_17113.vasp,Sr2AgTe2Br2,-1.1376407214285715,0.341021441190473 -Ti2Hg2_129_18952.vasp,Ti2Hg2,-1.648446475,0.36242253293103266 -Ga2Ni2S5_164_6406.vasp,Ga2Ni2S5,-2.2053536944444447,0.05236092148147914 -Cd1In1Ga1O4_156_3369.vasp,CdInGaO4,-3.2693185000000002,0.26668519735118856 -Fe3P2H16O16_10_6059.vasp,Fe3P2H16O16,-4.518128295405406,-0.040319813108113056 -Mn3F8_2_11376.vasp,Mn3F8,-2.8243104545454547,-0.3532498009090932 -Y4B3_164_20808.vasp,Y4B3,-4.700727961428571,0.5543311389285657 -K6Ta4Cu6S16_13_9545.vasp,K6Ta4Cu6S16,-2.8942220990625,0.07592785062499985 -Pb2Se2_6_14296.vasp,Pb2Se2,-1.5373986475,0.4125654959374998 -Hg2Br2_129_7944.vasp,Hg2Br2,1.3482186475,0.5574850925 -Ca4Mo4As4O20_1_3227.vasp,Ca4Mo4As4O20,-4.8032209621875,0.2049392130208303 -Na2B2N2O2_31_11981.vasp,Na2B2N2O2,-4.90651489,0.7679384341666612 -K2I1_164_9201.vasp,K2I,0.14124017333333333,-0.2164210999999997 -Be3Si1_99_2283.vasp,Be3Si,-2.78668748,-0.3507818787499998 -Be10Co2_26_2208.vasp,Be10Co2,-2.72967287,-0.013283797500002192 -Te4H4O12_1_18587.vasp,Te4H4O12,-3.7896470800000004,0.2288487677499993 -Hf4Se4I4_7_7817.vasp,Hf4Se4I4,-3.4083431291666666,0.05132023624999782 -Hf1Sb2_164_7292.vasp,HfSb2,-3.5584872766666664,-0.8344850162499999 -Mn2Al2Ge2_129_10950.vasp,Mn2Al2Ge2,-2.3000412983333334,0.5918788899999998 -W2Cl2_164_20484.vasp,W2Cl2,-3.5663598075,0.46816328749999947 -Re4Sb8O26_2_15116.vasp,Re4Sb8O26,-4.975777568157895,-0.41244895657895153 -Ba2Au2_191_1915.vasp,Ba2Au2,0.082709195,0.37355304125 -Li4Sn4H24N12_14_10229.vasp,Li4Sn4H24N12,-4.273809253636364,0.030166630227272506 -Cs2Te2H6C2O6_4_4792.vasp,Cs2Te2H6C2O6,-3.7516402733333334,0.47172488088887526 -Mo2Se2_164_11691.vasp,Mo2Se2,-2.90428116,0.722087935 -Ba1Ca1I4_10_1816.vasp,BaCaI4,-1.2673703216666665,0.141196274 -In1Au1Se2_1_8202.vasp,InAuSe2,-1.009965305,0.34386884000000006 -Th1C2_123_18712.vasp,ThC2,-6.38889675,0.9384733083333332 -Al2Ni2Te5_156_908.vasp,Al2Ni2Te5,-1.3369041288888888,0.26674759105158263 -Zn2Te3O8_5_21187.vasp,Zn2Te3O8,-3.127027326153846,0.14713588769230768 -Ga2S4_14_6453.vasp,Ga2S4,-2.49405111,0.3765275982291639 -Bi2Te3_156_2570.vasp,Bi2Te3,-1.304880132,0.2624738019999999 -Zr1Se1O1_156_21441.vasp,ZrSeO,-5.34935289,0.287218102083334 -In2Ni4Se6_164_8505.vasp,In2Ni4Se6,-1.1521028416666665,-0.045076742500001404 -Tl2Br2_59_19381.vasp,Tl2Br2,-0.731640915,-0.1549286649999999 -K2Te4F18_2_9377.vasp,K2Te4F18,-2.28236470375,0.054144760000000236 -Pt2Se2Br2_59_14673.vasp,Pt2Se2Br2,-1.4806786666666667,-0.1614640650000001 -Nb1Mo2Se1S2I2_1_12535.vasp,NbMo2SeS2I2,-2.79999358625,0.27724951416666216 -Li2Co2Sb2_129_9867.vasp,Li2Co2Sb2,-1.97741032,0.08546651999999821 -Te1Mo1S1_156_18305.vasp,TeMoS,-2.737439173333333,0.20106726083333348 -Li2V4F18_2_10130.vasp,Li2V4F18,-3.3564315920833336,-0.1268097945833362 -Fe2H2O4_31_5853.vasp,Fe2H2O4,-3.58999607875,0.5285478224999998 -Sn6Sb2_191_16999.vasp,Sn6Sb2,-0.76414395,-0.8167814404166656 -W3O8_12_20568.vasp,W3O8,-5.86603567909091,0.3334997803339444 -Ti3C2S2F2_187_19075.vasp,Ti3C2S2F2,-5.398373304444444,0.43237632687498695 -Ge2As1S6_162_6727.vasp,Ge2AsS6,-2.93925473,0.28883281524304927 -Na1Mn1Se2_156_11896.vasp,NaMnSe2,-1.8083246425,0.31953483000000005 -Ge3Rh1_187_6917.vasp,Ge3Rh,-2.285647835,0.4344180643750002 -Sr2Sb4O8_11_17312.vasp,Sr2Sb4O8,-4.383332201428571,0.07299317857142906 -Tl2S4_1_19511.vasp,Tl2S4,-1.6724153599999998,0.2640953605208336 -Ga2Te5_12_6520.vasp,Ga2Te5,-1.5589529914285714,0.286124372857143 -Hg3B2S6_150_8051.vasp,Hg3B2S6,-1.9571400109090908,0.17063971522727045 -Zr2Te2S1_164_21708.vasp,Zr2Te2S,-3.8369474519999995,-0.043291131999999344 -Ni2As2Pt2_129_13448.vasp,Ni2As2Pt2,-1.3497600966666665,0.5223041426157377 -Hf1Ti1S1Br2N1_6_7331.vasp,HfTiSBr2N,-4.9021804216666665,0.15454806166666302 -Ge1Pt1S2_1_6694.vasp,GePtS2,-2.6813987375,0.4461571798437499 -Sn6N6_12_16990.vasp,Sn6N6,-3.5563752416666667,-2.0932116729166665 -Zr2Cl4O2_39_21551.vasp,Zr2Cl4O2,-4.34144541,0.11438450999999983 -V4S8_12_20364.vasp,V4S8,-3.486526566666667,0.2684322666666663 -Pt3I1Br1N3_8_14690.vasp,Pt3IBrN3,-2.44447469,0.7169402320312502 -Nb4I1O7_156_13090.vasp,Nb4IO7,-6.134127278333334,0.24362929496527386 -Ti1Ni1S2I4_6_18812.vasp,TiNiS2I4,-1.50784791625,0.2192320351041646 -Hf1Cl2_164_7144.vasp,HfCl2,-3.421340303333333,0.25384031083333025 -Ca1Sb4O8_6_2877.vasp,CaSb4O8,-4.181157306153846,0.23896421064102208 -Mn2Sb2S4I2_26_11242.vasp,Mn2Sb2S4I2,-2.096974048,0.3823315234999991 -Hf1Br1N1Cl1_6_7128.vasp,HfBrNCl,-4.0432839175,0.6754486471354134 -Sn6Bi6_12_16983.vasp,Sn6Bi6,-1.1324716083333333,-2.202749353333333 -Si6H2_164_16531.vasp,Si6H2,-3.99102716625,-0.5419754449999998 -Pr2Se6_129_14552.vasp,Pr2Se6,-3.2940285875,0.1593507727083332 -Hf2Ti2S8_28_7652.vasp,Hf2Ti2S8,-4.9682368025,0.31730300416666646 -In2Pd4S6_164_8530.vasp,In2Pd4S6,-1.98134169,0.23367818154761755 -Sr3Ni2Cl2O5_123_17391.vasp,Sr3Ni2Cl2O5,-3.2300380366666666,-0.284067726527784 -V4H8O8F8_14_20330.vasp,V4H8O8F8,-4.218187791428571,-0.21227129889882057 -B4N20_26_1757.vasp,B4N20,-5.92747262375,0.36265303874999466 -K2I6_4_9207.vasp,K2I6,-0.07834231,0.09729873750000001 -Cr2Sb2P4O16_11_4480.vasp,Cr2Sb2P4O16,-5.1863484712500005,0.19768989722222186 -Y2I4_11_20747.vasp,Y2I4,-2.3168610333333333,0.085901776111109 -Er6Cl7_2_5581.vasp,Er6Cl7,-2.5081820415384617,0.1868970411538431 -Mo2S2_164_11669.vasp,Mo2S2,-3.390337925,0.77656021625 -In1F2_164_8243.vasp,InF2,-2.2070976166666667,0.30400446999999975 -Sn2P6_164_16829.vasp,Sn2P6,-3.1176756825,0.2960263215625001 -Sb1Te2Pd2_187_15516.vasp,SbTe2Pd2,-1.567019246,0.16335955528571278 -Tc1Se2_164_18222.vasp,TcSe2,-4.19348207,0.35479400083333346 -Mn2H4S2O8_7_11101.vasp,Mn2H4S2O8,-4.183907013125,0.20510570461308741 -Nb3B2Cl2_187_12943.vasp,Nb3B2Cl2,-5.3225674128571425,0.17588798214284562 -Hf1Br1F1_156_7126.vasp,HfBrF,-3.7339486799999997,0.4104066518055486 -Co1H4C2N6F2_6_3751.vasp,CoH4C2N6F2,-4.55033689,0.4164223119722109 -Te2Os2_164_18429.vasp,Te2Os2,-2.95178643,0.17173079875000008 -Ru2Br2_164_15301.vasp,Ru2Br2,-1.53879175,0.8027822891666646 -Nb3N2Cl2_187_12985.vasp,Nb3N2Cl2,-5.70964513,0.08449786078230648 -Hf2I8_1_7526.vasp,Hf2I8,-1.720671251,0.09205801599999996 -Cd2Au2S2F2_26_3459.vasp,Cd2Au2S2F2,-0.49345199375,0.24493596781250007 -Cs2Cd4Se2S6Cl6_31_4697.vasp,Cs2Cd4Se2S6Cl6,-1.0033955865,0.34752698195833276 -Hf3Ti1Te8_6_7743.vasp,Hf3TiTe8,-3.4559862108333337,0.26276048124999984 -Re2Te4_11_15091.vasp,Re2Te4,-3.3207605416666666,0.19956764833333374 -Ni4Te4P4_13_13770.vasp,Ni4Te4P4,-1.7087178200000002,0.33373770569444006 -Mn1Sb1Se1N1Cl1_1_10862.vasp,MnSbSeNCl,-2.806148452,0.32772639174999785 -Fe6S8_11_6096.vasp,Fe6S8,-2.367058599285714,-0.4048531614285731 -Ge2Br2O2_59_6754.vasp,Ge2Br2O2,-2.973135245,0.29156690375000016 -W12Br24_127_20402.vasp,W12Br24,-2.5116209397222224,0.07355330972222163 -Sr10Ir2_26_17012.vasp,Sr10Ir2,0.01508424,0.29578458366666616 -Y4N2Cl6_12_20829.vasp,Y4N2Cl6,-4.773589035833333,0.0591899291666671 -Hf1Sb1Cl2O3_1_7285.vasp,HfSbCl2O3,-4.4880806657142855,0.251952918124992 -Cu1Ge1S2I1Br1_6_4883.vasp,CuGeS2IBr,-1.3869608166666667,0.15273897950231022 -K2H6Pt1S6_147_9156.vasp,K2H6PtS6,-2.740017564,0.04790193033333345 -Sb2Cl6_31_15571.vasp,Sb2Cl6,-1.43668132625,0.08256049874999993 -Ta2Te4Pd4_51_17917.vasp,Ta2Te4Pd4,-2.658530995,0.13594386690475746 -Nb2N2F2_59_12770.vasp,Nb2N2F2,-6.174854378333333,0.1684268760999883 -Pd2Se2_164_14495.vasp,Pd2Se2,-1.1445654825,0.5822902299999999 -Ti3N2_187_19097.vasp,Ti3N2,-7.4431491780000005,0.669130585749993 -Bi1Se2O6F1_1_2392.vasp,BiSe2O6F,-3.2736728050000004,0.27657073137499644 -Na2Cd1H4S2O10_2_12017.vasp,Na2CdH4S2O10,-4.020415723157894,0.05221722135964191 -Co2I2N2_59_3923.vasp,Co2I2N2,-2.587493916666667,-0.1921513119444469 -Bi1Sb1S2I2_1_2380.vasp,BiSbS2I2,-1.6425952916666666,0.09076292291666488 -Co2Bi4S6Cl4_11_3873.vasp,Co2Bi4S6Cl4,-1.966350346875,0.23997660713541397 -In1Au3Br4O4_1_8204.vasp,InAu3Br4O4,-1.2967744583333334,0.12144352498263722 -Na2Hg4Se2S6F6_31_12168.vasp,Na2Hg4Se2S6F6,-1.194285002,0.20270069458035522 -Te6As4O22_13_18648.vasp,Te6As4O22,-3.9454315659375,0.07932492624999954 -Cr2Te6_59_4534.vasp,Cr2Te6,-1.665967735,0.18426330833333365 -Au2Se1S1Br4_6_1538.vasp,Au2SeSBr4,-0.10641304125,0.33596101398437483 -Zr1Mn1Cl6_5_21320.vasp,ZrMnCl6,-2.3769313275,0.05870362499999837 -Cd1H10C12Br2N2_2_3316.vasp,CdH10C12Br2N2,-5.301725069259259,0.11322790907406377 -Zr2Br2N2_59_21520.vasp,Zr2Br2N2,-5.3765222816666665,0.07973963999999967 -Bi2Te2S1_156_2562.vasp,Bi2Te2S,-1.7665239700000002,0.13687583199999964 -Al1Cu1Te6P2_149_650.vasp,AlCuTe6P2,-1.770894406,0.11752142981481084 -Mo3H2C2O2_187_11707.vasp,Mo3H2C2O2,-4.817769326666667,0.350149325138879 -Mn2H4Se2O8_7_11103.vasp,Mn2H4Se2O8,-3.946891580625,0.18623828286458344 -Ga2Se3_189_6482.vasp,Ga2Se3,-2.0748376019999997,0.38215426200000024 -Hg4Cl8_115_8072.vasp,Hg4Cl8,0.3025345125,0.17229633583333334 -Bi2F6_162_2455.vasp,Bi2F6,-2.45738055875,0.5379253068749996 -Li2Br1_164_9844.vasp,Li2Br,-1.6458412966666665,0.416713065555554 -Ge2As2O6_7_6738.vasp,Ge2As2O6,-4.352968594,0.2869688978333298 -Cd2Cl2_2_3486.vasp,Cd2Cl2,0.41602298,0.016119191250000053 -Zr2Te2_187_21710.vasp,Zr2Te2,-2.866884115,0.09528641999999987 -Pb1S2_115_14200.vasp,PbS2,-1.8866287066666667,-0.5652448102083344 -Hf2O2_164_7548.vasp,Hf2O2,-6.792433025,0.5143687506818111 -W1Br2_187_20423.vasp,WBr2,-1.4984899266666665,1.0866843227777776 -Pd2I2N2_59_14429.vasp,Pd2I2N2,-1.7578010166666667,0.5070448145833306 -Pd2F6_191_14425.vasp,Pd2F6,-0.827133215,0.5439505487499999 -Ti1V2Te4_12_18868.vasp,TiV2Te4,-2.98975003,0.15190742520407297 -Bi1O2_191_2350.vasp,BiO2,-1.7673651733333333,2.0001856726041636 -Zn2Cr2F10_13_21062.vasp,Zn2Cr2F10,-2.342409785,0.08259838749999804 -Al2Fe2Te5_187_838.vasp,Al2Fe2Te5,-1.8311429955555556,0.0214265456018502 -Ta3Se1I7_156_17991.vasp,Ta3SeI7,-2.4656066736363638,0.07453998725141775 -Ga1Pd5Br2_123_6239.vasp,GaPd5Br2,-1.02524570375,0.060623165231480314 -Pb4Cl2O4_11_14310.vasp,Pb4Cl2O4,-2.7515848949999997,0.1733042137500005 -Cd6Se8O24_14_3640.vasp,Cd6Se8O24,-2.891192065,0.15632662973683664 -Hf2Ir1Pd1Se6_1_7527.vasp,Hf2IrPdSe6,-3.452400479,0.24840427689153965 -Cu4Se4O12_14_5475.vasp,Cu4Se4O12,-2.872851852,0.20760258012499672 -Na2Cd4Se2S6I6_31_12042.vasp,Na2Cd4Se2S6I6,-0.73935231,0.11512811762499797 -Hg2S10F4_7_7991.vasp,Hg2S10F4,-1.552627496875,0.3079307727604157 -Be2Bi1_115_2243.vasp,Be2Bi,-1.0480838,0.6083107216666654 -B3C10N3_25_1727.vasp,B3C10N3,-7.370580084375,0.6282017003125011 -Tl1S2_115_19333.vasp,TlS2,-1.2627932233333332,0.6737174971875002 -Ti1Se2_187_18852.vasp,TiSe2,-4.256547636666666,0.21593421833333348 -Li2Mn1F6_164_9986.vasp,Li2MnF6,-2.9278502133333335,0.1607032411111109 -V1S2_115_19917.vasp,VS2,-3.4065301433333333,0.34842869 -Ta4B3S2F2_164_18007.vasp,Ta4B3S2F2,-5.679295416363637,0.7088335685454432 -Ca2Au1Se2I2_38_2941.vasp,Ca2AuSe2I2,-1.199491492857143,0.22492320985713998 -In1P2S2_1_8300.vasp,InP2S2,-2.830643224,0.3583689819583309 -C2_191_2759.vasp,C2,-8.068384815,0.04794059500000003 -Rb1Hf1Mg6O7_99_14737.vasp,RbHfMg6O7,-4.250622135333334,-0.2314017285757668 -Mn2H8C4O12_13_11106.vasp,Mn2H8C4O12,-5.046559944615385,0.08736771108973129 -Li2Mo1P2O8_147_10004.vasp,Li2MoP2O8,-4.970323183076923,0.4376416766153799 -Ta2F6_162_17723.vasp,Ta2F6,-4.2563501275,0.5626984207499954 -Tl6B6S12_164_19641.vasp,Tl6B6S12,-3.243526130833333,0.09001406291666703 -Ga1Pt2I1Cl1O3_8_6245.vasp,GaPt2IClO3,-2.45929442625,0.1526053779687443 -Nb2Pt1Se6_12_12823.vasp,Nb2PtSe6,-3.5163376088888887,0.09903847000000043 -Os2I2_164_13852.vasp,Os2I2,-1.75944151,0.9941469609375 -Cr2Si2S6_162_4508.vasp,Cr2Si2S6,-3.549576396,0.13457109318181093 -Hg2Ge1O4_21_7960.vasp,Hg2GeO4,-2.27112764,0.22760554785714326 -Sn2P2O6_7_16818.vasp,Sn2P2O6,-4.535227194,0.39243236419999517 -Zr3C1I2N1_8_21753.vasp,Zr3CI2N,-4.630911344285714,0.3900960344557727 -Sr1Mn1Ag1Br2O2_1_17063.vasp,SrMnAgBr2O2,-2.3507163785714282,0.3329440086666643 -Cu2Se4I2_4_5310.vasp,Cu2Se4I2,-0.81733244875,0.084679768125 -Ru2Cl2O2_59_15306.vasp,Ru2Cl2O2,-3.149589165,0.38482006111110834 -Al2Te2Br2_59_997.vasp,Al2Te2Br2,-1.8356097933333333,0.14662928166666678 -Ta3I8_156_17965.vasp,Ta3I8,-2.14786661,0.12940634115056682 -Sb5O7_174_15844.vasp,Sb5O7,-3.9395558674999998,0.2631033945833317 -Mn1Ge1S2I2_6_10743.vasp,MnGeS2I2,-1.9274744366666667,0.3623605304166666 -Cd1H4C6F2_10_3355.vasp,CdH4C6F2,-4.635431818461539,0.48442237999999116 -K1Sn1Se2_156_8941.vasp,KSnSe2,-1.421380305,0.21969813125000032 -Ca3Ni2S5Cl2_123_3195.vasp,Ca3Ni2S5Cl2,-2.1915905375,0.05100267234374527 -Mg1Sb4O8_1_10401.vasp,MgSb4O8,-4.168082882307693,0.22455453846153395 -Ir1Rh1S2I2_25_8751.vasp,IrRhS2I2,-2.0775819983333332,0.08395092277777261 -Fe2Se4F2_11_5984.vasp,Fe2Se4F2,-1.7890474325,0.3544602863888866 -Sc2Te2I2_59_16176.vasp,Sc2Te2I2,-2.37048287,0.059345532222220054 -V2Te4_127_20219.vasp,V2Te4,-1.5277739933333334,0.8394670644444442 -Sn2C4Cl4_51_16756.vasp,Sn2C4Cl4,-3.5913906140000003,0.6023355250000001 -Hf2Ag2_129_7425.vasp,Hf2Ag2,-2.3189637375,0.21895574750000035 -Ag2F4_14_259.vasp,Ag2F4,-0.6539482966666667,0.18148820499999996 -Fe1C2N4Cl2F4_47_5642.vasp,FeC2N4Cl2F4,-3.2566314653846153,0.6476689157171351 -Ga2Si2S2_164_6488.vasp,Ga2Si2S2,-3.2734463050000002,-0.3729122916666697 -K2Cd4S2Br6O6_31_9046.vasp,K2Cd4S2Br6O6,-1.8296536060000002,0.11072207409374997 -Ca2Co4Te6Cl4O16_4_2991.vasp,Ca2Co4Te6Cl4O16,-3.412000776875,-0.08246319437500006 -Ta3Cl8_156_17955.vasp,Ta3Cl8,-3.3642162800000004,0.1305849554545372 -Ti4H2C3O2_164_19135.vasp,Ti4H2C3O2,-6.853484491818182,-0.11656829929293444 -Zn2Se2_129_21166.vasp,Zn2Se2,-0.4505694575,0.24943389625 -Cr2Si2Se6_162_4509.vasp,Cr2Si2Se6,-2.780868404,0.22272482773863 -Ag1N1O2_25_87.vasp,AgNO2,-3.2157173225,0.10561314395833088 -Na2H4N2_67_12111.vasp,Na2H4N2,-3.78154758375,0.059086350624999895 -Cd2P2O6_147_3526.vasp,Cd2P2O6,-3.8798783460000004,0.3072031113928526 -Al13Sb2_1_587.vasp,Al13Sb2,-2.14121353,0.0494078843333316 -Te2Ir2_187_18397.vasp,Te2Ir2,-2.0686514725,1.0667800225000001 -Ni1Te2_115_13437.vasp,NiTe2,-0.4931626333333334,0.2463292866666666 -Cd4Mo2O8_13_3633.vasp,Cd4Mo2O8,-3.02031322,0.0855457464285716 -Au4S2_4_1581.vasp,Au4S2,-0.212048745,0.113744665 -Hg8C4N8Cl8_14_8105.vasp,Hg8C4N8Cl8,-2.337349670357143,0.14860685666666296 -Mn6Br1Cl1O8_1_11465.vasp,Mn6BrClO8,-3.870681185,-0.041275886927085725 -Rb2C6S6F6_1_14802.vasp,Rb2C6S6F6,-3.7170117475,0.21012556281250017 -Sc1Ge1I1Cl1O2_1_15936.vasp,ScGeIClO2,-3.739183346666667,0.2927282481712885 -Hf2F6_162_7490.vasp,Hf2F6,-4.398593575,0.5989263984375001 -Nb3Se5Br2_1_13016.vasp,Nb3Se5Br2,-3.450535034,0.2708819239062479 -Nb2Pd4Se4_51_12819.vasp,Nb2Pd4Se4,-2.717580813,0.205861130552626 -Sr1I1Br1_8_17057.vasp,SrIBr,-1.5191298700000002,0.04547631777777761 -Mg1Al2Te4_164_10336.vasp,MgAl2Te4,-1.9893763857142857,0.08178639857142866 -Co2Sb2Se4I2_10_4005.vasp,Co2Sb2Se4I2,-1.626219169,0.35016627399999983 -Pt2Se2_123_14685.vasp,Pt2Se2,-1.8379132725,0.3373877799999998 -Al2Cl6_2_797.vasp,Al2Cl6,-2.13226505,0.1522447037500001 -Si2P2_187_16427.vasp,Si2P2,-4.29140785,0.10513380916666648 -Si2Cl6_1_16398.vasp,Si2Cl6,-2.0672469725,0.18172911437499997 -Nb8C4Br1Cl7_6_13205.vasp,Nb8C4BrCl7,-5.175237919,0.028166394277343965 -Ba8Sn4Se20_14_2207.vasp,Ba8Sn4Se20,-2.349974689375,0.23969622468749963 -Nb2Co4Te2Se2_51_12701.vasp,Nb2Co4Te2Se2,-2.954622269,-0.29876141220833796 -K4Cu4O4_123_9443.vasp,K4Cu4O4,-1.2523457191666667,0.7773643783333317 -Ta3B2H2_187_17941.vasp,Ta3B2H2,-6.165689085714286,0.3663141778571375 -Fe2Sb2S4Br2_26_5953.vasp,Fe2Sb2S4Br2,-2.1467189170000003,-0.3876229312000018 -Ba2Cu1S2Br2_38_1966.vasp,Ba2CuS2Br2,-2.205879844285714,0.10218406257440044 -Sc1F2_115_15933.vasp,ScF2,-3.5369308566666664,0.30993864388888603 -Pt2S2O6_11_14657.vasp,Pt2S2O6,-3.600607266,0.36908731099999653 -Sc1P2_21_15976.vasp,ScP2,-3.4151281499999997,0.6933665316666633 -Cu1Sb1Se2I2_1_4967.vasp,CuSbSe2I2,-0.8598333916666667,0.2079691075462953 -Tm1Cl2_164_19662.vasp,TmCl2,-2.6399351799999997,0.1929072083333311 -Ca1Bi4O8_6_2809.vasp,CaBi4O8,-3.6756820192307695,0.2633392978846112 -Na1Ga1P2S6_5_11864.vasp,NaGaP2S6,-3.0621960340000003,-0.036768130446434955 -Sc3S2N2F2_187_16218.vasp,Sc3S2N2F2,-4.321353421111111,0.5518561471296259 -Zr1Bi1S1I2_1_21255.vasp,ZrBiSI2,-1.944357724,0.33318343455555266 -Mn8Sn2S8_47_11478.vasp,Mn8Sn2S8,-2.1077884399999998,0.7503397122222168 -Ca2Sn4F12_2_3129.vasp,Ca2Sn4F12,-3.0182069255555555,0.0538952638888861 -Hg2I2O2_59_7971.vasp,Hg2I2O2,-0.12973147833333334,0.3208446985185189 -Na2N2O4_11_12217.vasp,Na2N2O4,-4.24472411125,0.1919931362499998 -V4O10_12_20339.vasp,V4O10,-5.534102542857143,-0.07552396071428635 -Fe2Te2_164_6006.vasp,Fe2Te2,-0.757314985,1.0088412662499997 -Zr1Te1N1Cl1_8_21460.vasp,ZrTeNCl,-4.138371485,0.5312687791666659 -B1W2S2_164_1643.vasp,BW2S2,-5.160640646,0.12033274900000057 -Li2Bi2Pd2_12_9843.vasp,Li2Bi2Pd2,-1.4721181166666666,-0.08292012166666918 -Ni2Sb2S5_8_13611.vasp,Ni2Sb2S5,-1.9548254944444443,0.24530952909090709 -K2I2Cl8_127_9203.vasp,K2I2Cl8,-0.6092294066666667,0.04470561458333333 -Ta2Co2S6_11_17701.vasp,Ta2Co2S6,-4.179622114,0.16901156041666443 -Cd1Sb1S2_25_3420.vasp,CdSbS2,-1.355315575,0.3740190033333307 -Fe1F2_164_5676.vasp,FeF2,-2.6268512866666667,0.09093404999999999 -Mg1Sb3_25_10400.vasp,MgSb3,-1.5294926775,0.29523088281249854 -Bi1Cl2_187_2327.vasp,BiCl2,-1.1057432466666668,0.20416960611110985 -I6N2_31_8166.vasp,I6N2,-0.6476940875,0.4497903420312501 -V2Ag1O6_12_19967.vasp,V2AgO6,-4.501023728888889,0.21356913520832518 -Bi1P2Au1Se6_143_2355.vasp,BiP2AuSe6,-2.097595578,0.08570915283332972 -Cd1H8C10I2N2_47_3361.vasp,CdH8C10I2N2,-5.173198005652174,0.1772960126449201 -Mo8S24_14_11766.vasp,Mo8S24,-3.252812500625,0.22624766296874999 -Sc1Sb2Au1Se6_149_15994.vasp,ScSb2AuSe6,-2.067478689,0.35071348116666423 -V3Cl8_156_20255.vasp,V3Cl8,-2.2569337945454544,0.006705058181816104 -Yb2S2I2_59_20884.vasp,Yb2S2I2,-3.2511644316666666,-0.9163567023263917 -Al1As2Au1Se6_149_609.vasp,AlAs2AuSe6,-2.0728051919999997,0.2189869966666647 -Ga2Bi2_129_6306.vasp,Ga2Bi2,-1.32820044,-0.5473169525000001 -Ga2Te2S8F2_11_6508.vasp,Ga2Te2S8F2,-2.113045722142857,0.49458313663690046 -Hg1H1S1I1_156_7865.vasp,HgHSI,-0.8051378775,0.15530920364583323 -Ir5Pd1Se1S7I6_1_8869.vasp,Ir5PdSeS7I6,-1.9984298765,-0.006925756843752896 -Sc1Te2_187_16017.vasp,ScTe2,-2.39339069,0.434971185277776 -Sn2Se2Br2_59_16876.vasp,Sn2Se2Br2,-1.4762440716666667,0.18028779416666663 -Ir1C3_156_8730.vasp,IrC3,-5.8691292975,1.5209194849999998 -Sr2Bi1_164_17141.vasp,Sr2Bi,-0.35787093999999997,0.6054649855555546 -W1Au1Cl3O2_1_20408.vasp,WAuCl3O2,-2.7744202014285717,0.13895758964285632 -Sb2W2_12_15752.vasp,Sb2W2,-3.8858034375,0.7647336837500003 -Bi4Pd2_2_2635.vasp,Bi4Pd2,-1.2212428083333333,-0.46766509833333325 -Pt2Se2O6_12_14678.vasp,Pt2Se2O6,-3.2528371810000003,0.10720852458332719 -Pd4I1Br3O4_1_14519.vasp,Pd4IBr3O4,-1.5240590108333334,0.2264309018055518 -Nb2Te2C1_164_12905.vasp,Nb2Te2C,-5.1605516819999995,0.039023295999999874 -Yb2Br6_147_20864.vasp,Yb2Br6,-2.304470055,-0.6211954624999998 -Hf4N4F16_2_7798.vasp,Hf4N4F16,-4.2017370325,0.8269195137499954 -Nd2Bi2S4O2_129_13232.vasp,Nd2Bi2S4O2,-4.184787558,0.0053415459999959225 -K2Zr1O6F6_1_9398.vasp,K2ZrO6F6,-2.5087195166666665,0.9978323198333339 -Ta1Ni1C1I2_6_17585.vasp,TaNiCI2,-2.727656794,0.44314352009998814 -Ir2S2I1Br1_6_8818.vasp,Ir2S2IBr,-2.3685077983333334,0.07290409361110806 -Se4Br4_2_16297.vasp,Se4Br4,-0.96260727375,0.08263260625000002 -Cr1H4C4O6F1_2_4189.vasp,CrH4C4O6F,-5.213150055,0.132740866979162 -Ga2H2Se2O8_11_6378.vasp,Ga2H2Se2O8,-4.0970998114285715,0.10770998035714285 -Na2S4Br2_113_12288.vasp,Na2S4Br2,-1.28762306,0.5400986621875 -Sn1C1_156_16623.vasp,SnC,-3.27640952,-0.5219585575000001 -Bi2Sb1Se2S1I2_1_2522.vasp,Bi2SbSe2SI2,-1.56985217125,0.151723491354163 -Au2F6_162_1483.vasp,Au2F6,-0.39980244,0.31239956833333327 -Ta1Te2_164_17629.vasp,TaTe2,-3.630114553333333,0.11776881555555585 -Li2Co1_187_9860.vasp,Li2Co,-1.0849162766666667,0.4751085711111098 -Cs3Mo2I9_187_4799.vasp,Cs3Mo2I9,-0.5775495521428571,0.2824590473214271 -Nb4Ni8Se8_51_13110.vasp,Nb4Ni8Se8,-2.2068069935,0.027205098021736873 -Ca2Mn2As4H12O20_2_3064.vasp,Ca2Mn2As4H12O20,-4.3881129542499995,0.22367087733333424 -Ni2Cl2_129_13494.vasp,Ni2Cl2,0.2739039275,0.8510254225 -Mg2W2F8_2_10534.vasp,Mg2W2F8,-2.970754125833333,0.7015374037499964 -Na2C2S8F8_2_12004.vasp,Na2C2S8F8,-2.671730831,0.2610415009999918 -Ga1Sn3Br2Cl2O4_1_6286.vasp,GaSn3Br2Cl2O4,-2.7757102766666666,0.15461489031249775 -Ir3Rh1O8_156_8857.vasp,Ir3RhO8,-3.9405192175,0.466866435 -Hf1H2Pd2O6_1_7191.vasp,HfH2Pd2O6,-4.289185092727273,0.37756986598483877 -Sb1H1Se2S6_1_15456.vasp,SbHSe2S6,-2.36798585,0.26218566769791174 -Tc2Te2_129_18238.vasp,Tc2Te2,-4.53550887,0.43788966687499986 -Nb4Te4I12_13_13172.vasp,Nb4Te4I12,-1.6694924060000003,0.05482006099999981 -Ir2S2Br2_59_8813.vasp,Ir2S2Br2,-2.4828654416666667,0.049535011666666406 -Hf1Mn3S4Br4_3_7230.vasp,HfMn3S4Br4,-2.630801798333333,0.21118413312499706 -Li4Ge6Te12_2_10193.vasp,Li4Ge6Te12,-2.0352031740909093,-1.119007029242426 -Nb4Fe2S10_59_13069.vasp,Nb4Fe2S10,-4.1286403775,0.124441619687498 -Na2Ir1_187_12186.vasp,Na2Ir,-0.78458873,1.1679867299999986 -Cu1S1Br1Cl1_1_4953.vasp,CuSBrCl,-0.728403895,0.2241897582812485 -K2B2H8O8_2_8993.vasp,K2B2H8O8,-4.6366164255,0.08297684638888969 -Na2Cl2O6_11_12054.vasp,Na2Cl2O6,-2.676328335,-0.10897259724999975 -Ir2Se2Br2_59_8834.vasp,Ir2Se2Br2,-2.14548792,-0.10883871652778088 -Ag1Pt1Se2_1_106.vasp,AgPtSe2,-0.88707187,0.6197688474999998 -Pt1Se2_187_14595.vasp,PtSe2,-1.72980289,0.5204423549999999 -Mo2I4O4_51_11625.vasp,Mo2I4O4,-2.902528025,0.13210665475000027 -Tl2Sb2O6_143_19517.vasp,Tl2Sb2O6,-3.010251681,0.7843103519999994 -Yb2P4H14C4O16_2_20881.vasp,Yb2P4H14C4O16,-5.2852273345,-8.800850000889593e-05 -Ag1Bi1Te6As2_143_28.vasp,AgBiTe6As2,-1.349727764,0.24896420141666498 -Zr1S2_115_21415.vasp,ZrS2,-4.285971346666667,0.512899220833333 -Al2V1Te4_164_1033.vasp,Al2VTe4,-2.152966887142857,0.22230892385203554 -Ag2S4F2_4_390.vasp,Ag2S4F2,-1.50272734375,0.12727672722656247 -In8Te8Cl8_14_8723.vasp,In8Te8Cl8,-1.34368695375,-0.61143122375 -Cu1Pb4S2O14_2_4939.vasp,CuPb4S2O14,-3.5727586957142856,0.30503114630951833 -Cr2I6_162_4415.vasp,Cr2I6,-0.6073660775,0.047246269999999924 -Li6H2Se2O8_11_10267.vasp,Li6H2Se2O8,-4.160679158888889,0.036927521111111083 -Zr2Nb2Se1S3Cl2_1_21614.vasp,Zr2Nb2SeS3Cl2,-4.310500231000001,-0.1814046527750064 -Al2As2_129_764.vasp,Al2As2,-3.0217824475,-0.7083569475 -Ca2Au1Se2Cl2_38_2939.vasp,Ca2AuSe2Cl2,-1.56163257,0.2742508228571394 -Au2Cl4_11_1473.vasp,Au2Cl4,0.05303763833333333,0.11119688999999999 -Sn4Te4As4_17_16972.vasp,Sn4Te4As4,-1.8908736508333333,-0.7966601441666676 -Ga1Cu1S4_10_6171.vasp,GaCuS4,-1.8717919666666667,0.5277193364583314 -Cr2S2Cl2_59_4463.vasp,Cr2S2Cl2,-2.66318054,-0.1262528399999998 -Fe1Sb2S4_164_5750.vasp,FeSb2S4,-2.653111238571429,-0.13855313942857372 -Ce2Zn2P2O2_164_3685.vasp,Ce2Zn2P2O2,-3.67519897125,0.14605931750000023 -Ca2Si2Ni2_129_3123.vasp,Ca2Si2Ni2,-1.419652695,0.18862466833333347 -Ba4Ge4Se10_31_2156.vasp,Ba4Ge4Se10,-2.7111859377777776,0.22971151277777757 -Li6Sb4P6O24_147_10274.vasp,Li6Sb4P6O24,-5.0641373110000005,0.1361311074999949 -Fe1Se2_187_5757.vasp,FeSe2,-1.5750587633333335,0.7267999949999997 -Au2Se4Br2_4_1553.vasp,Au2Se4Br2,-0.70158566125,0.22221906052083334 -Li2B2_51_9839.vasp,Li2B2,-2.89526781,1.1104048475 -Na2Cd4Se2Br6O6_31_12036.vasp,Na2Cd4Se2Br6O6,-1.6214652995,0.19240486937500006 -In2Te2F2_31_8619.vasp,In2Te2F2,-1.7720677516666665,0.15706578277777616 -Ni2W2O8F2_129_13686.vasp,Ni2W2O8F2,-4.055952056428572,0.06803260616070839 -Cd2Cu2Te2F2_26_3499.vasp,Cd2Cu2Te2F2,-0.2974128925,0.07810060281250003 -Cl1_123_3690.vasp,Cl,0.28679486,0.49007004249999997 -Fe2B1H2_164_5799.vasp,Fe2BH2,-2.591618192,0.7320845620000005 -Na2Os2C2S4Cl8_7_12247.vasp,Na2Os2C2S4Cl8,-2.491586057777778,0.38591335452380227 -C2Cl2_164_2743.vasp,C2Cl2,-3.4623002075,0.7535764837499999 -Y4H2C3S2_164_20822.vasp,Y4H2C3S2,-5.264860399090909,0.5977527636363518 -Sr2Sb1_164_17308.vasp,Sr2Sb,-0.80130189,0.5912061922222209 -Mo1Cl2_164_11506.vasp,MoCl2,-1.8978177033333334,0.4000185044444444 -K2Cl2O8_31_9079.vasp,K2Cl2O8,-2.5526773241666665,0.12865464750000033 -K8Eu2P4S16_49_9550.vasp,K8Eu2P4S16,-2.753807606666667,0.12602132033333024 -Br6N2_162_2712.vasp,Br6N2,-0.612485175,0.7661036631250001 -Cr1Cu1P2Se6_5_4151.vasp,CrCuP2Se6,-2.372253698,0.08855085480833341 -Cu1W2S1Br4_1_5003.vasp,CuW2SBr4,-1.67919141375,0.7085011721874996 -Cr1S2F1_156_4245.vasp,CrS2F,-2.6856424225,0.4978883703124975 -Ca2As4O12_2_2925.vasp,Ca2As4O12,-4.432504358888888,0.28239408666666765 -Pt2F4_14_14621.vasp,Pt2F4,-1.4304140516666666,0.38718688083333075 -Mn2Br2O3_8_11031.vasp,Mn2Br2O3,-3.0697302785714284,0.06368253029761445 -Ag2Cl2_67_248.vasp,Ag2Cl2,-0.0047727175,0.12454621000000002 -Mn3N2F2_156_11396.vasp,Mn3N2F2,-3.8233694514285714,0.5310579771428534 -Hf2C2I2_59_7470.vasp,Hf2C2I2,-4.823704723333333,0.6108837395833301 -Cr1B4H4Cl1O6_1_4116.vasp,CrB4H4ClO6,-4.818605060625,0.7261586437152738 -Ag2H6Br2N2_11_283.vasp,Ag2H6Br2N2,-3.003573600833333,-0.0955497140625027 -Al1F1_99_652.vasp,AlF,-2.54036174,0.9307514416666636 -Mn1Al2S4_156_10628.vasp,MnAl2S4,-3.395377974285714,-0.03574337571428554 -In2F2_129_8422.vasp,In2F2,-2.0463437525,0.3849962008333314 -K2Mg1H4Se2S8_2_9219.vasp,K2MgH4Se2S8,-2.4643015488235296,0.08768733245097571 -Si1Sb1Te4_1_16362.vasp,SiSbTe4,-1.7344408783333334,0.3353088044444428 -Zr1V1Ga1I1Br1O2_1_21485.vasp,ZrVGaIBrO2,-3.681610797142857,0.9138775303759337 -B2Sb2H6Pb2O6_7_1705.vasp,B2Sb2H6Pb2O6,-3.7625263672222227,0.7150625105555504 -Y2C2I2_12_20715.vasp,Y2C2I2,-4.86452612,0.03841126666666739 -Hf1Zn1Cl2O2_6_7369.vasp,HfZnCl2O2,-4.011972205,0.18185705489583315 -Na2Os2C2S4Br8_13_12246.vasp,Na2Os2C2S4Br8,-2.259697418888889,0.2783407106249939 -Be2F4_51_2255.vasp,Be2F4,-3.7971185199999997,0.5092089500000005 -Li1Br1_123_9665.vasp,LiBr,-2.112294285,0.23024339500000002 -V2Ni1Se4_164_20116.vasp,V2NiSe4,-2.53654329,0.11129868482142602 -Sc1Au1Br1Cl1O2_1_15901.vasp,ScAuBrClO2,-2.658039496666667,0.3580755287152728 -Ta3Se1Br7_156_17988.vasp,Ta3SeBr7,-3.0634656527272726,0.050725992684656274 -Hf3C2Cl2_187_7692.vasp,Hf3C2Cl2,-6.176280247142857,0.022609261904755762 -Cr2F8_14_4384.vasp,Cr2F8,-2.8992944560000002,-0.12767426800000026 -Co1B6C2I2F4_6_3705.vasp,CoB6C2I2F4,-3.907443358,0.5623112023888819 -Mn1Cu1S3Br2_1_10690.vasp,MnCuS3Br2,-1.4924717357142858,0.21881660630356922 -Nb1F2_115_12504.vasp,NbF2,-3.9984078733333335,0.6517145833333282 -Hf1Mn1I3Br1_1_7217.vasp,HfMnI3Br,-1.6388406016666668,0.37245602816810114 -Li2Mg1Te2S8F4_2_9979.vasp,Li2MgTe2S8F4,-2.6258081994117646,0.08562083490195538 -Hf3B2O2_187_7682.vasp,Hf3B2O2,-6.741962457142857,0.18821540038959794 -Cr2P2Se6_12_4453.vasp,Cr2P2Se6,-2.79525244,0.09221312687499728 -Nb1I1F1_156_12520.vasp,NbIF,-2.7621353466666663,0.744077449166664 -V1Ag1Br2N1_1_19749.vasp,VAgBr2N,-2.207857502,0.23960611762499995 -Ta4S12Br2_2_18096.vasp,Ta4S12Br2,-4.085813489444444,0.1845363162239524 -Al1Fe5Br2_123_657.vasp,AlFe5Br2,-0.69660131125,1.1362189349999987 -Ta6Ge2Te12_26_18145.vasp,Ta6Ge2Te12,-3.6692478835,-0.07885528900000338 -Cd2Ge1O4_21_3507.vasp,Cd2GeO4,-2.4656332542857142,0.6079226942857114 -La2Pb1_164_9608.vasp,La2Pb,-1.7391256566666666,0.9126612645833312 -Cr2Bi2_12_4327.vasp,Cr2Bi2,-1.6433088025,1.19061653 -Nb2Sn2Bi2_129_12895.vasp,Nb2Sn2Bi2,-2.6306927316666666,0.24649591133332627 -Na4P4S12_11_12403.vasp,Na4P4S12,-2.9651310895000003,0.08509704949999986 -Te2Rh2_123_18507.vasp,Te2Rh2,-1.893424875,0.32992316708333114 -Li1Bi1P4O12_1_9662.vasp,LiBiP4O12,-5.216365998888889,0.17451072238888488 -Ir1O2_187_8744.vasp,IrO2,-3.18605464,1.4582873833333334 -Ni2P1S4I1_1_13555.vasp,Ni2PS4I,-1.6699796975,0.27499580642045235 -K2B10O16_32_8979.vasp,K2B10O16,-6.2613466807142855,0.17653322223214296 -Al2V1S4_164_1031.vasp,Al2VS4,-3.6410687914285718,0.07425890223213893 -Fe2W2S8Br2_129_6035.vasp,Fe2W2S8Br2,-2.5473812285714286,0.22823958185267323 -Ta2Tl2Cu4S8_28_17931.vasp,Ta2Tl2Cu4S8,-2.662894885625,0.148316178541664 -Th1I2_187_18719.vasp,ThI2,-2.39559112,0.08713371166666661 -Nb4Zn4W2O16_2_13186.vasp,Nb4Zn4W2O16,-5.176682641538462,0.1909068593014089 -Sr3Fe2Cl2O5_123_17375.vasp,Sr3Fe2Cl2O5,-3.6284595875,0.05127706499999629 -Hf4S4F4_31_7808.vasp,Hf4S4F4,-4.845142551666666,0.3779708649999902 -Na2Ni2P2_129_12238.vasp,Na2Ni2P2,-1.5583521333333332,0.18376374135185064 -V2Zn2O7_10_20235.vasp,V2Zn2O7,-4.076249520909091,0.31727740136363636 -B1P1_187_1631.vasp,BP,-5.008418045,-1.15762697 -Mn2Bi2Te4Br2_10_11021.vasp,Mn2Bi2Te4Br2,-1.3109979470000002,0.22672677538792885 -Cr4H2N3_164_4604.vasp,Cr4H2N3,-4.623607956666667,-1.2129502506790153 -Fe1Ag1Se1S1Br2_1_5616.vasp,FeAgSeSBr2,-0.9884067183333333,-0.005986683240741763 -Na2H2Se2_4_12106.vasp,Na2H2Se2,-2.323055361666667,0.08846527833333306 -I4O10_4_8161.vasp,I4O10,-2.3921405428571427,0.1619736185714289 -V1Cl2_187_19800.vasp,VCl2,-2.2115215966666666,0.1360087499999998 -In6S6_2_8710.vasp,In6S6,-2.1708343891666666,0.10883577583333359 -Re2I2_129_15050.vasp,Re2I2,-2.45624258,1.2280616797222192 -Ti2O2_187_18976.vasp,Ti2O2,-6.84366414,0.3935530233333342 -Zr2H2N1_164_21580.vasp,Zr2H2N,-5.1795471399999995,0.059005276000000606 -Rb1Ge1Se2_156_14734.vasp,RbGeSe2,-1.7316307125,0.4109154209375001 -Nb4Si1Te3Mo1Cl1_1_13154.vasp,Nb4SiTe3MoCl,-3.9328569559999997,0.28311538479505627 -Zn1F2_164_20923.vasp,ZnF2,-1.4819265233333334,0.11478565416666653 -Na4B4Se14_13_12368.vasp,Na4B4Se14,-2.679230965909091,0.1314107013636363 -Zr2Br4_11_21526.vasp,Zr2Br4,-2.5830260766666666,0.07168609666666681 -Zn1Br1Cl1_156_20902.vasp,ZnBrCl,-0.28553399333333335,0.11091805927083331 -Ge1Bi1S2I2_1_6645.vasp,GeBiS2I2,-1.7314901683333332,-0.0018916036979212958 -Sn3Rh1_187_16924.vasp,Sn3Rh,-1.02058247,1.0749460750000002 -K4Ta6Cl18_12_9519.vasp,K4Ta6Cl18,-3.0330923807142858,0.06319775214285706 -Li1Au1C4S4O12F12_2_9656.vasp,LiAuC4S4O12F12,-3.713031918529412,0.24938759858454734 -Nb2I1Cl1O3_8_12741.vasp,Nb2IClO3,-5.0416104128571435,0.22342879053570508 -Al2H2Se2O8_11_864.vasp,Al2H2Se2O8,-4.643419345714285,-0.45347026571428883 -K2Te1I2O12_147_9363.vasp,K2TeI2O12,-2.441046895294118,0.5937053748345554 -Ca4Mn2Br2O6_129_3221.vasp,Ca4Mn2Br2O6,-3.9836448064285714,-0.19327127339286054 -Te2Pt2O6_12_18486.vasp,Te2Pt2O6,-3.241312496,0.1957660744999977 -Cd1Ni1H12C14N8_10_3380.vasp,CdNiH12C14N8,-5.5778899200000005,-1.8560133975463007 -Zr2Nb2Se3I2O3_1_21615.vasp,Zr2Nb2Se3I2O3,-4.493123135,0.13899650788194107 -Ta2Br2O4_11_17666.vasp,Ta2Br2O4,-5.86056451875,-0.10780575708333817 -Cu2I2_129_5171.vasp,Cu2I2,0.23114209,0.16409882999999958 -Zr3Nb1Se8_10_21777.vasp,Zr3NbSe8,-4.0049020099999995,0.12667987250000046 -Na2V2Au4S12_1_12331.vasp,Na2V2Au4S12,-1.9703498050000001,0.33777749331249907 -P2S2_8_14045.vasp,P2S2,-3.0075024775,0.5062728046484377 -Hf2C2I2_164_7468.vasp,Hf2C2I2,-4.816810696666667,0.6177777662499963 -In1Sb2Te6Au1_149_8338.vasp,InSb2Te6Au,-1.1009963,0.21506085991666568 -Sb2Pb2C2S6F6_7_15638.vasp,Sb2Pb2C2S6F6,-2.7870009472222224,0.5726910159722187 -Al6Te6I2_11_1108.vasp,Al6Te6I2,-1.9929813742857143,0.05378468535714287 -Ag2H8C12N6O6_2_288.vasp,Ag2H8C12N6O6,-5.667834532941177,0.23717696422792592 -Sr2Nd2Cu2Cl2O6_129_17285.vasp,Sr2Nd2Cu2Cl2O6,-4.074081729285714,0.1108283047618982 -Mn2O2_164_11176.vasp,Mn2O2,-3.87605143,0.33459493284482766 -Th2Se6_11_18727.vasp,Th2Se6,-4.0101425225,0.058256834999999896 -Mn1Cu1Te2Se1_1_10696.vasp,MnCuTe2Se,-1.118115662,0.35002960583333187 -Mn3V3Te2O16_1_11419.vasp,Mn3V3Te2O16,-4.7338093925,0.057442680572910354 -K2Na4P6H14N6O16_1_9252.vasp,K2Na4P6H14N6O16,-4.782893381458334,0.13015685013887968 -Ta2I6_189_17767.vasp,Ta2I6,-1.76550049,0.3279978414843754 -Ru3S4_164_15369.vasp,Ru3S4,-3.4570689142857143,0.24098924785713915 -Sr2Tl1Cu1Hg1O5_99_17337.vasp,Sr2TlCuHgO5,-2.622717282,0.26572226912499286 -Ta2Br4_11_17670.vasp,Ta2Br4,-3.011605981666667,0.39801823476189807 -Ga2Br6_162_6312.vasp,Ga2Br6,-1.08359064375,0.07050280624999994 -Sr2Tl1Cd1Cu1S5_99_17336.vasp,Sr2TlCdCuS5,-1.7117555379999998,0.2209147231093752 -Ag2C2N2O2_129_216.vasp,Ag2C2N2O2,-3.95345857125,0.6445017973958267 -Al2Se5_12_978.vasp,Al2Se5,-2.6336557085714287,0.13478729952380752 -Ag2H4C4S8_2_277.vasp,Ag2H4C4S8,-3.3543900022222224,0.3453298919791554 -Zr4N3O2_164_21832.vasp,Zr4N3O2,-7.190035718888889,-0.1294821577777836 -Zr1I1Cl1_156_21308.vasp,ZrICl,-2.35309809,0.2506861208333333 -Ta4Se12Cl2_2_18107.vasp,Ta4Se12Cl2,-3.574715833888889,0.1874130157222158 -B2H6O6_175_1673.vasp,B2H6O6,-5.209359007142857,0.031576236785713974 -In1S1_156_8327.vasp,InS,-1.62388206,0.6557881050000003 -Hf2C2Cl2_164_7464.vasp,Hf2C2Cl2,-5.336845960000001,0.6612714181249946 -Si1As1S1O7_1_16315.vasp,SiAsSO7,-4.683705411,0.2785669418124874 -As2Pb2O6_7_1257.vasp,As2Pb2O6,-3.819950344,0.3454749105000001 -Os1Pb2_123_13811.vasp,OsPb2,-1.7929659100000002,1.0553074733333307 -Bi2Cl2_129_2446.vasp,Bi2Cl2,-0.8640004825,0.23515115583333232 -Mn1Ge1Br1N2Cl1_8_10732.vasp,MnGeBrN2Cl,-3.395972328333333,0.048871429097217645 -Li1Ga1As2S6_5_9705.vasp,LiGaAs2S6,-2.815621877,0.49274167118749745 -Tl3Os2_123_19578.vasp,Tl3Os2,-1.070017934,1.157970478 -Ni2H2S4_11_13512.vasp,Ni2H2S4,-2.22314542,0.04427815507812276 -Al2Ge2S6_162_848.vasp,Al2Ge2S6,-3.356594638,-0.08946277806250258 -Te3As4Au2Br2_6_18543.vasp,Te3As4Au2Br2,-1.2457231336363637,0.31268300303029994 -In2Sb2Te6_147_8568.vasp,In2Sb2Te6,-1.348571822,0.26426583299999995 -Y1Cu1Cl4_1_20626.vasp,YCuCl4,-2.35007207,0.16583740333333014 -Sn2Se2O8_31_16880.vasp,Sn2Se2O8,-3.4724229875,0.5140795716666666 -Au2S1_191_1510.vasp,Au2S,0.08413512000000001,0.40992853 -Na2Cd4Br6O8_31_12021.vasp,Na2Cd4Br6O8,-1.3760604355,0.2649917834166652 -As1Se2_164_1181.vasp,AsSe2,-2.2976975200000003,0.2586547513888864 -In1Ge2H1S6_1_8268.vasp,InGe2HS6,-2.857930771,0.15252063625000017 -K4La4P8S24_14_9469.vasp,K4La4P8S24,-3.54472826625,0.055078488249999946 -Ca2I2Cl2_129_3051.vasp,Ca2I2Cl2,-1.7153394316666668,0.043337019166666546 -Cr1Se1S1_156_4262.vasp,CrSeS,-2.9454909399999996,0.26886912833333376 -Fe1I1Br1_156_5714.vasp,FeIBr,-0.8119843233333334,-0.3835820004166667 -Mg2Bi1_164_10428.vasp,Mg2Bi,-0.14281072333333333,0.5132552536111112 -K4Ce4P8S24_14_9430.vasp,K4Ce4P8S24,-3.50292762775,0.054543005249999776 -Al1Cu1Sb2Te6_149_647.vasp,AlCuSb2Te6,-1.358479683,0.11169730666666494 -Ta1Ni1Te4_6_17591.vasp,TaNiTe4,-2.1233086033333333,0.20092359833333107 -Cr2Br2O2_59_4332.vasp,Cr2Br2O2,-3.3909110466666665,-0.10248691722222558 -Tl4Si2Se6_2_19630.vasp,Tl4Si2Se6,-2.0431981041666667,0.12704516249999998 -Th2I2N2_129_18725.vasp,Th2I2N2,-5.657166733333334,0.06261065666666621 -Sn2Sb1Te6_162_16851.vasp,Sn2SbTe6,-1.3816785722222222,-0.4163296281481508 -Ti4P1S5I1Cl2_8_19153.vasp,Ti4PS5ICl2,-4.35047208,-0.0899032794230849 -Tl1Ga1Hg1O4_156_19271.vasp,TlGaHgO4,-2.5163050357142858,0.25584782827380453 -Sn2Ru1_123_16831.vasp,Sn2Ru,-1.9791762533333335,0.4105292392857105 -K2Cd4Te2Cl6O6_31_9067.vasp,K2Cd4Te2Cl6O6,-1.604174023,0.2926649098750001 -Mo2P2S10_85_11656.vasp,Mo2P2S10,-3.059599774285714,0.33645155209821137 -Na4H16Cl4O8_14_12388.vasp,Na4H16Cl4O8,-3.68863501875,0.06131060411458389 -Bi1I2_187_2343.vasp,BiI2,-0.25422477,0.23298636388888844 -Ga2As6_164_6303.vasp,Ga2As6,-2.5647369625,-0.10936592000000012 -Cu2Se2_129_5303.vasp,Cu2Se2,-0.7272317825,0.18344040333333345 -Zr2Cl2_164_21550.vasp,Zr2Cl2,-3.4398385625,0.03700106750000032 -Nb4Ni1Se2S1Br5O2_1_13098.vasp,Nb4NiSe2SBr5O2,-3.5409292833333335,0.13743629087300752 -Nb2As1Se4S1I2_1_12622.vasp,Nb2AsSe4SI2,-2.956037278,0.1777582760384567 -Mn2Te2W2S12_113_11305.vasp,Mn2Te2W2S12,-2.9299003683333336,0.43764244699073745 -Ir2Se2I2_59_8840.vasp,Ir2Se2I2,-1.943002735,-0.10251724875000323 -Sc1P2Au1Se6_149_15974.vasp,ScP2AuSe6,-2.555390113,0.059267175437498154 -In2S1Br1_1_8538.vasp,In2SBr,-1.456348755,0.34491951500000007 -Y2Br2_129_20702.vasp,Y2Br2,-2.65833316,0.6923818641666628 -As4O6_1_1332.vasp,As4O6,-4.409029962,0.07620760999999998 -Cu2Se2_187_5304.vasp,Cu2Se2,-0.6671574275,0.24351475833333347 -Li2B2H8O8_2_9836.vasp,Li2B2H8O8,-4.9477031574999994,0.06902804025000009 -Cu2O2_187_5197.vasp,Cu2O2,-1.698562765,0.7742257331250001 -Mn2As2S4Br2_10_10972.vasp,Mn2As2S4Br2,-2.444546466,0.15246714187500032 -Ni2Ir2S6Br1Cl1_1_13533.vasp,Ni2Ir2S6BrCl,-2.1328029416666667,-0.09414846406250241 -Rh2Se1S1I2_6_15232.vasp,Rh2SeSI2,-1.69652377,0.16628332590277073 -Pb3Se2Cl2O6_5_14307.vasp,Pb3Se2Cl2O6,-3.1316347753846157,0.04505946730769006 -Li2C4_129_9853.vasp,Li2C4,-4.59461614,1.3836201818518457 -Li4Mn2F12_13_10199.vasp,Li4Mn2F12,-2.9363434044444445,0.15221004999999987 -K2H6C6O6_1_9144.vasp,K2H6C6O6,-5.1362120215,0.18051981618749624 -Co1I2_164_3776.vasp,CoI2,-0.37332231,0.16989612111111063 -Fe2Bi2S4I2_26_5810.vasp,Fe2Bi2S4I2,-1.757470783,-0.0005013769999998585 -Ni2As4I4O6_2_13455.vasp,Ni2As4I4O6,-2.68115754875,-0.03887565250000005 -Ho2B2C2_51_8122.vasp,Ho2B2C2,-5.50220376,0.505614639027772 -Rh2S2I2_11_15220.vasp,Rh2S2I2,-1.8725774683333334,0.13478817611110916 -Zn1Cl2_25_20917.vasp,ZnCl2,-0.26917898333333334,0.3309856381249999 -Cu2Sb4S3Cl2_6_5277.vasp,Cu2Sb4S3Cl2,-1.6875727345454548,0.191946431942147 -Cr2Cu4O12_59_4377.vasp,Cr2Cu4O12,-3.1830509888888887,0.2680011386805514 -Hf1S2I2_1_7279.vasp,HfS2I2,-2.620446856,0.4921033167500003 -Bi2O2F2_164_2480.vasp,Bi2O2F2,-3.315017585,-0.05368179833333331 -V2Cu2O8_51_20049.vasp,V2Cu2O8,-4.084396745833334,0.12866413010416267 -Sn4Sb4S10_11_16964.vasp,Sn4Sb4S10,-2.5707641005555555,0.08204550888888673 -Hf1V1I1Br1O2_6_7349.vasp,HfVIBrO2,-4.2893596,0.3168275688888884 -Li2Ti3Mo1N2O4_1_10098.vasp,Li2Ti3MoN2O4,-6.008288210833334,0.3406320048937715 -Si1H2O1_8_16339.vasp,SiH2O,-3.9127744725,1.2775913687499996 -Ga1Cu1P2O6_149_6163.vasp,GaCuP2O6,-4.452991499,0.415280242999998 -Ag1Au1Br2_5_4.vasp,AgAuBr2,0.26921477,0.07170674937499999 -Li1O2_164_9773.vasp,LiO2,-2.64406768,0.2097527416666667 -Mo1Au2O4_8_11492.vasp,MoAu2O4,-2.919803987142857,0.5692134514285674 -Ta3H2C2O2_187_17958.vasp,Ta3H2C2O2,-6.645611173333333,0.3442164933333207 -Cu2Se1I2_1_5291.vasp,Cu2SeI2,-0.12146435200000001,0.15383055399999912 -Li2O2F2_11_10032.vasp,Li2O2F2,-2.6823202816666663,0.5443620937499976 -Ag4H4Cl4O4_14_515.vasp,Ag4H4Cl4O4,-1.941220504375,0.15791363838541683 -Si2Os1_123_16422.vasp,Si2Os,-4.30901048,0.8632079258333327 -Fe2Cu1S4_187_5844.vasp,Fe2CuS4,-1.9395748914285715,-0.053122221428573146 -In1Pb1Se1Br1_156_8304.vasp,InPbSeBr,-1.346225345,0.31875760114583 -Nb2I10_1_12737.vasp,Nb2I10,-0.9418193058333334,0.24310872250000004 -Li1Sn2S2_164_9792.vasp,LiSn2S2,-2.4065618140000002,-0.2990222607499973 -Hg1H1Cl1O1_156_7859.vasp,HgHClO,-1.622216235,0.1443941313541668 -Ni2Te5P2_8_13680.vasp,Ni2Te5P2,-1.415008208888889,0.4705573937962947 -In1As2Au1S6_149_8191.vasp,InAs2AuS6,-2.241139659,0.4494025201874975 -Cu4H12C8N16_14_5407.vasp,Cu4H12C8N16,-5.31727958075,-1.887147348416673 -Ti1Cu1F6_2_18773.vasp,TiCuF6,-3.09255433375,0.06731934625000013 -Nb3Te1Br7_156_13020.vasp,Nb3TeBr7,-2.652679509090909,0.045066035454543574 -Nb2S2_129_12844.vasp,Nb2S2,-4.93908083,0.1725003734999948 -Bi2Te2_164_2567.vasp,Bi2Te2,-1.142170205,0.3776667949999999 -Cu2Sb4Te3Cl2_6_5285.vasp,Cu2Sb4Te3Cl2,-1.1760063218181818,0.6210358545454513 -Ni1Au1S1F2_8_13260.vasp,NiAuSF2,-0.774819778,0.3928231210000001 -Cu1Ag1S2I2_1_4823.vasp,CuAgS2I2,-0.49688826999999997,0.2192949549999993 -Bi4F12_14_2611.vasp,Bi4F12,-2.45765186625,0.5376539993749998 -Sb2O2F2_59_15612.vasp,Sb2O2F2,-3.365852268333333,0.31207061645833356 -In2Ge2Te2_164_8453.vasp,In2Ge2Te2,-1.9413665783333334,-0.29370202333333484 -Cr1Mo1I1Cl3O1_1_4213.vasp,CrMoICl3O,-2.2742995699999997,0.11236108547618828 -Nb2In1Te3As1S2Cl1_1_12755.vasp,Nb2InTe3AsS2Cl,-2.836844809,0.2549661244583261 -Hf2P2Se6_2_7556.vasp,Hf2P2Se6,-3.800515495,0.2637496608749963 -Sn2O2F2_59_16795.vasp,Sn2O2F2,-3.1699431616666662,0.3538060537500003 -Ba3Ni2S5I2_123_2124.vasp,Ba3Ni2S5I2,-2.1282275299999998,0.10100431717881508 -Ga4Cu2Cl16_14_6550.vasp,Ga4Cu2Cl16,-1.2444195754545453,0.07166476727272686 -Bi2_51_2586.vasp,Bi2,-0.559444775,-0.09257678000000003 -Mg2H2O3_164_10464.vasp,Mg2H2O3,-4.44953325,-0.11395194428571798 -K1Ni1H9C2O10_2_8924.vasp,KNiH9C2O10,-4.514351584782609,-0.046178427246385434 -Re1I2_187_15008.vasp,ReI2,-1207.2862566166666,-1204.9405207170369 -Cr1B4S6Cl1F4_2_4122.vasp,CrB4S6ClF4,-3.209342821875,0.6042349682682255 -Al2Si4O11_12_991.vasp,Al2Si4O11,-6.311081366470588,-0.0003297629411824765 -V2Cu2As4O12_4_20048.vasp,V2Cu2As4O12,-3.9237290639999998,0.549996384124996 -Sr2Tl1Cd1Au1S5_99_17334.vasp,Sr2TlCdAuS5,-1.5640908740000001,0.31268970468749735 -P4W2O16_31_14129.vasp,P4W2O16,-5.735294219545454,0.05608517522727219 -Ta2S2N1_164_17851.vasp,Ta2S2N,-6.542980794,0.2040207296666674 -N1F3_187_11773.vasp,NF3,-1.0008172225,1.122692825 -K2Pr2Si2Se8_4_9301.vasp,K2Pr2Si2Se8,-3.0705617264285716,0.09107085857142838 -Sc1Ta1Br2N1_156_16011.vasp,ScTaBr2N,-4.5386787239999995,0.4380751022222167 -Li2Cr1_187_9871.vasp,Li2Cr,-1.4893942500000001,1.2459917911111087 -Ni1H4C6I2N2_25_13347.vasp,NiH4C6I2N2,-4.87516409,0.2500120919999942 -Rh2S2F2_59_15218.vasp,Rh2S2F2,-2.5952529749999997,0.08630272696969277 -Rb2I2_129_14895.vasp,Rb2I2,-0.499132385,0.12037650999999994 -In8Se12_14_8718.vasp,In8Se12,-1.895473362,0.088848064 -Sn3S4_164_16927.vasp,Sn3S4,-2.461068567142857,0.06674944499999769 -V1Ge1Cl4_3_19839.vasp,VGeCl4,-2.058559403333333,0.1024401529166647 -Ni2F2_164_13502.vasp,Ni2F2,-0.3192184875,0.9794408537499999 -Ba1Ni1Sn3_99_1846.vasp,BaNiSn3,-0.563845242,0.67227251 -Mn4C3F2_164_11426.vasp,Mn4C3F2,-4.093513482222223,0.26836606444443356 -Ge1C1F2_156_6656.vasp,GeCF2,-3.6230690975,0.76453213375 -Si4O10F4_1_16496.vasp,Si4O10F4,-4.468972988888889,0.5450205133333288 -Na1Ni1P2S6_5_11914.vasp,NaNiP2S6,-2.693042931,0.13251784246874698 -Hf2H2N1_164_7505.vasp,Hf2H2N,-5.749960996,0.31477551949999993 -Ho2Cl6_59_8133.vasp,Ho2Cl6,-2.89201516375,0.0316291474999999 -Fe1Cu2I1Cl1O2_8_5672.vasp,FeCu2IClO2,-1.4544672328571429,0.38200140396428217 -Li1P3_187_9777.vasp,LiP3,-3.0011505625,0.7667420643749963 -Ge2P1O6_162_6796.vasp,Ge2PO6,-4.733501651111111,0.40138690252314024 -Cu1Sb2S3I1Br3_1_4970.vasp,CuSb2S3IBr3,-1.274173551,0.021346070270830853 -Fe2W2Cl10_12_6029.vasp,Fe2W2Cl10,-2.0305088164285716,0.13848489785713547 -V2B1H2O2_164_19988.vasp,V2BH2O2,-4.699569217142857,0.32044662142856795 -Sr2Br2F2_129_17151.vasp,Sr2Br2F2,-2.850692575,0.061446094999999534 -Na2H8S4Br2_2_12139.vasp,Na2H8S4Br2,-2.76087310125,-0.0775809756250001 -V2S2N1F2_164_20158.vasp,V2S2NF2,-3.5886187557142857,0.30876339738094494 -Te6P2Au2_2_18664.vasp,Te6P2Au2,-1.245953535,0.25134174119444264 -Nb2Pd1S6_12_12812.vasp,Nb2PdS6,-4.045526632222223,0.0953704277777776 -In2I2_129_8478.vasp,In2I2,-0.4250964375,0.5728343325 -Mg3P2H16O16_10_10554.vasp,Mg3P2H16O16,-4.668302963783784,0.00797341450449962 -Na8P4Se12_53_12452.vasp,Na8P4Se12,-2.3316415137499997,0.16034933208333335 -Tl1Cu1Te6As2_149_19259.vasp,TlCuTe6As2,-1.226320094,0.2834243330416651 -Nb2Te10Pd2_26_12898.vasp,Nb2Te10Pd2,-2.215931537142857,0.08032678285714301 -Ag1B6S2N6F4_6_20.vasp,AgB6S2N6F4,-4.919116016315789,0.5891704792488925 -Mo2W1S1Br4_6_11697.vasp,Mo2WSBr4,-2.04039691125,0.6340459918750003 -Zn1S1_156_21004.vasp,ZnS,-0.802212525,0.38944756950000003 -Tl2Se2Cl2_59_19527.vasp,Tl2Se2Cl2,-0.9510796533333333,0.43658173777777654 -Ta4Pd2Se14_11_18087.vasp,Ta4Pd2Se14,-3.5087827330000003,0.1266473503333311 -Na2Mg1H4Se2O8_2_12192.vasp,Na2MgH4Se2O8,-3.961465947647059,0.05379387974137173 -Y2S1Cl2_164_20768.vasp,Y2SCl2,-4.333703248,0.03294211000000047 -Cr2H2C1_164_4396.vasp,Cr2H2C,-3.9949244800000003,0.3910581054999952 -Cu1Ni2S4_187_4924.vasp,CuNi2S4,-1.4641552528571429,0.13135705663690134 -Sc2Se6_59_16165.vasp,Sc2Se6,-3.00300936625,0.33063326999999987 -Re4Se8_2_15117.vasp,Re4Se8,-4.1907478225,-0.028983984166666588 -Al2Zn1S4_156_1034.vasp,Al2ZnS4,-2.8478465085714286,0.062012086428571145 -B1S1_38_1635.vasp,BS,-3.70934777,1.0943370024999997 -Li2B2H6C8S2_51_9833.vasp,Li2B2H6C8S2,-4.4402652835,1.1887783211111054 -In2S2_187_8552.vasp,In2S2,-2.2183837925,0.06128637250000013 -Ti2Te2_164_19045.vasp,Ti2Te2,-3.7284268225,0.7019229928124957 -W2O6_7_20524.vasp,W2O6,-5.91736234625,-0.05332654312500029 -In2S2_129_8555.vasp,In2S2,-2.071693785,0.2079763800000003 -Mn2S6_11_11227.vasp,Mn2S6,-2.84134282625,0.33376188171875 -Te8Ru6_11_18710.vasp,Te8Ru6,-2.47168422,0.3745892407142821 -Mo8O18_1_11765.vasp,Mo8O18,-5.002837231923077,0.2657733508974316 -Mg2V4O10_59_10531.vasp,Mg2V4O10,-5.09816684625,0.2685647374999949 -Fe2Sb4S8_26_5967.vasp,Fe2Sb4S8,-2.5543464107142855,-0.03978831157143037 -Na2C4_129_12012.vasp,Na2C4,-4.065709776666666,1.4529250766666624 -Ta4Te10Pd2_59_18119.vasp,Ta4Te10Pd2,-3.10649764,0.0750672229166669 -Mn2B1H2S2_164_10994.vasp,Mn2BH2S2,-3.2628536114285716,0.4712520687499918 -Nb2N1Cl2_164_12764.vasp,Nb2NCl2,-5.074043206000001,0.037589205095224565 -Mn1Ge2C6N6_164_10754.vasp,MnGe2C6N6,-6.221363256666667,0.4550893969444377 -Ba1As2F12_2_1803.vasp,BaAs2F12,-2.801272108,-0.016150553333333484 -W2S2_164_20534.vasp,W2S2,-4.541513955,0.567311825 -K1Ge1Se2_156_8903.vasp,KGeSe2,-1.7545520775,0.36370259687499995 -Si4As4Se4_17_16484.vasp,Si4As4Se4,-3.306724050833333,-0.6499355582291662 -P2Rh2O6_162_14037.vasp,P2Rh2O6,-4.464696747,0.531163342666662 -Ca10Co2_26_2785.vasp,Ca10Co2,0.4737173983333333,1.2829965966666652 -Sr4Te4S12_14_17480.vasp,Sr4Te4S12,-2.4596495705,0.09680045858333103 -Cr2Hg2Pb4O12_2_4408.vasp,Cr2Hg2Pb4O12,-3.5120474725,0.09136248900000021 -Ca2I2N1_164_3053.vasp,Ca2I2N,-2.0712269979999998,0.3733337774999941 -Fe2Bi2S4Br2_26_5809.vasp,Fe2Bi2S4Br2,-1.9317597389999999,-0.03584609899999969 -Al1Fe1F5_47_656.vasp,AlFeF5,-2.643014292857143,0.7220859892857112 -Al2Ni2Te5_187_907.vasp,Al2Ni2Te5,-1.359878508888889,0.24377321105158245 -Ta6S18_11_18149.vasp,Ta6S18,-4.712829514166667,0.05395453083333379 -Pd1C8Br2F4_25_14354.vasp,PdC8Br2F4,-4.466442652666667,0.5406077833333265 -Tl8Te6_31_19655.vasp,Tl8Te6,-0.5201015971428571,0.35412080811688246 -Rb1Ti1S2_156_14760.vasp,RbTiS2,-3.5742504375,0.1879432762500004 -Sr2S4Br4F8_30_17301.vasp,Sr2S4Br4F8,-1.7523335933333335,0.5972619216666634 -Mo2P4_2_11661.vasp,Mo2P4,-3.5564042049999998,0.8769298483333339 -Sr2I4_2_17259.vasp,Sr2I4,-0.8853556400000001,0.40068771888888877 -Cu2P2S6_162_5211.vasp,Cu2P2S6,-2.436200639,0.1401013044999999 -As2P4H2S12_4_1245.vasp,As2P4H2S12,-2.994735233,0.22809788684374654 -Ta2Te2Pd4S2_51_17905.vasp,Ta2Te2Pd4S2,-3.093604913,-0.16597845588095383 -Nb2S4Br4_12_12851.vasp,Nb2S4Br4,-3.119651465,-0.0023312199666661315 -Cd4I8_115_3632.vasp,Cd4I8,0.6113853841666667,0.055876621388888825 -Sn2N2Cl2_59_16789.vasp,Sn2N2Cl2,-3.068495075,-0.8691521358333331 -Ta3B2S2_187_17944.vasp,Ta3B2S2,-6.598828698571429,0.23477038642856485 -Li2V2O4F4_11_10124.vasp,Li2V2O4F4,-4.466810958333333,-0.0034344106597260227 -Ge1O2_115_6683.vasp,GeO2,-4.67522346,0.20940875750000032 -Zn1Bi1_156_20901.vasp,ZnBi,1.102216005,0.13727620250000006 -P1I3_187_13923.vasp,PI3,-0.2939432875,0.48456267749999965 -Mg2Be2_164_10427.vasp,Mg2Be2,-1.1170287675,-0.19857407916666647 -Ni2Cl6_191_13500.vasp,Ni2Cl6,-0.087808365,0.36057112125 -Mn2I6_189_11117.vasp,Mn2I6,-0.23533771625,0.21524840546875001 -Gd2Cl6_12_6609.vasp,Gd2Cl6,-2.87670849375,0.06655039124999762 -Mn2S2_129_11221.vasp,Mn2S2,-2.86448025,0.09305597249999975 -Pd2Br6_191_14407.vasp,Pd2Br6,-0.02790886125,0.39909646375 -Tl2Cu1F4_123_19401.vasp,Tl2CuF4,-1.5482576885714285,0.07353803285714289 -Sc2C1Cl2_164_16050.vasp,Sc2CCl2,-4.255930222,0.03921082199999937 -Hf1Mn1I2O1_8_7216.vasp,HfMnI2O,-3.0966803819999997,0.557445141551725 -Sc2I2O1F1_1_16092.vasp,Sc2I2OF,-3.3906663866666666,0.22253654284721477 -Ti2Sb2S6_2_19013.vasp,Ti2Sb2S6,-3.912319817,0.2521715691666643 -Bi4O8_156_2628.vasp,Bi4O8,-3.3376057875,0.4299450584374971 -Au2Cl2_129_1467.vasp,Au2Cl2,0.43465807,0.28589132625 -Ta2I4N1O1_6_17761.vasp,Ta2I4NO,-3.777493965,0.29435008724552736 -As2Os2O6_162_1234.vasp,As2Os2O6,-4.66733901,0.3459522744999945 -Tl1Sn1Se2S1_1_19348.vasp,TlSnSe2S,-1.678139868,0.3131527172083338 -Nb3C2Cl2_187_12960.vasp,Nb3C2Cl2,-5.855887627142857,0.10312984190474772 -Nb4Sn2Se8_55_13159.vasp,Nb4Sn2Se8,-3.677253547142857,0.15480704607142548 -Cd1Pb2S2Cl2_12_3394.vasp,CdPb2S2Cl2,-1.4063270428571428,-0.3269882575000017 -Hg2Br2O2_59_7943.vasp,Hg2Br2O2,-0.24476156833333332,0.365322736458331 -Ta2Co2Te6_11_17705.vasp,Ta2Co2Te6,-2.798639939,0.16046142245832784 -Fe1Br2_115_5638.vasp,FeBr2,-0.2761463566666667,0.578963465 -Zn2Bi4Br4O6_31_21042.vasp,Zn2Bi4Br4O6,-2.384908944375,0.2271708212500002 -Ag2Hg2Te2I2_26_308.vasp,Ag2Hg2Te2I2,0.50701625125,0.09529608791666669 -Sb4Te6_11_15836.vasp,Sb4Te6,-1.690028053,0.15627762099999987 -Fe4Sn4O12_13_6090.vasp,Fe4Sn4O12,-3.7112930195,0.32372869291666495 -Al2Fe1Te4_164_830.vasp,Al2FeTe4,-1.9658528671428572,0.016259014404759964 -Al1H2_115_671.vasp,AlH2,-2.563255546666667,0.5036217205555524 -P1Cl3_187_13917.vasp,PCl3,-1.2055026975,0.5857621949999985 -Cr1Te1S1_156_4273.vasp,CrTeS,-2.58223323,0.23831720000000045 -Cs2B2S6O2F6_1_4660.vasp,Cs2B2S6O2F6,-3.4591867577777777,0.1706049161041575 -Zr2Si2S2_99_21685.vasp,Zr2Si2S2,-4.416434878333333,0.538325256666667 -Na2Mn1P2S7Cl3_1_12210.vasp,Na2MnP2S7Cl3,-2.5776284973333334,0.14284582966665604 -Zr2S2Br2_59_21643.vasp,Zr2S2Br2,-3.768234303333333,0.04248983166666642 -Sb1Mo1Se1Br2_8_15468.vasp,SbMoSeBr2,-1.55716776,0.5128500322499987 -Tl1Co5Cl2_123_19246.vasp,TlCo5Cl2,-0.8467420725,0.5741784199999991 -Ag1Cl2_115_50.vasp,AgCl2,0.07518291,0.27439478333333334 -K4Cd2F8_11_9427.vasp,K4Cd2F8,-1.5002118878571429,0.14173527285714133 -C6N2_11_2776.vasp,C6N2,-7.15910972,0.65980851625 -Tl1Cu1Sb2S6_149_19256.vasp,TlCuSb2S6,-1.8997556159999998,0.3763036703124956 -V1Mo1S1I1Br1F3_1_19882.vasp,VMoSIBrF3,-2.5196447725,0.024698868203125106 -Ge3O6_5_6913.vasp,Ge3O6,-4.788939096666667,0.09569312083333337 -Zr1Nb1Te1P1Se1_8_21362.vasp,ZrNbTePSe,-4.046019634,0.6018273742499942 -Cr1H5C4O6_2_4192.vasp,CrH5C4O6,-5.172232096875,0.22992431497395271 -Ge1Te2_187_6720.vasp,GeTe2,-1.72162013,-0.22219732777777912 -Mo2Cl4O2_47_11598.vasp,Mo2Cl4O2,-3.03866599875,0.030850597500000188 -Ag2As4Br2O3_6_161.vasp,Ag2As4Br2O3,-2.348053320909091,0.23962417727272256 -Mn2O2_129_11174.vasp,Mn2O2,-3.53127735,0.6793690128448278 -V2Ge1O7_1_20065.vasp,V2GeO7,-5.077312505,0.20908216774999566 -Zr1Ge1F6_1_21299.vasp,ZrGeF6,-3.86809737,0.18092760374999983 -Sc1Ag1As2Se6_149_15887.vasp,ScAgAs2Se6,-2.336448265,0.7782864514166614 -Fe2Cl6_162_5838.vasp,Fe2Cl6,-1.0750705425,-0.03722281937499994 -V3Cr1O10_115_20257.vasp,V3CrO10,-5.296587766428572,-0.011893210982147462 -Ag4Cl8_13_512.vasp,Ag4Cl8,-0.10352102083333332,0.09569085250000002 -Ni2Se2O6_11_13635.vasp,Ni2Se2O6,-3.136553511,-0.2941842495000011 -B2I6_12_1676.vasp,B2I6,-1.11180491,0.11948070374999986 -Fe1H2O2_164_5685.vasp,FeH2O2,-4.11213624,-0.047770390555558206 -In4S4Cl4_14_8683.vasp,In4S4Cl4,-1.9985015466666667,0.044505528333331545 -Sr1W1S1Br4_38_17098.vasp,SrWSBr4,-2.0376400314285714,0.31955636422618783 -Na1Bi3_10_11828.vasp,NaBi3,-0.60567246,-0.1932694525 -Mn2Te3O8_5_11310.vasp,Mn2Te3O8,-3.681853837692308,0.21205732923076948 -Pr2Br2O2_164_14542.vasp,Pr2Br2O2,-4.770539435,0.11884436500000017 -B4N4_127_1758.vasp,B4N4,-7.427436115,0.3754396275000005 -Hf1Mo1Rh1S4I2_8_7234.vasp,HfMoRhS4I2,-2.9921121244444446,0.3453137188492017 -Pr4F10_11_14561.vasp,Pr4F10,-4.220247928571429,0.3658950490872978 -Ge2O1_8_6790.vasp,Ge2O,-3.6350426666666666,-0.10623874541666645 -Cr1Mo1F6_2_4210.vasp,CrMoF6,-2.9325512625,-0.004418580937499916 -Ba2Ag1S2Cl2_38_1886.vasp,Ba2AgS2Cl2,-2.2075231214285713,0.22972216118861333 -Sc2Cl6_191_16066.vasp,Sc2Cl6,-2.72354041625,0.16548452749999987 -Ag2Ge2O6_1_262.vasp,Ag2Ge2O6,-3.310771984,0.1668483674999992 -Te6As4_7_18651.vasp,Te6As4,-1.8842887959999999,0.22918661500000015 -Mn3Br8_2_11359.vasp,Mn3Br8,-1.1324474854545454,0.02344257113636261 -Ag2Bi2O4_11_192.vasp,Ag2Bi2O4,-2.546029515,0.1408682682500002 -Cu2Se1O4_21_5292.vasp,Cu2SeO4,-2.449320254285714,0.45751533955356916 -Nb1V1F6_123_12609.vasp,NbVF6,-3.74324078875,-0.01360244000000388 -Ru3I1Cl1O3_1_15366.vasp,Ru3IClO3,-3.08566528625,0.5690451658333295 -In4P20_26_8680.vasp,In4P20,-3.4865846291666664,-0.23861808583333577 -Sn1O2_164_16661.vasp,SnO2,-4.17837346,0.1828458349999993 -Si4O6_11_16499.vasp,Si4O6,-5.728726506,0.33921002099999337 -In1Sn1Br2O2_1_8354.vasp,InSnBr2O2,-2.550048326666667,0.18099161916666628 -Bi4O10_6_2619.vasp,Bi4O10,-3.2555184792857146,0.45340564526785343 -K4Au4Se20_49_9414.vasp,K4Au4Se20,-1.2312229189285715,0.20611627178571412 -Hf1F4_123_7156.vasp,HfF4,-4.682444348,0.24519338300000015 -Sm1Ge2_123_16555.vasp,SmGe2,-2.7896593133333334,0.7045691027777741 -In4Te4Cl4_14_8700.vasp,In4Te4Cl4,-1.3465407999999999,-0.6142850699999999 -Yb2F6_59_20873.vasp,Yb2F6,-4.53269461,-1.5206512215624999 -Ge1Sb1Te4_6_6705.vasp,GeSbTe4,-1.7095904016666665,-0.05960282333333483 -Ga1H2S2_12_6199.vasp,GaH2S2,-2.76544994,0.6298217377499954 -Ga2Co2Te5_187_6337.vasp,Ga2Co2Te5,-1.6643364066666666,0.21306440314814634 -Li1Ni1P2O6_149_9761.vasp,LiNiP2O6,-4.389692526999999,0.6242422267999959 -Ca3Au2S4Br2_123_3152.vasp,Ca3Au2S4Br2,-1.8167290254545454,0.14874384818181463 -Mn4C3S2_164_11429.vasp,Mn4C3S2,-4.169469898888889,0.33042550777776813 -Cu4Sb8Cl4O12_1_5463.vasp,Cu4Sb8Cl4O12,-3.0437384128571425,0.35407426309523216 -Ge4N8_26_6931.vasp,Ge4N8,-4.840613008333333,0.5098395294444393 -K2Sb2C12Br10_18_9340.vasp,K2Sb2C12Br10,-3.350938473846154,0.9233854191025586 -Bi6O4F10_26_2669.vasp,Bi6O4F10,-3.0604263974999997,0.12331925175000036 -Zr3Bi1Br1N2Cl1_8_21748.vasp,Zr3BiBrN2Cl,-4.65898944625,0.016900021093747816 -Cr2B1S2_164_4324.vasp,Cr2BS2,-3.813787166,0.13363433599999563 -Zn2H4Se2O8_7_21100.vasp,Zn2H4Se2O8,-3.521825888125,0.03642521135416654 -Hg1Pb1S3_1_7893.vasp,HgPbS3,-1.219621702,-0.34430602012500255 -Mn2H8C10N4O10_4_11105.vasp,Mn2H8C10N4O10,-5.7144878697058825,0.18846835625348968 -Ta4O12_2_18080.vasp,Ta4O12,-6.16938731,0.5901445107812497 -Cr4S2N3F2_164_4623.vasp,Cr4S2N3F2,-3.9519442272727274,0.43976904575756726 -Sn3P2O9_174_16920.vasp,Sn3P2O9,-4.376438980714286,0.5415049661904712 -Ta3B2Cl2_187_17937.vasp,Ta3B2Cl2,-5.852098652857143,0.012396474642850208 -V2Zn2F8_2_20234.vasp,V2Zn2F8,-2.2966966341666666,-0.048519348125000944 -Y4C3_164_20817.vasp,Y4C3,-6.027846928571429,0.1853441185714222 -Li2Cu6F20_7_9898.vasp,Li2Cu6F20,-1.3557459075,-0.022957783571429857 -K4Na2In2As4_49_9479.vasp,K4Na2In2As4,-1.2745630966666666,0.1163526608333334 -Sn6P2_191_16995.vasp,Sn6P2,-1.222385715,-0.791706483749999 -Tl18S9_143_19192.vasp,Tl18S9,-1.1510932488888888,0.10404339277777797 -Ni1B4H4I2N2_47_13272.vasp,NiB4H4I2N2,-3.7680673107692306,0.563459308987975 -In2H2S2O8_11_8462.vasp,In2H2S2O8,-4.136028545,0.07149242611903969 -Pb2S2O8_31_14277.vasp,Pb2S2O8,-4.107776595,0.2581960316666674 -Ni4P4S4_13_13752.vasp,Ni4P4S4,-2.4132459525,0.24757066249999982 -Cs1Ti1S2_156_4655.vasp,CsTiS2,-3.499496765,0.29444720687500014 -Ta2I2_164_17759.vasp,Ta2I2,-3.4908993575,0.8326392216071363 -K4Sn4C8O16F4_14_9517.vasp,K4Sn4C8O16F4,-4.828256189166667,0.09175102979165572 -Sb2Te6Rh2_162_15742.vasp,Sb2Te6Rh2,-1.818961632,0.307431814499998 -Ba2I2F2_129_2002.vasp,Ba2I2F2,-2.6619476883333335,0.045247066666666225 -Au1S2_187_1443.vasp,AuS2,-0.8174417266666666,0.7297122497916654 -Sc4I10_11_16245.vasp,Sc4I10,-1.529051964285714,0.14319895809523508 -Na1Fe1Te6P2_5_11856.vasp,NaFeTe6P2,-1.7736221220000001,0.6276857039999986 -La1Bi2_21_9563.vasp,LaBi2,-1.8423441,0.09318914499999997 -Ni3Te1S3I1_1_13732.vasp,Ni3TeS3I,-0.8782474675,0.3041442759374983 -Si2C2F2_59_16395.vasp,Si2C2F2,-4.5706188150000004,0.9549144633333275 -Re1Ag2H6_1_14989.vasp,ReAg2H6,-2.4952980933333335,1.4166821311111075 -Au4Se4O12_14_1601.vasp,Au4Se4O12,-2.529830964,0.2740241489999993 -Zr2F2_129_21559.vasp,Zr2F2,-3.135301115,1.25063430375 -Zn1Pd3Br3Cl1O4_1_20993.vasp,ZnPd3Br3ClO4,-1.5707732433333332,0.14553776433448848 -Mo1O2_187_11527.vasp,MoO2,-5.19999092,0.11191419166666616 -Zr1P2H2O6_164_21390.vasp,ZrP2H2O6,-5.6827704263636365,0.06522300909090895 -Ru1O2_164_15276.vasp,RuO2,-4.21882816,0.7448855050000001 -Ag2N6_49_335.vasp,Ag2N6,-4.2912384925,-0.32176874187500015 -Ge2Sb6_164_6859.vasp,Ge2Sb6,-2.0771631175,0.17875609312499963 -Sb1Te1Br1_156_15508.vasp,SbTeBr,-1.4471848633333335,0.14337392666666648 -Hg2Au2S2F2_26_7928.vasp,Hg2Au2S2F2,-0.16890653125,0.32627587375 -V2B1H2_164_19990.vasp,V2BH2,-3.977983246,0.5095232620000005 -Al2Br2_164_774.vasp,Al2Br2,-1.60806769,0.3069980283333318 -Au2Cl2_12_1469.vasp,Au2Cl2,0.210119025,0.061352281249999974 -Ta2Te10Pd2_51_17891.vasp,Ta2Te10Pd2,-2.373570357142857,0.07334019785714263 -Cd2Ag2S2I2_26_3444.vasp,Cd2Ag2S2I2,-0.0579726775,0.138997525625 -Ba2Ag1Se2Br2_38_1889.vasp,Ba2AgSe2Br2,-1.78319109,0.2179125696428551 -Pd1I1F2_6_14363.vasp,PdIF2,-0.8038891,0.3973839229875001 -Pb2Br4O12_13_14222.vasp,Pb2Br4O12,-2.439133308888889,0.19695055861110866 -Ca2I4O8_125_3055.vasp,Ca2I4O8,-2.680804164285714,0.2402855964999982 -Ti3B2O2F2_187_19063.vasp,Ti3B2O2F2,-5.761175834444445,0.29812980999999406 -Ag2Te4Cl2_17_477.vasp,Ag2Te4Cl2,-0.6073469025,0.14985297062500003 -Au1S1I1Cl1_6_1439.vasp,AuSICl,-0.12482002,0.4016166442083316 -Ir2Rh2S3I4O1_8_8808.vasp,Ir2Rh2S3I4O,-2.10771979,0.2580587303935075 -Cu2Sb2S6_2_5268.vasp,Cu2Sb2S6,-1.807068061,0.41729566824999775 -Cr1H4C4Cl1O6_2_4188.vasp,CrH4C4ClO6,-5.08178464875,0.15059875770832865 -Fe2Te2_123_6008.vasp,Fe2Te2,-0.79663071,0.9695255412499999 -Bi2Mo2_12_2473.vasp,Bi2Mo2,-2.1387305125,0.7793218399999999 -Mo2C1Cl2_164_11581.vasp,Mo2CCl2,-3.5183062759999997,0.187623732666667 -Dy1As2_21_5508.vasp,DyAs2,-2.84773575,0.6573879599999968 -Ru1Rh1S2I4_1_15284.vasp,RuRhS2I4,-1.2156497725,0.4005547858593751 -Te24W8_14_18345.vasp,Te24W8,-2.3048927975,0.37172710541666665 -Sr2Ag1Se2I2_38_17112.vasp,Sr2AgSe2I2,-1.346891657142857,0.051107816428569375 -Tl4P2Au2S8_11_19615.vasp,Tl4P2Au2S8,-2.018365918125,0.13144109187499975 -Li1Mn1Bi1Sb1_156_9742.vasp,LiMnBiSb,-1.4924067625,0.33778699034482784 -Ge2Se2S8_7_6871.vasp,Ge2Se2S8,-2.462787795,0.3732642458680532 -Cu4H6Cl2O6_11_5419.vasp,Cu4H6Cl2O6,-2.8080406433333334,0.22244785173610726 -Cr2Se1S1I2_6_4491.vasp,Cr2SeSI2,-1.981980495,-0.07938457666666665 -Se20N8_14_16285.vasp,Se20N8,-2.688430578214286,0.6535262365476162 -Lu2Te6_51_10320.vasp,Lu2Te6,-1.96989348625,0.4680832506249999 -Cs2H6C2S8_4_4716.vasp,Cs2H6C2S8,-3.203074005,0.298873524097212 -Tl2P2H4O8_13_19477.vasp,Tl2P2H4O8,-4.52843141375,0.06693757999999583 -In1Pt1_47_8317.vasp,InPt,-0.914528695,0.44766522 -Cr1Ag1Se2_156_4107.vasp,CrAgSe2,-1.578629645,0.2786208287499983 -V1Ag1P2Se6_5_19758.vasp,VAgP2Se6,-2.441482175,0.07274972919583189 -Ca2P2H8O10F2_2_3086.vasp,Ca2P2H8O10F2,-4.678650730833334,0.08706556920138847 -V4C3S2F2_164_20314.vasp,V4C3S2F2,-4.54934849,0.14875179766833846 -In1Pt1Se2_1_8316.vasp,InPtSe2,-1.7242549625,0.3788200971428528 -Ti2S2_187_19002.vasp,Ti2S2,-5.0944287375,0.1023848825 -Hf2Te2I2_59_7634.vasp,Hf2Te2I2,-2.98932987,0.04931773791666405 -Bi4As2Cl2O8_5_2591.vasp,Bi4As2Cl2O8,-3.69160907875,0.021718084062499976 -In4Bi20_26_8664.vasp,In4Bi20,-0.9153704208333333,-0.41895767000000045 -Li1Cr1Ni1Te1I1_8_9681.vasp,LiCrNiTeI,-1.0827515719999998,0.8299686773333304 -Cs2Os2S4I8N2_7_4764.vasp,Cs2Os2S4I8N2,-1.8378908211111111,0.28188956472222015 -Os1Br2_115_13791.vasp,OsBr2,-1.1902208033333335,0.7992711666666623 -W4S2N3F2_164_20591.vasp,W4S2N3F2,-4.847503556363637,0.3501112199242318 -H2N2_164_6997.vasp,H2N2,-4.1795437575,-2.509897598750001 -Hf1Zr1I2O2_25_7381.vasp,HfZrI2O2,-4.622178393333333,0.2857483966666672 -Cr4N3_164_4611.vasp,Cr4N3,-4.718080354285715,0.3918667019047568 -Re6Se8I2_2_15132.vasp,Re6Se8I2,-4.12664805125,0.07753644187499997 -Cr2P4Au2O12_4_4456.vasp,Cr2P4Au2O12,-4.472071802,0.6386643171666613 -K2Se2N2Cl6O6_4_9347.vasp,K2Se2N2Cl6O6,-2.336595142222222,0.40256086144443876 -Zr4S2N3_164_21840.vasp,Zr4S2N3,-6.440832603333333,-0.08087773694445621 -Na2B2H8S8_2_11980.vasp,Na2B2H8S8,-3.3895472145,0.028878215333333568 -Cd2Te2Au2I2_26_3587.vasp,Cd2Te2Au2I2,0.40473866875,0.0035683323783333165 -Li4Ti8O18_11_10234.vasp,Li4Ti8O18,-6.564170313,0.15553439016665926 -Mo2H2C1O2_164_11611.vasp,Mo2H2CO2,-4.562046695714286,0.420114225178567 -Ni2O4_14_13551.vasp,Ni2O4,-2.5788856783333336,-0.24259851625000217 -Ba5Sc1_1_2202.vasp,Ba5Sc,0.14917629833333332,0.9109032858333315 -Ag2P4Se3F2_6_365.vasp,Ag2P4Se3F2,-2.09302497,0.40271031619791353 -In2Te2Cl2_31_8617.vasp,In2Te2Cl2,-1.3462897283333335,-0.6140339983333335 -Ce2Te2_129_3683.vasp,Ce2Te2,-3.0702804675,-0.01894803249999999 -Tl4Te4Br4_14_19633.vasp,Tl4Te4Br4,-0.57548384,0.3329195788888882 -Ag2Te1S4_21_451.vasp,Ag2TeS4,-1.0774337457142857,0.4259430391964264 -Pt2O2_129_14642.vasp,Pt2O2,-2.247748925,0.8650871768750004 -Re2Te2_129_15087.vasp,Re2Te2,-3.97672376,0.5885247174999999 -Re6Te8Cl2_2_15135.vasp,Re6Te8Cl2,-3.727786514375,0.011846795104160868 -Pd2C4S12_14_14408.vasp,Pd2C4S12,-3.4166144744444447,0.32312181777777393 -Ag2O4F2_11_340.vasp,Ag2O4F2,-1.7385226075,0.18041813500000004 -Ta4H2S2N3_164_18053.vasp,Ta4H2S2N3,-6.2946419054545455,0.8264623486363536 -V1I1Br1N1_6_19861.vasp,VIBrN,-2.8303336125,0.1816912325000004 -Cu2B2S2Br2_31_5029.vasp,Cu2B2S2Br2,-1.691020085,1.2280543439583336 -Fe2Se4_11_5986.vasp,Fe2Se4,-1.74854837,0.5533103883333332 -Mg2Hg1_123_10468.vasp,Mg2Hg,0.94401846,0.42471618833333336 -Ni4Sb4S4_13_13761.vasp,Ni4Sb4S4,-1.5601133291666667,0.3976635574999998 -Fe2As2S4F2_26_5781.vasp,Fe2As2S4F2,-2.6716915400000003,-0.17099009754166994 -Ag2C4O8F4_14_229.vasp,Ag2C4O8F4,-4.251339502222222,0.15653636722221886 -Fe2Te4_14_6021.vasp,Fe2Te4,-0.51376564,1.114486275 -P1Pd1_187_13934.vasp,PPd,-1.753899325,1.1665226332499972 -K2C2S2N2_31_9020.vasp,K2C2S2N2,-4.49746485625,-0.05965864250000563 -Ti2I2O2_59_18955.vasp,Ti2I2O2,-4.909920325,0.08688940999999595 -Sn2B2P2H6S6_7_16736.vasp,Sn2B2P2H6S6,-3.3051532255555554,-0.06776215051587983 -P1C1_38_13915.vasp,PC,-5.048109335,1.0330513624999997 -Ni1P2S6_149_13390.vasp,NiP2S6,-2.679996317777778,0.15488931777777504 -Mg2Mo4O10_59_10486.vasp,Mg2Mo4O10,-4.447212256875,0.7436955665624999 -Tl2Cu3Se6O18_2_19405.vasp,Tl2Cu3Se6O18,-3.1063349586206894,0.08555481230602946 -As2Cl6_147_1203.vasp,As2Cl6,-1.54684901875,0.04605646625000004 -Cu4S4O12_14_5459.vasp,Cu4S4O12,-3.2205990525,0.431425945 -Na1Ga1Sb2Se6_5_11868.vasp,NaGaSb2Se6,-1.990207132,0.35427154783333104 -K2U3I4O20_2_9383.vasp,K2U3I4O20,-4.6502134279310345,0.11511788413793056 -Ta3S1Br7_156_17981.vasp,Ta3SBr7,-3.168663263636364,0.04283052545454513 -Zr4Te4F4_31_21855.vasp,Zr4Te4F4,-3.5074356649999996,0.29878623166665985 -Yb2Br2F2_129_20861.vasp,Yb2Br2F2,-2.961381578333333,0.03713786833333366 -Mn2Br2O2_59_11030.vasp,Mn2Br2O2,-2.8595214566666667,0.040172958055552765 -Ca2Sn4Cl12_2_3128.vasp,Ca2Sn4Cl12,-1.7545334266666666,0.04065025833333169 -Mo1Br2_187_11500.vasp,MoBr2,-1.2158315066666667,0.6471504374999999 -Ni2Br1Cl1_6_13477.vasp,Ni2BrCl,0.1606223725,0.6048454624999999 -Nb2C1Cl2_164_12660.vasp,Nb2CCl2,-5.217297598,0.024468085999999722 -Nb4Cr2O12_2_13063.vasp,Nb4Cr2O12,-6.301302279444445,0.12733187986110472 -Ga2Te2_129_6512.vasp,Ga2Te2,-1.6515591425,0.28164107333333344 -Li4B1O4_38_10160.vasp,Li4BO4,-4.633459912222222,0.35509318833332804 -Zr2As2S6_2_21504.vasp,Zr2As2S6,-3.89000329,0.19327903787499734 -Sc2O6_2_16116.vasp,Sc2O6,-4.8816115075,0.5058592884375002 -Ag2Te4I2_1_479.vasp,Ag2Te4I2,-0.3451370125,0.26701921333333334 -H2Au1_187_6988.vasp,H2Au,-1.25358725,2.46269680333333 -Al2H10C4Cl4_10_853.vasp,Al2H10C4Cl4,-3.7018697860000005,0.42740756216666353 -Tm2Cl6_59_19676.vasp,Tm2Cl6,-2.86020707,0.06455631625000002 -Y1I2_187_20644.vasp,YI2,-2.3305604866666667,0.07220232277777555 -Ba2Br4_51_1930.vasp,Ba2Br4,-1.8207114333333332,0.39704825666666665 -Nb2Se3S1Br1Cl3_1_12879.vasp,Nb2Se3SBrCl3,-2.777392,0.28583472104686625 -Mn2Se1I2_8_11271.vasp,Mn2SeI2,-1.30205745,0.050047101517239345 -Ce1I2_123_3646.vasp,CeI2,-1.84192966,0.005550916666666739 -Sn1Br1Cl1O1_6_16617.vasp,SnBrClO,-2.0627509075,0.23899181515625023 -K2Cd4Se2S6Br6_31_9062.vasp,K2Cd4Se2S6Br6,-0.8606018049999999,0.2779804965833309 -Tm2S2I2_59_19683.vasp,Tm2S2I2,-3.2128477466666667,0.04762944499999966 -Ta2Te6As2_2_17919.vasp,Ta2Te6As2,-2.9318521029999998,0.3407283200833321 -Cr3N2_5_4567.vasp,Cr3N2,-4.056530558,0.9808668126666618 -Ag2W1O4_1_490.vasp,Ag2WO4,-3.4559134285714284,0.16821851964285495 -Tl3V5O14_157_19583.vasp,Tl3V5O14,-4.786165327272728,0.15648188499999982 -Mn1Au1Br2N2_1_10638.vasp,MnAuBr2N2,-2.1383393533333335,0.5971333312499973 -Ca2H8Cl4O4_30_3038.vasp,Ca2H8Cl4O4,-3.643486480555555,0.06141323500000029 -Zr2F6_162_21563.vasp,Zr2F6,-4.07818942125,0.47915319437499954 -Cu1Sb1S2Cl2_8_4964.vasp,CuSbS2Cl2,-1.4301621516666667,0.3187624398784704 -Ga1Br2_164_6144.vasp,GaBr2,-1.0314395133333334,0.2752806158333334 -Nb1Sb2_187_12572.vasp,NbSb2,-3.4780753866666667,0.3940717433333334 -Al2Te2S8F2_11_1009.vasp,Al2Te2S8F2,-2.4265089314285713,0.5711818601488051 -Ta2V2Te10_11_17934.vasp,Ta2V2Te10,-2.7625978121428574,0.0639238676785685 -Er1P2_21_5544.vasp,ErP2,-3.16943908,0.96783599833333 -Ag2H4C4Br2N2_2_272.vasp,Ag2H4C4Br2N2,-4.15580759,0.17873320107141819 -Tl1Au1I3Br1_6_19219.vasp,TlAuI3Br,0.22023375999999997,0.11059366166666673 -Cd1Au1Br2_6_3268.vasp,CdAuBr2,0.6324974475,1.021743523125 -H2Au1S2_12_6987.vasp,H2AuS2,-2.086981586,0.21193018768749772 -Ta2Te1S1I1N1_8_17896.vasp,Ta2TeSIN,-4.850102345,0.3742462775810127 -Li5Br3O2_115_10257.vasp,Li5Br3O2,-2.677416925,0.30987377900000035 -Fe3Ge1Se2_187_6051.vasp,Fe3GeSe2,-1.616192635,0.1725786716666653 -Te4Au4O12_14_18576.vasp,Te4Au4O12,-2.59250817,0.3937264099999993 -Co3Te1O8_164_4074.vasp,Co3TeO8,-3.8539850216666665,-0.20892848500000305 -Ni2Te1Se3Cl2_1_13656.vasp,Ni2TeSe3Cl2,-0.88607145375,0.29004103179687435 -Fe2C1F2_164_5826.vasp,Fe2CF2,-2.849299736,0.8406104000000005 -Ga2Te2Br2_59_6498.vasp,Ga2Te2Br2,-1.31893334,0.21081090000000002 -Cd1S1_123_3412.vasp,CdS,-0.189142845,0.55227086625 -Ga1Te1I1_3_6289.vasp,GaTeI,-1.0731386966666667,0.18497345749999994 -Au2S4Cl2_17_1524.vasp,Au2S4Cl2,-1.11256416625,0.1566518268749999 -U4Se10_10_19737.vasp,U4Se10,-4.744522326428571,-0.0022875480000039694 -Ca2Ce2_59_2975.vasp,Ca2Ce2,-0.429500585,1.0293846675 -Mn1Ga1S3_3_10723.vasp,MnGaS3,-2.4910988620000003,0.5445703632499999 -Hf2Sb1S2_164_7582.vasp,Hf2SbS2,-4.873051086,-0.25193317337499943 -K2C4O6F6_2_9033.vasp,K2C4O6F6,-4.4014027561111115,-0.05508934944444771 -Ga18S9_143_6104.vasp,Ga18S9,-2.1806857874074073,0.08809820259259049 -Mn1Cr1Cu1S2I4_1_10677.vasp,MnCrCuS2I4,-1.166742558888889,0.07887734016203453 -Ti2O2F2_59_18973.vasp,Ti2O2F2,-6.100815748333333,-0.27513613166667206 -Zr2O2_10_21620.vasp,Zr2O2,-5.613363815,0.9279051916666674 -K2C4N6_11_9030.vasp,K2C4N6,-6.017658841666666,-0.15071664479167102 -Na2Ta2F12_4_12311.vasp,Na2Ta2F12,-4.066418408125,-0.08910438437500012 -Hg2Te2Br2_59_8027.vasp,Hg2Te2Br2,0.37325629666666665,0.05397784674242456 -Tl2As2S6_5_19363.vasp,Tl2As2S6,-2.212719625,0.47736353862499736 -Cr3Te8Mo1_25_4583.vasp,Cr3Te8Mo,-1.95011198,0.03489618666666694 -Cr2Se6_59_4506.vasp,Cr2Se6,-2.38450031375,0.2673610358333335 -Sn1Cl2_187_16626.vasp,SnCl2,-1.3727419966666667,0.20591796166666665 -Cu2Br2N2O2_31_5047.vasp,Cu2Br2N2O2,-2.3782361225,0.26696360374999983 -C1S2_164_2736.vasp,CS2,-3.050381756666667,1.4003165795833292 -V2O6_51_20131.vasp,V2O6,-4.8426379875,0.3532637464062498 -Al2Sn2S2_164_993.vasp,Al2Sn2S2,-2.595845455,-1.1182699873611126 -In2O2_164_8510.vasp,In2O2,-3.15425714,0.42606205750000026 -P6C2_164_14133.vasp,P6C2,-4.56785142875,0.4957269124999999 -C4O4_57_2766.vasp,C4O4,-5.96550883625,0.7091441812500006 -Hg1Se2_164_7915.vasp,HgSe2,-0.043596116666666664,0.19773022444444432 -Li2Ni1F2_123_10019.vasp,Li2NiF2,-2.2410068880000003,0.5641464439999997 -Al4Sb20_26_1089.vasp,Al4Sb20,-1.8996850204166666,0.13898733624999826 -Mn1H2_164_10765.vasp,MnH2,-2.915545943333333,0.5586238275000004 -Ti2Te2Br2_59_19035.vasp,Ti2Te2Br2,-3.27987188,0.1357642533333263 -Ga4Te4Cl4_14_6577.vasp,Ga4Te4Cl4,-1.6818942533333334,-0.8174970475000001 -Bi2N18_2_2477.vasp,Bi2N18,-5.7844662614999995,-0.7574039017499992 -V1Ru1Cl2O2_6_19906.vasp,VRuCl2O2,-3.659306855,0.17223220465276895 -Na1Ni1Sb2Te6_5_11919.vasp,NaNiSb2Te6,-1.186967873,0.2612213863999968 -Ca4Se4S12_14_3240.vasp,Ca4Se4S12,-2.50998439,0.17703187641666407 -K1Ti1Te2_156_8948.vasp,KTiTe2,-2.4417441875,0.2675396125862009 -Mn2F2_164_11063.vasp,Mn2F2,-2.383623565,0.23777568068965516 -H6W2_11_7088.vasp,H6W2,-3.7799784875,1.5937181062499999 -Ti3B2Te2F2_187_19069.vasp,Ti3B2Te2F2,-4.379419617777778,0.4265766148148107 -Nb2Sn2Sb2_129_12897.vasp,Nb2Sn2Sb2,-3.0269452483333334,0.694385688333333 -Cr2B1H2_164_4321.vasp,Cr2BH2,-3.6044445179999998,0.998598717000001 -Ni1B4I2N2F4_47_13273.vasp,NiB4I2N2F4,-3.8902302623076923,0.27577944666665866 -Fe2Te2S8_31_6001.vasp,Fe2Te2S8,-2.0378366983333334,0.06481881840277592 -Ag1Au1Se2_25_14.vasp,AgAuSe2,-0.4178954125,0.23719558953125003 -Ti4Se4I4_7_19164.vasp,Ti4Se4I4,-3.3863316075000003,-0.5277008016666693 -Cu2Mo1O4_111_5182.vasp,Cu2MoO4,-3.181703091428571,0.5462708869047606 -Dy2Cu2Pb2Se6_51_5525.vasp,Dy2Cu2Pb2Se6,-2.2874497683333335,0.19003034666666663 -Ag2Te4Mo1O12_5_480.vasp,Ag2Te4MoO12,-3.3956635884210526,0.14832248319078722 -Cd1H1S1Cl1_156_3331.vasp,CdHSCl,-1.4246743175,0.12427822499999985 -Nb2Co2Te6_11_12694.vasp,Nb2Co2Te6,-2.56504164,0.12455638741666175 -Si1H2_115_16340.vasp,SiH2,-2.9608236666666667,1.253065839999996 -As2Rh2O6_162_1283.vasp,As2Rh2O6,-4.104532122,0.11683710027271932 -Ni1Pd2F5_8_13401.vasp,NiPd2F5,-1.1333577825,0.25492125093749973 -Cu1Sn1S4_10_4985.vasp,CuSnS4,-1.9315794566666666,0.2986885204166647 -Cr2Ni1Se4_164_4431.vasp,Cr2NiSe4,-2.0593802528571428,0.21975419809523444 -Sb2Ir2Se6_162_15599.vasp,Sb2Ir2Se6,-2.530164783,-0.06368532820000228 -Ir1Au2Se1S2Br1_1_8725.vasp,IrAu2SeS2Br,-1.1653459828571429,0.42934919482142747 -Te6P2Pt2_2_18669.vasp,Te6P2Pt2,-1.9263643389999998,0.5395121146666654 -Cu1Sb3S6_143_4971.vasp,CuSb3S6,-2.197848122,0.31633030262499595 -Ti2Cl6_162_18926.vasp,Ti2Cl6,-3.14800790875,0.11294512000000001 -In2O2_123_8512.vasp,In2O2,-2.7270015575,0.8533176400000002 -Tl1Si1Te3_143_19347.vasp,TlSiTe3,-1.325640918,0.4526487345000003 -Fe1S2_164_5746.vasp,FeS2,-2.1492313866666666,-0.2131054716666667 -Cu1Au1Se2_25_4841.vasp,CuAuSe2,-0.5597914225,0.2336048104166667 -Ge2N2_187_6788.vasp,Ge2N2,-4.9295386325,-0.022095229999999688 -Cu4H4S4F4_53_5416.vasp,Cu4H4S4F4,-1.60129474625,0.6522777345833334 -Au1I2_187_1429.vasp,AuI2,0.78998532,0.3168668312500004 -Al18Te9_143_591.vasp,Al18Te9,-1.732044931111111,0.6131168155555535 -Ta2Pd2S10_51_17827.vasp,Ta2Pd2S10,-3.5880596242857146,0.13838134723213613 -Zr4C3O2_164_21813.vasp,Zr4C3O2,-6.982190083333333,-0.26519213222222726 -Be1Ge2_164_2222.vasp,BeGe2,-2.76430225,-0.5652659050000022 -Ca3Co2Cl2O5_123_3161.vasp,Ca3Co2Cl2O5,-3.747152284166667,-0.3113960631944483 -Ta2O6_59_17817.vasp,Ta2O6,-6.576472175,0.1830596457812499 -Sc2H2N1_164_16084.vasp,Sc2H2N,-4.678266372,-0.017558467999999383 -Sc4F6_12_16238.vasp,Sc4F6,-3.9898162839999998,-0.26638775100000334 -Nb13S26_2_12459.vasp,Nb13S26,-4.852967579230769,0.10441782576923142 -Fe6Te8_6_6099.vasp,Fe6Te8,-1.1842354364285714,0.5228189564285695 -Si2Au2O6_51_16386.vasp,Si2Au2O6,-4.055290122000001,0.2736368149999988 -Hg1O1_123_7886.vasp,HgO,-0.340030245,0.43081512333333327 -Ag2B2S2I2_31_183.vasp,Ag2B2S2I2,-1.387938175,0.8401675587499999 -K1Rb1Mg6O7_99_8930.vasp,KRbMg6O7,-3.258274708,0.2472479099999943 -Si6Sb6_12_16544.vasp,Si6Sb6,-3.0770087608333334,-0.4401506995833335 -Cr2Au2O8_51_4317.vasp,Cr2Au2O8,-3.5049509808333332,-0.14723866375000272 -Tb1Bi2_21_18169.vasp,TbBi2,-1.71829384,-0.22352535500000137 -Tl2Pt4S6_164_19490.vasp,Tl2Pt4S6,-2.2834934583333335,0.13468622499999983 -W4N3_164_20586.vasp,W4N3,-6.585891295714285,-0.46746668428572025 -V2H3O5_8_20080.vasp,V2H3O5,-4.936904527,0.06998906558332885 -Ca2Pb4Cl12_2_3098.vasp,Ca2Pb4Cl12,-1.772605997777778,0.0204215338888869 -Na2Os2S2N2F10_4_12253.vasp,Na2Os2S2N2F10,-3.1770670138888892,-0.12948084615278455 -Te4O8_14_18600.vasp,Te4O8,-3.6372983641666665,0.01594185208333343 -Li1Co1O2_156_9673.vasp,LiCoO2,-3.809228055,0.4035607799999994 -Be1O2_123_2225.vasp,BeO2,-4.0192497666666664,1.2540018254166627 -In2Te4_12_8636.vasp,In2Te4,-1.0284292083333333,0.36231110999999727 -Fe1Ge1Br1O1_1_5677.vasp,FeGeBrO,-2.27508739,0.2933140243750001 -W3C2F2_187_20557.vasp,W3C2F2,-5.393356282857143,0.20458484607142335 -V1I5_10_19871.vasp,VI5,-0.36821324833333335,0.20551660395833282 -Na1Co1As2Se6_149_11843.vasp,NaCoAs2Se6,-2.218266522,0.24864075058333127 -Hf2As1Se2_164_7428.vasp,Hf2AsSe2,-4.937648952,0.09377688100000059 -Hf3Zr1Se8_6_7758.vasp,Hf3ZrSe8,-4.258175783333333,0.3102261243750011 -Ru2S2F2_59_15339.vasp,Ru2S2F2,-2.94930564,0.2340113716666632 -In1Au2Se2I2_1_8203.vasp,InAu2Se2I2,-0.4555270657142857,0.337023702008927 -Ir2I6_189_8792.vasp,Ir2I6,-0.3619833275,0.48048405375 -In2Cl6_189_8404.vasp,In2Cl6,-1.26107875875,0.17988668124999996 -Sr3Fe2S5I2_123_17380.vasp,Sr3Fe2S5I2,-2.2772019483333334,-0.14558298486111343 -Ga2Te6P2_143_6522.vasp,Ga2Te6P2,-1.859918476,0.2714253746666651 -Sr2B2O6F2_59_17137.vasp,Sr2B2O6F2,-4.654526018333333,0.5519673495833297 -Li4Al4H16_14_10154.vasp,Li4Al4H16,-3.00477105,0.08553739083333056 -Na2H8C2N8O6_2_12132.vasp,Na2H8C2N8O6,-5.047646385769231,0.012827828461522639 -Mn2Ga2Te5_156_11083.vasp,Mn2Ga2Te5,-1.6384891577777778,0.2229178871902917 -Mn2Ir1Se4Br3_1_11131.vasp,Mn2IrSe4Br3,-1.8352922939999998,0.22548873098610764 -Ca1O2F2_1_2862.vasp,CaO2F2,-2.544970076,1.1041444205000004 -Cr1Cu1S2Br2_1_4152.vasp,CrCuS2Br2,-1.4155301566666667,0.18311479159722066 -Zr1I2_187_21312.vasp,ZrI2,-1.9370338933333333,0.09132578833333338 -In2Te2H2O8_11_8620.vasp,In2Te2H2O8,-3.8557650321428567,0.13677973753967487 -H2Pb1S2_164_7002.vasp,H2PbS2,-2.735925056,-0.5275497065 -Re3Te1Pd1Se3I4_1_15099.vasp,Re3TePdSe3I4,-2.3493494133333335,0.35453966145833327 -Ti1Bi1As1_156_18740.vasp,TiBiAs,-3.59844537,0.28205640166666357 -Zr1Co1Br6_5_21279.vasp,ZrCoBr6,-1.64360249625,0.1295045118749988 -V2Te2Br2_59_20201.vasp,V2Te2Br2,-1.9444250566666668,0.22938724111110909 -Cr1C4S6F5_1_4137.vasp,CrC4S6F5,-3.532744809375,0.5039967247656252 -Hf1S2_123_7281.vasp,HfS2,-4.812158266666667,0.6296059999999999 -Sc4S4Br3Cl1_6_16256.vasp,Sc4S4Br3Cl,-3.6122471325000003,0.03495893583333298 -Mg2Ga2Se5_164_10458.vasp,Mg2Ga2Se5,-2.3664282422222223,0.043393523888889174 -Ni1W2O8_2_13439.vasp,NiW2O8,-5.030946975454546,-0.1290244380681882 -Zn2As2O6_147_21026.vasp,Zn2As2O6,-3.186699673,0.40736076387500053 -Ag1Ge1Te1Cl1_6_65.vasp,AgGeTeCl,-1.1085462225,-0.022695050625000157 -Sr1C2_164_17034.vasp,SrC2,-2.482403316666667,3.0196791216666616 -Na2Ni1H4Se2O10_2_12234.vasp,Na2NiH4Se2O10,-3.6394728468421054,-0.0034494544298304675 -Ir2I2O2_59_8788.vasp,Ir2I2O2,-2.4661112616666667,0.5200018583333299 -Cu2Sb4S3Br2_6_5276.vasp,Cu2Sb4S3Br2,-1.5916621136363638,0.004320950530299572 -B3Mo4H2S2_164_1735.vasp,B3Mo4H2S2,-4.063206321818182,0.569759382272719 -Pd2I6_189_14438.vasp,Pd2I6,0.2694875575,0.39257654109374995 -Rb2H8I2_127_14861.vasp,Rb2H8I2,-1.4713891125,1.9522870091666638 -Co2Bi1S2_187_3859.vasp,Co2BiS2,-2.151413808,0.06926953448147999 -Te2As1_115_18348.vasp,Te2As,-1.5673042366666667,0.45588956527777613 -Al2Te3_150_1016.vasp,Al2Te3,-1.788571314,0.42671678025000004 -Re2S2_6_15078.vasp,Re2S2,-4.9222861875,0.7077692656250001 -As2Pt3O8_164_1280.vasp,As2Pt3O8,-3.439554303846154,0.26645415673076567 -Zr4Se4Br4_31_21847.vasp,Zr4Se4Br4,-3.2434305875000002,0.15633428250000003 -Na4H16C4N4O8_14_12387.vasp,Na4H16C4N4O8,-4.611471875555555,-1.3833992829861204 -V2O2_164_20125.vasp,V2O2,-5.01493478,0.5178953633333286 -Sn2P2S6_7_16822.vasp,Sn2P2S6,-2.766148547,0.2922775040000003 -Zr3Te2H2N2_187_21790.vasp,Zr3Te2H2N2,-4.493228956666666,-0.14211550007937446 -Sn8S2F12_4_17009.vasp,Sn8S2F12,-2.5319779536363636,0.11385592499999775 -Cr1Ag1Te6As2_5_4110.vasp,CrAgTe6As2,-1.520406649,0.17457345512499844 -C1I2_187_2731.vasp,CI2,-0.7206978266666666,1.730563331249998 -Sb2S4_14_15685.vasp,Sb2S4,-2.2192217933333334,0.5537532732291641 -Sb2H6Pb2C2S6_7_15585.vasp,Sb2H6Pb2C2S6,-3.352394711111111,-0.03305691503473332 -Te2W4O16_13_18538.vasp,Te2W4O16,-5.184281049545454,0.07681050261363254 -Tl8S6_31_19652.vasp,Tl8S6,-1.1723635092857143,0.2774514406249978 -K4H6Ir2N2Cl10_31_9454.vasp,K4H6Ir2N2Cl10,-2.599121042083333,0.07615326770833342 -As4Pt4S4_13_1355.vasp,As4Pt4S4,-2.8172960408333334,0.21583485791666646 -Hf4B3S2_164_7768.vasp,Hf4B3S2,-5.989120541111111,0.1559646438888831 -Zn1Re2O8_147_20998.vasp,ZnRe2O8,-5.122479808181819,0.05450793090909034 -Ti3Te2H2N2_187_19112.vasp,Ti3Te2H2N2,-5.153359502222222,0.6297143361111064 -Cd1H4Br2N6_1_3343.vasp,CdH4Br2N6,-3.861352208461539,-0.13064623567308153 -Ag2P4O12_12_357.vasp,Ag2P4O12,-4.302362213888888,0.3306742988888898 -Zr2C4_129_21546.vasp,Zr2C4,-5.726755156666666,1.3013548833333282 -Ca2Cu1Br2O2_123_2993.vasp,Ca2CuBr2O2,-2.7409200528571427,-0.12920879214286374 -La2Bi2Se4O2_129_9578.vasp,La2Bi2Se4O2,-3.8946849899999996,0.001460891416662391 -Li2Ag1O2_12_9816.vasp,Li2AgO2,-2.74069625,0.29046127000000044 -Tb2Sn1_164_18210.vasp,Tb2Sn,-1.6110588333333336,0.6357394906249996 -Tb1Sn2_123_18181.vasp,TbSn2,-1.5593120133333331,0.21775893166666682 -Hf1Zr2Nb1Se1Cl5O2_1_7410.vasp,HfZr2NbSeCl5O2,-4.184713988333333,0.31035509311110454 -Li2Au2F8_13_9830.vasp,Li2Au2F8,-1.7149835775,0.10187669791666676 -Sn2Hg1O2F2_12_16776.vasp,Sn2HgO2F2,-2.349699822857143,0.3199715723275842 -Pd1Pt2Br1Cl1O4F1_1_14378.vasp,PdPt2BrClO4F,-2.029306438,0.40301061783333164 -Cu4O4F8_14_5433.vasp,Cu4O4F8,-1.274597585,0.5374923840625 -Li2H6I2N2_4_9946.vasp,Li2H6I2N2,-3.6529276066666667,-3.2157860195833337 -Al1Au1S2Br2_6_611.vasp,AlAuS2Br2,-1.5924780783333334,0.21242102369791502 -Co2Bi1Se2_187_3860.vasp,Co2BiSe2,-1.804684472,0.17375680562500018 -Ba10Ir2_26_1798.vasp,Ba10Ir2,-0.244559925,0.3319090419444438 -As10_6_1119.vasp,As10,-3.046411335,0.1647732249999998 -Zn1Cu1S2I1Cl1_1_20919.vasp,ZnCuS2ICl,-0.55666421,0.4046561896701368 -Ti3Pd1Se4_6_19099.vasp,Ti3PdSe4,-4.2139240025,-0.4620783514583362 -K4As4O8_57_9409.vasp,K4As4O8,-3.713757719375,-0.034641105625 -K2Os2I8N2O4_7_9279.vasp,K2Os2I8N2O4,-2.198802341111111,0.28601742159722027 -Zr1Ni2Te1Se4I2_1_21382.vasp,ZrNi2TeSe4I2,-1.488075435,0.19237099799999988 -K2Bi2P4S12_4_9003.vasp,K2Bi2P4S12,-2.802737954,0.17855130100000016 -Cu1Ag1Te1Br1_6_4830.vasp,CuAgTeBr,-0.0788999475,0.15682725749999998 -Mn1Pd1Br3O1_1_10842.vasp,MnPdBr3O,-1.571656615,0.0472254416666652 -Mo1F2_12_11510.vasp,MoF2,-2.91693266,0.1774582583333304 -Li1As2Pd1Se6_149_9654.vasp,LiAs2PdSe6,-2.182681745,0.2420465519166646 -Cr2C2F2_59_4347.vasp,Cr2C2F2,-4.1239441349999995,0.681418781666663 -Sb2Te6Pd2_2_15740.vasp,Sb2Te6Pd2,-1.379012255,0.3150906317999982 -Bi2Te2O1_1_2560.vasp,Bi2Te2O,-2.093072176,0.23782852266666454 -Cr2As2_12_4312.vasp,Cr2As2,-3.0101051075,0.39524473625 -Cd3B2S6_150_3609.vasp,Cd3B2S6,-2.050988809090909,0.3687183813636337 -As4Pb6O16_14_1348.vasp,As4Pb6O16,-4.015607705384616,0.1145717126923067 -Rh2Se2Br2_11_15233.vasp,Rh2Se2Br2,-1.8517570933333334,0.0870294566666665 -Te2C1_164_18380.vasp,Te2C,-2.2080647133333335,1.5452342611111076 -Hf2Ti2O8_26_7650.vasp,Hf2Ti2O8,-7.102176689166666,0.42349752250000083 -Nb3Se2S2Br4_1_13015.vasp,Nb3Se2S2Br4,-3.318451974545454,0.17856034607953863 -Nb2Br4O2_6_12654.vasp,Nb2Br4O2,-3.19607428875,0.78145520625 -Rb2B2S6_4_14775.vasp,Rb2B2S6,-3.024259716,0.33732324049999995 -Sc2Se2_164_16160.vasp,Sc2Se2,-3.189764985,0.6021899325 -La1Al3Cu1_99_9559.vasp,LaAl3Cu,-1.632480862,0.8559977120000002 -Sb2S2Br2_59_15674.vasp,Sb2S2Br2,-1.9576525833333334,-0.6822569016666666 -Rh1F3_6_15152.vasp,RhF3,-2.0608408375,0.15247777875000024 -Cu2Br6_162_5057.vasp,Cu2Br6,0.13227797375,0.23212786250000003 -Ce1Si5_47_3658.vasp,CeSi5,-3.555295558333333,0.031621218333333534 -Ni2As2Se6_162_13452.vasp,Ni2As2Se6,-1.6926367160000002,0.30057482269999714 -Co2Sn8_125_4030.vasp,Co2Sn8,-1.153977389,-1.144880067 -Tl2S2_123_19508.vasp,Tl2S2,-1.18796163,0.40786205109375007 -Pt4_12_14711.vasp,Pt4,-0.9642450825,2.4075528575 -Li1V2O1F5_8_9809.vasp,LiV2OF5,-3.8812287233333334,-0.13359719914815604 -Ni2Sb2I2O4_10_13606.vasp,Ni2Sb2I2O4,-2.284844121,0.3752087302499958 -Sb2S2Br2_1_15673.vasp,Sb2S2Br2,-1.9182407633333334,-0.6428450816666667 -Ga1Si1S3_143_6279.vasp,GaSiS3,-2.8481088580000002,0.6229152719999975 -Co2Sb2Pt2_129_3998.vasp,Co2Sb2Pt2,-1.7450239950000002,0.4398589883333309 -Ni2Se3_6_13645.vasp,Ni2Se3,-0.9325808999999999,0.29090979499999875 -Na3Y1Cl6_10_12360.vasp,Na3YCl6,-2.517080686,0.11788009400000021 -Cu2Mo1Se4S1Br2_1_5186.vasp,Cu2MoSe4SBr2,-1.4066220409999999,0.2816751832023801 -Ni2Cl2O4_11_13493.vasp,Ni2Cl2O4,-1.99992301,-0.1684636276562499 -Tb5I8_10_18216.vasp,Tb5I8,-1.6182516169230767,0.10120499769230612 -Pb2Br2Cl2_129_14216.vasp,Pb2Br2Cl2,-1.1487602700000001,0.09117792583333328 -Te1Au2S1Br2_1_18288.vasp,TeAu2SBr2,-0.2522669983333333,0.3054197634027768 -Sc1Cu1Te6P2_149_15932.vasp,ScCuTe6P2,-1.965518613,0.32370351024999866 -Cu1Au1O2_10_4839.vasp,CuAuO2,-1.57143537,0.3826586939062499 -Li1In1Te6P2_5_9739.vasp,LiInTe6P2,-1.882786209,0.30151632616666524 -Zn1Mo1C1Br1Cl1_1_20971.vasp,ZnMoCBrCl,-2.0583572119999998,0.5067423035625 -Rb2C2S6O2F6_1_14790.vasp,Rb2C2S6O2F6,-3.2393094616666667,-0.09800913854167426 -Ag4S2_11_541.vasp,Ag4S2,-0.2316951416666667,0.18664854500000003 -Hf3N1Cl2O2_12_7718.vasp,Hf3NCl2O2,-5.8491343275,0.4946996006249962 -Sc1Cu1Sb2S6_149_15928.vasp,ScCuSb2S6,-2.601910137,0.3578788727499953 -Mn1Cu1Se2Br2_1_10692.vasp,MnCuSe2Br2,-0.9178079883333333,0.37016004910714134 -La2Se2_12_9613.vasp,La2Se2,-3.887229145,0.31504651000000017 -Ni1C6S4F8_10_13304.vasp,NiC6S4F8,-3.678787981052632,0.3415218910526229 -Te4Au4_2_18578.vasp,Te4Au4,-0.23800374375,0.19063290375000003 -Ni2S2_123_13588.vasp,Ni2S2,-0.91260253,0.5158584933333317 -Mg2Bi4O8_11_10431.vasp,Mg2Bi4O8,-3.86899415,0.003004057142854011 -Sc2Nb3Te2Pt1Au1Se5I1_1_16109.vasp,Sc2Nb3Te2PtAuSe5I,-3.048872928,0.11336759030863375 -Te1Pb1Se1_1_18320.vasp,TePbSe,-1.2835533733333333,0.5403513078472206 -Ga1Ag1P2S6_149_6116.vasp,GaAgP2S6,-2.77179572,0.05300970711978953 -Ni1B4C2I2F4_47_13267.vasp,NiB4C2I2F4,-3.583032736923077,0.39887182522434883 -Zn2Se1S1N1_1_21164.vasp,Zn2SeSN,-1.527690898,0.3357246058000003 -Cr1Br2_115_4131.vasp,CrBr2,-1.0405074566666668,0.4362696922222208 -Ru1S1F2_47_15288.vasp,RuSF2,-2.512112295,0.3517095724166647 -La2C2Br2_12_9584.vasp,La2C2Br2,-4.633481571666667,1.662110140555549 -Sn2Te2Br2_59_16888.vasp,Sn2Te2Br2,-1.1585879916666666,-0.3012185797222231 -Nb1Mo1Cl4_6_12532.vasp,NbMoCl4,-2.6435923133333334,0.3606273095370298 -Nb3Te1I7_156_13024.vasp,Nb3TeI7,-2.0658098918181818,0.09056094818181837 -Mn1Te2W1O1_8_10910.vasp,MnTe2WO,-2.935367078,0.7121710015918299 -Te12N12_7_18275.vasp,Te12N12,-3.1652564954166666,0.38751169416666686 -Mg2Bi8O18_13_10434.vasp,Mg2Bi8O18,-3.6236047885714284,0.16386853008927862 -Sn2Sb2H2S6_7_16856.vasp,Sn2Sb2H2S6,-2.4226919099999997,0.3748827852083312 -Mo2Br10_3_11568.vasp,Mo2Br10,-0.7599966225,0.26015287666666664 -Te1O1_6_18313.vasp,TeO,-2.45678758,0.6760890213541668 -Mo2N1_164_11636.vasp,Mo2N,-3.8233141366666668,1.584278597777772 -Sc3Zn1Bi1Br2O7_1_16221.vasp,Sc3ZnBiBr2O7,-4.2010964657142855,0.36069339437499 -Ga1Cu1Te6P2_149_6180.vasp,GaCuTe6P2,-1.624727328,0.3335178660476156 -Ni2Au1O4_187_13458.vasp,Ni2AuO4,-2.3058817285714284,-0.37283052348214507 -Pd2S4_14_14477.vasp,Pd2S4,-2.1990428833333335,0.11876932083333314 -K2Cd4Te2S6Br6_31_9070.vasp,K2Cd4Te2S6Br6,-0.8482278035,0.21673421841666418 -Fe1Cu2O8F6_2_5673.vasp,FeCu2O8F6,-2.243976875882353,0.15503924529411361 -Li2H4N2O6_7_9939.vasp,Li2H4N2O6,-4.514541397142858,0.03539148219046678 -Be2P1_25_2263.vasp,Be2P,-2.757624573333333,0.8525954222916642 -Mo1Os1Cl6_5_11531.vasp,MoOsCl6,-1.94285145625,0.007541546406242716 -Fe2As2Se6_162_5789.vasp,Fe2As2Se6,-2.19990916,0.24537423349999776 -Nb4Fe2Te10_59_13071.vasp,Nb4Fe2Te10,-2.6815411875,0.3016881461458327 -Te1Mo1Se1_156_18306.vasp,TeMoSe,-2.4108537266666668,0.16730000999999994 -K2Cd1N12_12_9040.vasp,K2CdN12,-5.0395353,-0.29763851834615807 -V3C2Se2F2_1_20253.vasp,V3C2Se2F2,-3.9570283822222225,0.49170727205760123 -Na1I2_25_11878.vasp,NaI2,-0.4173694266666667,-0.14954475270833367 -Cu2H4Se2O10_2_5132.vasp,Cu2H4Se2O10,-3.351803538888889,0.16798197141203142 -Sb2Se2Br2_59_15690.vasp,Sb2Se2Br2,-1.7195684599999999,0.11224452250000017 -Ag4H4S4Br4_2_519.vasp,Ag4H4S4Br4,-1.34066361875,0.1505101508593749 -Na2Hg4Te2S6I6_31_12177.vasp,Na2Hg4Te2S6I6,-0.4851969005,0.08920461835416782 -Sn2Se1S1_6_16875.vasp,Sn2SeS,-2.14183209,-0.12177779187499993 -Tm2Br6_162_19673.vasp,Tm2Br6,-2.27699984125,0.052490530000000035 -P6S12F2_4_14145.vasp,P6S12F2,-2.9598774015,0.2826695792916569 -Pb2F2_164_14244.vasp,Pb2F2,-1.7120669025,0.6342211874999999 -Sr1Ge1S2_1_17050.vasp,SrGeS2,-3.0284102575,0.11433862406249995 -Co2H2S4_11_3911.vasp,Co2H2S4,-2.9759440075,0.04791944515625013 -Au1I1_187_1427.vasp,AuI,0.833298795,0.3195758737500001 -Fe2Te4P2I2_10_6019.vasp,Fe2Te4P2I2,-1.483865911,-0.4594128342500001 -Fe2Bi2Te4I2_26_5814.vasp,Fe2Bi2Te4I2,-1.007023871,0.39481105350000023 -Ir2Se6_11_8848.vasp,Ir2Se6,-2.342964625,0.5053532677777753 -Nb2Se4Cl4_2_12882.vasp,Nb2Se4Cl4,-2.998307054,0.046736371523802944 -K2H2C2O4_51_9117.vasp,K2H2C2O4,-4.576735598,0.21930796916665862 -Ag2Sb4S3Cl2_6_411.vasp,Ag2Sb4S3Cl2,-1.5539735509090908,0.26026177075757356 -Mn2Se1I2Br1_1_11270.vasp,Mn2SeI2Br,-1.2166631416666667,0.041695518541666865 -Rh2S6_7_15230.vasp,Rh2S6,-2.70292377375,0.48164146536458086 -Rb2B10H16O24_30_14769.vasp,Rb2B10H16O24,-5.414384668076924,0.06550937161858394 -U1C1O5_25_19695.vasp,UCO5,-7.007854514285714,0.0774736485714298 -Hf3B2H2O2_187_7678.vasp,Hf3B2H2O2,-5.874016984444444,0.56639410055555 -Bi4Te4I4O12_14_2651.vasp,Bi4Te4I4O12,-3.0392392470833336,0.024166093541666323 -Cu1Br1_187_4859.vasp,CuBr,0.08038138,0.46006067500000003 -Tl2Zn2S5_156_19569.vasp,Tl2Zn2S5,-1.2982804155555554,0.2314773513055543 -Tl2Cl2O2_59_19388.vasp,Tl2Cl2O2,-1.8053845300000002,0.037591306666666435 -Te4Pb6Br4O12_12_18612.vasp,Te4Pb6Br4O12,-2.994120213076923,0.15778228269230787 -Al3Rh1_187_1050.vasp,Al3Rh,-1.9029235075,1.2319231479687474 -Yb1Se2_164_20859.vasp,YbSe2,-3.18483868,-0.2657371155555581 -Pb6N6_2_14330.vasp,Pb6N6,-3.0299067625,0.4010616087500002 -Mn1Ga1Cu1Ir1Se7S1_1_10718.vasp,MnGaCuIrSe7S,-2.1227610599999998,0.2757300305786995 -Ga1Ag1As2S6_149_6110.vasp,GaAgAs2S6,-2.3941220349999996,0.4630356101874977 -Os1Br2O1_47_13790.vasp,OsBr2O,-2.6932398175,0.0688400025 -Ag2Hg2Te2Br2_26_305.vasp,Ag2Hg2Te2Br2,0.3570643475,1.0996058796874986 -V4H2C3S2_164_20326.vasp,V4H2C3S2,-4.823610266363636,0.058458291944431306 -Rh1S2_115_15165.vasp,RhS2,-2.3968885666666666,0.7838793366666639 -Fe2Te6P2_162_6026.vasp,Fe2Te6P2,-1.8405314099999999,0.2737414985000003 -K4O12_13_9486.vasp,K4O12,-2.75218431125,0.18283860781249994 -Sb2Pt1_123_15659.vasp,Sb2Pt,-2.1138140366666667,0.5838564199999996 -Ir1S2_115_8757.vasp,IrS2,-2.81771689,0.2716380433333332 -Li2Mn2P2_129_9999.vasp,Li2Mn2P2,-3.05431917,0.11292422928571105 -Mn1Nb1Se2Br2_6_10812.vasp,MnNbSe2Br2,-2.731888888333333,0.03737931083333379 -Ba3Ni2Br2O5_123_2119.vasp,Ba3Ni2Br2O5,-3.0815935908333336,-0.12582132666666956 -Th4Br16_14_18731.vasp,Th4Br16,-2.62596327,0.02989327899999994 -K4Sb4S8_14_9509.vasp,K4Sb4S8,-2.228792666875,0.12357887062499984 -Ta1Te2Ir1_5_17626.vasp,TaTe2Ir,-3.5115823875,0.4101656836458336 -Al2Si2H4O9_1_980.vasp,Al2Si2H4O9,-5.5862884929411765,-0.3558707870098088 -Ni2N4_2_13541.vasp,Ni2N4,-4.083407158333333,0.06575992333332975 -Ta2Pt1O6_12_17834.vasp,Ta2PtO6,-6.171740204444444,0.15545568152776928 -Cd1H10C14S2N6_2_3318.vasp,CdH10C14S2N6,-5.686662179090908,-0.10042004411616434 -Ba2Si2Ni2_129_2059.vasp,Ba2Si2Ni2,-1.4934900566666667,0.12072340333333198 -Tb2Br6_59_18186.vasp,Tb2Br6,-2.31854971,0.038379987499999935 -V2O2_129_20123.vasp,V2O2,-4.7559502075,0.7768799358333288 -Hf4B3H2S2_164_7764.vasp,Hf4B3H2S2,-5.432504739090909,0.2365637499999842 -Lu2Se2F2_164_10317.vasp,Lu2Se2F2,-3.984933111666667,-0.02796762000000408 -Mn1Cu1Se4_1_10693.vasp,MnCuSe4,-1.5818399316666667,0.2857117035185168 -Ca1Au2F12_115_2802.vasp,CaAu2F12,-1.1911837660000002,0.014081369999999982 -Re2S2_187_15076.vasp,Re2S2,-5.143454755,0.4866006981250006 -Ge2C2Cl2_59_6761.vasp,Ge2C2Cl2,-3.1797907616666667,0.8714107641666627 -Nb4Si2Te8_55_13157.vasp,Nb4Si2Te8,-3.552489428571428,0.06362689535714328 -As1_123_1183.vasp,As,-2.43870876,0.7724758 -Cd2Bi2S4Cl2_11_3472.vasp,Cd2Bi2S4Cl2,-1.3127824179999998,0.2007475690000004 -Te1Au2O4_21_18287.vasp,TeAu2O4,-2.0504307685714287,0.42757906642857035 -Ag2P4S3Br2_6_359.vasp,Ag2P4S3Br2,-2.136194127272727,0.12334659352272626 -Na2S4I2F8_2_12292.vasp,Na2S4I2F8,-1.673947743125,0.19375404126953122 -Ag2As2S6_2_157.vasp,Ag2As2S6,-1.9322175529999999,0.2607743433749977 -Pd1C6O4F8_10_14352.vasp,PdC6O4F8,-4.260830484736842,0.3812303331578835 -Cd4Cl8_115_3624.vasp,Cd4Cl8,-0.21315901583333333,0.19123533750000002 -Sn1F2_164_16629.vasp,SnF2,-2.4226505733333332,0.2636285625000001 -Ge2Sb2O6_162_6850.vasp,Ge2Sb2O6,-4.293497443,0.23337707658333104 -Ba2Zn1_123_2088.vasp,Ba2Zn,0.8498222733333334,0.2600155316666667 -Te2Pb3I1Br1_1_18461.vasp,Te2Pb3IBr,-1.1093444728571429,-0.7338336208333338 -Ba2Bi4S8_11_1922.vasp,Ba2Bi4S8,-2.6647929178571426,0.17101631214285717 -Zn1Ga2Te4_156_20940.vasp,ZnGa2Te4,-1.1620434957142858,-0.4421689428571429 -Sb2Te4Au2_26_15729.vasp,Sb2Te4Au2,-0.860647185,0.3358049548437484 -Ti2Ni2O6_147_18971.vasp,Ti2Ni2O6,-4.5778183519999995,0.5108339009999998 -Cr1Ge1Se1S1I1Br1_6_4180.vasp,CrGeSeSIBr,-2.082797135,0.04224221263888883 -Bi2As2O8_11_2417.vasp,Bi2As2O8,-4.12788737,0.21401628666666728 -Si2As6_164_16385.vasp,Si2As6,-3.06229454,-0.6183844987500002 -Zr2Se2_129_21678.vasp,Zr2Se2,-3.6562372025,0.23556313250000027 -Tl1Cl2_164_19243.vasp,TlCl2,-0.68411991,-0.04491171500000002 -As4Pb2S8_26_1346.vasp,As4Pb2S8,-2.737470294285714,0.3844378904365051 -Sb2P4O12F2_1_15632.vasp,Sb2P4O12F2,-4.1397174905,0.9575239329999963 -Mg5H2O6_164_10593.vasp,Mg5H2O6,-4.5151769815384615,-0.377398668461542 -Bi2I2O2_59_2464.vasp,Bi2I2O2,-2.2675172783333335,0.2060531866666664 -W2S2I2_59_20529.vasp,W2S2I2,-2.931037791666667,0.340606809861111 -Nb1Bi1Sb1S1I2_1_12471.vasp,NbBiSbSI2,-2.0801481533333335,0.2970066678472168 -Nb2Pd2Se10_51_12815.vasp,Nb2Pd2Se10,-2.8457375792857142,0.07692892510203575 -W2C1_164_20474.vasp,W2C,-5.724302563333333,1.033819116666661 -Sb1Pb2S6_162_15478.vasp,SbPb2S6,-2.2338992288888893,-0.2861426529513914 -V3H2N2O2_187_20266.vasp,V3H2N2O2,-5.2813182577777775,0.10209163981480951 -Ba2Au1S2F2_38_1909.vasp,Ba2AuS2F2,-2.4259440999999997,0.5217743853571402 -Ba2H2I2_129_1993.vasp,Ba2H2I2,-2.130431321666667,0.04703759499999993 -Ga1Cu1As2Se6_149_6161.vasp,GaCuAs2Se6,-1.9722333549999997,0.28456061033333147 -Cu6Se6O18_2_5500.vasp,Cu6Se6O18,-2.937104045,0.14335038712499698 -Ag2F2_2_256.vasp,Ag2F2,-0.4361020825,0.3099450725 -Zr2N1O2_164_21605.vasp,Zr2NO2,-6.997411778,0.11211601600000076 -Hg2Ru6O12_10_7990.vasp,Hg2Ru6O12,-3.3210593860000004,0.9008033598793084 -Nb2Te2_164_12916.vasp,Nb2Te2,-3.453168505,0.1795037258333294 -Be1As2H4S4_5_2212.vasp,BeAs2H4S4,-3.044423782727273,0.10836190562499093 -Mn1Se2_164_10879.vasp,MnSe2,-2.13434782,0.1606757933333336 -Mn1As1Se1Cl3_1_10634.vasp,MnAsSeCl3,-1.5682514933333334,0.40752462249999755 -Ca1Pb2_164_2869.vasp,CaPb2,-0.3588341466666667,-0.13931634500000017 -Li2Cu2O4_8_9890.vasp,Li2Cu2O4,-2.9772547675,0.17288735000000033 -Tl1In1Hg1Te4_156_19297.vasp,TlInHgTe4,-0.5406661114285715,0.41298605047618886 -Cu2P4S3Br2_6_5220.vasp,Cu2P4S3Br2,-2.2699774254545457,0.16496263590908833 -Na1Cl2_25_11841.vasp,NaCl2,-1.0133859366666667,0.4418050279166654 -P4O8_11_14093.vasp,P4O8,-5.312580436666667,0.08097973566666317 -Zr2Sn2Se8_31_21693.vasp,Zr2Sn2Se8,-2.9828917041666667,0.10748681958333073 -Co1C6S4F8_10_3721.vasp,CoC6S4F8,-3.8303883805263155,0.39713374521928924 -Ba2Mg2Sn2_129_2022.vasp,Ba2Mg2Sn2,0.044245211666666666,1.0357464908333334 -Te2Pb2_59_18459.vasp,Te2Pb2,-1.2310011825,-1.2917683575 -Sn2As2S6F2_7_16726.vasp,Sn2As2S6F2,-2.497273105,0.5153351224739526 -Mn2Bi2Te4F2_26_11024.vasp,Mn2Bi2Te4F2,-1.619242338,0.37648550513792906 -Ga8Se6_31_6592.vasp,Ga8Se6,-2.144355282142857,0.0841652928571417 -Rb1Mg6B1O7_99_14743.vasp,RbMg6BO7,-3.8505661633333332,0.13677666881312822 -Sb4O10_6_15780.vasp,Sb4O10,-3.947706747142857,0.35935344714285744 -Mn2Mo2I2O8_129_11138.vasp,Mn2Mo2I2O8,-3.929195775714286,0.1454791870535712 -Mn1V1I1Br1O1_6_10921.vasp,MnVIBrO,-2.576399614,0.21918249068333095 -Sc2Br2N2_59_16038.vasp,Sc2Br2N2,-4.191738268333333,0.20615742249999647 -Ge2As2Cl2O6_7_6731.vasp,Ge2As2Cl2O6,-3.801881123333333,0.24330655041666693 -Li1Co5O5F1_156_9680.vasp,LiCo5O5F,-3.0069778975,0.42592281833333034 -Nb2P2S6_2_12807.vasp,Nb2P2S6,-4.135970871,-0.13682363802778053 -Mo3C2S2_187_11705.vasp,Mo3C2S2,-4.722559235714286,0.21610343499999574 -N4_11_11800.vasp,N4,-5.87845938,-0.3447087574999994 -K2Hg4S8Br6_31_9182.vasp,K2Hg4S8Br6,-0.706982381,0.19764432322916659 -Cu1Bi1Sb2Se6_143_4853.vasp,CuBiSb2Se6,-1.707588866,0.31045399505555166 -Li4Sb4S8_29_10226.vasp,Li4Sb4S8,-2.918995595625,0.08125376312499988 -Na2H4C2O6_7_12107.vasp,Na2H4C2O6,-4.576327825714286,0.3629412849702265 -Li2Ir1_187_9965.vasp,Li2Ir,-2.1503749666666665,1.4382522433333338 -Os1O2_187_13810.vasp,OsO2,-4.274068906666667,1.2287090999999997 -Mn1Fe1I2_6_10708.vasp,MnFeI2,-0.17759578,0.91327539875 -Rh1Cl2_164_15148.vasp,RhCl2,-1.1888121633333333,0.4498777666666651 -Cu2Ir2Br4O6_1_5181.vasp,Cu2Ir2Br4O6,-2.1396943792857144,0.38831340803570896 -Rb2Hg4S8Br6_31_14872.vasp,Rb2Hg4S8Br6,-0.7278729979999999,0.2078492188125003 -Ti2N1F2_164_18965.vasp,Ti2NF2,-6.290304904,-0.40534680983334015 -Na1Cd1H1S1O1_1_11840.vasp,NaCdHSO,-2.311572878,0.19761310750000022 -Ni3Bi6_2_13697.vasp,Ni3Bi6,-0.4568103044444444,0.4283471638888889 -Cr1O2_115_4222.vasp,CrO2,-4.753082103333333,0.0649137510416633 -Fe2Te2I2_59_5997.vasp,Fe2Te2I2,-0.7309654733333333,0.08400789625000005 -W2C1Se2_12_20473.vasp,W2CSe2,-5.034798328,-0.3485505319999995 -Rb2Cu4I6_51_14837.vasp,Rb2Cu4I6,-0.05465035666666667,0.10715710166666559 -Ag4Se2_4_560.vasp,Ag4Se2,-0.043981291666666665,0.187633895 -Nb1Ag1Se1I2_1_12462.vasp,NbAgSeI2,-1.5478195,0.3059181480000004 -Mg2Co2Si2_129_10442.vasp,Mg2Co2Si2,-2.1389800283333336,0.02696341388888676 -Al2Bi6_164_771.vasp,Al2Bi6,-1.08802438875,-0.1318781762500001 -Mo2Br2N2_59_11570.vasp,Mo2Br2N2,-3.7848747333333335,0.2343434920833336 -Fe1Ag1S2_156_5614.vasp,FeAgS2,-1.344484825,-0.0732336050000002 -Ta2Cl6_162_17697.vasp,Ta2Cl6,-3.06429693375,0.26197062812500016 -Na1Al1Te6As2_5_11819.vasp,NaAlTe6As2,-1.742529216,0.28269584766666495 -Ni2As4Br4O6_2_13453.vasp,Ni2As4Br4O6,-2.849997036875,-0.06356121187500019 -Cu2Te2_59_5339.vasp,Cu2Te2,-0.4552262275,0.11225430749999993 -Ti1Zn1Bi2O6_99_18873.vasp,TiZnBi2O6,-3.737234583,0.8706947744999955 -V1Te2_164_19942.vasp,VTe2,-2.2665219133333334,0.10071914444444419 -Mg4_129_10592.vasp,Mg4,0.1712065975,-0.24304181083333332 -V3H2S2N2_6_20268.vasp,V3H2S2N2,-4.565038401111111,0.02421421237372834 -Sb8Cl4O10_14_15864.vasp,Sb8Cl4O10,-3.547319157272727,0.12508915954545463 -Sr4Te4O12_14_17479.vasp,Sr4Te4O12,-4.066266384,0.1117852414999998 -Al18S9_143_588.vasp,Al18S9,-2.5315980018518522,0.6231122491203671 -As2P2S6_7_1240.vasp,As2P2S6,-3.052100291,0.16255859771590261 -Ni2F4_2_13504.vasp,Ni2F4,-1.46138498,-0.18983919166666685 -V2Si2Se6_162_20195.vasp,V2Si2Se6,-3.170152837,0.10041811891666685 -Cu2S4I2_4_5259.vasp,Cu2S4I2,-1.17224607,0.07576541999999997 -As1Pb1Se2Br2_6_1158.vasp,AsPbSe2Br2,-1.5987141633333335,0.2764239773611086 -Y4Br10_11_20809.vasp,Y4Br10,-2.88503735,0.08492889333332732 -Ba2Ni2Ge2_129_2034.vasp,Ba2Ni2Ge2,-1.1268996733333334,0.20045275333333312 -Ni2Br6_191_13484.vasp,Ni2Br6,0.25824317625,0.22295158875 -Ca2Ag1S2Br2_123_2906.vasp,Ca2AgS2Br2,-1.700307337142857,0.24514724852678177 -Re6Te8I2_2_15137.vasp,Re6Te8I2,-3.56209504875,0.02019975160713905 -Ta4S12I2_2_18098.vasp,Ta4S12I2,-3.9840916672222217,0.20903383270833054 -Sb4Br12_14_15771.vasp,Sb4Br12,-1.040237000625,0.058601620625000184 -Li2H2Pt1_47_9930.vasp,Li2H2Pt,-2.708981838,0.005428690000000014 -Ba1U1_156_1876.vasp,BaU,-2.43876853,1.9427438124999998 -As1Se1I1_156_1178.vasp,AsSeI,-1.6842293799999999,0.09312695000000004 -Al2Si2O9_1_983.vasp,Al2Si2O9,-5.489343212307692,0.3212435086538361 -Ti1Nb1S4_10_18807.vasp,TiNbS4,-4.946838015,0.10472863791666187 -K4Zr6C1Br18_2_9534.vasp,K4Zr6CBr18,-2.449621593793103,0.06381531068965529 -La2Te6_59_9619.vasp,La2Te6,-2.66232173625,-0.6139124637500002 -Yb2I2F2_129_20877.vasp,Yb2I2F2,-2.6501507383333336,0.05714917833333333 -Ag2C2N4Cl2F4_2_217.vasp,Ag2C2N4Cl2F4,-2.759891377142857,0.8451298177976156 -Na2C4O2_31_12007.vasp,Na2C4O2,-4.8961429325,0.9639935543749998 -Re1F2_115_15000.vasp,ReF2,-3.39305939,0.6978237811111072 -Pr2Te6_129_14555.vasp,Pr2Te6,-2.594872795,-0.6472742525000001 -Cu4I2O6_11_5426.vasp,Cu4I2O6,-1.7361973516666669,0.5629372921874976 -W4O10_59_20589.vasp,W4O10,-5.761041356428572,0.4531007406851242 -Ta3Te1I7_156_17998.vasp,Ta3TeI7,-2.35015264,0.06083096096353935 -Hf2I2_164_7519.vasp,Hf2I2,-3.274176715,0.275152872499997 -Al1Ag1Te6As2_149_604.vasp,AlAgTe6As2,-1.550299106,0.23158066216666512 -Hg2As2O6_147_7923.vasp,Hg2As2O6,-2.665877235,0.4451187639999943 -Sr4As2_59_17403.vasp,Sr4As2,-1.3348826166666665,0.4186327361111095 -Zn2P4O8_4_21135.vasp,Zn2P4O8,-4.371163480714285,0.2026569744285675 -Au2Se2F2_59_1543.vasp,Au2Se2F2,-0.64862969,0.6383494977083315 -P4W2O12_4_14127.vasp,P4W2O12,-5.548182473333333,0.22339830219443468 -Cu1Bi1P2Se6_149_4851.vasp,CuBiP2Se6,-2.17650984,0.07310689050000008 -Mn1Pd1Cl4O2_65_10843.vasp,MnPdCl4O2,-1.92646272,-0.03031506999999989 -Ge2Se2_164_6873.vasp,Ge2Se2,-2.83598366,0.064309685 -Ni2Cl4_2_13498.vasp,Ni2Cl4,-0.5677856033333334,-0.2582902766666667 -Ir2I2_164_8790.vasp,Ir2I2,-0.9506295275,1.3480883599999982 -Ba2Cu1Te2I2_38_1977.vasp,Ba2CuTe2I2,-1.3078468514285715,0.20072706071428287 -W2Se2N1_8_20546.vasp,W2Se2N,-4.861524524,-0.43921729466666637 -C2N4_113_2751.vasp,C2N4,-6.740477925,-0.1910972519444507 -K8Tl10Zn1_89_9557.vasp,K8Tl10Zn,0.6489516352631579,0.20857580052631586 -Ta4O10_31_18077.vasp,Ta4O10,-7.214361617142857,0.03122277857142919 -Be2Ir1_123_2259.vasp,Be2Ir,-3.4572677866666663,0.726629593333334 -Sc1Cl2_187_15920.vasp,ScCl2,-2.7539429033333334,0.13554466777777474 -Sb4Au2S3F2_6_15765.vasp,Sb4Au2S3F2,-1.5852927572727273,0.901831077272723 -Hg12Te4Br16_29_7833.vasp,Hg12Te4Br16,0.4977560490625,0.067277840625 -Zr2S1I2N1_1_21639.vasp,Zr2SI2N,-3.8611301050000004,0.44157550499999965 -Sn4Bi8_26_16937.vasp,Sn4Bi8,-1.1435114958333334,-1.7014073274999997 -Y2I2O2_129_20743.vasp,Y2I2O2,-5.150571243333333,0.051458961666666525 -Mn1Ge1S1I2O1_1_10737.vasp,MnGeSI2O,-2.161075015,0.3869684774999966 -Hf3N2O2_187_7721.vasp,Hf3N2O2,-7.880810981428572,0.13172865714284976 -Cs2Cd4Se2I6O6_31_4694.vasp,Cs2Cd4Se2I6O6,-1.3206692565,0.13674189933333314 -Ta1F5_47_17543.vasp,TaF5,-4.018171791666666,0.34878450750000045 -Ho2Br2_164_8127.vasp,Ho2Br2,-2.1661176925,0.08741404638888695 -W1Au1I3Cl1O1_1_20409.vasp,WAuI3ClO,-1.5675352557142859,-0.22255830101786298 -Na2Mg1Te2O8F4_2_12200.vasp,Na2MgTe2O8F4,-2.7782281911764706,0.5920230274999938 -Te10Ir5_2_18266.vasp,Te10Ir5,-2.217632528,0.22586983199999988 -Co4P8H44C8N4O32_14_4083.vasp,Co4P8H44C8N4O32,-4.7979255461,0.11703869728332639 -Pb2S2I1Cl1_1_14274.vasp,Pb2S2ICl,-1.4623184066666666,-0.22764358482639063 -Sr2Tl1Ag1Hg1S5_99_17331.vasp,Sr2TlAgHgS5,-1.584751405,0.1440810675624975 -Cu2Br2O2_59_5049.vasp,Cu2Br2O2,-1.1597565516666666,0.21241757708333198 -Tl4Sn2S6_10_19631.vasp,Tl4Sn2S6,-1.9343271216666666,0.05360087875000019 -As2Au2O4_26_1185.vasp,As2Au2O4,-2.747251845,0.9579837165624957 -Tl2I2_59_19436.vasp,Tl2I2,-0.34727968,0.09093312750000004 -Cs2Hg4Br6O8_31_4725.vasp,Cs2Hg4Br6O8,-1.008087797,0.2760358285833332 -Na1Te1H6O6F1_143_11939.vasp,NaTeH6O6F,-3.8378357026666667,0.1405421286666666 -P1Cl1O1_156_13916.vasp,PClO,-2.9290123033333333,0.7886630675555484 -Ba4Bi4Te8F4_12_2145.vasp,Ba4Bi4Te8F4,-2.2789636915,0.14552555499999775 -Ag2Sb2S4_26_400.vasp,Ag2Sb2S4,-1.73773378375,0.19845895125000013 -V1Mo1Se1S3Br2_1_19883.vasp,VMoSeS3Br2,-2.5134613375,0.3352375867013869 -Ti1Ru3S4I1Br3_1_18833.vasp,TiRu3S4IBr3,-2.8709042116666663,0.17249561999999768 -Ba4Bi4H4S8_14_2139.vasp,Ba4Bi4H4S8,-2.72530252,0.12319861256249741 -Os1S1Cl2_47_13816.vasp,OsSCl2,-2.30080495,0.32441987281250007 -Mn1Fe1Br1O1_156_10706.vasp,MnFeBrO,-2.1250868675,0.6611973023437501 -Ag2S4_11_394.vasp,Ag2S4,-0.9835767766666667,0.5345374663541668 -Cu2Se2I2_59_5300.vasp,Cu2Se2I2,-0.31784368166666666,0.23599225138888832 -Ti2S10_59_18989.vasp,Ti2S10,-3.7641118616666667,0.13727675062499634 -Co1H4C6I2N2_25_3761.vasp,CoH4C6I2N2,-5.059326974666666,0.1729321097777642 -Cd1Te2H2_5_3438.vasp,CdTe2H2,-1.214663166,0.6822475773333336 -Mn1Cu1H1Ir1I1O6_1_10685.vasp,MnCuHIrIO6,-3.2930113863636366,0.4329477509090849 -Li2Ni5Pd1Se3S8Br1_1_10030.vasp,Li2Ni5PdSe3S8Br,-1.699301986,0.205570007057287 -K2Ru2C2S4I8_31_9319.vasp,K2Ru2C2S4I8,-1.71791879,0.424508900763887 -Li3As1_187_10144.vasp,Li3As,-2.40014559,0.2663052349999999 -In4Se2S2I1Br3_1_8690.vasp,In4Se2S2IBr3,-1.5813165016666666,0.07153298067708352 -Cr4P4S12_11_4619.vasp,Cr4P4S12,-3.2988887814999996,0.16576192824999714 -W1F2_115_20431.vasp,WF2,-3.1190913499999997,1.1048660374999963 -V1Fe1Ge1Se1S2Br2_1_19830.vasp,VFeGeSeS2Br2,-2.4204910375,0.11957769374999638 -Hf2Mo1S2I2_1_7531.vasp,Hf2MoS2I2,-3.3467444942857143,0.7847763699999902 -Zn2P4W2O14_2_21139.vasp,Zn2P4W2O14,-4.892379375,0.27381182274999494 -Tc6Cl18_164_18259.vasp,Tc6Cl18,-2.8521970775,0.06115273124999998 -Na6H2S2O8_11_12439.vasp,Na6H2S2O8,-3.76173752,0.09523978694444157 -Ag2As2Se4_26_158.vasp,Ag2As2Se4,-1.5139228,0.1803331783333314 -Cr2Br4_14_4334.vasp,Cr2Br4,-1.6962142550000001,-0.21943710611111256 -Cs1Pb1Se2_156_4648.vasp,CsPbSe2,-1.2209726525,0.4487383125520834 -Pt2C8_65_14609.vasp,Pt2C8,-5.063185381,2.1042345350000002 -Nb2Cl8_1_12687.vasp,Nb2Cl8,-2.511335485,0.2025579555000001 -Sb4Pd4Se4_13_15807.vasp,Sb4Pd4Se4,-1.845668215,0.4121957258333335 -Te6As2Pd2_12_18644.vasp,Te6As2Pd2,-1.553005623,0.26942760359999796 -V2B1Te2_12_19995.vasp,V2BTe2,-3.422262636,0.29001841666666106 -Ti1Bi2_187_18745.vasp,TiBi2,-2.8296944866666665,0.5333522324999969 -Al1Co5I2_123_634.vasp,AlCo5I2,-1.29209959375,0.34231625541666466 -Ni1B6C2Br2F4_25_13276.vasp,NiB6C2Br2F4,-3.822194048,0.5931462264166543 -Si4H4O10_7_16491.vasp,Si4H4O10,-5.692771881666667,0.01590713120369802 -Li2B2Se5_5_9838.vasp,Li2B2Se5,-3.045659572222222,0.27420803222222245 -Si2Br2N2_59_16390.vasp,Si2Br2N2,-4.354271953333334,-0.3068168216666698 -Ca2Fe1O3_38_3015.vasp,Ca2FeO3,-4.083479306666667,-0.030257752500002996 -V4S10_11_20356.vasp,V4S10,-3.364331125,0.25284765767856787 -As2W2Se6_12_1311.vasp,As2W2Se6,-2.977711579,0.13991861866666389 -K4Hg2Cl8_11_9460.vasp,K4Hg2Cl8,-0.6554446721428572,0.16426806214285594 -Na2H2O2_6_12101.vasp,Na2H2O2,-3.5644259983333337,0.12327483666666605 -Hf1Se1O1_156_7305.vasp,HfSeO,-5.93325282,0.3244032608333338 -Bi8O16_26_2688.vasp,Bi8O16,-3.54394845625,0.22360238968749702 -Ba2S8I4_125_2052.vasp,Ba2S8I4,-1.7356037828571427,0.4222683567857126 -Zr1Bi1As1_156_21251.vasp,ZrBiAs,-3.0164953466666664,0.34048366916666395 -Pd2Au1O4_187_14394.vasp,Pd2AuO4,-2.3090110328571427,0.18642970428571282 -Pd2N2Cl2_59_14439.vasp,Pd2N2Cl2,-2.195496735,0.3614776447222196 -S10N10_26_15377.vasp,S10N10,-4.192796911,-0.11697920006250007 -C1Br2_164_2722.vasp,CBr2,-1.2572087433333332,1.4439229999999978 -K2V2H8S2O16_4_9387.vasp,K2V2H8S2O16,-4.420688419333334,0.09908169727777838 -Sb3Te6Au1_143_15759.vasp,Sb3Te6Au,-1.207790438,0.24928770556249913 -Ag1Se2_12_129.vasp,AgSe2,-0.7993886033333334,-0.45709177500000003 -Bi2Se1S2_164_2536.vasp,Bi2SeS2,-2.291426288,-0.44062129449999965 -Si3P2S9_174_16475.vasp,Si3P2S9,-3.46407439,0.24001517693080032 -Mg2Cu2_191_10449.vasp,Mg2Cu2,0.5386698475,0.24747656250000002 -Ni1I2_164_13363.vasp,NiI2,0.51346752,0.08415662333333324 -Au2S5_21_1531.vasp,Au2S5,-1.2420587457142855,0.45805677687499846 -Cr2Cl2_164_4352.vasp,Cr2Cl2,-2.0651734875,0.7912473908333308 -Nb4Ni6S10_59_13106.vasp,Nb4Ni6S10,-3.0928809680000002,0.1900672389999969 -Cd1Bi1_156_3283.vasp,CdBi,1.341413135,0.168448025 -Cu1Pb1Br2O2_1_4935.vasp,CuPbBr2O2,-1.6708347483333332,0.12507389000000013 -Sc1S1I1Br1_1_15986.vasp,ScSIBr,-2.18019989,0.42469960658854017 -Mn3Se1S2Br4_1_11408.vasp,Mn3SeS2Br4,-1.705728093,0.30292460008333233 -P2Pb2S6Cl2_7_14012.vasp,P2Pb2S6Cl2,-2.5596298650000002,0.15170364351561932 -Sr2H18Cl2O10_2_17230.vasp,Sr2H18Cl2O10,-4.1362254728125,0.029181368958333564 -Bi2Mo3_1_2474.vasp,Bi2Mo3,-2.022819768,1.385469456 -Mn1Bi3_6_10655.vasp,MnBi3,-1.0103667075,-0.1458248105603448 -V3Se2N1O12_143_20290.vasp,V3Se2NO12,-4.605814866111111,0.2009593373055505 -Y1Hg1Se2Br2_1_20640.vasp,YHgSe2Br2,-1.7373420849999999,-0.053350562500001475 -Mg3Ga3_156_10549.vasp,Mg3Ga3,-0.8446477899999999,0.19572032250000004 -W2Br6_189_20467.vasp,W2Br6,-1.56880376375,0.46612901593749956 -Sc2P2Se8_2_16122.vasp,Sc2P2Se8,-3.066552249166667,0.17885467322916304 -Co2Bi4I4O6_11_3871.vasp,Co2Bi4I4O6,-2.508492266875,0.06932050089961966 -Zr2Pb4_59_21632.vasp,Zr2Pb4,-1.7078882183333333,0.7306876433333305 -Al13N2_12_586.vasp,Al13N2,-2.856377279333333,0.6102393283333285 -Ta1Mn1Mo1Se2N1Cl2_6_17564.vasp,TaMnMoSe2NCl2,-3.621935555,0.3776215966666667 -Al1Cd1In1Se4_156_625.vasp,AlCdInSe4,-1.8183657814285714,-0.0649575457142858 -V1W3O8_25_19963.vasp,VW3O8,-6.006473129166667,0.06631570530611748 -Rh1Br2_115_15143.vasp,RhBr2,-0.5503665566666667,0.7368797544444433 -Sb1F5_47_15452.vasp,SbF5,-2.08836661,0.3652897608333334 -Ni3Te8As2_164_13736.vasp,Ni3Te8As2,-0.8996262146153846,0.4179885010897406 -Ag1Br1_187_34.vasp,AgBr,0.33150543,0.23547930499999997 -Zr1Ni1Cl6_149_21372.vasp,ZrNiCl6,-1.93654430625,-0.05827456750000026 -Ga8Se12_14_6591.vasp,Ga8Se12,-2.3455289324999997,0.1114629315000002 -Ni2As2O7_6_13446.vasp,Ni2As2O7,-3.4618829372727276,0.008266675909083587 -Li2Fe2P2_129_9910.vasp,Li2Fe2P2,-2.4971439749999997,0.17562117833333346 -Ca2Ag1S2F2_38_2910.vasp,Ca2AgS2F2,-2.242888614285714,0.5226865285267805 -Sb2Se2S1_164_15697.vasp,Sb2Se2S,-2.4446580659999997,0.06375286066666486 -Ir2Pd2S4Br3Cl1_1_8805.vasp,Ir2Pd2S4Br3Cl,-1.9424182099999998,-0.07399668652777791 -Al1Ga1Se2_156_665.vasp,AlGaSe2,-2.635311515,-0.05081203687500013 -Ga2Se2_156_6476.vasp,Ga2Se2,-2.200623885,0.21683362249999982 -Sc1S2_115_15988.vasp,ScS2,-3.3766655633333333,0.8816781203124973 -Zn2Mo2Se2S12_18_21121.vasp,Zn2Mo2Se2S12,-2.1827120055555556,0.4665456606064791 -Ba1Cl2_187_1819.vasp,BaCl2,-2.3160863766666666,0.40810900666666683 -P4S6_4_14113.vasp,P4S6,-3.2664150980000004,0.11883509340624654 -V2Te6P2_12_20222.vasp,V2Te6P2,-2.293596744,0.46815050500000044 -Li2P30_1_10038.vasp,Li2P30,-3.976514605,0.029112152343749864 -Cu2Hg2S2Br2_26_5154.vasp,Cu2Hg2S2Br2,-0.14329099375,0.14254408458333334 -Si1H2N1_156_16338.vasp,SiH2N,-4.3560592675,0.7895743993750002 -Tl2In2F8_10_19445.vasp,Tl2In2F8,-2.2434636525,0.1783527574999999 -Mo1Se1S1_156_11548.vasp,MoSeS,-3.3643200666666666,0.04144585416666691 -Ag2I2N2_59_313.vasp,Ag2I2N2,-0.7376768633333333,0.8752578074999987 -Zr2C2Cl2_59_21541.vasp,Zr2C2Cl2,-4.802073493333333,0.61347835666666 -Ba4Mn2S6Cl2_129_2163.vasp,Ba4Mn2S6Cl2,-3.0238068385714283,0.04217510714285444 -V4Zn1O10_25_20379.vasp,V4ZnO10,-4.942896807333333,0.21290702999999045 -Pt2O6_11_14646.vasp,Pt2O6,-2.74792829,0.7521261090625002 -Ag2S2_187_385.vasp,Ag2S2,-0.6981655875,0.27006337734375 -Nb4Ni6Te10_59_13108.vasp,Nb4Ni6Te10,-2.0423140975,0.055798663749998756 -Hf1V2Br1Cl1O3_1_7361.vasp,HfV2BrClO3,-4.63641505875,0.4346986602083285 -Y3B2Cl2_187_20785.vasp,Y3B2Cl2,-4.481835328571429,0.20182814071427618 -Fe1F2_115_5674.vasp,FeF2,-1.6292617166666667,1.08852362 -Cd1H2O2_164_3337.vasp,CdH2O2,-3.146905558,0.056340398000000125 -Ta4H2C3S2_164_18049.vasp,Ta4H2C3S2,-6.464854643636364,0.2829720643181761 -Sc1Sb2Au1S6_149_15993.vasp,ScSb2AuS6,-2.502273761,0.3795836170937479 -Pa2As4_129_14164.vasp,Pa2As4,-4.828276866666667,0.587622445 -Y1Bi2_21_20610.vasp,YBi2,-2.3946611166666667,0.19905762277777495 -Zn1Cu3H6Cl2O6_164_20921.vasp,ZnCu3H6Cl2O6,-2.832033906111111,0.16824230439814294 -Ta1Cl2_187_17526.vasp,TaCl2,-3.4279517800000003,0.5162725849999934 -Sb2I2O2_59_15588.vasp,Sb2I2O2,-2.4406440183333333,0.21309573124999764 -Cl4O10_4_3692.vasp,Cl4O10,-2.1258024164285714,0.33025034732142755 -Tl2Mo10O30_12_19452.vasp,Tl2Mo10O30,-4.935910776666667,0.05949814247617091 -In2Bi2_129_8383.vasp,In2Bi2,-0.85877826,-0.3032759975 -Bi4P4O16_14_2632.vasp,Bi4P4O16,-4.187164542916666,0.9949863854166665 -K1Ge1Te2_156_8904.vasp,KGeTe2,-1.27516668,0.13951911149999868 -Sb1Cl2_115_15445.vasp,SbCl2,-1.1046780266666667,0.49948882583333165 -Rb2Hg4Se2Br6O6_31_14876.vasp,Rb2Hg4Se2Br6O6,-1.2924013145,0.0702406009166659 -Na1Te6P2Pd1_149_11941.vasp,NaTe6P2Pd,-1.7633552890000002,0.3355216975 -Ga1Se1S1_1_6272.vasp,GaSeS,-2.321540253333333,0.3375140397222205 -Ge2As2O6F2_7_6736.vasp,Ge2As2O6F2,-4.0571903625,0.2585543945833333 -U2Br2N2_129_19700.vasp,U2Br2N2,-6.515185209999999,0.11430127333333395 -V1Mo3S8_25_19887.vasp,VMo3S8,-3.7117668858333333,0.051561786250000186 -Na2Hg4Te2S6Br6_31_12174.vasp,Na2Hg4Te2S6Br6,-0.668964396,0.1014370876666663 -Ba4Sb4Te8H4_14_2187.vasp,Ba4Sb4Te8H4,-2.130037767,0.5610853164999979 -H2W4C3_164_7042.vasp,H2W4C3,-5.81734769,0.28634077388887724 -V2Se1Br1N1_99_20178.vasp,V2SeBrN,-3.8924759780000002,0.14787411349999746 -Sr2Pb4F12_2_17299.vasp,Sr2Pb4F12,-2.9164277199999997,0.1451814455555529 -Ca2B2O6_11_2943.vasp,Ca2B2O6,-5.457365601,0.31953277012499703 -Zr2S10_59_21635.vasp,Zr2S10,-3.545045465,0.2202337206249969 -Cu1W1S1Br2O1_8_5001.vasp,CuWSBr2O,-2.4354674716666667,0.2389209438768105 -V2Cd1O6_12_20025.vasp,V2CdO6,-4.475906884444445,0.29665346444444385 -Tl2Ni2Se5_156_19461.vasp,Tl2Ni2Se5,-0.9943316544444445,0.3412730801234555 -Na4As4S8_14_12363.vasp,Na4As4S8,-2.677509635,0.387804005 -Nb4Co8Te8_59_13062.vasp,Nb4Co8Te8,-2.7104574205,-0.016095749000001713 -Nb2F5_1_12712.vasp,Nb2F5,-3.9780914157142857,0.5415229057142859 -Zn2Bi4I4O6_31_21044.vasp,Zn2Bi4I4O6,-2.1888592575,0.216871016875 -Mn2W2S8I2_129_11345.vasp,Mn2W2S8I2,-2.741395967142857,0.5613267491964247 -Ni1Te1Ir1Se2I1_6_13428.vasp,NiTeIrSe2I,-1.4177631533333335,0.1828805352462083 -Zr2Cu2_129_21557.vasp,Zr2Cu2,-1.418745355,0.5219333094230753 -Zr1As2O6F2_164_21245.vasp,ZrAs2O6F2,-4.7181901645454545,0.06579567613635895 -Na1Al1Cl4O12_2_11810.vasp,NaAlCl4O12,-2.857141555,0.21681290135415976 -V2S2I1Br1_6_20155.vasp,V2S2IBr,-2.756192241666667,0.06793460388888528 -Hf1Sb2O6F2_164_7289.vasp,HfSb2O6F2,-4.610224142727272,0.3124809968181772 -Ag2Br1Cl3_1_199.vasp,Ag2BrCl3,-0.03952955166666667,0.13362174249999995 -H4Pd1C8Br2_25_7078.vasp,H4PdC8Br2,-4.941350081333334,0.46253963533332665 -Ta2As2S6_12_17648.vasp,Ta2As2S6,-4.207862543,0.24853699737499735 -V2Ge2Se6_162_20067.vasp,V2Ge2Se6,-2.8789309249999997,0.16914864399999763 -Re2O4_11_15066.vasp,Re2O4,-6.074853158333333,0.17229072750000096 -Ba1C2_164_1815.vasp,BaC2,-2.4360974033333336,3.1518992394444387 -Ga1Fe5Br2_123_6187.vasp,GaFe5Br2,-0.545110845,1.0301843787499994 -Ba2Sb1_25_2054.vasp,Ba2Sb,-0.6806405799999999,0.9004322899999986 -Tc8Cl28_1_18262.vasp,Tc8Cl28,-2.4467400925,0.158067205833331 -V1F2_164_19825.vasp,VF2,-3.31084648,-0.03597349555555862 -K1Au1Se2_10_8880.vasp,KAuSe2,-0.822060815,-0.20235702874999995 -Ba2Mn2Si2_129_2025.vasp,Ba2Mn2Si2,-2.162292201666667,0.3201552789583296 -Li1Nb1S2_156_9756.vasp,LiNbS2,-4.2057397275,0.47171161250000004 -Nd1Cl2_123_13218.vasp,NdCl2,-2.908748013333333,0.11372569111110842 -Na8Ge4S12_14_12450.vasp,Na8Ge4S12,-2.4691570575,0.3969292212500002 -Sn8Ir2_50_17004.vasp,Sn8Ir2,-1.688426426,0.5587586235000002 -In1Cu1As2O6_149_8223.vasp,InCuAs2O6,-3.5118103009999997,0.5531909081249964 -Na4Sb4O8_14_12413.vasp,Na4Sb4O8,-3.836358275,0.013428207500000067 -K2Bi2Pd2_12_9005.vasp,K2Bi2Pd2,-0.55741053,0.06810072450617238 -Os1Pt1I1Br5_1_13812.vasp,OsPtIBr5,-0.95600093375,0.06192413656250004 -Sn2Te2F2_59_16890.vasp,Sn2Te2F2,-1.8316316966666666,-0.21461850930555648 -Tl2Sb2P4S12_4_19518.vasp,Tl2Sb2P4S12,-2.878965305,0.09793459800000015 -Ti3H2C2_187_19084.vasp,Ti3H2C2,-6.485718344285714,0.02239539999999396 -Cs2Cd4S8F6_31_4691.vasp,Cs2Cd4S8F6,-1.381619321,0.3704460995625002 -Te2Pd2S6_12_18473.vasp,Te2Pd2S6,-1.9331681029999999,0.2560428389999978 -H2W4C3O2_164_7040.vasp,H2W4C3O2,-5.839219605454545,0.22612478644711864 -Bi4B4O12_14_2597.vasp,Bi4B4O12,-5.2988722065,0.0969040299999957 -Mn2C2S2O14_11_11048.vasp,Mn2C2S2O14,-4.774521193,0.06187363112499722 -Cd2Te2S8F4_7_3595.vasp,Cd2Te2S8F4,-1.53999769375,0.39627993052083343 -V2Te2Cl2_59_20204.vasp,V2Te2Cl2,-2.210358505,0.19746241166666456 -Mn1Ag1Au2Se3I3_1_10606.vasp,MnAgAu2Se3I3,-0.456643692,0.11764428616666642 -Sc2B1I2_164_16035.vasp,Sc2BI2,-2.796875848,0.06205678830000002 -Ge1Pb1I2_1_6687.vasp,GePbI2,-0.9186072575,0.1650159733333333 -In2Ga2Te6_31_8448.vasp,In2Ga2Te6,-1.444658303,0.16322706179047486 -Sc3In2I1Br1Cl4O5_1_16209.vasp,Sc3In2IBrCl4O5,-3.5519806725,0.2933427923437426 -Zr1Ir1Se1Cl2O1_1_21316.vasp,ZrIrSeCl2O,-3.4978545933333334,0.4952386172916632 -Cu2Se4O10_51_5311.vasp,Cu2Se4O10,-3.138754146875,0.09361676874999958 -P1Se1Cl1_156_13947.vasp,PSeCl,-2.0140613733333335,0.4024708602314792 -Mn2As2Se4Cl2_10_10982.vasp,Mn2As2Se4Cl2,-2.197051424,0.11295040466666384 -Hf1F2_115_7152.vasp,HfF2,-4.25266184,0.8613285374999946 -Tl4Cl4_57_19598.vasp,Tl4Cl4,-1.019745095,-0.09224728500000001 -Tl18Te9_143_19197.vasp,Tl18Te9,-0.5683742488888889,0.2012655217171717 -Fe2P2S5_8_5916.vasp,Fe2P2S5,-2.9659440566666664,-0.16739318553030458 -Cs2H6C4O6_2_4719.vasp,Cs2H6C4O6,-4.847774596111112,0.14766582499999314 -Pt2Se2Cl2_59_14674.vasp,Pt2Se2Cl2,-1.6466786750000002,-0.18100126250000015 -Mn1Se2I1_1_10877.vasp,MnSe2I,-1.5401244175,0.0947963379687502 -Li4Ga4I12_11_10192.vasp,Li4Ga4I12,-1.030611176,0.18235768733333074 -Mn1Sn1Pb1Br1Cl1O3_1_10893.vasp,MnSnPbBrClO3,-2.90095158375,0.23440450776041355 -Si6Bi2_191_16526.vasp,Si6Bi2,-2.4673207025,-0.10799191625000004 -Cr1Te1Mo1Se3S1Br1_1_4270.vasp,CrTeMoSe3SBr,-2.174381675,0.32376920607638815 -Al2Te2H2O8_11_1003.vasp,Al2Te2H2O8,-4.61856135,-0.3715305512500038 -Sb1H1S8_1_15454.vasp,SbHS8,-2.507244461,0.2492651915000006 -Co2H12Se4O16_14_3904.vasp,Co2H12Se4O16,-3.9154996535294115,0.058701246764706116 -Cu4H6N2O12_4_5420.vasp,Cu4H6N2O12,-3.56830906625,0.2156019620833276 -Ti1Cr1Se1I1Br2_6_18772.vasp,TiCrSeIBr2,-2.5610145833333333,0.12374246305554959 -Mn2Fe1C6N6_150_11069.vasp,Mn2FeC6N6,-5.919593974666666,0.5202709286111001 -Ag2As2S4_26_156.vasp,Ag2As2S4,-1.91807650125,0.1686921693749983 -Cd1Ge1S2_1_3314.vasp,CdGeS2,-1.683011875,-0.18673109250000008 -As1Cl2_187_1143.vasp,AsCl2,-1.2470214233333332,0.5256928477777763 -Zr2Ti1Pd1I1Br2N2Cl1O2_1_21722.vasp,Zr2TiPdIBr2N2ClO2,-4.437583645,0.21842976774304013 -Sc4Cl4O4_11_16235.vasp,Sc4Cl4O4,-4.8786904558333335,0.10783488249999973 -H8Pd1C6S4_10_7097.vasp,H8PdC6S4,-4.46255323,0.25921891901314936 -Zn6P6H18O30_2_21238.vasp,Zn6P6H18O30,-4.404426291166667,0.020131100520829115 -Sc1Si3_191_16001.vasp,ScSi3,-3.18293447,0.4278044599999997 -P2Pd3S8_164_14028.vasp,P2Pd3S8,-2.685745200769231,0.06935279615384582 -Na2Hg4Se2I6O6_31_12164.vasp,Na2Hg4Se2I6O6,-1.1994384155,0.10878143031249393 -Ni4P4Se4_13_13753.vasp,Ni4P4Se4,-2.0682139975,0.26643367666666673 -Si1B1Te1Cl1_1_16319.vasp,SiBTeCl,-3.0120207425,0.3824061287152753 -Nb2V2O10_85_12936.vasp,Nb2V2O10,-6.096520627142858,0.17320632142857129 -Ti2I2O1_1_18954.vasp,Ti2I2O,-4.233077422,0.2572216128888838 -Sr2Ca2Cu2Bi2O8_28_17167.vasp,Sr2Ca2Cu2Bi2O8,-3.03827352125,0.7796040956249941 -Pd2Se1S1I4_8_14482.vasp,Pd2SeSI4,-0.4954370975,0.22230631828125003 -Rb2Br2F8_127_14781.vasp,Rb2Br2F8,-1.2703950808333333,0.14530228000000012 -Na2Hg4S8Br6_31_12159.vasp,Na2Hg4S8Br6,-0.823442351,0.07755043656250071 -B18Te9_143_1615.vasp,B18Te9,-3.7632794148148148,0.8679727029629587 -Sb2Pt2Se6_12_15662.vasp,Sb2Pt2Se6,-2.03644362,0.29798032449999756 -Bi2W3_1_2583.vasp,Bi2W3,-3.047038178,1.350213322 -Ni4Te1Se3_6_13767.vasp,Ni4TeSe3,-0.58145587125,0.06593084437499924 -Si1Ni3Se2_187_16351.vasp,SiNi3Se2,-1.3323254183333333,0.040659032872020884 -Au2S4Br2_17_1522.vasp,Au2S4Br2,-1.01105262125,0.15755530895833225 -Al1S2O8_164_724.vasp,AlS2O8,-4.604764216363637,0.15675323767044547 -K4Mo8O26_2_9477.vasp,K4Mo8O26,-4.765156625,0.07410639493420468 -Zr1Cl4_123_21278.vasp,ZrCl4,-2.59193994,0.2275944459999999 -Te2N2_8_18417.vasp,Te2N2,-3.0413743325,0.5113938570833333 -Al2Tl2Te6_31_1030.vasp,Al2Tl2Te6,-1.398268815,0.4808578983333319 -Ba2Tl1Cd1Ag1S5_99_2078.vasp,Ba2TlCdAgS5,-1.647653243,0.3696343574999969 -Li2Ge1H6O6_147_9922.vasp,Li2GeH6O6,-4.410388052,-0.1237991958333331 -Sb1Pd2S2_187_15483.vasp,SbPd2S2,-1.958189346,0.38605713800000063 -Co3Ge1S2_187_4061.vasp,Co3GeS2,-2.409506405,0.21551897631745764 -In1Ni1S1Cl1_8_8283.vasp,InNiSCl,-1.0625480975,0.33572544624999695 -Ag2H4C6Cl2_2_279.vasp,Ag2H4C6Cl2,-4.151244594285714,0.39364713785714134 -Co2H2S2_59_3910.vasp,Co2H2S2,-2.6401224416666667,0.6646654373148119 -H2Pb2Cl2O2_12_7004.vasp,H2Pb2Cl2O2,-2.90161021875,0.22788360124999985 -Ti4S4Cl4_31_19158.vasp,Ti4S4Cl4,-4.312093110833334,-0.01713785555555969 -Sb1Mo1P1_156_15467.vasp,SbMoP,-3.145482643333333,0.1313028841666638 -Cr2N2Cl2_59_4426.vasp,Cr2N2Cl2,-3.9369602816666665,0.013560276111107772 -Cd2Sb2S4Cl2_26_3559.vasp,Cd2Sb2S4Cl2,-1.495241024,0.17635658425000011 -Sb4S8_31_15821.vasp,Sb4S8,-2.4472301133333336,0.32574495322916386 -Zr3B2O2_187_21740.vasp,Zr3B2O2,-5.991576497142857,0.3088163880952335 -Al1Tl1Hg1S4_156_756.vasp,AlTlHgS4,-1.823955122857143,0.14618509616071096 -Tl1Pd5F2_123_19320.vasp,TlPd5F2,-0.7368822725,0.9632566987499999 -Na2Os2S4I8N2_7_12255.vasp,Na2Os2S4I8N2,-1.8987369866666666,0.15337803840277597 -Sc1Pb5_47_15978.vasp,ScPb5,-0.9842926483333333,0.6289385241666651 -K2Ru2C2Cl8O4_31_9315.vasp,K2Ru2C2Cl8O4,-2.820528936666667,0.377799851527766 -Sc4Br10_11_16226.vasp,Sc4Br10,-2.2262572478571427,0.12745605071428112 -Hf2Te1Se1I2_6_7627.vasp,Hf2TeSeI2,-3.191466651666667,0.023307107083330725 -Lu2Te6_129_10321.vasp,Lu2Te6,-2.2920656675,0.14591106937499965 -Cu1Os1Se3S2Br1_1_4932.vasp,CuOsSe3S2Br,-1.9250155025,0.5176440791666668 -Ti4C3_164_19133.vasp,Ti4C3,-7.466100118571428,0.3276164657142786 -Ti3Te1I1N2_156_19106.vasp,Ti3TeIN2,-5.872854537142857,0.05616168488094242 -Co2C8_111_3887.vasp,Co2C8,-5.075032726,1.7530074200000005 -Na4P4O8_14_12401.vasp,Na4P4O8,-4.57396377125,0.23899435924999513 -Hf3Zr1Br3Cl1O4_1_7748.vasp,Hf3ZrBr3ClO4,-5.231007919166667,0.18321081817708018 -Ni1Br2_187_13289.vasp,NiBr2,0.32145381,0.27655339 -B2Mo3Cl2_187_1678.vasp,B2Mo3Cl2,-3.6130972414285716,0.23004660190475912 -Ag1Ge1Se1Cl3_1_63.vasp,AgGeSeCl3,-1.2526167316666668,0.17905305940972083 -Cu1O2F2_164_4926.vasp,CuO2F2,-1.374600724,0.7465040105000001 -Zn3As1_187_21199.vasp,Zn3As,1.07251129,0.3275598221875 -Ta1F4_123_17542.vasp,TaF4,-4.273669374,0.27412382479999964 -Ge1Te1Ru1S2Br1Cl1_1_6713.vasp,GeTeRuS2BrCl,-2.0853393514285714,0.4338936614136865 -Ge2_2_6899.vasp,Ge2,-2.70671756,-0.5337419350000001 -Mn2Ge1Sb1Br2_6_11086.vasp,Mn2GeSbBr2,-1.542111685,0.40064261305555315 -Zn2Sb4O8_1_21154.vasp,Zn2Sb4O8,-3.544579594285714,0.14757659392856948 -Y3C2F2_187_20790.vasp,Y3C2F2,-5.7479381414285715,0.23938984857142365 -Mn2Al2O5_187_10951.vasp,Mn2Al2O5,-5.22327602,-0.06894788381226802 -P2Pt3S8_164_14035.vasp,P2Pt3S8,-2.887231510769231,0.08712541906592719 -Li2Ag2C4O8_4_9821.vasp,Li2Ag2C4O8,-4.854422916875,0.25998900562500005 -Ga1I2_164_6203.vasp,GaI2,-0.6023031799999999,0.19417266583333337 -As8_55_1409.vasp,As8,-2.6453379275,0.5658466325 -Hf1I4_123_7202.vasp,HfI4,-1.489802016,0.32292725099999986 -Ta2Se2_164_17876.vasp,Ta2Se2,-4.8152378075,0.5886794649999949 -P2H2Pb2S6_7_13978.vasp,P2H2Pb2S6,-2.9676896875,0.05074293773809071 -Re6Se8Cl2_2_15130.vasp,Re6Se8Cl2,-4.2972120075,0.06333567625000036 -Zr1Sc1Mn1Ir3Cl5O7_1_21434.vasp,ZrScMnIr3Cl5O7,-3.891034102777778,0.3240937956597021 -Ca1Zn2P2O2_12_2900.vasp,CaZn2P2O2,-1.929099337142857,1.1722032685565453 -V1Te1S1_156_19935.vasp,VTeS,-2.9761139500000002,-0.3136076040277799 -Hf3Sc1Br4N3O1_8_7728.vasp,Hf3ScBr4N3O,-5.611641860833333,0.07443215416666704 -Li1Sb3P2O10_1_9786.vasp,LiSb3P2O10,-4.8494556075,0.1930649171874954 -Ti1Cl2_6_18760.vasp,TiCl2,-3.3292445333333336,0.3783685375000001 -Na1Ni1Sb2O6_149_11916.vasp,NaNiSb2O6,-3.367615191,0.4176860391249957 -Si2H8_7_16405.vasp,Si2H8,-3.459190222,0.9994473760000001 -Ag2I2_164_316.vasp,Ag2I2,0.403965685,0.05649238000000001 -Cd1S1I1F1_156_3411.vasp,CdSIF,-0.531305425,0.3457119938020834 -Cd1B4Br2N2F4_47_3272.vasp,CdB4Br2N2F4,-3.8855752384615387,0.36121833959400934 -Tl2Os1_123_19476.vasp,Tl2Os,-0.8199873766666667,1.0012833133333316 -Sr2Ag1Te2Cl2_38_17114.vasp,Sr2AgTe2Cl2,-1.2935854057142857,0.46550335833332973 -Sn1Te2_187_16703.vasp,SnTe2,-1.1473418066666665,-0.5995945677777781 -Cr1Cl2_187_4143.vasp,CrCl2,-1.7912189266666667,0.28368135444444254 -Bi1I1O1_156_2340.vasp,BiIO,-1.8986860200000002,0.5748844449999997 -Sc2Br2O2_129_16039.vasp,Sc2Br2O2,-4.643313105,0.09645108499999999 -Li1Cu2F5_1_9692.vasp,LiCu2F5,-1.64177732,0.12138211624999984 -Mn2Te4P2Cl2_10_11324.vasp,Mn2Te4P2Cl2,-1.9175330970000002,0.4563163139444403 -Pt4Br2Cl2O4_1_14696.vasp,Pt4Br2Cl2O4,-1.8415240116666667,0.3143860000925902 -Sc2Br2N1_164_16037.vasp,Sc2Br2N,-4.055694669999999,0.030702390000000968 -Te2Ir1_115_18385.vasp,Te2Ir,-1.7852412666666666,0.6582610933333335 -Mn1Nb1Se3_6_10813.vasp,MnNbSe3,-3.1620885000000003,0.36930718812930774 -Co1Ni2Se4_8_3798.vasp,CoNi2Se4,-1.376578422857143,0.12935177599999859 -Zn1H2_115_20955.vasp,ZnH2,-1.3724042033333335,1.0458530866666647 -In1Ag1Sb2S6_149_8183.vasp,InAgSb2S6,-2.079981394,0.29176822843749783 -Bi2W4Br16O4_2_2584.vasp,Bi2W4Br16O4,-2.4221099657692307,-0.4489821586448037 -K2H6C2O8_4_9136.vasp,K2H6C2O8,-3.327847567777778,1.3141632506481442 -Ag2Hg2S2Cl2_26_298.vasp,Ag2Hg2S2Cl2,-0.09456937375,0.122451615625 -Sr1Sn1S1Br1_8_17086.vasp,SrSnSBr,-1.96081816,-0.07175659843750015 -Cu4N2O12_11_5431.vasp,Cu4N2O12,-3.0648602338888886,0.3245628101388869 -Na2Cr2Au4S12_7_12063.vasp,Na2Cr2Au4S12,-1.876950264,0.3092506104374976 -V1W1I1Br5_1_19954.vasp,VWIBr5,-1.58577912375,0.19116269211309306 -Ba4Bi4Se8Cl4_14_2142.vasp,Ba4Bi4Se8Cl4,-2.3217827675,0.1297128670000004 -Si4Se4_53_16514.vasp,Si4Se4,-3.320593105,-0.2289870048437498 -Sr4Ga2Ni4O14_1_17440.vasp,Sr4Ga2Ni4O14,-3.4588551604166664,0.02040458294270575 -Au1Br1F2_1_1410.vasp,AuBrF2,-0.2415218125,0.23805894125 -Sn2Te6As2_147_16900.vasp,Sn2Te6As2,-1.623938921,-0.39573144783333486 -As18I4_11_1131.vasp,As18I4,-2.5311797190909093,0.06773518484848262 -Ca2Cu1S2I2_38_3001.vasp,Ca2CuS2I2,-1.71402376,0.06225686819047277 -Tl2I6_1_19442.vasp,Tl2I6,0.04845362,0.07692453968750002 -W1S2_164_20450.vasp,WS2,-4.297495556666667,0.17510309333333307 -Tl2Fe2S4_12_19416.vasp,Tl2Fe2S4,-1.709278905,-0.016255370624999932 -Ga2Pd1O4_164_6432.vasp,Ga2PdO4,-3.7370727514285713,-0.06693649785714562 -K1Bi3_187_8882.vasp,KBi3,-0.2689179025,0.6011401350000002 -Ga1I1_99_6201.vasp,GaI,-0.424625985,0.5182687166666656 -Sn2P3O10_5_16826.vasp,Sn2P3O10,-4.9686424559999995,0.2180874144166518 -Y2B1Cl2_164_20693.vasp,Y2BCl2,-4.277857844,0.1077535885000007 -Rb2Hg4O8F6_31_14867.vasp,Rb2Hg4O8F6,-1.405399985,0.36337999287500033 -Na2Pb1O6F6_147_12262.vasp,Na2PbO6F6,-1.9317874073333334,0.9225838385 -Ce2Br2O2_164_3666.vasp,Ce2Br2O2,-4.703348305,0.11975506500000055 -Nb3Se1Cl7_156_13010.vasp,Nb3SeCl7,-3.2596850909090906,0.04252762090909101 -Ni2C2Cl2_59_13486.vasp,Ni2C2Cl2,-2.01535983,1.0748296366666634 -Na1In1I4O12_2_11884.vasp,NaInI4O12,-2.81147521,0.10445492277777824 -Li2H8I2O4_2_9958.vasp,Li2H8I2O4,-3.6821867825,-0.10015646552083757 -Fe4Ge1Te2_164_6078.vasp,Fe4GeTe2,-1.0208233314285715,0.28942514928571283 -Cr2P4Au2O12_13_4455.vasp,Cr2P4Au2O12,-4.506607353,0.6041287661666619 -Ga1Ni1Se2_156_6216.vasp,GaNiSe2,-1.4840578125,0.053385759448529066 -V1Zn1Cl3O1_3_19966.vasp,VZnCl3O,-2.1655260633333335,0.05666353249999767 -Y1Cr1F5_47_20625.vasp,YCrF5,-3.515929967142857,0.7874977983333243 -Ca2Ir1_123_3059.vasp,Ca2Ir,-1.0131131166666667,0.2691913473958324 -Hf1V2Ag1S8_1_7360.vasp,HfV2AgS8,-3.3521884158333335,0.31693017270833046 -Ni2Te6_11_13683.vasp,Ni2Te6,-0.81935923,0.12820614916666667 -Os2Cl2_164_13839.vasp,Os2Cl2,-2.44203764,0.7795610843749998 -B6N8_187_1780.vasp,B6N8,-6.694763710714286,0.7839513003571383 -Ba2Te2Au1I2_38_2067.vasp,Ba2Te2AuI2,-1.2139698171428572,0.25493441285714 -K2Zn2P4H10O18_2_9394.vasp,K2Zn2P4H10O18,-4.4991996952777775,0.06534732000000076 -Be3Pb1_25_2281.vasp,Be3Pb,-1.8811725725,0.13924229625000023 -Si4N8_26_16494.vasp,Si4N8,-6.109801,-0.354088446111116 -Cu2Pb2S2O12_11_5229.vasp,Cu2Pb2S2O12,-3.4073923466666667,0.4257828258333305 -Na1Al1As2Se6_5_11808.vasp,NaAlAs2Se6,-2.376232072,0.24997903833333104 -Nb2N1F2_164_12765.vasp,Nb2NF2,-5.586674384,0.25538016973332933 -Rh2O2_187_15204.vasp,Rh2O2,-3.15007525,0.7183908837499998 -Sr1Ag2F12_115_17017.vasp,SrAg2F12,-1.065939382,0.03292941699999963 -Na2B2H16O14_2_11974.vasp,Na2B2H16O14,-4.471902534411765,0.09037137955065008 -Hf2Te2S1_164_7637.vasp,Hf2Te2S,-4.394885644,0.02537978000000063 -Au2Se2_59_1551.vasp,Au2Se2,-0.39125782,0.28486246000000004 -Y1Bi2S4_123_20609.vasp,YBi2S4,-3.192847568571428,-0.37397957604166776 -Co1Re2O8_147_3812.vasp,CoRe2O8,-5.348231337272727,0.052754497272727185 -Ag2P2Se6_162_353.vasp,Ag2P2Se6,-1.810026002,0.1716292639791645 -Nb2Te6As2_2_12925.vasp,Nb2Te6As2,-2.732386023,0.2859422252499948 -Bi4O2F8_13_2620.vasp,Bi4O2F8,-2.902261025,0.2276446860714254 -V1Pb1O3_99_19902.vasp,VPbO3,-4.49735256,0.3514437524999983 -Li2P2H4O4_12_10036.vasp,Li2P2H4O4,-4.517502631666667,0.054822242833324264 -Hf4C3O2_164_7775.vasp,Hf4C3O2,-7.793239617777778,0.1398238827777707 -Cr2Sn2Te6_162_4513.vasp,Cr2Sn2Te6,-1.597806608,-0.4176877326666683 -Cu2I6_162_5178.vasp,Cu2I6,0.47524302,0.231802084947917 -Zr4Se4I4_7_21850.vasp,Zr4Se4I4,-2.9392902483333336,0.15068712513888638 -Li2Hf1_187_9962.vasp,Li2Hf,-2.6133920466666667,0.4035843077777752 -Sc2N1F2_164_16104.vasp,Sc2NF2,-5.1704033119999995,-0.3276101826666715 -Ca3Ag2S4Br2_123_3145.vasp,Ca3Ag2S4Br2,-1.8243243563636362,0.12530866267044896 -Te1W3Br3Cl1_1_18339.vasp,TeW3Br3Cl,-2.29564547125,0.7380641837499999 -Ge2I2N2_59_6779.vasp,Ge2I2N2,-3.061913395,0.2227255022222171 -W4N3O2_164_20585.vasp,W4N3O2,-6.2858348388888885,-0.21754990378685998 -Sr2Br2Cl2_129_17150.vasp,Sr2Br2Cl2,-2.054760863333333,0.11557252166666676 -P2Se2_2_14051.vasp,P2Se2,-2.74203292,0.32690257468749984 -Sn2Cl2F2_11_16757.vasp,Sn2Cl2F2,-2.0728520033333333,0.08992021999999977 -Ti2Br2O1_12_18899.vasp,Ti2Br2O,-4.689042998,0.11297342133333421 -Cu2Te1Se1I1Br1_1_5327.vasp,Cu2TeSeIBr,-0.37342637833333336,0.16639382916666573 -P2F8_1_13976.vasp,P2F8,-3.115617181,0.07826444499999385 -Ta3H2C2_187_17960.vasp,Ta3H2C2,-6.756828961428572,0.3886950942857066 -K1Au1Br4O2_2_8879.vasp,KAuBr4O2,-0.825184825,0.2946986078125 -Cr1Mo1I1Br1O2_25_4212.vasp,CrMoIBrO2,-3.2218225950000003,0.09326539944444098 -Na2B2O14_2_11982.vasp,Na2B2O14,-3.9070312822222224,0.4388887084722184 -Nb2B1Ir1S2Br1_6_12632.vasp,Nb2BIrS2Br,-4.538957915714286,0.35388709004463326 -Cr2I2O2_59_4412.vasp,Cr2I2O2,-3.0561946916666667,0.07372316611110774 -Ir2O2_10_8799.vasp,Ir2O2,-3.4381221875,1.3479390550000003 -C4_123_2772.vasp,C4,-7.52656999,0.5897554200000004 -Pr2Sb2S4O2_129_14551.vasp,Pr2Sb2S4O2,-4.344934387,-0.02048675783333742 -In1Au1I1Br3O2_3_8195.vasp,InAuIBr3O2,-1.00690678375,0.37597540328124657 -Nb3Te3Mo1Se5_1_13030.vasp,Nb3Te3MoSe5,-3.4781657533333337,0.1499835657291666 -In2Si2Se2_164_8603.vasp,In2Si2Se2,-2.60962862,-0.34396869500000216 -Bi2As2_1_2422.vasp,Bi2As2,-2.07488894,-0.23586266250000015 -Mo1I1Cl1_156_11515.vasp,MoICl,-1.3790040466666669,0.4373163874999999 -W1Br2O1_8_20418.vasp,WBr2O,-3.00797685,-0.04194825594608598 -Al1Ag1O2_156_596.vasp,AlAgO2,-3.719809005,0.47183593749999986 -Sn1Au2O4_6_16611.vasp,SnAu2O4,-2.339550997142857,0.21951325642856845 -Be1P2S4F4_5_2229.vasp,BeP2S4F4,-3.298751345454545,0.18037538734848169 -Mg4Sn4O8_2_10586.vasp,Mg4Sn4O8,-3.88706977625,-0.07295902562500012 -P12Au2_31_13903.vasp,P12Au2,-3.081472203571429,0.2987965617857107 -Li2Au1S2_12_9828.vasp,Li2AuS2,-1.98687519,0.2120695919583315 -Ti1Tl4Se4_1_18862.vasp,TiTl4Se4,-1.9057392622222222,0.3154076691666665 -Li2Re2O4F8_113_10048.vasp,Li2Re2O4F8,-4.1295466475,0.02329961812499981 -Li4Ga4Br12_11_10189.vasp,Li4Ga4Br12,-1.5472713,0.15177401899999854 -Te3P4Au2Br2_6_18554.vasp,Te3P4Au2Br2,-1.5309446345454545,0.24223083564934478 -Re2Se6_11_15086.vasp,Re2Se6,-3.3552221825,0.3430978345833334 -Na4Ge2S6O14_2_12385.vasp,Na4Ge2S6O14,-3.937949012692308,0.2498619372916585 -Mn1Fe1Ru1O7_1_10709.vasp,MnFeRuO7,-3.936579828,0.2652336531249968 -Rb2V1Cl6_164_14956.vasp,Rb2VCl6,-1.721974151111111,-0.0032458155555554757 -Sr2Ca1Cu2Bi2O8_123_17166.vasp,Sr2CaCu2Bi2O8,-3.533424383333333,0.19580965233332415 -P2Pb2C2S6F6_7_14005.vasp,P2Pb2C2S6F6,-3.14861743,0.37338011469443866 -Ca1Nb2O7_123_2860.vasp,CaNb2O7,-5.807604906,0.42763022337499623 -Zn2Te2S8F4_7_21182.vasp,Zn2Te2S8F4,-1.650936930625,0.45324575520833343 -K2B2S6_1_8998.vasp,K2B2S6,-3.0172656509999998,0.304869305111108 -Tl2I6_162_19440.vasp,Tl2I6,0.15738241375,0.18585333343750002 -Li2Ce1As2_164_9856.vasp,Li2CeAs2,-3.062406418,0.3472735810000003 -Cu3Ir1Se2S2I3Br1_1_5374.vasp,Cu3IrSe2S2I3Br,-0.9562820808333333,0.11193827429824488 -Co2As2S7_6_3847.vasp,Co2As2S7,-2.52400383,0.7246963017583701 -K4Bi4P8Se24_14_9416.vasp,K4Bi4P8Se24,-2.315534405,0.09813674499999969 -Ni2Bi4I4O6_2_13474.vasp,Ni2Bi4I4O6,-2.310552053125,0.0010880068750000471 -Ca2N2Cl2O6_59_3070.vasp,Ca2N2Cl2O6,-4.063340205,0.08716785770833324 -In1Te2Pb1_1_8365.vasp,InTe2Pb,-1.20789991,-0.5457789875000001 -In2S2_2_8554.vasp,In2S2,-2.1257971175,0.1538730475000003 -La4C2Br5_47_9625.vasp,La4C2Br5,-3.744619961818182,0.106457235454545 -I12N4_14_8157.vasp,I12N4,-0.62871902,0.4687654095312501 -Na2Cd4S6Cl6O2_31_12030.vasp,Na2Cd4S6Cl6O2,-1.2772563545,0.45529030039583074 -Sc1Sn3_191_16008.vasp,ScSn3,-1.1446230075,-0.80845949 -La1Nb2O7_123_9570.vasp,LaNb2O7,-6.476026989,0.11015060899999773 -Sn2Br8_1_16750.vasp,Sn2Br8,-0.535578832,0.30672706549999995 -Ga2Hg1O4_164_6382.vasp,Ga2HgO4,-3.271572207142857,-0.14555617529762382 -Pd2S2_10_14471.vasp,Pd2S2,-1.7391033825,0.37102795750000017 -Bi4Se6_12_2648.vasp,Bi4Se6,-1.963712111,0.14459959899999975 -Ni2I6_162_13527.vasp,Ni2I6,0.47683292125,0.059532006718749975 -Ag1Se1I2_1_128.vasp,AgSeI2,-0.02049316,0.27119964805555397 -Ce2Sb2S4O2_129_3677.vasp,Ce2Sb2S4O2,-4.301701909,0.7945164907499971 -Ni2P2O10_31_13558.vasp,Ni2P2O10,-3.8228916807142856,0.338112341696422 -Bi6Se5_8_2681.vasp,Bi6Se5,-1.4858257545454547,0.22456020636363452 -Nb2S2I4_25_12841.vasp,Nb2S2I4,-2.56381557375,0.19169539062500007 -Hf2N1Cl2_164_7537.vasp,Hf2NCl2,-5.337170728,0.14046721799999595 -Mn3Ge1Se4Cl4O2_1_11380.vasp,Mn3GeSe4Cl4O2,-2.4345585178571425,0.20328148065475765 -Nb1N2_187_12540.vasp,NbN2,-6.728458486666667,0.5466568036666608 -Ir1F2_115_8734.vasp,IrF2,-1.4146227666666666,1.2510840277777757 -Ni1Pd1Se1S1Br1Cl1_1_13400.vasp,NiPdSeSBrCl,-0.9985736816666666,0.04310949760416452 -Cs2Os2N2Cl10O2_11_4760.vasp,Cs2Os2N2Cl10O2,-2.50049519,-0.1458388864705914 -Ag2B4C2I2F4_2_185.vasp,Ag2B4C2I2F4,-3.436366941428571,0.2457485222222171 -B4H8O8_83_1754.vasp,B4H8O8,-5.18854932,0.538244635000001 -Sr2Au1S2I2_38_17131.vasp,Sr2AuS2I2,-1.6147927557142856,0.0789789580952347 -Ag2As4Se3Br2_6_169.vasp,Ag2As4Se3Br2,-1.5722901945454546,0.1611997777272689 -Ba4In2Br2O6_129_2159.vasp,Ba4In2Br2O6,-3.7692601328571427,0.03753947500000043 -Mn2In2S5_156_11123.vasp,Mn2In2S5,-2.6096168355555553,-0.018246328333333173 -Y2Sb2S4O2_129_20776.vasp,Y2Sb2S4O2,-4.742144355,0.014433170874994738 -Tl1P1O4_111_19311.vasp,TlPO4,-4.289067125,0.1958147591666668 -Cr1Mo1Cl6_12_4209.vasp,CrMoCl6,-1.79194242,0.01516883177083106 -Nb2As2O6_162_12624.vasp,Nb2As2O6,-5.033409022,0.8670552630833308 -K2Eu2P2S8_11_9094.vasp,K2Eu2P2S8,-3.2729554642857144,0.09330540214285721 -Be2Si4_12_2269.vasp,Be2Si4,-3.3658106149999996,-0.6219919866666686 -Ni2Sb2Se6_162_13614.vasp,Ni2Sb2Se6,-1.52736454,0.2646907224999986 -Mn3Au1Br3O5_1_11349.vasp,Mn3AuBr3O5,-2.704553966666667,0.17568656645833025 -Cs3Sb2I9_164_4801.vasp,Cs3Sb2I9,-0.6543306792857143,0.08286834464285708 -Tl2Ni4Se6_164_19464.vasp,Tl2Ni4Se6,-1.0467241458333334,0.18963500416666657 -Ge2P2H2O6_7_6802.vasp,Ge2P2H2O6,-4.871870002500001,-0.09138684823413876 -Ga2Te2I2_31_6506.vasp,Ga2Te2I2,-1.22490265,0.03320950416666668 -Li2Cu1S2_12_9883.vasp,Li2CuS2,-2.142791264,0.18213775866666682 -Ba1Ag2S8_89_1801.vasp,BaAg2S8,-1.962949699090909,0.21120201153408724 -Na1In1Sb2Te6_5_11891.vasp,NaInSb2Te6,-1.337865654,0.3380858126666651 -Hf1Zr2Br1N1Cl1O1_25_7408.vasp,HfZr2BrNClO,-5.262526892857143,0.2301730083928477 -Ti3Se2N2F2_38_19103.vasp,Ti3Se2N2F2,-5.214766848888889,0.23111539142591486 -Nb1N1Cl2_38_12537.vasp,NbNCl2,-4.333210225,0.14798315252500016 -Ni2Te4Pd4_49_13677.vasp,Ni2Te4Pd4,-0.9143366,-0.10368539000000077 -V4S6_12_20362.vasp,V4S6,-3.86055886,0.12011329700000006 -Al1P2Au1O6_149_703.vasp,AlP2AuO6,-4.597299864,0.7555541736999929 -Sr1Te2_115_17095.vasp,SrTe2,-0.99940147,0.7028440522222208 -Ti1Zn1Bi2O6_8_18872.vasp,TiZnBi2O6,-4.245006227999999,0.3629231294999964 -In2Ga2H8_3_8444.vasp,In2Ga2H8,-2.3226923333333334,1.4987295066666615 -Ta1Ga1Ni1S1Br2Cl2_1_17546.vasp,TaGaNiSBr2Cl2,-2.12129894375,0.2724879685491023 -Nb1Ge1Se1Br1_1_12514.vasp,NbGeSeBr,-3.2445778675,-0.19044348026786417 -Rh2C4_12_15180.vasp,Rh2C4,-4.720639641666667,1.717558951666661 -Pr1Al3Cu1_99_14528.vasp,PrAl3Cu,-1.6236550479999998,0.841243478 -Ca1Pb1S1Br2O1_1_2867.vasp,CaPbSBr2O,-2.1067451033333335,0.13940736916666663 -Cr1Rh1S2Br1Cl1_6_4235.vasp,CrRhS2BrCl,-2.327121576666667,0.12137882277777201 -Hg2S2I2_59_7996.vasp,Hg2S2I2,0.27658795666666663,0.37756322184027613 -Tb2I6_59_18203.vasp,Tb2I6,-1.57136997625,0.06446584249999998 -Au2C2Cl2O2_59_1461.vasp,Au2C2Cl2O2,-3.07781442125,0.18512871562499988 -Cd2Bi2Br2O4_11_3465.vasp,Cd2Bi2Br2O4,-2.1224663,0.14931588299999987 -Fe2P2Se4Br2_26_5919.vasp,Fe2P2Se4Br2,-2.069282705,0.21712997977777598 -Na1H12Au1C4S4O12_2_11873.vasp,NaH12AuC4S4O12,-4.284463393823529,0.2243368512561134 -Mn1Al2O4_156_10626.vasp,MnAl2O4,-5.337637460000001,0.08631403999999954 -B4Au2Br2N2F4_2_1746.vasp,B4Au2Br2N2F4,-3.550464797857143,0.6728933802380845 -Ag4O4_26_537.vasp,Ag4O4,-1.17813260875,0.1889699437500001 -U2H4O8_14_19711.vasp,U2H4O8,-6.117889440714285,0.11988365892857189 -Al1I1_99_672.vasp,AlI,-0.55668927,0.9058418624999987 -Au4Se4_12_1604.vasp,Au4Se4,-0.5804894,0.09563087999999997 -Co2Au1O4_187_3857.vasp,Co2AuO4,-3.2957716042857146,-0.273849826964292 -Mo1Se2_187_11551.vasp,MoSe2,-3.018917736666667,0.02649548666666668 -Ta2S2_164_17855.vasp,Ta2S2,-5.5172205,0.2509000462499946 -P4Au2Se3I2_6_14072.vasp,P4Au2Se3I2,-1.6996350318181819,0.1639297639042152 -Ta1Nb1Se2_8_17576.vasp,TaNbSe2,-4.838446205,-0.20255057625000505 -Ba1Cu1Re1O5_99_1823.vasp,BaCuReO5,-4.30004911,0.6403413576241954 -Rh2Se2I2_11_15239.vasp,Rh2Se2I2,-1.6283831716666668,0.07730266861110935 -Nb2Ni1Se5_38_12775.vasp,Nb2NiSe5,-3.19564423,0.24085764875000004 -Pd1O1F1_1_14371.vasp,PdOF,-1.9146944933333332,0.3672526477777758 -Mg1V2O6_12_10411.vasp,MgV2O6,-5.1262334577777775,0.24175890583332338 -Ta2S2Br2_59_17843.vasp,Ta2S2Br2,-4.274016358333333,0.0942052976190445 -Cr2Ag2P4S12_13_4298.vasp,Cr2Ag2P4S12,-2.8841702115,0.07935167700000001 -V4Te4O16_14_20376.vasp,V4Te4O16,-4.5093752404166665,0.2193740824999999 -Bi8Se4O20_39_2696.vasp,Bi8Se4O20,-3.800380053125,0.044607335624999855 -Cu1H4S2N12_6_4902.vasp,CuH4S2N12,-4.7138470047368415,-0.06395704056470208 -Na1Br1_123_11830.vasp,NaBr,-1.471351705,-0.43379305999999995 -Ce1Pb2_123_3650.vasp,CePb2,-1.4029688333333334,0.12869996833333341 -Sn6Br16_1_16984.vasp,Sn6Br16,-0.9607558613636363,0.058651320227271986 -Al1As1_187_606.vasp,AlAs,-2.686942985,-0.3735174849999998 -Na2N2O6_1_12218.vasp,Na2N2O6,-4.333840422,0.07602114999999987 -V2O2F6_1_20120.vasp,V2O2F6,-3.8005822819999997,-0.6706756727499994 -Ta2C1F2_164_17676.vasp,Ta2CF2,-6.146524782,0.37701235779999176 -In2Sb6_156_8573.vasp,In2Sb6,-1.51213335375,0.010590574999999935 -V1Bi1Sb1_156_19780.vasp,VBiSb,-2.027619223333333,0.3946468588888865 -Nb4C3F2_164_13044.vasp,Nb4C3F2,-6.668085873333333,0.07029139118517858 -Sb2Au2S6_12_15544.vasp,Sb2Au2S6,-1.6702753820000003,0.39822508393749745 -Al1Tl1Cd1Se4_156_753.vasp,AlTlCdSe4,-1.5404636914285714,0.04059799547618814 -Cu3Ni1S2Br2Cl2O1_1_5377.vasp,Cu3NiS2Br2Cl2O,-0.8417761518181819,0.3629971073224407 -Zn1Te1Pd1O5_1_21019.vasp,ZnTePdO5,-2.75415901,0.3546302699999999 -Ni3As2O8_164_13691.vasp,Ni3As2O8,-3.315777090769231,-0.0985968265384648 -Ga1As2Au1O6_149_6135.vasp,GaAs2AuO6,-3.4336810909999995,0.7314248666249965 -Ag2C2S2Cl2_31_221.vasp,Ag2C2S2Cl2,-2.10567841375,0.6425336023437498 -Bi6B10O21_2_2662.vasp,Bi6B10O21,-5.554328741621622,0.2682232267567519 -Sc2S2_129_16138.vasp,Sc2S2,-4.1656982125,-0.2898620974999999 -Ta1Mn1Cr1S3I3Cl1_1_17562.vasp,TaMnCrS3I3Cl,-2.5399707670000002,0.11811851447499586 -Er1Ag1P2Se6_149_5541.vasp,ErAgP2Se6,-2.5862395620000003,0.06982791449999981 -Se2N2_12_16288.vasp,Se2N2,-3.3615896425,0.6575616568750002 -Ag2Bi2Te4_26_198.vasp,Ag2Bi2Te4,-0.667609805,0.294329405625 -Cu2H4Pb2S2O12_11_5129.vasp,Cu2H4Pb2S2O12,-3.734172557272727,0.27128620564393074 -Ba2In1Ag1Hg1S5_99_2009.vasp,Ba2InAgHgS5,-1.7569997480000001,0.40133831480356985 -Te2Mo2Cl2_59_18406.vasp,Te2Mo2Cl2,-1.8172762416666668,0.38708898722222207 -Ta2Sb2Te6_2_17867.vasp,Ta2Sb2Te6,-2.7322927249999998,0.2841103258333322 -Ag2Br2_51_204.vasp,Ag2Br2,0.196115095,0.10008896999999999 -Sr2N2Cl2O6_59_17283.vasp,Sr2N2Cl2O6,-4.089579186666667,0.1247887889583339 -Na3Ho1Cl6_2_12351.vasp,Na3HoCl6,-2.309489185,0.13136243800000003 -Zn2I2_2_21109.vasp,Zn2I2,0.8655463275,0.028851049062500134 -Nb2Ni1Te1Se3_1_12777.vasp,Nb2NiTeSe3,-3.0140769257142854,0.1675485815178549 -Ge1W1I5Cl1_1_6722.vasp,GeWI5Cl,-0.83052632125,0.495822946041666 -Sb2As4H2S12_4_15540.vasp,Sb2As4H2S12,-2.7181656624999997,0.48914905456249774 -Y4H2S2N3_164_20826.vasp,Y4H2S2N3,-5.817464089090909,-0.7612662692045582 -Nb2F2_129_12710.vasp,Nb2F2,-3.67878237,1.4281185600000008 -Cr1O2F2_164_4221.vasp,CrO2F2,-2.67530106,0.8081978798749963 -Ba1Pb2_164_1852.vasp,BaPb2,-0.32563319,0.6700350791666668 -Mn3Ga1S8_164_11377.vasp,Mn3GaS8,-2.8253804724999996,0.41289771268228953 -Ga4S7Br1_6_6567.vasp,Ga4S7Br,-2.537738999166667,0.15456393888020825 -In2Ga2Cl8_10_8442.vasp,In2Ga2Cl8,-1.4333793316666668,0.18213722791666642 -Dy2Br6_59_5519.vasp,Dy2Br6,-2.30286398875,0.04850178000000005 -Cu2I2O2_59_5169.vasp,Cu2I2O2,-1.0295481583333335,0.347342906333331 -Sr2H2S6N2_59_17235.vasp,Sr2H2S6N2,-2.9919244241666667,0.4929808242838518 -Zr2Sc6C4Cl2O6_1_21669.vasp,Zr2Sc6C4Cl2O6,-5.7858893584999995,0.2933401418749898 -Bi4S6_4_2641.vasp,Bi4S6,-2.238196887,-0.7847749900000001 -Ca3Ni2I2O5_123_3193.vasp,Ca3Ni2I2O5,-2.96250291,-0.29604584968750014 -Mn2Al2Te5_156_10960.vasp,Mn2Al2Te5,-1.8640480644444446,0.18822452587120986 -Sr1Pb1S1Br1_1_17073.vasp,SrPbSBr,-1.9114252275,0.4353395137499998 -Rh2S2Cl2_11_15216.vasp,Rh2S2Cl2,-2.3097113583333333,0.06530207499999996 -K1Mo2S2Br6_47_8919.vasp,KMo2S2Br6,-1.5701067827272726,0.2585016925162309 -In2Co2Se5_187_8414.vasp,In2Co2Se5,-1.9707102855555556,0.08858960325925502 -K2Ag6Se4_12_8970.vasp,K2Ag6Se4,-0.3840800741666666,0.1041605525 -Li2Mn2P2O8_51_9998.vasp,Li2Mn2P2O8,-4.662631139285715,0.4728817778571379 -Ni4Sn12_35_13766.vasp,Ni4Sn12,-0.795731805625,-1.3892339435416652 -Ti1Sb2_187_18845.vasp,TiSb2,-3.5865718799999997,0.5665195783333332 -Gd2C2Br2_12_6606.vasp,Gd2C2Br2,-4.531523245,0.038542778333333416 -Mo2Se1Br5_1_11679.vasp,Mo2SeBr5,-1.49001969875,0.16946041015624813 -In2Cl4_10_8402.vasp,In2Cl4,-1.325777095,0.08821277333333333 -Tl1Se1Cl1_8_19342.vasp,TlSeCl,-0.96365819,0.4240032011111099 -Ca1As2F12_115_2800.vasp,CaAs2F12,-2.7068346906666667,-0.02890143666666667 -Ag1B6H4N6O2_6_18.vasp,AgB6H4N6O2,-5.223126807894737,0.2586394198420962 -Mn1Cl2_187_10665.vasp,MnCl2,-1.4097147300000001,0.3860878333333331 -Hf1As2S6F2_164_7108.vasp,HfAs2S6F2,-3.0421213227272728,0.8939859726420376 -As2Br6_11_1193.vasp,As2Br6,-1.094270105,0.07512861749999988 -Bi2P2Se6_8_2494.vasp,Bi2P2Se6,-2.320636027,0.17206465777083157 -Zn4Cu4Ge8O24_14_21218.vasp,Zn4Cu4Ge8O24,-3.62623354525,0.2510644750833304 -Ni2C4S12_14_13490.vasp,Ni2C4S12,-3.266410215,0.3152588726388854 -Zr2S1N1Cl2_1_21641.vasp,Zr2SNCl2,-4.460367735,0.41494785499999987 -Ti2C4_129_18919.vasp,Ti2C4,-6.540212553333333,1.0977315199999929 -Ti1Co1Se2Br1Cl1_6_18765.vasp,TiCoSe2BrCl,-2.8100770983333336,0.08573000286110599 -In2Co2S5_187_8412.vasp,In2Co2S5,-2.4356486577777776,0.18492280101851644 -Mo2Br2_129_11572.vasp,Mo2Br2,-1.185820545,1.5537250906250002 -Zr1Ta1S2Br4_1_21452.vasp,ZrTaS2Br4,-3.221401795,0.20240622750000026 -Cr2Te2S10F4_2_4524.vasp,Cr2Te2S10F4,-2.372888952222222,0.34964958969907173 -Ti3N2F2_187_19095.vasp,Ti3N2F2,-6.787924245714286,-0.27602405666668517 -Ta2C2F2_59_17684.vasp,Ta2C2F2,-6.357252603333333,0.2777050609999876 -Mn1Nb1Br1Cl1O2_1_10802.vasp,MnNbBrClO2,-3.9894850749999997,0.2728875166666674 -Ti2I6_25_18962.vasp,Ti2I6,-1.9323000975,0.12169106125000018 -Hf4S5Br3_8_7811.vasp,Hf4S5Br3,-4.419288094166666,0.12754990437499503 -Mo3Rh1Se2S3Br3_1_11722.vasp,Mo3RhSe2S3Br3,-2.552794095,0.19061916333333345 -Mg5Ti1_8_10595.vasp,Mg5Ti,-0.67028292,0.1864352830555509 -Pd1S1Cl1_8_14382.vasp,PdSCl,-1.3572990833333334,0.27279066937499974 -Y2Cu3O6_12_20725.vasp,Y2Cu3O6,-4.1251881718181815,0.46585827677271885 -Hf1Nb1Br2N2_25_7240.vasp,HfNbBr2N2,-5.62620696,0.11087780711110096 -Ni1Cl2_187_13313.vasp,NiCl2,-0.019396016666666665,0.29009931 -Os2Cl6_162_13842.vasp,Os2Cl6,-1.85957691625,0.028597215312499813 -Mn1Cu1Sn3Se1S2I6_1_10694.vasp,MnCuSn3SeS2I6,-1.0547345742857144,0.182385787880951 -Ta2Se4F4_12_17880.vasp,Ta2Se4F4,-3.941587308,0.19077944123333057 -Sb12Te12_7_15420.vasp,Sb12Te12,-1.6191847095833334,0.2999978641666645 -Sc2In1I1Br1O4_1_16101.vasp,Sc2InIBrO4,-4.056419595555556,0.4703501117361064 -Hg2Te2Au2I2_26_8026.vasp,Hg2Te2Au2I2,0.55939585625,0.44192357942708316 -Mo1S2_164_11544.vasp,MoS2,-3.457206513333333,0.30891210500000055 -Al4O6_7_1080.vasp,Al4O6,-5.984101142,0.13943369599999933 -Mo2P1Cl2_2_11654.vasp,Mo2PCl2,-2.66215213,0.22590749666666698 -Ti3S2N2_187_19101.vasp,Ti3S2N2,-6.886482441428571,-0.1874153928571478 -Pd1Cl2O8_147_14358.vasp,PdCl2O8,-2.245347589090909,0.43498955303030185 -Cu2Mo1S4_1_5185.vasp,Cu2MoS4,-2.06351084,0.32905640309523565 -As4Se2O12_18_1368.vasp,As4Se2O12,-3.960987670555556,0.17316429944444045 -Ni1Ir3Br4O4_6_13373.vasp,NiIr3Br4O4,-2.4257240975000003,0.3152747219444403 -Cs2Cd4Se2S6F6_31_4698.vasp,Cs2Cd4Se2S6F6,-1.3328957065,0.3881800894583308 -Mo2N1Cl2_164_11631.vasp,Mo2NCl2,-3.20994327,0.45827758666666685 -Al2F2_129_818.vasp,Al2F2,-2.6208374525,0.8502757291666634 -Sn3Ir1_187_16915.vasp,Sn3Ir,-1.2544032575,0.8036227196874985 -Zn1Sb4O8_1_21008.vasp,ZnSb4O8,-3.835252871538462,0.1768552643269168 -Hg4Te4O12F4_29_8092.vasp,Hg4Te4O12F4,-2.2976518133333332,0.1783762747395813 -Cd2Br2O2_59_3477.vasp,Cd2Br2O2,-0.7362996900000001,0.3515568325694418 -Ta3H2N2O2_187_17961.vasp,Ta3H2N2O2,-6.598866672222222,0.7105418826296193 -Hf1Se2_123_7308.vasp,HfSe2,-4.14396537,0.5838528933333338 -Hf3H2C2S2_187_7705.vasp,Hf3H2C2S2,-5.7898659044444445,0.3265782155555431 -K2C4S2_31_9034.vasp,K2C4S2,-3.93996072625,1.0274103433333335 -V1Ag1S2_156_19760.vasp,VAgS2,-2.4439271775,0.27063702375 -Nb2I5_1_12751.vasp,Nb2I5,-1.581306377142857,0.48707295678570883 -V2S2I2_59_20157.vasp,V2S2I2,-2.5028789616666667,0.17581901999999738 -Hf2S2Br1Cl3_1_7566.vasp,Hf2S2BrCl3,-3.7944488075,0.1314598441406254 -Zr1Sb1Te2N1_1_21421.vasp,ZrSbTe2N,-3.545944704,0.47721739324999984 -B1N1_187_1629.vasp,BN,-7.76722489,0.035650852500000774 -Cr1Ag1S3Cl2_1_4102.vasp,CrAgS3Cl2,-1.7804864071428572,0.1901601038988061 -Ta4Ag1S8_6_18000.vasp,Ta4AgS8,-4.729079960769231,0.21902913115384592 -Fe2W2S8I2_129_6037.vasp,Fe2W2S8I2,-2.4604594300000002,0.23166953098213972 -Nb2Cl10_51_12674.vasp,Nb2Cl10,-1.9730769424999999,0.5003881041666667 -Al1Cl1_99_627.vasp,AlCl,-1.45669086,0.8743092641666648 -P1Br1O1_156_13912.vasp,PBrO,-2.707511236666667,0.7897844064444373 -Na1Ti1Te2_156_11945.vasp,NaTiTe2,-2.76377204,0.21435403625000005 -Bi2F2_12_2453.vasp,Bi2F2,-1.6514369525,0.5010562895833313 -K2Cd4Se2I6O6_31_9060.vasp,K2Cd4Se2I6O6,-1.3267912320000002,0.10872138824999988 -Os2Br6_191_13835.vasp,Os2Br6,-1.0725459525,0.4295765250000001 -Rb2Fe4Se6_51_14840.vasp,Rb2Fe4Se6,-1.24062552,0.16326343583333214 -Al2Zn2S5_156_1039.vasp,Al2Zn2S5,-2.4429588855555555,0.08507782044444179 -Hf4Se4Br4_31_7814.vasp,Hf4Se4Br4,-3.7186902458333333,0.05649639999999723 -Na1C2_99_11834.vasp,NaC2,-2.89353317,2.6251016833333285 -Ga2Te2Br2_31_6497.vasp,Ga2Te2Br2,-1.4912040233333332,0.03854021666666685 -Ge2Te6As1_162_6892.vasp,Ge2Te6As,-1.8017599366666666,-0.12774680120370718 -V4Se12_11_20365.vasp,V4Se12,-2.78584327,0.07682110200000003 -Hf2Br6_162_7452.vasp,Hf2Br6,-2.5849414475,0.20704929708333042 -Cu1Se1S1Cl1_8_4975.vasp,CuSeSCl,-1.11939668,0.2714262084375001 -Y3S2N2F2_187_20805.vasp,Y3S2N2F2,-4.905978214444445,0.9132427188888834 -Co1Cu1Te4_1_3732.vasp,CoCuTe4,-0.9276901566666668,0.34548596833333206 -P4_53_14132.vasp,P4,-3.9947304725,0.05126551250000011 -Ca1S2_115_2874.vasp,CaS2,-1.82075253,1.015650129791664 -Na2Hg4Se2Br6O6_31_12162.vasp,Na2Hg4Se2Br6O6,-1.3775753825000001,0.13967745287500066 -Rb1Ge1O2_156_14732.vasp,RbGeO2,-3.0806525825,0.697209376562496 -Cr1S2_115_4248.vasp,CrS2,-2.9845834233333335,0.479029783333333 -Ce2O3_150_3672.vasp,Ce2O3,-5.18973229,1.1032608542499993 -Ta13S26_2_17501.vasp,Ta13S26,-5.305176873076923,0.11555571525641017 -Ag2S1O4_21_373.vasp,Ag2SO4,-2.7502683042857146,0.20013514571428548 -Cr2Br2_129_4333.vasp,Cr2Br2,-1.3414618625,1.0663666666666645 -Nb1Te4W1I1_1_12606.vasp,NbTe4WI,-2.307787647142857,0.4781695104870063 -Ga2Co1O4_164_6324.vasp,Ga2CoO4,-4.185844022857142,-0.08811038285714279 -Cd1Sn2S2F2_12_3433.vasp,CdSn2S2F2,-1.79748619,0.26956027749999634 -Ce2P6H16O14_2_3673.vasp,Ce2P6H16O14,-4.74893573131579,0.06712282486841181 -Na2Hg4Te2I6O6_31_12172.vasp,Na2Hg4Te2I6O6,-1.1391803535,0.1771179512083343 -Pb2C1O6_156_14226.vasp,Pb2CO6,-3.64555308,0.7987100109722185 -Ga2P2S6_143_6426.vasp,Ga2P2S6,-3.004588531,0.1679588305357077 -Ag2Te2_164_463.vasp,Ag2Te2,-0.21308739,0.14454505291666667 -Mn1Br2_115_10656.vasp,MnBr2,-0.9520604366666667,0.33060695416666674 -Zr1Nb3N3Cl4O1_8_21369.vasp,ZrNb3N3Cl4O,-5.483351118333334,0.20090799104165646 -Mn2As2Cl2O4_10_10965.vasp,Mn2As2Cl2O4,-3.497473349,0.038152838763150565 -Mo2Se2_129_11689.vasp,Mo2Se2,-2.9517957275,0.6745733675000001 -Zr1Bi1Se2_99_21257.vasp,ZrBiSe2,-2.78471903,0.3996125993749997 -Sm2Zn2P2O2_164_16591.vasp,Sm2Zn2P2O2,-3.72267713,0.14181727499999974 -Al4Te4Br4_14_1100.vasp,Al4Te4Br4,-1.9250746275,0.05716444750000016 -Si1S2_115_16359.vasp,SiS2,-3.7202481733333332,0.1609743800000003 -Ru1Br1Cl1O1_25_15258.vasp,RuBrClO,-2.476159465,0.06767637250000025 -Al4Te6_1_1103.vasp,Al4Te6,-2.001455195,0.21383289924999982 -Nb3S2N2F2_187_13004.vasp,Nb3S2N2F2,-5.221206617777778,0.4364858996222125 -Na2Pd1O6_162_12265.vasp,Na2PdO6,-2.0875925188888886,1.1049287973611088 -Mn1Cr1S4I1Br1_1_10679.vasp,MnCrS4IBr,-2.160487325,0.30477283611979006 -Si1O2_115_16355.vasp,SiO2,-6.1807368233333335,0.22917608999999928 -Bi2Se2_187_2546.vasp,Bi2Se2,-1.5292987025,0.3054390549999989 -Ga1P2Au1S6_149_6231.vasp,GaP2AuS6,-2.693853399,0.10387166899999767 -Cu2S2Br2_59_5243.vasp,Cu2S2Br2,-0.6880729416666668,0.3221336175396816 -Nb2Ge2Bi2_129_12727.vasp,Nb2Ge2Bi2,-3.5364567633333333,0.08500058706348357 -Nb2Te8Os2_11_12932.vasp,Nb2Te8Os2,-3.0330369249999998,0.142153161249996 -Mo1I2_164_11517.vasp,MoI2,-0.9391005466666668,0.39570411388888893 -Ta2B1Te2_12_17660.vasp,Ta2BTe2,-5.236315684,0.1697139203333342 -Tc4Te8_2_18257.vasp,Tc4Te8,-3.7844316866666667,0.07249532749999998 -Pt1O2_164_14584.vasp,PtO2,-3.28465069,0.2630339100000003 -Si1H2C1_156_16337.vasp,SiH2C,-4.8626557025,-0.05023875395833238 -Ge3Bi2S9_174_6906.vasp,Ge3Bi2S9,-2.64200009,-0.09308782111607439 -Mn2Co1B6C6_8_11057.vasp,Mn2CoB6C6,-4.758425266666666,1.531899613833329 -Li2P2Pd2_12_10037.vasp,Li2P2Pd2,-2.4769209033333333,-0.06578234263889093 -Cs2Te2C2O6F6_1_4790.vasp,Cs2Te2C2O6F6,-3.18388861,0.6566980985648121 -Bi4B4_127_2600.vasp,Bi4B4,-2.01815112125,1.2957755254166667 -Mo2I4_11_11626.vasp,Mo2I4,-0.9391041000000001,0.3957005605555556 -Ba4Te8As4F4_14_2193.vasp,Ba4Te8As4F4,-2.5631137849999996,0.13443620000000056 -Ru1Br2_115_15260.vasp,RuBr2,-0.9640772066666666,0.7587061905555541 -Cu1Te1Ir1S1I1Br1_6_4988.vasp,CuTeIrSIBr,-1.208313965,0.18890247459595755 -Bi4W2O12_4_2657.vasp,Bi4W2O12,-4.755562943888889,0.21002928277777766 -Ag2C2Br2O2_31_211.vasp,Ag2C2Br2O2,-2.973806585,0.31550686125000027 -Al2O2_187_912.vasp,Al2O2,-5.2292854875,0.27765702166666184 -Al2F2_59_819.vasp,Al2F2,-3.139169265,0.33194391666666334 -Ta2Se2_129_17874.vasp,Ta2Se2,-4.99725962,0.4066576524999945 -Ge6P6_12_6966.vasp,Ge6P6,-3.6234060725,-0.5139202675000001 -Bi1S1Br1Cl1_6_2364.vasp,BiSBrCl,-1.197376115,0.45678909773437393 -Be2Rh1_123_2265.vasp,Be2Rh,-2.940707096666667,0.76331752625 -Sb2Te6Pt2_12_15741.vasp,Sb2Te6Pt2,-1.5957030639999998,0.3010806550999984 -Ta2Te6Pd1_12_17921.vasp,Ta2Te6Pd,-2.895780867777778,0.09447151527777287 -Ce1Sn2_123_3659.vasp,CeSn2,-1.5618244366666667,0.3785838583333334 -Sr2Ag2_191_17117.vasp,Sr2Ag2,0.6675357025,0.18221458000000007 -Ba4Bi4S8F4_14_2141.vasp,Ba4Bi4S8F4,-3.0408106295,0.10591905749999997 -Hf2Mn1Te1Cl4_8_7528.vasp,Hf2MnTeCl4,-2.80741217875,0.5374602181250001 -Ge2As2H2S6_7_6733.vasp,Ge2As2H2S6,-2.8846123341666665,0.27136287755208055 -K2Ge1O6F6_147_9111.vasp,K2GeO6F6,-2.1293069646666667,0.8764968275000002 -Au2S4Cl2_4_1525.vasp,Au2S4Cl2,-1.14398093125,0.125235061875 -Hf2As2O6_12_7429.vasp,Hf2As2O6,-6.044309449,0.3373450513333305 -Li2Cu2H8Cl6O4_2_9888.vasp,Li2Cu2H8Cl6O4,-2.9239199800000004,0.05648173560605574 -Al1Cd1In1S4_156_624.vasp,AlCdInS4,-2.3355775385714286,0.10160689749999996 -Li2Mn1P2S7Cl3_1_9988.vasp,Li2MnP2S7Cl3,-2.741269678,0.16822034204165748 -Ge1Cl2_164_6659.vasp,GeCl2,-1.9400744699999999,0.02711976666666671 -Nb1Se2_187_12580.vasp,NbSe2,-4.16603126,0.08983774750000073 -Pb2O2F2_59_14262.vasp,Pb2O2F2,-2.7755759533333335,0.2955162841666663 -Te6As2Os2_162_18641.vasp,Te6As2Os2,-2.392591519,0.47764766666666525 -As2Se2_12_1304.vasp,As2Se2,-2.32999839,0.37688654916666375 -Hf2Sc1Se3S1Br3_1_7591.vasp,Hf2ScSe3SBr3,-3.643850796,0.2016874944999978 -Sc1In1Se1S1I2_6_15950.vasp,ScInSeSI2,-2.203075815,0.10086471468750013 -Sr2H8O4F4_53_17244.vasp,Sr2H8O4F4,-4.013053457222222,0.12892624074073744 -Na2H10C12N4O12_3_12091.vasp,Na2H10C12N4O12,-5.341169542,0.44736193709375005 -Y2Al2Br2_164_20690.vasp,Y2Al2Br2,-3.243668955,0.12853271777777464 -Li4Nb2P8O26_2_10207.vasp,Li4Nb2P8O26,-5.67652121,0.09646005797499094 -C1Cl2_187_2725.vasp,CCl2,-1.2943870066666667,1.621340111666661 -Na2Cd4I6O8_31_12023.vasp,Na2Cd4I6O8,-1.1515153305,0.46348043358333246 -Ta3C2S2F2_187_17951.vasp,Ta3C2S2F2,-5.672151456666667,0.6570613839999868 -S8I8_2_15406.vasp,S8I8,-0.93392582125,0.18438109437499994 -Cr2I10_2_4409.vasp,Cr2I10,-0.20809462416666666,0.10122328479166637 -Te8Os4_3_18703.vasp,Te8Os4,-2.3195761691666665,-0.11770250083333345 -K2C2S8F6_1_9025.vasp,K2C2S8F6,-2.573486492222222,0.2901904602777692 -Mn2Se2_187_11284.vasp,Mn2Se2,-1.474307765,0.8141458862931013 -Nb1I5_47_12525.vasp,NbI5,-0.907929625,0.2769984033333335 -P4H8Pb2O16_2_14081.vasp,P4H8Pb2O16,-4.847315296666666,0.07216427216666244 -Ni2O2_187_13546.vasp,Ni2O2,-1.68425615,0.14159269500000016 -Zn1Cl2_164_20915.vasp,ZnCl2,-0.5147718866666667,0.08539273479166654 -Sb10S12_47_15410.vasp,Sb10S12,-2.025294840454545,0.7313868206818166 -Bi1Te1Cl1_156_2398.vasp,BiTeCl,-1.30360982,0.2533039766666667 -Mn4H2C3O2_164_11435.vasp,Mn4H2C3O2,-4.4957082663636365,0.4854922690909047 -Na2Os2I8N2O4_7_12249.vasp,Na2Os2I8N2O4,-2.3105186694444444,0.14314985590277585 -Mg2P4_12_10498.vasp,Mg2P4,-2.6471430683333335,0.5743277519166639 -U2S6_129_19721.vasp,U2S6,-5.06018873875,0.12153923124999988 -Mn1Pd1I2_1_10844.vasp,MnPdI2,-0.467366825,0.27885141296875 -Nb4F16_14_13067.vasp,Nb4F16,-4.0468891255,0.1524933484999964 -Ga2I6_189_6392.vasp,Ga2I6,-0.25802925375,0.35513920687499995 -Cr1Cl2_115_4141.vasp,CrCl2,-1.9703448433333335,0.10455543777777576 -Hf3B2H2Se2_187_7680.vasp,Hf3B2H2Se2,-4.8870523722222226,0.5334668344444395 -Re2Br6_162_15034.vasp,Re2Br6,-1.88786811,0.3650068995833331 -Hf2Tl2Cu2Se6_51_7656.vasp,Hf2Tl2Cu2Se6,-2.6770284341666666,0.1364849024999999 -Mo4C3Cl2_164_11734.vasp,Mo4C3Cl2,-4.4136666544444445,0.2309925548148105 -Ge2P2S6F2_7_6809.vasp,Ge2P2S6F2,-3.1611290008333337,0.07548029905381276 -Ta2S2I4_25_17849.vasp,Ta2S2I4,-2.86211507,0.20923091843749964 -Be2As1_25_2237.vasp,Be2As,-2.26038075,0.8831231549999975 -Cr2N1F2_164_4423.vasp,Cr2NF2,-4.06551563,-0.05621758044444869 -Cr2Ag2Te12P4_13_4305.vasp,Cr2Ag2Te12P4,-1.7213189254999999,0.39917479791666677 -K2Hf1S6F6_1_9168.vasp,K2HfS6F6,-2.4320969593333337,0.9026560494166669 -Mo2Cl2O2_6_11593.vasp,Mo2Cl2O2,-3.605732826666667,0.19913783305555555 -Na2Te2C2N2_31_12314.vasp,Na2Te2C2N2,-4.1508221025,0.06709829066665923 -Ga1Se1Cl1_8_6270.vasp,GaSeCl,-1.9403970733333333,0.1816542483333332 -Cr2Ni1Te3Se1I1_1_4432.vasp,Cr2NiTe3SeI,-1.40995238625,0.10489530724999796 -Fe1Se2_123_5755.vasp,FeSe2,-1.4917419166666666,0.8101168416666666 -Ti1I2_115_18795.vasp,TiI2,-1.9789821566666665,0.5454470083333334 -Te2As2_12_18360.vasp,Te2As2,-1.97698522,0.3194417158333307 -Li2H6Pb1O6_147_9948.vasp,Li2H6PbO6,-4.064507838666667,0.0911872383333332 -Mn1Ag1I1N1Cl1O1F1_6_10612.vasp,MnAgINClOF,-2.10807069,0.42698992026785454 -Ti1Te2_164_18859.vasp,TiTe2,-3.5117112366666667,0.11849602166666662 -Ba3Co2S5Cl2_123_2102.vasp,Ba3Co2S5Cl2,-2.7775821541666663,0.19744271794270274 -Ca2Ag1Te2Cl2_38_2917.vasp,Ca2AgTe2Cl2,-1.2367772428571429,0.2875877501190447 -Os2Cl2_164_13840.vasp,Os2Cl2,-2.6506400925,0.5709586318749997 -Zr2S1I2_8_21640.vasp,Zr2SI2,-2.8827048399999997,0.20198737900000063 -Sc2Sn2H3Se1O7_1_16169.vasp,Sc2Sn2H3SeO7,-4.5613292780000005,0.23511274024998996 -Sb1Te2H1S6_1_15514.vasp,SbTe2HS6,-2.343468609,0.203821234958331 -Sb18Cl4_11_15426.vasp,Sb18Cl4,-2.0019698645454547,0.09630623886363421 -Ba2Au1Se2Cl2_38_1912.vasp,Ba2AuSe2Cl2,-1.8973524428571429,0.3133804876339247 -Al1Ag1Sb2Te6_149_603.vasp,AlAgSb2Te6,-1.3437726140000001,0.3045222856666649 -Mn2Mo1W2Br2N1Cl4O2_1_11135.vasp,Mn2MoW2Br2NCl4O2,-3.0788773064285713,0.28569523322035123 -Si2Br8_1_16392.vasp,Si2Br8,-1.476095063,0.09101490499999998 -Cr2B1Se2_164_4325.vasp,Cr2BSe2,-3.445707608,0.07199354124999502 -In2S1I1_1_8540.vasp,In2SI,-1.2486644175,0.3901360500000002 -V2C1S2F2_164_20020.vasp,V2CS2F2,-3.6147802271428575,0.610954834761894 -Ni2P2N2O10_31_13557.vasp,Ni2P2N2O10,-4.477171813125,0.0298991398437507 -Ba2I2_129_2003.vasp,Ba2I2,-0.5831143925,0.6731721574999999 -Mn1Ga2Se4_164_10728.vasp,MnGa2Se4,-2.4063894614285712,-0.042980104285714305 -K2Ru2N2O2F10_11_9323.vasp,K2Ru2N2O2F10,-3.0718077444444445,-0.13604594835649364 -Al1Cu1As2O6_149_636.vasp,AlCuAs2O6,-3.9464963519999996,0.6420678506249966 -Ni1B4C2F6_47_13266.vasp,NiB4C2F6,-3.973674046153846,0.5183452003525548 -Nb1S2_187_12563.vasp,NbS2,-4.87254534,0.08484006499999985 -Pb6N6_12_14331.vasp,Pb6N6,-2.9303430733333333,0.5006252979166669 -Pb2S4N2_2_14282.vasp,Pb2S4N2,-2.96747969625,-0.5930041182812498 -Hg2Au2Se2I2_26_7933.vasp,Hg2Au2Se2I2,0.4102062425,0.041497367291667475 -Al1Fe5F2_123_659.vasp,AlFe5F2,-1.12221910875,1.4886248691666646 -Zr2N2F2_164_21609.vasp,Zr2N2F2,-6.184593766666667,0.11458466166666703 -Ti4C3F2_164_19129.vasp,Ti4C3F2,-7.005949896666667,-0.4384398033333399 -Li2Pr1P2_164_10044.vasp,Li2PrP2,-3.4446366939999997,0.2950136921250005 -H2C2S1_164_6992.vasp,H2C2S,-4.19349669,1.017936041875001 -V2Te1I1N1_8_20200.vasp,V2TeIN,-3.4707026319999996,0.16252541644443674 -Cs2I2F8_127_4750.vasp,Cs2I2F8,-1.4751982816666667,0.15144759166666666 -In1Ge1Te3_143_8267.vasp,InGeTe3,-1.301730762,0.11800995899999861 -H2Pb1_115_7003.vasp,H2Pb,-1.8663160633333333,1.793585799999997 -Nb4Co4S8_53_13057.vasp,Nb4Co4S8,-3.93294944,0.3167367704166639 -Zr1Pd1Cl6_149_21399.vasp,ZrPdCl6,-2.0116343875,0.07887437791666674 -Ca4Mn2I2O6_129_3223.vasp,Ca4Mn2I2O6,-3.8207921035714283,-0.16075415145833527 -Ca2Bi1_164_2952.vasp,Ca2Bi,-0.36488302333333333,0.5912939166666668 -Ag2S2Br2_59_376.vasp,Ag2S2Br2,-0.48860270666666666,0.32000814312499926 -Co1B4C2I2F4_47_3701.vasp,CoB4C2I2F4,-3.8020878684615385,0.38164698057691304 -Bi1Se1Br1_156_2386.vasp,BiSeBr,-1.5494930233333333,0.0873360299999999 -Al1Ni5I2_123_699.vasp,AlNi5I2,0.00470847125,1.1352985062499994 -Zn1Ni1Br2_156_20976.vasp,ZnNiBr2,0.4129983625,0.9025529753125 -Al1Sn1F5_47_743.vasp,AlSnF5,-2.8738560742857144,0.5600803210714254 -Zr2Se10_59_21670.vasp,Zr2Se10,-2.954495055,0.21877369861110818 -P2F6_12_13974.vasp,P2F6,-2.780306705,0.5508942475 -W4C3F2_164_20576.vasp,W4C3F2,-5.725642967777778,0.1012954513888833 -V2Cl10_2_20028.vasp,V2Cl10,-1.6392079166666667,0.006851194166664909 -Y4Cl6_12_20819.vasp,Y4Cl6,-3.577196066,0.08707015599999979 -Tl4V6O16_100_19638.vasp,Tl4V6O16,-4.658625378846154,0.19960972901096907 -Sc1Cu1Sb2Se6_149_15929.vasp,ScCuSb2Se6,-2.1467963180000003,0.33264703155555125 -Li1Ga1I4O12_2_9709.vasp,LiGaI4O12,-2.9594847544444445,0.11282306444444457 -Nb2Br10_1_12639.vasp,Nb2Br10,-1.5487159166666666,0.21479319250000017 -Hf2S3Br1Cl2_1_7577.vasp,Hf2S3BrCl2,-3.8075285425,0.29537542796874994 -Se8F8_2_16306.vasp,Se8F8,-1.72664160875,0.37506608406249997 -Al2As2S6_157_762.vasp,Al2As2S6,-3.220188123,0.40920622112500027 -Tb5Cl8_10_18214.vasp,Tb5Cl8,-2.654623806153846,0.13464308641025408 -Mn1Zn1Se2_25_10945.vasp,MnZnSe2,-1.1674136125,0.32681489002154945 -Sc2S1I1Cl1_8_16129.vasp,Sc2SICl,-3.130222028,0.04385463858333083 -Cr1Co3O8_164_4147.vasp,CrCo3O8,-4.088957680833333,-0.5927826100520907 -Be1C2_164_2217.vasp,BeC2,-3.952144673333333,2.1334023516666667 -Si2Ni1Se4_8_16416.vasp,Si2NiSe4,-2.360970275714286,0.26375750811224163 -Re4Br14_13_15102.vasp,Re4Br14,-1.8144681744444446,0.187369046296294 -Li2H10C12N4O10_11_9926.vasp,Li2H10C12N4O10,-5.766320645263158,0.18440137957784497 -Ag2Cl2_164_246.vasp,Ag2Cl2,-0.03796015,0.09135877750000002 -Cd1Cl1O1_156_3300.vasp,CdClO,-0.6886712366666666,0.5967033102083308 -Sb1I3_187_15463.vasp,SbI3,-0.1572773175,0.436434515 -Ni2Sb4_2_13625.vasp,Ni2Sb4,-1.2293850783333333,-0.69092287 -Ag2H8C8I2_2_295.vasp,Ag2H8C8I2,-4.3229539215,0.29540718950000056 -Co2H2O4_11_3909.vasp,Co2H2O4,-4.16895446375,0.10783799375000047 -Hf4Te4Br4_31_7821.vasp,Hf4Te4Br4,-3.2181301424999997,0.1360407458333306 -V2Se2_123_20190.vasp,V2Se2,-3.2119806725,0.23467168874999622 -In2Co2Se5_164_8416.vasp,In2Co2Se5,-1.9400361066666667,0.11926378214814382 -Sn6P2O12_7_16994.vasp,Sn6P2O12,-4.373272164,0.034435033749996125 -Ga1Ag1Sb2S6_149_6122.vasp,GaAgSb2S6,-2.149654808,0.3497519329374974 -Sr3N3_25_17389.vasp,Sr3N3,-2.6645033833333334,1.1620034041666665 -Na1Br2_25_11831.vasp,NaBr2,-0.7914210833333333,-0.1018703500000005 -Ti1Pd3Se8_1_18831.vasp,TiPd3Se8,-2.345842360833333,0.15853066416666683 -Ir1N4Cl6_164_8740.vasp,IrN4Cl6,-1.7455850099999999,0.9345074674999958 -Cr2H2O5_12_4399.vasp,Cr2H2O5,-4.680172124444444,-0.19973468486111484 -Mn2In2Se5_187_11125.vasp,Mn2In2Se5,-2.212670777777778,-0.08892578860153483 -Co4P4N4O16_2_4082.vasp,Co4P4N4O16,-5.1047529825,-0.16672403267857583 -Na1Ga1Br4O12_2_11860.vasp,NaGaBr4O12,-2.5392716666666666,0.2353523065277754 -Hf3Mo6O24_147_7717.vasp,Hf3Mo6O24,-5.8014584,0.080737858181819 -V2F8_14_20063.vasp,V2F8,-3.2993957860000003,-0.019046337000000246 -Co2Cl6_162_3892.vasp,Co2Cl6,-1.34960363375,0.05315342750000007 -Y2Cl2O2_164_20716.vasp,Y2Cl2O2,-5.724604318333333,0.032813743333333534 -Cr3C2S2_187_4551.vasp,Cr3C2S2,-4.497857507142857,0.23782854964284472 -Rb2Sb4Se8_2_14940.vasp,Rb2Sb4Se8,-1.9919065557142857,0.14690156571428603 -Bi3Se4_164_2589.vasp,Bi3Se4,-1.9585925142857143,0.07155520928571313 -K4Cu2S2Cl4O8_26_9441.vasp,K4Cu2S2Cl4O8,-2.6997550395000003,0.13341984900000026 -Sr2Cu1Se2Cl2_38_17205.vasp,Sr2CuSe2Cl2,-1.8254403428571429,0.18686274809523473 -Ta1I5_2_17560.vasp,TaI5,-1.1208742333333335,0.29878382604166664 -Mn2S2_10_11222.vasp,Mn2S2,-2.6672828125,0.29025341000000004 -Na1Co1As2S6_149_11842.vasp,NaCoAs2S6,-2.6548143719999997,0.5188967354605202 -Nb4O10_4_13113.vasp,Nb4O10,-6.5255042507142855,-0.05832924589285965 -Ag1Pt1Br6_1_104.vasp,AgPtBr6,-0.237882565,0.09959014062500002 -Nb2Br10_2_12640.vasp,Nb2Br10,-1.7832872883333335,-0.019778179166666687 -Te8Mo1W3_25_18698.vasp,Te8MoW3,-2.7053441358333337,0.10605289041666621 -Zr4H2C3O2_164_21821.vasp,Zr4H2C3O2,-6.189506017272728,0.15223578818179706 -Sb10S10_26_15409.vasp,Sb10S10,-2.4058023095,0.31145313591666457 -Co2Te2As1_187_4031.vasp,Co2Te2As,-2.1024227079999998,-0.12322469083333287 -Sn3Sb2S9_174_16929.vasp,Sn3Sb2S9,-2.3802112642857147,0.30108739285714003 -Au2S2_164_1517.vasp,Au2S2,-0.4900807075,0.5217078575 -K2Nb2Cu4S8_28_9262.vasp,K2Nb2Cu4S8,-2.529897519375,0.19689269250000008 -Ag4H4S4I4_2_523.vasp,Ag4H4S4I4,-1.1925615925,0.17288858710937505 -Cd1H4C6Cl2_10_3354.vasp,CdH4C6Cl2,-4.46303419076923,0.4849959323076853 -Ta2Te2_129_17908.vasp,Ta2Te2,-4.4533071325,0.2930718987499952 -Mg1W2O5_38_10413.vasp,MgW2O5,-5.45572602125,0.4799415884948913 -Mn2Br2_164_11032.vasp,Mn2Br2,-1.01234696,0.46404448381465535 -Ag1H4N12O2_6_77.vasp,AgH4N12O2,-4.820650278947368,-0.0038659696491238904 -Nb3Cu1Te1Se1I1Br3_1_12971.vasp,Nb3CuTeSeIBr3,-2.458321705,0.37083739891517226 -Sn2Cl8_1_16766.vasp,Sn2Cl8,-1.216103796,0.07370386499999992 -Hf1Zr1S1I2_156_7390.vasp,HfZrSI2,-3.3346970560000004,0.0443814210000002 -Ta3Ni3S14_6_17972.vasp,Ta3Ni3S14,-3.4563070959999997,-0.15663435604687698 -As2Cl6_150_1204.vasp,As2Cl6,-1.520147035,0.07275845000000003 -K2C2S6F2_1_9022.vasp,K2C2S6F2,-2.94301716,0.2111285630208275 -In1Pd1Se1S1I2_6_8307.vasp,InPdSeSI2,-1.1975336316666667,0.1334683514583318 -Hf1Zr1Pd2S4I4_1_7388.vasp,HfZrPd2S4I4,-2.5540194075,0.12794533180555412 -Ho2S2I2_59_8144.vasp,Ho2S2I2,-3.2374150683333336,0.04759434166666665 -K1Pb1S2_156_8926.vasp,KPbS2,-1.6056655625,-0.3598904754166667 -Mo3S2N2_187_11723.vasp,Mo3S2N2,-4.610759801428571,0.2740326521428529 -Sr2Fe1O3_38_17218.vasp,Sr2FeO3,-3.7767916416666663,0.18522066611110866 -Zn2As4I4O6_31_21031.vasp,Zn2As4I4O6,-2.60392103375,0.08059825953125002 -Cd1H2S2_5_3340.vasp,CdH2S2,-2.155755472,0.07993198400000012 -S1O3_187_15380.vasp,SO3,-3.2741599625,0.8937679843749993 -Co2Br2O2_59_3875.vasp,Co2Br2O2,-2.62295966,-0.5148185793055571 -Ga1Cu1Se2Br1Cl1_1_6176.vasp,GaCuSe2BrCl,-1.2287129566666668,0.244234590805552 -Sr1Th1Br6_25_17096.vasp,SrThBr6,-2.2888020025,0.06229672187499968 -Tl4P20_26_19614.vasp,Tl4P20,-3.3780863870833335,0.10349223166666643 -Fe5Ge1Te2_156_6091.vasp,Fe5GeTe2,-0.90974493875,0.1943455581249984 -Rb2C2Se2S6F6_1_14797.vasp,Rb2C2Se2S6F6,-2.6249277833333333,0.3719537421990712 -Sn2Sb2S6_147_16867.vasp,Sn2Sb2S6,-2.34061943,0.3380836942499954 -Mo1P2_164_11534.vasp,MoP2,-3.847594753333333,0.5857393000000006 -Nb2Si2As2_129_12889.vasp,Nb2Si2As2,-4.89514699,0.3265633216666668 -Hf3Te2_123_7738.vasp,Hf3Te2,-4.55234423,0.08460250400000024 -Tm2Se6_51_19688.vasp,Tm2Se6,-2.78306215625,0.5112075740625 -Zn1H1N3O1_156_20949.vasp,ZnHN3O,-4.4415310266666665,-1.3063288654166691 -Li2V2F10_1_10117.vasp,Li2V2F10,-3.4203212692857146,-0.037633545952387326 -Li1V2O1F7_8_9810.vasp,LiV2OF7,-3.6927839463636363,-0.2773302739339912 -Fe1Bi1S1I1Br1_8_5632.vasp,FeBiSIBr,-1.113256454,0.10553082899999856 -Mn1In2Se4_156_10787.vasp,MnIn2Se4,-1.9919532214285716,0.08473214999999978 -Ba2Cu1Cl2O2_123_1963.vasp,Ba2CuCl2O2,-2.964695924285714,0.16016950041666211 -Cd1H4C2N4Cl2_10_3346.vasp,CdH4C2N4Cl2,-4.247563223846154,0.11447996871794448 -Al2Se2_187_970.vasp,Al2Se2,-2.90149275,0.04686629500000006 -K2B2H6Se2O6_4_8991.vasp,K2B2H6Se2O6,-3.4310541227777778,0.9565236509837796 -Zr2Te2_164_21712.vasp,Zr2Te2,-2.8541535075,0.10801702749999986 -Cu2B2S2I2_31_5032.vasp,Cu2B2S2I2,-1.557663745,0.8106570112499989 -Tl1Co5I2_123_19248.vasp,TlCo5I2,-0.5669335875,0.5866038083333326 -Au1Cl2_187_1420.vasp,AuCl2,0.3140483333333333,0.372207585 -Cd2Te2Br2_59_3588.vasp,Cd2Te2Br2,0.10883068333333333,0.09094499319444371 -Cu2W1O4_8_5362.vasp,Cu2WO4,-3.7684298928571427,0.5158748798214225 -As2O3_1_1231.vasp,As2O3,-4.259931226,0.225306346 -Nb4B3Cl2_164_13032.vasp,Nb4B3Cl2,-5.625522583333333,0.23484122777776584 -Si4Pb8S16_14_16505.vasp,Si4Pb8S16,-2.9230459814285714,0.13781231035714292 -Cu2C2S2I2_31_5068.vasp,Cu2C2S2I2,-2.02881572375,0.5961945188690462 -Cr3Mo1S8_25_4562.vasp,Cr3MoS8,-3.4788822875,0.06035727208333341 -Sb4P2S4O26_1_15799.vasp,Sb4P2S4O26,-4.417350325555556,0.18820089420137665 -Tl4B6S20_2_19590.vasp,Tl4B6S20,-3.2038579703333334,0.13818507520833054 -P2W8Cl22_59_14064.vasp,P2W8Cl22,-2.6783496303125,0.05712364218750032 -Sb2Br6_189_15555.vasp,Sb2Br6,-0.93753587,0.16130275125000004 -Te2Au2_10_18369.vasp,Te2Au2,-0.137226295,0.2914103525 -Y3H2C2O2_187_20794.vasp,Y3H2C2O2,-5.775305081111111,0.5548556128240607 -Cs1Pb1O2_156_4646.vasp,CsPbO2,-2.431079255,0.40533787304687496 -Zr1Bi2_187_21262.vasp,ZrBi2,-2.3396738633333336,-0.9041853891666671 -Ti3H2O4_12_19087.vasp,Ti3H2O4,-6.140969682222223,0.5423353655555445 -Nd1C5_47_13217.vasp,NdC5,-5.370568333333334,1.9051837833333263 -Pb2Cl2F2_129_14234.vasp,Pb2Cl2F2,-2.14570304,0.12007066166666691 -Ta2Co2Se10_51_17702.vasp,Ta2Co2Se10,-3.1741152464285713,0.20365566059523532 -Sr1Br2_164_17031.vasp,SrBr2,-1.8357064733333335,0.0074625433333332936 -Tl2As2O6_1_19361.vasp,Tl2As2O6,-3.431446848,0.38421229450000016 -Ba2Mn2Tl1O7_123_2027.vasp,Ba2Mn2TlO7,-3.9362198708333334,0.358993253715275 -Cd1Ga2Te4_164_3312.vasp,CdGa2Te4,-1.1226956271428572,0.13900949857142852 -Dy2H4Cl2O4_11_5527.vasp,Dy2H4Cl2O4,-4.6644009083333335,0.08392613916666658 -Cu2B2O2F2_31_5028.vasp,Cu2B2O2F2,-3.0846961625,1.4077446938888836 -Ta2Fe2Se6_11_17728.vasp,Ta2Fe2Se6,-3.3255732119999997,0.053262020999999216 -In2H2S10_11_8461.vasp,In2H2S10,-2.51817646,0.1979750091964262 -Na2H2O2_2_12099.vasp,Na2H2O2,-3.6089826866666663,0.07871814833333346 -Ca4Co2Br2O6_129_3209.vasp,Ca4Co2Br2O6,-3.827060252857143,-0.2963292916666709 -Pb4O10_7_14313.vasp,Pb4O10,-3.237412512857143,0.20492151089285437 -Tl1Cl1_99_19241.vasp,TlCl,-0.2873542,0.64014361 -Be2B4C4_25_2241.vasp,Be2B4C4,-5.614297687,0.568583601666667 -Pb1Au1F6_2_14169.vasp,PbAuF6,-1.3129939975,0.19254552322916663 -In4As4_127_8663.vasp,In4As4,-1.44895308,-0.13461431999999984 -Co2Sb4Br4O6_2_4011.vasp,Co2Sb4Br4O6,-2.987111265,0.07594609947916497 -Ag2Se4_11_444.vasp,Ag2Se4,-0.7771569966666667,-0.43486016833333335 -Cu2Te1S1I1_1_5324.vasp,Cu2TeSI,-0.5486977740000001,0.13901472387499864 -Te10Ru8_1_18271.vasp,Te10Ru8,-2.2749180127777775,0.6089019063888856 -Mo6Se4Cl2O16_1_11764.vasp,Mo6Se4Cl2O16,-3.9570598471428573,0.5058737870039649 -Sb1Cl3_187_15448.vasp,SbCl3,-1.0917354675,0.4275063575 -In2Se2Br2_31_8575.vasp,In2Se2Br2,-1.4839942366666667,0.07159709333333342 -Mn1Te2Mo1_115_10908.vasp,MnTe2Mo,-2.0163843175,0.12814786187499982 -Te1Pt8Se7I4_1_18331.vasp,TePt8Se7I4,-1.4552199035,0.19090492293749806 -Al2I6_1_882.vasp,Al2I6,-0.86489446625,0.11691180000000001 -Sc2Sb2Se6_157_16147.vasp,Sc2Sb2Se6,-2.95329143,0.2015360279999998 -Sb2Se2F2_59_15692.vasp,Sb2Se2F2,-2.3560003516666668,0.34040329388888657 -Tl4Sb20_26_19623.vasp,Tl4Sb20,-1.6616280316666667,0.2792403731249997 -Mn3V1O8_12_11418.vasp,Mn3VO8,-4.729857361666666,-0.005604183489587133 -Te4Pd2_14_18617.vasp,Te4Pd2,-1.199594875,0.28944966166666664 -Nb3Se1I7_156_13013.vasp,Nb3SeI7,-2.1830463754545453,0.09075947090909109 -Mn1Ni1Se2S1Br1_8_10829.vasp,MnNiSe2SBr,-1.4084933266666668,0.4064215592361086 -P2W2_12_14062.vasp,P2W2,-4.966752595,-0.5019899250000002 -Cr2Te4Pd1_164_4528.vasp,Cr2Te4Pd,-1.7791747900000001,0.011611025571426736 -Ga2Te5_1_6519.vasp,Ga2Te5,-1.5588870757142856,0.2861902885714287 -Sr4As4H4S8_14_17404.vasp,Sr4As4H4S8,-2.9849326525,0.10266574093749714 -Ca2H8S2O12_13_3043.vasp,Ca2H8S2O12,-4.523316104583333,0.04406177055555549 -Sc4C3O2_164_16231.vasp,Sc4C3O2,-5.583768357777778,0.5941881365436446 -Sr2As1_25_17120.vasp,Sr2As,-0.8458074933333334,0.9077078594444427 -Li2Ti2C2I2_59_10093.vasp,Li2Ti2C2I2,-4.44651021625,0.17098493999999986 -Cs2Ru2N2O2F10_11_4775.vasp,Cs2Ru2N2O2F10,-3.057879756666667,-0.1331597418518642 -Ga2H10N4F4_10_6372.vasp,Ga2H10N4F4,-4.1309711455,0.13229499387499072 -Rh2Se6_7_15248.vasp,Rh2Se6,-2.20812004875,0.39256910402777556 -Hf1Mo1Br2O2_1_7232.vasp,HfMoBr2O2,-4.4925371683333335,0.33270075291666634 -Hf1Au1S1I4_6_7112.vasp,HfAuSI4,-1.3766186557142857,0.23411193017857046 -Zn3In2O6_8_21206.vasp,Zn3In2O6,-2.83782371,0.1991715696590879 -Cr2S2_164_4469.vasp,Cr2S2,-3.307509575,0.4725014799999998 -Hf1Zr3Br1Cl7_1_7415.vasp,HfZr3BrCl7,-3.1194637433333336,0.11817589437499626 -W2Cl6_189_20488.vasp,W2Cl6,-2.17565412375,0.36737693375 -Ag2P4S3Cl2_6_360.vasp,Ag2P4S3Cl2,-2.213956252727273,0.15413967188899358 -Ti2N2F2_59_18969.vasp,Ti2N2F2,-6.46506472,-0.6078349986111173 -Ga3Rh1_187_6531.vasp,Ga3Rh,-1.509911025,0.8172782924999997 -Co2Te2P1_187_4037.vasp,Co2Te2P,-2.3481818700000003,0.10162334516666649 -Ca1Sn3S4Br4_3_2889.vasp,CaSn3S4Br4,-1.9257482333333333,0.15190446833333326 -Ag2S2F2_59_378.vasp,Ag2S2F2,-0.8461259766666666,0.45458451817708123 -Sr2C8O14_12_17165.vasp,Sr2C8O14,-5.614021668333333,0.5920002195833276 -Au2Cl2O4_17_1466.vasp,Au2Cl2O4,-1.480424225,0.18530465239583338 -Rb2Ru2C2I8O4_59_14923.vasp,Rb2Ru2C2I8O4,-2.258308673888889,0.21349443277777574 -Cd2Fe3S8_10_3506.vasp,Cd2Fe3S8,-1.6866483515384614,-0.1181261915384626 -Al2O4_59_920.vasp,Al2O4,-5.06698151,0.5954914877083288 -K2Os2S2N2Cl10_2_9284.vasp,K2Os2S2N2Cl10,-2.283127483888889,-0.005371390902784934 -H6I6N4_11_7084.vasp,H6I6N4,-2.6159544025,0.2553976187695315 -Ga1Co5Cl2_123_6153.vasp,GaCo5Cl2,-1.42474493625,0.37335172249999793 -Ge2Cl2_129_6767.vasp,Ge2Cl2,-1.832166265,0.18647331874999995 -Li2V1P2O8_2_10106.vasp,Li2VP2O8,-5.1059840169230775,0.40682571032050663 -Hf2Te2_164_7641.vasp,Hf2Te2,-3.5760736175,0.6179992993750003 -Hf1In1Au2N2Cl4O2_8_7203.vasp,HfInAu2N2Cl4O2,-2.765417395,0.684052930208329 -In2Pd1O4_164_8526.vasp,In2PdO4,-3.186117497142857,0.4529664994642829 -W2F6_189_20495.vasp,W2F6,-3.54347662875,0.3312870359375 -Sr4Sb4Te8Cl4_14_17472.vasp,Sr4Sb4Te8Cl4,-1.9668699024999998,0.029688996499998566 -Sc2P2S6_162_16119.vasp,Sc2P2S6,-3.8358951439999998,0.16454265489285347 -Te8Br4_31_18691.vasp,Te8Br4,-0.9254094733333332,-0.9081449479166666 -Y2F2_164_20727.vasp,Y2F2,-4.3967733825,0.47665735666666187 -Na2Ge1H6O6_147_12085.vasp,Na2GeH6O6,-4.204093888,0.027544781500000504 -Li2Cu1_187_9884.vasp,Li2Cu,-0.63284744,0.06108001777777772 -V1Br2_164_19788.vasp,VBr2,-1.6746448833333334,0.07166994999999998 -Rb2Os2S2N2F10_11_14914.vasp,Rb2Os2S2N2F10,-3.065014096111111,-0.1007399398931651 -Tl2Bi2S6_149_19374.vasp,Tl2Bi2S6,-1.6839938929999998,0.5409443688749979 -Cr2O4_11_4439.vasp,Cr2O4,-4.843259858333333,-0.025264003958336723 -Ti2Sb2Se6_12_19014.vasp,Ti2Sb2Se6,-3.3513553600000003,0.2712448344999978 -Tl2F6_12_19412.vasp,Tl2F6,-1.547435905,-0.07380894437499985 -Zr2Te4Br10_10_21715.vasp,Zr2Te4Br10,-1.64502091375,-0.2475134148437499 -Ag3P1O4_156_498.vasp,Ag3PO4,-2.66355691625,0.35940003249999997 -Hf1Ti1I2O2_6_7330.vasp,HfTiI2O2,-4.925666988333333,0.2873826335185137 -Ru1S1I1Br1_25_15289.vasp,RuSIBr,-1.541346435,0.3718494444843736 -Y2Br6_162_20704.vasp,Y2Br6,-2.82076355375,0.08408977750000002 -Ta2Co4Se2S2_51_17708.vasp,Ta2Co4Se2S2,-3.6524007220000003,-0.4489409209999997 -Sr2F2_123_17215.vasp,Sr2F2,-1.947564365,0.9922094400000001 -Tl1Sb2Au1O6_149_19338.vasp,TlSb2AuO6,-2.704893908,0.904066279499999 -Ga2Se2O8F2_11_6474.vasp,Ga2Se2O8F2,-3.3487573957142858,0.173654835119041 -Ti2Sb2Te6_2_19015.vasp,Ti2Sb2Te6,-2.651133138,0.29466424649999845 -Nb4Se2_129_13151.vasp,Nb4Se2,-5.2640956050000005,0.09436644250000015 -Al1Pt5Cl2_38_716.vasp,AlPt5Cl2,-1.6973016725,0.8191482612499972 -Be1Sb2S4F4_1_2232.vasp,BeSb2S4F4,-2.6533591863636365,0.5967874014772665 -U4S10_10_19735.vasp,U4S10,-5.465157203571429,0.0053543092857091246 -Ge2P2H2S6_7_6803.vasp,Ge2P2H2S6,-3.2329029516666665,0.07968589638888524 -Tc4O12F4_14_18251.vasp,Tc4O12F4,-5.0771073155,-0.011678935625005327 -Cr2O2_129_4436.vasp,Cr2O2,-4.2012366425,0.9240623574999955 -Cr1W1Cl6_65_4284.vasp,CrWCl6,-2.0171610775,0.09642444250000021 -Ag1Au1S2I1Br1_1_11.vasp,AgAuS2IBr,-0.5826166983333333,0.09134283597222154 -Ag1Pd2S4_187_103.vasp,AgPd2S4,-1.7169102085714285,0.17393116982142476 -Co2As2_129_3850.vasp,Co2As2,-2.453725465,0.02811461624999989 -Nb2B1F2_164_12628.vasp,Nb2BF2,-5.329552852,0.2017848581999826 -Li4Te4S8_13_10232.vasp,Li4Te4S8,-2.422457809375,0.17451693138020832 -In2I2O2_59_8476.vasp,In2I2O2,-2.3590122366666666,0.05962725624999754 -Te2Mo2_12_18412.vasp,Te2Mo2,-2.238652375,0.6146553624999997 -Sb6Pb6_2_15853.vasp,Sb6Pb6,-1.247539195,0.5583374012499999 -Ag2F6_191_260.vasp,Ag2F6,-0.33129524625,0.16882703875 -Si6P8_38_16540.vasp,Si6P8,-3.809018747857143,-0.0665441036904797 -Sr2Sb4_12_17314.vasp,Sr2Sb4,-1.52496863,0.5141977733333332 -Pb1Cl4_123_14181.vasp,PbCl4,-0.712084064,0.14079743800000008 -Ni2Se2S6_11_13638.vasp,Ni2Se2S6,-1.872204838,0.2191361867916647 -V1I2_187_19869.vasp,VI2,-1.0546455700000001,0.048800475555555334 -Ag2Te3As4Br2_6_467.vasp,Ag2Te3As4Br2,-1.3232884918181818,0.21236975499999677 -Tl1Br2_115_19229.vasp,TlBr2,-0.28406017,0.28399354375 -Hf3Se2_123_7731.vasp,Hf3Se2,-5.13189782,-0.06784009700000437 -Cu4P16Se12Cl4_14_5435.vasp,Cu4P16Se12Cl4,-2.5826331130555555,0.040078517418977055 -Pb1Se2_187_14210.vasp,PbSe2,-1.6529859900000001,0.41631962340277584 -K2B2H6C8S2_51_8987.vasp,K2B2H6C8S2,-4.156775255,1.2002088947017409 -Ir2Se2_164_8843.vasp,Ir2Se2,-2.7557844975,0.31183529437500024 -Co1Ni1S2Br2Cl2_3_3787.vasp,CoNiS2Br2Cl2,-1.20243205,0.09664763479166305 -Fe2Se2_123_5981.vasp,Fe2Se2,-1.1717785575,0.21161428000000004 -Ir2O6_7_8801.vasp,Ir2O6,-3.6078852125,0.7146622540625003 -Ba2Cu2_191_1978.vasp,Ba2Cu2,0.4147066425,0.1736451775 -Ta1I1Cl1_156_17553.vasp,TaICl,-2.6913137766666666,0.6818443269047587 -Ga2Fe1Se4_164_6350.vasp,Ga2FeSe4,-2.3373776514285716,-0.2635554285714301 -Ni1H8C6O4_10_13359.vasp,NiH8C6O4,-4.940197430526315,0.4151966222806972 -In2Ga2O6_31_8445.vasp,In2Ga2O6,-4.1901337409999995,-0.13672260625000265 -Ag1S1Br1Cl1_1_109.vasp,AgSBrCl,-0.530043345,0.1852653031249999 -Li1As2Pd1O6_1_9652.vasp,LiAs2PdO6,-3.697089019,0.43583813912499614 -Ca1Sn2S1Br2Cl1O1_1_2887.vasp,CaSn2SBr2ClO,-2.229517835,0.20027555281249998 -Pb2I4_12_14254.vasp,Pb2I4,-0.49918135333333336,0.2213244127777778 -In2Ni4S6_164_8504.vasp,In2Ni4S6,-1.5914725433333334,0.042992343263886124 -Ag2Se2Br2_59_428.vasp,Ag2Se2Br2,-0.35047833,0.35483377111111053 -Sc2Cl2_164_16064.vasp,Sc2Cl2,-2.671493845,0.17213085333333034 -V2Cl2_164_20033.vasp,V2Cl2,-2.54302479,0.43990255999999994 -Ba4B2Br2O6_164_2137.vasp,Ba4B2Br2O6,-4.966189614285715,0.04968173357142369 -K2C2S8Cl6_1_9024.vasp,K2C2S8Cl6,-2.124847868333333,0.37564485874999787 -In1Cu1As2S6_149_8224.vasp,InCuAs2S6,-2.35448157,0.4537424866874975 -K2O2F2_11_9272.vasp,K2O2F2,-1.7818149833333334,0.32220445874999804 -V2S2I2_2_20156.vasp,V2S2I2,-2.469163995,0.2095339866666639 -Mg2Te2W2O12_18_10523.vasp,Mg2Te2W2O12,-4.938101367777778,0.036628833888883605 -Mo2O6_2_11651.vasp,Mo2O6,-4.86950640125,0.2582169575000002 -Cd1In2Te4_164_3378.vasp,CdIn2Te4,-0.8871599542857143,0.1103176342857144 -Hf1Zr1Se2I1Br1_6_7400.vasp,HfZrSe2IBr,-3.224255155,0.16803169062499324 -Ni1Te1Ir1Se1_1_13427.vasp,NiTeIrSe,-1.515370615,0.3830569054166649 -Li2Co2Bi2_129_9862.vasp,Li2Co2Bi2,-1.4555738016666666,-0.3273272283333343 -Ge2P2Cl2O6_7_6801.vasp,Ge2P2Cl2O6,-4.509621209166666,0.03909206267856567 -Na2Au1_187_11967.vasp,Na2Au,0.12719762666666667,0.16980040333333335 -Bi3Sb3Se2S7_1_2588.vasp,Bi3Sb3Se2S7,-2.491981770666667,-0.09835219783333504 -Mn2P2S4I2_26_11193.vasp,Mn2P2S4I2,-2.409790787,0.40353088201480775 -Nb2H2N1O2_164_12733.vasp,Nb2H2NO2,-5.809204441428571,-0.8450710120357225 -Ir2Pd2Se3S1I3Br1_1_8806.vasp,Ir2Pd2Se3SI3Br,-1.5518468283333335,-0.10033390635416684 -Na2B2H6C8O2_51_11975.vasp,Na2B2H6C8O2,-4.617524786,1.1883896529999922 -Bi2S2I2_11_2513.vasp,Bi2S2I2,-1.4205270733333333,0.18657855000000012 -Sc2Zn1Bi1Cl3O3_1_16191.vasp,Sc2ZnBiCl3O3,-3.2766009169999997,0.42610629497916613 -Os2O2_12_13860.vasp,Os2O2,-4.85265607,0.7465394124999998 -Sc2Sb2S6_157_16145.vasp,Sc2Sb2S6,-3.4866470049999996,0.2085672852500009 -Tb1Ge5_47_18173.vasp,TbGe5,-2.92875282,-0.1314674336111139 -In1Sb2Au1O6_149_8335.vasp,InSb2AuO6,-3.007592393,1.0497545886249948 -Mn2Sb2Br1Cl1_3_11229.vasp,Mn2Sb2BrCl,-1.530491645,0.290976578124998 -Au4Se4I4_14_1600.vasp,Au4Se4I4,-0.230057535,0.09878213888888855 -Cu2Re1Br6_147_5232.vasp,Cu2ReBr6,-0.9110843066666666,0.19324268675925793 -Zn1I2_164_20959.vasp,ZnI2,0.48066113666666666,0.16398329875 -Ni2I2_129_13523.vasp,Ni2I2,0.6625877,0.6856045275 -Cr1S1Br2_99_4238.vasp,CrSBr2,-1.583882045,0.17434596244791525 -Dy2Cl6_59_5523.vasp,Dy2Cl6,-2.90089192875,0.02130111499999998 -Hf1Ti1C1O2_156_7328.vasp,HfTiCO2,-7.4599979439999995,0.1719997570000018 -Sr4Cr4Ga2O14_1_17422.vasp,Sr4Cr4Ga2O14,-4.624277580416667,0.19727029945963093 -Sb2Au2O4_26_15542.vasp,Sb2Au2O4,-2.51716026125,1.1707305615625008 -Ag4W2S8_11_580.vasp,Ag4W2S8,-2.3319458414285714,0.15760951991070948 -Ta2Mn2Se6_11_17772.vasp,Ta2Mn2Se6,-3.6918975179999998,0.040531427517239926 -Zn1Ge1Te2_25_20945.vasp,ZnGeTe2,-0.913386125,-0.12042503250000003 -Cu1H2_115_4895.vasp,CuH2,-1.5329940533333335,2.2136501699999966 -Fe2Ni2P2_129_5887.vasp,Fe2Ni2P2,-1.3118297933333334,0.5462862126388868 -Sn2_164_16906.vasp,Sn2,-1.02652011,-3.633943595 -Al2Zn1Se4_156_1036.vasp,Al2ZnSe4,-2.2373613214285712,0.1765153100000001 -Rb1O2_123_14746.vasp,RbO2,-0.49357819999999997,2.2630870633333333 -Y1C4N1O9_3_20617.vasp,YC4NO9,-6.103797984666667,0.3397439755694316 -Li1Ni1P2Se6_149_9763.vasp,LiNiP2Se6,-2.313830939,0.13734152022916182 -Bi1As2Au1Se6_143_2316.vasp,BiAs2AuSe6,-1.828597281,0.2508969931666645 -Mo2P2_12_11659.vasp,Mo2P2,-3.71929237,0.0541023850000002 -Ni2W2S8F2_129_13689.vasp,Ni2W2S8F2,-2.4273610514285715,0.6557423324702326 -Cu1Bi1As2S6_143_4847.vasp,CuBiAs2S6,-2.359326095,0.14024634541666142 -Ca2Bi2Cl2O4_11_2954.vasp,Ca2Bi2Cl2O4,-3.4207511019999997,0.23491344400000003 -Nb3H2N2O2_187_12976.vasp,Nb3H2N2O2,-6.264858377777778,-0.7371058349166741 -C2Br6_1_2741.vasp,C2Br6,-1.3476157425,0.6766167925 -Fe1C6N2F6_25_5652.vasp,FeC6N2F6,-4.968299525333333,0.08793864062499039 -Ag2C8I2F8_2_238.vasp,Ag2C8I2F8,-3.686289676,0.33681251400000045 -Mo2S4I4_12_11674.vasp,Mo2S4I4,-1.7916976850000002,0.3154650987500003 -W3O8_2_20566.vasp,W3O8,-5.885382027272727,0.31415343215212715 -Ga1Cl1_99_6147.vasp,GaCl,-1.14916332,0.41708927875 -Np2Te6_51_13786.vasp,Np2Te6,-3.55037476125,-0.20675732375000022 -Sb2As2_31_15538.vasp,Sb2As2,-2.4997540675,-0.6567469175 -Sb2I8_1_15595.vasp,Sb2I8,-0.292531339,0.10618393337500043 -Sn1O2F2_164_16659.vasp,SnO2F2,-1.896220584,1.3611270797500001 -Al1Te6As2Au1_149_749.vasp,AlTe6As2Au,-1.5196786709999999,0.07651059210416436 -Mn3H2C2_187_11385.vasp,Mn3H2C2,-3.9266236114285715,0.34754569857142337 -Na2I2_129_12182.vasp,Na2I2,-1.03583416,-0.44346166500000006 -Sr2I2Cl2_129_17254.vasp,Sr2I2Cl2,-1.8081038749999998,0.0836666811111112 -Zr2Te10_59_21696.vasp,Zr2Te10,-2.1902017966666665,0.08490871750000029 -Cd1Bi1Se1S1I2_1_3281.vasp,CdBiSeSI2,-0.7074792783333334,0.24266294736110994 -Si4H4O10_4_16489.vasp,Si4H4O10,-5.657529782222222,0.05114923064814292 -In2Pd4O6_164_8529.vasp,In2Pd4O6,-2.5269017516666668,0.6132091688541633 -Mn2S1I1N1Cl1_1_11210.vasp,Mn2SINCl,-2.5125685250000003,0.19009605347221864 -Hf2N1F2_164_7538.vasp,Hf2NF2,-5.933127314,0.4605371214999998 -Zr2Te6P2_2_21719.vasp,Zr2Te6P2,-2.724563852,0.30404671699999564 -Nb3Pd3Se14_6_12994.vasp,Nb3Pd3Se14,-2.878265572,0.09372453446427978 -Te1Au1O2_8_18286.vasp,TeAuO2,-1.9092135775,1.2050497571875 -Al1Sb2Au1Se6_149_730.vasp,AlSb2AuSe6,-1.871157054,0.29793254216666454 -V4N3O2_164_20334.vasp,V4N3O2,-5.995810411111111,0.029554603888883646 -Ga2P2_129_6429.vasp,Ga2P2,-2.7767347,-0.63320972 -V1H4C4O6F1_2_19853.vasp,VH4C4O6F,-5.28737419375,0.10911853116896941 -V2Sb2O6_2_20170.vasp,V2Sb2O6,-4.955733544,0.00379793975000009 -Ge1S2F2_12_6698.vasp,GeS2F2,-2.12633605,0.7896038493749973 -V4N3F2_164_20333.vasp,V4N3F2,-5.3173721800000004,-0.09288935617285099 -Ge1_123_6725.vasp,Ge,-2.42878608,-0.2558104550000002 -Zr1Ti3S8_1_21482.vasp,ZrTi3S8,-4.790341905833333,0.25636224604166635 -Cr2Ag2As4O12_13_4291.vasp,Cr2Ag2As4O12,-3.8397244,0.2347846529999954 -Cd2P4O12_4_3531.vasp,Cd2P4O12,-4.657900680555556,0.18519310847222226 -Sb1I2_164_15461.vasp,SbI2,-0.32313199333333337,0.45834153249999926 -K4Ca2H4S4O18_11_9421.vasp,K4Ca2H4S4O18,-4.267844089375,0.0629412975000001 -Ni3Te1Se2S1I1_1_13733.vasp,Ni3TeSe2SI,-0.77304831,0.186025601875 -Ni4S4I4_14_13758.vasp,Ni4S4I4,-0.6294192108333333,0.1957978153472214 -Fe1Ni1Te1Br1_1_5726.vasp,FeNiTeBr,-0.2035196075,0.515830258125 -Co1O2_115_3803.vasp,CoO2,-3.3800581566666668,-0.282891724583336 -Nb4Se12Cl2_2_13147.vasp,Nb4Se12Cl2,-3.322457308333333,0.12174104949735098 -Gd2Br2_164_6601.vasp,Gd2Br2,-2.16064247,0.10807702374999995 -Cu2H6Pt1C6N8_164_5136.vasp,Cu2H6PtC6N8,-5.255093199130435,-1.5692729895652286 -Te1Mo1Rh2S3_1_18302.vasp,TeMoRh2S3,-2.52822986,0.5889415326587244 -As2O3_183_1230.vasp,As2O3,-4.266083502,0.2191540700000001 -Ca4S4O12_14_3236.vasp,Ca4S4O12,-4.5423561145,0.09790012899999528 -Cr1Ge3_191_4182.vasp,CrGe3,-2.2426312625,0.34466002166666443 -Sn1As1Se1S1I1Cl1_1_16600.vasp,SnAsSeSICl,-1.7816380116666668,0.15498890958333317 -Ag4I2O2F2_4_527.vasp,Ag4I2O2F2,-0.587663182,0.2883996534583321 -Mo4H2C3S2_164_11742.vasp,Mo4H2C3S2,-4.413765595454546,0.4507843869318088 -Ag1Xe2F4_21_152.vasp,AgXe2F4,0.42556434000000004,0.3345899064285733 -K2Hg4Se2S6Br6_31_9190.vasp,K2Hg4Se2S6Br6,-0.6829495299999999,0.16434417472916663 -Hf2Ge2Se8_31_7498.vasp,Hf2Ge2Se8,-3.5396216258333335,0.12635394444444437 -In2Fe1_123_8434.vasp,In2Fe,-0.16270565333333334,2.250979513333331 -P2F10_51_13972.vasp,P2F10,-2.1238385308333334,0.9784968775 -Mo2W2O8_25_11698.vasp,Mo2W2O8,-5.701145391666667,0.1620296209027723 -Ag4H8O4_14_524.vasp,Ag4H8O4,-2.488317984375,0.5604972083333335 -Bi6Se2S7_162_2679.vasp,Bi6Se2S7,-2.3410522013333335,-0.6227082400000016 -B6Pd1C2Br2F4_6_1783.vasp,B6PdC2Br2F4,-3.737697024,0.752580797861095 -Sn8Pd2_50_17006.vasp,Sn8Pd2,-1.230139012,0.5203044989999999 -V1W3S8_25_19964.vasp,VW3S8,-4.361193783333333,-0.0680050875 -Sc4H2S2N3_164_16244.vasp,Sc4H2S2N3,-5.188383394545455,-0.8962815050000053 -Nb3B2S2F2_187_12949.vasp,Nb3B2S2F2,-4.843634527777778,0.4267325559116719 -Hg1Ge1Se2I2_1_7856.vasp,HgGeSe2I2,-0.73043877,0.13518753999999983 -Mn2P2I2O4_26_11184.vasp,Mn2P2I2O4,-3.372943641,0.48126682792592235 -In1P2Au1O6_149_8297.vasp,InP2AuO6,-4.192383777,0.3856756606666636 -Ge2Se2Br1Cl1_8_6864.vasp,Ge2Se2BrCl,-2.0536001166666664,0.16238297010416436 -V2S2_123_20165.vasp,V2S2,-3.6939456675,-0.03853313906250433 -Ba4Sb2O1_99_2176.vasp,Ba4Sb2O,-1.7710298157142856,0.6970998850000003 -Sb4Te6_12_15838.vasp,Sb4Te6,-1.710177318,0.13612835599999995 -Ag2C6I2F4_2_233.vasp,Ag2C6I2F4,-3.4950120864285714,0.4884683499999989 -Ca2Hg1_123_3050.vasp,Ca2Hg,0.9713607566666668,0.3123209983333335 -Zr1Ge1Br2N2_6_21297.vasp,ZrGeBr2N2,-4.30207477,0.17486234527777222 -Sr2Zn1_123_17341.vasp,Sr2Zn,1.1498042433333333,0.2480465466666667 -Li1Nb1Ni1C1S1I2O1_1_9755.vasp,LiNbNiCSI2O,-3.068781545,0.5933862002678516 -Cr2F8_1_4385.vasp,Cr2F8,-2.8992836950000003,-0.1276635070000003 -Sn2Sb2Te6_143_16870.vasp,Sn2Sb2Te6,-1.4310421290000002,-0.3364195243333351 -Hf1Ti1S1I1N1_156_7333.vasp,HfTiSIN,-5.365610034,0.11075858299999997 -Li2Fe2P2O8_51_9909.vasp,Li2Fe2P2O8,-4.489425362857143,0.5666622389285711 -V2P2O12_1_20137.vasp,V2P2O12,-5.241923245625,0.1544483632812499 -Na2Fe4H6S4O16_2_12082.vasp,Na2Fe4H6S4O16,-4.1141509134375,0.03612862412989193 -Sr2Ag1Cl2O2_123_17100.vasp,Sr2AgCl2O2,-2.65925146,0.09228973520407635 -Li2V2Cu4O12_31_10114.vasp,Li2V2Cu4O12,-3.598274716,0.33014872712499244 -Hg1Te2_164_7920.vasp,HgTe2,0.25942858333333335,0.466045821111111 -Ge2P2S6Cl2_7_6808.vasp,Ge2P2S6Cl2,-2.8431294808333334,0.09950717516926799 -V1Os1Br4O2_65_19896.vasp,VOsBr4O2,-2.77882484875,0.15837476125000016 -Fe1S2N1O8_143_5744.vasp,FeS2NO8,-3.8155993741666667,0.5041207007499905 -K4Fe2P4O14_113_9444.vasp,K4Fe2P4O14,-4.294966063333333,0.2309784287500003 -Cr2P2_12_4454.vasp,Cr2P2,-3.56111235,0.6460925350000002 -V3B2H2_187_20241.vasp,V3B2H2,-4.314920658571428,0.5275385742857104 -Sb1S1F1_156_15488.vasp,SbSF,-2.629433026666667,0.31328911333333087 -Li2Cu2O2_51_9889.vasp,Li2Cu2O2,-2.5056426333333333,0.7282949147222193 -Li1Mo2S2I6_47_9752.vasp,LiMo2S2I6,-1.297751009090909,0.33007388640151103 -Nb2Br6_189_12658.vasp,Nb2Br6,-2.23677330875,0.24863343999999765 -Ba2C4_12_1935.vasp,Ba2C4,-4.458403591666666,1.1295930511111054 -B3Ir1_187_1731.vasp,B3Ir,-3.6774909825,1.8832317829166665 -Se8O18_147_16308.vasp,Se8O18,-3.3527400223076924,0.1547798443269195 -Ta2H2S2N1_164_17748.vasp,Ta2H2S2N,-5.191558777142857,1.006516521190464 -Sb2Pd3Se8_164_15658.vasp,Sb2Pd3Se8,-1.7179759138461537,0.3440053991538442 -Ga1Ag1S2I1Cl1_1_6120.vasp,GaAgS2ICl,-1.1849011366666666,0.3348742623958295 -Au2Se2I1Cl1_1_1544.vasp,Au2Se2ICl,-0.23463439,0.24995706590277733 -Nb4Ni2Se10_13_13101.vasp,Nb4Ni2Se10,-3.362935573125,0.073566305625 -Co1Ni1S2I1Br1_25_3789.vasp,CoNiS2IBr,-1.3441254,0.061772463229166144 -Al2Co1S4_164_799.vasp,Al2CoS4,-3.3356056642857146,0.11831425083333058 -Ta2Te1Pt1I2O1_1_17894.vasp,Ta2TePtI2O,-3.619420582857143,0.3233780311904725 -Bi4O6_26_2624.vasp,Bi4O6,-3.5659114119999997,0.2920828160000002 -Na2H4C2_67_12109.vasp,Na2H4C2,-3.25759774,0.9340597050000001 -Ca2H2Br2_129_3030.vasp,Ca2H2Br2,-2.3185564066666666,0.04654797833333335 -Sn2H2_164_16771.vasp,Sn2H2,-2.0127879325,-0.9036198075000001 -Nd4V4Sb12_18_13250.vasp,Nd4V4Sb12,-2.79576711,0.3731721326666637 -Sn4Se4_53_16970.vasp,Sn4Se4,-1.73563585375,-0.15935747875000006 -Hf2H2C1O2_164_7502.vasp,Hf2H2CO2,-6.111187172857143,0.5002173137301518 -Mo1S1O1_156_11542.vasp,MoSO,-4.37392398,0.16508788500000016 -Al1Cr1F5_47_635.vasp,AlCrF5,-3.048852071428571,0.641956314285707 -P4Pd2_2_14099.vasp,P4Pd2,-3.1542456733333335,0.33431669166666644 -Hg2N2Cl2_51_7975.vasp,Hg2N2Cl2,-0.19309480333333331,1.2770810158333321 -Gd2S2I2_164_6623.vasp,Gd2S2I2,-3.282286725,0.02148176000000035 -Fe2Sb1S2_187_5945.vasp,Fe2SbS2,-1.993598344,0.2495614715000003 -Cu2Pb1S2I2_1_5228.vasp,Cu2PbS2I2,-0.7677127585714285,0.31959183357142784 -Li2Cu2P4O12_13_9893.vasp,Li2Cu2P4O12,-4.7772853975,0.2082752762749953 -Ge2Sb1O6_162_6834.vasp,Ge2SbO6,-4.440798282222222,0.28831548513888516 -Au2S2Cl2_1_1512.vasp,Au2S2Cl2,-0.6142742683333333,0.231595434666666 -Li1Cu1C1O3_1_9684.vasp,LiCuCO3,-4.487803865,0.335507300937498 -Te4Ru2_127_18626.vasp,Te4Ru2,-1.58940113,1.0315935800000002 -Zr1Ga1S4I2_1_21295.vasp,ZrGaS4I2,-2.42488291125,0.41689563683593533 -Hf2S1Br2O1_25_7559.vasp,Hf2SBr2O,-4.634260978333333,0.1851585279166641 -Ag1Se1Cl1_1_127.vasp,AgSeCl,-0.38186298999999996,0.3627387729166661 -Rb2Hg2Pd1Cl8_12_14863.vasp,Rb2Hg2PdCl8,-0.5806223530769231,0.09786317384615373 -Sc4N3F2_164_16250.vasp,Sc4N3F2,-5.883865676666667,-0.4451519981481582 -Al2P2Se6_157_925.vasp,Al2P2Se6,-2.814535536,0.08193869724999447 -K2As2O4F8_13_8975.vasp,K2As2O4F8,-2.767511098125,0.23390708734375043 -Cu2H12C8O10_31_5107.vasp,Cu2H12C8O10,-4.9101275371875,0.29459602515624983 -Nb4Zn4Cu2O16_2_13183.vasp,Nb4Zn4Cu2O16,-4.586977280384615,0.23781565855768544 -Ru2F6_162_15317.vasp,Ru2F6,-2.40832981125,0.16280375000000014 -Mo1O3_6_11530.vasp,MoO3,-5.0313285625,0.09639479625000025 -B4F4_57_1753.vasp,B4F4,-4.22195901375,0.3104325523611067 -Sr2Ge4_12_17228.vasp,Sr2Ge4,-2.0876284533333336,0.2716294733333333 -Mn2S10F4_7_11207.vasp,Mn2S10F4,-2.359975648125,0.3297065239843753 -Co1C2S2N2_12_3713.vasp,CoC2S2N2,-5.1157560971428575,0.198683297976179 -Sn1Mo1O4_1_16654.vasp,SnMoO4,-4.487278018333334,0.34928418499999925 -Zr1Nb1Ga1N2Cl2_25_21339.vasp,ZrNbGaN2Cl2,-4.806423342857143,0.29669534910713447 -Ga2Fe1S4_164_6349.vasp,Ga2FeS4,-2.8945798442857145,-0.24184875714285914 -Hf2Si2Te8_31_7618.vasp,Hf2Si2Te8,-2.9175410525000003,-0.12211179083333945 -Sr3Ni2S5I2_123_17395.vasp,Sr3Ni2S5I2,-1.9857365974999999,0.03520493581596784 -Sc1Sn5_47_16010.vasp,ScSn5,-1.466402025,-2.1114341750000003 -Na2B2O8F8_2_11983.vasp,Na2B2O8F8,-2.7978842449999997,0.9157345390000011 -Yb3S2F4_123_20889.vasp,Yb3S2F4,-3.459212291111111,0.2852522173379599 -Ag1Te2_164_146.vasp,AgTe2,-0.38685342,0.37549679416666665 -Na2Hf2Cu2Se6_11_12147.vasp,Na2Hf2Cu2Se6,-2.9095121766666665,0.14339149958333097 -Sc4F10_11_16237.vasp,Sc4F10,-4.191139954285714,-0.25609833404762117 -Na2Cl2O8_59_12055.vasp,Na2Cl2O8,-2.7290195941666666,-0.03002918000000232 -Nb2Cr2S10_11_12703.vasp,Nb2Cr2S10,-3.950064271428572,0.07520258928571 -Sc4I4O4_11_16247.vasp,Sc4I4O4,-4.36635246,0.037405139999999726 -Li2S2F2_6_10053.vasp,Li2S2F2,-2.9878591149999996,-0.00760307187500231 -Ge1Mo1Se3Br1_1_6679.vasp,GeMoSe3Br,-2.2208470916666667,0.36408575930555553 -Sn2Sb2H6N2O6_7_16859.vasp,Sn2Sb2H6N2O6,-4.166481915,0.11120026741665842 -Te10Os8_1_18268.vasp,Te10Os8,-2.735332343888889,0.0809703647222173 -Ca2S2_12_3105.vasp,Ca2S2,-3.089210105,-0.143548515 -Ge1Ru1Se1S1Br2_1_6695.vasp,GeRuSeSBr2,-2.15230399,0.37241804708333337 -Mn1Cu1Te2O1_8_10695.vasp,MnCuTe2O,-1.927327326,0.20349594168749974 -Cd1Ga2S4_164_3310.vasp,CdGa2S4,-2.257369447142857,0.13335356142857124 -Ni2Te2I2_59_13662.vasp,Ni2Te2I2,-0.25095433166666664,0.01982115000000001 -Hf2V2W1C3O6_1_7662.vasp,Hf2V2WC3O6,-6.327717145714286,0.7019166653417369 -K12B4S12_14_8873.vasp,K12B4S12,-2.5152795025,0.0968410946428575 -V2Te2_47_20217.vasp,V2Te2,-2.5867110025,0.18853410035714036 -Sb8Te8S4_2_15882.vasp,Sb8Te8S4,-1.901911573,0.26362324966666484 -Pt1S2_187_14590.vasp,PtS2,-2.06238264,0.5827620799999997 -Co2Au1S4_187_3858.vasp,Co2AuS4,-2.3304895214285715,0.1047944317857119 -Pd2S2_164_14469.vasp,Pd2S2,-1.51052019,0.5996111500000001 -Nb1Ge1Br2_6_12513.vasp,NbGeBr2,-2.5803540725,0.37373648947916654 -Sb2As4O12F2_4_15541.vasp,Sb2As4O12F2,-3.691753706,0.5225711054999969 -Sb18I4_11_15428.vasp,Sb18I4,-1.7774302931818182,0.09647490295454375 -Nb4S12Cl2_2_13136.vasp,Nb4S12Cl2,-3.904340822777778,0.11453122069443644 -Na6Te2H2O8_11_12445.vasp,Na6Te2H2O8,-3.5106247611111114,0.19207915694444067 -C2S2_59_2755.vasp,C2S2,-3.864635475,1.5024696296875 -Pd1Se2_187_14392.vasp,PdSe2,-1.4639856166666665,0.384351131666667 -Li2Mn1As2S7F3_1_9985.vasp,Li2MnAs2S7F3,-2.841721096,0.3633755786166637 -Mn1Co2O6_12_10674.vasp,MnCo2O6,-3.954991068888889,-0.4019435380555588 -Ta4B3Cl2_164_18001.vasp,Ta4B3Cl2,-6.205839941111112,0.10948937083332155 -B2C6_191_1660.vasp,B2C6,-7.3673434975,0.3021212310416663 -Na2H6Pb1S6_147_12125.vasp,Na2H6PbS6,-2.758604376,-0.0992935023750019 -Nb3Te1Cl7_156_13022.vasp,Nb3TeCl7,-3.1314432663636365,0.03373196727272676 -Cr2Co1Te4_164_4359.vasp,Cr2CoTe4,-1.8939792142857144,0.04475432847618688 -Ta4Ni2Se10_13_18065.vasp,Ta4Ni2Se10,-3.70261063875,0.07278562999999982 -V1Fe1Se2O1_25_19831.vasp,VFeSe2O,-3.3071348780000003,-0.03665289500000535 -Si2I6_1_16408.vasp,Si2I6,-0.8201426325,0.27963742718750006 -Ta3B2F2_187_17938.vasp,Ta3B2F2,-6.198605217142857,0.16730543757141692 -Pb3Se2Br2O6_5_14305.vasp,Pb3Se2Br2O6,-3.0417963738461538,0.09665126461538476 -Na2Au1O2_12_11965.vasp,Na2AuO2,-1.997521298,0.19303089600000045 -V2S2N1_164_20159.vasp,V2S2N,-4.780622172,-0.04801567800000006 -Nb2V2Se10_11_12938.vasp,Nb2V2Se10,-3.426227227857143,0.058545099999996575 -Al2Te2I2_31_1006.vasp,Al2Te2I2,-1.632246225,0.04880696166666665 -Cd3As1_191_3606.vasp,Cd3As,1.473782365,0.3556526242187501 -Ge3Sb2O9_174_6919.vasp,Ge3Sb2O9,-4.520468295714286,0.1666424700892808 -Nb1V1Te1S1_25_12612.vasp,NbVTeS,-3.81840104,-0.05229578895834064 -Ta4Co8Se8_59_18029.vasp,Ta4Co8Se8,-3.4368564005000004,0.05015072050000002 -Zr1F4_123_21286.vasp,ZrF4,-4.335141414000001,0.25648264099999896 -Al2Co2Se5_164_808.vasp,Al2Co2Se5,-2.531551758888889,0.06569444325925444 -Cd1Ni1S2Br2_1_3382.vasp,CdNiS2Br2,-0.7179114016666667,0.21383582895833153 -Hf3S3I1N1_1_7727.vasp,Hf3S3IN,-5.23574416125,0.2913901949999995 -Co1Sn3_187_3828.vasp,CoSn3,-0.7488508075,-0.08562328374999995 -I1_65_8159.vasp,I,0.64704396,0.265772991875 -K4Ti2H2F14_11_9524.vasp,K4Ti2H2F14,-3.4478439454545455,0.08517140772727272 -Fe3S4_164_6064.vasp,Fe3S4,-2.3541529914285713,-0.3919475535714303 -Zr2Mn1Br1O5_8_21601.vasp,Zr2MnBrO5,-5.396282724444444,0.35894150935184577 -Hf1Te1Se1_156_7321.vasp,HfTeSe,-3.9361750900000003,0.3095696716666667 -Ta1O2_187_17595.vasp,TaO2,-7.0355665400000005,0.3195041486666593 -Fe2Ag1O4_187_5769.vasp,Fe2AgO4,-3.101777764285714,0.04961207767856904 -Te2Rh2F2_11_18501.vasp,Te2Rh2F2,-2.035359745,0.19153403159721993 -Na2H6C10O2_51_12112.vasp,Na2H6C10O2,-5.143498354,0.7416374054999924 -Hg2F2_164_7959.vasp,Hg2F2,0.367863365,0.34643961 -Mn1W4Se1S6Br2_1_10935.vasp,MnW4SeS6Br2,-3.5006115685714287,0.2993196480357046 -Bi2Se2_164_2548.vasp,Bi2Se2,-1.5913065025,0.24343125499999893 -As4Au4O12_13_1322.vasp,As4Au4O12,-3.0625498534999998,0.5235403501666603 -Ti1Ni2Br2O4_1_18817.vasp,TiNi2Br2O4,-3.1640814677777778,0.06725506277777482 -Na2Cd4S6O2F6_31_12032.vasp,Na2Cd4S6O2F6,-1.7682667120000002,0.2939782339791607 -Ba2Zr1S4_99_2092.vasp,Ba2ZrS4,-3.3007901585714285,0.758161848571429 -Ir1F2_187_8736.vasp,IrF2,-1.0634095433333333,1.602297251111109 -Hg1H2_115_7869.vasp,HgH2,-0.8390581300000001,1.5598498512643655 -Sb2Br2O2_59_15550.vasp,Sb2Br2O2,-2.6864434750000004,0.22103596766666467 -Ba2Br4_2_1929.vasp,Ba2Br4,-1.6804696683333333,0.5372900216666665 -As2Br8_2_1197.vasp,As2Br8,-0.750215518,0.18401044200000008 -Ti2Sn4_59_19032.vasp,Ti2Sn4,-2.7484794316666665,-0.20201076749999958 -Fe3Si4O12_12_6069.vasp,Fe3Si4O12,-5.492422462631579,-0.06584938850877453 -Ba1Cl2_115_1817.vasp,BaCl2,-2.180083763333333,0.5441116200000002 -Be8Ge4_13_2292.vasp,Be8Ge4,-2.3609634741666667,-0.1358664091666686 -La2I2O6_11_9596.vasp,La2I2O6,-4.247577112,0.11083049322221816 -Mn1Mo1W1Se1S1Br1Cl1_6_10801.vasp,MnMoWSeSBrCl,-2.8044175871428574,0.31736953624999154 -Fe1Cu1Se1Cl2O1_25_5670.vasp,FeCuSeCl2O,-1.521338285,0.2278949425925907 -Sn4Te4_53_16975.vasp,Sn4Te4,-1.254520905,-1.2187929249999998 -Mg2Au2_191_10425.vasp,Mg2Au2,0.483855105,2.166059585 -Cd2Ag2Se2Br2_26_3445.vasp,Cd2Ag2Se2Br2,-0.01591543125,-0.017470180937499996 -Cu1Ag1Te2_25_4832.vasp,CuAgTe2,-0.2918133825,0.17074310645833332 -Ag1Br2_115_38.vasp,AgBr2,0.2981798033333333,0.23200735666666672 -Pd2S2_129_14467.vasp,Pd2S2,-1.6325713575,0.4775599825000001 -V2Mo2O8_25_20105.vasp,V2Mo2O8,-5.2977559575,0.11294149305554546 -Sr2H2Cl2_129_17232.vasp,Sr2H2Cl2,-2.5310813916666666,0.09884181666666647 -Sc3C2F2_187_16199.vasp,Sc3C2F2,-5.054639817142857,0.2211744726497643 -V1Ag1I2_6_19754.vasp,VAgI2,-0.255229055,0.3915122629166666 -Sr2I4_59_17261.vasp,Sr2I4,-1.1564221433333333,0.1296212155555556 -As2Pd2O7_1_1267.vasp,As2Pd2O7,-3.4685443145454546,0.29764173954545126 -Li2Cu2C2O6_17_9885.vasp,Li2Cu2C2O6,-4.495702181666666,0.3276089842708318 -Mn2Ga2S5_164_11075.vasp,Mn2Ga2S5,-2.9267422244444443,-0.01682770611111084 -Al3Ir1_187_1048.vasp,Al3Ir,-2.2932667575,0.8028571049999997 -W2S2_12_20533.vasp,W2S2,-4.800176415,0.30864936499999995 -Bi1Se1_123_2390.vasp,BiSe,-1.315468675,0.5192690824999989 -Ta2Mo2S11_1_17777.vasp,Ta2Mo2S11,-3.816099946,0.4071579786249968 -Zn2As4S6Br4_31_21034.vasp,Zn2As4S6Br4,-1.785340063125,0.18782912799999985 -Te2Os2F2_59_18425.vasp,Te2Os2F2,-2.5015659683333333,0.4933961202083297 -In1S4_8_8332.vasp,InS4,-1.965561002,0.6057015891875 -Rh1Cl2_115_15147.vasp,RhCl2,-0.88490736,0.7537825699999984 -Zr1Mo1S2Cl2_6_21328.vasp,ZrMoS2Cl2,-3.452449955,0.2494282882291634 -B2F6_26_1669.vasp,B2F6,-4.14402248875,-0.42592778875000015 -Ag1Ge1Se2I1Br1_1_64.vasp,AgGeSe2IBr,-0.94117513,0.342617765928816 -Ba2Bi4_12_1923.vasp,Ba2Bi4,-0.9861792833333333,0.3699218774999993 -Mg2Ir1_123_10475.vasp,Mg2Ir,-1.3606283666666668,0.33416183666666655 -Cs2Hg4Te2Br6O6_31_4742.vasp,Cs2Hg4Te2Br6O6,-1.2177987634999998,0.23785350508332992 -Tl2Br6_162_19383.vasp,Tl2Br6,-0.338565585,0.08585842781250003 -Pt2I2_129_14629.vasp,Pt2I2,-0.253529145,0.97593702875 -Mo1Au2Se4_111_11495.vasp,MoAu2Se4,-1.4114756914285713,0.28005584999999855 -Te2Mo2_129_18410.vasp,Te2Mo2,-2.40002041,0.45328732749999956 -Ni1C4N2F6_47_13297.vasp,NiC4N2F6,-4.283725218461539,0.11635579788460154 -Cu1Ag1S1I3_1_4821.vasp,CuAgSI3,-0.01275808,0.208982822881943 -Cd5N2O16_10_3637.vasp,Cd5N2O16,-2.537778389130435,0.44924715452898 -V1Te6As2Au1_5_19946.vasp,VTe6As2Au,-1.6161178920000001,0.17525565329166504 -P2S3_164_14046.vasp,P2S3,-3.158974904,0.22627528740624703 -Zn2Te2H4S8_7_21178.vasp,Zn2Te2H4S8,-2.157334038125,0.2034766371145831 -W2Se2I2_59_20544.vasp,W2Se2I2,-2.526420276666667,0.20465518486111112 -Rb2Hg4Te2O6F6_31_14887.vasp,Rb2Hg4Te2O6F6,-1.5872568235,0.27526540525215537 -Ga2Te6As2_147_6521.vasp,Ga2Te6As2,-1.669552123,0.2758177981666641 -Ti4S2N3F2_164_19155.vasp,Ti4S2N3F2,-6.033621935454545,-0.007795933787888565 -W2C2Cl2_59_20476.vasp,W2C2Cl2,-4.8799297699999995,0.04351924305554622 -Ag2Sb4Se3Cl2_6_415.vasp,Ag2Sb4Se3Cl2,-1.3363513,0.3243013613636345 -Sr3Cu2Cl2O4_123_17367.vasp,Sr3Cu2Cl2O4,-3.045335567272727,0.1360621224242362 -Mn1Nb1Br2O1_1_10803.vasp,MnNbBr2O,-3.277748278,0.09964947383333378 -Na4N1O4_5_12398.vasp,Na4NO4,-3.1639734533333335,0.2890936455555464 -Zn1Br2_1_20905.vasp,ZnBr2,-0.11076331,0.08197617375000002 -Ga1Bi1Pt2Se4S2_1_6140.vasp,GaBiPt2Se4S2,-2.152532171,0.25742894778571046 -Rb4Hg2F8_11_14973.vasp,Rb4Hg2F8,-1.20840215,0.25965247285714277 -Ba2Sb4S8_11_2057.vasp,Ba2Sb4S8,-2.900422307142857,0.14678351839285675 -In1O2F2_164_8294.vasp,InO2F2,-1.955398452,1.133063283124997 -Ta2Ni2S6_11_17795.vasp,Ta2Ni2S6,-3.7136608520000003,-0.05130554070000315 -P1S2_164_13944.vasp,PS2,-3.10865639,0.17506186489582687 -Cu2As4S3Br2_6_5017.vasp,Cu2As4S3Br2,-1.9281945363636366,0.10648387395832859 -Li2Bi1O3_1_9841.vasp,Li2BiO3,-3.64420673,0.54121958895833 -Na2Mg1S2O8F4_2_12195.vasp,Na2MgS2O8F4,-3.485314907058824,0.17428679867646724 -Li4Sb4O8_14_10223.vasp,Li4Sb4O8,-4.281445868125,0.12419515093750011 -H2S14N2_26_7028.vasp,H2S14N2,-3.0841783527777777,0.02961728028645494 -Fe4H2S2N3_164_6081.vasp,Fe4H2S2N3,-3.26138427,-0.8094539252272784 -Sr1Ag2O8_89_17019.vasp,SrAg2O8,-2.6656736836363635,0.1953660856818123 -Fe2S4_14_5943.vasp,Fe2S4,-2.15950981,-0.223383895 -Zn2H16N4O4F8_14_21094.vasp,Zn2H16N4O4F8,-3.6554262305882355,0.09713093011437074 -Sn2As2Se6_147_16729.vasp,Sn2As2Se6,-2.1091725749999997,0.1529172514999984 -Ba2Co2Si2_129_1955.vasp,Ba2Co2Si2,-2.283346041666667,0.10447597999999969 -Zr1Ti1Te1Se1_25_21478.vasp,ZrTiTeSe,-3.892781175,0.26829390015624544 -In2Ni2Te5_156_8502.vasp,In2Ni2Te5,-0.8872449566666667,0.10530000722222066 -K4As4Pd2_51_9410.vasp,K4As4Pd2,-1.363499584,0.14291853100000007 -Sc1Mn1Se1S1Br1Cl1_6_15954.vasp,ScMnSeSBrCl,-2.6725791616666665,0.11598323468749405 -Mn2Sb1Br1_25_11228.vasp,Mn2SbBr,-1.556860165,0.1882198906573277 -In1Ga1Hg1S4_156_8252.vasp,InGaHgS4,-1.889598407142857,0.13031518249999996 -Ta2C1Cl2_164_17675.vasp,Ta2CCl2,-5.622319244,0.1313763769999925 -V4Zn4F20_14_20382.vasp,V4Zn4F20,-2.4836322039285714,-0.04327423500000194 -Ta1Nb1Ni2Te1S1I1Br1_6_17572.vasp,TaNbNi2TeSIBr,-2.38278766375,0.24473056314011135 -Li2Yb1Al2F12_164_10139.vasp,Li2YbAl2F12,-3.8136430082352937,-0.34293672913398876 -In3Se4_164_8658.vasp,In3Se4,-1.9783914714285713,-0.017186063571430266 -Sb2P2O8_31_15624.vasp,Sb2P2O8,-4.326100405833333,0.9772724908333332 -K2Ge1H6O6_147_9109.vasp,K2GeH6O6,-4.005597762,0.059130508592588615 -Li2Mn1P2O8_2_9987.vasp,Li2MnP2O8,-5.119267452307692,0.05945424793268303 -Zr3Te2_123_21792.vasp,Zr3Te2,-3.625772514,0.09084665771428169 -Sc2S2I2_59_16134.vasp,Sc2S2I2,-3.2405605333333334,0.04479025833333372 -Y2B1H2_164_20695.vasp,Y2BH2,-4.363022904,0.3541781264999959 -Re2Cl6_189_15041.vasp,Re2Cl6,-907.96936195625,-905.2313788804167 -Y1P2_21_20659.vasp,YP2,-3.83381413,1.2684524212500001 -Zr1Ta1Te1S1I1_8_21454.vasp,ZrTaTeSI,-3.77661472,0.26812959005554926 -In2Se4_127_8598.vasp,In2Se4,-1.4450628283333333,0.5932031188888869 -Eu1Sn2_164_5595.vasp,EuSn2,-1.5646592466666667,0.10393015416666751 -Pd1O2_187_14376.vasp,PdO2,-1.91495162,0.9876137416666668 -Ge2S2_164_6829.vasp,Ge2S2,-3.2151620625,-0.9640142087500001 -Nb2P2Se6_12_12808.vasp,Nb2P2Se6,-3.5522002049999997,0.22889539737499653 -K2H4Pd1N4O10_2_9133.vasp,K2H4PdN4O10,-4.200147176190477,-0.001990832396838449 -Sn4Ge4S12_14_16940.vasp,Sn4Ge4S12,-2.825326278,0.05700695950000023 -Ta8O18_85_18163.vasp,Ta8O18,-6.886161990769231,0.409954540153839 -Ti1Zn2H1O6_1_18875.vasp,TiZn2HO6,-3.704379594,0.5161539001041597 -V4H2N3_164_20329.vasp,V4H2N3,-5.261465698888888,0.091014118888884 -Na2O2F2_7_12240.vasp,Na2O2F2,-2.16691011,0.4169306754166644 -V2Ag2H4O8_11_19970.vasp,V2Ag2H4O8,-4.16934888,0.05856349260416627 -Sn2Te6As2_1_16901.vasp,Sn2Te6As2,-1.623974072,-0.3957665988333349 -Hf4B3H2O2_164_7763.vasp,Hf4B3H2O2,-5.9957420818181815,0.40082348454543704 -Ba2Tl1Hg1Au1S5_99_2084.vasp,Ba2TlHgAuS5,-1.618047234,0.33466177149218485 -Mn2Bi2S4Br2_10_11007.vasp,Mn2Bi2S4Br2,-2.084895742,0.14975513116666606 -Ga1Pt2_187_6246.vasp,GaPt2,-1.7004419333333332,0.30512940708333347 -Li1In1P2O6_5_9731.vasp,LiInP2O6,-4.898791382000001,0.23098529177379953 -W2Se1Br2Cl1_3_20540.vasp,W2SeBr2Cl,-2.515840625,0.3846603597222167 -Li2Cu1Ni4Sb2Br1_1_9880.vasp,Li2CuNi4Sb2Br,-0.46766630200000003,0.7411572304999996 -Ge2Te2I2_59_6884.vasp,Ge2Te2I2,-1.4329402150000001,-0.07381618555555713 -K1Ca2P4H11O18_1_8889.vasp,KCa2P4H11O18,-4.909535889444445,0.03459401665508666 -U4S2_1_19736.vasp,U4S2,-6.273878213333333,1.2947298283333266 -Tl1Au1I6_1_19220.vasp,TlAuI6,0.3707893225,0.194273799140625 -Mn2Cl2_129_11051.vasp,Mn2Cl2,-1.04053502,0.8207078031896551 -Hf1Ge3O8_156_7186.vasp,HfGe3O8,-5.380464065833333,0.2867070608333333 -B1Pt2_187_1633.vasp,BPt2,-2.93184576,1.6987964666666668 -Tl4Bi20_26_19591.vasp,Tl4Bi20,-0.8106532254166666,-0.3253026108333333 -Na2Ge1O6F6_147_12087.vasp,Na2GeO6F6,-2.249155903333333,0.9407458302777785 -In1_191_8371.vasp,In,-0.2748046,2.25578852 -Cr1S1I2_47_4242.vasp,CrSI2,-1.3919285925,0.18657366273437498 -K2V6O16_11_9388.vasp,K2V6O16,-5.164850842916667,0.1534735258333333 -Al4Se4Br4_14_1093.vasp,Al4Se4Br4,-2.3869852275,0.048787797500000174 -Sr2In1Cu1Hg1O5_99_17264.vasp,Sr2InCuHgO5,-2.8251438230000003,0.41637286956249553 -Ca1C1O3_25_2813.vasp,CaCO3,-5.486296149999999,0.3726906210000003 -Cu2H4N6Cl2_2_5127.vasp,Cu2H4N6Cl2,-3.698537032142857,0.17812647392856862 -Li2V1F6_12_10105.vasp,Li2VF6,-3.4489202455555557,0.13785537888888877 -Cu3Se2S1Br3Cl1_1_5389.vasp,Cu3Se2SBr3Cl,-0.582447589,0.2692293981249998 -Ag1Ge1Pb1Se1S1Br1_1_61.vasp,AgGePbSeSBr,-1.6156542033333334,0.17015899455579492 -Fe3H2S2N2_187_6054.vasp,Fe3H2S2N2,-3.1588573055555553,-1.1564612986111127 -V1In2Se4_164_19874.vasp,VIn2Se4,-2.2720969571428573,0.12594158589285476 -Ag1S2_12_113.vasp,AgS2,-0.9229708900000001,0.5951433530208333 -Cu1Ir1S2Cl2_6_4914.vasp,CuIrS2Cl2,-1.7670248949999998,0.022230123333333296 -Cd4W2O8_13_3635.vasp,Cd4W2O8,-3.5343861514285715,0.1222732778571447 -V2Co1Te4_164_20044.vasp,V2CoTe4,-2.1746832342857143,0.08348108619047423 -In4S4_14_8685.vasp,In4S4,-1.748792705,0.5308774600000001 -Pa2P4_129_14167.vasp,Pa2P4,-5.60883384,0.55801414 -Te4Ru2_11_18625.vasp,Te4Ru2,-2.2811561866666668,0.3398385233333334 -Cu1O2_187_4929.vasp,CuO2,-1.67257002,1.0950102441666645 -Si2P2Se6_147_16425.vasp,Si2P2Se6,-2.782973944,0.3198553239999973 -Zr2Br6_189_21529.vasp,Zr2Br6,-2.2001594125,0.23348163249999976 -Co1H4C2N4F2_47_3750.vasp,CoH4C2N4F2,-4.691156563076923,0.1883731895833261 -Co1Te1I1_156_3830.vasp,CoTeI,-1.0629880866666668,0.07741656833333321 -Mg1H2O2_164_10370.vasp,MgH2O2,-4.409914834,0.09709573199999966 -Sb2Se2O1_1_15696.vasp,Sb2Se2O,-2.775743958,0.2171660844999974 -Ge2I1Cl1O3_8_6778.vasp,Ge2IClO3,-3.425704977142857,0.10807276142856548 -K4Sn4P4S16_14_9518.vasp,K4Sn4P4S16,-2.660564873928571,0.1261581653571433 -Sn1Sb2Te4_164_16690.vasp,SnSb2Te4,-1.7204783399999999,-0.3914805785714288 -P2Pb2S6_147_14014.vasp,P2Pb2S6,-2.923360435,0.14378386249999986 -Zr1Sb1Te2_115_21422.vasp,ZrSbTe2,-2.432993645,0.5453730106250001 -Sb2Os2O6_12_15617.vasp,Sb2Os2O6,-4.540968799,0.349555514249995 -Na1Al1As2S6_5_11807.vasp,NaAlAs2S6,-2.897375742,0.44139164418749743 -Rb4Cd2F8_11_14965.vasp,Rb4Cd2F8,-1.4807397257142856,0.34533723285714313 -B6O9_150_1781.vasp,B6O9,-6.784460472666667,0.06987390266666704 -Li2Fe2Sb2_129_9912.vasp,Li2Fe2Sb2,-1.4320334183333332,0.8723316337499982 -Sn2S2Br2_59_16836.vasp,Sn2S2Br2,-1.7391766266666666,0.15088669916666664 -Na4Cd2I8_11_12379.vasp,Na4Cd2I8,-0.36797237,-0.26754898547619044 -V2W2O8_25_20228.vasp,V2W2O8,-5.808977025833333,0.18211599282484828 -Ag2Sb4S12_12_409.vasp,Ag2Sb4S12,-2.0985400983333333,0.2680672059374951 -Ru2O6_11_15334.vasp,Ru2O6,-3.87233609375,0.6897401040625004 -K2Sn1O6F6_147_9352.vasp,K2SnO6F6,-1.975286812,0.941015343166667 -Ti2Cu2_129_18929.vasp,Ti2Cu2,-2.5402960875,0.16176500500000035 -Sn4P8_26_16954.vasp,Sn4P8,-3.0058700191666667,0.19706732458332987 -Ni1Bi1_25_13281.vasp,NiBi,0.48928557,1.4981536712499999 -Ba2Te2Au1Br2_38_2064.vasp,Ba2Te2AuBr2,-1.39950219,0.35686840714285406 -Hf1Sc1Mn1In1H1Ir1Cl2O8_1_7298.vasp,HfScMnInHIrCl2O8,-4.537824766875,0.34714236415364347 -Te4Pb2_12_18610.vasp,Te4Pb2,-1.1290505316666668,-0.6456333961111116 -Zr2Sb1Te2_164_21661.vasp,Zr2SbTe2,-3.3522100979999996,0.1756889910000008 -Ta1Nb1I1N2Cl1_25_17570.vasp,TaNbIN2Cl,-5.572124675,0.013439021714281796 -Br4O2_4_2709.vasp,Br4O2,-0.7530855166666667,0.36165902208333245 -Hf2C1_164_7460.vasp,Hf2C,-6.507010080000001,0.8287701279999935 -Mn1Cu1I1Br1O3_1_10686.vasp,MnCuIBrO3,-2.283446442857143,0.07182910059523594 -Au2Br2F2_1_1448.vasp,Au2Br2F2,-0.14514568166666666,0.07491151541666649 -Sn2Cl2O2_59_16759.vasp,Sn2Cl2O2,-2.667187615,0.30275201166666665 -Sn4S3I5_1_16956.vasp,Sn4S3I5,-1.2344498541666666,0.1927071027777778 -Cr1Cu2O8F6_2_4166.vasp,CrCu2O8F6,-2.5448831888235297,0.1417775032352886 -Cu2P2Se4_26_5213.vasp,Cu2P2Se4,-1.84483036625,0.1942291003124983 -Cd1Pb2S2F2_12_3395.vasp,CdPb2S2F2,-1.7220447057142858,-0.16689319821428814 -Bi2P2S8_11_2493.vasp,Bi2P2S8,-2.9181501825,0.07172023291666685 -Au4Se2_191_1592.vasp,Au4Se2,0.17975126,1.1296090099999991 -Mg3H2O4_164_10551.vasp,Mg3H2O4,-4.479946898888889,-0.23960407111111448 -Cd2Au2S2Cl2_26_3458.vasp,Cd2Au2S2Cl2,-0.26154822875,0.1976256103125 -K1W2I6O2_47_8958.vasp,KW2I6O2,-2.249181150909091,-0.5093864721363676 -Sb2O3_6_15616.vasp,Sb2O3,-4.0169130619999995,0.24057740550000073 -Al1In2Se1S2I1Cl1_1_683.vasp,AlIn2SeS2ICl,-2.0919990675,0.1432641614843692 -Sc1Ni1S1Br4_1_15967.vasp,ScNiSBr4,-1.3954158700000001,0.32042961437499623 -Ga1Se1_156_6273.vasp,GaSe,-1.73528884,0.6821686675 -Sc2Se2Br2_59_16154.vasp,Sc2Se2Br2,-3.175742505,0.031186788333333215 -Al2Zn2Se5_156_1042.vasp,Al2Zn2Se5,-1.86444348,0.16857242305555345 -Cs2Te2N2Cl6O6_1_4794.vasp,Cs2Te2N2Cl6O6,-2.36439017,0.45500569020833304 -Ga1Ag1Se1I2_1_6125.vasp,GaAgSeI2,-0.67732731,0.17580495100000004 -Ir2S2_25_8826.vasp,Ir2S2,-3.0810236275,0.751502930833329 -Sb2Pb2S6F2_7_15644.vasp,Sb2Pb2S6F2,-2.3349546158333334,0.26705617906249596 -Ga2Ge2Se6_162_6366.vasp,Ga2Ge2Se6,-2.460063405,0.07623211566666399 -Mg4Ti4_59_10591.vasp,Mg4Ti4,-2.76917859625,0.6294728295833334 -Ta2Ni1C1I2O1_6_17788.vasp,Ta2NiCI2O,-3.8879195042857146,0.5241836739999909 -Cu1Ru1Se1Cl3_1_4952.vasp,CuRuSeCl3,-1.38086301,0.24311872121211864 -Ni3Sb2Se8_164_13717.vasp,Ni3Sb2Se8,-1.3498875646153847,0.3710216019230751 -Sn1Se1_123_16692.vasp,SnSe,-1.49571888,0.08055949499999993 -Tl1Ga1Br2_1_19270.vasp,TlGaBr2,-0.9506725175,0.02843779937499824 -Si1I2_164_16344.vasp,SiI2,-1.18985702,0.11996403861110982 -Ag2H8C10S2N2O6_1_286.vasp,Ag2H8C10S2N2O6,-5.037987074666666,0.3660919078888769 -Na2C2S6_1_12003.vasp,Na2C2S6,-3.277941086,0.35947200212499786 -Li1Al1Br4O12_2_9639.vasp,LiAlBr4O12,-2.825463301111111,0.26798417388888596 -Ni2Te4H2_11_13675.vasp,Ni2Te4H2,-1.28649441875,0.474564455 -Cr3W1Se8_25_4587.vasp,Cr3WSe8,-2.9834433641666664,-0.06071406041666638 -Co2Te2F2_59_4034.vasp,Co2Te2F2,-1.7864181683333333,0.19299576680555552 -Zr1Mn1Br6_5_21318.vasp,ZrMnBr6,-1.812319645,0.0597139284374999 -Ga1Pd5I2_123_6243.vasp,GaPd5I2,-0.95777015875,0.022991274293980235 -Mn2H4S10_7_11100.vasp,Mn2H4S10,-2.836782353125,0.2899568329687501 -Co1Cl2O8_147_3727.vasp,CoCl2O8,-2.5120587436363633,0.23323989045454452 -Te2Ir2_164_18399.vasp,Te2Ir2,-2.2229834375,0.9124480575000002 -K2Sb4S7_5_9343.vasp,K2Sb4S7,-2.392133676153846,0.1339384700000006 -Fe2Br2O2_59_5818.vasp,Fe2Br2O2,-2.3778257183333333,0.08830625652777524 -Na2Os2Br8N2O4_7_12243.vasp,Na2Os2Br8N2O4,-2.615478528333333,-0.09672078527777983 -Mg2P2S6_12_10496.vasp,Mg2P2S6,-3.17062535,0.04318562299999984 -Ti1S1O1_156_18836.vasp,TiSO,-6.04340325,0.15318168583333325 -Zr2B1S2_164_21511.vasp,Zr2BS2,-4.994747856,0.16785669349999566 -Sc2C2_164_16057.vasp,Sc2C2,-4.5964784075,1.167901076774188 -Nb2B1O2_164_12633.vasp,Nb2BO2,-6.664934196,0.37718923475000166 -Au4O4F8_14_1576.vasp,Au4O4F8,-0.7851765325,0.4883853773784712 -Cs2I2Cl8_127_4749.vasp,Cs2I2Cl8,-0.6130097791666667,0.0756699658333333 -Rb2H6C6O6_1_14856.vasp,Rb2H6C6O6,-5.126307722,0.18681212443749606 -Sb2P2S6_7_15626.vasp,Sb2P2S6,-2.937086502,0.1575351537031251 -H4Pd1C8I2_25_7081.vasp,H4PdC8I2,-4.872953734,0.47487868349999396 -Ga2H2S10_11_6376.vasp,Ga2H2S10,-2.640187747857143,0.21756268812499735 -Au2I4_14_1492.vasp,Au2I4,0.61868993,0.1455714412500005 -K2Ru2S4I8N2_7_9327.vasp,K2Ru2S4I8N2,-1.6237395744444445,0.23173536215277604 -Sc1Cl2_115_15917.vasp,ScCl2,-2.3869241133333334,0.5025634577777747 -Y2Mg4_59_20756.vasp,Y2Mg4,-1.1311961016666667,0.23181785166666535 -Y2N1_164_20761.vasp,Y2N,-5.7499866766666665,0.31488808499999443 -Ni2Sb2Se5_8_13613.vasp,Ni2Sb2Se5,-1.5233370522222223,0.22460260393939224 -Sc1I2_187_15946.vasp,ScI2,-1.6073565133333334,0.13787226388888707 -Cu2S2_10_5255.vasp,Cu2S2,-1.074458945,0.2879447666666668 -Ca2S2O8_7_3104.vasp,Ca2S2O8,-4.659511495,0.16903304333333313 -Mn2S2N1_164_11218.vasp,Mn2S2N,-3.6238844479999996,0.24155578683332457 -Ca2N1_115_3069.vasp,Ca2N,-2.32814433,0.6018418199999997 -Fe1Ge1S1Br1_1_5679.vasp,FeGeSBr,-1.8162233125,0.06307071062500008 -Cu2Te3P4F2_6_5347.vasp,Cu2Te3P4F2,-1.9604577909090908,0.4928397134343397 -Mo2S2N1_164_11666.vasp,Mo2S2N,-4.31640025,0.23279005300000044 -Ni2Bi2Se4Cl2_10_13470.vasp,Ni2Bi2Se4Cl2,-1.200926809,0.20525492499999945 -Rb4Hg2Br8_11_14971.vasp,Rb4Hg2Br8,-0.34107767714285714,0.16807534642857141 -Hf2Cl2_129_7474.vasp,Hf2Cl2,-3.3736166325,0.9390414199999997 -Cu2Te1Rh1Se3_1_5323.vasp,Cu2TeRhSe3,-1.1738427,0.28944436619047365 -In1Se4_8_8346.vasp,InSe4,-1.574533542,0.5716214476666667 -B4I4_57_1755.vasp,B4I4,-1.26677752125,1.6077413206944415 -Co2W2S8F2_129_4058.vasp,Co2W2S8F2,-2.883471105714286,0.7266675653571365 -Ca1Au2S8_89_2804.vasp,CaAu2S8,-1.9784458936363636,0.11499969153408696 -Cs2Hg4S2O6F6_31_4731.vasp,Cs2Hg4S2O6F6,-1.9407276695,0.28317769025000006 -Li1Ni1Te6As2_5_9769.vasp,LiNiTe6As2,-1.529866183,-0.1171374345833347 -Yb2H4Cl2O4_11_20875.vasp,Yb2H4Cl2O4,-4.685908870833333,-0.6696618014930589 -Ta4Mo2O16_3_18057.vasp,Ta4Mo2O16,-6.319047369090909,0.2303188559090854 -Nb3S1Br2O1_1_12997.vasp,Nb3SBr2O,-4.402650292857143,0.23611560215644656 -In4Te4Br4O12_53_8697.vasp,In4Te4Br4O12,-3.181214005416667,0.051613964861107586 -Hf1Se2_187_7310.vasp,HfSe2,-4.39418746,0.3336308033333335 -Tl1Rh3S1Br1Cl2_8_19328.vasp,TlRh3SBrCl2,-1.49769076625,0.4106116330833296 -Ti1Mo1Br2N2_25_18801.vasp,TiMoBr2N2,-4.731273483333333,0.018093527361105588 -Pd2S12N4_14_14455.vasp,Pd2S12N4,-2.9395422744444444,0.22628850944444157 -Li1Bi3_187_9664.vasp,LiBi3,-1.0913235625,-0.43042940749999997 -B2N6_164_1686.vasp,B2N6,-6.3957217025,0.27259148 -Cu2P2Se4_1_5212.vasp,Cu2P2Se4,-1.85058964125,0.18846982531249834 -Mg2Ga2S5_156_10457.vasp,Mg2Ga2S5,-1.8283957022222224,0.9436930133333332 -Mg2Te2Mo2S12_18_10522.vasp,Mg2Te2Mo2S12,-2.618825396666667,0.14032374664351605 -Ni3Se4_164_13723.vasp,Ni3Se4,-1.0424931814285714,0.06945544857142871 -Al2F6_2_823.vasp,Al2F6,-4.01318520375,-0.018505863750000184 -Sn2F2_164_16767.vasp,Sn2F2,-1.8272953,-0.46444181937499995 -Ga2Cl2O2_59_6318.vasp,Ga2Cl2O2,-3.2987893733333333,-0.3159946270833363 -Bi2I8_1_2470.vasp,Bi2I8,-0.10332578699999999,0.21222324037500034 -Mn2W2Br2O8_129_11335.vasp,Mn2W2Br2O8,-4.52441883,0.06918494952380572 -Ga1Cu1S2Br2_6_6168.vasp,GaCuS2Br2,-1.3511834533333333,0.26986457789351703 -Sb10_6_15413.vasp,Sb10,-2.032164348,0.2514027245000001 -Te6Ir2_7_18653.vasp,Te6Ir2,-1.988227075,0.31915708638888696 -Br4O12_2_2708.vasp,Br4O12,-1.949025835,0.5672307396875003 -Mn2N1O2_164_11154.vasp,Mn2NO2,-4.5804305880000005,0.23835313524999469 -Nb2S2N1_164_12843.vasp,Nb2S2N,-6.065882974,-0.12320758683333954 -Pu2Br2O2_129_14717.vasp,Pu2Br2O2,-6.471372805000001,0.04470654333333357 -La1Ge5_47_9566.vasp,LaGe5,-2.9842591166666668,-0.0788228094444472 -Hg2P2Se6_2_7984.vasp,Hg2P2Se6,-1.527636204,0.07383625849999986 -Bi1S1Br1_156_2365.vasp,BiSBr,-1.6632349800000001,0.17544436666666652 -Mn2N1F2_164_11153.vasp,Mn2NF2,-3.6044193079999998,0.2864832300000004 -Tl1Hg1Br4_1_19284.vasp,TlHgBr4,0.06290404666666667,0.13347223687500004 -Hf1H2_187_7192.vasp,HfH2,-4.127339243333333,0.5263389866666666 -Ni1O2_187_13386.vasp,NiO2,-2.1013062033333334,0.23498095874999803 -Tl2Re6Se8Cl4_2_19493.vasp,Tl2Re6Se8Cl4,-3.6599399235,0.05717417799999591 -V2Se2I2_59_20184.vasp,V2Se2I2,-2.1152791283333334,0.1950613063888833 -Zr2Nb1I1N2Cl1O1_1_21610.vasp,Zr2NbIN2ClO,-5.17177680875,0.6789162999652744 -In2P2O6_149_8519.vasp,In2P2O6,-4.5174306,0.2798394930714245 -Zr2C2Br2_59_21539.vasp,Zr2C2Br2,-4.577044235,0.5626091516666603 -Cs2Cd4Te2I6O6_31_4701.vasp,Cs2Cd4Te2I6O6,-1.2597230135,0.21480266520833394 -Fe2P2N2O10_31_5908.vasp,Fe2P2N2O10,-4.75909326375,-0.13276729312499969 -Mo3H2C2_187_11708.vasp,Mo3H2C2,-4.531803874285714,0.36657496053571004 -Cu2Cl6_191_5088.vasp,Cu2Cl6,-0.0542393675,0.363445755625 -Tl2F2_129_19408.vasp,Tl2F2,-1.4632261725,0.48974593999999994 -Re4Te8_2_15119.vasp,Re4Te8,-3.441434585,0.0788936050000002 -Fe2B1F2_164_5796.vasp,Fe2BF2,-2.49891365,0.5298349459999971 -Cu4H4Br4O4_14_5410.vasp,Cu4H4Br4O4,-2.09043913875,0.13387518776041707 -Cr1Ag1Sb2Se6_1_4105.vasp,CrAgSb2Se6,-1.8294820470000002,0.2390880913333313 -Li2S4I2_113_10060.vasp,Li2S4I2,-1.70584684375,0.5212140096875 -Na2Hg4S6O2F6_31_12158.vasp,Na2Hg4S6O2F6,-1.3171688435,0.42328202891666267 -Hf1Rh3S4Br4_1_7274.vasp,HfRh3S4Br4,-2.5359549533333334,0.3281130249999975 -Lu1Sn2_123_10300.vasp,LuSn2,-1.52236071,-0.35677392499999994 -Si8_47_16553.vasp,Si8,-3.68912695,-0.6989779 -Co1B4H4I2N2_47_3702.vasp,CoB4H4I2N2,-4.0047178407692305,0.5304425617980674 -Ni2As2O6_162_13445.vasp,Ni2As2O6,-3.166211412,0.22885003724999542 -Ho2Br6_162_8129.vasp,Ho2Br6,-2.2951053875,0.053523812499999934 -Eu2Al4Cl16_13_5597.vasp,Eu2Al4Cl16,-2.334404418181818,0.042602147727272666 -Ba2Cl2F2_129_1946.vasp,Ba2Cl2F2,-3.185348395,0.09818460666666651 -Hf1Ge1S3Cl3_1_7178.vasp,HfGeS3Cl3,-3.04601366375,0.2944128763867188 -Os2Se1S1Cl4_1_13879.vasp,Os2SeSCl4,-2.29911132875,0.18483294796874994 -Re6Te14Br14_147_15133.vasp,Re6Te14Br14,-2.092471984117647,0.04875001735294093 -In4S6_31_8687.vasp,In4S6,-2.4517721789999998,0.07286820400000016 -Mn1Ni1Br2O1_1_10825.vasp,MnNiBr2O,-1.61963313,-0.11969315749999976 -Ti1Cl2_115_18757.vasp,TiCl2,-3.16991308,0.5376999908333335 -Ir1S2_187_8759.vasp,IrS2,-2.84786148,0.24149345333333283 -Sn3P4_5_16923.vasp,Sn3P4,-2.791627095714286,0.17043635053571404 -Hg2Te2_164_8036.vasp,Hg2Te2,0.7173321775,0.24136515583333334 -Ti2Te2_187_19043.vasp,Ti2Te2,-3.74137579,0.6889740253124954 -Th1I2_164_18717.vasp,ThI2,-2.4213793966666666,0.061345435000000226 -Ba3Ni2S5Br2_123_2122.vasp,Ba3Ni2S5Br2,-2.275562895833333,0.11752610731770341 -Mn2N1Cl2_1_11152.vasp,Mn2NCl2,-2.813532822,0.46924457799999986 -Te2Pt1_115_18478.vasp,Te2Pt,-1.2761311866666667,0.5690562616666666 -Fe2H2S4_11_5856.vasp,Fe2H2S4,-2.67117451625,-0.2377347959374998 -Na2V4S10_31_12336.vasp,Na2V4S10,-3.125023990625,0.3142496628645769 -Tl1W2Cl6O2_10_19356.vasp,TlW2Cl6O2,-3.070618353636364,0.06008404181818161 -Mo2S2Cl2_59_11663.vasp,Mo2S2Cl2,-2.7696289249999997,0.262348488055556 -Lu4Te10O26_2_10325.vasp,Lu4Te10O26,-4.44153582325,0.07605245725000032 -Au2S4O1_21_1528.vasp,Au2S4O,-1.39110356,0.6850818359374979 -Zr1Te2_187_21466.vasp,ZrTe2,-2.9677862466666665,0.24218026999999998 -In1Si1Te2_1_8351.vasp,InSiTe2,-1.8143471675,0.12715395772727106 -Sc1Zn1Sn3Se5S1Br1Cl4_1_16023.vasp,ScZnSn3Se5SBrCl4,-1.829910244375,0.2549204121770833 -Cr1Ag1S2_156_4101.vasp,CrAgS2,-2.221714205,0.19515248374999983 -Re4Hg4O16_14_15107.vasp,Re4Hg4O16,-4.223015691666666,0.11012799583333344 -V1I1Cl1O1_6_19863.vasp,VIClO,-2.8929022725,0.1079309008593734 -Co3As1_187_4060.vasp,Co3As,-1.0369452675,1.0414243181250002 -H8Au2C8Cl2_2_7089.vasp,H8Au2C8Cl2,-4.474543035,0.44672966100000105 -Ti4C3S2_164_19132.vasp,Ti4C3S2,-6.980396087777778,0.20575869999999274 -Te2Rh1_187_18495.vasp,Te2Rh,-1.7473444766666668,0.45467406555555523 -H4Pb1_123_7067.vasp,H4Pb,-2.091519198,2.0347258140000006 -Mn1Nb1Sb2Te2_115_10810.vasp,MnNbSb2Te2,-2.39272148,0.4009066367361064 -K4Ge4S10_1_9448.vasp,K4Ge4S10,-2.514517381111111,0.20138911027777828 -Cs1Ti1Te2_156_4657.vasp,CsTiTe2,-2.369756175,0.3154114562500001 -Ge1Te1Au1Se1_25_6711.vasp,GeTeAuSe,-1.266724585,0.39774041125000004 -Ce2Mg2_59_3669.vasp,Ce2Mg2,-0.673948985,1.05802837 -La2Sm2I8_13_9616.vasp,La2Sm2I8,-1.8005264341666667,0.06125947916666652 -Ho2Cl6_162_8134.vasp,Ho2Cl6,-2.8745505575,0.0490937537499998 -Cu1H4C12O2_6_4897.vasp,CuH4C12O2,-5.750202328421053,0.8193547974561374 -Li2Tl2P2H2O6_4_10099.vasp,Li2Tl2P2H2O6,-4.377081784285714,-0.05856126766535469 -Na2Mg1S10F4_2_12194.vasp,Na2MgS10F4,-2.2095269494117646,0.5753927309558798 -Ag2Te3P4Br2_6_471.vasp,Ag2Te3P4Br2,-1.6096830927272727,0.2024464039772702 -Na2B6H6S6_4_11988.vasp,Na2B6H6S6,-3.7499977049999997,0.31945023070999146 -Ga1Pd2_187_6238.vasp,GaPd2,-1.18477787,0.7153786683333334 -Tl1Au1Se2Cl2_1_19224.vasp,TlAuSe2Cl2,-0.6523241916666667,0.41167726458333265 -Hf1Pd2F8_2_7269.vasp,HfPd2F8,-2.863736661818182,0.03558069318181678 -Sr3Be3_156_17355.vasp,Sr3Be3,-0.5851805783333334,1.1939801393589726 -Ag2Br2N2_59_200.vasp,Ag2Br2N2,-0.9340836650000001,0.8464824591666651 -Mn2Nb3Mo1Se8_1_11165.vasp,Mn2Nb3MoSe8,-3.4780289092857144,0.27136968283558816 -Hf2Se6_59_7612.vasp,Hf2Se6,-3.92830019,0.07588893666666707 -Pb2N2F2_59_14258.vasp,Pb2N2F2,-2.800877115,0.6078984858333307 -C6N6_8_2779.vasp,C6N6,-7.111242453333333,-0.05404675500000633 -K4Br2_51_9418.vasp,K4Br2,-0.14903588666666667,0.11977233333333309 -Na2Mg1H4Se2O10_2_12191.vasp,Na2MgH4Se2O10,-3.937849310526316,0.0641739499999967 -Fe2S2_123_5938.vasp,Fe2S2,-1.2300370275,0.7517280524999999 -Ba1Bi2F12_2_1808.vasp,BaBi2F12,-2.3233960666666666,-0.01784492800000015 -Ag1Hg3_191_81.vasp,AgHg3,2.4918193025,0.46987944159482775 -Os2S2_6_13874.vasp,Os2S2,-3.69997481,0.9957252968749999 -W1O3_6_20446.vasp,WO3,-5.9133971625,-0.04936135937500019 -Zr4O8_57_21837.vasp,Zr4O8,-6.702086525833334,0.48090261749999996 -Hg2As2S6_147_7924.vasp,Hg2As2S6,-1.6586160970000001,0.4454051911874973 -W1Cl2_187_20429.vasp,WCl2,-2.06112865,0.9790664199999948 -Ba1Si2_164_1857.vasp,BaSi2,-1.6138243266666665,1.5900391170833335 -Hf1H1O2_8_7188.vasp,HfHO2,-5.944702605,1.1023577524999997 -Co1Te1O4F2_3_3831.vasp,CoTeO4F2,-2.93198949125,0.19412497875000012 -Si1F4_123_16333.vasp,SiF4,-3.6614172959999998,0.18883446100000034 -Te2Ru1_164_18510.vasp,Te2Ru,-2.06229502,0.5586996900000001 -Cu2S2F2_59_5245.vasp,Cu2S2F2,-1.2336007666666666,0.3053806171180535 -Ba1Br2_115_1812.vasp,BaBr2,-1.7135643600000001,0.5041953299999997 -Na2H6Pd1S6_147_12127.vasp,Na2H6PdS6,-2.77297303,0.08562350516666667 -Ni4As4O4_13_13739.vasp,Ni4As4O4,-2.5616290183333335,0.28827538231481165 -Ta4Si2Te8_55_18115.vasp,Ta4Si2Te8,-3.8438064985714284,0.04080299074404459 -Ba2Cl2_129_1948.vasp,Ba2Cl2,-1.379152945,0.7618886975000002 -Na1In1Cl4O12_2_11883.vasp,NaInCl4O12,-2.583867406111111,0.21039872833333106 -In1Sb1Te1Se1_1_8333.vasp,InSbTeSe,-1.605055595,0.26209587562499775 -W1Cl2_12_20427.vasp,WCl2,-2.49029802,0.5498970499999949 -Ge2Br8_1_6759.vasp,Ge2Br8,-0.77570622,0.39456956675 -Nb2Sb2S6_2_12860.vasp,Nb2Sb2S6,-3.78064957,-0.12183836583333499 -Zn1S2_115_21006.vasp,ZnS2,-1.03613978,0.6309285494583318 -Ni1Au1Se1I2_1_13261.vasp,NiAuSeI2,0.108713222,0.22886657050000003 -Ta1O2_115_17592.vasp,TaO2,-6.7367716699999995,0.6182990186666603 -V2Se2F2_59_20183.vasp,V2Se2F2,-3.252099365,-0.04315357472222847 -In2P2Se6_143_8522.vasp,In2P2Se6,-2.30426228,0.13088550724999493 -Sc2N1_164_16106.vasp,Sc2N,-4.70690717,0.5924507633333338 -U1Sb2O6_12_19698.vasp,USb2O6,-5.7286257577777775,-0.0021225870833379012 -Cr2C1O2_164_4342.vasp,Cr2CO2,-5.00929107,0.05229873427271792 -Ca1Ag1Te2N1_6_2795.vasp,CaAgTe2N,-1.9079657380000001,-0.00404330633333308 -Ti4Br4N3O1_8_19126.vasp,Ti4Br4N3O,-5.592855320000001,-0.22735771635417723 -In1Ge1S2_1_8264.vasp,InGeS2,-2.5389594075,-0.12665025156250032 -Cu2H4S2O10_2_5131.vasp,Cu2H4S2O10,-3.7717425144444445,0.11069188791666369 -Ti3C2S2_187_19076.vasp,Ti3C2S2,-6.62184903,0.2761910692857088 -V2I2O2_59_20095.vasp,V2I2O2,-3.5299109116666667,0.08262059388888554 -Sr1Sn1Sb1S1Br2_1_17087.vasp,SrSnSbSBr2,-1.8573754116666665,0.26608034916666456 -Cu4Te4Cl4_14_5485.vasp,Cu4Te4Cl4,-0.6000776741666667,0.13052783583333277 -Pd1C8I2F4_25_14357.vasp,PdC8I2F4,-4.405700790666667,0.5452923461666607 -Zr2Ge2S8_31_21569.vasp,Zr2Ge2S8,-3.8931584249999998,0.08503587427083348 -Ga1_191_6299.vasp,Ga,-1.1332099,-0.038310920000000026 -Cd2Sb2S6_147_3563.vasp,Cd2Sb2S6,-1.669813422,0.29053710243749764 -Ta2Br10_1_17661.vasp,Ta2Br10,-1.7522332725,0.40223259750000007 -Sn2As2H6C2S6_7_16720.vasp,Sn2As2H6C2S6,-3.4929549255555554,0.149875364097212 -Tl2Ni1F4_123_19459.vasp,Tl2NiF4,-1.671891687142857,-0.01810046285714284 -Mn2S2Cl2_59_11215.vasp,Mn2S2Cl2,-2.3047402583333336,0.2735833620833328 -Sb2Cl6_147_15569.vasp,Sb2Cl6,-1.47176911125,0.04747271374999995 -Ba2Au1Se2I2_38_1914.vasp,Ba2AuSe2I2,-1.567483507142857,0.1357577690624968 -Cd1C1N2_156_3289.vasp,CdCN2,-3.302320585,0.9065153660416609 -Ga2Ni2O5_164_6403.vasp,Ga2Ni2O5,-3.40602449,0.06227656055555619 -Cr3S4_12_4579.vasp,Cr3S4,-3.3961759257142856,0.18083918428571444 -Na2Cd4S8Br6_31_12033.vasp,Na2Cd4S8Br6,-1.016013398,0.2629885644375003 -K1W2Cl6O2_47_8957.vasp,KW2Cl6O2,-3.147128987272727,0.05876398181818221 -Sr2Ge4H12_2_17227.vasp,Sr2Ge4H12,-2.8937006344444445,0.6116782224999966 -K2Os2C2Cl8O4_31_9275.vasp,K2Os2C2Cl8O4,-3.0207414644444444,0.2733964268055499 -Ti2Cl2_164_18924.vasp,Ti2Cl2,-3.7365902225,0.8470073956250004 -Sr2C4_12_17164.vasp,Sr2C4,-4.277934121666667,1.2241483166666614 -Y1Cl2_187_20623.vasp,YCl2,-3.42938533,0.1422258747222187 -Cd2C4O14_2_3482.vasp,Cd2C4O14,-4.4353919495,0.3542792149999976 -Tl6B2S6_11_19639.vasp,Tl6B2S6,-2.3538361485714288,0.3635866999999995 -Tl2O2_123_19471.vasp,Tl2O2,-1.9030078125,0.5049173772916642 -Hg2Sb2I2O4_11_8004.vasp,Hg2Sb2I2O4,-1.959342817,0.20675738825000023 -Hf2F2_164_7488.vasp,Hf2F2,-4.9944473075,0.3524838781250006 -K2N2O6_31_9249.vasp,K2N2O6,-4.0956674280000005,0.0755156997499995 -Ag2P2Se4_26_352.vasp,Ag2P2Se4,-1.69102766375,0.20904428039062373 -Te2W2Br2_59_18525.vasp,Te2W2Br2,-2.364650385,0.4503857155555553 -Cd4F8_55_3627.vasp,Cd4F8,-0.8481819508333334,0.30078339583333336 -Tb2Mg2Ni2_51_18204.vasp,Tb2Mg2Ni2,-0.5496745216666666,-0.13444557694444564 -Tl1Ag1Te6P2_149_19211.vasp,TlAgTe6P2,-1.364309691,0.20726392458333331 -Ag4S4F4_14_549.vasp,Ag4S4F4,-1.0702914733333333,0.23041902151041452 -Cr2Te1Se1_8_4516.vasp,Cr2TeSe,-2.44904557,0.4041940124999971 -Be2Bi4_12_2244.vasp,Be2Bi4,-1.5449886616666666,-0.48335740333333416 -Ga1Cu1Ag1I2N1F2_1_6156.vasp,GaCuAgI2NF2,-1.34445208125,0.5592780411458272 -Fe2Se1S1Br2_1_5968.vasp,Fe2SeSBr2,-1.5504026883333333,-0.0633516091666666 -Nb3S1Br7_156_12998.vasp,Nb3SBr7,-2.877363821818182,0.06321063636363622 -Si1Ni2P1S4_8_16349.vasp,SiNi2PS4,-2.30596679125,0.4195831115056803 -As2Rh2S6_162_1284.vasp,As2Rh2S6,-2.924027206,0.27420405724999797 -Li1Ga1Sb2Se6_5_9716.vasp,LiGaSb2Se6,-2.111990957,0.38467809233333095 -Rh2O2_129_15206.vasp,Rh2O2,-2.6515292275,1.2169369062499995 -As4O6_59_1335.vasp,As4O6,-4.22031303,0.26492454200000015 -Cs4H28O16_14_4808.vasp,Cs4H28O16,-4.02123750625,0.05531610645833318 -Ir2C4_12_8772.vasp,Ir2C4,-5.337422431666667,1.8105341416666603 -Mo2W2Se8_25_11701.vasp,Mo2W2Se8,-3.416781350833333,-0.9231833524999997 -Ta4Fe2Se10_59_18038.vasp,Ta4Fe2Se10,-3.80338806375,0.07430776812500017 -Nb2C2I2_59_12670.vasp,Nb2C2I2,-4.861402985,0.2911696506249969 -Mn2O2F2_47_11172.vasp,Mn2O2F2,-3.5530971883333335,0.11494081999999972 -Co2Br6_162_3878.vasp,Co2Br6,-0.88965436,0.04720437249999998 -Mg10Rh2_26_10328.vasp,Mg10Rh2,-0.3446816066666667,0.3656625013768109 -Al8Se12_14_1113.vasp,Al8Se12,-2.950069954,0.0025548360000002823 -Cd1H12C12N2Cl2O2_2_3325.vasp,CdH12C12N2Cl2O2,-5.21932214,0.19706641827956572 -Cd2Bi2I2O4_11_3467.vasp,Cd2Bi2I2O4,-1.9801632219999998,0.1243231180000004 -Ti1Cr1N2Cl2_6_18771.vasp,TiCrN2Cl2,-4.888989038333333,-0.1945091504166765 -Al18Se9_143_589.vasp,Al18Se9,-2.1479666514814815,0.6255996668518493 -Mg2F4_51_10451.vasp,Mg2F4,-3.1592041300000004,-0.038578458333334176 -K4Cu2P4O14_113_9440.vasp,K4Cu2P4O14,-4.193449195,0.23227208916666608 -H2Pd2S4_6_7016.vasp,H2Pd2S4,-2.37927878625,0.22938485749999993 -U1O2F2_191_19697.vasp,UO2F2,-6.153052338,-0.059367463450003655 -Al1Ga1Hg1Te4_156_664.vasp,AlGaHgTe4,-1.1538239642857142,0.18812621000000007 -Mn2Se6_11_11290.vasp,Mn2Se6,-2.17057131375,0.12769353458333355 -Al4H12O12_2_1072.vasp,Al4H12O12,-4.90252528,-0.3756497688095277 -Ag2Cl2O4_11_241.vasp,Ag2Cl2O4,-1.47976951875,0.26347184312500005 -Ca2Cu1Te2Cl2_38_3007.vasp,Ca2CuTe2Cl2,-1.3073393985714286,0.2769821921428544 -Nb2Se1Br3O2_8_12863.vasp,Nb2SeBr3O2,-4.07664062,0.11162212882812517 -Fe2Br2_12_5821.vasp,Fe2Br2,-0.55605301,0.63024667125 -Zr1Sc1C1Br1O1_156_21430.vasp,ZrScCBrO,-5.39427506,0.04318439600000046 -Hf2S6_59_7581.vasp,Hf2S6,-4.67478347375,0.053681747499999766 -B2Te2_2_1715.vasp,B2Te2,-3.34323356,0.5231519675000001 -Fe1Ni1S2I1Cl1_6_5725.vasp,FeNiS2ICl,-1.3044498916666667,-0.09678164284722561 -Ca2Co1S3_38_2986.vasp,Ca2CoS3,-2.7323798999999998,0.1448895945138864 -Al4Te6_31_1104.vasp,Al4Te6,-2.148039776,0.06724831824999988 -Hf1Co1Br6_149_7147.vasp,HfCoBr6,-1.86806087375,0.12025354499999885 -In2Se4_1_8596.vasp,In2Se4,-1.6078458283333334,0.43042011888888676 -Ga1Te1_123_6292.vasp,GaTe,-1.344718065,0.5884821508333336 -Ba2Cu1Se2Cl2_38_1971.vasp,Ba2CuSe2Cl2,-2.0513869928571427,0.2141419096428554 -Zr2C2F2_59_21543.vasp,Zr2C2F2,-5.344181348333334,0.4873569695833273 -In1Pd5F2_38_8313.vasp,InPd5F2,-0.98260184125,0.7443670691666646 -Mg2As2S6_162_10423.vasp,Mg2As2S6,-2.7789158990000002,0.06432930118749713 -Dy1P2_21_5512.vasp,DyP2,-3.156331456666667,1.0255227949999959 -Li1Ga1S4_3_9713.vasp,LiGaS4,-2.616834191666667,0.13585917729166408 -Ti2Ga1Br2N3_1_18938.vasp,Ti2GaBr2N3,-5.1788879575,0.021897867708329244 -B1P1S4_16_1630.vasp,BPS4,-3.672229106666667,0.08502536999999988 -Mn1Sn2B6C6_1_10899.vasp,MnSn2B6C6,-4.933783474666667,0.6807223418888786 -Mo2S4_127_11676.vasp,Mo2S4,-2.43354998,1.3325686383333335 -Ni4As4Se4_13_13741.vasp,Ni4As4Se4,-1.6537970216666666,0.33452703083333346 -K2Sr2I6_51_9355.vasp,K2Sr2I6,-0.907960668,-0.10397920466666655 -K2Hg4S2Cl6O6_31_9177.vasp,K2Hg4S2Cl6O6,-1.7472797254999999,0.09426323389285551 -Te4Mo3O1_10_18595.vasp,Te4Mo3O,-2.655191345,0.2234527815624998 -Ni4P4H16Cl4O12_14_13750.vasp,Ni4P4H16Cl4O12,-3.6379092479999997,0.08612512544443897 -Nd1F2_123_13219.vasp,NdF2,-3.8595090266666667,0.5656674773148105 -Sb2Se2O10F2_4_15695.vasp,Sb2Se2O10F2,-3.3236164925,0.32085879876115797 -As8Se20_14_1405.vasp,As8Se20,-2.2578695307142858,0.2630022095238076 -Bi1S1I1_156_2369.vasp,BiSI,-1.5253151733333334,0.08179044999999996 -Al2Se3_150_974.vasp,Al2Se3,-2.589968012,0.3626567780000003 -Mn3Sb1O8_12_11404.vasp,Mn3SbO8,-4.340600036666666,-0.13811328749999996 -Ni2H2S4_6_13513.vasp,Ni2H2S4,-2.10716923125,0.1602543438281227 -Pt2S2O8_75_14659.vasp,Pt2S2O8,-2.89795708,0.9697954541666665 -Al2Cu1S4_1_817.vasp,Al2CuS4,-2.66937104,0.4289103284374975 -H4Pd1C6Br2N2_25_7074.vasp,H4PdC6Br2N2,-5.016125603333333,0.2847319716666612 -Rb2H2Se2O6_1_14848.vasp,Rb2H2Se2O6,-3.3236574141666666,0.2369382162499969 -P4Pt2_2_14103.vasp,P4Pt2,-3.1839683283333335,1.0947180599999995 -Cr3H2C2O2_187_4554.vasp,Cr3H2C2O2,-4.781750646666667,0.18984026564813894 -Hg1I2_5_7882.vasp,HgI2,0.9039781766666667,0.03109791944444451 -Sb2Pb2Se6_147_15647.vasp,Sb2Pb2Se6,-1.918950889,0.2721435387083312 -As2P2_1_1243.vasp,As2P2,-3.47728915,0.15130112250000027 -Ca2H8Br4O4_53_3036.vasp,Ca2H8Br4O4,-3.483077606666667,-0.14275438444444433 -Au1Se2_164_1446.vasp,AuSe2,-0.7242782866666667,0.49579808444444334 -Ru2Br6_191_15303.vasp,Ru2Br6,-0.86063999875,0.5527480775 -Cu2H4C4Br2N2_2_5118.vasp,Cu2H4C4Br2N2,-4.25106238,0.3165639042857037 -K2Mo6O18_10_9245.vasp,K2Mo6O18,-4.870658231538462,0.07594999692307236 -Al1Br2_187_617.vasp,AlBr2,-1.20055191,0.5448754261111097 -Hf4N3Cl2_164_7794.vasp,Hf4N3Cl2,-6.574324094444445,0.10495207277777041 -Cu2N2Cl2_59_5190.vasp,Cu2N2Cl2,-1.5172372699999999,0.7514419733333313 -Nb2S2N1F2_164_12842.vasp,Nb2S2NF2,-4.5121500942857145,0.4346552497285612 -Ti4Zn2S10_59_19170.vasp,Ti4Zn2S10,-3.6174060375,0.5274954961249998 -Ga1Co5I2_123_6155.vasp,GaCo5I2,-1.1192246875,0.34120052229166487 -B6C2_191_1774.vasp,B6C2,-5.42071208875,1.3550312768749997 -Zn2Sb2S6_147_21147.vasp,Zn2Sb2S6,-1.7483635469999999,0.39208553073749774 -Cd2Pt4S6_164_3535.vasp,Cd2Pt4S6,-1.7101381808333331,0.2803871629166652 -Sn3Bi4_1_16912.vasp,Sn3Bi4,-0.46858146714285714,-1.3192669635714274 -Co2S1Cl1_156_3975.vasp,Co2SCl,-1.6924773,0.3119583381250004 -Ca3I6_5_3181.vasp,Ca3I6,-1.1573785533333334,0.11523271133333313 -Sr3Cu2S4I2_123_17371.vasp,Sr3Cu2S4I2,-1.9457447081818182,-0.01327793515151865 -Al2Ni2S5_187_902.vasp,Al2Ni2S5,-2.5765392222222223,0.1357177657870346 -P1O2_2_13929.vasp,PO2,-4.67000939,0.7235507823333304 -Cr1Bi1As1_156_4124.vasp,CrBiAs,-2.1707972533333333,0.2550586408333311 -Cd2Sb2I2O4_11_3554.vasp,Cd2Sb2I2O4,-2.221727017,0.12189911699999989 -La2Ge1I2_164_9592.vasp,La2GeI2,-2.7692626959999997,-0.3547607839999998 -Tl2Fe1Se4_156_19413.vasp,Tl2FeSe4,-1.1773098885714286,0.6065812283333315 -Li4V2F12_59_10238.vasp,Li4V2F12,-3.4664027383333336,0.12037288611111086 -Sb1Se2_187_15507.vasp,SbSe2,-1.9157221433333333,0.43612580722222005 -Ga2F6_191_6343.vasp,Ga2F6,-2.79713753375,0.17243699625000009 -Cs2Hg4S8F6_31_4734.vasp,Cs2Hg4S8F6,-1.040980389,0.4073249398125003 -Bi1Te1S1_1_2401.vasp,BiTeS,-1.72550395,-0.06486394930555894 -Pb2O6_18_14265.vasp,Pb2O6,-3.15578930625,0.2758984390624999 -Zr1P2S6F2_164_21394.vasp,ZrP2S6F2,-3.2923384418181816,0.46531454954545093 -Sc2S2F2_59_16133.vasp,Sc2S2F2,-4.412510991666667,-0.0861931980555597 -Sn1P2S6_149_16665.vasp,SnP2S6,-3.0428158888888888,-0.027913437777780548 -Ge2Os1_123_6795.vasp,Ge2Os,-3.6514212799999997,0.5399920216666669 -Cd1H4I2N6_1_3357.vasp,CdH4I2N6,-3.736136502307692,-0.04023409018315194 -Si4O8_2_16500.vasp,Si4O8,-6.175373821666667,0.2345390916666661 -Sn6F16_14_16986.vasp,Sn6F16,-2.6327178018181816,0.07478226636363683 -Cs2Cd4Te2S6Br6_31_4703.vasp,Cs2Cd4Te2S6Br6,-0.8385567469999999,0.2560814172916661 -Ni1Br1F1_8_13285.vasp,NiBrF,-0.7477807833333333,-0.13445809916666673 -Si2As2Se6_2_16384.vasp,Si2As2Se6,-2.822920743,0.13508830279166406 -Ag1Au1I4_1_9.vasp,AgAuI4,0.61093094,0.19322899000000038 -K2Te2C2Cl6O6_4_9364.vasp,K2Te2C2Cl6O6,-2.6380707483333334,0.6819765471527774 -Mn3Co2Te3O16_1_11372.vasp,Mn3Co2Te3O16,-3.9124963075,0.2537203636718748 -Sc2S2_187_16136.vasp,Sc2S2,-3.76831645,0.10751966499999988 -Y1N2_164_20655.vasp,YN2,-5.2262700466666665,1.2789708108333278 -Ni2C4N6_123_13489.vasp,Ni2C4N6,-4.705376196666667,1.151712705972213 -Zr2Sb1S2_164_21659.vasp,Zr2SbS2,-4.25353432,-0.18193728825000488 -Ag4S4Cl4F4_2_547.vasp,Ag4S4Cl4F4,-0.918282164375,0.2752449229296875 -Sr1F2_164_17046.vasp,SrF2,-3.480434263333333,0.3330824066666671 -Y4Br6_12_20810.vasp,Y4Br6,-3.104260753,0.07406680900000007 -Ni2S4F2_6_13595.vasp,Ni2S4F2,-1.7356265375,0.08702830437499809 -P2Au2O4_26_13953.vasp,P2Au2O4,-3.23479771,1.093461384499999 -Au2F2_164_1478.vasp,Au2F2,0.0972584,1.0711706355555546 -Sc2S1Cl1_99_16127.vasp,Sc2SCl,-3.2570542025,0.3727273297916639 -In2Se2I2_31_8582.vasp,In2Se2I2,-1.2405375866666668,0.08199268104166646 -Re2Se2_6_15084.vasp,Re2Se2,-4.4306273875,0.6156978262499999 -Hg2Se2O8_31_8019.vasp,Hg2Se2O8,-2.5181323266666666,0.14410799291666437 -In2Fe1Se4_164_8431.vasp,In2FeSe4,-2.000341582857143,-0.18771403928571595 -Fe1B2_123_5620.vasp,FeB2,-3.4057270966666664,0.9845440575 -K2Cu2Te2_129_9090.vasp,K2Cu2Te2,-0.409171475,0.1431456983333333 -Ag1Sb1As2S6_143_115.vasp,AgSbAs2S6,-2.354092819,0.32327514131249757 -Zn1Cd1Te1Se1_1_20913.vasp,ZnCdTeSe,-0.05212043,-0.13680663062499998 -Ag2P2S4_26_350.vasp,Ag2P2S4,-2.144719415,0.2015499590494772 -Tl4N4_127_19610.vasp,Tl4N4,-1.81978133625,0.8409350150000002 -Mo4N4Cl12_2_11752.vasp,Mo4N4Cl12,-2.7706518410000003,-0.06163511044445036 -Ca6Te6O18_4_3258.vasp,Ca6Te6O18,-4.115594310666667,1.8724056893333323 -Hf1V1Se2O1_156_7358.vasp,HfVSe2O,-4.649007,0.4842475929999973 -Zn4Ge8W4O24_14_21221.vasp,Zn4Ge8W4O24,-4.172573529999999,0.44132157106249603 -Bi16I4_10_2308.vasp,Bi16I4,-0.9742239995,-0.5012530628333338 -Ba1H2S2_5_1835.vasp,BaH2S2,-3.20576681,0.13858507249999974 -Ge6P6_2_6967.vasp,Ge6P6,-3.6233434333333334,-0.5138576283333331 -Ti1Cd1S1I1Cl1_1_18755.vasp,TiCdSICl,-1.9769462279999999,0.05644489716666709 -Mg2W2Se2S12_18_10538.vasp,Mg2W2Se2S12,-2.930666777222222,0.14577602071758994 -Mn1I2_115_10769.vasp,MnI2,-0.39050595000000005,0.3373658683333333 -Cu3I1Br2O4_1_5373.vasp,Cu3IBr2O4,-1.202241175,0.5059863889374986 -As8C6_187_1395.vasp,As8C6,-4.078349805714286,1.2350379757142802 -Hg2P2S7_5_7982.vasp,Hg2P2S7,-2.0859598654545453,0.07829852363636602 -Sr1Si2_164_17083.vasp,SrSi2,-1.5764289533333333,1.4369654766666666 -Ba2Ag2_191_1897.vasp,Ba2Ag2,0.4473134525,0.2614572275 -Ag2Te1O4_21_450.vasp,Ag2TeO4,-2.183288511428571,0.31795058428571465 -Cu3As1O4_156_5370.vasp,Cu3AsO4,-2.3787078075,0.7756810021093749 -Fe2H8C8N16_51_5861.vasp,Fe2H8C8N16,-5.861162090588235,-1.5534765632843215 -Cr3Sb5O16_8_4580.vasp,Cr3Sb5O16,-4.446785779583333,0.17320315656250007 -Si3Bi2S9_174_16467.vasp,Si3Bi2S9,-3.082705075,-0.08508978500000319 -Hf3B2Se2F2_187_7685.vasp,Hf3B2Se2F2,-4.542456033333334,0.7719094391666566 -Li1B12_191_9659.vasp,LiB12,-4.932774831538461,0.8938040051923029 -Zr1As2_187_21247.vasp,ZrAs2,-3.6388870333333334,-0.45387401833333385 -Fe2Bi2Sb2S8_26_5811.vasp,Fe2Bi2Sb2S8,-2.3937571692857142,-0.36154593550000214 -Te6Rh2_7_18683.vasp,Te6Rh2,-1.7242599375,0.3313198297222203 -Eu1Cd2P2_164_5587.vasp,EuCd2P2,-1.434278798,0.289767192 -Mn2I4O12_4_11115.vasp,Mn2I4O12,-2.850716777777778,0.1452720144444446 -Sc1As2Au1S6_149_15898.vasp,ScAs2AuS6,-2.7465258930000003,0.49308238934374726 -Sb2Pb2O6F2_7_15640.vasp,Sb2Pb2O6F2,-3.6179617625000002,0.2923379741666663 -Hg1O2F2_164_7887.vasp,HgO2F2,-0.815649344,0.7952623080000001 -As4Au2Se3I2_6_1321.vasp,As4Au2Se3I2,-1.3926697245454547,0.2934518765909059 -Ag6Sb2S6_7_582.vasp,Ag6Sb2S6,-1.1906265892857142,0.2703095735714287 -Ni2Sb4I4O6_2_13622.vasp,Ni2Sb4I4O6,-2.511040868125,0.08160670882812504 -Kr1F2_47_9558.vasp,KrF2,0.8138130966666667,0.17301818166666671 -Zr2I8O24_85_21599.vasp,Zr2I8O24,-3.3074759273529413,0.12176949176470586 -Pb2I2O2_59_14250.vasp,Pb2I2O2,-1.9583495949999998,0.2173928330324064 -Pd2Cl6_191_14419.vasp,Pd2Cl6,-0.29285672,0.41921517666666586 -Yb1Bi2_25_20852.vasp,YbBi2,-1.5244130166666665,0.5122064816666667 -Hg2Bi2S4F2_11_7940.vasp,Hg2Bi2S4F2,-1.324672257,0.40917626683332986 -Cr1S1N1Cl1_6_4243.vasp,CrSNCl,-3.54860659,-0.2624731593749996 -Ge2Te6P2_147_6895.vasp,Ge2Te6P2,-2.148492643,-0.1252826133333348 -Gd1C2_123_6595.vasp,GdC2,-5.622525863333333,0.7942782912499999 -In1Ni1Au2I4O4_8_8281.vasp,InNiAu2I4O4,-1.2071916958333333,0.16427409785416142 -Rb4Hg2I8_11_14974.vasp,Rb4Hg2I8,0.055174023571428574,0.1525980907142857 -Tl1Br1O3_156_19227.vasp,TlBrO3,-1.908169884,0.45073104149999677 -Te1Mo3N1O9_143_18312.vasp,TeMo3NO9,-4.668316013571428,0.26872537937127583 -Fe1Bi1O3_99_5631.vasp,FeBiO3,-2.9245150079999997,0.9065673802500005 -Li1Al1Cl4O12_2_9640.vasp,LiAlCl4O12,-2.933874046666667,0.2033593014444388 -Cr1Br2_187_4133.vasp,CrBr2,-1.2886496133333334,0.18812753555555417 -Hf3C2F2_187_7693.vasp,Hf3C2F2,-6.628369932857143,0.12379366149999381 -Nb4Ni8S8_51_13109.vasp,Nb4Ni8S8,-2.6136293375,0.8241596544999972 -Ta1Se2_187_17622.vasp,TaSe2,-4.566057206666667,0.12902193499999992 -Co2Te2_129_4038.vasp,Co2Te2,-1.4401541325,0.2116481208333334 -Ir2Br6_162_8769.vasp,Ir2Br6,-1.20775910375,0.07607664125000002 -In3I1Br1O3_8_8648.vasp,In3IBrO3,-2.56098508375,0.25804559304687125 -Hg2Se2F2_59_8017.vasp,Hg2Se2F2,-0.21629037333333334,0.16135451041666515 -Li6Sb2S6_147_10273.vasp,Li6Sb2S6,-2.98535197,0.00048161928571177626 -Y1F2_123_20629.vasp,YF2,-4.396274256666667,0.6974159505555504 -Cr1W3S8_25_4287.vasp,CrW3S8,-4.28514586,-0.06479357083333337 -Ni1B6H4C2F2_25_13279.vasp,NiB6H4C2F2,-3.9293592840000002,1.001183366616441 -Na1C12_191_11832.vasp,NaC12,-7.488726537692307,0.028131820769230178 -Hf1Sn3O7F1_1_7312.vasp,HfSn3O7F,-4.681079420833333,0.31944227291665506 -Sr2Sn4F12_2_17319.vasp,Sr2Sn4F12,-3.008219041111111,0.0538059394444419 -Li2Fe1P4O12_2_9901.vasp,Li2FeP4O12,-5.205708175263157,0.187220145842101 -Ti3H2C2Se2_1_19082.vasp,Ti3H2C2Se2,-5.476031308888889,0.20037483922221266 -Mn2S4_59_11226.vasp,Mn2S4,-2.79361539,0.5672292875 -Yb1P2_25_20857.vasp,YbP2,-3.6603250700000003,0.8281578399999954 -Os2Se2I2_59_13883.vasp,Os2Se2I2,-2.2478004283333335,0.37882786395832935 -Ga18Te9_143_6108.vasp,Ga18Te9,-1.528136264074074,0.12563020648148004 -Fe2Te4As2F2_26_6011.vasp,Fe2Te4As2F2,-1.7935715040000002,0.3622104413888848 -Co2H2O2_59_3908.vasp,Co2H2O2,-3.4169457433333332,0.29145443953703376 -V1Sb1As1_156_19920.vasp,VSbAs,-2.8214008566666666,0.5109883730555486 -Li2S4I2F8_2_10059.vasp,Li2S4I2F8,-1.764194815625,0.3445725650195314 -Nb4Fe4Te8_53_13074.vasp,Nb4Fe4Te8,-2.49628384625,0.5903737395833333 -Sr3Sn1_25_17401.vasp,Sr3Sn,0.18337499,0.8054373956249999 -Ga2O4_12_6422.vasp,Ga2O4,-3.772965726666667,0.1766318204166626 -Ru2F8_14_15318.vasp,Ru2F8,-2.2535093,0.027173952000000057 -B4O6_164_1759.vasp,B4O6,-6.359124001,0.49521037433333426 -Re2S4_11_15079.vasp,Re2S4,-4.7745676816666665,0.16550314250000042 -Ag2B2Br2O2_31_177.vasp,Ag2B2Br2O2,-2.49486891125,0.8360551765755146 -Ga6Se6_2_6586.vasp,Ga6Se6,-2.3421953058333336,0.07526220166666642 -Tl2I2O2_59_19433.vasp,Tl2I2O2,-1.4165949433333334,0.374741446666665 -V6S18_11_20394.vasp,V6S18,-3.45951900375,0.05432474093749651 -Ta3Br8_156_17947.vasp,Ta3Br8,-2.809201360909091,0.1258007959374976 -Ca4Mn2S6I2_129_3226.vasp,Ca4Mn2S6I2,-2.5788429192857145,0.04181782885714025 -Si1Te2_115_16376.vasp,SiTe2,-2.14532729,0.2255402683333334 -Sb2Te2H2S10_4_15715.vasp,Sb2Te2H2S10,-2.363714713125,0.2966887723177086 -Ge6Sb6_2_6970.vasp,Ge6Sb6,-2.61926054,-0.3909891912500001 -Al1F2_115_653.vasp,AlF2,-3.10173443,0.7184228572222187 -Sr2Sn4H12_2_17320.vasp,Sr2Sn4H12,-2.429394206111111,0.013673737499997896 -Mn1Co1Br4_1_10668.vasp,MnCoBr4,-0.8031682716666667,0.34759703208333204 -Y14C6I12O2_51_20600.vasp,Y14C6I12O2,-4.50942502382353,0.03517076147058784 -Co1Cl2_164_3729.vasp,CoCl2,-1.2572971866666667,-0.14363898499999994 -Nb1C1Se1Br1_8_12485.vasp,NbCSeBr,-4.164225205,0.6254558551785624 -Nd2Br2O2_129_13233.vasp,Nd2Br2O2,-4.8095131916666665,0.07187224499999978 -Pb1F2_187_14184.vasp,PbF2,-2.3194983566666667,0.3661570566666663 -Cu1H1O2_10_4890.vasp,CuHO2,-2.924924445,0.34594448307291703 -Al2Cl2_13_792.vasp,Al2Cl2,-2.0960301275,0.23496999666666452 -Hg2Bi2S4Cl2_11_7939.vasp,Hg2Bi2S4Cl2,-1.096356334,0.20309351250000024 -In1Br1_99_8210.vasp,InBr,-0.396976745,0.92588963 -Ti1Br2_164_18750.vasp,TiBr2,-2.9967199033333336,0.18182935333333328 -Ba2Au1Se2Br2_38_1911.vasp,Ba2AuSe2Br2,-1.7565864900000001,0.2341211533482105 -Ag2Sb2S6_2_402.vasp,Ag2Sb2S6,-1.691801668,0.3807294798749975 -As2S3_164_1294.vasp,As2S3,-2.9467930979999997,0.5727018305000002 -Cs2I2O6_11_4751.vasp,Cs2I2O6,-2.527338026,0.4215403200000001 -Zr2S2_187_21652.vasp,Zr2S2,-4.2055156225,0.46367540249999983 -Ta4Br16_14_18010.vasp,Ta4Br16,-2.10519364,0.29458363443750013 -Ni2As2S6_2_13450.vasp,Ni2As2S6,-2.1205740299999998,0.4835513085624982 -K2P2H4O4_13_9288.vasp,K2P2H4O4,-4.021149440833333,0.18316347224536722 -Sn2Te2_12_16895.vasp,Sn2Te2,-1.2540453225,-1.2183173424999998 -Na2Sr2_11_12308.vasp,Na2Sr2,0.5679264125,0.6274641143749999 -Ba2Au1S2Cl2_38_1908.vasp,Ba2AuS2Cl2,-2.1839275085714287,0.2217564817633873 -Ti3Se2_123_19105.vasp,Ti3Se2,-5.31412272,-0.026459014555565652 -Sc4H2C3_164_16241.vasp,Sc4H2C3,-4.886038843333334,0.18488162856630308 -P2Se1S2_5_14047.vasp,P2SeS2,-3.015913316,0.20073005470237537 -K1Al1P4H4O14_2_8878.vasp,KAlP4H4O14,-5.236513957083333,0.05589993083333411 -Bi2Te1Se2_164_2555.vasp,Bi2TeSe2,-1.817883638,0.11592419599999992 -Zn2P4H16O20_4_21133.vasp,Zn2P4H16O20,-4.549960348571428,0.05317866499007118 -H3Pd1_187_7048.vasp,H3Pd,-1.99666794,1.8538587425 -H2Rh1O2_164_7023.vasp,H2RhO2,-3.6810022840000003,0.46286717544444067 -P4H16C4O8_14_14080.vasp,P4H16C4O8,-4.7671640971875,0.10531423593749001 -Cd1H4C2Br2N4_10_3344.vasp,CdH4C2Br2N4,-4.163268726153846,0.20637681632477942 -Zn1In2Se4_156_20968.vasp,ZnIn2Se4,-1.5460370228571427,0.14612076428571452 -Ni1Se2_164_13423.vasp,NiSe2,-1.23989235,0.24386316333333324 -Sb2Te1O2_1_15706.vasp,Sb2TeO2,-3.0289254199999998,0.4248367829999975 -Er6I7_12_5583.vasp,Er6I7,-1.6029115669230771,0.14971861910256257 -Co1Re2S8_2_3814.vasp,CoRe2S8,-3.556628978181818,0.4746491249242391 -Ga1Ni2Se3Br4_1_6218.vasp,GaNi2Se3Br4,-0.922298984,0.2002933139999985 -Nb4Te14Pt2_11_13169.vasp,Nb4Te14Pt2,-2.636643639,0.09364698933333049 -Ge2S2Cl2_59_6823.vasp,Ge2S2Cl2,-2.3974931466666667,0.16486298718750003 -Pd2S2I1Br1_1_14461.vasp,Pd2S2IBr,-1.093144285,0.2860293770833334 -Hf1Pd1F6_149_7264.vasp,HfPdF6,-3.40937239,0.03822051625 -Fe2Cl2O2_59_5835.vasp,Fe2Cl2O2,-2.626641715,-0.04376686347222458 -Sc2O2_10_16115.vasp,Sc2O2,-5.144950565,0.7457576829687498 -Mg1Si2_164_10404.vasp,MgSi2,-2.264736453333333,-0.26815735333333324 -Ca2Ag1Se2Cl2_38_2913.vasp,Ca2AgSe2Cl2,-1.5866225714285715,0.13615371357142525 -Ag1P2_10_96.vasp,AgP2,-1.98322154,0.5142506719696955 -Tl2Te2Cl2_59_19546.vasp,Tl2Te2Cl2,-0.83047821,0.31178224888888784 -Zn1Te1_123_21020.vasp,ZnTe,0.515431095,0.638111955 -As1S1I1_156_1170.vasp,AsSI,-1.6962375133333334,0.3233922524999999 -Mn2Nb1Te1Se1I2_6_11161.vasp,Mn2NbTeSeI2,-2.020446052857143,0.2459246854936351 -Hg4Se4O12_14_8089.vasp,Hg4Se4O12,-2.440736115,0.08131422099999996 -Ag2Te2I2_59_458.vasp,Ag2Te2I2,-0.0069545833333333335,0.28532513222222194 -Tl1In1Se2_8_19302.vasp,TlInSe2,-1.423044835,0.29433950625000005 -Bi2Te2Br2_59_2556.vasp,Bi2Te2Br2,-1.19908515,0.18437593000000008 -Mn1Zn2C6N6_2_10947.vasp,MnZn2C6N6,-5.585959783333333,0.49165133733331934 -Na2P30_2_12260.vasp,Na2P30,-3.907122280625,0.008859867734375193 -Sr4Ni2Cl2O6_129_17454.vasp,Sr4Ni2Cl2O6,-3.3611093014285713,-0.2608006748809615 -Ag1Bi1Sb2Te6_143_27.vasp,AgBiSb2Te6,-1.164289348,0.30081774891666485 -K4Au4S20_49_9413.vasp,K4Au4S20,-1.7983615153571428,0.1735891414285713 -Zn1Te1Mo1O6_3_21018.vasp,ZnTeMoO6,-3.827937755555556,0.19129510245369952 -P2W2S6_12_14060.vasp,P2W2S6,-3.749996726,0.33907257685937253 -Mn1Te2Ir1_8_10907.vasp,MnTe2Ir,-1.9290790475,0.4436615606250002 -Ca3Co2S5Cl2_123_3164.vasp,Ca3Co2S5Cl2,-2.5697779358333332,0.1771085257291639 -Y1Ge1S2Br1Cl1_1_20633.vasp,YGeS2BrCl,-3.3057265716666664,0.018530642031244438 -In1Cu1P2Se6_149_8230.vasp,InCuP2Se6,-2.1834152060000003,0.11947569354166426 -Zr2Te4P2Se1S1_1_21716.vasp,Zr2Te4P2SeS,-3.070953496,0.3583471358749989 -Rb2Cd4S6Cl6O2_31_14811.vasp,Rb2Cd4S6Cl6O2,-1.1644658375,0.4493639681093722 -Li2Sb4F14_26_10066.vasp,Li2Sb4F14,-2.921297001,0.23365053850000028 -Al2Co1Se4_164_800.vasp,Al2CoSe4,-2.6931808642857145,0.03098626209523364 -B1_191_1646.vasp,B,-5.23243617,0.9285491283333336 -Te2Au2Br2_59_18365.vasp,Te2Au2Br2,-0.10805503833333334,0.25315888333333336 -Au2Se4_6_1559.vasp,Au2Se4,-0.80648759,0.41358878111111 -Ba1F2_164_1829.vasp,BaF2,-3.5077750566666666,0.3644356966666664 -Cs2I2_129_4752.vasp,Cs2I2,-0.455425655,0.273963245 -Y2C1Br2_164_20707.vasp,Y2CBr2,-4.606893276,0.039817951999999934 -Nb2Cl6_189_12686.vasp,Nb2Cl6,-2.81224789125,0.21832501234374702 -B2S2_12_1701.vasp,B2S2,-4.60631387,0.19737090249999945 -Te2N2_129_18415.vasp,Te2N2,-3.0522596625,0.5005085270833335 -Sr4Fe2I2O6_129_17435.vasp,Sr4Fe2I2O6,-3.4874908764285713,0.016406890000000285 -Li4Sb4O8_29_10224.vasp,Li4Sb4O8,-4.275242666875,0.13039835218750007 -Ca1S2F2_12_2872.vasp,CaS2F2,-2.250571334,1.1028315637500004 -Sn2F8_1_16769.vasp,Sn2F8,-2.481947126,0.07315110599999963 -Cs2Hg4Se2O6F6_31_4738.vasp,Cs2Hg4Se2O6F6,-1.6389662829999998,0.19551215749999784 -Tl4Sb4_127_19624.vasp,Tl4Sb4,-0.30354517875,0.951925890625 -Y2I6_162_20748.vasp,Y2I6,-2.09538648375,0.08114013500000006 -Ca2Cd1_123_2974.vasp,Ca2Cd,1.1422741666666667,0.42346687888888956 -P2I10_51_13985.vasp,P2I10,-0.13646882000000002,0.27898269833333333 -Sc2C1O2_164_16054.vasp,Sc2CO2,-5.666728372,0.8280736915666607 -Cr1I2_164_4201.vasp,CrI2,-1.09336071,0.06640389555555437 -Ta4Te14Pd2_11_18127.vasp,Ta4Te14Pd2,-2.7542710315,0.08293136766666431 -Hf2O2_129_7546.vasp,Hf2O2,-6.14215593,1.164645845681811 -Ca8Sn4_1_3262.vasp,Ca8Sn4,-0.3571996741666667,0.4958566808333333 -I8Cl8O8F8_14_8167.vasp,I8Cl8O8F8,-1.3814159415625,0.024687913437499986 -Co1Sn2C6N6_1_3827.vasp,CoSn2C6N6,-5.868312412666667,0.12813305133332675 -Zn1Ga2Se4_156_20939.vasp,ZnGa2Se4,-1.7983779557142856,0.18770710428571458 -In2Te2I2_59_8623.vasp,In2Te2I2,-0.8687583716666666,0.10877615416666675 -Cd1Ge1S1I1Cl1_1_3313.vasp,CdGeSICl,-1.1836779119999998,-0.32855309333333316 -Ti1As2_164_18738.vasp,TiAs2,-4.382771193333333,-0.772069279583333 -Hf1As2H2O6_164_7105.vasp,HfAs2H2O6,-5.0185614272727275,0.3184661355302927 -Nb3Pt3S14_6_12995.vasp,Nb3Pt3S14,-3.6197897615000003,0.11132219768749008 -Tb2Ga2I2_164_18195.vasp,Tb2Ga2I2,-2.1774917016666664,0.006085874666664784 -In3Te1Cl1_1_8659.vasp,In3TeCl,-1.039429992,0.5794011213749974 -Cd1Pb1S1I2_1_3388.vasp,CdPbSI2,-0.621220728,0.10764821616666675 -Ti1Ni1Te2P2Se1S3_1_18816.vasp,TiNiTe2P2SeS3,-2.886361665,0.3509232759499929 -Nb2C2_164_12671.vasp,Nb2C2,-6.8244541475,0.9276927841666593 -Cu2S1O4_21_5239.vasp,Cu2SO4,-2.979372577142857,0.35902351607142746 -Pt2S2_164_14665.vasp,Pt2S2,-1.9658255925,0.6492555674999998 -Ca1B2H2_164_2805.vasp,CaB2H2,-2.29636479,1.8108640721428537 -As1I2_164_1150.vasp,AsI2,-0.5723905533333333,0.39380526777777686 -Sn2Sb2S6_7_16868.vasp,Sn2Sb2S6,-2.515229534,0.1634735902499953 -Ni2Te2S6_11_13665.vasp,Ni2Te2S6,-1.842676427,0.10142403845833164 -Bi6Se4Cl2O16_59_2680.vasp,Bi6Se4Cl2O16,-3.222539504642857,0.4026210068749967 -K2S2N4O4F10_11_9331.vasp,K2S2N4O4F10,-3.073629828181818,0.0007695996212049305 -Au1F1_156_1422.vasp,AuF,0.44625142,1.4201636555555546 -Zn2S2Br1Cl1_1_21142.vasp,Zn2S2BrCl,-0.8992477066666668,0.13251248436458113 -Al2Co2Se5_156_807.vasp,Al2Co2Se5,-2.5167766088888888,0.08046959325925462 -K2Ir2N2Cl10O4_31_9209.vasp,K2Ir2N2Cl10O4,-2.1437155765,0.2872707361249999 -Ti1Pd1Se1S1_156_18830.vasp,TiPdSeS,-3.584557755,0.13713152363340286 -Li2Fe6O4F12_31_9920.vasp,Li2Fe6O4F12,-2.7164836620833337,0.3361711907291629 -Ti1H2_187_18790.vasp,TiH2,-4.23930832,0.4689934899999999 -Tm1P2_21_19667.vasp,TmP2,-3.1781110233333334,0.9392933583333296 -Te2Pb2_164_18457.vasp,Te2Pb2,-1.189463625,-1.2502308 -Cs2Os2N2O2F10_11_4761.vasp,Cs2Os2N2O2F10,-3.2776354683333335,-0.20232218161617488 -Na6H2Se2S8_11_12441.vasp,Na6H2Se2S8,-2.35811517,0.1320069701388844 -Al2Te2F2_31_1001.vasp,Al2Te2F2,-2.8231305916666667,0.1829980562499971 -Ca2Si1O4_8_3122.vasp,Ca2SiO4,-4.306889988571428,1.2533470585714284 -Ge4Te4_53_6952.vasp,Ge4Te4,-2.1983072,-0.7350658749999999 -Ti1S2I2_5_18837.vasp,TiS2I2,-2.715790654,0.20929016674999978 -Co2Sb1Te2_187_3994.vasp,Co2SbTe2,-1.830817756,0.16416229566666463 -Ta1Nb3S4Cl4_6_17584.vasp,TaNb3S4Cl4,-4.297041460833333,0.09581472740078811 -Tl1As2Au1S6_149_19216.vasp,TlAs2AuS6,-2.018095838,0.5084271136249976 -H18Pb2C10S2N2O4_4_6981.vasp,H18Pb2C10S2N2O4,-4.958658523157895,-0.04962872578948052 -Li2Fe2B2O8_11_9904.vasp,Li2Fe2B2O8,-4.909727664285714,0.1336815897703997 -Ba2Cl4_51_1952.vasp,Ba2Cl4,-2.26778287,0.45641251333333344 -Hg3N2_191_8062.vasp,Hg3N2,-0.187105926,0.5535170072758622 -Cu1W1Se1Br3Cl2_1_5002.vasp,CuWSeBr3Cl2,-1.4318947275,0.04100933386028982 -Hf4Te4Cl4_31_7822.vasp,Hf4Te4Cl4,-3.4638473116666666,0.1383292114583301 -Li2V2F6_11_10121.vasp,Li2V2F6,-3.426236396,0.1337220899999965 -Bi2Te2I2_59_2559.vasp,Bi2Te2I2,-0.9733797766666666,0.18557426333333338 -Ta4N3F2_164_18060.vasp,Ta4N3F2,-6.917384045555555,0.5913185059999864 -Co1B6Pb2C6_1_3706.vasp,CoB6Pb2C6,-5.1308442586666665,0.9833218047222104 -In1Se1_156_8343.vasp,InSe,-1.274804035,0.6286113275 -Bi1Te1F1_156_2399.vasp,BiTeF,-1.8757763900000002,0.32622284694444226 -Ti6H4O14_2_19176.vasp,Ti6H4O14,-6.407744549166666,0.11669914756944522 -Sn2B2As2H6S6_7_16734.vasp,Sn2B2As2H6S6,-3.1405175877777776,0.44476953888888554 -Mn2H2C1O2_164_11088.vasp,Mn2H2CO2,-4.3506278485714285,0.5408889414285669 -Sn2Br2_164_16747.vasp,Sn2Br2,-0.8236686875,-0.6002808699999999 -W2Se2_187_20548.vasp,W2Se2,-3.8418260525,0.45614601750000006 -Ba1Cu2S8_89_1827.vasp,BaCu2S8,-2.0911583845454547,0.2263295976515104 -P1F3_187_13919.vasp,PF3,-2.45219804,0.8790029125000003 -Ho2Br2O2_59_8126.vasp,Ho2Br2O2,-4.722710565,0.12378729333333371 -In2Pt1I1Cl1O3_1_8532.vasp,In2PtIClO3,-2.26763337375,0.5659830868750002 -Ba4Se4_11_2188.vasp,Ba4Se4,-2.403314,0.56512729671875 -Fe2Te2Br2_59_5994.vasp,Fe2Te2Br2,-1.0200365166666667,0.22164435166666663 -Ti2Se2_129_19024.vasp,Ti2Se2,-4.730437865,-0.36535823999999995 -Te6P1Pb2_157_18662.vasp,Te6PPb2,-1.3640950666666667,-0.2429761431481492 -Sm2Te6_129_16590.vasp,Sm2Te6,-2.506038775,0.054783899999999885 -Nb1Sb1Te1Mo3I1Br1_1_12568.vasp,NbSbTeMo3IBr,-2.4835508275,0.8214511650446396 -Cr2B1S2F2_164_4323.vasp,Cr2BS2F2,-3.0174766414285714,0.6332500973214208 -Sr2C2Cl2O6_59_17159.vasp,Sr2C2Cl2O6,-4.644735933333333,0.2543705845833315 -Yb2H4I6O20_2_20876.vasp,Yb2H4I6O20,-3.47706477625,0.02505643087239598 -Ta2As2O8_26_17647.vasp,Ta2As2O8,-5.911623039999999,0.2969238478395031 -Mn6Se8O24_2_11472.vasp,Mn6Se8O24,-3.8853359286842104,0.027426633070168016 -Hg1H1S1Br1_156_7862.vasp,HgHSBr,-0.955394485,0.07246783624999832 -Ta9Se18_12_18166.vasp,Ta9Se18,-4.557771085925926,0.1373080557407409 -K1S2_115_8933.vasp,KS2,-1.0653593133333332,1.0210425833333314 -Cr2W2S8_25_4539.vasp,Cr2W2S8,-3.9890827766666668,-0.020976848333333464 -Zn2As4S6I4_31_21037.vasp,Zn2As4S6I4,-1.602562100625,0.210075247374999 -Be1As2H4O4_1_2211.vasp,BeAs2H4O4,-4.0933944172727275,0.4572268207575658 -Au2Se2_10_1546.vasp,Au2Se2,-0.49658979,0.17953049000000004 -Cd3C2O6_38_3611.vasp,Cd3C2O6,-3.4279544618181816,0.4254452263636387 -Sn2P2S6F2_7_16820.vasp,Sn2P2S6F2,-2.9065410491666666,0.10511837861110562 -Ge2B2Sb2H6O6_7_6749.vasp,Ge2B2Sb2H6O6,-4.076186104444444,0.4952682738888844 -In2Br2_164_8388.vasp,In2Br2,-0.9395905275,0.3832758475 -Rb2H6C2Se2S6_4_14853.vasp,Rb2H6C2Se2S6,-3.1772650955555557,0.17730653811341313 -As4Se4I4_14_1370.vasp,As4Se4I4,-1.7143152291666668,0.06304110083333314 -Bi2I10_51_2461.vasp,Bi2I10,0.1764608275,0.3758731889583331 -As2Pb2O6_147_1255.vasp,As2Pb2O6,-3.7752761919999998,0.39014906250000037 -B6Se6_2_1788.vasp,B6Se6,-4.151470890833333,0.023513891666667064 -Os1I2_25_13806.vasp,OsI2,-1.3048388766666668,0.40379644791666514 -P8Se10_7_14158.vasp,P8Se10,-2.818098858888889,0.16628697564814549 -Sb2F6_189_15578.vasp,Sb2F6,-2.51753890625,0.5985945087500002 -Sn4P4S12_7_16949.vasp,Sn4P4S12,-2.953922872,0.10450317899999995 -Sr2Co1_123_17190.vasp,Sr2Co,0.4386168066666667,1.2092799766666662 -Ta4B3H2O2_164_18003.vasp,Ta4B3H2O2,-6.4545612199999995,0.654397964727262 -Te2Pd2Br2_59_18465.vasp,Te2Pd2Br2,-0.9768551016666667,-0.11282222083333338 -Mo2N2F2_59_11638.vasp,Mo2N2F2,-4.54478227,0.034562169722218705 -K4V2P4O16_100_9526.vasp,K4V2P4O16,-4.897150898846154,0.17626816807692247 -Nb1Cu1Se3Br2_1_12500.vasp,NbCuSe3Br2,-2.094169844285714,0.16609539005290602 -Sb2Te2O1_1_15720.vasp,Sb2Te2O,-2.402901082,0.24713285649999772 -Ba3Mn2Br2O5_123_2113.vasp,Ba3Mn2Br2O5,-3.8410411441666668,0.08252976005147436 -V3H2C2S2_6_20263.vasp,V3H2C2S2,-4.502684322222223,0.06048513064813221 -Y1Hg1Cl2O2_1_20639.vasp,YHgCl2O2,-2.9890015183333336,0.29584797833333276 -Hf1Fe1F6_1_7159.vasp,HfFeF6,-3.94555069625,0.12579158999999995 -Hf1Zr2S2Br4_6_7411.vasp,HfZr2S2Br4,-3.5444482833333333,-0.04148275000000323 -V3N2F2_187_20281.vasp,V3N2F2,-4.999739262857142,-0.0537121993650872 -P2Pb1Se4_164_14003.vasp,P2PbSe4,-2.4628453142857145,0.22110753883928302 -Ta4O10_4_18075.vasp,Ta4O10,-6.896307650714285,0.34927674500000094 -Te5As2Pd2_8_18636.vasp,Te5As2Pd2,-1.5985459422222223,0.28445630855555326 -In2Br2N2_59_8386.vasp,In2Br2N2,-2.3650081716666667,0.361486285833331 -Li4Zn2Br8_11_10251.vasp,Li4Zn2Br8,-1.3413794592857144,0.07981613660714165 -As4O14_4_1331.vasp,As4O14,-3.732073548888889,0.44376844638888435 -B2W3O2_187_1722.vasp,B2W3O2,-5.967734031428571,0.7956325011111056 -Zr3Sc2Ga1S3I1Cl5_1_21784.vasp,Zr3Sc2GaS3ICl5,-3.342557092,0.12358592622220876 -Er2Ni2Ge4_129_5564.vasp,Er2Ni2Ge4,-2.28505411875,0.3984342106249996 -Zr1V1I2N2_25_21486.vasp,ZrVI2N2,-4.433823605,0.05092307578703048 -Cd2Ag2Te2Br2_26_3449.vasp,Cd2Ag2Te2Br2,0.2063819525,-0.021162532812499996 -Ta1Cr1Cu1S2I1Br1N1_1_17531.vasp,TaCrCuS2IBrN,-3.21085682125,0.14335365911665937 -Tm4Te10_99_19693.vasp,Tm4Te10,-2.136786107142857,-0.22501366190476624 -Ni1H2_115_13327.vasp,NiH2,-1.5702522866666666,1.6479046283333307 -Ni2P4S6Br4_11_13569.vasp,Ni2P4S6Br4,-2.07347666,0.18768181265045836 -Mn2Zn2Se6_1_11348.vasp,Mn2Zn2Se6,-1.42516675,0.23184875949999806 -In1S2O8_150_8329.vasp,InS2O8,-4.121835710909091,0.14523590005681053 -Tl1Ni5I2_123_19308.vasp,TlNi5I2,0.6253986225,1.4307060312499997 -Sb4Cl12_14_15774.vasp,Sb4Cl12,-1.45740407125,0.06183775374999989 -K2Ni2As2_129_9267.vasp,K2Ni2As2,-0.7236369283333333,0.27518413333333147 -Fe2As2_129_5790.vasp,Fe2As2,-1.4153465425,0.4832499075000001 -Zr2Pb2F12_67_21631.vasp,Zr2Pb2F12,-3.745595011875,0.06872342312500024 -Tm2Sb2S4O2_129_19685.vasp,Tm2Sb2S4O2,-4.335643723,0.11925640800000048 -Hg2Te6Pd4_164_8042.vasp,Hg2Te6Pd4,-0.5835549691666667,0.2661440775 -Mn1Tl2S4_156_10916.vasp,MnTl2S4,-1.9006592357142857,0.4516020152678525 -As1W1Br4Cl2_5_1182.vasp,AsWBr4Cl2,-1.45612067375,0.3147778123958305 -K2Cd4S6Br6O2_31_9050.vasp,K2Cd4S6Br6O2,-1.0046958395,0.42413600943749746 -Sr1Sb1S1I1Br1O1_1_17078.vasp,SrSbSIBrO,-2.311149495,0.1163456494444367 -Ni2Sb4Br4O6_2_13620.vasp,Ni2Sb4Br4O6,-2.757624379375,0.027204613854164617 -Sb4P6H6O18_2_15801.vasp,Sb4P6H6O18,-4.774507669999999,0.16344759386028732 -Ca2N4Cl4_28_3073.vasp,Ca2N4Cl4,-2.23593375,1.3145051820000004 -Mg1Al2S3_156_10332.vasp,MgAl2S3,-3.005505715,0.26227359388888527 -Ru2S4_11_15347.vasp,Ru2S4,-3.4138419483333333,0.20090158000000002 -C60_47_2774.vasp,C60,-7.7109449015,0.4053805085000004 -Li1Mo2Br6O2_47_9749.vasp,LiMo2Br6O2,-2.3759662827272727,0.0518042331818136 -K2Pd1S2_47_9299.vasp,K2PdS2,-1.047640028,0.6608980200000001 -Nb2Co4Se2S2_51_12697.vasp,Nb2Co4Se2S2,-3.352599508,0.14472791391666417 -Ag2B2F8_26_178.vasp,Ag2B2F8,-3.0086219625,0.11281758791666707 -Al2Cd2Cl8_2_788.vasp,Al2Cd2Cl8,-1.3931280433333333,0.04336004333333343 -S2N2_8_15385.vasp,S2N2,-3.757903115,0.31791459593750027 -Na1Ge1S2_1_11872.vasp,NaGeS2,-2.69288171,0.18282213343749998 -Au2F4_14_1481.vasp,Au2F4,-0.36605370833333334,0.4333850424074066 -Ta2Si2Sb2_129_17886.vasp,Ta2Si2Sb2,-4.760925935,0.3116650235317344 -Bi4Mo2S12_4_2616.vasp,Bi4Mo2S12,-2.5991006794444447,-0.24539510840278034 -Mg1H2S2_1_10371.vasp,MgH2S2,-3.003389034,-0.24255780649999992 -Ag2Cl2O4_67_243.vasp,Ag2Cl2O4,-1.21288588375,0.530355478125 -Ga2Bi1S1Br2_1_6305.vasp,Ga2BiSBr2,-1.59005756,0.09302266874999876 -P2Se2O1_5_14049.vasp,P2Se2O,-3.3487353339999997,0.3371705988666619 -As1S2_115_1171.vasp,AsS2,-2.53927711,0.8299494636458302 -Ga2S2F2_59_6442.vasp,Ga2S2F2,-2.738666403333333,0.20398754888888626 -Sc4S2N3F2_164_16254.vasp,Sc4S2N3F2,-4.779224218181818,0.3322407676515058 -Cr1Te1Os1Br1N1_6_4272.vasp,CrTeOsBrN,-3.121264706,0.31901758049999185 -Sb12Cl12O12_14_15415.vasp,Sb12Cl12O12,-3.032566128888889,0.09874049333333312 -Nb13Te26_2_12461.vasp,Nb13Te26,-3.302465362051282,0.0864549990598289 -Si1C1_187_16325.vasp,SiC,-5.82705164,0.6627508841666669 -K2Os2N2Cl8O4_31_9281.vasp,K2Os2N2Cl8O4,-2.753948957222222,0.1115664397222196 -Hf2S2Br1Cl1_25_7565.vasp,Hf2S2BrCl,-4.369218758333333,-0.004457770520841731 -Cr1Sb1As1S1I1Br1_1_4251.vasp,CrSbAsSIBr,-1.8812137933333333,0.007978270277775507 -In2As2S6_147_8374.vasp,In2As2S6,-2.637464514,0.38460314175 -Mn1Ge1S2Br1_1_10739.vasp,MnGeS2Br,-2.460707068,-0.16719430599999985 -Te2Mo2Se2_6_18409.vasp,Te2Mo2Se2,-2.2187884983333332,0.35936523833333345 -Co1Br2O8_147_3708.vasp,CoBr2O8,-2.312406130909091,0.4343809198106039 -Co3Si1Te2_187_4072.vasp,Co3SiTe2,-2.195207995,0.0424222330555557 -Sb2F2_12_15574.vasp,Sb2F2,-2.1255566375,0.7130546633333311 -In1Se2_115_8344.vasp,InSe2,-1.66243432,0.3758316272222202 -Na2Sn1H6S6_147_12302.vasp,Na2SnH6S6,-2.873917622,0.04374348566666686 -Bi1Te2H1O6_1_2403.vasp,BiTe2HO6,-3.763540029,0.11288873316666714 -P4Pb6O16_13_14098.vasp,P4Pb6O16,-4.777695752692308,-0.1537393906730798 -Mn1Cd1Se1S2Cl2_1_10662.vasp,MnCdSeS2Cl2,-1.4378765357142858,0.5055099851190437 -Co2P2Se6_162_3966.vasp,Co2P2Se6,-2.495763079,0.32255652933333123 -Hf2H2_164_7506.vasp,Hf2H2,-4.5914375075,0.6161087924999995 -Sc2Se2_115_16162.vasp,Sc2Se2,-3.1867201725,0.6052347450000002 -Hf4B3O2_164_7766.vasp,Hf4B3O2,-6.670490527777778,0.11680132295453838 -Ti3H2C2O2_187_19079.vasp,Ti3H2C2O2,-6.5954527488888886,-0.0056114924691481605 -In1Au1S1Br2_1_8196.vasp,InAuSBr2,-0.8354308420000001,0.1996404546666648 -Mo3N2O2_187_11713.vasp,Mo3N2O2,-5.232936081428571,0.314336297857138 -Bi1B1_187_2317.vasp,BiB,-2.254668655,1.0592579916666665 -Hf1Sc1Nb1H1O6_1_7299.vasp,HfScNbHO6,-6.426577517,0.49414758300000117 -Al2Se4_12_975.vasp,Al2Se4,-2.342149371666667,0.5030360455555531 -Cs2C2S2Cl6O6_4_4670.vasp,Cs2C2S2Cl6O6,-3.158531347222222,0.15583396361110863 -Al2H6O6_1_867.vasp,Al2H6O6,-4.912229695,-0.3853541838095276 -In1Ni5I2_123_8293.vasp,InNi5I2,0.3959481175,1.461293176875 -Cu1H12C6O6_2_4889.vasp,CuH12C6O6,-4.8484730748,0.2634536241999994 -Ta2Fe2Te6_11_17730.vasp,Ta2Fe2Te6,-2.542096395,0.26253753011110736 -Rh2Br2N2_59_15172.vasp,Rh2Br2N2,-2.8095155533333336,0.19234863638888622 -Bi2Se2O1_1_2544.vasp,Bi2Se2O,-2.495512136,0.19277469466666464 -Pd2N4_2_14441.vasp,Pd2N4,-4.324244748333333,-0.08576205333333697 -Gd2Zn2P2O2_164_6628.vasp,Gd2Zn2P2O2,-3.72958844125,0.141713035 -Hf1As2_164_7110.vasp,HfAs2,-4.1743177933333335,-0.5367843716666667 -Cr1H5C4S6_1_4193.vasp,CrH5C4S6,-4.05329795375,0.405717706093751 -Ge2Se1S1I1Br1_1_6861.vasp,Ge2SeSIBr,-1.985237195,0.17107486623263873 -Fe2Se2Cl14_1_5971.vasp,Fe2Se2Cl14,-0.825190955,0.04950269500000004 -Cu2H4C4I2N2_2_5119.vasp,Cu2H4C4I2N2,-4.160507907857143,0.2718695874999888 -Zr1W2S8_164_21489.vasp,ZrW2S8,-3.7911874972727273,0.464210885852266 -Sb2W1_164_15746.vasp,Sb2W,-3.126025196666667,0.73552190833333 -Ta1Sb2_164_17612.vasp,TaSb2,-3.8538555733333335,0.34014314833333303 -Ir2S6_7_8831.vasp,Ir2S6,-3.04865729,-0.07716989015625009 -Y2Se2_129_20778.vasp,Y2Se2,-4.6104716275,0.2592730425000003 -Ir1Cl2_115_8731.vasp,IrCl2,-1.0239716333333333,1.0519836255555537 -Ni3Te8P2_164_13737.vasp,Ni3Te8P2,-1.0703583069230769,0.5450394534935886 -Te2P2S10F2_4_18440.vasp,Te2P2S10F2,-2.45920184625,0.30715842518228853 -Ho2Br2O2_129_8124.vasp,Ho2Br2O2,-4.7955121216666665,0.05098573666666706 -Li2Cr3O6_1_9875.vasp,Li2Cr3O6,-4.617416678181818,0.27198365510100597 -Sn4S4_57_16961.vasp,Sn4S4,-2.233996215,0.22983400624999994 -In2Ga1Se3Br2_1_8441.vasp,In2GaSe3Br2,-1.681721775,0.08721833437500004 -Ti2As2S6_2_18880.vasp,Ti2As2S6,-4.085070096,0.1964790993749972 -Pt1N2O6_147_14578.vasp,PtN2O6,-3.975671362222222,0.34225239499999605 -Th4F16_14_18733.vasp,Th4F16,-4.8680766625,0.18532854650000008 -Al3Co1_187_1046.vasp,Al3Co,-1.4805195075,1.2596476533593721 -Te8P2Pd3_164_18705.vasp,Te8P2Pd3,-1.5065531776923076,0.4693773870512777 -Os2Se2_129_13884.vasp,Os2Se2,-3.37481497,0.7557629525 -K2Mn2P2_129_9242.vasp,K2Mn2P2,-2.046815235,0.035646313333333346 -Ni2C2I2_59_13487.vasp,Ni2C2I2,-1.5431264999999998,1.1776598549999968 -Li1Bi1S1_99_9663.vasp,LiBiS,-2.372866536666667,-0.01681235222222477 -Sn4As4Se4_17_16935.vasp,Sn4As4Se4,-2.2312930675,-0.11004596416666845 -Ba1Y1Sn4O7_156_1879.vasp,BaYSn4O7,-4.351122723076923,0.20892326908653255 -Cs2C2S8F6_1_4674.vasp,Cs2C2S8F6,-2.6627311033333334,0.1698376858333246 -Ir2Pd1Se7_38_8804.vasp,Ir2PdSe7,-2.0399761389999997,0.4610792068749978 -K4Ca2S4O18_4_9422.vasp,K4Ca2S4O18,-4.049150023928571,0.1842355947321397 -Mn4H2N3O2_164_11437.vasp,Mn4H2N3O2,-4.508191588181818,0.6776048918181776 -Mn2Bi2Se4Br2_26_11013.vasp,Mn2Bi2Se4Br2,-1.699756222,0.16069464866666533 -Y4N3F2_164_20831.vasp,Y4N3F2,-6.608998441111111,-0.25044438870370966 -Mn1Au1I3Br1_1_10639.vasp,MnAuI3Br,-0.039702435,0.22637312291666645 -Sn6As2_191_16978.vasp,Sn6As2,-1.00931955625,-0.7874094866666654 -Hf2F6_2_7492.vasp,Hf2F6,-4.60043545125,0.39708452218749957 -Ga4O6_31_6558.vasp,Ga4O6,-4.497929204,-0.4298449067500034 -Ni1N2_99_13378.vasp,NiN2,-3.5762914733333333,0.5728756083333297 -Ga1Pd1S2I2_1_6237.vasp,GaPdS2I2,-1.4714994183333332,0.13787226770832917 -Au1S2F2_12_1440.vasp,AuS2F2,-1.27372084,0.41360582381249755 -Pd2Se4F2_1_14498.vasp,Pd2Se4F2,-1.69198604875,0.17188520890625003 -Cr3H2S2N2_187_4558.vasp,Cr3H2S2N2,-3.9829635855555554,0.33175711739197156 -Be2_123_2273.vasp,Be2,-2.08180606,0.16935172500000029 -Ta2Rh2S8_11_17839.vasp,Ta2Rh2S8,-4.206892314166667,0.09385793166666323 -Ag2As2Se6F12_10_159.vasp,Ag2As2Se6F12,-2.022286288181818,0.05746169999999973 -Fe3Hg2O8_10_6055.vasp,Fe3Hg2O8,-2.600808726923077,0.22694906727563965 -Ti1I2_187_18797.vasp,TiI2,-2.4074758666666667,0.11695329833333323 -Sn2As2O8_13_16724.vasp,Sn2As2O8,-4.131270478333334,0.2699407618749954 -Sc2C1I2_164_16052.vasp,Sc2CI2,-3.4086972099999997,-0.013926198714288684 -Ni2I2N2_59_13521.vasp,Ni2I2N2,-1.5176694016666668,0.3422586908333307 -Pb1S1I1Br1_8_14196.vasp,PbSIBr,-1.10859341,0.2637889558854169 -V1I2_115_19867.vasp,VI2,-0.81281572,0.29063032555555546 -Mn2Cl8_14_11056.vasp,Mn2Cl8,-1.160307738,0.13198928500000018 -Al1Te1_123_745.vasp,AlTe,-1.64561821,0.6601339774999999 -Nb3Ni3Se14_6_12991.vasp,Nb3Ni3Se14,-2.6621088745000003,0.12342804784999317 -Ta3F8_156_17957.vasp,Ta3F8,-4.441829883636363,0.5005165507272675 -V6O18_11_20391.vasp,V6O18,-5.08344284125,0.11245889265624953 -K2Hg4Te2I6O6_31_9196.vasp,K2Hg4Te2I6O6,-1.0579668625,0.13827836423333056 -As4Pd4O4_13_1350.vasp,As4Pd4O4,-2.9492833199999997,0.35858503249999707 -Zr1Br2_115_21269.vasp,ZrBr2,-2.119948283333333,0.5347638900000002 -Mn2C1_164_11042.vasp,Mn2C,-3.3228904366666665,0.8225305466666613 -Si2Te2I2_59_16457.vasp,Si2Te2I2,-1.6749742333333335,0.16537007513888669 -Al2S2O8F2_11_942.vasp,Al2S2O8F2,-4.137440860714286,0.6579508423809477 -Li4Cu4F14_1_10181.vasp,Li4Cu4F14,-2.0192307354545456,0.010714751818179047 -Hf2P2S6_12_7554.vasp,Hf2P2S6,-4.411322117,0.24523402974999586 -Ta2Te2S1_164_17907.vasp,Ta2Te2S,-4.548889325999999,-0.03631674866666934 -Cu2P2O6_162_5209.vasp,Cu2P2O6,-3.961160734,0.5563205795000008 -Li4P4S8_14_10215.vasp,Li4P4S8,-3.346640755625,-0.0011050567545572432 -Cu2W2O8_2_5367.vasp,Cu2W2O8,-4.612967265,0.12065276979165951 -Ti3I1N1Cl1O2_8_19092.vasp,Ti3INClO2,-5.84588530625,0.09745836598957802 -Sc2Sb2Se8_2_16148.vasp,Sc2Sb2Se8,-2.727320333333333,0.2863673072222168 -Ni1H4C8Br2_25_13351.vasp,NiH4C8Br2,-4.854261807333333,0.4263487326666613 -Os3Se4_156_13893.vasp,Os3Se4,-3.307557537142857,0.5718961014285666 -Fe2W2S14_8_6033.vasp,Fe2W2S14,-2.9448115177777776,0.06405827034721967 -Co2O2_123_3948.vasp,Co2O2,-3.0223576925,-0.055189942499999756 -Ta2I10_2_17751.vasp,Ta2I10,-1.2937455816666665,0.12591247770833358 -W2S5_6_20538.vasp,W2S5,-3.757236887142857,0.4504026413392834 -Cr1Mo3S8_25_4215.vasp,CrMo3S8,-3.6337760691666667,0.05671619625000002 -V1Ag1Te2_156_19763.vasp,VAgTe2,-1.1815507575,0.4130368195833334 -Ge2Sb2H6C2O6_7_6845.vasp,Ge2Sb2H6C2O6,-4.374166486111111,0.21600121743055273 -Ca1Co1O3_8_2820.vasp,CaCoO3,-3.780076656,0.4033258493333296 -P4I12_14_14083.vasp,P4I12,-0.70303296625,0.07547299874999963 -Re1Ir2S3Cl2_1_15010.vasp,ReIr2S3Cl2,-2.94497789625,0.5281673956423532 -Hf2Zr1Bi8Mo1_1_7664.vasp,Hf2ZrBi8Mo,-2.4157184475,-0.22450643395833392 -Mn1Cu2Cl4_25_10699.vasp,MnCu2Cl4,-0.7741990385714285,0.3589412335714266 -Cu1Ag1S2I2Br2_1_4822.vasp,CuAgS2I2Br2,-0.38202629,0.20867065171875004 -Ca2Ag1Cl2O2_5_2902.vasp,Ca2AgCl2O2,-2.5895294242857143,0.08169244086465743 -Na2F1_164_12074.vasp,Na2F,-1.7159421266666666,-0.14340469333333483 -V2S2O7F2_1_20161.vasp,V2S2O7F2,-4.37113744,0.07741399878204727 -As2Cl6_31_1205.vasp,As2Cl6,-1.51342408375,0.07948140125000003 -Fe2Br2_129_5819.vasp,Fe2Br2,0.3279666425,1.5142663237499998 -Au2S1O4_21_1509.vasp,Au2SO4,-2.584534727142857,0.5040323573214276 -Ti1S2_115_18838.vasp,TiS2,-4.725814616666667,0.4035007299999993 -V1B4H4S6F1_2_19775.vasp,VB4H4S6F,-3.79166778375,0.5505786279427041 -Cs2Cl2_129_4710.vasp,Cs2Cl2,-1.1711957475,0.19309180749999988 -Sm2Cl6_59_16569.vasp,Sm2Cl6,-2.949184525,0.07035303499999968 -Tl2Ga2Se6_31_19425.vasp,Tl2Ga2Se6,-1.775574678,0.28416986316666465 -Hf2I2N1_164_7514.vasp,Hf2I2N,-4.50816253,0.42984041649999405 -P2Pb2O6_2_14009.vasp,P2Pb2O6,-4.629455239,0.25807397975000035 -Sb2Pb2S6Cl2_7_15643.vasp,Sb2Pb2S6Cl2,-2.091424324166667,0.23302904947916275 -Bi1S2_115_2373.vasp,BiS2,-1.9036230666666667,-0.25612401927083556 -Mn2Te2I2_59_11298.vasp,Mn2Te2I2,-1.0916871383333333,0.16014663083333336 -Ag4Te2_191_570.vasp,Ag4Te2,0.23706827833333333,0.18998294999999998 -Hf1V1I1Br1O3_1_7350.vasp,HfVIBrO3,-4.691769368571428,0.2360507743154651 -Cd4As2Cl4_7_3619.vasp,Cd4As2Cl4,-0.124663202,0.3270540239999996 -V4S2N3F2_164_20359.vasp,V4S2N3F2,-4.531521825454545,0.20284063015150666 -Ga2C4Cl4F10_10_6316.vasp,Ga2C4Cl4F10,-2.8137102245000003,0.48350360749999965 -Fe1O2_187_5733.vasp,FeO2,-3.217313123333333,0.524627971249997 -Co2P4Br4O6_11_3967.vasp,Co2P4Br4O6,-3.41182858,0.26084665711110366 -Ge8Pt2_100_6974.vasp,Ge8Pt2,-2.8730430040000003,-0.1728893220000003 -Ni2Sb4S6I4_2_13624.vasp,Ni2Sb4S6I4,-1.60991668125,-0.5000630729166682 -Mo2Se1S1Br1Cl1_6_11680.vasp,Mo2SeSBrCl,-2.5406602716666664,0.20242722673611147 -Zr1Nb1I1Cl1_1_21342.vasp,ZrNbICl,-2.7384892475,0.8336579981250001 -Sc1Sn1Se1S1Br1_1_16006.vasp,ScSnSeSBr,-2.636122764,0.14758160300000045 -Al1I2_187_675.vasp,AlI2,-0.7382525633333333,0.403795324999999 -Mo2Cl6_189_11602.vasp,Mo2Cl6,-1.7629109725,0.1671715485416645 -Fe2As2Pd2_129_5777.vasp,Fe2As2Pd2,-1.4163813016666669,0.5854528287499978 -As2I6_162_1222.vasp,As2I6,-0.63537969625,0.0501925325 -Ti2Se2_164_19026.vasp,Ti2Se2,-4.4916158275,-0.12653620250000053 -Ga1Pd5F2_123_6241.vasp,GaPd5F2,-1.13941094125,0.46993334956537214 -Co2S4_14_3987.vasp,Co2S4,-2.38702058,0.6037437441666667 -Ga2Sb2O6_162_6457.vasp,Ga2Sb2O6,-4.4078916679999995,-0.06118475716667504 -K2Si6As6_10_9348.vasp,K2Si6As6,-3.0853873042857143,-0.9826798017857143 -C2N6_164_2752.vasp,C2N6,-5.9004353375,0.3950378229166609 -Te1Au2S4_21_18289.vasp,TeAu2S4,-1.1003463857142857,0.4331543033035692 -K2P2Au2Se6_10_9287.vasp,K2P2Au2Se6,-1.5690568258333333,0.23581403 -Mn1Ga2Te4_164_10730.vasp,MnGa2Te4,-1.72764803,0.1380931161904746 -Nb4O10_31_13114.vasp,Nb4O10,-6.7750484421428565,-0.30787343732143063 -Bi1Se2I1_1_2391.vasp,BiSe2I,-1.236340645,0.38291829458333326 -Tl2P2S6_149_19481.vasp,Tl2P2S6,-2.394042571,0.36772582100000006 -Pt3S4_10_14693.vasp,Pt3S4,-2.0304497628571427,0.5975157799999977 -Sb2Te1Se2_164_15709.vasp,Sb2TeSe2,-2.086790362,0.1123286010000002 -Zn3As2H16O16_10_21200.vasp,Zn3As2H16O16,-3.9636073364864868,0.03617972466966535 -Nb2Cr2Te10_11_12705.vasp,Nb2Cr2Te10,-2.4479005878571427,0.06074924617856903 -Ho2C1F2_164_8130.vasp,Ho2CF2,-4.851305148,0.1328028640000003 -K2Mg1H4S10_2_9215.vasp,K2MgH4S10,-2.549083979411765,0.039363283749997646 -Te1P1I1_156_18317.vasp,TePI,-1.3759621866666667,0.3597214816666653 -Cu2Sb2Te6_147_5272.vasp,Cu2Sb2Te6,-0.950851399,0.35647222766666503 -Y1Sc1C2S1N1Cl1_156_20670.vasp,YScC2SNCl,-5.304135392857143,0.7208628128571308 -Mn1Bi1Te1Br1_8_10651.vasp,MnBiTeBr,-1.082846185,0.4152680369073276 -Ta1Cr3Se4_111_17537.vasp,TaCr3Se4,-3.42877210625,0.4848742229166624 -Be4As2_59_2285.vasp,Be4As2,-2.570173571666667,0.5733303333333305 -Cr2Ag2Te12As4_13_4304.vasp,Cr2Ag2Te12As4,-1.544895638,0.15008446612499848 -Fe2As4I4O6_11_5792.vasp,Fe2As4I4O6,-2.994499376875,-0.19059033531250003 -Fe1Cu1Ge2H1Cl3O6_1_5665.vasp,FeCuGe2HCl3O6,-3.1902575642857145,0.09014370666479721 -Na2B2C2Se2_31_11969.vasp,Na2B2C2Se2,-3.26367563625,1.2867253200148674 -Cd2Cl2_164_3484.vasp,Cd2Cl2,0.51230936,0.11240557125000006 -As4Au2Se3Cl2_6_1319.vasp,As4Au2Se3Cl2,-1.5349317845454544,0.3590469492207762 -Te1Mo2S1Br2_1_18308.vasp,TeMo2SBr2,-2.060366515,0.34037767416666653 -Au4S4I4_14_1588.vasp,Au4S4I4,-0.39665133,0.14265688881944388 -Cu1Ag1Te1Se1_8_4831.vasp,CuAgTeSe,-0.3544085475,0.279743766875 -Sn4O6_11_16948.vasp,Sn4O6,-3.781169064,0.3302206659999958 -Co2Br2_129_3876.vasp,Co2Br2,-0.488125745,0.694746439999999 -Pd1Se2_115_14390.vasp,PdSe2,-1.4461125166666668,0.40222423166666665 -Cu2Se2_10_5302.vasp,Cu2Se2,-0.7377025425,0.17296964333333342 -N1Cl3_187_11771.vasp,NCl3,-0.4184186325,1.1174754100000002 -Al4O12_14_1077.vasp,Al4O12,-4.402616199375,0.6835294979687494 -Nb1Ni1F6_2_12542.vasp,NbNiF6,-3.10984617125,0.27095456406249907 -Pb2Br2_164_14220.vasp,Pb2Br2,-0.7343079475,0.4931815900000002 -Ta4B3O2_164_18006.vasp,Ta4B3O2,-7.367553265555555,0.24167168977776354 -Fe2C2O7_5_5834.vasp,Fe2C2O7,-4.916864144545454,0.19759550011363292 -Re6Cl18_164_15121.vasp,Re6Cl18,-2.6781616608333336,0.059821414999997824 -Cu3Te2Br2O6_12_5393.vasp,Cu3Te2Br2O6,-2.320604,0.18111037942307506 -Ni4Te4As4_13_13769.vasp,Ni4Te4As4,-1.320857455,0.11637129791666401 -Cd1Cl2_164_3301.vasp,CdCl2,-0.33937286666666666,0.06502148666666668 -Bi2P2_1_2495.vasp,Bi2P2,-2.441986075,-0.1855540849999997 -Ta1As2_187_17507.vasp,TaAs2,-4.64607207,0.5011971566666666 -Hf1P2_187_7260.vasp,HfP2,-4.544495496666666,1.0713505125000005 -P4Pt4Se4_13_14106.vasp,P4Pt4Se4,-2.9828199183333335,0.281645898333333 -Sr4Cu2Bi4O12_53_17423.vasp,Sr4Cu2Bi4O12,-3.65045562,0.21559357545454416 -Sb2Pd2S5_8_15652.vasp,Sb2Pd2S5,-2.1890868733333333,0.3065232333333312 -Nb4V2O12_12_13177.vasp,Nb4V2O12,-6.365053556111111,0.25848881439392773 -Te2W2_12_18536.vasp,Te2W2,-3.46193068,0.57611957625 -Ti1Ni1I2_6_18809.vasp,TiNiI2,-1.3301494375,0.48105396041666526 -Tl2S2Br2_59_19497.vasp,Tl2S2Br2,-1.015319615,0.24178348479166567 -Sr1Ta2O7_123_17091.vasp,SrTa2O7,-6.149866773,0.4446390958749973 -Ni1C8F6_25_13307.vasp,NiC8F6,-4.586706200666667,0.5603543003333273 -Ir2S4_14_8830.vasp,Ir2S4,-2.8618142133333335,0.22754071999999947 -Ca1H2Se2_5_2846.vasp,CaH2Se2,-2.698913664,0.6531536536666667 -Tl1Au1I2_1_19218.vasp,TlAuI2,0.1884124725,0.15065741562500004 -Na2H8Cl2O4_2_12137.vasp,Na2H8Cl2O4,-3.69116130125,0.058784321614583135 -Ta2Ni4Te4_51_17806.vasp,Ta2Ni4Te4,-2.069878078,0.053266981499999755 -N1F5_47_11774.vasp,NF5,-1.1759983416666666,0.15386464395833332 -La2O6_10_9601.vasp,La2O6,-4.94254924125,0.3810616853125002 -K1Br1_123_8884.vasp,KBr,-0.92673335,0.09385951000000003 -Nb2Fe4Se6_11_12723.vasp,Nb2Fe4Se6,-2.496906635833333,0.45547035708333183 -Cs2Hg4Se2S6Br6_31_4739.vasp,Cs2Hg4Se2S6Br6,-0.6731684419999999,0.20812055281249764 -Nb4Te6_12_13173.vasp,Nb4Te6,-3.655654654,-0.5761408896666698 -Ni2S2O6_11_13585.vasp,Ni2S2O6,-3.493104067,-0.13903800400000144 -V4O10_4_20342.vasp,V4O10,-5.434057509285714,0.024521072857142556 -Hg1S1Cl1F1_156_7905.vasp,HgSClF,-0.4940666175,0.31872315019531244 -In4As20_26_8661.vasp,In4As20,-2.6570279058333335,-0.07812527916666934 -As2Pt1_123_1276.vasp,As2Pt,-2.5933066966666667,0.8278103808333332 -Mg1H2O2_156_10369.vasp,MgH2O2,-4.155594698,0.35141586800000013 -Mn2Te4F2_11_11318.vasp,Mn2Te4F2,-1.818785715,0.2935882916666667 -Sn2S4_12_16845.vasp,Sn2S4,-2.2216062666666665,0.3915288000000001 -V2Cr1Re1S8_1_20045.vasp,V2CrReS8,-3.7981968116666667,0.1802036127083333 -Hf3Mn1S2I1Br1_1_7714.vasp,Hf3MnS2IBr,-4.0412438025,0.009958171406249716 -Hf2Br2O2_59_7447.vasp,Hf2Br2O2,-5.182722768333334,0.2920242236111079 -Pb4S4_25_14316.vasp,Pb4S4,-1.95228343,-1.279149985 -Hg3As1S4Br1_156_8044.vasp,Hg3AsS4Br,-0.7778940788888888,0.23754031986110846 -N2F6_12_11784.vasp,N2F6,-1.63284439125,0.49066565625 -Sr2Cu1Te2I2_38_17211.vasp,Sr2CuTe2I2,-1.0590602642857143,0.15923144380952148 -Cu1Re1Se1S1_25_4947.vasp,CuReSeS,-2.711093805,1.1431584537499995 -P1Pd2Se2_187_13936.vasp,PPd2Se2,-2.072641366,0.31352839162499985 -As2F2_11_1209.vasp,As2F2,-2.6262746875,0.3376448320833305 -Pb2N2O7F2_25_14259.vasp,Pb2N2O7F2,-3.629449007692308,0.34800142971153275 -P4W1O13_1_14126.vasp,P4WO13,-5.5787707611111115,0.0953334968055497 -Lu4P4S16_14_10324.vasp,Lu4P4S16,-3.7662957695833335,0.06476221333333321 -Sn1Pb1_156_16673.vasp,SnPb,-0.40772852,-1.0473472025 -Mn1Fe2Ge1Cl4O6_1_10713.vasp,MnFe2GeCl4O6,-3.005428464285714,0.08683535613838278 -Sm2H4Cl2O4_11_16572.vasp,Sm2H4Cl2O4,-4.656157689166666,0.10323945208333374 -Al2Sb6_164_957.vasp,Al2Sb6,-1.89124353,0.02498146875000007 -Cu1Re1Te3Rh1S3_1_4948.vasp,CuReTe3RhS3,-2.354164978888889,0.5088726838580205 -V3C2S2_187_20252.vasp,V3C2S2,-5.192439178571428,-0.3550253163095294 -Cd1Br2_187_3288.vasp,CdBr2,0.15630296,0.17618683083333334 -Ca4Ti4Ge8O24_14_3248.vasp,Ca4Ti4Ge8O24,-5.53245618625,-0.017321672450000047 -Ca2Cu1Cl2O2_123_2994.vasp,Ca2CuCl2O2,-2.9345994971428575,0.07201744857142331 -Ru2O2_129_15329.vasp,Ru2O2,-3.329584255,1.4426874850000002 -Ni2As4S6Br4_2_13456.vasp,Ni2As4S6Br4,-1.900941648125,0.1425904009659052 -Al1Cd1Ga1Te4_156_622.vasp,AlCdGaTe4,-1.2797204028571427,0.14393742857142855 -Ca1Br2_187_2812.vasp,CaBr2,-1.7203394733333335,0.20979419 -Nb4S12Br2_2_13135.vasp,Nb4S12Br2,-3.825708584444444,0.10065858598148025 -Co2Bi2Se4I2_10_3867.vasp,Co2Bi2Se4I2,-1.436049686,0.25896894193333125 -Sc2Te1Br1O1_25_16170.vasp,Sc2TeBrO,-3.790838454,0.33575664800000027 -Pd3Se4_10_14513.vasp,Pd3Se4,-1.3659292328571428,0.3906329349999986 -Co1Cl2O6_12_3726.vasp,CoCl2O6,-2.401365316666667,0.20796328138888676 -Sr1Sn2As2_164_17088.vasp,SrSn2As2,-2.158951232,0.1287127159999999 -Ta2Ni1Te6_12_17793.vasp,Ta2NiTe6,-2.68503437,0.11374822074073809 -Ta2W2O11_164_17935.vasp,Ta2W2O11,-6.622052240666666,-0.11329376100000577 -Si6Sb2_11_16541.vasp,Si6Sb2,-2.8613866575,-0.04788310187500011 -V1W2Se7_1_19962.vasp,VW2Se7,-3.139771916,0.040170054800000576 -Hg2H10C8N6Cl4_11_7962.vasp,Hg2H10C8N6Cl4,-4.664796445666667,0.150557221799322 -Sn2Te4_12_16898.vasp,Sn2Te4,-1.162691615,-0.6149443761111115 -V4Ni2P4O20_14_20336.vasp,V4Ni2P4O20,-4.955832272666667,0.24810037633332271 -V2Cu2S8_51_20051.vasp,V2Cu2S8,-2.5313019391666667,0.3094572888888867 -Ho2Te6_51_8152.vasp,Ho2Te6,-2.037547915,-0.3884575575000002 -Zn2H8S2N4_4_21104.vasp,Zn2H8S2N4,-3.724460691875,-3.140337165125002 -Rb1Sn1Se2_156_14754.vasp,RbSnSe2,-1.40483495,0.2726460506250003 -Ta2O2F2_59_17808.vasp,Ta2O2F2,-5.968846968333334,0.4025885553333264 -Zn2H2_13_21097.vasp,Zn2H2,-0.4403595375,0.7741465300000001 -Li2V2Ag4O12_4_10108.vasp,Li2V2Ag4O12,-3.3079800560000003,0.2578247273333263 -Sn2P2S6Cl2_7_16819.vasp,Sn2P2S6Cl2,-2.5829854241666665,0.07285640374999858 -Rb2Cd4Se2Br6O6_31_14815.vasp,Rb2Cd4Se2Br6O6,-1.534458269,0.163397061625 -Ag2H4I2N6_2_281.vasp,Ag2H4I2N6,-3.4470632307142854,-0.05724940660714406 -Cr2Cu2Sb4Se12_13_4373.vasp,Cr2Cu2Sb4Se12,-1.944242492,0.23849892259999986 -Cs2Cd4Te2Br6O6_31_4699.vasp,Cs2Cd4Te2Br6O6,-1.4521888085,0.28327964162499936 -Sn2As2S6Cl2_7_16725.vasp,Sn2As2S6Cl2,-2.248360674166667,0.4842013689062442 -Te4W1Au2_111_18631.vasp,Te4WAu2,-1.2354026299999998,0.31448886214285554 -Sb2S2_2_15683.vasp,Sb2S2,-2.428306315,0.2889491304166645 -Hg2Te2S8F4_7_8033.vasp,Hg2Te2S8F4,-1.496467336875,0.3220126663932291 -Zn2N1Cl2_115_21123.vasp,Zn2NCl2,-1.032519666,0.25683010774999593 -Sr2H12C8O14_2_17229.vasp,Sr2H12C8O14,-5.2115921697222225,0.206697924027764 -Fe1Sb1O3_1_5748.vasp,FeSbO3,-3.541169612,0.648987033 -Nb2Co2Te10_51_12693.vasp,Nb2Co2Te10,-2.2933128307142856,0.0776924219642805 -Mg2Al2S5_164_10418.vasp,Mg2Al2S5,-3.333166188888889,-0.10646551611111094 -Mo4S2N3F2_164_11758.vasp,Mo4S2N3F2,-4.01121174,0.5544262739393848 -Os2Se2_164_13886.vasp,Os2Se2,-3.40583539,0.7247425325000001 -Mg3Ti3_156_10570.vasp,Mg3Ti3,-2.7993459900000004,0.5993054358333332 -Te4As2Pb1_164_18560.vasp,Te4As2Pb,-1.8619036257142858,-0.3696403821428577 -Na2H10Ru2C2O2_6_12092.vasp,Na2H10Ru2C2O2,-3.7942566116666665,0.4047022727777743 -Ag2Sb4Te3Cl2_6_419.vasp,Ag2Sb4Te3Cl2,-1.0773805054545453,0.29933693181818033 -Na2Ti2N2F2_59_12328.vasp,Na2Ti2N2F2,-5.12621744625,-0.08943739374999993 -Rb2Hg4I6O8_31_14866.vasp,Rb2Hg4I6O8,-0.8409452475,0.559844145000001 -Mn2H4Se2S8_7_11104.vasp,Mn2H4Se2S8,-2.745458608125,0.3425435472135417 -Sn2As1O6_162_16710.vasp,Sn2AsO6,-4.091958313333333,0.29592227847221864 -Tl2Mo4Cl14O4_2_19454.vasp,Tl2Mo4Cl14O4,-2.2607593941666666,0.13581715791666427 -Mn1Au1Se1S1Br2_1_10642.vasp,MnAuSeSBr2,-1.0762308133333334,0.22679044197916481 -Mn1Rh1S2Br2_25_10848.vasp,MnRhS2Br2,-2.0934121766666665,0.13830547041666397 -Cd2Au2S2I2_26_3460.vasp,Cd2Au2S2I2,0.0092187175,0.10842888802083334 -Cu1Ag1Br2N2_1_4815.vasp,CuAgBr2N2,-1.2385397683333335,0.7005948291666639 -Pt4Cl8_14_14700.vasp,Pt4Cl8,-1.0098667175,0.1081733441666668 -Sn4S4O16_2_16959.vasp,Sn4S4O16,-4.216676615833333,0.055145771432288535 -P2Cl6_26_13969.vasp,P2Cl6,-1.72073294125,0.07053195124999845 -Sc4Cl6_12_16236.vasp,Sc4Cl6,-2.8242803729999997,0.06557730000000017 -Hf2Br1Cl1O2_1_7442.vasp,Hf2BrClO2,-5.320986358333333,0.2863480805208307 -Ta4Ge2Se8_55_18046.vasp,Ta4Ge2Se8,-4.344115041428571,-0.009336402142858802 -Mn2Fe1O6_12_11070.vasp,Mn2FeO6,-4.027412585555556,0.19644093152776962 -Sr3Au2S4Br2_123_17352.vasp,Sr3Au2S4Br2,-1.91496115,0.04195256727272367 -Cd1Cl2_1_3303.vasp,CdCl2,-0.2325315033333333,0.17186285000000004 -P2I6_31_13988.vasp,P2I6,-0.63990302625,0.13860293874999968 -Sb2Se1I2Br2_1_15686.vasp,Sb2SeI2Br2,-1.02934804,0.19690152678571315 -Si4Sb4Se4_17_16511.vasp,Si4Sb4Se4,-2.8959622266666667,-0.07370246906250266 -Ca2V4O10_59_3138.vasp,Ca2V4O10,-5.2599203925,0.24667316687499996 -Mn2V1Cl2O4_8_11334.vasp,Mn2VCl2O4,-3.9244980655555555,0.062063171805551764 -Sb12S12_7_15418.vasp,Sb12S12,-2.3968465758333335,0.3204088695833309 -Al2F2_59_820.vasp,Al2F2,-2.75174218,0.7193710016666635 -Cu2B2S2F2_31_5031.vasp,Cu2B2S2F2,-2.18723169125,1.1767507304166602 -Al2Cd1S4_164_785.vasp,Al2CdS4,-2.7716966285714286,0.15528735000000005 -Na1Al1P2Se6_5_11814.vasp,NaAlP2Se6,-2.661265256,0.03405030421875033 -Cd1Sn2Cl2O2_12_3428.vasp,CdSn2Cl2O2,-2.2156171185714286,0.09292067999999842 -Ta4Te8Pd4_53_18134.vasp,Ta4Te8Pd4,-3.04314026,0.12934455083333074 -Pb2I6_1_14255.vasp,Pb2I6,-0.22755353875,0.21750804380208338 -V1As2Au1Se6_5_19768.vasp,VAs2AuSe6,-2.133208967,0.24900871199999786 -Tl8S4_13_19651.vasp,Tl8S4,-1.1237100133333333,0.1314266283333334 -Sb2Pb2O6_7_15642.vasp,Sb2Pb2O6,-3.615882516,0.3854011228750003 -Al2In2S6_31_890.vasp,Al2In2S6,-3.004987391,0.11877135766666669 -Nb1Cl2_187_12489.vasp,NbCl2,-3.1420621533333333,0.3153630673809474 -Mn1Bi2Se4_164_10653.vasp,MnBi2Se4,-2.075052857142857,0.0359234203571418 -Au1C12O2F4_6_1415.vasp,AuC12O2F4,-5.217260808421052,0.9837847563157859 -Nb1V1Mo1Br2O3_1_12611.vasp,NbVMoBr2O3,-4.384505955,0.15207009328125043 -Ir2S2F2_11_8817.vasp,Ir2S2F2,-2.887978506666667,0.2886830751851832 -Ba2Bi2Br2O4_51_1918.vasp,Ba2Bi2Br2O4,-3.3853690999999997,0.12039628500000044 -In4S6_1_8686.vasp,In4S6,-2.375795895,0.14884448799999994 -Rb2N6O6F6_1_14902.vasp,Rb2N6O6F6,-3.3727197070000003,0.18396466974999598 -Cs2Cd4S8Cl6_31_4690.vasp,Cs2Cd4S8Cl6,-1.041313782,0.34059841106249944 -Cr1Ge1Te2_1_4181.vasp,CrGeTe2,-2.1351708925,-0.28250340339285923 -Sn1I2_164_16650.vasp,SnI2,-0.6312718333333334,0.08429825777777777 -Pt4Se1Br1O2_6_14707.vasp,Pt4SeBrO2,-1.96964868,0.5029495890625001 -Si6P2_11_16536.vasp,Si6P2,-3.42691594,0.2664294145833328 -Sc1Sn1Cl4O1_6_16004.vasp,ScSnCl4O,-2.6278186542857145,0.3081935035714252 -Nb1Te1Mo1Se1Br2_6_12593.vasp,NbTeMoSeBr2,-2.7420063,0.06936455043649734 -Mg2Bi2P2O12_11_10430.vasp,Mg2Bi2P2O12,-4.437515646666666,0.38047306252314006 -Hf1I2O1_156_7198.vasp,HfI2O,-3.765337015,0.28792898875000006 -Ti2Ga1S1Br1Cl3_1_18939.vasp,Ti2GaSBrCl3,-3.13384013,0.13694390187500027 -Tl1Pd5Br2_123_19318.vasp,TlPd5Br2,-0.6535692025,0.458930455625 -Zn2Bi4S6Cl4_31_21048.vasp,Zn2Bi4S6Cl4,-1.606316941875,0.21280370987500008 -Cd2Ag2Se2Cl2_26_3446.vasp,Cd2Ag2Se2Cl2,-0.13750900875,0.0051276724999999995 -Zn1Se1_156_21010.vasp,ZnSe,-0.301579355,0.39842399875 -Hf2Mo1Se4Cl4_3_7533.vasp,Hf2MoSe4Cl4,-3.283654787272727,0.27504410159090253 -Al2S5_1_952.vasp,Al2S5,-3.2528515357142855,0.16603966392856928 -Bi6C6_12_2666.vasp,Bi6C6,-3.68052309,0.6110736125000003 -Mo2O2_129_11644.vasp,Mo2O2,-3.8718112625,1.45442674875 -Be1Sb2H4S4_5_2231.vasp,BeSb2H4S4,-2.804706163636364,0.21054256712120617 -Br5N1_3_2711.vasp,Br5N,-0.5225881733333334,0.3943160220833297 -Rb4I2_51_14976.vasp,Rb4I2,0.13324576166666666,0.1431199216666666 -In1Pd1Cl2O2_6_8305.vasp,InPdCl2O2,-2.2623860116666665,0.1379181586805518 -Fe1B4C2Br2F4_47_5622.vasp,FeB4C2Br2F4,-3.831359236153846,0.3474338735256297 -Rh2Br6_150_15176.vasp,Rh2Br6,-0.9922170875,0.07069189249999996 -Sr4Mn2S6Cl2_129_17449.vasp,Sr4Mn2S6Cl2,-2.8503160871428572,0.029729721428569 -Ni2Se6_11_13650.vasp,Ni2Se6,-1.3625113,0.3273024733333333 -Sr2H8S4Cl4_30_17248.vasp,Sr2H8S4Cl4,-2.8891796666666667,0.06530139166666382 -Mn2Sb4_8_11265.vasp,Mn2Sb4,-1.896291305,0.16900711833333137 -Zn8S2O20_147_21239.vasp,Zn8S2O20,-2.4592784893333337,0.59284597541666 -B4Cl4_57_1750.vasp,B4Cl4,-1.97099700625,1.7781183631944413 -Na2Mg1H4S8O2_2_12190.vasp,Na2MgH4S8O2,-2.8602523717647057,0.361903706249997 -Sb2I6_189_15592.vasp,Sb2I6,-0.4303633675,0.16334846500000005 -Sr2H8S4Br4_53_17247.vasp,Sr2H8S4Br4,-2.7318025961111108,0.03716704444444252 -Sb2I2_12_15590.vasp,Sb2I2,-0.910897215,0.24609969749999905 -Tb2H12C8O12F2_12_18197.vasp,Tb2H12C8O12F2,-5.367235756388889,0.11698088236110382 -Sn4O10_30_16945.vasp,Sn4O10,-3.673373385,0.5444094101785684 -Rb2Ru2S2N2F10_11_14931.vasp,Rb2Ru2S2N2F10,-2.848059199444444,-0.01126850615080044 -Y1F2_187_20631.vasp,YF2,-4.444461446666667,0.6492287605555502 -Ti4B3H2S2_164_19120.vasp,Ti4B3H2S2,-5.4335849218181815,0.20686749454544562 -Mn2Nb1Mo1S2Br2_6_11159.vasp,Mn2NbMoS2Br2,-2.80952750625,0.4752002954166618 -Cd2I4O12_4_3523.vasp,Cd2I4O12,-2.3476567166666666,0.097090606388889 -Cu2Se4F2_4_5309.vasp,Cu2Se4F2,-1.34464390875,0.10488231749999999 -Li1Cu1Cl2O2_1_9685.vasp,LiCuCl2O2,-1.991033775,0.1749090986217887 -Na2C4S2_31_12009.vasp,Na2C4S2,-4.1514726725,1.0910999075000003 -Mo4O10_59_11753.vasp,Mo4O10,-5.052521152142857,0.17897983452380561 -V2Te2H2O7_2_20206.vasp,V2Te2H2O7,-4.076384363076923,0.3434959431890999 -Nb2N2Cl2_59_12769.vasp,Nb2N2Cl2,-5.640456156666667,0.062271969766657165 -Os2S2_129_13869.vasp,Os2S2,-3.91013611,0.7855639968750001 -Cu2H12Se4O16_14_5110.vasp,Cu2H12Se4O16,-3.6965166108823526,0.10435799102940857 -Li2Au1_187_9829.vasp,Li2Au,-0.8366796,0.29131267875 -Ti2Nb4Zn4O16_2_18970.vasp,Ti2Nb4Zn4O16,-5.435931965384616,0.16153940230768724 -K2Mg1H4S2O8_2_9216.vasp,K2MgH4S2O8,-4.043507791176471,0.10355904124998837 -Pt2I2N2_59_14627.vasp,Pt2I2N2,-2.1810993916666668,0.48312826499999617 -Sc4H2N3_164_16243.vasp,Sc4H2N3,-5.585775983333333,-0.24822076333333776 -Ca2S6N2F2_59_3111.vasp,Ca2S6N2F2,-3.1485190149999998,0.31643876098957624 -Fe2C2Br2_59_5830.vasp,Fe2C2Br2,-2.355151906666667,1.1411563508333293 -Pd2Cl4O12_14_14414.vasp,Pd2Cl4O12,-2.2422503755555554,0.28768084342592415 -Ti1I1Br1O1_156_18791.vasp,TiIBrO,-3.6946014575,0.25367512124999836 -Ga2Te4_12_6517.vasp,Ga2Te4,-1.4772928383333335,0.35317895133333144 -Nd1Pb2_123_13223.vasp,NdPb2,-1.4220841566666669,-0.006816454166668429 -Cd2S1I1Br1_1_3539.vasp,Cd2SIBr,-0.073825286,0.06205273091666666 -Co2S2Br2_59_3976.vasp,Co2S2Br2,-1.9897722133333333,0.044684469999999754 -P2W2Se6_2_14061.vasp,P2W2Se6,-3.2755656010000003,-0.013115181125002984 -Zr4B3H2O2_164_21802.vasp,Zr4B3H2O2,-5.375504888181818,0.34791543212120135 -Cu1C12S2F4_6_4865.vasp,CuC12S2F4,-4.91934393,0.9332489127741155 -Na1Ni1Te6P2_149_11921.vasp,NaNiTe6P2,-1.59611908,0.4118511474999987 -Ge1Bi2Se2I4_1_6649.vasp,GeBi2Se2I4,-1.2420705555555556,0.08333499999999883 -Sn2Bi6_164_16738.vasp,Sn2Bi6,-0.94623222,-1.247937095 -Cu2H12Br2N4_13_5103.vasp,Cu2H12Br2N4,-3.6907574215,0.15207920324999213 -Sn8Pt2_125_17007.vasp,Sn8Pt2,-1.450244275,0.5131285250000002 -Co2P2S6_162_3963.vasp,Co2P2S6,-3.02941936,0.25733954524999825 -Ga1Ag1Sb2Se6_149_6123.vasp,GaAgSb2Se6,-1.737660682,0.3309475043333311 -Cu2P4H8O8_51_5216.vasp,Cu2P4H8O8,-3.9619864122727275,0.22397045484848377 -Ni2Sn8_125_13651.vasp,Ni2Sn8,-0.790783028,-1.787069435333333 -Nb1Cu2H8C8N4F6_47_12503.vasp,NbCu2H8C8N4F6,-4.982965629310344,0.3294822566551559 -Nb1O2_164_12552.vasp,NbO2,-6.606493466666667,0.37901673958333415 -Si2S2I2_59_16434.vasp,Si2S2I2,-2.3529935366666668,0.2425282693055535 -Zr2Se2Cl2_59_21673.vasp,Zr2Se2Cl2,-3.5977030383333335,0.04893376999999699 -Cu2S1I1Br1_1_5238.vasp,Cu2SIBr,-0.40082919199999995,0.1583107935714273 -Bi4B4S12_14_2599.vasp,Bi4B4S12,-3.3158499045,-0.37230927324999963 -Pt2S2O6_12_14658.vasp,Pt2S2O6,-3.598264883,0.3714296939999963 -Sb1Cl1O1_156_15444.vasp,SbClO,-2.582780516666667,0.5485261055555553 -Ca1Ag2F12_115_2796.vasp,CaAg2F12,-1.0382448953333332,0.05708223499999981 -Ti2F2_129_18931.vasp,Ti2F2,-4.40618058,0.6103021016666625 -Nb2Sb2Te6_2_12862.vasp,Nb2Sb2Te6,-2.5152380610000002,0.30115716654166136 -U2Te6_59_19734.vasp,U2Te6,-3.4667553775,0.09494587624999973 -Zr2Se2_123_21681.vasp,Zr2Se2,-3.72550779,0.16629254500000012 -Ta3S1F7_156_17983.vasp,Ta3SF7,-4.677437147272728,0.1922617344999949 -P4S6_7_14116.vasp,P4S6,-3.2190406699999996,0.16620952140624778 -Ir2Se2F2_11_8838.vasp,Ir2Se2F2,-2.5582229266666667,0.2339965344791639 -Ta2As2O6_12_17646.vasp,Ta2As2O6,-5.988395013,0.39494000307406885 -Ni2Te2F2_59_13660.vasp,Ni2Te2F2,-0.9784331866666666,0.24038425499999833 -Pt2O2_10_14644.vasp,Pt2O2,-2.6072719525,0.505564149375 -Mn2Mo2S8Br2_129_11144.vasp,Mn2Mo2S8Br2,-2.4431575164285713,0.5399151631249947 -Co1H4C4N2Cl2_47_3755.vasp,CoH4C4N2Cl2,-4.9075859607692305,0.1419348751922927 -V2Se2_187_20188.vasp,V2Se2,-2.9692969575,0.4773554037499963 -Bi6C6_2_2665.vasp,Bi6C6,-3.6805128208333335,0.6110838816666666 -Na2Mn1H4S2O10_2_12208.vasp,Na2MnH4S2O10,-4.2775509294736835,0.04656105067250693 -Hf3H2N2_187_7709.vasp,Hf3H2N2,-6.425126527142857,0.24434925357142312 -Cu2Sb2Se4_26_5269.vasp,Cu2Sb2Se4,-1.50630985,0.17010406749999984 -Rb2Sb2Br2F6_2_14939.vasp,Rb2Sb2Br2F6,-2.2589382258333335,0.09721158583333311 -V4H2N3O2_164_20328.vasp,V4H2N3O2,-5.484290752727272,0.047422433484838655 -Ag2W1S4_8_491.vasp,Ag2WS4,-2.3577492500000004,0.13180611133928055 -Cs2Hg4S2I6O6_31_4730.vasp,Cs2Hg4S2I6O6,-1.4125158545,0.053177799333334 -P1S1Cl1_156_13940.vasp,PSCl,-2.2388773533333333,0.4379349274479143 -Mn2Al2S5_156_10954.vasp,Mn2Al2S5,-3.3085738155555555,-0.03829441166666636 -Ti6H4O14_6_19178.vasp,Ti6H4O14,-6.4109008662499996,0.11354283048611169 -Tb2Se2I2_59_18208.vasp,Tb2Se2I2,-2.8664538333333334,0.045319103333333555 -In2Fe2Se5_187_8437.vasp,In2Fe2Se5,-1.9930481255555554,-0.27580607222222375 -Zr1Te2_115_21464.vasp,ZrTe2,-2.615693176666667,0.5942733399999995 -B1As1_187_1617.vasp,BAs,-4.131948345,0.6549143662499965 -Li2Mg2P2O8_11_9980.vasp,Li2Mg2P2O8,-5.1895743578571425,0.1869673460714294 -Sb4_11_15842.vasp,Sb4,-2.0197014075,0.26386566499999997 -Ti2Ge2Te12_2_18942.vasp,Ti2Ge2Te12,-2.37153181625,0.10655265375000011 -Na4Li1N2_191_12397.vasp,Na4LiN2,-1.9350355114285716,0.5882583702380892 -Al2F6_26_824.vasp,Al2F6,-3.8231846775,0.17149466249999978 -Ba1W1S1Br1_25_1878.vasp,BaWSBr,-2.02411646,1.809233371835937 -Zr2Cl8_1_21556.vasp,Zr2Cl8,-2.7480905140000003,0.07144387199999969 -Rb2Bi2O4_13_14778.vasp,Rb2Bi2O4,-2.96683319,0.1512907124999998 -Na4Cd2Cl8_11_12377.vasp,Na4Cd2Cl8,-1.1629611507142859,0.19717218404761838 -Te4Pt3_10_18621.vasp,Te4Pt3,-1.3825941685714285,0.48601908714285713 -Si1Te2_187_16378.vasp,SiTe2,-1.9531454966666668,0.4177220616666666 -V3B2S2_187_20245.vasp,V3B2S2,-4.621308447142857,-0.18500473035714227 -Hg2Te4O12_2_8037.vasp,Hg2Te4O12,-2.8788136533333333,0.1626525026388861 -Ga1Cu1Sb2O6_5_6172.vasp,GaCuSb2O6,-3.76397313,0.413280613624994 -Na2Ta2Br12_4_12309.vasp,Na2Ta2Br12,-1.9963978425,-0.12115877874999992 -Pb2Se2_59_14295.vasp,Pb2Se2,-1.7391003575,0.2108637859375 -Ta2Te6Pd4_11_17922.vasp,Ta2Te6Pd4,-2.50544135,0.06343347562499879 -Ru2I2N2_59_15320.vasp,Ru2I2N2,-3.1008774233333334,-0.05398105583333612 -Re2Te2_187_15088.vasp,Re2Te2,-3.741933805,0.8233146725000002 -Ca3Sb3_25_3199.vasp,Ca3Sb3,-1.0674475350000001,1.0400471574999999 -Cu2P1Se1S1I2_1_5206.vasp,Cu2PSeSI2,-1.0151621614285715,0.2303167619399314 -Mn2Sb2Se4Cl2_10_11248.vasp,Mn2Sb2Se4Cl2,-2.0492996999999997,0.11705923449999811 -Hf4O4F4_31_7799.vasp,Hf4O4F4,-6.0192688641666665,0.4163875902272608 -Th1Pb2_123_18720.vasp,ThPb2,-1.91194411,0.10036076833333296 -Li2Cu2F8_1_9887.vasp,Li2Cu2F8,-1.8237714049999998,0.20807187750000034 -Li2Os1_187_10035.vasp,Li2Os,-2.4741523500000002,0.49038877111110835 -Nb2V2I1Br1N3O2_8_12935.vasp,Nb2V2IBrN3O2,-5.415451611818182,0.2076180961363523 -Cu2Se4Br2_17_5307.vasp,Cu2Se4Br2,-0.980394115,0.10433978062500016 -Si12Rh4_127_16314.vasp,Si12Rh4,-3.698439215625,0.005582401458330111 -Tl4Bi4_127_19592.vasp,Tl4Bi4,0.14416302625,0.6664788799999999 -Ga1As2Au1Se6_149_6137.vasp,GaAs2AuSe6,-1.889969889,0.25116459641666433 -Yb2F6_1_20872.vasp,Yb2F6,-4.43765504375,-1.4256116553125002 -Ni1Se1_156_13421.vasp,NiSe,-0.320467315,0.47570028999999947 -Tl2Br2_2_19380.vasp,Tl2Br2,-0.64068997,-0.06397772000000002 -Te2Pb1_164_18448.vasp,Te2Pb,-0.9891898566666667,-0.5057727211111116 -Ag1H2_187_71.vasp,AgH2,-1.31748815,1.6585607183333309 -Ga2Si2Te6_162_6493.vasp,Ga2Si2Te6,-2.0558120079999997,0.06743378121428134 -Mn2Ni1I1Br1O3_1_11169.vasp,Mn2NiIBrO3,-2.61536612875,-0.099363081458336 -Ta1F2_164_17540.vasp,TaF2,-4.50833334,0.7628074573333294 -Ni1Se1I1_8_13420.vasp,NiSeI,-0.28915668,0.25358084833333333 -Ni1C8Cl2F4_25_13306.vasp,NiC8Cl2F4,-4.444329714,0.5103206946666605 -Re2Cl2_12_15038.vasp,Re2Cl2,-3.9306652075,0.4613266230555517 -Al2Ga2O6_31_843.vasp,Al2Ga2O6,-5.20704963,-0.11124006237500383 -Os1Se2_164_13825.vasp,OsSe2,-2.950000746666667,0.5946205133333331 -Sc2I6_189_16099.vasp,Sc2I6,-1.43932357,0.1781939612500001 -La2Bi7O14_1_9579.vasp,La2Bi7O14,-4.267858927391305,0.14524852103260322 -Li2Nb2Br12_4_10011.vasp,Li2Nb2Br12,-1.93041636,-0.022150108124999734 -Sn2P2H10C12O6_7_16808.vasp,Sn2P2H10C12O6,-5.592695469375,0.11685580256248551 -Cu2As2Se6_162_5014.vasp,Cu2As2Se6,-1.623897852,0.27854254744444246 -La2P6H16O14_2_9605.vasp,La2P6H16O14,-4.7660308373684215,0.06858646078946407 -Os4S8_13_13894.vasp,Os4S8,-3.4512228966666663,0.8468946091666667 -Na2Hg4Br6O8_31_12150.vasp,Na2Hg4Br6O8,-1.1214904755,0.2536444002708306 -Au4I8_13_1574.vasp,Au4I8,0.5968528391666666,0.12373435041666708 -Cr2Te2Cl2_59_4519.vasp,Cr2Te2Cl2,-1.80545225,0.059085873888887086 -Hf4Cl4O4_7_7779.vasp,Hf4Cl4O4,-5.320972379166666,0.41036487708333036 -Mn1Pb2C6N6_164_10841.vasp,MnPb2C6N6,-5.9040770186666665,0.28495293516666165 -Au1Br2_164_1412.vasp,AuBr2,0.4178291166666666,0.23559942875000012 -Tb2S2I2_59_18206.vasp,Tb2S2I2,-3.2463720533333333,0.04868139166666685 -Ti2Cl8_1_18928.vasp,Ti2Cl8,-2.812349257,0.007427850999999652 -Ag4Se4O12_14_565.vasp,Ag4Se4O12,-2.614174783,0.13920832224999802 -Tl1Au1Se2Br2_1_19223.vasp,TlAuSe2Br2,-0.50773053,0.3683502706249995 -Rb4Si8H72C24N4_14_14981.vasp,Rb4Si8H72C24N4,-4.634954556517857,-0.027680413253522884 -Bi1Sb1S1Cl3_1_2379.vasp,BiSbSCl3,-1.6028245566666666,0.2513973083333295 -Ba2Cl4O8_125_1949.vasp,Ba2Cl4O8,-2.7354661914285714,0.3050097232142832 -Tm2I2O2_129_19681.vasp,Tm2I2O2,-4.465909651666666,0.025354432500000357 -Nb2Ni4Se6_11_12787.vasp,Nb2Ni4Se6,-2.2930300291666668,0.08033936499999994 -Te2Au2_59_18374.vasp,Te2Au2,-0.1451392575,0.28349739 -Cr1As2Au1S6_1_4112.vasp,CrAs2AuS6,-2.43763531,0.56355382925 -Hf4C3S2_164_7777.vasp,Hf4C3S2,-7.040223956666667,0.02572329555554842 -Sr4N2_59_17452.vasp,Sr4N2,-2.3853963366666666,0.21884033333333353 -La5Cl8_10_9630.vasp,La5Cl8,-2.8550631515384617,0.20108373261538226 -V1H2S2_164_19850.vasp,VH2S2,-3.290893306,0.6341557052499953 -Y1Ni1F5_47_20657.vasp,YNiF5,-2.862713635714286,0.6558459542857111 -Ni2S2_164_13590.vasp,Ni2S2,-0.94517742,0.4832836033333317 -Hg2As2Se6_147_7925.vasp,Hg2As2Se6,-1.237639523,-0.02063006616666882 -La1H1Br2_187_9567.vasp,LaHBr2,-3.00512951,0.056875277499999655 -Mn2Mo2S8F2_129_11146.vasp,Mn2Mo2S8F2,-2.949452487857143,0.36076527794642266 -Hf1Ga1I1N2Cl1_156_7166.vasp,HfGaIN2Cl,-4.235939503333333,0.4395342852777735 -Pt2Se2_129_14681.vasp,Pt2Se2,-1.5310198975,0.6442811549999999 -Zn1Pd1S1O2_156_20992.vasp,ZnPdSO2,-2.2757263859999997,0.4354657496111067 -Nb3Se6_2_13017.vasp,Nb3Se6,-4.138824501111111,0.11704450638888897 -S8Br8_2_15403.vasp,S8Br8,-1.21807839625,0.31689773062500004 -Hf1Ag1I1Br1O1_1_7101.vasp,HfAgIBrO,-2.780412418,0.5068397802500005 -Ni1O2_115_13384.vasp,NiO2,-2.1848893766666664,0.15139778541666504 -Te4Au2Cl2_25_18567.vasp,Te4Au2Cl2,-0.31676027,0.39784670250000004 -Al2Se2O8F2_11_967.vasp,Al2Se2O8F2,-3.8837203600000003,0.40202474874999644 -Rh1Se2_187_15171.vasp,RhSe2,-2.12429384,0.5493766666666664 -Fe2Br2_164_5820.vasp,Fe2Br2,-0.54938753,0.63691215125 -Ni2As2Se5_8_13451.vasp,Ni2As2Se5,-1.684902498888889,0.3074944587777755 -Rh1S1O1_156_15164.vasp,RhSO,-3.0610320633333337,0.5058811588103834 -Cd2P2Se6_147_3528.vasp,Cd2P2Se6,-1.732912313,0.04944457099999999 -Ti2B1Cl2_164_18883.vasp,Ti2BCl2,-4.96012543,-0.1384509190000056 -Zn2S4_14_21145.vasp,Zn2S4,-1.2297902083333334,0.4372781211249984 -Sb2Br6_31_15557.vasp,Sb2Br6,-1.02045535125,0.07838327 -Cs2H6C2S2O6_4_4715.vasp,Cs2H6C2S2O6,-4.2593097138888885,0.11786620093749667 -Ag4H4S4Cl4_2_521.vasp,Ag4H4S4Cl4,-1.4583907075,0.08502634992187486 -Sb1Te6As2Au1_143_15520.vasp,SbTe6As2Au,-1.398049917,0.10589374104166416 -Cu1Ge2Br1O6_8_4887.vasp,CuGe2BrO6,-3.5174283209999997,0.16071962774999604 -Sr4Cr2Cu4O14_26_17420.vasp,Sr4Cr2Cu4O14,-3.639357435833333,0.3659929129166646 -Fe3As2O16_2_6040.vasp,Fe3As2O16,-3.6395622142857142,0.18688954124999713 -Mo2As2Se6_12_11563.vasp,Mo2As2Se6,-2.63008912,0.279912789666664 -Ca2Au1Br2O2_38_2927.vasp,Ca2AuBr2O2,-2.317862107142857,0.32552337404761433 -Na2Nb2Cl12_4_12225.vasp,Na2Nb2Cl12,-2.340875799375,0.04998865093749982 -Zr1Nb2Br2N2_1_21367.vasp,ZrNb2Br2N2,-5.445114471428572,0.24128225960316185 -Ca4Mn2S6Br2_129_3224.vasp,Ca4Mn2S6Br2,-2.6854371992857144,0.07612120571428305 -Au1O2_115_1434.vasp,AuO2,-0.9397376733333332,1.1362500118749974 -Cr1Ni1S4_6_4218.vasp,CrNiS4,-2.4618094916666666,0.19180240687499817 -Al2Bi2_129_768.vasp,Al2Bi2,-1.69818211,-0.25275768000000015 -Ca1Cu2O8_89_2828.vasp,CaCu2O8,-2.934789278181818,0.2565800509090881 -Cr1As2_187_4115.vasp,CrAs2,-3.0076272233333334,0.33300085916666333 -Dy2B2C2_10_5515.vasp,Dy2B2C2,-5.489703938333334,0.5063122220833267 -V1F4_123_19827.vasp,VF4,-3.2921321839999997,-0.011782734999999711 -Sc1Ag1Sb2O6_149_15891.vasp,ScAgSb2O6,-3.7611296000000003,0.7472257846250003 -Cs1F2_115_4638.vasp,CsF2,-0.9944070133333334,0.43467762666666676 -Co2P2Pt2_129_3961.vasp,Co2P2Pt2,-2.569358765,0.405551370104164 -Cr2N2_12_4428.vasp,Cr2N2,-5.1763099925,0.11501127749999984 -Sn2N2F2_59_16790.vasp,Sn2N2F2,-3.5492196816666666,-0.7960671537499996 -Sb2Pb1Se4_164_15636.vasp,Sb2PbSe4,-2.2138064500000003,0.029483183839283722 -Nb2S2_123_12848.vasp,Nb2S2,-4.8799670675,0.2316141359999948 -Ba4P4S8F4_14_2171.vasp,Ba4P4S8F4,-3.5258132275,0.11344128817968435 -Mg5Sc1_8_10594.vasp,Mg5Sc,-0.18526528166666667,-0.06705490111111118 -Ce1Ge2_123_3644.vasp,CeGe2,-2.802308066666667,0.7430310272222185 -Cd4Mo2S8_13_3634.vasp,Cd4Mo2S8,-1.487968142857143,0.5497476714285692 -Mo2O6_11_11650.vasp,Mo2O6,-5.127874585,-0.00015122624999985845 -Cd2Te4_12_3599.vasp,Cd2Te4,0.011940091666666666,-0.043715159444444374 -Sr4Sb4Se8Cl4_14_17470.vasp,Sr4Sb4Se8Cl4,-2.389570947,0.017216694499995078 -Tl4S4I4_14_19621.vasp,Tl4S4I4,-0.8045592516666668,0.3602108864583323 -Ta4Te10Pd6_31_18120.vasp,Ta4Te10Pd6,-2.7612104405,0.08513467899999982 -Zr2I2_164_21592.vasp,Zr2I2,-2.37979672,0.15225329750000038 -Cd1Pd2S1I2_1_3404.vasp,CdPd2SI2,-0.4097365783333333,0.16945290305555394 -Nb2Te2O2_67_12910.vasp,Nb2Te2O2,-4.8256933533333335,0.36152193034722235 -Ta4Ni4S8_53_18068.vasp,Ta4Ni4S8,-3.748099105,0.13095890899999874 -In1Sn1Cl2O2_8_8356.vasp,InSnCl2O2,-2.7449557516666663,0.1877169408333339 -Mg1Cu3H6Cl2O6_164_10356.vasp,MgCu3H6Cl2O6,-3.121522507222222,0.16845722106480907 -Ta6In4Cl18_12_18146.vasp,Ta6In4Cl18,-2.98069767,0.07253566000000022 -Hf1Zr1Se1I4Br1_1_7399.vasp,HfZrSeI4Br,-2.24048397625,0.20581664921874998 -Li4N4_111_10206.vasp,Li4N4,-4.09362192125,0.52091296625 -Zr2C2Br2_164_21538.vasp,Zr2C2Br2,-4.594988093333334,0.5446652933333263 -Bi1O1F1_156_2347.vasp,BiOF,-3.0504729299999997,0.21086285666666704 -Fe1Bi2Se4_164_5633.vasp,FeBi2Se4,-1.995396627142857,-0.09768929357142964 -Mn2Bi2Cl2O4_26_11001.vasp,Mn2Bi2Cl2O4,-3.137543249,0.21749901909195068 -Nb4Pd4Se8_53_13127.vasp,Nb4Pd4Se8,-3.232756045625,0.19034604690788948 -Hf2V1S1I3Cl1_1_7661.vasp,Hf2VSI3Cl,-2.808938385,0.4977697125781253 -V2Mo2Se8_25_20108.vasp,V2Mo2Se8,-3.0283829683333336,0.06762550249999966 -Eu2I2F2_129_5602.vasp,Eu2I2F2,-2.842081925,0.05451740833333307 -Nb3B2F2_187_12944.vasp,Nb3B2F2,-5.68307973,0.3041738537142751 -Si2Cl2_164_16397.vasp,Si2Cl2,-2.8410201975,-0.3449864562499998 -Mn2Bi2_51_11027.vasp,Mn2Bi2,-0.6764774975,0.5857383013793105 -Ga2Sb6_164_6462.vasp,Ga2Sb6,-1.7493499925,-0.043032078750000036 -Sr4P4Se8F4_14_17463.vasp,Sr4P4Se8F4,-3.0893546545,0.08592490993750035 -Ge3Mo1_191_6910.vasp,Ge3Mo,-2.2729700075,0.8930854537499999 -K2Ag2Ge1Se4_21_8966.vasp,K2Ag2GeSe4,-1.2475620733333335,0.16717253666666654 -Mo4O12_7_11754.vasp,Mo4O12,-4.70996616375,0.4177571950000001 -In2Hg1Se4_164_8471.vasp,In2HgSe4,-1.3246596128571428,0.12143373428571436 -B2S5_12_1704.vasp,B2S5,-3.749563645714286,0.1653029866071407 -Al4Se4Cl4_14_1094.vasp,Al4Se4Cl4,-2.6419436258333335,0.050030929166666294 -Cu4S4Br4F4_14_5449.vasp,Cu4S4Br4F4,-0.997683423125,0.23373442799631977 -Rb4F2_51_14969.vasp,Rb4F2,-0.7715809883333334,-0.22857641166666715 -Nb4Pd2Se10_13_13124.vasp,Nb4Pd2Se10,-3.511441473125,0.12130874367598121 -Ru1Se2_164_15295.vasp,RuSe2,-2.56868096,0.6259195000000002 -P2Pb1S4_164_14002.vasp,P2PbS4,-2.8632651399999998,0.3314880102566903 -Ni3As6_147_13694.vasp,Ni3As6,-1.840876281111111,0.2940893047222226 -Ga2Co1S4_164_6326.vasp,Ga2CoS4,-2.82403733,0.04547096386904537 -Ti1Co2O6_1_18767.vasp,TiCo2O6,-4.795434317777778,-0.17316537861111592 -Hf4H2N3_164_7786.vasp,Hf4H2N3,-6.825128745555556,0.18031329361110426 -Hf2Zr5H1C3N1O8_1_7674.vasp,Hf2Zr5HC3NO8,-6.732882042999999,0.4931861229999941 -V2I2N2_8_20093.vasp,V2I2N2,-3.8197982533333334,0.18583008062499617 -Hf1Ti1Se2I1Br1_6_7336.vasp,HfTiSe2IBr,-3.657832503333333,-0.1077858943750023 -Pd2Se2S6_12_14491.vasp,Pd2Se2S6,-2.017340687,0.2796579184999979 -Mn2O2_6_11178.vasp,Mn2O2,-3.269124365,0.9415219978448275 -Ga2Cl6_162_6320.vasp,Ga2Cl6,-1.58631458375,0.0398682237500001 -Ta6Rh18_191_18148.vasp,Ta6Rh18,-2.705742130833333,1.744930974166667 -Ba2P2Cl1_164_2043.vasp,Ba2P2Cl,-2.024685204,1.091773394999997 -Ge2P2S6_28_6811.vasp,Ge2P2S6,-3.1119105950000003,0.18811033648436803 -Al2S2_164_943.vasp,Al2S2,-3.4423190925,0.07775585145833075 -Cs2S6Cl2_11_4780.vasp,Cs2S6Cl2,-1.790052975,0.3263929266250003 -Os2S2_67_13873.vasp,Os2S2,-3.1276013025,1.568098804375 -Ta1Bi1As1_156_17509.vasp,TaBiAs,-3.9170134,0.15280780666666313 -Cs2Te2C2S6Cl6_4_4791.vasp,Cs2Te2C2S6Cl6,-1.9317951377777776,0.5728098729398127 -Ni2I4O12_14_13525.vasp,Ni2I4O12,-2.477179741111111,-0.08490231666666892 -Hf4O8_29_7800.vasp,Hf4O8,-7.25938235,0.5281115483333334 -Si6Sb6_2_16543.vasp,Si6Sb6,-3.0770066691666664,-0.44014860791666655 -Ca2Rh1_123_3101.vasp,Ca2Rh,-0.5686757333333333,0.21401528093749944 -Cu2Se2F2_59_5299.vasp,Cu2Se2F2,-1.0677198433333335,0.21124075185185048 -Hf4Se6S2_12_7818.vasp,Hf4Se6S2,-4.785929646666667,0.12037511750000007 -W12I16Cl8_127_20405.vasp,W12I16Cl8,-2.3380225630555556,0.07693542222222227 -Zr2S2I2Br1Cl1_8_21648.vasp,Zr2S2I2BrCl,-2.79786019875,0.2544756863541662 -Cd1Cu1H4Cl4O2_2_3304.vasp,CdCuH4Cl4O2,-2.290921801666667,0.08557116847222224 -Ni1S2_164_13415.vasp,NiS2,-1.7367096266666666,0.10690096374999802 -Te2Os2_115_18431.vasp,Te2Os2,-2.9128409025,0.21067632624999977 -Al2Si2S6_162_985.vasp,Al2Si2S6,-3.723796483,0.041907998374996175 -As4Se4_14_1371.vasp,As4Se4,-2.52687075375,0.18001418541666392 -Li6Fe2H20C12O34_2_10264.vasp,Li6Fe2H20C12O34,-5.118291650135135,0.062493273490985636 -Cr3Te8W1_25_4584.vasp,Cr3Te8W,-2.12485657,0.09365252208333363 -Pb3Se2Br2_1_14306.vasp,Pb3Se2Br2,-1.5086663385714285,0.11728060482142721 -Re1O2_164_15015.vasp,ReO2,-5.836157053333333,0.4109868325000008 -Si4As8_26_16485.vasp,Si4As8,-3.5580322449999997,-1.3698803766666665 -Hf2Br4_11_7451.vasp,Hf2Br4,-2.997976216666667,0.16402386888888576 -Li2Cr2P8O26_1_9872.vasp,Li2Cr2P8O26,-5.337242482105263,0.04989589338157485 -Cu2P4S12_12_5219.vasp,Cu2P4S12,-2.5731807561111113,0.2440984824652719 -Cr1Se1I1_156_4260.vasp,CrSeI,-1.69268044,0.05069284499999993 -Sc2Se6_129_16164.vasp,Sc2Se6,-3.09352228875,0.2401203475 -Al8S12_14_1111.vasp,Al8S12,-3.5985592485,0.14073451125000025 -N4_59_11802.vasp,N4,-5.18575628,0.3479943425000007 -Na1Nb3O4_25_11909.vasp,NaNb3O4,-5.4907334225,0.6180303697916667 -Ca4Ni2Br2O6_129_3229.vasp,Ca4Ni2Br2O6,-3.3192377171428573,-0.27332561035714864 -Ag2Te2H4O10_2_457.vasp,Ag2Te2H4O10,-3.1607291516666667,0.26161546312499373 -As1Cl1O1_156_1141.vasp,AsClO,-2.8385420999999997,0.3672010300000004 -Hf1H1C1O1_156_7187.vasp,HfHCO,-6.0553500275,0.7817914410416673 -Mn2Ni1O6_162_11170.vasp,Mn2NiO6,-3.7772656188888885,-0.021963412638892177 -Pt2S2O8_49_14661.vasp,Pt2S2O8,-3.7907468466666665,0.07700568749999981 -K2Hg4Te2S6Cl6_31_9199.vasp,K2Hg4Te2S6Cl6,-0.746850768,0.23804444771874828 -Ta2Br5_1_17671.vasp,Ta2Br5,-2.4370596385714287,0.5935183901339256 -Sn2Se2_31_16884.vasp,Sn2Se2,-1.949181525,-0.37290314999999996 -Ca2Cu1I2O2_123_2995.vasp,Ca2CuI2O2,-2.4523014528571427,-0.11250220315476298 -Ba2Fe3O8_123_1985.vasp,Ba2Fe3O8,-3.6994229053846155,0.2801997307478601 -Mn1Pd1S2Br2_6_10845.vasp,MnPdS2Br2,-1.72919522,0.07104457749999993 -Sr3Co2S2O5_123_17361.vasp,Sr3Co2S2O5,-3.6867866558333335,0.1867522233333277 -Sn3Se2S2_6_16931.vasp,Sn3Se2S2,-2.0612834242857145,-0.040637895714287886 -V1Ga1S2_1_19833.vasp,VGaS2,-2.83771233,0.10403245399193306 -Nb6Sn2Se12_26_13201.vasp,Nb6Sn2Se12,-3.8325716825000002,0.12663143499999596 -V2Br2O2_59_20001.vasp,V2Br2O2,-3.8662590383333337,0.037130194999996036 -Cu1Ge1Te1Br1_8_4885.vasp,CuGeTeBr,-1.1650503075,0.05559206812499842 -Co2P2S7_6_3964.vasp,Co2P2S7,-2.6853885099999997,0.5405636583522706 -Sc3S4Br1_1_16219.vasp,Sc3S4Br,-3.844386115,0.36788168343750005 -Ga2H10C4F4_10_6370.vasp,Ga2H10C4F4,-3.845574827,0.4077304389999981 -Na2Zr1_187_12346.vasp,Na2Zr,-1.0064266633333332,0.5567828383333322 -V1P2S7_5_19899.vasp,VP2S7,-3.3096611449999997,0.0650247344999969 -Mg1I2_164_10378.vasp,MgI2,-0.8031017633333333,0.058652483333333394 -Sn2O2_12_16799.vasp,Sn2O2,-3.52387778,0.21276760250000004 -Te8Ir4_2_18697.vasp,Te8Ir4,-2.246180084166667,0.19732227583333328 -Nb2O4F4_12_12797.vasp,Nb2O4F4,-4.740085282,0.3414423860833229 -Zr3Ti1Se8_6_21796.vasp,Zr3TiSe8,-3.935791013333333,0.24994408104166688 -Zr2N1Cl2_164_21603.vasp,Zr2NCl2,-4.825854114,0.02825153999999941 -Y4N3_164_20833.vasp,Y4N3,-6.702957424285715,-0.10887625500000453 -Yb2S2Br2_59_20883.vasp,Yb2S2Br2,-3.5713713400000002,-0.9238346106597248 -Zn2In2S5_156_21111.vasp,Zn2In2S5,-1.79016214,0.1420425592222203 -Ni2Te1S1_156_13654.vasp,Ni2TeS,-0.7372026425,0.015504864999999979 -Li2S2O6F2_12_10054.vasp,Li2S2O6F2,-4.0877738325,0.027035105833333795 -Sr3P3_25_17396.vasp,Sr3P3,-1.9553531716666666,1.0671893650000002 -Li2Ti2Br2N2_59_10089.vasp,Li2Ti2Br2N2,-5.00574769125,0.10371156124999992 -Re1S2_164_15019.vasp,ReS2,-4.513152593333333,0.42691823083333347 -V2Cu2Te12P4_2_20054.vasp,V2Cu2Te12P4,-1.8347327969999998,0.41879690583333373 -Sr4Bi4Te8F4_12_17414.vasp,Sr4Bi4Te8F4,-2.2117797705,0.0694472785000001 -Nb2Se2_164_12877.vasp,Nb2Se2,-4.236165645,0.005233309750000803 -Pr1Sn5_47_14538.vasp,PrSn5,-1.4712228116666666,-1.546312951249999 -Hf1Sc2Se1S2I2_25_7301.vasp,HfSc2SeS2I2,-3.63800334875,0.03757206187500062 -Nb2Fe2Se6_11_12718.vasp,Nb2Fe2Se6,-3.056606271,0.05027226849999877 -Sb3Au1Se6_143_15755.vasp,Sb3AuSe6,-1.7575856470000002,0.2648448301666665 -Fe1B4N2F6_47_5628.vasp,FeB4N2F6,-4.466921912307692,0.38970345923076194 -Sr4Ni2I2O6_129_17455.vasp,Sr4Ni2I2O6,-3.083855125714286,-0.18673827709821667 -Pt2Br2_129_14599.vasp,Pt2Br2,-0.331693805,1.0979748056249998 -Cu2As2S4_26_5010.vasp,Cu2As2S4,-2.1216969225,0.23282552656249766 -Cr1Cl1F1_156_4138.vasp,CrClF,-2.6629431166666664,0.017330580555553476 -Bi8Rh4_2_2690.vasp,Bi8Rh4,-1.7080490691666668,0.2420612683333332 -Cs2Tm1Br6_164_4795.vasp,Cs2TmBr6,-1.4380664833333334,0.14727977208333176 -Zn1Ga1S1Cl2F2_1_20934.vasp,ZnGaSCl2F2,-1.5864264214285715,0.3455751214047554 -Ca3Sn1_25_3203.vasp,Ca3Sn,0.0500459875,0.84887705875 -Na4Hg2I8_11_12395.vasp,Na4Hg2I8,-0.24871306142857144,-0.28430603166666646 -Sc7I10_2_16279.vasp,Sc7I10,-1.7660763705882354,0.0963226200980365 -Ag2Sb2O6_2_399.vasp,Ag2Sb2O6,-2.825008927,0.5306436610000005 -Zn2Te2H8N4_4_21179.vasp,Zn2Te2H8N4,-3.45727233875,-3.1403936206250016 -Ag2Br2O2_59_201.vasp,Ag2Br2O2,-0.7292081183333333,0.3258290637499992 -Al2Zn2S5_164_1040.vasp,Al2Zn2S5,-2.457174423333333,0.07086228266666428 -Sr1Mg2_187_17062.vasp,SrMg2,0.61137279,0.5604432991666667 -Mn5O9F1_1_11460.vasp,Mn5O9F,-4.231606464666666,0.07384891966666274 -Mn4S2N3_164_11451.vasp,Mn4S2N3,-4.119031867777777,0.4787636649074031 -V1H4C4S6Cl1_1_19854.vasp,VH4C4S6Cl,-3.993106448125,0.3701224318489562 -Hf2Al4C5_164_7426.vasp,Hf2Al4C5,-6.011408243636364,0.1494991809090847 -Pd3Se2S1I1Br1Cl2_1_14512.vasp,Pd3Se2SIBrCl2,-1.037884107,0.060324330499999 -Hf2Te10_59_7625.vasp,Hf2Te10,-2.4236913975000003,0.08485027333333317 -Ba2Au1S2Br2_38_1907.vasp,Ba2AuS2Br2,-2.0468237142857144,0.19078021249999777 -K4S10_4_9502.vasp,K4S10,-2.045383123571429,0.1095263699999981 -Nb1Si1Te1I1_8_12581.vasp,NbSiTeI,-2.89137412,0.4061178117447839 -Co2As4Cl4O6_11_3852.vasp,Co2As4Cl4O6,-3.229313768125,-0.008418460000000016 -Fe2Te2_129_6004.vasp,Fe2Te2,-0.66715948,1.09899677125 -Zr1Br1N1_156_21267.vasp,ZrBrN,-5.08560536,0.3706565616666664 -Hf1Ge1S2Br2_1_7176.vasp,HfGeS2Br2,-3.39978954,0.12973179833332793 -Nb3C2S2F2_187_12963.vasp,Nb3C2S2F2,-5.247888571111111,0.6254940251357961 -Al1Tl1Hg1Te4_156_758.vasp,AlTlHgTe4,-0.8021552342857143,0.40408755476190295 -Ta1Nb1Se2I1Cl1_6_17575.vasp,TaNbSe2ICl,-3.5319059383333333,0.21374829311506685 -Ta2Te6P2_1_17920.vasp,Ta2Te6P2,-3.1033064870000002,0.5235148750000002 -Nb4B3F2_164_13033.vasp,Nb4B3F2,-5.904873408888889,0.3356667712222099 -Hf4Cu2Ge8_59_7781.vasp,Hf4Cu2Ge8,-3.751624542857143,0.17704939642856798 -Ti1Te2_187_18860.vasp,TiTe2,-3.4071314433333337,0.22307581499999962 -Sr1As2H12_2_17022.vasp,SrAs2H12,-2.762010275333333,1.6576058413333308 -Mo2N4_12_11642.vasp,Mo2N4,-5.583870821666667,0.5915836849999998 -Mo1Br2_115_11498.vasp,MoBr2,-1.01319394,0.8497880041666666 -W2Cl2O2_1_20481.vasp,W2Cl2O2,-4.045882489999999,0.600173883826527 -Tl1S2O8_150_19332.vasp,TlS2O8,-3.8023289054545457,0.12131360107954148 -Re2I6_191_15055.vasp,Re2I6,-1777.14851687,-1775.4720651504167 -Mo2Br4_11_11575.vasp,Mo2Br4,-1.5162680999999998,0.34671384416666684 -Te4S2O14_31_18628.vasp,Te4S2O14,-3.92139056,0.32937195150000065 -Sn2Te2_59_16897.vasp,Sn2Te2,-1.3548271725,-1.3190991925 -Bi4C3_5_2605.vasp,Bi4C3,-2.8723008557142857,0.8729060314285668 -Pd1O2_115_14374.vasp,PdO2,-1.9961411466666668,0.9064242150000001 -Mn1Nb1S1I1Br2_6_10806.vasp,MnNbSIBr2,-2.4005099583333336,0.09944773934027029 -Na2Mg1H4S2O8_2_12189.vasp,Na2MgH4S2O8,-4.2014539529411765,0.09263806484475899 -Zn2Cr8O18_85_21067.vasp,Zn2Cr8O18,-4.482023613571429,-0.03771149517857797 -V3Te6_12_20292.vasp,V3Te6,-2.2735469733333336,0.09369408444444405 -Sn2As2H6C2O6_7_16719.vasp,Sn2As2H6C2O6,-4.351614313333333,0.20215621430555153 -Y2N1F2_164_20759.vasp,Y2NF2,-5.863257878000001,-0.010649363666671963 -Li4B4H8O16_14_10163.vasp,Li4B4H8O16,-4.9274943765625,0.1259447390624998 -Nb2Sb2O6_2_12859.vasp,Nb2Sb2O6,-5.514829081,0.34233956337499494 -Zr2I2O2_59_21590.vasp,Zr2I2O2,-4.389768981666667,0.23598546759258854 -Sr2Cu1S2I2_38_17203.vasp,Sr2CuS2I2,-1.7952239571428572,-0.0012764871428607716 -V2B1Se2_164_19994.vasp,V2BSe2,-3.968071946,0.2118267030000005 -Ca4Ge8W4O24_14_3218.vasp,Ca4Ge8W4O24,-4.732552872,0.48185024724999526 -Se8Br8_2_16304.vasp,Se8Br8,-0.956796430625,0.08844344937500004 -Bi4Te6_12_2655.vasp,Bi4Te6,-1.40606987,0.16128406399999995 -Ca4Sn8O16_59_3244.vasp,Ca4Sn8O16,-4.108927577857143,0.20692776321428186 -Eu2Br2O2_129_5598.vasp,Eu2Br2O2,-4.8117692566666665,-1.0570993464583363 -Fe2Se4_127_5987.vasp,Fe2Se4,-1.219708805,1.0821499533333332 -Cu2C2Br2O2_31_5060.vasp,Cu2C2Br2O2,-3.1799954025,0.34717075375000006 -Ta4Te12Cl2_2_18123.vasp,Ta4Te12Cl2,-2.8707893738888886,0.13259327844443858 -Cd2Ge1S4_21_3508.vasp,Cd2GeS4,-1.3018934228571428,0.47499356830356954 -Cu2Te2Cl2_59_5330.vasp,Cu2Te2Cl2,-0.49802652166666667,0.2325789883333328 -Yb2Sb2S4O2_12_20885.vasp,Yb2Sb2S4O2,-4.357855701,-0.6319687017500049 -Ta4Co2S10_59_18022.vasp,Ta4Co2S10,-4.652826805625,0.09784396151041497 -Na4As4O8_14_12361.vasp,Na4As4O8,-4.051117638125,0.039380314375000225 -Hf2Te2_129_7638.vasp,Hf2Te2,-3.7006324975,0.4934404193750004 -In1I2_115_8273.vasp,InI2,-0.24130868333333333,0.29961147499999996 -Si2S2Br2_59_16431.vasp,Si2S2Br2,-2.59276861,0.23545977027777298 -Sn1Sb2Se4_164_16688.vasp,SnSb2Se4,-2.2405294785714287,-0.10400720714285872 -K4P4Pd2_51_9494.vasp,K4P4Pd2,-1.737809086,0.15636981100000025 -Ba2Cu1Te2Cl2_38_1975.vasp,Ba2CuTe2Cl2,-1.635526337142857,0.3332062089285684 -P2Pd3Se8_164_14029.vasp,P2Pd3Se8,-2.1087206,0.36087608717948294 -Cr2Ag2P4O12_13_4296.vasp,Cr2Ag2P4O12,-4.5717302555,0.31693530816666104 -Mo2I6_162_11627.vasp,Mo2I6,-0.54989636,0.3745501691666667 -Be2Cl4_49_2249.vasp,Be2Cl4,-2.5768317216666667,0.07317169166666648 -Zr4Se4S2Cl4_12_21851.vasp,Zr4Se4S2Cl4,-3.6486842585714285,0.14629632946428184 -Zr3Te2C2F2_187_21788.vasp,Zr3Te2C2F2,-4.382210191111111,0.5754708597222118 -Sb4O8_31_15791.vasp,Sb4O8,-3.891111001666667,0.5269658654166665 -Hf2Se2F2_59_7604.vasp,Hf2Se2F2,-4.692145213333333,0.06539667874999555 -Sr1O1_187_17067.vasp,SrO,-3.549866895,0.4764716299999998 -Cr2S6_11_4475.vasp,Cr2S6,-3.08215529375,0.1700258110937498 -In1Cu1P2S6_149_8229.vasp,InCuP2S6,-2.7409411009999998,0.07857173750000035 -Ti3C1S2I2O1_1_19071.vasp,Ti3CS2I2O,-4.916786603333333,0.17870164954859635 -Fe2As4Br4O6_11_5791.vasp,Fe2As4Br4O6,-3.206037665,-0.08209799937500034 -Te2Pd2O6_12_18471.vasp,Te2Pd2O6,-3.13151579,0.11640796275000032 -Ba1Te2F2_1_1866.vasp,BaTe2F2,-1.735995878,1.216044876666667 -Hf4N3O2_164_7796.vasp,Hf4N3O2,-7.904482942222223,0.14556431972221429 -Cu2Te1S4_21_5326.vasp,Cu2TeS4,-1.2505154185714284,0.5005088960119014 -Sr2N1_164_17280.vasp,Sr2N,-2.3316512633333333,0.27258540666666686 -Tl1Au1S4I2_1_19221.vasp,TlAuS4I2,-1.02555377875,0.28425153738281117 -Fe2Mo2Se2O12_113_5878.vasp,Fe2Mo2Se2O12,-4.231893949444444,0.049138780486576605 -Ni2P2Pt2_129_13563.vasp,Ni2P2Pt2,-1.7988967083333334,0.5415402432465248 -Co1C6Br2F4_47_3716.vasp,CoC6Br2F4,-4.217836574615385,0.4407420946794795 -Hf1Ti1Te2S1Cl1_1_7338.vasp,HfTiTe2SCl,-3.7051341166666667,0.3452551819791626 -Fe2Te2Mo2O12_113_5998.vasp,Fe2Te2Mo2O12,-4.096030247222222,0.16027177143517957 -Ni1H1O2_8_13322.vasp,NiHO2,-3.068932285,-0.12153318348958297 -Mo2H2N1O2_164_11613.vasp,Mo2H2NO2,-4.604020607142857,0.42091512220237104 -Sb4Au2Se3Cl2_6_15767.vasp,Sb4Au2Se3Cl2,-1.2221678690909092,0.750366347424239 -Cr1P2Au1S6_143_4228.vasp,CrP2AuS6,-2.724213015,0.16860005899999742 -Cu4Sb4_51_5462.vasp,Cu4Sb4,-0.80897234625,1.12701779 -Li1In1Te6As2_5_9738.vasp,LiInTe6As2,-1.655955716,0.3043496006666651 -Se2Cl2O5_123_16286.vasp,Se2Cl2O5,-2.1915105755555557,0.5733795795833307 -Ta1Br1Cl1_156_17516.vasp,TaBrCl,-3.1278995,0.5490247907142825 -Sb4Pt2_2_15808.vasp,Sb4Pt2,-2.15032473,0.5473457266666664 -V1Br2O1_47_19786.vasp,VBr2O,-2.9688890875,0.033995923124999994 -Ge2Se1I4Cl1_1_6860.vasp,Ge2SeI4Cl,-1.0226268,0.21394952817707968 -Si4Pb8Se16_14_16506.vasp,Si4Pb8Se16,-2.378077669642857,0.14289451392857133 -Tl1Cd1Ga1O4_156_19232.vasp,TlCdGaO4,-2.8031823785714285,0.23107926821428593 -Al1Ni3Br3O5_1_695.vasp,AlNi3Br3O5,-2.385232558333333,-0.058306158906254124 -Hf1Mn1Ge1Se2_156_7213.vasp,HfMnGeSe2,-3.41902513,0.522657136666667 -Bi2S2_12_2519.vasp,Bi2S2,-1.936903335,-0.6479070883333342 -Mn3Sn1O8_156_11414.vasp,Mn3SnO8,-4.179077876666667,0.25983424333333316 -Sb4Pd4O4_13_15805.vasp,Sb4Pd4O4,-2.53319057,0.5913159117708298 -H4Pb8S2O16_2_7070.vasp,H4Pb8S2O16,-3.907046358666667,0.048516602999999936 -Y4C3O2_164_20815.vasp,Y4C3O2,-6.35191791,0.6093016376041527 -Si1Ni3S2_187_16350.vasp,SiNi3S2,-1.5552771783333332,0.016921601833327582 -Li1Ti1Bi1Te1Br1_1_9798.vasp,LiTiBiTeBr,-2.48225572,0.3202728771249955 -B1Cl1_99_1621.vasp,BCl,-1.92416191,1.8249534594444412 -Gd2Ga4Co2_6_6612.vasp,Gd2Ga4Co2,-1.964704405,0.36677211125 -Cu2Hg2Te2F2_26_5164.vasp,Cu2Hg2Te2F2,-0.109161575,0.6629039827370689 -Mg1In2O4_164_10380.vasp,MgIn2O4,-3.836930374285714,0.16417050732142502 -Cd2F2_164_3504.vasp,Cd2F2,-0.133853195,0.024671261250000076 -Ga1Fe5I2_123_6190.vasp,GaFe5I2,-0.19308424375,1.2019026502083325 -Ti1V1S2Br1Cl1_8_18864.vasp,TiVS2BrCl,-3.4821597966666666,-0.07666219876736713 -Ag1Te1I1_1_140.vasp,AgTeI,0.06397953333333332,0.3562592488888886 -Ag2Cl6_191_252.vasp,Ag2Cl6,0.16599912125,0.366226821875 -W2Br4O4_26_20463.vasp,W2Br4O4,-3.889594658,0.02087042100000014 -Sn2I8_1_16788.vasp,Sn2I8,-0.123850029,0.1374074305 -Ta2I4O2_47_17762.vasp,Ta2I4O2,-3.84929737625,-0.044650362500000096 -Mn1Te1O4_10_10906.vasp,MnTeO4,-3.9056461933333337,0.2817414364583325 -Ba4Fe2Cl2O6_129_2151.vasp,Ba4Fe2Cl2O6,-3.758156389285714,-0.0441881509151818 -Cd3N1_191_3615.vasp,Cd3N,1.2742371025,0.5480760968750005 -C2S4_12_2756.vasp,C2S4,-4.091591795,0.35910654124999586 -K2H8I2O4_2_9159.vasp,K2H8I2O4,-3.33661413125,-0.08673356729166662 -Nb2Cl4O4_12_12682.vasp,Nb2Cl4O4,-3.9754667390000002,0.44156820162499955 -Ni1H4C2N6F2_6_13338.vasp,NiH4C2N6F2,-4.3694213526666665,0.5279921161555441 -Te1As1Cl1_156_18279.vasp,TeAsCl,-1.6350930466666667,0.2778679350000002 -Mg2Sn2_164_10518.vasp,Mg2Sn2,-0.602210665,-1.25187738125 -Y2In2I2_164_20753.vasp,Y2In2I2,-2.353385241666667,0.12637031972221968 -Pt2Se2_164_14683.vasp,Pt2Se2,-1.785118855,0.39018219750000016 -Ni1C10N2Cl2_10_13290.vasp,NiC10N2Cl2,-5.148629894666667,1.247712339333325 -Zr2Nb1Mo1Se5Br3_1_21612.vasp,Zr2NbMoSe5Br3,-3.2280385175,0.10783336050346853 -Ni1S2F2_164_13412.vasp,NiS2F2,-1.580703384,0.22937800875000025 -Rb2Hg4Te2Br6O6_31_14884.vasp,Rb2Hg4Te2Br6O6,-1.225283622,0.22014318531249613 -In2F6_1_8426.vasp,In2F6,-2.526291005,0.09004740249999976 -K2H6N10O2_51_9148.vasp,K2H6N10O2,-4.7069270240000005,-1.4155506637500022 -Fe1H8C6S4_10_5712.vasp,FeH8C6S4,-4.463967050526316,0.19753884230262325 -Ba2P4_12_2047.vasp,Ba2P4,-3.1226641033333333,0.4070728433333297 -Zr1Cl2_164_21276.vasp,ZrCl2,-3.0176405466666663,0.16156819333333372 -Tl4Ge2S6_2_19602.vasp,Tl4Ge2S6,-2.187354285,0.1333225916666665 -Li1Mn1Se2_156_9746.vasp,LiMnSe2,-2.3282414375,0.11413458812499999 -Te2Au1_187_18364.vasp,Te2Au,-0.30417841,-0.12180174458333334 -Y4Cl10_11_20818.vasp,Y4Cl10,-3.434833785,0.07059526452380294 -Ti1Cl2_187_18759.vasp,TiCl2,-3.656709476666667,0.0509035941666669 -Pb2S2_129_14278.vasp,Pb2S2,-1.875986895,-1.20285345 -V2Te6As2_8_20221.vasp,V2Te6As2,-2.0694234860000003,0.3774093769999999 -Ga1Pd1Br6_5_6234.vasp,GaPdBr6,-0.69564051375,0.10107732375000003 -Si1Se2_115_16366.vasp,SiSe2,-2.9899224600000003,0.13550265687499996 -B4Pb12S2O24_26_1763.vasp,B4Pb12S2O24,-4.435239610476191,0.0846019945238099 -K2Ag2Te2_129_8969.vasp,K2Ag2Te2,-0.33560893,0.12272638999999996 -Zr2Br2Cl2_6_21516.vasp,Zr2Br2Cl2,-2.6604605633333334,0.25649989333333334 -Fe2Sb2Se4F2_26_5960.vasp,Fe2Sb2Se4F2,-2.125660126,0.2988962292666638 -Sn3N4_156_16917.vasp,Sn3N4,-3.9325037714285713,-1.8878277664285716 -Ca3Fe2I2O5_123_3175.vasp,Ca3Fe2I2O5,-3.3462271875000003,-0.202019608685906 -Hf3S2N2F2_187_7724.vasp,Hf3S2N2F2,-5.44156557,1.0003245824999878 -In1Cu1S2I1Br1_1_8232.vasp,InCuS2IBr,-1.0428012583333335,0.30191303458333196 -Ge2H2_164_6776.vasp,Ge2H2,-3.1071409275,0.39222675250000005 -Al1Pd5Br2_123_708.vasp,AlPd5Br2,-1.2018062975,0.1330943393750002 -Hf2O2F2_59_7545.vasp,Hf2O2F2,-6.006750968333333,0.4289054860605944 -Zn2Sn2S6_162_21172.vasp,Zn2Sn2S6,-1.882834992,0.16171008580000024 -Si1F2_187_16331.vasp,SiF2,-2.66886259,1.0380387158333306 -P4Au2S12_12_14068.vasp,P4Au2S12,-2.484083026111111,0.2227234232986054 -Co2Cl2_129_3890.vasp,Co2Cl2,-0.72504024,0.5289281837500002 -Sr2Tc2N6_17_17323.vasp,Sr2Tc2N6,-5.445217786,0.6068585593793037 -Tl1Pd2_187_19317.vasp,TlPd2,-0.07141088999999999,0.7674430361111103 -Sb2Te2Br2_59_15710.vasp,Sb2Te2Br2,-1.4184608166666666,0.17209797333333343 -Cs2Cd4Te2S6Cl6_31_4704.vasp,Cs2Cd4Te2S6Cl6,-1.012358594,0.26494369479166613 -La2Te4Se2_129_9618.vasp,La2Te4Se2,-2.99311990375,0.0528883725 -Zr2As1S2_164_21501.vasp,Zr2AsS2,-4.715423006,0.05864155074999999 -Al4Se6_31_1097.vasp,Al4Se6,-2.9869736209999997,-0.034348830999999524 -Fe1Sn2C6N6_147_5760.vasp,FeSn2C6N6,-5.960622004666666,-0.43479397016666943 -Zn2P4H8O8_51_21134.vasp,Zn2P4H8O8,-4.060866021363636,0.07746166921084774 -Li4C8Cl4O8_14_10173.vasp,Li4C8Cl4O8,-4.639879800416667,0.7231699262499941 -Rb2C4_129_14800.vasp,Rb2C4,-3.623937155,1.4332121833333331 -Sc1Ag1As2O6_149_15885.vasp,ScAgAs2O6,-4.128051428,0.39381516199999533 -Li2Be2_11_9840.vasp,Li2Be2,-1.69704914,0.1798236158333334 -H2Pb6_164_7008.vasp,H2Pb6,-1.04509664625,1.1574828775000001 -Cd2Au2S2Br2_26_3457.vasp,Cd2Au2S2Br2,-0.14488803625,0.170094371875 -Rb2H6C8Cl8O8_2_14858.vasp,Rb2H6C8Cl8O8,-4.195810036875,0.1668149012500002 -Co2Bi2S4Cl2_10_3863.vasp,Co2Bi2S4Cl2,-2.025112777,0.28804584691666724 -Ca3Ni2Cl2O5_123_3192.vasp,Ca3Ni2Cl2O5,-3.2758046433333337,-0.27570681166667377 -Al4Cu2Cl16_14_1068.vasp,Al4Cu2Cl16,-1.7032244927272728,0.09164308363636281 -Sc2B1Br2_164_16031.vasp,Sc2BBr2,-3.25908998,0.0210423050999999 -Sc1Mn1Br6_5_15952.vasp,ScMnBr6,-1.66978218,0.048498740000000096 -Hf1Sb2S6F2_164_7290.vasp,HfSb2S6F2,-2.9366444627272728,0.6742347378693108 -Rb2I2F8_127_14893.vasp,Rb2I2F8,-1.478665085,0.1432286866666651 -Ni1H8C4N2O4_10_13358.vasp,NiH8C4N2O4,-4.976737382631579,0.2913550018420944 -K1C1N1_25_8888.vasp,KCN,-4.786580956666667,0.32053686999999353 -Ca2S2Br1Cl1_1_3102.vasp,Ca2S2BrCl,-2.5202191133333334,-0.0624265830208362 -Mn2Te2S8F4_7_11302.vasp,Mn2Te2S8F4,-2.290027366875,0.2688924248958334 -Ti3Te2_123_19115.vasp,Ti3Te2,-4.668736539999999,0.26291128399999386 -Ba2H8O6_26_1996.vasp,Ba2H8O6,-4.35125035125,0.06257817874999994 -Ag2Se1Br1Cl2_1_422.vasp,Ag2SeBrCl2,-0.18049507333333334,0.2583941921354164 -Co1Si2Se4_12_3825.vasp,CoSi2Se4,-2.626399874285714,0.40831914525297 -Ni3Sb2O8_164_13716.vasp,Ni3Sb2O8,-3.04186097,0.14169135346153494 -Hf2Zr2O8_4_7669.vasp,Hf2Zr2O8,-6.9857971625,0.49944435833333367 -Ca2F2_123_3012.vasp,Ca2F2,-2.0002374325,1.041612595 -Ce2Se4_59_3680.vasp,Ce2Se4,-3.5854917050000004,0.21583600083333288 -Th2Br2N2_129_18724.vasp,Th2Br2N2,-5.937101305,0.10416916166666734 -Li2Mn1_187_9990.vasp,Li2Mn,-1.21133908,0.4762406053639834 -Ga2P1Ru1Se4Br2_1_6425.vasp,Ga2PRuSe4Br2,-2.176191051,0.3678652683888861 -K2H6C10O2_51_9134.vasp,K2H6C10O2,-5.0159112295,0.726306989499992 -Fe1C8Br2F4_25_5653.vasp,FeC8Br2F4,-4.52431598,0.4308708724999926 -Ti2F2_164_18933.vasp,Ti2F2,-5.169002655,-0.15251997333333733 -K2Cu3Se4O12_2_9091.vasp,K2Cu3Se4O12,-2.992454414285714,0.15802468333333097 -Sb6Pt3_157_15857.vasp,Sb6Pt3,-2.195349368888889,0.5023210877777773 -Ca2C2S6F2_59_2970.vasp,Ca2C2S6F2,-3.490855965833333,0.40453094140624124 -In2Os1_123_8517.vasp,In2Os,-1.7396004966666665,1.9102775533333303 -Ba3Fe2Br2O5_123_2105.vasp,Ba3Fe2Br2O5,-3.501118065,0.013272807499999928 -Mg1I1Br1_156_10374.vasp,MgIBr,-1.1169080599999999,0.08295434555555564 -Mo12O24_1_11484.vasp,Mo12O24,-5.041954177777778,0.2699509338888886 -Sr4As4S8F4_14_17406.vasp,Sr4As4S8F4,-3.3054267260000003,0.19584521825 -Mn2P2S4I2_10_11194.vasp,Mn2P2S4I2,-2.41482392,0.3984977490148078 -Sc2Cl2F2_164_16058.vasp,Sc2Cl2F2,-3.39163772,-0.007863141666669682 -Nb4Te2O16_13_13170.vasp,Nb4Te2O16,-5.535172985,0.07831027412877822 -Tl8Te8O20_14_19656.vasp,Tl8Te8O20,-3.121659376388889,0.06330829277777728 -Mo2Br6_162_11577.vasp,Mo2Br6,-1.20081193,0.23696231406249835 -Ag1Pb1Se2_1_100.vasp,AgPbSe2,-1.0010768275,0.11738324796874999 -Te4P4_14_18609.vasp,Te4P4,-2.45141123125,0.3574796395833336 -Re1Ag2Br6_147_14986.vasp,ReAg2Br6,-0.8174434355555555,0.14043772537036933 -Zr4H2S2N3_164_21826.vasp,Zr4H2S2N3,-5.692290717272727,0.36286079507574237 -Sr2H4I4O2_31_17237.vasp,Sr2H4I4O2,-2.7840591183333334,0.012068167083333248 -Tc1S2_164_18221.vasp,TcS2,-4.802732793333333,0.3708612683333339 -Ta1Se2_115_17620.vasp,TaSe2,-4.02534922,0.6697299216666668 -Li2H4N2_113_9940.vasp,Li2H4N2,-4.25188867,0.05339978437500026 -Ag1Sb1Te6P2_143_121.vasp,AgSbTe6P2,-1.615887463,0.2961820275075736 -Bi14Te13S8_147_2304.vasp,Bi14Te13S8,-1.8560577665714284,0.0152007564999984 -Mg1N8_83_10389.vasp,MgN8,-4.4691635,0.7290472708333291 -Y2Te2_129_20782.vasp,Y2Te2,-3.89129328,0.20830033249999946 -Li1Ni1P1O4_3_9760.vasp,LiNiPO4,-4.112826051428572,0.2922613214999975 -Ga2Se2_187_6478.vasp,Ga2Se2,-2.361001105,0.056456402499999836 -Te2W2N1_156_18530.vasp,Te2W2N,-4.290733392,-0.07636361366666633 -Hf1Ru1Cl4_6_7275.vasp,HfRuCl4,-2.886932573333333,0.45039064041666343 -Sn2As2S6_147_16727.vasp,Sn2As2S6,-2.555341996,0.21649903137500015 -Hg2Se2_164_8022.vasp,Hg2Se2,0.2861213025,-0.5058834625 -Ag2B2I2O2_31_179.vasp,Ag2B2I2O2,-2.2622936775,0.9429068203255144 -Zr3Ti1O8_1_21794.vasp,Zr3TiO8,-6.910085643333333,0.29311984541666725 -As1I5_47_1153.vasp,AsI5,-0.056320753333333334,0.273637076458333 -Al4Se6_1_1096.vasp,Al4Se6,-2.7893374819999996,0.16328730800000057 -Co2Mo2S8I2_129_3935.vasp,Co2Mo2S8I2,-2.1435534257142854,0.69778626848214 -Sb4Te3Au2Br2_6_15830.vasp,Sb4Te3Au2Br2,-0.9169343336363636,0.37844784845454305 -Zr3Sc1N3F5_1_21783.vasp,Zr3ScN3F5,-5.552819475833334,0.09704926999999386 -Tl2Fe2Se4_10_19418.vasp,Tl2Fe2Se4,-1.1384349675,0.46034896763888866 -Mg2Cl4_51_10439.vasp,Mg2Cl4,-1.8636079866666666,0.20341955833333314 -Ba1Th1Br6_25_1869.vasp,BaThBr6,-2.343286065,0.14735307187500002 -Mn1Au1S2Br2_1_10640.vasp,MnAuS2Br2,-1.2839885850000001,0.1309220986458312 -Na6Cu2Sn2Se8_4_12435.vasp,Na6Cu2Sn2Se8,-1.6757251549999999,0.20681083194444327 -Ga1Ni2_187_6219.vasp,GaNi2,0.36077111666666667,0.9256209708333334 -Ho2Cu2Pb2Se6_51_8137.vasp,Ho2Cu2Pb2Se6,-2.2851723516666667,0.1896620716666666 -Co2As2Se6_162_3849.vasp,Co2As2Se6,-2.319641787,0.24536967866666393 -K4H8S4N4O12_57_9455.vasp,K4H8S4N4O12,-4.2039014353125,0.050879284277340675 -In1Fe5F2_123_8248.vasp,InFe5F2,-0.7203097325,1.5837718375 -Hf1Nb1Br4_123_7241.vasp,HfNbBr4,-2.5974289633333334,0.6237647116666618 -Te2Pd2F2_59_18467.vasp,Te2Pd2F2,-1.3911632666666665,0.16367787770833164 -Nb4Co2Se10_59_13055.vasp,Nb4Co2Se10,-3.6401857375,0.1672760754166671 -Au4S4F4_14_1586.vasp,Au4S4F4,-1.086450075,0.18294676406249843 -Bi1Sb1Te2_1_2381.vasp,BiSbTe2,-1.493665215,0.25117252124999784 -Ag4S4Br4F4_2_544.vasp,Ag4S4Br4F4,-0.799816359375,0.2810382016796875 -W2S2Cl2_59_20527.vasp,W2S2Cl2,-3.5322061216666665,0.2241907383333298 -Cr2F6_162_4383.vasp,Cr2F6,-2.830439985,0.21579018375000025 -Ba1I2_187_1841.vasp,BaI2,-1.2900427966666668,0.2544791299999998 -Pd1N1_187_14367.vasp,PdN,-2.321526005,1.2693227262500002 -Mn2Ge2Br4_8_11087.vasp,Mn2Ge2Br4,-1.4547593025,0.05048514687499994 -Al1In1Hg1O4_156_676.vasp,AlInHgO4,-3.4138410542857143,0.3972123794047606 -K2C2Se2S6Cl6_4_9029.vasp,K2C2Se2S6Cl6,-2.0721985372222225,0.4435260344212931 -Zn1I2_1_20961.vasp,ZnI2,0.4107168366666667,0.09403899875000005 -Y1Se1_25_20673.vasp,YSe,-3.9475255,0.9222191700000004 -Hg1B4Br2N2F4_10_7837.vasp,HgB4Br2N2F4,-3.7916455192307694,0.3667421652136653 -Pd2I2_129_14431.vasp,Pd2I2,-0.0606761525,0.5697172831249999 -In2Pt4S6_164_8534.vasp,In2Pt4S6,-2.39319522,0.14084899166666487 -Os2Br2_129_13832.vasp,Os2Br2,-1.478632395,1.4855985600000001 -Ga2S2I2_59_6444.vasp,Ga2S2I2,-1.7628925750000002,0.1324697908333312 -In2Ni2S5_187_8495.vasp,In2Ni2S5,-1.8583335055555557,0.17911605092592403 -Cr1Cu1W1Br2N3Cl2_1_4165.vasp,CrCuWBr2N3Cl2,-3.145219774,0.17399163037499304 -Ta8Te1C3Se2Br1N1Cl4_1_18164.vasp,Ta8TeC3Se2BrNCl4,-5.6946874385,0.17573902422916687 -Te2P2_12_18443.vasp,Te2P2,-2.25685564,0.5520352308333335 -Y2Ga2I2_164_20735.vasp,Y2Ga2I2,-2.8592178316666668,0.042012796666666574 -In4Se4Br4_14_8692.vasp,In4Se4Br4,-1.5337924941666667,0.02179883583333342 -Ta3B2H2S2_187_17940.vasp,Ta3B2H2S2,-5.620608338888889,0.7668042238888826 -Mn1Sb2S4_164_10872.vasp,MnSb2S4,-2.7399938414285714,0.24211326178571185 -Fe1Cl2_115_5657.vasp,FeCl2,-0.7392654533333333,0.9310118033333336 -Te2Au4S12_14_18376.vasp,Te2Au4S12,-1.4265536255555555,0.3479213102083316 -Tl2Br2O2_59_19378.vasp,Tl2Br2O2,-1.650303335,0.043089010000000094 -Zr3C2_187_21761.vasp,Zr3C2,-6.053453976,0.4260491470000005 -Rb2Te2H6N2O6_1_14953.vasp,Rb2Te2H6N2O6,-3.7849876955555555,0.08840725356480872 -Mg1B2H8_164_10340.vasp,MgB2H8,-3.702040439090909,0.028678781742423887 -Li1H5C5N2O5_1_9722.vasp,LiH5C5N2O5,-5.666657960555556,0.16375276510994285 -Hf4I1N2Cl2O3_1_7791.vasp,Hf4IN2Cl2O3,-6.087843000833334,0.2747781835937413 -Hf3Mo1Se1S1Br3Cl3_1_7716.vasp,Hf3MoSeSBr3Cl3,-3.3501347533333337,0.38138330567707773 -Ca3Cl6_5_3160.vasp,Ca3Cl6,-2.312437855555556,-0.0842067172222225 -V1Mo3Se8_25_19888.vasp,VMo3Se8,-3.021627593333333,0.04908325375000011 -Ga1I2_187_6204.vasp,GaI2,-0.49947859666666666,0.29699724916666664 -Ta4C3S2_164_18015.vasp,Ta4C3S2,-7.466031011111111,-0.1262648000000075 -Ni1H2O2_164_13325.vasp,NiH2O2,-3.1952225380000003,0.11884372716666658 -K2Cd4I6O8_31_9044.vasp,K2Cd4I6O8,-1.049940491,0.4305373839583323 -Ta1Cr1Cl6_123_17530.vasp,TaCrCl6,-2.25313504375,0.5333100270833313 -Nb2Se2_129_12875.vasp,Nb2Se2,-4.463435025,-0.22203607024999927 -Cu2Se1S4_21_5295.vasp,Cu2SeS4,-1.2500279871428572,0.6061681555357101 -Na3Sc1Br6_149_12357.vasp,Na3ScBr6,-1.8277428839999998,-0.27392238350000075 -Ag2As4S3I2_6_168.vasp,Ag2As4S3I2,-1.6993852018181819,0.1079503573295415 -Mn2P2Se4Br2_10_11197.vasp,Mn2P2Se4Br2,-2.2144268400000002,0.08645465912500017 -Sb1Se2_115_15505.vasp,SbSe2,-1.8260645033333331,0.5257834472222203 -Sc1Cu1As2Se6_149_15923.vasp,ScCuAs2Se6,-2.356895233,0.23308999197221808 -Sr2Fe2Ge2_129_17219.vasp,Sr2Fe2Ge2,-1.2004963533333333,0.901380591666665 -In1Ni5Cl2_123_8291.vasp,InNi5Cl2,0.1319147175,1.392940454947916 -Mn2P2Cl2O4_10_11183.vasp,Mn2P2Cl2O4,-3.759113836,0.4154758564259221 -Sn2Sb2O6_147_16862.vasp,Sn2Sb2O6,-3.9447413570000003,0.24339151399999745 -Cr2P4Au2S12_13_4457.vasp,Cr2P4Au2S12,-2.888936017,0.003877056999997741 -Zr2B1H2_164_21509.vasp,Zr2BH2,-4.515646192,0.12125143549999651 -Co1H4N6F2_47_3769.vasp,CoH4N6F2,-4.2920406692307695,0.11873675240383896 -Zn3Cu1_183_21203.vasp,Zn3Cu,2.05303048,0.09444798999999993 -K2Ru2S4Br8N2_7_9326.vasp,K2Ru2S4Br8N2,-1.9092124377777777,0.18242756805555374 -Ga2Se1S1I1Cl1_1_6464.vasp,Ga2SeSICl,-1.9246561416666665,0.0809649741666667 -Mn1Sn3O8_10_10903.vasp,MnSn3O8,-4.145125153333333,0.24199174999999995 -Ag4Br4O4_14_505.vasp,Ag4Br4O4,-0.7153746066666667,0.3396625754166658 -Si2S2F2_59_16433.vasp,Si2S2F2,-3.2651073533333332,0.5289545762499968 -K2Pd1F4_10_9297.vasp,K2PdF4,-1.8303885728571427,-0.06935822857142848 -Cu1Br2_187_4862.vasp,CuBr2,0.13177971,0.267067925 -La4H12O12_14_9628.vasp,La4H12O12,-4.970954005714286,0.1839016985714288 -Mg3P2O8_10_10557.vasp,Mg3P2O8,-4.945619130769231,0.41385447769230765 -Na4Cl4O12_14_12381.vasp,Na4Cl4O12,-2.7008623305,-0.13350659274999943 -Na4Sb4S8_29_12417.vasp,Na4Sb4S8,-2.59981444,0.06726900000000002 -Ta2I2N2_59_17755.vasp,Ta2I2N2,-5.508218398333334,0.14001403765476073 -Mn1In2S4_156_10785.vasp,MnIn2S4,-2.5082913085714287,-0.021539577142857258 -Sr1Au1Br2_1_17023.vasp,SrAuBr2,-0.6956903975,1.0610195375 -K2Sn1S2_156_9353.vasp,K2SnS2,-1.470359152,-0.015225345249999966 -Nb2Ir2Se8_11_12760.vasp,Nb2Ir2Se8,-3.5477097475000003,-0.24323186583333323 -In2F6_26_8427.vasp,In2F6,-2.47749576125,0.13884264624999965 -Fe1Ni2S1Cl4_38_5727.vasp,FeNi2SCl4,-0.85978359875,0.031996692256942516 -Bi6Pt3_147_2675.vasp,Bi6Pt3,-1.4074437811111111,0.2824095834722222 -Li1Ga1P2Se6_5_9712.vasp,LiGaP2Se6,-2.62201897,0.1527132175416645 -Cu8W4O16_2_5506.vasp,Cu8W4O16,-3.8207332675,0.46357150517856516 -Tl4Te6_1_19636.vasp,Tl4Te6,-0.7180119620000001,0.2696184039999999 -V1I1Br1_156_19862.vasp,VIBr,-1.43339173,-0.008511290555555662 -Ga2Se1Cl5_8_6463.vasp,Ga2SeCl5,-1.51833427125,0.2434367417708331 -Fe2N2F2_59_5885.vasp,Fe2N2F2,-3.1764514266666666,0.5963446337499951 -As4O6_7_1337.vasp,As4O6,-4.43800706,0.047230511999999614 -U2Te2N2_129_19730.vasp,U2Te2N2,-6.7902742300000005,0.1170428983333327 -Mo1As1P1_156_11486.vasp,MoAsP,-3.52314136,0.06284999666666335 -Ge3As4_5_6903.vasp,Ge3As4,-2.932423708571428,-0.20373786321428755 -P1S1Br1_156_13939.vasp,PSBr,-2.05687886,0.3995536930034702 -Sb2S3_164_15684.vasp,Sb2S3,-2.70665758,0.09733554000000044 -Pd1N2_99_14369.vasp,PdN2,-4.4284061066666665,-0.18992341166667015 -V4B3O2_164_20305.vasp,V4B3O2,-5.297643853333334,0.30687062716048363 -Ge2Te2F2_59_6883.vasp,Ge2Te2F2,-2.3466031983333333,-0.02454521138889021 -Hf1Ge1Cl2O3_1_7172.vasp,HfGeCl2O3,-4.748113824285714,0.2759814783928516 -Te4H4O12_4_18589.vasp,Te4H4O12,-3.826166396,0.1923294517499996 -Li1Al1P2Se6_5_9644.vasp,LiAlP2Se6,-2.805204111,0.12632545854166438 -Co1H8C6S4_10_3773.vasp,CoH8C6S4,-4.542497471052632,0.31161299258771036 -Te2_2_18540.vasp,Te2,-0.993490395,0.5782953616666666 -Hf3I2N1Cl1O1_1_7713.vasp,Hf3I2NClO,-4.65699875375,0.5640016606770804 -Te3Ir3I2Br1_1_18547.vasp,Te3Ir3I2Br,-1.69217435,0.2589068440740707 -Ba4Bi4Te8H4_14_2146.vasp,Ba4Bi4Te8H4,-1.9672978579999998,0.5640869960000003 -Tl2S2_2_19507.vasp,Tl2S2,-1.254788655,0.34103502609375 -Co2H4Se2O8_1_3916.vasp,Co2H4Se2O8,-3.616373160625,0.19215007041666443 -Na1B3H8_6_11826.vasp,NaB3H8,-3.894120914166667,0.4985118536666582 -Ti2Ag2_129_18876.vasp,Ti2Ag2,-2.4697305025,0.20333638749999983 -P1_123_13952.vasp,P,-3.41662974,0.6293662450000004 -Co1Te2_115_3834.vasp,CoTe2,-1.19475516,0.4493481477777779 -Bi8Se20_14_2695.vasp,Bi8Se20,-1.8189386896428572,0.3464235470238073 -Sc1Pd1S2Br1_8_15979.vasp,ScPdS2Br,-2.76147853,0.2357670230000003 -Ta2Cl10_1_17686.vasp,Ta2Cl10,-2.6633743733333333,0.09974542833333366 -Sb1W2O8_2_15526.vasp,SbW2O8,-5.408360425454545,0.061322940568177664 -Bi1H1Se2S6_1_2336.vasp,BiHSe2S6,-2.303106064,0.26276877919791186 -Zr2B1Te2_164_21513.vasp,Zr2BTe2,-4.078354378,-0.012932712500002497 -Fe1H4C8F2_25_5706.vasp,FeH4C8F2,-5.249223816666667,0.5839238746666601 -Li2Co2P2_12_9866.vasp,Li2Co2P2,-2.9711520266666667,0.13267529374999698 -Cs4Cd2I8_11_4807.vasp,Cs4Cd2I8,-0.04679093071428571,0.20459029642857146 -Hf4S4I4_7_7810.vasp,Hf4S4I4,-3.787632995833333,0.13760189416665902 -Zr4N3Cl2_164_21830.vasp,Zr4N3Cl2,-5.9465862977777775,-0.13904503666667223 -K1Fe1P2H2O6_156_8896.vasp,KFeP2H2O6,-4.332574528333333,0.2862614059781011 -Hf1V1I3Br1N1O1_1_7351.vasp,HfVI3BrNO,-3.28199334375,0.3174126425 -Mn2N1_164_11155.vasp,Mn2N,-2.985600743333333,1.0283908458333335 -Li2Mg1H4Se2S8_2_9970.vasp,Li2MgH4Se2S8,-2.766521175294118,0.09404894215685777 -K4As4S8_14_9411.vasp,K4As4S8,-2.41964125,0.10742040687499976 -Ta2Te6Pt1_12_17923.vasp,Ta2Te6Pt,-2.9865217133333335,0.12402177444444074 -Ta1Nb2Ni1Ir1Br6O3_1_17583.vasp,TaNb2NiIrBr6O3,-3.4280153407142855,0.5030745244444326 -As2Pb4Cl4O6_11_1263.vasp,As2Pb4Cl4O6,-3.001566203125,0.23492739489583192 -Bi4Br12_14_2602.vasp,Bi4Br12,-0.91866921375,0.07266445249999998 -Co2W2Br2O8_129_4054.vasp,Co2W2Br2O8,-4.379260359285714,0.13292319208332648 -Zr1Pt1I2N2_1_21404.vasp,ZrPtI2N2,-3.5081041766666665,0.2177274321568593 -V1O2_115_19892.vasp,VO2,-5.377178273333333,0.30076080166666763 -Hf4H2C3O2_164_7782.vasp,Hf4H2C3O2,-6.806402166363636,0.3120727984343321 -Hf2I2_164_7520.vasp,Hf2I2,-3.1622423525,0.387087234999997 -Pb1F2_115_14182.vasp,PbF2,-2.2854557566666664,0.40019965666666657 -V1O1F2_25_19890.vasp,VOF2,-4.1168790075,-0.33618355453125726 -Mn2P2Br2O4_10_11181.vasp,Mn2P2Br2O4,-3.6018774579999997,0.4187716826759226 -Pd2Se2Cl4_1_14485.vasp,Pd2Se2Cl4,-1.00644832,0.06773687263888772 -Sc2H2_164_16088.vasp,Sc2H2,-3.0057219675,0.38147068625000013 -Sc1Cu1As2O6_149_15921.vasp,ScCuAs2O6,-4.160857808,0.5822487451249962 -Ce2I6_59_3667.vasp,Ce2I6,-1.71098141,0.08134489 -Zr1I2_115_21310.vasp,ZrI2,-1.4247263366666667,0.603633345 -Cs2H6C6S6_1_4722.vasp,Cs2H6C6S6,-4.1942494230000005,0.3189799552499919 -Cu1Cl2_115_4871.vasp,CuCl2,-0.30326818,0.1858869233333333 -Ca3Br6_5_3157.vasp,Ca3Br6,-1.738205968888889,0.19192769444444457 -Pb2S2F2_59_14273.vasp,Pb2S2F2,-2.1176929433333336,-0.11417328843750235 -Zr1Ta1Nb2N4F4_1_21449.vasp,ZrTaNb2N4F4,-6.273115511666667,0.32711345999999475 -Na1C5N2O5F5_1_11835.vasp,NaC5N2O5F5,-4.429712279444445,0.6461504925694346 -Te4Au2_6_18572.vasp,Te4Au2,-0.4753785016666667,-0.29300183625 -Sr2Au1I2O2_38_17125.vasp,Sr2AuI2O2,-2.1656989928571426,0.10706964572420336 -W2Br6_12_20465.vasp,W2Br6,-1.80537883125,0.22955394843749954 -Ba2In1Cu1Hg1S5_99_2011.vasp,Ba2InCuHgS5,-1.896475014,0.31900060105468575 -Co2O4_59_3951.vasp,Co2O4,-3.671752833333333,-0.5745864012500024 -Sr2Cl4_129_17183.vasp,Sr2Cl4,-2.2285308816666665,0.26896687166666666 -Ru1I2_164_15273.vasp,RuI2,-1.1537099166666667,-0.1483995850000009 -Ta2Ni1C1I1F6_1_17787.vasp,Ta2NiCIF6,-3.6848971327272726,0.4580511065908984 -Yb2Co2Ge4_129_20869.vasp,Yb2Co2Ge4,-2.83652720875,0.3272076374999997 -Hf2Te2Cl2_59_7632.vasp,Hf2Te2Cl2,-3.5373382633333335,0.06483825979166324 -Li4Cu4F10_11_10180.vasp,Li4Cu4F10,-2.210610808888889,-0.06874776666666893 -Sn12Pt4_100_16596.vasp,Sn12Pt4,-1.57026307125,0.08053299624999899 -Sc2F2_164_16069.vasp,Sc2F2,-3.552240735,-0.01397365333333589 -Co1C2I2N4F4_47_3712.vasp,CoC2I2N4F4,-3.0015583361538463,0.8042948594230669 -In2Te2Br2_31_8614.vasp,In2Te2Br2,-1.1607173716666666,0.06826038333333351 -Ta2Pd4Se2S2_51_17831.vasp,Ta2Pd4Se2S2,-3.198661395,0.08715169062499806 -K4Cl4O4_11_9432.vasp,K4Cl4O4,-1.5703522108333334,0.5317552374999985 -Pd2O4_14_14449.vasp,Pd2O4,-2.591705555,0.310859806666667 -Li2Pt1_187_10046.vasp,Li2Pt,-1.7606394366666667,0.80993782 -Ba5La1_1_2201.vasp,Ba5La,0.10200735999999999,0.8462912749999982 -Li1Rh1S2_1_9781.vasp,LiRhS2,-2.6546090475,0.5856659449999997 -Cu2P4S3I2_6_5223.vasp,Cu2P4S3I2,-2.1504115572727276,0.15401155042831544 -Ge6P2_191_6965.vasp,Ge6P2,-2.5602720675,0.08095864749999993 -Mg2Sn3O8_10_10519.vasp,Mg2Sn3O8,-4.1811244038461535,0.26345413653846217 -Ca1Ge1Br1O1_1_2837.vasp,CaGeBrO,-2.8025334325,0.47976758437499945 -Na2Cd2P2O8_11_12019.vasp,Na2Cd2P2O8,-4.005659305,0.21857369107142866 -Cs2Cd4Se2S6Br6_31_4696.vasp,Cs2Cd4Se2S6Br6,-0.8445815905,0.32367685345833264 -Li4Bi4O8_57_10164.vasp,Li4Bi4O8,-3.88427552625,0.052385391249999635 -Mn1Sb1Br2N1_6_10855.vasp,MnSbBr2N,-2.2593801339999997,0.07368383950000057 -Te1Ir1S1_1_18294.vasp,TeIrS,-2.4888740466666666,0.2775546 -Dy2Br6_162_5520.vasp,Dy2Br6,-2.29690298625,0.05446278249999992 -Ag2Hg2Se2Cl2_26_302.vasp,Ag2Hg2Se2Cl2,0.06636187375,-0.200576455625 -Ga4As20_26_6539.vasp,Ga4As20,-2.767070435833333,-0.05976155416666895 -Al1In1Te2S1_1_682.vasp,AlInTe2S,-1.9799490460000002,0.3068347644999997 -Sb2Te8Pt3_164_15745.vasp,Sb2Te8Pt3,-1.3859911423076925,0.4988857450769212 -Ni2Sb1Se2_187_13602.vasp,Ni2SbSe2,-1.2003130560000002,0.13605141166666546 -Fe1Co2O6_12_5662.vasp,FeCo2O6,-3.651342172222222,-0.2554805452083402 -Ti1Cr1I1Br1O2_25_18770.vasp,TiCrIBrO2,-4.243929748333334,0.04713295277777413 -Ni2Se2_164_13642.vasp,Ni2Se2,-0.4560695525,0.34009805249999947 -Co2I2_164_3925.vasp,Co2I2,-0.3174444775,0.5086941183333327 -Ru2I8_14_15326.vasp,Ru2I8,-0.433200552,-0.02447004362499955 -Pr4I10_11_14563.vasp,Pr4I10,-1.8078690228571428,0.060657223571428664 -K2H6N2O8_4_9150.vasp,K2H6N2O8,-3.3628072716666666,0.8467549533888847 -In2H8C2Se2O14_2_8468.vasp,In2H8C2Se2O14,-4.457940682142857,0.06819050805058846 -Au4O4F8_2_1577.vasp,Au4O4F8,-0.79511399,0.47844791987847113 -Sc2F6_26_16073.vasp,Sc2F6,-4.2903427775,-0.2891720675 -Pb1I2_164_14188.vasp,PbI2,-0.63575293,0.08475283611111117 -Rb2H6S6N2O2_1_14860.vasp,Rb2H6S6N2O2,-3.446775018888889,0.17040076224825598 -Li2B2C4O8F4_59_9831.vasp,Li2B2C4O8F4,-5.540501129,0.12240727624998904 -In2I6O18_147_8480.vasp,In2I6O18,-2.7498347434615384,0.07015796730769219 -P2Au2Se6_2_13959.vasp,P2Au2Se6,-1.775971689,0.0678891569999982 -In6Te6_2_8712.vasp,In6Te6,-1.3053159616666667,0.07969305833333329 -Ta2S2_129_17852.vasp,Ta2S2,-5.447659365,0.32046118124999445 -Ge3Se5Br1Cl1_1_6922.vasp,Ge3Se5BrCl,-2.134410496,0.17188844344791665 -Ag2Cl4O12_4_249.vasp,Ag2Cl4O12,-2.0096827994444446,0.2948303558333314 -K2B2C8O16_51_8983.vasp,K2B2C8O16,-5.960331495,0.12877044879698696 -Ag1I2_115_85.vasp,AgI2,0.5602187433333333,0.2014795506250003 -Ag1Sn2S3I2_6_137.vasp,AgSn2S3I2,-1.3327568325,0.18443270833333303 -Sn3P4O14_2_16922.vasp,Sn3P4O14,-5.107906403333333,0.08703683702379994 -Sn1H4_123_16644.vasp,SnH4,-2.4442634080000003,0.894859683 -Ba2Hf1S4_123_1999.vasp,Ba2HfS4,-2.653958052857143,1.6621252185714255 -Cu2Te1O4_21_5322.vasp,Cu2TeO4,-2.4293099557142854,0.5497404717857135 -Ni3Se5I1Cl1_1_13726.vasp,Ni3Se5ICl,-0.894598756,0.22651508118749952 -Nb2Te2Pd4Se2_51_12912.vasp,Nb2Te2Pd4Se2,-2.6122056789999997,-0.28564137745454843 -Ba8C4_59_2205.vasp,Ba8C4,-1.651071625,1.3387169063888826 -Fe6Sb10I6O18_2_6097.vasp,Fe6Sb10I6O18,-3.35005796175,-0.13367922475000427 -Ga2S1Br1_8_6436.vasp,Ga2SBr,-1.8429978025,0.2670736699999998 -Ir1Se1Br1_156_8760.vasp,IrSeBr,-2.1334673033333336,-0.09681809986111456 -Mn1W1N2Cl2_6_10932.vasp,MnWN2Cl2,-4.348041151666666,-0.01696336812500565 -K1Ga1Cl4O12_2_8899.vasp,KGaCl4O12,-2.589026054444444,0.21502127111110925 -Ta3B2H2O2_187_17939.vasp,Ta3B2H2O2,-6.242858641111111,0.6918139274444335 -Sr4Te4H8O16_14_17478.vasp,Sr4Te4H8O16,-4.1935850946875,0.05327469750000002 -Fe1H4C2Br2N4_47_5690.vasp,FeH4C2Br2N4,-4.480210786923077,0.05518579285255609 -Ti2Se2I2_59_19022.vasp,Ti2Se2I2,-3.4992042983333334,-0.6405734925000024 -Hf1Zr3O8_1_7418.vasp,HfZr3O8,-6.845977994166667,0.48813733791666714 -Sc7C2Cl10_12_16276.vasp,Sc7C2Cl10,-3.561397837368421,0.08836778263157896 -Sr4Te8P4F4_14_17485.vasp,Sr4Te8P4F4,-2.6265197445,0.15176526150000064 -As2Pb1Se4_164_1248.vasp,As2PbSe4,-2.358617827142857,0.05996122455356978 -Ti3H2N2_187_19086.vasp,Ti3H2N2,-6.63020398,-0.11157130428571893 -Ta2H2C1O2_164_17743.vasp,Ta2H2CO2,-6.216228041428572,0.3624585037856951 -La2W2Cl2O8_31_9622.vasp,La2W2Cl2O8,-5.663525156428571,0.042133987142857876 -Te4O10_4_18598.vasp,Te4O10,-3.55136809,0.15579150500000027 -Li2Ni2P2O8_51_10026.vasp,Li2Ni2P2O8,-4.069812330714286,0.3352750422142833 -Ta2O3_12_17813.vasp,Ta2O3,-6.991833688,0.5165178108000004 -Sb8O16_26_15871.vasp,Sb8O16,-4.2294053429166665,0.18867152416666677 -Al4Cl4_57_1066.vasp,Al4Cl4,-1.66846449375,0.6625356304166647 -Hg2C2S2O6F6_2_7950.vasp,Hg2C2S2O6F6,-3.178130972777778,0.19220954069444152 -Zr1N2_164_21336.vasp,ZrN2,-5.966900796666667,1.1791023122222164 -Si2Sb2Te6_1_16444.vasp,Si2Sb2Te6,-1.867603112,0.3017393559999999 -Sc2Cl6_59_16067.vasp,Sc2Cl6,-2.7517690575,0.13725588625000018 -Ru1Cl2_164_15266.vasp,RuCl2,-1.9463411099999999,0.15876367722222057 -Nb1Te2_164_12602.vasp,NbTe2,-3.2708744366666664,0.1180459244444445 -Cu2Sb2O4_26_5264.vasp,Cu2Sb2O4,-2.9402457275,0.7704152228125003 -Ta3Se6_2_17992.vasp,Ta3Se6,-4.55385535,0.14122379166666654 -Fe1S1F2_25_5742.vasp,FeSF2,-2.026014,-0.10799829296875194 -In1Ag1P2Se6_149_8181.vasp,InAgP2Se6,-2.147528875,-0.07507525199999998 -Ba2N1_115_2031.vasp,Ba2N,-2.3208094733333335,0.3621675299999998 -Ga2I2_129_6390.vasp,Ga2I2,-0.7674526375,0.17544206416666552 -Ga1Cl2_115_6148.vasp,GaCl2,-1.3441735966666668,0.3791968749999999 -Pd1C6N2F6_25_14351.vasp,PdC6N2F6,-4.677497306,0.402090693249997 -Er2I6_162_5562.vasp,Er2I6,-1.54413735375,0.056154681250000005 -Te8Mo3W1_25_18701.vasp,Te8Mo3W,-2.3479084166666664,-0.0035132412499997434 -Mg10Co2_26_10326.vasp,Mg10Co2,0.033693309166666664,-0.014047149270833281 -Hf1Br2_187_7131.vasp,HfBr2,-3.01279574,0.1492043455555525 -Te4Au2_14_18571.vasp,Te4Au2,-0.341545105,-0.15916843958333335 -B3W4S2F2_164_1743.vasp,B3W4S2F2,-4.7339313999999995,0.5185933925757484 -P4Pb3_5_14096.vasp,P4Pb3,-2.4689029085714287,0.4491538379591804 -In2Ni1S4_164_8490.vasp,In2NiS4,-2.119758622857143,0.09168765738095094 -Ru2Br2O2_59_15299.vasp,Ru2Br2O2,-2.9256282833333334,0.41762024777777484 -Ca8C4_1_3260.vasp,Ca8C4,-1.6324132975,1.4748141116666604 -Sr3Bi3_25_17356.vasp,Sr3Bi3,-0.43966734333333335,0.8178083536858962 -Fe1Cl2_187_5659.vasp,FeCl2,-1.0054130399999999,0.664864216666667 -Cr2Ag2As4S12_13_4293.vasp,Cr2Ag2As4S12,-2.5345989775,0.34996042484374745 -Te8As8O4_1_18689.vasp,Te8As8O4,-2.6836471445,0.22041565349999748 -Te2Au2_164_18373.vasp,Te2Au2,-0.0857151825,0.34292146500000004 -Fe3B2H2_187_6045.vasp,Fe3B2H2,-2.6330138271428574,0.7685427124999928 -Ca2B6H10O16_4_2947.vasp,Ca2B6H10O16,-5.450029255294118,0.1213995162254844 -Na4As4S8_29_12364.vasp,Na4As4S8,-2.679555475625,0.3857581643749999 -Ni3Te4_10_13735.vasp,Ni3Te4,-0.40175522142857145,0.2507106971428572 -Fe2Br6_162_5822.vasp,Fe2Br6,-0.6478784725,0.12729777812499998 -Cr2F4_14_4381.vasp,Cr2F4,-3.25743219,0.028214923333330644 -Be4P2_59_2288.vasp,Be4P2,-3.0662157766666667,0.5440042189583306 -Sr2Mg2_164_17273.vasp,Sr2Mg2,0.5831951325,0.6246343168749999 -Pd2Cl4_14_14416.vasp,Pd2Cl4,-0.8312321533333332,0.04423391111111119 -H2W4S2N3_164_7045.vasp,H2W4S2N3,-5.105841685454545,-0.9922283866161696 -W2C1O2_164_20471.vasp,W2CO2,-6.249991958,0.16199947718366725 -Ir2Se2Cl2_11_8835.vasp,Ir2Se2Cl2,-2.3149980383333335,-0.10047703097222604 -Nb2Pt2Se10_51_12825.vasp,Nb2Pt2Se10,-3.0101157957142854,0.07422441815475245 -Nb1Br5_47_12484.vasp,NbBr5,-1.5465805333333333,0.21692857583333347 -Al1Se1Br7_1_733.vasp,AlSeBr7,-0.9436558566666666,0.08428954999999916 -Y4F6_12_20820.vasp,Y4F6,-4.670932895,0.33465352499999534 -U4Te2_1_19740.vasp,U4Te2,-5.332851095,1.2714031683333342 -Sn1Cl2_115_16624.vasp,SnCl2,-1.2595726166666668,0.31908734166666664 -Na2H6C6O6_4_12118.vasp,Na2H6C6O6,-5.2722047775,0.16517984220831683 -Cr1Co2O6_8_4146.vasp,CrCo2O6,-4.226877281111111,-0.5976993307638967 -Mn1Ge1Se1S1I1Br1_1_10749.vasp,MnGeSeSIBr,-1.8276218100000001,0.28899574055555527 -Nb2Ni4Te2Se2_51_12789.vasp,Nb2Ni4Te2Se2,-2.028419217,0.005695405391301783 -In2Ge2Se2_164_8451.vasp,In2Ge2Se2,-2.3097378666666666,-0.316469083333335 -Zr2Te2P1_156_21706.vasp,Zr2Te2P,-2.91279922,1.234925326 -K2O2F2_2_9271.vasp,K2O2F2,-1.7303626416666666,0.3736568004166648 -Ru2Se2_6_15361.vasp,Ru2Se2,-2.6817789025,0.76365793375 -Mg1Cl2_164_10351.vasp,MgCl2,-2.011313046666667,0.05571449833333286 -Mn3H2N2_156_11387.vasp,Mn3H2N2,-3.9426007857142857,-1.6331831210714323 -Ti1Se2_123_18850.vasp,TiSe2,-4.038151433333334,0.43433042166666613 -Si2C4O4_47_16396.vasp,Si2C4O4,-5.5930405180000005,1.499437394 -Na1N1O2_25_11905.vasp,NaNO2,-4.1843404525,0.252376795 -Zr2C2F2_164_21542.vasp,Zr2C2F2,-5.228490838333333,0.6030474795833276 -Bi8S8O4_2_2694.vasp,Bi8S8O4,-2.7867830555,-0.5318370481666685 -Li1Ni1Sb2Se6_5_9766.vasp,LiNiSb2Se6,-1.8154584960000002,0.3186699956666641 -Zn2Sb4Cl4O6_31_21151.vasp,Zn2Sb4Cl4O6,-2.830808134375,0.1225806303125001 -Mn1Mo1S3I2_1_10798.vasp,MnMoS3I2,-2.0466247257142856,0.3891123643749974 -Ge1Ir1I2O2_1_6676.vasp,GeIrI2O2,-2.622373608333333,0.4838846087499971 -Al4S4I4_14_1086.vasp,Al4S4I4,-2.4276124608333336,0.08613130180555295 -Zr1Nb1I2_8_21347.vasp,ZrNbI2,-2.627203,0.51337584875 -Sn4O4_29_16947.vasp,Sn4O4,-3.60558860625,0.1310567762499999 -Ca4As2_59_3205.vasp,Ca4As2,-1.4053776233333333,0.5383068355555538 -Cu2F2_51_5091.vasp,Cu2F2,-0.6908806325,0.6790216874999999 -Si6N6_12_16534.vasp,Si6N6,-6.151592394166666,-0.686084795416666 -Li2Co2P2O8_162_9864.vasp,Li2Co2P2O8,-4.568262604285715,0.22762722952380465 -Li1Te6As2Pd1_5_9796.vasp,LiTe6As2Pd,-1.698228604,-0.20843134316666825 -Fe1Ni1H12C14N8_10_5723.vasp,FeNiH12C14N8,-5.771398325,-1.9441602007407444 -W2Br10_6_20458.vasp,W2Br10,-0.9501241441666667,0.534567165763889 -Mn2I2N2_59_11109.vasp,Mn2I2N2,-2.967495051666667,0.15647917958332758 -Yb4Te10O26_2_20891.vasp,Yb4Te10O26,-4.4532099695,-0.12506031614583657 -Ga1Ir1S1Br2O1_1_6206.vasp,GaIrSBr2O,-2.496293946666667,0.3442365726666544 -Fe1O1_123_5729.vasp,FeO,-2.56751882,0.9782065185416644 -Li8H6Br2O6_11_10285.vasp,Li8H6Br2O6,-3.805874726818182,0.1575282545454546 -Co2Sb4S6I4_11_4016.vasp,Co2Sb4S6I4,-1.8851391075,-0.44727942911458607 -In2Ru1_123_8536.vasp,In2Ru,-1.4969200066666666,0.610234218888887 -Ge1Pb1Se1S1_6_6689.vasp,GePbSeS,-2.489422015,0.016460109270828416 -Na3P1S4_81_12355.vasp,Na3PS4,-2.59488036875,0.27124650437499964 -V2Mo2S8_25_20107.vasp,V2Mo2S8,-3.7163383341666667,0.04420039166666667 -Sn2Cl4_11_16763.vasp,Sn2Cl4,-1.4727897833333332,0.10587017500000018 -In2Br6_162_8392.vasp,In2Br6,-0.94022219375,0.04210616499999997 -Rb4Re4S4O12_14_14979.vasp,Rb4Re4S4O12,-4.656767784166667,0.15669328010415806 -Ge4P4Se4_17_6937.vasp,Ge4P4Se4,-3.154674205833333,0.12752001916666433 -Pb2S2Cl2_59_14272.vasp,Pb2S2Cl2,-1.6557057883333333,-0.3520376492708352 -Ge1Bi2Te4_164_6651.vasp,GeBi2Te4,-1.7515866557142858,-0.21397918142857297 -Ni1Pd1I2_6_13397.vasp,NiPdI2,0.1670738775,0.730480603125 -Ce1Ge5_47_3645.vasp,CeGe5,-2.938613316666667,-0.0794559572222251 -K1In2Br6_143_8912.vasp,KIn2Br6,-0.7942373077777778,0.2673588543055546 -Na4Si2O10_4_12421.vasp,Na4Si2O10,-4.066669564375,0.4459230715624998 -Nb2Te2N1_164_12909.vasp,Nb2Te2N,-5.062439536,-0.028919543333333575 -Mo1W1I1O4_1_11552.vasp,MoWIO4,-4.493873747142858,0.44912954093914337 -Ni2Pt3Se8I2_1_13578.vasp,Ni2Pt3Se8I2,-1.340728622,0.22651353633333282 -Tl1Zn1Pd1Au2S7Br3_1_19357.vasp,TlZnPdAu2S7Br3,-1.0963524526666668,0.32032091224999926 -Mn2Te4P2Cl2_26_11323.vasp,Mn2Te4P2Cl2,-1.887431824,0.48641758694444037 -Li2Mg1H4S2O8_2_9968.vasp,Li2MgH4S2O8,-4.374795384117647,0.09744937335783153 -As2Pd1_123_1265.vasp,As2Pd,-2.3955850466666666,0.4870651599999998 -Au1O2_187_1436.vasp,AuO2,-0.9738417666666667,1.1021459185416638 -Mn2Sb2S4Cl2_10_11240.vasp,Mn2Sb2S4Cl2,-2.419173982,0.21472236841666467 -Sb2Cl2_12_15567.vasp,Sb2Cl2,-1.5172903575,0.25672654999999833 -In2Ni2S5_164_8497.vasp,In2Ni2S5,-1.873349601111111,0.16409995537036864 -Sm2I6_59_16578.vasp,Sm2I6,-1.63780754875,0.02833446375000004 -W2F4_14_20493.vasp,W2F4,-3.2041236633333336,1.0198337241666624 -Nb2Pt1S6_12_12822.vasp,Nb2PtS6,-4.164029542222222,0.09399403888888891 -Sr2H8I4O4_53_17243.vasp,Sr2H8I4O4,-3.2650351955555554,0.034453398703701066 -Nb1Sn1Se1S1Br2_1_12589.vasp,NbSnSeSBr2,-2.4930497283333333,0.3954201011111016 -Tl2I4_10_19437.vasp,Tl2I4,9.800166666666667e-05,0.1651495506249999 -P4Au2Se3Cl2_6_14070.vasp,P4Au2Se3Cl2,-1.8414104881818183,0.29072192931817786 -Nb3Br8_156_12956.vasp,Nb3Br8,-2.553007359090909,0.08867245045454553 -Cs2Sb2C12Cl10_31_4785.vasp,Cs2Sb2C12Cl10,-3.596730918846154,0.9336804807051218 -Ta1Te1S1_156_17624.vasp,TaTeS,-4.428673086666667,0.15563489194444458 -Zn1Au1I2O1_5_20897.vasp,ZnAuI2O,-0.263854736,0.3331580517499999 -Ba2Cd1In1Au1S5_99_1941.vasp,Ba2CdInAuS5,-1.749874947,0.5111323886875001 -Na2Co2P2_12_12060.vasp,Na2Co2P2,-2.431582403333333,0.06852782847221983 -Ba2Th2Br12_51_2070.vasp,Ba2Th2Br12,-2.428894830625,0.06174430625000005 -Ag3Sb1S4_156_501.vasp,Ag3SbS4,-1.02237759125,0.5831771511718751 -Au2N6_49_1497.vasp,Au2N6,-4.06616588,0.45848025937500037 -Hf1Te1Mo1Se2I1Br2_1_7318.vasp,HfTeMoSe2IBr2,-2.25125349,0.4309941911979101 -Ir1Ru1Cl4O2_65_8753.vasp,IrRuCl4O2,-2.47559830375,0.12657380874999857 -Tl2Co2Te5_156_19400.vasp,Tl2Co2Te5,-1.0328968944444443,0.3051651696296287 -Ni3As2Se8_164_13693.vasp,Ni3As2Se8,-1.5096268146153844,0.36601794899999807 -Li6Te2H2S8_11_10279.vasp,Li6Te2H2S8,-2.830880443888889,0.10857923916666401 -Tl2I2_129_19434.vasp,Tl2I2,-0.1884984075,0.24971440000000003 -In2Br6_26_8395.vasp,In2Br6,-0.833960575,0.14836778375000004 -Ge2Sb1S6_162_6836.vasp,Ge2SbS6,-2.880724597777778,0.14861244510416116 -Sb16F4_10_15423.vasp,Sb16F4,-2.2438006325,0.26178413133333045 -Zr3N2F2_187_21772.vasp,Zr3N2F2,-5.927684455714286,0.1639189803571357 -V13S26_2_19744.vasp,V13S26,-3.7701522107692305,-0.015193377435897215 -Rb2B2H6Se2O6_4_14773.vasp,Rb2B2H6Se2O6,-3.487128076111111,0.909028218593745 -Re2Br2_129_15031.vasp,Re2Br2,-2.74579204,1.3227944130555522 -Al2Bi4Se4Br2Cl8_2_770.vasp,Al2Bi4Se4Br2Cl8,-1.8728879315,0.0820619865000003 -V1H5C4O6_2_19858.vasp,VH5C4O6,-5.253631668125,0.221069680164923 -Cu1As1Cl3O1_1_4834.vasp,CuAsCl3O,-1.6218260899999999,0.2256230266666668 -Cu2S2N2F2_31_5249.vasp,Cu2S2N2F2,-2.43672123125,0.10095246221354182 -K2B2H6S2N8_51_8989.vasp,K2B2H6S2N8,-4.4908295635,-0.9844139622500019 -Hf1W1Br2O3_1_7364.vasp,HfWBr2O3,-4.920254118571428,0.11211674874508848 -Tl2Sn1As2S6_147_19544.vasp,Tl2SnAs2S6,-2.3983122545454547,0.08959913272727249 -Ge4S4_57_6943.vasp,Ge4S4,-3.0804923625,-0.8293445087499998 -Cs2Ru2N2Cl8O4_7_4774.vasp,Cs2Ru2N2Cl8O4,-2.4454382688888887,0.21601705458332413 -Nb1Zn1Ni1Sn1H2O8_1_12616.vasp,NbZnNiSnH2O8,-4.147289513571429,0.15411083989582347 -Os1W1I6_5_13827.vasp,OsWI6,-0.9814334725,0.3530705578385416 -Ag1Sb1Te6As2_143_120.vasp,AgSbTe6As2,-1.420322029,0.24810787141666496 -Li8P8_14_10287.vasp,Li8P8,-3.18483470375,0.19761648687499989 -Y1V1Cu1F6_1_20685.vasp,YVCuF6,-3.3790645544444446,0.4760534694444405 -Ca1H2S2_1_2845.vasp,CaH2S2,-3.169728452,-0.05234184450000012 -Ba2Bi1_25_1917.vasp,Ba2Bi,-0.26173654,0.912656558888888 -Rh2O4_127_15208.vasp,Rh2O4,-3.152378335,0.9782615233333329 -Cd2Si1S4_21_3578.vasp,Cd2SiS4,-1.5973010942857144,0.48974497785714055 -Mn1Ge1S2I1Br1_1_10742.vasp,MnGeS2IBr,-2.05314079,0.20182304901041648 -Rh2O6_7_15209.vasp,Rh2O6,-3.3639548125,0.5733160303125002 -Ir3Pd1O8_10_8852.vasp,Ir3PdO8,-3.733789685833333,0.4751081720833338 -Hf1I1Br1_156_7193.vasp,HfIBr,-2.6398372066666664,0.30399702629629366 -Sc4I2Cl1O4_1_16246.vasp,Sc4I2ClO4,-4.579585224545455,0.25461702874051606 -K1W2S2I6_47_8961.vasp,KW2S2I6,-1.6154363254545456,0.1679558940909056 -Cu4P40_2_5437.vasp,Cu4P40,-3.699315226363636,0.05489602863636378 -Zn2Cu1As2O8_2_21068.vasp,Zn2CuAs2O8,-3.3223029615384614,0.1837493814423028 -In18S9_143_8171.vasp,In18S9,-1.6745126207407408,0.6887985292592572 -Lu2Se2I2_59_10318.vasp,Lu2Se2I2,-2.41421834,0.4328350900000002 -Pd2Se2I2_59_14487.vasp,Pd2Se2I2,-0.96725744,-0.1036049383333334 -Hg4Br8_115_8070.vasp,Hg4Br8,0.5765434208333333,0.1496260875 -Rb2Ru2C2Br8O4_59_14921.vasp,Rb2Ru2C2Br8O4,-2.563052586111111,0.3121486345370329 -Os1Br2_187_13793.vasp,OsBr2,-1.0635601966666666,0.9259317733333292 -Ni2H2O2_59_13509.vasp,Ni2H2O2,-2.2528278900000003,0.7388939976388872 -Mn1Mo1I1Br1O3_1_10793.vasp,MnMoIBrO3,-3.3005460914285716,0.10022454957142302 -Re6S8I2_2_15128.vasp,Re6S8I2,-4.620017735625,0.07065417562500009 -Sb4O6_18_15783.vasp,Sb4O6,-4.116042885000001,0.14144758249999967 -Na2Cd2Sb2S6_39_12020.vasp,Na2Cd2Sb2S6,-1.94109353,0.08410000041666477 -Hf4O8_11_7802.vasp,Hf4O8,-6.632554005,1.1549398933333332 -In1Ga1P2Se2S4_1_8255.vasp,InGaP2Se2S4,-2.753308561,0.1496656787881888 -Fe2S10_31_5928.vasp,Fe2S10,-2.232696755,0.04430860218749988 -Rb2Hg4S2Br6O6_31_14868.vasp,Rb2Hg4S2Br6O6,-1.608169032,0.09081839983332893 -Ta1Te2_10_17627.vasp,TaTe2,-3.15727365,0.590609718888889 -Te4W2_127_18634.vasp,Te4W2,-1.6359283883333333,1.4089695633333332 -Sr2Cl4_51_17185.vasp,Sr2Cl4,-2.148442175,0.3490555783333331 -Ni2Ir2S8_2_13534.vasp,Ni2Ir2S8,-2.510006703333333,-0.04352394145833505 -Nb2Cl5_1_12684.vasp,Nb2Cl5,-2.7598939757142857,0.47744154321428245 -Rb2C2O6_11_14786.vasp,Rb2C2O6,-4.726093204,0.13952120150000002 -Ag2Te1Se1I2_1_452.vasp,Ag2TeSeI2,-0.06493385,0.2940858280555552 -Gd2I2_164_6617.vasp,Gd2I2,-1.712921895,0.10020606124999998 -Ta3H2N2_187_17962.vasp,Ta3H2N2,-6.708717215714286,0.305089458809519 -Na2Sn1S6F6_147_12305.vasp,Na2SnS6F6,-1.9737263779999998,0.8052018150833338 -Ba2Fe2Ge2_129_1981.vasp,Ba2Fe2Ge2,-1.3226121516666667,0.9157558116666645 -Cs2Zr12B2I24_53_4797.vasp,Cs2Zr12B2I24,-2.0951235305,0.20209157624999363 -Cd2O2_164_3525.vasp,Cd2O2,-1.2811758475,0.2739860158333336 -Mg1Bi4O8_1_10343.vasp,MgBi4O8,-3.69611041,0.12446364115383879 -Cd1Hg4C6S6Br4N6_38_3363.vasp,CdHg4C6S6Br4N6,-3.3076072222222224,0.11207668496141576 -Au4Se2S12_14_1591.vasp,Au4Se2S12,-1.4761025172222224,0.3533687813194424 -Sb1W1S2I1Br1_6_15525.vasp,SbWS2IBr,-2.1955438983333333,0.5491146574999985 -Rb2C2S6_2_14791.vasp,Rb2C2S6,-3.111520371,0.30312244693749757 -Ag1Sn1H6_2_132.vasp,AgSnH6,-2.00261259375,1.302337625208335 -Na2H6C8N2O2_51_12120.vasp,Na2H6C8N2O2,-4.7689146895,-0.23141787850000073 -Na1B12_191_11825.vasp,NaB12,-4.580034009230769,1.127810017476917 -Sb2Pb6_191_15648.vasp,Sb2Pb6,-0.37834019375,1.1886911643750002 -Ni1O1F1_156_13381.vasp,NiOF,-1.9376885266666666,-0.13377205145833615 -Zr2Ti2S8_28_21723.vasp,Zr2Ti2S8,-4.684664303333333,0.2794286537499997 -Mg8Ti8_59_10605.vasp,Mg8Ti8,-2.722193221875,0.6764582039583336 -Ga1Si2Ni7P1C1Se1S2Cl5_1_6282.vasp,GaSi2Ni7PCSeS2Cl5,-1.579734663,0.3327019724599918 -P2Se2_12_14052.vasp,P2Se2,-2.8775662725,0.19136922218749985 -Hg2Au2Se2Br2_26_7930.vasp,Hg2Au2Se2Br2,0.28289837125,0.45257330156250003 -Ge4Sb4Te4_17_6946.vasp,Ge4Sb4Te4,-2.1541185608333335,-0.15033830333333542 -Fe2Si2Bi1O9_8_5989.vasp,Fe2Si2BiO9,-4.836350985,0.10854205290177599 -B3Mo4S2F2_164_1737.vasp,B3Mo4S2F2,-3.8092584136363636,0.566742876212113 -Bi2O3_6_2486.vasp,Bi2O3,-3.5345972459999997,0.3233969820000002 -La1Be5_1_9561.vasp,LaBe5,-2.55658034,0.6832162378205101 -In2Te3_150_8632.vasp,In2Te3,0.443180926,1.822550562 -Nb2F10_51_12709.vasp,Nb2F10,-3.814583263333333,0.26026460333333334 -Hf2S1I1Br1O1_6_7561.vasp,Hf2SIBrO,-4.4715011250000005,0.19015674104166314 -Sb8Br4O10_14_15861.vasp,Sb8Br4O10,-3.440131685,0.1250353290909092 -Sr2Ag1Te2F2_38_17115.vasp,Sr2AgTe2F2,-1.64947288,0.6621495719047581 -Nb2Sn2P2_129_12896.vasp,Nb2Sn2P2,-3.5609346916666667,-0.33372385166666885 -Al2Se2F2_31_964.vasp,Al2Se2F2,-3.2889145083333333,0.1268456372222191 -Al2Tl2F8_51_1024.vasp,Al2Tl2F8,-3.296509026666667,0.11969760833333298 -As1Pb2S6_162_1160.vasp,AsPb2S6,-2.2394439688888887,0.4111354334220628 -Hf2Au2_129_7434.vasp,Hf2Au2,-2.6356692925,0.24819472500000028 -Nb2Se4Br4_2_12881.vasp,Nb2Se4Br4,-2.7233699170000003,0.06622389799999961 -Y2F6_59_20731.vasp,Y2F6,-4.98589085125,0.21792909000000016 -Tl2Br4_10_19382.vasp,Tl2Br4,-0.4607770116666667,0.10727670208333334 -Cs2Hg4S8Cl6_31_4733.vasp,Cs2Hg4S8Cl6,-0.8582597959999999,0.24234900256250036 -Hf2Te2As1_164_7629.vasp,Hf2Te2As,-4.391486414,0.05588334199999956 -Ag4Br8_13_506.vasp,Ag4Br8,0.17851057666666667,0.11233813000000005 -Ta1Nb2C1S1Br3O1_8_17580.vasp,TaNb2CSBr3O,-4.663898013333334,0.2823962431498943 -Al2Ni1S4_164_897.vasp,Al2NiS4,-2.91317666,0.16587917505952218 -K1Ge1S2_156_8902.vasp,KGeS2,-2.13366942,0.44902686921875 -Zr1Ti1Te4_10_21480.vasp,ZrTiTe4,-3.273199925,0.14688696249999977 -Rb2Os2C2I8O4_59_14907.vasp,Rb2Os2C2I8O4,-2.4435550566666664,0.3395880763888868 -Mg1Te2H2_1_10409.vasp,MgTe2H2,-1.962537146,0.9295438563333334 -H4C4N20O4_14_7065.vasp,H4C4N20O4,-5.8708570121875,-0.06648120427083315 -Pd2S8_12_14480.vasp,Pd2S8,-2.1800127320000002,0.2578285102500002 -Hf1Zr1S2I4_8_7392.vasp,HfZrS2I4,-2.68935263125,0.27852880770833344 -Cr2Te6_11_4533.vasp,Cr2Te6,-1.668251815,0.18197922833333352 -Li2Mg1S2O8F4_2_9972.vasp,Li2MgS2O8F4,-3.6590488764705884,0.19118123338234982 -Pd2O2_164_14444.vasp,Pd2O2,-1.881275115,0.7586739425 -Na2S2F2_1_12287.vasp,Na2S2F2,-2.290154428333333,0.04726002479166469 -Li4V2P8O26_2_10241.vasp,Li4V2P8O26,-5.504890563,0.05931578454999986 -P16Br4_10_13907.vasp,P16Br4,-3.258347758,0.054158765666664443 -Mn1H2O2_164_10763.vasp,MnH2O2,-4.135473364,0.6573913060000001 -Cu3Se2Br2_1_5387.vasp,Cu3Se2Br2,-0.47505722714285714,0.1624606986054407 -Ge2Sb1S1_1_6835.vasp,Ge2SbS,-2.8277677125,-0.5880581112500002 -Ta4V2Zn4O16_13_18138.vasp,Ta4V2Zn4O16,-5.382472513846154,0.16569351692306644 -Mo2C1Se2_12_11585.vasp,Mo2CSe2,-4.0459570540000005,0.10851916399999961 -Pb2Cl4_12_14240.vasp,Pb2Cl4,-1.420589205,-0.13463682333333327 -Y1Te2_115_20682.vasp,YTe2,-2.7272478,0.4048997761111077 -P2H2Pb4N4O18_31_13979.vasp,P2H2Pb4N4O18,-4.474158558,0.20376388091998654 -Mn1Ga1S2Br1Cl1_1_10721.vasp,MnGaS2BrCl,-2.2010632416666667,0.16683638229166264 -K2Nb2F12_1_9264.vasp,K2Nb2F12,-3.71225481,0.006856463749999708 -Li4O12_13_10210.vasp,Li4O12,-3.47996519375,-0.5003089284375 -Fe2As2S4I2_26_5782.vasp,Fe2As2S4I2,-2.107561891,-0.18145105404166817 -Fe1O2F2_164_5730.vasp,FeO2F2,-2.2592491939999997,0.3570444332499976 -K4In4P8Se24_14_9467.vasp,K4In4P8Se24,-2.3077447305,0.08337424999999987 -Zr4B3O2_164_21805.vasp,Zr4B3O2,-5.889276565555556,0.28961818944443873 -Cu3Si1S2Cl4_1_5391.vasp,Cu3SiS2Cl4,-1.4209288839999998,-0.057885210499999895 -Hg2I2N2_59_7970.vasp,Hg2I2N2,-0.20246687833333332,0.8342068041666659 -As2Se3_164_1305.vasp,As2Se3,-2.537692912,0.06833210300000037 -H4Au2C4I2N2_1_7053.vasp,H4Au2C4I2N2,-3.987878797857143,0.37418156660713264 -Cu1Au1I1Cl1_8_4838.vasp,CuAuICl,0.20176226,0.3529504543749998 -Zr1F2_164_21284.vasp,ZrF2,-4.008649746666666,0.49155713666666256 -Hf1Zr1Te2S1_8_7404.vasp,HfZrTe2S,-4.12000941,-0.00337709799999919 -Mn1V1I1Br1O2_1_10922.vasp,MnVIBrO2,-3.2891552733333334,0.052449066458332805 -Al2Br6_189_778.vasp,Al2Br6,-1.41304388125,0.24756426375000018 -Zr1Nb1I2N3_1_21345.vasp,ZrNbI2N3,-5.009229344285714,0.18158065367459297 -Nb6Ge2Se12_26_13191.vasp,Nb6Ge2Se12,-4.0943912485,-0.04681157925000612 -Tc4Cl10_13_18245.vasp,Tc4Cl10,-2.671887072857143,0.4990562261904702 -Al1Se4_8_739.vasp,AlSe4,-2.10240276,0.5279039116666668 -Sb2Te2I2_59_15717.vasp,Sb2Te2I2,-1.198805745,0.15450682166666652 -Re6Se8F2_2_15131.vasp,Re6Se8F2,-4.466165906875,0.05149755374999998 -Ta2Te8I2_12_17925.vasp,Ta2Te8I2,-2.2499633841666666,0.19861987166666673 -Cd2Au2Se2F2_26_3463.vasp,Cd2Au2Se2F2,-0.2693460025,0.15153255372000002 -Fe3Te4_164_6072.vasp,Fe3Te4,-1.183667622857143,0.5233867699999979 -Hg1H2S2_5_7868.vasp,HgH2S2,-1.9459958400000001,0.07561147549999997 -Mo2I2_129_11623.vasp,Mo2I2,-0.9457789275,1.397633745416667 -Mn2W2O8F2_129_11339.vasp,Mn2W2O8F2,-4.863111665,0.05978222607142447 -Sn2C2Cl2_59_16752.vasp,Sn2C2Cl2,-2.5584544366666666,0.5017467649999994 -Cs2Cd4Se2Cl6O6_31_4693.vasp,Cs2Cd4Se2Cl6O6,-1.6621666154999999,0.23885143625000005 -Ti1Te2_115_18857.vasp,TiTe2,-3.1115926233333333,0.518614635 -Cu2As4Se3I2_6_5024.vasp,Cu2As4Se3I2,-1.5743068945454546,-0.17746112412338103 -Mn1Fe1S1Cl1_25_10710.vasp,MnFeSCl,-1.571209355,0.596765477499998 -Co1Te2_187_3836.vasp,CoTe2,-1.4569655533333332,0.18713775444444458 -Pd1Br2_187_14348.vasp,PdBr2,-0.10306450333333333,0.46843096 -Sc1P2Au1S6_149_15973.vasp,ScP2AuS6,-3.131791133,0.07670012174999785 -Yb1F2_164_20855.vasp,YbF2,-3.83107478,0.26134583000000067 -Zn2In4S8_10_21114.vasp,Zn2In4S8,-2.0943951071428573,0.049393764857141476 -Sb2Rh2Se6_162_15668.vasp,Sb2Rh2Se6,-2.296936382,0.30279829413157666 -Ti2B1Te2_164_18892.vasp,Ti2BTe2,-4.715591374000001,0.12044294250000043 -Ba2Br2Cl2_129_1925.vasp,Ba2Br2Cl2,-2.2783091316666666,0.19266840500000004 -Cu2Sb4Te3I2_6_5287.vasp,Cu2Sb4Te3I2,-0.9761460027272727,0.6073661809090878 -Sc4Te10O26_2_16264.vasp,Sc4Te10O26,-4.4011175292499995,0.07644395250000002 -Hg8As4Cl8_10_8104.vasp,Hg8As4Cl8,0.068195758,0.26114340399999997 -Cu2S5_21_5263.vasp,Cu2S5,-1.3916459,0.5088211349702362 -Ir2F4_65_8784.vasp,Ir2F4,-1.9789940266666666,0.6867127677777758 -Mg6_129_10600.vasp,Mg6,0.09603454333333333,-0.318213865 -Ta4Cl16_12_18018.vasp,Ta4Cl16,-2.9283204125,0.027173067500000148 -Sr4Fe2Br2O6_129_17432.vasp,Sr4Fe2Br2O6,-3.6526357357142856,0.019389411428571535 -Cu2Ag2I8_2_5005.vasp,Cu2Ag2I8,0.44305567916666666,0.1649372874652783 -K2S4Br2F8_1_9332.vasp,K2S4Br2F8,-1.660268165,0.3324438210351562 -Hg1Pb2O2F2_12_7898.vasp,HgPb2O2F2,-2.23661586,0.049797058095236824 -Si4O4_57_16498.vasp,Si4O4,-5.0099747425,0.5449972049999997 -Co2Te2Cl2_59_4033.vasp,Co2Te2Cl2,-1.4954407433333332,-0.11655998861111094 -Co5Pd1S12_1_4091.vasp,Co5PdS12,-2.5824409327777778,0.3361335224999973 -Lu2Cl6_162_10306.vasp,Lu2Cl6,-2.8611188225,0.0683992524999999 -Cu1H4C10S4N4Cl2_2_4896.vasp,CuH4C10S4N4Cl2,-5.181081944400001,0.30619383874999917 -Pb2Br2N2_59_14218.vasp,Pb2Br2N2,-2.2031421116666667,0.45976778749999747 -Sb2Pb2O6_147_15641.vasp,Sb2Pb2O6,-3.47438012,0.5269035188750002 -Se12N12_7_16282.vasp,Se12N12,-3.5135741858333334,0.5055771135416665 -W2Se2N1_164_20545.vasp,W2Se2N,-4.652053878,-0.2297466486666666 -Pb4O6_129_14315.vasp,Pb4O6,-3.236985677,0.18001975724999708 -Sb4O8_11_15794.vasp,Sb4O8,-4.180096630833334,0.23798023624999942 -Pb1Br2_187_14174.vasp,PbBr2,-1.0455987233333335,0.14832528666666667 -Ho1S1_99_8118.vasp,HoS,-3.468838165,0.6213669799999995 -Zr5B1P1Se1S2Br2_8_21859.vasp,Zr5BPSeS2Br2,-4.459995500833333,-0.047889538229176354 -Ni2Se2_129_13640.vasp,Ni2Se2,-0.6716421125,0.12452549249999934 -Bi1H2O2_164_2338.vasp,BiH2O2,-3.660171624,0.24067771216666545 -Cr2Ag2As4O12_1_4292.vasp,Cr2Ag2As4O12,-3.847981177,0.2265278759999957 -Ru2Se2_67_15360.vasp,Ru2Se2,-2.10297536,1.3424614762500002 -Zn2Ga2Te5_156_21086.vasp,Zn2Ga2Te5,-0.9023324188888888,-0.31516757555555613 -Zr2N1_164_21606.vasp,Zr2N,-5.52024023,0.7794848983333289 -W2Se6_11_20555.vasp,W2Se6,-3.132874625,-0.012282209166666558 -In4Se4I4_14_8694.vasp,In4Se4I4,-1.2438711441666668,0.07865912354166649 -Ag1Cl1O4_111_46.vasp,AgClO4,-1.9509610266666666,0.33025447999999824 -Ir2Cl8_1_8781.vasp,Ir2Cl8,-1.217906873,0.16998600649999984 -P10S10_26_13900.vasp,P10S10,-3.1924993255,0.3212759566484378 -Ba1Nb2S7_123_1845.vasp,BaNb2S7,-3.87402074,0.41752298949999256 -Ge4O8_14_6935.vasp,Ge4O8,-4.6482441875000005,0.23638802999999964 -Na2Cd4S2Cl6O6_31_12026.vasp,Na2Cd4S2Cl6O6,-2.081686179,0.16183781831249977 -Li2Mn1P2S7F3_1_9989.vasp,Li2MnP2S7F3,-3.1382919686666666,0.057261344679160664 -Hf1V1Ge1Mo1Br8O2_6_7347.vasp,HfVGeMoBr8O2,-2.722070872142857,0.21842310745535287 -Ba2Tl1Cd1Cu1S5_99_2081.vasp,Ba2TlCdCuS5,-1.77659278,0.3489453035833301 -Hf1Nb1S2I1Br3_1_7242.vasp,HfNbS2IBr3,-3.03961193125,0.055750692343750685 -Cu2F6_162_5095.vasp,Cu2F6,-0.89794958875,-0.08945283375000002 -Ca2In2Br6_51_3058.vasp,Ca2In2Br6,-1.480256279,0.20697046900000016 -Mn2In2Te5_156_11129.vasp,Mn2In2Te5,-1.4370531733333332,0.18071334015325513 -In4Te4O12F4_14_8702.vasp,In4Te4O12F4,-3.5750213758333333,0.04692354791666675 -Nb2Co4S6_11_12696.vasp,Nb2Co4S6,-3.4807727491666665,0.27065234194443877 -Ga2Co1Se4_156_6327.vasp,Ga2CoSe4,-2.1447753914285714,0.1489411542380905 -Cr2Sb2Te6_157_4485.vasp,Cr2Sb2Te6,-1.647865978,0.3035180350999961 -Al2Hg1O4_164_871.vasp,Al2HgO4,-4.248935238571429,0.3452597509523788 -Tm2Br2F2_129_19670.vasp,Tm2Br2F2,-2.946344778333333,0.4004936194444416 -Hf4Te4F4_7_7823.vasp,Hf4Te4F4,-3.9973452325000003,0.3391809020833283 -In1Ir1S1Br2O1_6_8278.vasp,InIrSBr2O,-2.315425553333333,0.3922437433796239 -Tl2S2_187_19504.vasp,Tl2S2,-1.332714175,0.26310950609375006 -Ca1Pb1S1Cl1_1_2868.vasp,CaPbSCl,-1.79759055,0.10871815062499995 -Mg1Ge2_164_10368.vasp,MgGe2,-1.9229513066666666,-0.45807120583333333 -Ag2P4S3I2_6_362.vasp,Ag2P4S3I2,-2.0388763300000003,0.12922905261363482 -Ga1Ag1P2Se4S2_1_6117.vasp,GaAgP2Se4S2,-2.403675355,0.09294460168452112 -Co1B4I2N2F4_47_3703.vasp,CoB4I2N2F4,-4.108362226923076,0.2766313695031978 -Sb16I4_10_15424.vasp,Sb16I4,-1.7278353725,0.10510363599999883 -V4Bi4O20_14_20308.vasp,V4Bi4O20,-4.307966228571429,0.4411846794642827 -K4Tc2N2O4F10_59_9520.vasp,K4Tc2N2O4F10,-3.277593839090909,0.3024377395201931 -V4Te6_11_20378.vasp,V4Te6,-2.438952726,0.10938128999999996 -Cu2Te3P4Br2_6_5345.vasp,Cu2Te3P4Br2,-1.715148079090909,0.23986295953227663 -Hg2Te2Cl2_59_8028.vasp,Hg2Te2Cl2,0.23215108833333334,0.28417069815972107 -Al2Cr1Te4_164_816.vasp,Al2CrTe4,-2.0780272357142855,0.23028644374999635 -Nb1Si1Te1S1_1_12582.vasp,NbSiTeS,-3.818361015,0.45319827516571476 -Mn2As2Se4I2_10_10985.vasp,Mn2As2Se4I2,-1.90364765,0.09261910374999727 -Tl1Cu1As2O6_149_19249.vasp,TlCuAs2O6,-3.204143963,0.6343249619999952 -Ba4S4_2_2174.vasp,Ba4S4,-2.8282524325,0.5646523548437501 -Mo1W1Se2Cl2_6_11554.vasp,MoWSe2Cl2,-2.863824943333333,-0.01917665444444383 -Ru2Cl6_162_15310.vasp,Ru2Cl6,-1.59498983375,0.2485098062500002 -Ag1Sb2F12_2_122.vasp,AgSb2F12,-2.131082664,-0.009410556466669884 -K2Cd4Te2S6F6_31_9072.vasp,K2Cd4Te2S6F6,-1.354240562,0.318078589520831 -Zn2Cr4O10_59_21065.vasp,Zn2Cr4O10,-3.9474962775,0.21655303890624977 -Hf1V1Se2N1_156_7357.vasp,HfVSe2N,-5.085446954,0.23087519800000056 -As2Se2_2_1303.vasp,As2Se2,-2.452006815,0.254878124166664 -Mn1Zn1Se4_10_10946.vasp,MnZnSe4,-1.4335260216666665,0.3319849951388874 -Ba2Zr1S4_123_2093.vasp,Ba2ZrS4,-3.8522260971428572,0.2067259100000003 -Li3Sb2P3O12_5_10149.vasp,Li3Sb2P3O12,-4.998033679000001,0.20223473949999482 -Li2F1_164_9899.vasp,Li2F,-2.6203642166666667,-0.011873864444446935 -Sc4B3_164_16225.vasp,Sc4B3,-3.83160605,0.3428291667857102 -Bi2I6_31_2469.vasp,Bi2I6,-0.26347828125,0.22627574499999997 -Na4Se2O10_51_12418.vasp,Na4Se2O10,-2.900779191875,0.7075345714062503 -Mo2P2Se6_2_11658.vasp,Mo2P2Se6,-2.8067216200000003,0.24810051187499726 -As2Pb2S6F2_7_1259.vasp,As2Pb2S6F2,-2.4767138791666667,0.4521272151504602 -Cu2C4S8F4_2_5073.vasp,Cu2C4S8F4,-3.0663574944444445,0.3826920696064726 -Fe3B2S2F2_187_6047.vasp,Fe3B2S2F2,-2.622821785555556,0.396481743287034 -Pb1C1_156_14176.vasp,PbC,-2.45085103,2.271404735 -Co1Cu1Ni1Te2_8_3731.vasp,CoCuNiTe2,-0.42393786,0.713090869666664 -Li4C10O14_13_10168.vasp,Li4C10O14,-5.420140435,0.7341939417857013 -Ga2Te2O8F2_11_6507.vasp,Ga2Te2O8F2,-3.299801187142857,0.5171211896428503 -Sc7Cl10_12_16277.vasp,Sc7Cl10,-2.812903804117647,0.0715146953921546 -Li2Pd1_187_10042.vasp,Li2Pd,-1.36579023,0.47770594333333327 -Pb2Br8_1_14225.vasp,Pb2Br8,-0.557665047,0.15610332300000024 -Na4Hg2Cl8_11_12393.vasp,Na4Hg2Cl8,-0.9940176171428572,0.13939393892857055 -Cr2Cl6_189_4355.vasp,Cr2Cl6,-1.66198155125,0.022158431250000055 -Zr1Nb2Br1N2Cl1O1_8_21364.vasp,ZrNb2BrN2ClO,-5.6274773175,0.25869236968749965 -Ti4Zn4Ge8O24_14_19172.vasp,Ti4Zn4Ge8O24,-4.94787078025,-0.010020153416669952 -Si2N2_164_16412.vasp,Si2N2,-6.32478618,-0.8592785812499999 -Ca2Ni2Sn2_129_3079.vasp,Ca2Ni2Sn2,-0.30867657833333334,0.31170995166666665 -Sb1S2_187_15495.vasp,SbS2,-2.3385276566666664,0.4344474098958311 -Cu4S4_2_5460.vasp,Cu4S4,-1.14664971625,0.21575399541666673 -Os2F8_14_13849.vasp,Os2F8,-2.540554393,0.016817853599999877 -Li8O2_123_10286.vasp,Li8O2,-2.602842877,0.217166087666667 -Pt2Pb8_125_14648.vasp,Pt2Pb8,-1.0578561519999998,0.5437769110000001 -V2Cl6_162_20038.vasp,V2Cl6,-2.0494567875,0.1827227549999999 -Ag1N1O3_143_88.vasp,AgNO3,-3.3735254419999996,0.13103334200000072 -Zr5Zn1Si1Ni1B1P1Se1Cl5_1_21860.vasp,Zr5ZnSiNiBPSeCl5,-3.303034375,0.26508022431174816 -Cs2Hg4Te2S6I6_31_4748.vasp,Cs2Hg4Te2S6I6,-0.3680993025,0.24192277993750066 -Ba1Ge2_164_1833.vasp,BaGe2,-1.4561412433333334,1.265976716666667 -Li4Ni4P4O16_4_10209.vasp,Li4Ni4P4O16,-4.4965496060714285,-0.09146223314285928 -Mg2Te3O8_5_10525.vasp,Mg2Te3O8,-3.854449456153846,0.20942680384615375 -Sr2H4Se4O12_2_17239.vasp,Sr2H4Se4O12,-4.0254005936363635,0.07038403053030384 -Cu4H4S4I4_14_5417.vasp,Cu4H4S4I4,-1.3273244575,0.15451436486606984 -W6Se4Cl2O16_6_20595.vasp,W6Se4Cl2O16,-4.2953331467857145,0.9108868537083261 -Zr3N2O2F2_5_21773.vasp,Zr3N2O2F2,-6.102459273333333,0.4913227266666609 -Ta1Ag1Ge1S4Cl2_1_17504.vasp,TaAgGeS4Cl2,-2.9477554922222224,0.07448505479165923 -Ge1O2_164_6684.vasp,GeO2,-4.798230226666667,0.08640199083333311 -Ga1Ni5F2_123_6222.vasp,GaNi5F2,-0.20155476125,0.35078091030647335 -Te8Cl8_2_18693.vasp,Te8Cl8,-0.9673054525,0.23639028171874998 -Hf2Ti2Te8_6_7654.vasp,Hf2Ti2Te8,-3.4298082358333333,0.25942531166666694 -Sr2Co1O3_123_17189.vasp,Sr2CoO3,-3.873727395,0.02092579499999747 -H4Au2C6Br2_2_7056.vasp,H4Au2C6Br2,-4.087703219285714,0.3348145574999988 -Mn1S2_115_10852.vasp,MnS2,-2.6393918933333333,0.7214527841666665 -Te8As2Pd3_164_18687.vasp,Te8As2Pd3,-1.3300962823076925,0.41540109276922865 -Tl1Ag1As2O6_149_19198.vasp,TlAgAs2O6,-3.168043429,0.439246889500001 -Na4Cu4O4_123_12384.vasp,Na4Cu4O4,-1.7022010908333334,0.7652528342592564 -Bi2I2O2_129_2463.vasp,Bi2I2O2,-2.425826315,0.04774414999999976 -Ca2Cu2_191_3010.vasp,Ca2Cu2,0.5355713475,0.08700629500000001 -Sn2As2S6_7_16728.vasp,Sn2As2S6,-2.62389895,0.1479420773750002 -Ba2H12C8O14_2_1988.vasp,Ba2H12C8O14,-5.231014295833333,0.20179963499998643 -Co1H2_115_3743.vasp,CoH2,-2.22342371,1.55204914333333 -Li4Ga4Cl16_14_10191.vasp,Li4Ga4Cl16,-1.9680994079166665,0.07317840375000029 -Cu2Hg1I4_10_5153.vasp,Cu2HgI4,0.7018696357142857,0.2794393257142857 -Ta2P2O6_162_17820.vasp,Ta2P2O6,-6.015116337,0.6967146979166606 -Li2N2F4_67_10006.vasp,Li2N2F4,-2.65424963375,0.5565996516666623 -Al2Si2Te2_164_988.vasp,Al2Si2Te2,-2.9118863483333333,-0.37800187333333557 -Na2Hg4Te2Cl6O6_31_12171.vasp,Na2Hg4Te2Cl6O6,-1.4417357000000002,0.22740586987499994 -Os2Cl2_5_13841.vasp,Os2Cl2,-2.452797805,0.7688009193750001 -Pb2Cl8_2_14242.vasp,Pb2Cl8,-0.838520701,0.014360801000000117 -Ag4S16_14_540.vasp,Ag4S16,-1.6426691285000001,0.3153533370625001 -V2S5_12_20167.vasp,V2S5,-3.4109775171428574,0.2062012655357106 -Ti2Te2F2_59_19038.vasp,Ti2Te2F2,-4.09862397,-0.15290847111111905 -Li2C2F4_67_9848.vasp,Li2C2F4,-3.1017587825,1.0368350818749996 -Sb2S2O1_1_15680.vasp,Sb2S2O,-3.054273804,0.2342184318333307 -Ge2Sb2H6N2O6_7_6847.vasp,Ge2Sb2H6N2O6,-4.3601877149999995,0.11986706115739956 -V1Cu1Te6As2_5_19821.vasp,VCuTe6As2,-1.667501432,0.3105225082777746 -Zr1I1F1_156_21309.vasp,ZrIF,-2.8474117833333334,0.41687149916666216 -Rb2B2Te2H6S6_1_14776.vasp,Rb2B2Te2H6S6,-2.792516557222222,0.3537338479629567 -Mg1Fe1S2Br1Cl1_1_10361.vasp,MgFeS2BrCl,-1.9029863616666667,-0.03367387680555567 -Ga1As1_156_6134.vasp,GaAs,-2.234465185,-0.53490766 -Hf3Bi2Sb1Br1N3O2_1_7689.vasp,Hf3Bi2SbBrN3O2,-5.484493374166667,0.1550330547222068 -Ta1Se1Br1_156_17615.vasp,TaSeBr,-3.696058966666667,0.3170180958333335 -Mg4Ti2_51_10588.vasp,Mg4Ti2,-1.6354476766666668,0.4922371377777761 -Na2Se4O12_7_12300.vasp,Na2Se4O12,-3.357425473888889,0.19280340138888508 -Sr2In1Ag1Hg1O5_99_17262.vasp,Sr2InAgHgO5,-2.53330807,0.31196346499999994 -Sn6Bi6_2_16982.vasp,Sn6Bi6,-1.1324901841666668,-2.202767929166667 -In2Si2S2_164_8601.vasp,In2Si2S2,-2.875820935,-0.3593244750000023 -P8_55_14163.vasp,P8,-3.62658371625,0.41941226875000037 -La4Br10_11_9623.vasp,La4Br10,-2.513129636428572,0.10745980499999952 -Ba4Tl4Cu2O12_53_2198.vasp,Ba4Tl4Cu2O12,-2.6045843695454547,0.71503858420454 -Ge1Se2_115_6708.vasp,GeSe2,-2.48535124,0.1187816372222219 -Ba4P2_59_2167.vasp,Ba4P2,-1.8920006083333334,0.2625303791666658 -Mg2Ni2Ge2_129_10489.vasp,Mg2Ni2Ge2,-0.9451517983333333,0.41502248666666675 -Ni1C8I2F4_25_13308.vasp,NiC8I2F4,-4.304957522666667,0.5092446202499974 -As1Pb2Se6_162_1161.vasp,AsPb2Se6,-1.79077846,0.4408760393981437 -Mn2Al2S5_38_10953.vasp,Mn2Al2S5,-3.440291618888889,-0.17001221499999963 -Na2Ti2I2N2_59_12326.vasp,Na2Ti2I2N2,-4.27234223375,-0.03796557374999976 -Sc2Te2_164_16178.vasp,Sc2Te2,-2.8738307675,0.3330107025000002 -Fe4N3O2F2_164_6082.vasp,Fe4N3O2F2,-3.1073744545454547,0.8178493246212094 -Nb6Si2Te12_26_13199.vasp,Nb6Si2Te12,-3.4743434100000004,0.045979156312495495 -Ti2S2Br2_59_18995.vasp,Ti2S2Br2,-4.212976675,0.04153447666666654 -Cd2Se2_129_3573.vasp,Cd2Se2,-0.08072489,-0.464192475 -Nb2Co2S6_11_12690.vasp,Nb2Co2S6,-3.8991593790000003,0.23745422999999688 -Tl3Se4_164_19581.vasp,Tl3Se4,-1.2268939785714286,0.1662402324404748 -Hf1Zr1S4I2_1_7394.vasp,HfZrS4I2,-3.441851145,0.30427892312499494 -Cu2H4C4O8_14_5121.vasp,Cu2H4C4O8,-4.67010662,0.4897422167592532 -Mn1S2F2_12_10851.vasp,MnS2F2,-2.360249016,0.3725115797500005 -Tl2Se2_129_19534.vasp,Tl2Se2,-1.1135912175,0.18628842354166664 -U2I6_59_19715.vasp,U2I6,-2.3474694675,0.07421881000000008 -Rh1Br2_187_15145.vasp,RhBr2,-0.5397504766666666,0.7474958344444433 -Fe2O2_164_5892.vasp,Fe2O2,-2.8886386525,0.6570866860416644 -Tm1Cu2S2_164_19663.vasp,TmCu2S2,-2.051683268,0.8896754420000001 -Cr2I2N2_59_4411.vasp,Cr2I2N2,-3.4259479416666667,0.06700477833333007 -Ag1Ge3Br8_1_67.vasp,AgGe3Br8,-1.1545998316666666,0.10118581973958307 -Pd1Cl2_187_14360.vasp,PdCl2,-0.33329996333333334,0.5421661011111111 -Al3Se4_164_1054.vasp,Al3Se4,-2.9166821428571432,0.03472386285714002 -Cu2Se4_12_5312.vasp,Cu2Se4,-0.9916694733333333,-0.7755794183333333 -Co2H4Se2O8_7_3918.vasp,Co2H4Se2O8,-3.821794121875,-0.013270890833335769 -Ta4Ni6Te10_31_18073.vasp,Ta4Ni6Te10,-2.280828718,0.04982026199999812 -Cr2As2O10_129_4306.vasp,Cr2As2O10,-4.5071127635714285,-0.010819983869050975 -Li1Tl1Br4O12_2_9803.vasp,LiTlBr4O12,-2.361610456111111,0.190998000069442 -H2Os1_187_6999.vasp,H2Os,-3.5403701633333333,1.639618963333329 -Ta4N3Cl2_164_18058.vasp,Ta4N3Cl2,-6.608504625555556,0.4725081933333197 -Ag2Au4S4_7_176.vasp,Ag2Au4S4,-0.501165427,0.1267911279999991 -Mn2Cr1O6_12_11061.vasp,Mn2CrO6,-4.522661847777778,0.05987658923610226 -Nb4N3F2_164_13095.vasp,Nb4N3F2,-6.551148845555556,0.027956768740733162 -Ge1F2_115_6662.vasp,GeF2,-2.7629547366666665,0.3817384350000004 -Cr2Cl10_10_4349.vasp,Cr2Cl10,-1.1978557633333333,-0.007337380833334364 -Cd1Te1_156_3436.vasp,CdTe,0.56167619,-0.30769956499999995 -Ca4Mg2Si4O14_113_3219.vasp,Ca4Mg2Si4O14,-5.259394039583333,0.42175716597221635 -V1Mo2O4F2_8_19885.vasp,VMo2O4F2,-4.551086078888889,0.08180832370369936 -Mn1Cu1Cl6_1_10683.vasp,MnCuCl6,-0.90761253375,0.08350626937500005 -Ag2Sb4Se3I2_6_417.vasp,Ag2Sb4Se3I2,-1.157923941818182,0.203925155909088 -Cr2O5_12_4442.vasp,Cr2O5,-4.74789504,-0.13858947964286117 -Ni2Sb2Pd2_129_13609.vasp,Ni2Sb2Pd2,-0.8604243933333334,0.31846352086666396 -Te2Pb1_115_18447.vasp,Te2Pb,-0.8661658766666666,-0.38274874111111146 -Nb1Ga1S2Br2_6_12510.vasp,NbGaS2Br2,-2.9137739083333334,0.2065386218749965 -Ta2Te2Pd4Se2_51_17906.vasp,Ta2Te2Pd4Se2,-2.8884239220000003,0.07524317497618638 -Hg3Bi1_187_8052.vasp,Hg3Bi,1.9809558575,0.2565762115948276 -Cu2Sb2Te4_26_5271.vasp,Cu2Sb2Te4,-1.02135876875,0.29457770656249993 -Sr2Mn2Sn2_129_17277.vasp,Sr2Mn2Sn2,-0.7070076916666667,0.7039102275862058 -Al1Se1_156_736.vasp,AlSe,-2.140556915,0.8078021300000002 -Si1Hg2S4_21_16342.vasp,SiHg2S4,-1.5156097642857145,0.2656075357142835 -C2F6_1_2747.vasp,C2F6,-3.2371474875,0.37830890312499965 -In1Pt5Cl2_38_8322.vasp,InPt5Cl2,-1.31114236625,1.1794590833333318 -Be2Sb1_115_2267.vasp,Be2Sb,-1.5970115566666667,0.6649493241666647 -W2S2_129_20531.vasp,W2S2,-4.1517195725,0.9571062074999999 -Ga1N1_187_6212.vasp,GaN,-4.30953919,0.6914813400000002 -Cu2As2O6_2_5008.vasp,Cu2As2O6,-3.111804562,0.6284194941249966 -Ga2Se2Cl2_59_6469.vasp,Ga2Se2Cl2,-1.922817215,0.19923410666666652 -Rb4Br2_51_14962.vasp,Rb4Br2,-0.15303553666666667,0.1537608299999998 -Nb3Br3Cl1O4_8_12954.vasp,Nb3Br3ClO4,-4.716696325454546,0.15389073488635407 -S4I4_2_15397.vasp,S4I4,-0.96869319125,0.14961372437499998 -Ta3Te1Br7_156_17995.vasp,Ta3TeBr7,-2.9413219372727273,0.04370664821495951 -Np2I2O2_129_13782.vasp,Np2I2O2,-5.94453408,0.08222999499999517 -Cr1Sb1Br2_5_4253.vasp,CrSbBr2,-1.38251127,0.29596335979166444 -Re1Se2_164_15022.vasp,ReSe2,-3.8326487399999998,0.3291150983333333 -Al1Ni1S2Br2_25_691.vasp,AlNiS2Br2,-1.8473723233333335,0.1057550856770793 -Zn2Mo2F10_1_21116.vasp,Zn2Mo2F10,-2.3093734685714287,0.17409232544642472 -Cu2Ge2O6_51_5099.vasp,Cu2Ge2O6,-3.6225989640000003,0.29729576574999705 -Ga2Fe1O4_164_6347.vasp,Ga2FeO4,-4.312340465714286,-0.07452058160714636 -Rh2Se2F2_11_15237.vasp,Rh2Se2F2,-2.3331527949999997,0.08534531500000053 -Cs2Cd4Cl6O8_31_4683.vasp,Cs2Cd4Cl6O8,-1.391899429,0.34163746225000013 -Ge1Au1Se2_8_6639.vasp,GeAuSe2,-1.51683444,0.2666826568220899 -Mg8Si8O24_14_10604.vasp,Mg8Si8O24,-5.62017505525,0.110333392999995 -K2Al4Br14_7_8973.vasp,K2Al4Br14,-1.5517198425,0.07255189299999998 -Te2W1_164_18523.vasp,Te2W,-2.7137961333333336,0.33110181833333296 -V1P2Au1S6_5_19897.vasp,VP2AuS6,-2.934604424,0.12037722167856818 -Cr4P4O20_2_4618.vasp,Cr4P4O20,-5.246407197142857,-0.08278050601190773 -Rh1S2_187_15167.vasp,RhS2,-2.530384826666667,0.6503830766666636 -Sc1O2_187_15971.vasp,ScO2,-5.222811006666666,0.8414287891666623 -Nb3Ni3S14_6_12990.vasp,Nb3Ni3S14,-3.2390764345000003,-0.22827777359375306 -Be1Si2_164_2233.vasp,BeSi2,-3.3463771700000002,-0.6025585416666697 -Lu4H12O12_14_10323.vasp,Lu4H12O12,-5.046677743571428,0.11694274976190089 -As4S4_14_1360.vasp,As4S4,-2.91890681,0.09099315843749967 -Sr2Co2Si2_129_17192.vasp,Sr2Co2Si2,-2.1560995983333333,0.1514959450000002 -Tl2O2_164_19469.vasp,Tl2O2,-2.0073167125,0.40060847729166404 -Au2Br4_14_1457.vasp,Au2Br4,0.3150650883333333,0.1328354004166668 -Al1S1_123_721.vasp,AlS,-2.717699075,0.8023758689583307 -Ge1Bi1Br2O2_99_6643.vasp,GeBiBr2O2,-2.800765801666667,0.1080801584722213 -Zr1Au1Br2O1F2_1_21249.vasp,ZrAuBr2OF2,-2.625321157142857,0.4756580983928551 -P2Pd2S6_162_14023.vasp,P2Pd2S6,-2.7075070759999997,0.1741782567962905 -Sn2Te6_4_16904.vasp,Sn2Te6,-1.29470419125,-0.49094732291666665 -Ce1Al3Cu1_99_3641.vasp,CeAl3Cu,-1.588493066,0.8536313659999999 -Sn4P6O20_11_16953.vasp,Sn4P6O20,-5.0734473226666665,0.11328254774998481 -Ru1S2_164_15292.vasp,RuS2,-3.098150656666667,0.5165928716666666 -Nd1Te3_191_13230.vasp,NdTe3,-1.768721125,0.8530190062500003 -Ta4Ni4Se8_53_18069.vasp,Ta4Ni4Se8,-3.248534446875,0.09394708962499831 -In2S2F2_59_8547.vasp,In2S2F2,-2.434642783333333,0.15531257000000043 -Na2Ti2As2O1_123_12319.vasp,Na2Ti2As2O,-4.382126785714286,0.0815562762834674 -Sr4Cu4W2O14_6_17431.vasp,Sr4Cu4W2O14,-3.8622430220833333,0.5934423825694327 -Fe2W2I2O8_129_6031.vasp,Fe2W2I2O8,-4.203975379285715,0.10389950672618742 -Cd2Se2F2_59_3570.vasp,Cd2Se2F2,-0.6735750266666667,0.15774987722222086 -Mn1Si1Ge1Te1Se1_8_10882.vasp,MnSiGeTeSe,-2.642712652,-0.1345423120937531 -Zr3B2Te2H2_187_21746.vasp,Zr3B2Te2H2,-3.9948082822222224,0.4231544133333296 -Hf2B1H2_164_7437.vasp,Hf2BH2,-5.166061426000001,0.37707890099999464 -Zr1Ni1S1I2_1_21380.vasp,ZrNiSI2,-1.8527811379999999,0.48532245941666685 -Li2Sn1O6F6_162_10070.vasp,Li2SnO6F6,-2.291759220666667,0.9755964384999998 -As1F3_187_1147.vasp,AsF3,-2.2312491225,0.609037876875 -Si2Br6_1_16391.vasp,Si2Br6,-1.48877093375,0.16727897687500007 -Zn2W2Se2S12_18_21197.vasp,Zn2W2Se2S12,-2.506835067222222,0.37791594282870106 -Si2Te2_59_16459.vasp,Si2Te2,-2.3801101175,0.14557781374999967 -Tl2I6O18_147_19438.vasp,Tl2I6O18,-2.4741314257692304,0.14346112420672572 -Cr3O8_164_4570.vasp,Cr3O8,-4.508085835454545,0.0443041901704504 -Sb2Se2_12_15699.vasp,Sb2Se2,-1.9778852225,0.36989248124999774 -Tl4As4S8_4_19588.vasp,Tl4As4S8,-2.301151193125,0.4069815615625001 -Hg1Te2_115_7919.vasp,HgTe2,0.17655418666666667,0.3831714244444443 -Mo2Os1Br2Cl2O3_1_11653.vasp,Mo2OsBr2Cl2O3,-3.138470411,0.26823892399999993 -Mg4Sb2_59_10581.vasp,Mg4Sb2,-0.657166905,0.3934878900694444 -Nb2Bi1Te6Pt1_1_12638.vasp,Nb2BiTe6Pt,-2.492737166,0.2452193622083279 -Cd1Cu1Te2Br2_6_3305.vasp,CdCuTe2Br2,-0.21247741666666667,0.24858898986110992 -Zr1Zn1H1Pd1O6_1_21492.vasp,ZrZnHPdO6,-3.9619820040000002,0.31899064927083076 -Co2H9C15N6O6_157_3922.vasp,Co2H9C15N6O6,-5.9224913576315785,0.22949525317433034 -Ag2S2I2_59_380.vasp,Ag2S2I2,-0.34686110166666667,0.29411829479166607 -Sr1Cu2F12_115_17042.vasp,SrCu2F12,-1.1753082966666668,0.04093443808333189 -Hf1Pd1Cl6_149_7263.vasp,HfPdCl6,-2.23428564375,0.07226329510416685 -K6O3_143_9542.vasp,K6O3,-1.3414257144444446,0.19896887555555542 -Hf1Mn1Br2O2_1_7208.vasp,HfMnBr2O2,-4.149868573333333,0.38521207125000023 -Co2Mo2S8Cl2_129_3933.vasp,Co2Mo2S8Cl2,-2.2974766200000003,0.7267885304813633 -Zr2H2C1_164_21577.vasp,Zr2H2C,-5.144862028,0.28031043399999955 -In2Te4Pd1_164_8633.vasp,In2Te4Pd,-1.33500568,0.10456466941176329 -Zn8Se4Cl8O12_14_21241.vasp,Zn8Se4Cl8O12,-2.1235169859375,0.04150818843750015 -Mn2S2Br1Cl1_25_11213.vasp,Mn2S2BrCl,-2.2416570300000003,0.2083827972916663 -Ge2Te1Se1_1_6879.vasp,Ge2TeSe,-2.38537399,-0.20360665500000008 -Ir1Cl2_187_8733.vasp,IrCl2,-0.84121542,1.234739838888887 -Te2Ir1_187_18387.vasp,Te2Ir,-2.02982646,0.4136758999999999 -Co2Te6P2_162_4051.vasp,Co2Te6P2,-1.947878451,0.45853623350000017 -Mg3Si2O9_157_10564.vasp,Mg3Si2O9,-4.732565927857143,0.5133066133035666 -Na2Ti2C2Br2_59_12321.vasp,Na2Ti2C2Br2,-4.31360248,-0.09544645500000026 -Co1F2_115_3733.vasp,CoF2,-1.8235043,0.49122026249999995 -Sb2Ir2O6_162_15597.vasp,Sb2Ir2O6,-4.119570642,0.4456999752499953 -Ag2Te6As2_2_486.vasp,Ag2Te6As2,-1.058867686,0.2981015723333319 -K8Ba2V4S16_49_9548.vasp,K8Ba2V4S16,-2.7491108509999997,0.1291700010000003 -Si3Sb2S9_174_16479.vasp,Si3Sb2S9,-3.2245813321428574,0.2719164235714251 -Rb4Hg4Sb4Se12_14_14975.vasp,Rb4Hg4Sb4Se12,-1.06941723625,-0.05036488291666763 -Ru2Br8_14_15305.vasp,Ru2Br8,-0.8472112900000001,0.282206153 -Mn1Br2_187_10658.vasp,MnBr2,-0.93944742,0.34321997083333344 -Hf3Se1Cl4_191_7729.vasp,Hf3SeCl4,-3.59785568625,0.30033347812499644 -Cd1Sn2S2I2_12_3434.vasp,CdSn2S2I2,-1.11328479,0.10917208690475944 -Sc1Nb1Se4_3_15962.vasp,ScNbSe4,-3.5234277583333333,0.43210370770832984 -Na1Pb2C2O7_187_11926.vasp,NaPb2C2O7,-4.7848240675,0.16014815364583068 -Ba4P4H4Se8_14_2169.vasp,Ba4P4H4Se8,-2.8297617195,0.3001678900937465 -Pt1Cl2_164_14569.vasp,PtCl2,-0.5600165133333334,0.5580235483333335 -Hf2Br2_129_7448.vasp,Hf2Br2,-3.1056024125,0.7964163549999999 -Te2As2_12_18359.vasp,Te2As2,-2.0694883575,0.22693857833333064 -V1Cl2_164_19799.vasp,VCl2,-2.28232817,0.06520217666666639 -V1Se1O1_156_19927.vasp,VSeO,-4.214275003333333,0.1979963933333333 -H2S1O4_5_7029.vasp,H2SO4,-4.287746371428571,0.041478721428571674 -Cu4Se12Br4_53_5464.vasp,Cu4Se12Br4,-1.0231968175000001,0.30618800966666443 -K2Os2N2Cl10O2_2_9280.vasp,K2Os2N2Cl10O2,-2.4949288694444447,0.023799844999999653 -Hf4H2C3_164_7784.vasp,Hf4H2C3,-6.741239442222222,0.17366769629629086 -W2Se2_164_20550.vasp,W2Se2,-4.0470693125,0.25090275750000046 -Ca2Ag1O2F2_38_2905.vasp,Ca2AgO2F2,-2.8905988685714283,0.3720974601785658 -Pb4W4O16_53_14324.vasp,Pb4W4O16,-5.103530732916666,0.25746927625000016 -Te2Pt2F2_59_18483.vasp,Te2Pt2F2,-1.66477362,0.5074858083333306 -Li4Bi4S8_29_10166.vasp,Li4Bi4S8,-2.691147031875,0.15158146312499987 -Te4As4_14_18563.vasp,Te4As4,-2.06004093875,0.23638599708333086 -Te4F4_2_18584.vasp,Te4F4,-1.6554857775,0.3476831037499999 -Ca2Co2Si2_129_2989.vasp,Ca2Co2Si2,-2.2419357083333336,0.3168618749999987 -Nb2B1H2O2_164_12629.vasp,Nb2BH2O2,-5.597535328571429,0.253601151785702 -Hf1Fe1Te2O1_8_7164.vasp,HfFeTe2O,-3.5572986579999997,0.6098899630000014 -Ca1Ag1Br1Cl1_6_2789.vasp,CaAgBrCl,-0.611202515,0.767341069375 -Cd4F8_115_3626.vasp,Cd4F8,-0.9467492575,0.20221608916666667 -Te2W2_164_18534.vasp,Te2W2,-3.40554488,0.6325053762500001 -Ta4Pd2S10_13_18084.vasp,Ta4Pd2S10,-4.485531614375,0.1075506618750004 -Rh2Cl6_162_15185.vasp,Rh2Cl6,-1.39363073125,0.06465231999999999 -Nb1Cu1Br1Cl1O2_1_12494.vasp,NbCuBrClO2,-3.51151226,0.26203075843749557 -Ti1C1I2_8_18754.vasp,TiCI2,-3.3250342225,0.5535904893750001 -Be10Rh2_26_2210.vasp,Be10Rh2,-2.8964423016666667,0.608821339166667 -Ni2As2Pd2_129_13447.vasp,Ni2As2Pd2,-1.1730842816666667,2.3207656436111064 -Ag1Br2F1_47_35.vasp,AgBr2F,-0.054884935,0.2439960159375 -Sc2Se2_187_16159.vasp,Sc2Se2,-3.20915943,0.5827954874999999 -Tl2S1_164_19495.vasp,Tl2S,-1.1492945266666668,0.10584211499999996 -Cu1H4C6S2N6_6_4901.vasp,CuH4C6S2N6,-5.473199139473684,0.13886666206687448 -Cs2C2S2O6F6_4_4671.vasp,Cs2C2S2O6F6,-3.72548441,0.1360108832175888 -V2O2_6_20126.vasp,V2O2,-4.67300577,0.859824373333329 -Hf2Cl6_2_7481.vasp,Hf2Cl6,-3.25985083,0.09659106499999659 -Mn2Te4P2I2_26_11326.vasp,Mn2Te4P2I2,-1.6230694780000001,-0.35034050675000006 -Y2Se2F2_164_20777.vasp,Y2Se2F2,-4.407105761666666,0.5258976711111072 -As2S2_129_1292.vasp,As2S2,-2.42780225,0.5820977184374998 -Ga2Te2_187_6510.vasp,Ga2Te2,-1.7921591375,0.14104107833333335 -Ag2Se2_12_437.vasp,Ag2Se2,-0.322199125,-0.03524311749999995 -In18Se9_143_8172.vasp,In18Se9,-1.3991617088888888,0.7133129061111093 -Mn1In1Se4_10_10780.vasp,MnInSe4,-1.9743559433333333,0.19228883694444254 -Nb2Te2I2_59_12908.vasp,Nb2Te2I2,-2.680754241666667,-0.08479153293651354 -Be2Cl4_51_2250.vasp,Be2Cl4,-2.2745142499999997,0.3754891633333335 -Te4Os2_127_18603.vasp,Te4Os2,-1.8549289083333333,0.34694475999999974 -Li2O4F2_113_10034.vasp,Li2O4F2,-2.08115547375,1.178147256875 -K2Fe2Sb2_12_9104.vasp,K2Fe2Sb2,-0.45697475666666665,0.9454321416666653 -In4S4Br4_14_8682.vasp,In4S4Br4,-1.7933039741666665,0.07333419166666699 -Sc2Si1_164_16166.vasp,Sc2Si,-2.82831024,1.0170488744444413 -Th1Si2_123_18722.vasp,ThSi2,-4.11689336,0.853976086666667 -Mg3F6_12_10548.vasp,Mg3F6,-3.374461312222222,-0.25383564055555574 -Sr4In4I10_127_17442.vasp,Sr4In4I10,-0.834448015,0.5258536309259247 -Na6H4S2N2O16_11_12442.vasp,Na6H4S2N2O16,-4.2452860543333335,0.055019375388880354 -Sc1Pt1Au1O6_149_15983.vasp,ScPtAuO6,-3.5855061833333335,0.32188282291666415 -Ir2O2F2_59_8795.vasp,Ir2O2F2,-3.24633517,0.408689238888885 -Ge1Te1W1I3Cl1_1_6714.vasp,GeTeWI3Cl,-1.3884556557142855,0.4195253505803541 -Fe2B3_123_5802.vasp,Fe2B3,-3.53158429,0.5410548039999958 -V2C1_164_20023.vasp,V2C,-4.64464775,0.8636538174999995 -Ta3O5F5_47_17976.vasp,Ta3O5F5,-5.9169928423076925,0.06729756346153337 -Nb2Co4S4_51_12695.vasp,Nb2Co4S4,-3.524819644,0.20990914233333013 -Te2Ir2F2_59_18392.vasp,Te2Ir2F2,-2.2129345099999997,0.7315489608333303 -Ag2I6_162_321.vasp,Ag2I6,0.5820448,0.2176726634375 -Zn1Ga2S4_164_20937.vasp,ZnGa2S4,-2.376820867142857,0.1333145671428575 -Cu4S14_14_5440.vasp,Cu4S14,-1.7293809205555555,0.33051228428240553 -Na1Ti1O2_156_11942.vasp,NaTiO2,-5.4587645,0.35172215249999983 -Al1Cl2_164_629.vasp,AlCl2,-1.69853176,0.6014747838888868 -Ag1Bi1P2Se6_143_24.vasp,AgBiP2Se6,-2.142675377,0.07463456999999973 -Sn2As6_164_16731.vasp,Sn2As6,-2.38785288,0.39969082624999985 -Te10Rh5_1_18270.vasp,Te10Rh5,-1.8825040266666666,0.31951451555555543 -H8Au4O4_2_7091.vasp,H8Au4O4,-2.471226618125,1.1327649633333334 -Ba4As4H4Se8_14_2132.vasp,Ba4As4H4Se8,-2.692413865,0.5885741778958281 -Ag2Te3As4I2_6_470.vasp,Ag2Te3As4I2,-1.2234791618181817,0.19468928863636037 -Mg5Ti5_123_10596.vasp,Mg5Ti5,-2.772021521,0.6266299048333335 -Hf1Mn1I2N1_8_7215.vasp,HfMnI2N,-3.6278788,0.19388227477586234 -Ca3Mn2Cl2O5_123_3185.vasp,Ca3Mn2Cl2O5,-3.9856285175,0.07692370770833012 -Mn2Te4As2I2_26_11316.vasp,Mn2Te4As2I2,-1.490295864,0.2287247719999964 -Sn2Sb2S6F2_7_16866.vasp,Sn2Sb2S6F2,-2.3682367441666665,0.4096918591666642 -Pt2Se2I2_59_14676.vasp,Pt2Se2I2,-1.2860934116666667,0.09922551708333177 -Nb2Br2_129_12651.vasp,Nb2Br2,-2.9766493275,0.8636419009374998 -Hf2S10_59_7558.vasp,Hf2S10,-3.8090210125,0.2159174014583295 -Rb2F1_164_14838.vasp,Rb2F,-0.7873599466666666,-0.24435537000000035 -Bi2Te4_10_2576.vasp,Bi2Te4,-1.2264717033333332,0.34162086777777634 -As2Pb1S4_164_1247.vasp,As2PbS4,-2.7463205442857146,0.3755876404365046 -V4P4O28_14_20351.vasp,V4P4O28,-4.875969797777778,0.2938231652777734 -Ge1Te1_123_6715.vasp,GeTe,-1.75680968,-0.2935683549999999 -Tl2Co1F4_123_19397.vasp,Tl2CoF4,-2.0136368,0.02325133785714084 -Si4Te4P4_17_16518.vasp,Si4Te4P4,-3.207844510833333,0.24711184749999693 -Ba4Cu4Te8Br4O22_2_2149.vasp,Ba4Cu4Te8Br4O22,-3.283702922142857,0.09182313906745335 -Ag1Sb3Te6_143_125.vasp,AgSb3Te6,-1.2334419090000002,0.3035318464166662 -Na2Hf4Cu2Se10_59_12148.vasp,Na2Hf4Cu2Se10,-3.4750941783333333,0.12448734277777795 -Sn2P2_187_16825.vasp,Sn2P2,-2.58170198,0.19970604312499995 -Nb1As1Br1N2Cl1_1_12463.vasp,NbAsBrN2Cl,-4.412516915,0.12240113891110371 -Ho1Bi2_21_8114.vasp,HoBi2,-1.7024478533333334,0.16590374722222065 -Sb1Te6Pb2_162_15522.vasp,SbTe6Pb2,-1.1857628233333335,-0.2633006148148176 -Fe1Se1I2_8_5753.vasp,FeSeI2,-0.7738998525,0.16694583554687492 -Ca1I2_115_2848.vasp,CaI2,-0.9586267866666667,0.31398447799999984 -W4C3_164_20580.vasp,W4C3,-6.1338918200000005,0.5501197199999928 -Sb4S6_81_15819.vasp,Sb4S6,-2.578621541,0.22537157900000038 -Al2O3_164_916.vasp,Al2O3,-5.9183419200000005,0.20519291799999895 -Ta1Ni1I2_156_17587.vasp,TaNiI2,-1.4542414575,0.4783649659895812 -Hf1Se1Br2_25_7303.vasp,HfSeBr2,-3.0491437025,0.33002885875000043 -Cr3Te4_164_4582.vasp,Cr3Te4,-2.0147540171428573,0.14610862142856768 -Zn1Cd1Sb1Pd1Br1Cl2O3_1_20911.vasp,ZnCdSbPdBrCl2O3,-1.773890767,0.3393110208437445 -B2O3_1_1690.vasp,B2O3,-6.692233482000001,0.16210089333333322 -Fe1H4C2N6Cl2_6_5696.vasp,FeH4C2N6Cl2,-4.468103193999999,0.33411171616665203 -Cu4H12C8O8_2_5408.vasp,Cu4H12C8O8,-4.5899267196875,0.3870113785937508 -Sc1Mn1I1Br1N1_156_15953.vasp,ScMnIBrN,-3.05399331,0.20313741108331973 -K4S4O14_13_9506.vasp,K4S4O14,-3.963150957272727,0.12228642318181882 -Ni2S3Br3_1_13592.vasp,Ni2S3Br3,-0.87364208625,0.10124961304687286 -Hf1Fe1H6_156_7161.vasp,HfFeH6,-3.408655215,0.6939765831250002 -Hf3Te2C2F2_187_7734.vasp,Hf3Te2C2F2,-4.936977571111111,0.8007537008333219 -Re2Te6_11_15092.vasp,Re2Te6,-2.6471100775,0.38608250416666695 -Mn3B2S2F2_187_11357.vasp,Mn3B2S2F2,-3.138916058888889,0.6078345528067095 -Sr2H8O6_26_17246.vasp,Sr2H8O6,-4.341733920625,0.012829243541667257 -Ta4O8_6_18082.vasp,Ta4O8,-7.156574653333333,0.1984960353333266 -Bi12S12_7_2300.vasp,Bi12S12,-2.0034096341666667,-0.7144133875000009 -Pd2S2O8_3_14466.vasp,Pd2S2O8,-2.963099956666667,0.8311820033333328 -I3N1_187_8160.vasp,I3N,-0.1158902375,0.9815941920312501 -Sn1Te2_115_16701.vasp,SnTe2,-1.2162437533333332,-0.6684965144444448 -Ga2S2Cl2_59_6440.vasp,Ga2S2Cl2,-2.2596717666666666,0.13889963500000002 -Zr2Sn4_129_21695.vasp,Zr2Sn4,-2.2606799333333334,0.5154059866666665 -Sb1S1O1F1_6_15490.vasp,SbSOF,-2.9791287225,0.43378464093750013 -Cd1Br2_115_3286.vasp,CdBr2,0.12190459999999999,0.14178847083333332 -Sb2Pb2S6_7_15646.vasp,Sb2Pb2S6,-2.206288394,-0.01673385506250269 -Ru2Se1Cl2O1_1_15350.vasp,Ru2SeCl2O,-2.6379513933333336,0.45417953152777457 -Li2V6Te4O24_2_10136.vasp,Li2V6Te4O24,-4.858257628055556,0.057348703888888686 -Li2Cu2P2O8_18_9891.vasp,Li2Cu2P2O8,-4.391336572857143,0.15838764901785388 -Zn2Co4S10_11_21060.vasp,Zn2Co4S10,-1.997195520625,0.543792746125 -Nb4N3Cl2_164_13094.vasp,Nb4N3Cl2,-6.222015833333334,-0.048700298280437315 -Mn2Al2Te5_187_10959.vasp,Mn2Al2Te5,-2.040653525555556,0.011619064760098663 -Ti2B1H2O2_164_18885.vasp,Ti2BH2O2,-5.768950088571429,0.6154026257142813 -Os8S10_1_13898.vasp,Os8S10,-3.8198148077777776,0.7433577654166612 -Sb1O2_115_15471.vasp,SbO2,-3.8045157633333333,0.61356110375 -Ta2Ni4Te2Se2_26_17805.vasp,Ta2Ni4Te2Se2,-2.3101625169999997,0.03340957680000067 -Hf2Pb4_59_7557.vasp,Hf2Pb4,-2.1508480816666666,0.6569783050000001 -B2As2_129_1648.vasp,B2As2,-3.9849540625,0.8019086487499962 -Ta4F16_14_18034.vasp,Ta4F16,-4.274144157,0.27364904179999916 -Mg2W8O18_2_10539.vasp,Mg2W8O18,-5.285905466428572,0.7920616399854163 -As1S2_187_1173.vasp,AsS2,-2.482121693333333,0.887104880312497 -Re1N2_187_15012.vasp,ReN2,-6.620964076666667,-0.137666086388895 -Y2I2_164_20746.vasp,Y2I2,-2.6667929925,0.18844219833333087 -P4S10_31_14107.vasp,P4S10,-2.9957794057142855,0.19423803142857166 -Ca2Mg2_164_3062.vasp,Ca2Mg2,0.48131084,0.652578845625 -Te2Ru2F2_59_18515.vasp,Te2Ru2F2,-2.252141351666667,0.5478032222916634 -Na2Ca2B10H32O34_2_12015.vasp,Na2Ca2B10H32O34,-5.101996713125,0.039661945211801886 -K1Pb1Se2_156_8927.vasp,KPbSe2,-1.2686002325,0.46559608838541644 -Tl2Te6P2_147_19559.vasp,Tl2Te6P2,-1.440418234,0.3341318729999986 -Pd2Pt1S4Cl1_1_14454.vasp,Pd2PtS4Cl,-1.73467781375,0.396067948515625 -Mn2As2I2O4_26_10966.vasp,Mn2As2I2O4,-3.12609316,0.0891538042631505 -Si1I4_123_16346.vasp,SiI4,-0.34059006599999997,0.5480732160000001 -As6H2O12_4_1382.vasp,As6H2O12,-4.3843007335,0.05664189239999562 -Si2H2_164_16404.vasp,Si2H2,-3.7059833875,0.2019710050000001 -V2Sb2Te6_157_20176.vasp,V2Sb2Te6,-1.919088653,0.2689290111666647 -As8O12_51_1398.vasp,As8O12,-4.1270202985,0.3582172735000002 -Ge1Pb1_156_6690.vasp,GePb,-1.308113405,0.4424674674999999 -Cu1S2F2_164_4956.vasp,CuS2F2,-1.469822722,0.3555704137500003 -Ta2Pd1S6_12_17825.vasp,Ta2PdS6,-4.360291831111111,0.08203787888888936 -Bi2Br10_3_2428.vasp,Bi2Br10,-0.5696930625,0.08904101833333272 -Cr3O8_12_4572.vasp,Cr3O8,-4.837141392727273,-0.28475136710227744 -Ag4Hg4S4Br4_51_525.vasp,Ag4Hg4S4Br4,-0.000879934375,0.110092771875 -Zr2Nb1Zn1I1Br1N3Cl1O2_1_21613.vasp,Zr2NbZnIBrN3ClO2,-4.6713508975,0.353247524979155 -Os1S1Cl1_8_13815.vasp,OsSCl,-2.92068794,0.3946953108333302 -Pd2Cl2_129_14412.vasp,Pd2Cl2,-0.31625736,0.7523288983333334 -Y2Ga2Cl2_164_20734.vasp,Y2Ga2Cl2,-3.36170895,0.08893613291666336 -Mn2O4_59_11179.vasp,Mn2O4,-4.333260693333333,0.13154903499999993 -Ge2Se2_31_6875.vasp,Ge2Se2,-2.75667141,0.1436219350000001 -Li2Mg2_164_9981.vasp,Li2Mg2,-0.6756273575,1.3553409625 -Fe2P2Se6_162_5923.vasp,Fe2P2Se6,-2.4901856639999997,0.4725669338333316 -K2Li4H6O6_11_9211.vasp,K2Li4H6O6,-3.9090386561111115,-0.010800222777782142 -Mn1Zn2Ge1H3O8_1_10948.vasp,MnZn2GeH3O8,-3.711447409333333,0.23205274526388592 -Os2F2_5_13847.vasp,Os2F2,-3.29489612,0.5116295003749998 -Zr1Pd1Cl4O2_10_21398.vasp,ZrPdCl4O2,-2.72486138,0.35253167124999996 -Au2S4I2_17_1527.vasp,Au2S4I2,-0.92663905125,0.13231331270833235 -Ir2Se2Br2_11_8833.vasp,Ir2Se2Br2,-2.1365863833333334,-0.09993717986111439 -Ca2H8C8O16_2_3037.vasp,Ca2H8C8O16,-5.001362986470588,0.5974675565686225 -Sb6Pd3_147_15855.vasp,Sb6Pd3,-1.7720544111111112,0.48222238055555566 -V2Pb2Cl2O6_11_20143.vasp,V2Pb2Cl2O6,-4.2126200725,-0.002250149913198385 -Li1Fe1P2S6_149_9696.vasp,LiFeP2S6,-3.096645933,-0.1757925844280357 -Zr3H2C2S2_187_21763.vasp,Zr3H2C2S2,-5.251579916666667,0.3347211897685016 -Y1V1F5_47_20686.vasp,YVF5,-3.6929392885714285,0.6841890997618971 -Ga2Te2F2_31_6501.vasp,Ga2Te2F2,-2.174445205,0.14155768329629234 -Al4Bi20_26_1058.vasp,Al4Bi20,-1.0379913541666668,-0.24493788083333518 -Na2Ni1F2_123_12231.vasp,Na2NiF2,-1.6382526160000002,0.39549080799999986 -V2Cu2P4O12_4_20050.vasp,V2Cu2P4O12,-4.711334645,0.5247556749999895 -Sc1Te6P2Au1_149_16020.vasp,ScTe6P2Au,-1.908351386,0.3166612209999943 -Au2Cl6_191_1476.vasp,Au2Cl6,0.2681935,0.4460965025 -Li2Mg1H4Se2O8_2_9969.vasp,Li2MgH4Se2O8,-4.131710447647059,0.06129088598038801 -Dy2S2Br2_59_5530.vasp,Dy2S2Br2,-3.553095785,0.038289013333333344 -Zn3P1_191_21208.vasp,Zn3P,0.8678675575,0.38989954890625 -Cs2C6Se6N6_13_4681.vasp,Cs2C6Se6N6,-4.763942346,0.14774204049998507 -Tc6F18_164_18260.vasp,Tc6F18,-3.8500530354166664,-0.1302527801041663 -K2H8Cl2O4_2_9158.vasp,K2H8Cl2O4,-3.540870440625,0.06950869958333339 -Te1As2Se2_164_18284.vasp,TeAs2Se2,-2.328990332,0.11932836950000003 -Rh2F6_12_15190.vasp,Rh2F6,-2.10298963625,0.11032898000000024 -Zr2S2Br1Cl1_1_21642.vasp,Zr2S2BrCl,-3.6442976616666667,0.28525077916666297 -V1Ga1Ag1Br2N2_6_19832.vasp,VGaAgBr2N2,-2.731678722857143,0.4274371923214172 -Sb4P2H2O12_4_15795.vasp,Sb4P2H2O12,-4.7653892805,0.12693875616666261 -Pt2Cl6_162_14617.vasp,Pt2Cl6,-0.7689278975,0.22873791666666665 -Rb2Cd4Te2S6Br6_31_14827.vasp,Rb2Cd4Te2S6Br6,-0.8501588345,0.22398073316666423 -Bi8C4_26_2683.vasp,Bi8C4,-2.5837101575,0.4329769758333306 -Si8O12_14_16548.vasp,Si8O12,-5.778758045,0.28917848199999346 -In8Se4_31_8719.vasp,In8Se4,-1.3288147166666666,0.7836598983333315 -Ga1Cu1Sb2Te6_149_6175.vasp,GaCuSb2Te6,-1.214566362,0.368486891666665 -Li2H2Pd1_123_9929.vasp,Li2H2Pd,-2.45114196,0.036698687999999535 -Ca2Au1Se2F2_38_2940.vasp,Ca2AuSe2F2,-1.962513862857143,0.5657340264285671 -Sb8O20_14_15872.vasp,Sb8O20,-3.959029700714286,0.3480304935714287 -Ni1H4I2N6_47_13355.vasp,NiH4I2N6,-3.7264326115384616,0.03677867057691762 -Zn2Te2Mo2S12_18_21181.vasp,Zn2Te2Mo2S12,-2.1908177516666667,0.3766396037546273 -Pd2I4_2_14436.vasp,Pd2I4,-0.030945493333333334,0.2602634741666666 -Mg2Zn1_123_10540.vasp,Mg2Zn,0.8506521766666667,0.3404870550000001 -In2O3_164_8513.vasp,In2O3,-3.771577234,0.26716073824999986 -Zn2H10C16O10_2_21091.vasp,Zn2H10C16O10,-5.605453136842105,0.17824878934209687 -Mn1Nb1Te1Se1_99_10816.vasp,MnNbTeSe,-2.958487105,0.4617578233638653 -Co2I2_2_3926.vasp,Co2I2,-0.3125576025,0.5135809933333326 -Mn1Si1H2O4_1_10883.vasp,MnSiH2O4,-4.6649948075,0.7342629537499996 -Fe2Se2I2_59_5974.vasp,Fe2Se2I2,-1.0469778916666665,0.10479889958333338 -Sn3As2S9_174_16908.vasp,Sn3As2S9,-2.4863929935714286,0.4504420237499973 -Cu2N2Cl2O2_31_5189.vasp,Cu2N2Cl2O2,-2.51815698375,0.2552748718750002 -Zr4Tl4F20_14_21858.vasp,Zr4Tl4F20,-3.750221214285714,0.053240385357139264 -B8Te6_31_1795.vasp,B8Te6,-3.2760910771428575,0.9180944176190442 -Fe1Co1O4_10_5660.vasp,FeCoO4,-3.63215868,-0.0869494555208361 -Sc2I2_2_16094.vasp,Sc2I2,-1.7362374475,0.23867066833333106 -Zn2S1I1_6_21141.vasp,Zn2SI,0.2396012575,0.41708366553125004 -Sn1Se2_164_16695.vasp,SnSe2,-2.01388946,0.13218268666666644 -Pt2F2_129_14619.vasp,Pt2F2,-0.3965229475,1.809627236875 -Y1P2W1S6_5_20658.vasp,YP2WS6,-3.905618537,0.3668341367500001 -K3Sn4Au1_25_9405.vasp,K3Sn4Au,-0.24232634875,-0.12455819 -Nb4N3_164_13097.vasp,Nb4N3,-7.122292688571428,0.41700525190475535 -Bi2Cl2_11_2444.vasp,Bi2Cl2,-1.10953703,-0.01038539166666766 -Hf2Mo2Br3N1Cl1O3_3_7534.vasp,Hf2Mo2Br3NClO3,-4.628336646666667,0.3071423224218708 -Nb2O5_6_12799.vasp,Nb2O5,-6.619747882857142,-0.15257287803571645 -Sc2Sb2Te8_2_16150.vasp,Sc2Sb2Te8,-2.0244096358333334,0.2900474790277736 -Ti1S1I1Cl1_6_18835.vasp,TiSICl,-3.12009833,0.1917731134374998 -Mg1Br2_115_10346.vasp,MgBr2,-1.3598218266666666,0.17814873777777773 -Ta2Te8Ir2_11_17926.vasp,Ta2Te8Ir2,-3.0308131583333338,0.09472846249999956 -Cr4N3Cl2_164_4608.vasp,Cr4N3Cl2,-4.28814174,-0.11263786987654723 -Zr1O2_191_21388.vasp,ZrO2,-3.695216406666667,3.487772736666667 -Mg1Mo6O16_156_10388.vasp,MgMo6O16,-4.938311106086957,0.2740494849999904 -Sb2S2_164_15682.vasp,Sb2S2,-2.3419249625,0.3753304829166646 -V2Br4_11_20007.vasp,V2Br4,-1.7640635150000001,-0.017748681666666766 -K4S4O8_13_9507.vasp,K4S4O8,-3.490316245625,0.19495480117187536 -Co2S2I2_59_3979.vasp,Co2S2I2,-1.7264333833333334,-0.026533503680557097 -Zr1Fe1H6_156_21291.vasp,ZrFeH6,-3.183327565,0.7457375200000003 -Mo12Cl24_127_11481.vasp,Mo12Cl24,-2.2329919661111113,0.06484424166666658 -Ta1Cl2_115_17524.vasp,TaCl2,-3.239677873333333,0.7045464916666606 -Na2Zr1H6S6_147_12343.vasp,Na2ZrH6S6,-3.288558512666667,0.1232981274999998 -Ca2Bi4O8_26_2955.vasp,Ca2Bi4O8,-3.7776361485714287,0.2546203960714286 -In1H2_115_8271.vasp,InH2,-1.9202480633333332,2.14045613333333 -Ga1S2_115_6262.vasp,GaS2,-2.56912817,0.30145053822916396 -Sb2Os2Se6_162_15620.vasp,Sb2Os2Se6,-2.685858494,0.3928828824999976 -Cd1O2_164_3386.vasp,CdO2,-1.2273754799999999,0.9284536943055541 -Ti1Se1I1Br1_6_18846.vasp,TiSeIBr,-2.6659230175,0.2355888099999981 -Bi4I4O16_29_2614.vasp,Bi4I4O16,-3.1467622483333333,0.018512134583333673 -Ge1C1_187_6657.vasp,GeC,-4.67911744,0.46553307750000017 -Si1Sn2As1O8_5_16372.vasp,SiSn2AsO8,-4.535041739166666,0.35834693302082954 -In1Ir1I3Br3_1_8277.vasp,InIrI3Br3,-0.82354143125,0.08885643874999999 -As2Au2O6_2_1186.vasp,As2Au2O6,-2.8770192349999997,0.7090709686666604 -K1Cr1H4C4O10_10_8892.vasp,KCrH4C4O10,-5.2275363065,0.020732916041656946 -Au2I2_129_1490.vasp,Au2I2,0.691720435,0.17799751375000006 -Au2Se1Cl2O1_1_1533.vasp,Au2SeCl2O,-0.5766383266666667,0.3856766157499957 -Na2Hg4S6I6O2_31_12157.vasp,Na2Hg4S6I6O2,-0.758855866,0.2805398129166651 -Sb1Cl2_187_15447.vasp,SbCl2,-1.2554432199999999,0.3487236324999985 -Au2Se2_164_1550.vasp,Au2Se2,-0.17221756,0.50390272 -Mn2Cl6_162_11054.vasp,Mn2Cl6,-1.45593080125,0.06087320437499999 -Sr1Ca2S2Br2_8_17036.vasp,SrCa2S2Br2,-2.6912664185714283,-0.2181016457142877 -Fe2As2Pt2_129_5778.vasp,Fe2As2Pt2,-1.6216628249999998,0.8831764470833317 -Al2Sn2Te2_164_995.vasp,Al2Sn2Te2,-1.8522146633333334,-1.1841877000000007 -Tl2Ge2Se6_162_19428.vasp,Tl2Ge2Se6,-1.937548498,0.2162827618333313 -Na1Ga1Te6P2_5_11871.vasp,NaGaTe6P2,-1.808519038,0.24252503583333188 -Cd1I2_164_3367.vasp,CdI2,0.5527418166666667,-0.002766946111111168 -Li2C4O2_31_9852.vasp,Li2C4O2,-5.32595182875,0.9660859446875 -Nb2Te4Cl4_12_12920.vasp,Nb2Te4Cl4,-2.5262378340000002,0.19864313173808995 -Ba4Ga2Bi2Te10_31_2154.vasp,Ba4Ga2Bi2Te10,-1.7756686727777777,0.2323021752777742 -Cd12P8_115_3264.vasp,Cd12P8,0.077080239,0.17813887150000318 -Cs2Os2S2N2Cl10_11_4762.vasp,Cs2Os2S2N2Cl10,-2.2928311794444443,0.0038911259027709644 -Bi4Se6_11_2646.vasp,Bi4Se6,-1.9488052799999998,0.15950642999999998 -Os2S2I2_59_13868.vasp,Os2S2I2,-2.6159838116666667,0.3873926035416626 -Li1Ta1Ni1Br2N1O2_1_9794.vasp,LiTaNiBr2NO2,-3.935900415,0.3553096646527714 -Cl4_55_3694.vasp,Cl4,-0.032813785,0.1704613975 -Mn2Bi2S4F2_26_11010.vasp,Mn2Bi2S4F2,-2.4476161149999998,0.23029190900000085 -Bi1S2O6F1_1_2372.vasp,BiS2O6F,-3.9437680630000003,0.23049641808332977 -Rb4Cl2_51_14967.vasp,Rb4Cl2,-0.3678730083333333,0.17252925499999955 -Ho2I2O2_129_8140.vasp,Ho2I2O2,-4.481408798333333,0.05135500000000093 -Sb2Te6Au2_12_15734.vasp,Sb2Te6Au2,-0.8547397200000001,0.21027259512499963 -V2I6_162_20100.vasp,V2I6,-0.94807941375,0.10315084875000002 -K2V2Cu4Se8_28_9386.vasp,K2V2Cu4Se8,-1.66354698,0.187090553125 -Cr3C2_187_4552.vasp,Cr3C2,-4.66949071,0.5913502575000003 -K2B2C2S2_31_8981.vasp,K2B2C2S2,-3.2148831275,1.392749020694439 -W3C2S2_187_20559.vasp,W3C2S2,-5.800884924285714,-0.09638325428571859 -Hf1Mo2S8_164_7236.vasp,HfMo2S8,-3.4036633454545453,0.607442533579539 -Y3N2_187_20804.vasp,Y3N2,-6.38813821,0.04718103699999587 -Mo1Cl5_47_11508.vasp,MoCl5,-1.22564618,0.30101158208333345 -Cd2Sb2Cl2O4_11_3553.vasp,Cd2Sb2Cl2O4,-2.463764929,0.1794151030000002 -Re12Se12Cl12_18_14985.vasp,Re12Se12Cl12,-3.7476807977777775,0.07201201666666401 -Ti2I2_164_18957.vasp,Ti2I2,-3.1929615075,0.5032481812499998 -Ta2Fe4Te6_11_17737.vasp,Ta2Fe4Te6,-2.1581877533333333,0.26371272638888665 -Mo2C1_164_11586.vasp,Mo2C,-4.103977426666667,1.0124361508333335 -Nb4Te10Pd6_59_13162.vasp,Nb4Te10Pd6,-2.5206098184999997,-0.03780951658695847 -Co1H14C14N2O8_2_3738.vasp,CoH14C14N2O8,-5.50373052051282,0.29048299972221386 -Hf2S2N1_164_7572.vasp,Hf2S2N,-6.3869778660000005,0.08543509899999924 -Cu1Cl2_164_4869.vasp,CuCl2,-0.3190430066666667,0.1701120966666666 -W1Au2O4_1_20411.vasp,WAu2O4,-3.3670982985714284,0.5426691082142816 -Ti3V1I1N1O3F4_1_19116.vasp,Ti3VINO3F4,-5.348081108461538,-0.1779275175160316 -Li4Br2_51_10167.vasp,Li4Br2,-1.7772358383333333,0.2853185238888871 -Sb2As2O8_11_15530.vasp,Sb2As2O8,-4.312591364166667,0.12281559624999572 -Fe2Se2_129_5978.vasp,Fe2Se2,-1.2993533275,0.08403950999999998 -V3W1S8_25_20296.vasp,V3WS8,-3.96084198,-0.02647319250000013 -Lu2Co2Ge4_129_10307.vasp,Lu2Co2Ge4,-2.7876047925,-0.22825962375000275 -Ru1Br2_187_15262.vasp,RuBr2,-0.95081302,0.7719703772222206 -Cu1Te1Se1O1_1_4991.vasp,CuTeSeO,-1.68758046,0.33419393359375016 -Ge2F2_164_6773.vasp,Ge2F2,-2.8291100575,0.07265372750000021 -V1Cu1Sb2Te6_1_19818.vasp,VCuSb2Te6,-1.46994118,0.28987849277777633 -Ta4Ni6S10_59_18071.vasp,Ta4Ni6S10,-3.3510567344999997,-0.004953535040000373 -Nb3H2C2S2_187_12974.vasp,Nb3H2C2S2,-5.574604911111112,0.35012020765430907 -Hf1V1Cr1Mo1Se6S2_1_7346.vasp,HfVCrMoSe6S2,-3.4181403833333337,0.18192632249999674 -K2Sb2Pd2_129_9341.vasp,K2Sb2Pd2,-0.989181555,0.12844325988700434 -Sc1Cl2_164_15919.vasp,ScCl2,-2.741252063333333,0.14823550777777506 -Pd2S3I1_8_14473.vasp,Pd2S3I,-1.48273908,0.3284223150000001 -Li6Br3N1_10_10262.vasp,Li6Br3N,-2.573584393,0.1851199369999974 -U2Te6_11_19733.vasp,U2Te6,-3.4919873625,0.06971389124999972 -Cu2Te2_164_5338.vasp,Cu2Te2,-0.0943437975,0.47313673749999996 -Co1Ni1Te2Se1Br1_6_3796.vasp,CoNiTe2SeBr,-1.1514788533333333,0.11117993708333085 -Ir2I2N2_59_8787.vasp,Ir2I2N2,-2.9332534083333335,0.44380872416666395 -Hf2Se1Br1N1_156_7593.vasp,Hf2SeBrN,-5.461611024,0.07603054099999607 -Sn1Bi2Se4_156_16615.vasp,SnBi2Se4,-2.056499627142857,-0.03226684857142989 -Li1Ni1Pd1Se2_8_9764.vasp,LiNiPdSe2,-1.380497018,0.10385317416666416 -Mg4Sn2_164_10584.vasp,Mg4Sn2,-0.42836362833333336,-0.425444755 -Zr4H2C3_164_21823.vasp,Zr4H2C3,-5.993155465555556,-0.09739194000000584 -Hf3B2F2_187_7677.vasp,Hf3B2F2,-5.800391481428571,0.009860324642852358 -Nb2C2Br2_59_12667.vasp,Nb2C2Br2,-5.154576811666667,0.3007949988194387 -I10N2_51_8155.vasp,I10N2,-0.0420030025,0.5625629611458298 -As2Pb2Cl2O6_7_1251.vasp,As2Pb2Cl2O6,-3.5216678333333333,0.1465128054166669 -Zn2Bi8O18_13_21051.vasp,Zn2Bi8O18,-3.2863125671428572,0.2685625136607084 -Ni1C4Br2N2F4_47_13294.vasp,NiC4Br2N2F4,-4.064267226153846,0.032018511346141865 -Hf2Sb2Se6_12_7587.vasp,Hf2Sb2Se6,-3.5024489690000005,0.2733530704999979 -Ta4Pt2S14_11_18092.vasp,Ta4Pt2S14,-4.2594765075,0.11137657243749777 -Ni2Se4_14_13649.vasp,Ni2Se4,-1.1965423383333333,0.287213175 -Fe2Mo2Cl2O8_129_5870.vasp,Fe2Mo2Cl2O8,-3.832296265714286,0.16829964809523545 -In2S2I2_59_8549.vasp,In2S2I2,-1.5320145266666667,0.01221390583333326 -Bi4O6_31_2626.vasp,Bi4O6,-3.669421816,0.18857241200000008 -K4Mo6O20_13_9476.vasp,K4Mo6O20,-4.655565879333333,0.09224015066666702 -Ba3Ni2I2O5_123_2121.vasp,Ba3Ni2I2O5,-2.903888745833333,-0.14178625367621822 -Li4B4H24O4_14_10162.vasp,Li4B4H24O4,-3.9668206819444447,0.7821508165277733 -Ta4Fe8Se8_59_18043.vasp,Ta4Fe8Se8,-2.9669984355,0.7219967535000005 -Cu2H8C6N6Cl2_2_5148.vasp,Cu2H8C6N6Cl2,-4.849237625833333,0.3292350768749954 -Ti1I1Br1_156_18792.vasp,TiIBr,-2.71770783,0.13378138083333324 -Er2I2O2_129_5561.vasp,Er2I2O2,-4.465192735,0.042611543333333834 -Sr2P4S12_2_17296.vasp,Sr2P4S12,-3.1724477305555556,0.14861132552082726 -Ge1Te2_164_6719.vasp,GeTe2,-1.8160459966666667,-0.31662319444444575 -Ti1Br4_123_18752.vasp,TiBr4,-2.0182070039999997,0.25007500000000027 -Bi2Pb1Se4_164_2499.vasp,Bi2PbSe4,-2.0357352285714287,0.02384962098214094 -Ir1Ru1Se2I1Br1_6_8755.vasp,IrRuSe2IBr,-2.0106145166666667,0.34870968027777455 -Pt1S1_156_14586.vasp,PtS,-1.78157478,0.83350638 -In1Ag1Sb2Te6_149_8185.vasp,InAgSb2Te6,-1.1222247890000001,0.31972088316666497 -In1Au1S1I2_1_8198.vasp,InAuSI2,-0.61314471,0.10789353866666505 -Ga1Pt5Br2_38_6249.vasp,GaPt5Br2,-1.37614607125,0.18280924371900464 -Ti1S1Cl1_156_18834.vasp,TiSCl,-4.342864146666667,-0.04790889138889298 -Pd1I2_164_14365.vasp,PdI2,-0.012689006666666667,0.2785199608333333 -Mn1Zn1Br2N2_6_10937.vasp,MnZnBr2N2,-2.2143830033333334,0.6420250606249944 -Au2Se4I2_1_1557.vasp,Au2Se4I2,-0.58764927625,0.21584032430555405 -Ti1Mo1Se1S1Br2_6_18804.vasp,TiMoSeSBr2,-3.22796918,0.09931523749999191 -Zn4Te4O12_29_21233.vasp,Zn4Te4O12,-2.89016442,0.24107165899999705 -K2Cd4Se2O6F6_31_9061.vasp,K2Cd4Se2O6F6,-1.9398770639999998,0.3667505362499974 -Cu2Te3P4I2_6_5348.vasp,Cu2Te3P4I2,-1.6051709863636363,0.178804652483764 -Bi6Rh2S4_11_2678.vasp,Bi6Rh2S4,-2.0016011733333334,-0.10311870391414313 -In2Te2_187_8629.vasp,In2Te2,-1.318427315,0.06658170499999994 -Ta4Se12Br2_2_18106.vasp,Ta4Se12Br2,-3.4970819477777777,0.1679470614043148 -Te6P2Ru2_162_18671.vasp,Te6P2Ru2,-2.391713119,0.3858416336666656 -Ni3Se4_10_13724.vasp,Ni3Se4,-0.6370091214285714,0.47493950857142875 -Hf1Ru1Pt1Rh1Cl4O4_1_7276.vasp,HfRuPtRhCl4O4,-3.4923890833333338,0.46175374645833034 -Nb2H2C1S2_164_12731.vasp,Nb2H2CS2,-5.0289292,0.27512310628571424 -Ca4Fe2S6Br2_129_3216.vasp,Ca4Fe2S6Br2,-2.519651206428571,-0.14563131821428976 -Hf3Cl2O5_1_7701.vasp,Hf3Cl2O5,-6.333158803,0.2987612866250009 -Tl1Pt5I2_38_19327.vasp,TlPt5I2,-0.89219714125,1.2106215740625 -Li2H6C2N8O2_51_9944.vasp,Li2H6C2N8O2,-5.3672133,-1.9913725277083405 -Mn3B2Cl2_187_11351.vasp,Mn3B2Cl2,-3.0019568942857147,0.3009446407142832 -Zr4Te4Cl4_31_21854.vasp,Zr4Te4Cl4,-2.9924226991666667,0.19322761638888575 -Ga4Cl4O4_29_6547.vasp,Ga4Cl4O4,-3.25632847,-0.2735337237500031 -Nb1Cr1F6_123_12493.vasp,NbCrF6,-3.614205135,0.10200214187499612 -Be2Br4_51_2246.vasp,Be2Br4,-1.7200346,0.3682020266666668 -Te2Ru1_115_18512.vasp,Te2Ru,-1.85715394,0.7638407700000003 -Ca1Se2F2_1_2878.vasp,CaSe2F2,-1.908014032,1.3214303673333334 -Be4Bi2_59_2286.vasp,Be4Bi2,-2.0378790466666667,-0.3814845250000014 -Li6Se2S8F2_11_10276.vasp,Li6Se2S8F2,-2.583721483333333,0.23676340238425714 -Nb4Se6_12_13152.vasp,Nb4Se6,-4.422654099,-0.5120330562500031 -Ru2Se6_11_15365.vasp,Ru2Se6,-2.51324964,0.4596978433333333 -P2Ir2_129_13995.vasp,P2Ir2,-4.143058,0.28475910250000025 -Hf3Ge1Se1S3Cl4_25_7702.vasp,Hf3GeSeS3Cl4,-3.969015189166667,0.15433502743054728 -Lu1Ge2_123_10293.vasp,LuGe2,-2.75668829,0.6910197133333336 -K1Sn1S2_156_8940.vasp,KSnS2,-1.7954898075,0.3997238040625003 -Zr2I1Br1N1O1_6_21583.vasp,Zr2IBrNO,-4.878887263333334,0.13585077999999262 -Ni1Cl2_115_13311.vasp,NiCl2,-0.14246736000000002,0.16702796666666667 -Ge2P2H6C2O6_7_6804.vasp,Ge2P2H6C2O6,-4.998476431666667,-0.11040252695239178 -Si4S4_53_16507.vasp,Si4S4,-3.83685399,-0.1783998124999998 -Cr1Sn3_191_4268.vasp,CrSn3,-0.6411644625,-1.2964864087499999 -Ag2Mo1O4_111_324.vasp,Ag2MoO4,-2.9683219771428573,0.33959162499999973 -Sc2Pd1S3I1Br2_8_16125.vasp,Sc2PdS3IBr2,-2.540068138888889,0.29129976458332796 -Sr1Se2_115_17081.vasp,SrSe2,-1.4123136533333334,1.0455716827777755 -Sn1P7Au3_1_16667.vasp,SnP7Au3,-2.339412532727273,0.38687899727272734 -Ta1Mn1Ni1S2I2_6_17565.vasp,TaMnNiS2I2,-2.357783497142857,0.17076614728571282 -Zr2P2O6_12_21625.vasp,Zr2P2O6,-5.972287893,0.4843067364000008 -V1H1O2_156_19847.vasp,VHO2,-4.8795756525,0.14954561374999997 -V1Au2S1I4_1_19771.vasp,VAu2SI4,-0.47731723,0.22134434953124849 -Zr4B3_164_21808.vasp,Zr4B3,-5.075858812857143,0.21190030392856696 -Ba2Tl1Ag1Hg1S5_99_2075.vasp,Ba2TlAgHgS5,-1.640027774,0.2964334108671849 -V1Cu1P2Se6_5_19815.vasp,VCuP2Se6,-2.443374588,0.11434977327499785 -Zr1Au1I1Cl1_8_21250.vasp,ZrAuICl,-1.4279238,0.4127933897499978 -Fe4Cu2S7_25_6077.vasp,Fe4Cu2S7,-1.5667998084615387,0.322853252692304 -V2Te2O7F2_2_20211.vasp,V2Te2O7F2,-4.210060266153846,-0.0042951529487211815 -Sc2Pd1Br6_8_16124.vasp,Sc2PdBr6,-1.9948211433333336,0.25780697999999747 -Rh2O2_6_15207.vasp,Rh2O2,-3.00013678,0.8683293537499998 -Mg2W2S2O12_4_10536.vasp,Mg2W2S2O12,-4.972570826111111,0.21499725497684657 -Ga2Cl6_1_6322.vasp,Ga2Cl6,-1.5414419825,0.08474082499999991 -Bi4As4O16_14_2592.vasp,Bi4As4O16,-4.148091377916667,0.1938122787500003 -Mn4Pb4O12_13_11447.vasp,Mn4Pb4O12,-3.9169877815,-0.02440762810000008 -Li4As4O8_29_10157.vasp,Li4As4O8,-4.49742312125,0.02024586194443659 -Cr2Se2F2_59_4495.vasp,Cr2Se2F2,-2.740256691666667,0.12228727333332712 -In2As6_164_8378.vasp,In2As6,-2.29321068875,-0.030449028749999885 -Na2Hf1N2_164_12144.vasp,Na2HfN2,-4.864920696,0.018231491222212293 -Cu6Se4Cl4O12_2_5499.vasp,Cu6Se4Cl4O12,-2.360564988846154,0.08256619086537981 -Hf1W2O8_164_7365.vasp,HfW2O8,-6.398708106363636,-0.010092822727279405 -W2O2F2_59_20517.vasp,W2O2F2,-4.865479895,0.29036977666666064 -H3Cl1O1_156_7047.vasp,H3ClO,-3.480309924,0.04143084549999987 -Ge2O2F2_59_6791.vasp,Ge2O2F2,-3.612405101666667,0.4022575929166665 -Rh3I1Br1O2_25_15250.vasp,Rh3IBrO2,-2.05787004,0.6193609759523764 -Ta4S12Cl2_2_18097.vasp,Ta4S12Cl2,-4.166009517222222,0.1904211287083264 -Ta2Cr2Te10_11_17716.vasp,Ta2Cr2Te10,-2.592436222142857,0.06013924160713979 -V1Br1F1_156_19784.vasp,VBrF,-2.4346831433333334,0.07591076555555154 -Ti5I1N3Cl2O1_1_19173.vasp,Ti5IN3Cl2O,-6.101695625833333,0.11492356041665497 -Ag4C4N12O8_57_508.vasp,Ag4C4N12O8,-4.7104306835714285,0.21245012535713803 -Te2P2O1_5_18439.vasp,Te2P2O,-3.002025866,0.4585552838666619 -Hg1S2_115_7912.vasp,HgS2,-0.35147704,0.6586267997916657 -Ni3Sn1Te2_187_13729.vasp,Ni3SnTe2,-0.48479041333333334,0.08570000562499958 -Al2Co2S5_187_804.vasp,Al2Co2S5,-3.175674353333333,0.11970453699073813 -Ni2Te2Br2_59_13658.vasp,Ni2Te2Br2,-0.4808082616666667,-0.018402582500000042 -As1O2_191_1155.vasp,AsO2,-3.0708296333333336,1.3703735520833245 -Ge2Sb2Se6_147_6857.vasp,Ge2Sb2Se6,-2.247182142,0.2944263051666639 -Hg2Te4_11_8038.vasp,Hg2Te4,0.16674259833333335,0.373359836111111 -Cr2Se2N1_164_4497.vasp,Cr2Se2N,-3.788516616,-0.012096738999999523 -Cr3As2_12_4541.vasp,Cr3As2,-3.013573976,0.6073211929999952 -As16I4_10_1127.vasp,As16I4,-2.4619796975,0.07570824083333205 -Ca2Bi10O17_8_2951.vasp,Ca2Bi10O17,-3.785732950689655,0.15638791293103527 -Mo2S6_59_11678.vasp,Mo2S6,-3.249150305,0.22990985859375002 -Tl2As2O6_149_19362.vasp,Tl2As2O6,-3.652969843,0.16268929950000022 -Ga2F2_59_6342.vasp,Ga2F2,-2.3815877575,-0.036905077500002326 -Cu4S4Cl4F4_14_5451.vasp,Cu4S4Cl4F4,-1.154142626875,0.21228570402573138 -Ga1Cu4As1S3Cl6_1_6182.vasp,GaCu4AsS3Cl6,-1.293089142,0.11216535180555343 -Mn4B1W1Cl6O4_1_11420.vasp,Mn4BWCl6O4,-3.194694030625,0.3714485366791222 -Y1Se2_115_20674.vasp,YSe2,-3.4433078766666667,0.5139676152777741 -Al1P1_187_702.vasp,AlP,-3.28661002,-0.35200802499999995 -Hf3Ti1Se8_6_7742.vasp,Hf3TiSe8,-4.34698721,0.3169969512500006 -Tl2Zn1S4_156_19565.vasp,Tl2ZnS4,-1.3786558242857143,0.24770127753571108 -Ta3S6_2_17987.vasp,Ta3S6,-5.2996036477777775,0.12112894055555579 -Mn2Bi2Te4Cl2_10_11023.vasp,Mn2Bi2Te4Cl2,-1.4215173540000001,0.2701479201379288 -Yb2I6_12_20878.vasp,Yb2I6,-1.5590286575,-0.43854903453125016 -Mg2P2Se6_162_10497.vasp,Mg2P2Se6,-2.556004191,0.04356353600000018 -Nb2I10_7_12739.vasp,Nb2I10,-0.9872772599999999,0.1976507683333335 -Mn6Cu1B1Se2Br3Cl1O6_1_11467.vasp,Mn6CuBSe2Br3ClO6,-2.977511376,0.3043749286624968 -Mo6P4Pb2O28_11_11763.vasp,Mo6P4Pb2O28,-5.192802629,0.04880786958332872 -Hf3H2C2_187_7707.vasp,Hf3H2C2,-6.372342544285714,0.23086711904761303 -Cr1Ag1Sb1Se1I2_1_4103.vasp,CrAgSbSeI2,-0.9318683283333334,0.20458839124999845 -Ca2Au1Se2Br2_38_2938.vasp,Ca2AuSe2Br2,-1.3966954828571427,0.30951453357142567 -Rb2Cd4O8F6_31_14806.vasp,Rb2Cd4O8F6,-1.708963039,0.4943692295416656 -Mg2Cd1_123_10437.vasp,Mg2Cd,1.0239573566666667,-0.17949101916666554 -Ba4Sb4Te8F4_14_2186.vasp,Ba4Sb4Te8F4,-2.436114436,0.1278506804999977 -Mn3S2N2F2_187_11401.vasp,Mn3S2N2F2,-3.206113948888889,0.4926621818518483 -Co1I2O6_1_3774.vasp,CoI2O6,-2.68255814,0.2005711950000002 -Te2As4S12_18_18362.vasp,Te2As4S12,-2.346058290555556,0.6564877980324044 -Te2Pt2I2_59_18484.vasp,Te2Pt2I2,-1.1160554483333334,-0.09864953166666668 -As1S1Cl1_156_1168.vasp,AsSCl,-2.14698367,0.5162492836111086 -Ta2Sb2S6_2_17865.vasp,Ta2Sb2S6,-4.06750379,0.2718379411666648 -Fe4S8_54_6087.vasp,Fe4S8,-2.5279579658333335,-0.5918320508333337 -Zr1Nb1N1Cl2O1_25_21349.vasp,ZrNbNCl2O,-5.29817029,0.1725228033333297 -Cr2S2Br2_59_4462.vasp,Cr2S2Br2,-2.300954218333333,0.0376454100000001 -As2Pb2F14_2_1252.vasp,As2Pb2F14,-2.5592080555555556,0.056630143888888984 -Rb2N2O6_4_14901.vasp,Rb2N2O6,-4.0888564160000005,0.09669805399999998 -Rb1Na1Mg6O7_99_14744.vasp,RbNaMg6O7,-3.5817571753333337,0.0027101517619020354 -Hf3S1Br2N1_1_7723.vasp,Hf3SBr2N,-4.917631722857143,0.3515831399999949 -Co2Ge8_125_3902.vasp,Co2Ge8,-2.703354864,-0.013791075999999736 -Sc5F8_10_16270.vasp,Sc5F8,-3.924725995384615,-0.17281108525641292 -Ti2Br2_12_18903.vasp,Ti2Br2,-3.82756352,0.3592362375000002 -In2O4_12_8516.vasp,In2O4,-3.196226925,0.7289153512499964 -Cu2P4Se3Br2_6_5224.vasp,Cu2P4Se3Br2,-1.9964871718181818,0.13515134672077656 -W1Au2Se4_111_20415.vasp,WAu2Se4,-1.7806951742857142,0.05914228714285552 -Cu4I4O4_14_5428.vasp,Cu4I4O4,-0.9580031791666667,0.41888788549999767 -Sb2As2S6_157_15532.vasp,Sb2As2S6,-2.71224056,0.44950346425 -In2Te6P2_147_8641.vasp,In2Te6P2,-1.705671641,0.23990969566666537 -Sn2O1_8_16794.vasp,Sn2O,-2.4693428566666666,-0.847387096666668 -Mg2Ag2_191_10416.vasp,Mg2Ag2,0.753193375,2.027021415 -Y6C2I7_12_20845.vasp,Y6C2I7,-3.6623762600000003,0.06135892266666643 -Mo4H2N3O2_164_11744.vasp,Mo4H2N3O2,-4.9093420436363635,0.2752167412499902 -V1Cu1Te6P2_5_19822.vasp,VCuTe6P2,-1.855793405,0.39773629783333353 -Na2H2S6N2_4_12105.vasp,Na2H2S6N2,-3.0256019125000004,0.26934927626302063 -Au2Cl2_67_1471.vasp,Au2Cl2,0.1697106575,0.020943913749999987 -Cu2W2Se1S3Cl2_1_5368.vasp,Cu2W2SeS3Cl2,-2.260622506,0.5653936504999961 -As2Pb2S6Cl2_7_1258.vasp,As2Pb2S6Cl2,-2.219567640833333,0.4317160322337939 -Hf4S1Br2N2Cl2O1_1_7803.vasp,Hf4SBr2N2Cl2O,-5.122551183333333,0.4119166988541627 -Sn2P2H10C4O6_7_16809.vasp,Sn2P2H10C4O6,-4.881932895,0.025360330916650187 -Cs2Hg4S2Br6O6_31_4728.vasp,Cs2Hg4S2Br6O6,-1.5959574220000001,0.08775135550000004 -Ba2H2Cl2_129_1992.vasp,Ba2H2Cl2,-2.6444938066666666,0.10774046333333365 -Sr1Ag2H12_115_17018.vasp,SrAg2H12,-2.057037826666667,1.5903135828333306 -Y3N2O2_187_20803.vasp,Y3N2O2,-6.960377394285715,0.13676460214285147 -Y2C1_164_20712.vasp,Y2C,-5.377682366666666,0.45224820333333327 -Cu2Se1S3_1_5294.vasp,Cu2SeS3,-1.4057710866666666,0.3234769465624961 -Ca1Br2_115_2810.vasp,CaBr2,-1.6017501433333334,0.32838352000000004 -Tl4Br4_57_19594.vasp,Tl4Br4,-0.731227015,-0.15451476499999994 -Sr2Fe2Si2_129_17220.vasp,Sr2Fe2Si2,-1.6287412466666666,0.13285919374999777 -Nb1Bi1Sb1_156_12472.vasp,NbBiSb,-3.0816578700000004,0.11546051222221454 -Zn1Sn1F6_10_21012.vasp,ZnSnF6,-2.1690706275,0.08027234500000002 -Sb8Se8O4_2_15879.vasp,Sb8Se8O4,-2.860989146,0.1319208964999974 -Nb2S2F2_59_12838.vasp,Nb2S2F2,-4.720673748333334,0.15706927611110677 -Os1S2_164_13821.vasp,OsS2,-3.555963703333333,0.7421538024999998 -Cu2P4Se3I2_6_5227.vasp,Cu2P4Se3I2,-1.8831399054545452,0.139514363701296 -P2Pb2Se6_147_14016.vasp,P2Pb2Se6,-2.375484529,0.15447526750000007 -Hf1Cl2_115_7143.vasp,HfCl2,-3.1228099233333335,0.5523706908333297 -Cu1F2_115_4876.vasp,CuF2,-1.1014172433333334,0.1956481166666666 -Cd1Ge1Se1S1Br2_1_3315.vasp,CdGeSeSBr2,-1.2807545516666667,0.16960011081597204 -W1F5_47_20433.vasp,WF5,-2.9870461966666664,0.5385237452083278 -V1Cu2S5_1_19823.vasp,VCu2S5,-2.19278616,0.2898540998177064 -Ag1Os1S2_6_95.vasp,AgOsS2,-2.14868785,0.894057063125 -Ta3Cl7O1_156_17954.vasp,Ta3Cl7O,-3.8157068290909093,0.18525767659090409 -K4Cu10Te10_59_9439.vasp,K4Cu10Te10,-0.42196211499999997,0.15103970125000005 -In2H4C2Se2O12_2_8465.vasp,In2H4C2Se2O12,-4.491252862727273,0.09485650335226459 -Cu2Cl2_67_5083.vasp,Cu2Cl2,-0.2999493175,0.3361942362500001 -W2F2_164_20492.vasp,W2F2,-3.967843365,0.9545014681249946 -Ca2As2H10O12_7_2924.vasp,Ca2As2H10O12,-4.406684406153846,0.07945099804487255 -Te2Pt2_164_18492.vasp,Te2Pt2,-1.5703171975,0.3272363724999998 -In2I2Br1O1_1_8474.vasp,In2I2BrO,-1.2881983466666667,0.3312489583333333 -V4I16_14_20331.vasp,V4I16,-0.641543357,0.1231866593750005 -Ti2Ge2O6_147_18941.vasp,Ti2Ge2O6,-6.12573278,-0.08473283725000336 -As2Pb2S6_7_1261.vasp,As2Pb2S6,-2.502547212,0.3701652622986049 -Mg1Se2F2_8_10403.vasp,MgSe2F2,-1.7095200099999999,1.0860508143333334 -Ag1Sn1Se3Br1_1_136.vasp,AgSnSe3Br,-1.1823921566666666,0.2570427595833323 -Cd2Sb2Se6_147_3564.vasp,Cd2Sb2Se6,-1.250072599,0.007649137333331085 -V3Mo1Se8_25_20279.vasp,V3MoSe8,-3.0666537799999998,0.05465231458333353 -Re6F18_164_15122.vasp,Re6F18,-3.6333211108333336,0.006421289166666511 -Sr2Br4O4F8_30_17154.vasp,Sr2Br4O4F8,-1.2638665861111111,1.0180859963888866 -Ba2Cu1S2Cl2_38_1967.vasp,Ba2CuS2Cl2,-2.3644526428571426,0.11630353078868622 -Cu2P2O4_26_5207.vasp,Cu2P2O4,-3.5624059625,0.5787112299999988 -Na2Zr1Cu2S4_12_12341.vasp,Na2ZrCu2S4,-2.5799031922222224,-0.14227391888888885 -W1I1Br1_156_20434.vasp,WIBr,-1.5018932733333334,0.8260391279166663 -Ti2P2Se6_12_18983.vasp,Ti2P2Se6,-3.66194932,0.24911399087499708 -Bi4Mo2_2_2617.vasp,Bi4Mo2,-1.6413798183333332,0.459611081666665 -Rb2Au2Se2_51_14768.vasp,Rb2Au2Se2,-0.4196228933333333,0.3093663816666667 -Ti2H2S2N1_164_18950.vasp,Ti2H2S2N,-5.253552777142858,-0.055831876696445515 -Nb1Sb1Te1Se1_99_12569.vasp,NbSbTeSe,-3.0106041375,0.049030988333330805 -Ti3C2_187_19078.vasp,Ti3C2,-7.231802424,0.4568865889999998 -Na2Hg4O8F6_31_12152.vasp,Na2Hg4O8F6,-1.404066114,0.4363031311249983 -In1Sn1Br4_6_8355.vasp,InSnBr4,-0.9477291183333333,0.15149177937500014 -Cd1In2S4_164_3376.vasp,CdIn2S4,-1.9299033571428572,0.0174815364285712 -V2Ag2S8_51_19975.vasp,V2Ag2S8,-2.3839415525,0.29446336055555333 -Ti2I6_189_18961.vasp,Ti2I6,-1.820789715,0.23320144375000007 -Mn3N2_187_11397.vasp,Mn3N2,-3.867408214,0.7462826014999959 -V2H4_12_20085.vasp,V2H4,-3.3020465100000003,0.35723697333333293 -Os2S4_127_13876.vasp,Os2S4,-3.2395758466666664,1.0585416591666665 -Hf4Br3Cl1O4_1_7770.vasp,Hf4Br3ClO4,-5.3428676658333325,0.20031920694443928 -Sr2Se2_164_17315.vasp,Sr2Se2,-2.326395675,0.2064380524999998 -Sc2Br6_189_16047.vasp,Sc2Br6,-2.15681319125,0.17140009249999988 -Na2Pt1F2_123_12269.vasp,Na2PtF2,-1.99072716,0.44137585200000007 -W2N1F2_164_20508.vasp,W2NF2,-4.790816850000001,0.13098858983332817 -Zr2Si2Se2_129_21687.vasp,Zr2Si2Se2,-4.4765677183333334,0.09986558000000034 -Pt2N1Cl2O1_25_14637.vasp,Pt2NCl2O,-2.29763183,0.221292005208326 -Ga2O2_164_6415.vasp,Ga2O2,-3.9758196825,0.26999473999999957 -Mg2Fe2Si2_129_10453.vasp,Mg2Fe2Si2,-1.648535625,0.08842867555555387 -Ba2Tl1Cu1Hg1S5_99_2083.vasp,Ba2TlCuHgS5,-1.768132168,0.27459917048827875 -Nb2F8_1_12715.vasp,Nb2F8,-4.011544028,0.187838445999996 -Nb2Br10_51_12641.vasp,Nb2Br10,-1.5546792016666666,0.2088299075000002 -Sr3Ni2S5Br2_123_17393.vasp,Sr3Ni2S5Br2,-2.1272578033333334,0.032965144427078874 -V1B4S6Cl1F4_1_19777.vasp,VB4S6ClF4,-3.23538377875,0.6376518905338497 -Sr3Pb1_25_17397.vasp,Sr3Pb,0.3397907675,0.8006840318749999 -Sn2Hg1Cl2O2_12_16774.vasp,Sn2HgCl2O2,-1.962089507142857,0.23288795482758506 -Te2Rh2_187_18505.vasp,Te2Rh2,-1.67288636,0.5504616820833312 -Cs2Hg4Se2S6F6_31_4741.vasp,Cs2Hg4Se2S6F6,-1.0262305,0.3346438884062479 -Nb1Bi1P1_156_12470.vasp,NbBiP,-3.8855702366666667,0.3664044299999967 -Y2S2Cl2_164_20772.vasp,Y2S2Cl2,-4.411903203333334,0.11313275999999917 -Hf1Mn1I6_149_7218.vasp,HfMnI6,-1.3365587725,0.07524256124999984 -Ca2Ag1S2Br2_38_2907.vasp,Ca2AgS2Br2,-1.7293494,0.2161051856696387 -V4Se4O16_14_20368.vasp,V4Se4O16,-4.50279133625,0.13103624791666713 -Zn1In1I2_1_20962.vasp,ZnInI2,0.330345075,0.2846732087500001 -Be4Sb2_59_2289.vasp,Be4Sb2,-1.9535156599999999,0.3084452208333316 -Sc1Ag1Sb2Se6_149_15893.vasp,ScAgSb2Se6,-2.12733199,0.12073849016666427 -Cr2Si1O4_21_4507.vasp,Cr2SiO4,-4.884128268571429,0.7917195514285655 -Au4Se4Br4_14_1596.vasp,Au4Se4Br4,-0.4186375466666667,0.04377256458333334 -Y1Si5_47_20676.vasp,YSi5,-3.888303516666667,-0.19077159222222617 -Zn2Se4_14_21168.vasp,Zn2Se4,-0.7146804250000001,0.5213179952777767 -Sr5Ce1_8_17488.vasp,Sr5Ce,0.473447245,1.1191708008333319 -Ga2P6_164_6431.vasp,Ga2P6,-3.25674921,-0.16198872750000026 -Ag2Se1S1Br2_1_424.vasp,Ag2SeSBr2,-0.461253165,0.29570831045138574 -Al2Br6_2_781.vasp,Al2Br6,-1.56741988875,0.09318825625000016 -Cu4Te4I4_14_5486.vasp,Cu4Te4I4,-0.21822771916666664,0.12827266369047588 -Rb2Te2H6C2O6_4_14951.vasp,Rb2Te2H6C2O6,-3.763008693333333,0.4931752688888758 -Co1B6C2Br2F4_6_3704.vasp,CoB6C2Br2F4,-3.915912928,0.674346928388881 -Cd1Fe1I1O1F1_1_3308.vasp,CdFeIOF,-1.344834612,0.3081908839444424 -Cu2As4Se3Cl2_6_5022.vasp,Cu2As4Se3Cl2,-1.7812237199999998,-0.26389151030303426 -Ti4B3_164_19125.vasp,Ti4B3,-6.134465568571429,0.46098461535713664 -Fe1O2_115_5731.vasp,FeO2,-3.3884325433333333,0.3535085512499969 -As2F8_1_1212.vasp,As2F8,-2.5329731349999998,0.08823225100000043 -V2Br6_189_20010.vasp,V2Br6,-1.51280913,0.19285101999999998 -Ta1Co2I1Br1Cl2O1_1_17529.vasp,TaCo2IBrCl2O,-2.3884111775,0.49794872020833225 -Ag4Se4_2_567.vasp,Ag4Se4,-0.4957064725,-0.20875046499999997 -Ag2Cl4_14_250.vasp,Ag2Cl4,-0.08967268333333334,0.10953919000000001 -Cu2Sb4Se3Br2_6_5280.vasp,Cu2Sb4Se3Br2,-1.3620652472727273,0.560373550454542 -K4Ni2As4_51_9485.vasp,K4Ni2As4,-1.019552429,0.13745351000000006 -Te2As2I2_1_18353.vasp,Te2As2I2,-1.3329585583333332,0.17893629333333338 -Te2Ir2I2_59_18395.vasp,Te2Ir2I2,-1.6997549333333335,0.18593835499999667 -Ga3S4_164_6535.vasp,Ga3S4,-2.827179252857143,0.07525509571428302 -Na3Mo1Cl6_149_12354.vasp,Na3MoCl6,-1.8106179139999998,0.21142174123957963 -Ag1F2_115_54.vasp,AgF2,-0.61508118,0.2203553216666666 -Re2F2_164_15044.vasp,Re2F2,-4.6809631575,0.31220155583332776 -Mg2Ni2Sn2_129_10491.vasp,Mg2Ni2Sn2,-0.24270454166666666,-0.237966135 -Bi4C2_113_2604.vasp,Bi4C2,-2.6168210533333336,0.3998660799999971 -P2Se2S1_164_14050.vasp,P2Se2S,-2.884652346,0.18204239255952093 -Ti3B2Se2F2_187_19067.vasp,Ti3B2Se2F2,-4.604073416666667,0.19949903518518064 -Sc3B2Cl2_187_16193.vasp,Sc3B2Cl2,-3.8508082528571426,-0.01590160900000659 -Zr1Mo1I3Br3_1_21327.vasp,ZrMoI3Br3,-1.582313085,0.19331859885416686 -Bi6O9_1_2670.vasp,Bi6O9,-3.235798879333333,0.6221953486666667 -Pr2Br2O2_129_14541.vasp,Pr2Br2O2,-4.814056656666667,0.07532714333333335 -Hf1V1Ge2Se8_1_7348.vasp,HfVGe2Se8,-3.1187544666666667,0.151917467361111 -Al4Bi4O12_14_1060.vasp,Al4Bi4O12,-4.767119228,0.19777744999999958 -Li4Zn2I8_11_10254.vasp,Li4Zn2I8,-0.8342420500000001,0.07931710946428513 -Ta1Pb1F7_6_17599.vasp,TaPbF7,-3.7302854577777773,0.16120369277777824 -Hf3H2N2O2_187_7708.vasp,Hf3H2N2O2,-6.501588691111111,0.5778066838888831 -Ag1C6N4O2_5_43.vasp,AgC6N4O2,-5.908719686923077,0.46798186352562765 -K2As2Pd2_12_8976.vasp,K2As2Pd2,-1.27423739,0.16078161527777485 -Li1W2S2I6_47_9814.vasp,LiW2S2I6,-1.7550010081818181,0.2685558159848438 -Bi2P2O8_11_2488.vasp,Bi2P2O8,-4.914408601666667,0.2677423266666663 -Na1Co1P2Se6_149_11846.vasp,NaCoP2Se6,-2.483002596,0.23995029406249813 -In1Pd1S2Br1Cl1_6_8306.vasp,InPdS2BrCl,-1.6430169166666666,0.18303376749999828 -Mn4H2S2N3_164_11438.vasp,Mn4H2S2N3,-3.8748075245454543,-0.5588739251894015 -Mg2Sb2S6_162_10504.vasp,Mg2Sb2S6,-2.52804018,-0.04254588406250237 -Cs2Cd4S2Cl6O6_31_4687.vasp,Cs2Cd4S2Cl6O6,-1.9641258175,0.15093768706249577 -Sb1H2O2_164_15457.vasp,SbH2O2,-3.7523200119999998,0.4028080091666645 -Ta2Fe4Te2Se2_51_17736.vasp,Ta2Fe4Te2Se2,-2.714678354,0.1886673010000004 -Fe2P6H12O18_7_5924.vasp,Fe2P6H12O18,-4.637846064210526,0.14464358374999176 -Ti4S2N3_164_19156.vasp,Ti4S2N3,-7.217008197777777,-0.2563158655555611 -Ti2Te2_129_19042.vasp,Ti2Te2,-4.00603269,0.42431712531249577 -Mn4C3O2_164_11428.vasp,Mn4C3O2,-4.623781833333333,0.32151216685184547 -Li2Mg1H4O10_2_9966.vasp,Li2MgH4O10,-3.7143624988235295,0.2931818780882314 -Sb2Te1S2_5_15707.vasp,Sb2TeS2,-2.334332828,0.1504311433333314 -V2N2F2_59_20114.vasp,V2N2F2,-5.033762511666667,-0.29793675472222647 -Sn2Br2Cl2_129_16740.vasp,Sn2Br2Cl2,-1.1710450383333333,0.24010466416666687 -Ca1Nb2N2Cl2_8_2859.vasp,CaNb2N2Cl2,-4.950941868571428,0.28996829928571044 -Sb2Te2S1_164_15721.vasp,Sb2Te2S,-2.098235246,0.06729957666666464 -Rb2Br2O6_11_14783.vasp,Rb2Br2O6,-2.3057982299999997,0.13445692975000068 -P2O3_1_13997.vasp,P2O3,-4.874029139999999,0.3847746136000012 -Ta1S2N1_156_17605.vasp,TaS2N,-4.34901075,1.0999763468750006 -Ga2As2Se6_147_6301.vasp,Ga2As2Se6,-2.2417537899999997,0.23625570600000034 -Cu1Pb3Se4_1_4938.vasp,CuPb3Se4,-1.40663141625,0.2835097377864584 -Ta1Se2_164_17621.vasp,TaSe2,-4.55047042,0.14460872166666672 -Zn1Cd1B1S1Cl1_1_20909.vasp,ZnCdBSCl,-1.000279722,0.5486198599666667 -Co1C4Br2N2F4_47_3714.vasp,CoC4Br2N2F4,-4.183874726153847,0.19048720556622517 -Ni1S1Cl1_8_13410.vasp,NiSCl,-1.0342035166666668,0.04234944187499812 -Ba2Co2Sn2_129_1956.vasp,Ba2Co2Sn2,-1.0328141766666665,0.4184740566666656 -Ag4Bi4_51_503.vasp,Ag4Bi4,-0.0944695475,-0.22272198250000003 -V1Cr1Mo1Br1Cl1O3_1_19805.vasp,VCrMoBrClO3,-3.846531995,0.14785864942707871 -Tm2Br2O2_129_19671.vasp,Tm2Br2O2,-4.784412128333334,0.04108329999999949 -Y2Se6_129_20779.vasp,Y2Se6,-3.70836055875,-0.7520982224999999 -Cr2Se2Cl2_59_4494.vasp,Cr2Se2Cl2,-2.3013842033333334,-0.10236966999999986 -Sn3P2S9_174_16921.vasp,Sn3P2S9,-2.633240192857143,0.2680668846428512 -P2Pt1_123_14030.vasp,P2Pt,-2.9971635366666667,1.2815228516666664 -Ta4Co4Se8_53_18026.vasp,Ta4Co4Se8,-3.749930740625,0.19010338812499983 -Al1F2_164_654.vasp,AlF2,-2.965603103333333,0.8545541838888855 -Cs2S6N2_11_4783.vasp,Cs2S6N2,-2.665507344,0.435917878999998 -Zr1P2H2S6_164_21391.vasp,ZrP2H2S6,-3.3817656790909094,0.350705591193175 -V6N4O16_100_20389.vasp,V6N4O16,-5.097611452692307,0.3243567739999902 -Si1Se2_164_16367.vasp,SiSe2,-2.9926322333333335,0.13279288354166674 -K2Be2_11_9001.vasp,K2Be2,0.461341725,0.9695400875000001 -Bi2Cl6_191_2449.vasp,Bi2Cl6,-1.27776611625,0.13752734374999998 -V4Te4O16_14_20375.vasp,V4Te4O16,-4.469234737083333,0.2595145858333332 -Pt2Se6_11_14687.vasp,Pt2Se6,-1.92957666125,0.3351044108333331 -Sr2H2I2_129_17233.vasp,Sr2H2I2,-1.98693776,0.050580099999999906 -Pt2S4I1F1_1_14668.vasp,Pt2S4IF,-1.82033221,0.3503348258203125 -Zr2Ge2Te2_129_21572.vasp,Zr2Ge2Te2,-3.6436418400000004,0.10614220166666621 -Tl1Ag1P2Se6_149_19203.vasp,TlAgP2Se6,-1.9464087549999998,0.11073017260416479 -Te4Os3_156_18604.vasp,Te4Os3,-2.4917214985714287,0.23680563285713774 -Sn6W2O12_2_17002.vasp,Sn6W2O12,-4.4144329915,0.16047693124999673 -Li1Ga1Te6P2_5_9719.vasp,LiGaTe6P2,-1.9513948280000002,0.25610296316666525 -Ga1Ag1Br2_1_6112.vasp,GaAgBr2,-0.57119587,0.22590715334173292 -Ca5Sc1_1_3251.vasp,Ca5Sc,0.33755240000000003,1.3030917208333315 -Ca2F4_51_3014.vasp,Ca2F4,-3.3247222083333337,0.5190260883333329 -Pb2Se2O6_11_14289.vasp,Pb2Se2O6,-3.4811641119999996,0.1759106850000003 -C1Cl2_164_2724.vasp,CCl2,-1.48495051,1.4307766083333278 -Na2Bi2Pd2_12_11991.vasp,Na2Bi2Pd2,-0.962574005,0.17594265888888777 -Li6S2O8F2_11_10272.vasp,Li6S2O8F2,-3.8453618400000003,0.47628116777777363 -Fe1H4C6Br2N2_25_5701.vasp,FeH4C6Br2N2,-5.2042937553333335,0.13742612799998666 -Y1N2_187_20656.vasp,YN2,-6.2962675033333335,0.20897335416666074 -Ag1Au2Se2Br2_1_15.vasp,AgAu2Se2Br2,-0.18072508857142858,0.18319186053571365 -Mn1Te1Br2_25_10904.vasp,MnTeBr2,-1.0671532925,0.2877936897916667 -Cr3Mo1O8_25_4561.vasp,Cr3MoO8,-5.001321356666667,0.031209629357634827 -Cr1I1Br1_156_4196.vasp,CrIBr,-0.9522867633333334,0.3659841138888875 -Si3Rh1_187_16477.vasp,Si3Rh,-2.8159658425,0.8880557745833304 -Sn1As1Br2O3_1_16598.vasp,SnAsBr2O3,-2.920593854285714,0.2325853779464262 -Ag1I2_164_83.vasp,AgI2,0.5215032866666667,0.16276409395833366 -In2S2I2_31_8548.vasp,In2S2I2,-1.4934767649999998,0.05075166750000015 -Co2Bi4Cl4O6_11_3870.vasp,Co2Bi4Cl4O6,-2.855381160625,-0.028293019999999593 -Ca2Sb4S8_11_3121.vasp,Ca2Sb4S8,-2.8035452021428573,0.04092462357142601 -Al1Ag1Sb2S6_149_601.vasp,AlAgSb2S6,-2.3542605389999998,0.34535633493749796 -Na2C6S6F6_1_12014.vasp,Na2C6S6F6,-3.836766651,0.24596561131250005 -Fe1H1O2_156_5684.vasp,FeHO2,-3.8354503025,0.28309359874999984 -Zn2Bi4S6I4_31_21050.vasp,Zn2Bi4S6I4,-1.278375720625,0.22486852050000017 -Zr3H2C2_187_21765.vasp,Zr3H2C2,-5.67338035,0.054314938571422555 -V1W1Br2N1O1_25_19951.vasp,VWBr2NO,-4.252748495,-0.20903677063072745 -Mn1Nb1S3Br2_1_10809.vasp,MnNbS3Br2,-2.8144155399999997,0.402290871749994 -Ba2Cu1Br2O2_123_1962.vasp,Ba2CuBr2O2,-2.753709787142857,0.16942920065475775 -Cr2Br2N2_59_4331.vasp,Cr2Br2N2,-3.71749324,-0.06603424833333671 -Sr2Cl4O8_50_17182.vasp,Sr2Cl4O8,-2.710380419285714,0.23644315142856942 -Se2_47_16293.vasp,Se2,-1.64519607,0.6627924833333334 -Ho2H4Cl2O4_11_8139.vasp,Ho2H4Cl2O4,-4.6664757324999995,0.08116223583333415 -K3Mo2Br9_174_9402.vasp,K3Mo2Br9,-1.2502942921428573,0.10716406982142745 -Mg1Sn2N2_115_10406.vasp,MgSn2N2,-3.400245622,-0.41913835799999966 -V3I2N2_1_20273.vasp,V3I2N2,-3.9354336885714285,0.24036021301586652 -Yb1I2_164_20856.vasp,YbI2,-1.5290664200000001,0.09199673333333314 -Cd2Fe3O8_10_3505.vasp,Cd2Fe3O8,-2.8213210715384616,0.19295170213140572 -K2Zr2Cu2S6_51_9399.vasp,K2Zr2Cu2S6,-2.928377178333333,0.20282480750000031 -Nb1Te1S1Br1_1_12596.vasp,NbTeSBr,-3.0194116975,0.41125682738094965 -Al1Fe5I2_123_660.vasp,AlFe5I2,-0.35945515875,1.2470977945833321 -In2F2_129_8423.vasp,In2F2,-1.7538387075,0.6775012458333314 -Cd1Bi1Te1Br1_1_3282.vasp,CdBiTeBr,-0.1640808825,-0.02522523062500004 -Fe1Au1S2I1Cl1_1_5619.vasp,FeAuS2ICl,-1.078198765,-0.05101345921007283 -Bi1As2Au1S6_143_2315.vasp,BiAs2AuS6,-2.2633888779999998,0.1929660134687476 -Ti1Fe2Se4_1_18780.vasp,TiFe2Se4,-2.6171084757142857,0.09017965499999692 -Os2Cl6_191_13843.vasp,Os2Cl6,-1.49338167875,0.39479245281249975 -Zn2Te2H4O8_7_21177.vasp,Zn2Te2H4O8,-3.5042523675,0.06748840590277494 -Rb2I1_164_14891.vasp,Rb2I,0.10513633666666666,0.11501049666666657 -Co4I4O4_14_4080.vasp,Co4I4O4,-2.16102282,-0.2592354937962974 -Mn2C2I2_59_11046.vasp,Mn2C2I2,-2.9121475783333337,0.5172249291666624 -Cd1H1_183_3335.vasp,CdH,0.377962065,1.384442825 -Ni4Se3S5_8_13764.vasp,Ni4Se3S5,-1.5463270566666667,0.21023087350694242 -Sb1Te2H1O6_1_15513.vasp,SbTe2HO6,-3.84345948,0.08514101936457993 -Au4S4Cl4_14_1585.vasp,Au4S4Cl4,-0.7579061083333333,0.08796359466666603 -Hf2C2F2_59_7467.vasp,Hf2C2F2,-5.915409589999999,0.8170573995833281 -Te6P2Pb2_147_18667.vasp,Te6P2Pb2,-1.7453637560000002,-0.3317571263333349 -Ge4Te4P4_17_6951.vasp,Ge4Te4P4,-2.7958827441666667,-0.4717231991666686 -V1Cu1As2S6_5_19811.vasp,VCuAs2S6,-2.705355005,0.4797981482083309 -Ta2Se2I2_59_17872.vasp,Ta2Se2I2,-3.504397435,0.20491344035714332 -Mn1V1Te2_115_10927.vasp,MnVTe2,-2.1742908975,0.2557319529166666 -Lu2Fe2Ge4_129_10309.vasp,Lu2Fe2Ge4,-2.35321444,0.27405982812499474 -Sn1I2_115_16649.vasp,SnI2,-0.39373076,0.3218393311111111 -Li2Ta2O3F6_5_10080.vasp,Li2Ta2O3F6,-5.181217753076923,0.00409267051282125 -Ga2I6_162_6391.vasp,Ga2I6,-0.45962702875,0.15354143187499997 -Pd2Se2F2_59_14486.vasp,Pd2Se2F2,-1.5955735233333332,0.0424590981249971 -Mg2Sb6P6O26_11_10512.vasp,Mg2Sb6P6O26,-4.90852064675,0.31985053504166183 -Te1P2S2_5_18318.vasp,TeP2S2,-2.847620002,0.27775737505208337 -Hf1Te2_187_7326.vasp,HfTe2,-3.484423963333333,0.2638358733333339 -Tb1C2_123_18170.vasp,TbC2,-5.616882783333334,0.7966817033333329 -Sb3Pb1_187_15756.vasp,Sb3Pb,-1.12671052,0.9180113143749997 -Al2In2Te6_31_892.vasp,Al2In2Te6,-1.719198974,0.07812989112500002 -K2H8Br2O4_2_9157.vasp,K2H8Br2O4,-3.457624945,0.027181678958333677 -B1Te2Mo2_164_1640.vasp,BTe2Mo2,-3.27430898,-0.0069226019999995 -Rb2Cd4Te2S6Cl6_31_14828.vasp,Rb2Cd4Te2S6Cl6,-1.0195338995,0.041969044791665966 -Cr4H2S2N3_164_4605.vasp,Cr4H2S2N3,-4.285414824545454,0.20686961786615232 -Pd2I6_162_14437.vasp,Pd2I6,0.06954355875,0.19263254234374996 -Zn2Se2S8F4_7_21165.vasp,Zn2Se2S8F4,-1.69401259375,0.5021954416666667 -Sc2Ge1_164_16075.vasp,Sc2Ge,-2.5804196966666666,0.3240578733333308 -Sb6C2_164_15845.vasp,Sb6C2,-2.76935513,0.9724015268749997 -Os2Br6_162_13834.vasp,Os2Br6,-1.40679056125,0.09533191625000015 -Nb2Co1S4_164_12688.vasp,Nb2CoS4,-4.163000945714286,0.45451199619047333 -Eu2H2I2_129_5601.vasp,Eu2H2I2,-2.6016441666666665,0.08561104500000027 -Nb2Rh2S8_11_12827.vasp,Nb2Rh2S8,-3.9536224108333333,0.06975606916666321 -In1Pd5F2_123_8312.vasp,InPd5F2,-0.98988309625,0.7370858141666645 -Nb4Co2Pd1Se12_12_13053.vasp,Nb4Co2PdSe12,-3.4278387936842107,0.08163204578947347 -Ag2Sn2S6_51_448.vasp,Ag2Sn2S6,-1.753755365,0.2171728629374977 -As18Cl4_11_1129.vasp,As18Cl4,-2.7544148695454544,0.06445961166666425 -Ba2H2Br2_129_1991.vasp,Ba2H2Br2,-2.4236255183333335,0.08419778333333294 -Ba2Tl1Cd1Au1S5_99_2079.vasp,Ba2TlCdAuS5,-1.635185293,0.3983501281249969 -Cr2S5_8_4474.vasp,Cr2S5,-2.989863824285714,0.35293103848214036 -Re2Ni1P2S8_8_15061.vasp,Re2NiP2S8,-3.6028856900000004,0.24121238918802712 -Ni2S2Br4_35_13581.vasp,Ni2S2Br4,-0.6318516475,-0.011055762656249968 -Co2Sb1O6_12_3991.vasp,Co2SbO6,-4.015003435555555,-0.306987299236114 -Cu2F6_191_5096.vasp,Cu2F6,-0.72952234125,0.07897441374999992 -Te6P2W2_2_18672.vasp,Te6P2W2,-2.508295322,0.22068120000000013 -Bi2Cl2_12_2445.vasp,Bi2Cl2,-1.0488272,0.050324438333332305 -Zr2Si2Te8_31_21690.vasp,Zr2Si2Te8,-2.6791030041666666,-0.12374708375000476 -Mn3N12_12_11394.vasp,Mn3N12,-5.837585131333333,-0.31203889583333266 -Sn1S1_156_16677.vasp,SnS,-2.23070145,0.23312877124999964 -Cr2Se6_11_4505.vasp,Cr2Se6,-2.3981160525,0.2537452970833335 -Mn1Cr1Te1I5_1_10680.vasp,MnCrTeI5,-0.702674875,0.09405645020833267 -Ti1P2_164_18824.vasp,TiP2,-4.878631636666666,0.7590914541666667 -Ir1Pd1S2Br2_6_8747.vasp,IrPdS2Br2,-1.8872965666666666,-0.05687136833333639 -H8Ru2_1_7098.vasp,H8Ru2,-3.2038780780000002,1.4963189030000001 -K1Al1I4O12_2_8877.vasp,KAlI4O12,-3.00744415,0.13749569729166422 -Rb2Hg4Te2I6O6_31_14886.vasp,Rb2Hg4Te2I6O6,-1.063932481,0.15270278920833064 -Cr4H2C3O2_164_4601.vasp,Cr4H2C3O2,-4.9295219427272725,0.1637049256060512 -Cu2Sb4Se3Cl2_6_5281.vasp,Cu2Sb4Se3Cl2,-1.45430574,0.6266716604545419 -K4Pr4P8S24_14_9497.vasp,K4Pr4P8S24,-3.5106108345000004,0.054469810499999216 -In3Ge1F8_1_8647.vasp,In3GeF8,-2.472835305,0.08024712374999765 -Ba2V3O8_123_2087.vasp,Ba2V3O8,-5.302658195384615,0.22734526024038026 -Nb1Sn1I1Br1N1O2_1_12586.vasp,NbSnIBrNO2,-4.086936407142857,0.1892875174999865 -Hf1Se2_164_7309.vasp,HfSe2,-4.5995802433333335,0.1282380200000004 -Cu2P4H8O8_14_5217.vasp,Cu2P4H8O8,-3.9945846263636366,0.19137224075757509 -Zn1Ge1Se2Br2_1_20944.vasp,ZnGeSe2Br2,-1.2542847083333333,0.14415147215277768 -Cr3O8_2_4573.vasp,Cr3O8,-4.789229582727272,-0.236839557102277 -Tl1I1O3_156_19287.vasp,TlIO3,-2.2164032160000002,0.6574320399999998 -K2Cd4S2O6F6_31_9049.vasp,K2Cd4S2O6F6,-2.2557197909999998,0.19274255321874922 -Bi2F2_12_2454.vasp,Bi2F2,-1.6937481975,0.45874504458333143 -Ta2Fe2S10_51_17726.vasp,Ta2Fe2S10,-3.564494327857143,-0.010849481428573782 -Cr1Te6As2Au1_5_4280.vasp,CrTe6As2Au,-1.505645373,0.20663556033333086 -Al2Hg1Se4_164_873.vasp,Al2HgSe4,-1.999597007142857,0.19878980571428606 -Li1Si1Te1Br1_1_9789.vasp,LiSiTeBr,-2.06010776,0.3740050456249997 -Sr2Cd1In1Ag1S5_99_17170.vasp,Sr2CdInAgS5,-1.710658096,0.3405281867500002 -Te6N4_11_18657.vasp,Te6N4,-2.696033957,0.4605377460000005 -V2B1H2S2_164_19989.vasp,V2BH2S2,-3.8281573014285715,0.8262481076190435 -Hg1Br2_12_7846.vasp,HgBr2,0.50386998,0.07695264666666674 -Ag2Sb2C4N4Cl4F12_14_397.vasp,Ag2Sb2C4N4Cl4F12,-3.2082894975,0.21504156008431802 -Nb1Si1Te2Br1_1_12583.vasp,NbSiTe2Br,-2.60406276,0.5358322705083334 -Hf2I1N2Cl1_156_7511.vasp,Hf2IN2Cl,-5.595158179999999,0.3566567725000005 -Ce2Bi2S4O2_99_3664.vasp,Ce2Bi2S4O2,-4.14613529,-0.5395796002500053 -Cu1Ge1H6_2_4880.vasp,CuGeH6,-2.356049295,1.459267641249999 -W1O2F2_38_20440.vasp,WO2F2,-4.83636788,-0.052849708000000106 -Ru2Se2I2_59_15356.vasp,Ru2Se2I2,-1.8990767116666667,0.2008786841666641 -Ca4Ce2_51_3208.vasp,Ca4Ce2,-0.11596057,1.0686813383333322 -K4Co2Se4_49_9436.vasp,K4Co2Se4,-1.218554452,0.23352477318518328 -Hf6N2F26_164_7827.vasp,Hf6N2F26,-4.422572932352941,0.30890234862744304 -V1O2_164_19893.vasp,VO2,-5.494078946666666,0.18386012833333432 -Cs2Hg4Se2S6Cl6_31_4740.vasp,Cs2Hg4Se2S6Cl6,-0.7855113055,0.2561624408124993 -Te6N4_2_18658.vasp,Te6N4,-2.679674559,0.4768971440000006 -Si2Sb2Te6_147_16443.vasp,Si2Sb2Te6,-1.934610761,0.2347317069999999 -V2Br5_1_20008.vasp,V2Br5,-1.4964221057142857,0.22666147999999842 -Rb6O3_143_14983.vasp,Rb6O3,-1.2891628877777779,0.06244923222222232 -Tl4As4_127_19589.vasp,Tl4As4,-0.74262803125,0.7761726004999999 -Ba4P4Se8F4_14_2173.vasp,Ba4P4Se8F4,-3.1417529585,0.10024853518750021 -K2Pb1O6F6_147_9293.vasp,K2PbO6F6,-1.7994110386666666,0.8868235371666671 -Ba1O2_123_1849.vasp,BaO2,-3.8742595433333338,0.4671971599999991 -Ga2As2O6_2_6300.vasp,Ga2As2O6,-4.100879064,0.31509179466665804 -Nb3H2S2N2_187_12978.vasp,Nb3H2S2N2,-5.5137376966666665,0.08311278851851545 -Mn2As2Cl2O4_26_10964.vasp,Mn2As2Cl2O4,-3.4925883939999998,0.043037793763150645 -Tl1Fe5F2_123_19268.vasp,TlFe5F2,-0.48320234125,1.6501096716666646 -Cd4Br8_115_3622.vasp,Cd4Br8,0.1471411325,0.16702500333333334 -Tc2Cl8_14_18227.vasp,Tc2Cl8,-2.257519589,0.10045370099999973 -Li2V2Au4O12_31_10110.vasp,Li2V2Au4O12,-3.3614886669999997,0.22081517950000062 -Ag2H8C14N8_2_289.vasp,Ag2H8C14N8,-5.863558825625,-1.3199162116145875 -Zr3B2S2_187_21743.vasp,Zr3B2S2,-5.19380982,0.03682421857142382 -Er2Sb2S4O2_129_5571.vasp,Er2Sb2S4O2,-4.333321842,0.020423499416661883 -Fe1H4C2I2N4_47_5692.vasp,FeH4C2I2N4,-4.343840810769231,0.01615881275640385 -Co1H4C4I2N2_47_3753.vasp,CoH4C4I2N2,-4.670002733846154,0.11855383897434417 -Mn2Cl2O2_59_11050.vasp,Mn2Cl2O2,-3.116506993333333,-0.03527682333333626 -Sb6C6_12_15847.vasp,Sb6C6,-4.3626657925000005,0.8372804487499994 -Ta2Te4_127_17918.vasp,Ta2Te4,-2.5428968199999997,1.2049865488888893 -Nb2Ag2Se4O14_51_12621.vasp,Nb2Ag2Se4O14,-4.216037994090909,0.09133984409090878 -Mg1Hg3Cl8O6_2_10373.vasp,MgHg3Cl8O6,-1.1591345322222222,0.23930556902777567 -Te2Mo2_25_18414.vasp,Te2Mo2,-2.220398055,0.6329096824999998 -Ta3Ni3Te14_6_17974.vasp,Ta3Ni3Te14,-2.1440499545000002,0.098852460999997 -V1Br5_10_19791.vasp,VBr5,-0.843718485,0.32008114333333293 -Hf2H2N1O2_164_7504.vasp,Hf2H2NO2,-6.06777676,0.8414060642857022 -K4Cd4Ge4As8_2_9429.vasp,K4Cd4Ge4As8,-1.3760706565,0.12348559749999999 -Nb2S2_164_12847.vasp,Nb2S2,-4.8435071025,0.2680741009999945 -Fe1H2_187_5687.vasp,FeH2,-2.0773888166666667,0.6439465116666643 -Sn4S4_29_16962.vasp,Sn4S4,-2.3537551925,0.11007502874999986 -Hf2Ge4_59_7501.vasp,Hf2Ge4,-4.198629101666667,0.3837140899999998 -Ba2Bi3O7_25_1920.vasp,Ba2Bi3O7,-3.8267756583333337,0.2150655022916591 -Ag2Se4F2_4_442.vasp,Ag2Se4F2,-1.13995531375,-0.3078434522321445 -In1Sn3Se1Cl5O4_1_8362.vasp,InSn3SeCl5O4,-2.5434387485714285,0.24050024845237652 -Rb2Hg4S6Br6O2_31_14871.vasp,Rb2Hg4S6Br6O2,-0.6744528175,0.5039218909340245 -Ni4Sb4Te4_13_13763.vasp,Ni4Sb4Te4,-0.9419998216666667,0.28761594547618924 -Ta2Br2_129_17667.vasp,Ta2Br2,-3.4357929825,1.3433948773214217 -Te4Au2Br2_1_18564.vasp,Te4Au2Br2,-0.38638883125,0.18188564374999994 -K6Tl11_150_9547.vasp,K6Tl11,0.4479597394117647,-0.07098170031092396 -Ni1C12N2Cl2_10_13291.vasp,NiC12N2Cl2,-5.336890555882353,1.2618026399999933 -W2I6_189_20505.vasp,W2I6,-0.89780156625,0.5794720190624985 -Ge2F8_1_6775.vasp,Ge2F8,-2.799360868,-0.05067600199999989 -Ni1Se2_187_13424.vasp,NiSe2,-1.1078772700000001,0.3758782433333332 -Sn1Bi2Te4_164_16616.vasp,SnBi2Te4,-1.52237169,0.059255717142857156 -Ge4O6_11_6934.vasp,Ge4O6,-4.6241289000000005,-0.010662341750005133 -Fe1Br2_164_5639.vasp,FeBr2,-1.1329120566666666,-0.2778022349999999 -Ta1Re1Te4_6_17600.vasp,TaReTe4,-3.5672778800000002,0.06682789944444445 -K2H6C2S2O6_4_9137.vasp,K2H6C2S2O6,-4.274037422222222,0.10973235680555171 -Co1O2_191_3807.vasp,CoO2,-2.56459467,0.5325717620833308 -Mn2Mo2Cl2O8_129_11137.vasp,Mn2Mo2Cl2O8,-4.098304241428571,0.07994645708332676 -Au2S2_187_1516.vasp,Au2S2,-0.48383848,0.5279500850000001 -Pt2Cl6_164_14618.vasp,Pt2Cl6,-0.43384809125,0.5638177229166667 -Cd1B4N2Cl2F4_10_3278.vasp,CdB4N2Cl2F4,-3.9709397884615383,0.3645869778632402 -Y4Te6Mo2O24_11_20839.vasp,Y4Te6Mo2O24,-5.10382093,0.033092413888874184 -Nb2Ir2S8_11_12759.vasp,Nb2Ir2S8,-4.179238039166667,-0.4913030508333338 -Ag3Bi2Te4_164_497.vasp,Ag3Bi2Te4,-0.5091034855555556,0.2655788277777771 -Fe2Se4F2_1_5985.vasp,Fe2Se4F2,-1.79006460625,0.35344311263888684 -Mo1W3O8_25_11556.vasp,MoW3O8,-5.944104230833333,0.17429981425169583 -Sn2Pb2F8_129_16830.vasp,Sn2Pb2F8,-2.6577622,0.0282050745833331 -Bi1I3_187_2344.vasp,BiI3,-0.01389459,0.47585943625 -Ta2S4I2_11_17861.vasp,Ta2S4I2,-3.72112314875,0.22091675484375006 -Cu2H8C16N4Cl2O2_2_5141.vasp,Cu2H8C16N4Cl2O2,-5.68833361117647,0.32126723868871077 -Ba4As4Se8Cl4_14_2135.vasp,Ba4As4Se8Cl4,-2.615427785,0.10101980475000027 -Na4B20H16O40_14_12367.vasp,Na4B20H16O40,-5.838565818,0.04229420174999987 -Na1In1Sb2S6_5_11889.vasp,NaInSb2S6,-2.377996537,0.2901916461874974 -Li2V1_187_10107.vasp,Li2V,-1.6438365633333334,0.9875947077777756 -Ba2Tl2Cu1O6_123_2086.vasp,Ba2Tl2CuO6,-2.604382331818182,0.7152406219318127 -Ta1I1F1_156_17554.vasp,TaIF,-2.9956269066666668,1.0409894130714168 -Na2B2F8_59_11972.vasp,Na2B2F8,-3.8560469391666667,0.09520850333333364 -Hg2Te2Au2Br2_26_8023.vasp,Hg2Te2Au2Br2,0.42569834125,0.2446498875 -Os2Cl2_129_13838.vasp,Os2Cl2,-1.6341233225,1.587475401875 -Ni2F2_129_13501.vasp,Ni2F2,0.01893213,1.3175914712499999 -Tl1Ni5F2_38_19307.vasp,TlNi5F2,0.25643844625,1.756222106875 -K1Tl1Cl4O12_2_8950.vasp,KTlCl4O12,-2.341973771666667,0.2361663374999976 -Zn3Sb1_187_21209.vasp,Zn3Sb,1.4244608875,0.30807174875 -Nb1Te1Se1_156_12598.vasp,NbTeSe,-3.694128623333333,0.1282660609722226 -Zr1Nb1Br1N1Cl1_8_21337.vasp,ZrNbBrNCl,-4.770296638,0.2560025137618993 -Mn2Te2_164_11308.vasp,Mn2Te2,-1.5507296725,0.2955080181896552 -P4S8_11_14119.vasp,P4S8,-3.0742200516666665,0.20949820322916057 -Cu4Se2_4_5470.vasp,Cu4Se2,-0.37546805833333335,0.04022934083333218 -Nb2Se2_123_12878.vasp,Nb2Se2,-4.4110159325,-0.16961697774999918 -Hf2N2F2_164_7543.vasp,Hf2N2F2,-6.739210951666667,0.15687106291666097 -Rb1Hf1Mg6O7_99_14736.vasp,RbHfMg6O7,-4.130793414,-0.11157300724243326 -Mn2In2Se5_156_11126.vasp,Mn2In2Se5,-2.077760302222222,0.04598468695402108 -K2Cd4Se2S6I6_31_9065.vasp,K2Cd4Se2S6I6,-0.6415828905,0.11060076212499803 -Al2Ga2S6_31_844.vasp,Al2Ga2S6,-3.305156669,0.025048955875 -K4Te4O8_13_9522.vasp,K4Te4O8,-2.895417824375,0.2313463294791666 -P6O12F2_4_14137.vasp,P6O12F2,-4.598183504,0.5531702848999969 -Tl2Se2_2_19533.vasp,Tl2Se2,-0.9541500925,0.3457295485416666 -Te2Mo2_187_18411.vasp,Te2Mo2,-1.8808245625,0.9724831749999998 -Ta3H2C2S2_187_17959.vasp,Ta3H2C2S2,-5.965094334444444,0.4390717744444317 -Fe2Te2_164_6007.vasp,Fe2Te2,-0.5296522675,1.2365039837499998 -Te8F8_2_18694.vasp,Te8F8,-1.655404948125,0.347763933125 -Fe2Bi2O4F2_26_5807.vasp,Fe2Bi2O4F2,-3.220423822,0.1728564052857085 -Nb2V2S10_11_12937.vasp,Nb2V2S10,-4.127709755714286,0.006867344910710171 -Pb1_123_14213.vasp,Pb,-0.15504285,1.17314327 -Mn1H12C16N2O4_2_10759.vasp,MnH12C16N2O4,-5.883717262285714,0.20784664698807997 -V1Fe1Br3Cl1O2_8_19829.vasp,VFeBr3ClO2,-2.40887010375,0.13063661569531146 -Zr2F8_1_21566.vasp,Zr2F8,-4.473009144000001,0.11861491099999899 -Cd2Te2Au2F2_26_3586.vasp,Cd2Te2Au2F2,-0.074682405,0.16332504967000006 -Na2Sc1_187_12297.vasp,Na2Sc,-0.6635517766666666,0.4227706583333325 -Na2Cd4S2I6O6_31_12027.vasp,Na2Cd4S2I6O6,-1.6970124025,0.11455519256250074 -Ni4Sb2_129_13759.vasp,Ni4Sb2,-0.23446251333333334,0.34329646111111056 -Cu2P4O12_12_5218.vasp,Cu2P4O12,-4.5038220849999995,0.33911124111111235 -Si6P2_191_16537.vasp,Si6P2,-3.42268753,0.2706578245833329 -As4Se6_7_1374.vasp,As4Se6,-2.431923148,0.17410186700000008 -Sb2O3_164_15614.vasp,Sb2O3,-3.7946709060000003,0.4628195614999999 -Zr1S2_123_21416.vasp,ZrS2,-4.2835137266666665,0.5153568408333333 -B2W3Cl2_187_1720.vasp,B2W3Cl2,-4.650370928571428,0.3097521938095148 -Fe1P2S6_5_5734.vasp,FeP2S6,-2.8930729466666665,-0.058552138402783394 -Zr2S2I1Br1_6_21646.vasp,Zr2S2IBr,-3.47554264,0.1842364533333296 -Au4S4Br4F4_2_1582.vasp,Au4S4Br4F4,-0.815522860625,0.17301029345051958 -Bi2C6_191_2440.vasp,Bi2C6,-5.14576059875,1.0582004575 -Li2C10S2F6_51_9847.vasp,Li2C10S2F6,-4.31733292,1.0579399414375 -Na1Ga1Cl4O12_2_11861.vasp,NaGaCl4O12,-2.6518291466666666,0.017996905833331134 -Tl1Sb1Se4_47_19336.vasp,TlSbSe4,-1.2580590383333334,0.787601937777776 -Al1Ni5Br2_123_696.vasp,AlNi5Br2,-0.148553015,1.2083043129166657 -Ni1H1S2_1_13323.vasp,NiHS2,-2.080473895,0.18694968007812268 -Cu1H2_187_4894.vasp,CuH2,-1.6454517633333332,2.101192459999997 -Sr2Co2Ge2_129_17191.vasp,Sr2Co2Ge2,-1.7310414983333333,0.20354283555555375 -Ca1N2O6_21_2857.vasp,CaN2O6,-4.699502716666667,0.09176432083333275 -Hf1Ag1Mo1Se1S2I1Br3_1_7102.vasp,HfAgMoSeS2IBr3,-2.1422623659999998,0.35130182904166496 -Te1As2S2_1_18283.vasp,TeAs2S2,-2.567777036,0.15450009008333349 -Sb2Te1O2_12_15705.vasp,Sb2TeO2,-3.00991673,0.4438454729999972 -Zr2I6_162_21596.vasp,Zr2I6,-1.5490439725,0.20102717749999988 -Co2H16C8O14_2_3906.vasp,Co2H16C8O14,-4.953438232,0.12224562541666106 -Cu2P4Se3Cl2_6_5225.vasp,Cu2P4Se3Cl2,-2.0895142763636363,0.15067034211173885 -Pd2Se2Cl2_59_14484.vasp,Pd2Se2Cl2,-1.3213032033333334,-0.17042124166666683 -Zn4Ag4O10_6_21210.vasp,Zn4Ag4O10,-1.6465994105555555,0.3127797912499982 -Fe2P2S6_12_5917.vasp,Fe2P2S6,-3.086773457,-0.3764127321363697 -Ni2Ir2S4Br2_1_13532.vasp,Ni2Ir2S4Br2,-1.7278622940000001,0.18890740666666195 -Hg4W2S8_13_8095.vasp,Hg4W2S8,-1.7957380950000001,0.23892610357142607 -Na4Sb4P8S24_14_12415.vasp,Na4Sb4P8S24,-3.054444229,0.07445188124999991 -Sn2As1_164_16713.vasp,Sn2As,-1.7160499566666667,-0.5510287022222234 -Mo2Cl2O2_59_11594.vasp,Mo2Cl2O2,-3.5324331033333336,0.2724375563888888 -Nb1Se1O1_25_12575.vasp,NbSeO,-5.161189013333334,0.4595005935416667 -Ta2S3F3_8_17857.vasp,Ta2S3F3,-4.5742846125,0.30685379137499624 -Ga2P2Se2S4_1_6427.vasp,Ga2P2Se2S4,-2.823312426,0.15956444089705307 -Co2H16N4O4F8_14_3907.vasp,Co2H16N4O4F8,-3.7768744229411766,0.10239080570260145 -Ga2Co1Se4_164_6328.vasp,Ga2CoSe4,-2.307057124285714,-0.013340578619052135 -Tm1As2_21_19658.vasp,TmAs2,-2.847223766666667,0.5765028433333299 -Cr2I2N2_12_4410.vasp,Cr2I2N2,-3.3754349083333337,0.11751781166666309 -Si8Rh2_125_16551.vasp,Si8Rh2,-3.66857727,-0.10733016633333703 -Co1Cl2_187_3730.vasp,CoCl2,-0.8665913633333333,0.24706683833333343 -Tl2I2N2_59_19432.vasp,Tl2I2N2,-1.2354603783333333,0.9012650341666648 -K2Pt1C4N4Cl2_2_9304.vasp,K2PtC4N4Cl2,-4.746159426923077,0.3246786674358908 -Cr2Te8Mo2_25_4535.vasp,Cr2Te8Mo2,-2.010414005,0.01655618944444459 -Ga1Ni5I2_123_6223.vasp,GaNi5I2,0.17594717625,-0.05718584198519261 -Fe2Te1Se1_99_5992.vasp,Fe2TeSe,-0.9966465075,0.578128036875 -Cs2Cl2O6_11_4709.vasp,Cs2Cl2O6,-2.435538584,0.09740810337499717 -Mn1Ga1S2I1Br1_6_10722.vasp,MnGaS2IBr,-1.928591235,0.18440782368055186 -Nb2Te2Cl2_59_12906.vasp,Nb2Te2Cl2,-3.2413257816666667,-0.11694172388889534 -Mn1Al2Te4_156_10631.vasp,MnAl2Te4,-1.9220771171428572,0.18841529600648915 -Ho1N2_21_8116.vasp,HoN2,-5.606273936666667,0.2430694541666618 -Sr4Mn2Br2O6_129_17444.vasp,Sr4Mn2Br2O6,-3.928745607142857,-0.03231508535714722 -Ca1Sb2O5_1_2875.vasp,CaSb2O5,-4.17578417875,0.3272044220000001 -Sc2As2S6_157_16027.vasp,Sc2As2S6,-3.633046314,0.41991888050000026 -Co2Cu1S4_187_3896.vasp,Co2CuS4,-2.3649352728571427,0.1705324542857145 -K2Cd4Te2I6O6_31_9068.vasp,K2Cd4Te2I6O6,-1.2611734145,0.05822024429166717 -Hf1Bi2_187_7124.vasp,HfBi2,-2.844062376666667,0.23771138499999944 -Pd2Br2N2_59_14399.vasp,Pd2Br2N2,-1.9960746616666667,0.4089144174999974 -Ag4S4I4F4_2_552.vasp,Ag4S4I4F4,-0.66239204,0.2927389310546875 -In2Fe1O4_156_8429.vasp,In2FeO4,-3.5190979014285717,0.3787793183333301 -Ca2Cl2F2_129_2976.vasp,Ca2Cl2F2,-3.0887442249999997,-0.05275450749999977 -Hf1N1Cl2_6_7237.vasp,HfNCl2,-4.2266723375,0.6737519691666628 -Li1Ni1P2S6_5_9762.vasp,LiNiP2S6,-2.850269602,0.06490176966145578 -Al2O4_164_919.vasp,Al2O4,-5.061506448333334,0.6009665493749949 -Ga2Fe2Se5_187_6360.vasp,Ga2Fe2Se5,-2.2694638366666666,-0.349070366111113 -K6P10Ru2Se20_11_9543.vasp,K6P10Ru2Se20,-2.5518378278947367,0.10365143921052677 -Li1Al1P2S6_5_9643.vasp,LiAlP2S6,-3.427780549,0.06627715950000024 -Al2Br6_26_780.vasp,Al2Br6,-1.57656816625,0.08403997875000013 -Pu2I2O2_99_14721.vasp,Pu2I2O2,-6.193394368333333,0.7149188341666672 -K4Cd1P2_10_9424.vasp,K4CdP2,0.026512737142857144,0.5616846642857138 -Tl18S9_143_19193.vasp,Tl18S9,-1.1511141114814816,0.10402253018518515 -Ir4S6_2_8863.vasp,Ir4S6,-3.29700095,0.2597871399999998 -Ca2S8Cl4_125_3113.vasp,Ca2S8Cl4,-1.9057128842857143,0.5451774889285692 -Ti2Te2I2_59_19039.vasp,Ti2Te2I2,-2.98511665,0.1317289672222155 -Pb3O6_1_14304.vasp,Pb3O6,-3.0624210966666663,0.39410796500000034 -Li2Fe2Si2O7_1_9913.vasp,Li2Fe2Si2O7,-4.869670578461538,0.13854201782050368 -K2Cd4Se2Br6O6_31_9058.vasp,K2Cd4Se2Br6O6,-1.5344135745,0.15426421037499993 -Ce2Mg2_164_3668.vasp,Ce2Mg2,-0.8940768225,0.8379005325 -Al1Ag1Te6P2_149_605.vasp,AlAgTe6P2,-1.756862187,0.24901479966666507 -Ge4S4_53_6942.vasp,Ge4S4,-3.11106468875,-0.8599168349999999 -B2Mo3O2_187_1681.vasp,B2Mo3O2,-4.83300689,1.1734930625396782 -Zn2S10F4_7_21140.vasp,Zn2S10F4,-1.7798428975,0.45510216867187503 -Ni1O2_164_13385.vasp,NiO2,-2.8048016033333334,-0.46851444125000197 -Na2Cl2O4_13_12052.vasp,Na2Cl2O4,-2.33761396875,0.0322897543749987 -Cu1Ag1Se2_25_4829.vasp,CuAgSe2,-0.59576476,0.00304933666666668 -Sc1Tl1Cl2O2_6_16021.vasp,ScTlCl2O2,-3.3389416466666666,0.012782348749994288 -In3Co1_187_8645.vasp,In3Co,-0.370293545,0.8856505562499999 -Nb3Te14Pd3_6_13018.vasp,Nb3Te14Pd3,-2.241912572,0.09407457008332562 -Cr1Se2_115_4263.vasp,CrSe2,-2.2923058833333334,0.4741797316666667 -Na1Ga1Sb2S6_5_11867.vasp,NaGaSb2S6,-2.446836317,0.015464396437497863 -Ag1C6N6O2F4_6_44.vasp,AgC6N6O2F4,-5.326159332105263,0.04020766298244609 -Al2I6_2_884.vasp,Al2I6,-0.87002992375,0.11177634250000001 -Os2O6_11_13863.vasp,Os2O6,-4.43484154875,0.3874854795833289 -Cs2Br2_129_4666.vasp,Cs2Br2,-0.86498682,0.19352062999999997 -Ga4O6_7_6557.vasp,Ga4O6,-4.4974080579999995,-0.4293237607500029 -Be3F6_5_2278.vasp,Be3F6,-4.187594708888889,0.11873276111111153 -Zr4H2Br4_11_21820.vasp,Zr4H2Br4,-3.198299318,0.04685390299999681 -Sn6H2_164_16987.vasp,Sn6H2,-1.629412895,-2.3785405749999997 -Zr2P2C2N2O6F6_2_21624.vasp,Zr2P2C2N2O6F6,-5.151371353,0.5342248934166604 -Ir1Pb3_187_8746.vasp,IrPb3,-0.772804655,1.5261396600000001 -Ca2Bi1_25_2953.vasp,Ca2Bi,0.01203195,0.9682088900000001 -K2Pt1Se2_47_9307.vasp,K2PtSe2,-1.010539446,0.571167282 -Rh4Pb12_127_15252.vasp,Rh4Pb12,-1.21566260375,0.41608700432692164 -Rb2Te2H6C2S6_1_14952.vasp,Rb2Te2H6C2S6,-3.1067967149999998,0.15685046957174723 -Tl4Se6_1_19628.vasp,Tl4Se6,-1.1840480489999998,0.2463879900000001 -Tl3Te4_164_19582.vasp,Tl3Te4,-0.7195459014285713,0.2580927546428564 -W2C1F2_164_20470.vasp,W2CF2,-4.7389415679999995,0.4468044384999962 -Ag1Au2Se3Br1_1_16.vasp,AgAu2Se3Br,-0.36612996714285717,0.32250109333333116 -Ni1Te2Ir2Rh1S2I4_1_13434.vasp,NiTe2Ir2RhS2I4,-1.4500934150000002,0.08048256319444116 -Co1C6I2F4_47_3719.vasp,CoC6I2F4,-4.098163216923077,0.4487535250961504 -In2Te2_2_8630.vasp,In2Te2,-1.2292006675,0.15580835250000002 -Ni2Mo2S8Cl2_129_13537.vasp,Ni2Mo2S8Cl2,-1.8787366957142857,0.6370074892187478 -Mo1Se1O1_156_11547.vasp,MoSeO,-3.946345836666667,0.23231333083333294 -Co2Sb4I4O6_11_4013.vasp,Co2Sb4I4O6,-2.78490997875,0.056634734713540524 -Sr4Te8As4H4_14_17483.vasp,Sr4Te8As4H4,-2.1864993225,0.4042135608333308 -Sm2Sb2S4O2_129_16584.vasp,Sm2Sb2S4O2,-4.339842968,-0.012253186916670877 -Na4Co2Se4_49_12383.vasp,Na4Co2Se4,-1.704733639,0.1846639259333287 -Ca2P2H8O12_1_3087.vasp,Ca2P2H8O12,-4.73897765,0.13621978786457978 -H2W2_164_7035.vasp,H2W2,-4.4576922725,1.46394118 -Zn4As3_123_21211.vasp,Zn4As3,-0.21948197714285714,0.1582225933035695 -Os1Se2_115_13824.vasp,OsSe2,-2.846294126666667,0.6983271333333332 -Sr2Ag1Se2Cl2_38_17110.vasp,Sr2AgSe2Cl2,-1.6770144542857144,0.2401797597619018 -V2H4S2O10_2_20083.vasp,V2H4S2O10,-4.6313367011111115,-0.04412571555555633 -As2Ir2S6_162_1226.vasp,As2Ir2S6,-3.1886195489999998,0.27364431374999776 -V2Zn2F10_1_20233.vasp,V2Zn2F10,-2.4828448164285715,-0.04248684750000198 -Zr1Te2_164_21465.vasp,ZrTe2,-3.0815102833333334,0.128456233333333 -Sc1I2_164_15945.vasp,ScI2,-1.6153108100000002,0.12991796722222027 -Na2Te2F10_26_12315.vasp,Na2Te2F10,-2.409051942857143,0.11276988750000028 -Cu1O2_115_4930.vasp,CuO2,-1.7543463099999999,1.0132339541666646 -Sb8Te8O4_2_15881.vasp,Sb8Te8O4,-2.4509313895,0.1991025489999978 -Ir2Se2_187_8842.vasp,Ir2Se2,-2.568635575,0.4989842168750003 -Ga4Se6_1_6574.vasp,Ga4Se6,-2.230524399,0.2264674649999998 -Li2Cu2C2O6_2_9886.vasp,Li2Cu2C2O6,-4.5477738625,0.2755373034374983 -Sc1Hg2N1Cl2O1_1_15942.vasp,ScHg2NCl2O,-1.9450321442857141,0.47144041947043874 -V1As1I1Br3O2_1_19766.vasp,VAsIBr3O2,-2.4684559225,0.045586122109373343 -Co1Ir1Br5Cl1_1_3778.vasp,CoIrBr5Cl,-1.1194561825,0.06854077770833214 -Re6Te8F2_2_15136.vasp,Re6Te8F2,-3.89464095625,0.016840921406250153 -Y2Co2_164_20724.vasp,Y2Co2,-2.7145186125,0.2944214249999999 -Ag4S2_191_542.vasp,Ag4S2,-0.08270980333333333,0.3356338833333334 -Cu4Te4_2_5489.vasp,Cu4Te4,-0.3549253925,0.21255514249999996 -Hf1Bi1Sb1_156_7117.vasp,HfBiSb,-3.1929284300000003,0.10680808916666296 -Sb4S2O12_18_15814.vasp,Sb4S2O12,-4.298830573888889,0.08055999604166231 -Ni1Bi2_187_13283.vasp,NiBi2,-0.4550648466666667,0.4300926216666666 -K2Cr2Cd1H4O10_2_9086.vasp,K2Cr2CdH4O10,-4.0354069652631575,0.06400310631578954 -Ni1Pd3Se8_10_13405.vasp,NiPd3Se8,-1.5765356858333333,0.1806557537500002 -Ag1Os1S2I1Br1_1_94.vasp,AgOsS2IBr,-1.5643225533333334,0.4891823298958333 -P1Rh3S2Br4_1_13938.vasp,PRh3S2Br4,-1.8878692510000001,0.40641034999999914 -Mo1F5_47_11511.vasp,MoF5,-2.4578836183333332,0.3479007890277783 -Tl2P2_129_19483.vasp,Tl2P2,-1.26687232,0.73714768325 -Mg1Sn2_187_10407.vasp,MgSn2,-0.7821717233333333,-2.0844240291666667 -K4Nb6Br18_12_9482.vasp,K4Nb6Br18,-2.2654073707142857,0.06389562357142875 -Ag4H4S4F4_2_522.vasp,Ag4H4S4F4,-1.623791635,0.44971543742187525 -Ni1H4C6Br2_47_13344.vasp,NiH4C6Br2,-4.4934182876923074,0.3509284261538388 -Ag1Sb1H2C2N2F6_10_117.vasp,AgSbH2C2N2F6,-3.683611117142857,0.16803171933332317 -B18Se9_143_1613.vasp,B18Se9,-4.1774411,0.6595438544444399 -Au1Cl2_115_1421.vasp,AuCl2,0.28491657,0.34307582166666667 -Zr3H2Se2N2_187_21769.vasp,Zr3H2Se2N2,-4.9338506411111105,0.5589324555555515 -Fe2Te2F2_59_5996.vasp,Fe2Te2F2,-1.7467164283333334,0.33024029833333324 -Ga2F6_26_6345.vasp,Ga2F6,-2.90522246125,0.06435206874999988 -Os1I2_187_13805.vasp,OsI2,-0.7595875566666667,0.9490477679166651 -Ir4Se3S5_1_8866.vasp,Ir4Se3S5,-3.1040893174999997,-0.29083495072916654 -Pb2N6_164_14260.vasp,Pb2N6,-4.66252659625,-0.18016709937500014 -Hg2Pt4Se6_164_7989.vasp,Hg2Pt4Se6,-1.2879433633333333,0.24865213916666673 -Zn4Br4O4_14_21212.vasp,Zn4Br4O4,-1.0081823908333334,0.4578023808333318 -K2Tm2I6_51_9381.vasp,K2Tm2I6,-0.99558708,0.024408503666664777 -Mo2N2_191_11639.vasp,Mo2N2,-3.26685938,2.4569384499999996 -Si1Te1_156_16375.vasp,SiTe,-2.39539901,0.13028892124999958 -V3H4O8_12_20269.vasp,V3H4O8,-4.837653617333333,0.2915943124444409 -Cs2C6S6F6_4_4680.vasp,Cs2C6S6F6,-3.7172239185000002,0.1935645938124918 -Ta3C2F2_187_17949.vasp,Ta3C2F2,-6.711559481428572,0.3179097337857091 -Bi8Se8O4_2_2697.vasp,Bi8Se8O4,-2.4880386144999997,0.20024821616666477 -Au2I2_51_1487.vasp,Au2I2,0.786959555,0.27323663375000007 -W2C1Cl2_164_20469.vasp,W2CCl2,-4.3777749880000005,0.07394094211109936 -Te2Ru2_187_18518.vasp,Te2Ru2,-2.098269975,0.9169625487500002 -Mn6Zn2O14_147_11473.vasp,Mn6Zn2O14,-3.9153381,0.16324180613635964 -Ba4Sb4Te8Cl4_14_2185.vasp,Ba4Sb4Te8Cl4,-2.0848647455,0.1029047667499976 -Cr3B2S2F2_187_4544.vasp,Cr3B2S2F2,-3.40392077,0.4946964420833295 -Ge2Cl2O2_59_6765.vasp,Ge2Cl2O2,-3.1572601949999997,0.2686530320833338 -Ag2C8Cl2F8_2_237.vasp,Ag2C8Cl2F8,-3.8018359895000002,0.3166246469999998 -Si1Sn1Te3Br1_1_16370.vasp,SiSnTe3Br,-1.6098664366666666,0.1282162778472213 -K6Ta4Cu6Se16_13_9546.vasp,K6Ta4Cu6Se16,-2.3928277475,0.07359531124999963 -Y4S2N3_164_20835.vasp,Y4S2N3,-6.3412796233333335,0.14757340120369733 -Zr2F6_189_21564.vasp,Zr2F6,-4.11012726125,0.4472153543750001 -Au2Se3O10_8_1552.vasp,Au2Se3O10,-2.8327907866666666,0.15090985291666414 -Fe2H2N1_164_5852.vasp,Fe2H2N,-3.011609996,-2.1711556753333365 -Sc2Tl1Br2O1_1_16190.vasp,Sc2TlBr2O,-2.7943269649999998,0.3057737486111106 -B2P2H6Pb2O6_7_1692.vasp,B2P2H6Pb2O6,-4.290764298333333,0.3898126509920551 -Sb2Pb2Cl2O6_7_15639.vasp,Sb2Pb2Cl2O6,-3.33277788,0.22759609874999986 -Cu2S2_129_5251.vasp,Cu2S2,-1.0370299825,0.32537372916666674 -Li1Cu1O2_10_9688.vasp,LiCuO2,-2.9418904925,0.20825162500000038 -Be2Cu2_191_2253.vasp,Be2Cu2,-0.480303275,1.3020035275 -Fe1Ag1Se1I1Br2_1_5615.vasp,FeAgSeIBr2,-0.45299479,0.13997954057291695 -As2Au2Se4_26_1189.vasp,As2Au2Se4,-1.43277993875,0.32301784229166475 -Sr2Ta4Bi4O18_26_17321.vasp,Sr2Ta4Bi4O18,-5.707448760357143,0.111955455714285 -Cr1W2O8_2_4285.vasp,CrW2O8,-5.610854096363636,-0.03210191562500331 -Hg2Te4_12_8039.vasp,Hg2Te4,0.16696878333333331,0.37358602111111094 -Li1B1H4_156_9661.vasp,LiBH4,-3.743043325,0.07396047708333331 -Ga2Br1Cl5_8_6308.vasp,Ga2BrCl5,-1.50032158375,0.042932441250000064 -Ni3As2S8_164_13692.vasp,Ni3As2S8,-2.0523813376923075,0.376240597451918 -Sr3Si2_164_17400.vasp,Sr3Si2,-1.317078406,0.5154312104999983 -Yb2P6H12O12_10_20882.vasp,Yb2P6H12O12,-4.84475478,-0.06893015096354443 -Rb2C2O8F6_4_14787.vasp,Rb2C2O8F6,-2.7811383444444444,0.6065883109722144 -Bi1Te2S6F1_1_2407.vasp,BiTe2S6F,-2.0154756689999997,0.24943498027082928 -Mn2As2S4Br2_26_10971.vasp,Mn2As2S4Br2,-2.441027196,0.15598641187500029 -In1Sn1S1I1Br1_1_8359.vasp,InSnSIBr,-1.2280847480000001,0.2485518208333335 -V1Ag1I2O3_1_19753.vasp,VAgI2O3,-2.5350731842857144,0.30826333539062434 -Hf1Ge1Cl4_6_7174.vasp,HfGeCl4,-2.7693439816666667,0.23048417541666444 -Hf3S2_123_7726.vasp,Hf3S2,-5.589253148,0.027537578999995205 -Cr2Te2I2_59_4522.vasp,Cr2Te2I2,-1.3014313266666666,0.10553895944444713 -Ir2Se6_7_8849.vasp,Ir2Se6,-2.48055432125,0.3677635715277753 -Sc2H2N1O2_164_16083.vasp,Sc2H2NO2,-5.4242642228571425,-0.4614707785714365 -Ta2Cl6_189_17698.vasp,Ta2Cl6,-3.0579853,0.26828226187500037 -Pt1Br2_187_14567.vasp,PtBr2,-0.13681413666666667,0.6454780308333333 -Li2Co2As2_129_9861.vasp,Li2Co2As2,-2.4901179883333335,0.16955743833333337 -Be2Co1_123_2251.vasp,Be2Co,-2.5632130366666668,0.35537019833333083 -K1Ti1S2_156_8946.vasp,KTiS2,-3.6173230925,0.16502622625000063 -Br1_123_2705.vasp,Br,0.36207529,0.3556102 -Ni2W2Cl2O8_129_13685.vasp,Ni2W2Cl2O8,-3.9398157242857144,-0.02198473205357665 -K2Cd4Br6O8_31_9042.vasp,K2Cd4Br6O8,-1.266362432,0.2877428236666669 -Mg2Mn4O10_59_10479.vasp,Mg2Mn4O10,-4.1715888275,0.32967989906250006 -Li2V2S6O24_2_10126.vasp,Li2V2S6O24,-4.560035348529412,0.07007235333332096 -Cu2Sb4O12_12_5273.vasp,Cu2Sb4O12,-3.7269128150000004,0.1637063177777769 -Zr1Br2_164_21270.vasp,ZrBr2,-2.4914816466666667,0.1632305266666667 -Y4I10_11_20827.vasp,Y4I10,-2.1893495871428574,0.0841353990476158 -Sc2Cl6_162_16065.vasp,Sc2Cl6,-2.8416730775,0.047351866250000096 -Cd2Te2F2_59_3590.vasp,Cd2Te2F2,-0.49271703666666666,0.05393801111111041 -Bi1H1Se2O6_1_2335.vasp,BiHSe2O6,-3.753602128,0.0684261587916637 -Ge2Se2_59_6874.vasp,Ge2Se2,-2.6996519575,0.20064138750000016 -Rh2Cl6_164_15186.vasp,Rh2Cl6,-0.87273838125,0.58554467 -Ga2Sb2_129_6461.vasp,Ga2Sb2,-1.84162746,-0.712558705 -Mn1Ge1Sb1S1Br2_1_10744.vasp,MnGeSbSBr2,-1.847765245,-0.07545441958333521 -Ba2Cu1Te2F2_38_1976.vasp,Ba2CuTe2F2,-1.8748496985714287,0.6313051392857101 -Hf1Ge1Br2_8_7171.vasp,HfGeBr2,-2.75100725,0.5736121593750001 -Ir1Ru1S2Br4_1_8754.vasp,IrRuS2Br4,-1.83711754,0.15952101937499985 -Os2I2_129_13851.vasp,Os2I2,-1.30661717,1.4469713009375 -Mo3W1Se8_25_11732.vasp,Mo3WSe8,-3.2181376499999996,-0.4486320391666663 -Rb2Os2C2Br8O4_31_14905.vasp,Rb2Os2C2Br8O4,-2.7649229416666667,0.2248706977777716 -Sc2Br2O2_59_16040.vasp,Sc2Br2O2,-4.699739903333334,0.04002428666666624 -Ho2Br6_59_8128.vasp,Ho2Br6,-2.28994356625,0.05868563375000013 -Nb3C2F2_187_12961.vasp,Nb3C2F2,-6.25528145,0.19344733819046422 -Sr2Rh1_123_17300.vasp,Sr2Rh,-0.29716932333333335,0.2609275649999996 -In2Ga2S6_31_8446.vasp,In2Ga2S6,-2.708825231,0.014053705499999847 -Sn4I10_127_16942.vasp,Sn4I10,-0.3644424921428571,0.18887308767857086 -Zn1O2_156_20987.vasp,ZnO2,-0.8698000366666667,1.7173943637499975 -Sc3B2_187_16196.vasp,Sc3B2,-3.7551783700000003,0.3151251539999975 -Tl2Se2_164_19530.vasp,Tl2Se2,-1.0343732725,0.26550636854166654 -Zn1Sn1I4Cl2_5_21013.vasp,ZnSnI4Cl2,-0.26796702,0.12038062523437498 -Mo1Br2_164_11499.vasp,MoBr2,-1.4574935866666667,0.4054883574999999 -Cr2Te2C1_164_4518.vasp,Cr2Te2C,-3.345377364,0.10562434087499994 -Gd2S2I2_59_6624.vasp,Gd2S2I2,-3.255238118333333,0.04853036666666721 -Lu1P2O8_164_10295.vasp,LuP2O8,-5.2864863345454545,0.4238358381249897 -Mn1Ge1Sb1W2Se1Cl5O3_1_10745.vasp,MnGeSbW2SeCl5O3,-2.9191375764285716,0.5186384042055332 -Na2Mn1P2O7F3_1_12209.vasp,Na2MnP2O7F3,-4.312223648,-0.04550861525000652 -Cu2C6Cl2F4_2_5075.vasp,Cu2C6Cl2F4,-3.743285722857143,0.45238701053571106 -P2Pb2S6F2_7_14013.vasp,P2Pb2S6F2,-2.890079940833333,0.12398091845832815 -Si4H4O10_3_16490.vasp,Si4H4O10,-5.691220433888889,0.017458578981476514 -Li2V3F8_164_10129.vasp,Li2V3F8,-3.424997536923077,0.19627122923076556 -Ta4O10_59_18076.vasp,Ta4O10,-7.066063149285715,0.17952124642857115 -Hf4H2C3S2_164_7783.vasp,Hf4H2C3S2,-6.185247003636364,0.2516652872727203 -Cr4O12_7_4614.vasp,Cr4O12,-4.529357624375,-0.07656978453124985 -Zn1Mo6O16_156_20973.vasp,ZnMo6O16,-4.7127575765217395,0.26753098739128944 -Nb4Fe2O10_59_13068.vasp,Nb4Fe2O10,-5.77291228875,0.5298257525000007 -Co2Se2_164_4023.vasp,Co2Se2,-1.9195844725,0.2334384948333308 -Mo2P4O12_4_11660.vasp,Mo2P4O12,-5.118575781111111,0.4051214652380913 -Cd2Cu2S2I2_26_3492.vasp,Cd2Cu2S2I2,-0.20157953375,0.14854927802083331 -Te2Ru1Rh1Se2_6_18509.vasp,Te2RuRhSe2,-2.2890149133333333,0.40929458777777783 -Ti2Te2_164_19044.vasp,Ti2Te2,-4.0258131675,0.40453664781249543 -Sn1Au1Se1S1I2_1_16608.vasp,SnAuSeSI2,-0.8289710816666668,0.1905015237847202 -Pd1O2_164_14375.vasp,PdO2,-2.8373927233333336,0.06517263833333331 -Ti1Se1O1_156_18847.vasp,TiSeO,-5.69468752,0.17348067000000045 -Cs2S6I2_11_4781.vasp,Cs2S6I2,-1.1604481679999998,0.7020382716250005 -Mo2C3_187_11591.vasp,Mo2C3,-5.320368788,0.9573528619999918 -Y2Zn2P2O2_164_20784.vasp,Y2Zn2P2O2,-4.2279453575,0.14099683249999995 -Au1O2_47_1437.vasp,AuO2,-1.1468751166666666,0.9291125685416639 -Zn2Sb2Se6_147_21148.vasp,Zn2Sb2Se6,-1.316766748,0.374343363833331 -P2Ru2O6_162_14041.vasp,P2Ru2O6,-4.809309365,0.4209200336666621 -Nb6Ge2Te12_26_13192.vasp,Nb6Ge2Te12,-3.3624326439999996,0.07967687908333043 -Hg1B2C8N8_164_7836.vasp,HgB2C8N8,-6.391584371578947,0.4823281216908548 -Nb2C2Cl2_59_12668.vasp,Nb2C2Cl2,-5.3725797166666664,0.34827925499999335 -Li2Zr1H6O6_147_10140.vasp,Li2ZrH6O6,-4.789117911333333,0.11186918199999996 -V1S2F2_164_19914.vasp,VS2F2,-2.696032804,0.4150592997499971 -Cd1Sn2O2F2_12_3430.vasp,CdSn2O2F2,-2.56521095,0.05335288380951986 -Hg1Te2_187_7921.vasp,HgTe2,0.36726322666666666,0.5738804644444443 -Ag2P2O6_162_348.vasp,Ag2P2O6,-3.873657743,0.36011604299999966 -Sr2Ag1Se2Br2_38_17109.vasp,Sr2AgSe2Br2,-1.53695192,0.09981569261904538 -Cd1Pd1Au1Br1Cl1O2_1_3397.vasp,CdPdAuBrClO2,-0.9426501757142857,0.4409952381547608 -Ru2Se1S1Br2_8_15352.vasp,Ru2SeSBr2,-1.9805347133333333,0.5831929823611082 -Na4S8O4_7_12410.vasp,Na4S8O4,-2.854804304375,0.4136959962890626 -Y2F6_147_20732.vasp,Y2F6,-4.8793461425,0.3244737987499997 -B6N2_191_1779.vasp,B6N2,-5.7249860575,1.256944462916667 -Fe1C2I2N4F4_47_5641.vasp,FeC2I2N4F4,-2.996835571538462,0.6822254245031953 -V2Hg2O6_2_20086.vasp,V2Hg2O6,-3.724020939,0.15771943300000046 -Hg2Se2_129_8021.vasp,Hg2Se2,0.4002981475,-0.3917066175000001 -Tl1Ga1Hg1Se4_156_19273.vasp,TlGaHgSe4,-1.179618117142857,0.06534090797618847 -Co2P2Pd2_129_3960.vasp,Co2P2Pd2,-2.4722630933333334,0.4409550033333334 -Rb2Ta2Cu4Se8_28_14945.vasp,Rb2Ta2Cu4Se8,-2.21823065125,0.15133460187500036 -Nb2Te8Ru2_11_12934.vasp,Nb2Te8Ru2,-2.8351363175,0.1698212180555556 -Fe2S2Br2_59_5931.vasp,Fe2S2Br2,-1.60599826,-0.21038039166666667 -Nb2I2_129_12747.vasp,Nb2I2,-2.6815554325,0.7094810062499997 -Te2As2S1_164_18356.vasp,Te2As2S,-2.3574039460000002,0.06047232254166485 -Nb2S6_59_12856.vasp,Nb2S6,-4.35357883625,0.01893141734375048 -Mn3Ge1Te2_187_11381.vasp,Mn3GeTe2,-2.084309521666667,0.0839916836111082 -Re1S2_115_15018.vasp,ReS2,-4.219750776666666,0.7203200475000004 -P4W2_2_14130.vasp,P4W2,-4.382538275,0.5970197316666672 -Zn2Ga2Se5_156_21085.vasp,Zn2Ga2Se5,-1.5213058022222221,0.17898332305555423 -U1Tl2O4_123_19699.vasp,UTl2O4,-5.246995917142857,-0.3006538814880979 -Ti2Cl2O1_2_18921.vasp,Ti2Cl2O,-5.042361544,0.07709316383333364 -V2I2N2_59_20094.vasp,V2I2N2,-3.964201128333333,0.04142720562499669 -Na2N4O4_1_12221.vasp,Na2N4O4,-4.44796573,0.208158192499996 -P2Pd3O8_164_14027.vasp,P2Pd3O8,-4.013181945384615,0.23218661115384354 -Nb3S1F7_156_13000.vasp,Nb3SF7,-4.412678433636364,0.10756739848484409 -B2S2O9_5_1698.vasp,B2S2O9,-5.246323476153846,0.019508373846153226 -Sc5C1Cl8_10_16268.vasp,Sc5CCl8,-3.3048726278571428,0.10652644928571142 -Ga1Pt3Br3N2Cl1_8_6247.vasp,GaPt3Br3N2Cl,-1.972069853,0.6216992285000001 -Ho2Te6_129_8151.vasp,Ho2Te6,-2.392294005,-0.7432036475000001 -Cu4S6Cl4_2_5461.vasp,Cu4S6Cl4,-1.1552707092857144,0.2491169101700659 -Sc12C4I22_2_15884.vasp,Sc12C4I22,-2.479408519736842,0.08073601736842129 -Ba4As2O1_123_2129.vasp,Ba4As2O,-0.9872279528571429,1.8025789346428542 -Zn1Sb1_8_21007.vasp,ZnSb,0.511077865,0.6750471874999999 -Zr1Bi1S1Br2_1_21254.vasp,ZrBiSBr2,-2.316868148,0.32899326275000007 -Cu2As2O6_162_5007.vasp,Cu2As2O6,-3.3071927719999996,0.43303128412499714 -Pb2I2_1_14252.vasp,Pb2I2,-0.38610961,0.4863162445833334 -Ti2B1Se2_164_18891.vasp,Ti2BSe2,-5.19195592,-0.6151481904999985 -Sr3Ni2Br2O5_123_17390.vasp,Sr3Ni2Br2O5,-3.096925039166667,-0.25786875125000286 -B18Te9_143_1616.vasp,B18Te9,-2.2748092007407408,2.3564429170370325 -Re1O2_115_15014.vasp,ReO2,-5.4001756033333335,0.8469682825000007 -Cu2H2_129_5113.vasp,Cu2H2,-1.189420425,2.0176660425 -Na2Nb2Se4O14_26_12230.vasp,Na2Nb2Se4O14,-4.610762203181818,0.0861828804545457 -Ga1Si1Se3_143_6280.vasp,GaSiSe3,-2.301214216,0.537635433124998 -Tb2V2O8_13_18212.vasp,Tb2V2O8,-5.876801576666666,0.3022938658333336 -Li2Ni2As2_12_10023.vasp,Li2Ni2As2,-1.6856903766666667,0.2157349983333332 -Fe2P2Br2O4_26_5902.vasp,Fe2P2Br2O4,-3.4632506480000003,0.28720896235713855 -Cu2I2N2O2_31_5166.vasp,Cu2I2N2O2,-2.220108095,0.20173035374999904 -Au4S4_2_1590.vasp,Au4S4,-0.91938086125,0.09240770375000007 -Hf2S2I2_59_7571.vasp,Hf2S2I2,-3.9340024000000002,-0.008767510000008194 -Co2Te2Mo2O12_18_4036.vasp,Co2Te2Mo2O12,-4.264049187222223,0.0527404123611066 -Na2Cd4Se2S6Br6_31_12040.vasp,Na2Cd4Se2S6Br6,-0.9565013655,0.2915109723333308 -Tl4Si2S6_2_19629.vasp,Tl4Si2S6,-2.5492831708333332,0.13263656999999984 -As2Pd2Se6_12_1272.vasp,As2Pd2Se6,-1.9726193269999999,0.2599976307999977 -Si1Te1W2S1Br3_1_16373.vasp,SiTeW2SBr3,-2.512218695,0.6531562440624946 -In1Cu1P2S6_143_8228.vasp,InCuP2S6,-2.7503163610000003,0.0691964774999998 -Tc2Cl6_12_18226.vasp,Tc2Cl6,-2.753341945,0.1600078637500002 -Li2Ti2C2Br2_59_10090.vasp,Li2Ti2C2Br2,-4.70234623,0.16829931249999985 -Te1Rh2S2Br1_6_18333.vasp,TeRh2S2Br,-2.171627733333333,0.2158750478749989 -Er2Te6_129_5577.vasp,Er2Te6,-2.361250965,0.054516933749999996 -Sr2H2Br2_129_17231.vasp,Sr2H2Br2,-2.299145295,0.06684546499999966 -Li2Mg2_11_9982.vasp,Li2Mg2,-0.5077173125,1.5232510074999999 -Nb2Ni1S4_156_12773.vasp,Nb2NiS4,-4.033591884285714,0.2861066757142837 -Nb2F2_164_12711.vasp,Nb2F2,-4.8215434625,0.2853574675000006 -Ga1Ir1Pd1Rh1S5Br3_1_6205.vasp,GaIrPdRhS5Br3,-2.1166757225,0.18724135999999814 -Cd2Cu2S2Br2_26_3489.vasp,Cd2Cu2S2Br2,-0.37810718125,0.18779386812500007 -Zr1Ti3O8_1_21481.vasp,ZrTi3O8,-6.9205132075,0.3231249720833338 -Te2Os2_164_18430.vasp,Te2Os2,-2.6742524075,0.4492648212499999 -Zr1Bi1Mo1S1Br1Cl1_1_21252.vasp,ZrBiMoSBrCl,-2.4331528116666665,0.7298368448958281 -Nb2Ni1Se6_12_12776.vasp,Nb2NiSe6,-3.2411892088888887,0.0920405322222222 -Bi2Te2_164_2566.vasp,Bi2Te2,-1.1219135975,0.3979234024999998 -Sb1Mo1Br1N2Cl1_1_15465.vasp,SbMoBrN2Cl,-3.4008258983333337,0.3955618470833313 -Al4N20_7_1075.vasp,Al4N20,-5.697425373333334,0.10303000833332776 -Ag1B6H4S2N6_6_19.vasp,AgB6H4S2N6,-4.839804020526316,1.0708462826315777 -P2Pt2O6_2_14031.vasp,P2Pt2O6,-4.17985459,0.7350984340000004 -Zr3Te2N2F2_187_21791.vasp,Zr3Te2N2F2,-4.466808436666667,0.6051245026388781 -Nb2N2Cl2_11_12768.vasp,Nb2N2Cl2,-5.587835955,0.11489217143332375 -Mo6O14_31_11762.vasp,Mo6O14,-4.973215777,0.28240644716666186 -Hg4O2_5_8083.vasp,Hg4O2,0.5437993033333334,0.239431040153257 -K2Ir2Br10N2O4_11_9208.vasp,K2Ir2Br10N2O4,-1.7908719705,0.3998370742500004 -Ga2H4C4F10_10_6380.vasp,Ga2H4C4F10,-3.068314801,1.0006765930000003 -Mo2Br2_164_11573.vasp,Mo2Br2,-1.8878710475,0.8516745881250001 -Ti1F2_164_18777.vasp,TiF2,-4.666685583333334,-0.3818924277777823 -Mo1Ir1S1Cl2O1_1_11522.vasp,MoIrSCl2O,-2.7111030333333335,0.6127502169444368 -Li4Se4O8_13_10227.vasp,Li4Se4O8,-3.80298668375,0.09885632567708338 -Ru1Se2_115_15294.vasp,RuSe2,-2.3495120666666667,0.8450883933333335 -Cr1S1O1_156_4244.vasp,CrSO,-4.01827183,0.11531242458332902 -Mn2Ni2O6_147_11171.vasp,Mn2Ni2O6,-3.0224595269999996,0.38676584799999614 -Mn2Sb2Se4F2_26_11249.vasp,Mn2Sb2Se4F2,-2.197324201,0.2730973024999983 -V1Ge1Te1Br1_1_19843.vasp,VGeTeBr,-2.0379138475,0.16025651870832802 -Gd2Ge1I2_164_6614.vasp,Gd2GeI2,-2.576360392,0.04337023399999973 -V1I1Cl1_156_19864.vasp,VICl,-1.6525961633333335,0.07289203277777745 -Ge2Au2O6_51_6744.vasp,Ge2Au2O6,-3.215806453,0.19795206649999963 -Nb4S2N3_164_13142.vasp,Nb4S2N3,-6.786737597777778,0.054156582407393516 -Ga2Br2N2_59_6309.vasp,Ga2Br2N2,-2.799384558333333,0.5510828352777744 -Hg1O2_115_7891.vasp,HgO2,-0.6527959633333333,0.9801555476388876 -Bi12O12F12_14_2298.vasp,Bi12O12F12,-3.2353515522222223,0.02598423444444453 -Na2Be2_11_11989.vasp,Na2Be2,-0.60392186,0.6832839025 -Mo4O14_13_11755.vasp,Mo4O14,-4.561139444444445,0.36985507402777257 -Na2Ti2C2Cl2_59_12322.vasp,Na2Ti2C2Cl2,-4.50251511875,0.23743601156250005 -Mn4H2C3S2_164_11436.vasp,Mn4H2C3S2,-3.913711709090909,0.4231688999999911 -Zn4Br8_115_21213.vasp,Zn4Br8,-0.09565384166666667,0.09708564208333335 -Rb2Cd4Br6O8_31_14803.vasp,Rb2Cd4Br6O8,-1.2594599745,0.30382282691666707 -V1S2F1_156_19913.vasp,VS2F,-3.086940805,0.27998579562499737 -Li2I2O4_113_9964.vasp,Li2I2O4,-2.77417888875,0.2285578906249972 -Sr2S6N2F2_59_17304.vasp,Sr2S6N2F2,-3.1530202724999996,0.31132723098957654 -Ca4Co2S6Br2_129_3210.vasp,Ca4Co2S6Br2,-2.6198774828571425,0.09152739526785503 -Ru2Cl8_14_15312.vasp,Ru2Cl8,-1.258257587,0.06136119100000026 -Mg1Br1Cl1_156_10344.vasp,MgBrCl,-1.7329333266666669,0.06956572805555516 -Y1Br2_164_20614.vasp,YBr2,-2.921766013333333,0.13501744611110866 -K2Hg4Te2Br6O6_31_9194.vasp,K2Hg4Te2Br6O6,-1.2221207299999999,0.2025914136666627 -Mn2Se2S8F4_7_11281.vasp,Mn2Se2S8F4,-2.25529469375,0.39565044760416695 -Sr4S4O12_14_17465.vasp,Sr4S4O12,-4.500132106000001,0.16439711299999488 -Ba1Ti4O8_162_1871.vasp,BaTi4O8,-6.644862888461538,0.3478965119230708 -Li1Cu2C2O6_1_9691.vasp,LiCu2C2O6,-4.512845892727273,0.25694780289772073 -Sn1W1O4_3_16706.vasp,SnWO4,-4.9077171066666665,0.3507019031585972 -Cr1Cu1S2_156_4153.vasp,CrCuS2,-2.1325808625,0.5850849393750004 -V2Cl8_1_20041.vasp,V2Cl8,-1.841620516,0.009831270000000059 -Ag1Os1S2Br2_6_93.vasp,AgOsS2Br2,-1.676296135,0.4272287955902758 -Pb1Br4_123_14175.vasp,PbBr4,-0.280726076,0.4330422940000002 -Ga4I4_51_6553.vasp,Ga4I4,-0.9422206975,0.0006740041666655205 -Pd1Se2_164_14391.vasp,PdSe2,-1.69370045,0.1546362983333336 -Hf3Zr1Ti2Bi1Te3P3Se3_1_7760.vasp,Hf3ZrTi2BiTe3P3Se3,-4.50084596125,0.16975591078125066 -Nb4Co4Se8_53_13058.vasp,Nb4Co4Se8,-3.449214524375,0.20696827500000037 -Ba2Te2Au1F2_38_2066.vasp,Ba2Te2AuF2,-1.8262876042857141,0.6401975514285676 -Sr3Ag2S4Br2_123_17346.vasp,Sr3Ag2S4Br2,-1.9160961972727273,0.024977665397721394 -V2S6_59_20168.vasp,V2S6,-3.44047669125,0.07336705343749639 -Al1Ni1Se1I1Br2_1_692.vasp,AlNiSeIBr2,-1.1287441166666665,0.0928723197222211 -Hf3Zr1Te8_6_7759.vasp,Hf3ZrTe8,-3.3564769766666664,0.25720953000000035 -Al2Si2C1N1O10_1_979.vasp,Al2Si2CNO10,-5.7887537225,0.2879354496874995 -W2Cl2_129_20483.vasp,W2Cl2,-1.9980792075,2.0364438875 -As2Br6_150_1194.vasp,As2Br6,-1.081548515,0.08785020750000005 -Pt2I4_14_14633.vasp,Pt2I4,-0.36741193,0.147943655 -Sb4Pb8S8I12_14_15804.vasp,Sb4Pb8S8I12,-1.4723313075,0.05366529218750005 -K4Ru2N2O4F10_59_9501.vasp,K4Ru2N2O4F10,-2.754144862727273,0.3378764319318104 -Cd2Ag2S2F2_26_3443.vasp,Cd2Ag2S2F2,-0.56925829875,0.22085798156250006 -Ca2Cu1S2F2_38_3000.vasp,Ca2CuS2F2,-2.3776908857142858,0.5005056133333283 -Sb2P2O6_7_15621.vasp,Sb2P2O6,-4.750964777,0.33854898287499435 -Te1Pd1Rh1Se1_156_18325.vasp,TePdRhSe,-1.646529265,0.44055889937499737 -Hf2Te2F2_59_7633.vasp,Hf2Te2F2,-4.165927723333334,0.17059841124999497 -Nb2I4_11_12750.vasp,Nb2I4,-2.140329131666667,0.22197400333332973 -Pd2O2_10_14445.vasp,Pd2O2,-2.17042026,0.46952879749999976 -Ta1Ti1Br1N1Cl1_156_17632.vasp,TaTiBrNCl,-5.332608098,0.2439007609999888 -Zr4Sn4_59_21852.vasp,Zr4Sn4,-2.72050313,0.7185227933333329 -Hf1Al5Ni2_123_7104.vasp,HfAl5Ni2,-2.01854929375,0.528587655625 -Al2In2Cl8_10_886.vasp,Al2In2Cl8,-1.8613370533333333,0.1827366616666668 -Sc1Ni1Se2_156_15968.vasp,ScNiSe2,-2.327183315,0.337861791875 -Ga4_2_6581.vasp,Ga4,-1.4780109275,-0.3831119475 -Mn1Te2Ru1_156_10909.vasp,MnTe2Ru,-1.96360486,0.5165320731896554 -Nb4H2C3S2_164_13084.vasp,Nb4H2C3S2,-6.020440315454545,0.23654331474746892 -Co1C8Br2F4_25_3722.vasp,CoC8Br2F4,-4.600659300666666,0.5189522673888783 -K4Te4F20_57_9521.vasp,K4Te4F20,-2.311605784642857,0.06368823142857138 -Mo12F24_55_11482.vasp,Mo12F24,-3.0233618527777777,0.07102906555555277 -Be1F2_164_2221.vasp,BeF2,-3.9732928233333333,0.33303464666666693 -Ta2Br10_2_17662.vasp,Ta2Br10,-2.0410593733333333,0.1134064966666668 -Sb1S1_123_15491.vasp,SbS,-2.058932435,0.6583230104166644 -Fe3B2Cl2_187_6041.vasp,Fe3B2Cl2,-2.368438742857143,-0.013915043877555502 -Ti1Ge1Se2I2_1_18785.vasp,TiGeSe2I2,-2.5857328716666665,0.2599206841666666 -Ag1S2F2_12_111.vasp,AgS2F2,-1.286629464,0.3968909317500001 -Ag2H8C8Br2_2_294.vasp,Ag2H8C8Br2,-4.3807130005,0.28793754650000025 -Cu2Sb2O6_12_5265.vasp,Cu2Sb2O6,-3.149977728,0.5104208114999995 -Y1Mn1Ge1S3I2_1_20651.vasp,YMnGeS3I2,-2.802137885,0.29482812148437487 -Ga1Ni5Br2_123_6220.vasp,GaNi5Br2,0.02112421125,-0.03170047719352609 -Tl2Pt4Se6_164_19491.vasp,Tl2Pt4Se6,-1.8867450925,0.13311235416666678 -Mg3Si4H2O12_2_10566.vasp,Mg3Si4H2O12,-5.67811345,0.0202353000000004 -Fe1Se1I1Br1_25_5752.vasp,FeSeIBr,-0.66616577,0.42237970546875003 -Ta2Cl2O2_59_17689.vasp,Ta2Cl2O2,-5.406260811666667,0.3186411296666616 -Co2S4_59_3988.vasp,Co2S4,-2.52443835,0.46632597416666677 -Cu2S2_59_5254.vasp,Cu2S2,-1.0686159525,0.29378775916666666 -Co2Sb2S4Cl2_10_4000.vasp,Co2Sb2S4Cl2,-2.2403035079999998,0.22441624391666448 -Sb4Se6_11_15826.vasp,Sb4Se6,-2.2324789970000003,0.1281408329999998 -Ta4S12_11_18100.vasp,Ta4S12,-4.705516248125,0.06126779687500061 -Cd2H4Se2O8_31_3513.vasp,Cd2H4Se2O8,-3.403933020625,0.026838734791666763 -Si2P2S6_147_16424.vasp,Si2P2S6,-3.3010576489999996,0.4331859958593729 -Cr4O8F8_14_4616.vasp,Cr4O8F8,-3.6889989919999997,-0.20550005212500388 -Si2I8_1_16409.vasp,Si2I8,-0.42540136000000006,0.46326192200000005 -Ta3C2S2_187_17952.vasp,Ta3C2S2,-7.132428682857143,-0.024382902857150945 -Cu4S2_191_5445.vasp,Cu4S2,-0.5280221183333333,0.4668876683333323 -K1_191_8964.vasp,K,1.49306033,0.25829926999999997 -Cu1Sb1Se1S1I2_8_4966.vasp,CuSbSeSI2,-0.9994646866666667,0.2446920427083305 -Y1Cu2S2_164_20627.vasp,YCu2S2,-2.506761922,0.8427802025000002 -In2S2O8F2_11_8550.vasp,In2S2O8F2,-3.3744193207142854,0.6459382861904737 -Cd1H10C16S2N6_2_3319.vasp,CdH10C16S2N6,-5.786413636285714,-0.05559531416667052 -Cu4Hg4Se4Br4_51_5425.vasp,Cu4Hg4Se4Br4,0.04243452375,-0.10097253159722155 -Ce1Mg5_8_3648.vasp,CeMg5,-0.13019849,0.3871702332051278 -Al2P2I16_7_922.vasp,Al2P2I16,-0.525316432,0.1196213545 -Cu2S2I2N2_31_5246.vasp,Cu2S2I2N2,-1.7415138475,0.2378526982440463 -K2Te2N2Cl6O6_4_9374.vasp,K2Te2N2Cl6O6,-2.3585001944444444,0.4501906407992376 -Y3N2Cl2_187_20801.vasp,Y3N2Cl2,-5.79445008,-0.09246997428572001 -In2O2F2_59_8508.vasp,In2O2F2,-3.315769385,0.13348805916666695 -Zr2Ge2S2_129_21568.vasp,Zr2Ge2S2,-4.404335523333333,0.15419172333333364 -Rh3Br1O5_1_15249.vasp,Rh3BrO5,-2.995312707777778,0.661428226018515 -Ge12Pd4_1_6633.vasp,Ge12Pd4,-2.642035228125,-0.1527887331250002 -Ba2Au1O2F2_38_1906.vasp,Ba2AuO2F2,-3.01875937,0.4648968076190423 -Ta1S2_115_17607.vasp,TaS2,-4.784600356666666,0.6361322316666671 -Ta2Te2_187_17909.vasp,Ta2Te2,-4.0282294875,0.7181495437499952 -Li2S2F2_129_10051.vasp,Li2S2F2,-2.354048145,0.6262078981249971 -Bi2P2O6_7_2487.vasp,Bi2P2O6,-4.566273375,0.32330565949999507 -Ti1W2O8_2_18871.vasp,TiW2O8,-6.2027110263636365,0.04309351909090253 -Ta4Ni6Se10_59_18072.vasp,Ta4Ni6Se10,-2.8484354775,0.03831619609999776 -Sr2N2Cl1_164_17282.vasp,Sr2N2Cl,-2.5678110579999998,1.3009039802499898 -P1Se1I1_156_13948.vasp,PSeI,-1.60199489,0.3548172180555526 -Fe1S2F2_164_5743.vasp,FeS2F2,-2.180342612,-0.12235308650000232 -Ta6Si2Se12_26_18154.vasp,Ta6Si2Se12,-4.565131244,0.08460417246526997 -Al2S2Br2_31_933.vasp,Al2S2Br2,-2.77023733,0.013535198333333387 -Ga1Os1S2Br1Cl1_25_6226.vasp,GaOsS2BrCl,-2.563818373333333,0.3257729592708269 -In2Te2S1_6_8625.vasp,In2Te2S,-1.5762955939999999,0.18093713334042227 -Ga4Cl4_57_6548.vasp,Ga4Cl4,-1.61124483125,-0.04499223250000006 -K2Ru2Br8N2O4_31_9312.vasp,K2Ru2Br8N2O4,-2.3115035844444445,0.22979313361110895 -Na4Sb4F16_14_12411.vasp,Na4Sb4F16,-2.858670920416667,0.05522216541666625 -Bi2Pt2S4I2Br2_8_2507.vasp,Bi2Pt2S4I2Br2,-1.5950179891666665,0.18076730069444263 -Ge2P2C2S6F6_7_6800.vasp,Ge2P2C2S6F6,-3.331032897777778,0.3773097125694409 -Ta2Ge2Sb2_129_17742.vasp,Ta2Ge2Sb2,-4.278091128333333,0.3092605806745935 -Tl2As2Se6_1_19364.vasp,Tl2As2Se6,-1.783650926,0.3043554079166643 -Fe1H4C6N2Cl2_25_5705.vasp,FeH4C6N2Cl2,-5.2957856906666665,0.16416147188887242 -Na2Cd4O8F6_31_12024.vasp,Na2Cd4O8F6,-1.8472089034999999,0.2973673099861103 -Na2Cu2Te2_129_12070.vasp,Na2Cu2Te2,-0.80778541,-0.5929957366666667 -Mn5S2Br4Cl1O4_1_11461.vasp,Mn5S2Br4ClO4,-2.750143755625,-0.015264991788792981 -Ca3Cu2S4Cl2_123_3170.vasp,Ca3Cu2S4Cl2,-2.1007705781818182,0.07349802378787473 -Na6H2Se2O8_11_12440.vasp,Na6H2Se2O8,-3.5382608233333332,0.08774035861110807 -Mn2Ga2S5_187_11076.vasp,Mn2Ga2S5,-3.049121358888889,-0.13920684055555532 -Sm2Te2_129_16589.vasp,Sm2Te2,-2.9786956575,0.23203125375000022 -Tb2Br2O2_129_18183.vasp,Tb2Br2O2,-4.79643599,0.05348118000000035 -Nb2Te2_164_12915.vasp,Nb2Te2,-3.78410197,-0.15142973916667102 -Sb1Br1O1_156_15437.vasp,SbBrO,-2.3772283233333336,0.5302511193333315 -Y1Sn3_191_20679.vasp,YSn3,-1.60984823,0.4139301099999999 -Si2Sb2Se6_2_16442.vasp,Si2Sb2Se6,-2.331478404,0.4828877476249984 -Mg1Ga2O4_164_10362.vasp,MgGa2O4,-4.521348724285715,0.17386694892857069 -K2Hf1O6F6_2_9167.vasp,K2HfO6F6,-2.6164637953333334,1.014000812166667 -Cu1O2_164_4928.vasp,CuO2,-2.0041258733333334,0.7634543908333311 -Ca4Si2Br2_129_3241.vasp,Ca4Si2Br2,-1.557120465,0.4166274353124977 -Mo1Pd1O4_5_11539.vasp,MoPdO4,-4.087280055,0.21118520333332935 -Ti1Mn3O8_164_18800.vasp,TiMn3O8,-4.90032629,0.26424463750000027 -In5P1Pd1S2I6_1_8707.vasp,In5PPdS2I6,-1.1851704626666666,0.14665013037036545 -Ba2Mg2Sn2_129_2021.vasp,Ba2Mg2Sn2,-0.15648281666666666,0.8350184625 -Mn2P2Se4I2_10_11201.vasp,Mn2P2Se4I2,-2.038005432,0.16905650912221926 -K2H2S2_11_9127.vasp,K2H2S2,-2.326164046666667,0.08919237666666646 -Ag2Se2_10_434.vasp,Ag2Se2,-0.384203325,-0.09724731749999996 -Sb1Pb2O6_162_15477.vasp,SbPb2O6,-3.6157636299999996,0.27175815638888934 -Hg2Cl2_129_7954.vasp,Hg2Cl2,1.13690531,0.5752937275 -Hf1Pd2_65_7270.vasp,HfPd2,-1.7207617266666666,1.6348072318750007 -Pt1Se2_115_14593.vasp,PtSe2,-1.5884366200000002,0.6618086249999997 -Sb2Cl2O2_129_15564.vasp,Sb2Cl2O2,-3.0929714666666666,0.038335155555555556 -K2Ru2C2Cl10O2_11_9314.vasp,K2Ru2C2Cl10O2,-2.4974868938888886,0.09923148638887952 -Al2Sb2Te6_162_955.vasp,Al2Sb2Te6,-1.760267,0.2705298841249999 -Ga1Sn1Se2Cl2_2_6285.vasp,GaSnSe2Cl2,-1.7692690549999999,0.2229396320833334 -Mo1Pb3_191_11538.vasp,MoPb3,-0.1520513875,2.18639738 -In1Sn1Te1Se1Br2_1_8361.vasp,InSnTeSeBr2,-1.2146202483333333,0.2344643193055539 -Hg1H4C4N2Cl2_10_7875.vasp,HgH4C4N2Cl2,-4.490275381538462,0.27992545346152475 -Pt2S2Cl2_59_14653.vasp,Pt2S2Cl2,-1.86776915,0.04028319416666515 -Cr2Sb2Te6_162_4486.vasp,Cr2Sb2Te6,-1.581895155,0.3694888580999961 -Al2H6O6_2_868.vasp,Al2H6O6,-4.90766599,-0.38079047880952777 -Fe6Pb1S4O28_12_6094.vasp,Fe6PbS4O28,-3.7579584192307696,0.24973092089742377 -Nb2Te4_127_12924.vasp,Nb2Te4,-2.194725375,1.194194986111111 -In2Br6_1_8394.vasp,In2Br6,-0.8400559075,0.14227245125 -Fe1S2_115_5745.vasp,FeS2,-1.96338336,-0.027257445000000047 -Ni1Se1Cl1_6_13419.vasp,NiSeCl,-0.8035475833333333,0.09307783666666669 -Ga2S2_2_6448.vasp,Ga2S2,-2.6978177475,0.15790874750000006 -Ba2Ir1_123_2013.vasp,Ba2Ir,-0.94335009,0.49290797666666525 -Au4S4Br4_14_1583.vasp,Au4S4Br4,-0.5948733241666667,0.0906423163194437 -Au3S2Br1F1_1_1561.vasp,Au3S2BrF,-0.47015366714285717,0.277530306383927 -Al2In1Te1Se4I2_1_885.vasp,Al2InTeSe4I2,-1.774711065,0.24725362231249848 -Zr1Nb1I3Br3_1_21348.vasp,ZrNbI3Br3,-1.96614385625,0.19479975552083134 -Y1Co1F5_47_20624.vasp,YCoF5,-3.0689670028571427,0.8966692046428539 -Fe2C1Cl2_164_5825.vasp,Fe2CCl2,-2.311417722,0.7499875660000006 -La2C2I2_12_9585.vasp,La2C2I2,-4.329017385,0.022771580833327976 -Hg1Br1N1_25_7841.vasp,HgBrN,-0.3657956633333333,0.9516321741666656 -Na1Fe1P2S6_5_11852.vasp,NaFeP2S6,-2.935220718,-0.054926286068187946 -Mn2I2O3_1_11112.vasp,Mn2I2O3,-2.89021905,0.09568288874999942 -Zr2C1I2_164_21533.vasp,Zr2CI2,-4.0343764559999995,0.061318873142857555 -Os2Se6_11_13891.vasp,Os2Se6,-2.79360997375,0.44185310958333324 -Ta2Ga1Ni1S4Br3Cl1_6_17738.vasp,Ta2GaNiS4Br3Cl,-2.9853966666666665,0.19459049063987283 -Al3S4_164_1052.vasp,Al3S4,-3.5435389571428573,0.13312085523809314 -Ga1P2Pd1S6_1_6233.vasp,GaP2PdS6,-2.8882445270000003,0.2026415630740677 -H4Pd1C2I2N6_6_7072.vasp,H4PdC2I2N6,-4.169340380666666,0.31717838147221133 -Cl2F2_4_3691.vasp,Cl2F2,-0.32846527,0.1165447547916663 -K2Mn1P2H3S7_1_9234.vasp,K2MnP2H3S7,-2.7711934813333334,0.2463174686712862 -W1O3_187_20445.vasp,WO3,-4.8618086575,1.0022271456249996 -Hf1Cd1Se2_156_7139.vasp,HfCdSe2,-2.1994367225,0.6432274212500007 -Zn12P8_115_20893.vasp,Zn12P8,-0.36784216399999997,0.30545758225 -Li2Hf1O6F6_1_9961.vasp,Li2HfO6F6,-2.94127759,1.0806789005000006 -Na2Ru2C2Cl8O4_7_12275.vasp,Na2Ru2C2Cl8O4,-2.9310609788888886,0.41544823569444217 -V1Te8W3_25_19949.vasp,VTe8W3,-2.7340082758333337,0.1414754523611106 -In1Te4_8_8367.vasp,InTe4,-1.014197402,0.4365418890000002 -P2Ir2O6_1_13992.vasp,P2Ir2O6,-4.497360819,0.8412931053333281 -Sr1As2F12_2_17021.vasp,SrAs2F12,-2.7567815406666667,-0.08489461199999992 -Sn2As2Cl2O6_7_16716.vasp,Sn2As2Cl2O6,-3.5544545325,0.22902668000000004 -Mo2Br4_14_11576.vasp,Mo2Br4,-1.4767090433333332,0.38627290083333343 -Zr3Br1Cl1O3_1_21749.vasp,Zr3BrClO3,-5.03744163875,0.38535671291666684 -Sc2Se1S1I2_6_16153.vasp,Sc2SeSI2,-3.0450572366666666,0.05399108750000048 -Ti2S2Cl2_59_18996.vasp,Ti2S2Cl2,-4.449038451666667,-0.15408319638889267 -Sb1I2_187_15462.vasp,SbI2,-0.4216972833333333,0.35977624249999934 -H4Au4Cl4O4_14_7059.vasp,H4Au4Cl4O4,-1.870788790625,0.12006769208333323 -Bi2Te6P2_1_2579.vasp,Bi2Te6P2,-1.733923512,0.33048837899999856 -Si1Pb1_156_16356.vasp,SiPb,-1.538761415,0.62040617 -Na2Mn1P2S7F3_1_12211.vasp,Na2MnP2S7F3,-2.947539504,-0.0023440455875028965 -Mn2Fe1C12_164_11068.vasp,Mn2FeC12,-5.135959934,1.7904208473333239 -Cu4H4O4F4_14_5413.vasp,Cu4H4O4F4,-2.5100996925,0.20932614651041714 -Cr2S5F2_12_4473.vasp,Cr2S5F2,-2.7468768655555555,0.37380437243055264 -Cu1Pd2O4_187_4941.vasp,CuPd2O4,-2.4290499442857145,0.28577939428571275 -Fe6O8F4_47_6092.vasp,Fe6O8F4,-3.3267833277777776,-0.12469587097222493 -Ge4Sb8_26_6947.vasp,Ge4Sb8,-2.4521663866666668,-0.20546313000000205 -Na2N2F4_67_12216.vasp,Na2N2F4,-2.3205331725,0.40818492041666254 -Ba1Ti1O3_25_1870.vasp,BaTiO3,-5.368784078,0.5464013640000003 -V4B3H2S2_164_20303.vasp,V4B3H2S2,-4.310915223636363,0.2519787452272688 -K2Mn2Cl6O4_2_9239.vasp,K2Mn2Cl6O4,-2.214118685,0.1047386084873898 -Cd3B2O6_189_3608.vasp,Cd3B2O6,-3.5901413036363636,0.429139299999997 -Mn2Se1Cl3_6_11268.vasp,Mn2SeCl3,-1.8838337516666668,0.03677407416666656 -Si12Ni4_127_16311.vasp,Si12Ni4,-2.941926010625,-0.762951745625 -Zn1In1Ni1I1Cl1O1_1_20963.vasp,ZnInNiIClO,-0.89205209,0.42162983032985746 -Si8_65_16552.vasp,Si8,-3.40081826875,-0.4106692187500003 -Ba2Ga2O4F10_11_1986.vasp,Ba2Ga2O4F10,-3.1430789205555554,0.2914985047222193 -Ba2I4O8_125_2005.vasp,Ba2I4O8,-2.7135055064285716,0.2748270740476171 -Sr2Si2Ni2_129_17316.vasp,Sr2Si2Ni2,-1.347857245,0.20918528333333342 -W2N1O2_164_20509.vasp,W2NO2,-6.0794971339999995,0.06855373451700086 -Hf2Sb1Te2_164_7584.vasp,Hf2SbTe2,-3.9465474720000002,0.1888767425000002 -Mn1Sn1Br2_3_10891.vasp,MnSnBr2,-1.01895349,-0.7088088181249999 -Ca2H8Cl4O4_53_3039.vasp,Ca2H8Cl4O4,-3.647332052777778,0.05756766277777725 -Ge2Se2_123_6872.vasp,Ge2Se2,-2.2681145575,0.6321787875 -Sc1Sn1Se1Cl3_1_16005.vasp,ScSnSeCl3,-2.322644711666667,0.1287980424999976 -Be1P2H4S4_5_2227.vasp,BeP2H4S4,-3.424200596363636,-0.10056366837121844 -Nb3Cl7O1_156_12967.vasp,Nb3Cl7O,-3.537830706363636,0.11620128059090518 -Ti1Pd1S2_115_18829.vasp,TiPdS2,-3.8903321725,0.16131089945524998 -Tl1I2_187_19291.vasp,TlI2,0.05458786333333333,0.21963941229166653 -K4La4P8Se24_14_9470.vasp,K4La4P8Se24,-2.929463208,0.056096470499999995 -As1I3_187_1152.vasp,AsI3,-0.2277963375,0.45777589125 -Rh5S10_1_15255.vasp,Rh5S10,-2.81535512,0.3654127833333305 -Ge1As1O2_1_6635.vasp,GeAsO2,-4.05534786,0.4109224431249996 -Te6P2Au2_147_18663.vasp,Te6P2Au2,-1.2297689330000001,0.26752634319444246 -Rb1Br2_25_14723.vasp,RbBr2,-0.29251636333333336,0.4340115049999994 -K2Cd4S8Cl6_31_9055.vasp,K2Cd4S8Cl6,-1.0819853915,0.27863315981250036 -Ca2I2F2_129_3052.vasp,Ca2I2F2,-2.5151646066666666,0.051270423333333315 -Cu2H12C14N8_51_5105.vasp,Cu2H12C14N8,-5.636157373333333,-1.7385553780555636 -Ir2F2_13_8783.vasp,Ir2F2,-2.16360474,1.1384800808333309 -Au2O1_191_1498.vasp,Au2O,0.41051206,1.7145882716666656 -Sn2S2_129_16841.vasp,Sn2S2,-1.9448417475,0.5189884737499999 -Bi2Se2Br2_59_2538.vasp,Bi2Se2Br2,-1.5198437416666666,0.11698531166666659 -Cd2Te2Mo2O12_113_3594.vasp,Cd2Te2Mo2O12,-3.9153506394444446,0.05402108222222202 -V3Fe3Te2O16_1_20260.vasp,V3Fe3Te2O16,-4.501450374583333,0.03182999111111062 -Co2Ni2Sb2_129_3942.vasp,Co2Ni2Sb2,-0.9034282316666666,0.38943180833333224 -Mn6I18_164_11469.vasp,Mn6I18,-0.30766242166666663,0.14292370005208338 -Au2Se1O4_21_1535.vasp,Au2SeO4,-2.0699185114285714,0.2778202757142847 -Ge2S2O8_31_6827.vasp,Ge2S2O8,-4.369345663333333,0.25940921625000035 -Al2Se2Br2_59_960.vasp,Al2Se2Br2,-2.362316115,0.07345690999999999 -In1As2Au1Se6_149_8192.vasp,InAs2AuSe6,-1.8051457760000003,0.2701992448333308 -Mg3Si4O12_12_10567.vasp,Mg3Si4O12,-5.646555104736842,0.06631485631578515 -Cs2Sb4Se8_2_4786.vasp,Cs2Sb4Se8,-1.9763414092857143,0.22182530142857138 -Cu8P8O24_14_5503.vasp,Cu8P8O24,-4.279657535749999,0.23782377775000096 -Nb1B1Te2S1_8_12468.vasp,NbBTe2S,-3.6187302019999996,0.5927238086666672 -Sb2O2F2_31_15611.vasp,Sb2O2F2,-3.5774667499999997,0.10045613479166704 -Hf1S2_115_7280.vasp,HfS2,-4.853846496666667,0.5879177699999998 -Si4Te4Pt4_14_16519.vasp,Si4Te4Pt4,-2.7556531399999997,0.1980966937500006 -Al1Co5Cl2_123_632.vasp,AlCo5Cl2,-1.6075965575,0.4610537874999977 -Ir2S2_129_8821.vasp,Ir2S2,-2.9656553825,0.866871175833329 -Nd1Pb5_47_13224.vasp,NdPb5,-0.9887622149999999,0.2644891916666656 -Cd4W2S8_13_3636.vasp,Cd4W2S8,-1.9264933342857142,0.41399963642856896 -Si4Se4_57_16515.vasp,Si4Se4,-3.09199148875,-0.00038538859375003565 -Cu2Bi2O4_51_5040.vasp,Cu2Bi2O4,-2.6045566675,0.6182097669531254 -Sb6O12F2_4_15851.vasp,Sb6O12F2,-3.6273767425,0.5533997199821352 -Sb2Os2O6_162_15618.vasp,Sb2Os2O6,-4.540424436,0.3500998772499945 -Ta2Fe4Se6_11_17734.vasp,Ta2Fe4Se6,-2.698648460833333,0.48035910999999576 -K1Mo2Br6O2_47_8916.vasp,KMo2Br6O2,-2.2019945745454548,0.04587267363636327 -K2S6N2F2_1_9337.vasp,K2S6N2F2,-2.5027466691666667,0.22096992260416282 -Hf1Zr1Br1Cl1O2_1_7375.vasp,HfZrBrClO2,-4.964541165,0.3876860125000001 -Hf2Cu1H1Ir1Se7Cl2_1_7484.vasp,Hf2CuHIrSe7Cl2,-2.983501527142857,0.37866458542657583 -P4_11_14131.vasp,P4,-3.8757668275,0.17022915750000012 -Pt1Se1S1_156_14591.vasp,PtSeS,-2.3816061066666667,0.06608887583333312 -Ni1Ir1Br6_149_13366.vasp,NiIrBr6,-0.60442963625,0.019842442499999974 -Sb1F3_187_15451.vasp,SbF3,-2.1960168025,0.9201166125000002 -Zn2Te4_14_21188.vasp,Zn2Te4,-0.117351535,0.488364290555555 -Ca2S8I4_125_3114.vasp,Ca2S8I4,-1.6493058978571429,0.3920331009285698 -Rb4Te2_51_14982.vasp,Rb4Te2,-0.30957816,0.37282846333333336 -Ba3Bi3_25_2098.vasp,Ba3Bi3,-0.7489561616666666,0.7514319861904749 -Hf3Te2H2C2_187_7735.vasp,Hf3Te2H2C2,-5.023036542222222,0.551832993827156 -As2Pd3S8_164_1274.vasp,As2Pd3S8,-2.364351470769231,0.36758686534615115 -Sn1Ge1_156_16637.vasp,SnGe,-1.65538942,-1.87261335 -Ta2S2Cl2_59_17845.vasp,Ta2S2Cl2,-4.527580763333334,0.057368238333328936 -Sc2Se2_129_16161.vasp,Sc2Se2,-3.6050150525,0.18693986499999982 -Cu1Bi1As2Se6_143_4848.vasp,CuBiAs2Se6,-1.9037807560000002,0.2248039804722179 -Hf3Zr1S8_156_7754.vasp,Hf3ZrS8,-5.1811556649999995,0.09988517687500043 -Cu4Bi2As2O12_31_5395.vasp,Cu4Bi2As2O12,-3.1823240695,0.4119335237499976 -Pt2Br4_14_14604.vasp,Pt2Br4,-0.6881060316666666,0.09418613583333335 -Rb2Te2C2S6F6_1_14950.vasp,Rb2Te2C2S6F6,-2.4721727327777776,0.4716384169675881 -Cs4Hg2Br8_11_4809.vasp,Cs4Hg2Br8,-0.309925485,0.20751261714285713 -B3Mo4Cl2_164_1732.vasp,B3Mo4Cl2,-3.939842407777778,0.16085270814814467 -As1Se1Br1_156_1174.vasp,AsSeBr,-1.7663865166666666,0.23329381416666695 -Te10P10_26_18269.vasp,Te10P10,-2.3193063030000003,0.48958456783333315 -P1Pt1_187_13937.vasp,PPt,-2.43261043,1.2609064909374998 -Ba2I4_51_2007.vasp,Ba2I4,-1.240039035,0.30448289166666664 -Zn2Cr3O8_10_21063.vasp,Zn2Cr3O8,-3.93796713,0.07517144687499777 -Cu2N2O2F2_31_5191.vasp,Cu2N2O2F2,-2.8993353775,0.24097586125000037 -Sr2Cu1S2Cl2_38_17201.vasp,Sr2CuS2Cl2,-2.1534462957142857,0.11778399333332945 -Cu2Re1H6_5_5235.vasp,Cu2ReH6,-2.722447674444444,1.7032627866666634 -Nb1Zn1Se2_1_12619.vasp,NbZnSe2,-2.21161042,0.07897033394230607 -Be2Sb4_12_2268.vasp,Be2Sb4,-2.1909230066666665,0.08184096999999824 -Mg2Al2Te5_164_10420.vasp,Mg2Al2Te5,-1.8985785444444447,0.07200359722222205 -Ce2S2I2_164_3674.vasp,Ce2S2I2,-3.3537516783333334,-0.010223947500000108 -Te1Ir2Br1O2_1_18295.vasp,TeIr2BrO2,-2.6386195166666666,0.9208582292361072 -Dy2S6_51_5533.vasp,Dy2S6,-3.6435462875,0.1985738877343748 -Ge1Br4_123_6655.vasp,GeBr4,-0.716308976,0.45396681075 -P2Pt3Se8_164_14036.vasp,P2Pt3Se8,-2.2992111284615384,0.4369030906410196 -Sr2Hg1_123_17253.vasp,Sr2Hg,1.06526949,0.2448775866666666 -Sb2I6_1_15594.vasp,Sb2I6,-0.47013166625,0.12358016625000001 -B6Pd1C2I2F4_6_1785.vasp,B6PdC2I2F4,-3.815309266,0.6160841994629507 -V3Mo1Se1S7_8_20278.vasp,V3MoSeS7,-3.5959967425,0.13521839861110763 -Ca3Cu2S4Br2_123_3169.vasp,Ca3Cu2S4Br2,-2.0157304454545457,0.07723884515151103 -K2H2C6N8O10_2_9122.vasp,K2H2C6N8O10,-5.314122601428571,0.2685483738690375 -Cu1Ni1Pd1Pt1I3Cl1O4_1_4921.vasp,CuNiPdPtI3ClO4,-1.4183982883333333,0.20102435634721944 -Ta2S2F2_59_17847.vasp,Ta2S2F2,-5.085086045,-0.08745326983334323 -Ag2B4N2Cl2F4_2_189.vasp,Ag2B4N2Cl2F4,-3.6544381735714286,0.37244825880951477 -Sc4S2N3_164_16255.vasp,Sc4S2N3,-5.677464974444444,-0.10946737935185658 -Ta2I6_162_17766.vasp,Ta2I6,-1.7777639575,0.3157343739843754 -Cr1Te4Au1_10_4279.vasp,CrTe4Au,-1.1187720533333334,0.20407821166666662 -Cr4S10_31_4622.vasp,Cr4S10,-2.8864348557142856,0.45636000705356883 -Mo2Se1S1I1_99_11682.vasp,Mo2SeSI,-2.374252208,0.606572413666667 -Sr2Ag1Br2O2_123_17099.vasp,Sr2AgBr2O2,-2.487159808571428,0.05157292571428296 -Nb2Ru2S8_11_12829.vasp,Nb2Ru2S8,-4.146895069166667,-0.19626578333333322 -Ta2Ir2S8_11_17769.vasp,Ta2Ir2S8,-4.426044380833333,-0.17100062000000005 -Si4Ni8As4_29_16495.vasp,Si4Ni8As4,-1.4617587325,0.39418089312500004 -Sn2Br4_12_16748.vasp,Sn2Br4,-1.0378458566666666,0.1291457283333335 -N4Cl12_14_11791.vasp,N4Cl12,-1.290898366875,0.24499567562500002 -Rb2Cl1_164_14832.vasp,Rb2Cl,-0.39766429999999997,0.14273796333333294 -Na4Hg1P2_164_12391.vasp,Na4HgP2,-1.2247644771428572,0.08646999428571434 -B1_123_1645.vasp,B,-4.30886605,1.8521192483333335 -H3Pt1_191_7049.vasp,H3Pt,-2.30512238,2.1571469062500004 -Si3As2O9_174_16463.vasp,Si3As2O9,-5.643059272142857,0.07946959071427973 -Sc1Pd1S3Br2_1_15980.vasp,ScPdS3Br2,-2.34994288,0.26459828031249516 -In1Cu1P2Se6_143_8231.vasp,InCuP2Se6,-2.1809036290000003,0.1219872705416642 -Fe2S4F2_11_5941.vasp,Fe2S4F2,-2.2032464275,-0.19095575593750208 -Ca2Re4H12C2N4O20_2_3100.vasp,Ca2Re4H12C2N4O20,-5.371863937727273,0.04687726988635252 -C14_187_2719.vasp,C14,-7.305951527857142,0.8103738821428577 -Zr1Nb2Ga1Se3S1Br2_1_21368.vasp,ZrNb2GaSe3SBr2,-3.4217020679999997,0.027437550538455868 -V1H2_187_19851.vasp,VH2,-3.2246760433333335,0.43460743999999973 -Li2Pb1O6F6_147_10039.vasp,Li2PbO6F6,-2.13488253,0.9178869185000003 -Na2Se4O12_2_12299.vasp,Na2Se4O12,-3.331378088333333,0.21885078694444116 -Y3N2F2_187_20802.vasp,Y3N2F2,-6.332689641428572,-0.15483042404762892 -Pd1F2_164_14362.vasp,PdF2,-1.04386903,0.3933801883333332 -Bi10Se10_26_2294.vasp,Bi10Se10,-1.667871452,0.1668663054999989 -Ga2Te4Pd1_164_6515.vasp,Ga2Te4Pd,-1.6057268957142856,0.09402034169642709 -As2P2O6_7_1237.vasp,As2P2O6,-4.829947642,0.2384951741666579 -Ga1Pt5Cl2_38_6251.vasp,GaPt5Cl2,-1.46064455875,0.255673875385671 -K2Hg4Te2S6I6_31_9200.vasp,K2Hg4Te2S6I6,-0.489012833,-0.01690808914583497 -As2Pd2O6_162_1266.vasp,As2Pd2O6,-3.136040742,0.5846607922499958 -Al2N2Cl2_59_893.vasp,Al2N2Cl2,-3.9763433833333335,0.4689065319444403 -Cr2S2N1_164_4467.vasp,Cr2S2N,-4.142786486,0.051909945999999874 -Mn8Zn2O18_85_11479.vasp,Mn8Zn2O18,-3.922309946785714,0.23903349267856733 -B2W3S2_187_1723.vasp,B2W3S2,-5.445678612857143,0.18174110142856703 -Hf2Se2_129_7607.vasp,Hf2Se2,-4.3141410825,0.25307373249999987 -Ca2Ag1S2I2_123_2911.vasp,Ca2AgS2I2,-1.527047347142857,-0.04872857504464517 -Cu1Te2Au1_25_4993.vasp,CuTe2Au,-0.28744734,0.21061125125 -In4Se3S1I1Br2Cl1_1_8691.vasp,In4Se3SIBr2Cl,-1.5188746041666665,0.10333391005208353 -Pb2F2_164_14243.vasp,Pb2F2,-1.4118679175,0.9344201724999999 -Mn3N2Cl2_187_11395.vasp,Mn3N2Cl2,-3.4248334985714286,0.49521883142856815 -Ga2Se2Cl2_31_6468.vasp,Ga2Se2Cl2,-2.0617493716666666,0.06030194999999994 -Zr2H2Br2_164_21575.vasp,Zr2H2Br2,-3.3515900933333334,0.008114416666666457 -Co2O2_129_3945.vasp,Co2O2,-3.0894929725,-0.12232522249999978 -Ir1S2_164_8758.vasp,IrS2,-3.1598709133333336,-0.07051598000000059 -Au1O2F2_12_1433.vasp,AuO2F2,-0.9733002799999999,0.7169820071527766 -Hf1Cd1Fe1Se3I1Br3_8_7135.vasp,HfCdFeSe3IBr3,-1.60477412,0.28244123183333336 -In2S2F2_31_8546.vasp,In2S2F2,-2.353675358333333,0.2362799950000003 -Rb6Re6Cl24_51_14984.vasp,Rb6Re6Cl24,-2.2012384277777777,0.07215050407406773 -Ca2P2I2O16_13_3088.vasp,Ca2P2I2O16,-3.915313527727273,0.3160843439772695 -Ti1Te1O1_156_18854.vasp,TiTeO,-5.20210109,0.24228578944444007 -P12S12_7_13905.vasp,P12S12,-3.16687777375,0.3468975083984378 -Pd2S2Cl2_59_14459.vasp,Pd2S2Cl2,-1.5218389766666667,0.10825077604166644 -Au2I6_191_1494.vasp,Au2I6,0.79751091,0.34469463749999996 -K4Cl4O8_2_9434.vasp,K4Cl4O8,-2.001779635625,0.3899400743749999 -Sn2C2Br2_59_16751.vasp,Sn2C2Br2,-2.3701130216666666,0.48425399333333263 -H2W2N1O2_164_7033.vasp,H2W2NO2,-5.234536285714285,-1.411573490027541 -K6In4As6_12_9539.vasp,K6In4As6,-1.320145663125,0.12147300437500008 -In2S4_12_8561.vasp,In2S4,-2.1085551483333336,0.4316259707291637 -Te10N10_26_18267.vasp,Te10N10,-3.1619749495000002,0.39079324008333327 -Hf2B1Te2_164_7441.vasp,Hf2BTe2,-4.745163284,-0.07674699799999951 -Li2Mg4_164_9983.vasp,Li2Mg4,-0.47775256666666666,-0.07974046583333333 -Li1Co1P2Se6_149_9675.vasp,LiCoP2Se6,-2.643195557,0.1962275232499946 -Ta3C2Cl2_187_17948.vasp,Ta3C2Cl2,-6.32787565,0.1517067660714252 -Ti3B2H2S2_187_19060.vasp,Ti3B2H2S2,-5.2406824344444445,0.31692279333332873 -P2H6O8_4_13981.vasp,P2H6O8,-4.894449931875,0.03339637656250005 -Li2Cl1_164_9858.vasp,Li2Cl,-1.9280578533333335,0.3993668188888868 -Sb2Te2_12_15724.vasp,Sb2Te2,-1.61484702,0.3043355537499979 -Zr1Bi2_164_21261.vasp,ZrBi2,-2.34532959,-0.9098411158333335 -Mo2C1S2_164_11584.vasp,Mo2CS2,-4.411967708000001,0.17493174699999958 -Sm2Si6Ni2_51_16588.vasp,Sm2Si6Ni2,-3.138403216,-0.28270843 -Ag4I4O4_14_531.vasp,Ag4I4O4,-0.6674137316666666,0.34685714902777687 -Nb3S2Br2_5_13002.vasp,Nb3S2Br2,-4.0089966128571435,0.22750868506121424 -Tl2Cl6_189_19394.vasp,Tl2Cl6,-0.59422043875,0.1490710512500001 -Cu2Sb4S3F2_6_5278.vasp,Cu2Sb4S3F2,-1.8393542772727272,0.42729012315426784 -In2Te2Br2_59_8615.vasp,In2Te2Br2,-1.109076775,0.11990098000000016 -Hg2Bi2Cl2O4_11_7935.vasp,Hg2Bi2Cl2O4,-1.9168767070000001,0.15942702819999646 -Ho2Se2I2_59_8149.vasp,Ho2Se2I2,-2.85153485,0.0445363483333332 -Cr1Fe2Te2Rh1Se3I1_1_4173.vasp,CrFe2Te2RhSe3I,-1.615658179,0.1213165041666654 -Cu1Cl1_156_4868.vasp,CuCl,-0.22539965,0.41074390375000003 -Al4Bi4Cl24_14_1059.vasp,Al4Bi4Cl24,-1.7719455528125,0.08357968249999992 -Mg2I4_51_10471.vasp,Mg2I4,-0.7094131,0.15234114666666665 -Mn2Te4P2Br2_10_11322.vasp,Mn2Te4P2Br2,-1.7994621729999998,0.4204466861944408 -Hf1Zr3Te4S4_156_7422.vasp,HfZr3Te4S4,-4.039073348333333,0.08959818833332911 -Rb2Cd4Se2I6O6_31_14817.vasp,Rb2Cd4Se2I6O6,-1.3309813615,0.12117903983333304 -Nb1Ni2Br8_2_12545.vasp,NbNi2Br8,-0.9673334736363636,0.03893950499999885 -Sc1Te1_123_16014.vasp,ScTe,-2.180648185,1.0261932850000002 -Sc1Ag1P2Se6_149_15890.vasp,ScAgP2Se6,-2.6193201640000003,0.06938777049999967 -Ga1Te6As2Au1_149_6296.vasp,GaTe6As2Au,-1.3690152420000001,0.11766810537499783 -Te1W2O8_1_18338.vasp,TeW2O8,-5.239969929090909,0.021121623068177442 -Sc5I8_10_16271.vasp,Sc5I8,-1.7295564753846155,0.09426383782051095 -W1Br2O2_38_20419.vasp,WBr2O2,-3.6871764820000004,0.2232885969999998 -Ru3S4_156_15368.vasp,Ru3S4,-3.2575548814285713,0.44050328071428213 -Ge1Br2_164_6653.vasp,GeBr2,-1.5901407933333334,0.05463128666666672 -Nb1Se1N1Cl1_1_12573.vasp,NbSeNCl,-4.3730782175,0.23977102823610152 -Sr1Br2_187_17032.vasp,SrBr2,-1.7207843266666665,0.1223846900000003 -Na2Ru2S2N2F10_1_12283.vasp,Na2Ru2S2N2F10,-2.9529773338888887,-0.020880396080254937 -In1Ag1Te6P2_149_8187.vasp,InAgTe6P2,-1.5233925320000001,0.27613522716666516 -Nb4Fe8Te8_59_13077.vasp,Nb4Fe8Te8,-2.2045911425,0.7007087781666668 -P1Se2_187_13951.vasp,PSe2,-2.3234171233333334,0.4918693909027755 -Zr3C2O2F2_5_21756.vasp,Zr3C2O2F2,-6.085518021111111,0.19650390527776684 -K1Mg1C2O10_2_8913.vasp,KMgC2O10,-4.265236090714286,0.49082505428571144 -Tm2Bi2O6_147_19669.vasp,Tm2Bi2O6,-4.873467647,0.358514702875 -Ir5Se10_1_8871.vasp,Ir5Se10,-2.7296540966666667,-0.3765673408333332 -Ca10Rh2_26_2787.vasp,Ca10Rh2,0.068514425,0.16300321 -Ba4Sb4S8F4_14_2182.vasp,Ba4Sb4S8F4,-3.2335234925000003,0.061183811375000285 -Ta2I10_51_17752.vasp,Ta2I10,-1.1252933125,0.29436474687500014 -Ir1Br2_187_8728.vasp,IrBr2,-0.5755846466666666,1.1446270044444429 -Cd1H4C6I2_10_3356.vasp,CdH4C6I2,-4.27527677,0.4512372493589678 -Al1Te2_115_747.vasp,AlTe2,-1.88096867,0.1916254196874959 -Mg3Cl6_12_10547.vasp,Mg3Cl6,-1.9668865466666665,0.10014099833333323 -K2Hg4S6Cl6O2_31_9179.vasp,K2Hg4S6Cl6O2,-0.9532747804999999,0.3915987242410692 -V4H2C3O2_164_20325.vasp,V4H2C3O2,-5.473556460909091,0.08966763433883262 -Hg12As4O20_1_7830.vasp,Hg12As4O20,-1.8045809805555555,0.25323632157407044 -Cd2Bi2Se4Br2_26_3475.vasp,Cd2Bi2Se4Br2,-0.894770207,-0.06605980899999989 -Ta1Cl5_47_17528.vasp,TaCl5,-2.5955296916666666,0.16759011000000035 -Hf1Zr3Te8_1_7423.vasp,HfZr3Te8,-3.0970438333333337,0.24749601333333304 -Tl12As4S12_14_19189.vasp,Tl12As4S12,-1.8881935625,0.07362731785714294 -Ni1Ir1Br2Cl4_1_13365.vasp,NiIrBr2Cl4,-0.87067631125,0.01928897968750004 -Sb4Au2O12_12_15763.vasp,Sb4Au2O12,-3.4958843016666665,0.17730767055555008 -Cu2B2S2Cl2_31_5030.vasp,Cu2B2S2Cl2,-1.81338739875,1.3071799127083332 -Mn1F2_187_10705.vasp,MnF2,-2.3791173133333334,0.4302271466666667 -Ga1Cu1I6_1_6162.vasp,GaCuI6,0.01320853875,0.22047487046875003 -Y1Te1S1_8_20681.vasp,YTeS,-3.9364315566666668,0.04342104319444029 -Pt2S2_123_14666.vasp,Pt2S2,-2.1645813225,0.4504998374999998 -Ta4Pd2S14_11_18085.vasp,Ta4Pd2S14,-4.14335601,0.11652920893749785 -Na2Co1_187_12057.vasp,Na2Co,0.2935211233333333,1.0673233133333326 -Ga2Ni2O5_187_6402.vasp,Ga2Ni2O5,-3.3047800333333335,0.1635210172222228 -Tl4Ni2C8N8_14_19612.vasp,Tl4Ni2C8N8,-5.115468706818182,0.1038885428787785 -Ca2Yb2In2Se8_11_3139.vasp,Ca2Yb2In2Se8,-2.6907271035714286,-0.2100210254761955 -Mn1V1Se1Br4_1_10925.vasp,MnVSeBr4,-1.634505862857143,0.11025343264285065 -Ga2Ni2Se5_156_6408.vasp,Ga2Ni2Se5,-1.6682018222222221,-0.008797343888890752 -Ga1Cu1Te6As2_149_6179.vasp,GaCuTe6As2,-1.411655874,0.304982248166665 -Sb2As2S8_31_15534.vasp,Sb2As2S8,-2.6195846433333334,0.45151617677082756 -Ag2I2O2_59_314.vasp,Ag2I2O2,-0.5973759983333333,0.41689488236111016 -Ag2Se4_14_445.vasp,Ag2Se4,-0.8039384933333333,-0.461641665 -Nb2Te4Pd4_51_12923.vasp,Nb2Te4Pd4,-2.39171543,0.12029927295651938 -W3O8_12_20569.vasp,W3O8,-5.796263092727273,0.40327236669758154 -Sc1Au3I2Br2O4_1_15903.vasp,ScAu3I2Br2O4,-1.6943125608333334,0.26725416406249436 -Cu1Mo1F6_2_4918.vasp,CuMoF6,-2.36032319375,0.0864837249999999 -Ag2P30_2_354.vasp,Ag2P30,-3.74818106875,0.013914496874996907 -Sb2P2O8_11_15622.vasp,Sb2P2O8,-5.1004100333333335,0.20296286333333313 -Li2Fe4F14_11_9918.vasp,Li2Fe4F14,-2.454074331,-0.05601394699999962 -Pd2S2O6_11_14463.vasp,Pd2S2O6,-3.507464718,0.11840217999999605 -Mn1Al2O4_164_10625.vasp,MnAl2O4,-5.3825606442857135,0.0413908557142868 -Ba4Bi4Te8Cl4_14_2144.vasp,Ba4Bi4Te8Cl4,-1.9158777974999999,0.1324158447499978 -Li2Sn8P6O24_2_10075.vasp,Li2Sn8P6O24,-4.817443358,0.08726075599999561 -Bi4O6_156_2621.vasp,Bi4O6,-3.3523337339999997,0.5056604940000002 -Co2Se2O1_5_4021.vasp,Co2Se2O,-2.709671304,-0.21340157937499993 -Rb4Cd2Cl8_11_14964.vasp,Rb4Cd2Cl8,-0.837374685,0.037024463333332314 -Ge6N2_191_6961.vasp,Ge6N2,-3.2668060975,0.2734034162500003 -Zr3Br2O4_8_21752.vasp,Zr3Br2O4,-5.377172562222222,0.2963909244444398 -Na2C4N2O6_4_12006.vasp,Na2C4N2O6,-5.835379547857143,-0.027751833125012726 -Cd1S1F2_156_3410.vasp,CdSF2,-1.0314437925,0.48475141734375016 -Cd1Se2_115_3426.vasp,CdSe2,-0.4192651766666667,0.09441928444444403 -K2Se2F2_11_9346.vasp,K2Se2F2,-1.354514075,0.3997802861111095 -Ga2Fe2O5_164_6356.vasp,Ga2Fe2O5,-4.201948033333334,-0.08023530354167008 -K6H2Pd2S4Cl4O12_26_9536.vasp,K6H2Pd2S4Cl4O12,-3.145824185,0.13881323015150543 -Pt2Br4_2_14605.vasp,Pt2Br4,-0.4738984766666667,0.3083936908333333 -Ni1Pd2S4Br1_1_13402.vasp,NiPd2S4Br,-1.319687545,0.44453545416666485 -Ga1As1S2I1Cl1_1_6133.vasp,GaAsS2ICl,-2.0037217766666666,0.20537880708333334 -Ti1Co1Se1S1I2_1_18764.vasp,TiCoSeSI2,-2.5402575583333333,0.17177180444443996 -Tl4F4_57_19601.vasp,Tl4F4,-1.706766555,0.24620555749999995 -Au1Se2_187_1447.vasp,AuSe2,-0.5934341366666667,0.6266422344444433 -Ca2B2S6F2_59_2945.vasp,Ca2B2S6F2,-3.419340994166667,0.3362431283854136 -Ga2Hg1Te4_164_6385.vasp,Ga2HgTe4,-0.9982549914285714,0.18031577999999993 -Sb1As2Au1S6_143_15433.vasp,SbAs2AuS6,-2.3148864920000003,0.47911120521874717 -In1Te1_156_8364.vasp,InTe,-0.821543875,0.563465145 -Sc1Ag1P2S6_149_15889.vasp,ScAgP2S6,-3.206253771,0.06707813399999996 -Ta1Bi1Sb1_156_17512.vasp,TaBiSb,-3.4509086466666665,0.10987205861110283 -Nb2I2N2_59_12743.vasp,Nb2I2N2,-5.089125220000001,0.09818809909999082 -Mn2Mo2N1Cl4O3_1_11139.vasp,Mn2Mo2NCl4O3,-3.4239341475000002,0.23786336437499978 -Tl2Zn1Se4_156_19566.vasp,Tl2ZnSe4,-0.9911531285714286,0.2305878574999991 -Te8I8_2_18696.vasp,Te8I8,-0.429978048125,0.150549461875 -Y2Co2Ge4_129_20723.vasp,Y2Co2Ge4,-3.3863221575,0.368670764375 -Nd2S6_129_13243.vasp,Nd2S6,-3.75707531125,0.21935078357812532 -Cr3Cl2O4_12_4553.vasp,Cr3Cl2O4,-4.021699275555555,-0.02404352706018767 -Sr1Nb2S7_123_17065.vasp,SrNb2S7,-3.794804683,0.3598704769999955 -Mn2S3Cl3_1_11224.vasp,Mn2S3Cl3,-2.1091740575,0.1855944612499998 -Sb2Te6Ir2_162_15735.vasp,Sb2Te6Ir2,-2.042775468,0.37487615716666556 -Sr1Li4P2_164_17061.vasp,SrLi4P2,-2.6774531371428574,0.16944531999999946 -Ho1Sb2_21_8119.vasp,HoSb2,-2.3376191966666666,0.22016733416666434 -Tl2P2S6_143_19480.vasp,Tl2P2S6,-2.58038525,0.18138314200000005 -Cd2Sn1S4_21_3580.vasp,Cd2SnS4,-1.0473442571428573,0.49623574928571257 -Mg10Ir2_26_10327.vasp,Mg10Ir2,-0.5604759375,0.3830685803985499 -Hg8Cl4O4_13_8106.vasp,Hg8Cl4O4,0.117187008125,0.22180390104166664 -Ba4Te8P4Cl4_14_2195.vasp,Ba4Te8P4Cl4,-2.3294676890000003,0.2174850382916665 -Ni3P2O8_164_13707.vasp,Ni3P2O8,-4.023654717692308,-0.0364037473076948 -Ca4Te8O20_14_3247.vasp,Ca4Te8O20,-3.9473257390625,0.11011729437500017 -Rh2S2_6_15225.vasp,Rh2S2,-2.3688073625,0.6379379373913013 -Mn1H10C8O12_2_10758.vasp,MnH10C8O12,-5.17682424483871,0.30362268311827445 -As6C2_164_1379.vasp,As6C2,-3.67543374125,0.7620360312500001 -Y2Te6_129_20783.vasp,Y2Te6,-2.9318785375,-0.7471542124999999 -Re2Os1Rh1Se3S5_1_15069.vasp,Re2OsRhSe3S5,-3.8465158183333332,0.283831877083333 -H12Pb2C12N8O6_2_6979.vasp,H12Pb2C12N8O6,-5.60945922475,0.25042141706249255 -Cu1C12O2F4_6_4864.vasp,CuC12O2F4,-5.324083564210526,0.7803056823684157 -Mn1V1Br1Cl1O2_1_10920.vasp,MnVBrClO2,-3.56857317,0.04001385604166674 -Au2S1O1_99_1508.vasp,Au2SO,-0.5932293675,1.543105411875 -Cd1Pb2S2Br2_12_3393.vasp,CdPb2S2Br2,-1.2554192071428572,-0.33958115821428725 -Y2F6_191_20730.vasp,Y2F6,-4.84275439625,0.36106554499999977 -Mn3Se4_164_11410.vasp,Mn3Se4,-2.40026774,-0.07882979605911489 -Fe2Au1O4_187_5793.vasp,Fe2AuO4,-3.076838748571429,0.08250866053571163 -Cu2H10C4S2N2O12_4_5102.vasp,Cu2H10C4S2N2O12,-4.582267918125,0.1622078886892342 -Pb1Se2O6_164_14207.vasp,PbSe2O6,-3.345901334444444,0.2854588777777751 -La2Te1I2_164_9617.vasp,La2TeI2,-2.57498642,0.052251724 -B2Te2_164_1714.vasp,B2Te2,-3.47291049,0.3934750375000001 -Cd2Cl2_129_3487.vasp,Cd2Cl2,0.8747046725,0.47480088374999996 -Cu2As2O4_26_5006.vasp,Cu2As2O4,-3.1344012125,0.5936044765624959 -Pr2I6_59_14547.vasp,Pr2I6,-1.729958985,0.07890372875000007 -Na1In1Br4O12_2_11882.vasp,NaInBr4O12,-2.468592687222222,0.22566981180554802 -As1Pd2Se2_187_1165.vasp,AsPd2Se2,-1.8929241019999998,0.31284474600000056 -Ca1Bi4O8_1_2808.vasp,CaBi4O8,-3.6851868330769233,0.25383448403845743 -Na2H8Br2O4_2_12131.vasp,Na2H8Br2O4,-3.609027638125,-0.11997956791666642 -Ga2Se3_164_6481.vasp,Ga2Se3,-2.2799307559999997,0.1770611080000002 -Pb2S2Br2_59_14271.vasp,Pb2S2Br2,-1.4917047433333332,-0.23405079010416835 -Tl1Cd1In1S4_156_19237.vasp,TlCdInS4,-1.6183344442857144,0.16068214526785363 -Ta2B1Se2_164_17659.vasp,Ta2BSe2,-5.8172337579999995,0.15711331000000106 -Cr3C2F2_187_4548.vasp,Cr3C2F2,-4.348960238571428,0.24952007178570512 -Sm1C2_123_16554.vasp,SmC2,-5.625943073333333,0.7938584400000006 -Mo2P2S6_12_11657.vasp,Mo2P2S6,-3.4358765730000003,0.22930471085936832 -In1S3_1_8331.vasp,InS3,-2.290168605,0.26943843414062507 -Mo2N2Cl2_59_11637.vasp,Mo2N2Cl2,-4.0401274166666665,0.19651794055555571 -Nb2I8_1_12754.vasp,Nb2I8,-1.250015972,0.1903169535 -Ni2Sb2O7_10_13608.vasp,Ni2Sb2O7,-3.2535485136363635,0.17685898772727038 -Cr2Br8_1_4337.vasp,Cr2Br8,-0.9835617969999999,-0.17585364799999978 -Mn2Bi2S4I2_26_11011.vasp,Mn2Bi2S4I2,-1.904739081,0.19356238983333296 -K4Cd2I8_11_9428.vasp,K4Cd2I8,-0.07052535357142857,-0.26237846904761886 -Bi18Br4_11_2310.vasp,Bi18Br4,-1.128076409090909,-0.5340652210606067 -Rb2Cl10_127_14831.vasp,Rb2Cl10,-0.4143159,0.18999114583333282 -Mn3Cr1O8_156_11373.vasp,Mn3CrO8,-4.500394925833334,0.0527113340104125 -Au2Cl6_162_1475.vasp,Au2Cl6,0.1328728525,0.310775855 -Si2Te2Br2_59_16454.vasp,Si2Te2Br2,-1.8851066966666667,0.2024686566666647 -Ge2S2_31_6830.vasp,Ge2S2,-3.1644592125,-0.9133113587500001 -Zr1Ru1Br2N1O1_1_21411.vasp,ZrRuBr2NO,-4.161961138333333,0.18309111333332584 -Co8P8H24O32_29_4092.vasp,Co8P8H24O32,-4.410370869305556,0.15603685930555145 -Ta4S2_129_18103.vasp,Ta4S2,-6.478461773333334,0.3346736608333256 -Cr1B4H5O6_2_4120.vasp,CrB4H5O6,-4.958833159375,0.7042054235937505 -Ba2Ag1Se2F2_38_1891.vasp,Ba2AgSe2F2,-2.1646262857142857,0.5646097128571402 -C12_191_2718.vasp,C12,-7.4072931575,0.7090322525000001 -Hg2S2O8_31_7999.vasp,Hg2S2O8,-3.1527316691666667,0.10379740833333306 -V3B2H2O2_187_20238.vasp,V3B2H2O2,-4.7929691199999995,0.24884618361110283 -Fe2Bi2Br2O4_26_5805.vasp,Fe2Bi2Br2O4,-2.793188294,0.18464793981249783 -Cu1Sn1S2I2_1_4984.vasp,CuSnS2I2,-1.0664632633333333,0.19502955787615545 -Dy2I6_162_5528.vasp,Dy2I6,-1.56692404375,0.05821632624999995 -V2Se2O7F2_1_20186.vasp,V2Se2O7F2,-4.150506402307692,0.01550644987179095 -Mn2Bi2I2O4_10_11004.vasp,Mn2Bi2I2O4,-2.677028426,0.4020118552284463 -Be8As4H20O28_14_2291.vasp,Be8As4H20O28,-4.773846079166666,0.08476406299999598 -Os2Se2Br2_59_13880.vasp,Os2Se2Br2,-2.434793655,0.33226295999999733 -Mn2I6_162_11116.vasp,Mn2I6,-0.3132605475,0.13732557421875002 -Ga1Cu1Sb2S6_149_6173.vasp,GaCuSb2S6,-2.185165236,0.39474962593749785 -Mn1Ge1P2S6_143_10736.vasp,MnGeP2S6,-3.215992441,0.16221347390971896 -Rb1F1_123_14728.vasp,RbF,-1.85068417,-0.43147965 -Sb2Br8_1_15558.vasp,Sb2Br8,-0.7409561339999999,0.1368217450000001 -Ba5Ce1_8_2200.vasp,Ba5Ce,0.14918273833333334,0.855768969166665 -Ag1Cl1O2_1_45.vasp,AgClO2,-1.544020445,0.1992209168750001 -Hg2Te6Pt4_164_8043.vasp,Hg2Te6Pt4,-0.9505286458333333,0.258102995 -Te2P1Pd2_187_18432.vasp,Te2PPd2,-1.8303879980000002,0.2312075072999965 -V2Te8W2_25_20226.vasp,V2Te8W2,-2.5481694999999998,0.15790000472222232 -Bi2Pd2S2Br4_1_2503.vasp,Bi2Pd2S2Br4,-1.312315183,0.1794644666249965 -Fe2As2Cl2O4_26_5774.vasp,Fe2As2Cl2O4,-3.3413247929999996,0.09404874473332596 -Nb1Cu1Si1Ge2Te2Se5Cl2_1_12501.vasp,NbCuSiGe2Te2Se5Cl2,-2.39294904,0.17533074780009106 -Cr2Ag2As4Se12_13_4294.vasp,Cr2Ag2As4Se12,-2.046390335,0.7956318667499951 -Ir2S2Br2_11_8812.vasp,Ir2S2Br2,-2.4278217916666667,0.1045786616666664 -Na1Fe1Te6As2_5_11855.vasp,NaFeTe6As2,-1.578716269,0.25637711783333184 -In3Se1S1Br5_1_8657.vasp,In3SeSBr5,-1.293708267,0.12589192524999931 -Pb1F2_156_14183.vasp,PbF2,-2.4572891166666664,0.22836629666666663 -Hf2Se2_11_7610.vasp,Hf2Se2,-4.870554875,-0.30334006 -Y2C1F2_164_20709.vasp,Y2CF2,-5.655085562,0.1269190620000007 -Zn1Cl2_187_20916.vasp,ZnCl2,-0.34573754,0.25442708145833326 -Y1B3H15N1_8_20606.vasp,YB3H15N,-4.2228268525,0.497347711055552 -Au2S2I1Cl1_1_1513.vasp,Au2S2ICl,-0.4242254283333333,0.2639952028055551 -Sc2S6_129_16141.vasp,Sc2S6,-3.65971087875,0.18851808382812507 -Li1Ni1As2Se6_5_9759.vasp,LiNiAs2Se6,-2.036362447,0.27899147941666436 -Cd2S2_164_3549.vasp,Cd2S2,-0.53385736,0.20755635125000005 -Cu2Bi2S4_26_5042.vasp,Cu2Bi2S4,-1.6862704975,0.20249541999999998 -Ag2S1_191_374.vasp,Ag2S,0.023304596666666667,0.4416482833333334 -Na1Co1Sb2Se6_149_11847.vasp,NaCoSb2Se6,-1.9954388560000003,0.35333309883333086 -Ni2I6_189_13528.vasp,Ni2I6,0.65561922,0.23831830546874994 -Nb2O4F2_1_12796.vasp,Nb2O4F2,-5.9082076825,-0.11268656260417664 -In1Au1S2Cl2_10_8199.vasp,InAuS2Cl2,-1.4644365199999998,0.06338068715277656 -Mn1Si1Ge1Se1Br3_1_10881.vasp,MnSiGeSeBr3,-1.9289921328571429,0.2626818239285658 -Tc2O4_59_18234.vasp,Tc2O4,-6.044993713333334,0.44210093500000003 -Nb2Co2Se6_11_12692.vasp,Nb2Co2Se6,-3.2708960439999997,0.2056779997999983 -Cu1B6H4S2N6_6_4845.vasp,CuB6H4S2N6,-4.883204798947368,1.1491184549999982 -Co2Se4Cl2_2_4025.vasp,Co2Se4Cl2,-1.76883469,0.3242760037499979 -Hf1Zr1Te2S1I2_1_7403.vasp,HfZrTe2SI2,-2.915182392857143,0.2740131953571393 -Sb1As2Au1Se6_143_15434.vasp,SbAs2AuSe6,-1.8839272390000001,0.2598637096666643 -As2H6Pb2C2S6_7_1217.vasp,As2H6Pb2C2S6,-3.47524236,0.22362762238810416 -Mn1Ga1Ge2Br2_25_10720.vasp,MnGaGe2Br2,-1.8182815533333334,0.11806720597221976 -Hf4H3Cl1O7_1_7788.vasp,Hf4H3ClO7,-6.0189589193333335,0.7330305654583293 -Ta3Br7O1_156_17946.vasp,Ta3Br7O,-3.3179761927272726,0.18138792075757593 -As4H4Pb16Cl16O16_14_1328.vasp,As4H4Pb16Cl16O16,-2.9560808926785715,0.05533565946428576 -Co1As2_164_3696.vasp,CoAs2,-2.487464603333333,0.7517107200000002 -Mn1B6Pb2C6_8_10645.vasp,MnB6Pb2C6,-5.118883582,1.0203701818888777 -Ca2Co1O3_38_2985.vasp,Ca2CoO3,-3.939667685,0.06437755638888637 -Fe3Se4_12_6066.vasp,Fe3Se4,-1.7816144842857145,-0.0045933950000019985 -Rb2Hg4Te2S6Cl6_31_14889.vasp,Rb2Hg4Te2S6Cl6,-0.752338929,0.22214105063541506 -In2Te4_12_8635.vasp,In2Te4,-1.2052561116666667,0.18548420666666388 -Re4Bi4O20_14_15100.vasp,Re4Bi4O20,-4.949730868571429,0.15454243119047195 -Hf2As2Se6_12_7431.vasp,Hf2As2Se6,-3.6554967609999998,0.2639481726666646 -Ga2Sn2S2_164_6494.vasp,Ga2Sn2S2,-2.0573784416666667,-1.022701940000001 -Tl2Ag1Te2_115_19360.vasp,Tl2AgTe2,-0.39569107200000003,-0.06166423900000001 -Ca2Sn2_51_3127.vasp,Ca2Sn2,-0.7880287475,0.33841152250000006 -Al18Te9_143_592.vasp,Al18Te9,-1.7320444774074075,0.613117269259257 -Ti1Cl1F1_156_18756.vasp,TiClF,-4.152723563333333,-0.1565204501388936 -Re2Br4_11_15033.vasp,Re2Br4,-2.2316768650000003,0.6264352924074043 -Ta2Cr2Se10_11_17715.vasp,Ta2Cr2Se10,-3.4121705228571426,0.08764257821428334 -Tl2C1S3_5_19387.vasp,Tl2CS3,-2.6401799883333332,0.2127375006249942 -K2Au2S2_51_8977.vasp,K2Au2S2,-0.6917411283333333,0.20815278916666669 -V1Te1W3Se3S1Br1Cl2_1_19937.vasp,VTeW3Se3SBrCl2,-3.1503796391666667,0.0893275652083263 -Nd2Sb2S4O2_129_13244.vasp,Nd2Sb2S4O2,-4.346199013,-0.018508257333337053 -P6Pt3_8_14144.vasp,P6Pt3,-3.1542594144444447,1.1244269738888883 -Hf1Zn1I2O2_1_7371.vasp,HfZnI2O2,-3.44595502,0.28945301020833347 -Cd2Cl8_53_3488.vasp,Cd2Cl8,0.087941909,0.411888594 -Al2Si2O11_8_982.vasp,Al2Si2O11,-5.023312858,0.46015080633332905 -Hf4Cl6O2_8_7780.vasp,Hf4Cl6O2,-4.407566113333334,0.2956928218749959 -Tl1Pt5F2_38_19326.vasp,TlPt5F2,-1.05190479625,1.7256411124999997 -Rh1O2_115_15162.vasp,RhO2,-3.16634146,0.9642983983333329 -Mn2Te4As2Br2_26_11311.vasp,Mn2Te4As2Br2,-1.63861504,0.24684426774999646 -Pb1O2_164_14194.vasp,PbO2,-3.28694078,0.1695882816666665 -Fe1H8C10N2F3_16_5709.vasp,FeH8C10N2F3,-5.416014494166667,0.29454803479166003 -Pr2Br6_59_14545.vasp,Pr2Br6,-2.44358672125,0.07501446124999989 -Mn1O2_164_10832.vasp,MnO2,-4.25970151,0.20510821833333281 -H2Pd2O4_6_7014.vasp,H2Pd2O4,-3.2156516825,0.28082617385416686 -Pb2Br2Cl2_129_14215.vasp,Pb2Br2Cl2,-1.1483052233333333,0.09163297250000013 -In1Si1Te3_143_8352.vasp,InSiTe3,-1.485960728,0.5275417310000001 -Cu2Se4Cl2_4_5308.vasp,Cu2Se4Cl2,-1.1164503075,0.1004592018749999 -Ag2Sb2O4_26_398.vasp,Ag2Sb2O4,-2.73759553625,0.3951188978125 -Li2I1_164_9963.vasp,Li2I,-1.2671115933333332,0.4579089205555542 -Hg1Te1_156_7918.vasp,HgTe,0.806373915,0.33040689333333334 -Al3Fe2_123_1047.vasp,Al3Fe2,-1.882773302,0.506500885999998 -Zn1Pd3Se6S1Cl1_8_20996.vasp,ZnPd3Se6SCl,-1.3868322616666668,0.28282441844791445 -As1Pb2O6_162_1159.vasp,AsPb2O6,-3.605868741111111,0.32614499291666293 -Mn4Te8_2_11456.vasp,Mn4Te8,-1.641604515,0.1341912049999998 -Nb1Te2_191_12603.vasp,NbTe2,-2.37465154,1.014268821111111 -Lu2Cu2Pb2Se6_26_10308.vasp,Lu2Cu2Pb2Se6,-2.2588896541666665,0.18988571791666686 -Pt2Cl4_14_14615.vasp,Pt2Cl4,-1.03797063,0.0800694316666668 -Hf1Ti3Te8_3_7344.vasp,HfTi3Te8,-3.4162174183333334,0.24350298458333342 -In1Cl2_187_8218.vasp,InCl2,-1.07013927,0.3438505983333333 -Cu1Mo1Br2_25_4917.vasp,CuMoBr2,-0.622619945,1.1717198131250002 -Ti2Te10_59_19033.vasp,Ti2Te10,-2.37953516,-0.08352353500000032 -Co1Rh1Se2I2_6_3815.vasp,CoRhSe2I2,-1.5098035833333334,0.10234613444443794 -Pb2I2N2_59_14249.vasp,Pb2I2N2,-1.9555822833333334,0.47061849388888644 -Ag2H8C6N2Cl2_2_293.vasp,Ag2H8C6N2Cl2,-4.4967805595,0.24016334350000035 -H4Pd1C6N2F2_25_7077.vasp,H4PdC6N2F2,-5.193487834666667,0.4853567687222088 -Y2Mg4_51_20755.vasp,Y2Mg4,-1.09192014,0.27109381333333205 -Au3Se2Cl2_1_1565.vasp,Au3Se2Cl2,-0.13020346,0.2905525904285707 -Rh2Se2_187_15242.vasp,Rh2Se2,-2.1440980125,0.30820591170454303 -Ta2Ti1Cr1Se1S1Br2_1_17930.vasp,Ta2TiCrSeSBr2,-3.9923772725,0.29287217672452326 -V1Te1Se1_156_19936.vasp,VTeSe,-2.64993449,0.14851569166666412 -V1Mo1O6_1_19880.vasp,VMoO6,-4.9952234725,0.1665890738281246 -Bi4Se4_14_2645.vasp,Bi4Se4,-1.593050455,0.2416873024999989 -Li2V2Ag4S12_4_10109.vasp,Li2V2Ag4S12,-2.04799239,0.37755588110416194 -Hf2Si2S8_31_7614.vasp,Hf2Si2S8,-4.3381143725,0.3105180150000002 -Ba4Te8P4F4_14_2196.vasp,Ba4Te8P4F4,-2.6886092845,0.2345390470416669 -In2Te1Se2I2_1_8613.vasp,In2TeSe2I2,-1.0984836257142858,0.2596545689880938 -As2Ir2Se6_162_1227.vasp,As2Ir2Se6,-2.7243074920000003,0.40504343483333116 -Cr1Br2_164_4132.vasp,CrBr2,-1.6956642733333334,-0.2188871244444458 -Zr2S4_31_21657.vasp,Zr2S4,-4.513644491666667,0.28522607583333315 -B1Te2W2_164_1641.vasp,BTe2W2,-4.255190048,0.1691629280000002 -Tl2F6_191_19409.vasp,Tl2F6,-1.50263911,-0.029012149374999963 -Sr1Pb2_164_17075.vasp,SrPb2,-0.22135017666666668,0.28841345083333286 -Nb4Zn4Co2O16_13_13181.vasp,Nb4Zn4Co2O16,-4.830443778461539,0.14271375269230435 -Cr3N2_187_4566.vasp,Cr3N2,-4.504762938,0.5326344326666623 -V3Te8Mo1_25_20293.vasp,V3Te8Mo,-2.2273984525,0.07575590333333304 -Nb1Sn1Br2O2_1_12585.vasp,NbSnBr2O2,-3.64838103,0.4278698656250004 -Li2S2F2_1_10052.vasp,Li2S2F2,-2.7270354266666668,0.2532206164583305 -Te1Au1Cl7_1_18285.vasp,TeAuCl7,-0.5500093033333333,0.09057789666666671 -Al2H14C4_10_857.vasp,Al2H14C4,-3.922158862,0.4801774134999972 -Ta3S1Cl7_156_17982.vasp,Ta3SCl7,-3.6559103463636364,-0.03066435181818572 -Ca4Sb2_59_3237.vasp,Ca4Sb2,-0.8448539616666667,0.5577052350000001 -Te6P2Rh2_162_18670.vasp,Te6P2Rh2,-2.166792651,0.36011101735184636 -Ag2Se1O4_21_423.vasp,Ag2SeO4,-2.2136360228571426,0.21117575357142915 -Sb2Te4_14_15731.vasp,Sb2Te4,-1.5389530266666667,0.26159932777777617 -Ta4V2S12_14_18137.vasp,Ta4V2S12,-4.808500355,0.056974314999995945 -Na2Zn1Cl4O3_8_12337.vasp,Na2ZnCl4O3,-1.864322214,0.17921618537500028 -Ni3Sb6_147_13719.vasp,Ni3Sb6,-1.2234510388888888,-0.6849888305555555 -H4Au2_53_7057.vasp,H4Au2,-1.5261251949999999,2.19015885833333 -In2S4_2_8559.vasp,In2S4,-2.0958856883333334,0.44429543072916383 -Mg2Mn8O18_85_10480.vasp,Mg2Mn8O18,-4.240422060357143,0.24522138124999548 -Be2Te7Cl6_10_2271.vasp,Be2Te7Cl6,-1.6461121886666668,0.15041445966666656 -In1Ni5F2_123_8292.vasp,InNi5F2,0.021270775,1.6740875016145824 -Si4Sb4Te4_17_16512.vasp,Si4Sb4Te4,-2.482228671666667,-0.2060572725000024 -Os1S1I2_47_13818.vasp,OsSI2,-1.71489897,0.4423155993750001 -W2F8_1_20496.vasp,W2F8,-3.414581808,0.2506656229999948 -Rb2Hg4Se2S6Br6_31_14880.vasp,Rb2Hg4Se2S6Br6,-0.684910888,0.19347832931249975 -Al2Se5_1_977.vasp,Al2Se5,-2.6336296485714286,0.13481335952380769 -P1Br5_10_13914.vasp,PBr5,-0.5148121766666667,0.39669225458333257 -Pt1Se2_164_14594.vasp,PtSe2,-2.1569459566666667,0.09329928833333323 -Bi2N2Cl2_59_2478.vasp,Bi2N2Cl2,-2.5485379150000003,0.028813384722219837 -V2N1Cl2_164_20109.vasp,V2NCl2,-3.9870301699999997,0.009289714222217249 -Rb1Ti1O2_156_14759.vasp,RbTiO2,-4.8627981475,0.5385174716874999 -Al1Cd1In1Te4_156_626.vasp,AlCdInTe4,-1.1563086171428572,0.13470506571428564 -W2N2F2_59_20513.vasp,W2N2F2,-5.465363133333334,-0.16222787458334387 -Li4H20C8S4_14_10194.vasp,Li4H20C8S4,-4.236114190833333,0.20922827190971546 -Cr2Cu2As4O12_4_4363.vasp,Cr2Cu2As4O12,-3.745814478,0.5570763637916629 -In1Cl2_115_8216.vasp,InCl2,-1.0756231233333333,0.3383667450000001 -Ag2C4N2Cl2F4_2_228.vasp,Ag2C4N2Cl2F4,-3.7294695014285715,0.21580794821427945 -K2Mn1P2S7Cl3_1_9236.vasp,K2MnP2S7Cl3,-2.4384249913333336,0.12159522954165822 -Pt2Se4_14_14686.vasp,Pt2Se4,-2.000635935,0.24960930999999986 -Ag2As4Se3I2_6_172.vasp,Ag2As4Se3I2,-1.4758317881818181,0.1662228459090873 -Mn2Br2N2_59_11029.vasp,Mn2Br2N2,-3.2316322566666664,0.16973976083332842 -Te2As2_2_18358.vasp,Te2As2,-1.9556570025,0.3407699333333307 -Si2Ni1Se4_12_16415.vasp,Si2NiSe4,-2.317549852857143,0.3071779309693847 -Al4P20_26_1081.vasp,Al4P20,-3.641248045416667,0.03428327624999694 -Ag2Sb2Se4_26_403.vasp,Ag2Sb2Se4,-1.3460515225,0.21965408124999986 -Dy2V2O8_51_5538.vasp,Dy2V2O8,-5.8254448891666675,0.352967033333333 -Rb2Cd4Te2I6O6_31_14825.vasp,Rb2Cd4Te2I6O6,-1.2662426365,0.20303228770833118 -Cr1B4H5S6_2_4121.vasp,CrB4H5S6,-3.730087704375,0.8292320753124999 -In1Se1_123_8342.vasp,InSe,-1.47309868,0.4303166825 -Li2V4S10_31_10135.vasp,Li2V4S10,-3.29732937875,0.3441369435937498 -Na1Mn1Zn1S2Br1_1_11898.vasp,NaMnZnS2Br,-1.6012875566666667,0.1276307639999984 -Ag2Cl2O4_11_242.vasp,Ag2Cl2O4,-1.4979271675,0.2453141943749999 -Ba2Si4_12_2060.vasp,Ba2Si4,-2.7221617316666666,0.48170171208333334 -Ag2Te4_14_484.vasp,Ag2Te4,-0.31324710166666664,0.4491031125 -Fe2I2_129_5864.vasp,Fe2I2,0.546432,1.092670433125 -Ag1N2_10_89.vasp,AgN2,-3.71143292,-0.26339012666666983 -Fe2W2Br2O8_129_6028.vasp,Fe2W2Br2O8,-4.298740137857143,0.10905116744047305 -Cu2Se2Br2_59_5297.vasp,Cu2Se2Br2,-0.5162735916666666,0.2593060406746026 -Hf2Tl4S6_11_7658.vasp,Hf2Tl4S6,-3.326342800833333,0.08687291416666687 -Ca4Mg4Si8O24_14_3220.vasp,Ca4Mg4Si8O24,-5.69167717775,0.16904196775000013 -Cu2Cl2O4_17_5079.vasp,Cu2Cl2O4,-1.76584807125,0.23080560375000014 -Sc1Br2_164_15913.vasp,ScBr2,-2.2400176533333336,0.14769566499999742 -Co2S2_123_3982.vasp,Co2S2,-1.914800225,0.8256850785416643 -Co1H4C6Cl2_47_3759.vasp,CoH4C6Cl2,-4.841205188461538,0.27050120730768423 -Ga1Br1_99_6142.vasp,GaBr,-0.84012237,0.52429408 -Hg1Pb2S2I2_12_7902.vasp,HgPb2S2I2,-0.9329789471428571,-0.3729488173809533 -Si2P2_164_16426.vasp,Si2P2,-4.28733574,0.10920591916666655 -Sr2H8Cl4O4_13_17241.vasp,Sr2H8Cl4O4,-3.643913107222222,0.0267954574074043 -Pd1I2_115_14364.vasp,PdI2,0.1448226,0.43603156749999994 -Mn2Te6_11_11328.vasp,Mn2Te6,-1.47467776625,0.2501154629166667 -Co1Se2_164_3823.vasp,CoSe2,-2.16592206,0.3157984355555552 -Au1F2_164_1423.vasp,AuF2,-0.21167464,0.5877641107407399 -K2Te2N4_31_9375.vasp,K2Te2N4,-3.75689427,-0.4186210033333331 -V2F4_11_20059.vasp,V2F4,-3.3230304516666664,-0.04815746722222514 -Fe8Se10_1_6102.vasp,Fe8Se10,-1.5156634944444445,0.17388464999999842 -P6C6_2_14134.vasp,P6C6,-5.790530765833334,0.29062993166666606 -Nb2B1S2F2_164_12634.vasp,Nb2BS2F2,-4.2806355457142855,0.45468152653845717 -V3Cu2Se3Br5Cl1_1_20258.vasp,V3Cu2Se3Br5Cl,-1.7070463500000002,0.10549753276785538 -Pd2Cl6_162_14418.vasp,Pd2Cl6,-0.57665606875,0.1354158279166659 -Ta2Co4Se4_51_17709.vasp,Ta2Co4Se4,-3.4342511,0.05275602100000043 -Sr2Cu1Cl2O2_123_17197.vasp,Sr2CuCl2O2,-2.919420302857143,0.1084234809523753 -Zn1Ga1Te2_156_20935.vasp,ZnGaTe2,-0.71892059,0.30901994791666676 -Ga1Sb2Au1O6_5_6265.vasp,GaSb2AuO6,-3.537089381,0.6310563116249945 -Fe2Te4_12_6020.vasp,Fe2Te4,-1.0714802216666668,0.5567716933333331 -Y3C2_187_20793.vasp,Y3C2,-5.872355724,0.2258571800000002 -Mn2Se3I2_1_11287.vasp,Mn2Se3I2,-1.4132084299999998,0.16879530848214186 -Au2Se2Br2_59_1541.vasp,Au2Se2Br2,-0.2600036466666667,0.20240646458333333 -Fe2I2O2_59_5863.vasp,Fe2I2O2,-2.178450246666667,0.054543416527775404 -Fe2H2Se4_11_5857.vasp,Fe2H2Se4,-2.19459524375,0.7382387587500001 -Mn2Te2W2O12_113_11304.vasp,Mn2Te2W2O12,-4.611641960555556,0.2139443004166619 -Hg2S1I2_6_7992.vasp,Hg2SI2,0.473785708,0.07137906633333332 -K1Mg1H9C2O10_2_8914.vasp,KMgH9C2O10,-4.711775747826087,0.04353419188405416 -Sc1H2O2_164_15940.vasp,ScH2O2,-4.798588706,0.7612541024583281 -Cd2Te2Au2Br2_26_3584.vasp,Cd2Te2Au2Br2,0.25963918,0.0742410812325 -B4Sb20_26_1765.vasp,B4Sb20,-2.211842330416667,0.7179611130555505 -Cu2O4_59_5204.vasp,Cu2O4,-1.9947038883333335,0.772876375833331 -Mo2As2S10_85_11561.vasp,Mo2As2S10,-2.825961577142857,0.6060270479017829 -Mn1Sb2H12_2_10870.vasp,MnSb2H12,-2.8220464613333336,1.3944362591666628 -Zn1Ni1H12C14N8_10_20978.vasp,ZnNiH12C14N8,-5.605019682222222,-1.802017476388896 -F4_55_5612.vasp,F4,0.196045465,-0.03304281125 -Ba2Cd1In1Cu1O5_99_1942.vasp,Ba2CdInCuO5,-2.8250869720000003,0.614623865249996 -Nb2Ni4Te6_11_12790.vasp,Nb2Ni4Te6,-1.7693119991666666,0.09215574333333354 -Au2Se1S4_21_1539.vasp,Au2SeS4,-1.1055998342857143,0.4986104640178546 -Ga1Br2_187_6145.vasp,GaBr2,-0.9367249033333334,0.36999522583333344 -V1Cl5_10_19802.vasp,VCl5,-1.3961266433333333,0.2499324674999983 -Mn2I2_12_11113.vasp,Mn2I2,-0.602318345,0.45797641943965517 -Cu1Sn1F6_12_4981.vasp,CuSnF6,-1.9931886175,0.008127957500000171 -Co2Bi2Te4I2_10_3868.vasp,Co2Bi2Te4I2,-1.052439715,0.3036536103333335 -Sc2S2N1F2_164_16135.vasp,Sc2S2NF2,-3.759042877142857,0.7397653205952297 -Nb4Te10Pt6_59_13163.vasp,Nb4Te10Pt6,-2.7787901185,0.11259611347222076 -Tl1Cd1In1Te4_156_19239.vasp,TlCdInTe4,-0.6585612628571429,0.18268840380952242 -Sn2Cl2_164_16761.vasp,Sn2Cl2,-1.1802879675,-0.64814887 -As2O3_6_1232.vasp,As2O3,-4.114163378,0.3710741940000002 -Sc1Te2_164_16016.vasp,ScTe2,-2.5343025266666666,0.2940593486111094 -Rb2I2O6_11_14894.vasp,Rb2I2O6,-2.553458896,0.46350989600000014 -Zn1Fe1Cu1S5_1_20927.vasp,ZnFeCuS5,-1.4508984325,0.24090033708854153 -Nb2F6_189_12713.vasp,Nb2F6,-4.02407868,0.3621057049999967 -Ta2I4O2_10_17763.vasp,Ta2I4O2,-3.8493103,-0.044663286250000045 -Tm1Be5_1_19659.vasp,TmBe5,-2.482729515,0.7196478278205102 -Tl1Sb1_187_19337.vasp,TlSb,-0.348114425,0.907356644375 -Ba1Mo4O8_162_1844.vasp,BaMo4O8,-4.502100041538461,0.68314124999999 -Ca1H2O2_156_2843.vasp,CaH2O2,-4.256744542,0.26371315200000023 -Ag2S2N2F2_31_382.vasp,Ag2S2N2F2,-2.23146945625,0.12750107050781245 -Hf2F8_1_7493.vasp,Hf2F8,-4.7645179859999995,0.16311974500000037 -W1Se1Br1O1_25_20452.vasp,WSeBrO,-3.7789940225,-0.06315570937499992 -Cu2H2O4_31_5112.vasp,Cu2H2O4,-2.995839935,0.27502899307291706 -Si2Te2F2_59_16456.vasp,Si2Te2F2,-2.5737304716666665,0.46515396041666346 -Co3S4_164_4067.vasp,Co3S4,-2.769340855714286,0.09041665214285732 -Zr1Nb1Te1S1_8_21363.vasp,ZrNbTeS,-4.08771354,0.06321808791666284 -Nb1Cl4_123_12490.vasp,NbCl4,-2.427758896,0.2861345445000003 -Ni1H4C8I2_25_13354.vasp,NiH4C8I2,-4.775660248666667,0.42806819599999374 -Cr1O2_187_4223.vasp,CrO2,-4.950122893333334,-0.13212703895833755 -Ba2Mn2Sn2_129_2026.vasp,Ba2Mn2Sn2,-1.0269149366666668,0.5519281342528721 -Zr1Ta3Se8_164_21458.vasp,ZrTa3Se8,-4.3972044025,0.1466431639583332 -K2Cd4O8F6_31_9045.vasp,K2Cd4O8F6,-1.7120317035,0.4600233675416655 -Be1Pb2_164_2230.vasp,BePb2,-1.0774923633333333,0.558350978333332 -Al3Os2_123_1049.vasp,Al3Os2,-3.913201462,0.28982320099999626 -Hg2Te2H4S8_31_8031.vasp,Hg2Te2H4S8,-1.9391489175,0.13551735903645823 -C3N4_1_2761.vasp,C3N4,-6.193307494285714,0.6462531932142812 -Mn3H2S2N2_187_11388.vasp,Mn3H2S2N2,-3.633896335555556,-0.8062529707870438 -Nb2Pt2S10_51_12824.vasp,Nb2Pt2S10,-3.575181595,0.10291954705356465 -Hf1Sb2_187_7291.vasp,HfSb2,-3.55293919,-0.8289369295833335 -Mo2F10_51_11604.vasp,Mo2F10,-2.578839534166667,0.22694487319444479 -Ca6Zn2_59_3259.vasp,Ca6Zn2,1.00374595375,0.57501714125 -V2F5_1_20060.vasp,V2F5,-3.334426937142857,-0.17485719380952758 -Ir4S6I1Br1_1_8862.vasp,Ir4S6IBr,-2.6593115175,0.10607189513888532 -Hg1O1_187_7885.vasp,HgO,-0.3642892,0.4065561683333333 -Hg2I2_2_7974.vasp,Hg2I2,1.2738969325,0.062032145000000094 -K2Mn1As2S7F3_1_9233.vasp,K2MnAs2S7F3,-2.505237010666667,0.3524431141666613 -Cu2H4Se4O12_14_5133.vasp,Cu2H4Se4O12,-3.420912829090909,0.1043236218939354 -Os1S1F2_47_13817.vasp,OsSF2,-2.7867745175,0.4233772013124999 -Ga2N2_129_6396.vasp,Ga2N2,-3.990795155,1.010225375 -Rb2Cd4S2Cl6O6_31_14808.vasp,Rb2Cd4S2Cl6O6,-1.9833233580000003,0.13128416893749922 -Hg8P4O14_13_8110.vasp,Hg8P4O14,-2.9300567619230766,0.09768789192307725 -Ag8Bi8S12Cl8_2_583.vasp,Ag8Bi8S12Cl8,-1.4727278255555556,0.03403348611110979 -Mn2W2I2O8_129_11338.vasp,Mn2W2I2O8,-4.419048810714286,0.16513472241071359 -Ca2H12Pb4_2_3029.vasp,Ca2H12Pb4,-2.302105012777778,1.0425465199999968 -P2Pd2S5_8_14022.vasp,P2Pd2S5,-2.7044859255555553,0.2348819399691328 -In1Te6P2Au1_149_8369.vasp,InTe6P2Au,-1.4826980459999999,0.3048184925833295 -Ni3H1O2F4_1_13702.vasp,Ni3HO2F4,-2.094525057,-0.15263794339583503 -Li2Fe4F10_51_9917.vasp,Li2Fe4F10,-2.643293349375,0.16437569187499482 -V4Ag2O11_12_20299.vasp,V4Ag2O11,-4.657431732941176,0.13700989985293832 -Cu1Te2_12_4995.vasp,CuTe2,-0.5249956633333334,0.37725327888888804 -Ta3Br1Cl1O3_1_17945.vasp,Ta3BrClO3,-5.6414355775,0.4584011090178455 -Pb4I10_127_14311.vasp,Pb4I10,-0.3363386357142857,0.22677045407738128 -La1Sn3_187_9574.vasp,LaSn3,-1.2469737625,0.47447703750000003 -U2P4Pb4O20_2_19718.vasp,U2P4Pb4O20,-5.63858526,0.1627861166666662 -Zr2Cl2O2_59_21548.vasp,Zr2Cl2O2,-4.964319994999999,0.21677894666666742 -Tl1O1_38_19309.vasp,TlO,-1.84435171,0.5635734797916643 -Ca2Au2_191_2942.vasp,Ca2Au2,0.306123315,0.5171624125000001 -Os6Se8_11_13897.vasp,Os6Se8,-3.3182522885714287,0.5612013499999948 -Ru2Br6_162_15302.vasp,Ru2Br6,-1.1709156375,0.2424724387499999 -Fe2Bi1Se2_187_5804.vasp,Fe2BiSe2,-1.3340365520000002,0.6483193594999986 -As4S10_31_1357.vasp,As4S10,-2.6565505714285713,0.6053414630357119 -Tl4Bi4_1_19593.vasp,Tl4Bi4,-0.4787996425,0.04351621124999999 -Ti2Te6_59_19049.vasp,Ti2Te6,-2.95340322125,0.009706220416664468 -Se8I8_2_16307.vasp,Se8I8,-0.686808766875,0.24405015423611032 -Nb2Ni1S6_12_12774.vasp,Nb2NiS6,-3.904260801111111,-0.3536149683333367 -Al1Si1Te3_143_742.vasp,AlSiTe3,-1.758006114,0.6228413640000001 -Cr1I5_1_4203.vasp,CrI5,-0.11821674333333333,0.1911011656249997 -P6Pt3_2_14143.vasp,P6Pt3,-3.189177527777778,1.0895088605555552 -B4Sb4O12_14_1766.vasp,B4Sb4O12,-5.498911186,0.08527116916666166 -Ta1Nb1Ag1Cl2O3_1_17568.vasp,TaNbAgCl2O3,-4.51624831375,0.31074227049999137 -Al1Si1S2Br2_6_740.vasp,AlSiS2Br2,-2.67106742,0.15845976166666437 -Sb1Br5_2_15443.vasp,SbBr5,-0.4653839633333334,0.2650200874999994 -As6S12F2_4_1393.vasp,As6S12F2,-2.5806765805,0.6679352649583302 -Co2Bi2S4I2_10_3864.vasp,Co2Bi2S4I2,-1.756538678,0.30391881741666416 -Eu3S3_123_5608.vasp,Eu3S3,-4.329480178333333,-0.10627357833333306 -Tl2Ga2Te6_31_19426.vasp,Tl2Ga2Te6,-1.1724289369999998,0.5078958263333321 -W2Br2_164_20462.vasp,W2Br2,-3.1008059125,0.5924515670833332 -Hg2Au2S2Br2_26_7926.vasp,Hg2Au2S2Br2,0.13400786625,0.14132491843750003 -Cu2H8C6N14_2_5146.vasp,Cu2H8C6N14,-5.423255504333333,-1.604005060333339 -In4As4Cl4O10_2_8662.vasp,In4As4Cl4O10,-3.6034321881818183,0.04818221772727238 -Mg2W2Se2O12_18_10537.vasp,Mg2W2Se2O12,-4.873435071111111,0.10110575999999494 -Fe2Sb2S6_162_5957.vasp,Fe2Sb2S6,-2.437010324,-0.09598188010000452 -V2H4O6_13_20082.vasp,V2H4O6,-4.905127860833333,0.08694728263888951 -Ta2Te1Se3_8_17898.vasp,Ta2TeSe3,-4.08995979,0.368320408472222 -Mo3C2Cl2_187_11702.vasp,Mo3C2Cl2,-4.02455972,0.284839060476187 -Ga1Pd5F2_38_6242.vasp,GaPd5F2,-1.13972045875,0.46962383206537206 -Pr1Re2O8_147_14534.vasp,PrRe2O8,-5.8984014090909085,-0.2695765746212211 -Sc1Si4_191_16002.vasp,ScSi4,-3.6977471360000003,-0.2111261820000001 -Cu1Ag1S2_25_4825.vasp,CuAgS2,-0.81331044,0.3690278632552084 -Mg2Te2Mo2O12_18_10521.vasp,Mg2Te2Mo2O12,-4.585540076666667,0.044158267268519236 -Cu1Hg3_191_4906.vasp,CuHg3,2.502887455,1.0588941103448277 -Hf2Mo1Se2I3_1_7532.vasp,Hf2MoSe2I3,-2.7004377675,0.7210344035937503 -C2Br8_1_2742.vasp,C2Br8,-1.036081708,0.5820113020000002 -Cd2S2Cl2_59_3544.vasp,Cd2S2Cl2,-0.5159912583333334,0.36965795531249807 -Fe1S2_187_5747.vasp,FeS2,-2.1461872200000003,-0.21006130500000042 -Sr8B4I4N8_11_17493.vasp,Sr8B4I4N8,-4.248807980833333,0.20160300750000015 -Gd2Cl2_164_6607.vasp,Gd2Cl2,-2.55937137,0.17614811166666416 -Te6Pd2_11_18679.vasp,Te6Pd2,-1.20431394875,0.30541589291666665 -Nb3N2_187_12989.vasp,Nb3N2,-6.932809752,0.6220395886666599 -Pd1S2F2_164_14384.vasp,PdS2F2,-1.786655064,0.351537623124998 -Ba2Al4Cl16_13_1898.vasp,Ba2Al4Cl16,-2.3679705440909093,0.04097262227272713 -Hf1Zr1Mo2O8_1_7384.vasp,HfZrMo2O8,-6.073741238333334,0.3248320779166667 -Mn2Ni1C12_164_11168.vasp,Mn2NiC12,-5.2358676399999995,1.5058250119999965 -Sc1As2Au1O6_149_15897.vasp,ScAs2AuO6,-4.012965809,0.7210326931249968 -Cs4Au4O4_123_4804.vasp,Cs4Au4O4,-0.93102717,0.3782099333333332 -Ta2H2N1O2_164_17746.vasp,Ta2H2NO2,-6.0692334542857145,0.8324618514761721 -Zr4S2N3F2_164_21839.vasp,Zr4S2N3F2,-5.39765062,0.7145342369318065 -Al1Ni5F2_123_698.vasp,AlNi5F2,-0.38153203875,1.7533490208333316 -Al2Co2O5_164_803.vasp,Al2Co2O5,-4.771076731111111,-0.050371710000004954 -Nb1Sb1P1_156_12565.vasp,NbSbP,-4.247114416666666,0.6104266091666634 -Ag1Bi1Sb2S6_143_25.vasp,AgBiSb2S6,-2.072735337,0.2962406774374954 -W2Se1S3_6_20541.vasp,W2SeS3,-4.282105893333333,0.0038253316666669868 -Ag2H2_2_269.vasp,Ag2H2,-0.9387427075,1.1124507275000002 -Cu2Hg2Se2I2_26_5161.vasp,Cu2Hg2Se2I2,0.20556417875,0.03552167130208331 -P1Pd1O3_6_13933.vasp,PPdO3,-3.882559196,0.7452349885000006 -Ga1F2_164_6185.vasp,GaF2,-2.4082179033333335,0.3530593433333308 -Ge2B2P2H6O6_7_6747.vasp,Ge2B2P2H6O6,-4.534424172222222,0.23285564083332871 -As8Se8S4_2_1407.vasp,As8Se8S4,-2.538533155,0.37198183116666406 -La2Mg2I10_51_9599.vasp,La2Mg2I10,-1.3673645178571427,0.08581799499999909 -Mn2Sb2Se4Br2_26_11245.vasp,Mn2Sb2Se4Br2,-1.8995405130000003,0.1128778697499977 -V2P2O10_129_20134.vasp,V2P2O10,-5.600903585714286,0.08678342500000014 -Zr1Mn1Nb1Se2Br4O1_1_21324.vasp,ZrMnNbSe2Br4O,-2.952558471,0.3428641407499962 -Mo2I10_13_11619.vasp,Mo2I10,-0.27459715333333334,0.21461021006944403 -Nb1Sn1Se2Br2_1_12590.vasp,NbSnSe2Br2,-2.495478335,0.21595196125000005 -Mg2Sb1_164_10501.vasp,Mg2Sb,-0.5607922200000001,0.4898625750694443 -Pb2F6_1_14245.vasp,Pb2F6,-2.12162875,0.17724828312499996 -Cr1O3_187_4225.vasp,CrO3,-3.942848675,0.5099391648437499 -Zn2Sn8O12_51_21174.vasp,Zn2Sn8O12,-3.2483559436363634,0.38515123295453924 -Al2Ga1Cu1S4I3Br1_1_840.vasp,Al2GaCuS4I3Br,-1.8566230350000001,0.18109938223958136 -Na2Mg1H4S10_2_12188.vasp,Na2MgH4S10,-2.682097962352941,0.02647595727940988 -Mn1Si1Se1Cl1_156_10884.vasp,MnSiSeCl,-2.3496880425,0.43220831509765323 -Pr2S2I2_164_14549.vasp,Pr2S2I2,-3.3921386916666667,0.04413760333333361 -Si12Pt4_127_16313.vasp,Si12Pt4,-3.448807278125,-0.12759625812499986 -P1Pb2O6_162_13930.vasp,PPb2O6,-3.9242559444444445,0.4455144790277781 -B1F1_99_1623.vasp,BF,-3.43618997,1.096201596111107 -Rb2Cd4S8F6_31_14814.vasp,Rb2Cd4S8F6,-1.3955819645,0.4232169745624995 -Tc8I28_1_18264.vasp,Tc8I28,-1.4782215116666668,0.10421115055555408 -In1Sb2Au1Se6_149_8337.vasp,InSb2AuSe6,-1.624845487,0.32779694133333115 -Ni2P2S5_8_13564.vasp,Ni2P2S5,-2.4553286088888893,0.16374574879629317 -Yb2Bi2S4O2_129_20860.vasp,Yb2Bi2S4O2,-4.175487523999999,-0.5405544651250073 -Sb2Te1Br1N1_1_15704.vasp,Sb2TeBrN,-2.253881272,0.2639175410000003 -In2Te4_14_8637.vasp,In2Te4,-0.8694590433333333,0.5212812749999972 -Hf3H2S2N2_187_7710.vasp,Hf3H2S2N2,-5.775162043333333,0.5153427916666597 -Mg1B2_183_10341.vasp,MgB2,-3.5818890166666666,-0.1858824699999997 -Mo4Pb2Se4O22_13_11756.vasp,Mo4Pb2Se4O22,-4.378295050625,0.04604267343750035 -Ba4As4H4S8_14_2131.vasp,Ba4As4H4S8,-3.03829264,0.2807008104895769 -Nb4B3H2O2_164_13034.vasp,Nb4B3H2O2,-5.978619743636363,0.33648284113635296 -Sn2B2P2H6O6_7_16735.vasp,Sn2B2P2H6O6,-4.369946234444445,0.324427404861102 -Rb2Cd4Se2S6I6_31_14822.vasp,Rb2Cd4Se2S6I6,-0.6404045795,0.2616603385416647 -Ag1Se1Br2_6_126.vasp,AgSeBr2,-0.110542375,0.3640645025 -V1S1Br2_47_19907.vasp,VSBr2,-2.05814991,0.2536445240833272 -Co4Si12_90_4088.vasp,Co4Si12,-3.60090556,-0.5947796725000004 -Au1I2_164_1428.vasp,AuI2,0.6725704366666667,0.19945194791666715 -Ba3Fe2S5Br2_123_2108.vasp,Ba3Fe2S5Br2,-2.5800529683333333,-0.08093985130208559 -Mo2N3_187_11641.vasp,Mo2N3,-5.653477426,0.3413144099999945 -As2H2Se2O10_4_1215.vasp,As2H2Se2O10,-3.973861275625,0.0940621014374956 -Rh2Se2Cl2_59_15236.vasp,Rh2Se2Cl2,-1.9920066016666667,0.13361452500000004 -Bi4Te6_11_2654.vasp,Bi4Te6,-1.392811362,0.174542572 -Ru4S8_54_15371.vasp,Ru4S8,-3.070616128333333,0.5441274000000003 -In2Pd1Se4_164_8528.vasp,In2PdSe4,-1.8420605714285716,0.06869922214285523 -La2Cl2O4_10_9586.vasp,La2Cl2O4,-4.28409689125,0.4596626803125001 -V3W1Se8_25_20297.vasp,V3WSe8,-3.266070465,-0.058252583749999975 -Li2Mn2Sb2_129_10000.vasp,Li2Mn2Sb2,-1.9829432683333332,0.30169240379310175 -Te24Mo4Br12_2_18343.vasp,Te24Mo4Br12,-1.27309998425,0.09143245924999999 -Mo1Cl2_187_11507.vasp,MoCl2,-1.7274006466666665,0.5704355611111114 -Sr4Cu4Mo2O14_6_17425.vasp,Sr4Cu4Mo2O14,-3.6361420150000003,0.5158966287499969 -Zr2Te2I2_59_21704.vasp,Zr2Te2I2,-2.5400473316666665,0.10356222555555328 -Al1C1_38_618.vasp,AlC,-4.136723195,1.3487293374999998 -Na4V2P2Cl4O10_12_12429.vasp,Na4V2P2Cl4O10,-4.234771764545455,0.04461471306817669 -Ba3Si1_25_2127.vasp,Ba3Si,-0.7058711825,0.6560281456249999 -P2Ir2Se6_162_13994.vasp,P2Ir2Se6,-2.877498524,0.5332179883333317 -Sr2Ag1S2I2_38_17108.vasp,Sr2AgS2I2,-1.641498975714286,-0.145974516711312 -K8Be8H48N24_14_9549.vasp,K8Be8H48N24,-4.374714589431818,0.022066428295451246 -Cs4Hg2I8_11_4812.vasp,Cs4Hg2I8,0.08167069214285715,0.1478507607142857 -Y3H2S2N2_187_20799.vasp,Y3H2S2N2,-5.43763062,-0.8113857234722262 -Ni2Se2F2_59_13632.vasp,Ni2Se2F2,-1.2919195316666667,0.08573111916666654 -Ir1Br2_115_8726.vasp,IrBr2,-0.69151147,1.0287001811111096 -Al2Tl2O6_31_1027.vasp,Al2Tl2O6,-4.206878813,0.2099711952499994 -Hf1Cd1Te2_156_7141.vasp,HfCdTe2,-1.633927855,0.4740674687500004 -Ga2Ru1_123_6435.vasp,Ga2Ru,-2.31866595,0.32711640666666675 -Cr3C2Cl2_187_4547.vasp,Cr3C2Cl2,-3.892606065714286,0.18698274511903934 -Fe2Au1S4_187_5794.vasp,Fe2AuS4,-1.8981887499999999,-0.024747581428572918 -Ag1Te1Cl1_1_139.vasp,AgTeCl,-0.3177683466666667,0.23013787791666618 -Sr2Cu1Te2Br2_38_17208.vasp,Sr2CuTe2Br2,-1.23006816,0.22699168714285461 -Ir2I6_162_8791.vasp,Ir2I6,-0.78624430875,0.056223072500000026 -Cr2Hg2O6_2_4407.vasp,Cr2Hg2O6,-3.256453423,-0.05731776304167013 -In1Au1Se2Br1_1_8201.vasp,InAuSe2Br,-0.8773240940000001,0.32647881600000017 -Mn1Ag1Se1Br1_8_10616.vasp,MnAgSeBr,-0.7839729375,0.3768179728125002 -Hg2Te6As2_147_8040.vasp,Hg2Te6As2,-0.7168234339999999,0.3067060384999985 -Ce1S2_8_3652.vasp,CeS2,-3.6647331133333334,0.6632698124999998 -Co1H4C6I2_47_3762.vasp,CoH4C6I2,-4.61806409,0.3620023587179404 -Ba2Ce2_59_1945.vasp,Ba2Ce2,-0.6078226225,0.72877523 -B8S6_31_1792.vasp,B8S6,-4.347846994285715,0.6497378533333267 -Ca1Ag1I2_8_2792.vasp,CaAgI2,-0.1235312775,0.6500839547499999 -Pd3Au1Br4O4_1_14503.vasp,Pd3AuBr4O4,-1.3571308858333333,0.32160753847222057 -Si2S2Cl2_59_16432.vasp,Si2S2Cl2,-2.7802542199999998,0.3260213758333312 -Cr2P2S10_129_4450.vasp,Cr2P2S10,-2.9043624635714282,0.3001720556249977 -C6N2_191_2777.vasp,C6N2,-7.56921399375,0.2497042425 -Mn1Ge1S1I2O2_1_10738.vasp,MnGeSI2O2,-2.5263132585714283,0.3887868025892827 -K2Mn1P2O7F3_1_9235.vasp,K2MnP2O7F3,-4.171118297333333,-0.06683336025000633 -Co2Se2I2_59_4020.vasp,Co2Se2I2,-1.4086555049999998,0.07559347459259136 -Sc4B3H2_164_16224.vasp,Sc4B3H2,-3.923397048888889,0.24825822694444177 -Hf4Se2S2Br3Cl1_8_7813.vasp,Hf4Se2S2Br3Cl,-4.0957820683333335,0.02071993786457954 -B2W3F2_187_1721.vasp,B2W3F2,-4.945857037142857,0.4618524833333232 -Ti2H2O3_12_18949.vasp,Ti2H2O3,-5.8642296499999995,0.7653192714285675 -B2Cl2_164_1661.vasp,B2Cl2,-3.21378447,0.5353308994444415 -Ga2Te2_2_6511.vasp,Ga2Te2,-1.70084414,0.2323560758333334 -Sr2Bi1_25_17142.vasp,Sr2Bi,0.07029024666666667,1.0336261722222213 -Os1S2_115_13820.vasp,OsS2,-3.4364491299999997,0.8616683758333332 -V8O16F8_14_20398.vasp,V8O16F8,-4.7410340725,-0.2527354790625034 -In1Cu1S2I1Cl1_1_8233.vasp,InCuS2ICl,-1.1152273366666667,0.3315933992499982 -Ga2Os1_21_6424.vasp,Ga2Os,-2.3627672866666667,1.008605338888886 -Hf1Zr1I1Br3_6_7378.vasp,HfZrIBr3,-2.386990293333333,0.3743761337962941 -Ti3Te2C2F2_38_19107.vasp,Ti3Te2C2F2,-4.940134487777778,0.22453701314814345 -Y1F2_115_20628.vasp,YF2,-4.197750006666666,0.8959402005555506 -Sb2P2Se6_1_15628.vasp,Sb2P2Se6,-2.4520351689999997,0.16589902177083138 -Cd1Au1S1I2O1_1_3270.vasp,CdAuSI2O,-0.3890890116666667,0.5018074257812505 -Cu1N2_10_4919.vasp,CuN2,-3.8886933233333334,0.3299448249999961 -Zn1In1Pd1Au1Br2Cl1O5_1_20964.vasp,ZnInPdAuBr2ClO5,-1.7647519441666668,0.2984957719444391 -K4W4N4Cl4F20_14_9531.vasp,K4W4N4Cl4F20,-3.334229326388889,0.015986735439810107 -Ta2Pd1O6_12_17824.vasp,Ta2PdO6,-6.082127862222222,0.13998201388888365 -C1I2_164_2730.vasp,CI2,-0.9627294633333333,1.4885316945833311 -Ca1S1Br2_8_2871.vasp,CaSBr2,-1.6656314075,0.43644003984375 -Sr4Sb2_59_17466.vasp,Sr4Sb2,-0.829534635,0.5629734472222209 -Bi6Pb6_2_2672.vasp,Bi6Pb6,-0.7635130658333332,0.13401399166666683 -Mo1H2_187_11513.vasp,MoH2,-2.985540783333333,2.021377943333329 -Tl1Au3I4O4_1_19225.vasp,TlAu3I4O4,-0.8590722741666666,0.3589945074999945 -Te3P1O8_1_18552.vasp,Te3PO8,-3.983446559166667,0.2510314522482596 -Sr1Cd2S2Br2_1_17037.vasp,SrCd2S2Br2,-0.9946137485714285,0.21898080785714175 -Mg2Sb1_25_10502.vasp,Mg2Sb,-0.2915534966666667,0.7591012984027776 -Hg2Sb2Te6_147_8013.vasp,Hg2Sb2Te6,-0.533383392,0.3565612119999984 -Ta4B3H2_164_18005.vasp,Ta4B3H2,-6.477599786666667,0.35690251999999445 -Zn2As4S6F4_31_21036.vasp,Zn2As4S6F4,-2.210586314375,0.5005472625833304 -Ru2S6_11_15349.vasp,Ru2S6,-3.09014107375,0.2753877723437501 -V3H5O8_1_20271.vasp,V3H5O8,-4.939696845,0.06163982916666644 -Nb2C1F2_164_12661.vasp,Nb2CF2,-5.772334756,0.15502677479999605 -Al2S3_150_948.vasp,Al2S3,-3.2318601219999996,0.5074336377500006 -Al2Tl2H8_10_1026.vasp,Al2Tl2H8,-2.3830339766666664,0.4840325374999952 -Te4Au2I2_1_18569.vasp,Te4Au2I2,-0.26296932125,0.08559442374999998 -Al2_51_1045.vasp,Al2,-1.902308815,0.5216720499999998 -Ta2Cl10_51_17688.vasp,Ta2Cl10,-2.2301028416666666,0.5330169600000003 -Nb2I1Br1N1O1_6_12740.vasp,Nb2IBrNO,-4.910427715,0.07795672249999575 -Pb2S2_31_14280.vasp,Pb2S2,-2.233755275,-1.56062183 -V2Te2_129_20213.vasp,V2Te2,-2.53920712,0.2360379828571404 -Hf2Se1Br4O1_38_7594.vasp,Hf2SeBr4O,-3.64245388875,0.31040785406250015 -Fe2P2O4F2_26_5909.vasp,Fe2P2O4F2,-3.986366554,0.282194656999992 -Sr10Rh2_26_17013.vasp,Sr10Rh2,0.26369069083333335,0.25556416333333337 -B2Sb6_164_1709.vasp,B2Sb6,-2.49638928625,0.7565323427083332 -V2Ag2P4O12_13_19972.vasp,V2Ag2P4O12,-4.7207587150000005,0.28415299849998954 -Th4Cl16_14_18732.vasp,Th4Cl16,-3.247462033,0.09090045299999971 -Pr2Si2I2_164_14553.vasp,Pr2Si2I2,-3.1836230249999997,0.036008966666666975 -Mo1W1O5_1_11553.vasp,MoWO5,-5.38760326,0.2398051039285667 -Cr2Au2S8_51_4318.vasp,Cr2Au2S8,-2.11721894,0.38816465156249796 -Si2Sn1P1S4F2_1_16453.vasp,Si2SnPS4F2,-3.14820862,0.45827011100000026 -Ti1Ge1Te2_8_18788.vasp,TiGeTe2,-3.174330355,0.09156899499999982 -Li2Fe2P2O8_11_9908.vasp,Li2Fe2P2O8,-4.959934424285714,0.09615317750000063 -Na2Cd4Te2O6F6_31_12046.vasp,Na2Cd4Te2O6F6,-1.9599266624999998,0.29406736112499643 -Ta2Se2_187_17875.vasp,Ta2Se2,-4.805290525,0.5986267474999947 -Bi20B4_26_2414.vasp,Bi20B4,-1.5129005354166667,-0.09701298986111534 -Ag2Bi2P4S12_2_194.vasp,Ag2Bi2P4S12,-2.6597776415,0.0997064205 -Ru2O4_11_15333.vasp,Ru2O4,-4.4060786316666665,0.5576350333333338 -Te1Pt1Se1_156_18328.vasp,TePtSe,-1.8949707699999998,0.15274557666666677 -As16Cl4_10_1125.vasp,As16Cl4,-2.705838256,0.07380521733333145 -Cd1Br1O1F1_156_3285.vasp,CdBrOF,-0.728432255,0.549177150625 -Ni2Bi2S4I2_10_13468.vasp,Ni2Bi2S4I2,-1.2430241450000001,0.2926236383333335 -Ta2N1_164_17781.vasp,Ta2N,-7.124394153333333,1.2994304011111106 -Pd2Cl4_11_14415.vasp,Pd2Cl4,-0.64158899,0.2338770744444444 -Os1C2_123_13794.vasp,OsC2,-5.095104656666667,2.2785949199999935 -Ni2Bi1Te2_187_13463.vasp,Ni2BiTe2,-0.633192202,0.19597568671428353 -Ta4N3O2_164_18061.vasp,Ta4N3O2,-7.876610778888889,0.37514462444443675 -Zr2Se6_59_21682.vasp,Zr2Se6,-3.552338035,0.053570818749999916 -Co3Si1Se2_187_4071.vasp,Co3SiSe2,-2.442821716666667,0.14454005072221743 -Ba2Zn2Bi2_129_2089.vasp,Ba2Zn2Bi2,-0.057746523333333334,0.3214232142753617 -Fe2Te5As2_8_6023.vasp,Fe2Te5As2,-1.5702000622222223,0.392312292777776 -Al4As20_26_1056.vasp,Al4As20,-2.79689952,0.11503201999999701 -Sn4Se4_57_16971.vasp,Sn4Se4,-1.8466815525,-0.2704031775 -In1I1_99_8272.vasp,InI,-0.03108928,0.96684149 -Ru1Br2O1_47_15259.vasp,RuBr2O,-2.3308096,0.06614945000000017 -Ag4S4F8_1_551.vasp,Ag4S4F8,-1.126630645,0.32329864984374945 -Hg3Br2_164_8053.vasp,Hg3Br2,1.8326708960000002,0.7091249467586234 -Tl2Se3_150_19537.vasp,Tl2Se3,-0.940602464,0.4898335749999999 -Cr1Te1Se1_156_4274.vasp,CrTeSe,-2.25320343,0.12993807555555376 -Fe2Te4F2_11_6012.vasp,Fe2Te4F2,-1.42895304,0.2550507911111096 -Hf2F2_164_7487.vasp,Hf2F2,-5.1000302275,0.2469009581250008 -V2O6_59_20132.vasp,V2O6,-4.9420534225,0.25384831140624975 -Al1Cu1Sb2Se6_149_646.vasp,AlCuSb2Se6,-1.936529171,-0.0048391336666689655 -Zr2S1Br1Cl3O1_1_21636.vasp,Zr2SBrCl3O,-3.66934036125,0.24751233296874964 -Sr1Sn2_164_17089.vasp,SrSn2,-0.4372474333333333,0.6859725666666656 -Ca2Zn1_123_3140.vasp,Ca2Zn,1.0294409533333333,0.24575079666666666 -Ag1Te2Au1_25_144.vasp,AgTe2Au,-0.17886776,0.1829923772499997 -V1B4H4O6F1_2_19773.vasp,VB4H4O6F,-5.06395565875,0.5788523776388812 -As4I12_14_1329.vasp,As4I12,-0.63478635875,0.05078587000000001 -V2Br3Cl1O2_8_20005.vasp,V2Br3ClO2,-3.0917615725,-0.01800168468749952 -Mn1As1S1Br2_1_10632.vasp,MnAsSBr2,-1.832898222,0.14066219987500006 -Ga4Cu4Se14Cl16_13_6551.vasp,Ga4Cu4Se14Cl16,-1.4442152836842106,0.1172954634210509 -Ni2Te4F2_2_13673.vasp,Ni2Te4F2,-1.08198514,0.11425322843749999 -Sb12Au2_31_15414.vasp,Sb12Au2,-1.569061832142857,0.38560447071428394 -Sc1Bi2_21_15909.vasp,ScBi2,-1.83730311,-1.4607099083333335 -P2Pd2S2_7_14021.vasp,P2Pd2S2,-2.5332206950000002,0.6945598341666663 -Mn2Al2O5_164_10952.vasp,Mn2Al2O5,-5.084252376666666,0.07007575952106604 -Ni3S4_164_13714.vasp,Ni3S4,-1.4938437271428573,0.12854566071428541 -Ga1H2O2_164_6198.vasp,GaH2O2,-3.894384262,0.38766823416666707 -Y4C3Cl2_164_20812.vasp,Y4C3Cl2,-5.482397246666667,0.19258187296295715 -Bi2H12C4S2N18O2_2_2460.vasp,Bi2H12C4S2N18O2,-5.15619756825,-0.7473752507500047 -Nb2Co4Se6_11_12699.vasp,Nb2Co4Se6,-2.962725925833333,0.18182091479166218 -Sr2P4H8O8_13_17294.vasp,Sr2P4H8O8,-4.617017070909091,0.061441393352268836 -Ga2Hg2Cl8_2_6386.vasp,Ga2Hg2Cl8,-0.8650000591666666,0.04401766000000007 -Nb2Fe4S6_11_12721.vasp,Nb2Fe4S6,-3.0395462633333334,0.49599364388888567 -Ta1S1I1Br1_8_17603.vasp,TaSIBr,-2.994852265,0.29402285625 -Rb2B12H12O12_5_14770.vasp,Rb2B12H12O12,-4.911288169210526,0.7906461340443112 -Na2Cd4S6Br6O2_31_12029.vasp,Na2Cd4S6Br6O2,-1.1358915325,0.41446424393749726 -W2O6_11_20523.vasp,W2O6,-6.01425280375,-0.1502170006250001 -Tl1In1S2I1Br1_1_19299.vasp,TlInS2IBr,-1.2818010466666667,0.23390310531249645 -V4Te12_2_20371.vasp,V4Te12,-1.98913897875,0.1792382537499999 -Pb2_164_14301.vasp,Pb2,-0.702849595,0.625336525 -Ta1Ni1Se4_6_17590.vasp,TaNiSe4,-2.8520360399999998,-0.31393195912037264 -Ni1P2_123_13391.vasp,NiP2,-2.47697481,0.708565025 -Be1P2H4O4_5_2226.vasp,BeP2H4O4,-4.76197364,0.07486547111109859 -Hg2S2Cl2_59_7995.vasp,Hg2S2Cl2,-0.09263101833333333,0.35856010697916496 -V1W1Se2S2_5_19958.vasp,VWSe2S2,-3.4754769666666667,0.3341242174999999 -Hf2O2_187_7547.vasp,Hf2O2,-6.7080153175,0.5987864581818112 -In2Ga2F8_10_8443.vasp,In2Ga2F8,-2.570868455,0.19771765249999973 -Sn2Sb2Te6_147_16871.vasp,Sn2Sb2Te6,-1.430630903,-0.3360082983333349 -Sc4C3S2F2_164_16232.vasp,Sc4C3S2F2,-4.263209781818182,1.0547489693073469 -Rb1Ge1I3_156_14731.vasp,RbGeI3,-0.6512109340000001,0.3278877779999988 -Sr4Sb4Te8H4_11_17474.vasp,Sr4Sb4Te8H4,-2.05816029,0.3816548484999981 -Cd3Ag1_191_3605.vasp,Cd3Ag,2.454618145,0.12220600749999999 -Cd1Ru1I1Br1O2_1_3406.vasp,CdRuIBrO2,-1.9300434116666667,0.4179071978472223 -U2Te2P2_8_19732.vasp,U2Te2P2,-5.2432399300000005,0.11488329291665456 -Sn2Cl2F2_129_16758.vasp,Sn2Cl2F2,-2.0924852483333334,0.0702869749999997 -Ta1Te1Se1_156_17625.vasp,TaTeSe,-4.07476065,0.14672060527777786 -Sr4P2_59_17456.vasp,Sr4P2,-1.6365440866666667,0.3858404024999991 -Cr4C3S2F2_164_4597.vasp,Cr4C3S2F2,-3.9727083899999998,0.6189706840909039 -Ni1I2_187_13364.vasp,NiI2,0.71291987,0.2836089733333333 -P2Os2O6_8_13999.vasp,P2Os2O6,-4.833065818,0.6771841889999957 -Zr3S2_123_21781.vasp,Zr3S2,-4.668876454,-0.07360253800000438 -Ni2H2Se4_11_13514.vasp,Ni2H2Se4,-1.764146035,0.55511053375 -Ta4Co2Se10_59_18023.vasp,Ta4Co2Se10,-3.972718475,0.09562427968749976 -Si2Te6As2_147_16460.vasp,Si2Te6As2,-2.050647029,-0.054226898333334606 -Nb1Cu1N1Cl2O1_8_12496.vasp,NbCuNCl2O,-3.6145521449999998,0.535649078304153 -La1Te3_99_9575.vasp,LaTe3,-2.2835397125,-0.23513044000000027 -Pt2Cl2_129_14611.vasp,Pt2Cl2,-0.42566999,1.25580954125 -Zr2C1_164_21537.vasp,Zr2C,-5.38303888,0.8100186858333327 -Nb4S1Cl4O3_1_13140.vasp,Nb4SCl4O3,-4.751452225,0.1588337214843636 -Lu2S2Br2_59_10314.vasp,Lu2S2Br2,-3.521334038333333,0.03523051833333346 -Cr3B2O2_187_4543.vasp,Cr3B2O2,-4.646715477142857,1.128315499682536 -Ge1Sb1Te1S1_1_6704.vasp,GeSbTeS,-2.2526934925,-0.1675282787500021 -Pt1Cl2_115_14568.vasp,PtCl2,-0.43615127000000004,0.6818887916666667 -V3B2Cl2_187_20236.vasp,V3B2Cl2,-3.9779508314285716,0.30232848571428206 -V1Cl2_115_19798.vasp,VCl2,-2.0195939033333334,0.32793644333333294 -C8_65_2783.vasp,C8,-7.1802421725,0.9360832375000001 -Nb3Ni3Te14_6_12992.vasp,Nb3Ni3Te14,-1.976660827,0.10924180629166469 -In2Fe2O5_187_8435.vasp,In2Fe2O5,-3.5844777800000003,0.23514346615740367 -In2Ga2Se6_31_8447.vasp,In2Ga2Se6,-2.09553922,0.07161848149999994 -Ge1Pd1S2_1_6692.vasp,GePdS2,-2.4044945175,0.4070257212499975 -P4Se6_1_14124.vasp,P4Se6,-2.711868929,0.2048771774166646 -K4C4S4N4_57_9420.vasp,K4C4S4N4,-4.5262882525,-0.0884820387500056 -H4Se2O8_4_7082.vasp,H4Se2O8,-3.759248232857143,0.07934873414285004 -Ni3S4_10_13715.vasp,Ni3S4,-1.09220995,0.5301794378571427 -Sc2Pb1_164_16123.vasp,Sc2Pb,-1.6400181766666666,0.8464977283333313 -V2Se2Cl2_59_20182.vasp,V2Se2Cl2,-2.6549093200000002,0.23088028499999957 -Ni3Ge1Te2_187_13701.vasp,Ni3GeTe2,-0.8762512816666667,0.0746734566666667 -Ga1Fe5F2_123_6189.vasp,GaFe5F2,-0.9687391625,1.2117164212499987 -Ag2Sb4O3F2_6_408.vasp,Ag2Sb4O3F2,-2.275751220909091,0.5254939422537841 -Cd1C4Br2N2F4_10_3294.vasp,CdC4Br2N2F4,-3.9831013176923076,0.12813464076921854 -Rb2Cd4S2I6O6_31_14809.vasp,Rb2Cd4S2I6O6,-1.6076970970000002,0.08423225521875044 -In2As2_129_8377.vasp,In2As2,-1.823480885,-0.5091421249999999 -Te3As4Au2F2_6_18545.vasp,Te3As4Au2F2,-1.49569231,0.29362137087121065 -Eu2I6O22_2_5604.vasp,Eu2I6O22,-3.149411962333333,0.16758606720833102 -B2Sb2O6_2_1707.vasp,B2Sb2O6,-5.444412531999999,0.1397698231666622 -La4Br6_12_9624.vasp,La4Br6,-2.4991111320000003,0.1034322211999994 -Hf1P2S6F2_164_7258.vasp,HfP2S6F2,-3.440583539090909,0.4525731917897693 -Hf3Cd1Se6I2_1_7700.vasp,Hf3CdSe6I2,-3.1718899775,0.23509652930555625 -Te4W2N4O16_4_18632.vasp,Te4W2N4O16,-4.547594905,0.12400320634614403 -Mn2Bi2S4Br2_26_11006.vasp,Mn2Bi2S4Br2,-2.058643747,0.17600712616666603 -Zr1Nb1Br2N2_25_21338.vasp,ZrNbBr2N2,-5.343867395,0.11582006683332358 -V1H4N4O6F1_1_19857.vasp,VH4N4O6F,-4.574323375625,0.09464839457290752 -Li2Bi2B4O10_4_9842.vasp,Li2Bi2B4O10,-5.550000482222222,0.12685787402776683 -Os2Br8_14_13836.vasp,Os2Br8,-1.0900830510000001,0.11961773099999995 -Si4P4Se4_17_16503.vasp,Si4P4Se4,-3.634499363333333,-0.6365941594791664 -Hf1Re2Rh1Se6I1Br1_1_7271.vasp,HfRe2RhSe6IBr,-3.3282105066666667,0.32735204579859983 -Ag2S4Br2_1_388.vasp,Ag2S4Br2,-1.15675132875,0.10417800843750014 -Au2Br2O4_17_1451.vasp,Au2Br2O4,-1.35972397,0.1965139807291656 -Sr2_65_17342.vasp,Sr2,1.92466486,2.24321007 -Hg2Cl2O2_59_7952.vasp,Hg2Cl2O2,-0.36510896833333334,0.3967932135416643 -Te2Pb2S8_7_18455.vasp,Te2Pb2S8,-2.092466958333333,-0.2971824508680565 -Mg2Br4_51_10436.vasp,Mg2Br4,-1.35278618,0.1851843844444443 -V2F2_164_20058.vasp,V2F2,-3.52568835,0.15274597833333048 -Tc6Br18_164_18258.vasp,Tc6Br18,-2.3816560608333335,-0.08872931770833337 -Cu1Sb1As2Se6_143_4961.vasp,CuSbAs2Se6,-1.9613561019999999,0.23152530897221818 -In2Co1S4_164_8408.vasp,In2CoS4,-2.413293358571429,0.17301700172618784 -Ce1Se2_164_3654.vasp,CeSe2,-3.1507169433333337,0.6506107624999995 -Zn2Fe4O10_59_21077.vasp,Zn2Fe4O10,-2.91831995125,0.4747909920312502 -Mo1Au2S4_111_11494.vasp,MoAu2S4,-1.861539402857143,0.3306763278571403 -Ba1Sb2F12_1_1855.vasp,BaSb2F12,-2.8225135713333334,-0.00913649999999988 -Ag2Hg2S2F2_26_299.vasp,Ag2Hg2S2F2,-0.31033954125,0.1695337747395818 -La2Bi2S4O2_129_9577.vasp,La2Bi2S4O2,-4.217394213,-0.4013741423333341 -Ga2Te2Cl2_31_6500.vasp,Ga2Te2Cl2,-1.6968728533333335,-0.8324756475000001 -Rb2H2C2S6_4_14845.vasp,Rb2H2C2S6,-3.25317239,0.192915628281247 -Bi4S12O42_2_2638.vasp,Bi4S12O42,-4.2811011096551725,0.02862070206896572 -V1Cu1As2Se6_5_19812.vasp,VCuAs2Se6,-2.21906031,0.2130177275999979 -Hf1Ag1S2Br2_1_7103.vasp,HfAgS2Br2,-2.5435453133333334,0.21571076249999765 -Sb2Br6_162_15556.vasp,Sb2Br6,-1.04848448875,0.05035413250000009 -Ca2Fe1S3_38_3016.vasp,Ca2FeS3,-2.774101513333333,-0.14859368583333565 -Li2Nb2Cl12_4_10012.vasp,Li2Nb2Cl12,-2.4943277775,0.04573179374999725 -Mg1Br2_164_10347.vasp,MgBr2,-1.4747699233333333,0.06320064111111101 -Ag4O4F4_14_534.vasp,Ag4O4F4,-1.2228020558333335,0.30517415749999843 -Ru1O2_187_15277.vasp,RuO2,-3.91754488,1.0461687850000003 -V2I5_1_20099.vasp,V2I5,-0.8415403214285714,0.23206813380952296 -As2Pd3O8_164_1273.vasp,As2Pd3O8,-3.32446898,0.26844984384615067 -As2I6_150_1221.vasp,As2I6,-0.55411880375,0.131453425 -W6C1Cl18_174_20594.vasp,W6CCl18,-2.7226259988,-0.07453299019999982 -K2H4C12N2Cl4O6_2_9130.vasp,K2H4C12N2Cl4O6,-5.087739585,0.44130310574999143 -Ga1Pt1S2I1Br1_1_6244.vasp,GaPtS2IBr,-1.7878396716666665,0.10155327354166488 -Au4Se4Br4_51_1597.vasp,Au4Se4Br4,-0.39419113666666666,0.06821897458333337 -Ca2Br2F2_129_2960.vasp,Ca2Br2F2,-2.8499592466666663,0.036981733333333766 -Cr1Ga1Ag1S3I2_1_4174.vasp,CrGaAgS3I2,-1.6515679825,0.2918210612499999 -Mg1Ga2_187_10366.vasp,MgGa2,-0.9992764266666666,0.14789219708333345 -Ge2N6_164_6789.vasp,Ge2N6,-5.26475447875,0.13152258020832885 -Cd4Br4_1_3621.vasp,Cd4Br4,0.720758425,0.03247177437500004 -Mg1Sb4O8_6_10402.vasp,MgSb4O8,-4.198826989230769,0.1938104315384579 -Mo1I2_187_11518.vasp,MoI2,-0.6368896633333333,0.6979149972222224 -Sb2Au2S6_2_15545.vasp,Sb2Au2S6,-1.8385689760000001,0.22993148993749757 -Ho2S6_129_8145.vasp,Ho2S6,-3.732994335,0.10783994992187496 -Cr1H6W1_2_4195.vasp,CrH6W,-2.93324237625,2.213388655 -Sr4Co2S6Cl2_129_17419.vasp,Sr4Co2S6Cl2,-2.7627838914285716,0.06710839026785465 -Tl2Te6Pt4_164_19561.vasp,Tl2Te6Pt4,-1.5208469574999999,0.1790190808333334 -Fe2Mo2I2O8_129_5871.vasp,Fe2Mo2I2O8,-3.680917397857143,0.16972943523809336 -Mn4F14_13_11434.vasp,Mn4F14,-2.562446591111111,-0.1871290381944466 -Ba2Cr3O7_1_1959.vasp,Ba2Cr3O7,-4.668033593333333,0.24881750458332874 -Pb1O2_115_14193.vasp,PbO2,-2.9249497366666666,0.531579325 -Ta1Cl2_164_17525.vasp,TaCl2,-3.4910772800000003,0.45314708499999345 -Ta2C2Br2_59_17682.vasp,Ta2C2Br2,-5.651992313333333,0.09796917933332328 -Sb2Rh2O6_162_15666.vasp,Sb2Rh2O6,-3.9947207980000004,0.20351177574999557 -Ti2Zn1Br1Cl1O2_1_19055.vasp,Ti2ZnBrClO2,-4.03896899,0.2702997886607087 -Mo1O2_164_11526.vasp,MoO2,-4.88789347,0.4240116416666666 -V1As2_187_19770.vasp,VAs2,-3.290664636666667,0.40248950666666294 -Rh1Pb3_187_15163.vasp,RhPb3,-0.60971819,1.0220314180769217 -In2Se2F2_59_8580.vasp,In2Se2F2,-2.1284777216666666,0.1367401405555535 -Nb2Br6_162_12657.vasp,Nb2Br6,-2.2532421525,0.23216459624999786 -Rb4Pd6S8_191_14978.vasp,Rb4Pd6S8,-1.8932452116666667,0.09061659444444459 -Ba2Ag1O2F2_38_1883.vasp,Ba2AgO2F2,-3.097333152857143,0.12218630428571142 -Sr2Fe4Se4O2_59_17223.vasp,Sr2Fe4Se4O2,-2.0908696258333332,0.17350510749999803 -Bi18F4_11_2312.vasp,Bi18F4,-1.4388003868181818,-0.358977756515153 -In2Se3_189_8592.vasp,In2Se3,-1.6177118499999998,0.3666095760000001 -Hf2Br8_1_7454.vasp,Hf2Br8,-2.483442173,0.08654296700000019 -Cd2Cu2Te2I2_26_3500.vasp,Cd2Cu2Te2I2,0.265068075,0.0014037792708333496 -Cd1Pd1Cl4_2_3398.vasp,CdPdCl4,-0.5705772516666666,0.06935295722222229 -Sc2C1F2_164_16051.vasp,Sc2CF2,-5.014266802,0.06612141000000005 -Li1Ga1Sb2Te6_5_9717.vasp,LiGaSb2Te6,-1.538146045,0.31176965916666516 -Si1S1O1_8_16357.vasp,SiSO,-4.555211376666667,0.5903563566666665 -Th2Te2O2_129_18728.vasp,Th2Te2O2,-5.829281676666667,0.1098993933333332 -Ag2Bi2S2Cl4_51_195.vasp,Ag2Bi2S2Cl4,-1.127952129,0.18576818424999808 -Ni4P2_129_13749.vasp,Ni4P2,-1.0587821433333333,0.09620355333333341 -Y2Al2I2_164_20692.vasp,Y2Al2I2,-2.9701999650000004,0.032078114999999574 -Y1Pb5_47_20661.vasp,YPb5,-1.258214925,0.23298589833333183 -Co2As2Pt2_129_3844.vasp,Co2As2Pt2,-2.0657825216666668,0.5365453954166648 -Zn2Co3O8_10_21059.vasp,Zn2Co3O8,-3.1427217684615387,-0.31371420778846737 -Li4V4F24_14_10244.vasp,Li4V4F24,-3.1985238409375,0.10936269906250029 -Ca3As3_25_3148.vasp,Ca3As3,-1.563332835,1.2130303716666664 -Mn2Ag1S1I2_1_10949.vasp,Mn2AgSI2,-1.0317753733333335,0.1974437991666661 -Bi2Sb2O6_1_2523.vasp,Bi2Sb2O6,-3.7133358739999998,0.3126208983636303 -Mo2H8_129_11618.vasp,Mo2H8,-3.199839739,1.7346153910000002 -Sn2P2O6_164_16817.vasp,Sn2P2O6,-4.70916139,0.2184981681999949 -Na4Cd1P2_164_12375.vasp,Na4CdP2,-1.2144259571428573,0.09562300285714276 -Na2Hg4S6Br6O2_31_12155.vasp,Na2Hg4S6Br6O2,-0.9215826180000001,0.3112153191874978 -Ga18Se9_143_6106.vasp,Ga18Se9,-1.892033534074074,0.08457113092592428 -Ba4Ni2Cl2O6_129_2166.vasp,Ba4Ni2Cl2O6,-3.3448157042857143,-0.11203869377232778 -Sr4P4H12O16_14_17457.vasp,Sr4P4H12O16,-4.825753754166667,0.4067137843749955 -Cs2Os2C2S4I8_7_4759.vasp,Cs2Os2C2S4I8,-1.8519570033333332,0.5547761366666644 -Sn2Sb2H2O6_7_16855.vasp,Sn2Sb2H2O6,-3.679350401666667,0.42285984402777366 -As1P1W1_156_1157.vasp,AsPW,-4.322050196666667,-0.2751468966666706 -Pb2O2_25_14264.vasp,Pb2O2,-2.8669685275,0.2741131321875001 -Mn2Bi4Se8_10_11028.vasp,Mn2Bi4Se8,-1.843874385,0.26710189249999894 -Ir2Br2O2_59_8765.vasp,Ir2Br2O2,-2.7298406383333336,0.4524361988888854 -Mn1Bi2Te4_164_10654.vasp,MnBi2Te4,-1.4927801600000001,0.15425484733989958 -Ta2Se1S1I2_6_17868.vasp,Ta2SeSI2,-3.7749893283333336,-0.0063647428059938616 -Bi2Se2F2_59_2540.vasp,Bi2Se2F2,-2.1554120033333333,0.3471193313888865 -Rb1Hg3Cl8O1_6_14739.vasp,RbHg3Cl8O,-0.19878194076923078,0.22438941480768854 -Sc3N2_187_16214.vasp,Sc3N2,-5.419917286,0.2331432199999961 -Co2P2H12O12F2_2_3957.vasp,Co2P2H12O12F2,-4.3488663260000004,0.03915719097221748 -Pb2Cl2O2_59_14236.vasp,Pb2Cl2O2,-2.3389553949999997,0.03228532666666695 -Tl1Ge1Se1S1Br2_1_19278.vasp,TlGeSeSBr2,-1.5658229733333335,0.17543813827256338 -Cr2C1S2F2_164_4343.vasp,Cr2CS2F2,-3.2401574314285715,0.6971925185714185 -Ta2Mo2O11_164_17775.vasp,Ta2Mo2O11,-6.170345636666667,0.054118775333333424 -As2Pt2Se6_12_1279.vasp,As2Pt2Se6,-2.220464391,0.24234507194999733 -Sn4P4S4_17_16950.vasp,Sn4P4S4,-2.748242133333333,0.24297667583333094 -Hf1V1Mo1Se6Br1_1_7352.vasp,HfVMoSe6Br,-3.0012484529999996,0.34190619790000065 -Ca2Au1O2F2_38_2930.vasp,Ca2AuO2F2,-2.8032085885714286,0.660297449761899 -Sr1V1I1Cl3_1_17097.vasp,SrVICl3,-1.9466155033333334,0.11598022972221983 -Ti6H4O14_11_19181.vasp,Ti6H4O14,-6.402124702916667,0.12231899381944444 -Ir2S2_164_8824.vasp,Ir2S2,-3.28860322,0.5439233383333288 -Cr2F2_129_4379.vasp,Cr2F2,-2.063088425,1.701392577499997 -W2N4_2_20516.vasp,W2N4,-6.554741445,0.3116115587499948 -Ag1Au1Cl2F3_1_6.vasp,AgAuCl2F3,-0.3421334742857143,0.22228117357142788 -B2C3N6_5_1658.vasp,B2C3N6,-7.175528424545454,0.014328646590896277 -Er2Se2F2_164_5573.vasp,Er2Se2F2,-4.001319011666667,0.24504538694443978 -Ba1Li2Si2_187_1842.vasp,BaLi2Si2,-2.105703574,0.5043318186346133 -Ag2Mo6P4O28_11_328.vasp,Ag2Mo6P4O28,-5.0136082882499995,0.05574293079999615 -Pt2S2F2_59_14654.vasp,Pt2S2F2,-2.1366630416666665,0.26144993222221724 -Ta1Mn2Nb1S4I4_1_17567.vasp,TaMn2NbS4I4,-2.9199366291666666,0.0674432635208298 -Co2Pd4Se4_49_3974.vasp,Co2Pd4Se4,-1.543771902,0.216464475 -Cu2Si4P6_6_5317.vasp,Cu2Si4P6,-3.447766934166667,0.21443645249999976 -Zn1In2S4_156_20967.vasp,ZnIn2S4,-2.015134542857143,0.12865432914285574 -Pd2I1Cl5_8_14428.vasp,Pd2ICl5,-0.52301791125,0.1446421345833333 -Fe2As2Se4I2_26_5788.vasp,Fe2As2Se4I2,-1.7618558759999998,0.1990327197999976 -Zr1Ge1S1Br5_1_21300.vasp,ZrGeSBr5,-2.11490413375,0.17655856394531255 -Mo2H1O6_1_11610.vasp,Mo2HO6,-4.983389227777778,0.06709542143518554 -Sb8O10F4_14_15868.vasp,Sb8O10F4,-3.820877800909091,0.1347571688068152 -Cd12As8_115_3263.vasp,Cd12As8,0.4245659805,0.32323732424999996 -Ba2Bi4O8_11_1921.vasp,Ba2Bi4O8,-3.954775480714286,0.045253872500000236 -Au2O2F2_59_1499.vasp,Au2O2F2,-1.09523179,0.23227602648148027 -Au2Br4_11_1458.vasp,Au2Br4,0.3653337466666667,0.1831040587500002 -Sn1Se2_115_16694.vasp,SnSe2,-1.9009155166666665,0.2451566300000001 -Mn2Te2Cl2_59_11295.vasp,Mn2Te2Cl2,-1.6194671716666666,0.16633196999999988 -Na4Bi4S8_7_12370.vasp,Na4Bi4S8,-2.378697508125,0.14631536187499972 -B2Mo2Br4_99_1677.vasp,B2Mo2Br4,-2.26786635375,0.6716786886718751 -In2S10F2_11_8537.vasp,In2S10F2,-2.1537383778571426,0.4521766589285694 -V4Cu2P4O28_11_20320.vasp,V4Cu2P4O28,-4.641860684473684,0.29331095559210096 -Li4V4O8F8_29_10248.vasp,Li4V4O8F8,-4.373404020416666,0.08997252725694085 -Pd4Cl8_14_14517.vasp,Pd4Cl8,-0.8055659041666666,0.06990016027777779 -Mn2C2Br2_59_11043.vasp,Mn2C2Br2,-3.16685032,0.5399199737499962 -V1F2_187_19826.vasp,VF2,-3.3272944533333333,-0.05242146888889199 -Zn1S2F2_164_21005.vasp,ZnS2F2,-1.310432034,0.6947491922500003 -Ti2O2_129_18975.vasp,Ti2O2,-6.55601768,0.6811994833333337 -Hf1Ga1S2I1Br2_1_7167.vasp,HfGaS2IBr2,-2.6594539200000002,0.24045269464285124 -Ta2Cl5_1_17696.vasp,Ta2Cl5,-2.974806061428571,0.6163001303571398 -Cu2Br2_67_5054.vasp,Cu2Br2,-0.00520502,0.37447427499999997 -Y2B1F2_164_20694.vasp,Y2BF2,-4.971473736,0.2562578128333285 -Li2Ti2Se1S1_25_10097.vasp,Li2Ti2SeS,-4.218991081666666,0.001447775694444875 -Te8Mo2Br2_2_18699.vasp,Te8Mo2Br2,-1.5785830066666666,0.0786509333333334 -K2Ru2S2N2F10_11_9325.vasp,K2Ru2S2N2F10,-2.846455725,-0.02729763575397537 -Gd2O2F2_129_6622.vasp,Gd2O2F2,-5.229552761666667,0.49037737333333276 -Mn2Sb2S4Br2_26_11238.vasp,Mn2Sb2S4Br2,-2.271608374,0.04414725124999766 -Ni2Te2H4O8_4_13661.vasp,Ni2Te2H4O8,-3.529253160625,-0.08799666380208326 -Nb2Te6Pd1_12_12927.vasp,Nb2Te6Pd,-2.6563822722222223,0.09238299944443873 -As4Pt2_2_1353.vasp,As4Pt2,-2.6276589833333333,0.7934580941666667 -Tl1In1S2_10_19300.vasp,TlInS2,-1.260754225,0.8271737915625001 -Pd1S2_115_14385.vasp,PdS2,-1.6807434233333334,0.6370687808333333 -Ga2Co2S5_156_6332.vasp,Ga2Co2S5,-2.761924784444444,0.07891173379629413 -Hf1Pd1I1Br1O2_1_7266.vasp,HfPdIBrO2,-3.5573775583333336,0.5566369508333332 -C18_191_2720.vasp,C18,-7.266706712777777,0.8496186972222226 -In2Se2I1Br1_6_8581.vasp,In2Se2IBr,-1.3753533633333335,0.0637074355208318 -Cu1Bi1Sb2S6_143_4852.vasp,CuBiSb2S6,-2.135966772,0.0405688468749954 -In4Br4_129_8667.vasp,In4Br4,-0.99473987125,0.3281265037500001 -Sc1In1S3I2_1_15949.vasp,ScInS3I2,-2.2675693671428574,0.18776618812499657 -Ca3Co2S5I2_123_3165.vasp,Ca3Co2S5I2,-2.3383680341666664,0.16961345897916413 -Ta2S4Cl4_12_17859.vasp,Ta2S4Cl4,-3.619748028,0.09954362947499762 -Nb4Pt6Se10_59_13133.vasp,Nb4Pt6Se10,-3.1964616225,0.25339054784375015 -N2Cl6_31_11780.vasp,N2Cl6,-1.2834031825,0.25249086 -Rb2Cd4Te2Br6O6_31_14823.vasp,Rb2Cd4Te2Br6O6,-1.4627793525,0.25219050100000007 -Bi2As2O6_7_2416.vasp,Bi2As2O6,-4.121760665,0.04985523499999989 -B2S2_187_1700.vasp,B2S2,-4.764798335,0.03888643749999954 -Zn1H2S2_164_20954.vasp,ZnH2S2,-2.20517683,0.2106091793 -V1W1S2_8_19956.vasp,VWS2,-3.6690187725,0.4274472070833282 -Mn4Se2Br4O1_2_11452.vasp,Mn4Se2Br4O,-2.0973363145454544,0.044303270909089254 -Na4B1S4_38_12366.vasp,Na4BS4,-2.6387600433333334,0.3099366405555525 -Ca4Cu2_11_3212.vasp,Ca4Cu2,0.5973658766666666,0.26511180166666665 -Ge4Te4_57_6953.vasp,Ge4Te4,-2.19222247125,-0.72898114625 -Li2Sb2P8O24_13_10063.vasp,Li2Sb2P8O24,-5.233560368333333,0.1793759983611114 -K2Hg2C4I2N4_51_9170.vasp,K2Hg2C4I2N4,-3.708679402857143,-0.003570187553373516 -Mn4S2N3F2_164_11450.vasp,Mn4S2N3F2,-3.5437206436363637,0.4849579460606033 -Nb3Sb1Te6_1_13008.vasp,Nb3SbTe6,-3.010322806,0.2911171983124998 -Tb2I2_164_18201.vasp,Tb2I2,-1.68831125,0.10282033249999833 -Fe2Se1S1Br4_8_5969.vasp,Fe2SeSBr4,-1.22343003125,-0.08192950927083326 -Hf1Mg6Nb1_25_7206.vasp,HfMg6Nb,-0.93104819625,0.32363924250000004 -Sr2Cu1Te2F2_38_17210.vasp,Sr2CuTe2F2,-1.7015512457142858,0.5999433099999963 -Sn2P4O12_7_16827.vasp,Sn2P4O12,-5.2139966116666665,-0.04643127111111056 -Zr2O2F2_59_21616.vasp,Zr2O2F2,-5.543848919999999,0.3454980576388844 -Tl2Cl6_1_19395.vasp,Tl2Cl6,-0.62761416,0.11567733000000002 -Tm1F2_164_19664.vasp,TmF2,-3.66981642,0.7201495561111072 -Cr2S2_123_4470.vasp,Cr2S2,-3.22348903,0.5565220249999998 -Rb2Be2_11_14777.vasp,Rb2Be2,0.4761761275,0.9970573650000002 -Zr1O2_187_21389.vasp,ZrO2,-6.311651746666667,0.8713373966666671 -Te4Au4Br4_14_18573.vasp,Te4Au4Br4,-0.2546052458333333,0.10660867583333339 -Sn1O1F1_1_16657.vasp,SnOF,-3.0644471566666667,0.45930205874999985 -V2S4_127_20166.vasp,V2S4,-2.90607736,0.8488814733333334 -Ag2C8Br4O4_2_236.vasp,Ag2C8Br4O4,-4.391808941666667,0.35627389722221814 -Sb1S1Cl1_156_15487.vasp,SbSCl,-2.00888193,0.2719941208333334 -Al1Cd1Ga1S4_156_620.vasp,AlCdGaS4,-2.5140027742857143,0.14485071928571425 -Hg1O1F2_156_7884.vasp,HgOF2,-0.6408379825,0.5335106334374999 -Hg2Te2_164_8035.vasp,Hg2Te2,0.6462637175,0.17029669583333334 -Co1Ni1F6_10_3784.vasp,CoNiF6,-1.79249896375,0.067429285 -Zr1Nb1I1Br1O2_8_21341.vasp,ZrNbIBrO2,-4.3295377083333335,0.5928600273958264 -Li1Ti2S4_164_9801.vasp,LiTi2S4,-4.873477618571428,0.012892784999995577 -P2I6_12_13987.vasp,P2I6,-0.6960802825,0.08242568249999965 -Cr2Ge2Se6_162_4388.vasp,Cr2Ge2Se6,-2.5973511819999997,0.20098293508333143 -Ag1Ge1I1Br1O2_6_59.vasp,AgGeIBrO2,-2.0264440833333333,0.3203181557291672 -Hf1Ti3Se8_1_7343.vasp,HfTi3Se8,-4.2782084241666665,0.25810753291666666 -Zr6S2O18_147_21863.vasp,Zr6S2O18,-6.212672984230769,0.13721878499999418 -Ge2W2O8_13_6897.vasp,Ge2W2O8,-5.1613466699999995,0.3729708249652739 -Mo2I1Br1N2_6_11620.vasp,Mo2IBrN2,-3.6735486466666667,0.2136252578472222 -Hf3Zn1I3Br1O4_8_7747.vasp,Hf3ZnI3BrO4,-4.260752732499999,0.30777215259548374 -Tl2Re12Se16Cl6_2_19492.vasp,Tl2Re12Se16Cl6,-3.954438401111111,0.07263306611111098 -Ba4Sb4H4S8_14_2178.vasp,Ba4Sb4H4S8,-2.9168422055,0.22321134302083034 -Cu1Ag1P2Se5S1_1_4820.vasp,CuAgP2Se5S,-1.958613442,0.18509102711457875 -As4O6_4_1336.vasp,As4O6,-4.40649779,0.07873978199999954 -K2Zn2P4H6O16_2_9395.vasp,K2Zn2P4H6O16,-4.543708591666667,0.061200145166661724 -Hg1Au1Br1Cl3_1_7835.vasp,HgAuBrCl3,0.2054228233333333,0.10378874541666673 -Fe2Se4Cl2_11_5983.vasp,Fe2Se4Cl2,-1.489343485,0.41475623359375 -Fe1Si4O6_1_5759.vasp,FeSi4O6,-5.01521723,0.7406334545454509 -Ni2Se2Cl2_59_13631.vasp,Ni2Se2Cl2,-0.94137324,-0.044747819999999994 -Cd2Ag2Se2F2_26_3447.vasp,Cd2Ag2Se2F2,-0.37765254875,0.044198255000000075 -Cs2Hg4Cl6O8_31_4726.vasp,Cs2Hg4Cl6O8,-1.150413859,0.28187446931250015 -Ru1F2_187_15270.vasp,RuF2,-1.8117431466666665,0.9401473483333307 -Te2Mo2I2_59_18407.vasp,Te2Mo2I2,-1.3924759016666668,0.330373553611111 -Na2Sb2Pd2_12_12296.vasp,Na2Sb2Pd2,-1.4026797183333333,0.17089423866666353 -Nd1B4_123_13214.vasp,NdB4,-4.646101076,1.2438106065000003 -Zr3B2S2F2_187_21741.vasp,Zr3B2S2F2,-4.223380766666667,0.9167214522222081 -Y1S1I1_156_20663.vasp,YSI,-3.8398501666666665,0.14270150166666662 -Mo3N2F2_187_11712.vasp,Mo3N2F2,-4.412492461428571,0.09955181119046763 -Li2Cl2O4_113_9859.vasp,Li2Cl2O4,-2.79827396375,0.18501997374999757 -K5N1O4_1_9535.vasp,K5NO4,-2.368567628,0.18378972450000064 -Hg4S4N4_2_8087.vasp,Hg4S4N4,-1.6920279491666665,0.2900311649999985 -Rb2Ru2N2Cl10O2_11_14927.vasp,Rb2Ru2N2Cl10O2,-2.3014938705555554,-0.09265712375000368 -As2Pb2N2O6F6_7_1253.vasp,As2Pb2N2O6F6,-3.0919025066666666,0.6179949143888778 -Sm2Al4Cl16_13_16563.vasp,Sm2Al4Cl16,-2.339338557272727,0.21668043242424007 -Dy2Br2O2_129_5518.vasp,Dy2Br2O2,-4.7941484433333335,0.05359937666666603 -Mn2P2I2O4_10_11185.vasp,Mn2P2I2O4,-3.3702087769999998,0.4840016919259226 -In4Br4_57_8666.vasp,In4Br4,-0.99463157125,0.32823480375 -Al1Tl1Hg1O4_156_755.vasp,AlTlHgO4,-2.9517475985714285,0.423386798273808 -Fe2Cl6_189_5839.vasp,Fe2Cl6,-0.81138617,0.22646155312500005 -La2Si1_164_9614.vasp,La2Si,-3.128037256666667,0.5530182516666629 -Er6F7_2_5582.vasp,Er6F7,-3.536867206153846,0.44489728237179094 -Ge8Rh2_125_6975.vasp,Ge8Rh2,-2.956270138,-0.3456222934999995 -Hf2Hg2_129_7507.vasp,Hf2Hg2,-1.5296403075,0.3601628184482757 -Co1B4Br2N2F4_47_3699.vasp,CoB4Br2N2F4,-4.226827572307692,0.2766099035256304 -Hf4S4I1Br1Cl2_35_7809.vasp,Hf4S4IBrCl2,-4.295081085833334,-0.009200918125011337 -Au4I4O4_14_1573.vasp,Au4I4O4,-0.5393799858333334,0.6466951463333315 -Pb3Se2I2O6_5_14308.vasp,Pb3Se2I2O6,-2.9197869823076923,0.0890135938461536 -Cd2Sn2O6_162_3581.vasp,Cd2Sn2O6,-3.068020797,0.2013652579999996 -Tl1Cl2_187_19244.vasp,TlCl2,-0.6215218066666667,0.017686388333333358 -Nb1I4_123_12524.vasp,NbI4,-1.055488424,0.38484450149999994 -Al2Br6_1_779.vasp,Al2Br6,-1.49531095,0.16529719500000017 -Zn1Ge1S1Br2_1_20943.vasp,ZnGeSBr2,-1.34552829,0.11799899580000017 -Er2S2I2_59_5569.vasp,Er2S2I2,-3.2198838983333338,0.04758205166666629 -Co2As4S6Br4_11_3854.vasp,Co2As4S6Br4,-2.159416465625,0.31892344042762577 -Hf2Sn2S8_31_7621.vasp,Hf2Sn2S8,-3.8327339833333336,0.175191778333333 -Nb1Bi1As1_156_12469.vasp,NbBiAs,-3.5093259433333333,0.22045231333333 -Ag1W1S2I2_1_150.vasp,AgWS2I2,-1.7391206950000002,0.31780903364583346 -Hf1Sc1Br2O1_25_7293.vasp,HfScBr2O,-3.7857610540000004,0.6152864124090797 -Fe2P2H6C2O14_2_5905.vasp,Fe2P2H6C2O14,-4.9392665007692305,0.09494676533118399 -Ta2Pt2Se10_51_17838.vasp,Ta2Pt2Se10,-3.193963617857143,0.08460361035713992 -Sc1Br1Cl1O1_1_15910.vasp,ScBrClO,-3.241950485,0.4963272462499999 -Hg2F2_123_7958.vasp,Hg2F2,0.64510626,0.623682505 -C1F4_123_2729.vasp,CF4,-2.805381906,0.5100165499999996 -Be2Sb1_191_2266.vasp,Be2Sb,-1.8899987100000002,0.3719621708333313 -Ta2Se4Cl4_12_17879.vasp,Ta2Se4Cl4,-3.2166374259999997,0.14588780443333116 -Ga1Ag1Te6P2_149_6132.vasp,GaAgTe6P2,-1.6058276949999999,0.28429859016666537 -Th1Br2_187_18711.vasp,ThBr2,-2.99408465,0.1051048933333334 -Pd2Br2_164_14402.vasp,Pd2Br2,-0.52036781,0.3202404975 -Mo2As2S6_12_11562.vasp,Mo2As2S6,-3.167142286,0.29648887237499766 -Hf1Cd1Te1Se1_1_7140.vasp,HfCdTeSe,-2.026348265,-0.17742873500000034 -Fe2O6_31_5899.vasp,Fe2O6,-3.4017647275,0.24398204250000033 -Ta2Co2Te10_51_17704.vasp,Ta2Co2Te10,-2.4502927278571427,0.06747120005951801 -K2Nb6O16_59_9266.vasp,K2Nb6O16,-6.366049490833333,0.0561709541666664 -Fe2P2S4F2_26_5915.vasp,Fe2P2S4F2,-2.853037376,0.010178674560600925 -Ta4Co2Pd1Se12_12_18021.vasp,Ta4Co2PdSe12,-3.6998855489473685,0.08068783473684205 -C2Cl8_1_2745.vasp,C2Cl8,-1.5287800280000001,0.346827432 -Mn2Br2_129_11033.vasp,Mn2Br2,-0.727727285,0.7486641588146553 -K2H6C4N16O4_2_9141.vasp,K2H6C4N16O4,-5.5794668471875,-0.2914623482031262 -Zr3B2O2F2_38_21739.vasp,Zr3B2O2F2,-5.4193841166666665,0.49992210953702654 -Te2W2C1_12_18526.vasp,Te2W2C,-4.512267616,-0.03395727099999957 -Sn2Br6_1_16749.vasp,Sn2Br6,-0.84864400125,0.11541902906249901 -Cu1Pt1Cl6_5_4943.vasp,CuPtCl6,-0.68535858,0.060683249999999855 -Na2Mg1H4Se2S8_2_12193.vasp,Na2MgH4Se2S8,-2.6021429441176473,0.06997259362744623 -Fe2P2Se4Cl2_26_5920.vasp,Fe2P2Se4Cl2,-2.19783142,0.2208091014444425 -Sb1Te1Cl1_156_15509.vasp,SbTeCl,-1.4823115966666667,0.2624726233333332 -As4Se6_11_1372.vasp,As4Se6,-2.4953005480000003,0.11072446699999983 -Ga1Pt5F2_38_6252.vasp,GaPt5F2,-1.52137465375,0.6427410212190041 -Ta1Ni1S2_115_17588.vasp,TaNiS2,-3.5602299825,0.3188280314999987 -Hf3Cd1I1Br1Cl2O2_8_7699.vasp,Hf3CdIBrCl2O2,-3.7267052200000004,0.3182598968958302 -Nb2H2C1_164_12732.vasp,Nb2H2C,-5.654525374,0.16275649600000008 -Pt1N2_10_14579.vasp,PtN2,-4.7795162499999995,0.03358347833332975 -Tl1F1_99_19261.vasp,TlF,-0.775378525,1.1775935874999999 -Te6As2Au2_12_18638.vasp,Te6As2Au2,-1.073559249,-0.04556247541666952 -Sb2Mo2S10_7_15603.vasp,Sb2Mo2S10,-2.7810912942857144,0.39536097058035424 -Li2B2H6C8O2_51_9832.vasp,Li2B2H6C8O2,-4.861054588,1.1188867757894576 -Tb2Te6_129_18211.vasp,Tb2Te6,-2.43440830125,-0.7318711625000001 -Hf2Te2_187_7639.vasp,Hf2Te2,-3.57603719,0.6180357268750003 -Ga2Se4_12_6483.vasp,Ga2Se4,-1.977808245,0.45434973388888666 -Sn1W2O8_2_16708.vasp,SnW2O8,-5.3986668090909085,0.0555099463636326 -Sr2Cd1In1Cu1S5_99_17174.vasp,Sr2CdInCuS5,-1.8444215,0.2854883127499953 -Ga2Co1S4_156_6325.vasp,Ga2CoS4,-2.695829112857143,0.17367918101190205 -Nb6Si2S12_26_13197.vasp,Nb6Si2S12,-4.8277415945,0.10732944065151107 -As2P4H2O12_4_1244.vasp,As2P4H2O12,-4.713500382,0.4157701516666523 -Re2P1S4I1_1_15070.vasp,Re2PS4I,-3.604700215,0.584058015169266 -Ge2Te4_12_6889.vasp,Ge2Te4,-1.706035835,-0.2066130327777791 -Mn2Se2F2_59_11277.vasp,Mn2Se2F2,-2.458604036666667,0.09358 -Sr1I2_187_17060.vasp,SrI2,-1.1199023066666667,0.1661410522222222 -Al1Pt5I2_38_718.vasp,AlPt5I2,-1.56241048375,0.15678763662500006 -Zn2Fe3O8_10_21076.vasp,Zn2Fe3O8,-3.05419177,0.24731138552884052 -Fe2P2H10C2O8_31_5904.vasp,Fe2P2H10C2O8,-4.745351070416667,-0.15648526503472526 -K4P2Au2S8_11_9487.vasp,K4P2Au2S8,-1.9499179725,0.2949903293749998 -K1Mo2S2Cl6_47_8920.vasp,KMo2S2Cl6,-1.917807309090909,0.26517943578671166 -As2Pb2O6F2_7_1254.vasp,As2Pb2O6F2,-3.7897909166666666,0.1559471433333336 -Mo2Se1S1I1Br1_6_11681.vasp,Mo2SeSIBr,-2.290464071666667,0.21186553993055546 -Cd3Au1_191_3607.vasp,Cd3Au,2.3564343025,0.5753107058333333 -P2Br6_162_13962.vasp,P2Br6,-1.15482503,0.14058547499999885 -Ba1Cl2_164_1818.vasp,BaCl2,-2.4379528533333334,0.28624253 -P2Ir2S6_162_13993.vasp,P2Ir2S6,-3.402088843,0.37304424424999794 -Ag4Te2_51_572.vasp,Ag4Te2,0.26882364833333333,0.22173832 -Fe1Ru1Br2O2_1_5741.vasp,FeRuBr2O2,-2.5616748166666667,0.3477369266666668 -Na2Hg4Te2O6F6_31_12173.vasp,Na2Hg4Te2O6F6,-1.6947703345,0.276916558887492 -Ho4Te8Cl4O20_2_8154.vasp,Ho4Te8Cl4O20,-4.224516149722223,0.034847141111110425 -Al4Br4_39_1063.vasp,Al4Br4,-1.34436712375,0.5706985945833318 -Na2I2O6_11_12181.vasp,Na2I2O6,-2.754777527,0.1864545135000002 -Co2Te2I2_59_4035.vasp,Co2Te2I2,-1.0879124116666665,0.052492243333333466 -Zr2S3I1_3_21656.vasp,Zr2S3I,-3.829559125,0.3082563903819413 -Ru3Se4_164_15370.vasp,Ru3Se4,-2.88350441,0.45443112214285364 -Pb1Au1S1Br2_1_14170.vasp,PbAuSBr2,-0.853818572,0.26725126000000027 -Zr2Cl6_162_21553.vasp,Zr2Cl6,-2.81497716625,0.15468569 -Zr2Ti2Te8_25_21725.vasp,Zr2Ti2Te8,-3.1706559750000003,0.2494309124999996 -Ca2Ag1Cl2O2_38_2903.vasp,Ca2AgCl2O2,-2.581285747142857,0.08993611800751455 -Li4Te2O6_5_10230.vasp,Li4Te2O6,-4.0660895833333335,0.04391218958333365 -Sb2W2S6_2_15750.vasp,Sb2W2S6,-3.3630107049999998,0.4074506631666651 -V2Pd1Se4_164_20146.vasp,V2PdSe4,-2.73342461,0.028948924047615954 -Al1Pd5F2_123_710.vasp,AlPd5F2,-1.3220552925,0.9630122641666643 -In1Cu1Sb2Se6_149_8236.vasp,InCuSb2Se6,-1.696497663,0.32833009833333116 -Na2Ni2Sb2_12_12239.vasp,Na2Ni2Sb2,-0.7398937433333334,0.23291687092592492 -Cr2Ag2Sb4Se12_13_4302.vasp,Cr2Ag2Sb4Se12,-1.8545331489999999,0.2140369893333316 -Ba1H2O2_164_1834.vasp,BaH2O2,-4.338948362,0.11819963000000033 -Ag1I2_187_84.vasp,AgI2,0.5903322599999999,0.23159306729166693 -Ti1Bi2_164_18746.vasp,TiBi2,-2.8460196,0.5170271191666633 -Gd2F6_12_6610.vasp,Gd2F6,-4.35358855375,0.33511037062500026 -Li2Te2H2O8_6_10083.vasp,Li2Te2H2O8,-3.895974552857143,0.15520331190475822 -Sb2F8_1_15580.vasp,Sb2F8,-2.4695046,0.2626333030000003 -Rh2S4_14_15227.vasp,Rh2S4,-2.5577341616666667,0.6230337416666638 -W2N1_164_20511.vasp,W2N,-5.504772106666667,0.8134486288888834 -H4Pd1C8F2_25_7080.vasp,H4PdC8F2,-5.112564886666666,0.6450446573333277 -Cu1Ge1F6_2_4879.vasp,CuGeF6,-2.19395850125,0.01036904999999999 -Nb6Sn2Te12_26_13202.vasp,Nb6Sn2Te12,-3.1329956500000002,-0.5694170635000035 -Ba4Ga2Sb2Te10_31_2155.vasp,Ba4Ga2Sb2Te10,-1.8624970244444445,0.24111060972222198 -Te2Ir2F2_11_18393.vasp,Te2Ir2F2,-2.2551474099999997,0.6893360608333303 -Na1Ga1As2Se6_5_11859.vasp,NaGaAs2Se6,-2.190873235,0.276308037333331 -C6N2_4_2778.vasp,C6N2,-6.74106828625,1.07784995 -Ti2I8_1_18963.vasp,Ti2I8,-1.383675008,0.23935808699999983 -Fe2Cl2_164_5837.vasp,Fe2Cl2,-1.01197731,0.7856979475 -Ca4Te4O12_14_3245.vasp,Ca4Te4O12,-4.1223456585000005,1.865654341499999 -Co4N2O12_4_4081.vasp,Co4N2O12,-4.129471276666667,-0.4019132164583369 -Pb6Se2O10_26_14336.vasp,Pb6Se2O10,-3.4081247377777775,0.1423023350000001 -Zr2O2_187_21618.vasp,Zr2O2,-5.8793430425,0.6619259641666666 -Th2Te6_59_18730.vasp,Th2Te6,-3.118417655,0.06792144749999984 -Sb4Pb4S10_2_15803.vasp,Sb4Pb4S10,-2.5294758133333333,-0.38751352555555574 -Sn1Sb2S4_164_16687.vasp,SnSb2S4,-2.6388369385714285,0.06796678178571236 -In2Sb2S6_11_8565.vasp,In2Sb2S6,-2.577268784,0.1018638704999999 -Zn1Fe1Se2_8_20931.vasp,ZnFeSe2,-0.80445502,0.23724307562499997 -Nb2I6_189_12753.vasp,Nb2I6,-1.552308085,0.2646960335937485 -Ga2H10N4Cl4_10_6371.vasp,Ga2H10N4Cl4,-3.7669721765,0.13100961012500023 -Cu4Se3_123_5471.vasp,Cu4Se3,-0.6567128214285713,-0.26712488333333384 -Ru2O2_6_15332.vasp,Ru2O2,-3.73067973,1.0415920100000002 -Mg1In2Se4_164_10382.vasp,MgIn2Se4,-2.08104089,0.040890341428571286 -Cu2Sb4Se3F2_6_5282.vasp,Cu2Sb4Se3F2,-1.6002475445454545,0.7937861603030261 -Al2P6_164_927.vasp,Al2P6,-3.47845747125,0.01184151875000028 -Fe1Se2_115_5754.vasp,FeSe2,-1.3348109733333333,0.9670477849999999 -Sn3Bi2S9_174_16911.vasp,Sn3Bi2S9,-2.2312324514285717,-0.03228065964285998 -Sn6As6_12_16979.vasp,Sn6As6,-2.1987016691666668,0.16520118333333317 -Na2Ru2C2I8O4_7_12276.vasp,Na2Ru2C2I8O4,-2.3794914755555556,0.08628131999999772 -Mn1Bi1S1I2_1_10647.vasp,MnBiSI2,-1.2479552740000002,0.22738589533333264 -V2W2Se8_25_20231.vasp,V2W2Se8,-3.4285409816666665,-0.15950893749999984 -Mn2Se2I2_59_11278.vasp,Mn2Se2I2,-1.4695518300000001,0.04189588583333337 -Li1Mo2I6O2_47_9751.vasp,LiMo2I6O2,-1.919124479090909,0.11278772366477163 -Nb4S12I2_2_13137.vasp,Nb4S12I2,-3.7249845150000005,0.13931629444444038 -Ta2Te8Ru2_11_17929.vasp,Ta2Te8Ru2,-3.0320932625,0.1523457769444445 -Cr2B1O2_164_4322.vasp,Cr2BO2,-4.67549121,1.3180954391111062 -K4Hg1As2_164_9458.vasp,K4HgAs2,-0.24692557714285715,0.09074658714285713 -Li2Fe2F8_13_9906.vasp,Li2Fe2F8,-2.6953754224999997,0.08556472250000047 -Nb3Te1Se3S1Br2_1_13025.vasp,Nb3TeSe3SBr2,-3.401029615,0.3375618529603099 -Li2Ag2C4O8_2_9820.vasp,Li2Ag2C4O8,-4.876382214375,0.23802970812500046 -Se2_51_16294.vasp,Se2,-1.58554161,0.7224469433333334 -Cu2Sb2Se6_12_5270.vasp,Cu2Sb2Se6,-1.419603977,0.38445526411110914 -Ag1Bi2F12_2_30.vasp,AgBi2F12,-1.6363410686666666,-0.0177395663333344 -Sn3N4_5_16918.vasp,Sn3N4,-4.0710052985714285,-2.026329293571429 -Ta2B1F2_164_17652.vasp,Ta2BF2,-5.770110898,0.0790325568999905 -Ga6Te6_12_6587.vasp,Ga6Te6,-1.7903527108333332,0.1428475050000002 -Li1O1_187_9772.vasp,LiO,-2.932667645,1.0217525950000002 -Fe2Si2Sb1O9_8_5990.vasp,Fe2Si2SbO9,-4.936412307142858,0.1645371785118961 -Ta2N1Cl2_164_17778.vasp,Ta2NCl2,-5.39165239,0.3650467426666677 -Bi4W2S12_4_2658.vasp,Bi4W2S12,-2.9214129266666666,-0.33221401173611365 -Rh2S1Br2O1_1_15212.vasp,Rh2SBr2O,-1.9429718366666666,0.48258883940277264 -Na4H20S2O10_51_12389.vasp,Na4H20S2O10,-3.906088272222222,0.08676606222222194 -Eu2P6O14_2_5605.vasp,Eu2P6O14,-5.598422969090909,0.10284305963635942 -Zr2S2_123_21654.vasp,Zr2S2,-4.2009432375,0.4682477875000002 -Hg1Bi2S4_12_7840.vasp,HgBi2S4,-1.7149229914285713,0.17102714500000005 -Ba2Br2F2_129_1926.vasp,Ba2Br2F2,-2.96380053,0.0703301900000004 -V2F6_162_20062.vasp,V2F6,-3.5023529875,-0.4292606750000001 -Cu4Bi7S12_10_5397.vasp,Cu4Bi7S12,-1.8886763669565216,-0.20224927217391458 -Ag4S4_2_555.vasp,Ag4S4,-0.79565342625,0.17257553859375002 -Na4Hg2F8_11_12394.vasp,Na4Hg2F8,-1.64312737,0.029468016428569666 -Zn2Ge2O6_162_21088.vasp,Zn2Ge2O6,-3.706485166,0.12821614491666233 -Ta2Ni2Se6_11_17797.vasp,Ta2Ni2Se6,-3.099325438,-0.1040914082000024 -Ir3Pd1S4Br4_35_8854.vasp,Ir3PdS4Br4,-2.184920695,-0.003507869166670119 -Fe2As2S4Cl2_26_5780.vasp,Fe2As2S4Cl2,-2.430372113,-0.2623057410416685 -Ti2C1Cl2_164_18908.vasp,Ti2CCl2,-5.5240146459999995,0.02505955000000082 -U2Te2O2_129_19731.vasp,U2Te2O2,-6.2952495483333335,-0.013276242708333275 -Sc7F10_2_16278.vasp,Sc7F10,-3.895962914705882,-0.1943180818627469 -Pb6N4_59_14329.vasp,Pb6N4,-2.797268362,0.21314355900000048 -Sc1Pd2Br2N1_3_15981.vasp,ScPd2Br2N,-2.40648479,0.47952172583333075 -Ta2Pd4S6_11_17830.vasp,Ta2Pd4S6,-3.375047584166667,0.18459150691666082 -Fe2C1O2F2_164_5827.vasp,Fe2CO2F2,-2.5275151542857146,1.6032722642857076 -Sn2As2_164_16730.vasp,Sn2As2,-2.073861055,0.29004179749999986 -Sb4Se4O20F4_14_15825.vasp,Sb4Se4O20F4,-3.3877894334375,0.25668585782365794 -Y2Sn1_164_20781.vasp,Y2Sn,-2.9626399666666665,0.9659617961111076 -Sn8O12_14_17005.vasp,Sn8O12,-3.965187198,0.14620253199999578 -Cr2Cu2Te12As4_13_4375.vasp,Cr2Cu2Te12As4,-1.5395533445,0.20719433108333188 -Li2Te2H2_4_10084.vasp,Li2Te2H2,-2.350739645,-0.7876657522222246 -Ir2Br4_11_8768.vasp,Ir2Br4,-1.017603575,0.7026080761111095 -Te2W1_115_18522.vasp,Te2W,-2.2104053233333336,0.8344926283333329 -B3W4Cl2_164_1741.vasp,B3W4Cl2,-5.031126643333334,0.23995221740740158 -As4Au2Se3Br2_6_1318.vasp,As4Au2Se3Br2,-1.4725183945454545,0.3348708434090879 -As2Pd3Se8_164_1275.vasp,As2Pd3Se8,-1.870337543076923,0.2735993663846136 -Nd1Ge5_47_13221.vasp,NdGe5,-2.956049151666667,-0.061839168333336136 -Tl1Pd5F2_38_19321.vasp,TlPd5F2,-0.732141075,0.9679978962499999 -Mn3C12_164_11360.vasp,Mn3C12,-5.248980745333333,1.6760733366666605 -Hg3Br6_143_8054.vasp,Hg3Br6,0.5141373833333334,0.08722005000000005 -Al2Br6_162_777.vasp,Al2Br6,-1.6312535225,0.029354622500000094 -In2S2_164_8551.vasp,In2S2,-2.21429783,0.06537233500000017 -Zn2H4Se2S8_7_21101.vasp,Zn2H4Se2S8,-2.1956591775,0.2571768473229165 -Ta1Bi2_164_17514.vasp,TaBi2,-3.05757154,0.21630005333333058 -Li2V4O10_59_10133.vasp,Li2V4O10,-5.291812389375,0.17794928249999487 -Ni1H16Au2C8N8_10_13321.vasp,NiH16Au2C8N8,-4.909315597714286,-2.6415514082381066 -Mo2N2_12_11640.vasp,Mo2N2,-5.27745434,0.4463434899999994 -Tl2Te4_12_19555.vasp,Tl2Te4,-0.67806904,0.40692055777777647 -Tl2Te3_5_19554.vasp,Tl2Te3,-0.46667136600000003,0.520959 -Cu6As4S10_2_5492.vasp,Cu6As4S10,-1.9473073835,0.20825872493749598 -Al2O1_164_910.vasp,Al2O,-3.7467703633333334,0.7325182644444395 -Fe2Cu1O4_187_5842.vasp,Fe2CuO4,-3.220610962857143,0.21368328964285227 -Tl8Ge4Pb4S16_14_19648.vasp,Tl8Ge4Pb4S16,-2.2463658340625,0.10715789875000015 -Li1Al1P2O6_5_9642.vasp,LiAlP2O6,-5.385997025,0.26661171465999556 -Mo3N2_187_11714.vasp,Mo3N2,-4.477149664000001,0.9381142753333274 -Te4P4Pt4_13_18608.vasp,Te4P4Pt4,-2.666111863333333,0.395825055 -Al1Ru1Br2F1_8_720.vasp,AlRuBr2F,-2.067801698,0.7226929963333301 -Na2Os2S4Br8N2_7_12254.vasp,Na2Os2S4Br8N2,-2.1850089711111114,0.06607640423610939 -Mn2Ga2Se4_1_11078.vasp,Mn2Ga2Se4,-2.0969368975,0.22824174034482747 -Ge1As1S1I1_1_6636.vasp,GeAsSI,-2.119558315,0.32436655789062496 -K2V2Cu4S8_28_9385.vasp,K2V2Cu4S8,-2.146325551875,0.19774734375000014 -Cr3Mo1Se8_25_4563.vasp,Cr3MoSe8,-2.7828088716666666,0.05340864541666679 -Ti4Te4F4_31_19167.vasp,Ti4Te4F4,-4.022589171666667,-0.07687367277778545 -Hg1S1F2_1_7907.vasp,HgSF2,-0.79250976,0.31072197989583183 -Al2Co2Se5_187_806.vasp,Al2Co2Se5,-2.5603324300000003,0.036913772148143065 -Y5I8_10_20844.vasp,Y5I8,-2.438128767692308,0.10385631294871489 -Sr2Br4_2_17156.vasp,Sr2Br4,-1.5306949516666668,0.31247406499999997 -Ba4Ge4Te10_4_2157.vasp,Ba4Ge4Te10,-2.0083633044444444,0.3299226472222223 -Zr4H2C3S2_164_21822.vasp,Zr4H2C3S2,-5.578868933636364,0.3079945496969634 -Sr2Sb2Se4F2_129_17310.vasp,Sr2Sb2Se4F2,-2.8111560090000003,0.01977565249999358 -Cd1H4C2N4F2_1_3347.vasp,CdH4C2N4F2,-4.426976419230769,0.14543891217948268 -In2O2_187_8509.vasp,In2O2,-3.1581928675,0.4221263300000002 -Fe8S10_75_6101.vasp,Fe8S10,-1.9664021744444444,0.0001498505555538321 -Bi2Sb2O6_2_2524.vasp,Bi2Sb2O6,-3.7967134729999996,0.22924329936363042 -Ba2I4O2_26_2004.vasp,Ba2I4O2,-1.876155845,0.3000332427083332 -Sc2O2_129_16113.vasp,Sc2O2,-5.2714103525,0.6192978954687498 -Sb2W2S10_13_15749.vasp,Sb2W2S10,-3.1984845285714285,0.28074489272321124 -H4Pb6O8_81_7069.vasp,H4Pb6O8,-3.5570954672222226,-0.027637290115743673 -Te6Mo2_11_18656.vasp,Te6Mo2,-1.80542402375,0.17069310291666656 -W12I24_127_20406.vasp,W12I24,-1.9828943327777777,0.08779622027777778 -Cs2C2Se2Cl6O6_4_4675.vasp,Cs2C2Se2Cl6O6,-2.731103864444444,0.5260083804166631 -Mo2Se4_127_11695.vasp,Mo2Se4,-1.76414053,1.2812726933333336 -Pb8I2F14_51_14337.vasp,Pb8I2F14,-2.381321755,0.05881680822916635 -Cu2Se2N1O10_12_5301.vasp,Cu2Se2NO10,-2.7003595446666666,0.727520303666664 -Ni1H4C8Cl2_25_13352.vasp,NiH4C8Cl2,-4.9221720179999995,0.429317671333328 -Pd3S5Br1Cl1_1_14509.vasp,Pd3S5BrCl,-1.646988104,0.22775397499999517 -Tl2Co2Se5_156_19399.vasp,Tl2Co2Se5,-1.5256913066666666,0.4752234160493808 -Li6Te2H2O8_11_10278.vasp,Li6Te2H2O8,-4.137358081666666,0.057162962222222724 -Pt4Se1S1Br5Cl1_1_14708.vasp,Pt4SeSBr5Cl,-1.0995888425,0.11839810249999727 -Cr2Te12P4Au2_13_4515.vasp,Cr2Te12P4Au2,-1.7080286245,0.2384730342916651 -V1Cr1Se1Br1_25_19808.vasp,VCrSeBr,-2.457544535,0.72856297989583 -Pd6S6Cl6_6_14527.vasp,Pd6S6Cl6,-1.5417599494444445,0.08832980326388862 -P2Ru2S6_157_14043.vasp,P2Ru2S6,-3.465067617,0.1841293474999932 -Zn1Ga1Ni3Te2P3Ru1I1Cl3_1_20933.vasp,ZnGaNi3Te2P3RuICl3,-1.4546696246666668,0.11915448546180064 -As1Cl2_164_1142.vasp,AsCl2,-1.1255008366666666,0.6472134344444429 -Zr1Ta1S2I2_25_21453.vasp,ZrTaS2I2,-3.6875101850000003,-0.03766153157408114 -Al2C4Cl4F10_10_782.vasp,Al2C4Cl4F10,-3.0445426285,0.6627131275000002 -Au1Br2_115_1414.vasp,AuBr2,0.47553304333333335,0.29330335541666686 -Ge6Bi2_191_6956.vasp,Ge6Bi2,-1.859835355,-0.11338663749999989 -Li2Nb4O11_12_10016.vasp,Li2Nb4O11,-6.409399704117647,-0.0914268474264747 -Mn3Se1N1O2_99_11407.vasp,Mn3SeNO2,-3.8562255242857146,0.4698913871428525 -Al4S4Cl4_14_1085.vasp,Al4S4Cl4,-3.017931475833333,0.03223895916666697 -Fe2N1O2_164_5883.vasp,Fe2NO2,-3.684500088,0.4236369536666581 -Bi2S2Br2_11_2509.vasp,Bi2S2Br2,-1.7770024583333335,0.06167688833333318 -Mn1Al1S2I2_6_10624.vasp,MnAlS2I2,-2.155877265,0.09384414062499769 -Cu2Te2I2_59_5332.vasp,Cu2Te2I2,-0.08935724833333332,0.25714313452380927 -Cd1H4C4N2Cl2_10_3351.vasp,CdH4C4N2Cl2,-4.6261579323076925,0.16892102480767868 -W1Br2_12_20421.vasp,WBr2,-1.8759284999999999,0.7092457494444442 -Nb1Sn1Te1I1_156_12591.vasp,NbSnTeI,-1.9179644975,0.2254509552604136 -Y1V1Se1Cl1_6_20688.vasp,YVSeCl,-3.059933135,1.296813106249996 -As8W4O28_14_1408.vasp,As8W4O28,-4.948616446,0.06171978649999543 -Ni1Ir1Se1S1_1_13370.vasp,NiIrSeS,-1.84916947,0.20605863565971644 -In4Te4I4_14_8701.vasp,In4Te4I4,-0.9134865958333332,0.06404793000000009 -Ag2Te1Ir1Rh1Se3Br1Cl3_1_449.vasp,Ag2TeIrRhSe3BrCl3,-1.1940988558333332,0.14046641949999733 -Ag2N2Cl2_59_330.vasp,Ag2N2Cl2,-1.0918143433333334,1.2823793950000002 -Mn2F6_189_11066.vasp,Mn2F6,-2.4609096925,-0.11670546625 -Ag1As1I2O2_1_2.vasp,AgAsI2O2,-1.6707844533333331,0.3704475430208295 -Ga2Fe1Te4_156_6353.vasp,Ga2FeTe4,-1.3420245657142857,0.46048352119047453 -Bi2S2F2_59_2512.vasp,Bi2S2F2,-2.4174880566666666,-0.27878439583333525 -H2W2C1_164_7032.vasp,H2W2C,-4.967686276,0.7162098110000004 -Ca1Au1Br2_1_2801.vasp,CaAuBr2,-0.527514,1.29441942 -Mn1Te2_164_10912.vasp,MnTe2,-1.4325717066666668,0.3432240133333331 -Sb1Pb2Se6_162_15479.vasp,SbPb2Se6,-1.7730499,0.3904364924536994 -Cu4S4Br4_14_5450.vasp,Cu4S4Br4,-0.8890263608333333,0.12118019837301505 -Eu2Sb2S4O2_129_5606.vasp,Eu2Sb2S4O2,-4.353625031,-0.41563377566666915 -Mg3P2H16O16_1_10555.vasp,Mg3P2H16O16,-4.668331281621621,0.007945096666662321 -Ni2P1S2_187_13554.vasp,Ni2PS2,-1.928436198,0.10371011440908906 -B2S5_1_1703.vasp,B2S5,-3.705740014285714,0.20912661803571253 -Sb2As2S6_7_15533.vasp,Sb2As2S6,-2.7396242099999997,0.42211981425000045 -Sb1Se1_123_15502.vasp,SbSe,-1.697374765,0.6504029387499979 -P6H2S12_4_14136.vasp,P6H2S12,-3.1791186154999997,0.1269599409687473 -Te6P4_1_18674.vasp,Te6P4,-2.102217479,0.4592523690000002 -B2P2H6Pb2S6_7_1693.vasp,B2P2H6Pb2S6,-3.247466786111111,-0.29140465566468765 -Li4Co1P2O8_2_10174.vasp,Li4CoP2O8,-4.921804246,0.007270583777773343 -Y2Br2O2_164_20701.vasp,Y2Br2O2,-5.21990435,0.2747151133333334 -Zn5B2P1Pt1N1Cl6_1_21235.vasp,Zn5B2PPtNCl6,-1.333447435,0.6265562742230901 -Na2I2O4_113_12180.vasp,Na2I2O4,-2.3141346025,0.2356208470833323 -Sn2Os1_123_16800.vasp,Sn2Os,-2.314474316666667,-2.0899406700000003 -Ag2H12C16N8_2_265.vasp,Ag2H12C16N8,-5.681912949736843,-1.6839458307894832 -Rb2Hg4Se2Cl6O6_31_14877.vasp,Rb2Hg4Se2Cl6O6,-1.421732217,0.09558785578124998 -Ag2C2S2O6F6_147_225.vasp,Ag2C2S2O6F6,-3.3571146744444444,0.1600882882291573 -Al2S2_187_944.vasp,Al2S2,-3.4519581025,0.06811684145833086 -B8Se6_31_1793.vasp,B8Se6,-3.809202612857143,0.6494965290476139 -Mn1S2_164_10853.vasp,MnS2,-2.5405331099999997,0.8203115675000001 -Li3V4O11F1_1_10151.vasp,Li3V4O11F,-5.178830796842105,0.07684074042213743 -Sr2V2Si4O14_28_17340.vasp,Sr2V2Si4O14,-5.841041458636363,0.12417669501261519 -Sr2Cl4O4_7_17181.vasp,Sr2Cl4O4,-2.544913146,0.23777433450000052 -Bi2B13_164_2425.vasp,Bi2B13,-4.611857700666667,0.7899119572222181 -Na2Mg2As2_129_12202.vasp,Na2Mg2As2,-1.3055740083333334,0.5649726049999999 -Nb1Ga1Se1S1Br2_1_12511.vasp,NbGaSeSBr2,-2.7610530766666668,0.20029395185184495 -Sn4Sb4Te4_17_16967.vasp,Sn4Sb4Te4,-1.5409855766666667,-0.7559778991666674 -Hf2N2F2_59_7544.vasp,Hf2N2F2,-6.788718215,0.10736379958332698 -Sr4Bi4S8Cl4_14_17410.vasp,Sr4Bi4S8Cl4,-2.5160172845,0.13748059300000026 -Bi8Ru2Br4_12_2691.vasp,Bi8Ru2Br4,-1.4815895542857143,0.09501539071428566 -Cu1H1_156_4891.vasp,CuH,-1.062288955,2.1447975125 -Tl2Si2Se6_162_19542.vasp,Tl2Si2Se6,-2.231524661,0.23904768939583132 -Cd1_191_3440.vasp,Cd,2.86481304,0.0520148250000001 -Ni1C4N2Cl2F4_47_13295.vasp,NiC4N2Cl2F4,-4.164469048461538,0.013600322884603111 -Ag2W1Se4_111_492.vasp,Ag2WSe4,-1.8393714385714286,-0.2219135614285732 -P2H2Pb2O6_7_13977.vasp,P2H2Pb2O6,-4.580797301666666,0.07737033246881382 -Ca2P2H4O12_7_3085.vasp,Ca2P2H4O12,-4.650699095,0.24339084647916664 -Al2I6_189_881.vasp,Al2I6,-0.67262305625,0.30918321000000004 -Co2Te6_6_4053.vasp,Co2Te6,-1.36807220625,0.2579517137500001 -W2C2F2_59_20477.vasp,W2C2F2,-5.324825435,0.14079772652776623 -Te2Ru2Br2_59_18513.vasp,Te2Ru2Br2,-1.7726008283333332,0.39928822527777497 -Fe4H2C3O2_164_6079.vasp,Fe4H2C3O2,-3.7806096981818182,0.8757600773484763 -Bi8S20_14_2692.vasp,Bi8S20,-2.319911534642857,-0.5337859512500018 -Pd2Se16Cl4_14_14481.vasp,Pd2Se16Cl4,-1.5946703840909089,0.08888816522727283 -Fe2Sb2Pt2_129_5952.vasp,Fe2Sb2Pt2,-1.32616566,0.8169503016666645 -V4O10_11_20338.vasp,V4O10,-5.546108730714286,-0.08753014857142905 -P4S4_14_14110.vasp,P4S4,-3.41216482375,0.10161045839843785 -Tl1In1Hg1S4_156_19295.vasp,TlInHgS4,-1.4348894057142856,0.19121279776785427 -Hg1H2O2_12_7867.vasp,HgH2O2,-2.7167332120000003,0.17533166249999987 -Ni2F6_162_13505.vasp,Ni2F6,-1.24152703375,0.12225865999999996 -Au2Se2_129_1547.vasp,Au2Se2,-0.14803854,0.52808174 -Bi16Cl4_10_2306.vasp,Bi16Cl4,-1.2121349719999999,-0.4923535196666676 -Nb2Mo1I1Br1O2_1_12761.vasp,Nb2MoIBrO2,-4.062631588571429,0.6998957030952276 -Na2Pd3O4_47_12267.vasp,Na2Pd3O4,-2.662386333333333,0.10489161740740494 -Cu1Te1Au1Se1I1Br1_1_4986.vasp,CuTeAuSeIBr,-0.260683015,0.2091255107879678 -Nb4Co2Te10_59_13056.vasp,Nb4Co2Te10,-2.8645139775,0.08732992505208315 -In1Fe5I2_123_8249.vasp,InFe5I2,0.01183554875,1.5770988956249998 -Sn3Bi4_5_16913.vasp,Sn3Bi4,-1.0628710885714285,-1.9135565849999987 -Li4S4O8_13_10221.vasp,Li4S4O8,-4.21571236875,0.1830111986718752 -Tl1Ag1Te6As2_149_19210.vasp,TlAgTe6As2,-1.17062984,0.17694655708333185 -Na2C4Se2_31_12011.vasp,Na2C4Se2,-3.8835194925,1.170349983125 -K2Cd4Te2Br6O6_31_9066.vasp,K2Cd4Te2Br6O6,-1.452453354,0.25333895375000004 -Ag1H4C6S2N6_6_76.vasp,AgH4C6S2N6,-5.424174932105263,0.15104650786183482 -Tc4Br10_13_18243.vasp,Tc4Br10,-2.095866317857143,0.484197871071426 -Cu2C12N12_31_5059.vasp,Cu2C12N12,-6.360914753461539,0.2756053680769155 -Pt2O2_187_14643.vasp,Pt2O2,-2.1115457075,1.0012903943750002 -Zn2Sb4S8_4_21162.vasp,Zn2Sb4S8,-2.1557515421428572,0.1875749991428559 -Na2Ge1H6S6_147_12086.vasp,Na2GeH6S6,-2.9606040453333335,0.12495243766666664 -Cr1Cl2_164_4142.vasp,CrCl2,-2.1931450966666666,-0.11824481555555733 -Re2Cl2_129_15037.vasp,Re2Cl2,-2.930412975,1.4615788555555522 -Sn2Hg1S2F2_12_16779.vasp,Sn2HgS2F2,-1.7038350071428572,0.21029707428571098 -Cr3O8_10_4569.vasp,Cr3O8,-4.61558551,-0.06319548437500444 -Br10N2_51_2703.vasp,Br10N2,-0.24029267083333336,0.6766115245833297 -Na4Sb4Mo4O20_14_12412.vasp,Na4Sb4Mo4O20,-4.5093424509375,0.13118565968749962 -Y2Br6_191_20705.vasp,Y2Br6,-2.73736059375,0.16749273749999993 -Y1I2_164_20643.vasp,YI2,-2.314680743333333,0.08808206611110908 -Ga2I6_26_6394.vasp,Ga2I6,-0.49507338125,0.11809507937499997 -Be1Cl2_115_2218.vasp,BeCl2,-2.5672127000000002,0.08279071333333299 -Ta2P2S6_2_17821.vasp,Ta2P2S6,-4.401656833,0.2542369969999956 -Bi1H2S2_164_2339.vasp,BiH2S2,-2.589520432,0.07190344924999537 -Mn2As2S6_162_10978.vasp,Mn2As2S6,-2.8648255689999997,0.3556412248749976 -Sn1Au1F6_2_16605.vasp,SnAuF6,-1.68494913875,0.2117767877777763 -Ta2Co2S10_51_17700.vasp,Ta2Co2S10,-3.776164814285714,0.2294679217857114 -Fe1C8F6_25_5654.vasp,FeC8F6,-4.788591787333333,0.4494793061666635 -Zr2N2Cl2_59_21608.vasp,Zr2N2Cl2,-5.617497373333333,0.08476105999999994 -Nb4V2Zn4O16_13_13179.vasp,Nb4V2Zn4O16,-5.121174317692308,0.1630889366666562 -Fe1Bi1O3_1_5630.vasp,FeBiO3,-3.434179222,0.39690316625 -Sb2Cl10_2_15562.vasp,Sb2Cl10,-1.05280002,0.061464157499999894 -Co1H2O2_5_3739.vasp,CoH2O2,-3.8476320700000004,0.26746833144444193 -Ni2Te2_164_13669.vasp,Ni2Te2,0.0074559425,0.5705328674999995 -Hf2Ge2S2_129_7495.vasp,Hf2Ge2S2,-4.8625028483333335,-0.06818460333333798 -Al1Mo2S3Cl2_10_686.vasp,AlMo2S3Cl2,-2.8089352775,0.45999911999999465 -Cu1Ni1S2I1Br1_1_4922.vasp,CuNiS2IBr,-0.716628825,0.21129438015046142 -Hf3B2S2_187_7684.vasp,Hf3B2S2,-5.953458562857143,-0.10993505142857574 -Er2Cl6_162_5554.vasp,Er2Cl6,-2.8647034625,0.048285249999999724 -Mn1In1Se1Br1_1_10778.vasp,MnInSeBr,-1.299946735,0.38995666815732766 -Y5F8_10_20843.vasp,Y5F8,-4.588450816153846,0.43746724705127793 -Sr4Ta2Cu4O14_6_17477.vasp,Sr4Ta2Cu4O14,-4.188605420416667,0.47822550208333015 -K2S6N2_4_9338.vasp,K2S6N2,-2.6734078709999998,0.19837440649999838 -Mn3O4_164_11398.vasp,Mn3O4,-4.444712164285714,0.07351745000000065 -Nb2Ga1Ir1O8_1_12725.vasp,Nb2GaIrO8,-5.626939894166667,0.2685581248958331 -Na2H6Pt1S6_147_12129.vasp,Na2H6PtS6,-2.883716972666667,0.04034606566666654 -Cs1_191_4658.vasp,Cs,1.66714867,0.3275619649999999 -Si1Sb3_191_16363.vasp,SiSb3,-1.7085727075,0.7516398593749999 -Ni2Te1Se1O1_99_13655.vasp,Ni2TeSeO,-1.33918707,0.04643746487499989 -Ti2H2C1O2_164_18944.vasp,Ti2H2CO2,-6.199570442857143,0.15915305682538428 -Te4H2Pd2_2_18585.vasp,Te4H2Pd2,-1.7154939425,0.6077293937500001 -Ba2Li2_11_2017.vasp,Ba2Li2,-0.3969328975,0.5501511758333334 -Ti2C1S2F2_164_18911.vasp,Ti2CS2F2,-4.698656781428572,0.39287339642856 -Ga2H2Se2S8_11_6379.vasp,Ga2H2Se2S8,-2.5321046378571426,0.28137490583332875 -Hg4Se2O8_13_8088.vasp,Hg4Se2O8,-1.788937467142857,0.2327685923809515 -Cr2Se2_129_4500.vasp,Cr2Se2,-2.906977045,0.25862447749999995 -Zn2Bi4S6Br4_31_21047.vasp,Zn2Bi4S6Br4,-1.4633401575,0.21358437612499992 -Co2Mo2S8F2_129_3934.vasp,Co2Mo2S8F2,-2.4663089635714286,0.787977008809518 -Mo12S6Br12_51_11485.vasp,Mo12S6Br12,-2.629629635666667,0.037766303333333084 -K2S6Br2_11_9333.vasp,K2S6Br2,-1.591189143,0.38777888062500043 -Al1Pd5F2_38_711.vasp,AlPd5F2,-1.321439205,0.9636283516666644 -Hf2Se1I5_8_7595.vasp,Hf2SeI5,-2.3167454075,0.11358414640625031 -Na2Ag1_187_11962.vasp,Na2Ag,0.33565752666666665,0.18231789666666667 -Pr6Os2I6_11_14564.vasp,Pr6Os2I6,-2.620964692142857,0.087023192857143 -In2Hg1Te4_164_8472.vasp,In2HgTe4,-0.7659821628571429,0.14603945857142842 -Cr5Se10_8_4627.vasp,Cr5Se10,-2.6976464313333333,0.06883918366666686 -Zn2Si2O6_162_21169.vasp,Zn2Si2O6,-4.517231952,0.24218755116666646 -Ag2C2N2O2_11_215.vasp,Ag2C2N2O2,-4.53588597,0.06207439864582742 -Ba2Ge4_12_1987.vasp,Ba2Ge4,-2.262781136666667,0.4593368233333335 -Na4Tl4O4_6_12427.vasp,Na4Tl4O4,-2.126598813333333,0.08938562500000025 -Cr1Te1Cl1_156_4269.vasp,CrTeCl,-1.92043786,-0.055899736111112874 -Cd1Br1N1Cl1_6_3284.vasp,CdBrNCl,-0.8880988675,0.6544431221875 -La1Mg5_1_9569.vasp,LaMg5,-0.16495376666666667,0.429805848484848 -Pd3S4_10_14508.vasp,Pd3S4,-1.7145493357142858,0.4845880889285695 -Tl2Br6_189_19384.vasp,Tl2Br6,-0.2394401125,0.18498390031250006 -Y2O6_2_20763.vasp,Y2O6,-5.4350897375,0.4291540890624992 -Mg2Al2Se5_164_10419.vasp,Mg2Al2Se5,-2.695034008888889,0.05568508055555599 -Rb2C2S2Cl6O6_1_14788.vasp,Rb2C2S2Cl6O6,-3.160034327222222,0.16566731583333072 -Nb3Br2N1Cl1O3_1_12952.vasp,Nb3Br2NClO3,-5.200888273,0.12760368332690408 -In2Bi6_164_8385.vasp,In2Bi6,-0.75074811625,-0.23956298750000005 -Nb2Cu1Se2S1I2_1_12707.vasp,Nb2CuSe2SI2,-2.6972558075,0.23573672589961558 -Pd2S1I2_1_14457.vasp,Pd2SI2,-0.6504933239999999,0.3682845925000001 -K2H2C2S6_4_9120.vasp,K2H2C2S6,-3.2493091041666666,0.1748242616666562 -Mn1Ge1Br2N1_1_10733.vasp,MnGeBr2N,-2.579294952,0.1532828435 -Mn1Tl2Se4_156_10917.vasp,MnTl2Se4,-1.4660323242857143,0.3149294447619031 -Sb2As2_1_15537.vasp,Sb2As2,-2.57042697,-0.7274198200000002 -Mo2Se2_2_11692.vasp,Mo2Se2,-2.8895241125,0.7368449824999999 -Al2Ga2Te6_31_846.vasp,Al2Ga2Te6,-1.929951799,0.07426503559166497 -Hf3H2C2Se2_187_7706.vasp,Hf3H2C2Se2,-5.455235104444444,0.4461539071604892 -In2Te2I2_31_8622.vasp,In2Te2I2,-0.91546012,0.062074405833333346 -Ge2Cl4_11_6770.vasp,Ge2Cl4,-1.9436158133333334,0.023578423333333154 -Nd1Al3Cu1_99_13213.vasp,NdAl3Cu,-1.617263844,0.8351301900000001 -Sr2Cd1In1Au1S5_99_17172.vasp,Sr2CdInAuS5,-1.6842358659999999,0.3773856106875003 -Ga2I1Cl1_1_6387.vasp,Ga2ICl,-1.2422766875,0.01229696270833236 -Tl2P6_2_19484.vasp,Tl2P6,-2.82514070875,0.28704825612499674 -Hg2Ge1S4_21_7961.vasp,Hg2GeS4,-1.2256021114285713,0.24545610758928404 -Y1V1Ge1Cl4O3_1_20687.vasp,YVGeCl4O3,-3.962817708,0.1348619633928516 -Zn2P4O8_51_21136.vasp,Zn2P4O8,-4.22191593,0.35190452514285314 -W4N3Cl2_164_20583.vasp,W4N3Cl2,-4.926279737777778,0.14134692092592183 -Ga2Ni1Se4_164_6400.vasp,Ga2NiSe4,-1.9612795942857144,-0.05523600928571604 -V6As4O18_100_20384.vasp,V6As4O18,-5.073230094642858,0.1787441578571376 -Hf4N3F2_164_7795.vasp,Hf4N3F2,-6.911335893333334,0.27684387916665276 -Au2I4O12_4_1491.vasp,Au2I4O12,-2.1234209005555558,0.13143410777777542 -Y4H2N3_164_20825.vasp,Y4H2N3,-6.279985657777778,-0.20505967111111723 -Bi2Se4_12_2551.vasp,Bi2Se4,-1.8814254166666666,0.26016576722221996 -Ca1Pb1I2O2_1_2865.vasp,CaPbI2O2,-2.3451880283333333,0.091379248333328 -Li4Zn2Cl8_11_10252.vasp,Li4Zn2Cl8,-1.743633327857143,0.07706164928571413 -Zr4S6F2_8_21846.vasp,Zr4S6F2,-4.574887570833334,0.21044300968749474 -Mn3Co1O8_164_11371.vasp,Mn3CoO8,-4.148682779166667,-0.025783874895836778 -Cr2Ag2P4Se12_13_4299.vasp,Cr2Ag2P4Se12,-2.3486594700000003,0.010330065656249832 -Mo4H2C3O2_164_11741.vasp,Mo4H2C3O2,-4.988236353636363,0.29789176329544453 -V2Cl2_129_20032.vasp,V2Cl2,-2.2785241725,0.7044031774999999 -Ni2Cl6_162_13499.vasp,Ni2Cl6,-0.34704793625,0.10133154999999999 -Si8Ir2_125_16546.vasp,Si8Ir2,-3.956542069,-0.05696147425000331 -Fe2Te2W2S12_113_6003.vasp,Fe2Te2W2S12,-2.8141494894444445,0.07848707171296027 -Na2S4F2_113_12291.vasp,Na2S4F2,-1.27894850875,1.1285835309374999 -Cr2Te2H4O10_2_4521.vasp,Cr2Te2H4O10,-4.243581914444444,0.09171415891203372 -Al2As6_164_765.vasp,Al2As6,-2.74635361125,0.015951418750000057 -Mo2Br2O2_59_11571.vasp,Mo2Br2O2,-3.370957545,0.21648598291666676 -Pd2I1Cl1O2_6_14427.vasp,Pd2IClO2,-1.5495652516666667,0.24111625722221874 -Li2Au1O2_12_9827.vasp,Li2AuO2,-2.6527214,0.8845179059999979 -Dy2Sb2S4O2_129_5534.vasp,Dy2Sb2S4O2,-4.342910644,0.004291221541662171 -Ti2S4Br2_1_19006.vasp,Ti2S4Br2,-3.58780277625,0.3543522368749994 -Co1H8C4N2O4_10_3771.vasp,CoH8C4N2O4,-5.11360790368421,0.17000548552630484 -Tl6Te6_2_19647.vasp,Tl6Te6,-0.5969188525,0.35574052875000006 -Ta2Mn3H1C2N1O6_8_17774.vasp,Ta2Mn3HC2NO6,-5.657467914,0.47958958049998923 -Nb1Br1F1_156_12478.vasp,NbBrF,-3.2851203666666664,0.5205956222916635 -Na2Sn2P2H2O8F2_11_12307.vasp,Na2Sn2P2H2O8F2,-4.433724425555556,0.040546014437486955 -Bi2Se1S1Cl2_1_2535.vasp,Bi2SeSCl2,-1.8164493916666666,0.10411660374999998 -Sc2H2Br2_164_16076.vasp,Sc2H2Br2,-3.04565045,0.039075224999999936 -Te2Mo1_164_18402.vasp,Te2Mo,-2.0240465833333334,0.08684766666666643 -K1Zn1B3H12_143_8962.vasp,KZnB3H12,-3.3466217405882355,0.6916576859411689 -Cr1Cu1Te6As2_5_4163.vasp,CrCuTe6As2,-1.558827211,0.1879204645833318 -Al1H2S2_164_670.vasp,AlH2S2,-2.947458714,0.8569010986249953 -Mg1Ga2Te4_164_10365.vasp,MgGa2Te4,-1.6694382357142856,0.07057483428571443 -Cu1H4C6N8O4_2_4900.vasp,CuH4C6N8O4,-5.497140013478261,0.5065431661594141 -Mo4H2C3_164_11743.vasp,Mo4H2C3,-4.766672852222222,0.3360819548611067 -Eu3Te3_123_5610.vasp,Eu3Te3,-2.960378341666667,-0.2396099666666669 -Mo3O9_157_11720.vasp,Mo3O9,-4.2029673925,0.9247559662500002 -Ta3Se1Cl7_156_17989.vasp,Ta3SeCl7,-3.555188433636364,-0.047231955681822035 -Fe2Te2Cl14_1_5995.vasp,Fe2Te2Cl14,-0.8999898244444444,0.05719288444444448 -Zn1C2S2O6F6_147_20906.vasp,ZnC2S2O6F6,-3.681761635882353,0.17364782264705608 -Bi4S8_12_2643.vasp,Bi4S8,-2.3612839691666667,-0.7137849217708356 -V3H2C2O2_187_20262.vasp,V3H2C2O2,-5.260650233333333,0.15475952868685838 -W1O2_187_20443.vasp,WO2,-6.178117283333333,0.08958248530611623 -Y2Ge1_164_20737.vasp,Y2Ge,-3.78295108,0.17466293166666286 -B1W2Se2_164_1644.vasp,BW2Se2,-4.759840468,-0.12755004099999967 -Hf1Zr2Ge1B1W1Se1Cl6O3_1_7409.vasp,HfZr2GeBWSeCl6O3,-3.982617993125,0.5572391640066869 -In2Cl6_1_8405.vasp,In2Cl6,-1.31207070625,0.12889473374999993 -Ga2Br6_189_6313.vasp,Ga2Br6,-0.8919639625,0.2621294875 -Zr1Ta1Mn2Mo1Br1N1Cl1O4_1_21447.vasp,ZrTaMn2MoBrNClO4,-4.910826304166666,0.2898941133796198 -Na2Hg4Se2Cl6O6_31_12163.vasp,Na2Hg4Se2Cl6O6,-1.5138119525,0.13826902437500044 -Zr1I2_164_21311.vasp,ZrI2,-1.8224639500000002,0.20589573166666653 -Y1C3_187_20616.vasp,YC3,-5.9842763775,1.4073127592187507 -Ti3B2S2_187_19066.vasp,Ti3B2S2,-5.902238858571429,-0.1355349185714334 -Co1H4N6Cl2_47_3768.vasp,CoH4N6Cl2,-4.133228418461538,0.01450432192307094 -B2O1_65_1687.vasp,B2O,-5.786827483333333,0.8102800261805494 -Na2H8I2O4_2_12138.vasp,Na2H8I2O4,-3.501878335625,-0.12412680291666628 -Cr3O8_8_4574.vasp,Cr3O8,-4.73500673,-0.18261670437500488 -Sr2Ni2Sn2_129_17289.vasp,Sr2Ni2Sn2,-0.24913127166666668,0.1428872033333333 -Zr1Pt1S1I2O1_1_21405.vasp,ZrPtSI2O,-2.6921304766666663,0.593457088472221 -Cr2S2I2_59_4466.vasp,Cr2S2I2,-2.1078722783333332,-0.04605372666666652 -Ta8Ag2S16_11_18162.vasp,Ta8Ag2S16,-4.880288694615385,0.06782039730769185 -Ni1Ir3Se3S5_1_13376.vasp,NiIr3Se3S5,-2.6775467658333336,-0.08162520968750053 -Bi1Sb1W1_156_2382.vasp,BiSbW,-2.6948721399999997,0.7781955599999972 -Zn3Ga2O6_156_21204.vasp,Zn3Ga2O6,-3.1514851681818183,-0.10115064988637057 -Co1Ni1Se2I1Br1_6_3792.vasp,CoNiSe2IBr,-0.9988287083333334,0.12267821851851719 -Cd2Bi2Cl2O4_11_3466.vasp,Cd2Bi2Cl2O4,-2.230942473,0.19262944100000023 -Sb1S2O6F1_1_15493.vasp,SbS2O6F,-3.675962638,0.5400861348333303 -Hf2F6_189_7491.vasp,Hf2F6,-4.48460777,0.5129122034374994 -Mg2P1_25_10494.vasp,Mg2P,-1.1563067766666666,0.7845742209027773 -Ag1Au1I1Br1O2_1_8.vasp,AgAuIBrO2,-0.6514647516666666,0.5705504676041665 -Li2B2H6S2N8_51_9835.vasp,Li2B2H6S2N8,-4.758304074,0.28228716952343325 -K2Y2Mo4O16_13_9391.vasp,K2Y2Mo4O16,-5.3425801775,0.10536165229166627 -Na1N3_10_11906.vasp,NaN3,-4.253349535,1.1831932275000003 -Cu4Cl4O4F4_14_5403.vasp,Cu4Cl4O4F4,-1.021325721875,0.4877979009374999 -Li2Mn2O4_59_9996.vasp,Li2Mn2O4,-4.07564288375,0.2919515257112074 -V1Sb2_164_19924.vasp,VSb2,-2.5123821200000003,0.3707256852777747 -Zr2Te2_164_21711.vasp,Zr2Te2,-3.045373295,-0.08320276000000026 -Mn1Ag1Se1Cl1_1_10617.vasp,MnAgSeCl,-0.918935455,0.43428114500000015 -Pd2S1Br1_1_14456.vasp,Pd2SBr,-1.0598996525,0.32465187833333164 -Pb2Br2Cl2_11_14214.vasp,Pb2Br2Cl2,-1.3050379366666667,-0.06509974083333325 -Ru1I2_115_15272.vasp,RuI2,-0.5445226966666666,0.46078763499999914 -V2As2S10_129_19979.vasp,V2As2S10,-2.9042960792857144,0.5598984263392788 -In2Cu2Mo4O16_13_8420.vasp,In2Cu2Mo4O16,-4.416219188333334,0.07637197894096914 -Cu4Se4Br4_14_5472.vasp,Cu4Se4Br4,-0.6655465433333333,0.11003308900793596 -Ba2O10_2_2039.vasp,Ba2O10,-3.5490381958333335,0.300272053958333 -In2Co2S5_164_8413.vasp,In2Co2S5,-2.409421957777778,0.21114950101851604 -Mo2As2_12_11564.vasp,Mo2As2,-3.1651169075,0.48172331035713944 -V2Te4_11_20220.vasp,V2Te4,-1.9528624883333334,0.4143785694444442 -Ag4I4O4F4_14_530.vasp,Ag4I4O4F4,-0.509212745625,0.7306505025 -Te2Os2_187_18428.vasp,Te2Os2,-2.6349998325,0.4885173962499998 -Sr4Sb4Se8F4_14_17471.vasp,Sr4Sb4Se8F4,-2.8212620745,0.009669586999993984 -Fe4N3O2_164_6083.vasp,Fe4N3O2,-3.7582330066666665,0.5128808453703663 -Na2H6C2S2N8_51_12114.vasp,Na2H6C2S2N8,-4.8977851435,-0.14152784064584156 -Sr2Cu1S2F2_38_17202.vasp,Sr2CuS2F2,-2.4040899228571426,0.4730603947619 -Cr2Ag2P4O12_4_4297.vasp,Cr2Ag2P4O12,-4.5540186585,0.33464690516666096 -Nb2Se2Br2_59_12869.vasp,Nb2Se2Br2,-3.5042820566666664,-0.15642808202381553 -Zn2Cl2O1_115_21055.vasp,Zn2Cl2O,-1.159557038,0.08142561587499997 -Cr3I1N3Cl1_8_4559.vasp,Cr3IN3Cl,-4.092205705,0.02192709166666207 -Ca1Si1Te1Cl3_1_2880.vasp,CaSiTeCl3,-2.107627125,0.18203749333333058 -Be3Cl6_5_2277.vasp,Be3Cl6,-2.4758995333333336,0.17410387999999966 -Na1Fe1Sb2O6_5_11853.vasp,NaFeSb2O6,-3.665284064,0.5245026595 -Co2W2S8Br2_129_4056.vasp,Co2W2S8Br2,-2.6341374614285717,0.62436038913865 -Cr1Rh1S2_99_4236.vasp,CrRhS2,-2.99956047,0.10581415879432132 -W1Br2_164_20422.vasp,WBr2,-1.8771836066666667,0.7079906427777773 -V3H2C2_187_20265.vasp,V3H2C2,-4.952117712857143,0.1935848112244849 -Mo2S2_187_11668.vasp,Mo2S2,-3.2017582925,0.96513984875 -Cd2H10C12N16_2_3509.vasp,Cd2H10C12N16,-5.69561000425,-1.5971720100000106 -Hg2Pt4S6_164_7988.vasp,Hg2Pt4S6,-1.6521345883333334,0.1599906383333316 -Na4Se4S8_13_12420.vasp,Na4Se4S8,-2.17746259625,0.2627483498958335 -Ge2_164_6898.vasp,Ge2,-2.65881502,-0.4858393950000002 -Te2Pd2Cl2_59_18466.vasp,Te2Pd2Cl2,-1.131006255,-0.10914720864583427 -K2Mg5Sn3_123_9231.vasp,K2Mg5Sn3,-0.380867393,0.06324620099999995 -Ni2Pd2S4Br4_1_13577.vasp,Ni2Pd2S4Br4,-1.1584597391666667,-0.02200384708333325 -Zr2Se2_187_21679.vasp,Zr2Se2,-3.63486653,0.25693380500000007 -Zr1Sb2_187_21428.vasp,ZrSb2,-3.0381600766666668,-0.695627079166667 -Sc2Sb2Te6_157_16149.vasp,Sc2Sb2Te6,-2.256656217,0.20633516949999975 -Mn2Bi2Se4Cl2_10_11016.vasp,Mn2Bi2Se4Cl2,-1.8535198869999998,0.16087153541666543 -Au1I2_115_1430.vasp,AuI2,0.6864428766666667,0.21332438791666714 -Zr2Pd2Br2Cl2O4_6_21634.vasp,Zr2Pd2Br2Cl2O4,-3.6133797225,0.33985523111111116 -K2Pt4S6_164_9310.vasp,K2Pt4S6,-2.304429095,0.11869883833333317 -Mo2I2O2_59_11622.vasp,Mo2I2O2,-3.064085405,0.2592694811111107 -V2S2Cl2_59_20153.vasp,V2S2Cl2,-3.0574989416666667,0.1460653866666637 -Mn1Zn1In1I1Br1O2_8_10942.vasp,MnZnInIBrO2,-1.9055172357142856,0.2010828582204416 -Li4N1O4_38_10205.vasp,Li4NO4,-3.969354348888889,0.21128483561110661 -Al2I2O2_59_877.vasp,Al2I2O2,-3.6562720916666667,0.18205004777777362 -Zr1Cd1S2I2_1_21273.vasp,ZrCdS2I2,-1.97375227,0.14792863236111087 -P2Se2O10F2_4_14048.vasp,P2Se2O10F2,-3.836983399375,0.2967027592187448 -As4Cl12_14_1326.vasp,As4Cl12,-1.53337334,0.059532144999999925 -Sb2Pb1S4_164_15635.vasp,Sb2PbS4,-2.612951594285714,-0.05132392285714493 -B18S9_1_1612.vasp,B18S9,-4.7762760477777775,0.47984223333332876 -Zr3C2Cl2_187_21754.vasp,Zr3C2Cl2,-5.491028875714286,-0.1560302471428625 -Te4Rh2_11_18623.vasp,Te4Rh2,-1.8754235716666667,0.3265949705555553 -Ag1Ge2Se2_1_66.vasp,AgGe2Se2,-1.830702218,0.34342310718789637 -Nb1Sb2_164_12571.vasp,NbSb2,-3.493235156666667,0.37891197333333304 -Fe2Bi1S2_187_5803.vasp,Fe2BiS2,-1.754553808,-0.07301996700000002 -Tl2Te2Br2_59_19545.vasp,Tl2Te2Br2,-0.5082977266666667,0.4001056922222214 -Nb1Ni3Se6_1_12547.vasp,NbNi3Se6,-1.911938912,0.15308275099999402 -Sr2In1Ag1Hg1S5_99_17263.vasp,Sr2InAgHgS5,-1.702947264,0.2526650410000001 -Tl8Sn2S6_90_19654.vasp,Tl8Sn2S6,-1.4630391625,0.10485294874999995 -Mn1Mo1O2F2_1_10796.vasp,MnMoO2F2,-3.5162896333333333,0.5443351525 -Ga1S2F2_12_6260.vasp,GaS2F2,-1.98944303,0.8665484074791641 -B2Se5_1_1713.vasp,B2Se5,-3.0880402300000003,0.2868033114285683 -Cu4S2_26_5446.vasp,Cu4S2,-0.6358570633333334,0.35905272333333227 -Mg2Cu2Ge2_129_10448.vasp,Mg2Cu2Ge2,0.02049877,0.855456773611109 -Ge4P8_26_6938.vasp,Ge4P8,-3.7543814225,-0.33272555750000254 -Os4Se8_13_13895.vasp,Os4Se8,-2.91295635,0.63166491 -Fe2Se2Br2_59_5970.vasp,Fe2Se2Br2,-1.2999654966666667,0.2785187933333333 -Mn4Sn4S12_13_11455.vasp,Mn4Sn4S12,-2.7039754485,0.2980634464999966 -Te2Au2Cl2_59_18366.vasp,Te2Au2Cl2,-0.25327626166666667,0.4953371698958322 -Zr4N4F4_59_21834.vasp,Zr4N4F4,-6.1901689725,0.10900945583333321 -Ga1S4_8_6263.vasp,GaS4,-2.269961426,0.4995397186874999 -Rb2S6Br2_11_14933.vasp,Rb2S6Br2,-1.471906944,0.5247808176250002 -As4Pb3_5_1347.vasp,As4Pb3,-1.9896067814285714,0.2848069135714284 -Hg2Pb4Br6O4_5_7985.vasp,Hg2Pb4Br6O4,-1.367742461875,0.22383950593750018 -Zn2In2Te5_156_21113.vasp,Zn2In2Te5,-0.7294551866666666,0.12962376333333245 -Li8Te8O20_14_10288.vasp,Li8Te8O20,-3.9430709844444443,0.046986116111111365 -Nb2O6_59_12800.vasp,Nb2O6,-6.16137167875,-0.08294807499999979 -Fe1F2_187_5675.vasp,FeF2,-1.9077679533333332,0.8100173833333335 -Hf2I6_189_7524.vasp,Hf2I6,-1.8179758325,0.48314174374999985 -Zn2H2Pd1O6_8_21096.vasp,Zn2H2PdO6,-2.771714221818182,0.3011717289393909 -Mo3H2N2O2_187_11709.vasp,Mo3H2N2O2,-4.841777198888889,0.2724552009722063 -Hf1Zn1F6_5_7370.vasp,HfZnF6,-3.5219528325,0.04599890875000012 -Au4S4O12_14_1589.vasp,Au4S4O12,-2.8388266829999997,0.7949822124999999 -Ca2O2_129_3080.vasp,Ca2O2,-4.286767695,-0.043995814999999716 -Mo3H2N2_187_11710.vasp,Mo3H2N2,-4.479421777142857,-1.233655065793656 -Nb2Cl2O2_59_12676.vasp,Nb2Cl2O2,-5.08317338,0.09547183819443306 -Zr1Pd1S2Cl2_6_21403.vasp,ZrPdS2Cl2,-2.5603178349999998,0.5175829143749978 -Li1Cu1O2F1_25_9687.vasp,LiCuO2F,-2.322881836,0.6022429885 -V2C1S2_164_20021.vasp,V2CS2,-4.810404792,-0.5648711979444516 -Na2Ti2Br2N2_59_12320.vasp,Na2Ti2Br2N2,-4.594721505,-0.1377517699999995 -Ti2B1H2_164_18887.vasp,Ti2BH2,-5.241848186,0.18023956850000067 -Mn1H2_187_10766.vasp,MnH2,-2.81075103,0.6634187408333334 -Al2Te2Cl14_4_998.vasp,Al2Te2Cl14,-1.4932458694444444,0.05946986222222095 -Mn2C2N1Cl1F1_1_11047.vasp,Mn2C2NClF,-3.9872826914285713,0.8936959749999895 -Mn2S1I2_12_11212.vasp,Mn2SI2,-1.555739362,0.06399821800000005 -Ta3Pd3S14_6_17977.vasp,Ta3Pd3S14,-3.643080013,0.138788767124991 -Co2O6_2_3953.vasp,Co2O6,-3.3877815425,-0.22561576937499983 -Cu2I2O1_1_5168.vasp,Cu2I2O,-0.48237040200000003,0.3169469327999972 -Rb2S6N2_4_14938.vasp,Rb2S6N2,-2.676715635,0.22141222543749794 -S4O8_14_15399.vasp,S4O8,-4.0675916625,0.30528587916666705 -Ba4Bi2_59_2138.vasp,Ba4Bi2,-0.73101569,0.44337740888888794 -Fe2Te2_187_6005.vasp,Fe2Te2,-0.45268975,1.3134665012499998 -Nb4Pd2Se14_11_13125.vasp,Nb4Pd2Se14,-3.2442853085000003,0.10544118493749344 -Tl6B2Se6_11_19640.vasp,Tl6B2Se6,-1.9168845121428573,0.38736911285714304 -Na2Cd4Cl6O8_31_12022.vasp,Na2Cd4Cl6O8,-1.5383649204999998,0.31968008104166645 -Zn3I6_143_21205.vasp,Zn3I6,0.48102755666666663,0.16434971874999998 -Zr1Ti3Se8_1_21483.vasp,ZrTi3Se8,-4.14075866,0.23614094145833286 -Li2H4C2_67_9937.vasp,Li2H4C2,-3.715003505,1.0515050975000004 -Sn6O8_14_16992.vasp,Sn6O8,-3.9647063,0.039613616428567644 -Fe1As1O3_1_5618.vasp,FeAsO3,-3.5663626720000003,0.5332839121999964 -Cd2Bi2S4Cl2_26_3471.vasp,Cd2Bi2S4Cl2,-1.302944255,0.21058573200000014 -Mg8C4_57_10601.vasp,Mg8C4,-1.7950422616666666,0.6342339361111091 -Pt2S1Br1Cl1O1_6_14650.vasp,Pt2SBrClO,-1.8033751116666668,0.48175735270833053 -Cd1Cl1O1F1_156_3299.vasp,CdClOF,-0.8835280725,0.5382727640625 -Ba2S8Br4_65_2050.vasp,Ba2S8Br4,-2.0307458221428574,0.4145926846428547 -K2Cd4S2Cl6O6_31_9047.vasp,K2Cd4S2Cl6O6,-1.987312772,0.12609262521874617 -Mg1Cl2_115_10350.vasp,MgCl2,-1.8802919999999999,0.1867355449999999 -Sn1Cl2_164_16625.vasp,SnCl2,-1.45716823,0.12149172833333344 -Na2Hg4Se2O6F6_31_12165.vasp,Na2Hg4Se2O6F6,-1.750761635,0.24164444749999858 -Sn2Sb2S6Cl2_7_16865.vasp,Sn2Sb2S6Cl2,-2.122631740833333,0.32437381791666686 -Re4F14_13_15106.vasp,Re4F14,-3.357387442222222,0.13197470074073525 -Ce2Mg4_51_3671.vasp,Ce2Mg4,-0.53311306,0.489610944999999 -Ni2As4_2_13457.vasp,Ni2As4,-1.8804921916666668,0.2544733941666668 -Au4I4O4F4_4_1572.vasp,Au4I4O4F4,-0.439848364375,1.0158623471250006 -Bi2Se2_164_2547.vasp,Bi2Se2,-1.595076205,0.23966155249999885 -Mg4Sn4O8_1_10585.vasp,Mg4Sn4O8,-3.888664676875,-0.0745539262499999 -H4I4O12_29_7066.vasp,H4I4O12,-3.0192788925,0.06046438408332944 -Ni2S4F2_2_13594.vasp,Ni2S4F2,-1.73556091125,0.08709393062499815 -Na2Pd1_187_12266.vasp,Na2Pd,-0.2448312,0.2775922049999999 -B2As2H6Pb2S6_7_1647.vasp,B2As2H6Pb2S6,-3.0674044722222225,0.6950367317361075 -Li2Cu2P6O18_2_9894.vasp,Li2Cu2P6O18,-4.989843812857143,0.07721949821428531 -Cs2C4S6F6_1_4678.vasp,Cs2C4S6F6,-3.3328509116666667,0.11065572312499106 -P2I8_2_13989.vasp,P2I8,-0.418892223,0.141781074 -Ni2Pd1Br4O3_1_13575.vasp,Ni2PdBr4O3,-1.194876504,0.09686302025000004 -Ca4Mn2Cl2O6_129_3222.vasp,Ca4Mn2Cl2O6,-4.091479204285714,-0.0031813141071455053 -Te2Ir2I2_11_18394.vasp,Te2Ir2I2,-1.6952829166666668,0.1904103716666634 -Ca2Br2_129_2961.vasp,Ca2Br2,-0.671238825,0.9354002275000001 -Hg1Cl1O1F1_156_7848.vasp,HgClOF,-0.438867975,0.51911249125 -Ge2Te2Br2_59_6881.vasp,Ge2Te2Br2,-1.6513062033333332,-0.0792087622222235 -C2O2_129_2753.vasp,C2O2,-3.80460343,2.8700495875000005 -Mo2Se2_187_11690.vasp,Mo2Se2,-2.6269527225,0.9994163725 -Cd5N2O16_10_3638.vasp,Cd5N2O16,-2.433056469565217,0.5539690740941978 -Al4Se4I4_14_1095.vasp,Al4Se4I4,-2.066922641666667,0.03727588249999991 -Cs2P2H6O6F2_1_4765.vasp,Cs2P2H6O6F2,-4.1423004061111115,0.016984537666653643 -V2H2C1O2_164_20072.vasp,V2H2CO2,-5.064841817142857,0.08645409926586467 -Th1I2_156_18718.vasp,ThI2,-1.3723572733333331,1.1103675583333337 -K2Cu6Te4_12_9092.vasp,K2Cu6Te4,-0.29222912166666665,0.4217510633333321 -Os1S2_187_13822.vasp,OsS2,-3.5480563800000002,0.7500611258333327 -Ca1Cu1I1Br1_6_2823.vasp,CaCuIBr,-0.498179245,1.097380695 -Pd1Au1Se1Cl1_6_14343.vasp,PdAuSeCl,-0.677800055,0.55969458875 -Nb2Se1I2O1_6_12865.vasp,Nb2SeI2O,-3.7929141000000004,0.019845946614574173 -K2Nb2I12_4_9265.vasp,K2Nb2I12,-0.996529840625,-0.0876116643749999 -Sc2F4_11_16071.vasp,Sc2F4,-3.8522366600000004,-0.005367159444447989 -Mn2O2_123_11177.vasp,Mn2O2,-3.474636755,0.7360096078448275 -Zr1I1Br1N1_8_21306.vasp,ZrIBrN,-3.50453019,0.380195459166663 -Al2Cl2O2_59_789.vasp,Al2Cl2O2,-4.424887703333334,-0.9280843616666674 -Na2Nb2S12_7_12229.vasp,Na2Nb2S12,-3.408375113125,-0.000743953385419438 -Zr1Ge1Cl2O3_1_21298.vasp,ZrGeCl2O3,-4.502584184285714,0.2627516216071375 -Al2Se2I2_31_965.vasp,Al2Se2I2,-2.0753358933333335,0.02886263083333329 -Mn3Si1Te2_187_11413.vasp,Mn3SiTe2,-2.3145228166666665,0.21315304187499662 -Sb4C4S6N2_2_15773.vasp,Sb4C4S6N2,-4.21337808625,0.37599663510416126 -Ag2Sb4Se3F2_6_416.vasp,Ag2Sb4Se3F2,-1.4724919036363637,0.5012170621212095 -Co1O1_123_3800.vasp,CoO,-3.089915285,-0.1227475349999998 -Nb4H2N3O2_164_13086.vasp,Nb4H2N3O2,-6.505272802727273,-0.6188535512954645 -Zr2B1F2_164_21508.vasp,Zr2BF2,-4.910678356,-0.012474706499999488 -Na1In1As2S6_5_11880.vasp,NaInAs2S6,-2.604586545,0.3943612188124974 -Co2I6_162_3928.vasp,Co2I6,-0.35884622375,0.04291212499999997 -Zr3B2H2O2_38_21735.vasp,Zr3B2H2O2,-5.320268825555555,0.42203474555555176 -Cu2B4Pb4O12_14_5038.vasp,Cu2B4Pb4O12,-4.572945038181818,0.30842776331168154 -V2I10_1_20087.vasp,V2I10,-0.4022031666666666,0.1715266856249995 -Pt2Br4O12_14_14602.vasp,Pt2Br4O12,-2.2010907788888887,0.47210686611110897 -Bi12Au2_31_2297.vasp,Bi12Au2,-0.8105152957142857,-0.24560967428571484 -Ni2Bi2Te4Br2_10_13471.vasp,Ni2Bi2Te4Br2,-0.707373173,0.34793424499999964 -Cd6Se6O20_4_3639.vasp,Cd6Se6O20,-2.8418245090625,0.11293348281250015 -Fe2O6_11_5897.vasp,Fe2O6,-3.40162627875,0.24412049125000035 -Na1Co1P2O6_5_11844.vasp,NaCoP2O6,-4.621418465,0.35171580887500076 -Cd4I4O4_14_3631.vasp,Cd4I4O4,-0.5423972083333334,0.36949060769841224 -Ni1Ge2C12_164_13319.vasp,NiGe2C12,-5.346895479333333,1.5214544154999987 -H2W4C3S2_164_7041.vasp,H2W4C3S2,-5.277175444545454,0.298595914999989 -Ga1Pt5Cl2_123_6250.vasp,GaPt5Cl2,-1.43632432,0.2799941141356711 -B13N2_164_1607.vasp,B13N2,-5.956100891999999,0.6427218581111047 -Ta2Pt1Se6_12_17836.vasp,Ta2PtSe6,-3.79288585,0.09588627666666705 -Zr3B2F2_187_21734.vasp,Zr3B2F2,-5.095255368571428,-0.026481676428575684 -Al1Cd1Ga1O4_156_619.vasp,AlCdGaO4,-4.073071234285714,0.2037767654761906 -Cr2Cl2_129_4351.vasp,Cr2Cl2,-1.6541623025,1.2022585758333308 -Ni2Se4F2_11_13647.vasp,Ni2Se4F2,-1.36585494875,0.2443801777083332 -Fe1H2S2_164_5686.vasp,FeH2S2,-2.954377186,-0.2225491824999999 -V1B4S6F5_2_19778.vasp,VB4S6F5,-3.262206393125,0.7040593026041627 -Mn1Nb1Se4_25_10814.vasp,MnNbSe4,-3.2725319699999997,0.0029143404166673825 -Ta1Nb2Ir1S4I4_1_17582.vasp,TaNb2IrS4I4,-3.2647137125000003,0.2878694529642694 -Li1Ti1Br2N1F1_6_9799.vasp,LiTiBr2NF,-3.810501205,-0.03769379229167591 -Hf2Sb2Te6_12_7588.vasp,Hf2Sb2Te6,-2.734320739,0.2823081924999983 -V3C2_187_20254.vasp,V3C2,-5.322880578,0.540307576541661 -Hf3B2Te2F2_187_7686.vasp,Hf3B2Te2F2,-4.3089218266666665,0.724766474166658 -Sr2Te2Au1Br2_38_17324.vasp,Sr2Te2AuBr2,-1.1464630871428572,0.27092707785714043 -Au4Br8_13_1568.vasp,Au4Br8,0.305121215,0.12289152708333351 -Bi2Te4Br8_2_2573.vasp,Bi2Te4Br8,-0.8731268464285715,-0.2992513833928577 -Cu2Te2Br2_59_5329.vasp,Cu2Te2Br2,-0.3118500083333333,0.2455569591666662 -Re4S2I4O1_12_15112.vasp,Re4S2I4O,-3.4393146581818184,0.41282345834594836 -Pb2Se6_4_14298.vasp,Pb2Se6,-1.77682049625,0.35215585213541656 -Ge2P2O6_7_6807.vasp,Ge2P2O6,-4.80968502,0.27591019771428205 -Li1Zr1Ti1Ni1S3Cl1_6_9815.vasp,LiZrTiNiS3Cl,-3.55461813375,0.2524557153125 -Hf1Zr1Ga1Ag1S4Br4_1_7377.vasp,HfZrGaAgS4Br4,-2.8132875583333337,0.17086046041666436 -Sn4H4C8O12_12_16941.vasp,Sn4H4C8O12,-5.212466049642857,0.2721219268452262 -U2H4O8_53_19712.vasp,U2H4O8,-6.002145134285714,0.2356279653571436 -Pt2F2_164_14620.vasp,Pt2F2,-1.5151047125,0.6910454718750001 -Re4O14_51_15110.vasp,Re4O14,-5.621797418888889,0.08982335250000073 -Co2P4S6Br4_4_3971.vasp,Co2P4S6Br4,-2.39182821125,0.2867141491796854 -Te2Pt2_187_18491.vasp,Te2Pt2,-1.323208905,0.5743446649999999 -Ca3Mn2I2O5_123_3186.vasp,Ca3Mn2I2O5,-3.6739718,-0.11105616920139676 -Ga4F4_57_6552.vasp,Ga4F4,-2.4120262275,-0.06734354750000232 -Sb2Te2_164_15725.vasp,Sb2Te2,-1.56204321,0.357139363749998 -W2Se3Cl2_1_20552.vasp,W2Se3Cl2,-2.963378838571429,0.018535917142854075 -Ag2Hg2Se2F2_26_303.vasp,Ag2Hg2Se2F2,-0.1511167425,0.15095232749999965 -Mo1O2_191_11528.vasp,MoO2,-3.3730141733333334,1.938890938333333 -Re2O6_12_15068.vasp,Re2O6,-5.66455249125,-0.8011362312500001 -Sr2Cu1Bi2O6_123_17195.vasp,Sr2CuBi2O6,-3.615205,0.25084419545454395 -Zn2Sb4Br4O6_31_21150.vasp,Zn2Sb4Br4O6,-2.685084991875,0.08222293894531024 -Fe1Hg1O2F5_10_5713.vasp,FeHgO2F5,-1.186849862222222,0.5186524966666652 -Zn3Ag1_191_21198.vasp,Zn3Ag,2.1188568925,0.07685049875000027 -Bi1Te2O6F1_1_2405.vasp,BiTe2O6F,-3.293930322,0.3698073432083262 -Na2Sn1O6F6_147_12303.vasp,Na2SnO6F6,-2.0984742346666665,0.976165557166667 -Li1V1O2F2_1_9808.vasp,LiVO2F2,-4.329501946666666,0.13387460100694085 -Rb2Hg4S2Cl6O6_31_14869.vasp,Rb2Hg4S2Cl6O6,-1.746950488,0.09013384624999853 -Ta2S2_123_17856.vasp,Ta2S2,-5.469987555,0.29813299124999393 -Cu1Rh1Br2O1_1_4950.vasp,CuRhBr2O,-1.257823946,0.43815018305555287 -Au2Se4Cl2_1_1555.vasp,Au2Se4Cl2,-0.80477940875,0.23737218812500005 -V1Mo3O8_25_19886.vasp,VMo3O8,-5.255561689166666,0.10573959194443971 -In1Pt2Se3Br4_1_8318.vasp,InPt2Se3Br4,-1.285058099,0.17871119849999784 -Ni1Rh1Se2_156_13406.vasp,NiRhSe2,-1.4425580575,0.597298463125 -V3Te8W1_25_20294.vasp,V3Te8W,-2.4116921799999997,0.12496310125000021 -Hf1Fe1Br6_149_7157.vasp,HfFeBr6,-1.9897936825,-0.06288678687500071 -Nb1Si1Te2_1_12584.vasp,NbSiTe2,-3.2418785725,0.46431349033333086 -Ce1Sn5_47_3660.vasp,CeSn5,-1.4455053433333334,-1.252995271666667 -Si3As4_5_16465.vasp,Si3As4,-3.59049773,-0.4390140316666692 -Hf2F4_11_7489.vasp,Hf2F4,-4.6141359516666665,0.4998544258333282 -Zr3Tl2Cu2Se8_12_21799.vasp,Zr3Tl2Cu2Se8,-2.7294958006666667,0.12675814799999996 -Nd2Te6_129_13247.vasp,Nd2Te6,-2.56754335875,0.0541967725000001 -Ge4Bi8_26_6928.vasp,Ge4Bi8,-1.7483344866666668,-0.7127639483333343 -Hf1Ti2Ni1S6I4_1_7339.vasp,HfTi2NiS6I4,-3.097198918571429,0.14105082857142126 -Rb2Li2Se2_129_14898.vasp,Rb2Li2Se2,-1.9308724899999998,0.03564128666666688 -Nd6O4F10_6_13251.vasp,Nd6O4F10,-5.0920545675,0.22908407966666244 -Lu1Bi2_21_10291.vasp,LuBi2,-1.65510743,-0.37078321166666783 -Pt1N2_47_14580.vasp,PtN2,-4.728249243333333,0.08485048499999626 -Ca1Ag1S3I1Br1_1_2793.vasp,CaAgS3IBr,-1.4145140999999999,0.2555755390624972 -Pt2S12N4_14_14649.vasp,Pt2S12N4,-3.0625491816666663,0.21239244083333064 -Sn3H1O7_1_16914.vasp,Sn3HO7,-3.970620604545455,0.3374587019128743 -Nb1Cu1P2S6_5_12498.vasp,NbCuP2S6,-3.2930211300000005,0.1592086149374926 -Hf1Br2_164_7130.vasp,HfBr2,-2.879226226666667,0.28277385888888573 -Ta2Ni1O6_12_17789.vasp,Ta2NiO6,-6.061352841111112,-0.020154123333340657 -Sb2Mo1_164_15600.vasp,Sb2Mo,-2.4147707566666665,0.3478223961904727 -Sr1Ag1Ge1Sb1S2Br2_1_17014.vasp,SrAgGeSbS2Br2,-1.85932214125,0.21046555044459325 -Li1Tl1I4O12_2_9805.vasp,LiTlI4O12,-2.6962498988888886,0.09255154833333368 -Li2Ti2C2F2_59_10092.vasp,Li2Ti2C2F2,-5.08303784875,0.1970596862499998 -Sc2Zn1Br2O3_1_16192.vasp,Sc2ZnBr2O3,-3.88928838125,0.3115232974999995 -Cd1H4C4Br2N2_10_3348.vasp,CdH4C4Br2N2,-4.535222340769231,0.18412031115384497 -Ag2Se4_6_446.vasp,Ag2Se4,-0.8965643916666667,-0.5542675633333334 -K2Nb2Ag4Se8_28_9257.vasp,K2Nb2Ag4Se8,-1.885554995625,0.14284637343750017 -In2H4C4F10_10_8466.vasp,In2H4C4F10,-2.9644299065,0.9632670385000004 -Mn2Mo1S4_99_11132.vasp,Mn2MoS4,-2.850182247142857,0.4538892878571399 -H4Pd1C6N2Cl2_25_7076.vasp,H4PdC6N2Cl2,-5.080395968,0.3533145224444385 -Ca2Sb4O8_26_3118.vasp,Ca2Sb4O8,-4.184621832142857,0.1330131309999962 -Tl2Ga2O6_31_19423.vasp,Tl2Ga2O6,-3.494675146,0.07800071624999672 -Ca3Au2Br2O4_123_3149.vasp,Ca3Au2Br2O4,-2.5318628490909094,0.30604585515151017 -P2Br6_31_13963.vasp,P2Br6,-1.21044627375,0.08496423124999897 -V2Te2Cl2O7_2_20203.vasp,V2Te2Cl2O7,-3.9288864484615384,0.1224392204326894 -Tl1Ge1Se3_143_19279.vasp,TlGeSe3,-1.683389086,0.4704421738333312 -K2Tl2O2_11_9380.vasp,K2Tl2O2,-1.6763078216666667,0.1397095783333333 -Ba2Ag1S2I2_38_1888.vasp,Ba2AgS2I2,-1.864883632857143,0.06887853833147095 -Zn1Ir1Au2O4_1_20970.vasp,ZnIrAu2O4,-1.95953607,0.8544192556250001 -Yb1Se1_187_20858.vasp,YbSe,-2.442757845,0.7819002249999998 -Te1Mo1S1Br1_6_18304.vasp,TeMoSBr,-1.968757245,0.4524263761874967 -Zn1F2_123_20922.vasp,ZnF2,-1.21760719,0.3791049874999999 -Co1H2_187_3742.vasp,CoH2,-2.555151786666667,1.2203210666666633 -Bi2B8H6O18_2_2427.vasp,Bi2B8H6O18,-5.7261204326470585,0.10880987676470655 -Ag4S4O12_14_554.vasp,Ag4S4O12,-2.9946062959999997,0.3592090229999997 -Fe1Cl2_164_5658.vasp,FeCl2,-1.6201796933333332,0.050097563333333595 -Cd1As1_8_3267.vasp,CdAs,0.337245015,0.8623996404687486 -Sn2Sb2Se6_147_16869.vasp,Sn2Sb2Se6,-1.927385874,0.21200135999999797 -Te6Pb2_4_18677.vasp,Te6Pb2,-1.21366328125,-0.4581539904166666 -Ca2Bi4O8_11_2956.vasp,Ca2Bi4O8,-3.959359977142857,0.0728965675000004 -Ag2Se2Cl2_59_431.vasp,Ag2Se2Cl2,-0.49133079500000004,0.25327096791666603 -V4O10_31_20341.vasp,V4O10,-5.4551321,0.0034464821428565884 -Fe2Te4As2Cl2_26_6010.vasp,Fe2Te4As2Cl2,-1.616531788,0.20661508688888575 -Ca3Si1_25_3202.vasp,Ca3Si,-0.5281442875,0.8110040518750001 -Al1Cu1Sb2O6_149_644.vasp,AlCuSb2O6,-4.125882215,0.43149462312499565 -Lu1Pb2_123_10297.vasp,LuPb2,-1.1869278866666666,-0.3403208449999999 -Sr2S6N2Cl2_59_17303.vasp,Sr2S6N2Cl2,-2.8661876858333333,0.24470646765624277 -In2Au2Br3O3_1_8379.vasp,In2Au2Br3O3,-1.559718,0.34518409650000015 -P4Au2O12_12_14067.vasp,P4Au2O12,-4.285871239444444,0.4302149120370333 -Ni4P4O4_13_13751.vasp,Ni4P4O4,-3.1885485441666668,0.15340169511110657 -Na2V2P2O10_4_12333.vasp,Na2V2P2O10,-4.832361805,0.5109956021874953 -Ir2F8_7_8786.vasp,Ir2F8,-1.9158180550000001,0.10686439599999997 -V3S2N2F2_187_20287.vasp,V3S2N2F2,-4.141414837777777,0.26745527796295954 -P1Br3_187_13913.vasp,PBr3,-0.7963201175,0.4990903874999989 -Ge2Sb1Te6_162_6839.vasp,Ge2SbTe6,-1.7180090733333335,-0.11820975370370723 -Se2_51_16291.vasp,Se2,-1.63195349,0.6760350633333334 -Sb2W2Se6_12_15751.vasp,Sb2W2Se6,-2.946016401,0.027970902499998118 -Cr1Br2O1_47_4130.vasp,CrBr2O,-2.63480141,-0.4763711575520858 -Ge1Bi1Se2_1_6648.vasp,GeBiSe2,-2.0965765225,0.21476447437500001 -Cr1Si3_191_4267.vasp,CrSi3,-3.1597419,0.8181139975000004 -In2N2_129_8487.vasp,In2N2,-3.09711161,0.9350602612500003 -Si1As3_191_16316.vasp,SiAs3,-2.4313902025,0.012519838749999845 -Cr1Bi1Sb1_156_4125.vasp,CrBiSb,-1.7195705700000001,1.1479889633333307 -Cu2F4_14_5094.vasp,Cu2F4,-1.1358285033333333,0.16123685666666665 -Te2Rh2_164_18506.vasp,Te2Rh2,-1.6685985175,0.5547495245833312 -Si3N4_174_16472.vasp,Si3N4,-5.956020784285714,-0.13689053571428556 -Fe1Pb2_123_5737.vasp,FePb2,-0.17352765,1.4385528499999984 -Sr2H8S6O24_2_17251.vasp,Sr2H8S6O24,-4.465231418,0.029914240749999266 -V1Br1N1F1_156_19785.vasp,VBrNF,-3.5463029475,0.01336996473957841 -Sc1Ag1Sb2S6_149_15892.vasp,ScAgSb2S6,-2.574327138,0.30954558106249763 -Mo4N3O2_156_11750.vasp,Mo4N3O2,-5.242802972222222,0.3436972849999951 -Hg4Br4O16_57_8069.vasp,Hg4Br4O16,-1.5193992312500002,0.46422481927083203 -Au2Se2Cl2_59_1542.vasp,Au2Se2Cl2,-0.398247815,0.23194727849999958 -Tl2F6_26_19411.vasp,Tl2F6,-1.5572452,-0.08361823937500001 -As2Se2O10F2_4_1298.vasp,As2Se2O10F2,-3.328484658125,0.32706658515625 -H2W1_187_7030.vasp,H2W,-3.1574873466666666,2.398854866666662 -Bi4Au4_51_2596.vasp,Bi4Au4,-0.130852815,0.224291595 -Li2Zr1_187_10143.vasp,Li2Zr,-2.0281577366666665,0.32127442277777596 -Ga2Co2Te5_156_6338.vasp,Ga2Co2Te5,-1.6189507633333333,0.2584500464814796 -Hg2H4S2O8_31_7966.vasp,Hg2H4S2O8,-3.3735256675,0.1417384775297612 -Mn1H1O2_8_10761.vasp,MnHO2,-4.3617867025,0.308057364374996 -P2H6Pb2C2S6_7_13983.vasp,P2H6Pb2C2S6,-3.711125806111111,0.09576185583332239 -Ca2Sb4O12_2_3117.vasp,Ca2Sb4O12,-4.3279294861111115,0.31922305499999926 -Cr2H2S5_12_4401.vasp,Cr2H2S5,-3.1690483400000002,0.2173171152777742 -Au1N2_10_1431.vasp,AuN2,-3.676110533333333,0.5121674449999967 -Ir1O2_115_8742.vasp,IrO2,-3.439379033333333,1.2049629900000003 -Hf1Bi1Se3Br1_1_7119.vasp,HfBiSe3Br,-2.7525514133333338,0.4322244779166644 -Fe1B6Pb2C6_1_5629.vasp,FeB6Pb2C6,-5.045697485333333,0.9436804412777732 -Zr1Ni1Se1S1_156_21381.vasp,ZrNiSeS,-3.0219771025,0.5072398706249996 -Re2N2_38_15058.vasp,Re2N2,-6.9172283325,0.040843341666660926 -Ga2Bi6_164_6307.vasp,Ga2Bi6,-0.96745449625,-0.343578755 -Pb1F4_123_14185.vasp,PbF4,-1.854858242,0.07692709000000009 -Te2As2H2O10_4_18352.vasp,Te2As2H2O10,-4.0853384075,0.054571599814810856 -Bi2Te2_12_2569.vasp,Bi2Te2,-1.1717584575,0.3480785424999999 -In2Se2I2_59_8583.vasp,In2Se2I2,-1.249977545,0.07255272270833335 -Al2H2S10_11_862.vasp,Al2H2S10,-2.938058205,0.21189804160714043 -Re2S6_11_15080.vasp,Re2S6,-3.99894195875,0.3605823592187498 -Ba1I2_115_1839.vasp,BaI2,-1.1031917633333335,0.4413301633333331 -V1Ga2Te4_164_19837.vasp,VGa2Te4,-1.9243532342857144,0.12526395652777578 -Ag1W1Br2N1O1_1_149.vasp,AgWBr2NO,-3.0463099099999997,0.26763008218749207 -V1In2O4_164_19872.vasp,VIn2O4,-4.000273418571429,0.46534803113094747 -Mn2Sb4Se8_53_11264.vasp,Mn2Sb4Se8,-2.1172489214285712,0.19694758761904585 -Ga1Sb2Te6Au1_149_6268.vasp,GaSb2Te6Au,-1.183003247,0.3412616358666649 -Ru1Br2_164_15261.vasp,RuBr2,-1.5508601899999999,0.17192320722222082 -Cr2I2_164_4413.vasp,Cr2I2,-1.061178565,1.1088905566666647 -Ni4I4O4_14_13747.vasp,Ni4I4O4,-1.1385234800000001,-0.04838123937500116 -Rb2Os2C2Cl8O4_7_14906.vasp,Rb2Os2C2Cl8O4,-3.0240877122222223,0.2584936170833273 -Zn1Ni3H4O8_1_20981.vasp,ZnNi3H4O8,-3.138599981875,-0.14432224385417103 -Na2Ti1H4O5_2_12318.vasp,Na2TiH4O5,-4.688260568333333,0.08654656097222269 -Co2W2Cl2O8_129_4055.vasp,Co2W2Cl2O8,-4.451182626428571,0.1497434637499926 -In2P2_129_8523.vasp,In2P2,-2.14299813,-0.49109047000000006 -Zn1Ni1Cl2_8_20977.vasp,ZnNiCl2,0.0911745075,0.88629797359375 -Mn2Te2_47_11309.vasp,Mn2Te2,-1.53139448,0.31484321068965526 -Cu2P2S4_26_5210.vasp,Cu2P2S4,-2.334041125,0.20345314071614357 -Ag1H4C6N6O2_6_75.vasp,AgH4C6N6O2,-5.68276848631579,0.18721690577484557 -Bi1Se2_164_2396.vasp,BiSe2,-1.7555100966666668,0.3860810872222198 -Ca3Pb3I14_6_3198.vasp,Ca3Pb3I14,-0.7109736805,0.14780188653749834 -Hf2O6_59_7550.vasp,Hf2O6,-6.4560151075,0.22389626531250006 -Mo4Pb4Se4O24_2_11757.vasp,Mo4Pb4Se4O24,-4.343431219444444,0.0503826994444454 -Mo1I2_115_11516.vasp,MoI2,-0.5641821366666667,0.770622523888889 -Zr2Tl4Pb2S8_13_21728.vasp,Zr2Tl4Pb2S8,-2.797837755625,0.16398815249999998 -Nb2Te4I4_12_12922.vasp,Nb2Te4I4,-1.9387180489999998,0.09840369720000053 -Mn1Br2_164_10657.vasp,MnBr2,-1.2516780566666668,0.030989334166666715 -Nb4Ge2Te8_55_13080.vasp,Nb4Ge2Te8,-3.395209858571429,0.06969501964285651 -Bi2Te2F2_59_2558.vasp,Bi2Te2F2,-1.82042463,0.38157460694444245 -Te1Pb2S1Br1_1_18323.vasp,TePb2SBr,-1.559502952,-0.7870472303333332 -Nb4O4F12_2_13118.vasp,Nb4O4F12,-4.8324534835,0.022752197500000015 -Hf1O2_187_7253.vasp,HfO2,-6.899087043333334,0.8884068549999995 -Mo1Pb1S4_3_11537.vasp,MoPbS4,-2.709252858333333,-0.1655016009375016 -Te1Pd1S1I1_8_18326.vasp,TePdSI,-1.0841005625,0.24633443868750005 -Zr1As2S6F2_164_21246.vasp,ZrAs2S6F2,-2.8859823418181816,0.9032280887784018 -Ge2P2S6_147_6810.vasp,Ge2P2S6,-3.2623157849999997,0.037705146484368623 -Co2As4S6Cl4_4_3855.vasp,Co2As4S6Cl4,-2.303770860625,0.42529158252740673 -Tl1Ag1As2Se6_149_19200.vasp,TlAgAs2Se6,-1.663673424,0.856299434124995 -Cu4H4S4Br4_14_5414.vasp,Cu4H4S4Br4,-1.48495768125,0.10069067009920402 -Cd1H4N6F2_1_3359.vasp,CdH4N6F2,-4.135337899230769,-0.03167489884615815 -Tb2F6_59_18194.vasp,Tb2F6,-4.4893878475,0.23730222125000022 -Mg2Sb4O8_2_10508.vasp,Mg2Sb4O8,-4.241177535714286,0.0988181585714285 -Co1H8C4S4N2_10_3772.vasp,CoH8C4S4N2,-4.590591207368421,0.2204560545065648 -Pt2Cl4O12_14_14613.vasp,Pt2Cl4O12,-2.295593736111111,0.4108263245833288 -Cu4C4O12_14_5401.vasp,Cu4C4O12,-4.3611765115,0.34439621974999757 -Na2H6N10O2_51_12123.vasp,Na2H6N10O2,-4.8492141195,-1.4149202187500016 -K2Mn2H8Cl6O4_2_9240.vasp,K2Mn2H8Cl6O4,-3.0667204918181814,0.014755390378785788 -Zn2Sn3O8_10_21173.vasp,Zn2Sn3O8,-3.5112302023076927,0.20925099884615095 -In1Ag1Sb2O6_149_8182.vasp,InAgSb2O6,-3.119249569,0.7160268571249968 -Tl1In1Au2Se4I3Br1_6_19292.vasp,TlInAu2Se4I3Br,-0.5678133516666667,0.31185598472222004 -K1Ga1I4O12_2_8900.vasp,KGaI4O12,-2.7950750927777777,0.1306196147916644 -K2Dy2I6_51_9093.vasp,K2Dy2I6,-1.047972163,-0.010606400111113162 -Fe2Sb2S4I2_26_5956.vasp,Fe2Sb2S4I2,-1.9695612180000002,-0.35650420920000186 -Mg3Sb3_25_10560.vasp,Mg3Sb3,-1.066215575,0.4148736106249982 -Na1W2S2Br6_47_11954.vasp,NaW2S2Br6,-2.112397349090909,0.10588093268938925 -P6Pd3_147_14141.vasp,P6Pd3,-2.7162264177777775,0.7723359472222224 -Hf1Zr1N1Cl2O2_1_7385.vasp,HfZrNCl2O2,-5.437181228571428,0.46436249702379806 -As1Pd2S2_187_1164.vasp,AsPd2S2,-2.109041668,0.4141525995000003 -V1I4_123_19870.vasp,VI4,-0.41723903399999995,0.34749098237500053 -In2Co2Se5_156_8415.vasp,In2Co2Se5,-1.9360967455555556,0.12320314325925497 -Ge2Sb2Cl2O6_7_6842.vasp,Ge2Sb2Cl2O6,-3.6526868958333334,0.3552825240277775 -Sn4S4_53_16960.vasp,Sn4S4,-2.107301995,0.35652822625 -In1Au1Se1S1Cl2_1_8200.vasp,InAuSeSCl2,-1.1248318833333333,0.3097721920312463 -Bi2Se2I2_59_2543.vasp,Bi2Se2I2,-1.2927557233333333,0.09692667833333335 -W1Br1Cl1_25_20417.vasp,WBrCl,-1.9767246166666668,0.8359600430555516 -Bi1Pd1Br2_1_2356.vasp,BiPdBr2,-0.7130026475,0.31675907541666576 -Mn2I2O1_8_11110.vasp,Mn2I2O,-1.8852069,0.23577473613792943 -Na4Sb4S8_14_12416.vasp,Na4Sb4S8,-2.60010135625,0.0669820837499997 -Na2Hg4Se2S6Br6_31_12166.vasp,Na2Hg4Se2S6Br6,-0.7540059805,0.08965380756249797 -La2P4H16C4O12_13_9604.vasp,La2P4H16C4O12,-5.060936193947368,0.19610286392104348 -Nb3Br2N1O1_1_12953.vasp,Nb3Br2NO,-4.9958089871428575,0.5304089847618991 -Bi1Pt2_164_2361.vasp,BiPt2,-0.7196194666666668,1.4481263016666648 -Ga2Pd1S4_164_6433.vasp,Ga2PdS4,-2.590758545714286,0.0986486157142834 -Sn2Se4_12_16886.vasp,Sn2Se4,-1.732739305,0.4133328416666666 -W3Se1Br1Cl4_1_20573.vasp,W3SeBrCl4,-2.24910456,0.7737979232407347 -Rb2H6C2O8_1_14849.vasp,Rb2H6C2O8,-3.3215940866666664,1.3980735189814775 -Nb6In4Cl18_12_13193.vasp,Nb6In4Cl18,-2.715407479642857,0.05269902930803383 -As12O24_1_1121.vasp,As12O24,-4.311135901388889,0.13006728402776924 -Cr1Cu1Te1Br1_8_4160.vasp,CrCuTeBr,-1.061235465,0.48372422677082966 -Al4N4_127_1076.vasp,Al4N4,-5.407033445,0.9268314550000003 -Al1Pt2_187_713.vasp,AlPt2,-2.2733764366666667,0.32346071625000006 -W2I10_6_20497.vasp,W2I10,-0.5512415058333333,0.31023437763888817 -Ho1P2_21_8117.vasp,HoP2,-3.1709793666666664,0.9963170249999964 -Ag1Pb1Se1I1_1_99.vasp,AgPbSeI,-0.58672286,0.21452255921874996 -Ta1Ge1S2_1_17549.vasp,TaGeS2,-4.38103452,0.15386825708332985 -Ce2Br2O2_129_3665.vasp,Ce2Br2O2,-4.751546076666666,0.07155729333333394 -Y7Br10_2_20847.vasp,Y7Br10,-3.097969146470588,0.10063929343136868 -Ta3N2Cl2_187_17967.vasp,Ta3N2Cl2,-6.085222017142857,0.5228216280952349 -Mn1Zn1Fe1O5_1_10940.vasp,MnZnFeO5,-3.31223274875,0.35119458429687184 -Hf2Se2_123_7611.vasp,Hf2Se2,-4.4970785225,0.07013629249999997 -P4Se6_11_14123.vasp,P4Se6,-2.725646447,0.19109965941666468 -Hf1Co1Pt1S1I2_8_7150.vasp,HfCoPtSI2,-2.3107300016666668,0.4546075547222169 -Ag2Te3As4Cl2_6_468.vasp,Ag2Te3As4Cl2,-1.403635569090909,0.22346798936363124 -Sb1Te1F1_156_15510.vasp,SbTeF,-2.073964913333333,0.3367086455555537 -Ca2Br4O4F8_30_2962.vasp,Ca2Br4O4F8,-1.7083835744444444,0.5836462169444422 -Tl4Ag4Te4O12_29_19586.vasp,Tl4Ag4Te4O12,-2.4907331325,0.09951943649690964 -In1Ir1S4I1Br1_1_8279.vasp,InIrS4IBr,-1.98167467125,0.16512824691406203 -Bi2F6_31_2458.vasp,Bi2F6,-2.58510169375,0.4102041718749998 -Bi1F5_47_2332.vasp,BiF5,-1.6490567133333334,0.20391421666666654 -Ni1Ir2Pd1Se8_1_13371.vasp,NiIr2PdSe8,-2.0975979316666664,-0.08803148833333291 -Ga2Sb2Te6_147_6460.vasp,Ga2Sb2Te6,-1.477092367,0.34263325746666484 -Ca2Br4O8_125_2963.vasp,Ca2Br4O8,-2.5840251850000002,0.31277447339285436 -Pt2Se2_164_14684.vasp,Pt2Se2,-1.5545198975,0.6207811549999999 -Cu2Ir1S1I2Br2_1_5180.vasp,Cu2IrSI2Br2,-0.63842842625,0.251374401527773 -Hf4S4Cl4_31_7807.vasp,Hf4S4Cl4,-4.340789815833333,0.14797398937499073 -Ba2Au1I2O2_123_1905.vasp,Ba2AuI2O2,-2.3001208857142856,0.48619693763392247 -Ca4As4_14_3206.vasp,Ca4As4,-2.05767230125,0.7186909054166666 -Li2Ge1H6S6_147_9923.vasp,Li2GeH6S6,-3.1377322986666667,0.1377909618333335 -V2Cl5_1_20037.vasp,V2Cl5,-2.0433755185714286,0.2382400828571405 -W3C2Cl2_187_20556.vasp,W3C2Cl2,-4.955370357142857,0.11826357436506885 -Zn4Cl4O4_14_21215.vasp,Zn4Cl4O4,-1.1641878433333332,0.4294916676041637 -Zr4Cl4O4_7_21817.vasp,Zr4Cl4O4,-4.8320355049999995,0.3490634366666674 -Co1Bi1O3_99_3707.vasp,CoBiO3,-3.002364154,0.44503345356249735 -Mg3Sn1_25_10568.vasp,Mg3Sn,-0.0676993425,-0.1690722895833333 -K3Sb2N2O6F7_12_9404.vasp,K3Sb2N2O6F7,-3.383743428,-0.01462519318333963 -Pr4Br10_11_14558.vasp,Pr4Br10,-2.440310854285714,0.09936859642857154 -Tl2Te2_164_19549.vasp,Tl2Te2,-0.59997456,0.35268482125 -Ba2Cd1In1Ag1S5_99_1939.vasp,Ba2CdInAgS5,-1.764403699,0.490171288535713 -Be2As2O10_4_2238.vasp,Be2As2O10,-4.327732612142857,0.37690479598213744 -Zn4Cl8_115_21216.vasp,Zn4Cl8,-0.5156779058333333,0.08448671562499999 -Ru2S2_6_15346.vasp,Ru2S2,-3.1111063325,0.6494378050000003 -In1Pt5Cl2_123_8321.vasp,InPt5Cl2,-1.28256848875,1.2080329608333318 -Li6H2Se2S8_11_10268.vasp,Li6H2Se2S8,-2.8540464188888888,0.06957642773147893 -Ba4Ce2_51_2148.vasp,Ba4Ce2,-0.2619474916666667,0.7596445499999991 -Bi4Pt2_2_2636.vasp,Bi4Pt2,-1.4624084983333334,0.22744486624999993 -Mg2N1_25_10487.vasp,Mg2N,-2.3600815566666666,0.6724065615277768 -In2Co2Te5_164_8419.vasp,In2Co2Te5,-1.3740420455555555,0.15661912222222074 -Li6Te2O8F2_11_10280.vasp,Li6Te2O8F2,-3.6300247522222224,0.29409154749999633 -V1Ag1Te6As2_5_19764.vasp,VAgTe6As2,-1.6222599070000001,0.343105702916665 -Tl1Co5F2_123_19247.vasp,TlCo5F2,-0.92440773375,0.9088615646874981 -Ba4Y2I14_7_2199.vasp,Ba4Y2I14,-1.5970408985,0.20028290499999857 -Zn2P2O6_147_21130.vasp,Zn2P2O6,-4.028563428,0.31271902710416244 -Bi4Te2Br2O9_99_2649.vasp,Bi4Te2Br2O9,-3.246897082352941,0.19406864112744815 -V1W1Br1N1Cl1O1_8_19950.vasp,VWBrNClO,-4.02290408,0.29517068261148527 -P1I5_10_13924.vasp,PI5,0.0021744866666666665,0.41762600499999997 -Ta2As2Se6_8_17650.vasp,Ta2As2Se6,-3.625107533,0.274693927666664 -Nb2Pd1O6_12_12811.vasp,Nb2PdO6,-5.718083071111112,-0.09355447972222719 -Ni1N1_187_13377.vasp,NiN,-2.52244374,0.9344315712500002 -Sr1Ca1Mn1Se1I2_8_17035.vasp,SrCaMnSeI2,-1.2213398633333334,0.5647471774042123 -Mo2Cl6_162_11601.vasp,Mo2Cl6,-1.79028413625,0.13979838479166462 -Pd1I2_187_14366.vasp,PdI2,0.14958177,0.4407907375 -Cu8W4O16_2_5505.vasp,Cu8W4O16,-3.9751242421428574,0.3091805305357078 -Tl2Bi2O6_149_19372.vasp,Tl2Bi2O6,-2.925745081,0.3583346222499999 -Sr3Mn2Br2O5_123_17383.vasp,Sr3Mn2Br2O5,-3.832318095833333,-0.016493315138900733 -W3Se4_12_20574.vasp,W3Se4,-3.375071412857143,0.534395642857137 -Al2C4F14_10_783.vasp,Al2C4F14,-3.5330986314999997,0.5341048735000002 -Fe2P2I2O4_26_5907.vasp,Fe2P2I2O4,-3.242789693,0.25164541810713303 -Tl1Ag1Sb2Se6_149_19207.vasp,TlAgSb2Se6,-1.468087381,0.10595492766666462 -Er1Sb2_21_5546.vasp,ErSb2,-2.3245094033333333,0.19088692749999758 -Sc4N3O2_164_16251.vasp,Sc4N3O2,-6.370124276666667,-0.054267594444451284 -Si2O2_12_16421.vasp,Si2O2,-4.975922515,0.5790494324999998 -K2C4S6F6_1_9035.vasp,K2C4S6F6,-3.3293939383333333,0.14522085979165766 -Pb2S2_164_14279.vasp,Pb2S2,-2.0833281625,-1.4101947175 -Ga2Te2_164_6509.vasp,Ga2Te2,-1.7879537775,0.1452464383333334 -In1Ga1Se2Br2_1_8259.vasp,InGaSe2Br2,-1.6625959616666668,0.05338290458333339 -Re2I6_162_15054.vasp,Re2I6,-1.3359189925,0.3405327270833334 -Te2N2_2_18416.vasp,Te2N2,-3.0868833825,0.4658848070833336 -Mn2W2Se2O12_113_11346.vasp,Mn2W2Se2O12,-4.548678471666666,0.1832004029166625 -Nb3B2O2_187_12948.vasp,Nb3B2O2,-6.675204244285714,0.3911819969642796 -Ni1Ir1Pd2Cl8_6_13367.vasp,NiIrPd2Cl8,-0.9431259525,0.09096972611110674 -Sr1Ta2H2O7_123_17090.vasp,SrTa2H2O7,-6.183858903333333,0.10835180736111116 -Nb1P2_164_12554.vasp,NbP2,-4.771784936666667,0.8245496799999996 -Lu2I6_162_10313.vasp,Lu2I6,-1.51595026625,0.055568982500000086 -Mn2P2Cl2O4_26_11182.vasp,Mn2P2Cl2O4,-3.7721186789999996,0.4024710134259225 -Mn2P2Se4Br2_26_11196.vasp,Mn2P2Se4Br2,-2.2105280350000003,0.09035346412500012 -Pt2S2_6_14667.vasp,Pt2S2,-2.192224805,0.42285635499999996 -Na1In1As2Se6_5_11881.vasp,NaInAs2Se6,-2.120177048,-0.011775828666668792 -Tl1Si1S3_143_19345.vasp,TlSiS3,-2.5003766880000002,0.5300232646874976 -Tl1Cu1Te6P2_149_19260.vasp,TlCuTe6P2,-1.423679079,0.3425313609999985 -Co2P2S5_8_3962.vasp,Co2P2S5,-3.011948561111111,0.3491296892361083 -Ta2B1S2_164_17658.vasp,Ta2BS2,-6.25114514,0.15859399600000046 -Na2Co2As2_129_12058.vasp,Na2Co2As2,-1.9424090850000002,0.11665547333333293 -B3Mo4H2_164_1736.vasp,B3Mo4H2,-4.341572796666666,0.6621498255555518 -Li1In1Cl4O12_2_9729.vasp,LiInCl4O12,-2.661521958333333,0.17949228645833104 -Zn1P2Pd1Se6_149_20989.vasp,ZnP2PdSe6,-2.025860348,0.23202556941666413 -Te2Au2I2_59_18368.vasp,Te2Au2I2,0.07090022333333333,0.23932502 -Ta2Te10Pt2_51_17892.vasp,Ta2Te10Pt2,-2.528398712142857,0.07274237785714321 -Tb2Cu2Pb2Se6_51_18192.vasp,Tb2Cu2Pb2Se6,-2.2910479274999997,0.19147318125000012 -B2Te5_1_1718.vasp,B2Te5,-2.336994541428571,0.5459910842857101 -Mg2Mn2Ge2_129_10476.vasp,Mg2Mn2Ge2,-1.6338626166666668,0.38908872999999966 -Tl2Sb6_164_19523.vasp,Tl2Sb6,-1.23098537625,0.5385336946874999 -Hf1Pd1I1Br4Cl1_1_7267.vasp,HfPdIBr4Cl,-1.73589863875,0.12854485679687527 -Hf1Bi2Se1Br2_6_7122.vasp,HfBi2SeBr2,-2.1577704816666667,0.25063389083333143 -Ge2Se1S1_6_6863.vasp,Ge2SeS,-2.95237503,-0.3766544306249997 -Ru1Rh1I2_1_15282.vasp,RuRhI2,-0.8308695425,0.8865585037499986 -Cu2Se2Cl2_59_5298.vasp,Cu2Se2Cl2,-0.6915126833333334,0.2572965411507928 -Mo2N1O2_164_11634.vasp,Mo2NO2,-5.072855906,0.4038062930000006 -Ir1C1Br1F1_8_8729.vasp,IrCBrF,-2.8415554375,1.0127993260416628 -Nb2C2F2_59_12669.vasp,Nb2C2F2,-5.8490662716666675,0.44312257233332053 -Cr2As2O6_162_4307.vasp,Cr2As2O6,-4.7258829030000005,0.07181701599999935 -Al2Ge2Se6_162_850.vasp,Al2Ge2Se6,-2.804921078,0.032689849166664176 -Mn1Ni1H10C14N6_10_10827.vasp,MnNiH10C14N6,-5.864398189375,-1.6743737539583354 -Te2Rh1_115_18494.vasp,Te2Rh,-1.5053283633333334,0.6966901788888886 -Li1Tl1Cl4O12_2_9804.vasp,LiTlCl4O12,-2.4824638244444444,0.20351176479166444 -B2Au2O2F2_31_1652.vasp,B2Au2O2F2,-2.8307984775,1.6388722513888834 -Te2Rh2_129_18504.vasp,Te2Rh2,-1.885464015,0.3378840270833312 -Cd1Ga2Se4_164_3311.vasp,CdGa2Se4,-1.7571064314285714,0.15773667714285722 -Nb2O3_1_12795.vasp,Nb2O3,-6.109239572,0.6898638690833279 -Mg2Mo3O8_10_10485.vasp,Mg2Mo3O8,-4.693873475384615,0.469111896923077 -Pd1S2_187_14387.vasp,PdS2,-1.8862338233333331,0.43157838083333355 -Ta1F2_115_17539.vasp,TaF2,-4.379761406666667,0.8913793906666627 -Al8Te6_31_1116.vasp,Al8Te6,-2.009170757142857,0.3134712414285694 -Tl2P2O6_149_19479.vasp,Tl2P2O6,-4.350290629,0.3330703102500001 -Bi1Te6P2Au1_143_2412.vasp,BiTe6P2Au,-1.526862687,0.3200691287499944 -K1Eu1Cu2Te4_99_8894.vasp,KEuCu2Te4,-1.24813633125,-0.0006733415625020112 -Sn1Se2_187_16696.vasp,SnSe2,-1.7545121166666666,0.39156002999999995 -Hf4C3S2F2_164_7776.vasp,Hf4C3S2F2,-5.845195968181818,0.7091354074999952 -Na1C6Br4O2_2_11837.vasp,NaC6Br4O2,-4.460011046153846,0.24919170230768195 -V1F2_115_19824.vasp,VF2,-3.11915046,0.15572252444444112 -Sb2Mo2Se6_2_15605.vasp,Sb2Mo2Se6,-2.438884369,0.3274746464999979 -Ge2O2_31_6793.vasp,Ge2O2,-4.435849635,-0.22913156562500037 -Te2Os1Cl12_2_18419.vasp,Te2OsCl12,-1.1653766706666666,0.030347547499998906 -Ca2Au1S2Br2_38_2932.vasp,Ca2AuS2Br2,-1.7013110185714286,0.2565891671428533 -K2Mg1H4Se2O8_2_9218.vasp,K2MgH4Se2O8,-3.796113438823529,0.06468052598038865 -Bi2S2_12_2516.vasp,Bi2S2,-1.97409519,-0.6850989433333343 -Al2As2O6_162_761.vasp,Al2As2O6,-5.300605694,0.03459107500000069 -Mn1Sn1Br1Cl1O2_6_10888.vasp,MnSnBrClO2,-2.8885690683333336,0.06165806770833293 -Bi12O24_1_2299.vasp,Bi12O24,-3.5095271719444443,0.2580236739930526 -Ca1Te2H2_5_2894.vasp,CaTe2H2,-2.14957189,0.7492084853333336 -Rb1Cl1_123_14727.vasp,RbCl,-1.23589604,0.17940500999999998 -Sb2P2S6_1_15625.vasp,Sb2P2S6,-2.947076059,0.14754559670312517 -Hf1Ge1Cl2_1_7173.vasp,HfGeCl2,-3.1317814375,0.5648464240625 -Sc1Au2S1N1F3_1_15902.vasp,ScAu2SNF3,-2.48333536,0.33114135156249996 -Au1F2_10_1425.vasp,AuF2,-0.3663466366666666,0.43309211407407333 -Tl2Cl2_129_19391.vasp,Tl2Cl2,-0.839054795,0.08844301499999996 -Rb1Sn1O2_156_14752.vasp,RbSnO2,-2.8019583075,0.4915993074999956 -Na2Hg4Te2Br6O6_31_12170.vasp,Na2Hg4Te2Br6O6,-1.3040315395,0.23028188887500045 -B4P4_127_1762.vasp,B4P4,-4.69077375375,-0.8399826787500002 -Cu2H8C12S2N4Cl2_28_5139.vasp,Cu2H8C12S2N4Cl2,-5.188448411666667,0.2844377392222168 -W4C3O2_164_20577.vasp,W4C3O2,-6.496064686666667,0.012121192879805093 -Zr1Ti3Te8_25_21484.vasp,ZrTi3Te8,-3.2865190516666662,0.23862802125000027 -Y4C3S2_164_20816.vasp,Y4C3S2,-5.6063392655555555,0.7578888499999943 -Cu2H4C4S8_14_5122.vasp,Cu2H4C4S8,-3.422955811111111,0.3567931534953609 -K2As2O2F8_2_8974.vasp,K2As2O2F8,-2.8956267064285717,0.05497067749999962 -Nd1Si5_47_13228.vasp,NdSi5,-3.5786192949999998,-0.00183520055555908 -Zr3Nb1Br8_65_21776.vasp,Zr3NbBr8,-2.3914586166666667,0.4344164858333298 -Co1H4Br2N6_47_3744.vasp,CoH4Br2N6,-4.036796859230769,-0.018220296346160403 -K2C4O2_31_9032.vasp,K2C4O2,-4.50865615125,1.0299676690625001 -Fe2Te4_11_6022.vasp,Fe2Te4,-1.0804246149999999,0.5478273 -Na1Al1Sb2Te6_5_11818.vasp,NaAlSb2Te6,-1.55329628,0.3383439151666649 -Ni1Pd1S4_10_13399.vasp,NiPdS4,-1.9195000183333333,0.1612113789583316 -Mn3H2C2O2_187_11383.vasp,Mn3H2C2O2,-4.345638847777778,0.6006846755555459 -Ti2B1S2F2_164_18889.vasp,Ti2BS2F2,-4.327393891428572,0.5748306274999855 -Hf3Se2N2F2_187_7730.vasp,Hf3Se2N2F2,-5.126491715555556,1.0504333919444333 -K2N2O6_1_9247.vasp,K2N2O6,-4.095945807,0.07523732075000034 -Zn2Ga2S5_164_21083.vasp,Zn2Ga2S5,-2.0593587233333333,0.15778219099999813 -Te1As1F1_156_18280.vasp,TeAsF,-2.1849995233333335,0.25150326027777536 -Hg1Pb2S2F2_12_7901.vasp,HgPb2S2F2,-1.6408309342857144,-0.23859381285714495 -Ta1I1N1Cl1_6_17555.vasp,TaINCl,-4.1085897125,0.4837684417499979 -K2Fe4Se6_51_9107.vasp,K2Fe4Se6,-1.2812675833333333,0.264044563749998 -Mo2H2C1_164_11612.vasp,Mo2H2C,-4.03733648,0.8243930842500011 -Ni4S4Br4_14_13756.vasp,Ni4S4Br4,-0.8796261566666667,0.01972892854166486 -Ti2Sb1Te2_164_19010.vasp,Ti2SbTe2,-3.9151871739999997,0.20880727000000032 -Bi4O8_2_2629.vasp,Bi4O8,-3.4654864558333336,0.3020643901041633 -Hf1Sc1Se1S1Br2_25_7300.vasp,HfScSeSBr2,-3.673409965,0.08263889749999598 -Cr1Se1O1_156_4261.vasp,CrSeO,-3.73246412,0.17115261246211766 -Ti2As2O6_12_18879.vasp,Ti2As2O6,-5.78689275,0.2805781263333307 -Na2Nb2F12_4_12227.vasp,Na2Nb2F12,-3.838831485625,2.161168514375 -Cr1Ga2Te4_164_4179.vasp,CrGa2Te4,-1.79816898,0.13259359996825404 -Cr1Mo3Se8_25_4216.vasp,CrMo3Se8,-2.9326463766666664,0.04303494458333379 -Ru6Se8_11_15374.vasp,Ru6Se8,-2.931411752142857,0.40652377999999656 -Tl2Zn3O6_156_19572.vasp,Tl2Zn3O6,-2.252769178181818,0.18032937704545238 -Sb2Te2_129_15727.vasp,Sb2Te2,-1.5748638975,0.3443186762499979 -Li1Ga1As2O6_5_9704.vasp,LiGaAs2O6,-4.1805040490000005,0.3543244277499951 -Nb4Mo2O16_13_13092.vasp,Nb4Mo2O16,-6.078284276818182,0.05556094380680768 -Li2B2H8S8_2_9837.vasp,Li2B2H8S8,-3.5255553419999996,0.024101955750000625 -Co1H4C8Br2_25_3764.vasp,CoH4C8Br2,-5.07272034,0.42064292733332626 -Na1Mo2I6O2_47_11901.vasp,NaMo2I6O2,-1.8289703945454543,-0.00572453041667087 -Si1Mo1O4_111_16347.vasp,SiMoO4,-5.417192431666667,0.44371658083333276 -As2Pt3Se8_164_1282.vasp,As2Pt3Se8,-2.0732675392307693,0.3404886426538438 -Zr2Pd1Se2S2Br3Cl1_1_21633.vasp,Zr2PdSe2S2Br3Cl,-2.6193055845454545,0.2733263406818125 -Pd1O1_123_14372.vasp,PdO,-2.02209706,0.6178519974999999 -Ca1Nb2S7_123_2861.vasp,CaNb2S7,-3.746250448,0.40008755099999727 -Nb4O10_59_13115.vasp,Nb4O10,-6.658067861428571,-0.19089285660714522 -Nb1Br1Cl1_156_12477.vasp,NbBrCl,-2.92034658,0.2890207909821385 -Mn1Ag1S1I1Br1F1_1_10614.vasp,MnAgSIBrF,-1.1197470033333332,0.2237456576041652 -As1Au1Br1Cl1O2_1_1132.vasp,AsAuBrClO2,-1.9401599033333332,0.2514689881944385 -Na1C1N1_25_11833.vasp,NaCN,-5.192318903333333,0.39303481166666066 -Ga1Ru1Se1I1_156_6257.vasp,GaRuSeI,-1.8603846875,0.37833997624999705 -Sc2P2S8_2_16120.vasp,Sc2P2S8,-3.7671018666666662,0.0613379070833302 -Sb2Br2O2_129_15549.vasp,Sb2Br2O2,-2.8937642149999996,0.013715227666665442 -Ca2B4H16O16_2_2946.vasp,Ca2B4H16O16,-5.013765822631579,0.06675543565788455 -Nb6Ge2S12_26_13190.vasp,Nb6Ge2S12,-4.6637214005,-0.011289568500000513 -Cd2Si1O4_21_3577.vasp,Cd2SiO4,-3.136337414285714,0.5798466996428573 -Mo2N1F2_164_11633.vasp,Mo2NF2,-3.934598372,0.09274447766666194 -Sc1I2_115_15947.vasp,ScI2,-1.2915337833333334,0.4536949938888871 -Ta13Se26_2_17502.vasp,Ta13Se26,-4.568697582820513,0.12638155884615365 -Sc1Ag1As2S6_149_15886.vasp,ScAgAs2S6,-2.8198416550000003,0.30313689043749736 -Sc1S2_164_15989.vasp,ScS2,-3.7883380066666668,0.47000567697916384 -Fe2Pb6F18_2_5926.vasp,Fe2Pb6F18,-2.543844721153846,0.04605130442307481 -V3S4_164_20289.vasp,V3S4,-3.913736792857143,-0.8130537264285715 -Zn2Sn2O6_162_21171.vasp,Zn2Sn2O6,-3.313954843,0.21430493000000062 -Ti1V3Se2Br4N2_1_18869.vasp,TiV3Se2Br4N2,-3.694591648333333,0.10353611124999684 -Ni2Sb2S6_162_13612.vasp,Ni2Sb2S6,-1.953441889,0.292932545312498 -Li1Fe2C2O7_1_9700.vasp,LiFe2C2O7,-4.861300748333334,0.3370922779687445 -Cr2Au1O6_1_4316.vasp,Cr2AuO6,-4.010305486666667,-0.16583199048611896 -Ag1Sb1P2Se6_143_119.vasp,AgSbP2Se6,-2.200066084,0.07897986693749859 -Sr2Tl1Cd1Cu1O5_99_17335.vasp,Sr2TlCdCuO5,-2.6529801280000003,0.25013733279166256 -Li1Sb2Pd1S6_149_9783.vasp,LiSb2PdS6,-2.36319154,0.36414438471874777 -Ga2Hg1S4_164_6383.vasp,Ga2HgS4,-2.057513947142857,0.18912021714285698 -Pb1Br2O1_1_14171.vasp,PbBr2O,-1.399729345,0.3350046115625003 -Fe1O1F3_25_5728.vasp,FeOF3,-2.023331778,0.10709357524999996 -Tc1I2_164_18220.vasp,TcI2,-2.1279785833333333,0.42387121944444217 -Zr2I8_1_21600.vasp,Zr2I8,-1.390207959,0.09334378333333326 -Ga8Te6_31_6594.vasp,Ga8Te6,-1.6752713235714285,0.138171572857142 -Cr2N2F2_59_4427.vasp,Cr2N2F2,-4.403250058333334,0.15264391555555124 -Hf1Te4Cl6_2_7327.vasp,HfTe4Cl6,-1.9696832681818182,0.19253016524620992 -Hf2Ge2S8_31_7496.vasp,Hf2Ge2S8,-4.1512878325,0.14835331635416615 -Cu2I4Cl2_1_5175.vasp,Cu2I4Cl2,0.11259210375,0.15138064432291704 -Zr2I2_164_21591.vasp,Zr2I2,-2.37980013,0.15224988750000024 -Mg1Mn1Cu1S2Cl3_1_10385.vasp,MgMnCuS2Cl3,-1.70833771625,0.29583296090625 -V1Te2_10_19940.vasp,VTe2,-1.8442646333333332,0.5229764244444444 -Al1Sb2Te6Au1_149_731.vasp,AlSb2Te6Au,-1.3322701179999998,0.2149249071249999 -Rb4Hg2Cl8_11_14972.vasp,Rb4Hg2Cl8,-0.6447487807142858,0.173622795 -Ca2Sm2Cu2Cl2O6_129_3125.vasp,Ca2Sm2Cu2Cl2O6,-4.085324096428571,0.07170239794642416 -Ag2Te3As4F2_6_469.vasp,Ag2Te3As4F2,-1.5548020090909092,0.3452097942424205 -Te1C1_156_18291.vasp,TeC,-2.88534314,1.9587124433333334 -W8O18_1_20596.vasp,W8O18,-5.650746936538462,0.5881140858948136 -Ni4Cl8_14_13744.vasp,Ni4Cl8,-0.5818772991666666,-0.27238197249999996 -Co1H2S2_164_3741.vasp,CoH2S2,-2.855036432,0.18027966091666459 -Ti2Br2N2_59_18898.vasp,Ti2Br2N2,-5.687751211666666,-0.343297412291669 -V4S12_2_20357.vasp,V4S12,-3.47452818,0.03931556468749653 -In1Bi1I2_1_8208.vasp,InBiI2,-0.4964988625,0.24352919708333287 -Ge1H2_115_6670.vasp,GeH2,-2.7037971400000003,1.2377012249999964 -Co2Te2_25_4041.vasp,Co2Te2,-1.4549534425,0.1968488108333335 -Fe2Mo2Br2O8_129_5869.vasp,Fe2Mo2Br2O8,-3.771275441428571,0.179287810952379 -Sb2Se1S2_164_15689.vasp,Sb2SeS2,-2.549566198,0.10663582533333127 -Pd2S4Cl2_11_14474.vasp,Pd2S4Cl2,-1.73698554,0.14005297437499986 -Mn2P2S4F2_26_11192.vasp,Mn2P2S4F2,-3.0042438529999997,0.46182730802777416 -Cu1O2_47_4927.vasp,CuO2,-1.5036994733333333,1.2638807908333312 -Hf1Zr3S4I4_25_7419.vasp,HfZr3S4I4,-3.580439125,0.010048868958324353 -Ti3B2H2O2_187_19059.vasp,Ti3B2H2O2,-5.918926975555555,0.3829617499999949 -Li1In1I4O12_2_9730.vasp,LiInI4O12,-2.9170815405555555,0.07211518666666672 -Na2Cd4S2O6F6_31_12028.vasp,Na2Cd4S2O6F6,-2.374752461,0.20382848331249914 -Zn4Sn4O8_1_21231.vasp,Zn4Sn4O8,-2.700686559375,0.29933035875000025 -Hf2N1_164_7540.vasp,Hf2N,-6.63028743,1.5433000199999993 -Na1Te6As2Pd1_5_11940.vasp,NaTe6As2Pd,-1.566328831,0.2624323836999979 -Re2Se2_187_15082.vasp,Re2Se2,-4.49886712,0.5474580937500004 -Sc2Br2_164_16042.vasp,Sc2Br2,-2.3487245925,0.11611316666666416 -Ta2I2O4_11_17757.vasp,Ta2I2O4,-5.64332224625,-0.45742607625 -Y2F4_11_20729.vasp,Y2F4,-4.6504395233333335,0.4432506838888835 -Ta4Te12_11_18126.vasp,Ta4Te12,-3.104943378125,0.06806601489582964 -Lu2Te5O13_1_10319.vasp,Lu2Te5O13,-4.345936244,0.17165203650000027 -Mn1Zn1Pd1Br2O3_8_10943.vasp,MnZnPdBr2O3,-2.12439348125,0.1394853735416644 -Ni1I2_115_13362.vasp,NiI2,0.59147206,0.16216116333333325 -Li1Fe1O2_156_9695.vasp,LiFeO2,-3.635298455,0.42500796750000003 -Ga1P2Au1O6_149_6230.vasp,GaP2AuO6,-4.265301212,0.6778272907999998 -Cd1In2Se4_164_3377.vasp,CdIn2Se4,-1.4840044142857143,-0.3071389200000001 -Ti1F2_115_18775.vasp,TiF2,-4.327796536666667,-0.043003381111115346 -As2S2I2_2_1290.vasp,As2S2I2,-1.944054605,0.07557516083333327 -H2W4N3O2_164_7043.vasp,H2W4N3O2,-5.675752384545454,-1.072566053350858 -Ga1Ru1I2O2_6_6256.vasp,GaRuI2O2,-2.51843159,0.3506315784722194 -Te2Au4O12_14_18375.vasp,Te2Au4O12,-2.474948066111111,0.1702008884722197 -B13Sb2_164_1609.vasp,B13Sb2,-4.778810551333334,0.865185650222217 -Cu2Se4_14_5313.vasp,Cu2Se4,-0.99657845,-0.780488395 -Mo4S8_156_11760.vasp,Mo4S8,-3.543354903333333,0.22276371500000058 -Hf2Se1S1I4_8_7600.vasp,Hf2SeSI4,-2.88589822375,0.14155017520833324 -Cd2W2O8_13_3604.vasp,Cd2W2O8,-4.584934674166667,0.14996769583333247 -Cd1Te2F2_1_3437.vasp,CdTe2F2,-0.9836847240000001,0.33440878666666685 -Zn2Bi4O6F4_31_21046.vasp,Zn2Bi4O6F4,-2.85142452875,0.14512973687500008 -Cu1W1Br2N2Cl2_8_4999.vasp,CuWBr2N2Cl2,-2.38666110875,0.4052045242013835 -In2Si2Te6_162_8606.vasp,In2Si2Te6,-1.9413821949999999,0.07212026400000027 -Sc4C3F2_164_16230.vasp,Sc4C3F2,-5.196790873333333,0.1875934596774147 -Tm2H4Cl2O4_11_19679.vasp,Tm2H4Cl2O4,-4.664419545,0.0959620249999995 -Mg3Si2H4O9_157_10563.vasp,Mg3Si2H4O9,-5.149249923888889,0.0515470163888887 -Ga4Te6_8_6580.vasp,Ga4Te6,-1.590540541,0.21948344420000002 -Zr1Bi1Sb1_156_21256.vasp,ZrBiSb,-2.6887770300000002,0.1367109333333305 -K2Ta2Ag4Se8_28_9357.vasp,K2Ta2Ag4Se8,-2.05689349875,0.15809777624999788 -Ge1O2_187_6685.vasp,GeO2,-4.250369233333333,0.6342629841666669 -Li2Co2Si2O8_11_9868.vasp,Li2Co2Si2O8,-5.0432062,0.11120723999999438 -Ta2S2Cl4_25_17846.vasp,Ta2S2Cl4,-3.6219892675,0.2457319668750002 -Cd1Au1Se1S1Br1Cl1_1_3271.vasp,CdAuSeSBrCl,-0.2886984266666667,0.4790586892708314 -Ir2Se2_6_8845.vasp,Ir2Se2,-2.4932473475,0.5743724443750002 -Zr3B2Cl2_187_21733.vasp,Zr3B2Cl2,-4.672682277142857,-0.12339189285714691 -P4W2O16_11_14128.vasp,P4W2O16,-5.770813430909091,0.020565963863635517 -Zr1Br4_123_21272.vasp,ZrBr4,-1.9531506879999998,0.2725025950000004 -Tl2In2Se6_31_19450.vasp,Tl2In2Se6,-1.565892351,0.2696128326666644 -Bi2S2Br2_59_2510.vasp,Bi2S2Br2,-1.7738380366666666,0.06484131000000004 -Hf4C3_164_7778.vasp,Hf4C3,-7.352921981428572,0.35143725457142166 -Tl1O2F2_164_19310.vasp,TlO2F2,-1.5205986660000002,0.8945423665000001 -V8Zn2O18_85_20401.vasp,V8Zn2O18,-4.9736845164285715,0.2077217910714273 -Zn2As4O8_4_21033.vasp,Zn2As4O8,-3.8244243728571425,0.04146605607142906 -V1W1I1Br1N2_25_19953.vasp,VWIBrN2,-4.311115516666667,0.154775199043205 -Tl1S1Br2_1_19329.vasp,TlSBr2,-0.80471588,0.27579560515625 -Co1O2_164_3805.vasp,CoO2,-3.7250249833333338,-0.627858551250003 -Ge6Sb2_191_6968.vasp,Ge6Sb2,-2.0764539225,0.12416956437500015 -Cu3Sb1O4_156_5383.vasp,Cu3SbO4,-2.1797748275,0.9247230342187497 -In1Co5F2_123_8221.vasp,InCo5F2,-1.20779629125,0.7806789224999999 -Co1Se1Br1_156_3820.vasp,CoSeBr,-1.6544727333333331,0.09862844333333376 -Ni1Te5Ir2Ru1Se3_1_13438.vasp,NiTe5Ir2RuSe3,-2.0112039608333334,0.28894750874999753 -Hf1Sb2H2S6_164_7288.vasp,HfSb2H2S6,-3.0101357345454547,0.6299431979545382 -Zr1Fe1F6_5_21289.vasp,ZrFeF6,-3.71532679625,0.13454833125 -V2Te2H4S10_2_20207.vasp,V2Te2H4S10,-2.8907725516666667,0.23292401185184924 -Ca2Sb4O8_2_3119.vasp,Ca2Sb4O8,-4.259046817857143,0.05858814528571041 -Hf2Br2N3_8_7446.vasp,Hf2Br2N3,-5.5370761971428575,0.39761156892856686 -Mn1Co1O4_10_10670.vasp,MnCoO4,-4.035786548333333,-0.2547984681250033 -Y4H2C3_164_20823.vasp,Y4H2C3,-5.551049703333334,0.19697656999998858 -Li6Se2O8F2_11_10275.vasp,Li6Se2O8F2,-3.641452692777778,0.23688109092592224 -V3H2N2_187_20267.vasp,V3H2N2,-5.012722744285715,0.09787188285713766 -As1Br1O1_156_1135.vasp,AsBrO,-2.628229146666667,0.3833022699999966 -Zn1P1_8_20988.vasp,ZnP,-0.46345671,0.8362073334374978 -Ag2Te4W1_111_483.vasp,Ag2Te4W,-1.2227215428571427,0.2865961180952352 -Ti1Mo3S6Br2_1_18805.vasp,TiMo3S6Br2,-3.3912597724999998,0.2455299197916576 -In2Se5_1_8600.vasp,In2Se5,-1.8809286414285715,0.19586910666666446 -Nb4B3O2_164_13037.vasp,Nb4B3O2,-6.721549321111111,0.35831625930555067 -In3S1I1Br1_1_8654.vasp,In3SIBr,-1.2056028783333332,0.3278862249999988 -Sc2O2F2_59_16111.vasp,Sc2O2F2,-5.5816930099999995,0.061779430000000524 -Mg3P2O16_10_10556.vasp,Mg3P2O16,-4.292554099047619,0.3041348190476163 -Ca2P1_164_3082.vasp,Ca2P,-1.6998429933333332,0.5398486849999988 -Te2Mo2C1_12_18405.vasp,Te2Mo2C,-3.5755486920000004,0.018216141999999547 -Na2O2F2_11_12241.vasp,Na2O2F2,-2.211054355,0.37278643041666437 -In2Sb4S8Br2_11_8570.vasp,In2Sb4S8Br2,-2.336876378125,0.1314699749999999 -Sn1I3_99_16652.vasp,SnI3,-0.1795519625,0.252072733854166 -Al2Zn2O5_156_1038.vasp,Al2Zn2O5,-4.110100155555555,0.2706235111111067 -Zr2I1Br1N1_156_21584.vasp,Zr2IBrN,-4.237807188,0.06793589249999665 -Cs2Lu1Br6_164_4753.vasp,Cs2LuBr6,-1.4354425199999998,0.09836784680555422 -Hf3Br2O5_1_7691.vasp,Hf3Br2O5,-6.198665051,0.2844516577500009 -Fe2O2_6_5894.vasp,Fe2O2,-2.676967075,0.8687582635416646 -Ir2Cl6_191_8780.vasp,Ir2Cl6,-1.03238380875,0.651663495 -B2I6_26_1675.vasp,B2I6,-1.12599409875,0.105291515 -Te2P1_187_18435.vasp,Te2P,-1.8632476166666667,0.5332748827777758 -Cr1P2Au1Se6_5_4229.vasp,CrP2AuSe6,-2.267703052,0.09796015443749839 -Co2C4_12_3886.vasp,Co2C4,-4.591316175,1.377867128333328 -Ni1H2S2_164_13326.vasp,NiH2S2,-2.3062816760000002,0.2042247048333317 -Rb2B2H6S8_4_14772.vasp,Rb2B2H6S8,-3.0058439777777775,0.3097417197222192 -W2C2Br2_59_20475.vasp,W2C2Br2,-4.66442018,0.1903641580555484 -Ta2Ni4Se6_11_17803.vasp,Ta2Ni4Se6,-2.5040975241666668,0.07883424083333335 -Cr2I8_1_4417.vasp,Cr2I8,-0.376472672,0.07096301237500037 -Ta3Te1Cl7_156_17996.vasp,Ta3TeCl7,-3.4296202000000005,-0.04323533892046333 -Sr3Au2I2O4_123_17351.vasp,Sr3Au2I2O4,-2.4310767736363634,0.1919114293181784 -Te4P2Pb1_164_18606.vasp,Te4P2Pb,-1.9809448328571428,-0.1686855628571463 -Cu1Cl2_187_4870.vasp,CuCl2,-0.16415760666666665,0.32499749666666666 -Nb2Se2N1_164_12874.vasp,Nb2Se2N,-5.618766848,-0.06507766749999933 -K4Cd1As2_164_9423.vasp,K4CdAs2,-0.23354670428571428,0.09681481571428568 -Hf3H2C2O2_187_7704.vasp,Hf3H2C2O2,-6.5443817088888885,0.3768991810493767 -Zn1N1F2_1_20975.vasp,ZnNF2,-1.7561912,0.8247805887500002 -Ba2Sn4H4O8_4_2062.vasp,Ba2Sn4H4O8,-4.066551559444445,0.062440128888887614 -Ni1Cl2O8_147_13310.vasp,NiCl2O8,-2.2239369645454548,0.3020445218181811 -Ca3Mn2S5Br2_123_3187.vasp,Ca3Mn2S5Br2,-2.5072863408333332,0.2235881999999969 -Ge4H4O10_1_6930.vasp,Ge4H4O10,-4.59677194888889,0.0950532667592543 -Nb1Cu1Te1Br1_156_12502.vasp,NbCuTeBr,-1.862199075,0.5802888465178532 -Na2Mg4H6S4O16_2_12206.vasp,Na2Mg4H6S4O16,-4.3192208803125,0.06641557856769674 -Al2Hg1S4_164_872.vasp,Al2HgS4,-2.5667084157142854,0.20589097571428594 -As4Se2S12_18_1369.vasp,As4Se2S12,-2.360819334444445,0.723527064884256 -Cr1C4S6Cl1F4_1_4136.vasp,CrC4S6ClF4,-3.435820531875,0.49593571011718707 -P10Se10_26_13901.vasp,P10Se10,-2.7558900585,0.31304543618750014 -Zr2P2S6_2_21627.vasp,Zr2P2S6,-4.062374908000001,0.21767799237499563 -Hf1Bi2_164_7123.vasp,HfBi2,-2.851343333333333,0.23043042833333338 -Nb2S2Cl4_25_12837.vasp,Nb2S2Cl4,-3.31897333125,0.23683231977272245 -Hf2I1Br3_6_7509.vasp,Hf2IBr3,-2.8291031266666664,0.22381403259259003 -Ba1Ta1Cu1O5_99_1863.vasp,BaTaCuO5,-4.938523725,0.42714706033853567 -Cu1W1I5Br1_1_5000.vasp,CuWI5Br,-0.4854404475,0.22811315413628475 -Cu2Hg2Se2Br2_26_5158.vasp,Cu2Hg2Se2Br2,0.04570293,-0.09770412534722159 -Si3O6_5_16473.vasp,Si3O6,-6.267776266666667,0.1421366466666658 -As2Br2_2_1192.vasp,As2Br2,-1.730158185,0.11983581666666487 -Ru2S2_67_15345.vasp,Ru2S2,-2.4869443275,1.27359981 -Ag2As2O6_2_155.vasp,Ag2As2O6,-2.900819036,0.467726227 -Nb6S18_11_13195.vasp,Nb6S18,-4.389574911666666,-0.017064658072916128 -Mn4Br10_13_11424.vasp,Mn4Br10,-0.9630293342857142,0.22002729392857034 -In1H2O2_164_8269.vasp,InH2O2,-3.73828503,0.2775693761666669 -Nb1Cl1F1_156_12486.vasp,NbClF,-3.66436751,0.3894063286904725 -Cr2Cu2As4S12_13_4364.vasp,Cr2Cu2As4S12,-2.5720753875,0.4826518047291645 -Er4Te10O26_2_5579.vasp,Er4Te10O26,-4.4355686475,0.07519667975000033 -Mn1V1Se2I1Br1_6_10926.vasp,MnVSe2IBr,-2.0928891383333332,-0.016952476875000733 -Ta2Cl8_1_17699.vasp,Ta2Cl8,-2.877392788,0.07810069200000047 -Ca2Cl2_129_2979.vasp,Ca2Cl2,-1.049228095,0.7809840637500001 -Ag2Sb2Se6_2_404.vasp,Ag2Sb2Se6,-1.321855393,0.01945810933333114 -Zn1F2_1_20925.vasp,ZnF2,-1.3767733766666668,0.21993880083333317 -Ga2As2_129_6302.vasp,Ga2As2,-2.3928763625,-0.6933188375000001 -Zr1Zn2Se1Cl4_1_21498.vasp,ZrZn2SeCl4,-1.41850839625,0.2191079834375001 -Co4S8_2_4087.vasp,Co4S8,-2.6781926975,0.3125716266666667 -Ni3Te4_164_13734.vasp,Ni3Te4,-0.6099854514285715,0.04248046714285714 -Pd2Pt1S4Br4_3_14453.vasp,Pd2PtS4Br4,-1.3205565209090908,0.22541647215908645 -Al3Ru2_123_1051.vasp,Al3Ru2,-3.451116928,0.36533470600000006 -Ca2As1_164_2921.vasp,Ca2As,-1.3712026466666665,0.5724818122222206 -Tl2Te2F2_59_19547.vasp,Tl2Te2F2,-1.11816775,0.7077422438888872 -Nb5C2S2I2Cl1O2F1_1_13187.vasp,Nb5C2S2I2ClO2F,-5.078138422666667,0.22932144104958815 -Os2Br2_164_13833.vasp,Os2Br2,-2.1402358625,0.8239950925000001 -In8Te6_31_8722.vasp,In8Te6,-1.1583574157142855,0.3903064757142838 -Ca1V4O10_25_2898.vasp,CaV4O10,-5.377407786,0.20685419666666194 -Be2Au2_191_2239.vasp,Be2Au2,-0.2475095125,0.8342181825000001 -Ag1C2S2O6F6_2_41.vasp,AgC2S2O6F6,-3.5469490929411767,0.2077688565257237 -Cu1C1O3_6_4866.vasp,CuCO3,-4.331075532,0.3744971992499978 -B4Sb4_127_1767.vasp,B4Sb4,-2.910947,1.3113291854166664 -Mn1Mo1Cl2O2_1_10791.vasp,MnMoCl2O2,-3.223385505,0.33046833249999974 -Nb2Cl6_162_12685.vasp,Nb2Cl6,-2.833169375,0.197403528593747 -Li1Ti1S2O1_156_9800.vasp,LiTiS2O,-4.266762318,0.6705563423333281 -Tb2H2O4_59_18198.vasp,Tb2H2O4,-5.6228941075,0.0945793612500001 -V8S18Br8_129_20400.vasp,V8S18Br8,-2.8490538258823532,0.059764246764705486 -Sn2Br2_129_16746.vasp,Sn2Br2,-0.7904569075,-0.5670690899999998 -Pb4Se4_57_14322.vasp,Pb4Se4,-1.66384364625,0.2861204971875 -Cd2Pt4Se6_164_3536.vasp,Cd2Pt4Se6,-1.3424492325,-0.02007105916666796 -Co3Ge1Te2_187_4063.vasp,Co3GeTe2,-1.9224297083333333,-0.04146407791666862 -Se6N4_7_16302.vasp,Se6N4,-3.143896142,0.5723352927499965 -Sb4S8_11_15822.vasp,Sb4S8,-2.4034861066666666,0.36948895989583086 -Ta4Te6_12_18132.vasp,Ta4Te6,-4.0944634639999995,0.08366540600000061 -Re2Te6_6_15093.vasp,Re2Te6,-2.5600224475,0.4731701341666666 -Al2N2_129_894.vasp,Al2N2,-5.564341225,0.7695236750000003 -Li2Fe1P2O8_2_9900.vasp,Li2FeP2O8,-4.5518973546153845,0.4714740709134527 -Sb4Mo2_2_15779.vasp,Sb4Mo2,-2.4793320016666667,0.28326115119047257 -Ca3Fe2S5Br2_123_3176.vasp,Ca3Fe2S5Br2,-2.332631021666667,-0.05388475041666907 -Nb6Tl4Cl18_12_13204.vasp,Nb6Tl4Cl18,-2.6476097103571425,-0.0208712901785727 -Pt2S2I2_59_14656.vasp,Pt2S2I2,-1.4802502583333332,0.1360468589583319 -H2Ru1_187_7026.vasp,H2Ru,-3.07863294,1.5378555383333294 -As8S8O4_1_1404.vasp,As8S8O4,-3.3760794384999997,0.4653297044999969 -As6Pb2_164_1385.vasp,As6Pb2,-2.30581113875,0.35892374999999976 -Pd1Pt1S1Br2_1_14377.vasp,PdPtSBr2,-1.1140866219999999,0.27484312000000033 -K4Se4O8_13_9512.vasp,K4Se4O8,-3.051033050625,0.11333269817708327 -Fe2Sb2Se4Br2_26_5958.vasp,Fe2Sb2Se4Br2,-1.7845330799999999,0.15351887319999802 -Cr8Te24_14_4633.vasp,Cr8Te24,-1.7380992665625,0.11213177677083369 -Cr2B1Te2_164_4326.vasp,Cr2BTe2,-2.96820963,0.1041116008333336 -Ge1Br2_187_6654.vasp,GeBr2,-1.4873023200000002,0.1574697599999999 -Al1In1Hg1Se4_156_678.vasp,AlInHgSe4,-1.6520853071428572,0.18743077428571442 -Ag2O5_21_345.vasp,Ag2O5,-1.2596839128571429,0.9603020298214263 -Fe1H4I2N6_47_5708.vasp,FeH4I2N6,-3.9570694384615384,-0.06582214596154468 -K2Ag2Ge1S4_21_8965.vasp,K2Ag2GeS4,-1.6320939155555554,0.15926345309258705 -Hf1Sc1I1Cl1O1_8_7295.vasp,HfScIClO,-3.909315868,0.45101596357574425 -Ag1Bi1P2S6_143_23.vasp,AgBiP2S6,-2.6819107339999997,0.07757332800000016 -Ta4Fe2S10_59_18037.vasp,Ta4Fe2S10,-4.48716073375,0.07382997750000042 -Mn1Se2_115_10878.vasp,MnSe2,-2.0172715,0.2777521133333334 -Zr1S1O1_156_21412.vasp,ZrSO,-5.74690355,0.24402630541666692 -Mn2Se2O8_31_11279.vasp,Mn2Se2O8,-3.8756315708333333,0.1335186975 -Te2Pb2_129_18456.vasp,Te2Pb2,-1.092226605,-1.15299378 -Na2Br2_129_11995.vasp,Na2Br2,-1.4955036275,-0.45794498249999993 -H2Ir1_187_6996.vasp,H2Ir,-3.07385313,1.8803929933333294 -Li2Cu4P2_164_9897.vasp,Li2Cu4P2,-1.40899252375,0.6585386279166645 -Co2W2S8I2_129_4059.vasp,Co2W2S8I2,-2.549959101428571,0.5941577491964254 -Nb2F10_1_12708.vasp,Nb2F10,-3.9770775675,0.09777029916666669 -Nb1Se1O1_156_12574.vasp,NbSeO,-5.29727476,0.3234148468750009 -Na2As2Pd2_12_11964.vasp,Na2As2Pd2,-1.681818775,0.10936792999999834 -Ag2Br2_164_203.vasp,Ag2Br2,0.1600829225,0.0640567975 -Zr2Hg2_129_21582.vasp,Zr2Hg2,-0.6636778725,-0.01794707249999994 -Ir5S10_1_8870.vasp,Ir5S10,-3.2663620106666666,-0.17700707733333365 -Mg1Cu1S1Br1_25_10355.vasp,MgCuSBr,-1.35721103,0.10618738666666666 -Ca2Br2Cl2_129_2959.vasp,Ca2Br2Cl2,-1.953291855,0.12589054583333337 -B2I6_1_1674.vasp,B2I6,-1.1402476225,0.0910379912499999 -Zn1In1Te1I1_1_20965.vasp,ZnInTeI,-0.2186567425,0.3416490725 -Cr2Cu2Sb4S12_13_4372.vasp,Cr2Cu2Sb4S12,-2.4609126225,0.23606366547916457 -Hg2P2O6_147_7979.vasp,Hg2P2O6,-3.482151967,0.4073172229999973 -In2Fe1Te4_164_8432.vasp,In2FeTe4,-1.3732584828571428,0.11599749214285582 -B2_65_1725.vasp,B2,-4.83164901,1.3293362883333337 -Ru1O1F2_47_15275.vasp,RuOF2,-3.197460325,0.02633615499999964 -Sn1F2_115_16628.vasp,SnF2,-2.3097149333333333,0.3765642025 -B2P6_164_1696.vasp,B2P6,-4.30919150375,-0.36079797375 -Li2Mg1S10F4_2_9971.vasp,Li2MgS10F4,-2.3662371270588234,0.468262382867644 -Zr2I4_11_21595.vasp,Zr2I4,-1.9556364783333333,0.07272320333333337 -Tl1Cl2_115_19242.vasp,TlCl2,-0.58773378,0.05147441500000005 -Zr1N1Cl1_156_21333.vasp,ZrNCl,-5.360999226666666,0.34125920666666687 -Fe2S6_11_5944.vasp,Fe2S6,-2.3761379275,-0.26957229140624994 -Ta4B3F2_164_18002.vasp,Ta4B3F2,-6.472832208888889,0.23248695755554327 -Tl2S2_164_19503.vasp,Tl2S2,-1.33108725,0.2647364310937501 -Tl1P2Au1O6_149_19313.vasp,TlP2AuO6,-3.8655553580000004,0.7459769116249999 -U2Se2O10_11_19724.vasp,U2Se2O10,-5.858817069285714,0.11462173500000006 -Na1Mo2Cl6O2_47_11900.vasp,NaMo2Cl6O2,-2.6592594899999997,0.04329766090909093 -Sc2S2Br1Cl1_6_16130.vasp,Sc2S2BrCl,-3.671282311666667,0.0344747966666632 -Bi1Br1O1_156_2318.vasp,BiBrO,-2.213579466666667,0.5408712483333336 -Te20N8_14_18341.vasp,Te20N8,-2.2507856007142855,0.45299011761904384 -Hg4Mo2S8_13_8079.vasp,Hg4Mo2S8,-1.3470534357142856,0.38483360642856956 -Zn2Cu2Si4O12_13_21071.vasp,Zn2Cu2Si4O12,-4.482681449999999,0.3145598752083303 -Sb2Se3_164_15702.vasp,Sb2Se3,-2.294234094,0.06638573599999997 -Sn1As1I5Br1_1_16599.vasp,SnAsI5Br,-0.55108925375,0.09463852140624865 -Cu4Br4O4F4_4_5399.vasp,Cu4Br4O4F4,-0.882519655,0.49390388468750007 -Cu2Te4F2_4_5352.vasp,Cu2Te4F2,-1.00433359375,0.280991114375 -W3O9_157_20570.vasp,W3O9,-5.632011828333333,0.2320239747916668 -Ag2Te3P4Cl2_6_472.vasp,Ag2Te3P4Cl2,-1.6921803909090907,0.24671472962120936 -Au2O2_187_1500.vasp,Au2O2,-0.6719198925,0.5355280800000001 -Mn2P4O13_5_11204.vasp,Mn2P4O13,-5.266189014736842,0.14463251249999498 -Mg2Ag4O8_51_10417.vasp,Mg2Ag4O8,-2.0552336335714285,0.32185069732142285 -Pt4I8_14_14704.vasp,Pt4I8,-0.38251635749999996,0.13283922750000005 -Mn2O2F2_59_11173.vasp,Mn2O2F2,-3.60215168,0.0658863283333333 -Ga8S6_31_6590.vasp,Ga8S6,-2.515532332142857,0.08864737499999897 -Ir2Br2_12_8767.vasp,Ir2Br2,-1.202751095,1.3902123683333312 -Mg2Te6P2_162_10527.vasp,Mg2Te6P2,-1.84480139,0.24053206666666538 -Ti3N2Cl2_187_19094.vasp,Ti3N2Cl2,-6.24461974,0.02055731428570784 -Na2Mg1Se2S8F4_2_12197.vasp,Na2MgSe2S8F4,-2.108110265882353,0.6403510325980338 -Mn2S2O8_31_11219.vasp,Mn2S2O8,-4.143631970833334,0.26045099333333255 -S2_51_15389.vasp,S2,-2.08420951,0.5336752893750001 -Ni2Cl4O12_14_13496.vasp,Ni2Cl4O12,-2.2316138433333332,0.10966046305555377 -Mn1In2Te4_164_10788.vasp,MnIn2Te4,-1.4300149714285715,0.12247406285714135 -Sc1Ta1Nb1S4Cl3_1_16012.vasp,ScTaNbS4Cl3,-3.9756939869999997,0.2675051755000004 -Ta4Ni2S10_59_18064.vasp,Ta4Ni2S10,-4.377024758125,0.06909210750000039 -Ir1Cl2_164_8732.vasp,IrCl2,-1.2554869266666666,0.8204683322222204 -As1S2_164_1172.vasp,AsS2,-2.751072693333333,0.6181538803124971 -Tm4H12O12_14_19691.vasp,Tm4H12O12,-5.03312165,0.09260773511904308 -Co3P2H16O16_10_4066.vasp,Co3P2H16O16,-4.400660391621622,0.023606148558554363 -Ag2P4S12_10_358.vasp,Ag2P4S12,-2.455384902777778,0.27988412348379366 -Li4B1S4_38_10161.vasp,Li4BS4,-3.307744587777778,0.2641079582986049 -Cu1Ni1Os1S3Br1Cl1_1_4920.vasp,CuNiOsS3BrCl,-1.60630217,0.4774526590039063 -Tc3I8_1_18242.vasp,Tc3I8,-1.82266018,0.2045565953030266 -Pb1Cl2_187_14180.vasp,PbCl2,-1.4094302566666668,-0.12347787500000007 -Zr2Si2O8_13_21683.vasp,Zr2Si2O8,-6.63245726,0.250848812500001 -Mn1Ag1Se2_156_10620.vasp,MnAgSe2,-1.2493897075,0.29103478625000023 -V6O4F10_26_20392.vasp,V6O4F10,-4.113379676999999,-0.17746063533333611 -Sc4B3F2_164_16223.vasp,Sc4B3F2,-4.226000476666666,0.012798989351849754 -Dy2F6_59_5526.vasp,Dy2F6,-4.49000889125,0.1904921375000006 -Tl1As2Au1O6_149_19215.vasp,TlAs2AuO6,-3.050395668,0.7789652060000005 -Cu4Re1S4Cl5_1_5439.vasp,Cu4ReS4Cl5,-1.530199382857143,0.22550724374999742 -Hf4S2N3F2_164_7804.vasp,Hf4S2N3F2,-5.967965541818182,0.7753727607954336 -Ir3Pd1Br1O10_1_8851.vasp,Ir3PdBrO10,-3.287783511333333,0.5265256084999999 -Te2As2Cl2_156_18351.vasp,Te2As2Cl2,-1.6844232416666667,0.22853774000000016 -Sr2P1_164_17291.vasp,Sr2P,-1.5952212866666666,0.42716320249999923 -Ca3Mg3_156_3183.vasp,Ca3Mg3,0.39474949833333334,0.5660175039583333 -Bi2Te4Pb1_164_2574.vasp,Bi2Te4Pb,-1.4962407885714286,-0.3940643142857147 -Na1Al1Te6P2_5_11820.vasp,NaAlTe6P2,-1.9590845089999998,0.0847437654999989 -Ag1Ge1F6_2_57.vasp,AgGeF6,-2.02007250625,0.06100297374999997 -Li8Ge4N8_14_10284.vasp,Li8Ge4N8,-4.3822456585,0.1593169810000008 -Mo12Br24_127_11480.vasp,Mo12Br24,-1.7897312166666666,0.07325072750000006 -Nb1O1F2_6_12550.vasp,NbOF2,-5.069072925,0.16245746249999504 -Cd1Sb1_8_3421.vasp,CdSb,0.80157733,0.6982465425 -Te4Ir2_14_18591.vasp,Te4Ir2,-1.6520339083333333,0.7914684516666668 -Te2Pb2_6_18460.vasp,Te2Pb2,-0.9212887475,-0.9820559225 -Na2Ge6P6_26_12089.vasp,Na2Ge6P6,-3.2568239585714283,0.1374444992857149 -Ta2Cl2_129_17691.vasp,Ta2Cl2,-3.71384981,1.46628816125 -Li2H4N2_7_9942.vasp,Li2H4N2,-4.26113015,0.044158304375000235 -Cu1Si1Te3Br1_1_4979.vasp,CuSiTe3Br,-1.2741926683333333,0.26656955363425616 -V1Ge1S2Cl4_1_19840.vasp,VGeS2Cl4,-2.2618978975,0.18078570593749999 -Ni4Sb4O4_13_13760.vasp,Ni4Sb4O4,-2.0883888466666667,0.2717547919444421 -Hg2Br2_164_7945.vasp,Hg2Br2,1.11458793,0.3238543749999999 -Sc1Sn1Se1S1I1Cl1_1_16007.vasp,ScSnSeSICl,-2.4584800833333333,0.16836007027777788 -In2Cl6_26_8406.vasp,In2Cl6,-1.31195541625,0.12901002375000004 -Rb2S6F2_11_14935.vasp,Rb2S6F2,-2.082703993,0.0557086946250005 -Pd2O2_187_14443.vasp,Pd2O2,-1.7996706875,0.84027837 -Hf2Zr2Se8_6_7672.vasp,Hf2Zr2Se8,-4.1209183325,0.28806721958333403 -Ti1S2_123_18839.vasp,TiS2,-4.629885986666666,0.4994293599999997 -Mo4C3O2_164_11736.vasp,Mo4C3O2,-5.33769561,0.3116532338888838 -As1Pt1_187_1166.vasp,AsPt,-1.783255355,1.24527654515625 -Mo3Se4_12_11729.vasp,Mo3Se4,-2.739737334285714,0.6376506728571383 -Ni1S1_156_13411.vasp,NiS,-0.84845554,0.5800054833333317 -Cu2C4O8F4_14_5072.vasp,Cu2C4O8F4,-4.391190516666667,0.17056163888888515 -V1Co1S2Br2_6_19803.vasp,VCoS2Br2,-2.332430525,0.16739103164813984 -Au4O4_26_1578.vasp,Au4O4,-1.19965839125,0.007789581249999955 -Nb2Ni2S10_51_12779.vasp,Nb2Ni2S10,-3.218586665714286,-0.22649818869047972 -Li2Mn2F8_51_9995.vasp,Li2Mn2F8,-2.9329226575000003,-0.3163059516666693 -K2Co2As2_12_9082.vasp,K2Co2As2,-1.5094645433333334,0.11686456033333074 -Sn4As4S4_17_16934.vasp,Sn4As4S4,-2.4881252750000002,0.22482305916666379 -Nb2As1Se4S1I6_1_12623.vasp,Nb2AsSe4SI6,-1.9589295907142856,0.2143554124404683 -Mo2Ir1Cl2O4_8_11630.vasp,Mo2IrCl2O4,-3.76224517,0.48152951736110694 -Ta2Ag1F12_2_17643.vasp,Ta2AgF12,-3.630940692666667,0.023071028666666216 -Mn1Mo1N2Cl2_6_10795.vasp,MnMoN2Cl2,-3.791044696666667,0.19458383833333315 -K2H6Pt1O6_147_9155.vasp,K2H6PtO6,-3.6959596180000003,0.051479014666666156 -Hf2C1O2_164_7457.vasp,Hf2CO2,-7.661565994,0.21326966566666794 -Sb2F6_147_15577.vasp,Sb2F6,-2.72765485875,0.3884785562500004 -Nb1Te2_10_12605.vasp,NbTe2,-2.79204124,0.5968791211111109 -Ta1Nb1Te2I1Cl1_6_17578.vasp,TaNbTe2ICl,-3.09229545,0.22563422728173377 -Cu1C2S2O6F6_2_4867.vasp,CuC2S2O6F6,-3.620505094117647,0.18202551426470315 -Nb2B1S2_164_12635.vasp,Nb2BS2,-5.673924444,0.1565166552000008 -Al2Cd1Te4_164_787.vasp,Al2CdTe4,-1.4375386842857143,0.1478466300000001 -Ti2Br2O2_59_18900.vasp,Ti2Br2O2,-5.249165121666667,0.04643512944443984 -Mo2Br4O4_26_11574.vasp,Mo2Br4O4,-3.182094555,-0.0019787440000000878 -Li2Co2P2O8_147_9865.vasp,Li2Co2P2O8,-4.655608787857142,0.14028104595237711 -Re2O4_59_15067.vasp,Re2O4,-5.63578123,0.611362655833334 -Ni2N2Cl2_59_13539.vasp,Ni2N2Cl2,-1.9931917833333335,0.23613942083333073 -Bi6Rh2O4_11_2677.vasp,Bi6Rh2O4,-2.6461974825,0.36121291805555267 -Pb2Br6_1_14224.vasp,Pb2Br6,-0.609671145,0.2841555900000002 -Mn2Al2Se5_156_10957.vasp,Mn2Al2Se5,-2.640158873333333,0.007171311398465108 -Ti2Br1N2Cl1_25_18894.vasp,Ti2BrN2Cl,-5.8030654366666665,-0.34371682395834435 -In2Se3_156_8590.vasp,In2Se3,-1.5963770480000001,0.3879443779999998 -Rb2Br2_129_14784.vasp,Rb2Br2,-0.9206460875,0.14424611750000005 -V1S2_164_19918.vasp,VS2,-3.7597095,-0.004750666666666792 -Sn2Se2_59_16885.vasp,Sn2Se2,-1.882792235,-0.3065138599999999 -Mn2Se6_4_11289.vasp,Mn2Se6,-2.141181335,0.15708351333333337 -V4C3_164_20316.vasp,V4C3,-5.640551690000001,0.3747307161309461 -Pb2Se2_31_14294.vasp,Pb2Se2,-1.8513470325,0.09861711093749981 -Mg2In2Se5_164_10473.vasp,Mg2In2Se5,-2.130041067777778,0.039561631666666486 -K2Pd1C4S4N4_2_9296.vasp,K2PdC4S4N4,-4.705321964,0.007902803888878318 -Ti4Mo2N3Cl6_157_19142.vasp,Ti4Mo2N3Cl6,-4.923743182666667,-0.015748794444448322 -Pt2Br2O2_59_14598.vasp,Pt2Br2O2,-1.7873284533333333,0.293643170833328 -Nb4Cl16_12_13050.vasp,Nb4Cl16,-2.646648923,0.06724451750000027 -K4Sm2P4S14_5_9516.vasp,K4Sm2P4S14,-3.2165724408333336,0.05543825208333297 -F1_123_5611.vasp,F,0.69047118,0.46138290374999996 -Co1Ni1Te2_115_3797.vasp,CoNiTe2,-0.8780511575,0.26604722638888645 -Ni2P2Se6_162_13568.vasp,Ni2P2Se6,-1.9055779449999999,0.2122495608749988 -Sm2I2O2_164_16576.vasp,Sm2I2O2,-4.40766437,0.13396763499999942 -Te8P2Pt3_164_18706.vasp,Te8P2Pt3,-1.710063373846154,0.612577155512815 -Ca2Cu1Se2Br2_38_3002.vasp,Ca2CuSe2Br2,-1.5794429142857143,0.1937819323809492 -Ta4B3H2S2_164_18004.vasp,Ta4B3H2S2,-5.940391931818183,0.7208090663636252 -Cu2S2N2Cl2_31_5248.vasp,Cu2S2N2Cl2,-2.10983839375,0.16654132842261782 -Cr2Sb1W1S6I1Br1_1_4477.vasp,Cr2SbWS6IBr,-2.9854444566666665,0.11869142458333067 -Pd2S4F2_2_14475.vasp,Pd2S4F2,-2.00451144,0.2010385660156251 -Sr4Te8P4Cl4_14_17484.vasp,Sr4Te8P4Cl4,-2.2200946784999998,0.13404630750000063 -Co2H12C8O12_14_3903.vasp,Co2H12C8O12,-5.016716165294118,0.19475698249999063 -V2Ag2P4Se12_13_19974.vasp,V2Ag2P4Se12,-2.44407123,0.07016067419583183 -Sr4Mn3Cl2O8_123_17450.vasp,Sr4Mn3Cl2O8,-4.137426781176471,0.024297001764705506 -Sn2Te2_31_16896.vasp,Sn2Te2,-1.436240815,-1.4005128349999998 -Sc2F6_191_16072.vasp,Sc2F6,-4.25233289875,-0.2511621887499995 -K2Hg4Se2Cl6O6_31_9187.vasp,K2Hg4Se2Cl6O6,-1.421533653,0.08965746350000026 -Sb2Pt3O8_164_15663.vasp,Sb2Pt3O8,-3.2100579053846157,0.48527686980768836 -Rh2I6_162_15198.vasp,Rh2I6,-0.559927845,0.05674136749999992 -Ag2H8C6I2N2_2_292.vasp,Ag2H8C6I2N2,-4.4003011139999995,0.08295521250000171 -K6In11_150_9537.vasp,K6In11,-0.11944302470588235,0.2257716080672263 -Nb4Pt2S14_11_13130.vasp,Nb4Pt2S14,-3.9685282195,0.12548148343749732 -Ca2Ni1S3_38_3077.vasp,Ca2NiS3,-2.441763493333333,-0.0018354255555578791 -Na2Sn1H6O6_147_12301.vasp,Na2SnH6O6,-4.0733386393333335,0.048228507333333503 -Sb4Te2O12_18_15828.vasp,Sb4Te2O12,-3.8854590966666667,0.27767222013888526 -Sb2S2I2_11_15677.vasp,Sb2S2I2,-1.6713006866666669,-0.6676495500000001 -K2Fe4S6_51_9106.vasp,K2Fe4S6,-1.8249641108333332,0.1295193566666668 -Rh2Cl2_164_15184.vasp,Rh2Cl2,-1.079838365,0.9196653224999982 -Sc4Br6_12_16228.vasp,Sc4Br6,-2.3349390740000002,0.10037427199999982 -Ba3Sn1_25_2128.vasp,Ba3Sn,-0.180708475,0.6380251825 -Hg3Ge1Se2S2Br4_1_8058.vasp,Hg3GeSe2S2Br4,-0.4728799125,0.24298065574652494 -Nb2Pd4S4_51_12816.vasp,Nb2Pd4S4,-3.072392577,0.2672083143103398 -Ca2Au1S2F2_38_2935.vasp,Ca2AuS2F2,-2.2261659071428572,0.5518548357142811 -Mn2Co1B6N6_150_11058.vasp,Mn2CoB6N6,-5.2528552379999995,1.4419301806666656 -V1Cu1Te2_156_19820.vasp,VCuTe2,-1.238333645,0.4638124701190461 -Sc2Te1H1S1Br1_1_16171.vasp,Sc2TeHSBr,-3.191156795,-0.033719386111114025 -As4Au2S3F2_6_1317.vasp,As4Au2S3F2,-1.8963065018181817,0.3852616535984814 -Sc3N1Cl4_12_16210.vasp,Sc3NCl4,-3.49630189875,-0.013139736562504556 -Ta4W2O16_3_18139.vasp,Ta4W2O16,-6.658876458181819,0.0843266311363573 -In1Ir1Br4O2_12_8276.vasp,InIrBr4O2,-1.8151206525,0.41686364937499976 -Cd1B4C2Br2F4_10_3273.vasp,CdB4C2Br2F4,-3.5394618746153843,0.5373966887393083 -Bi6Ir2S4_11_2668.vasp,Bi6Ir2S4,-2.1576050991666667,-0.1475674627777792 -Sr4Bi2_59_17409.vasp,Sr4Bi2,-0.38441002166666666,0.5789259038888879 -Hf2I2N2_164_7515.vasp,Hf2I2N2,-5.598574326666667,0.06416428833333221 -Ge6As6_12_6955.vasp,Ge6As6,-3.1948265625,0.194331735 -Ag1Bi1Sb2Se6_143_26.vasp,AgBiSb2Se6,-1.672400601,0.1142693906666643 -Al1Ni1F5_47_689.vasp,AlNiF5,-2.36789564,0.4597264635714262 -Te2W1_187_18524.vasp,Te2W,-2.882311853333333,0.1625860983333336 -K1Cu8Se2_123_8893.vasp,KCu8Se2,0.47249171363636366,1.766445888181817 -Nb2Br2O2_59_12649.vasp,Nb2Br2O2,-4.807395173333333,0.017455587777774006 -Sn2Hg1S2I2_12_16780.vasp,Sn2HgS2I2,-0.9772220714285714,0.09890348436507668 -Al2Te2I2_59_1007.vasp,Al2Te2I2,-1.5557848083333334,0.12526837833333326 -Re2Br2_12_15032.vasp,Re2Br2,-3.59392268,0.4746637730555525 -N4O8_31_11799.vasp,N4O8,-4.572760051666667,0.13028328416666568 -Ag2F2_1_255.vasp,Ag2F2,-0.4374065675,0.30864058749999995 -Ga1Ag1Pt1S1I2_1_6119.vasp,GaAgPtSI2,-0.8739982633333333,0.27311159166666554 -C2S2_31_2754.vasp,C2S2,-4.2093701525,1.1577349521875 -Sr3Mg3_156_17382.vasp,Sr3Mg3,0.506474865,0.5479140493750001 -Ti3Te2H2C2_38_19109.vasp,Ti3Te2H2C2,-5.030861915555556,0.34509228648147605 -Co1H4C2Br2N4_47_3745.vasp,CoH4C2Br2N4,-4.446595572307692,0.040733321602557424 -Bi16Br4_10_2305.vasp,Bi16Br4,-1.1084456235,-0.5017201161666676 -Ru2Br2N2_59_15298.vasp,Ru2Br2N2,-3.380200723333333,0.025432176944441554 -Cu2Cl6_162_5087.vasp,Cu2Cl6,-0.1574977125,0.260187410625 -Hg2Sb2S6_147_8011.vasp,Hg2Sb2S6,-1.4293477620000001,0.32536399843749764 -Fe2B1H2S2_164_5798.vasp,Fe2BH2S2,-2.822839732857143,0.27863268264284885 -Y2C2Br2_12_20713.vasp,Y2C2Br2,-5.200936615,0.02404364333332687 -P2W2O10_85_14057.vasp,P2W2O10,-5.703033070714286,0.27280817624999987 -Sn1Pb1Se1S2I2_1_16671.vasp,SnPbSeS2I2,-1.4536617328571428,0.30475413166666304 -Rb2Cd4S8Cl6_31_14813.vasp,Rb2Cd4S8Cl6,-1.0786339875,0.08747886106249947 -K2Cl10_127_9074.vasp,K2Cl10,-0.411203945,0.19699255249999947 -K4V6O16_100_9529.vasp,K4V6O16,-4.708561745384615,0.27499049346153903 -Li2H6C8N2O2_51_9945.vasp,Li2H6C8N2O2,-4.938042326,-0.5575813532083544 -Na4Cd2F8_11_12378.vasp,Na4Cd2F8,-1.8779169264285716,-0.12997218928571597 -Ta4Ni8S8_51_18074.vasp,Ta4Ni8S8,-2.884786304,0.007669814159999677 -Hg8P4O12F4_57_8109.vasp,Hg8P4O12F4,-2.6485168821428573,0.17220208071428544 -Ga2S2Br2_31_6437.vasp,Ga2S2Br2,-2.1377769416666665,0.01969868583333323 -C60_164_2773.vasp,C60,-7.706103089,0.410222321 -Cr1Ag1Sb2Te6_5_4106.vasp,CrAgSb2Te6,-1.3171825,0.24421273562499846 -K2Hg4I6O8_31_9174.vasp,K2Hg4I6O8,-0.8420865300000001,0.3863165976249998 -Ta1Ga1Te3Br1_6_17548.vasp,TaGaTe3Br,-2.4345024116666667,0.204311392777778 -As2Pt3S8_164_1281.vasp,As2Pt3S8,-2.585125107692308,0.36486455449999666 -Li1Ni1As2O6_149_9757.vasp,LiNiAs2O6,-3.558703613,0.411403502624996 -Hf2Se2Br2_59_7602.vasp,Hf2Se2Br2,-3.82099957,-0.0458129241666696 -B6Te6_2_1789.vasp,B6Te6,-3.495963043333333,0.3704224841666669 -Tl2Ga2Cl8_3_19420.vasp,Tl2Ga2Cl8,-1.3536515949999999,0.2011312577083335 -Cd1S1Cl1_8_3409.vasp,CdSCl,-0.40172330333333334,0.4839259103124981 -Te24Mo8_14_18344.vasp,Te24Mo8,-1.89509921625,0.08101791041666667 -Re1Te2_187_15028.vasp,ReTe2,-3.17284898,0.34747921000000037 -Na1Li2As1_47_11894.vasp,NaLi2As,-1.5833614075,0.6711608138888869 -Re1F2_164_15001.vasp,ReF2,-3.23464498,0.856238191111107 -Hf2Br2_12_7450.vasp,Hf2Br2,-3.8508619975,0.05115676999999996 -Cr1Ag1P2S6_149_4099.vasp,CrAgP2S6,-2.87575925,0.08776263849999966 -Hf1Mn1N2Cl2_8_7220.vasp,HfMnN2Cl2,-4.656820346666667,0.292595100208328 -Ir2Se2I2_11_8839.vasp,Ir2Se2I2,-1.93767993,-0.09719444375000319 -Ta9S18_12_18165.vasp,Ta9S18,-5.301784519259259,0.11894806907407407 -Ca3Mn2Br2O5_123_3184.vasp,Ca3Mn2Br2O5,-3.8606821,-0.17882961562500133 -Cu4S4Cl4_14_5453.vasp,Cu4S4Cl4,-1.0683327475,0.12225667456349118 -V2Ag2Sb4S12_13_19976.vasp,V2Ag2Sb4S12,-2.5228661785,0.2255175483333307 -Mn1Bi2S4_164_10652.vasp,MnBi2S4,-2.5312712985714287,0.09030682428571435 -Al2Ni1Te4_164_899.vasp,Al2NiTe4,-1.627816317142857,0.19427696505101696 -K4H12C4N4_14_9449.vasp,K4H12C4N4,-4.074324657083333,0.2612592520486037 -Al2Bi2Br12_2_767.vasp,Al2Bi2Br12,-1.27944037,0.046530535624999925 -Ga2Se5_12_6486.vasp,Ga2Se5,-2.2045449614285713,0.2098745280952361 -Ca2H8S4F4_53_3046.vasp,Ca2H8S4F4,-3.296162198333333,0.13966720222221918 -Te2H4O8_14_18383.vasp,Te2H4O8,-3.9097697978571433,0.05056259345237324 -Sb4O6_4_15786.vasp,Sb4O6,-4.165711071,0.09177939650000067 -Na1Mo2S2I6_47_11904.vasp,NaMo2S2I6,-1.2228386472727273,0.1788290823106028 -Hf2I1Br4Cl1_1_7510.vasp,Hf2IBr4Cl,-2.6582303625,0.15031569385415997 -Te8O18_147_18702.vasp,Te8O18,-3.6109805807692306,0.07129314711538481 -Sn4N8_26_16944.vasp,Sn4N8,-3.8840164749999997,-1.063990555000002 -W4O12_7_20590.vasp,W4O12,-5.954431336875,-0.09039553375000065 -Na2S4Cl2F8_1_12289.vasp,Na2S4Cl2F8,-1.85865723375,0.11112867705078139 -Ni1H4C4I2N2_47_13340.vasp,NiH4C4I2N2,-4.471888400769231,0.1931109769230619 -As12Se12_7_1123.vasp,As12Se12,-2.406294637083333,0.3005903020833307 -B3Mo4H2O2_164_1734.vasp,B3Mo4H2O2,-4.581564952727273,0.8167024540908938 -Ni1B6C2I2F4_6_13278.vasp,NiB6C2I2F4,-3.6703083433333332,0.6245266350833215 -Tl4Ge4S10_5_19604.vasp,Tl4Ge4S10,-2.401278655,0.2053358658333333 -Bi4B4_1_2601.vasp,Bi4B4,-3.1456554775,0.16827116916666657 -Na2Co2Sb2_129_12061.vasp,Na2Co2Sb2,-1.4120586316666666,0.30648474999999853 -Ag2N2_129_333.vasp,Ag2N2,-1.302666155,1.1025227237500002 -Te6As2Pt2_12_18645.vasp,Te6As2Pt2,-1.7860422839999999,0.4225633764166655 -Tl1Cd1Ga1Se4_156_19234.vasp,TlCdGaSe4,-1.3373729442857143,0.024310989404759564 -Si2C2Cl2_59_16394.vasp,Si2C2Cl2,-3.9572540450000004,0.880492899583329 -Mn1Bi1Br4_1_10646.vasp,MnBiBr4,-0.89030088,0.21756266680555497 -Ca2C1_164_2966.vasp,Ca2C,-2.00450885,1.1027185591666604 -Sn2P2H2S6_7_16812.vasp,Sn2P2H2S6,-2.9792045591666665,0.11418156197916335 -In4Te4Br4_14_8698.vasp,In4Te4Br4,-1.1582025624999999,0.0707751925000002 -Ge4Sb4Se4_17_6945.vasp,Ge4Sb4Se4,-2.508380535,0.18633738583333093 -Bi2Se3_164_2550.vasp,Bi2Se3,-2.0334209999999997,0.07489071000000003 -Bi1Te1Br1_156_2397.vasp,BiTeBr,-1.14000014,0.24346094000000007 -Nb2Ru2Se8_11_12830.vasp,Nb2Ru2Se8,-3.537900704166667,0.18733402958333345 -Zr1Mn1S1Br1Cl2_6_21326.vasp,ZrMnSBrCl2,-2.7191884133333333,0.09391458417384185 -Ti6H4O14_6_19180.vasp,Ti6H4O14,-6.361695527916667,0.16274816881944432 -Co2Te2_187_4039.vasp,Co2Te2,-1.12732113,0.5244811233333335 -Ni2Pd1Se6_162_13576.vasp,Ni2PdSe6,-1.3876920866666667,0.21759050499999866 -Sr3Ag2Br2O4_123_17343.vasp,Sr3Ag2Br2O4,-2.6590855809090908,0.021280769545450107 -Sn2P2N2O6F6_7_16815.vasp,Sn2P2N2O6F6,-3.7115254594444442,0.5551945169444422 -Tl2Zn2Se5_156_19570.vasp,Tl2Zn2Se5,-0.8967208444444444,0.20907844555555455 -Zr2Nb1I2N1_6_21611.vasp,Zr2NbI2N,-4.03522114,0.4712231956666544 -Fe2Cl8_14_5841.vasp,Fe2Cl8,-0.807699489,0.06323372599999988 -Y1Se1Br1_156_20672.vasp,YSeBr,-3.7832716299999998,0.15115541527777454 -Cr1H2S2_164_4186.vasp,CrH2S2,-3.208491606,0.7999802120000004 -Si2Au2S6_51_16387.vasp,Si2Au2S6,-2.5273849139999998,0.2060640440000001 -Tl1Te1F5_6_19350.vasp,TlTeF5,-2.1151555014285717,0.150184127142857 -Nb2S4F4_12_12853.vasp,Nb2S4F4,-4.114085325,0.08088045157499739 -Mn8Se2S4Br6_1_11477.vasp,Mn8Se2S4Br6,-2.083007782,0.04788475187499314 -K2Te2C2N2_31_9365.vasp,K2Te2C2N2,-3.886816005,0.21317979958332745 -Cu1Bi1P2Se6_143_4850.vasp,CuBiP2Se6,-2.175627312,0.07398941850000007 -Ag2Au2Cl8_13_173.vasp,Ag2Au2Cl8,-0.14620935916666666,0.07963605166666665 -Ni2S1I1Br1O1_25_13579.vasp,Ni2SIBrO,-0.9939105683333334,0.09263098738095003 -Hg1H4C4N2F2_10_7876.vasp,HgH4C4N2F2,-4.61984251,0.3759121940212117 -Ge6Bi6_2_6957.vasp,Ge6Bi6,-2.0714944958333334,-0.7515726858333336 -Cr2S6_59_4476.vasp,Cr2S6,-3.09937763625,0.15280346859375005 -Cu4Te4S12_14_5488.vasp,Cu4Te4S12,-1.566834644,0.3396379117499974 -Nb6C1Br4N1O4_6_13188.vasp,Nb6CBr4NO4,-5.6191781775,0.06691858296354147 -Cu4S2_4_5447.vasp,Cu4S2,-0.6750183183333333,0.3198914683333324 -Ta2S2_187_17853.vasp,Ta2S2,-5.4223732075,0.3457473387499945 -Sb1Te6P2Au1_143_15521.vasp,SbTe6P2Au,-1.592064706,0.3246050447499944 -V3B2Se2F2_1_20246.vasp,V3B2Se2F2,-3.5495113666666667,0.574953863783065 -Ir2Se2F2_59_8837.vasp,Ir2Se2F2,-2.53713538,0.2550840811458306 -As2Cl6_11_1201.vasp,As2Cl6,-1.54197908625,0.050926398749999935 -Sb4Se2O12_18_15823.vasp,Sb4Se2O12,-3.888661676111111,0.2300727483333298 -Rb3Mo2Cl9_187_14959.vasp,Rb3Mo2Cl9,-1.7343874271428572,-0.01535431190476344 -Ga1Pd1Pt2Br4N3O1_1_6235.vasp,GaPdPt2Br4N3O,-2.4020908875,0.33094693598957803 -Al2I2_164_878.vasp,Al2I2,-1.1786392825,0.2838918499999986 -Sc2Te2_187_16177.vasp,Sc2Te2,-2.4303972925,0.7764441775000002 -Cr4C3S2_164_4598.vasp,Cr4C3S2,-4.726779686666666,0.23136614444443948 -Ag1W1Se1Br5_1_151.vasp,AgWSeBr5,-1.184907865,0.10016143464285399 -Bi4Cl12_14_2608.vasp,Bi4Cl12,-1.352573128125,0.06272033187500003 -Ga2O2F2_59_6414.vasp,Ga2O2F2,-3.848664063333333,-0.26880632930555853 -Pb2Br2_129_14221.vasp,Pb2Br2,-0.661656795,0.5658327425000003 -Ru2Cl2_164_15309.vasp,Ru2Cl2,-1.7607223975,0.8675926841666644 -Bi2Br2_129_2432.vasp,Bi2Br2,-0.6606211425,0.1558906333333325 -Ta2Te4F4_12_17915.vasp,Ta2Te4F4,-3.4352570780000002,0.24186195286666345 -Cu1Cl2_12_4872.vasp,CuCl2,-0.40280457666666664,0.08635052666666665 -Hf3Zr1O8_156_7752.vasp,Hf3ZrO8,-7.3558196591666665,0.28054805041666686 -Be3Br6_5_2275.vasp,Be3Br6,-1.9187331277777777,0.16950349888888905 -Tl2Fe1Te4_156_19414.vasp,Tl2FeTe4,-0.6300361057142857,0.6121629328571416 -Sc1Zn1I2_156_16022.vasp,ScZnI2,-0.5054476825,0.23077544333333272 -Be2Hg1_123_2256.vasp,Be2Hg,-0.13684327,0.5456634112643673 -Co3Se4_164_4069.vasp,Co3Se4,-2.195003844285714,0.0988894922857122 -Rb2Te2C2O6F6_4_14948.vasp,Rb2Te2C2O6F6,-3.197785948888889,0.6416487584444363 -Au4S4I4F4_14_1587.vasp,Au4S4I4F4,-0.632469393125,0.24640819470051986 -Co1S2F2_164_3817.vasp,CoS2F2,-2.17416351,0.26182514725000017 -Ga1Te1_156_6293.vasp,GaTe,-1.258505955,0.6746942608333335 -Co1H4C4Br2N2_47_3752.vasp,CoH4C4Br2N2,-4.802698683846153,0.1176659746153692 -Ni2Te2As1_187_13657.vasp,Ni2Te2As,-1.104143992,1.1066324496071394 -Cd1Mo1F5_1_3379.vasp,CdMoF5,-2.075239314285714,0.022908802499998604 -Mo4C3S2F2_164_11737.vasp,Mo4C3S2F2,-4.117473528181818,0.551041316666657 -Li4V4F16_14_10242.vasp,Li4V4F16,-3.6089146700000003,-0.5063725733333362 -Sr3Co2Cl2O4_123_17359.vasp,Sr3Co2Cl2O4,-3.542051603636364,-0.04986973348485457 -Mo3N2Cl2_187_11711.vasp,Mo3N2Cl2,-3.9111676385714285,0.3443609247619013 -Ag2Cl2_129_245.vasp,Ag2Cl2,-0.0006982875,0.12862064 -Mo2Se2I1Br1_6_11685.vasp,Mo2Se2IBr,-2.108672126666667,0.2134811361805553 -Fe1Cu1S2I1Cl1_8_5667.vasp,FeCuS2ICl,-1.19706496,-0.1102298612708338 -V2Cl2O2_59_20030.vasp,V2Cl2O2,-4.1158188566666665,0.02157899555555165 -Sc2I6_59_16100.vasp,Sc2I6,-1.46839865125,0.14911888000000006 -Sb2O2_164_15613.vasp,Sb2O2,-3.313923645,0.6145795899999975 -W2S1Br1Cl3_1_20525.vasp,W2SBrCl3,-2.3847721857142856,0.5807683255952297 -Sb2I6_150_15591.vasp,Sb2I6,-0.44647706125,0.14723477125000006 -Co2As2Se5_8_3848.vasp,Co2As2Se5,-2.2537668633333334,0.343986610555553 -Hf2H2C1_164_7503.vasp,Hf2H2C,-5.773320008000001,0.2688341999999997 -Ta2Pt1S6_12_17835.vasp,Ta2PtS6,-4.474109377777777,0.09151795555555609 -V2O2_123_20122.vasp,V2O2,-4.75593623,0.7768939133333289 -In4Cl4_57_8669.vasp,In4Cl4,-1.28910949625,0.10766270718750004 -Zn2S2_129_21143.vasp,Zn2S2,-0.8551346575,0.33652543700000004 -Nb2Sn2As2_129_12894.vasp,Nb2Sn2As2,-3.3300719933333336,-0.6250575633333361 -Ta2Te2C1_164_17900.vasp,Ta2Te2C,-5.6360820799999996,0.0386468880000006 -As2_164_1313.vasp,As2,-3.063136905,0.14804765500000006 -W2O4_11_20522.vasp,W2O4,-6.025588605,0.24211116363944907 -As4S14_18_1358.vasp,As4S14,-2.489775894444444,0.6290034211111084 -Co2O2F2_47_3943.vasp,Co2O2F2,-3.0955610266666667,-0.3896155293750031 -Pr4Cl10_11_14560.vasp,Pr4Cl10,-2.95852568,0.13978075047618455 -Rb1Te2Pb1_156_14757.vasp,RbTe2Pb,-0.787662965,-0.2543993587500001 -Mg1Cl2_187_10352.vasp,MgCl2,-1.8207869499999998,0.24624059499999995 -Mn1Sb1O4_10_10858.vasp,MnSbO4,-4.421985671666667,-0.4818219016666667 -Ga2Te2I14_7_6504.vasp,Ga2Te2I14,-0.19607560999999998,0.10847832555555528 -Sm1Sn5_47_16561.vasp,SmSn5,-1.4411771150000001,-1.4848506108333335 -Bi1Mo1As1_156_2345.vasp,BiMoAs,-2.405680046666667,0.1811694302380926 -Cu1Sb6S2O16_2_4974.vasp,CuSb6S2O16,-4.1404330931999995,0.13660309324999176 -Ce2Be4_12_3662.vasp,Ce2Be4,-2.7671223516666665,0.25681278307692024 -Ca2Au1S2Br2_123_2931.vasp,Ca2AuS2Br2,-1.6607323471428572,0.2971678385714247 -V2S1Br1Cl1_156_20149.vasp,V2SBrCl,-2.58684589,0.37714548049999963 -As2C6_191_1198.vasp,As2C6,-5.92892420875,0.9611159887499996 -Fe2I6_162_5866.vasp,Fe2I6,-0.16901781,0.08159723937500002 -Pd1Au2F5_1_14344.vasp,PdAu2F5,-0.5838584525,0.5886395471527766 -Au2S4Br2_12_1521.vasp,Au2S4Br2,-0.63216273,0.5364452002083324 -Fe1C4I2N2F4_47_5646.vasp,FeC4I2N2F4,-4.10390457,0.043908757067298104 -Hf3B2H2S2_187_7679.vasp,Hf3B2H2S2,-5.195667041111111,0.2725134155555504 -B6Au1S2N6F4_6_1773.vasp,B6AuS2N6F4,-4.940052391578948,0.5692357534758663 -Bi8Ir4_2_2685.vasp,Bi8Ir4,-1.9913920716666667,0.2746269591666666 -Zn1As4H8O16_2_20896.vasp,ZnAs4H8O16,-4.038835798275862,0.19031941631703797 -Cu1Ir1O6_5_4913.vasp,CuIrO6,-2.86480964875,0.7539521581250002 -Pd2F4_14_14422.vasp,Pd2F4,-1.3707402083333333,0.06650900999999987 -Te1W1Se1_156_18337.vasp,TeWSe,-3.3150249466666666,-0.09684578583333314 -W1S2_115_20449.vasp,WS2,-3.8257487099999996,0.6468499400000005 -Mn1As1S2_1_10633.vasp,MnAsS2,-2.62986507,0.6935645781249997 -Cu4S4I4_14_5458.vasp,Cu4S4I4,-0.6692351916666667,0.12533666182539602 -Fe1Br2O8_147_5637.vasp,FeBr2O8,-2.38147903,0.3847281459469638 -Cu1Ag1O2_10_4819.vasp,CuAgO2,-1.58487759,0.3350679353124999 -Ni1Sb1_187_13417.vasp,NiSb,-0.02156478,1.0802757349999998 -Ni1H4C2Br2N4_47_13331.vasp,NiH4C2Br2N4,-4.263042053846154,0.09020260929486557 -Nb1Ga1Cl4_10_12509.vasp,NbGaCl4,-2.377607701666667,0.2456230244871771 -Ag1Rh1Se1S1I1Br1_1_108.vasp,AgRhSeSIBr,-1.085193485,0.3186140409850769 -Ge2As2H6C2S6_7_6735.vasp,Ge2As2H6C2S6,-3.670264645,0.15402663277776737 -Ni3Sb2Te8_164_13718.vasp,Ni3Sb2Te8,-0.744483946923077,0.38829207274725025 -Ti2Br2_164_18902.vasp,Ti2Br2,-3.3510753575,0.8357244000000001 -Cu2S4Cl2_17_5257.vasp,Cu2S4Cl2,-1.48340387625,0.08133239125000014 -Mn1Ni1S2I1Cl1_8_10828.vasp,MnNiS2ICl,-1.4220686066666666,0.18204111885416424 -Li1Se1S1_6_9788.vasp,LiSeS,-2.3751115966666667,0.31383833600694205 -Al2Cr1Se4_164_815.vasp,Al2CrSe4,-2.801582277142857,0.20393216619047255 -Ge2Se2O8_31_6870.vasp,Ge2Se2O8,-3.748581195,0.5175748277083336 -Zn1Ni1Te1Se1_156_20980.vasp,ZnNiTeSe,-0.3538482125,0.27769192687499944 -As10S10_26_1117.vasp,As10S10,-2.752981627,0.2569183414374998 -Cd1I1O1F1_156_3365.vasp,CdIOF,-0.49236737,0.7580209082638888 -Re3Te1I4_1_15098.vasp,Re3TeI4,-2.42360595125,0.4979806857738056 -Os2Se2_6_13888.vasp,Os2Se2,-3.3527355825,0.7778423400000003 -Re6Pb3O24_157_15124.vasp,Re6Pb3O24,-5.335025035454545,0.10245265545454618 -Ag2C2S2N2_31_224.vasp,Ag2C2S2N2,-3.83679925875,0.19293503783853572 -Ni3Ge1S2_187_13699.vasp,Ni3GeS2,-1.2874090116666668,0.10080137833333058 -Rh2S2Cl2_59_15217.vasp,Rh2S2Cl2,-2.3064595466666664,0.06855388666666684 -As2P2S8_11_1241.vasp,As2P2S8,-2.9560214775,0.1836975066145801 -Al1Se1I1_1_734.vasp,AlSeI,-2.0206159033333333,0.08358262083333345 -Sc1I1Cl1_1_15943.vasp,ScICl,-1.9107847366666666,0.4135884288888865 -Al1Bi1_187_613.vasp,AlBi,1.87191529,3.31733972 -Cs2Ru2S2N2F10_11_4776.vasp,Cs2Ru2S2N2F10,-2.838566653888889,-0.034700460039689296 -Sc2C1_164_16056.vasp,Sc2C,-4.308542013333333,0.5971832866666675 -Nb4Pd6S10_59_13128.vasp,Nb4Pd6S10,-3.4233571905,0.170655818224132 -Na2O4F2_113_12242.vasp,Na2O4F2,-1.61877686875,1.158394669375 -Li1Cu1Mo1Br2O2_8_9686.vasp,LiCuMoBr2O2,-2.6125922085714284,0.4417148321428518 -Sr3Co2S5Br2_123_17362.vasp,Sr3Co2S5Br2,-2.5307400091666667,0.1337761903124971 -Mg3Br6_5_10545.vasp,Mg3Br6,-1.3946043088888889,0.1433662555555555 -Ni2Se1S1_99_13627.vasp,Ni2SeS,-0.93649369,0.18608190739583208 -Hf2Tl2Cu2S6_51_7655.vasp,Hf2Tl2Cu2S6,-3.187672195833333,0.14230221833333356 -Zr1Zn1P2S5Cl1_1_21494.vasp,ZrZnP2S5Cl,-2.99273077,0.2264023254312501 -Cu2O4F2_31_5203.vasp,Cu2O4F2,-2.05508061625,0.30845244187499987 -Ca2N4Cl4_28_3074.vasp,Ca2N4Cl4,-4.068389613,-0.5179506809999994 -Rh2I8_7_15200.vasp,Rh2I8,-0.246865791,0.17021538537500036 -Ni1Ir3Se2S6_1_13375.vasp,NiIr3Se2S6,-2.731906469166667,-0.0439513908333336 -Cu2As2S6_162_5011.vasp,Cu2As2S6,-2.037362664,0.4753238040833307 -Cr1In2Te4_164_4207.vasp,CrIn2Te4,-1.5104600985714285,0.12972788161904764 -Ta2Br6_162_17672.vasp,Ta2Br6,-2.4680384825,0.2997058985937504 -Cr2P2S8_12_4452.vasp,Cr2P2S8,-3.263072558333333,0.03923691416666664 -Os2Se2F2_59_13882.vasp,Os2Se2F2,-2.9123643733333338,0.46776990395832985 -Sr1Ta2S7_123_17092.vasp,SrTa2S7,-4.091707831,0.3191888840000008 -Na2Zr1O6F6_1_12345.vasp,Na2ZrO6F6,-2.6508619,1.039850375766662 -Sr4Bi4Se8F4_12_17412.vasp,Sr4Bi4Se8F4,-2.658777598,0.04356071450000054 -Zr2Cl4_11_21552.vasp,Zr2Cl4,-3.0801540616666667,0.09905467833333326 -Ga4Br4N4_2_6545.vasp,Ga4Br4N4,-3.1493655366666666,0.20110185694444138 -In2Te2_164_8628.vasp,In2Te2,-1.3144050175,0.0706040025000001 -Ni2Se2I2_59_13634.vasp,Ni2Se2I2,-0.49601136333333334,0.046726164999999986 -Sn2Br2N1_5_16742.vasp,Sn2Br2N,-1.9748335000000001,-0.6893731214999999 -As4P2H2O12_4_1342.vasp,As4P2H2O12,-4.8508665055,0.036676355583328935 -Ti1Pb9O11_75_18827.vasp,TiPb9O11,-3.7835644980952385,0.038729440952377514 -Nb2Br4_11_12655.vasp,Nb2Br4,-2.7509654566666666,0.21034406458332955 -K2Cl2O6_11_9078.vasp,K2Cl2O6,-2.466603454,0.0988836129999977 -Co2O2F2_59_3944.vasp,Co2O2F2,-3.3580699033333334,-0.6521244060416702 -N2O3_1_11787.vasp,N2O3,-4.645015722,0.14109834249999498 -Sr3Mn2S5Br2_123_17386.vasp,Sr3Mn2S5Br2,-2.6392836625,0.08374498499999694 -Mn1W1Se2I1Cl1_25_10934.vasp,MnWSe2ICl,-2.3346435816666666,-0.007994801250000516 -Sb2N18_147_15609.vasp,Sb2N18,-5.857555023,-0.6488227554999991 -Au4S2_191_1579.vasp,Au4S2,0.08080028,0.40659369 -Ni1Te1_156_13433.vasp,NiTe,0.164323795,0.7274007199999996 -Mn3C6N6_164_11367.vasp,Mn3C6N6,-6.001224290666667,0.7430780054999925 -Sr3Ag2S4I2_123_17348.vasp,Sr3Ag2S4I2,-1.7995769881818182,-0.24692132005682121 -La2F2_164_9591.vasp,La2F2,-3.4991704425,0.4907971274999966 -Hg8Se4O12_14_8111.vasp,Hg8Se4O12,-1.6168376745833333,0.11653489250000004 -P2Cl10_51_13967.vasp,P2Cl10,-0.9343447141666666,0.4396423070833321 -Cd2Ag2Te2Cl2_26_3450.vasp,Cd2Ag2Te2Cl2,0.0828392675,-0.0005137868750000052 -Nb1O1F1_8_12549.vasp,NbOF,-5.35645207,0.37036157796295854 -Ni2Se2_187_13641.vasp,Ni2Se2,-0.4976039875,0.29856361749999943 -Zr1Ta1V1S3Br4_1_21455.vasp,ZrTaVS3Br4,-3.304697642,0.25554445149999583 -Ba4Sb2_59_2177.vasp,Ba4Sb2,-1.1596929933333333,0.4213798766666652 -Ta4Se12I2_2_18108.vasp,Ta4Se12I2,-3.404811733888889,0.15011602167928695 -Cu2Cl2_129_5080.vasp,Cu2Cl2,-0.3050226925,0.33112086125000006 -Al1Ag1As2Se6_149_595.vasp,AlAgAs2Se6,-2.130397803,0.2145787693333309 -Ca2P4H8O8_13_3094.vasp,Ca2P4H8O8,-4.613443038636364,0.051772269848476715 -Nb2Os2S8_11_12801.vasp,Nb2Os2S8,-4.387548458333334,-0.09523218375000031 -Hf2Ge2Te8_31_7500.vasp,Hf2Ge2Te8,-2.788212940833333,0.10126313999999992 -Cr1F2_12_4171.vasp,CrF2,-3.25816906,0.02747805333333031 -Li3Mn1P2_115_10148.vasp,Li3MnP2,-2.6556275983333335,0.4525266791666638 -Re2H4N2O4_51_15049.vasp,Re2H4N2O4,-4.467893191666667,1.0128843969444388 -Pd2Br4O12_14_14403.vasp,Pd2Br4O12,-2.1382298305555554,0.31992806833333143 -Rh1O2_164_15160.vasp,RhO2,-3.6307090333333334,0.4999308249999994 -Ba2La2Cl10_11_2015.vasp,Ba2La2Cl10,-2.781761805714286,0.14544407249999747 -V1Cu1Sb2S6_1_19817.vasp,VCuSb2S6,-2.486425518,0.34097673095833103 -Hf2Cl6_162_7479.vasp,Hf2Cl6,-3.15996844875,0.19647344624999663 -Sm2Bi2S4O2_129_16564.vasp,Sm2Bi2S4O2,-4.173241523,0.013919248083330338 -Sn6H4O8_81_16988.vasp,Sn6H4O8,-3.7926854888888886,0.13381517009258959 -Ba3Co2S5Br2_123_2101.vasp,Ba3Co2S5Br2,-2.6740169574999997,0.2002707589843693 -Mn2Bi2Se4F2_26_11017.vasp,Mn2Bi2Se4F2,-2.061110025,0.25734396641666535 -Te4Pd2F2_2_18615.vasp,Te4Pd2F2,-1.48137969,0.21077289265624988 -Ti3C2F2_187_19073.vasp,Ti3C2F2,-6.71573678,-0.3857247757143052 -Mn1Re2O8_147_10846.vasp,MnRe2O8,-5.4894447363636365,0.01897476090909045 -Mn2As2O4F2_26_10969.vasp,Mn2As2O4F2,-3.778408958,0.173982935699996 -K2Pt4Se6_164_9311.vasp,K2Pt4Se6,-1.8917708874999999,0.10389292166666664 -K2I2Cl4O2_11_9202.vasp,K2I2Cl4O2,-1.219894557,0.15058132583333206 -Th4I16_14_18735.vasp,Th4I16,-1.838284089,0.050711892000000036 -Be3I6_5_2280.vasp,Be3I6,-1.2657899000000001,0.1585014716666664 -Bi1S1_123_2370.vasp,BiS,-1.67967054,-0.39067429333333425 -Al2P2Se2S4_1_924.vasp,Al2P2Se2S4,-3.237193037,0.1355630479166604 -V2Ag2O8_51_19971.vasp,V2Ag2O8,-3.8229858975,0.2481383097916634 -Mo2Br6_189_11578.vasp,Mo2Br6,-1.2170060975,0.2207681465624982 -Ag2Te4As2_26_475.vasp,Ag2Te4As2,-1.0653637475,0.2379013862499999 -Tl2S2_129_19505.vasp,Tl2S2,-1.4106341775,0.18518950359375008 -Os2I6_189_13854.vasp,Os2I6,-0.715420195,0.47073855640625006 -Y1Fe1F5_47_20632.vasp,YFeF5,-3.118267885714286,1.020108653571425 -Li1Mn1I2O2_1_9744.vasp,LiMnI2O2,-2.586423145,0.053284321145829816 -Cu1B6H4C6O2_6_4844.vasp,CuB6H4C6O2,-5.214327437368421,0.934799649555911 -Sr2Cd1_123_17175.vasp,Sr2Cd,1.2360902599999999,0.2547511733333333 -Ag2Se2_164_438.vasp,Ag2Se2,-0.1425535075,0.1444025 -Si6As6_12_16524.vasp,Si6As6,-3.7536349933333333,0.12034757750000047 -K2S2N2O6F6_4_9330.vasp,K2S2N2O6F6,-2.9804264961111113,0.3695209851851766 -Al2I2N2_59_876.vasp,Al2I2N2,-3.534950638333333,0.5605356389583301 -Te2Os2Br2_59_18423.vasp,Te2Os2Br2,-2.100212805,0.18946177614583104 -Rb2Cd4Cl6O8_31_14804.vasp,Rb2Cd4Cl6O8,-1.411108392,0.3118493130416651 -In2Se2F2_31_8579.vasp,In2Se2F2,-2.0750585633333336,0.1901592988888865 -Al2Se4_12_976.vasp,Al2Se4,-2.6490197733333334,0.19616564388888658 -Ta4C3_164_18016.vasp,Ta4C3,-8.046533865714286,0.3839112835714209 -Sr2Tl1Ag1Hg1O5_99_17330.vasp,Sr2TlAgHgO5,-2.379846913,0.2364098448249963 -Pb2Br2O2_59_14219.vasp,Pb2Br2O2,-2.174903293333333,0.15032324250000006 -Ba4P4Se8Cl4_14_2172.vasp,Ba4P4Se8Cl4,-2.749948355,0.11585753443750035 -Ag2Hg2S2I2_26_300.vasp,Ag2Hg2S2I2,0.16335173375,0.11875080125000001 -W1O2_115_20441.vasp,WO2,-5.580354953333334,0.6873448153061155 -Cu2Te2F2_59_5331.vasp,Cu2Te2F2,-0.876092125,0.3239141866666645 -Cs2Cd4Te2Cl6O6_31_4700.vasp,Cs2Cd4Te2Cl6O6,-1.590986617,0.327145957625 -Zr3N2_187_21775.vasp,Zr3N2,-6.19630674,0.5034423180000003 -Co1H4C8I2_25_3766.vasp,CoH4C8I2,-4.979154049333333,0.4190802608888824 -Mo1Ir1Br2O2_25_11520.vasp,MoIrBr2O2,-2.9253047050000003,0.5625082087698381 -In1Ge1S3_143_8265.vasp,InGeS3,-2.31786768,0.34193749156249686 -Ta4O10_11_18078.vasp,Ta4O10,-7.081862685,0.16372171071428632 -Fe2Mo2S8I2_129_5877.vasp,Fe2Mo2S8I2,-2.0436405414285717,0.3457112631249972 -Ag2S2Cl2_59_377.vasp,Ag2S2Cl2,-0.6005185533333334,0.3583223314583325 -P4O6_1_14086.vasp,P4O6,-5.144050696,0.11475305760000065 -K2Pt1C4S4N4_2_9305.vasp,K2PtC4S4N4,-4.7649116346666665,0.023940390944434786 -Al2S2F2_31_937.vasp,Al2S2F2,-3.667129526666667,0.18566893541666296 -Fe4B3H2O2_164_6073.vasp,Fe4B3H2O2,-3.38696259,0.48285180772726444 -Zn2P4S6F4_31_21137.vasp,Zn2P4S6F4,-2.417149384375,0.36754106579947615 -Na1In1P2Se6_5_11887.vasp,NaInP2Se6,-2.4078241040000004,0.07617981749999991 -Sb2P8O24_4_15634.vasp,Sb2P8O24,-5.248316847352942,0.12165357169117152 -Sb18Br4_11_15425.vasp,Sb18Br4,-1.903473844090909,0.09288633113636191 -Ir2Cl2_129_8775.vasp,Ir2Cl2,-0.9101150775,1.9496560916666643 -Tl1Pt5Br2_38_19324.vasp,TlPt5Br2,-0.91481634125,1.3794518415625001 -Mg1Sn1_47_10405.vasp,MgSn,-0.237092895,-0.88675961125 -Li4Mn4F16_14_10202.vasp,Li4Mn4F16,-2.926358001666667,-0.3097412958333359 -Sc2N2Cl2_59_16107.vasp,Sc2N2Cl2,-4.439077655,0.20806766249999553 -Pd2Br1N1Cl1_6_14396.vasp,Pd2BrNCl,-1.60489587,0.26553208083333374 -Co2Se2Cl2_59_4019.vasp,Co2Se2Cl2,-1.8523749383333332,0.11888290000000001 -Ta4Br16_2_18009.vasp,Ta4Br16,-2.196654298,0.2031229764375002 -Te2Pd2_123_18477.vasp,Te2Pd2,-1.16365158,0.017871776250000027 -Hg4Mo2Se2O12_28_8080.vasp,Hg4Mo2Se2O12,-2.968525201,0.1338250913499952 -Ge2Te2Cl2_59_6882.vasp,Ge2Te2Cl2,-1.85260875,-0.3002899138194459 -Y2S2Br2_164_20771.vasp,Y2S2Br2,-4.210032969999999,0.07364396166666687 -Ru2Se2_187_15358.vasp,Ru2Se2,-2.64045491,0.8049819262500002 -V6H12O20_100_20386.vasp,V6H12O20,-4.907316443157894,0.04003977828946459 -Ni1Ru1S2_99_13409.vasp,NiRuS2,-2.26742803,0.34887321828124995 -Bi4F12_11_2610.vasp,Bi4F12,-2.587373268125,0.4079325974999999 -Ti2Pd1I2N1O2_1_18987.vasp,Ti2PdI2NO2,-4.6248971225,0.1773468934375 -Yb2Si4Ni2_129_20888.vasp,Yb2Si4Ni2,-2.844043405,0.4918453275000001 -Cu4H12C6Br4N12_11_5406.vasp,Cu4H12C6Br4N12,-4.68881659631579,-0.1247852294079071 -Ag2I4O12_4_319.vasp,Ag2I4O12,-2.1955636772222222,0.16059061444443964 -Ti2Br4_11_18904.vasp,Ti2Br4,-3.114934343333333,0.06361491333333369 -Te2As1_164_18349.vasp,Te2As,-1.7802851366666665,0.24290866527777633 -V2Br2_129_20003.vasp,V2Br2,-1.9613787725,0.5706369425000002 -K2S6Cl2_11_9334.vasp,K2S6Cl2,-1.5940772779999999,0.5858067716250005 -Sc1Cu1P2S6_149_15925.vasp,ScCuP2S6,-3.243826721,0.0682348495364567 -Ca2Au1I2O2_38_2929.vasp,Ca2AuI2O2,-2.098464544285714,0.12321146339285649 -Au1F2_115_1426.vasp,AuF2,0.07968098333333333,0.8791197340740733 -Ni1As1O4_111_13255.vasp,NiAsO4,-3.3238991666666666,0.13683496177083054 -Ga1Te2_115_6294.vasp,GaTe2,-1.50743357,0.323038219666665 -Hf2Se2I2_59_7605.vasp,Hf2Se2I2,-3.510776546666667,-0.051113181250002526 -Cu2Hg2Te2I2_26_5165.vasp,Cu2Hg2Te2I2,0.4099749175,0.16017232161458334 -Ag2H4C4S4N4Cl2_4_276.vasp,Ag2H4C4S4N4Cl2,-4.1286558945000005,0.17707817597395098 -In2Pd4Se6_164_8531.vasp,In2Pd4Se6,-1.621904235,0.18112993619047468 -Hf2Tl4Se6_11_7659.vasp,Hf2Tl4Se6,-2.82414968,0.0915792583333328 -Sr2H4O6_26_17238.vasp,Sr2H4O6,-4.089177964166667,0.12332794812499603 -Mn2B1S2F2_164_10997.vasp,Mn2BS2F2,-2.8234884542857146,0.7271263996800483 -N4O6_59_11793.vasp,N4O6,-3.9743296809999995,0.811784383499996 -U2Te10_11_19729.vasp,U2Te10,-2.716464123333333,-0.47827619291666634 -Ca1Th1Br6_25_2896.vasp,CaThBr6,-2.2756332125,0.10807725437500015 -Si1S2_164_16360.vasp,SiS2,-3.72408518,0.15713737333333366 -Ti7C2Se1Br3Cl1O6_1_19185.vasp,Ti7C2SeBr3ClO6,-5.9189067325,0.05231020564999156 -Pb1Se1I2_8_14204.vasp,PbSeI2,-0.7880201725,0.3293562904166667 -Cr4Bi4O16_14_4593.vasp,Cr4Bi4O16,-4.3805519183333335,0.05345056690971384 -Nb1Sb1Te3Mo1_25_12570.vasp,NbSbTe3Mo,-2.6442156716666667,0.28512513812499085 -In2Se2S8F2_11_8585.vasp,In2Se2S8F2,-2.0480845257142857,0.5135596187797573 -Mn1Mo1Ir1Br2O5_1_10794.vasp,MnMoIrBr2O5,-3.614271713,0.24330262724999463 -Li2Re1_187_10047.vasp,Li2Re,-3.1579477866666665,0.41044714444444175 -Ta2Te2_123_17911.vasp,Ta2Te2,-4.433330045,0.3130489862499952 -Pt2Se2S6_12_14680.vasp,Pt2Se2S6,-2.20534858,0.3104223292499976 -Au3S2I1Br1_1_1563.vasp,Au3S2IBr,-0.16293447142857143,0.274471661607143 -Zr3C2S2_187_21759.vasp,Zr3C2S2,-5.923578572857143,0.2278755621428522 -Mn2Sb2Te4I2_10_11260.vasp,Mn2Sb2Te4I2,-1.352022169,0.16675112199999798 -Bi4Mo2O12_4_2615.vasp,Bi4Mo2O12,-4.328727977222222,1.051418694999994 -K2B2Te2C2_31_9000.vasp,K2B2Te2C2,-2.71422724875,1.4684727302083336 -In4Cl4_39_8670.vasp,In4Cl4,-1.2893905025,0.10738170093749999 -Nb4Mo6I22O1_2_13093.vasp,Nb4Mo6I22O,-1.7210602454545454,0.1027237733333316 -Si3N4_5_16471.vasp,Si3N4,-5.879805451428572,-0.06067520285714334 -Sr2Au1S2Cl2_123_17128.vasp,Sr2AuS2Cl2,-1.92554977,0.2874166842857103 -K2Cd4S2I6O6_31_9048.vasp,K2Cd4S2I6O6,-1.6051349739999998,0.07631402096875081 -Bi2Mo1_187_2472.vasp,Bi2Mo,-1.5502833166666665,0.5507075833333317 -Sc2S2_10_16139.vasp,Sc2S2,-3.5495146975,0.3263214175 -Sc2I2_129_16096.vasp,Sc2I2,-1.4209370275,0.5539710883333311 -Cu1Bi1Te1Se1_8_4855.vasp,CuBiTeSe,-1.1119179175,0.2587325021875 -K2H6C6O6_4_9145.vasp,K2H6C6O6,-5.1375327075,0.17919913018749567 -B2Se2_2_1711.vasp,B2Se2,-3.9984852925,0.17649949000000031 -K4H4Se2I4O20_13_9453.vasp,K4H4Se2I4O20,-3.1090019535294116,0.0878913800000003 -Au2C4O8F4_14_1463.vasp,Au2C4O8F4,-4.165865566666667,0.12044799722221367 -Cd2Se2Br2_59_3568.vasp,Cd2Se2Br2,-0.17329979666666664,0.0934843693055542 -Rb2Sn1H12N6_147_14942.vasp,Rb2SnH12N6,-4.12010625,-2.7238081356250055 -Tb2F2_164_18193.vasp,Tb2F2,-3.356681805,0.49501927749999663 -V2Sb2Te6_162_20177.vasp,V2Sb2Te6,-1.911397728,0.2766199361666646 -Ga1Co5F2_123_6154.vasp,GaCo5F2,-1.53472792375,0.7111659758333309 -Mo2I6_189_11628.vasp,Mo2I6,-0.5882837525,0.3361627766666667 -V2Br2N2_59_20000.vasp,V2Br2N2,-4.27901449,-0.13589104062500246 -Ba2Bi2I2O4_51_1919.vasp,Ba2Bi2I2O4,-3.2201442919999996,0.16119744900000033 -Li2Mn2F10_4_9993.vasp,Li2Mn2F10,-2.763068407857143,0.07964746080356866 -Mo1As2_187_11488.vasp,MoAs2,-3.18236099,0.35973322333333346 -Ca3In2As4_10_3182.vasp,Ca3In2As4,-2.0516378333333334,-0.3005976044444445 -Si2Bi4O10_26_16388.vasp,Si2Bi4O10,-4.620883508125,0.2525760287499952 -Bi1S1F1_156_2368.vasp,BiSF,-2.443018353333333,-0.30431469250000187 -Be2N1_25_2261.vasp,Be2N,-4.7226444899999995,0.5956820022916632 -Ti2I4_11_18959.vasp,Ti2I4,-2.4533261333333334,0.07110303166666654 -Ca2As2H10O12_7_2923.vasp,Ca2As2H10O12,-4.4448509476923075,0.041284456506410994 -V2S2O10_85_20160.vasp,V2S2O10,-4.80650466,0.1312635164285716 -Al2Ni2Se5_164_906.vasp,Al2Ni2Se5,-2.003287518888889,-0.009088144444446722 -Nb4Br16_14_13041.vasp,Nb4Br16,-1.9430518995,0.1985541154999999 -Mn2Ga2Se5_156_11080.vasp,Mn2Ga2Se5,-2.335525627777778,0.011226905842909363 -Os2Se4_127_13890.vasp,Os2Se4,-2.5007546066666664,1.0438666533333336 -Ru2Se4_11_15362.vasp,Ru2Se4,-2.8558603833333334,0.33874007666666683 -Ir2Br8_2_8771.vasp,Ir2Br8,-0.829001181,0.19677439700000013 -Ni2H2Se4_6_13515.vasp,Ni2H2Se4,-1.665250465,0.65400610375 -Ca3Ni2S5Br2_123_3194.vasp,Ca3Ni2S5Br2,-1.9941177008333335,0.17395114026041208 -Ge2As2O6_147_6737.vasp,Ge2As2O6,-4.261649139,0.3782883528333296 -Zr2Si2Se8_31_21688.vasp,Zr2Si2Se8,-3.445215891666667,0.16257308718749997 -Sc3N2Cl2_187_16211.vasp,Sc3N2Cl2,-5.030380995714286,-0.07989228571429097 -Nb4Fe8S8_59_13075.vasp,Nb4Fe8S8,-3.0403449680000003,0.844196651666663 -Os2F2_129_13845.vasp,Os2F2,-1.8444842675,1.962041352875 -Mg1C2_164_10349.vasp,MgC2,-2.2423568233333335,3.0304439805555505 -Hf1Mn1Te1Se1S1I1Cl1_1_7224.vasp,HfMnTeSeSICl,-2.655006562857143,0.2896149083035612 -Ag2C2Cl2O2_31_212.vasp,Ag2C2Cl2O2,-3.10494995,0.2970360225000004 -In1Ga1Hg1Te4_156_8254.vasp,InGaHgTe4,-0.8781178514285715,0.16378001285714272 -Ni1Au1Se2_156_13262.vasp,NiAuSe2,-0.475763075,0.5252616449999991 -Ta2Fe2Te10_51_17729.vasp,Ta2Fe2Te10,-2.219242217142857,0.29172825672618463 -Ho2I6_162_8142.vasp,Ho2I6,-1.56118771125,0.057426468749999904 -Mo3Se1N1O12_143_11728.vasp,Mo3SeNO12,-4.651150772352942,0.1673356533823478 -V2Cu2Sb4Se12_13_20052.vasp,V2Cu2Sb4Se12,-2.0699499475,0.2394254975999979 -Ta4Cr2O12_14_18031.vasp,Ta4Cr2O12,-6.673344163333334,0.13133691296295646 -Sb2I2_129_15589.vasp,Sb2I2,-0.78698705,0.370009862499999 -Cd1S2F2_164_3415.vasp,CdS2F2,-1.167808224,0.5687249037500003 -Nb2Cl2O4_11_12678.vasp,Nb2Cl2O4,-5.5804663825,-0.10999150234375765 -In2Ge2S2_164_8449.vasp,In2Ge2S2,-2.5575366683333334,-0.3134313500000019 -Cs2Os2Br8N2O4_7_4755.vasp,Cs2Os2Br8N2O4,-2.488443931111111,0.09613663324073818 -V1P2_187_19901.vasp,VP2,-3.870928376666667,0.6428740149999994 -Co2P4Cl4O6_11_3968.vasp,Co2P4Cl4O6,-3.547699590625,0.26377142916666196 -Ga2Sb2Se6_147_6459.vasp,Ga2Sb2Se6,-2.0722124109999998,0.2830944925000003 -Nb2Sb2Se6_2_12861.vasp,Nb2Sb2Se6,-3.2111882940000003,0.28144419199999804 -Ca1Ta2O7_123_2891.vasp,CaTa2O7,-6.133069537,0.47352593237499696 -Na3Cr1Cl6_149_12350.vasp,Na3CrCl6,-1.816493214,0.16985491899999983 -Hg2Te2Au2Cl2_26_8024.vasp,Hg2Te2Au2Cl2,0.3210223675,0.25453490000000006 -Na2H2Pt1_123_12103.vasp,Na2H2Pt,-2.018647292,0.06373002550000018 -Ba1Mn4O8_162_1843.vasp,BaMn4O8,-4.403332258461538,0.09063991461538023 -Zr2N1F2_164_21604.vasp,Zr2NF2,-5.4362384079999995,0.2530215367499946 -Ag2Te3P4F2_6_473.vasp,Ag2Te3P4F2,-1.8507171172727275,0.4856050837741004 -Sb2F2_2_15575.vasp,Sb2F2,-2.199931395,0.6386799058333309 -Sc2H2S2N1_164_16087.vasp,Sc2H2S2N,-4.37982088,-1.1685832621428636 -Fe2B1H2O2_164_5797.vasp,Fe2BH2O2,-3.4913076071428573,0.6981674714285666 -Sn2Se2Cl2_59_16877.vasp,Sn2Se2Cl2,-1.6558126666666666,0.20655338583333338 -Sc2N1Cl2_164_16103.vasp,Sc2NCl2,-4.415733596,0.04150485200000009 -Mg4As2_59_10572.vasp,Mg4As2,-1.1671528533333333,0.4188069469444441 -Pt4Se5S3_6_14710.vasp,Pt4Se5S3,-2.3338614966666666,0.06447105145833332 -In1Ni1Se2Br2_25_8285.vasp,InNiSe2Br2,-1.0306016766666668,0.19552673166666418 -Zr2C1O2_164_21534.vasp,Zr2CO2,-6.926871628000001,-0.02347719999999942 -Nb4Ni4Te8_53_13105.vasp,Nb4Ni4Te8,-2.413395194375,0.03968509499999984 -Sb8_55_15883.vasp,Sb8,-1.68827415,0.5952929224999999 -Mn4Pb4S12_13_11448.vasp,Mn4Pb4S12,-2.6229016175,-0.33714143300000343 -C1Se1_156_2737.vasp,CSe,-3.32191106,1.8902459216666665 -Sb2Mo2_2_15606.vasp,Sb2Mo2,-2.706552635,0.7077014071428531 -B8O6_11_1790.vasp,B8O6,-6.041955933571429,0.6470183137351198 -Ca2H8S4Cl4_53_3045.vasp,Ca2H8S4Cl4,-2.897443088888889,-0.0001194077777806335 -Mn1Al2Se4_156_10629.vasp,MnAl2Se4,-2.716709342857143,0.03315699428571417 -Pd2S2_123_14472.vasp,Pd2S2,-1.76461863,0.34551271000000017 -Hf1Zr1I1N1Cl1_1_7379.vasp,HfZrINCl,-4.310519224,0.5242808800000005 -Fe4C3_164_6076.vasp,Fe4C3,-3.21363697,1.5104277828571377 -La1Ge3_187_9565.vasp,LaGe3,-2.609681305,0.6619853433333303 -Sr2In1Cu1Hg1S5_99_17265.vasp,Sr2InCuHgS5,-1.837906634,0.19642920100000005 -Te4C4_28_18581.vasp,Te4C4,-3.87946227375,0.9645933095833331 -Sr1S2F2_12_17077.vasp,SrS2F2,-2.146736024,1.188527897750001 -Sc2Sn1_164_16168.vasp,Sc2Sn,-1.8903754366666667,0.9148924127777753 -B3W2_187_1740.vasp,B3W2,-5.3821276220000005,0.9926499809999938 -Y1Ge2S1Cl2_6_20634.vasp,YGe2SCl2,-3.0600276333333336,0.1415973837499951 -Zr1Br2O1_156_21268.vasp,ZrBr2O,-3.917127655,0.16752657562500017 -Ba2F4_2_1979.vasp,Ba2F4,-3.254778941666667,0.6174318116666662 -K2Fe2As2_12_9099.vasp,K2Fe2As2,-0.9734495666666666,0.7596058670833319 -Zr1Sc1Ta1Cl2O2_25_21438.vasp,ZrScTaCl2O2,-4.971367012857143,0.6558832199999873 -Cu2S1_191_5240.vasp,Cu2S,-0.43711369666666666,0.557796089999999 -Nb4Te12Br2_2_13164.vasp,Nb4Te12Br2,-2.574572197777778,0.12337895121031228 -Sc1Mn1Zn1S3Br2_1_15955.vasp,ScMnZnS3Br2,-2.0901398825,0.41254172612499695 -In1Se1Br1Cl1O1_1_8339.vasp,InSeBrClO,-1.8521356919999998,0.3686275417499944 -Te1Pt4Se7_1_18330.vasp,TePt4Se7,-1.9919654775,0.20764754291666654 -I5N1_10_8164.vasp,I5N,-0.23313986166666667,0.37142610197916315 -Cr1S2O8_164_4247.vasp,CrS2O8,-4.3864646327272725,0.0028234035795378087 -Sb2F10_51_15573.vasp,Sb2F10,-2.1856967725,0.2679595983333334 -Nb1Mo3S1Br2N2O1_8_12536.vasp,NbMo3SBr2N2O,-4.291071285,0.34774891493750026 -Co2Br8_1_3880.vasp,Co2Br8,-0.531268258,0.21692570999999997 -Sn2Sb2C2O6F6_7_16852.vasp,Sn2Sb2C2O6F6,-3.60402094,0.7179232355555447 -Hf1Zn1Br1Cl1O2_1_7367.vasp,HfZnBrClO2,-3.6873919483333335,0.40458102713541644 -Cu4H6C8S2N4Cl2_2_5418.vasp,Cu4H6C8S2N4Cl2,-4.5367851553846155,0.219926161490376 -Na1W2S2I6_47_11956.vasp,NaW2S2I6,-1.6810331509090908,0.1163665073484812 -V4Zn2S10_59_20381.vasp,V4Zn2S10,-2.676376154375,0.4377579942499996 -In1Ag1As2Se6_149_8178.vasp,InAgAs2Se6,-1.8669507570000001,0.23140338333333102 -Zr2S3Br2_5_21655.vasp,Zr2S3Br2,-3.655330404285714,0.22453399017856768 -As2Ir2_129_1228.vasp,As2Ir2,-3.501381145,0.8254801925000002 -Ti4S4Br4_31_19157.vasp,Ti4S4Br4,-4.06709837,0.18741278166666664 -Ti4O8_11_19152.vasp,Ti4O8,-6.579589205,0.6842653199999997 -K4H12C4S4O16_14_9450.vasp,K4H12C4S4O16,-4.337362440750001,0.10223577577083365 -Tl1Cu1P2O6_149_19252.vasp,TlCuP2O6,-4.027637171,0.5930031496250001 -Rb1V3Se2O12_143_14763.vasp,RbV3Se2O12,-4.651970250555555,0.09208142694444454 -Ir2S2Cl2_59_8815.vasp,Ir2S2Cl2,-2.66550021,0.04746284500000009 -Fe3Hg2S8_10_6056.vasp,Fe3Hg2S8,-1.458408460769231,-0.05456333192307784 -K2Ni2P2_129_9269.vasp,K2Ni2P2,-1.1315648733333334,0.12677746999999995 -Hf2Se1S1I1Br1Cl2_1_7597.vasp,Hf2SeSIBrCl2,-3.27011609875,0.2983002167708335 -Ba3Fe2S5I2_123_2110.vasp,Ba3Fe2S5I2,-2.4371350333333335,-0.10571063046875251 -Mo2As4_2_11567.vasp,Mo2As4,-2.827779586666667,0.7143146266666665 -Ni1Br2O8_147_13286.vasp,NiBr2O8,-1.9764737809090909,0.49070022670454305 -Sr2Sb1_25_17309.vasp,Sr2Sb,-0.3609067633333333,1.0316013188888875 -Be1I2_115_2223.vasp,BeI2,-1.3136301533333332,0.11066121833333331 -Fe3Ge1S2_187_6050.vasp,Fe3GeS2,-1.8732412299999999,0.06320029866666321 -Nb4S6_11_13145.vasp,Nb4S6,-5.071472056999999,-0.16893056050000332 -Au2S4_6_1530.vasp,Au2S4,-0.9742095233333333,0.5729444531249986 -Hf2Se1S1I1Br3_1_7599.vasp,Hf2SeSIBr3,-3.0857386425,0.29667344692708353 -V2Sn2Te6_162_20199.vasp,V2Sn2Te6,-1.741650043,-0.30701421633333315 -Nb2Fe2Se10_51_12717.vasp,Nb2Fe2Se10,-2.7715850800000004,0.35115369357142523 -Mg2Mo2S14_4_10481.vasp,Mg2Mo2S14,-2.671278258333333,0.20410411194444222 -Ta1O2_164_17593.vasp,TaO2,-7.04920366,0.30586702866665993 -B2Au2Br2O2_31_1650.vasp,B2Au2Br2O2,-2.39578124375,1.4709005530555506 -Zn4Si4N8_53_21227.vasp,Zn4Si4N8,-4.314146314375,0.723539578125 -Sr2Gd1S3_38_17224.vasp,Sr2GdS3,-3.453212733333333,0.038499233333330496 -Ru2Se2Br2_59_15353.vasp,Ru2Se2Br2,-2.0927420016666667,0.3659499269444415 -Cu4S4Cl4F4_14_5452.vasp,Cu4S4Cl4F4,-1.14582790125,0.2206004296507314 -Li4As4O8_14_10156.vasp,Li4As4O8,-4.493627068125,0.024041915069436454 -Fe2W2Se2S12_113_6039.vasp,Fe2W2Se2S12,-2.840895535,0.13354133689814546 -Rb2Cd4Te2Cl6O6_31_14824.vasp,Rb2Cd4Te2Cl6O6,-1.6041091604999997,0.09822406962499977 -Mn7Ga1S4I2Br4Cl2_1_11474.vasp,Mn7GaS4I2Br4Cl2,-1.8736340825,0.039517582068963567 -Li1N3_10_9753.vasp,LiN3,-4.698720775,0.37542198000000004 -V6Se4Cl2O16_1_20396.vasp,V6Se4Cl2O16,-4.302058104285714,0.23109929007936197 -Ti4B3F2_164_19118.vasp,Ti4B3F2,-5.995247236666667,-0.2384717373148204 -Al2Ni2O5_164_901.vasp,Al2Ni2O5,-4.1447207355555555,0.06873143888888444 -Al4Sb4_127_1090.vasp,Al4Sb4,-1.733120395,-0.18423747000000001 -Y1B1C1_99_20605.vasp,YBC,-5.432578846666666,1.060584650277772 -Be2B1O5_5_2240.vasp,Be2BO5,-5.1650553475,0.722040101588542 -B4Br4_28_1749.vasp,B4Br4,-1.50678577375,1.8196279281944414 -Ga2H10C4Cl4_10_6369.vasp,Ga2H10C4Cl4,-3.501152493,0.4407807405000004 -As1I2_187_1151.vasp,AsI2,-0.4829207466666667,0.4832750744444435 -Ni2S2O6_12_13586.vasp,Ni2S2O6,-3.501812774,-0.14774671100000125 -V4Te12_11_20372.vasp,V4Te12,-2.001464105625,0.1669131268749997 -Na2N4O2_31_12220.vasp,Na2N4O2,-4.54908668125,-0.14336731354167187 -Ta1Bi1S2Br1_1_17511.vasp,TaBiS2Br,-3.089524196,0.6158754473333308 -Mn2C1S2_164_11041.vasp,Mn2CS2,-3.6729146999999998,0.31637936000000044 -Mo2As4S12_1_11566.vasp,Mo2As4S12,-2.93044273,0.5710811918749965 -K2B2H12N4_4_8985.vasp,K2B2H12N4,-4.108245472,0.2170064207499962 -In2Bi2S6_149_8382.vasp,In2Bi2S6,-1.875393227,0.2949661496666648 -Nb4O10_11_13112.vasp,Nb4O10,-6.809451870714286,-0.3422768658928598 -Mn2As2S4F2_26_10975.vasp,Mn2As2S4F2,-2.812668111,0.24234861762500048 -Sr2O8F4_125_17290.vasp,Sr2O8F4,-1.8582945342857144,1.6944490649999966 -Cu2I2_51_5173.vasp,Cu2I2,0.4762491,0.4092058399999996 -Zr2S1Br2N1_1_21637.vasp,Zr2SBr2N,-4.2353348550000005,0.39815817333333237 -Zr4B3S2F2_164_21806.vasp,Zr4B3S2F2,-4.459026303636364,0.728458741136359 -Ag1Bi2_10_31.vasp,AgBi2,-0.23623636,-0.16611531833333343 -Mn1Cl2_115_10664.vasp,MnCl2,-1.4390411966666665,0.3567613666666667 -Ti3B2F2_187_19058.vasp,Ti3B2F2,-5.843876827142857,-0.2973845197619154 -N1O2_191_11775.vasp,NO2,-3.9941790333333334,0.7088643024999994 -Tl2V6O16_11_19563.vasp,Tl2V6O16,-5.16174262875,0.06297657833333314 -Ti2B1H2S2_164_18886.vasp,Ti2BH2S2,-4.85665247,0.49242784874999024 -Te2Au1_164_18363.vasp,Te2Au,-0.34953490000000004,-0.16715823458333337 -Mg1Al2O4_164_10331.vasp,MgAl2O4,-5.555393621428571,-0.0651521214285753 -Fe1Mo1Cl2O4_8_5719.vasp,FeMoCl2O4,-3.34170986125,0.159766358776035 -Ga2S5_5_6455.vasp,Ga2S5,-2.734796382857143,0.09968319553571159 -Cd2Te2I2_59_3593.vasp,Cd2Te2I2,0.3017028016666667,-0.003879205277778519 -V2P2S6_12_20140.vasp,V2P2S6,-3.5584095410000005,0.12455163320312446 -Zr4C3S2_164_21815.vasp,Zr4C3S2,-6.239419827777778,0.1531385633333271 -K2Te2F2_1_9370.vasp,K2Te2F2,-1.1408156033333332,0.36807782555555424 -Tc1Te2_164_18223.vasp,TcTe2,-3.48501154,0.3719154741666668 -Cu1I1_187_4907.vasp,CuI,0.397665765,0.33062250499999957 -Te4Os2_11_18602.vasp,Te4Os2,-2.6847271266666666,-0.4828534583333335 -Fe2As2Se4Cl2_26_5786.vasp,Fe2As2Se4Cl2,-2.057478244,0.13939807399999826 -Ce1C2_123_3642.vasp,CeC2,-5.6030424,0.7712455091666599 -Sc4S4I4_11_16260.vasp,Sc4S4I4,-3.0665898708333335,0.21876092083333365 -K2V1Ag1Se4_21_9384.vasp,K2VAgSe4,-1.74122059125,0.144575905625 -Ba3F6_1_2104.vasp,Ba3F6,-3.6413792255555557,0.23083152777777727 -Au2F2_129_1477.vasp,Au2F2,0.372087365,1.3459996005555546 -Hf2I6_2_7525.vasp,Hf2I6,-1.9758591725,0.3252584037499997 -Au2C4S8F4_2_1464.vasp,Au2C4S8F4,-3.0034387016666666,0.3676963853472135 -K8Ge4Te16_14_9553.vasp,K8Ge4Te16,-1.374256747142857,0.060110433571428645 -Ti2C1F2_164_18909.vasp,Ti2CF2,-6.209517316,-0.48234376733334017 -Ag2C2O4_2_219.vasp,Ag2C2O4,-4.1347290575,0.32999939125000033 -Ti3S2N2F2_187_19100.vasp,Ti3S2N2F2,-5.478597344444444,0.13599425203703164 -Ag2Te2_129_460.vasp,Ag2Te2,-0.0861186375,0.2715138054166667 -Nb3Te1F7_156_13023.vasp,Nb3TeF7,-4.18216095,0.11088294539772481 -Ge1I2_115_6672.vasp,GeI2,-0.91391505,0.3049102066666667 -Cr2Si2Te6_162_4510.vasp,Cr2Si2Te6,-2.0641273609999997,0.2051351440000002 -Na1P2Pd1Se6_5_11925.vasp,NaP2PdSe6,-2.318563687,0.2503159634166666 -Sb4Pt4O4_13_15809.vasp,Sb4Pt4O4,-2.7925986408333334,0.5586120697499977 -La2P1Br2_164_9602.vasp,La2PBr2,-3.607490716,0.04005713600000016 -Ag2P4Se3Cl2_6_364.vasp,Ag2P4Se3Cl2,-1.9523266054545454,0.1700908480160962 -K2Pt1C4Br2N4_2_9302.vasp,K2PtC4Br2N4,-4.678873813846153,0.23741349128204536 -Bi2Te2S1_164_2563.vasp,Bi2Te2S,-1.8257775500000002,0.07762225199999961 -Tl1Br2_164_19230.vasp,TlBr2,-0.3885105933333333,0.1795431204166667 -Cd2P2S6_162_3527.vasp,Cd2P2S6,-2.287778363,0.0488943509999995 -Mo1Br2N1_8_11497.vasp,MoBr2N,-2.828733485,-0.048059371249999705 -Ba2Cl4_2_1951.vasp,Ba2Cl4,-2.1558176033333334,0.56837778 -Sb2Se1S1I2_1_15688.vasp,Sb2SeSI2,-1.5460793800000001,-0.24468214124999987 -Ag4Te4_2_579.vasp,Ag4Te4,-0.16807547,0.18955697291666665 -In2H2Se2S8_11_8464.vasp,In2H2Se2S8,-2.412585851428571,0.25929472547618587 -Cr1Ag1Te2_156_4108.vasp,CrAgTe2,-0.9317416825,0.28756137562499995 -Ca1Sn2N2_115_2886.vasp,CaSn2N2,-3.3351289459999998,-0.4605356079999968 -Sc2F2_129_16070.vasp,Sc2F2,-2.749099785,0.7891672966666641 -Li1P2Pd1Se6_5_9775.vasp,LiP2PdSe6,-2.463961453,0.2562845877083281 -Zr4Tl4F20_14_21857.vasp,Zr4Tl4F20,-3.7648099596428573,0.03865163999999588 -Fe2Bi2Te4Br2_26_5812.vasp,Fe2Bi2Te4Br2,-1.148701057,0.38783809150000015 -Ga2Te2H2O8_11_6502.vasp,Ga2Te2H2O8,-4.075278044285715,-0.35020569803571755 -Ca2I2_129_3054.vasp,Ca2I2,-0.1990043775,0.9144928759999998 -Cu2S2Br1Cl1_1_5241.vasp,Cu2S2BrCl,-0.83900269,0.26609864581349074 -Ta2Se2Br2_59_17869.vasp,Ta2Se2Br2,-3.8354259249999996,0.17765113750000094 -In1Pb1S2I2_1_8303.vasp,InPbS2I2,-1.3791165416666666,0.25122690092013644 -Cd1Sn2Br2O2_12_3427.vasp,CdSn2Br2O2,-2.044915277142857,0.09883231464285558 -V3N2Cl2_187_20280.vasp,V3N2Cl2,-4.461274012857143,0.16440532873015046 -Eu1N2_6_5590.vasp,EuN2,-4.89858438,1.3742784383333335 -Cd2Cu2S2F2_26_3491.vasp,Cd2Cu2S2F2,-0.77361004125,0.21569656156250008 -V4Ni2P4O20_7_20337.vasp,V4Ni2P4O20,-5.042005893,0.16192675599998996 -Ga1Fe5Cl2_123_6188.vasp,GaFe5Cl2,-0.7253665075,1.0072918354166658 -Tl2Pd4S6_164_19487.vasp,Tl2Pd4S6,-1.8828864858333334,0.14670361666666643 -Mg2Br4_2_10435.vasp,Mg2Br4,-1.2479975583333334,0.289973006111111 -Pt2C4S12_14_14608.vasp,Pt2C4S12,-3.581680818888889,0.2671663119444405 -Ni1Se2_115_13422.vasp,NiSe2,-0.9580292466666666,0.5257262666666668 -Ti2S2N1F2_164_18999.vasp,Ti2S2NF2,-4.738535784285714,0.22983031833332435 -Co2Cl2O2_59_3888.vasp,Co2Cl2O2,-2.8795373916666667,-0.7741250747916699 -Mg2Co2Ge2_129_10441.vasp,Mg2Co2Ge2,-1.7095557149999998,0.31922077333333365 -Rb2C2Se2S6Cl6_1_14796.vasp,Rb2C2Se2S6Cl6,-2.0785554866666667,0.43022355164351544 -La2P1I2_164_9603.vasp,La2PI2,-3.256076582,0.051675853999999966 -Ca3Ag2S4Cl2_123_3146.vasp,Ca3Ag2S4Cl2,-1.8995372236363637,0.1313951067613575 -Re2I6_12_15056.vasp,Re2I6,-906.26046149375,-904.5840097741666 -Cu1Sb3Te6_143_4973.vasp,CuSb3Te6,-1.255675211,0.3211394393333333 -Ag2F6_162_261.vasp,Ag2F6,-0.52105195625,-0.020929671250000004 -Ta4S2N3F2_164_18101.vasp,Ta4S2N3F2,-6.064927502727272,0.7134702122727228 -Sc1Nb1S2I1Br1_25_15959.vasp,ScNbS2IBr,-3.491932145,0.22275625944444077 -Sb2Au2Se6_2_15547.vasp,Sb2Au2Se6,-1.371265403,0.3129757213333312 -V4N3_164_20335.vasp,V4N3,-5.582997351428571,0.4294829233333277 -Ni4As2_129_13738.vasp,Ni4As2,-0.6017629866666666,1.8021354847839506 -Rb2Cd4S6O2F6_31_14812.vasp,Rb2Cd4S6O2F6,-1.596205655,0.4186305133749965 -Sc2As2Se8_2_16030.vasp,Sc2As2Se8,-2.8242910208333334,0.29164878013888296 -Sc1S2Br1_8_15987.vasp,ScS2Br,-2.994439625,0.35152284609374984 -Cr2Se2Br2_59_4493.vasp,Cr2Se2Br2,-2.0745041483333333,-0.11657217833333333 -Ca2Mn2Sn2_129_3067.vasp,Ca2Mn2Sn2,-0.7996044016666667,0.6372103125862056 -Ca5Ce1_8_3249.vasp,Ca5Ce,0.3345309166666666,1.2449294808333318 -Zr4S4I1Br3_6_21844.vasp,Zr4S4IBr3,-3.6920064633333336,0.0432451508333328 -Fe2As1S2_187_5771.vasp,Fe2AsS2,-2.18166095,0.3136087245000002 -Ca2Si2_51_3124.vasp,Ca2Si2,-2.17356217,0.37826816500000016 -B1Cl3_189_1622.vasp,BCl3,-2.4769418775,0.06623852750000037 -Nb4Te14Pd2_11_13168.vasp,Nb4Te14Pd2,-2.5274564760000002,0.09660045633333003 -V2O5_6_20130.vasp,V2O5,-5.35270562,0.10587296214285669 -W1Se2_164_20456.vasp,WSe2,-3.5629686933333335,-0.1715083233333332 -Si6P6_12_16539.vasp,Si6P6,-4.291541025,0.10500063416666627 -Sr2Br4O8_125_17155.vasp,Sr2Br4O8,-2.5761456249999997,0.13001576547618915 -B3Mo4F2_164_1733.vasp,B3Mo4F2,-4.1941124911111105,0.4955425137036997 -As2Cl10_51_1199.vasp,As2Cl10,-0.78045691,0.34923847416666576 -Hf2C1S2_164_7458.vasp,Hf2CS2,-6.308855408,0.10741864999999162 -Ca4Ni2Cl2O6_129_3230.vasp,Ca4Ni2Cl2O6,-3.4313245078571426,-0.2537018121428659 -P2W2S6_2_14059.vasp,P2W2S6,-3.7500921480000002,0.3389771548593723 -Li2V2F10_4_10118.vasp,Li2V2F10,-3.4074512278571425,-0.02476350452381526 -Sb4I12_14_15777.vasp,Sb4I12,-0.540194905,0.05351692750000003 -Mn2Bi2Te4Cl2_26_11022.vasp,Mn2Bi2Te4Cl2,-1.369835977,0.321829297137929 -Sr3Mn2S5I2_123_17388.vasp,Sr3Mn2S5I2,-2.457916980833333,0.12583025222221966 -Sc2S18_1_16126.vasp,Sc2S18,-2.8612052545,0.24881721015625002 -Zr2Cu4Te6_12_21558.vasp,Zr2Cu4Te6,-1.5718577866666665,0.1706132941666667 -Tl2Bi1Se2_164_19371.vasp,Tl2BiSe2,-1.27471457,0.11433748314814718 -Fe2B1Cl2_164_5795.vasp,Fe2BCl2,-1.899558228,0.24969153828571022 -Ir2Se2Cl2_59_8836.vasp,Ir2Se2Cl2,-2.3178878183333333,-0.10336681097222589 -Pd2I1Br1_156_14426.vasp,Pd2IBr,-0.40594249,0.33644556 -Pb1S2F2_12_14199.vasp,PbS2F2,-1.7774226460000002,0.8811245217499999 -As2I10_51_1219.vasp,As2I10,-0.06715357666666667,0.26280425312499966 -H2Pd1_187_7011.vasp,H2Pd,-2.2245110033333333,1.3009379949999968 -Ga2S2_129_6449.vasp,Ga2S2,-2.5146712025,0.34105529249999966 -V1Cu1O2_156_19813.vasp,VCuO2,-3.8150697125,0.8404878937499998 -Si1Te2_164_16377.vasp,SiTe2,-2.17563043,0.1952371283333334 -Bi2Te3_164_2571.vasp,Bi2Te3,-1.4785252180000001,0.08882871599999986 -H2Au2O4_2_6989.vasp,H2Au2O4,-2.54108249,0.21109200385416682 -Ag2N4O10_1_334.vasp,Ag2N4O10,-3.81358184875,0.14040864218749993 -In2Sn2Se2_164_8608.vasp,In2Sn2Se2,-1.5831054900000001,-1.1833030766666672 -Ni2Ag1S4_187_13441.vasp,Ni2AgS4,-1.4112819142857143,0.07160903897321325 -Ag2B2O2F2_31_180.vasp,Ag2B2O2F2,-2.8595390575,1.0549552826388842 -Nb4Te8Pd4_53_13175.vasp,Nb4Te8Pd4,-2.76597836,-0.17708910646739373 -Th1Rh5_65_18721.vasp,ThRh5,-1.0071444316666667,2.711118961666663 -Au2N12_31_1495.vasp,Au2N12,-4.9705790585714285,-0.013459569285715567 -V4I16_14_20332.vasp,V4I16,-0.6533438730000001,0.11138614337500041 -Zr1As2H2S6_164_21244.vasp,ZrAs2H2S6,-3.030284614545455,0.5234531351136293 -Li4Fe2P4O14_113_10185.vasp,Li4Fe2P4O14,-4.764294815,0.3699675304861034 -Sn1Au2Cl2O3_6_16610.vasp,SnAu2Cl2O3,-1.45649587625,0.5549886376041664 -Li1Ni1Te1Ir6Se1S4I5Br1_1_9768.vasp,LiNiTeIr6SeS4I5Br,-1.8619403384999997,0.3856290749131887 -In1Pd5Br2_38_8310.vasp,InPd5Br2,-0.8960373225,0.03966016447368337 -Zr2P1Se2_164_21623.vasp,Zr2PSe2,-4.614673292,0.04325224500000102 -Cu2Bi4O8_90_5045.vasp,Cu2Bi4O8,-2.74839166,0.7078538079464235 -In2Cl2_164_8400.vasp,In2Cl2,-1.2127093475,0.18406285593750016 -Mn2Sb2S4F2_26_11241.vasp,Mn2Sb2S4F2,-2.649976026,0.2879828934166647 -Zr3B2S2F2_1_21742.vasp,Zr3B2S2F2,-4.654942616666666,0.48515960222220855 -Cd1Se1_123_3423.vasp,CdSe,0.202393835,-0.18107375 -Cu1Bi1Sb2Te6_143_4854.vasp,CuBiSb2Te6,-1.1834404040000002,0.3236363113333315 -Ta3Pd3Se14_6_17978.vasp,Ta3Pd3Se14,-3.076010538,-0.11835465285416824 -Ga1Os1Br6_149_6225.vasp,GaOsBr6,-1.273015575,0.05509238875 -Ba4As4S8Cl4_14_2133.vasp,Ba4As4S8Cl4,-2.9368121115,0.2172281155000002 -Ba3Be3_156_2097.vasp,Ba3Be3,-0.7321508883333333,0.5892182141666668 -Ba2Ag1Te2F2_38_1895.vasp,Ba2AgTe2F2,-1.8204770314285714,0.6572983715476146 -Si1Ge1_156_16335.vasp,SiGe,-3.047075515,-0.4655131775000001 -Na1C5S5N2F5_1_11836.vasp,NaC5S5N2F5,-4.016857971111111,0.3970775388078628 -Cu2Br6_191_5058.vasp,Cu2Br6,0.23530408,0.33515396875 -P4Se4_14_14122.vasp,P4Se4,-2.9508540925,0.11808140218749985 -W2N2_12_20514.vasp,W2N2,-6.64944662,-0.6808691016666666 -Al2Fe2O5_164_834.vasp,Al2Fe2O5,-5.011601735555555,-0.03376000842593041 -Sb6S12F2_4_15860.vasp,Sb6S12F2,-2.3653804195,0.44300974237499746 -Pd2Se2O6_12_14489.vasp,Pd2Se2O6,-3.150392556,0.07014601400000009 -Ni2Ir2Pd1Se5S1_1_13531.vasp,Ni2Ir2PdSe5S,-1.865825498181818,-0.1127874433623029 -Hf2Cl4_11_7478.vasp,Hf2Cl4,-3.500735765,0.17444484916666325 -Cr1Cu4Cl5O6_1_4167.vasp,CrCu4Cl5O6,-1.949609251875,0.09136981597656257 -Ta1Ti3Te8_164_17637.vasp,TaTi3Te8,-3.5490628466666667,0.11056343930555546 -Co1H6C4N14_2_3770.vasp,CoH6C4N14,-5.7608128412,-1.7486839983333393 -Hf1Mn2Mo1Br7Cl1_1_7229.vasp,HfMn2MoBr7Cl,-1.9524611033333334,0.2691375349479129 -Na1Mn1Te2_156_11897.vasp,NaMnTe2,-1.1843267375,0.4941609821982741 -V1Ag1Te6P2_5_19765.vasp,VAgTe6P2,-1.7948416919999999,0.4167183924166654 -K3H8Rh1C4Cl2O12_10_9401.vasp,K3H8RhC4Cl2O12,-4.434769954333333,0.11118097176388497 -Ca2C4S4N4_13_2971.vasp,Ca2C4S4N4,-5.404194934285714,-0.15591053818453748 -K6Nb4Cu6S16_13_9541.vasp,K6Nb4Cu6S16,-2.718618205,0.0753241909375002 -Nb2Te6Pt1_12_12929.vasp,Nb2Te6Pt,-2.752902048888889,0.12144067462962649 -Bi2Sb2Te6_157_2531.vasp,Bi2Sb2Te6,-1.489657771,0.21717203299999988 -Cr1Cu1Te1Se2Br1_1_4161.vasp,CrCuTeSe2Br,-1.3213253216666667,0.2622441708333307 -In1Au3I1Br3O4_1_8205.vasp,InAu3IBr3O4,-1.244229085,0.18554248746527402 -Pd2Cl2_164_14413.vasp,Pd2Cl2,-0.42601933,0.6425669283333333 -As6C6_2_1381.vasp,As6C6,-5.061531335,0.60222365 -Fe2Se2_129_5977.vasp,Fe2Se2,-0.6181584925,0.765234345 -P1Au3S4_156_13911.vasp,PAu3S4,-1.32736257875,0.2713335240624997 -Ag2C2S2Br2_31_220.vasp,Ag2C2S2Br2,-1.96333512625,0.67220436359375 -K1Ti1Se2_156_8947.vasp,KTiSe2,-3.1026168075,0.08705886562499998 -In1S2_115_8330.vasp,InS2,-2.032184303333333,0.5079968157291641 -Si1Cl2_187_16327.vasp,SiCl2,-1.8488723933333333,0.4824562449999973 -Cs2Hg4Te2S6Cl6_31_4747.vasp,Cs2Hg4Te2S6Cl6,-0.7506336665,0.23487360023958342 -Co2S4_12_3986.vasp,Co2S4,-2.6778761783333334,0.31288814583333346 -Nb4Ni2Te10_59_13102.vasp,Nb4Ni2Te10,-2.60217301,0.08710428874999776 -Ir2Se4_14_8847.vasp,Ir2Se4,-2.203397445,0.1496893108333337 -Re1O2_187_15016.vasp,ReO2,-5.744520186666667,0.5026236991666675 -Nb4Pt2Se14_11_13131.vasp,Nb4Pt2Se14,-3.3555158759999997,0.0889334353888862 -Nb1Sb1S2I2_8_12567.vasp,NbSbS2I2,-2.4735489466666665,0.06044533791666559 -Ru2I2O2_59_15321.vasp,Ru2I2O2,-2.6478328566666667,0.33667914166666413 -Li1Co2O4_156_9678.vasp,LiCo2O4,-4.075908048571429,0.10638303874999977 -Ni1S2_187_13416.vasp,NiS2,-1.6202098066666668,0.22340078374999783 -K2H6C2S8_1_9138.vasp,K2H6C2S8,-3.2150513766666666,0.1593167382638787 -Cu2Te2_164_5337.vasp,Cu2Te2,-0.41069377,0.15678676499999994 -Mn2N1Cl2O2_8_11150.vasp,Mn2NCl2O2,-3.3249478114285713,0.08811223817459601 -Zr2Te1S1I1_1_21697.vasp,Zr2TeSI,-3.472928486,-0.01908634166666845 -Ag2Sb4O12_12_407.vasp,Ag2Sb4O12,-3.562331866666667,0.17904462284721467 -B1Pd2_187_1632.vasp,BPd2,-2.2909495300000002,0.4087711166666663 -Th2Te4I4_12_18729.vasp,Th2Te4I4,-2.276522926,0.06624494300000006 -Hf1Cl4_123_7146.vasp,HfCl4,-2.92790502,0.23729364350000015 -Mn1Ga1Cl2O2_1_10717.vasp,MnGaCl2O2,-3.3201211550000003,-0.3000705127083405 -Cu4H24C4N8O12_14_5409.vasp,Cu4H24C4N8O12,-4.549228103269231,0.2138383712766978 -Nb2Si2Sb2_129_12892.vasp,Nb2Si2Sb2,-4.412137086666667,0.33155561166666647 -Ta2S6_59_17863.vasp,Ta2S6,-4.67678443125,0.08999961375000076 -Fe1Sb2F12_2_5749.vasp,FeSb2F12,-2.540621166,-0.16211511866666628 -Pd1C8F6_25_14356.vasp,PdC8F6,-4.632770002,0.6518666929999961 -Co1Te1S1_156_3833.vasp,CoTeS,-1.9783634966666668,0.37255529124999787 -Nb1Sn1I1Cl1O2_1_12587.vasp,NbSnIClO2,-3.7347807816666667,0.3315318338194446 -Tl1Ge1S3_143_19277.vasp,TlGeS3,-2.1001423079999997,0.5075992406874978 -Na2B2C2S2_31_11968.vasp,Na2B2C2S2,-3.5266027675,1.3740115869444387 -Ti1Ni1S5_6_18813.vasp,TiNiS5,-2.969422755714286,0.41677636517856786 -Ti4O4F4_31_19148.vasp,Ti4O4F4,-5.840314182499999,-0.014634565833338442 -Nb2Cl4_11_12683.vasp,Nb2Cl4,-3.279257466666667,0.1781677540476137 -Nb2Ni4Te2S2_51_12788.vasp,Nb2Ni4Te2S2,-2.242812609,0.1287014307878758 -Fe1O2_164_5732.vasp,FeO2,-3.341170646666667,0.4007704479166634 -Ir2O2_164_8798.vasp,Ir2O2,-3.7137089975,1.0723522450000003 -Cr3H2C2S2_187_4555.vasp,Cr3H2C2S2,-4.088610892222222,0.39543693416664993 -Bi1O2_187_2351.vasp,BiO2,-3.0825378666666663,0.6850129792708306 -K1Sn1O2_156_8939.vasp,KSnO2,-2.860004775,0.5138152520312502 -Mn6Sb10I6O18_2_11471.vasp,Mn6Sb10I6O18,-3.43695305575,0.007615374062499125 -Zr2I2Br2_6_21586.vasp,Zr2I2Br2,-1.8032833400000001,0.5382525874999999 -Ta1Nb1I1Br1_6_17569.vasp,TaNbIBr,-3.178810655,1.3671704352130578 -Mo3P2_5_11721.vasp,Mo3P2,-3.498578202,0.21184109325000033 -S4F4_2_15396.vasp,S4F4,-2.10236093125,0.15537431585937522 -Tl2Se4_12_19538.vasp,Tl2Se4,-1.1761361000000001,0.30874602874999846 -Nb2Te6Pd4_11_12928.vasp,Nb2Te6Pd4,-2.3070246933333336,0.10504964083333101 -Hg3S1O6_1_8064.vasp,Hg3SO6,-2.147154455,0.1660867443333336 -Li1Fe1Te6P2_5_9699.vasp,LiFeTe6P2,-1.922744771,0.19849385066666525 -V2Si2Te6_162_20196.vasp,V2Si2Te6,-2.417145134,0.2630386360000002 -Au1F2_187_1424.vasp,AuF2,-0.023011983333333333,0.7764267674074066 -Ni2F4_14_13503.vasp,Ni2F4,-1.0359170233333332,0.23562876499999996 -Mn2Te4As2I2_10_11317.vasp,Mn2Te4As2I2,-1.517747629,0.20127300699999628 -Sb2Ir2S6_162_15598.vasp,Sb2Ir2S6,-2.999955907,0.0328507490999943 -V1S1Cl1_25_19908.vasp,VSCl,-3.008575576666667,0.19498875166666307 -Al2O2_129_914.vasp,Al2O2,-4.7527724375,0.7541700716666622 -Cd2Cu2Se2I2_26_3496.vasp,Cd2Cu2Se2I2,0.01468838875,-0.1336077688541667 -Ni2C2Br2_59_13485.vasp,Ni2C2Br2,-1.7717183333333333,1.1412732599999968 -Sb1O1F1_156_15470.vasp,SbOF,-3.2195270199999997,0.45839586479166705 -Ti2I2_164_18958.vasp,Ti2I2,-2.92130144,0.7749082487499999 -Cd4Hg4As4Br4_51_3629.vasp,Cd4Hg4As4Br4,0.191168290625,0.17341089626077577 -V1Se1S1_156_19928.vasp,VSeS,-3.42671518,0.057064628111107796 -Ga2O2_123_6418.vasp,Ga2O2,-3.268785215,0.9770292074999998 -V2Cl2O3_5_20031.vasp,V2Cl2O3,-4.196378528571429,0.11495794321428132 -Ni2P2Se5_8_13567.vasp,Ni2P2Se5,-1.9384721377777778,0.21549206281249766 -Ba1Fe4O8_162_1831.vasp,BaFe4O8,-3.6558802084615385,0.2477464297115352 -Cr2C1Se2_164_4345.vasp,Cr2CSe2,-3.8401034039999997,0.04118296899999674 -Ca2P4H12C4O18_2_3090.vasp,Ca2P4H12C4O18,-4.83768867,0.47030950474999966 -Y2C1Cl2_164_20708.vasp,Y2CCl2,-4.929570076,0.03478493600000032 -Mn2Cl6_191_11055.vasp,Mn2Cl6,-1.301902615,0.21490139062500013 -Lu1Si2_123_10299.vasp,LuSi2,-3.1419294333333334,0.39550894777777446 -Sb2Pd3O8_164_15656.vasp,Sb2Pd3O8,-3.071330833846154,0.4879600492307654 -Ga1Ge1S3_143_6192.vasp,GaGeS3,-2.600898808,0.25714491706249676 -Hf1I1Cl1_156_7195.vasp,HfICl,-2.7336125300000003,0.4725350536111075 -Ir2S1Br2_2_8809.vasp,Ir2SBr2,-1.841935518,0.7146901393333306 -Cu2N12_31_5188.vasp,Cu2N12,-5.2041787699999995,-0.2340477792857154 -Mo2Cl8_1_11603.vasp,Mo2Cl8,-1.685448052,0.023982257000000118 -P42_5_14066.vasp,P42,-3.9934624535714285,0.052533531428571756 -Ag4H4Br4O4_14_514.vasp,Ag4H4Br4O4,-1.829981025,0.15648059151041693 -Ga1Rh1Cl2O2_25_6254.vasp,GaRhCl2O2,-3.015652991666667,-0.009821865277781061 -Co3O4_164_4065.vasp,Co3O4,-3.7530762342857145,-0.7301947633928603 -Ni2Te2S6_12_13666.vasp,Ni2Te2S6,-1.689315792,0.2547846734583316 -Nb4Te10Pd2_59_13161.vasp,Nb4Te10Pd2,-2.805759434375,0.0988912614583275 -Hf1Zr1Te2Se2_1_7405.vasp,HfZrTe2Se2,-3.4898453616666667,0.47904702833333346 -Te6As4_1_18650.vasp,Te6As4,-1.8293668239999998,0.2841085870000002 -Na6P2H32S8O16_2_12444.vasp,Na6P2H32S8O16,-3.889893780625,0.05506738901041658 -Cu3Pt1Se4Br2_1_5382.vasp,Cu3PtSe4Br2,-0.9158523190000001,0.2054838025238087 -Ga1Se2O8_150_6274.vasp,GaSe2O8,-3.493595271818182,0.11398813443181077 -Mn1Ga2S4_164_10727.vasp,MnGa2S4,-2.93760636,-0.041298042857143 -Ta1W2O8_1_17641.vasp,TaW2O8,-6.299437690909091,0.20574300604543705 -Sb2Br2_1_15552.vasp,Sb2Br2,-1.3240643825,0.16968372249999875 -Ru1Se2_187_15296.vasp,RuSe2,-2.617174926666667,0.5774255333333334 -Zn2Te6P2_147_21190.vasp,Zn2Te6P2,-1.170903914,0.3160819296666653 -Cd1Ni1H14C16N6_10_3381.vasp,CdNiH14C16N6,-5.576479665263157,-2.1278148005263255 -In4Te4Cl4O12_14_8699.vasp,In4Te4Cl4O12,-3.291115599583333,0.04363172208332999 -Na2Cl2O4_1_12053.vasp,Na2Cl2O4,-2.28113958625,0.08876413687499851 -Ca1C1_123_2814.vasp,CaC,-2.082652885,2.260110618749998 -Sc2O2_187_16114.vasp,Sc2O2,-5.5107790825,0.37992916546875 -Al2Cl2_164_791.vasp,Al2Cl2,-1.929224685,0.4017754391666646 -Ca2Ge4W2O12_13_3025.vasp,Ca2Ge4W2O12,-4.817691905,0.39671121424999534 -Zr1Nb1I2N1O1_25_21343.vasp,ZrNbI2NO,-4.727831985,0.18620167347221894 -Ag3Sn1P7_1_502.vasp,Ag3SnP7,-2.2734075636363635,0.3942228299999999 -Cr2Cu2P4Se12_13_4370.vasp,Cr2Cu2P4Se12,-2.3831384995000002,0.07766605330833337 -Mn1Cu1W1Se1S4_6_10698.vasp,MnCuWSeS4,-2.79005755125,0.2615161869999973 -Ga1Te1I7_1_6290.vasp,GaTeI7,-0.21395294666666664,0.09060098888888862 -Sn2Te6As1_157_16899.vasp,Sn2Te6As,-1.4643139877777778,-0.4247512278703732 -Cs2S6N2_1_4784.vasp,Cs2S6N2,-2.699418368,0.402006854999998 -K2H6C2Se2S6_4_9140.vasp,K2H6C2Se2S6,-3.177841951111111,0.16209324759258267 -Te4S8_14_18629.vasp,Te4S8,-1.9681814608333335,0.3010036576388868 -Rb2Ru2C2S4I8_7_14925.vasp,Rb2Ru2C2S4I8,-1.7092775338888888,0.4616235352777758 -Nb2Ni1O6_12_12772.vasp,Nb2NiO6,-5.69682766,0.13070890111111133 -Nb2Se1S1Br4_1_12866.vasp,Nb2SeSBr4,-2.84536759,0.21731067335937237 -Hg2S2_129_8000.vasp,Hg2S2,0.1560052825,0.3622186425 -Ge3As2S9_174_6902.vasp,Ge3As2S9,-2.8977543042857143,0.38904119013392524 -Ca2Cu1S2Cl2_123_2998.vasp,Ca2CuS2Cl2,-2.0430150842857144,0.14281691833332905 -Cd1Ga2O4_164_3309.vasp,CdGa2O4,-3.586963888571429,0.15589870785714277 -Zr2Ge1Se3I2Br2O1_1_21567.vasp,Zr2GeSe3I2Br2O,-2.891953819090909,0.23702146340908514 -As2N2_1_1229.vasp,As2N2,-4.69310148,0.33005510000000005 -Ti1Se2_115_18849.vasp,TiSe2,-4.038852583333333,0.43362927166666676 -Hg1H10C4S2_5_7857.vasp,HgH10C4S2,-4.148596036470588,0.058977690551466136 -Sb1Se1Cl1_156_15498.vasp,SbSeCl,-1.78744145,0.33502563750000003 -V4Se4I1Br1O1_8_20367.vasp,V4Se4IBrO,-3.1475036781818186,0.05983532190475341 -Ta2O5_6_17816.vasp,Ta2O5,-7.064537692857143,0.18104670285714342 -Li1Ni1Te6P2_5_9770.vasp,LiNiTe6P2,-1.735614185,-0.007713161833333149 -As2W2S6_12_1310.vasp,As2W2S6,-3.635629807,0.2518893703749976 -Co1Ni1S2Cl2_6_3788.vasp,CoNiS2Cl2,-1.61424899,0.04491930692708149 -Zr1Br1N1Cl1_156_21266.vasp,ZrBrNCl,-3.865644305,0.43640823270832996 -Ru2O2_187_15330.vasp,Ru2O2,-4.0312157825,0.7410559574999998 -Ta2Sn2As2_129_17887.vasp,Ta2Sn2As2,-3.6246178866666665,-0.579560506666669 -Co1Se2_187_3824.vasp,CoSe2,-1.9993861766666667,0.48233431888888867 -C2Se2_59_2757.vasp,C2Se2,-3.402472115,1.8096848666666665 -Tl2Se2Br2_59_19526.vasp,Tl2Se2Br2,-0.7970621449999999,0.35674220611111024 -Co2Sb4Br4O6_11_4010.vasp,Co2Sb4Br4O6,-2.98697778875,0.0760795757291648 -Li1H3C3N3Cl1O3_156_9720.vasp,LiH3C3N3ClO3,-5.4188000928571425,0.17974977928571256 -K2Hg4Br6O8_31_9172.vasp,K2Hg4Br6O8,-1.0226523345,0.22949019012500016 -I8O16_14_8168.vasp,I8O16,-2.2874024470833336,0.07101937237499945 -Ag2N2O2F2_31_331.vasp,Ag2N2O2F2,-2.64809277625,0.08275803062500015 -Nb1H2O2_12_12515.vasp,NbH2O2,-5.097651214,1.0239588037500016 -V1Se1I1N1_1_19926.vasp,VSeIN,-3.1790953025,0.3858731505555537 -Sn12O24_1_16594.vasp,Sn12O24,-3.949708313888889,0.41151098111111084 -Tl2Cu2Se2_129_19404.vasp,Tl2Cu2Se2,-0.749946,0.2817319070370361 -Sc1As2_21_15900.vasp,ScAs2,-3.0727093933333336,-0.9085324733333355 -Zr3B2H2Se2_187_21737.vasp,Zr3B2H2Se2,-4.330264328888889,0.46809157222221787 -Mn2Co1O6_12_11060.vasp,Mn2CoO6,-4.136922106666667,-0.12799347708333736 -U2I2N2_129_19714.vasp,U2I2N2,-6.239108155,0.049971541666667285 -Fe4Pb4O12_13_6086.vasp,Fe4Pb4O12,-3.48790271,0.1300482842499966 -Al2I6_26_883.vasp,Al2I6,-0.819249655,0.16255661124999998 -V1O1F1_25_19889.vasp,VOF,-4.520289073333333,-0.009152212222226286 -C4N8_26_2764.vasp,C4N8,-6.6919373025,-0.1425566294444507 -Li2S4Br2_113_10056.vasp,Li2S4Br2,-1.71175307,0.7684581696874999 -Ti2I2_129_18956.vasp,Ti2I2,-3.171718505,0.5244911837500001 -Cu2O5_21_5205.vasp,Cu2O5,-1.5401995442857144,1.311606938749998 -Tl2O2_129_19470.vasp,Tl2O2,-2.119794,0.2881311897916641 -Ta3Se1F7_156_17990.vasp,Ta3SeF7,-4.577088534545454,0.15908777881817215 -C2Se2_8_2758.vasp,C2Se2,-3.447955995,1.7642009866666666 -Re1Mo1Ru2O8_1_15011.vasp,ReMoRu2O8,-5.036340789166666,-0.08826379822917002 -Ge1W2S1Cl4_25_6724.vasp,GeW2SCl4,-2.35717854875,0.8317903334375 -Bi2Br6_189_2435.vasp,Bi2Br6,-0.84516534375,0.1461683225 -Fe2Ag1S4_187_5770.vasp,Fe2AgS4,-1.8777684628571427,-0.3215709449999995 -Hf1Bi1As1_156_7115.vasp,HfBiAs,-3.4625992,0.35091492333332996 -Ti6H4O14_1_19175.vasp,Ti6H4O14,-6.407486409583334,0.11695728715277731 -Cr2Bi4_2_4328.vasp,Cr2Bi4,-1.5030802133333332,0.5418260066666651 -Tl2Mo2Pb1O8_164_19453.vasp,Tl2Mo2PbO8,-4.197886196923077,0.14529012423076448 -Hf4N1Cl4O3_1_7793.vasp,Hf4NCl4O3,-5.679919568333333,0.1821561759374939 -Gd2Se2I2_59_6626.vasp,Gd2Se2I2,-2.8784167666666662,0.046294896666667196 -Os1I2_115_13803.vasp,OsI2,-0.7842846166666666,0.9243507079166653 -Li1Ag1S1F1_8_9635.vasp,LiAgSF,-1.6632889025,0.4185683774218749 -Li1Ta1S2_1_9795.vasp,LiTaS2,-4.280915945,0.6680412899999997 -Nb2Ir1Se1I3Br1_1_12756.vasp,Nb2IrSeI3Br,-2.32137894625,0.5368792138541618 -Bi2O3_1_2485.vasp,Bi2O3,-3.538651144,0.3193430839999998 -Zr1Nb1Te1I1O1_8_21361.vasp,ZrNbTeIO,-3.892598274,0.5808934413333311 -Sr2Bi4_12_17148.vasp,Sr2Bi4,-0.8611567816666666,0.44689282333333347 -Pd2I4_11_14434.vasp,Pd2I4,-0.156892115,0.13431685249999997 -Sc2Cl2_12_16063.vasp,Sc2Cl2,-2.714726305,0.12889839333333075 -Cr3N2O2_187_4565.vasp,Cr3N2O2,-5.23918864,0.07831971095236989 -Cr1Br1F1_156_4129.vasp,CrBrF,-2.3557322966666665,0.025479834444442462 -Mn2Te4P2I2_10_11327.vasp,Mn2Te4P2I2,-1.646214582,-0.37348561075 -Li2H6N10O2_51_9947.vasp,Li2H6N10O2,-5.008456979,-1.4079623887500015 -Cs2Hg4Te2O6F6_31_4745.vasp,Cs2Hg4Te2O6F6,-1.577736498,0.36379207317918494 -Cu2Mo1Se4_111_5187.vasp,Cu2MoSe4,-1.688546162857143,0.13701503904761725 -Cr2As2S6_157_4309.vasp,Cr2As2S6,-2.956870749,0.32525716237499713 -Na1Ni1As2O6_149_11910.vasp,NaNiAs2O6,-3.389763378,0.41654799462499553 -Sr2Th2Br12_51_17328.vasp,Sr2Th2Br12,-2.360205175,-0.00910645062500004 -Fe3I1Br1O3_1_6057.vasp,Fe3IBrO3,-2.5228139125,0.024647304999996233 -Sb1Te2_164_15518.vasp,SbTe2,-1.53925522,0.2612971344444428 -Ba2Bi1_164_1916.vasp,Ba2Bi,-0.71081067,0.46358242888888795 -Mg1Re2O8_147_10394.vasp,MgRe2O8,-5.613526868181818,0.07004792090909095 -Ti4P4Se12_2_19154.vasp,Ti4P4Se12,-3.6735994224999997,0.23746388837499754 -Sb2Pd2O6_162_15650.vasp,Sb2Pd2O6,-3.3258270439999995,0.3809986992500005 -Cu1Ge1Te1Se1_1_4886.vasp,CuGeTeSe,-1.4980347025,0.22292433812499823 -Sr2Bi2S4F2_129_17145.vasp,Sr2Bi2S4F2,-2.992191664,0.06410065800000009 -Cd2Se1I1Cl1O1_1_3567.vasp,Cd2SeIClO,-0.601334865,0.08275709194444222 -Al1O2_25_700.vasp,AlO2,-4.89983107,0.7626419277083283 -Sr2Mo4Se4O22_13_17279.vasp,Sr2Mo4Se4O22,-4.5679020034375,0.04586863249999951 -Tl1Fe5Br2_123_19266.vasp,TlFe5Br2,-0.11274673125,1.4179408815624999 -Ir2F6_12_8785.vasp,Ir2F6,-2.22359119375,0.12392658750000018 -Al2Br2_129_775.vasp,Al2Br2,-1.1381351575,0.7769305608333317 -Ag1Sn1F6_2_131.vasp,AgSnF6,-1.809310355,0.04800656499999989 -Hf1Te1Se4_10_7322.vasp,HfTeSe4,-3.114241113333333,0.12273288333332766 -Te2As4O12_18_18361.vasp,Te2As4O12,-3.941382450555556,0.2611920252777685 -Hf1Zr1Mo1S3Br5Cl1_1_7383.vasp,HfZrMoS3Br5Cl,-2.9136621066666666,0.23285859536457548 -Ta1Cl4_123_17527.vasp,TaCl4,-2.672851954,0.28264152600000036 -Te2Os2_129_18427.vasp,Te2Os2,-2.9283248825,0.19519234624999982 -Sn4Sb2S4I6_59_16963.vasp,Sn4Sb2S4I6,-1.425008893125,0.16172591078124943 -Mn4H8C8N12Cl4_14_11439.vasp,Mn4H8C8N12Cl4,-5.2009595825,0.1694820147453603 -V4S12_11_20358.vasp,V4S12,-3.422766975625,0.09107676906249651 -Li2H4N2_67_9941.vasp,Li2H4N2,-4.2589637475,0.04632470687499968 -Rh2F8_1_15191.vasp,Rh2F8,-1.733380195,0.07166000299999986 -Pd1S1Cl1F1_25_14381.vasp,PdSClF,-1.0855775375,0.5916366480208333 -K2Mn1P2S7F3_1_9237.vasp,K2MnP2S7F3,-2.773372039333333,0.18070973097916382 -B2N2_129_1685.vasp,B2N2,-6.6659661975,1.136909545 -Bi2Cl10_51_2441.vasp,Bi2Cl10,-0.8953555091666666,0.11593185833333251 -Ca3Cu2I2O4_123_3168.vasp,Ca3Cu2I2O4,-2.7859424363636367,-0.12134909435737182 -Li2Pb1S6F6_147_10040.vasp,Li2PbS6F6,-2.0211172913333333,0.6592302477291615 -Al2Te2_2_1013.vasp,Al2Te2,-2.143217185,0.16253500249999986 -Mn2Sn1O4_25_11291.vasp,Mn2SnO4,-4.03871406,0.2079956458128056 -Cd2Sb2S4Br2_10_3557.vasp,Cd2Sb2S4Br2,-1.376233695,-0.31443080149999986 -Cu2I4O12_4_5177.vasp,Cu2I4O12,-2.3297183416666667,0.2063234501388866 -In18Te9_143_8174.vasp,In18Te9,-1.0360630433333333,0.7308073433333317 -Na2Hg4Te2S6F6_31_12176.vasp,Na2Hg4Te2S6F6,-1.194357957,0.31494763736458337 -Mg2H8N4O16_14_10467.vasp,Mg2H8N4O16,-4.4944676296666675,0.05469624899999914 -Rb2U3I4O20_2_14955.vasp,Rb2U3I4O20,-4.652834092758621,0.10948652034482809 -Ag2Te2_59_465.vasp,Ag2Te2,-0.20996687,0.14766557291666665 -Pt1Br2_115_14565.vasp,PtBr2,-0.20318062,0.5791115474999999 -As2Se1I3_1_1295.vasp,As2SeI3,-1.1686719916666666,0.20310408388888687 -K2Bi2P4Se12_4_9004.vasp,K2Bi2P4Se12,-2.266115049,0.14755610099999972 -Ti3Pd1O7F1_1_19098.vasp,Ti3PdO7F,-5.7608827458333325,0.316185415416664 -Zn1Sn2N2_1_21015.vasp,ZnSn2N2,-2.673217884,-0.41242972349999985 -Fe2S2Cl2_59_5932.vasp,Fe2S2Cl2,-1.8133094383333335,-0.233827277708335 -Zr1Zn1Br4_6_21490.vasp,ZrZnBr4,-1.3297556,0.1254975358333345 -Nb2Te10Pt2_51_12899.vasp,Nb2Te10Pt2,-2.370249853571429,0.07777088928571407 -Te4P2Au2_26_18605.vasp,Te4P2Au2,-1.20610174,0.27257091607638684 -Al1Sb2Au1O6_149_728.vasp,AlSb2AuO6,-3.9088243499999997,0.6394444371249957 -K2Cd4Te2O6F6_31_9069.vasp,K2Cd4Te2O6F6,-1.8602562665,0.46348585662499997 -Mo4S2N3_156_11759.vasp,Mo4S2N3,-4.76573067888889,0.3055074138888836 -Nb2Ni2Se10_51_12781.vasp,Nb2Ni2Se10,-2.6489382892857143,0.10003109228571083 -Dy2As2O8_51_5514.vasp,Dy2As2O8,-5.1544956775,0.3723368924999999 -As3H5O10_2_1314.vasp,As3H5O10,-4.2940352016666665,0.09751711111111128 -K2Cd4Te2S6I6_31_9073.vasp,K2Cd4Te2S6I6,-0.6395130145000001,0.03905035845833127 -Cs2S2N2Cl6O6_4_4777.vasp,Cs2S2N2Cl6O6,-2.773371605,0.1323351419444426 -Mn1Ag1Se2Br2_1_10619.vasp,MnAgSe2Br2,-1.00755911,0.23951969159722075 -Li2Ni1_187_10022.vasp,Li2Ni,-0.47074271666666667,0.45180989555555473 -Ta3Pt3S14_6_17979.vasp,Ta3Pt3S14,-3.8406732875000005,0.09807120443748962 -Te2Pt1_164_18479.vasp,Te2Pt,-1.6856351566666667,0.1595522916666665 -Mn2As4_187_10987.vasp,Mn2As4,-2.75163451,1.066331378333333 -Cu2Cl2_51_5082.vasp,Cu2Cl2,-0.1979369625,0.43820659125000005 -Zr2Te2Cl2_59_21702.vasp,Zr2Te2Cl2,-3.0738353650000003,0.11181495055555213 -Rh2O2_123_15203.vasp,Rh2O2,-2.6514026025,1.2170635312499996 -Pt1F2_164_14572.vasp,PtF2,-0.9593034,0.8582975324999973 -W3N2_187_20564.vasp,W3N2,-5.9557422639999995,0.22262118466666037 -Li2V2F12_4_10120.vasp,Li2V2F12,-3.305968000625,0.0019185393750000834 -Bi1S8F1_1_2376.vasp,BiS8F,-2.302108526,0.17202193181249825 -Nb2Te1Se1I2O1_1_12902.vasp,Nb2TeSeI2O,-3.4503863185714287,0.22892389755952047 -Tl3Fe2_123_19575.vasp,Tl3Fe2,1.177997472,1.922554424 -In1Te2_115_8366.vasp,InTe2,-1.1209977666666666,0.26974255166666394 -Na2H6C2N8O2_51_12113.vasp,Na2H6C2N8O2,-5.2200488435,-2.0138859330416725 -Sb2Te2H2O10_4_15714.vasp,Sb2Te2H2O10,-4.00953839875,0.1145585335677044 -Cr2O6_7_4445.vasp,Cr2O6,-4.63875477375,-0.18596693390624974 -Mo2F4_14_11606.vasp,Mo2F4,-2.803430393333333,0.29096052499999736 -Na2Ge1S6F6_147_12088.vasp,Na2GeS6F6,-2.1821989860000004,0.7119911488611113 -Ta1V1F6_123_17639.vasp,TaVF6,-3.90709163875,0.08700145034090545 -P1O2_191_13928.vasp,PO2,-4.22412705,1.1694331223333303 -Sb3Se2S2I2Br1_1_15758.vasp,Sb3Se2S2I2Br,-1.6210003960000001,-0.017107207062499852 -Rh2I1Br1O3_1_15192.vasp,Rh2IBrO3,-2.237113652857143,0.6522532985863054 -Mg1O2F2_5_10390.vasp,MgO2F2,-2.42698863,0.7882522915000001 -Rb2C4S6F6_2_14799.vasp,Rb2C4S6F6,-3.337141967777778,0.12452999812499099 -Te6P2Pd2_162_18668.vasp,Te6P2Pd2,-1.7067273239999998,0.41526904916666546 -Cr1Te2_164_4277.vasp,CrTe2,-1.86549271,0.07755342888888905 -Hf2Sn2Te8_31_7623.vasp,Hf2Sn2Te8,-2.478953145833333,-0.37630617555555723 -Ga3S1I2_1_6533.vasp,Ga3SI2,-1.4976975033333335,0.08280779611110933 -V2C2F2_59_20024.vasp,V2C2F2,-4.68841624,0.38682295901234154 -Re2Ni1O8_147_15060.vasp,Re2NiO8,-5.033641646363637,-0.0285248615909115 -Mn2C1S2F2_164_11040.vasp,Mn2CS2F2,-3.021442697142857,0.7823991346428472 -Cu2F2_129_5089.vasp,Cu2F2,-0.558903925,0.8109983949999999 -Pd2F4_2_14423.vasp,Pd2F4,-1.13919348,0.2980557383333331 -Cd2Se4_12_3575.vasp,Cd2Se4,-0.539055695,-0.02537123388888929 -Cu1Bi1Te6As2_143_4856.vasp,CuBiTe6As2,-1.372169863,0.2684917208333317 -Al2Si4O12_12_992.vasp,Al2Si4O12,-6.117881341666666,0.02878205034721759 -Pb2S6_4_14284.vasp,Pb2S6,-2.32403245375,-0.6785233315625001 -Nb2Ni1Ir1S8_1_12771.vasp,Nb2NiIrS8,-3.693224765,-0.25790165708333734 -Cu2H8C6Br2N6_2_5144.vasp,Cu2H8C6Br2N6,-4.8172018266666665,0.23320105687499534 -Sn1P2Se4_164_16666.vasp,SnP2Se4,-2.503601762857143,0.16282017848214014 -Mo3O8_8_11719.vasp,Mo3O8,-4.9640647990909095,0.24550778984847987 -Os2S2_187_13870.vasp,Os2S2,-3.8036304825,0.8920696243749999 -In1Si1Se1Cl1_8_8348.vasp,InSiSeCl,-1.8087186375,0.3910059143750001 -Zr4C3F2_164_21812.vasp,Zr4C3F2,-6.188427494444444,-0.01513695416668459 -Cs2Br2O6_11_4665.vasp,Cs2Br2O6,-2.280413625,0.15728763275000057 -Ta2C1Se2_164_17680.vasp,Ta2CSe2,-6.226126164,0.027806570000000086 -Si2F2_164_16401.vasp,Si2F2,-3.695613865,-0.16790062312499976 -Cd1Se1_156_3424.vasp,CdSe,0.0745209,-0.308946685 -Ti1Ga1Te1Br1_8_18781.vasp,TiGaTeBr,-2.58222352,0.08907465323717689 -Cd1S2_115_3418.vasp,CdS2,-0.64477467,0.7221294039583321 -Fe1H4C2N4Cl2_47_5694.vasp,FeH4C2N4Cl2,-4.585690936923077,0.10398001749999108 -Hf1V2I2O4_1_7362.vasp,HfV2I2O4,-4.7704277033333335,0.23375793314814342 -V1Cr1Se1S1N1_25_19809.vasp,VCrSeSN,-4.249764588,0.15848264700000048 -Ta2Pd2Se10_51_17828.vasp,Ta2Pd2Se10,-3.028550437142857,-0.1018310916071456 -Nb3H2C2O2_187_12973.vasp,Nb3H2C2O2,-6.266011612222222,0.29255574795634454 -Li2Sn1H6S6_147_10069.vasp,Li2SnH6S6,-3.0510291940000003,0.08618274149999983 -Ir3Se3S1Br2_1_8858.vasp,Ir3Se3SBr2,-2.1925010499999997,0.11487775421295932 -P16I4_10_13908.vasp,P16I4,-3.134034642,0.040630671000000174 -Pd4Pb12_10_14521.vasp,Pd4Pb12,-0.930912735625,0.35011254812499915 -Nb2Pd2S10_51_12814.vasp,Nb2Pd2S10,-3.385966645714286,-0.03286802906250341 -Sc1Se2_164_15998.vasp,ScSe2,-3.241771333333333,0.4337559972222198 -Nb4O8_2_13119.vasp,Nb4O8,-6.6805737775,0.3049364287500005 -Te2Ru2_25_18521.vasp,Te2Ru2,-2.1528305925,0.8624019312500002 -Cr3S2Br3Cl1O1_1_4577.vasp,Cr3S2Br3ClO,-2.5192833319999997,-0.031022522833338187 -Cr3O8_12_4571.vasp,Cr3O8,-4.746068397272727,-0.1936783716477315 -Au2Br2N2_59_1449.vasp,Au2Br2N2,-1.0150857133333333,0.6301712166666653 -Cu3As1S4_156_5371.vasp,Cu3AsS4,-1.354747705,0.5023838924999999 -Cr2Sn2S6_162_4511.vasp,Cr2Sn2S6,-2.684172574,0.3795274384999964 -Sc2Se1S1Cl2_25_16152.vasp,Sc2SeSCl2,-3.5939805066666666,0.056408821111107565 -S5N6_5_15400.vasp,S5N6,-4.269526738181818,-0.061169671647729906 -Mg2H8C10N4O10_4_10465.vasp,Mg2H8C10N4O10,-5.761528899411765,0.2002593740168798 -Fe2Sb2Te4Cl2_26_5963.vasp,Fe2Sb2Te4Cl2,-1.446132593,0.20452225659999834 -Zr2I6_2_21598.vasp,Zr2I6,-1.6255246775,0.12454647249999984 -Au2Cl2_51_1470.vasp,Au2Cl2,0.38875578,0.23998903624999998 -Sn1Ge1P2S6_1_16634.vasp,SnGeP2S6,-3.09823496,0.08098853124218425 -Tl2P2O6_1_19478.vasp,Tl2P2O6,-4.272204606,0.4111563332500001 -Hf1V1Te2N1_156_7359.vasp,HfVTe2N,-4.520710729999999,0.20787636600000114 -Hg2Pd4S6_164_7986.vasp,Hg2Pd4S6,-1.244296625,0.23119538833333197 -Ba2H8O6_11_1995.vasp,Ba2H8O6,-4.2952278425,0.11860068749999986 -Ta1Nb1Zn1I1N2Cl1O1F1_8_17579.vasp,TaNbZnIN2ClOF,-4.512122986666666,0.26781103640507 -Ta3Te1F7_156_17997.vasp,Ta3TeF7,-4.456694573636363,0.1549207789090823 -Os2I8_14_13855.vasp,Os2I8,-0.630711247,0.24196156049999984 -Cu2Hg2Te2Cl2_26_5163.vasp,Cu2Hg2Te2Cl2,0.12237763625,0.17479726624999864 -Ag2Te2Cl2_59_455.vasp,Ag2Te2Cl2,-0.34296620833333336,0.20494001624999952 -Ca3Au2S4Cl2_123_3153.vasp,Ca3Au2S4Cl2,-1.8907780009090909,0.15599418409090526 -Mn2As2I2O4_10_10967.vasp,Mn2As2I2O4,-3.097698762,0.1175482022631506 -Os1Se2_187_13826.vasp,OsSe2,-2.98185245,0.5627688100000001 -Cu3Mo3O12_1_5376.vasp,Cu3Mo3O12,-3.9981879016666664,0.08637953972222245 -Cs4Ag4O4_123_4803.vasp,Cs4Ag4O4,-0.8931105083333333,0.34460525250000007 -V2W2S10_85_20229.vasp,V2W2S10,-3.463268755,0.461469949107139 -Ac1Se3_191_1.vasp,AcSe3,-2.3403958025,0.8970584658333336 -Bi8Te4O20_39_2699.vasp,Bi8Te4O20,-3.77979748625,0.057868396875000006 -V1S2_47_19916.vasp,VS2,-3.2229385133333337,0.5320203199999995 -Mn2Bi2Te4I2_26_11025.vasp,Mn2Bi2Te4I2,-1.122544822,0.31132267827586213 -Sr2Cu2Bi2O8_123_17212.vasp,Sr2Cu2Bi2O8,-3.3004303399999997,0.2821883878571403 -Mg2P1_164_10493.vasp,Mg2P,-1.4405690333333334,0.5003119642361105 -Mn2Bi2I2O4_26_11003.vasp,Mn2Bi2I2O4,-2.8134350049999997,0.26560527622844676 -B2Cl6_12_1662.vasp,B2Cl6,-2.42793668125,0.11524372375000036 -Sn2Br1Cl1O2_8_16739.vasp,Sn2BrClO2,-2.7278300766666668,0.15835442208333328 -Al1Tl1Hg1Se4_156_757.vasp,AlTlHgSe4,-1.3796679685714286,0.08466880976190266 -Y1Au1I1Br1_6_20604.vasp,YAuIBr,-1.7349027525,0.2858217749999983 -Nb2C1S2F2_164_12663.vasp,Nb2CS2F2,-4.551082204285715,0.7893154466666554 -Hg1S1Br1F1_156_7904.vasp,HgSBrF,-0.40073012,0.2998934448611074 -Li1Al1Sb2Te6_5_9648.vasp,LiAlSb2Te6,-1.674969891,0.30968454766666514 -Au3Se1S1Br2_1_1564.vasp,Au3SeSBr2,-0.22934174,0.17249077874999935 -Fe3Ge1Te2_187_6052.vasp,Fe3GeTe2,-1.3061816316666668,0.14578625333333184 -Re6Br18_164_15120.vasp,Re6Br18,-2.191749005,0.06112600458333306 -Bi4Cl16_13_2609.vasp,Bi4Cl16,-1.012448029,0.16044177549999983 -Co2S2_129_3980.vasp,Co2S2,-2.482900365,0.2575849385416644 -Sn2As2C2O6F6_7_16714.vasp,Sn2As2C2O6F6,-3.7827051149999997,0.438151916666652 -Ag2I2_129_315.vasp,Ag2I2,0.42087067,0.07339736499999999 -Te2Rh2F2_59_18500.vasp,Te2Rh2F2,-1.9417328783333332,0.2851608982638869 -Ga2Ge2Te2_164_6367.vasp,Ga2Ge2Te2,-2.2914809016666666,-0.27835554944444607 -Ir1Au1Br2O2_6_8724.vasp,IrAuBr2O2,-1.7689773233333332,0.46207884437500035 -Sb8Se20_2_15878.vasp,Sb8Se20,-2.060589762142857,0.2849925602380934 -Rb2H6C2S8_1_14851.vasp,Rb2H6C2S8,-3.20884173,0.18016281989582067 -Rb2Mn2P2_129_14900.vasp,Rb2Mn2P2,-2.0111057233333334,-0.0484419116666685 -Al1Cu1As2Se6_149_638.vasp,AlCuAs2Se6,-2.151995798,-0.097603168166669 -Si1Se1_156_16365.vasp,SiSe,-2.972235365,0.11937073515625019 -Zr1Ti1Br1Cl1O2_1_21467.vasp,ZrTiBrClO2,-4.981925641666667,0.34880447307869744 -Pr1Si5_47_14537.vasp,PrSi5,-3.5857691683333335,0.022761904166666458 -Zn2P2H6C4O8_31_21129.vasp,Zn2P2H6C4O8,-4.33436336909091,0.6443838255492365 -K2Nb2Cl12_1_9260.vasp,K2Nb2Cl12,-2.18683645125,0.06978687937499983 -Fe2O2_123_5893.vasp,Fe2O2,-2.5500131075,0.9957122310416646 -V3O8_5_20286.vasp,V3O8,-5.25843802,0.10462170823863204 -B6Au1C6S2F4_6_1771.vasp,B6AuC6S2F4,-4.595370803684211,0.9897283084795166 -Ta4Pt6Se10_59_18095.vasp,Ta4Pt6Se10,-3.4502616765,-0.08839544029166935 -Mn2W2Se2S12_8_11347.vasp,Mn2W2Se2S12,-3.019418966111111,0.42992415995370065 -Ni3As6_157_13695.vasp,Ni3As6,-1.8539470244444445,0.28101856138888914 -Mg2Fe8O18_2_10455.vasp,Mg2Fe8O18,-3.4974077207142855,0.2681143824999936 -W2S2F2_59_20528.vasp,W2S2F2,-4.071444081666667,0.2768339370833297 -Bi2Se2I1Br3_1_2541.vasp,Bi2Se2IBr3,-0.99386156125,0.3114347416666666 -Sn2Sb2H6S6N2_7_16860.vasp,Sn2Sb2H6S6N2,-3.334395931111111,0.13805539184026724 -Na2H2O2_4_12100.vasp,Na2H2O2,-3.6385187450000003,0.04918208999999951 -Si6Bi6_12_16528.vasp,Si6Bi6,-2.4774943741666666,-0.7489858516666665 -Sn3As2O9_174_16907.vasp,Sn3As2O9,-4.073565397857143,0.33194613892856717 -Y2S1I2O1_6_20769.vasp,Y2SI2O,-4.340158535,0.25213240166666684 -Li4Cu4F14_2_10182.vasp,Li4Cu4F14,-2.057702226818182,-0.02775673954545732 -Hf3B2Cl2_187_7676.vasp,Hf3B2Cl2,-5.374599904285715,-0.15536131714286228 -Sm1Si2_123_16558.vasp,SmSi2,-3.21032615,0.8877903416666628 -In8S6_31_8717.vasp,In8S6,-1.9358052371428571,0.3797110642857122 -Re2I8_14_15057.vasp,Re2I8,-1.045123901,0.2197832810416671 -U2Se4O14_1_19725.vasp,U2Se4O14,-5.1708436485,0.0652647549999994 -Rh2Br2O2_59_15173.vasp,Rh2Br2O2,-2.4942354983333335,0.21470758638888654 -K2Ni2Bi2_129_9268.vasp,K2Ni2Bi2,0.170822995,0.933765328541666 -Mn5Se2Br2Cl5O2_1_11462.vasp,Mn5Se2Br2Cl5O2,-2.22172373625,0.006706974709818514 -In2H10N4Cl4_10_8457.vasp,In2H10N4Cl4,-3.6486518859999997,0.10698382131249415 -Bi1H1S8_1_2334.vasp,BiHS8,-2.442995689,-0.02412884224999967 -Au1Br2_187_1413.vasp,AuBr2,0.5260444466666666,0.3438147587500001 -In1Sn1I1Br1O2_1_8358.vasp,InSnIBrO2,-2.457264336666667,0.16092023569443992 -As2F6_12_1210.vasp,As2F6,-2.51432824625,0.3259587531250001 -Al2V1Se4_164_1032.vasp,Al2VSe4,-2.9547488257142858,0.1390266989285685 -Dy2Bi2S4O2_129_5516.vasp,Dy2Bi2S4O2,-4.167848287,-0.495932032958338 -Hg2H4Se2O8_31_7967.vasp,Hg2H4Se2O8,-3.144214025625,0.04689663885416673 -Li2Ti1F6_12_10087.vasp,Li2TiF6,-3.894722546666667,0.29387066388888927 -Sc1Cu1As2S6_149_15922.vasp,ScCuAs2S6,-2.8497607670000002,0.4330650642916615 -Pd1O2F2_164_14373.vasp,PdO2F2,-1.48984049,0.7171609353333307 -Pt1O1F1_25_14582.vasp,PtOF,-2.2333196766666665,0.18873853416666497 -Ti2V2S4I4_2_19054.vasp,Ti2V2S4I4,-3.247654839166667,-0.3654472897916732 -Ge2Te1_156_6880.vasp,Ge2Te,-2.0826769,-0.38285747500000156 -Li1I1_123_9724.vasp,LiI,-1.593234885,0.24300202250000003 -Cu4P4O14_13_5438.vasp,Cu4P4O14,-4.269918145909091,0.08938489484848144 -Cd2Cl2_1_3485.vasp,Cd2Cl2,0.8040173975,0.40411360875000013 -Ta2Br2_164_17668.vasp,Ta2Br2,-4.0709017125,0.7082861473214215 -Al2S2Cl2_31_935.vasp,Al2S2Cl2,-3.03036423,0.019806205000000077 -Al2Zn1S4_164_1035.vasp,Al2ZnS4,-2.891680175714286,0.018178419285713954 -V2S1I1_156_20151.vasp,V2SI,-2.560787225,0.3701892257886865 -Ta4Pd4Se8_53_18089.vasp,Ta4Pd4Se8,-3.52443511625,0.052536113749993785 -Nb2Fe2S10_51_12716.vasp,Nb2Fe2S10,-3.368143137857143,-0.039797600803577304 -K4Cl4O8_11_9433.vasp,K4Cl4O8,-1.898555078125,0.49316463187500004 -Co2S2F2_59_3978.vasp,Co2S2F2,-2.556811315,0.09593312833333334 -Si2Se2Br2_59_16446.vasp,Si2Se2Br2,-2.266438216666667,0.19841591593749802 -Hf1As2_187_7109.vasp,HfAs2,-4.17815,-0.5406165783333328 -Tl2S3_164_19509.vasp,Tl2S3,-1.5506317539999999,0.24960415074999776 -Ga2Se5_1_6487.vasp,Ga2Se5,-2.2043954785714286,0.21002401095237877 -Nb1I2_164_12522.vasp,NbI2,-1.9483009933333333,0.4140021416666635 -Si1Cl2_115_16328.vasp,SiCl2,-1.7679482866666667,0.5633803516666639 -Al2Si2S2_164_984.vasp,Al2Si2S2,-3.7304761966666664,-0.38704321736111413 -K2Mg1Te2H4O8_2_9226.vasp,K2MgTe2H4O8,-3.7595871111764705,0.09055126475489828 -Te1As1O6_38_18282.vasp,TeAsO6,-3.636341165,0.3411945046093747 -Tl18Se9_143_19194.vasp,Tl18Se9,-0.9055428322222222,0.1767428122222222 -Te2Pb2Cl2_59_18451.vasp,Te2Pb2Cl2,-1.237564225,0.15297086111110958 -Os2Se2_187_13885.vasp,Os2Se2,-3.15315948,0.9774184425000003 -In1Bi1_187_8209.vasp,InBi,-0.41163821,0.1438640525 -Cr2Mo2Se8_25_4421.vasp,Cr2Mo2Se8,-2.852530065,0.05341935416666699 -As2Cl8_1_1207.vasp,As2Cl8,-0.977398222,0.3375812024999999 -Nb2Cl10_2_12673.vasp,Nb2Cl10,-2.3783217366666665,0.09514331000000009 -Sn2B2Sb2H6O6_7_16737.vasp,Sn2B2Sb2H6O6,-3.9094790655555554,0.5748326411805488 -Al2Se2Cl2_59_962.vasp,Al2Se2Cl2,-2.601547463333333,0.09042709166666674 -Nb4Ni8Te8_51_13111.vasp,Nb4Ni8Te8,-1.795384088,0.0721939321249978 -Mo1Cl2_12_11505.vasp,MoCl2,-1.8938467433333335,0.4039894644444444 -Te8As2Pt3_164_18688.vasp,Te8As2Pt3,-1.5358853746153847,0.5888545445512774 -V2H2O5_12_20077.vasp,V2H2O5,-5.110329708888889,0.11036674509258804 -Mn1I2_164_10770.vasp,MnI2,-0.6702061333333332,0.05766568500000013 -V1W2S4_8_19961.vasp,VW2S4,-4.3669724542857145,-0.10930675880952789 -W2Se2Cl2_59_20543.vasp,W2Se2Cl2,-3.1217696,0.09405811999999647 -V1Te2_191_19943.vasp,VTe2,-1.34493074,1.0223103177777777 -Sr2Au1Se2Br2_38_17132.vasp,Sr2AuSe2Br2,-1.507252152857143,0.19952142785713967 -Rh1I2_164_15156.vasp,RhI2,-0.57794122,0.31264751999999907 -Cr1F2_115_4168.vasp,CrF2,-2.9640548666666664,0.3215922466666641 -Ta2C1O2_164_17677.vasp,Ta2CO2,-7.717176544,0.027963263999994048 -Ti2Se6_59_19028.vasp,Ti2Se6,-3.7795781775,0.06877842041666349 -Sr1Sb2F12_2_17080.vasp,SrSb2F12,-2.7900037686666668,-0.012233457333333586 -W1F2_12_20432.vasp,WF2,-3.2197805966666664,1.0041767908333297 -Sb1_191_15528.vasp,Sb,-1.3921314,0.8914356724999999 -Zn2Cl2_164_21058.vasp,Zn2Cl2,0.3504418075,0.20137837359375 -Zr3H2N2_187_21767.vasp,Zr3H2N2,-5.7866697714285715,-0.04503639714286223 -Co4Te2Cl4O6_2_4090.vasp,Co4Te2Cl4O6,-2.7185654425,-0.0706920997656253 -Ag2Br4O12_4_206.vasp,Ag2Br4O12,-1.8779576288888888,0.33809408638888727 -Ni3O2F4_8_13705.vasp,Ni3O2F4,-1.7556212077777777,-0.12916162819444593 -Ag2P2O4_26_347.vasp,Ag2P2O4,-3.43728316625,0.43013868502272645 -Hg1B4N2Cl2F4_10_7838.vasp,HgB4N2Cl2F4,-3.864884419230769,0.3942202159327989 -Hf1Mn1Te2O1_8_7225.vasp,HfMnTe2O,-3.7771761159999997,0.4220450807758632 -Fe1B4H4C2F2_47_5626.vasp,FeB4H4C2F2,-4.1426276,0.6396916160042636 -In3P2S6Br3_1_8651.vasp,In3P2S6Br3,-2.234343662857143,0.19543705178570686 -Sn1Mo1S4_3_16655.vasp,SnMoS4,-2.743351581666667,0.44627526083333313 -K2H2N2O6_1_9123.vasp,K2H2N2O6,-3.833860173333333,0.3273775582777702 -Hf1Cd1Br2O2_1_7133.vasp,HfCdBr2O2,-3.64039858,0.2632903045833337 -Mn2As2Se4I2_26_10984.vasp,Mn2As2Se4I2,-1.8907925559999998,0.10547419774999733 -Te1Mo1Ir1S2I2_1_18297.vasp,TeMoIrS2I2,-1.9078316942857143,0.4491276336688266 -Nb1Ni1Te1I1_1_12544.vasp,NbNiTeI,-1.5283249575,0.5389692564508892 -Cu1Br2_115_4863.vasp,CuBr2,0.004493853333333333,0.13978206833333334 -Cu1Ag1Sb1I1Br1N1_1_4826.vasp,CuAgSbIBrN,-1.1392910616666667,0.4298278420833283 -Li1Ni1Sb2Te6_5_9767.vasp,LiNiSb2Te6,-1.317036321,-0.18568971366666828 -Mg4Cl8O4_14_10574.vasp,Mg4Cl8O4,-2.230958696875,0.15860291093749956 -As2P2Se6_8_1242.vasp,As2P2Se6,-2.484170251,0.2772153097083311 -Se4O8_14_16301.vasp,Se4O8,-3.45775027,0.062299269166666615 -K4Pt2N6Cl6O12_11_9498.vasp,K4Pt2N6Cl6O12,-3.414225821,0.0927095200000001 -Ba4P4S8Cl4_14_2170.vasp,Ba4P4S8Cl4,-3.1031351099999998,0.15992380142968432 -Si6N6_2_16533.vasp,Si6N6,-6.151637151666667,-0.6861295529166664 -As4P2O12F2_4_1345.vasp,As4P2O12F2,-4.2801809815,0.38660252241666293 -Li4Mo2P8O26_2_10203.vasp,Li4Mo2P8O26,-5.44831639425,0.059182700799994326 -Sb1As1_156_15432.vasp,SbAs,-2.54218841,-0.69918126 -Nb2S2Br2_59_12834.vasp,Nb2S2Br2,-3.9326649183333333,-0.05782044190476987 -Ti1Cl4_123_18761.vasp,TiCl4,-2.6090276500000003,0.21074945799999956 -Ti1Ge1S2I2_6_18784.vasp,TiGeS2I2,-3.0047482733333335,0.16932202833333276 -Tl2Te6As2_2_19558.vasp,Tl2Te6As2,-1.290926524,0.2868572673333317 -Nb4C3O2_164_13045.vasp,Nb4C3O2,-7.455487124444444,0.041114232083327096 -Ta2Cr2S10_11_17714.vasp,Ta2Cr2S10,-4.123260415,0.08502184214285435 -K2Hf1H6O6_147_9165.vasp,K2HfH6O6,-4.535368781333333,0.08360801633333392 -Cu2Ag1S2I2_1_5004.vasp,Cu2AgS2I2,-0.4808727457142857,0.14963816482993197 -Re4Cl14_13_15104.vasp,Re4Cl14,-2.3261173844444443,0.8898713327777752 -Sb2S2I2_59_15678.vasp,Sb2S2I2,-1.7369165316666668,-0.7332653950000001 -Tl1Sn2_123_19349.vasp,TlSn2,-0.59125943,-2.4003143933333315 -Na2H6C4S6_2_12117.vasp,Na2H6C4S6,-3.9980376399999997,0.1066506165277683 -Zr4N3F2_164_21831.vasp,Zr4N3F2,-6.294924543333334,0.051599563888897304 -Sb4Mo2O12_4_15778.vasp,Sb4Mo2O12,-4.619835778888889,0.11653755305555613 -Cu2S4_14_5261.vasp,Cu2S4,-1.52184514,0.259052267569443 -K2Cu2Pd2Se10_11_9089.vasp,K2Cu2Pd2Se10,-1.407417195,0.20029665687499998 -Cl4O12_2_3693.vasp,Cl4O12,-2.25972758125,0.30896406156250045 -Ta1Te1O1_156_17623.vasp,TaTeO,-5.12677665,0.3967823651111021 -Zr4Se4Cl4_31_21848.vasp,Zr4Se4Cl4,-3.4787873050000004,0.16784950333333004 -K2Ru2C2O2F10_11_9317.vasp,K2Ru2C2O2F10,-3.2851084766666663,0.12390665416665791 -Nb3Se1S3Br3_1_13014.vasp,Nb3SeS3Br3,-3.684907063,0.2151338567812502 -Hf1Bi2S1I1Br1_1_7120.vasp,HfBi2SIBr,-2.3025433766666668,0.12658585645833173 -Sm2I6_162_16577.vasp,Sm2I6,-1.60835048125,0.05779153124999992 -Ba2Cu1Se2F2_38_1972.vasp,Ba2CuSe2F2,-2.2825729871428573,0.5203782071428542 -Tl3Rh1_187_19579.vasp,Tl3Rh,-0.015798425,0.5954493750000001 -Cd1S1Cl1F1_156_3408.vasp,CdSClF,-0.8295603425,0.4074207448437501 -Hf1Zr1S2I2_25_7391.vasp,HfZrS2I2,-3.699419251666667,-0.027277315416669445 -Re1Cl2_164_14998.vasp,ReCl2,-2.5504222833333334,0.7388970440740711 -Mn2H2O4_11_11093.vasp,Mn2H2O4,-4.4810796625,0.18876440437499586 -Mn2W2S8Br2_129_11342.vasp,Mn2W2S8Br2,-2.703797266428571,0.5820525695535661 -Zn1S1I1_1_21002.vasp,ZnSI,-0.23288800666666667,0.4423072391041646 -Mn2Se1I1Br1O1_6_11269.vasp,Mn2SeIBrO,-2.161618058333333,0.05090193011904426 -Cu1Sb1S2I2_6_4965.vasp,CuSbS2I2,-1.1001425599999999,0.020965805503469964 -Si2Te2_31_16458.vasp,Si2Te2,-2.457626625,0.06806130624999973 -In1Pd1Se2_1_8308.vasp,InPdSe2,-1.6032475225,0.23787587803571242 -In2S4_2_8560.vasp,In2S4,-2.0485802200000003,0.491600899062497 -Hf6O6_129_7828.vasp,Hf6O6,-7.1006007816666665,0.2062009940151448 -Ca2Te2Au1F2_38_3133.vasp,Ca2Te2AuF2,-1.6576257714285716,0.579390633571425 -Co2Sb2Te4I2_10_4008.vasp,Co2Sb2Te4I2,-1.234960277,0.3326400211333318 -Sn2P2Se6_147_16823.vasp,Sn2P2Se6,-2.385816813,0.11959970699999989 -Ga1Cu1As2S6_149_6160.vasp,GaCuAs2S6,-2.432620012,0.5050457541874974 -Hg1H4C4Br2N2_10_7874.vasp,HgH4C4Br2N2,-4.414372152307693,0.20236085384613944 -Li2H6Pb1S6_147_9949.vasp,Li2H6PbS6,-2.9344932146666665,-0.06160048404166818 -Zn2Ni4O10_11_21126.vasp,Zn2Ni4O10,-2.31203383,-0.009266032812499714 -Tl4Hg6Se8_13_19608.vasp,Tl4Hg6Se8,-0.11618823722222221,-0.2834295324074073 -Mn2Te2Mo2S12_113_11300.vasp,Mn2Te2Mo2S12,-2.619162701111111,0.5128867703240712 -Ge1B1H2_156_6641.vasp,GeBH2,-3.6503383175,0.33871723587499525 -Sb1I2_115_15460.vasp,SbI2,-0.26035485666666663,0.521118669166666 -K2Mg2Sb2_129_9230.vasp,K2Mg2Sb2,-0.9179764016666666,0.10585984500000001 -Cr1As2_164_4114.vasp,CrAs2,-3.0833628833333333,0.25726519916666346 -K2Mo4Cl14O4_13_9244.vasp,K2Mo4Cl14O4,-2.3339966325,0.08397640208333357 -Rb2Os2C2S4I8_7_14908.vasp,Rb2Os2C2S4I8,-1.8782472844444444,0.5204451105555532 -Tc2O4_2_18233.vasp,Tc2O4,-6.3038177016666666,0.18327694666666705 -Re2Pd1S8_2_15073.vasp,Re2PdS8,-3.4333888554545453,0.36930488602272193 -Sn1Se1S1_156_16691.vasp,SnSeS,-2.2744574966666664,0.10514611000000018 -Ba1Te2_115_1868.vasp,BaTe2,-1.0550549633333333,1.0660371338888872 -Mn2Ga2O5_38_11073.vasp,Mn2Ga2O5,-4.427629873333333,-0.13350618472222653 -Mn1Ag1S1I2O1_1_10615.vasp,MnAgSI2O,-1.4094977450000001,0.2720370714843753 -Hf2C4_129_7471.vasp,Hf2C4,-6.303347745,1.7393262594444376 -Zr4B3F2_164_21801.vasp,Zr4B3F2,-5.213473495555555,-0.049938668611114845 -Ba4Fe2I2O6_129_2152.vasp,Ba4Fe2I2O6,-3.490939248571429,0.03480053124999616 -Hg2Te2I2_59_8032.vasp,Hg2Te2I2,0.5085057833333334,0.22140604284722148 -Hf2Sc1Se1Br4Cl1O1_1_7590.vasp,Hf2ScSeBr4ClO,-3.556528717,0.17322161968750016 -Zr1Se2_123_21444.vasp,ZrSe2,-3.64565412,0.4444987208333333 -Ge1B1Ir1S1Br4_1_6642.vasp,GeBIrSBr4,-1.72884700125,0.6247107647321368 -Ag4Te2S12_14_569.vasp,Ag4Te2S12,-1.428627275,0.322417957569443 -Co1O2_47_3802.vasp,CoO2,-3.1048064466666667,-0.007640014583335963 -Li4S4_111_10222.vasp,Li4S4,-2.591300005,0.2881306173437501 -Cu3P2C4S2O16_2_5380.vasp,Cu3P2C4S2O16,-4.180285796666666,0.8976767943518441 -Ti1Br2_115_18749.vasp,TiBr2,-2.6365960266666666,0.5419532300000003 -K4Mo2O4F8_4_9475.vasp,K4Mo2O4F8,-3.341600702777778,-0.1648926916666702 -Mg2I4_2_10470.vasp,Mg2I4,-0.5785313,0.2832229466666667 -Hf4O8_35_7801.vasp,Hf4O8,-7.408653881666667,0.37884001666666656 -Tc2I6_12_18230.vasp,Tc2I6,-1.72517177125,0.10530761874999994 -W2C1S2_164_20472.vasp,W2CS2,-5.44925772,-0.11432695599999976 -Al1Se1Br2_6_732.vasp,AlSeBr2,-1.6238557125,0.40836181354166684 -V1Ga2O4_164_19834.vasp,VGa2O4,-4.651433894285715,0.1806359225396732 -Nb2Br2N2_59_12647.vasp,Nb2Br2N2,-5.405502988333333,0.013242763099992061 -Co2Sb4S6Cl4_2_4015.vasp,Co2Sb4S6Cl4,-2.126881310625,0.2688970533854141 -Mn3S4_164_11403.vasp,Mn3S4,-3.0368930971428574,0.18519780428571408 -Cs2N2O6_4_4754.vasp,Cs2N2O6,-4.060285946,0.0766676240000006 -B1Br1_99_1618.vasp,BBr,-1.47022637,1.8561873319444413 -V2Cl6_191_20039.vasp,V2Cl6,-2.022253485,0.20992605750000015 -V3B2H2Se2_187_20240.vasp,V3B2H2Se2,-3.8438286188888893,0.8240263594444395 -Tb1Sn5_47_18182.vasp,TbSn5,-1.4274778466666669,-1.283897797083332 -Te4As4Pt4_13_18562.vasp,Te4As4Pt4,-2.2537291016666665,0.379423161249995 -Mo1Au2O4_1_11491.vasp,MoAu2O4,-2.9195716914285716,0.5694457471428529 -Bi2S2_164_2518.vasp,Bi2S2,-1.92714574,-0.6381494933333343 -Sr3Au2Br2O4_123_17349.vasp,Sr3Au2Br2O4,-2.587640499090909,0.15081752359306944 -Ti2Se2_187_19025.vasp,Ti2Se2,-4.5139643075,-0.1488846825000003 -Cr8O18_1_4630.vasp,Cr8O18,-4.9019846,-0.19636044240384942 -Ag2S2_164_386.vasp,Ag2S2,-0.5809271875,0.38730177734375 -Nd1I2_123_13222.vasp,NdI2,-1.8129079866666666,0.03237535999999985 -Pt2I4O12_14_14632.vasp,Pt2I4O12,-2.5342568266666667,0.22058591963888752 -Re2O2_187_15064.vasp,Re2O2,-6.2239908225,0.3863694268750002 -In1Fe5Br2_123_8246.vasp,InFe5Br2,-0.3249915575,1.42422055890625 -Cu2H8C6I2N2_2_5145.vasp,Cu2H8C6I2N2,-4.454584999,0.2598499339999933 -Ni1H4C2I2N4_47_13333.vasp,NiH4C2I2N4,-4.138921334615384,0.09304227852563574 -Nb2S2_2_12846.vasp,Nb2S2,-5.11866959,-0.007088386500004873 -Sr3Fe2S5Br2_123_17378.vasp,Sr3Fe2S5Br2,-2.4121455916666665,-0.14124521375000199 -Hf2Cl2_12_7476.vasp,Hf2Cl2,-4.179844,0.13281405249999967 -Zn1H1_183_20951.vasp,ZnH,0.08357396,1.2980800275 -Cu2H8C6Br2N2_2_5143.vasp,Cu2H8C6Br2N2,-4.522020607,0.29241811949999885 -Cu1Pd1I1Br1O2_6_4940.vasp,CuPdIBrO2,-1.29870093,0.20814176273147977 -Sn1H1Br1O1_8_16639.vasp,SnHBrO,-2.7845131625,0.2020992319791668 -Bi1_123_2413.vasp,Bi,-0.56926841,-0.10240041499999997 -Ag2H2O4_1_267.vasp,Ag2H2O4,-2.52876261,0.189263345260417 -Mn1Tl1S2Br2_1_10915.vasp,MnTlS2Br2,-1.5036181266666666,0.19753014531249752 -Zn2O2_164_21128.vasp,Zn2O2,-1.9791506825,0.22305901999999977 -In2Te5_12_8638.vasp,In2Te5,-1.2865374014285713,0.1123248328571429 -Zn2Te2W2O12_18_21183.vasp,Zn2Te2W2O12,-4.366585132777778,0.03650910703703247 -Sb1Br2_164_15440.vasp,SbBr2,-0.7925481366666666,0.4379269791666657 -Fe2P8_18_5925.vasp,Fe2P8,-3.2343222679999997,0.6426602885000001 -Tl1As1O4_111_19213.vasp,TlAsO4,-3.4975103116666664,0.21836109000000015 -Br4_55_2710.vasp,Br4,0.22357092,0.21710583 -V2P2S10_129_20139.vasp,V2P2S10,-3.1757637807142856,0.2449586128571397 -Pb2Cl2_164_14237.vasp,Pb2Cl2,-1.00010295,0.29640786625 -Al1Co5Br2_123_631.vasp,AlCo5Br2,-1.45179775625,0.4088853858333312 -Sr3Cu2S4Br2_123_17369.vasp,Sr3Cu2S4Br2,-2.0769675736363635,0.007442560606056858 -Na2Ti2Cu2S6_11_12325.vasp,Na2Ti2Cu2S6,-3.2017654083333333,0.227926644583333 -Au2F6_191_1482.vasp,Au2F6,-0.1770699,0.5351321083333332 -Co2Ni2As2_129_3940.vasp,Co2Ni2As2,-1.3431802833333333,0.3567256916666668 -K2Ga2H4_51_9108.vasp,K2Ga2H4,-1.93737225125,0.0942083012499999 -Mn1In1S3I1Cl1_1_10777.vasp,MnInS3ICl,-1.9089010828571429,0.3617070558482102 -Sb1Cl5_47_15449.vasp,SbCl5,-0.7419035716666667,0.3723606058333333 -H2Au2_12_6990.vasp,H2Au2,-0.92908673,2.2324594825 -Pd1N2_47_14370.vasp,PdN2,-4.4625435,-0.22406080500000347 -Hf1Sn1Cl4O2_8_7311.vasp,HfSnCl4O2,-3.49703952875,0.22940047124999996 -Ag1Rh1S2I2_6_107.vasp,AgRhS2I2,-1.0652001899999999,0.3890713729947908 -B4I4_39_1756.vasp,B4I4,-1.2706728625,1.6038459794444417 -Sc5Cl8_10_16269.vasp,Sc5Cl8,-2.7931878823076923,0.09658438256409951 -Mn1Te3W1Se1_6_10914.vasp,MnTe3WSe,-2.423847288333333,0.07314015208333047 -V1Mo1F6_10_19878.vasp,VMoF6,-3.191892555,-0.2503288015624998 -Ta2F5_1_17722.vasp,Ta2F5,-4.2420024,0.770799969285707 -Li2Br2O4_113_9846.vasp,Li2Br2O4,-2.56124566375,0.16830761520833137 -Ag2I1O6_162_310.vasp,Ag2IO6,-1.9453927377777778,0.27314768930555344 -Co1Pd1S2I2_1_3811.vasp,CoPdS2I2,-1.2193192066666667,0.3645192759374993 -Tl2Ni2Te5_156_19462.vasp,Tl2Ni2Te5,-0.5567958655555556,0.1781919399999993 -Ba2Ag1Se2I2_38_1892.vasp,Ba2AgSe2I2,-1.5908981699999998,0.12376624678571302 -Ba2Cr3O8_123_1960.vasp,Ba2Cr3O8,-4.790005858461539,0.18413263865384044 -Na1Cd1Bi1Br1Cl1O2_1_11838.vasp,NaCdBiBrClO2,-2.021716185714286,0.19559933232142668 -Sr1Ge1S1I2_8_17049.vasp,SrGeSI2,-1.95656148,-0.2844763231666665 -C1F2_187_2728.vasp,CF2,-1.8200567633333333,2.295496184999993 -Bi1Te6As2Au1_143_2411.vasp,BiTe6As2Au,-1.3308244679999999,0.10338125504166434 -Na4Zn2Ge2_164_12432.vasp,Na4Zn2Ge2,-0.40154690125,0.08447002125000003 -In2Pd1S4_164_8527.vasp,In2PdS4,-2.2351972457142857,0.1710119821428553 -K2Ge1H6S6_147_9110.vasp,K2GeH6S6,-2.816162931333333,0.10342614550000051 -S2N2_4_15384.vasp,S2N2,-4.179301075,-0.10348336406249947 -Ga4S4Cl4_14_6563.vasp,Ga4S4Cl4,-2.3379824916666667,0.060588909999999885 -Cd1C2N4Cl2F4_1_3292.vasp,CdC2N4Cl2F4,-2.994440646923077,0.7367761687820445 -Ru2Cl6_191_15311.vasp,Ru2Cl6,-1.2688556725,0.5746439675000001 -Ru1Pt1Se2I1Cl1_6_15281.vasp,RuPtSe2ICl,-1.783774735,0.20691771096153252 -Ta2Ru2S8_11_17841.vasp,Ta2Ru2S8,-4.386187508333333,0.13155055000000004 -Ag2B2S2Br2_31_181.vasp,Ag2B2S2Br2,-1.78128149,0.5725478337499998 -Ga1Cu1P2Se6_149_6165.vasp,GaCuP2Se6,-2.2573039219999997,0.15485058904166488 -As2H2Pb2S6_7_1214.vasp,As2H2Pb2S6,-2.616303085833333,0.36743439759258967 -Ag4Se4S12_14_566.vasp,Ag4Se4S12,-1.5009008005,0.1846124821250006 -Pb2N2Cl2_59_14257.vasp,Pb2N2Cl2,-2.3750813166666664,0.47857944166666444 -Y1N1_187_20654.vasp,YN,-6.243594095,0.7473918800000003 -Ag2Se2I2_59_433.vasp,Ag2Se2I2,-0.21009779833333334,0.327582849444444 -Na2Hg4Cl6O8_31_12151.vasp,Na2Hg4Cl6O8,-1.2636811905,0.2734487231041649 -Ca3Bi12O18_8_3155.vasp,Ca3Bi12O18,-3.616761293333333,0.14660433416666535 -Zr2I2N2_59_21589.vasp,Zr2I2N2,-5.048323046666667,0.04825412166666698 -Ti1S2_187_18841.vasp,TiS2,-4.903374243333333,0.22594110333333273 -Ca2H8O6_26_3042.vasp,Ca2H8O6,-4.375047085625,0.06506817760416284 -Ge2S2I2_59_6826.vasp,Ge2S2I2,-2.01134519,0.1768264538541664 -Al2Zn2S5_187_1041.vasp,Al2Zn2S5,-2.4507489211111113,0.07728778488888599 -Ta2H2C1S2_164_17744.vasp,Ta2H2CS2,-5.332794649999999,0.2573762647618927 -Nb2P2O10_129_12804.vasp,Nb2P2O10,-6.230238025714286,0.07380275964285765 -Ge4As4Se4_17_6926.vasp,Ge4As4Se4,-2.8731474316666668,0.09260545541666643 -K2N2O6_26_9248.vasp,K2N2O6,-4.102651248,0.06853187975000008 -Sn7S2Br10_1_17003.vasp,Sn7S2Br10,-1.3337879015789473,0.10622234368420869 -Bi2O2F2_59_2481.vasp,Bi2O2F2,-3.1983202966666666,0.06301549000000017 -Hg8O4_14_8108.vasp,Hg8O4,0.5054338425,0.20106557931992364 -Sn2Te2I2_59_16891.vasp,Sn2Te2I2,-0.9373992733333334,-0.3057406083333344 -Hf1P2H2O6_164_7255.vasp,HfP2H2O6,-5.848867489090909,0.06334377727272678 -Cs1Pb1S2_156_4647.vasp,CsPbS2,-1.556894605,-0.37569575000000005 -Cd1H1S1O1_8_3334.vasp,CdHSO,-2.1738121775,0.4530767357812501 -In2Co2Te5_187_8417.vasp,In2Co2Te5,-1.4165008444444445,0.11416032333333181 -Sc1F2_123_15935.vasp,ScF2,-3.8569851533333335,-0.010115652777781037 -Ta1O2_191_17594.vasp,TaO2,-4.908107393333333,2.4469632953333265 -Hg2Sb2O6_147_8006.vasp,Hg2Sb2O6,-2.322522201,0.7251339900000002 -Hf4B3H2_164_7765.vasp,Hf4B3H2,-5.729210063333333,0.13513647611110574 -Ga2P2Se6_143_6428.vasp,Ga2P2Se6,-2.466467221,0.17106558524999493 -In2Te1S1_8_8612.vasp,In2TeS,-1.724460565,0.10787902750000011 -Cu1H2O2_164_4892.vasp,CuH2O2,-3.192634126,0.3802080004166668 -Nb1V1Cl6_123_12608.vasp,NbVCl6,-2.20327072,0.42810550304687234 -Ti2C1_164_18914.vasp,Ti2C,-6.708396976666666,0.9007690774999926 -Fe2Sb2Br2O4_26_5946.vasp,Fe2Sb2Br2O4,-3.090325231,0.03504076174999815 -Ba4Te8P4H4_14_2197.vasp,Ba4Te8P4H4,-2.3826794854999997,0.365332971527773 -Hf1V1S2_25_7354.vasp,HfVS2,-4.3358424525,0.48623844825000084 -Cu3Mo1Se2S3Br3_1_5375.vasp,Cu3MoSe2S3Br3,-1.3219185925,0.26549647002976046 -Co2As4Br4O6_11_3851.vasp,Co2As4Br4O6,-3.079768381875,0.10557880687499835 -Ca1Cu1Se1Cl1_156_2825.vasp,CaCuSeCl,-1.57556227,0.01601450218749992 -Bi4Te6_7_2656.vasp,Bi4Te6,-1.2682839559999999,0.2990699780000001 -Nb1In1Se2I4_1_12527.vasp,NbInSe2I4,-1.564403465,0.19638790921874338 -Sr4Mn4Ga2O14_26_17451.vasp,Sr4Mn4Ga2O14,-4.3349345462499995,0.25222069260416313 -V1Sb2Au1S6_1_19922.vasp,VSb2AuS6,-2.419489772,0.3415443759166621 -Lu2C1Br2_164_10304.vasp,Lu2CBr2,-3.7933260019999997,0.042525892000000454 -Co1Ge3_187_3736.vasp,CoGe3,-2.1260490025,0.6926618262500003 -Ba1F2_187_1830.vasp,BaF2,-3.3300270466666664,0.5421837066666666 -Hf1Zr1I3Br1O2_8_7382.vasp,HfZrI3BrO2,-3.75033048625,0.21315293031249993 -U2Br6_59_19702.vasp,U2Br6,-3.0868540275,0.06365939125000031 -Al4H12O12_14_1070.vasp,Al4H12O12,-4.912535005357142,-0.3856594941666702 -In4Bi4_127_8665.vasp,In4Bi4,-0.32677217625,0.22873008625000002 -Cr2Sb2Se6_157_4483.vasp,Cr2Sb2Se6,-2.365632355,0.19676008600000028 -Cr1Te8Mo3_25_4282.vasp,CrTe8Mo3,-2.088058025,-0.019125802777777867 -Na2Ru2S4I8N2_7_12285.vasp,Na2Ru2S4I8N2,-1.7309394966666667,0.0933842025694428 -Na1Sn2S4_164_11937.vasp,NaSn2S4,-2.503971957142857,0.03930126910713794 -Pb2I2_129_14251.vasp,Pb2I2,-0.3618602375,0.5105656170833334 -Ta2Co4S6_11_17707.vasp,Ta2Co4S6,-3.6746495183333336,0.2331675749999973 -B2Cl6_1_1663.vasp,B2Cl6,-2.52302887125,0.020151533750000006 -Cu2P4S3Cl2_6_5221.vasp,Cu2P4S3Cl2,-2.3659250000000003,0.14262154985571773 -Hf2Zr2S8_7_7670.vasp,Hf2Zr2S8,-4.797075485833333,0.3232419312500001 -Hg1I2_115_7879.vasp,HgI2,0.91065173,0.037771472777777815 -Zn2Te2_164_21186.vasp,Zn2Te2,0.0434477025,0.1661285625 -Co1Te1O4_10_3832.vasp,CoTeO4,-3.5923809316666664,0.24918649083333388 -Zn2Fe8O18_1_21079.vasp,Zn2Fe8O18,-3.1840791892857143,0.3585303902678541 -Ni1P1S3_1_13388.vasp,NiPS3,-2.251905498,0.3588204082222165 -In1Co5Br2_123_8219.vasp,InCo5Br2,-0.97392648125,0.45967927890624993 -Al2Pd1O4_164_928.vasp,Al2PdO4,-4.9228852042857145,0.2053394107142822 -Mn2Mo2S2O12_8_11143.vasp,Mn2Mo2S2O12,-4.444112686111111,0.23453887392118156 -Sb1P2Au1S6_143_15475.vasp,SbP2AuS6,-2.682466904,0.05039366162500003 -Ta2Se4I4_12_17881.vasp,Ta2Se4I4,-2.588856755,0.11196312209090231 -Tl2Cl6_26_19396.vasp,Tl2Cl6,-0.6270224525,0.11626903750000006 -Hf3Zr1O8_1_7753.vasp,Hf3ZrO8,-7.1244644575,0.5119032520833331 -Rb2I6_26_14896.vasp,Rb2I6,-0.0012579725,0.24515555812499998 -Sr2Sn4Cl12_2_17318.vasp,Sr2Sn4Cl12,-1.7798529449999998,0.07248811722222093 -Rb2Te2C2Cl6O6_4_14947.vasp,Rb2Te2C2Cl6O6,-2.64338429,0.6897597185416662 -Cu4H4I4O4_14_5412.vasp,Cu4H4I4O4,-1.926783413125,0.18761912560416638 -Yb1Br2_164_20853.vasp,YbBr2,-2.1576200466666666,0.08890110666666695 -Ni3P6_164_13711.vasp,Ni3P6,-2.45165471,0.733885125 -Tl2In2H8_3_19446.vasp,Tl2In2H8,-1.9467467950000001,1.6568055616666624 -Ga2Br2_129_6311.vasp,Ga2Br2,-1.138356465,0.22605998500000002 -K2H8S4I2_2_9164.vasp,K2H8S4I2,-2.5228998725,-0.07877525312500025 -Cu2H4_12_5134.vasp,Cu2H4,-1.6813856216666665,2.0652586016666636 -Cd1C4N2F6_10_3296.vasp,CdC4N2F6,-4.251399543846154,0.12039367826921749 -Zn4Mo4O24_14_21223.vasp,Zn4Mo4O24,-3.7405598340625,0.2504029991666663 -Cs2C2S6_1_4672.vasp,Cs2C2S6,-3.106861864,0.5110783165000004 -W12F24_32_20404.vasp,W12F24,-3.4244307894444446,0.7995265980555515 -Tl2I6_127_19439.vasp,Tl2I6,0.18036218,0.20883309968750002 -Zr2Ge2Se8_31_21571.vasp,Zr2Ge2Se8,-3.2910425133333336,0.08062688999999956 -Sn1Cl4_123_16627.vasp,SnCl4,-1.060535958,0.229271703 -Al1Ge1S3_143_666.vasp,AlGeS3,-2.9190202800000002,0.34811157993749686 -Cu3Sb1S4_156_5384.vasp,Cu3SbS4,-1.24641599375,0.5172990987500001 -Eu1P2_6_5591.vasp,EuP2,-3.72252361,0.7808246163333288 -Tm4Te10O26_2_19692.vasp,Tm4Te10O26,-4.43934432175,0.07551520674999956 -Al2Zn3O6_156_1044.vasp,Al2Zn3O6,-3.735233524545454,0.24939669409090515 -Mo2O2_187_11645.vasp,Mo2O2,-4.3840160925,0.94222191875 -Sr10Co2_26_17011.vasp,Sr10Co2,0.6731219916666666,1.2177261816666656 -Ta1Ga1Au1S3Cl2_1_17544.vasp,TaGaAuS3Cl2,-2.700588315,0.325866036125 -Fe1Co2O6_12_5661.vasp,FeCo2O6,-3.6681001322222224,-0.2722385052083407 -Cr1Br5_10_4134.vasp,CrBr5,-0.688349805,-0.01633719583333387 -Si1Ni3Te2_187_16352.vasp,SiNi3Te2,-1.1344145866666666,-0.07194222750000001 -In2Co1Se4_164_8409.vasp,In2CoSe4,-1.9620393842857144,0.07048248209523345 -Li4V1F8_3_10235.vasp,Li4VF8,-3.4514482276923077,0.004455409230766261 -Mo2W2S8_25_11699.vasp,Mo2W2S8,-4.158919905,-0.06482466333333381 -Ta2Te2Br2_59_17899.vasp,Ta2Te2Br2,-3.3088631250000002,0.2499492293253892 -Na2Ca2_11_12016.vasp,Na2Ca2,0.50604195,0.98574643 -Cd2Te2_129_3596.vasp,Cd2Te2,0.3646265325,-0.5047492225 -Sr2Li2_11_17272.vasp,Sr2Li2,-0.1225226075,0.36746247754385875 -V2Te2_187_20214.vasp,V2Te2,-2.2567813225,0.5184637803571401 -Sm2F6_59_16570.vasp,Sm2F6,-4.4769644925,0.2575192181250001 -Al2I2Br2_1_875.vasp,Al2I2Br2,-1.2104879716666666,0.23324964055555442 -Tl4Te4Cl4_14_19634.vasp,Tl4Te4Cl4,-0.7580350858333333,0.3842253730555545 -Ni1Te1Ru1Br1N1_1_13431.vasp,NiTeRuBrN,-2.226737514,0.21063549400000048 -Mn1F2_115_10703.vasp,MnF2,-2.3115069900000003,0.4978374699999999 -Hf2Te2P1_164_7636.vasp,Hf2Te2P,-4.692869812,0.05208564800000026 -Tc4Cl14_13_18246.vasp,Tc4Cl14,-2.5058886666666664,0.09891863166666437 -K1W2S2Br6_47_8959.vasp,KW2S2Br6,-2.0553842536363636,0.13433438181817836 -Mn2H2Se4_11_11097.vasp,Mn2H2Se4,-2.55700393625,0.37070370750000015 -Y4I6_12_20828.vasp,Y4I6,-2.486476711,0.097275050999998 -P4S6_81_14114.vasp,P4S6,-3.2363323819999996,0.14891780940624733 -V1W2O8_2_19960.vasp,VW2O8,-5.781899259090909,0.03138289090908586 -In1Pd5I2_123_8314.vasp,InPd5I2,-0.83546018,0.04555207256249999 -Sn2Sb2H6C2S6_7_16858.vasp,Sn2Sb2H6C2S6,-3.3646458333333333,0.22644117680554268 -W3O8_8_20567.vasp,W3O8,-5.743889812727272,0.45564564669758184 -Ga3P1Se3S1Br2_1_6530.vasp,Ga3PSe3SBr2,-2.0542856560000002,0.26195926939582975 -Cu1Ag1I2_1_4818.vasp,CuAgI2,0.3530421125,0.145783829999999 -Cu1As1S2I2_6_4836.vasp,CuAsS2I2,-1.2219888966666665,0.19897778159722096 -Hf1Sb2H2O6_164_7287.vasp,HfSb2H2O6,-4.706862871818182,0.5266432798484744 -Na1Mo2S2Br6_47_11902.vasp,NaMo2S2Br6,-1.62812781,0.14408765727272344 -As4W2_2_1377.vasp,As4W2,-3.5985914833333332,0.6737308958333295 -H2Pb4I2O4_12_7007.vasp,H2Pb4I2O4,-2.9404929516666667,-0.004981723940974431 -Ga2I2N2_59_6388.vasp,Ga2I2N2,-2.5929417249999998,0.5171145622222195 -Ni1H4C4Br2N2_47_13339.vasp,NiH4C4Br2N2,-4.604073954615385,0.1822064730769078 -H4Au4Br4O4_2_7058.vasp,H4Au4Br4O4,-1.775195034375,0.1233601918749998 -Al2In2Se6_31_891.vasp,Al2In2Se6,-2.44073066,0.027742448000000253 -Na2H2C2O4_13_12097.vasp,Na2H2C2O4,-4.881992619,0.16251972924999514 -Co2Cl2O4_11_3889.vasp,Co2Cl2O4,-2.92276069625,-0.5044105095312501 -P2H6Pb2N2O6_7_13984.vasp,P2H6Pb2N2O6,-4.6046538805555555,0.16786761111110327 -Te10As10_26_18265.vasp,Te10As10,-2.0208139204999997,0.27561301533333094 -Hf1Au1Br1Cl1O3_1_7111.vasp,HfAuBrClO3,-3.2403291342857146,0.5630446165773746 -In2Te2Cl2_59_8616.vasp,In2Te2Cl2,-1.2853940433333333,-0.5531383133333333 -Cr1Te1W1Se1S2_8_4275.vasp,CrTeWSeS2,-2.8920706983333333,0.535799379444443 -Ba3Mn2S5I2_123_2117.vasp,Ba3Mn2S5I2,-2.6645244483333332,0.16417018958333007 -Ta1Ni1Cl2O2_1_17586.vasp,TaNiCl2O2,-3.76529019,0.3832613199999906 -Fe1C4Br2N2F4_47_5645.vasp,FeC4Br2N2F4,-4.25334541,-0.04786964014424069 -Tc8F28_4_18263.vasp,Tc8F28,-3.5239742719444447,0.025344025972215134 -Cd1O1F2_156_3383.vasp,CdOF2,-1.1765207225,0.5244942365625 -Rb2H6C4S6_2_14855.vasp,Rb2H6C4S6,-3.8798097255555555,0.12013266996526487 -Fe2B1S2F2_164_5801.vasp,Fe2BS2F2,-2.37953957,0.4749389660118948 -V2Mo2S10_85_20106.vasp,V2Mo2S10,-3.0627138085714285,0.5592477391071398 -Mg1S2F2_1_10396.vasp,MgS2F2,-2.062954268,0.8565750547500002 -Li1Ga1Cl4O12_2_9708.vasp,LiGaCl4O12,-2.730184061666667,0.19879558872221748 -In2Sn2S2_164_8607.vasp,In2Sn2S2,-1.7968920949999998,-1.146253146666667 -Tc2I8_14_18231.vasp,Tc2I8,-1.279278939,0.10471634100000027 -Ga2Si2Te2_164_6492.vasp,Ga2Si2Te2,-2.5985656066666665,-0.3130491127777796 -Ag2O4F2_17_341.vasp,Ag2O4F2,-1.80383202375,0.11510871874999995 -Sn1H2_115_16643.vasp,SnH2,-2.0419678566666666,0.30606413833333146 -Tl2Ga2S6_31_19424.vasp,Tl2Ga2S6,-2.230316254,0.24093783437499783 -Li2Ni1O2_164_10021.vasp,Li2NiO2,-2.979237626,-0.02992421399999967 -Sc2B1Cl2_164_16032.vasp,Sc2BCl2,-3.585854728,0.009108793899999822 -Li2Cr2Si2O8_11_9873.vasp,Li2Cr2Si2O8,-5.378733857857143,0.18946810999999375 -Cd2I2O2_59_3518.vasp,Cd2I2O2,-0.62303784,0.28884997603174567 -Ag1Au1Se1S1I2_1_13.vasp,AgAuSeSI2,-0.16144983999999998,0.3301148510416662 -Be3Ge1_25_2279.vasp,Be3Ge,-2.6942972175,-0.46268497249999985 -K2Ta2Cl12_4_9359.vasp,K2Ta2Cl12,-2.4564721275,0.027358002499999756 -Cr1S2F2_164_4246.vasp,CrS2F2,-2.44279661,0.5726847344999976 -V4C3Cl2_164_20311.vasp,V4C3Cl2,-4.911389521111111,0.1287364635390884 -Cu2B2Br2O2_31_5025.vasp,Cu2B2Br2O2,-2.5442568325,1.3451950918055506 -P8Se8S4_2_14161.vasp,P8Se8S4,-2.8448396695,0.22185506905952135 -Mn2P2Br2O4_26_11180.vasp,Mn2P2Br2O4,-3.57623668,0.4444124606759222 -S4Br4_2_15394.vasp,S4Br4,-1.2340640475,0.300912079375 -Os2O4_11_13862.vasp,Os2O4,-4.91195496,0.5908230466666664 -W2Br8_1_20468.vasp,W2Br8,-1.330127681,0.37466021683333084 -Ge3As1O8_10_6900.vasp,Ge3AsO8,-4.574681240833333,0.19722594901040802 -Y2S2Br2_59_20770.vasp,Y2S2Br2,-4.248594953333334,0.035081978333332486 -Rh2N2Cl2_59_15201.vasp,Rh2N2Cl2,-3.021960561666667,0.15562543749999702 -Hg4W4O14_2_8096.vasp,Hg4W4O14,-4.299639622272728,-0.005070499318190702 -In1P1_156_8296.vasp,InP,-2.06152933,-0.40962166999999994 -V1Cu1Se2_156_19819.vasp,VCuSe2,-1.903972165,0.49017689937499986 -As16F4_10_1126.vasp,As16F4,-2.9733745160000002,0.13890402783333 -K4S4O10_11_9505.vasp,K4S4O10,-3.733285742777778,0.11501603254629308 -V1C4S6F5_1_19794.vasp,VC4S6F5,-3.617727818125,0.42572925195312505 -Mn2Nb1Pd1Se4_6_11160.vasp,Mn2NbPdSe4,-2.68205907625,0.11680716859375051 -Mn2In2O5_38_11120.vasp,Mn2In2O5,-3.8646146322222226,0.08756637426484262 -Ca2Br4_2_2964.vasp,Ca2Br4,-1.54367399,0.3864596733333334 -In2N6_1_8488.vasp,In2N6,-4.64567029,0.13729095687499981 -Mn1In2S1N1Cl2_1_10783.vasp,MnIn2SNCl2,-2.325549045714286,0.5069922749999938 -Sn1Au1S2_1_16607.vasp,SnAuS2,-1.4232001725,0.36522317074218735 -Sc4Se6_65_16263.vasp,Sc4Se6,-3.585723212,0.36331187399999987 -Ta2B1H2S2_164_17654.vasp,Ta2BH2S2,-5.105650534285714,0.8515230585714171 -Al2P2_129_926.vasp,Al2P2,-3.5346099225,-0.6000079275000001 -Si8Pd2_125_16549.vasp,Si8Pd2,-3.187010901,-0.12994683049999955 -Ta2C2I2_59_17685.vasp,Ta2C2I2,-5.3497734150000005,0.10626495341665676 -Mg4Sb8O16_57_10583.vasp,Mg4Sb8O16,-4.089552830357143,0.25044286392857096 -Li1Cl1_123_9670.vasp,LiCl,-2.51941986,0.22042328499999986 -Ta2Te4Br4_12_17913.vasp,Ta2Te4Br4,-2.457731035,0.15739258986666393 -Ta2Pd4Se6_11_17833.vasp,Ta2Pd4Se6,-2.95010224,-0.2780800739583361 -Mg4Ge8W4O24_14_10576.vasp,Mg4Ge8W4O24,-5.0801080472499995,0.06008294449999596 -Mn2H2_164_11098.vasp,Mn2H2,-2.66700763,0.13136715875000005 -Na2B2H16O12_2_11973.vasp,Na2B2H16O12,-4.5928395315625,0.04475376475694448 -Cd1Sb6S8I4_12_3422.vasp,CdSb6S8I4,-1.8686849242105263,-0.4188635209210534 -Tl4Te2S6_26_19632.vasp,Tl4Te2S6,-1.6735459041666667,0.5345273229166665 -Hf1Zr2S3I2_8_7412.vasp,HfZr2S3I2,-3.85262421875,0.0687799896875001 -Mn2Sn1O6_162_11292.vasp,Mn2SnO6,-4.167744948888889,0.2625346349999953 -Zn2Sb4S6Br4_31_21158.vasp,Zn2Sb4S6Br4,-1.66390956625,-0.40944778137500004 -Zn1Ga2S4_156_20938.vasp,ZnGa2S4,-2.309212144285714,0.20092329000000042 -Tb1Si2_123_18179.vasp,TbSi2,-3.18207349,0.8994311222222189 -Sc2Te2F2_59_16175.vasp,Sc2Te2F2,-3.497486015,-0.008256200000002822 -V1H4C4S6F1_1_19855.vasp,VH4C4S6F,-4.1627456425,0.2705593016406225 -Pb2C4S4N4_13_14233.vasp,Pb2C4S4N4,-5.033505776428571,-0.4345151360416786 -Nb1I1Cl1_156_12519.vasp,NbICl,-2.43849193,0.4713722478571386 -As2Br6_31_1196.vasp,As2Br6,-1.05609566,0.1133030625 -Sr2Ag1O2F2_38_17102.vasp,Sr2AgO2F2,-2.93170346,0.36594639942856544 -Na3In1Cl6_149_12352.vasp,Na3InCl6,-1.70678001,0.1436950975000002 -Ni1B6Br2N2F4_25_13275.vasp,NiB6Br2N2F4,-3.900444,0.6556439443749881 -Cs2C2Se2S6Cl6_1_4677.vasp,Cs2C2Se2S6Cl6,-2.086433016111111,0.42196957497684895 -Cs2Cd4I6O8_31_4684.vasp,Cs2Cd4I6O8,-1.030182517,0.48054115340555315 -Ca3Bi3_25_3156.vasp,Ca3Bi3,-0.5768464266666666,0.6441670731060598 -H4Pd1C2N6F2_6_7073.vasp,H4PdC2N6F2,-4.397347505333333,0.5309017728333199 -Ta1Ti1Se2_25_17636.vasp,TaTiSe2,-4.860373705,-0.236994677083338 -Ca2Au1Cl2O2_38_2928.vasp,Ca2AuCl2O2,-2.4766436157142855,0.43016304333332855 -V1Ge1S2I1Br1_6_19841.vasp,VGeS2IBr,-2.3721596016666666,0.2308299141319399 -Ir2Cl2O2_59_8774.vasp,Ir2Cl2O2,-2.951768051666667,0.40838058944444056 -Cd1H2_115_3342.vasp,CdH2,-1.0779365066666666,1.2016372449999984 -Ni1N2_47_13379.vasp,NiN2,-4.107417383333334,0.041749698333329255 -Na1Sb2Te6Pd1_149_11931.vasp,NaSb2Te6Pd,-1.370442499,0.3026125453999969 -Cr2Te2N1_164_4523.vasp,Cr2Te2N,-3.2915637259999997,-0.009207534666666017 -Si4Te8_14_16522.vasp,Si4Te8,-2.2235311833333333,0.14733637500000007 -Ti2S2_123_19005.vasp,Ti2S2,-5.215894305,-0.019080684999999598 -Mo2S2_12_11670.vasp,Mo2S2,-3.4579253325,0.7089728087500005 -I4O12_2_8162.vasp,I4O12,-2.44465455125,0.20984081453124992 -Cr2Ag1O6_2_4289.vasp,Cr2AgO6,-4.051164257777778,-0.18182276215278548 -Ge4As8_26_6927.vasp,Ge4As8,-3.1864297983333336,-1.338373889166667 -Sr2Au1S2F2_38_17130.vasp,Sr2AuS2F2,-2.24315617,0.5338183914285671 -Co2Se2_123_4024.vasp,Co2Se2,-1.9905546425,0.1624683248333305 -Na2Hf1H6O6_147_12142.vasp,Na2HfH6O6,-4.722831210666667,0.05037722150000046 -Zr1I4_123_21313.vasp,ZrI4,-1.175824958,0.30772678433333334 -Si4Te4As4_17_16517.vasp,Si4Te4As4,-2.8842843141666665,-0.6047746008333332 -Al1N1_187_687.vasp,AlN,-5.61857765,0.7152872500000003 -Pb6S2O12_11_14333.vasp,Pb6S2O12,-3.851288083,0.07301262293750024 -Nb1Cr1Cl6_123_12492.vasp,NbCrCl6,-2.1018924675,0.2554639755468724 -Pb6S2O12_2_14334.vasp,Pb6S2O12,-3.8537523515,0.07054835443750043 -In2I4_10_8479.vasp,In2I4,-0.40387513166666666,0.13704502666666663 -Rb2Ta2Cu4Te8_7_14946.vasp,Rb2Ta2Cu4Te8,-1.637487548125,0.09609813312499993 -Ag2Ir2F14_26_323.vasp,Ag2Ir2F14,-1.4519853816666666,0.06264878222222237 -Al1Cd1Ga1Se4_156_621.vasp,AlCdGaSe4,-1.9647235171428572,0.15767352571428384 -Zn1Cl2_115_20914.vasp,ZnCl2,-0.5298355533333333,0.07032906812499995 -Sc4H2C3O2_164_16239.vasp,Sc4H2C3O2,-5.333021974545455,0.40980548343938916 -Mn1Ag1Ge1S4_1_10611.vasp,MnAgGeS4,-2.3453538957142857,0.34412040609444383 -Li2Ge1O6F6_147_9924.vasp,Li2GeO6F6,-2.4238183613333333,0.7610003956111115 -Sb2Cl6_12_15568.vasp,Sb2Cl6,-1.449153965,0.07008785999999989 -Ni2O6_31_13553.vasp,Ni2O6,-2.721153105,-0.12964678437499977 -V4F16_14_20323.vasp,V4F16,-3.2925465834999996,-0.012197134499999596 -Pd1Au1O2F1_6_14341.vasp,PdAuO2F,-1.436065874,0.4160815996666647 -Te1Pb2S1I1_1_18324.vasp,TePb2SI,-1.391376548,-0.7609462994999999 -Tl2S5_12_19514.vasp,Tl2S5,-1.6506149628571427,0.3832349117857128 -Zr2I2N2_164_21588.vasp,Zr2I2N2,-5.049743736666667,0.0468334316666672 -Cr1O2F1_156_4220.vasp,CrO2F,-3.428175695,0.5557595878124959 -Ga4Se4I4_14_6573.vasp,Ga4Se4I4,-1.5736179049999999,0.039052925000000016 -Hf3Zr1Se3S1Br3Cl1_1_7757.vasp,Hf3ZrSe3SBr3Cl,-3.7653470341666666,0.09892891619790883 -Ru2I6_189_15324.vasp,Ru2I6,-0.4308516075,0.17537927000000003 -Pb1Se1Br2_1_14203.vasp,PbSeBr2,-1.0497686275,0.4226715183333335 -Cu2Ge2S6_51_5100.vasp,Cu2Ge2S6,-2.301846604,0.17837630104166424 -V2Cd2O6_12_20026.vasp,V2Cd2O6,-3.8661246060000005,0.19110072949999957 -Fe1Cu1Rh1Se1S1I2Br1_1_5666.vasp,FeCuRhSeSI2Br,-1.09702716125,0.07022984019096906 -Tl2S2Cl2_129_19498.vasp,Tl2S2Cl2,-1.0223699166666667,0.46859022312499865 -Zr1Pd1F6_149_21400.vasp,ZrPdF6,-3.188892,0.21984149124999952 -V1Cr1Br2N1O1_6_19804.vasp,VCrBr2NO,-3.8016958966666667,-0.15242122149306417 -Ru2F6_67_15316.vasp,Ru2F6,-2.43922214875,0.13191141250000005 -Ba1I2_164_1840.vasp,BaI2,-1.3646098633333335,0.1799120633333331 -Li2H4C2N8O2_2_9934.vasp,Li2H4C2N8O2,-5.64513469,-1.6503717980092691 -Nd1Se3_191_13226.vasp,NdSe3,-2.51766024,0.9187092614583331 -Rb1Ge1Te2_156_14735.vasp,RbGeTe2,-1.259119615,0.1882606125000001 -Mn2As2Se4F2_26_10983.vasp,Mn2As2Se4F2,-2.407175086,0.20688931166666402 -Li1Cu1S2_1_9690.vasp,LiCuS2,-1.89440786,0.22650930700520844 -Hg4N4O12_4_8081.vasp,Hg4N4O12,-3.1386242695,0.054677340499999616 -Mn2P2O4F2_26_11186.vasp,Mn2P2O4F2,-4.130115364,0.34853689742592275 -Cd2S2I2_59_3547.vasp,Cd2S2I2,-0.11445672,0.2912409355902758 -Zr1Pd1Br6_149_21397.vasp,ZrPdBr6,-1.51355147,0.0917926306250001 -Cr1Cu1I6_5_4150.vasp,CrCuI6,-0.05504741125,0.15053829497395851 -Sb6Ir2S4_11_15850.vasp,Sb6Ir2S4,-2.684630575,0.33743086333333094 -Sn1H6Au1_1_16645.vasp,SnH6Au,-2.05945829125,1.60451744125 -Cr2Te8W2_25_4536.vasp,Cr2Te8W2,-2.3681448075,0.12582723777777804 -Zn2W2S8_13_21195.vasp,Zn2W2S8,-2.820047375833333,0.2497861138958315 -Ti2Cl4_11_18925.vasp,Ti2Cl4,-3.65398671,0.05362636083333383 -Si4Sb4S4_17_16510.vasp,Si4Sb4S4,-3.2469437466666666,-0.046785270833335835 -Gd2H4N2O10_4_6616.vasp,Gd2H4N2O10,-5.0909779,0.05280374666666621 -Nb4Co8Se8_59_13061.vasp,Nb4Co8Se8,-3.135812511,0.12411354650000028 -V6Te18_11_20397.vasp,V6Te18,-2.0004292825000003,0.16794794999999962 -Nb4Ni6Se10_59_13107.vasp,Nb4Ni6Se10,-2.594571682,-0.07073176895652455 -K2H6Pb1S6_147_9152.vasp,K2H6PbS6,-2.616356206,-0.09318887637500173 -Hf1Zr1Se1Cl3_6_7398.vasp,HfZrSeCl3,-3.452115708333333,0.08277899999999705 -V2Ag4P2O12_12_19977.vasp,V2Ag4P2O12,-4.1246936315,0.1204128689999937 -Sc1Pd3Br4O4_3_15982.vasp,ScPd3Br4O4,-2.3115567425,0.28016700881944145 -Sb2Te2F2_59_15713.vasp,Sb2Te2F2,-2.0384381133333336,0.3722354455555532 -La2Si2I2_164_9615.vasp,La2Si2I2,-3.249736045,0.038195926666666935 -Na2Eu2Cl8_2_12073.vasp,Na2Eu2Cl8,-2.5920545833333333,-0.4604280331250006 -Zr2Sc1I4Br1_8_21667.vasp,Zr2ScI4Br,-1.83404084625,0.37606199562500003 -Sc4Te6_65_16266.vasp,Sc4Te6,-2.74549592,0.3341811789999998 -Ta1S2_187_17609.vasp,TaS2,-5.3092021,0.11153048833333301 -Ni2B1_187_13460.vasp,Ni2B,-1.2477948666666667,0.5005407933333335 -Sc2N1O2_164_16105.vasp,Sc2NO2,-6.053079816,0.3685707199999877 -Na8Ti8O20_29_12455.vasp,Na8Ti8O20,-5.681846253611111,0.28635274511110564 -Sr2Co1Br2O2_123_17186.vasp,Sr2CoBr2O2,-3.0332170157142855,0.0480993292857097 -Au2I2_67_1488.vasp,Au2I2,0.583186795,0.06946387375000007 -B4S6_1_1764.vasp,B4S6,-4.26628966,0.16736970550000052 -Bi2P2S6_1_2491.vasp,Bi2P2S6,-2.812888822,-0.045818064700000216 -Sc2Te2Cl2_59_16174.vasp,Sc2Te2Cl2,-2.906185353333333,0.08875745444444183 -Hf1O2_164_7251.vasp,HfO2,-7.510399043333333,0.27709485500000053 -Sc2Sb2S8_2_16146.vasp,Sc2Sb2S8,-3.2521141974999996,0.26354517760416085 -Zn2Ni3O8_10_21125.vasp,Zn2Ni3O8,-2.4628522553846155,-0.16781969625000515 -Mn1Ag1F4_2_10610.vasp,MnAgF4,-2.052994135,-0.2102540214583335 -Cu2As2Se6_2_5015.vasp,Cu2As2Se6,-1.626409946,0.2760304534444424 -Hf1Mn1S2I1Br1_1_7223.vasp,HfMnS2IBr,-3.1124164000000003,0.11110053562499989 -Na2H8S4I2_2_12141.vasp,Na2H8S4I2,-2.6576410975,-0.0856455093750002 -Te2Ir2_25_18400.vasp,Te2Ir2,-2.3459253475,0.7895061475 -Cr1Ni1F5_10_4217.vasp,CrNiF5,-2.3486261614285717,-0.06297501285714491 -Zr1Nb1Ga1S3I2_1_21340.vasp,ZrNbGaS3I2,-3.1283095325,0.35867067072916087 -W4N3F2_164_20584.vasp,W4N3F2,-5.532862234444445,-0.1458247597222273 -P4Au2Se3Br2_6_14069.vasp,P4Au2Se3Br2,-1.7708283454545453,0.2443099763636331 -Ti6V4O18_13_19184.vasp,Ti6V4O18,-6.448126867857143,0.20921343642856538 -In2Te2O8F2_11_8624.vasp,In2Te2O8F2,-3.0995327157142856,0.5172279136111049 -Ba4Fe2Br2O6_129_2150.vasp,Ba4Fe2Br2O6,-3.645982505,-0.03730392448661091 -Tl2S4_12_19512.vasp,Tl2S4,-1.6371419883333334,0.29936873218750004 -Al1I2_115_673.vasp,AlI2,-0.7325960166666667,0.4094518716666656 -P1I1O1_156_13921.vasp,PIO,-2.3666154633333334,0.9009448286666617 -Te6O14_31_18660.vasp,Te6O14,-3.511587688,0.17939609337499673 -Na2Mg1Te2H4S8_2_12199.vasp,Na2MgTe2H4S8,-2.578531267058824,0.032751639583328995 -Hf1Sb1As1_156_7284.vasp,HfSbAs,-3.84172111,0.5773593724999962 -Sn2Se1Br2_8_16874.vasp,Sn2SeBr2,-1.4863238060000001,-0.15561750499999993 -Li4Cr8O26_18_10179.vasp,Li4Cr8O26,-4.743926463157894,-0.23548159176535843 -Li1Nb1Br6_1_9754.vasp,LiNbBr6,-1.920393645,-0.012127393124999886 -W1Br2_115_20420.vasp,WBr2,-1.6693836666666666,0.9157905827777775 -Zn2Bi4O10_51_21045.vasp,Zn2Bi4O10,-2.955730646875,0.439637610078125 -Mo1N2_187_11524.vasp,MoN2,-5.209562973333333,0.965891533333334 -Zr1W1I2_6_21487.vasp,ZrWI2,-2.0558207175,1.1263839724999967 -Sr4P4S8F4_14_17461.vasp,Sr4P4S8F4,-3.4846472785000002,0.10371558642968426 -Pt2F6_191_14624.vasp,Pt2F6,-0.90477961375,0.7185466928125 -Hf6C1I1N2Cl1O4_1_7826.vasp,Hf6CIN2ClO4,-6.7978095173333335,0.009826808416649846 -Mn3C2F2_187_11362.vasp,Mn3C2F2,-3.7916225242857142,0.348466295714281 -K1In1Br4O12_2_8909.vasp,KInBr4O12,-2.395538025,0.2596755103472175 -Sn2Sb1Se6_162_16850.vasp,Sn2SbSe6,-2.0462542999999997,0.16840978129629214 -Nb2Ni4S6_11_12785.vasp,Nb2Ni4S6,-2.7841880866666666,0.052568098333329594 -Sn2F6_1_16768.vasp,Sn2F6,-2.5331950075,-0.39184241249999996 -Y1I2_115_20645.vasp,YI2,-1.9292176766666669,0.4735451327777754 -Nb2As2Se6_2_12626.vasp,Nb2As2Se6,-3.3798816700000005,0.2563937101666638 -Er1As2_21_5542.vasp,ErAs2,-2.8468577833333337,0.6012195466666634 -Co2C4O12_14_3885.vasp,Co2C4O12,-5.241023867777778,0.06851552541666223 -Al2H14N4_10_858.vasp,Al2H14N4,-4.192568616,-1.1004541712500049 -Hf2Si2Se2_129_7615.vasp,Hf2Si2Se2,-4.955288483333333,0.05261820833333397 -Sb1As1W1_156_15431.vasp,SbAsW,-3.5746893933333332,0.45763928472221804 -Cr1Cu1Se3I1Br1_1_4159.vasp,CrCuSe3IBr,-1.2348599242857143,0.14534265739795524 -Sb1Br3_187_15442.vasp,SbBr3,-0.68563609,0.41320253125000006 -Fe2H2Br2_59_5850.vasp,Fe2H2Br2,-1.6435906850000002,0.14463188999999632 -Ag2Cl2O4_1_244.vasp,Ag2Cl2O4,-1.24610496125,0.4971364006250001 -Li4C8Br4O8_14_10172.vasp,Li4C8Br4O8,-4.547235229166667,0.6833793424999945 -Na1W2I6O2_47_11953.vasp,NaW2I6O2,-2.3394723418181815,-0.5066805948636405 -Rb1F2_115_14730.vasp,RbF2,-0.9055220433333333,0.288053019999999 -Tl1Ga1S2_1_19275.vasp,TlGaS2,-2.002303775,0.4322926356250001 -Al1Pt5F2_38_717.vasp,AlPt5F2,-1.76550408625,1.3210023762499965 -Sn3S1Br2O1_1_16925.vasp,Sn3SBr2O,-2.085550704285714,0.18615300464285256 -Au4Br4O4_14_1567.vasp,Au4Br4O4,-0.7237950033333332,0.23213433222222135 -Sr2F4_2_17216.vasp,Sr2F4,-3.2070557783333338,0.6064608916666665 -Cd1Sn2I2O2_12_3429.vasp,CdSn2I2O2,-1.7984572457142856,0.09869350309523695 -Bi2P4O13_5_2496.vasp,Bi2P4O13,-5.170168048947368,0.12294619236842053 -Zr2S6_59_21658.vasp,Zr2S6,-4.2852628,0.053713578750000046 -V2H2_12_20079.vasp,V2H2,-3.39129331,0.3553810474999999 -Ni1H4C4N2F2_47_13342.vasp,NiH4C4N2F2,-4.881119604615384,0.3728615449999902 -Mn2Se4F2_11_11288.vasp,Mn2Se4F2,-2.2177380475,0.27339711833333336 -Sc1Zn1Te1Se1I4_1_16024.vasp,ScZnTeSeI4,-0.81276161625,0.34385778929687505 -Ti3Te2N2F2_38_19113.vasp,Ti3Te2N2F2,-5.0284977022222215,0.20172498469135342 -Ti2C1S2_164_18912.vasp,Ti2CS2,-6.177648762,0.20178489799999388 -Mn1Cd1S2I2_1_10661.vasp,MnCdS2I2,-1.0112627766666666,0.3914051806944443 -Ba1Au2S8_89_1805.vasp,BaAu2S8,-1.9984092409090908,0.19158232431817768 -V2Ge2Te6_162_20068.vasp,V2Ge2Te6,-2.197265801,-0.19162463633333449 -Al1Pd2_187_707.vasp,AlPd2,-1.6221084266666665,0.6892736541666669 -Mg6B1C1_25_10597.vasp,Mg6BC,-1.02437753,0.5209458084895832 -Ag4H4I4O4_14_516.vasp,Ag4H4I4O4,-1.751837435,0.15647502348958287 -Sc2Br2F2_164_16036.vasp,Sc2Br2F2,-3.153568866666667,-0.022318914444447335 -Ta6Ge2Se12_26_18144.vasp,Ta6Ge2Se12,-4.426716353,0.01615243699999347 -Au2Br2_164_1453.vasp,Au2Br2,0.61316127,0.31417135375 -Os1F2_187_13801.vasp,OsF2,-1.9466692766666667,1.165882247166664 -Zr2S2I2_59_21649.vasp,Zr2S2I2,-3.460879886666667,0.04795416499999927 -Zr2F2_12_21561.vasp,Zr2F2,-4.2500243675,0.13591105124999991 -Mn1Sb1S1Br2_1_10859.vasp,MnSbSBr2,-1.674713366,0.017589073249997728 -Sn1Pb1S2_6_16670.vasp,SnPbS2,-2.28770217,-0.7192203368750003 -Nb2Mo2S11_5_12763.vasp,Nb2Mo2S11,-3.6161182053333336,0.43632534929166333 -Cu4As4O22_2_5394.vasp,Cu4As4O22,-3.336228402666667,0.27630890016665965 -Tb2C1_164_18187.vasp,Tb2C,-4.044983383333333,0.3032923679999948 -Tl2Te3_164_19553.vasp,Tl2Te3,-0.6645521600000001,0.3230782059999999 -Ge2Cl2_164_6768.vasp,Ge2Cl2,-2.1865515,-0.16791191625000035 -In2S1Cl2O1_6_8539.vasp,In2SCl2O,-2.266944255,0.20226216166666472 -B6Pd1C2Cl2F4_25_1784.vasp,B6PdC2Cl2F4,-3.8005750393333333,0.802423227194428 -Re2Ge1Te5Rh3I1_1_15047.vasp,Re2GeTe5Rh3I,-2.6290632925,0.45514935795138123 -Ba2I4_2_2006.vasp,Ba2I4,-1.0571346666666666,0.48738726 -Y3C2O2_187_20791.vasp,Y3C2O2,-6.62597891,0.4285471543415116 -Hg2Cl4_55_7957.vasp,Hg2Cl4,0.309290515,0.1790523383333333 -Cr4N3O2_164_4610.vasp,Cr4N3O2,-5.183621193333334,0.12806780629629078 -Pd1Se1S1_25_14388.vasp,PdSeS,-1.85073403,0.23234044625000017 -Na1Al1P2O6_5_11812.vasp,NaAlP2O6,-5.23135229,0.2744760230333282 -Mn8F28_4_11475.vasp,Mn8F28,-2.606256728611111,-0.23093917569444655 -Sr1Br2_115_17030.vasp,SrBr2,-1.5745483366666668,0.26862067999999995 -Al2Te4Pd1_164_1017.vasp,Al2Te4Pd,-1.8908986671428571,0.1066796879081594 -Fe1H8C6O4_10_5711.vasp,FeH8C6O4,-5.118871416842105,0.27862101807017003 -Hf1Zr1Sc1Br2N1O1_6_7395.vasp,HfZrScBr2NO,-4.727060287142857,0.610035292678562 -Mo4C3_164_11739.vasp,Mo4C3,-5.006109795714286,0.511250714642852 -Co1Ni1Br6_5_3783.vasp,CoNiBr6,-0.43864104,0.012142532499999997 -Zr1Mn1N1Cl2O1_1_21323.vasp,ZrMnNCl2O,-4.203280596666667,0.38146683927082836 -As2Pd2S7_6_1270.vasp,As2Pd2S7,-2.1737933072727276,0.6902383170454516 -Ag2B4Br2N2F4_2_184.vasp,Ag2B4Br2N2F4,-3.601627904285714,0.3101264101587184 -Sc2B1H2_164_16034.vasp,Sc2BH2,-3.75064051,0.2105274274999983 -Ag2H4C4I2N2_2_273.vasp,Ag2H4C4I2N2,-4.07110712,0.15608136428570485 -Zr2C2I2_164_21544.vasp,Zr2C2I2,-4.290074395,0.31466734095237436 -Na2Hg4S2I6O6_31_12154.vasp,Na2Hg4S2I6O6,-1.5055299515,0.10310855186110737 -Nb8Pt1Se20_12_13208.vasp,Nb8PtSe20,-3.843562266551724,0.07211693896551719 -Ni1B6C2F6_25_13277.vasp,NiB6C2F6,-3.935623470666667,0.8013109008611002 -In2Hg1S4_164_8470.vasp,In2HgS4,-1.741311697142857,0.051881317857142895 -Hf1Zn1Te1S1_156_7373.vasp,HfZnTeS,-2.3987983325,0.3651204324999999 -Li2Pt1O6_162_10045.vasp,Li2PtO6,-2.867641667777778,0.8774009265277747 -K2Fe2P2_129_9103.vasp,K2Fe2P2,-1.5085982733333332,0.060237151666666655 -Ni2S2Br2_59_13580.vasp,Ni2S2Br2,-0.9760790149999999,-0.07672392979166842 -In2Ni4Te6_164_8506.vasp,In2Ni4Te6,-0.6946886233333333,0.1423656666666661 -Hf1Mn1Cl2O2_1_7210.vasp,HfMnCl2O2,-4.40142902,0.3902192108333331 -V2Ni1Te4_164_20117.vasp,V2NiTe4,-1.8310044857142855,0.2396801801190458 -Li4Fe4F16_10_10187.vasp,Li4Fe4F16,-2.4876784425,0.29326170250000017 -Ga2Cu1S3I1Br1_1_6341.vasp,Ga2CuS3IBr,-1.63274946125,0.27022554511718744 -Rb2Br2Cl8_127_14780.vasp,Rb2Br2Cl8,-0.5074264541666667,0.12110014458333307 -Co1S2_115_3818.vasp,CoS2,-2.2789784666666666,0.7117858575000002 -Ga2Br2O2_59_6310.vasp,Ga2Br2O2,-3.0505915883333334,-0.2776143343055582 -Cd3C2S6_164_3612.vasp,Cd3C2S6,-1.9953814863636365,0.5986901032386276 -Nb4H1I1Br1O4_1_13082.vasp,Nb4HIBrO4,-4.965786792727273,0.3069762479734752 -Zr2P2Se1S5_1_21628.vasp,Zr2P2SeS5,-3.9649226640000004,0.2285520553749958 -Y18C8I16O2_59_20601.vasp,Y18C8I16O2,-4.433265395227273,0.03712565159090975 -Re6S8Cl2_2_15126.vasp,Re6S8Cl2,-4.787737905,0.05548517937500019 -Au2O4_14_1504.vasp,Au2O4,-1.6573567266666667,0.4186309585416639 -Sr2Au1S2Br2_38_17127.vasp,Sr2AuS2Br2,-1.8088117528571428,0.12372809999999657 -Sr1Cl2_187_17040.vasp,SrCl2,-2.18238814,0.3151096133333331 -Mn1Sb1S2_1_10861.vasp,MnSbS2,-2.4853601475,0.5773628443750002 -Rb2Hg4Te2Cl6O6_31_14885.vasp,Rb2Hg4Te2Cl6O6,-1.3551759255,0.2375287464999959 -Zr2Si4_129_21691.vasp,Zr2Si4,-4.305046196666667,0.5373119166666669 -Mo2C1O2_164_11583.vasp,Mo2CO2,-5.1491550660000005,0.3652162849999998 -Co2As2S6_162_3846.vasp,Co2As2S6,-2.788286763,0.46368222394736525 -Tl4Ag4C8N8_2_19585.vasp,Tl4Ag4C8N8,-4.48935453375,0.05949413430555228 -Hf4Te4I4_31_7824.vasp,Hf4Te4I4,-2.9187706775,0.11987693041666425 -Pt2S2O8_3_14660.vasp,Pt2S2O8,-3.021484576666667,0.8462679574999994 -Ta2I5_1_17765.vasp,Ta2I5,-1.826706784285714,0.5555802352455337 -Nb1S1F1_156_12558.vasp,NbSF,-4.465691586666667,0.4120514377777731 -Sr4Mn2S6Br2_129_17448.vasp,Sr4Mn2S6Br2,-2.772712220714286,-0.011923752142859456 -P2Pd2O6_162_14020.vasp,P2Pd2O6,-3.959386286,0.6684078985000005 -Se10N10_4_16281.vasp,Se10N10,-3.3871643395,0.6319869598750003 -Ga1Ni1S2Br1Cl1_1_6214.vasp,GaNiS2BrCl,-1.4310205466666668,0.3050729535937459 -Fe2As2I2O4_26_5775.vasp,Fe2As2I2O4,-2.977704385,-0.04290557701667458 -Li2V4Ni2O12_13_10131.vasp,Li2V4Ni2O12,-4.5865465895,0.15443251699999472 -Sc2H2I2_164_16082.vasp,Sc2H2I2,-2.675398283333333,0.019934570277776287 -Ag2Sb4S3Br2_6_410.vasp,Ag2Sb4S3Br2,-1.475274339090909,-0.20948285515151693 -Ge2Sb2S6_28_6856.vasp,Ge2Sb2S6,-2.817348145,0.1640648517916646 -Rh1Se2_164_15170.vasp,RhSe2,-2.30901455,0.3646559566666663 -S6N4_11_15401.vasp,S6N4,-3.540939744,0.24329138462500066 -K2H2C2O6_2_9118.vasp,K2H2C2O6,-4.844006449166667,-0.03409582749999984 -Pd3S1I1Br1O2_1_14506.vasp,Pd3SIBrO2,-1.348526475,0.6228339953124999 -Cu4Se2_25_5469.vasp,Cu4Se2,-0.31138530166666667,0.10431209749999887 -Cr2F10_25_4378.vasp,Cr2F10,-2.51847474,0.02417357000000031 -Li2Fe2Bi2_129_9905.vasp,Li2Fe2Bi2,-0.7615612833333333,0.5350086799999988 -Ag2B4H4Br2N2_2_186.vasp,Ag2B4H4Br2N2,-3.5887690792857145,0.47243597328570663 -Cu4Cl4O4_14_5404.vasp,Cu4Cl4O4,-1.3149280633333333,0.2282222379166653 -Cu3Se2Cl2O6_12_5388.vasp,Cu3Se2Cl2O6,-2.3831732800000003,0.05995789971153348 -Ta2Co4S4_51_17706.vasp,Ta2Co4S4,-3.820291537,0.10210765200000038 -As4O8_31_1338.vasp,As4O8,-4.2506390650000005,0.1905641204166577 -Si1I2_115_16343.vasp,SiI2,-0.9388572966666667,0.37096376194444314 -V1Re1Cl6_5_19904.vasp,VReCl6,-2.32725822625,0.15782308291666403 -Te2Pb1_187_18449.vasp,Te2Pb,-1.0201783466666667,-0.5367612111111115 -Y2H4N2O10_4_20742.vasp,Y2H4N2O10,-5.312258910555555,0.0508055888888892 -Be2F4_2_2254.vasp,Be2F4,-4.165967873333334,0.14035959666666642 -Co1Ni1Te2P1_8_3795.vasp,CoNiTe2P,-1.786447378,0.12059100449999999 -Mn1Fe1Te1Se1_6_10711.vasp,MnFeTeSe,-1.5150432975,0.5593397431249976 -Ni2Sb2Pt2_129_13610.vasp,Ni2Sb2Pt2,-1.083933675,0.19847530444444317 -Ca2Cl2O1_12_2977.vasp,Ca2Cl2O,-3.127434656,0.09654394299999658 -Tl1In1Hg1Se4_156_19296.vasp,TlInHgSe4,-1.0587088085714285,0.02607924690475999 -Fe1B4C2Cl2F4_47_5623.vasp,FeB4C2Cl2F4,-3.9411780853846157,0.3676770758333219 -K2Cd4Se2S6F6_31_9064.vasp,K2Cd4Se2S6F6,-1.3465026105,0.4100295064583327 -Ge2Te4_127_6890.vasp,Ge2Te4,-1.5147710633333331,-0.015348261111112205 -Li1Al1As2Se6_5_9638.vasp,LiAlAs2Se6,-2.506589804,0.2695792198333312 -W2F2_129_20491.vasp,W2F2,-2747.2542571225,-2742.331912289375 -B2Te3_189_1717.vasp,B2Te3,-2.627953958,0.7795116153333336 -Pt1I2_164_14575.vasp,PtI2,-0.14389041333333333,0.3714651716666667 -Tm2Cl2O2_164_19674.vasp,Tm2Cl2O2,-5.064365261666667,0.03285975500000049 -Zr2Te2N1_164_21705.vasp,Zr2Te2N,-4.65286659,0.07284762799999989 -Ge1Te2_115_6718.vasp,GeTe2,-1.77162582,-0.272203017777779 -Zr2Te6As2_2_21717.vasp,Zr2Te6As2,-2.583451681,0.23589271899999464 -Co1Ni1O1F5_38_3785.vasp,CoNiOF5,-1.88767970375,0.2062885489062477 -Hf1Ge2Rh1O8_6_7184.vasp,HfGe2RhO8,-5.125270310833334,0.3534027260416661 -Ti2Pb4_59_18986.vasp,Ti2Pb4,-2.1958238949999997,0.7246469338888866 -Nb2Ir1Se3I1Br1_1_12758.vasp,Nb2IrSe3IBr,-3.0812090375,0.3125661346986536 -Sc2Te2_129_16180.vasp,Sc2Te2,-2.8747676175,0.3320738525000002 -Ta1F2_187_17541.vasp,TaF2,-4.370480976666667,0.9006598206666623 -Zn3N1_191_21207.vasp,Zn3N,0.659470315,0.24534727062499995 -Bi2Pb1S4_164_2498.vasp,Bi2PbS4,-2.4378445385714285,-0.4573961064285734 -Au2O5_21_1505.vasp,Au2O5,-1.2229969628571429,1.036015881071426 -Ta2Ni4Te2S2_51_17804.vasp,Ta2Ni4Te2S2,-2.522686158,0.014906175576921976 -Li3Fe3O4F4_6_10147.vasp,Li3Fe3O4F4,-3.550129627857143,-0.12557074955357764 -Cd1C2N4F6_1_3293.vasp,CdC2N4F6,-3.1701235476923078,0.7329173433974288 -V2W2O10_85_20227.vasp,V2W2O10,-5.739356550714286,0.04492351178570919 -Sr4As4Se8F4_14_17408.vasp,Sr4As4Se8F4,-2.944846258,0.008787996000000353 -Ni2Sb1S2_187_13601.vasp,Ni2SbS2,-1.455725898,0.29032464333333174 -Hf3N2F2_187_7720.vasp,Hf3N2F2,-6.516784374285714,0.38763992071427955 -Ti1I1F1_156_18794.vasp,TiIF,-3.2708807866666665,0.13373037361110562 -Ge2P2Se1S5_8_6812.vasp,Ge2P2SeS5,-3.172862928,0.04415023041145172 -Rb2Cl2F8_127_14833.vasp,Rb2Cl2F8,-1.1255228441666667,0.11657947416666659 -K2Fe2Se4_67_9105.vasp,K2Fe2Se4,-1.3122172775,0.3140545243749999 -Si3As2S9_174_16464.vasp,Si3As2S9,-3.3289804842857142,0.4230536316071394 -Cr1Te8W3_25_4283.vasp,CrTe8W3,-2.6250615875,0.14437341097222234 -Tl1Pd5Cl2_123_19319.vasp,TlPd5Cl2,-0.72388565625,0.6651307299999999 -Na1Sr1Mn2Sb1S1Br1_1_11938.vasp,NaSrMn2SbSBr,-1.5511808042857143,0.4680924839655115 -In1As1_187_8189.vasp,InAs,-1.591581925,-0.277243165 -Zn2Ni1C6N6_12_21124.vasp,Zn2NiC6N6,-5.281356878666667,0.40684624364814254 -Ca3Pb1_25_3197.vasp,Ca3Pb,0.2184689125,0.8437108175 -Sr4Sb4S8F4_14_17469.vasp,Sr4Sb4S8F4,-3.175797046,0.04605789600000021 -Sc6N3Cl1O5_157_16273.vasp,Sc6N3ClO5,-5.867254457333333,0.23563288299999474 -Ca1Sn1S3_25_2883.vasp,CaSnS3,-2.494605098,0.4230688622499973 -Se2N2_129_16287.vasp,Se2N2,-3.20200511,0.817146189375 -V2Se2_129_20187.vasp,V2Se2,-3.1782137775,0.2684385837499965 -Mn1P2F12_2_10835.vasp,MnP2F12,-3.016827652666667,0.02690956600000005 -Sn1Sb1_156_16686.vasp,SnSb,-1.275424425,0.5607049015625001 -Ga2P2_164_6430.vasp,Ga2P2,-2.6674570275,-0.5239320474999998 -Hg1Cl2_164_7849.vasp,HgCl2,0.21788293,0.08764475333333333 -Sn2I6_1_16787.vasp,Sn2I6,-0.24560183,0.186022866354166 -La2Cr2Bi2O12_7_9589.vasp,La2Cr2Bi2O12,-4.965593836666667,0.1824880028935107 -Hf1V1Se1Br1_25_7356.vasp,HfVSeBr,-3.1987351,0.8549344743750003 -Na2Hg4Te2S6Cl6_31_12175.vasp,Na2Hg4Te2S6Cl6,-0.8305047695000001,0.2594230032083327 -K8Fe2_125_9551.vasp,K8Fe2,1.548732717,0.996897721 -Th1Co5_65_18714.vasp,ThCo5,-0.28873136833333335,1.9224023818888862 -Hf2N2Cl2_164_7541.vasp,Hf2N2Cl2,-6.227644608333333,0.013246681666667648 -V2Se6_59_20193.vasp,V2Se6,-2.7624694225,0.10019494949999985 -Ga1_123_6298.vasp,Ga,-1.07274395,0.022155029999999964 -Tl2Cl2_12_19389.vasp,Tl2Cl2,-0.92954395,-0.0020461400000000296 -Na2Tm2S4O16_11_12329.vasp,Na2Tm2S4O16,-4.875887280416666,0.07610352250000041 -Au4Br4O4F4_14_1566.vasp,Au4Br4O4F4,-0.541878878125,0.4760304741145828 -K2S6I2_11_9336.vasp,K2S6I2,-1.369687165,0.23339916262500027 -Cu2Te2_12_5336.vasp,Cu2Te2,-0.1109071525,0.45657338249999996 -Na2As2H8O10_11_11963.vasp,Na2As2H8O10,-4.136376914090909,0.13184260848484497 -Tl2Zn1O4_156_19564.vasp,Tl2ZnO4,-2.3203804985714287,0.24465454392856922 -Fe2Si4O12_12_5991.vasp,Fe2Si4O12,-5.453398948888889,0.06719002486110259 -Cr1Te6P2Au1_5_4281.vasp,CrTe6P2Au,-1.705048011,0.24145364779166523 -Pb4N8_26_14312.vasp,Pb4N8,-4.473678578333334,-0.3417827900000039 -Sr3Au2S4Cl2_123_17353.vasp,Sr3Au2S4Cl2,-1.9973477927272727,0.13801921636363224 -Cr1Mo3O8_25_4214.vasp,CrMo3O8,-5.127822256666667,0.08103450569443993 -Mo2O8_10_11652.vasp,Mo2O8,-4.480787669,0.2928237772499973 -Cr4B3H2S2_164_4590.vasp,Cr4B3H2S2,-3.8578242954545456,0.4849502135908996 -Rb1Pb1S2_156_14748.vasp,RbPbS2,-1.58034601,-0.3542743629166666 -Tl1Cu1As2S6_149_19250.vasp,TlCuAs2S6,-2.1339474540000003,0.46743736185416124 -P1S2_115_13943.vasp,PS2,-2.9507947100000003,0.33292354489582676 -Ge2Sb2H6S6N2_7_6848.vasp,Ge2Sb2H6S6N2,-3.516850167222222,0.15158146943720735 -Mg2Ag2O5_6_10415.vasp,Mg2Ag2O5,-2.7092462511111113,0.00782115180555304 -Nb2S4Cl4_12_12852.vasp,Nb2S4Cl4,-3.400311131,0.050026657000000085 -Al2Sb2_129_956.vasp,Al2Sb2,-2.291596535,-0.74271361 -Hg4O4_55_8084.vasp,Hg4O4,-0.5521412775,0.2187040908333333 -Tb5F8_10_18215.vasp,Tb5F8,-3.725863113846154,0.5296790392307655 -Ba2Tl1Bi2O7_25_2076.vasp,Ba2TlBi2O7,-3.6282055583333332,0.19009671579860854 -Ca2S4I4F8_30_3108.vasp,Ca2S4I4F8,-1.546485798888889,0.6534746391319399 -Ge6Bi6_12_6958.vasp,Ge6Bi6,-2.0711177491666666,-0.7511959391666667 -K2Mg1H4O10_2_9214.vasp,K2MgH4O10,-3.3426840788235292,0.3307474081372449 -Cd1Ag2P2S6_149_3266.vasp,CdAg2P2S6,-2.064898630909091,0.07180794136363611 -B4Se6_1_1768.vasp,B4Se6,-3.50902692,0.29255861666666444 -Mg2H14C10O14_2_10463.vasp,Mg2H14C10O14,-5.2979670675,0.1587899333958287 -In2Ni2Te5_187_8501.vasp,In2Ni2Te5,-0.9033087800000001,0.08923618388888721 -Re2Te2_164_15089.vasp,Re2Te2,-4.086288175,0.47896030250000043 -Au2Cl2O2_59_1465.vasp,Au2Cl2O2,-0.74611822,0.35579901777777767 -Ti2Te6As2_162_19047.vasp,Ti2Te6As2,-2.830881603,0.14035982599999475 -Y4C1I5_10_20811.vasp,Y4CI5,-3.3811152229999997,0.07601274900000021 -Ta2Te4Cl4_12_17914.vasp,Ta2Te4Cl4,-2.737148039,0.17012947306666404 -Zr1Ni1H6_5_21375.vasp,ZrNiH6,-2.86575311,0.8962203800000001 -Ca2Co2Ge2_129_2988.vasp,Ca2Co2Ge2,-1.81524125,0.18012288399999848 -Zr1Mo2O8_164_21331.vasp,ZrMo2O8,-5.6351780281818185,0.06384413909090902 -Tl1H2S2_164_19282.vasp,TlH2S2,-2.363829432,0.21362201193750002 -Ni3P2S8_164_13708.vasp,Ni3P2S8,-2.3854868684615385,0.06694913461538476 -Ag4I8_13_532.vasp,Ag4I8,0.5101462425,0.15140704979166694 -Mn1In1Ir1S3Br2_1_10775.vasp,MnInIrS3Br2,-2.27686062375,0.10440778820312269 -Zr3N2Cl2_187_21771.vasp,Zr3N2Cl2,-5.479840647142857,-0.012812102857148844 -W3N2O2_187_20563.vasp,W3N2O2,-6.282427818571429,-0.1856550501069062 -Ga1Ge1Te1Se1_1_6195.vasp,GaGeTeSe,-2.2480516825,-0.254967303125 -B1I3_189_1625.vasp,BI3,-1.104902635,0.12638297874999993 -Mn1As2F12_2_10635.vasp,MnAs2F12,-2.5193536166666664,-0.06590556366666867 -P4Au4S4_29_14073.vasp,P4Au4S4,-1.9610130833333335,0.17777332249999978 -Fe2Cl6_1_5840.vasp,Fe2Cl6,-1.0821720075,-0.04432428437500002 -Zr1Nb1S1Cl2_156_21350.vasp,ZrNbSCl2,-3.8767766000000004,0.16308412649999404 -Hf1Ni1I6_149_7248.vasp,HfNiI6,-0.84976477625,0.12219942937499992 -Mn1Sb2Te4_164_10874.vasp,MnSb2Te4,-1.70722806,0.14088227666666464 -Nb1O2_187_12553.vasp,NbO2,-6.58999013,0.3955200762500004 -Sc2Te2Br2_59_16173.vasp,Sc2Te2Br2,-2.6712724883333334,0.07442069277777508 -Ta2As2Se6_2_17649.vasp,Ta2As2Se6,-3.6314418080000004,0.2683596526666636 -Ru1S1F1_8_15287.vasp,RuSF,-2.941781333333333,0.24153567833333 -Al2Cr1S4_164_814.vasp,Al2CrS4,-3.4756276714285717,0.22324946719779376 -Ge2Sb2Te6_143_6858.vasp,Ge2Sb2Te6,-1.7478106119999999,-0.0821826693333349 -Ge2Pb2S12O42_2_6817.vasp,Ge2Pb2S12O42,-4.317377430172414,0.018943507413792915 -Mn1W1I1Br1N3_8_10931.vasp,MnWIBrN3,-3.9780431257142856,0.18604522392856904 -Ir4S8_2_8864.vasp,Ir4S8,-3.30015102,-0.21079608666666694 -Mn1Cd1Se2_8_10663.vasp,MnCdSe2,-0.98438329,-0.03189025685345037 -Si4H4S10_4_16492.vasp,Si4H4S10,-3.491885166111111,0.1728865202777743 -Zn2Cu2H6Cl2O6_11_21070.vasp,Zn2Cu2H6Cl2O6,-2.8717766138888887,0.09828731206017724 -Hf1Os1Se2I2_6_7254.vasp,HfOsSe2I2,-2.927140395,0.3869773395833306 -In2Ni2Se5_156_8499.vasp,In2Ni2Se5,-1.4012408388888888,0.055012222222220575 -Os8Se10_1_13899.vasp,Os8Se10,-3.2618175205555553,0.6734415144444399 -Zr2P1S2_164_21622.vasp,Zr2PS2,-5.019322084000001,0.010470849249999858 -Sn2N6_164_16793.vasp,Sn2N6,-4.8131333,-1.3146762043749995 -V2Br10_2_19997.vasp,V2Br10,-1.1133240291666666,0.05047559916666633 -Sn2Se2I2_59_16879.vasp,Sn2Se2I2,-1.2617136016666668,0.16910751722222206 -Sb2Br2_129_15551.vasp,Sb2Br2,-1.055999055,0.43774904999999875 -Cu2B4I2N2F4_2_5036.vasp,Cu2B4I2N2F4,-3.635881140714286,0.28415399230157357 -Os2Se2_67_13887.vasp,Os2Se2,-2.7553859825,1.3751919400000001 -Yb2Cl6_12_20866.vasp,Yb2Cl6,-2.8950608375,-1.0169336193749998 -Fe1Te2_115_5766.vasp,FeTe2,-0.74435689,0.8838950249999998 -Cs2Hg4Se2Br6O6_31_4735.vasp,Cs2Hg4Se2Br6O6,-1.2805580195,0.10053157966666657 -Sn2P2H2O6_7_16810.vasp,Sn2P2H2O6,-4.6231300724999995,0.05331811716269061 -Bi4W2_2_2659.vasp,Bi4W2,-2.4054168716666666,0.2449975149999979 -V2Se2_164_20189.vasp,V2Se2,-3.2339985175,0.21265384374999652 -Nb4Fe2Se10_59_13070.vasp,Nb4Fe2Se10,-3.471033878125,0.06671608687500052 -Ca1Te2F2_1_2893.vasp,CaTe2F2,-1.608693794,1.3262694866666669 -Ta4F16_14_18035.vasp,Ta4F16,-4.2597761499999995,0.2880170487999999 -V1Ag1Sb2Te6_5_19761.vasp,VAgSb2Te6,-1.4216429529999999,0.27442537544444334 -Nb1Se2_10_12577.vasp,NbSe2,-3.49778952,0.7580794875000003 -Cd1H8C10Br2N2_47_3360.vasp,CdH8C10Br2N2,-5.243527926521739,0.09405692369564989 -W3O8_10_20565.vasp,W3O8,-5.872173956363636,0.32736150306121786 -Mn1W1Br2_156_10929.vasp,MnWBr2,-2.07642779,0.6399495456250002 -Ni2Bi2Br2O4_10_13464.vasp,Ni2Bi2Br2O4,-2.061613931,0.3179474790000002 -In2H14N4_10_8460.vasp,In2H14N4,-3.8250816254999997,-3.2993711985000047 -Mn2P4O14_2_11205.vasp,Mn2P4O14,-5.2063540405,0.101784600187492 -Cu1Au1Br2_5_4837.vasp,CuAuBr2,0.16069978,0.30656596208333287 -Na4C1S4_5_12374.vasp,Na4CS4,-2.640137942222222,0.367293547777775 -Zr2I2_12_21593.vasp,Zr2I2,-2.47467188,0.057378137500000426 -Mn2As2S4Cl2_26_10973.vasp,Mn2As2S4Cl2,-2.579954766,0.17099939362499994 -Zr2S2Cl2_59_21644.vasp,Zr2S2Cl2,-4.0100225583333335,0.03835018833333326 -Sr2Br2_129_17153.vasp,Sr2Br2,-0.697555715,0.76445735 -Ca1Br2_164_2811.vasp,CaBr2,-1.8452405066666666,0.08489315666666686 -Mn3Cr1Se1S2Br3O1_1_11374.vasp,Mn3CrSeS2Br3O,-2.547666431818182,-0.05534594416667338 -Pa2N4_123_14166.vasp,Pa2N4,-7.5923621416666665,0.4032635744444377 -Zn1W2O5_38_21024.vasp,ZnW2O5,-4.8424305675,0.2953503174744842 -Ba2Cu1S2I2_38_1969.vasp,Ba2CuS2I2,-1.9755262957142856,0.04507124400297219 -Re2F2_129_15043.vasp,Re2F2,-3.1986151075,1.7945496058333275 -Sb4O6_81_15785.vasp,Sb4O6,-4.073814623,0.18367584450000063 -Ti4Zn4F20_14_19171.vasp,Ti4Zn4F20,-3.2296465189285715,-0.05019693654762182 -Tl4Pt2C8N8_14_19618.vasp,Tl4Pt2C8N8,-5.376368178181818,-0.1777546948484933 -Li2Cd2P2O8_11_9855.vasp,Li2Cd2P2O8,-4.227770849285714,0.18866707071428568 -Ag2P4Se3Br2_6_363.vasp,Ag2P4Se3Br2,-1.8744372227272728,0.13242681846590454 -Cs2Cd4O8F6_31_4685.vasp,Cs2Cd4O8F6,-1.6761123269999998,0.4604864230416672 -Nb2O5_12_12798.vasp,Nb2O5,-6.6602381657142855,-0.19306316089285963 -In1Ag1Te6As2_149_8186.vasp,InAgTe6As2,-1.3120540200000002,0.263476520666665 -I8O20_14_8169.vasp,I8O20,-2.449495819642857,0.10461834178571472 -Al2Fe2O5_187_833.vasp,Al2Fe2O5,-5.003763157777778,-0.02592143064815322 -Ti4S4I4_7_19160.vasp,Ti4S4I4,-3.7518526333333333,-0.07522114187500817 -Ge2Te5As2_164_6891.vasp,Ge2Te5As2,-2.208556487777778,-0.3840740038888907 -Li4P4O8_14_10213.vasp,Li4P4O8,-4.994079289375,0.21931268602499104 -K2Te2C2S6Cl6_1_9367.vasp,K2Te2C2S6Cl6,-1.9961945138888888,0.512044526273146 -Ni1As2_123_13257.vasp,NiAs2,-1.8852540933333335,0.24971149250000013 -Pr4B2C2_12_14556.vasp,Pr4B2C2,-4.83866287375,0.2432152925000004 -K2Y1Te2_164_9390.vasp,K2YTe2,-1.91035808,0.14385423166666295 -Na2C2F4_67_11996.vasp,Na2C2F4,-2.74525456875,0.9112081031249997 -Rh2I2_129_15196.vasp,Rh2I2,-0.583111785,0.8553160099999986 -Na2Ni1H2_123_12232.vasp,Na2NiH2,-1.301737146,0.9930589940000001 -Nb2B1Se2_164_12636.vasp,Nb2BSe2,-5.26115661,-0.22834174250000316 -Tl2Se2_12_19532.vasp,Tl2Se2,-1.121175175,0.17870446604166657 -Ni2S4_59_13597.vasp,Ni2S4,-1.5481137433333334,0.29549684708333124 -Fe2As2S5_8_5783.vasp,Fe2As2S5,-2.6410768355555554,-0.19677954343750304 -Cr2P2O10_85_4447.vasp,Cr2P2O10,-5.215385339285715,-0.05175864815476511 -Ga1Cu1As2O6_149_6159.vasp,GaCuAs2O6,-3.614332458,0.5598815506249961 -Cd1Cl2_187_3302.vasp,CdCl2,-0.22025186,0.18414249333333335 -Co2Bi1Te2_187_3861.vasp,Co2BiTe2,-1.502003428,0.1145037166666667 -Nb2Se2_187_12876.vasp,Nb2Se2,-4.2307315225,0.010667432250000441 -Sn3O6_5_16919.vasp,Sn3O6,-3.8856542811111114,0.4755650138888883 -Cu2Sb4Te3Br2_6_5284.vasp,Cu2Sb4Te3Br2,-1.0871621227272728,0.6257570918181785 -Si2_164_16462.vasp,Si2,-3.47139981,-0.48125076 -Mn2H2S2_59_11095.vasp,Mn2H2S2,-2.7551861950000003,0.8250911983333298 -Zr1S2_187_21418.vasp,ZrS2,-4.51380607,0.2850644974999996 -Ag4Te4I4_14_575.vasp,Ag4Te4I4,-0.04556064083333333,0.246719074722222 -Cu2O2_10_5200.vasp,Cu2O2,-1.8349594125,0.637829085625 -Lu2I2O2_129_10312.vasp,Lu2I2O2,-4.45577725,0.03575699000000032 -Ba2Ag1Te2Cl2_38_1894.vasp,Ba2AgTe2Cl2,-1.5271090271428573,0.4400052787127932 -Sr2P4H8O12_2_17293.vasp,Sr2P4H8O12,-4.885497428076923,0.04374779302242199 -Rh2S2_129_15222.vasp,Rh2S2,-2.571834575,0.43491072489130145 -Sb4As2H2S12_4_15761.vasp,Sb4As2H2S12,-2.6798839155,0.34855534943749755 -Tl2Se5_1_19540.vasp,Tl2Se5,-1.3511776985714286,0.17259449428571427 -Yb2Br2O2_129_20862.vasp,Yb2Br2O2,-4.8237749249999995,-1.1933042250000025 -Na2B2S4O16_13_11985.vasp,Na2B2S4O16,-4.782341372083333,-0.047958445416666606 -Mg1I2_187_10379.vasp,MgI2,-0.64296862,0.21878562666666668 -Sc2Cl2O2_129_16060.vasp,Sc2Cl2O2,-3.6409371866666667,1.3455881516666666 -Bi2Te2_2_2568.vasp,Bi2Te2,-1.214765405,0.3050715949999998 -Cr1S1Br2_47_4239.vasp,CrSBr2,-1.734054855,0.02417315244791543 -Co1O2F2_164_3801.vasp,CoO2F2,-2.1180386980000003,0.6136615579999998 -P1Se2_115_13949.vasp,PSe2,-2.3688411366666666,0.44644537756944225 -Na1As2Pd1S6_149_11821.vasp,NaAs2PdS6,-2.45845129,0.4737857993437474 -Tl2S2I2_59_19502.vasp,Tl2S2I2,-0.7926443416666666,0.3721257964583323 -Ta4Cr2S12_14_18033.vasp,Ta4Cr2S12,-4.699060975,0.06929848611110678 -Re6S8F2_2_15127.vasp,Re6S8F2,-4.957479385,-0.004135088541672438 -Ca1Ag2S8_89_2798.vasp,CaAg2S8,-1.9430743618181816,0.13453136874999672 -B4Au2N2Cl2F4_2_1747.vasp,B4Au2N2Cl2F4,-3.607496512142857,0.7366335709523704 -Ge2I2O2_59_6780.vasp,Ge2I2O2,-2.7141013266666665,0.3376274104166668 -Fe6Se8_11_6098.vasp,Fe6Se8,-1.7847764050000001,-0.007755315714287669 -W4C3_164_20581.vasp,W4C3,-6.381439967142858,0.30257157285713565 -K2C2S2O6F6_4_9021.vasp,K2C2S2O6F6,-3.732928671111111,0.07068763516202903 -Ho1Cu2S2_164_8115.vasp,HoCu2S2,-2.086689996,0.8660364740000004 -U2F12_2_19707.vasp,U2F12,-4.346045296428572,0.0553953560714282 -Li2V2F10_85_10119.vasp,Li2V2F10,-3.3366951435714287,0.04599257976189852 -Ge1S2_164_6700.vasp,GeS2,-3.0317783333333335,0.12573969770833315 -B2Se3_189_1712.vasp,B2Se3,-3.471815394,0.32977014266666455 -K2Sb6O10_7_9345.vasp,K2Sb6O10,-3.864549067777778,0.12287533694444042 -Pt2N4O12_14_14639.vasp,Pt2N4O12,-4.152449040555556,0.16547471666666214 -Mn1W1Cl4_1_10930.vasp,MnWCl4,-2.15629619,0.2617026266666629 -K4V4O4F12_11_9527.vasp,K4V4O4F12,-3.5686394220833333,0.0019273315624965814 -P2Ru2O6_8_14042.vasp,P2Ru2O6,-4.650087327,0.5801420716666623 -Sr4Ga2Sb4O14_4_17441.vasp,Sr4Ga2Sb4O14,-4.310244924166667,0.2032136646874918 -Mo2O2_6_11646.vasp,Mo2O2,-4.02894291,1.29729510125 -Fe1Ge2_123_5682.vasp,FeGe2,-2.0291155733333333,0.21034256166666454 -Li4V1Te3O12_3_10236.vasp,Li4VTe3O12,-4.0994356465,0.2186054871250005 -Ca2Cl4_2_2982.vasp,Ca2Cl4,-2.057667095,0.17056404333333353 -Ba1Fe8As2_123_1832.vasp,BaFe8As2,-0.13899459818181817,1.93334539181818 -Mo12I24_127_11483.vasp,Mo12I24,-1.2481996938888889,0.08660496666666684 -Pd4_164_14526.vasp,Pd4,-0.09790755,1.55003929 -Pb4Se4O16_14_14321.vasp,Pb4Se4O16,-3.538034530833333,0.1489810179166673 -Ta2I2O2_59_17756.vasp,Ta2I2O2,-4.742986578333333,0.3728690021666623 -Cd2Au2Se2I2_26_3464.vasp,Cd2Au2Se2I2,0.2169189875,-0.0013802473216666805 -Mn1H2O2_156_10762.vasp,MnH2O2,-3.871094008,0.9217706620000001 -Te2W2_164_18535.vasp,Te2W2,-3.2785418925,0.7595083637500002 -Yb2I6_2_20879.vasp,Yb2I6,-1.5589248775,-0.43844525453125005 -In18Se9_143_8173.vasp,In18Se9,-1.3989618637037038,0.7135127512962943 -Cr1H1O2_156_4183.vasp,CrHO2,-4.54359485,0.07725179500000046 -Rb2Cd4Se2Cl6O6_31_14816.vasp,Rb2Cd4Se2Cl6O6,-1.679030597,0.006188110249999573 -Ag4Te2_4_571.vasp,Ag4Te2,0.19212057500000002,0.14503524666666667 -Ga3Ni1S8_6_6529.vasp,Ga3NiS8,-2.3023990091666664,0.31143766960937314 -P6Pb6_12_14140.vasp,P6Pb6,-2.03958841,0.6797345082142838 -Li4H8C10O14_13_10198.vasp,Li4H8C10O14,-5.435624597777778,0.2050413631481356 -Ti6O6_129_19183.vasp,Ti6O6,-7.1820572049999996,0.0551599583333342 -Pd1Br2_115_14346.vasp,PdBr2,-0.08857073666666666,0.4829247266666667 -Mg2As2Se6_162_10424.vasp,Mg2As2Se6,-2.265573072,0.20281942583333115 -Ho2Co2Sn4_59_8136.vasp,Ho2Co2Sn4,-1.6342754775,0.44099104166666514 -Li1Cr1O2_156_9682.vasp,LiCrO2,-4.299985005,0.5763643612500005 -Sr4Bi4Se8Cl4_14_17411.vasp,Sr4Bi4Se8Cl4,-2.2121155420000003,0.0660787505 -In1Ni1Se1Cl5_1_8284.vasp,InNiSeCl5,-0.900118245,0.2249237916666666 -Mn2B1H2_164_10995.vasp,Mn2BH2,-3.2833358259999996,0.5822508760000005 -Nb1Cu1Cl2O2_6_12495.vasp,NbCuCl2O2,-3.618755325,0.2402757796874953 -Eu2Br4O2_59_5599.vasp,Eu2Br4O2,-3.057228205,-0.44917143882812494 -Cr1B4H4S6F1_2_4119.vasp,CrB4H4S6F,-3.724504378125,0.6438116606770792 -Ir2S3I1Br2_1_8827.vasp,Ir2S3IBr2,-1.86592093375,0.14773127218749993 -Al2H10C4F4_10_854.vasp,Al2H10C4F4,-4.1698985925,0.4154239786666629 -In2Te1S1I1Br1_1_8610.vasp,In2TeSIBr,-1.2082500083333334,0.21383633750000003 -Al2Si2Se6_162_987.vasp,Al2Si2Se6,-3.0962368949999997,-0.06397574490625255 -Li1Mn1Nb1Si1Te4Br2_1_9745.vasp,LiMnNbSiTe4Br2,-2.202536193,0.39352563749999747 -Hf1Mn1S2Br2_1_7222.vasp,HfMnS2Br2,-3.0926149966666667,0.2696008320833334 -Nb1Ir1S4_10_12531.vasp,NbIrS4,-4.058299188333334,-0.3703642000000005 -Nb2Fe2Te6_11_12720.vasp,Nb2Fe2Te6,-2.301777439,0.43803727816666527 -Li1Ir1O4_1_9740.vasp,LiIrO4,-3.8395685116666667,0.24295329604166316 -Ba3N3_25_2118.vasp,Ba3N3,-2.602733171666667,1.3232229949999998 -Ba3Sb3_25_2126.vasp,Ba3Sb3,-1.3239948283333334,0.9593638933333333 -V13Se26_2_19745.vasp,V13Se26,-3.1047040779487176,0.041899640384615466 -Ag2N2O4_5_332.vasp,Ag2N2O4,-3.29751340125,0.023817065208331267 -Nb4H2C3O2_164_13083.vasp,Nb4H2C3O2,-6.601715579090908,0.18701535261363222 -Nb2Br1N1Cl1O1_8_12644.vasp,Nb2BrNClO,-5.25051714,0.0345908508333288 -In4Se6_31_8696.vasp,In4Se6,-1.9746313199999999,0.009690106000000087 -Hg1I2_164_7880.vasp,HgI2,0.9218042466666666,0.04892398944444443 -Hf1Ti3O8_1_7341.vasp,HfTi3O8,-7.035007794166667,0.35975657416666706 -Nb2Br2N3_6_12648.vasp,Nb2Br2N3,-5.39328234,0.041892678728562505 -Ca4P2_59_3232.vasp,Ca4P2,-1.7377009133333334,0.5019907649999986 -Cs2Te2H6N2O6_1_4793.vasp,Cs2Te2H6N2O6,-3.7675694716666666,0.07312136704544936 -Co2H4S2O8_4_3915.vasp,Co2H4S2O8,-4.025991524375,0.09327754818749479 -Pd1Se1_156_14389.vasp,PdSe,-1.00753822,0.7193174924999999 -Ga1Au1Se2Cl2_1_6139.vasp,GaAuSe2Cl2,-1.2162363116666668,0.27404326069444285 -Ba4Sb4Se8Cl4_14_2183.vasp,Ba4Sb4Se8Cl4,-2.5012565835,0.08275468362500038 -Sc1S1F1_25_15985.vasp,ScSF,-4.176801476666667,0.14951631694444023 -Na2B2Te2C2_31_11987.vasp,Na2B2Te2C2,-3.0048442575,1.2957803100416656 -Li2H10C6O6_4_9927.vasp,Li2H10C6O6,-5.16924042625,0.10218628927082718 -Pb1Cl2_164_14179.vasp,PbCl2,-1.4921966,-0.20624421833333328 -Hg4Te4_1_8093.vasp,Hg4Te4,0.60075594375,0.12478892208333331 -V2F10_1_20055.vasp,V2F10,-3.0315123649999998,0.08204707979166681 -Re1Br2_187_14996.vasp,ReBr2,-799.9562596466667,-797.0981474892593 -Nb2H2C1O2_164_12730.vasp,Nb2H2CO2,-5.921828717142858,0.27505303063774367 -Ni1C6Cl2F4_47_13300.vasp,NiC6Cl2F4,-4.06156783,0.4066710399999924 -Sr5La1_1_17489.vasp,Sr5La,0.4279837766666667,1.111405016666665 -V1Te8Mo3_25_19948.vasp,VTe8Mo3,-2.1880296466666667,-0.013048694722222254 -Mn1Cl4_123_10666.vasp,MnCl4,-0.8707942259999999,0.42150279700000026 -Sb6Pt3_147_15858.vasp,Sb6Pt3,-2.1467808522222223,0.550889604444444 -Al1Ni1Pt2S4Br3Cl1_6_690.vasp,AlNiPt2S4Br3Cl,-1.8376118658333331,0.10964581256944261 -Hf4N3_164_7797.vasp,Hf4N3,-7.5290447857142855,0.4225414410714219 -Ta3C2_187_17953.vasp,Ta3C2,-7.735297426,0.749606021499992 -Ta2Se2N1_164_17873.vasp,Ta2Se2N,-6.070498784,0.24111067166666755 -Al2Fe1O4_164_825.vasp,Al2FeO4,-5.344685995714285,0.04233184244047361 -Sr3Fe2Br2O5_123_17373.vasp,Sr3Fe2Br2O5,-3.4964750625,0.00825733479166324 -Bi1Pt3Se6_157_2362.vasp,BiPt3Se6,-1.885622218,0.3338359036499978 -In2As2S6_149_8375.vasp,In2As2S6,-2.223875552,0.7981921037499999 -Ag1Au1Br4_1_5.vasp,AgAuBr4,0.15959290166666668,0.09739928333333334 -Nb3B2H2S2_187_12946.vasp,Nb3B2H2S2,-5.200940712222223,0.4789913761110993 -Cr2Sb2Se6_162_4484.vasp,Cr2Sb2Se6,-2.26773412,0.294658321 -Cd1S2_164_3416.vasp,CdS2,-0.7455563000000001,0.6213477739583321 -S2N2_2_15383.vasp,S2N2,-4.0434453,0.032372410937500096 -Tc2Br6_12_18224.vasp,Tc2Br6,-2.26480291625,0.028123826875000257 -Te2Au4_191_18377.vasp,Te2Au4,0.29473950666666665,1.0796081683333327 -Ag2Pb8Cl2O8_85_367.vasp,Ag2Pb8Cl2O8,-2.609870441,0.10475254718749806 -Ba1Cu2O8_89_1826.vasp,BaCu2O8,-2.9006892763636363,0.2622872004545431 -Al2Cd1O4_164_784.vasp,Al2CdO4,-4.575318609999999,0.2355147930952386 -Re1Ir2Rh1Se8_1_15009.vasp,ReIr2RhSe8,-2.965943730833333,-0.08054176666666657 -Nb2Pd4Se2S2_51_12818.vasp,Nb2Pd4Se2S2,-2.9210511390000002,0.22694045896295523 -Ag2As4Se3Cl2_6_170.vasp,Ag2As4Se3Cl2,-1.650523588181818,1.1885817546969646 -Zr2S2I1Cl1_6_21647.vasp,Zr2S2ICl,-3.729770935,0.048832464166663314 -In1_123_8370.vasp,In,-0.21476176,2.31583136 -Ta1Cr1Te2_156_17536.vasp,TaCrTe2,-3.2829946275,0.19802341765624742 -Al1Ni5Cl2_123_697.vasp,AlNi5Cl2,-0.29243137125,1.2723931595833322 -Mg1B1H1_6_10338.vasp,MgBH,-2.504172233333333,0.8799046633333338 -Te4Mo2_11_18593.vasp,Te4Mo2,-2.21811506,-0.10722081000000028 -Tl1Cu1Sb2Te6_149_19258.vasp,TlCuSb2Te6,-1.023377752,0.36301977599999846 -V1Mo1Cl6_12_19877.vasp,VMoCl6,-1.91111600625,0.10772993791666674 -Ge4Sb4S4_17_6944.vasp,Ge4Sb4S4,-2.7908326533333336,-0.5288783933333355 -Ag1Te1Se1_6_143.vasp,AgTeSe,-0.6380676200000001,0.29073926333333244 -Ta6Se18_11_18152.vasp,Ta6Se18,-3.976614667916667,0.07319404770833282 -Rb2H6C2Se2O6_4_14852.vasp,Rb2H6C2Se2O6,-3.851737083888889,0.5058895681110973 -Na4I2_51_12396.vasp,Na4I2,-0.6187356016666666,-0.11606935833333376 -Zr1Cl2_187_21277.vasp,ZrCl2,-3.13892279,0.040285949999999904 -In1F2_115_8245.vasp,InF2,-2.0642239066666668,0.4468781799999997 -Ti2N1O2_164_18966.vasp,Ti2NO2,-7.549843604,-0.04097855899999914 -V2Br6_162_20009.vasp,V2Br6,-1.49500982375,0.2106503262499999 -Mn1Mo1Se1Br1O1_25_10799.vasp,MnMoSeBrO,-3.00161939,0.09613268802586061 -Au4S4Cl4F4_2_1584.vasp,Au4S4Cl4F4,-0.929277405625,0.16594268301562498 -K2Pt1S2_47_9306.vasp,K2PtS2,-1.304929488,0.625045418 -Al2Te2_187_1011.vasp,Al2Te2,-2.2197962025,0.08595598500000001 -Ba1Sn4O8_162_1862.vasp,BaSn4O8,-3.898148372307692,0.44008032365384264 -Zr2H2C1O2_164_21576.vasp,Zr2H2CO2,-5.66466139,0.4458207971428454 -Xe1O2F2_38_20599.vasp,XeO2F2,-0.211126668,1.0226999024999999 -Y2I2_129_20745.vasp,Y2I2,-2.3153279275,0.5399072633333311 -Zn4I8_25_21222.vasp,Zn4I8,0.42637057,0.10969273208333336 -Ta1As1Br2_6_17505.vasp,TaAsBr2,-2.9902117775,0.4337782937500003 -Ti2Br8_1_18907.vasp,Ti2Br8,-2.248879424,0.019402579999999947 -Cd2Te6P2_147_3601.vasp,Cd2Te6P2,-1.095152343,-0.004989145333334943 -Ca3Cu2S4I2_123_3171.vasp,Ca3Cu2S4I2,-1.8943324663636363,0.019312533696966283 -Fe2Br8_14_5824.vasp,Fe2Br8,-0.47809072199999997,0.1407572605 -Bi1Br3_187_2322.vasp,BiBr3,-0.54460598,0.4467276862499999 -Ba1Br2_187_1814.vasp,BaBr2,-1.8711257766666665,0.3466339133333334 -Cr2O4_59_4440.vasp,Cr2O4,-4.921117978333333,-0.10312212395833686 -Ga1Sn1Au2Se1S3Cl4_1_6283.vasp,GaSnAu2SeS3Cl4,-1.35620526,0.22336375203124748 -Te3O6_1_18550.vasp,Te3O6,-3.49779174,0.15544847625000013 -V2N2Cl2_59_20113.vasp,V2N2Cl2,-4.509799625,-0.14771287694444935 -Zr1Se1I2_25_21440.vasp,ZrSeI2,-2.196159125,0.2648680292708334 -Ta2Ge2As2_129_17739.vasp,Ta2Ge2As2,-4.733502108333333,-0.09497835833333701 -Y6Ru1I10_2_20846.vasp,Y6RuI10,-2.596556259411765,0.09225508039215091 -Tl1Fe1I2_1_19265.vasp,TlFeI2,-0.2134411975,0.34795488562499843 -Pt3Se4_10_14695.vasp,Pt3Se4,-1.6734979357142856,0.5339220564285695 -Si1F2_164_16330.vasp,SiF2,-2.8721337333333334,0.8347675724999969 -K1N1O3_187_8922.vasp,KNO3,-3.947286076,0.22389705174999985 -Na2Zr1H6O6_147_12342.vasp,Na2ZrH6O6,-4.589987952666666,0.062319528500000665 -Ta3Pt3Se14_6_17980.vasp,Ta3Pt3Se14,-3.2465194095000003,0.09221977212498966 -V2Te6_59_20224.vasp,V2Te6,-1.95290297125,0.21547426125000002 -Si4Ag12O14_13_16482.vasp,Si4Ag12O14,-2.8616847066666664,0.08483654366666649 -Hf1Mn1Ir2Se3S1Br4_1_7219.vasp,HfMnIr2Se3SBr4,-2.5739541658333334,-0.0013667173674329902 -Ca1Cu2H12_115_2827.vasp,CaCu2H12,-2.165561353333333,1.8062304043333304 -Ba3Mn2Cl2O5_123_2114.vasp,Ba3Mn2Cl2O5,-3.9737897825000004,0.06745487657925164 -Li2Mg1Te2H4O8_2_9976.vasp,Li2MgTe2H4O8,-4.098624497647059,0.09625088081698574 -Sn2Te2_164_16894.vasp,Sn2Te2,-1.4810302075,-1.4453022274999998 -As6Pd3_157_1390.vasp,As6Pd3,-2.2699974633333335,0.6126527433333329 -O1_123_13789.vasp,O,-1.76336586,1.59379793625 -Sn2Se6_4_16887.vasp,Sn2Se6,-1.8624059925,0.3241452558333333 -Hf2Se1S1Br2_25_7596.vasp,Hf2SeSBr2,-4.02930798,0.02519261749999746 -Nb3S2N2_187_13005.vasp,Nb3S2N2,-6.472060285714286,0.18039810595237427 -Nb4Si2Se8_55_13156.vasp,Nb4Si2Se8,-4.235644049285715,0.031018832132927998 -Zn8S2O26_2_21240.vasp,Zn8S2O26,-2.6536757802777777,0.4492885730555499 -Tl1Ni2_187_19304.vasp,TlNi2,1.6455286966666665,2.4947560566666658 -Si2Se2_59_16451.vasp,Si2Se2,-2.936025685,0.15558041515624998 -Sr2Pb4Cl12_2_17298.vasp,Sr2Pb4Cl12,-1.7932039050000002,0.05698100388888716 -Sr1F2_115_17045.vasp,SrF2,-3.225210243333333,0.5883064266666671 -W3C2O2_187_20558.vasp,W3C2O2,-6.433952138571429,0.03987858227404584 -Co3Sb1O8_164_4068.vasp,Co3SbO8,-3.936693239166667,-0.38138952890625333 -Pt2I6_162_14635.vasp,Pt2I6,-0.1274687675,0.2009222879687498 -K2Sn1H6S6_147_9351.vasp,K2SnH6S6,-2.730563426666667,0.05082844149999988 -In8Se6_31_8720.vasp,In8Se6,-1.6047762414285713,0.38823594357142643 -Hg2Pd4Se6_164_7987.vasp,Hg2Pd4Se6,-0.9147394816666666,0.2704860708333333 -Rh2S2_164_15224.vasp,Rh2S2,-2.6072747475,0.39947055239130147 -Zr2Br2N1F1_1_21518.vasp,Zr2Br2NF,-4.102087625,0.3306653464583289 -Hf2Sb2S6_12_7586.vasp,Hf2Sb2S6,-4.098443459,0.25351727916666456 -As2Ru2Se6_162_1288.vasp,As2Ru2Se6,-2.6536496759999997,0.35335170479999767 -Ga2Ni2S5_156_6405.vasp,Ga2Ni2S5,-2.1830364455555555,0.07467817037036834 -Ga2Te4_14_6518.vasp,Ga2Te4,-1.1339737316666667,0.6964980579999982 -Sb2Te2Se1_164_15722.vasp,Sb2Te2Se,-1.95685718,0.08076091600000002 -Fe2P2O7_10_5911.vasp,Fe2P2O7,-4.613255871818182,0.5436680627272725 -Fe2P2Pd2_129_5912.vasp,Fe2P2Pd2,-1.89410856,0.4066903799999999 -Hg1Te1Au1I1_3_7917.vasp,HgTeAuI,0.662858715,0.5453864381770833 -Zn5Cl2O6_164_21236.vasp,Zn5Cl2O6,-1.3974662284615387,0.6127260082211495 -Zr1Sb2_164_21427.vasp,ZrSb2,-3.0436257566666662,-0.7010927591666665 -Mn2Sb4S8_26_11263.vasp,Mn2Sb4S8,-2.668802300714286,0.3133048024999974 -Al2Cl4_6_794.vasp,Al2Cl4,-1.970295825,0.32971071888888676 -Cr2W2O8_25_4538.vasp,Cr2W2O8,-5.586564760000001,0.031225442083322008 -Zr2Te2P1_164_21707.vasp,Zr2Te2P,-4.086082506,0.06164203999999973 -In4P4_127_8681.vasp,In4P4,-1.86885791125,-0.2169502512499999 -Zn3Bi1_187_21202.vasp,Zn3Bi,1.747157785,0.06631408375000003 -Rb2Ru2I8N2O4_7_14926.vasp,Rb2Ru2I8N2O4,-2.046945631111111,0.28665939611110924 -H1Pb1S1O1_1_6984.vasp,HPbSO,-3.0193212375,-0.291376283333333 -Ni1As1O3_8_13254.vasp,NiAsO3,-3.175470462,0.2195909872499956 -Ta4N3_164_18062.vasp,Ta4N3,-7.723380731428572,0.8790611785714204 -In2I6_1_8483.vasp,In2I6,-0.24645114625,0.14706524750000002 -Mn2Te4Mo1Se1_6_11320.vasp,Mn2Te4MoSe,-1.73646532875,0.36956778796874995 -Cu4Te2_51_5483.vasp,Cu4Te2,0.029577933333333334,0.4615657441666659 -Cr2Sb2_2_4487.vasp,Cr2Sb2,-2.224099745,1.5181751262499998 -Cd1In1Ga1Te4_156_3372.vasp,CdInGaTe4,-1.00088474,0.12732344000000007 -Rb2Li2S2_129_14897.vasp,Rb2Li2S2,-2.1999749433333333,0.028316331666666805 -Sc2As2Se6_157_16029.vasp,Sc2As2Se6,-3.042423077,0.23510697349999998 -Sr4Fe2Cl2O6_129_17433.vasp,Sr4Fe2Cl2O6,-3.765190877857143,0.029459399999999913 -Pt2Se2_187_14682.vasp,Pt2Se2,-1.5608210225,0.6144800299999998 -Na2Ta2I12_4_12312.vasp,Na2Ta2I12,-1.30058112875,-0.08774446046874984 -Fe1Cu1S2_156_5669.vasp,FeCuS2,-1.522547225,0.3266505112499998 -Nb1N2_164_12539.vasp,NbN2,-6.794750823333334,0.480364466999994 -W2C3_187_20479.vasp,W2C3,-6.4691394,0.4568688299999917 -Ge2As2Se6_147_6742.vasp,Ge2As2Se6,-2.458028869,0.18720483299999713 -Br8N2_1_2714.vasp,Br8N2,-0.681821628,0.41975642450000017 -Ti1Cl2_164_18758.vasp,TiCl2,-3.5487351733333337,0.15887789750000003 -Sr2Ag1Se2F2_38_17111.vasp,Sr2AgSe2F2,-1.9841887571428571,0.6404810870238047 -Mn4S2Br2N3Cl1_1_11449.vasp,Mn4S2Br2N3Cl,-3.1663179866666664,0.1405797450347137 -Rh2Se1S1Br2_1_15231.vasp,Rh2SeSBr2,-1.7436172033333335,0.31339761249999987 -Ta2Fe4S4_51_17731.vasp,Ta2Fe4S4,-3.2755308120000004,0.8412936536666624 -Zr3H2C2O2_187_21762.vasp,Zr3H2C2O2,-5.995137886666666,0.31499046333332803 -Pb1Br2_115_14172.vasp,PbBr2,-0.90281589,0.2911081200000002 -Hf4I1Br2Cl1O4_8_7789.vasp,Hf4IBr2ClO4,-5.264651459166667,0.22399395046295556 -Co2Ag1O4_187_3838.vasp,Co2AgO4,-3.3204503214285714,-0.7547303355357191 -Ti2H2_164_18951.vasp,Ti2H2,-4.782423075,0.5516910975000004 -Fe2W2S8Cl2_129_6036.vasp,Fe2W2S8Cl2,-2.62261411,0.2510896926562445 -Nb4H2C3_164_13085.vasp,Nb4H2C3,-6.6433606377777785,0.06600351380951075 -Zr3Ti1Te8_6_21797.vasp,Zr3TiTe8,-3.066866265833333,0.24816043625000006 -Sn6Cl16_1_16985.vasp,Sn6Cl16,-1.385292344090909,0.062071115454544246 -Bi4_11_2660.vasp,Bi4,-1.07087277,-0.604004775 -Ge1Bi1Br4_1_6644.vasp,GeBiBr4,-1.1754106483333333,0.07775278458333201 -K2Cd4S6Cl6O2_31_9051.vasp,K2Cd4S6Cl6O2,-1.1568035934999998,0.45480952543749653 -In4Se6_1_8695.vasp,In4Se6,-1.904601949,0.07971947700000004 -Cr2Te6As2_162_4531.vasp,Cr2Te6As2,-1.955378579,0.1290198786666643 -Al1Ga1Hg1S4_156_662.vasp,AlGaHgS4,-2.31180931,0.19780746785714265 -Ca1I2_164_2849.vasp,CaI2,-1.20170527,0.07090599466666658 -Y3H2N2O2_187_20797.vasp,Y3H2N2O2,-6.239428862222223,-0.9085752042361226 -Fe2H2_164_5858.vasp,Fe2H2,-1.3724500325,0.29667309250000007 -Hf2Cl2_164_7475.vasp,Hf2Cl2,-4.2751703,0.037487752499999694 -Ni1H4C6I2_47_13348.vasp,NiH4C6I2,-4.394458462307693,0.36117814153845407 -Gd2Br6_59_6602.vasp,Gd2Br6,-2.33625776,0.048047583749999845 -Na2Hg4Se2S6I6_31_12169.vasp,Na2Hg4Se2S6I6,-0.5741879405,0.06890877260416517 -V2Cu2As4O12_2_20047.vasp,V2Cu2As4O12,-3.970562942,0.5031625061249958 -Ga1Cu1Ag1S4I2Br1_1_6158.vasp,GaCuAgS4I2Br,-1.078920176,0.2885232569444421 -Te4Br4_2_18579.vasp,Te4Br4,-0.76466984875,-0.5502466758928573 -Al2Tl2S6_31_1028.vasp,Al2Tl2S6,-2.593045374,0.08266558862499751 -Ag4Te4Br4_14_573.vasp,Ag4Te4Br4,-0.23168256166666668,0.16358280208333292 -Hf2Ti2Br7Cl1_1_7649.vasp,Hf2Ti2Br7Cl,-3.1203861341666665,0.16165462333332453 -Ti1Cr1Ge2I4_1_18769.vasp,TiCrGe2I4,-1.82773943875,0.20867993458333034 -Pt4I16_29_14702.vasp,Pt4I16,-0.081786915,0.11021588749999998 -Ti2Sb1S2_164_19008.vasp,Ti2SbS2,-4.8379268799999995,-0.22376256949999918 -Hf1H2O2_164_7190.vasp,HfH2O2,-5.053765496,1.5490347370000017 -Zn2Te2Mo2O12_18_21180.vasp,Zn2Te2Mo2O12,-4.0144032166666666,0.004829641342588786 -In1Ga1Hg1Se4_156_8253.vasp,InGaHgSe4,-1.4510675000000002,0.15806723571428538 -Li2Ag2C4O8_7_9822.vasp,Li2Ag2C4O8,-4.872750136875,0.2416617856250003 -Ti2Sn2P4O16_11_19031.vasp,Ti2Sn2P4O16,-5.723841395833333,0.07089624576388287 -Zr4Te4I4_31_21856.vasp,Zr4Te4I4,-2.4624438741666665,0.18116568305555325 -Tl1I2_115_19289.vasp,TlI2,0.13870703,0.30375857895833325 -Ni2Sb4Cl4O6_2_13621.vasp,Ni2Sb4Cl4O6,-2.91090865875,0.011671534895830948 -Al1Te1_156_746.vasp,AlTe,-1.539580955,0.7661712325000001 -V4Br16_14_20309.vasp,V4Br16,-1.2882861135,0.10956645850000002 -B2F2_1_1667.vasp,B2F2,-3.53849986,0.993891706111107 -La2Eu2I8_13_9590.vasp,La2Eu2I8,-1.7953283808333333,0.0798018208333332 -Sn6N2_191_16989.vasp,Sn6N2,-1.861005915,-2.433135873125 -Sn2H8C16O8_1_16772.vasp,Sn2H8C16O8,-5.912145564999999,0.1967678724509746 -Cr4H4O8_14_4606.vasp,Cr4H4O8,-4.681750706875,-0.06090406187500008 -Y1S3_99_20665.vasp,YS3,-3.8635849775,0.4982540002343745 -Al1Cu1F5_47_639.vasp,AlCuF5,-2.397628077142857,0.44093098571428346 -Na1Ti1S2_156_11943.vasp,NaTiS2,-3.9940678525,0.3249701850000002 -Mn1Si1Se1S1_1_10886.vasp,MnSiSeS,-2.7885579075,0.4523731553125001 -Ca2Ge4_12_3026.vasp,Ca2Ge4,-2.121295985,0.4841380083333333 -Ti2Pd1S3Cl2_8_18988.vasp,Ti2PdS3Cl2,-3.72582923375,0.14085327917071777 -Ta2Pd4Se4_51_17832.vasp,Ta2Pd4Se4,-2.993076574,-0.08697009100000641 -Ga2Te2I2_59_6505.vasp,Ga2Te2I2,-1.0636047266666666,0.19450742750000005 -Bi2Mo4O16_11_2475.vasp,Bi2Mo4O16,-4.51740348,1.8920488230113532 -Bi2Sb2O8_59_2526.vasp,Bi2Sb2O8,-3.9552370625,0.32112718916666605 -Nb4Te12_11_13167.vasp,Nb4Te12,-2.84400409375,0.07217761760416352 -Te3N2_164_18549.vasp,Te3N2,-2.43462622,0.7219454830000004 -U4Se2_1_19738.vasp,U4Se2,-6.387444535,0.7694176683333334 -K2Mg1Te2S8F4_2_9229.vasp,K2MgTe2S8F4,-2.179409605882353,0.4113063199019589 -Ca2Cr8O18_85_2992.vasp,Ca2Cr8O18,-4.893809552142857,0.12489614736606308 -Ge2P2Se6_147_6813.vasp,Ge2P2Se6,-2.7286802260000003,0.06137369820833061 -Si4H4O10_1_16488.vasp,Si4H4O10,-5.693815615,0.01486339787036517 -Ni2Br4_2_13482.vasp,Ni2Br4,-0.19969068,-0.2445911 -Tc1Cl2_164_18218.vasp,TcCl2,-3.00002677,0.5143745161111081 -Ga1Ag1Se1S1I2_1_6127.vasp,GaAgSeSI2,-0.860502695,0.3835408522222201 -Ta1S1Cl1_156_17602.vasp,TaSCl,-4.34966433,0.23528467166666234 -Ca2_65_3141.vasp,Ca2,1.53617447,2.1723296899999998 -P4S2O12_18_14109.vasp,P4S2O12,-4.7192346305555555,0.42487225968749165 -In1Ga1Hg1O4_156_8251.vasp,InGaHgO4,-2.97023367,0.10673028485118566 -Mn2Te2Mo2O12_18_11299.vasp,Mn2Te2Mo2O12,-4.433394811111111,-0.00409299375000316 -B4Cl4_28_1751.vasp,B4Cl4,-1.94309296375,1.8060224056944412 -Al1Au1Br1Cl1O2_8_610.vasp,AlAuBrClO2,-2.421515718333333,0.393715907986107 -As18Br4_11_1128.vasp,As18Br4,-2.6571208631818184,0.059085311969694576 -Ag1Br1O4_81_33.vasp,AgBrO4,-1.684056335,0.5220441541666649 -Ba1Br1Cl1_156_1811.vasp,BaBrCl,-2.2038901133333333,0.26708742333333335 -V1Cl4_123_19801.vasp,VCl4,-1.694517742,0.15693404400000022 -Sb8Rh4_2_15874.vasp,Sb8Rh4,-2.4536100816666666,0.42060048250000026 -Tl2Br2N2_59_19377.vasp,Tl2Br2N2,-1.4571596500000001,0.7718987241666646 -As1Pd1_187_1163.vasp,AsPd,-1.21983064,1.227151567083333 -La2Mg4_12_9600.vasp,La2Mg4,-0.5728566700000001,0.37492346041666574 -Pd2S2_123_14470.vasp,Pd2S2,-1.43603618,0.67409516 -K4Zr2Te6_39_9533.vasp,K4Zr2Te6,-1.8347254391666665,0.1976076566666667 -Cs2H6C4S6_2_4720.vasp,Cs2H6C4S6,-3.8723113311111113,0.24057404361110035 -Sr2I2_129_17256.vasp,Sr2I2,-0.18480091,0.8593679116666667 -Cr1Bi2_164_4126.vasp,CrBi2,-1.3706906566666666,0.6742155633333318 -Fe1Te1Pt1Cl1_8_5764.vasp,FeTePtCl,-1.2309639325,0.41056222437500006 -Sb2Pd2S6_12_15653.vasp,Sb2Pd2S6,-2.1838218609999998,0.3355446282499961 -Cs4Cd2Cl8_11_4806.vasp,Cs4Cd2Cl8,-0.8069357221428571,0.2578792207142858 -Cu4Te2_4_5482.vasp,Cu4Te2,-0.058834905,0.3731529058333326 -Ni1Pd1I1Br3_1_13396.vasp,NiPdIBr3,-0.11923207166666666,0.07858527833333334 -Ru2Se6_11_15364.vasp,Ru2Se6,-2.49448609875,0.47846138458333354 -Cu6O2F10_4_5497.vasp,Cu6O2F10,-1.3712992394444443,0.17085193791666503 -Cu2S2N2O6_164_5250.vasp,Cu2S2N2O6,-2.8520267975,1.113619137499992 -Mn1S2_187_10854.vasp,MnS2,-2.9009751766666665,0.45986950083333333 -C1S1_156_2735.vasp,CS,-3.88739941,1.4797056946875 -Co1P1S3_1_3808.vasp,CoPS3,-2.776003124,0.5107557812499983 -Hg2O4_14_7978.vasp,Hg2O4,-1.0331679466666668,0.5997835643055541 -Bi2Mo4O20_11_2476.vasp,Bi2Mo4O20,-4.400745897307693,1.539123558509611 -As2Pb2C2O6F6_7_1249.vasp,As2Pb2C2O6F6,-3.754685142222222,0.4541842788888857 -Pd4Se1S3I4_8_14524.vasp,Pd4SeS3I4,-1.1030024191666665,0.09129364562500009 -Y2Pb1_164_20766.vasp,Y2Pb,-2.7193173633333334,0.9104371761111072 -Ni2H2_164_13516.vasp,Ni2H2,-1.1790033625,1.2353521425 -Ni2P4_14_13571.vasp,Ni2P4,-2.3836627183333334,0.8018771166666667 -Zn2W2Se2O12_18_21196.vasp,Zn2W2Se2O12,-4.295773335555555,0.03795092805555145 -Ag1Te6Mo6_12_148.vasp,AgTe6Mo6,-2.2900291376923074,0.06063066923076965 -Pb2Cl6_1_14241.vasp,Pb2Cl6,-1.01759292125,-0.0023098393749998655 -Ga1Te1Pb1S1Br2_1_6291.vasp,GaTePbSBr2,-1.476527405,0.31118546013888704 -Cd1Br2_164_3287.vasp,CdBr2,0.040729049999999996,0.060612920833333334 -Te2Ir2Cl2_59_18391.vasp,Te2Ir2Cl2,-2.0318658816666666,0.22786292777777417 -Al2Co2Te5_187_809.vasp,Al2Co2Te5,-1.8814240222222223,0.28360889126322164 -V1Ge1Se1S1_6_19842.vasp,VGeSeS,-2.8936953225,0.4062046257291607 -Tc2Br8_14_18225.vasp,Tc2Br8,-1.7844044430000001,0.10652987599999997 -Si12Pd4_75_16312.vasp,Si12Pd4,-3.28082550125,-0.20703267562499983 -Si2P2O6_12_16423.vasp,Si2P2O6,-5.385475092,0.547523283533333 -As4Pd4S4_13_1351.vasp,As4Pd4S4,-2.4565079516666666,0.3420616008333335 -Pd1Au1S2Br2_1_14342.vasp,PdAuS2Br2,-0.83448476,0.22946903729166596 -Cs4Hg2Cl8_11_4810.vasp,Cs4Hg2Cl8,-0.6090526628571429,0.21032287142857142 -Nb2Br4O2_25_12653.vasp,Nb2Br4O2,-3.9582377025,0.019291792500000238 -W1I5_47_20439.vasp,WI5,-0.4669398183333333,0.39453606513888817 -Ga3Ru2_123_6532.vasp,Ga3Ru2,-2.676381758,0.12461695949999724 -Hf2Ti1N3Cl2_6_7648.vasp,Hf2TiN3Cl2,-6.4701685575,0.17959511625000024 -Mn1Ga2O4_164_10725.vasp,MnGa2O4,-4.4004411885714285,-0.06077163500000404 -In2Te2F2_59_8618.vasp,In2Te2F2,-1.7273031683333333,0.20183036611110938 -Na1Mn1S1Br1_1_11895.vasp,NaMnSBr,-1.715307335,0.28224009875 -K2Cd4S6O2F6_31_9053.vasp,K2Cd4S6O2F6,-1.597479802,0.3943702866874939 -Hf1Zr3S8_1_7420.vasp,HfZr3S8,-4.6552345908333335,0.30435940145833307 -Tl2O3_1_19473.vasp,Tl2O3,-2.270039774,0.44012540450000026 -Mg1Mn1W1Cl2O5_1_10386.vasp,MgMnWCl2O5,-4.130922577,0.2894486878749982 -Ti2S6_59_19007.vasp,Ti2S6,-4.49353702375,0.0496034949999995 -Ti4O8_11_19150.vasp,Ti4O8,-7.068336481666667,0.19551804333333322 -Au2Se1I3Br1_1_1534.vasp,Au2SeI3Br,0.38005786999999996,0.3194814762499999 -Te4Pd2Cl2_2_18613.vasp,Te4Pd2Cl2,-1.19411569875,0.09830031039062505 -Ge2Pt2_31_6818.vasp,Ge2Pt2,-2.5838525725,0.3910005912500001 -Bi2I2N2_59_2462.vasp,Bi2I2N2,-2.179360743333333,-0.013360303055557132 -K4W2Se8_26_9530.vasp,K4W2Se8,-2.2427353157142855,0.23628441642857156 -Zn2Mo2S8_13_21119.vasp,Zn2Mo2S8,-2.3125206375,0.4040728363958313 -Tl1Si1Se3_143_19346.vasp,TlSiSe3,-1.9750688060000001,0.49550354439583144 -Ag1H2_123_72.vasp,AgH2,-1.3749154533333332,1.6011334149999976 -Mg2Rh1_123_10499.vasp,Mg2Rh,-0.9826833266666667,0.06011757999999989 -Nb2I1N2Cl1O1_1_12742.vasp,Nb2IN2ClO,-5.37944564,0.05392661083213729 -Ga4Se6_31_6575.vasp,Ga4Se6,-2.336365073,0.12062679099999984 -Zr4H2N3_164_21825.vasp,Zr4H2N3,-6.16913178,-0.14800898444444943 -Nb3Cu1S2Br1Cl1_6_12970.vasp,Nb3CuS2BrCl,-3.4730869225,0.5244370140781149 -Mo1C3_187_11503.vasp,MoC3,-5.16848361,1.7987144499999999 -Nb2Te2Br2_59_12904.vasp,Nb2Te2Br2,-2.9960791983333332,-0.11653926341270415 -Ag4S4F8_14_550.vasp,Ag4S4F8,-1.1684723625,0.2814569323437496 -Mg2Ga2Te5_164_10459.vasp,Mg2Ga2Te5,-1.6500992244444446,0.06292202833333327 -Ag2Hg2S2Br2_26_297.vasp,Ag2Hg2S2Br2,0.018851505,0.12982421125 -Cd2S10F4_31_3537.vasp,Cd2S10F4,-1.642426320625,0.42461368398437505 -Y4B3Cl2_164_20806.vasp,Y4B3Cl2,-4.515572805555555,0.3336751286111067 -Al2Ge2Te6_162_852.vasp,Al2Ge2Te6,-2.111174449,-0.2823214651875019 -Sr2Co1Cl2O2_123_17188.vasp,Sr2CoCl2O2,-3.2390998271428573,0.060722813095232864 -Zr3C2O2_187_21757.vasp,Zr3C2O2,-6.877097957142857,-0.09352983571429174 -Ni2Bi4_11_13476.vasp,Ni2Bi4,-0.5227761266666667,0.3623813416666666 -Zn1Cd1I2_1_20910.vasp,ZnCdI2,1.2696007025,0.2537822304166667 -Sr4Se4S12_14_17476.vasp,Sr4Se4S12,-2.4933390695,0.21035151891666404 -Ni1Te2_187_13436.vasp,NiTe2,-0.6427262866666666,0.09676563333333332 -Nb1Mo1Se1S1Br2_1_12533.vasp,NbMoSeSBr2,-3.175462235,0.014947258749992809 -Mo1Ir1Rh2Cl1O7_1_11521.vasp,MoIrRh2ClO7,-3.8972483933333333,0.2429893070312472 -K2Pd1O2_47_9298.vasp,K2PdO2,-1.372534386,0.825855972 -Ti2P1Se2_164_18980.vasp,Ti2PSe2,-5.145285698,0.0604258230000001 -Sb4Au2S12_12_15764.vasp,Sb4Au2S12,-2.1411046522222223,0.22326338430555337 -C12N4_5_2717.vasp,C12N4,-6.940005116875,0.8789131193750004 -Rh2I2N2_59_15194.vasp,Rh2I2N2,-2.6149623883333333,0.18857301583333075 -Mg2H8Cl4O16_14_10466.vasp,Mg2H8Cl4O16,-3.407541021666667,0.10699809016666695 -Re1Ni1Te1S1Br1Cl1_1_15013.vasp,ReNiTeSBrCl,-1.94470224,0.357238807013886 -Cr1I2_187_4202.vasp,CrI2,-0.69335479,0.4664098155555544 -Pd2Se4F2_2_14499.vasp,Pd2Se4F2,-1.69241828625,0.17145297140625015 -Ge2Se1S1I4_1_6862.vasp,Ge2SeSI4,-1.1866915825,0.26612792446180134 -Ta2I10_1_17750.vasp,Ta2I10,-1.0610564466666668,0.35860161270833335 -Te8As8S4_2_18690.vasp,Te8As8S4,-2.1605850060000003,0.25729126254166484 -Sc2As2S8_2_16028.vasp,Sc2As2S8,-3.4221293058333333,0.39165582281249334 -As1Se1F1_156_1177.vasp,AsSeF,-2.509334283333333,0.2008071691666642 -Ti2Sb2Br1Cl1_1_19011.vasp,Ti2Sb2BrCl,-3.3008564049999998,0.4896546638333261 -Zr2Sc1Cl2O3_8_21666.vasp,Zr2ScCl2O3,-5.02895048375,0.4192258729166667 -Si3Sb2O9_174_16478.vasp,Si3Sb2O9,-5.54722599,0.09396462124999339 -Ca5La1_1_3250.vasp,Ca5La,0.29142723833333334,1.239523486666665 -Ge2Te1Br2_38_6877.vasp,Ge2TeBr2,-1.8792564920000001,-0.3070967139999998 -Rh2S1Br4_8_15213.vasp,Rh2SBr4,-1.1617824142857143,0.3778411807142843 -Te8Ru4_2_18709.vasp,Te8Ru4,-2.2106718858333334,0.41032282416666677 -Cr4C3_164_4599.vasp,Cr4C3,-4.932090327142857,0.46472608999999315 -Ge2S2_129_6828.vasp,Ge2S2,-2.9277115875,-0.6765637337500001 -As4P2H2S12_4_1344.vasp,As4P2H2S12,-2.994055833,0.2544297824687473 -Li2Zr1O6F6_1_10142.vasp,Li2ZrO6F6,-2.8294716726666667,1.0690886885 -Ba2Tl1Ni2O7_123_2085.vasp,Ba2TlNi2O7,-3.03581533,0.11370583880207802 -Zn2Sb8O18_13_21163.vasp,Zn2Sb8O18,-3.7867514717857143,0.2976960908928534 -P2N2_1_13996.vasp,P2N2,-5.559378815,0.21018080849999676 -Cd1H1O1F1_156_3329.vasp,CdHOF,-2.40263494,0.14355017437500006 -Mn1Ga1Br5Cl1_1_10716.vasp,MnGaBr5Cl,-1.1746839775,0.028693932499999963 -Ca2Cl4_51_2983.vasp,Ca2Cl4,-2.17853225,0.04969888833333336 -Mg2Co2Sn2_129_10443.vasp,Mg2Co2Sn2,-0.9236733149999999,-0.25284511222222367 -Ni1Ru1S1I2O1_6_13407.vasp,NiRuSI2O,-1.6180433716666667,0.31191547833332844 -Bi2S4_12_2521.vasp,Bi2S4,-1.98257509,-0.33507604260416896 -Ag4H4S4Cl4_14_520.vasp,Ag4H4S4Cl4,-1.4410477875,0.10236926992187478 -In3Ir1_187_8649.vasp,In3Ir,-1.0134953975,0.8622928974999999 -Mn2F8_14_11067.vasp,Mn2F8,-2.3758610520000003,0.024347162249999776 -K4Mn2S4_49_9473.vasp,K4Mn2S4,-1.7298432940000001,-0.024703711000000128 -Ge2As2C2S6F6_7_6730.vasp,Ge2As2C2S6F6,-3.1038105444444444,0.5338997367013822 -U2Cl6_59_19705.vasp,U2Cl6,-3.6851726275,0.058971965000000015 -Cd1I2_115_3366.vasp,CdI2,0.58983704,0.0343282772222222 -Mn4Cl14_13_11432.vasp,Mn4Cl14,-1.3572531255555556,0.03482477861111 -Bi12Te12_7_2302.vasp,Bi12Te12,-1.2159300129166668,0.3039069870833331 -Bi2Sb2S8_6_2529.vasp,Bi2Sb2S8,-2.320693636666667,-0.11045657968750477 -Ni2S4Cl2_11_13593.vasp,Ni2S4Cl2,-1.44312156875,0.018764349999997987 -Tl4S4Br4_14_19619.vasp,Tl4S4Br4,-1.0478152583333333,0.20928784145833224 -Ag1O2_115_91.vasp,AgO2,-1.16819094,0.8622653604166651 -Al8Se6_31_1114.vasp,Al8Se6,-2.5681646985714286,0.3052831778571409 -Zn2H2I2O8_7_21095.vasp,Zn2H2I2O8,-2.7551485742857147,0.12070353517856836 -Mn2Sn1S1I2_1_11293.vasp,Mn2SnSI2,-1.3396946333333333,0.34686308684865674 -Zr4S4I4_7_21845.vasp,Zr4S4I4,-3.3075725833333336,0.2012614683333327 -Mn4O2F8_31_11445.vasp,Mn4O2F8,-3.0258365992857144,-0.11427503785714577 -Nb2Br2O4_11_12650.vasp,Nb2Br2O4,-5.4258157025,-0.18829932031249896 -P2Au2Se4_26_13958.vasp,P2Au2Se4,-1.60932852625,0.23709255625000014 -V2O2F6_7_20121.vasp,V2O2F6,-3.7874538710000003,-0.65754726175 -Nb2Br2_164_12652.vasp,Nb2Br2,-3.55053777,0.2897534584374999 -In1Sn1Cl3_1_8357.vasp,InSnCl3,-1.3614673099999999,0.17531785518750032 -Lu1Sb2_21_10298.vasp,LuSb2,-2.30645114,0.11743347083333089 -Sn2I2N1O1_1_16781.vasp,Sn2I2NO,-2.404918728333333,0.12070654847221785 -Sr2Al4Cl16_13_17118.vasp,Sr2Al4Cl16,-2.3114097745454547,0.04290358977272701 -Ta4Ti2Zn4O16_2_18135.vasp,Ta4Ti2Zn4O16,-5.694793893846153,0.0600012478846044 -Na6H2S10_11_12438.vasp,Na6H2S10,-2.436185567222222,0.13857624527777568 -Ge2Se2I1Br1_1_6868.vasp,Ge2Se2IBr,-1.8604447466666667,0.15752102611111085 -Ca2Ti8O18_85_3136.vasp,Ca2Ti8O18,-6.654176000357142,0.2855846012499943 -Sb1Br2O1_47_15438.vasp,SbBr2O,-1.9781939075,0.22719609203125013 -Ca3Cu2Cl2O4_123_3167.vasp,Ca3Cu2Cl2O4,-3.095383498181818,0.03718813863635802 -Zr3Ti1Br1N3Cl3O1_1_21793.vasp,Zr3TiBrN3Cl3O,-5.385378229166666,0.2024544364583276 -V4Se6_11_20370.vasp,V4Se6,-3.239567076,0.07806149649999705 -Ag2Bi2O4_51_193.vasp,Ag2Bi2O4,-2.3953258075,0.29157197575000016 -Mn3C2_187_11366.vasp,Mn3C2,-3.9107474439999996,0.6317639819999963 -Hf2Ti2S4Br3Cl1_1_7651.vasp,Hf2Ti2S4Br3Cl,-4.324825525833334,-0.09928470213542612 -Te3P2_164_18553.vasp,Te3P2,-2.2237183000000003,0.33775154800000007 -Nb2Sb1S1I1_99_12858.vasp,Nb2SbSI,-3.4453636199999997,0.47970960349999703 -V2S2_129_20162.vasp,V2S2,-3.7052493075,-0.04983677906250472 -Tl1F2_187_19264.vasp,TlF2,-1.4793201166666667,0.30780574000000005 -Pd2Se4Cl2_11_14497.vasp,Pd2Se4Cl2,-1.43239407125,-0.033018146328126885 -Ir4Se6S2_1_8867.vasp,Ir4Se6S2,-2.6520902075,-0.11493640729166676 -Mo3Se1Cl4O2_1_11727.vasp,Mo3SeCl4O2,-2.966113463,0.20464178808332595 -Na6Te2H2S8_11_12446.vasp,Na6Te2H2S8,-2.335050188333333,0.14846469083333136 -Ge2As2S6F2_7_6740.vasp,Ge2As2S6F2,-2.7577677066666664,0.4948859127604111 -Ta4Se6_2_18111.vasp,Ta4Se6,-4.87509904,0.07430667699999915 -Na2Pt1O6_162_12270.vasp,Na2PtO6,-2.4896245033333333,0.8687865981944416 -Nb4Tl2P2S20_7_13176.vasp,Nb4Tl2P2S20,-3.627136289642857,0.09071089964285717 -Tl1Se2_115_19344.vasp,TlSe2,-0.9796639800000001,0.5052181487499985 -Hg6Ge4Se16_32_8098.vasp,Hg6Ge4Se16,-1.1398309619230769,0.21559155976762687 -Zn4Se4O12_29_21225.vasp,Zn4Se4O12,-2.8899307505,0.21954428149999972 -Si1Ge1Te2_1_16334.vasp,SiGeTe2,-2.35473628,-0.360271651875 -Bi16O24_14_2309.vasp,Bi16O24,-3.6997884865,0.15820574149999977 -Pd3Pt1Cl4O4_3_14505.vasp,Pd3PtCl4O4,-1.8872477525000002,0.16304777013888871 -Zn2Ge4W2O12_13_21090.vasp,Zn2Ge4W2O12,-4.210049563,0.4038455380624948 -Zn2F2_129_21072.vasp,Zn2F2,0.02624433,0.624591563125 -Sr2Cl2_129_17180.vasp,Sr2Cl2,-1.47673472,0.4760248974999999 -Hf2Ti2Se8_6_7653.vasp,Hf2Ti2Se8,-4.304585990833333,0.2955640683333338 -Ba3Fe2Cl2O5_123_2106.vasp,Ba3Fe2Cl2O5,-3.6329277866666665,0.004301020000000211 -Al2Se2F2_59_963.vasp,Al2Se2F2,-3.182474706666667,0.23328543888888542 -Li1Al1Sb2S6_5_9646.vasp,LiAlSb2S6,-2.7778828140000003,0.36873009968749737 -In2Ni2O5_187_8493.vasp,In2Ni2O5,-2.7397016966666667,0.3155299968055525 -Er2Br2O2_129_5548.vasp,Er2Br2O2,-4.7812495083333335,0.03543397333333331 -Tl4C8O8_1_19597.vasp,Tl4C8O8,-5.0828910254999995,0.40209090150000026 -Pt2Se2S6_11_14679.vasp,Pt2Se2S6,-2.307060398,0.2087105112499975 -Sb2Te2_2_15726.vasp,Sb2Te2,-1.617904185,0.3012783887499979 -Ni1S2_115_13413.vasp,NiS2,-1.3533201033333333,0.49029048708333134 -Hf2Cu2_129_7485.vasp,Hf2Cu2,-2.3314815525,0.54377634480769 -Nb2Rh2Se8_11_12828.vasp,Nb2Rh2Se8,-3.3434694191666665,0.12130033791666683 -K4Cd2Br8_11_9425.vasp,K4Cd2Br8,-0.5087118964285714,0.15683428500000007 -Sc2O1F4_1_16110.vasp,Sc2OF4,-4.6002974114285715,0.1047168971428527 -Li2Te2F2_1_10082.vasp,Li2Te2F2,-1.9145859133333334,0.7169704488888864 -Pb2I2F2_129_14248.vasp,Pb2I2F2,-1.6787036566666667,0.02488435624999985 -Te2As1Rh1_38_18347.vasp,Te2AsRh,-2.04968525,0.5345054866666665 -Sb2P2_31_15630.vasp,Sb2P2,-2.884896955,0.2798845737500002 -Ga1S2O8_164_6261.vasp,GaS2O8,-4.19956946,0.18480073142044617 -Cu1Br2N1_1_4860.vasp,CuBr2N,-0.938374735,0.5465290818750002 -Zr4O8_35_21836.vasp,Zr4O8,-6.831298726666667,0.351690416666667 -Rb2Cd4S2O6F6_31_14810.vasp,Rb2Cd4S2O6F6,-2.2442474725,0.21469522896874527 -Al1In1S2I3Cl1_6_680.vasp,AlInS2I3Cl,-1.36098389375,0.30682381617187504 -Ca2La2I10_26_3060.vasp,Ca2La2I10,-1.5282577592857145,0.10100633271428416 -Tl2I2_12_19435.vasp,Tl2I2,-0.24341113,0.19480167750000002 -Na4Bi4O8_57_12369.vasp,Na4Bi4O8,-3.451992603125,-0.2290684731249999 -Ca2Cl4O8_125_2980.vasp,Ca2Cl4O8,-2.7279163964285713,0.14541911785714046 -In2Se2_187_8587.vasp,In2Se2,-1.8397248075,0.0636905550000002 -Cu4P16Se16I4_53_5436.vasp,Cu4P16Se16I4,-2.3743644055,0.08807615324999984 -B2_191_1724.vasp,B2,-4.72144749,1.4395378083333332 -Bi2I2_164_2466.vasp,Bi2I2,-0.54158456,-0.0594592108333338 -Ta2Rh2Se8_11_17840.vasp,Ta2Rh2Se8,-3.5719839158333335,0.11239090833333298 -Ca3Ni2Br2O5_123_3191.vasp,Ca3Ni2Br2O5,-3.147863323333333,-0.3014278454166698 -Tl2Cl6_162_19393.vasp,Tl2Cl6,-0.69936580375,0.04392568625000004 -Zn1O1_156_20983.vasp,ZnO,-1.840885465,0.36132423749999987 -Fe2P2S4Br2_26_5914.vasp,Fe2P2S4Br2,-2.45907951,-0.17505763021212567 -Cu1Br2_164_4861.vasp,CuBr2,0.00028723333333333334,0.13557544833333335 -Er2Se2Br2_59_5572.vasp,Er2Se2Br2,-3.1457618249999997,0.03362149666666703 -Cs2Zr12B2I28_53_4798.vasp,Cs2Zr12B2I28,-2.0835572361363637,0.11456824613636352 -V1Cr1N2Cl2_6_19806.vasp,VCrN2Cl2,-4.134451261666666,0.0009276795833241813 -Hf2Zr2Se2S3I1Br2_1_7671.vasp,Hf2Zr2Se2S3IBr2,-3.908261435,0.12832876236110208 -Ca2Ag1Te2I2_38_2919.vasp,Ca2AgTe2I2,-0.84687088,0.27501866654761653 -Na2Zn2As2_129_12338.vasp,Na2Zn2As2,-0.8248705766666666,0.14748062500000003 -In18S9_143_8170.vasp,In18S9,-1.6744209611111112,0.6888901888888869 -Nb2O2_187_12793.vasp,Nb2O2,-6.234839755,0.28465353833333307 -Y1Sb2O4_123_20667.vasp,YSb2O4,-5.1269117557142865,0.17119212928570493 -Sr1Cl2_164_17039.vasp,SrCl2,-2.32189434,0.17560341333333307 -Mo2I2_164_11624.vasp,Mo2I2,-1.28862375,1.054788922916667 -Sm2S6_129_16583.vasp,Sm2S6,-3.74607259375,0.19543673109374993 -K2C2O6F2_4_9014.vasp,K2C2O6F2,-4.049272776666666,0.09978472104166453 -Al6O9_150_1105.vasp,Al6O9,-5.899144272666666,0.22439056533333357 -Si2Ru1_123_16430.vasp,Si2Ru,-3.93144902,0.7268088274999998 -Mn2Sb2Br2O4_26_11230.vasp,Mn2Sb2Br2O4,-3.228306532,0.1117265569999999 -Er6Br7_2_5580.vasp,Er6Br7,-2.115224043846154,0.1646532696153824 -Sb3Au1S6_143_15754.vasp,Sb3AuS6,-2.1031752310000003,0.3330715619687499 -Ce2Se2_129_3679.vasp,Ce2Se2,-3.73657059,0.2941840216666667 -Zr3N2O2_187_21774.vasp,Zr3N2O2,-7.167056238571428,-0.08901188000000548 -Pd2Se2S6_11_14490.vasp,Pd2Se2S6,-2.111695631,0.18530297449999789 -Nb2N1O2_164_12766.vasp,Nb2NO2,-7.132742609999999,0.058731289750001636 -Sr2P4_12_17297.vasp,Sr2P4,-2.94841474,0.4597450009999968 -Ti1As2_187_18739.vasp,TiAs2,-4.370043766666667,-0.7593418529166667 -V1Ag1S1Br1_8_19759.vasp,VAgSBr,-1.5118326125,0.5344909533333309 -Cu2As2Se4_26_5013.vasp,Cu2As2Se4,-1.67870792125,0.002542059531250085 -Si3Sb4_5_16480.vasp,Si3Sb4,-2.5888047585714284,-0.002416838571430935 -Sn2P1S6_162_16802.vasp,Sn2PS6,-2.686643637777778,0.12737512111111093 -Cr1Sb2_164_4258.vasp,CrSb2,-2.1917814266666666,1.064257511666664 -Na2Er2S4O16_11_12072.vasp,Na2Er2S4O16,-4.873805209583334,0.07703576124999945 -Au2S4Br2_1_1523.vasp,Au2S4Br2,-1.0578650125,0.11074291770833222 -Ga2Ge1I2_6_6362.vasp,Ga2GeI2,-1.28425006,0.16486617866666586 -Ta4Pd2Se10_13_18086.vasp,Ta4Pd2Se10,-3.85629335,-0.14416928375000637 -Co2Ni1O6_12_3937.vasp,Co2NiO6,-3.406043441111111,-0.5625034323611138 -Cd1P1_8_3387.vasp,CdP,-0.023865215,0.8056576293750002 -Ir2Se1S1I2_6_8832.vasp,Ir2SeSI2,-2.0816211716666664,0.01383323673610426 -Ir2S2I2_59_8820.vasp,Ir2S2I2,-2.2586387316666667,0.09178459888888657 -Ir1O1F1_156_8741.vasp,IrOF,-3.1151263100000004,0.5398980988888851 -Zr2Ge2Se2_129_21570.vasp,Zr2Ge2Se2,-4.085774408333333,0.12821994166666695 -Bi2I6_189_2468.vasp,Bi2I6,-0.3166465825,0.17310744374999998 -Ga3Cu1S2Cl4_1_6527.vasp,Ga3CuS2Cl4,-1.6985604410000001,0.25159166399999855 -Zr2Sb2Te6_2_21665.vasp,Zr2Sb2Te6,-2.403272055,0.2903808844999982 -Ti3Se2N2F2_6_19104.vasp,Ti3Se2N2F2,-5.15810063,0.287781610314804 -Ta2Fe4S6_11_17732.vasp,Ta2Fe4S6,-3.255213786666667,0.4727500847222186 -Tb2Si1_164_18209.vasp,Tb2Si,-2.684964036666667,0.7696369091666633 -Au2Se4Cl2_17_1554.vasp,Au2Se4Cl2,-0.78029612875,0.26185546812500005 -Li2H2S2_11_9932.vasp,Li2H2S2,-3.178788688333333,0.11088123750000056 -In2Sb2Se6_147_8567.vasp,In2Sb2Se6,-2.030080735,0.14238989300000027 -Hf1Zr3Ge2N6Cl4_1_7416.vasp,HfZr3Ge2N6Cl4,-5.351315319375,0.2532330168749984 -Ni2C4N4_123_13488.vasp,Ni2C4N4,-5.577201617,0.34455494166665995 -B3Rh1_187_1739.vasp,B3Rh,-3.1470318875,2.152886265416667 -Ga4Sb4_127_6569.vasp,Ga4Sb4,-1.34652979125,-0.21746103625000002 -V4Se2_129_20366.vasp,V4Se2,-3.3845419133333334,0.4552346108333334 -Ir1Rh2S2Br4_6_8752.vasp,IrRh2S2Br4,-1.7386621466666667,0.3045072778600719 -Ag1Ge1H6_2_58.vasp,AgGeH6,-2.26530058875,1.535731067091732 -Zn2Co8O18_13_21061.vasp,Zn2Co8O18,-3.2251785721428567,-0.25251447321429066 -Na2Au1S2_12_11966.vasp,Na2AuS2,-1.359311012,0.4349883048333316 -Tl1Ag1As2S6_149_19199.vasp,TlAgAs2S6,-2.092379716,0.34915781399999746 -Bi18Cl4_11_2311.vasp,Bi18Cl4,-1.2225540163636364,-0.5257646965151523 -Li2Mo1_187_10005.vasp,Li2Mo,-1.6741245133333333,1.1173462077777754 -As2Pt2O6_12_1277.vasp,As2Pt2O6,-3.460801738,0.357910814749997 -Ag2Te8Au2_13_488.vasp,Ag2Te8Au2,-0.5338217241666666,0.14794853166666677 -Cu2W2O6F4_11_5366.vasp,Cu2W2O6F4,-3.816112192857143,0.09065056321428244 -Mn2In2Te5_164_11130.vasp,Mn2In2Te5,-1.457611248888889,0.16015526459769924 -V2P2O12_129_20136.vasp,V2P2O12,-4.8622258075,0.5341458014062503 -Zr3S2N2F2_187_21779.vasp,Zr3S2N2F2,-4.91959679,0.9483896709722122 -Ni2Bi4S6Cl4_2_13475.vasp,Ni2Bi4S6Cl4,-1.74004785125,0.138273032708332 -Gd2Cl6_59_6608.vasp,Gd2Cl6,-2.92615158625,0.01710729874999739 -Li1Co1As2Se6_5_9672.vasp,LiCoAs2Se6,-2.362021152,0.25272226908333106 -Na2Ru2N2O2F10_1_12281.vasp,Na2Ru2N2O2F10,-3.18247661,-0.14745920712963673 -Bi8Te8O4_11_2700.vasp,Bi8Te8O4,-2.092753766,0.23814693266666476 -Hf2P2S6_2_7555.vasp,Hf2P2S6,-4.411090566,0.24546558074999558 -Ni2Sb4S6Cl4_2_13623.vasp,Ni2Sb4S6Cl4,-1.895125214375,0.172647079583332 -K1In1I4O12_2_8911.vasp,KInI4O12,-2.722661048888889,0.05627709284721982 -Tl1Ni5Br2_123_19305.vasp,TlNi5Br2,0.5052196325,1.4172288662499999 -Hf4C3F2_164_7774.vasp,Hf4C3F2,-6.918964352222222,0.1090119776851648 -Ir1I2_115_8737.vasp,IrI2,-0.4305102166666666,0.897373999999999 -W2Se2_129_20547.vasp,W2Se2,-3.708671965,0.589300105 -Ag2Te2Br2_59_454.vasp,Ag2Te2Br2,-0.17893898166666666,0.21632638208333294 -Cu2I2N2_59_5167.vasp,Cu2I2N2,-1.1968222433333333,0.6030657908333308 -U2Se6_129_19726.vasp,U2Se6,-4.38119797625,0.09280342874999992 -H4W2O8_31_7083.vasp,H4W2O8,-5.2408214385714285,-0.044424745952385436 -Sn1Ge1S2Br2_6_16635.vasp,SnGeS2Br2,-1.9828560233333334,0.1793987846874998 -Tl1Sb1Se2_47_19335.vasp,TlSbSe2,-1.40485092,0.5096462675000002 -Hf2Te6_59_7647.vasp,Hf2Te6,-3.04186758875,0.08653316500000008 -Si6N2_191_16532.vasp,Si6N2,-4.484683725,-0.2568554006249999 -Zn2N12_2_21122.vasp,Zn2N12,-5.238306394285714,-0.8374840892857123 -Ga2Co2Se5_187_6334.vasp,Ga2Co2Se5,-2.2556419355555555,0.006809370481477117 -Fe2Mo2O8F2_129_5872.vasp,Fe2Mo2O8F2,-4.0236550921428575,0.12663473011904447 -Cr2Se2I2_59_4496.vasp,Cr2Se2I2,-1.6629323566666667,0.08044092833333316 -Nb4Pd6Se10_59_13129.vasp,Nb4Pd6Se10,-2.9905603525,0.10060009046710205 -Re1Ag2Cl6_147_14987.vasp,ReAg2Cl6,-1.2068706533333333,0.849711775740739 -Ho1Te1_8_8121.vasp,HoTe,-2.03411453,0.9765625399999998 -Te2Au2_164_18372.vasp,Te2Au2,0.09126484,0.5199014875 -Ti2C1Se2_164_18913.vasp,Ti2CSe2,-5.771132074,-0.5587482808000068 -Yb2Br6_12_20863.vasp,Yb2Br6,-2.30496696125,-0.6216923687499998 -Tl2I1Br1_1_19431.vasp,Tl2IBr,-0.5248927225,-0.017430193749999934 -Cd1H1S1Br1_156_3330.vasp,CdHSBr,-1.2971378275,0.10762328406249977 -H8Pb2C10I4N2O2_2_7094.vasp,H8Pb2C10I4N2O2,-4.702048167142857,0.31941520703495874 -Tl2Ni4Te6_164_19465.vasp,Tl2Ni4Te6,-0.5755171958333333,0.14522872708333281 -Mn1Rh1Se2Br2_35_10849.vasp,MnRhSe2Br2,-1.5094466416666668,0.4687223070833332 -Ta1I2_187_17558.vasp,TaI2,-2.14601219,0.6560796521428511 -Sb4Te3Au2I2_6_15833.vasp,Sb4Te3Au2I2,-0.8332723554545454,0.33478841127272535 -Zr2Te2_123_21713.vasp,Zr2Te2,-3.1096567975,-0.1474862625000002 -Ag2As4S3F2_6_167.vasp,Ag2As4S3F2,-2.0102728772727274,0.2858314499053001 -Mn1In1Se2Br2_8_10779.vasp,MnInSe2Br2,-1.4797766783333335,0.19244173770833112 -Hf2I2Br2_6_7512.vasp,Hf2I2Br2,-2.217854725,0.7259795079629601 -Hf1P2O6F2_164_7257.vasp,HfP2O6F2,-5.809739479090909,0.03957906909090969 -Al2O2_164_913.vasp,Al2O2,-5.20687633,0.3000661791666621 -As2W1_187_1307.vasp,As2W,-3.94895913,0.3233632491666627 -Tl2S5_1_19513.vasp,Tl2S5,-1.7880736785714286,0.24577619607142687 -Te2W2I2_25_18528.vasp,Te2W2I2,-2.115154685,0.4426395673611112 -Na1H4C3N3O4_1_11875.vasp,NaH4C3N3O4,-5.549964143333333,-0.10380497008334433 -Na2Dy2Cl8_2_12071.vasp,Na2Dy2Cl8,-2.5640129233333333,0.08988819305555285 -K4S12_13_9503.vasp,K4S12,-2.104455349375,0.10183484187500014 -Ba1Bi4O7_156_1809.vasp,BaBi4O7,-3.3184497991666664,0.6223982518749929 -Ag2S2N2Cl2_31_381.vasp,Ag2S2N2Cl2,-1.85649131875,0.57862518484375 -Sn2P2S6_147_16821.vasp,Sn2P2S6,-2.942060489,0.11636556199999992 -Nb4I16_14_13089.vasp,Nb4I16,-1.258441218,0.18189170749999994 -Ta4Se12_11_18109.vasp,Ta4Se12,-3.98186508875,0.067943626875 -In1Sb2Au1S6_149_8336.vasp,InSb2AuS6,-2.006900901,0.32589037393749765 -In1Ni2Pd1S3I3Br1O1_1_8287.vasp,InNi2PdS3I3BrO,-1.1638916266666668,0.25643897836016033 -Ge1Se2_164_6709.vasp,GeSe2,-2.4616691933333334,0.14246368388888841 -Ho4Te10O26_2_8153.vasp,Ho4Te10O26,-4.437609486,0.07478471949999932 -Cr2Cu2P4O12_4_4367.vasp,Cr2Cu2P4O12,-4.6074295005,0.5124146696666593 -H2Au2_129_6991.vasp,H2Au2,-0.7722374575,2.389308755 -Na1Ga1I4O12_2_11862.vasp,NaGaI4O12,-2.878726075,0.12170079319444205 -Cd2As2S6_147_3455.vasp,Cd2As2S6,-1.906127483,0.4119739456874975 -Ti1I2_164_18796.vasp,TiI2,-2.341136966666667,0.1832921983333331 -Ge2Sb2H2S6_7_6844.vasp,Ge2Sb2H2S6,-2.6909587816666662,0.33894088559027546 -Ti4B3H2O2_164_19119.vasp,Ti4B3H2O2,-6.0267808800000005,0.25588218666666185 -In1S1_123_8326.vasp,InS,-1.82251987,0.45715029500000015 -Ge3S1Br4_1_6918.vasp,Ge3SBr4,-1.870201475,-0.07383545156249993 -Al8O6_11_1110.vasp,Al8O6,-4.645309666428572,0.421209750714282 -Er4I5_10_5578.vasp,Er4I5,-1.6013974233333332,0.1389226090740725 -Fe1Ag2I1N1Cl1O1_1_5617.vasp,FeAg2INClO,-1.3515408871428571,0.36043024374999566 -Sc1P2Au1O6_149_15972.vasp,ScP2AuO6,-4.865151277,0.657622673599993 -Ca2Fe2Ge2_129_3017.vasp,Ca2Fe2Ge2,-1.30281375,0.866566844999998 -Pb8S2O16_2_14339.vasp,Pb8S2O16,-3.673710414230769,0.1759719635576893 -Fe2N2Cl2_59_5884.vasp,Fe2N2Cl2,-2.6678921449999997,0.5811498754166622 -Mn2W2S8F2_129_11344.vasp,Mn2W2S8F2,-3.1352427535714287,0.47775216866070824 -Al2Cl6_26_798.vasp,Al2Cl6,-2.13836967,0.1461400837500002 -Nb2Br1Cl1O2_1_12642.vasp,Nb2BrClO2,-4.7187305450000006,0.2830174446527659 -P4O6_81_14087.vasp,P4O6,-5.112611974,0.14619177960000052 -In1Au1Br2O2_6_8193.vasp,InAuBr2O2,-1.6772697049999998,0.20323692607638488 -Ta2Ni4Se2S2_51_17801.vasp,Ta2Ni4Se2S2,-2.70126325,0.02074847732727081 -Ca2Ag1I2O2_38_2904.vasp,Ca2AgI2O2,-2.1901688842857143,-0.06971858580357244 -Si2S2_59_16437.vasp,Si2S2,-3.4130246625,0.2454295150000002 -Sm1_191_16562.vasp,Sm,-0.60819529,1.5802315424999998 -Mn1Ge1Te2S1Cl1_6_10753.vasp,MnGeTe2SCl,-2.0769180533333333,-0.053738490078127504 -Bi4S6_31_2642.vasp,Bi4S6,-2.286683499,-0.8332616020000001 -Ge2P2O6F2_7_6806.vasp,Ge2P2O6F2,-4.845631149166667,-0.002543143571435272 -Au4S2_26_1580.vasp,Au4S2,-0.16113602666666668,0.16465738333333332 -Na2B2H6C8S2_51_11976.vasp,Na2B2H6C8S2,-4.289837038,1.1783950948245476 -La1Si3_187_9573.vasp,LaSi3,-3.09496736,0.86364714625 -Hf1Ti1S3I1_1_7335.vasp,HfTiS3I,-4.282461751666667,0.2700838774999954 -Zn1Ga2O4_156_20936.vasp,ZnGa2O4,-3.745839102857143,-0.2108618326785775 -Hf1Cd1Cl2O2_6_7134.vasp,HfCdCl2O2,-3.86104342,0.23490070583333322 -Zr2B1Cl2_164_21507.vasp,Zr2BCl2,-4.32464874,-0.16544655764706628 -Nb2P2O6_162_12805.vasp,Nb2P2O6,-5.853195352,0.42532338810000003 -Fe1C8I2F4_25_5655.vasp,FeC8I2F4,-4.427471612000001,0.4777411234166585 -Ta1Sb2_187_17613.vasp,TaSb2,-3.8474227366666667,0.34657598499999986 -Ni2S2_187_13589.vasp,Ni2S2,-0.975825735,0.4526352883333318 -Cr3Br2Cl1O4_1_4546.vasp,Cr3Br2ClO4,-3.498114516,-0.02098383237499979 -Na2H4N2O6_7_12110.vasp,Na2H4N2O6,-4.289330272857143,0.03319363811903919 -Zn1Se2_115_21011.vasp,ZnSe2,-0.71722915,0.5187692702777768 -Co2Pb8_125_3973.vasp,Co2Pb8,-0.713532885,0.6839958290000001 -Ta4H2C3_164_18050.vasp,Ta4H2C3,-7.1826431799999995,0.21816428638887597 -Mn4Se2I1Br3O1_1_11453.vasp,Mn4Se2IBr3O,-2.020111699090909,0.04587394465908923 -Pt4C12_55_14698.vasp,Pt4C12,-4.8230344175,2.107159125 -Si2S2_123_16435.vasp,Si2S2,-2.9246725875,0.7337815900000001 -Ga1Ni1Te2_156_6217.vasp,GaNiTe2,-1.0037080075,0.09664086608333347 -As1Au3S4_156_1134.vasp,AsAu3S4,-1.09536750125,0.5714552107812501 -Sc2P2O6_157_16117.vasp,Sc2P2O6,-5.674492422,0.4715002961499928 -Tl1Sb2Te6Au1_149_19341.vasp,TlSb2Te6Au,-0.9824031379999999,0.18803270695833188 -Ca2Ge4F12_2_3023.vasp,Ca2Ge4F12,-3.3438356316666664,-0.6713542333333357 -Si3Bi4_5_16468.vasp,Si3Bi4,-1.9755660657142857,-0.42729190428571595 -Ti2Zn2_129_19056.vasp,Ti2Zn2,-1.9072017625,0.03899818250000009 -Li2Ni2P2O8_51_10027.vasp,Li2Ni2P2O8,-4.202230232857143,0.20285714007142663 -Li1Hf1S2_156_9723.vasp,LiHfS2,-4.44340821,0.06959359428571044 -Te1O3_187_18314.vasp,TeO3,-2.8734127275,0.8034818415625002 -Au2Se2I2_59_1545.vasp,Au2Se2I2,-0.09902481,0.22981486388888855 -Mg1Al2Se4_164_10335.vasp,MgAl2Se4,-2.7965382828571426,0.07254259285714326 -Ge1Mo1Br2O2_25_6678.vasp,GeMoBr2O2,-3.34249239,0.1358462058333334 -Ti1Se1S1_156_18848.vasp,TiSeS,-4.589698976666667,0.1928162699999998 -Pb5S2I6_12_14326.vasp,Pb5S2I6,-1.1217888176923076,-0.41585915038461596 -Sb2W1_187_15747.vasp,Sb2W,-3.0635166166666665,0.7980304883333302 -H6N2O8_7_7085.vasp,H6N2O8,-4.403110273125,0.036362020312500576 -Hg10O4_14_7829.vasp,Hg10O4,1.0454788857142856,0.43390672781609274 -Pr4I10_11_14562.vasp,Pr4I10,-1.7803412478571428,0.0881849985714287 -Cu2W1S4_111_5363.vasp,Cu2WS4,-2.627590428571428,0.06775397095237867 -Mn2N2Cl2_59_11156.vasp,Mn2N2Cl2,-3.4510228499999998,0.20691675374999474 -Rb2Hg4Te2S6I6_31_14890.vasp,Rb2Hg4Te2S6I6,-0.49453686250000006,0.1264206194374975 -Mg2Ti8O18_85_10530.vasp,Mg2Ti8O18,-6.595031574642857,0.30492488321427924 -Nb1Sn3As1Se1S2Br4Cl2_1_12592.vasp,NbSn3AsSeS2Br4Cl2,-2.1063538457142856,0.19867836817459475 -Zr3Ti1S8_1_21795.vasp,Zr3TiS8,-4.595588301666667,0.2858934606249992 -V2Br8_1_20011.vasp,V2Br8,-1.317903189,0.07994938300000021 -Ga4Te4I4_14_6578.vasp,Ga4Te4I4,-1.2179135666666667,0.04019858749999994 -K2C4_129_9036.vasp,K2C4,-3.6417533416666665,1.4021309208333332 -W8S24_14_20597.vasp,W8S24,-3.8538412278125,0.15507895953125006 -Tm2Br2O2_59_19672.vasp,Tm2Br2O2,-4.730924906666666,0.09457052166666724 -Cs1Ge1S2_156_4640.vasp,CsGeS2,-2.049927785,0.528288785 -H4Pd1C6I2N2_25_7075.vasp,H4PdC6I2N2,-4.929385740666667,0.27677398908332806 -Mn1Mo1S2Br4_3_10797.vasp,MnMoS2Br4,-1.82441942875,0.1592358606696409 -Sr2Cl4_2_17184.vasp,Sr2Cl4,-2.0274064516666668,0.47009130166666635 -K2Sb2S4_13_9342.vasp,K2Sb2S4,-2.16305197625,0.18931956125000005 -Hf1V1Sb1H1Br1O4_1_7355.vasp,HfVSbHBrO4,-4.858929597777777,0.17195307467591414 -B6H4Au1S2N6_6_1777.vasp,B6H4AuS2N6,-4.852831068421052,1.1746984744736824 -Ga4Se4Cl4_14_6572.vasp,Ga4Se4Cl4,-2.0514337641666667,0.07061755749999987 -Sc2Sb2O6_162_16143.vasp,Sc2Sb2O6,-5.3579659280000005,0.07360680362499927 -Tl2Bi2_129_19375.vasp,Tl2Bi2,-0.2421645925,0.28015126125 -Hf2Sc1I2N3_8_7589.vasp,Hf2ScI2N3,-5.64771778125,0.1427483924062421 -Cd2Cu2S2Cl2_26_3490.vasp,Cd2Cu2S2Cl2,-0.511859695,0.19823278531250008 -Ag4O4F8_14_536.vasp,Ag4O4F8,-0.96479326625,0.5010750590625 -Na2Te2F2_2_12316.vasp,Na2Te2F2,-1.7081335066666667,0.2805812655555535 -K4Hg2F8_51_9461.vasp,K4Hg2F8,-1.2472726507142855,0.03540671714285615 -Au6F16_14_1605.vasp,Au6F16,-0.5746597831818182,0.1613340639898979 -Cu1Pb1F6_2_4936.vasp,CuPbF6,-1.605328425,-0.002639197499999968 -Ge2Cl8_1_6772.vasp,Ge2Cl8,-1.570970216,0.08434824949999986 -Hg1H1S1F1_156_7864.vasp,HgHSF,-1.334697685,0.34077961999999995 -Ca2Cu1O2F2_38_2996.vasp,Ca2CuO2F2,-3.2497233442857145,0.3135929807142799 -Hf1Fe2I1O6_8_7165.vasp,HfFe2IO6,-4.288449733,0.2994381636624976 -Co2Te5P2_8_4049.vasp,Co2Te5P2,-1.927931172222222,0.5712200598148125 -Zr2Br8_1_21530.vasp,Zr2Br8,-2.142567477,0.08308580600000015 -Te2Pt2_129_18489.vasp,Te2Pt2,-1.4360763075,0.4614772624999999 -Zr1Te1Se1_156_21463.vasp,ZrTeSe,-3.54491089,0.10514878874999978 -Cr2H4_12_4404.vasp,Cr2H4,-3.133293168333333,1.8175408783333293 -Nb3S4Br4Cl1_1_13006.vasp,Nb3S4Br4Cl,-3.276619073333333,-0.13202082333333243 -Hf2Zr1H1O6_1_7665.vasp,Hf2ZrHO6,-6.687448983,0.6225200724999884 -Ni2N4O12_14_13540.vasp,Ni2N4O12,-4.091543805555556,-0.1774191943055599 -P8S8_5_14157.vasp,P8S8,-3.398013289375,0.11576199277343768 -K2Co2P2_129_9084.vasp,K2Co2P2,-1.9929055616666667,0.0827098733333336 -Ti4Se4Cl4_31_19162.vasp,Ti4Se4Cl4,-3.9460771450000003,-0.374265041190484 -Ni1C6I2F4_47_13302.vasp,NiC6I2F4,-3.881165386923077,0.4250177918269208 -Au2S2_59_1518.vasp,Au2S2,-0.5671883375,0.44460022750000006 -V2Te2C1_164_20202.vasp,V2Te2C,-3.860545374,0.10903515359999849 -Nb4C3S2_164_13047.vasp,Nb4C3S2,-6.865338578888889,-0.2102800524074202 -Tc4F14_13_18248.vasp,Tc4F14,-3.5626435655555557,-0.01332526763889591 -Sb2S2Cl2_59_15675.vasp,Sb2S2Cl2,-2.128698868333333,0.1521771825 -Ta2Fe4Te2S2_51_17735.vasp,Ta2Fe4Te2S2,-2.919301671,0.19795862233333072 -P4Se2O12_18_14120.vasp,P4Se2O12,-4.326234863888889,0.6585175678240667 -In2_51_8644.vasp,In2,-0.563572365,1.9670207549999998 -Co4S4Cl4_14_4085.vasp,Co4S4Cl4,-2.1065718725,0.17406863250000004 -Li2Ni2P2_12_10028.vasp,Li2Ni2P2,-2.102217395,0.11846642424242482 -Ag2As2Se6_2_160.vasp,Ag2As2Se6,-1.52107147,-0.05041851673684472 -Cd1H4N6Cl2_1_3358.vasp,CdH4N6Cl2,-3.952497577692308,-0.05920671615385098 -Sr1Ge2_164_17051.vasp,SrGe2,-1.3911060466666667,0.9681518800000002 -Li4V4O12_13_10245.vasp,Li4V4O12,-5.1907546415,0.1541005885000004 -Mg2Sb2O6_162_10503.vasp,Mg2Sb2O6,-4.119654239,0.24343080524999605 -In2Te6Pt4_164_8643.vasp,In2Te6Pt4,-1.6520810491666669,0.19124434583333305 -Ca2P2H10O12_7_3084.vasp,Ca2P2H10O12,-4.824079232692307,0.04385185762820032 -Te1As1Br1_156_18278.vasp,TeAsBr,-1.49131354,0.27720772333333343 -Cr2Se4_127_4503.vasp,Cr2Se4,-1.8651168066666666,0.9013688083333335 -Mn2Nb2S6_11_11162.vasp,Mn2Nb2S6,-4.068154814,0.1989652493333296 -Au4Se4Cl4_14_1599.vasp,Au4Se4Cl4,-0.5761274241666666,0.05406766933333301 -Bi2Pd4O8_129_2504.vasp,Bi2Pd4O8,-2.832803369285714,0.36473430642856897 -Ca6Al2As6_26_3254.vasp,Ca6Al2As6,-2.3436064757142856,0.32787723000000035 -Ge4O4_57_6933.vasp,Ge4O4,-4.41318868125,-0.20647061187500038 -Zr2Br2_164_21523.vasp,Zr2Br2,-2.9547233125,0.11860297499999994 -Au2Se2_164_1549.vasp,Au2Se2,-0.257765085,0.418355195 -Tl2Cl4_10_19392.vasp,Tl2Cl4,-0.8011040349999999,-0.1618958399999999 -Na1Ti1Se2_156_11944.vasp,NaTiSe2,-3.4542053425,0.2894445450000003 -Zn2Fe1C6N6_2_21074.vasp,Zn2FeC6N6,-5.589901336,0.3492558126666534 -Bi2W2_12_2582.vasp,Bi2W2,-3.3139524125,0.4282351700000002 -Ni4Se6S2_7_13765.vasp,Ni4Se6S2,-1.3583024358333333,0.23457404423610934 -Nd1Sn2_123_13229.vasp,NdSn2,-1.6088251666666666,0.6960696816666667 -Mn1Sb2Br1_156_10868.vasp,MnSb2Br,-1.37298122,0.4677988706249999 -Sc2F2_164_16068.vasp,Sc2F2,-3.668015495,-0.1297484133333362 -Fe2S4_11_5942.vasp,Fe2S4,-2.307543265,-0.3714173500000002 -Na2B2C8S2F6_51_11971.vasp,Na2B2C8S2F6,-3.8907084615,1.6343581436015588 -Fe2Se2O8_31_5975.vasp,Fe2Se2O8,-3.426465375833333,0.23155533499999326 -Hf2C1Cl2_164_7455.vasp,Hf2CCl2,-5.4484513020000005,0.027654689999999427 -Sn2S1Br1Cl1_1_16832.vasp,Sn2SBrCl,-1.738388428,0.0938334820000003 -Mg2Se1O1_6_10513.vasp,Mg2SeO,-2.8690837125,0.25264678374999994 -Cu2Br4O12_4_5055.vasp,Cu2Br4O12,-2.0049596411111112,0.27824562805555364 -Ba4Sb2O1_123_2175.vasp,Ba4Sb2O,-2.3646924171428574,0.10343728357142856 -Y2C1O2_164_20711.vasp,Y2CO2,-6.369785688,0.8526921064687425 -Na1Tl3Hg2N1O2F6_1_11950.vasp,NaTl3Hg2NO2F6,-1.6348309086666668,0.3325790891111051 -Cs2C2O6_11_4667.vasp,Cs2C2O6,-4.7019816720000005,0.12201611262499701 -Cu1B6N6O2F4_6_4846.vasp,CuB6N6O2F4,-5.340748352105263,0.5035607423391739 -Sb8Pb4_26_15873.vasp,Sb8Pb4,-1.5479013258333334,0.4172054291666649 -Ti4H2C3_164_19137.vasp,Ti4H2C3,-6.832290064444445,-0.12625639555556223 -Zr1Mo2O8_12_21330.vasp,ZrMo2O8,-5.583605815454546,0.11541635181818144 -Fe2Mo2S8Cl2_129_5876.vasp,Fe2Mo2S8Cl2,-2.2044145942857143,0.37146732133928073 -Ge1F2_164_6663.vasp,GeF2,-2.8520030033333335,0.2926901683333334 -V2S2F2_59_20154.vasp,V2S2F2,-3.6375581733333333,-0.060254836111114596 -Hg1H1_183_7866.vasp,HgH,0.419776785,1.6052588893965516 -Ag2C6N8O10_2_235.vasp,Ag2C6N8O10,-5.169188734615385,0.38140100862179027 -Cr2Cu2P4S12_2_4369.vasp,Cr2Cu2P4S12,-2.966372334,0.03001105578645258 -Li2H4I2O2_6_9938.vasp,Li2H4I2O2,-3.315494863,-0.16797308300000013 -Al2Tl2F8_3_1025.vasp,Al2Tl2F8,-3.1666214216666666,0.2495852133333334 -Hf1Tl1I1N1Cl1O1_1_7345.vasp,HfTlINClO,-3.6737561816666666,0.5138088828472149 -K2Mg1S10F4_2_9222.vasp,K2MgS10F4,-2.095054347647059,0.6187320537499974 -Mn2Te4As2Cl2_26_11313.vasp,Mn2Te4As2Cl2,-1.748192035,0.2912078244999963 -Co1O2_12_3804.vasp,CoO2,-3.7248583566666666,-0.6276919245833359 -In2S3_150_8557.vasp,In2S3,-2.035816234,0.48882414900000004 -Sb6H2O12_4_15848.vasp,Sb6H2O12,-4.1556092985,0.20554112041666706 -Ag4Se4Br4_14_562.vasp,Ag4Se4Br4,-0.4180390858333333,0.2872730152777772 -Co1C6Cl2F4_47_3717.vasp,CoC6Cl2F4,-4.324319869230769,0.42982768801281324 -Nb3Br2Cl1O4_1_12951.vasp,Nb3Br2ClO4,-5.053908444,0.18634998133332736 -Cu2S4_6_5262.vasp,Cu2S4,-1.5460432533333333,0.23485415423610967 -Nb4B3S2F2_164_13038.vasp,Nb4B3S2F2,-5.181963593636364,0.4288898609673606 -Ag1Br2_187_37.vasp,AgBr2,0.29518136333333334,0.22900891666666673 -Mo2F6_162_11607.vasp,Mo2F6,-2.99854155,-0.18850635562499996 -As4_53_1378.vasp,As4,-3.0546317275,0.15655283250000007 -Ag2Br4_14_207.vasp,Ag2Br4,0.1863894633333333,0.12021701666666669 -Ta1Cu1Ni1S1I2N2O1_1_17538.vasp,TaCuNiSI2N2O,-3.18201322,0.3277786738734519 -Sr2As4O12_2_17121.vasp,Sr2As4O12,-4.413589533333333,0.27854005388888936 -Nb2B1H2S2_164_12630.vasp,Nb2BH2S2,-4.763380085714286,0.7800091951428472 -Al1In1Hg1S4_156_677.vasp,AlInHgS4,-2.139340184285714,0.14355601892857162 -Ti1Te2_123_18858.vasp,TiTe2,-3.2500595066666667,0.3801477516666667 -Cu2C2Cl2O2_31_5061.vasp,Cu2C2Cl2O2,-3.33404776625,0.3213505193750001 -Zr1Ti1I6_5_21470.vasp,ZrTiI6,-1.7666600425,0.2705834387499999 -Na1O4_143_11922.vasp,NaO4,-2.576305208,0.25442875350000027 -B18Se9_143_1614.vasp,B18Se9,-4.2446269725925925,0.5923579818518476 -Cu1Si2Ni1Te5Se1_1_4980.vasp,CuSi2NiTe5Se,-1.501742578,0.33939733425346863 -Li1W2I6O2_47_9813.vasp,LiW2I6O2,-2.4298674463636365,-0.3709185335000057 -P1I3_157_13922.vasp,PI3,-0.6011263875,0.1773795774999996 -Sr2Ti2Si4O14_51_17329.vasp,Sr2Ti2Si4O14,-6.286734445909091,0.11671227742423029 -Mg1Br2_187_10348.vasp,MgBr2,-1.3051826766666668,0.2327878877777776 -K2Bi2F8_8_9002.vasp,K2Bi2F8,-2.3228903858333334,0.270904658333333 -Pr2Br2O4_11_14543.vasp,Pr2Br2O4,-4.17574283875,0.3305859603125001 -Cr2O2_164_4437.vasp,Cr2O2,-4.4332579675,0.6920410324999948 -Nb4S6_2_13144.vasp,Nb4S6,-5.0544601579999995,-0.15191866150000344 -Sr1Te2H2_5_17094.vasp,SrTe2H2,-2.145499378,0.8061518293333338 -Bi4Cl12_11_2607.vasp,Bi4Cl12,-1.36745721,0.047836250000000025 -K2B2O8F8_1_8995.vasp,K2B2O8F8,-2.7050946705000003,0.90938552725 -K4As8F28_14_9412.vasp,K4As8F28,-2.73993377075,0.028891418499999766 -Te2Pd1_164_18463.vasp,Te2Pd,-1.2488150599999999,0.24022947666666683 -Hf2Mo2O8_10_7535.vasp,Hf2Mo2O8,-6.2178421475,0.3318573575000001 -Ag1Pt1F5_1_105.vasp,AgPtF5,-1.1642014714285713,0.16970111142857036 -Mg2Si1O4_123_10514.vasp,Mg2SiO4,-3.4781022214285713,1.9612328846428566 -B2O3_189_1688.vasp,B2O3,-6.739961461999999,0.11437291333333466 -Ti3N2O2_187_19096.vasp,Ti3N2O2,-7.7824886342857145,-0.1686190807142922 -K4Mn2Se4_49_9474.vasp,K4Mn2Se4,-1.218126311,0.08623534 -Hg1Cl2_115_7851.vasp,HgCl2,0.27853094333333334,0.14829276666666666 -Mo1W2O8_2_11555.vasp,MoW2O8,-5.697613050909091,0.015841654545449835 -Sr1Bi2F12_2_17028.vasp,SrBi2F12,-2.2773398333333335,0.00408947533333337 -Ba4As2_59_2130.vasp,Ba4As2,-1.6149881266666668,0.2920533766666648 -Ge1Te4As2_164_6721.vasp,GeTe4As2,-2.1439585514285713,-0.21626430785714423 -As2Pb2Se6_147_1262.vasp,As2Pb2Se6,-2.0988254690000003,0.2149715512083308 -Ag2I4_14_320.vasp,Ag2I4,0.5108258933333333,0.15208670062500027 -Mn1In1Au1O4_25_10772.vasp,MnInAuO4,-2.9187230785714284,0.7057533274999956 -Ag2F2_67_258.vasp,Ag2F2,-0.28344088,0.46260627499999996 -Ni1Cl2O6_12_13309.vasp,NiCl2O6,-2.0569061933333335,0.28436811305555354 -Nb2Cu1S4_164_12706.vasp,Nb2CuS4,-3.715251562857143,0.6275791180952357 -Ni1C8Br2F4_25_13305.vasp,NiC8Br2F4,-4.378563183333333,0.5052080759999942 -Tl2N6_164_19458.vasp,Tl2N6,-4.4117018325,-0.3144683456250003 -Mn2Sb2O4F2_26_11236.vasp,Mn2Sb2O4F2,-3.706843225,0.06538087399999779 -Ca3Si1Br2_8_3201.vasp,Ca3SiBr2,-1.5328865383333332,0.21891998291666692 -Hf2Cl6_189_7480.vasp,Hf2Cl6,-3.11024399,0.24619790499999672 -Ca2As1_25_2922.vasp,Ca2As,-0.93279061,1.0108938488888872 -Ba2Mn3O8_99_2029.vasp,Ba2Mn3O8,-4.34249820923077,0.28220458307691865 -Sc3C2O2_187_16200.vasp,Sc3C2O2,-5.867703212857143,0.42514894840815076 -Cr4O10_31_4612.vasp,Cr4O10,-4.8875592021428576,-0.2782536417857183 -Ta1Te2_191_17630.vasp,TaTe2,-2.7832923766666666,0.9645909922222224 -Sr2Be2_164_17140.vasp,Sr2Be2,-0.5511540525,1.2280066651923058 -Cr2S2_129_4468.vasp,Cr2S2,-3.42701255,0.35299850499999974 -K4Sb8F28_14_9510.vasp,K4Sb8F28,-2.7421412615,0.036383404499999994 -Cr1Se2_164_4264.vasp,CrSe2,-2.62434818,0.14213743499999998 -Cu10C4O24_2_4814.vasp,Cu10C4O24,-3.42023430631579,0.36734199315788985 -Ta3Cr2C1Br4N3_1_17956.vasp,Ta3Cr2CBr4N3,-5.011559153846154,0.2319961691025511 -As2Se2S1_164_1300.vasp,As2Se2S,-2.689632862,0.2208821241666643 -Ru2Se1I1Br3_1_15351.vasp,Ru2SeIBr3,-1.3694496328571428,0.3760765392618997 -Mn1Bi1Se1Br2N1_1_10649.vasp,MnBiSeBr2N,-2.1768380933333336,0.34226244208332757 -Ga2Ge2S2_164_6363.vasp,Ga2Ge2S2,-2.903277063333333,-0.27513419166666875 -Ni2Sb2Te6_162_13619.vasp,Ni2Sb2Te6,-1.048764356,0.20199689357142636 -Mn2Br6_162_11034.vasp,Mn2Br6,-0.94882397125,0.159524585 -Zr1Ta2Ni1Te1Se1Br1Cl1_1_21457.vasp,ZrTa2NiTeSeBrCl,-3.03150879625,0.7868633804947784 -V2I6_189_20101.vasp,V2I6,-0.8393951975,0.21183506500000004 -Be3C1_99_2276.vasp,Be3C,-3.8311685425,-0.2273026162499998 -Hf2I6_162_7523.vasp,Hf2I6,-1.88334288125,0.41777469499999986 -Al2Fe2Te5_156_839.vasp,Al2Fe2Te5,-1.6926985833333332,0.15987095782407257 -Ta2Cl10_2_17687.vasp,Ta2Cl10,-2.6560016066666665,0.10711819500000042 -Ti2C1O2_164_18910.vasp,Ti2CO2,-7.400541042,0.014257957333318139 -Co2Mo2Cl2O8_129_3931.vasp,Co2Mo2Cl2O8,-3.925591052857143,0.13449737434523085 -Ho2Se2F2_164_8148.vasp,Ho2Se2F2,-4.0184588733333335,0.24639072527777373 -Pt2Br2_164_14600.vasp,Pt2Br2,-0.97270983,0.45695878062499995 -Sb2Se2Cl2_59_15691.vasp,Sb2Se2Cl2,-1.8916121266666668,0.23085496083333323 -Mn4C3_164_11430.vasp,Mn4C3,-4.2317160028571426,0.4809770414285679 -Li1Co1P2S6_149_9674.vasp,LiCoP2S6,-3.2017342429999998,0.05218213244270664 -B2F2_164_1666.vasp,B2F2,-4.353930235,0.17846133111110696 -As2Se2_164_1302.vasp,As2Se2,-2.3284482675,0.37843667166666406 -Cr1Ru1Cl2O2_25_4237.vasp,CrRuCl2O2,-3.4054254383333333,0.08913301930554765 -Sn2Te2Cl2_59_16889.vasp,Sn2Te2Cl2,-1.3187216816666667,-0.25551808305555657 -Ca1Cu2S8_89_2829.vasp,CaCu2S8,-2.071419729090909,0.14952227304923804 -Ga2Cl6_189_6321.vasp,Ga2Cl6,-1.398166965,0.22801584250000007 -Ag2I1Br3_1_309.vasp,Ag2IBr3,0.27820950666666666,0.18062926000000007 -Sb1Au3O4_156_15435.vasp,SbAu3O4,-1.63381122875,0.9850397710416652 -Ta2F10_51_17719.vasp,Ta2F10,-4.1187336750000005,0.24822262416666607 -Hg2Bi2I2O4_11_7936.vasp,Hg2Bi2I2O4,-1.700492762,0.13002391263725055 -Li2H4C2S6_7_9936.vasp,Li2H4C2S6,-3.520659324285714,0.23899557477678146 -Zr1In1S2_156_21314.vasp,ZrInS2,-3.2202597475,0.7097305931249975 -Mo1I5_6_11519.vasp,MoI5,-0.208515745,0.28069161840277734 -Bi6Pd3_147_2673.vasp,Bi6Pd3,-1.0685386855555556,-0.3149609755555556 -Sb1H2S2_164_15458.vasp,SbH2S2,-2.693564952,0.33245919766666454 -K2Cd4S8Br6_31_9054.vasp,K2Cd4S8Br6,-0.9139223845,0.2556495416875003 -Li4Zn2Ge2_164_10253.vasp,Li4Zn2Ge2,-1.1647937325,0.299478645 -Ru2Se4_127_15363.vasp,Ru2Se4,-2.2016439333333335,0.9929565266666667 -Nb4Ni2S10_13_13100.vasp,Nb4Ni2S10,-4.009746963125,-0.2615628723437493 -Ga1Cl2_164_6149.vasp,GaCl2,-1.3638818966666666,0.3594885750000001 -Ca1Cl2_164_2818.vasp,CaCl2,-2.3455334066666667,-0.11730226833333335 -Sb2Te6Ru2_162_15743.vasp,Sb2Te6Ru2,-1.966353167,0.3790153330999981 -Zn2Ni4S10_6_21127.vasp,Zn2Ni4S10,-1.30103575125,0.3809692906249978 -Sb2H2Pb2O6_7_15581.vasp,Sb2H2Pb2O6,-3.6927481575,0.28195625708332983 -K4S4N4O12_57_9504.vasp,K4S4N4O12,-3.6758155345833337,0.5620815342881873 -Cu2Sb4Se3I2_6_5283.vasp,Cu2Sb4Se3I2,-1.2456763400000002,0.5498517440909055 -Ru2Se2Cl2_59_15354.vasp,Ru2Se2Cl2,-2.2607060833333334,0.38914654027777473 -Sn2Au2O6_51_16732.vasp,Sn2Au2O6,-2.742690643,0.35702012299999897 -Sc2Te2_164_16179.vasp,Sc2Te2,-2.4132212475,0.7936202225 -Bi1Sb2Te6Au1_143_2385.vasp,BiSb2Te6Au,-1.142151393,0.24306009206249968 -Pb2S2I2_59_14275.vasp,Pb2S2I2,-1.2743390933333334,-0.2533942620486131 -Cd2S4_14_3550.vasp,Cd2S4,-1.00265206,0.3642520139583322 -Cs2B2Te2H6O6_4_4662.vasp,Cs2B2Te2H6O6,-3.409330619444445,0.934220648499993 -Li1Ni2Te2Br1_6_9771.vasp,LiNi2Te2Br,-0.7482886350000001,0.407941874999999 -Ge3Sb4_5_6921.vasp,Ge3Sb4,-2.312875892857143,-0.07670515500000219 -H2Pd2S4_11_7015.vasp,H2Pd2S4,-2.5074691975,0.10119444625000007 -Hf2B1S2_164_7439.vasp,Hf2BS2,-5.701620388,0.030700636499994882 -Fe2Sb2P4O16_11_5950.vasp,Fe2Sb2P4O16,-4.930391883333333,-0.012941480833332797 -Os2O2_129_13858.vasp,Os2O2,-3.6439136175,1.955281865 -Ge1F4_123_6665.vasp,GeF4,-2.762267488,-0.013582621999999933 -V1Rh1Br2O2_6_19905.vasp,VRhBr2O2,-3.0460796683333338,0.20641380583332558 -Li6H2S10_11_10265.vasp,Li6H2S10,-2.9295102094444445,0.028545553402775092 -Pr4C2Cl5_47_14559.vasp,Pr4C2Cl5,-3.98864925,0.13272003818181854 -Sc1Br2_187_15914.vasp,ScBr2,-2.2512236766666667,0.13648964166666433 -Yb2Se2F2_164_20886.vasp,Yb2Se2F2,-4.0364553249999995,-0.5306942377777795 -Li4Te4O8_13_10231.vasp,Li4Te4O8,-3.58288739625,0.301006997447917 -Li2S4Br2F8_1_10055.vasp,Li2S4Br2F8,-1.941357510625,0.27157717283203126 -Ba2N1_164_2030.vasp,Ba2N,-2.483683016666667,0.19929398666666653 -Nb3Cu1Br6O2_1_12969.vasp,Nb3CuBr6O2,-3.0722135183333332,0.43926687032406686 -W1Se1S1_156_20454.vasp,WSeS,-3.932584373333333,0.16667942666666713 -In6Se6_2_8711.vasp,In6Se6,-1.8072245708333332,0.09619079166666689 -Cs2C2Se2O6F6_1_4676.vasp,Cs2C2Se2O6F6,-3.274062221111111,0.4590829484722194 -Ta1As2_164_17506.vasp,TaAs2,-4.668809503333333,0.47845972333333364 -In2Te2S8F2_11_8626.vasp,In2Te2S8F2,-1.989751967142857,0.46672034925594863 -Ge2P6_164_6816.vasp,Ge2P6,-3.54414866875,0.03359222624999969 -Ni2P4S6I4_11_13570.vasp,Ni2P4S6I4,-1.90735583375,0.21998052766368392 -Zr2Br2_129_21525.vasp,Zr2Br2,-2.4127971325,0.6605291549999999 -Pt2I2N1O1_25_14626.vasp,Pt2I2NO,-1.8922936566666666,0.32528794020832574 -Cd2Au2Se2Cl2_26_3462.vasp,Cd2Au2Se2Cl2,-0.0372291125,0.10443532122 -Ga2Se2_164_6477.vasp,Ga2Se2,-2.3566248825,0.060832625000000196 -K2Hg3Ge2S8_3_9171.vasp,K2Hg3Ge2S8,-1.527944962,0.22259717 -Zr1H2_187_21305.vasp,ZrH2,-3.563133823333333,0.501563023333333 -Li1Al1Te2_156_9649.vasp,LiAlTe2,-2.16996274,0.09506787750000001 -Nb1Br4_123_12483.vasp,NbBr4,-1.801931868,0.33967414699999976 -Ge2I2_164_6782.vasp,Ge2I2,-1.30392043,0.15344241874999998 -V1Se2_187_19932.vasp,VSe2,-3.0775828633333333,0.06902085499999977 -Mg1Au2F12_115_10337.vasp,MgAu2F12,-1.0473945353333334,-0.013028337666666778 -Ta4Pt6S10_31_18094.vasp,Ta4Pt6S10,-3.8561238705000003,0.09986692120832952 -Mo3O8_12_11717.vasp,Mo3O8,-5.0907815745454545,0.1187910143939348 -Sn2O2F4_1_16796.vasp,Sn2O2F4,-3.06091814,0.17147549062499956 -V2B1S2_164_19993.vasp,V2BS2,-4.372298218,0.2135654606666626 -Sc2Cl2O2_59_16061.vasp,Sc2Cl2O2,-4.951829981666667,0.03469535666666612 -Bi2Se2Cl2_59_2539.vasp,Bi2Se2Cl2,-1.6953350716666666,0.1175227483333332 -Er2Co2Ge4_129_5555.vasp,Er2Co2Ge4,-2.83071203375,0.3898631271874968 -Hg1H4C2N4Cl2_10_7872.vasp,HgH4C2N4Cl2,-4.165303865384615,0.1718612050640982 -Sn2Se2S8_7_16881.vasp,Sn2Se2S8,-2.2076490525,0.3562115061805533 -Bi8O12_51_2687.vasp,Bi8O12,-3.385671395,0.4723228329999998 -As2F10_51_1208.vasp,As2F10,-1.8247590291666667,0.5617204641666667 -Ag2Hg2Te2Cl2_26_306.vasp,Ag2Hg2Te2Cl2,0.24087066,0.10880452020833334 -Mn1Bi1Se1I2_1_10650.vasp,MnBiSeI2,-1.04705505,0.11488861814285334 -Sb2Te8Pd3_164_15744.vasp,Sb2Te8Pd3,-1.1829031184615384,0.46387861061538294 -Zn2Cr4O10_59_21064.vasp,Zn2Cr4O10,-4.15384547875,0.010203837656249659 -Nb2Se1S1_8_12868.vasp,Nb2SeS,-4.8839942575,-0.2608290130625057 -Cr4C3Cl2_164_4594.vasp,Cr4C3Cl2,-4.249442734444445,0.19840523870369192 -Sr2Tl1Hg1Au1S5_99_17339.vasp,Sr2TlHgAuS5,-1.556158209,0.2250483919374977 -In1Cu1P2O6_149_8227.vasp,InCuP2O6,-4.3544674919999995,0.4516154329999893 -Ca2C4_51_2973.vasp,Ca2C4,-4.996373226666667,0.5819263716666612 -P4Pd4S4_13_14101.vasp,P4Pd4S4,-2.891355959166667,0.3364245699999997 -Si2Sb2S6_12_16440.vasp,Si2Sb2S6,-3.056306078,0.35932963216666514 -Tl16S12_14_19191.vasp,Tl16S12,-1.2919529682142856,0.1578619816964265 -Cr2F2_164_4380.vasp,Cr2F2,-3.056409335,0.708071667499997 -Tl2P2Se6_147_19482.vasp,Tl2P2Se6,-2.049319119,0.2203239708541646 -Ni1C6F6_47_13301.vasp,NiC6F6,-4.246978248461539,0.4432722665384532 -Cu2Pt1C6N8_164_5230.vasp,Cu2PtC6N8,-5.056882654705882,0.7043299717646991 -Ga1Cu1S2Cl3_1_6169.vasp,GaCuS2Cl3,-1.4886449542857143,0.20384411038690103 -Zr1Ti1Ir1S1I2O1_1_21471.vasp,ZrTiIrSI2O,-3.8408360685714285,0.42087262357142396 -Rb2B12H12O12_12_14771.vasp,Rb2B12H12O12,-5.065731862631579,0.6362024406232585 -Zr3Br2N1_47_21751.vasp,Zr3Br2N,-4.179011191666667,0.3067264499999953 -Mn1Nb1S1I2O2_1_10808.vasp,MnNbSI2O2,-3.50645447,0.30902187205356724 -V1Br2_115_19787.vasp,VBr2,-1.5035663033333335,0.24274852999999985 -Tm1Mg5_8_19666.vasp,TmMg5,-0.07794830333333333,0.30686449772222213 -As1Se1Cl1_156_1176.vasp,AsSeCl,-2.0863229333333333,0.06942673499999796 -V2S2_164_20164.vasp,V2S2,-3.74463736,-0.08922483156250438 -Li1Mo2Cl6O2_47_9750.vasp,LiMo2Cl6O2,-2.739349108181818,0.05869654363635868 -Cu1Ge1I1Br1_1_4881.vasp,CuGeIBr,-0.72792291,0.7430293912500001 -B2Os1_123_1691.vasp,B2Os,-4.741070616666667,1.4130064750000004 -Fe2P1Se2_187_5901.vasp,Fe2PSe2,-2.0836647580000003,0.46865195149999983 -Mg2Ni2P4O14_2_10490.vasp,Mg2Ni2P4O14,-4.849036337272728,0.04064102499999789 -In2P6_164_8524.vasp,In2P6,-2.94903357375,-0.10008175124999985 -Rh2F2_12_15189.vasp,Rh2F2,-1.67241686,0.830443870833331 -Ni1H4C2N4Cl2_47_13335.vasp,NiH4C2N4Cl2,-4.353663156923077,0.1586916177564036 -Cd2Te2H4O8_31_3591.vasp,Cd2Te2H4O8,-3.3822220875,0.06994282151041653 -Sb2Pd1_123_15649.vasp,Sb2Pd,-1.8825106333333332,0.3717661583333336 -Te2As1Pd2_187_18346.vasp,Te2AsPd2,-1.673627418,0.11049034749999859 -Te1Pd1_156_18327.vasp,TePd,-0.69811785,0.48340550625 -K2B2H6N8O2_51_8988.vasp,K2B2H6N8O2,-4.788423516,-1.4924774530833331 -Cu4Te2O12_14_5478.vasp,Cu4Te2O12,-2.7534529194444444,0.3096227011111087 -Rb2Hg4S8Cl6_31_14873.vasp,Rb2Hg4S8Cl6,-0.8369126785000001,0.26334473456250007 -Tl2Au2Se1S3I3Br1_1_19368.vasp,Tl2Au2SeS3I3Br,-0.6073745991666667,0.23354274880208253 -Ta3B2O2_187_17942.vasp,Ta3B2O2,-7.2905896028571435,0.23748563757141383 -Dy2Te6_129_5537.vasp,Dy2Te6,-2.4117120325,0.05455304500000002 -Cu2Te4Br2_4_5350.vasp,Cu2Te4Br2,-0.63166730875,0.12846303187499997 -Te3O9_157_18551.vasp,Te3O9,-2.8812085641666667,0.7956860048958334 -Ca2B8H40N4_30_2948.vasp,Ca2B8H40N4,-4.1303904650000005,0.7371305666666619 -In1Pt5F2_38_8323.vasp,InPt5F2,-1.367280775,1.5151116637499977 -Cd1H2O2_156_3336.vasp,CdH2O2,-2.9700087440000003,0.2332372119999997 -Ta2Cl4O2_47_17693.vasp,Ta2Cl4O2,-4.67172240625,0.04649414874999991 -Cd2Bi2S4Br2_11_3470.vasp,Cd2Bi2S4Br2,-1.2052535880000002,0.19451950450000005 -Pd2O4F2_11_14447.vasp,Pd2O4F2,-2.03766980625,0.4301680952083309 -Sn1Se1_156_16693.vasp,SnSe,-1.84781238,-0.2715340049999999 -Na2Te2H2_4_12317.vasp,Na2Te2H2,-1.8874338,0.6402495036666631 -K2C8O4F4_3_9038.vasp,K2C8O4F4,-5.168158188888889,0.1653222708333249 -V3Mo1Cl3O5_1_20275.vasp,V3MoCl3O5,-4.272723543333333,0.0016352856249983727 -Cd1C6Br2F4_10_3297.vasp,CdC6Br2F4,-3.8084269592307693,0.5929784978846082 -Al2Fe1_123_832.vasp,Al2Fe,-1.7669029733333332,0.31894855666666655 -Sb4Te6_13_15837.vasp,Sb4Te6,-1.4919357229999999,0.354369951 -Cr2Sn2Se6_162_4512.vasp,Cr2Sn2Se6,-2.213240356,0.07716236299999746 -Zn2Te1Se1N1_1_21176.vasp,Zn2TeSeN,-1.234779138,0.20104467200000026 -Na2Mg2Sb2_129_12204.vasp,Na2Mg2Sb2,-0.8555987266666666,0.5737821516666667 -Li1W2Br6O2_47_9811.vasp,LiW2Br6O2,-2.922649239090909,-0.5268482014803972 -Zr1Ge3Te1Se4Cl3_1_21303.vasp,ZrGe3TeSe4Cl3,-2.5261054883333336,0.278653694340272 -Hf2Br2N2_164_7444.vasp,Hf2Br2N2,-5.977169969999999,0.024340653333334572 -Nb3Pd3S14_6_12993.vasp,Nb3Pd3S14,-3.4225990685,-0.032739760984377086 -Sr1I2_115_17058.vasp,SrI2,-0.9468477466666667,0.33919561222222216 -Ga2Se2_123_6475.vasp,Ga2Se2,-1.8633270275,0.55413048 -Ru2F2_129_15313.vasp,Ru2F2,-1.5331228625,1.5802814999999972 -Sr2Ge4F12_2_17226.vasp,Sr2Ge4F12,-3.330507996111111,-0.3799428400000021 -Nd2N2O10_4_13241.vasp,Nd2N2O10,-5.008758832857143,0.15389796065475714 -Bi2S1O2_164_2508.vasp,Bi2SO2,-3.178814336,-0.12234421833333575 -Nb1Bi2_187_12476.vasp,NbBi2,-2.69511672,-0.22479260666666878 -As4S6_81_1363.vasp,As4S6,-2.869897804,0.6495971245000001 -Ta1Cl1F1_156_17523.vasp,TaClF,-3.93519522,0.6691180166666595 -Bi2Br8_1_2437.vasp,Bi2Br8,-0.574564542,0.217209373 -Ca2S6F8_26_3109.vasp,Ca2S6F8,-2.305027834375,0.5889804921484373 -Zr1Sb2S6F2_164_21426.vasp,ZrSb2S6F2,-2.7764439854545455,0.687538350369311 -Nb4Pb2O12_26_13120.vasp,Nb4Pb2O12,-5.980450011666666,0.2644719750000002 -Si2Te6P2_147_16461.vasp,Si2Te6P2,-2.217438365,0.4842497526666666 -Sb4Te4Pd4_13_15834.vasp,Sb4Te4Pd4,-1.580556445,0.416976225 -Y1F2_164_20630.vasp,YF2,-4.407960496666667,0.68572971055555 -Ni3Se5Br2_1_13725.vasp,Ni3Se5Br2,-0.894454896,0.22297610416666686 -Li1C12_191_9666.vasp,LiC12,-7.61144758,0.014836353076923103 -Zr1Sc1S1I2O1_6_21435.vasp,ZrScSI2O,-3.73895273,0.2027149618749966 -Li2Cu1P1_187_9882.vasp,Li2CuP,-2.02600967,0.23245529750000005 -Li10Si2_164_9633.vasp,Li10Si2,-2.0483204241666666,0.1527814200555535 -Hf2Te1S1I1_1_7626.vasp,Hf2TeSI,-3.9714552640000003,0.01379596875000022 -In2Cl2O2_59_8399.vasp,In2Cl2O2,-2.8588940666666667,0.03651169166666701 -Cu3Se3_187_5390.vasp,Cu3Se3,-0.6428964383333333,0.2677757475000001 -Er2Cl6_59_5553.vasp,Er2Cl6,-2.87086763625,0.042121076249999945 -Co2C2I2_59_3883.vasp,Co2C2I2,-2.5833759033333332,0.6728249638888861 -La1Se3_99_9572.vasp,LaSe3,-2.997148575,0.37335724270833304 -Hf1Ge2W2Se1S2I6_1_7185.vasp,HfGe2W2SeS2I6,-2.07518472,0.5968539007142775 -Ga1Pd1S2Br2_1_6236.vasp,GaPdS2Br2,-1.5557759016666666,0.2994324295833294 -V2B1O2_12_19991.vasp,V2BO2,-5.300357412,0.6683972221111059 -Pr2Te4Se2_129_14554.vasp,Pr2Te4Se2,-2.91173710125,0.050755601250000115 -Rh2Br2_164_15175.vasp,Rh2Br2,-0.81643082,0.9194901533333318 -Ge2Cl2O3_8_6766.vasp,Ge2Cl2O3,-3.6378308885714286,0.0934749889285671 -Y1Ag1Br2O2_1_20602.vasp,YAgBr2O2,-3.0234574750000003,0.2934248866666662 -K1I1O3_143_8906.vasp,KIO3,-2.378364806,0.29383145624999996 -Nb2Ni1Te6_12_12778.vasp,Nb2NiTe6,-2.443624476666667,0.11741491657407144 -Cu2F2_67_5092.vasp,Cu2F2,-0.675906755,0.693995565 -Zr3B2_187_21747.vasp,Zr3B2,-4.8810449,0.323738343999997 -Cu2N6O18_11_5192.vasp,Cu2N6O18,-4.074196124999999,0.0463951225961467 -Ga4S4I4_14_6564.vasp,Ga4S4I4,-1.8492677358333334,0.04609462999999803 -K1Sn1Te2_156_8942.vasp,KSnTe2,-0.9315858025,-0.02216233718750113 -Li2Pb1_187_10041.vasp,Li2Pb,-1.2941876333333333,-0.014440958333333365 -Cr1Ga2O4_164_4176.vasp,CrGa2O4,-4.487193352857143,0.003841683303567406 -Hf3N2Cl2_187_7719.vasp,Hf3N2Cl2,-6.078165198571428,0.1719544610714241 -Ga4P4S16_14_6560.vasp,Ga4P4S16,-3.07188552625,0.07194393624999984 -Ca3Ge1_25_3179.vasp,Ca3Ge,-0.400734945,0.88078751 -Sc2I2N2_59_16091.vasp,Sc2I2N2,-3.9258631299999998,0.15616778194444114 -Si4S4_57_16508.vasp,Si4S4,-3.5834248025,0.07502937499999984 -Mg1Al2S4_156_10333.vasp,MgAl2S4,-3.2602877799999996,0.30139218785714306 -Nb1Cl2_164_12488.vasp,NbCl2,-3.22841287,0.22901235071428055 -Si1Br2_164_16321.vasp,SiBr2,-1.6239418600000002,0.18034128833333074 -Sb8Cl2O11_2_15863.vasp,Sb8Cl2O11,-3.850327754761905,0.10510241464285697 -Rh1F2_164_15151.vasp,RhF2,-1.69933315,0.6104995044444423 -Zr1Ni1Br6_5_21371.vasp,ZrNiBr6,-1.3644200225,0.009775621875000029 -Zn2Cl2O2_59_21056.vasp,Zn2Cl2O2,-1.2304947316666668,0.36318477927083015 -Mg6Ti6_51_10598.vasp,Mg6Ti6,-2.806310065,0.5923413608333337 -Ni2Ir1S5_38_13530.vasp,Ni2IrS5,-2.08878548,0.12519496289062276 -Ba4Sb4H4Se8_14_2179.vasp,Ba4Sb4H4Se8,-2.5751019765,0.5329012180416618 -Ca1Bi2O5_38_2807.vasp,CaBi2O5,-3.5760854,0.4161922141015626 -Ge2As2H2O6_7_6732.vasp,Ge2As2H2O6,-4.166441638333334,0.33217522062499527 -V2Te2N1_164_20209.vasp,V2Te2N,-3.8469056960000003,0.05307013266666649 -Bi2B2_129_2426.vasp,Bi2B2,-2.5342930475,0.7796335991666667 -Fe1B4C2I2F4_47_5625.vasp,FeB4C2I2F4,-3.7076751315384615,0.33207340583332234 -Ce1Pb5_47_3651.vasp,CePb5,-0.98419604,0.6570958283333319 -Y2In2Br2_164_20751.vasp,Y2In2Br2,-2.6035265483333334,0.1999297741666639 -Te2Pd2O6_11_18470.vasp,Te2Pd2O6,-3.1228576539999997,0.12506609875000052 -Ni3Pd1Se5S3_1_13712.vasp,Ni3PdSe5S3,-1.5185433216666666,0.22003895052083333 -Tb1Ge2_123_18172.vasp,TbGe2,-2.760971023333333,0.6606241244444413 -Mn2Bi1_164_10999.vasp,Mn2Bi,0.4587215,1.986053233505746 -Al2Co1Te4_164_801.vasp,Al2CoTe4,-1.9684879657142855,0.21449322661564185 -B3H2W4O2_164_1728.vasp,B3H2W4O2,-5.477033826363637,0.6169468422727166 -Nb1Au1S2Cl2_1_12467.vasp,NbAuS2Cl2,-2.4946659233333333,0.23113292765150822 -Ru1Pt1S2I2_25_15280.vasp,RuPtS2I2,-1.8711955133333333,0.19385404333333334 -Ti2I6_162_18960.vasp,Ti2I6,-1.89593898375,0.15805217500000013 -Li4Cr4O14_2_10177.vasp,Li4Cr4O14,-4.704672658636364,-0.15574994611742865 -Ti2Tl2Cu2Te6_11_19050.vasp,Ti2Tl2Cu2Te6,-1.9407899516666667,0.1428123524999998 -Pt2S8_11_14671.vasp,Pt2S8,-2.444837051,0.18940370075000024 -Hg1H4C2I2N4_6_7871.vasp,HgH4C2I2N4,-3.9815087392307693,0.06047308698717546 -Sn1I2_187_16651.vasp,SnI2,-0.5540381600000001,0.16153193111111108 -W12O24_1_20407.vasp,W12O24,-5.706718638333333,0.5609811303061161 -Pd2C8_191_14409.vasp,Pd2C8,-6.397768386,0.42488131000000023 -Ca2Cu1S2Br2_123_2997.vasp,Ca2CuS2Br2,-1.9096115328571428,0.14846440904761532 -K4P4S8_14_9495.vasp,K4P4S8,-2.66301633125,0.16255460829860813 -Sn2P4O14_2_16828.vasp,Sn2P4O14,-5.135905267,0.20686007149999952 -V1F5_47_19828.vasp,VF5,-2.59985868,0.5137007647916665 -In2Ag1Ge1Te1Br1_1_8372.vasp,In2AgGeTeBr,-0.9680506383333333,0.11002969229166387 -V2Mo2O10_85_20104.vasp,V2Mo2O10,-5.227945570714286,0.1355845235714237 -Hf1Au1Se1S1Cl2_1_7113.vasp,HfAuSeSCl2,-2.4656759,0.4389713697916644 -Cs1O2_115_4645.vasp,CsO2,-1.07119798,1.6148500933333336 -Na2Cl2O4_113_12051.vasp,Na2Cl2O4,-2.35043594125,0.019467781874998424 -Sr5Tm1_1_17491.vasp,Sr5Tm,0.577135965,1.1921693741666652 -Rb2Hg4Se2I6O6_31_14878.vasp,Rb2Hg4Se2I6O6,-1.119937385,0.04319709866666334 -V2Fe1Te4_164_20064.vasp,V2FeTe4,-2.0290471285714284,0.09419708369047441 -Mn3S1Cl2O1_8_11399.vasp,Mn3SCl2O,-2.596937151428571,0.04412000182265585 -Zr1Ta1Nb2Br2N3Cl2O1_1_21448.vasp,ZrTaNb2Br2N3Cl2O,-5.4408230641666675,0.09401168189813536 -Al4S6_1_1087.vasp,Al4S6,-3.585128777,0.15416498275000023 -B2F6_1_1668.vasp,B2F6,-4.1396780125,-0.42158331250000014 -Ta1Mn1S2Br2_1_17566.vasp,TaMnS2Br2,-3.32167344,0.030026549583333395 -W2Se2_25_20551.vasp,W2Se2,-3.37282999,0.9251420800000001 -Ta4O8_2_18081.vasp,Ta4O8,-7.133919168333333,0.22115152033332708 -Ta1Mn1Br1Cl1O1_8_17561.vasp,TaMnBrClO,-3.6302116779999998,0.3585782984090842 -K1Pb1O2_156_8925.vasp,KPbO2,-2.498848305,0.4612624153125 -Bi6C2_164_2664.vasp,Bi6C2,-1.88502661375,0.494205735 -Nb2Si2Bi2_129_12890.vasp,Nb2Si2Bi2,-4.0148995266666665,0.06206061539682217 -Pt2I2O2_59_14628.vasp,Pt2I2O2,-1.6005431116666669,0.36242527791666457 -Na2B2C8O16_51_11970.vasp,Na2B2C8O16,-6.043377306785715,0.13706478789681453 -Hf2S2_164_7575.vasp,Hf2S2,-5.002249565,0.4029071050000006 -In1P2Au1S6_149_8298.vasp,InP2AuS6,-2.618790492,0.09174593106249729 -Co2S4F2_2_3985.vasp,Co2S4F2,-2.49039800125,0.2155779833333305 -Hf3C2_187_7698.vasp,Hf3C2,-7.060741108,0.5330444196000012 -Zr2As1Se2_164_21502.vasp,Zr2AsSe2,-4.315943492000001,0.05896202300000031 -Na1Al1Sb2S6_5_11816.vasp,NaAlSb2S6,-2.6594438289999998,0.3215726529374978 -Nb1Se2_115_12578.vasp,NbSe2,-3.63909704,0.6167719675000005 -Pb1S1_156_14198.vasp,PbS,-1.98478563,-1.3116521849999998 -Sc2S6_59_16142.vasp,Sc2S6,-3.622729405,0.22549955757812512 -Li2Fe4O4F6_8_9919.vasp,Li2Fe4O4F6,-3.0785851375,0.18194816249999068 -Sb12O8F20_13_15417.vasp,Sb12O8F20,-3.2559367207500003,0.0905290967499992 -Ag4Te4Cl4_14_574.vasp,Ag4Te4Cl4,-0.38267911,0.1652271145833329 -Ni1F2_115_13314.vasp,NiF2,-1.4110108933333334,-0.1394651050000002 -Nb4C3S2F2_164_13046.vasp,Nb4C3S2F2,-5.73379161,0.4811845017777725 -Sn1Ge2As2Se2S1I1Cl5_1_16638.vasp,SnGe2As2Se2SICl5,-1.9697217564285714,0.10157267735118611 -Hf1Sb1P1_156_7286.vasp,HfSbP,-4.143625356666667,0.7715938216666621 -Na3Ti10S20_8_12359.vasp,Na3Ti10S20,-4.827034487878787,-0.04404787575757929 -Rb2Fe4Te6_51_14841.vasp,Rb2Fe4Te6,-0.8118867575,0.7413155391666648 -Ag4S4I4_14_553.vasp,Ag4S4I4,-0.42065077,0.22032862645833273 -Hf3Zr1Se2I6_1_7756.vasp,Hf3ZrSe2I6,-2.7873738875,0.14808388916666426 -Mn3C2S2F2_187_11365.vasp,Mn3C2S2F2,-3.436843701111111,0.6176928644444407 -V1P2Au1Se6_5_19898.vasp,VP2AuSe6,-2.338316529,0.1413821084374981 -Hf3Zr1Cl6O2_1_7749.vasp,Hf3ZrCl6O2,-4.218481983333334,0.36078398333332995 -Tc2Se2_129_18237.vasp,Tc2Se2,-5.07573761,0.416172719375 -Hf4B3S2F2_164_7767.vasp,Hf4B3S2F2,-5.07629758909091,0.638773125227261 -Zr2Se2F2_59_21674.vasp,Zr2Se2F2,-4.211140398333334,0.17386710541666162 -Li1Ga1Te6As2_5_9718.vasp,LiGaTe6As2,-1.724044838,0.2594557346666652 -Li6Re6O24_2_10270.vasp,Li6Re6O24,-5.400308953333333,0.17063838305555556 -Fe2Br2O1_164_5817.vasp,Fe2Br2O,-2.010795038,-0.07943900958333572 -Mg1O2_123_10391.vasp,MgO2,-3.6699071166666664,0.05381958541666387 -Nb3N2Cl2_1_12986.vasp,Nb3N2Cl2,-5.437011194285715,0.357131796496592 -Te1W1O1_156_18335.vasp,TeWO,-4.163396643333333,0.4929022168197215 -Cu2Sn2Au2_123_5318.vasp,Cu2Sn2Au2,0.24472759666666666,0.8932811466666661 -K4Li4C4O12_14_9471.vasp,K4Li4C4O12,-4.8482485325,0.13100598416666642 -Nb2Ni2Te6_11_12784.vasp,Nb2Ni2Te6,-2.1548067499999997,0.11468471133333169 -Te2Au2_129_18370.vasp,Te2Au2,-0.0289237325,0.399712915 -Tm2Se2F2_164_19686.vasp,Tm2Se2F2,-3.997558125,0.23980874972221855 -Tl2Sb2S6_1_19519.vasp,Tl2Sb2S6,-1.99468898,0.3330658633749972 -Ni2Br2O2_59_13479.vasp,Ni2Br2O2,-1.4274960633333331,-0.21241853000000077 -Ta2Ir2Se8_11_17770.vasp,Ta2Ir2Se8,-3.772684965,-0.07739599750000448 -Sc2Br6_162_16046.vasp,Sc2Br6,-2.27930299875,0.04891028499999983 -Mn1V1I2N2_6_10923.vasp,MnVI2N2,-3.3411547916666664,0.011432216249994909 -Ta2C1S2_164_17679.vasp,Ta2CS2,-6.6646622859999995,0.02628671799999971 -Ga3Co1_187_6526.vasp,Ga3Co,-1.1486142,1.0097326343750002 -Co2Sb2O7_6_3996.vasp,Co2Sb2O7,-3.706510048181818,0.3665925031818156 -Hf1I2N1_156_7197.vasp,HfI2N,-3.792412145,0.3593240742187497 -Ca2S4F12_53_3107.vasp,Ca2S4F12,-2.266241051111111,0.4339088529861086 -Cd1H4C2I2N4_6_3345.vasp,CdH4C2I2N4,-4.047077865384615,0.19933972965811228 -As8Se8O4_1_1406.vasp,As8Se8O4,-3.056171842,0.17625735866666403 -Li2H6Pt1S6_147_9953.vasp,Li2H6PtS6,-3.0638650373333336,0.07377985799999998 -Ni2I2O2_59_13522.vasp,Ni2I2O2,-1.2862964683333333,-0.19615422770833435 -Ag4Se4I4_14_564.vasp,Ag4Se4I4,-0.2359643425,0.3017163052777773 -Pb2I8_1_14256.vasp,Pb2I8,-0.1313841,0.14841097241666673 -Ti3H2Se2N2_6_19090.vasp,Ti3H2Se2N2,-5.4683827888888885,0.5954492483333276 -In2Se1S1Br1_1_8574.vasp,In2SeSBr,-1.723593718,0.15775532650000035 -Cu2O2F2_59_5196.vasp,Cu2O2F2,-1.62206972,0.4102530920833314 -Zn1Ge1Br2O2_6_20941.vasp,ZnGeBr2O2,-2.330201613333333,0.20848423729166665 -Ta1Ti1C1Cl2_8_17633.vasp,TaTiCCl2,-5.60203631,0.07244961124998817 -Mn2Mo2S8Cl2_129_11145.vasp,Mn2Mo2S8Cl2,-2.4168201135714287,0.6762101029464228 -Sn6P6_12_16998.vasp,Sn6P6,-2.5725879258333335,0.2088200972916665 -Bi2Pd1_123_2502.vasp,Bi2Pd,-1.2177219833333333,-0.4641442733333332 -Hf1I2_164_7200.vasp,HfI2,-2.18787251,0.5293157366666636 -Cu8P32Se12Br8_57_5502.vasp,Cu8P32Se12Br8,-2.6271751893333337,0.05524853249999939 -Zr4C3_164_21816.vasp,Zr4C3,-6.35797437,0.3760147971428571 -K1V4O10_38_8955.vasp,KV4O10,-5.292804546,0.09744276399999485 -Ni2Te1Ir1O8_1_13653.vasp,Ni2TeIrO8,-3.146642665,0.12845429520833074 -Hf1Zr1Pd2S8_1_7389.vasp,HfZrPd2S8,-3.5240729666666666,0.2138351672916643 -Ti1Br1Cl1_156_18747.vasp,TiBrCl,-3.359392026666667,0.08368913708333348 -Tl2O3_164_19472.vasp,Tl2O3,-2.503574912,0.20659026650000012 -V2Te6_11_20223.vasp,V2Te6,-1.98894447375,0.17943275874999998 -Cd1In1S2Br2_1_3373.vasp,CdInS2Br2,-0.985842055,0.2744182652604146 -Zr3B2Te2F2_187_21745.vasp,Zr3B2Te2F2,-3.760872544444444,0.7696836277777671 -Al2Se2Br2_31_959.vasp,Al2Se2Br2,-2.3978671533333333,0.0379058716666667 -V1Ge2I1Br1O2_6_19845.vasp,VGe2IBrO2,-3.1371861057142856,0.151579431809518 -Cr2O6_59_4444.vasp,Cr2O6,-4.50414405,-0.051356210156249915 -Tb2Ge1_164_18196.vasp,Tb2Ge,-2.42559629,0.7689044152083335 -Cd4Cl8_55_3625.vasp,Cd4Cl8,-0.03915812,0.3652362333333333 -Cs2Cd4S2I6O6_31_4688.vasp,Cs2Cd4S2I6O6,-1.5959745455,0.06802353693750071 -Ca3Fe2Br2O5_123_3173.vasp,Ca3Fe2Br2O5,-3.5347741441666667,-0.002667816666670264 -Ba2As1_164_1900.vasp,Ba2As,-1.5861181033333331,0.32092339999999847 -Mg1I2O6_1_10376.vasp,MgI2O6,-2.9292027177777777,0.20637691527777768 -Sn4Se1S5I3Cl1_1_16969.vasp,Sn4SeS5I3Cl,-1.6757297392857142,0.1951801964434484 -Fe3Te1Rh1Se1I1Br1_6_6071.vasp,Fe3TeRhSeIBr,-1.04462605375,0.4284039609374998 -Ge2I6_1_6783.vasp,Ge2I6,-0.65651395375,0.17362421359374886 -Al2Cr1Rh1Br2Cl2O4_3_813.vasp,Al2CrRhBr2Cl2O4,-3.645616841666667,0.12690800884258335 -Cr2O2_123_4435.vasp,Cr2O2,-3.6528735775,1.4724254224999953 -Fe2N1F2_164_5881.vasp,Fe2NF2,-3.04416812,0.37643702800000023 -Sb4Pt4S4_13_15810.vasp,Sb4Pt4S4,-2.4258573333333335,0.2455502549999995 -Na2H8C2O8_2_12133.vasp,Na2H8C2O8,-4.5063878895,0.242963851562483 -Sn2P2_164_16824.vasp,Sn2P2,-2.56941501,0.21199301312499985 -Y2I6_189_20749.vasp,Y2I6,-2.01000553875,0.16652107999999988 -Na2Cd4S2Br6O6_31_12025.vasp,Na2Cd4S2Br6O6,-1.9180974894999998,0.15239679068750045 -Ta2Ni2Te6_11_17799.vasp,Ta2Ni2Te6,-2.393672434,0.09321933999999743 -Sr4Cu4Te2O14_26_17430.vasp,Sr4Cu4Te2O14,-3.2438136416666663,0.4017816992187403 -Li2Ta1_187_10076.vasp,Li2Ta,-3.0558252866666664,0.9085261277777748 -Au2Br2_51_1454.vasp,Au2Br2,0.56064565,0.26165573375 -Mn2Bi2Cl2O4_10_11002.vasp,Mn2Bi2Cl2O4,-3.136312115,0.21873015309195087 -Sb8I4O10_14_15865.vasp,Sb8I4O10,-3.2992001104545454,0.10364069988636343 -Er1Bi2_21_5543.vasp,ErBi2,-1.6824262366666665,-0.2968632683333343 -Sb2Se2_164_15698.vasp,Sb2Se2,-1.9983936875,0.34938401624999793 -Fe2Sb2Te4F2_26_5964.vasp,Fe2Sb2Te4F2,-1.633858215,0.4321127303333291 -Cr1O1F2_47_4219.vasp,CrOF2,-3.6790728075,-0.16399008171875307 -Mo2S2I2_59_11665.vasp,Mo2S2I2,-2.2122939083333333,0.3381677311111113 -Fe4Se8_54_6089.vasp,Fe4Se8,-1.883099345,0.4187594133333332 -Ba2Tl1Cd1Cu1O5_99_2080.vasp,Ba2TlCdCuO5,-2.629789142,0.4364705152083276 -V2Cl10_51_20029.vasp,V2Cl10,-1.4212886908333333,0.22477041999999825 -Ca1Ag1Br4_6_2790.vasp,CaAgBr4,-0.77474929,0.15723131833333334 -Bi1Cl1O1_156_2324.vasp,BiClO,-2.4173489333333333,0.5509464900000003 -Ni2I4_2_13526.vasp,Ni2I4,0.4794629316666667,0.050152034999999984 -P4C2_113_14075.vasp,P4C2,-5.124580291666667,0.2781921683333288 -K4Ge2Se6_2_9447.vasp,K4Ge2Se6,-1.8592997,0.09515895249999984 -Ba1B2Se6_8_1807.vasp,BaB2Se6,-2.6036047244444442,0.5912542500000004 -La1Bi2O4_164_9562.vasp,LaBi2O4,-4.430816881428571,0.1805961226785695 -In2Co2O5_187_8411.vasp,In2Co2O5,-3.4189575533333336,0.14352698680555198 -Sb6Pd3_157_15856.vasp,Sb6Pd3,-1.8228301744444444,0.43144661722222244 -Ag2Au2I8_1_175.vasp,Ag2Au2I8,0.507274135,0.0895721850000003 -V2As2Se6_157_19982.vasp,V2As2Se6,-2.699415552,0.27130065466666387 -Ta2Sn2Bi2_129_17888.vasp,Ta2Sn2Bi2,-2.91584743,0.34975321633332523 -Ga2S3_164_6450.vasp,Ga2S3,-2.826172238,0.09494525200000004 -In4Ga2Bi2S12_11_8674.vasp,In4Ga2Bi2S12,-2.486257889,0.05102538591666472 -Co2N2Cl2_59_3936.vasp,Co2N2Cl2,-3.0205763766666665,-0.3400138866666691 -Ta4Pd4S8_53_18088.vasp,Ta4Pd4S8,-3.9752207625,0.30917220412499846 -K4Nb2O4F10_12_9481.vasp,K4Nb2O4F10,-3.6985618270000002,-0.01989365109375041 -Mn2In2Te5_187_11128.vasp,Mn2In2Te5,-1.582848968888889,0.03491754459769936 -Ag2I2Br4_1_311.vasp,Ag2I2Br4,0.2866146125,0.18825730499999996 -Al4Cl4_28_1067.vasp,Al4Cl4,-1.65474076125,0.6762593629166647 -V4S10_59_20355.vasp,V4S10,-3.5157198864285713,0.10145889624999671 -Pb2Se2_164_14293.vasp,Pb2Se2,-1.7051477225,0.2448164209374999 -Ru2I1Br1O3_8_15319.vasp,Ru2IBrO3,-2.9557087857142856,0.4988548020153032 -Li2C2S2N2_31_9850.vasp,Li2C2S2N2,-5.1116815875,-0.14336842716146392 -Bi6Pd3_157_2674.vasp,Bi6Pd3,-1.1624023033333333,-0.4088245933333332 -Cs2Cd4Br6O8_31_4682.vasp,Cs2Cd4Br6O8,-1.2413502635,0.34243113454166696 -Cs1Ge1Te2_156_4642.vasp,CsGeTe2,-1.2331198375,0.20415731937499876 -Cu4S4F4_14_5454.vasp,Cu4S4F4,-1.4265748866666668,0.11240649711805334 -Pd2I2_164_14432.vasp,Pd2I2,-0.30889997,0.3214934656249999 -Al6Te6_2_1109.vasp,Al6Te6,-2.21539654,0.09035564750000002 -Ag2S2I2N2_31_379.vasp,Ag2S2I2N2,-1.53635863375,0.32781356921875027 -Zr3Pd1Br6N2_1_21778.vasp,Zr3PdBr6N2,-3.48082543,0.31198996874999796 -Cd1H4C4N2F2_10_3352.vasp,CdH4C4N2F2,-4.794852264615384,0.21059883134614032 -Cr4Pb8F28_1_4620.vasp,Cr4Pb8F28,-2.67599871225,0.23151564874999986 -Ir2S2F2_59_8816.vasp,Ir2S2F2,-2.9248602249999998,0.2518013568518498 -Ag2C2S2I2_31_223.vasp,Ag2C2S2I2,-1.8087455225,0.7010703773437501 -As2H2Pb2O6_7_1213.vasp,As2H2Pb2O6,-3.8551804808333334,0.2806783627777787 -Ti1Ni1Te1Br1_8_18815.vasp,TiNiTeBr,-2.2309981625,0.2560895191666649 -Nb2Se4F4_12_12884.vasp,Nb2Se4F4,-3.7012506860000003,0.12549042253332932 -Bi2_164_2587.vasp,Bi2,-1.02538662,-0.5585186249999999 -Li1Te6P2Pd1_5_9797.vasp,LiTe6P2Pd,-1.901184387,-0.08237660483333487 -Nb1Cl2_115_12487.vasp,NbCl2,-2.8875836133333332,0.5698416073809474 -Al1Se1_123_735.vasp,AlSe,-2.241626855,0.7067321900000003 -Tl2Ga2H8_3_19422.vasp,Tl2Ga2H8,-2.23156985,1.1327001499999967 -Hg3C2S6_5_8055.vasp,Hg3C2S6,-1.8852067518181819,0.4169373734659007 -Pd2Cl2O2_59_14410.vasp,Pd2Cl2O2,-1.7497561733333333,0.13925953972222227 -Hf1Mn1Nb1Cr1Te2Se2_6_7221.vasp,HfMnNbCrTe2Se2,-3.268200575,0.6828946932614947 -Ca2Ti4O10_59_3135.vasp,Ca2Ti4O10,-6.326571701875,0.37011845718749936 -Nb2Te1I1O1_1_12900.vasp,Nb2TeIO,-4.040125586,0.05629809712498768 -Ni1Pb2C6N6_12_13394.vasp,NiPb2C6N6,-5.460365155333333,0.4544828859999921 -K2B2S2N2_31_8996.vasp,K2B2S2N2,-3.81471142125,0.9995276033333331 -Zr3B2H2_187_21738.vasp,Zr3B2H2,-4.791692901428571,0.09043363214284894 -B1W2O2_164_1642.vasp,BW2O2,-5.932165064,0.891284598462585 -Ta2Co4Te2S2_51_17711.vasp,Ta2Co4Te2S2,-3.477168987,0.042676313749999695 -Sc3H2C2_187_16205.vasp,Sc3H2C2,-4.682165154285714,0.19062417122119346 -Pd2Cl4_2_14417.vasp,Pd2Cl4,-0.6017930383333333,0.2736730261111111 -Ti2N2Cl2_59_18968.vasp,Ti2N2Cl2,-5.922951721666667,-0.34870829562500383 -Ge2P1Se6_162_6798.vasp,Ge2PSe6,-2.4996765444444446,0.15160117525462716 -Sn2S2Cl2_59_16837.vasp,Sn2S2Cl2,-1.9141266650000002,0.18177084749999972 -Ba2Cl4_129_1950.vasp,Ba2Cl4,-2.457058228333333,0.26713715500000035 -Zn2Cu2Ge4O12_13_21069.vasp,Zn2Cu2Ge4O12,-3.5610254025000003,0.31627261783332994 -In2I2_164_8477.vasp,In2I2,-0.573506385,0.424424385 -Ge2Se2Cl2_59_6866.vasp,Ge2Se2Cl2,-2.1269174166666667,0.1805962782638869 -Ge3Bi2O9_174_6905.vasp,Ge3Bi2O9,-4.290964502142857,0.2641134233035676 -Nb2P1H1S1_8_12803.vasp,Nb2PHS,-4.750374914,0.549143920000001 -Cd2Bi2O4F2_11_3468.vasp,Cd2Bi2O4F2,-2.471933541,0.10693267633333403 -Ca2N2O6F2_59_3071.vasp,Ca2N2O6F2,-4.424776580833334,0.12961077145833277 -Ti1Fe2I2O2_1_18779.vasp,TiFe2I2O2,-2.9600544728571427,0.46516228535713733 -Hg3P1_191_8063.vasp,Hg3P,1.5095843825,0.6799867340948276 -Hf1Se1Br1N1_8_7302.vasp,HfSeBrN,-4.551601235,0.5265288708333339 -Ge3Ir1_187_6909.vasp,Ge3Ir,-2.575557415,0.8225707758333307 -Bi2Te6As2_143_2578.vasp,Bi2Te6As2,-1.5898894110000001,0.2505252614999999 -Na2Fe2Sb2_129_12080.vasp,Na2Fe2Sb2,-0.8409425483333334,0.955238585416665 -Al2Ni1O4_164_896.vasp,Al2NiO4,-4.683035891428572,0.2125886628571395 -Fe2O2_187_5891.vasp,Fe2O2,-2.9238563025,0.6218690360416645 -Hf1F2_187_7154.vasp,HfF2,-4.6160078533333335,0.4979825241666611 -Mo2Se2Br2_59_11683.vasp,Mo2Se2Br2,-2.1462034016666665,0.3079941820833336 -Mn1In1S2I1Br1_6_10776.vasp,MnInS2IBr,-1.7686576150000002,0.14499373090277276 -Ba2Ni3_164_2038.vasp,Ba2Ni3,0.670675548,0.07706888 -Al6S6_2_1106.vasp,Al6S6,-3.4095662625000003,0.11050868145833048 -Ir2F2_129_8782.vasp,Ir2F2,-1.0321106375,2.2699741833333307 -Sb2P4H2O12_4_15631.vasp,Sb2P4H2O12,-4.5755333684999995,0.5948052684833289 -V2Sb2P4O16_11_20171.vasp,V2Sb2P4O16,-5.3282152370833336,0.20626145874999935 -Tc4S4O24F4_14_18254.vasp,Tc4S4O24F4,-4.698039049444445,0.028208580277777173 -Hf3Br1N2Cl1_8_7690.vasp,Hf3BrN2Cl,-5.845285127142858,0.29854640330356297 -Sr1O2_123_17070.vasp,SrO2,-3.844934156666667,0.22575080999999964 -Si2Se2_8_16452.vasp,Si2Se2,-2.9676683075,0.12393779265625027 -K2Hg4Se2I6O6_31_9188.vasp,K2Hg4Se2I6O6,-1.115436952,0.04520625516666334 -Sm2Ga4Co2_47_16571.vasp,Sm2Ga4Co2,-1.97620084,0.3710969162500002 -Co2Sb2Se4Br2_10_4003.vasp,Co2Sb2Se4Br2,-1.7712054259999999,0.3418410171999977 -In1Au1S1I2Br1_1_8197.vasp,InAuSI2Br,-0.297710705,0.43274351583333265 -Sb2N2_6_15610.vasp,Sb2N2,-4.20008074,-0.2914218924999996 -C2I8_1_2750.vasp,C2I8,-0.599162964,0.7190853435 -Mo3S4Br2_1_11724.vasp,Mo3S4Br2,-2.7736954944444445,0.35804423249999706 -Lu2Br6_162_10303.vasp,Lu2Br6,-2.26637274125,0.07661137124999984 -Cd2S2Br2_1_3542.vasp,Cd2S2Br2,-0.568737265,0.1246567073958314 -Bi1Te2_187_2409.vasp,BiTe2,-1.1366106533333333,0.4314819177777762 -Au2Se1_191_1540.vasp,Au2Se,0.35324126666666666,1.3030990166666658 -Re1S2_187_15020.vasp,ReS2,-4.569980506666666,0.37009031750000076 -In1Ge1Se3_143_8266.vasp,InGeSe3,-1.864775358,0.51478107 -Nb4B3S2_164_13039.vasp,Nb4B3S2,-6.180441246666667,-0.03945832000000493 -In2Ni1Se4_164_8491.vasp,In2NiSe4,-1.6336290414285715,0.011219864285712644 -Bi2Cl2O2_129_2442.vasp,Bi2Cl2O2,-2.8981195250000003,0.07017589833333338 -Rb2Os2S2N2Cl10_11_14913.vasp,Rb2Os2S2N2Cl10,-2.2959918255555554,-0.02611206687500711 -Li4Ga4Br16_14_10190.vasp,Li4Ga4Br16,-1.5209682974999998,0.07512252416666687 -Nb2S1Br2_12_12832.vasp,Nb2SBr2,-3.699455222,0.1870197136857048 -V2Se2Br2_59_20180.vasp,V2Se2Br2,-2.4165920066666664,0.18460615583332785 -Sb2Te2O10F2_1_15718.vasp,Sb2Te2O10F2,-3.28039128625,0.4364731932161394 -Li2Zr1H6S6_1_10141.vasp,Li2ZrH6S6,-3.4551492526666667,0.11324081216666682 -Zn2Br2_12_21054.vasp,Zn2Br2,0.470684045,0.01605175781250001 -Na4Br2_51_12372.vasp,Na4Br2,-0.9347786583333333,-0.13532164833333393 -Ga2Fe1_123_6354.vasp,Ga2Fe,-1.0710063633333333,0.47646860020833237 -Zr3Br1N1Cl1O1_8_21750.vasp,Zr3BrNClO,-4.807234214285714,0.3930374502380834 -Sr2Au1O2F2_38_17126.vasp,Sr2AuO2F2,-2.849040727142857,0.6008955635714233 -V2Sb2O10_129_20169.vasp,V2Sb2O10,-4.698691706428571,0.2685478614285719 -Co1Ni1S2_8_3790.vasp,CoNiS2,-1.85744324,0.18276356428571275 -Hg2Te6P2_147_8041.vasp,Hg2Te6P2,-0.9280220299999999,0.31950466099999864 -Ag2Cl2O2_59_240.vasp,Ag2Cl2O2,-0.8506940833333334,0.354573133749999 -Ca4Bi2_59_3207.vasp,Ca4Bi2,-0.38314511833333337,0.5730318216666668 -Al2H10N4F4_10_856.vasp,Al2H10N4F4,-4.481739246,0.08753052724999355 -Ba2Co3O8_123_1958.vasp,Ba2Co3O8,-3.744485276153846,0.3619042812499935 -Tl1Ag1P2S6_149_19202.vasp,TlAgP2S6,-2.472209276,0.12301670066666615 -Cu2Hg2Se2F2_26_5160.vasp,Cu2Hg2Se2F2,-0.31145556,0.12588384625 -N2Cl6_12_11779.vasp,N2Cl6,-0.8407177225,0.6951763200000001 -Al1S1_156_722.vasp,AlS,-2.69433937,0.825735573958331 -Nb2Pd4S6_11_12817.vasp,Nb2Pd4S6,-3.1409531975,0.20574619977010933 -H4Au2C4O8_14_7054.vasp,H4Au2C4O8,-4.452381838888889,0.6973469412036977 -Mg4In8Se16_2_10578.vasp,Mg4In8Se16,-2.0837891278571425,0.03814210357142889 -Sc2Se2Cl2_59_16155.vasp,Sc2Se2Cl2,-3.414617858333333,0.06330160888888559 -Y1Cl2O1_1_20619.vasp,YCl2O,-4.0189637625,0.34991857937500015 -In4Sb20_26_8688.vasp,In4Sb20,-1.7639702441666667,0.012368065833331832 -Sb6Rh2S4_11_15859.vasp,Sb6Rh2S4,-2.5054447925,0.32146208833333056 -Mn1W1S2Cl2_1_10933.vasp,MnWS2Cl2,-3.0109341233333335,0.12326648333333301 -Ta2S4I4_12_17862.vasp,Ta2S4I4,-2.983035309,0.09136804175000046 -Au4Se4Cl4O12_2_1598.vasp,Au4Se4Cl4O12,-2.2579738370833335,0.09706324708333325 -As1F5_47_1148.vasp,AsF5,-1.7845440049999999,0.6019354883333334 -Pt2Br6_162_14606.vasp,Pt2Br6,-0.46248454,0.19795853000000002 -Pd2Se2_187_14493.vasp,Pd2Se2,-1.1495486875,0.5773070249999999 -Mn2Ga2Se5_187_11079.vasp,Mn2Ga2Se5,-2.4763261533333334,-0.1295736197126462 -Ba2P4H8O8_50_2044.vasp,Ba2P4H8O8,-4.6360558509090914,0.0936722173484803 -Ta2Se2_123_17877.vasp,Ta2Se2,-4.9979481075,0.4059691649999948 -Cu2H4C6Br2_2_5123.vasp,Cu2H4C6Br2,-4.167900952142857,0.44852231357142636 -Cd1Pd1Se2_1_3403.vasp,CdPdSe2,-0.6239392675,0.04775479625000001 -Ti2Te2_123_19046.vasp,Ti2Te2,-4.04593592,0.3844138953124956 -Li2Nd1As2_164_10018.vasp,Li2NdAs2,-3.089724308,0.33919633800000026 -Ca2Mn2Ge2_129_3065.vasp,Ca2Mn2Ge2,-1.7221833716666666,0.4064286709195386 -Nb2V2Te10_11_12939.vasp,Nb2V2Te10,-2.6195239100000003,0.06139752124999742 -Sb1Cl2_164_15446.vasp,SbCl2,-1.1514374833333334,0.45272936916666495 -Li9V6O12F6_6_10289.vasp,Li9V6O12F6,-4.6858259409090905,0.035847914545446 -K2S2N2Cl6O6_1_9329.vasp,K2S2N2Cl6O6,-2.759592153333333,0.15347593805555337 -Na2P2H8S2O16_4_12258.vasp,Na2P2H8S2O16,-4.599554525666666,0.04476479600000083 -Nb3S2I1Br1_1_13003.vasp,Nb3S2IBr,-3.8178677914285717,0.27120370351473166 -Cu2S2Br2N2_31_5242.vasp,Cu2S2Br2N2,-1.9346428875,0.206449687529761 -Hf2Sn4_59_7624.vasp,Hf2Sn4,-2.697732998333333,0.4299268650000001 -V1Bi2_164_19781.vasp,VBi2,-1.7352932533333334,0.20565819666666507 -Nb2Pd4Se6_11_12820.vasp,Nb2Pd4Se6,-2.7311014458333336,0.138764564089906 -Te2Ir1_164_18386.vasp,Te2Ir,-2.2017146233333333,0.24178773666666675 -Co2Sb1S2_187_3992.vasp,Co2SbS2,-2.419194452,0.28070209409000013 -Ta4Sn2Te8_55_18118.vasp,Ta4Sn2Te8,-3.346985175,-0.3523994164285722 -Li2Ta2F12_4_10078.vasp,Li2Ta2F12,-4.242455138125,0.05933674187499971 -Nb4Br1Cl3O4_1_13042.vasp,Nb4BrCl3O4,-5.10531487,-0.015118266076400433 -Cu2B4H4Br2N2_2_5033.vasp,Cu2B4H4Br2N2,-3.667495355,0.5296255318571342 -Ta1Br1F1_156_17517.vasp,TaBrF,-3.5473779800000003,0.7930045268809403 -Nb3B2H2_187_12947.vasp,Nb3B2H2,-5.617813921428572,0.316121437142852 -Li1Fe1As2O6_5_9693.vasp,LiFeAs2O6,-3.96467868,0.3577210030999922 -Tl2N2Cl2_59_19456.vasp,Tl2N2Cl2,-1.6072138833333334,1.3347820133333332 -Bi1Se2_115_2394.vasp,BiSe2,-1.47374492,0.6678462638888867 -Co2P2O8_31_3959.vasp,Co2P2O8,-4.72490338,0.03629479968749694 -K2Hg4Te2O6F6_31_9197.vasp,K2Hg4Te2O6F6,-1.58520451,0.31587028472499795 -Ni2P2Pd2_129_13562.vasp,Ni2P2Pd2,-1.6042916816666668,0.14934194241666332 -Ca3H2O6_12_3180.vasp,Ca3H2O6,-4.285444275454545,0.05619751363635972 -Mn1Sn1Te1I1_1_10898.vasp,MnSnTeI,-1.041164125,-0.4931527527801725 -Rb2H2S6N2_1_14847.vasp,Rb2H2S6N2,-2.8202843491666667,0.288182499283851 -Co2Cl6_191_3893.vasp,Co2Cl6,-0.8465753575,0.55618170375 -Te2Rh2I2_11_18502.vasp,Te2Rh2I2,-1.39368928,0.09463932666666652 -In2Ge2Se6_162_8452.vasp,In2Ge2Se6,-2.333884225,0.04567220300000008 -Mn2As2Br2O4_10_10963.vasp,Mn2As2Br2O4,-3.332053373,0.049632263013150546 -Fe2P2O6_12_5910.vasp,Fe2P2O6,-4.734563657000001,0.2932042949999998 -Zn1H1O1F1_156_20950.vasp,ZnHOF,-2.6567161225,0.13147906687499988 -Rb1Se2_25_14751.vasp,RbSe2,-0.8037248533333333,0.9791689295833297 -Sr2Ag1S2Cl2_38_17105.vasp,Sr2AgS2Cl2,-1.978193077142857,0.22232777709820983 -Y1Hf1I1Cl5_1_20638.vasp,YHfICl5,-3.052687525,0.1402186699999941 -Nb1Te2Ir1Se1Br1_1_12599.vasp,NbTe2IrSeBr,-2.731623875,0.3235945865327282 -Al1Br1_99_614.vasp,AlBr,-1.043057495,0.8720082233333317 -Ga5S4Br4Cl2_1_6583.vasp,Ga5S4Br4Cl2,-1.8468235073333332,0.23262196483333158 -Mg3Sn3_156_10569.vasp,Mg3Sn3,-0.653033785,-1.30270050125 -V1S1Cl2_47_19909.vasp,VSCl2,-2.394845185,0.26455575822916444 -K2Nb2Cl12_2_9259.vasp,K2Nb2Cl12,-2.226088571875,0.03053475875 -Os2S2_164_13872.vasp,Os2S2,-3.897996655,0.7977034518749999 -Mo2F2_164_11605.vasp,Mo2F2,-3.1376754875,0.5254268787499967 -Sn1I1Br1O1_6_16648.vasp,SnIBrO,-1.6894573625,0.2835444105208327 -Ca2P4S12_2_3096.vasp,Ca2P4S12,-3.1557761372222224,0.14733852718749366 -Cd1Au1Cl4_1_3269.vasp,CdAuCl4,-0.12575846333333332,0.11665468812500002 -P2Cl6_31_13970.vasp,P2Cl6,-1.72790134625,0.06336354624999863 -Nd2I6_59_13240.vasp,Nd2I6,-1.6998726175,0.006059161249999834 -Ba1Cr4O8_162_1822.vasp,BaCr4O8,-4.764640391538462,0.2914283681410148 -Ti1Pt1Cl2O2_1_18832.vasp,TiPtCl2O2,-3.8287629649999997,0.3621843283333339 -Ta2O2F4_1_17809.vasp,Ta2O2F4,-5.37997608125,0.269567980749992 -Rb2Cl2O6_11_14834.vasp,Rb2Cl2O6,-2.4617972569999997,0.09509044049999754 -Tc2P6_31_18235.vasp,Tc2P6,-5.13928757375,0.49446086312500004 -Au2Cl2_164_1468.vasp,Au2Cl2,0.2122569275,0.06349018374999998 -Mn2P2S6_162_11195.vasp,Mn2P2S6,-3.2335608880000004,0.2056430208472153 -In1Cu1Ni1Br1Cl1O3_1_8226.vasp,InCuNiBrClO3,-1.988753155,0.024477142343750036 -Te2Os2I2_59_18426.vasp,Te2Os2I2,-1.9417216616666666,0.1384243866666648 -Te2Os2Cl2_59_18424.vasp,Te2Os2Cl2,-2.2365710733333333,0.22540891718749734 -Tc6I18_164_18261.vasp,Tc6I18,-1.8211877054166665,0.009291684583333515 -Pb2_12_14300.vasp,Pb2,-0.171601225,1.156584895 -H2Ru1O2_164_7025.vasp,H2RuO2,-4.157435016,0.33520040716666716 -Fe2F8_1_5849.vasp,Fe2F8,-1.8264283540000001,0.06175670700000002 -Ti2P1S2_164_18979.vasp,Ti2PS2,-5.515187516,-0.1321307375000047 -Ga1S1_156_6258.vasp,GaS,-2.111069005,0.7446574899999998 -As4Pd2_11_1349.vasp,As4Pd2,-2.396618736666667,0.48603146999999947 -Sc1Bi1Sb3Se4S1Br4_1_15907.vasp,ScBiSb3Se4SBr4,-2.0285411714285715,0.2116649391071386 -V2Sn2S6_162_20197.vasp,V2Sn2S6,-3.085920281,-0.04169213899999935 -V2Te2S10F4_2_20212.vasp,V2Te2S10F4,-2.4994944855555556,0.27616114483796045 -Ho2S6_51_8146.vasp,Ho2S6,-3.64035927625,0.20047500867187495 -Hf1Zn1Te2O1_8_7374.vasp,HfZnTe2O,-3.044952008,0.4648464565000007 -Ca2Cu1Se2F2_38_3004.vasp,Ca2CuSe2F2,-2.071442524285714,0.5219028795238054 -Ag2As4S12_10_164.vasp,Ag2As4S12,-2.1718009455555554,0.4604794991319392 -Hf2N1O2_164_7539.vasp,Hf2NO2,-7.669663798,0.27536211850000125 -Sc2H2C1S2_164_16078.vasp,Sc2H2CS2,-4.265369284285714,0.4738854681632563 -In1Cu1As2Se6_149_8225.vasp,InCuAs2Se6,-1.8988976999999998,0.24863265383333136 -Ta3Ni4Sb3Te4I1_1_17975.vasp,Ta3Ni4Sb3Te4I,-2.1954283066666664,0.23742214392856495 -In2F2_164_8421.vasp,In2F2,-1.9246835475,0.5066564058333314 -Al1Cl2_115_628.vasp,AlCl2,-1.7153372166666667,0.5846693272222201 -Sn1O2_115_16660.vasp,SnO2,-3.811158386666667,0.5500609083333328 -As4S6_1_1364.vasp,As4S6,-2.859180875,0.6603140535 -Zr2Al4C5_164_21500.vasp,Zr2Al4C5,-5.684095825454545,0.16335594181817562 -Ce1Te2_8_3661.vasp,CeTe2,-2.40544076,0.6111421058333337 -Cu2H4I2N6_2_5126.vasp,Cu2H4I2N6,-3.530465007857143,0.06453782732142566 -Ni1H4C6N2Cl2_25_13349.vasp,NiH4C6N2Cl2,-5.054541954,0.31363990133332775 -Cu4Hg4S4Cl4_51_5423.vasp,Cu4Hg4S4Cl4,-0.288334795,0.1120612695833334 -Ba4Ce2_12_2147.vasp,Ba4Ce2,-0.27713089166666666,0.7444611499999991 -Al6Se6_2_1107.vasp,Al6Se6,-2.8790172016666666,0.06934184333333349 -Co4Pb12_127_4084.vasp,Co4Pb12,-0.783399963125,0.631464399375 -Ca2H8I4O4_53_3040.vasp,Ca2H8I4O4,-3.2702068194444447,0.049411776589741496 -Sb2Se1O2_164_15687.vasp,Sb2SeO2,-3.2642683499999996,0.3609319049999975 -Ga1Ni1Pd1Au1I3Br1O4_1_6213.vasp,GaNiPdAuI3BrO4,-1.4671425100000002,0.30830389050925333 -Li2As2Pd2_12_9826.vasp,Li2As2Pd2,-2.1754686783333335,-0.060164566666668806 -Cr2Br10_2_4329.vasp,Cr2Br10,-0.762813565,-0.09080095583333386 -P2F6_31_13975.vasp,P2F6,-3.19398569,0.13721526250000027 -Rb2Br2F8_35_14782.vasp,Rb2Br2F8,-0.9283867916666666,0.4873105691666668 -K4Nd4S8O32_14_9484.vasp,K4Nd4S8O32,-4.7872335970833335,0.1070369087499996 -Hf3Ge1Te5Br3_8_7703.vasp,Hf3GeTe5Br3,-3.01762155,0.10637239249999864 -Al4H12O12_1_1071.vasp,Al4H12O12,-4.9134773525,-0.386601841309528 -Al4Sn2Cl12O2_2_1099.vasp,Al4Sn2Cl12O2,-2.6637419099999997,0.06946834175000038 -Hg2P2Se6_147_7983.vasp,Hg2P2Se6,-1.516332188,0.08514027449999984 -Hg2S2Br2_59_7994.vasp,Hg2S2Br2,0.05542014666666667,0.33859364447916496 -Fe2Te2Mo2S12_113_5999.vasp,Fe2Te2Mo2S12,-2.5210605200000002,0.1360826972685159 -Zr1Nb1Se1S1Br2_25_21357.vasp,ZrNbSeSBr2,-3.6133017033333332,-0.1530306774305612 -Cr2Cl6_162_4354.vasp,Cr2Cl6,-1.62740671375,0.056733268750000176 -Mn1Ga2Te4_156_10731.vasp,MnGa2Te4,-1.5948709185714287,0.2708702276190458 -Cr1P2_164_4232.vasp,CrP2,-3.7440983333333335,0.466149521666666 -Na2Se2F2_4_12298.vasp,Na2Se2F2,-1.5925316433333334,0.6415840611111089 -K2B2C2F12_7_8980.vasp,K2B2C2F12,-3.671087073888889,0.2247802191666569 -Pd4Br8_14_14515.vasp,Pd4Br8,-0.4826313383333333,0.08886412500000002 -Cu1Se2_187_4977.vasp,CuSe2,-0.9448820966666666,-0.7287920416666666 -Na2Cd4Se2I6O6_31_12038.vasp,Na2Cd4Se2I6O6,-1.4140283185,0.14091516525000014 -Sc1Bi1Cl2O2_6_15905.vasp,ScBiCl2O2,-3.88370722,0.0813640036458283 -Tl4H8C12S4_2_19606.vasp,Tl4H8C12S4,-4.783755666071428,0.180137424241069 -Cd2Ag2S2Cl2_26_3442.vasp,Cd2Ag2S2Cl2,-0.33633403125,0.1745681265625 -Fe2Mo2Se2S12_113_5879.vasp,Fe2Mo2Se2S12,-2.514990115,0.22395341300925703 -Ti6H4O14_6_19179.vasp,Ti6H4O14,-6.395189492499999,0.129254204236112 -Li2Mg1Te2O8F4_2_9978.vasp,Li2MgTe2O8F4,-2.9740602011764707,0.44577084705881687 -Te2Pt2S6_12_18487.vasp,Te2Pt2S6,-2.108379325,0.2858742452499974 -Co1Te2_164_3835.vasp,CoTe2,-1.5853535033333335,0.05874980444444433 -K2B2H8S8_2_8994.vasp,K2B2H8S8,-3.2799679665,0.03793352966666674 -Ga1As2Au1S6_149_6136.vasp,GaAs2AuS6,-2.320096885,0.5031819047187475 -Sn2C2F2_59_16753.vasp,Sn2C2F2,-3.0075723616666665,0.6064384287499994 -In2Br3Cl1_6_8390.vasp,In2Br3Cl,-1.0253511483333333,0.1017339765625001 -Ir2I2_129_8789.vasp,Ir2I2,-0.7975647825,1.5011531049999982 -Na2S4I2_113_12293.vasp,Na2S4I2,-1.27860667875,0.32652196843750014 -Pt1N1_187_14577.vasp,PtN,-2.84459097,1.6081833112500001 -Cs2Cd4Se2Br6O6_31_4692.vasp,Cs2Cd4Se2Br6O6,-1.5200024085000001,0.1983515187499993 -Ni2S6_11_13598.vasp,Ni2S6,-1.91090115375,0.12627798890624764 -N2F2_164_11783.vasp,N2F2,-2.66781073,0.5924461758333306 -Ag1F1_187_51.vasp,AgF,-0.241950005,0.50409715 -Ni2P2O7_10_13561.vasp,Ni2P2O7,-4.32527547,0.054957704999997414 -Na2Cr4S10_31_12065.vasp,Na2Cr4S10,-2.81896796625,0.326361723828125 -Ba3Ni2S5Cl2_123_2123.vasp,Ba3Ni2S5Cl2,-2.3772882008333336,0.11653795794270305 -As4Pt4Se4_13_1356.vasp,As4Pt4Se4,-2.535023290833333,0.3006578704166667 -B2Br6_1_1656.vasp,B2Br6,-1.87828763625,0.030840267499999907 -Nb2Te6_59_12930.vasp,Nb2Te6,-2.78879603625,0.12738567510416376 -Mo1Au2S4_1_11493.vasp,MoAu2S4,-1.8467166157142858,0.3454991149999975 -Tm2Te6_51_19689.vasp,Tm2Te6,-1.9987581225,-0.42391771624999985 -Mn2H2C1_164_11089.vasp,Mn2H2C,-3.5255437919999997,0.401327653212642 -Fe2O2F2_47_5888.vasp,Fe2O2F2,-2.9215181666666665,0.01064247124999751 -Sr2Ag1S2Cl2_123_17104.vasp,Sr2AgS2Cl2,-1.9586898214285713,0.24183103281249563 -Ag1Te2_187_147.vasp,AgTe2,-0.27085792999999997,0.4914922841666667 -W4C3S2_164_20579.vasp,W4C3S2,-6.029794454444445,-0.11997561444445037 -S2O4_59_15386.vasp,S2O4,-2.8706387983333332,1.5022387433333337 -Nb2Se4I2_2_12885.vasp,Nb2Se4I2,-2.81617571625,0.311890638437496 -Rb1C2_99_14726.vasp,RbC2,-2.8221540399999996,2.2349952983333337 -Mn2H2S4_11_11096.vasp,Mn2H2S4,-3.08838841875,0.023243705937499692 -Pt4S4I2Br2_13_14706.vasp,Pt4S4I2Br2,-1.5905517733333332,0.08143337874999912 -Nb2Br1Cl3_1_12643.vasp,Nb2BrCl3,-2.793490635,0.5399056608482116 -P4S6_7_14117.vasp,P4S6,-3.290559726,0.09469046540624726 -Mo4N3F2_164_11749.vasp,Mo4N3F2,-4.614882748888889,0.1664400920370317 -Li2Mn1As2S7Cl3_1_9984.vasp,Li2MnAs2S7Cl3,-2.499267418666667,0.45906956753471434 -Cu2S2I2_59_5247.vasp,Cu2S2I2,-0.5152361383333334,0.27933571515872935 -Sr2Sn2F8_129_17317.vasp,Sr2Sn2F8,-3.1725090058333336,0.07738889708333319 -Zn4F8_25_21219.vasp,Zn4F8,-1.3676028508333333,0.2291093266666666 -Ag2C4Br2N2F4_2_227.vasp,Ag2C4Br2N2F4,-3.6676307500000003,0.1182486319642776 -Ca1Ge2_164_2839.vasp,CaGe2,-1.61612841,0.9893055833333335 -Tl6O9_150_19643.vasp,Tl6O9,-2.463271694,0.24689348450000015 -Ag2H2_129_270.vasp,Ag2H2,-0.82141426,1.229779175 -Sb4S14_4_15813.vasp,Sb4S14,-2.3421261405555556,0.37915217027777537 -Tl1Cd1Ga1S4_156_19233.vasp,TlCdGaS4,-1.7636393242857142,0.21337465633928232 -Sb2Te1Se2_156_15708.vasp,Sb2TeSe2,-2.122275486,0.07684347700000016 -Bi1O2_115_2349.vasp,BiO2,-3.1713316166666665,0.5962192292708304 -Mo2S2Br2_59_11662.vasp,Mo2S2Br2,-2.5249085616666664,0.2896417195833336 -Al1Tl1Cd1O4_156_751.vasp,AlTlCdO4,-3.2506242685714284,0.31762278154761914 -Pr1I2_187_14532.vasp,PrI2,-1.8320888133333335,0.04693676999999985 -Cu1I2_115_4911.vasp,CuI2,0.36162026666666663,0.16412267597222235 -Er1Re2O8_1_5545.vasp,ErRe2O8,-5.913922891818182,-0.23760330458334478 -Co2S6_31_3990.vasp,Co2S6,-2.63834546125,0.38309188619791357 -Pt2I2_39_14630.vasp,Pt2I2,-0.4115097925,0.8179563812499999 -Zn1H1Br1N1_1_20948.vasp,ZnHBrN,-2.13053678,0.30250098764322697 -Ni1Ag1Se2_156_13252.vasp,NiAgSe2,-0.5205750275,0.33096235187500006 -Na2Mn2P2_129_12213.vasp,Na2Mn2P2,-2.512669751666667,-0.1189942750000027 -Cu2I2_164_5172.vasp,Cu2I2,0.2126809375,0.14563767749999956 -Ca1Ga1Ag1S1I2_1_2835.vasp,CaGaAgSI2,-1.1817038016666668,0.2848096704933303 -Sn1Te1_156_16700.vasp,SnTe,-1.333721055,-1.297993075 -Y1Sc1Nb1I1Br1N1_6_20671.vasp,YScNbIBrN,-4.10349202,0.4037935091666578 -Ta12O26_51_17500.vasp,Ta12O26,-7.2144190389473675,0.10031459442104612 -P4Pd4Se4_13_14102.vasp,P4Pd4Se4,-2.58714552,0.30081989249999985 -Ta4Ni2Se14_11_18066.vasp,Ta4Ni2Se14,-3.3575407515,-0.21475481672222552 -Bi4Br12_14_2603.vasp,Bi4Br12,-0.94108847125,0.05024519500000002 -Tl1Te1_156_19351.vasp,TlTe,-0.29615808,0.6565013012500001 -Y1Sn1I1Cl1O2_6_20677.vasp,YSnIClO2,-3.931172378333333,0.2167339990277779 -Bi2O2_129_2482.vasp,Bi2O2,-2.78812151,0.5046850124999986 -Al2Fe1S4_156_827.vasp,Al2FeS4,-3.1118961214285714,0.1252465869642838 -Sc2Si6Ni4_129_16167.vasp,Sc2Si6Ni4,-2.6946786491666668,0.357708011874998 -Al4Cd2Cl16_7_1065.vasp,Al4Cd2Cl16,-1.6937921722727274,0.054322777727272564 -Y1Cl2_115_20620.vasp,YCl2,-3.044560763333333,0.5270504413888857 -Cr2Sb4_2_4489.vasp,Cr2Sb4,-2.2403248766666666,1.015714061666664 -Co9Te18_189_4093.vasp,Co9Te18,-1.4671569492592593,0.17694635851851848 -Nd2H6Se4O14_4_13238.vasp,Nd2H6Se4O14,-4.4240007765384615,-0.042010186538465666 -Li1Si5Pd1_99_9790.vasp,LiSi5Pd,-3.089870812857143,0.046054924999997304 -Al2Sn2Se2_164_994.vasp,Al2Sn2Se2,-2.2025291483333334,-1.1060976133333345 -Sn2As2O6_5_16722.vasp,Sn2As2O6,-3.908834904,0.4170548343333307 -Bi2Cl8_1_2451.vasp,Bi2Cl8,-0.915583074,0.25730673049999975 -Ba2In1Hg1Au1S5_99_2012.vasp,Ba2InHgAuS5,-1.7494416720000001,0.41543229168749807 -As16Br4_10_1124.vasp,As16Br4,-2.6000881805,0.06662015616666483 -Mn2S2Br2_59_11214.vasp,Mn2S2Br2,-2.0842273316666664,0.23752870250000035 -Ga2Fe1S4_156_6348.vasp,Ga2FeS4,-2.5705577485714284,0.0821733385714265 -Te6Se2O16_2_18685.vasp,Te6Se2O16,-3.6550421679166667,0.0015606331249999883 -Cr12O24_1_4095.vasp,Cr12O24,-4.903489312777777,-0.08549345840278111 -Re2Pb2Cl2O8_31_15071.vasp,Re2Pb2Cl2O8,-4.540390461428571,0.06950466607142491 -Mg1In2S4_164_10381.vasp,MgIn2S4,-2.5733194228571428,0.07181616535714275 -Bi1H1_1_2337.vasp,BiH,-1.433819775,1.21249409 -In2Sb2O6_149_8564.vasp,In2Sb2O6,-3.733111258,0.41500296187499996 -Cd1In1Ga1S4_156_3370.vasp,CdInGaS4,-2.0831694585714287,0.08588449249999974 -Te2Rh2Cl2_59_18499.vasp,Te2Rh2Cl2,-1.7242138383333332,0.15295577166666674 -Zr1Zn1I1Br1O1_6_21493.vasp,ZrZnIBrO,-2.326882698,0.37378459127016095 -Tl1Au1Se1S1_1_19222.vasp,TlAuSeS,-0.8100643725,0.26415633230468605 -Mn1V1I2O3_8_10924.vasp,MnVI2O3,-3.4667381014285716,0.06371640083332397 -N2Cl8_1_11781.vasp,N2Cl8,-1.044898436,0.2244718345000003 -Cu2H8I4O16_14_5152.vasp,Cu2H8I4O16,-3.0858789656666668,0.15823059419443994 -As2S1O2_5_1289.vasp,As2SO2,-3.6721183539999998,0.49120500349999663 -Nb3C1N1Cl3_6_12958.vasp,Nb3CNCl3,-5.24607992125,0.09965210974999161 -Ba2In1Cu1Hg1O5_99_2010.vasp,Ba2InCuHgO5,-2.792006483,0.5340842184999959 -Zr2V1I2N2_12_21730.vasp,Zr2VI2N2,-4.588802344285715,0.17582789249999387 -Fe1Cl2O8_147_5656.vasp,FeCl2O8,-2.658421449090909,0.17146365958332765 -Ta2B1O2_164_17656.vasp,Ta2BO2,-7.252244826,0.12976092759997915 -Ge2P1S6_162_6797.vasp,Ge2PS6,-3.0541269166666667,0.14545785565971603 -Ge3W1_191_6924.vasp,Ge3W,-2.66113824,0.7229702712499999 -Mn1Ag2S3I1Br1_1_10623.vasp,MnAg2S3IBr,-1.15139607875,0.325281417734375 -Sr1Bi5O9_1_17029.vasp,SrBi5O9,-3.753595294666667,0.18300512233332977 -Pb2C2F2_59_14230.vasp,Pb2C2F2,-2.4283069216666666,1.8413269416666633 -Sr2F4_51_17217.vasp,Sr2F4,-3.2197260316666667,0.5937906383333336 -Sm4Cl14_11_16592.vasp,Sm4Cl14,-2.485800233888889,0.22081928416666363 -Mn1Ag1Se1S1_8_10618.vasp,MnAgSeS,-1.408836245,0.5320805572916666 -Ce2S2_129_3675.vasp,Ce2S2,-4.2397847675,0.1598969874999998 -Ti2Te2N1_164_19040.vasp,Ti2Te2N,-5.357792526,-0.02911584099999942 -Hf2C2Cl2_59_7465.vasp,Hf2C2Cl2,-5.361286371666666,0.6368310064583291 -Ca2H8S6_26_3048.vasp,Ca2H8S6,-3.18258253125,-0.022264669375000157 -Sn1Br4_123_16621.vasp,SnBr4,-0.548852042,0.2934538554999999 -Co2Te6As2_162_4050.vasp,Co2Te6As2,-1.7934130549999998,0.21506181999999774 -B1Te2Mo1W1_1_1639.vasp,BTe2MoW,-3.5545108480000005,0.3094399069999998 -Sr2Au1Se2F2_38_17134.vasp,Sr2AuSe2F2,-1.9683344385714285,0.5847911664285672 -Ge2Sb2O6F2_7_6849.vasp,Ge2Sb2O6F2,-3.9256230908333336,0.3556544603124996 -W4C3Cl2_164_20575.vasp,W4C3Cl2,-5.452169592222223,-0.033025659938281826 -K6Na4Sn2As6_12_9540.vasp,K6Na4Sn2As6,-1.2718656361111111,0.11652849083333328 -Cs2Cd4Te2S6F6_31_4705.vasp,Cs2Cd4Te2S6F6,-1.347266217,0.32698755602777424 -Ta1Te2_115_17628.vasp,TaTe2,-3.07543704,0.6724463288888889 -In2Br6_189_8393.vasp,In2Br6,-0.8057541825,0.17657417625000005 -Nb1Ir1S2Br2_6_12530.vasp,NbIrS2Br2,-3.172921615,0.010630990822503683 -Ag2As2O4_26_153.vasp,Ag2As2O4,-2.9429665,0.20888087041666226 -Pd4S4I3F1_6_14523.vasp,Pd4S4I3F,-1.3200709758333333,0.16573080450520628 -V1Cr1Te1Se1_25_19810.vasp,VCrTeSe,-2.77129381,0.06145590463140482 -Hf3Zr1I1Br3O4_1_7750.vasp,Hf3ZrIBr3O4,-4.991579671666667,0.28285049106480864 -Ge6N6_2_6962.vasp,Ge6N6,-4.776574331666667,0.13086907083333355 -Cu4S4F8_14_5456.vasp,Cu4S4F8,-1.414214855,0.21305536484374998 -Cd2H8C12S4N8_11_3515.vasp,Cd2H8C12S4N8,-5.35413423382353,0.19408747108454472 -Sb2Te2_164_15723.vasp,Sb2Te2,-1.5688090975,0.35037347624999793 -Sb1S1I1_156_15489.vasp,SbSI,-1.5830255666666666,-0.5793744299999999 -Ag2S1Br2_1_372.vasp,Ag2SBr2,-0.21302863200000002,0.23372742787500006 -Hf1Ti2Se1S2Br2N1Cl1_1_7340.vasp,HfTi2SeS2Br2NCl,-4.436607793,0.19424848627082447 -K2Nb1Cu1S4_21_9254.vasp,K2NbCuS4,-2.731499245,0.12393584562499971 -Sn6As6_2_16980.vasp,Sn6As6,-2.1986590041666667,0.16524384833333322 -Cu2Bi2Te4_26_5044.vasp,Cu2Bi2Te4,-0.79979815125,0.34179348656249997 -As6O12F2_4_1384.vasp,As6O12F2,-3.8264296885,0.38445253700000004 -Zr1Co1H6_5_21281.vasp,ZrCoH6,-3.148582585,0.8922895774999999 -Rb2Ru2N2O2F10_11_14929.vasp,Rb2Ru2N2O2F10,-3.0721916505555553,-0.08466609685186399 -Al2Zn1Te4_156_1037.vasp,Al2ZnTe4,-1.5002093971428572,0.1579085457142857 -Cu2Te4W1_111_5356.vasp,Cu2Te4W,-1.398347717142857,0.23088313928571247 -K2Cd4S8F6_31_9056.vasp,K2Cd4S8F6,-1.3967381615,0.39078358006249936 -Sn4F8_5_16939.vasp,Sn4F8,-2.6028217533333335,0.08345738249999979 -Ag2O1_191_336.vasp,Ag2O,0.12647926333333334,0.7640727383333333 -Na2Fe1_187_12076.vasp,Na2Fe,1.0358664733333334,1.9779920533333324 -V2N1O2_164_20111.vasp,V2NO2,-5.804131474,0.08226316500000053 -Cr1Sb1As1_156_4252.vasp,CrSbAs,-2.61724596,0.4141762933333305 -Rb2Pb2I6_26_14919.vasp,Rb2Pb2I6,-0.585619173,0.18132333899999997 -Ba2Ag1S2Br2_123_1885.vasp,Ba2AgS2Br2,-2.0674812385714287,0.1527201754743276 -Zr2C2Cl2_164_21540.vasp,Zr2C2Cl2,-4.8069163433333335,0.6086355066666598 -Ag1Sb3S6_143_123.vasp,AgSb3S6,-2.129770628,0.3084915059374975 -Si4O8_156_16501.vasp,Si4O8,-6.1536578825,0.2562550308333327 -Mg2Mn2Sn2_129_10478.vasp,Mg2Mn2Sn2,-0.747760125,0.09371081545976845 -Tl1Ag1Sb2Te6_149_19208.vasp,TlAgSb2Te6,-0.983478386,0.3630890326666635 -Hf1W1Br2O2_6_7363.vasp,HfWBr2O2,-4.502744236666667,0.6835898372222222 -Y2Cl6_162_20720.vasp,Y2Cl6,-3.39311483125,0.06267760187499993 -Fe2Cu1S2I1Cl1_1_5843.vasp,Fe2CuS2ICl,-1.3289367328571429,-0.14738578339285868 -Bi18I4_11_2313.vasp,Bi18I4,-1.0050509804545456,-0.5326348566666672 -Fe3O1F7_156_6058.vasp,Fe3OF7,-2.4252444572727274,-0.2992073796590935 -Ta2Mn2Te6_11_17773.vasp,Ta2Mn2Te6,-2.9005564969999997,0.09488671152777628 -Bi1F3_187_2331.vasp,BiF3,-1.964871695,1.0304341706249998 -Cs4Te16_14_4813.vasp,Cs4Te16,-1.003309386,0.19019095799999985 -Nb2W2O11_164_12940.vasp,Nb2W2O11,-6.358288659333334,-0.2127878954166711 -Li1Ta1Cr1Mo1S2Br2_1_9793.vasp,LiTaCrMoS2Br2,-3.07061378,0.7855085187499926 -Nb4Cr2S12_14_13065.vasp,Nb4Cr2S12,-4.361580847222222,0.11793104759258832 -Zn1C4N6_115_20907.vasp,ZnC4N6,-6.239707179090908,-0.16181415250001185 -As8Pb8O20_14_1401.vasp,As8Pb8O20,-3.9926849686111114,0.08638975222222234 -In1As2Au1O6_149_8190.vasp,InAs2AuO6,-3.359402051,0.6964911071249962 -Na2Fe2S4O4_13_12079.vasp,Na2Fe2S4O4,-2.9938451291666666,0.2824397291666627 -Sc4S4I2Br2_35_16259.vasp,Sc4S4I2Br2,-3.3941302516666667,0.042872658333330094 -In2Si2S6_162_8602.vasp,In2Si2S6,-3.170525446,0.07007615199999817 -Na2Zn2P2_129_12339.vasp,Na2Zn2P2,-1.1256521050000001,0.1308555166666665 -Tb2Br2_164_18184.vasp,Tb2Br2,-2.1838182825,0.08804255249999815 -Ta2H2N1_164_17747.vasp,Ta2H2N,-6.0135456220000005,0.3112217516666673 -Hf2Au1I1O3_1_7432.vasp,Hf2AuIO3,-4.920993628571429,0.5884783348214198 -K2Sn1As2S6_147_9349.vasp,K2SnAs2S6,-2.4729676863636363,0.10948017909090924 -Ge2Te2_59_6888.vasp,Ge2Te2,-2.184584675,-0.7213433499999999 -P2H2Se2O10_4_13980.vasp,P2H2Se2O10,-4.544119598125,0.019710386041660977 -Na3Sc1Cl6_10_12358.vasp,Na3ScCl6,-2.292070863,0.1375467024999999 -Hf1Te2_115_7323.vasp,HfTe2,-3.15929611,0.588963726666667 -Ga2Co2Se5_164_6336.vasp,Ga2Co2Se5,-2.225528326666667,0.036922979370365816 -Li2Ni2Bi2_12_10024.vasp,Li2Ni2Bi2,-0.7816693866666666,-0.08362472722222286 -Cu2As4S3Cl2_6_5018.vasp,Cu2As4S3Cl2,-2.023692311818182,0.11365440456438891 -Zr1Ga1Te2_25_21296.vasp,ZrGaTe2,-2.52170409,0.3581951254166622 -Sn2C2I2_59_16754.vasp,Sn2C2I2,-2.103531795,0.525124473055555 -Cd2Cu4Te6Cl4O16_13_3502.vasp,Cd2Cu4Te6Cl4O16,-2.609072329375,0.07327953453125008 -Fe1C4N2Cl2F4_47_5647.vasp,FeC4N2Cl2F4,-4.3723119853846155,0.0007407267427761433 -K2Hg4O8F6_31_9175.vasp,K2Hg4O8F6,-1.414942961,0.348761356041667 -Sc1As2Au1Se6_149_15899.vasp,ScAs2AuSe6,-2.2759840010000003,0.26491076166666405 -Au1O2_164_1435.vasp,AuO2,-1.5806821066666668,0.4953055785416638 -Ti2I2N2_59_18953.vasp,Ti2I2N2,-5.311944913333334,-0.23634482604166962 -Al1Ge1Se3_143_667.vasp,AlGeSe3,-2.371402244,0.4662086831666642 -W2Se4_127_20554.vasp,W2Se4,-2.390031963333333,1.0014284066666672 -Ag4Se2_191_559.vasp,Ag4Se2,0.06187572833333333,0.293490915 -Sb2Cl6_164_15570.vasp,Sb2Cl6,-1.408041695,0.11120012999999984 -Sn2Hg1S2Br2_12_16777.vasp,Sn2HgS2Br2,-1.1757893657142857,0.10520405267856936 -Cu1Ir1I4O2_8_4912.vasp,CuIrI4O2,-1.12724233625,0.4450065839583335 -Ag2Sb4Te3F2_6_420.vasp,Ag2Sb4Te3F2,-1.210294509090909,0.5296352948484826 -Hf2O2_10_7549.vasp,Hf2O2,-6.5078057825,0.7989959931818111 -Ag2P4S3F2_6_361.vasp,Ag2P4S3F2,-2.3477901990909094,0.36266210000822896 -P4Se2S12_4_14121.vasp,P4Se2S12,-2.5994294872222223,0.42901444752314494 -Pt1O2_115_14583.vasp,PtO2,-2.42891177,1.1187728300000002 -Nb1Zn1Cl2_8_12614.vasp,NbZnCl2,-1.758844205,0.279936643825 -Hf1Mo2O8_12_7235.vasp,HfMo2O8,-5.800558171818182,0.08163808636363701 -Cu2Te1_191_5328.vasp,Cu2Te,0.14490534,0.5768931508333326 -Ir1I2_187_8739.vasp,IrI2,-0.33695237333333333,0.9909318433333323 -Ge2I8_2_6784.vasp,Ge2I8,-0.42057815099999996,0.17634776275000008 -Ag1S2_187_114.vasp,AgS2,-1.0688300233333334,0.4492842196875 -Cu1Ni3Te3Se5_1_4925.vasp,CuNi3Te3Se5,-0.9811421691666666,0.1961650356944432 -Mn4I14_2_11441.vasp,Mn4I14,-0.13995684611111112,0.21820071006944414 -V2Pb1O2F8_2_20142.vasp,V2PbO2F8,-3.6124900176923074,-0.37956110156251033 -Cr3Ru1Cl1O7_1_4576.vasp,Cr3RuClO7,-4.282104619166667,0.22163373198784259 -Ho2Cl2O2_164_8132.vasp,Ho2Cl2O2,-5.062346071666666,0.027951906666666915 -Cu2S2_164_5253.vasp,Cu2S2,-1.100444875,0.26195883666666675 -Mn2Sb2Se4Cl2_26_11247.vasp,Mn2Sb2Se4Cl2,-2.0197143090000003,0.14664462549999757 -Rb2Ru2C2Cl8O4_59_14922.vasp,Rb2Ru2C2Cl8O4,-2.8182897122222226,0.33250791675925495 -Cu4N2O12_4_5430.vasp,Cu4N2O12,-3.0740014844444445,0.31542155958333096 -Y3H2C2_187_20796.vasp,Y3H2C2,-5.326100688571429,0.20689411857141748 -Cu2As4Se3F2_6_5023.vasp,Cu2As4Se3F2,-1.9268985363636362,-0.10717080803030743 -Ga1Cu1W1S3Br2_8_6181.vasp,GaCuWS3Br2,-1.8952526125,0.6852959531250002 -Ge2P2_187_6814.vasp,Ge2P2,-3.6236989425,-0.5142131375000001 -Se2N2_39_16289.vasp,Se2N2,-3.205741665,0.8134096343749999 -W2O2_129_20518.vasp,W2O2,-4.5322261725,1.9229254464795864 -Zn2In2O5_156_21110.vasp,Zn2In2O5,-2.9769492222222222,0.24555396347221892 -Sr4P4S8Cl4_14_17460.vasp,Sr4P4S8Cl4,-2.9976916795,0.16652716542968415 -La4Cl6_1_9626.vasp,La4Cl6,-2.941117616,0.10132063080000009 -Zr1Nb2Br2N2O1_25_21366.vasp,ZrNb2Br2N2O,-5.77583190625,0.016704929062490992 -Co2Sb2Se6_162_4006.vasp,Co2Sb2Se6,-2.123992814,0.31356984066666405 -Li2Hf1H6S6_1_9960.vasp,Li2HfH6S6,-3.5828510946666667,0.11411771000000015 -Tm1Sb2_21_19668.vasp,TmSb2,-2.31689544,0.1649763208333308 -Tb1P2_21_18175.vasp,TbP2,-3.144916353333333,1.2861174204166668 -P2Pb2O6_147_14008.vasp,P2Pb2O6,-4.610565008,0.27696421075000066 -Mn2Bi2S4Cl2_26_11008.vasp,Mn2Bi2S4Cl2,-2.1766541960000003,0.2609990369999995 -Hf1S1O1_156_7278.vasp,HfSO,-6.347960489999999,0.26666859250000075 -Fe1Sb2Te4_164_5751.vasp,FeSb2Te4,-1.6291425814285714,0.13219490714285553 -Hg2Au2S2Cl2_26_7927.vasp,Hg2Au2S2Cl2,0.03166654625,0.1649968190625 -V2Se2Cl2O7_1_20181.vasp,V2Se2Cl2O7,-3.8494794807692307,0.12880143173076553 -Zn2B1Cl2O3_150_21040.vasp,Zn2BCl2O3,-2.933128805,0.2318085032291627 -Ba2Cd1In1Au1O5_99_1940.vasp,Ba2CdInAuO5,-2.58306186,0.6146185712085509 -V1H5C4S6_2_19859.vasp,VH5C4S6,-4.10352123625,0.43169843851562595 -Ag1Bi1As2S6_143_21.vasp,AgBiAs2S6,-2.299412481,0.04031267356249729 -Ga1Cu1S2_156_6170.vasp,GaCuS2,-1.39994875,0.8903758050000001 -Cs1Ti1O2_156_4654.vasp,CsTiO2,-4.71458368,0.6478135745000011 -In2Te6As2_147_8640.vasp,In2Te6As2,-1.528508279,0.23109912816666434 -Ag1H2S2_12_70.vasp,AgH2S2,-2.125075866,0.1511275506874976 -Cr4H2N3O2_164_4603.vasp,Cr4H2N3O2,-4.9533347681818185,-0.04213703893940823 -Zr1Ti1Ga1Se3I2_1_21468.vasp,ZrTiGaSe3I2,-2.79326935375,0.0025177436979070267 -Ti2F2_164_18932.vasp,Ti2F2,-5.26417932,-0.24769663833333766 -Hg1C2S2N2_1_7847.vasp,HgC2S2N2,-4.3389209385714285,0.12666396324403573 -Sr4Ti2Cu4O14_26_17486.vasp,Sr4Ti2Cu4O14,-4.134367892916667,0.22714860874999454 -Co2P4I4O6_2_3969.vasp,Co2P4I4O6,-3.23399881875,0.3147003594062423 -Mn2S1I2O1_6_11211.vasp,Mn2SI2O,-2.14825138,0.05608932583333326 -Rb2Cu2Te2_129_14836.vasp,Rb2Cu2Te2,-0.393991365,0.1299704983333333 -Al1_123_760.vasp,Al,-1.41461763,1.009363235 -Hg1I2_12_7883.vasp,HgI2,0.9056050933333334,0.03272483611111121 -Ta3Ir2Br1Cl1O7_1_17966.vasp,Ta3Ir2BrClO7,-5.4304885164285706,0.6304616740476153 -Ca2Bi10O17_1_2950.vasp,Ca2Bi10O17,-3.790595613103448,0.15152525051724197 -Ba2F4_51_1980.vasp,Ba2F4,-3.263296511666667,0.6089142416666662 -Ta6S18_59_18150.vasp,Ta6S18,-4.716065242083333,0.050718802916667194 -W4Cl1O9_1_20582.vasp,W4ClO9,-5.570485972142857,0.2961611117966376 -Y2C2Cl2_12_20714.vasp,Y2C2Cl2,-5.446916125,0.04276728666666063 -K1Ga1Br4O12_2_8898.vasp,KGaBr4O12,-2.4708122016666665,0.3267737145391372 -Ni3Ir1Se5S3_1_13703.vasp,Ni3IrSe5S3,-1.801926105,0.13778974670138694 -Ni2H4S2O8_4_13517.vasp,Ni2H4S2O8,-3.772170481875,0.18840147437499966 -Cu1P2H14C8O8_2_4934.vasp,CuP2H14C8O8,-5.068881184848484,0.20963607499999007 -Ba3Mn2S5Br2_123_2115.vasp,Ba3Mn2S5Br2,-2.7678846025,0.22849874958332994 -V4B3Cl2_164_20300.vasp,V4B3Cl2,-4.222225482222222,0.38017866333332906 -Ag1Sb3Se6_143_124.vasp,AgSb3Se6,-1.712326834,0.13863983216666487 -Ga2Fe1Se4_156_6351.vasp,Ga2FeSe4,-1.9783857242857141,0.09543649857142711 -Cu3Pb2Se2N1O11_8_5381.vasp,Cu3Pb2Se2NO11,-3.194204674736842,0.3152823643256476 -Te1P1Cl1_156_18316.vasp,TePCl,-1.7303294033333334,0.4888271311111091 -P4O10_31_14084.vasp,P4O10,-5.391927086428572,0.09788767071428595 -H2Pb2_164_7005.vasp,H2Pb2,-1.5415355725,1.535437355 -Zr1H2O2_164_21304.vasp,ZrH2O2,-4.742559432,1.497537948000001 -Si6As8_1_16525.vasp,Si6As8,-3.313758207142857,-0.1622745088095262 -Cd2Te2Au2Cl2_26_3585.vasp,Cd2Te2Au2Cl2,0.147582095,0.10637542717000004 -Al2Bi4O8_90_769.vasp,Al2Bi4O8,-3.848852645,0.6383039885714222 -Na2Pb1S6F6_147_12263.vasp,Na2PbS6F6,-1.8507495466666666,0.5724613563958288 -Ga2Os1_123_6423.vasp,Ga2Os,-2.5842760933333335,0.7870965322222192 -Sr2Ge4Cl12_2_17225.vasp,Sr2Ge4Cl12,-2.092437725,0.018926189444442798 -Nb1Zn2In1Br4O4_3_12620.vasp,NbZn2InBr4O4,-2.8275930541666665,0.16498561104166676 -Nb2F6_162_12714.vasp,Nb2F6,-4.05313398375,0.33305040124999685 -Ba1Cu1Sb1O5_99_1824.vasp,BaCuSbO5,-3.5523316825,0.39667428437499497 -Mn1Sb1Br2O2_6_10856.vasp,MnSbBr2O2,-2.6711107033333334,0.17926142562500003 -Cr2Co1Se4_164_4358.vasp,Cr2CoSe4,-2.5686553785714286,0.016814150634920866 -Li2Ti2N2Cl2_59_10095.vasp,Li2Ti2N2Cl2,-5.18419987375,0.12391211125000012 -Cr3C2S2F2_187_4550.vasp,Cr3C2S2F2,-3.7329322722222225,0.604285475833329 -Hf1Ti1Te1I1_25_7337.vasp,HfTiTeI,-3.3889905575,0.617107406249995 -Nb3Te2C1I1_8_13026.vasp,Nb3Te2CI,-3.89179837,0.38080020186587926 -Y4C3F2_164_20813.vasp,Y4C3F2,-5.885351837777778,0.21604468888888384 -Ag2Te2N2O10_13_459.vasp,Ag2Te2N2O10,-3.4492388225,0.11107549859375032 -Ta2Sn2Sb2_129_17890.vasp,Ta2Sn2Sb2,-3.3118155016666666,-0.7757986230555628 -Pd2Br4_2_14405.vasp,Pd2Br4,-0.31230346000000003,0.2591920033333333 -Sb2Br2_12_15553.vasp,Sb2Br2,-1.324191505,0.16955659999999884 -Sr4Te8As4Cl4_14_17481.vasp,Sr4Te8As4Cl4,-2.0958918375,0.034251930000000264 -Mn5Zn1Ge2S12_6_11463.vasp,Mn5ZnGe2S12,-2.785829067,0.05581897507499989 -Na4Cl2_51_12380.vasp,Na4Cl2,-1.1738960483333334,0.32128776874999865 -Tl1Sb2Au1Se6_149_19340.vasp,TlSb2AuSe6,-1.427234829,0.41014134249999773 -Te4Mo1Au2_111_18592.vasp,Te4MoAu2,-0.9009521028571428,0.2486520885714273 -Sb2Se4_14_15703.vasp,Sb2Se4,-1.7810381366666668,0.5708098138888866 -Sb18F4_11_15427.vasp,Sb18F4,-2.2465774131818184,0.23882392416666387 -Fe2Br6_189_5823.vasp,Fe2Br6,-0.37518116375,0.39999508687499996 -Ag1H4S2N12_6_78.vasp,AgH4S2N12,-4.660126618421053,-0.047081015822374894 -Ti1Co1S2Br2_8_18763.vasp,TiCoS2Br2,-2.976133021666667,0.1648084178472169 -Ag2P4Br2O3_6_355.vasp,Ag2P4Br2O3,-2.8067214336363637,0.28436095163635744 -K1Se2_115_8937.vasp,KSe2,-0.9268456366666666,0.8429565008333297 -Zr2N2Cl2_164_21607.vasp,Zr2N2Cl2,-5.670460993333333,0.031797440000000066 -Mn1C2O6_147_10659.vasp,MnC2O6,-5.436350027777777,0.06297626930555061 -Bi1Te2Pd2_187_2406.vasp,BiTe2Pd2,-1.331535006,0.11886727099999886 -Re6I18_164_15123.vasp,Re6I18,-1.619066875,0.05738484458333337 -Sc1Te6As2Au1_149_16019.vasp,ScTe6As2Au,-1.702170353,0.11011616129166413 -Na4As4O8_29_12362.vasp,Na4As4O8,-4.050912349375,0.03958560312499948 -Mn3Cl8_2_11369.vasp,Mn3Cl8,-1.6477597145454546,-0.054865193181819594 -Na2H6C4O10_2_12115.vasp,Na2H6C4O10,-5.028456102272727,0.060000539621202 -Fe2Se3S1I2_1_5982.vasp,Fe2Se3SI2,-1.342992525,0.2195088935937497 -Nb2Se6_59_12887.vasp,Nb2Se6,-3.6600542625,0.07834452249999968 -Ta1P2_187_17598.vasp,TaP2,-5.164014496666667,0.8374096316666666 -Cu2H12C8N16_14_5106.vasp,Cu2H12C8N16,-5.52832934368421,-2.0012645307017634 -Ag2As4O3F2_6_163.vasp,Ag2As4O3F2,-2.547657090909091,0.43337685606060206 -Nb4Ge2S8_55_13078.vasp,Nb4Ge2S8,-4.537593201428572,-0.003230712619051168 -Mn2Ni1B6N6_150_11167.vasp,Mn2NiB6N6,-5.0414989346666665,1.438055631417625 -Zr4B3H2S2_164_21803.vasp,Zr4B3H2S2,-4.81944355,0.2664462188636323 -Hf4H2S2N3_164_7787.vasp,Hf4H2S2N3,-6.229395780000001,0.4048943474999849 -Ga4Te6_31_6579.vasp,Ga4Te6,-1.650818325,0.15920566020000007 -Nb3Te1Cl4_156_13021.vasp,Nb3TeCl4,-3.2627256475,0.36050717620534944 -Mo2Cl2_164_11597.vasp,Mo2Cl2,-2.3439182575,0.7217680758333336 -Hf1Mn2I1Br1O3_35_7228.vasp,HfMn2IBrO3,-4.08666873875,0.2632791655549571 -B6C8_6_1775.vasp,B6C8,-6.232472543571428,1.117805983928565 -K12Ge4Te12_13_8874.vasp,K12Ge4Te12,-1.1637190103571429,0.18966636321428587 -Cd1Pb2I2O2_12_3391.vasp,CdPb2I2O2,-1.6955113414285716,0.0775891557142856 -Mg2Mo2Se2O12_18_10483.vasp,Mg2Mo2Se2O12,-4.530171138888889,0.049768899861107 -Cu2C2I2O2_31_5062.vasp,Cu2C2I2O2,-3.00052193625,0.30328294249999893 -Nb1F2_164_12505.vasp,NbF2,-4.238444863333333,0.4116775933333286 -Li1Mg6C1_25_9741.vasp,LiMg6C,-0.77360257125,0.18306843864583333 -Cs2F2_129_4711.vasp,Cs2F2,-1.75650703,-0.4190465000000001 -Na1W2Br6O2_10_11951.vasp,NaW2Br6O2,-2.660946327272727,0.2218614754545456 -Ba1Bi4O8_162_1810.vasp,BaBi4O8,-3.5274125992307694,0.40132564711538077 -Ga2Se2I2_31_6472.vasp,Ga2Se2I2,-1.5781405116666667,0.0345303183333332 -Rh2O2F2_59_15202.vasp,Rh2O2F2,-3.0610831383333337,0.15915311805555232 -Ta3Ni1Te1I3_6_17971.vasp,Ta3NiTeI3,-2.84301244375,0.2232114695535654 -Sc4S4Br4_11_16257.vasp,Sc4S4Br4,-3.3745946991666664,0.21406032916666673 -K2H8O4F2_26_9161.vasp,K2H8O4F2,-3.71737169,-0.11835146479166614 -Sc2Sb2O8_2_16144.vasp,Sc2Sb2O8,-4.9777767866666665,0.4476725650000004 -Sc3H2N2O2_187_16206.vasp,Sc3H2N2O2,-5.691980518888888,-0.457893536666671 -Ru1Cl2O1_47_15264.vasp,RuCl2O,-2.63199079,0.058721835000000056 -Mo1S2_115_11543.vasp,MoS2,-3.03986383,0.7262547883333337 -Sc3N2O2_187_16213.vasp,Sc3N2O2,-6.217261987142857,0.13637821428570884 -As2Os2S6_162_1235.vasp,As2Os2S6,-3.38409719,0.39873330087499737 -Th1Ge2_123_18716.vasp,ThGe2,-3.675629433333333,0.8411124416666671 -Ta2Ru2Se8_11_17842.vasp,Ta2Ru2Se8,-3.7575396425,0.18730015833333358 -Co1H4C6Br2_47_3758.vasp,CoH4C6Br2,-4.734657546923077,0.35517308307691425 -Sn1O1_156_16658.vasp,SnO,-3.234894615,0.5017507674999999 -Hg3As1Se4Br1_156_8046.vasp,Hg3AsSe4Br,-0.48217553999999996,-0.1169254916666681 -Zr2H2N1O2_164_21579.vasp,Zr2H2NO2,-5.674311347142857,0.7827112871428454 -Re4I14_1_15109.vasp,Re4I14,-1.2343191822222221,0.213496683171295 -Mo1Se1I2_47_11546.vasp,MoSeI2,-1.264072555,0.29252179731770833 -Na2Os2C2S4I8_7_12248.vasp,Na2Os2C2S4I8,-1.98529347,0.35377430923610886 -Co1Te1Br1_156_3829.vasp,CoTeBr,-1.3351085033333332,0.08634639833333346 -Be2Ag2_191_2235.vasp,Be2Ag2,-0.0844286825,0.6794637775000001 -P2Rh2Se6_162_14039.vasp,P2Rh2Se6,-2.649245922,0.4764252128333317 -Ag3Sb1O4_156_500.vasp,Ag3SbO4,-1.8561621325,0.48021828812499967 -Tl12Bi4I24_14_19190.vasp,Tl12Bi4I24,-0.45873801025,9.128474999953173e-05 -Fe1H4C4N2Cl2_47_5700.vasp,FeH4C4N2Cl2,-4.97105071076923,0.08022287525639449 -Hf1F3_25_7155.vasp,HfF3,-4.548683625,0.44883634843749987 -Mo2Br6_25_11579.vasp,Mo2Br6,-1.296276565,0.14149767906249822 -Te4Ru3_164_18627.vasp,Te4Ru3,-2.4238357885714286,0.42243767214285377 -Rh2Se2Br2_59_15234.vasp,Rh2Se2Br2,-1.8221779333333332,0.11660861666666666 -Ti4H2S2N3_164_19140.vasp,Ti4H2S2N3,-6.334094527272726,-0.16231547244318667 -Ta2Te8Os2_11_17927.vasp,Ta2Te8Os2,-3.2336793633333336,0.10107395583333334 -Ba1V4O8_162_1877.vasp,BaV4O8,-5.26126709,0.33792150278846256 -Ti1O2_187_18822.vasp,TiO2,-6.651943406666667,0.6119111183333334 -W1Cl2_115_20426.vasp,WCl2,-2.284941723333333,0.7552533466666618 -Ni1H2O2_156_13324.vasp,NiH2O2,-2.988365468,0.3257007971666669 -K2Os2S2N2F10_11_9285.vasp,K2Os2S2N2F10,-3.0637460605555558,-0.14366766170833956 -Sn1P2S4_164_16664.vasp,SnP2S4,-2.8998378957142856,0.28868793561383643 -Ta4Fe2Te10_59_18039.vasp,Ta4Fe2Te10,-2.973219595,0.18513287152777758 -Na4Ti2S4O2_7_12425.vasp,Na4Ti2S4O2,-4.13924351,0.10739886166666679 -Cd1I2_187_3368.vasp,CdI2,0.6783111433333334,0.12280238055555559 -Ge4Se2S6_1_6948.vasp,Ge4Se2S6,-2.8399576616666664,0.17921408092013902 -Bi2Au2O4_11_2423.vasp,Bi2Au2O4,-2.49534631375,0.6181702509374978 -In2Se2Cl2_59_8578.vasp,In2Se2Cl2,-1.6895907216666668,0.05448357166666651 -Y2B2C2_51_20696.vasp,Y2B2C2,-6.187757463333334,0.3054060336111042 -Zr1Nb1I2N1_1_21344.vasp,ZrNbI2N,-4.143936578,0.2750472295000004 -La1I2_123_9568.vasp,LaI2,-1.96140371,-0.007135950000000113 -In2I6_189_8482.vasp,In2I6,-0.19835212,0.19516427375000003 -Mg2F4_2_10450.vasp,Mg2F4,-3.2315514800000003,-0.11092580833333399 -K4I4Cl16_14_9466.vasp,K4I4Cl16,-0.6263978425,0.027537178750000058 -Al2Zn2Te5_156_1043.vasp,Al2Zn2Te5,-1.1662853244444444,0.15062437777777657 -Sc1In1S1Br3Cl1_1_15948.vasp,ScInSBr3Cl,-2.0202683842857145,0.2169482603571382 -Ge10F24_14_6631.vasp,Ge10F24,-3.0483327311764703,0.016211018529409094 -Y1Te3_99_20683.vasp,YTe3,-2.5188389275,-0.33411460250000014 -Sb2I6_162_15593.vasp,Sb2I6,-0.541220135,0.052491697500000045 -Mn2Sb2Cl2O4_26_11232.vasp,Mn2Sb2Cl2O4,-3.3893150400000005,0.10465860074999522 -Tl4P4_127_19616.vasp,Tl4P4,-1.04045161625,0.9635683870000001 -Mn2H4C12S2O8_13_11099.vasp,Mn2H4C12S2O8,-5.758550912857143,0.21485980107142222 -Li4W4F24_14_10250.vasp,Li4W4F24,-3.5101529303125,2.4068470696874997 -Bi2P2Pb2O10_2_2489.vasp,Bi2P2Pb2O10,-4.543465574375,0.09476205031249726 -In2Fe1S4_164_8430.vasp,In2FeS4,-2.483580607142857,-0.11404745357143042 -As1Au3O4_156_1133.vasp,AsAu3O4,-1.832685005,1.03270283125 -Ta4S2N3_164_18102.vasp,Ta4S2N3,-7.268216434444445,0.36296437944443793 -Ta1Cr1H6_123_17533.vasp,TaCrH6,-2.901825175,1.9300559031250004 -Na2Cd4Te2S6Br6_31_12047.vasp,Na2Cd4Te2S6Br6,-0.935030967,0.23936109116666415 -Zn2Sb4O8_4_21155.vasp,Zn2Sb4O8,-3.6080006292857143,0.0841555589285693 -Te6As2Rh2_162_18646.vasp,Te6As2Rh2,-2.018017854,0.3636918866666653 -Ru1Cl2_187_15267.vasp,RuCl2,-1.3013073333333334,0.803797453888887 -Ag2As4S3Cl2_6_166.vasp,Ag2As4S3Cl2,-1.8774263554545456,0.11628245308711849 -In2Se2Br2_59_8576.vasp,In2Se2Br2,-1.5048634666666667,0.050727863333333456 -Ca3Si1Br2_47_3200.vasp,Ca3SiBr2,-1.5898487399999999,0.16195778125000027 -Ru1F2_115_15268.vasp,RuF2,-2.0207245533333333,0.7311659416666638 -Pd2Br2Cl4_1_14398.vasp,Pd2Br2Cl4,-0.534055225,0.12092805083333336 -Ni2Se3S2Br1_8_13644.vasp,Ni2Se3S2Br,-1.24569848625,0.3334849532291667 -Na1Ni1P2Se6_149_11915.vasp,NaNiP2Se6,-2.165626546,0.13417952293750024 -Nd2I2O2_129_13239.vasp,Nd2I2O2,-4.510676723333334,0.05507658833333284 -K1I1_123_8907.vasp,KI,-0.4890124,-0.40812378000000005 -Nb1S2_115_12560.vasp,NbS2,-4.374657083333333,0.582728321666667 -Fe1B4Br2N2F4_47_5621.vasp,FeB4Br2N2F4,-4.145137116153847,0.27747018764101705 -Tc4Br14_13_18244.vasp,Tc4Br14,-1.9555468855555556,0.11405073305554897 -Ga2Ni1S4_164_6399.vasp,Ga2NiS4,-2.4211977528571427,0.07344646095237936 -Cu1Ge2W1Se1S3I2Br2_1_4888.vasp,CuGe2WSeS3I2Br2,-2.0455105875,0.09451809598379124 -Ba2Ca2I8_18_1936.vasp,Ba2Ca2I8,-1.1593531625,0.24921343316666655 -Si2C2Br2_59_16393.vasp,Si2C2Br2,-3.691705066666667,0.8825191329166628 -H2W4N3_164_7044.vasp,H2W4N3,-5.701468358888889,-1.3848619691975346 -Hg3N1_191_8061.vasp,Hg3N,1.51878949,1.0611305009698278 -Ga2O2_187_6416.vasp,Ga2O2,-3.98216958,0.26364484249999975 -In2Se2Cl2_31_8577.vasp,In2Se2Cl2,-1.6662461966666668,0.07782809666666646 -Ag1B6C6S2F4_6_17.vasp,AgB6C6S2F4,-4.567050778947369,0.9011690934795172 -Mn1In2S4_164_10784.vasp,MnIn2S4,-2.5235923285714286,-0.036840597142857145 -Sc2Te1S1Br2_1_16172.vasp,Sc2TeSBr2,-2.9291617916666666,0.2380123130555527 -Na6H10C4O16_13_12436.vasp,Na6H10C4O16,-4.764727488611111,0.036727217777773546 -Sc2I6_162_16098.vasp,Sc2I6,-1.5649557225,0.05256180875000016 -P8Se20_14_14159.vasp,P8Se20,-2.4395074896428572,0.3033078873214262 -Pr1Te3_191_14539.vasp,PrTe3,-1.8110252875,0.13657325500000006 -Mn1As2F12_81_10636.vasp,MnAs2F12,-2.3635053413333336,0.08994271166666412 -Li1Re1Te1Br1_8_9780.vasp,LiReTeBr,-2.55910305,0.89479002875 -Nb2P4S16_8_12810.vasp,Nb2P4S16,-3.591985496818182,0.07663032522727242 -Sc4Br4O4_11_16227.vasp,Sc4Br4O4,-4.6666090075,0.07315518249999986 -Mn2P2S4Br2_26_11189.vasp,Mn2P2S4Br2,-2.615454352,0.20029637084721896 -In1Pd2_187_8309.vasp,InPd2,-0.6479137533333333,0.8581118133333333 -Li2Fe1_187_9902.vasp,Li2Fe,-0.5022748033333333,1.226073434444443 -Al2Ni2S5_164_903.vasp,Al2Ni2S5,-2.597037038888889,0.11521994912036809 -Br4O10_4_2707.vasp,Br4O10,-1.953589157857143,0.4425378137499991 -Bi1Sb1Mo1_156_2378.vasp,BiSbMo,-2.0015711633333333,0.43022086309523533 -Sn1Pb1Se2_1_16672.vasp,SnPbSe2,-1.80640335,-0.043282090781250115 -Y7Cl10_2_20848.vasp,Y7Cl10,-3.548894077647059,0.12612481323528935 -Fe1C6Br2F4_47_5648.vasp,FeC6Br2F4,-4.129458744615385,0.339399099038457 -Mg1H2Se2_1_10372.vasp,MgH2Se2,-2.5185912559999997,0.8078914836666672 -Rb2Au2S2_51_14767.vasp,Rb2Au2S2,-0.6844119399999999,0.34357213166666667 -Be2Bi1_191_2242.vasp,Be2Bi,-1.3710777966666667,0.2853167249999986 -Zr1Ni1F6_149_21373.vasp,ZrNiF6,-3.27960819875,0.0739397262499999 -Hf3B2S2F2_187_7683.vasp,Hf3B2S2F2,-4.787617317777777,0.8371291711111013 -Sc1H2_187_15941.vasp,ScH2,-3.15388276,0.4915541700000001 -Zr4B3Cl2_164_21800.vasp,Zr4B3Cl2,-4.882545546666666,-0.12305329250000258 -Pr1S3_191_14535.vasp,PrS3,-3.0321562275,0.9697245617187504 -Bi1Sb2Au1S6_143_2383.vasp,BiSb2AuS6,-2.041432971,0.05717101621874776 -Cu2Sb4S3I2_6_5279.vasp,Cu2Sb4S3I2,-1.4684736036363637,0.18667465557851112 -Mg2Ga1Cu5Se4Cl8_1_10456.vasp,Mg2GaCu5Se4Cl8,-1.1831274994999998,0.18486495483333354 -Al1Br2_164_616.vasp,AlBr2,-1.3119776533333334,0.43344968277777624 -Cs2Hg4S2Cl6O6_31_4729.vasp,Cs2Hg4S2Cl6O6,-1.7322233485000003,0.0863135704999997 -Ba2Tl1Ag1Hg1O5_99_2074.vasp,Ba2TlAgHgO5,-2.420871477,0.27072467510714016 -Zr1Zn1Cl2_156_21491.vasp,ZrZnCl2,-1.6059026925,0.18654964791666503 -Si2N6_164_16414.vasp,Si2N6,-5.55873869,0.14148338104166136 -K2C10S2F6_51_9011.vasp,K2C10S2F6,-4.0480576445,0.9904163369375001 -Fe8Cu4S14_51_6100.vasp,Fe8Cu4S14,-1.633812816923077,0.2558402442307657 -Ti1Ni1Pd1Se1S1I2_1_18811.vasp,TiNiPdSeSI2,-1.880653487142857,0.07970493874602774 -Mg1F2_187_10358.vasp,MgF2,-3.1094510300000002,0.01117464166666604 -Ba1Sn1Te2_1_1859.vasp,BaSnTe2,-1.731287245,-0.51555062125 -Fe1Ni1C4N4O2_123_5722.vasp,FeNiC4N4O2,-5.1915346275,0.5143853487760358 -Na3Lu1Cl6_10_12353.vasp,Na3LuCl6,-2.303775605,0.13419312500000036 -Pb1I2_187_14189.vasp,PbI2,-0.5645286566666666,0.15597710944444454 -Te1Ru1Se1_1_18334.vasp,TeRuSe,-2.3521491633333333,0.5556484216666668 -Cr1Ag1P2Se6_149_4100.vasp,CrAgP2Se6,-2.319957608,0.039031927656249965 -Cr1P2O8_2_4230.vasp,CrP2O8,-5.097197599090909,0.11526903035983904 -Ni1Au1Br1Cl1O4_1_13258.vasp,NiAuBrClO4,-1.29976638375,0.4039136503559022 -W1I1Cl1_156_20435.vasp,WICl,-1.37865022,1.1926170364583282 -Zr2Cl6_2_21555.vasp,Zr2Cl6,-2.900461585,0.06920127124999986 -Mn1Nb1Te1S2_1_10815.vasp,MnNbTeS2,-3.417615542,0.43766554809195013 -Co2O2_164_3947.vasp,Co2O2,-3.3400901475,-0.3729223975 -Nb3I2O4_1_12980.vasp,Nb3I2O4,-5.196983537777778,0.16785031393517968 -Mn2S4F2_11_11225.vasp,Mn2S4F2,-2.66699093,0.3013011964062502 -Mn2Bi2Se4I2_10_11018.vasp,Mn2Bi2Se4I2,-1.570510145,0.1146916374285687 -Hf1Ta1Te2_8_7315.vasp,HfTaTe2,-3.8921610175,1.1410035575000004 -Ge8S12I8_147_6976.vasp,Ge8S12I8,-1.8296056535714287,0.4044349810714285 -Ti4C3S2F2_164_19131.vasp,Ti4C3S2F2,-5.860091723636364,0.4410702871590795 -Ta3I7O1_156_17964.vasp,Ta3I7O,-2.6985670972727274,0.24621280619317742 -In6O9_150_8709.vasp,In6O9,-3.728974326,0.30976364624999997 -Na2Br1_164_11992.vasp,Na2Br,-0.8998704466666667,-0.10041343666666736 -Sc2I2O2_59_16093.vasp,Sc2I2O2,-4.351182131666667,0.05257546833333304 -Pt4F8_14_14701.vasp,Pt4F8,-1.3753734408333333,0.442227491666664 -Ca5Tm1_1_3252.vasp,Ca5Tm,0.43459039666666666,1.3142988141666652 -Cd1H2Se2_12_3341.vasp,CdH2Se2,-1.684582586,0.5539319846666666 -Hf1Se1S1_156_7306.vasp,HfSeS,-4.740311136666667,0.34448012833333364 -Cu4Te16_14_5477.vasp,Cu4Te16,-0.6778869710000001,0.4921766970000001 -V4C3O2_164_20313.vasp,V4C3O2,-5.974825375555556,0.02728829209314343 -Co1H2O2_8_3740.vasp,CoH2O2,-3.936470414,0.17862998744444236 -Hf2I2_129_7518.vasp,Hf2I2,-2.7925766775,0.7567529099999968 -Nb4Pd2S14_11_13123.vasp,Nb4Pd2S14,-3.8506515785,0.1379442554374979 -Hg2S2O10_31_7998.vasp,Hg2S2O10,-2.709826174285714,0.5610792916071399 -Ni4Br8_14_13743.vasp,Ni4Br8,-0.14502152083333333,-0.18992194083333333 -As2Ru2S6_157_1287.vasp,As2Ru2S6,-3.1415317810000003,0.23127432337499698 -Rb2Hg4S2I6O6_31_14870.vasp,Rb2Hg4S2I6O6,-1.421366579,0.06946132140277386 -Hg2I2_12_7973.vasp,Hg2I2,1.2714582375,0.05959345000000016 -Te2W2N1_164_18531.vasp,Te2W2N,-4.290716658,-0.07634687966666642 -V2I1Br3O2_8_20090.vasp,V2IBr3O2,-2.89448114125,0.0399172158593748 -K1Se1O2F1_6_8936.vasp,KSeO2F,-2.462287508,0.5886067369999997 -Ge2Te1S1_6_6878.vasp,Ge2TeS,-2.6708753025,-0.8136807131249998 -Ta6Co18_191_18142.vasp,Ta6Co18,-2.23245999,1.1965230683333332 -Cu2H16N4O4F8_14_5111.vasp,Cu2H16N4O4F8,-3.5948994111764705,0.19372483764705278 -Ag2Xe2F18_83_493.vasp,Ag2Xe2F18,-0.22315582863636363,0.014698181818181805 -Dy2C1_164_5521.vasp,Dy2C,-4.03997052,0.4173681966666667 -Rb1Li1Mg6O7_99_14742.vasp,RbLiMg6O7,-3.733891327333333,0.025168192333330452 -Pd3Se2Cl1O2_1_14511.vasp,Pd3Se2ClO2,-1.57376245625,0.46326448770832895 -Mn2Te2_187_11307.vasp,Mn2Te2,-1.3550210175,0.49121667318965523 -Fe2Se2Cl4_12_5973.vasp,Fe2Se2Cl4,-1.32763457125,0.17717365885416653 -Co1C8F6_25_3724.vasp,CoC8F6,-4.8502984693333335,0.5053977864999939 -Sr4Cu4Sb2O14_6_17428.vasp,Sr4Cu4Sb2O14,-3.3807274350000003,0.39473754583332665 -Mn2Se2Cl2_59_11276.vasp,Mn2Se2Cl2,-1.9631352066666665,0.08227788166666694 -Zn2Sb4O6F4_31_21153.vasp,Zn2Sb4O6F4,-3.112609568125,0.19638502109375022 -Ta3N2_187_17970.vasp,Ta3N2,-7.644145352,0.9047113513333258 -V1W3Se8_25_19965.vasp,VW3Se8,-3.614577245,-0.2843310379166666 -Ga1Si1S2I1Br1_1_6278.vasp,GaSiS2IBr,-2.1919939266666666,0.2541257985416638 -Nd1C2_123_13216.vasp,NdC2,-5.652204073333333,0.7829747499999935 -Bi1Se1Cl1_156_2387.vasp,BiSeCl,-1.6182273533333333,0.1946304666666665 -Rb2Ru2S4I8N2_7_14932.vasp,Rb2Ru2S4I8N2,-1.597016343888889,0.28693197111110935 -Sn1Pb1Br2O2_8_16668.vasp,SnPbBr2O2,-2.6274894300000002,0.15008222249999958 -Zn1Fe2H2O6_8_20932.vasp,ZnFe2H2O6,-3.4614489254545457,0.18068936382575013 -Ni2Bi2Se4Br2_10_13469.vasp,Ni2Bi2Se4Br2,-1.090924298,0.20964017599999954 -Ca1Fe1S1O1_156_2834.vasp,CaFeSO,-2.91484672,0.19742176000000022 -Mo6N2O18_10_11761.vasp,Mo6N2O18,-4.970090584230769,0.1888656409615333 -Hg1Bi1_156_7839.vasp,HgBi,1.357833795,0.36387002939655155 -Na1In1Te6As2_5_11892.vasp,NaInTe6As2,-1.519913678,0.2896226571666652 -K2F1_164_9096.vasp,K2F,-0.8042640133333333,-0.2308861900000006 -Ru2I2_129_15322.vasp,Ru2I2,-1.0553920675,0.7480771724999985 -Ta2H2_12_17749.vasp,Ta2H2,-5.3531273425,0.3789750300000003 -Sn1Te1Se1_156_16698.vasp,SnTeSe,-1.6298911133333334,-0.055110277777779215 -Ce4Se8_11_3689.vasp,Ce4Se8,-3.465741245833333,0.33558646000000003 -Sb2C6_191_15560.vasp,Sb2C6,-5.51325449875,1.1448813268749993 -Zn1Cu1Se2I1Cl1_1_20920.vasp,ZnCuSe2ICl,-0.3454987216666667,0.35801088132523107 -Hf1Ge1Te2_25_7182.vasp,HfGeTe2,-3.1864614475,0.1679773362499999 -Nb2Ge2As2_129_12726.vasp,Nb2Ge2As2,-4.39482617,-0.09634537000000387 -Cu2Te3As4Cl2_6_5341.vasp,Cu2Te3As4Cl2,-1.5131193554545455,0.18650227106060283 -Ga2Br6_1_6314.vasp,Ga2Br6,-1.08303221625,0.07106123375000006 -Hf1Ta1N1O3_25_7313.vasp,HfTaNO3,-7.587608615,0.27112952546295577 -Rb2Os2Br8N2O4_7_14904.vasp,Rb2Os2Br8N2O4,-2.4954309011111113,0.08723806018517799 -Cu2Bi2S2Cl4_51_5041.vasp,Cu2Bi2S2Cl4,-1.215668174,0.2574043972499966 -Co1H4I2N6_47_3767.vasp,CoH4I2N6,-3.9117849099999997,-0.025016432756415963 -Sn2Hg1Br2O2_12_16773.vasp,Sn2HgBr2O2,-1.8065363714285714,0.21201178768472828 -Sn2As1S6_162_16711.vasp,Sn2AsS6,-2.597952851111111,0.26721271788193857 -H2C2_164_6993.vasp,H2C2,-5.8092368525,0.05058286250000066 -Cd2H4Se2S8_31_3514.vasp,Cd2H4Se2S8,-2.123180365625,0.21709406338541642 -Mg2Cr8O18_85_10447.vasp,Mg2Cr8O18,-4.828940799285713,-0.036708200178573624 -Ni2S2_129_13587.vasp,Ni2S2,-1.1692063825,0.2592546408333316 -Sc3S2Cl1_8_16217.vasp,Sc3S2Cl,-3.666158333333333,0.22567547694443782 -V1S1I2_47_19911.vasp,VSI2,-1.670034305,0.24367143921874712 -Tb1Si5_47_18180.vasp,TbSi5,-3.5507565,-0.014929668888892023 -Cu4Se4Cl4_14_5473.vasp,Cu4Se4Cl4,-0.8374213300000001,0.11138789448412612 -Rb2C6O6F6_4_14801.vasp,Rb2C6O6F6,-4.6414464275,0.07021963049999397 -Mn2Sb2Te4Cl2_10_11256.vasp,Mn2Sb2Te4Cl2,-1.610633201,0.2285193134999981 -Ge2Te2_31_6887.vasp,Ge2Te2,-2.2620995375,-0.7988582125000001 -Mn3H2N2O2_156_11386.vasp,Mn3H2N2O2,-4.370981921111111,0.7420494088888838 -Ba2Co3O7_6_1957.vasp,Ba2Co3O7,-3.67265898,0.49616605749999637 -Ca3Ag2Br2O4_123_3142.vasp,Ca3Ag2Br2O4,-2.626940887272727,0.024410805909085953 -Ta1Nb1S2Br1Cl3_1_17573.vasp,TaNbS2BrCl3,-3.41000145625,0.24577450671874024 -Sr1O2F2_1_17069.vasp,SrO2F2,-2.497761282,1.1332142385000008 -Zr1N1F3_1_21334.vasp,ZrNF3,-4.278493892,0.7802579133333287 -Bi2Te1Se2_156_2554.vasp,Bi2TeSe2,-1.8546381740000002,0.07916965999999981 -Hf2Te6P2_2_7645.vasp,Hf2Te6P2,-3.057922235,0.28913514591666584 -Mo3W1O8_25_11730.vasp,Mo3WO8,-5.453934908333333,0.13360515378471738 -Sc2Se2F2_59_16156.vasp,Sc2Se2F2,-4.026609078333333,-0.05440260388889273 -Sb8O16_1_15870.vasp,Sb8O16,-4.004120684166667,0.41395618291666647 -Ni2Te4H2_6_13676.vasp,Ni2Te4H2,-1.21873590625,0.5423229675 -W1Br1Cl1_156_20416.vasp,WBrCl,-2.1697320466666667,0.6429526130555516 -Cs1Ti1Se2_156_4656.vasp,CsTiSe2,-3.004542745,0.21534260625000012 -Al2Hg1Te4_164_874.vasp,Al2HgTe4,-1.3081532242857143,0.1911571957142857 -Ba2Tl1Cu1Hg1O5_99_2082.vasp,Ba2TlCuHgO5,-2.595857441,0.3718486405624929 -Sb4_53_15843.vasp,Sb4,-2.0532543,0.23031277250000004 -Cr1Sb2Au1S6_149_4255.vasp,CrSb2AuS6,-2.270837469,0.3726007659999995 -Te2P2Se1_164_18442.vasp,Te2P2Se,-2.414039712,0.2514479855416668 -Mn1Ga1Br4Cl2_1_10715.vasp,MnGaBr4Cl2,-1.258473365,0.012980453229165356 -Pb2Se4_12_14297.vasp,Pb2Se4,-1.704880675,0.3644249384027759 -Ba2Te4F20_13_2069.vasp,Ba2Te4F20,-2.636286375384615,0.05881673846153879 -Sr2Cu1Se2Br2_38_17204.vasp,Sr2CuSe2Br2,-1.6806951542857143,0.09309325666666346 -K1Mo2I6O2_47_8918.vasp,KMo2I6O2,-1.78561904,0.06311420015151104 -P2Pd2S7_6_14024.vasp,P2Pd2S7,-2.5002516127272725,0.34710202303030047 -Pb2Se2Br2_59_14285.vasp,Pb2Se2Br2,-1.300016445,0.33159836670138687 -Hf1Ge1I2N1_1_7175.vasp,HfGeI2N,-3.61470194,0.3658863685 -Pb1S2_164_14201.vasp,PbS2,-2.0085786833333334,-0.6871947868750014 -Sb4O8_59_15792.vasp,Sb4O8,-4.161610068333333,0.25646679875 -Pt1Cl2_187_14570.vasp,PtCl2,-0.35047617666666664,0.7675638850000002 -K4Ge2As4_49_9446.vasp,K4Ge2As4,-1.7400637350000001,0.13976677299999984 -Ba2Cl2O6_129_1947.vasp,Ba2Cl2O6,-2.417322016,1.013725024249997 -Al1Ag1P2S6_149_598.vasp,AlAgP2S6,-2.9793227250000003,0.02812750511978962 -Na2Ga2H8_51_12083.vasp,Na2Ga2H8,-2.5420427025,0.09435425666666708 -Ge1Sb2Te4_164_6706.vasp,GeSb2Te4,-1.9564317885714286,-0.21957307142857285 -Na2H8S4Cl2_2_12140.vasp,Na2H8S4Cl2,-2.83991620375,0.10427347453124991 -Ba2P4O12_2_2045.vasp,Ba2P4O12,-5.494511806666667,0.17801616027777722 -Hf1Fe1Cl6_149_7158.vasp,HfFeCl6,-2.5587509525,0.04585218343749986 -Si1Se2_187_16368.vasp,SiSe2,-2.5959899866666665,0.5294351302083338 -Ag2Te1_191_453.vasp,Ag2Te,0.40057375333333334,0.353488425 -K2Nb1Ag1S4_21_9253.vasp,K2NbAgS4,-2.6143550075,0.13761298062500016 -Al1Te4_8_748.vasp,AlTe4,-1.434591714,0.41641287350000017 -Pd2O2F2_59_14442.vasp,Pd2O2F2,-2.052210955,0.2297361861111089 -Al2Fe2S5_164_836.vasp,Al2Fe2S5,-3.1949312855555556,-0.23676138347222497 -Fe1I2_164_5716.vasp,FeI2,-0.5449209133333334,-0.5432260891666667 -Cu2Sb4O3F2_6_5274.vasp,Cu2Sb4O3F2,-2.382020217272727,0.8395496849810555 -Ta1P1_123_17596.vasp,TaP,-4.94934716,1.7600276099999999 -Cu2Te3O8_5_5344.vasp,Cu2Te3O8,-3.011729536153846,0.36015675932691793 -Mn2I8_14_11119.vasp,Mn2I8,-0.198265372,0.08594933175000008 -Ni2Pd1Br4Cl4_1_13574.vasp,Ni2PdBr4Cl4,-0.38266322,-0.05916065909090962 -P4S6_1_14112.vasp,P4S6,-3.2742815819999995,0.11096860940624742 -B4Cl8_14_1752.vasp,B4Cl8,-2.8094405291666664,0.13571819731481238 -Zr1Ta2Ni1C2O1F2_8_21456.vasp,ZrTa2NiC2OF2,-5.320369596666667,0.7103016847222108 -Cu6O2F10_2_5495.vasp,Cu6O2F10,-1.3790333116666667,0.1631178656944427 -K2Eu2P2Se8_11_9095.vasp,K2Eu2P2Se8,-2.7196781828571432,0.09263882428571346 -Mn2Bi2Se4Br2_10_11014.vasp,Mn2Bi2Se4Br2,-1.7316925680000002,0.12875830266666516 -Zr1Pt1Se1S1_156_21409.vasp,ZrPtSeS,-3.3813486675,0.45208119687499937 -As4O8_156_1341.vasp,As4O8,-4.065830561666666,0.37537262374999214 -Zn1In2Te4_156_20969.vasp,ZnIn2Te4,-0.9356916028571429,0.13378680142857124 -C1_123_2740.vasp,C,-5.43728203,2.6790433799999995 -Ga1P2Au1Se6_149_6232.vasp,GaP2AuSe6,-2.159571065,0.05532594618749809 -Au2I2N2_59_1484.vasp,Au2I2N2,-0.8273447516666667,0.6747568416666654 -Co2Se4F2_2_4026.vasp,Co2Se4F2,-2.0611063675,0.3145576676041667 -Ru2S2_187_15343.vasp,Ru2S2,-3.249789615,0.5107545224999996 -Cu3P1O4_156_5378.vasp,Cu3PO4,-2.96431925375,0.6033999063541671 -K2Pb1S6F6_147_9294.vasp,K2PbS6F6,-1.757265764,0.560410033437498 -Nb1In1Br6_5_12526.vasp,NbInBr6,-1.63500204125,0.09886551249999803 -S2_51_15387.vasp,S2,-2.300266965,0.317617834375 -Li1In1As2O6_5_9725.vasp,LiInAs2O6,-4.059360602,0.35172445052082435 -Co2O4F2_11_3950.vasp,Co2O4F2,-2.9784043625,-0.1096542904687503 -Li2Mg1Te2H4S8_2_9977.vasp,Li2MgTe2H4S8,-2.739514657647059,0.03444336607842691 -Ni2Bi4Br4O6_2_13473.vasp,Ni2Bi4Br4O6,-2.505641919375,0.012347631875000153 -Co3Ni1O8_164_4064.vasp,Co3NiO8,-3.4879947058333336,-0.5810480912500025 -Ca1S2F2_12_2873.vasp,CaS2F2,-2.177318142,1.1760847557500005 -Ir2Br2N2_59_8764.vasp,Ir2Br2N2,-3.1994636483333334,0.37376220138888594 -Pd2Se2_123_14496.vasp,Pd2Se2,-1.44650187,0.28035384249999984 -Zr3I2N1O1_8_21770.vasp,Zr3I2NO,-4.4050077,0.40127339676189644 -Ba4Sb4O10_11_2180.vasp,Ba4Sb4O10,-4.382167770555555,0.036456158981477735 -Sr1P2F12_2_17071.vasp,SrP2F12,-3.2646972813333335,-0.020125620666666344 -Mn1Cu1Br2O2_6_10681.vasp,MnCuBr2O2,-2.1223026716666666,0.1777462999999999 -Bi2Te2Se1_164_2564.vasp,Bi2Te2Se,-1.682860754,0.08140208400000004 -Hg1As1_8_7834.vasp,HgAs,0.443746505,0.8219410218965515 -Fe3B2O2F2_187_6046.vasp,Fe3B2O2F2,-2.5998789222222225,1.767044214567897 -Nb3H2N2_187_12977.vasp,Nb3H2N2,-6.257791258571428,-0.11049808714286158 -Al2S1I2_5_932.vasp,Al2SI2,-1.798792636,0.2944660745833312 -Ta2Sb2O6_2_17864.vasp,Ta2Sb2O6,-5.826632163,0.2593342682499975 -Nb2Te4Br4_12_12918.vasp,Nb2Te4Br4,-2.259291678,0.11904198316666459 -S8Cl8_2_15404.vasp,S8Cl8,-1.4670264425,0.05961697875000005 -Fe2S2I2_59_5933.vasp,Fe2S2I2,-1.3561078383333334,-0.15895582694444566 -Pb1Cl2O1_187_14177.vasp,PbCl2O,-1.652342425,0.15141281031249998 -Sc4S6_1_16261.vasp,Sc4S6,-4.203749147,0.3826863135000007 -Tl2Te2_129_19551.vasp,Tl2Te2,-0.68843231,0.26422707125 -Ga1Ag1P2O6_149_6115.vasp,GaAgP2O6,-4.396898216,0.3618953895090904 -Cr2Cl8_1_4356.vasp,Cr2Cl8,-1.498201732,-0.11023470950000003 -V3Mo1O8_25_20276.vasp,V3MoO8,-5.3437691025000005,0.22937179020833343 -P2Pb2S6_7_14015.vasp,P2Pb2S6,-2.82532942,0.24181487749999997 -Os1Br2_164_13792.vasp,OsBr2,-1.7487196933333333,0.24077227666666245 -Pd2S2O6_12_14464.vasp,Pd2S2O6,-3.509608806,0.11625809199999596 -Au1Se1Br2_6_1444.vasp,AuSeBr2,-0.072804155,0.2846855099479165 -W2S2_187_20532.vasp,W2S2,-4.18348494,0.9253408400000005 -Ni4Te1Se5_1_13768.vasp,Ni4TeSe5,-0.885367443,0.2264837129999987 -Cu1H4C4N2Cl2_10_4898.vasp,CuH4C4N2Cl2,-4.6500363338461534,0.3044345221153696 -Li2V2F8_51_10123.vasp,Li2V2F8,-3.458416676666667,-0.3558745800000027 -Ca4S16_14_3235.vasp,Ca4S16,-2.6355263565000002,0.11346915912500011 -K2Al2C2O10_51_8972.vasp,K2Al2C2O10,-4.91137802875,0.25180815851562516 -Ta1Ni1Se1S3_6_17589.vasp,TaNiSeS3,-3.34132553,0.04367258578703409 -Ga1Co5Br2_123_6152.vasp,GaCo5Br2,-1.27143632375,0.3692972158333315 -Ti2Cu4Te6_12_18930.vasp,Ti2Cu4Te6,-1.8211666266666666,0.14589975499999985 -Cd1H1Br1O1_156_3326.vasp,CdHBrO,-1.91909218,0.12387487125000018 -Ba2Mg2Bi2_164_2018.vasp,Ba2Mg2Bi2,-0.7151445983333334,0.2659394548148125 -Sn1Hg2O4_21_16646.vasp,SnHg2O4,-1.9340440571428572,0.3755329940476162 -C4Se4_51_2770.vasp,C4Se4,-4.21154481375,1.0006121679166669 -Ti2Te2As1_164_19034.vasp,Ti2Te2As,-4.359855334000001,0.05699618599999923 -Cu4S4I4F4_14_5457.vasp,Cu4S4I4F4,-0.8435493575,0.22325975583333352 -Al2Te3_164_1015.vasp,Al2Te3,-2.107013144,0.10827495024999978 -V4S4F12_14_20361.vasp,V4S4F12,-3.2454596555000004,-0.263408845625 -Cu2H4C6Cl2_2_5124.vasp,Cu2H4C6Cl2,-4.2540412907142855,0.43565747749999795 -In2O3_150_8515.vasp,In2O3,-2.995913664,1.0428243082499997 -Bi4O8_31_2631.vasp,Bi4O8,-3.5237193516666667,0.24383149427083017 -Mn2P2S4Cl2_26_11190.vasp,Mn2P2S4Cl2,-2.761346438,0.20834483659721892 -Ti1I1Cl1_156_18793.vasp,TiICl,-2.9419983066666666,0.1740228112500002 -Na1Co1P2S6_149_11845.vasp,NaCoP2S6,-3.0273436289999998,0.1411498931250007 -Pt2S2_164_14664.vasp,Pt2S2,-2.12863471,0.48644644999999986 -Ni2P2S7_6_13566.vasp,Ni2P2S7,-2.2970755990909093,0.3118170718181762 -Rb1Te2_115_14758.vasp,RbTe2,-0.57040703,0.3986948372916647 -Pd2Br4_13_14404.vasp,Pd2Br4,-0.5012378766666666,0.0702575866666667 -Ni2Pb8_125_13573.vasp,Ni2Pb8,-0.399858271,0.938690625 -Rh1Au1Se2I1Br1_1_15142.vasp,RhAuSe2IBr,-0.7489583299999999,0.46122067492646895 -Ga1Ag1Te6As2_149_6131.vasp,GaAgTe6As2,-1.397683352,0.26844571466666506 -Na1Ni1As2Se6_149_11912.vasp,NaNiAs2Se6,-1.898480064,0.26903771391666464 -Ga1Sb1_187_6264.vasp,GaSb,-1.496700925,-0.36763217000000004 -Sr4Sb4Te8F4_14_17473.vasp,Sr4Sb4Te8F4,-2.3716733569999997,0.04902956199999886 -Ag2I2_51_317.vasp,Ag2I2,0.51917315,0.17169984499999996 -Zn2Ga2O5_156_21081.vasp,Zn2Ga2O5,-3.3767781144444444,-0.1379714148611143 -Ta2C1_164_17681.vasp,Ta2C,-7.343368843333334,1.2686039666666655 -K6In2P4_49_9538.vasp,K6In2P4,-1.2035728158333334,0.14356161916666665 -Ga1Te1Br1_3_6288.vasp,GaTeBr,-1.3089821933333334,0.22076204666666666 -Hf1Cd1Se2Cl2_8_7138.vasp,HfCdSe2Cl2,-2.345925783333333,0.02703903062499835 -Rh2Br6_189_15177.vasp,Rh2Br6,-0.49850125,0.56440773 -Ga1Pt5I2_38_6253.vasp,GaPt5I2,-1.3285740325,0.17890238530475022 -Tl4V4O12_57_19637.vasp,Tl4V4O12,-4.4815027005,0.13082121721428153 -Nb8C4_51_13206.vasp,Nb8C4,-6.200054865833334,1.7425293099999992 -Zr6N2F26_164_21861.vasp,Zr6N2F26,-4.1116548311764705,0.32333779450979605 -Au2S4F2_1_1526.vasp,Au2S4F2,-1.43237379875,0.20238810730468748 -K2Te2C2S6F6_1_9368.vasp,K2Te2C2S6F6,-2.5691483277777776,0.4430329698842571 -Nb4Co8S8_59_13060.vasp,Nb4Co8S8,-3.5302530665,0.2044757198333298 -Cr2W2O10_85_4537.vasp,Cr2W2O10,-5.540741295714286,-0.12500832776786153 -Nb1Se1S1_156_12576.vasp,NbSeS,-4.48714536,0.1680911133333325 -Cr2Pd1S4_164_4460.vasp,Cr2PdS4,-2.935576074285714,0.09342797785714074 -Na2Os2S2N2Cl10_1_12252.vasp,Na2Os2S2N2Cl10,-2.371713000555556,-0.003081360436517022 -Sn4Sb4S4_17_16965.vasp,Sn4Sb4S4,-2.138743865,0.26499863999999784 -In4Te4_11_8703.vasp,In4Te4,-1.21517035375,0.16983866625 -Sb2Se2I2_31_15693.vasp,Sb2Se2I2,-1.3787359866666666,0.2204073541666669 -K2I2F8_127_9204.vasp,K2I2F8,-1.4622330308333333,0.19974278916666677 -Na6Te2O8F2_11_12447.vasp,Na6Te2O8F2,-3.0032337088888887,0.3129157020833304 -Ni2H4Se2O8_4_13518.vasp,Ni2H4Se2O8,-3.546339674375,-0.15502968145833318 -Na1Y1C1O10_3_11957.vasp,NaYCO10,-4.329169423076923,0.5237974709294768 -Cr2I4_14_4414.vasp,Cr2I4,-0.8013072816666668,0.3584573238888876 -Mo2Cl6_12_11600.vasp,Mo2Cl6,-1.81746137375,0.1126211472916645 -Ca1Cu4I2Br3O4_1_2830.vasp,CaCu4I2Br3O4,-1.3547315092857144,0.2082685485160053 -V1H2O2_164_19849.vasp,VH2O2,-4.546280506,0.18434321144443871 -Mg2Sn1_65_10516.vasp,Mg2Sn,-0.01675422,-0.013835346666666666 -Ca2Ni2Ge2_129_3078.vasp,Ca2Ni2Ge2,-1.0474946183333333,0.19166403499999984 -Sr1Sn1I2O2_1_17085.vasp,SrSnI2O2,-2.5401440466666667,0.2834872802777775 -Ni2Se1Cl5_8_13626.vasp,Ni2SeCl5,-0.51135566875,0.0728115546875 -Cr5Bi6Se16_8_4626.vasp,Cr5Bi6Se16,-2.3009136333333333,0.06572326395061379 -Ag2Se4Cl2_4_441.vasp,Ag2Se4Cl2,-0.93040387375,0.12183930687500011 -Te2Pt1_187_18480.vasp,Te2Pt,-1.41917147,0.42601597833333327 -Hf2Te1Se1_25_7628.vasp,Hf2TeSe,-4.09215146,0.2884924059374999 -Ta2Se6_59_17882.vasp,Ta2Se6,-3.9537531775,0.0960555381249999 -Cu2Te1S2I2_1_5325.vasp,Cu2TeS2I2,-0.6349904514285714,0.2699217332142851 -Sb1Se1I1_156_15500.vasp,SbSeI,-1.38301549,0.21612785083333352 -Be1Br2_164_2216.vasp,BeBr2,-1.8023908166666667,0.2858458100000001 -Hg1I1Br1_8_7877.vasp,HgIBr,0.7128885,0.06298970472222226 -Te2Pb2_129_18458.vasp,Te2Pb2,-1.3465795925,-1.4073467675 -Co2Te2_164_4040.vasp,Co2Te2,-1.3725522425,0.27925001083333334 -Sn2I2_164_16785.vasp,Sn2I2,-0.4931329075,-0.6083112104166666 -Mg2In2Te5_164_10474.vasp,Mg2In2Te5,-1.4534105744444445,0.057576568333333245 -C1N1Cl1_25_2733.vasp,CNCl,-4.589643343333333,0.1816034993749971 -Ni1Ir1S2I2Cl2_8_13368.vasp,NiIrS2I2Cl2,-1.10863420125,0.07061690421875004 -Hf1Br1Cl1_156_7125.vasp,HfBrCl,-3.142781863333333,0.2843931160416606 -Y1W1F5_47_20689.vasp,YWF5,-3.54981126,1.2340675867857098 -Sc1Nb1Zn1S4I1Br2_1_15964.vasp,ScNbZnS4IBr2,-2.539471799,0.21354709364999225 -Sc1Mn2Br3N1O3_1_15956.vasp,ScMn2Br3NO3,-3.483483879,0.16085178789582277 -Hf3S2N2_187_7725.vasp,Hf3S2N2,-6.892124278571429,0.008673433571422251 -Tm2Se2I2_59_19687.vasp,Tm2Se2I2,-2.8205614000000003,0.043738826666666064 -Au1C1N1_25_1417.vasp,AuCN,-4.240659133333334,0.9632488955555507 -Li4As4S8_29_10159.vasp,Li4As4S8,-3.106046246875,0.08406967937499976 -Nb3Ir1Se8_1_12984.vasp,Nb3IrSe8,-3.8184131741666665,-0.03823972958333277 -H2Pb1O2_164_7001.vasp,H2PbO2,-3.7981560659999998,0.04200332504166589 -Na1Sb5O8_1_11932.vasp,NaSb5O8,-3.992197717142857,0.16957885991071064 -Ba2Fe2Sn2_12_1984.vasp,Ba2Fe2Sn2,-0.567944295,1.0516673283333318 -Rb4Cd2I8_11_14966.vasp,Rb4Cd2I8,-0.07111684428571428,0.16526222714285715 -Cd2Sb2Br2O4_11_3552.vasp,Cd2Sb2Br2O4,-2.359308667,0.15953791799999983 -Zn2W2S2O12_4_21194.vasp,Zn2W2S2O12,-4.421491107222222,0.12835004504166408 -Ti2F8_1_18937.vasp,Ti2F8,-4.319682611999999,0.05745618500000038 -Sb2Ir1S1I2_1_15596.vasp,Sb2IrSI2,-1.7365522016666668,0.37548566781249776 -Ba2Ti3O8_123_2073.vasp,Ba2Ti3O8,-6.3626143861538464,0.036022440384615884 -Nb2Te1S1Br2_8_12901.vasp,Nb2TeSBr2,-3.2804854183333334,0.16259127450395822 -Hf2Ga1S5Br2_1_7494.vasp,Hf2GaS5Br2,-3.704576639,0.2499541997499959 -U1O2F2_10_19696.vasp,UO2F2,-6.047059964000001,0.046624910549995846 -Bi8Pb4_26_2689.vasp,Bi8Pb4,-0.9059328516666666,-0.15195881500000064 -Ag2O2_10_339.vasp,Ag2O2,-1.17488469,0.19221786249999995 -Ba2Sr2_164_2063.vasp,Ba2Sr2,0.6361061675,0.9911689825000001 -Ru1Rh1S2Br2_8_15283.vasp,RuRhS2Br2,-1.9041246,0.5241000737908439 -W1I2_164_20437.vasp,WI2,-1.17602283,0.8946677230555555 -Tc2N4_187_18232.vasp,Tc2N4,-7.162201453333334,-0.3974919170833342 -Mn2Sb2S6_162_11244.vasp,Mn2Sb2S6,-2.718389093,0.37733928249999826 -Ni1Te1Pd1Se2Cl1_1_13430.vasp,NiTePdSe2Cl,-1.1040270783333332,0.14763447206597013 -Cu2Re1Cl6_147_5233.vasp,Cu2ReCl6,-1.3296274177777778,0.4073096643827146 -Cr12I24_127_4094.vasp,Cr12I24,-1.0233741538888887,0.13639045166666564 -K2H2O2_4_9124.vasp,K2H2O2,-3.084485471666667,0.12682356166666597 -Zn1H2O2_164_20953.vasp,ZnH2O2,-3.3626424040000003,0.1014354979999994 -Li2V4O8_1_10134.vasp,Li2V4O8,-5.293436318571429,0.15119330214285753 -Hf2Se2_164_7609.vasp,Hf2Se2,-4.3872093325,0.18000548249999948 -Si2Se2F2_59_16448.vasp,Si2Se2F2,-2.926475136666667,0.4896880746874965 -Sb2_164_15753.vasp,Sb2,-2.02556701,0.25800006249999985 -Hf2C2Br2_59_7463.vasp,Hf2C2Br2,-5.131425943333333,0.6186857999999962 -Al2Se2_164_969.vasp,Al2Se2,-2.895069035,0.05329001 -Ge2Br1Cl1_1_6752.vasp,Ge2BrCl,-1.8170264475,0.08070482750000008 -Tl2H8C14N6O2_2_19430.vasp,Tl2H8C14N6O2,-5.8021057871875,0.32806962468749945 -Cr1I2_115_4200.vasp,CrI2,-0.5019847000000001,0.6577799055555543 -Rb2C2O6F2_1_14785.vasp,Rb2C2O6F2,-4.043724376666667,0.08591887270833076 -Rh2S2I2_59_15221.vasp,Rh2S2I2,-1.8997788716666666,0.10758677277777595 -Na4Zn2Cl8_11_12431.vasp,Na4Zn2Cl8,-1.355451357857143,0.1251047285714284 -V3Zn2O8_10_20298.vasp,V3Zn2O8,-4.422062577692308,0.18642130576922833 -Ta3Te14Pd3_6_17993.vasp,Ta3Te14Pd3,-2.411792588,0.08447586754166427 -Zr2Sb1Se2_164_21660.vasp,Zr2SbSe2,-3.8574238139999997,-0.188466937749999 -Li1B1C1_156_9660.vasp,LiBC,-5.2359538033333335,0.4017757033333327 -Sb1S2_164_15494.vasp,SbS2,-2.5674959,0.20547916656249754 -Zr1W2O8_164_21488.vasp,ZrW2O8,-6.229905385454546,-0.006155035000007025 -Ca3Mn2S5Cl2_123_3188.vasp,Ca3Mn2S5Cl2,-2.5946818933333335,0.21071701624999672 -Ir2S1I2O1_6_8810.vasp,Ir2SI2O,-2.2667487233333334,0.5634354384722153 -Si2N2_187_16413.vasp,Si2N2,-6.336942235,-0.8714346362500001 -V4O4F12_2_20348.vasp,V4O4F12,-3.7900897815,-0.6601831722499996 -Li1C6_183_9668.vasp,LiC6,-7.069080698571428,0.13341956304761315 -Li1C2_99_9667.vasp,LiC2,-3.550614003333333,2.427622318518513 -Sc2Te6P2_162_16186.vasp,Sc2Te6P2,-2.551452052,0.26912142149999846 -Zn1Pd3Se3S2Cl3_1_20994.vasp,ZnPd3Se3S2Cl3,-1.247195765,0.23210311890624888 -Be3Sb3_25_2282.vasp,Be3Sb3,-2.3604710516666665,-0.09310862291666644 -W2I2N2_59_20498.vasp,W2I2N2,-4.328878311666666,0.29039521513888467 -U2S10_4_19720.vasp,U2S10,-4.248197399166666,0.07891618062499628 -V1Te2_115_19941.vasp,VTe2,-1.8300040133333333,0.5372370444444443 -Hg4S2O8_13_8086.vasp,Hg4S2O8,-2.3284282457142855,0.17740950928571486 -Y1Sn5_47_20680.vasp,YSn5,-1.7573320083333333,-1.277287609999999 -V6Rh18_1_20393.vasp,V6Rh18,-1.9305426820833331,0.7976095729166668 -Ca2Co2Sn2_129_2990.vasp,Ca2Co2Sn2,-0.9824664599999999,0.3267934166666656 -Hg2O2_12_7977.vasp,Hg2O2,-0.49334353,0.2775018383333333 -Ta6Ir18_183_18147.vasp,Ta6Ir18,-3.8743978579166662,1.502456942083334 -Hf3Ti1O8_6_7739.vasp,Hf3TiO8,-7.371263888333334,0.28532016666666604 -Y2Cl2_129_20718.vasp,Y2Cl2,-2.93365794,0.8220059674999961 -Si2Ag2O6_51_16380.vasp,Si2Ag2O6,-4.167356452,0.22543231699999922 -Ge2Bi4O10_26_6750.vasp,Ge2Bi4O10,-4.1041341075,0.17584114886718716 -Zr1Nb2Br2N1O1_6_21365.vasp,ZrNb2Br2NO,-5.20673543,0.3806966765476125 -Ba2Au1Cl2O2_123_1904.vasp,Ba2AuCl2O2,-2.735360302857143,0.18525373306121917 -Ca1Ti8S16_164_2897.vasp,CaTi8S16,-5.0208358812,-0.06764449710000475 -Mn1Sb1Te1Se2_1_10866.vasp,MnSbTeSe2,-2.02864057,0.11604662749999839 -Co2Sb2Pd2_129_3997.vasp,Co2Sb2Pd2,-1.5482716866666666,0.3575504859090871 -Mo4N3_164_11751.vasp,Mo4N3,-4.999348222857143,0.419203375714285 -Y3I7O1_156_20800.vasp,Y3I7O,-2.8514093245454544,0.1341614749999962 -Fe2I2N2_59_5862.vasp,Fe2I2N2,-2.255838685,0.1589121191666617 -C1Br1N1_25_2721.vasp,CBrN,-4.37357797,0.32906413222221786 -Ba4Hg4Se8_26_2158.vasp,Ba4Hg4Se8,-1.351396908125,0.11608704125000013 -Fe2O4F2_2_5895.vasp,Fe2O4F2,-2.7406865225,0.29772490499999726 -Rb2I2Cl8_127_14892.vasp,Rb2I2Cl8,-0.6214219083333333,0.11733016916666672 -Al1Cu1Se1S1Br2_25_648.vasp,AlCuSeSBr2,-1.5610114433333333,0.30235509078703376 -Ta2F2_12_17721.vasp,Ta2F2,-5.44751234,0.7278129555000006 -Rh2S2F2_11_15219.vasp,Rh2S2F2,-2.63502144,0.04653426196969246 -Mn2N2F2_59_11157.vasp,Mn2N2F2,-3.80883468,0.35587587208332816 -Ag2Sb4Se3Br2_6_414.vasp,Ag2Sb4Se3Br2,-1.2582583372727272,0.24385572136363465 -Ba4Mn2Br2O6_129_2160.vasp,Ba4Mn2Br2O6,-3.8125634592857147,0.15131383170566257 -Mg1Sb2O5_38_10399.vasp,MgSb2O5,-4.01876948,0.4583347865625007 -Ba1F2_115_1828.vasp,BaF2,-3.2683255599999996,0.6038851933333333 -Ag1Mo1Br4_2_86.vasp,AgMoBr4,-0.8103523516666667,0.1204735185416646 -Sr4As4Se8Cl4_14_17407.vasp,Sr4As4Se8Cl4,-2.5058157309999998,0.023674503000000513 -Sc1In2I2O3_1_15951.vasp,ScIn2I2O3,-3.203165825,0.3260520368749993 -Sr2N2O6F2_59_17284.vasp,Sr2N2O6F2,-4.420025328333334,0.14779599729166693 -Ti4H2N3O2_164_19138.vasp,Ti4H2N3O2,-7.019339176363636,-0.5659939014394046 -Li2Cu2P2O8_51_9892.vasp,Li2Cu2P2O8,-4.13826491,0.4114593118749966 -Pt2S2I1Cl1_6_14655.vasp,Pt2S2ICl,-1.66656458,0.09314550958333212 -Ca3Au2I2O4_123_3151.vasp,Ca3Au2I2O4,-2.386021758181818,0.20494958618181625 -Na1Bi3_187_11829.vasp,NaBi3,-0.696225305,-0.28382229750000004 -Ta4Co8Te8_59_18030.vasp,Ta4Co8Te8,-3.0082598529999998,0.10903155949999999 -Ti1Te1Se1_156_18856.vasp,TiTeSe,-3.84946908,0.2055301333333328 -Zn1H1_1_20952.vasp,ZnH,-0.18742392,1.0270821475 -Bi14I4_11_2303.vasp,Bi14I4,-0.9342661999999999,-0.46061715870370407 -Hg1S2_187_7911.vasp,HgS2,-0.3444174633333333,0.6656863764583325 -Sr2Cu1Se2F2_38_17206.vasp,Sr2CuSe2F2,-2.0875601114285716,0.5306630080952337 -P4S14_18_14108.vasp,P4S14,-2.7214040177777776,0.34147283319444144 -Pt2S2_129_14662.vasp,Pt2S2,-1.9307857425,0.6842954175 -Sb12Se12_7_15419.vasp,Sb12Se12,-2.05057511375,0.29720258999999793 -As8O12_2_1396.vasp,As8O12,-4.0974397155,0.38779785649999976 -Fe2W2S2O12_8_6034.vasp,Fe2W2S2O12,-4.685313956666667,0.1855455588888857 -Al4S4Br4_14_1084.vasp,Al4S4Br4,-2.758059065,0.025713463333333575 -Li4V4O4F12_14_10247.vasp,Li4V4O4F12,-4.037755191666666,-0.07677596833333777 -Y2Mg2_164_20754.vasp,Y2Mg2,-1.772896445,0.3629433124999999 -Ni1Te1Se1I1_1_13432.vasp,NiTeSeI,-0.51771381,0.23247379515624889 -Ba1Co4O8_162_1820.vasp,BaCo4O8,-3.628983983846154,-0.04720578634616113 -V2H4Se2O10_2_20084.vasp,V2H4Se2O10,-4.432505713333333,0.0921164134259218 -Hf4B3F2_164_7762.vasp,Hf4B3F2,-5.964923083333334,-0.03862770583333841 -Ta2Ni4Se4_51_17802.vasp,Ta2Ni4Se4,-2.487939701,0.05248018680000022 -Sn2I4_12_16786.vasp,Sn2I4,-0.5243022,0.1912678911111111 -Mg3Au1_187_10543.vasp,Mg3Au,0.308513285,0.60080312125 -Ir2Br2_129_8766.vasp,Ir2Br2,-0.774475385,1.8184880783333313 -Mn2Fe1O6_12_11071.vasp,Mn2FeO6,-4.010473378888888,0.2133801381944372 -V1Cr1S2I1Br1_25_19807.vasp,VCrS2IBr,-2.5161980616666666,-0.015104072083336181 -Cu1Ag1Br2_1_4816.vasp,CuAgBr2,0.0936059125,0.2354324975 -Nb1Ni2Te1Br1_1_12546.vasp,NbNi2TeBr,-1.339990914,0.38758111548051727 -Pd2Pt1F5_1_14452.vasp,Pd2PtF5,-1.1424598525,0.32936607062499845 -V2H4C4N2O2F4_2_20081.vasp,V2H4C4N2O2F4,-5.146532481666666,0.007360574085633509 -Zr2Se2N1_164_21677.vasp,Zr2Se2N,-5.247317836,0.006508176500001017 -Cu2Te4As2_26_5349.vasp,Cu2Te4As2,-1.20644268375,0.22551105166666424 -Cs2Hg4I6O8_31_4727.vasp,Cs2Hg4I6O8,-0.828512345,0.5382318244999978 -Sb10O14F2_1_15408.vasp,Sb10O14F2,-4.038220832692308,0.09759980961538472 -Cu1Ag1Se1S1I2_8_4827.vasp,CuAgSeSI2,-0.465300275,0.13554985895833277 -Na1In1P2S6_5_11886.vasp,NaInP2S6,-2.9848368140000003,0.05971542654910372 -Rh2S6_2_15229.vasp,Rh2S6,-2.75469229,0.42987294911458074 -In2Se4_12_8594.vasp,In2Se4,-1.5779782716666666,0.4602876755555536 -La2Ge2I2_164_9593.vasp,La2Ge2I2,-2.913983398333333,0.042577913333333495 -Co2Se6_11_4028.vasp,Co2Se6,-2.03158848875,0.4066990212499998 -Sn1Sb1S1I1Br1O1_1_16684.vasp,SnSbSIBrO,-2.1243506450000003,-0.21745545763889407 -Cu1Ge1Se1S1Br1Cl1_6_4884.vasp,CuGeSeSBrCl,-1.4860937016666667,0.26214094807870003 -Y1I1Cl1_156_20641.vasp,YICl,-2.848714446666667,0.15433417388888582 -Fe1Pb2C6N6_147_5735.vasp,FePb2C6N6,-5.870701216666666,0.17987476516666226 -Ta2Te2F2_59_17902.vasp,Ta2Te2F2,-4.115786141666667,0.28940707633332485 -Sn4Te4Pd4_14_16974.vasp,Sn4Te4Pd4,-1.3545818741666666,0.2169291708333334 -Ag1Cl2_187_49.vasp,AgCl2,0.06308135333333333,0.26229322666666666 -Tl1V3Se2O12_143_19355.vasp,TlV3Se2O12,-4.609206477777778,-0.01769979916666653 -Fe2As2Br2O4_26_5773.vasp,Fe2As2Br2O4,-3.178685214,0.012138093233325306 -Pb1W1S4_3_14212.vasp,PbWS4,-3.211924991666667,-0.31493371843750184 -Zn1As1_8_20895.vasp,ZnAs,-0.035030395,0.6716200728124985 -Os2I2O2_59_13850.vasp,Os2I2O2,-2.956254578333333,0.6494520872916629 -As1Br2_187_1137.vasp,AsBr2,-0.9050261266666667,0.49123768888888747 -In2Sb4Se8Br2_11_8572.vasp,In2Sb4Se8Br2,-1.95958373375,0.09915040875000036 -Bi8_55_2702.vasp,Bi8,-0.85122286125,-0.38435486625000004 -Mg2Sb2Te6_162_10506.vasp,Mg2Sb2Te6,-1.428062832,0.2996885376666651 -Si4I12_26_16493.vasp,Si4I12,-1.008136178125,0.09164388156250003 -Tl4S4Cl4_14_19620.vasp,Tl4S4Cl4,-1.2271049383333332,0.2638552014583321 -Ir2Pb8_125_8803.vasp,Ir2Pb8,-1.235568952,0.8692237240000003 -Fe2P2Se4I2_26_5922.vasp,Fe2P2Se4I2,-1.890628418,0.24101463744444362 -Tl12Ag4Te8_14_19188.vasp,Tl12Ag4Te8,-0.4416155245833333,0.1341323325 -V1B4H5S6_2_19776.vasp,VB4H5S6,-3.78356146875,0.7496886838281203 -S8O18_147_15407.vasp,S8O18,-4.056674893846154,0.253141234038458 -Ta4S12_2_18099.vasp,Ta4S12,-4.63787684375,0.12890720125000055 -Sr2Cu2_191_17214.vasp,Sr2Cu2,0.603490665,0.20258166500000002 -Te2H4O8_7_18384.vasp,Te2H4O8,-3.9068863142857144,0.05344607702380211 -Li1Ag1F4_1_9634.vasp,LiAgF4,-1.6898946266666668,-0.3026658816666681 -La2I2O2_129_9595.vasp,La2I2O2,-4.5841114549999995,0.058130838333333656 -Al2Te4_1_1018.vasp,Al2Te4,-1.7056593166666667,0.3669347730208291 -Mn1Co1Ir1Cl1O4_1_10669.vasp,MnCoIrClO4,-3.558103515,0.1285221931249999 -Sn2Sb2O6_162_16863.vasp,Sn2Sb2O6,-3.9448001830000003,0.24333268799999738 -Ni2W2S8I2_129_13690.vasp,Ni2W2S8I2,-2.150997335,0.5014822011607112 -Zr1Fe1H6_149_21290.vasp,ZrFeH6,-3.1151768675,0.8138882175000004 -Zr1F2_187_21285.vasp,ZrF2,-4.148428746666666,0.3517781366666627 -Sb4S10_31_15812.vasp,Sb4S10,-2.4286006064285712,0.32221870767856964 -Ta1Br4_123_17521.vasp,TaBr4,-2.029153698,0.3706235764375001 -Mn1Sn1S1Br2_156_10894.vasp,MnSnSBr2,-1.714923942,0.2055494276428529 -Fe2C2I2_59_5833.vasp,Fe2C2I2,-2.1553530016666667,0.9142477570833295 -Sc3Bi1Br2O3_1_16197.vasp,Sc3BiBr2O3,-4.254050926666667,0.18819640662036585 -Si4P8_26_16504.vasp,Si4P8,-4.23597537,-1.365590079166667 -Hf1Zr1Sc1I2N1O3_1_7396.vasp,HfZrScI2NO3,-5.477498152222222,0.28511140333332863 -Nb2Cl2O3_8_12677.vasp,Nb2Cl2O3,-5.263617482857143,0.2315297698214307 -Zn2Sb4O8_51_21157.vasp,Zn2Sb4O8,-3.344192980714286,0.34796320749999776 -Rh1S2_164_15166.vasp,RhS2,-2.743537213333333,0.43723068999999737 -Si1B1H2_156_16318.vasp,SiBH2,-4.0009418425,0.19240706712499578 -Al2Cl6_162_795.vasp,Al2Cl6,-2.24921562125,0.03529413250000024 -Tl2B2S6_7_19369.vasp,Tl2B2S6,-3.128411063,0.09781104949999353 -Ba4Bi4S8Cl4_14_2140.vasp,Ba4Bi4S8Cl4,-2.622602855,0.14793122775000034 -Cu1Te1O4_10_4989.vasp,CuTeO4,-3.0635139033333334,0.14730939541666688 -Sr1H12Au2_115_17052.vasp,SrH12Au2,-2.3330222513333334,1.5152621430000002 -S3N3Cl3_6_15392.vasp,S3N3Cl3,-2.9032409233333336,0.40480187166666637 -In2Hg1O4_164_8469.vasp,In2HgO4,-2.740362615714286,0.28754926214285703 -Sc1Sn4Cl3O6_1_16009.vasp,ScSn4Cl3O6,-3.617040054285714,0.20413626084820646 -Nb1Ni1Sn1Cl3O4_1_12543.vasp,NbNiSnCl3O4,-3.5556351200000003,0.027528060249991437 -In2Ni2Te5_164_8503.vasp,In2Ni2Te5,-0.8852219577777778,0.10732300611110956 -Ca2H2Cl2_129_3031.vasp,Ca2H2Cl2,-2.5629704700000002,0.06188641999999955 -Tl1Pd1I2_25_19316.vasp,TlPdI2,-0.2117162925,0.3225868290625 -Ta4Si2Se8_55_18114.vasp,Ta4Si2Se8,-4.537294325714286,0.09300806566467423 -Cd3P1_191_3616.vasp,Cd3P,1.337620545,0.3459828596875001 -Na2C2Se2N2_31_12005.vasp,Na2C2Se2N2,-4.4663959475,0.05790867229166108 -K2H2C6N12_2_9121.vasp,K2H2C6N12,-5.860214145454545,0.06933338984847937 -V1In2Te4_164_19875.vasp,VIn2Te4,-1.5737893757142858,0.2321762319047601 -Mn4F10_13_11433.vasp,Mn4F10,-2.686133922142857,-0.1425838814285736 -Fe2Br2N2_59_5816.vasp,Fe2Br2N2,-2.465791805,0.37566649791666196 -Zn1S1_123_21003.vasp,ZnS,-0.48510273,0.7065573645000001 -As1Cl5_10_1145.vasp,AsCl5,-0.762459095,0.36723628916666573 -N2_51_11789.vasp,N2,-6.474166275,-0.9404156524999996 -Mn1Mo1Se2Br3Cl1_1_10800.vasp,MnMoSe2Br3Cl,-1.629439135,0.1979401971153803 -Cu2Hg2S2F2_26_5156.vasp,Cu2Hg2S2F2,-0.49959318375,0.17089679458333337 -Na8Zn4S8_29_12456.vasp,Na8Zn4S8,-1.6529101220000002,0.16427832786666524 -Te4Pd2Pb4Cl4O12_14_18616.vasp,Te4Pd2Pb4Cl4O12,-2.9490992865384618,0.10887970554486548 -Ge3Bi1Br3O5_1_6904.vasp,Ge3BiBr3O5,-3.3556376983333336,0.11824264406249796 -Fe1H4C6I2_47_5704.vasp,FeH4C6I2,-4.509953309230769,0.3451461532692233 -Cu1Hg1O2_10_4904.vasp,CuHgO2,-1.199278845,0.42253808822916655 -Na4Te2O10_51_12422.vasp,Na4Te2O10,-2.89472034,0.7062984018749999 -Sn2As2H2O6_7_16717.vasp,Sn2As2H2O6,-3.91247755,0.3244328477083285 -Hf1Mn1Br2N1_156_7207.vasp,HfMnBr2N,-3.9508653479999998,0.2405976035258633 -Si1H1W4O10_1_16336.vasp,SiHW4O10,-5.7146689275,0.40752199422565305 -Zr2Cl6_189_21554.vasp,Zr2Cl6,-2.76649972125,0.2031631349999996 -Tl1Ge1S2Br2_1_19276.vasp,TlGeS2Br2,-1.58970428,0.25208470078124834 -Mn2Se1S1Cl2_8_11273.vasp,Mn2SeSCl2,-2.0166485533333334,0.29575940736110784 -Ni2Se1S3_8_13628.vasp,Ni2SeS3,-1.6191474566666668,0.1728137594097177 -V2Te2_164_20216.vasp,V2Te2,-2.2361550475,0.5390900553571403 -Bi1Se2S6F1_1_2393.vasp,BiSe2S6F,-2.084606031,0.46687000804166245 -Ir1Pt3Br4O4_3_8750.vasp,IrPt3Br4O4,-2.0646261866666666,0.3115139832291647 -Hg3Cl6_143_8056.vasp,Hg3Cl6,0.21746525666666666,0.08722707999999998 -Ge1Pt1Br2O2_6_6693.vasp,GePtBr2O2,-2.396127051666667,0.437335140833333 -K2Ge6As6_26_9114.vasp,K2Ge6As6,-2.718474765714286,0.12441275678571406 -Ba2As1_25_1901.vasp,Ba2As,-1.1819712066666666,0.7250702966666651 -Ni1Ir2Se1Br1Cl2O1_6_13372.vasp,NiIr2SeBrCl2O,-1.66852384,0.4077956694270808 -H2W3N2O2_187_7038.vasp,H2W3N2O2,-5.584356425555556,-1.2845903581695755 -Cu1F2_187_4875.vasp,CuF2,-0.8368291466666666,0.4602362133333333 -Au2Cl4_14_1474.vasp,Au2Cl4,0.01820738,0.07636663166666667 -Nb4Se6_11_13153.vasp,Nb4Se6,-4.408510145999999,-0.4978891032500026 -Nb2I4O2_3_12749.vasp,Nb2I4O2,-3.50970492375,0.062291941249999816 -Sr4Sb4S8Cl4_14_17468.vasp,Sr4Sb4S8Cl4,-2.7109942755,-0.2761871107500049 -Re1Se2_187_15023.vasp,ReSe2,-3.87666018,0.28510365833333307 -K2Cl1_164_9075.vasp,K2Cl,-0.38326795666666663,0.14148826666666608 -Nb2Te2_123_12917.vasp,Nb2Te2,-3.8385794225,-0.2059071916666706 -Pa2Bi4_129_14165.vasp,Pa2Bi4,-2.92247279,0.17993962722221912 -Sb1Pd1_187_15482.vasp,SbPd,-1.050690425,0.9538775183333335 -Sr2C2O6_10_17161.vasp,Sr2C2O6,-5.5033387320000005,0.33493405299999957 -Cd2Ag2Te2F2_26_3451.vasp,Cd2Ag2Te2F2,-0.15979009375,0.03607097437500009 -H4Au4S4F4_2_7064.vasp,H4Au4S4F4,-1.71648919125,0.36177571624999993 -In2O2_129_8511.vasp,In2O2,-2.985768165,0.5945510325000001 -Ge1S1_123_6696.vasp,GeS,-2.665683,-0.41453514625 -Co2Sb4Cl4O6_11_4012.vasp,Co2Sb4Cl4O6,-3.14128520625,-0.0053768317708364766 -As2S2_12_1293.vasp,As2S2,-2.67459699,0.3353029784374999 -Tl2O2_187_19468.vasp,Tl2O2,-2.0084799825,0.39944520729166433 -Fe1Sn2C6N6_164_5761.vasp,FeSn2C6N6,-5.960617261333334,-0.4347892268333371 -Mo2F8_7_11609.vasp,Mo2F8,-3.055303962,-0.24781923983333587 -Sb2H6Pb2N2O6_7_15586.vasp,Sb2H6Pb2N2O6,-4.0304936188888885,0.06768564388888554 -Rh1Br2_164_15144.vasp,RhBr2,-0.88190167,0.40534464111111 -Mo4C3S2_164_11738.vasp,Mo4C3S2,-4.9032551699999996,0.2308315094444402 -Te4Au2Cl2_51_18568.vasp,Te4Au2Cl2,-0.58033597625,0.13427099625000005 -Na1Co1Te6P2_149_11850.vasp,NaCoTe6P2,-1.897593922,0.3902552794999988 -H8Au2C8I2_1_7090.vasp,H8Au2C8I2,-4.3298904305,0.25522075725000093 -V3Br8_156_20247.vasp,V3Br8,-1.6567466563636364,0.06000113454545297 -In2Se4_164_8595.vasp,In2Se4,-1.296339905,0.7419260422222203 -K4P4H8O16_13_9491.vasp,K4P4H8O16,-4.5980420084375,0.11406966734374979 -Zr1Mn1Cl2O2_1_21319.vasp,ZrMnCl2O2,-4.1166102,0.37278565333333313 -Li1Fe1Sb2O6_5_9698.vasp,LiFeSb2O6,-3.9004551560000005,0.45019424174999534 -Rb2Hg2Pd1Br8_12_14862.vasp,Rb2Hg2PdBr8,-0.2501907569230769,0.09634411461538467 -Ta2N1F2_164_17779.vasp,Ta2NF2,-5.93543384,0.5911068114666667 -Ca1Sb2O5_38_2876.vasp,CaSb2O5,-4.095945515,0.4070430857499996 -Ta1Cr1I2N1_8_17535.vasp,TaCrI2N,-3.7063247959999996,0.48409593799999673 -Tl2Cu6S4_12_19406.vasp,Tl2Cu6S4,-0.8925172675,0.038135134166666695 -Ru1S2_187_15293.vasp,RuS2,-3.146074293333333,0.46866923500000013 -Ga1Ag1Se2_1_6129.vasp,GaAgSe2,-1.3722265525,0.2715219875000001 -Sc1O2_164_15970.vasp,ScO2,-5.3807278033333334,0.6835119924999953 -Bi1P2Au1S6_143_2354.vasp,BiP2AuS6,-2.631694531,0.0736551087499977 -Sr2Sb4S8_11_17313.vasp,Sr2Sb4S8,-2.835009167857143,-0.38515747678571666 -W1Br5_47_20424.vasp,WBr5,-1.15271286,0.3319784499305556 -Ni2O4F2_11_13550.vasp,Ni2O4F2,-2.0481060325,0.14412227296875035 -Ti2C2Cl2_59_18916.vasp,Ti2C2Cl2,-5.245885501666667,0.7310638966666603 -Cr1F2_187_4170.vasp,CrF2,-2.8326751233333334,0.4529719899999971 -Na1Cd1Br2O1_1_11839.vasp,NaCdBr2O,-0.963356424,0.3606403701249974 -Y2H2N1O2_164_20740.vasp,Y2H2NO2,-5.89615623,-1.0396260911607227 -Ba2Zn2F8_31_2090.vasp,Ba2Zn2F8,-2.5802618041666667,0.17254760535714064 -U4Te3O4_123_19741.vasp,U4Te3O4,-6.667567596363637,0.018500791287866747 -Cr2Sb2S6_162_4482.vasp,Cr2Sb2S6,-2.839913092,0.32515701016666443 -V1O2_187_19894.vasp,VO2,-5.388874653333333,0.28906442166666757 -Cr1Cu1Se2Br2_1_4157.vasp,CrCuSe2Br2,-1.3176142966666666,0.03915578481481358 -Tl2In2S6_31_19449.vasp,Tl2In2S6,-1.985543532,0.20837584112499752 -Cu2Cl4_14_5086.vasp,Cu2Cl4,-0.35937412166666666,0.12978098166666663 -Al1Cu1Ni1Se4I1_1_640.vasp,AlCuNiSe4I,-1.3497349275,-0.06980436179687488 -B1Br3_189_1619.vasp,BBr3,-1.823174365,0.08595353874999989 -Sb2Pt3Se8_164_15665.vasp,Sb2Pt3Se8,-1.920567603076923,0.3944304876923056 -Mn3Co1Ni2S7Cl7_1_11370.vasp,Mn3CoNi2S7Cl7,-1.7987973920000002,0.16410547978124568 -V4P8S26_2_20352.vasp,V4P8S26,-3.338355713421053,0.06245162210525912 -V1I1F1_156_19865.vasp,VIF,-2.0061277933333335,0.18303172166666248 -K2C6O6F6_4_9037.vasp,K2C6O6F6,-4.643947537,0.07936706999999438 -K2C2S2Cl6O6_1_9019.vasp,K2C2S2Cl6O6,-3.178755247222222,0.1708534791666642 -Mn2Sb4O4F16_2_11262.vasp,Mn2Sb4O4F16,-2.896565741153846,0.07778445489010355 -V4Te6_2_20377.vasp,V4Te6,-2.477608304,0.07072571200000022 -Pb2W2O8_2_14299.vasp,Pb2W2O8,-5.2381433091666665,0.12285669999999982 -Cr1H1S2_156_4184.vasp,CrHS2,-3.0328213975,0.7713284412500001 -Mn2Te2F2_59_11296.vasp,Mn2Te2F2,-2.063865385,0.22870470499999984 -Co2Br6_191_3879.vasp,Co2Br6,-0.42536275375,0.51149597875 -B1Mo2Se2_164_1628.vasp,BMo2Se2,-3.7385149120000003,0.08958285000000021 -P4O8_31_14092.vasp,P4O8,-5.2893763125,0.10418385983333012 -Ca1Al1I2O2_1_2799.vasp,CaAlI2O2,-3.297208933333333,0.2964497924315405 -Ta2Ni1Ru1Se6_1_17790.vasp,Ta2NiRuSe6,-3.5278062439999998,0.181598138249997 -V2Co1O6_12_20042.vasp,V2CoO6,-4.77522712,0.3489431961111005 -Sb2Au2Se4_26_15546.vasp,Sb2Au2Se4,-1.25853734625,0.5747243550000003 -H24Pb2C8S8N4O16_2_6985.vasp,H24Pb2C8S8N4O16,-4.498270583870968,0.2079583902284899 -Zr1Sb2H2S6_164_21424.vasp,ZrSb2H2S6,-2.852127168181818,0.6126171190909022 -Sc1Ag1Te6P2_149_15896.vasp,ScAgTe6P2,-1.9524903210000002,0.26214160053029806 -Ir2C8_67_8773.vasp,Ir2C8,-5.190929602,2.3443745060000007 -Ni2Te2O6_12_13663.vasp,Ni2Te2O6,-3.135234227,-0.21295055925000161 -Ge2As1O6_162_6726.vasp,Ge2AsO6,-4.4919922522222215,0.24233992840277407 -Hf4Te1Se7_1_7819.vasp,Hf4TeSe7,-4.30217814,0.30512174791666763 -H2W2C1O2_164_7031.vasp,H2W2CO2,-5.204712555714286,0.5388692401311823 -Ni2Sb2Cl2O4_10_13605.vasp,Ni2Sb2Cl2O4,-2.606770265,0.2749244532499988 -Mn2Bi2O4F2_26_11005.vasp,Mn2Bi2O4F2,-3.450692287,0.06725312699999941 -Ag2S2Br2N2_31_375.vasp,Ag2S2Br2N2,-1.71185674125,0.2780390517187501 -Pt2N4_2_14640.vasp,Pt2N4,-3.361424055,1.4516756733333291 -Cu1I2_164_4909.vasp,CuI2,0.3905750966666666,0.19307750597222234 -La2I6_59_9598.vasp,La2I6,-1.81432304375,0.08243066875000005 -W2S4_127_20537.vasp,W2S4,-3.168586318333333,1.3040123316666672 -Mn2Al2S5_164_10955.vasp,Mn2Al2S5,-3.3164643566666667,-0.046184952777777566 -Li4P4S8_29_10216.vasp,Li4P4S8,-3.34513452125,0.0004011776204430606 -As6H2S12_4_1383.vasp,As6H2S12,-2.802942914,0.5832472551874999 -Sb6Pb6_12_15854.vasp,Sb6Pb6,-1.2474455391666666,0.5584310570833334 -Ni3Sb6_157_13720.vasp,Ni3Sb6,-1.2349893166666666,-0.6965271083333332 -Co2Te4Pd4_49_4047.vasp,Co2Te4Pd4,-1.313460453,-0.0966461474444471 -Zn1O1F1_156_20982.vasp,ZnOF,-1.4831197166666668,0.6088335722916636 -Sr1Au2F12_115_17025.vasp,SrAu2F12,-1.2205214893333334,0.014826838666666564 -Si2F6_1_16402.vasp,Si2F6,-3.6485652025,0.14793013531250002 -Cu4Br4O4_14_5400.vasp,Cu4Br4O4,-1.14089347,0.2312806587499986 -Sr4P4H4S8_14_17458.vasp,Sr4P4H4S8,-3.16300984,0.2457026279999932 -Cr1Sb2Au1Se6_149_4256.vasp,CrSb2AuSe6,-1.849396896,0.2960827594999995 -Sc1Se1Br1O1_1_15996.vasp,ScSeBrO,-3.61230867,0.5195116108333334 -Mn2Au1F6_8_10988.vasp,Mn2AuF6,-1.9899920622222222,0.2601153266666647 -Ba2Br2Cl2_11_1924.vasp,Ba2Br2Cl2,-2.20577793,0.26519960666666664 -Cd1H2S2_12_3339.vasp,CdH2S2,-2.099770998,0.1359164580000003 -Ag4C2O6_11_507.vasp,Ag4C2O6,-3.3608285633333335,0.18843721166666683 -V1W1Se1I1Cl2_8_19957.vasp,VWSeICl2,-2.194701176666667,0.4636427016666632 -Sr2Tb2F12_51_17322.vasp,Sr2Tb2F12,-3.42074101,0.3440367410937504 -Sc1Cu1Sb2Te6_149_15930.vasp,ScCuSb2Te6,-1.558681964,0.32647554258333167 -Sn2Ge1Cl2O5_1_16770.vasp,Sn2GeCl2O5,-3.5474450230000003,0.21581100299999534 -B8_65_1796.vasp,B8,-5.532729395,0.6282559033333337 -Mo1F2_115_11509.vasp,MoF2,-2.6142923533333335,0.4800985649999969 -Mn2I6_12_11118.vasp,Mn2I6,-0.311656475,0.13892964671875002 -Mn2S2I2_59_11217.vasp,Mn2S2I2,-1.8168917033333332,0.22746654458333349 -Co2As2O7_1_3842.vasp,Co2As2O7,-3.8567350972727272,0.34101582329545055 -Cu2Te4_6_5358.vasp,Cu2Te4,-0.6604300633333333,0.2418188788888881 -Bi2S3_164_2520.vasp,Bi2S3,-2.449370772,-0.9959488750000001 -K4Hg2S4_28_9463.vasp,K4Hg2S4,-0.7214400280000001,0.26630949849999996 -Hg3B2O6_150_8050.vasp,Hg3B2O6,-3.366216413636364,0.19514215590909068 -V2Sb2S6_157_20172.vasp,V2Sb2S6,-3.069721252,0.3226113865000002 -Mn3B2H2_187_11355.vasp,Mn3B2H2,-3.3972729857142854,0.6304963053571353 -Rb2P30_2_14916.vasp,Rb2P30,-3.8373599515625,-0.007697413854169666 -Eu1Re2O8_147_5593.vasp,EuRe2O8,-5.908079843636363,-0.2997852472916698 -Ba2Rh1_123_2049.vasp,Ba2Rh,-0.5069515066666667,0.2661370511111103 -Tc4Se8_2_18256.vasp,Tc4Se8,-4.481319526666667,0.06695654416666663 -Si6As2_191_16523.vasp,Si6As2,-3.1099522,0.32211361041666686 -Ag2Pd1O2_47_368.vasp,Ag2PdO2,-1.336256144,0.16596543100000005 -Na6O3_157_12443.vasp,Na6O3,-2.388068677777778,0.0962680922222221 -Tl1In1S2_1_19301.vasp,TlInS2,-1.6474800025,0.4404480140625 -Ga2N2Cl2_59_6395.vasp,Ga2N2Cl2,-3.0300811233333333,0.5302037624999965 -Ge1Os1S2I4_1_6686.vasp,GeOsS2I4,-1.47414575625,0.51072700453125 -Fe2Sb2Se4Cl2_26_5959.vasp,Fe2Sb2Se4Cl2,-1.904832618,0.17024083299999793 -Hf2Ge2Se2_129_7497.vasp,Hf2Ge2Se2,-4.543367651666666,0.11171307583333379 -Ga2Se2Br14_7_6465.vasp,Ga2Se2Br14,-0.7092672733333333,0.09221023666666606 -Bi2Pt1S1I1Br1_1_2505.vasp,Bi2PtSIBr,-1.3507413433333333,0.12948789011110584 -Ag4Sb4S8_7_556.vasp,Ag4Sb4S8,-1.695465624375,0.24072711062500018 -Tl2Bi2P4S12_4_19373.vasp,Tl2Bi2P4S12,-2.8305068775,0.09363733150000586 -Sr4Fe2S6Cl2_129_17438.vasp,Sr4Fe2S6Cl2,-2.668809743571429,-0.1763024517857188 -Cr2Cl4_14_4353.vasp,Cr2Cl4,-2.1934316983333333,-0.11853141722222404 -Bi4Au3Br20_2_2593.vasp,Bi4Au3Br20,-0.35505989851851855,0.17545317578703679 -Zr1Sc1Cl2O2_1_21431.vasp,ZrScCl2O2,-4.7289586266666666,0.3548535133333304 -Co1F2_187_3735.vasp,CoF2,-1.5799281433333334,0.7347964191666665 -Na2Pt4Se6_164_12271.vasp,Na2Pt4Se6,-2.0392793758333334,0.13753164958333297 -Zn2As4S6Cl4_31_21035.vasp,Zn2As4S6Cl4,-1.930353074375,0.49439298898437506 -Zr2C2I2_59_21545.vasp,Zr2C2I2,-4.276337963333334,0.32840377261904097 -Mn2Se2_129_11283.vasp,Mn2Se2,-2.303140585,-0.014686933706898664 -Zr1Fe1Cl6_149_21288.vasp,ZrFeCl6,-2.3277238425,0.0608391199999998 -Zr4O8_11_21838.vasp,Zr4O8,-6.154257216666667,1.0287319266666666 -Re2Br6_189_15035.vasp,Re2Br6,-907.0922118775,-904.8393368679166 -Mn2H2O2_59_11092.vasp,Mn2H2O2,-3.5248882266666666,0.8120929321264343 -Mn1Ge1H1Ir1O6_1_10735.vasp,MnGeHIrO6,-4.4097835750000005,0.3047367212499912 -Zr1Pt1Se1Br3Cl2_1_21408.vasp,ZrPtSeBr3Cl2,-1.83700175125,0.23600272999999988 -Ga4P20_26_6559.vasp,Ga4P20,-3.60293413125,-0.19109514791666937 -Ti2Au2_129_18882.vasp,Ti2Au2,-2.729090145,0.08405004750000034 -Ir2Cl6_162_8779.vasp,Ir2Cl6,-1.6209092875,0.06313801624999993 -V1Te2Mo1S2_1_19939.vasp,VTe2MoS2,-2.7297735333333333,0.32217218284721916 -K1_123_8963.vasp,K,1.54447723,0.30971616999999996 -P2Cl6_12_13968.vasp,P2Cl6,-1.5293155825,0.26194930999999855 -Ce1Mg2_187_3647.vasp,CeMg2,-0.4257827733333333,0.5969412316666658 -Zn2H4S2O8_7_21099.vasp,Zn2H4S2O8,-3.74633647125,0.09014343233854252 -Ag2Te4Br2_1_476.vasp,Ag2Te4Br2,-0.49021552375,0.15069558437499997 -Sm1Ge5_47_16556.vasp,SmGe5,-2.934684406666667,-0.10108238611111409 -V3N2O2_187_20282.vasp,V3N2O2,-5.926764042857143,0.048968694999994344 -Tl1Ge1Te3_143_19280.vasp,TlGeTe3,-1.1316899839999999,0.3173326804583321 -Li1Sb2Te6Pd1_149_9785.vasp,LiSb2Te6Pd,-1.499426804,-0.1417952626666684 -K4Sb4O8_14_9508.vasp,K4Sb4O8,-3.455562658125,0.194279168125 -Mo2H4O8_31_11616.vasp,Mo2H4O8,-4.710505572857143,0.06514115154761413 -Ba3In2Br2O5_123_2112.vasp,Ba3In2Br2O5,-3.659444118333333,0.04985273783332633 -Te6As2P2_8_18642.vasp,Te6As2P2,-1.964680858,0.3727917714999987 -Fe1H4C6Br2_47_5702.vasp,FeH4C6Br2,-4.637908661538462,0.41413272346152996 -Sn1O2_187_16662.vasp,SnO2,-3.6929427533333334,0.6682765416666663 -Ti1W1I1Br1_8_18870.vasp,TiWIBr,-3.0417397,0.42380259031249556 -In1H2S2_12_8270.vasp,InH2S2,-2.621248,0.5757851242499954 -Tl2Pb2I6_51_19485.vasp,Tl2Pb2I6,-0.47362298799999997,0.13396559466666685 -Cs2Cd4Te2S6I6_31_4706.vasp,Cs2Cd4Te2S6I6,-0.629963256,0.20373213687499803 -Tl1Ag1Se3Br1_1_19209.vasp,TlAgSe3Br,-0.8285794616666666,-0.08052887194444602 -Na4Cd2Br8_11_12376.vasp,Na4Cd2Br8,-0.8177039021428572,0.16049952571428527 -In1Se2_156_8345.vasp,InSe2,-1.6191233333333335,0.41914261388888674 -Y1Si3_187_20675.vasp,YSi3,-3.52873523,0.522488131666663 -Na6H12S4N2O20_26_12437.vasp,Na6H12S4N2O20,-4.2036657625,0.1413279261552857 -Pt4Pb12_127_14705.vasp,Pt4Pb12,-1.146663181875,0.42722572287500016 -Cr1B4S6F5_2_4123.vasp,CrB4S6F5,-3.213176908125,0.6912156213932256 -Sn2P2H6C2O6_7_16813.vasp,Sn2P2H6C2O6,-4.824652068888889,0.015855182333317147 -Zn1Fe1Br2F2_1_20926.vasp,ZnFeBr2F2,-1.225145415,0.23011699520833329 -Hg1O2_187_7889.vasp,HgO2,-0.5659161433333334,1.0670353676388875 -W2S6_59_20539.vasp,W2S6,-3.77253476875,0.23638541859375017 -Ba2Fe2S2_129_1982.vasp,Ba2Fe2S2,-1.6510072733333334,1.3375523382291639 -Co2Sb2Te4Br2_10_4007.vasp,Co2Sb2Te4Br2,-1.362914613,0.3424450649333317 -Pt2S4_14_14669.vasp,Pt2S4,-2.546267176666667,0.09887754333333287 -Ca1C6_183_2816.vasp,CaC6,-6.8274345499999995,0.16290629928571487 -Fe2S2_164_5937.vasp,Fe2S2,-1.9699038,0.011861279999999974 -Sb4Pb3_5_15802.vasp,Sb4Pb3,-1.4322249599999999,0.4418931328571414 -Ca1H2O2_164_2844.vasp,CaH2O2,-4.43923439,0.08122330399999989 -Au4Cl4O4_14_1570.vasp,Au4Cl4O4,-0.8860921341666667,0.21582510361111107 -Mn2C1F2_164_11038.vasp,Mn2CF2,-3.541230606,0.19963490599999356 -Sc1Pt1Br2N1O1_1_15984.vasp,ScPtBr2NO,-3.07854841,0.6901816589583287 -Dy4Te10O26_2_5540.vasp,Dy4Te10O26,-4.4350009319999995,0.0743005185000003 -In1C1_187_8214.vasp,InC,-2.46130898,2.862150285 -Ag2P4Se3I2_6_366.vasp,Ag2P4Se3I2,-1.7793488581818182,0.13607984482954105 -Cu2Hg2Se2Cl2_26_5159.vasp,Cu2Hg2Se2Cl2,-0.0814315775,-0.09737044173611079 -Ca1F2_164_2832.vasp,CaF2,-3.5843762433333333,0.25937205333333324 -Na2Cd4S8I6_31_12035.vasp,Na2Cd4S8I6,-0.814470888,0.07099916422916752 -Ca2H8O4F4_53_3041.vasp,Ca2H8O4F4,-4.046679436111111,0.10537747074073733 -Au1Cl1_156_1418.vasp,AuCl,0.532058735,0.38329199125 -As4O6_4_1334.vasp,As4O6,-4.407087521999999,0.07815005000000053 -Nb3N2O2_187_12988.vasp,Nb3N2O2,-7.256660699999999,0.023083354107137133 -Fe1H4C2I2N6_6_5693.vasp,FeH4C2I2N6,-4.27536972,0.2411300367222109 -Sb2F6_31_15579.vasp,Sb2F6,-2.7296182425,0.3865151725000002 -K4Zn1As2_164_9532.vasp,K4ZnAs2,-0.3388375671428571,0.09427484428571431 -Ag2H12C6S2N4_2_266.vasp,Ag2H12C6S2N4,-4.643929817307693,0.19702908096152627 -Y4N3O2_164_20832.vasp,Y4N3O2,-7.098038848888889,-0.02448707944445161 -Ta2Te2Cl2_59_17901.vasp,Ta2Te2Cl2,-3.565526541666667,0.19787927604166322 -K2H2O2_11_9125.vasp,K2H2O2,-3.142962198333333,0.06834683499999983 -Hg6Te4Se2O20_4_8101.vasp,Hg6Te4Se2O20,-2.5298403875,0.0883409934765621 -Mn2As2N2O10_31_10968.vasp,Mn2As2N2O10,-4.4559009225,0.10395441710069003 -Ta2Co4Se6_11_17710.vasp,Ta2Co4Se6,-3.1622637175,0.1938035662499975 -Al2S2I2_59_941.vasp,Al2S2I2,-2.4345394666666667,0.0792042959722199 -Ba1Br2_164_1813.vasp,BaBr2,-1.9709313566666669,0.24682833333333298 -Pd2F2_129_14420.vasp,Pd2F2,-0.5585583875,0.9313652362499999 -In2Se3_1_8593.vasp,In2Se3,-1.9632366780000001,0.02108474799999982 -P2Cl8_1_13971.vasp,P2Cl8,-1.457390645,0.0835075247499969 -In2Sb4S8Cl2_11_8571.vasp,In2Sb4S8Cl2,-2.40999222125,0.13184108687500018 -Hg8Te4Br12_14_8112.vasp,Hg8Te4Br12,0.37096086,0.12036252749999998 -K4Ru2Br12_31_9499.vasp,K4Ru2Br12,-0.9756840855555556,0.1025866116666666 -Er2P6O12_10_5566.vasp,Er2P6O12,-5.4921991304999995,0.37613101850000036 -Ta2Ni2Te10_51_17798.vasp,Ta2Ni2Te10,-2.1298808135714284,0.07816597928571412 -Fe2Ni2As2_129_5886.vasp,Fe2Ni2As2,-0.7595948149999999,3.280148602575751 -Ba1Cr2N2O8_164_1821.vasp,BaCr2N2O8,-4.348685659230769,0.6525519602472377 -Nb2B1Cl2_164_12627.vasp,Nb2BCl2,-4.803513402,0.04350684399998839 -Sn2S1I2O3_1_16834.vasp,Sn2SI2O3,-2.630189675,0.2333515858398436 -Ni1P1_187_13389.vasp,NiP,-1.00158484,1.2762055702083335 -Cd2Sb4Se6Br4_11_3566.vasp,Cd2Sb4Se6Br4,-1.374780415625,0.10907366812499997 -Eu1Ge3_187_5588.vasp,EuGe3,-2.5371843675,-1.1483041412500001 -Al1Pt5Br2_38_714.vasp,AlPt5Br2,-1.61366946625,0.6948132645833308 -Ge2N2_164_6787.vasp,Ge2N2,-4.919247135,-0.011803732499999775 -V1Ag1Se2_156_19762.vasp,VAgSe2,-1.885180835,0.2939287374999995 -V1H4C4Cl1O6_2_19852.vasp,VH4C4ClO6,-5.14760399125,0.17881266950230323 -Te1Ir1Au2Se2S1_1_18292.vasp,TeIrAu2Se2S,-1.1528497385714285,0.4150440945663231 -Cu3Te1Pb1O8_35_5392.vasp,Cu3TePbO8,-2.7351399246153845,0.37920254884614857 -Ba2Co2Ge2_129_1954.vasp,Ba2Co2Ge2,-1.86554341,0.20450116333333157 -Cr2Cu2Te12P4_13_4376.vasp,Cr2Cu2Te12P4,-1.720275456,0.44218788583333335 -Ba3As3_25_2095.vasp,Ba3As3,-1.7976432233333333,0.9761808150000004 -Sn4Te4_57_16976.vasp,Sn4Te4,-1.3469687125,-1.3112407325 -B2As6_164_1649.vasp,B2As6,-3.4400496025,0.5589740331249957 -Fe1Ir1Pd1S1Br3Cl1_1_5718.vasp,FeIrPdSBr3Cl,-1.16202076,0.40782742361978763 -Bi2S2Cl2_59_2511.vasp,Bi2S2Cl2,-1.9498933,0.07838087083333334 -Bi6B2_164_2663.vasp,Bi6B2,-1.62427560625,0.26612171458333345 -Sn4As8_26_16936.vasp,Sn4As8,-2.5122106158333333,0.13411947249999723 -P2Pt2Se6_12_14033.vasp,P2Pt2Se6,-2.372468075,0.5094068363333312 -Sb1Se1Br1_156_15497.vasp,SbSeBr,-1.7354914433333333,0.09632153916666675 -Sn1P1O4_111_16663.vasp,SnPO4,-4.746898126666667,0.34805473340277254 -Te2Pt2Cl2_59_18482.vasp,Te2Pt2Cl2,-1.4494538283333334,-0.18558562666666667 -Ti2Cl2_129_18923.vasp,Ti2Cl2,-3.9057369025,0.677860715625 -Si1B1F2_156_16317.vasp,SiBF2,-3.98086216,0.45081049416666313 -Te2Rh4_2_18508.vasp,Te2Rh4,-1.9543854666666667,0.3869446024999974 -Fe2I8_14_5868.vasp,Fe2I8,-0.026350917,0.0978869288750004 -Re4S8_38_15115.vasp,Re4S8,-4.672375158333334,0.26769566583333315 -Ag1Ge1Cl2_6_55.vasp,AgGeCl2,-1.0530724975,0.2397739557812483 -Co2P1Se2_187_3955.vasp,Co2PSe2,-2.7049389560000003,0.1194599302222219 -Y1Ge3_25_20636.vasp,YGe3,-3.4283855575,0.18394433708333047 -Ca1Se2_115_2879.vasp,CaSe2,-1.6437288666666667,0.7258768394444423 -Na2F2_129_12075.vasp,Na2F2,-2.6559932275,-0.4588139475000004 -Fe2Mo2S2O12_8_5874.vasp,Fe2Mo2S2O12,-4.353539179444444,0.22949268673610468 -K2S2F2_1_9328.vasp,K2S2F2,-1.5548627233333334,0.3027303864583315 -K2Hg4S6I6O2_31_9180.vasp,K2Hg4S6I6O2,-0.5991093345,0.322329047541665 -Cd3Cu1_191_3613.vasp,Cd3Cu,2.470917575,0.7584222137500003 -K4Si2As4_49_9514.vasp,K4Si2As4,-1.997172338,0.13752903299999986 -Hg1Pb2Br2O2_12_7895.vasp,HgPb2Br2O2,-1.7258243228571428,0.10199057285714286 -Sr3Fe2Cl2O4_123_17374.vasp,Sr3Fe2Cl2O4,-3.497758206363636,0.08067412762626 -Yb2Cu3Te4Cl4O12_2_20871.vasp,Yb2Cu3Te4Cl4O12,-3.4033106859999998,-0.06774627525000304 -Ca2C2O6F2_59_2968.vasp,Ca2C2O6F2,-4.982194203333333,0.2482748967708287 -K2C2Se2N2_31_9027.vasp,K2C2Se2N2,-4.1903569225,0.09745517583332697 -Nb2Cr2Se10_11_12704.vasp,Nb2Cr2Se10,-3.249942692857143,0.07192187642856807 -Hf2I2N2_59_7516.vasp,Hf2I2N2,-5.624026703333333,0.038711911666666765 -Ge2Se2Br2_59_6865.vasp,Ge2Se2Br2,-1.967606505,0.15684597361111097 -Sm2I2F2_129_16574.vasp,Sm2I2F2,-2.854159095,0.27133446180555243 -Sc2Se5O13_1_16163.vasp,Sc2Se5O13,-4.3011208475,0.059312201750000515 -Na1H5C5N2O5_1_11876.vasp,NaH5C5N2O5,-5.56874406,0.10999781212704576 -Te8I4_31_18695.vasp,Te8I4,-0.7046806433333334,-0.9492612729166667 -Tl2Se1S1Cl2_1_19524.vasp,Tl2SeSCl2,-1.040119065,0.399191700451385 -Rh4Se8_2_15254.vasp,Rh4Se8,-2.3587776875,0.31489281916666645 -Tl2Sb2Se6_143_19521.vasp,Tl2Sb2Se6,-1.6011008690000001,0.39209459166666444 -Si3Bi2O9_174_16466.vasp,Si3Bi2O9,-5.3146043249999995,0.23404831660713876 -W2Se2_12_20549.vasp,W2Se2,-4.140316875,0.15765519500000025 -Te6P2Ir2_162_18665.vasp,Te6P2Ir2,-2.395569064,0.48495971705555385 -Cr1Mo1H6_2_4211.vasp,CrMoH6,-2.727248665,2.21334855875 -Ga1H2_115_6200.vasp,GaH2,-2.2974962766666667,1.2846432066666635 -Cr2H2N1O2_164_4397.vasp,Cr2H2NO2,-4.573215314285714,0.12076896309522467 -Al1I2_164_674.vasp,AlI2,-0.8495097399999999,0.29253814833333236 -Fe3B2H2O2_187_6043.vasp,Fe3B2H2O2,-3.5942694744444443,0.19611392444444148 -K2Mo6P4O28_11_9246.vasp,K2Mo6P4O28,-5.1769176285,0.06016729899999973 -P1Cl5_47_13918.vasp,PCl5,-0.9136242616666667,0.46036275958333206 -Ni2Te6As2_162_13681.vasp,Ni2Te6As2,-1.22627627,0.2647752844166653 -Nb4Pt6S10_59_13132.vasp,Nb4Pt6S10,-3.587248382,0.3020049426666602 -Nb2C1S2_164_12664.vasp,Nb2CS2,-6.1177749519999995,-0.3403871496666735 -Yb2Cl6_162_20867.vasp,Yb2Cl6,-2.8953790775,-1.0172518593749997 -Sr2Ce2I8_13_17177.vasp,Sr2Ce2I8,-1.4761651383333334,0.09059682944444436 -Ca4Mn2S6Cl2_129_3225.vasp,Ca4Mn2S6Cl2,-2.7601515078571426,0.06528492749999781 -Pb2Cl4O8_125_14239.vasp,Pb2Cl4O8,-2.305773050714286,0.16372871071428352 -In1Cu1S2I4_1_8234.vasp,InCuS2I4,-0.59282999625,0.24922644984375003 -Cs2H6C2Se2O6_4_4717.vasp,Cs2H6C2Se2O6,-3.8393632150000006,0.4658968764444285 -Ta2Te2N1_164_17904.vasp,Ta2Te2N,-5.459550746,0.2837412460000013 -Np2Se6_11_13785.vasp,Np2Se6,-4.51608106125,0.06264047374999926 -Na1I1_123_11877.vasp,NaI,-0.99332549,-0.40095299500000003 -Ag2Sb4Te3Br2_6_418.vasp,Ag2Sb4Te3Br2,-0.9972116854545454,0.29538278999999856 -Rb2Ru2S2N2Cl10_11_14930.vasp,Rb2Ru2S2N2Cl10,-2.101373233888889,0.08721678111110513 -Hf1Ti1Cl6_5_7329.vasp,HfTiCl6,-3.23411957375,0.1344844924999964 -Pb1F4_99_14186.vasp,PbF4,-1.3820218,0.549763532 -Ga1Se2_115_6275.vasp,GaSe2,-2.1227448133333335,0.3094131655555532 -Te2Pb2I2_59_18453.vasp,Te2Pb2I2,-0.8204620216666667,-0.21850057083333435 -Co4Te2Cl4O6_11_4089.vasp,Co4Te2Cl4O6,-2.718540773125,-0.07066743039062517 -Hg3Au1_191_8049.vasp,Hg3Au,2.4707800175,1.0040165453448278 -K2Zr1H6O6_147_9396.vasp,K2ZrH6O6,-4.403875028,0.09420081866666719 -Zr1Co1F6_5_21280.vasp,ZrCoF6,-3.50546201375,0.1295698350000003 -Sb2Pt3S8_164_15664.vasp,Sb2Pt3S8,-2.4088451569230767,0.2876002586153824 -Fe4N3_164_6084.vasp,Fe4N3,-3.205328482857143,0.5743003932142833 -Bi1H1S2O6_1_2333.vasp,BiHS2O6,-4.111893879,0.08187393246874397 -Cd1In2O4_164_3375.vasp,CdIn2O4,-3.017945084285714,0.3111997139880933 -Al2H2O4_1_859.vasp,Al2H2O4,-5.2020663925,-0.509692656875 -Na2Nb2Br12_4_12224.vasp,Na2Nb2Br12,-1.78848090875,-0.2064594156250008 -Ni3P2H16O16_10_13706.vasp,Ni3P2H16O16,-4.242508515675675,-0.06543595585585937 -Te4Mo4Cl28O4_14_18597.vasp,Te4Mo4Cl28O4,-1.7167371880000002,0.05526761775 -Cs2Cl2F8_127_4708.vasp,Cs2Cl2F8,-1.1115402416666667,0.11315183750000002 -Nb9Se18_12_13211.vasp,Nb9Se18,-4.140830084814815,0.11503892268518534 -Mn2I2_129_11114.vasp,Mn2I2,-0.38978698,0.6705077844396552 -Sn2N2_156_16791.vasp,Sn2N2,-3.853855095,-2.39069152625 -Fe1Co3O8_164_5663.vasp,FeCo3O8,-3.6711351975,-0.3499473692187566 -Na2C6O6F6_4_12013.vasp,Na2C6O6F6,-4.7520298555,0.11523115449999399 -Y2Cl2O4_11_20717.vasp,Y2Cl2O4,-4.58667666375,0.5706778315625007 -Mo4H4O14_4_11747.vasp,Mo4H4O14,-4.812637180454545,0.09103741098484486 -Ge2P2H6C2S6_7_6805.vasp,Ge2P2H6C2S6,-3.902189315,0.03407425471352751 -Ag2Ge2O6_51_263.vasp,Ag2Ge2O6,-3.3157152869999997,0.16190506449999953 -Nb2Br2Cl4_1_12646.vasp,Nb2Br2Cl4,-2.73306704125,0.10607885296874975 -Sn2Hg1I2O2_12_16775.vasp,Sn2HgI2O2,-1.5924291657142857,0.2326526388752046 -Hf1Mn3Se1S4Cl3_1_7231.vasp,HfMn3SeS4Cl3,-2.998054696666667,0.07110327604165856 -Cs2Pr2Cl8O8_18_4767.vasp,Cs2Pr2Cl8O8,-2.4848464815,0.4219533786250005 -Ba2O8F4_125_2040.vasp,Ba2O8F4,-1.86840377,1.709494436428568 -Sr2P4O12_2_17295.vasp,Sr2P4O12,-5.454251962222222,0.17238389263888898 -Ti2B1S2_164_18890.vasp,Ti2BS2,-5.59633379,-0.03792523775000456 -Rh1N4Cl6_156_15158.vasp,RhN4Cl6,-1.6736190054545454,0.9243773802272686 -Ta4Fe4Te8_53_18042.vasp,Ta4Fe4Te8,-2.820731018125,0.1449148284027757 -Cu2C2S2F2_31_5067.vasp,Cu2C2S2F2,-2.61506503875,0.6240098489583331 -Hf1Zr1Te1Br1Cl2_1_7402.vasp,HfZrTeBrCl2,-2.946769945,0.15424534593749772 -Cs2Cd4S2O6F6_31_4689.vasp,Cs2Cd4S2O6F6,-2.218699423,0.21231200868750028 -Bi2Se1O2_99_2534.vasp,Bi2SeO2,-3.033843816,0.23929671333333058 -Si2S4_49_16438.vasp,Si2S4,-3.7576720466666664,0.12355050666666711 -Ni1Sn2C6N6_12_13426.vasp,NiSn2C6N6,-5.542985153999999,0.11833240022221704 -K1Re2O4F7_3_8932.vasp,KRe2O4F7,-3.990686002142857,0.03570401964285663 -Co1Se1Br2_25_3821.vasp,CoSeBr2,-1.00138277,0.4097726061666658 -As1Br3_187_1138.vasp,AsBr3,-0.733088715,0.43631000750000004 -Ni1Ge2C6N6_12_13320.vasp,NiGe2C6N6,-5.894180791333333,0.31425738372221224 -Hf3Ti1S8_6_7740.vasp,Hf3TiS8,-5.022183381666667,0.34146865499999923 -Al2Ge2Te2_164_851.vasp,Al2Ge2Te2,-2.602490305,0.04023963333333347 -Li4P2S8_59_10211.vasp,Li4P2S8,-3.0424459857142856,0.15107113229166458 -Hf2Te6P2_12_7644.vasp,Hf2Te6P2,-3.058117727,0.2889396539166658 -Te1Pb1_123_18321.vasp,TePb,-0.89193561,-0.9527027849999999 -Rb2C2S2O6F6_4_14789.vasp,Rb2C2S2O6F6,-3.7369608594444443,0.19308872777776942 -V3W1O8_25_20295.vasp,V3WO8,-5.602824059166667,0.2629075108333332 -Al2S3_164_947.vasp,Al2S3,-3.6337971920000003,0.10549656774999994 -W1S2_187_20451.vasp,WS2,-4.586394596666667,-0.11379594666666648 -Mg2As2O6_162_10422.vasp,Mg2As2O6,-4.179887618,0.4066188831111064 -Au1Se1I1Br1_1_1445.vasp,AuSeIBr,-0.0339012725,0.22179836603298597 -Hf2Sn2O6_147_7620.vasp,Hf2Sn2O6,-6.041024822,0.12612966999999342 -Se1O1_6_16283.vasp,SeO,-2.59921211,0.6178221827083333 -Si6Sb8_1_16545.vasp,Si6Sb8,-2.726903712142857,-0.1405157921428597 -Cr1B4H4O6F1_2_4117.vasp,CrB4H4O6F,-4.97286457875,0.5621298229513816 -Au2F2_2_1479.vasp,Au2F2,-0.108197355,0.8657148805555546 -Cu4H8C2O10_4_5421.vasp,Cu4H8C2O10,-3.8222736220833333,0.42385505524305334 -In2As2O6_149_8373.vasp,In2As2O6,-3.811107972,0.45087980012500006 -Zr1Te1O1_156_21461.vasp,ZrTeO,-4.787063186666667,0.4094146433333332 -Nb3H2C2_187_12975.vasp,Nb3H2C2,-6.240324165714285,0.1504391710204036 -Hf3B2H2_187_7681.vasp,Hf3B2H2,-5.500811805714286,0.22979149428570889 -Co1H4C8Cl2_25_3765.vasp,CoH4C8Cl2,-5.15521607,0.3571061943333277 -Si2I2N2_59_16407.vasp,Si2I2N2,-3.9027748083333336,-0.13800579583333583 -Te2Ir2_164_18398.vasp,Te2Ir2,-2.32150071,0.8139307850000002 -Sr4S16_14_17464.vasp,Sr4S16,-2.617733474,0.1479363636250004 -Al1Pb1S2Br2O1_1_706.vasp,AlPbS2Br2O,-2.2755233471428573,0.7002721898363076 -Cd1H4C6Br2_10_3353.vasp,CdH4C6Br2,-4.380599606923076,0.4786973278846085 -Ge2Sb2O6_7_6851.vasp,Ge2Sb2O6,-4.217580717,0.30929380258333106 -As6Pb4Br2O12_11_1386.vasp,As6Pb4Br2O12,-3.8365118341666666,0.05178981000000027 -Ta1Se1O1_156_17617.vasp,TaSeO,-5.700625093333334,0.2694653586666609 -Ag1Bi1Te6P2_143_29.vasp,AgBiTe6P2,-1.547747443,0.2945841125075736 -Si1O1_156_16354.vasp,SiO,-4.926976405,0.6279955425 -Na2I1_164_12179.vasp,Na2I,-0.5506487933333334,-0.04798255000000051 -K2Ag6Te4_12_8971.vasp,K2Ag6Te4,-0.12392283916666667,-0.24171265083333332 -Ca1Mg1Mn1Br2N1O1_8_2854.vasp,CaMgMnBr2NO,-3.0119719714285713,0.506727544285707 -Na2H6Pd1O6_147_12126.vasp,Na2H6PdO6,-3.7895395466666666,0.08860253400000051 -Zr1Nb1Sn1I1Cl1O3_8_21360.vasp,ZrNbSnIClO3,-4.414586565,0.19223174484374428 -Ru2O2F2_59_15328.vasp,Ru2O2F2,-3.5173900783333334,0.3404120016666632 -Tl1Cd1S2I1Br1_1_19240.vasp,TlCdS2IBr,-0.6828639416666666,0.2462181135937494 -Ba2Ag1Br2O2_123_1880.vasp,Ba2AgBr2O2,-2.615609612857143,0.021534366033156394 -Ta2S2Br4_25_17844.vasp,Ta2S2Br4,-3.27523952875,0.25042870886362945 -Sb1O2_164_15472.vasp,SbO2,-3.9170593,0.5010175670833332 -Cd2N2Cl6_11_3524.vasp,Cd2N2Cl6,-0.7460444350000001,0.6439973379999999 -K2Ag2Te2S6_39_8968.vasp,K2Ag2Te2S6,-1.5556438433333335,0.0986420424861088 -W2I2_164_20501.vasp,W2I2,-2.48839746,0.8189972472916667 -Li4Fe4F20_57_10188.vasp,Li4Fe4F20,-2.347808249285714,0.14293986142856907 -Rh2O2_164_15205.vasp,Rh2O2,-3.255936175,0.6125299587499998 -N4O6_4_11792.vasp,N4O6,-4.377598974,0.4085150904999959 -Nb1Ga1Te1Se1I2_8_12512.vasp,NbGaTeSeI2,-2.0550371133333334,-0.015062734236113595 -Li2H6Pd1S6_147_9951.vasp,Li2H6PdS6,-2.952111094,0.12006729816666678 -Ca1Sn1Te1Br1_99_2884.vasp,CaSnTeBr,-1.27471572,-0.45908695562500007 -Rb1V4O10_12_14764.vasp,RbV4O10,-5.309068524666667,0.06718814733333289 -Al2Sb2O6_162_953.vasp,Al2Sb2O6,-5.189273418,0.0012392347499998735 -Ge2O2_12_6794.vasp,Ge2O2,-4.3365207325,-0.12980266312500044 -K2Hg4Se2O6F6_31_9189.vasp,K2Hg4Se2O6F6,-1.6568900085,0.20652126400000004 -Ca2H12C4O14_2_3027.vasp,Ca2H12C4O14,-5.005993163125,0.08151563671875017 -Ni2Sb2Te4I2_10_13617.vasp,Ni2Sb2Te4I2,-0.7564411480000001,0.25068413942856926 -Te2C2_8_18382.vasp,Te2C2,-3.1477240725,1.6963315108333332 -Mn2Tl2Se5_156_11331.vasp,Mn2Tl2Se5,-1.6666887822222223,0.20976135234567728 -Co2Sb2Se4Cl2_10_4004.vasp,Co2Sb2Se4Cl2,-1.8814991849999998,0.3685687559999975 -Y2H2C1_164_20739.vasp,Y2H2C,-5.03714584,0.10879232799999494 -Sb8S4O8_2_15876.vasp,Sb8S4O8,-3.517088726,0.2559026256666639 -Nb1Te1S1_156_12597.vasp,NbTeS,-4.0328437599999996,0.1915647428240681 -Se2O4_59_16290.vasp,Se2O4,-2.638159228333333,0.8818903108333336 -Cu1B2C8N8_12_4842.vasp,CuB2C8N8,-6.510217166842105,0.5764957857017421 -Te1Mo2I1_8_18307.vasp,TeMo2I,-1.781990135,0.8163700702083334 -Mo1H2O2_164_11512.vasp,MoH2O2,-4.2769433800000005,0.4372785516666666 -Nb3Br7O1_156_12955.vasp,Nb3Br7O,-3.04198567,0.12200657404040077 -In1As1S1Cl1_1_8188.vasp,InAsSCl,-1.902738415,0.43231303124999787 -Zn2As2Se6_147_21028.vasp,Zn2As2Se6,-1.531635433,0.28217727133333115 -Ho1As2_21_8113.vasp,HoAs2,-2.8563107333333337,0.6272492766666629 -La2Tl4P4S14_2_9621.vasp,La2Tl4P4S14,-3.1714438145833337,0.0874404762499994 -V1Br1Cl1_156_19783.vasp,VBrCl,-1.93607145,0.11085113999999985 -Tl2B6S20_2_19370.vasp,Tl2B6S20,-3.336972364642857,0.16809977044642205 -Fe2H4C6O14_2_5859.vasp,Fe2H4C6O14,-5.275667333076924,0.17397596506409552 -Sn4Te4P4_17_16973.vasp,Sn4Te4P4,-2.1551121933333333,-0.7826282116666676 -Co2P2H12C12N2O6_2_3956.vasp,Co2P2H12C12N2O6,-5.512131016944444,0.19984296108332075 -Ag1F2_187_53.vasp,AgF2,-0.4041157733333333,0.4313207283333333 -Si1S1_156_16358.vasp,SiS,-3.46678743,0.1916667474999999 -Mo2O2F2_59_11643.vasp,Mo2O2F2,-4.071714078333334,0.13143393666666237 -Pb4S4_57_14319.vasp,Pb4S4,-2.0177834425,-1.3446499975 -V2Se2N1_164_20185.vasp,V2Se2N,-4.380933812,-0.013340387000000176 -Hf4Te3Se5_156_7820.vasp,Hf4Te3Se5,-4.231059926666666,0.13520321041666739 -Bi4Te4_14_2653.vasp,Bi4Te4,-1.13726630625,0.38257069374999997 -Sb8Ir4_2_15866.vasp,Sb8Ir4,-2.7742565066666667,0.4960270083333329 -Mg1Zn7O8_6_10414.vasp,MgZn7O8,-2.074637776875,0.3406717321874999 -Be2I4_2_2257.vasp,Be2I4,-1.1385683466666667,0.2857230249999998 -Rb1Sn1Te2_156_14755.vasp,RbSnTe2,-0.9196426125,-0.035528813125001085 -Nb2I10_51_12738.vasp,Nb2I10,-0.922796725,0.26213130333333345 -Ta4Ni2O10_59_18063.vasp,Ta4Ni2O10,-6.1155072925,0.3968790537500002 -Nb4Co2S10_59_13054.vasp,Nb4Co2S10,-4.293882803125,0.16077976453124238 -Te2Ir2_129_18396.vasp,Te2Ir2,-2.3268514925,0.8085800025000003 -Mn3Cd2O8_10_11368.vasp,Mn3Cd2O8,-3.356121820769231,0.2357132453846118 -Na3S2_164_12356.vasp,Na3S2,-1.899901126,0.24539740999999826 -Ge2Te6As2_147_6893.vasp,Ge2Te6As2,-1.9498675550000002,-0.15065474383333505 -V4O10_59_20344.vasp,V4O10,-5.497497987857143,-0.03891940571428609 -W1Cl5_47_20430.vasp,WCl5,-1.6677080666666668,0.3462066608333313 -Gd4Cl6_12_6630.vasp,Gd4Cl6,-2.768909994,0.09226274099999987 -Ni2Br2_164_13481.vasp,Ni2Br2,0.353137225,0.66446191 -Ag2_164_494.vasp,Ag2,1.18640598,0.463033115 -V1H8C10N2F3_16_19860.vasp,VH8C10N2F3,-5.6424060625,0.1391718633333232 -Cu2Ni1S3I2_8_5194.vasp,Cu2NiS3I2,-0.6761948975,0.28425046409722043 -In2H2Se2O8_11_8463.vasp,In2H2Se2O8,-3.875000005,0.06077109714285722 -Sn1Te2_164_16702.vasp,SnTe2,-1.30715998,-0.7594127411111116 -Dy2Zn2P2O2_164_5539.vasp,Dy2Zn2P2O2,-3.7246863175,0.14221526250000016 -S4I8N8_2_15398.vasp,S4I8N8,-2.396294557,0.1882742646250003 -Zn1Sn1S2Br1_1_21014.vasp,ZnSnS2Br,-1.403746546,0.20695548730000024 -In2H10C4Cl4_10_8455.vasp,In2H10C4Cl4,-3.4041253015,0.4449937510000005 -Li4V2F12_7_10239.vasp,Li4V2F12,-3.4560021316666667,0.13077349277777772 -As4S8_11_1367.vasp,As4S8,-2.6360362375,0.7331903361458303 -Ga2Se2F2_31_6471.vasp,Ga2Se2F2,-2.5311669533333334,0.09419615833333084 -V1Cu1P2S6_5_19814.vasp,VCuP2S6,-3.0600112630000003,0.06569677856249712 -Ir2Cl2_12_8776.vasp,Ir2Cl2,-1.7218735725,1.1378975966666642 -Hf1Ni1Ag1Mo1Se5S3_1_7243.vasp,HfNiAgMoSe5S3,-2.4934713491666667,0.17492428312500014 -Fe4B3O2F2_164_6074.vasp,Fe4B3O2F2,-2.6935469381818185,1.3145833591919076 -Nb2S2Br4_25_12835.vasp,Nb2S2Br4,-2.97372425,0.23024387590908613 -Ca6Ga2As6_26_3256.vasp,Ca6Ga2As6,-2.186412999285714,0.31615064964285766 -Li1Pt1F2_1_9779.vasp,LiPtF2,-2.0071604575,0.9082307071875001 -Mg3Bi3_25_10544.vasp,Mg3Bi3,-0.6271464483333333,0.17577226249999953 -Bi4O6_2_2622.vasp,Bi4O6,-3.6048025850000003,0.25319164299999963 -Zr2P2S6_12_21626.vasp,Zr2P2S6,-3.940978913,0.3390739873749964 -Cd2Ag2S2Br2_26_3441.vasp,Cd2Ag2S2Br2,-0.21428442625,0.152426300625 -V4Cu2H12N4O12_7_20319.vasp,V4Cu2H12N4O12,-4.655238507058823,0.07386407316175682 -W2F6_162_20494.vasp,W2F6,-3.57729090875,0.2974727559374999 -Hf2Zr2Te8_6_7673.vasp,Hf2Zr2Te8,-3.2268006066666666,0.2523125700000002 -Ca1O2_123_2864.vasp,CaO2,-3.96951902,0.22310951499999998 -Rb1Pb1Se2_156_14749.vasp,RbPbSe2,-1.24521707,0.46647112171874994 -As2P2O8_31_1238.vasp,As2P2O8,-5.015959414166667,0.17996888958332935 -Mo2O4_11_11648.vasp,Mo2O4,-5.072850388333333,0.2390547233333331 -Si3P4_5_16476.vasp,Si3P4,-4.034940485714285,-0.29246584154762223 -Tl1N1_187_19303.vasp,TlN,-1.936748585,0.7239677662500003 -Gd2Br2O4_11_6600.vasp,Gd2Br2O4,-4.20416983125,0.28079370062500086 -Hf1W2S8_164_7366.vasp,HfW2S8,-3.939051319090909,0.45740730448862976 -Ag2Se2_187_436.vasp,Ag2Se2,-0.38068799,-0.09373198249999995 -Hg2Cl2O8_28_7953.vasp,Hg2Cl2O8,-1.6159375466666666,0.44359544239583215 -K1Cl1_123_8891.vasp,KCl,-1.254827345,0.14968751999999985 -Cr1Ag1I2_6_4098.vasp,CrAgI2,-0.1071571125,0.5818231254166646 -In5Cu1P1Se1S3Cl8O1_1_8706.vasp,In5CuPSeS3Cl8O,-1.8860744955000002,0.1667128892560079 -Rb2S6Cl2_11_14934.vasp,Rb2S6Cl2,-1.6950297460000001,0.4418215536250003 -Sr2Cd1In1Ag1O5_99_17169.vasp,Sr2CdInAgO5,-2.5556194139999997,0.3461979166666669 -Pd1Pt3Se1S1Cl6_1_14380.vasp,PdPt3SeSCl6,-1.23272771,0.12096029062499794 -Nb13Se26_2_12460.vasp,Nb13Se26,-4.154507365897436,0.10136164160256467 -Mn2P2Se4Cl2_26_11198.vasp,Mn2P2Se4Cl2,-2.342701479,0.11212057187500024 -Tl1P2Au1S6_149_19314.vasp,TlP2AuS6,-2.397149197,0.173680471472217 -Co1Cl2_115_3728.vasp,CoCl2,-0.9828829966666667,0.13077520500000006 -Ho2I2O2_164_8141.vasp,Ho2I2O2,-4.411909641666667,0.12085415666666677 -Cr3O9_157_4575.vasp,Cr3O9,-3.9943839341666667,0.4584039056770832 -Al2O2F2_59_911.vasp,Al2O2F2,-5.174657586666666,0.00271925222221725 -Co1Ni1S2Br1Cl3_1_3786.vasp,CoNiS2BrCl3,-1.28323893375,0.09349047249999748 -K2Hg4Se2S6I6_31_9193.vasp,K2Hg4Se2S6I6,-0.518420597,0.02237934110416495 -Tl1Ag1Sb2S6_149_19206.vasp,TlAgSb2S6,-1.8609028049999998,0.33924019062499766 -Al2S2_129_946.vasp,Al2S2,-2.986897885,0.5331770589583309 -Ir2O2_129_8796.vasp,Ir2O2,-2.4639993375,2.322061905 -Mn2Tl2O6_162_11329.vasp,Mn2Tl2O6,-3.5786171510000004,0.027567262499999634 -Te1P2Se2_1_18319.vasp,TeP2Se2,-2.530967584,0.2385379630833337 -V4H2C3_164_20327.vasp,V4H2C3,-5.296666764444445,0.127369394126974 -Sc2Te6_11_16187.vasp,Sc2Te6,-2.2554163425,0.25880150312500017 -Na1In1Sb2Se6_5_11890.vasp,NaInSb2Se6,-1.9266090290000002,0.059089597833330926 -V1I2O1_25_19866.vasp,VI2O,-2.52796543,0.07921798335937469 -Sb4P2H2S12_4_15796.vasp,Sb4P2H2S12,-2.8731141835,0.13016897237499747 -Li2V3C6O18_2_10128.vasp,Li2V3C6O18,-5.810184544137931,0.0949911737643514 -Tb1As2_21_18168.vasp,TbAs2,-2.8435583933333333,0.6852220399999971 -Tl3Mo2O8_143_19577.vasp,Tl3Mo2O8,-3.961111462307692,0.1664934400480736 -Hf4I1Br3N4_35_7790.vasp,Hf4IBr3N4,-5.876932018333334,0.039885602916666096 -Fe2Se2_164_5979.vasp,Fe2Se2,-1.20401628,0.17937655749999992 -Ga4Bi4_2_6544.vasp,Ga4Bi4,-1.3111469525,-0.530263465 -Zr1Ti1Te2_25_21479.vasp,ZrTiTe2,-3.5301072175,0.16615295765624571 -Ag2As2O6_162_154.vasp,Ag2As2O6,-2.980853696,0.38769156700000007 -K2B2Se2N2_31_8999.vasp,K2B2Se2N2,-3.661478815,1.0027660941666663 -K2Te2C4_31_9369.vasp,K2Te2C4,-3.47174374625,1.1578169141666668 -Mn3B2F2_187_11352.vasp,Mn3B2F2,-3.387203595714286,0.15933735633927815 -Sn1Bi2S4_164_16614.vasp,SnBi2S4,-2.4568454385714285,-0.7147354489285733 -Sr3Cu2I2O4_123_17368.vasp,Sr3Cu2I2O4,-2.7231340881818182,-0.11015553354546137 -V2C1O2F2_164_20018.vasp,V2CO2F2,-3.8500845971428572,0.9465599806709809 -Zr2H2_164_21581.vasp,Zr2H2,-3.74908417,0.3102187212499994 -Nb1Bi1Se2_99_12473.vasp,NbBiSe2,-2.8950508425,0.4135679118750004 -Co2P2O6_162_3958.vasp,Co2P2O6,-4.515459799,0.30413426975000046 -S8F8_2_15405.vasp,S8F8,-2.119064753125,0.13867049398437503 -Os1O2_164_13809.vasp,OsO2,-4.609830143333333,0.8929478633333332 -Fe1C2O6_147_5643.vasp,FeC2O6,-5.2422226088888895,0.1344881248611026 -K2C2O6_11_9015.vasp,K2C2O6,-4.718641452,0.1449726490000005 -Y1Mn1Br2O2_1_20648.vasp,YMnBr2O2,-4.121121866666667,0.06373293247023293 -Rh2Br8_2_15179.vasp,Rh2Br8,-0.652617143,0.1964170230000001 -Nb9Ir1Se20_2_13209.vasp,Nb9IrSe20,-3.997478913,0.06811186933332891 -Sn6P6_2_16997.vasp,Sn6P6,-2.5725137124999997,0.2088943106250003 -Ti2V1Se1I1Br1N2O1_1_19053.vasp,Ti2VSeIBrN2O,-4.967511355555555,0.11796634872220761 -Rh2Se2F2_59_15238.vasp,Rh2Se2F2,-2.2466565766666666,0.17184153333333363 -Ni1C6N2F6_25_13303.vasp,NiC6N2F6,-4.684111880000001,0.2733771040555495 -Gd2Ga2I2_164_6611.vasp,Gd2Ga2I2,-2.2014494366666666,0.03696517666666699 -Fe6S8_50_6095.vasp,Fe6S8,-1.9882806085714286,-0.026075170714287665 -Li2Te2C2N2_31_10081.vasp,Li2Te2C2N2,-4.4542483975,0.583156910416667 -Sn12Rh4_35_16597.vasp,Sn12Rh4,-1.68224582625,0.4132827187500001 -Mn1In2O4_164_10781.vasp,MnIn2O4,-3.75042904,0.23266516854525565 -Zr1Bi1Te2W1_156_21259.vasp,ZrBiTe2W,-2.740400988,0.682453955 -Yb2H2Br2_129_20874.vasp,Yb2H2Br2,-2.797304195,0.07602981166666645 -Ni1Br2_164_13288.vasp,NiBr2,0.10862337666666666,0.06372295666666666 -Ag2Sb2S6_12_401.vasp,Ag2Sb2S6,-1.676630622,0.3959005258749976 -Hg1H1O1F1_156_7861.vasp,HgHOF,-1.8380033525,0.21097128500000029 -Mo2Se2N1_12_11687.vasp,Mo2Se2N,-3.902561444,0.2142056220000006 -Hf4Se4F4_31_7816.vasp,Hf4Se4F4,-4.4796745966666665,0.27786729541666233 -Ta1Cr1I1N2Cl1_25_17534.vasp,TaCrIN2Cl,-4.786974618333333,0.028523618888884883 -Cr2Se1S4Cl1_1_4492.vasp,Cr2SeS4Cl,-2.65938031375,0.29272357328124776 -Mn8S4Cl8_164_11476.vasp,Mn8S4Cl8,-2.2234808445,0.03701518250000002 -Ni2Bi2S4Cl2_10_13467.vasp,Ni2Bi2S4Cl2,-1.5183025620000001,0.27004634983333353 -Pb1O2F2_164_14192.vasp,PbO2F2,-1.906631118,1.0476276485 -Sb10Te10_26_15412.vasp,Sb10Te10,-1.6231337719999999,0.29604880174999804 -Cr2Ge2S6_162_4387.vasp,Cr2Ge2S6,-3.094386256,-0.11575919050000327 -Nd2S2I2_164_13242.vasp,Nd2S2I2,-3.367366495,0.04395136666666666 -K4Ir2C2Br10O2_31_9468.vasp,K4Ir2C2Br10O2,-2.2514536955,0.005248349999998958 -H2Au1O2_12_6986.vasp,H2AuO2,-2.78870401,0.27800190616666676 -K2Yb2I6_51_9393.vasp,K2Yb2I6,-1.008741348,-0.0037480079999999694 -Mn1Ni1Se2S2_1_10830.vasp,MnNiSe2S2,-2.0188674216666667,0.22775089805555354 -Ge2S3_2_6832.vasp,Ge2S3,-3.129599352,-0.33462939187500274 -Co2Ni2P2_129_3941.vasp,Co2Ni2P2,-1.8510700716666666,0.47110722055555576 -Fe2Te2O8_31_6000.vasp,Fe2Te2O8,-3.465449510833333,0.3682449203124999 -Zr3H2S2N2_38_21768.vasp,Zr3H2S2N2,-5.283240164444445,0.577895214629624 -Cs1Br3_191_4636.vasp,CsBr3,-0.09614004,0.532277210625 -Li2W1S4_111_10137.vasp,Li2WS4,-3.593234935714286,-0.031018015803577548 -Ca2P4H12O14_2_3091.vasp,Ca2P4H12O14,-4.756060080625,0.06473376656250007 -As6Pt3_157_1392.vasp,As6Pt3,-2.6716038866666665,0.7495131908333335 -Hf3Zr1S8_6_7755.vasp,Hf3ZrS8,-4.939494889166666,0.34154595270833354 -Na2Ti2N2Cl2_59_12327.vasp,Na2Ti2N2Cl2,-4.799338915,0.17942592531250012 -Zr2F2_164_21560.vasp,Zr2F2,-4.161937795,0.22399762374999987 -Mg3H2O6_12_10552.vasp,Mg3H2O6,-3.8923670163636364,0.18739780568181075 -Ga2S2_164_6447.vasp,Ga2S2,-2.79538421,0.06034228499999994 -Bi1Se1F1_156_2388.vasp,BiSeF,-2.2092130433333335,0.2933182913888863 -Mo2Se6_11_11696.vasp,Mo2Se6,-2.53041361,0.33064344583333327 -Li1Fe3O6_1_9703.vasp,LiFe3O6,-3.691700319,0.17758690675000022 -H2Pd2Se4_6_7018.vasp,H2Pd2Se4,-1.99012644875,0.60256604625 -Cr4H12O4_2_4600.vasp,Cr4H12O4,-3.5186495295,1.0704256786666622 -Te3As2_164_18542.vasp,Te3As2,-2.0291343399999997,0.08434107100000032 -Co1H4C2I2N4_47_3747.vasp,CoH4C2I2N4,-4.325753646153846,0.02976716211537904 -Al4In4I16_11_1074.vasp,Al4In4I16,-0.8555304745833333,-0.15419222750000006 -Mo1Se2_164_11550.vasp,MoSe2,-2.8001661433333336,0.24524707999999995 -Tl4Se4I4_14_19627.vasp,Tl4Se4I4,-0.617095445,0.44437594444444356 -Hf4S4Br4_31_7806.vasp,Hf4S4Br4,-4.1013233025,0.13943486791665816 -Bi8O10F4_14_2686.vasp,Bi8O10F4,-3.3446465513636365,0.18789761772726932 -Al2Fe1Se4_156_829.vasp,Al2FeSe4,-2.444943118571429,0.059329684999998356 -Sb1P1W1_156_15474.vasp,SbPW,-3.9371015633333335,-0.19940409250000346 -Co1Ir3Se1S3I4_8_3779.vasp,CoIr3SeS3I4,-2.0378698383333336,-0.0729555841319498 -Li2Mg1Se2O8F4_2_9974.vasp,Li2MgSe2O8F4,-2.9190940482352943,0.4077645455882287 -Ta9Te18_12_18167.vasp,Ta9Te18,-3.663084237407407,0.08479913148148199 -Zn2Sb4S6I4_31_21161.vasp,Zn2Sb4S6I4,-1.48115989625,-0.4305065201250001 -W12Cl24_127_20403.vasp,W12Cl24,-2.705408372222222,0.3347866977777727 -Hf2Br2N2_59_7445.vasp,Hf2Br2N2,-5.959529408333334,0.04198121499999985 -Na4Se4O8_13_12419.vasp,Na4Se4O8,-3.398733141875,0.10188894786458327 -Ta4Co2Te10_59_18024.vasp,Ta4Co2Te10,-3.155362853125,0.0995317611197919 -Mo2Se2_25_11693.vasp,Mo2Se2,-2.7453330125,0.8810360824999999 -Rb1Sr1Au1S2Br2_1_14756.vasp,RbSrAuS2Br2,-1.4691473985714285,0.17983251102678038 -Cu4H4S4Cl4_14_5415.vasp,Cu4H4S4Cl4,-1.657768229375,0.1334712689583334 -Mg2S2O8_39_10500.vasp,Mg2S2O8,-4.023813531666667,0.6394472454166662 -Y1Pb3_191_20660.vasp,YPb3,-1.1995098775,0.3731982974999988 -Ba2P1_115_2042.vasp,Ba2P,-1.4703033666666665,0.6842276208333327 -Al2H2O4_59_861.vasp,Al2H2O4,-5.39449892375,-0.7021251881249997 -K2Ru2C2S4Br8_31_9318.vasp,K2Ru2C2S4Br8,-1.9931781805555555,0.38541457944444235 -Ge3Se5S1_157_6923.vasp,Ge3Se5S,-2.5509252788888888,0.1454384573032379 -Ge2I1Cl1O2_1_6777.vasp,Ge2IClO2,-2.9515138066666666,0.2873071754166667 -Cr2Se2S3Cl1_1_4499.vasp,Cr2Se2S3Cl,-2.507020075,0.3881024825694425 -Li2H8C6S2O10_2_9956.vasp,Li2H8C6S2O10,-5.035727568214286,0.17956660295385918 -Tl1As1_187_19214.vasp,TlAs,-0.824711105,0.6940895267499999 -Ga3Au1Cl4O4_35_6525.vasp,Ga3AuCl4O4,-2.6590447408333335,-0.1446524600520895 -Ti2Se1S2I1_6_19018.vasp,Ti2SeS2I,-4.252305616666667,-0.02525257979167539 -Sr3Co2Cl2O5_123_17360.vasp,Sr3Co2Cl2O5,-3.6999674391666666,0.020616193888879586 -Ga4N4_127_6555.vasp,Ga4N4,-4.09604487875,0.90497565125 -Te6P4_11_18673.vasp,Te6P4,-2.20939913,0.35207071800000034 -Zr2B1O2_164_21510.vasp,Zr2BO2,-6.233640694,0.3315310686666617 -Hf3Te2N2F2_38_7737.vasp,Hf3Te2N2F2,-4.984157636666667,0.8390983880555454 -Cu4Bi4_51_5396.vasp,Cu4Bi4,-0.33077534375,0.69686525375 -Cd1S1_187_3413.vasp,CdS,-0.33128897,0.41012474125 -Te1Mo1O1_156_18298.vasp,TeMoO,-3.3476984266666663,0.3637012541666669 -As4C3_5_1325.vasp,As4C3,-4.151793948571429,1.161593832857137 -Ag6S2I2_1_581.vasp,Ag6S2I2,-0.077367162,0.061884872000000035 -Te6Os2_11_18661.vasp,Te6Os2,-2.18010266875,-0.13575097833333344 -Si1F2_115_16332.vasp,SiF2,-2.902532636666667,0.8043686691666635 -Sn1Sb2Te4_156_16689.vasp,SnSb2Te4,-1.6114454957142856,-0.28244773428571457 -Cr3B2Cl2_187_4542.vasp,Cr3B2Cl2,-3.380675904285714,0.19362375196427983 -Na2Cu1O2_12_12066.vasp,Na2CuO2,-2.291390866,0.35187120411110895 -Sb2H6Pb2C2O6_7_15584.vasp,Sb2H6Pb2C2O6,-4.129316997777778,0.2617476366666572 -Al1F2_25_655.vasp,AlF2,-3.3119861333333334,0.5081711538888853 -As4Pt4O4_13_1354.vasp,As4Pt4O4,-3.2427841591666664,0.4178064166666632 -K1Sb3_10_8934.vasp,KSb3,-1.0901206125,0.617275924375 -Sn12Ir4_127_16593.vasp,Sn12Ir4,-1.910067193125,0.14795878406249852 -Hf2Zr1Se6_157_7667.vasp,Hf2ZrSe6,-4.404493855555556,0.11076926694444089 -In2Sb2O6_162_8563.vasp,In2Sb2O6,-4.046543465,0.101570754875 -Cd1H1S1I1_156_3333.vasp,CdHSI,-1.1090866,0.07990227395833327 -Mn2O2_187_11175.vasp,Mn2O2,-3.849699195,0.3609471678448277 -Sr2Bi2I2O4_51_17144.vasp,Sr2Bi2I2O4,-3.1752769659999998,0.1462448860000003 -Na2Nb1S2_187_12222.vasp,Na2NbS2,-3.289447792,0.21752860799999413 -V1Mo1Pt1S4I2Br1_1_19881.vasp,VMoPtS4I2Br,-2.239961289,0.22750304770832758 -Hf2Te6As2_12_7643.vasp,Hf2Te6As2,-2.9157331710000003,0.2292243439999977 -Sr1Sn1As1I1Br1O2_1_17084.vasp,SrSnAsIBrO2,-2.6994425271428573,0.2989376169047561 -Ag2Br6_191_209.vasp,Ag2Br6,0.40497387125,0.35372826375000005 -Ca2Cl4_129_2981.vasp,Ca2Cl4,-2.1203738916666666,0.10785724666666674 -Cs2C2O6_1_4668.vasp,Cs2C2O6,-4.678608592,0.14538919262499772 -Na2S6N2_1_12294.vasp,Na2S6N2,-3.136406181,-0.015508050375001914 -K6Ta4Ag6Se16_13_9544.vasp,K6Ta4Ag6Se16,-2.266908121875,0.07706699125000016 -Ir1Se2_115_8761.vasp,IrSe2,-2.30214854,0.050938215833333356 -Pd1N2Cl2_1_14368.vasp,PdN2Cl2,-2.426368058,0.31241182966666714 -Hf2Se2N1_164_7606.vasp,Hf2Se2N,-5.90329517,0.10163333400000107 -As12S12_7_1122.vasp,As12S12,-2.7673846908333335,0.24251527760416636 -Zr1Zn2Pd1Cl4O4_1_21497.vasp,ZrZn2PdCl4O4,-2.66923865,0.150482733467879 -Mn1In2Se4_164_10786.vasp,MnIn2Se4,-2.066793214285714,0.009892157142857183 -Ta2Cl2O4_11_17690.vasp,Ta2Cl2O4,-6.01867017375,-0.08440365625000457 -Ru1Pb2_123_15279.vasp,RuPb2,-1.4682890233333332,0.8164837116666648 -Na1Ni1Sb2Se6_149_11918.vasp,NaNiSb2Se6,-1.68423304,0.3651494201666644 -Nb4S12_11_13139.vasp,Nb4S12,-4.3580711725,0.01443908109375025 -Ga3Te4_164_6538.vasp,Ga3Te4,-1.6869042457142858,0.14366076373015702 -Te2Pt2_123_18493.vasp,Te2Pt2,-1.54634946,0.35120410999999985 -Ga2Se2_129_6480.vasp,Ga2Se2,-2.14105246,0.27640504749999995 -Au4O4F4_14_1575.vasp,Au4O4F4,-1.2261411608333332,0.10136665564814695 -Al1Cu1P2S6_149_642.vasp,AlCuP2S6,-3.029157871,0.054782315786453095 -Al2S2_2_945.vasp,Al2S2,-3.3593123825,0.16076256145833057 -Bi2F6_189_2456.vasp,Bi2F6,-2.43367703125,0.561628834375 -Sr8P4I4O16_14_17496.vasp,Sr8P4I4O16,-4.665315273125,0.10053700375000041 -Hg2Cl2_2_7956.vasp,Hg2Cl2,0.7558954325,0.19428385000000004 -Li2V2F10_12_10116.vasp,Li2V2F10,-3.3917015435714286,-0.009013820238101378 -Ti2O1_164_18972.vasp,Ti2O,-6.0606961933333325,1.2638663400000016 -H2W3N2_187_7039.vasp,H2W3N2,-5.202084332857143,-1.3574696942063544 -Hf1Cl2_187_7145.vasp,HfCl2,-3.563217976666667,0.11196263749999624 -Li2Ag1S2_12_9817.vasp,Li2AgS2,-2.0078381060000003,0.2575564189374975 -K2Ta2Cu4Se8_28_9360.vasp,K2Ta2Cu4Se8,-2.21775431375,0.1665860716666644 -Te2Mo2_164_18413.vasp,Te2Mo2,-2.313003735,0.5403040024999997 -Bi4B4O14_2_2598.vasp,Bi4B4O14,-4.932370947727272,0.27807688511363354 -Ca2N1_164_3068.vasp,Ca2N,-2.622107123333333,0.3078790266666669 -Bi3Te4_156_2590.vasp,Bi3Te4,-1.4288857642857145,0.12489190285714113 -H2Os2_164_7000.vasp,H2Os2,-3.8986430875,1.458460735 -Ca2Be2_164_2949.vasp,Ca2Be2,-0.2270331875,1.726412126923075 -Mn1Ga2Se4_156_10729.vasp,MnGa2Se4,-2.2862479700000002,0.0771613871428567 -Li4Bi4O8_29_10165.vasp,Li4Bi4O8,-3.877053923125,0.05960699437499972 -V2Sb2Se6_162_20175.vasp,V2Sb2Se6,-2.575888901,0.25118441149999815 -Ga2S2I2_31_6443.vasp,Ga2S2I2,-1.8561559866666668,0.039206379166664584 -K3Ti2Br9_174_9406.vasp,K3Ti2Br9,-1.9798147514285716,0.01545065714285565 -V2I2Br1Cl1O2_8_20091.vasp,V2I2BrClO2,-2.8752604825,0.05050959835937368 -Hg1Se2_187_7916.vasp,HgSe2,0.012615896666666668,0.2539422377777776 -Te2O4_129_18418.vasp,Te2O4,-3.1762751,0.47696511625000015 -Al2Ni2Se5_187_904.vasp,Al2Ni2Se5,-2.002965716666667,-0.008766342222224721 -Mn2Se2_164_11285.vasp,Mn2Se2,-2.15937359,0.12908006129310134 -La2Cl6_12_9588.vasp,La2Cl6,-2.969109995,0.18983123749999997 -Ba4Bi4Se8F4_14_2143.vasp,Ba4Bi4Se8F4,-2.710397081,0.11729415775000018 -Nb3N2F2_187_12987.vasp,Nb3N2F2,-6.238649381428572,0.0772237112380828 -Bi1S1Br3_1_2366.vasp,BiSBr3,-0.8600749560000001,0.456568936874999 -Tl6S6_2_19644.vasp,Tl6S6,-1.2992557833333334,0.2965678977604167 -In1Ni5Br2_123_8290.vasp,InNi5Br2,0.2635088625,1.5128026914062498 -Sn1Au1I2O1F1_1_16606.vasp,SnAuI2OF,-1.08838541,0.4434873247083312 -Mg2Ti4_51_10529.vasp,Mg2Ti4,-3.642832523333333,1.0267855138888855 -Hf4I4O4_7_7792.vasp,Hf4I4O4,-4.746852228333333,0.4954317218181699 -Mn2Cl2_164_11052.vasp,Mn2Cl2,-1.48423743,0.3770053931896551 -Cr1O2_191_4224.vasp,CrO2,-3.3163615600000003,1.501634294374996 -W2Br2N2_59_20459.vasp,W2Br2N2,-4.68035895,0.18676310763888537 -Ba2H8O6_4_1997.vasp,Ba2H8O6,-4.35333229375,0.06049623624999967 -P4O6_7_14090.vasp,P4O6,-5.163356202,0.0954475516000004 -Pt1O2_187_14585.vasp,PtO2,-2.1739777333333334,1.3737068666666667 -V2Cl4_11_20036.vasp,V2Cl4,-2.3868267383333333,-0.039296391666666874 -Sr3Mn2Cl2O5_123_17384.vasp,Sr3Mn2Cl2O5,-3.9635988683333334,0.007769508291646243 -Hf1Ru1S2Br1Cl1_8_7277.vasp,HfRuS2BrCl,-3.356507561666667,0.4522781765624963 -Sb2As2O8_31_15531.vasp,Sb2As2O8,-4.2652803775,0.17012658291666272 -In1Se1I2_1_8341.vasp,InSeI2,-0.6149665125,0.36623910393229164 -W2S2Br2_59_20526.vasp,W2S2Br2,-3.2739332266666668,0.25495322305555534 -Li2Nb3Te6Ir1_1_10015.vasp,Li2Nb3Te6Ir,-3.043628696666667,-0.49069105300926313 -Cr2Te2Br2_59_4517.vasp,Cr2Te2Br2,-1.5795998216666665,-0.01412326388889018 -Hf2S1_187_7564.vasp,Hf2S,-4.908143076666667,0.8497370216666669 -Ta2P2Se6_2_17823.vasp,Ta2P2Se6,-3.801469932,0.24757623750000013 -Li2Sn2P2O8_7_10073.vasp,Li2Sn2P2O8,-4.87273565,0.0722277746428528 -Zn2P4S8_4_21138.vasp,Zn2P4S8,-2.626934805714286,0.13157535800446302 -As10Se10_26_1118.vasp,As10Se10,-2.4167965625,0.29008837666666376 -C1_191_2739.vasp,C,-4.08591426,4.03041115 -Mn2Nb2Se6_11_11163.vasp,Mn2Nb2Se6,-3.4295096559999996,0.10188603212930847 -V3O4F4_6_20285.vasp,V3O4F4,-4.567287782727273,-0.2453667410606153 -As2Os2Se6_162_1236.vasp,As2Os2Se6,-2.869037634,0.3576077995999971 -Ni1Au1Se4_10_13263.vasp,NiAuSe4,-0.9921138916666666,0.3620389188888872 -Sn1F2_187_16630.vasp,SnF2,-2.2834225866666666,0.4028565491666667 -Sc1Cl2_123_15918.vasp,ScCl2,-2.6744326399999996,0.21505493111110852 -As2Au1_10_1184.vasp,As2Au,-1.5242210433333332,0.2589205274999977 -Fe2Sb4Br4O6_11_5965.vasp,Fe2Sb4Br4O6,-3.10658633125,-0.0724756475000039 -Co2Si8_125_4029.vasp,Co2Si8,-3.4836093220000004,-0.48067880200000035 -Pd2I2O2_59_14430.vasp,Pd2I2O2,-1.382653765,0.2619634696527743 -Nb2Te8Ir2_6_12931.vasp,Nb2Te8Ir2,-2.8386468583333335,0.1034178020833334 -Sb2P2S8_11_15627.vasp,Sb2P2S8,-2.8673375625,0.16183640916666397 -Hf1Cd1S2Br2_6_7137.vasp,HfCdS2Br2,-2.5272196,0.20360446875000004 -Mn2Ga2Te5_187_11082.vasp,Mn2Ga2Te5,-1.8078706355555556,0.05353640941251392 -La2As1I2_164_9576.vasp,La2AsI2,-3.040139562,0.046890972000000364 -Cr1O3_6_4226.vasp,CrO3,-4.6695022575,-0.21671441765624966 -Mg2P2O6_162_10495.vasp,Mg2P2O6,-5.040498722000001,0.3290373771999995 -Ni2Ir1S4I1_1_13529.vasp,Ni2IrS4I,-1.56045014625,0.26462959440104017 -P4O14_4_14085.vasp,P4O14,-4.740185072777778,0.2757072486111065 -Sn4O4_57_16946.vasp,Sn4O4,-3.59736440625,0.1392809762499998 -V4O4F12_29_20347.vasp,V4O4F12,-3.7821825105,-0.6522759012499999 -Zr4Bi1Se4I7_1_21809.vasp,Zr4BiSe4I7,-2.2600292375,0.18786282506510021 -Mo1S2_187_11545.vasp,MoS2,-3.7242016000000002,0.04191701833333328 -Ga2Co2O5_187_6330.vasp,Ga2Co2O5,-3.975828327777778,-0.1293315522222268 -Ho2Co2Ge4_129_8135.vasp,Ho2Co2Ge4,-2.8536148925,0.38309284124999987 -Mn1Sb1Br2O3_6_10857.vasp,MnSbBr2O3,-2.9911967285714285,0.19345094488094805 -Cr2S4_127_4471.vasp,Cr2S4,-2.5576014183333333,0.9060117883333332 -Nb4Ge2Se8_55_13079.vasp,Nb4Ge2Se8,-4.04379386,-0.08548105000000161 -Ta4Ge2Te8_55_18047.vasp,Ta4Ge2Te8,-3.6807792349999997,-0.15788268666666827 -As1O2_2_1156.vasp,AsO2,-3.9484942666666663,0.49270891874999156 -Zr2Te2_129_21709.vasp,Zr2Te2,-3.00807721,-0.04590667500000034 -Te2Ru2Cl2_59_18514.vasp,Te2Ru2Cl2,-1.9253274466666666,0.4377223019444416 -Si4Te4_53_16520.vasp,Si4Te4,-2.70819415875,-0.18250622750000023 -Cu2Mo1S4_111_5184.vasp,Cu2MoS4,-2.2180310000000003,0.17453624309523552 -Ti1Sb2_164_18844.vasp,TiSb2,-3.6012672633333334,0.5518241949999996 -Ni1Pd1S2I2_6_13398.vasp,NiPdS2I2,-0.932014325,0.13992313034721915 -Ta2O4F4_12_17815.vasp,Ta2O4F4,-4.963563293,0.5660441466249937 -Ta2Ni1Se6_12_17792.vasp,Ta2NiSe6,-3.527260382222222,-0.14099527577778148 -Hf2Br2_164_7449.vasp,Hf2Br2,-3.7517734725,0.15024529499999995 -Cu1Sb1As2S6_143_4960.vasp,CuSbAs2S6,-2.4127627069999997,0.4244525391666619 -Nb2S2_187_12845.vasp,Nb2S2,-4.8274018175,0.2841793859999946 -In2Te2H2S8_11_8621.vasp,In2Te2H2S8,-2.3759052807142855,0.19080346809523405 -Fe2S2_123_5939.vasp,Fe2S2,-1.7241655825,0.2575994975 -Ni1Te1O4_10_13429.vasp,NiTeO4,-3.237037256666667,-0.17715792895833626 -P2Ir2O6_12_13991.vasp,P2Ir2O6,-4.566443155,0.772210769333328 -Cu1H2S2_12_4893.vasp,CuH2S2,-2.2717391620000003,0.21234429416666645 -Cr2H2C1S2_164_4395.vasp,Cr2H2CS2,-3.7546976342857143,0.37143384499998766 -Ag2C4S8F4_2_230.vasp,Ag2C4S8F4,-3.008958795,0.36006169864582305 -Ag2P4Cl2O3_6_356.vasp,Ag2P4Cl2O3,-2.884238510909091,0.3069009386515096 -Mg1Fe1Br2O2_8_10360.vasp,MgFeBr2O2,-2.3886026883333336,0.06842209027777146 -Zn2Mo2O8_13_21117.vasp,Zn2Mo2O8,-4.167431929166667,0.03479724972222176 -K2P2O8_11_9290.vasp,K2P2O8,-4.169944275,0.4587741372916634 -Tl2Br6_1_19385.vasp,Tl2Br6,-0.26310824625,0.16131576656250002 -Si2Cl8_1_16399.vasp,Si2Cl8,-2.116414203,0.08315035299999973 -Mn3B2O2F2_187_11356.vasp,Mn3B2O2F2,-3.1021733955555555,1.2421006481055732 -V4Br4N1O2_12_20310.vasp,V4Br4NO2,-3.6429502036363632,0.17503916979797252 -Ca2Ga2N2_129_3020.vasp,Ca2Ga2N2,-3.222064018333333,0.415726713333334 -In1Bi1F3_1_8207.vasp,InBiF3,-2.048605862,0.3190526868333312 -In4Te6_1_8704.vasp,In4Te6,-1.221272522,0.15809711400000004 -Hf2Mo2Se2S2I3Cl1_1_7536.vasp,Hf2Mo2Se2S2I3Cl,-3.1126390891666667,0.35277776588540793 -Cr3H2N2_187_4557.vasp,Cr3H2N2,-4.437516962857143,-1.5080354705555603 -Te8P8S4_2_18708.vasp,Te8P8S4,-2.438619414,0.41216451524999653 -Nb3Se1Br7_156_13009.vasp,Nb3SeBr7,-2.777118897272727,0.05912865181818239 -Te12Cl8_14_18274.vasp,Te12Cl8,-1.002688708,0.27462503070833333 -Y1Br2_123_20613.vasp,YBr2,-2.903635003333333,0.1531484561111085 -Cu2H4S2O10_2_5130.vasp,Cu2H4S2O10,-3.788507585,0.09392681736110815 -N2F6_31_11785.vasp,N2F6,-2.04929291,0.07421713749999981 -Sc2In1S1Br2_1_16102.vasp,Sc2InSBr2,-2.4608949033333336,0.22206516541666366 -Zr2Br2O2_164_21521.vasp,Zr2Br2O2,-4.796985431666667,0.12186522666666644 -V1Sb1W3Se1Br2_1_19921.vasp,VSbW3SeBr2,-2.81750202125,1.1073493712847131 -Ni2S8_11_13599.vasp,Ni2S8,-2.003767517,0.14955275699999793 -Ta2Te6_59_17924.vasp,Ta2Te6,-3.04475794625,0.12825144677083 -Ce1C5_25_3643.vasp,CeC5,-5.913231978333333,1.3320746812499933 -Be1P2O4F4_1_2228.vasp,BeP2O4F4,-4.718700093636364,-0.02024178227273188 -Ge2Sb1Se6_162_6837.vasp,Ge2SbSe6,-2.3575005577777777,0.1392976406944424 -Na2Cd4Se2Cl6O6_31_12037.vasp,Na2Cd4Se2Cl6O6,-1.7767254529999998,0.21273440791666637 -Ti1Ga2S4_164_18782.vasp,TiGa2S4,-3.722330341428571,-0.03381044053571691 -Zn1F2_187_20924.vasp,ZnF2,-1.2774576633333334,0.3192545141666665 -Y2Al2Cl2_164_20691.vasp,Y2Al2Cl2,-3.450466535,0.16659696083332998 -Ni1Cl2_164_13312.vasp,NiCl2,-0.24974384333333333,0.059751483333333355 -Co1H4C2Br2N6_6_3746.vasp,CoH4C2Br2N6,-4.354206434666667,0.2726453563888763 -K2Fe2Bi2_129_9100.vasp,K2Fe2Bi2,0.12610583333333333,1.1556712535416658 -Nb4Ni4S8_53_13103.vasp,Nb4Ni4S8,-3.452321635,0.4999146049999976 -Cu4S3_123_5448.vasp,Cu4S3,-0.9820196814285714,-0.2166737702380963 -La2H4N2O10_4_9594.vasp,La2H4N2O10,-5.093646248333333,0.06787633111110658 -Te16Ir8_1_18277.vasp,Te16Ir8,-2.2317739870833333,0.2117283729166668 -P2W2S10_85_14058.vasp,P2W2S10,-3.4245739914285713,0.2742544913839253 -Te3P4Au2I2_6_18557.vasp,Te3P4Au2I2,-1.4533754618181818,-0.11055334803571881 -Cu1H4C6N6O2_6_4899.vasp,CuH4C6N6O2,-5.760185755263159,0.23147258761694928 -Zn1Fe1I2_8_20929.vasp,ZnFeI2,0.5783322125,0.8857911490624999 -Cs3Zr2I9_187_4802.vasp,Cs3Zr2I9,-1.133713205,0.16283221892857047 -Cr1Ag1Te6P2_149_4111.vasp,CrAgTe6P2,-1.7015761609999998,0.4189175624166669 -Nb1Mo1Se4Br2_1_12534.vasp,NbMoSe4Br2,-2.54552404875,0.34000204437500003 -Pb2S4_12_14283.vasp,Pb2S4,-2.1884851849999998,-0.8671012885416677 -Fe1Ge2C6N6_164_5681.vasp,FeGe2C6N6,-6.186034206,0.3519644756111045 -Sb6C6_2_15846.vasp,Sb6C6,-4.362528789166666,0.8374174520833335 -Al8S6_31_1112.vasp,Al8S6,-3.0241413635714283,0.33934871196428373 -Ca2H8S4I4_53_3047.vasp,Ca2H8S4I4,-2.524881512222222,0.05390221099999781 -Li2Ce1P2_164_9857.vasp,Li2CeP2,-3.405914684,0.3044548581250006 -Tm1Br2_164_19661.vasp,TmBr2,-2.138083796666667,0.16562702277777555 -Cr2I6_189_4416.vasp,Cr2I6,-0.4952563925,0.159355955 -Ti1Mo1S6_1_18803.vasp,TiMoS6,-3.62459554,0.3865048011718748 -Re2Cl6_162_15040.vasp,Re2Cl6,-2.41597916375,0.32200391208333157 -Pb2S1Br2_12_14267.vasp,Pb2SBr2,-1.62715429,-0.6415465059999997 -Re4Te1Se7_1_15118.vasp,Re4TeSe7,-3.8484337975000003,0.24591873437499956 -Hf2Te2C1_164_7631.vasp,Hf2Te2C,-5.239031450000001,0.0009580420000001588 -V2P2Se6_8_20141.vasp,V2P2Se6,-2.946006693,0.16952973587499698 -Bi1Cl2_164_2326.vasp,BiCl2,-1.0124669666666668,0.29744588611110984 -Se3O9_157_16296.vasp,Se3O9,-2.773188128333333,0.7061399751041668 -Fe3S1I1Cl3_1_6060.vasp,Fe3SICl3,-1.25948299,0.17580701640625013 -Zn2Ge1Pd1Cl8_1_21087.vasp,Zn2GePdCl8,-0.9320213591666667,0.13476286152281608 -V2Pb4O4F10_2_20145.vasp,V2Pb4O4F10,-3.4500182995000004,0.025680489906246384 -Ca2As4S12_2_2926.vasp,Ca2As4S12,-2.710732846111111,0.48088575624999697 -Mn2Sb2Te4Br2_26_11254.vasp,Mn2Sb2Te4Br2,-1.455266339,0.22994562374999794 -Cd2Se2Cl2_59_3569.vasp,Cd2Se2Cl2,-0.33836342,0.12067598722222084 -Hf3W1Se1I4Cl1O2_1_7746.vasp,Hf3WSeI4ClO2,-3.66392647,0.6288412001562435 -Mn3B2H2S2_187_11354.vasp,Mn3B2H2S2,-3.4654397033333333,0.4240259954166602 -As1Se1Br2_1_1175.vasp,AsSeBr2,-1.30392833,0.31914972447916673 -Ta1Nb1I2N1_1_17571.vasp,TaNbI2N,-4.473181314,0.44238226466665886 -Hf2S1I2O1_25_7563.vasp,Hf2SI2O,-4.3064512116666664,0.19744501416666438 -Hg2I2_129_7972.vasp,Hg2I2,1.6430366,0.43117181250000014 -Zr1Nb1Se2_8_21359.vasp,ZrNbSe2,-4.32571999,-0.25912034512500304 -Nb3C1I2O1_1_12957.vasp,Nb3CI2O,-4.706422978571429,0.4244828812871928 -Cr4N2F16_129_4607.vasp,Cr4N2F16,-2.6315791818181817,0.3911437729545407 -Ba1Ta2S7_123_1865.vasp,BaTa2S7,-4.17018265,0.36784203231249624 -Ge2Te2O8_31_6885.vasp,Ge2Te2O8,-4.160261289166667,0.15960042062499946 -P4S5_6_14111.vasp,P4S5,-3.3634518455555553,0.0789206084027747 -Na2H6Pb1O6_147_12124.vasp,Na2H6PbO6,-3.8732305759999996,0.06309262716666741 -Bi4O8_11_2627.vasp,Bi4O8,-3.459020789166667,0.30853005677083 -Tl2Mo6O18_10_19455.vasp,Tl2Mo6O18,-4.821485372307692,0.05891898799998002 -K2Ti2P2Se10_10_9379.vasp,K2Ti2P2Se10,-2.96423531,0.122731983125 -Rb2Sn2I6_26_14943.vasp,Rb2Sn2I6,-0.623086291,0.1431834715 -Li1Ga1Br4O12_2_9707.vasp,LiGaBr4O12,-2.6205506794444444,0.270130100555553 -In2N2Cl2_59_8486.vasp,In2N2Cl2,-2.558799083333333,0.21696592645833124 -Co2Se2Br2_59_4018.vasp,Co2Se2Br2,-1.6556458183333334,0.09745535833333352 -Ca2Au1S2Cl2_123_2933.vasp,Ca2AuS2Cl2,-1.7773734928571427,0.30828275357142465 -Sb8C4_26_15862.vasp,Sb8C4,-3.4022638466666666,0.8255560049999964 -Nb2Co2S10_51_12689.vasp,Nb2Co2S10,-3.578885937142857,0.24373140249999636 -Hf2Te2_164_7640.vasp,Hf2Te2,-3.7199708825,0.4741020343750002 -Bi2Br2O2_129_2430.vasp,Bi2Br2O2,-2.699398443333333,0.05505227166666726 -As2Se1O2_5_1296.vasp,As2SeO2,-3.5069254360000004,0.35190795033332967 -Sn2O2_31_16798.vasp,Sn2O2,-3.606563265,0.13008211749999976 -V3C2F2_187_20249.vasp,V3C2F2,-4.967293334285714,0.028326501375650626 -K2H6N2O8_1_9149.vasp,K2H6N2O8,-3.5889132938888886,0.6206489311666628 -Ag1C4S8N4_81_42.vasp,AgC4S8N4,-4.217807571764705,0.2990927207046524 -Cu1Sn1Ge1W1Cl4O6_1_4982.vasp,CuSnGeWCl4O6,-3.1593381428571425,0.37441263553570714 -Rb2Pb2F6_1_14918.vasp,Rb2Pb2F6,-2.4176307120000002,0.03992694899999982 -W2S2_10_20535.vasp,W2S2,-3.9592152275,1.1496105525 -Ni2Te4_14_13678.vasp,Ni2Te4,-0.5953297433333333,0.14416217666666664 -Ba2S8Cl4_50_2051.vasp,Ba2S8Cl4,-1.9669294771428572,0.6965170010714261 -Cu4O4_26_5434.vasp,Cu4O4,-1.82313085125,0.6496576468750002 -Bi8Se8S4_2_2698.vasp,Bi8Se8S4,-2.0211974130000003,0.22699067699999986 -Mn2Ga2O5_164_11074.vasp,Mn2Ga2O5,-4.331415081111111,-0.03729139250000468 -Al1Se2O8_164_737.vasp,AlSe2O8,-3.8229757163636364,0.2517555400568141 -In1Ga1Br2N1O1_6_8250.vasp,InGaBr2NO,-2.612654185,0.3915672581249895 -Ag1Au1F6_1_7.vasp,AgAuF6,-0.65651979875,0.07890524875000005 -Sr2S4I4F8_30_17302.vasp,Sr2S4I4F8,-1.549854985,0.64002824413194 -Nd2Se6_129_13245.vasp,Nd2Se6,-3.28123370375,0.1551357977083333 -Cd1Ag2H12C8N16_2_3265.vasp,CdAg2H12C8N16,-5.393131496410256,-2.125281429829063 -Pb2S2Br1Cl1_6_14270.vasp,Pb2S2BrCl,-1.5735839166666665,-0.21494365788194764 -Cr2As4Au2O12_13_4313.vasp,Cr2As4Au2O12,-3.744097929,0.5496848617916628 -Ca2Cu1Te2F2_38_3008.vasp,Ca2CuTe2F2,-1.7026165985714286,0.574069488571425 -Sr4Fe2Cu4O14_6_17434.vasp,Sr4Fe2Cu4O14,-3.2832343354166666,0.14303589458332988 -Mn4N3_164_11443.vasp,Mn4N3,-4.161856395714286,0.7088483739285669 -Ag1Cl1_187_47.vasp,AgCl,0.08890306,0.21822198750000002 -K2H8S4Br2_2_9162.vasp,K2H8S4Br2,-2.62556316875,0.05348751062500012 -Fe1Se2_164_5756.vasp,FeSe2,-1.6299475333333333,0.6719112249999999 -Cr1In2O4_164_4204.vasp,CrIn2O4,-3.91775978,0.43142420017856686 -Re2S2_129_15075.vasp,Re2S2,-4.9981812975,0.6318741556249998 -Zn1Br2_187_20904.vasp,ZnBr2,0.08585603000000001,0.27859551375 -Nb2Os2Se8_11_12802.vasp,Nb2Os2Se8,-3.7520557691666667,0.14818936458333343 -Sc3H2N2_187_16207.vasp,Sc3H2N2,-5.22159909,-0.1257750542857181 -Nb1As1Br2O1_6_12464.vasp,NbAsBr2O,-3.434019852,0.39024065599999735 -Sc3B2H2_187_16195.vasp,Sc3B2H2,-3.83732094,0.2591602864285645 -Y2F2_129_20728.vasp,Y2F2,-3.5919901025,1.281440636666662 -Zr1Ta1S1Br3_6_21451.vasp,ZrTaSBr3,-3.376026503333333,0.2728423327777696 -K2Nb1Cu1Se4_21_9255.vasp,K2NbCuSe4,-2.233709225,0.12353513500000002 -Li1In1As2Se6_5_9727.vasp,LiInAs2Se6,-2.2516952150000002,0.260047188833331 -Na1Ga1P2O6_5_11863.vasp,NaGaP2O6,-4.8756790389999995,0.16924574699999306 -Sc4B3Cl2_164_16222.vasp,Sc4B3Cl2,-3.804164097777778,0.16404428049999653 -Zr2Br6_162_21528.vasp,Zr2Br6,-2.24870313875,0.18493790625000006 -Rh2S2Br2_59_15215.vasp,Rh2S2Br2,-2.125431155,0.049811926666667006 -In1Te1S1_1_8363.vasp,InTeS,-1.7873938566666665,0.26914736648148024 -H2Pd1S2_164_7010.vasp,H2PdS2,-2.5100301959999998,0.2731443115000004 -In2Se5_12_8599.vasp,In2Se5,-1.8742910599999998,0.2025066880952362 -Ti4Zn2O10_59_19169.vasp,Ti4Zn2O10,-5.638971311875,0.3803223467187493 -Hf3V1Br2Cl2O4_1_7745.vasp,Hf3VBr2Cl2O4,-5.1393378258333335,0.35666561239583006 -Cs2S6Br2_11_4779.vasp,Cs2S6Br2,-1.439521094,0.5546127656250004 -Sb1Se2S6F1_1_15504.vasp,SbSe2S6F,-2.15002435,0.460426478624998 -Pb2Cl2F2_129_14235.vasp,Pb2Cl2F2,-1.893103085,0.3726706166666669 -Ta4S6_2_18104.vasp,Ta4S6,-5.524912221999999,-0.1760411715000041 -Mn2In2S5_187_11122.vasp,Mn2In2S5,-2.7236449855555556,-0.1322744783333334 -Zr3Se2_123_21786.vasp,Zr3Se2,-4.21304273,-0.2653345956666704 -Tl2Co2S5_156_19398.vasp,Tl2Co2S5,-1.94969202,0.46252974333333124 -B2H2W3_187_1671.vasp,B2H2W3,-5.090026951428571,0.8869015178571311 -Hg1H1S1Cl1_156_7863.vasp,HgHSCl,-1.054716935,0.11427960124999802 -Li2Hf1H6O6_147_9959.vasp,Li2HfH6O6,-4.920281285333333,0.10160675900000027 -Pd1C6S4F8_10_14353.vasp,PdC6S4F8,-3.757049929473684,0.3381338816447282 -V2O4F2_7_20127.vasp,V2O4F2,-4.7671257075,-0.2788271140625036 -As2W2S10_85_1309.vasp,As2W2S10,-3.3282205278571433,0.40654525361606764 -Pd4I8_14_14520.vasp,Pd4I8,-0.15627265416666666,0.1349363133333333 -Co2Sb2S4Br2_10_3999.vasp,Co2Sb2S4Br2,-2.117879475,-0.256447944583336 -Cu1Sb1Te6P2_143_4969.vasp,CuSbTe6P2,-1.639200642,0.34167862499999846 -Ti2Ga1Se1Cl4_6_18940.vasp,Ti2GaSeCl4,-3.12542402,-0.16753975932005982 -Hf2Br6_189_7453.vasp,Hf2Br6,-2.53138171875,0.26060902583333023 -Na2V4O10_59_12335.vasp,Na2V4O10,-5.075637085,0.19615158062499427 -Y1C5_47_20618.vasp,YC5,-5.729797153333333,1.9033707411458267 -Bi4Sb4O20_14_2644.vasp,Bi4Sb4O20,-3.672370130357143,0.4726797705357105 -Ni1H4C2Br2N6_6_13332.vasp,NiH4C2Br2N6,-4.186819466,0.3238259917222106 -Ca5Y1_1_3253.vasp,Ca5Y,0.07451619999999999,1.306754272499997 -K1W2S2Cl6_47_8960.vasp,KW2S2Cl6,-2.4246920327272727,0.21135204909090555 -Pt2Se2O6_11_14677.vasp,Pt2Se2O6,-3.2567816790000004,0.10326402658332712 -Tl2Cu2H2Se2O10_11_19403.vasp,Tl2Cu2H2Se2O10,-3.10610641,0.12900771087962312 -Pb2I1Br3_1_14247.vasp,Pb2IBr3,-0.923497965,0.15207148402777793 -Ti6N3Cl6_164_19182.vasp,Ti6N3Cl6,-5.594973456666667,0.025722089333333642 -Ag2Se1_191_427.vasp,Ag2Se,0.19437082000000003,0.4259860066666667 -Na2Ho2Cl8_2_12178.vasp,Na2Ho2Cl8,-2.559582386666667,0.09584376444444165 -Sc2Te8P2_2_16189.vasp,Sc2Te8P2,-2.2550193825,0.35742280486110545 -Li5Br2N1_47_10256.vasp,Li5Br2N,-2.744622465,0.11812352749999988 -Cs2Ru2N2Cl10O2_4_4773.vasp,Cs2Ru2N2Cl10O2,-2.2944222105555556,-0.09412123868056027 -Si1Hg2O4_21_16341.vasp,SiHg2O4,-2.929633725714286,0.25795487619047197 -Ga2C4F14_10_6317.vasp,Ga2C4F14,-3.2024826405,0.45467894050000024 -Al2F6_12_821.vasp,Al2F6,-3.99865564125,-0.003976301250000258 -Ga2S2F2_31_6441.vasp,Ga2S2F2,-2.8086535083333337,0.13400044388888577 -Li1As3_187_9655.vasp,LiAs3,-2.47957838,0.5663259440624999 -Ti1Se2_164_18851.vasp,TiSe2,-4.3716701066666666,0.10081174833333328 -S3N2_164_15391.vasp,S3N2,-2.924407724,0.8598234046250008 -Y3H2N2_187_20798.vasp,Y3H2N2,-5.9149195642857135,-0.10172500285714703 -Sc1Bi1S2I4_1_15906.vasp,ScBiS2I4,-1.50953861,0.2945805499218752 -Ni2I2_164_13524.vasp,Ni2I2,0.60474574,0.6277625675 -Cs1Sn1O2_156_4649.vasp,CsSnO2,-2.7061771325,0.567139719375 -H4Au1C12S2_6_7051.vasp,H4AuC12S2,-5.33915810368421,0.7898220504934146 -Sr3Cu2Br2O4_123_17366.vasp,Sr3Cu2Br2O4,-2.913984475454545,0.1115425028571384 -Pd1C6N2Cl2F4_25_14350.vasp,PdC6N2Cl2F4,-4.607994776,0.27027826327777255 -Tb2Co2Ge4_129_18191.vasp,Tb2Co2Ge4,-2.87958835,0.38642685624999995 -Pb2S10_7_14266.vasp,Pb2S10,-2.1912072041666666,-0.22157285625000167 -Fe2P2Se4F2_26_5921.vasp,Fe2P2Se4F2,-2.423232439,0.3742688681333332 -Hf1Te2_123_7324.vasp,HfTe2,-3.2642486466666667,0.48401119000000037 -Hf1Pd1Br2O2_25_7261.vasp,HfPdBr2O2,-3.8199810050000003,0.35951367583333305 -Ca10Ir2_26_2786.vasp,Ca10Ir2,-0.19598569,0.16725003916666664 -Ag2H2_164_268.vasp,Ag2H2,-0.942619345,1.10857409 -Ga2Ni2Te5_187_6410.vasp,Ga2Ni2Te5,-1.1402886877777778,0.024852610666666164 -Ag4Cl4O4_14_510.vasp,Ag4Cl4O4,-0.8693233825000001,0.3359438345833323 -Ba1Ag2O8_89_1800.vasp,BaAg2O8,-2.6758675745454545,0.22608110772726686 -Te6Rh2_11_18682.vasp,Te6Rh2,-1.630587465,0.4249923022222203 -Cu4Se2S12_14_5467.vasp,Cu4Se2S12,-1.6728995066666665,0.3525607819444427 -Bi2Te1S2_164_2553.vasp,Bi2TeS2,-2.068069416,-0.3896585665000002 -Mn6O2F12_2_11470.vasp,Mn6O2F12,-3.1061297075,-0.22523327650000247 -Sc2Cl2O2_129_16059.vasp,Sc2Cl2O2,-4.852934185,0.1335911533333336 -Cu2C6N2Cl2F8_2_5077.vasp,Cu2C6N2Cl2F8,-3.8926654135,0.11938092051041016 -Ta2O2_187_17811.vasp,Ta2O2,-6.86040571,0.877867004000001 -Ta2Pd4S4_51_17829.vasp,Ta2Pd4S4,-3.336412284,0.2661769096000004 -Hf1Fe1H6_149_7160.vasp,HfFeH6,-3.37207371625,0.7305580818750002 -Ag2C8N6_31_239.vasp,Ag2C8N6,-5.97105105,0.30400421239582687 -Os2I6_162_13853.vasp,Os2I6,-0.9634295725,0.22272917890625 -Ca1Mn1I2O1_1_2855.vasp,CaMnI2O,-2.109434144,0.024397698999999995 -Ge2Br2_164_6756.vasp,Ge2Br2,-1.6160630075,0.16075995875000004 -K2Hg4S8I6_31_9185.vasp,K2Hg4S8I6,-0.5073750985000001,0.09296474447916758 -Mo1As2_164_11487.vasp,MoAs2,-3.249353263333333,0.2927409500000002 -Te2Pd2S6_11_18472.vasp,Te2Pd2S6,-2.086729888,0.10248105399999785 -Sr1Pb1O2_1_17072.vasp,SrPbO2,-3.10632257,0.4773875223437499 -Sr2H2N2O6_59_17234.vasp,Sr2H2N2O6,-4.136330524166667,0.4961633536666577 -As6Pb6_12_1387.vasp,As6Pb6,-1.8291871266666666,0.2890980908333334 -Sn1Te4P2_164_16705.vasp,SnTe4P2,-2.019347394285714,-0.17951808000000335 -V2O2F2_59_20118.vasp,V2O2F2,-4.608033823333334,-0.09689696222222688 -Mn3Ge1S2_187_11378.vasp,Mn3GeS2,-2.6065742633333335,0.2859426422222191 -Li1Au1S4O14_2_9658.vasp,LiAuS4O14,-3.9687299410000003,0.06798958799999966 -K2Zr2Cu2Se6_51_9400.vasp,K2Zr2Cu2Se6,-2.4131382274999997,0.185743937916667 -P2Br6_26_13964.vasp,P2Br6,-1.2155744125,0.07983609249999879 -Mn1Tl2Te4_156_10918.vasp,MnTl2Te4,-0.89671825,0.4087138478571415 -Tl2Se2_65_19535.vasp,Tl2Se2,-0.89305737,0.4068222710416667 -Ga1Ag1Te1Se1_8_6130.vasp,GaAgTeSe,-1.12325768,0.26388257187499997 -Sn4Sb8_6_16968.vasp,Sn4Sb8,-1.8192029283333333,0.16607231354166452 -In2Te3_164_8631.vasp,In2Te3,-1.321283438,0.05808619800000003 -Sr8Si4_11_17497.vasp,Sr8Si4,-0.5841479925,0.8950732533333333 -Cs1Sn1Se2_156_4651.vasp,CsSnSe2,-1.369826355,0.3026425237500003 -Sc2S2Cl2_59_16132.vasp,Sc2S2Cl2,-3.7921356250000002,0.03072356333333337 -In1P2S7_5_8301.vasp,InP2S7,-2.861501992,0.18861754396874786 -Sn1Pt1S4_10_16674.vasp,SnPtS4,-2.61429389,0.028757800000000167 -Sn2Sb2H6C2O6_7_16857.vasp,Sn2Sb2H6C2O6,-4.178285636111111,0.27241628180555133 -Rh2C8_117_15181.vasp,Rh2C8,-4.869415801000001,2.240033519 -La2Br6_12_9582.vasp,La2Br6,-2.423879855,0.04581354000000015 -Sb2Pd2O7_1_15651.vasp,Sb2Pd2O7,-3.2301504436363633,0.49629349863636074 -K1Ge1O2_156_8901.vasp,KGeO2,-3.1632794175,0.6569272639062469 -Mn1Zn1S2_8_10944.vasp,MnZnS2,-1.8172252525,0.25737290599999985 -B8Te4O20_14_1794.vasp,B8Te4O20,-5.5392662471875,0.1146578184895839 -B2H2_164_1672.vasp,B2H2,-4.368128215,0.40050923744047096 -Hf2B1F2_164_7436.vasp,Hf2BF2,-5.54127935,0.06009402750000059 -V2O2_187_20124.vasp,V2O2,-4.95304052,0.5797896233333285 -Au4Se4O14_32_1602.vasp,Au4Se4O14,-2.652343735909091,0.13236698863636093 -Zr1Sc1Se2S2_3_21437.vasp,ZrScSe2S2,-3.804238461666667,0.42381250562499573 -Cu2As4S3F2_6_5019.vasp,Cu2As4S3F2,-2.17362789,0.26611434501893405 -Hg1_65_7922.vasp,Hg,2.76116682,0.30637129379310357 -Sc1Cu1P2Se6_149_15926.vasp,ScCuP2Se6,-2.646232024,0.09349678523958119 -Na2Br2O4_113_11993.vasp,Na2Br2O4,-2.2288986975,0.15078555166666519 -Ni2Se2O6_12_13636.vasp,Ni2Se2O6,-3.1462374090000003,-0.3038681475000016 -K2Os2Br8N2O4_7_9273.vasp,K2Os2Br8N2O4,-2.5025787894444442,0.07028879435184487 -In2Br6_12_8396.vasp,In2Br6,-0.93980121625,0.042527142500000004 -Y1Ge3_187_20635.vasp,YGe3,-3.0444394425,0.5678904520833306 -Hf1V1O2_25_7353.vasp,HfVO2,-5.573166385,1.4897336287499996 -Ti4B3S2_164_19124.vasp,Ti4B3S2,-5.948971562222223,0.016399785787031607 -Na2Cd2Cl6_162_12018.vasp,Na2Cd2Cl6,-0.936302317,0.13710932333333292 -B6H4Au1C6O2_6_1776.vasp,B6H4AuC6O2,-5.070138856842105,1.0741945190295958 -Cd2Ag2Te2I2_26_3452.vasp,Cd2Ag2Te2I2,0.364731515,-0.24369301499999999 -Zn2Sb2O6_162_21146.vasp,Zn2Sb2O6,-3.138813949,0.40394549187499607 -Co1Au1Br2O2_6_3697.vasp,CoAuBr2O2,-1.3681637983333335,0.39921115256944006 -Ir2Cl4_11_8778.vasp,Ir2Cl4,-1.3671527033333335,0.7088025555555535 -Ta4C3F2_164_18012.vasp,Ta4C3F2,-7.176201924444445,0.1343406659999944 -Cu1Sb1Te6As2_143_4968.vasp,CuSbTe6As2,-1.4431788429999999,0.26722067583333187 -Cu1Bi1Te6P2_143_4857.vasp,CuBiTe6P2,-1.5706107169999999,0.3405306149999986 -Si3Mo1_191_16470.vasp,Si3Mo,-3.13021728,1.1013633649999992 -Na2Cl1_164_12050.vasp,Na2Cl,-1.15129398,0.3438898370833321 -Nd1Br2_123_13215.vasp,NdBr2,-2.4341479,-0.009172120000000117 -Mn2Sb2I2O4_10_11235.vasp,Mn2Sb2I2O4,-2.98546805,0.18812636724999976 -Sb1W1Br6_143_15523.vasp,SbWBr6,-1.24597357875,0.32091212171875 -I1N2O6_147_8158.vasp,IN2O6,-3.6356782311111115,0.25474562819443536 -Cd1S2_1_3417.vasp,CdS2,-0.9043156866666666,0.4625883872916655 -Te2As2O1_5_18355.vasp,Te2As2O,-2.66699056,0.23707223799999766 -Ru1Cl2_115_15265.vasp,RuCl2,-1.3938405266666667,0.7112642605555537 -K2Hg4S2I6O6_31_9178.vasp,K2Hg4S2I6O6,-1.4167520975,0.07199973261110748 -K1I2_25_8908.vasp,KI2,0.0045438499999999995,0.14860075499999986 -Ba2Ni2Sn2_129_2035.vasp,Ba2Ni2Sn2,-0.399542655,0.9534458816666654 -In2S5_1_8562.vasp,In2S5,-2.3715073757142853,0.17977426910714112 -Ba2In1Ag1Hg1O5_99_2008.vasp,Ba2InAgHgO5,-2.57167222,0.4540517652499977 -Hf2Te2_123_7642.vasp,Hf2Te2,-3.885193355,0.3088795618750002 -Sn1H2S2_164_16642.vasp,SnH2S2,-2.727313646,0.19734041400000024 -B18S9_143_1611.vasp,B18S9,-4.601625987407408,0.6544922937036985 -Pt4Se1S3I4_8_14709.vasp,Pt4SeS3I4,-1.452479015,0.11279764312500012 -In2Si2Se6_162_8604.vasp,In2Si2Se6,-2.627316844,0.047452477000000215 -Ni2Te5As2_8_13679.vasp,Ni2Te5As2,-1.2157756199999998,0.26630546749999895 -Sc1Ge5_47_15939.vasp,ScGe5,-2.963262411666667,-0.10776145166666695 -Ga13N2_12_6103.vasp,Ga13N2,-2.1968150226666667,-0.060283629333337085 -V2Ge2S6_162_20066.vasp,V2Ge2S6,-3.4277912200000005,-0.03997016143750587 -P1Ir2Se2S2I1_1_13925.vasp,PIr2Se2S2I,-2.37082259875,0.7139633498263853 -Au2Se4_14_1558.vasp,Au2Se4,-0.8003585183333333,0.4197178527777768 -Te2C1_115_18379.vasp,Te2C,-2.4698321566666666,1.2834668177777746 -Zr2Sb2Se6_12_21664.vasp,Zr2Sb2Se6,-3.155773554,0.23742923199999844 -Cu2H12C8O12_14_5108.vasp,Cu2H12C8O12,-4.856845098529412,0.3495406439705786 -Cd2S2Br1Cl1_1_3541.vasp,Cd2S2BrCl,-0.6794688566666666,0.11005273635416485 -Co2F6_189_3900.vasp,Co2F6,-1.8037599825,0.5912262325 -Ti6H4O14_4_19177.vasp,Ti6H4O14,-6.334857290833334,0.18958640590277742 -Sn1Pb1S1Br2_1_16669.vasp,SnPbSBr2,-1.6280114239999999,0.0738750705000003 -Sc2Se1N1Cl1_1_16151.vasp,Sc2SeNCl,-4.508159186,0.05203824033333038 -Cr1Ag1As2Se6_149_4097.vasp,CrAgAs2Se6,-2.043210953,0.798811248749995 -Ca6B2C2Br4N2_31_3255.vasp,Ca6B2C2Br4N2,-3.64748372125,0.12139718781249986 -Sr2I4O12_4_17257.vasp,Sr2I4O12,-3.0703130822222224,0.1377099805555555 -Fe1Cu1C5N6O3_99_5664.vasp,FeCuC5N6O3,-4.97149266875,1.0355391276302022 -Zr2B1Se2_164_21512.vasp,Zr2BSe2,-4.570464364,0.18950003000000093 -Sb1H1Se2O6_1_15455.vasp,SbHSe2O6,-3.825275567,0.05180489681249695 -Zr1Nb1S2Cl2_6_21352.vasp,ZrNbS2Cl2,-4.0810600883333334,-0.05099524611111894 -Cu2I6_189_5179.vasp,Cu2I6,0.5958748575,0.352433922447917 -Bi1I2_164_2342.vasp,BiI2,-0.15726697666666667,0.32994415722222176 -Te4Au4Cl4_14_18574.vasp,Te4Au4Cl4,-0.4063603125,0.3422531190624989 -Rb2Br1_164_14779.vasp,Rb2Br,-0.19133345000000002,0.11546291666666647 -La2Br2O2_129_9580.vasp,La2Br2O2,-4.877065436666666,0.08003800000000005 -Mg2Bi4_51_10433.vasp,Mg2Bi4,-0.8238505116666667,-0.13294870611111173 -Si1_123_16379.vasp,Si,-3.22898977,-0.23884072000000023 -Te4Mo2_127_18594.vasp,Te4Mo2,-1.0527516516666666,1.0581425983333332 -C2I6_1_2749.vasp,C2I6,-0.78312332375,0.96000480265625 -Al2Fe2Se5_187_837.vasp,Al2Fe2Se5,-2.5861238933333333,-0.3309355266666687 -V3Co3Te2O16_1_20256.vasp,V3Co3Te2O16,-4.546411394166666,0.010389300173607285 -B6Pd1I2N2F4_25_1786.vasp,B6PdI2N2F4,-3.9158833333333334,0.6404008267592476 -Na2Ta2Cl12_4_12310.vasp,Na2Ta2Cl12,-2.5681115525,0.049212170312499914 -Cr2Te6P2_162_4532.vasp,Cr2Te6P2,-2.164103442,0.4618499660000003 -Ta4I16_14_18054.vasp,Ta4I16,-1.474674365,0.21451980321875008 -Nb1Te2_115_12601.vasp,NbTe2,-2.7166362766666663,0.6722840844444447 -Ba2Hg1_123_2000.vasp,Ba2Hg,0.7721885466666666,0.2494907633333332 -Cd2H4S10_31_3511.vasp,Cd2H4S10,-2.212656193125,0.16635526664062517 -As1Se2_187_1180.vasp,AsSe2,-2.117859176666667,0.43849309472221987 -Cr2Ag1S6_1_4290.vasp,Cr2AgS6,-2.4211177455555557,0.3939958065624954 -Cd2P4H12O14_2_3529.vasp,Cd2P4H12O14,-4.319139451875,0.07549353378471535 -Ba2Au1Se2F2_38_1913.vasp,Ba2AuSe2F2,-2.150884797142857,0.5499374047767812 -Fe1Si2_123_5758.vasp,FeSi2,-2.8002550566666664,0.6012436108333339 -Mn2C2Cl2_59_11044.vasp,Mn2C2Cl2,-3.3538096016666668,0.6095282783333292 -Sc2Te4_127_16182.vasp,Sc2Te4,-1.98346936,0.844892515277776 -Cr2B1H2S2_164_4320.vasp,Cr2BH2S2,-3.4698940685714286,0.6309036634999963 -Al2Te2F2_59_1002.vasp,Al2Te2F2,-2.584446855,0.42168179291666386 -Fe1B4I2N2F4_47_5627.vasp,FeB4I2N2F4,-4.01562002,0.2758526830288387 -Rh2Pb8_125_15211.vasp,Rh2Pb8,-1.072800869,0.5532942410000001 -Mn4B3H2S2_156_11422.vasp,Mn4B3H2S2,-3.6288269654545457,0.35950419965908764 -Co1H4C2N4Cl2_47_3749.vasp,CoH4C2N4Cl2,-4.539458982307692,0.07702608910255833 -Ga1Cu1Se3Br1_1_6178.vasp,GaCuSe3Br,-1.3698226616666667,0.30278977642360755 -Mo1I1Br1_156_11514.vasp,MoIBr,-1.16745488,0.4314384223611112 -Ti1O2_115_18820.vasp,TiO2,-6.90540394,0.35845058499999993 -P2Br2_12_13961.vasp,P2Br2,-2.0226015225,0.1896708091666648 -Tl2As2_129_19365.vasp,Tl2As2,-1.03868777,0.48011286175 -Mg1Al1F5_47_10329.vasp,MgAlF5,-3.1493074757142856,0.4707774349999967 -Na2Os2C2I8O4_7_12245.vasp,Na2Os2C2I8O4,-2.5567027144444445,0.1668158028472196 -Ti4N3O2_164_19145.vasp,Ti4N3O2,-7.918434028888888,-0.2462286372222282 -Ga1N1Cl2_10_6211.vasp,GaNCl2,-2.52320835,0.3167087137499921 -Pt2S1I2F1_1_14651.vasp,Pt2SI2F,-0.9989488350000001,0.45778544444443897 -As2Pb6_191_1264.vasp,As2Pb6,-0.6552474775,1.0427548374999986 -Cu2Bi2O4_11_5039.vasp,Cu2Bi2O4,-2.761227645,0.4615387894531252 -Ru2Br2N1O1_1_15297.vasp,Ru2Br2NO,-2.9124339549999996,0.4620067606944369 -As2Pb2O6_1_1256.vasp,As2Pb2O6,-3.7970172910000004,0.3684079634999997 -Pr4Br10_11_14557.vasp,Pr4Br10,-2.4403432,0.09933625071428542 -Ba1Te2H2_12_1867.vasp,BaTe2H2,-2.234840574,0.9681185783333335 -Mn2Mo2S8I2_129_11147.vasp,Mn2Mo2S8I2,-2.272506197142857,0.7274393627678537 -Rh2Se4_14_15246.vasp,Rh2Se4,-1.9376609083333334,0.736009598333333 -Ge6N6_12_6963.vasp,Ge6N6,-4.7765666925,0.1308767099999999 -Li4Cr2P8O26_2_10176.vasp,Li4Cr2P8O26,-5.4138271445,0.005581396756244694 -Hg2Sb2S4I2_11_8010.vasp,Hg2Sb2S4I2,-1.041535948,0.1957232448999982 -B3W4F2_164_1742.vasp,B3W4F2,-5.278041838888889,0.34115977592591973 -Mn2I1Br1F2_1_11107.vasp,Mn2IBrF2,-1.7982290283333333,0.1090780039583322 -Nb2C1Se2_164_12665.vasp,Nb2CSe2,-5.707715564,0.030014795999999677 -Ca1Sn1Te1Cl3_1_2885.vasp,CaSnTeCl3,-1.6421521616666668,0.0035652068055549158 -Ni2Se2_123_13643.vasp,Ni2Se2,-0.83041426,-0.03424665500000057 -Co3Sn1Te2_187_4073.vasp,Co3SnTe2,-1.46571696,0.22483321388888733 -Ba2Sb1_164_2053.vasp,Ba2Sb,-1.1382581066666666,0.4428147633333319 -Eu2I2O2_129_5603.vasp,Eu2I2O2,-4.5067809316666665,-0.9734644318750028 -Te2P4O12_18_18445.vasp,Te2P4O12,-4.302891424444444,0.7283458909259185 -Sn2S2F2_59_16838.vasp,Sn2S2F2,-2.3918406083333332,0.25786649291666675 -Li2Ag1Sn2_115_9818.vasp,Li2AgSn2,-1.002092078,0.3147858240000001 -Cr2O5F2_12_4441.vasp,Cr2O5F2,-3.61330623,0.3009877765277742 -Zr1P2_187_21396.vasp,ZrP2,-3.9886508500000004,1.1308956474999996 -Tm2Cl2O2_59_19675.vasp,Tm2Cl2O2,-4.983059776666667,0.11416524000000017 -Zn1Mo2Br1Cl1O3_8_20972.vasp,ZnMo2BrClO3,-3.01407012625,0.45812331316406246 -Hf1Mg6B1O7_99_7205.vasp,HfMg6BO7,-4.442756287333333,0.10440088983332574 -Mn4Se8_2_11454.vasp,Mn4Se8,-2.3041674366666665,-0.009143823333332968 -Si2Bi6_164_16389.vasp,Si2Bi6,-1.486588725,-0.3889004662500001 -Ti1H2O2_164_18789.vasp,TiH2O2,-5.32025973,0.9683568790000012 -V8O18_85_20399.vasp,V8O18,-5.475580336923077,0.08424154961538477 -Zn2Bi4Cl4O6_31_21043.vasp,Zn2Bi4Cl4O6,-2.5403214225,0.23308246937499988 -Na4P4S8_29_12405.vasp,Na4P4S8,-2.925753229375,0.15811188111606844 -Nb2Pt1O6_12_12821.vasp,Nb2PtO6,-5.811173626666667,0.02839471083332823 -Ag4I4O12_7_529.vasp,Ag4I4O12,-2.0205157145,0.0831505147499998 -Co2H4S10_4_3914.vasp,Co2H4S10,-2.724380075625,0.3255254302083304 -Ru3S3Cl6_8_15367.vasp,Ru3S3Cl6,-2.1855074941666666,0.15186879484648896 -Ga2Ge2S6_162_6364.vasp,Ga2Ge2S6,-2.9472913640000002,-0.0892476389375032 -Ta4S6_11_18105.vasp,Ta4S6,-5.503200566,-0.15432951550000507 -Cd1Pd1S2_1_3402.vasp,CdPdS2,-0.929867795,0.49590473062499996 -Zn1Pt1Se1S1I2_1_20997.vasp,ZnPtSeSI2,-0.8252927833333333,0.2402157889583333 -Ga1Sn1S2Cl2_1_6284.vasp,GaSnS2Cl2,-2.047036585,0.20019787208333345 -Hg1Br2_1_7845.vasp,HgBr2,0.55228483,0.12536749666666663 -Cu2H8C6N2Cl2_2_5147.vasp,Cu2H8C6N2Cl2,-4.5763948135,0.39172769599999846 -Cd2Te2_164_3598.vasp,Cd2Te2,0.48581483,-0.383560925 -Co2O6_31_3952.vasp,Co2O6,-3.5377164125,-0.3755506393750001 -Cd2I2_2_3522.vasp,Cd2I2,1.050843955,-0.06898717083333339 -Cs2Ru2I8N2O4_7_4772.vasp,Cs2Ru2I8N2O4,-2.046400076111111,0.2952456961111092 -Cu2O2_123_5198.vasp,Cu2O2,-1.827707855,0.645080643125 -Ge12Ir4_127_6632.vasp,Ge12Ir4,-3.27813258625,0.1199956045833308 -Cd2Pd4Se6_164_3534.vasp,Cd2Pd4Se6,-0.9572762524999999,0.06613836083333235 -Na2Os2N2Cl10O2_1_12250.vasp,Na2Os2N2Cl10O2,-2.5817887388888887,-0.14602088767361787 -Ti4B3H2_164_19121.vasp,Ti4B3H2,-5.775859233333333,0.12208581749999503 -In2Ni2O5_164_8494.vasp,In2Ni2O5,-3.0443818322222223,0.010849861249996984 -Ti1Te1Br1_156_18853.vasp,TiTeBr,-3.24415698,0.1714791533333262 -In1Ga1S2Br2_1_8257.vasp,InGaS2Br2,-1.9374477316666667,0.07378688354166285 -Ti2S2_129_19001.vasp,Ti2S2,-5.32076821,-0.12395458999999942 -V1W1Se2_8_19959.vasp,VWSe2,-3.6233433275,0.3721458408333276 -Cd2Sn1O4_21_3579.vasp,Cd2SnO4,-2.092549264285714,0.21850653642857143 -Al4Sb8Te8Br2Cl16_13_1092.vasp,Al4Sb8Te8Br2Cl16,-1.8308847965789474,0.1315848735526257 -In2Se2_12_8588.vasp,In2Se2,-1.732867855,0.17054750750000003 -Al1S2_115_725.vasp,AlS2,-3.178940966666667,0.37345129968749685 -Ga2Si2S6_162_6489.vasp,Ga2Si2S6,-3.315244548,0.15577958199999786 -Hg3As1Se4I1_156_8047.vasp,Hg3AsSe4I,-0.4126374688888889,-0.09697787208333469 -Ga2Se4_12_6485.vasp,Ga2Se4,-2.0699817350000003,0.3621762438888865 -K4Hg1As2_156_9457.vasp,K4HgAs2,-0.13318068142857142,0.20449148285714286 -Sb1W1S1Cl3_1_15524.vasp,SbWSCl3,-2.1535770666666667,0.5621927433333301 -Ir2S2I2_11_8819.vasp,Ir2S2I2,-2.206260138333333,0.14416319222222018 -Mn1In1I1Br1_1_10774.vasp,MnInIBr,-0.73213587,0.5050252369073276 -N1_123_11777.vasp,N,-4.02173352,1.5120171025000007 -Rh2I1Br1_156_15193.vasp,Rh2IBr,-0.986667975,0.6005064091666652 -Ag2H4C4N2Cl2_2_274.vasp,Ag2H4C4N2Cl2,-4.222113020714286,0.25439405142856086 -Li2Nb1_187_10010.vasp,Li2Nb,-2.5984995466666665,0.5623043877777754 -Li1Mn1Te2_156_9747.vasp,LiMnTe2,-1.6754300325,-0.7785549485775862 -Ta4Co4S8_53_18025.vasp,Ta4Co4S8,-4.228638410625,0.2556358031250001 -Na1Fe1Sb2Te6_5_11854.vasp,NaFeSb2Te6,-1.378889249,0.33592800889999674 -Nb1Sb1As1_156_12564.vasp,NbSbAs,-3.8034113,0.5319333158333294 -Li2Cr4O10_59_9876.vasp,Li2Cr4O10,-4.79888432625,-0.07457425326822886 -Ta2I4Cl4_47_17760.vasp,Ta2I4Cl4,-2.2450506359999998,0.08096528400000036 -Ce2Sb4Se8_12_3678.vasp,Ce2Sb4Se8,-2.485143259285714,0.48413276821428375 -In1Br2_115_8211.vasp,InBr2,-0.7208902233333333,0.31055998708333343 -Bi4Au3Cl20_2_2594.vasp,Bi4Au3Cl20,-0.7878026877777777,0.1446075558796289 -Fe1C6Br2N2F4_25_5649.vasp,FeC6Br2N2F4,-4.684098612666667,0.10473249109721602 -V4B3S2F2_164_20306.vasp,V4B3S2F2,-4.051432018181818,0.5569329501731524 -Ba2Sb4O12_2_2055.vasp,Ba2Sb4O12,-3.9943081583333333,0.6523595538888882 -Co2Te4H2_1_4046.vasp,Co2Te4H2,-1.8145847375,0.6249326770833334 -Tl1Sb2Au1S6_149_19339.vasp,TlSb2AuS6,-1.8122667700000001,0.35536092337499714 -Al1Ni1Br1Cl1O2_1_688.vasp,AlNiBrClO2,-2.9276161283333333,0.00446117833332813 -Fe1H4C2N6F2_6_5697.vasp,FeH4C2N6F2,-4.6223179739999996,0.44278130597221055 -Mn1Co2O6_12_10675.vasp,MnCo2O6,-3.9425567288888885,-0.3895091980555584 -Mg8Pb4_1_10602.vasp,Mg8Pb4,-0.2572399025,-0.5074328758333333 -Cr1I2O1_47_4199.vasp,CrI2O,-2.2619505125,-0.009829861197920078 -Na2Ag1S2_12_11961.vasp,Na2AgS2,-1.36990465,0.3575983660833316 -Sc8Se4S1I6Cl1_1_16280.vasp,Sc8Se4SI6Cl,-2.8545677365,0.04869018591666402 -H1Ir2Rh1O6_8_6983.vasp,HIr2RhO6,-3.966709547,0.48183715000000094 -Ag2Bi2O4_10_191.vasp,Ag2Bi2O4,-2.3899175125,0.2969802707500002 -H8Pd1C6O4_10_7096.vasp,H8PdC6O4,-4.969123188421053,0.4003733296491177 -Ti3B2H2Se2_187_19061.vasp,Ti3B2H2Se2,-4.943108825555556,0.00823424638888004 -Hg2C4N4O4_55_7951.vasp,Hg2C4N4O4,-4.391091665,0.7197130711371049 -Ag1Te1S1_1_142.vasp,AgTeS,-0.7184135700000001,0.4492794920833321 -Bi2W4Cl16O4_2_2585.vasp,Bi2W4Cl16O4,-2.8256958584615384,0.06153044500000027 -Fe1Ag1I2N2_1_5613.vasp,FeAgI2N2,-1.66222282,0.436171048888887 -Pt2Br4_11_14603.vasp,Pt2Br4,-0.465421695,0.31687047249999994 -V2Au2S8_51_19984.vasp,V2Au2S8,-2.4511214999999997,0.25386403888888687 -Cu2H2_164_5114.vasp,Cu2H2,-1.240917015,1.9661694525 -Hf2Se2Cl2_59_7603.vasp,Hf2Se2Cl2,-4.072743241666667,-0.04955096104167067 -Sb2S2Br2_11_15672.vasp,Sb2S2Br2,-1.9813919266666666,-0.7059962449999999 -Co1I2_187_3777.vasp,CoI2,-0.020390966666666666,0.522827464444444 -Ta2I1N1Cl1_8_17753.vasp,Ta2INCl,-5.010345288,0.4270910236666503 -Re2S2_164_15077.vasp,Re2S2,-4.9941116275,0.6359438256250005 -Ge2Sb2S6_2_6855.vasp,Ge2Sb2S6,-2.66415814,0.31725485679166454 -Ag2Sn2O6_51_447.vasp,Ag2Sn2O6,-2.805272107,0.35830049099999917 -Cr2F6_191_4382.vasp,Cr2F6,-2.89221260625,0.15401756249999998 -Sn3Sb2O9_174_16928.vasp,Sn3Sb2O9,-3.9594403828571427,0.36473290232142475 -Hf1Ga2Ge1S4I1Br3_1_7169.vasp,HfGa2GeS4IBr3,-2.6413754341666666,0.15059805020832506 -Sb1As1Au2Cl2O6_1_15429.vasp,SbAsAu2Cl2O6,-2.4536893025,0.37221856840277645 -Mn2Al2Se5_164_10958.vasp,Mn2Al2Se5,-2.663957168888889,-0.016626984157090685 -Cr1H5N4O6_1_4194.vasp,CrH5N4O6,-4.4644144025,0.21926798241666168 -Ni1P1O3_1_13387.vasp,NiPO3,-3.85216485,0.7389218735000003 -Ho2Sb2S4O2_129_8147.vasp,Ho2Sb2S4O2,-4.34274873,0.01228833362499504 -Pr2Br2_164_14544.vasp,Pr2Br2,-2.3278995025,0.11110639937499978 -Li2V2Cu2O8_51_10113.vasp,Li2V2Cu2O8,-4.020673000714286,0.40525466196427423 -Cr1S1F2_47_4241.vasp,CrSF2,-2.88729174,0.22758874078124738 -Hf2V1I1Cl1O4_1_7660.vasp,Hf2VIClO4,-5.477100464444444,0.28972486648147555 -Cu2Se2_164_5305.vasp,Cu2Se2,-0.7525580725,0.15811411333333347 -Ge2Br6_1_6758.vasp,Ge2Br6,-1.18607798375,0.16213391296874857 -Bi4Rh6S4_12_2637.vasp,Bi4Rh6S4,-2.3720127664285715,0.19127733785714263 -Ti6H4O14_11_19174.vasp,Ti6H4O14,-6.21750778375,0.3069359129861109 -Sr2Br4_51_17157.vasp,Sr2Br4,-1.6841761033333331,0.15899291333333365 -Mg3Si2O9_8_10565.vasp,Mg3Si2O9,-4.904320139285715,0.3415524018749951 -Ti1I4_123_18798.vasp,TiI4,-1.294270502,0.32876259299999977 -As2S2O1_5_1291.vasp,As2S2O,-3.3021829240000002,0.5392262189999963 -In2P2O6_1_8518.vasp,In2P2O6,-4.666168162,0.13110193107142454 -Li1Fe1F4_81_9694.vasp,LiFeF4,-2.3711378716666665,0.40980227333333374 -Al18Se9_143_590.vasp,Al18Se9,-2.3115160444444447,0.4620502738888861 -Mg1Cr2F12_2_10353.vasp,MgCr2F12,-2.7458593873333332,0.04485844466666444 -K2C2O6_4_9016.vasp,K2C2O6,-4.73640908,0.12720502100000086 -Mo2C2Cl2_59_11588.vasp,Mo2C2Cl2,-3.9307844716666662,0.5102114372222157 -Ga1Ge1Se3_174_6194.vasp,GaGeSe3,-2.07695015,0.45934537066666403 -Y4S6_1_20836.vasp,Y4S6,-4.949527315,0.4586841697499997 -K4P4H12O12F4_7_9490.vasp,K4P4H12O12F4,-4.120507721944445,0.07251874433332561 -Si1Br4_123_16323.vasp,SiBr4,-1.017413596,0.5496963720000001 -Bi2Se2S1_164_2545.vasp,Bi2Se2S,-2.18521419,0.06297390000000025 -Cu2Ge4P6_6_5101.vasp,Cu2Ge4P6,-2.9732802541666667,0.19172753750000027 -Te1Mo1Os1I1Br4_1_18300.vasp,TeMoOsIBr4,-1.3527952825,0.281375036171873 -V2Ni1S4_164_20115.vasp,V2NiS4,-3.1777890285714285,0.04371767198412124 -Zn2Au2Se4_1_21039.vasp,Zn2Au2Se4,-0.30727397,0.380787846875 -In2S2_164_8553.vasp,In2S2,-2.213887635,0.06578253000000034 -Cd2P4H8O8_13_3530.vasp,Cd2P4H8O8,-3.981582676818182,0.08040145949493871 -Ti3C2Cl2_187_19072.vasp,Ti3C2Cl2,-6.21903452,-0.1414805500000056 -Ag2S4O1_21_392.vasp,Ag2S4O,-1.3666501885714286,0.7040976815624984 -Dy2S2I2_164_5531.vasp,Dy2S2I2,-3.2494456316666667,0.03786850833333322 -Ti4Cl4O4_7_19134.vasp,Ti4Cl4O4,-5.321385005,0.21185222777777302 -Mn1Sb1Se2_1_10863.vasp,MnSbSe2,-1.8825650875,0.38079210625000026 -Re1Se2_115_15021.vasp,ReSe2,-3.472476206666667,0.6892876316666663 -Hf1Ir1Br4Cl2_1_7204.vasp,HfIrBr4Cl2,-2.1027363925,0.3345879152604125 -Te2P2H2O10_4_18436.vasp,Te2P2H2O10,-4.66996311625,0.042611306302078766 -Zr2Se1I2_8_21671.vasp,Zr2SeI2,-2.641467608,0.13226833500000024 -Tl2In2P4Se12_2_19448.vasp,Tl2In2P4Se12,-2.2637895035,-0.13471121649999995 -Zr1Mn1F6_1_21321.vasp,ZrMnF6,-3.7479311075,0.10517946999999994 -Cd3F6_143_3614.vasp,Cd3F6,-1.1618309088888887,-0.012865562222222016 -Hf2Ag1S3I1Br3_1_7424.vasp,Hf2AgS3IBr3,-2.768333544,0.2956915904999957 -Zr1F2_115_21283.vasp,ZrF2,-3.7313778266666664,0.7688290566666626 -Ag2H4C6Br2_1_278.vasp,Ag2H4C6Br2,-4.081927889285714,0.3985795421428566 -Tl1S1_156_19330.vasp,TlS,-0.94742392,0.6483997610937501 -Mo2Cl10_6_11592.vasp,Mo2Cl10,-1.2390051225,0.2876526395833334 -B6H4Pd1C2I2_6_1778.vasp,B6H4PdC2I2,-3.8929577353333333,0.7129710228675105 -Ru1S2_115_15291.vasp,RuS2,-2.9900147666666665,0.6247287616666668 -V1Ag1I1Br1_6_19752.vasp,VAgIBr,-0.525622155,0.36219495833333337 -Zr2F4_11_21562.vasp,Zr2F4,-4.040016021666667,0.4601908616666618 -Ca4Pb4I16_14_3234.vasp,Ca4Pb4I16,-0.8232406170833334,0.17331789830555544 -Ag2S4_14_393.vasp,Ag2S4,-1.2863194233333333,0.23179481968750015 -Ge1W1Se2I3Br1_1_6723.vasp,GeWSe2I3Br,-1.51906313375,0.19260024312500001 -Ti3B2O2_187_19064.vasp,Ti3B2O2,-6.6966769514285716,0.23597187047618462 -Ge2S1Br2_1_6821.vasp,Ge2SBr2,-2.216096422,-0.3287740324999999 -Sb2Br6_150_15554.vasp,Sb2Br6,-0.98616822,0.11267040125000005 -Sr1Cu1S1Br2F1_1_17041.vasp,SrCuSBr2F,-1.5971493233333334,0.3640232912698391 -Si4As4S4_17_16483.vasp,Si4As4S4,-3.6638488408333334,-0.6291616299999998 -Tl2Fe2Se4_12_19417.vasp,Tl2Fe2Se4,-1.24464858625,0.35413534888888865 -Hf2Se10_59_7592.vasp,Hf2Se10,-3.2057245066666664,0.07483548333333356 -H2Rh1_187_7024.vasp,H2Rh,-2.737053553333333,1.5074345899999968 -Hg3As1S4Cl1_156_8045.vasp,Hg3AsS4Cl,-0.8297840922222223,0.24821553208333044 -Na2N2O6_2_12219.vasp,Na2N2O6,-4.331569995000001,0.078291576999999 -Ca2Cu1Se2Cl2_38_3003.vasp,Ca2CuSe2Cl2,-1.72337434,0.17760656738094904 -Ni1H2_187_13328.vasp,NiH2,-1.8111412566666667,1.4070156583333306 -In3S1I2_1_8655.vasp,In3SI2,-1.0671570750000001,0.3580201599999987 -Sr2Bi4S8_11_17147.vasp,Sr2Bi4S8,-2.5950575021428572,0.16720949285714282 -Ir2O6_31_8802.vasp,Ir2O6,-3.41994958625,0.9025978803125001 -Sr4Ga2Bi4O14_4_17439.vasp,Sr4Ga2Bi4O14,-4.061773536666666,0.1551222943749928 -Li1Au1I4_2_9657.vasp,LiAuI4,-0.23749428333333333,0.07270717083333311 -Ta2H2C1_164_17745.vasp,Ta2H2C,-6.10193268,0.3150368604999998 -Cs2H2C2O6_4_4712.vasp,Cs2H2C2O6,-4.805504945,0.09745957916666637 -Ag2H8C12N10_2_287.vasp,Ag2H8C12N10,-5.8053580459375,-1.4521460664062535 -Lu2S2I2_59_10315.vasp,Lu2S2I2,-3.1989039600000004,0.04878457833333316 -Y3H2C2S2_187_20795.vasp,Y3H2C2S2,-5.0350719433333335,0.49536127444443356 -Li1Ga1Sb2O6_5_9714.vasp,LiGaSb2O6,-3.815675074,0.6676638635833294 -Li2Fe2P4O14_2_9911.vasp,Li2Fe2P4O14,-4.447254885909091,0.7191833668181822 -In1N1_187_8280.vasp,InN,-3.20141852,0.8307533512500003 -Hg2Se2I2_59_8018.vasp,Hg2Se2I2,0.349667855,0.2997605710416653 -Rb2Cd4Te2S6F6_31_14829.vasp,Rb2Cd4Te2S6F6,-1.356075237,0.2547107813958309 -In1Cu1Se2_6_8238.vasp,InCuSe2,-1.2442133475,0.2900841300000001 -Cd1Pb2S2I2_12_3396.vasp,CdPb2S2I2,-1.0497989728571429,-0.3368544570238108 -Hf1Se1I1Cl1_6_7304.vasp,HfSeICl,-3.010009745,0.31852458203125034 -Fe2Te4As2Br2_26_6009.vasp,Fe2Te4As2Br2,-1.507807093,0.20240464522221935 -Co2O2_6_3949.vasp,Co2O2,-3.078727815,-0.11156006499999993 -Hf2Au1I2O2_8_7433.vasp,Hf2AuI2O2,-4.075977921428572,0.29755384964285225 -Mn2Mo1Se1Cl6_1_11133.vasp,Mn2MoSeCl6,-1.7855102509999998,0.17614084775000022 -P4O6_59_14089.vasp,P4O6,-4.959697507,0.29910624660000096 -Ni2Mo2Cl2O8_129_13535.vasp,Ni2Mo2Cl2O8,-3.417976825,0.07910419901785212 -Mn2Sb2Te6_12_11261.vasp,Mn2Sb2Te6,-1.5505622159999999,0.2758537356666647 -Ga2S5_12_6456.vasp,Ga2S5,-2.678716787142857,0.15576279124999748 -Ti2P2S6_162_18982.vasp,Ti2P2S6,-4.283836079,0.18965755224999548 -N2Cl10_51_11778.vasp,N2Cl10,-0.3973334775,0.6943542783333297 -Mg1Cu1O2_115_10354.vasp,MgCuO2,-2.9791781575,0.21072016906250024 -Nb4Zn4Sb2O16_1_13185.vasp,Nb4Zn4Sb2O16,-4.829121248846154,0.23008505391024736 -Sb2Se2I2_59_15694.vasp,Sb2Se2I2,-1.4989479033333335,0.10019543750000004 -Sn2S2Br1Cl1_6_16835.vasp,Sn2S2BrCl,-1.8263085666666665,0.18583381791666698 -In1Au3S4Br4_6_8206.vasp,InAu3S4Br4,-0.7559128216666666,0.29832879631944353 -Pd2Se6_11_14502.vasp,Pd2Se6,-1.71466381375,0.2485858858333333 -Ru1S1Br2_47_15285.vasp,RuSBr2,-1.6959656875,0.3654490374999999 -Mo2S6_11_11677.vasp,Mo2S6,-3.15343130625,0.32562885734375024 -Fe2Te4P2Cl2_10_6017.vasp,Fe2Te4P2Cl2,-1.747342582,0.21961139358333237 -Co1H4C6N2Cl2_25_3763.vasp,CoH4C6N2Cl2,-5.247043595333333,0.21138451716666085 -Sn2Sb1S6_162_16849.vasp,Sn2SbS6,-2.558845608888889,0.10756945774305049 -Cd2Te6Pd4_164_3602.vasp,Cd2Te6Pd4,-0.6150715833333333,-0.11718126416666708 -Si6Sb2_191_16542.vasp,Si6Sb2,-2.64294358875,0.17055996687499997 -K4Ba4Sb4Se12_14_9415.vasp,K4Ba4Sb4Se12,-2.1745394325,0.10851847640624768 -Hg1S1I1F1_156_7908.vasp,HgSIF,-0.25459139,0.2969299834114574 -Pb1I2_115_14187.vasp,PbI2,-0.40716255,0.31334321611111116 -Zn2B4H16_26_21041.vasp,Zn2B4H16,-3.3320707827272726,0.009771334545454202 -Bi16F4_10_2307.vasp,Bi16F4,-1.4595793925,-0.31846129866666895 -Cu2W1O4_111_5361.vasp,Cu2WO4,-3.6785040642857143,0.6058007083928509 -Hf1H1Se1Cl1_156_7189.vasp,HfHSeCl,-3.45691641,0.6491601192187504 -Sr3Ag2Cl2O4_123_17344.vasp,Sr3Ag2Cl2O4,-2.771140840909091,0.044943699025971395 -Mg1Mn2S5Cl2_1_10387.vasp,MgMn2S5Cl2,-2.328239808,0.5701637419374976 -Ca1Ga1S1I1Cl1_1_2836.vasp,CaGaSICl,-1.872194718,0.3203486008999971 -V4S6_11_20363.vasp,V4S6,-3.8868266769999997,0.09384548000000015 -Mn1P2O2_1_10837.vasp,MnP2O2,-4.135504378,0.7067388847037002 -Hf2Cl8_13_7483.vasp,Hf2Cl8,-3.0984513199999997,0.06674734350000033 -Cr2Cu2O8_51_4366.vasp,Cr2Cu2O8,-3.8133569291666665,-0.020568869895839725 -Rb2Hg4S8I6_31_14875.vasp,Rb2Hg4S8I6,-0.508805584,0.24038699706250022 -Mg2Sb4O10_2_10507.vasp,Mg2Sb4O10,-4.301163494375,0.17594077218749993 -Ba4Mn2I2O6_129_2162.vasp,Ba4Mn2I2O6,-3.7153096014285714,0.1320122888485202 -V4B3H2_164_20304.vasp,V4B3H2,-4.561576386666667,0.47807880444443906 -Nb2Se4I4_12_12886.vasp,Nb2Se4I4,-2.391425282,0.059959480999999926 -Na2Ru2C2S4Br8_7_12277.vasp,Na2Ru2C2S4Br8,-2.093513376111111,0.24162862555555364 -K2Y1O2_164_9389.vasp,K2YO2,-3.8143725760000002,0.19306142800000003 -Cu2Se1_191_5296.vasp,Cu2Se,-0.15607415666666666,0.2596232424999989 -Li2V2Au4S12_4_10111.vasp,Li2V2Au4S12,-2.125655733,0.280588385944442 -Nb1Br2_164_12481.vasp,NbBr2,-2.6469954666666666,0.3143140545833295 -Al2Tl2Se6_31_1029.vasp,Al2Tl2Se6,-2.070496987,0.29637640866666487 -K2H6C6S6_1_9146.vasp,K2H6C6S6,-4.178978851,0.21942905449999217 -Hg1H1Br1O1_156_7858.vasp,HgHBrO,-1.49628528,0.15646167854166726 -Sr2Mg4_51_17274.vasp,Sr2Mg4,0.5080132199999999,0.4570837291666666 -Hg4F8_115_8073.vasp,Hg4F8,-0.17492661416666666,0.27181694166666664 -Cu1Pt2Se5Br1Cl1_1_4945.vasp,CuPt2Se5BrCl,-1.354943987,0.2981407587499998 -Ge2Cl2F2_129_6764.vasp,Ge2Cl2F2,-2.4751984016666664,0.08074530250000045 -Ag2Mo1O4_1_325.vasp,Ag2MoO4,-3.0089994771428574,0.2989141249999996 -Ga3Se1S2Cl4_1_6536.vasp,Ga3SeS2Cl4,-1.942517831,0.2555686974166648 -Na2Ru2I8N2O4_7_12279.vasp,Na2Ru2I8N2O4,-2.135110363888889,0.13887004756944232 -Ga1Au1S2I1Cl1_1_6138.vasp,GaAuS2ICl,-1.1971924983333333,0.27100274171874755 -Hf4S2N3_164_7805.vasp,Hf4S2N3,-7.155564744444444,-0.02814566500000737 -Cs1Br2_25_4635.vasp,CsBr2,-0.18840868333333335,0.5833719670833326 -Hg2C2S2N2Cl2_31_7949.vasp,Hg2C2S2N2Cl2,-2.898910462,0.1946824925208267 -Ta2S4F4_12_17860.vasp,Ta2S4F4,-4.353005628,0.13590512917499753 -V4S2_129_20360.vasp,V4S2,-3.805975945,0.13245762482142465 -Ba5Tm1_1_2203.vasp,Ba5Tm,0.260957265,0.9368533491666651 -Mn3Hg2O8_10_11389.vasp,Mn3Hg2O8,-3.1371957676923077,0.20513167461538462 -W1S1Br2_47_20447.vasp,WSBr2,-2.4114425275,0.33127440239583317 -Tl1Co5Br2_123_19245.vasp,TlCo5Br2,-0.70533932375,0.5720063299999989 -Ba2Ni2F8_31_2033.vasp,Ba2Ni2F8,-2.6134825308333336,0.10905862916666642 -As4O6_81_1333.vasp,As4O6,-4.366867581999999,0.11836999000000059 -V4Cl16_14_20318.vasp,V4Cl16,-1.821249762,0.03020202400000005 -P1Se1Br1_156_13946.vasp,PSeBr,-1.8533905333333334,0.3591940504444428 -Zn4C8S8N8_2_21214.vasp,Zn4C8S8N8,-4.692433554642856,0.05470755702975011 -Sr2C2O6F2_59_17160.vasp,Sr2C2O6F2,-4.968647211666666,0.245633154270823 -Fe1Te1S1_156_5765.vasp,FeTeS,-1.5593445566666666,0.28576074888888736 -Ru1Au1Br2O2_6_15257.vasp,RuAuBr2O2,-1.73606986,0.654672128541667 -P4F12_14_14079.vasp,P4F12,-3.195263756875,0.13593719562499995 -V2Br1N1Cl1O1_6_19999.vasp,V2BrNClO,-4.131436618333333,0.055725225763879754 -Nb1As2_187_12466.vasp,NbAs2,-4.25203118,0.526901473333333 -Ag2I6_191_322.vasp,Ag2I6,0.68590563875,0.3215335021875 -Ag2Se2F2_59_432.vasp,Ag2Se2F2,-0.7147263349999999,0.1669334676190462 -Zn1I2_187_20960.vasp,ZnI2,0.6616744366666667,0.34499659875000005 -Ca2N2_164_3072.vasp,Ca2N2,-3.188712535,0.8850732671874999 -Li2Cu1F5_6_9879.vasp,Li2CuF5,-2.351218755,-0.036975876875000147 -Cu2H8C8Br2_2_5149.vasp,Cu2H8C8Br2,-4.454482636,0.3093089949999995 -Ca2S4Br4F8_30_3106.vasp,Ca2S4Br4F8,-1.7550624611111112,0.6046102627777744 -Hg2H4Se2S8_31_7968.vasp,Hg2H4Se2S8,-1.973147500625,0.022509340078124773 -Te4Cl4_12_18583.vasp,Te4Cl4,-1.00899982625,0.19469590796875003 -Pr2N2O10_4_14548.vasp,Pr2N2O10,-5.012639184285715,0.15027326392856621 -Al2Si4H1O12_12_990.vasp,Al2Si4HO12,-6.026148040526316,-0.10251946417764257 -Pb2C2N4_11_14231.vasp,Pb2C2N4,-5.60467167375,-0.36058963895833956 -Te2Pt2O6_11_18485.vasp,Te2Pt2O6,-3.2329873630000003,0.2040912074999973 -Pb4S4_28_14317.vasp,Pb4S4,-2.06273876,-1.3896053149999998 -Al2Ga1S3I1Cl1_8_842.vasp,Al2GaS3ICl,-2.58144802875,0.23720021726562468 -K2Ru2N2Cl8O4_31_9322.vasp,K2Ru2N2Cl8O4,-2.5520627016666664,0.18892613138888426 -Ag2S4I2_4_391.vasp,Ag2S4I2,-1.02194690125,0.11325884593750013 -Cu2S4Br2_4_5256.vasp,Cu2S4Br2,-1.3426687675,0.0773736625000001 -Pd1C8Cl2F4_25_14355.vasp,PdC8Cl2F4,-4.52288071,0.5449638462222164 -Cr2P2O10_129_4446.vasp,Cr2P2O10,-5.205862874285714,-0.04223618315476435 -Y1Mn1Se2Cl2_1_20653.vasp,YMnSe2Cl2,-2.936535455,0.2329807652083261 -Na2Pd3O4_6_12268.vasp,Na2Pd3O4,-2.2577779322222225,0.5095000185185156 -Tl2In2Cl8_10_19444.vasp,Tl2In2Cl8,-1.2504198758333334,0.0889214552777765 -Mn1S1I1Br1_1_10850.vasp,MnSIBr,-1.28276262,0.36323666359375006 -Si6P6_2_16538.vasp,Si6P6,-4.2916013175000005,0.10494034166666566 -Al4As4_127_1057.vasp,Al4As4,-2.52562576,-0.21220025999999992 -Ta2N1O2_164_17780.vasp,Ta2NO2,-7.596410822,0.2676249626666598 -Nb2Co4Se4_51_12698.vasp,Nb2Co4Se4,-3.1362693790000002,0.12365667850000017 -K4P4Se24_29_9496.vasp,K4P4Se24,-2.061771465,0.09579185218749986 -Hg2N2Cl2_59_7976.vasp,Hg2N2Cl2,-0.5017855866666666,0.9683902324999989 -Mn3H2C2S2_187_11384.vasp,Mn3H2C2S2,-3.7974054133333337,0.361415977777763 -Ti2Tl2P2S10_2_19051.vasp,Ti2Tl2P2S10,-3.572041845,0.16212115312499975 -In2I1Br1O1_1_8473.vasp,In2IBrO,-1.572073368,0.40381457370833085 -Ga1O2_115_6224.vasp,GaO2,-3.597677953333333,0.3519195937499964 -Rh1Cl2_187_15149.vasp,RhCl2,-0.82712522,0.8115647099999984 -Ag2Se2Br2_59_429.vasp,Ag2Se2Br2,-0.3506167216666667,0.35469537944444385 -Y1S2_115_20664.vasp,YS2,-3.964970456666667,0.9781865805208301 -Hg3H2S2O10_2_8059.vasp,Hg3H2S2O10,-3.1103527070588237,0.05758630552940458 -Sr5Sc1_1_17490.vasp,Sr5Sc,0.4780296116666667,1.178893924166665 -Zr1I1Br1_156_21307.vasp,ZrIBr,-2.2488196466666666,0.0927162808333335 -Au1S2_164_1442.vasp,AuS2,-1.0625040266666665,0.4846499497916654 -Pd4Se2Br5Cl1_1_14525.vasp,Pd4Se2Br5Cl,-0.7804108241666667,0.044760747916665566 -Zn2Br2_164_21053.vasp,Zn2Br2,0.47243711,0.017804822812500065 -V4Zn4O8_1_20383.vasp,V4Zn4O8,-3.67270231375,0.19330443124999636 -Cu2Br1Cl1O2_1_5046.vasp,Cu2BrClO2,-1.2594450216666666,0.19821719333333176 -Te4Pt3_12_18622.vasp,Te4Pt3,-1.6126943842857142,0.2559188714285714 -Bi7S9Cl3_6_2682.vasp,Bi7S9Cl3,-2.068392401052632,-0.3426720585526336 -In2I2N2_59_8475.vasp,In2I2N2,-2.0900612683333333,0.419809452499998 -Zr2I2_129_21594.vasp,Zr2I2,-2.087014615,0.44503540250000007 -Sc1C3_156_15916.vasp,ScC3,-5.484304535,1.4800026182499932 -Cd3Sb1_191_3618.vasp,Cd3Sb,1.73066214,0.27259763875 -Mn1Co1Te3Rh1Br1_6_10673.vasp,MnCoTe3RhBr,-1.5957990814285714,0.24257940184523472 -Sb4Au2Se3F2_6_15768.vasp,Sb4Au2Se3F2,-1.3613365581818182,0.9242539627272687 -Yb1Cl2_164_20854.vasp,YbCl2,-2.6631143366666667,-0.2267031066666667 -In2Ge2S6_162_8450.vasp,In2Ge2S6,-2.80141363,-0.14160845843750303 -K2Ti2P2S10_10_9378.vasp,K2Ti2P2S10,-3.601075703125,0.12723736187500023 -Ge4P4S4_17_6936.vasp,Ge4P4S4,-3.4396900075,-0.5902594433333355 -Mg1Sb2F12_115_10397.vasp,MgSb2F12,-2.5454975593333335,0.043276448666666134 -Nb2C1_164_12666.vasp,Nb2C,-6.472286486666667,1.4702976891666655 -Be2Cd1_123_2247.vasp,Be2Cd,-0.20490475333333333,0.35826769833333305 -Hg2C2N4_4_7948.vasp,Hg2C2N4,-4.2813267675,0.017009855739936075 -Sn1Te1Br1O1_1_16697.vasp,SnTeBrO,-2.02687278,0.4391527391666666 -Ca2C2S6Cl2_59_2969.vasp,Ca2C2S6Cl2,-3.2117396741666666,0.27976794348957457 -Ta6Ge2S12_26_18143.vasp,Ta6Ge2S12,-5.017043184,-0.009754976500000012 -Os2Br2N2_59_13830.vasp,Os2Br2N2,-3.7814456966666667,0.03929181416666405 -Na1Ga1Sb2Te6_5_11869.vasp,NaGaSb2Te6,-1.401568599,0.3470067598571396 -Rb1Ge1S2_156_14733.vasp,RbGeS2,-2.102230765,0.5903405459375 -In4Br8_2_8668.vasp,In4Br8,-0.9544708958333333,0.0769793145833334 -Au1Br1_156_1411.vasp,AuBr,0.69714388,0.39815396375000006 -Ni3Sn1S2_187_13727.vasp,Ni3SnS2,-0.85185071,0.22180493583333238 -Bi1S2F2_164_2371.vasp,BiS2F2,-1.742645852,0.882453032312498 -V2Ag2As4O12_2_19969.vasp,V2Ag2As4O12,-3.8912083699999997,0.35413528933332883 -Mo2S2_25_11672.vasp,Mo2S2,-3.186818955,0.98007918625 -Ga2O3_150_6420.vasp,Ga2O3,-3.905488806,0.1625954912499965 -Cr2Ag2S8_51_4300.vasp,Cr2Ag2S8,-2.093410815,0.39745290984375004 -Pd2S2O8_75_14465.vasp,Pd2S2O8,-2.9377807533333335,0.8565012066666662 -Ni2Cl4_14_13497.vasp,Ni2Cl4,-0.248457495,0.06103783166666668 -Na2Zr2Cu2Se6_11_12347.vasp,Na2Zr2Cu2Se6,-2.622507515,0.14524485249999985 -Y2Ge1I2_164_20736.vasp,Y2GeI2,-3.3846150440000002,0.0377361279999997 -Mn1Cu1Se1S2_1_10691.vasp,MnCuSeS2,-1.9341939060000002,0.26476488519999763 -Rb2Hg4Cl6O8_31_14865.vasp,Rb2Hg4Cl6O8,-1.1613557335,0.25214660262499594 -Ni1Ru1S2Cl2_25_13408.vasp,NiRuS2Cl2,-1.89711872,0.06500070750000009 -Zr2Se2Br2_59_21672.vasp,Zr2Se2Br2,-3.357869511666667,0.041895358333333466 -Cu2C2N4_51_5063.vasp,Cu2C2N4,-4.949662715,0.3594760897916611 -Re2O2_6_15065.vasp,Re2O2,-5.7649787575,0.8453814918750007 -Ge1F2_187_6664.vasp,GeF2,-2.697306923333333,0.44738624833333374 -Tl2Sb2O6_162_19516.vasp,Tl2Sb2O6,-3.7328444089999997,0.061717623999999915 -Al1Co5F2_123_633.vasp,AlCo5F2,-1.7277429875,0.9109638862499968 -Cr2Te2_164_4526.vasp,Cr2Te2,-2.123761605,0.41711603749999626 -Co2Te4Cl2_2_4043.vasp,Co2Te4Cl2,-1.39947434375,0.039530184312498884 -Hf2Cl2O2_59_7473.vasp,Hf2Cl2O2,-5.436415978333333,0.2949212779166639 -Mo2O4F4_26_11647.vasp,Mo2O4F4,-4.05046802,0.0707839029999997 -Ta2F2_129_17720.vasp,Ta2F2,-4.1610315975,2.014293698000001 -V2I2N2Cl6_2_20092.vasp,V2I2N2Cl6,-2.3373965491666664,0.009469754895828908 -Zr4Br4O4_7_21810.vasp,Zr4Br4O4,-4.592386065,0.3264645933333332 -Mn2Sb2Te4I2_26_11259.vasp,Mn2Sb2Te4I2,-1.315594844,0.20317844699999799 -H6O2F2_31_7086.vasp,H6O2F2,-3.8684210620000004,0.03725335099999949 -Mn1Se1Cl1O1_25_10876.vasp,MnSeClO,-2.626787265,0.025375050749997907 -Sr2Ir1_123_17268.vasp,Sr2Ir,-0.7156771333333333,0.4305600788888879 -Cr2Br6_162_4335.vasp,Cr2Br6,-1.09775010125,-0.08649864249999983 -Zn1Bi1Br2O2_1_20899.vasp,ZnBiBr2O2,-1.8352118849999999,0.27213206083333275 -Te2Pd2I2_59_18468.vasp,Te2Pd2I2,-0.7924916033333332,-0.06175600999999997 -Ba2Cu1I2O2_123_1964.vasp,Ba2CuI2O2,-2.461276904285714,0.338052420491068 -Sr1Au2O8_89_17026.vasp,SrAu2O8,-2.6393791818181818,0.3294861731818153 -Ag1Sn1S1I2_1_133.vasp,AgSnSI2,-0.7250948580000001,0.13452736733333348 -Ni2Cl2_164_13495.vasp,Ni2Cl2,0.092713815,0.66983531 -Cs2Hg4Te2Cl6O6_31_4743.vasp,Cs2Hg4Te2Cl6O6,-1.344916354,0.25991188708333013 -Sr2Tl1Cd1Ag1O5_99_17332.vasp,Sr2TlCdAgO5,-2.38583796,0.29381674284166465 -Ba4Te4O16_14_2191.vasp,Ba4Te4O16,-3.9052580808333333,0.33328876291666676 -Sc2As2O6_157_16025.vasp,Sc2As2O6,-5.2346789000000005,0.31076738387499914 -Ta2Co2Se6_11_17703.vasp,Ta2Co2Se6,-3.533628437,0.15867248549999902 -Rb1Hf1Mg6O7_99_14738.vasp,RbHfMg6O7,-4.109008721333334,-0.08978831457576676 -K2Mg1Se2S8F4_2_9225.vasp,K2MgSe2S8F4,-1.9921546852941177,0.6851733342156812 -W4N4Cl12_2_20588.vasp,W4N4Cl12,-3.352089854,0.0448029079999972 -Mo1Br1Cl1_156_11496.vasp,MoBrCl,-1.4612328066666667,0.6191762693055556 -Y1Br1_156_20611.vasp,YBr,-2.744439265,0.606275759166663 -Zn1O2F2_65_20985.vasp,ZnO2F2,-1.654929026,0.6459637990000001 -Zr1Pd1I6_149_21402.vasp,ZrPdI6,-0.877962305,0.1584608967708332 -H2W3C2_187_7037.vasp,H2W3C2,-5.57000883,0.3837537849999946 -Ga1Se1Br2_1_6269.vasp,GaSeBr2,-1.2201443175,0.3490383776041667 -Ca2Mg4_59_3063.vasp,Ca2Mg4,0.4181307716666667,0.4344363725 -Na2H10Ru2N2O2_1_12093.vasp,Na2H10Ru2N2O2,-3.502567396111111,-1.567580229708335 -K4Si2P4_49_9515.vasp,K4Si2P4,-2.406919491,0.14381426799999986 -Ti4O4F8_4_19149.vasp,Ti4O4F8,-5.36241091125,0.09724628375000055 -Ni2Se2S6_12_13639.vasp,Ni2Se2S6,-1.778795021,0.31254600379166464 -Si1I2_187_16345.vasp,SiI2,-1.0631700666666666,0.2466509919444433 -Ti4H2C3S2_164_19136.vasp,Ti4H2C3S2,-6.2016843663636365,0.33304482727272156 -Au2Br2O2_59_1450.vasp,Au2Br2O2,-0.625004665,0.33092467055555463 -Sr1Ag1I2_1_17015.vasp,SrAgI2,-0.2684183375,0.5152709654166667 -Zn4Sn8O16_13_21232.vasp,Zn4Sn8O16,-3.365833930357143,0.2175554349999932 -V1C4S6Cl1F4_1_19793.vasp,VC4S6ClF4,-3.62553107375,0.3129407041796872 -Cu2Hg2Te2Br2_26_5162.vasp,Cu2Hg2Te2Br2,0.24860471875,0.16609860937499876 -Ru2S2Br2_59_15337.vasp,Ru2S2Br2,-2.4561948683333332,0.21256859444444154 -Tl2Te2_2_19550.vasp,Tl2Te2,-0.52350668,0.42915270125000005 -Cr4B3S2F2_164_4592.vasp,Cr4B3S2F2,-3.5770399854545456,0.4793257096590836 -Mo3S4_12_11725.vasp,Mo3S4,-3.479120832857143,0.5160146557142813 -Hf2Mn2Br8_2_7529.vasp,Hf2Mn2Br8,-2.2659109066666665,0.2186706437931017 -Ba3Ge1_25_2111.vasp,Ba3Ge,-0.592110295,0.6547135881249999 -Ba2Mn2Ge2_129_2024.vasp,Ba2Mn2Ge2,-1.7860518583333331,0.4115475525862051 -Rb4Cd2Br8_11_14963.vasp,Rb4Cd2Br8,-0.50622007,0.18554767071428568 -Hf1Pd1Br6_149_7262.vasp,HfPdBr6,-1.73245360375,0.08809790749999946 -Ge6As2_191_6954.vasp,Ge6As2,-2.4767676425,0.3042993187499998 -Ge2C2F2_59_6762.vasp,Ge2C2F2,-3.648286695,0.9916642983333297 -Ir1F2_164_8735.vasp,IrF2,-1.6036565266666667,1.0620502677777757 -Na2P1S4_81_12256.vasp,Na2PS4,-2.6066406614285715,0.3075050870982116 -Co2Mo2S8Br2_129_3932.vasp,Co2Mo2S8Br2,-2.224721710714286,0.7188021595039632 -Cr2Pd1Se4_164_4461.vasp,Cr2PdSe4,-2.3587506599999997,0.11863434550420221 -Tc4O14_51_18252.vasp,Tc4O14,-5.501562237777778,0.13119981111111123 -O16F8_14_13788.vasp,O16F8,-1.89436386375,0.31732661458333333 -Cd2Br2_129_3480.vasp,Cd2Br2,1.1248034375,0.43651678687499995 -Re6S8Br2_2_15125.vasp,Re6S8Br2,-4.711045743125,0.060433489374999816 -Ti3H2C2Se2_38_19083.vasp,Ti3H2C2Se2,-5.469260117777778,0.20714603033332324 -Te4O8_31_18601.vasp,Te4O8,-3.567746023333333,0.08549419291666682 -Al1In1S2I4_1_681.vasp,AlInS2I4,-1.21358039375,0.2676660319921875 -Co2Ni1Se1S3Br1_1_3939.vasp,Co2NiSeS3Br,-1.67307547,0.4678001305133901 -K2S8N2Cl6_1_9339.vasp,K2S8N2Cl6,-1.75536672,0.6067389106944423 -In3Te4_164_8660.vasp,In3Te4,-1.376314217142857,0.04106640476190382 -V2I10_2_20088.vasp,V2I10,-0.4746506,0.09907925229166614 -Li2S4F2_113_10058.vasp,Li2S4F2,-1.74927458375,1.1403886484375 -Li4S2O8_51_10219.vasp,Li4S2O8,-4.35862981,0.294499295714286 -Zr1O1_38_21385.vasp,ZrO,-5.307945315,1.2333236916666666 -Pb1I4_10_14190.vasp,PbI4,0.248451902,0.5282469744166668 -Mo3Se1Br3O3_1_11726.vasp,Mo3SeBr3O3,-3.193775412,0.21011725712499058 -Na2H8Cl2O12_2_12136.vasp,Na2H8Cl2O12,-3.533451874583333,0.08556647274305362 -In2P2S6_143_8520.vasp,In2P2S6,-2.8440982999999997,0.15230194987499707 -Ca2Ag1S2Cl2_38_2909.vasp,Ca2AgS2Cl2,-1.8818525557142858,0.19135809066963844 -Te5P2Pd2_8_18637.vasp,Te5P2Pd2,-1.787318558888889,0.3958123272222203 -Al2Te2Br2_31_996.vasp,Al2Te2Br2,-1.9409124083333333,0.041326666666666734 -Ca1Cr2F12_2_2821.vasp,CaCr2F12,-2.794068834,-0.023407004000002285 -Mo4As8O28_14_11733.vasp,Mo4As8O28,-4.683540421,0.04636605700000018 -Bi1Te1_123_2402.vasp,BiTe,-0.8595579,0.6602790999999999 -B1Mo2S2_164_1627.vasp,BMo2S2,-4.0985481,0.16197289900000023 -Li4C1S4_38_10170.vasp,Li4CS4,-3.3019002288888886,0.15940759208333066 -Tl2Br2_129_19379.vasp,Tl2Br2,-0.56183767,0.014874580000000082 -Na4S4O8_13_12409.vasp,Na4S4O8,-3.839340123125,0.17997547054687524 -Al8Te12_4_1115.vasp,Al8Te12,-2.140198079,0.07509001524999981 -Ca1Pb1I4_10_2866.vasp,CaPbI4,-0.9186951733333334,0.07786334205555545 -Lu1N2_21_10294.vasp,LuN2,-5.59679402,0.2915896374999951 -Cd1Te1_123_3435.vasp,CdTe,0.711346065,-0.15802969 -Al1Ag1As2S6_149_594.vasp,AlAgAs2S6,-2.6035117100000003,0.45385606818749724 -Fe2Sb2Te4Br2_26_5962.vasp,Fe2Sb2Te4Br2,-1.339783556,0.20659267779999835 -Cu2B4N2Cl2F4_2_5037.vasp,Cu2B4N2Cl2F4,-3.794320739285714,0.5628208452380847 -B5_47_1770.vasp,B5,-4.86719373,1.293791568333333 -Ga2I2O2_59_6389.vasp,Ga2I2O2,-2.68554117,0.012954158124997173 -Cu3H12C12N8_2_5372.vasp,Cu3H12C12N8,-5.376580902285714,-1.786025639142859 -Tl1Ag1S2Br2_1_19204.vasp,TlAgS2Br2,-0.7076280549999999,0.3252289197916658 -K2Mg1Cl4_123_9212.vasp,K2MgCl4,-0.7792779271428572,1.0041621153571414 -Mo2C2I2_59_11590.vasp,Mo2C2I2,-3.4567895400000004,0.5026905952777705 -Sn2Se2_129_16882.vasp,Sn2Se2,-1.600395085,-0.02411670999999993 -Nb4W2O16_13_13180.vasp,Nb4W2O16,-6.4153346531818185,-0.16748299443182768 -Mn4C3O2F2_164_11427.vasp,Mn4C3O2F2,-3.6628256718181817,0.9441872209090878 -Li1Ga1Sb2S6_5_9715.vasp,LiGaSb2S6,-2.567625244,0.38298739993749775 -Na2Fe2Se2O1_123_12081.vasp,Na2Fe2Se2O,-2.396122762857143,-0.24644520053571917 -Al2S4_1_949.vasp,Al2S4,-3.2077449516666667,0.34464731468749715 -Bi6Pt3_157_2676.vasp,Bi6Pt3,-1.4905985833333333,0.19925478125000007 -Sr1H2O2_12_17054.vasp,SrH2O2,-4.348386864,0.03518747149999957 -W2S4_11_20536.vasp,W2S4,-4.4562618983333335,0.016336751666666594 -Na2Ru2Br8N2O4_7_12273.vasp,Na2Ru2Br8N2O4,-2.4283731377777777,0.06947282194444238 -Hf4B3_164_7769.vasp,Hf4B3,-6.045339294285715,0.24615225928570794 -Mo3O8_10_11715.vasp,Mo3O8,-5.002005874545454,0.20756671439393504 -Co2H2_164_3913.vasp,Co2H2,-2.2009042575,1.0494251550000002 -Mg2Cl4_2_10438.vasp,Mg2Cl4,-1.7946223633333334,0.2724051816666664 -Cs2B2C6N2O4F18_2_4659.vasp,Cs2B2C6N2O4F18,-3.8907784485294115,0.44949113371322486 -Ba4P4H4S8_14_2168.vasp,Ba4P4H4S8,-3.209167977,0.31393939521874653 -Bi1Rh2_164_2363.vasp,BiRh2,-0.90917229,1.4024036649999982 -V1O2F1_1_19891.vasp,VO2F,-4.71545095,-0.22715235656250377 -Sr2Ag1Te2I2_38_17116.vasp,Sr2AgTe2I2,-0.9596763942857143,0.2802176292857114 -Cr8S24_14_4631.vasp,Cr8S24,-3.1279371503125,0.12424395453124992 -W2F10_51_20490.vasp,W2F10,-3.1654042841666663,0.36016565770832787 -Mn1Co1Te3Br3_1_10672.vasp,MnCoTe3Br3,-1.10282532875,0.04831947644345225 -Mn1Sb1Te1Se1S1_156_10865.vasp,MnSbTeSeS,-2.2123535839999997,0.2081709799999983 -K1Al1Br4O12_2_8875.vasp,KAlBr4O12,-2.680108852777778,0.26465980281249335 -Mn2S10_31_11208.vasp,Mn2S10,-2.5387048858333334,0.4506598526041665 -Cr6O14_31_4628.vasp,Cr6O14,-4.87829234,-0.2063796914375 -K4Br2O1_123_9417.vasp,K4Br2O,-0.35442731857142856,0.9689600071428572 -P2Rh2S6_162_14038.vasp,P2Rh2S6,-3.177207383,0.30303270574999774 -Na4P4O8_29_12402.vasp,Na4P4O8,-4.57297199125,0.2399861392499948 -Ni2O2_47_13549.vasp,Ni2O2,-1.8141951325,0.011653712500000024 -K2C4N6_28_9031.vasp,K2C4N6,-5.968815140833333,-0.10187294395833768 -Zr2Se2I2_59_21676.vasp,Zr2Se2I2,-3.0524399433333333,0.03753743013888666 -Zn1Hg3S2Cl4_156_20958.vasp,ZnHg3S2Cl4,0.295617037,0.5325902669375 -In2Sb2S6_149_8566.vasp,In2Sb2S6,-2.192346034,0.4867866205000002 -Li4Mn2P4O14_113_10201.vasp,Li4Mn2P4O14,-4.991523208333334,0.2960068123958228 -Zn2Te2W2S12_18_21184.vasp,Zn2Te2W2S12,-2.5163556744444446,0.2865950248657379 -Ba2Ni3O7_1_2036.vasp,Ba2Ni3O7,-3.009354785833333,0.07475947000000038 -Sc2I6O18_147_16097.vasp,Sc2I6O18,-3.2770282019230765,0.12745977038461564 -Nb2Ni2S6_11_12780.vasp,Nb2Ni2S6,-3.4156317369999996,-0.1851592288636367 -Ag4I4O12_14_528.vasp,Ag4I4O12,-2.0331977845,0.07046844474999991 -Tl18Te9_143_19196.vasp,Tl18Te9,-0.5712046914814815,0.19843507912457914 -Cu1Au1S2_25_4840.vasp,CuAuS2,-0.7779991125,0.4090970258333334 -Ba3C1_25_2099.vasp,Ba3C,-0.8831368425,1.457099661041662 -Bi2F10_51_2452.vasp,Bi2F10,-1.7173473783333335,0.1356235516666664 -Si2P4_113_16428.vasp,Si2P4,-4.156481491666667,-1.2860962008333336 -Zr2Ge2Te8_31_21573.vasp,Zr2Ge2Te8,-2.5514986825,-0.2481476791666668 -Y5Br8_10_20841.vasp,Y5Br8,-3.052934913846154,0.09734400910256147 -Hg4H8C4N20Cl4_57_8074.vasp,Hg4H8C4N20Cl4,-4.62802080025,-0.27147809401868384 -P1S2_187_13945.vasp,PS2,-2.755122946666667,0.5285953082291601 -Zn2Se2_164_21167.vasp,Zn2Se2,-0.5168765525,0.18312680125000003 -Ba2Ag1Te2Br2_38_1893.vasp,Ba2AgTe2Br2,-1.4083838314285715,0.34168660585565075 -Na2Nb1Se2_187_12223.vasp,Na2NbSe2,-2.808638646,0.2592267193333278 -Ta2Co4Te2Se2_51_17712.vasp,Ta2Co4Te2Se2,-3.2537101440000002,0.04843912274999962 -Ir2Br6_189_8770.vasp,Ir2Br6,-0.72352346375,0.56031228125 -Nb9S18_12_13210.vasp,Nb9S18,-4.844929659259259,0.11245574574074091 -Pt4Br8_14_14697.vasp,Pt4Br8,-0.6796874383333332,0.10260472916666674 -Sc2H2C1_164_16079.vasp,Sc2H2C,-4.441678619999999,0.07447464200000109 -Co2H12Se4O16_14_3905.vasp,Co2H12Se4O16,-3.91510972,0.05909118029411786 -Cu4Hg4S4Cl4_26_5424.vasp,Cu4Hg4S4Cl4,-0.288131645,0.11226441958333344 -Nb1H2_187_12516.vasp,NbH2,-4.030563016666666,0.3125617966666674 -Cd2Te1Se1_8_3583.vasp,Cd2TeSe,0.0918070275,-0.5346146425 -Re1Te2_164_15027.vasp,ReTe2,-3.059825583333333,0.4605026066666671 -Ga2Si2Se2_164_6490.vasp,Ga2Si2Se2,-2.9984706466666666,-0.3957633316666692 -Hg3Se1O6_1_8066.vasp,Hg3SeO6,-1.7636995949999998,0.14551976029166602 -Ta2Br2N2_59_17664.vasp,Ta2Br2N2,-5.835288018333333,0.10686754190476022 -H2Pt1_187_7021.vasp,H2Pt,-2.4607960933333333,1.8803097099999964 -Mg4Ti4_129_10590.vasp,Mg4Ti4,-2.7907677225,0.6078837033333335 -Tl2Ni4S6_164_19463.vasp,Tl2Ni4S6,-1.4955596025,0.1637462441666666 -Ir4Se8_2_8868.vasp,Ir4Se8,-2.7614702816666665,-0.40838352583333304 -Li1Ga1As2Se6_5_9706.vasp,LiGaAs2Se6,-2.323732531,0.29563911083333105 -Ta2Ge2Bi2_129_17740.vasp,Ta2Ge2Bi2,-3.863521445,0.11826390484126081 -Li4Al4H32N16_14_10155.vasp,Li4Al4H32N16,-4.694019141607143,-0.010349865000000236 -Os2O2_6_13861.vasp,Os2O2,-4.40360638,1.1955891024999996 -Na4Sb4O8_29_12414.vasp,Na4Sb4O8,-3.8365148675,0.013271614999999848 -Na2Co4H6S4O16_2_12062.vasp,Na2Co4H6S4O16,-3.9659441909375,0.05846771806249468 -Ni1S2_123_13414.vasp,NiS2,-1.2444641766666666,0.599146413749998 -Sc1Pb3_191_15977.vasp,ScPb3,-0.72612618,1.0296275187499986 -Li2V2B2O8_2_10112.vasp,Li2V2B2O8,-5.773253226428571,0.10240114579364579 -Ta4Ni4Te8_53_18070.vasp,Ta4Ni4Te8,-2.689930803125,0.04095032937499976 -K1Mg2B12H19O30_5_8915.vasp,KMg2B12H19O30,-5.4694317690625,-0.03776355830079281 -Mo1Ru1S1Br2N1_1_11541.vasp,MoRuSBr2N,-2.955514276666667,0.1517831783333281 -Hf1N2_164_7239.vasp,HfN2,-6.5885819833333334,1.098339879444437 -Ag2C2I2N4F4_2_213.vasp,Ag2C2I2N4F4,-2.6335932685714285,0.6451740402976124 -Ga1Cu1Se2I2_1_6177.vasp,GaCuSe2I2,-0.8621548200000001,0.24539090791666562 -V2Zn1O6_12_20232.vasp,V2ZnO6,-4.608833955555556,0.19887972333332726 -Y2Bi2O6_147_20697.vasp,Y2Bi2O6,-5.262956641000001,0.34585905062499966 -W2Cl4O4_26_20486.vasp,W2Cl4O4,-4.15216504,-0.013929434999999657 -Hf3C2Se2F2_187_7697.vasp,Hf3C2Se2F2,-5.072303828888889,0.9919469186110994 -Ca2Ag1Br2O2_38_2901.vasp,Ca2AgBr2O2,-2.4239152928571426,0.0728896796428532 -Sb2Mo4O16_13_15607.vasp,Sb2Mo4O16,-4.8276483659090905,0.12195510526514808 -Zr2Te2Br2_59_21700.vasp,Zr2Te2Br2,-2.8373601166666664,0.11005828277777518 -Ga4O6_164_6556.vasp,Ga4O6,-4.48351262,-0.4154283227500033 -Al2In2O6_31_889.vasp,Al2In2O6,-4.920709802999999,0.16042660212500026 -Ti2Cl6_189_18927.vasp,Ti2Cl6,-3.08065115625,0.18030187249999985 -Hg3S2_12_8065.vasp,Hg3S2,0.595953854,0.26996543675862317 -Ba2Ca2_164_1937.vasp,Ba2Ca2,0.5930779,1.1069457200000001 -Nb4Se12I2_2_13148.vasp,Nb4Se12I2,-3.1586452,0.12035774833333018 -Zr1Ga1I1N1Cl3O1_1_21293.vasp,ZrGaINCl3O,-3.1012623,0.37205421463541305 -Fe1N6F6_47_5721.vasp,FeN6F6,-3.0423521538461538,0.38972133987179225 -Nb2Si1Te4_6_12888.vasp,Nb2SiTe4,-3.2647099828571426,0.35140634107142876 -Ru8Se10_1_15376.vasp,Ru8Se10,-2.8169970716666666,0.5448276391666633 -Ge1Se1_156_6707.vasp,GeSe,-2.7010751,0.19921824499999996 -Tl1_191_19358.vasp,Tl,0.53587837,0.32356045000000005 -Pd2Br6_162_14406.vasp,Pd2Br6,-0.27196802875,0.15503729625000004 -Mn2Te4As2Cl2_10_11314.vasp,Mn2Te4As2Cl2,-1.7807235810000002,0.25867627849999614 -Te8Mo2W2_25_18700.vasp,Te8Mo2W2,-2.5273702425,0.05052585833333323 -Sr3Fe2I2O5_123_17376.vasp,Sr3Fe2I2O5,-3.3069762083333334,-0.01542435704392621 -In1Si1Se3_143_8349.vasp,InSiSe3,-2.148383796,0.5263855250000002 -Co1Ni1Te1S2I1_6_3794.vasp,CoNiTeS2I,-1.2687447166666665,0.3609981256666661 -Hf2Si2Te2_129_7617.vasp,Hf2Si2Te2,-4.463134628333333,0.0766476633333335 -Ag1O2F2_12_90.vasp,AgO2F2,-1.114347422,0.7297799975 -Sn2Te2O8_31_16892.vasp,Sn2Te2O8,-3.398388125,0.608841630625 -Rb2Se2N2O6F6_1_14941.vasp,Rb2Se2N2O6F6,-2.6971228083333334,0.5395525879166533 -Sn2I2N2_59_16782.vasp,Sn2I2N2,-2.56564285,-0.7978448444444445 -Ge2Te6P1_162_6894.vasp,Ge2Te6P,-1.8873606966666665,-0.0889046620370384 -Li1V1F6_8_9807.vasp,LiVF6,-3.23702646625,0.07086007375000003 -Sb4Pd4S4_13_15806.vasp,Sb4Pd4S4,-2.09765788,0.4026653666666671 -Zr2S2F2_59_21645.vasp,Zr2S2F2,-4.6191201600000005,0.10142080666665665 -Hg1Pt1S1Br2O1_1_7903.vasp,HgPtSBr2O,-1.0059828100000001,0.43792112940475847 -Cd1F2_187_3307.vasp,CdF2,-0.98706551,0.16189983666666674 -Nb2As2S6_2_12625.vasp,Nb2As2S6,-3.945991179,-0.17012216562500226 -V4O8_12_20350.vasp,V4O8,-5.561805856666666,0.11613321833333412 -Sb2Pb2S6_147_15645.vasp,Sb2Pb2S6,-2.337845191,-0.1482906520625027 -As1Cl3_187_1144.vasp,AsCl3,-1.1292112425,0.4636942424999999 -Nb2Se1S1I2_6_12867.vasp,Nb2SeSI2,-3.429062645,0.11371340833332577 -B4O6_7_1760.vasp,B4O6,-6.741856213,0.11247816233333374 -Zn2Ga2N2O2_26_21080.vasp,Zn2Ga2N2O2,-3.28371894375,0.3178961725 -Yb2Cl6_59_20868.vasp,Yb2Cl6,-2.88187823375,-1.003751015625 -Ta2Te1S1Br1_8_17895.vasp,Ta2TeSBr,-4.15311962,0.272880520619039 -K1Rb1Mg6O7_99_8929.vasp,KRbMg6O7,-3.4245800466666667,0.08094257133332766 -Nb1O2_115_12551.vasp,NbO2,-6.340763330000001,0.6447468762500002 -Ca4Fe2I2O6_129_3215.vasp,Ca4Fe2I2O6,-3.5511585,-0.25001316387363043 -Sr2S8Cl4_125_17306.vasp,Sr2S8Cl4,-1.905074707142857,0.661215643928569 -Fe2W2Cl2O8_129_6030.vasp,Fe2W2Cl2O8,-4.361500215,0.0959875140401718 -Ba2Co1_123_1953.vasp,Ba2Co,0.18813125,1.0074845599999993 -B16S24_14_1610.vasp,B16S24,-4.3328495615,0.10080980400000072 -Al2Cl2_129_793.vasp,Al2Cl2,-1.4223443225,0.9086558016666646 -Ni2Se2O8_7_13637.vasp,Ni2Se2O8,-2.9575264108333332,-0.02935806020833609 -La2Pb12Cl2O14_12_9607.vasp,La2Pb12Cl2O14,-3.6621772873333334,0.05356260433333304 -Ti2F4_11_18934.vasp,Ti2F4,-4.770496165,-0.48570300944444844 -Fe1Br2_187_5640.vasp,FeBr2,-0.55044728,0.30466254166666673 -B8P4Cl8_7_1791.vasp,B8P4Cl8,-3.6911102305,-0.3213431461666709 -W1Cl2_164_20428.vasp,WCl2,-2.4898950466666667,0.5503000233333282 -Zr2S1I1Cl1_156_21638.vasp,Zr2SICl,-3.4118050699999998,0.018141866499997494 -Hg2Br2N2_59_7942.vasp,Hg2Br2N2,-0.37132796166666665,0.9460998758333323 -Mn1In1Br6_5_10773.vasp,MnInBr6,-1.00662748,0.03871097750000008 -Y4H2C3O2_164_20821.vasp,Y4H2C3O2,-5.882812378181819,0.5085650738446845 -Ge1Sb1S2I2_1_6703.vasp,GeSbS2I2,-1.7905604533333335,-0.19464906307291685 -K4Na2Ga2As4_49_9478.vasp,K4Na2Ga2As4,-1.4380568116666668,0.11033794749999992 -Ta4H2N3_164_18052.vasp,Ta4H2N3,-6.968373258888889,0.428233027222217 -Zn1W1O4_3_21023.vasp,ZnWO4,-4.56386511,0.33732426833333307 -Ag2Br2_67_205.vasp,Ag2Br2,0.212749315,0.11672318999999999 -Li1Sb1Br1Cl1O1_1_9782.vasp,LiSbBrClO,-2.58143998,0.2589849435999989 -V3B2F2_187_20237.vasp,V3B2F2,-4.3625534,0.1486119666666581 -Pb2C2Cl2O4_12_14228.vasp,Pb2C2Cl2O4,-4.3706679809999995,0.06405202474999294 -Ni2W2S8Br2_129_13687.vasp,Ni2W2S8Br2,-2.220127853571429,0.5158435320312444 -Tl2O1_164_19466.vasp,Tl2O,-1.7255070533333334,0.09792057851851821 -Ba2Mg2_164_2023.vasp,Ba2Mg2,0.39306184,0.543320429375 -Cd2Pd4S6_164_3533.vasp,Cd2Pd4S6,-1.2929784775,0.36091365291666544 -Cs2H2C2S6_4_4713.vasp,Cs2H2C2S6,-3.2416592933333335,0.37384319374999686 -Zr4H12N4F16_2_21819.vasp,Zr4H12N4F16,-4.576117688611111,0.04094907999999986 -P2Pb2C2O6F6_7_14004.vasp,P2Pb2C2O6F6,-4.2610756372222225,0.2714489032638721 -Nb2Pt2Se4S4_1_12826.vasp,Nb2Pt2Se4S4,-3.3414472175000003,-0.0730670733333334 -Sr2As4_12_17122.vasp,Sr2As4,-2.1259672066666666,0.6690744366666641 -Tl8Se6_31_19653.vasp,Tl8Se6,-0.9032047807142857,0.3034202903571418 -Co2Cl2_164_3891.vasp,Co2Cl2,-0.996756325,0.2572120987500001 -Rb4Sb8F28_14_14980.vasp,Rb4Sb8F28,-2.7174817725000002,0.060021242499999516 -La1Br2_187_9564.vasp,LaBr2,-2.4722281366666667,0.14084210133333103 -Ba4Te8As4Cl4_14_2192.vasp,Ba4Te8As4Cl4,-2.2091285249999997,0.11222585575000055 -Zr2Mo1Se2I1Br2N1O1_1_21602.vasp,Zr2MoSe2IBr2NO,-3.617938475,0.4736630681666647 -Cd1Te2_115_3439.vasp,CdTe2,-0.009334913333333333,-0.06499016444444439 -In1Pt5I2_123_8324.vasp,InPt5I2,-1.19507693,0.39279815562500003 -K1Mo2S2I6_47_8921.vasp,KMo2S2I6,-1.1558429772727272,0.2713121283333303 -P2C6_191_13966.vasp,P2C6,-6.47312647,0.6256165837499992 -Y1Bi2O4_123_20608.vasp,YBi2O4,-4.779580244285714,0.16751854187499848 -Nd2F6_59_13237.vasp,Nd2F6,-4.48461178125,0.20235337166666678 -Sb4P4O24_2_15800.vasp,Sb4P4O24,-4.426474051875,0.4294913589062501 -Te1Mo2Se1S1Br1_8_18310.vasp,TeMo2SeSBr,-2.293019925,0.40333208395833353 -Dy2Se6_51_5535.vasp,Dy2Se6,-2.8341046075,-0.38139303125 -Cr1Cu1Sb2Se6_143_4155.vasp,CrCuSb2Se6,-1.911917328,0.2708240866 -Au2Se1Br2O1_1_1532.vasp,Au2SeBr2O,-0.43379092,0.4123290344791667 -Pd2I4O12_14_14433.vasp,Pd2I4O12,-2.480932687777778,0.09225589499999742 -Ni2S2_123_13591.vasp,Ni2S2,-1.2605731425,0.16788788083333173 -Al2In2F8_3_887.vasp,Al2In2F8,-3.2667832625,0.20678294861110527 -Cs1Te2Pb1_156_4653.vasp,CsTe2Pb,-0.7645101775,-0.26057289750000007 -Zr2Se2_164_21680.vasp,Zr2Se2,-3.61971826,0.27208207500000015 -Fe2Bi2Te4F2_26_5813.vasp,Fe2Bi2Te4F2,-1.4860417209999999,0.5416203216666643 -Co1H4C6Br2N2_25_3757.vasp,CoH4C6Br2N2,-5.163226859333333,0.1832658993333267 -V1Te6P2Au1_5_19947.vasp,VTe6P2Au,-1.7731640030000002,0.26440401679166514 -Al2Ni2Te5_164_909.vasp,Al2Ni2Te5,-1.3640337044444444,0.23961801549602701 -Ca1Sn4S9_25_2890.vasp,CaSn4S9,-2.528668302142857,0.1932306550892835 -Er2H2Cl2_164_5559.vasp,Er2H2Cl2,-3.2688079183333336,0.03761808166666647 -Cu2B4H4N2Cl2_2_5035.vasp,Cu2B4H4N2Cl2,-3.737913257142857,0.7580265279142753 -Cr4S8_162_4625.vasp,Cr4S8,-3.1148057166666665,0.34880749 -Hf2Cd2_129_7472.vasp,Hf2Cd2,-1.5122137075,0.31035359000000007 -Ga1Ag1Se1I3_1_6126.vasp,GaAgSeI3,-0.443608185,0.26722334069444265 -Cs2Yb1Br6_164_4796.vasp,Cs2YbBr6,-1.45158701,-0.20868707750000093 -Mn2As2Se4Cl2_26_10981.vasp,Mn2As2Se4Cl2,-2.191989616,0.11801221266666406 -Ca2Ag1Se2I2_38_2915.vasp,Ca2AgSe2I2,-1.2314889528571429,-0.0647185478571457 -Na2Pd1F2_123_12264.vasp,Na2PdF2,-1.9849735979999998,0.10235919400000021 -Ru2F2_164_15314.vasp,Ru2F2,-2.52116737,0.5922369924999971 -As4S6_11_1361.vasp,As4S6,-2.921920858,0.5975740704999999 -Ge1Cl2_115_6658.vasp,GeCl2,-1.7410766733333334,0.22611756333333322 -Mn1Cu2S6I1_1_10701.vasp,MnCu2S6I,-1.73602092,0.17714473051249724 -Sr4As2O1_123_17402.vasp,Sr4As2O,-0.8467709428571428,1.9054302357142858 -Nb1Te1Pd1Se1I1Br2Cl1_1_12595.vasp,NbTePdSeIBr2Cl,-1.70022858875,0.23095466159482225 -Sb2Pd2Se5_8_15654.vasp,Sb2Pd2Se5,-1.8004609844444444,0.3399883697777757 -Hf1Cd1S1I2_8_7136.vasp,HfCdSI2,-1.755188996,0.07356841433333372 -Rb2Hg4Se2S6I6_31_14883.vasp,Rb2Hg4Se2S6I6,-0.41945878499999995,0.27019389118750026 -Ag2Te4F2_4_478.vasp,Ag2Te4F2,-0.85108372375,0.3293169383333333 -In4Te6_31_8705.vasp,In4Te6,-1.334530461,0.04483917500000012 -P2Pt2S6_162_14032.vasp,P2Pt2S6,-2.814354538,0.2587660547857078 -Mn2Se1Cl2_12_11267.vasp,Mn2SeCl2,-1.850473712,0.14238928651723914 -Al2Se2S8F2_11_968.vasp,Al2Se2S8F2,-2.484150828571429,0.618711791101185 -Dy1I2_164_5511.vasp,DyI2,-1.6049113033333333,0.07010588814814667 -Er2Br2_164_5549.vasp,Er2Br2,-2.1391309525,0.13078369749999785 -Ca4Ni2I2O6_129_3231.vasp,Ca4Ni2I2O6,-3.1571510028571432,-0.2655061111607169 -Cr4O6_49_4615.vasp,Cr4O6,-4.455323522,0.6548387440000001 -Eu1As2_6_5584.vasp,EuAs2,-3.124856766666667,0.7479768583333333 -Bi1Pd2Se2_187_2359.vasp,BiPd2Se2,-1.52063124,0.29792955850000014 -Co2Sb2O6_162_3995.vasp,Co2Sb2O6,-4.162756563,-0.10828739750000027 -Ba2Ag1Se2Cl2_38_1890.vasp,Ba2AgSe2Cl2,-1.9252568700000001,0.2928906582142834 -Sb1Se2_164_15506.vasp,SbSe2,-2.1197519433333336,0.2320960072222198 -Nb1In2Br1Cl1O2_1_12528.vasp,NbIn2BrClO2,-3.4027016299999997,0.36812805223213774 -Cr1S2_164_4249.vasp,CrS2,-3.26242735,0.20118585666666666 -Ce4C2Br5_47_3687.vasp,Ce4C2Br5,-3.6265473745454546,0.10525083363636378 -Al2Co2Te5_164_811.vasp,Al2Co2Te5,-1.8455808877777775,0.3194520257076664 -Ni2Sb2Te4Cl2_10_13616.vasp,Ni2Sb2Te4Cl2,-0.9881502980000001,0.2589686982857115 -Na2Mn1As2S7Cl3_1_12207.vasp,Na2MnAs2S7Cl3,-2.3334920986666665,0.44919307703471506 -Cs2Hg4Te2S6Br6_31_4746.vasp,Cs2Hg4Te2S6Br6,-0.506782767,0.3074162418125006 -Zn2As4S8_4_21038.vasp,Zn2As4S8,-2.3582367585714286,0.496162503071427 -Na2Cd4S6I6O2_31_12031.vasp,Na2Cd4S6I6O2,-0.941822997,0.28230348177083125 -Ge1H2N1_156_6667.vasp,GeH2N,-3.9464865875,-2.9413541316666683 -Mo2P2O10_85_11655.vasp,Mo2P2O10,-5.342752370714286,0.11851003357142798 -Tl1Ga1Hg1S4_156_19272.vasp,TlGaHgS4,-1.5761833514285715,0.24791624312499683 -K2Pt2Br6N2_51_9308.vasp,K2Pt2Br6N2,-1.2078898033333334,0.692422470416662 -K1N3_10_8923.vasp,KN3,-3.9202821025,1.1634149049999998 -Ni2S2F2_59_13583.vasp,Ni2S2F2,-1.5734186083333332,-0.0158404189583351 -Rb3Nb2Br9_187_14960.vasp,Rb3Nb2Br9,-1.6970866557142856,0.18735968982142515 -Ge2N2F2_59_6786.vasp,Ge2N2F2,-4.15377028,0.09380257472221731 -Sr2Ni1S3_38_17287.vasp,Sr2NiS3,-2.40943856,0.058280044444441126 -Ag4Te4O12_11_576.vasp,Ag4Te4O12,-2.6732030985,0.19773062749999992 -Hf2As1S2_164_7427.vasp,Hf2AsS2,-5.352043772,0.10774966300000033 -K4H8Se4N4O12_14_9456.vasp,K4H8Se4N4O12,-3.7615114084375,0.15474614777343798 -Ge2S4_12_6833.vasp,Ge2S4,-2.7438963750000003,0.41362165604166634 -Mn2P2Se6_147_11203.vasp,Mn2P2Se6,-2.577580854,0.02700751187499839 -Cu6Se1S3Br2Cl6_1_5498.vasp,Cu6SeS3Br2Cl6,-0.7530977222222223,0.12934951409722084 -Gd2I6_12_6620.vasp,Gd2I6,-1.58726285,0.05997363 -Zr2S2_129_21651.vasp,Zr2S2,-4.1950293325,0.47416169250000006 -Th1Cl2_187_18713.vasp,ThCl2,-3.45037758,0.12239860666666247 -Nb6Si2Se12_26_13198.vasp,Nb6Si2Se12,-4.230102162,0.03332255724305189 -Ti2Tl8S8_1_19052.vasp,Ti2Tl8S8,-2.458198783888889,0.14522229499999995 -In2Pt4O6_164_8533.vasp,In2Pt4O6,-2.8431152108333335,0.6770934902083294 -Fe2S2N1_164_5934.vasp,Fe2S2N,-2.8978140839999997,-0.20565189549999952 -Zr2I2Cl2_6_21587.vasp,Zr2I2Cl2,-2.231326171666667,0.37245803916666653 -Ti2Se2F2_59_19021.vasp,Ti2Se2F2,-4.6199363883333335,-0.6778565605555638 -Nb4S12_2_13138.vasp,Nb4S12,-4.3607856875,0.011724566093750166 -Na4Ti4Si4O18_2_12426.vasp,Na4Ti4Si4O18,-6.130874096333333,0.061824800666666846 -Hf1Ni1Br6_5_7244.vasp,HfNiBr6,-1.588043785,0.0013592700000000235 -N14_187_11770.vasp,N14,-5.196658182142857,0.3370924403571438 -In2Se2_129_8589.vasp,In2Se2,-1.7270408275,0.1763745350000001 -Cu2C6I2N2F8_2_5076.vasp,Cu2C6I2N2F8,-3.7687240090000005,0.1311467840249918 -Zr2S2N1_164_21650.vasp,Zr2S2N,-5.712994244,0.13545589949999526 -Ag3As1S4_156_496.vasp,Ag3AsS4,-1.13247447625,0.4057320664843749 -Sr4Co2S2O6_4_17418.vasp,Sr4Co2S2O6,-3.8008240357142857,0.09454336428570476 -Mo1C1I1_8_11502.vasp,MoCI,-2.8966750666666665,1.0628050686111044 -Nd2Zn2P2O2_164_13248.vasp,Nd2Zn2P2O2,-3.73082073625,0.14331136875000006 -Nb3C2S2_187_12964.vasp,Nb3C2S2,-6.56500458,-0.22339988357143614 -Cu2B2H8Cl2O8_85_5026.vasp,Cu2B2H8Cl2O8,-4.112445368181818,0.07816668009469135 -Y2N1Cl2_164_20758.vasp,Y2NCl2,-5.154693054,0.0316847039999999 -Ag2H8C2N8_2_290.vasp,Ag2H8C2N8,-4.671381834,-2.549938116083337 -Hf2S2F2_59_7569.vasp,Hf2S2F2,-5.104999626666666,0.11811378999999 -Mg1S2F2_164_10395.vasp,MgS2F2,-2.047616514,0.8719128087500001 -N4_53_11801.vasp,N4,-5.82478118,-0.2910305574999992 -Nb4F16_14_13066.vasp,Nb4F16,-4.0411216009999995,0.1582608729999968 -Fe2Te4P2F2_26_6018.vasp,Fe2Te4P2F2,-1.9275914790000002,0.4522918545333332 -Ta1I1Br1_156_17552.vasp,TaIBr,-2.4837751666666668,0.6220828626190413 -In1Pd5Cl2_38_8311.vasp,InPd5Cl2,-0.96707995625,0.3680979649999984 -Nb4Te2_129_13171.vasp,Nb4Te2,-4.791284953333333,0.1155361399999939 -In2Pb2Cl6_11_8525.vasp,In2Pb2Cl6,-1.382711956,0.12125236237500014 -K2Cl2_129_9080.vasp,K2Cl2,-1.25633899,0.14817587499999996 -Te2Rh2Br2_11_18496.vasp,Te2Rh2Br2,-1.5966205866666667,0.09412314833333313 -V6O14_31_20390.vasp,V6O14,-5.4942451605,0.030141569499995136 -Cr4S4F12_14_4624.vasp,Cr4S4F12,-2.7072888495000003,0.25327224537499704 -Ag2Bi2Se4_26_197.vasp,Ag2Bi2Se4,-1.11522071375,0.0774184337499999 -Mn1Nb2W1Se4_6_10822.vasp,MnNb2WSe4,-3.69357316625,0.6928979583593746 -In1I2_187_8275.vasp,InI2,-0.30932366666666666,0.23159649166666663 -Zr1Bi1Se3_1_21258.vasp,ZrBiSe3,-2.899467974,0.28689264083333343 -P1S1I1_156_13942.vasp,PSI,-1.7735449133333334,0.4651069487626238 -Cd3S1I2O1_1_3617.vasp,Cd3SI2O,-0.18596678142857143,0.23212248440476063 -Te1Ir1I1_156_18293.vasp,TeIrI,-1.6800937633333335,0.20559952499999667 -Co2As4I4O6_11_3853.vasp,Co2As4I4O6,-2.88902181375,0.1179585804166654 -Mn1P2O8_2_10838.vasp,MnP2O8,-4.868881107272727,0.26189618392044556 -H2Pt1O2_164_7020.vasp,H2PtO2,-3.2922569860000004,0.5366041819166631 -Mn1Nb3I1Br2O3_1_10823.vasp,MnNb3IBr2O3,-4.24137316,0.10803742322915999 -Ag2Te2_164_462.vasp,Ag2Te2,-0.0823298225,0.27530262041666664 -Cr2P2O8_5_4449.vasp,Cr2P2O8,-5.180983510833333,0.2837203294444448 -V3O1F11_1_20284.vasp,V3OF11,-3.437924707333333,-0.20772287158333616 -Pt1S2_164_14589.vasp,PtS2,-2.6401953666666667,0.0049493533333331285 -Sn1Sb1Se1S1Cl2_1_16685.vasp,SnSbSeSCl2,-1.8031043316666666,0.3060779683333314 -Rb4P4Se24_29_14977.vasp,Rb4P4Se24,-2.0702739253125,0.09869239312499989 -Cu2As2O6_162_5009.vasp,Cu2As2O6,-3.43349498,0.3067290761249969 -Mo2O5_35_11649.vasp,Mo2O5,-4.909033714285714,0.3224672723809485 -H8Pb1C10Br2N2_10_7093.vasp,H8PbC10Br2N2,-5.383799267826086,0.13382837956521465 -Zr3C2Se2F2_6_21760.vasp,Zr3C2Se2F2,-4.527077112222222,0.9266082209722126 -Cu2H12C14N10_1_5104.vasp,Cu2H12C14N10,-5.739838988157895,-1.7316862564912365 -Ni2Se4Cl2_11_13646.vasp,Ni2Se4Cl2,-1.08575477875,0.16371142458333332 -Zr4S4F4_31_21843.vasp,Zr4S4F4,-4.337940420833333,0.3826005458333239 -Cs2S6N2F2_1_4782.vasp,Cs2S6N2F2,-2.4785620891666666,0.19849225760416256 -Y1Ge5_47_20637.vasp,YGe5,-3.25427818,-0.12173304194444712 -Na2Hf1O6F6_143_12145.vasp,Na2HfO6F6,-2.762538972666667,1.050480279166667 -Hf2C1Se2_164_7459.vasp,Hf2CSe2,-5.84216045,-0.023682755999999028 -Ca4Fe2S6Cl2_129_3217.vasp,Ca4Fe2S6Cl2,-2.5929054,-0.1550074814285759 -Tc3Br8_1_18239.vasp,Tc3Br8,-2.326926698181818,0.14872387409090182 -Hf2As2S6_2_7430.vasp,Hf2As2S6,-4.2434572930000005,0.22556125437499697 -Sn1_123_16709.vasp,Sn,-0.59023658,-3.197660065 -Mg1I2_115_10377.vasp,MgI2,-0.7139681033333334,0.1477861433333333 -K2S6F2_11_9335.vasp,K2S6F2,-1.852106961,0.30960282462500044 -Ta2S2_8_17854.vasp,Ta2S2,-5.407741805,0.3603787412499946 -Yb2Cl2O2_164_20865.vasp,Yb2Cl2O2,-5.111292833333334,-0.9808672916666668 -Zr2Te3Mo1S3_157_21714.vasp,Zr2Te3MoS3,-3.42078699,0.16929922705554784 -Ni2S2I2_59_13584.vasp,Ni2S2I2,-0.72330068,0.10191634618055467 -Tl4Se4Br4_14_19625.vasp,Tl4Se4Br4,-0.8576248624999999,0.29617948861111026 -La2Sb1I2_164_9611.vasp,La2SbI2,-2.692240338,0.04647357800000007 -Y4Se6_1_20837.vasp,Y4Se6,-4.360906738,0.39717927850000034 -Cd2Sb2S4Cl2_11_3560.vasp,Cd2Sb2S4Cl2,-1.4658439189999999,0.20575368925000026 -Zr1Ni1F6_5_21374.vasp,ZrNiF6,-3.28003292375,0.0735150012500001 -Sn1S2_164_16681.vasp,SnS2,-2.56251014,0.050624926666666514 -Te6Pd8Br8_2_18680.vasp,Te6Pd8Br8,-0.9224555868181817,-0.10314879511363784 -Sb4O6_1_15784.vasp,Sb4O6,-4.11496726,0.14252320750000003 -Nb1F4_123_12507.vasp,NbF4,-4.056220478,0.14316199599999613 -Li1P2Pd1S6_5_9774.vasp,LiP2PdS6,-2.995357947,0.05096695532812212 -Ti1Ga4O8_12_18783.vasp,TiGa4O8,-5.030272927692308,-0.22470319326924093 -Pb2C2Br2_59_14227.vasp,Pb2C2Br2,-1.8515610516666667,1.6722071099999967 -Cs2Cd4Se2O6F6_31_4695.vasp,Cs2Cd4Se2O6F6,-1.910209149,0.36096213024999724 -Cs3Nb2I9_187_4800.vasp,Cs3Nb2I9,-1.12832569,0.2088990417857126 -Mn2S2_164_11220.vasp,Mn2S2,-2.73343112,0.22410510249999982 -Ge4As4S4_17_6925.vasp,Ge4As4S4,-3.1574242116666666,-0.6546372415624999 -Ni1H4C2N6Cl2_6_13337.vasp,NiH4C2N6Cl2,-4.255333164666667,0.39320772305554375 -Sr2Te2Au1I2_38_17327.vasp,Sr2Te2AuI2,-0.9450538085714285,0.23356821738095035 -Al4S6_31_1088.vasp,Al4S6,-3.6758592890000004,0.06343447074999986 -Li5Ni1O1F5_8_10258.vasp,Li5NiOF5,-3.318845464166667,-0.38000260250000223 -Nb4N3O2_164_13096.vasp,Nb4N3O2,-7.40284778,-0.07406475125000611 -Cr1Sb1O4_10_4254.vasp,CrSbO4,-4.547407838333333,0.13988512083333315 -Ti2Mo1Os1Cl4O6_1_18964.vasp,Ti2MoOsCl4O6,-4.644772281428572,0.2094208608035563 -Ca2F4_2_3013.vasp,Ca2F4,-3.32315904,0.5205892566666663 -Nb2Ni4Se2S2_51_12786.vasp,Nb2Ni4Se2S2,-2.4252762900000002,0.6490681129999973 -Cu2P2O6_12_5208.vasp,Cu2P2O6,-3.9460894140000002,0.5713918995000005 -Cu2Cl2O2_59_5078.vasp,Cu2Cl2O2,-1.2976140116666668,0.24553628958333162 -Zr4B3H2_164_21804.vasp,Zr4B3H2,-4.97412557,0.04423924472221874 -Bi1F2_115_2330.vasp,BiF2,-1.8327077033333332,0.8816606211111088 -As8Pb4_26_1400.vasp,As8Pb4,-2.1788185083333333,0.3037664899999972 -Zr4I2Br2N1O3_3_21827.vasp,Zr4I2Br2NO3,-4.723507805833333,0.15687742166665997 -Fe2Te6As2_162_6025.vasp,Fe2Te6As2,-1.614614993,0.30882470216666535 -Cu2Te1I1O1_1_5321.vasp,Cu2TeIO,-0.8335944559999999,0.3651566481249999 -Li3V5O14_8_10152.vasp,Li3V5O14,-5.209748818636363,0.22146512818181918 -Sn1Bi1Se1S1I2_1_16613.vasp,SnBiSeSI2,-1.3068908116666667,0.22012667861111113 -Hf1Se2_115_7307.vasp,HfSe2,-4.129275456666667,0.5985428066666669 -Y2Br2_164_20703.vasp,Y2Br2,-3.20855698,0.142158044166663 -Cr2H2_164_4402.vasp,Cr2H2,-3.057479195,1.9558920075000001 -Hf1F2_164_7153.vasp,HfF2,-4.441079163333334,0.6729112141666609 -Mg2Ge2O6_51_10460.vasp,Mg2Ge2O6,-4.335319522000001,0.5380346154999991 -Nb1Cl5_47_12491.vasp,NbCl5,-2.049313685,0.42415136166666656 -Sr2I4_51_17260.vasp,Sr2I4,-1.0852709983333333,0.20077236055555558 -V1Te1O1_156_19934.vasp,VTeO,-3.7682483033333334,0.3293951669841204 -Al1Cu1As2S6_149_637.vasp,AlCuAs2S6,-2.641325043,0.4832901791874973 -In2N2Cl2_1_8485.vasp,In2N2Cl2,-2.9315217683333334,-0.15575675854166904 -Y1Mn1Se1Br1O2_6_20652.vasp,YMnSeBrO2,-4.217736925,0.11590214056249248 -Ni2N8O16_14_13542.vasp,Ni2N8O16,-4.215986058461539,0.07636225134614638 -Y1Cl2_164_20622.vasp,YCl2,-3.4086261066666665,0.16298509805555228 -Sn6Sb6_2_17000.vasp,Sn6Sb6,-1.6528179916666668,0.1833113348958333 -Li2Ru1_187_10050.vasp,Li2Ru,-1.87253604,0.5285044327777757 -Cr1F5_10_4172.vasp,CrF5,-2.1202068400000003,0.4224414699999999 -Pd1S1_156_14383.vasp,PdS,-1.384615215,0.7255161250000002 -Re1Ag2I6_147_14990.vasp,ReAg2I6,-0.3698433211111111,0.1784503111342587 -Mg2Sb4_10_10510.vasp,Mg2Sb4,-1.423922195,0.28625657374999836 -Te2Ru1_187_18511.vasp,Te2Ru,-2.0882322933333333,0.5327624166666669 -La2S2_47_9609.vasp,La2S2,-3.1989949775,1.50962409 -Ga2Ni2Te5_164_6412.vasp,Ga2Ni2Te5,-1.1344164866666668,0.03072481177777714 -B4As20_26_1744.vasp,B4As20,-2.956012268333333,0.7803983420833291 -Zn2Hg3Se6_147_21107.vasp,Zn2Hg3Se6,0.041911323636363636,0.07427253984848264 -Sb4W2O12_4_15840.vasp,Sb4W2O12,-5.048917992222222,0.1123211652777778 -Cu4Se4I4_14_5474.vasp,Cu4Se4I4,-0.453794295,0.100041638055555 -Tl1As2Au1Se6_149_19217.vasp,TlAs2AuSe6,-1.6396816810000001,0.30645122337499764 -Co1Br2_164_3709.vasp,CoBr2,-0.84118327,0.1776799466666657 -Ti4B3S2F2_164_19123.vasp,Ti4B3S2F2,-5.104368042727272,0.3209904803409005 -Na1Ni1Sb2S6_149_11917.vasp,NaNiSb2S6,-2.0714474750000003,0.3803615980937474 -Ta1Sb4Mo1_6_17614.vasp,TaSb4Mo,-3.1270624999999996,0.30470000429166233 -Cu1As1Br2_6_4833.vasp,CuAsBr2,-0.66938601,0.33562913388888715 -Fe2Bi2S4Br2_10_5808.vasp,Fe2Bi2S4Br2,-1.9160263149999999,-0.02011267499999969 -P2Pt3O8_164_14034.vasp,P2Pt3O8,-4.0936568676923075,0.45899928490384284 -Cu2H4Br2N6_2_5115.vasp,Cu2H4Br2N6,-3.62224498,0.10800664410714012 -V6F24_147_20385.vasp,V6F24,-3.256851552666667,0.023497896333333212 -Nb4Pd2O10_59_13121.vasp,Nb4Pd2O10,-5.826557545625,0.07256237343750072 -Ba3P3_25_2125.vasp,Ba3P3,-2.1581875,0.9785615083333337 -Mg2V4S10_59_10532.vasp,Mg2V4S10,-3.0998559675,0.22993144249999986 -In1Cu1Te6P2_149_8241.vasp,InCuTe6P2,-1.553132549,0.32513162671428275 -Cr2As4Au2S12_13_4314.vasp,Cr2As4Au2S12,-2.4712546845,0.5299344547500002 -Al2Cl2O3_1_790.vasp,Al2Cl2O3,-3.973773994285714,0.45825808499999854 -Ta2Ni2S10_51_17794.vasp,Ta2Ni2S10,-3.41755843,-0.15035178245536063 -In2Fe2Se5_156_8438.vasp,In2Fe2Se5,-1.757100331111111,-0.039858277777779394 -Li1Ni1Sb2S6_5_9765.vasp,LiNiSb2S6,-2.21204538,0.3763711159687476 -Ti1Ag1F6_2_18736.vasp,TiAgF6,-2.926935995,0.055704873749999884 -Li4C1O4_5_10169.vasp,Li4CO4,-4.69240589,0.1807414994444403 -Ni2Sb1Te2_187_13603.vasp,Ni2SbTe2,-0.924774494,0.07316147099999992 -K2Y2P4Se12_4_9392.vasp,K2Y2P4Se12,-3.0013647815,0.09001468524999989 -Ni2Te2Cl2_59_13659.vasp,Ni2Te2Cl2,-0.6682394,-0.018736520833333326 -In8Bi4S18_11_8713.vasp,In8Bi4S18,-2.3869731520000004,0.022365384555555617 -Tl2Pt4O6_164_19489.vasp,Tl2Pt4O6,-2.735445414166667,0.3687269400771578 -Te6As2Ir2_162_18640.vasp,Te6As2Ir2,-2.247231756,0.3870682276666654 -Pb1Se2_164_14209.vasp,PbSe2,-1.5584912400000002,0.5108143734027758 -Ba1Tl1Co2O6_1_1872.vasp,BaTlCo2O6,-3.220728526,0.4226827559374967 -Y7I10_2_20850.vasp,Y7I10,-2.517591615882353,0.09809937303921168 -Ni1Ir1Se1S1I2_6_13369.vasp,NiIrSeSI2,-1.316475845,-0.010570386851855525 -Tl1Cu1Sb2O6_149_19255.vasp,TlCuSb2O6,-3.2039973779999995,0.5260433009166569 -Sr2Co2Sn2_129_17193.vasp,Sr2Co2Sn2,-0.8978007250000001,0.3855623566666656 -Te3Rh4Se1_6_18558.vasp,Te3Rh4Se,-2.0182481075,0.2724770490277759 -Hf1Cl1F1_156_7142.vasp,HfClF,-4.0552232833333335,0.3543069422916587 -Bi4S4O2_129_2639.vasp,Bi4S4O2,-2.932763568,-0.6778175606666685 -Mn2B1H2O2_164_10993.vasp,Mn2BH2O2,-3.97561006,0.3352398628571399 -Zn1Cu1Br1Cl1F2_1_20918.vasp,ZnCuBrClF2,-0.73509854,0.17637719208333336 -Ga1Ni1S2I2_6_6215.vasp,GaNiS2I2,-1.21738031,0.16449799692707684 -Cs2Cl10_127_4707.vasp,Cs2Cl10,-0.396666555,0.23294487749999965 -Zr2O6_59_21621.vasp,Zr2O6,-6.028875105,0.19765770156250007 -P4O6_4_14088.vasp,P4O6,-5.147921694,0.11088205960000064 -Fe2Pd4Se4_49_5927.vasp,Fe2Pd4Se4,-1.278244135,0.16686818359574218 -Mg6V1C1_25_10599.vasp,Mg6VC,-1.0735894875,0.1950028394444377 -Sr1Te2F2_1_17093.vasp,SrTe2F2,-1.6181666700000001,1.2986576346666672 -Hg1S1_156_7909.vasp,HgS,0.103435825,0.309649185 -Nb1Cu1Ni1I2N3_1_12497.vasp,NbCuNiI2N3,-3.01940385625,0.4195303275208333 -K1Pb2C2O6F1_187_8928.vasp,KPb2C2O6F,-4.685011586666667,0.08011825302082887 -Ti1Br2_187_18751.vasp,TiBr2,-3.09123299,0.08731626666666692 -Mo2N1O2_2_11635.vasp,Mo2NO2,-5.186294302,0.2903678970000003 -Zr2S2_164_21653.vasp,Zr2S2,-4.2027689025,0.46642212250000004 -Nd1Ge2_123_13220.vasp,NdGe2,-2.82967805,0.7857662916666635 -Bi4S6_11_2640.vasp,Bi4S6,-2.379014006,-0.9255921089999999 -P6Pb6_2_14139.vasp,P6Pb6,-2.039854791666667,0.6794681265476168 -Na2Gd2Cl8_2_12084.vasp,Na2Gd2Cl8,-2.578088978333333,0.07954141388888658 -Co1C6F6_47_3718.vasp,CoC6F6,-4.5459764,0.3850076782692222 -Ga1I2_115_6202.vasp,GaI2,-0.49757651,0.2988993358333333 -Cs4Cd2Br8_11_4805.vasp,Cs4Cd2Br8,-0.47911013142857145,0.21837015571428559 -Cu2As4Se3Br2_6_5021.vasp,Cu2As4Se3Br2,-1.6889720563636366,-0.265538364469701 -Tb2Cl2_164_18189.vasp,Tb2Cl2,-2.547004955,0.11334747833333103 -Cu1Te2_164_4996.vasp,CuTe2,-0.5151541566666666,0.38709478555555477 -Sr4Fe2S2O6_129_17436.vasp,Sr4Fe2S2O6,-3.7147804621428575,0.25272553357141825 -Mn4O14_51_11444.vasp,Mn4O14,-3.864067937222222,0.23152648041666302 -Er2Cu2Pb2Se6_51_5557.vasp,Er2Cu2Pb2Se6,-2.2744239275,0.18995351291666696 -Sc3Nb1Te4_6_16215.vasp,Sc3NbTe4,-3.14337782875,0.37889102875000047 -Ti4O14_1_19147.vasp,Ti4O14,-5.639327783333333,0.3222964987499948 -Os2Cl8_14_13844.vasp,Os2Cl8,-1.558437388,0.06305182499999984 -Mg2Sn2F8_1_10517.vasp,Mg2Sn2F8,-3.023601770833333,-0.12014936708333313 -P2Au2S6_2_13957.vasp,P2Au2S6,-2.283486191,0.07895152749999745 -Si1C1F2_156_16324.vasp,SiCF2,-4.327470355,0.715928300416667 -Mg4P2_59_10580.vasp,Mg4P2,-1.510544955,0.4303360425694438 -Fe2As2S6_162_5784.vasp,Fe2As2S6,-2.7011675310000003,-0.33553199462500305 -Sc2C1S2F2_164_16055.vasp,Sc2CS2F2,-3.6038329357142858,1.2639145173809414 -Sr2Mn2Si2_129_17276.vasp,Sr2Mn2Si2,-2.029670265,0.3431316154166635 -Ag1Sb1P2S6_143_118.vasp,AgSbP2S6,-2.736009586,0.032169411510417634 -Na1Al1I4O12_2_11811.vasp,NaAlI4O12,-3.087241006666667,0.13243100124999718 -Al2Te6P2_162_1022.vasp,Al2Te6P2,-2.1012750000000002,0.01563725199999999 -Au1O1F1_25_1432.vasp,AuOF,-0.7979348,0.5295730164814801 -Zr1O2_164_21387.vasp,ZrO2,-6.896310133333333,0.2866790100000003 -Ag2Cl2_51_247.vasp,Ag2Cl2,-0.0439669475,0.08535198000000002 -Ta2I2_129_17758.vasp,Ta2I2,-3.1640710275,1.1594675516071364 -Nb3F8_156_12972.vasp,Nb3F8,-4.2262196154545455,0.2448747290909048 -Te12P12_7_18276.vasp,Te12P12,-2.3195949358333334,0.489295935 -Ba3Cl6_5_2100.vasp,Ba3Cl6,-2.3964489466666667,0.3277464366666667 -Be2Br4_2_2245.vasp,Be2Br4,-1.8413921,0.24684452666666679 -Ta2B1H2O2_164_17653.vasp,Ta2BH2O2,-5.930036815714286,0.73075678457141 -Mn5Br2Cl3O6_1_11459.vasp,Mn5Br2Cl3O6,-3.092938856875,0.047951198177081156 -Bi1As1W1_156_2314.vasp,BiAsW,-3.139698093333333,0.287064225555552 -Ir3Pd1S8_1_8855.vasp,Ir3PdS8,-2.9599923133333337,-0.06352306229166715 -Cr2As4_2_4315.vasp,Cr2As4,-3.1247694900000003,0.2158585924999965 -Y3C2S2F2_187_20792.vasp,Y3C2S2F2,-4.580225505555556,1.392231292407395 -Pd2Se2_11_14494.vasp,Pd2Se2,-1.4873978025,0.23945790999999983 -Ag3P1S4_156_499.vasp,Ag3PS4,-1.3729324625,0.3895839575000002 -Hf1Zr1Se2_1_7401.vasp,HfZrSe2,-4.4631446575,-0.23363708250000004 -La2Cl2_164_9587.vasp,La2Cl2,-2.7329742825,0.22035782150000083 -Ta1Br2_115_17518.vasp,TaBr2,-2.633527126666667,0.7760970897618982 -Cr2C1O2F2_164_4341.vasp,Cr2CO2F2,-3.372892998571429,1.082727289653671 -Ca3Fe2Cl2O5_123_3174.vasp,Ca3Fe2Cl2O5,-3.6612558991666666,0.019034385833329504 -Nb2Cl2O1_1_12675.vasp,Nb2Cl2O,-4.113388154,0.5688642957618999 -In2F6_12_8424.vasp,In2F6,-2.51191002625,0.10442838124999998 -Ge2Sb2S6_147_6854.vasp,Ge2Sb2S6,-2.652750487,0.32866250979166456 -Mn1Sn2Sb1Br4O6_1_10902.vasp,MnSn2SbBr4O6,-2.981887989285714,0.15014597544642427 -Ca2H8S4Br4_53_3044.vasp,Ca2H8S4Br4,-2.7341663916666668,0.06379146444444173 -Ga3S2O14_164_6534.vasp,Ga3S2O14,-3.6557135142105266,0.5353554294078908 -Tl2Se2F2_59_19528.vasp,Tl2Se2F2,-1.3238105866666667,0.7475003394444425 -Ga1Cu1S2Br1Cl1_25_6167.vasp,GaCuS2BrCl,-1.4266103583333332,0.29455891872685036 -Nb2O2_6_12794.vasp,Nb2O2,-5.962010635,0.557482658333333 -K2C2Se2Cl6O6_1_9026.vasp,K2C2Se2Cl6O6,-2.7243813683333333,0.5400528570833281 -Ag1Pd2O4_187_102.vasp,AgPd2O4,-2.3325509414285714,0.20850538999999846 -Al3Te4_164_1055.vasp,Al3Te4,-2.1599200185714285,0.0812149594642837 -Nb4Te12Cl2_2_13165.vasp,Nb4Te12Cl2,-2.640199900555556,0.13936595605158186 -Na2Ru2C2S4I8_13_12278.vasp,Na2Ru2C2S4I8,-1.8236947549999998,0.28758169840277603 -In2Ni2S5_156_8496.vasp,In2Ni2S5,-1.8457902933333332,0.19165926314814646 -Ge1Bi2Te4_156_6650.vasp,GeBi2Te4,-1.7317195542857142,-0.19411208000000135 -Ca1Cu1Ag1S1Br2N1_1_2822.vasp,CaCuAgSBr2N,-1.717153777142857,0.18650139011904182 -Sb4O8_11_15790.vasp,Sb4O8,-4.226056385000001,0.19202048208333267 -K3V5O14_157_9407.vasp,K3V5O14,-4.833694736363636,0.22705584136363655 -Pd2Au1S4_187_14395.vasp,Pd2AuS4,-1.7305141757142857,0.13076816339285346 -Ag2B4I2N2F4_2_188.vasp,Ag2B4I2N2F4,-3.5353341435714287,0.3045781194444323 -Li4S12_13_10218.vasp,Li4S12,-2.726401224375,0.02225648648437506 -Rb4As4O8_57_14961.vasp,Rb4As4O8,-3.6922874075,-0.025008331250003124 -Ti4H2N3_164_19139.vasp,Ti4H2N3,-7.069349273333334,-0.24899478666667285 -Hg1F2_187_7853.vasp,HgF2,-0.23851735666666665,0.20822619916666665 -Ti2S2N1_164_19000.vasp,Ti2S2N,-6.33223914,-0.1040976020000004 -Al1_191_759.vasp,Al,-1.6782724,0.7457084649999999 -Cu1Hg2H16C8N8Cl2_2_4905.vasp,CuHg2H16C8N8Cl2,-4.561342521351351,-0.04261049984001686 -Zn2Mo2Se2O12_18_21120.vasp,Zn2Mo2Se2O12,-3.9530924427777783,0.05338184555555103 -Cd2S1O1_1_3540.vasp,Cd2SO,-0.74786434,0.40042344729166673 -Eu1Si2_164_5594.vasp,EuSi2,-2.8948908,1.2161664 -Co1Mo1S2I2_1_3780.vasp,CoMoS2I2,-1.8915757199999998,0.2778687750146165 -Mn2Te4H2_11_11319.vasp,Mn2Te4H2,-1.99079720625,0.5474895175000001 -Tl1Ga1Hg1Te4_156_19274.vasp,TlGaHgTe4,-0.64969216,0.41452789333333184 -Hf2Si4_129_7619.vasp,Hf2Si4,-4.778816183333333,0.5091789366666664 -Li2Pr1As2_164_10043.vasp,Li2PrAs2,-3.0959659840000002,0.3428403434999998 -Zr1P2Pd1Se6_1_21393.vasp,ZrP2PdSe6,-2.8596762940000002,0.22063816359374444 -Tl1Br1_99_19228.vasp,TlBr,-0.034294985,0.5424172650000001 -Sn4S4O16_11_16958.vasp,Sn4S4O16,-4.1938815145833335,0.07794087268228837 -Zr2C1Cl2_164_21531.vasp,Zr2CCl2,-4.848480862000001,0.026916275999999684 -Ni1I2O6_1_13361.vasp,NiI2O6,-2.3833422455555553,0.008935178888886952 -Ag2Sb4S3F2_6_412.vasp,Ag2Sb4S3F2,-1.6910144372727274,0.48422784212120945 -Ni3P2Se8_164_13709.vasp,Ni3P2Se8,-1.7491332276923077,0.2223699722115361 -Nb2Br1N2Cl1_25_12645.vasp,Nb2BrN2Cl,-5.5213325483333335,0.06472699259999004 -Ta4H2C3O2_164_18048.vasp,Ta4H2C3O2,-7.034051354545454,0.19295299159089474 -H4Au1C12O2_6_7050.vasp,H4AuC12O2,-5.599443595789474,0.9653198190350849 -Mg1I1Cl1_1_10375.vasp,MgICl,-1.34387987,0.12051102583333312 -Sb2H2Se2O10_4_15583.vasp,Sb2H2Se2O10,-3.867518921875,0.1442530925520833 -Tl8O6_11_19649.vasp,Tl8O6,-2.1249604485714286,0.0670790349999999 -Sn1Au1Br2O2_1_16604.vasp,SnAuBr2O2,-1.7508444683333335,0.3386503352083332 -Ti1Ni1Ir1Se3S2_6_18810.vasp,TiNiIrSe3S2,-2.9823369425,0.07220386500000053 -Pb4W4O8_13_14325.vasp,Pb4W4O8,-4.35848901,0.6743323464795854 -V4O10_11_20343.vasp,V4O10,-5.508465787857142,-0.04988720571428562 -H2Pd2Se4_11_7017.vasp,H2Pd2Se4,-2.1055531225,0.48713937250000017 -Nb12O26_51_12458.vasp,Nb12O26,-6.808109981052632,-0.013565375328952078 -Ta1Zn1O3_8_17642.vasp,TaZnO3,-4.8167319399999995,0.5107869824999971 -Co2F2_164_3898.vasp,Co2F2,-1.62823587,0.526532324375 -In2S2Cl2_31_8544.vasp,In2S2Cl2,-1.9037287666666665,0.13927830833333155 -Ge3P2S9_174_6915.vasp,Ge3P2S9,-3.043428007142857,0.19542293831472923 -In2As2Se6_147_8376.vasp,In2As2Se6,-2.177931145,0.11724207549999999 -Te4As2Au2_26_18559.vasp,Te4As2Au2,-1.05260856375,-0.1130299246875 -Pb1O1_156_14191.vasp,PbO,-2.86521819,0.2758634696875 -Sc1Ag1Te6As2_149_15895.vasp,ScAgTe6As2,-1.7431508900000001,0.22090493116666504 -Nb2Co4Te2S2_51_12700.vasp,Nb2Co4Te2S2,-3.174577186,-0.12798356195833782 -Sb2Pb2C2O6F6_7_15637.vasp,Sb2Pb2C2O6F6,-3.5724468655555555,0.6134444182638854 -In1Sn1Br1Cl1O2_1_8353.vasp,InSnBrClO2,-2.6548601566666665,0.174895442499996 -Bi4O6_59_2625.vasp,Bi4O6,-3.570533873,0.2874603549999999 -Sc1Sb2Au1O6_149_15992.vasp,ScSb2AuO6,-3.650196945,1.0802289951250006 -Cd2S2I1Br3_1_3546.vasp,Cd2S2IBr3,-0.30048052875,0.2610174554166667 -Mn1Ga1Cu2Se3Br2Cl3_1_10719.vasp,MnGaCu2Se3Br2Cl3,-1.1671129133333333,0.20516009502083132 -Ta3Ni3Se14_6_17973.vasp,Ta3Ni3Se14,-2.8583702294999997,-0.3432777013750018 -Co1I2_115_3775.vasp,CoI2,-0.07054171,0.47267672111111064 -Sb2O3_1_15615.vasp,Sb2O3,-3.97925782,0.2782326475000003 -Mg1Mn1Cu1S2Br2Cl2_1_10384.vasp,MgMnCuS2Br2Cl2,-1.5093791844444444,0.21488501613888322 -Li6Bi2H16O14_2_10260.vasp,Li6Bi2H16O14,-4.2021766460526315,0.05913066881578599 -Al1Cl2_187_630.vasp,AlCl2,-1.5777165899999999,0.722289953888887 -Pd1Br2O8_147_14345.vasp,PdBr2O8,-1.99442206,0.6271914565909058 -Sr1F2_187_17047.vasp,SrF2,-3.2566221166666662,0.556894553333334 -Pt4I2N3Cl2O1_1_14703.vasp,Pt4I2N3Cl2O,-2.2753130925,0.31626265343749727 -V3B2S2F2_187_20244.vasp,V3B2S2F2,-3.8233150799999995,0.5674336656084586 -Zn1Te1_156_21021.vasp,ZnTe,0.273793015,0.396473875 -B1Se1_156_1637.vasp,BSe,-3.05371469,1.1212700925 -In2O1_164_8507.vasp,In2O,-2.3737007566666666,0.8567097483333308 -Mn2Bi2Te4Br2_26_11020.vasp,Mn2Bi2Te4Br2,-1.2624502899999999,0.27527443238792915 -Mn1Zn1Br2O1_8_10938.vasp,MnZnBr2O,-1.4621156,0.18836871550000012 -Zr1Cl2_115_21275.vasp,ZrCl2,-2.64891934,0.5302894 -Sb2Te6As2_157_15733.vasp,Sb2Te6As2,-1.728046639,0.25184390349999997 -Hg4P4O16_57_8085.vasp,Hg4P4O16,-3.6875411520833334,0.22353990302082982 -Cu2P2Se6_2_5215.vasp,Cu2P2Se6,-1.9173895890000001,0.12917743327083123 -V6Se18_11_20395.vasp,V6Se18,-2.7932740375,0.0693903345000002 -Ca1Ge1Br2_8_2838.vasp,CaGeBr2,-1.4240772325,0.56676692125 -Pt3Se1S1I1Br1O1_1_14694.vasp,Pt3SeSIBrO,-1.63072206625,0.5288870081250001 -In1Ge1S1I2Br2_1_8263.vasp,InGeSI2Br2,-1.1217533885714286,0.2712944442708312 -Mg4N2_59_10579.vasp,Mg4N2,-2.754120185,0.2783679331944433 -Tl1Hg1Se1S1_8_19286.vasp,TlHgSeS,-0.5354901975,-0.13358073945312499 -Ir2S2_12_8823.vasp,Ir2S2,-3.22962254,0.6029040183333292 -Tl2Se5_12_19539.vasp,Tl2Se5,-1.3276796614285715,0.1960925314285713 -Ag1Au1S1Br2_1_10.vasp,AgAuSBr2,-0.27715060999999996,0.11670091329166432 -Sc3Pt1I1Br3O4_8_16216.vasp,Sc3PtIBr3O4,-3.8481576375,0.2709141547291605 -Sc2S2_164_16137.vasp,Sc2S2,-3.87565853,0.0001775849999998691 -Nb2Se4Br4_12_12880.vasp,Nb2Se4Br4,-2.7233687939999998,0.06622502100000016 -Ta2I8_1_17768.vasp,Ta2I8,-1.558504785,0.13068938321875012 -Nb4S2_129_13143.vasp,Nb4S2,-5.642668025,0.01151640333332793 -Cu2Te3As4I2_6_5343.vasp,Cu2Te3As4I2,-1.31202912,0.17664364649350286 -In1Br2_187_8213.vasp,InBr2,-0.7324497166666667,0.29900049375000004 -Ca1In1S1Br3_1_2852.vasp,CaInSBr3,-1.7522956966666667,0.14609021791666676 -Al1Se2_115_738.vasp,AlSe2,-2.616776693333333,0.22840872388888678 -Ga8O6_11_6588.vasp,Ga8O6,-3.5457052292857143,0.24997841571428436 -Cu8S2O24_7_5504.vasp,Cu8S2O24,-2.705829849705882,0.43551776338235015 -Sb1Br2_115_15439.vasp,SbBr2,-0.7385248633333333,0.4919502524999989 -Zn5N2O16_10_21237.vasp,Zn5N2O16,-2.732488217391304,0.5046741111956461 -Al2Te6As2_162_1021.vasp,Al2Te6As2,-1.955328695,0.20905305762500004 -Ga2Se2Br2_59_6467.vasp,Ga2Se2Br2,-1.7282182033333333,0.14814819916666688 -Y2P2H8O12_13_20765.vasp,Y2P2H8O12,-5.436447832916667,0.056998311388889 -Bi2W1_164_2580.vasp,Bi2W,-2.26479046,0.38562392666666456 -Pd2F6_162_14424.vasp,Pd2F6,-1.18081105,0.19027271375 -Na2Hg2Cl6_11_12149.vasp,Na2Hg2Cl6,-0.657765704,0.09655093225000005 -Tl1H2_115_19283.vasp,TlH2,-1.4734689466666666,1.6729315699999974 -Au4Se2_4_1593.vasp,Au4Se2,0.005927076666666666,0.9557848266666658 -Zr2Tl4S6_11_21729.vasp,Zr2Tl4S6,-3.0313422733333333,0.08943195416666416 -Na2In2Br8_4_12185.vasp,Na2In2Br8,-1.1739734641666668,-0.17323501000000097 -Ag2F2_164_254.vasp,Ag2F2,-0.3522383,0.39380885499999996 -Na1Ga1As2S6_5_11858.vasp,NaGaAs2S6,-2.681286689,0.13876492868749768 -Zn2H8Cl4O12_14_21102.vasp,Zn2H8Cl4O12,-2.9598605850000004,0.19909451661858468 -Li1Co1Te6P2_5_9677.vasp,LiCoTe6P2,-2.04365185,-0.035871852833334494 -As1Se2_115_1179.vasp,AsSe2,-2.06330647,0.49304580138888654 -Na2Mg1Te2S8F4_2_12201.vasp,Na2MgTe2S8F4,-2.3053922411764707,0.35645696357842627 -Rb1Ti1Se2_156_14761.vasp,RbTiSe2,-3.0703292925,0.15980227562500016 -Lu1P2_21_10296.vasp,LuP2,-3.1998763033333333,0.8784324516666631 -Ce1Si2Au4_123_3655.vasp,CeSi2Au4,-1.2410187571428573,0.4278700871428571 -Nb2Te2F2_59_12907.vasp,Nb2Te2F2,-3.7722234033333333,0.041218606999993246 -Cu1Ir1Se2_6_4915.vasp,CuIrSe2,-1.577153185,0.5847651818750002 -Au2S4_14_1529.vasp,Au2S4,-1.2618723299999999,0.2852816464583321 -P1O1F1_156_13927.vasp,POF,-3.3513646599999998,1.0102468696666629 -N4O8_2_11795.vasp,N4O8,-4.5732453175000005,0.12979801833333227 -Sr2H8S4F4_53_17249.vasp,Sr2H8S4F4,-3.272964281666667,0.1527879099999967 -Ga1Ag1P2Se6_149_6118.vasp,GaAgP2Se6,-2.223020908,0.12365041654166448 -Ta1Bi1P1_156_17510.vasp,TaBiP,-4.316930233333333,0.31160894499999614 -Cu2Br4_14_5056.vasp,Cu2Br4,-0.017432336666666666,0.11785587833333336 -K4Cd2Cl8_11_9426.vasp,K4Cd2Cl8,-0.8420509042857143,0.20030629142857037 -Ti2P4O16_59_18985.vasp,Ti2P4O16,-5.633491505454545,0.27805307670454216 -Na2Hg4S8I6_31_12161.vasp,Na2Hg4S8I6,-0.6531235040000001,0.04951311397916769 -Zn1Ge1I1Br1_1_20942.vasp,ZnGeIBr,-0.4538650625,0.042901960937499956 -K2Te2H6C2O6_4_9372.vasp,K2Te2H6C2O6,-3.7925438244444445,0.4266171598888758 -Th1Sn2_123_18723.vasp,ThSn2,-2.324106583333333,0.10894873000000027 -Zr1As2H2O6_164_21243.vasp,ZrAs2H2O6,-4.856893300909091,0.31526932871211133 -Mn3Mo1S4Br2_1_11393.vasp,Mn3MoS4Br2,-2.570879444,0.12677084774999892 -Na1Al1Sb2Se6_5_11817.vasp,NaAlSb2Se6,-2.173377619,0.330130898833331 -Ag1Sn1S2Br2_8_134.vasp,AgSnS2Br2,-1.1034598216666667,0.245877266145829 -Te2Pd2_164_18475.vasp,Te2Pd2,-1.1245485075,0.05697484875000014 -Ca1Mn1Sn1Cl1O4_25_2856.vasp,CaMnSnClO4,-3.88306815625,0.1597457131250002 -Tl1F2_115_19262.vasp,TlF2,-1.3788015433333334,0.4083243133333334 -Al2Si2H4O9_8_981.vasp,Al2Si2H4O9,-5.586318811764706,-0.3559011058333379 -Ni3Sn1Se2_187_13728.vasp,Ni3SnSe2,-0.659706755,-0.08075468635416783 -W2Br6_162_20466.vasp,W2Br6,-1.73405943875,0.30087334093749973 -Ru6S8_11_15373.vasp,Ru6S8,-3.5015334692857145,0.19652469285713892 -Ga1Ge1Se2_1_6193.vasp,GaGeSe2,-2.3922608175,0.07318070750000005 -Co1Ru1S2Br1Cl1_6_3816.vasp,CoRuS2BrCl,-2.2500175616666667,0.09775861944443837 -Al2Co2S5_164_805.vasp,Al2Co2S5,-3.148229788888889,0.14714910143518223 -Au2C2I2O2_31_1462.vasp,Au2C2I2O2,-2.73797366375,0.34249138437499993 -Rb2H6C2S2O6_4_14850.vasp,Rb2H6C2S2O6,-4.270642982777778,0.12831046038194072 -Ta2Ni1S6_12_17791.vasp,Ta2NiS6,-4.219637631111111,0.08432189888888963 -Co1W2Cl10_5_3837.vasp,CoW2Cl10,-1.98345846,0.004378141538457864 -Nb1S2_164_12562.vasp,NbS2,-4.84366818,0.11371722500000025 -Mn2B1F2_164_10992.vasp,Mn2BF2,-3.069106444,0.23720199228571115 -Cu4Hg4S4Br4_26_5422.vasp,Cu4Hg4S4Br4,-0.15105567125,0.13477940708333336 -Ca3Au2Cl2O4_123_3150.vasp,Ca3Au2Cl2O4,-2.6288385645454544,0.3767017983333276 -Ag2S2_10_383.vasp,Ag2S2,-0.704892285,0.26333667984375003 -Al1Pt5Cl2_123_715.vasp,AlPt5Cl2,-1.67802256125,0.8384273724999973 -Sr2Mn2Sn2_12_17278.vasp,Sr2Mn2Sn2,-0.8286078966666667,0.5823100225862058 -Zn1Ni1Se2_8_20979.vasp,ZnNiSe2,-0.5056131925,0.2424722868749991 -Sc4O6_65_16253.vasp,Sc4O6,-5.9842330939999995,0.6214219017499998 -Ge1H2S2_164_6669.vasp,GeH2S2,-3.042225518,-0.20264440499999958 -Cu2H8C4N16O4_2_5142.vasp,Cu2H8C4N16O4,-5.398810110294117,-0.07019560070262303 -Na2H10C10N4O8_2_12090.vasp,Na2H10C10N4O8,-5.3309315594117646,0.42893794164704746 -Ca6Ge6O18_2_3257.vasp,Ca6Ge6O18,-4.750814578333333,0.16317854500000006 -Sr2In1Hg1Au1O5_99_17266.vasp,Sr2InHgAuO5,-2.5097727240000003,0.6942077653958305 -Be1I2_164_2224.vasp,BeI2,-1.1190266033333334,0.30526476833333316 -Ca2Pb2I8_6_3097.vasp,Ca2Pb2I8,-0.9192850725,0.07727344288888882 -Li4V2O4F2_51_10240.vasp,Li4V2O4F2,-4.475416949166667,0.13335257291665684 -Ba1S2F2_1_1853.vasp,BaS2F2,-2.7381557499999998,0.6323246217500007 -Nb4H2S2N3_164_13088.vasp,Nb4H2S2N3,-5.936713128181818,0.006240803333322775 -Si3P2O9_174_16474.vasp,Si3P2O9,-5.923997872857143,0.14378638771427962 -Li2O2F2_6_10033.vasp,Li2O2F2,-2.7179606933333336,0.5087216820833302 -Zn2Bi4S6F4_31_21049.vasp,Zn2Bi4S6F4,-1.90456968,-0.0026269107500019873 -W4N3_164_20587.vasp,W4N3,-6.585925658571428,-0.4675010471428631 -Sn2Te2_129_16893.vasp,Sn2Te2,-1.140644125,-1.1049161449999998 -Cu4Se2_191_5468.vasp,Cu4Se2,-0.29645151666666664,0.1192458824999989 -Ca2S6N2Cl2_59_3110.vasp,Ca2S6N2Cl2,-2.8258552600000004,0.23522322640624238 -P2W1_164_14056.vasp,P2W,-4.67973453,0.299823476666667 -Re2Bi2O8_51_15030.vasp,Re2Bi2O8,-4.764718875833333,0.46940010249999986 -Te4Rh2_14_18624.vasp,Te4Rh2,-1.396967495,0.8050510472222221 -K2Co2Sb2_12_9085.vasp,K2Co2Sb2,-0.9819853433333333,0.25209816499999893 -Co4Bi8S4O28_57_4077.vasp,Co4Bi8S4O28,-3.9115449504545454,0.10106989598484117 -Lu2H2Cl2_164_10310.vasp,Lu2H2Cl2,-3.2362749866666665,0.03777502666666699 -Co1Re2Rh1S8_1_3813.vasp,CoRe2RhS8,-3.7745097808333337,0.24039231527777483 -Sn12Pd4_127_16595.vasp,Sn12Pd4,-1.3185991125,0.4430009662499982 -Sn2Cl6_1_16765.vasp,Sn2Cl6,-1.31089685625,0.0872304162499985 -Cd4Br8_26_3623.vasp,Cd4Br8,0.33607620416666667,0.355960075 -Sr4Cu4Bi2O14_26_17424.vasp,Sr4Cu4Bi2O14,-3.22614176625,0.2607109791666631 -P4Au2Se3F2_6_14071.vasp,P4Au2Se3F2,-1.977008009090909,0.5284422411363592 -In1F1_99_8242.vasp,InF,-1.278189505,1.1531504483333312 -Sn4_191_16977.vasp,Sn4,-0.9283396525,-3.5357631375 -Sb4Te6_7_15839.vasp,Sb4Te6,-1.580216112,0.2660895619999999 -Na2Mn2Sb2_129_12214.vasp,Na2Mn2Sb2,-1.4574784550000002,0.2979341263362052 -H4Au4S4Br4_2_7062.vasp,H4Au4S4Br4,-1.34218041875,0.0724995865625001 -Ti1Tl2F6_164_18861.vasp,TiTl2F6,-3.278291468888889,0.1321059677777776 -Tl1Te6P2Au1_149_19354.vasp,TlTe6P2Au,-1.358691789,0.34330913474999425 -Os2S2Cl2_59_13866.vasp,Os2S2Cl2,-3.0049030900000004,0.31048016083332985 -Mn1Nb1I2O1_1_10805.vasp,MnNbI2O,-3.0128569,0.031663508333333645 -Si2N2F2_59_16411.vasp,Si2N2F2,-5.3383717,-0.339607489583337 -Co1Br2_115_3711.vasp,CoBr2,-0.52609734,0.49276587666666577 -Na2Ni2Bi2_129_12237.vasp,Na2Ni2Bi2,-0.24675303666666668,0.4518723099999994 -As2I2_2_1220.vasp,As2I2,-1.3815187875,0.14592421833333202 -Sr4Sb4H4Se8_14_17467.vasp,Sr4Sb4H4Se8,-2.5025501725000003,0.41484634699999745 -Na1In1Te6P2_5_11893.vasp,NaInTe6P2,-1.741979236,0.2915543176666654 -As4W2O12_4_1375.vasp,As4W2O12,-5.169182027777778,-0.07114524194444893 -Mn2As2S4I2_10_10977.vasp,Mn2As2S4I2,-2.252751103,0.37473290583333196 -Cu4Br2O6_11_5398.vasp,Cu4Br2O6,-1.6332047550000002,0.4366724414583327 -Fe1H4C2Br2N6_6_5691.vasp,FeH4C2Br2N6,-4.3828020573333335,0.2857083948055432 -K1Rb1Mg6O7_99_8931.vasp,KRbMg6O7,-3.4267089446666663,0.07881367333332806 -Cd2Br2_2_3479.vasp,Cd2Br2,0.68656189,-0.0017247606249999325 -Ni2H8C16S4N6O2_2_13519.vasp,Ni2H8C16S4N6O2,-5.382772422368421,0.5089266140131421 -Ni2O2_164_13547.vasp,Ni2O2,-1.7010633325,0.12478551250000014 -Au1C12S2F4_6_1416.vasp,AuC12S2F4,-4.9574203163157895,0.8582656689144665 -Zn2Ga2S5_187_21084.vasp,Zn2Ga2S5,-2.053656702222222,0.16348421211110953 -Ni2As1Se2_187_13444.vasp,Ni2AsSe2,-1.40852088,0.575480591777773 -Zr2Te2As1_164_21699.vasp,Zr2Te2As,-3.794536048,0.058328050000000076 -Ir4Se2S6_1_8865.vasp,Ir4Se2S6,-3.163944375833333,-0.258656486875 -Tc4I14_13_18250.vasp,Tc4I14,-1.4402584716666667,0.14217419055555425 -W2S2N1_8_20530.vasp,W2S2N,-5.303437606,-0.23244740866666636 -Ti2Sn2O6_147_19030.vasp,Ti2Sn2O6,-5.809960934,-0.014939352249999871 -Ag2Hg2Se2Br2_26_301.vasp,Ag2Hg2Se2Br2,0.18060370375,0.10339352562500001 -Sb2As2O6_7_15529.vasp,Sb2As2O6,-4.338901192,0.17112108199999998 -Mg3I6_5_10553.vasp,Mg3I6,-0.7389693488888889,0.12278489777777779 -Na1Co1Sb2Te6_149_11848.vasp,NaCoSb2Te6,-1.48103609,0.23853658573333014 -Cr1Pb3_191_4234.vasp,CrPb3,-0.177385475,2.1189997825000004 -As2H6Pb2S6N2_7_1218.vasp,As2H6Pb2S6N2,-3.3588414083333333,0.23419868411553604 -Ge2Bi6_12_6751.vasp,Ge2Bi6,-1.38725650625,-0.49386160375 -Sn2Te6P1_162_16902.vasp,Sn2Te6P,-1.534598061111111,-0.3705924020370379 -Mo2Br8_2_11580.vasp,Mo2Br8,-1.120146979,0.06250264500000013 -Pd1Pt3O8_10_14379.vasp,PdPt3O8,-3.173905490833333,0.2124992995833339 -Yb2I6_59_20880.vasp,Yb2I6,-1.501033375,-0.3805537520312501 -Lu2Bi2O6_147_10301.vasp,Lu2Bi2O6,-4.884514359,0.366640645875 -Ge2Sb2C2O6F6_7_6840.vasp,Ge2Sb2C2O6F6,-3.8034737300000003,0.6929414197222106 -Sr4Bi4Te8Cl4_14_17413.vasp,Sr4Bi4Te8Cl4,-1.8030977140000002,0.05398531499999992 -Li2H8C2N8O6_2_9955.vasp,Li2H8C2N8O6,-5.173071996538462,0.013116122499988947 -Mn2N4_187_11158.vasp,Mn2N4,-5.101908916666667,0.41816772749999465 -Ti1Br1F1_156_18748.vasp,TiBrF,-3.7831074233333335,-0.05143621722222791 -W2I4_11_20503.vasp,W2I4,-1.2318712416666666,0.8388193113888889 -Hg1Ge1S2Br2_1_7855.vasp,HgGeS2Br2,-1.2391220283333333,0.11064663719907239 -Fe3Se4_164_6067.vasp,Fe3Se4,-1.7810146314285713,-0.0039935421428588525 -Tl2F6_1_19410.vasp,Tl2F6,-1.54547207375,-0.07184511312499997 -Mn1Te1Mo1Se1_8_10905.vasp,MnTeMoSe,-2.234984835,0.2599919593749998 -As1I1O1_156_1149.vasp,AsIO,-2.3025986499999997,0.4938987694444421 -Rb2Cl2_129_14835.vasp,Rb2Cl2,-1.23736334,0.17793771000000014 -Ba2Ni3O8_47_2037.vasp,Ba2Ni3O8,-3.017273930769231,0.08784413586537837 -Li4P4O8_29_10214.vasp,Li4P4O8,-4.995724135,0.21766784039999104 -Ni1B4H4C2Br2_47_13269.vasp,NiB4H4C2Br2,-3.6568390184615387,0.6965661102670773 -Fe1H8C4S4N2_10_5710.vasp,FeH8C4S4N2,-4.558228624736842,0.06163292694077893 -Bi2P2Pb8O16_2_2490.vasp,Bi2P2Pb8O16,-4.093160415,-0.09656677531250196 -Cr1W3O8_25_4286.vasp,CrW3O8,-5.892206793333333,0.22411593363944995 -La2Ti2O8_129_9620.vasp,La2Ti2O8,-6.307308043333333,0.39418849593749394 -Ca8Ge4_1_3261.vasp,Ca8Ge4,-0.99188077,0.5047640966666666 -Cr3W1S8_25_4586.vasp,Cr3WS8,-3.6993957175,0.016463850000000058 -In2C4Cl4F10_10_8397.vasp,In2C4Cl4F10,-2.7219745790000003,0.4804597616666644 -K2Te2C2O6F6_1_9366.vasp,K2Te2C2O6F6,-3.214343025,0.6599322023611081 -Sb2Te5Pd2_8_15732.vasp,Sb2Te5Pd2,-1.3960544,0.34862011733333154 -Al2S5_12_951.vasp,Al2S5,-3.208358222857143,0.2105329767857118 -Rh2S6_11_15228.vasp,Rh2S6,-2.73718789625,0.44737734286458064 -Fe2S1Br2O2_1_5929.vasp,Fe2SBr2O2,-2.0598954785714283,0.4364237314285675 -V2Pb3O8_5_20144.vasp,V2Pb3O8,-4.627068975384615,0.10359524269230747 -Ba2Au1Br2O2_123_1903.vasp,Ba2AuBr2O2,-2.5559721242857143,0.1643633053061173 -Na4H8C8O12_14_12390.vasp,Na4H8C8O12,-5.094526445625,0.24187470247395404 -As2Cl2_12_1200.vasp,As2Cl2,-2.00101412,0.13131772333333158 -Sc5Br8_10_16267.vasp,Sc5Br8,-2.3308499115384618,0.09347881269230518 -W3C2_187_20560.vasp,W3C2,-6.266236672,0.4400079099999936 -Hg2P2S6_2_7981.vasp,Hg2P2S6,-2.049451061,0.06412237149999989 -V1Br2_187_19789.vasp,VBr2,-1.6849410566666665,0.06137377666666688 -Fe3C2Cl2_187_6048.vasp,Fe3C2Cl2,-2.852712614285714,0.8048904014285635 -Pr1Ge5_47_14530.vasp,PrGe5,-2.963680801666667,-0.057446364583336296 -Sc2Se2S1Br3_1_16158.vasp,Sc2Se2SBr3,-2.54901764625,0.4128284065625001 -Cr2C1S2_164_4344.vasp,Cr2CS2,-4.202751132,0.1325073309999958 -Cu2O4F2_17_5201.vasp,Cu2O4F2,-2.14896464,0.21456841812500005 -Hf1Zr1Nb2Te8_12_7387.vasp,HfZrNb2Te8,-3.2717029091666667,0.16231385972222223 -Li2H8Br2O4_2_9954.vasp,Li2H8Br2O4,-3.789494123125,0.043968382291662556 -Mn1Nb2Te2Se3I1Br1_1_10821.vasp,MnNb2Te2Se3IBr,-2.620113773,0.28561246101624316 -P8Pb4_26_14152.vasp,P8Pb4,-2.6090665483333333,0.5739686359523777 -K2Hg4S2Br6O6_31_9176.vasp,K2Hg4S2Br6O6,-1.6065072690000002,0.09040409254166226 -Zr4Se4F4_31_21849.vasp,Zr4Se4F4,-3.9767016366666668,0.40830586708332905 -V2As2S6_157_19980.vasp,V2As2S6,-3.246473021,0.21046226637499732 -Y4Te10O26_2_20838.vasp,Y4Te10O26,-4.635941599000001,0.0739332294999997 -Co2Br2_164_3877.vasp,Co2Br2,-0.5757071325,0.607165052499999 -Ti4Te4Br4_31_19165.vasp,Ti4Te4Br4,-3.2220322925,0.1936038408333265 -Nb4Zn4Cr2O16_7_13182.vasp,Nb4Zn4Cr2O16,-5.015618512307692,0.19888501410255405 -Hg2Te2Au2F2_26_8025.vasp,Hg2Te2Au2F2,0.129040675,0.8783361052370688 -Bi2As2S6_7_2419.vasp,Bi2As2S6,-2.5802947620000003,-0.0938363492500004 -W1Au2O4_8_20412.vasp,WAu2O4,-3.36776072,0.5420066867857098 -Hf1Te1I1_156_7317.vasp,HfTeI,-2.8927123399999997,0.14593526791666456 -Y2S6_129_20775.vasp,Y2S6,-4.2426353325,0.11920364523437499 -Fe2Te5P2_8_6024.vasp,Fe2Te5P2,-1.79268072,0.38186853870370174 -Ti2As1S2_164_18877.vasp,Ti2AsS2,-5.212698898,-0.5290470816250052 -Li4Fe2P8O26_2_10186.vasp,Li4Fe2P8O26,-5.19848015675,0.06259675769374573 -Mn1Ge3S1Br6Cl1_1_10757.vasp,MnGe3SBr6Cl,-1.7240412741666666,0.08343977398437363 -Mn2Al2Te5_164_10961.vasp,Mn2Al2Te5,-1.9213605444444444,0.13091204587121008 -Mo3C2O2_187_11704.vasp,Mo3C2O2,-5.305820462857143,0.2953221335714238 -K2Ta2Br12_4_9358.vasp,K2Ta2Br12,-1.89020960625,0.0117587787499982 -Al4Br4_57_1064.vasp,Al4Br4,-1.3465804125,0.5684853058333317 -B2Te5_12_1719.vasp,B2Te5,-2.33675517,0.5462304557142812 -In3Ru2_123_8653.vasp,In3Ru2,-1.8441594039999998,0.4720739954999985 -V2Cl4O2_51_20035.vasp,V2Cl4O2,-3.36507912375,-0.07869460437500031 -Ti1Sb1As1_156_18842.vasp,TiSbAs,-3.9264314633333335,0.5596366674999961 -Ge2Sb2S6F2_7_6853.vasp,Ge2Sb2S6F2,-2.6194844975,0.4306355880208309 -S4Cl4_2_15395.vasp,S4Cl4,-1.47384818,0.0527952412499999 -Zr1Ga1S1Br1N1Cl1_6_21294.vasp,ZrGaSBrNCl,-3.5505092333333335,0.37935779708333284 -Pd3Se1S1I3_1_14510.vasp,Pd3SeSI3,-0.79837566625,0.1622302196875 -Sn2Sb2O6_7_16864.vasp,Sn2Sb2O6,-3.89668163,0.291451240999998 -Ti2F6_189_18935.vasp,Ti2F6,-4.45029047625,-0.5313420837500002 -V3N2_187_20283.vasp,V3N2,-5.256318616,0.6815225746666616 -K2Os2S4I8N2_7_9286.vasp,K2Os2S4I8N2,-1.7956955038888889,0.28757075854166475 -Fe2F2_129_5845.vasp,Fe2F2,-0.5021095925,2.081196725 -Al2H10N4Cl4_10_855.vasp,Al2H10N4Cl4,-4.037003049,0.14839342043054604 -Ga1Cu1Sb2Se6_149_6174.vasp,GaCuSb2Se6,-1.760986699,0.3731046738333311 -Rb2Pa2F12_51_14917.vasp,Rb2Pa2F12,-4.151554634375,0.08279762374999589 -Hf1S2_164_7282.vasp,HfS2,-5.332944893333333,0.10881937333333358 -Ga4Bi4_127_6543.vasp,Ga4Bi4,-0.7428853175,0.03799817000000005 -Nb2Te8Rh2_11_12933.vasp,Nb2Te8Rh2,-2.6476892508333334,0.1477802008333331 -Ga18S9_143_6105.vasp,Ga18S9,-2.180704162962963,0.08807982703703465 -Ni1Pd3Br2Cl2O4_1_13404.vasp,NiPd3Br2Cl2O4,-1.643805085,0.1530516047222204 -V4F16_31_20324.vasp,V4F16,-3.2994499824999997,-0.019100533499999628 -Yb4I4O4_14_20890.vasp,Yb4I4O4,-4.5038806199999994,-1.0033025102083362 -Ag2B6H8I2N2_1_190.vasp,Ag2B6H8I2N2,-3.7266002595000005,0.36742745459999493 -Cr1H2_187_4187.vasp,CrH2,-3.0699185300000003,1.8809155166666622 -Ta2Ni4S6_11_17800.vasp,Ta2Ni4S6,-2.9988945966666667,-0.008094606900004575 -Cr1Cl1_1_4139.vasp,CrCl,-1.09658951,1.7598313683333309 -Er2Cl2O2_59_5552.vasp,Er2Cl2O2,-4.9687145883333335,0.11436369499999977 -Ga2Ge2Se2_164_6365.vasp,Ga2Ge2Se2,-2.6517828383333333,-0.3214666650000022 -Mo3C2F2_187_11703.vasp,Mo3C2F2,-4.394163981428571,0.17775170369046878 -Y2I2O2_164_20744.vasp,Y2I2O2,-5.083640225,0.1183899799999999 -Ag4Te4S12_14_578.vasp,Ag4Te4S12,-1.436607227,0.29651205797916436 -K2B2C8S2F6_51_8984.vasp,K2B2C8S2F6,-3.773561289,1.6599563081171815 -Ni1B4H4C2I2_47_13271.vasp,NiB4H4C2I2,-3.5343055838461535,0.6800549725747705 -Nb3S1Cl7_156_12999.vasp,Nb3SCl7,-3.3619452036363637,0.05371813545454529 -Zn1Se1_123_21009.vasp,ZnSe,-0.024719115,0.67528423875 -Mn1Nb2S4_164_10820.vasp,MnNb2S4,-4.167214745714285,0.5792743601313601 -Hf1Zn1Br2O1_1_7368.vasp,HfZnBr2O,-2.891570748,0.2503204715000007 -Cr1H4C4S6Cl1_1_4190.vasp,CrH4C4S6Cl,-3.94800978,0.31874646002603946 -Ag1H1Br2_1_68.vasp,AgHBr2,-0.752920275,0.10785238531249997 -Zn2Sb4I4O6_31_21152.vasp,Zn2Sb4I4O6,-2.49725611,0.04492124296875 -Te2W2_25_18537.vasp,Te2W2,-3.1521091825,0.8859410737500002 -Y1Mg5_1_20647.vasp,YMg5,-0.42907982333333333,0.08390474138888837 -Hg2H4N2Cl2_51_7964.vasp,Hg2H4N2Cl2,-2.472847062,0.09710969762931054 -Ga2Sn2Se2_164_6495.vasp,Ga2Sn2Se2,-1.84133446,-1.1044846566666675 -Ag2O2F2_59_337.vasp,Ag2O2F2,-1.1054115033333334,0.4225647099999985 -Mn2Br8_14_11036.vasp,Mn2Br8,-0.7279236520000001,0.15746217499999995 -Ta3C2O2_187_17950.vasp,Ta3C2O2,-7.901740234285714,-0.040701022857164926 -As6C6_12_1380.vasp,As6C6,-5.0614796858333335,0.6022752991666662 -Te2_164_18539.vasp,Te2,-0.787818275,0.7839674816666666 -Ba4Sb4S8Cl4_14_2181.vasp,Ba4Sb4S8Cl4,-2.8191804915,0.09933120812500018 -Dy2Bi7O14_8_5517.vasp,Dy2Bi7O14,-4.269400972608696,0.16051542342390923 -Rh2Se6_11_15247.vasp,Rh2Se6,-2.1147087375,0.4859804152777757 -W2Cl6_12_20487.vasp,W2Cl6,-2.35689927375,0.18613178374999995 -Hf1Ni1F6_149_7246.vasp,HfNiF6,-3.50331112,0.07032604750000004 -Cr1Ga1Fe1H1Br1O5_1_4175.vasp,CrGaFeHBrO5,-3.9109892960000003,-0.06630142985417731 -Ni2Au1S4_187_13459.vasp,Ni2AuS4,-1.4289119842857143,0.06642456901785375 -Mn2As2S4Cl2_10_10974.vasp,Mn2As2S4Cl2,-2.581846569,0.16910759062500003 -Zn1S1Cl2_1_21000.vasp,ZnSCl2,-0.8047998125,0.2997948534375 -V1Ag1As2S6_5_19747.vasp,VAgAs2S6,-2.630288214,0.43672309129999654 -Ti2S2Br2N1_1_18994.vasp,Ti2S2Br2N,-4.404471582857143,0.12437230089284501 -Na1_123_11958.vasp,Na,0.1798327,0.50308644 -Ga1Se4_8_6276.vasp,GaSe4,-1.8199431579999998,0.5625470506666668 -Mn2Cr1O6_162_11062.vasp,Mn2CrO6,-4.4572054733333335,0.12533296368054678 -V2I2_129_20096.vasp,V2I2,-1.581157175,0.46870694916666666 -Cu2Se1I2Cl3_1_5290.vasp,Cu2SeI2Cl3,-0.20789872375,0.27075561407916615 -Sc2Br4N1O1_8_16045.vasp,Sc2Br4NO,-3.2220441425,0.41119289843749984 -Tc2F6_12_18228.vasp,Tc2F6,-3.7529905225,-0.03319026718750007 -Ga1Fe1I2N3_1_6186.vasp,GaFeI2N3,-3.148634984285714,0.1573245894047568 -Ag2Cl6_162_251.vasp,Ag2Cl6,0.05240036375,0.252628064375 -Be2Zn1_123_2272.vasp,Be2Zn,-0.7932670633333333,-0.09141107333333376 -Co1Pb3_187_3810.vasp,CoPb3,-0.3261076,1.0887567625 -W1Au2O4_111_20410.vasp,WAu2O4,-3.1322220485714287,0.7775453582142813 -Cd1Pd1S2I1Cl1_25_3400.vasp,CdPdS2ICl,-0.7935657100000001,0.3275617897222221 -P8O16_26_14151.vasp,P8O16,-4.95177684375,0.4417833285833298 -Nb4Ir1Se10_2_13091.vasp,Nb4IrSe10,-3.868945768666667,0.006366788499998055 -Mn1Ge1Te2Pb1_6_10752.vasp,MnGeTe2Pb,-1.547787654,-0.2695625911666667 -Ge1Pb1S3_1_6688.vasp,GePbS3,-2.54692294,0.3125103805 -Hf2Te2Br2_59_7630.vasp,Hf2Te2Br2,-3.29027365,0.06389723833333028 -Co2Cl8_1_3894.vasp,Co2Cl8,-0.9119824089999999,0.25087827649999994 -Na2C2O6_4_11999.vasp,Na2C2O6,-4.974750986,0.16868362062499753 -K2Os2C2Br8O4_31_9274.vasp,K2Os2C2Br8O4,-2.7611123766666665,0.24848109611110406 -Mn2H4S2O8_7_11102.vasp,Mn2H4S2O8,-4.22885892625,0.16015379148808762 -Cd2Se2S8F4_7_3572.vasp,Cd2Se2S8F4,-1.56908698375,0.45921599010416664 -Ni2S2Cl2_59_13582.vasp,Ni2S2Cl2,-1.187958555,-0.11140559645833514 -Tl2Zn2O5_156_19568.vasp,Tl2Zn2O5,-2.261301241111111,0.22310594805555328 -Ta2Si2As2_129_17883.vasp,Ta2Si2As2,-5.254629246666666,0.3062563850000011 -Cu3Ag1Se4Cl2_1_5369.vasp,Cu3AgSe4Cl2,-0.705190432,0.17170603158333242 -K2Pt1C4I2N4_2_9303.vasp,K2PtC4I2N4,-4.573688413846154,0.05345912512819884 -Sr4P4H8O16F4_14_17459.vasp,Sr4P4H8O16F4,-4.810398970555556,0.09225541777776347 -As12Au2_31_1120.vasp,As12Au2,-2.2805446264285716,0.3186215096428542 -Al2Fe1Te4_156_831.vasp,Al2FeTe4,-1.6745323028571428,0.30757957869047436 -Sn2P2C2O6F6_7_16805.vasp,Sn2P2C2O6F6,-4.277406898333333,0.13623229666665537 -Ba2Cu1Se2I2_38_1973.vasp,Ba2CuSe2I2,-1.7017727271428573,0.1035975414285697 -Nb6Se18_11_13196.vasp,Nb6Se18,-3.6807674633333334,0.0576313216666664 -Ga3Ir1_187_6528.vasp,Ga3Ir,-1.82795511,0.50962484125 -La4I10_11_9629.vasp,La4I10,-1.8616411549999998,0.0935674371428572 -Te12Br4O22_51_18273.vasp,Te12Br4O22,-3.184215997368421,0.06324376125000031 -Ta2Nb1Te3H1Se3_1_17785.vasp,Ta2NbTe3HSe3,-3.7814376340000004,0.3927825669166617 -Ga2B4P4O24_14_6304.vasp,Ga2B4P4O24,-5.300574723235294,0.25374839493871576 -Te4C4F8_1_18580.vasp,Te4C4F8,-2.9233015375,0.7160022570833332 -Zr1Se2_187_21446.vasp,ZrSe2,-3.847013263333333,0.24313957750000048 -Tl2S2F2_59_19500.vasp,Tl2S2F2,-1.5370008883333333,0.6376087864583314 -Sn3Mo1_191_16916.vasp,Sn3Mo,-0.66617774,-1.27943617625 -Ta4Te10Pt6_59_18121.vasp,Ta4Te10Pt6,-3.0117119325,0.16092226850000046 -K1W2Br6O2_47_8956.vasp,KW2Br6O2,-2.7494885054545453,0.06249740000000026 -Ca2Ge4Cl12_2_3022.vasp,Ca2Ge4Cl12,-2.067530663888889,-0.013324126666668379 -Sb2Br10_51_15548.vasp,Sb2Br10,-0.4516834341666667,0.2787206166666661 -V4O4F12_1_20345.vasp,V4O4F12,-3.7898889070000004,-0.6599822977500001 -Mn2Sb2S4I2_10_11243.vasp,Mn2Sb2S4I2,-2.108969043,0.3703365284999989 -Ge2B2As2H6S6_7_6746.vasp,Ge2B2As2H6S6,-3.3471408933333335,0.2535124172222183 -Zr3C2S2F2_5_21758.vasp,Zr3C2S2F2,-4.808596714444445,0.8989489056712858 -Ga4Se4Br4_14_6571.vasp,Ga4Se4Br4,-1.8430506400000002,0.03331576250000001 -Cr2B1Cl2_164_4319.vasp,Cr2BCl2,-2.894049994,0.20347597724999156 -Na2Fe2As2_129_12077.vasp,Na2Fe2As2,-1.4227032183333332,0.12443468000000002 -Cr2Cl2O2_59_4350.vasp,Cr2Cl2O2,-3.64476647,-0.057280774444448124 -Co2H4Se2O8_4_3917.vasp,Co2H4Se2O8,-3.8211369425,-0.012613711458335675 -Te4Au2_12_18570.vasp,Te4Au2,-0.38646181500000004,-0.20408514958333338 -In1Pt1Br1N2Cl1_25_8315.vasp,InPtBrN2Cl,-2.5280758216666666,0.28641240458333095 -Pt2S6_11_14670.vasp,Pt2S6,-2.4782891,0.16004063984374994 -Pt2Se2F2_59_14675.vasp,Pt2Se2F2,-1.8810451683333334,0.22289675156249777 -U4Te4O20_57_19742.vasp,U4Te4O20,-5.8780560875,0.14715505285714325 -La2Sb2Se4O2_129_9612.vasp,La2Sb2Se4O2,-4.046466517000001,-0.026011075833337394 -Tl2I6_189_19441.vasp,Tl2I6,0.270580875,0.2990517946875 -Sr1Sb1S2I2_1_17079.vasp,SrSbS2I2,-1.7948980866666666,0.23461112605902512 -Cr4C3F2_164_4595.vasp,Cr4C3F2,-4.627373961111111,0.2240562894444328 -Sb2As2Se6_157_15536.vasp,Sb2As2Se6,-2.2780982389999997,0.20522418350000038 -Co1H12C16N8_10_3737.vasp,CoH12C16N8,-6.037816665135135,-1.8474276018918956 -Ge2Sb1Te1Br1_1_6838.vasp,Ge2SbTeBr,-1.9934073099999998,-0.1698817859999997 -C4O6_11_2767.vasp,C4O6,-5.490861796,0.8954567429999944 -Cu1S2_164_4958.vasp,CuS2,-1.2473932966666668,0.5335041109027762 -Fe2Bi2I2O4_26_5806.vasp,Fe2Bi2I2O4,-2.382895026,0.3538855984423067 -Sc2I2F2_164_16089.vasp,Sc2I2F2,-2.8183723950000004,-0.013742205000002894 -V2Re2O11_1_20147.vasp,V2Re2O11,-5.588068772666667,0.13291571266666669 -Na1Al1As2O6_5_11806.vasp,NaAlAs2O6,-4.392709397,0.40032440958332416 -Y3B2F2_187_20786.vasp,Y3B2F2,-4.90959414,0.37558369809522785 -Ho2Br2O2_164_8125.vasp,Ho2Br2O2,-4.795166598333333,0.051331260000000434 -Mn2F2_129_11064.vasp,Mn2F2,-1.4217555525,1.1996436931896552 -Bi6Ir2O4_11_2667.vasp,Bi6Ir2O4,-2.8179417499999997,0.4143190534027704 -As6Pt3_2_1391.vasp,As6Pt3,-2.6483415722222223,0.7727755052777776 -Mn2Sb2Se6_162_11252.vasp,Mn2Sb2Se6,-2.167530189,0.1409144513333317 -Bi2Cl8_12_2450.vasp,Bi2Cl8,-0.902073114,0.2708166904999998 -Nb2Fe2Te10_51_12719.vasp,Nb2Fe2Te10,-2.0618902521428573,0.30232154648808973 -V2Br4N1O1_6_20006.vasp,V2Br4NO,-3.00959163625,0.04942395984374981 -Ni2O2_129_13545.vasp,Ni2O2,-2.212763265,-0.38691441999999987 -Zr1Br1Cl1O1_6_21263.vasp,ZrBrClO,-4.08761852,0.1843014143749997 -Sr4Mn2I2O6_129_17446.vasp,Sr4Mn2I2O6,-3.7651250135714283,-0.007017294642861049 -Rb2F2_129_14839.vasp,Rb2F2,-1.8508112975,-0.43160677749999987 -Zr2Au2_129_21506.vasp,Zr2Au2,-1.7361253375,0.2508183099999999 -In1Pt5Br2_38_8320.vasp,InPt5Br2,-1.2266396425,1.1110827799999985 -Hf2Zn2_129_7663.vasp,Hf2Zn2,-1.7025134275,1.8010493775 -In8S12_14_8715.vasp,In8S12,-2.322751447,0.20188893600000002 -Ga1Te6P2Au1_149_6297.vasp,GaTe6P2Au,-1.56931984,0.3110779555833294 -Zn1Re2S8_147_20999.vasp,ZnRe2S8,-3.224045290909091,0.40117284837499545 -Sb4P2O12F2_4_15797.vasp,Sb4P2O12F2,-4.197869054,0.5279426534166629 -Ba4As4Se8F4_14_2136.vasp,Ba4As4Se8F4,-3.003007747,0.08963544700000048 -Cu2Br2_129_5051.vasp,Cu2Br2,-0.067678685,0.31200061 -Ga1Se1S1Cl2_1_6271.vasp,GaSeSCl2,-1.4254276300000002,0.6680031041041616 -Sn1Au2S4_1_16612.vasp,SnAu2S4,-1.2507719185714286,0.4473080042857126 -W1Au2S4_111_20414.vasp,WAu2S4,-2.2621522842857145,0.23284060285714014 -Ca2Bi4_12_2958.vasp,Ca2Bi4,-0.9561130216666666,0.013518643181817558 -Cu2Si2S6_51_5316.vasp,Cu2Si2S6,-2.705915642,0.188407937958331 -Li2Mn2P2O8_11_9997.vasp,Li2Mn2P2O8,-5.0472829542857145,0.08822996285713813 -Hf3C2S2F2_187_7695.vasp,Hf3C2S2F2,-5.362548296666667,0.8974080380555443 -Hf2S4I2_1_7580.vasp,Hf2S4I2,-3.58982315,0.39618230796875 -Ni3Te1Cl1O5_1_13730.vasp,Ni3TeClO5,-2.39112513,-0.13427055024999945 -Cu2S2Cl2_59_5244.vasp,Cu2S2Cl2,-0.8554413166666667,0.3351481053968245 -Si4O10_30_16497.vasp,Si4O10,-5.4333945792857135,0.5404113173214258 -Cu4H4Cl4O4_14_5411.vasp,Cu4H4Cl4O4,-2.23292380875,0.11962264713541726 -Li4P4H16C4O12_14_10212.vasp,Li4P4H16C4O12,-4.9418717367500005,0.02947780429999991 -Er2Se6_51_5575.vasp,Er2Se6,-2.79868396375,0.4913928568750001 -Sb4F12_14_15775.vasp,Sb4F12,-2.72260964125,0.39352377375000014 -Ag2H4C4O8_14_275.vasp,Ag2H4C4O8,-4.526132138333334,0.3768515800925867 -K2P30_2_9292.vasp,K2P30,-3.8385330803125,-0.009699058125002935 -Sc1Bi1Se1I4Cl1_1_15908.vasp,ScBiSeI4Cl,-1.3027577725,0.24880565822916442 -Nb2S2Cl2_59_12836.vasp,Nb2S2Cl2,-4.179978698333334,-0.056278141428579564 -C8_67_2784.vasp,C8,-6.86810582875,1.2482195812499999 -Fe3B2H2S2_187_6044.vasp,Fe3B2H2S2,-2.9606466222222223,0.25076325733332544 -Ca2S2O12_13_3103.vasp,Ca2S2O12,-3.88894496125,0.5717543915625003 -Cu2W1Se4_111_5365.vasp,Cu2WSe4,-2.06863281,0.15298613571428588 -Ag4S4Br4_14_545.vasp,Ag4S4Br4,-0.6130933658333334,0.19551748395833257 -Sb2Au2O6_2_15543.vasp,Sb2Au2O6,-2.558972845,0.6253158829999999 -Ag2S2_129_384.vasp,Ag2S2,-0.53894605,0.4292829148437501 -Al2B2Mo2_51_766.vasp,Al2B2Mo2,-4.06775377,0.43612539499999947 -Te2Os1_164_18421.vasp,Te2Os,-2.4071526133333334,-0.20527894500000032 -Ag2Te2F2_59_456.vasp,Ag2Te2F2,-0.5947405783333334,0.4551983855555535 -Hf1Ge1Se1I1_6_7179.vasp,HfGeSeI,-3.07599937,0.396418490312496 -Ta3B2S2F2_187_17943.vasp,Ta3B2S2F2,-5.281229328888888,0.772428550999988 -Ag2Te4Mo1_111_481.vasp,Ag2Te4Mo,-0.8763176471428571,0.23271271309523564 -Mg2Co8O18_1_10445.vasp,Mg2Co8O18,-3.60143554,-0.24459378464286374 -Y1Sb1Te1Se1Br2_1_20666.vasp,YSbTeSeBr2,-2.4327364283333335,0.36816231673610433 -Ga2Te4_1_6516.vasp,Ga2Te4,-1.41530379,0.41516799966666484 -Hg1Se2_115_7914.vasp,HgSe2,-0.16819662999999999,0.073129711111111 -Tl2Ru1_123_19494.vasp,Tl2Ru,-0.5763285366666667,0.6814415049999988 -Hf1Te1O1_156_7319.vasp,HfTeO,-5.3284234066666665,0.4394534608333338 -Sb1S2_115_15496.vasp,SbS2,-2.3013980333333333,0.4715770332291642 -Mg2Fe2Ge2_129_10452.vasp,Mg2Fe2Ge2,-1.0938387616666667,-0.013178977222223609 -Al2Ge2Se2_164_849.vasp,Al2Ge2Se2,-3.036799058333333,0.03641917500000025 -Na2H2S2_11_12104.vasp,Na2H2S2,-2.7133645649999996,0.042350718333334036 -Au2I6_162_1493.vasp,Au2I6,0.6517495925,0.19893331999999997 -Mn1Cu2Se1S2Br2_1_10702.vasp,MnCu2SeS2Br2,-1.2007273275,0.22503129780273304 -Ta3N2F2_187_17968.vasp,Ta3N2F2,-6.65408033,0.5038501143809473 -Hg2Au2S2I2_26_7929.vasp,Hg2Au2S2I2,0.25535409125,0.09130130979166756 -Li2Ti1_187_10088.vasp,Li2Ti,-2.65921276,0.7463628111111085 -K2Os2C2S4I8_129_9278.vasp,K2Os2C2S4I8,-1.883586875,0.48663214159721996 -Ag2Se2_59_439.vasp,Ag2Se2,-0.47153583,-0.18457982249999996 -Cu2Te4I2_4_5353.vasp,Cu2Te4I2,-0.46450466375,0.13186894875 -Mn2Te4As2F2_26_11315.vasp,Mn2Te4As2F2,-1.959370381,0.3840920474999964 -Bi1S2_187_2375.vasp,BiS2,-1.9839768633333332,-0.3364778159375021 -Li2Mn4F18_2_10002.vasp,Li2Mn4F18,-2.4135802825,0.24475739682291686 -Ba2Sb4O8_11_2056.vasp,Ba2Sb4O8,-4.387425763571429,-0.026840239047627612 -Hf2Br2Cl2_6_7443.vasp,Hf2Br2Cl2,-3.244227953333333,0.18294702604166058 -Ta2F6_189_17724.vasp,Ta2F6,-4.2726827675,0.5463657807499955 -Ir1Se2_187_8763.vasp,IrSe2,-2.40656474,-0.05347798416666638 -Cu2Te3P4Cl2_6_5346.vasp,Cu2Te3P4Cl2,-1.8063888681818183,0.27099450900432415 -Ni1F2_187_13316.vasp,NiF2,-0.7217559699999999,0.5497898183333333 -Cr4O8_12_4617.vasp,Cr4O8,-4.874822218333334,-0.05682636395833729 -Ta2Fe2Se10_51_17727.vasp,Ta2Fe2Se10,-2.9513361257142856,0.34935117964285434 -U2C4_2_19704.vasp,U2C4,-7.736580776666667,1.211208873333332 -Mn2Se2S8_31_11282.vasp,Mn2Se2S8,-2.3990602400000003,0.5386551240972196 -Li4W4Cl24_143_10249.vasp,Li4W4Cl24,-2.1150012834375,0.0803955484374983 -Er2Mg2Ru1_123_5563.vasp,Er2Mg2Ru,-1.685173386,0.21188702000000004 -Gd1I2_187_6596.vasp,GdI2,-1.67591511,0.03917109333333335 -Ir2S4_11_8829.vasp,Ir2S4,-3.2070798433333336,-0.11772491000000063 -Na2Ru2S4Br8N2_7_12284.vasp,Na2Ru2S4Br8N2,-2.013193147222222,0.034996100277776 -In1Ag1As2S6_149_8177.vasp,InAgAs2S6,-2.316927524,0.4125730026874974 -V1I2_164_19868.vasp,VI2,-1.1469122466666668,-0.043466201111111324 -Te2P2O10F2_1_18438.vasp,Te2P2O10F2,-3.9864241825,0.3092922341927009 -Bi2Br2O2_59_2431.vasp,Bi2Br2O2,-2.5224294283333335,0.23202128666666688 -Te4H4O12_1_18588.vasp,Te4H4O12,-3.8259922015,0.1925036462499996 -Li6Bi2S6_147_10261.vasp,Li6Bi2S6,-2.8301094914285714,0.06571217571428312 -Mn2Pt1Se1S5_8_11206.vasp,Mn2PtSeS5,-2.7013033655555554,0.35515808027777285 -Ge4Te4As4_17_6950.vasp,Ge4Te4As4,-2.5144977816666665,-0.4686087116666684 -Na2Mg2_11_12205.vasp,Na2Mg2,0.2207195075,0.17522217333333334 -Cr2Co1S4_164_4357.vasp,Cr2CoS4,-3.2181360371428576,-0.005482871269847589 -Os2S2F2_59_13867.vasp,Os2S2F2,-3.3372729233333334,0.3680615914999974 -Mn1W1Br1Cl1O2_1_10928.vasp,MnWBrClO2,-3.631550406666667,0.271916966194721 -Ga4S4Br4_14_6562.vasp,Ga4S4Br4,-2.1270324525,0.030443174999999822 -B2Mo3F2_187_1679.vasp,B2Mo3F2,-3.9208692,0.6795087861904683 -Zn4Cr2N4_2_21217.vasp,Zn4Cr2N4,-2.415128089,0.27326938100000087 -Mn2Te4P2F2_26_11325.vasp,Mn2Te4P2F2,-2.107071332,0.5708406479444409 -In1Ag1Sb2Se6_149_8184.vasp,InAgSb2Se6,-1.6661967489999998,0.30945479883333127 -I6N2_12_8165.vasp,I6N2,-0.53678528625,0.56069914328125 -Cd2Au2Se2Br2_26_3461.vasp,Cd2Au2Se2Br2,0.0742533475,0.07172635028249998 -Hg5Cl10_12_8097.vasp,Hg5Cl10,0.27591726,0.14567908333333332 -Tl1Pt2_187_19323.vasp,TlPt2,-0.3734079433333333,1.1639834208333308 -Sb16Cl4_10_15422.vasp,Sb16Cl4,-1.9717758724999999,0.10797113399999825 -Mo2Se2I2_59_11686.vasp,Mo2Se2I2,-1.83414522,0.3559637219444447 -Sr4V2Cu4O14_6_17487.vasp,Sr4V2Cu4O14,-3.7962493891666664,0.41562412218749323 -Zr1Nb1Se1Br1_25_21355.vasp,ZrNbSeBr,-3.45427707,0.5335885977083294 -V1Ag1Br2O1_1_19750.vasp,VAgBr2O,-2.027620484,0.29336444228571157 -Cu2Te4P2_26_5355.vasp,Cu2Te4P2,-1.35293176,0.3933571050000001 -Ta2Pt2S10_51_17837.vasp,Ta2Pt2S10,-3.7791244614285717,0.09672194991070737 -Nb1Br1N1Cl1_8_12479.vasp,NbBrNCl,-4.1524681275,0.1537223717750007 -Al2Tl2Cl8_10_1023.vasp,Al2Tl2Cl8,-1.7796620491666666,0.1958238545833335 -Ni2O2F2_59_13544.vasp,Ni2O2F2,-2.12998575,-0.32606927479166925 -Ta2Nb4Zn4O16_2_17786.vasp,Ta2Nb4Zn4O16,-5.490985365,0.11448463870191802 -Ga2Se4_127_6484.vasp,Ga2Se4,-1.7364217583333332,0.6957362205555535 -Zr1N1_156_21335.vasp,ZrN,-6.039638615,0.9596971549999997 -Be2I4_51_2258.vasp,Be2I4,-1.0482705616666668,0.37602080999999976 -Zn2As2S6_147_21027.vasp,Zn2As2S6,-2.0011421179999997,0.49705786398749763 -Cu1Si1Mo1As1I1Br1Cl2O2_1_4978.vasp,CuSiMoAsIBrCl2O2,-2.3667872599999997,0.7211165556101151 -Ag4H4O4F4_2_518.vasp,Ag4H4O4F4,-1.33516217875,0.990547463125 -In2O3_1_8514.vasp,In2O3,-3.503320642,0.53541733025 -Ni2Br6_162_13483.vasp,Ni2Br6,0.03525474875,-3.683874999999524e-05 -Zn2As4Br4O6_31_21029.vasp,Zn2As4Br4O6,-2.792802206875,0.08274858203125006 -Hf1Fe1I6_149_7162.vasp,HfFeI6,-1.28439379875,-0.15080244781250007 -V4Pb2O12_12_20353.vasp,V4Pb2O12,-5.117721606111111,0.025307824722217376 -Hf1Ni1H6_1_7247.vasp,HfNiH6,-3.0845223125,0.8801967081250004 -Sr1Ag1Se2_1_17016.vasp,SrAgSe2,-1.309935655,0.1720309045833317 -Ga2F6_1_6344.vasp,Ga2F6,-2.9057775475,0.06379698249999999 -Nb4H2N3_164_13087.vasp,Nb4H2N3,-6.534960471111111,-0.08697257333333841 -Na4Hg2Br8_11_12392.vasp,Na4Hg2Br8,-0.6657064214285714,-0.2557803385714286 -P4Pt4O4_13_14104.vasp,P4Pt4O4,-3.954126919166667,0.343594538374996 -Ni1Br2_115_13287.vasp,NiBr2,0.22489291333333336,0.17999249333333336 -Na1In1As2O6_5_11879.vasp,NaInAs2O6,-3.938613685,0.3303455798541626 -Sc4C3Cl2_164_16229.vasp,Sc4C3Cl2,-4.771535584444445,0.17660032189963615 -Ru2Br2_129_15300.vasp,Ru2Br2,-1.05492435,1.2866496891666643 -Zn1Fe1O1F2_6_20930.vasp,ZnFeOF2,-2.147864234,0.36369084900000015 -Hf1Ge1Au1S5Cl1_1_7170.vasp,HfGeAuS5Cl,-3.0305250844444442,0.1903345636111045 -Hf2Cl8_1_7482.vasp,Hf2Cl8,-3.102211768,0.06298689549999992 -Bi1Te1I1_156_2400.vasp,BiTeI,-0.91400201,0.24495203 -Hg4H8Se4O20_14_8075.vasp,Hg4H8Se4O20,-3.124887727222222,0.08278677888888897 -Ta1I2_115_17556.vasp,TaI2,-1.8754665833333333,0.9266252588095178 -Ta1H4_123_17551.vasp,TaH4,-3.390499774,1.3700095230000011 -Mg2Ge4_12_10462.vasp,Mg2Ge4,-1.953509985,-0.4886298841666667 -Mn2Sb2Se4I2_26_11250.vasp,Mn2Sb2Se4I2,-1.7362500669999998,0.11379104125000061 -Na2H6C6S6_1_12119.vasp,Na2H6C6S6,-4.2998541525,0.20599781937499773 -P2Pb2Cl2O6_7_14006.vasp,P2Pb2Cl2O6,-4.250226469166667,0.1058888018749995 -P2Pb2O6_7_14010.vasp,P2Pb2O6,-4.486756175,0.40077304375000067 -Fe2C1S2F2_164_5829.vasp,Fe2CS2F2,-2.493871172857143,0.29102015952379845 -Bi4Se6_7_2647.vasp,Bi4Se6,-1.826837158,0.2814745519999997 -Ti3H2N2O2_187_19085.vasp,Ti3H2N2O2,-6.668586365555556,-0.5314712128703762 -Rb2S6N2_1_14937.vasp,Rb2S6N2,-2.710311411,0.18781644943749765 -Cr2Sb4Te12Au2_13_4488.vasp,Cr2Sb4Te12Au2,-1.3269205835,0.2625715119999982 -Ti1V1I2_25_18863.vasp,TiVI2,-2.4169524675,0.6986489962500002 -Os1Cl2_164_13797.vasp,OsCl2,-2.12380178,0.208847215833329 -Te2W2_129_18532.vasp,Te2W2,-3.53766176,0.5003884962499998 -Pd2O4F2_6_14448.vasp,Pd2O4F2,-2.037601775,0.43023612645833054 -Al2Te2O8F2_11_1008.vasp,Al2Te2O8F2,-3.8775116314285714,0.5044523305952304 -Cr2P2O6_162_4448.vasp,Cr2P2O6,-5.105722923,0.37537819416666096 -In8S4I6Br1Cl1_1_8716.vasp,In8S4I6BrCl,-1.2730639585,0.0753826622395816 -Te4Au4S12_14_18577.vasp,Te4Au4S12,-1.4407391465,0.3014463921250006 -Ga2O1_164_6413.vasp,Ga2O,-2.96635749,0.2291517849999969 -Ti2Se1I2_2_19017.vasp,Ti2SeI2,-3.474387498,0.10662740924073155 -In2Br2_129_8389.vasp,In2Br2,-0.80457496,0.5182914150000001 -P2Se3_164_14053.vasp,P2Se3,-2.725019654,0.19172645241666458 -Te2Ir2Br2_59_18389.vasp,Te2Ir2Br2,-1.8780700883333334,0.20378691722221864 -Mn2Au2I8_1_10989.vasp,Mn2Au2I8,-0.05949933333333333,0.0678773314583338 -Hf1As2H2S6_164_7106.vasp,HfAs2H2S6,-3.186224598181818,0.7790824290909015 -Rb2Ru2Br8N2O4_7_14920.vasp,Rb2Ru2Br8N2O4,-2.30192892,0.24916917555555362 -Mn4Zn2S10_6_11458.vasp,Mn4Zn2S10,-2.180347770625,0.6382007611249999 -Ta2N2Cl2_59_17782.vasp,Ta2N2Cl2,-6.078939526666667,0.10667760623809275 -Ca2Co1_123_2987.vasp,Ca2Co,0.17483928333333332,1.157242459999999 -Sc1P2S7_5_15975.vasp,ScP2S7,-3.379726696,0.1647375112187479 -Cu2Pt1S1I2O2_1_5231.vasp,Cu2PtSI2O2,-1.2225798725,0.6154049574999989 -Pb1Se1_156_14206.vasp,PbSe,-1.64096998,0.30899416343749997 -Nb1Bi1Te1I1_1_12474.vasp,NbBiTeI,-2.015824485,-0.06656310384259667 -Na4V2P4O16_100_12430.vasp,Na4V2P4O16,-5.062994479230769,0.1970233401922976 -Mn4P4O16_14_11446.vasp,Mn4P4O16,-5.0433538887500005,0.22386079791666624 -Li2Mn2As2_129_9991.vasp,Li2Mn2As2,-2.58707515,0.13984509500000009 -Mn1Co3O8_164_10676.vasp,MnCo3O8,-3.8891931175,-0.4501158613541665 -Si3W1_191_16481.vasp,Si3W,-3.5579597275,1.2491244474999998 -Mn2Se2S1I2_1_11280.vasp,Mn2Se2SI2,-1.558706507142857,0.25249686885416245 -Tb1Pb5_47_18177.vasp,TbPb5,-0.9175999533333333,0.2005432266666658 -U2Br2O4_51_19701.vasp,U2Br2O4,-6.4099356375,0.0003974040000001011 -Si2Hg6O7_10_16406.vasp,Si2Hg6O7,-2.15317288,0.28289357533333304 -Ni1B4C2Br2F4_47_13264.vasp,NiB4C2Br2F4,-3.6806456784615382,0.44030345599358056 -Li4Sb4S8_14_10225.vasp,Li4Sb4S8,-2.918810403125,0.08143895562499992 -Ca1H1Cl1O1_156_2841.vasp,CaHClO,-3.6279430825,0.16240429499999998 -Cr1Cu1Te2_156_4162.vasp,CrCuTe2,-0.928922985,0.656310236875 -Sb2Pt2S6_12_15661.vasp,Sb2Pt2S6,-2.4502211320000002,0.26161449219999733 -Nd2Br6_59_13235.vasp,Nd2Br6,-2.419386085,0.0727779037499996 -Ga2Sb2S6_162_6458.vasp,Ga2Sb2S6,-2.643258059,0.21929724600000022 -Sn1N2F2_10_16656.vasp,SnN2F2,-4.027683654,-0.20241592349999893 -H8Pd1C4N2O4_10_7095.vasp,H8PdC4N2O4,-4.968706627368421,0.31348822236840485 -Cr1Ag1As2S6_149_4096.vasp,CrAgAs2S6,-2.493821218,0.3907381843437475 -Ta6Sn2Te12_26_18158.vasp,Ta6Sn2Te12,-3.433431392,-0.21285635033333694 -Mn1Al2S4_164_10627.vasp,MnAl2S4,-3.4344659342857145,-0.0748313357142858 -Ag2N12_31_329.vasp,Ag2N12,-5.056004872857143,-0.4161290342857136 -Li2Cr1P4O13_1_9870.vasp,Li2CrP4O13,-5.3636219205,0.05578662075624463 -P2Br10_51_13960.vasp,P2Br10,-0.5307556166666666,0.38074881458333265 -Tc2F8_14_18229.vasp,Tc2F8,-3.375845827,0.037086905000000225 -Ni1C6Br2F4_47_13299.vasp,NiC6Br2F4,-3.972924326923077,0.4135309092307624 -Zr1Se1S1_156_21442.vasp,ZrSeS,-4.182731563333333,0.2775347333333329 -Ba2Ag1I2O2_123_1882.vasp,Ba2AgI2O2,-2.352238175714286,0.11683599691963797 -Sc3H2C2S2_187_16204.vasp,Sc3H2C2S2,-4.503543304444444,0.5532702976190309 -V2Mo1O8_35_20103.vasp,V2MoO8,-5.319074287272727,0.01919330454544932 -In2Te5_1_8639.vasp,In2Te5,-1.2864337528571428,0.11242848142857143 -Ba2Sb4_12_2058.vasp,Ba2Sb4,-1.65557906,0.5577232916666666 -Ca4Sn4S12_14_3243.vasp,Ca4Sn4S12,-2.7504177395,0.16725622074999735 -V1Se2_115_19930.vasp,VSe2,-2.71409553,0.43250818833333327 -Ti2Se2N1_164_19023.vasp,Ti2Se2N,-5.9003202020000005,-0.06627875900000024 -Ge4Br2Cl1O5_1_6929.vasp,Ge4Br2ClO5,-3.4503861558333333,0.25960127968750024 -W2Cl2O2_59_20482.vasp,W2Cl2O2,-4.31055859,0.3354977838265262 -Tl2Ge2Te6_162_19429.vasp,Tl2Ge2Te6,-1.3698942649999999,0.07912839945833205 -Sc2H2O4_31_16086.vasp,Sc2H2O4,-5.6662090725,0.07715450432291693 -Sn1Br2_115_16618.vasp,SnBr2,-0.8820431666666666,0.2849484183333335 -Pb2S1I2_5_14269.vasp,Pb2SI2,-1.3008116619999999,-0.599254824333333 -Te2Ru2I2_59_18516.vasp,Te2Ru2I2,-1.6047084683333335,0.2084440524999973 -Hg1Se1_156_7913.vasp,HgSe,0.42773903,-0.36426573500000003 -Nb6Cu2Te1Se5S1I3Br2_1_13189.vasp,Nb6Cu2TeSe5SI3Br2,-2.8879147245,0.07167423754165705 -Zr3C2F2_187_21755.vasp,Zr3C2F2,-5.943839037142857,0.05117920309523338 -Ni4_11_13771.vasp,Ni4,1.6409769075,3.0209769074999997 -Fe1Cu1Te1I1_156_5671.vasp,FeCuTeI,-0.2483542625,0.6012022331249989 -Ni2O4_59_13552.vasp,Ni2O4,-2.5247323966666664,-0.18844523458333495 -P4Pb4Se12_14_14097.vasp,P4Pb4Se12,-2.35036607,0.17959372649999983 -K2Nb2Br12_4_9258.vasp,K2Nb2Br12,-1.67666675625,-0.09888670937500077 -Pd2S2_187_14468.vasp,Pd2S2,-1.5157872775,0.5943440625 -Hg1H4C2Br2N4_10_7870.vasp,HgH4C2Br2N4,-4.088673498461539,0.09502374314102058 -Zr2Cl2_129_21549.vasp,Zr2Cl2,-2.682536815,0.794302815 -H2Os1O2_164_6998.vasp,H2OsO2,-4.249495766,0.5739091541666671 -Sb2Te3_164_15728.vasp,Sb2Te3,-1.75831214,0.08799353399999998 -Pd2Se2Br2_59_14483.vasp,Pd2Se2Br2,-1.1550429416666665,-0.14822954166666658 -Os2O2F2_59_13857.vasp,Os2O2F2,-3.81158372,0.4926594549999961 -Li4H4S4O16_14_10195.vasp,Li4H4S4O16,-4.445285458571428,0.06096742464285754 -Cu2S4O1_21_5260.vasp,Cu2S4O,-1.5281752685714287,0.7483616397470214 -Mg8Si4_2_10603.vasp,Mg8Si4,-1.059860515,-0.05685136499999999 -B2P2_129_1694.vasp,B2P2,-4.6575671675,-0.8067760924999998 -Rb2H6C6S6_1_14857.vasp,Rb2H6C6S6,-4.196579106,0.21500159096874005 -Cd2Sb2Te6_147_3565.vasp,Cd2Sb2Te6,-0.6934302609999999,0.0391508496666651 -Sr2Fe2Sn2_129_17221.vasp,Sr2Fe2Sn2,-0.43599076499999995,1.0156957066666654 -Nb1V1I2O1_8_12610.vasp,NbVI2O,-3.233613656,0.0362512886666666 -Tl2In2O6_31_19447.vasp,Tl2In2O6,-3.08442952,0.2900220553749999 -Tl4Cr16Bi4O56_14_19599.vasp,Tl4Cr16Bi4O56,-4.531495481875,-0.27478047998959093 -Ge1Te1_156_6716.vasp,GeTe,-2.18117306,-0.7179317349999998 -Fe2P2H6C2O8_7_5906.vasp,Fe2P2H6C2O8,-4.554197851,0.41769866274999246 -V2Te2F2_59_20205.vasp,V2Te2F2,-2.767753438333333,0.013806487222219888 -Ge2B2P2H6S6_7_6748.vasp,Ge2B2P2H6S6,-3.4808638166666666,-0.23281694593750302 -Tc4S8_2_18255.vasp,Tc4S8,-5.106562231666667,0.06703183000000035 -Zn1Pd1Cl2F2_1_20990.vasp,ZnPdCl2F2,-0.89574431,0.3403448109722222 -Hf2Si2S2_129_7613.vasp,Hf2Si2S2,-5.304559243333333,0.06032044999999986 -Ba3Co2S5I2_123_2103.vasp,Ba3Co2S5I2,-2.52503928,0.18539128051214715 -Hf2Sb1Se2_164_7583.vasp,Hf2SbSe2,-4.466435186,0.2567240845000005 -Sn1I4_123_16653.vasp,SnI4,0.067506622,0.3287640815 -Ba8Li4N4_115_2206.vasp,Ba8Li4N4,-2.132948978125,0.31493570020833106 -Eu2Br6_59_5600.vasp,Eu2Br6,-2.365049785,-0.6065315093750001 -Ga1Si1Ni2Br2N2_1_6277.vasp,GaSiNi2Br2N2,-2.4730536225,-0.0012476919025534161 -Mg4Fe2_51_10575.vasp,Mg4Fe2,0.2959356966666667,0.7463931777777775 -Ta4Cl16_14_18019.vasp,Ta4Cl16,-2.7677571675,0.18773631250000022 -Cd1S1_156_3414.vasp,CdS,-0.329834345,0.41157936625 -Ge4Se4_57_6949.vasp,Ge4Se4,-2.68543408625,0.21485925875000023 -Sr2C1_164_17158.vasp,Sr2C,-1.7191256366666667,1.191188187499994 -C10N2_65_2716.vasp,C10N2,-6.939140681666667,0.978913279166659 -Al2P2S6_157_923.vasp,Al2P2S6,-3.416054245,0.13821516234999998 -Sr2Co4Te6Cl4O16_17_17194.vasp,Sr2Co4Te6Cl4O16,-3.38641447375,-0.12173081656249997 -Sr2Au1S2Cl2_38_17129.vasp,Sr2AuS2Cl2,-1.9489851171428572,0.2639813371428531 -Li2Ni2P2O8_11_10025.vasp,Li2Ni2P2O8,-4.512947408571429,-0.10786003564285951 -Os1W1Se1I2Cl3_1_13828.vasp,OsWSeI2Cl3,-1.91741169,0.16818246859374852 -Ba1I1Br1_156_1837.vasp,BaIBr,-1.6662310466666668,0.24922904583333327 -Ag4Se2_26_561.vasp,Ag4Se2,0.007805761666666667,0.23942094833333333 -Nb2Ni2Te10_51_12783.vasp,Nb2Ni2Te10,-1.9715590114285715,0.08811664642857142 -Cu4Cl2O6_11_5402.vasp,Cu4Cl2O6,-1.8103907133333335,0.34497456937499926 -Co1C8I2F4_25_3725.vasp,CoC8I2F4,-4.511013279333333,0.5118246184166653 -Fe2F6_191_5847.vasp,Fe2F6,-1.84544930375,-0.02170856124999987 -Cr3Se4_12_4581.vasp,Cr3Se4,-2.7444663314285718,0.1303664557142854 -H1Au1O2_10_6982.vasp,HAuO2,-2.6120021825,0.14017231135416686 -Cu4Se4_2_5476.vasp,Cu4Se4,-0.75649646125,0.1541757245833334 -Ti2Se2_123_19027.vasp,Ti2Se2,-4.7127950025,-0.34771537750000014 -Al1As2Au1S6_149_608.vasp,AlAs2AuS6,-2.529275874,0.47670535118749746 -Ta4Te14Pt2_11_18128.vasp,Ta4Te14Pt2,-2.8603447204999997,0.08481905316666483 -Sc1Be5_1_15904.vasp,ScBe5,-2.6138884316666666,0.16791363000000015 -K1Tl1Cl4_81_8951.vasp,KTlCl4,-0.8450366366666667,0.17505609833333324 -Mn3Te4_164_11417.vasp,Mn3Te4,-1.6408794757142857,0.1751687989655153 -Ta2Cl4_11_17695.vasp,Ta2Cl4,-3.515059536666667,0.4291648283333267 -Ni1H4C6F2_47_13346.vasp,NiH4C6F2,-4.764857789230769,0.6092610953846107 -Cu2H12C8O16_14_5109.vasp,Cu2H12C8O16,-4.878834474473685,0.33035072934209486 -Ta2S2N1F2_164_17850.vasp,Ta2S2NF2,-4.8281616085714285,0.8991464149999886 -Hf1Zr2Se2S1Cl2_1_7413.vasp,HfZr2Se2SCl2,-4.1020317275,-0.08619338078125471 -P2Os2Se6_162_14001.vasp,P2Os2Se6,-3.091951211,0.5208761618333315 -Bi1Br2_187_2321.vasp,BiBr2,-0.74118482,0.19187488277777692 -Al1Ag1Sb2Se6_149_602.vasp,AlAgSb2Se6,-1.914819533,0.30745444683333123 -Mn1Sb1S1_156_10860.vasp,MnSbS,-2.45512255,0.23935424333333077 -Ni4I8_14_13748.vasp,Ni4I8,0.3376969566666667,-0.09161394 -Li1In1Sb2Se6_5_9736.vasp,LiInSb2Se6,-2.048079279,0.34096053233333123 -In2S2Br2_31_8542.vasp,In2S2Br2,-1.7262003166666666,0.1404378491666669 -Ge2As2S6Cl2_7_6739.vasp,Ge2As2S6Cl2,-2.51390536,0.4846666031249971 -Li1Al1Te6P2_5_9651.vasp,LiAlTe6P2,-2.099182736,0.24305378966666547 diff --git a/stability_prediction/data/2D_structure/ehulls.pickle b/stability_prediction/data/2D_structure/ehulls.pickle deleted file mode 100644 index 67ab46e4..00000000 Binary files a/stability_prediction/data/2D_structure/ehulls.pickle and /dev/null differ diff --git a/stability_prediction/data/2D_structure/ehulls_0621.pickle b/stability_prediction/data/2D_structure/ehulls_0621.pickle deleted file mode 100644 index 5fbb6f61..00000000 Binary files a/stability_prediction/data/2D_structure/ehulls_0621.pickle and /dev/null differ diff --git a/stability_prediction/data/2D_structure/energys_0621.pickle b/stability_prediction/data/2D_structure/energys_0621.pickle deleted file mode 100644 index 903394f2..00000000 Binary files a/stability_prediction/data/2D_structure/energys_0621.pickle and /dev/null differ diff --git a/stability_prediction/data/2D_structure/readme.txt b/stability_prediction/data/2D_structure/readme.txt deleted file mode 100644 index bd10c141..00000000 --- a/stability_prediction/data/2D_structure/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ - -vasp_structure.tar.gz 结构的vasp文件格式 - -cif_structure.tar.gz 结构的cif文件格式 - -ehull.csv 结构的convex hull energy 单位为 eV/atom diff --git a/stability_prediction/data/2D_structure/structure_ehull.csv b/stability_prediction/data/2D_structure/structure_ehull.csv deleted file mode 100644 index ee188c6c..00000000 --- a/stability_prediction/data/2D_structure/structure_ehull.csv +++ /dev/null @@ -1,21685 +0,0 @@ -cif,formula,energy,ehull -Ti4B3Cl2_164_19117.vasp,Ti4B3Cl2,-5.62949547,-0.0651133322222274 -Si1Sn1_156_16371.vasp,Si1Sn1,-1.955340985,-1.7639782025 -V1S2_187_19919.vasp,V1S2,-3.7471862066666666,0.0077726266666666 -Si2Cl8_7_16400.vasp,Si2Cl8,-2.113067556,0.086497 -Au2S2Br2_59_1511.vasp,Au2S2Br2,-0.4119900233333333,0.2735256171527771 -Sr1Br3_191_17033.vasp,Sr1Br3,-0.7866595775,0.5941009125000001 -V1As2Au1S6_5_19767.vasp,V1As2Au1S6,-2.567038605,0.551746447166662 -Bi2Te1O2_164_2552.vasp,Bi2Te1O2,-2.736076354,0.3583711093333306 -Sn4S1I1Br1Cl1O4_1_16955.vasp,Sn4S1I1Br1Cl1O4,-2.7267810591666666,0.2227041586805551 -Cu2I4O12_11_5176.vasp,Cu2I4O12,-2.392145552777778,0.1438962390277753 -Ca4Co2S6Cl2_129_3211.vasp,Ca4Co2S6Cl2,-2.688913756428572,0.0863691520535687 -Na1Tl1Cl4O12_2_11948.vasp,Na1Tl1Cl4O12,-2.405960846666667,0.23282762509259 -Co4S4I4_14_4086.vasp,Co4S4I4,-1.6382772149999998,0.0616226646527765 -V4Cu4O14_13_20321.vasp,V4Cu4O14,-4.070620285454545,0.220249415909091 -Os2Se4_11_13889.vasp,Os2Se4,-3.3072146100000004,0.2374066499999996 -Sb2Cl10_11_15561.vasp,Sb2Cl10,-1.0514033,0.0628608774999999 -Li4Al4Cl16_14_10153.vasp,Li4Al4Cl16,-2.39218414875,0.0728464129166668 -Ti2Br6_189_18905.vasp,Ti2Br6,-2.51524485625,0.2110249637500003 -Ca2P4O12_2_3095.vasp,Ca2P4O12,-5.465551092777778,0.1636866491666664 -Ta2Os2S8_11_17818.vasp,Ta2Os2S8,-4.624130181666667,0.2352948654166664 -Sn2S2O8_31_16840.vasp,Sn2S2O8,-4.126544160833333,0.1452782264322885 -Nd2Cl6_59_13236.vasp,Nd2Cl6,-2.9897516975,0.1213260699999998 -Ge12Rh4_127_6634.vasp,Ge12Rh4,-3.02537700125,-0.3053111018749999 -In2Ga1S3I2Br1Cl1_1_8440.vasp,In2Ga1S3I2Br1Cl1,-1.543702021,0.1748101089687473 -Nb3Te2I1Br1_25_13027.vasp,Nb3Te2I1Br1,-3.299598012857143,0.0856758163265243 -Zr1Se2_115_21443.vasp,Zr1Se2,-3.5727716533333336,0.5173811874999998 -Zr2As2Se6_2_21505.vasp,Zr2As2Se6,-3.309830391,0.2270152891666645 -Sr3Au2Cl2O4_123_17350.vasp,Sr3Au2Cl2O4,-2.6936803045454543,0.1811412332900389 -Si4Bi8_26_16487.vasp,Si4Bi8,-1.9796337908333332,-0.6716721108333347 -N2_164_11790.vasp,N2,-5.327988845,0.2057617775000002 -Mg3P3_25_10558.vasp,Mg3P3,-2.0532968,0.6621965568124965 -Ta6Te28Pd6_11_18160.vasp,Ta6Te28Pd6,-2.463521137,0.0327473185416643 -Zr4Te4Br4_31_21853.vasp,Zr4Te4Br4,-2.7573523525,0.1900660469444417 -Zr1Pd1F6_5_21401.vasp,Zr1Pd1F6,-3.19036277625,0.2183707149999998 -Ti2As2Se6_2_18881.vasp,Ti2As2Se6,-3.529936961,0.2363061276666642 -Cr3Ni1Se3S1Br1Cl2_1_4568.vasp,Cr3Ni1Se3S1Br1Cl2,-1.9911083954545452,0.0130922671212034 -Cd2Cu2Se2F2_26_3495.vasp,Cd2Cu2Se2F2,-0.54813155875,-0.0572499253124999 -Ag2O4_2_344.vasp,Ag2O4,-1.5214779516666666,0.5089783487499985 -Au2Se4F2_4_1556.vasp,Au2Se4F2,-1.03726613125,0.3516478551562501 -Si2F8_1_16403.vasp,Si2F8,-3.807115322,0.043136435 -Na1Co1Te6As2_149_11849.vasp,Na1Co1Te6As2,-1.697186109,0.2416517479999975 -Mn3Se1Br4O2_1_11406.vasp,Mn3Se1Br4O2,-2.25633071,0.0028531802857066 -K2Br2Cl8_127_9007.vasp,K2Br2Cl8,-0.5005395625,0.1402407333333327 -Tl4Ge4Se10_5_19605.vasp,Tl4Ge4Se10,-1.921950510555556,0.2147521611111111 -Ta3Te14Pt3_6_17994.vasp,Ta3Te14Pt3,-2.5717349835,0.086625843666667 -Ca2Br4_51_2965.vasp,Ca2Br4,-1.6999213566666669,0.2302123066666668 -V2W2S8_25_20230.vasp,V2W2S8,-4.1552220725,-0.0414433308333332 -Ni1Au1F5_1_13259.vasp,Ni1Au1F5,-0.88774248,0.1544406503571418 -Ni5Ir1S6I3Br1_1_13773.vasp,Ni5Ir1S6I3Br1,-1.1384188125,0.0815856055078123 -Cr1In2S4_164_4205.vasp,Cr1In2S4,-2.5584944514285715,0.2075518528571407 -In2Au2S4I3Br1_1_8380.vasp,In2Au2S4I3Br1,-1.0071455666666669,0.1461060276562488 -Mg4Sb8O16_1_10582.vasp,Mg4Sb8O16,-4.141595373571429,0.1984003207142857 -Na2B2H6N8O2_51_11977.vasp,Na2B2H6N8O2,-4.9507471495,-1.6801362015833383 -Pb2Cl2_129_14238.vasp,Pb2Cl2,-0.8864440875,0.41006672875 -Ag2Hg2Se2I2_26_304.vasp,Ag2Hg2Se2I2,0.32618774125,-0.24355129375 -Mg1Sb2O5_6_10398.vasp,Mg1Sb2O5,-4.23706817625,0.2400360903125 -Cr2As2S10_129_4308.vasp,Cr2As2S10,-2.8739349978571425,0.4284084507589261 -Li4Zn2Si2_164_10255.vasp,Li4Zn2Si2,-1.3294119275,0.3163353737499998 -Mn2Mo2O8F2_129_11141.vasp,Mn2Mo2O8F2,-4.29740271,0.2047412128571388 -W2I8_1_20506.vasp,W2I8,-0.694949921,0.4150753327916668 -Sr2H8Br4O4_53_17240.vasp,Sr2H8Br4O4,-3.473673217222222,0.0787875589814781 -Na2Os2C2Br8O4_31_12244.vasp,Na2Os2C2Br8O4,-2.86792222,0.094954875555548 -Ir1S1Cl1_156_8756.vasp,Ir1S1Cl1,-2.620624623333333,0.0923384316666666 -K2C2O8F6_4_9018.vasp,K2C2O8F6,-2.783545845,0.6171236426388811 -Mn1Cu1Cl2_6_10682.vasp,Mn1Cu1Cl2,-0.800682935,0.9432722875 -Li1As2Pd1S6_5_9653.vasp,Li1As2Pd1S6,-2.606264104,0.3758938998437474 -Cu1Te2W1S1_6_4994.vasp,Cu1Te2W1S1,-2.158787658,0.3234535365000003 -Cu4Se2O12_14_5466.vasp,Cu4Se2O12,-2.659814846666667,0.3470936810416609 -Ga1Ni5Cl2_123_6221.vasp,Ga1Ni5Cl2,-0.12360118,-0.0190627492768595 -Ca2Fe2Si2_129_3018.vasp,Ca2Fe2Si2,-1.7343598216666667,0.0743696854166643 -Re1Te2Cl12_2_15025.vasp,Re1Te2Cl12,-1.3340410126666666,0.5206512112777721 -Ba2H8S6_26_1998.vasp,Ba2H8S6,-3.23996360375,0.0556850256249998 -K2La2Si2Se8_4_9210.vasp,K2La2Si2Se8,-3.1142333114285714,0.0918108685714282 -Ga1Ag1As2Se6_149_6111.vasp,Ga1Ag1As2Se6,-1.94773735,0.2435734288333312 -Al2H4Pb2O4F6_2_866.vasp,Al2H4Pb2O4F6,-4.0027231527777785,0.137440129999999 -Tl1Fe5I2_123_19269.vasp,Tl1Fe5I2,0.13454452375,1.505177195312499 -Cu2H8C10S2N6_4_5137.vasp,Cu2H8C10S2N6,-5.3330997771428565,0.3015969143452284 -Bi2As2S8_11_2420.vasp,Bi2As2S8,-2.5759278066666664,-0.067564996145838 -Cd1Se2F2_12_3425.vasp,Cd1Se2F2,-0.895385528,0.7171891013333335 -Ba2Zr1S4_123_2091.vasp,Ba2Zr1S4,-2.4034499714285715,1.655502035714286 -Ge2As6_164_6743.vasp,Ge2As6,-2.86562074375,-0.6767826718750002 -In1Ge1Pb1S1I2_1_8262.vasp,In1Ge1Pb1S1I2,-1.36072516,0.1215803822222201 -Mn4N3O2_164_11442.vasp,Mn4N3O2,-4.570637863333333,0.5567929406944345 -Ni1Ge1Te2_21_13318.vasp,Ni1Ge1Te2,-1.2627079,-0.117184175208335 -K2H14C6O6_12_9116.vasp,K2H14C6O6,-4.664337503571429,0.1628463862053525 -Ag2F2_51_257.vasp,Ag2F2,-0.43654558,0.309501575 -Mg1B2F8_164_10339.vasp,Mg1B2F8,-4.015027192727273,-0.4598785913636396 -As2Au2Se6_2_1190.vasp,As2Au2Se6,-1.495269292,0.308990182833331 -Be4_67_2290.vasp,Be4,-2.7989949825,-0.5478371974999998 -Ca2Te2Au1Cl2_38_3132.vasp,Ca2Te2Au1Cl2,-1.2382637442857145,0.3063881642857116 -Au2Br4O12_4_1456.vasp,Au2Br4O12,-1.821326641111111,0.3620728850231469 -P1S1F1_156_13941.vasp,P1S1F1,-2.863887773333333,0.4518127953992991 -Sn1Ge1I2O2_1_16633.vasp,Sn1Ge1I2O2,-2.59591684,0.2041843143055555 -Fe2O4_59_5896.vasp,Fe2O4,-3.5109746633333336,0.2309664312499966 -Pt2N2Cl2_59_14638.vasp,Pt2N2Cl2,-2.6693450550000004,0.296224839999996 -Hf2C2F2_164_7466.vasp,Hf2C2F2,-5.756428578333334,0.9760384112499938 -Si2O2_129_16419.vasp,Si2O2,-4.8709825225,0.6839894249999993 -Ba2Cu1S2F2_38_1968.vasp,Ba2Cu1S2F2,-2.593701534285714,0.4244769311458281 -K1F1_123_8895.vasp,K1F1,-1.910739865,-0.4332926000000001 -Ba1P2H12_2_1851.vasp,Ba1P2H12,-3.1286810673333334,1.3573385491666596 -Bi1Br2_115_2319.vasp,Bi1Br2,-0.5666720533333334,0.3663876494444435 -Sr2H8O6_1_17245.vasp,Sr2H8O6,-4.278327535625,0.0762356285416667 -Au2O4_2_1503.vasp,Au2O4,-1.6512725683333331,0.4247151168749974 -Ta4V2O12_12_18136.vasp,Ta4V2O12,-6.725954646111111,0.1874304972222161 -Co1O2_187_3806.vasp,Co1O2,-3.23450474,-0.1373383079166694 -Hf1Zr1Ti1H1Cl2O4_1_7407.vasp,Hf1Zr1Ti1H1Cl2O4,-5.508268592,0.4841526336666593 -Cu2O1_191_5195.vasp,Cu2O1,-0.41087271,1.7671240220833315 -Sn2P1O6_162_16801.vasp,Sn2P1O6,-4.336973727777778,0.513401277268513 -Hf3Ta1Te4I4_1_7732.vasp,Hf3Ta1Te4I4,-2.9608673975,0.409222947916663 -Hg4Se4_10_8090.vasp,Hg4Se4,0.2520171625,-0.5399876025000001 -Pt2Br2N2_59_14597.vasp,Pt2Br2N2,-2.4582387866666666,0.3394571612499961 -Zn2F2_164_21073.vasp,Zn2F2,-0.4294165775,0.1689306556249999 -Mg1U1_156_10410.vasp,Mg1U1,-3.437280275,0.541317653333333 -Hf3Tl2Cu2Se8_12_7744.vasp,Hf3Tl2Cu2Se8,-3.07040777,0.1226980213333308 -Ba1Ta2O7_123_1864.vasp,Ba1Ta2O7,-6.155083577,0.454438372624997 -Te6Pt2_11_18681.vasp,Te6Pt2,-1.453427965,0.3234090604166666 -Nb2Ni2Se6_11_12782.vasp,Nb2Ni2Se6,-2.823108384,0.1100453247777761 -Co2C2Cl2_59_3882.vasp,Co2C2Cl2,-3.011211591666666,0.5302091608333299 -Bi2Pb2Se5_164_2500.vasp,Bi2Pb2Se5,-2.036230961111111,-0.0010062684722239 -In1Ni3P2S7_1_8289.vasp,In1Ni3P2S7,-2.078489193076923,0.3037576480168221 -Np2S6_51_13784.vasp,Np2S6,-4.80283168,0.52493281875 -V1B4H4S6Cl1_1_19774.vasp,V1B4H4S6Cl1,-3.6306768725,0.6813687029427035 -Sc2Te5S13_1_16184.vasp,Sc2Te5S13,-2.5138254265,0.3346722774791669 -Ga4Bi20_26_6542.vasp,Ga4Bi20,-1.1317628641666666,-0.5602230383333342 -Pt2S2Br2_59_14652.vasp,Pt2S2Br2,-1.69053315,0.065841156666665 -Ag2P12_31_346.vasp,Ag2P12,-2.975270146428571,0.4218105942857117 -Na1Sn2As2_164_11936.vasp,Na1Sn2As2,-1.92326524,0.2190780559999983 -Cu1Ge1As1W3Se5S1Cl4_1_4877.vasp,Cu1Ge1As1W3Se5S1Cl4,-2.3368863375,0.5207851442187499 -Bi2Br2N2_59_2429.vasp,Bi2Br2N2,-2.3858144016666665,0.0031103230555538 -Mn1Nb3S8_187_10824.vasp,Mn1Nb3S8,-4.411051339166667,0.1511124267708257 -Ta2I4_11_17764.vasp,Ta2I4,-2.4151786766666667,0.3869131654761843 -Ti4C3Cl2_164_19128.vasp,Ti4C3Cl2,-6.614682158888889,-0.24352831444445 -Co2P4S6Cl4_1_3972.vasp,Co2P4S6Cl4,-2.544855873125,0.314074584440102 -Fe1Cu1S2I2_6_5668.vasp,Fe1Cu1S2I2,-0.942774035,-0.0734598728472219 -Al2I6_162_880.vasp,Al2I6,-0.8988761625,0.0829301037499999 -Rb2Al2H16N8_85_14766.vasp,Rb2Al2H16N8,-4.462142067499999,-1.795590465357148 -Si1Cl4_123_16329.vasp,Si1Cl4,-1.642212716,0.5573518399999999 -Li2Ti2N2F2_59_10096.vasp,Li2Ti2N2F2,-5.44670940375,0.07220184125 -Au2S2_129_1515.vasp,Au2S2,-0.468658365,0.5431302 -Li6S10F2_11_10271.vasp,Li6S10F2,-2.658818256111111,0.1960995458333307 -Si2P6_164_16429.vasp,Si2P6,-3.777359195,-0.6130712306249997 -V2Cl10_1_20027.vasp,V2Cl10,-1.6035536041666667,0.0425055066666648 -Na1Tl1I4O12_2_11949.vasp,Na1Tl1I4O12,-2.617324295555556,0.0964210963367998 -Cu3Se1S1Br5_1_5385.vasp,Cu3Se1S1Br5,-0.4468344509999999,0.1665888771249987 -Mn2Ga2Te5_164_11084.vasp,Mn2Ga2Te5,-1.684369972222222,0.1770370727458474 -P8S20_14_14154.vasp,P8S20,-3.0484346160714284,0.1415828210714287 -Sr2H8S4I4_53_17250.vasp,Sr2H8S4I4,-2.523503606111112,0.0597574818518492 -As4Au2S12_12_1316.vasp,As4Au2S12,-2.2193481366666665,0.5425209045833308 -Ru1S1I2_47_15290.vasp,Ru1S1I2,-1.3934489825,0.2175364083593749 -In2Fe1O4_164_8428.vasp,In2Fe1O4,-3.6078265157142857,0.2900507040476161 -Y2Mn2S2O5_123_20757.vasp,Y2Mn2S2O5,-5.119119536363637,0.2363245249020296 -Se2_164_16292.vasp,Se2,-1.461238985,0.8467495683333333 -Mn1Te2_115_10911.vasp,Mn1Te2,-1.31689584,0.4588998799999999 -Hf1I1Cl1O1_1_7194.vasp,Hf1I1Cl1O1,-3.94883316,0.52707953015625 -Zr1Sc1I1N1Cl1_156_21432.vasp,Zr1Sc1I1N1Cl1,-4.188238286,0.1432243916666654 -Sc2Br4Cl2_8_16044.vasp,Sc2Br4Cl2,-2.4660542975,0.0490962062499976 -Er2Bi2O6_147_5547.vasp,Er2Bi2O6,-4.863271779,0.3547344058750004 -Mn1Cu1S2I3_1_10689.vasp,Mn1Cu1S2I3,-0.9637348214285714,0.1547777164583335 -Sb2Te2I2_2_15716.vasp,Sb2Te2I2,-1.2089036716666668,0.1444088949999997 -K1Cl1O3_156_8890.vasp,K1Cl1O3,-2.309089376,0.2563976909999974 -Zn2In4Se8O24_14_21115.vasp,Zn2In4Se8O24,-3.55901865,0.0411854631578947 -U2Ge4_2_19710.vasp,U2Ge4,-4.873585106666667,0.4623566016666598 -K2Hg4S8Cl6_31_9183.vasp,K2Hg4S8Cl6,-0.835453023,0.2652737955624986 -Zn1C6N4_115_20908.vasp,Zn1C6N4,-5.652556632727273,0.8948954461363519 -Cu4S2I2Br2O1_1_5443.vasp,Cu4S2I2Br2O1,-0.63037577,0.3538006979112515 -Al1P2Au1Se6_149_705.vasp,Al1P2Au1Se6,-2.3381563400000003,0.0412368500000001 -Sc3H2S2N2_187_16208.vasp,Sc3H2S2N2,-4.829204481111111,-0.9574386972222292 -K1V3Se2O12_143_8954.vasp,K1V3Se2O12,-4.652072637222222,0.0805186327777782 -V1Cd1S2_8_19795.vasp,V1Cd1S2,-1.807831965,0.0136378762499995 -P2W8Br22_59_14063.vasp,P2W8Br22,-2.196571066875,0.0628351900520834 -Hf3Mo1I3Br5_1_7715.vasp,Hf3Mo1I3Br5,-2.439059346666667,0.3540147334027747 -Ru2S2_129_15342.vasp,Ru2S2,-3.5010956125,0.2594485250000002 -Nd1Si2_123_13227.vasp,Nd1Si2,-3.2485742,0.9148449388888844 -Cs1Ge1O2_156_4639.vasp,Cs1Ge1O2,-2.9595299575,0.7545098135937501 -Ga1S2Br1_8_6259.vasp,Ga1S2Br1,-1.979756795,0.2928211254687498 -Al1Cd1In1O4_156_623.vasp,Al1Cd1In1O4,-3.7229562128571434,0.3470328878273792 -Sr3F6_5_17372.vasp,Sr3F6,-3.6547080666666663,0.1588086033333335 -Zn2Sb4O8_26_21156.vasp,Zn2Sb4O8,-3.390953565,0.3012026232142833 -Pd2O2_47_14446.vasp,Pd2O2,-1.82343606,0.8165129975000001 -B2O3_164_1689.vasp,B2O3,-5.981784768,0.8725496073333341 -Ga2Co1Te4_164_6329.vasp,Ga2Co1Te4,-1.69163277,0.1176687709523793 -Te4C4_57_18582.vasp,Te4C4,-2.87707946375,1.9669761195833333 -Re2Se4_11_15085.vasp,Re2Se4,-4.080492655,0.0812711833333335 -Sr2Cd1In1Au1O5_99_17171.vasp,Sr2Cd1In1Au1O5,-2.539753693,0.576144484714901 -Sn1As2S4_164_16601.vasp,Sn1As2S4,-2.7841383,0.0557195676785688 -Nb1Zn1Se1S1_156_12618.vasp,Nb1Zn1Se1S1,-2.619156155,0.1598405580048055 -K2C2Br2N4O8_2_9012.vasp,K2C2Br2N4O8,-4.135806441111111,0.3844505100925888 -Hf1O2_115_7250.vasp,Hf1O2,-7.037997523333334,0.7494963749999997 -Cu1Rh1S2Br2_6_4951.vasp,Cu1Rh1S2Br2,-1.4155286383333332,0.3165213360784285 -Pd1C6Br2N2F4_25_14349.vasp,Pd1C6Br2N2F4,-4.542130529333334,0.2753483897222164 -P12Se12_7_13906.vasp,P12Se12,-2.7049819533333337,0.3639535413541663 -Er2Fe2Ge4_129_5558.vasp,Er2Fe2Ge4,-2.40733841125,0.3198300987499999 -Co2As4S6I4_11_3856.vasp,Co2As4S6I4,-1.99220592625,0.3253085887335472 -Ca1Cl2_115_2817.vasp,Ca1Cl2,-2.099495333333333,0.1287358050000002 -Ag2P2O6_1_349.vasp,Ag2P2O6,-4.040574514,0.1931992719999993 -Na2Zr2Cu2Te6_11_12348.vasp,Na2Zr2Cu2Te6,-1.88118325,0.1917234058333334 -Mn2Te2_129_11306.vasp,Mn2Te2,-1.6353946675,0.2108430231896552 -C3O6_5_2763.vasp,C3O6,-5.843106362222223,0.3509891911111111 -P2F2_11_13973.vasp,P2F2,-3.2270226175,0.3424433458333304 -Al1Tl1Cd1S4_156_752.vasp,Al1Tl1Cd1S4,-2.0145506485714284,0.1085039565178536 -Rb2Te2N2Cl6O6_4_14954.vasp,Rb2Te2N2Cl6O6,-2.264651695,0.5530457460770166 -Ba4As4S8F4_14_2134.vasp,Ba4As4S8F4,-3.3541452305,0.1760906007499971 -Te1Ir3S4I1Br1_1_18296.vasp,Te1Ir3S4I1Br1,-2.198809969,0.2610224159833271 -Pt2I1Cl1O2_1_14625.vasp,Pt2I1Cl1O2,-1.6726450466666665,0.3483260491666655 -Hf1Sc1I2Br2_25_7296.vasp,Hf1Sc1I2Br2,-2.0950150183333336,0.4419353144444419 -Al1Si1S3_1_741.vasp,Al1Si1S3,-3.173190786,0.5925136953749961 -As8S20_14_1402.vasp,As8S20,-2.7062947460714284,0.5555972883928548 -Os1S1Br2_47_13814.vasp,Os1S1Br2,-2.021718545,0.3461385084374999 -Ni4Br4O4_14_13742.vasp,Ni4Br4O4,-1.3482854033333334,-0.133207870000001 -In6H1Br5O8_1_8708.vasp,In6H1Br5O8,-2.811734671,0.2445526411874972 -Na2Bi10O16_2_11990.vasp,Na2Bi10O16,-3.588509333928571,0.0880362946428544 -Sn3Sb4_5_16930.vasp,Sn3Sb4,-1.6067579985714284,0.2932910059821427 -Sb2S2I2_59_15679.vasp,Sb2S2I2,-1.6404016733333335,-0.6367505366666668 -Mn1Sn1Se2_6_10897.vasp,Mn1Sn1Se2,-1.80818004,0.1241859731465495 -V3H4O8_8_20270.vasp,V3H4O8,-4.857325948,0.2719219817777745 -Bi4I12_14_2613.vasp,Bi4I12,-0.414061876875,0.0756921493749999 -Sb16Br4_10_15421.vasp,Sb16Br4,-1.8645133015,0.1031261839999986 -Zn2Cl2_129_21057.vasp,Zn2Cl2,0.75312787,0.60406443609375 -Ag2Bi2S4_26_196.vasp,Ag2Bi2S4,-1.48340080875,0.2616978591666667 -Sc1Ge3_187_15938.vasp,Sc1Ge3,-2.6362119575,0.5605516699999997 -Mn1H8C10Se2N6_12_10768.vasp,Mn1H8C10Se2N6,-5.662963744074074,-1.6504335264197538 -Cr1Si1S2I1Br1_6_4266.vasp,Cr1Si1S2I1Br1,-2.4375818466666668,0.092733903484843 -K2Cd4S6I6O2_31_9052.vasp,K2Cd4S6I6O2,-0.7935425119999999,0.3126266698958314 -Ta2Os2Se8_11_17819.vasp,Ta2Os2Se8,-3.9717215825,0.1481286183333332 -Te1Pb1_156_18322.vasp,Te1Pb1,-1.158715625,-1.2194828 -Ru2O6_2_15335.vasp,Ru2O6,-4.0255210275,0.5365551703125 -Mg2N1_164_10488.vasp,Mg2N1,-2.7168344033333334,0.31565371486111 -Cd2Te6Pt4_164_3603.vasp,Cd2Te6Pt4,-1.0025569691666667,0.0934310191666654 -Tc2S2_129_18236.vasp,Tc2S2,-5.5827797725,0.37811905 -Ge2Br2_129_6755.vasp,Ge2Br2,-1.62601014,0.15081282625 -Mn2Sb2Te4F2_26_11258.vasp,Mn2Sb2Te4F2,-1.790034258,0.3531808254999982 -Na2Cd4Te2S6I6_31_12049.vasp,Na2Cd4Te2S6I6,-0.7292196175,0.0516405304583312 -Sr2Cu1S2Br2_38_17200.vasp,Sr2Cu1S2Br2,-2.007724802857143,0.0249908061904721 -Hf2I5Br1_1_7522.vasp,Hf2I5Br1,-2.09149593375,0.291433837222216 -In1Cu1Te6As2_149_8240.vasp,In1Cu1Te6As2,-1.34078573,0.2820086641666652 -Sr2Mn2Ge2_129_17275.vasp,Sr2Mn2Ge2,-1.6579399916666666,0.4031684009195386 -Sb2S2F2_59_15676.vasp,Sb2S2F2,-2.6005609,0.3421612399999976 -Y1Be5_1_20607.vasp,Y1Be5,-2.823492293333333,0.7342937775640994 -Nb2Te1Se3_99_12903.vasp,Nb2Te1Se3,-3.756236575,0.2828952709027778 -Zr1Nb1Se1Cl1_25_21356.vasp,Zr1Nb1Se1Cl1,-3.59521573,0.5713238747916627 -Cu2Te6P2_162_5360.vasp,Cu2Te6P2,-1.348433149,0.3629550943333333 -Nb2P2S6_162_12806.vasp,Nb2P2S6,-4.123757832,-0.1246105990277808 -Ag1Ge1I2_6_60.vasp,Ag1Ge1I2,-0.4728405725,0.0821041993749999 -Sr2Au2_191_17136.vasp,Sr2Au2,0.302218865,0.34511861625 -Al2Se2_12_971.vasp,Al2Se2,-2.818966585,0.12939246 -Na2Hf1H6S6_147_12143.vasp,Na2Hf1H6S6,-3.415658572,0.1166197168333336 -Mn1Au3S1Br2Cl1O4_1_10644.vasp,Mn1Au3S1Br2Cl1O4,-1.4936928875,0.583890831875 -Ga1P1_156_6229.vasp,Ga1P1,-2.71230666,-0.5687816799999998 -Ge2C2Br2_59_6760.vasp,Ge2C2Br2,-2.975958123333333,0.914032324166663 -Zn2Fe4S10_11_21078.vasp,Zn2Fe4S10,-1.770486859375,-0.0204773995000001 -Nb4Sn2S8_55_13158.vasp,Nb4Sn2S8,-4.139683803571429,0.3637424457142821 -Er2H4Cl2O4_11_5560.vasp,Er2H4Cl2O4,-4.661013476666667,0.0785427250000001 -Sc1Si5_47_16003.vasp,Sc1Si5,-3.568968248333333,-0.1650926116666695 -Ta4Te12I2_2_18124.vasp,Ta4Te12I2,-2.7156185805555557,0.1660647129629608 -Ag2Sb4Te3I2_6_421.vasp,Ag2Sb4Te3I2,-0.8993384172727272,0.2287315186363611 -Ag1S1I1Br1_1_110.vasp,Ag1S1I1Br1,-0.3033666725,0.2077737228125 -Ge2W1S3I2_1_6896.vasp,Ge2W1S3I2,-2.56812554125,0.1289453871874999 -Mo1Se2_115_11549.vasp,Mo1Se2,-2.3512422266666664,0.6941709966666672 -Hg1Br2_164_7843.vasp,Hg1Br2,0.51480021,0.0878828766666666 -Ho1Se1_8_8120.vasp,Ho1Se1,-2.84632201,0.95332493 -Na6Te2S8F2_11_12448.vasp,Na6Te2S8F2,-2.28161307,0.06246819909722 -Hg2S2N2Cl2O6_26_7997.vasp,Hg2S2N2Cl2O6,-2.6476427971428573,0.4331052715178486 -V2H2S2N1_164_20078.vasp,V2H2S2N1,-4.127149064285715,0.0021534430519387 -Zr1Sc1Se1Cl1O1_8_21436.vasp,Zr1Sc1Se1Cl1O1,-4.395659258,0.1529760790000003 -Ta4Co8S8_59_18028.vasp,Ta4Co8S8,-3.820030959,0.1023682300000001 -Nb2Cl4O2_25_12681.vasp,Nb2Cl4O2,-4.3197235175,0.0576515200000002 -Nb4Si2S8_55_13155.vasp,Nb4Si2S8,-4.766880961428571,0.1399552790043197 -Ge8Ir2_125_6971.vasp,Ge8Ir2,-3.181975431,-0.0288777533333366 -Al1B4_47_612.vasp,Al1B4,-4.604332756,-0.1492234346666658 -Cu1Se2_164_4976.vasp,Cu1Se2,-0.9122569033333332,-0.6961668483333333 -Ca2P4H12O18_2_3092.vasp,Ca2P4H12O18,-4.951462779722222,0.044499035555555 -Pb8Se8O24_14_14340.vasp,Pb8Se8O24,-3.60796200375,0.0491127932499999 -As2Cl8_1_1206.vasp,As2Cl8,-1.196600984,0.1183784404999999 -Mn1Ga2S4_156_10726.vasp,Mn1Ga2S4,-2.8617924757142856,0.0345158414285715 -Ta1H2_187_17550.vasp,Ta1H2,-4.435267416666666,0.2817415883333343 -Cu2Te4_14_5357.vasp,Cu2Te4,-0.4525638783333333,0.4496850638888881 -Bi2Cl6_162_2448.vasp,Bi2Cl6,-1.3532003775,0.0620930824999998 -Mg4Sn8O16_59_10587.vasp,Mg4Sn8O16,-4.040613675,0.2151517910714244 -Er2Co2Si4_129_5556.vasp,Er2Co2Si4,-3.40571055375,0.4754510516666629 -K2Ru2N2Cl10O2_2_9321.vasp,K2Ru2N2Cl10O2,-2.291164777777778,-0.0039997791666717 -Ti2Br6_2_18906.vasp,Ti2Br6,-2.60978456125,0.11648525875 -Y1S1Br1_25_20662.vasp,Y1S1Br1,-4.047572176666667,0.2361047549999995 -Hg4Br4O12_13_8068.vasp,Hg4Br4O12,-1.3889624475,0.3199536538750005 -Pd2Cl2O4_2_14411.vasp,Pd2Cl2O4,-2.0165773,0.2394754338541669 -Hf2I1Br3O2_8_7508.vasp,Hf2I1Br3O2,-4.209928515,0.1983011792187503 -Mg3_123_10571.vasp,Mg3,0.26466149,-0.1495869183333333 -Hg3F6_143_8057.vasp,Hg3F6,-0.3663577077777777,0.0803858480555555 -V1S2O8_164_19915.vasp,V1S2O8,-4.600553654545454,0.0572726202272688 -Mo2H6_11_11617.vasp,Mo2H6,-3.1499297225,1.81169925625 -As8O16_26_1399.vasp,As8O16,-4.270401307916667,0.1708018774999913 -Ga1Sn3S6Br2_6_6287.vasp,Ga1Sn3S6Br2,-2.203700208333333,0.1147520633333336 -Mo1W3Se8_25_11559.vasp,Mo1W3Se8,-3.613934675833333,-0.6714054916666667 -Hf4H2N3O2_164_7785.vasp,Hf4H2N3O2,-6.823641257272727,0.4561047665908952 -Si8Pt2_100_16550.vasp,Si8Pt2,-3.4815158429999995,-0.2265172169999991 -Ni4Sb4Se4_13_13762.vasp,Ni4Sb4Se4,-1.2631513508333334,0.4132062449999998 -Al2N6_164_895.vasp,Al2N6,-5.24650081,0.6873069512500005 -Ga1Os1S2I1Cl3_1_6227.vasp,Ga1Os1S2I1Cl3,-2.0067475875,0.3704790099218749 -Au4Cl4O4F4_14_1569.vasp,Au4Cl4O4F4,-0.64233884875,0.4701824630729166 -Mn2Br6_191_11035.vasp,Mn2Br6,-0.7942944525,0.31405410375 -Te2Pt2S6_11_18488.vasp,Te2Pt2S6,-2.279657348,0.1145962222499976 -K2Fe2P2N2O14_2_9102.vasp,K2Fe2P2N2O14,-4.545380800454546,0.0471529827272716 -Mg1F2_164_10357.vasp,Mg1F2,-3.427739486666667,-0.3071138150000005 -Tl2Br6_26_19386.vasp,Tl2Br6,-0.25452303875,0.1699009740625 -Pt2I6_189_14636.vasp,Pt2I6,0.13779452125,0.4661855767187498 -K8P8H4O26_1_9555.vasp,K8P8H4O26,-4.724235533260869,0.0993441814673867 -Li1V1F4_10_9806.vasp,Li1V1F4,-3.578389963333333,-0.475847866666669 -Sr2Bi4O8_11_17146.vasp,Sr2Bi4O8,-3.940885477142857,0.0407323778571431 -Li1Sb3_187_9787.vasp,Li1Sb3,-1.7951136525,0.5849549046875001 -Nb4Ge4O14_26_13081.vasp,Nb4Ge4O14,-5.907586473636363,-0.0002779255681848 -Be2Pb2F8_59_2264.vasp,Be2Pb2F8,-3.3233550708333333,0.1627243070833335 -Cr2Se2_164_4501.vasp,Cr2Se2,-2.7756117525,0.3899897699999999 -Nd1S3_191_13225.vasp,Nd1S3,-3.0154139,0.9610121948281252 -Ta4Te16Pd3_2_18129.vasp,Ta4Te16Pd3,-2.578529302173913,0.0809932724999942 -In2S2Br2_59_8543.vasp,In2S2Br2,-1.7968520966666668,0.0697860691666667 -Nb3C2O2_187_12962.vasp,Nb3C2O2,-7.326368675714286,0.0972196593452237 -Sr2Cu2H8O8_47_17213.vasp,Sr2Cu2H8O8,-3.813962672,0.135099330277775 -Sn2Br2O2_59_16744.vasp,Sn2Br2O2,-2.4941996333333334,0.2699058066666664 -W2Se4_11_20553.vasp,W2Se4,-3.77420072,-0.3827403499999997 -Cu2Re1I6_147_5236.vasp,Cu2Re1I6,-0.43823399,0.2175540435879623 -Mn2Sb2Br2O4_10_11231.vasp,Mn2Sb2Br2O4,-3.2246783530000003,0.1153547359999995 -Sc2Nb1Br2N2_5_16108.vasp,Sc2Nb1Br2N2,-4.833095191428571,0.2082794701587151 -Ta4Te2O16_13_18130.vasp,Ta4Te2O16,-5.777388526818182,0.1704904773863593 -Fe4C3O2F2_164_6075.vasp,Fe4C3O2F2,-2.9528647672727275,1.5478535299999858 -Li2O2F2_129_10031.vasp,Li2O2F2,-2.654548123333333,0.5721342520833304 -Pd2S2Br2_59_14458.vasp,Pd2S2Br2,-1.3504408983333331,0.0781691416666667 -Cu2N6_49_5193.vasp,Cu2N6,-4.48028198125,0.0671342856250003 -Ba1I1Cl1_156_1838.vasp,Ba1I1Cl1,-1.89535321,0.2669389216666669 -Tl1Pd5I2_123_19322.vasp,Tl1Pd5I2,-0.605065415,0.4860595657812499 -Pd3N6_147_14504.vasp,Pd3N6,-2.9405159888888885,1.2979667061111078 -Sr4Cu4O6_1_17427.vasp,Sr4Cu4O6,-2.3335633692857143,1.0152306807142797 -Hg2I2N2O6_26_7969.vasp,Hg2I2N2O6,-2.599205663333333,0.0521761608333335 -Zr1As2_164_21248.vasp,Zr1As2,-3.6140544,-0.4290413850000005 -Cs2C2S8Cl6_1_4673.vasp,Cs2C2S8Cl6,-2.1548635394444444,0.3430284608680523 -As4S6_7_1365.vasp,As4S6,-2.898571028,0.6209239004999998 -Cd1Sn2S2Cl2_12_3432.vasp,Cd1Sn2S2Cl2,-1.4744246728571428,0.1179278614285684 -K2Mg1O10F4_2_9221.vasp,K2Mg1O10F4,-2.325038724705882,0.8236176748529389 -Cu2H4O4_31_5128.vasp,Cu2H4O4,-3.245756682,0.3270854444166673 -Ag2Te4P2_26_482.vasp,Ag2Te4P2,-1.21845365125,0.3893609701136357 -Hg2Br2_47_7947.vasp,Hg2Br2,1.2222852525,0.4315516975000001 -Li1In1Br4O12_2_9728.vasp,Li1In1Br4O12,-2.549350182777778,0.1890364909027697 -Zn2Sb2Te6_147_21149.vasp,Zn2Sb2Te6,-0.7514137,0.3779900566666651 -Nb1Br2_115_12480.vasp,Nb1Br2,-2.3140040266666664,0.6473054945833298 -Ga2Pd1Se4_164_6434.vasp,Ga2Pd1Se4,-2.145312105714285,0.0266423671428556 -Zr2Sb2S6_2_21663.vasp,Zr2Sb2S6,-3.739594143,0.2266303756666646 -Hf2Mn3Br3Cl1O5_1_7530.vasp,Hf2Mn3Br3Cl1O5,-4.274733084285715,0.2689785742456825 -Cr1P2_187_4233.vasp,Cr1P2,-3.659515556666667,0.5507322983333327 -Mg2B4H16_26_10426.vasp,Mg2B4H16,-3.709863968636364,0.0208552521969691 -K2Cd4Te2S6Cl6_31_9071.vasp,K2Cd4Te2S6Cl6,-1.013076847,0.2429318000416642 -Ta2Se2F2_59_17871.vasp,Ta2Se2F2,-4.651676356666667,0.1859526746666566 -Nb1In2H1S3Br3_1_12529.vasp,Nb1In2H1S3Br3,-2.479354421,0.370564459749998 -K2C2Se2O6F6_1_9028.vasp,K2C2Se2O6F6,-3.2862475511111118,0.4588157987499964 -Tl18Se9_143_19195.vasp,Tl18Se9,-0.9054267681481482,0.1768588762962962 -B2Au2S2Br2_31_1653.vasp,B2Au2S2Br2,-1.54925794875,1.3470463527083334 -Ag2H4C6I2_2_280.vasp,Ag2H4C6I2,-3.991869367142857,0.4167960128571417 -Cr1F2_164_4169.vasp,Cr1F2,-3.2590364,0.0266107133333306 -Sb1Mo1Se3_1_15469.vasp,Sb1Mo1Se3,-2.216753084,0.549605931499998 -Zr2Br2_164_21524.vasp,Zr2Br2,-2.9753611325,0.0979651550000002 -Rh2Se2Cl2_11_15235.vasp,Rh2Se2Cl2,-2.0371259616666664,0.0884951650000003 -Sn2P2O6F2_7_16816.vasp,Sn2P2O6F2,-4.60712375,0.0436218070833334 -Zn3Au1_191_21201.vasp,Zn3Au1,1.9687629125,0.5355377915624999 -Cu1I2_187_4910.vasp,Cu1I2,0.5115809333333333,0.314083342638889 -B2Ru1_123_1697.vasp,B2Ru1,-4.303058623333333,1.3457352416666657 -Cu2H4C2I2N4_2_5117.vasp,Cu2H4C2I2N4,-3.825686097857143,0.2045867589880859 -Ge2Cl2_164_6769.vasp,Ge2Cl2,-1.8487493225,0.1698902612499998 -V1Ag1As2Se6_5_19748.vasp,V1Ag1As2Se6,-2.172898633,0.1977018495999982 -Sr1O2F2_164_17068.vasp,Sr1O2F2,-2.453102856,1.1778726645000006 -Ga2Se2Br2_31_6466.vasp,Ga2Se2Br2,-1.8527003533333333,0.0236660491666667 -Ga2H2O4_31_6375.vasp,Ga2H2O4,-4.346966185,-0.5680197412500001 -Al1Br2_115_615.vasp,Al1Br2,-1.2874502933333334,0.4579770427777762 -Br3N1_1_2706.vasp,Br3N1,-0.8471218675,0.5314669706250001 -Os2N2Cl2_59_13856.vasp,Os2N2Cl2,-3.99121083,0.001105193749997 -Ga6O9_150_6584.vasp,Ga6O9,-4.436899503999999,-0.3688152067500028 -Si2Se2_31_16450.vasp,Si2Se2,-2.9797187175,0.1118873826562502 -Al2Ni1Se4_164_898.vasp,Al2Ni1Se4,-2.326098751428572,0.010395414285713 -Cu9Pb2Se4Cl4O16_10_5507.vasp,Cu9Pb2Se4Cl4O16,-2.334384361142857,0.2832569682499911 -Mn2C2F2_59_11045.vasp,Mn2C2F2,-3.7043287516666665,0.7657800766666629 -Pt2Br2_12_14601.vasp,Pt2Br2,-0.9654363225,0.4642322881249999 -Mn2As2Se4Br2_26_10979.vasp,Mn2As2Se4Br2,-2.066041719,0.0900195579166639 -Nb3S1I7_156_13001.vasp,Nb3S1I7,-2.27895785,0.0811889681818183 -Ag1As1Se2Cl2_1_3.vasp,Ag1As1Se2Cl2,-1.2843218733333333,1.1596897677777724 -Te1Pt2Se1_8_18329.vasp,Te1Pt2Se1,-1.52963318,0.4974399253125 -V1H4N4Cl1O6_1_19856.vasp,V1H4N4Cl1O6,-4.45139295375,0.1504082308033854 -Fe1Pd1S2I1Br1_6_5738.vasp,Fe1Pd1S2I1Br1,-1.4244770233333333,-0.2361465058333334 -Sb1Au3S4_156_15436.vasp,Sb1Au3S4,-0.98092135125,0.4623070456249998 -Fe2Se2_67_5980.vasp,Fe2Se2,-0.9090264175,0.4743664199999999 -Pb1S2_187_14202.vasp,Pb1S2,-2.1306270266666667,-0.8092431302083346 -Y4N3Cl2_164_20830.vasp,Y4N3Cl2,-6.1858412677777785,-0.1974154133333399 -Ca2Bi4S8_11_2957.vasp,Ca2Bi4S8,-2.559838127142857,-0.6800620321428595 -Al1Cu1Sb2S6_149_645.vasp,Al1Cu1Sb2S6,-2.390623199,0.3762411189374979 -Ga1Pt3Br3N3Cl1O1_1_6248.vasp,Ga1Pt3Br3N3Cl1O1,-2.5529901991666666,0.3074527759374978 -Cd2Sb2S4I2_11_3562.vasp,Cd2Sb2S4I2,-1.223623641,-0.3248674744999998 -Nb2Cl2_129_12680.vasp,Nb2Cl2,-3.255507185,0.9568708180357092 -Ag2C2S2F2_31_222.vasp,Ag2C2S2F2,-2.33899529875,0.7200141805468749 -Tl2Se2I2_59_19529.vasp,Tl2Se2I2,-0.5788036033333334,0.4826677861111102 -Sc4S6_65_16262.vasp,Sc4S6,-4.205796187,0.3806392735000008 -Sc2B1F2_164_16033.vasp,Sc2B1F2,-4.317594138,-0.2355666581666688 -Li2Co2P2O8_11_9863.vasp,Li2Co2P2O8,-4.775859466428571,0.0200303673809483 -Fe1Ge1S1Br3_1_5680.vasp,Fe1Ge1S1Br3,-1.602475138333333,-0.0430788471875028 -Ni1Bi1_187_13280.vasp,Ni1Bi1,0.67675515,2.73012325125 -Mn2Sb2Te2Mo1_1_11253.vasp,Mn2Sb2Te2Mo1,-1.7982591757142856,0.2571347414285696 -Ta2O2_6_17812.vasp,Ta2O2,-6.614717455,1.123555259000001 -Na12Ge4Te12_14_11804.vasp,Na12Ge4Te12,-1.631495639642857,0.1341728221428555 -K4Hg2I8_11_9462.vasp,K4Hg2I8,0.0550457964285714,-0.2728236738095234 -Nb2Se2I1Br1_6_12872.vasp,Nb2Se2I1Br1,-3.396397856666667,-0.1952067091071496 -Te2Ru2_67_18520.vasp,Te2Ru2,-1.90090463,1.11432789375 -Te2P2H2S10_4_18437.vasp,Te2P2H2S10,-2.720895579375,0.1316570848958335 -Th2N2Cl2_129_18726.vasp,Th2N2Cl2,-6.134721258333333,0.1517042516666666 -V2B1Cl2_164_19986.vasp,V2B1Cl2,-3.48851389,0.211940736 -Er2Se2I2_59_5574.vasp,Er2Se2I2,-2.830859788333333,0.0442513083333335 -K2Mn2Sb2_129_9243.vasp,K2Mn2Sb2,-1.0114682133333333,0.3501701325862058 -Ca2O8F4_125_3081.vasp,Ca2O8F4,-2.593945012857143,0.9717549978571394 -Cr1Sb2Te6Au1_149_4257.vasp,Cr1Sb2Te6Au1,-1.285831001,0.3036610944999979 -Tl1In1Cl6_5_19293.vasp,Tl1In1Cl6,-1.04654395375,0.0455845112499999 -Sb4S6_11_15817.vasp,Sb4S6,-2.6626031990000003,0.141389921 -In2Te1S1I2_1_8611.vasp,In2Te1S1I2,-1.0997331316666668,0.1611483474999999 -In2Si2Te2_164_8605.vasp,In2Si2Te2,-2.207055466666666,-0.2869997700000016 -Al2Te3P2S3_1_1014.vasp,Al2Te3P2S3,-2.775435368,0.3749464358750001 -Be1As2S4F4_5_2214.vasp,Be1As2S4F4,-2.7742204527272727,0.6258730066287819 -Na2Cd4Se2O6F6_31_12039.vasp,Na2Cd4Se2O6F6,-2.086149278,0.2260603520000002 -Zn2Te2_129_21185.vasp,Zn2Te2,0.088613675,0.211294535 -Na12Si4Te12_14_11805.vasp,Na12Si4Te12,-1.793646882142857,0.1534976628571429 -Te2Mo2N1_164_18408.vasp,Te2Mo2N1,-3.427056628,0.1289990540000003 -Ga1Rh2I1Cl1O2_6_6255.vasp,Ga1Rh2I1Cl1O2,-2.262427462857143,0.5979266967857089 -W1O2_191_20444.vasp,W1O2,-4.218039963333333,2.049659805306116 -Bi2O2_164_2484.vasp,Bi2O2,-2.8443890475,0.4484174749999985 -Hg2P2S6_147_7980.vasp,Hg2P2S6,-2.035116839,0.0784565934999999 -Ti2S1I1Br1N1_6_18991.vasp,Ti2S1I1Br1N1,-4.579034993333333,0.1449748729166615 -Ge2P2_164_6815.vasp,Ge2P2,-3.609521435,-0.5000356299999997 -Mg2Sb4_12_10511.vasp,Mg2Sb4,-1.491789595,0.2183891737499984 -Fe3H2C2_187_6053.vasp,Fe3H2C2,-3.066474268571429,1.2162238228571391 -Ga8Te12_14_6593.vasp,Ga8Te12,-1.686285479,0.1237385062 -Ni1Ir3S8_1_13374.vasp,Ni1Ir3S8,-2.864361420833333,-0.0864425732291689 -Zn2Te1S1I1_8_21175.vasp,Zn2Te1S1I1,-0.2198955199999999,0.3434799140916666 -P4C3_5_14077.vasp,P4C3,-5.05287085,0.737552031428566 -Rh2F2_129_15188.vasp,Rh2F2,-0.8311951075,1.6716656233333311 -Ni2Sb2Te5_8_13618.vasp,Ni2Sb2Te5,-1.0344173877777778,0.2263320679365054 -Ti4Te4Cl4_31_19166.vasp,Ti4Te4Cl4,-3.4751738383333333,0.1618943573809454 -Sr2Co1Br2O2_123_17187.vasp,Sr2Co1Br2O2,-1.6157944985714283,1.4655218464285666 -Ba2C2S2N2Cl2_11_1933.vasp,Ba2C2S2N2Cl2,-4.633854027,-0.0683867499166733 -Ti3B2Te2H2_187_19070.vasp,Ti3B2Te2H2,-4.596343267777778,0.3586789883333292 -Ag2Br6_162_208.vasp,Ag2Br6,0.29320466625,0.24195905875 -Cd2H2_2_3510.vasp,Cd2H2,-0.10874476,0.8977360000000001 -Mn2H2S2N1_164_11094.vasp,Mn2H2S2N1,-3.4621394800000003,-1.40180934101191 -Na1Sb2Pd1Se6_149_11930.vasp,Na1Sb2Pd1Se6,-1.843859219,0.3240058571666644 -Ho2Se6_51_8150.vasp,Ho2Se6,-2.8219865575,-0.3952394962499999 -Ag4Br4O4F4_1_504.vasp,Ag4Br4O4F4,-0.6370731525,0.5027150200000001 -Li2H8Cl2O4_2_9957.vasp,Li2H8Cl2O4,-3.873424050625,0.0411951445833334 -Zr1Ti1S2I2_6_21474.vasp,Zr1Ti1S2I2,-3.673792138333333,-0.1078110399652856 -Cr2Sb2O6_162_4479.vasp,Cr2Sb2O6,-4.650523625,0.03330274175 -Ni1C2S2N2_12_13293.vasp,Ni1C2S2N2,-4.741822345714286,0.0809797349404656 -Na8Pb4O8_13_12453.vasp,Na8Pb4O8,-2.9648736815,0.0411991310000003 -Na2H14C8O14_2_12095.vasp,Na2H14C8O14,-5.099099329736842,0.0610554677631471 -Ba3Ni2Cl2O5_123_2120.vasp,Ba3Ni2Cl2O5,-3.213630601666667,-0.1377915608333365 -P6H2O12_4_14135.vasp,P6H2O12,-5.176054631,0.0483963713833284 -Cu4S2O12_14_5444.vasp,Cu4S2O12,-2.880268662777778,0.4622980311111079 -Ni2Te2P1_187_13664.vasp,Ni2Te2P1,-1.29708214,0.0817110705416659 -Mn3C2O2_187_11364.vasp,Mn3C2O2,-4.6232983,0.2668948173809484 -In4Cl8_2_8671.vasp,In4Cl8,-1.2597354491666668,0.1542544191666666 -As2W2_12_1312.vasp,As2W2,-4.207406885,0.6993025958333268 -K4Cl2_51_9431.vasp,K4Cl2,-0.3656586683333333,0.1590975549999995 -Tl1P2Au1Se6_149_19315.vasp,Tl1P2Au1Se6,-1.887808847,0.1215062555937482 -Re2I2_2_15051.vasp,Re2I2,-3.128069235,0.5562350247222194 -Ti2Te2Cl2_59_19037.vasp,Ti2Te2Cl2,-3.513832213333333,0.1232359823809452 -Na2Ag1O2_12_11960.vasp,Na2Ag1O2,-2.051086964,0.0335484798333334 -Au2I2_67_1489.vasp,Au2I2,0.59323003,0.07950710875 -K4Cr4Cl4O12_14_9437.vasp,K4Cr4Cl4O12,-3.705258933333333,-0.2320532087326429 -Hf2S2Br2_59_7567.vasp,Hf2S2Br2,-4.246552011666666,-0.005793841250008 -Cr1Cu1Sb2Te6_143_4156.vasp,Cr1Cu1Sb2Te6,-1.35648588,0.2566769270833319 -Pr2I2O2_129_14546.vasp,Pr2I2O2,-4.517313288333333,0.0557141550000004 -Te4P4Pd4_13_18607.vasp,Te4P4Pd4,-2.280479515,0.2083239358333332 -Tl8S4O12_14_19650.vasp,Tl8S4O12,-3.14338105375,0.2089771789583334 -Y1Sb2S4_123_20668.vasp,Y1Sb2S4,-3.457664094285714,0.2516248203869022 -As1S1Br1_156_1167.vasp,As1S1Br1,-2.128869163333333,0.1048030599999996 -Cd1Bi1I1Br1_1_3279.vasp,Cd1Bi1I1Br1,0.1599360725,0.0757937367708329 -Cu2B4H4I2N2_2_5034.vasp,Cu2B4H4I2N2,-3.5764468078571428,0.4930390632857055 -Mn2C1Cl2_164_11037.vasp,Mn2C1Cl2,-3.001837152,0.1309032219999935 -B1Te1_156_1638.vasp,B1Te1,-2.454787395,1.4115981325 -Na2Ni1_187_12235.vasp,Na2Ni1,0.7602125733333334,2.828381733333331 -Hf2S4I1Br1_1_7579.vasp,Hf2S4I1Br1,-3.76804987875,0.3184014383593755 -Co2Te4F2_11_4044.vasp,Co2Te4F2,-1.72982294625,0.1190508176874975 -Ga2H14N4_10_6374.vasp,Ga2H14N4,-3.9424015305,-3.5602605175000046 -Fe2P2S7_6_5918.vasp,Fe2P2S7,-2.515378173636364,0.1228269770041265 -Bi1Se2_187_2395.vasp,Bi1Se2,-1.6142228133333332,0.5273683705555534 -Ge3Bi4_5_6907.vasp,Ge3Bi4,-1.786089487142857,-0.588032507857144 -Cu2Sb4S12_10_5275.vasp,Cu2Sb4S12,-2.1886565711111112,0.2623021672569421 -Ge1O1_156_6681.vasp,Ge1O1,-4.148842245,0.0578758243749999 -Ni2P2O6_162_13559.vasp,Ni2P2O6,-3.854086924,1.1547997995000006 -Te2P2S1_164_18441.vasp,Te2P2S1,-2.552316288,0.2984676412499963 -Li2Nb12Cl38_51_10008.vasp,Li2Nb12Cl38,-2.9699432925,0.0508198523076925 -Sn4Br1Cl3O4_1_16938.vasp,Sn4Br1Cl3O4,-2.7467320025,0.1813300602083332 -Ni1Sn1Se4_1_13425.vasp,Ni1Sn1Se4,-1.4591119483333337,0.3558018816666665 -Sr2Cd1In1Cu1O5_99_17173.vasp,Sr2Cd1In1Cu1O5,-2.853465495,0.4445969932291628 -Mo3O8_12_11718.vasp,Mo3O8,-4.988236889090909,0.2213356998484803 -Mn1Sb1W1Se3_6_10867.vasp,Mn1Sb1W1Se3,-2.921665056666667,-0.0999443280555578 -Ge2S2I1Cl1_1_6825.vasp,Ge2S2I1Cl1,-2.218746808333333,0.1565170805208331 -Au2Se1S1Br1Cl1_1_1536.vasp,Au2Se1S1Br1Cl1,-0.415499675,0.2511468807812495 -Ti1C1F2_1_18753.vasp,Ti1C1F2,-4.6268602775,0.5716184533333215 -Sn2P1_164_16804.vasp,Sn2P1,-2.0358901533333333,-0.5925100166666682 -K1Sn1As1_156_8938.vasp,K1Sn1As1,-1.1012502266666666,0.2373049499999999 -C1Cl4_123_2726.vasp,C1Cl4,-0.8704651999999999,1.0051422600000002 -Nb2Ir1Se2I3_1_12757.vasp,Nb2Ir1Se2I3,-2.52191235125,0.5497318619696899 -Sb2P2_1_15629.vasp,Sb2P2,-2.9656469875,0.19913454125 -Gd2Ge1Br2_164_6613.vasp,Gd2Ge1Br2,-2.936170566,-0.3521257759999998 -Si2Te2Cl2_59_16455.vasp,Si2Te2Cl2,-2.059114333333333,0.2919837649999979 -Co2H8N4O16_14_3921.vasp,Co2H8N4O16,-4.321994935999999,0.0152593617777785 -Ge2Ru1_123_6819.vasp,Ge2Ru1,-3.2807558033333333,0.3149757143749974 -Na1Ga1Te6As2_5_11870.vasp,Na1Ga1Te6As2,-1.589304853,0.2928553743571396 -Nb4Re2O16_2_13134.vasp,Nb4Re2O16,-6.3169662886363644,-0.0175175061931867 -Mo2As4O12_4_11565.vasp,Mo2As4O12,-4.738755165555556,0.0485240508888882 -Ga1Si1Te3_143_6281.vasp,Ga1Si1Te3,-1.635392802,0.4878529872142809 -Ga4Te4Br4_14_6576.vasp,Ga4Te4Br4,-1.4780252333333337,0.0517190066666666 -Ag4S4Cl4_14_548.vasp,Ag4S4Cl4,-0.7703311583333333,0.1885097264583325 -Zr1Mn1Nb2Zn1Se1S5Br4_1_21325.vasp,Zr1Mn1Nb2Zn1Se1S5Br4,-2.9401276286666667,0.3180584909333308 -Sr1Au2S8_89_17027.vasp,Sr1Au2S8,-1.966584350909091,0.1344404715340866 -Ga1Cu1Ag1S4I1Br2_1_6157.vasp,Ga1Cu1Ag1S4I1Br2,-1.186034852,0.253147478944442 -Al4Te4I4_14_1102.vasp,Al4Te4I4,-1.6197346608333334,0.0613185258333333 -Y2Br2O2_129_20699.vasp,Y2Br2O2,-5.459866016666666,0.0347534466666674 -Hg2Te2F2_59_8029.vasp,Hg2Te2F2,-0.0031678566666666,0.4967818203160912 -Ru2Se2_164_15359.vasp,Ru2Se2,-2.7080951,0.7373417362500001 -Os2Se2Cl2_59_13881.vasp,Os2Se2Cl2,-2.593186101666667,0.3454490262499967 -Hf4C3Cl2_164_7773.vasp,Hf4C3Cl2,-6.567839155555556,0.032596751851845 -Ga2Fe2Te5_187_6361.vasp,Ga2Fe2Te5,-1.5969977366666666,0.0920725086772474 -Hf1Te1S1_156_7320.vasp,Hf1Te1S1,-4.464763323333334,0.1379544399999994 -Ca2C4_67_2972.vasp,Ca2C4,-4.289869416666667,1.2884301816666612 -V4F16_14_20322.vasp,V4F16,-3.2590476635,0.0213017854999999 -V1Ag1O1F4_1_19755.vasp,V1Ag1O1F4,-2.8129941214285714,-0.3162731416071505 -Bi8Te8S4_2_2701.vasp,Bi8Te8S4,-1.5976649895,0.3057348124999999 -Au2Cl4O12_4_1472.vasp,Au2Cl4O12,-1.9369192094444443,0.3378677617824064 -K1V1P2H2O6_156_8953.vasp,K1V1P2H2O6,-4.755925711666666,0.1670778996343856 -Pb6F16_1_14327.vasp,Pb6F16,-2.317057147272727,0.0873048986363616 -Os2S2Br2_59_13865.vasp,Os2S2Br2,-2.828994328333333,0.3148104095833304 -Te1Rh2S1I2_6_18332.vasp,Te1Rh2S1I2,-1.56438763,0.1851236619444421 -In1Ni1Te2Br2_1_8286.vasp,In1Ni1Te2Br2,-0.713268015,0.2041582595833319 -Na2Hf1_187_12146.vasp,Na2Hf1,-1.58587403,0.6448796666666647 -Cu2Se1Cl2O1_1_5288.vasp,Cu2Se1Cl2O1,-1.1777136316666663,0.1458053865972216 -Li2Ca2_11_9854.vasp,Li2Ca2,-0.132727455,0.724601968125 -W1I2_187_20438.vasp,W1I2,-0.8966217766666666,1.1740687763888888 -Cu1Ag1Se2_156_4828.vasp,Cu1Ag1Se2,-0.4999917375,0.0988223591666667 -Na4Zn2Si2_12_12433.vasp,Na4Zn2Si2,-0.5565135275,0.0530586637499999 -Sn2Te6P2_147_16903.vasp,Sn2Te6P2,-1.813710952,-0.3615062603333346 -Pt2S2_187_14663.vasp,Pt2S2,-1.9726985525,0.6423826074999999 -Sm2H4I6O20_2_16573.vasp,Sm2H4I6O20,-3.4698144734375,0.1301818158333336 -Ga2Te2Cl2_59_6499.vasp,Ga2Te2Cl2,-1.5113933666666668,-0.6469961608333334 -Sr2Te2Au1F2_38_17326.vasp,Sr2Te2Au1F2,-1.655764464285714,0.606060409285711 -K1Te2_115_8944.vasp,K1Te2,-0.6386370233333333,0.4385870424999979 -Hf1Mn1W1Se1S3I2Br1_1_7227.vasp,Hf1Mn1W1Se1S3I2Br1,-2.7370061110000004,0.4234904616249966 -W1Se1O1_156_20453.vasp,W1Se1O1,-4.82070099,0.0088790793197215 -K2Br1_164_9006.vasp,K2Br1,-0.1656604233333333,0.1031477966666664 -Ga2Cu1S1Br3Cl1_1_6340.vasp,Ga2Cu1S1Br3Cl1,-1.26306116875,0.135469035104166 -Fe2Cl2_129_5836.vasp,Fe2Cl2,0.033640105,1.8313153625 -S2_164_15388.vasp,S2,-1.874873485,0.7430113143750001 -Re6Se8Br2_2_15129.vasp,Re6Se8Br2,-4.217495908125,0.0643715637499999 -Rb2Hg4Se2S6F6_31_14882.vasp,Rb2Hg4Se2S6F6,-1.0095803235,0.3505618924062477 -Ca2H2I2_129_3032.vasp,Ca2H2I2,-1.9876485833333333,0.0466536266666663 -Ti1O2_164_18821.vasp,Ti1O2,-7.067317673333334,0.1965368516666661 -Au2S1I4_1_1507.vasp,Au2S1I4,0.2489134214285714,0.2212933594940459 -P2Au2S2_7_13955.vasp,P2Au2S2,-1.8743416466666665,0.2644447591666667 -Ga4Br4_57_6546.vasp,Ga4Br4,-1.31951663375,0.04489981625 -Al2Te4_12_1019.vasp,Al2Te4,-1.8798789983333333,0.1927150913541625 -Zn4W4O16_53_21234.vasp,Zn4W4O16,-4.474202869583333,0.4269865087499997 -Rb1_191_14765.vasp,Rb1,1.47795429,0.2685589800000001 -Bi1Te2_115_2408.vasp,Bi1Te2,-0.9550249966666668,0.6130675744444428 -V1Ga2S4_164_19835.vasp,V1Ga2S4,-3.146853734285714,0.1339929953571401 -Yb1Al2Ge2_164_20851.vasp,Yb1Al2Ge2,-2.78480438,-0.9096371199999996 -Ag4O4F8_14_535.vasp,Ag4O4F8,-0.95476059375,0.5111077315625 -Co2I6_189_3929.vasp,Co2I6,-0.02082527375,0.380933075 -Nb2Se4Cl4_12_12883.vasp,Nb2Se4Cl4,-2.998315267,0.0467281585238033 -Lu1As2_21_10290.vasp,Lu1As2,-2.85810247,0.5147617066666639 -Ba2Cd1In1Ag1O5_99_1938.vasp,Ba2Cd1In1Ag1O5,-2.597245161,0.5870425144583286 -Ge6N8_187_6964.vasp,Ge6N8,-4.608336242857143,0.6897454135714289 -Rb2Hg4Te2S6Br6_31_14888.vasp,Rb2Hg4Te2S6Br6,-0.6559151055,0.155384125812497 -Mo1Pb1O4_3_11536.vasp,Mo1Pb1O4,-4.45285596,0.3616076350000003 -Ir2S2Cl2_11_8814.vasp,Ir2S2Cl2,-2.6141029066666666,0.0988601483333333 -In1Ga1S2_8_8258.vasp,In1Ga1S2,-2.4761430075,0.0915553224999998 -Ru2Se2_129_15357.vasp,Ru2Se2,-2.95921544,0.4862213962500001 -Ge1Te1O4_35_6712.vasp,Ge1Te1O4,-4.010857301666666,0.3090044081249998 -Al2Cd1Se4_164_786.vasp,Al2Cd1Se4,-2.173484567142857,0.1564664100000001 -Ca2I4_51_3057.vasp,Ca2I4,-1.084471575,0.1881396896666665 -Ta4Cr2O16_2_18032.vasp,Ta4Cr2O16,-6.235714948636363,0.0314580972159053 -Ca2Ag1S2Cl2_123_2908.vasp,Ca2Ag1S2Cl2,-1.821305865714285,0.2519047806696387 -Ru2Se2F2_59_15355.vasp,Ru2Se2F2,-2.5554636816666667,0.4177817958333298 -Ga2Ni2Te5_156_6411.vasp,Ga2Ni2Te5,-1.1233171611111112,0.0418241373333327 -Cr1B4H4S6Cl1_2_4118.vasp,Cr1B4H4S6Cl1,-3.631840253125,0.7062749494270834 -Fe1Ni1I1Br1_1_5724.vasp,Fe1Ni1I1Br1,0.078655525,0.18697088828125 -Mo2S2_12_11671.vasp,Mo2S2,-3.39111021,0.77578793125 -Li4V4O12_13_10246.vasp,Li4V4O12,-5.188915848500001,0.1559393814999996 -Mg2Te6As2_162_10526.vasp,Mg2Te6As2,-1.6244420430000002,0.2368941951666649 -Ir1I2_164_8738.vasp,Ir1I2,-0.7376288066666666,0.5902554099999989 -Al2Se2Cl2_31_961.vasp,Al2Se2Cl2,-2.653481166666667,0.0384933883333329 -Ba2Fe2Si2_129_1983.vasp,Ba2Fe2Si2,-1.7439761766666668,0.1206831229166641 -Ta2Sb2Se6_12_17866.vasp,Ta2Sb2Se6,-3.47096291,0.2851956564999982 -Sb2Cl2_129_15566.vasp,Sb2Cl2,-1.25550099,0.5185159174999984 -Cr2Te2_129_4525.vasp,Cr2Te2,-2.2528226475,0.2880549949999962 -Ag2Te2_187_461.vasp,Ag2Te2,-0.0489112675,0.3087211754166666 -Ni1As1_187_13256.vasp,Ni1As1,-0.403658895,4.014044329017853 -W3N2Cl2_187_20561.vasp,W3N2Cl2,-4.84422812,-0.0340159926190505 -Cu2S2_187_5252.vasp,Cu2S2,-1.0652189975,0.2971847141666668 -Zr4B3S2_164_21807.vasp,Zr4B3S2,-5.212263854444444,0.2628697099999955 -Zn2As4O6F4_31_21032.vasp,Zn2As4O6F4,-3.218656306875,0.1833842421875 -K2Cd4Se2S6Cl6_31_9063.vasp,K2Cd4Se2S6Cl6,-1.0187803555,0.3108485712083307 -Mg1V4O10_25_10412.vasp,Mg1V4O10,-5.268608101333333,0.2233629468333289 -Zr2Br5Cl1_1_21527.vasp,Zr2Br5Cl1,-2.3418302725,0.1746148337499997 -Er2S2Cl2_59_5568.vasp,Er2S2Cl2,-3.783648985,0.0139882683333336 -Ca4Te4S12_14_3246.vasp,Ca4Te4S12,-2.468425156,0.0713505510833309 -Si2Sb2O6_162_16439.vasp,Si2Sb2O6,-5.039509842999999,0.3778391989999984 -Y2C1I2_164_20710.vasp,Y2C1I2,-4.149003823999999,0.0291239150666587 -Se4F4_2_16299.vasp,Se4F4,-1.75534109125,0.3463666015625 -Hg1Pb1Se1S1_1_7894.vasp,Hg1Pb1Se1S1,-0.8085749175,-0.8680105775 -Mn1Sn1Au2S1Br1Cl3O3_1_10887.vasp,Mn1Sn1Au2S1Br1Cl3O3,-1.7781689908333334,0.6366250018229108 -Pd3S3I2Br4_1_14507.vasp,Pd3S3I2Br4,-0.7378528133333333,0.27351287625 -Rh1O2_187_15161.vasp,Rh1O2,-2.9240363533333333,1.2066035049999997 -Na2H14C8O12_2_12094.vasp,Na2H14C8O12,-5.073657018611112,0.0824518995833263 -Mn6Br18_164_11464.vasp,Mn6Br18,-0.91857460375,0.1897739524999998 -Sn3Te1O6_1_16932.vasp,Sn3Te1O6,-3.65040661,0.4318693311666622 -Y1I2_123_20642.vasp,Y1I2,-2.251998423333333,0.150764386111109 -Te4Au4I4_14_18575.vasp,Te4Au4I4,-0.0682758708333333,0.1001489258333333 -Ga2I6_1_6393.vasp,Ga2I6,-0.52482537,0.088343090625 -Ru2S2_164_15344.vasp,Ru2S2,-3.2579374325,0.5026067050000003 -Li4Cr4O14_2_10178.vasp,Li4Cr4O14,-4.760766396363636,-0.2118436838447014 -Th1F2_187_18715.vasp,Th1F2,-4.393235736666667,0.6087427191666615 -Sn2Sb2Cl2O6_7_16854.vasp,Sn2Sb2Cl2O6,-3.37998258,0.3662803786111108 -Tb2Br6_162_18185.vasp,Tb2Br6,-2.30237444375,0.0545552537499998 -Hf1Rh1S2Br2_6_7272.vasp,Hf1Rh1S2Br2,-3.160225935,0.2732907066304295 -Ir2Se2_129_8841.vasp,Ir2Se2,-2.581292125,0.4863276668750003 -Ta4Pd6S10_59_18090.vasp,Ta4Pd6S10,-3.7001533295,0.1493873117999982 -Mn1Ge1S2Br2_6_10740.vasp,Mn1Ge1S2Br2,-2.1947444783333334,0.0253482326041667 -Sr1Si1Ag1Ge1I2_1_17082.vasp,Sr1Si1Ag1Ge1I2,-1.366175045,0.0174872822334203 -H4Au4S4Cl4_2_7063.vasp,H4Au4S4Cl4,-1.464934909375,0.1509970156250001 -Te2Au4_4_18378.vasp,Te2Au4,0.2980003516666666,1.0828690133333327 -Tc4I10_2_18249.vasp,Tc4I10,-1.6422259378571429,0.4974122004761848 -P2H6Pb2C2O6_7_13982.vasp,P2H6Pb2C2O6,-4.791088539444444,0.0223249801851856 -Ba2Ag1Te2I2_38_1896.vasp,Ba2Ag1Te2I2,-1.2262965242857145,0.2373346701413654 -Sc1S2_187_15990.vasp,Sc1S2,-3.682459883333333,0.5758838003124973 -Al1Ga1Hg1Se4_156_663.vasp,Al1Ga1Hg1Se4,-1.7948083971428572,0.1899263685714268 -In1S2F2_12_8328.vasp,In1S2F2,-1.792602876,0.8162845328124978 -Re6Te8Br2_2_15134.vasp,Re6Te8Br2,-3.64999597375,0.0114537058928529 -Te2Mo1_115_18401.vasp,Te2Mo1,-1.50844355,0.6024506999999999 -Ir1Pd1Se1I1O1_1_8748.vasp,Ir1Pd1Se1I1O1,-2.016295812,0.4055185440514672 -Bi1Cl3_187_2328.vasp,Bi1Cl3,-0.94727976,0.4680137 -Re1Au2F6_1_14992.vasp,Re1Au2F6,-1.7975620088888888,0.9149485733333304 -Ge2Te2_164_6886.vasp,Ge2Te2,-2.346088605,-0.8828472799999998 -Sb2As4H2O12_4_15539.vasp,Sb2As4H2O12,-4.238107782,0.1903774690416623 -Mn2Ga2Se5_164_11081.vasp,Mn2Ga2Se5,-2.3519330688888886,-0.0051805352682014 -Fe4O6_13_6085.vasp,Fe4O6,-3.313482764,0.5054137902500004 -Te1P1Br1_156_18315.vasp,Te1P1Br1,-1.59242577,0.4063510366666648 -Te1W1S1_156_18336.vasp,Te1W1S1,-3.6638907133333336,0.0948575874999997 -Rh2Br2_129_15174.vasp,Rh2Br2,-0.58206696,1.1538540133333317 -Cd1In2F8_5_3374.vasp,Cd1In2F8,-2.1091708845454544,0.1069748699999988 -Co2F6_12_3899.vasp,Co2F6,-2.35261952625,0.04236668875 -Na3As1_187_12349.vasp,Na3As1,-1.16450525,0.2661597641666666 -Cd2I2O3_1_3519.vasp,Cd2I2O3,-0.9778645671428572,0.3720302755595221 -Rb1F1_187_14729.vasp,Rb1F1,-1.778087055,-0.358882535 -Na1Au1S2O8_2_11824.vasp,Na1Au1S2O8,-3.6364796825,0.1736860141666669 -Ca4Sn4O8_2_3242.vasp,Ca4Sn4O8,-3.8928399875,-0.6559690550000006 -Bi1Pt1_187_2360.vasp,Bi1Pt1,-0.70735423,0.8583654525 -Ge1Bi1Se1S1_1_6647.vasp,Ge1Bi1Se1S1,-2.3231243475,-0.0835978746874999 -Bi2Mo1_164_2471.vasp,Bi2Mo1,-1.5926628333333337,0.5083280666666647 -Sr1Pb1S2O8_1_17074.vasp,Sr1Pb1S2O8,-4.472531608333333,0.1358960824999959 -Cd2F2_129_3503.vasp,Cd2F2,0.163440175,0.3219646312500002 -Fe2Sb2Pd2_129_5951.vasp,Fe2Sb2Pd2,-1.016489118333333,1.0465125972222205 -Br8O16_14_2715.vasp,Br8O16,-1.89525323875,0.3407009287499984 -Ni2S4_4_13596.vasp,Ni2S4,-1.7953347616666668,0.0482758287499978 -Tl1Cu1As2Se6_149_19251.vasp,Tl1Cu1As2Se6,-1.708860685,0.2863626816805513 -Ca4Al2Pb2F18_2_3204.vasp,Ca4Al2Pb2F18,-3.6289755565384616,0.0328872680769157 -Hg3Se1O6_5_8067.vasp,Hg3Se1O6,-1.7584764979999998,0.150742857291666 -Ca2P2O8_13_3089.vasp,Ca2P2O8,-5.141347634166666,0.2870242540624956 -Cs2Hg4Te2I6O6_31_4744.vasp,Cs2Hg4Te2I6O6,-1.0566542405,0.1693885453749968 -As1Pd1O3_1_1162.vasp,As1Pd1O3,-3.182912698,0.5377888362499954 -K2H6Pd1O6_147_9153.vasp,K2H6Pd1O6,-3.5939257586666664,0.051385538666667 -Na2Ti2C2I2_59_12324.vasp,Na2Ti2C2I2,-4.0141405125,-0.0185775625 -Ta4C3Cl2_164_18011.vasp,Ta4C3Cl2,-6.874904247777778,0.0079486099999963 -Hf1Bi2S1I2_38_7121.vasp,Hf1Bi2S1I2,-2.09896004,0.1724075529166651 -Tl4N4_14_19611.vasp,Tl4N4,-1.92447983375,0.7362365175000002 -As6Pb6_2_1388.vasp,As6Pb6,-1.7306429558333332,0.3876422616666668 -W2I2O2_59_20499.vasp,W2I2O2,-3.432548465,0.7366466958474991 -P4O8_156_14095.vasp,P4O8,-4.733527621666666,0.6600325506666639 -Tc4F10_13_18247.vasp,Tc4F10,-3.7269416385714287,0.2120497048214246 -Co2As2S5_8_3845.vasp,Co2As2S5,-2.7141898066666665,0.5417744477339151 -Os3S4_164_13892.vasp,Os3S4,-3.905044238571429,0.6202633249999945 -Al2S2Cl2_59_936.vasp,Al2S2Cl2,-3.0312099666666668,0.0189604683333333 -Ba2P4S12_2_2046.vasp,Ba2P4S12,-3.2458106166666667,0.1122300235763827 -Ca2Sn4H12_2_3130.vasp,Ca2Sn4H12,-2.4342601966666666,0.0358114238888868 -Na2Cu2Se2_129_12069.vasp,Na2Cu2Se2,-1.1644119066666667,0.1206245966666665 -Ge2Se4_12_6876.vasp,Ge2Se4,-2.2521602583333333,0.3519726188888885 -As2Br10_51_1191.vasp,As2Br10,-0.4225096591666666,0.354934459166666 -Na1Be2F6_164_11827.vasp,Na1Be2F6,-3.258777297777778,0.1882808643749971 -K2Zr1H6S6_147_9397.vasp,K2Zr1H6S6,-3.1462616393333334,0.0422928588333333 -Eu1Sn3_187_5596.vasp,Eu1Sn3,-1.1327035525,-0.7398453 -V2P2O10_85_20135.vasp,V2P2O10,-5.594324065714285,0.0933629450000008 -Pb6S2O12_51_14335.vasp,Pb6S2O12,-3.8112241655,0.1130765404375006 -Na8Fe4O8_13_12449.vasp,Na8Fe4O8,-2.866162247,0.1898536409999975 -Mg2_65_10541.vasp,Mg2,1.026346595,0.6120981866666666 -Sb4O6_7_15787.vasp,Sb4O6,-4.216192805,0.0412976624999998 -V1Se2_10_19929.vasp,V1Se2,-2.6219688766666667,0.5246348416666664 -Li2Sn1H6O6_147_10068.vasp,Li2Sn1H6O6,-4.270107032666667,0.0796216081333336 -Ca3Co2O6_1_3162.vasp,Ca3Co2O6,-3.813795806363636,0.2717754640909029 -Na2Br2O6_11_11994.vasp,Na2Br2O6,-2.520826816,0.1272825539999997 -Ag1Bi1As2Se6_143_22.vasp,Ag1Bi1As2Se6,-1.866954755,0.7863794729166614 -Ru1I2O1_47_15271.vasp,Ru1I2O1,-1.97307841,0.143770782109375 -Ta1B2Ir3Pd2C1Se3S1I1Cl2_1_17508.vasp,Ta1B2Ir3Pd2C1Se3S1I1Cl2,-3.17709738375,0.2437379927597219 -Sn2As2C2S6F6_7_16715.vasp,Sn2As2C2S6F6,-2.9275540538888887,0.5713811251003026 -Cu1S1_156_4955.vasp,Cu1S1,-0.84972679,0.5126769216666668 -Hg12Sb4As4S12_14_7832.vasp,Hg12Sb4As4S12,-0.803707976875,0.0962696522737069 -Co2O2_187_3946.vasp,Co2O2,-3.25069753,-0.2835297799999998 -P4S6_11_14115.vasp,P4S6,-3.185874322,0.1993758694062468 -Zn2W2O5_6_21192.vasp,Zn2W2O5,-3.972327762222222,0.328283291088431 -H4Au2C4S8_2_7055.vasp,H4Au2C4S8,-3.382656491111111,0.3191779964583238 -Ag2Ge2S6_51_264.vasp,Ag2Ge2S6,-2.15826302,0.1584408062499975 -Bi2C2O4_59_2439.vasp,Bi2C2O4,-3.5571289,1.537321423125 -Sb2Mo1_187_15601.vasp,Sb2Mo1,-2.368040893333333,0.394552259523806 -Al4Te4Cl4_14_1101.vasp,Al4Te4Cl4,-2.1728441591666665,0.0550884675 -Ga2Cl2_129_6319.vasp,Ga2Cl2,-1.4179160375,0.14833656125 -Nb3Cl8_156_12968.vasp,Nb3Cl8,-3.1038084354545457,0.070709678636363 -Te3As4Au2Cl2_6_18544.vasp,Te3As4Au2Cl2,-1.314643224545455,0.1722749376893927 -Hg2Te2_129_8034.vasp,Hg2Te2,0.7284278625,0.2524608408333333 -Ca1Zn1S1I1Cl1O1_1_2899.vasp,Ca1Zn1S1I1Cl1O1,-1.97063504,0.2109655811354166 -As2Pd2S5_8_1268.vasp,As2Pd2S5,-2.4073957622222224,0.4391793096111079 -Tl2O4_12_19475.vasp,Tl2O4,-2.1051837066666668,0.7128145747916634 -Co2Bi4S6Br4_2_3872.vasp,Co2Bi4S6Br4,-1.894544606875,0.1695862290104138 -Tl2Zn1Te4_156_19567.vasp,Tl2Zn1Te4,-0.4651279671428571,0.2753739685714283 -Hf2Sb2O6_162_7585.vasp,Hf2Sb2O6,-5.956567229,0.2873304039999985 -In1Au1F4_3_8194.vasp,In1Au1F4,-1.651225635,0.4176373818518495 -Ti1Sb1P1_156_18843.vasp,Ti1Sb1P1,-4.222767733333334,0.7421253041666614 -Si1N2F6_164_16348.vasp,Si1N2F6,-2.4734114711111115,1.1146203520370332 -Ge1I4_123_6675.vasp,Ge1I4,-0.145348842,0.45157707175 -Ca3Ag2Cl2O4_123_3143.vasp,Ca3Ag2Cl2O4,-2.72857936,-0.0283922249521588 -Cd1Pb2Br2O2_12_3389.vasp,Cd1Pb2Br2O2,-1.933643257142857,0.0801790271428573 -Mo2Br2Cl2O2_35_11569.vasp,Mo2Br2Cl2O2,-2.84654993125,0.0307856924999998 -Ta2Ge2P2_129_17741.vasp,Ta2Ge2P2,-5.058578266666667,0.1386634549999943 -Nb2I2O4_11_12746.vasp,Nb2I2O4,-5.216415565,-0.0726006523437501 -Li1Pd1S1F1_1_9778.vasp,Li1Pd1S1F1,-2.534851415,0.1009350875000001 -Co1H4C2I2N6_6_3748.vasp,Co1H4C2I2N6,-4.263794942,0.2488231748333219 -Mg2Cr4O10_59_10446.vasp,Mg2Cr4O10,-4.755160929375,0.0177492282812502 -Hg1I1O1F1_156_7878.vasp,Hg1I1O1F1,-0.1374795525,0.6876812671875 -K2Ni2Sb2_12_9270.vasp,K2Ni2Sb2,-0.3209225583333333,0.1277862407142853 -V2C1O2_164_20019.vasp,V2C1O2,-5.765570874,0.0916510703434285 -V2B1F2_164_19987.vasp,V2B1F2,-4.070502094,-0.046806998666671 -Tl4Pd2C8N8_53_19617.vasp,Tl4Pd2C8N8,-5.21174974,-0.0221565148484935 -Y4Te6_1_20840.vasp,Y4Te6,-3.4783715280000003,0.4117146489999994 -Ga2Ni2Se5_164_6409.vasp,Ga2Ni2Se5,-1.6898678366666666,-0.0304633583333352 -Bi2Sb2O6_7_2525.vasp,Bi2Sb2O6,-3.976135061,0.0498217113636301 -Al1In1Hg1Te4_156_679.vasp,Al1In1Hg1Te4,-1.0315081157142856,0.1726464928571429 -Bi1Te2H1S6_1_2404.vasp,Bi1Te2H1S6,-2.282257131,-0.0726100927916693 -Ni1B4H4C2F2_47_13270.vasp,Ni1B4H4C2F2,-3.9737550076923074,0.7507202330875905 -Li2As2O6_162_9825.vasp,Li2As2O6,-4.473739113,0.0714136690000009 -Ag2Te4_6_485.vasp,Ag2Te4,-0.52713412,0.2352160941666666 -Rb2C2Se2O6F6_4_14795.vasp,Rb2C2Se2O6F6,-3.2849892944444448,0.4571797115740704 -Na2Mg1H4O10_2_12187.vasp,Na2Mg1H4O10,-3.5168963352941174,0.127890678284304 -Ce2Se6_129_3681.vasp,Ce2Se6,-3.2559215525,0.1720713652083332 -Rb2H2N2O6_4_14846.vasp,Rb2H2N2O6,-3.8209560375,0.3413875829444364 -K3Mo2Cl9_174_9403.vasp,K3Mo2Cl9,-1.7168841321428572,0.1037899659523793 -Ge4O10_30_6932.vasp,Ge4O10,-4.263735716428571,0.4026867266071397 -Cr1I1Cl1_156_4197.vasp,Cr1I1Cl1,-1.1704822933333332,0.4468501499999986 -Nb2I2O1_8_12744.vasp,Nb2I2O1,-3.765418536,0.2597606623333273 -Te1Au2_191_18290.vasp,Te1Au2,0.50064103,1.285509691666666 -Tl3Co1_187_19574.vasp,Tl3Co1,0.3236878125,0.5831741450000001 -Hf3C2S2_187_7696.vasp,Hf3C2S2,-6.681944904285714,0.1519762071428447 -Co2P2Se5_8_3965.vasp,Co2P2Se5,-2.4719987477777776,0.4030243111111088 -Cu2Sb2S6_162_5267.vasp,Cu2Sb2S6,-1.79395515,0.4304085792499978 -Ta6Se18_11_18151.vasp,Ta6Se18,-3.9763732104166665,0.0734355052083333 -Hf4Se4Cl4_31_7815.vasp,Hf4Se4Cl4,-3.9652930825,0.0578991981249967 -Rh2S2Br2_11_15214.vasp,Rh2S2Br2,-2.114601131666667,0.0606419499999999 -Li1Sb2Pd1Se6_5_9784.vasp,Li1Sb2Pd1Se6,-1.976075722,0.2765353856666648 -K2H6C4O6_2_9142.vasp,K2H6C4O6,-4.873905146666667,0.1317607385416599 -Ba5Y1_1_2204.vasp,Ba5Y1,-0.0958195266666666,0.9326062124999972 -Sm2N2O10_4_16579.vasp,Sm2N2O10,-5.009450849285714,0.0483793398214209 -Zr1Mo2S8_164_21332.vasp,Zr1Mo2S8,-3.2545850081818184,0.6154606303977206 -Nb2Cl2_164_12679.vasp,Nb2Cl2,-4.010819685,0.2015583180357085 -Na2V4O10_11_12334.vasp,Na2V4O10,-5.144109976875,0.1276786887499947 -Mn3I2O2_1_11392.vasp,Mn3I2O2,-2.4881011714285712,0.2299275294827576 -Li2Ag1_187_9819.vasp,Li2Ag1,-0.6495167666666667,0.6348151191666653 -In1Ni1S1Br2Cl1_1_8282.vasp,In1Ni1S1Br2Cl1,-1.1057060066666666,0.1261399890277766 -Mo2C2F2_59_11589.vasp,Mo2C2F2,-4.35848349,0.3780441797222174 -Tl1H2O2_164_19281.vasp,Tl1H2O2,-3.360849118,0.186047685083331 -Fe2Te4O12_2_6014.vasp,Fe2Te4O12,-3.6001707488888885,0.1733722772916668 -Ir2S2_187_8822.vasp,Ir2S2,-3.1354349725,0.6970915858333289 -Ag2F2_129_253.vasp,Ag2F2,-0.3050961025,0.4409510524999999 -Mn1Sb2F12_2_10869.vasp,Mn1Sb2F12,-2.5637229346666666,0.0226817386666668 -Bi2Br2_2_2434.vasp,Bi2Br2,-0.8612088,-0.0446970241666674 -Ta2Cl4O4_12_17694.vasp,Ta2Cl4O4,-4.196596022,0.5914722284999949 -Zn2W2F10_13_21191.vasp,Zn2W2F10,-2.555243741428572,0.3432121430357101 -Ca4Fe2Cl2O6_129_3214.vasp,Ca4Fe2Cl2O6,-3.825565152142857,-0.0649203535714322 -Cr3H2N2O2_187_4556.vasp,Cr3H2N2O2,-4.807750906666667,0.0189749246296252 -Tl2Cu2H2S2O10_11_19402.vasp,Tl2Cu2H2S2O10,-3.5276545033333333,0.131044532249993 -Cd1H1Cl1O1_156_3327.vasp,Cd1H1Cl1O1,-2.0856989775,0.1282795775000003 -Zr1Al5Ni2_123_21242.vasp,Zr1Al5Ni2,-1.83507200875,0.6198940949999998 -Sc1Nb2S1Br1N2Cl1_25_15965.vasp,Sc1Nb2S1Br1N2Cl1,-5.18963479625,0.332476690208325 -Al1Ge1Te3_143_668.vasp,Al1Ge1Te3,-1.66219347,0.166659513812498 -Ni4F8_14_13745.vasp,Ni4F8,-1.5123435374999998,-0.2407977491666666 -Mn1Nb1Cu1S2Br2_1_10804.vasp,Mn1Nb1Cu1S2Br2,-2.403512117142857,0.4103713887165138 -K4Ru2N2Cl10O2_31_9500.vasp,K4Ru2N2Cl10O2,-2.3703452625,0.055909068 -Y1Sb2_21_20669.vasp,Y1Sb2,-3.01821848,0.2628557741666637 -Te6As4_11_18649.vasp,Te6As4,-1.983491219,0.129984192 -Ga1Te4_8_6295.vasp,Ga1Te4,-1.2221693139999998,0.5409205680000004 -In2I6_162_8481.vasp,In2I6,-0.34702359125,0.0464928025 -Nb2Si2P2_129_12891.vasp,Nb2Si2P2,-5.233323478333333,0.3595734783333331 -Os1O2_115_13808.vasp,Os1O2,-4.294550563333334,1.2082274433333329 -Ta3N2O2_187_17969.vasp,Ta3N2O2,-7.729164398571428,0.3841197123809379 -Sr3Mn2S5Cl2_123_17387.vasp,Sr3Mn2S5Cl2,-2.7294065166666663,0.1327556941666641 -Ta6Sn2Se12_26_18157.vasp,Ta6Sn2Se12,-4.1571040255,0.1741225664999961 -Mg2Ni3O8_10_10492.vasp,Mg2Ni3O8,-3.1079268192307694,-0.2883408900961601 -Os1Ru1Cl6_5_13813.vasp,Os1Ru1Cl6,-1.82209321375,0.0437436720312499 -Co1H4C4N2F2_47_3756.vasp,Co1H4C4N2F2,-5.112781053846154,0.1997844633653678 -Sr2S8I4_125_17307.vasp,Sr2S8I4,-1.65491603,0.3921795805952361 -V2As2S6_2_19981.vasp,V2As2S6,-3.326477205,0.1304580823749974 -Co1Ni3Se1I3_1_3799.vasp,Co1Ni3Se1I3,0.05536264,0.1485269264204541 -Ga1Br2_115_6143.vasp,Ga1Br2,-0.98223743,0.3244826991666668 -Te4Au2Cl2_1_18566.vasp,Te4Au2Cl2,-0.49695617875,0.21765079375 -Co4As4S4_29_4076.vasp,Co4As4S4,-2.6471899675,0.6287506241666665 -Mg2Bi4_12_10432.vasp,Mg2Bi4,-0.8444838183333333,-0.1535820127777783 -P6Pd3_157_14142.vasp,P6Pd3,-2.707502626666667,0.7810597383333331 -V2Te2I2_59_20208.vasp,V2Te2I2,-1.60444021,0.2785143599999984 -Na4B1O4_38_12365.vasp,Na4B1O4,-3.799401985555556,0.3732465115740703 -Ti1Cu2S4_111_18774.vasp,Ti1Cu2S4,-2.6675509642857143,0.2430067040178515 -Rb2C4O6F6_2_14798.vasp,Rb2C4O6F6,-4.399620237222222,-0.0662496627777803 -Hf2B1Se2_164_7440.vasp,Hf2B1Se2,-5.265795558,-0.0921603629999989 -Nb1F2_187_12506.vasp,Nb1F2,-4.08361634,0.5665061166666618 -Ta1Br5_10_17522.vasp,Ta1Br5,-1.7765615,0.3779043700000002 -Te2Pt2_164_18490.vasp,Te2Pt2,-1.71834492,0.1792086499999998 -Si6Bi6_2_16527.vasp,Si6Bi6,-2.477447093333333,-0.7489385708333332 -Ta4Fe8Te8_59_18044.vasp,Ta4Fe8Te8,-2.498285613,-0.0351922878888903 -Cr2O2_6_4438.vasp,Cr2O2,-3.803523075,1.321775924999995 -As18F4_11_1130.vasp,As18F4,-2.998864046363636,0.1224059534848458 -Te2Mo2Br2_59_18404.vasp,Te2Mo2Br2,-1.693088615,0.2938494820833333 -Li1Fe2O1F5_8_9701.vasp,Li1Fe2O1F5,-2.8422079355555554,0.1301439198611081 -Fe1I2_187_5717.vasp,Fe1I2,0.00321103,0.0049058541666666 -Ca2Ag1Te2F2_38_2918.vasp,Ca2Ag1Te2F2,-1.6502771585714286,0.5664523308333296 -Sc4H2N3O2_164_16242.vasp,Sc4H2N3O2,-5.910236672727273,-0.5035083481818283 -Li2U1O4_123_10103.vasp,Li2U1O4,-5.487869147142858,0.888170975714285 -Fe2I6_189_5867.vasp,Fe2I6,0.15045374375,0.401068793125 -Sc1Te2_115_16015.vasp,Sc1Te2,-2.165607593333333,0.6627542819444427 -Sr3Co2S5Cl2_123_17363.vasp,Sr3Co2S5Cl2,-2.6280541008333334,0.1755956619791639 -Si2Sb2Se6_12_16441.vasp,Si2Sb2Se6,-2.490401513,0.3239646386249981 -Cr2Te2F2_59_4520.vasp,Cr2Te2F2,-2.311207955,0.1587035849999947 -Nb3I2N2_6_12979.vasp,Nb3I2N2,-5.183645494285714,0.1609859790476094 -Pd2Se2_129_14492.vasp,Pd2Se2,-1.26071987,0.4661358424999999 -Mg1Te2F2_8_10408.vasp,Mg1Te2F2,-1.41800385,1.0830858556666665 -Bi1Te2_164_2410.vasp,Bi1Te2,-1.2223686966666667,0.3457238744444428 -Mn2Bi1Sb1Se1I1Br1_1_10998.vasp,Mn2Bi1Sb1Se1I1Br1,-1.40341259,0.1212722641071405 -Cu1F1_156_4873.vasp,Cu1F1,-0.55082554,0.8190767800000001 -Os1O1F2_47_13807.vasp,Os1O1F2,-3.5343870675,0.1223799537499895 -Tl4Se4Cl4_14_19626.vasp,Tl4Se4Cl4,-1.0385016925,0.3491596986111099 -V2Te4Pd1_164_20218.vasp,V2Te4Pd1,-2.064181724285714,0.0630487398412675 -Y1Mg2_187_20646.vasp,Y1Mg2,-1.03230472,0.3307092333333321 -Yb2Se2I2_59_20887.vasp,Yb2Se2I2,-2.856548848333333,-0.5864664894444467 -Fe2As2S7_6_5785.vasp,Fe2As2S7,-2.4273599790909093,0.2284791238636334 -Mn1Au1Se1S1I2_25_10643.vasp,Mn1Au1Se1S1I2,-0.9203235383333334,0.2597673189930524 -Zr1Ta1Pd1Pt1S3Br4N1_1_21450.vasp,Zr1Ta1Pd1Pt1S3Br4N1,-3.141717188333333,0.2041881533333238 -Pb2F8_7_14246.vasp,Pb2F8,-1.936906511,-0.005121179 -Ni2P1Se2_187_13556.vasp,Ni2P1Se2,-1.631461706,0.1699077660833303 -Re2Se2_129_15081.vasp,Re2Se2,-4.496875155,0.5494500587500006 -Sr4Cu4Sn2O14_26_17429.vasp,Sr4Cu4Sn2O14,-3.372777155833333,0.2961605716666631 -Nb1P2_187_12555.vasp,Nb1P2,-4.747876716666666,0.8484579000000005 -Ni3Se2S2Br1_8_13722.vasp,Ni3Se2S2Br1,-1.00211451,0.2556703359375 -Cr1Te2_115_4276.vasp,Cr1Te2,-1.56019932,0.3828468188888891 -Nb2S1I1Cl1_1_12833.vasp,Nb2S1I1Cl1,-3.565683978,0.2344350372777703 -Ba1B2Se6_12_1806.vasp,Ba1B2Se6,-3.0905884766666665,0.1042704977777781 -H2W2N1_164_7034.vasp,H2W2N1,-4.962131996,-1.9671025092222263 -Ga2N6_164_6397.vasp,Ga2N6,-4.87522637125,0.392159205 -Pt2I4_2_14634.vasp,Pt2I4,-0.22032894,0.295026645 -Cu4S1O10_1_5442.vasp,Cu4S1O10,-2.67563252,0.4369396019999969 -Si6Cl16_1_16529.vasp,Si6Cl16,-2.0512422731818183,0.2201936004545424 -Ca2Ge4H12_2_3024.vasp,Ca2Ge4H12,-2.902042905555556,0.63033962833333 -Sr3Mn2I2O5_123_17385.vasp,Sr3Mn2I2O5,-3.642648049166666,0.0119296347222221 -In3Os2_123_8650.vasp,In3Os2,-2.132434184,1.741300852 -Pt2F4_2_14622.vasp,Pt2F4,-1.4341014533333334,0.3834994791666639 -Bi1Pd1_187_2357.vasp,Bi1Pd1,-0.418091255,0.9155971225 -Na1Ti2H1O5_1_11946.vasp,Na1Ti2H1O5,-5.970853475555555,0.1552037733399429 -Ba3Fe2I2O5_123_2107.vasp,Ba3Fe2I2O5,-3.321402138333333,0.0644437337499972 -Cu4S16Br4N16_14_5441.vasp,Cu4S16Br4N16,-3.40188459925,-0.0967904183749991 -Sb4Te3Au2F2_6_15832.vasp,Sb4Te3Au2F2,-1.14538749,0.6098417706666646 -As4Pd4Se4_13_1352.vasp,As4Pd4Se4,-2.1883067825,0.3367374891666665 -Mg3As3_25_10542.vasp,Mg3As3,-1.61495793,0.5802677809999996 -P1Au3O4_156_13910.vasp,P1Au3O4,-2.41214010375,1.0234172437499995 -Ta2S2I2_59_17848.vasp,Ta2S2I2,-3.942378123333333,0.1116540477083303 -Ag1Te1Au1I1_6_138.vasp,Ag1Te1Au1I1,0.20161057,0.24219224125 -Ni1Br1Cl1_156_13284.vasp,Ni1Br1Cl1,-0.41192265,-0.2796251966666666 -Ag2O4F2_4_342.vasp,Ag2O4F2,-1.8128250575,0.106115685 -Na1Ni1As2S6_149_11911.vasp,Na1Ni1As2S6,-2.318507931,0.4714686742187477 -Bi10Te10_26_2295.vasp,Bi10Te10,-1.21894674,0.3008902599999998 -Mg2Fe2Sn2_129_10454.vasp,Mg2Fe2Sn2,-0.4092405416666667,0.1487790061111094 -Ti2Sb2O6_162_19012.vasp,Ti2Sb2O6,-5.687696398,0.2420176109999986 -V2Sb2S6_162_20173.vasp,V2Sb2S6,-3.092566923,0.2997657155 -Hf1Zr3Se8_1_7421.vasp,Hf1Zr3Se8,-3.9838849133333336,0.2656842831250001 -Rb1Ti1Te2_156_14762.vasp,Rb1Ti1Te2,-2.4238147925,0.2902905060344765 -B6Au1N6O2F4_6_1772.vasp,B6Au1N6O2F4,-5.296430684736842,0.5430846986549629 -Ti1Co1Se2I1Br1_6_18766.vasp,Ti1Co1Se2I1Br1,-2.5798584,0.0721571407777715 -Al4O6_164_1078.vasp,Al4O6,-5.936654771,0.1868800669999997 -Na2Hg4S8F6_31_12160.vasp,Na2Hg4S8F6,-1.147641121,0.3184399478229158 -K2Na2Os2N2O4F10_59_9251.vasp,K2Na2Os2N2O4F10,-3.0260343595454544,0.26353808460858 -H4Pb2O4_31_7068.vasp,H4Pb2O4,-3.728461156,0.1116982350416653 -H2C4O4_6_6994.vasp,H2C4O4,-5.760882327,0.3474053880833336 -K2Cl2O4_51_9077.vasp,K2Cl2O4,-1.96973345125,0.42198625875 -B2H2Pb4O8_12_1670.vasp,B2H2Pb4O8,-4.56908416875,0.1388003806249997 -Ir4C12_127_8860.vasp,Ir4C12,-5.353431600625,2.036617181875 -Ag1I1_156_82.vasp,Ag1I1,0.6004717,0.252998395 -Fe1Rh1Se2_156_5740.vasp,Fe1Rh1Se2,-1.532489655,0.6964041759374999 -Sc6N4Cl6_1_16274.vasp,Sc6N4Cl6,-4.558734508125,-0.0224148537499999 -Mg3Si1_99_10562.vasp,Mg3Si1,-0.704635585,-0.0559408245833333 -Ga1Sb2Au1Se6_149_6267.vasp,Ga1Sb2Au1Se6,-1.688809463,0.3296224299166642 -Mn1Zn1I1Br1O1_6_10941.vasp,Mn1Zn1I1Br1O1,-1.285938134,0.19810750975 -P4O8_11_14094.vasp,P4O8,-4.924431731666666,0.4691284406666639 -Ag2Te6P2_147_487.vasp,Ag2Te6P2,-1.266370876,0.3342379724242402 -Sc1Br2_123_15912.vasp,Sc1Br2,-2.14518793,0.2425253883333309 -Rb2Ru2N2Cl8O4_7_14928.vasp,Rb2Ru2N2Cl8O4,-2.4566561944444443,0.2060043868055462 -Ca1Au2O8_89_2803.vasp,Ca1Au2O8,-2.6719258336363634,0.337176630909088 -Cd2H4S2O8_31_3512.vasp,Cd2H4S2O8,-3.633405934375,0.0908352574479173 -Ge2P2C2O6F6_7_6799.vasp,Ge2P2C2O6F6,-4.4424136488888895,0.2794666238888765 -Ag1Pd1Br1Cl5_1_101.vasp,Ag1Pd1Br1Cl5,-0.33201439,0.1357338061458333 -B4Te6_1_1769.vasp,B4Te6,-2.75386092,0.6536046533333334 -Li2H6Pd1O6_147_9950.vasp,Li2H6Pd1O6,-3.990798639333333,0.0793805998333339 -P2Br8_2_13965.vasp,P2Br8,-0.966103201,0.0989636597499979 -Ta1Mn1I1Cl3O2_8_17563.vasp,Ta1Mn1I1Cl3O2,-3.46700093625,0.1258994127343695 -Mn2V1Br4O4_1_11333.vasp,Mn2V1Br4O4,-3.0922404645454544,-0.0110675200568237 -Rb2Nb8Br22_51_14903.vasp,Rb2Nb8Br22,-2.4412969609375,0.0869817809374997 -Ti2Te2C1_12_19036.vasp,Ti2Te2C1,-5.243863402000001,-0.3013482279999999 -Tm1Bi2_21_19660.vasp,Tm1Bi2,-1.6721122599999998,-0.3201501250000009 -Mn2Te2H4O8_7_11297.vasp,Mn2Te2H4O8,-3.998884208125,0.3666212917187503 -Hf1Zr1S3I1Cl2_8_7393.vasp,Hf1Zr1S3I1Cl2,-3.49094120625,0.2849573462239527 -Na1Ni1Te6As2_149_11920.vasp,Na1Ni1Te6As2,-1.396287025,0.2965109277499988 -Zr2Ti2Se8_6_21724.vasp,Zr2Ti2Se8,-4.0303488775,0.2509684704166668 -Li2Fe2Si2O8_11_9914.vasp,Li2Fe2Si2O8,-4.917226742142858,-0.0121326092857145 -Li1Co1Te6As2_5_9676.vasp,Li1Co1Te6As2,-1.833110544,-0.1743418913333358 -Na4Br2O1_123_12371.vasp,Na4Br2O1,-1.2161237828571427,0.8075282171428566 -Mn2B1Cl2_164_10991.vasp,Mn2B1Cl2,-2.546610442,0.3041614015000002 -Nb4Br16_14_13040.vasp,Nb4Br16,-1.8395840665,0.3020219484999997 -Sr2Br2_164_17152.vasp,Sr2Br2,-1.11307115,0.3489419150000001 -Ti2Br2N1O1_6_18896.vasp,Ti2Br2N1O1,-5.481141458333333,-0.0946000504166699 -Ga1C1_38_6146.vasp,Ga1C1,-3.4107931,1.1948190950000002 -H2Pd1O2_164_7009.vasp,H2Pd1O2,-3.283887186,0.355819164166667 -As4Au2Se3F2_6_1320.vasp,As4Au2Se3F2,-1.6714310372727277,0.5249432151298663 -V2H2N1O2_164_20075.vasp,V2H2N1O2,-5.07633346,0.0740284126190323 -Ca1Ag1I1Br1_6_2791.vasp,Ca1Ag1I1Br1,-0.399552015,0.61806140875 -Ta2Br10_51_17663.vasp,Ta2Br10,-1.7784837108333331,0.3759821591666668 -As2F6_31_1211.vasp,As2F6,-2.75144375125,0.0888432481249998 -Ba2Sn2F8_129_2061.vasp,Ba2Sn2F8,-3.2564739516666665,0.0296376525000003 -Ta4Te6_11_18133.vasp,Ta4Te6,-4.017868726,0.1602601440000004 -In2S2Cl2_59_8545.vasp,In2S2Cl2,-1.9865204416666664,0.0564866333333313 -Rb1I2_25_14741.vasp,Rb1I2,0.0247009366666666,0.3954795887499996 -Hf1Te1Br1O1_1_7316.vasp,Hf1Te1Br1O1,-4.3270939575,0.2577382681250002 -Hf1Ga1Se2_156_7168.vasp,Hf1Ga1Se2,-3.5683176425,0.2512708000000008 -Mn1Ge1Cl6_149_10734.vasp,Mn1Ge1Cl6,-1.620046315,0.0879536871874999 -Cu2Br2N2_59_5048.vasp,Cu2Br2N2,-1.3323520383333334,0.7653510324999977 -Ca1Cu2F12_115_2826.vasp,Ca1Cu2F12,-1.157732712,-0.0188749903333334 -U1B2O6_5_19694.vasp,U1B2O6,-7.143353713333334,0.0832438922222218 -Ru2S2Cl2_59_15338.vasp,Ru2S2Cl2,-2.631914468333333,0.2280096894444412 -Sm2S2I2_164_16581.vasp,Sm2S2I2,-3.3131950700000004,0.0448578033333331 -Si4Te4_29_16521.vasp,Si4Te4,-2.522820315,0.0028676162499996 -Te3P4Au2Cl2_6_18555.vasp,Te3P4Au2Cl2,-1.6063360354545453,0.370984676212117 -Rh2S4_11_15226.vasp,Rh2S4,-2.77503282,0.4057350833333306 -Zr2C1F2_164_21532.vasp,Zr2C1F2,-5.456399806,0.0924317999999999 -Hf2F2_129_7486.vasp,Hf2F2,-3.8812273925,1.4657037931250003 -Re1I2_115_15006.vasp,Re1I2,-1.3716939866666669,0.9740419129629606 -Li2Fe3O6_1_9916.vasp,Li2Fe3O6,-3.67636766,0.2971118548863602 -Cu4O4F4_14_5432.vasp,Cu4O4F4,-1.75294911,0.2793737020833313 -Nb4O12_11_13117.vasp,Nb4O12,-5.880988826875,0.1974347768750004 -Ce2Te6_129_3684.vasp,Ce2Te6,-2.573024475,-0.6289186275 -Ti1Mn2O6_12_18799.vasp,Ti1Mn2O6,-5.212843795555555,0.1849808649999951 -Li2Cu1As1_187_9878.vasp,Li2Cu1As1,-1.750729135,0.23360045625 -Hf2P1S2_164_7551.vasp,Hf2P1S2,-5.666528544,0.0909481085000005 -Cr2Se2S2_6_4498.vasp,Cr2Se2S2,-2.9090081383333337,0.3053519299999996 -Ti2Se2Cl2_59_19020.vasp,Ti2Se2Cl2,-4.036697213333333,-0.4648851095238171 -Hf1Ti1S1Cl3_1_7332.vasp,Hf1Ti1S1Cl3,-3.811023868333333,0.2111565906944394 -Hf4Se1S3I1Br3_3_7812.vasp,Hf4Se1S3I1Br3,-4.069305036666667,-0.0005564728125085 -V1Ag1Cl4_2_19751.vasp,V1Ag1Cl4,-1.4078361583333334,0.1233898458333317 -U2S6_59_19722.vasp,U2S6,-5.121380205,0.0603477649999995 -Sn2As2H2S6_7_16718.vasp,Sn2As2H2S6,-2.629208940833333,0.2459806736458307 -Cu1H6Pb4S2O14_2_4903.vasp,Cu1H6Pb4S2O14,-3.912106685185185,0.157174084907404 -Rh2I2_164_15197.vasp,Rh2I2,-0.6781099525,0.7603178424999988 -Sb2Pd3S8_164_15657.vasp,Sb2Pd3S8,-2.184932851538462,0.2879211103846106 -Co2As1S2_187_3840.vasp,Co2As1S2,-2.707905164,0.3538533124166644 -Ni2As1Se1S1_1_13443.vasp,Ni2As1Se1S1,-1.2249758160000002,0.5409778444166632 -Ho2S2Br2_59_8143.vasp,Ho2S2Br2,-3.5522941733333333,0.0348398383333332 -K2Pb2Br6O2_26_9295.vasp,K2Pb2Br6O2,-1.31793168,0.2432052047916639 -Be2Cl4_2_2248.vasp,Be2Cl4,-2.445757023333333,0.2042463899999997 -V2Mo1I1Br1O3_1_20102.vasp,V2Mo1I1Br1O3,-3.88533264125,0.0241694762499949 -Hf2S3Br2_1_7578.vasp,Hf2S3Br2,-4.126239581428572,0.2898892828571373 -Fe2Te6_11_6027.vasp,Fe2Te6,-1.0908955775,0.5232397979166665 -Si2S2_31_16436.vasp,Si2S2,-3.4776884125,0.1807657649999999 -Cr2Cu1O6_12_4360.vasp,Cr2Cu1O6,-4.152909294444445,-0.0183853034722267 -Cr3C2O2_187_4549.vasp,Cr3C2O2,-5.152390464285714,-0.1948236714826938 -Zr2Te1S1_6_21698.vasp,Zr2Te1S1,-4.01494699,-0.1992662100000004 -Rb3Mo2Br9_187_14958.vasp,Rb3Mo2Br9,-1.128970455,0.1414710494642844 -As2Os2O6_12_1233.vasp,As2Os2O6,-4.667402265,0.3458890194999948 -In2Fe2S5_187_8436.vasp,In2Fe2S5,-2.4918066511111108,-0.2084441805555574 -Al2Pd1Se4_164_930.vasp,Al2Pd1Se4,-2.5297352957142856,0.0726697578571415 -Ba2Mg2Pb2_129_2020.vasp,Ba2Mg2Pb2,0.2211526966666666,0.9823233666666666 -Nb3B2H2O2_187_12945.vasp,Nb3B2H2O2,-5.824145625555556,0.310525696388884 -Be2Sn4_12_2270.vasp,Be2Sn4,-1.5540022633333337,-2.5418986583333325 -Na2Sn2O2_129_12306.vasp,Na2Sn2O2,-2.546169895,0.3932718156944421 -Ti2H2N1O2_164_18947.vasp,Ti2H2N1O2,-6.267372317142857,-0.6271902136904846 -Ga2Cl6_26_6323.vasp,Ga2Cl6,-1.50338778625,0.1227950212499999 -Na2Cu1S2_12_12067.vasp,Na2Cu1S2,-1.484320664,0.0948729747499982 -Na2P2H14O12_5_12257.vasp,Na2P2H14O12,-4.451639970666666,0.0756100300972177 -Ti1Pd1Br2O1_1_18828.vasp,Ti1Pd1Br2O1,-3.193334832,0.4495518955000007 -Sr4Fe2S6Br2_129_17437.vasp,Sr4Fe2S6Br2,-2.589777084285714,-0.216527132500004 -Li1Ga1P2O6_5_9710.vasp,Li1Ga1P2O6,-5.024559941,0.226678579159995 -Nb3I8_156_12982.vasp,Nb3I8,-1.889805553636364,0.0984127436363635 -C4Se4_57_2771.vasp,C4Se4,-3.254739775,1.9574172066666664 -Cr4B3Cl2_164_4588.vasp,Cr4B3Cl2,-3.635349635555556,0.2038242901388854 -Fe2Sb2S4Cl2_26_5954.vasp,Fe2Sb2S4Cl2,-2.274588708,-0.2069129210000014 -Cs1Sn1S2_156_4650.vasp,Cs1Sn1S2,-1.73013966,0.4661649696875004 -Mn2Ge1Br6O1_8_11085.vasp,Mn2Ge1Br6O1,-1.788241317,0.0066228968125002 -Mn1Mo1Cl4O2_65_10792.vasp,Mn1Mo1Cl4O2,-2.78774216875,0.0240242849999998 -Ag4N4O12_14_533.vasp,Ag4N4O12,-3.422346262,0.0822125220000002 -Y7F10_2_20849.vasp,Y7F10,-4.589857223529412,0.4001814693137209 -V1Ge1Br1N1Cl1_6_19838.vasp,V1Ge1Br1N1Cl1,-3.171640502,0.3915805870000004 -Na2Ru2N2Cl8O4_7_12280.vasp,Na2Ru2N2Cl8O4,-2.667302818888889,0.09355113509259 -Ga2Hg1Se4_164_6384.vasp,Ga2Hg1Se4,-1.5901640442857143,0.180918674285714 -K2Ru2C2I8O4_31_9316.vasp,K2Ru2C2I8O4,-2.169808318888889,0.1823013933333315 -V2O2F2_164_20119.vasp,V2O2F2,-4.480808181666666,0.0303286794444406 -Ni2Ag1O4_187_13440.vasp,Ni2Ag1O4,-2.32901806,-0.4154803055357187 -Nb4Cr2O16_13_13064.vasp,Nb4Cr2O16,-5.974675091818182,-0.104490089431828 -Ca2S8Br4_125_3112.vasp,Ca2S8Br4,-1.7958202785714286,0.5273140339285695 -Hf2Se1S4_8_7601.vasp,Hf2Se1S4,-4.4532167157142855,0.5408653061904742 -Ag2B4H4I2N2_1_187.vasp,Ag2B4H4I2N2,-3.5049570314285714,0.4844059697142784 -Cr4S10_11_4621.vasp,Cr4S10,-2.981257000714286,0.3615378620535686 -Ni2Sb2Te4Br2_10_13615.vasp,Ni2Sb2Te4Br2,-0.8886377270000001,0.257557898571426 -Sb4S4O2_11_15815.vasp,Sb4S4O2,-3.178796793,0.1096954428333307 -Fe2Te4H2_2_6013.vasp,Fe2Te4H2,-1.66054044,0.76708843 -Li2Mg1Se2S8F4_2_9975.vasp,Li2Mg1Se2S8F4,-2.4904770141176478,0.3075641139215627 -Au2O2_10_1501.vasp,Au2O2,-1.1927465725,0.0147014 -Ni2Te2_123_13670.vasp,Ni2Te2,-0.3740912575,0.1889856674999995 -V1Br4_123_19790.vasp,V1Br4,-1.112371256,0.2854813160000002 -Ba2Br2_129_1927.vasp,Ba2Br2,-1.0299627025,0.73125217 -Ag1S2_115_112.vasp,Ag1S2,-1.085450026666667,0.4326642163541667 -Sb2Te6P2_8_15738.vasp,Sb2Te6P2,-1.875723932,0.3281638289999984 -Li2Rh1_187_10049.vasp,Li2Rh1,-1.6775212166666666,0.93185001 -Cu1As1I1N2Cl1_6_4835.vasp,Cu1As1I1N2Cl1,-2.286413521666667,0.3911970999999964 -Li2Mo1F6_65_10003.vasp,Li2Mo1F6,-3.311925897777778,0.1328671055555554 -Sn6N6_2_16991.vasp,Sn6N6,-3.5563226033333333,-2.093159034583333 -Zr2Te2C1_164_21701.vasp,Zr2Te2C1,-4.584927410000001,-0.0653465580000003 -Bi2Sb2_1_2532.vasp,Bi2Sb2,-1.575709015,0.1251389499999999 -Zr1P2O6F2_164_21392.vasp,Zr1P2O6F2,-5.644040231818182,0.0400526645454544 -Cr1Ag1Te3Se1Br1_1_4109.vasp,Cr1Ag1Te3Se1Br1,-1.0804518785714283,0.3099241655952369 -Nb4Ni2O10_59_13099.vasp,Nb4Ni2O10,-5.69694406,0.5479865829687505 -Y2N1O2_164_20760.vasp,Y2N1O2,-6.754626399999999,0.3849780049999873 -In4F4_57_8672.vasp,In4F4,-2.07168260625,0.3596573470833313 -Mo4N3Cl2_164_11748.vasp,Mo4N3Cl2,-4.297676388888889,0.2841342337036994 -Sr1Cu2O8_89_17043.vasp,Sr1Cu2O8,-2.8999573881818184,0.2638448077272695 -Hf2Se2_187_7608.vasp,Hf2Se2,-4.3925683325,0.1746464825 -K2Os2C2I8O4_31_9276.vasp,K2Os2C2I8O4,-2.454626721111111,0.3000430335416646 -Ga1Ag1Se2Cl2_6_6128.vasp,Ga1Ag1Se2Cl2,-1.18930686,0.3238858334722202 -Ni2O2_10_13548.vasp,Ni2O2,-1.988827315,-0.1629784699999998 -In4N4_127_8677.vasp,In4N4,-2.45213984125,1.58003203 -Al1Ni1Se2_1_693.vasp,Al1Ni1Se2,-1.85471692,0.0616304051190466 -Rh2Se2I2_59_15240.vasp,Rh2Se2I2,-1.6157439333333334,0.0899419069444427 -Ag4F8_13_513.vasp,Ag4F8,-0.6707998825,0.1646366191666666 -Te6W2_11_18686.vasp,Te6W2,-2.33385887625,0.3427610266666667 -U4Te10_10_19739.vasp,U4Te10,-3.8158925457142856,0.0484684378571431 -P1Pb2Se6_162_13932.vasp,P1Pb2Se6,-1.90492564,0.4468192906712941 -Al1Ag1P2O6_149_597.vasp,Al1Ag1P2O6,-4.729217082,0.439302058409091 -Mn2Al2Se5_187_10956.vasp,Mn2Al2Se5,-2.7905312588888886,-0.1432010741570903 -Rb2Cd4Se2S6Br6_31_14819.vasp,Rb2Cd4Se2S6Br6,-0.859099431,0.2886604163333308 -Na2H2Pd1_123_12102.vasp,Na2H2Pd1,-1.795966974,0.0494346800000002 -Ta4Cl16_14_18017.vasp,Ta4Cl16,-2.8540438795,0.1014496005000005 -Sc4C3_164_16234.vasp,Sc4C3,-5.162830257142857,0.2242705885714286 -K4Nb6Cl18_12_9483.vasp,K4Nb6Cl18,-2.765729827142857,0.0625774692857144 -Zr1Ni3Se6Br2_1_21383.vasp,Zr1Ni3Se6Br2,-1.6239998491666665,0.2053444114583305 -Mn3Hg2S8_10_11390.vasp,Mn3Hg2S8,-1.9599218407692307,0.4302670467307681 -Mo1O2_115_11525.vasp,Mo1O2,-4.737309826666666,0.574595285 -Nb2Co4Te6_11_12702.vasp,Nb2Co4Te6,-2.421633416666667,0.0951188790277752 -Ga2O3_1_6419.vasp,Ga2O3,-4.280094874,-0.2120105767500038 -C8O12_14_2782.vasp,C8O12,-6.079554219,0.3067643199999941 -Li1P3_10_9776.vasp,Li1P3,-3.04547017,0.722422456874996 -Nb1H4_123_12517.vasp,Nb1H4,-3.027244242,1.5089345400000007 -V1Cl1F1_156_19796.vasp,V1Cl1F1,-2.7483022233333334,0.062899442222218 -Sb4Pt4Se4_13_15811.vasp,Sb4Pt4Se4,-2.1641087591666666,0.4197103650000002 -Cr2Ni1Te4_164_4433.vasp,Cr2Ni1Te4,-1.541281607142857,0.0989562857142835 -Cu5Sn1As2S4I3Cl5_1_5491.vasp,Cu5Sn1As2S4I3Cl5,-1.0122119365,0.235602496292481 -K4Se4S8_13_9513.vasp,K4Se4S8,-1.899334510625,0.2315612761805515 -Ag4S4Cl4F4_14_546.vasp,Ag4S4Cl4F4,-0.9259954925,0.2675315948046874 -Tl4As20_26_19587.vasp,Tl4As20,-2.5522410591666667,0.1206386070833329 -Nb6Sn2S12_26_13200.vasp,Nb6Sn2S12,-4.3743212935,0.2637781434999997 -V4Te2_129_20374.vasp,V4Te2,-2.86620205,0.5320576533333334 -Ga1Os3S4Br4_8_6228.vasp,Ga1Os3S4Br4,-2.658789795833333,0.3690052662499983 -Al2Te2I14_7_1005.vasp,Al2Te2I14,-0.3689285666666666,0.1068574155555551 -Al4Bi8Te8Br4Cl16_13_1062.vasp,Al4Bi8Te8Br4Cl16,-1.68341090825,0.0994719600000002 -Tl4O6_7_19613.vasp,Tl4O6,-1.973172144,0.7369930345 -Nb2Mo2O11_164_12762.vasp,Nb2Mo2O11,-5.92488564,0.0534056813333325 -Pb2Br2F2_129_14217.vasp,Pb2Br2F2,-1.948402993333333,0.0998521599999999 -Mn1Ag1N2Cl2_6_10613.vasp,Mn1Ag1N2Cl2,-2.318614756666667,0.3033079216666652 -Nb2P2Se6_1_12809.vasp,Nb2P2Se6,-3.5520404020000003,0.2290552003749959 -Cu2H8C12S2N4Cl4_11_5140.vasp,Cu2H8C12S2N4Cl4,-4.90345590125,0.2803099178869028 -Ta1P2_164_17597.vasp,Ta1P2,-5.300660586666667,0.7007635416666664 -Ba1Al1Sn4O7_156_1802.vasp,Ba1Al1Sn4O7,-4.034059357692308,0.4294751767307645 -Mg1Al2S4_164_10334.vasp,Mg1Al2S4,-3.4504061871428573,0.1112737807142854 -Ti2H2N1_164_18948.vasp,Ti2H2N1,-6.021152584,-0.0456191679999995 -Zn1S1F1_1_21001.vasp,Zn1S1F1,-1.1767605833333332,0.4551296701458313 -Zr2Sc1S6Br1_1_21668.vasp,Zr2Sc1S6Br1,-4.031854818,0.219993412249996 -Tm1Ag1P2Se6_149_19657.vasp,Tm1Ag1P2Se6,-2.585338578,0.0707333315 -Pt1S2Cl6_2_14587.vasp,Pt1S2Cl6,-1.1184910177777778,0.0935782422222206 -Bi1Sb1I1Br1_1_2377.vasp,Bi1Sb1I1Br1,-0.9047723275,0.2529927429166634 -Ni1H4C6Cl2_47_13345.vasp,Ni1H4C6Cl2,-4.582598447692307,0.3435318999999929 -K1C1N1_1_8887.vasp,K1C1N1,-4.79292203,0.3141957966666604 -As1Br2_164_1136.vasp,As1Br2,-0.9547267333333332,0.4415370822222209 -Cd2P4O20_14_3532.vasp,Cd2P4O20,-3.985485010769231,0.4003995497115351 -H2Ru2_164_7027.vasp,H2Ru2,-2.967429165,1.544423685 -Ge3Cl2O5_1_6908.vasp,Ge3Cl2O5,-3.914273952,0.1630298275000008 -N12O24_1_11769.vasp,N12O24,-4.564734087222223,0.1383092486111099 -Ga1Ag1Sb2O6_5_6121.vasp,Ga1Ag1Sb2O6,-3.587051371,0.3590237661250006 -U2F6_59_19708.vasp,U2F6,-5.04422617125,0.3884290679166664 -W2O2_187_20519.vasp,W2O2,-5.47191048,0.983241138979586 -Ge2Cl6_1_6771.vasp,Ge2Cl6,-1.63552732625,0.136744553437498 -Ni1C4N2Cl2_47_13296.vasp,Ni1C4N2Cl2,-4.186587157777778,0.9599184335185134 -B2Te3_164_1716.vasp,B2Te3,-2.460706898,0.9467586753333334 -Te2As1_187_18350.vasp,Te2As1,-1.6685645833333334,0.3546292186111095 -K8Hg4S8_57_9554.vasp,K8Hg4S8,-0.8072655449999999,0.1804839815000001 -Sr2La2Br10_11_17269.vasp,Sr2La2Br10,-2.1908895685714285,0.0102933785714293 -Tl2Pd4O6_164_19486.vasp,Tl2Pd4O6,-2.4304022816666664,0.2187104116435141 -Mn3Si1S2_187_11411.vasp,Mn3Si1S2,-2.873475625,0.4425255669791603 -Ge3N4_156_6911.vasp,Ge3N4,-4.103092787142857,1.194988869285715 -Nb4Fe8Se8_59_13076.vasp,Nb4Fe8Se8,-2.6677710255,0.7576980830000006 -Sb1Mo1Cl1O5_1_15466.vasp,Sb1Mo1Cl1O5,-4.0711757075,0.1672966664999988 -Cr4C3O2_164_4596.vasp,Cr4C3O2,-5.203798528888889,-0.1195184491111158 -K2Hg4Se2Br6O6_31_9186.vasp,K2Hg4Se2Br6O6,-1.2898172730000002,0.0865457020000004 -Ca1In2N2_164_2853.vasp,Ca1In2N2,-3.1452292660000003,0.9355457459999998 -S3N2Cl2_1_15390.vasp,S3N2Cl2,-2.8834160814285714,0.3260327141964264 -Ca3Ni2S5I2_123_3196.vasp,Ca3Ni2S5I2,-1.8775044133333327,0.1261838280937456 -Tl2As6_164_19366.vasp,Tl2As6,-1.98667503625,0.3976848713749967 -Rb1Pb1O2_156_14747.vasp,Rb1Pb1O2,-2.4661944575,0.3954207764062477 -Al2Te2_2_1012.vasp,Al2Te2,-1.982257155,0.3234950324999999 -Zr1Ni1I1Br1N1_1_21377.vasp,Zr1Ni1I1Br1N1,-2.777871534,0.92289235 -Ni1Bi2_123_13282.vasp,Ni1Bi2,-0.4709419399999999,0.4142155283333333 -Mn2P2Se4F2_26_11200.vasp,Mn2P2Se4F2,-2.560246205,0.313704390935179 -As8O12_4_1397.vasp,As8O12,-4.405890584,0.0793469880000001 -As2Br6_162_1195.vasp,As2Br6,-1.113467425,0.0559312974999999 -Hf1Mo1I1Cl1O2_1_7233.vasp,Hf1Mo1I1Cl1O2,-4.451318635,0.3505885312500001 -Ge1Cl2_187_6660.vasp,Ge1Cl2,-1.8338565966666664,0.1333376400000001 -Cr3Mo1N2Cl4O2_1_4560.vasp,Cr3Mo1N2Cl4O2,-3.680454714166667,0.0784185756944406 -Co1B3_187_3698.vasp,Co1B3,-2.96653876,2.2923920966666667 -Y2H2N1_164_20741.vasp,Y2H2N1,-5.331211720000001,0.0108662759999997 -Zr2Br2Cl4_1_21517.vasp,Zr2Br2Cl4,-2.62864939875,0.1597263575 -Ga4P4_127_6561.vasp,Ga4P4,-2.50838638125,-0.3648614012499998 -Na2Ni1H4Se2O10_2_12233.vasp,Na2Ni1H4Se2O10,-3.610821853684211,0.0252015387280639 -Sb8S10Cl4_11_15875.vasp,Sb8S10Cl4,-2.3775424095454545,0.141114127272725 -Y2S2I2_164_20773.vasp,Y2S2I2,-3.940717426666666,0.0418342416666668 -Mn2Bi2Te4I2_10_11026.vasp,Mn2Bi2Te4I2,-1.165407209,0.2684602912758621 -Ru2I6_162_15325.vasp,Ru2I6,-0.7243517875,-0.1181209099999999 -Co2P1S2_187_3954.vasp,Co2P1S2,-2.991215182,0.3445839249166648 -In2Bi4Se8Br2_11_8384.vasp,In2Bi4Se8Br2,-1.7833141425,0.1079200518749997 -B1Sb1_187_1636.vasp,B1Sb1,-3.18256411,1.0397120754166669 -Hf1Ge1Se1S1I1Br1_6_7180.vasp,Hf1Ge1Se1S1I1Br1,-3.0783889183333333,0.1883287955555481 -Ge2Sb2H6C2S6_7_6846.vasp,Ge2Sb2H6C2S6,-3.5419808488888886,0.2172783126620267 -Y4S2N3F2_164_20834.vasp,Y4S2N3F2,-5.384648518181819,0.6739317405302918 -Zr2C1S2_164_21535.vasp,Zr2C1S2,-5.585249645999999,0.1322168279999944 -Li4P8W2O26_2_10217.vasp,Li4P8W2O26,-5.491210743,0.1277591113374909 -Ni2Sb2Br2O4_10_13604.vasp,Ni2Sb2Br2O4,-2.462440806,0.7307351882500002 -Cu2Cl4_127_5085.vasp,Cu2Cl4,-0.22963635,0.2595187533333333 -Ga2Sn2Te2_164_6496.vasp,Ga2Sn2Te2,-1.5538144033333332,-1.1341554211111111 -P2Rh2_129_14040.vasp,P2Rh2,-3.539735905,0.3971142883333332 -Sb1Pd2Se2_187_15484.vasp,Sb1Pd2Se2,-1.76505914,0.2804015095000003 -Hg4Mo2O8_13_8078.vasp,Hg4Mo2O8,-2.796526255,0.0737978442857145 -Ta2Fe4Se2S2_51_17733.vasp,Ta2Fe4Se2S2,-3.138604874,0.7643049533333308 -Hg1S2_164_7910.vasp,Hg1S2,-0.31207946,0.6980243797916658 -Mn3Ge1W2Se8_1_11382.vasp,Mn3Ge1W2Se8,-2.411843458571429,0.4530127445833283 -P2Pb2O6F2_7_14007.vasp,P2Pb2O6F2,-4.581762790833333,0.051909901458333 -Sn1Au1Br2N2F1_1_16603.vasp,Sn1Au1Br2N2F1,-1.8741991714285715,0.8053697452083262 -Ni2C8_1_13491.vasp,Ni2C8,-6.016636794,1.5880235340000002 -Tl4S6_1_19622.vasp,Tl4S6,-1.560037577,0.2401983277499977 -Pd1S2_164_14386.vasp,Pd1S2,-2.12479139,0.1930208141666667 -K4V4O4F16_14_9528.vasp,K4V4O4F16,-3.383119236428571,0.0473306264880886 -Li1Al1As2O6_5_9636.vasp,Li1Al1As2O6,-4.527642038,0.4113531763333243 -K2H4I6O2_7_9131.vasp,K2H4I6O2,-1.898690442857143,0.0471949608333308 -B6Pd1N2Cl2F4_25_1787.vasp,B6Pd1N2Cl2F4,-4.033325236,0.7076224107222138 -Na2Tb2Cl8_2_12313.vasp,Na2Tb2Cl8,-2.570500055833333,0.0821128424999977 -Mn2As2Se4Br2_10_10980.vasp,Mn2As2Se4Br2,-2.072614667,0.0834466099166643 -In18Te9_143_8175.vasp,In18Te9,-1.0359909603703703,0.7308794262962948 -Ta2F8_1_17725.vasp,Ta2F8,-4.348407971,0.1993852277999991 -Ta6Si2Te12_26_18155.vasp,Ta6Si2Te12,-3.785667059,0.074070587 -Na2C2O6F2_4_11998.vasp,Na2C2O6F2,-4.250341588333334,0.1386265810416634 -Te4Pd2F2_1_18614.vasp,Te4Pd2F2,-1.38339517125,0.3087574114062498 -Ni3Au1F8_2_13696.vasp,Ni3Au1F8,-1.2203816825,-0.0317606250000024 -Mo1Rh1Se3S1_6_11540.vasp,Mo1Rh1Se3S1,-2.771809505,0.2679087087499998 -Sr2C2S6Cl2_59_17162.vasp,Sr2C2S6Cl2,-3.2336362925,0.3076869922395744 -Ag1F2_164_52.vasp,Ag1F2,-0.5896743233333334,0.2457621783333332 -Ga2Fe2S5_187_6357.vasp,Ga2Fe2S5,-2.831293815555556,-0.3276662855555581 -Tl1Cu1P2S6_149_19253.vasp,Tl1Cu1P2S6,-2.5169868170000003,0.1520483507499996 -V1Sb2Te6Au1_149_19923.vasp,V1Sb2Te6Au1,-1.416560987,0.302491496833333 -Tl1Te2_115_19352.vasp,Tl1Te2,-0.53789085,0.5470987477777765 -Sn2As2O6F2_7_16721.vasp,Sn2As2O6F2,-3.818345845,0.2356924508333331 -Al2Te2Cl2_59_999.vasp,Al2Te2Cl2,-2.049885571666666,0.1780470549999999 -La5F8_1_9631.vasp,La5F8,-3.920396095384616,0.4116098238461506 -Sc1Ag1Sb2Te6_149_15894.vasp,Sc1Ag1Sb2Te6,-1.544924509,0.2855464436666652 -Ni2Se4F2_6_13648.vasp,Ni2Se4F2,-1.36580450875,0.2444306177083333 -W2O2_10_20520.vasp,W2O2,-5.265326035,1.189825583979586 -Sc2Te6As2_157_16185.vasp,Sc2Te6As2,-2.400550941,0.1960253140000003 -Bi2As2Se6_157_2421.vasp,Bi2As2Se6,-2.150534043,0.2041950305000002 -Sn2Sb2C2S6F6_7_16853.vasp,Sn2Sb2C2S6F6,-2.8054427938888886,0.6432404360416639 -Cr2H2C1O2_164_4394.vasp,Cr2H2C1O2,-4.658624868571429,0.1218238271428475 -Zn2H8Se2N4_4_21105.vasp,Zn2H8Se2N4,-3.606825223125,-3.145615881562501 -Zn1Pd3Se4S4_1_20995.vasp,Zn1Pd3Se4S4,-1.6646663375,0.2557221700729152 -Zn1Fe1I1Cl1O2_1_20928.vasp,Zn1Fe1I1Cl1O2,-1.775272855,0.2065769973515565 -Os2F2_164_13846.vasp,Os2F2,-3.4421373875,0.3643882328750001 -Mn2F6_12_11065.vasp,Mn2F6,-2.80607855375,-0.4618743274999999 -Bi2P4O14_2_2497.vasp,Bi2P4O14,-4.9687485425,0.2275681765624963 -Rh2Se4_11_15245.vasp,Rh2Se4,-2.3180725966666667,0.3555979099999997 -Cr2P4_2_4459.vasp,Cr2P4,-3.45428128,0.7559665749999995 -Sc2I2_164_16095.vasp,Sc2I2,-1.802615785,0.172292330833331 -Ca2Te2Au1I2_38_3134.vasp,Ca2Te2Au1I2,-0.8583316814285714,0.2767688527142836 -Ta4Ni2Te10_59_18067.vasp,Ta4Ni2Te10,-2.898083593125,0.061680028958331 -Ag2As4Cl2O3_6_162.vasp,Ag2As4Cl2O3,-2.428230959090909,0.2576498060606026 -Cu8H8C4O20_14_5501.vasp,Cu8H8C4O20,-3.8834378365,0.2557695923333309 -Ca1C2_164_2815.vasp,Ca1C2,-1.7982616666666666,3.780037931666661 -C1Br4_123_2723.vasp,C1Br4,-0.389046204,1.229046806 -Zr2Se2I1Br1_6_21675.vasp,Zr2Se2I1Br1,-3.20284715,0.0420239717361048 -V1C2O6_147_19792.vasp,V1C2O6,-5.910507398888889,0.111535994999995 -Pb4O4_57_14314.vasp,Pb4O4,-3.27556997875,-0.1344883190624999 -K2C2S6_2_9023.vasp,K2C2S6,-3.095327277,0.292969958 -Sr3Co2S5I2_123_17364.vasp,Sr3Co2S5I2,-2.3879535725000003,0.1372812125347191 -Zr2Cd2_129_21547.vasp,Zr2Cd2,-0.632046065,0.32072826 -Hf2Te2N1_164_7635.vasp,Hf2Te2N1,-5.2502650420000005,0.1761752600000004 -H2W3C2O2_187_7036.vasp,H2W3C2O2,-5.609385123333333,0.3308293701020298 -Y5Cl8_10_20842.vasp,Y5Cl8,-3.4781034607692307,0.1647808341666627 -N4O6_7_11794.vasp,N4O6,-4.684098266,0.1020157984999947 -H4Pd1C8Cl2_25_7079.vasp,H4Pd1C8Cl2,-5.0007015746666665,0.4639822622222165 -Hf2Zr1Pd1Br1Cl3O4_1_7666.vasp,Hf2Zr1Pd1Br1Cl3O4,-4.884916475,0.2596620431249979 -Cu2O4F2_4_5202.vasp,Cu2O4F2,-2.05628731625,0.3072457418749998 -Ta2Cu1Mo1I4O4_1_17717.vasp,Ta2Cu1Mo1I4O4,-3.623185374166667,0.3001476709722237 -Li1Co3O6_1_9679.vasp,Li1Co3O6,-3.896397425,-0.0396437342500057 -Te2P1_164_18434.vasp,Te2P1,-2.003877536666667,0.3926449627777757 -Ta12Br28_53_17498.vasp,Ta12Br28,-3.0541524737500003,0.0815590139999997 -Yb2Cu2Pb2Se6_51_20870.vasp,Yb2Cu2Pb2Se6,-2.287158045,-0.2587265785763906 -Mo2I8_1_11629.vasp,Mo2I8,-0.480930991,0.1823720387083338 -Ga2Co2S5_187_6331.vasp,Ga2Co2S5,-2.78570515,0.0551313682407381 -K2Te2H6N2O6_1_9373.vasp,K2Te2H6N2O6,-3.7921366672222216,0.0885834821759242 -Bi2Au2O4_26_2424.vasp,Bi2Au2O4,-2.22812306875,0.8853934959374976 -Fe2W2Se2O12_113_6038.vasp,Fe2W2Se2O12,-4.383940555555555,0.2016033189814776 -Bi2As2S6_157_2418.vasp,Bi2As2S6,-2.587788359,-0.1013299462500002 -V1Te4O12_1_19945.vasp,V1Te4O12,-3.8595265782352937,0.2082066880147025 -Ba4Mn2Cl2O6_129_2161.vasp,Ba4Mn2Cl2O6,-4.040983629285714,0.0258080417056633 -Ni2Ge8_50_13507.vasp,Ni2Ge8,-2.28385499,-0.2887960394999999 -Sc1Cu1Sb2O6_149_15927.vasp,Sc1Cu1Sb2O6,-4.208674485,0.5308595061249997 -Ba2Ag1P1_156_1884.vasp,Ba2Ag1P1,-1.07548945,0.3674120637500002 -In2Se2O8F2_11_8584.vasp,In2Se2O8F2,-3.1133542592857144,0.4047418758928541 -Ge1I2_164_6673.vasp,Ge1I2,-1.14041714,0.0784081166666665 -Cu2Bi2Se4_26_5043.vasp,Cu2Bi2Se4,-1.27488400125,0.1956482309374999 -Tb2Cl6_59_18190.vasp,Tb2Cl6,-2.912701935,0.02696516 -Cu1F2_164_4874.vasp,Cu1F2,-1.0446101333333333,0.2524552266666666 -Hf2Zr1Ti1Br8_1_7668.vasp,Hf2Zr1Ti1Br8,-2.922079485833333,0.2038883255555517 -Co2As2Pd2_129_3843.vasp,Co2As2Pd2,-1.9651632666666667,0.3787597999999998 -Ir2Pd2Se8_2_8807.vasp,Ir2Pd2Se8,-2.1824057975,-0.0816940454166664 -Ag2S4_6_395.vasp,Ag2S4,-1.2925010366666667,0.2256132063541667 -Na2Ti2C2F2_59_12323.vasp,Na2Ti2C2F2,-4.74995314125,0.04801320125 -Li1Al1Sb2Se6_5_9647.vasp,Li1Al1Sb2Se6,-2.291910661,0.3615557703333308 -Li1Fe2Sb1Br1Cl1O4_1_9702.vasp,Li1Fe2Sb1Br1Cl1O4,-3.155790081,0.209176415899996 -Al1Fe5Cl2_123_658.vasp,Al1Fe5Cl2,-0.87694718875,1.163840260416665 -Li6Te2S8F2_11_10281.vasp,Li6Te2S8F2,-2.600981911111111,0.2353398110416642 -Ti1Mo1N1Cl2O1_8_18802.vasp,Ti1Mo1N1Cl2O1,-4.707246845,0.1915565245833297 -Al2As2Se6_162_763.vasp,Al2As2Se6,-2.599809694,0.1795152085 -Zr4S4Cl4_31_21842.vasp,Zr4S4Cl4,-3.847683539166667,0.2006892074999999 -Te4O6F4_2_18599.vasp,Te4O6F4,-3.156481121428571,0.0945822085714289 -Cu2Se2_59_5306.vasp,Cu2Se2,-0.8028592225,0.1078129633333334 -Zr2Ge4_129_21574.vasp,Zr2Ge4,-3.736240773333333,0.4199009349999998 -Zr1Nb1I2O2_8_21346.vasp,Zr1Nb1I2O2,-4.349999736666667,0.4226464024999954 -Sr3Sb3_25_17398.vasp,Sr3Sb3,-0.9097222033333332,1.1639018733333335 -Tl2Ge2S6_162_19427.vasp,Tl2Ge2S6,-2.358140526,0.2496010226874974 -Cu2Cl2_156_5081.vasp,Cu2Cl2,-0.329806835,0.30633671875 -Fe2I2_164_5865.vasp,Fe2I2,0.0044064575,0.550644890625 -Li2Ti2C2Cl2_59_10091.vasp,Li2Ti2C2Cl2,-4.86759086125,0.2017074137499999 -V1Bi2_187_19782.vasp,V1Bi2,-1.6379697733333334,0.3029816766666651 -Nb1N1O1F1_8_12538.vasp,Nb1N1O1F1,-5.528425275,0.6437208277083215 -Mn1Sn1Se1Br2Cl2_1_10896.vasp,Mn1Sn1Se1Br2Cl2,-1.3308375914285713,0.2686439797619014 -Co2I2O2_59_3924.vasp,Co2I2O2,-2.2841507983333336,-0.382363472129631 -Sr4Se4O12_14_17475.vasp,Sr4Se4O12,-4.1205037465,0.1129972190000003 -Li2Nb1P2O8_2_10009.vasp,Li2Nb1P2O8,-5.488558846923078,0.3145434113076858 -Mn1Co1Br2O1_1_10667.vasp,Mn1Co1Br2O1,-2.11485975,0.1051359879999969 -Mo2F6_189_11608.vasp,Mo2F6,-2.94590235625,-0.1358671618749998 -Tb2Sb2S4O2_129_18207.vasp,Tb2Sb2S4O2,-4.344648832,-0.0031420595000045 -Ga2_51_6523.vasp,Ga2,-1.452439355,-0.3575403750000001 -K4C4N28_14_9419.vasp,K4C4N28,-5.958454201666666,-0.541119213101855 -Pb2O1_8_14261.vasp,Pb2O1,-2.109299036666666,0.4274841097916648 -Mn4I10_13_11440.vasp,Mn4I10,-0.37660124,0.192821608839286 -Nb2Te2_129_12913.vasp,Nb2Te2,-3.8986117225,-0.2659394916666711 -As4S6_4_1362.vasp,As4S6,-2.874147675,0.6453472534999998 -Al1S4_8_726.vasp,Al1S4,-2.624063976,0.5545253035625002 -Mn2Se1Br1Cl2_1_11266.vasp,Mn2Se1Br1Cl2,-1.7597037516666667,0.0326202810416667 -Ga4Se2S2_11_6570.vasp,Ga4Se2S2,-2.3297487825,0.30260768875 -Sr4As4S8Cl4_14_17405.vasp,Sr4As4S8Cl4,-2.8309598145,0.2461681097500002 -Zr3Tl2Cu2S8_12_21798.vasp,Zr3Tl2Cu2S8,-3.276698848,0.1253535951666666 -Na1In1P2O6_5_11885.vasp,Na1In1P2O6,-4.766991619000001,0.1987973739374934 -Co3Si1S2_187_4070.vasp,Co3Si1S2,-2.709334645,0.2630839020512757 -Na2Cd4Se2S6Cl6_31_12041.vasp,Na2Cd4Se2S6Cl6,-1.1138035135000002,0.3255608641249968 -Zr4S4Br4_7_21841.vasp,Zr4S4Br4,-3.612404863333333,0.1983192716666661 -Ag2Pt1C4O10_10_370.vasp,Ag2Pt1C4O10,-4.346842969411765,0.5736983302941163 -Te4I4_2_18590.vasp,Te4I4,-0.45639407875,0.12413343125 -Al2Te2Cl2_31_1000.vasp,Al2Te2Cl2,-2.1894343666666667,0.0384982599999998 -Cu6Bi2Te4Cl2O16_31_5494.vasp,Cu6Bi2Te4Cl2O16,-2.723935347333333,0.3114267084999966 -V1Ag1P2S6_5_19757.vasp,V1Ag1P2S6,-3.004764646,0.0575841107604178 -Zr1S2N1_156_21413.vasp,Zr1S2N1,-4.2692218075,0.8709522211249949 -Ti1Co1Pd1Se4_8_18762.vasp,Ti1Co1Pd1Se4,-2.797444182857143,0.2323863176080025 -Cu2Hg2S2Cl2_26_5155.vasp,Cu2Hg2S2Cl2,-0.26861704875,0.1317790158333334 -K4H2Br2O2_11_9452.vasp,K4H2Br2O2,-2.299994822,0.0990684459999999 -Ba4Te8As4H4_14_2194.vasp,Ba4Te8As4H4,-2.258484457,0.5835363713333306 -Sr4Co2Cl2O6_129_17416.vasp,Sr4Co2Cl2O6,-3.866941240714286,-0.1487738427381028 -B2Sb2_129_1708.vasp,B2Sb2,-3.2021344475,1.0201417379166664 -Ti8Se1S1N4Cl6_6_19186.vasp,Ti8Se1S1N4Cl6,-5.730877726,-0.3118536568250087 -Nb3Cl2O4F1_1_12966.vasp,Nb3Cl2O4F1,-5.37386464,0.2198594519583236 -Ti3Te2H2C2_6_19110.vasp,Ti3Te2H2C2,-5.088287042222222,0.2876671598148093 -Y2S1Cl2O1_1_20767.vasp,Y2S1Cl2O1,-4.74449339,0.3967336225000002 -Na2H16C10O10_2_12096.vasp,Na2H16C10O10,-5.097283741842105,0.168351958618405 -Mo1P2_187_11533.vasp,Mo1P2,-3.77225098,0.6610830733333333 -Ge2Br2N2_59_6753.vasp,Ge2Br2N2,-3.406036256666667,0.0915760522222168 -Mn3S4Br1_143_11402.vasp,Mn3S4Br1,-2.5550736375,0.2152657678124971 -Te4Pb4_57_18611.vasp,Te4Pb4,-1.184173375,-1.24494055 -Ni2Se2Br1Cl1_8_13629.vasp,Ni2Se2Br1Cl1,-0.7051979716666666,0.1028285116666667 -Ca2Ni1O3_38_3076.vasp,Ca2Ni1O3,-3.73296851,-0.2958376416666691 -Re2H2_164_15048.vasp,Re2H2,-5.1712254975,1.09165904 -V1Cu1S2_156_19816.vasp,V1Cu1S2,-2.49001805,0.531255308 -Mn1Bi1Sb1S1Br1_1_10648.vasp,Mn1Bi1Sb1S1Br1,-1.615066136,0.4803118343749983 -Te8Os6_11_18704.vasp,Te8Os6,-2.8405954778571427,-0.1120683464285763 -Mn4Cl10_13_11431.vasp,Mn4Cl10,-1.4739972035714286,0.1623776124999985 -U2Pb4_2_19719.vasp,U2Pb4,-3.08850733,0.5874315049999965 -Ca1Sn2_164_2888.vasp,Ca1Sn2,-0.61047525,0.1713015516666659 -Tl2O2F2_59_19467.vasp,Tl2O2F2,-2.1531217983333333,0.1940174374999999 -Re4O8_2_15111.vasp,Re4O8,-6.138368008333334,0.1087758775000002 -In2Co1O4_164_8407.vasp,In2Co1O4,-3.511416537142857,0.2211585144642827 -Ge1Sb1Br4_1_6702.vasp,Ge1Sb1Br4,-1.2253464766666666,0.2122771212499984 -Li4Mo4S8_2_10204.vasp,Li4Mo4S8,-3.430435344375,0.1360633840625003 -Fe2F6_162_5848.vasp,Fe2F6,-2.18083388375,-0.35709314125 -Mn2In2S5_164_11124.vasp,Mn2In2S5,-2.60270322,-0.0113327127777778 -In2C4F14_10_8398.vasp,In2C4F14,-3.057482027,0.4583851049999998 -Ca2Eu2Cu2Cl2O6_129_3011.vasp,Ca2Eu2Cu2Cl2O6,-4.101418597142858,-0.5608239495238176 -Pb1W1O4_3_14211.vasp,Pb1W1O4,-4.988406896666667,0.3725931124999997 -Fe2C1O2_164_5828.vasp,Fe2C1O2,-3.564143428,1.024261608000001 -V4Zn2O10_59_20380.vasp,V4Zn2O10,-4.49202400625,0.3169827256249995 -Re2Se2_164_15083.vasp,Re2Se2,-4.5331700825,0.5131551312500005 -I4_55_8163.vasp,I4,0.56219706,0.180926091875 -Ti2Bi4O10_59_18893.vasp,Ti2Bi4O10,-4.8802273275,0.3291319437499949 -Ga1Ag1I2_1_6114.vasp,Ga1Ag1I2,-0.2089515575,0.5132568528205114 -Hg3I6_143_8060.vasp,Hg3I6,0.9220475633333334,0.0491673061111112 -K10Ag4As6Se18_26_8872.vasp,K10Ag4As6Se18,-1.524267564736842,0.1548555305263159 -Sc1Cu1P2O6_149_15924.vasp,Sc1Cu1P2O6,-5.02019365,0.4277235397999921 -Cu2Sn2O6_51_5319.vasp,Cu2Sn2O6,-3.041264215,0.564582761249997 -Ni4Pb12_55_13754.vasp,Ni4Pb12,-0.339288146875,2.0463514431250003 -B4Br4_57_1748.vasp,B4Br4,-1.53330383125,1.7931098706944413 -Nb9Te18_12_13212.vasp,Nb9Te18,-3.300579958888889,0.0883404022222218 -Ca3Mn2S5I2_123_3189.vasp,Ca3Mn2S5I2,-2.3892985833333333,0.1771953578333303 -Ni2P2S6_162_13565.vasp,Ni2P2S6,-2.471123196,0.1396027102222169 -Ce1Se2_10_3653.vasp,Ce1Se2,-2.46393062,1.3373970858333335 -Hf3Ti1Se1S3Br4_1_7741.vasp,Hf3Ti1Se1S3Br4,-4.152988560833333,-0.0400830185416748 -N2F10_51_11782.vasp,N2F10,-0.5382247241666667,0.7916382614583333 -K2Fe1C4O4_21_9098.vasp,K2Fe1C4O4,-4.83833984,0.4838454690909018 -Cd2Cu2Se2Cl2_26_3494.vasp,Cd2Cu2Se2Cl2,-0.28937328375,-0.0777057728125 -Al2O3_6_917.vasp,Al2O3,-5.738936534,0.3845983039999998 -Ga2Ge2Te6_162_6368.vasp,Ga2Ge2Te6,-1.831098946,-0.2150329832666663 -Co1Pb2C6N6_12_3809.vasp,Co1Pb2C6N6,-5.84850497,0.0860030106666588 -Ga2Ni2Se5_187_6407.vasp,Ga2Ni2Se5,-1.69760963,-0.0382051516666684 -P2_164_14065.vasp,P2,-3.975699885,0.0702961000000002 -As2H6Pb2C2O6_7_1216.vasp,As2H6Pb2C2O6,-4.309644405555556,0.1676666027777669 -Re1Cl2_187_14999.vasp,Re1Cl2,-2.25110782,1.0382115074074043 -Li4As4S8_14_10158.vasp,Li4As4S8,-3.107253686875,0.0828622393749998 -H8Os2_123_7092.vasp,H8Os2,-3.528695782,1.5096015880000004 -Pb2Se2I2_59_14288.vasp,Pb2Se2I2,-1.0547820083333332,0.3401236814236091 -Hf1Zr1I2N1_25_7380.vasp,Hf1Zr1I2N1,-3.959924748,0.5296206385000004 -Tm2H8C6O16_2_19680.vasp,Tm2H8C6O16,-5.57043077,0.0693699522656252 -P4O8_2_14091.vasp,P4O8,-5.177176864166666,0.2163833081666636 -Tl4Ge2Se6_2_19603.vasp,Tl4Ge2Se6,-1.7680082041666667,0.1482118958333333 -Ga2Fe2S5_8_6358.vasp,Ga2Fe2S5,-2.831564644444444,-0.3279371144444467 -Cr2Ni1S4_164_4430.vasp,Cr2Ni1S4,-2.80077064,0.0704702999999997 -Ta4Ge2S8_55_18045.vasp,Ta4Ge2S8,-4.852146516428571,0.0201744252380926 -Ag1Sn1S2I1Br1_1_135.vasp,Ag1Sn1S2I1Br1,-1.0381875916666667,0.227333769479165 -Al1Rh2Se3Br2_1_719.vasp,Al1Rh2Se3Br2,-1.8832664725,0.594270865104164 -Ca1Te2_115_2895.vasp,Ca1Te2,-1.1286747033333333,0.485452765555554 -Mn1Zn1Cl2_1_10939.vasp,Mn1Zn1Cl2,-0.441833185,0.5226811817834052 -Ti2Se10_59_19016.vasp,Ti2Se10,-3.152303665,0.0719276758333333 -Nb3Pt3Se14_6_12996.vasp,Nb3Pt3Se14,-3.0495549275,0.0897255897986049 -Ba2Br4O8_125_1928.vasp,Ba2Br4O8,-2.6076539435714285,0.1873374526190461 -Hf1Co1H6_149_7149.vasp,Hf1Co1H6,-3.38074911625,0.870904194374996 -Zr3H2C2Se2_38_21764.vasp,Zr3H2C2Se2,-4.923089135555555,0.3929555393518402 -Mn3Ge1Se1S1Br1_156_11379.vasp,Mn3Ge1Se1S1Br1,-2.119773937142857,0.3189128149404683 -Sb4C3_5_15772.vasp,Sb4C3,-3.6217841842857146,1.161536461428566 -Na2P2Pd2_12_12259.vasp,Na2P2Pd2,-1.98958332,0.1478460322222201 -Ni3Ge1Se2_187_13700.vasp,Ni3Ge1Se2,-1.0723603333333334,0.1585870328205102 -Ta1Sb1As1_156_17610.vasp,Ta1Sb1As1,-4.18899909,0.4863884758333291 -Au1Cl2_164_1419.vasp,Au1Cl2,0.2090760833333333,0.267235335 -Bi10S10_26_2293.vasp,Bi10S10,-2.0064743445,-0.7174780978333342 -K2U2Cl2O6_11_9382.vasp,K2U2Cl2O6,-5.608945272500001,0.0527633791666666 -Mn2Te2S8_31_11303.vasp,Mn2Te2S8,-2.3079491441666664,0.5070657538194429 -Ta2Se4Br4_12_17878.vasp,Ta2Se4Br4,-2.9291050160000003,0.1280188953076892 -Ru2I2_164_15323.vasp,Ru2I2,-1.19737995,0.6060892899999984 -Rb1C12_191_14724.vasp,Rb1C12,-7.409522054615384,0.0350379169230703 -Si1Br2_187_16322.vasp,Si1Br2,-1.5086334499999998,0.2956496983333311 -Ti3B2Cl2_187_19057.vasp,Ti3B2Cl2,-5.387808231428571,-0.0886788175000039 -Tl2S2_164_19506.vasp,Tl2S2,-1.3306839675,0.2651397135937501 -Be1Br2_115_2215.vasp,Be1Br2,-1.99097694,0.0972596866666666 -Y3C2Cl2_187_20789.vasp,Y3C2Cl2,-5.235499062857143,0.2022905117410597 -Ta4Pt2Se14_11_18093.vasp,Ta4Pt2Se14,-3.6168012635,0.0906064664999941 -Nb2Fe4Te6_11_12724.vasp,Nb2Fe4Te6,-1.958536249166667,0.6879542251388886 -Ni2Bi2Cl2O4_10_13465.vasp,Ni2Bi2Cl2O4,-2.292837627,0.2157830840000002 -Ca2I4_2_3056.vasp,Ca2I4,-0.8810082083333333,0.3916030563333332 -Sc1Nb1Cl2O1_1_15958.vasp,Sc1Nb1Cl2O1,-4.206146964,0.4707194402142818 -Li2Te2P2O10_11_10086.vasp,Li2Te2P2O10,-4.66078248125,0.1327778949999956 -Li1In1P2Se6_5_9733.vasp,Li1In1P2Se6,-2.548028456,0.1052880365000001 -Cs2P2H6O6F2_2_4766.vasp,Cs2P2H6O6F2,-4.112601634444444,0.0466833093333207 -Fe2B1O2F2_164_5800.vasp,Fe2B1O2F2,-2.29383188,1.9786141626984104 -Ni1H4C2N4F2_47_13336.vasp,Ni1H4C2N4F2,-4.495732026923077,0.5608911105640922 -Sr2Ag1S2I2_2_17107.vasp,Sr2Ag1S2I2,-1.5997993257142855,-0.1042748667113115 -Ta2Te8Rh2_11_17928.vasp,Ta2Te8Rh2,-2.8435873283333333,0.0999357720833331 -In1Ni2_187_8288.vasp,In1Ni2,1.09746681,2.0594315362499964 -Ce1Si2Au4_47_3656.vasp,Ce1Si2Au4,-1.2258705814285715,0.4430182628571428 -Ge2Sb2C2S6F6_7_6841.vasp,Ge2Sb2C2S6F6,-2.977520504444444,0.6526237136111082 -Ni1Pd2Se2S4I1_1_13403.vasp,Ni1Pd2Se2S4I1,-1.495602858,0.2758418316874985 -Cd1Pd3I1Cl3O4_1_3405.vasp,Cd1Pd3I1Cl3O4,-1.4037464275,0.3493449517245356 -Ge1S2_115_6699.vasp,Ge1S2,-3.06038515,0.0971328810416665 -Li2Ge1S6F6_147_9925.vasp,Li2Ge1S6F6,-2.273204748,0.615902410194445 -Ti2Ge4_129_18943.vasp,Ti2Ge4,-4.289454650000001,0.4898871466666659 -Ge2Sb2S6Cl2_7_6852.vasp,Ge2Sb2S6Cl2,-2.379836950833333,0.3393600901041664 -Ge2O2_129_6792.vasp,Ge2O2,-4.350457335,-0.1437392656249998 -Zn2S2_164_21144.vasp,Zn2S2,-0.970006355,0.2216537395 -Ca1H1I1O1_6_2842.vasp,Ca1H1I1O1,-3.0736347475,0.2734680637500002 -Mg2Mo2S2O12_4_10482.vasp,Mg2Mo2S2O12,-4.64846429,0.2051695161700302 -Pd4Br1Cl3O4_1_14514.vasp,Pd4Br1Cl3O4,-1.7279155433333333,0.2170985781249981 -Fe1Mo1Se2S3_1_5720.vasp,Fe1Mo1Se2S3,-2.584284517142857,0.2676185426190425 -Hf4Br4O4_7_7772.vasp,Hf4Br4O4,-5.079260165833333,0.3954868261111084 -Cs2H6Se2N2O6_1_4723.vasp,Cs2H6Se2N2O6,-3.754942105,0.1773608296527741 -Na8Hg4S8_29_12451.vasp,Na8Hg4S8,-1.3131875835,0.17579164425 -Ca3Ag2S4I2_123_3147.vasp,Ca3Ag2S4I2,-1.7156190045454545,-0.1857010482386394 -Na2H4C2S6_7_12108.vasp,Na2H4C2S6,-3.239712602142857,0.3635095233928511 -Pd2Se2O6_11_14488.vasp,Pd2Se2O6,-3.148189822,0.072348748 -Cu2W1S4_1_5364.vasp,Cu2W1S4,-2.480594774285714,0.2147496252380927 -Ge1H2O2_164_6668.vasp,Ge1H2O2,-4.086605624,0.1798083309166669 -In2Te2_123_8627.vasp,In2Te2,-0.980175305,0.404833715 -Sr2In1Hg1Au1S5_99_17267.vasp,Sr2In1Hg1Au1S5,-1.6763448799999998,0.2797901511874973 -K2H2C2O6_4_9119.vasp,K2H2C2O6,-4.843695524166667,-0.0337849024999998 -Ag2S4Cl2_1_389.vasp,Ag2S4Cl2,-1.2664104475,0.1071914159375 -Cd1Pd1S2I2_6_3401.vasp,Cd1Pd1S2I2,-0.6235349516666667,0.2576167690277777 -Ag2I2_67_318.vasp,Ag2I2,0.4912707925,0.1437974875 -Pb2I4O12_13_14253.vasp,Pb2I4O12,-2.795196577777778,0.0856566977777775 -Ag2Sb2Te6_147_406.vasp,Ag2Sb2Te6,-0.872417242,0.3523862968333316 -Sr1Cu2S8_89_17044.vasp,Sr1Cu2S8,-2.0577038163636363,0.1708174230492379 -In2Cl6_162_8403.vasp,In2Cl6,-1.3957257725,0.0452396674999999 -Na4S4N1_5_12408.vasp,Na4S4N1,-2.3462804333333334,0.3741983024999975 -Zn1H16C11N2O6_1_20947.vasp,Zn1H16C11N2O6,-5.238428751944444,0.1747395080555476 -Mn1I2_187_10771.vasp,Mn1I2,-0.39007729,0.3377945283333333 -Sb2Pt2O6_162_15660.vasp,Sb2Pt2O6,-3.333264386,0.5627161749999977 -As1C1_38_1140.vasp,As1C1,-3.980156485,1.6835984999999996 -Sm1Sn2_123_16560.vasp,Sm1Sn2,-1.68090444,-0.1817473033333332 -In2Se4_12_8597.vasp,In2Se4,-1.7488215616666667,0.2894443855555535 -C3N4_5_2762.vasp,C3N4,-7.09196711,-0.2524064225000049 -Gd2Br2O2_129_6599.vasp,Gd2Br2O2,-4.799714531666667,0.0595617116666664 -Sb4O4F12_2_15781.vasp,Sb4O4F12,-2.9264868905,0.186722787303568 -Rh1I2_187_15157.vasp,Rh1I2,-0.24669154,0.6438971999999991 -Tl6H2S4O18_7_19642.vasp,Tl6H2S4O18,-3.6519804226666666,0.1415934000166592 -Tl1Se1_156_19343.vasp,Tl1Se1,-0.681933235,0.6179464060416666 -Al2Si2Se2_164_986.vasp,Al2Si2Se2,-3.3876590033333334,0.0317368416666665 -Ca2Sn1S1Cl1O2_1_3126.vasp,Ca2Sn1S1Cl1O2,-3.07067465,0.2154730630357088 -Te6N4_7_18659.vasp,Te6N4,-2.754531526,0.4020401770000005 -Cu1Sb1P2Se6_143_4963.vasp,Cu1Sb1P2Se6,-2.232589653,0.1020513069062476 -Na2Mo6P4O28_11_12215.vasp,Na2Mo6P4O28,-5.2357724415,0.0319934929374996 -Ca3F6_12_3172.vasp,Ca3F6,-3.721257764444444,0.1224905322222222 -Li2Fe2F8_26_9907.vasp,Li2Fe2F8,-2.7623429116666665,0.0185972333333337 -Nb1Bi2_164_12475.vasp,Nb1Bi2,-2.70951539,-0.2391912766666686 -Sm2P3Pt6_115_16580.vasp,Sm2P3Pt6,-3.2110808063636367,0.0432794704545456 -Nb12Cl28_53_12457.vasp,Nb12Cl28,-3.216798567,0.0896360972499965 -Hf1Fe1Se2I3Br1_1_7163.vasp,Hf1Fe1Se2I3Br1,-1.84683533,0.2676387264062499 -Sc2H2O4_1_16085.vasp,Sc2H2O4,-5.38543572625,0.3579278505729166 -Pt2Pb1_164_14647.vasp,Pt2Pb1,-0.64548811,1.3106332249999983 -As2I6_31_1223.vasp,As2I6,-0.5169720075,0.1686002212499999 -V2P2O6_162_20138.vasp,V2P2O6,-5.298098443,0.2749828759999948 -Ru1S1Cl2_47_15286.vasp,Ru1S1Cl2,-1.9645612525,0.3728150365131555 -Nb2C1O2_164_12662.vasp,Nb2C1O2,-7.170172622,0.1219922744166606 -Ge1Se2_187_6710.vasp,Ge1Se2,-2.1801968933333336,0.4239359838888883 -N1O2_1_11776.vasp,N1O2,-4.485344183333333,0.2176991524999998 -Hf1Mn1I1Cl1_6_7214.vasp,Hf1Mn1I1Cl1,-2.2392976425,0.64395386140625 -Ni2Bi1Se2_187_13462.vasp,Ni2Bi1Se2,-0.904627558,0.063372242166666 -Os1F2_115_13799.vasp,Os1F2,-2.29950865,0.8130428738333308 -Nb2S4I4_12_12855.vasp,Nb2S4I4,-2.780612106,0.0505838600000001 -In2H14C4_10_8459.vasp,In2H14C4,-3.5742917735,0.8243524345000006 -Sb2F6_12_15576.vasp,Sb2F6,-2.60619464625,0.5099387687500001 -Pd1F2_115_14361.vasp,Pd1F2,-0.66285393,0.7743952883333332 -Fe1I2_115_5715.vasp,Fe1I2,0.23382147,0.2355162941666666 -Sc1Sb1Cl2O2_1_15991.vasp,Sc1Sb1Cl2O2,-3.992586465,0.0490103804513837 -Te2Os1_115_18420.vasp,Te2Os1,-2.19683473,0.0050389383333331 -Ba2Ag1S2F2_38_1887.vasp,Ba2Ag1S2F2,-2.440361702857143,0.5067233949999973 -Ta6Si2S12_26_18153.vasp,Ta6Si2S12,-5.177663444,0.1281744734444354 -Cr2Cu1S6_2_4362.vasp,Cr2Cu1S6,-2.520361266666667,0.3639189221296265 -Hf1As2O6F2_164_7107.vasp,Hf1As2O6F2,-4.878747336363636,0.0935216298863588 -Os2S6_11_13878.vasp,Os2S6,-3.41315645875,0.4649028704687499 -Hf2S1I2N1_1_7562.vasp,Hf2S1I2N1,-4.40976084,0.384225912499996 -P8S12_2_14153.vasp,P8S12,-3.2342904925,0.1509596989062473 -Mo1W3S8_21_11557.vasp,Mo1W3S8,-3.963905200833333,0.3194417450000002 -Ca2H3_164_3035.vasp,Ca2H3,-2.11393278,0.3924185264999974 -Ag2Se1S2I2_1_425.vasp,Ag2Se1S2I2,-0.6193292357142858,0.2597943260119011 -Ti2Se2Br2_59_19019.vasp,Ti2Se2Br2,-3.8004863866666665,-0.6730018687500023 -Al2Fe1S4_164_826.vasp,Al2Fe1S4,-3.400690302857143,-0.1635475944642876 -Na1Al1Br4O12_2_11809.vasp,Na1Al1Br4O12,-2.7454296577777777,0.2383879614930457 -Sb1H1S2O6_1_15453.vasp,Sb1H1S2O6,-4.154597059,0.1101020052499929 -Hg1O2_2_7890.vasp,Hg1O2,-1.0021212566666666,0.6308302543055543 -Pb2Se2F2_59_14287.vasp,Pb2Se2F2,-1.958621196666667,0.4188593167013866 -Y4H2N3O2_164_20824.vasp,Y4H2N3O2,-6.484259823636364,-0.8515639261931893 -Co2Sb2S4I2_10_4001.vasp,Co2Sb2S4I2,-1.960558206,-0.2621734025833357 -H4Au4I4O4_14_7060.vasp,H4Au4I4O4,-1.680763436875,0.2504132118541669 -K2Pd1Se2_47_9300.vasp,K2Pd1Se2,-0.777364654,0.6060988239999999 -Cs2Hg4Se2Cl6O6_31_4736.vasp,Cs2Hg4Se2Cl6O6,-1.408534985,0.1334333756666665 -Nb1I2_187_12523.vasp,Nb1I2,-1.9098132133333328,0.4524899216666636 -Ga2Br6_26_6315.vasp,Ga2Br6,-1.0746917175,0.0794017325 -Te2Pd1_187_18464.vasp,Te2Pd1,-1.13601679,0.3530277466666667 -Sr1H2S2_1_17055.vasp,Sr1H2S2,-3.145542548,-0.0114816184999997 -Gd2I6_59_6619.vasp,Gd2I6,-1.59368277875,0.0535537012499998 -V2Cl8_14_20040.vasp,V2Cl8,-1.817554472,0.033897314 -Os1I2O1_47_13802.vasp,Os1I2O1,-2.331202845,0.2777594121874998 -Mo2Se4_11_11694.vasp,Mo2Se4,-2.9650916316666667,0.0803215916666668 -Cd1H1I1O1_156_3328.vasp,Cd1H1I1O1,-1.66510743,0.1286055064583333 -Ba2La2I10_11_2016.vasp,Ba2La2I10,-1.6074873142857142,0.1383099185714271 -Nb4C3Cl2_164_13043.vasp,Nb4C3Cl2,-6.35124594,0.0062447429629566 -In1Si1Te1Cl1_1_8350.vasp,In1Si1Te1Cl1,-1.670816825,0.269704555625 -Ag2Mo1Se4_111_327.vasp,Ag2Mo1Se4,-1.455525894285714,0.0153050742857128 -Cu4Te8O20_14_5490.vasp,Cu4Te8O20,-3.1426827425,0.2996335531250005 -Ag4Ru4F28_14_539.vasp,Ag4Ru4F28,-1.6485345852777775,0.0173448699999998 -Tc1Br2_164_18217.vasp,Tc1Br2,-2.5522967333333333,0.4106173833333275 -Zr1Nb1Se1S2I1Br2_1_21358.vasp,Zr1Nb1Se1S2I1Br2,-3.09536931,0.0541896301562385 -Ag2O4_14_343.vasp,Ag2O4,-1.475969625,0.554486675416665 -Ti3B2S2F2_8_19065.vasp,Ti3B2S2F2,-4.853477735555555,0.3803065905555516 -Hg2Sb2S4Cl2_11_8008.vasp,Hg2Sb2S4Cl2,-1.255858912,0.1951520625000001 -V2H2N1_164_20076.vasp,V2H2N1,-4.495933198,0.179268086 -Hg2Se2Br2_59_8015.vasp,Hg2Se2Br2,0.1552909916666666,0.2912601159722208 -Ca3N3_25_3190.vasp,Ca3N3,-2.9333534,1.1404324021875 -Co2Bi2Se4Cl2_10_3866.vasp,Co2Bi2Se4Cl2,-1.6839324990000002,0.264991379933331 -Cd1Pb2O2F2_12_3392.vasp,Cd1Pb2O2F2,-2.4256707285714287,0.0848326166666648 -B2Br6_12_1655.vasp,B2Br6,-1.292295135,0.6168327687499999 -Cd2Br2_164_3478.vasp,Cd2Br2,0.815101955,0.1268153043750001 -Ni1C2N4Cl2F4_47_13292.vasp,Ni1C2N4Cl2F4,-2.976999825384615,0.7323172149358913 -Te6P4_7_18675.vasp,Te6P4,-2.151196986,0.4102728620000003 -Dy1Cu2S2_164_5510.vasp,Dy1Cu2S2,-2.097673664,0.8383568165000006 -Ca2Cu1Se2I2_38_3005.vasp,Ca2Cu1Se2I2,-1.3858179257142855,0.1056116072380924 -Ir2I8_1_8793.vasp,Ir2I8,-0.4273011269999999,0.1704185843750004 -Te4Au2Cl2_17_18565.vasp,Te4Au2Cl2,-0.48407695875,0.23053001375 -Mn1Re2S8_147_10847.vasp,Mn1Re2S8,-3.58435887,0.5027982732954484 -Nb3C1S1Br2O1_8_12959.vasp,Nb3C1S1Br2O1,-4.9937764625,0.244970065253907 -Hg2Au2Se2F2_26_7932.vasp,Hg2Au2Se2F2,-0.0093540725,0.31799419 -Si4Se8_14_16516.vasp,Si4Se8,-3.054235605,0.0711895118750001 -As2Se2O1_5_1299.vasp,As2Se2O1,-3.021711266,0.2107179346666639 -H4Au1C6N6O2_6_7052.vasp,H4Au1C6N6O2,-5.653554582105263,0.3333100497222134 -Hg2Sb2Se6_147_8012.vasp,Hg2Sb2Se6,-1.04316816,0.051138704333331 -Cd1O1_187_3384.vasp,Cd1O1,-1.08013604,0.4750258233333335 -Li2Mn3F8_164_10001.vasp,Li2Mn3F8,-3.0227112000000003,-0.1050291384615413 -Zn4P6S18_12_21224.vasp,Zn4P6S18,-2.5941832417857142,0.0468520864642872 -Sc2C1Br2_164_16049.vasp,Sc2C1Br2,-3.911774834,0.030807432 -Ga2H6N2F6_28_6381.vasp,Ga2H6N2F6,-3.660671455625,0.21241735625 -Cd2S2_129_3548.vasp,Cd2S2,-0.4080329625,0.33338074875 -Hg2S2Br2_11_7993.vasp,Hg2S2Br2,-0.03911115,0.2440623478124983 -Al1Cu1Te6As2_149_649.vasp,Al1Cu1Te6As2,-1.558522212,0.0452396461666651 -Ir3Pd1S1I2Cl2O3_1_8853.vasp,Ir3Pd1S1I2Cl2O3,-2.3506569025,0.5662986549305514 -Li2V1C2O6_147_10104.vasp,Li2V1C2O6,-5.501627511818182,0.1096674652272682 -Sm2Bi4Se8_26_16565.vasp,Sm2Bi4Se8,-2.497450570714286,0.2138611636309511 -V2Br2_164_20004.vasp,V2Br2,-2.0927431475,0.4392725675000004 -Nb1V3O10_115_12613.vasp,Nb1V3O10,-5.768052672857143,0.0961000924999995 -Cd2I2O2_1_3517.vasp,Cd2I2O2,-0.5474117883333333,0.3644760276984123 -V2Te2_164_20215.vasp,V2Te2,-2.5230158975,0.2522292053571402 -Ir3Cl1O6_8_8850.vasp,Ir3Cl1O6,-3.571267897,0.6289674422499951 -Mn1Ag1Br4_1_10609.vasp,Mn1Ag1Br4,-0.6504036616666666,0.0564866674999993 -Hg1F2_2_7854.vasp,Hg1F2,-0.3670593033333333,0.0796842524999999 -Ag2Se1S4_21_426.vasp,Ag2Se1S4,-1.07041124,0.524786582499999 -Cd2Cu2Te2Br2_26_3497.vasp,Cd2Cu2Te2Br2,0.09479533375,0.046903275625 -Ba1Sn2_164_1860.vasp,Ba1Sn2,-0.5235343633333334,0.7169779866666666 -K4Hg2Br8_11_9459.vasp,K4Hg2Br8,-0.3474293985714285,0.0728793033333324 -K4Se10_4_9511.vasp,K4Se10,-1.5625177692857142,0.3705611335714285 -Cu2S4F2_4_5258.vasp,Cu2S4F2,-1.72861322125,0.0800940164322916 -Co4Ge12_35_4079.vasp,Co4Ge12,-2.748985998125,0.0697248306249999 -Tl2Se3_164_19536.vasp,Tl2Se3,-1.175852338,0.254583701 -Hg4Te2Mo2O12_28_8091.vasp,Hg4Te2Mo2O12,-2.983746179,0.1214527553750008 -Ti1S2_164_18840.vasp,Ti1S2,-5.038216346666666,0.0910989999999998 -Mn1Os1Se2I3Cl1_1_10834.vasp,Mn1Os1Se2I3Cl1,-1.33825435875,0.3688498182812501 -Si1Te1_123_16374.vasp,Si1Te1,-1.961554365,0.5641335662499998 -Sb4Se6_7_15827.vasp,Sb4Se6,-2.151958767,0.2086610630000001 -Ga2S4_12_6454.vasp,Ga2S4,-2.504138258333333,0.3664404498958307 -Cs2H6C2O8_4_4714.vasp,Cs2H6C2O8,-3.304054812777778,1.3999919406481438 -Cr2S2F2_59_4464.vasp,Cr2S2F2,-3.092835845,0.1480181949999974 -Al2S2I1Br1_6_939.vasp,Al2S2I1Br1,-2.573113053333333,0.0756450921527751 -Tl1Fe5Cl2_123_19267.vasp,Tl1Fe5Cl2,-0.24095800375,1.542766943749999 -Hf3H2Se2N2_187_7711.vasp,Hf3H2Se2N2,-5.42370628,0.5791151005555495 -Cd2Cl2O2_59_3483.vasp,Cd2Cl2O2,-0.86448269,0.4208918568749974 -Ta3S2N2F2_187_17985.vasp,Ta3S2N2F2,-5.58504644,0.7732989107142729 -Cu2C6Br2N2F8_2_5074.vasp,Cu2C6Br2N2F8,-3.836996207,0.1237572752604106 -U2Se6_59_19727.vasp,U2Se6,-4.4171780275,0.0568233774999997 -Nb2Sb1I2O1_1_12857.vasp,Nb2Sb1I2O1,-3.567643275,0.2504580224074042 -Sn1Br2_164_16619.vasp,Sn1Br2,-1.0955632233333332,0.0714283616666668 -Ta2Te10Pt2_6_17893.vasp,Ta2Te10Pt2,-2.220942665714286,0.3801984242857141 -Be2N1_164_2260.vasp,Be2N1,-4.7240413666666665,0.5942851256249962 -Ta4B3S2_164_18008.vasp,Ta4B3S2,-6.819130757777778,0.2499460766666605 -Nb4Se12_11_13149.vasp,Nb4Se12,-3.67296391,0.0654348749999997 -Nb4Se12Br2_2_13146.vasp,Nb4Se12Br2,-3.2503934316666667,0.1228467010185153 -Na2C2N2O2_31_11997.vasp,Na2C2N2O2,-5.56764827375,-0.0567102357291723 -Ga2Se2_12_6479.vasp,Ga2Se2,-2.2635217275,0.1539357799999998 -K2Hg4Cl6O8_31_9173.vasp,K2Hg4Cl6O8,-1.1633947340000002,0.2417030282499973 -K2Hg4Se2S6Cl6_31_9191.vasp,K2Hg4Se2S6Cl6,-0.7863968915,0.2553948748124987 -Cr2Cd2O6_12_4348.vasp,Cr2Cd2O6,-3.393318108,0.157839145444438 -Nb2Br8_1_12659.vasp,Nb2Br8,-1.943517318,0.1980886969999997 -Au2Se1S1Br2_1_1537.vasp,Au2Se1S1Br2,-0.3836374066666666,0.1919518916319437 -Ir2N2Cl2_59_8794.vasp,Ir2N2Cl2,-3.4179947416666665,0.3331029119444413 -Cd2Bi2S4F2_11_3473.vasp,Cd2Bi2S4F2,-1.564751599,0.0150360819999974 -Ga2Co2S5_164_6333.vasp,Ga2Co2S5,-2.757784785555556,0.0830517326851825 -Bi2Sb2S6_7_2528.vasp,Bi2Sb2S6,-2.422966678,-0.2942591694999996 -La2I2_164_9597.vasp,La2I2,-1.939339485,0.2941735974999999 -As2Rh2Se6_162_1285.vasp,As2Rh2Se6,-2.487000244,0.2724582650526294 -In1F2_187_8244.vasp,In1F2,-2.1322429066666664,0.3788591800000001 -V2Br2O3_12_20002.vasp,V2Br2O3,-4.0547238185714285,0.094612933928567 -Cu2F6_12_5097.vasp,Cu2F6,-1.0189332775,-0.2104365225 -V1Se2_164_19931.vasp,V1Se2,-3.09614528,0.050458438333333 -Ge2S1Br1_1_6820.vasp,Ge2S1Br1,-2.4241005525,-0.4101151425 -Mo1Au2O4_111_11490.vasp,Mo1Au2O4,-2.6169191942857144,0.8720982442857101 -Hg2Sb2F14_2_8003.vasp,Hg2Sb2F14,-1.7955219705555558,0.0476747387499989 -Cr2Cu2Sb4Te12_13_4374.vasp,Cr2Cu2Sb4Te12,-1.3439415215,0.2692212855833317 -Li2W1_187_10138.vasp,Li2W1,-2.529755546666667,0.8111386611111082 -Li1Al1As2S6_5_9637.vasp,Li1Al1As2S6,-3.030101973,0.4742618449374975 -Cr2H2S2N1_164_4400.vasp,Cr2H2S2N1,-3.739992717142857,0.2956992523610982 -Cu2H8C12N10_2_5138.vasp,Cu2H8C12N10,-5.86787805625,-1.370179447656254 -Hf1I1F1_156_7196.vasp,Hf1I1F1,-3.26482098,0.6507683320833234 -Mn1Ag1Br4Cl2_1_10608.vasp,Mn1Ag1Br4Cl2,-0.55272584875,0.1119774420833323 -Hg1I2_187_7881.vasp,Hg1I2,1.030511966666667,0.1576317094444445 -W2O4F4_26_20521.vasp,W2O4F4,-4.837184209,-0.0536660370000001 -Sc2Br6_59_16048.vasp,Sc2Br6,-2.18755560125,0.1406576824999996 -V2S2_187_20163.vasp,V2S2,-3.5240887075,0.1313238209374954 -Sb2P2O8_26_15623.vasp,Sb2P2O8,-4.985066045833333,0.3183068508333333 -Te4Mo3_12_18596.vasp,Te4Mo3,-2.06943229,0.4244570228571427 -B2N1_164_1683.vasp,B2N1,-4.6899606,2.5656183277777718 -Sr3Fe2S2O5_123_17377.vasp,Sr3Fe2S2O5,-3.584540473333333,0.3731601008333274 -Tl4N20_26_19609.vasp,Tl4N20,-4.746139295833333,-0.1700667637500014 -Ca1Si3Ir1_99_2882.vasp,Ca1Si3Ir1,-3.02328811,0.8784745919999999 -Li1Ga1P2S6_5_9711.vasp,Li1Ga1P2S6,-3.211532867,0.0129790900481708 -Ti1Bi2O6_99_18744.vasp,Ti1Bi2O6,-4.271345301111111,0.7306652188194357 -K1In1Cl4O12_2_8910.vasp,K1In1Cl4O12,-2.5199916594444445,0.2121742927777754 -Hf1Sc1I2N1O1_6_7297.vasp,Hf1Sc1I2N1O1,-4.944914428333333,0.0883336791666611 -Zr3Sc1Br4O4_8_21782.vasp,Zr3Sc1Br4O4,-4.693300281666667,0.1807787595833332 -Li2S4Cl2_113_10057.vasp,Li2S4Cl2,-1.7758692,0.9029947721875 -Y2Cu6O12_1_20726.vasp,Y2Cu6O12,-3.2226295790000004,0.5100768922499948 -Na4S12_13_12406.vasp,Na4S12,-2.376410739375,0.1412742682812502 -V1B4H4Cl1O6_1_19772.vasp,V1B4H4Cl1O6,-4.91442817125,0.7563060944444354 -Sn2I2_129_16784.vasp,Sn2I2,-0.502723345,-0.6179016479166667 -Nb2O2_129_12792.vasp,Nb2O2,-5.655722175,0.8637711183333332 -P2Se5_8_14054.vasp,P2Se5,-2.4355664785714284,0.3072488983928551 -P2Ru2Se6_162_14044.vasp,P2Ru2Se6,-2.912679516,0.385391150444441 -K2B2H6Se2S6_1_8992.vasp,K2B2H6Se2S6,-2.9212525777777776,0.2803283194907358 -Pd2S8_11_14479.vasp,Pd2S8,-2.2483984670000003,0.18944277525 -Hf1Ta1S1I2_8_7314.vasp,Hf1Ta1S1I2,-3.644626666,0.3867099317500004 -H2Pd1_115_7012.vasp,H2Pd1,-2.06731273,1.4581362683333303 -Au2S3Cl1_1_1520.vasp,Au2S3Cl1,-0.8884605633333332,0.2949462870833323 -Sb1Se1S1_1_15501.vasp,Sb1Se1S1,-2.33358782,0.1930687521180505 -Sc4Te6_1_16265.vasp,Sc4Te6,-2.787430908,0.2922461909999998 -Cr2O6_11_4443.vasp,Cr2O6,-4.50407573,-0.0512878901562503 -V4O8F4_14_20349.vasp,V4O8F4,-4.788766954375,-0.3004683609375038 -Ba10Co2_26_1797.vasp,Ba10Co2,0.3723255633333333,0.977792428333332 -Nb4Co2O10_59_13052.vasp,Nb4Co2O10,-5.8717096725,0.3426759164062503 -Os1Cl2_115_13796.vasp,Os1Cl2,-1.6579212033333333,0.6747277924999957 -Li2Mn2F6_162_9994.vasp,Li2Mn2F6,-3.148371564,-0.1981882219999997 -Sb1Br2_187_15441.vasp,Sb1Br2,-0.8937236133333334,0.3367515024999988 -Al4Bi4_127_1061.vasp,Al4Bi4,-1.02957625875,0.41584817125 -Li6Si1_191_10277.vasp,Li6Si1,-1.8830639814285717,0.2182501317142835 -Cd2Cu4O6_59_3501.vasp,Cd2Cu4O6,-1.5455208941666667,0.621392059027776 -Ti4S4F4_31_19159.vasp,Ti4S4F4,-4.8169890075,-0.2295913683333377 -Re1Ag2F6_2_14988.vasp,Re1Ag2F6,-1.9721916877777776,0.2066769383333317 -Ti2Br2_129_18901.vasp,Ti2Br2,-3.57794745,0.6088523075000003 -Cd2As2N2O10_31_3453.vasp,Cd2As2N2O10,-3.7105766075,0.2218881514374932 -Ge1Pb2S1I2_6_6691.vasp,Ge1Pb2S1I2,-1.40592048,-0.4591271777777794 -V1Bi1As1_156_19779.vasp,V1Bi1As1,-2.51935052,0.2074723505555488 -Na2Cd4Te2Cl6O6_31_12044.vasp,Na2Cd4Te2Cl6O6,-1.7542767405,0.2522976432916663 -In2Ni1O4_164_8489.vasp,In2Ni1O4,-3.0364659442857147,0.3700179916071401 -Sc3C2S2F2_187_16201.vasp,Sc3C2S2F2,-4.050087850000001,1.0789129401058073 -Zn2Ga2S5_156_21082.vasp,Zn2Ga2S5,-2.022138951111111,0.1950019632222202 -As2P2O8_11_1239.vasp,As2P2O8,-5.119953838333333,0.0759744654166629 -Te2Pb2F2_59_18452.vasp,Te2Pb2F2,-1.7033494266666669,0.3870371752777761 -Na4P2H10C6O14_4_12400.vasp,Na4P2H10C6O14,-5.0305553863888886,0.1276295712152654 -Cu2B2I2O2_31_5027.vasp,Cu2B2I2O2,-2.41595287875,0.9294626415755136 -V3H2C2Se2_6_20264.vasp,V3H2C2Se2,-4.2672644433333335,0.4077244790476091 -Cu1Ge1O3_25_4882.vasp,Cu1Ge1O3,-3.616618098,0.3032766317499973 -As4S8_31_1366.vasp,As4S8,-2.703463354166667,0.6657632194791634 -K2Ru2S2N2Cl10_2_9324.vasp,K2Ru2S2N2Cl10,-2.089418575,0.1108245091666609 -Gd2C1F2_164_6605.vasp,Gd2C1F2,-4.811227532,0.1414405079999996 -Te1Mo2W2Se1S1Cl1_6_18311.vasp,Te1Mo2W2Se1S1Cl1,-3.4603839425,0.3977920311458334 -Cu2Te2_129_5333.vasp,Cu2Te2,-0.4343923325,0.1330882024999999 -Ta4N3Cl2_1_18059.vasp,Ta4N3Cl2,-6.468941526666667,0.6120712922222087 -Tc3Cl8_1_18240.vasp,Tc3Cl8,-2.79987539,0.2773975489393898 -Tb1N2_21_18174.vasp,Tb1N2,-5.606851933333334,0.2090858941666611 -Al4O6_31_1079.vasp,Al4O6,-5.9839084,0.1396264379999996 -Tb1Pb2_123_18176.vasp,Tb1Pb2,-1.2414500733333331,-0.2186109283333333 -Al1Sb2Au1S6_149_729.vasp,Al1Sb2Au1S6,-2.3007439990000003,0.3474863219374975 -Zn4Si2O8_11_21226.vasp,Zn4Si2O8,-3.814336535,0.2377286495238095 -Cu2Te2_187_5334.vasp,Cu2Te2,-0.245162955,0.32231758 -Ti1Bi1Sb1_156_18742.vasp,Ti1Bi1Sb1,-3.1978384666666666,0.1486244666666634 -Fe2F2_164_5846.vasp,Fe2F2,-1.92994595,0.6533603674999998 -Ti1Zn1Se2_1_18874.vasp,Ti1Zn1Se2,-2.44369713,-0.158813377700324 -Hg2H2Cl2O8_28_7963.vasp,Hg2H2Cl2O8,-2.2459877664285712,0.202288355595235 -Ta1I2_164_17557.vasp,Ta1I2,-2.15372527,0.6483665721428509 -Ag2Te3P4I2_6_474.vasp,Ag2Te3P4I2,-1.510792221818182,0.2627939590909057 -Sb2Cl2O2_59_15565.vasp,Sb2Cl2O2,-2.866766605,0.2645400172222221 -Cu1I2O2_1_4908.vasp,Cu1I2O2,-1.1592219460000002,0.1753646916 -Li6O3_157_10269.vasp,Li6O3,-3.814844145555556,-0.1165543555555559 -Ge1S2_187_6701.vasp,Ge1S2,-2.6801086400000003,0.4774093910416663 -Na4S2O10_51_12407.vasp,Na4S2O10,-3.030536244375,1.0811892239062502 -Sb3Pt1Se1S2Br4O1_1_15757.vasp,Sb3Pt1Se1S2Br4O1,-1.9718702225,-0.0238839803750067 -P4Pt4S4_13_14105.vasp,P4Pt4S4,-3.30056074,0.1613548141666665 -Fe2Se2Cl2_59_5972.vasp,Fe2Se2Cl2,-1.5305311583333332,0.4555368491666668 -Tl1Cu1P2Se6_149_19254.vasp,Tl1Cu1P2Se6,-1.987272404,0.2093930111041645 -Ta4Se6_11_18112.vasp,Ta4Se6,-4.833064725,0.1163409919999995 -Sr4Mn2Bi4O12_53_17443.vasp,Sr4Mn2Bi4O12,-4.033042655,0.0050653602899618 -Bi1O2_164_2352.vasp,Bi1O2,-3.395235683333333,0.3723151626041638 -Mn2Nb2Te6_11_11164.vasp,Mn2Nb2Te6,-2.667078725,0.1047685679425267 -K4Na4H48C4O36_7_9480.vasp,K4Na4H48C4O36,-4.361132520833333,0.0436774138107638 -Co2C2O7_1_3884.vasp,Co2C2O7,-4.860571201818182,0.1439717037499975 -Cd1B4C2I2F4_10_3274.vasp,Cd1B4C2I2F4,-3.434181925384616,0.5098937225213594 -Zr1Sb2H2O6_164_21423.vasp,Zr1Sb2H2O6,-4.543979742727273,0.5246614757575658 -In1Ag1As2O6_149_8176.vasp,In1Ag1As2O6,-3.476463527,0.360155893333329 -Bi2Se2I2_11_2542.vasp,Bi2Se2I2,-1.1792586616666667,0.2104237399999999 -Mn2Bi2Se4I2_26_11019.vasp,Mn2Bi2Se4I2,-1.542203093,0.1429986894285688 -Sm2I2O2_129_16575.vasp,Sm2I2O2,-4.488067543333334,0.0535644616666655 -K2Cl2F8_127_9076.vasp,K2Cl2F8,-1.1222031391666667,0.1332526291666667 -Nb1Tl1Br4O1_3_12607.vasp,Nb1Tl1Br4O1,-2.5729529057142857,0.0530209571428574 -Cd1B4H4N2Cl2_1_3276.vasp,Cd1B4H4N2Cl2,-3.9552920530769233,0.5411816619999981 -Te2Rh2Br2_59_18497.vasp,Te2Rh2Br2,-1.56925921,0.1214845249999998 -Mn1Si1Se1O1_1_10885.vasp,Mn1Si1Se1O1,-3.4512711975,0.7379187503124998 -Mn3Cu1O8_12_11375.vasp,Mn3Cu1O8,-3.802976970833333,0.2375253914583304 -Li1Ti2Se4_164_9802.vasp,Li1Ti2Se4,-4.249310385714286,0.013515559999996 -Os2F6_162_13848.vasp,Os2F6,-2.7409631025,0.0246013730624977 -Ta1Bi1Te2_25_17513.vasp,Ta1Bi1Te2,-2.566452365,0.5892643322499991 -Ge4Pb4S12_14_6939.vasp,Ge4Pb4S12,-2.7881907055,0.071242615 -Al2S2F2_59_938.vasp,Al2S2F2,-3.655940243333333,0.1968582187499965 -In1Cu1Sb2S6_149_8235.vasp,In1Cu1Sb2S6,-2.113787244,0.3366859084374975 -Zn2P2S6_162_21131.vasp,Zn2P2S6,-2.392987535,0.0539074557374934 -Na2Ru2S2N2Cl10_1_12282.vasp,Na2Ru2S2N2Cl10,-2.18088449,0.2036071384722202 -Ta2Mn2S6_11_17771.vasp,Ta2Mn2S6,-4.3477644490000005,0.1453747356666623 -Te2Au2_187_18371.vasp,Te2Au2,-0.039730175,0.3889064725 -Ca3C1_99_3158.vasp,Ca3C1,-0.83391403,1.6555453318749955 -Ca3Cl2O6_157_3159.vasp,Ca3Cl2O6,-2.861408059090909,0.6435730515909034 -Al2Te2_164_1010.vasp,Al2Te2,-2.21650882,0.0892433674999999 -Ti1V1Se1Cl1_8_18866.vasp,Ti1V1Se1Cl1,-3.558713215,0.2164522767261831 -Tl4Hg6S8_1_19607.vasp,Tl4Hg6S8,-0.4372391855555555,0.1591254244444444 -Ta4Fe4Se8_53_18041.vasp,Ta4Fe4Se8,-3.353537348125,0.7127393231249997 -V3C2S2F2_187_20251.vasp,V3C2S2F2,-4.1322208244444445,0.206098519866245 -Nb2Zn1Mo1H3O8_1_12942.vasp,Nb2Zn1Mo1H3O8,-5.058745283333334,0.3253292916666622 -Cr2Mo2O10_85_4418.vasp,Cr2Mo2O10,-5.014752179285714,-0.0376721075297658 -Nb6Te18_11_13203.vasp,Nb6Te18,-2.8435429295833337,0.07263878177083 -Nb1S2_123_12561.vasp,Nb1S2,-4.609329413333334,0.3480559916666665 -Ag2S5_21_396.vasp,Ag2S5,-1.2190011914285714,0.4562231310714273 -Sn8Rh2_125_17008.vasp,Sn8Rh2,-1.489596736,0.545142343 -Ag2Mo1S4_111_326.vasp,Ag2Mo1S4,-1.940337207142857,0.2101944856249956 -Li2N4O2_31_10007.vasp,Li2N4O2,-4.93128194875,-0.1586565101250028 -Th4I16_14_18734.vasp,Th4I16,-1.83815436,0.050841621 -Cu1Mo1Br2O2_6_4916.vasp,Cu1Mo1Br2O2,-2.566656345,0.1450184700925929 -K2Hf2Cu2S6_51_9169.vasp,K2Hf2Cu2S6,-3.21304125,0.2038159166666666 -Cr2Mo2S8_25_4420.vasp,Cr2Mo2S8,-3.5503244633333337,0.0645414491666662 -Sb4Te2S12_18_15829.vasp,Sb4Te2S12,-2.215759516666667,0.3892855671990714 -K2C2O6_7_9017.vasp,K2C2O6,-4.715211726,0.1484023750000007 -Hf2I2N1O1_6_7513.vasp,Hf2I2N1O1,-5.237894385,0.19139093208333 -Ni2Bi2Te4I2_10_13472.vasp,Ni2Bi2Te4I2,-0.573546482,0.3470567119999996 -Ti4I4O4_7_19141.vasp,Ti4I4O4,-4.719585155833333,0.2772245791666625 -Cu1S1I1Br1_1_4954.vasp,Cu1S1I1Br1,-0.4755340825,0.1897653380989586 -Zn1B2C8N8_164_20898.vasp,Zn1B2C8N8,-6.5656492036842105,0.4756052937719165 -Pa6Cl12O6_26_14168.vasp,Pa6Cl12O6,-5.10535894,0.0788770496875006 -Sr2Au1Cl2O2_38_17124.vasp,Sr2Au1Cl2O2,-2.5698794,0.2618945620408111 -Ni2Br2N2_59_13478.vasp,Ni2Br2N2,-1.761103005,0.9873636591666616 -Mn1O2_115_10831.vasp,Mn1O2,-4.22014973,0.2446599983333328 -Os1Cl2O1_47_13795.vasp,Os1Cl2O1,-3.0007866825,0.1231125450000001 -Hg2Se2S8F4_7_8020.vasp,Hg2Se2S8F4,-1.470784335625,0.3193929181249992 -Sc2S2Br2_59_16131.vasp,Sc2S2Br2,-3.552608505,0.0360465233333329 -Br12N4_14_2704.vasp,Br12N4,-0.937351799375,0.4412370387500001 -Ca2B2S6Cl2_59_2944.vasp,Ca2B2S6Cl2,-3.1256241216666667,0.2260807113020803 -W3S4_12_20572.vasp,W3S4,-4.352596251428571,0.4835607585714225 -Ti1Ni3Te2_8_18818.vasp,Ti1Ni3Te2,-1.4210720866666666,0.1643206014999963 -Zr2As2O6_12_21503.vasp,Zr2As2O6,-5.683096805,0.3358548423333305 -Ni4As4S4_13_13740.vasp,Ni4As4S4,-1.9663091641666668,0.3276460949999999 -Ag1H2O2_164_69.vasp,Ag1H2O2,-2.93797263,0.1925951181666669 -Tm1I2_164_19665.vasp,Tm1I2,-1.5123969233333332,0.1336699694444431 -Li6V2O4F4_13_10282.vasp,Li6V2O4F4,-4.29392525125,-0.0469876934375038 -Cr1Te2_187_4278.vasp,Cr1Te2,-1.8796384733333331,0.0634076655555557 -Li2H6C10O2_51_9943.vasp,Li2H6C10O2,-4.8740573035,1.1772791454999882 -Sn4S4O16_2_16957.vasp,Sn4S4O16,-4.2170228779166665,0.0547995093489553 -Mn2C1O2_164_11039.vasp,Mn2C1O2,-4.483245248,0.3066284451417579 -Ba4Te2O2_129_2190.vasp,Ba4Te2O2,-3.20052883625,0.0845462117968749 -Li2Ti2I2N2_59_10094.vasp,Li2Ti2I2N2,-4.72853832375,0.1277705425000004 -Ta1Ti1Co1Se2S1I1Br1_8_17634.vasp,Ta1Ti1Co1Se2S1I1Br1,-3.32128326125,0.0090824939062423 -Ag4Hg4S4I4_51_526.vasp,Ag4Hg4S4I4,0.151253773125,0.106652840625 -Ca1Ag2O8_89_2797.vasp,Ca1Ag2O8,-2.6889206418181817,0.1843644746212061 -Tl1F2_164_19263.vasp,Tl1F2,-1.5642054099999998,0.222920446666667 -Fe2Te2Br14_1_5993.vasp,Fe2Te2Br14,-0.4619009227777778,0.0589946972222221 -Co2Sb1Se2_187_3993.vasp,Co2Sb1Se2,-2.108798886,0.262854724933331 -Sn2S1I1Br1_1_16833.vasp,Sn2S1I1Br1,-1.45504522,0.095255371333332 -Re2O2_129_15063.vasp,Re2O2,-5.1523003,1.4580599493750002 -Mn1Sn1S1I1Br1_1_10895.vasp,Mn1Sn1S1I1Br1,-1.405162832,0.3798840894761895 -Cd2Te2Cl2_59_3589.vasp,Cd2Te2Cl2,-0.0554667183333333,0.118902832777777 -Ag2Te2_51_464.vasp,Ag2Te2,-0.050549005,0.3070834379166666 -V3H5O8_8_20272.vasp,V3H5O8,-4.946386801875,0.054949872291667 -U2N2Cl2_129_19717.vasp,U2N2Cl2,-6.713388258333333,0.1494185800000007 -Sr2Ag1S2Br2_38_17103.vasp,Sr2Ag1S2Br2,-1.83495498,0.0851392728124961 -V2S1Br2N1_8_20150.vasp,V2S1Br2N1,-3.3967821033333334,0.210773514388882 -Sb1F2_115_15450.vasp,Sb1F2,-2.053544033333333,0.9700820102777752 -Nb1Pd2Se1S2I1Br3_1_12556.vasp,Nb1Pd2Se1S2I1Br3,-1.8000133980000002,0.0809837175999971 -Cr2H8_129_4405.vasp,Cr2H8,-3.085171258,1.8156330640000005 -Ta1Nb1S2I1Br1_6_17574.vasp,Ta1Nb1S2I1Br1,-3.7816482516666663,0.3061194829298582 -Mn2P2S4Br2_10_11188.vasp,Mn2P2S4Br2,-2.615212086,0.2005386368472188 -Mn4Zn2O10_59_11457.vasp,Mn4Zn2O10,-3.532988513125,0.4007552096875 -Ni2Sb2O6_162_13607.vasp,Ni2Sb2O6,-3.356194056,0.0249916022499987 -W1Au2S4_1_20413.vasp,W1Au2S4,-2.2586298957142854,0.2363629914285692 -Cr1Mo1Br1Cl1O2_8_4208.vasp,Cr1Mo1Br1Cl1O2,-3.2504613,0.370172378055552 -Ni2As4Cl4O6_2_13454.vasp,Ni2As4Cl4O6,-3.003898101875,-0.084563871875 -Fe1Te2_187_5767.vasp,Fe1Te2,-0.9217214666666668,0.7065304483333331 -Ag2C2I2O2_31_214.vasp,Ag2C2I2O2,-2.8166169025,0.3469729537500001 -Bi2Te4Pb4Au2S6_59_2575.vasp,Bi2Te4Pb4Au2S6,-1.6980019605555556,-0.4171036786805593 -Si2N2Cl2_59_16410.vasp,Si2N2Cl2,-4.6646817233333335,-0.35370384666667 -Ta4O10_11_18079.vasp,Ta4O10,-7.251788325714286,-0.0062039299999998 -Ta2Co4Te6_11_17713.vasp,Ta2Co4Te6,-2.620558201666667,0.2072601792013886 -Mn1Ni1F6_12_10826.vasp,Mn1Ni1F6,-2.064065795,-0.1034529299999997 -Li4S4N1_5_10220.vasp,Li4S4N1,-3.116560411111111,0.0577946556944415 -Al1Tl1Cd1Te4_156_754.vasp,Al1Tl1Cd1Te4,-0.9231892642857142,0.170651029523808 -Ca2Pb4F12_2_3099.vasp,Ca2Pb4F12,-2.9386897616666667,0.1329966127777746 -Pd2Pb4Se4Cl4O12_14_14450.vasp,Pd2Pb4Se4Cl4O12,-2.9616683907692307,0.0992694049999971 -Tl1Cd1In1Se4_156_19238.vasp,Tl1Cd1In1Se4,-1.2131608285714286,-0.0116478645238117 -Sb1_123_15527.vasp,Sb1,-1.47548431,0.8080827625 -Os2O2_187_13859.vasp,Os2O2,-4.754565135,0.8446303474999999 -Cr2Cu2As4Se12_13_4365.vasp,Cr2Cu2As4Se12,-2.09617601,0.209267997099998 -Cd1O2F2_1_3385.vasp,Cd1O2F2,-1.206691266,0.8255534605000002 -Zr1Mn1Br4N1O1_1_21317.vasp,Zr1Mn1Br4N1O1,-3.163576895,0.0514693196874924 -Na1Mo2Br6O2_47_11899.vasp,Na1Mo2Br6O2,-2.2898995536363635,0.0471434872727272 -Zr2Te2F2_59_21703.vasp,Zr2Te2F2,-3.684693396666667,0.1215284999999926 -As4Br12_14_1323.vasp,As4Br12,-1.11523808125,0.0541606412499999 -Co2W2S8Cl2_129_4057.vasp,Co2W2S8Cl2,-2.708789257142857,0.6434509146874937 -Ga2S4_2_6452.vasp,Ga2S4,-2.4673670716666667,0.4032116365624972 -Be10Ir2_26_2209.vasp,Be10Ir2,-3.13200004,0.4775092766666668 -V2Re4O18_31_20148.vasp,V2Re4O18,-5.649763845416667,0.0819819924999993 -Ta2I2N1_2_17754.vasp,Ta2I2N1,-4.638233658,0.506462989952367 -Ag2Sb2Te4_26_405.vasp,Ag2Sb2Te4,-0.88719031875,0.2508676656249999 -Sn6P4O18_31_16996.vasp,Sn6P4O18,-4.734991574642857,0.1829523722619004 -K2Cd4S8I6_31_9057.vasp,K2Cd4S8I6,-0.7152784915,0.0678947857291673 -Sn1S1_123_16676.vasp,Sn1S1,-1.871715725,0.5921144962499998 -Pb2S1Cl2O1_1_14268.vasp,Pb2S1Cl2O1,-2.108094451666666,-0.0606050695833332 -Sb4S4_14_15816.vasp,Sb4S4,-2.45427332,0.2629821254166644 -Li2Sb2O4_13_10061.vasp,Li2Sb2O4,-4.20199457125,0.2036464478124999 -Te2C2_59_18381.vasp,Te2C2,-3.13699023,1.707065353333333 -Tm2S6_51_19684.vasp,Tm2S6,-3.348509625,0.4755661211718749 -Cu3Se1S3I3_1_5386.vasp,Cu3Se1S3I3,-0.7284809379999999,0.1782669154702371 -Na1Au1I4O12_1_11823.vasp,Na1Au1I4O12,-2.442466597777778,0.1388440397222221 -Fe1Br2N2_10_5636.vasp,Fe1Br2N2,-1.809860976,0.9167051660000004 -Y1As2_21_20603.vasp,Y1As2,-3.523640703333333,0.6647799433333295 -Ga1Ir2Rh1S4Br4_1_6208.vasp,Ga1Ir2Rh1S4Br4,-2.315443015,0.0748135149999946 -Ag8Te8_11_585.vasp,Ag8Te8,-0.1481394725,0.2094929704166666 -Li2Cr1P2O8_2_9869.vasp,Li2Cr1P2O8,-4.894156686923077,0.3690685603942266 -V2S2Br2_59_20152.vasp,V2S2Br2,-2.812899165,0.1566565444444418 -Sr4Te8As4F4_14_17482.vasp,Sr4Te8As4F4,-2.4983547130000003,0.0559330745 -Ta1S2_10_17606.vasp,Ta1S2,-4.6713700566666665,0.7493625316666668 -Y2Cl2_164_20719.vasp,Y2Cl2,-3.57564245,0.1800214574999957 -V3C2O2_187_20250.vasp,V3C2O2,-5.868818500000001,0.0815481236111046 -Mn2I1N1Cl1O1_1_11108.vasp,Mn2I1N1Cl1O1,-2.92330749,0.1765835419791627 -Zr1Ni1H6_6_21376.vasp,Zr1Ni1H6,-2.940519015,0.8214544750000001 -Si4P4S4_17_16502.vasp,Si4P4S4,-3.994274885,-0.6184709629166665 -Hf1Br2_115_7129.vasp,Hf1Br2,-2.5773693566666664,0.5846307288888861 -Fe1C2_123_5644.vasp,Fe1C2,-3.786603566666667,2.350903126666661 -As4P2H2O12_4_1343.vasp,As4P2H2O12,-4.8125012125,0.0750416485833289 -Sb2As2S8_11_15535.vasp,Sb2As2S8,-2.5417650675,0.5293357526041609 -Mn2V1Br2N1_1_11332.vasp,Mn2V1Br2N1,-2.7266119483333333,0.3240083425431004 -Ga1Cl2_187_6150.vasp,Ga1Cl2,-1.2596594,0.4637110716666666 -Hf2Ge2Te2_129_7499.vasp,Hf2Ge2Te2,-4.106081176666667,0.086826508333333 -Ge2Se2I2_59_6869.vasp,Ge2Se2I2,-1.7560127816666666,0.1554662852777775 -Si4B2N2_65_16486.vasp,Si4B2N2,-5.15324257,0.2432698262500003 -Sm1Pb2_123_16557.vasp,Sm1Pb2,-1.27516284,0.0545002766666669 -Cu6O2F10_2_5496.vasp,Cu6O2F10,-1.2790691172222222,0.2630820601388872 -Fe3S2O14_164_6062.vasp,Fe3S2O14,-3.617451238421053,0.3567702906798202 -Ag8C4N8_14_584.vasp,Ag8C4N8,-3.6362086755,0.0040705823333266 -Rb2Cd4Se2S6Cl6_31_14820.vasp,Rb2Cd4Se2S6Cl6,-1.0184687085,0.1166545154583327 -Co2Se1S1Br1Cl1_1_4017.vasp,Co2Se1S1Br1Cl1,-1.6398673316666663,0.3765600674074033 -Mn2P2S4Cl2_10_11191.vasp,Mn2P2S4Cl2,-2.758984304,0.2107069705972186 -Tl2Ga2F8_10_19421.vasp,Tl2Ga2F8,-2.476611445,0.2219888683333333 -Ge1Au1F6_2_6638.vasp,Ge1Au1F6,-1.89841815,0.1192994227777766 -B13P2_164_1608.vasp,B13P2,-5.064333468666666,1.1041542212222168 -Ta4Zn4Fe2O16_1_18141.vasp,Ta4Zn4Fe2O16,-5.194243741923076,0.0348848652564028 -Dy2S2I2_59_5532.vasp,Dy2S2I2,-3.239929983333333,0.0473841566666668 -Cr2Ge2Te6_162_4389.vasp,Cr2Ge2Te6,-1.835757431,-0.383094118 -Sn2P1Se6_162_16803.vasp,Sn2P1Se6,-2.1596228211111117,0.1513381677777774 -Li1Fe1Pd1S3I2_8_9697.vasp,Li1Fe1Pd1S3I2,-1.55587737875,0.1184205359374999 -Cr1W3Se8_25_4288.vasp,Cr1W3Se8,-3.528496435833333,-0.2932797545833328 -Li4Mn2F12_4_10200.vasp,Li4Mn2F12,-3.019331826666667,0.0692216277777775 -Hf1Ge1Se1S1I2_6_7181.vasp,Hf1Ge1Se1S1I2,-2.936376585,0.1990261861111059 -Nb2W2S11_5_12941.vasp,Nb2W2S11,-4.008919530666667,0.3261160366249966 -Fe2As1Se2_187_5772.vasp,Fe2As1Se2,-1.801153618,0.2421094345000002 -Ta4Pd6Se10_59_18091.vasp,Ta4Pd6Se10,-3.2544052155000003,-0.2401764635000027 -Sr3Cu2S4Cl2_123_17370.vasp,Sr3Cu2S4Cl2,-2.165663970909091,0.0705282324242384 -K4Hg6S8_13_9464.vasp,K4Hg6S8,-0.5047532416666667,0.1356468774999994 -Nb2S3Br3_8_12849.vasp,Nb2S3Br3,-3.16030756125,0.3644543319843735 -Hg2Cl2_164_7955.vasp,Hg2Cl2,0.86931049,0.3076989075 -Bi1Sb2Au1Se6_143_2384.vasp,Bi1Sb2Au1Se6,-1.632242674,0.3245490076666644 -Cr1Ag1Sb2S6_149_4104.vasp,Cr1Ag1Sb2S6,-2.335775089,0.3096784869687479 -Bi1Se1I1_156_2389.vasp,Bi1Se1I1,-1.201380736666667,0.188301665 -Mg4Bi2_59_10573.vasp,Mg4Bi2,-0.2178776983333333,0.4381882786111112 -Sr3Au2S4I2_123_17354.vasp,Sr3Au2S4I2,-1.79864647,0.0063238860606027 -Ga2Fe2S5_164_6359.vasp,Ga2Fe2S5,-2.803109537777777,-0.29948200777778 -Sb2N18_2_15608.vasp,Sb2N18,-5.8541729455,-0.6454406779999996 -Cu4Se1Br2Cl4_1_5465.vasp,Cu4Se1Br2Cl4,-0.372447689090909,0.1745689199999986 -Ta1S1Br1_156_17601.vasp,Ta1S1Br1,-4.0651248,0.3030968559523773 -B2Au2Cl2O2_31_1651.vasp,B2Au2Cl2O2,-2.48434414,1.5936884905555506 -C1I4_123_2732.vasp,C1I4,-0.1083237419999999,1.2099245655 -Te4Pd3_10_18618.vasp,Te4Pd3,-1.1208597928571429,0.1924583549999986 -Li4H7Rh1S3O13_143_10197.vasp,Li4H7Rh1S3O13,-4.183752177857143,0.2410680854404689 -Ag1Te2_12_145.vasp,Ag1Te2,-0.3899821699999999,0.3723680441666667 -Ti1O1F1_8_18819.vasp,Ti1O1F1,-5.89842147,-0.0727418533333388 -Ga1Ir1S2I2_6_6207.vasp,Ga1Ir1S2I2,-2.0418981933333336,0.1183269224999945 -Sc2S1I1Br1_8_16128.vasp,Sc2S1I1Br1,-2.99764513,0.025899260749998 -Al1Pd5I2_123_712.vasp,Al1Pd5I2,-1.1278149525,-0.0044063454427084 -Mn3Se1Br1Cl3_1_11405.vasp,Mn3Se1Br1Cl3,-1.6807760625,0.1419764279795238 -Os1F2_164_13800.vasp,Os1F2,-2.491988703333333,0.6205628204999973 -H14O8_16_6980.vasp,H14O8,-3.873991108636364,0.3890815844128754 -Sb10Se10_26_15411.vasp,Sb10Se10,-2.0587681985,0.2890095052499977 -Nb3C2_187_12965.vasp,Nb3C2,-6.97307704,0.846557727624992 -Os1W1Se2I4_1_13829.vasp,Os1W1Se2I4,-1.78428714875,0.0329309946875 -Mo2C2Br2_59_11587.vasp,Mo2C2Br2,-3.72817307,0.4953957070833266 -Hf2S2_10_7576.vasp,Hf2S2,-4.81388119,0.5912754800000002 -Ag2Pd2I6O18_2_369.vasp,Ag2Pd2I6O18,-2.320577757142857,0.0947922730357121 -Mn2Sb2Te4Cl2_26_11257.vasp,Mn2Sb2Te4Cl2,-1.56241795,0.2767345644999979 -Hf1Ge1Te3Se1_6_7183.vasp,Hf1Ge1Te3Se1,-2.924739565,-0.0274702299999997 -Cr1Bi2_187_4127.vasp,Cr1Bi2,-1.33105251,0.7138537099999984 -Mn3S2I1Br1_6_11400.vasp,Mn3S2I1Br1,-1.89421567,0.2266348591071414 -Na2Ni2As2_12_12236.vasp,Na2Ni2As2,-1.1475908083333333,0.1542034883333334 -As3Pb5O9_174_1315.vasp,As3Pb5O9,-3.5869511411764705,0.265653444013838 -Bi2S2I2_59_2514.vasp,Bi2S2I2,-1.5439674333333333,0.0631381900000001 -Cu1Pd2S4_187_4942.vasp,Cu1Pd2S4,-1.7722908214285713,0.2132101379761871 -Ni1H4C8F2_25_13353.vasp,Ni1H4C8F2,-5.064988558666667,0.9532911959999908 -Fe2Te4P2Br2_26_6015.vasp,Fe2Te4P2Br2,-1.637466844,-0.45590667425 -Cr2C1F2_164_4340.vasp,Cr2C1F2,-3.993961468,0.1492089499999955 -Ni1H4N6Cl2_47_13356.vasp,Ni1H4N6Cl2,-3.948737378461538,0.2555573728846081 -Sb2Te2O1_164_15719.vasp,Sb2Te2O1,-2.372874706,0.2771592324999976 -Ga18Te9_143_6107.vasp,Ga18Te9,-1.5281260774074072,0.1256403931481469 -Ca2Ag1Te2Br2_38_2916.vasp,Ca2Ag1Te2Br2,-1.064700192857143,0.3319087394047592 -P6Pb2_164_14138.vasp,P6Pb2,-3.02091881375,0.3939725035714274 -Ti2S1Br2_1_18990.vasp,Ti2S1Br2,-4.024899432,-0.0390444299999992 -Ni1H4C6Br2N2_25_13343.vasp,Ni1H4C6Br2N2,-4.977864266,0.3916888259999931 -Se4Cl4_12_16298.vasp,Se4Cl4,-1.18821367125,0.2199692425 -Au2I2O2_59_1485.vasp,Au2I2O2,-0.4907073033333333,0.6953678288333315 -Nd1_191_13231.vasp,Nd1,-0.84353846,1.4873288525 -Na2Cr4O10_59_12064.vasp,Na2Cr4O10,-4.6071709275,-0.1602209453515627 -Al1Ga1Hg1O4_156_661.vasp,Al1Ga1Hg1O4,-3.7517069542857135,0.1083985563988037 -Y4B3F2_164_20807.vasp,Y4B3F2,-4.900523333333333,0.4165691099074027 -Na2B2S2N2_31_11984.vasp,Na2B2S2N2,-4.055308575,1.0341319600000003 -B2Cl6_26_1664.vasp,B2Cl6,-2.50237598625,0.04080441875 -P6Se8I4_2_14146.vasp,P6Se8I4,-2.0520620127777778,0.1909082306712924 -Ta1S2_164_17608.vasp,Ta1S2,-5.29690872,0.123823868333333 -Fe2Sb2S4F2_26_5955.vasp,Fe2Sb2S4F2,-2.515105457,-0.0330839542000043 -Co2Ni1O6_8_3938.vasp,Co2Ni1O6,-3.4089491644444445,-0.5654091556944467 -Nb2H2S2N1_164_12735.vasp,Nb2H2S2N1,-4.932522705714286,0.1204509352380847 -Cd1C4N2Cl2F4_47_3295.vasp,Cd1C4N2Cl2F4,-4.074383518461539,0.125585628269218 -Sc3C2Cl2_187_16198.vasp,Sc3C2Cl2,-4.540852504285715,0.1740709512211925 -Ta1Cr1F6_123_17532.vasp,Ta1Cr1F6,-3.75913719625,0.4572002787499962 -Nb2B1H2_164_12631.vasp,Nb2B1H2,-5.184398174,0.2722940210000009 -Ga2Te2H2S8_11_6503.vasp,Ga2Te2H2S8,-2.4874416092857143,0.2208661063095195 -K2H6C4S6_2_9143.vasp,K2H6C4S6,-3.881900933888888,0.1034050266666566 -Zn2Sb4S6F4_31_21160.vasp,Zn2Sb4S6F4,-2.105471595625,0.3994850329999974 -Sb1Te2O6F1_1_15515.vasp,Sb1Te2O6F1,-3.371190597,0.4200274325625011 -Rh2Cl2_129_15183.vasp,Rh2Cl2,-0.699131635,1.3003720524999984 -Ir2O2_187_8797.vasp,Ir2O2,-3.6064084975,1.1796527450000005 -Sb2Se2_12_15701.vasp,Sb2Se2,-1.977963765,0.3698139387499979 -As2Ru2O6_8_1286.vasp,As2Ru2O6,-4.20413499,0.4820522434999952 -Zn2Te6As2_147_21189.vasp,Zn2Te6As2,-0.951077324,0.311911301166665 -Ca2P4H16C4O12_13_3093.vasp,Ca2P4H16C4O12,-5.0115337344736846,0.0221889474268789 -P4C3_156_14076.vasp,P4C3,-5.030360014285714,0.7600628671428518 -K4P4H12N4O12_14_9489.vasp,K4P4H12N4O12,-4.6173737375,0.1507318544444444 -Ta4Fe2O10_59_18036.vasp,Ta4Fe2O10,-6.15038598875,0.4619840149999996 -Zr1Pt3O8_10_21410.vasp,Zr1Pt3O8,-4.12725571,0.3292550258333335 -Co2Se4O16_14_4027.vasp,Co2Se4O16,-3.420937955909091,0.1647638040909022 -Te2W2I2_59_18529.vasp,Te2W2I2,-2.049687438333333,0.5081068140277778 -Ti1Ge1Te1Se1S1Br1_6_18786.vasp,Ti1Ge1Te1Se1S1Br1,-3.1350825216666665,0.0325073838888851 -Cd2As2Se6_147_3456.vasp,Cd2As2Se6,-1.450373076,-0.0699487471666688 -Hf1Zr1Br1N2Cl1_6_7376.vasp,Hf1Zr1Br1N2Cl1,-5.787139515,0.0614370908333334 -Na2I6O16_81_12183.vasp,Na2I6O16,-2.558903115,0.169016129583333 -Li6H2S2O8_11_10266.vasp,Li6H2S2O8,-4.376033222777778,-0.0005891530555595 -K2H8S4Cl2_2_9163.vasp,K2H8S4Cl2,-2.703512685,0.1011105106249994 -Nb2S2I2_59_12840.vasp,Nb2S2I2,-3.610971178333333,0.0838312175000002 -Sb1Pt1_187_15485.vasp,Sb1Pt1,-1.413945985,0.8444181549999998 -Ag4S2_4_543.vasp,Ag4S2,-0.2590177733333333,0.1593259133333333 -Fe2N1Cl2_164_5880.vasp,Fe2N1Cl2,-2.392103284,0.3999970160000003 -Fe2Mo2S14_113_5873.vasp,Fe2Mo2S14,-2.6429485922222224,0.1304278520138863 -Cr2P4Au2Se12_13_4458.vasp,Cr2P4Au2Se12,-2.314554228,0.0511089784374982 -Sr2B2S6Cl2_59_17138.vasp,Sr2B2S6Cl2,-3.1379391991666665,0.3233142848611076 -Rb2Cd4Te2S6I6_31_14830.vasp,Rb2Cd4Te2S6I6,-0.6403017765000001,0.1881428618749979 -Rb2Cd4Se2S6F6_31_14821.vasp,Rb2Cd4Se2S6F6,-1.34506493,0.4427443844583328 -Al2Co2O5_187_802.vasp,Al2Co2O5,-4.748411274444445,-0.0277062533333387 -Eu3Se3_123_5609.vasp,Eu3Se3,-3.737151155,-0.1682829349999997 -B1C1_187_1620.vasp,B1C1,-6.448434995,0.7741690520833329 -Ga3Se4_164_6537.vasp,Ga3Se4,-2.323481695714286,0.1222146378571404 -Na2Mg1Se2O8F4_2_12196.vasp,Na2Mg1Se2O8F4,-2.758379015882353,0.5537020368872484 -Sr1Au2Br2O2_1_17024.vasp,Sr1Au2Br2O2,-1.46235753,0.2206718346428569 -Fe1W2Cl10_5_5768.vasp,Fe1W2Cl10,-2.0545910184615384,0.0575750023076908 -Pb4W4O16_14_14323.vasp,Pb4W4O16,-5.191466115416667,0.1695338937499997 -Nb1Te2_187_12604.vasp,Nb1Te2,-3.279189816666667,0.109730544444444 -Co1S2_187_3819.vasp,Co1S2,-2.5071004733333333,0.4836638508333335 -Fe3B2F2_187_6042.vasp,Fe3B2F2,-2.784300952857143,0.0629659071428516 -Pt5Br1Cl1O5_1_14712.vasp,Pt5Br1Cl1O5,-2.217444875,0.3331435768749973 -Ir2S4I2_5_8828.vasp,Ir2S4I2,-2.09316795,0.1285305079687497 -Ta2Cl2_164_17692.vasp,Ta2Cl2,-4.5855233675,0.5946146037500006 -Te2P1_115_18433.vasp,Te2P1,-1.7108543066666666,0.6856681927777759 -Ru2Cl2_164_15308.vasp,Ru2Cl2,-1.866334965,0.7619801166666642 -Cd1H1S1F1_156_3332.vasp,Cd1H1S1F1,-1.6509515625,0.292125918125 -Cr6Se4Cl2O16_2_4629.vasp,Cr6Se4Cl2O16,-3.9578790664285712,0.1601592427976157 -Mn2H2N1_164_11091.vasp,Mn2H2N1,-3.623855612,-2.431970976200002 -Al2H6O6_8_869.vasp,Al2H6O6,-4.906808455714286,-0.3799329445238135 -Mn1Sn1Ge1Br1Cl1O5_1_10892.vasp,Mn1Sn1Ge1Br1Cl1O5,-3.56832229,0.1138399380416652 -Pb3N4_156_14302.vasp,Pb3N4,-3.0537801642857145,0.6775856714285688 -Ta2Br4O2_47_17669.vasp,Ta2Br4O2,-4.306893645,-0.0005471925 -Na1Sb1Br3Cl1_1_11927.vasp,Na1Sb1Br3Cl1,-1.263954426666667,0.1623209393749988 -Ga8S12_14_6589.vasp,Ga8S12,-2.8534292505,0.0676882394999998 -Zr2Br1Cl1O1_8_21514.vasp,Zr2Br1Cl1O1,-4.046872051999999,0.3198118246666652 -Pt1N4Cl4_123_14581.vasp,Pt1N4Cl4,-1.6794666511111112,1.2800746622222197 -Cu2Ge1Br2O2_1_5098.vasp,Cu2Ge1Br2O2,-1.905331722857143,0.405041681785711 -Rb2Hg4Se2S6Cl6_31_14881.vasp,Rb2Hg4Se2S6Cl6,-0.789421778,0.2519005828124994 -Te20As8_14_18340.vasp,Te20As8,-1.6836160192857144,0.2750909190476174 -K2H2_129_9129.vasp,K2H2,-1.153668435,0.35251217 -Mg1Ga2Se4_164_10364.vasp,Mg1Ga2Se4,-2.3745739285714285,0.0562103885714289 -N1Cl5_1_11772.vasp,N1Cl5,-0.6708941433333333,0.4207936124999964 -Sn2Sb6_164_16873.vasp,Sn2Sb6,-1.66968232875,0.3901658707812498 -Dy1Sb2_21_5513.vasp,Dy1Sb2,-2.339837923333333,0.6560806975925901 -Au2Br2_67_1455.vasp,Au2Br2,0.3702259575,0.0712360412499999 -Dy2I6_59_5529.vasp,Dy2I6,-1.55121182375,0.0739285462499999 -B3Os2_123_1738.vasp,B3Os2,-5.19862514,0.9626797639999998 -P8Se8O4_2_14160.vasp,P8Se8O4,-3.409381428,0.2765245048666619 -In2Se2_164_8586.vasp,In2Se2,-1.8356614425,0.0677539200000001 -Zr2P2Se6_2_21629.vasp,Zr2P2Se6,-3.455679816,0.2382464639999999 -Al1Ir1Se1S1Br2_1_684.vasp,Al1Ir1Se1S1Br2,-2.241122416666667,0.2296811544791592 -Ag4Sb4_51_557.vasp,Ag4Sb4,-0.4883704425,0.2341220925 -Ge2S2Br2_59_6822.vasp,Ge2S2Br2,-2.230341196666666,0.1708038588541667 -Nb4V2S12_14_13178.vasp,Nb4V2S12,-4.4826442194444445,0.0771564418055521 -Sn4P4Se8S1Cl3_1_16952.vasp,Sn4P4Se8S1Cl3,-2.2470080305,0.1805002369114542 -Cu4S4F8_14_5455.vasp,Cu4S4F8,-1.422131086875,0.20513913296875 -Mn4Br14_13_11425.vasp,Mn4Br14,-0.784419296111111,0.2000610772222213 -In3Rh1_187_8652.vasp,In3Rh1,-0.76273608,0.904357081875 -Mn1Ge1Te2Br4_1_10751.vasp,Mn1Ge1Te2Br4,-1.26940777,0.2213284707291667 -Pt3S2I2N1_6_14692.vasp,Pt3S2I2N1,-1.87709242375,0.3154253284375 -Te2W2Cl2_59_18527.vasp,Te2W2Cl2,-2.419246103333333,0.6233004074999963 -Fe1C6I2F4_47_5650.vasp,Fe1C6I2F4,-4.00461382,0.4065815808653804 -Cu2Sb2S4_26_5266.vasp,Cu2Sb2S4,-1.9401142475,0.1617257943750001 -Sr1Fe1S1Br2_1_17048.vasp,Sr1Fe1S1Br2,-1.933233376,-0.0346259339999998 -Zr1Nb1S2I2_25_21353.vasp,Zr1Nb1S2I2,-3.526556288333333,-0.0474439676851921 -Ba2Na2_11_2032.vasp,Ba2Na2,0.380593615,0.5490975849999999 -Nb1Ni1Br1Cl1O2_1_12541.vasp,Nb1Ni1Br1Cl1O2,-3.533418688333333,0.5655061267708285 -Cr2Ag2Sb4Te12_13_4303.vasp,Cr2Ag2Sb4Te12,-1.3556941835,0.2057010521249983 -Zr1S2_164_21417.vasp,Zr1S2,-4.729289836666667,0.0695807308333327 -Mn2W2S2O12_8_11341.vasp,Mn2W2S2O12,-4.696068149999999,0.2900471757070626 -Zr2Br1Cl1O2_6_21515.vasp,Zr2Br1Cl1O2,-4.8369248266666665,0.2130499733333337 -Sn8S2I12_11_17010.vasp,Sn8S2I12,-0.9438087081818182,0.0896268611363615 -V2N1_164_20112.vasp,V2N1,-4.653664863333334,1.110018464444444 -Rh2Br6_162_15178.vasp,Rh2Br6,-0.9930798825,0.0698290974999999 -In1Cu1Sb2Te6_149_8237.vasp,In1Cu1Sb2Te6,-1.1493378829999998,0.3398716426666653 -Zn2P2Se6_147_21132.vasp,Zn2P2Se6,-1.821747498,0.0380496679999999 -Cd1S1Br1F1_156_3407.vasp,Cd1S1Br1F1,-0.7098964,0.38289325640625 -Mg3Sb3_25_10561.vasp,Mg3Sb3,-1.1258898933333332,0.3551992922916649 -Mn2Bi2S4Cl2_10_11009.vasp,Mn2Bi2S4Cl2,-2.213165911,0.2244873219999998 -Zn2W2O8_13_21193.vasp,Zn2W2O8,-4.772006640833333,0.1291827374999998 -Hg2Bi2S4Br2_11_7938.vasp,Hg2Bi2S4Br2,-0.998801044,0.1868919080000001 -Ti1Co3O8_164_18768.vasp,Ti1Co3O8,-4.51229283,-0.2712995176041712 -Sr3Ag2I2O4_123_17345.vasp,Sr3Ag2I2O4,-2.4969065118181817,-0.0362801113636388 -Sn1S2_115_16680.vasp,Sn1S2,-2.421308556666667,0.1918265099999998 -Zn2H4S10_7_21098.vasp,Zn2H4S10,-2.2868947725,0.2046782830781247 -Mn1Au1Se1Br1_1_10641.vasp,Mn1Au1Se1Br1,-0.80543743,0.9105298690625 -Ba2_65_2094.vasp,Ba2,1.140660545,1.532240965 -Mn2S2_123_11223.vasp,Mn2S2,-2.66745736,0.2900788624999997 -Zr3Se2N2F2_187_21785.vasp,Zr3Se2N2F2,-4.61114826,1.0074312987499905 -Zr1Ti1I1F3_1_21469.vasp,Zr1Ti1I1F3,-3.6642675866666665,0.7280749603472163 -V3B2O2_187_20243.vasp,V3B2O2,-5.23686875,0.5816579049206307 -Bi1P1W1_156_2353.vasp,Bi1P1W1,-3.520782833333333,-0.3886517216666698 -La2C1_164_9583.vasp,La2C1,-4.258799663333334,0.256181841666662 -Fe2Se2S8_31_5976.vasp,Fe2Se2S8,-2.100946681666666,0.1244093011805532 -Rb2Hg4Se2O6F6_31_14879.vasp,Rb2Hg4Se2O6F6,-1.654168313,0.2450040219999987 -Mn2I2O2_59_11111.vasp,Mn2I2O2,-2.517841468333333,0.0895140865972194 -Hg1P1_156_7892.vasp,Hg1P1,0.08412449,0.8797247193965518 -Cr2S2I1Br1_6_4465.vasp,Cr2S2I1Br1,-2.3490354566666665,-0.1488263666666665 -Sc1Te1Cl1_156_16013.vasp,Sc1Te1Cl1,-2.840576693333333,0.1543661144444419 -Rb3Mn2Cl7_123_14957.vasp,Rb3Mn2Cl7,-1.4578388775000002,0.2045387295833315 -S1I2O6_5_15379.vasp,S1I2O6,-3.029466231111111,0.0800733594444444 -Y1Cl2_123_20621.vasp,Y1Cl2,-3.40350274,0.1681084647222188 -Bi2P2S6_7_2492.vasp,Bi2P2S6,-2.783918014,-0.0168472567000002 -Ni1Te2_164_13435.vasp,Ni1Te2,-0.7142100233333334,0.0252818966666665 -Nb2I2O2_59_12745.vasp,Nb2I2O2,-4.438232215,0.1162634594444402 -Ta2Ag2Se4O14_51_17644.vasp,Ta2Ag2Se4O14,-4.379862334090909,0.0908232218181819 -Sr5Y1_1_17492.vasp,Sr5Y1,0.2242460083333333,1.1918090724999972 -Mg2I4O12_4_10469.vasp,Mg2I4O12,-2.9891303133333333,0.146449319722222 -Cu2Se4_6_5314.vasp,Cu2Se4,-1.1012230783333334,-0.8851330233333334 -Fe3Sn1Te2_187_6070.vasp,Fe3Sn1Te2,-0.70702965,0.6202215137499986 -Ru2S2I1Br1_25_15340.vasp,Ru2S2I1Br1,-2.34533975,0.1882662317777741 -B1Mo2O2_164_1626.vasp,B1Mo2O2,-4.811145034,1.2920407689166673 -In1Ag1P2S6_149_8180.vasp,In1Ag1P2S6,-2.697149702,0.0663041314999999 -Hf1Ag1Br2Cl2_1_7100.vasp,Hf1Ag1Br2Cl2,-1.9383088283333332,0.3307889456249968 -Na2C2S2N2_31_12001.vasp,Na2C2S2N2,-4.781776245,-0.0687685208333388 -Ti3B2Se2F2_8_19068.vasp,Ti3B2Se2F2,-4.542400513333333,0.2611719385185147 -Mn1H8C10N8O2_2_10767.vasp,Mn1H8C10N8O2,-5.881963915517241,0.3805811893390751 -Mo2Se2S2_156_11688.vasp,Mo2Se2S2,-3.4005283150000003,0.0052376058333332 -Mn1H2S2_12_10764.vasp,Mn1H2S2,-3.054703826,0.3997538207499955 -Au2S2_10_1519.vasp,Au2S2,-0.85197589,0.159812675 -Zr1Fe1I6_5_21292.vasp,Zr1Fe1I6,-1.0654532325,-0.1375978344791666 -Cu1Ag1Cl3O1_1_4817.vasp,Cu1Ag1Cl3O1,-0.5966446983333333,0.2505664618749976 -Pt3Cl2O4_1_14689.vasp,Pt3Cl2O4,-2.191175618888889,0.4786181806790099 -Pt1S2_115_14588.vasp,Pt1S2,-2.0110902166666667,0.6340545033333331 -Au3S2Br2_2_1562.vasp,Au3S2Br2,-0.3937397328571428,0.10632672375 -Sn2Br2O3_6_16745.vasp,Sn2Br2O3,-2.904789267142857,0.1996752430357102 -Bi2S2_187_2517.vasp,Bi2S2,-1.8635202875,-0.5745240408333343 -Ag1Hg1Se4_1_80.vasp,Ag1Hg1Se4,-0.6021829716666667,-0.3103713869444456 -Co1Ni1Br1F3_1_3782.vasp,Co1Ni1Br1F3,-1.3443714416666666,0.1196521816666666 -Y2S2_129_20774.vasp,Y2S2,-5.168623715,-0.0265627649999995 -P2I4_2_13986.vasp,P2I4,-1.07759991,0.0639605016666663 -K8P8H8N8O16_14_9556.vasp,K8P8H8N8O16,-4.773529114791667,0.1182882882638889 -Zr1Nb1S2I3Cl1_1_21354.vasp,Zr1Nb1S2I3Cl1,-2.70025012875,0.0431601395312502 -Mg4H2O5_164_10577.vasp,Mg4H2O5,-4.500594141818183,-0.3208576181818228 -Ta2O3_1_17814.vasp,Ta2O3,-6.620310704,0.8880407947999998 -Ni5Ge2Bi1Sb1Te2Mo1_8_13772.vasp,Ni5Ge2Bi1Sb1Te2Mo1,-1.0036017158333337,0.4007649691111078 -Na1Sb2Pd1S6_149_11929.vasp,Na1Sb2Pd1S6,-2.224918438,0.3691511192187475 -Nd2Br2O4_11_13234.vasp,Nd2Br2O4,-4.18126815875,0.2927931675000002 -Ti3H2C2S2_187_19080.vasp,Ti3H2C2S2,-5.815973875555556,0.300246757013871 -Li2H2Se2_4_9933.vasp,Li2H2Se2,-2.8116231566666667,0.0963247433333331 -Ga1Ge1I2_6_6191.vasp,Ga1Ge1I2,-1.1421633525,-0.0015625618749999 -V3Ge2S6Br1Cl2_1_20261.vasp,V3Ge2S6Br1Cl2,-3.028069070714285,0.148051294285709 -Ta1Ti1Se1S1_8_17635.vasp,Ta1Ti1Se1S1,-5.250867295,-0.1357587809091016 -Tl1Ni5Cl2_123_19306.vasp,Tl1Ni5Cl2,0.37625971,3.79253953625 -Fe2Bi4I4O6_11_5815.vasp,Fe2Bi4I4O6,-2.5881214675,-0.0253630212740415 -Mn6Cl18_164_11466.vasp,Mn6Cl18,-1.4250374045833334,0.0917666010416666 -C1F2_164_2727.vasp,C1F2,-1.9562274566666664,2.15932549166666 -Nb1Cu1S1Br2_6_12499.vasp,Nb1Cu1S1Br2,-2.151336282,0.4917374823333296 -K2Mn2P2O6F6_2_9241.vasp,K2Mn2P2O6F6,-4.000994582222223,-0.2463319619444484 -Ag2Hg2Te2F2_26_307.vasp,Ag2Hg2Te2F2,0.02218089625,0.2162999377370689 -Tl1Ag1P2O6_149_19201.vasp,Tl1Ag1P2O6,-3.993164995,0.4654023676249998 -Be1As2O4F4_5_2213.vasp,Be1As2O4F4,-3.815285514545455,0.1194109494090869 -Fe1Pb2C6N6_164_5736.vasp,Fe1Pb2C6N6,-5.870629743333334,0.1799462384999949 -Hf2Sn2Se8_31_7622.vasp,Hf2Sn2Se8,-3.2280814825,0.2088637225000003 -Bi8I8_12_2684.vasp,Bi8I8,-0.6805492125,-0.1984238633333338 -K2Mg1Se2O8F4_2_9224.vasp,K2Mg1Se2O8F4,-2.6462344811764704,0.4846957073529355 -Bi4Pd2O8_90_2634.vasp,Bi4Pd2O8,-2.900084496428572,0.5902640935714252 -Nb2Se2F2_59_12871.vasp,Nb2Se2F2,-4.29481366,-0.0309461609166741 -Sn1Ge1Se2Br2_1_16636.vasp,Sn1Ge1Se2Br2,-1.7195864716666664,0.1659757594444446 -Os2S4_51_13877.vasp,Os2S4,-3.3011841816666667,0.9969333241666662 -Ni1H4Br2N6_47_13330.vasp,Ni1H4Br2N6,-3.853900612307693,0.191284027499992 -Sr2Br1N2_164_17149.vasp,Sr2Br1N2,-2.435382578,1.2574993427499903 -Co2Se2_129_4022.vasp,Co2Se2,-1.9540741425,0.1989488248333306 -As1S1F1_156_1169.vasp,As1S1F1,-2.75084982,0.4667749177777751 -Pb2Se2_129_14292.vasp,Pb2Se2,-1.54012921,0.4098349334375 -Ca1Ag1Se1S1I2_1_2794.vasp,Ca1Ag1Se1S1I2,-1.12632779,0.1697660150034667 -Sr2N1_25_17281.vasp,Sr2N1,-2.088949166666666,0.5152875033333335 -Sr1S2F2_1_17076.vasp,Sr1S2F2,-2.627849786,0.7074141357500008 -K4V1C7N7_5_9525.vasp,K4V1C7N7,-5.5901284036842105,0.2741676060964801 -Cr2Ag2Sb4S12_13_4301.vasp,Cr2Ag2Sb4S12,-2.387456629,0.2579969469687477 -P4S8_31_14118.vasp,P4S8,-3.168920415833333,0.1147978390624935 -Ta2Si2Bi2_129_17884.vasp,Ta2Si2Bi2,-4.384878176666667,0.0821464226984023 -Tb2H4Cl2O4_11_18200.vasp,Tb2H4Cl2O4,-4.663509239166666,0.0895810966666674 -Fe1Sn2_123_5762.vasp,Fe1Sn2,-0.6490378099999999,-1.1316818361111105 -C1N1_187_2734.vasp,C1N1,-6.73165851,0.3255371883333271 -Ru1O2_115_15278.vasp,Ru1O2,-4.014621586666666,0.949092078333334 -Nb4Se2Br2O2_1_13150.vasp,Nb4Se2Br2O2,-4.667361962999999,-0.112538735089297 -Ba1Au2O8_89_1804.vasp,Ba1Au2O8,-2.639652832727273,0.348107304999997 -Cs2Se2N2O6F6_1_4788.vasp,Cs2Se2N2O6F6,-2.673415915,0.550165993749991 -Cr1Sb2_187_4259.vasp,Cr1Sb2,-2.12872431,1.1273146283333306 -K4Cr4I4O24_14_9438.vasp,K4Cr4I4O24,-3.6072263127777777,-0.143656016041674 -Cs2Te2C2Cl6O6_4_4789.vasp,Cs2Te2C2Cl6O6,-2.637084968888889,0.6793282971527774 -Cd1C6Cl2F4_10_3298.vasp,Cd1C6Cl2F4,-3.886478876153846,0.6036597692307624 -V1P2_164_19900.vasp,V1P2,-3.90832124,0.6054811516666665 -Nd4B2C2_12_13249.vasp,Nd4B2C2,-4.8199670625,0.252458185 -Sn1H1S3_1_16640.vasp,Sn1H1S3,-2.5300701620000003,0.2691603436874974 -Co1H4C4N14_2_3754.vasp,Co1H4C4N14,-5.899331082608696,-1.347499009492762 -Si1S2_187_16361.vasp,Si1S2,-3.2630672966666663,0.6181552566666673 -Y2Cl6_59_20722.vasp,Y2Cl6,-3.41251827,0.0432741631249999 -Sr2Tl1Cd1Ag1S5_99_17333.vasp,Sr2Tl1Cd1Ag1S5,-1.593775454,0.2306309963124972 -Sc1Te3_99_16018.vasp,Sc1Te3,-1.970197305,0.544020540625 -Sb8O12_51_15869.vasp,Sb8O12,-3.954250039,0.3032404285000001 -Sn1F4_123_16631.vasp,Sn1F4,-2.471370348,0.0837278839999999 -W4C3S2F2_164_20578.vasp,W4C3S2F2,-5.026802965454546,0.3794145608333215 -W2N1O2_12_20510.vasp,W2N1O2,-6.226068612000001,-0.0780177434830002 -Rb2H6C4O6_2_14854.vasp,Rb2H6C4O6,-4.866400858333333,0.1352517032638831 -Gd2Bi2S4O2_129_6598.vasp,Gd2Bi2S4O2,-4.175459064,-0.5050839153333379 -Mn1Cu1W1S4_1_10697.vasp,Mn1Cu1W1S4,-2.839590601428572,0.4604634896428539 -Zr2Sn2S8_31_21692.vasp,Zr2Sn2S8,-3.5773944458333333,0.1390545477083296 -Rh2S2_187_15223.vasp,Rh2S2,-2.64522936,0.3615159398913014 -La2Pb12Br2O14_51_9606.vasp,La2Pb12Br2O14,-3.621286764,0.0571063200000003 -Ni1C4N2O4F8_10_13298.vasp,Ni1C4N2O4F8,-3.9004833242105263,0.3733335566885852 -Sb2W2O10_85_15748.vasp,Sb2W2O10,-5.075304966428571,0.1690341498214245 -Fe3Si1Se2_187_6068.vasp,Fe3Si1Se2,-1.8445770416666667,0.3283421549999976 -Hf1Ti1S1I3Br1O1_1_7334.vasp,Hf1Ti1S1I3Br1O1,-3.3453565225,0.2681942385937503 -Bi1Pd2S2_187_2358.vasp,Bi1Pd2S2,-1.765685258,0.1465755396249966 -Sr2I4O8_125_17258.vasp,Sr2I4O8,-2.676839107142857,0.2566154265079354 -Ag2Se2Cl2_59_430.vasp,Ag2Se2Cl2,-0.4909761483333333,0.2536256145833327 -Zn2H16C12O8_2_21093.vasp,Zn2H16C12O8,-5.107017748421053,0.1067842137719243 -Mn1Sn2C6N6_164_10900.vasp,Mn1Sn2C6N6,-5.994893662,-0.3306116555000038 -Rh1Au1Br2O2_1_15141.vasp,Rh1Au1Br2O2,-1.5705673649999998,0.4036377202083334 -W2C2I2_59_20478.vasp,W2C2I2,-4.371064256666666,0.2264782331944375 -Cr1C3_187_4135.vasp,Cr1C3,-5.24464152,1.681898705624994 -Nb2Sn1Te2_8_12893.vasp,Nb2Sn1Te2,-3.161916102,-0.1617934322499996 -Ca3Cu2Br2O4_123_3166.vasp,Ca3Cu2Br2O4,-2.971977413636364,-0.1743813536363678 -Rh2I6_189_15199.vasp,Rh2I6,-0.20854308,0.4081261324999999 -Br6N2_31_2713.vasp,Br6N2,-0.95270130375,0.4258875343750001 -Cr1Cl2O1_47_4140.vasp,Cr1Cl2O1,-2.945562115,-0.3385395133854193 -V2Cu1O6_12_20046.vasp,V2Cu1O6,-4.541212851111111,0.2037658594444349 -Nb1I1Br1_156_12518.vasp,Nb1I1Br1,-2.2143378433333334,0.447468484791663 -Rh4S8_2_15253.vasp,Rh4S8,-2.8385610433333333,0.3422068599999972 -Te20P8_14_18342.vasp,Te20P8,-1.8229267582142856,0.4557762065476161 -Tl2Pd4Se6_164_19488.vasp,Tl2Pd4Se6,-1.5159352625,0.1594687924999998 -In2P2S6_149_8521.vasp,In2P2S6,-2.530678526,0.4657217238749968 -Mn1Ag1Te1Br1O1_6_10621.vasp,Mn1Ag1Te1Br1O1,-1.6296602320000002,0.1749931431249999 -Fe3Cu1N1O5_8_6049.vasp,Fe3Cu1N1O5,-3.093916922,0.7037666031527727 -Zn2In2Se5_156_21112.vasp,Zn2In2Se5,-1.3255076022222223,0.146171421944443 -B2Mo3S2_187_1682.vasp,B2Mo3S2,-4.3490725842857145,0.1233351492857106 -Na1Al1P2S6_5_11813.vasp,Na1Al1P2S6,-3.278122386,0.0689017805000005 -Y2Cl6_191_20721.vasp,Y2Cl6,-3.3269435475,0.128848885625 -Ag1Ge1S1I1_8_62.vasp,Ag1Ge1S1I1,-1.2487885325,-0.296951258125 -Ba2I2Cl2_129_2001.vasp,Ba2I2Cl2,-2.026143573333333,0.1361485583333332 -Pd4C12_1_14516.vasp,Pd4C12,-5.14858395125,1.3506468162499994 -Fe2As2S4Br2_26_5779.vasp,Fe2As2S4Br2,-2.295284934,-0.2401536987083354 -Sn4Sb4Se4_17_16966.vasp,Sn4Sb4Se4,-1.8808677241666667,-0.0688264500000015 -Ni1O2F2_164_13383.vasp,Ni1O2F2,-1.445929952,0.6598630395000001 -Hf1Zr1Te3Cl1_1_7406.vasp,Hf1Zr1Te3Cl1,-3.06401658,0.40034736489583 -Tl2Te5_12_19557.vasp,Tl2Te5,-0.8303236985714285,0.3242082076190464 -K1Ti1O2_156_8945.vasp,K1Ti1O2,-4.96811433,0.4438336638750009 -Ti4N3_164_19146.vasp,Ti4N3,-7.765376478571427,0.366449846071422 -U2H4O8_53_19713.vasp,U2H4O8,-6.124448690714286,0.1133244089285714 -Zr1Ni3Te1S1I2_6_21384.vasp,Zr1Ni3Te1S1I2,-1.1547141475,1.051954455260411 -K2H6Pd1S6_147_9154.vasp,K2H6Pd1S6,-2.62907891,0.0933740811666671 -Ta2Te4Br10O1_2_17912.vasp,Ta2Te4Br10O1,-2.0909828211764707,-0.2471947775000023 -Ta1Br2_164_17519.vasp,Ta1Br2,-2.8921694833333333,0.5174547330952317 -Na1P2Pd1O6_149_11923.vasp,Na1P2Pd1O6,-4.336452808,0.5407815237499952 -H6Pb2S4N6_2_7087.vasp,H6Pb2S4N6,-4.093922046666666,-0.4244031401475716 -Nb1Zn1S2Br1_1_12617.vasp,Nb1Zn1S2Br1,-2.494012752,0.4376360800249987 -Ti2F6_2_18936.vasp,Ti2F6,-4.55764479625,-0.63869640375 -Pr2S6_129_14550.vasp,Pr2S6,-3.75706252875,0.2448182604687501 -Be2P1_164_2262.vasp,Be2P1,-2.920437276666666,0.6897827189583307 -Hf1Ni1Cl6_149_7245.vasp,Hf1Ni1Cl6,-2.16227963,-0.0679697178125 -Ca2Fe2Sn2_12_3019.vasp,Ca2Fe2Sn2,-0.4021985783333333,1.075384688333332 -Ba3Fe2S5Cl2_123_2109.vasp,Ba3Fe2S5Cl2,-2.6785260466666667,-0.0786757740104189 -Co2F2_129_3897.vasp,Co2F2,-0.7626533875,1.3921148068749998 -As2W1_164_1306.vasp,As2W1,-4.02494953,0.2473728491666629 -Ti2S2F2_59_18997.vasp,Ti2S2F2,-5.027434410000001,-0.4400367708333381 -Al2Ge2S2_164_847.vasp,Al2Ge2S2,-3.3548868,-0.2838449623611137 -Tl3S4_164_19580.vasp,Tl3S4,-1.5790087357142857,0.1628236765624987 -Ba2Cu1Se2Br2_38_1970.vasp,Ba2Cu1Se2Br2,-1.910920202857143,0.1819164328571407 -Cu2C2S2Cl2_31_5066.vasp,Cu2C2S2Cl2,-2.35332012625,0.5687032927976178 -P8C6_187_14148.vasp,P8C6,-5.000357307142857,0.7900655742857086 -Ir2Se2_164_8844.vasp,Ir2Se2,-2.5333997975,0.5342199943750003 -Mn2Sb2Cl2O4_10_11233.vasp,Mn2Sb2Cl2O4,-3.391789264,0.1021843767499959 -Au4Se4S12_14_1603.vasp,Au4Se4S12,-1.534208615,0.3069703766250002 -Mn3Sn1O8_1_11415.vasp,Mn3Sn1O8,-4.1304435875,0.3084685324999996 -Ti4B3O2_164_19122.vasp,Ti4B3O2,-6.608077597777777,0.2883673955555499 -Rh1Se1I1_156_15168.vasp,Rh1Se1I1,-1.5681899566666668,0.1374958836111093 -B1S1_156_1634.vasp,B1S1,-3.75387209,1.0498126824999994 -Nb3Ir1S8_5_12983.vasp,Nb3Ir1S8,-4.477715069166667,-0.4904900533333336 -Ca2Cu1Te2Br2_38_3006.vasp,Ca2Cu1Te2Br2,-1.144005307142857,0.3125602228571404 -Rb1S2_25_14750.vasp,Rb1S2,-0.8785049866666667,1.225837996249996 -As4S2O12_18_1359.vasp,As4S2O12,-4.373264866111111,0.2522085327777787 -Cu2H4C4N2Cl2_2_5120.vasp,Cu2H4C4N2Cl2,-4.328413060714285,0.3856251055357032 -Sb4O8_31_15793.vasp,Sb4O8,-4.181493429166667,0.236583437916666 -Pb2C4O8_2_14232.vasp,Pb2C4O8,-5.491030487857143,0.1691013510714225 -Li1Sn1Cl3_143_9791.vasp,Li1Sn1Cl3,-1.809131182,0.2340020509999999 -Ta1Sb1P1_156_17611.vasp,Ta1Sb1P1,-4.682570106666667,0.5515354308333286 -Na1Sn1N1_156_11933.vasp,Na1Sn1N1,-2.71899469,0.3001514897916638 -W8Se24_14_20598.vasp,W8Se24,-3.188386983125,-0.0677945672916666 -Ag1C12S2F4_6_39.vasp,Ag1C12S2F4,-4.884813941578948,0.9298703941611772 -Y4C3O2F2_164_20814.vasp,Y4C3O2F2,-5.490182242727273,1.164218719261351 -Pt3N6_8_14691.vasp,Pt3N6,-3.558249525555555,1.254850202777774 -Ti1F4_123_18778.vasp,Ti1F4,-4.264484614,0.112654183 -Mo1Cl2_115_11504.vasp,Mo1Cl2,-1.5582348466666665,0.7396013611111114 -Ga1Ge1Te3_174_6197.vasp,Ga1Ge1Te3,-1.486974988,0.1290909747333333 -Bi2Pt1_123_2506.vasp,Bi2Pt1,-1.4395563166666667,0.2502970479166666 -Sb2Cl8_1_15572.vasp,Sb2Cl8,-1.232419697,0.0438355394999975 -Ta6Sn2S12_26_18156.vasp,Ta6Sn2S12,-4.72010724,0.3274672015000002 -Ta4Zn4Co2O16_13_18140.vasp,Ta4Zn4Co2O16,-5.09864617076923,0.155913112692305 -Al2Br4_1_776.vasp,Al2Br4,-1.4654127966666666,0.280014539444443 -K2Mg1H4_123_9220.vasp,K2Mg1H4,-1.8494271185714288,0.0560535785714286 -Na2S2F2_129_12286.vasp,Na2S2F2,-1.8506603216666668,0.4867541314583309 -Mo2S4_11_11675.vasp,Mo2S4,-3.5907965666666666,0.1753220516666669 -Pt2S8_12_14672.vasp,Pt2S8,-2.368710554,0.26553019775 -In1Cl1_99_8215.vasp,In1Cl1,-0.701903105,0.6948690984375001 -Tl1Br2_187_19231.vasp,Tl1Br2,-0.3362164033333333,0.2318373104166667 -Cr1Te1O1_156_4271.vasp,Cr1Te1O1,-3.35843675,0.1796798173358555 -Ni1Sb2_123_13418.vasp,Ni1Sb2,-1.19538593,-0.6569237216666667 -In1Te6As2Au1_149_8368.vasp,In1Te6As2Au1,-1.279805917,0.1698361114166657 -Sn2S2_59_16844.vasp,Sn2S2,-2.29646669,0.1673635312499999 -Cu2H8C8Cl2_2_5150.vasp,Cu2H8C8Cl2,-4.5096730465,0.3054114362499994 -Hf1Ge1S2Cl2_6_7177.vasp,Hf1Ge1S2Cl2,-3.608889935,-0.0087349266666729 -Y2Si1_164_20780.vasp,Y2Si1,-4.03784419,0.8410636422222171 -Ti2S2I2_59_18998.vasp,Ti2S2I2,-3.908906005,-0.2322745135416748 -Re4S4O26_32_15113.vasp,Re4S4O26,-5.015705664117647,0.0331338273529411 -Ga4S6_31_6566.vasp,Ga4S6,-2.878934161,0.0421833289999997 -W1Se2_187_20457.vasp,W1Se2,-3.8093382833333336,-0.4178779133333332 -Rh1I1Cl1_8_15154.vasp,Rh1I1Cl1,-0.8690742733333333,0.3955650616666654 -Sb6Pb2_164_15852.vasp,Sb6Pb2,-1.58463542625,0.4600864081249998 -S20N8_1_15381.vasp,S20N8,-3.348513588571429,0.1024757316964244 -Nb2N1_164_12767.vasp,Nb2N1,-6.354872746666668,1.2362631944444438 -Au2Se2_187_1548.vasp,Au2Se2,-0.163877355,0.512242925 -Ti3Te2C2F2_187_19108.vasp,Ti3Te2C2F2,-4.777837761111112,0.3868337398148094 -V2Cl2_164_20034.vasp,V2Cl2,-2.5430586775,0.4398686725 -Y3B2_187_20788.vasp,Y3B2,-4.63056031,0.5550050059999958 -Na2V2H4I4O18_4_12332.vasp,Na2V2H4I4O18,-3.670000946,0.0591940450555523 -Sr2Cu1Te2Cl2_38_17209.vasp,Sr2Cu1Te2Cl2,-1.3727909914285714,0.3227835357142831 -Ca1Nb1I1Br1O1_6_2858.vasp,Ca1Nb1I1Br1O1,-3.132367428,0.4341952013333339 -Pb1Se2_115_14208.vasp,Pb1Se2,-1.4605774633333333,0.6087281500694427 -Ge4S4I1Br3_8_6941.vasp,Ge4S4I1Br3,-2.1753304425,0.1725712601041669 -K2I2O6_11_9205.vasp,K2I2O6,-2.558031775,0.11416448725 -Rb2Mn2As2_129_14899.vasp,Rb2Mn2As2,-1.5487021033333337,0.1274799378352469 -Rb1Sn1S2_156_14753.vasp,Rb1Sn1S2,-1.77415689,0.4347474053125001 -Cd2Sb2S4Br2_11_3558.vasp,Cd2Sb2S4Br2,-1.360114302,-0.2983114084999997 -Ti1V1S2Br4_1_18865.vasp,Ti1V1S2Br4,-2.70371705125,0.1220687637499999 -Ti4Te4I4_31_19168.vasp,Ti4Te4I4,-2.920790844166667,0.1960547730555482 -Cd2Bi2S4Br2_10_3469.vasp,Cd2Bi2S4Br2,-1.18362227,0.2161508225000001 -In2H10C4F4_10_8456.vasp,In2H10C4F4,-3.686805454,0.4914472640000001 -Nb2Cl10_1_12672.vasp,Nb2Cl10,-2.1920513741666667,0.2814136724999998 -Cu4Te4Br4_14_5484.vasp,Cu4Te4Br4,-0.4282953383333334,0.1291116291666661 -As2Ir2O6_162_1225.vasp,As2Ir2O6,-4.217636038,0.375497603499995 -K1Tl1I4O12_2_8952.vasp,K1Tl1I4O12,-2.528760422222222,0.1039998256076312 -Pd1Cl2_115_14359.vasp,Pd1Cl2,-0.34107021,0.5343958544444445 -V2O5_5_20129.vasp,V2O5,-5.450972454285714,0.0076061278571426 -Cd2I2_129_3520.vasp,Cd2I2,1.4820559,0.3622247741666666 -Hf1Zn1S2_6_7372.vasp,Hf1Zn1S2,-2.983504615,0.4184243342499998 -Na2Mg1Te2H4O8_2_12198.vasp,Na2Mg1Te2H4O8,-3.9249585929411768,0.1288122043464015 -Li1Mn1Cr2O6_1_9743.vasp,Li1Mn1Cr2O6,-4.690254449999999,0.0678852043020804 -Cu1Te3W1Br1_6_4998.vasp,Cu1Te3W1Br1,-1.4123947166666666,0.4005456657638883 -Rb1I1_123_14740.vasp,Rb1I1,-0.494209775,0.1252991199999999 -Li3Fe2F9_174_10146.vasp,Li3Fe2F9,-2.779919385714286,0.1506929017857117 -Zr1Pt1S2I1Br1_1_21406.vasp,Zr1Pt1S2I1Br1,-2.6708942,0.1732682088194382 -Mg2Bi1_25_10429.vasp,Mg2Bi1,0.11380499,0.7698709669444446 -Rh2O6_31_15210.vasp,Rh2O6,-3.0546500875,0.8826207553124998 -Zr1O2_115_21386.vasp,Zr1O2,-6.494535043333333,0.6884541000000004 -Ce4Mg2_164_3688.vasp,Ce4Mg2,-1.3644051716666663,0.550784826666665 -Sc2Br2_129_16041.vasp,Sc2Br2,-1.770890995,0.6939467641666641 -V2B1S2F2_164_19992.vasp,V2B1S2F2,-3.3707871985714286,0.6779931970067941 -Hf2S1Cl3_8_7560.vasp,Hf2S1Cl3,-3.7557502133333336,0.2835966066666626 -Hg1Pb2S2Br2_12_7899.vasp,Hg1Pb2S2Br2,-1.1319982657142855,-0.3690746028571441 -Ca2Mn2Si2_129_3066.vasp,Ca2Mn2Si2,-2.11014857,0.3573712784166603 -Re1Te2_115_15026.vasp,Re1Te2,-2.68153443,0.8387937600000006 -Cu2H4C6I2_2_5125.vasp,Cu2H4C6I2,-4.076942232857143,0.4118460171428545 -Sc4N3_164_16252.vasp,Sc4N3,-5.838074621428571,-0.0334272985714321 -P8Se8_4_14162.vasp,P8Se8,-2.977516150625,0.0914193440624999 -Zn1Pd1I2_1_20991.vasp,Zn1Pd1I2,0.177306715,0.185629810625 -Ge6F16_14_6959.vasp,Ge6F16,-2.991414424545454,0.0294114586363609 -V4B3S2_164_20307.vasp,V4B3S2,-4.78270321,-0.2782238558333365 -Ag1O2_47_92.vasp,Ag1O2,-1.19548969,0.834966610416665 -Zr1Bi1P1_156_21253.vasp,Zr1Bi1P1,-3.326854883333333,0.5018241691666634 -Ti1Bi1Te1Se2_8_18743.vasp,Ti1Bi1Te1Se2,-2.739831226,0.5515926870000003 -Re2Pd1O8_2_15072.vasp,Re2Pd1O8,-5.11916441,-0.3298413992045499 -Cr1Se2_187_4265.vasp,Cr1Se2,-2.71873265,0.0477529650000003 -Hg1Cl2_187_7850.vasp,Hg1Cl2,0.3045841166666667,0.17434594 -Hg2Bi2S4I2_11_7941.vasp,Hg2Bi2S4I2,-0.8765817200000001,0.1953612325 -Li4Co2P4O14_113_10175.vasp,Li4Co2P4O14,-4.9450755825,0.1579398163472167 -Ca2P1_115_3083.vasp,Ca2P1,-1.2440668833333333,0.9956247949999988 -Bi8S4O8_2_2693.vasp,Bi8S4O8,-3.122349251,-0.065879133333336 -Cd2I2_12_3521.vasp,Cd2I2,1.050678945,-0.0691521808333333 -Sc1Ge1I2O1_1_15937.vasp,Sc1Ge1I2O1,-2.885134254,0.3400654455 -K2Sb4Se8_2_9344.vasp,K2Sb4Se8,-1.9900519342857144,0.1266635959523791 -Ta4H2N3O2_164_18051.vasp,Ta4H2N3O2,-6.827084287272727,0.7417781533636258 -N8O12_51_11803.vasp,N8O12,-3.716895359,1.0692187054999955 -Ga2F6_12_6346.vasp,Ga2F6,-2.90949542625,0.0600791037500001 -Al2Te2H2S8_11_1004.vasp,Al2Te2H2S8,-2.7896043321428574,0.2109091940773765 -Li2Ni1H2_123_10020.vasp,Li2Ni1H2,-2.013872886,2.036285106 -K4P4O8_57_9493.vasp,K4P4O8,-4.234371694375,0.2395738889999919 -Ti3H2C2S2_1_19081.vasp,Ti3H2C2S2,-5.815916823333334,0.3003038092360931 -Sm2Se6_129_16587.vasp,Sm2Se6,-3.24687194125,0.1445812702916664 -Ni2H12C8O12_14_13508.vasp,Ni2H12C8O12,-4.961279172941176,0.4786116754411645 -Zr2I1Br1O1_1_21585.vasp,Zr2I1Br1O1,-3.65986109,0.3615680691666649 -Cu2F4_123_5093.vasp,Cu2F4,-1.1026683016666667,0.1943970583333332 -Rb2Hg4S8F6_31_14874.vasp,Rb2Hg4S8F6,-1.052066613,0.3986456098125002 -Lu2C1Cl2_164_10305.vasp,Lu2C1Cl2,-4.133291696,0.0286707140000004 -Sb1Te2_187_15519.vasp,Sb1Te2,-1.4270394666666668,0.373512887777776 -Rh4C12_2_15251.vasp,Rh4C12,-5.61134938125,1.2463809162499992 -Tl2Sb2O6_149_19515.vasp,Tl2Sb2O6,-3.584090439,0.2104715939999999 -Sc2Te5O13_1_16183.vasp,Sc2Te5O13,-4.3090634395,0.1684980422499995 -Ta2Sn2P2_129_17889.vasp,Ta2Sn2P2,-3.868871385,-0.2650960333333368 -Os1Se1Br1_156_13823.vasp,Os1Se1Br1,-2.36216282,0.4048937949999973 -Lu2Sb2S4O2_12_10316.vasp,Lu2Sb2S4O2,-4.3282075650000005,0.0441223642499948 -Ta6Tl4Cl18_12_18161.vasp,Ta6Tl4Cl18,-2.914167595,0.0802629869642821 -Al4Sb4_14_1091.vasp,Al4Sb4,-2.29223522875,-0.74335230375 -In4I4_51_8676.vasp,In4I4,-0.60775536125,0.39017540875 -Ta3H2S2N2_187_17963.vasp,Ta3H2S2N2,-5.851841748888889,0.9103068001851788 -Si2As2S6_2_16382.vasp,Si2As2S6,-3.410662306,0.1220312133749979 -Na2H6C4O6_2_12116.vasp,Na2H6C4O6,-5.008662502777778,0.1310620291203594 -Ga2Ni1Te4_164_6401.vasp,Ga2Ni1Te4,-1.3416001185714286,0.0800108276190465 -Ga1Cu1S1I1Br1Cl1_1_6166.vasp,Ga1Cu1S1I1Br1Cl1,-1.014054351666667,0.2104834956271671 -K2B2H6S8_1_8990.vasp,K2B2H6S8,-2.9607284650000003,0.3440104016512311 -Bi2I6_162_2467.vasp,Bi2I6,-0.4151986825,0.0745553437499999 -Cs1Sn1Te2_156_4652.vasp,Cs1Sn1Te2,-0.8924578325,-0.0120175293749998 -Mg1In2Te4_164_10383.vasp,Mg1In2Te4,-1.4241142614285711,0.0561406671428572 -Rh2I2O2_59_15195.vasp,Rh2I2O2,-2.223232943333333,0.2873813558333313 -In2Ge2Te6_162_8454.vasp,In2Ge2Te6,-1.714752085,-0.2950113640000013 -Tl6Sb2S8_1_19645.vasp,Tl6Sb2S8,-1.8590393675,0.0835910187499999 -Cr2P2S6_162_4451.vasp,Cr2P2S6,-3.428101476,0.036549233749997 -Ni1H4C6N2F2_25_13350.vasp,Ni1H4C6N2F2,-5.197580619333333,0.66087309833332 -Pd2S4F2_6_14476.vasp,Pd2S4F2,-1.8721557625,0.3333942435156252 -K2H6C8N2O2_51_9147.vasp,K2H6C8N2O2,-4.6082167625,-0.2089663178333336 -Ca2Cl2_129_2978.vasp,Ca2Cl2,-1.5175288325,0.3126833262499999 -W2Cl10_6_20480.vasp,W2Cl10,-1.6853109216666666,0.3286038058333315 -Ce2S6_129_3676.vasp,Ce2S6,-3.7046601725,0.1958132217187498 -Zn1H16Au2C8N8_10_20946.vasp,Zn1H16Au2C8N8,-4.877434757428572,-2.733021691833343 -Ru2O2_164_15331.vasp,Ru2O2,-4.11085185,0.6614198899999997 -Al1P2Au1S6_149_704.vasp,Al1P2Au1S6,-2.900319109,0.0800507619999979 -Mn1V1Ag1Br8_1_10919.vasp,Mn1V1Ag1Br8,-0.9306472890909092,0.0903167868181805 -Nb6S18_11_13194.vasp,Nb6S18,-4.389573136666667,-0.0170628830729167 -Mg2Mo2Se2S12_18_10484.vasp,Mg2Mo2Se2S12,-2.605084922777778,0.2358645312731456 -In2H4Se2O8_11_8467.vasp,In2H4Se2O8,-3.65661682375,0.3264977221093755 -Ag4Te2O12_14_568.vasp,Ag4Te2O12,-2.445493915,0.2459506697222194 -Cs2B2S6_1_4661.vasp,Cs2B2S6,-3.014473401,0.3477465934999997 -Bi4Pb3_5_2633.vasp,Bi4Pb3,-0.8909808542857143,-0.0549765200000007 -Ba4Sb4Se8F4_2_2184.vasp,Ba4Sb4Se8F4,-2.8865008325000003,0.0737060388750001 -Tc3F8_1_18241.vasp,Tc3F8,-3.609106167272728,0.2501793259090836 -Pt2Cl4_11_14614.vasp,Pt2Cl4,-0.7486452666666666,0.3693947950000001 -Ca3Co2S5Br2_123_3163.vasp,Ca3Co2S5Br2,-2.4767773383333336,0.1955847544791639 -Y1Sn1Se1S1Br1Cl1_25_20678.vasp,Y1Sn1Se1S1Br1Cl1,-2.93643061,0.080869751145828 -Ti3S2_123_19102.vasp,Ti3S2,-5.817133935999999,-0.2470518391666711 -Sr4Cr2S2O6_1_17421.vasp,Sr4Cr2S2O6,-4.326221031428571,-0.0552825233333416 -Te2As2O10F2_4_18354.vasp,Te2As2O10F2,-3.409010225625,0.3414963290885389 -Mn1Ag1Br2O2_1_10607.vasp,Mn1Ag1Br2O2,-1.93864905,0.1369300298611088 -Co1H4C6F2_47_3760.vasp,Co1H4C6F2,-5.050457902307692,0.3463455276923023 -Cr4H2C3S2_164_4602.vasp,Cr4H2C3S2,-4.267576137272727,0.4442366372727206 -Fe3S2N2F2_187_6061.vasp,Fe3S2N2F2,-2.6462125666666667,0.3702227194444417 -Mn3C2O2F2_187_11363.vasp,Mn3C2O2F2,-3.406902572222222,1.08208049888888 -Ti2P4O12_11_18984.vasp,Ti2P4O12,-6.046897997222222,0.0989433799999883 -Zr2Tl2Cu2Se6_51_21727.vasp,Zr2Tl2Cu2Se6,-2.3987955875,0.1389349458333333 -Li2Te2O6_3_10085.vasp,Li2Te2O6,-3.763309039,0.2320793626249964 -Bi2N2_1_2479.vasp,Bi2N2,-3.5295739075,-0.5292645987499998 -Al4P4_127_1082.vasp,Al4P4,-3.12097806125,-0.1863760662500002 -Co1Mo1Se2_115_3781.vasp,Co1Mo1Se2,-2.3837260675,0.3190586225 -Ta2Br6_189_17673.vasp,Ta2Br6,-2.46223099625,0.3055133848437501 -V2Br10_51_19998.vasp,V2Br10,-0.9657987691666668,0.1980008591666662 -Sb2Mo2O10_13_15602.vasp,Sb2Mo2O10,-4.622163023571429,0.2135418895833287 -Ba2Tl1Cd1Ag1O5_99_2077.vasp,Ba2Tl1Cd1Ag1O5,-2.431427714,0.3794087814166615 -Ge2Se2F2_59_6867.vasp,Ge2Se2F2,-2.5850286783333334,0.2893843461111109 -Ca2H8Se2O12_13_3049.vasp,Ca2H8Se2O12,-4.17870294125,0.0409995688888886 -Ce2Mg4_12_3670.vasp,Ce2Mg4,-0.4964063866666666,0.5263176183333325 -Al2Ni2Se5_156_905.vasp,Al2Ni2Se5,-1.9940233333333333,0.0001760411111088 -Ti1N2_164_18806.vasp,Ti1N2,-6.472559633333333,0.6229444574999947 -Zn2Hg3Se6Br2_164_21106.vasp,Zn2Hg3Se6Br2,-0.04787154,0.3915434528205106 -Os2O6_2_13864.vasp,Os2O6,-4.6989643925,0.1233626358333288 -Ti3H2Se2N2_1_19089.vasp,Ti3H2Se2N2,-5.532894227777778,0.5309378094444384 -Mo1P4O13_1_11535.vasp,Mo1P4O13,-5.354968323333334,0.121074584999989 -Li2V2Si2O8_11_10127.vasp,Li2V2Si2O8,-5.567119585,0.1980146092857082 -In1Sb1_156_8334.vasp,In1Sb1,-1.106049185,-0.3441684 -Sb1O2_191_15473.vasp,Sb1O2,-2.5239455866666667,1.8941312804166663 -Gd2Sb2S4O2_129_6625.vasp,Gd2Sb2S4O2,-4.346689082,-0.001028321833338 -P2Pd2Se5_8_14025.vasp,P2Pd2Se5,-2.2383788533333333,0.456260939444442 -Cu2Hg2S2I2_26_5157.vasp,Cu2Hg2S2I2,0.01745166375,0.0927211258333333 -Ga1Ag1Sb2Te6_149_6124.vasp,Ga1Ag1Sb2Te6,-1.196581988,0.3359622101666651 -Ga2S3_189_6451.vasp,Ga2S3,-2.57983528,0.3412822099999997 -Li6C3_12_10263.vasp,Li6C3,-3.625537108888889,0.1678540281481442 -Si1Sn1S2_6_16369.vasp,Si1Sn1S2,-2.876573215,-0.61751217125 -Li1W2Cl6O2_47_9812.vasp,Li1W2Cl6O2,-3.310478407272728,0.0175212697727218 -Hf1N1F2_1_7238.vasp,Hf1N1F2,-5.1353092175,0.8270600629166601 -Co2Cu1O4_187_3895.vasp,Co2Cu1O4,-3.442514807142857,-0.2745520019642916 -Fe2S4Cl2_11_5940.vasp,Fe2S4Cl2,-1.89502792375,-0.1042599293359375 -Nb3Se1F7_156_13011.vasp,Nb3Se1F7,-4.3085146454545455,0.1023544405681784 -Cr1Cu1As2S6_5_4148.vasp,Cr1Cu1As2S6,-2.559447991,0.4952792012291646 -Hf2C2I2_2_7469.vasp,Hf2C2I2,-5.089668465,0.3449199979166631 -Zr4C3S2F2_164_21814.vasp,Zr4C3S2F2,-5.222489148181818,0.7635743917992321 -Ag2C2S4O12F6_7_226.vasp,Ag2C2S4O12F6,-3.6149730934615385,0.141949345480761 -Ca2Gd2Cu2Cl2O6_129_3021.vasp,Ca2Gd2Cu2Cl2O6,-4.102563690714286,0.0765948009821382 -Na2H6C8S2N2_51_12122.vasp,Na2H6C8S2N2,-4.4605067245,1.0589151304999898 -Sn2Se2_12_16883.vasp,Sn2Se2,-1.7828689925,-0.2065906175 -Nb2Se2Cl2_59_12870.vasp,Nb2Se2Cl2,-3.7523262233333337,-0.1603952586904835 -Zr3H2N2O2_187_21766.vasp,Zr3H2N2O2,-6.015751014444444,0.5617856499999947 -V1In2S4_164_19873.vasp,V1In2S4,-2.725560817142857,0.2490994228571406 -Cd2Se2_164_3574.vasp,Cd2Se2,0.00973488,-0.373732705 -Ag1Te1Pb1I1_1_141.vasp,Ag1Te1Pb1I1,-0.37867934,-0.1413384695833332 -Nb2I2_12_12748.vasp,Nb2I2,-2.777304005,0.6137324337499999 -Sn1S2Br2_10_16678.vasp,Sn1S2Br2,-1.63492846,0.1124204107500003 -Hf1Mn1Cl6_149_7211.vasp,Hf1Mn1Cl6,-2.60602492,-0.0992082418749999 -Si1Cl2_164_16326.vasp,Si1Cl2,-1.9658900333333331,0.3654386049999972 -Hg4C4N8_29_8071.vasp,Hg4C4N8,-4.291607740625,0.006728882614936 -Pd2S2I2_59_14462.vasp,Pd2S2I2,-1.145330145,0.1591804408333333 -Cd2S4_12_3551.vasp,Cd2S4,-1.0026258633333334,0.3642782106249987 -Zn4Sn4O8_1_21230.vasp,Zn4Sn4O8,-2.755481419375,0.2445354987499999 -V3C2Cl2_187_20248.vasp,V3C2Cl2,-4.509051931428571,0.1662201823280328 -Ca1Cl2_187_2819.vasp,Ca1Cl2,-2.1968119733333333,0.0314191649999999 -Re1H6Au2_8_15003.vasp,Re1H6Au2,-2.518912908888889,1.886557438888885 -Al4P6S18_150_1083.vasp,Al4P6S18,-3.4191567057142858,0.0384433067354917 -P8S6_26_14155.vasp,P8S6,-3.504446875,0.1011320433928575 -Ni1B4H4Br2N2_47_13268.vasp,Ni1B4H4Br2N2,-3.8846711592307694,0.5202273825884521 -Co1C4N2F6_47_3715.vasp,Co1C4N2F6,-4.537372436923077,0.1034421426922938 -Ge3P4_5_6916.vasp,Ge3P4,-3.451202031428572,-0.2079290578571457 -As2Pd2Se5_8_1271.vasp,As2Pd2Se5,-2.005710794444445,0.2756440489999977 -Sr3Fe2S5Cl2_123_17379.vasp,Sr3Fe2S5Cl2,-2.504118073333333,-0.0940841320833354 -Ba2C1_164_1931.vasp,Ba2C1,-1.9289290166666664,1.060859514722216 -Na1Al1Sb2O6_5_11815.vasp,Na1Al1Sb2O6,-4.017219241,0.6727454863749998 -Ni2Te2_129_13667.vasp,Ni2Te2,-0.3111422525,0.2519346724999995 -Co2Br2N2_59_3874.vasp,Co2Br2N2,-2.815039561666667,-0.1818745641666692 -Pt2Br6_191_14607.vasp,Pt2Br6,-0.15576762,0.50467545 -Pt1I2_187_14576.vasp,Pt1I2,0.0770302866666666,0.5923858716666667 -Nb2Te6P2_2_12926.vasp,Nb2Te6P2,-2.921172531,0.4797101240000004 -In2Br4_6_8391.vasp,In2Br4,-0.9251034416666668,0.10634676875 -Te4Se2O14_31_18630.vasp,Te4Se2O14,-3.543140789,0.1235962701250001 -Mo2Cl2_129_11596.vasp,Mo2Cl2,-1.421206015,1.6444803183333334 -Sr4Mn2S2O6_129_17447.vasp,Sr4Mn2S2O6,-4.057015582142857,-0.1069818231773498 -K4P2Pd1S8_2_9488.vasp,K4P2Pd1S8,-2.423051416,0.1573602306666668 -B2C4N2_5_1659.vasp,B2C4N2,-7.24941067,0.7101899062500006 -Sn1S2F2_12_16679.vasp,Sn1S2F2,-1.797365066,0.8690956713125004 -V2Au1O6_12_19983.vasp,V2Au1O6,-4.400235455555556,0.1136474355555483 -Sr2Ce1_187_17176.vasp,Sr2Ce1,0.0381649266666666,1.0110668283333324 -Ca2Sb1_25_3116.vasp,Ca2Sb1,-0.4173967533333333,0.9851624433333336 -Ti2Te2P1_164_19041.vasp,Ti2Te2P1,-4.666339798,0.0600740999999995 -Li4Se4S8_13_10228.vasp,Li4Se4S8,-2.52430724,0.1468764093489581 -Pr1Pb5_47_14533.vasp,Pr1Pb5,-1.0026630583333334,0.2888097366666655 -K1Bi2F7_1_8881.vasp,K1Bi2F7,-2.396566014,0.3578333587499998 -Ca3Ag2I2O4_123_3144.vasp,Ca3Ag2I2O4,-2.475628593636364,-0.0678530814545468 -Ta2C2Cl2_59_17683.vasp,Ta2C2Cl2,-5.87503939,0.1183836753333222 -Rb2Os2N2O2F10_11_14912.vasp,Rb2Os2N2O2F10,-3.2894071661111117,-0.2019756774747606 -Ta2Te1S3I2_1_17897.vasp,Ta2Te1S3I2,-3.426285875,0.3499463251627592 -Sm2Br2O2_129_16566.vasp,Sm2Br2O2,-4.790991151666667,0.064438823333333 -Te2Pt2Br2_59_18481.vasp,Te2Pt2Br2,-1.2977448483333334,-0.1600630608333333 -Sr2Ni1O3_38_17286.vasp,Sr2Ni1O3,-3.581212368333333,-0.2883704033333361 -Ta2B1Cl2_164_17651.vasp,Ta2B1Cl2,-5.272929238,-0.2199356424999994 -Sn2P2H2O8_7_16811.vasp,Sn2P2H2O8,-4.8467886671428575,0.077970139642856 -Hf1I2_115_7199.vasp,Hf1I2,-1.8592364466666669,0.8579517999999973 -Cd1H12C12I2N6_2_3323.vasp,Cd1H12C12I2N6,-5.301972006060606,0.2156554742929141 -Li2H2O2_129_9928.vasp,Li2H2O2,-4.214716916666666,0.0269862166666667 -Cu4I8_13_5429.vasp,Cu4I8,0.3799151841666666,0.1824175934722223 -Co2Te6_11_4052.vasp,Co2Te6,-1.46978448375,0.1562394362499999 -Ga2H2S2O8_11_6377.vasp,Ga2H2S2O8,-4.354075772142857,-0.2041903372023884 -Tl1In1S2Br2_1_19298.vasp,Tl1In1S2Br2,-1.3993708783333334,0.1624997544791648 -Pb1Se1_123_14205.vasp,Pb1Se1,-1.40971196,0.5402521834374998 -Bi1S1Cl1_156_2367.vasp,Bi1S1Cl1,-1.8416257633333333,0.1866484075000001 -Ba2Te2Au1Cl2_38_2065.vasp,Ba2Te2Au1Cl2,-1.5338817471428572,0.4345496689732108 -Bi2Te2S1_10_2561.vasp,Bi2Te2S1,-1.48048593,0.4229138719999998 -Cd2Si1O4_21_3576.vasp,Cd2Si1O4,-3.141916728571428,0.574267385357143 -Hf1Bi1Se1Br1O2_1_7118.vasp,Hf1Bi1Se1Br1O2,-4.183001548333333,0.5291599275 -Co3Te4_164_4075.vasp,Co3Te4,-1.6527190185714284,-0.0042163133333346 -U2Si4_12_19728.vasp,U2Si4,-5.430728101666666,0.5732587689583264 -Pr2Bi2S4O2_129_14540.vasp,Pr2Bi2S4O2,-4.1861065250000005,0.0024411468333291 -Sn2S2I2_59_16839.vasp,Sn2S2I2,-1.5130107066666667,0.1513418722222221 -Mn2Mo2O10_12_11140.vasp,Mn2Mo2O10,-4.695494071428572,-0.0867569994642886 -Ag2Se4Br2_17_440.vasp,Ag2Se4Br2,-0.81693065875,0.2890505554166666 -Co2Mo2Br2O8_129_3930.vasp,Co2Mo2Br2O8,-3.8544929114285713,0.1168529769642789 -Ca1I2_187_2850.vasp,Ca1I2,-1.09590333,0.1767079346666664 -Cd2S1Br1_8_3538.vasp,Cd2S1Br1,0.321523805,0.3480873353125 -Lu1C2_123_10292.vasp,Lu1C2,-5.5880284966666665,0.8757480333333272 -Nb2Pd1Se6_12_12813.vasp,Nb2Pd1Se6,-3.4109028266666663,0.099958686666667 -Ca1H12Au2_115_2840.vasp,Ca1H12Au2,-2.332797038666667,1.4634511913809467 -Ta3S1I7_156_17984.vasp,Ta3S1I7,-2.5644178209090907,0.0472596788068144 -Tl2Si2Te6_162_19543.vasp,Tl2Si2Te6,-1.597524134,0.1807655185000003 -Al2Ru1_123_931.vasp,Al2Ru1,-3.0297187300000004,0.51099462 -Sr2H8Cl4O4_53_17242.vasp,Sr2H8Cl4O4,-3.63389914,0.0368094246296264 -Ti4N3F2_164_19144.vasp,Ti4N3F2,-7.197392312222222,-0.3822742040740801 -V2F10_51_20056.vasp,V2F10,-2.656175629166667,0.4573838156249996 -Cd1Sb1I1Br1O2_1_3419.vasp,Cd1Sb1I1Br1O2,-1.83855932,0.2365728905555557 -Sc2H2C1O2_164_16077.vasp,Sc2H2C1O2,-5.274639585714286,0.4151116432142818 -As2Pb2S6_147_1260.vasp,As2Pb2S6,-2.552101975,0.3206104992986047 -Ga2O3_164_6421.vasp,Ga2O3,-4.461469582,-0.3933852847500036 -Sr3Ni2I2O5_123_17392.vasp,Sr3Ni2I2O5,-2.909317103333333,-0.2004038674479193 -Tl2O3_189_19474.vasp,Tl2O3,-1.857544858,0.8526203205 -Zr1Nb4Te8W1N5O1_1_21370.vasp,Zr1Nb4Te8W1N5O1,-4.817551544,0.183325030479161 -Al2Pd1S4_164_929.vasp,Al2Pd1S4,-3.073621025714285,0.2001977569642838 -Nb3Te6_12_13031.vasp,Nb3Te6,-3.3036187100000003,0.0853016511111106 -Sc2Br2_164_16043.vasp,Sc2Br2,-2.2770298275,0.1878079316666643 -Mn2W2S8Cl2_129_11343.vasp,Mn2W2S8Cl2,-2.858484652857143,0.5373227200892798 -Ge1Te2W1_25_6717.vasp,Ge1Te2W1,-2.6676642025,0.082981588125 -Mg1O2_12_10392.vasp,Mg1O2,-3.1330930566666666,0.5906336454166636 -Mo2H2N1_164_11614.vasp,Mo2H2N1,-4.04294048,-1.6695753827777815 -Te2Ir2Br2_11_18388.vasp,Te2Ir2Br2,-1.87308949,0.2087675155555524 -In1Se1Br2_1_8340.vasp,In1Se1Br2,-0.947499415,0.4155100822916667 -Ir1O2_164_8743.vasp,Ir1O2,-4.0195569566666665,0.624785066666667 -Fe1H4C6I2N2_25_5703.vasp,Fe1H4C6I2N2,-5.087229643333333,0.1024795445833284 -Ga2Fe1Te4_164_6352.vasp,Ga2Fe1Te4,-1.661367837142857,0.1411402497619032 -Nb2Fe4Se4_51_12722.vasp,Nb2Fe4Se4,-2.645000112,0.7804689965000007 -Zn1Hg1Se1O1_1_20957.vasp,Zn1Hg1Se1O1,-0.5081198825,0.1969825862499998 -Ga2Se2F2_59_6470.vasp,Ga2Se2F2,-2.377251693333333,0.248111418333331 -Ta2Pd1Se6_12_17826.vasp,Ta2Pd1Se6,-3.695214733333333,0.0877088533333338 -Ta2W2S11_1_17936.vasp,Ta2W2S11,-4.2070275666666666,0.2988223706249973 -Hg8As2I10_39_8103.vasp,Hg8As2I10,0.687413464,0.0195489703333341 -In1Ga1Te2_156_8260.vasp,In1Ga1Te2,-1.53076553,0.1283390879166667 -K2Mg1H4S8O2_2_9217.vasp,K2Mg1H4S8O2,-2.714330956470588,0.3876984650735265 -In3Fe2_123_8646.vasp,In3Fe2,-0.296529398,2.0937741780000003 -Cr3S2N2_187_4578.vasp,Cr3S2N2,-4.495628745714286,0.0123890685714249 -Ag4Pd2Cl8_53_538.vasp,Ag4Pd2Cl8,-0.3164940757142856,0.1326021961904757 -Se1O3_187_16284.vasp,Se1O3,-2.7451009325,0.7342271709374997 -Hf1Zr1Sc2Cl2O5_1_7397.vasp,Hf1Zr1Sc2Cl2O5,-5.596933587272727,0.4361729343939275 -Ge3P2O9_174_6914.vasp,Ge3P2O9,-4.908940904285714,0.2006045813690447 -Sr3C1_25_17357.vasp,Sr3C1,-0.57902543,1.6833462406249955 -Ni2H2O4_11_13510.vasp,Ni2H2O4,-3.25672452625,-0.3093254247395833 -Sb4Se2S12_4_15824.vasp,Sb4Se2S12,-2.341843343888889,0.2973288021296272 -Rb2Os2N2Cl8O4_7_14911.vasp,Rb2Os2N2Cl8O4,-2.755243649444445,-0.0148165618650819 -Pb2Se2O8_31_14290.vasp,Pb2Se2O8,-3.5002075666666665,0.1868079820833337 -Mn2Sb2S4Cl2_26_11239.vasp,Mn2Sb2S4Cl2,-2.401936932,0.2319594184166645 -Mn2Te2Br2_59_11294.vasp,Mn2Te2Br2,-1.3780468,0.1511847554166667 -Sn1C1Cl3_156_16622.vasp,Sn1C1Cl3,-1.331916724,1.409850176 -Fe2C2F2_59_5832.vasp,Fe2C2F2,-3.2157574883333333,1.2118885266666628 -Tb2C2Br2_12_18188.vasp,Tb2C2Br2,-4.5238503366666665,0.0279680200000003 -Sb8Se8S4_2_15880.vasp,Sb8Se8S4,-2.2902079855,0.2182029411666646 -Ta2Ni4Te6_11_17807.vasp,Ta2Ni4Te6,-1.9669925741666667,0.0968349708333333 -Ca2La2I10_51_3061.vasp,Ca2La2I10,-1.454693592142857,0.1745704998571416 -Fe2H2S2N1_164_5854.vasp,Fe2H2S2N1,-3.048789542857143,-1.75280463821429 -In3S4_164_8656.vasp,In3S4,-2.42178132,0.032867572142855 -Hf1Co1S2Br2_6_7151.vasp,Hf1Co1S2Br2,-3.1375601866666667,0.2072031228472144 -Sb2Te6Pb2_147_15739.vasp,Sb2Te6Pb2,-1.403052498,-0.3470279553333348 -Na4C1O4_38_12373.vasp,Na4C1O4,-3.8581709666666666,0.2471519133333298 -P4Se6_7_14125.vasp,P4Se6,-2.737138953,0.1796071534166649 -As2Pt2S6_12_1278.vasp,As2Pt2S6,-2.635440408,0.4060027368499965 -Ba1Sb4O8_162_1856.vasp,Ba1Sb4O8,-4.022048046923077,0.3977378191025602 -Ta4C3O2_164_18013.vasp,Ta4C3O2,-8.062123746666666,-0.1366959777777849 -Ti2N1_164_18967.vasp,Ti2N1,-6.9239588633333335,1.1427122583333338 -Sc1Se2_187_15999.vasp,Sc1Se2,-3.117006643333333,0.5585206872222195 -Os2S2_164_13871.vasp,Os2S2,-4.011453135,0.6842469718749999 -Sr3Cr2S2O5_123_17365.vasp,Sr3Cr2S2O5,-4.337104629166666,-0.0253994572222304 -C4O10_30_2765.vasp,C4O10,-5.0928226485714285,0.6959969394642831 -Ti1Ag1Se2_156_18737.vasp,Ti1Ag1Se2,-2.8311767575,0.35112497125 -Ta2Nb1Se1Cl4_10_17784.vasp,Ta2Nb1Se1Cl4,-3.5713869275,0.5306369038541638 -Hf2S2_129_7573.vasp,Hf2S2,-4.83993231,0.5652243600000002 -Ta4Co2O10_59_18020.vasp,Ta4Co2O10,-6.277482745,0.2717659874999993 -Al2Se2I2_59_966.vasp,Al2Se2I2,-2.046467345,0.0577311791666668 -Cd2Te6As2_147_3600.vasp,Cd2Te6As2,-0.8808400369999999,-0.0146740578333348 -Cs2S2N2O6F6_4_4778.vasp,Cs2S2N2O6F6,-2.9785366694444444,0.4043940283333287 -K2Mn1As2S7Cl3_1_9232.vasp,K2Mn1As2S7Cl3,-2.17350325,0.4200584496249919 -Hf2S2_187_7574.vasp,Hf2S2,-4.99668023,0.4084764400000003 -Cd2Te2H4S8_31_3592.vasp,Cd2Te2H4S8,-2.0901283475,0.1581207319270833 -Pt1F2_187_14573.vasp,Pt1F2,-0.5784545333333333,1.239146399166664 -Tl2Fe1_123_19415.vasp,Tl2Fe1,0.5278109633333333,1.1128887699999994 -Mn2As2O6_162_10970.vasp,Mn2As2O6,-4.06595171,0.2251245236842067 -Bi12Se12_7_2301.vasp,Bi12Se12,-1.6642799295833333,0.1704578279166656 -P8S8O4_2_14156.vasp,P8S8O4,-3.710950241,0.3047060578499954 -Ni2H8N4O16_14_13520.vasp,Ni2H8N4O16,-4.178668754333334,-0.0757365060000037 -Ta2S4Br4_12_17858.vasp,Ta2S4Br4,-3.330634179,0.0760718796507898 -W3S2N2_187_20571.vasp,W3S2N2,-5.623059168571428,-0.2956154509523854 -Ga1Pd5Cl2_123_6240.vasp,Ga1Pd5Cl2,-1.10270621375,0.058840836232039 -Hf1I2_187_7201.vasp,Hf1I2,-2.3204135766666667,0.396774669999997 -Cu1Te2As1S1_1_4992.vasp,Cu1Te2As1S1,-1.435682158,0.4103192576666669 -In2Pt4Se6_164_8535.vasp,In2Pt4Se6,-2.006298828333333,0.1705253275 -Ge8Pd2_125_6973.vasp,Ge8Pd2,-2.630716514,-0.2047241929999996 -Ni1B4N2Cl2F4_47_13274.vasp,Ni1B4N2Cl2F4,-4.067364471538462,0.8081090502563986 -As8C4_26_1394.vasp,As8C4,-4.241947801666667,0.6042837083333286 -Sb2H2Pb2S6_7_15582.vasp,Sb2H2Pb2S6,-2.413984975,0.0004542289583315 -Sc1I2_123_15944.vasp,Sc1I2,-1.45204853,0.2931802472222206 -Ni2Se2Br2_59_13630.vasp,Ni2Se2Br2,-0.7392208416666667,-0.019793295 -Ta4I16_1_18055.vasp,Ta4I16,-1.5358774505,0.1533167177187502 -Zr1Br1F1_156_21265.vasp,Zr1Br1F1,-3.297770526666667,0.303526302083329 -Li2Tl2_187_10100.vasp,Li2Tl2,-0.22408975,1.98578264 -In2S2Br1Cl1_6_8541.vasp,In2S2Br1Cl1,-1.8904672416666664,0.0643553787499978 -Ti1Ni1Br3Cl3_1_18808.vasp,Ti1Ni1Br3Cl3,-1.70771200125,-0.04836007625 -Al2Br2O2_59_773.vasp,Al2Br2O2,-4.108132605,0.0318792583333289 -Mn2Nb4Zn4O16_13_11166.vasp,Mn2Nb4Zn4O16,-4.9651910784615385,0.1171002540384582 -Mn1Zn1Br1Cl1_1_10936.vasp,Mn1Zn1Br1Cl1,-0.214088665,0.5976412751427802 -Fe1Bi2Te4_164_5634.vasp,Fe1Bi2Te4,-1.4159696571428573,0.2081849389285694 -Mn2Mo2Se2S12_8_11149.vasp,Mn2Mo2Se2S12,-2.705833689444445,0.5080160927314783 -Cu2Mo1O4_1_5183.vasp,Cu2Mo1O4,-3.3176770671428573,0.4102969111904744 -In4O6_164_8678.vasp,In4O6,-3.822365166,0.2163728062499998 -Ba2Te2S8O14_11_2068.vasp,Ba2Te2S8O14,-3.937986629230769,0.2741260386858901 -Mn2As2Br2O4_26_10962.vasp,Mn2As2Br2O4,-3.338190537,0.0434950990131504 -Sc2Te6_129_16188.vasp,Sc2Te6,-2.294155975,0.2200618706250001 -B2Sb2O6_5_1706.vasp,B2Sb2O6,-5.431543107,0.1526392481666612 -Mn1In2Te4_156_10789.vasp,Mn1In2Te4,-1.33836749,0.2141215442857128 -Ta1Te2_187_17631.vasp,Ta1Te2,-3.633536016666667,0.114347352222222 -Bi2I2_129_2465.vasp,Bi2I2,-0.3925659725,0.0895593766666661 -Cd1I1Br1_156_3364.vasp,Cd1I1Br1,0.3115159833333333,0.0437035373611111 -Al1Ni2_187_694.vasp,Al1Ni2,-0.0831932299999999,0.7133743741666667 -Y2In2Cl2_164_20752.vasp,Y2In2Cl2,-2.798022795,0.2502953505555525 -Zr1Ti1Ni1I1N1Cl1O2_1_21472.vasp,Zr1Ti1Ni1I1N1Cl1O2,-4.54400877875,0.5068326416406246 -Ag1Au1S2_25_12.vasp,Ag1Au1S2,-0.59470147,0.3953072949218751 -V2N1F2_164_20110.vasp,V2N1F2,-4.613085656,-0.1682789611111164 -Na4P4S8_14_12404.vasp,Na4P4S8,-2.923865980625,0.1599991298660685 -C3N1_47_2760.vasp,C3N1,-5.90615882,1.91275941625 -Au2Br6_162_1459.vasp,Au2Br6,0.35724791,0.23339833625 -Ti4N3Cl2_164_19143.vasp,Ti4N3Cl2,-6.779098752222222,-0.1558764155555612 -Y2Br2O2_164_20700.vasp,Y2Br2O2,-5.460375421666666,0.0342440416666676 -In1Sn1S2Cl1_25_8360.vasp,In1Sn1S2Cl1,-1.920183408,0.3085008152499958 -Sr2Fe4S4O2_59_17222.vasp,Sr2Fe4S4O2,-2.4189311383333334,0.5656713766666647 -Mg2Te2W2S12_18_10524.vasp,Mg2Te2W2S12,-2.945340626666667,0.0493018605324045 -V1Te2_187_19944.vasp,V1Te2,-2.23911583,0.1281252277777778 -P12O24_1_13904.vasp,P12O24,-5.188148432222222,0.2054117401111076 -Cs2Cd4Te2O6F6_31_4702.vasp,Cs2Cd4Te2O6F6,-1.842302153,0.4459836491249974 -Tc4O14_14_18253.vasp,Tc4O14,-5.675303495555556,-0.0425414466666671 -Bi2Se1S2_1_2537.vasp,Bi2Se1S2,-2.316454984,-0.4656499904999998 -Ce1P2H2O6_164_3649.vasp,Ce1P2H2O6,-5.237208750909091,0.3447957580151426 -Si1Se1_123_16364.vasp,Si1Se1,-2.48791666,0.6036894401562504 -Cr1Cl5_1_4144.vasp,Cr1Cl5,-1.1533207566666668,0.0371976258333321 -Co2S2Cl2_59_3977.vasp,Co2S2Cl2,-2.1975537716666667,0.0830867333333333 -Ni2Mo2S8I2_129_13538.vasp,Ni2Mo2S8I2,-1.7533877507142857,0.5963146290178546 -Cr2Te4_11_4529.vasp,Cr2Te4,-1.8580221116666669,0.0850240272222222 -Ag2Sb4S3I2_6_413.vasp,Ag2Sb4S3I2,-1.3714329363636364,0.1919494749999969 -Hf1O1F2_25_7249.vasp,Hf1O1F2,-5.7355242,0.2645595937499996 -Zr2P4H4O16_4_21630.vasp,Zr2P4H4O16,-5.756400025384616,0.0512371173076928 -Sb4Au4_51_15770.vasp,Sb4Au4,-0.51911992875,0.99231220125 -Ge2Sb2H2O6_7_6843.vasp,Ge2Sb2H2O6,-3.95735738,0.4168484498958336 -Na2Cl2_129_12056.vasp,Na2Cl2,-1.853052415,0.2280964406249999 -Na2H8C6N6O8_2_12135.vasp,Na2H8C6N6O8,-5.601132392333333,-0.1549732190833441 -Ag2Se2_129_435.vasp,Ag2Se2,-0.2798987525,0.007057255 -Fe2C2Cl2_59_5831.vasp,Fe2C2Cl2,-2.643488646666667,1.2604033283333294 -Ir2Se4_11_8846.vasp,Ir2Se4,-2.670135858333333,-0.3170491024999999 -Co2H2Se4_6_3912.vasp,Co2H2Se4,-2.4469827625,0.6207475429166669 -Rh1O2_47_15159.vasp,Rh1O2,-3.1099007800000003,1.0207390783333326 -Nb3Te2Se1S1I2Br1_1_13028.vasp,Nb3Te2Se1S1I2Br1,-2.957852055,0.2862602676944337 -Nb4Cl16_14_13051.vasp,Nb4Cl16,-2.526592817,0.1873006235000001 -Gd2N2O10_4_6621.vasp,Gd2N2O10,-5.019004880714285,0.144674706071424 -Mn1Fe2N12_12_10714.vasp,Mn1Fe2N12,-5.566122116666667,-0.4004755356111147 -Be1Cl2_164_2219.vasp,Be1Cl2,-2.3679586166666664,0.2820447966666668 -Fe2P2Cl2O4_26_5903.vasp,Fe2P2Cl2O4,-3.64057246,0.354437380857139 -Fe2Sb2O4F2_26_5948.vasp,Fe2Sb2O4F2,-3.5420938810000004,0.1420747662499977 -Nb1F5_47_12508.vasp,Nb1F5,-3.7139182466666663,0.3609296199999998 -K2H6C2N8O2_51_9135.vasp,K2H6C2N8O2,-5.080036252499999,-1.7741551410208374 -Cu2Sb4Te3F2_6_5286.vasp,Cu2Sb4Te3F2,-1.3258136772727271,0.8344408657575717 -Tl2Au1Se4_2_19367.vasp,Tl2Au1Se4,-1.0367639728571427,0.3136050019047591 -Nb2Te2Pd4S2_51_12911.vasp,Nb2Te2Pd4S2,-2.814148488,-0.0968514192045485 -Ti2O6_59_18978.vasp,Ti2O6,-6.13616574375,0.1510160990624998 -Bi2O2_187_2483.vasp,Bi2O2,-2.9656973925,0.3271091299999984 -Fe1H4C4I2N2_47_5699.vasp,Fe1H4C4I2N2,-4.711844041538462,0.0276164968269079 -Ba2Cd1_123_1944.vasp,Ba2Cd1,0.9307663266666668,0.24311826 -W1C3_187_20425.vasp,W1C3,-5.602505105,1.7698720675 -Sc2O2_129_16112.vasp,Sc2O2,-5.2713851675,0.61932308046875 -Ca3Fe2S5Cl2_123_3177.vasp,Ca3Fe2S5Cl2,-2.4171280283333334,-0.0638573883333357 -K2H6Pb1O6_147_9151.vasp,K2H6Pb1O6,-3.6857553,0.0381011020000001 -Au2Br2_129_1452.vasp,Au2Br2,0.54512016,0.2461302437499999 -Mg2V8O18_85_10533.vasp,Mg2V8O18,-5.317716907857142,0.182389314999996 -Ta4Fe4S8_53_18040.vasp,Ta4Fe4S8,-3.8572800475,0.7437832195833298 -Zr2Br2O2_59_21522.vasp,Zr2Br2O2,-4.71444062,0.2044100383333331 -Ti2S2Br1Cl1_1_18993.vasp,Ti2S2Br1Cl1,-4.267169218333334,-0.0121163878333412 -Bi2Te2_187_2565.vasp,Bi2Te2,-1.0831157525,0.4367212474999999 -Pb2Br4_12_14223.vasp,Pb2Br4,-1.0161227933333332,0.1778012166666669 -Sc4C3S2_164_16233.vasp,Sc4C3S2,-4.879429994444445,0.7473737311111046 -Ga1Ag1Br4Cl2_1_6113.vasp,Ga1Ag1Br4Cl2,-0.55277771375,0.1839224052083333 -Ta1Br2_187_17520.vasp,Ta1Br2,-2.849985943333333,0.5596382730952316 -Mn1Ge2S3I1Br1_8_10755.vasp,Mn1Ge2S3I1Br1,-2.2815216525,-0.0275118098046874 -Cu1Te1Cl1_6_4987.vasp,Cu1Te1Cl1,-0.4770256633333333,0.2535798466666661 -Ti3Te2N2F2_8_19114.vasp,Ti3Te2N2F2,-5.0274053088888895,0.2028173780246854 -Nb2Se1I1Br1_1_12864.vasp,Nb2Se1I1Br1,-2.981729586,0.4876807451142784 -Hg1F2_115_7852.vasp,Hg1F2,-0.19697862,0.2497649358333333 -Nb2Te2_187_12914.vasp,Nb2Te2,-3.44846343,0.1842088008333293 -Al2Fe1Se4_164_828.vasp,Al2Fe1Se4,-2.746078192857143,-0.2418053892857156 -Fe1B4C2F6_47_5624.vasp,Fe1B4C2F6,-4.183987674615384,0.3658755471153738 -Ga1Cu1P2S6_149_6164.vasp,Ga1Cu1P2S6,-2.821073531,0.0775091111666608 -Bi1I2_115_2341.vasp,Bi1I2,-0.0846845433333333,0.4025265905555551 -V1H1Br1O2_6_19846.vasp,V1H1Br1O2,-4.078388824,0.1180102663333335 -Te3As4Au2I2_6_18546.vasp,Te3As4Au2I2,-1.1648962109090908,0.2240189815909065 -Na1Ga1Sb2O6_5_11866.vasp,Na1Ga1Sb2O6,-3.680942325,0.5971518698749956 -Zr1Pt1S2I2_1_21407.vasp,Zr1Pt1S2I2,-2.3866425933333333,0.3029153278472205 -Cr2Ag2O8_51_4295.vasp,Cr2Ag2O8,-3.5930702041666667,-0.1980558879166696 -Sc2Cl2_164_16062.vasp,Sc2Cl2,-2.751516745,0.0921079533333308 -Sr2Cu1Br2O2_123_17196.vasp,Sr2Cu1Br2O2,-2.7142722685714284,0.0686318259183638 -Rh5Se10_1_15256.vasp,Rh5Se10,-2.344489269333333,0.3291812373333331 -Sb1Te1I1_156_15511.vasp,Sb1Te1I1,-1.1089801666666668,0.2443323999999997 -K1Te2Pb1_156_8943.vasp,K1Te2Pb1,-0.8070208225,-0.2660064545833332 -In2Fe2Te5_187_8439.vasp,In2Fe2Te5,-1.3619819344444446,0.1888074352777758 -Cr1Cu1Se2_156_4158.vasp,Cr1Cu1Se2,-1.54416357,0.6219966193749997 -Sc1Br2N1_8_15911.vasp,Sc1Br2N1,-3.3089836025,0.1960527512499907 -Na2Cd4S8Cl6_31_12034.vasp,Na2Cd4S8Cl6,-1.17223342,0.2981205822291664 -Ca4P4H12O16_14_3233.vasp,Ca4P4H12O16,-4.852033727777777,0.0308462159259219 -Al1Ag1As2O6_149_593.vasp,Al1Ag1As2O6,-3.878696565,0.4814858488333292 -Au2S1I1Br1_1_1506.vasp,Au2S1I1Br1,-0.113398938,0.0942542222500004 -Mn2Tl2S5_156_11330.vasp,Mn2Tl2S5,-2.1380595844444445,0.5208824144444422 -Sb4S6_7_15820.vasp,Sb4S6,-2.607471149,0.1965219710000005 -Cu1Ni2O4_187_4923.vasp,Cu1Ni2O4,-2.4428937614285715,-0.2134457367857186 -Li2V4O10_59_10132.vasp,Li2V4O10,-5.27151239875,0.1982492731249951 -Sb2Mo2S6_2_15604.vasp,Sb2Mo2S6,-2.976309036,0.3702643131666648 -Hf2N2Cl2_59_7542.vasp,Hf2N2Cl2,-6.204758346666666,0.0361329433333343 -Hf3I1Br1O2_8_7712.vasp,Hf3I1Br1O2,-4.915606477142857,0.5336067995454448 -Al2Ga2Se6_31_845.vasp,Al2Ga2Se6,-2.690664555,0.0588952509999995 -Ba4Si2Te8_11_2189.vasp,Ba4Si2Te8,-2.200753856428572,0.1925402835714282 -Ni2As2S5_8_13449.vasp,Ni2As2S5,-2.146593725555556,0.2382257492592601 -Eu1Bi2_6_5585.vasp,Eu1Bi2,-1.59595467,0.0301730316666666 -K2Hg4Se2S6F6_31_9192.vasp,K2Hg4Se2S6F6,-1.0069497355,0.36859802390625 -Hg2Se2Cl2_59_8016.vasp,Hg2Se2Cl2,0.0501057783333333,0.3514224422222207 -V2H2C1S2_164_20073.vasp,V2H2C1S2,-4.139827531428572,-0.0777852442460391 -K2H4N2_11_9132.vasp,K2H4N2,-3.44390079875,0.0131032799999997 -Be3Bi3_25_2274.vasp,Be3Bi3,-1.8499022533333331,-0.4908893633333333 -Sr2Tl1Cu1Hg1S5_99_17338.vasp,Sr2Tl1Cu1Hg1S5,-1.704712458,0.1323838253593752 -Mn3Br1Cl1O2_1_11358.vasp,Mn3Br1Cl1O2,-2.741106091428571,0.3246496775184713 -Ta4Co4Te8_14_18027.vasp,Ta4Co4Te8,-3.224477146875,0.1292862492708297 -Ag2H8C6Br2N2_2_291.vasp,Ag2H8C6Br2N2,-4.454224621,0.1290354990000007 -Cr2Te2_123_4527.vasp,Cr2Te2,-2.119387445,0.421490197499996 -Hf1O2_191_7252.vasp,Hf1O2,-4.22728971,3.560204188333333 -V2F6_191_20061.vasp,V2F6,-3.366269365,-0.2931770524999999 -Ir4Pb12_127_8861.vasp,Ir4Pb12,-1.401687293125,0.8972570218750002 -Cs2Se2N2Cl6O6_4_4787.vasp,Cs2Se2N2Cl6O6,-2.340938756111111,0.4191560829166629 -Ga1Bi1_187_6141.vasp,Ga1Bi1,-0.847831445,-0.0669479575 -Te2P2_12_18444.vasp,Te2P2,-2.2690903175,0.5398005533333335 -Ni2Te3O8_5_13671.vasp,Ni2Te3O8,-3.160867887692308,-0.0699019395192328 -Zr3B2H2S2_187_21736.vasp,Zr3B2H2S2,-4.647016911111112,0.3058556722222072 -Si2O2_31_16420.vasp,Si2O2,-5.144023305,0.4109486424999994 -Te4As4Pd4_13_18561.vasp,Te4As4Pd4,-1.9136557141666664,0.2721916574999999 -Ba1O2F2_5_1848.vasp,Ba1O2F2,-2.491831058,1.1743609125000003 -Ti1Ge1Te1Se3_1_18787.vasp,Ti1Ge1Te1Se3,-3.1319843483333334,0.3329853202777759 -Na2B2H8O8_2_11979.vasp,Na2B2H8O8,-4.7867981145,0.049624432444445 -Zr1In1Se2_8_21315.vasp,Zr1In1Se2,-2.8896608475,0.8106020631249997 -Fe2Sb2O7_10_5949.vasp,Fe2Sb2O7,-3.69867939,0.557061325189391 -Cs2Hg4Se2I6O6_31_4737.vasp,Cs2Hg4Se2I6O6,-1.1107597595,0.0454098409166633 -K2Au2Se2_51_8978.vasp,K2Au2Se2,-0.4215994866666666,0.2946222933333334 -Te2Pd1_115_18462.vasp,Te2Pd1,-1.09176163,0.3972829066666667 -Ni2Te4F2_6_13674.vasp,Ni2Te4F2,-1.00262403875,0.1936143296874999 -Na1Tl1Br4O12_2_11947.vasp,Na1Tl1Br4O12,-2.2823668894444444,0.2261173920833308 -Te3Mo1Os1I2Br1_1_18548.vasp,Te3Mo1Os1I2Br1,-1.485127315,0.1647607533854159 -Zn1_191_21025.vasp,Zn1,2.38527844,-0.0114691599999998 -Li1Al1Sb2O6_5_9645.vasp,Li1Al1Sb2O6,-4.161529929,0.6975434042499948 -Zr4N3_164_21833.vasp,Zr4N3,-6.604282472857143,0.1810627885714222 -Cd2S2Br2_59_3543.vasp,Cd2S2Br2,-0.3483624233333333,0.345031549062498 -H10Pb2C8S4N2_2_6977.vasp,H10Pb2C8S4N2,-4.826844173076923,-0.0447882039663523 -Ag1Br2_164_36.vasp,Ag1Br2,0.20776021,0.1415877633333334 -Fe2N1O2F2_164_5882.vasp,Fe2N1O2F2,-2.6653406814285714,0.6384756685714219 -Ag1Pb1I4_10_98.vasp,Ag1Pb1I4,-0.0325041433333333,0.1483791433680559 -Ca1In1I2_1_2851.vasp,Ca1In1I2,-0.66326428,0.9238424484999996 -Mn2S1Br3_1_11209.vasp,Mn2S1Br3,-1.6241239533333334,0.1780877591666666 -Ga1F1_99_6183.vasp,Ga1F1,-1.858657785,0.4860248949999979 -As2W2O10_13_1308.vasp,As2W2O10,-5.080855699285714,0.173394696249995 -V1Se2_191_19933.vasp,V1Se2,-2.0881111633333336,1.0584925549999995 -Ba2Mn3O7_1_2028.vasp,Ba2Mn3O7,-4.2212903875,0.3951696256249959 -Cr2Br6_189_4336.vasp,Cr2Br6,-1.13360645375,-0.1223549949999998 -Sc3C2_187_16202.vasp,Sc3C2,-4.923897882,0.3187902999999954 -Sr2La2Cl10_11_17270.vasp,Sr2La2Cl10,-2.710611219285714,0.1229423149999979 -Ge1H6Au1_1_6671.vasp,Ge1H6Au1,-2.319459505,1.4882819783014094 -Tl3W2Cl9_174_19584.vasp,Tl3W2Cl9,-1.7787496342857143,0.1848950264285659 -K1Al1Cl4O12_2_8876.vasp,K1Al1Cl4O12,-2.796405408888889,0.194051210451382 -Y1Br2_187_20615.vasp,Y1Br2,-2.94613173,0.1106517294444418 -Ti2C2Br2_59_18915.vasp,Ti2C2Br2,-5.028711696666667,0.6375200366666589 -Cs1I2_25_4644.vasp,Cs1I2,0.0847810433333333,0.4928685462499996 -Ti8Zn2O18_85_19187.vasp,Ti8Zn2O18,-6.2520886525,0.3005882345535648 -Ti2Br2Cl2_6_18895.vasp,Ti2Br2Cl2,-3.366533105,0.07654805875 -K2Cd4Cl6O8_31_9043.vasp,K2Cd4Cl6O8,-1.419369232,0.3029567853749983 -Sb6H2S12_4_15849.vasp,Sb6H2S12,-2.5911265765,0.2584372363124978 -C8F4_67_2781.vasp,C8F4,-5.798108012499999,0.3178311666666618 -Hf1Zr3Mn1Zn1P1Se1S7Cl5_1_7417.vasp,Hf1Zr3Mn1Zn1P1Se1S7Cl5,-3.3783365395,0.2408991298323992 -Cr1Cu1Sb2S6_143_4154.vasp,Cr1Cu1Sb2S6,-2.375440641,0.3215356469791646 -Nb2Br5_1_12656.vasp,Nb2Br5,-2.2219735985714286,0.4881982920535658 -Ga1Ge1Te2_8_6196.vasp,Ga1Ge1Te2,-1.8910042475,-0.1927834770833332 -As1Cl5_25_1146.vasp,As1Cl5,-0.9510935333333334,0.1786018508333323 -Sc4H2C3S2_164_16240.vasp,Sc4H2C3S2,-4.676314848181819,0.582581658181812 -Fe1Br1Cl1_156_5635.vasp,Fe1Br1Cl1,-1.3625601633333335,-0.0998666241666667 -Sn2W3Cl14_143_16905.vasp,Sn2W3Cl14,-2.0826106263157897,0.083714616842105 -Na2Rh1_187_12272.vasp,Na2Rh1,-0.36522838,0.8775890999999989 -Cr1I1F1_156_4198.vasp,Cr1I1F1,-1.4372744366666668,0.7854314227777757 -Zn1H6C4O6_2_20956.vasp,Zn1H6C4O6,-4.917254841176471,0.1791068976470544 -Pt2Cl2O2_59_14610.vasp,Pt2Cl2O2,-1.98574096,0.2451074393518464 -Cd1Bi1Se1I1Br1_1_3280.vasp,Cd1Bi1Se1I1Br1,-0.4489476019999999,0.0373351653055554 -Sb2Te2Cl2O6_31_15711.vasp,Sb2Te2Cl2O6,-3.3037334716666664,0.1346377208333335 -Te2Os1_187_18422.vasp,Te2Os1,-2.4305279866666667,-0.2286543183333336 -Sc5N1Cl8_10_16272.vasp,Sc5N1Cl8,-3.3294116414285715,-0.3213498508333394 -Pd2Se6_11_14501.vasp,Pd2Se6,-1.69195849625,0.2712912033333333 -Tl2I6_26_19443.vasp,Tl2I6,0.22459416125,0.2530650809375 -Bi2Pb6_191_2501.vasp,Bi2Pb6,-0.10164863,1.01120795875 -Fe2Te2W2O12_113_6002.vasp,Fe2Te2W2O12,-4.649684799999999,-0.0089713049074116 -C4S4_7_2769.vasp,C4S4,-4.83034294,0.5367621646874996 -Tl1I1_99_19288.vasp,Tl1I1,0.34362234,0.7818351475 -Rb2Hg4Br6O8_31_14864.vasp,Rb2Hg4Br6O8,-1.0211016065,0.2555752745624997 -Sc2F6_147_16074.vasp,Sc2F6,-4.32884691375,-0.3276762037499994 -Tl2Si2S6_162_19541.vasp,Tl2Si2S6,-2.727951464,0.3024484886874981 -Mo2S2F2_59_11664.vasp,Mo2S2F2,-3.283940558333333,0.1463142099999959 -Gd2H14C4S2O16_2_6615.vasp,Gd2H14C4S2O16,-5.044926222368421,0.0595501561841984 -Sn2N2_164_16792.vasp,Sn2N2,-3.7033601275,-2.24019655875 -Zn1Te1As1S2Cl1_1_21017.vasp,Zn1Te1As1S2Cl1,-1.5633354216666666,0.5137362624340238 -Cd2Sb2O4F2_11_3555.vasp,Cd2Sb2O4F2,-2.6964690300000003,0.1147842051249958 -Sb1Se2O6F1_1_15503.vasp,Sb1Se2O6F1,-3.343365007,0.2925137081339257 -Rh1I2_115_15155.vasp,Rh1I2,-0.2413077666666666,0.6492809733333325 -Na2Cu1_187_12068.vasp,Na2Cu1,0.4347530166666666,1.179726576666666 -Ni2P4_11_13572.vasp,Ni2P4,-2.5791059633333333,0.6064338716666668 -In4O6_7_8679.vasp,In4O6,-3.741271041,0.2974669312499998 -Co2S4Cl2_2_3984.vasp,Co2S4Cl2,-2.18222994375,0.1827216348437501 -Sr2S8Br4_125_17305.vasp,Sr2S8Br4,-1.7994726585714285,0.4863910910714268 -Ce4Br10_11_3686.vasp,Ce4Br10,-2.41031176,0.1034405807142859 -Sb4Te4Pt4_13_15835.vasp,Sb4Te4Pt4,-1.8989126041666669,0.3725163483333329 -Cr2C1_164_4346.vasp,Cr2C1,-4.132228826666666,0.3971435163333292 -Er2S6_51_5570.vasp,Er2S6,-3.62308931875,0.2051527341406249 -Ni1F2_164_13315.vasp,Ni1F2,-1.0362350433333334,0.2353107449999998 -Eu2Zn1Ge3_187_5607.vasp,Eu2Zn1Ge3,-2.0662284950000003,0.613526583333333 -Ta2B1H2_164_17655.vasp,Ta2B1H2,-5.675165378,0.3123396080000011 -Cr2N1_164_4425.vasp,Cr2N1,-3.90132234,0.9667924311111112 -Tm2I6_162_19682.vasp,Tm2I6,-1.53452456625,0.0551163875 -Bi2Se1O2_164_2533.vasp,Bi2Se1O2,-2.998148896,0.2749916333333306 -Ga2Te3_143_6514.vasp,Ga2Te3,-1.412367104,0.3976568812000001 -Cs1Br2F1_123_4634.vasp,Cs1Br2F1,-0.6276746375,0.3830296878125001 -Sn1W1S4_3_16707.vasp,Sn1W1S4,-3.2395765483333334,0.3032903099999999 -In2S4_12_8558.vasp,In2S4,-2.030885835,0.5092952840624974 -Ta2N2F2_59_17783.vasp,Ta2N2F2,-6.619477853333334,0.207673878571424 -Pb4S4_53_14318.vasp,Pb4S4,-1.69000668125,-1.01687323625 -Li2C2Se2N2_31_9851.vasp,Li2C2Se2N2,-4.78528988125,0.0396082024479109 -Cr2N1O2_164_4424.vasp,Cr2N1O2,-5.12975167,0.1982315133333285 -Si4S8_14_16509.vasp,Si4S8,-3.77904682,0.1021757333333335 -Mn1Ge1S2Cl2_1_10741.vasp,Mn1Ge1S2Cl2,-2.35735453,0.1193057671874999 -Sc3N2F2_187_16212.vasp,Sc3N2F2,-5.6052532685714285,-0.3793683576190561 -Li2Ga2H16N8_4_9921.vasp,Li2Ga2H16N8,-4.491775069642857,0.0305129301785713 -V3Te4_12_20291.vasp,V3Te4,-2.4038158014285718,0.2093499536734642 -Ge2As1Se6_162_6728.vasp,Ge2As1Se6,-2.410876243333333,0.1540900620833312 -Mo2W2Se6_3_11700.vasp,Mo2W2Se6,-3.308939415,-0.1974059320000022 -Rb2B2H6Se2S6_4_14774.vasp,Rb2B2H6Se2S6,-2.930655567777778,0.2718097648379579 -Nb1I2_115_12521.vasp,Nb1I2,-1.60261529,0.7596878449999964 -Zr1Se2_164_21445.vasp,Zr1Se2,-4.01494888,0.0752039608333339 -Mo4H2S2N3_164_11746.vasp,Mo4H2S2N3,-4.319062711818182,-0.7098767415151586 -Nb1Se2_164_12579.vasp,Nb1Se2,-4.1382087400000005,0.1176602674999998 -In2S3_164_8556.vasp,In2S3,-2.455756774,0.0688836089999997 -Mn6F18_164_11468.vasp,Mn6F18,-2.6212063495833333,-0.2770021233333333 -Ge2Au2S6_51_6745.vasp,Ge2Au2S6,-2.128363885,0.1708623596249994 -Zr1Cl1F1_156_21274.vasp,Zr1Cl1F1,-3.6115793466666655,0.2553460712499962 -Cr2Mo2O8_25_4419.vasp,Cr2Mo2O8,-5.0594678958333335,0.0465605940277722 -K2Ru2C2Br8O4_31_9313.vasp,K2Ru2C2Br8O4,-2.570253216111111,0.349416193333331 -Cu2F2_164_5090.vasp,Cu2F2,-0.70758493,0.6623173899999999 -V1W1Cl6_12_19952.vasp,V1W1Cl6,-2.1806587475,0.2069465525000002 -V4B3F2_164_20301.vasp,V4B3F2,-4.551188542222223,0.230793641851847 -Pd1Se6Cl2_2_14393.vasp,Pd1Se6Cl2,-1.5200575488888888,0.0773412131995858 -H2Pb4C1Cl6O4_1_7006.vasp,H2Pb4C1Cl6O4,-3.0575811076470587,0.0817766587254869 -Ni2Cl2O2_59_13492.vasp,Ni2Cl2O2,-1.664522871666667,-0.3416316272916694 -Sb2Ru2Se6_162_15670.vasp,Sb2Ru2Se6,-2.449200175,0.4147869548999976 -Ag1Br1O2_1_32.vasp,Ag1Br1O2,-1.4235274675,0.207041368125 -Sc2S5O13_1_16140.vasp,Sc2S5O13,-4.728399914500001,0.1890355685781214 -Ni2P2O7_12_13560.vasp,Ni2P2O7,-4.182867537272728,0.1973656377272701 -Cr2Sb2S6_157_4481.vasp,Cr2Sb2S6,-2.8972139,0.2678562021666649 -Rh1F2_115_15150.vasp,Rh1F2,-1.44082575,0.8690069044444422 -Ni2Mo2S8Br2_129_13536.vasp,Ni2Mo2S8Br2,-1.821627256428572,0.5518450164285671 -Pd2S2F2_59_14460.vasp,Pd2S2F2,-1.8205081566666663,0.1609439481481447 -Ni2F6_191_13506.vasp,Ni2F6,-0.9153748225,0.4484108712499999 -W1S1O1_156_20448.vasp,W1S1O1,-5.289850566666667,0.0802986426530543 -Hg2Sb2O4F2_11_8005.vasp,Hg2Sb2O4F2,-2.347426106,0.3516605635862051 -Fe2H2S2_59_5855.vasp,Fe2H2S2,-2.23530681,0.6944564883333308 -Ta1Nb1Te1Br1_25_17577.vasp,Ta1Nb1Te1Br1,-3.9274234075,0.3021281780357074 -Tl1In1Hg1O4_156_19294.vasp,Tl1In1Hg1O4,-2.307288115714286,0.2847047252976179 -Sr1Ag2S8_89_17020.vasp,Sr1Ag2S8,-1.9336764463636364,0.151508521477269 -Sn1H2O2_164_16641.vasp,Sn1H2O2,-3.788221342,0.2901635381666669 -Ti2S2_2_19003.vasp,Ti2S2,-5.188498525,0.0083150950000003 -K2Ta1Cu1Se4_21_9356.vasp,K2Ta1Cu1Se4,-2.40654458875,0.1248196925 -Li2B2H6N8O2_51_9834.vasp,Li2B2H6N8O2,-5.1173339455,-1.6577665496666718 -Ti2As1Se2_164_18878.vasp,Ti2As1Se2,-4.836409556,-1.1343585623750032 -Cr4B3H2O2_164_4589.vasp,Cr4B3H2O2,-4.397137646363636,0.4968339454545409 -Te6As2Au2_2_18639.vasp,Te6As2Au2,-1.087125543,-0.0591287694166693 -Si1Br2_115_16320.vasp,Si1Br2,-1.4042381933333334,0.4000449549999975 -Co2Bi2Se4Br2_10_3865.vasp,Co2Bi2Se4Br2,-1.576363666,0.2669429529333313 -Cu2I2O4_17_5170.vasp,Cu2I2O4,-1.44858621625,0.6502720107499997 -Nb2H2N1_164_12734.vasp,Nb2H2N1,-5.61428234,-0.0082396759999991 -Tl1Ag1_47_19212.vasp,Tl1Ag1,1.06841531,0.6005699175 -Na2In1O2_164_12184.vasp,Na2In1O2,-2.882742902,0.3586839477142797 -Hf2I4_11_7521.vasp,Hf2I4,-2.3663249266666666,0.3508633199999971 -Mn3B2H2O2_187_11353.vasp,Mn3B2H2O2,-4.065885558888889,0.2764892919444373 -W2Br4O4_26_20464.vasp,W2Br4O4,-3.889439233,0.0210258460000001 -Tl1I2_164_19290.vasp,Tl1I2,7.599e-05,0.1651275389583332 -In1P1F3_143_8295.vasp,In1P1F3,-2.116266474,0.7860034490000001 -P8O12_51_14150.vasp,P8O12,-4.698793037,0.5600107166000008 -Mg2Ti1_187_10528.vasp,Mg2Ti1,-1.59530485,0.5323799644444429 -Ta4Pd2O10_59_18083.vasp,Ta4Pd2O10,-6.248532365,0.2973473362500001 -Li4Ti1S4_111_10233.vasp,Li4Ti1S4,-3.631114125555556,0.0563993655555521 -Ge4Pb8S16_14_6940.vasp,Ge4Pb8S16,-2.633082086785714,0.1148911142857143 -Sb4P2S12F2_4_15798.vasp,Sb4P2S12F2,-2.6604641655,0.2738650761041614 -Ti3B2H2_187_19062.vasp,Ti3B2H2,-5.5740682957142855,0.153927720714281 -Sn2As2O6_7_16723.vasp,Sn2As2O6,-4.032532392,0.2933573463333303 -Hg2Sb2S4F2_11_8009.vasp,Hg2Sb2S4F2,-1.489913994,0.3638322183333301 -K2Cd4Se2Cl6O6_31_9059.vasp,K2Cd4Se2Cl6O6,-1.681640522,0.1980838879999966 -Mn2Bi2Br2O4_6_11000.vasp,Mn2Bi2Br2O4,-2.974818054,0.2416888502586176 -Ti1Bi1P1_156_18741.vasp,Ti1Bi1P1,-3.905496823333333,0.4538298549999955 -Cd2Sb2O6_147_3556.vasp,Cd2Sb2O6,-2.686481776,0.5869659196874968 -Mg2Ge4W2O12_13_10461.vasp,Mg2Ge4W2O12,-4.7119807375,0.4282102542499952 -Zr1Mn1I6_5_21322.vasp,Zr1Mn1I6,-1.11819005375,0.0819817170833332 -Mg1Pb2_164_10393.vasp,Mg1Pb2,-0.4828606433333333,0.0094229699999995 -Al2H8Se4O16_14_870.vasp,Al2H8Se4O16,-4.195354272,0.0219104283249955 -In1Co5I2_123_8222.vasp,In1Co5I2,-0.829165105,0.4204918856249999 -V4O10_2_20340.vasp,V4O10,-5.4673536007142856,-0.0087750185714288 -Cd2Cu2Se2Br2_26_3493.vasp,Cd2Cu2Se2Br2,-0.1555594675,-0.0880833874999999 -Mo1W3S8_25_11558.vasp,Mo1W3S8,-4.37349857,-0.0901516241666664 -Cd2As2O6_147_3454.vasp,Cd2As2O6,-3.04110178,0.3263689009285655 -Zr1Zn1Se1I2_1_21496.vasp,Zr1Zn1Se1I2,-1.3000723239999998,0.0666411072500001 -Na2Cd4Te2S6Cl6_31_12048.vasp,Na2Cd4Te2S6Cl6,-1.090198732,0.2755453659583304 -Na2H6Pt1O6_147_12128.vasp,Na2H6Pt1O6,-3.889023035333333,0.0917876313333332 -Co2F8_7_3901.vasp,Co2F8,-1.8012297409999998,0.0197643150000002 -V4Te2Se2_13_20373.vasp,V4Te2Se2,-2.90201776625,0.20436495223214 -Hf3Te2H2N2_187_7736.vasp,Hf3Te2H2N2,-4.975039975555556,0.7579440455555508 -Ta2F10_2_17718.vasp,Ta2F10,-4.2771926425,0.0897636566666664 -Nb2B1Te2_12_12637.vasp,Nb2B1Te2,-4.71860821,0.1655613136666667 -Ca4N2_59_3228.vasp,Ca4N2,-2.6836719116666665,0.2463142383333334 -Bi2F6_147_2457.vasp,Bi2F6,-2.51047577,0.4848300956249995 -Cu2O2_164_5199.vasp,Cu2O2,-1.725658335,0.7471301631249999 -Ti2H2C1S2_164_18945.vasp,Ti2H2C1S2,-5.226542572857142,0.2320217494642804 -V3I8_156_20274.vasp,V3I8,-1.0311965972727273,0.0342743333333322 -Hf1Zr2Se3I2_1_7414.vasp,Hf1Zr2Se3I2,-3.19732182625,0.2015221615625002 -W2N1Cl2_164_20507.vasp,W2N1Cl2,-4.065343186,0.2815227850000004 -Sr1I2_164_17059.vasp,Sr1I2,-1.209372143333333,0.0766712155555555 -H2Pt2_164_7022.vasp,H2Pt2,-2.3441744675,1.7546043700000002 -Li2Ta2I12_4_10079.vasp,Li2Ta2I12,-1.44130360625,0.0824991651562501 -K2H6C2Se2O6_1_9139.vasp,K2H6C2Se2O6,-3.853824962222222,0.454079728777765 -Au4Se2_51_1594.vasp,Au4Se2,0.0802505866666666,1.030108336666666 -Bi1Cl2_115_2325.vasp,Bi1Cl2,-0.9258698133333332,0.3840430394444433 -Sr2Ag1I2O2_123_17101.vasp,Sr2Ag1I2O2,-2.236667232857143,0.0226841449999968 -Te2P4S12_18_18446.vasp,Te2P4S12,-2.5679046772222223,0.3787389467824043 -Na2Hg4S2Br6O6_31_12153.vasp,Na2Hg4S2Br6O6,-1.677048228,0.1397498067916623 -Cr1H4C4S6F1_1_4191.vasp,Cr1H4C4S6F1,-4.061740694375,0.3185230611718728 -Eu1In2Au1_1_5589.vasp,Eu1In2Au1,-0.90861955,0.4916309299999999 -Sb2Pd2Se6_12_15655.vasp,Sb2Pd2Se6,-1.8009423300000005,0.3160241068999974 -Cu1Ge1Cl6_1_4878.vasp,Cu1Ge1Cl6,-1.0490036425,0.1690035621874999 -V1S1O1_156_19912.vasp,V1S1O1,-4.554229733333334,0.1248261731760902 -Sb1I1O1_156_15459.vasp,Sb1I1O1,-2.054919696666667,0.5988200529166641 -Rh2Se2_129_15241.vasp,Rh2Se2,-2.19164849,0.2606554342045433 -Fe2H4Se2S8_4_5860.vasp,Fe2H4Se2S8,-2.632339044375,-0.0786064249739585 -Ag2Au2F8_2_174.vasp,Ag2Au2F8,-0.6698824083333333,0.1079931483333334 -Cu2P2Se5S1_1_5214.vasp,Cu2P2Se5S1,-2.008249921,0.1822954580052062 -Ni4S2I1Cl1_6_13755.vasp,Ni4S2I1Cl1,-0.5894369725,-0.136504354375 -Sc2I2N1_2_16090.vasp,Sc2I2N1,-3.52521129,-0.0046282776666684 -In1I2_164_8274.vasp,In1I2,-0.3806146433333333,0.1603055149999999 -Ta4Sn2Se8_55_18117.vasp,Ta4Sn2Se8,-3.967301501428572,0.2079882835714248 -Ta1V1Te1Se1_25_17640.vasp,Ta1V1Te1Se1,-3.8181466325,0.2802121451814435 -Co2I2_129_3927.vasp,Co2I2,-0.3171480475,0.5089905483333327 -Os6S8_11_13896.vasp,Os6S8,-3.925458505,0.5998490585714227 -Ir1Pb1Br4_1_8745.vasp,Ir1Pb1Br4,-0.9432139633333332,0.513853867222219 -As2Cl6_12_1202.vasp,As2Cl6,-1.49563208,0.0972734049999999 -Mg1Br2O6_12_10345.vasp,Mg1Br2O6,-2.6570912555555557,0.0747870901388869 -P2Pd1_123_14019.vasp,P2Pd1,-2.797786456666667,0.6907759083333329 -Cr1P2S7_5_4231.vasp,Cr1P2S7,-3.191383484,0.0374025424687474 -Li1Cd1Cl1O2_1_9669.vasp,Li1Cd1Cl1O2,-2.093343424,0.2700075253333308 -In2F6_189_8425.vasp,In2F6,-2.44647462125,0.1698637862499996 -Hf3B2_187_7688.vasp,Hf3B2,-5.882217438,0.3928915859999953 -H3Br1O1_1_7046.vasp,H3Br1O1,-3.3310227580000005,0.0311920198749975 -Te1Mo1Rh1S1_25_18301.vasp,Te1Mo1Rh1S1,-2.541721725,0.4903902183333333 -Fe2O2_129_5890.vasp,Fe2O2,-2.4049832775,1.1407420610416643 -As1O1F1_156_1154.vasp,As1O1F1,-3.283869423333333,0.4629878733333332 -P4Pd4O4_13_14100.vasp,P4Pd4O4,-3.6055138816666665,0.2867018866999931 -Al3Sb3O9_157_1053.vasp,Al3Sb3O9,-4.746182829333334,0.4443298234166661 -Li3Co1Ni2O6_10_10145.vasp,Li3Co1Ni2O6,-3.5619281225,-0.171911206145839 -Al2H2Se2S8_11_865.vasp,Al2H2Se2S8,-2.8341982107142853,0.271487143601186 -Sb1As1S2I2_1_15430.vasp,Sb1As1S2I2,-1.72503178,0.1902411685416631 -B2F2_129_1665.vasp,B2F2,-3.4434844,1.088907166111107 -Zr2Te6_59_21720.vasp,Zr2Te6,-2.68168521875,0.0766422462499996 -La4F6_12_9627.vasp,La4F6,-3.960652335,0.3257484709999955 -Y2H2C1O2_164_20738.vasp,Y2H2C1O2,-5.710894437142857,0.6659773385714223 -Ge6Sb6_12_6969.vasp,Ge6Sb6,-2.619102555,-0.3908312062500001 -Cd2Te2_164_3597.vasp,Cd2Te2,0.3137642375,-0.5556115175 -Cd1H4C4I2N2_10_3349.vasp,Cd1H4C4I2N2,-4.413192766923077,0.1829219375641013 -Pb2Se2S8_7_14291.vasp,Pb2Se2S8,-2.173812266666667,0.2214323140624976 -Mn1In2O4_156_10782.vasp,Mn1In2O4,-3.852258448571429,0.130835759973827 -Hf1Br4_123_7132.vasp,Hf1Br4,-2.277373424,0.2926117160000001 -Fe2S2O8_31_5935.vasp,Fe2S2O8,-3.6762611825,0.6327854591666671 -Mn4B3O2F2_164_11423.vasp,Mn4B3O2F2,-3.2241661999999995,1.037549219841264 -Mn1Nb1S1I2N1_8_10807.vasp,Mn1Nb1S1I2N1,-3.1552978416666666,0.2909119553333229 -Co2Sb2Te6_162_4009.vasp,Co2Sb2Te6,-1.586779407,0.2188795493999965 -Cu4Te2S12_14_5479.vasp,Cu4Te2S12,-1.6703170427777776,0.2733429350925909 -K2Cu2Mo2O10_11_9088.vasp,K2Cu2Mo2O10,-3.710746741875,0.2107673192968751 -Mn2Bi2Se4Cl2_26_11015.vasp,Mn2Bi2Se4Cl2,-1.820458598,0.1939328244166651 -K2Ca1N4O8_12_9039.vasp,K2Ca1N4O8,-4.2731902360000005,0.1253796272666529 -Zr1Sb2O6F2_164_21425.vasp,Zr1Sb2O6F2,-4.448623119090909,0.3152828093181767 -Sc2C1O2F2_164_16053.vasp,Sc2C1O2F2,-3.92038745,2.076349699999993 -Sc1Nb1Se1Br4O1_1_15961.vasp,Sc1Nb1Se1Br4O1,-3.20180357,0.15121113273437 -Au1S2_115_1441.vasp,Au1S2,-0.9760521633333332,0.5711018131249986 -Sr2H8S6_26_17252.vasp,Sr2H8S6,-3.18584531,-0.0151059968750001 -W2N3_187_20515.vasp,W2N3,-6.825159997999999,0.3077134820000013 -W4S8_2_20593.vasp,W4S8,-4.455255191666667,0.0173434583333333 -Ta13Te26_2_17503.vasp,Ta13Te26,-3.663161656923077,0.0847217119658121 -As2Se2_129_1301.vasp,As2Se2,-2.1581755375,0.5487094016666638 -K2Ag2Se2_129_8967.vasp,K2Ag2Se2,-0.6171547416666666,0.0550909466666666 -Pr1C5_47_14529.vasp,Pr1C5,-5.366017685,1.9113677512499927 -Mn2N1Cl2_164_11151.vasp,Mn2N1Cl2,-2.990314174,0.2924632259999999 -Ti2C2F2_59_18917.vasp,Ti2C2F2,-5.754455861666667,0.1774477605555495 -Cd1Pb2Cl2O2_12_3390.vasp,Cd1Pb2Cl2O2,-2.09825011,0.0840262071428572 -Mo4C3_164_11740.vasp,Mo4C3,-4.858504021428572,0.6588564889285662 -As4O10_31_1330.vasp,As4O10,-4.119551081428571,0.2901989707142824 -Bi1O1_156_2348.vasp,Bi1O1,-2.59660329,0.6962032324999985 -Rb2Cd4I6O8_31_14805.vasp,Rb2Cd4I6O8,-1.045934621,0.5443184531944429 -Cu2P4S3F2_6_5222.vasp,Cu2P4S3F2,-2.51425832,0.33719579504043 -Er2Te6_51_5576.vasp,Er2Te6,-2.01480430625,0.4009635925000001 -In1Ge1Cl3_1_8261.vasp,In1Ge1Cl3,-1.6619251519999998,-0.0745576749999996 -Li2Cu1O2_12_9881.vasp,Li2Cu1O2,-3.022474572,0.5405678456666649 -Ba2Au1S2I2_123_1910.vasp,Ba2Au1S2I2,-1.846491277142857,0.113498860714284 -Li2Sn4P6O20_11_10074.vasp,Li2Sn4P6O20,-5.1157669125,0.0623623739375003 -Nb1Ni7C4Se3Cl5_1_12548.vasp,Nb1Ni7C4Se3Cl5,-2.0367570285,1.1560753812500002 -Hg6Se8O10_2_8100.vasp,Hg6Se8O10,-1.8900728625,0.0327715341666667 -Si3Ir1_187_16469.vasp,Si3Ir1,-3.195777555,0.9311609259374964 -Al2Te5_12_1020.vasp,Al2Te5,-1.87999016,0.0906796407142855 -Al2Si2Te6_162_989.vasp,Al2Si2Te6,-2.335142854,0.0457046240000003 -Sr1Cl2_115_17038.vasp,Sr1Cl2,-2.0610734133333333,0.4364243399999998 -Tl2S2Cl2_59_19499.vasp,Tl2S2Cl2,-1.1692444133333333,0.321715726458332 -Ni1Ag2H6C14N2O10_2_13253.vasp,Ni1Ag2H6C14N2O10,-5.451809360571429,0.4835670656309421 -Hg4I8_115_8077.vasp,Hg4I8,0.9333189133333332,0.0604386561111111 -Na2C4O6F6_2_12008.vasp,Na2C4O6F6,-4.534738658333334,-0.0284848038888921 -Sc1Sb2Te6Au1_149_15995.vasp,Sc1Sb2Te6Au1,-1.522690215,0.2406020613124996 -Bi2Sb2S6_157_2527.vasp,Bi2Sb2S6,-2.43982996,-0.3111224514999997 -Cr1Ga2Se4_164_4178.vasp,Cr1Ga2Se4,-2.4560758885714287,0.0708805560714261 -Mo2S4Cl6_2_11673.vasp,Mo2S4Cl6,-2.1710429133333333,0.0764207183333334 -Hf2B1O2_164_7438.vasp,Hf2B1O2,-6.961209864,0.2261628057727212 -Re1Au2Br6_2_14991.vasp,Re1Au2Br6,-0.6487908511111111,0.2253014980092583 -Sn2Au2S6_51_16733.vasp,Sn2Au2S6,-1.749268686,0.2233277799999993 -Mn2Sb2Te4Br2_10_11255.vasp,Mn2Sb2Te4Br2,-1.498046596,0.1871653667499979 -V1Mo2Br1N1Cl1O2_1_19884.vasp,V1Mo2Br1N1Cl1O2,-3.9437562625,0.378131054114583 -Ta1Nb2Ga1Se4I4_1_17581.vasp,Ta1Nb2Ga1Se4I4,-2.869412046666667,-0.149287232056887 -Sm2Br6_59_16567.vasp,Sm2Br6,-2.36959717125,0.0056998537499999 -P2Au2O6_2_13954.vasp,P2Au2O6,-3.676085867,0.7181249383333261 -Ag2I2N2_2_312.vasp,Ag2I2N2,-0.8965956133333334,0.7163390574999986 -V2Co1S4_164_20043.vasp,V2Co1S4,-3.567274935714285,0.0590581202976165 -Fe2Se6_11_5988.vasp,Fe2Se6,-1.7966610925,0.5067301145833333 -Cr2Cu1S3I1Cl1_8_4361.vasp,Cr2Cu1S3I1Cl1,-2.05233271875,0.1662100094010407 -Nb1Zn1I1Br1N1O1_6_12615.vasp,Nb1Zn1I1Br1N1O1,-3.432657573333333,0.2243556885416664 -As2Pb2C2S6F6_7_1250.vasp,As2Pb2C2S6F6,-2.9106153855555554,0.540710776898145 -Ti2C2I2_59_18918.vasp,Ti2C2I2,-4.751537965,0.3004629779166631 -As2Au2S6_12_1188.vasp,As2Au2S6,-1.900321142,0.5259302281874976 -Cr2H4Se2O10_2_4403.vasp,Cr2H4Se2O10,-4.247767770555556,-0.0765050424151311 -Os1Cl2_187_13798.vasp,Os1Cl2,-1.39071951,0.9419294858333288 -Pt1Se1_156_14592.vasp,Pt1Se1,-1.340211935,0.8350891175 -Ag2W1O4_111_489.vasp,Ag2W1O4,-3.424834545714286,0.1992974024999974 -Te3P4Au2F2_6_18556.vasp,Te3P4Au2F2,-1.7859830799999998,0.5646554643939345 -Cs2Os2S2N2F10_11_4763.vasp,Cs2Os2S2N2F10,-3.052580491666667,-0.0952576677777843 -Ir3Pt1Br1N1Cl3O1_1_8856.vasp,Ir3Pt1Br1N1Cl3O1,-2.207427866,0.8320636163333295 -Si2O1_8_16418.vasp,Si2O1,-3.86722777,0.8328032116666664 -Sn2Cl4_12_16764.vasp,Sn2Cl4,-1.445875515,0.1327844433333334 -Mn2Fe1Se1Br1Cl3_1_11072.vasp,Mn2Fe1Se1Br1Cl3,-1.56559384125,0.0308934457812499 -Ba2Mg2Pb2_129_2019.vasp,Ba2Mg2Pb2,0.00128476,0.7624554299999999 -B2N1_65_1684.vasp,B2N1,-6.185092273333333,1.0704866544444385 -Hf2Te6Se16_2_7646.vasp,Hf2Te6Se16,-2.26130798,0.264974837083333 -B1I1_99_1624.vasp,B1I1,-0.9384852,1.9360336419444415 -Pb4Se2N4O16_31_14320.vasp,Pb4Se2N4O16,-4.1135641373076925,0.0573412575384526 -Tl1Hg1Cl2_1_19285.vasp,Tl1Hg1Cl2,0.02707826,0.21002137375 -La8Si4I8O16_2_9632.vasp,La8Si4I8O16,-5.223672101388889,0.0077937319444396 -P1Se2_164_13950.vasp,P1Se2,-2.5761657266666664,0.2391207875694424 -Cd1F2_115_3306.vasp,Cd1F2,-0.9570011433333332,0.1919642033333334 -Ni4H8C8N12Cl4_14_13746.vasp,Ni4H8C8N12Cl4,-4.9034143044444445,0.3486076324536944 -Pb8O12_14_14338.vasp,Pb8O12,-3.326208525,0.0907969092499971 -Hg1S1Cl2_1_7906.vasp,Hg1S1Cl2,-0.2932229425,0.26356962484375 -Sn2O2_129_16797.vasp,Sn2O2,-2.85969347,0.8769519125 -Ge2I2_129_6781.vasp,Ge2I2,-1.3325737525,0.1247890962499999 -Ga2S2Cl2_31_6439.vasp,Ga2S2Cl2,-2.347905605,0.0506657966666668 -Pb2Se2Cl2_59_14286.vasp,Pb2Se2Cl2,-1.483615695,0.19401330253472 -Ca2Sb4O8_11_3120.vasp,Ca2Sb4O8,-4.411832319285714,-0.0941973561428608 -Mn2Mo2Se2O12_113_11148.vasp,Mn2Mo2Se2O12,-4.348498782222222,0.0216128829166626 -Zr1Nb1S1I2_156_21351.vasp,Zr1Nb1S1I2,-3.264431128,0.1038800014666629 -Sb8N4O24_2_15867.vasp,Sb8N4O24,-4.323995887500001,0.1172109652777675 -Pt2F6_149_14623.vasp,Pt2F6,-1.29752918375,0.3257971228125 -Ga2S2Br2_59_6438.vasp,Ga2S2Br2,-2.052252625,0.1052230024999998 -Cd4H4Se4N4O24_14_3628.vasp,Cd4H4Se4N4O24,-3.51375003975,0.2062539160416633 -V3B2O2F2_187_20242.vasp,V3B2O2F2,-3.87606966,1.1978400264197488 -Sn6Sb6_12_17001.vasp,Sn6Sb6,-1.6525599233333337,0.1835694032291666 -Na2Nb2I12_4_12228.vasp,Na2Nb2I12,-1.11153185375,-0.0747427087499998 -Zn2Ge2S6_162_21089.vasp,Zn2Ge2S6,-2.1523015130000003,0.2188733434249967 -Y1Ti1F5_47_20684.vasp,Y1Ti1F5,-4.085173597142857,0.7247777216666569 -Ru8S10_1_15375.vasp,Ru8S10,-3.3776046111111118,0.3343393233333294 -Mn1P2H12_2_10836.vasp,Mn1P2H12,-2.9880035526666666,1.6768671281851817 -Hf1Mn1Br6_149_7209.vasp,Hf1Mn1Br6,-2.037065035,0.0501759490625 -Sr4Ni2Br2O6_129_17453.vasp,Sr4Ni2Br2O6,-3.246810236428572,-0.2381422003571491 -Ga2Si2Se6_162_6491.vasp,Ga2Si2Se6,-2.751578634,0.087271015124998 -K2Te2H2_12_9371.vasp,K2Te2H2,-1.5070675916666667,0.8633829272222202 -Cd2Bi2S4I2_11_3474.vasp,Cd2Bi2S4I2,-1.066354971,0.1944738875000002 -Ba1Sn4O7_156_1861.vasp,Ba1Sn4O7,-3.536785880833333,0.6954312797916626 -Mn3Si1Se2_187_11412.vasp,Mn3Si1Se2,-2.607229896666667,0.1940124697222192 -Hf2Se1S1I1Br1_6_7598.vasp,Hf2Se1S1I1Br1,-3.87366035,0.023078607291664 -Li2H4C2O6_7_9935.vasp,Li2H4C2O6,-4.800780197857143,0.3385076908333218 -Zn2I2_129_21108.vasp,Zn2I2,1.4007798325,0.5640845540625 -Ge2As2C2O6F6_7_6729.vasp,Ge2As2C2O6F6,-3.956386690555556,0.4174300522222106 -Al1Ag1Sb2O6_149_600.vasp,Al1Ag1Sb2O6,-3.95965685,0.3665413816249965 -Te2Au2F2_59_18367.vasp,Te2Au2F2,-0.5225582750000001,0.7590372545833312 -Hf1Co1F6_5_7148.vasp,Hf1Co1F6,-3.7344592675,0.1184588787499998 -Co3Ge1Se2_187_4062.vasp,Co3Ge1Se2,-2.1601296766666667,0.0512386124365056 -Lu4B3C4_2_10322.vasp,Lu4B3C4,-5.5007253227272725,0.4835244609090914 -Tl2S2I2_99_19501.vasp,Tl2S2I2,-0.8533266683333333,0.3114434697916658 -Ni2Bi2I2O4_10_13466.vasp,Ni2Bi2I2O4,-1.910802036,0.3036797809999999 -Ti2P2O6_162_18981.vasp,Ti2P2O6,-6.012555662,0.4264070924999942 -V1Pd1Se1S1I1Cl1_1_19903.vasp,V1Pd1Se1S1I1Cl1,-1.8290005533333331,0.204607861666663 -Ba2La2Br10_11_2014.vasp,Ba2La2Br10,-2.268731202142857,0.0919265021428552 -K2P2O6_26_9289.vasp,K2P2O6,-4.7835071110000005,0.0995222244999993 -Be4N2_59_2287.vasp,Be4N2,-4.75202728,0.5662992122916627 -Na1_191_11959.vasp,Na1,0.11510879,0.43836253 -Te1As1I1_156_18281.vasp,Te1As1I1,-1.2739185033333331,0.2379763483333332 -Cr1S1Cl2_47_4240.vasp,Cr1S1Cl2,-2.0387385025,0.1680818541145812 -K2Hg4S6O2F6_31_9181.vasp,K2Hg4S6O2F6,-1.268070273,0.3409658208611075 -Hf1P2H2S6_164_7256.vasp,Hf1P2H2S6,-3.531836552727273,0.3633789448863566 -Rb2Ru2C2S4Cl8_31_14924.vasp,Rb2Ru2C2S4Cl8,-2.207267081111111,0.3715065149999966 -Tb2H4Br2_164_18199.vasp,Tb2H4Br2,-3.28739278375,0.0266456762499998 -Ir4Br3Cl1O4_8_8859.vasp,Ir4Br3Cl1O4,-2.78584593,0.4400867972222184 -Lu2H4Cl2O4_11_10311.vasp,Lu2H4Cl2O4,-4.6635856633333335,0.0947072237499995 -Fe3S4_156_6063.vasp,Fe3S4,-1.9870421228571429,-0.0248366850000016 -Ba2H16C12N12O16_2_1989.vasp,Ba2H16C12N12O16,-5.784691887758621,-0.0164213307327694 -Al2Os1_123_921.vasp,Al2Os1,-3.386334263333333,0.6294211499999998 -K2Hf1H6S6_147_9166.vasp,K2Hf1H6S6,-3.274823136666667,0.0724202669999998 -Te2W2_187_18533.vasp,Te2W2,-3.00848555,1.02956470625 -Ca4Se4O16_14_3239.vasp,Ca4Se4O16,-3.85825163875,0.2749421695833329 -Li2Mg1H4S10_2_9967.vasp,Li2Mg1H4S10,-2.847286030588235,0.0497424687499979 -Rh1Se2_115_15169.vasp,Rh1Se2,-1.96131002,0.7123604866666664 -As2Se1S2_164_1297.vasp,As2Se1S2,-2.781674102,0.4333308553333307 -Zn2Mo2S2O12_4_21118.vasp,Zn2Mo2S2O12,-4.090077635555556,0.159815910864577 -Sb2Br9_164_15559.vasp,Sb2Br9,-0.5901962527272727,0.2071959018181817 -Al1P1S4_16_701.vasp,Al1P1S4,-3.3485497616666664,0.0996877058333338 -Ca2Au1S2I2_38_2937.vasp,Ca2Au1S2I2,-1.5047172685714287,0.1713876034285677 -Hg2Sb2S4Br2_11_8007.vasp,Hg2Sb2S4Br2,-1.160461879,-0.0798496515000021 -Tl1P1_187_19312.vasp,Tl1P1,-1.15936917,0.8446508332500001 -Ir2Cl4O2_65_8777.vasp,Ir2Cl4O2,-2.27920612375,0.3298551846875002 -Sn3S2Br2_1_16926.vasp,Sn3S2Br2,-1.7199618514285715,0.1880803828571411 -Cd2Cu2Te2Cl2_26_3498.vasp,Cd2Cu2Te2Cl2,-0.0384249325,0.0578744403125 -Mn1F2_164_10704.vasp,Mn1F2,-2.75904995,0.05029451 -Y2O2F2_164_20762.vasp,Y2O2F2,-6.310193176666666,0.1311400750000002 -K4Te4S8_13_9523.vasp,K4Te4S8,-1.76504610875,0.2075663854427082 -Li2H6Pt1O6_147_9952.vasp,Li2H6Pt1O6,-4.087615476,0.0717040485000004 -Na1N3_10_11907.vasp,Na1N3,-4.1011731775,1.3353695850000005 -Si2As2Se6_147_16383.vasp,Si2As2Se6,-2.819167271,0.1388417747916641 -Rh2Se2_164_15243.vasp,Rh2Se2,-2.1792530625,0.2730508617045433 -Fe2Te4P2Cl2_26_6016.vasp,Fe2Te4P2Cl2,-1.748874235,0.2180797405833325 -Cd1H12C12Br2N2O2_2_3322.vasp,Cd1H12C12Br2N2O2,-5.179172462258064,0.1380652682795653 -Pd2Br2_129_14401.vasp,Pd2Br2,-0.1688360275,0.67177228 -Cu1Te2_187_4997.vasp,Cu1Te2,-0.48901193,0.4132370122222214 -Fe2O2F2_59_5889.vasp,Fe2O2F2,-3.0997602066666663,-0.1675995687500022 -Ag4Cl4O4F4_1_509.vasp,Ag4Cl4O4F4,-0.75380157,0.4354990165625 -Mg1Bi2O5_6_10342.vasp,Mg1Bi2O5,-3.64441242,0.1580027532031251 -Na1H3C2S5_1_11874.vasp,Na1H3C2S5,-3.5817772027272725,0.2525831524999932 -Hf2Tl4Pb2S8_13_7657.vasp,Hf2Tl4Pb2S8,-3.020546133125,0.1650773681249999 -Zr4I4O4_7_21828.vasp,Zr4I4O4,-4.263609813333333,0.3621446359259228 -Te2Pd2_187_18476.vasp,Te2Pd2,-0.910158605,0.27136475125 -Nb1Sn1S2I2_8_12588.vasp,Nb1Sn1S2I2,-2.50081063,0.0002319372222223 -Zr1Te1Br1_156_21459.vasp,Zr1Te1Br1,-2.735095623333333,0.2123227761111084 -K1Fe1P4H4O14_2_8897.vasp,K1Fe1P4H4O14,-4.965518259583333,0.0501179225000001 -Hg4W2O8_13_8094.vasp,Hg4W2O8,-3.326060631428572,0.071670388571428 -Ga1Mo1I1Br2Cl1O2_8_6209.vasp,Ga1Mo1I1Br2Cl1O2,-2.39934592375,0.1482794032477623 -Mn1Nb1Te4_6_10818.vasp,Mn1Nb1Te4,-2.4188292733333334,0.1635287672222218 -Zn2Br2_129_21052.vasp,Zn2Br2,1.0198502825,0.5652179953124999 -Al2Sb2Se6_162_954.vasp,Al2Sb2Se6,-2.42128626,0.2353360500000001 -Ag3As1O4_156_495.vasp,Ag3As1O4,-2.06883570375,0.3751948325000001 -Mn1Ga1Te1Se1_1_10724.vasp,Mn1Ga1Te1Se1,-1.7786238125,0.3489882565948274 -Cr1Br1Cl1_156_4128.vasp,Cr1Br1Cl1,-1.9368993033333333,-0.0075370588888905 -Mn1Cu2S3Br2_8_10700.vasp,Mn1Cu2S3Br2,-1.28773615375,0.2218496051464843 -Mn2Se2Br2_59_11275.vasp,Mn2Se2Br2,-1.7345443116666666,0.0543011904166668 -Ti4O8_35_19151.vasp,Ti4O8,-7.0190176325,0.2448368925000004 -K2H2S2_1_9126.vasp,K2H2S2,-2.269550425,0.1458059983333335 -Nb2S3I2Cl1_1_12850.vasp,Nb2S3I2Cl1,-3.2266606425,0.1550189092857097 -Sn1S1O4_1_16675.vasp,Sn1S1O4,-4.107773538333333,0.1640488489322885 -In2I6_26_8484.vasp,In2I6,-0.25824344125,0.1352729525 -Ba2Cu1O2F2_123_1965.vasp,Ba2Cu1O2F2,-3.3656251071428573,0.3818298157142799 -In2Co2Te5_156_8418.vasp,In2Co2Te5,-1.3758961122222222,0.1547650555555541 -Mo4H2N3_164_11745.vasp,Mo4H2N3,-4.581620304444445,-0.8511860296913625 -Mn1O2_187_10833.vasp,Mn1O2,-4.247711986666666,0.2170977416666666 -H2Pd2O4_11_7013.vasp,H2Pd2O4,-3.21601987875,0.2804579776041667 -Cs1Ge1Se2_156_4641.vasp,Cs1Ge1Se2,-1.6946757175,0.4393361451562501 -Y1Mn1F5_47_20650.vasp,Y1Mn1F5,-3.2419554142857145,0.9356607492857107 -Hf1Te2_164_7325.vasp,Hf1Te2,-3.63588592,0.1123739166666673 -Na4H16Br4O8_14_12386.vasp,Na4H16Br4O8,-3.6059004721875,-0.1168524019791661 -Ca1Ru2N2_12_2870.vasp,Ca1Ru2N2,-4.15721929,0.5904968600000007 -Ga6S6_2_6585.vasp,Ga6S6,-2.7657319408333336,0.0899945541666662 -Fe2As2Se4F2_26_5787.vasp,Fe2As2Se4F2,-2.275873688,0.2536377004999972 -Sc3B2F2_187_16194.vasp,Sc3B2F2,-4.269276955714285,-0.0864674847619115 -Li3Sn1P6O18_1_10150.vasp,Li3Sn1P6O18,-5.259834474642857,0.1235213873749737 -Sn4P4Se4_17_16951.vasp,Sn4P4Se4,-2.493376190833333,-0.0938586125000018 -Ti1Ni1Se1S1Br2_6_18814.vasp,Ti1Ni1Se1S1Br2,-2.421868588333333,0.1007725072916615 -Mg1F2_115_10359.vasp,Mg1F2,-3.2637528233333337,-0.1431271516666674 -Ti2S2_164_19004.vasp,Ti2S2,-5.0804268625,0.1163867574999999 -Sr3Si1_25_17399.vasp,Sr3Si1,-0.3536550225,0.835397214375 -B3H2W4S2_164_1729.vasp,B3H2W4S2,-4.9657609154545455,0.6733780386363543 -Cu2Se1Cl3_1_5289.vasp,Cu2Se1Cl3,-0.5262571349999999,0.220929994016666 -Ca3Au2S4I2_123_3154.vasp,Ca3Au2S4I2,-1.7096552454545455,0.0764933376363603 -Sr2Au1Se2I2_38_17135.vasp,Sr2Au1Se2I2,-1.317702162857143,0.1503032788095207 -Ta2V2S10_11_17932.vasp,Ta2V2S10,-4.305282066428572,0.0257997541071381 -Bi4Mo4O20_14_2618.vasp,Bi4Mo4O20,-4.283710321785715,2.858158520803567 -As1Br5_47_1139.vasp,As1Br5,-0.6185687983333333,0.1588753199999993 -Ag2O2_164_338.vasp,Ag2O2,-0.9522560025,0.41484655 -Pb1O2_187_14195.vasp,Pb1O2,-2.93576545,0.5207636116666667 -Sb2P4O14_2_15633.vasp,Sb2P4O14,-5.100146769,0.1859326133749999 -Ba2H18I2O10_2_1990.vasp,Ba2H18I2O10,-4.0593054871875,0.0274135216145832 -Nb3S6_2_13007.vasp,Nb3S6,-4.843870045555556,0.1135153594444444 -In1Co5Cl2_123_8220.vasp,In1Co5Cl2,-1.11630117375,0.460756958125 -Sn3Bi2O9_174_16910.vasp,Sn3Bi2O9,-3.721247945,0.5158235703571433 -Tl2Te2I2_59_19548.vasp,Tl2Te2I2,-0.327639885,0.4884305722222215 -Sc2P2Se6_157_16121.vasp,Sc2P2Se6,-3.253206977,0.179683619208331 -Te12As12_7_18272.vasp,Te12As12,-2.01807656,0.2783503758333308 -Li2Ag2F4_11_9823.vasp,Li2Ag2F4,-2.03201697625,-0.0782725662500001 -Sr2B2S6F2_59_17139.vasp,Sr2B2S6F2,-3.4249751141666667,0.3897317198611076 -Sc1Cu1Te6As2_149_15931.vasp,Sc1Cu1Te6As2,-1.751310486,0.2674318890833318 -Na1Sn1P1_156_11934.vasp,Na1Sn1P1,-1.81114092,0.4068782583333334 -Al2I2_129_879.vasp,Al2I2,-0.75543249,0.7070986424999987 -Sr2Ni2Ge2_129_17288.vasp,Sr2Ni2Ge2,-0.9816659266666666,0.1993508712499987 -Al1Cu3Br3O4_1_651.vasp,Al1Cu3Br3O4,-2.0934191972727274,0.2683828350568151 -Ba4N2_59_2164.vasp,Ba4N2,-2.516837903333333,0.1661391000000001 -Cs1C2I3N2_25_4637.vasp,Cs1C2I3N2,-3.33554627125,0.3167699801041606 -Zr3Al4C6_156_21732.vasp,Zr3Al4C6,-5.90096801923077,0.1442614048717881 -Te2Ir2Cl2_11_18390.vasp,Te2Ir2Cl2,-2.0367123316666667,0.2230164777777741 -Rb2Te2C2S6Cl6_1_14949.vasp,Rb2Te2C2S6Cl6,-1.9357242644444443,0.5856114887731457 -V4Cl16_14_20317.vasp,V4Cl16,-1.8268460275,0.0246057585000003 -Ag4H4O4F4_14_517.vasp,Ag4H4O4F4,-2.152291438125,0.1734182037500002 -Fe1H2_115_5688.vasp,Fe1H2,-1.80561175,0.9157235783333312 -Ca1Cu1S2Br2_1_2824.vasp,Ca1Cu1S2Br2,-1.5680924333333337,0.2874231021180534 -Ga1Ag1As2O6_149_6109.vasp,Ga1Ag1As2O6,-3.557444325,0.3883878948333287 -Si8Ni2_125_16547.vasp,Si8Ni2,-2.935710184,-0.5945009619999997 -Ba10Rh2_26_1799.vasp,Ba10Rh2,-0.01173174,0.4482040658333329 -K2Ge1P2H2O8F2_2_9112.vasp,K2Ge1P2H2O8F2,-4.51630711117647,0.0688982482352953 -K2Mg1Te2H4S8_2_9227.vasp,K2Mg1Te2H4S8,-2.441467683529412,0.0231529487009761 -Ga5Ag1S5Cl4_1_6582.vasp,Ga5Ag1S5Cl4,-2.1110225,0.1399177572639973 -Nb4B3H2_164_13036.vasp,Nb4B3H2,-5.88112628,0.3179441694444396 -In2H10N4F4_10_8458.vasp,In2H10N4F4,-3.9826574515,0.1151163115000004 -Sn2C2S2N2F2_11_16755.vasp,Sn2C2S2N2F2,-4.330709748,0.0819927920833265 -Ni2W2S8Cl2_129_13688.vasp,Ni2W2S8Cl2,-2.279681122142857,0.5543732556919587 -Nb4C3_164_13048.vasp,Nb4C3,-7.300901194285714,0.4660409698214212 -Hg1Br2_187_7844.vasp,Hg1Br2,0.6023302333333334,0.1754129 -Li2Cu3F8_2_9895.vasp,Li2Cu3F8,-1.871375703076923,-0.0006560953846176 -Nb2Se2I2_59_12873.vasp,Nb2Se2I2,-3.184053625,0.1371579916666663 -Se3N2_164_16295.vasp,Se3N2,-2.589901694,1.1263297407499966 -P8O12_1_14149.vasp,P8O12,-5.021917643,0.2368861106000004 -K2C2N2O2_31_9013.vasp,K2C2N2O2,-5.24337725375,0.0716668512499953 -Cs2Br2F8_127_4664.vasp,Cs2Br2F8,-1.2600428033333333,0.1349623375000002 -K2Nb1S2_187_9256.vasp,K2Nb1S2,-2.671662544,0.3241919146666608 -In2Ni1Te4_164_8492.vasp,In2Ni1Te4,-1.04089447,0.0674643642857134 -Hf1P2_164_7259.vasp,Hf1P2,-4.721952916666667,0.8938930924999999 -As4Se6_1_1373.vasp,As4Se6,-2.403858051,0.2021669640000003 -Nb2Te4F4_12_12921.vasp,Nb2Te4F4,-3.202029324,0.213931173749996 -Cr1Ga2S4_164_4177.vasp,Cr1Ga2S4,-2.973769747142857,0.0910087985714258 -Mg2Mn2Si2_129_10477.vasp,Mg2Mn2Si2,-2.000068085,0.3280857797222198 -In1Br2_164_8212.vasp,In1Br2,-0.80520088,0.2262493304166667 -K2Ru2I8N2O4_7_9320.vasp,K2Ru2I8N2O4,-2.0170856211111112,0.2880460277083312 -Cd1H12C10N4O4_2_3321.vasp,Cd1H12C10N4O4,-5.42962226516129,0.1724167872580592 -K4Ga4Te8_5_9445.vasp,K4Ga4Te8,-1.360761241875,0.13446344875 -Ba2H4O6_4_1994.vasp,Ba2H4O6,-4.121329891666666,0.1524874010416641 -Bi4C4S12_14_2606.vasp,Bi4C4S12,-3.1988546935,-0.0635132231875023 -Ga2Co2Se5_156_6335.vasp,Ga2Co2Se5,-2.216402441111111,0.0460488649259214 -Tl1Pt5Cl2_38_19325.vasp,Tl1Pt5Cl2,-1.0056865775,1.4007186846875002 -Ni1O1_123_13382.vasp,Ni1O1,-2.212942705,-0.38709386 -Pd2I4_14_14435.vasp,Pd2I4,-0.153123635,0.1380853324999999 -Ru2Br6_51_15304.vasp,Ru2Br6,-1.207702675,0.20568540125 -Ca2Ag1Se2Br2_38_2912.vasp,Ca2Ag1Se2Br2,-1.423599425714286,0.1714207985714254 -C4O8_156_2768.vasp,C4O8,-4.972700555,1.2213949983333334 -La1As2_21_9560.vasp,La1As2,-2.811237563333333,1.2474099641666665 -Ga2Co2Te5_164_6339.vasp,Ga2Co2Te5,-1.6238339377777775,0.2535668720370352 -Zn2As4Cl4O6_31_21030.vasp,Zn2As4Cl4O6,-2.941084745625,0.0872504699218748 -Na2H6C8O8_2_12121.vasp,Na2H6C8O8,-5.481773865416667,0.0992839059027776 -Cs2Cd4S2Br6O6_31_4686.vasp,Cs2Cd4S2Br6O6,-1.811970083,0.1109546845624968 -Sb1Pd1O3_8_15481.vasp,Sb1Pd1O3,-3.151910386,0.5549153572500001 -Cu2Sn2S6_51_5320.vasp,Cu2Sn2S6,-1.866149267,0.2865953456249975 -P2W1_187_14055.vasp,P2W1,-4.5739316400000005,0.4056263666666666 -Cu2Te3As4Br2_6_5340.vasp,Cu2Te3As4Br2,-1.4221220945454545,0.1989140375757547 -Cs4Hg2F8_11_4811.vasp,Cs4Hg2F8,-1.1640471235714285,0.2971306592857146 -Mn2W2Cl2O8_129_11337.vasp,Mn2W2Cl2O8,-4.612452787857143,0.0589520296428536 -In2Te6Pd4_164_8642.vasp,In2Te6Pd4,-1.2687236966666666,0.1777589591666666 -Ti2B1F2_164_18884.vasp,Ti2B1F2,-5.609886108,-0.4419035461666721 -Au2O4F2_17_1502.vasp,Au2O4F2,-1.6819291125,0.1529926989236096 -Zr6O6_99_21862.vasp,Zr6O6,-6.27054526,0.2707237466666674 -Re1Cl2_115_14997.vasp,Re1Cl2,-2.4983667966666667,0.7909525307407378 -K2H2Se2_11_9128.vasp,K2H2Se2,-1.92006859,0.1640095216666666 -Mn2Sb2I2O4_26_11234.vasp,Mn2Sb2I2O4,-3.016213686,0.1573807312499999 -Sc7Br10_2_16275.vasp,Sc7Br10,-2.358876703529412,0.0799101028431352 -Pd2S6_11_14478.vasp,Pd2S6,-2.19607021875,0.1967601342187499 -Na1In1Sb2O6_5_11888.vasp,Na1In1Sb2O6,-3.575867514,0.5928979969374999 -Ca1Si2_164_2881.vasp,Ca1Si2,-1.87197372,1.2853509283333333 -Tl2In2Te6_31_19451.vasp,Tl2In2Te6,-0.988530884,0.5369689513333319 -V6N2O16_11_20388.vasp,V6N2O16,-5.336426330416667,0.0762266966249889 -Al2S4_12_950.vasp,Al2S4,-3.214054636666667,0.338337629687497 -Au2I2_164_1486.vasp,Au2I2,0.67854269,0.16481976875 -Na2Fe2P2_12_12078.vasp,Na2Fe2P2,-1.956012436666667,0.1149000516666665 -In2Te4_1_8634.vasp,In2Te4,-1.081555765,0.3091845533333305 -Ag2H4_2_282.vasp,Ag2H4,-1.4145625266666666,1.5614863416666642 -Cu1P1Ir1S1Cl1O2_1_4933.vasp,Cu1P1Ir1S1Cl1O2,-2.6443052671428573,0.973433218428562 -P2Pb2O8_13_14011.vasp,P2Pb2O8,-4.730895275833333,0.0954958285416665 -P10_6_13902.vasp,P10,-3.978748626,0.067247359 -Ta1S1O1_156_17604.vasp,Ta1S1O1,-6.118030906666667,0.1303453458333219 -V2Te8Mo2_25_20225.vasp,V2Te8Mo2,-2.194242733333333,0.0448249205555555 -Cu2Te6As2_162_5359.vasp,Cu2Te6As2,-1.139249536,0.3016589591666652 -Zr1Br1Cl1_156_21264.vasp,Zr1Br1Cl1,-2.8639478966666663,0.0530125600000004 -B4P20_26_1761.vasp,B4P20,-3.887506264166667,0.0934214174999965 -Al2Fe2S5_187_835.vasp,Al2Fe2S5,-3.224447113333333,-0.2662772112500028 -Mg3Ge1_25_10550.vasp,Mg3Ge1,-0.56285007,-0.0988237395833332 -Co1B4C2F6_47_3700.vasp,Co1B4C2F6,-4.260156803076924,0.4336927303205019 -Pb1Br2_164_14173.vasp,Pb1Br2,-1.118319133333333,0.0756048766666668 -Fe2W2O8F2_129_6032.vasp,Fe2W2O8F2,-4.55104408,0.0564737951785687 -Rh1I1Br1_8_15153.vasp,Rh1I1Br1,-0.72910749,0.3598100355555546 -Bi2Te2Cl2_59_2557.vasp,Bi2Te2Cl2,-1.3729855283333334,0.1839282683333332 -Cs2C6O6F6_4_4679.vasp,Cs2C6O6F6,-4.6277108275000005,0.2255215737499938 -Au4F8_13_1571.vasp,Au4F8,-0.4192706258333333,0.3801681249074066 -Mn1Ge3S1Br1_6_10756.vasp,Mn1Ge3S1Br1,-2.482126333333333,-0.3446897055208358 -Cr2Te4_127_4530.vasp,Cr2Te4,-1.5789546266666663,0.3640915122222226 -Bi1Cl5_47_2329.vasp,Bi1Cl5,-0.6519264816666667,0.3593608858333325 -Sb2Te4Pb1_164_15730.vasp,Sb2Te4Pb1,-1.689999632857143,-0.3885719157142862 -K1Br1O3_156_8883.vasp,K1Br1O3,-2.143991494,0.2785439277500003 -W1Se2_115_20455.vasp,W1Se2,-353.45525087333334,-350.06379050333334 -As6Pd3_147_1389.vasp,As6Pd3,-2.244080685555556,0.6385695211111106 -V1Ga2Se4_164_19836.vasp,V1Ga2Se4,-2.56096365,-0.0229042146428595 -Ce2Si2I2_164_3682.vasp,Ce2Si2I2,-3.1446865833333333,0.0404821333333331 -Nb4Zn4Fe2O16_7_13184.vasp,Nb4Zn4Fe2O16,-4.915985421153846,0.0812804053846108 -Mn1Co1S2I1Cl1_6_10671.vasp,Mn1Co1S2I1Cl1,-1.99242894,0.1470829440972174 -Sr2P1_25_17292.vasp,Sr2P1,-1.1411428466666669,0.8812416424999991 -K2Cr6Bi2O24_2_9087.vasp,K2Cr6Bi2O24,-4.40044959382353,-0.1473263649326026 -V2Se4_127_20192.vasp,V2Se4,-2.2733717616666667,0.8732319566666664 -Zr1Ti1Te1S1I2_1_21477.vasp,Zr1Ti1Te1S1I2,-3.142846815,0.0100625801388865 -Ru2N2Cl2_59_15327.vasp,Ru2N2Cl2,-3.5863511566666664,0.010442438611108 -Ba2C4S4O12F12_13_1934.vasp,Ba2C4S4O12F12,-4.072702544411764,0.1842654863235266 -Mn1Ag1Te1Se1_1_10622.vasp,Mn1Ag1Te1Se1,-1.03909252,0.3554910778125005 -Fe2P2Pt2_129_5913.vasp,Fe2P2Pt2,-2.0458719816666666,0.6056498758333309 -Rb1Nd2Se2_164_14745.vasp,Rb1Nd2Se2,-2.334096216,0.4495950660000003 -Rh2Cl8_2_15187.vasp,Rh2Cl8,-0.984815718,0.2224657594999999 -B2P6H10C2N2_2_1695.vasp,B2P6H10C2N2,-4.603181365454545,0.2694344386363538 -Mg2Sn4O8_12_10520.vasp,Mg2Sn4O8,-4.0646593357142855,0.1911061303571393 -Mn2Sb2Se4Br2_10_11246.vasp,Mn2Sb2Se4Br2,-1.9259203,0.0864980827499979 -Ti2Br2N1_164_18897.vasp,Ti2Br2N1,-5.213439278,0.0076410931999979 -Ga4S6_1_6565.vasp,Ga4S6,-2.7331012770000003,0.1880162129999996 -Rb2Sr4I10_2_14944.vasp,Rb2Sr4I10,-0.968509885,0.205805165833332 -Sb2Te6Mo2_12_15736.vasp,Sb2Te6Mo2,-1.859403067,0.1748065124999981 -Mn1C6Se2N4_10_10660.vasp,Mn1C6Se2N4,-5.515243751538462,0.6773653234615298 -Co2S2_164_3981.vasp,Co2S2,-2.5079318325,0.2325534710416641 -Ce1Si2_123_3657.vasp,Ce1Si2,-3.2196981566666665,0.9639863466666664 -K4Cu2Sb2S6_7_9442.vasp,K4Cu2Sb2S6,-1.76078778,0.1005406114285678 -Sc1Se3_99_16000.vasp,Sc1Se3,-2.7557335575,0.5779090787499999 -Te4W3_12_18635.vasp,Te4W3,-2.5891361500000003,1.023277404285708 -Sb1Pb3Se1S2Br3_1_15480.vasp,Sb1Pb3Se1S2Br3,-1.547556933,0.2762713851874988 -Sr2Te2Au1Cl2_38_17325.vasp,Sr2Te2Au1Cl2,-1.2942841414285715,0.403532624999997 -Hf1Bi1P1_156_7116.vasp,Hf1Bi1P1,-3.8615782166666666,0.4480746024999962 -Mn1Sb1Te1Br1_8_10864.vasp,Mn1Sb1Te1Br1,-1.329099055,0.3887163796875 -Cr2O2F2_59_4434.vasp,Cr2O2F2,-4.1567619166666665,0.0360971949999959 -Cr3W1O8_25_4585.vasp,Cr3W1O8,-5.271345220833333,0.0170666213020793 -Sc2Se2I2_59_16157.vasp,Sc2Se2I2,-2.868153498333333,0.0445923583333338 -Zr1Bi1_25_21260.vasp,Zr1Bi1,-1.77031964,1.3327923441666665 -Ti1P2_187_18825.vasp,Ti1P2,-4.8667081366666665,0.7710149541666667 -Mn3I1Br1N1O1_6_11391.vasp,Mn3I1Br1N1O1,-2.893697022857143,0.2781692361607116 -Ti2O2_10_18974.vasp,Ti2O2,-6.4423868325,0.7948303308333333 -Ta1V1Cl2F2_8_17638.vasp,Ta1V1Cl2F2,-3.409096455,0.2279257732196934 -Ta4Si2S8_55_18113.vasp,Ta4Si2S8,-5.074943149285715,0.1816541949206253 -K2Fe2C12N6O6_147_9101.vasp,K2Fe2C12N6O6,-5.948228210714285,0.3448457742708178 -Co2S6_11_3989.vasp,Co2S6,-2.639174445,0.3822629024479136 -Mn1Nb1Te2S1_25_10817.vasp,Mn1Nb1Te2S1,-2.9650107080000003,0.3485534835172365 -Sn1Ge1Bi1S1I1Br1_1_16632.vasp,Sn1Ge1Bi1S1I1Br1,-1.57022436,-0.0193307944444472 -Zr2Si2S8_31_21686.vasp,Zr2Si2S8,-4.080123348333333,0.2470621895833333 -K2I2_129_9206.vasp,K2I2,-0.4954671025,-0.4145784824999999 -Sr2Sb4O12_2_17311.vasp,Sr2Sb4O12,-4.126020433333333,0.5003189411111117 -Al4I4_57_1073.vasp,Al4I4,-0.9601845125,0.5023466199999986 -Al2S2I2_31_940.vasp,Al2S2I2,-2.4363735766666665,0.07737018597222 -Zn2Si2S6_162_21170.vasp,Zn2Si2S6,-2.55126265,0.2541349198000007 -Hf2C2Br2_12_7462.vasp,Hf2C2Br2,-5.450758431666666,0.2993533116666622 -Hf1Sc1Cl2O2_1_7294.vasp,Hf1Sc1Cl2O2,-5.178777106666667,0.195536313030291 -Mn1Ge1Se2Br2_1_10750.vasp,Mn1Ge1Se2Br2,-1.901523045,0.0418770890277775 -V4C3S2_164_20315.vasp,V4C3S2,-5.434211393333333,-0.2679751598456896 -Bi2W1_187_2581.vasp,Bi2W1,-2.2086126066666667,0.4418017799999978 -As8S6_11_1403.vasp,As8S6,-2.96239234,0.0762625700892828 -Ga4Cl4_28_6549.vasp,Ga4Cl4,-1.611494415,-0.0452418162499999 -Al2F6_191_822.vasp,Al2F6,-3.84016611875,0.1545132212499997 -Sc2Te2_123_16181.vasp,Sc2Te2,-2.57457901,0.6322624600000002 -Ga2Te3_164_6513.vasp,Ga2Te3,-1.285311992,0.5247119932 -Ga3Ag1Cl4O4_35_6524.vasp,Ga3Ag1Cl4O4,-2.663827705,-0.007203465833336 -Te6Pd2_11_18678.vasp,Te6Pd2,-1.25760920375,0.2521206379166668 -Mn1Nb2H1Br2O4_1_10819.vasp,Mn1Nb2H1Br2O4,-4.735331333,0.3233509815000019 -V2C1Se2_164_20022.vasp,V2C1Se2,-4.414217562,0.0300653899999998 -Ti1V2Cr1O10_115_18867.vasp,Ti1V2Cr1O10,-5.575354597142857,0.021134275133924 -Mn1Fe1Ge2O8_12_10707.vasp,Mn1Fe1Ge2O8,-4.358572353333334,0.134698637864579 -Ni1H4C4N2Cl2_47_13341.vasp,Ni1H4C4N2Cl2,-4.703084193076923,0.4029986538461367 -Ba2C2O6_10_1932.vasp,Ba2C2O6,-5.525978536,0.3645800624999999 -Ho2Fe2Ge4_129_8138.vasp,Ho2Fe2Ge4,-2.43427756625,0.3922083383333299 -Au3I2O2_6_1560.vasp,Au3I2O2,-0.3157123628571429,0.9148281347142836 -B2S2_164_1699.vasp,B2S2,-4.77049035,0.0331944224999993 -Y2Ga2Br2_164_20733.vasp,Y2Ga2Br2,-3.1458485433333334,0.0314199033333331 -Rb2Os2N2Cl10O2_11_14910.vasp,Rb2Os2N2Cl10O2,-2.5056249816666667,-0.1896025932936543 -Al4Si4O18_1_1098.vasp,Al4Si4O18,-5.4995303611538455,0.3110563598076827 -Ti2Si4_129_19029.vasp,Ti2Si4,-4.963255666666667,0.4587770083333335 -Mn1Se2_187_10880.vasp,Mn1Se2,-2.2577223966666664,0.037301216666667 -Cd2Ag2Se2I2_26_3448.vasp,Cd2Ag2Se2I2,0.13933204125,-0.22613840375 -Cr1S2_187_4250.vasp,Cr1S2,-3.41406811,0.0495450966666664 -Zr2H2Cl2_164_21578.vasp,Zr2H2Cl2,-3.581333295,0.0406194983333332 -Mn1Ir2Se2S1Br2_1_10790.vasp,Mn1Ir2Se2S1Br2,-2.0422145875,0.2793248570833287 -Ni1H8C6S4_10_13360.vasp,Ni1H8C6S4,-4.391723334210527,0.2551748757894655 -Li4Fe1P2O8_2_10184.vasp,Li4Fe1P2O8,-5.010499282,0.0400011728333291 -I12N4_7_8156.vasp,I12N4,-0.6283389125,0.4691455170312502 -C2Cl6_1_2744.vasp,C2Cl6,-1.8741310625,0.391521269375 -Nb2Te4Cl10O1_2_12919.vasp,Nb2Te4Cl10O1,-2.3014770611764708,0.1426975982475449 -Cu2I3Br3_1_5174.vasp,Cu2I3Br3,0.224498485,0.2040002957552085 -Ge8O12_14_6972.vasp,Ge8O12,-4.6938968425,-0.0804302842500046 -Hg4I2O2_5_8076.vasp,Hg4I2O2,0.4245068125,0.231827886875 -Cu6Bi2Se4O16_59_5493.vasp,Cu6Bi2Se4O16,-2.881990889642857,0.322866754441958 -Ag4Se2S12_14_558.vasp,Ag4Se2S12,-1.591217107222222,0.2312444879166653 -Re4S8_2_15114.vasp,Re4S8,-4.8703719225,0.0696989016666673 -Mn2Cl4_164_11053.vasp,Mn2Cl4,-1.7617033583333337,0.0340992049999997 -K2Hg4S8F6_31_9184.vasp,K2Hg4S8F6,-1.0517840939999998,0.3340467895624989 -Mn1Sn1Br2O1_1_10890.vasp,Mn1Sn1Br2O1,-2.083553158,0.1807054295000001 -Nb2I6_162_12752.vasp,Nb2I6,-1.56871317625,0.2482909423437485 -Nb2H2_12_12736.vasp,Nb2H2,-4.6661184875,0.4794214499999993 -Cu1Te1Ru1I1_25_4990.vasp,Cu1Te1Ru1I1,-0.778536365,0.695558266874999 -Nb4S2N3F2_164_13141.vasp,Nb4S2N3F2,-5.681732058181819,0.45901065449999 -Mn2Co1C12_164_11059.vasp,Mn2Co1C12,-5.394163116666666,1.4985529866666576 -Na2H6S2N10_51_12130.vasp,Na2H6S2N10,-4.535871895,-0.0843036073125015 -Re2N4_187_15059.vasp,Re2N4,-7.001972221666667,-0.518674231388895 -Co2Te3O8_5_4042.vasp,Co2Te3O8,-3.484384597692308,0.1035957809615331 -Hg2H4S10_31_7965.vasp,Hg2H4S10,-2.065062008125,0.1801493638281249 -Ca1Ag1Br1Cl1O2_1_2788.vasp,Ca1Ag1Br1Cl1O2,-1.7836674033333333,0.3490661060416645 -Sb2Rh2S6_162_15667.vasp,Sb2Rh2S6,-2.735795794,0.3498127804736815 -Sr2Cl2F2_129_17179.vasp,Sr2Cl2F2,-3.081824928333333,0.090777033333333 -Zr1Co1H6_8_21282.vasp,Zr1Co1H6,-3.22311500375,0.8177571587500003 -Sr2Ag1S2F2_38_17106.vasp,Sr2Ag1S2F2,-2.2584523185714285,0.5626258349553519 -Cu2H4C12N4O8_2_5116.vasp,Cu2H4C12N4O8,-5.821854003666667,0.3861249321110991 -Sc1Se2_115_15997.vasp,Sc1Se2,-2.875961136666667,0.7995661938888856 -K2Br2F8_127_9008.vasp,K2Br2F8,-1.2611308016666667,0.1676759750000001 -Y1Mn1Cl2_156_20649.vasp,Y1Mn1Cl2,-2.6036421325,0.5960445900323276 -Nb4Co4Te8_14_13059.vasp,Nb4Co4Te8,-2.925623350625,0.02360396625 -Sn2I2O2_59_16783.vasp,Sn2I2O2,-2.2623266166666665,0.2760680763888889 -Al1As2Au1O6_149_607.vasp,Al1As2Au1O6,-3.75367466,0.8257814916249961 -P1Pd2S2_187_13935.vasp,P1Pd2S2,-2.30225262,0.4784682334999981 -Ga1Sb2Au1S6_149_6266.vasp,Ga1Sb2Au1S6,-2.080921284,0.3846066014687477 -Sb4O6_59_15788.vasp,Sb4O6,-4.140326304,0.1171641635 -Rb4Cr4Cl4O12_14_14968.vasp,Rb4Cr4Cl4O12,-3.708505072916666,-0.1091780248032443 -B13As2_164_1606.vasp,B13As2,-4.93125855,0.9976644345555502 -Ru1C2_123_15263.vasp,Ru1C2,-4.705087310000001,2.1051116183333267 -Sc2P2O8_2_16118.vasp,Sc2P2O8,-6.028391341666667,0.2232503808333339 -Rh2Cl2O2_59_15182.vasp,Rh2Cl2O2,-2.7128405483333338,0.1718243458333304 -Ag1Sb1As2Se6_143_116.vasp,Ag1Sb1As2Se6,-1.925546531,0.7920843714166613 -Sr2I2F2_129_17255.vasp,Sr2I2F2,-2.532062965,0.0534806533333331 -Ta2Al2O8_10_17645.vasp,Ta2Al2O8,-6.446887253333333,0.4572423999999992 -Zn1In2O4_156_20966.vasp,Zn1In2O4,-3.2349525671428574,0.2790630423214256 -Ag2P2S6_162_351.vasp,Ag2P2S6,-2.317567245,0.1111163163333304 -Al1Te6P2Au1_149_750.vasp,Al1Te6P2Au1,-1.7181673329999998,0.0889364310972202 -Cr2Se1S1Br2_1_4490.vasp,Cr2Se1S1Br2,-2.3298080066666667,-0.1815422075 -In4Se4Cl4_14_8693.vasp,In4Se4Cl4,-1.7374158941666666,0.0066583991666666 -Sb1Te1_123_15512.vasp,Sb1Te1,-1.258492895,0.6606896787499978 -Sn1Br2_187_16620.vasp,Sn1Br2,-1.0191023966666666,0.1478891883333335 -Sm2Cl2F2_129_16568.vasp,Sm2Cl2F2,-3.388849765,0.3229888286111078 -Ta2C1S2F2_164_17678.vasp,Ta2C1S2F2,-4.9069404557142855,0.850909744285704 -Eu1Pb2_164_5592.vasp,Eu1Pb2,-1.29249843,0.0189922916666654 -Ru2F2_5_15315.vasp,Ru2F2,-2.5426520925,0.5707522699999972 -Ba3Mn2S5Cl2_123_2116.vasp,Ba3Mn2S5Cl2,-2.905857935,0.1912625727083299 -Sr4Ce2_12_17415.vasp,Sr4Ce2,-0.0156692483333333,0.9572326533333324 -Pd2F2_164_14421.vasp,Pd2F2,-1.0804659775,0.4094576462499998 -Li2H2S2_4_9931.vasp,Li2H2S2,-3.20660558,0.0830643458333337 -Mn1Cu1Ge1I1O8_3_10684.vasp,Mn1Cu1Ge1I1O8,-3.4201565891666665,0.1744935443749974 -Os2Cl2O2_59_13837.vasp,Os2Cl2O2,-3.449104773333333,0.4998932058333292 -Bi1Mo1P1_156_2346.vasp,Bi1Mo1P1,-2.73983781,-0.0686186416666689 -Rb2Cd4Se2O6F6_31_14818.vasp,Rb2Cd4Se2O6F6,-1.9317829545,0.4061218432500002 -Hf1S2_187_7283.vasp,Hf1S2,-5.08184312,0.3599211466666663 -Ta2Te4I4_12_17916.vasp,Ta2Te4I4,-2.128128486,0.1687447138611089 -Ba2Al4Cl16_13_1899.vasp,Ba2Al4Cl16,-2.367936784090909,0.0410063822727275 -K2Os2N2O2F10_11_9282.vasp,K2Os2N2O2F10,-3.288492562777778,0.048705467222216 -Ni2S8_12_13600.vasp,Ni2S8,-1.934216254,0.219104019999998 -Nb4Fe4Se8_53_13073.vasp,Nb4Fe4Se8,-3.039500185625,0.6973688850000004 -Hf3Zr1N4Cl4_8_7751.vasp,Hf3Zr1N4Cl4,-6.057329523333333,0.0489035525000003 -Sb2Te2Cl2_59_15712.vasp,Sb2Te2Cl2,-1.589896008333333,0.1548882116666665 -Li2Fe2As2_129_9903.vasp,Li2Fe2As2,-1.964995565,0.1728529266666669 -Cu2Br2O4_17_5050.vasp,Cu2Br2O4,-1.61948389375,0.2489376518750001 -H2C6_164_6995.vasp,H2C6,-6.93810398875,0.0499685737500006 -B2S3_150_1702.vasp,B2S3,-4.250546443999999,0.1831129215000011 -Zr1Sc1I2O2_25_21433.vasp,Zr1Sc1I2O2,-4.342785521666666,0.1719705029629574 -Cu2C2O2F2_31_5064.vasp,Cu2C2O2F2,-3.6079725825,0.4143050862499999 -Sb4Te3Au2Cl2_6_15831.vasp,Sb4Te3Au2Cl2,-0.9864746536363636,0.3983683801818152 -Hf2Cl4O2_39_7477.vasp,Hf2Cl4O2,-4.7124984475,0.1860609290625001 -Mn2Sb2S4Br2_10_11237.vasp,Mn2Sb2S4Br2,-2.287226115,0.0285295102499974 -Na1N3_187_11908.vasp,Na1N3,-3.9022295425,1.53431322 -Tl1Bi1_187_19226.vasp,Tl1Bi1,0.161335505,0.6836513587499999 -Cr8Se24_14_4632.vasp,Cr8Se24,-2.4804589965625,0.1714023530208331 -V2Ag1S6_1_19968.vasp,V2Ag1S6,-2.7533287377777778,0.3249079580555529 -Ga2Ni2S5_187_6404.vasp,Ga2Ni2S5,-2.185301568888889,0.072413047037035 -Ba1Sn1S2_6_1858.vasp,Ba1Sn1S2,-2.696616685,0.3487412425 -Zr1Ni1I6_149_21378.vasp,Zr1Ni1I6,-0.73839594125,0.0278323114583333 -Ni1Pd1F6_2_13395.vasp,Ni1Pd1F6,-1.34275344625,0.0417448062500001 -Ge2N2Cl2_59_6785.vasp,Ge2N2Cl2,-3.639897908333333,0.1403657518749974 -Pb1Cl2_115_14178.vasp,Pb1Cl2,-1.2826648533333334,0.0032875283333333 -In4Sb4_127_8689.vasp,In4Sb4,-0.8769869575,-0.1151061724999999 -Na1Sb2Pd1O6_5_11928.vasp,Na1Sb2Pd1O6,-3.445342385,0.5027788876249958 -Sc2As2O8_2_16026.vasp,Sc2As2O8,-5.201748791666667,0.218091670833334 -Ni2Br2_129_13480.vasp,Ni2Br2,0.50442118,1.860245865 -Mg2In2S5_164_10472.vasp,Mg2In2S5,-2.639220708888889,-0.1253878869444442 -Sr8C4_59_17494.vasp,Sr8C4,-1.4233077208333331,1.4870061033333275 -Cu2C2S2Br2_31_5065.vasp,Cu2C2S2Br2,-2.20392568,0.5828105919047605 -Te4H2Pd2_6_18586.vasp,Te4H2Pd2,-1.67780793,0.6454154062500002 -Cr2Sb2O10_129_4478.vasp,Cr2Sb2O10,-4.290390926428572,0.206883580892854 -Ta4Mn2Zn4O16_13_18056.vasp,Ta4Mn2Zn4O16,-5.218515006923076,0.1279199121153824 -Co2Bi2S4Br2_10_3862.vasp,Co2Bi2S4Br2,-1.909004374,0.2903973554166673 -Ni1P3S2_8_13392.vasp,Ni1P3S2,-2.667185645,0.5709901144318157 -W2I2_129_20500.vasp,W2I2,-1.55543663,1.7519580772916663 -Rh2Se2_6_15244.vasp,Rh2Se2,-2.00967784,0.4426260842045431 -Ca2H2S6N2_59_3034.vasp,Ca2H2S6N2,-3.0022907441666664,0.4687192359505184 -Ca3Fe2S5I2_123_3178.vasp,Ca3Fe2S5I2,-2.2062622325,-0.0918965609166688 -Zr1Ti1S2Br1Cl1_6_21473.vasp,Zr1Ti1S2Br1Cl1,-4.0920342566666665,-0.0920003805208415 -Ru4Se8_13_15372.vasp,Ru4Se8,-2.5724978366666664,0.6221026233333338 -Hg2Sb2Br2O4_11_8002.vasp,Hg2Sb2Br2O4,-2.076805995,0.2577467032500009 -Cu2Br2_156_5052.vasp,Cu2Br2,-0.0841092775,0.2955700175 -Zr1Te1S1_156_21462.vasp,Zr1Te1S1,-3.750476703333333,0.1810009783333293 -Hf1Ti3S8_1_7342.vasp,Hf1Ti3S8,-4.9328325075,0.2745950691666667 -V2C1Cl2_164_20016.vasp,V2C1Cl2,-3.983495286,0.0017714101333309 -Nb4Te12I2_2_13166.vasp,Nb4Te12I2,-2.4915841983333333,0.105437177222222 -Zn2Fe2F10_1_21075.vasp,Zn2Fe2F10,-1.8481607507142856,-0.1217179646428585 -V2H2C1_164_20074.vasp,V2H2C1,-4.486919046,0.1577829360000002 -Cs2C2O8F6_4_4669.vasp,Cs2C2O8F6,-2.768277084444444,0.7767455079166639 -Sm2S2_129_16582.vasp,Sm2S2,-4.2133067625,0.2154075175000001 -Co2H4Se2S8_4_3919.vasp,Co2H4Se2S8,-2.656455355,0.3547131200781223 -Al2Se2_129_972.vasp,Al2Se2,-2.5393998775,0.4089591674999999 -Al2O2_123_915.vasp,Al2O2,-4.1634263425,1.3435161666666624 -H2Pd2_164_7019.vasp,H2Pd2,-1.95839922,0.9168944099999998 -Ni2H2S2_59_13511.vasp,Ni2H2S2,-1.7386606683333332,0.297400875277776 -Pd2N4O12_14_14440.vasp,Pd2N4O12,-4.098540278333334,0.0575745994444441 -Sn2S8O2_7_16847.vasp,Sn2S8O2,-2.6800688116666667,0.3724621784374975 -Zr3B2Se2F2_5_21744.vasp,Zr3B2Se2F2,-3.981562544444445,0.934850699166658 -P2O3_6_13998.vasp,P2O3,-4.711286264,0.5475174896000006 -Ta2Br2O2_59_17665.vasp,Ta2Br2O2,-5.118686123333333,0.2636613292142801 -Al1Pd5Cl2_123_709.vasp,Al1Pd5Cl2,-1.28237002,0.4326410079166648 -Ca2C2Cl2O6_59_2967.vasp,Ca2C2Cl2O6,-4.63298997,0.2833782029166645 -Mn1Cu1S1Br2O1_8_10688.vasp,Mn1Cu1S1Br2O1,-1.7315806016666666,0.2340673499999951 -Li2Ta2Cl12_4_10077.vasp,Li2Ta2Cl12,-2.734832010625,0.0224686268750002 -Te6As2Ru2_162_18647.vasp,Te6As2Ru2,-2.181294461,0.4474365061666657 -Ta2Si2P2_129_17885.vasp,Ta2Si2P2,-5.603749311666667,-0.1341164483333389 -Ge1I2_187_6674.vasp,Ge1I2,-1.0289880033333334,0.1898372533333332 -Au4Se3S5_143_1595.vasp,Au4Se3S5,-0.9769559208333334,0.4023639131249986 -Cu2P4Se3F2_6_5226.vasp,Cu2P4Se3F2,-2.233662812727273,0.3798396384753743 -Mo2H2_164_11615.vasp,Mo2H2,-3.191402425,1.9060957975 -K2B2C2Se2_31_8982.vasp,K2B2C2Se2,-2.9613169275,1.3712867121527723 -Ba4Fe2S6Cl2_129_2153.vasp,Ba4Fe2S6Cl2,-2.8375912528571425,-0.124447478102683 -Sm1Si5_47_16559.vasp,Sm1Si5,-3.56313669,-0.0190039191666699 -Mn1Sb2S4_12_10871.vasp,Mn1Sb2S4,-2.7429180828571424,0.2391890203571408 -Bi2Te4Au2_26_2572.vasp,Bi2Te4Au2,-0.64250457625,0.631417380625 -Li1Cr1S2_156_9683.vasp,Li1Cr1S2,-3.012906635,0.7590258599999999 -Pb2S2O6_11_14276.vasp,Pb2S2O6,-3.865990729,0.1306979794999962 -Cr1Co2O6_12_4145.vasp,Cr1Co2O6,-4.230115913333333,-0.6009379629861185 -Sc4N3Cl2_164_16249.vasp,Sc4N3Cl2,-5.432889618888889,-0.20837298555556 -Gd2Te6_129_6627.vasp,Gd2Te6,-2.45910281875,-0.7200914724999998 -Na2Hg4Se2S6Cl6_31_12167.vasp,Na2Hg4Se2S6Cl6,-0.9090417855,0.2425445684375002 -N2F8_1_11786.vasp,N2F8,-1.448870845,0.1984509653749966 -Ge1As1_8_6637.vasp,Ge1As1,-2.79835364,0.5908046574999997 -Se8O20_14_16309.vasp,Se8O20,-3.362247061785714,0.1345330855357116 -Hg2S2_164_8001.vasp,Hg2S2,-0.0157645825,0.1904487775 -Sr2Cu1O2F2_38_17199.vasp,Sr2Cu1O2F2,-3.26545393,0.3404057999999945 -Nd2Te4Se2_129_13246.vasp,Nd2Te4Se2,-2.8816765,0.05114055625 -Y1Br2_115_20612.vasp,Y1Br2,-2.561840306666667,0.4949431527777748 -Ag2C6Cl2F4_2_232.vasp,Ag2C6Cl2F4,-3.670968806428572,0.4487379821428554 -Gd1_47_6597.vasp,Gd1,-0.20879667,1.898456545 -Ge2Br2_5_6757.vasp,Ge2Br2,-1.89906707,-0.12224410375 -Ag1H4C12O2_6_73.vasp,Ag1H4C12O2,-5.536296153157895,0.9115880219298232 -Mg2As1_164_10421.vasp,Mg2As1,-1.0862953933333337,0.4996644069444439 -Nb1Te1O1_156_12594.vasp,Nb1Te1O1,-4.768573906666666,0.4186413770138897 -Na1W2S2Cl6_47_11955.vasp,Na1W2S2Cl6,-2.475768609090909,0.2209206660227197 -Ni1Pb2C12_12_13393.vasp,Ni1Pb2C12,-4.736687649333334,2.3039974946666626 -Bi4O8_11_2630.vasp,Bi4O8,-3.4793184641666666,0.2882323817708303 -Pt2Cl2_164_14612.vasp,Pt2Cl2,-1.2174519525,0.46402757875 -P18I4_11_13909.vasp,P18I4,-3.222537461818182,0.0313397304545426 -V1Ag1O2_156_19756.vasp,V1Ag1O2,-3.7899517575,0.2876593325000001 -Sn2Cl2_164_16760.vasp,Sn2Cl2,-1.2061269675,-0.6739878699999999 -Sb4S6_4_15818.vasp,Sb4S6,-2.596609437,0.2073836830000002 -Mn3Te1O8_12_11416.vasp,Mn3Te1O8,-4.22748349,0.1627965178124992 -Li1In1Sb2O6_5_9734.vasp,Li1In1Sb2O6,-3.696880634,0.6327475511875003 -Ni2Se2I1Br1_6_13633.vasp,Ni2Se2I1Br1,-0.6145674,-0.0407009655208333 -In2Ni2Se5_164_8500.vasp,In2Ni2Se5,-1.4113419844444444,0.044911076666665 -Li2C2S2N2_11_9849.vasp,Li2C2S2N2,-5.16446430625,-0.1961511459114644 -Mn1Ge1Se1Br3_3_10746.vasp,Mn1Ge1Se1Br3,-1.457356185,0.2462037497222221 -Pb3N4_1_14303.vasp,Pb3N4,-3.968738657142857,-0.2373728214285737 -Ga2Se2I2_59_6473.vasp,Ga2Se2I2,-1.4581741866666666,0.1544966433333332 -Zr1Mo1Se1S1I1Br1_6_21329.vasp,Zr1Mo1Se1S1I1Br1,-2.889156123333333,0.2304908239236032 -Ca2H12C4O14_2_3028.vasp,Ca2H12C4O14,-5.00585358,0.0816552198437499 -Hf3N2_187_7722.vasp,Hf3N2,-7.198607647999999,0.6610834920000004 -Te4Pd6Pb4_59_18619.vasp,Te4Pd6Pb4,-1.2562168171428572,0.2061702335714286 -Cu1Pb2Cl2O4_99_4937.vasp,Cu1Pb2Cl2O4,-2.048205082222222,0.4254718041666645 -Ga2S2O8F2_11_6445.vasp,Ga2S2O8F2,-3.559016601428571,0.6444655997619013 -Sb4As2H2O12_4_15760.vasp,Sb4As2H2O12,-4.29781335,0.120273845041662 -Dy2Te6_51_5536.vasp,Dy2Te6,-2.04972817625,0.4165369012500002 -Ca1F2_115_2831.vasp,Ca1F2,-3.34438076,0.4993675366666665 -V2Os1Se5Br2_6_20133.vasp,V2Os1Se5Br2,-2.528980343,0.3149184400999981 -Se4I4_2_16300.vasp,Se4I4,-0.68065144375,0.2502074773611104 -Ti4Se4F4_31_19163.vasp,Ti4Se4F4,-4.4557918325,-0.5137120047222301 -Cu2Te2_10_5335.vasp,Cu2Te2,-0.3267625625,0.2407179724999999 -Zr1Ti1Te1C1Br1_8_21476.vasp,Zr1Ti1Te1C1Br1,-4.35608867,0.5167849610000002 -Mo4C3F2_164_11735.vasp,Mo4C3F2,-4.698185854444445,0.1506531695370268 -Fe2O6_12_5898.vasp,Fe2O6,-3.28423460125,0.36151216875 -Al2Se3_164_973.vasp,Al2Se3,-2.9458421820000003,0.0067826079999999 -Tl4Cu4P4Se12_14_19600.vasp,Tl4Cu4P4Se12,-1.7303570216666666,0.1384439875000001 -Zn1Ag1I1Br1_1_20894.vasp,Zn1Ag1I1Br1,0.73020725,0.5004525773809526 -V2Ag2P4S12_13_19973.vasp,V2Ag2P4S12,-3.0213941215,0.0409546352604179 -Cd4Br4O4_14_3620.vasp,Cd4Br4O4,-0.6442947325,0.4435617900694418 -Ga2Fe2O5_187_6355.vasp,Ga2Fe2O5,-4.186398321111111,-0.0646855913194466 -Tl2Te6Pd4_164_19560.vasp,Tl2Te6Pd4,-1.151286284166667,0.2000807558333335 -Cd2Bi2Se4I2_10_3476.vasp,Cd2Bi2Se4I2,-0.7360016970000001,-0.0555792899999999 -Cu1B2Mo1Ir1Rh3C1Se5I1_1_4843.vasp,Cu1B2Mo1Ir1Rh3C1Se5I1,-2.8781607486666667,0.3173359344791497 -Fe3Se1Br1Cl2O3_1_6065.vasp,Fe3Se1Br1Cl2O3,-2.202645199,0.3170730800833307 -Cd2Te1I2_1_3582.vasp,Cd2Te1I2,0.5474800639999999,-0.1335754956666662 -V4O4F12_14_20346.vasp,V4O4F12,-3.826733523,-0.6968269137499998 -Ba1Tl1Sn2O6_1_1873.vasp,Ba1Tl1Sn2O6,-3.638108255,0.4359510905624956 -P2Os2S6_162_14000.vasp,P2Os2S6,-3.636045215,0.3640277246538379 -Pb1S1_123_14197.vasp,Pb1S1,-1.777263135,-1.1041296900000002 -Ta3S2N2_187_17986.vasp,Ta3S2N2,-6.9534267000000005,0.3619757959523744 -Tl2V2H12S2O18_4_19562.vasp,Tl2V2H12S2O18,-4.352393245555556,0.0938213251388797 -Ag2As4S3Br2_6_165.vasp,Ag2As4S3Br2,-1.7989183527272727,0.0998525446022686 -Ga4As4_127_6540.vasp,Ga4As4,-1.99447471875,-0.2949171937500001 -Zr1Sb1P1_156_21420.vasp,Zr1Sb1P1,-3.46572628,0.9685191316666628 -Ca2Cu1Te2I2_38_3009.vasp,Ca2Cu1Te2I2,-0.9438975842857144,0.2308726319999977 -W2N2Cl2_59_20512.vasp,W2N2Cl2,-4.944486141666666,-0.2158894605555601 -Hf3Te1Mo1Se2S1I1Cl1_1_7733.vasp,Hf3Te1Mo1Se2S1I1Cl1,-3.737143977,0.4836364738125006 -Ta2Te2_164_17910.vasp,Ta2Te2,-4.3130014975,0.433377533749995 -Ge1B1F2_156_6640.vasp,Ge1B1F2,-3.484318915,0.0510702327777737 -Ga2S2_123_6446.vasp,Ga2S2,-2.2575236025,0.5982028924999998 -Nb4Cl16_14_13049.vasp,Nb4Cl16,-2.579546017,0.1343474235000004 -Ca2Au1S2I2_123_2936.vasp,Ca2Au1S2I2,-1.4935841942857144,0.1825206777142822 -Al2Cr1O4_164_812.vasp,Al2Cr1O4,-5.491830384285714,0.3464942142857097 -K1C12_191_8886.vasp,K1C12,-7.4033815807692305,0.0347873399999936 -Tl1Ag1Sb2O6_149_19205.vasp,Tl1Ag1Sb2O6,-2.815226499,0.7598808115 -Ti2S1I1Br1_156_18992.vasp,Ti2S1I1Br1,-3.980078666,-0.1612953182916768 -Mg4Ti4Ge8O24_14_10589.vasp,Mg4Ti4Ge8O24,-5.444361421,0.0128156191249959 -Ru2S2I2_59_15341.vasp,Ru2S2I2,-2.2393816183333333,0.0706453116666641 -As4O8_11_1340.vasp,As4O8,-4.231355063333333,0.2098481220833252 -Na2C4S6F6_2_12010.vasp,Na2C4S6F6,-3.4418816916666666,0.1926735542361021 -B2Mo3H2_187_1680.vasp,B2Mo3H2,-4.060093558571428,0.9440856499999908 -Li8Cr3Te1O12_3_10283.vasp,Li8Cr3Te1O12,-4.415426604166666,0.146999736226844 -Te6Ir2_11_18652.vasp,Te6Ir2,-1.84748003125,0.459904130138887 -Cd1B4H4Br2N2_3_3275.vasp,Cd1B4H4Br2N2,-3.86516024,0.542580286807691 -Co2S2_123_3983.vasp,Co2S2,-2.4684805175,0.2720047860416641 -Zn1Bi1Se1S2_8_20900.vasp,Zn1Bi1Se1S2,-1.578384842,0.2841617207375002 -Ti2Sb1Se2_164_19009.vasp,Ti2Sb1Se2,-4.41540517,-0.5506373129999993 -V1Mo1Br2Cl2O2_8_19876.vasp,V1Mo1Br2Cl2O2,-3.02253676375,0.0021206234821366 -Tl2Cu6Se4_12_19407.vasp,Tl2Cu6Se4,-0.61194918,0.3944248583333321 -Mo2N1Cl2_12_11632.vasp,Mo2N1Cl2,-3.38984924,0.2783716166666665 -Tb2Pb1_164_18205.vasp,Tb2Pb1,-1.37894634,0.7728232445833336 -Cu2Br2_51_5053.vasp,Cu2Br2,0.09600251,0.475681805 -W2I4O4_26_20502.vasp,W2I4O4,-3.640449526,0.0074351780000001 -Sb4O4F4_14_15782.vasp,Sb4O4F4,-3.60228421,0.0756386747916666 -Tl3Ir1_187_19576.vasp,Tl3Ir1,-0.1900975725,0.9534687125 -Ta2Br8_1_17674.vasp,Ta2Br8,-2.193984587,0.2057926874375 -Cr2H2N1_164_4398.vasp,Cr2H2N1,-3.994165844,-1.7735640834444475 -Sb4Au2Se3Br2_6_15766.vasp,Sb4Au2Se3Br2,-1.151537429090909,0.6624581846969664 -Sn1S2_187_16682.vasp,Sn1S2,-2.2827978866666667,0.3303371799999999 -V1S1F2_47_19910.vasp,V1S1F2,-3.236312475,-0.0163030184375028 -Bi1Br5_47_2323.vasp,Bi1Br5,-0.3230015433333333,0.3357325374999993 -Fe2Sb4I4O6_11_5966.vasp,Fe2Sb4I4O6,-2.88446120375,-0.2228941025000002 -K2H8I2_127_9160.vasp,K2H8I2,-1.460483008333333,1.783653021666664 -Fe2Sb2I2O4_26_5947.vasp,Fe2Sb2I2O4,-2.872588569,-0.0032470754999995 -Ga2O2_129_6417.vasp,Ga2O2,-3.4619540125,0.7838604099999995 -Fe1C6I2N2F4_25_5651.vasp,Fe1C6I2N2F4,-4.564804534,0.1740524526805491 -Ba2Cu1Te2Br2_38_1974.vasp,Ba2Cu1Te2Br2,-1.500117622857143,0.2959226564285682 -B6Pd1Br2N2F4_25_1782.vasp,B6Pd1Br2N2F4,-3.97631205,0.6519151520555471 -Sb1Te2_115_15517.vasp,Sb1Te2,-1.2331825766666666,0.5673697777777762 -Ag2H4Br2N6_1_271.vasp,Ag2H4Br2N6,-3.5304635842857146,-0.0332974533928593 -As4W2S12_4_1376.vasp,As4W2S12,-3.255985453333333,0.4810318124305524 -Fe2H2C1_164_5851.vasp,Fe2H2C1,-2.8397390380000003,1.096799356 -Te2Pb2O8_31_18454.vasp,Te2Pb2O8,-3.3686963375,0.3467298908333336 -Co1Ni1S3Cl1_1_3791.vasp,Co1Ni1S3Cl1,-1.8256299133333331,0.1687261811458307 -C6N8_187_2780.vasp,C6N8,-7.0971589307142855,-0.2575982432142907 -Mg3C1_99_10546.vasp,Mg3C1,-1.1336184475,0.58477659875 -H8W2_129_7099.vasp,H8W2,-3.692935079,1.571174143 -K2Cd2As2_129_9041.vasp,K2Cd2As2,-0.23609591,0.1032455766666666 -Sr8Ge4_2_17495.vasp,Sr8Ge4,-0.4403648016666666,0.8762264866666667 -Hg2Bi2Br2O4_11_7934.vasp,Hg2Bi2Br2O4,-1.820523019,0.1424404479999984 -Ge3Sb2S9_174_6920.vasp,Ge3Sb2S9,-2.7886715014285715,0.2425876328125005 -Hf4Br3N4Cl1_35_7771.vasp,Hf4Br3N4Cl1,-6.021214166666667,0.0401416233333336 -Li2Sb2P8O24_13_10062.vasp,Li2Sb2P8O24,-5.253425431944445,0.1595109347500001 -Fe1Ge1I2_8_5678.vasp,Fe1Ge1I2,-0.7929456725,0.1194050009374994 -Nb3Te14Pt3_6_13019.vasp,Nb3Te14Pt3,-2.4037221925,0.0950084989166669 -Zn4Ge4N8_14_21220.vasp,Zn4Ge4N8,-3.75535791625,0.3973632375 -Bi1S2_164_2374.vasp,Bi1S2,-2.17195106,-0.524452012604169 -Os1S1_156_13819.vasp,Os1S1,-3.126542455,1.569157651875 -Pt1F2_115_14571.vasp,Pt1F2,-0.60703826,1.2105626724999974 -Ge3As2O9_174_6901.vasp,Ge3As2O9,-4.623663507142857,0.1183277655357097 -K2Nb2Cl12_4_9261.vasp,K2Nb2Cl12,-2.227914840625,0.02870849 -Be1Sn2_164_2234.vasp,Be1Sn2,-1.42154139,-2.409437784999999 -Se8Cl8_2_16305.vasp,Se8Cl8,-1.178580634375,0.229602279375 -Mg2Co3O8_10_10444.vasp,Mg2Co3O8,-3.78314275,-0.1266756216346218 -N4O8_1_11796.vasp,N4O8,-4.569236689166667,0.1338066466666658 -Zr3S2N2_187_21780.vasp,Zr3S2N2,-6.186938561428571,-0.0096639532142841 -Ta2Ni2Se10_51_17796.vasp,Ta2Ni2Se10,-2.8299527435714285,-0.3247223094841298 -W2Br2_129_20461.vasp,W2Br2,-1.8155099575,1.877747522083333 -Ir2O4_123_8800.vasp,Ir2O4,-3.735463028333333,0.9088789950000002 -Ta4Te12Br2_2_18122.vasp,Ta4Te12Br2,-2.799102311111111,0.123126483666661 -Pt1Br2_164_14566.vasp,Pt1Br2,-0.3432805466666666,0.4390116208333333 -Sn2Br2N2_59_16743.vasp,Sn2Br2N2,-2.862815465,-0.8693067125000001 -Ba1H2Se2_12_1836.vasp,Ba1H2Se2,-2.759548672,0.7620264280000002 -In2Cl2_129_8401.vasp,In2Cl2,-1.08328701,0.3134851934375 -In2Se3_164_8591.vasp,In2Se3,-1.969303516,0.0150179099999998 -In4H20N8F8_14_8675.vasp,In4H20N8F8,-4.049477638,0.0482961250000002 -Cu1S2_187_4959.vasp,Cu1S2,-1.3954518366666668,0.3854455709027761 -Al2Se1S1Br2_6_958.vasp,Al2Se1S1Br2,-2.554856505,0.0549162716666666 -K2Nb2Cu4Se8_28_9263.vasp,K2Nb2Cu4Se8,-2.05019104875,0.1654772583333316 -Tl2Fe4S6_51_19419.vasp,Tl2Fe4S6,-1.7477202191666663,0.0426955712499982 -Cr1In2Se4_164_4206.vasp,Cr1In2Se4,-2.12445532,0.0979192221428552 -V1W1S2I3Br1_1_19955.vasp,V1W1S2I3Br1,-2.00351831,0.2607340919010407 -In1Cl2_164_8217.vasp,In1Cl2,-1.1508364433333331,0.263153425 -Hf3C2O2_187_7694.vasp,Hf3C2O2,-7.648436058571428,0.2638317845238034 -V4C3F2_164_20312.vasp,V4C3F2,-5.295352441111111,-0.0060671172016517 -Li2Cu4F10_11_9896.vasp,Li2Cu4F10,-1.7368077725,0.0263516637499999 -Ba3B1P1O7_156_2096.vasp,Ba3B1P1O7,-5.0995081,0.5704061985416611 -Os2S4_11_13875.vasp,Os2S4,-3.91668661,0.3814308958333332 -Sr3Cl6_5_17358.vasp,Sr3Cl6,-2.255201447777777,0.2422963055555556 -Cu2Te4Mo1_111_5354.vasp,Cu2Te4Mo1,-1.0528034285714285,0.1761401271428557 -Zn4Sn2N4_12_21228.vasp,Zn4Sn2N4,-2.117377507,0.1855458305000001 -V2Se3S1_6_20191.vasp,V2Se3S1,-3.0471315000000003,0.2680602632222184 -Te2Ru2_164_18519.vasp,Te2Ru2,-2.33487424,0.6803582837500002 -Er2Br6_162_5550.vasp,Er2Br6,-2.28176892625,0.05290303625 -Cu2Te3As4F2_6_5342.vasp,Cu2Te3As4F2,-1.6648317163636364,0.3287717972727234 -Nb3B2S2_187_12950.vasp,Nb3B2S2,-5.9918428100000005,-0.0678614778571433 -Ta4Te2_129_18131.vasp,Ta4Te2,-5.637982596666667,0.0554800366666663 -Ni3P3O12_1_13710.vasp,Ni3P3O12,-4.101130606666667,0.1938467867708317 -Na2P4H16C4N2O12_2_12261.vasp,Na2P4H16C4N2O12,-4.97048584125,0.1089781689999954 -Rb2S6I2_11_14936.vasp,Rb2S6I2,-1.369192858,0.4493415796250002 -Zr1Br2_187_21271.vasp,Zr1Br2,-2.6073419733333334,0.0473702 -Mn2Ga2S5_156_11077.vasp,Mn2Ga2S5,-2.925789421111111,-0.0158749027777773 -Os1I2_164_13804.vasp,Os1I2,-1.4068513100000002,0.3017840145833317 -Cr2C1Cl2_164_4339.vasp,Cr2C1Cl2,-3.408097476,0.0086248426666627 -Zr2Ag2_129_21499.vasp,Zr2Ag2,-1.41677917,0.1839256949999999 -Co2Ag1S4_187_3839.vasp,Co2Ag1S4,-2.3110454057142857,0.1125241274999977 -Sn1Te4As2_164_16704.vasp,Sn1Te4As2,-1.8979002442857145,-0.3780669564285721 -Fe1Te1P2O8_6_5763.vasp,Fe1Te1P2O8,-4.613308375833333,0.3537216410416617 -Ca1H4O4_65_2847.vasp,Ca1H4O4,-3.8900596955555553,0.4297276268981446 -Ag4Te4O12_14_577.vasp,Ag4Te4O12,-2.615343134,0.2555905919999999 -Ca2Au1S2Cl2_38_2934.vasp,Ca2Au1S2Cl2,-1.855720967142857,0.2299352792857104 -Sc4S4Cl4_11_16258.vasp,Sc4S4Cl4,-3.610972280833333,0.2118869075000002 -Sn1Te1_123_16699.vasp,Sn1Te1,-0.980590715,-0.944862735 -Sc4I6_8_16248.vasp,Sc4I6,-1.771728944,0.0756688299999999 -Cd4I4Cl4O12_53_3630.vasp,Cd4I4Cl4O12,-1.87887004125,0.0557890393750002 -Sr3Ni2S5Cl2_123_17394.vasp,Sr3Ni2S5Cl2,-2.224846245833333,0.0745102652604123 -Fe1H4C8I2_25_5707.vasp,Fe1H4C8I2,-4.888858236666667,0.4010713521666608 -Ni1B4C2Cl2F4_47_13265.vasp,Ni1B4C2Cl2F4,-3.771936972307692,0.4790742136858872 -Ti3Te2H2N2_1_19111.vasp,Ti3Te2H2N2,-5.153555224444444,0.6295186138888833 -K2Sn1H6O6_147_9350.vasp,K2Sn1H6O6,-3.882743916,0.0957010431111111 -In2Fe1Te4_156_8433.vasp,In2Fe1Te4,-1.08379516,0.4054608149999986 -S6N4_31_15402.vasp,S6N4,-3.746485227,0.0377459016250008 -Zn1Te2_115_21022.vasp,Zn1Te2,-0.2292591899999999,0.3764566355555551 -Ru1I2_187_15274.vasp,Ru1I2,-0.5953163466666667,0.4099939849999991 -Mg2Si2Ni2_129_10515.vasp,Mg2Si2Ni2,-1.3136211316666666,0.4455928391666668 -Co2Bi4Br4O6_11_3869.vasp,Co2Bi4Br4O6,-2.706138134375,0.0655802637499988 -Mo3O8_2_11716.vasp,Mo3O8,-5.102946239090909,0.1066263498484803 -Y2I6_59_20750.vasp,Y2I6,-2.0747686125,0.1017580062499998 -Cr4B3O2_164_4591.vasp,Cr4B3O2,-4.670695383333333,0.7279636025308593 -B4As4_14_1745.vasp,B4As4,-3.85490445,0.9319582612499964 -Tl1_123_19359.vasp,Tl1,0.60366808,0.39135016 -Sb4Au2Se3I2_6_15769.vasp,Sb4Au2Se3I2,-1.0728626545454547,0.6142222456060573 -Ni4S4Cl4_14_13757.vasp,Ni4S4Cl4,-0.9930252016666666,0.0835277568749982 -Cr1As2Au1Se6_5_4113.vasp,Cr1As2Au1Se6,-2.004229285,0.2639529630000001 -Sr4P4Se8Cl4_14_17462.vasp,Sr4P4Se8Cl4,-2.6410539275,0.1100816169375 -Ge1O2F2_164_6682.vasp,Ge1O2F2,-2.182982638,1.3281822195000004 -K2Ta2I12_4_9362.vasp,K2Ta2I12,-1.19171351125,-0.1067478117187499 -Tl1Te6As2Au1_149_19353.vasp,Tl1Te6As2Au1,-1.168581392,0.1248030682083319 -Sc1Ni1Pd1Se1I4_6_15966.vasp,Sc1Ni1Pd1Se1I4,-0.81278127625,0.2483849599479157 -Ni1H4C2I2N6_6_13334.vasp,Ni1H4C2I2N6,-4.094302049333333,0.45049983172221 -Mo1O3_187_11529.vasp,Mo1O3,-4.163978965,0.96374439375 -Cs2H8I2_127_4724.vasp,Cs2H8I2,-1.4672821391666666,1.9930206508333304 -Ir1Pd4S3Br1Cl3O3_1_8749.vasp,Ir1Pd4S3Br1Cl3O3,-1.9494319626666663,0.373283030259257 -Zr3Te1O8_1_21787.vasp,Zr3Te1O8,-5.859569704999999,0.46672886444444 -Fe2P1S2_187_5900.vasp,Fe2P1S2,-2.401709334,-0.0688323304999998 -K2Hg4Te2S6Br6_31_9198.vasp,K2Hg4Te2S6Br6,-0.652686236,0.1329062575104157 -Cd1B4H4N2F2_10_3277.vasp,Cd1B4H4N2F2,-4.133130207692307,0.6036709596955045 -Na2Mn2As2_129_12212.vasp,Na2Mn2As2,-2.044588908333333,0.1065376410185162 -Tl2Bi6_164_19376.vasp,Tl2Bi6,-0.4948721325,-0.000280208125 -Cu2As4S3I2_6_5020.vasp,Cu2As4S3I2,-1.8066460545454543,0.1107410845643895 -Sr2Ce2_59_17178.vasp,Sr2Ce2,-0.3645401175,0.93554013 -Na1As2Pd1Se6_149_11822.vasp,Na1As2Pd1Se6,-2.0466756960000003,0.2302164524166643 -Cu2H6C10Br2N4O4_26_5135.vasp,Cu2H6C10Br2N4O4,-5.203784700357143,0.3463674386458191 -Sr2As1_164_17119.vasp,Sr2As1,-1.2981821433333334,0.4553332094444426 -Ge1Bi1Sb2Te3Se1_1_6646.vasp,Ge1Bi1Sb2Te3Se1,-1.7560937275,0.183411660937498 -Au1S1Cl2_1_1438.vasp,Au1S1Cl2,-0.3185143725,0.4443958995000001 -Zr2C1Se2_164_21536.vasp,Zr2C1Se2,-5.139304218,0.1514812049999923 -Al4F4_57_1069.vasp,Al4F4,-3.01969634375,0.4514168379166632 -Na1Ga1P2Se6_5_11865.vasp,Na1Ga1P2Se6,-2.477256947,0.1309618792187505 -Cr2Se4_11_4504.vasp,Cr2Se4,-2.737596745,0.0288888700000002 -B2Au2S2I2_31_1654.vasp,B2Au2S2I2,-1.4588577325,0.6861231931249998 -Hf1Au1Se2Br2_1_7114.vasp,Hf1Au1Se2Br2,-2.171476828333333,0.3066783058333318 -Al2Ga1Ni1S4I3Br1_1_841.vasp,Al2Ga1Ni1S4I3Br1,-1.8935202183333333,0.1376560482031206 -Rb2C2Se2Cl6O6_4_14794.vasp,Rb2C2Se2Cl6O6,-2.734286036111111,0.5232026559722174 -Ta2P2Se6_12_17822.vasp,Ta2P2Se6,-3.801598295,0.2474478745000001 -Ir2S2_164_8825.vasp,Ir2S2,-2.9322198875,0.9003066708333289 -Hf2I2O2_59_7517.vasp,Hf2I2O2,-4.850266258333334,0.3920176918181693 -Cr2As2Se6_157_4311.vasp,Cr2As2Se6,-2.562432954,0.1802123906666639 -Mn1Sb4_47_10875.vasp,Mn1Sb4,-1.910585004,0.1959372240000001 -V2Si2S6_162_20194.vasp,V2Si2S6,-3.796530801,0.162065278363628 -Hf1Pd1I6_149_7268.vasp,Hf1Pd1I6,-1.09286628875,0.1492928659374999 -Cs2Br2Cl8_127_4663.vasp,Cs2Br2Cl8,-0.4924463141666667,0.1366430229166663 -Bi2C1O5_25_2438.vasp,Bi2C1O5,-4.47369862625,0.2603335987499999 -Tl2Ni2S5_156_19460.vasp,Tl2Ni2S5,-1.3624777966666666,0.3892296746180522 -Sr2Cu1I2O2_123_17198.vasp,Sr2Cu1I2O2,-2.4203114528571428,-0.1410809353174658 -Ho2Bi2O6_147_8123.vasp,Ho2Bi2O6,-4.864221481,0.3506853943750005 -Ca2Cu1S2Cl2_38_2999.vasp,Ca2Cu1S2Cl2,-2.0647482671428574,0.121083735476186 -Pt1I2_115_14574.vasp,Pt1I2,-0.0255184566666666,0.4898371283333333 -Sb4As2O12F2_4_15762.vasp,Sb4As2O12F2,-3.750590399,0.4957692368333253 -Pt2Br2N1O1_6_14596.vasp,Pt2Br2N1O1,-2.11040876,0.2406411281249924 -Mo1Os2Br4O3_1_11532.vasp,Mo1Os2Br4O3,-2.932227052,0.3515075724999971 -Te6As2Pb2_147_18643.vasp,Te6As2Pb2,-1.589666727,-0.4000573158333348 -K2B2S2N8F6_51_8997.vasp,K2B2S2N8F6,-4.043176526,0.3807518355208206 -Ca2H2N2O6_59_3033.vasp,Ca2H2N2O6,-4.1441256975,0.5472366753749909 -Nb4Sn2Te8_55_13160.vasp,Nb4Sn2Te8,-3.0706859435714287,-0.8608252604761915 -Pd2Pb8_50_14451.vasp,Pd2Pb8,-0.87311669,0.5870722099999999 -Mn2P2O6_162_11187.vasp,Mn2P2O6,-4.845857626,0.2720881319629603 -Cu1Sn1H6_35_4983.vasp,Cu1Sn1H6,-2.1001071375,1.57490367 -In4S4I4_14_8684.vasp,In4S4I4,-1.4932568733333331,0.0509715591666666 -K1Mo2Cl6O2_47_8917.vasp,K1Mo2Cl6O2,-2.5748421063636364,0.061877767272727 -Te2Ru2_129_18517.vasp,Te2Ru2,-2.4799587,0.5352738237500001 -Nb4Pd2S10_13_13122.vasp,Nb4Pd2S10,-4.112709513125,0.1729349437499996 -Li2Cr4O13_5_9877.vasp,Li2Cr4O13,-4.737027246315789,-0.2285823749232535 -Ba1Tl1W2O6_1_1874.vasp,Ba1Tl1W2O6,-4.900120419,0.50015966759183 -Ru2Cl2_129_15307.vasp,Ru2Cl2,-1.274298695,1.3540163866666644 -Tl1S2F2_12_19331.vasp,Tl1S2F2,-1.489921526,0.6295079077500003 -Mn2C4O12_14_11049.vasp,Mn2C4O12,-5.444883275555556,0.0544430215277719 -Nb2O2F2_59_12791.vasp,Nb2O2F2,-5.643793061666667,0.0830205862962911 -Ca2Sb1_164_3115.vasp,Ca2Sb1,-0.8217924566666667,0.5807667400000002 -Ge1H2C1_156_6666.vasp,Ge1H2C1,-4.315722825,0.0582594437500009 -Pr1I2_123_14531.vasp,Pr1I2,-1.8607552433333328,0.0182703400000001 -Y2P1Br2_164_20764.vasp,Y2P1Br2,-4.247316382,0.0352653659999999 -Li1Al1Te6As2_5_9650.vasp,Li1Al1Te6As2,-1.872624472,0.2456148351666651 -P4Br12_14_14074.vasp,P4Br12,-1.236817479375,0.0585930256249989 -Co1Se2_115_3822.vasp,Co1Se2,-1.7679666833333334,0.713753812222222 -Li4Cu4O8_1_10183.vasp,Li4Cu4O8,-3.027516364375,0.1226257531250003 -In1Ga1S2Br1Cl1_1_8256.vasp,In1Ga1S2Br1Cl1,-2.0086263033333336,0.1034150606249955 -Ru2S4_127_15348.vasp,Ru2S4,-2.8869865183333334,0.7277570099999999 -Mn2S2F2_59_11216.vasp,Mn2S2F2,-2.806752858333333,0.2783417104166668 -Sn1Au1Se2_1_16609.vasp,Sn1Au1Se2,-1.143903935,-0.0177046074999999 -Ta1Ga1N1Cl2O1_25_17545.vasp,Ta1Ga1N1Cl2O1,-4.560393686666667,0.2662827404629551 -Nb4B3H2S2_164_13035.vasp,Nb4B3H2S2,-5.458964861818182,0.4428865754545403 -Co2Sb4S6Br4_11_4014.vasp,Co2Sb4S6Br4,-2.029061886875,-0.3873937997395859 -Sb1Mo1As1_156_15464.vasp,Sb1Mo1As1,-2.8192975766666666,0.3731182594047589 -Ni1Ge1Se2Br2_1_13317.vasp,Ni1Ge1Se2Br2,-1.316626295,0.1490256058564767 -K4P4O10F4_13_9492.vasp,K4P4O10F4,-4.329053326363636,0.1126861684090871 -Tb5Br8_10_18213.vasp,Tb5Br8,-2.1971166823076924,0.1140067046153824 -K2Mg1Cr2H4O10_2_9213.vasp,K2Mg1Cr2H4O10,-4.365426711052632,0.0628036368421049 -In2Br2O2_59_8387.vasp,In2Br2O2,-2.6548329666666666,0.043141485 -Al2H2O4_31_860.vasp,Al2H2O4,-5.42359653875,-0.7312228031250001 -Zr1Fe1Br6_5_21287.vasp,Zr1Fe1Br6,-1.76341692375,-0.0517174387499999 -Mo2Se2Cl2_59_11684.vasp,Mo2Se2Cl2,-2.3925281233333333,0.2790965922222224 -Cu1Sb1P2S6_143_4962.vasp,Cu1Sb1P2S6,-2.784766662,0.057675996291667 -Tl4Te4I4_14_19635.vasp,Tl4Te4I4,-0.3658282225,0.4502422347222215 -Ta2Mo2O17_164_17776.vasp,Ta2Mo2O17,-4.728219757142857,0.6770159074999972 -Ni3Se1S2Br2_1_13721.vasp,Ni3Se1S2Br2,-0.851681245,0.1194806134374999 -Fe2As2O7_1_5776.vasp,Fe2As2O7,-3.925326025454545,0.2322478226666597 -Cu2Si2O6_51_5315.vasp,Cu2Si2O6,-4.528991739,0.3060714082499967 -Al1Cu1P2Se6_149_643.vasp,Al1Cu1P2Se6,-2.43512115,0.0213273936249981 -Tl1Cd1Ga1Te4_156_19235.vasp,Tl1Cd1Ga1Te4,-0.7684051385714286,0.1834124195238083 -Li2V2F8_1_10122.vasp,Li2V2F8,-3.54211331,-0.4395712133333358 -Ti2Cl2O2_59_18922.vasp,Ti2Cl2O2,-5.506354506666667,0.0268827261111059 -Be2Cr2O8_7_2252.vasp,Be2Cr2O8,-5.104369918333333,-0.0841936869791724 -Li1Al1I4O12_2_9641.vasp,Li1Al1I4O12,-3.16706975,0.1163777283333336 -Au2N2Cl2_59_1496.vasp,Au2N2Cl2,-1.1666662466666666,0.5787394649999986 -V1Te2Au1_156_19938.vasp,V1Te2Au1,-1.1140319,1.035732065833333 -Fe2Sb2Se4I2_26_5961.vasp,Fe2Sb2Se4I2,-1.620383598,0.1810073549999998 -Mo2As2O10_85_11560.vasp,Mo2As2O10,-4.674337222857143,0.1799670430803479 -Zr1Sc3Cl4O4_3_21439.vasp,Zr1Sc3Cl4O4,-4.932553189166667,0.1026155499999998 -Si2Se2I2_59_16449.vasp,Si2Se2I2,-2.0381138,0.1795092877430535 -Sn2Hg1S2Cl2_12_16778.vasp,Sn2Hg1S2Cl2,-1.326040712857143,0.11339743535714 -Ba1Cu1W1O5_99_1825.vasp,Ba1Cu1W1O5,-4.40109252375,0.6436070357812497 -Mo3C2_187_11706.vasp,Mo3C2,-4.74382194,0.6532544904999953 -Ba1Sb2F12_1_1854.vasp,Ba1Sb2F12,-2.837016832,-0.0236397606666667 -Co1Ni1Se2O1_47_3793.vasp,Co1Ni1Se2O1,-2.075330416,0.1440414193333336 -Sb8S8O4_2_15877.vasp,Sb8S8O4,-3.179080027,0.1094122088333309 -K2Co1C4S4N4O3_3_9081.vasp,K2Co1C4S4N4O3,-4.553762302222222,0.3978115632002238 -Sb4O8_1_15789.vasp,Sb4O8,-4.183233633333333,0.2348432337500003 -Tl2Te5_1_19556.vasp,Tl2Te5,-0.8301850214285714,0.3243468847619035 -Ir1Se2_164_8762.vasp,Ir1Se2,-2.6381534966666664,-0.2850667408333329 -Ag2Br2_129_202.vasp,Ag2Br2,0.1836347475,0.0876086225 -Ta1Se1I1_156_17616.vasp,Ta1Se1I1,-3.32310367,0.3862072053571437 -P1Pb2S6_162_13931.vasp,P1Pb2S6,-2.3951802144444443,0.2359695943402757 -Sn4I2F6_18_16943.vasp,Sn4I2F6,-2.101868249166667,0.0917336254861109 -Na2Os2N2O2F10_1_12251.vasp,Na2Os2N2O2F10,-3.4013788216666665,-0.2025729450000085 -Sb2H6Pb2S6N2_7_15587.vasp,Sb2H6Pb2S6N2,-3.330407261111111,-0.1168993549739683 -Sn2S2_31_16843.vasp,Sn2S2,-2.35383246,0.1099977612499998 -Ta1Se1S1_156_17618.vasp,Ta1Se1S1,-4.93803943,-0.7155391550000001 -Hf2B1Cl2_164_7435.vasp,Hf2B1Cl2,-4.959932031999999,-0.2039108367500027 -Pr1Se3_191_14536.vasp,Pr1Se3,-2.5437245125,0.9096548477083336 -Cu2As2S6_2_5012.vasp,Cu2As2S6,-2.052843371,0.4598430970833306 -Ga1F2_115_6184.vasp,Ga1F2,-2.38523045,0.3760467966666644 -K2Br2O6_11_9009.vasp,K2Br2O6,-2.311730962,0.1108044597500006 -Na2Ru2C2Br8O4_7_12274.vasp,Na2Ru2C2Br8O4,-2.681320126666667,0.2421194572222195 -Mg2Co1_123_10440.vasp,Mg2Co1,-0.2826191166666666,0.0361483747916667 -Ti1F2_187_18776.vasp,Ti1F2,-4.814530136666667,-0.5297369811111153 -Tl2Zn2Te5_156_19571.vasp,Tl2Zn2Te5,-0.3693636688888889,0.2338446944444439 -Hg6Se6O20_4_8099.vasp,Hg6Se6O20,-2.4824883115625,0.0928865734375001 -Hg3As1_191_8048.vasp,Hg3As1,1.6066462375,0.5683457328448276 -As2Pd2S6_12_1269.vasp,As2Pd2S6,-2.357379021,0.4987971546999967 -In8O6_11_8714.vasp,In8O6,-2.952858237142857,0.4775000921428551 -Sc3Se1Br4_1_16220.vasp,Sc3Se1Br4,-2.40544421625,0.333329501874998 -Mn1Cu1Mo1S1I2O1_1_10687.vasp,Mn1Cu1Mo1S1I2O1,-1.88479101,0.5993610257142816 -Li1Mo1H1Br1Cl1O1_1_9748.vasp,Li1Mo1H1Br1Cl1O1,-3.019020505,0.32426516756944 -Tl1S2_164_19334.vasp,Tl1S2,-1.3217664466666668,0.6147442738541666 -Sc1O1_156_15969.vasp,Sc1O1,-5.09650513,0.7942031179687503 -Mn2P2Se4Cl2_10_11199.vasp,Mn2P2Se4Cl2,-2.343593948,0.1112281028750006 -Na2S4Cl2_113_12290.vasp,Na2S4Cl2,-1.355555445,0.9939613825 -Pd1Br2_164_14347.vasp,Pd1Br2,-0.2755001366666667,0.2959953266666666 -Ag1Ge1Cl6_1_56.vasp,Ag1Ge1Cl6,-0.94206830875,0.1672101846874999 -K1Tl1Br4O12_2_8949.vasp,K1Tl1Br4O12,-2.2077497855555555,0.2589478469444426 -Ta4Sn2S8_55_18116.vasp,Ta4Sn2S8,-4.444731877857143,0.4329593092857107 -Ta4Te12_2_18125.vasp,Ta4Te12,-3.04835665875,0.1246527342708299 -Li2Sn1S6F6_147_10072.vasp,Li2Sn1S6F6,-2.133436811333333,0.8382072490833339 -Sn2Cl2_129_16762.vasp,Sn2Cl2,-1.007406225,-0.4752671275 -Li4V2C6O18_28_10237.vasp,Li4V2C6O18,-5.632404200333334,0.1650523116666602 -As4F12_14_1327.vasp,As4F12,-2.75989886125,0.080388138125 -Ca1Ta2S7_123_2892.vasp,Ca1Ta2S7,-4.044103333000001,0.3584562209999973 -Sn2Br2F2_129_16741.vasp,Sn2Br2F2,-1.8989339883333327,0.0565354775000002 -Mn2W2Cl2O6_1_11336.vasp,Mn2W2Cl2O6,-4.351510595833333,0.3785203225936993 -Na1Ga1As2O6_5_11857.vasp,Na1Ga1As2O6,-4.048676056,0.3379434708124957 -Sb2S1O2_164_15671.vasp,Sb2S1O2,-3.4463994120000003,0.3265919396666634 -H10W2_51_6978.vasp,H10W2,-3.346477740833333,1.844573233333328 -Co1Br2_187_3710.vasp,Co1Br2,-0.4737776433333333,0.5450855733333324 -Pb2O2_129_14263.vasp,Pb2O2,-2.7113977,0.4296839596875001 -Tl2N2_129_19457.vasp,Tl2N2,-1.8678102975,0.7929060537500002 -Ti2Cd2_129_18920.vasp,Ti2Cd2,-1.65113555,0.28094572 -Rb2H10Ru2C2S2_4_14843.vasp,Rb2H10Ru2C2S2,-3.283729757777778,0.4880844449999968 -Hf1Pd1F6_5_7265.vasp,Hf1Pd1F6,-3.4100974125,0.0374954937500002 -Mo1Au1S2Br2_1_11489.vasp,Mo1Au1S2Br2,-1.468203733333333,0.3237407318750003 -Ta3Te6_2_17999.vasp,Ta3Te6,-3.660800075555556,0.0870832933333334 -K2Mn2As2_129_9238.vasp,K2Mn2As2,-1.5811707283333334,0.1146579200574691 -Na2B2H6S2N8_51_11978.vasp,Na2B2H6S2N8,-4.605110421,0.3002828906874981 -Zr2Tl2Cu2S6_51_21726.vasp,Zr2Tl2Cu2S6,-2.9029593475,0.1498885645833332 -Ba2P1_164_2041.vasp,Ba2P1,-1.8644116466666667,0.2901193408333324 -Mg2Sb2Se6_162_10505.vasp,Mg2Sb2Se6,-2.052624595,0.293065310333331 -Tb1Sb2_21_18178.vasp,Tb1Sb2,-2.3464539966666664,0.671477179351849 -Dy1Bi2_21_5509.vasp,Dy1Bi2,-1.7082622799999998,-0.2484682083333345 -Hf2C1F2_164_7456.vasp,Hf2C1F2,-6.040852568,0.2198590613000001 -In2Ni2Se5_187_8498.vasp,In2Ni2Se5,-1.44948492,0.0067681411111094 -Li2V2O4F4_4_10125.vasp,Li2V2O4F4,-4.372722741666666,0.0906538060069409 -In1Cu1Si1Pb1S3Br2_1_8239.vasp,In1Cu1Si1Pb1S3Br2,-1.9042455411111112,0.2538232379468561 -P1F5_47_13920.vasp,P1F5,-3.01200448,0.0903309283333335 -Ru2S2Br1Cl1_6_15336.vasp,Ru2S2Br1Cl1,-2.543387228333333,0.1732113988888859 -As2Au2S4_26_1187.vasp,As2Au2S4,-1.8030584875,0.5187983715625 -Cr2Te12As4Au2_13_4514.vasp,Cr2Te12As4Au2,-1.5141056305,0.1981753028333307 -Ta2B1S2F2_164_17657.vasp,Ta2B1S2F2,-4.647087258571429,0.8809731705714166 -Mn4B3H2O2_164_11421.vasp,Mn4B3H2O2,-3.987156926363636,0.3752792422727186 -Nb2S2I1Br3_1_12839.vasp,Nb2S2I1Br3,-2.87477406,0.0980688287499974 -Pt2I2_164_14631.vasp,Pt2I2,-0.702738965,0.52672720875 -Na2H2C2O6_4_12098.vasp,Na2H2C2O6,-5.063056531666667,-0.1122092999999999 -In2Bi2O6_149_8381.vasp,In2Bi2O6,-3.080648358,0.867717742125 -Na4Te4S8_13_12424.vasp,Na4Te4S8,-2.05076889875,0.2335009285677084 -Bi1Br2_164_2320.vasp,Bi1Br2,-0.6495833333333333,0.2834763694444436 -Al2H2S2O8_11_863.vasp,Al2H2S2O8,-4.903056549285714,-0.0642528296726263 -Ta4C3S2F2_164_18014.vasp,Ta4C3S2F2,-6.207000460909091,0.4534078123636212 -Co1C8Cl2F4_25_3723.vasp,Co1C8Cl2F4,-4.683233377333334,0.5192045602777657 -Cd1C2Br2N4F4_1_3290.vasp,Cd1C2Br2N4F4,-2.90663819,0.735845437435891 -Al1Te1I7_1_744.vasp,Al1Te1I7,-0.3859662955555555,0.0898196866666661 -Sr2La2I10_11_17271.vasp,Sr2La2I10,-1.5205818907142858,0.1144388130952366 -Sr1O10_123_17066.vasp,Sr1O10,-2.452818921818182,1.098941557272724 -Ni2Te4Cl2_11_13672.vasp,Ni2Te4Cl2,-0.75911231875,0.0277186953124993 -Ge1Cl4_123_6661.vasp,Ge1Cl4,-1.229242358,0.4260761074999999 -Ta2Te2I2_59_17903.vasp,Ta2Te2I2,-2.987525498333333,0.267520668849199 -Sn2P2Cl2O6_7_16807.vasp,Sn2P2Cl2O6,-4.268834415833333,0.0015045791666672 -In8Te12_14_8721.vasp,In8Te12,-1.305624166,0.0737454700000002 -Te6Ru2_11_18684.vasp,Te6Ru2,-1.9228564475,0.4358360241666668 -Nb1Pt1Cl2_6_12557.vasp,Nb1Pt1Cl2,-2.7050244,0.538682246562497 -Ti2B1O2_12_18888.vasp,Ti2B1O2,-6.775615514,0.3053275266666606 -Gd4Br6_12_6629.vasp,Gd4Br6,-2.299279765,0.0017329844999975 -Fe4S8_7_6088.vasp,Fe4S8,-2.155264583333333,-0.2191386683333331 -Pt2O4_14_14645.vasp,Pt2O4,-2.831409965,0.716274635 -K1Sb3_187_8935.vasp,K1Sb3,-0.9121342975,0.7952622393750001 -K2Br2_129_9010.vasp,K2Br2,-0.92975783,0.09083503 -K2Hg4Te2Cl6O6_31_9195.vasp,K2Hg4Te2Cl6O6,-1.3519090065,0.2311021337499961 -Nb3Se1I1N2Cl1O1_6_13012.vasp,Nb3Se1I1N2Cl1O1,-5.330177747777778,0.2001213943460432 -Bi2Se2_12_2549.vasp,Bi2Se2,-1.6115027525,0.2232350049999988 -Sr3Ge1_25_17381.vasp,Sr3Ge1,-0.2357492475,0.83133052125 -W4S2N3_156_20592.vasp,W4S2N3,-5.796391907777778,-0.3264740122222276 -W2Br2O2_59_20460.vasp,W2Br2O2,-4.009237033333333,0.41719997570861 -Na2B2Se2N2_31_11986.vasp,Na2B2Se2N2,-3.81929349125,1.0814439393750002 -Ge1S1_156_6697.vasp,Ge1S1,-3.107914,-0.85676614625 -Ti3Mo1Se1S2I3N2_1_19093.vasp,Ti3Mo1Se1S2I3N2,-4.360653874166666,0.0762511813095212 -K2Te2Pt1_47_9376.vasp,K2Te2Pt1,-0.6821787180000001,0.5227045239999999 -Pd2Br1N2Cl1_6_14397.vasp,Pd2Br1N2Cl1,-2.094157625,0.386824104444442 -Pb2S2_31_14281.vasp,Pb2S2,-2.1225601875,-1.4494267425 -V2F2_129_20057.vasp,V2F2,-2.681369185,0.9970651433333304 -K2Mg1Te2O8F4_2_9228.vasp,K2Mg1Te2O8F4,-2.655288461176471,-0.1097014999346469 -Ca2Co1O3_12_2984.vasp,Ca2Co1O3,-3.892662806666667,0.1113824347222193 -Ni3Te1Mo1Se3_6_13731.vasp,Ni3Te1Mo1Se3,-1.30164484375,0.0878871474999972 -Ge3N4_5_6912.vasp,Ge3N4,-4.977734317142857,0.320347339285715 -Ag1H6Pb1_8_79.vasp,Ag1H6Pb1,-1.79805791125,1.896863546875 -Tl2Se2_187_19531.vasp,Tl2Se2,-1.0733893525,0.2264902885416666 -Nb2Co2Se10_51_12691.vasp,Nb2Co2Se10,-2.99348864,0.2063337352380925 -Sr3Ag2S4Cl2_123_17347.vasp,Sr3Ag2S4Cl2,-1.982204833636364,0.1373223208522664 -W2I6_12_20504.vasp,W2I6,-1.044074975,0.4331986103124984 -Ag1Se2_187_130.vasp,Ag1Se2,-0.6691978566666666,-0.3269010283333333 -Sb1P2Au1Se6_143_15476.vasp,Sb1P2Au1Se6,-2.152620009,0.0649334654374982 -Li4C4S4O12F12_14_10171.vasp,Li4C4S4O12F12,-4.025101933888888,0.0525420062499972 -Ti4C3O2_164_19130.vasp,Ti4C3O2,-7.659740901111111,-0.2520732770370446 -Ir1Br2_164_8727.vasp,Ir1Br2,-0.97617037,0.7440412811111096 -Li2Mn2Bi2_129_9992.vasp,Li2Mn2Bi2,-1.459198055,-0.2033966440804607 -Ta1Se2_10_17619.vasp,Ta1Se2,-3.95329395,0.7417851916666662 -Ga1Co2S4Cl3_1_6151.vasp,Ga1Co2S4Cl3,-2.023031984,0.4218997335000003 -Ce2Be4_51_3663.vasp,Ce2Be4,-2.0415967983333334,0.9823383364102534 -Bi4Au4Cl24_2_2595.vasp,Bi4Au4Cl24,-0.71906032375,0.122543804375 -Sr2Cu1Se2I2_38_17207.vasp,Sr2Cu1Se2I2,-1.4831636985714287,0.0518565733333301 -Sr1H2Se2_5_17056.vasp,Sr1H2Se2,-2.684736122,0.720298973666667 -Ti3C2O2_187_19074.vasp,Ti3C2O2,-7.472679875714285,-0.0624653319047685 -Mn1Cr1S2I2Br2_1_10678.vasp,Mn1Cr1S2I2Br2,-1.4751280275,0.2094094545312499 -Sn6P2O12_1_16993.vasp,Sn6P2O12,-4.3769339755,0.0307732222499963 -Eu1C2_8_5586.vasp,Eu1C2,-5.365129846666666,1.0456947309259212 -Ag1Pb1F6_2_97.vasp,Ag1Pb1F6,-1.41805109375,0.1261971750000001 -Cu1Br1O2_10_4858.vasp,Cu1Br1O2,-1.6411736,0.2272479456250002 -Ca4Fe2Br2O6_129_3213.vasp,Ca4Fe2Br2O6,-3.715796375,-0.0821663971428605 -Hg2Br2_2_7946.vasp,Hg2Br2,0.97589805,0.1851644949999999 -Ag2S2_59_387.vasp,Ag2S2,-0.6397874675,0.32844149734375 -Mg2Sb4O8_7_10509.vasp,Mg2Sb4O8,-4.110680903571429,0.2293147907142856 -Hf4Ti1V1C1Br4N1Cl2O2_1_7825.vasp,Hf4Ti1V1C1Br4N1Cl2O2,-4.931874475625,0.3603203445138832 -Si2Se2Cl2_59_16447.vasp,Si2Se2Cl2,-2.4451412583333334,0.2832356192708309 -Al2Br2N2_59_772.vasp,Al2Br2N2,-3.68082212,0.4871381913888848 -Nb4Fe4S8_53_13072.vasp,Nb4Fe4S8,-3.58674095,0.7239687595833311 -Cs1H10C12N4O10_2_4643.vasp,Cs1H10C12N4O10,-5.622736456486487,0.2918574964555067 -Sc1Nb1Te2_99_15963.vasp,Sc1Nb1Te2,-3.3739563225,0.3908997743749995 -Ti3I1Br1N2_1_19091.vasp,Ti3I1Br1N2,-5.586573395714285,0.3421228964285552 -Ag2As4Se3F2_6_171.vasp,Ag2As4Se3F2,-1.7871186,1.3543822615151455 -Ca1F2_187_2833.vasp,Ca1F2,-3.331809863333333,0.511938433333333 -Ga2H14C4_10_6373.vasp,Ga2H14C4,-3.7256028495,0.5294719444999999 -K2Mg1S2O8F4_2_9223.vasp,K2Mg1S2O8F4,-3.352334348823529,0.2042625416176441 -Sb4F12_14_15776.vasp,Sb4F12,-2.722718123125,0.3934152918750002 -K2Os2C2O2F10_11_9277.vasp,K2Os2C2O2F10,-3.5191856366666667,-0.0609246143333438 -As4O8_11_1339.vasp,As4O8,-4.3449615108333335,0.0962416745833247 -Al1Ag1P2Se6_149_599.vasp,Al1Ag1P2Se6,-2.402934992,-0.0020814573437496 -V3F8_164_20259.vasp,V3F8,-3.436291959090909,-0.3081685542424275 -Co2Te5As2_8_4048.vasp,Co2Te5As2,-1.7278771633333332,0.3291187248148131 -Si2Ni2Sb2_129_16417.vasp,Si2Ni2Sb2,-1.8696061283333332,0.3203368466666646 -K1Br2_25_8885.vasp,K1Br2,-0.3355316299999999,0.6141561174999992 -Zr2Si2S2_129_21684.vasp,Zr2Si2S2,-4.827730625,0.1270295099999998 -In2Sb2_129_8569.vasp,In2Sb2,-1.337591435,-0.57571065 -Rb2Cd4S2Br6O6_31_14807.vasp,Rb2Cd4S2Br6O6,-1.8286489975,0.1222070398437466 -Fe2S2_187_5936.vasp,Fe2S2,-1.7299784925,0.2517865875 -Li4H4Se4O16_2_10196.vasp,Li4H4Se4O16,-3.873418984642857,0.087459550523806 -Hf1Zr1Nb2Br3Cl1O4_1_7386.vasp,Hf1Zr1Nb2Br3Cl1O4,-5.028503856666666,0.2567861268080297 -Te2Pb2Br2_59_18450.vasp,Te2Pb2Br2,-1.0573845933333332,-0.2187140205555564 -Al1Sb1_156_727.vasp,Al1Sb1,-1.930490005,-0.38160708 -Rb2H2C2O6_4_14844.vasp,Rb2H2C2O6,-4.83338037,0.0930154325000005 -K2Ta2F12_1_9361.vasp,K2Ta2F12,-3.945877850625,0.0566005643749996 -Ho2C1_164_8131.vasp,Ho2C1,-4.04238225,0.4377120699999999 -Ca2Ag1Se2F2_38_2914.vasp,Ca2Ag1Se2F2,-1.9775509857142857,0.4375897957142818 -Li2Sn1P4O12_3_10071.vasp,Li2Sn1P4O12,-5.1560868352631575,0.1531718966315751 -K2Ge1S6F6_147_9113.vasp,K2Ge1S6F6,-2.0473535326666665,0.6627386607500005 -Sn2As1Se6_162_16712.vasp,Sn2As1Se6,-2.087738031111111,0.1950941571296252 -Zr2Sn2Te8_31_21694.vasp,Zr2Sn2Te8,-2.246586609166666,-0.395792305833335 -Si2Sb6_164_16445.vasp,Si2Sb6,-2.23570265125,0.2245099156249997 -Li2Sc1_187_10067.vasp,Li2Sc1,-1.5874227,0.2851223927777762 -Hg8Mo4O16_14_8107.vasp,Hg8Mo4O16,-2.6941432567857144,0.1761808425 -W2Se2Br2_59_20542.vasp,W2Se2Br2,-2.85733307,0.1309842397222225 -In4F8_10_8673.vasp,In4F8,-2.3306373116666665,0.1804647749999999 -Bi2Cl4O2_51_2447.vasp,Bi2Cl4O2,-1.88568222875,0.3547207595312501 -Mn1Sb2Se4_164_10873.vasp,Mn1Sb2Se4,-2.2773335342857144,0.0368629747619027 -Ge1Br2_115_6652.vasp,Ge1Br2,-1.3795887866666667,0.2651832933333333 -Tl2_51_19573.vasp,Tl2,0.27366045,0.06134253 -Te6P2Os2_162_18666.vasp,Te6P2Os2,-2.595259835,0.1495767516666654 -Zr2Zn2_129_21731.vasp,Zr2Zn2,-0.816410455,1.4909761 -Sb1S1Br1_156_15486.vasp,Sb1S1Br1,-1.8348654266666669,-0.5594697450000001 -Ta4Se2_129_18110.vasp,Ta4Se2,-6.096352876666667,0.0680619199999998 -Mn2Se1S1O1_8_11274.vasp,Mn2Se1S1O1,-3.130112626,-0.0062454094827602 -Te1Mo2S1I1Br1_1_18309.vasp,Te1Mo2S1I1Br1,-2.0710608316666668,0.1976390365972219 -V1Mo1O3F2_1_19879.vasp,V1Mo1O3F2,-4.35750441,0.1029446428571354 -Ag2H6C2N4_11_284.vasp,Ag2H6C2N4,-4.4353915200000005,-2.6723352001190523 -Mg1Ge1S2Cl2_1_10367.vasp,Mg1Ge1S2Cl2,-2.34830497,0.2639678180208331 -Sr1H1I1O1_156_17053.vasp,Sr1H1I1O1,-3.1038187775,0.2152700900000002 -Bi6Pb2_164_2671.vasp,Bi6Pb2,-0.88566098,-0.20346345375 -Nb3Te3Mo1Se1_6_13029.vasp,Nb3Te3Mo1Se1,-3.69204038125,-0.2638941335937501 -Nb2Ge2Sb2_129_12729.vasp,Nb2Ge2Sb2,-3.955840893333333,0.3488103333333332 -P2Ir1Ru1S6_143_13990.vasp,P2Ir1Ru1S6,-3.394495981,0.3013170042187476 -Au2S2I2_59_1514.vasp,Au2S2I2,-0.2570630133333333,0.2822452054861106 -Cu1O2_65_4931.vasp,Cu1O2,-1.8391150333333333,0.9284652308333312 -Hf2C2Br2_164_7461.vasp,Hf2C2Br2,-5.124739941666667,0.6253718016666614 -Cr4O10_59_4613.vasp,Cr4O10,-4.882768888571428,-0.2734633282142892 -Ta6Te18_11_18159.vasp,Ta6Te18,-3.0984001366666667,0.0746092563541631 -Zr4O4F4_31_21835.vasp,Zr4O4F4,-5.303902691666667,0.5854442859722169 -Sr2Au1Se2Cl2_38_17133.vasp,Sr2Au1Se2Cl2,-1.6494548442857142,0.3396626535714249 -Bi2As2O6_1_2415.vasp,Bi2As2O6,-3.904022669,0.2675932310000002 -Co1Si3_187_3826.vasp,Co1Si3,-2.6912261375,0.3148997499999996 -Ag2Hg2As2S6_7_296.vasp,Ag2Hg2As2S6,-1.2770859483333334,0.182830952083332 -Nb4Ni4Se8_53_13104.vasp,Nb4Ni4Se8,-2.954754945625,-0.2052092542663066 -Li1In1P2S6_5_9732.vasp,Li1In1P2S6,-3.126801195,0.0929093044999995 -Ti2Te6P2_12_19048.vasp,Ti2Te6P2,-2.99116558,0.4741282820000007 -H4Pd1C2Br2N6_6_7071.vasp,H4Pd1C2Br2N6,-4.2495380266666665,0.3316785807222109 -Hg1O2_164_7888.vasp,Hg1O2,-0.8875758766666667,0.7453756343055542 -Cd2Sb2S4F2_11_3561.vasp,Cd2Sb2S4F2,-1.726883375,0.3353153934999975 -Li2Br2O4F8_2_9845.vasp,Li2Br2O4F8,-1.763387911875,0.4281477121874999 -K4H12C8S12_14_9451.vasp,K4H12C8S12,-3.866678588888889,0.1186273716666554 -Zr4Mn2N4Cl6_1_21829.vasp,Zr4Mn2N4Cl6,-4.5422384975,0.1997660332974138 -K4I2_51_9465.vasp,K4I2,0.1497537616666666,-0.2079075116666663 -Cu4Te2_191_5481.vasp,Cu4Te2,-0.0345878116666666,0.3973999991666659 -Nb1Br2_187_12482.vasp,Nb1Br2,-2.58663712,0.3746724012499959 -Ge1N1F2_156_6680.vasp,Ge1N1F2,-2.98100049,0.7609570443750002 -Ta2V2Se10_11_17933.vasp,Ta2V2Se10,-3.590756122857143,0.071964736785711 -Y2Br6_59_20706.vasp,Y2Br6,-2.82010493625,0.084748395 -Mo1N1Cl2_25_11523.vasp,Mo1N1Cl2,-3.19778243,-0.0909676185416688 -Zr2O2_164_21619.vasp,Zr2O2,-5.629546985,0.9117220216666668 -Cr1Os1W1S4Cl3_1_4227.vasp,Cr1Os1W1S4Cl3,-3.057339084,0.2475317557499947 -K2Co2Bi2_129_9083.vasp,K2Co2Bi2,-0.4467951216666666,0.414446908541666 -Fe2S2Br1Cl1O1F1_1_5930.vasp,Fe2S2Br1Cl1O1F1,-1.9215681025,0.0760638163318389 -Ti3C2Se2F2_187_19077.vasp,Ti3C2Se2F2,-5.0998703800000005,0.2182445527777723 -Ba2Ag1Cl2O2_123_1881.vasp,Ba2Ag1Cl2O2,-2.8020308857142857,0.0279608502678548 -Co1F2_164_3734.vasp,Co1F2,-2.0663145000000003,0.2484100624999996 -Li2Ni2Sb2_12_10029.vasp,Li2Ni2Sb2,-1.27125376,0.1259492099999971 -Ag1Cl2_164_48.vasp,Ag1Cl2,-0.0378633433333333,0.16134853 -Mn2As2Se6_162_10986.vasp,Mn2As2Se6,-2.353227842,0.1065403016666641 -Li1Ni1As2S6_149_9758.vasp,Li1Ni1As2S6,-2.465908076,0.3739894437187478 -V1H1S2_156_19848.vasp,V1H1S2,-3.441334255,0.2585370753124998 -Hg6Te4_14_8102.vasp,Hg6Te4,1.028760102,0.1570273794252898 -Sr1Nb2O7_123_17064.vasp,Sr1Nb2O7,-5.820967115,0.4312356218749975 -Sn2P2H6C2S6_7_16814.vasp,Sn2P2H6C2S6,-3.7268576077777777,0.0751865838888783 -B2_51_1726.vasp,B2,-5.319887575,0.8410977233333332 -Tm2Fe2Ge4_129_19678.vasp,Tm2Fe2Ge4,-2.38826555625,0.4052360508333301 -Au2Br6_191_1460.vasp,Au2Br6,0.4984694575,0.37461988375 -K2N6O6F6_1_9250.vasp,K2N6O6F6,-3.378663238,0.2784823682499907 -Sc1Nb1Se1Br2_1_15960.vasp,Sc1Nb1Se1Br2,-3.081019754,0.4198829617500001 -Cu1Ag1S2_1_4824.vasp,Cu1Ag1S2,-0.7705193675,0.4118189357552083 -Sn6Bi2_191_16981.vasp,Sn6Bi2,-0.46966510625,-2.30851572125 -Ge2As2S6_147_6741.vasp,Ge2As2S6,-2.882544997,0.2159258089999971 -Hg1Pb2Cl2O2_12_7896.vasp,Hg1Pb2Cl2O2,-1.8815679428571428,0.0954946942857144 -Sb2Se2_2_15700.vasp,Sb2Se2,-2.07415422,0.2736234837499978 -Co2Te4H2_11_4045.vasp,Co2Te4H2,-1.9181960075,0.5213214070833334 -Li2Cr3C6O18_2_9874.vasp,Li2Cr3C6O18,-5.634107627931035,0.0789851075215366 -Li2Fe3F8_164_9915.vasp,Li2Fe3F8,-2.9464478684615383,-0.111565548461541 -Zn1O2_164_20986.vasp,Zn1O2,-1.67522762,0.9119667804166642 -Fe4H2C3S2_164_6080.vasp,Fe4H2C3S2,-3.1755323227272725,0.8101406872727214 -Ta2O2_129_17810.vasp,Ta2O2,-6.105422315,1.632850399000001 -V12O26_51_19743.vasp,V12O26,-5.6045326689473685,-0.0074106176315837 -Tb1Cu2S2_164_18171.vasp,Tb1Cu2S2,-2.110817068,0.7534576215 -Hf2Si2Se8_31_7616.vasp,Hf2Si2Se8,-3.695271508333333,0.2313501817708338 -Re1W1O6_35_15029.vasp,Re1W1O6,-5.80418537875,-0.4404593471874998 -Pt2Cl4_2_14616.vasp,Pt2Cl4,-0.758480905,0.3595591566666668 -Tl2Se2Br2_1_19525.vasp,Tl2Se2Br2,-0.8128478499999999,0.3409565011111102 -Hf3Al4C6_164_7675.vasp,Hf3Al4C6,-6.317063885384615,0.1268841976923024 -U2Se10_4_19723.vasp,U2Se10,-3.5447576858333334,0.2072394352777742 -Ti4Br4O4_7_19127.vasp,Ti4Br4O4,-5.066287151666667,0.2293130994444396 -Ti2O4_11_18977.vasp,Ti2O4,-7.067529356666667,0.1963251683333329 -Mn2H2N1O2_164_11090.vasp,Mn2H2N1O2,-4.384201265714286,0.6144848285714235 -Mn1H1O2_6_10760.vasp,Mn1H1O2,-4.1626711025,0.5071729643749958 -Co4Br4O4_14_4078.vasp,Co4Br4O4,-2.4649295016666666,-0.3567884209722239 -Te8P8O4_2_18707.vasp,Te8P8O4,-2.9987665355,0.4618146143666616 -Te2Pd2I4_2_18469.vasp,Te2Pd2I4,-0.52231174875,-0.0235789827500002 -Cu4Te2_12_5480.vasp,Cu4Te2,-0.1758992716666666,0.2560885391666659 -Rb2Cd4Te2O6F6_31_14826.vasp,Rb2Cd4Te2O6F6,-1.857769833,0.497249487625 -K4Co2S4_49_9435.vasp,K4Co2S4,-1.589667272,0.2455576570370349 -V3B2H2S2_187_20239.vasp,V3B2H2S2,-4.169711924444445,0.3531375741666578 -Co2C2Br2_59_3881.vasp,Co2C2Br2,-2.764841585,0.7291816749999974 -Cs2Ru2Br8N2O4_7_4768.vasp,Cs2Ru2Br8N2O4,-2.295308722777777,0.2523509980555538 -Mg2W2S14_18_10535.vasp,Mg2W2S14,-2.965310933333333,0.1455647808333309 -Ta2Se2Cl2_59_17870.vasp,Ta2Se2Cl2,-4.095474221666667,0.0988866558333244 -Nb1As2_164_12465.vasp,Nb1As2,-4.2440946833333335,0.5348379699999999 -Si12Ir4_127_16310.vasp,Si12Ir4,-4.04926858625,0.0776698946874959 -Te2Pd2_129_18474.vasp,Te2Pd2,-1.023246535,0.1582768212500001 -Al1S2F2_164_723.vasp,Al1S2F2,-2.368154938,1.1709217764374962 -Bi2Cl2O2_59_2443.vasp,Bi2Cl2O2,-2.708777105,0.2595183183333338 -Zn2H12Se4O16_14_21092.vasp,Zn2H12Se4O16,-3.778501601176471,0.0422497829411729 -Cu4Te4O12_14_5487.vasp,Cu4Te4O12,-2.894210777,0.3649875182500004 -Ca2Te2Au1Br2_38_3131.vasp,Ca2Te2Au1Br2,-1.0663740228571428,0.3505218249999977 -Si4Sb8_26_16513.vasp,Si4Sb8,-2.7293418166666665,-0.2102474183333355 -Cs2H6C6O6_4_4721.vasp,Cs2H6C6O6,-5.108933657,0.1985952630000009 -V2O4_11_20128.vasp,V2O4,-5.49689174,0.1810473350000006 -W1I2_115_20436.vasp,W1I2,-0.9794114866666668,1.0912790663888887 -Sr4Co2Cu4O14_26_17417.vasp,Sr4Co2Cu4O14,-3.2348237304166667,0.3419607766666599 -Te8Br8_2_18692.vasp,Te8Br8,-0.728042101875,-0.5136189290178572 -V2Se1S1I2_6_20179.vasp,V2Se1S1I2,-2.414839805,-0.1891532496527832 -Ag2Se4I2_1_443.vasp,Ag2Se4I2,-0.68375912125,0.2964985029166666 -Zr4Cu2Ge8_129_21818.vasp,Zr4Cu2Ge8,-3.3504503692857144,0.1868904750000002 -Ni3S1Br3Cl1O1_1_13713.vasp,Ni3S1Br3Cl1O1,-0.8532546088888888,-0.0207260078571485 -Gd2Br6_12_6603.vasp,Gd2Br6,-2.3086767775,0.0756285662499998 -Ga2Ni1O4_164_6398.vasp,Ga2Ni1O4,-3.695683457142857,0.241889652142857 -Al2In2H8_3_888.vasp,Al2In2H8,-2.5185127375,0.8057056166666597 -Ti2H2C1_164_18946.vasp,Ti2H2C1,-5.912679532,0.2391783479999993 -Zr2O2_129_21617.vasp,Zr2O2,-5.3594726925,1.1817963141666672 -In1P2Au1Se6_149_8299.vasp,In1P2Au1Se6,-2.082447926,0.0712455934374983 -Sn1Sb1As3O9_1_16683.vasp,Sn1Sb1As3O9,-4.18247981,0.2548264405357054 -Zr4H2N3O2_164_21824.vasp,Zr4H2N3O2,-6.293128910909091,0.3610984999999893 -K2H10Ru2C2O2_1_9115.vasp,K2H10Ru2C2O2,-3.652505412222222,0.3876562049999966 -Mn2B1O2F2_164_10996.vasp,Mn2B1O2F2,-2.7062046200000003,1.658586967701658 -In1Fe5Cl2_123_8247.vasp,In1Fe5Cl2,-0.49533932875,1.397325159375 -As2I8_2_1224.vasp,As2I8,-0.349872283,0.1223313063750004 -Nb4Te6_11_13174.vasp,Nb4Te6,-3.608265167,-0.5287514026666695 -Ag2Te2_10_466.vasp,Ag2Te2,-0.0953970075,0.2622354354166666 -Mo2I2N2_59_11621.vasp,Mo2I2N2,-3.504625055,0.2505045286111111 -La2Br2_164_9581.vasp,La2Br2,-2.3984035375,0.1883494885000001 -Na4Te4O8_13_12423.vasp,Na4Te4O8,-3.2368753575,0.2905247510416666 -Cd2S2F2_59_3545.vasp,Cd2S2F2,-0.8540978316666666,0.4038368786458314 -Te1Mo1Rh2Se3_1_18303.vasp,Te1Mo1Rh2Se3,-2.2167803085714284,0.9000370663598796 -Hf1Mn1Te2_1_7226.vasp,Hf1Mn1Te2,-2.76796361,0.5576221681896556 -Ni2Te6P2_162_13682.vasp,Ni2Te6P2,-1.363652855,0.4905347630833304 -V4Re4O22_1_20354.vasp,V4Re4O22,-5.564794570666667,0.1561899146666672 -Ca2Tl2Cl6_51_3137.vasp,Ca2Tl2Cl6,-1.788585118,-0.0214830909999999 -Sr4Cu4Ni2O14_6_17426.vasp,Sr4Cu4Ni2O14,-2.954106210833333,0.1489705858333316 -Sn2Sb2O6F2_7_16861.vasp,Sn2Sb2O6F2,-3.665383678333333,0.3541874115624999 -Zr2Si2Te2_129_21689.vasp,Zr2Si2Te2,-3.9859018616666666,0.0808693466666663 -Hg1H1I1O1_156_7860.vasp,Hg1H1I1O1,-1.3009016975,0.1793087526041667 -Sr4Mn2Cl2O6_129_17445.vasp,Sr4Mn2Cl2O6,-4.041367909285714,0.0307782142857142 -Nb3I7O1_156_12981.vasp,Nb3I7O1,-2.428162359090909,0.177300201010098 -Hf2S2Cl2_59_7568.vasp,Hf2S2Cl2,-4.4921785000000005,-0.0034146947916764 -Cu2H8C8I2_2_5151.vasp,Cu2H8C8I2,-4.3867229295,0.2877241904999994 -Mo1Br5_10_11501.vasp,Mo1Br5,-0.7690609666666667,0.2510885324999999 -Te2Rh2I2_59_18503.vasp,Te2Rh2I2,-1.3840723833333335,0.104256223333333 -Tl2Cl2_59_19390.vasp,Tl2Cl2,-1.0199975725,-0.0924997624999999 -Ni1N6F6_47_13380.vasp,Ni1N6F6,-2.7958484323076926,0.4055312659615326 -Mn3Se2S2_1_11409.vasp,Mn3Se2S2,-2.652964277142857,0.0961356185714232 -Sn1Hg2S4_21_16647.vasp,Sn1Hg2S4,-0.9783118014285714,0.2594394328571414 -Zr1P2_164_21395.vasp,Zr1P2,-3.9980923333333336,1.1214541641666664 -Li5Zn4B4O12_1_10259.vasp,Li5Zn4B4O12,-4.5755095712000005,0.1024318728999978 -Cd1In1Ga1Se4_156_3371.vasp,Cd1In1Ga1Se4,-1.6133215142857142,-0.0674672128571428 -Ag4Se4Cl4_14_563.vasp,Ag4Se4Cl4,-0.5676365975000001,0.176965165416666 -Cr4N3F2_164_4609.vasp,Cr4N3F2,-4.663610531111111,-0.0845243835802508 -Zn1Cd1Te1Br1O2_1_20912.vasp,Zn1Cd1Te1Br1O2,-1.3396450316666666,0.1921466268749999 -Tl6Se6_2_19646.vasp,Tl6Se6,-1.0143410458333333,0.2855385952083333 -Ni2O1F1_1_13543.vasp,Ni2O1F1,-1.5191873175,0.565316775625 -Mn1Sn2I1Cl1O2_1_10901.vasp,Mn1Sn2I1Cl1O2,-2.573158108571429,0.1141219615065626 -V1Ge1W1O7_1_19844.vasp,V1Ge1W1O7,-5.34323449,0.2147886617499956 -Ba2As4O12_2_1902.vasp,Ba2As4O12,-4.447896308333333,0.2478456061111105 -Tb2I6_162_18202.vasp,Tb2I6,-1.5769264825,0.0589093362499999 -Hf3B2Te2H2_187_7687.vasp,Hf3B2Te2H2,-4.539745133333334,0.5542545977777731 -Fe6P24_14_6093.vasp,Fe6P24,-3.3653945883333334,0.5115879681666664 -Sb2Ru2S6_162_15669.vasp,Sb2Ru2S6,-2.966591942,0.3165746916999938 -Tm2Te6_129_19690.vasp,Tm2Te6,-2.33780762375,-0.7629672174999997 -Hf2P1Se2_164_7552.vasp,Hf2P1Se2,-5.251369508,0.0777395425000011 -Sc1Br2_115_15915.vasp,Sc1Br2,-1.9175660466666664,0.4701472716666643 -Tl1Cu1Sb2Se6_149_19257.vasp,Tl1Cu1Sb2Se6,-1.511412047,0.3872153038888851 -Li2Sb2Pd2_12_10065.vasp,Li2Sb2Pd2,-1.90048,0.0647445402777759 -Cd3Bi1_191_3610.vasp,Cd3Bi1,1.9774223175,-0.0154593449999995 -Tl2S3_189_19510.vasp,Tl2S3,-1.249697556,0.5505383487499977 -Co2P4O8_51_3970.vasp,Co2P4O8,-4.621314123571429,0.3055015675714214 -Sb4W2_2_15841.vasp,Sb4W2,-3.197029708333333,0.6645173966666633 -Nb4O10_11_13116.vasp,Nb4O10,-6.665762224285714,-0.1985872194642885 -Bi2Sb2Se6_157_2530.vasp,Bi2Sb2Se6,-2.011731384,0.2202950970000001 -Be3Sn1_25_2284.vasp,Be3Sn1,-2.0557875575,-1.0192750899999998 -Cu2As4S12_12_5016.vasp,Cu2As4S12,-2.279772611666667,0.5301159284143492 -Ga4Sb20_26_6568.vasp,Ga4Sb20,-1.8724139008333331,0.0263203991666649 -V1Cl2O1_47_19797.vasp,V1Cl2O1,-3.3144002725,-0.0280157531249996 -V2Te2O1_164_20210.vasp,V2Te2O1,-3.356194706,0.22988547133333 -V2I2_164_20097.vasp,V2I2,-1.560545995,0.4893181291666666 -Ti1Pb1O3_99_18826.vasp,Ti1Pb1O3,-5.335939382,0.1195139139999996 -Pd4F8_14_14518.vasp,Pd4F8,-1.3250753491666667,0.1121738691666665 -Zr1S2O12_21_21414.vasp,Zr1S2O12,-4.405330848,0.3134027543333291 -Zn12As8_115_20892.vasp,Zn12As8,0.059041147,0.3051673585 -Cr2N1Cl2_164_4422.vasp,Cr2N1Cl2,-3.422511074,-0.1396611237777816 -Zn2H8N4O16_14_21103.vasp,Zn2H8N4O16,-4.141490581,0.0433820498888841 -Hg2Bi2O4F2_11_7937.vasp,Hg2Bi2O4F2,-2.109849312,0.1552903073333336 -Fe1H4C2N4F2_47_5695.vasp,Fe1H4C2N4F2,-4.768718413846154,0.2242806595833255 -V2As2O10_129_19978.vasp,V2As2O10,-4.909949866428571,0.0854686257142871 -Cr1H2O2_164_4185.vasp,Cr1H2O2,-4.3062704080000005,0.2273977987777724 -Sr2H3_164_17236.vasp,Sr2H3,-2.066120014,0.3355603637499972 -Tl2S2Br1Cl1_1_19496.vasp,Tl2S2Br1Cl1,-1.0563557366666667,0.3176758831249987 -Te4W2_11_18633.vasp,Te4W2,-2.970688925,0.0742090266666668 -Cd1Sn2S2Br2_12_3431.vasp,Cd1Sn2S2Br2,-1.3214139985714284,0.0945092328571401 -C1Se2_164_2738.vasp,C1Se2,-2.605847723333333,1.6382531155555518 -Be2As1_164_2236.vasp,Be2As1,-2.441901263333333,0.701602641666664 -Tl1Cd1In1O4_156_19236.vasp,Tl1Cd1In1O4,-2.570857744285714,0.2565450034226173 -C2F2_164_2746.vasp,C2F2,-4.8127362425,0.3030098212499998 -Lu2Br2O2_129_10302.vasp,Lu2Br2O2,-4.778526903333334,0.0512850716666664 -In1S1Br2_3_8325.vasp,In1S1Br2,-1.108796455,0.409592636484375 -Mn2Sb2Se4I2_10_11251.vasp,Mn2Sb2Se4I2,-1.760789166,0.0892519422500005 -Ni2Te1Br1O1_6_13652.vasp,Ni2Te1Br1O1,-1.060836288,0.9648487343750002 -Mn3Au1Se1I1Br1Cl3O4_1_11350.vasp,Mn3Au1Se1I1Br1Cl3O4,-2.2339241128571428,0.1814342085416585 -Ba2Ti3O7_1_2072.vasp,Ba2Ti3O7,-6.181554149166666,-0.0157702561666717 -Sm2Se2_129_16585.vasp,Sm2Se2,-3.6761765825,0.2696160208333329 -Co2As1Se2_187_3841.vasp,Co2As1Se2,-2.43115775,0.0869295459333294 -V3Mo1S8_25_20277.vasp,V3Mo1S8,-3.7411002775,0.0166485020833335 -In1Si1S3_143_8347.vasp,In1Si1S3,-2.704432304,0.5361692939999985 -V1O2_191_19895.vasp,V1O2,-3.5490750933333337,2.1288639816666666 -Pd2Se4_14_14500.vasp,Pd2Se4,-1.6816181183333334,0.1667186300000001 -Zr2Ti1Ge1Pt1Se4S1Cl6_1_21721.vasp,Zr2Ti1Ge1Pt1Se4S1Cl6,-3.02457467,0.2776067377704263 -Er2P6H12O12_10_5565.vasp,Er2P6H12O12,-4.8303509521875,0.0865946419791633 -Zr2Te6P2_12_21718.vasp,Zr2Te6P2,-2.725079097,0.3035314719999957 -Ag2C2O2F2_31_218.vasp,Ag2C2O2F2,-3.35039794875,0.3348770231250002 -Mn1Te2_187_10913.vasp,Mn1Te2,-1.5033811533333334,0.2724145666666664 -P1Ir3Br1O3_1_13926.vasp,P1Ir3Br1O3,-3.3145558875,1.3217460435416597 -Au2F2_51_1480.vasp,Au2F2,0.0866372,1.0605494355555547 -Rb1C1N1_6_14725.vasp,Rb1C1N1,-4.775793976666667,0.2977437633333264 -Co2Te2Br2_59_4032.vasp,Co2Te2Br2,-1.3121810716666666,0.10927383 -Mo8Se24_14_11767.vasp,Mo8Se24,-2.6138666478125,0.2471904080208334 -Nb2Ge2P2_129_12728.vasp,Nb2Ge2P2,-4.705582545,0.1150946649999968 -Sn2Se2F2_59_16878.vasp,Sn2Se2F2,-2.136641238333333,0.2795344029166668 -Zr2F6_2_21565.vasp,Zr2F6,-4.23818798375,0.3191546318750002 -Te4Pt2_4_18620.vasp,Te4Pt2,-1.5129997466666667,0.3321877016666665 -Mn2Mo2Br2O8_129_11136.vasp,Mn2Mo2Br2O8,-4.012231812857143,0.0882178476785643 -Bi2Br6_31_2436.vasp,Bi2Br6,-0.82595024875,0.1653834174999999 -Te6Pb2_1_18676.vasp,Te6Pb2,-1.20922457375,-0.4537152829166667 -Li2Nb2I12_4_10014.vasp,Li2Nb2I12,-1.2524810325,0.0952742156250001 -Cu1S2_115_4957.vasp,Cu1S2,-1.4043143566666665,0.3765830509027764 -B2Br6_26_1657.vasp,B2Br6,-1.8513866925,0.0577412112499999 -Bi2Br2_164_2433.vasp,Bi2Br2,-0.792805185,0.0237065908333325 -Er2S2Br2_59_5567.vasp,Er2S2Br2,-3.536307775,0.0344953533333338 -Cr2H8_4_4406.vasp,Cr2H8,-3.158211596,1.7425927260000005 -Zr2I6_189_21597.vasp,Zr2I6,-1.4959983125,0.2540728374999998 -Y3B2H2_187_20787.vasp,Y3B2H2,-4.500284394285715,0.420228787857133 -Sc1Nb1Br2N1_1_15957.vasp,Sc1Nb1Br2N1,-3.963758986,0.6207197942222097 -Te6Mo2P2_12_18655.vasp,Te6Mo2P2,-2.1663078540000003,0.2861215019999999 -Na1P2Pd1S6_5_11924.vasp,Na1P2Pd1S6,-2.838514153,0.0991936474687469 -Sn2P2C2S6F6_7_16806.vasp,Sn2P2C2S6F6,-3.1616062544444445,0.3652753677777745 -Hf4B3Cl2_164_7761.vasp,Hf4B3Cl2,-5.6315899400000005,-0.1649715105555607 -Cu3P1S4_156_5379.vasp,Cu3P1S4,-1.58695392875,0.4623998287499999 -Mn2In2O5_164_11121.vasp,Mn2In2O5,-3.7788237177777777,0.1733572887092875 -Mn1Ge1Se1S1Cl2_1_10748.vasp,Mn1Ge1Se1S1Cl2,-1.992360825,0.3459531837326389 -Ge2C2I2_59_6763.vasp,Ge2C2I2,-2.745051196666666,0.9319658391666628 -Zr2Sb2O6_162_21662.vasp,Zr2Sb2O6,-5.58389796,0.2972968199999987 -Ba1Ni4O8_162_1847.vasp,Ba1Ni4O8,-2.585281828461538,0.0568918140384547 -Ge2F6_1_6774.vasp,Ge2F6,-2.88157188625,0.0928037637499996 -La2S4O14_7_9610.vasp,La2S4O14,-4.8663565345,0.0790590247499956 -Mn1Al2Te4_164_10630.vasp,Mn1Al2Te4,-2.020967475714285,0.0895249374350609 -Zr4C3Cl2_164_21811.vasp,Zr4C3Cl2,-5.836843118888889,-0.2465103288888941 -Cu1Sb3Se6_143_4972.vasp,Cu1Sb3Se6,-1.770564213,0.3117753225555514 -P8C4_26_14147.vasp,P8C4,-5.115128290833334,0.2876441691666618 -Si1Ni4S5Br2_1_16353.vasp,Si1Ni4S5Br2,-1.5521574341666666,0.2081528595833296 -Mn2P2Se4I2_26_11202.vasp,Mn2P2Se4I2,-2.028651722,0.1784102191222188 -Cd1Hg1S2Br1Cl1_1_3362.vasp,Cd1Hg1S2Br1Cl1,-0.4395030933333333,0.1510050506597205 -Al1Mo2C2Br2N1O1_1_685.vasp,Al1Mo2C2Br2N1O1,-4.162435121111112,0.8453441410185059 -Ta1Bi2_187_17515.vasp,Ta1Bi2,-3.0442342766666664,0.2296373166666643 -Na1Sn1S1Cl3_1_11935.vasp,Na1Sn1S1Cl3,-1.7978143683333334,0.1108126807291643 -Cr3N2F2_187_4564.vasp,Cr3N2F2,-4.44511481,-0.0695244117460391 -Li1In1As2S6_5_9726.vasp,Li1In1As2S6,-2.735487517,0.4566706134374971 -Ni2Bi1S2_187_13461.vasp,Ni2Bi1S2,-1.220819422,-0.1141165546111118 -In2Sn2Te2_164_8609.vasp,In2Sn2Te2,-1.2875795983333334,-1.2333814133333334 -Ca4Se4O12_14_3238.vasp,Ca4Se4O12,-4.161423961500001,1.8285760385 -Cu2Se1S1I1Cl1_1_5293.vasp,Cu2Se1S1I1Cl1,-0.7081578666666667,0.1783363189384895 -Rh1C3_187_15146.vasp,Rh1C3,-5.5473628025,1.310367494999999 -Nb4Pd4S8_53_13126.vasp,Nb4Pd4S8,-3.678234264375,0.2867491615301704 -K2F2_129_9097.vasp,K2F2,-1.910222,-0.4327747350000002 -Ba2Ti1O4_25_2071.vasp,Ba2Ti1O4,-5.632825967142857,0.152519613571429 -Sc1F2_187_15934.vasp,Sc1F2,-3.85841779,-0.0115482894444478 -K8Ge4Se16_14_9552.vasp,K8Ge4Se16,-1.953074570357143,0.0574424189285711 -Mo3W1S8_25_11731.vasp,Mo3W1S8,-3.9424014508333336,-0.0122945208333336 -Mo2Cl4O4_26_11599.vasp,Mo2Cl4O4,-3.422469176,-0.001124388 -Ge1Ir1Se1S1I2_1_6677.vasp,Ge1Ir1Se1S1I2,-2.000335835,-0.0303127843750001 -Zr1Zn1Pd2O8_12_21495.vasp,Zr1Zn1Pd2O8,-3.5240230741666667,0.3718182696180498 -Cu2Te4Cl2_4_5351.vasp,Cu2Te4Cl2,-0.7661812125,0.126070405 -Na2Hg4S6Cl6O2_31_12156.vasp,Na2Hg4S6Cl6O2,-1.053912003,0.4033547611249977 -Al1H2O2_164_669.vasp,Al1H2O2,-4.408674102,0.3103768335000001 -Sr2Au1Br2O2_38_17123.vasp,Sr2Au1Br2O2,-2.404528312857143,0.2101462777550974 -Cr2Br2Cl2_7_4330.vasp,Cr2Br2Cl2,-1.68534234,0.2440199044444426 -Ba1P2F12_2_1850.vasp,Ba1P2F12,-3.3049595506666667,-0.0486490733333369 -Fe1H4C4Br2N2_47_5698.vasp,Fe1H4C4Br2N2,-4.85780673,0.0570507646153692 -Mg3Pb1_25_10559.vasp,Mg3Pb1,-0.016584695,-0.1702071 -Ta12I28_53_17499.vasp,Ta12I28,-2.40978874375,0.088013751 -Cr3B2S2_187_4545.vasp,Cr3B2S2,-4.117463,0.063904892499996 -Cr1Cu1Te6P2_5_4164.vasp,Cr1Cu1Te6P2,-1.753928543,0.4085347988333333 -Te2_51_18541.vasp,Te2,-0.917520375,0.6542653816666666 -Zn1Sn4O8_1_21016.vasp,Zn1Sn4O8,-3.7243594792307695,0.2180283151923011 -Cr2Cu2S8_51_4371.vasp,Cr2Cu2S8,-2.22388469,0.3707289898611088 -Sc1Ag1P2O6_149_15888.vasp,Sc1Ag1P2O6,-4.9853978240000005,0.3530412293090843 -Bi10_6_2296.vasp,Bi10,-1.047365063,-0.580497068 -Ba4Ni2Br2O6_129_2165.vasp,Ba4Ni2Br2O6,-3.243558596428571,-0.1136959659151847 -V2Sb2Se6_157_20174.vasp,V2Sb2Se6,-2.582100061,0.2449732514999982 -Gd2C1Cl2_164_6604.vasp,Gd2C1Cl2,-4.084294448,0.0436776092592561 -Na8Sn8H16O20_4_12454.vasp,Na8Sn8H16O20,-3.825118821153846,-0.2637765073717966 -Mn1Ge1Se1Cl2_156_10747.vasp,Mn1Ge1Se1Cl2,-2.076464376,0.1611345000000004 -Zr1Sb1As1_156_21419.vasp,Zr1Sb1As1,-3.2434432933333333,0.7191020816666632 -Cd1Pd1S1Br1F1_1_3399.vasp,Cd1Pd1S1Br1F1,-0.8092033259999999,0.3855039752500003 -Ni2W2Br2O8_129_13684.vasp,Ni2W2Br2O8,-3.892322202857143,-0.0206970867857179 -Sn2S6_11_16846.vasp,Sn2S6,-2.3914466225,0.2228758773437498 -Tm2Cu2Pb2Se6_51_19677.vasp,Tm2Cu2Pb2Se6,-2.268845036666667,0.190107159583333 -Te6Mo2As2_2_18654.vasp,Te6Mo2As2,-2.011705417,0.1860932951999979 -Zr1Ge1Te1Se3_1_21302.vasp,Zr1Ge1Te1Se3,-2.88756146,0.1956671524305498 -Zr1Sc1Br2N1O1_1_21429.vasp,Zr1Sc1Br2N1O1,-4.657022465,0.4409905908333331 -Ag2B2S2Cl2_31_182.vasp,Ag2B2S2Cl2,-1.61928320125,0.9233375939583331 -Al2O3_150_918.vasp,Al2O3,-5.384331642,0.7392031959999992 -Ge2As2H6C2O6_7_6734.vasp,Ge2As2H6C2O6,-4.530791056666667,0.0776903394444412 -Hf1Mn1F6_1_7212.vasp,Hf1Mn1F6,-3.978367835,0.0955739162499997 -Al2Ni2O5_187_900.vasp,Al2Ni2O5,-4.104765991111112,0.1086861833333281 -Be1F2_115_2220.vasp,Be1F2,-4.175236003333334,0.1310914666666667 -Te2Mo1_187_18403.vasp,Te2Mo1,-2.168824856666667,-0.0579306066666669 -As2P4O12F2_4_1246.vasp,As2P4O12F2,-4.138161462,0.8946132057499914 -Li1In1Sb2S6_5_9735.vasp,Li1In1Sb2S6,-2.496686781,0.3377204451874973 -V1As2_164_19769.vasp,V1As2,-3.325119023333333,0.3680351199999969 -Na4Co2Cl8_11_12382.vasp,Na4Co2Cl8,-1.4909439914285714,0.1247868807142857 -Ag4Cl4O8_54_511.vasp,Ag4Cl4O8,-1.37087312375,0.372368238125 -Sb1S2F2_164_15492.vasp,Sb1S2F2,-1.866006298,1.0486291498124978 -Dy2Cl6_162_5522.vasp,Dy2Cl6,-2.872697395,0.0494956487500002 -Hg1H4C2N4Cl2_1_7873.vasp,Hg1H4C2N4Cl2,-4.372438154615384,-0.0352730841666708 -W3N2F2_187_20562.vasp,W3N2F2,-5.055972732857143,0.1649104436904714 -Mn2Se2_47_11286.vasp,Mn2Se2,-2.1567773525,0.1316762987931015 -Ag1H4C12S2_6_74.vasp,Ag1H4C12S2,-5.270158603157895,0.8578199015295987 -Ti1O2_191_18823.vasp,Ti1O2,-4.31275118,2.951103345 -Na4O12_13_12399.vasp,Na4O12,-3.073578758125,-0.3744522553125 -Co1C6I2N2F4_25_3720.vasp,Co1C6I2N2F4,-4.537918543333333,0.3108250162777689 -Cs2Hg4S8Br6_31_4732.vasp,Cs2Hg4S8Br6,-0.7004590989999999,0.2381628953125002 -Al2Cl6_189_796.vasp,Al2Cl6,-2.02751952125,0.2569902325000002 -Na2Nb2Cu4S8_3_12226.vasp,Na2Nb2Cu4S8,-2.65962108375,0.1301837512500001 -Mn1Sn1Br2N1O1_1_10889.vasp,Mn1Sn1Br2N1O1,-2.63657343,0.4461652987499945 -Nb2S1Br1N1O2F1_1_12831.vasp,Nb2S1Br1N1O2F1,-5.14244640125,0.0592062464843708 -Al1Cu1P2O6_149_641.vasp,Al1Cu1P2O6,-4.792377448,0.485619828899993 -Mn2Mo1Se4Br3_1_11134.vasp,Mn2Mo1Se4Br3,-1.81222264,0.2536540502083303 -V2C1F2_164_20017.vasp,V2C1F2,-4.584203638,-0.1380892818055605 -W1O2_164_20442.vasp,W1O2,-5.80534092,0.4623588486394494 -Ga1Mo1Ir1Se4_1_6210.vasp,Ga1Mo1Ir1Se4,-2.538595307142857,0.2035868033791121 -V1Sb2_187_19925.vasp,V1Sb2,-2.4279573566666666,0.4551504486111084 -Te2Rh2Cl2_11_18498.vasp,Te2Rh2Cl2,-1.7689226133333331,0.1082469966666666 -Ti4Se4Br4_31_19161.vasp,Ti4Se4Br4,-3.7001463375,-0.572661819583336 -Te1Mo1O5_6_18299.vasp,Te1Mo1O5,-4.34962633,0.195314380357138 -Hg2Au2Se2Cl2_26_7931.vasp,Hg2Au2Se2Cl2,0.1822782125,0.4759637975 -Sn2S2_164_16842.vasp,Sn2S2,-2.32325352,0.1405767012499996 -W2Cl8_1_20489.vasp,W2Cl8,-1.91081214,0.3339205099999998 -B2Se2_164_1710.vasp,B2Se2,-4.1409873725,0.0339974100000004 -Bi5As1Se1S2Br6_1_2661.vasp,Bi5As1Se1S2Br6,-1.4883401086666666,0.0840565886666636 -Ni2As1S2_187_13442.vasp,Ni2As1S2,-1.686844782,0.2609127828333319 -Li2V2Cu4S12_1_10115.vasp,Li2V2Cu4S12,-2.274324738,0.2876735943229116 -Ba2Cd1In1Cu1S5_99_1943.vasp,Ba2Cd1In1Cu1S5,-1.90326298,0.4198319127500003 -Sn3As4_5_16909.vasp,Sn3As4,-2.2592694085714284,0.2256736878571429 -In1Ag1P2O6_149_8179.vasp,In1Ag1P2O6,-4.317558384,0.2951525263928481 -Ca2N4_1_3075.vasp,Ca2N4,-4.824319863333334,0.2899097433333324 -Zn1Br2_164_20903.vasp,Zn1Br2,-0.0802292933333333,0.1125101904166667 -Mn2Bi2S4I2_10_11012.vasp,Mn2Bi2S4I2,-1.910382727,0.1879187438333329 -V2Sn2Se6_162_20198.vasp,V2Sn2Se6,-2.5065966,0.2050927765000002 -Pb2C2Cl2_59_14229.vasp,Pb2C2Cl2,-2.014919205,1.69959981583333 -Hf1Rh1Se2Br1_1_7273.vasp,Hf1Rh1Se2Br1,-3.10181885,0.4559064232499962 -P2Au2S4_26_13956.vasp,P2Au2S4,-2.02987012875,0.2486983474999999 -Cr2Cu2P4S12_1_4368.vasp,Cr2Cu2P4S12,-2.8539082355,0.1424751542864524 -Li1Co1As2S6_149_9671.vasp,Li1Co1As2S6,-2.813734345,0.4098976769605199 -Pd4S4I3Cl1_8_14522.vasp,Pd4S4I3Cl1,-1.2437564225,0.1421489550520832 -Cd2Se2I2_59_3571.vasp,Cd2Se2I2,0.0418929266666666,0.0209807758333319 -Bi4O6_4_2623.vasp,Bi4O6,-3.58105296,0.2769412679999998 -Fe2Mo2S8Br2_129_5875.vasp,Fe2Mo2S8Br2,-2.1298587014285717,0.4343459488690434 -Hg1Pb2I2O2_12_7897.vasp,Hg1Pb2I2O2,-1.5071294371428572,0.0953939628571429 -Li2Sb2P8O24_4_10064.vasp,Li2Sb2P8O24,-5.310620198333334,0.1023161683611109 -Tl2Te2_65_19552.vasp,Tl2Te2,-0.45488555,0.49777383125 -B3H2W4_164_1730.vasp,B3H2W4,-5.438298642222223,0.6534313922222159 -Ba2Pt1_164_2048.vasp,Ba2Pt1,-0.8712468266666668,0.1865333383333333 -Pt3Br2O5_1_14688.vasp,Pt3Br2O5,-2.244993844,0.5475349654999992 -Nb2S4I2_11_12854.vasp,Nb2S4I2,-3.39021369875,0.2383033068750002 -Hg1Pb2S2Cl2_12_7900.vasp,Hg1Pb2S2Cl2,-1.280997502857143,-0.3545731035714301 -H4Au4O4F4_2_7061.vasp,H4Au4O4F4,-1.246843905625,0.929250705625 -Na1Mo2S2Cl6_47_11903.vasp,Na1Mo2S2Cl6,-1.969227779090909,0.2690085971590864 -Pt2O2F2_59_14641.vasp,Pt2O2F2,-2.2469523766666666,0.1751058341666649 -Mn2Au2Se3S1_1_10990.vasp,Mn2Au2Se3S1,-1.39508035625,0.9015760899999998 -Sc3H2C2O2_187_16203.vasp,Sc3H2C2O2,-5.256164505555556,0.470490865092587 -Os2Br2O2_59_13831.vasp,Os2Br2O2,-3.223932721666667,0.4838523191666628 -Mn1Pb1S1I1Cl1_1_10840.vasp,Mn1Pb1S1I1Cl1,-1.657080224,0.2147137133333335 -Li2Ag2F8_30_9824.vasp,Li2Ag2F8,-1.64743953,-0.2602107850000013 -Mn2As2S4I2_26_10976.vasp,Mn2As2S4I2,-2.245527667,0.3819563418333318 -V2I4_11_20098.vasp,V2I4,-1.1475664816666666,-0.0441204361111111 -Mn1Pb1Cl2_1_10839.vasp,Mn1Pb1Cl2,-1.4373716075,0.2585885894396551 -Hf2S2I1Cl1_25_7570.vasp,Hf2S2I1Cl1,-4.206764406666667,0.0002349409374908 -Sr2C2S6F2_59_17163.vasp,Sr2C2S6F2,-3.508984588333333,0.385792046406241 -Cu1Bi1P2S6_143_4849.vasp,Cu1Bi1P2S6,-2.731622584,0.0772973715364524 -Mn2In2Se5_164_11127.vasp,Mn2In2Se5,-2.0865055644444443,0.0372394247317987 -Na2Mg2Cl6_162_12203.vasp,Na2Mg2Cl6,-1.936993044,0.1338786418333331 -Ta1Ga1Te2_1_17547.vasp,Ta1Ga1Te2,-2.669687245,0.629637689871791 -Na1W2Cl6O2_47_11952.vasp,Na1W2Cl6O2,-3.230872263636364,0.0427125781818182 -P4H8Pb2O8_13_14082.vasp,P4H8Pb2O8,-4.337695230909091,0.0465963458998065 -Ti1Te1S1_156_18855.vasp,Ti1Te1S1,-4.194855406666666,-0.0322750789814847 -Ta1I4_123_17559.vasp,Ta1I4,-1.270747074,0.4184470942187501 -Hg2Te2H4O8_31_8030.vasp,Hg2Te2H4O8,-3.12280961625,0.0749180631914537 -Fe1H4Br2N6_47_5689.vasp,Fe1H4Br2N6,-4.097996694615384,-0.0313524458653915 -Cr2S4_11_4472.vasp,Cr2S4,-3.363648515,0.0999646916666665 -V13Te26_2_19746.vasp,V13Te26,-2.2694071425641025,0.0978339152136751 -Tc1F2_164_18219.vasp,Tc1F2,-3.6601912566666654,0.5710548708333274 -Zn1O2F2_164_20984.vasp,Zn1O2F2,-1.416318286,0.8845745390000003 -Mn2Te2O8_31_11301.vasp,Mn2Te2O8,-3.8839345841666666,0.3034530456249996 -Ca2Ag2_191_2920.vasp,Ca2Ag2,0.6733155025,0.260672023125 -Cr2Se2_25_4502.vasp,Cr2Se2,-2.731642005,0.4339595175000001 -V2I10_51_20089.vasp,V2I10,-0.3964774491666666,0.1772524031249994 -Sn2Sb4S8_11_16872.vasp,Sn2Sb4S8,-2.6119948392857144,0.0948088810714264 -V4Se6_2_20369.vasp,V4Se6,-3.235824218,0.0818043544999973 -Tl2Sb2_129_19522.vasp,Tl2Sb2,-0.6659404175,0.589530651875 -Li2Nb6Cl18_2_10017.vasp,Li2Nb6Cl18,-3.030805023846154,0.0654911442307635 -P2Pd1Au1S6_1_14018.vasp,P2Pd1Au1S6,-2.50681025,0.1487884905740677 -V4B3H2O2_164_20302.vasp,V4B3H2O2,-4.867445446363636,0.1882422440909009 -In1Pt2_38_8319.vasp,In1Pt2,-1.0507613866666663,0.8700053838888873 -Nb1S1O1_156_12559.vasp,Nb1S1O1,-5.685103689999999,0.2863441156250013 -Zn4Sn4O8_2_21229.vasp,Zn4Sn4O8,-2.791677976875,0.20833894125 -Cr2As2S6_162_4310.vasp,Cr2As2S6,-3.071753563,0.2103743483749971 -K2P2Pd2_129_9291.vasp,K2P2Pd2,-1.5929087583333337,0.163354397129628 -Mo2C1F2_164_11582.vasp,Mo2C1F2,-3.84797086,0.2254828151666614 -Li1In1Sb2Te6_5_9737.vasp,Li1In1Sb2Te6,-1.46555629,0.3611641581666652 -Mn2Se1S1Br2_25_11272.vasp,Mn2Se1S1Br2,-1.9651550183333333,0.0906853561111082 -K2Pt2N2Cl6_51_9309.vasp,K2Pt2N2Cl6,-1.5074358808333337,0.680787202916662 -Al2S2Br2_59_934.vasp,Al2S2Br2,-2.7744349033333333,0.0093376250000001 -Ni2Te2_187_13668.vasp,Ni2Te2,-0.0915975525,0.4714793724999995 -Zr1Ni1Ru1I1N2F3_1_21379.vasp,Zr1Ni1Ru1I1N2F3,-3.54846413,0.6641811897916567 -In1Pb1S2Br2_6_8302.vasp,In1Pb1S2Br2,-1.6263437616666667,0.240708802864581 -Mg1Al2H8_164_10330.vasp,Mg1Al2H8,-2.886851488181818,0.3217263554545425 -Mn2Te4As2Br2_10_11312.vasp,Mn2Te4As2Br2,-1.6660550310000002,0.2194042767499961 -P4Cl12_14_14078.vasp,P4Cl12,-1.739242814375,0.0520220781249984 -Na2Sb2P4S12_4_12295.vasp,Na2Sb2P4S12,-2.9880459175,0.1408501927499998 -V3S2N2_187_20288.vasp,V3S2N2,-5.1358996957142855,0.0156986528571385 -Na1Ni1P2O6_149_11913.vasp,Na1Ni1P2O6,-4.223009809,0.7576853842499955 -Ga4As4_2_6541.vasp,Ga4As4,-0.20690940375,1.4926481212499998 -Na2Co2Bi2_129_12059.vasp,Na2Co2Bi2,-0.8599319316666666,-0.0630068883333339 -Ru1F2_164_15269.vasp,Ru1F2,-2.513796473333333,0.2380940216666641 -Si2Ag2S6_51_16381.vasp,Si2Ag2S6,-2.567817355,0.1728100999999977 -Ti3H2S2N2_38_19088.vasp,Ti3H2S2N2,-5.837012854444445,-0.0440341929861215 -Ni1H3_187_13329.vasp,Ni1H3,-1.56246193,2.0575956900000003 -Er2Cl2O2_164_5551.vasp,Er2Cl2O2,-5.054800141666667,0.0282781416666662 -Cr1Cu1As2Se6_5_4149.vasp,Cr1Cu1As2Se6,-2.0919199930000003,0.2135240140999975 -K4Li4H8W4O20_29_9472.vasp,K4Li4H8W4O20,-4.667678796,0.0936067382500005 -Sb2Cl10_51_15563.vasp,Sb2Cl10,-0.8258239233333334,0.2884402541666665 -Bi2S2O1_1_2515.vasp,Bi2S2O1,-2.777633982,-0.5226879746666688 -Ag1C1N1O1_25_40.vasp,Ag1C1N1O1,-3.8537131475,0.7442472211458266 -K4Al4Te8_5_9408.vasp,K4Al4Te8,-1.65459706875,0.142257324375 -Na2Cd4Te2Br6O6_31_12043.vasp,Na2Cd4Te2Br6O6,-1.4569688295,0.3582535145000027 -Mo2Cl2O4_8_11595.vasp,Mo2Cl2O4,-4.03377766125,0.08906649953125 -Li2Nb2F12_4_10013.vasp,Li2Nb2F12,-4.01405352625,-0.0213565562499997 -Sb2Os2S6_162_15619.vasp,Sb2Os2S6,-3.217745645,0.4421637377999934 -Ge2S2F2_59_6824.vasp,Ge2S2F2,-2.844963228333333,0.3061423730208337 -Na2Cd4Te2I6O6_31_12045.vasp,Na2Cd4Te2I6O6,-1.353314959,0.2447020174375007 -Cr2Fe1Te4_164_4386.vasp,Cr2Fe1Te4,-1.7739186471428572,0.2053806714285674 -Hf2P2O6_12_7553.vasp,Hf2P2O6,-6.313754012,0.5056694282000012 -Zn2Sb4S6Cl4_31_21159.vasp,Zn2Sb4S6Cl4,-1.8064258075,0.20214625425 -Si6N8_38_16535.vasp,Si6N8,-5.616229365714285,0.2029008828571434 -Ca1Bi2O5_1_2806.vasp,Ca1Bi2O5,-3.6372224425,0.3550551716015622 -Pd2Br2O2_59_14400.vasp,Pd2Br2O2,-1.564812005,0.2975447188888871 -Mn1Nb1Se1S1Br2_6_10811.vasp,Mn1Nb1Se1S1Br2,-2.9172029416666665,0.0624667435416593 -V2Cu2Sb4Te12_13_20053.vasp,V2Cu2Sb4Te12,-1.4413029425,0.3185167302777764 -C2F8_1_2748.vasp,C2F8,-3.283995596,0.03140286 -Ge2S2_31_6831.vasp,Ge2S2,-3.119197805,-0.8680499512500002 -Tl2Sb2S6_149_19520.vasp,Tl2Sb2S6,-2.059840789,0.2679140543749976 -Zr1Ti1Se4_10_21475.vasp,Zr1Ti1Se4,-4.162763091666666,0.1185542562500003 -Ca1O2F2_164_2863.vasp,Ca1O2F2,-2.508249256,1.1408652405000002 -Sc2H2F2_164_16081.vasp,Sc2H2F2,-3.876917293333333,-0.1307640780555585 -Nb8O18_85_13207.vasp,Nb8O18,-6.573889281538461,0.1325173547115358 -Mn3C2Cl2_187_11361.vasp,Mn3C2Cl2,-3.498051065714286,0.2076626557142812 -Al2Co2Te5_156_810.vasp,Al2Co2Te5,-1.832425327777778,0.3326075857076659 -Nb1Te2O1_8_12600.vasp,Nb1Te2O1,-4.0216806125,0.2432222907812504 -Na2Zn4H6S4O16_2_12340.vasp,Na2Zn4H6S4O16,-3.6620982515625,0.1181547471041644 -Cu2Cl4O12_4_5084.vasp,Cu2Cl4O12,-2.1193007911111112,0.281860107499998 -Cu4I4O4F4_1_5427.vasp,Cu4I4O4F4,-0.72262482375,0.5978913347500001 -Zn2Cr4S10_6_21066.vasp,Zn2Cr4S10,-2.424734336875,0.47089059175 -Ag2S1Br1Cl3_1_371.vasp,Ag2S1Br1Cl3,-0.3249325585714286,0.1976262439285703 -In2Co1Te4_164_8410.vasp,In2Co1Te4,-1.385732207142857,0.1103172219047606 -Sn1As2Se4_164_16602.vasp,Sn1As2Se4,-2.39395566,-0.0821439707142871 -Mn2Te4P2Br2_26_11321.vasp,Mn2Te4P2Br2,-1.7754391989999998,0.4444696601944408 -Sb1Se1F1_156_15499.vasp,Sb1Se1F1,-2.39773142,0.2986722255555534 -Cr2W2Se8_25_4540.vasp,Cr2W2Se8,-3.2525252908333333,-0.173552298333333 -Zr1Ge1S2I4_8_21301.vasp,Zr1Ge1S2I4,-1.965268775,0.2073863839062499 -Na2Zr1N2_164_12344.vasp,Na2Zr1N2,-4.48328864,0.1479109632222137 -Mg1Ga2S4_164_10363.vasp,Mg1Ga2S4,-2.931048385714285,0.0461304942857143 -Mo2S2_129_11667.vasp,Mo2S2,-3.4042864875,0.7626116537500005 -Na2Sn1O6_147_12304.vasp,Na2Sn1O6,-2.4992593377777776,1.1828626268055524 -Na2C2S6F2_1_12002.vasp,Na2C2S6F2,-3.125178725833333,0.2688776688541607 -Bi2F8_3_2459.vasp,Bi2F8,-2.159690507,0.1502143972500003 -P2Pb6_65_14017.vasp,P2Pb6,-0.8743880125,1.14936650660714 -Hf1Br1F2_1_7127.vasp,Hf1Br1F2,-3.7425915675,0.5229320464583302 -Sc2H2Cl2_164_16080.vasp,Sc2H2Cl2,-3.311575551666667,0.0358916616666662 -Sr2Bi2Br2O4_51_17143.vasp,Sr2Bi2Br2O4,-3.3343260720000005,0.1605801509999995 -S2N2_129_15382.vasp,S2N2,-3.505275205,0.5705425059375004 -Sr2Ag1Te2Br2_38_17113.vasp,Sr2Ag1Te2Br2,-1.1376407214285715,0.341021441190473 -Ti2Hg2_129_18952.vasp,Ti2Hg2,-1.648446475,0.3624225329310326 -Ga2Ni2S5_164_6406.vasp,Ga2Ni2S5,-2.2053536944444447,0.0523609214814791 -Cd1In1Ga1O4_156_3369.vasp,Cd1In1Ga1O4,-3.2693185,0.2666851973511885 -Fe3P2H16O16_10_6059.vasp,Fe3P2H16O16,-4.518128295405406,-0.040319813108113 -Mn3F8_2_11376.vasp,Mn3F8,-2.8243104545454547,-0.3532498009090932 -Y4B3_164_20808.vasp,Y4B3,-4.700727961428571,0.5543311389285657 -K6Ta4Cu6S16_13_9545.vasp,K6Ta4Cu6S16,-2.8942220990625,0.0759278506249998 -Pb2Se2_6_14296.vasp,Pb2Se2,-1.5373986475,0.4125654959374998 -Hg2Br2_129_7944.vasp,Hg2Br2,1.3482186475,0.5574850925 -Ca4Mo4As4O20_1_3227.vasp,Ca4Mo4As4O20,-4.8032209621875,0.2049392130208303 -Na2B2N2O2_31_11981.vasp,Na2B2N2O2,-4.90651489,0.7679384341666612 -K2I1_164_9201.vasp,K2I1,0.1412401733333333,-0.2164210999999997 -Be3Si1_99_2283.vasp,Be3Si1,-2.78668748,-0.3507818787499998 -Be10Co2_26_2208.vasp,Be10Co2,-2.72967287,-0.0132837975000021 -Te4H4O12_1_18587.vasp,Te4H4O12,-3.78964708,0.2288487677499993 -Hf4Se4I4_7_7817.vasp,Hf4Se4I4,-3.4083431291666666,0.0513202362499978 -Hf1Sb2_164_7292.vasp,Hf1Sb2,-3.5584872766666664,-0.8344850162499999 -Mn2Al2Ge2_129_10950.vasp,Mn2Al2Ge2,-2.3000412983333334,0.5918788899999998 -W2Cl2_164_20484.vasp,W2Cl2,-3.5663598075,0.4681632874999994 -Re4Sb8O26_2_15116.vasp,Re4Sb8O26,-4.975777568157895,-0.4124489565789515 -Ba2Au2_191_1915.vasp,Ba2Au2,0.082709195,0.37355304125 -Li4Sn4H24N12_14_10229.vasp,Li4Sn4H24N12,-4.273809253636364,0.0301666302272725 -Cs2Te2H6C2O6_4_4792.vasp,Cs2Te2H6C2O6,-3.751640273333333,0.4717248808888752 -Mo2Se2_164_11691.vasp,Mo2Se2,-2.90428116,0.722087935 -Ba1Ca1I4_10_1816.vasp,Ba1Ca1I4,-1.2673703216666663,0.141196274 -In1Au1Se2_1_8202.vasp,In1Au1Se2,-1.009965305,0.34386884 -Th1C2_123_18712.vasp,Th1C2,-6.38889675,0.9384733083333332 -Al2Ni2Te5_156_908.vasp,Al2Ni2Te5,-1.3369041288888888,0.2667475910515826 -Zn2Te3O8_5_21187.vasp,Zn2Te3O8,-3.127027326153846,0.1471358876923076 -Ga2S4_14_6453.vasp,Ga2S4,-2.49405111,0.3765275982291639 -Bi2Te3_156_2570.vasp,Bi2Te3,-1.304880132,0.2624738019999999 -Zr1Se1O1_156_21441.vasp,Zr1Se1O1,-5.34935289,0.287218102083334 -In2Ni4Se6_164_8505.vasp,In2Ni4Se6,-1.1521028416666663,-0.0450767425000014 -Tl2Br2_59_19381.vasp,Tl2Br2,-0.731640915,-0.1549286649999999 -K2Te4F18_2_9377.vasp,K2Te4F18,-2.28236470375,0.0541447600000002 -Pt2Se2Br2_59_14673.vasp,Pt2Se2Br2,-1.4806786666666667,-0.1614640650000001 -Nb1Mo2Se1S2I2_1_12535.vasp,Nb1Mo2Se1S2I2,-2.79999358625,0.2772495141666621 -Li2Co2Sb2_129_9867.vasp,Li2Co2Sb2,-1.97741032,0.0854665199999982 -Te1Mo1S1_156_18305.vasp,Te1Mo1S1,-2.737439173333333,0.2010672608333334 -Li2V4F18_2_10130.vasp,Li2V4F18,-3.3564315920833336,-0.1268097945833362 -Fe2H2O4_31_5853.vasp,Fe2H2O4,-3.58999607875,0.5285478224999998 -Sn6Sb2_191_16999.vasp,Sn6Sb2,-0.76414395,-0.8167814404166656 -W3O8_12_20568.vasp,W3O8,-5.86603567909091,0.3334997803339444 -Ti3C2S2F2_187_19075.vasp,Ti3C2S2F2,-5.398373304444444,0.4323763268749869 -Ge2As1S6_162_6727.vasp,Ge2As1S6,-2.93925473,0.2888328152430492 -Na1Mn1Se2_156_11896.vasp,Na1Mn1Se2,-1.8083246425,0.31953483 -Ge3Rh1_187_6917.vasp,Ge3Rh1,-2.285647835,0.4344180643750002 -Sr2Sb4O8_11_17312.vasp,Sr2Sb4O8,-4.383332201428571,0.072993178571429 -Tl2S4_1_19511.vasp,Tl2S4,-1.6724153599999998,0.2640953605208336 -Ga2Te5_12_6520.vasp,Ga2Te5,-1.5589529914285714,0.286124372857143 -Hg3B2S6_150_8051.vasp,Hg3B2S6,-1.9571400109090908,0.1706397152272704 -Zr2Te2S1_164_21708.vasp,Zr2Te2S1,-3.836947452,-0.0432911319999993 -Ni2As2Pt2_129_13448.vasp,Ni2As2Pt2,-1.3497600966666663,0.5223041426157377 -Hf1Ti1S1Br2N1_6_7331.vasp,Hf1Ti1S1Br2N1,-4.9021804216666665,0.154548061666663 -Ge1Pt1S2_1_6694.vasp,Ge1Pt1S2,-2.6813987375,0.4461571798437499 -Sn6N6_12_16990.vasp,Sn6N6,-3.5563752416666667,-2.0932116729166665 -Zr2Cl4O2_39_21551.vasp,Zr2Cl4O2,-4.34144541,0.1143845099999998 -V4S8_12_20364.vasp,V4S8,-3.486526566666667,0.2684322666666663 -Pt3I1Br1N3_8_14690.vasp,Pt3I1Br1N3,-2.44447469,0.7169402320312502 -Nb4I1O7_156_13090.vasp,Nb4I1O7,-6.134127278333334,0.2436292949652738 -Ti1Ni1S2I4_6_18812.vasp,Ti1Ni1S2I4,-1.50784791625,0.2192320351041646 -Hf1Cl2_164_7144.vasp,Hf1Cl2,-3.421340303333333,0.2538403108333302 -Ca1Sb4O8_6_2877.vasp,Ca1Sb4O8,-4.181157306153846,0.238964210641022 -Mn2Sb2S4I2_26_11242.vasp,Mn2Sb2S4I2,-2.096974048,0.3823315234999991 -Hf1Br1N1Cl1_6_7128.vasp,Hf1Br1N1Cl1,-4.0432839175,0.6754486471354134 -Sn6Bi6_12_16983.vasp,Sn6Bi6,-1.1324716083333333,-2.202749353333333 -Si6H2_164_16531.vasp,Si6H2,-3.99102716625,-0.5419754449999998 -Pr2Se6_129_14552.vasp,Pr2Se6,-3.2940285875,0.1593507727083332 -Hf2Ti2S8_28_7652.vasp,Hf2Ti2S8,-4.9682368025,0.3173030041666664 -In2Pd4S6_164_8530.vasp,In2Pd4S6,-1.98134169,0.2336781815476175 -Sr3Ni2Cl2O5_123_17391.vasp,Sr3Ni2Cl2O5,-3.2300380366666666,-0.284067726527784 -V4H8O8F8_14_20330.vasp,V4H8O8F8,-4.218187791428571,-0.2122712988988205 -B4N20_26_1757.vasp,B4N20,-5.92747262375,0.3626530387499946 -K2I6_4_9207.vasp,K2I6,-0.07834231,0.0972987375 -Cr2Sb2P4O16_11_4480.vasp,Cr2Sb2P4O16,-5.1863484712500005,0.1976898972222218 -Y2I4_11_20747.vasp,Y2I4,-2.3168610333333333,0.085901776111109 -Er6Cl7_2_5581.vasp,Er6Cl7,-2.5081820415384617,0.1868970411538431 -Mo2S2_164_11669.vasp,Mo2S2,-3.390337925,0.77656021625 -In1F2_164_8243.vasp,In1F2,-2.2070976166666667,0.3040044699999997 -Sn2P6_164_16829.vasp,Sn2P6,-3.1176756825,0.2960263215625001 -Sb1Te2Pd2_187_15516.vasp,Sb1Te2Pd2,-1.567019246,0.1633595552857127 -Tc1Se2_164_18222.vasp,Tc1Se2,-4.19348207,0.3547940008333334 -Mn2H4S2O8_7_11101.vasp,Mn2H4S2O8,-4.183907013125,0.2051057046130874 -Nb3B2Cl2_187_12943.vasp,Nb3B2Cl2,-5.322567412857143,0.1758879821428456 -Hf1Br1F1_156_7126.vasp,Hf1Br1F1,-3.73394868,0.4104066518055486 -Co1H4C2N6F2_6_3751.vasp,Co1H4C2N6F2,-4.55033689,0.4164223119722109 -Te2Os2_164_18429.vasp,Te2Os2,-2.95178643,0.17173079875 -Ru2Br2_164_15301.vasp,Ru2Br2,-1.53879175,0.8027822891666646 -Nb3N2Cl2_187_12985.vasp,Nb3N2Cl2,-5.70964513,0.0844978607823064 -Hf2I8_1_7526.vasp,Hf2I8,-1.720671251,0.0920580159999999 -Cd2Au2S2F2_26_3459.vasp,Cd2Au2S2F2,-0.49345199375,0.2449359678125 -Cs2Cd4Se2S6Cl6_31_4697.vasp,Cs2Cd4Se2S6Cl6,-1.0033955865,0.3475269819583327 -Hf3Ti1Te8_6_7743.vasp,Hf3Ti1Te8,-3.4559862108333337,0.2627604812499998 -Re2Te4_11_15091.vasp,Re2Te4,-3.3207605416666666,0.1995676483333337 -Ni4Te4P4_13_13770.vasp,Ni4Te4P4,-1.7087178200000002,0.33373770569444 -Mn1Sb1Se1N1Cl1_1_10862.vasp,Mn1Sb1Se1N1Cl1,-2.806148452,0.3277263917499978 -Fe6S8_11_6096.vasp,Fe6S8,-2.367058599285714,-0.4048531614285731 -Ge2Br2O2_59_6754.vasp,Ge2Br2O2,-2.973135245,0.2915669037500001 -W12Br24_127_20402.vasp,W12Br24,-2.5116209397222224,0.0735533097222216 -Sr10Ir2_26_17012.vasp,Sr10Ir2,0.01508424,0.2957845836666661 -Y4N2Cl6_12_20829.vasp,Y4N2Cl6,-4.773589035833333,0.0591899291666671 -Hf1Sb1Cl2O3_1_7285.vasp,Hf1Sb1Cl2O3,-4.4880806657142855,0.251952918124992 -Cu1Ge1S2I1Br1_6_4883.vasp,Cu1Ge1S2I1Br1,-1.3869608166666667,0.1527389795023102 -K2H6Pt1S6_147_9156.vasp,K2H6Pt1S6,-2.740017564,0.0479019303333334 -Sb2Cl6_31_15571.vasp,Sb2Cl6,-1.43668132625,0.0825604987499999 -Ta2Te4Pd4_51_17917.vasp,Ta2Te4Pd4,-2.658530995,0.1359438669047574 -Nb2N2F2_59_12770.vasp,Nb2N2F2,-6.174854378333333,0.1684268760999883 -Pd2Se2_164_14495.vasp,Pd2Se2,-1.1445654825,0.5822902299999999 -Ti3N2_187_19097.vasp,Ti3N2,-7.443149178,0.669130585749993 -Bi1Se2O6F1_1_2392.vasp,Bi1Se2O6F1,-3.2736728050000004,0.2765707313749964 -Na2Cd1H4S2O10_2_12017.vasp,Na2Cd1H4S2O10,-4.020415723157894,0.0522172213596419 -Co2I2N2_59_3923.vasp,Co2I2N2,-2.587493916666667,-0.1921513119444469 -Bi1Sb1S2I2_1_2380.vasp,Bi1Sb1S2I2,-1.6425952916666666,0.0907629229166648 -Co2Bi4S6Cl4_11_3873.vasp,Co2Bi4S6Cl4,-1.966350346875,0.2399766071354139 -In1Au3Br4O4_1_8204.vasp,In1Au3Br4O4,-1.2967744583333334,0.1214435249826372 -Na2Hg4Se2S6F6_31_12168.vasp,Na2Hg4Se2S6F6,-1.194285002,0.2027006945803552 -Te6As4O22_13_18648.vasp,Te6As4O22,-3.9454315659375,0.0793249262499995 -Cr2Te6_59_4534.vasp,Cr2Te6,-1.665967735,0.1842633083333336 -Au2Se1S1Br4_6_1538.vasp,Au2Se1S1Br4,-0.10641304125,0.3359610139843748 -Zr1Mn1Cl6_5_21320.vasp,Zr1Mn1Cl6,-2.3769313275,0.0587036249999983 -Cd1H10C12Br2N2_2_3316.vasp,Cd1H10C12Br2N2,-5.301725069259259,0.1132279090740637 -Zr2Br2N2_59_21520.vasp,Zr2Br2N2,-5.3765222816666665,0.0797396399999996 -Bi2Te2S1_156_2562.vasp,Bi2Te2S1,-1.7665239700000002,0.1368758319999996 -Al1Cu1Te6P2_149_650.vasp,Al1Cu1Te6P2,-1.770894406,0.1175214298148108 -Mo3H2C2O2_187_11707.vasp,Mo3H2C2O2,-4.817769326666667,0.350149325138879 -Mn2H4Se2O8_7_11103.vasp,Mn2H4Se2O8,-3.946891580625,0.1862382828645834 -Ga2Se3_189_6482.vasp,Ga2Se3,-2.074837602,0.3821542620000002 -Hg4Cl8_115_8072.vasp,Hg4Cl8,0.3025345125,0.1722963358333333 -Bi2F6_162_2455.vasp,Bi2F6,-2.45738055875,0.5379253068749996 -Li2Br1_164_9844.vasp,Li2Br1,-1.6458412966666665,0.416713065555554 -Ge2As2O6_7_6738.vasp,Ge2As2O6,-4.352968594,0.2869688978333298 -Cd2Cl2_2_3486.vasp,Cd2Cl2,0.41602298,0.01611919125 -Zr2Te2_187_21710.vasp,Zr2Te2,-2.866884115,0.0952864199999998 -Pb1S2_115_14200.vasp,Pb1S2,-1.8866287066666667,-0.5652448102083344 -Hf2O2_164_7548.vasp,Hf2O2,-6.792433025,0.5143687506818111 -W1Br2_187_20423.vasp,W1Br2,-1.4984899266666665,1.0866843227777776 -Pd2I2N2_59_14429.vasp,Pd2I2N2,-1.7578010166666669,0.5070448145833306 -Pd2F6_191_14425.vasp,Pd2F6,-0.827133215,0.5439505487499999 -Ti1V2Te4_12_18868.vasp,Ti1V2Te4,-2.98975003,0.1519074252040729 -Bi1O2_191_2350.vasp,Bi1O2,-1.767365173333333,2.000185672604164 -Zn2Cr2F10_13_21062.vasp,Zn2Cr2F10,-2.342409785,0.082598387499998 -Al2Fe2Te5_187_838.vasp,Al2Fe2Te5,-1.831142995555556,0.0214265456018502 -Ta3Se1I7_156_17991.vasp,Ta3Se1I7,-2.465606673636364,0.0745399872514177 -Ga1Pd5Br2_123_6239.vasp,Ga1Pd5Br2,-1.02524570375,0.0606231652314803 -Pb4Cl2O4_11_14310.vasp,Pb4Cl2O4,-2.751584895,0.1733042137500005 -Cd6Se8O24_14_3640.vasp,Cd6Se8O24,-2.891192065,0.1563266297368366 -Hf2Ir1Pd1Se6_1_7527.vasp,Hf2Ir1Pd1Se6,-3.452400479,0.2484042768915396 -Cu4Se4O12_14_5475.vasp,Cu4Se4O12,-2.872851852,0.2076025801249967 -Na2Cd4Se2S6I6_31_12042.vasp,Na2Cd4Se2S6I6,-0.73935231,0.1151281176249979 -Hg2S10F4_7_7991.vasp,Hg2S10F4,-1.552627496875,0.3079307727604157 -Be2Bi1_115_2243.vasp,Be2Bi1,-1.0480838,0.6083107216666654 -B3C10N3_25_1727.vasp,B3C10N3,-7.370580084375,0.6282017003125011 -Tl1S2_115_19333.vasp,Tl1S2,-1.2627932233333332,0.6737174971875002 -Ti1Se2_187_18852.vasp,Ti1Se2,-4.256547636666666,0.2159342183333334 -Li2Mn1F6_164_9986.vasp,Li2Mn1F6,-2.927850213333333,0.1607032411111109 -V1S2_115_19917.vasp,V1S2,-3.4065301433333333,0.34842869 -Ta4B3S2F2_164_18007.vasp,Ta4B3S2F2,-5.679295416363637,0.7088335685454432 -Ca2Au1Se2I2_38_2941.vasp,Ca2Au1Se2I2,-1.199491492857143,0.2249232098571399 -In1P2S2_1_8300.vasp,In1P2S2,-2.830643224,0.3583689819583309 -C2_191_2759.vasp,C2,-8.068384815,0.047940595 -Rb1Hf1Mg6O7_99_14737.vasp,Rb1Hf1Mg6O7,-4.250622135333334,-0.2314017285757668 -Mn2H8C4O12_13_11106.vasp,Mn2H8C4O12,-5.046559944615385,0.0873677110897312 -Li2Mo1P2O8_147_10004.vasp,Li2Mo1P2O8,-4.970323183076923,0.4376416766153799 -Ta2F6_162_17723.vasp,Ta2F6,-4.2563501275,0.5626984207499954 -Tl6B6S12_164_19641.vasp,Tl6B6S12,-3.243526130833333,0.090014062916667 -Ga1Pt2I1Cl1O3_8_6245.vasp,Ga1Pt2I1Cl1O3,-2.45929442625,0.1526053779687443 -Nb2Pt1Se6_12_12823.vasp,Nb2Pt1Se6,-3.5163376088888887,0.0990384700000004 -Os2I2_164_13852.vasp,Os2I2,-1.75944151,0.9941469609375 -Cr2Si2S6_162_4508.vasp,Cr2Si2S6,-3.549576396,0.1345710931818109 -Hg2Ge1O4_21_7960.vasp,Hg2Ge1O4,-2.27112764,0.2276055478571432 -Sn2P2O6_7_16818.vasp,Sn2P2O6,-4.535227194,0.3924323641999951 -Zr3C1I2N1_8_21753.vasp,Zr3C1I2N1,-4.630911344285714,0.3900960344557727 -Sr1Mn1Ag1Br2O2_1_17063.vasp,Sr1Mn1Ag1Br2O2,-2.350716378571428,0.3329440086666643 -Cu2Se4I2_4_5310.vasp,Cu2Se4I2,-0.81733244875,0.084679768125 -Ru2Cl2O2_59_15306.vasp,Ru2Cl2O2,-3.149589165,0.3848200611111083 -Al2Te2Br2_59_997.vasp,Al2Te2Br2,-1.8356097933333333,0.1466292816666667 -Ta3I8_156_17965.vasp,Ta3I8,-2.14786661,0.1294063411505668 -Sb5O7_174_15844.vasp,Sb5O7,-3.9395558675,0.2631033945833317 -Mn1Ge1S2I2_6_10743.vasp,Mn1Ge1S2I2,-1.9274744366666667,0.3623605304166666 -Cd1H4C6F2_10_3355.vasp,Cd1H4C6F2,-4.635431818461539,0.4844223799999911 -K1Sn1Se2_156_8941.vasp,K1Sn1Se2,-1.421380305,0.2196981312500003 -Ca3Ni2S5Cl2_123_3195.vasp,Ca3Ni2S5Cl2,-2.1915905375,0.0510026723437452 -Mg1Sb4O8_1_10401.vasp,Mg1Sb4O8,-4.168082882307693,0.2245545384615339 -Ir1Rh1S2I2_25_8751.vasp,Ir1Rh1S2I2,-2.077581998333333,0.0839509227777726 -Fe2Se4F2_11_5984.vasp,Fe2Se4F2,-1.7890474325,0.3544602863888866 -Sc2Te2I2_59_16176.vasp,Sc2Te2I2,-2.37048287,0.05934553222222 -V2Te4_127_20219.vasp,V2Te4,-1.5277739933333334,0.8394670644444442 -Sn2C4Cl4_51_16756.vasp,Sn2C4Cl4,-3.5913906140000003,0.6023355250000001 -Hf2Ag2_129_7425.vasp,Hf2Ag2,-2.3189637375,0.2189557475000003 -Ag2F4_14_259.vasp,Ag2F4,-0.6539482966666667,0.1814882049999999 -Fe1C2N4Cl2F4_47_5642.vasp,Fe1C2N4Cl2F4,-3.256631465384616,0.6476689157171351 -Ga2Si2S2_164_6488.vasp,Ga2Si2S2,-3.273446305,-0.3729122916666697 -K2Cd4S2Br6O6_31_9046.vasp,K2Cd4S2Br6O6,-1.829653606,0.1107220740937499 -Ca2Co4Te6Cl4O16_4_2991.vasp,Ca2Co4Te6Cl4O16,-3.412000776875,-0.082463194375 -Ta3Cl8_156_17955.vasp,Ta3Cl8,-3.3642162800000004,0.1305849554545372 -Ti4H2C3O2_164_19135.vasp,Ti4H2C3O2,-6.853484491818182,-0.1165682992929344 -Zn2Se2_129_21166.vasp,Zn2Se2,-0.4505694575,0.24943389625 -Cr2Si2Se6_162_4509.vasp,Cr2Si2Se6,-2.780868404,0.22272482773863 -Ag1N1O2_25_87.vasp,Ag1N1O2,-3.2157173225,0.1056131439583308 -Na2H4N2_67_12111.vasp,Na2H4N2,-3.78154758375,0.0590863506249998 -Cd2P2O6_147_3526.vasp,Cd2P2O6,-3.879878346,0.3072031113928526 -Al13Sb2_1_587.vasp,Al13Sb2,-2.14121353,0.0494078843333316 -Te2Ir2_187_18397.vasp,Te2Ir2,-2.0686514725,1.0667800225 -Ni1Te2_115_13437.vasp,Ni1Te2,-0.4931626333333334,0.2463292866666666 -Cd4Mo2O8_13_3633.vasp,Cd4Mo2O8,-3.02031322,0.0855457464285716 -Au4S2_4_1581.vasp,Au4S2,-0.212048745,0.113744665 -Hg8C4N8Cl8_14_8105.vasp,Hg8C4N8Cl8,-2.337349670357143,0.1486068566666629 -Mn6Br1Cl1O8_1_11465.vasp,Mn6Br1Cl1O8,-3.870681185,-0.0412758869270857 -Rb2C6S6F6_1_14802.vasp,Rb2C6S6F6,-3.7170117475,0.2101255628125001 -Sc1Ge1I1Cl1O2_1_15936.vasp,Sc1Ge1I1Cl1O2,-3.739183346666667,0.2927282481712885 -Hf2F6_162_7490.vasp,Hf2F6,-4.398593575,0.5989263984375001 -Nb3Se5Br2_1_13016.vasp,Nb3Se5Br2,-3.450535034,0.2708819239062479 -Nb2Pd4Se4_51_12819.vasp,Nb2Pd4Se4,-2.717580813,0.205861130552626 -Sr1I1Br1_8_17057.vasp,Sr1I1Br1,-1.5191298700000002,0.0454763177777776 -Mg1Al2Te4_164_10336.vasp,Mg1Al2Te4,-1.9893763857142857,0.0817863985714286 -Co2Sb2Se4I2_10_4005.vasp,Co2Sb2Se4I2,-1.626219169,0.3501662739999998 -Pt2Se2_123_14685.vasp,Pt2Se2,-1.8379132725,0.3373877799999998 -Al2Cl6_2_797.vasp,Al2Cl6,-2.13226505,0.1522447037500001 -Si2P2_187_16427.vasp,Si2P2,-4.29140785,0.1051338091666664 -Si2Cl6_1_16398.vasp,Si2Cl6,-2.0672469725,0.1817291143749999 -Nb8C4Br1Cl7_6_13205.vasp,Nb8C4Br1Cl7,-5.175237919,0.0281663942773439 -Ba8Sn4Se20_14_2207.vasp,Ba8Sn4Se20,-2.349974689375,0.2396962246874996 -Nb2Co4Te2Se2_51_12701.vasp,Nb2Co4Te2Se2,-2.954622269,-0.2987614122083379 -K4Cu4O4_123_9443.vasp,K4Cu4O4,-1.2523457191666667,0.7773643783333317 -Ta3B2H2_187_17941.vasp,Ta3B2H2,-6.165689085714286,0.3663141778571375 -Fe2Sb2S4Br2_26_5953.vasp,Fe2Sb2S4Br2,-2.1467189170000003,-0.3876229312000018 -Ba2Cu1S2Br2_38_1966.vasp,Ba2Cu1S2Br2,-2.205879844285714,0.1021840625744004 -Sc1F2_115_15933.vasp,Sc1F2,-3.5369308566666664,0.309938643888886 -Pt2S2O6_11_14657.vasp,Pt2S2O6,-3.600607266,0.3690873109999965 -Sc1P2_21_15976.vasp,Sc1P2,-3.41512815,0.6933665316666633 -Cu1Sb1Se2I2_1_4967.vasp,Cu1Sb1Se2I2,-0.8598333916666667,0.2079691075462953 -Tm1Cl2_164_19662.vasp,Tm1Cl2,-2.63993518,0.1929072083333311 -Ca1Bi4O8_6_2809.vasp,Ca1Bi4O8,-3.6756820192307695,0.2633392978846112 -Na1Ga1P2S6_5_11864.vasp,Na1Ga1P2S6,-3.0621960340000003,-0.0367681304464349 -Sc3S2N2F2_187_16218.vasp,Sc3S2N2F2,-4.321353421111111,0.5518561471296259 -Zr1Bi1S1I2_1_21255.vasp,Zr1Bi1S1I2,-1.944357724,0.3331834345555526 -Mn8Sn2S8_47_11478.vasp,Mn8Sn2S8,-2.10778844,0.7503397122222168 -Ca2Sn4F12_2_3129.vasp,Ca2Sn4F12,-3.0182069255555555,0.0538952638888861 -Hg2I2O2_59_7971.vasp,Hg2I2O2,-0.1297314783333333,0.3208446985185189 -Na2N2O4_11_12217.vasp,Na2N2O4,-4.24472411125,0.1919931362499998 -V4O10_12_20339.vasp,V4O10,-5.534102542857143,-0.0755239607142863 -Fe2Te2_164_6006.vasp,Fe2Te2,-0.757314985,1.0088412662499997 -Zr1Te1N1Cl1_8_21460.vasp,Zr1Te1N1Cl1,-4.138371485,0.5312687791666659 -B1W2S2_164_1643.vasp,B1W2S2,-5.160640646,0.1203327490000005 -Li2Bi2Pd2_12_9843.vasp,Li2Bi2Pd2,-1.4721181166666666,-0.0829201216666691 -Ni2Sb2S5_8_13611.vasp,Ni2Sb2S5,-1.9548254944444443,0.245309529090907 -K2I2Cl8_127_9203.vasp,K2I2Cl8,-0.6092294066666667,0.0447056145833333 -Ta2Co2S6_11_17701.vasp,Ta2Co2S6,-4.179622114,0.1690115604166644 -Cd1Sb1S2_25_3420.vasp,Cd1Sb1S2,-1.355315575,0.3740190033333307 -Fe1F2_164_5676.vasp,Fe1F2,-2.6268512866666667,0.0909340499999999 -Mg1Sb3_25_10400.vasp,Mg1Sb3,-1.5294926775,0.2952308828124985 -Bi1Cl2_187_2327.vasp,Bi1Cl2,-1.1057432466666668,0.2041696061111098 -I6N2_31_8166.vasp,I6N2,-0.6476940875,0.4497903420312501 -V2Ag1O6_12_19967.vasp,V2Ag1O6,-4.501023728888889,0.2135691352083251 -Bi1P2Au1Se6_143_2355.vasp,Bi1P2Au1Se6,-2.097595578,0.0857091528333297 -Cd1H8C10I2N2_47_3361.vasp,Cd1H8C10I2N2,-5.173198005652174,0.1772960126449201 -Mo8S24_14_11766.vasp,Mo8S24,-3.252812500625,0.2262476629687499 -Sc1Sb2Au1Se6_149_15994.vasp,Sc1Sb2Au1Se6,-2.067478689,0.3507134811666642 -V3Cl8_156_20255.vasp,V3Cl8,-2.2569337945454544,0.0067050581818161 -Yb2S2I2_59_20884.vasp,Yb2S2I2,-3.2511644316666666,-0.9163567023263915 -Al1As2Au1Se6_149_609.vasp,Al1As2Au1Se6,-2.072805192,0.2189869966666647 -Ga2Bi2_129_6306.vasp,Ga2Bi2,-1.32820044,-0.5473169525000001 -Ga2Te2S8F2_11_6508.vasp,Ga2Te2S8F2,-2.113045722142857,0.4945831366369004 -Hg1H1S1I1_156_7865.vasp,Hg1H1S1I1,-0.8051378775,0.1553092036458332 -Ir5Pd1Se1S7I6_1_8869.vasp,Ir5Pd1Se1S7I6,-1.9984298765,-0.0069257568437528 -Sc1Te2_187_16017.vasp,Sc1Te2,-2.39339069,0.434971185277776 -Sn2Se2Br2_59_16876.vasp,Sn2Se2Br2,-1.4762440716666667,0.1802877941666666 -Ir1C3_156_8730.vasp,Ir1C3,-5.8691292975,1.5209194849999998 -Sr2Bi1_164_17141.vasp,Sr2Bi1,-0.3578709399999999,0.6054649855555546 -W1Au1Cl3O2_1_20408.vasp,W1Au1Cl3O2,-2.774420201428572,0.1389575896428563 -Sb2W2_12_15752.vasp,Sb2W2,-3.8858034375,0.7647336837500003 -Bi4Pd2_2_2635.vasp,Bi4Pd2,-1.221242808333333,-0.4676650983333332 -Pt2Se2O6_12_14678.vasp,Pt2Se2O6,-3.2528371810000003,0.1072085245833271 -Pd4I1Br3O4_1_14519.vasp,Pd4I1Br3O4,-1.5240590108333334,0.2264309018055518 -Nb2Te2C1_164_12905.vasp,Nb2Te2C1,-5.160551682,0.0390232959999998 -Yb2Br6_147_20864.vasp,Yb2Br6,-2.304470055,-0.6211954624999998 -Hf4N4F16_2_7798.vasp,Hf4N4F16,-4.2017370325,0.8269195137499954 -Nd2Bi2S4O2_129_13232.vasp,Nd2Bi2S4O2,-4.184787558,0.0053415459999959 -K2Zr1O6F6_1_9398.vasp,K2Zr1O6F6,-2.5087195166666665,0.997832319833334 -Ta1Ni1C1I2_6_17585.vasp,Ta1Ni1C1I2,-2.727656794,0.4431435200999881 -Ir2S2I1Br1_6_8818.vasp,Ir2S2I1Br1,-2.3685077983333334,0.072904093611108 -Se4Br4_2_16297.vasp,Se4Br4,-0.96260727375,0.08263260625 -Cr1H4C4O6F1_2_4189.vasp,Cr1H4C4O6F1,-5.213150055,0.132740866979162 -Ga2H2Se2O8_11_6378.vasp,Ga2H2Se2O8,-4.097099811428572,0.1077099803571428 -Na2S4Br2_113_12288.vasp,Na2S4Br2,-1.28762306,0.5400986621875 -Sn1C1_156_16623.vasp,Sn1C1,-3.27640952,-0.5219585575000001 -Bi2Sb1Se2S1I2_1_2522.vasp,Bi2Sb1Se2S1I2,-1.56985217125,0.151723491354163 -Au2F6_162_1483.vasp,Au2F6,-0.39980244,0.3123995683333332 -Ta1Te2_164_17629.vasp,Ta1Te2,-3.630114553333333,0.1177688155555558 -Li2Co1_187_9860.vasp,Li2Co1,-1.084916276666667,0.4751085711111098 -Cs3Mo2I9_187_4799.vasp,Cs3Mo2I9,-0.5775495521428571,0.2824590473214271 -Nb4Ni8Se8_51_13110.vasp,Nb4Ni8Se8,-2.2068069935,0.0272050980217368 -Ca2Mn2As4H12O20_2_3064.vasp,Ca2Mn2As4H12O20,-4.38811295425,0.2236708773333342 -Ni2Cl2_129_13494.vasp,Ni2Cl2,0.2739039275,1.8955254225 -Mg2W2F8_2_10534.vasp,Mg2W2F8,-2.970754125833333,0.7015374037499964 -Na2C2S8F8_2_12004.vasp,Na2C2S8F8,-2.671730831,0.2610415009999918 -Ga1Sn3Br2Cl2O4_1_6286.vasp,Ga1Sn3Br2Cl2O4,-2.7757102766666666,0.1546148903124977 -Ir3Rh1O8_156_8857.vasp,Ir3Rh1O8,-3.9405192175,0.466866435 -Hf1H2Pd2O6_1_7191.vasp,Hf1H2Pd2O6,-4.289185092727273,0.3775698659848387 -Sb1H1Se2S6_1_15456.vasp,Sb1H1Se2S6,-2.36798585,0.2621856676979117 -Tc2Te2_129_18238.vasp,Tc2Te2,-4.53550887,0.4378896668749998 -Nb4Te4I12_13_13172.vasp,Nb4Te4I12,-1.6694924060000005,0.0548200609999998 -Ir2S2Br2_59_8813.vasp,Ir2S2Br2,-2.4828654416666667,0.0495350116666664 -Hf1Mn3S4Br4_3_7230.vasp,Hf1Mn3S4Br4,-2.630801798333333,0.211184133124997 -Li4Ge6Te12_2_10193.vasp,Li4Ge6Te12,-2.0352031740909093,-1.119007029242426 -Nb4Fe2S10_59_13069.vasp,Nb4Fe2S10,-4.1286403775,0.124441619687498 -Na2Ir1_187_12186.vasp,Na2Ir1,-0.78458873,1.1679867299999986 -Cu1S1Br1Cl1_1_4953.vasp,Cu1S1Br1Cl1,-0.728403895,0.2241897582812485 -K2B2H8O8_2_8993.vasp,K2B2H8O8,-4.6366164255,0.0829768463888896 -Na2Cl2O6_11_12054.vasp,Na2Cl2O6,-2.676328335,-0.1089725972499997 -Ir2Se2Br2_59_8834.vasp,Ir2Se2Br2,-2.14548792,-0.1088387165277808 -Ag1Pt1Se2_1_106.vasp,Ag1Pt1Se2,-0.88707187,0.6197688474999998 -Pt1Se2_187_14595.vasp,Pt1Se2,-1.72980289,0.5204423549999999 -Mo2I4O4_51_11625.vasp,Mo2I4O4,-2.902528025,0.1321066547500002 -Tl2Sb2O6_143_19517.vasp,Tl2Sb2O6,-3.010251681,0.7843103519999994 -Yb2P4H14C4O16_2_20881.vasp,Yb2P4H14C4O16,-5.2852273345,-8.800850000889593e-05 -Ag1Bi1Te6As2_143_28.vasp,Ag1Bi1Te6As2,-1.349727764,0.2489642014166649 -Zr1S2_115_21415.vasp,Zr1S2,-4.285971346666667,0.512899220833333 -Al2V1Te4_164_1033.vasp,Al2V1Te4,-2.152966887142857,0.2223089238520355 -Ag2S4F2_4_390.vasp,Ag2S4F2,-1.50272734375,0.1272767272265624 -In8Te8Cl8_14_8723.vasp,In8Te8Cl8,-1.34368695375,-0.61143122375 -Cu1Pb4S2O14_2_4939.vasp,Cu1Pb4S2O14,-3.5727586957142856,0.3050311463095183 -Cr2I6_162_4415.vasp,Cr2I6,-0.6073660775,0.0472462699999999 -Li6H2Se2O8_11_10267.vasp,Li6H2Se2O8,-4.160679158888889,0.036927521111111 -Zr2Nb2Se1S3Cl2_1_21614.vasp,Zr2Nb2Se1S3Cl2,-4.310500231000001,-0.1814046527750064 -Al2As2_129_764.vasp,Al2As2,-3.0217824475,-0.7083569475 -Ca2Au1Se2Cl2_38_2939.vasp,Ca2Au1Se2Cl2,-1.56163257,0.2742508228571394 -Au2Cl4_11_1473.vasp,Au2Cl4,0.0530376383333333,0.1111968899999999 -Sn4Te4As4_17_16972.vasp,Sn4Te4As4,-1.8908736508333333,-0.7966601441666676 -Ga1Cu1S4_10_6171.vasp,Ga1Cu1S4,-1.8717919666666667,0.5277193364583314 -Cr2S2Cl2_59_4463.vasp,Cr2S2Cl2,-2.66318054,-0.1262528399999998 -Fe1Sb2S4_164_5750.vasp,Fe1Sb2S4,-2.653111238571429,-0.1385531394285737 -Ce2Zn2P2O2_164_3685.vasp,Ce2Zn2P2O2,-3.67519897125,0.1460593175000002 -Ca2Si2Ni2_129_3123.vasp,Ca2Si2Ni2,-1.419652695,0.1886246683333334 -Ba4Ge4Se10_31_2156.vasp,Ba4Ge4Se10,-2.7111859377777776,0.2297115127777775 -Li6Sb4P6O24_147_10274.vasp,Li6Sb4P6O24,-5.0641373110000005,0.1361311074999949 -Fe1Se2_187_5757.vasp,Fe1Se2,-1.5750587633333335,0.7267999949999997 -Au2Se4Br2_4_1553.vasp,Au2Se4Br2,-0.70158566125,0.2222190605208333 -Li2B2_51_9839.vasp,Li2B2,-2.89526781,1.1104048475 -Na2Cd4Se2Br6O6_31_12036.vasp,Na2Cd4Se2Br6O6,-1.6214652995,0.192404869375 -In2Te2F2_31_8619.vasp,In2Te2F2,-1.7720677516666663,0.1570657827777761 -Ni2W2O8F2_129_13686.vasp,Ni2W2O8F2,-4.055952056428572,0.0680326061607083 -Cd2Cu2Te2F2_26_3499.vasp,Cd2Cu2Te2F2,-0.2974128925,0.0781006028125 -Cl1_123_3690.vasp,Cl1,0.28679486,0.4900700424999999 -Fe2B1H2_164_5799.vasp,Fe2B1H2,-2.591618192,0.7320845620000005 -Na2Os2C2S4Cl8_7_12247.vasp,Na2Os2C2S4Cl8,-2.491586057777778,0.3859133545238022 -C2Cl2_164_2743.vasp,C2Cl2,-3.4623002075,0.7535764837499999 -Y4H2C3S2_164_20822.vasp,Y4H2C3S2,-5.264860399090909,0.5977527636363518 -Sr2Sb1_164_17308.vasp,Sr2Sb1,-0.80130189,0.5912061922222209 -Mo1Cl2_164_11506.vasp,Mo1Cl2,-1.8978177033333332,0.4000185044444444 -K2Cl2O8_31_9079.vasp,K2Cl2O8,-2.5526773241666665,0.1286546475000003 -K8Eu2P4S16_49_9550.vasp,K8Eu2P4S16,-2.753807606666667,0.1260213203333302 -Br6N2_162_2712.vasp,Br6N2,-0.612485175,0.7661036631250001 -Cr1Cu1P2Se6_5_4151.vasp,Cr1Cu1P2Se6,-2.372253698,0.0885508548083334 -Cu1W2S1Br4_1_5003.vasp,Cu1W2S1Br4,-1.67919141375,0.7085011721874996 -Cr1S2F1_156_4245.vasp,Cr1S2F1,-2.6856424225,0.4978883703124975 -Ca2As4O12_2_2925.vasp,Ca2As4O12,-4.432504358888888,0.2823940866666676 -Pt2F4_14_14621.vasp,Pt2F4,-1.4304140516666666,0.3871868808333307 -Mn2Br2O3_8_11031.vasp,Mn2Br2O3,-3.0697302785714284,0.0636825302976144 -Ag2Cl2_67_248.vasp,Ag2Cl2,-0.0047727175,0.12454621 -Mn3N2F2_156_11396.vasp,Mn3N2F2,-3.823369451428571,0.5310579771428534 -Hf2C2I2_59_7470.vasp,Hf2C2I2,-4.823704723333333,0.6108837395833301 -Cr1B4H4Cl1O6_1_4116.vasp,Cr1B4H4Cl1O6,-4.818605060625,0.7261586437152738 -Ag2H6Br2N2_11_283.vasp,Ag2H6Br2N2,-3.003573600833333,-0.0955497140625027 -Al1F1_99_652.vasp,Al1F1,-2.54036174,0.9307514416666636 -Mn1Al2S4_156_10628.vasp,Mn1Al2S4,-3.395377974285714,-0.0357433757142855 -In2F2_129_8422.vasp,In2F2,-2.0463437525,0.3849962008333314 -K2Mg1H4Se2S8_2_9219.vasp,K2Mg1H4Se2S8,-2.4643015488235296,0.0876873324509757 -Si1Sb1Te4_1_16362.vasp,Si1Sb1Te4,-1.7344408783333334,0.3353088044444428 -Zr1V1Ga1I1Br1O2_1_21485.vasp,Zr1V1Ga1I1Br1O2,-3.681610797142857,0.9138775303759336 -B2Sb2H6Pb2O6_7_1705.vasp,B2Sb2H6Pb2O6,-3.762526367222223,0.7150625105555504 -Y2C2I2_12_20715.vasp,Y2C2I2,-4.86452612,0.0384112666666673 -Hf1Zn1Cl2O2_6_7369.vasp,Hf1Zn1Cl2O2,-4.011972205,0.1818570548958331 -Na2Os2C2S4Br8_13_12246.vasp,Na2Os2C2S4Br8,-2.259697418888889,0.2783407106249939 -Be2F4_51_2255.vasp,Be2F4,-3.79711852,0.5092089500000005 -Li1Br1_123_9665.vasp,Li1Br1,-2.112294285,0.230243395 -V2Ni1Se4_164_20116.vasp,V2Ni1Se4,-2.53654329,0.111298684821426 -Sc1Au1Br1Cl1O2_1_15901.vasp,Sc1Au1Br1Cl1O2,-2.658039496666667,0.3580755287152728 -Ta3Se1Br7_156_17988.vasp,Ta3Se1Br7,-3.063465652727273,0.0507259926846562 -Hf3C2Cl2_187_7692.vasp,Hf3C2Cl2,-6.176280247142857,0.0226092619047557 -Cr2F8_14_4384.vasp,Cr2F8,-2.899294456,-0.1276742680000002 -Co1B6C2I2F4_6_3705.vasp,Co1B6C2I2F4,-3.907443358,0.5623112023888819 -Mn1Cu1S3Br2_1_10690.vasp,Mn1Cu1S3Br2,-1.4924717357142858,0.2188166063035692 -Nb1F2_115_12504.vasp,Nb1F2,-3.9984078733333335,0.6517145833333282 -Hf1Mn1I3Br1_1_7217.vasp,Hf1Mn1I3Br1,-1.6388406016666668,0.3724560281681011 -Li2Mg1Te2S8F4_2_9979.vasp,Li2Mg1Te2S8F4,-2.625808199411765,0.0856208349019553 -Hf3B2O2_187_7682.vasp,Hf3B2O2,-6.741962457142857,0.1882154003895979 -Cr2P2Se6_12_4453.vasp,Cr2P2Se6,-2.79525244,0.0922131268749972 -Nb1I1F1_156_12520.vasp,Nb1I1F1,-2.7621353466666663,0.744077449166664 -V1Ag1Br2N1_1_19749.vasp,V1Ag1Br2N1,-2.207857502,0.2396061176249999 -Ta4S12Br2_2_18096.vasp,Ta4S12Br2,-4.085813489444444,0.1845363162239524 -Al1Fe5Br2_123_657.vasp,Al1Fe5Br2,-0.69660131125,1.1362189349999987 -Ta6Ge2Te12_26_18145.vasp,Ta6Ge2Te12,-3.6692478835,-0.0788552890000033 -Cd2Ge1O4_21_3507.vasp,Cd2Ge1O4,-2.4656332542857142,0.6079226942857114 -La2Pb1_164_9608.vasp,La2Pb1,-1.7391256566666666,0.9126612645833312 -Cr2Bi2_12_4327.vasp,Cr2Bi2,-1.6433088025,1.19061653 -Nb2Sn2Bi2_129_12895.vasp,Nb2Sn2Bi2,-2.6306927316666666,0.2464959113333262 -Na4P4S12_11_12403.vasp,Na4P4S12,-2.9651310895000003,0.0850970494999998 -Te2Rh2_123_18507.vasp,Te2Rh2,-1.893424875,0.3299231670833311 -Li1Bi1P4O12_1_9662.vasp,Li1Bi1P4O12,-5.216365998888889,0.1745107223888848 -Ir1O2_187_8744.vasp,Ir1O2,-3.18605464,1.4582873833333334 -Ni2P1S4I1_1_13555.vasp,Ni2P1S4I1,-1.6699796975,0.2749958064204523 -K2B10O16_32_8979.vasp,K2B10O16,-6.2613466807142855,0.1765332222321429 -Al2V1S4_164_1031.vasp,Al2V1S4,-3.641068791428572,0.0742589022321389 -Fe2W2S8Br2_129_6035.vasp,Fe2W2S8Br2,-2.547381228571429,0.2282395818526732 -Ta2Tl2Cu4S8_28_17931.vasp,Ta2Tl2Cu4S8,-2.662894885625,0.148316178541664 -Th1I2_187_18719.vasp,Th1I2,-2.39559112,0.0871337116666666 -Nb4Zn4W2O16_2_13186.vasp,Nb4Zn4W2O16,-5.176682641538462,0.1909068593014089 -Sr3Fe2Cl2O5_123_17375.vasp,Sr3Fe2Cl2O5,-3.6284595875,0.0512770649999962 -Hf4S4F4_31_7808.vasp,Hf4S4F4,-4.845142551666666,0.3779708649999902 -Na2Ni2P2_129_12238.vasp,Na2Ni2P2,-1.5583521333333332,0.1837637413518506 -V2Zn2O7_10_20235.vasp,V2Zn2O7,-4.076249520909091,0.3172774013636363 -B1P1_187_1631.vasp,B1P1,-5.008418045,-1.15762697 -Mn2Bi2Te4Br2_10_11021.vasp,Mn2Bi2Te4Br2,-1.3109979470000002,0.2267267753879288 -Cr4H2N3_164_4604.vasp,Cr4H2N3,-4.623607956666667,-1.2129502506790153 -Fe1Ag1Se1S1Br2_1_5616.vasp,Fe1Ag1Se1S1Br2,-0.9884067183333332,-0.0059866832407417 -Na2H2Se2_4_12106.vasp,Na2H2Se2,-2.323055361666667,0.088465278333333 -I4O10_4_8161.vasp,I4O10,-2.3921405428571427,0.1619736185714289 -V1Cl2_187_19800.vasp,V1Cl2,-2.2115215966666666,0.1360087499999998 -In6S6_2_8710.vasp,In6S6,-2.1708343891666666,0.1088357758333335 -Re2I2_129_15050.vasp,Re2I2,-2.45624258,1.2280616797222192 -Ti2O2_187_18976.vasp,Ti2O2,-6.84366414,0.3935530233333342 -Zr2H2N1_164_21580.vasp,Zr2H2N1,-5.17954714,0.0590052760000006 -Rb1Ge1Se2_156_14734.vasp,Rb1Ge1Se2,-1.7316307125,0.4109154209375001 -Nb4Si1Te3Mo1Cl1_1_13154.vasp,Nb4Si1Te3Mo1Cl1,-3.932856956,0.2831153847950562 -Zn1F2_164_20923.vasp,Zn1F2,-1.4819265233333334,0.1147856541666665 -Na4B4Se14_13_12368.vasp,Na4B4Se14,-2.679230965909091,0.1314107013636363 -Zr2Br4_11_21526.vasp,Zr2Br4,-2.5830260766666666,0.0716860966666668 -Zn1Br1Cl1_156_20902.vasp,Zn1Br1Cl1,-0.2855339933333333,0.1109180592708333 -Ge1Bi1S2I2_1_6645.vasp,Ge1Bi1S2I2,-1.7314901683333332,-0.0018916036979212 -Sn3Rh1_187_16924.vasp,Sn3Rh1,-1.02058247,1.0749460750000002 -K4Ta6Cl18_12_9519.vasp,K4Ta6Cl18,-3.0330923807142858,0.063197752142857 -Li1Au1C4S4O12F12_2_9656.vasp,Li1Au1C4S4O12F12,-3.713031918529412,0.2493875985845473 -Nb2I1Cl1O3_8_12741.vasp,Nb2I1Cl1O3,-5.041610412857144,0.223428790535705 -Al2H2Se2O8_11_864.vasp,Al2H2Se2O8,-4.643419345714285,-0.4534702657142888 -K2Te1I2O12_147_9363.vasp,K2Te1I2O12,-2.441046895294118,0.5937053748345554 -Ca4Mn2Br2O6_129_3221.vasp,Ca4Mn2Br2O6,-3.983644806428571,-0.1932712733928605 -Te2Pt2O6_12_18486.vasp,Te2Pt2O6,-3.241312496,0.1957660744999977 -Cd1Ni1H12C14N8_10_3380.vasp,Cd1Ni1H12C14N8,-5.5778899200000005,-1.856013397546301 -Zr2Nb2Se3I2O3_1_21615.vasp,Zr2Nb2Se3I2O3,-4.493123135,0.138996507881941 -Ta2Br2O4_11_17666.vasp,Ta2Br2O4,-5.86056451875,-0.1078057570833381 -Cu2I2_129_5171.vasp,Cu2I2,0.23114209,0.1640988299999995 -Zr3Nb1Se8_10_21777.vasp,Zr3Nb1Se8,-4.00490201,0.1266798725000004 -Na2V2Au4S12_1_12331.vasp,Na2V2Au4S12,-1.970349805,0.337777493312499 -P2S2_8_14045.vasp,P2S2,-3.0075024775,0.5062728046484377 -Hf2C2I2_164_7468.vasp,Hf2C2I2,-4.816810696666667,0.6177777662499963 -In1Sb2Te6Au1_149_8338.vasp,In1Sb2Te6Au1,-1.1009963,0.2150608599166656 -Sb2Pb2C2S6F6_7_15638.vasp,Sb2Pb2C2S6F6,-2.7870009472222224,0.5726910159722187 -Al6Te6I2_11_1108.vasp,Al6Te6I2,-1.9929813742857143,0.0537846853571428 -Ag2H8C12N6O6_2_288.vasp,Ag2H8C12N6O6,-5.667834532941177,0.2371769642279259 -Sr2Nd2Cu2Cl2O6_129_17285.vasp,Sr2Nd2Cu2Cl2O6,-4.074081729285714,0.1108283047618982 -Mn2O2_164_11176.vasp,Mn2O2,-3.87605143,0.3345949328448276 -Th2Se6_11_18727.vasp,Th2Se6,-4.0101425225,0.0582568349999998 -Mn1Cu1Te2Se1_1_10696.vasp,Mn1Cu1Te2Se1,-1.118115662,0.3500296058333318 -Mn3V3Te2O16_1_11419.vasp,Mn3V3Te2O16,-4.7338093925,0.0574426805729103 -K2Na4P6H14N6O16_1_9252.vasp,K2Na4P6H14N6O16,-4.782893381458334,0.1301568501388796 -Ta2I6_189_17767.vasp,Ta2I6,-1.76550049,0.3279978414843754 -Ru3S4_164_15369.vasp,Ru3S4,-3.4570689142857143,0.2409892478571391 -Sr2Tl1Cu1Hg1O5_99_17337.vasp,Sr2Tl1Cu1Hg1O5,-2.622717282,0.2657222691249928 -Ta2Br4_11_17670.vasp,Ta2Br4,-3.011605981666667,0.398018234761898 -Ga2Br6_162_6312.vasp,Ga2Br6,-1.08359064375,0.0705028062499999 -Sr2Tl1Cd1Cu1S5_99_17336.vasp,Sr2Tl1Cd1Cu1S5,-1.7117555379999998,0.2209147231093752 -Ag2C2N2O2_129_216.vasp,Ag2C2N2O2,-3.95345857125,0.6445017973958267 -Al2Se5_12_978.vasp,Al2Se5,-2.6336557085714287,0.1347872995238075 -Ag2H4C4S8_2_277.vasp,Ag2H4C4S8,-3.3543900022222224,0.3453298919791554 -Zr4N3O2_164_21832.vasp,Zr4N3O2,-7.190035718888889,-0.1294821577777836 -Zr1I1Cl1_156_21308.vasp,Zr1I1Cl1,-2.35309809,0.2506861208333333 -Ta4Se12Cl2_2_18107.vasp,Ta4Se12Cl2,-3.574715833888889,0.1874130157222158 -B2H6O6_175_1673.vasp,B2H6O6,-5.209359007142857,0.0315762367857139 -In1S1_156_8327.vasp,In1S1,-1.62388206,0.6557881050000003 -Hf2C2Cl2_164_7464.vasp,Hf2C2Cl2,-5.336845960000001,0.6612714181249946 -Si1As1S1O7_1_16315.vasp,Si1As1S1O7,-4.683705411,0.2785669418124874 -As2Pb2O6_7_1257.vasp,As2Pb2O6,-3.819950344,0.3454749105000001 -Os1Pb2_123_13811.vasp,Os1Pb2,-1.7929659100000002,1.0553074733333307 -Bi2Cl2_129_2446.vasp,Bi2Cl2,-0.8640004825,0.2351511558333323 -Mn1Ge1Br1N2Cl1_8_10732.vasp,Mn1Ge1Br1N2Cl1,-3.395972328333333,0.0488714290972176 -Li1Ga1As2S6_5_9705.vasp,Li1Ga1As2S6,-2.815621877,0.4927416711874974 -Tl3Os2_123_19578.vasp,Tl3Os2,-1.070017934,1.157970478 -Ni2H2S4_11_13512.vasp,Ni2H2S4,-2.22314542,0.0442781550781227 -Al2Ge2S6_162_848.vasp,Al2Ge2S6,-3.356594638,-0.0894627780625025 -Te3As4Au2Br2_6_18543.vasp,Te3As4Au2Br2,-1.2457231336363637,0.3126830030302999 -In2Sb2Te6_147_8568.vasp,In2Sb2Te6,-1.348571822,0.2642658329999999 -Y1Cu1Cl4_1_20626.vasp,Y1Cu1Cl4,-2.35007207,0.1658374033333301 -Sn2Se2O8_31_16880.vasp,Sn2Se2O8,-3.4724229875,0.5140795716666666 -Au2S1_191_1510.vasp,Au2S1,0.08413512,0.40992853 -Na2Cd4Br6O8_31_12021.vasp,Na2Cd4Br6O8,-1.3760604355,0.2649917834166652 -As1Se2_164_1181.vasp,As1Se2,-2.2976975200000003,0.2586547513888864 -In1Ge2H1S6_1_8268.vasp,In1Ge2H1S6,-2.857930771,0.1525206362500001 -K4La4P8S24_14_9469.vasp,K4La4P8S24,-3.54472826625,0.0550784882499999 -Ca2I2Cl2_129_3051.vasp,Ca2I2Cl2,-1.7153394316666668,0.0433370191666665 -Cr1Se1S1_156_4262.vasp,Cr1Se1S1,-2.94549094,0.2688691283333337 -Fe1I1Br1_156_5714.vasp,Fe1I1Br1,-0.8119843233333334,-0.3835820004166667 -Mg2Bi1_164_10428.vasp,Mg2Bi1,-0.1428107233333333,0.5132552536111112 -K4Ce4P8S24_14_9430.vasp,K4Ce4P8S24,-3.50292762775,0.0545430052499997 -Al1Cu1Sb2Te6_149_647.vasp,Al1Cu1Sb2Te6,-1.358479683,0.1116973066666649 -Ta1Ni1Te4_6_17591.vasp,Ta1Ni1Te4,-2.1233086033333333,0.200923598333331 -Cr2Br2O2_59_4332.vasp,Cr2Br2O2,-3.3909110466666665,-0.1024869172222255 -Tl4Si2Se6_2_19630.vasp,Tl4Si2Se6,-2.0431981041666667,0.1270451624999999 -Th2I2N2_129_18725.vasp,Th2I2N2,-5.657166733333334,0.0626106566666662 -Sn2Sb1Te6_162_16851.vasp,Sn2Sb1Te6,-1.3816785722222222,-0.4163296281481508 -Ti4P1S5I1Cl2_8_19153.vasp,Ti4P1S5I1Cl2,-4.35047208,-0.0899032794230849 -Tl1Ga1Hg1O4_156_19271.vasp,Tl1Ga1Hg1O4,-2.5163050357142858,0.2558478282738045 -Sn2Ru1_123_16831.vasp,Sn2Ru1,-1.9791762533333332,0.4105292392857105 -K2Cd4Te2Cl6O6_31_9067.vasp,K2Cd4Te2Cl6O6,-1.604174023,0.2926649098750001 -Mo2P2S10_85_11656.vasp,Mo2P2S10,-3.059599774285714,0.3364515520982113 -Na4H16Cl4O8_14_12388.vasp,Na4H16Cl4O8,-3.68863501875,0.0613106041145838 -Bi1I2_187_2343.vasp,Bi1I2,-0.25422477,0.2329863638888884 -Ga2As6_164_6303.vasp,Ga2As6,-2.5647369625,-0.1093659200000001 -Cu2Se2_129_5303.vasp,Cu2Se2,-0.7272317825,0.1834404033333334 -Zr2Cl2_164_21550.vasp,Zr2Cl2,-3.4398385625,0.0370010675000003 -Nb4Ni1Se2S1Br5O2_1_13098.vasp,Nb4Ni1Se2S1Br5O2,-3.540929283333333,0.1374362908730075 -Nb2As1Se4S1I2_1_12622.vasp,Nb2As1Se4S1I2,-2.956037278,0.1777582760384567 -Mn2Te2W2S12_113_11305.vasp,Mn2Te2W2S12,-2.9299003683333336,0.4376424469907374 -Ir2Se2I2_59_8840.vasp,Ir2Se2I2,-1.943002735,-0.1025172487500032 -Sc1P2Au1Se6_149_15974.vasp,Sc1P2Au1Se6,-2.555390113,0.0592671754374981 -In2S1Br1_1_8538.vasp,In2S1Br1,-1.456348755,0.344919515 -Y2Br2_129_20702.vasp,Y2Br2,-2.65833316,0.6923818641666628 -As4O6_1_1332.vasp,As4O6,-4.409029962,0.0762076099999999 -Cu2Se2_187_5304.vasp,Cu2Se2,-0.6671574275,0.2435147583333334 -Li2B2H8O8_2_9836.vasp,Li2B2H8O8,-4.9477031575,0.06902804025 -Cu2O2_187_5197.vasp,Cu2O2,-1.698562765,0.7742257331250001 -Mn2As2S4Br2_10_10972.vasp,Mn2As2S4Br2,-2.444546466,0.1524671418750003 -Ni2Ir2S6Br1Cl1_1_13533.vasp,Ni2Ir2S6Br1Cl1,-2.1328029416666667,-0.0941484640625024 -Rh2Se1S1I2_6_15232.vasp,Rh2Se1S1I2,-1.69652377,0.1662833259027707 -Pb3Se2Cl2O6_5_14307.vasp,Pb3Se2Cl2O6,-3.131634775384616,0.04505946730769 -Li2C4_129_9853.vasp,Li2C4,-4.59461614,1.3836201818518457 -Li4Mn2F12_13_10199.vasp,Li4Mn2F12,-2.9363434044444445,0.1522100499999998 -K2H6C6O6_1_9144.vasp,K2H6C6O6,-5.1362120215,0.1805198161874962 -Co1I2_164_3776.vasp,Co1I2,-0.37332231,0.1698961211111106 -Fe2Bi2S4I2_26_5810.vasp,Fe2Bi2S4I2,-1.757470783,-0.0005013769999998 -Ni2As4I4O6_2_13455.vasp,Ni2As4I4O6,-2.68115754875,-0.0388756525 -Ho2B2C2_51_8122.vasp,Ho2B2C2,-5.50220376,0.505614639027772 -Rh2S2I2_11_15220.vasp,Rh2S2I2,-1.8725774683333332,0.1347881761111091 -Zn1Cl2_25_20917.vasp,Zn1Cl2,-0.2691789833333333,0.3309856381249999 -Cu2Sb4S3Cl2_6_5277.vasp,Cu2Sb4S3Cl2,-1.6875727345454548,0.191946431942147 -Cr2Cu4O12_59_4377.vasp,Cr2Cu4O12,-3.1830509888888887,0.2680011386805514 -Hf1S2I2_1_7279.vasp,Hf1S2I2,-2.620446856,0.4921033167500003 -Bi2O2F2_164_2480.vasp,Bi2O2F2,-3.315017585,-0.0536817983333333 -V2Cu2O8_51_20049.vasp,V2Cu2O8,-4.084396745833334,0.1286641301041626 -Sn4Sb4S10_11_16964.vasp,Sn4Sb4S10,-2.5707641005555555,0.0820455088888867 -Hf1V1I1Br1O2_6_7349.vasp,Hf1V1I1Br1O2,-4.2893596,0.3168275688888884 -Li2Ti3Mo1N2O4_1_10098.vasp,Li2Ti3Mo1N2O4,-6.008288210833334,0.3406320048937715 -Si1H2O1_8_16339.vasp,Si1H2O1,-3.9127744725,1.2775913687499996 -Ga1Cu1P2O6_149_6163.vasp,Ga1Cu1P2O6,-4.452991499,0.415280242999998 -Ag1Au1Br2_5_4.vasp,Ag1Au1Br2,0.26921477,0.0717067493749999 -Li1O2_164_9773.vasp,Li1O2,-2.64406768,0.2097527416666667 -Mo1Au2O4_8_11492.vasp,Mo1Au2O4,-2.919803987142857,0.5692134514285674 -Ta3H2C2O2_187_17958.vasp,Ta3H2C2O2,-6.645611173333333,0.3442164933333207 -Cu2Se1I2_1_5291.vasp,Cu2Se1I2,-0.121464352,0.1538305539999991 -Li2O2F2_11_10032.vasp,Li2O2F2,-2.6823202816666663,0.5443620937499976 -Ag4H4Cl4O4_14_515.vasp,Ag4H4Cl4O4,-1.941220504375,0.1579136383854168 -Si2Os1_123_16422.vasp,Si2Os1,-4.30901048,0.8632079258333327 -Fe2Cu1S4_187_5844.vasp,Fe2Cu1S4,-1.9395748914285715,-0.0531222214285731 -In1Pb1Se1Br1_156_8304.vasp,In1Pb1Se1Br1,-1.346225345,0.31875760114583 -Nb2I10_1_12737.vasp,Nb2I10,-0.9418193058333334,0.2431087225 -Li1Sn2S2_164_9792.vasp,Li1Sn2S2,-2.406561814,-0.2990222607499973 -Hg1H1Cl1O1_156_7859.vasp,Hg1H1Cl1O1,-1.622216235,0.1443941313541668 -Ni2Te5P2_8_13680.vasp,Ni2Te5P2,-1.415008208888889,0.4705573937962947 -In1As2Au1S6_149_8191.vasp,In1As2Au1S6,-2.241139659,0.4494025201874975 -Cu4H12C8N16_14_5407.vasp,Cu4H12C8N16,-5.31727958075,-1.887147348416673 -Ti1Cu1F6_2_18773.vasp,Ti1Cu1F6,-3.09255433375,0.0673193462500001 -Nb3Te1Br7_156_13020.vasp,Nb3Te1Br7,-2.652679509090909,0.0450660354545435 -Nb2S2_129_12844.vasp,Nb2S2,-4.93908083,0.1725003734999948 -Bi2Te2_164_2567.vasp,Bi2Te2,-1.142170205,0.3776667949999999 -Cu2Sb4Te3Cl2_6_5285.vasp,Cu2Sb4Te3Cl2,-1.1760063218181818,0.6210358545454513 -Ni1Au1S1F2_8_13260.vasp,Ni1Au1S1F2,-0.774819778,0.3928231210000001 -Cu1Ag1S2I2_1_4823.vasp,Cu1Ag1S2I2,-0.4968882699999999,0.2192949549999993 -Bi4F12_14_2611.vasp,Bi4F12,-2.45765186625,0.5376539993749998 -Sb2O2F2_59_15612.vasp,Sb2O2F2,-3.365852268333333,0.3120706164583335 -In2Ge2Te2_164_8453.vasp,In2Ge2Te2,-1.9413665783333331,-0.2937020233333348 -Cr1Mo1I1Cl3O1_1_4213.vasp,Cr1Mo1I1Cl3O1,-2.27429957,0.1123610854761882 -Nb2In1Te3As1S2Cl1_1_12755.vasp,Nb2In1Te3As1S2Cl1,-2.836844809,0.2549661244583261 -Hf2P2Se6_2_7556.vasp,Hf2P2Se6,-3.800515495,0.2637496608749963 -Sn2O2F2_59_16795.vasp,Sn2O2F2,-3.1699431616666662,0.3538060537500003 -Ba3Ni2S5I2_123_2124.vasp,Ba3Ni2S5I2,-2.12822753,0.101004317178815 -Ga4Cu2Cl16_14_6550.vasp,Ga4Cu2Cl16,-1.2444195754545453,0.0716647672727268 -Bi2_51_2586.vasp,Bi2,-0.559444775,-0.09257678 -Mg2H2O3_164_10464.vasp,Mg2H2O3,-4.44953325,-0.1139519442857179 -K1Ni1H9C2O10_2_8924.vasp,K1Ni1H9C2O10,-4.514351584782609,-0.0461784272463854 -Re1I2_187_15008.vasp,Re1I2,-1207.2862566166666,-1204.9405207170369 -Cr1B4S6Cl1F4_2_4122.vasp,Cr1B4S6Cl1F4,-3.209342821875,0.6042349682682255 -Al2Si4O11_12_991.vasp,Al2Si4O11,-6.311081366470588,-0.0003297629411824 -V2Cu2As4O12_4_20048.vasp,V2Cu2As4O12,-3.923729064,0.549996384124996 -Sr2Tl1Cd1Au1S5_99_17334.vasp,Sr2Tl1Cd1Au1S5,-1.564090874,0.3126897046874973 -P4W2O16_31_14129.vasp,P4W2O16,-5.735294219545454,0.0560851752272721 -Ta2S2N1_164_17851.vasp,Ta2S2N1,-6.542980794,0.2040207296666674 -N1F3_187_11773.vasp,N1F3,-1.0008172225,1.122692825 -K2Pr2Si2Se8_4_9301.vasp,K2Pr2Si2Se8,-3.070561726428572,0.0910708585714283 -Sc1Ta1Br2N1_156_16011.vasp,Sc1Ta1Br2N1,-4.538678724,0.4380751022222167 -Li2Cr1_187_9871.vasp,Li2Cr1,-1.48939425,1.2459917911111087 -Ni1H4C6I2N2_25_13347.vasp,Ni1H4C6I2N2,-4.87516409,0.3892787586666597 -Rh2S2F2_59_15218.vasp,Rh2S2F2,-2.595252975,0.0863027269696927 -Rb2I2_129_14895.vasp,Rb2I2,-0.499132385,0.1203765099999999 -In8Se12_14_8718.vasp,In8Se12,-1.895473362,0.088848064 -Sn3S4_164_16927.vasp,Sn3S4,-2.461068567142857,0.0667494449999976 -V1Ge1Cl4_3_19839.vasp,V1Ge1Cl4,-2.058559403333333,0.1024401529166647 -Ni2F2_164_13502.vasp,Ni2F2,-0.3192184875,2.02394085375 -Ba1Ni1Sn3_99_1846.vasp,Ba1Ni1Sn3,-0.563845242,0.67227251 -Mn4C3F2_164_11426.vasp,Mn4C3F2,-4.093513482222223,0.2683660644444335 -Ge1C1F2_156_6656.vasp,Ge1C1F2,-3.6230690975,0.76453213375 -Si4O10F4_1_16496.vasp,Si4O10F4,-4.468972988888889,0.5450205133333288 -Na1Ni1P2S6_5_11914.vasp,Na1Ni1P2S6,-2.693042931,0.1325178424687469 -Hf2H2N1_164_7505.vasp,Hf2H2N1,-5.749960996,0.3147755194999999 -Ho2Cl6_59_8133.vasp,Ho2Cl6,-2.89201516375,0.0316291474999999 -Fe1Cu2I1Cl1O2_8_5672.vasp,Fe1Cu2I1Cl1O2,-1.4544672328571429,0.3820014039642821 -Li1P3_187_9777.vasp,Li1P3,-3.0011505625,0.7667420643749963 -Ge2P1O6_162_6796.vasp,Ge2P1O6,-4.733501651111111,0.4013869025231402 -Cu1Sb2S3I1Br3_1_4970.vasp,Cu1Sb2S3I1Br3,-1.274173551,0.0213460702708308 -Fe2W2Cl10_12_6029.vasp,Fe2W2Cl10,-2.030508816428572,0.1384848978571354 -V2B1H2O2_164_19988.vasp,V2B1H2O2,-4.699569217142857,0.3204466214285679 -Sr2Br2F2_129_17151.vasp,Sr2Br2F2,-2.850692575,0.0614460949999995 -Na2H8S4Br2_2_12139.vasp,Na2H8S4Br2,-2.76087310125,-0.0775809756250001 -V2S2N1F2_164_20158.vasp,V2S2N1F2,-3.5886187557142857,0.3087633973809449 -Te6P2Au2_2_18664.vasp,Te6P2Au2,-1.245953535,0.2513417411944426 -Nb2Pd1S6_12_12812.vasp,Nb2Pd1S6,-4.045526632222223,0.0953704277777776 -In2I2_129_8478.vasp,In2I2,-0.4250964375,0.5728343325 -Mg3P2H16O16_10_10554.vasp,Mg3P2H16O16,-4.668302963783784,0.0079734145044996 -Na8P4Se12_53_12452.vasp,Na8P4Se12,-2.33164151375,0.1603493320833333 -Tl1Cu1Te6As2_149_19259.vasp,Tl1Cu1Te6As2,-1.226320094,0.2834243330416651 -Nb2Te10Pd2_26_12898.vasp,Nb2Te10Pd2,-2.215931537142857,0.080326782857143 -Ag1B6S2N6F4_6_20.vasp,Ag1B6S2N6F4,-4.919116016315789,0.5891704792488925 -Mo2W1S1Br4_6_11697.vasp,Mo2W1S1Br4,-2.04039691125,0.6340459918750003 -Zn1S1_156_21004.vasp,Zn1S1,-0.802212525,0.3894475695 -Tl2Se2Cl2_59_19527.vasp,Tl2Se2Cl2,-0.9510796533333332,0.4365817377777765 -Ta4Pd2Se14_11_18087.vasp,Ta4Pd2Se14,-3.5087827330000003,0.1266473503333311 -Na2Mg1H4Se2O8_2_12192.vasp,Na2Mg1H4Se2O8,-3.961465947647059,0.0537938797413717 -Y2S1Cl2_164_20768.vasp,Y2S1Cl2,-4.333703248,0.0329421100000004 -Cr2H2C1_164_4396.vasp,Cr2H2C1,-3.99492448,0.3910581054999952 -Cu1Ni2S4_187_4924.vasp,Cu1Ni2S4,-1.4641552528571429,0.1313570566369013 -Sc2Se6_59_16165.vasp,Sc2Se6,-3.00300936625,0.3306332699999998 -Re4Se8_2_15117.vasp,Re4Se8,-4.1907478225,-0.0289839841666665 -Al2Zn1S4_156_1034.vasp,Al2Zn1S4,-2.8478465085714286,0.0620120864285711 -B1S1_38_1635.vasp,B1S1,-3.70934777,1.0943370024999997 -Li2B2H6C8S2_51_9833.vasp,Li2B2H6C8S2,-4.4402652835,1.1887783211111054 -In2S2_187_8552.vasp,In2S2,-2.2183837925,0.0612863725000001 -Ti2Te2_164_19045.vasp,Ti2Te2,-3.7284268225,0.7019229928124957 -W2O6_7_20524.vasp,W2O6,-5.91736234625,-0.0533265431250002 -In2S2_129_8555.vasp,In2S2,-2.071693785,0.2079763800000003 -Mn2S6_11_11227.vasp,Mn2S6,-2.84134282625,0.33376188171875 -Te8Ru6_11_18710.vasp,Te8Ru6,-2.47168422,0.3745892407142821 -Mo8O18_1_11765.vasp,Mo8O18,-5.002837231923077,0.2657733508974316 -Mg2V4O10_59_10531.vasp,Mg2V4O10,-5.09816684625,0.2685647374999949 -Fe2Sb4S8_26_5967.vasp,Fe2Sb4S8,-2.554346410714285,-0.0397883115714303 -Na2C4_129_12012.vasp,Na2C4,-4.065709776666666,1.4529250766666624 -Ta4Te10Pd2_59_18119.vasp,Ta4Te10Pd2,-3.10649764,0.0750672229166669 -Mn2B1H2S2_164_10994.vasp,Mn2B1H2S2,-3.262853611428572,0.4712520687499918 -Nb2N1Cl2_164_12764.vasp,Nb2N1Cl2,-5.074043206000001,0.0375892050952245 -Mn1Ge2C6N6_164_10754.vasp,Mn1Ge2C6N6,-6.221363256666667,0.4550893969444377 -Ba1As2F12_2_1803.vasp,Ba1As2F12,-2.801272108,-0.0161505533333334 -W2S2_164_20534.vasp,W2S2,-4.541513955,0.567311825 -K1Ge1Se2_156_8903.vasp,K1Ge1Se2,-1.7545520775,0.3637025968749999 -Si4As4Se4_17_16484.vasp,Si4As4Se4,-3.306724050833333,-0.6499355582291662 -P2Rh2O6_162_14037.vasp,P2Rh2O6,-4.464696747,0.531163342666662 -Ca10Co2_26_2785.vasp,Ca10Co2,0.4737173983333333,1.2829965966666652 -Sr4Te4S12_14_17480.vasp,Sr4Te4S12,-2.4596495705,0.096800458583331 -Cr2Hg2Pb4O12_2_4408.vasp,Cr2Hg2Pb4O12,-3.5120474725,0.0913624890000002 -Ca2I2N1_164_3053.vasp,Ca2I2N1,-2.071226998,0.3733337774999941 -Fe2Bi2S4Br2_26_5809.vasp,Fe2Bi2S4Br2,-1.931759739,-0.0358460989999996 -Al1Fe1F5_47_656.vasp,Al1Fe1F5,-2.643014292857143,0.7220859892857112 -Al2Ni2Te5_187_907.vasp,Al2Ni2Te5,-1.359878508888889,0.2437732110515824 -Ta6S18_11_18149.vasp,Ta6S18,-4.712829514166667,0.0539545308333337 -Pd1C8Br2F4_25_14354.vasp,Pd1C8Br2F4,-4.466442652666667,0.5406077833333265 -Tl8Te6_31_19655.vasp,Tl8Te6,-0.5201015971428571,0.3541208081168824 -Rb1Ti1S2_156_14760.vasp,Rb1Ti1S2,-3.5742504375,0.1879432762500004 -Sr2S4Br4F8_30_17301.vasp,Sr2S4Br4F8,-1.7523335933333335,0.5972619216666634 -Mo2P4_2_11661.vasp,Mo2P4,-3.556404205,0.8769298483333339 -Sr2I4_2_17259.vasp,Sr2I4,-0.8853556400000001,0.4006877188888887 -Cu2P2S6_162_5211.vasp,Cu2P2S6,-2.436200639,0.1401013044999999 -As2P4H2S12_4_1245.vasp,As2P4H2S12,-2.994735233,0.2280978868437465 -Ta2Te2Pd4S2_51_17905.vasp,Ta2Te2Pd4S2,-3.093604913,-0.1659784558809538 -Nb2S4Br4_12_12851.vasp,Nb2S4Br4,-3.119651465,-0.0023312199666661 -Cd4I8_115_3632.vasp,Cd4I8,0.6113853841666667,0.0558766213888888 -Sn2N2Cl2_59_16789.vasp,Sn2N2Cl2,-3.068495075,-0.8691521358333331 -Ta3B2S2_187_17944.vasp,Ta3B2S2,-6.598828698571429,0.2347703864285648 -Li2V2O4F4_11_10124.vasp,Li2V2O4F4,-4.466810958333333,-0.003434410659726 -Ge1O2_115_6683.vasp,Ge1O2,-4.67522346,0.2094087575000003 -Zn1Bi1_156_20901.vasp,Zn1Bi1,1.102216005,0.1372762025 -P1I3_187_13923.vasp,P1I3,-0.2939432875,0.4845626774999996 -Mg2Be2_164_10427.vasp,Mg2Be2,-1.1170287675,-0.1985740791666664 -Ni2Cl6_191_13500.vasp,Ni2Cl6,-0.087808365,0.36057112125 -Mn2I6_189_11117.vasp,Mn2I6,-0.23533771625,0.21524840546875 -Gd2Cl6_12_6609.vasp,Gd2Cl6,-2.87670849375,0.0665503912499976 -Mn2S2_129_11221.vasp,Mn2S2,-2.86448025,0.0930559724999997 -Pd2Br6_191_14407.vasp,Pd2Br6,-0.02790886125,0.39909646375 -Tl2Cu1F4_123_19401.vasp,Tl2Cu1F4,-1.5482576885714283,0.0735380328571428 -Sc2C1Cl2_164_16050.vasp,Sc2C1Cl2,-4.255930222,0.0392108219999993 -Hf1Mn1I2O1_8_7216.vasp,Hf1Mn1I2O1,-3.096680382,0.557445141551725 -Sc2I2O1F1_1_16092.vasp,Sc2I2O1F1,-3.390666386666666,0.2225365428472147 -Ti2Sb2S6_2_19013.vasp,Ti2Sb2S6,-3.912319817,0.2521715691666643 -Bi4O8_156_2628.vasp,Bi4O8,-3.3376057875,0.4299450584374971 -Au2Cl2_129_1467.vasp,Au2Cl2,0.43465807,0.28589132625 -Ta2I4N1O1_6_17761.vasp,Ta2I4N1O1,-3.777493965,0.2943500872455273 -As2Os2O6_162_1234.vasp,As2Os2O6,-4.66733901,0.3459522744999945 -Tl1Sn1Se2S1_1_19348.vasp,Tl1Sn1Se2S1,-1.678139868,0.3131527172083338 -Nb3C2Cl2_187_12960.vasp,Nb3C2Cl2,-5.855887627142857,0.1031298419047477 -Nb4Sn2Se8_55_13159.vasp,Nb4Sn2Se8,-3.677253547142857,0.1548070460714254 -Cd1Pb2S2Cl2_12_3394.vasp,Cd1Pb2S2Cl2,-1.4063270428571428,-0.3269882575000017 -Hg2Br2O2_59_7943.vasp,Hg2Br2O2,-0.2447615683333333,0.365322736458331 -Ta2Co2Te6_11_17705.vasp,Ta2Co2Te6,-2.798639939,0.1604614224583278 -Fe1Br2_115_5638.vasp,Fe1Br2,-0.2761463566666667,0.578963465 -Zn2Bi4Br4O6_31_21042.vasp,Zn2Bi4Br4O6,-2.384908944375,0.2271708212500002 -Ag2Hg2Te2I2_26_308.vasp,Ag2Hg2Te2I2,0.50701625125,0.0952960879166666 -Sb4Te6_11_15836.vasp,Sb4Te6,-1.690028053,0.1562776209999998 -Fe4Sn4O12_13_6090.vasp,Fe4Sn4O12,-3.7112930195,0.3237286929166649 -Al2Fe1Te4_164_830.vasp,Al2Fe1Te4,-1.9658528671428568,0.0162590144047599 -Al1H2_115_671.vasp,Al1H2,-2.563255546666667,0.5036217205555524 -P1Cl3_187_13917.vasp,P1Cl3,-1.2055026975,0.5857621949999985 -Cr1Te1S1_156_4273.vasp,Cr1Te1S1,-2.58223323,0.2383172000000004 -Cs2B2S6O2F6_1_4660.vasp,Cs2B2S6O2F6,-3.4591867577777777,0.1706049161041575 -Zr2Si2S2_99_21685.vasp,Zr2Si2S2,-4.416434878333333,0.538325256666667 -Na2Mn1P2S7Cl3_1_12210.vasp,Na2Mn1P2S7Cl3,-2.577628497333333,0.142845829666656 -Zr2S2Br2_59_21643.vasp,Zr2S2Br2,-3.768234303333333,0.0424898316666664 -Sb1Mo1Se1Br2_8_15468.vasp,Sb1Mo1Se1Br2,-1.55716776,0.5128500322499987 -Tl1Co5Cl2_123_19246.vasp,Tl1Co5Cl2,-0.8467420725,0.5741784199999991 -Ag1Cl2_115_50.vasp,Ag1Cl2,0.07518291,0.2743947833333333 -K4Cd2F8_11_9427.vasp,K4Cd2F8,-1.5002118878571429,0.1417352728571413 -C6N2_11_2776.vasp,C6N2,-7.15910972,0.65980851625 -Tl1Cu1Sb2S6_149_19256.vasp,Tl1Cu1Sb2S6,-1.899755616,0.3763036703124956 -V1Mo1S1I1Br1F3_1_19882.vasp,V1Mo1S1I1Br1F3,-2.5196447725,0.0246988682031251 -Ge3O6_5_6913.vasp,Ge3O6,-4.788939096666667,0.0956931208333333 -Zr1Nb1Te1P1Se1_8_21362.vasp,Zr1Nb1Te1P1Se1,-4.046019634,0.6018273742499942 -Cr1H5C4O6_2_4192.vasp,Cr1H5C4O6,-5.172232096875,0.2299243149739527 -Ge1Te2_187_6720.vasp,Ge1Te2,-1.72162013,-0.2221973277777791 -Mo2Cl4O2_47_11598.vasp,Mo2Cl4O2,-3.03866599875,0.0308505975000001 -Ag2As4Br2O3_6_161.vasp,Ag2As4Br2O3,-2.348053320909091,0.2396241772727225 -Mn2O2_129_11174.vasp,Mn2O2,-3.53127735,0.6793690128448278 -V2Ge1O7_1_20065.vasp,V2Ge1O7,-5.077312505,0.2090821677499956 -Zr1Ge1F6_1_21299.vasp,Zr1Ge1F6,-3.86809737,0.1809276037499998 -Sc1Ag1As2Se6_149_15887.vasp,Sc1Ag1As2Se6,-2.336448265,0.7782864514166614 -Fe2Cl6_162_5838.vasp,Fe2Cl6,-1.0750705425,-0.0372228193749999 -V3Cr1O10_115_20257.vasp,V3Cr1O10,-5.296587766428572,-0.0118932109821474 -Ag4Cl8_13_512.vasp,Ag4Cl8,-0.1035210208333333,0.0956908525 -Ni2Se2O6_11_13635.vasp,Ni2Se2O6,-3.136553511,-0.2941842495000011 -B2I6_12_1676.vasp,B2I6,-1.11180491,0.1194807037499998 -Fe1H2O2_164_5685.vasp,Fe1H2O2,-4.11213624,-0.0477703905555582 -In4S4Cl4_14_8683.vasp,In4S4Cl4,-1.998501546666667,0.0445055283333315 -Sr1W1S1Br4_38_17098.vasp,Sr1W1S1Br4,-2.0376400314285714,0.3195563642261878 -Na1Bi3_10_11828.vasp,Na1Bi3,-0.60567246,-0.1932694525 -Mn2Te3O8_5_11310.vasp,Mn2Te3O8,-3.681853837692308,0.2120573292307694 -Pr2Br2O2_164_14542.vasp,Pr2Br2O2,-4.770539435,0.1188443650000001 -B4N4_127_1758.vasp,B4N4,-7.427436115,0.3754396275000005 -Hf1Mo1Rh1S4I2_8_7234.vasp,Hf1Mo1Rh1S4I2,-2.9921121244444446,0.3453137188492017 -Pr4F10_11_14561.vasp,Pr4F10,-4.220247928571429,0.3658950490872978 -Ge2O1_8_6790.vasp,Ge2O1,-3.635042666666666,-0.1062387454166664 -Cr1Mo1F6_2_4210.vasp,Cr1Mo1F6,-2.9325512625,-0.0044185809374999 -Ba2Ag1S2Cl2_38_1886.vasp,Ba2Ag1S2Cl2,-2.2075231214285718,0.2297221611886133 -Sc2Cl6_191_16066.vasp,Sc2Cl6,-2.72354041625,0.1654845274999998 -Ag2Ge2O6_1_262.vasp,Ag2Ge2O6,-3.310771984,0.1668483674999992 -Te6As4_7_18651.vasp,Te6As4,-1.884288796,0.2291866150000001 -Mn3Br8_2_11359.vasp,Mn3Br8,-1.1324474854545454,0.0234425711363626 -Ag2Bi2O4_11_192.vasp,Ag2Bi2O4,-2.546029515,0.1408682682500002 -Cu2Se1O4_21_5292.vasp,Cu2Se1O4,-2.449320254285714,0.4575153395535691 -Nb1V1F6_123_12609.vasp,Nb1V1F6,-3.74324078875,-0.0136024400000038 -Ru3I1Cl1O3_1_15366.vasp,Ru3I1Cl1O3,-3.08566528625,0.5690451658333295 -In4P20_26_8680.vasp,In4P20,-3.4865846291666664,-0.2386180858333357 -Sn1O2_164_16661.vasp,Sn1O2,-4.17837346,0.1828458349999993 -Si4O6_11_16499.vasp,Si4O6,-5.728726506,0.3392100209999933 -In1Sn1Br2O2_1_8354.vasp,In1Sn1Br2O2,-2.550048326666667,0.1809916191666662 -Bi4O10_6_2619.vasp,Bi4O10,-3.2555184792857146,0.4534056452678534 -K4Au4Se20_49_9414.vasp,K4Au4Se20,-1.2312229189285715,0.2061162717857141 -Hf1F4_123_7156.vasp,Hf1F4,-4.682444348,0.2451933830000001 -Sm1Ge2_123_16555.vasp,Sm1Ge2,-2.7896593133333334,0.7045691027777741 -In4Te4Cl4_14_8700.vasp,In4Te4Cl4,-1.3465408,-0.6142850699999999 -Yb2F6_59_20873.vasp,Yb2F6,-4.53269461,-1.5206512215625 -Ge1Sb1Te4_6_6705.vasp,Ge1Sb1Te4,-1.7095904016666663,-0.0596028233333348 -Ga1H2S2_12_6199.vasp,Ga1H2S2,-2.76544994,0.6298217377499954 -Ga2Co2Te5_187_6337.vasp,Ga2Co2Te5,-1.6643364066666666,0.2130644031481463 -Li1Ni1P2O6_149_9761.vasp,Li1Ni1P2O6,-4.389692526999999,0.8331422267999959 -Ca3Au2S4Br2_123_3152.vasp,Ca3Au2S4Br2,-1.8167290254545452,0.1487438481818146 -Mn4C3S2_164_11429.vasp,Mn4C3S2,-4.169469898888889,0.3304255077777681 -Cu4Sb8Cl4O12_1_5463.vasp,Cu4Sb8Cl4O12,-3.0437384128571425,0.3540742630952321 -Ge4N8_26_6931.vasp,Ge4N8,-4.840613008333333,0.5098395294444393 -K2Sb2C12Br10_18_9340.vasp,K2Sb2C12Br10,-3.350938473846154,0.9233854191025586 -Bi6O4F10_26_2669.vasp,Bi6O4F10,-3.0604263975,0.1233192517500003 -Zr3Bi1Br1N2Cl1_8_21748.vasp,Zr3Bi1Br1N2Cl1,-4.65898944625,0.0169000210937478 -Cr2B1S2_164_4324.vasp,Cr2B1S2,-3.813787166,0.1336343359999956 -Zn2H4Se2O8_7_21100.vasp,Zn2H4Se2O8,-3.521825888125,0.0364252113541665 -Hg1Pb1S3_1_7893.vasp,Hg1Pb1S3,-1.219621702,-0.3443060201250025 -Mn2H8C10N4O10_4_11105.vasp,Mn2H8C10N4O10,-5.7144878697058825,0.1884683562534896 -Ta4O12_2_18080.vasp,Ta4O12,-6.16938731,0.5901445107812497 -Cr4S2N3F2_164_4623.vasp,Cr4S2N3F2,-3.951944227272728,0.4397690457575672 -Sn3P2O9_174_16920.vasp,Sn3P2O9,-4.376438980714286,0.5415049661904712 -Ta3B2Cl2_187_17937.vasp,Ta3B2Cl2,-5.852098652857143,0.0123964746428502 -V2Zn2F8_2_20234.vasp,V2Zn2F8,-2.2966966341666666,-0.0485193481250009 -Y4C3_164_20817.vasp,Y4C3,-6.027846928571429,0.1853441185714222 -Li2Cu6F20_7_9898.vasp,Li2Cu6F20,-1.3557459075,-0.0229577835714298 -K4Na2In2As4_49_9479.vasp,K4Na2In2As4,-1.2745630966666666,0.1163526608333334 -Sn6P2_191_16995.vasp,Sn6P2,-1.222385715,-0.791706483749999 -Tl18S9_143_19192.vasp,Tl18S9,-1.1510932488888888,0.1040433927777779 -Ni1B4H4I2N2_47_13272.vasp,Ni1B4H4I2N2,-3.768067310769231,0.563459308987975 -In2H2S2O8_11_8462.vasp,In2H2S2O8,-4.136028545,0.0714924261190396 -Pb2S2O8_31_14277.vasp,Pb2S2O8,-4.107776595,0.2581960316666674 -Ni4P4S4_13_13752.vasp,Ni4P4S4,-2.4132459525,0.2475706624999998 -Cs1Ti1S2_156_4655.vasp,Cs1Ti1S2,-3.499496765,0.2944472068750001 -Ta2I2_164_17759.vasp,Ta2I2,-3.4908993575,0.8326392216071363 -K4Sn4C8O16F4_14_9517.vasp,K4Sn4C8O16F4,-4.828256189166667,0.0917510297916557 -Sb2Te6Rh2_162_15742.vasp,Sb2Te6Rh2,-1.818961632,0.307431814499998 -Ba2I2F2_129_2002.vasp,Ba2I2F2,-2.661947688333333,0.0452470666666662 -Au1S2_187_1443.vasp,Au1S2,-0.8174417266666666,0.7297122497916654 -Sc4I10_11_16245.vasp,Sc4I10,-1.529051964285714,0.143198958095235 -Na1Fe1Te6P2_5_11856.vasp,Na1Fe1Te6P2,-1.773622122,0.6276857039999986 -La1Bi2_21_9563.vasp,La1Bi2,-1.8423441,0.0931891449999999 -Ni3Te1S3I1_1_13732.vasp,Ni3Te1S3I1,-0.8782474675,0.3041442759374983 -Si2C2F2_59_16395.vasp,Si2C2F2,-4.570618815,0.9549144633333276 -Re1Ag2H6_1_14989.vasp,Re1Ag2H6,-2.495298093333333,1.4166821311111075 -Au4Se4O12_14_1601.vasp,Au4Se4O12,-2.529830964,0.2740241489999993 -Zr2F2_129_21559.vasp,Zr2F2,-3.135301115,1.25063430375 -Zn1Pd3Br3Cl1O4_1_20993.vasp,Zn1Pd3Br3Cl1O4,-1.5707732433333332,0.1455377643344884 -Mo1O2_187_11527.vasp,Mo1O2,-5.19999092,0.1119141916666661 -Zr1P2H2O6_164_21390.vasp,Zr1P2H2O6,-5.6827704263636365,0.0652230090909089 -Ru1O2_164_15276.vasp,Ru1O2,-4.21882816,0.7448855050000001 -Ag2N6_49_335.vasp,Ag2N6,-4.2912384925,-0.3217687418750001 -Ge2Sb6_164_6859.vasp,Ge2Sb6,-2.0771631175,0.1787560931249996 -Sb1Te1Br1_156_15508.vasp,Sb1Te1Br1,-1.4471848633333335,0.1433739266666664 -Hg2Au2S2F2_26_7928.vasp,Hg2Au2S2F2,-0.16890653125,0.32627587375 -V2B1H2_164_19990.vasp,V2B1H2,-3.977983246,0.5095232620000005 -Al2Br2_164_774.vasp,Al2Br2,-1.60806769,0.3069980283333318 -Au2Cl2_12_1469.vasp,Au2Cl2,0.210119025,0.0613522812499999 -Ta2Te10Pd2_51_17891.vasp,Ta2Te10Pd2,-2.373570357142857,0.0733401978571426 -Cd2Ag2S2I2_26_3444.vasp,Cd2Ag2S2I2,-0.0579726775,0.138997525625 -Ba2Ag1Se2Br2_38_1889.vasp,Ba2Ag1Se2Br2,-1.78319109,0.2179125696428551 -Pd1I1F2_6_14363.vasp,Pd1I1F2,-0.8038891,0.3973839229875001 -Pb2Br4O12_13_14222.vasp,Pb2Br4O12,-2.439133308888889,0.1969505586111086 -Ca2I4O8_125_3055.vasp,Ca2I4O8,-2.680804164285714,0.2402855964999982 -Ti3B2O2F2_187_19063.vasp,Ti3B2O2F2,-5.761175834444445,0.298129809999994 -Ag2Te4Cl2_17_477.vasp,Ag2Te4Cl2,-0.6073469025,0.149852970625 -Au1S1I1Cl1_6_1439.vasp,Au1S1I1Cl1,-0.12482002,0.4016166442083316 -Ir2Rh2S3I4O1_8_8808.vasp,Ir2Rh2S3I4O1,-2.10771979,0.2580587303935075 -Cu2Sb2S6_2_5268.vasp,Cu2Sb2S6,-1.807068061,0.4172956682499977 -Cr1H4C4Cl1O6_2_4188.vasp,Cr1H4C4Cl1O6,-5.08178464875,0.1505987577083286 -Fe2Te2_123_6008.vasp,Fe2Te2,-0.79663071,0.96952554125 -Bi2Mo2_12_2473.vasp,Bi2Mo2,-2.1387305125,0.7793218399999999 -Mo2C1Cl2_164_11581.vasp,Mo2C1Cl2,-3.518306276,0.187623732666667 -Dy1As2_21_5508.vasp,Dy1As2,-2.84773575,0.6573879599999968 -Ru1Rh1S2I4_1_15284.vasp,Ru1Rh1S2I4,-1.2156497725,0.4005547858593751 -Te24W8_14_18345.vasp,Te24W8,-2.3048927975,0.3717271054166666 -Sr2Ag1Se2I2_38_17112.vasp,Sr2Ag1Se2I2,-1.346891657142857,0.0511078164285693 -Tl4P2Au2S8_11_19615.vasp,Tl4P2Au2S8,-2.018365918125,0.1314410918749997 -Li1Mn1Bi1Sb1_156_9742.vasp,Li1Mn1Bi1Sb1,-1.4924067625,0.3377869903448278 -Ge2Se2S8_7_6871.vasp,Ge2Se2S8,-2.462787795,0.3732642458680532 -Cu4H6Cl2O6_11_5419.vasp,Cu4H6Cl2O6,-2.8080406433333334,0.2224478517361072 -Cr2Se1S1I2_6_4491.vasp,Cr2Se1S1I2,-1.981980495,-0.0793845766666666 -Se20N8_14_16285.vasp,Se20N8,-2.688430578214286,0.6535262365476162 -Lu2Te6_51_10320.vasp,Lu2Te6,-1.96989348625,0.4680832506249999 -Cs2H6C2S8_4_4716.vasp,Cs2H6C2S8,-3.203074005,0.298873524097212 -Tl2P2H4O8_13_19477.vasp,Tl2P2H4O8,-4.52843141375,0.0669375799999958 -In1Pt1_47_8317.vasp,In1Pt1,-0.914528695,0.44766522 -Cr1Ag1Se2_156_4107.vasp,Cr1Ag1Se2,-1.578629645,0.2786208287499983 -V1Ag1P2Se6_5_19758.vasp,V1Ag1P2Se6,-2.441482175,0.0727497291958318 -Ca2P2H8O10F2_2_3086.vasp,Ca2P2H8O10F2,-4.678650730833334,0.0870655692013884 -V4C3S2F2_164_20314.vasp,V4C3S2F2,-4.54934849,0.1487517976683384 -In1Pt1Se2_1_8316.vasp,In1Pt1Se2,-1.7242549625,0.3788200971428528 -Ti2S2_187_19002.vasp,Ti2S2,-5.0944287375,0.1023848825 -Hf2Te2I2_59_7634.vasp,Hf2Te2I2,-2.98932987,0.049317737916664 -Bi4As2Cl2O8_5_2591.vasp,Bi4As2Cl2O8,-3.69160907875,0.0217180840624999 -In4Bi20_26_8664.vasp,In4Bi20,-0.9153704208333332,-0.4189576700000004 -Li1Cr1Ni1Te1I1_8_9681.vasp,Li1Cr1Ni1Te1I1,-1.0827515719999998,0.8299686773333304 -Cs2Os2S4I8N2_7_4764.vasp,Cs2Os2S4I8N2,-1.8378908211111111,0.2818895647222201 -Os1Br2_115_13791.vasp,Os1Br2,-1.1902208033333337,0.7992711666666623 -W4S2N3F2_164_20591.vasp,W4S2N3F2,-4.847503556363637,0.3501112199242318 -H2N2_164_6997.vasp,H2N2,-4.1795437575,-2.509897598750001 -Hf1Zr1I2O2_25_7381.vasp,Hf1Zr1I2O2,-4.622178393333333,0.2857483966666672 -Cr4N3_164_4611.vasp,Cr4N3,-4.718080354285715,0.3918667019047568 -Re6Se8I2_2_15132.vasp,Re6Se8I2,-4.12664805125,0.0775364418749999 -Cr2P4Au2O12_4_4456.vasp,Cr2P4Au2O12,-4.472071802,0.6386643171666613 -K2Se2N2Cl6O6_4_9347.vasp,K2Se2N2Cl6O6,-2.336595142222222,0.4025608614444387 -Zr4S2N3_164_21840.vasp,Zr4S2N3,-6.440832603333333,-0.0808777369444562 -Na2B2H8S8_2_11980.vasp,Na2B2H8S8,-3.3895472145,0.0288782153333335 -Cd2Te2Au2I2_26_3587.vasp,Cd2Te2Au2I2,0.40473866875,0.0035683323783333 -Li4Ti8O18_11_10234.vasp,Li4Ti8O18,-6.564170313,0.1555343901666592 -Mo2H2C1O2_164_11611.vasp,Mo2H2C1O2,-4.562046695714286,0.420114225178567 -Ni2O4_14_13551.vasp,Ni2O4,-2.5788856783333336,-0.2425985162500021 -Ba5Sc1_1_2202.vasp,Ba5Sc1,0.1491762983333333,0.9109032858333316 -Ag2P4Se3F2_6_365.vasp,Ag2P4Se3F2,-2.09302497,0.4027103161979135 -In2Te2Cl2_31_8617.vasp,In2Te2Cl2,-1.3462897283333335,-0.6140339983333335 -Ce2Te2_129_3683.vasp,Ce2Te2,-3.0702804675,-0.0189480324999999 -Tl4Te4Br4_14_19633.vasp,Tl4Te4Br4,-0.57548384,0.3329195788888882 -Ag2Te1S4_21_451.vasp,Ag2Te1S4,-1.0774337457142855,0.4259430391964264 -Pt2O2_129_14642.vasp,Pt2O2,-2.247748925,0.8650871768750004 -Re2Te2_129_15087.vasp,Re2Te2,-3.97672376,0.5885247174999999 -Re6Te8Cl2_2_15135.vasp,Re6Te8Cl2,-3.727786514375,0.0118467951041608 -Pd2C4S12_14_14408.vasp,Pd2C4S12,-3.4166144744444447,0.3231218177777739 -Ag2O4F2_11_340.vasp,Ag2O4F2,-1.7385226075,0.180418135 -Ta4H2S2N3_164_18053.vasp,Ta4H2S2N3,-6.2946419054545455,0.8264623486363536 -V1I1Br1N1_6_19861.vasp,V1I1Br1N1,-2.8303336125,0.1816912325000004 -Cu2B2S2Br2_31_5029.vasp,Cu2B2S2Br2,-1.691020085,1.2280543439583336 -Fe2Se4_11_5986.vasp,Fe2Se4,-1.74854837,0.5533103883333332 -Mg2Hg1_123_10468.vasp,Mg2Hg1,0.94401846,0.4247161883333333 -Ni4Sb4S4_13_13761.vasp,Ni4Sb4S4,-1.560113329166667,0.3976635574999998 -Fe2As2S4F2_26_5781.vasp,Fe2As2S4F2,-2.6716915400000003,-0.1709900975416699 -Ag2C4O8F4_14_229.vasp,Ag2C4O8F4,-4.251339502222222,0.1565363672222188 -Fe2Te4_14_6021.vasp,Fe2Te4,-0.51376564,1.114486275 -P1Pd1_187_13934.vasp,P1Pd1,-1.753899325,1.1665226332499972 -K2C2S2N2_31_9020.vasp,K2C2S2N2,-4.49746485625,-0.0596586425000056 -Ti2I2O2_59_18955.vasp,Ti2I2O2,-4.909920325,0.0868894099999959 -Sn2B2P2H6S6_7_16736.vasp,Sn2B2P2H6S6,-3.305153225555556,-0.0677621505158798 -P1C1_38_13915.vasp,P1C1,-5.048109335,1.0330513624999995 -Ni1P2S6_149_13390.vasp,Ni1P2S6,-2.679996317777778,0.154889317777775 -Mg2Mo4O10_59_10486.vasp,Mg2Mo4O10,-4.447212256875,0.7436955665624999 -Tl2Cu3Se6O18_2_19405.vasp,Tl2Cu3Se6O18,-3.106334958620689,0.0855548123060294 -As2Cl6_147_1203.vasp,As2Cl6,-1.54684901875,0.04605646625 -Cu4S4O12_14_5459.vasp,Cu4S4O12,-3.2205990525,0.431425945 -Na1Ga1Sb2Se6_5_11868.vasp,Na1Ga1Sb2Se6,-1.990207132,0.354271547833331 -K2U3I4O20_2_9383.vasp,K2U3I4O20,-4.6502134279310345,0.1151178841379305 -Ta3S1Br7_156_17981.vasp,Ta3S1Br7,-3.168663263636364,0.0428305254545451 -Zr4Te4F4_31_21855.vasp,Zr4Te4F4,-3.507435665,0.2987862316666598 -Yb2Br2F2_129_20861.vasp,Yb2Br2F2,-2.961381578333333,0.0371378683333336 -Mn2Br2O2_59_11030.vasp,Mn2Br2O2,-2.8595214566666667,0.0401729580555527 -Ca2Sn4Cl12_2_3128.vasp,Ca2Sn4Cl12,-1.7545334266666666,0.0406502583333316 -Mo1Br2_187_11500.vasp,Mo1Br2,-1.2158315066666667,0.6471504374999999 -Ni2Br1Cl1_6_13477.vasp,Ni2Br1Cl1,0.1606223725,1.6493454625 -Nb2C1Cl2_164_12660.vasp,Nb2C1Cl2,-5.217297598,0.0244680859999997 -Nb4Cr2O12_2_13063.vasp,Nb4Cr2O12,-6.301302279444445,0.1273318798611047 -Ga2Te2_129_6512.vasp,Ga2Te2,-1.6515591425,0.2816410733333334 -Li4B1O4_38_10160.vasp,Li4B1O4,-4.633459912222222,0.355093188333328 -Zr2As2S6_2_21504.vasp,Zr2As2S6,-3.89000329,0.1932790378749973 -Sc2O6_2_16116.vasp,Sc2O6,-4.8816115075,0.5058592884375002 -Ag2Te4I2_1_479.vasp,Ag2Te4I2,-0.3451370125,0.2670192133333333 -H2Au1_187_6988.vasp,H2Au1,-1.25358725,2.46269680333333 -Al2H10C4Cl4_10_853.vasp,Al2H10C4Cl4,-3.701869786000001,0.4274075621666635 -Tm2Cl6_59_19676.vasp,Tm2Cl6,-2.86020707,0.06455631625 -Y1I2_187_20644.vasp,Y1I2,-2.3305604866666667,0.0722023227777755 -Ba2Br4_51_1930.vasp,Ba2Br4,-1.8207114333333327,0.3970482566666666 -Nb2Se3S1Br1Cl3_1_12879.vasp,Nb2Se3S1Br1Cl3,-2.777392,0.2858347210468662 -Mn2Se1I2_8_11271.vasp,Mn2Se1I2,-1.30205745,0.0500471015172393 -Ce1I2_123_3646.vasp,Ce1I2,-1.84192966,0.0055509166666667 -Sn1Br1Cl1O1_6_16617.vasp,Sn1Br1Cl1O1,-2.0627509075,0.2389918151562502 -K2Cd4Se2S6Br6_31_9062.vasp,K2Cd4Se2S6Br6,-0.8606018049999999,0.2779804965833309 -Tm2S2I2_59_19683.vasp,Tm2S2I2,-3.2128477466666667,0.0476294449999996 -Ta2Te6As2_2_17919.vasp,Ta2Te6As2,-2.931852103,0.3407283200833321 -Cr3N2_5_4567.vasp,Cr3N2,-4.056530558,0.9808668126666618 -Ag2W1O4_1_490.vasp,Ag2W1O4,-3.4559134285714284,0.1682185196428549 -Tl3V5O14_157_19583.vasp,Tl3V5O14,-4.786165327272728,0.1564818849999998 -Mn1Au1Br2N2_1_10638.vasp,Mn1Au1Br2N2,-2.138339353333333,0.5971333312499973 -Ca2H8Cl4O4_30_3038.vasp,Ca2H8Cl4O4,-3.643486480555555,0.0614132350000002 -Zr2F6_162_21563.vasp,Zr2F6,-4.07818942125,0.4791531943749995 -Cu1Sb1S2Cl2_8_4964.vasp,Cu1Sb1S2Cl2,-1.4301621516666667,0.3187624398784704 -Ga1Br2_164_6144.vasp,Ga1Br2,-1.0314395133333334,0.2752806158333334 -Nb1Sb2_187_12572.vasp,Nb1Sb2,-3.4780753866666667,0.3940717433333334 -Al2Te2S8F2_11_1009.vasp,Al2Te2S8F2,-2.4265089314285717,0.5711818601488051 -Ta2V2Te10_11_17934.vasp,Ta2V2Te10,-2.7625978121428574,0.0639238676785685 -Er1P2_21_5544.vasp,Er1P2,-3.16943908,0.96783599833333 -Ag2H4C4Br2N2_2_272.vasp,Ag2H4C4Br2N2,-4.15580759,0.1787332010714181 -Tl1Au1I3Br1_6_19219.vasp,Tl1Au1I3Br1,0.2202337599999999,0.1105936616666667 -Cd1Au1Br2_6_3268.vasp,Cd1Au1Br2,0.6324974475,1.021743523125 -H2Au1S2_12_6987.vasp,H2Au1S2,-2.086981586,0.2119301876874977 -Ta2Te1S1I1N1_8_17896.vasp,Ta2Te1S1I1N1,-4.850102345,0.3742462775810127 -Li5Br3O2_115_10257.vasp,Li5Br3O2,-2.677416925,0.3098737790000003 -Fe3Ge1Se2_187_6051.vasp,Fe3Ge1Se2,-1.616192635,0.1725786716666653 -Te4Au4O12_14_18576.vasp,Te4Au4O12,-2.59250817,0.3937264099999993 -Co3Te1O8_164_4074.vasp,Co3Te1O8,-3.8539850216666665,-0.208928485000003 -Ni2Te1Se3Cl2_1_13656.vasp,Ni2Te1Se3Cl2,-0.88607145375,0.2900410317968743 -Fe2C1F2_164_5826.vasp,Fe2C1F2,-2.849299736,0.8406104000000005 -Ga2Te2Br2_59_6498.vasp,Ga2Te2Br2,-1.31893334,0.2108109 -Cd1S1_123_3412.vasp,Cd1S1,-0.189142845,0.55227086625 -Ga1Te1I1_3_6289.vasp,Ga1Te1I1,-1.0731386966666667,0.1849734574999999 -Au2S4Cl2_17_1524.vasp,Au2S4Cl2,-1.11256416625,0.1566518268749999 -U4Se10_10_19737.vasp,U4Se10,-4.744522326428571,-0.0022875480000039 -Ca2Ce2_59_2975.vasp,Ca2Ce2,-0.429500585,1.0293846675 -Mn1Ga1S3_3_10723.vasp,Mn1Ga1S3,-2.4910988620000003,0.5445703632499999 -Hf2Sb1S2_164_7582.vasp,Hf2Sb1S2,-4.873051086,-0.2519331733749994 -K2C4O6F6_2_9033.vasp,K2C4O6F6,-4.401402756111112,-0.0550893494444477 -Ga18S9_143_6104.vasp,Ga18S9,-2.1806857874074077,0.0880982025925904 -Mn1Cr1Cu1S2I4_1_10677.vasp,Mn1Cr1Cu1S2I4,-1.166742558888889,0.0788773401620345 -Ti2O2F2_59_18973.vasp,Ti2O2F2,-6.100815748333333,-0.275136131666672 -Zr2O2_10_21620.vasp,Zr2O2,-5.613363815,0.9279051916666674 -K2C4N6_11_9030.vasp,K2C4N6,-6.017658841666666,-0.150716644791671 -Na2Ta2F12_4_12311.vasp,Na2Ta2F12,-4.066418408125,-0.0891043843750001 -Hg2Te2Br2_59_8027.vasp,Hg2Te2Br2,0.3732562966666666,0.0539778467424245 -Tl2As2S6_5_19363.vasp,Tl2As2S6,-2.212719625,0.4773635386249973 -Cr3Te8Mo1_25_4583.vasp,Cr3Te8Mo1,-1.95011198,0.0348961866666669 -Cr2Se6_59_4506.vasp,Cr2Se6,-2.38450031375,0.2673610358333335 -Sn1Cl2_187_16626.vasp,Sn1Cl2,-1.3727419966666667,0.2059179616666666 -Cu2Br2N2O2_31_5047.vasp,Cu2Br2N2O2,-2.3782361225,0.2669636037499998 -C1S2_164_2736.vasp,C1S2,-3.050381756666667,1.4003165795833292 -V2O6_51_20131.vasp,V2O6,-4.8426379875,0.3532637464062498 -Al2Sn2S2_164_993.vasp,Al2Sn2S2,-2.595845455,-1.1182699873611126 -In2O2_164_8510.vasp,In2O2,-3.15425714,0.4260620575000002 -P6C2_164_14133.vasp,P6C2,-4.56785142875,0.4957269124999999 -C4O4_57_2766.vasp,C4O4,-5.96550883625,0.7091441812500006 -Hg1Se2_164_7915.vasp,Hg1Se2,-0.0435961166666666,0.1977302244444443 -Li2Ni1F2_123_10019.vasp,Li2Ni1F2,-2.2410068880000003,1.3997464439999996 -Al4Sb20_26_1089.vasp,Al4Sb20,-1.8996850204166664,0.1389873362499982 -Mn1H2_164_10765.vasp,Mn1H2,-2.915545943333333,0.5586238275000004 -Ti2Te2Br2_59_19035.vasp,Ti2Te2Br2,-3.27987188,0.1357642533333263 -Ga4Te4Cl4_14_6577.vasp,Ga4Te4Cl4,-1.6818942533333334,-0.8174970475000001 -Bi2N18_2_2477.vasp,Bi2N18,-5.7844662615,-0.7574039017499992 -V1Ru1Cl2O2_6_19906.vasp,V1Ru1Cl2O2,-3.659306855,0.1722322046527689 -Na1Ni1Sb2Te6_5_11919.vasp,Na1Ni1Sb2Te6,-1.186967873,0.2612213863999968 -Ca4Se4S12_14_3240.vasp,Ca4Se4S12,-2.50998439,0.177031876416664 -K1Ti1Te2_156_8948.vasp,K1Ti1Te2,-2.4417441875,0.2675396125862009 -Mn2F2_164_11063.vasp,Mn2F2,-2.383623565,0.2377756806896551 -H6W2_11_7088.vasp,H6W2,-3.7799784875,1.59371810625 -Ti3B2Te2F2_187_19069.vasp,Ti3B2Te2F2,-4.379419617777778,0.4265766148148107 -Nb2Sn2Sb2_129_12897.vasp,Nb2Sn2Sb2,-3.026945248333333,0.694385688333333 -Cr2B1H2_164_4321.vasp,Cr2B1H2,-3.604444518,0.998598717000001 -Ni1B4I2N2F4_47_13273.vasp,Ni1B4I2N2F4,-3.890230262307692,0.2757794466666586 -Fe2Te2S8_31_6001.vasp,Fe2Te2S8,-2.0378366983333334,0.0648188184027759 -Ag1Au1Se2_25_14.vasp,Ag1Au1Se2,-0.4178954125,0.23719558953125 -Ti4Se4I4_7_19164.vasp,Ti4Se4I4,-3.3863316075000003,-0.5277008016666693 -Cu2Mo1O4_111_5182.vasp,Cu2Mo1O4,-3.181703091428571,0.5462708869047606 -Dy2Cu2Pb2Se6_51_5525.vasp,Dy2Cu2Pb2Se6,-2.287449768333333,0.1900303466666666 -Ag2Te4Mo1O12_5_480.vasp,Ag2Te4Mo1O12,-3.3956635884210526,0.1483224831907872 -Cd1H1S1Cl1_156_3331.vasp,Cd1H1S1Cl1,-1.4246743175,0.1242782249999998 -Nb2Co2Te6_11_12694.vasp,Nb2Co2Te6,-2.56504164,0.1245563874166617 -Si1H2_115_16340.vasp,Si1H2,-2.9608236666666667,1.253065839999996 -As2Rh2O6_162_1283.vasp,As2Rh2O6,-4.104532122,0.1168371002727193 -Ni1Pd2F5_8_13401.vasp,Ni1Pd2F5,-1.1333577825,0.2549212509374997 -Cu1Sn1S4_10_4985.vasp,Cu1Sn1S4,-1.9315794566666664,0.2986885204166647 -Cr2Ni1Se4_164_4431.vasp,Cr2Ni1Se4,-2.0593802528571428,0.2197541980952344 -Sb2Ir2Se6_162_15599.vasp,Sb2Ir2Se6,-2.530164783,-0.0636853282000022 -Ir1Au2Se1S2Br1_1_8725.vasp,Ir1Au2Se1S2Br1,-1.1653459828571429,0.4293491948214274 -Te6P2Pt2_2_18669.vasp,Te6P2Pt2,-1.926364339,0.5395121146666654 -Cu1Sb3S6_143_4971.vasp,Cu1Sb3S6,-2.197848122,0.3163303026249959 -Ti2Cl6_162_18926.vasp,Ti2Cl6,-3.14800790875,0.11294512 -In2O2_123_8512.vasp,In2O2,-2.7270015575,0.8533176400000002 -Tl1Si1Te3_143_19347.vasp,Tl1Si1Te3,-1.325640918,0.4526487345000003 -Fe1S2_164_5746.vasp,Fe1S2,-2.1492313866666666,-0.2131054716666667 -Cu1Au1Se2_25_4841.vasp,Cu1Au1Se2,-0.5597914225,0.2336048104166667 -Ge2N2_187_6788.vasp,Ge2N2,-4.9295386325,-0.0220952299999996 -Cu4H4S4F4_53_5416.vasp,Cu4H4S4F4,-1.60129474625,0.6522777345833334 -Au1I2_187_1429.vasp,Au1I2,0.78998532,0.3168668312500004 -Al18Te9_143_591.vasp,Al18Te9,-1.732044931111111,0.6131168155555535 -Ta2Pd2S10_51_17827.vasp,Ta2Pd2S10,-3.5880596242857146,0.1383813472321361 -Zr4C3O2_164_21813.vasp,Zr4C3O2,-6.982190083333333,-0.2651921322222272 -Be1Ge2_164_2222.vasp,Be1Ge2,-2.76430225,-0.5652659050000022 -Ca3Co2Cl2O5_123_3161.vasp,Ca3Co2Cl2O5,-3.747152284166667,-0.3113960631944483 -Ta2O6_59_17817.vasp,Ta2O6,-6.576472175,0.1830596457812499 -Sc2H2N1_164_16084.vasp,Sc2H2N1,-4.678266372,-0.0175584679999993 -Sc4F6_12_16238.vasp,Sc4F6,-3.989816284,-0.2663877510000033 -Nb13S26_2_12459.vasp,Nb13S26,-4.852967579230769,0.1044178257692314 -Fe6Te8_6_6099.vasp,Fe6Te8,-1.1842354364285714,0.5228189564285695 -Si2Au2O6_51_16386.vasp,Si2Au2O6,-4.055290122000001,0.2736368149999988 -Hg1O1_123_7886.vasp,Hg1O1,-0.340030245,0.4308151233333332 -Ag2B2S2I2_31_183.vasp,Ag2B2S2I2,-1.387938175,0.8401675587499999 -K1Rb1Mg6O7_99_8930.vasp,K1Rb1Mg6O7,-3.258274708,0.2472479099999943 -Si6Sb6_12_16544.vasp,Si6Sb6,-3.0770087608333334,-0.4401506995833335 -Cr2Au2O8_51_4317.vasp,Cr2Au2O8,-3.504950980833333,-0.1472386637500027 -Tb1Bi2_21_18169.vasp,Tb1Bi2,-1.71829384,-0.2235253550000013 -Tl2Pt4S6_164_19490.vasp,Tl2Pt4S6,-2.283493458333333,0.1346862249999998 -W4N3_164_20586.vasp,W4N3,-6.585891295714285,-0.4674666842857202 -V2H3O5_8_20080.vasp,V2H3O5,-4.936904527,0.0699890655833288 -Ca2Pb4Cl12_2_3098.vasp,Ca2Pb4Cl12,-1.772605997777778,0.0204215338888869 -Na2Os2S2N2F10_4_12253.vasp,Na2Os2S2N2F10,-3.177067013888889,-0.1294808461527845 -Te4O8_14_18600.vasp,Te4O8,-3.6372983641666665,0.0159418520833334 -Li1Co1O2_156_9673.vasp,Li1Co1O2,-3.809228055,0.4035607799999994 -Be1O2_123_2225.vasp,Be1O2,-4.019249766666666,1.2540018254166627 -In2Te4_12_8636.vasp,In2Te4,-1.0284292083333333,0.3623111099999972 -Fe1Ge1Br1O1_1_5677.vasp,Fe1Ge1Br1O1,-2.27508739,0.2933140243750001 -W3C2F2_187_20557.vasp,W3C2F2,-5.393356282857143,0.2045848460714233 -V1I5_10_19871.vasp,V1I5,-0.3682132483333333,0.2055166039583328 -Na1Co1As2Se6_149_11843.vasp,Na1Co1As2Se6,-2.218266522,0.2486407505833312 -Hf2As1Se2_164_7428.vasp,Hf2As1Se2,-4.937648952,0.0937768810000005 -Hf3Zr1Se8_6_7758.vasp,Hf3Zr1Se8,-4.258175783333333,0.3102261243750011 -Ru2S2F2_59_15339.vasp,Ru2S2F2,-2.94930564,0.2340113716666632 -In1Au2Se2I2_1_8203.vasp,In1Au2Se2I2,-0.4555270657142857,0.337023702008927 -Ir2I6_189_8792.vasp,Ir2I6,-0.3619833275,0.48048405375 -In2Cl6_189_8404.vasp,In2Cl6,-1.26107875875,0.1798866812499999 -Sr3Fe2S5I2_123_17380.vasp,Sr3Fe2S5I2,-2.277201948333333,-0.1455829848611134 -Ga2Te6P2_143_6522.vasp,Ga2Te6P2,-1.859918476,0.2714253746666651 -Sr2B2O6F2_59_17137.vasp,Sr2B2O6F2,-4.654526018333333,0.5519673495833297 -Li4Al4H16_14_10154.vasp,Li4Al4H16,-3.00477105,0.0855373908333305 -Na2H8C2N8O6_2_12132.vasp,Na2H8C2N8O6,-5.047646385769231,0.0128278284615226 -Mn2Ga2Te5_156_11083.vasp,Mn2Ga2Te5,-1.6384891577777778,0.2229178871902917 -Mn2Ir1Se4Br3_1_11131.vasp,Mn2Ir1Se4Br3,-1.835292294,0.2254887309861076 -Ca1O2F2_1_2862.vasp,Ca1O2F2,-2.544970076,1.1041444205000004 -Cr1Cu1S2Br2_1_4152.vasp,Cr1Cu1S2Br2,-1.4155301566666667,0.1831147915972206 -Zr1I2_187_21312.vasp,Zr1I2,-1.937033893333333,0.0913257883333333 -In2Te2H2O8_11_8620.vasp,In2Te2H2O8,-3.8557650321428567,0.1367797375396748 -H2Pb1S2_164_7002.vasp,H2Pb1S2,-2.735925056,-0.5275497065 -Re3Te1Pd1Se3I4_1_15099.vasp,Re3Te1Pd1Se3I4,-2.349349413333333,0.3545396614583332 -Ti1Bi1As1_156_18740.vasp,Ti1Bi1As1,-3.59844537,0.2820564016666635 -Zr1Co1Br6_5_21279.vasp,Zr1Co1Br6,-1.64360249625,0.1295045118749988 -V2Te2Br2_59_20201.vasp,V2Te2Br2,-1.9444250566666668,0.229387241111109 -Cr1C4S6F5_1_4137.vasp,Cr1C4S6F5,-3.532744809375,0.5039967247656252 -Hf1S2_123_7281.vasp,Hf1S2,-4.812158266666667,0.6296059999999999 -Sc4S4Br3Cl1_6_16256.vasp,Sc4S4Br3Cl1,-3.6122471325,0.0349589358333329 -Mg2Ga2Se5_164_10458.vasp,Mg2Ga2Se5,-2.3664282422222223,0.0433935238888891 -Ni1W2O8_2_13439.vasp,Ni1W2O8,-5.030946975454546,-0.1290244380681882 -Zn2As2O6_147_21026.vasp,Zn2As2O6,-3.186699673,0.4073607638750005 -Ag1Ge1Te1Cl1_6_65.vasp,Ag1Ge1Te1Cl1,-1.1085462225,-0.0226950506250001 -Sr1C2_164_17034.vasp,Sr1C2,-2.482403316666667,3.0196791216666616 -Na2Ni1H4Se2O10_2_12234.vasp,Na2Ni1H4Se2O10,-3.639472846842106,-0.0034494544298304 -Ir2I2O2_59_8788.vasp,Ir2I2O2,-2.4661112616666667,0.5200018583333299 -Cu2Sb4S3Br2_6_5276.vasp,Cu2Sb4S3Br2,-1.5916621136363638,0.0043209505302995 -B3Mo4H2S2_164_1735.vasp,B3Mo4H2S2,-4.063206321818182,0.569759382272719 -Pd2I6_189_14438.vasp,Pd2I6,0.2694875575,0.3925765410937499 -Rb2H8I2_127_14861.vasp,Rb2H8I2,-1.4713891125,1.952287009166664 -Co2Bi1S2_187_3859.vasp,Co2Bi1S2,-2.151413808,0.0692695344814799 -Te2As1_115_18348.vasp,Te2As1,-1.5673042366666667,0.4558895652777761 -Al2Te3_150_1016.vasp,Al2Te3,-1.788571314,0.42671678025 -Re2S2_6_15078.vasp,Re2S2,-4.9222861875,0.7077692656250001 -As2Pt3O8_164_1280.vasp,As2Pt3O8,-3.439554303846154,0.2664541567307656 -Zr4Se4Br4_31_21847.vasp,Zr4Se4Br4,-3.2434305875,0.1563342825 -Na4H16C4N4O8_14_12387.vasp,Na4H16C4N4O8,-4.611471875555555,-1.3833992829861204 -V2O2_164_20125.vasp,V2O2,-5.01493478,0.5178953633333286 -Sn2P2S6_7_16822.vasp,Sn2P2S6,-2.766148547,0.2922775040000003 -Zr3Te2H2N2_187_21790.vasp,Zr3Te2H2N2,-4.493228956666666,-0.1421155000793744 -Sn8S2F12_4_17009.vasp,Sn8S2F12,-2.531977953636364,0.1138559249999977 -Cr1Ag1Te6As2_5_4110.vasp,Cr1Ag1Te6As2,-1.520406649,0.1745734551249984 -C1I2_187_2731.vasp,C1I2,-0.7206978266666666,1.730563331249998 -Sb2S4_14_15685.vasp,Sb2S4,-2.2192217933333334,0.5537532732291641 -Sb2H6Pb2C2S6_7_15585.vasp,Sb2H6Pb2C2S6,-3.352394711111111,-0.0330569150347333 -Te2W4O16_13_18538.vasp,Te2W4O16,-5.184281049545454,0.0768105026136325 -Tl8S6_31_19652.vasp,Tl8S6,-1.1723635092857143,0.2774514406249978 -K4H6Ir2N2Cl10_31_9454.vasp,K4H6Ir2N2Cl10,-2.599121042083333,0.0761532677083334 -As4Pt4S4_13_1355.vasp,As4Pt4S4,-2.8172960408333334,0.2158348579166664 -Hf4B3S2_164_7768.vasp,Hf4B3S2,-5.989120541111111,0.1559646438888831 -Zn1Re2O8_147_20998.vasp,Zn1Re2O8,-5.122479808181819,0.0545079309090903 -Ti3Te2H2N2_187_19112.vasp,Ti3Te2H2N2,-5.153359502222222,0.6297143361111064 -Cd1H4Br2N6_1_3343.vasp,Cd1H4Br2N6,-3.861352208461539,-0.1306462356730815 -Ag2P4O12_12_357.vasp,Ag2P4O12,-4.302362213888888,0.3306742988888898 -Zr2C4_129_21546.vasp,Zr2C4,-5.726755156666666,1.3013548833333282 -Ca2Cu1Br2O2_123_2993.vasp,Ca2Cu1Br2O2,-2.7409200528571427,-0.1292087921428637 -La2Bi2Se4O2_129_9578.vasp,La2Bi2Se4O2,-3.89468499,0.0014608914166623 -Li2Ag1O2_12_9816.vasp,Li2Ag1O2,-2.74069625,0.2904612700000004 -Tb2Sn1_164_18210.vasp,Tb2Sn1,-1.6110588333333336,0.6357394906249996 -Tb1Sn2_123_18181.vasp,Tb1Sn2,-1.5593120133333331,0.2177589316666668 -Hf1Zr2Nb1Se1Cl5O2_1_7410.vasp,Hf1Zr2Nb1Se1Cl5O2,-4.184713988333333,0.3103550931111045 -Li2Au2F8_13_9830.vasp,Li2Au2F8,-1.7149835775,0.1018766979166667 -Sn2Hg1O2F2_12_16776.vasp,Sn2Hg1O2F2,-2.349699822857143,0.3199715723275842 -Pd1Pt2Br1Cl1O4F1_1_14378.vasp,Pd1Pt2Br1Cl1O4F1,-2.029306438,0.4030106178333316 -Cu4O4F8_14_5433.vasp,Cu4O4F8,-1.274597585,0.5374923840625 -Li2H6I2N2_4_9946.vasp,Li2H6I2N2,-3.6529276066666663,-3.2157860195833337 -Al1Au1S2Br2_6_611.vasp,Al1Au1S2Br2,-1.5924780783333334,0.212421023697915 -Co2Bi1Se2_187_3860.vasp,Co2Bi1Se2,-1.804684472,0.1737568056250001 -Ba10Ir2_26_1798.vasp,Ba10Ir2,-0.244559925,0.3319090419444438 -As10_6_1119.vasp,As10,-3.046411335,0.1647732249999998 -Zn1Cu1S2I1Cl1_1_20919.vasp,Zn1Cu1S2I1Cl1,-0.55666421,0.4046561896701368 -Ti3Pd1Se4_6_19099.vasp,Ti3Pd1Se4,-4.2139240025,-0.4620783514583362 -K4As4O8_57_9409.vasp,K4As4O8,-3.713757719375,-0.034641105625 -K2Os2I8N2O4_7_9279.vasp,K2Os2I8N2O4,-2.198802341111111,0.2860174215972202 -Zr1Ni2Te1Se4I2_1_21382.vasp,Zr1Ni2Te1Se4I2,-1.488075435,0.1923709979999998 -K2Bi2P4S12_4_9003.vasp,K2Bi2P4S12,-2.802737954,0.1785513010000001 -Cu1Ag1Te1Br1_6_4830.vasp,Cu1Ag1Te1Br1,-0.0788999475,0.1568272574999999 -Mn1Pd1Br3O1_1_10842.vasp,Mn1Pd1Br3O1,-1.571656615,0.0472254416666652 -Mo1F2_12_11510.vasp,Mo1F2,-2.91693266,0.1774582583333304 -Li1As2Pd1Se6_149_9654.vasp,Li1As2Pd1Se6,-2.182681745,0.2420465519166646 -Cr2C2F2_59_4347.vasp,Cr2C2F2,-4.123944135,0.681418781666663 -Sb2Te6Pd2_2_15740.vasp,Sb2Te6Pd2,-1.379012255,0.3150906317999982 -Bi2Te2O1_1_2560.vasp,Bi2Te2O1,-2.093072176,0.2378285226666645 -Cr2As2_12_4312.vasp,Cr2As2,-3.0101051075,0.39524473625 -Cd3B2S6_150_3609.vasp,Cd3B2S6,-2.050988809090909,0.3687183813636337 -As4Pb6O16_14_1348.vasp,As4Pb6O16,-4.015607705384616,0.1145717126923067 -Rh2Se2Br2_11_15233.vasp,Rh2Se2Br2,-1.8517570933333332,0.0870294566666665 -Te2C1_164_18380.vasp,Te2C1,-2.208064713333333,1.5452342611111076 -Hf2Ti2O8_26_7650.vasp,Hf2Ti2O8,-7.102176689166666,0.4234975225000008 -Nb3Se2S2Br4_1_13015.vasp,Nb3Se2S2Br4,-3.318451974545454,0.1785603460795386 -Nb2Br4O2_6_12654.vasp,Nb2Br4O2,-3.19607428875,0.78145520625 -Rb2B2S6_4_14775.vasp,Rb2B2S6,-3.024259716,0.3373232404999999 -Sc2Se2_164_16160.vasp,Sc2Se2,-3.189764985,0.6021899325 -La1Al3Cu1_99_9559.vasp,La1Al3Cu1,-1.632480862,0.8559977120000002 -Sb2S2Br2_59_15674.vasp,Sb2S2Br2,-1.9576525833333331,-0.6822569016666666 -Rh1F3_6_15152.vasp,Rh1F3,-2.0608408375,0.1524777787500002 -Cu2Br6_162_5057.vasp,Cu2Br6,0.13227797375,0.2321278625 -Ce1Si5_47_3658.vasp,Ce1Si5,-3.555295558333333,0.0316212183333335 -Ni2As2Se6_162_13452.vasp,Ni2As2Se6,-1.6926367160000002,0.3005748226999971 -Co2Sn8_125_4030.vasp,Co2Sn8,-1.153977389,-1.144880067 -Tl2S2_123_19508.vasp,Tl2S2,-1.18796163,0.40786205109375 -Pt4_12_14711.vasp,Pt4,-0.9642450825,2.4075528575 -Li1V2O1F5_8_9809.vasp,Li1V2O1F5,-3.881228723333333,-0.133597199148156 -Ni2Sb2I2O4_10_13606.vasp,Ni2Sb2I2O4,-2.284844121,0.793008730249996 -Sb2S2Br2_1_15673.vasp,Sb2S2Br2,-1.9182407633333332,-0.6428450816666667 -Ga1Si1S3_143_6279.vasp,Ga1Si1S3,-2.848108858,0.6229152719999975 -Co2Sb2Pt2_129_3998.vasp,Co2Sb2Pt2,-1.7450239950000002,0.4398589883333309 -Ni2Se3_6_13645.vasp,Ni2Se3,-0.9325809,0.2909097949999987 -Na3Y1Cl6_10_12360.vasp,Na3Y1Cl6,-2.517080686,0.1178800940000002 -Cu2Mo1Se4S1Br2_1_5186.vasp,Cu2Mo1Se4S1Br2,-1.406622041,0.2816751832023801 -Ni2Cl2O4_11_13493.vasp,Ni2Cl2O4,-1.99992301,-0.1684636276562499 -Tb5I8_10_18216.vasp,Tb5I8,-1.6182516169230767,0.1012049976923061 -Pb2Br2Cl2_129_14216.vasp,Pb2Br2Cl2,-1.14876027,0.0911779258333332 -Te1Au2S1Br2_1_18288.vasp,Te1Au2S1Br2,-0.2522669983333333,0.3054197634027768 -Sc1Cu1Te6P2_149_15932.vasp,Sc1Cu1Te6P2,-1.965518613,0.3237035102499986 -Cu1Au1O2_10_4839.vasp,Cu1Au1O2,-1.57143537,0.3826586939062499 -Li1In1Te6P2_5_9739.vasp,Li1In1Te6P2,-1.882786209,0.3015163261666652 -Zn1Mo1C1Br1Cl1_1_20971.vasp,Zn1Mo1C1Br1Cl1,-2.058357212,0.5067423035625 -Rb2C2S6O2F6_1_14790.vasp,Rb2C2S6O2F6,-3.2393094616666667,-0.0980091385416742 -Ag4S2_11_541.vasp,Ag4S2,-0.2316951416666667,0.186648545 -Hf3N1Cl2O2_12_7718.vasp,Hf3N1Cl2O2,-5.8491343275,0.4946996006249962 -Sc1Cu1Sb2S6_149_15928.vasp,Sc1Cu1Sb2S6,-2.601910137,0.3578788727499953 -Mn1Cu1Se2Br2_1_10692.vasp,Mn1Cu1Se2Br2,-0.9178079883333332,0.3701600491071413 -La2Se2_12_9613.vasp,La2Se2,-3.887229145,0.3150465100000001 -Ni1C6S4F8_10_13304.vasp,Ni1C6S4F8,-3.678787981052632,0.3415218910526229 -Te4Au4_2_18578.vasp,Te4Au4,-0.23800374375,0.19063290375 -Ni2S2_123_13588.vasp,Ni2S2,-0.91260253,0.5158584933333317 -Mg2Bi4O8_11_10431.vasp,Mg2Bi4O8,-3.86899415,0.003004057142854 -Sc2Nb3Te2Pt1Au1Se5I1_1_16109.vasp,Sc2Nb3Te2Pt1Au1Se5I1,-3.048872928,0.1133675903086337 -Te1Pb1Se1_1_18320.vasp,Te1Pb1Se1,-1.2835533733333333,0.5403513078472206 -Ga1Ag1P2S6_149_6116.vasp,Ga1Ag1P2S6,-2.77179572,0.0530097071197895 -Ni1B4C2I2F4_47_13267.vasp,Ni1B4C2I2F4,-3.583032736923077,0.3988718252243488 -Zn2Se1S1N1_1_21164.vasp,Zn2Se1S1N1,-1.527690898,0.3357246058000003 -Cr1Br2_115_4131.vasp,Cr1Br2,-1.0405074566666668,0.4362696922222208 -Ru1S1F2_47_15288.vasp,Ru1S1F2,-2.512112295,0.3517095724166647 -La2C2Br2_12_9584.vasp,La2C2Br2,-4.633481571666667,1.662110140555549 -Sn2Te2Br2_59_16888.vasp,Sn2Te2Br2,-1.1585879916666666,-0.3012185797222231 -Nb1Mo1Cl4_6_12532.vasp,Nb1Mo1Cl4,-2.643592313333333,0.3606273095370298 -Nb3Te1I7_156_13024.vasp,Nb3Te1I7,-2.0658098918181818,0.0905609481818183 -Mn1Te2W1O1_8_10910.vasp,Mn1Te2W1O1,-2.935367078,0.7121710015918299 -Te12N12_7_18275.vasp,Te12N12,-3.165256495416666,0.3875116941666668 -Mg2Bi8O18_13_10434.vasp,Mg2Bi8O18,-3.623604788571429,0.1638685300892786 -Sn2Sb2H2S6_7_16856.vasp,Sn2Sb2H2S6,-2.42269191,0.3748827852083312 -Mo2Br10_3_11568.vasp,Mo2Br10,-0.7599966225,0.2601528766666666 -Te1O1_6_18313.vasp,Te1O1,-2.45678758,0.6760890213541668 -Mo2N1_164_11636.vasp,Mo2N1,-3.8233141366666663,1.584278597777772 -Sc3Zn1Bi1Br2O7_1_16221.vasp,Sc3Zn1Bi1Br2O7,-4.2010964657142855,0.36069339437499 -Ga1Cu1Te6P2_149_6180.vasp,Ga1Cu1Te6P2,-1.624727328,0.3335178660476156 -Ni2Au1O4_187_13458.vasp,Ni2Au1O4,-2.3058817285714284,-0.372830523482145 -Pd2S4_14_14477.vasp,Pd2S4,-2.199042883333333,0.1187693208333331 -K2Cd4Te2S6Br6_31_9070.vasp,K2Cd4Te2S6Br6,-0.8482278035,0.2167342184166641 -Fe1Cu2O8F6_2_5673.vasp,Fe1Cu2O8F6,-2.243976875882353,0.1550392452941136 -Li2H4N2O6_7_9939.vasp,Li2H4N2O6,-4.514541397142858,0.0353914821904667 -Be2P1_25_2263.vasp,Be2P1,-2.757624573333333,0.8525954222916642 -Mo1Os1Cl6_5_11531.vasp,Mo1Os1Cl6,-1.94285145625,0.0075415464062427 -Fe2As2Se6_162_5789.vasp,Fe2As2Se6,-2.19990916,0.2453742334999977 -Nb4Fe2Te10_59_13071.vasp,Nb4Fe2Te10,-2.6815411875,0.3016881461458327 -Te1Mo1Se1_156_18306.vasp,Te1Mo1Se1,-2.4108537266666668,0.1673000099999999 -K2Cd1N12_12_9040.vasp,K2Cd1N12,-5.0395353,-0.297638518346158 -V3C2Se2F2_1_20253.vasp,V3C2Se2F2,-3.9570283822222234,0.4917072720576012 -Na1I2_25_11878.vasp,Na1I2,-0.4173694266666667,-0.1495447527083336 -Cu2H4Se2O10_2_5132.vasp,Cu2H4Se2O10,-3.351803538888889,0.1679819714120314 -Sb2Se2Br2_59_15690.vasp,Sb2Se2Br2,-1.71956846,0.1122445225000001 -Ag4H4S4Br4_2_519.vasp,Ag4H4S4Br4,-1.34066361875,0.1505101508593749 -Na2Hg4Te2S6I6_31_12177.vasp,Na2Hg4Te2S6I6,-0.4851969005,0.0892046183541678 -Sn2Se1S1_6_16875.vasp,Sn2Se1S1,-2.14183209,-0.1217777918749999 -Tm2Br6_162_19673.vasp,Tm2Br6,-2.27699984125,0.05249053 -P6S12F2_4_14145.vasp,P6S12F2,-2.9598774015,0.2826695792916569 -Pb2F2_164_14244.vasp,Pb2F2,-1.7120669025,0.6342211874999999 -Sr1Ge1S2_1_17050.vasp,Sr1Ge1S2,-3.0284102575,0.1143386240624999 -Co2H2S4_11_3911.vasp,Co2H2S4,-2.9759440075,0.0479194451562501 -Au1I1_187_1427.vasp,Au1I1,0.833298795,0.3195758737500001 -Fe2Te4P2I2_10_6019.vasp,Fe2Te4P2I2,-1.483865911,-0.4594128342500001 -Fe2Bi2Te4I2_26_5814.vasp,Fe2Bi2Te4I2,-1.007023871,0.3948110535000002 -Ir2Se6_11_8848.vasp,Ir2Se6,-2.342964625,0.5053532677777753 -Nb2Se4Cl4_2_12882.vasp,Nb2Se4Cl4,-2.998307054,0.0467363715238029 -K2H2C2O4_51_9117.vasp,K2H2C2O4,-4.576735598,0.2193079691666586 -Ag2Sb4S3Cl2_6_411.vasp,Ag2Sb4S3Cl2,-1.5539735509090908,0.2602617707575735 -Mn2Se1I2Br1_1_11270.vasp,Mn2Se1I2Br1,-1.216663141666667,0.0416955185416668 -Rh2S6_7_15230.vasp,Rh2S6,-2.70292377375,0.4816414653645808 -Rb2B10H16O24_30_14769.vasp,Rb2B10H16O24,-5.414384668076924,0.0655093716185839 -U1C1O5_25_19695.vasp,U1C1O5,-7.007854514285714,0.0774736485714298 -Hf3B2H2O2_187_7678.vasp,Hf3B2H2O2,-5.874016984444444,0.56639410055555 -Bi4Te4I4O12_14_2651.vasp,Bi4Te4I4O12,-3.0392392470833336,0.0241660935416663 -Cu1Br1_187_4859.vasp,Cu1Br1,0.08038138,0.460060675 -Tl2Zn2S5_156_19569.vasp,Tl2Zn2S5,-1.2982804155555554,0.2314773513055543 -Tl2Cl2O2_59_19388.vasp,Tl2Cl2O2,-1.80538453,0.0375913066666664 -Te4Pb6Br4O12_12_18612.vasp,Te4Pb6Br4O12,-2.994120213076923,0.1577822826923078 -Al3Rh1_187_1050.vasp,Al3Rh1,-1.9029235075,1.2319231479687474 -Yb1Se2_164_20859.vasp,Yb1Se2,-3.18483868,-0.2657371155555581 -Pb6N6_2_14330.vasp,Pb6N6,-3.0299067625,0.4010616087500002 -Mn1Ga1Cu1Ir1Se7S1_1_10718.vasp,Mn1Ga1Cu1Ir1Se7S1,-2.12276106,0.2757300305786995 -Ga1Ag1As2S6_149_6110.vasp,Ga1Ag1As2S6,-2.394122035,0.4630356101874977 -Os1Br2O1_47_13790.vasp,Os1Br2O1,-2.6932398175,0.0688400025 -Ag2Hg2Te2Br2_26_305.vasp,Ag2Hg2Te2Br2,0.3570643475,1.0996058796874986 -V4H2C3S2_164_20326.vasp,V4H2C3S2,-4.823610266363636,0.0584582919444313 -Rh1S2_115_15165.vasp,Rh1S2,-2.3968885666666666,0.7838793366666639 -Fe2Te6P2_162_6026.vasp,Fe2Te6P2,-1.84053141,0.2737414985000003 -K4O12_13_9486.vasp,K4O12,-2.75218431125,0.1828386078124999 -Sb2Pt1_123_15659.vasp,Sb2Pt1,-2.1138140366666667,0.5838564199999996 -Ir1S2_115_8757.vasp,Ir1S2,-2.81771689,0.2716380433333332 -Li2Mn2P2_129_9999.vasp,Li2Mn2P2,-3.05431917,0.112924229285711 -Mn1Nb1Se2Br2_6_10812.vasp,Mn1Nb1Se2Br2,-2.731888888333333,0.0373793108333337 -Ba3Ni2Br2O5_123_2119.vasp,Ba3Ni2Br2O5,-3.0815935908333336,-0.1258213266666695 -Th4Br16_14_18731.vasp,Th4Br16,-2.62596327,0.0298932789999999 -K4Sb4S8_14_9509.vasp,K4Sb4S8,-2.228792666875,0.1235788706249998 -Ta1Te2Ir1_5_17626.vasp,Ta1Te2Ir1,-3.5115823875,0.4101656836458336 -Al2Si2H4O9_1_980.vasp,Al2Si2H4O9,-5.5862884929411765,-0.3558707870098088 -Ni2N4_2_13541.vasp,Ni2N4,-4.083407158333333,1.458426589999995 -Ta2Pt1O6_12_17834.vasp,Ta2Pt1O6,-6.171740204444444,0.1554556815277692 -Cd1H10C14S2N6_2_3318.vasp,Cd1H10C14S2N6,-5.686662179090908,-0.1004200441161643 -Ba2Si2Ni2_129_2059.vasp,Ba2Si2Ni2,-1.493490056666667,0.1207234033333319 -Tb2Br6_59_18186.vasp,Tb2Br6,-2.31854971,0.0383799874999999 -V2O2_129_20123.vasp,V2O2,-4.7559502075,0.7768799358333288 -Hf4B3H2S2_164_7764.vasp,Hf4B3H2S2,-5.432504739090909,0.2365637499999842 -Lu2Se2F2_164_10317.vasp,Lu2Se2F2,-3.984933111666667,-0.027967620000004 -Mn1Cu1Se4_1_10693.vasp,Mn1Cu1Se4,-1.5818399316666667,0.2857117035185168 -Ca1Au2F12_115_2802.vasp,Ca1Au2F12,-1.1911837660000002,0.0140813699999999 -Re2S2_187_15076.vasp,Re2S2,-5.143454755,0.4866006981250006 -Ge2C2Cl2_59_6761.vasp,Ge2C2Cl2,-3.1797907616666667,0.8714107641666627 -Nb4Si2Te8_55_13157.vasp,Nb4Si2Te8,-3.552489428571428,0.0636268953571432 -As1_123_1183.vasp,As1,-2.43870876,0.7724758 -Cd2Bi2S4Cl2_11_3472.vasp,Cd2Bi2S4Cl2,-1.3127824179999998,0.2007475690000004 -Te1Au2O4_21_18287.vasp,Te1Au2O4,-2.0504307685714287,0.4275790664285703 -Ag2P4S3Br2_6_359.vasp,Ag2P4S3Br2,-2.136194127272727,0.1233465935227262 -Na2S4I2F8_2_12292.vasp,Na2S4I2F8,-1.673947743125,0.1937540412695312 -Ag2As2S6_2_157.vasp,Ag2As2S6,-1.932217553,0.2607743433749977 -Pd1C6O4F8_10_14352.vasp,Pd1C6O4F8,-4.260830484736842,0.3812303331578835 -Cd4Cl8_115_3624.vasp,Cd4Cl8,-0.2131590158333333,0.1912353375 -Sn1F2_164_16629.vasp,Sn1F2,-2.422650573333333,0.2636285625000001 -Ge2Sb2O6_162_6850.vasp,Ge2Sb2O6,-4.293497443,0.233377076583331 -Ba2Zn1_123_2088.vasp,Ba2Zn1,0.8498222733333334,0.2600155316666667 -Te2Pb3I1Br1_1_18461.vasp,Te2Pb3I1Br1,-1.1093444728571429,-0.7338336208333338 -Ba2Bi4S8_11_1922.vasp,Ba2Bi4S8,-2.6647929178571426,0.1710163121428571 -Zn1Ga2Te4_156_20940.vasp,Zn1Ga2Te4,-1.1620434957142858,-0.4421689428571429 -Sb2Te4Au2_26_15729.vasp,Sb2Te4Au2,-0.860647185,0.3358049548437484 -Ti2Ni2O6_147_18971.vasp,Ti2Ni2O6,-4.577818352,0.5108339009999998 -Cr1Ge1Se1S1I1Br1_6_4180.vasp,Cr1Ge1Se1S1I1Br1,-2.082797135,0.0422422126388888 -Bi2As2O8_11_2417.vasp,Bi2As2O8,-4.12788737,0.2140162866666672 -Si2As6_164_16385.vasp,Si2As6,-3.06229454,-0.6183844987500002 -Zr2Se2_129_21678.vasp,Zr2Se2,-3.6562372025,0.2355631325000002 -Tl1Cl2_164_19243.vasp,Tl1Cl2,-0.68411991,-0.044911715 -As4Pb2S8_26_1346.vasp,As4Pb2S8,-2.737470294285714,0.3844378904365051 -Sb2P4O12F2_1_15632.vasp,Sb2P4O12F2,-4.1397174905,0.9575239329999964 -Mg5H2O6_164_10593.vasp,Mg5H2O6,-4.5151769815384615,-0.377398668461542 -Bi2I2O2_59_2464.vasp,Bi2I2O2,-2.267517278333333,0.2060531866666664 -W2S2I2_59_20529.vasp,W2S2I2,-2.931037791666667,0.340606809861111 -Nb1Bi1Sb1S1I2_1_12471.vasp,Nb1Bi1Sb1S1I2,-2.080148153333333,0.2970066678472168 -Nb2Pd2Se10_51_12815.vasp,Nb2Pd2Se10,-2.8457375792857142,0.0769289251020357 -W2C1_164_20474.vasp,W2C1,-5.724302563333333,1.033819116666661 -Sb1Pb2S6_162_15478.vasp,Sb1Pb2S6,-2.2338992288888893,-0.2861426529513914 -V3H2N2O2_187_20266.vasp,V3H2N2O2,-5.2813182577777775,0.1020916398148095 -Ba2Au1S2F2_38_1909.vasp,Ba2Au1S2F2,-2.4259441,0.5217743853571402 -Ba2H2I2_129_1993.vasp,Ba2H2I2,-2.130431321666667,0.0470375949999999 -Ga1Cu1As2Se6_149_6161.vasp,Ga1Cu1As2Se6,-1.972233355,0.2845606103333314 -Cu6Se6O18_2_5500.vasp,Cu6Se6O18,-2.937104045,0.1433503871249969 -Ag2F2_2_256.vasp,Ag2F2,-0.4361020825,0.3099450725 -Zr2N1O2_164_21605.vasp,Zr2N1O2,-6.997411778,0.1121160160000007 -Hg2Ru6O12_10_7990.vasp,Hg2Ru6O12,-3.3210593860000004,0.9008033598793084 -Nb2Te2_164_12916.vasp,Nb2Te2,-3.453168505,0.1795037258333294 -Be1As2H4S4_5_2212.vasp,Be1As2H4S4,-3.044423782727273,0.1083619056249909 -Mn1Se2_164_10879.vasp,Mn1Se2,-2.13434782,0.1606757933333336 -Mn1As1Se1Cl3_1_10634.vasp,Mn1As1Se1Cl3,-1.5682514933333334,0.4075246224999975 -Ca1Pb2_164_2869.vasp,Ca1Pb2,-0.3588341466666667,-0.1393163450000001 -Li2Cu2O4_8_9890.vasp,Li2Cu2O4,-2.9772547675,0.1728873500000003 -Tl1In1Hg1Te4_156_19297.vasp,Tl1In1Hg1Te4,-0.5406661114285715,0.4129860504761888 -Cu2P4S3Br2_6_5220.vasp,Cu2P4S3Br2,-2.2699774254545457,0.1649626359090883 -Na1Cl2_25_11841.vasp,Na1Cl2,-1.0133859366666669,0.4418050279166654 -P4O8_11_14093.vasp,P4O8,-5.312580436666667,0.0809797356666631 -Zr2Sn2Se8_31_21693.vasp,Zr2Sn2Se8,-2.9828917041666667,0.1074868195833307 -Co1C6S4F8_10_3721.vasp,Co1C6S4F8,-3.830388380526316,0.3971337452192892 -Ba2Mg2Sn2_129_2022.vasp,Ba2Mg2Sn2,0.0442452116666666,1.0357464908333334 -Te2Pb2_59_18459.vasp,Te2Pb2,-1.2310011825,-1.2917683575 -Sn2As2S6F2_7_16726.vasp,Sn2As2S6F2,-2.497273105,0.5153351224739526 -Mn2Bi2Te4F2_26_11024.vasp,Mn2Bi2Te4F2,-1.619242338,0.376485505137929 -Ga8Se6_31_6592.vasp,Ga8Se6,-2.144355282142857,0.0841652928571417 -Rb1Mg6B1O7_99_14743.vasp,Rb1Mg6B1O7,-3.850566163333333,0.1367766688131282 -Sb4O10_6_15780.vasp,Sb4O10,-3.947706747142857,0.3593534471428574 -Mn2Mo2I2O8_129_11138.vasp,Mn2Mo2I2O8,-3.929195775714286,0.1454791870535712 -Mn1V1I1Br1O1_6_10921.vasp,Mn1V1I1Br1O1,-2.576399614,0.2191824906833309 -Sc2Br2N2_59_16038.vasp,Sc2Br2N2,-4.191738268333333,0.2061574224999964 -Ge2As2Cl2O6_7_6731.vasp,Ge2As2Cl2O6,-3.801881123333333,0.2433065504166669 -Li1Co5O5F1_156_9680.vasp,Li1Co5O5F1,-3.0069778975,0.4259228183333303 -Nb2P2S6_2_12807.vasp,Nb2P2S6,-4.135970871,-0.1368236380277805 -Mo3C2S2_187_11705.vasp,Mo3C2S2,-4.722559235714286,0.2161034349999957 -N4_11_11800.vasp,N4,-5.87845938,-0.3447087574999994 -K2Hg4S8Br6_31_9182.vasp,K2Hg4S8Br6,-0.706982381,0.1976443232291665 -Cu1Bi1Sb2Se6_143_4853.vasp,Cu1Bi1Sb2Se6,-1.707588866,0.3104539950555516 -Li4Sb4S8_29_10226.vasp,Li4Sb4S8,-2.918995595625,0.0812537631249998 -Na2H4C2O6_7_12107.vasp,Na2H4C2O6,-4.576327825714286,0.3629412849702265 -Li2Ir1_187_9965.vasp,Li2Ir1,-2.1503749666666665,1.4382522433333338 -Os1O2_187_13810.vasp,Os1O2,-4.274068906666667,1.2287090999999997 -Mn1Fe1I2_6_10708.vasp,Mn1Fe1I2,-0.17759578,0.91327539875 -Rh1Cl2_164_15148.vasp,Rh1Cl2,-1.1888121633333333,0.4498777666666651 -Cu2Ir2Br4O6_1_5181.vasp,Cu2Ir2Br4O6,-2.1396943792857144,0.3883134080357089 -Rb2Hg4S8Br6_31_14872.vasp,Rb2Hg4S8Br6,-0.7278729979999999,0.2078492188125003 -Ti2N1F2_164_18965.vasp,Ti2N1F2,-6.290304904,-0.4053468098333401 -Na1Cd1H1S1O1_1_11840.vasp,Na1Cd1H1S1O1,-2.311572878,0.1976131075000002 -Ni3Bi6_2_13697.vasp,Ni3Bi6,-0.4568103044444444,0.4283471638888889 -Cr1O2_115_4222.vasp,Cr1O2,-4.753082103333333,0.0649137510416633 -Fe2Te2I2_59_5997.vasp,Fe2Te2I2,-0.7309654733333333,0.08400789625 -W2C1Se2_12_20473.vasp,W2C1Se2,-5.034798328,-0.3485505319999995 -Rb2Cu4I6_51_14837.vasp,Rb2Cu4I6,-0.0546503566666666,0.1071571016666655 -Ag4Se2_4_560.vasp,Ag4Se2,-0.0439812916666666,0.187633895 -Nb1Ag1Se1I2_1_12462.vasp,Nb1Ag1Se1I2,-1.5478195,0.3059181480000004 -Mg2Co2Si2_129_10442.vasp,Mg2Co2Si2,-2.1389800283333336,0.0269634138888867 -Al2Bi6_164_771.vasp,Al2Bi6,-1.08802438875,-0.1318781762500001 -Mo2Br2N2_59_11570.vasp,Mo2Br2N2,-3.7848747333333335,0.2343434920833336 -Fe1Ag1S2_156_5614.vasp,Fe1Ag1S2,-1.344484825,-0.0732336050000002 -Ta2Cl6_162_17697.vasp,Ta2Cl6,-3.06429693375,0.2619706281250001 -Na1Al1Te6As2_5_11819.vasp,Na1Al1Te6As2,-1.742529216,0.2826958476666649 -Ni2As4Br4O6_2_13453.vasp,Ni2As4Br4O6,-2.849997036875,-0.0635612118750001 -Cu2Te2_59_5339.vasp,Cu2Te2,-0.4552262275,0.1122543074999999 -Ti1Zn1Bi2O6_99_18873.vasp,Ti1Zn1Bi2O6,-3.737234583,0.8706947744999955 -V1Te2_164_19942.vasp,V1Te2,-2.2665219133333334,0.1007191444444441 -Mg4_129_10592.vasp,Mg4,0.1712065975,-0.2430418108333333 -V3H2S2N2_6_20268.vasp,V3H2S2N2,-4.565038401111111,0.0242142123737283 -Sb8Cl4O10_14_15864.vasp,Sb8Cl4O10,-3.547319157272727,0.1250891595454546 -Sr4Te4O12_14_17479.vasp,Sr4Te4O12,-4.066266384,0.1117852414999998 -Al18S9_143_588.vasp,Al18S9,-2.531598001851852,0.6231122491203671 -As2P2S6_7_1240.vasp,As2P2S6,-3.052100291,0.1625585977159026 -Ni2F4_2_13504.vasp,Ni2F4,-1.46138498,-0.1898391916666668 -V2Si2Se6_162_20195.vasp,V2Si2Se6,-3.170152837,0.1004181189166668 -Cu2S4I2_4_5259.vasp,Cu2S4I2,-1.17224607,0.0757654199999999 -As1Pb1Se2Br2_6_1158.vasp,As1Pb1Se2Br2,-1.5987141633333335,0.2764239773611086 -Y4Br10_11_20809.vasp,Y4Br10,-2.88503735,0.0849288933333273 -Ba2Ni2Ge2_129_2034.vasp,Ba2Ni2Ge2,-1.1268996733333334,0.2004527533333331 -Ni2Br6_191_13484.vasp,Ni2Br6,0.25824317625,0.22295158875 -Ca2Ag1S2Br2_123_2906.vasp,Ca2Ag1S2Br2,-1.700307337142857,0.2451472485267817 -Re6Te8I2_2_15137.vasp,Re6Te8I2,-3.56209504875,0.020199751607139 -Ta4S12I2_2_18098.vasp,Ta4S12I2,-3.9840916672222217,0.2090338327083305 -Sb4Br12_14_15771.vasp,Sb4Br12,-1.040237000625,0.0586016206250001 -Li2H2Pt1_47_9930.vasp,Li2H2Pt1,-2.708981838,0.00542869 -Ba1U1_156_1876.vasp,Ba1U1,-2.43876853,1.9427438125 -As1Se1I1_156_1178.vasp,As1Se1I1,-1.68422938,0.09312695 -Al2Si2O9_1_983.vasp,Al2Si2O9,-5.489343212307692,0.3212435086538361 -Ti1Nb1S4_10_18807.vasp,Ti1Nb1S4,-4.946838015,0.1047286379166618 -K4Zr6C1Br18_2_9534.vasp,K4Zr6C1Br18,-2.449621593793103,0.0638153106896552 -La2Te6_59_9619.vasp,La2Te6,-2.66232173625,-0.6139124637500002 -Yb2I2F2_129_20877.vasp,Yb2I2F2,-2.6501507383333336,0.0571491783333333 -Ag2C2N4Cl2F4_2_217.vasp,Ag2C2N4Cl2F4,-2.759891377142857,0.8451298177976156 -Na2C4O2_31_12007.vasp,Na2C4O2,-4.8961429325,0.9639935543749998 -Re1F2_115_15000.vasp,Re1F2,-3.39305939,0.6978237811111072 -Pr2Te6_129_14555.vasp,Pr2Te6,-2.594872795,-0.6472742525000001 -Cu4I2O6_11_5426.vasp,Cu4I2O6,-1.7361973516666669,0.5629372921874976 -W4O10_59_20589.vasp,W4O10,-5.761041356428572,0.4531007406851242 -Ta3Te1I7_156_17998.vasp,Ta3Te1I7,-2.35015264,0.0608309609635393 -Hf2I2_164_7519.vasp,Hf2I2,-3.274176715,0.275152872499997 -Al1Ag1Te6As2_149_604.vasp,Al1Ag1Te6As2,-1.550299106,0.2315806621666651 -Hg2As2O6_147_7923.vasp,Hg2As2O6,-2.665877235,0.4451187639999943 -Sr4As2_59_17403.vasp,Sr4As2,-1.3348826166666663,0.4186327361111095 -Zn2P4O8_4_21135.vasp,Zn2P4O8,-4.371163480714285,0.2026569744285675 -Au2Se2F2_59_1543.vasp,Au2Se2F2,-0.64862969,0.6383494977083315 -P4W2O12_4_14127.vasp,P4W2O12,-5.548182473333333,0.2233983021944346 -Cu1Bi1P2Se6_149_4851.vasp,Cu1Bi1P2Se6,-2.17650984,0.0731068905 -Mn1Pd1Cl4O2_65_10843.vasp,Mn1Pd1Cl4O2,-1.92646272,-0.0303150699999998 -Ge2Se2_164_6873.vasp,Ge2Se2,-2.83598366,0.064309685 -Ni2Cl4_2_13498.vasp,Ni2Cl4,-0.5677856033333334,-0.2582902766666667 -Ir2I2_164_8790.vasp,Ir2I2,-0.9506295275,1.3480883599999982 -Ba2Cu1Te2I2_38_1977.vasp,Ba2Cu1Te2I2,-1.3078468514285717,0.2007270607142828 -W2Se2N1_8_20546.vasp,W2Se2N1,-4.861524524,-0.4392172946666663 -C2N4_113_2751.vasp,C2N4,-6.740477925,-0.1910972519444507 -K8Tl10Zn1_89_9557.vasp,K8Tl10Zn1,0.6489516352631579,0.2085758005263158 -Ta4O10_31_18077.vasp,Ta4O10,-7.214361617142857,0.0312227785714291 -Be2Ir1_123_2259.vasp,Be2Ir1,-3.4572677866666663,0.726629593333334 -Sc1Cl2_187_15920.vasp,Sc1Cl2,-2.7539429033333334,0.1355446677777747 -Sb4Au2S3F2_6_15765.vasp,Sb4Au2S3F2,-1.5852927572727271,0.901831077272723 -Hg12Te4Br16_29_7833.vasp,Hg12Te4Br16,0.4977560490625,0.067277840625 -Zr2S1I2N1_1_21639.vasp,Zr2S1I2N1,-3.861130105,0.4415755049999996 -Sn4Bi8_26_16937.vasp,Sn4Bi8,-1.1435114958333334,-1.7014073274999997 -Y2I2O2_129_20743.vasp,Y2I2O2,-5.150571243333333,0.0514589616666665 -Mn1Ge1S1I2O1_1_10737.vasp,Mn1Ge1S1I2O1,-2.161075015,0.3869684774999966 -Hf3N2O2_187_7721.vasp,Hf3N2O2,-7.880810981428572,0.1317286571428497 -Cs2Cd4Se2I6O6_31_4694.vasp,Cs2Cd4Se2I6O6,-1.3206692565,0.1367418993333331 -Ta1F5_47_17543.vasp,Ta1F5,-4.018171791666666,0.3487845075000004 -Ho2Br2_164_8127.vasp,Ho2Br2,-2.1661176925,0.0874140463888869 -W1Au1I3Cl1O1_1_20409.vasp,W1Au1I3Cl1O1,-1.567535255714286,-0.2225583010178629 -Na2Mg1Te2O8F4_2_12200.vasp,Na2Mg1Te2O8F4,-2.7782281911764706,0.5920230274999938 -Te10Ir5_2_18266.vasp,Te10Ir5,-2.217632528,0.2258698319999998 -Co4P8H44C8N4O32_14_4083.vasp,Co4P8H44C8N4O32,-4.7979255461,0.1170386972833263 -Pb2S2I1Cl1_1_14274.vasp,Pb2S2I1Cl1,-1.4623184066666666,-0.2276435848263906 -Sr2Tl1Ag1Hg1S5_99_17331.vasp,Sr2Tl1Ag1Hg1S5,-1.584751405,0.1440810675624975 -Cu2Br2O2_59_5049.vasp,Cu2Br2O2,-1.1597565516666666,0.2124175770833319 -Tl4Sn2S6_10_19631.vasp,Tl4Sn2S6,-1.9343271216666664,0.0536008787500001 -As2Au2O4_26_1185.vasp,As2Au2O4,-2.747251845,0.9579837165624956 -Tl2I2_59_19436.vasp,Tl2I2,-0.34727968,0.0909331275 -Cs2Hg4Br6O8_31_4725.vasp,Cs2Hg4Br6O8,-1.008087797,0.2760358285833332 -Na1Te1H6O6F1_143_11939.vasp,Na1Te1H6O6F1,-3.8378357026666663,0.1405421286666666 -P1Cl1O1_156_13916.vasp,P1Cl1O1,-2.9290123033333333,0.7886630675555484 -Ba4Bi4Te8F4_12_2145.vasp,Ba4Bi4Te8F4,-2.2789636915,0.1455255549999977 -Ag2Sb2S4_26_400.vasp,Ag2Sb2S4,-1.73773378375,0.1984589512500001 -V1Mo1Se1S3Br2_1_19883.vasp,V1Mo1Se1S3Br2,-2.5134613375,0.3352375867013869 -Ti1Ru3S4I1Br3_1_18833.vasp,Ti1Ru3S4I1Br3,-2.8709042116666663,0.1724956199999976 -Ba4Bi4H4S8_14_2139.vasp,Ba4Bi4H4S8,-2.72530252,0.1231986125624974 -Os1S1Cl2_47_13816.vasp,Os1S1Cl2,-2.30080495,0.3244198728125 -Mn1Fe1Br1O1_156_10706.vasp,Mn1Fe1Br1O1,-2.1250868675,0.6611973023437501 -Ag2S4_11_394.vasp,Ag2S4,-0.9835767766666668,0.5345374663541668 -Cu2Se2I2_59_5300.vasp,Cu2Se2I2,-0.3178436816666666,0.2359922513888883 -Ti2S10_59_18989.vasp,Ti2S10,-3.7641118616666662,0.1372767506249963 -Co1H4C6I2N2_25_3761.vasp,Co1H4C6I2N2,-5.059326974666666,0.1729321097777642 -Cd1Te2H2_5_3438.vasp,Cd1Te2H2,-1.214663166,0.6822475773333336 -Mn1Cu1H1Ir1I1O6_1_10685.vasp,Mn1Cu1H1Ir1I1O6,-3.293011386363637,0.4329477509090849 -Li2Ni5Pd1Se3S8Br1_1_10030.vasp,Li2Ni5Pd1Se3S8Br1,-1.699301986,0.205570007057287 -K2Ru2C2S4I8_31_9319.vasp,K2Ru2C2S4I8,-1.71791879,0.424508900763887 -Li3As1_187_10144.vasp,Li3As1,-2.40014559,0.2663052349999999 -In4Se2S2I1Br3_1_8690.vasp,In4Se2S2I1Br3,-1.5813165016666666,0.0715329806770835 -Cr4P4S12_11_4619.vasp,Cr4P4S12,-3.2988887815,0.1657619282499971 -W1F2_115_20431.vasp,W1F2,-3.11909135,1.1048660374999963 -V1Fe1Ge1Se1S2Br2_1_19830.vasp,V1Fe1Ge1Se1S2Br2,-2.4204910375,0.1195776937499963 -Hf2Mo1S2I2_1_7531.vasp,Hf2Mo1S2I2,-3.3467444942857143,0.7847763699999902 -Zn2P4W2O14_2_21139.vasp,Zn2P4W2O14,-4.892379375,0.2738118227499949 -Tc6Cl18_164_18259.vasp,Tc6Cl18,-2.8521970775,0.0611527312499999 -Na6H2S2O8_11_12439.vasp,Na6H2S2O8,-3.76173752,0.0952397869444415 -Ag2As2Se4_26_158.vasp,Ag2As2Se4,-1.5139228,0.1803331783333314 -Cr2Br4_14_4334.vasp,Cr2Br4,-1.696214255,-0.2194371061111125 -Cs1Pb1Se2_156_4648.vasp,Cs1Pb1Se2,-1.2209726525,0.4487383125520834 -Pt2C8_65_14609.vasp,Pt2C8,-5.063185381,2.104234535 -Nb2Cl8_1_12687.vasp,Nb2Cl8,-2.511335485,0.2025579555000001 -Sb4Pd4Se4_13_15807.vasp,Sb4Pd4Se4,-1.845668215,0.4121957258333335 -Te6As2Pd2_12_18644.vasp,Te6As2Pd2,-1.553005623,0.2694276035999979 -V2B1Te2_12_19995.vasp,V2B1Te2,-3.422262636,0.290018416666661 -Ti1Bi2_187_18745.vasp,Ti1Bi2,-2.8296944866666665,0.5333522324999969 -Al1Co5I2_123_634.vasp,Al1Co5I2,-1.29209959375,0.3423162554166646 -Ni1B6C2Br2F4_25_13276.vasp,Ni1B6C2Br2F4,-3.822194048,0.5931462264166543 -Si4H4O10_7_16491.vasp,Si4H4O10,-5.692771881666667,0.015907131203698 -Li2B2Se5_5_9838.vasp,Li2B2Se5,-3.045659572222222,0.2742080322222224 -Si2Br2N2_59_16390.vasp,Si2Br2N2,-4.354271953333334,-0.3068168216666698 -Ca2Fe1O3_38_3015.vasp,Ca2Fe1O3,-4.083479306666667,-0.0302577525000029 -V4S10_11_20356.vasp,V4S10,-3.364331125,0.2528476576785678 -As2W2Se6_12_1311.vasp,As2W2Se6,-2.977711579,0.1399186186666638 -K4Hg2Cl8_11_9460.vasp,K4Hg2Cl8,-0.6554446721428572,0.1642680621428559 -Na2H2O2_6_12101.vasp,Na2H2O2,-3.5644259983333337,0.123274836666666 -Hf1Se1O1_156_7305.vasp,Hf1Se1O1,-5.93325282,0.3244032608333338 -Bi8O16_26_2688.vasp,Bi8O16,-3.54394845625,0.223602389687497 -Ba2S8I4_125_2052.vasp,Ba2S8I4,-1.735603782857143,0.4222683567857126 -Zr1Bi1As1_156_21251.vasp,Zr1Bi1As1,-3.0164953466666664,0.3404836691666639 -Pd2Au1O4_187_14394.vasp,Pd2Au1O4,-2.3090110328571427,0.1864297042857128 -Pd2N2Cl2_59_14439.vasp,Pd2N2Cl2,-2.195496735,0.3614776447222196 -S10N10_26_15377.vasp,S10N10,-4.192796911,-0.1169792000625 -C1Br2_164_2722.vasp,C1Br2,-1.2572087433333332,1.4439229999999978 -K2V2H8S2O16_4_9387.vasp,K2V2H8S2O16,-4.420688419333334,0.0990816972777783 -Sb3Te6Au1_143_15759.vasp,Sb3Te6Au1,-1.207790438,0.2492877055624991 -Ag1Se2_12_129.vasp,Ag1Se2,-0.7993886033333334,-0.457091775 -Bi2Se1S2_164_2536.vasp,Bi2Se1S2,-2.291426288,-0.4406212944999996 -Si3P2S9_174_16475.vasp,Si3P2S9,-3.46407439,0.2400151769308003 -Mg2Cu2_191_10449.vasp,Mg2Cu2,0.5386698475,0.2474765625 -Ni1I2_164_13363.vasp,Ni1I2,0.51346752,0.0841566233333332 -Au2S5_21_1531.vasp,Au2S5,-1.2420587457142855,0.4580567768749984 -Cr2Cl2_164_4352.vasp,Cr2Cl2,-2.0651734875,0.7912473908333308 -Nb4Ni6S10_59_13106.vasp,Nb4Ni6S10,-3.092880968,0.5382339056666622 -Cd1Bi1_156_3283.vasp,Cd1Bi1,1.341413135,0.168448025 -Cu1Pb1Br2O2_1_4935.vasp,Cu1Pb1Br2O2,-1.6708347483333332,0.1250738900000001 -Sc1S1I1Br1_1_15986.vasp,Sc1S1I1Br1,-2.18019989,0.4246996065885401 -Mn3Se1S2Br4_1_11408.vasp,Mn3Se1S2Br4,-1.705728093,0.3029246000833323 -P2Pb2S6Cl2_7_14012.vasp,P2Pb2S6Cl2,-2.559629865,0.1517036435156193 -Sr2H18Cl2O10_2_17230.vasp,Sr2H18Cl2O10,-4.1362254728125,0.0291813689583335 -Bi2Mo3_1_2474.vasp,Bi2Mo3,-2.022819768,1.385469456 -Mn1Bi3_6_10655.vasp,Mn1Bi3,-1.0103667075,-0.1458248105603448 -V3Se2N1O12_143_20290.vasp,V3Se2N1O12,-4.605814866111111,0.2009593373055505 -Y1Hg1Se2Br2_1_20640.vasp,Y1Hg1Se2Br2,-1.737342085,-0.0533505625000014 -Mg3Ga3_156_10549.vasp,Mg3Ga3,-0.8446477899999999,0.1957203225 -W2Br6_189_20467.vasp,W2Br6,-1.56880376375,0.4661290159374995 -Sc2P2Se8_2_16122.vasp,Sc2P2Se8,-3.066552249166667,0.178854673229163 -Co2Bi4I4O6_11_3871.vasp,Co2Bi4I4O6,-2.508492266875,0.0693205008996196 -Zr2Pb4_59_21632.vasp,Zr2Pb4,-1.7078882183333333,0.7306876433333305 -Al13N2_12_586.vasp,Al13N2,-2.856377279333333,0.6102393283333285 -Ta1Mn1Mo1Se2N1Cl2_6_17564.vasp,Ta1Mn1Mo1Se2N1Cl2,-3.621935555,0.3776215966666667 -Al1Cd1In1Se4_156_625.vasp,Al1Cd1In1Se4,-1.8183657814285716,-0.0649575457142858 -V1W3O8_25_19963.vasp,V1W3O8,-6.006473129166667,0.0663157053061174 -Rh1Br2_115_15143.vasp,Rh1Br2,-0.5503665566666667,0.7368797544444433 -Sb1F5_47_15452.vasp,Sb1F5,-2.08836661,0.3652897608333334 -Ni3Te8As2_164_13736.vasp,Ni3Te8As2,-0.8996262146153846,0.4179885010897406 -Ag1Br1_187_34.vasp,Ag1Br1,0.33150543,0.2354793049999999 -Zr1Ni1Cl6_149_21372.vasp,Zr1Ni1Cl6,-1.93654430625,-0.0582745675000002 -Ga8Se12_14_6591.vasp,Ga8Se12,-2.3455289325,0.1114629315000002 -Ni2As2O7_6_13446.vasp,Ni2As2O7,-3.461882937272728,0.0082666759090835 -Li2Fe2P2_129_9910.vasp,Li2Fe2P2,-2.497143975,0.1756211783333334 -Ca2Ag1S2F2_38_2910.vasp,Ca2Ag1S2F2,-2.242888614285714,0.5226865285267805 -Sb2Se2S1_164_15697.vasp,Sb2Se2S1,-2.444658066,0.0637528606666648 -Ir2Pd2S4Br3Cl1_1_8805.vasp,Ir2Pd2S4Br3Cl1,-1.94241821,-0.0739966865277779 -Al1Ga1Se2_156_665.vasp,Al1Ga1Se2,-2.635311515,-0.0508120368750001 -Ga2Se2_156_6476.vasp,Ga2Se2,-2.200623885,0.2168336224999998 -Sc1S2_115_15988.vasp,Sc1S2,-3.3766655633333333,0.8816781203124973 -Zn2Mo2Se2S12_18_21121.vasp,Zn2Mo2Se2S12,-2.182712005555556,0.4665456606064791 -Ba1Cl2_187_1819.vasp,Ba1Cl2,-2.3160863766666666,0.4081090066666668 -P4S6_4_14113.vasp,P4S6,-3.2664150980000004,0.1188350934062465 -V2Te6P2_12_20222.vasp,V2Te6P2,-2.293596744,0.4681505050000004 -Li2P30_1_10038.vasp,Li2P30,-3.976514605,0.0291121523437498 -Cu2Hg2S2Br2_26_5154.vasp,Cu2Hg2S2Br2,-0.14329099375,0.1425440845833333 -Si1H2N1_156_16338.vasp,Si1H2N1,-4.3560592675,0.7895743993750002 -Tl2In2F8_10_19445.vasp,Tl2In2F8,-2.2434636525,0.1783527574999999 -Mo1Se1S1_156_11548.vasp,Mo1Se1S1,-3.3643200666666666,0.0414458541666669 -Ag2I2N2_59_313.vasp,Ag2I2N2,-0.7376768633333333,0.8752578074999987 -Zr2C2Cl2_59_21541.vasp,Zr2C2Cl2,-4.802073493333333,0.61347835666666 -Ba4Mn2S6Cl2_129_2163.vasp,Ba4Mn2S6Cl2,-3.0238068385714283,0.0421751071428544 -V4Zn1O10_25_20379.vasp,V4Zn1O10,-4.942896807333333,0.2129070299999904 -Pt2O6_11_14646.vasp,Pt2O6,-2.74792829,0.7521261090625002 -Ag2S2_187_385.vasp,Ag2S2,-0.6981655875,0.27006337734375 -Nb4Ni6Te10_59_13108.vasp,Nb4Ni6Te10,-2.0423140975,0.0557986637499987 -Hf1V2Br1Cl1O3_1_7361.vasp,Hf1V2Br1Cl1O3,-4.63641505875,0.4346986602083285 -Y3B2Cl2_187_20785.vasp,Y3B2Cl2,-4.481835328571429,0.2018281407142761 -Fe1F2_115_5674.vasp,Fe1F2,-1.6292617166666667,1.08852362 -Cd1H2O2_164_3337.vasp,Cd1H2O2,-3.146905558,0.0563403980000001 -Ta4H2C3S2_164_18049.vasp,Ta4H2C3S2,-6.464854643636364,0.2829720643181761 -Sc1Sb2Au1S6_149_15993.vasp,Sc1Sb2Au1S6,-2.502273761,0.3795836170937479 -Pa2As4_129_14164.vasp,Pa2As4,-4.828276866666667,0.587622445 -Y1Bi2_21_20610.vasp,Y1Bi2,-2.3946611166666667,0.1990576227777749 -Zn1Cu3H6Cl2O6_164_20921.vasp,Zn1Cu3H6Cl2O6,-2.832033906111111,0.1682423043981429 -Ta1Cl2_187_17526.vasp,Ta1Cl2,-3.4279517800000003,0.5162725849999934 -Sb2I2O2_59_15588.vasp,Sb2I2O2,-2.4406440183333333,0.2130957312499976 -Cl4O10_4_3692.vasp,Cl4O10,-2.125802416428572,0.3302503473214275 -Tl2Mo10O30_12_19452.vasp,Tl2Mo10O30,-4.935910776666667,0.0594981424761709 -In2Bi2_129_8383.vasp,In2Bi2,-0.85877826,-0.3032759975 -Bi4P4O16_14_2632.vasp,Bi4P4O16,-4.187164542916666,0.9949863854166664 -K1Ge1Te2_156_8904.vasp,K1Ge1Te2,-1.27516668,0.1395191114999986 -Sb1Cl2_115_15445.vasp,Sb1Cl2,-1.1046780266666667,0.4994888258333316 -Rb2Hg4Se2Br6O6_31_14876.vasp,Rb2Hg4Se2Br6O6,-1.2924013145,0.0702406009166659 -Na1Te6P2Pd1_149_11941.vasp,Na1Te6P2Pd1,-1.7633552890000002,0.3355216975 -Ga1Se1S1_1_6272.vasp,Ga1Se1S1,-2.321540253333333,0.3375140397222205 -Ge2As2O6F2_7_6736.vasp,Ge2As2O6F2,-4.0571903625,0.2585543945833333 -U2Br2N2_129_19700.vasp,U2Br2N2,-6.515185209999999,0.1143012733333339 -V1Mo3S8_25_19887.vasp,V1Mo3S8,-3.711766885833333,0.0515617862500001 -Na2Hg4Te2S6Br6_31_12174.vasp,Na2Hg4Te2S6Br6,-0.668964396,0.1014370876666663 -Ba4Sb4Te8H4_14_2187.vasp,Ba4Sb4Te8H4,-2.130037767,0.5610853164999979 -H2W4C3_164_7042.vasp,H2W4C3,-5.81734769,0.2863407738888772 -V2Se1Br1N1_99_20178.vasp,V2Se1Br1N1,-3.892475978,0.1478741134999974 -Sr2Pb4F12_2_17299.vasp,Sr2Pb4F12,-2.91642772,0.1451814455555529 -Ca2B2O6_11_2943.vasp,Ca2B2O6,-5.457365601,0.319532770124997 -Zr2S10_59_21635.vasp,Zr2S10,-3.545045465,0.2202337206249969 -Cu1W1S1Br2O1_8_5001.vasp,Cu1W1S1Br2O1,-2.4354674716666667,0.2389209438768105 -V2Cd1O6_12_20025.vasp,V2Cd1O6,-4.475906884444445,0.2966534644444438 -Tl2Ni2Se5_156_19461.vasp,Tl2Ni2Se5,-0.9943316544444444,0.3412730801234555 -Na4As4S8_14_12363.vasp,Na4As4S8,-2.677509635,0.387804005 -Nb4Co8Te8_59_13062.vasp,Nb4Co8Te8,-2.7104574205,-0.0160957490000017 -Nb2F5_1_12712.vasp,Nb2F5,-3.9780914157142857,0.5415229057142859 -Zn2Bi4I4O6_31_21044.vasp,Zn2Bi4I4O6,-2.1888592575,0.216871016875 -Mn2W2S8I2_129_11345.vasp,Mn2W2S8I2,-2.741395967142857,0.5613267491964247 -Ni1Te1Ir1Se2I1_6_13428.vasp,Ni1Te1Ir1Se2I1,-1.4177631533333337,0.1828805352462083 -Zr2Cu2_129_21557.vasp,Zr2Cu2,-1.418745355,0.5219333094230753 -Zr1As2O6F2_164_21245.vasp,Zr1As2O6F2,-4.718190164545455,0.0657956761363589 -Na1Al1Cl4O12_2_11810.vasp,Na1Al1Cl4O12,-2.857141555,0.2168129013541597 -V2S2I1Br1_6_20155.vasp,V2S2I1Br1,-2.756192241666667,0.0679346038888852 -Hf1Sb2O6F2_164_7289.vasp,Hf1Sb2O6F2,-4.610224142727272,0.3124809968181772 -Ag2Br1Cl3_1_199.vasp,Ag2Br1Cl3,-0.0395295516666666,0.1336217424999999 -H4Pd1C8Br2_25_7078.vasp,H4Pd1C8Br2,-4.941350081333334,0.4625396353333266 -Ta2As2S6_12_17648.vasp,Ta2As2S6,-4.207862543,0.2485369973749973 -V2Ge2Se6_162_20067.vasp,V2Ge2Se6,-2.878930925,0.1691486439999976 -Re2O4_11_15066.vasp,Re2O4,-6.074853158333333,0.1722907275000009 -Ba1C2_164_1815.vasp,Ba1C2,-2.4360974033333336,3.1518992394444387 -Ga1Fe5Br2_123_6187.vasp,Ga1Fe5Br2,-0.545110845,1.0301843787499994 -Ba2Sb1_25_2054.vasp,Ba2Sb1,-0.6806405799999999,0.9004322899999986 -Tc8Cl28_1_18262.vasp,Tc8Cl28,-2.4467400925,0.158067205833331 -V1F2_164_19825.vasp,V1F2,-3.31084648,-0.0359734955555586 -K1Au1Se2_10_8880.vasp,K1Au1Se2,-0.822060815,-0.2023570287499999 -Ba2Mn2Si2_129_2025.vasp,Ba2Mn2Si2,-2.162292201666667,0.3201552789583296 -Li1Nb1S2_156_9756.vasp,Li1Nb1S2,-4.2057397275,0.4717116125 -Nd1Cl2_123_13218.vasp,Nd1Cl2,-2.908748013333333,0.1137256911111084 -Na8Ge4S12_14_12450.vasp,Na8Ge4S12,-2.4691570575,0.3969292212500002 -Sn8Ir2_50_17004.vasp,Sn8Ir2,-1.688426426,0.5587586235000002 -In1Cu1As2O6_149_8223.vasp,In1Cu1As2O6,-3.511810301,0.5531909081249964 -Na4Sb4O8_14_12413.vasp,Na4Sb4O8,-3.836358275,0.0134282075 -K2Bi2Pd2_12_9005.vasp,K2Bi2Pd2,-0.55741053,0.0681007245061723 -Os1Pt1I1Br5_1_13812.vasp,Os1Pt1I1Br5,-0.95600093375,0.0619241365625 -Sn2Te2F2_59_16890.vasp,Sn2Te2F2,-1.8316316966666664,-0.2146185093055564 -Tl2Sb2P4S12_4_19518.vasp,Tl2Sb2P4S12,-2.878965305,0.0979345980000001 -Ti3H2C2_187_19084.vasp,Ti3H2C2,-6.485718344285714,0.0223953999999939 -Cs2Cd4S8F6_31_4691.vasp,Cs2Cd4S8F6,-1.381619321,0.3704460995625002 -Te2Pd2S6_12_18473.vasp,Te2Pd2S6,-1.933168103,0.2560428389999978 -H2W4C3O2_164_7040.vasp,H2W4C3O2,-5.839219605454545,0.2261247864471186 -Bi4B4O12_14_2597.vasp,Bi4B4O12,-5.2988722065,0.0969040299999957 -Mn2C2S2O14_11_11048.vasp,Mn2C2S2O14,-4.774521193,0.0618736311249972 -Cd2Te2S8F4_7_3595.vasp,Cd2Te2S8F4,-1.53999769375,0.3962799305208334 -V2Te2Cl2_59_20204.vasp,V2Te2Cl2,-2.210358505,0.1974624116666645 -Mn1Ag1Au2Se3I3_1_10606.vasp,Mn1Ag1Au2Se3I3,-0.456643692,0.1176442861666664 -Sc2B1I2_164_16035.vasp,Sc2B1I2,-2.796875848,0.0620567883 -Ge1Pb1I2_1_6687.vasp,Ge1Pb1I2,-0.9186072575,0.1650159733333333 -In2Ga2Te6_31_8448.vasp,In2Ga2Te6,-1.444658303,0.1632270617904748 -Sc3In2I1Br1Cl4O5_1_16209.vasp,Sc3In2I1Br1Cl4O5,-3.5519806725,0.2933427923437426 -Zr1Ir1Se1Cl2O1_1_21316.vasp,Zr1Ir1Se1Cl2O1,-3.4978545933333334,0.4952386172916632 -Cu2Se4O10_51_5311.vasp,Cu2Se4O10,-3.138754146875,0.0936167687499995 -P1Se1Cl1_156_13947.vasp,P1Se1Cl1,-2.014061373333333,0.4024708602314792 -Mn2As2Se4Cl2_10_10982.vasp,Mn2As2Se4Cl2,-2.197051424,0.1129504046666638 -Hf1F2_115_7152.vasp,Hf1F2,-4.25266184,0.8613285374999946 -Tl4Cl4_57_19598.vasp,Tl4Cl4,-1.019745095,-0.092247285 -Tl18Te9_143_19197.vasp,Tl18Te9,-0.5683742488888889,0.2012655217171717 -Fe2P2S5_8_5916.vasp,Fe2P2S5,-2.9659440566666664,-0.1673931855303045 -Cs2H6C4O6_2_4719.vasp,Cs2H6C4O6,-4.847774596111112,0.1476658249999931 -Pt2Se2Cl2_59_14674.vasp,Pt2Se2Cl2,-1.6466786750000002,-0.1810012625000001 -Mn1Se2I1_1_10877.vasp,Mn1Se2I1,-1.5401244175,0.0947963379687502 -Li4Ga4I12_11_10192.vasp,Li4Ga4I12,-1.030611176,0.1823576873333307 -Mn1Sn1Pb1Br1Cl1O3_1_10893.vasp,Mn1Sn1Pb1Br1Cl1O3,-2.90095158375,0.2344045077604135 -Si6Bi2_191_16526.vasp,Si6Bi2,-2.4673207025,-0.10799191625 -Cr1Te1Mo1Se3S1Br1_1_4270.vasp,Cr1Te1Mo1Se3S1Br1,-2.174381675,0.3237692060763881 -Al2Te2H2O8_11_1003.vasp,Al2Te2H2O8,-4.61856135,-0.3715305512500038 -Sb1H1S8_1_15454.vasp,Sb1H1S8,-2.507244461,0.2492651915000006 -Co2H12Se4O16_14_3904.vasp,Co2H12Se4O16,-3.915499653529412,0.0587012467647061 -Cu4H6N2O12_4_5420.vasp,Cu4H6N2O12,-3.56830906625,0.2156019620833276 -Ti1Cr1Se1I1Br2_6_18772.vasp,Ti1Cr1Se1I1Br2,-2.5610145833333333,0.1237424630555495 -Mn2Fe1C6N6_150_11069.vasp,Mn2Fe1C6N6,-5.919593974666666,0.5202709286111001 -Ag2As2S4_26_156.vasp,Ag2As2S4,-1.91807650125,0.1686921693749983 -Cd1Ge1S2_1_3314.vasp,Cd1Ge1S2,-1.683011875,-0.1867310925 -As1Cl2_187_1143.vasp,As1Cl2,-1.2470214233333332,0.5256928477777763 -Zr2Ti1Pd1I1Br2N2Cl1O2_1_21722.vasp,Zr2Ti1Pd1I1Br2N2Cl1O2,-4.437583645,0.2184297677430401 -Sc4Cl4O4_11_16235.vasp,Sc4Cl4O4,-4.8786904558333335,0.1078348824999997 -H8Pd1C6S4_10_7097.vasp,H8Pd1C6S4,-4.46255323,0.2592189190131493 -Zn6P6H18O30_2_21238.vasp,Zn6P6H18O30,-4.404426291166667,0.0201311005208291 -Sc1Si3_191_16001.vasp,Sc1Si3,-3.18293447,0.4278044599999997 -P2Pd3S8_164_14028.vasp,P2Pd3S8,-2.685745200769231,0.0693527961538458 -Na2Hg4Se2I6O6_31_12164.vasp,Na2Hg4Se2I6O6,-1.1994384155,0.1087814303124939 -Ni4P4Se4_13_13753.vasp,Ni4P4Se4,-2.0682139975,0.2664336766666667 -Si1B1Te1Cl1_1_16319.vasp,Si1B1Te1Cl1,-3.0120207425,0.3824061287152753 -Nb2V2O10_85_12936.vasp,Nb2V2O10,-6.096520627142858,0.1732063214285712 -Ti2I2O1_1_18954.vasp,Ti2I2O1,-4.233077422,0.2572216128888838 -Sr2Ca2Cu2Bi2O8_28_17167.vasp,Sr2Ca2Cu2Bi2O8,-3.03827352125,0.7796040956249941 -Pd2Se1S1I4_8_14482.vasp,Pd2Se1S1I4,-0.4954370975,0.22230631828125 -Rb2Br2F8_127_14781.vasp,Rb2Br2F8,-1.2703950808333333,0.1453022800000001 -Na2Hg4S8Br6_31_12159.vasp,Na2Hg4S8Br6,-0.823442351,0.0775504365625007 -B18Te9_143_1615.vasp,B18Te9,-3.763279414814815,0.8679727029629587 -Sb2Pt2Se6_12_15662.vasp,Sb2Pt2Se6,-2.03644362,0.2979803244999975 -Bi2W3_1_2583.vasp,Bi2W3,-3.047038178,1.350213322 -Ni4Te1Se3_6_13767.vasp,Ni4Te1Se3,-0.58145587125,0.0659308443749992 -Si1Ni3Se2_187_16351.vasp,Si1Ni3Se2,-1.3323254183333333,0.0406590328720208 -Au2S4Br2_17_1522.vasp,Au2S4Br2,-1.01105262125,0.1575553089583322 -Al1S2O8_164_724.vasp,Al1S2O8,-4.604764216363637,0.1567532376704454 -K4Mo8O26_2_9477.vasp,K4Mo8O26,-4.765156625,0.0741063949342046 -Zr1Cl4_123_21278.vasp,Zr1Cl4,-2.59193994,0.2275944459999999 -Te2N2_8_18417.vasp,Te2N2,-3.0413743325,0.5113938570833333 -Al2Tl2Te6_31_1030.vasp,Al2Tl2Te6,-1.398268815,0.4808578983333319 -Ba2Tl1Cd1Ag1S5_99_2078.vasp,Ba2Tl1Cd1Ag1S5,-1.647653243,0.3696343574999969 -Li2Ge1H6O6_147_9922.vasp,Li2Ge1H6O6,-4.410388052,-0.1237991958333331 -Sb1Pd2S2_187_15483.vasp,Sb1Pd2S2,-1.958189346,0.3860571380000006 -Co3Ge1S2_187_4061.vasp,Co3Ge1S2,-2.409506405,0.2155189763174576 -In1Ni1S1Cl1_8_8283.vasp,In1Ni1S1Cl1,-1.0625480975,0.3357254462499969 -Ag2H4C6Cl2_2_279.vasp,Ag2H4C6Cl2,-4.151244594285714,0.3936471378571413 -Co2H2S2_59_3910.vasp,Co2H2S2,-2.6401224416666667,0.6646654373148119 -H2Pb2Cl2O2_12_7004.vasp,H2Pb2Cl2O2,-2.90161021875,0.2278836012499998 -Ti4S4Cl4_31_19158.vasp,Ti4S4Cl4,-4.312093110833334,-0.0171378555555596 -Sb1Mo1P1_156_15467.vasp,Sb1Mo1P1,-3.145482643333333,0.1313028841666638 -Cr2N2Cl2_59_4426.vasp,Cr2N2Cl2,-3.9369602816666665,0.0135602761111077 -Cd2Sb2S4Cl2_26_3559.vasp,Cd2Sb2S4Cl2,-1.495241024,0.1763565842500001 -Sb4S8_31_15821.vasp,Sb4S8,-2.4472301133333336,0.3257449532291638 -Zr3B2O2_187_21740.vasp,Zr3B2O2,-5.991576497142857,0.3088163880952335 -Al1Tl1Hg1S4_156_756.vasp,Al1Tl1Hg1S4,-1.823955122857143,0.1461850961607109 -Tl1Pd5F2_123_19320.vasp,Tl1Pd5F2,-0.7368822725,0.96325669875 -Na2Os2S4I8N2_7_12255.vasp,Na2Os2S4I8N2,-1.8987369866666663,0.1533780384027759 -Sc1Pb5_47_15978.vasp,Sc1Pb5,-0.9842926483333332,0.6289385241666651 -K2Ru2C2Cl8O4_31_9315.vasp,K2Ru2C2Cl8O4,-2.820528936666667,0.377799851527766 -Sc4Br10_11_16226.vasp,Sc4Br10,-2.2262572478571427,0.1274560507142811 -Hf2Te1Se1I2_6_7627.vasp,Hf2Te1Se1I2,-3.191466651666667,0.0233071070833307 -Lu2Te6_129_10321.vasp,Lu2Te6,-2.2920656675,0.1459110693749996 -Cu1Os1Se3S2Br1_1_4932.vasp,Cu1Os1Se3S2Br1,-1.9250155025,0.5176440791666668 -Ti4C3_164_19133.vasp,Ti4C3,-7.466100118571428,0.3276164657142786 -Ti3Te1I1N2_156_19106.vasp,Ti3Te1I1N2,-5.872854537142857,0.0561616848809424 -Co2C8_111_3887.vasp,Co2C8,-5.075032726,1.7530074200000003 -Na4P4O8_14_12401.vasp,Na4P4O8,-4.57396377125,0.2389943592499951 -Hf3Zr1Br3Cl1O4_1_7748.vasp,Hf3Zr1Br3Cl1O4,-5.231007919166667,0.1832108181770801 -Ni1Br2_187_13289.vasp,Ni1Br2,0.32145381,0.27655339 -B2Mo3Cl2_187_1678.vasp,B2Mo3Cl2,-3.613097241428572,0.2300466019047591 -Ag1Ge1Se1Cl3_1_63.vasp,Ag1Ge1Se1Cl3,-1.2526167316666668,0.1790530594097208 -Cu1O2F2_164_4926.vasp,Cu1O2F2,-1.374600724,0.7465040105000001 -Zn3As1_187_21199.vasp,Zn3As1,1.07251129,0.3275598221875 -Ta1F4_123_17542.vasp,Ta1F4,-4.273669374,0.2741238247999996 -Ge1Te1Ru1S2Br1Cl1_1_6713.vasp,Ge1Te1Ru1S2Br1Cl1,-2.0853393514285714,0.4338936614136865 -Ge2_2_6899.vasp,Ge2,-2.70671756,-0.5337419350000001 -Mn2Ge1Sb1Br2_6_11086.vasp,Mn2Ge1Sb1Br2,-1.542111685,0.4006426130555531 -Zn2Sb4O8_1_21154.vasp,Zn2Sb4O8,-3.544579594285714,0.1475765939285694 -Y3C2F2_187_20790.vasp,Y3C2F2,-5.747938141428572,0.2393898485714236 -Mn2Al2O5_187_10951.vasp,Mn2Al2O5,-5.22327602,-0.068947883812268 -P2Pt3S8_164_14035.vasp,P2Pt3S8,-2.887231510769231,0.0871254190659271 -Li2Ag2C4O8_4_9821.vasp,Li2Ag2C4O8,-4.854422916875,0.259989005625 -Ga1I2_164_6203.vasp,Ga1I2,-0.6023031799999999,0.1941726658333333 -As8_55_1409.vasp,As8,-2.6453379275,0.5658466325 -Hf1I4_123_7202.vasp,Hf1I4,-1.489802016,0.3229272509999998 -Ta2Se2_164_17876.vasp,Ta2Se2,-4.8152378075,0.5886794649999949 -P2H2Pb2S6_7_13978.vasp,P2H2Pb2S6,-2.9676896875,0.0507429377380907 -Re6Se8Cl2_2_15130.vasp,Re6Se8Cl2,-4.2972120075,0.0633356762500003 -Zr1Sc1Mn1Ir3Cl5O7_1_21434.vasp,Zr1Sc1Mn1Ir3Cl5O7,-3.891034102777778,0.3240937956597021 -Ca1Zn2P2O2_12_2900.vasp,Ca1Zn2P2O2,-1.929099337142857,1.172203268556545 -V1Te1S1_156_19935.vasp,V1Te1S1,-2.97611395,-0.3136076040277799 -Hf3Sc1Br4N3O1_8_7728.vasp,Hf3Sc1Br4N3O1,-5.611641860833333,0.074432154166667 -Li1Sb3P2O10_1_9786.vasp,Li1Sb3P2O10,-4.8494556075,0.1930649171874954 -Ti1Cl2_6_18760.vasp,Ti1Cl2,-3.3292445333333336,0.3783685375000001 -Na1Ni1Sb2O6_149_11916.vasp,Na1Ni1Sb2O6,-3.367615191,0.4176860391249957 -Si2H8_7_16405.vasp,Si2H8,-3.459190222,0.999447376 -Ag2I2_164_316.vasp,Ag2I2,0.403965685,0.05649238 -Cd1S1I1F1_156_3411.vasp,Cd1S1I1F1,-0.531305425,0.3457119938020834 -Cd1B4Br2N2F4_47_3272.vasp,Cd1B4Br2N2F4,-3.8855752384615383,0.3612183395940093 -Tl2Os1_123_19476.vasp,Tl2Os1,-0.8199873766666667,1.0012833133333316 -Sr2Ag1Te2Cl2_38_17114.vasp,Sr2Ag1Te2Cl2,-1.2935854057142857,0.4655033583333297 -Sn1Te2_187_16703.vasp,Sn1Te2,-1.1473418066666663,-0.5995945677777781 -Cr1Cl2_187_4143.vasp,Cr1Cl2,-1.7912189266666667,0.2836813544444425 -Bi1I1O1_156_2340.vasp,Bi1I1O1,-1.89868602,0.5748844449999997 -Sc2Br2O2_129_16039.vasp,Sc2Br2O2,-4.643313105,0.0964510849999999 -Li1Cu2F5_1_9692.vasp,Li1Cu2F5,-1.64177732,0.1213821162499998 -Mn2Te4P2Cl2_10_11324.vasp,Mn2Te4P2Cl2,-1.917533097,0.4563163139444403 -Pt4Br2Cl2O4_1_14696.vasp,Pt4Br2Cl2O4,-1.841524011666667,0.3143860000925902 -Sc2Br2N1_164_16037.vasp,Sc2Br2N1,-4.055694669999999,0.0307023900000009 -Te2Ir1_115_18385.vasp,Te2Ir1,-1.7852412666666666,0.6582610933333335 -Mn1Nb1Se3_6_10813.vasp,Mn1Nb1Se3,-3.1620885000000003,0.3693071881293077 -Co1Ni2Se4_8_3798.vasp,Co1Ni2Se4,-1.376578422857143,0.1293517759999985 -Zn1H2_115_20955.vasp,Zn1H2,-1.3724042033333337,1.0458530866666649 -In1Ag1Sb2S6_149_8183.vasp,In1Ag1Sb2S6,-2.079981394,0.2917682284374978 -Bi2W4Br16O4_2_2584.vasp,Bi2W4Br16O4,-2.4221099657692307,-0.4489821586448037 -K2H6C2O8_4_9136.vasp,K2H6C2O8,-3.327847567777778,1.3141632506481442 -Ag2Hg2S2Cl2_26_298.vasp,Ag2Hg2S2Cl2,-0.09456937375,0.122451615625 -Sr1Sn1S1Br1_8_17086.vasp,Sr1Sn1S1Br1,-1.96081816,-0.0717565984375001 -Cu4N2O12_11_5431.vasp,Cu4N2O12,-3.0648602338888886,0.3245628101388869 -Na2Cr2Au4S12_7_12063.vasp,Na2Cr2Au4S12,-1.876950264,0.3092506104374976 -V1W1I1Br5_1_19954.vasp,V1W1I1Br5,-1.58577912375,0.191162692113093 -Ba4Bi4Se8Cl4_14_2142.vasp,Ba4Bi4Se8Cl4,-2.3217827675,0.1297128670000004 -Si4Se4_53_16514.vasp,Si4Se4,-3.320593105,-0.2289870048437498 -Sr4Ga2Ni4O14_1_17440.vasp,Sr4Ga2Ni4O14,-3.4588551604166664,0.0204045829427057 -Au1Br1F2_1_1410.vasp,Au1Br1F2,-0.2415218125,0.23805894125 -Sn2Te6As2_147_16900.vasp,Sn2Te6As2,-1.623938921,-0.3957314478333348 -As18I4_11_1131.vasp,As18I4,-2.5311797190909093,0.0677351848484826 -Ca2Cu1S2I2_38_3001.vasp,Ca2Cu1S2I2,-1.71402376,0.0622568681904727 -Tl2I6_1_19442.vasp,Tl2I6,0.04845362,0.0769245396875 -W1S2_164_20450.vasp,W1S2,-4.297495556666667,0.175103093333333 -Tl2Fe2S4_12_19416.vasp,Tl2Fe2S4,-1.709278905,-0.0162553706249999 -Ga2Pd1O4_164_6432.vasp,Ga2Pd1O4,-3.7370727514285713,-0.0669364978571456 -K1Bi3_187_8882.vasp,K1Bi3,-0.2689179025,0.6011401350000002 -Ga1I1_99_6201.vasp,Ga1I1,-0.424625985,0.5182687166666656 -Sn2P3O10_5_16826.vasp,Sn2P3O10,-4.968642456,0.2180874144166518 -Y2B1Cl2_164_20693.vasp,Y2B1Cl2,-4.277857844,0.1077535885000007 -Rb2Hg4O8F6_31_14867.vasp,Rb2Hg4O8F6,-1.405399985,0.3633799928750003 -Na2Pb1O6F6_147_12262.vasp,Na2Pb1O6F6,-1.9317874073333332,0.9225838385 -Ce2Br2O2_164_3666.vasp,Ce2Br2O2,-4.703348305,0.1197550650000005 -Nb3Se1Cl7_156_13010.vasp,Nb3Se1Cl7,-3.25968509090909,0.042527620909091 -Ni2C2Cl2_59_13486.vasp,Ni2C2Cl2,-2.01535983,1.771162969999994 -Na1In1I4O12_2_11884.vasp,Na1In1I4O12,-2.81147521,0.1044549227777782 -Li2H8I2O4_2_9958.vasp,Li2H8I2O4,-3.6821867825,-0.1001564655208375 -Fe4Ge1Te2_164_6078.vasp,Fe4Ge1Te2,-1.0208233314285715,0.2894251492857128 -Cr2P4Au2O12_13_4455.vasp,Cr2P4Au2O12,-4.506607353,0.6041287661666619 -Ga1Ni1Se2_156_6216.vasp,Ga1Ni1Se2,-1.4840578125,0.053385759448529 -V1Zn1Cl3O1_3_19966.vasp,V1Zn1Cl3O1,-2.165526063333333,0.0566635324999976 -Y1Cr1F5_47_20625.vasp,Y1Cr1F5,-3.515929967142857,0.7874977983333243 -Ca2Ir1_123_3059.vasp,Ca2Ir1,-1.0131131166666667,0.2691913473958324 -Hf1V2Ag1S8_1_7360.vasp,Hf1V2Ag1S8,-3.352188415833333,0.3169301727083304 -Ni2Te6_11_13683.vasp,Ni2Te6,-0.81935923,0.1282061491666666 -Os2Cl2_164_13839.vasp,Os2Cl2,-2.44203764,0.7795610843749998 -B6N8_187_1780.vasp,B6N8,-6.694763710714286,0.7839513003571383 -Ba2Te2Au1I2_38_2067.vasp,Ba2Te2Au1I2,-1.2139698171428572,0.25493441285714 -K2Zn2P4H10O18_2_9394.vasp,K2Zn2P4H10O18,-4.4991996952777775,0.0653473200000007 -Be3Pb1_25_2281.vasp,Be3Pb1,-1.8811725725,0.1392422962500002 -Si4N8_26_16494.vasp,Si4N8,-6.109801,-0.354088446111116 -Cu2Pb2S2O12_11_5229.vasp,Cu2Pb2S2O12,-3.4073923466666667,0.4257828258333305 -Na1Al1As2Se6_5_11808.vasp,Na1Al1As2Se6,-2.376232072,0.249979038333331 -Nb2N1F2_164_12765.vasp,Nb2N1F2,-5.586674384,0.2553801697333293 -Rh2O2_187_15204.vasp,Rh2O2,-3.15007525,0.7183908837499998 -Sr1Ag2F12_115_17017.vasp,Sr1Ag2F12,-1.065939382,0.0329294169999996 -Na2B2H16O14_2_11974.vasp,Na2B2H16O14,-4.471902534411765,0.09037137955065 -Hf2Te2S1_164_7637.vasp,Hf2Te2S1,-4.394885644,0.0253797800000006 -Au2Se2_59_1551.vasp,Au2Se2,-0.39125782,0.28486246 -Y1Bi2S4_123_20609.vasp,Y1Bi2S4,-3.192847568571428,-0.3739795760416677 -Co1Re2O8_147_3812.vasp,Co1Re2O8,-5.348231337272727,0.0527544972727271 -Ag2P2Se6_162_353.vasp,Ag2P2Se6,-1.810026002,0.1716292639791645 -Nb2Te6As2_2_12925.vasp,Nb2Te6As2,-2.732386023,0.2859422252499948 -Bi4O2F8_13_2620.vasp,Bi4O2F8,-2.902261025,0.2276446860714254 -V1Pb1O3_99_19902.vasp,V1Pb1O3,-4.49735256,0.3514437524999983 -Li2P2H4O4_12_10036.vasp,Li2P2H4O4,-4.517502631666667,0.0548222428333242 -Hf4C3O2_164_7775.vasp,Hf4C3O2,-7.793239617777778,0.1398238827777707 -Cr2Sn2Te6_162_4513.vasp,Cr2Sn2Te6,-1.597806608,-0.4176877326666683 -Cu2I6_162_5178.vasp,Cu2I6,0.47524302,0.231802084947917 -Zr4Se4I4_7_21850.vasp,Zr4Se4I4,-2.9392902483333336,0.1506871251388863 -Li2Hf1_187_9962.vasp,Li2Hf1,-2.6133920466666667,0.4035843077777752 -Sc2N1F2_164_16104.vasp,Sc2N1F2,-5.170403312,-0.3276101826666715 -Ca3Ag2S4Br2_123_3145.vasp,Ca3Ag2S4Br2,-1.824324356363636,0.1253086626704489 -Te1W3Br3Cl1_1_18339.vasp,Te1W3Br3Cl1,-2.29564547125,0.7380641837499999 -Ge2I2N2_59_6779.vasp,Ge2I2N2,-3.061913395,0.2227255022222171 -W4N3O2_164_20585.vasp,W4N3O2,-6.2858348388888885,-0.2175499037868599 -Sr2Br2Cl2_129_17150.vasp,Sr2Br2Cl2,-2.054760863333333,0.1155725216666667 -P2Se2_2_14051.vasp,P2Se2,-2.74203292,0.3269025746874998 -Sn2Cl2F2_11_16757.vasp,Sn2Cl2F2,-2.0728520033333333,0.0899202199999997 -Ti2Br2O1_12_18899.vasp,Ti2Br2O1,-4.689042998,0.1129734213333342 -Cu2Te1Se1I1Br1_1_5327.vasp,Cu2Te1Se1I1Br1,-0.3734263783333333,0.1663938291666657 -P2F8_1_13976.vasp,P2F8,-3.115617181,0.0782644449999938 -Ta3H2C2_187_17960.vasp,Ta3H2C2,-6.756828961428572,0.3886950942857066 -K1Au1Br4O2_2_8879.vasp,K1Au1Br4O2,-0.825184825,0.2946986078125 -Cr1Mo1I1Br1O2_25_4212.vasp,Cr1Mo1I1Br1O2,-3.2218225950000003,0.0932653994444409 -Na2B2O14_2_11982.vasp,Na2B2O14,-3.9070312822222224,0.4388887084722184 -Nb2B1Ir1S2Br1_6_12632.vasp,Nb2B1Ir1S2Br1,-4.538957915714286,0.3538870900446332 -Cr2I2O2_59_4412.vasp,Cr2I2O2,-3.0561946916666667,0.0737231661111077 -Ir2O2_10_8799.vasp,Ir2O2,-3.4381221875,1.3479390550000003 -C4_123_2772.vasp,C4,-7.52656999,0.5897554200000004 -Pr2Sb2S4O2_129_14551.vasp,Pr2Sb2S4O2,-4.344934387,-0.0204867578333374 -In1Au1I1Br3O2_3_8195.vasp,In1Au1I1Br3O2,-1.00690678375,0.3759754032812465 -Nb3Te3Mo1Se5_1_13030.vasp,Nb3Te3Mo1Se5,-3.4781657533333337,0.1499835657291666 -In2Si2Se2_164_8603.vasp,In2Si2Se2,-2.60962862,-0.3439686950000021 -Bi2As2_1_2422.vasp,Bi2As2,-2.07488894,-0.2358626625000001 -Mo1I1Cl1_156_11515.vasp,Mo1I1Cl1,-1.3790040466666669,0.4373163874999999 -W1Br2O1_8_20418.vasp,W1Br2O1,-3.00797685,-0.0419482559460859 -Al1Ag1O2_156_596.vasp,Al1Ag1O2,-3.719809005,0.4718359374999998 -Sn1Au2O4_6_16611.vasp,Sn1Au2O4,-2.339550997142857,0.2195132564285684 -Be1P2S4F4_5_2229.vasp,Be1P2S4F4,-3.298751345454545,0.1803753873484816 -Mg4Sn4O8_2_10586.vasp,Mg4Sn4O8,-3.88706977625,-0.0729590256250001 -P12Au2_31_13903.vasp,P12Au2,-3.081472203571429,0.2987965617857107 -Li2Au1S2_12_9828.vasp,Li2Au1S2,-1.98687519,0.2120695919583315 -Ti1Tl4Se4_1_18862.vasp,Ti1Tl4Se4,-1.9057392622222225,0.3154076691666665 -Li2Re2O4F8_113_10048.vasp,Li2Re2O4F8,-4.1295466475,0.0232996181249998 -Li4Ga4Br12_11_10189.vasp,Li4Ga4Br12,-1.5472713,0.1517740189999985 -Te3P4Au2Br2_6_18554.vasp,Te3P4Au2Br2,-1.5309446345454545,0.2422308356493447 -Re2Se6_11_15086.vasp,Re2Se6,-3.3552221825,0.3430978345833334 -Na4Ge2S6O14_2_12385.vasp,Na4Ge2S6O14,-3.937949012692308,0.2498619372916585 -Mn1Fe1Ru1O7_1_10709.vasp,Mn1Fe1Ru1O7,-3.936579828,0.2652336531249968 -Rb2V1Cl6_164_14956.vasp,Rb2V1Cl6,-1.721974151111111,-0.0032458155555554 -Sr2Ca1Cu2Bi2O8_123_17166.vasp,Sr2Ca1Cu2Bi2O8,-3.533424383333333,0.1958096523333241 -P2Pb2C2S6F6_7_14005.vasp,P2Pb2C2S6F6,-3.14861743,0.3733801146944386 -Ca1Nb2O7_123_2860.vasp,Ca1Nb2O7,-5.807604906,0.4276302233749962 -Zn2Te2S8F4_7_21182.vasp,Zn2Te2S8F4,-1.650936930625,0.4532457552083334 -K2B2S6_1_8998.vasp,K2B2S6,-3.017265651,0.304869305111108 -Tl2I6_162_19440.vasp,Tl2I6,0.15738241375,0.1858533334375 -Li2Ce1As2_164_9856.vasp,Li2Ce1As2,-3.062406418,0.3472735810000003 -Cu3Ir1Se2S2I3Br1_1_5374.vasp,Cu3Ir1Se2S2I3Br1,-0.9562820808333332,0.1119382742982448 -Co2As2S7_6_3847.vasp,Co2As2S7,-2.52400383,0.7246963017583701 -K4Bi4P8Se24_14_9416.vasp,K4Bi4P8Se24,-2.315534405,0.0981367449999996 -Ni2Bi4I4O6_2_13474.vasp,Ni2Bi4I4O6,-2.310552053125,0.001088006875 -Ca2N2Cl2O6_59_3070.vasp,Ca2N2Cl2O6,-4.063340205,0.0871678577083332 -In1Te2Pb1_1_8365.vasp,In1Te2Pb1,-1.20789991,-0.5457789875000001 -In2S2_2_8554.vasp,In2S2,-2.1257971175,0.1538730475000003 -La4C2Br5_47_9625.vasp,La4C2Br5,-3.744619961818182,0.106457235454545 -I12N4_14_8157.vasp,I12N4,-0.62871902,0.4687654095312501 -Na2Cd4S6Cl6O2_31_12030.vasp,Na2Cd4S6Cl6O2,-1.2772563545,0.4552903003958307 -Sc1Sn3_191_16008.vasp,Sc1Sn3,-1.1446230075,-0.80845949 -La1Nb2O7_123_9570.vasp,La1Nb2O7,-6.476026989,0.1101506089999977 -Sn2Br8_1_16750.vasp,Sn2Br8,-0.535578832,0.3067270654999999 -Ga2Hg1O4_164_6382.vasp,Ga2Hg1O4,-3.271572207142857,-0.1455561752976238 -Pd2S2_10_14471.vasp,Pd2S2,-1.7391033825,0.3710279575000001 -Bi4Se6_12_2648.vasp,Bi4Se6,-1.963712111,0.1445995989999997 -Ni2I6_162_13527.vasp,Ni2I6,0.47683292125,0.0595320067187499 -Ag1Se1I2_1_128.vasp,Ag1Se1I2,-0.02049316,0.2711996480555539 -Ce2Sb2S4O2_129_3677.vasp,Ce2Sb2S4O2,-4.301701909,0.7945164907499971 -Ni2P2O10_31_13558.vasp,Ni2P2O10,-3.8228916807142856,0.338112341696422 -Bi6Se5_8_2681.vasp,Bi6Se5,-1.4858257545454547,0.2245602063636345 -Nb2S2I4_25_12841.vasp,Nb2S2I4,-2.56381557375,0.191695390625 -Hf2N1Cl2_164_7537.vasp,Hf2N1Cl2,-5.337170728,0.1404672179999959 -Mn3Ge1Se4Cl4O2_1_11380.vasp,Mn3Ge1Se4Cl4O2,-2.4345585178571425,0.2032814806547576 -Nb1N2_187_12540.vasp,Nb1N2,-6.728458486666667,0.5466568036666608 -Ir1F2_115_8734.vasp,Ir1F2,-1.4146227666666666,1.2510840277777755 -Ni1Pd1Se1S1Br1Cl1_1_13400.vasp,Ni1Pd1Se1S1Br1Cl1,-0.9985736816666666,0.0431094976041645 -Cs2Os2N2Cl10O2_11_4760.vasp,Cs2Os2N2Cl10O2,-2.50049519,-0.1458388864705914 -Ag2B4C2I2F4_2_185.vasp,Ag2B4C2I2F4,-3.436366941428571,0.2457485222222171 -B4H8O8_83_1754.vasp,B4H8O8,-5.18854932,0.538244635000001 -Sr2Au1S2I2_38_17131.vasp,Sr2Au1S2I2,-1.6147927557142856,0.0789789580952347 -Ag2As4Se3Br2_6_169.vasp,Ag2As4Se3Br2,-1.5722901945454546,0.1611997777272689 -Ba4In2Br2O6_129_2159.vasp,Ba4In2Br2O6,-3.769260132857143,0.0375394750000004 -Mn2In2S5_156_11123.vasp,Mn2In2S5,-2.609616835555556,-0.0182463283333331 -Y2Sb2S4O2_129_20776.vasp,Y2Sb2S4O2,-4.742144355,0.0144331708749947 -Tl1P1O4_111_19311.vasp,Tl1P1O4,-4.289067125,0.1958147591666668 -Cr1Mo1Cl6_12_4209.vasp,Cr1Mo1Cl6,-1.79194242,0.015168831770831 -Nb2As2O6_162_12624.vasp,Nb2As2O6,-5.033409022,0.8670552630833308 -K2Eu2P2S8_11_9094.vasp,K2Eu2P2S8,-3.2729554642857144,0.0933054021428572 -Be2Si4_12_2269.vasp,Be2Si4,-3.365810615,-0.6219919866666686 -Ni2Sb2Se6_162_13614.vasp,Ni2Sb2Se6,-1.52736454,0.2646907224999986 -Mn3Au1Br3O5_1_11349.vasp,Mn3Au1Br3O5,-2.704553966666667,0.1756865664583302 -Cs3Sb2I9_164_4801.vasp,Cs3Sb2I9,-0.6543306792857143,0.082868344642857 -Tl2Ni4Se6_164_19464.vasp,Tl2Ni4Se6,-1.0467241458333334,0.1896350041666665 -Ge2P2H2O6_7_6802.vasp,Ge2P2H2O6,-4.871870002500001,-0.0913868482341387 -Ga2Te2I2_31_6506.vasp,Ga2Te2I2,-1.22490265,0.0332095041666666 -Li2Cu1S2_12_9883.vasp,Li2Cu1S2,-2.142791264,0.1821377586666668 -Ba1Ag2S8_89_1801.vasp,Ba1Ag2S8,-1.962949699090909,0.2112020115340872 -Na1In1Sb2Te6_5_11891.vasp,Na1In1Sb2Te6,-1.337865654,0.3380858126666651 -Hf1Zr2Br1N1Cl1O1_25_7408.vasp,Hf1Zr2Br1N1Cl1O1,-5.262526892857143,0.2301730083928477 -Ti3Se2N2F2_38_19103.vasp,Ti3Se2N2F2,-5.214766848888889,0.2311153914259148 -Nb1N1Cl2_38_12537.vasp,Nb1N1Cl2,-4.333210225,0.1479831525250001 -Ni2Te4Pd4_49_13677.vasp,Ni2Te4Pd4,-0.9143366,-0.1036853900000007 -V4S6_12_20362.vasp,V4S6,-3.86055886,0.120113297 -Al1P2Au1O6_149_703.vasp,Al1P2Au1O6,-4.597299864,0.7555541736999929 -Sr1Te2_115_17095.vasp,Sr1Te2,-0.99940147,0.7028440522222208 -Ti1Zn1Bi2O6_8_18872.vasp,Ti1Zn1Bi2O6,-4.245006227999999,0.3629231294999964 -In2Ga2H8_3_8444.vasp,In2Ga2H8,-2.3226923333333334,1.4987295066666615 -Ta1Ga1Ni1S1Br2Cl2_1_17546.vasp,Ta1Ga1Ni1S1Br2Cl2,-2.12129894375,0.2724879685491023 -Nb1Ge1Se1Br1_1_12514.vasp,Nb1Ge1Se1Br1,-3.2445778675,-0.1904434802678641 -Rh2C4_12_15180.vasp,Rh2C4,-4.720639641666667,1.717558951666661 -Pr1Al3Cu1_99_14528.vasp,Pr1Al3Cu1,-1.6236550479999998,0.841243478 -Ca1Pb1S1Br2O1_1_2867.vasp,Ca1Pb1S1Br2O1,-2.106745103333333,0.1394073691666666 -Cr1Rh1S2Br1Cl1_6_4235.vasp,Cr1Rh1S2Br1Cl1,-2.327121576666667,0.121378822777772 -Hg2S2I2_59_7996.vasp,Hg2S2I2,0.2765879566666666,0.3775632218402761 -Tb2I6_59_18203.vasp,Tb2I6,-1.57136997625,0.0644658424999999 -Au2C2Cl2O2_59_1461.vasp,Au2C2Cl2O2,-3.07781442125,0.1851287156249998 -Cd2Bi2Br2O4_11_3465.vasp,Cd2Bi2Br2O4,-2.1224663,0.1493158829999998 -Fe2P2Se4Br2_26_5919.vasp,Fe2P2Se4Br2,-2.069282705,0.2171299797777759 -Na1H12Au1C4S4O12_2_11873.vasp,Na1H12Au1C4S4O12,-4.284463393823529,0.2243368512561134 -Mn1Al2O4_156_10626.vasp,Mn1Al2O4,-5.337637460000001,0.0863140399999995 -B4Au2Br2N2F4_2_1746.vasp,B4Au2Br2N2F4,-3.550464797857143,0.6728933802380845 -Ag4O4_26_537.vasp,Ag4O4,-1.17813260875,0.1889699437500001 -U2H4O8_14_19711.vasp,U2H4O8,-6.117889440714285,0.1198836589285718 -Al1I1_99_672.vasp,Al1I1,-0.55668927,0.9058418624999988 -Au4Se4_12_1604.vasp,Au4Se4,-0.5804894,0.0956308799999999 -Co2Au1O4_187_3857.vasp,Co2Au1O4,-3.2957716042857146,-0.273849826964292 -Mo1Se2_187_11551.vasp,Mo1Se2,-3.018917736666667,0.0264954866666666 -Ta2S2_164_17855.vasp,Ta2S2,-5.5172205,0.2509000462499946 -P4Au2Se3I2_6_14072.vasp,P4Au2Se3I2,-1.699635031818182,0.1639297639042152 -Ta1Nb1Se2_8_17576.vasp,Ta1Nb1Se2,-4.838446205,-0.202550576250005 -Ba1Cu1Re1O5_99_1823.vasp,Ba1Cu1Re1O5,-4.30004911,0.6403413576241954 -Rh2Se2I2_11_15239.vasp,Rh2Se2I2,-1.6283831716666668,0.0773026686111093 -Nb2Ni1Se5_38_12775.vasp,Nb2Ni1Se5,-3.19564423,0.24085764875 -Pd1O1F1_1_14371.vasp,Pd1O1F1,-1.9146944933333327,0.3672526477777758 -Mg1V2O6_12_10411.vasp,Mg1V2O6,-5.1262334577777775,0.2417589058333233 -Ta2S2Br2_59_17843.vasp,Ta2S2Br2,-4.274016358333333,0.0942052976190445 -Cr2Ag2P4S12_13_4298.vasp,Cr2Ag2P4S12,-2.8841702115,0.079351677 -V4Te4O16_14_20376.vasp,V4Te4O16,-4.5093752404166665,0.2193740824999999 -Bi8Se4O20_39_2696.vasp,Bi8Se4O20,-3.800380053125,0.0446073356249998 -Cu1H4S2N12_6_4902.vasp,Cu1H4S2N12,-4.7138470047368415,-0.063957040564702 -Na1Br1_123_11830.vasp,Na1Br1,-1.471351705,-0.4337930599999999 -Ce1Pb2_123_3650.vasp,Ce1Pb2,-1.4029688333333334,0.1286999683333334 -Sn6Br16_1_16984.vasp,Sn6Br16,-0.9607558613636364,0.0586513202272719 -Al1As1_187_606.vasp,Al1As1,-2.686942985,-0.3735174849999998 -Na2N2O6_1_12218.vasp,Na2N2O6,-4.333840422,0.0760211499999998 -V2O2F6_1_20120.vasp,V2O2F6,-3.800582282,-0.6706756727499994 -Ta2C1F2_164_17676.vasp,Ta2C1F2,-6.146524782,0.3770123577999917 -In2Sb6_156_8573.vasp,In2Sb6,-1.51213335375,0.0105905749999999 -V1Bi1Sb1_156_19780.vasp,V1Bi1Sb1,-2.027619223333333,0.3946468588888865 -Nb4C3F2_164_13044.vasp,Nb4C3F2,-6.668085873333333,0.0702913911851785 -Sb2Au2S6_12_15544.vasp,Sb2Au2S6,-1.6702753820000005,0.3982250839374974 -Al1Tl1Cd1Se4_156_753.vasp,Al1Tl1Cd1Se4,-1.5404636914285714,0.0405979954761881 -Cu3Ni1S2Br2Cl2O1_1_5377.vasp,Cu3Ni1S2Br2Cl2O1,-0.8417761518181819,0.3629971073224407 -Zn1Te1Pd1O5_1_21019.vasp,Zn1Te1Pd1O5,-2.75415901,0.3546302699999999 -Ni3As2O8_164_13691.vasp,Ni3As2O8,-3.315777090769231,-0.0985968265384648 -Ga1As2Au1O6_149_6135.vasp,Ga1As2Au1O6,-3.4336810909999995,0.7314248666249965 -Ag2C2S2Cl2_31_221.vasp,Ag2C2S2Cl2,-2.10567841375,0.6425336023437498 -Bi6B10O21_2_2662.vasp,Bi6B10O21,-5.554328741621622,0.2682232267567519 -Sc2S2_129_16138.vasp,Sc2S2,-4.1656982125,-0.2898620974999999 -Ta1Mn1Cr1S3I3Cl1_1_17562.vasp,Ta1Mn1Cr1S3I3Cl1,-2.539970767,0.1181185144749958 -Er1Ag1P2Se6_149_5541.vasp,Er1Ag1P2Se6,-2.5862395620000003,0.0698279144999998 -Se2N2_12_16288.vasp,Se2N2,-3.3615896425,0.6575616568750002 -Ag2Bi2Te4_26_198.vasp,Ag2Bi2Te4,-0.667609805,0.294329405625 -Cu2H4Pb2S2O12_11_5129.vasp,Cu2H4Pb2S2O12,-3.734172557272727,0.2712862056439307 -Ba2In1Ag1Hg1S5_99_2009.vasp,Ba2In1Ag1Hg1S5,-1.756999748,0.4013383148035698 -Te2Mo2Cl2_59_18406.vasp,Te2Mo2Cl2,-1.8172762416666668,0.387088987222222 -Ta2Sb2Te6_2_17867.vasp,Ta2Sb2Te6,-2.732292725,0.2841103258333322 -Ag2Br2_51_204.vasp,Ag2Br2,0.196115095,0.1000889699999999 -Sr2N2Cl2O6_59_17283.vasp,Sr2N2Cl2O6,-4.089579186666667,0.1247887889583339 -Na3Ho1Cl6_2_12351.vasp,Na3Ho1Cl6,-2.309489185,0.131362438 -Zn2I2_2_21109.vasp,Zn2I2,0.8655463275,0.0288510490625001 -Nb2Ni1Te1Se3_1_12777.vasp,Nb2Ni1Te1Se3,-3.014076925714285,0.1675485815178549 -Ge1W1I5Cl1_1_6722.vasp,Ge1W1I5Cl1,-0.83052632125,0.495822946041666 -Sb2As4H2S12_4_15540.vasp,Sb2As4H2S12,-2.7181656625,0.4891490545624977 -Y4H2S2N3_164_20826.vasp,Y4H2S2N3,-5.817464089090909,-0.7612662692045582 -Nb2F2_129_12710.vasp,Nb2F2,-3.67878237,1.4281185600000008 -Cr1O2F2_164_4221.vasp,Cr1O2F2,-2.67530106,0.8081978798749963 -Ba1Pb2_164_1852.vasp,Ba1Pb2,-0.32563319,0.6700350791666668 -Mn3Ga1S8_164_11377.vasp,Mn3Ga1S8,-2.8253804725,0.4128977126822895 -Ga4S7Br1_6_6567.vasp,Ga4S7Br1,-2.537738999166667,0.1545639388802082 -In2Ga2Cl8_10_8442.vasp,In2Ga2Cl8,-1.4333793316666668,0.1821372279166664 -Dy2Br6_59_5519.vasp,Dy2Br6,-2.30286398875,0.04850178 -Cu2I2O2_59_5169.vasp,Cu2I2O2,-1.0295481583333337,0.347342906333331 -Sr2H2S6N2_59_17235.vasp,Sr2H2S6N2,-2.9919244241666667,0.4929808242838518 -Zr2Sc6C4Cl2O6_1_21669.vasp,Zr2Sc6C4Cl2O6,-5.7858893585,0.2933401418749898 -Bi4S6_4_2641.vasp,Bi4S6,-2.238196887,-0.7847749900000001 -Ca3Ni2I2O5_123_3193.vasp,Ca3Ni2I2O5,-2.96250291,-0.2960458496875001 -Mn2Al2Te5_156_10960.vasp,Mn2Al2Te5,-1.8640480644444448,0.1882245258712098 -Sr1Pb1S1Br1_1_17073.vasp,Sr1Pb1S1Br1,-1.9114252275,0.4353395137499998 -Rh2S2Cl2_11_15216.vasp,Rh2S2Cl2,-2.3097113583333333,0.0653020749999999 -K1Mo2S2Br6_47_8919.vasp,K1Mo2S2Br6,-1.5701067827272726,0.2585016925162309 -In2Co2Se5_187_8414.vasp,In2Co2Se5,-1.970710285555556,0.088589603259255 -K2Ag6Se4_12_8970.vasp,K2Ag6Se4,-0.3840800741666666,0.1041605525 -Li2Mn2P2O8_51_9998.vasp,Li2Mn2P2O8,-4.662631139285715,0.4728817778571379 -Ni4Sn12_35_13766.vasp,Ni4Sn12,-0.795731805625,-1.3892339435416652 -Ti1Sb2_187_18845.vasp,Ti1Sb2,-3.58657188,0.5665195783333332 -Gd2C2Br2_12_6606.vasp,Gd2C2Br2,-4.531523245,0.0385427783333334 -Mo2Se1Br5_1_11679.vasp,Mo2Se1Br5,-1.49001969875,0.1694604101562481 -In2Cl4_10_8402.vasp,In2Cl4,-1.325777095,0.0882127733333333 -Tl1Se1Cl1_8_19342.vasp,Tl1Se1Cl1,-0.96365819,0.4240032011111099 -Ca1As2F12_115_2800.vasp,Ca1As2F12,-2.7068346906666667,-0.0289014366666666 -Ag1B6H4N6O2_6_18.vasp,Ag1B6H4N6O2,-5.223126807894737,0.2586394198420962 -Mn1Cl2_187_10665.vasp,Mn1Cl2,-1.40971473,0.3860878333333331 -Hf1As2S6F2_164_7108.vasp,Hf1As2S6F2,-3.0421213227272728,0.8939859726420376 -As2Br6_11_1193.vasp,As2Br6,-1.094270105,0.0751286174999998 -Bi2P2Se6_8_2494.vasp,Bi2P2Se6,-2.320636027,0.1720646577708315 -Zn4Cu4Ge8O24_14_21218.vasp,Zn4Cu4Ge8O24,-3.62623354525,0.2510644750833304 -Ni2C4S12_14_13490.vasp,Ni2C4S12,-3.266410215,0.3152588726388854 -Zr2S1N1Cl2_1_21641.vasp,Zr2S1N1Cl2,-4.460367735,0.4149478549999998 -Ti2C4_129_18919.vasp,Ti2C4,-6.540212553333333,1.0977315199999929 -Ti1Co1Se2Br1Cl1_6_18765.vasp,Ti1Co1Se2Br1Cl1,-2.8100770983333336,0.0857300028611059 -In2Co2S5_187_8412.vasp,In2Co2S5,-2.4356486577777776,0.1849228010185164 -Mo2Br2_129_11572.vasp,Mo2Br2,-1.185820545,1.5537250906250002 -Zr1Ta1S2Br4_1_21452.vasp,Zr1Ta1S2Br4,-3.221401795,0.2024062275000002 -Cr2Te2S10F4_2_4524.vasp,Cr2Te2S10F4,-2.372888952222222,0.3496495896990717 -Ti3N2F2_187_19095.vasp,Ti3N2F2,-6.787924245714286,-0.2760240566666851 -Ta2C2F2_59_17684.vasp,Ta2C2F2,-6.357252603333333,0.2777050609999876 -Mn1Nb1Br1Cl1O2_1_10802.vasp,Mn1Nb1Br1Cl1O2,-3.989485075,0.2728875166666674 -Ti2I6_25_18962.vasp,Ti2I6,-1.9323000975,0.1216910612500001 -Hf4S5Br3_8_7811.vasp,Hf4S5Br3,-4.419288094166666,0.127549904374995 -Mo3Rh1Se2S3Br3_1_11722.vasp,Mo3Rh1Se2S3Br3,-2.552794095,0.1906191633333334 -Mg5Ti1_8_10595.vasp,Mg5Ti1,-0.67028292,0.1864352830555509 -Pd1S1Cl1_8_14382.vasp,Pd1S1Cl1,-1.3572990833333334,0.2727906693749997 -Y2Cu3O6_12_20725.vasp,Y2Cu3O6,-4.1251881718181815,0.4658582767727188 -Hf1Nb1Br2N2_25_7240.vasp,Hf1Nb1Br2N2,-5.62620696,0.1108778071111009 -Ni1Cl2_187_13313.vasp,Ni1Cl2,-0.0193960166666666,0.29009931 -Os2Cl6_162_13842.vasp,Os2Cl6,-1.85957691625,0.0285972153124998 -Mn1Cu1Sn3Se1S2I6_1_10694.vasp,Mn1Cu1Sn3Se1S2I6,-1.0547345742857144,0.182385787880951 -Ta2Se4F4_12_17880.vasp,Ta2Se4F4,-3.941587308,0.1907794412333305 -Sb12Te12_7_15420.vasp,Sb12Te12,-1.6191847095833334,0.2999978641666645 -Sc2In1I1Br1O4_1_16101.vasp,Sc2In1I1Br1O4,-4.056419595555556,0.4703501117361064 -Hg2Te2Au2I2_26_8026.vasp,Hg2Te2Au2I2,0.55939585625,0.4419235794270831 -Mo1S2_164_11544.vasp,Mo1S2,-3.457206513333333,0.3089121050000005 -Al4O6_7_1080.vasp,Al4O6,-5.984101142,0.1394336959999993 -Mo2P1Cl2_2_11654.vasp,Mo2P1Cl2,-2.66215213,0.2259074966666669 -Ti3S2N2_187_19101.vasp,Ti3S2N2,-6.886482441428571,-0.1874153928571478 -Pd1Cl2O8_147_14358.vasp,Pd1Cl2O8,-2.245347589090909,0.4349895530303018 -Cu2Mo1S4_1_5185.vasp,Cu2Mo1S4,-2.06351084,0.3290564030952356 -As4Se2O12_18_1368.vasp,As4Se2O12,-3.960987670555556,0.1731642994444404 -Ni1Ir3Br4O4_6_13373.vasp,Ni1Ir3Br4O4,-2.4257240975000003,0.3152747219444403 -Cs2Cd4Se2S6F6_31_4698.vasp,Cs2Cd4Se2S6F6,-1.3328957065,0.3881800894583308 -Mo2N1Cl2_164_11631.vasp,Mo2N1Cl2,-3.20994327,0.4582775866666668 -Al2F2_129_818.vasp,Al2F2,-2.6208374525,0.8502757291666634 -Sn3Ir1_187_16915.vasp,Sn3Ir1,-1.2544032575,0.8036227196874985 -Zn1Sb4O8_1_21008.vasp,Zn1Sb4O8,-3.835252871538462,0.1768552643269168 -Hg4Te4O12F4_29_8092.vasp,Hg4Te4O12F4,-2.297651813333333,0.1783762747395813 -Cd2Br2O2_59_3477.vasp,Cd2Br2O2,-0.7362996900000001,0.3515568325694418 -Ta3H2N2O2_187_17961.vasp,Ta3H2N2O2,-6.598866672222222,0.7105418826296193 -Hf1Se2_123_7308.vasp,Hf1Se2,-4.14396537,0.5838528933333338 -Hf3H2C2S2_187_7705.vasp,Hf3H2C2S2,-5.7898659044444445,0.3265782155555431 -K2C4S2_31_9034.vasp,K2C4S2,-3.93996072625,1.0274103433333337 -V1Ag1S2_156_19760.vasp,V1Ag1S2,-2.4439271775,0.27063702375 -Nb2I5_1_12751.vasp,Nb2I5,-1.581306377142857,0.4870729567857088 -V2S2I2_59_20157.vasp,V2S2I2,-2.5028789616666667,0.1758190199999973 -Hf2S2Br1Cl3_1_7566.vasp,Hf2S2Br1Cl3,-3.7944488075,0.1314598441406254 -Zr1Sb1Te2N1_1_21421.vasp,Zr1Sb1Te2N1,-3.545944704,0.4772173932499998 -B1N1_187_1629.vasp,B1N1,-7.76722489,0.0356508525000007 -Cr1Ag1S3Cl2_1_4102.vasp,Cr1Ag1S3Cl2,-1.7804864071428572,0.1901601038988061 -Ta4Ag1S8_6_18000.vasp,Ta4Ag1S8,-4.729079960769231,0.2190291311538459 -Fe2W2S8I2_129_6037.vasp,Fe2W2S8I2,-2.46045943,0.2316695309821397 -Nb2Cl10_51_12674.vasp,Nb2Cl10,-1.9730769425,0.5003881041666667 -Al1Cl1_99_627.vasp,Al1Cl1,-1.45669086,0.8743092641666648 -P1Br1O1_156_13912.vasp,P1Br1O1,-2.707511236666667,0.7897844064444373 -Na1Ti1Te2_156_11945.vasp,Na1Ti1Te2,-2.76377204,0.21435403625 -Bi2F2_12_2453.vasp,Bi2F2,-1.6514369525,0.5010562895833313 -K2Cd4Se2I6O6_31_9060.vasp,K2Cd4Se2I6O6,-1.3267912320000002,0.1087213882499998 -Os2Br6_191_13835.vasp,Os2Br6,-1.0725459525,0.4295765250000001 -Rb2Fe4Se6_51_14840.vasp,Rb2Fe4Se6,-1.24062552,0.1632634358333321 -Al2Zn2S5_156_1039.vasp,Al2Zn2S5,-2.4429588855555555,0.0850778204444417 -Hf4Se4Br4_31_7814.vasp,Hf4Se4Br4,-3.718690245833333,0.0564963999999972 -Na1C2_99_11834.vasp,Na1C2,-2.89353317,2.6251016833333285 -Ga2Te2Br2_31_6497.vasp,Ga2Te2Br2,-1.4912040233333332,0.0385402166666668 -Ge2Te6As1_162_6892.vasp,Ge2Te6As1,-1.8017599366666663,-0.1277468012037071 -V4Se12_11_20365.vasp,V4Se12,-2.78584327,0.076821102 -Hf2Br6_162_7452.vasp,Hf2Br6,-2.5849414475,0.2070492970833304 -Cu1Se1S1Cl1_8_4975.vasp,Cu1Se1S1Cl1,-1.11939668,0.2714262084375001 -Y3S2N2F2_187_20805.vasp,Y3S2N2F2,-4.905978214444445,0.9132427188888834 -Co1Cu1Te4_1_3732.vasp,Co1Cu1Te4,-0.9276901566666668,0.345485968333332 -P4_53_14132.vasp,P4,-3.9947304725,0.0512655125000001 -Ca1S2_115_2874.vasp,Ca1S2,-1.82075253,1.015650129791664 -Na2Hg4Se2Br6O6_31_12162.vasp,Na2Hg4Se2Br6O6,-1.3775753825,0.1396774528750006 -Rb1Ge1O2_156_14732.vasp,Rb1Ge1O2,-3.0806525825,0.697209376562496 -Cr1S2_115_4248.vasp,Cr1S2,-2.984583423333333,0.479029783333333 -Ce2O3_150_3672.vasp,Ce2O3,-5.18973229,1.103260854249999 -Ta13S26_2_17501.vasp,Ta13S26,-5.305176873076923,0.1155557152564101 -Ag2S1O4_21_373.vasp,Ag2S1O4,-2.7502683042857146,0.2001351457142854 -Cr2Br2_129_4333.vasp,Cr2Br2,-1.3414618625,1.0663666666666645 -Nb1Te4W1I1_1_12606.vasp,Nb1Te4W1I1,-2.307787647142857,0.4781695104870063 -Ga2Co1O4_164_6324.vasp,Ga2Co1O4,-4.185844022857142,-0.0881103828571427 -Cd1Sn2S2F2_12_3433.vasp,Cd1Sn2S2F2,-1.79748619,0.2695602774999963 -Ce2P6H16O14_2_3673.vasp,Ce2P6H16O14,-4.74893573131579,0.0671228248684118 -Na2Hg4Te2I6O6_31_12172.vasp,Na2Hg4Te2I6O6,-1.1391803535,0.1771179512083343 -Pb2C1O6_156_14226.vasp,Pb2C1O6,-3.64555308,0.7987100109722185 -Ga2P2S6_143_6426.vasp,Ga2P2S6,-3.004588531,0.1679588305357077 -Ag2Te2_164_463.vasp,Ag2Te2,-0.21308739,0.1445450529166666 -Mn1Br2_115_10656.vasp,Mn1Br2,-0.9520604366666668,0.3306069541666667 -Zr1Nb3N3Cl4O1_8_21369.vasp,Zr1Nb3N3Cl4O1,-5.483351118333334,0.2009079910416564 -Mn2As2Cl2O4_10_10965.vasp,Mn2As2Cl2O4,-3.497473349,0.0381528387631505 -Mo2Se2_129_11689.vasp,Mo2Se2,-2.9517957275,0.6745733675000001 -Zr1Bi1Se2_99_21257.vasp,Zr1Bi1Se2,-2.78471903,0.3996125993749997 -Sm2Zn2P2O2_164_16591.vasp,Sm2Zn2P2O2,-3.72267713,0.1418172749999997 -Al4Te4Br4_14_1100.vasp,Al4Te4Br4,-1.9250746275,0.0571644475000001 -Si1S2_115_16359.vasp,Si1S2,-3.720248173333333,0.1609743800000003 -Ru1Br1Cl1O1_25_15258.vasp,Ru1Br1Cl1O1,-2.476159465,0.0676763725000002 -Al4Te6_1_1103.vasp,Al4Te6,-2.001455195,0.2138328992499998 -Nb3S2N2F2_187_13004.vasp,Nb3S2N2F2,-5.221206617777778,0.4364858996222125 -Na2Pd1O6_162_12265.vasp,Na2Pd1O6,-2.0875925188888886,1.1049287973611088 -Mn1Cr1S4I1Br1_1_10679.vasp,Mn1Cr1S4I1Br1,-2.160487325,0.30477283611979 -Si1O2_115_16355.vasp,Si1O2,-6.1807368233333335,0.2291760899999992 -Bi2Se2_187_2546.vasp,Bi2Se2,-1.5292987025,0.3054390549999989 -Ga1P2Au1S6_149_6231.vasp,Ga1P2Au1S6,-2.693853399,0.1038716689999976 -Cu2S2Br2_59_5243.vasp,Cu2S2Br2,-0.6880729416666668,0.3221336175396816 -Nb2Ge2Bi2_129_12727.vasp,Nb2Ge2Bi2,-3.5364567633333333,0.0850005870634835 -Nb2Te8Os2_11_12932.vasp,Nb2Te8Os2,-3.033036925,0.142153161249996 -Mo1I2_164_11517.vasp,Mo1I2,-0.9391005466666668,0.3957041138888889 -Ta2B1Te2_12_17660.vasp,Ta2B1Te2,-5.236315684,0.1697139203333342 -Tc4Te8_2_18257.vasp,Tc4Te8,-3.7844316866666663,0.0724953274999999 -Pt1O2_164_14584.vasp,Pt1O2,-3.28465069,0.2630339100000003 -Si1H2C1_156_16337.vasp,Si1H2C1,-4.8626557025,-0.0502387539583323 -Ge3Bi2S9_174_6906.vasp,Ge3Bi2S9,-2.64200009,-0.0930878211160743 -Mn2Co1B6C6_8_11057.vasp,Mn2Co1B6C6,-4.758425266666666,1.531899613833329 -Li2P2Pd2_12_10037.vasp,Li2P2Pd2,-2.4769209033333333,-0.0657823426388909 -Cs2Te2C2O6F6_1_4790.vasp,Cs2Te2C2O6F6,-3.18388861,0.6566980985648121 -Bi4B4_127_2600.vasp,Bi4B4,-2.01815112125,1.2957755254166667 -Mo2I4_11_11626.vasp,Mo2I4,-0.9391041,0.3957005605555556 -Ba4Te8As4F4_14_2193.vasp,Ba4Te8As4F4,-2.563113785,0.1344362000000005 -Ru1Br2_115_15260.vasp,Ru1Br2,-0.9640772066666666,0.7587061905555541 -Cu1Te1Ir1S1I1Br1_6_4988.vasp,Cu1Te1Ir1S1I1Br1,-1.208313965,0.1889024745959575 -Bi4W2O12_4_2657.vasp,Bi4W2O12,-4.755562943888889,0.2100292827777776 -Ag2C2Br2O2_31_211.vasp,Ag2C2Br2O2,-2.973806585,0.3155068612500002 -Al2O2_187_912.vasp,Al2O2,-5.2292854875,0.2776570216666618 -Al2F2_59_819.vasp,Al2F2,-3.139169265,0.3319439166666633 -Ta2Se2_129_17874.vasp,Ta2Se2,-4.99725962,0.4066576524999945 -Ge6P6_12_6966.vasp,Ge6P6,-3.6234060725,-0.5139202675000001 -Bi1S1Br1Cl1_6_2364.vasp,Bi1S1Br1Cl1,-1.197376115,0.4567890977343739 -Be2Rh1_123_2265.vasp,Be2Rh1,-2.940707096666667,0.76331752625 -Sb2Te6Pt2_12_15741.vasp,Sb2Te6Pt2,-1.5957030639999998,0.3010806550999984 -Ta2Te6Pd1_12_17921.vasp,Ta2Te6Pd1,-2.895780867777778,0.0944715152777728 -Ce1Sn2_123_3659.vasp,Ce1Sn2,-1.5618244366666667,0.3785838583333334 -Sr2Ag2_191_17117.vasp,Sr2Ag2,0.6675357025,0.18221458 -Ba4Bi4S8F4_14_2141.vasp,Ba4Bi4S8F4,-3.0408106295,0.1059190574999999 -Hf2Mn1Te1Cl4_8_7528.vasp,Hf2Mn1Te1Cl4,-2.80741217875,0.5374602181250001 -Ge2As2H2S6_7_6733.vasp,Ge2As2H2S6,-2.8846123341666665,0.2713628775520805 -K2Ge1O6F6_147_9111.vasp,K2Ge1O6F6,-2.1293069646666667,0.8764968275000002 -Au2S4Cl2_4_1525.vasp,Au2S4Cl2,-1.14398093125,0.125235061875 -Hf2As2O6_12_7429.vasp,Hf2As2O6,-6.044309449,0.3373450513333305 -Li2Cu2H8Cl6O4_2_9888.vasp,Li2Cu2H8Cl6O4,-2.9239199800000004,0.0564817356060557 -Al1Cd1In1S4_156_624.vasp,Al1Cd1In1S4,-2.3355775385714286,0.1016068974999999 -Li2Mn1P2S7Cl3_1_9988.vasp,Li2Mn1P2S7Cl3,-2.741269678,0.1682203420416574 -Ge1Cl2_164_6659.vasp,Ge1Cl2,-1.94007447,0.0271197666666667 -Nb1Se2_187_12580.vasp,Nb1Se2,-4.16603126,0.0898377475000007 -Pb2O2F2_59_14262.vasp,Pb2O2F2,-2.775575953333333,0.2955162841666663 -Te6As2Os2_162_18641.vasp,Te6As2Os2,-2.392591519,0.4776476666666652 -As2Se2_12_1304.vasp,As2Se2,-2.32999839,0.3768865491666637 -Hf2Sc1Se3S1Br3_1_7591.vasp,Hf2Sc1Se3S1Br3,-3.643850796,0.2016874944999978 -Sc1In1Se1S1I2_6_15950.vasp,Sc1In1Se1S1I2,-2.203075815,0.1008647146875001 -Sr2H8O4F4_53_17244.vasp,Sr2H8O4F4,-4.013053457222222,0.1289262407407374 -Na2H10C12N4O12_3_12091.vasp,Na2H10C12N4O12,-5.341169542,0.44736193709375 -Y2Al2Br2_164_20690.vasp,Y2Al2Br2,-3.243668955,0.1285327177777746 -Li4Nb2P8O26_2_10207.vasp,Li4Nb2P8O26,-5.67652121,0.0964600579749909 -C1Cl2_187_2725.vasp,C1Cl2,-1.2943870066666667,1.621340111666661 -Na2Cd4I6O8_31_12023.vasp,Na2Cd4I6O8,-1.1515153305,0.4634804335833324 -Ta3C2S2F2_187_17951.vasp,Ta3C2S2F2,-5.672151456666667,0.6570613839999868 -S8I8_2_15406.vasp,S8I8,-0.93392582125,0.1843810943749999 -Cr2I10_2_4409.vasp,Cr2I10,-0.2080946241666666,0.1012232847916663 -Te8Os4_3_18703.vasp,Te8Os4,-2.3195761691666665,-0.1177025008333334 -K2C2S8F6_1_9025.vasp,K2C2S8F6,-2.573486492222222,0.2901904602777692 -Mn2Se2_187_11284.vasp,Mn2Se2,-1.474307765,0.8141458862931013 -Nb1I5_47_12525.vasp,Nb1I5,-0.907929625,0.2769984033333335 -P4H8Pb2O16_2_14081.vasp,P4H8Pb2O16,-4.847315296666666,0.0721642721666624 -Ni2O2_187_13546.vasp,Ni2O2,-1.68425615,0.1415926950000001 -Zn1Cl2_164_20915.vasp,Zn1Cl2,-0.5147718866666667,0.0853927347916665 -Sb10S12_47_15410.vasp,Sb10S12,-2.025294840454545,0.7313868206818166 -Bi1Te1Cl1_156_2398.vasp,Bi1Te1Cl1,-1.30360982,0.2533039766666667 -Mn4H2C3O2_164_11435.vasp,Mn4H2C3O2,-4.4957082663636365,0.4854922690909047 -Na2Os2I8N2O4_7_12249.vasp,Na2Os2I8N2O4,-2.3105186694444444,0.1431498559027758 -Mg2P4_12_10498.vasp,Mg2P4,-2.647143068333333,0.5743277519166639 -U2S6_129_19721.vasp,U2S6,-5.06018873875,0.1215392312499998 -Mn1Pd1I2_1_10844.vasp,Mn1Pd1I2,-0.467366825,0.27885141296875 -Nb4F16_14_13067.vasp,Nb4F16,-4.0468891255,0.1524933484999964 -Ga2I6_189_6392.vasp,Ga2I6,-0.25802925375,0.3551392068749999 -Cr1Cl2_115_4141.vasp,Cr1Cl2,-1.9703448433333333,0.1045554377777757 -Hf3B2H2Se2_187_7680.vasp,Hf3B2H2Se2,-4.887052372222223,0.5334668344444395 -Re2Br6_162_15034.vasp,Re2Br6,-1.88786811,0.3650068995833331 -Hf2Tl2Cu2Se6_51_7656.vasp,Hf2Tl2Cu2Se6,-2.6770284341666666,0.1364849024999999 -Mo4C3Cl2_164_11734.vasp,Mo4C3Cl2,-4.4136666544444445,0.2309925548148105 -Ge2P2S6F2_7_6809.vasp,Ge2P2S6F2,-3.1611290008333337,0.0754802990538127 -Ta2S2I4_25_17849.vasp,Ta2S2I4,-2.86211507,0.2092309184374996 -Be2As1_25_2237.vasp,Be2As1,-2.26038075,0.8831231549999975 -Cr2N1F2_164_4423.vasp,Cr2N1F2,-4.06551563,-0.0562175804444486 -Cr2Ag2Te12P4_13_4305.vasp,Cr2Ag2Te12P4,-1.7213189255,0.3991747979166667 -K2Hf1S6F6_1_9168.vasp,K2Hf1S6F6,-2.4320969593333337,0.9026560494166668 -Mo2Cl2O2_6_11593.vasp,Mo2Cl2O2,-3.605732826666667,0.1991378330555555 -Na2Te2C2N2_31_12314.vasp,Na2Te2C2N2,-4.1508221025,0.0670982906666592 -Ga1Se1Cl1_8_6270.vasp,Ga1Se1Cl1,-1.9403970733333331,0.1816542483333332 -Cr2Ni1Te3Se1I1_1_4432.vasp,Cr2Ni1Te3Se1I1,-1.40995238625,0.1048953072499979 -Fe1Se2_123_5755.vasp,Fe1Se2,-1.4917419166666666,0.8101168416666666 -Ti1I2_115_18795.vasp,Ti1I2,-1.9789821566666663,0.5454470083333334 -Te2As2_12_18360.vasp,Te2As2,-1.97698522,0.3194417158333307 -Li2H6Pb1O6_147_9948.vasp,Li2H6Pb1O6,-4.064507838666667,0.0911872383333332 -Mn1Ag1I1N1Cl1O1F1_6_10612.vasp,Mn1Ag1I1N1Cl1O1F1,-2.10807069,0.4269899202678545 -Ti1Te2_164_18859.vasp,Ti1Te2,-3.5117112366666667,0.1184960216666666 -Ba3Co2S5Cl2_123_2102.vasp,Ba3Co2S5Cl2,-2.7775821541666663,0.1974427179427027 -Ca2Ag1Te2Cl2_38_2917.vasp,Ca2Ag1Te2Cl2,-1.2367772428571429,0.2875877501190447 -Os2Cl2_164_13840.vasp,Os2Cl2,-2.6506400925,0.5709586318749997 -Zr2S1I2_8_21640.vasp,Zr2S1I2,-2.88270484,0.2019873790000006 -Sc2Sn2H3Se1O7_1_16169.vasp,Sc2Sn2H3Se1O7,-4.5613292780000005,0.2351127402499899 -Sb1Te2H1S6_1_15514.vasp,Sb1Te2H1S6,-2.343468609,0.203821234958331 -Sb18Cl4_11_15426.vasp,Sb18Cl4,-2.0019698645454547,0.0963062388636342 -Ba2Au1Se2Cl2_38_1912.vasp,Ba2Au1Se2Cl2,-1.8973524428571429,0.3133804876339247 -Al1Ag1Sb2Te6_149_603.vasp,Al1Ag1Sb2Te6,-1.343772614,0.3045222856666649 -Mn2Mo1W2Br2N1Cl4O2_1_11135.vasp,Mn2Mo1W2Br2N1Cl4O2,-3.0788773064285717,0.2856952332203512 -Si2Br8_1_16392.vasp,Si2Br8,-1.476095063,0.0910149049999999 -Cr2B1Se2_164_4325.vasp,Cr2B1Se2,-3.445707608,0.071993541249995 -In2S1I1_1_8540.vasp,In2S1I1,-1.2486644175,0.3901360500000002 -V2C1S2F2_164_20020.vasp,V2C1S2F2,-3.6147802271428575,0.610954834761894 -Ni2P2N2O10_31_13557.vasp,Ni2P2N2O10,-4.477171813125,0.0298991398437507 -Ba2I2_129_2003.vasp,Ba2I2,-0.5831143925,0.6731721574999999 -Mn1Ga2Se4_164_10728.vasp,Mn1Ga2Se4,-2.4063894614285712,-0.0429801042857143 -K2Ru2N2O2F10_11_9323.vasp,K2Ru2N2O2F10,-3.0718077444444445,-0.1360459483564936 -Al1Cu1As2O6_149_636.vasp,Al1Cu1As2O6,-3.946496352,0.6420678506249966 -Ni1B4C2F6_47_13266.vasp,Ni1B4C2F6,-3.973674046153846,0.5183452003525548 -Nb1S2_187_12563.vasp,Nb1S2,-4.87254534,0.0848400649999998 -Pb6N6_12_14331.vasp,Pb6N6,-2.9303430733333333,0.5006252979166669 -Pb2S4N2_2_14282.vasp,Pb2S4N2,-2.96747969625,-0.5930041182812498 -Hg2Au2Se2I2_26_7933.vasp,Hg2Au2Se2I2,0.4102062425,0.0414973672916674 -Al1Fe5F2_123_659.vasp,Al1Fe5F2,-1.12221910875,1.4886248691666646 -Zr2N2F2_164_21609.vasp,Zr2N2F2,-6.184593766666667,0.114584661666667 -Ti4C3F2_164_19129.vasp,Ti4C3F2,-7.005949896666667,-0.4384398033333399 -Li2Pr1P2_164_10044.vasp,Li2Pr1P2,-3.444636694,0.2950136921250005 -H2C2S1_164_6992.vasp,H2C2S1,-4.19349669,1.017936041875001 -V2Te1I1N1_8_20200.vasp,V2Te1I1N1,-3.470702632,0.1625254164444367 -Cs2I2F8_127_4750.vasp,Cs2I2F8,-1.4751982816666669,0.1514475916666666 -In1Ge1Te3_143_8267.vasp,In1Ge1Te3,-1.301730762,0.1180099589999986 -H2Pb1_115_7003.vasp,H2Pb1,-1.866316063333333,1.793585799999997 -Nb4Co4S8_53_13057.vasp,Nb4Co4S8,-3.93294944,0.3167367704166639 -Zr1Pd1Cl6_149_21399.vasp,Zr1Pd1Cl6,-2.0116343875,0.0788743779166667 -Ca4Mn2I2O6_129_3223.vasp,Ca4Mn2I2O6,-3.820792103571428,-0.1607541514583352 -Ca2Bi1_164_2952.vasp,Ca2Bi1,-0.3648830233333333,0.5912939166666668 -Ag2S2Br2_59_376.vasp,Ag2S2Br2,-0.4886027066666666,0.3200081431249992 -Co1B4C2I2F4_47_3701.vasp,Co1B4C2I2F4,-3.8020878684615385,0.381646980576913 -Bi1Se1Br1_156_2386.vasp,Bi1Se1Br1,-1.5494930233333333,0.0873360299999999 -Al1Ni5I2_123_699.vasp,Al1Ni5I2,0.00470847125,3.22429850625 -Zn1Ni1Br2_156_20976.vasp,Zn1Ni1Br2,0.4129983625,1.9470529753125 -Al1Sn1F5_47_743.vasp,Al1Sn1F5,-2.8738560742857144,0.5600803210714254 -Zr2Se10_59_21670.vasp,Zr2Se10,-2.954495055,0.2187736986111081 -P2F6_12_13974.vasp,P2F6,-2.780306705,0.5508942475 -W4C3F2_164_20576.vasp,W4C3F2,-5.725642967777778,0.1012954513888833 -V2Cl10_2_20028.vasp,V2Cl10,-1.6392079166666669,0.0068511941666649 -Y4Cl6_12_20819.vasp,Y4Cl6,-3.577196066,0.0870701559999997 -Tl4V6O16_100_19638.vasp,Tl4V6O16,-4.658625378846154,0.199609729010969 -Sc1Cu1Sb2Se6_149_15929.vasp,Sc1Cu1Sb2Se6,-2.1467963180000003,0.3326470315555512 -Li1Ga1I4O12_2_9709.vasp,Li1Ga1I4O12,-2.9594847544444445,0.1128230644444445 -Nb2Br10_1_12639.vasp,Nb2Br10,-1.5487159166666666,0.2147931925000001 -Hf2S3Br1Cl2_1_7577.vasp,Hf2S3Br1Cl2,-3.8075285425,0.2953754279687499 -Se8F8_2_16306.vasp,Se8F8,-1.72664160875,0.3750660840624999 -Al2As2S6_157_762.vasp,Al2As2S6,-3.220188123,0.4092062211250002 -Tb5Cl8_10_18214.vasp,Tb5Cl8,-2.654623806153846,0.134643086410254 -Mn1Zn1Se2_25_10945.vasp,Mn1Zn1Se2,-1.1674136125,0.3268148900215494 -Sc2S1I1Cl1_8_16129.vasp,Sc2S1I1Cl1,-3.130222028,0.0438546385833308 -Cr1Co3O8_164_4147.vasp,Cr1Co3O8,-4.088957680833333,-0.5927826100520907 -Be1C2_164_2217.vasp,Be1C2,-3.952144673333333,2.1334023516666667 -Si2Ni1Se4_8_16416.vasp,Si2Ni1Se4,-2.360970275714286,0.2637575081122416 -Re4Br14_13_15102.vasp,Re4Br14,-1.8144681744444449,0.187369046296294 -Li2H10C12N4O10_11_9926.vasp,Li2H10C12N4O10,-5.766320645263158,0.1844013795778449 -Ag2Cl2_164_246.vasp,Ag2Cl2,-0.03796015,0.0913587775 -Cd1Cl1O1_156_3300.vasp,Cd1Cl1O1,-0.6886712366666666,0.5967033102083308 -Sb1I3_187_15463.vasp,Sb1I3,-0.1572773175,0.436434515 -Ni2Sb4_2_13625.vasp,Ni2Sb4,-1.229385078333333,-0.69092287 -Ag2H8C8I2_2_295.vasp,Ag2H8C8I2,-4.3229539215,0.2954071895000005 -Co2H2O4_11_3909.vasp,Co2H2O4,-4.16895446375,0.1078379937500004 -Hf4Te4Br4_31_7821.vasp,Hf4Te4Br4,-3.2181301425,0.1360407458333306 -V2Se2_123_20190.vasp,V2Se2,-3.2119806725,0.2346716887499962 -In2Co2Se5_164_8416.vasp,In2Co2Se5,-1.9400361066666667,0.1192637821481438 -Sn6P2O12_7_16994.vasp,Sn6P2O12,-4.373272164,0.0344350337499961 -Ga1Ag1Sb2S6_149_6122.vasp,Ga1Ag1Sb2S6,-2.149654808,0.3497519329374974 -Sr3N3_25_17389.vasp,Sr3N3,-2.6645033833333334,1.1620034041666665 -Na1Br2_25_11831.vasp,Na1Br2,-0.7914210833333333,-0.1018703500000005 -Ti1Pd3Se8_1_18831.vasp,Ti1Pd3Se8,-2.345842360833333,0.1585306641666668 -Ir1N4Cl6_164_8740.vasp,Ir1N4Cl6,-1.74558501,0.9345074674999958 -Cr2H2O5_12_4399.vasp,Cr2H2O5,-4.680172124444444,-0.1997346848611148 -Mn2In2Se5_187_11125.vasp,Mn2In2Se5,-2.212670777777778,-0.0889257886015348 -Co4P4N4O16_2_4082.vasp,Co4P4N4O16,-5.1047529825,-0.1667240326785758 -Na1Ga1Br4O12_2_11860.vasp,Na1Ga1Br4O12,-2.5392716666666666,0.2353523065277754 -Hf3Mo6O24_147_7717.vasp,Hf3Mo6O24,-5.8014584,0.080737858181819 -V2F8_14_20063.vasp,V2F8,-3.2993957860000003,-0.0190463370000002 -Co2Cl6_162_3892.vasp,Co2Cl6,-1.34960363375,0.0531534275 -Y2Cl2O2_164_20716.vasp,Y2Cl2O2,-5.724604318333333,0.0328137433333335 -Cr3C2S2_187_4551.vasp,Cr3C2S2,-4.497857507142857,0.2378285496428447 -Rb2Sb4Se8_2_14940.vasp,Rb2Sb4Se8,-1.9919065557142857,0.146901565714286 -Bi3Se4_164_2589.vasp,Bi3Se4,-1.9585925142857143,0.0715552092857131 -K4Cu2S2Cl4O8_26_9441.vasp,K4Cu2S2Cl4O8,-2.6997550395000003,0.1334198490000002 -Sr2Cu1Se2Cl2_38_17205.vasp,Sr2Cu1Se2Cl2,-1.8254403428571429,0.1868627480952347 -Ta1I5_2_17560.vasp,Ta1I5,-1.1208742333333337,0.2987838260416666 -Mn2S2_10_11222.vasp,Mn2S2,-2.6672828125,0.29025341 -Na1Co1As2S6_149_11842.vasp,Na1Co1As2S6,-2.654814372,0.5188967354605202 -Nb4O10_4_13113.vasp,Nb4O10,-6.5255042507142855,-0.0583292458928596 -Ag1Pt1Br6_1_104.vasp,Ag1Pt1Br6,-0.237882565,0.099590140625 -Nb2Br10_2_12640.vasp,Nb2Br10,-1.7832872883333335,-0.0197781791666666 -Te8Mo1W3_25_18698.vasp,Te8Mo1W3,-2.7053441358333337,0.1060528904166662 -Zr4H2C3O2_164_21821.vasp,Zr4H2C3O2,-6.189506017272728,0.152235788181797 -Sb10S10_26_15409.vasp,Sb10S10,-2.4058023095,0.3114531359166645 -Co2Te2As1_187_4031.vasp,Co2Te2As1,-2.102422708,-0.1232246908333328 -Sn3Sb2S9_174_16929.vasp,Sn3Sb2S9,-2.3802112642857147,0.30108739285714 -Au2S2_164_1517.vasp,Au2S2,-0.4900807075,0.5217078575 -K2Nb2Cu4S8_28_9262.vasp,K2Nb2Cu4S8,-2.529897519375,0.1968926925 -Ag4H4S4I4_2_523.vasp,Ag4H4S4I4,-1.1925615925,0.172888587109375 -Cd1H4C6Cl2_10_3354.vasp,Cd1H4C6Cl2,-4.46303419076923,0.4849959323076853 -Ta2Te2_129_17908.vasp,Ta2Te2,-4.4533071325,0.2930718987499952 -Mg1W2O5_38_10413.vasp,Mg1W2O5,-5.45572602125,0.4799415884948913 -Mn2Br2_164_11032.vasp,Mn2Br2,-1.01234696,0.4640444838146553 -Ag1H4N12O2_6_77.vasp,Ag1H4N12O2,-4.820650278947368,-0.0038659696491238 -Nb3Cu1Te1Se1I1Br3_1_12971.vasp,Nb3Cu1Te1Se1I1Br3,-2.458321705,0.3708373989151722 -Sn2Cl8_1_16766.vasp,Sn2Cl8,-1.216103796,0.0737038649999999 -Hf1Zr1S1I2_156_7390.vasp,Hf1Zr1S1I2,-3.3346970560000004,0.0443814210000002 -Ta3Ni3S14_6_17972.vasp,Ta3Ni3S14,-3.456307096,-0.1566343560468769 -As2Cl6_150_1204.vasp,As2Cl6,-1.520147035,0.07275845 -K2C2S6F2_1_9022.vasp,K2C2S6F2,-2.94301716,0.2111285630208275 -In1Pd1Se1S1I2_6_8307.vasp,In1Pd1Se1S1I2,-1.1975336316666667,0.1334683514583318 -Hf1Zr1Pd2S4I4_1_7388.vasp,Hf1Zr1Pd2S4I4,-2.5540194075,0.1279453318055541 -Ho2S2I2_59_8144.vasp,Ho2S2I2,-3.2374150683333336,0.0475943416666666 -K1Pb1S2_156_8926.vasp,K1Pb1S2,-1.6056655625,-0.3598904754166667 -Mo3S2N2_187_11723.vasp,Mo3S2N2,-4.610759801428571,0.2740326521428529 -Sr2Fe1O3_38_17218.vasp,Sr2Fe1O3,-3.776791641666666,0.1852206661111086 -Zn2As4I4O6_31_21031.vasp,Zn2As4I4O6,-2.60392103375,0.08059825953125 -Cd1H2S2_5_3340.vasp,Cd1H2S2,-2.155755472,0.0799319840000001 -S1O3_187_15380.vasp,S1O3,-3.2741599625,0.8937679843749993 -Co2Br2O2_59_3875.vasp,Co2Br2O2,-2.62295966,-0.5148185793055571 -Ga1Cu1Se2Br1Cl1_1_6176.vasp,Ga1Cu1Se2Br1Cl1,-1.2287129566666668,0.244234590805552 -Sr1Th1Br6_25_17096.vasp,Sr1Th1Br6,-2.2888020025,0.0622967218749996 -Tl4P20_26_19614.vasp,Tl4P20,-3.378086387083333,0.1034922316666664 -Fe5Ge1Te2_156_6091.vasp,Fe5Ge1Te2,-0.90974493875,0.1943455581249984 -Rb2C2Se2S6F6_1_14797.vasp,Rb2C2Se2S6F6,-2.6249277833333333,0.3719537421990712 -Sn2Sb2S6_147_16867.vasp,Sn2Sb2S6,-2.34061943,0.3380836942499954 -Mo1P2_164_11534.vasp,Mo1P2,-3.847594753333333,0.5857393000000006 -Nb2Si2As2_129_12889.vasp,Nb2Si2As2,-4.89514699,0.3265633216666668 -Hf3Te2_123_7738.vasp,Hf3Te2,-4.55234423,0.0846025040000002 -Tm2Se6_51_19688.vasp,Tm2Se6,-2.78306215625,0.5112075740625 -Zn1H1N3O1_156_20949.vasp,Zn1H1N3O1,-4.4415310266666665,-1.3063288654166691 -Li2V2F10_1_10117.vasp,Li2V2F10,-3.4203212692857146,-0.0376335459523873 -Li1V2O1F7_8_9810.vasp,Li1V2O1F7,-3.692783946363636,-0.2773302739339912 -Fe1Bi1S1I1Br1_8_5632.vasp,Fe1Bi1S1I1Br1,-1.113256454,0.1055308289999985 -Mn1In2Se4_156_10787.vasp,Mn1In2Se4,-1.991953221428572,0.0847321499999997 -Ba2Cu1Cl2O2_123_1963.vasp,Ba2Cu1Cl2O2,-2.964695924285714,0.1601695004166621 -Cd1H4C2N4Cl2_10_3346.vasp,Cd1H4C2N4Cl2,-4.247563223846154,0.1144799687179444 -Al2Se2_187_970.vasp,Al2Se2,-2.90149275,0.046866295 -K2B2H6Se2O6_4_8991.vasp,K2B2H6Se2O6,-3.4310541227777778,0.9565236509837796 -Zr2Te2_164_21712.vasp,Zr2Te2,-2.8541535075,0.1080170274999998 -Cu2B2S2I2_31_5032.vasp,Cu2B2S2I2,-1.557663745,0.8106570112499989 -Tl1Co5I2_123_19248.vasp,Tl1Co5I2,-0.5669335875,0.5866038083333326 -Au1Cl2_187_1420.vasp,Au1Cl2,0.3140483333333333,0.372207585 -Cd2Te2Br2_59_3588.vasp,Cd2Te2Br2,0.1088306833333333,0.0909449931944437 -Cu2W1O4_8_5362.vasp,Cu2W1O4,-3.768429892857143,0.5158748798214225 -As2O3_1_1231.vasp,As2O3,-4.259931226,0.225306346 -Nb4B3Cl2_164_13032.vasp,Nb4B3Cl2,-5.625522583333333,0.2348412277777658 -Si4Pb8S16_14_16505.vasp,Si4Pb8S16,-2.9230459814285714,0.1378123103571429 -Cu2C2S2I2_31_5068.vasp,Cu2C2S2I2,-2.02881572375,0.5961945188690462 -Cr3Mo1S8_25_4562.vasp,Cr3Mo1S8,-3.4788822875,0.0603572720833334 -Sb4P2S4O26_1_15799.vasp,Sb4P2S4O26,-4.417350325555556,0.1882008942013766 -Tl4B6S20_2_19590.vasp,Tl4B6S20,-3.2038579703333334,0.1381850752083305 -P2W8Cl22_59_14064.vasp,P2W8Cl22,-2.6783496303125,0.0571236421875003 -Sb2Br6_189_15555.vasp,Sb2Br6,-0.93753587,0.16130275125 -Te2Au2_10_18369.vasp,Te2Au2,-0.137226295,0.2914103525 -Y3H2C2O2_187_20794.vasp,Y3H2C2O2,-5.775305081111111,0.5548556128240607 -Cs1Pb1O2_156_4646.vasp,Cs1Pb1O2,-2.431079255,0.4053378730468749 -Zr1Bi2_187_21262.vasp,Zr1Bi2,-2.3396738633333336,-0.9041853891666672 -Ti3H2O4_12_19087.vasp,Ti3H2O4,-6.140969682222223,0.5423353655555445 -Nd1C5_47_13217.vasp,Nd1C5,-5.370568333333334,1.9051837833333265 -Pb2Cl2F2_129_14234.vasp,Pb2Cl2F2,-2.14570304,0.1200706616666669 -Ta2Co2Se10_51_17702.vasp,Ta2Co2Se10,-3.174115246428572,0.2036556605952353 -Sr1Br2_164_17031.vasp,Sr1Br2,-1.8357064733333333,0.0074625433333332 -Tl2As2O6_1_19361.vasp,Tl2As2O6,-3.431446848,0.3842122945000001 -Ba2Mn2Tl1O7_123_2027.vasp,Ba2Mn2Tl1O7,-3.936219870833333,0.358993253715275 -Cd1Ga2Te4_164_3312.vasp,Cd1Ga2Te4,-1.1226956271428572,0.1390094985714285 -Dy2H4Cl2O4_11_5527.vasp,Dy2H4Cl2O4,-4.6644009083333335,0.0839261391666665 -Cu2B2O2F2_31_5028.vasp,Cu2B2O2F2,-3.0846961625,1.4077446938888836 -Ta2Fe2Se6_11_17728.vasp,Ta2Fe2Se6,-3.325573212,0.0532620209999992 -In2H2S10_11_8461.vasp,In2H2S10,-2.51817646,0.1979750091964262 -Na2H2O2_2_12099.vasp,Na2H2O2,-3.6089826866666654,0.0787181483333334 -Ca4Co2Br2O6_129_3209.vasp,Ca4Co2Br2O6,-3.827060252857143,-0.2963292916666709 -Pb4O10_7_14313.vasp,Pb4O10,-3.237412512857143,0.2049215108928543 -Tl1Cl1_99_19241.vasp,Tl1Cl1,-0.2873542,0.64014361 -Be2B4C4_25_2241.vasp,Be2B4C4,-5.614297687,0.568583601666667 -Pb1Au1F6_2_14169.vasp,Pb1Au1F6,-1.3129939975,0.1925455232291666 -In4As4_127_8663.vasp,In4As4,-1.44895308,-0.1346143199999998 -Co2Sb4Br4O6_2_4011.vasp,Co2Sb4Br4O6,-2.987111265,0.0759460994791649 -Ag2Se4_11_444.vasp,Ag2Se4,-0.7771569966666667,-0.4348601683333333 -Cu2Te1S1I1_1_5324.vasp,Cu2Te1S1I1,-0.5486977740000001,0.1390147238749986 -Te10Ru8_1_18271.vasp,Te10Ru8,-2.274918012777777,0.6089019063888856 -Mo6Se4Cl2O16_1_11764.vasp,Mo6Se4Cl2O16,-3.957059847142857,0.5058737870039649 -Sb1Cl3_187_15448.vasp,Sb1Cl3,-1.0917354675,0.4275063575 -In2Se2Br2_31_8575.vasp,In2Se2Br2,-1.4839942366666667,0.0715970933333334 -Mn1Te2Mo1_115_10908.vasp,Mn1Te2Mo1,-2.0163843175,0.1281478618749998 -Te1Pt8Se7I4_1_18331.vasp,Te1Pt8Se7I4,-1.4552199035,0.190904922937498 -Al2I6_1_882.vasp,Al2I6,-0.86489446625,0.1169118 -Sc2Sb2Se6_157_16147.vasp,Sc2Sb2Se6,-2.95329143,0.2015360279999998 -Sb2Se2F2_59_15692.vasp,Sb2Se2F2,-2.3560003516666668,0.3404032938888865 -Tl4Sb20_26_19623.vasp,Tl4Sb20,-1.6616280316666667,0.2792403731249997 -Mn3V1O8_12_11418.vasp,Mn3V1O8,-4.729857361666666,-0.0056041834895871 -Te4Pd2_14_18617.vasp,Te4Pd2,-1.199594875,0.2894496616666666 -Nb3Se1I7_156_13013.vasp,Nb3Se1I7,-2.1830463754545453,0.090759470909091 -Mn1Ni1Se2S1Br1_8_10829.vasp,Mn1Ni1Se2S1Br1,-1.4084933266666668,0.4064215592361086 -P2W2_12_14062.vasp,P2W2,-4.966752595,-0.5019899250000002 -Cr2Te4Pd1_164_4528.vasp,Cr2Te4Pd1,-1.77917479,0.0116110255714267 -Ga2Te5_1_6519.vasp,Ga2Te5,-1.5588870757142856,0.2861902885714287 -Sr4As4H4S8_14_17404.vasp,Sr4As4H4S8,-2.9849326525,0.1026657409374971 -Ca2H8S2O12_13_3043.vasp,Ca2H8S2O12,-4.523316104583333,0.0440617705555554 -Sc4C3O2_164_16231.vasp,Sc4C3O2,-5.583768357777778,0.5941881365436446 -Sr2As1_25_17120.vasp,Sr2As1,-0.8458074933333334,0.9077078594444428 -Li2Ti2C2I2_59_10093.vasp,Li2Ti2C2I2,-4.44651021625,0.1709849399999998 -Cs2Ru2N2O2F10_11_4775.vasp,Cs2Ru2N2O2F10,-3.057879756666667,-0.1331597418518642 -Ga2H10N4F4_10_6372.vasp,Ga2H10N4F4,-4.1309711455,0.1322949938749907 -Rh2Se6_7_15248.vasp,Rh2Se6,-2.20812004875,0.3925691040277755 -Hf1Mo1Br2O2_1_7232.vasp,Hf1Mo1Br2O2,-4.4925371683333335,0.3327007529166663 -Hf1Au1S1I4_6_7112.vasp,Hf1Au1S1I4,-1.3766186557142857,0.2341119301785704 -Zn3In2O6_8_21206.vasp,Zn3In2O6,-2.83782371,0.1991715696590879 -Cr2S2_164_4469.vasp,Cr2S2,-3.307509575,0.4725014799999998 -Hf1Zr3Br1Cl7_1_7415.vasp,Hf1Zr3Br1Cl7,-3.1194637433333336,0.1181758943749962 -W2Cl6_189_20488.vasp,W2Cl6,-2.17565412375,0.36737693375 -Ag2P4S3Cl2_6_360.vasp,Ag2P4S3Cl2,-2.213956252727273,0.1541396718889935 -Ti2N2F2_59_18969.vasp,Ti2N2F2,-6.46506472,-0.6078349986111173 -Ga3Rh1_187_6531.vasp,Ga3Rh1,-1.509911025,0.8172782924999997 -Co2Te2P1_187_4037.vasp,Co2Te2P1,-2.3481818700000003,0.1016233451666664 -Ca1Sn3S4Br4_3_2889.vasp,Ca1Sn3S4Br4,-1.9257482333333331,0.1519044683333332 -Ag2S2F2_59_378.vasp,Ag2S2F2,-0.8461259766666666,0.4545845181770812 -Sr2C8O14_12_17165.vasp,Sr2C8O14,-5.614021668333333,0.5920002195833276 -Au2Cl2O4_17_1466.vasp,Au2Cl2O4,-1.480424225,0.1853046523958333 -Rb2Ru2C2I8O4_59_14923.vasp,Rb2Ru2C2I8O4,-2.258308673888889,0.2134944327777757 -Cd2Fe3S8_10_3506.vasp,Cd2Fe3S8,-1.6866483515384614,-0.1181261915384626 -Al2O4_59_920.vasp,Al2O4,-5.06698151,0.5954914877083288 -K2Os2S2N2Cl10_2_9284.vasp,K2Os2S2N2Cl10,-2.283127483888889,-0.0053713909027849 -H6I6N4_11_7084.vasp,H6I6N4,-2.6159544025,0.2553976187695315 -Ga1Co5Cl2_123_6153.vasp,Ga1Co5Cl2,-1.42474493625,0.3733517224999979 -Ge2Cl2_129_6767.vasp,Ge2Cl2,-1.832166265,0.1864733187499999 -Li2V1P2O8_2_10106.vasp,Li2V1P2O8,-5.1059840169230775,0.4068257103205066 -Hf2Te2_164_7641.vasp,Hf2Te2,-3.5760736175,0.6179992993750003 -Hf1In1Au2N2Cl4O2_8_7203.vasp,Hf1In1Au2N2Cl4O2,-2.765417395,0.684052930208329 -In2Pd1O4_164_8526.vasp,In2Pd1O4,-3.186117497142857,0.4529664994642829 -W2F6_189_20495.vasp,W2F6,-3.54347662875,0.3312870359375 -Sr4Sb4Te8Cl4_14_17472.vasp,Sr4Sb4Te8Cl4,-1.9668699025,0.0296889964999985 -Sc2P2S6_162_16119.vasp,Sc2P2S6,-3.835895144,0.1645426548928534 -Te8Br4_31_18691.vasp,Te8Br4,-0.9254094733333332,-0.9081449479166666 -Y2F2_164_20727.vasp,Y2F2,-4.3967733825,0.4766573566666618 -Na2Ge1H6O6_147_12085.vasp,Na2Ge1H6O6,-4.204093888,0.0275447815000005 -Li2Cu1_187_9884.vasp,Li2Cu1,-0.63284744,0.0610800177777777 -V1Br2_164_19788.vasp,V1Br2,-1.6746448833333334,0.0716699499999999 -Rb2Os2S2N2F10_11_14914.vasp,Rb2Os2S2N2F10,-3.065014096111111,-0.1007399398931651 -Tl2Bi2S6_149_19374.vasp,Tl2Bi2S6,-1.6839938929999998,0.5409443688749979 -Cr2O4_11_4439.vasp,Cr2O4,-4.843259858333333,-0.0252640039583367 -Ti2Sb2Se6_12_19014.vasp,Ti2Sb2Se6,-3.3513553600000003,0.2712448344999978 -Tl2F6_12_19412.vasp,Tl2F6,-1.547435905,-0.0738089443749998 -Zr2Te4Br10_10_21715.vasp,Zr2Te4Br10,-1.64502091375,-0.2475134148437499 -Ag3P1O4_156_498.vasp,Ag3P1O4,-2.66355691625,0.3594000324999999 -Hf1Ti1I2O2_6_7330.vasp,Hf1Ti1I2O2,-4.925666988333333,0.2873826335185137 -Ru1S1I1Br1_25_15289.vasp,Ru1S1I1Br1,-1.541346435,0.3718494444843736 -Y2Br6_162_20704.vasp,Y2Br6,-2.82076355375,0.0840897775 -Ta2Co4Se2S2_51_17708.vasp,Ta2Co4Se2S2,-3.652400722,-0.4489409209999997 -Sr2F2_123_17215.vasp,Sr2F2,-1.947564365,0.99220944 -Tl1Sb2Au1O6_149_19338.vasp,Tl1Sb2Au1O6,-2.704893908,0.904066279499999 -Ga2Se2O8F2_11_6474.vasp,Ga2Se2O8F2,-3.3487573957142858,0.173654835119041 -Ti2Sb2Te6_2_19015.vasp,Ti2Sb2Te6,-2.651133138,0.2946642464999984 -Nb4Se2_129_13151.vasp,Nb4Se2,-5.2640956050000005,0.0943664425000001 -Al1Pt5Cl2_38_716.vasp,Al1Pt5Cl2,-1.6973016725,0.8191482612499972 -Be1Sb2S4F4_1_2232.vasp,Be1Sb2S4F4,-2.6533591863636365,0.5967874014772665 -U4S10_10_19735.vasp,U4S10,-5.465157203571429,0.0053543092857091 -Ge2P2H2S6_7_6803.vasp,Ge2P2H2S6,-3.2329029516666665,0.0796858963888852 -Tc4O12F4_14_18251.vasp,Tc4O12F4,-5.0771073155,-0.0116789356250053 -Cr2O2_129_4436.vasp,Cr2O2,-4.2012366425,0.9240623574999955 -Cr1W1Cl6_65_4284.vasp,Cr1W1Cl6,-2.0171610775,0.0964244425000002 -Ag1Au1S2I1Br1_1_11.vasp,Ag1Au1S2I1Br1,-0.5826166983333333,0.0913428359722215 -Ag1Pd2S4_187_103.vasp,Ag1Pd2S4,-1.7169102085714285,0.1739311698214247 -Co2As2_129_3850.vasp,Co2As2,-2.453725465,0.0281146162499998 -Nb2B1F2_164_12628.vasp,Nb2B1F2,-5.329552852,0.2017848581999826 -Li4Te4S8_13_10232.vasp,Li4Te4S8,-2.422457809375,0.1745169313802083 -In2I2O2_59_8476.vasp,In2I2O2,-2.3590122366666666,0.0596272562499975 -Te2Mo2_12_18412.vasp,Te2Mo2,-2.238652375,0.6146553624999997 -Sb6Pb6_2_15853.vasp,Sb6Pb6,-1.247539195,0.5583374012499999 -Ag2F6_191_260.vasp,Ag2F6,-0.33129524625,0.16882703875 -Si6P8_38_16540.vasp,Si6P8,-3.809018747857143,-0.0665441036904797 -Sr2Sb4_12_17314.vasp,Sr2Sb4,-1.52496863,0.5141977733333332 -Pb1Cl4_123_14181.vasp,Pb1Cl4,-0.712084064,0.140797438 -Ni2Se2S6_11_13638.vasp,Ni2Se2S6,-1.872204838,0.2191361867916647 -V1I2_187_19869.vasp,V1I2,-1.05464557,0.0488004755555553 -Ag2Te3As4Br2_6_467.vasp,Ag2Te3As4Br2,-1.3232884918181818,0.2123697549999967 -Tl1Br2_115_19229.vasp,Tl1Br2,-0.28406017,0.28399354375 -Hf3Se2_123_7731.vasp,Hf3Se2,-5.13189782,-0.0678400970000043 -Cu4P16Se12Cl4_14_5435.vasp,Cu4P16Se12Cl4,-2.5826331130555555,0.040078517418977 -Pb1Se2_187_14210.vasp,Pb1Se2,-1.65298599,0.4163196234027758 -K2B2H6C8S2_51_8987.vasp,K2B2H6C8S2,-4.156775255,1.2002088947017409 -Ir2Se2_164_8843.vasp,Ir2Se2,-2.7557844975,0.3118352943750002 -Co1Ni1S2Br2Cl2_3_3787.vasp,Co1Ni1S2Br2Cl2,-1.20243205,0.096647634791663 -Fe2Se2_123_5981.vasp,Fe2Se2,-1.1717785575,0.21161428 -Ir2O6_7_8801.vasp,Ir2O6,-3.6078852125,0.7146622540625003 -Ba2Cu2_191_1978.vasp,Ba2Cu2,0.4147066425,0.1736451775 -Ta1I1Cl1_156_17553.vasp,Ta1I1Cl1,-2.6913137766666666,0.6818443269047587 -Ga2Fe1Se4_164_6350.vasp,Ga2Fe1Se4,-2.337377651428572,-0.2635554285714301 -Ni1H8C6O4_10_13359.vasp,Ni1H8C6O4,-4.940197430526315,0.6350913591228007 -In2Ga2O6_31_8445.vasp,In2Ga2O6,-4.190133741,-0.1367226062500026 -Ag1S1Br1Cl1_1_109.vasp,Ag1S1Br1Cl1,-0.530043345,0.1852653031249999 -Li1As2Pd1O6_1_9652.vasp,Li1As2Pd1O6,-3.697089019,0.4358381391249961 -Ca1Sn2S1Br2Cl1O1_1_2887.vasp,Ca1Sn2S1Br2Cl1O1,-2.229517835,0.2002755528124999 -Pb2I4_12_14254.vasp,Pb2I4,-0.4991813533333333,0.2213244127777778 -In2Ni4S6_164_8504.vasp,In2Ni4S6,-1.5914725433333334,0.0429923432638861 -Ag2Se2Br2_59_428.vasp,Ag2Se2Br2,-0.35047833,0.3548337711111105 -Sc2Cl2_164_16064.vasp,Sc2Cl2,-2.671493845,0.1721308533333303 -V2Cl2_164_20033.vasp,V2Cl2,-2.54302479,0.4399025599999999 -Ba4B2Br2O6_164_2137.vasp,Ba4B2Br2O6,-4.966189614285715,0.0496817335714236 -K2C2S8Cl6_1_9024.vasp,K2C2S8Cl6,-2.124847868333333,0.3756448587499978 -In1Cu1As2S6_149_8224.vasp,In1Cu1As2S6,-2.35448157,0.4537424866874975 -K2O2F2_11_9272.vasp,K2O2F2,-1.7818149833333334,0.322204458749998 -V2S2I2_2_20156.vasp,V2S2I2,-2.469163995,0.2095339866666639 -Mg2Te2W2O12_18_10523.vasp,Mg2Te2W2O12,-4.938101367777778,0.0366288338888836 -Mo2O6_2_11651.vasp,Mo2O6,-4.86950640125,0.2582169575000002 -Cd1In2Te4_164_3378.vasp,Cd1In2Te4,-0.8871599542857143,0.1103176342857144 -Hf1Zr1Se2I1Br1_6_7400.vasp,Hf1Zr1Se2I1Br1,-3.224255155,0.1680316906249932 -Ni1Te1Ir1Se1_1_13427.vasp,Ni1Te1Ir1Se1,-1.515370615,0.3830569054166649 -Li2Co2Bi2_129_9862.vasp,Li2Co2Bi2,-1.4555738016666666,-0.3273272283333343 -Ge2P2Cl2O6_7_6801.vasp,Ge2P2Cl2O6,-4.509621209166666,0.0390920626785656 -Na2Au1_187_11967.vasp,Na2Au1,0.1271976266666666,0.1698004033333333 -Bi3Sb3Se2S7_1_2588.vasp,Bi3Sb3Se2S7,-2.491981770666667,-0.098352197833335 -Mn2P2S4I2_26_11193.vasp,Mn2P2S4I2,-2.409790787,0.4035308820148077 -Nb2H2N1O2_164_12733.vasp,Nb2H2N1O2,-5.809204441428571,-0.8450710120357225 -Ir2Pd2Se3S1I3Br1_1_8806.vasp,Ir2Pd2Se3S1I3Br1,-1.5518468283333335,-0.1003339063541668 -Na2B2H6C8O2_51_11975.vasp,Na2B2H6C8O2,-4.617524786,1.1883896529999922 -Bi2S2I2_11_2513.vasp,Bi2S2I2,-1.4205270733333333,0.1865785500000001 -Sc2Zn1Bi1Cl3O3_1_16191.vasp,Sc2Zn1Bi1Cl3O3,-3.276600917,0.4261062949791661 -Os2O2_12_13860.vasp,Os2O2,-4.85265607,0.7465394124999998 -Sc2Sb2S6_157_16145.vasp,Sc2Sb2S6,-3.486647005,0.2085672852500009 -Tb1Ge5_47_18173.vasp,Tb1Ge5,-2.92875282,-0.1314674336111139 -In1Sb2Au1O6_149_8335.vasp,In1Sb2Au1O6,-3.007592393,1.0497545886249948 -Mn2Sb2Br1Cl1_3_11229.vasp,Mn2Sb2Br1Cl1,-1.530491645,0.290976578124998 -Au4Se4I4_14_1600.vasp,Au4Se4I4,-0.230057535,0.0987821388888885 -Cu2Re1Br6_147_5232.vasp,Cu2Re1Br6,-0.9110843066666666,0.1932426867592579 -Zn1I2_164_20959.vasp,Zn1I2,0.4806611366666666,0.16398329875 -Ni2I2_129_13523.vasp,Ni2I2,0.6625877,1.7301045275 -Cr1S1Br2_99_4238.vasp,Cr1S1Br2,-1.583882045,0.1743459624479152 -Dy2Cl6_59_5523.vasp,Dy2Cl6,-2.90089192875,0.0213011149999999 -Hf1Ti1C1O2_156_7328.vasp,Hf1Ti1C1O2,-7.459997943999999,0.1719997570000018 -Sr4Cr4Ga2O14_1_17422.vasp,Sr4Cr4Ga2O14,-4.624277580416667,0.1972702994596309 -Sb2Au2O4_26_15542.vasp,Sb2Au2O4,-2.51716026125,1.1707305615625008 -Ag4W2S8_11_580.vasp,Ag4W2S8,-2.3319458414285714,0.1576095199107094 -Ta2Mn2Se6_11_17772.vasp,Ta2Mn2Se6,-3.691897518,0.0405314275172399 -Zn1Ge1Te2_25_20945.vasp,Zn1Ge1Te2,-0.913386125,-0.1204250325 -Cu1H2_115_4895.vasp,Cu1H2,-1.5329940533333335,2.2136501699999966 -Fe2Ni2P2_129_5887.vasp,Fe2Ni2P2,-1.3118297933333334,0.5462862126388868 -Sn2_164_16906.vasp,Sn2,-1.02652011,-3.633943595 -Al2Zn1Se4_156_1036.vasp,Al2Zn1Se4,-2.2373613214285712,0.1765153100000001 -Rb1O2_123_14746.vasp,Rb1O2,-0.4935781999999999,2.2630870633333333 -Y1C4N1O9_3_20617.vasp,Y1C4N1O9,-6.103797984666667,0.3397439755694316 -Li1Ni1P2Se6_149_9763.vasp,Li1Ni1P2Se6,-2.313830939,0.1373415202291618 -Bi1As2Au1Se6_143_2316.vasp,Bi1As2Au1Se6,-1.828597281,0.2508969931666645 -Mo2P2_12_11659.vasp,Mo2P2,-3.71929237,0.0541023850000002 -Ni2W2S8F2_129_13689.vasp,Ni2W2S8F2,-2.4273610514285715,0.6557423324702326 -Cu1Bi1As2S6_143_4847.vasp,Cu1Bi1As2S6,-2.359326095,0.1402463454166614 -Ca2Bi2Cl2O4_11_2954.vasp,Ca2Bi2Cl2O4,-3.420751102,0.234913444 -Nb3H2N2O2_187_12976.vasp,Nb3H2N2O2,-6.264858377777778,-0.7371058349166741 -C2Br6_1_2741.vasp,C2Br6,-1.3476157425,0.6766167925 -Fe1C6N2F6_25_5652.vasp,Fe1C6N2F6,-4.968299525333333,0.0879386406249903 -Ag2C8I2F8_2_238.vasp,Ag2C8I2F8,-3.686289676,0.3368125140000004 -Mo2S4I4_12_11674.vasp,Mo2S4I4,-1.7916976850000002,0.3154650987500003 -W3O8_2_20566.vasp,W3O8,-5.885382027272727,0.3141534321521271 -Ga1Cl1_99_6147.vasp,Ga1Cl1,-1.14916332,0.41708927875 -Np2Te6_51_13786.vasp,Np2Te6,-3.55037476125,-0.2067573237500002 -Sb2As2_31_15538.vasp,Sb2As2,-2.4997540675,-0.6567469175 -Sb2I8_1_15595.vasp,Sb2I8,-0.292531339,0.1061839333750004 -Sn1O2F2_164_16659.vasp,Sn1O2F2,-1.896220584,1.36112707975 -Al1Te6As2Au1_149_749.vasp,Al1Te6As2Au1,-1.519678671,0.0765105921041643 -Mn3H2C2_187_11385.vasp,Mn3H2C2,-3.926623611428572,0.3475456985714233 -Na2I2_129_12182.vasp,Na2I2,-1.03583416,-0.443461665 -Sr2I2Cl2_129_17254.vasp,Sr2I2Cl2,-1.808103875,0.0836666811111112 -Zr2Te10_59_21696.vasp,Zr2Te10,-2.1902017966666665,0.0849087175000002 -Cd1Bi1Se1S1I2_1_3281.vasp,Cd1Bi1Se1S1I2,-0.7074792783333334,0.2426629473611099 -Si4H4O10_4_16489.vasp,Si4H4O10,-5.657529782222222,0.0511492306481429 -In2Pd4O6_164_8529.vasp,In2Pd4O6,-2.5269017516666668,0.6132091688541633 -Mn2S1I1N1Cl1_1_11210.vasp,Mn2S1I1N1Cl1,-2.5125685250000003,0.1900960534722186 -Hf2N1F2_164_7538.vasp,Hf2N1F2,-5.933127314,0.4605371214999998 -Zr2Te6P2_2_21719.vasp,Zr2Te6P2,-2.724563852,0.3040467169999956 -Nb3Pd3Se14_6_12994.vasp,Nb3Pd3Se14,-2.878265572,0.0937245344642797 -Te1Au1O2_8_18286.vasp,Te1Au1O2,-1.9092135775,1.2050497571875 -Al1Sb2Au1Se6_149_730.vasp,Al1Sb2Au1Se6,-1.871157054,0.2979325421666645 -V4N3O2_164_20334.vasp,V4N3O2,-5.995810411111111,0.0295546038888836 -Ga2P2_129_6429.vasp,Ga2P2,-2.7767347,-0.63320972 -V1H4C4O6F1_2_19853.vasp,V1H4C4O6F1,-5.28737419375,0.1091185311689694 -V2Sb2O6_2_20170.vasp,V2Sb2O6,-4.955733544,0.00379793975 -Ge1S2F2_12_6698.vasp,Ge1S2F2,-2.12633605,0.7896038493749973 -V4N3F2_164_20333.vasp,V4N3F2,-5.31737218,-0.0928893561728509 -Ge1_123_6725.vasp,Ge1,-2.42878608,-0.2558104550000002 -Zr1Ti3S8_1_21482.vasp,Zr1Ti3S8,-4.790341905833333,0.2563622460416663 -Cr2Ag2As4O12_13_4291.vasp,Cr2Ag2As4O12,-3.8397244,0.2347846529999954 -Cd2P4O12_4_3531.vasp,Cd2P4O12,-4.657900680555556,0.1851931084722222 -Sb1I2_164_15461.vasp,Sb1I2,-0.3231319933333333,0.4583415324999992 -K4Ca2H4S4O18_11_9421.vasp,K4Ca2H4S4O18,-4.267844089375,0.0629412975000001 -Ni3Te1Se2S1I1_1_13733.vasp,Ni3Te1Se2S1I1,-0.77304831,0.186025601875 -Ni4S4I4_14_13758.vasp,Ni4S4I4,-0.6294192108333333,0.1957978153472214 -Fe1Ni1Te1Br1_1_5726.vasp,Fe1Ni1Te1Br1,-0.2035196075,0.515830258125 -Co1O2_115_3803.vasp,Co1O2,-3.3800581566666668,-0.282891724583336 -Nb4Se12Cl2_2_13147.vasp,Nb4Se12Cl2,-3.322457308333333,0.1217410494973509 -Gd2Br2_164_6601.vasp,Gd2Br2,-2.16064247,0.1080770237499999 -Cu2H6Pt1C6N8_164_5136.vasp,Cu2H6Pt1C6N8,-5.255093199130435,-1.5692729895652286 -Te1Mo1Rh2S3_1_18302.vasp,Te1Mo1Rh2S3,-2.52822986,0.5889415326587244 -As2O3_183_1230.vasp,As2O3,-4.266083502,0.2191540700000001 -Ca4S4O12_14_3236.vasp,Ca4S4O12,-4.5423561145,0.0979001289999952 -Cr1Ge3_191_4182.vasp,Cr1Ge3,-2.2426312625,0.3446600216666644 -Sn1As1Se1S1I1Cl1_1_16600.vasp,Sn1As1Se1S1I1Cl1,-1.7816380116666668,0.1549889095833331 -Ag4I2O2F2_4_527.vasp,Ag4I2O2F2,-0.587663182,0.2883996534583321 -Mo4H2C3S2_164_11742.vasp,Mo4H2C3S2,-4.413765595454546,0.4507843869318088 -Ag1Xe2F4_21_152.vasp,Ag1Xe2F4,0.42556434,0.3345899064285733 -K2Hg4Se2S6Br6_31_9190.vasp,K2Hg4Se2S6Br6,-0.6829495299999999,0.1643441747291666 -Hf2Ge2Se8_31_7498.vasp,Hf2Ge2Se8,-3.539621625833333,0.1263539444444443 -In2Fe1_123_8434.vasp,In2Fe1,-0.1627056533333333,2.250979513333331 -P2F10_51_13972.vasp,P2F10,-2.1238385308333334,0.9784968775 -Mo2W2O8_25_11698.vasp,Mo2W2O8,-5.701145391666667,0.1620296209027723 -Ag4H8O4_14_524.vasp,Ag4H8O4,-2.488317984375,0.5604972083333335 -Bi6Se2S7_162_2679.vasp,Bi6Se2S7,-2.341052201333333,-0.6227082400000016 -B6Pd1C2Br2F4_6_1783.vasp,B6Pd1C2Br2F4,-3.737697024,0.752580797861095 -Sn8Pd2_50_17006.vasp,Sn8Pd2,-1.230139012,0.5203044989999999 -V1W3S8_25_19964.vasp,V1W3S8,-4.361193783333333,-0.0680050875 -Sc4H2S2N3_164_16244.vasp,Sc4H2S2N3,-5.188383394545455,-0.8962815050000053 -Nb3B2S2F2_187_12949.vasp,Nb3B2S2F2,-4.843634527777778,0.4267325559116719 -Hg1Ge1Se2I2_1_7856.vasp,Hg1Ge1Se2I2,-0.73043877,0.1351875399999998 -Mn2P2I2O4_26_11184.vasp,Mn2P2I2O4,-3.372943641,0.4812668279259223 -In1P2Au1O6_149_8297.vasp,In1P2Au1O6,-4.192383777,0.3856756606666636 -Ge2Se2Br1Cl1_8_6864.vasp,Ge2Se2Br1Cl1,-2.0536001166666664,0.1623829701041643 -V2S2_123_20165.vasp,V2S2,-3.6939456675,-0.0385331390625043 -Ba4Sb2O1_99_2176.vasp,Ba4Sb2O1,-1.7710298157142856,0.6970998850000003 -Sb4Te6_12_15838.vasp,Sb4Te6,-1.710177318,0.1361283559999999 -Ag2C6I2F4_2_233.vasp,Ag2C6I2F4,-3.4950120864285714,0.4884683499999989 -Ca2Hg1_123_3050.vasp,Ca2Hg1,0.9713607566666668,0.3123209983333335 -Zr1Ge1Br2N2_6_21297.vasp,Zr1Ge1Br2N2,-4.30207477,0.1748623452777722 -Sr2Zn1_123_17341.vasp,Sr2Zn1,1.1498042433333333,0.2480465466666667 -Li1Nb1Ni1C1S1I2O1_1_9755.vasp,Li1Nb1Ni1C1S1I2O1,-3.068781545,0.7301659621726124 -Cr2F8_1_4385.vasp,Cr2F8,-2.8992836950000003,-0.1276635070000003 -Sn2Sb2Te6_143_16870.vasp,Sn2Sb2Te6,-1.4310421290000002,-0.3364195243333351 -Hf1Ti1S1I1N1_156_7333.vasp,Hf1Ti1S1I1N1,-5.365610034,0.1107585829999999 -Li2Fe2P2O8_51_9909.vasp,Li2Fe2P2O8,-4.489425362857143,0.5666622389285711 -V2P2O12_1_20137.vasp,V2P2O12,-5.241923245625,0.1544483632812499 -Na2Fe4H6S4O16_2_12082.vasp,Na2Fe4H6S4O16,-4.1141509134375,0.0361286241298919 -Sr2Ag1Cl2O2_123_17100.vasp,Sr2Ag1Cl2O2,-2.65925146,0.0922897352040763 -Li2V2Cu4O12_31_10114.vasp,Li2V2Cu4O12,-3.598274716,0.3301487271249924 -Hg1Te2_164_7920.vasp,Hg1Te2,0.2594285833333333,0.466045821111111 -Ge2P2S6Cl2_7_6808.vasp,Ge2P2S6Cl2,-2.8431294808333334,0.0995071751692679 -V1Os1Br4O2_65_19896.vasp,V1Os1Br4O2,-2.77882484875,0.1583747612500001 -Fe1S2N1O8_143_5744.vasp,Fe1S2N1O8,-3.8155993741666663,0.5041207007499905 -K4Fe2P4O14_113_9444.vasp,K4Fe2P4O14,-4.294966063333333,0.2309784287500003 -Cr2P2_12_4454.vasp,Cr2P2,-3.56111235,0.6460925350000002 -V3B2H2_187_20241.vasp,V3B2H2,-4.314920658571428,0.5275385742857104 -Sb1S1F1_156_15488.vasp,Sb1S1F1,-2.629433026666667,0.3132891133333308 -Li2Cu2O2_51_9889.vasp,Li2Cu2O2,-2.5056426333333333,0.7282949147222193 -Li1Mo2S2I6_47_9752.vasp,Li1Mo2S2I6,-1.297751009090909,0.330073886401511 -Nb2Br6_189_12658.vasp,Nb2Br6,-2.23677330875,0.2486334399999976 -Ba2C4_12_1935.vasp,Ba2C4,-4.458403591666666,1.1295930511111054 -B3Ir1_187_1731.vasp,B3Ir1,-3.6774909825,1.8832317829166665 -Se8O18_147_16308.vasp,Se8O18,-3.3527400223076924,0.1547798443269195 -Ta2H2S2N1_164_17748.vasp,Ta2H2S2N1,-5.191558777142857,1.006516521190464 -Sb2Pd3Se8_164_15658.vasp,Sb2Pd3Se8,-1.7179759138461537,0.3440053991538442 -Ga1Ag1S2I1Cl1_1_6120.vasp,Ga1Ag1S2I1Cl1,-1.1849011366666666,0.3348742623958295 -Au2Se2I1Cl1_1_1544.vasp,Au2Se2I1Cl1,-0.23463439,0.2499570659027773 -Nb4Ni2Se10_13_13101.vasp,Nb4Ni2Se10,-3.362935573125,0.073566305625 -Co1Ni1S2I1Br1_25_3789.vasp,Co1Ni1S2I1Br1,-1.3441254,0.0617724632291661 -Al2Co1S4_164_799.vasp,Al2Co1S4,-3.3356056642857146,0.1183142508333305 -Ta2Te1Pt1I2O1_1_17894.vasp,Ta2Te1Pt1I2O1,-3.619420582857143,0.3233780311904725 -Bi4O6_26_2624.vasp,Bi4O6,-3.565911412,0.2920828160000002 -Na2H4C2_67_12109.vasp,Na2H4C2,-3.25759774,0.934059705 -Ca2H2Br2_129_3030.vasp,Ca2H2Br2,-2.318556406666666,0.0465479783333333 -Sn2H2_164_16771.vasp,Sn2H2,-2.0127879325,-0.9036198075 -Nd4V4Sb12_18_13250.vasp,Nd4V4Sb12,-2.79576711,0.3731721326666637 -Sn4Se4_53_16970.vasp,Sn4Se4,-1.73563585375,-0.15935747875 -Hf2H2C1O2_164_7502.vasp,Hf2H2C1O2,-6.111187172857143,0.5002173137301518 -Mo1S1O1_156_11542.vasp,Mo1S1O1,-4.37392398,0.1650878850000001 -Al1Cr1F5_47_635.vasp,Al1Cr1F5,-3.048852071428571,0.641956314285707 -P4Pd2_2_14099.vasp,P4Pd2,-3.154245673333333,0.3343166916666664 -Hg2N2Cl2_51_7975.vasp,Hg2N2Cl2,-0.1930948033333333,1.277081015833332 -Gd2S2I2_164_6623.vasp,Gd2S2I2,-3.282286725,0.0214817600000003 -Fe2Sb1S2_187_5945.vasp,Fe2Sb1S2,-1.993598344,0.2495614715000003 -Cu2Pb1S2I2_1_5228.vasp,Cu2Pb1S2I2,-0.7677127585714285,0.3195918335714278 -Li2Cu2P4O12_13_9893.vasp,Li2Cu2P4O12,-4.7772853975,0.2082752762749953 -Ge2Sb1O6_162_6834.vasp,Ge2Sb1O6,-4.440798282222222,0.2883154851388851 -Au2S2Cl2_1_1512.vasp,Au2S2Cl2,-0.6142742683333333,0.231595434666666 -Li1Cu1C1O3_1_9684.vasp,Li1Cu1C1O3,-4.487803865,0.335507300937498 -Te4Ru2_127_18626.vasp,Te4Ru2,-1.58940113,1.0315935800000002 -Zr1Ga1S4I2_1_21295.vasp,Zr1Ga1S4I2,-2.42488291125,0.4168956368359353 -Hf2S1Br2O1_25_7559.vasp,Hf2S1Br2O1,-4.634260978333333,0.1851585279166641 -Ag1Se1Cl1_1_127.vasp,Ag1Se1Cl1,-0.3818629899999999,0.3627387729166661 -Rb2Hg2Pd1Cl8_12_14863.vasp,Rb2Hg2Pd1Cl8,-0.5806223530769231,0.0978631738461537 -Sc4N3F2_164_16250.vasp,Sc4N3F2,-5.883865676666667,-0.4451519981481582 -Al2P2Se6_157_925.vasp,Al2P2Se6,-2.814535536,0.0819386972499944 -K2As2O4F8_13_8975.vasp,K2As2O4F8,-2.767511098125,0.2339070873437504 -Cu2H12C8O10_31_5107.vasp,Cu2H12C8O10,-4.9101275371875,0.2945960251562498 -Nb4Zn4Cu2O16_2_13183.vasp,Nb4Zn4Cu2O16,-4.586977280384615,0.2378156585576854 -Ru2F6_162_15317.vasp,Ru2F6,-2.40832981125,0.1628037500000001 -Mo1O3_6_11530.vasp,Mo1O3,-5.0313285625,0.0963947962500002 -B4F4_57_1753.vasp,B4F4,-4.22195901375,0.3104325523611067 -Sr2Ge4_12_17228.vasp,Sr2Ge4,-2.0876284533333336,0.2716294733333333 -Mn2S10F4_7_11207.vasp,Mn2S10F4,-2.359975648125,0.3297065239843753 -Co1C2S2N2_12_3713.vasp,Co1C2S2N2,-5.1157560971428575,0.198683297976179 -Sn1Mo1O4_1_16654.vasp,Sn1Mo1O4,-4.487278018333334,0.3492841849999992 -Zr1Nb1Ga1N2Cl2_25_21339.vasp,Zr1Nb1Ga1N2Cl2,-4.806423342857143,0.2966953491071344 -Ga2Fe1S4_164_6349.vasp,Ga2Fe1S4,-2.8945798442857145,-0.2418487571428591 -Hf2Si2Te8_31_7618.vasp,Hf2Si2Te8,-2.9175410525000003,-0.1221117908333394 -Sr3Ni2S5I2_123_17395.vasp,Sr3Ni2S5I2,-1.9857365975,0.0352049358159678 -Sc1Sn5_47_16010.vasp,Sc1Sn5,-1.466402025,-2.1114341750000003 -Na2B2O8F8_2_11983.vasp,Na2B2O8F8,-2.797884245,0.9157345390000012 -Yb3S2F4_123_20889.vasp,Yb3S2F4,-3.459212291111111,0.2852522173379599 -Ag1Te2_164_146.vasp,Ag1Te2,-0.38685342,0.3754967941666666 -Na2Hf2Cu2Se6_11_12147.vasp,Na2Hf2Cu2Se6,-2.9095121766666665,0.1433914995833309 -Sc4F10_11_16237.vasp,Sc4F10,-4.191139954285714,-0.2560983340476211 -Na2Cl2O8_59_12055.vasp,Na2Cl2O8,-2.7290195941666666,-0.0300291800000023 -Nb2Cr2S10_11_12703.vasp,Nb2Cr2S10,-3.950064271428572,0.07520258928571 -Sc4I4O4_11_16247.vasp,Sc4I4O4,-4.36635246,0.0374051399999997 -Li2S2F2_6_10053.vasp,Li2S2F2,-2.987859115,-0.0076030718750023 -Ge1Mo1Se3Br1_1_6679.vasp,Ge1Mo1Se3Br1,-2.2208470916666667,0.3640857593055555 -Sn2Sb2H6N2O6_7_16859.vasp,Sn2Sb2H6N2O6,-4.166481915,0.1112002674166584 -Te10Os8_1_18268.vasp,Te10Os8,-2.735332343888889,0.0809703647222173 -Ca2S2_12_3105.vasp,Ca2S2,-3.089210105,-0.143548515 -Ge1Ru1Se1S1Br2_1_6695.vasp,Ge1Ru1Se1S1Br2,-2.15230399,0.3724180470833333 -Mn1Cu1Te2O1_8_10695.vasp,Mn1Cu1Te2O1,-1.927327326,0.2034959416874997 -Cd1Ga2S4_164_3310.vasp,Cd1Ga2S4,-2.257369447142857,0.1333535614285712 -Ni2Te2I2_59_13662.vasp,Ni2Te2I2,-0.2509543316666666,0.01982115 -Hf2V2W1C3O6_1_7662.vasp,Hf2V2W1C3O6,-6.327717145714286,0.7019166653417369 -K12B4S12_14_8873.vasp,K12B4S12,-2.5152795025,0.0968410946428575 -V2Te2_47_20217.vasp,V2Te2,-2.5867110025,0.1885341003571403 -Sb8Te8S4_2_15882.vasp,Sb8Te8S4,-1.901911573,0.2636232496666648 -Pt1S2_187_14590.vasp,Pt1S2,-2.06238264,0.5827620799999997 -Co2Au1S4_187_3858.vasp,Co2Au1S4,-2.3304895214285715,0.1047944317857119 -Pd2S2_164_14469.vasp,Pd2S2,-1.51052019,0.5996111500000001 -Nb1Ge1Br2_6_12513.vasp,Nb1Ge1Br2,-2.5803540725,0.3737364894791665 -Sb2As4O12F2_4_15541.vasp,Sb2As4O12F2,-3.691753706,0.5225711054999969 -Sb18I4_11_15428.vasp,Sb18I4,-1.7774302931818182,0.0964749029545437 -Nb4S12Cl2_2_13136.vasp,Nb4S12Cl2,-3.904340822777778,0.1145312206944364 -Na6Te2H2O8_11_12445.vasp,Na6Te2H2O8,-3.5106247611111114,0.1920791569444406 -C2S2_59_2755.vasp,C2S2,-3.864635475,1.5024696296875 -Pd1Se2_187_14392.vasp,Pd1Se2,-1.4639856166666665,0.384351131666667 -Li2Mn1As2S7F3_1_9985.vasp,Li2Mn1As2S7F3,-2.841721096,0.3633755786166637 -Mn1Co2O6_12_10674.vasp,Mn1Co2O6,-3.954991068888889,-0.4019435380555588 -Ta4B3Cl2_164_18001.vasp,Ta4B3Cl2,-6.205839941111112,0.1094893708333215 -B2C6_191_1660.vasp,B2C6,-7.3673434975,0.3021212310416663 -Na2H6Pb1S6_147_12125.vasp,Na2H6Pb1S6,-2.758604376,-0.0992935023750019 -Nb3Te1Cl7_156_13022.vasp,Nb3Te1Cl7,-3.1314432663636365,0.0337319672727267 -Cr2Co1Te4_164_4359.vasp,Cr2Co1Te4,-1.8939792142857144,0.0447543284761868 -Ta4Ni2Se10_13_18065.vasp,Ta4Ni2Se10,-3.70261063875,0.0727856299999998 -V1Fe1Se2O1_25_19831.vasp,V1Fe1Se2O1,-3.3071348780000003,-0.0366528950000053 -Si2I6_1_16408.vasp,Si2I6,-0.8201426325,0.2796374271875 -Ta3B2F2_187_17938.vasp,Ta3B2F2,-6.198605217142857,0.1673054375714169 -Pb3Se2Br2O6_5_14305.vasp,Pb3Se2Br2O6,-3.0417963738461538,0.0966512646153847 -Na2Au1O2_12_11965.vasp,Na2Au1O2,-1.997521298,0.1930308960000004 -V2S2N1_164_20159.vasp,V2S2N1,-4.780622172,-0.048015678 -Nb2V2Se10_11_12938.vasp,Nb2V2Se10,-3.426227227857143,0.0585450999999965 -Al2Te2I2_31_1006.vasp,Al2Te2I2,-1.632246225,0.0488069616666666 -Cd3As1_191_3606.vasp,Cd3As1,1.473782365,0.3556526242187501 -Ge3Sb2O9_174_6919.vasp,Ge3Sb2O9,-4.520468295714286,0.1666424700892808 -Nb1V1Te1S1_25_12612.vasp,Nb1V1Te1S1,-3.81840104,-0.0522957889583406 -Ta4Co8Se8_59_18029.vasp,Ta4Co8Se8,-3.4368564005000004,0.0501507205 -Zr1F4_123_21286.vasp,Zr1F4,-4.335141414000001,0.2564826409999989 -Al2Co2Se5_164_808.vasp,Al2Co2Se5,-2.531551758888889,0.0656944432592544 -Cd1Ni1S2Br2_1_3382.vasp,Cd1Ni1S2Br2,-0.7179114016666667,0.2138358289583315 -Hf3S3I1N1_1_7727.vasp,Hf3S3I1N1,-5.23574416125,0.2913901949999995 -Co1Sn3_187_3828.vasp,Co1Sn3,-0.7488508075,-0.0856232837499999 -I1_65_8159.vasp,I1,0.64704396,0.265772991875 -K4Ti2H2F14_11_9524.vasp,K4Ti2H2F14,-3.447843945454545,0.0851714077272727 -Fe3S4_164_6064.vasp,Fe3S4,-2.3541529914285717,-0.3919475535714303 -Zr2Mn1Br1O5_8_21601.vasp,Zr2Mn1Br1O5,-5.396282724444444,0.3589415093518457 -Hf1Te1Se1_156_7321.vasp,Hf1Te1Se1,-3.93617509,0.3095696716666667 -Ta1O2_187_17595.vasp,Ta1O2,-7.0355665400000005,0.3195041486666593 -Fe2Ag1O4_187_5769.vasp,Fe2Ag1O4,-3.101777764285714,0.049612077678569 -Te2Rh2F2_11_18501.vasp,Te2Rh2F2,-2.035359745,0.1915340315972199 -Na2H6C10O2_51_12112.vasp,Na2H6C10O2,-5.143498354,0.7416374054999924 -Hg2F2_164_7959.vasp,Hg2F2,0.367863365,0.34643961 -Mn1W4Se1S6Br2_1_10935.vasp,Mn1W4Se1S6Br2,-3.5006115685714287,0.2993196480357046 -Bi2Se2_164_2548.vasp,Bi2Se2,-1.5913065025,0.2434312549999989 -As4Au4O12_13_1322.vasp,As4Au4O12,-3.0625498535,0.5235403501666603 -Ti1Ni2Br2O4_1_18817.vasp,Ti1Ni2Br2O4,-3.1640814677777778,0.0672550627777748 -Na2Cd4S6O2F6_31_12032.vasp,Na2Cd4S6O2F6,-1.7682667120000002,0.2939782339791607 -Ba2Zr1S4_99_2092.vasp,Ba2Zr1S4,-3.3007901585714285,0.758161848571429 -Ir1F2_187_8736.vasp,Ir1F2,-1.0634095433333333,1.602297251111109 -Hg1H2_115_7869.vasp,Hg1H2,-0.8390581300000001,1.5598498512643657 -Sb2Br2O2_59_15550.vasp,Sb2Br2O2,-2.6864434750000004,0.2210359676666646 -Ba2Br4_2_1929.vasp,Ba2Br4,-1.680469668333333,0.5372900216666665 -As2Br8_2_1197.vasp,As2Br8,-0.750215518,0.184010442 -Ti2Sn4_59_19032.vasp,Ti2Sn4,-2.7484794316666665,-0.2020107674999995 -Fe3Si4O12_12_6069.vasp,Fe3Si4O12,-5.492422462631579,-0.0658493885087745 -Ba1Cl2_115_1817.vasp,Ba1Cl2,-2.180083763333333,0.5441116200000002 -Be8Ge4_13_2292.vasp,Be8Ge4,-2.3609634741666667,-0.1358664091666686 -La2I2O6_11_9596.vasp,La2I2O6,-4.247577112,0.1108304932222181 -Mn1Mo1W1Se1S1Br1Cl1_6_10801.vasp,Mn1Mo1W1Se1S1Br1Cl1,-2.8044175871428574,0.3173695362499915 -Fe1Cu1Se1Cl2O1_25_5670.vasp,Fe1Cu1Se1Cl2O1,-1.521338285,0.2278949425925907 -Sn4Te4_53_16975.vasp,Sn4Te4,-1.254520905,-1.2187929249999998 -Mg2Au2_191_10425.vasp,Mg2Au2,0.483855105,2.166059585 -Cd2Ag2Se2Br2_26_3445.vasp,Cd2Ag2Se2Br2,-0.01591543125,-0.0174701809374999 -Cu1Ag1Te2_25_4832.vasp,Cu1Ag1Te2,-0.2918133825,0.1707431064583333 -Ag1Br2_115_38.vasp,Ag1Br2,0.2981798033333333,0.2320073566666667 -Pd2S2_129_14467.vasp,Pd2S2,-1.6325713575,0.4775599825000001 -V2Mo2O8_25_20105.vasp,V2Mo2O8,-5.2977559575,0.1129414930555454 -Sr2H2Cl2_129_17232.vasp,Sr2H2Cl2,-2.5310813916666666,0.0988418166666664 -Sc3C2F2_187_16199.vasp,Sc3C2F2,-5.054639817142857,0.2211744726497643 -V1Ag1I2_6_19754.vasp,V1Ag1I2,-0.255229055,0.3915122629166666 -Sr2I4_59_17261.vasp,Sr2I4,-1.1564221433333333,0.1296212155555556 -As2Pd2O7_1_1267.vasp,As2Pd2O7,-3.468544314545454,0.2976417395454512 -Li2Cu2C2O6_17_9885.vasp,Li2Cu2C2O6,-4.495702181666666,0.3276089842708318 -Mn2Ga2S5_164_11075.vasp,Mn2Ga2S5,-2.9267422244444443,-0.0168277061111108 -Al3Ir1_187_1048.vasp,Al3Ir1,-2.2932667575,0.8028571049999997 -W2S2_12_20533.vasp,W2S2,-4.800176415,0.3086493649999999 -Bi1Se1_123_2390.vasp,Bi1Se1,-1.315468675,0.5192690824999989 -Ta2Mo2S11_1_17777.vasp,Ta2Mo2S11,-3.816099946,0.4071579786249968 -Zn2As4S6Br4_31_21034.vasp,Zn2As4S6Br4,-1.785340063125,0.1878291279999998 -Te2Os2F2_59_18425.vasp,Te2Os2F2,-2.5015659683333333,0.4933961202083297 -In1S4_8_8332.vasp,In1S4,-1.965561002,0.6057015891875 -Rh1Cl2_115_15147.vasp,Rh1Cl2,-0.88490736,0.7537825699999984 -Zr1Mo1S2Cl2_6_21328.vasp,Zr1Mo1S2Cl2,-3.452449955,0.2494282882291634 -B2F6_26_1669.vasp,B2F6,-4.14402248875,-0.4259277887500001 -Ag1Ge1Se2I1Br1_1_64.vasp,Ag1Ge1Se2I1Br1,-0.94117513,0.342617765928816 -Ba2Bi4_12_1923.vasp,Ba2Bi4,-0.9861792833333332,0.3699218774999993 -Mg2Ir1_123_10475.vasp,Mg2Ir1,-1.3606283666666668,0.3341618366666665 -Cs2Hg4Te2Br6O6_31_4742.vasp,Cs2Hg4Te2Br6O6,-1.2177987634999998,0.2378535050833299 -Tl2Br6_162_19383.vasp,Tl2Br6,-0.338565585,0.0858584278125 -Pt2I2_129_14629.vasp,Pt2I2,-0.253529145,0.97593702875 -Mo1Au2Se4_111_11495.vasp,Mo1Au2Se4,-1.411475691428571,0.2800558499999985 -Te2Mo2_129_18410.vasp,Te2Mo2,-2.40002041,0.4532873274999995 -Ni1C4N2F6_47_13297.vasp,Ni1C4N2F6,-4.283725218461539,0.1163557978846015 -Cu1Ag1S1I3_1_4821.vasp,Cu1Ag1S1I3,-0.01275808,0.208982822881943 -Cd5N2O16_10_3637.vasp,Cd5N2O16,-2.537778389130435,0.44924715452898 -V1Te6As2Au1_5_19946.vasp,V1Te6As2Au1,-1.616117892,0.175255653291665 -P2S3_164_14046.vasp,P2S3,-3.158974904,0.226275287406247 -Zn2Te2H4S8_7_21178.vasp,Zn2Te2H4S8,-2.157334038125,0.2034766371145831 -W2Se2I2_59_20544.vasp,W2Se2I2,-2.526420276666667,0.2046551848611111 -Rb2Hg4Te2O6F6_31_14887.vasp,Rb2Hg4Te2O6F6,-1.5872568235,0.2752654052521553 -Ga2Te6As2_147_6521.vasp,Ga2Te6As2,-1.669552123,0.2758177981666641 -Ti4S2N3F2_164_19155.vasp,Ti4S2N3F2,-6.033621935454545,-0.0077959337878885 -W2C2Cl2_59_20476.vasp,W2C2Cl2,-4.87992977,0.0435192430555462 -Ag2Sb4Se3Cl2_6_415.vasp,Ag2Sb4Se3Cl2,-1.3363513,0.3243013613636345 -Sr3Cu2Cl2O4_123_17367.vasp,Sr3Cu2Cl2O4,-3.045335567272727,0.1360621224242362 -Mn1Nb1Br2O1_1_10803.vasp,Mn1Nb1Br2O1,-3.277748278,0.0996494738333337 -Na4N1O4_5_12398.vasp,Na4N1O4,-3.163973453333333,0.2890936455555464 -Zn1Br2_1_20905.vasp,Zn1Br2,-0.11076331,0.08197617375 -Ga1Bi1Pt2Se4S2_1_6140.vasp,Ga1Bi1Pt2Se4S2,-2.152532171,0.2574289477857104 -Rb4Hg2F8_11_14973.vasp,Rb4Hg2F8,-1.20840215,0.2596524728571427 -Ba2Sb4S8_11_2057.vasp,Ba2Sb4S8,-2.900422307142857,0.1467835183928567 -In1O2F2_164_8294.vasp,In1O2F2,-1.955398452,1.133063283124997 -Ta2Ni2S6_11_17795.vasp,Ta2Ni2S6,-3.713660852,-0.0513055407000031 -P1S2_164_13944.vasp,P1S2,-3.10865639,0.1750618648958268 -Cu2As4S3Br2_6_5017.vasp,Cu2As4S3Br2,-1.9281945363636368,0.1064838739583285 -Li2Bi1O3_1_9841.vasp,Li2Bi1O3,-3.64420673,0.54121958895833 -Na2Mg1S2O8F4_2_12195.vasp,Na2Mg1S2O8F4,-3.485314907058824,0.1742867986764672 -Li4Sb4O8_14_10223.vasp,Li4Sb4O8,-4.281445868125,0.1241951509375001 -H2S14N2_26_7028.vasp,H2S14N2,-3.0841783527777777,0.0296172802864549 -Fe4H2S2N3_164_6081.vasp,Fe4H2S2N3,-3.26138427,-0.8094539252272784 -Sr1Ag2O8_89_17019.vasp,Sr1Ag2O8,-2.6656736836363635,0.1953660856818123 -Fe2S4_14_5943.vasp,Fe2S4,-2.15950981,-0.223383895 -Zn2H16N4O4F8_14_21094.vasp,Zn2H16N4O4F8,-3.655426230588236,0.0971309301143707 -Sn2As2Se6_147_16729.vasp,Sn2As2Se6,-2.109172575,0.1529172514999984 -Ba2Co2Si2_129_1955.vasp,Ba2Co2Si2,-2.283346041666667,0.1044759799999996 -Zr1Ti1Te1Se1_25_21478.vasp,Zr1Ti1Te1Se1,-3.892781175,0.2682939001562454 -In2Ni2Te5_156_8502.vasp,In2Ni2Te5,-0.8872449566666667,0.1053000072222206 -K4As4Pd2_51_9410.vasp,K4As4Pd2,-1.363499584,0.142918531 -Sc1Mn1Se1S1Br1Cl1_6_15954.vasp,Sc1Mn1Se1S1Br1Cl1,-2.6725791616666665,0.115983234687494 -Mn2Sb1Br1_25_11228.vasp,Mn2Sb1Br1,-1.556860165,0.1882198906573277 -In1Ga1Hg1S4_156_8252.vasp,In1Ga1Hg1S4,-1.889598407142857,0.1303151824999999 -Ta2C1Cl2_164_17675.vasp,Ta2C1Cl2,-5.622319244,0.1313763769999925 -V4Zn4F20_14_20382.vasp,V4Zn4F20,-2.4836322039285714,-0.0432742350000019 -Ta1Nb1Ni2Te1S1I1Br1_6_17572.vasp,Ta1Nb1Ni2Te1S1I1Br1,-2.38278766375,0.2447305631401113 -Li2Yb1Al2F12_164_10139.vasp,Li2Yb1Al2F12,-3.8136430082352937,-0.3429367291339887 -In3Se4_164_8658.vasp,In3Se4,-1.9783914714285715,-0.0171860635714302 -Sb2P2O8_31_15624.vasp,Sb2P2O8,-4.326100405833333,0.9772724908333332 -K2Ge1H6O6_147_9109.vasp,K2Ge1H6O6,-4.005597762,0.0591305085925886 -Li2Mn1P2O8_2_9987.vasp,Li2Mn1P2O8,-5.119267452307692,0.059454247932683 -Zr3Te2_123_21792.vasp,Zr3Te2,-3.625772514,0.0908466577142816 -Sc2S2I2_59_16134.vasp,Sc2S2I2,-3.2405605333333334,0.0447902583333337 -Y2B1H2_164_20695.vasp,Y2B1H2,-4.363022904,0.3541781264999959 -Re2Cl6_189_15041.vasp,Re2Cl6,-907.96936195625,-905.2313788804169 -Y1P2_21_20659.vasp,Y1P2,-3.83381413,1.26845242125 -Zr1Ta1Te1S1I1_8_21454.vasp,Zr1Ta1Te1S1I1,-3.77661472,0.2681295900555492 -In2Se4_127_8598.vasp,In2Se4,-1.445062828333333,0.5932031188888869 -Eu1Sn2_164_5595.vasp,Eu1Sn2,-1.564659246666667,0.1039301541666675 -Pd1O2_187_14376.vasp,Pd1O2,-1.91495162,0.9876137416666668 -Ge2S2_164_6829.vasp,Ge2S2,-3.2151620625,-0.96401420875 -Nb2P2Se6_12_12808.vasp,Nb2P2Se6,-3.552200205,0.2288953973749965 -K2H4Pd1N4O10_2_9133.vasp,K2H4Pd1N4O10,-4.200147176190477,-0.0019908323968384 -Sn4Ge4S12_14_16940.vasp,Sn4Ge4S12,-2.825326278,0.0570069595000002 -Ta8O18_85_18163.vasp,Ta8O18,-6.886161990769231,0.409954540153839 -Ti1Zn2H1O6_1_18875.vasp,Ti1Zn2H1O6,-3.704379594,0.5161539001041597 -V4H2N3_164_20329.vasp,V4H2N3,-5.261465698888888,0.091014118888884 -Na2O2F2_7_12240.vasp,Na2O2F2,-2.16691011,0.4169306754166644 -V2Ag2H4O8_11_19970.vasp,V2Ag2H4O8,-4.16934888,0.0585634926041662 -Sn2Te6As2_1_16901.vasp,Sn2Te6As2,-1.623974072,-0.3957665988333349 -Hf4B3H2O2_164_7763.vasp,Hf4B3H2O2,-5.9957420818181815,0.400823484545437 -Ba2Tl1Hg1Au1S5_99_2084.vasp,Ba2Tl1Hg1Au1S5,-1.618047234,0.3346617714921848 -Mn2Bi2S4Br2_10_11007.vasp,Mn2Bi2S4Br2,-2.084895742,0.149755131166666 -Ga1Pt2_187_6246.vasp,Ga1Pt2,-1.7004419333333332,0.3051294070833334 -Li1In1P2O6_5_9731.vasp,Li1In1P2O6,-4.898791382000001,0.2309852917737995 -W2Se1Br2Cl1_3_20540.vasp,W2Se1Br2Cl1,-2.515840625,0.3846603597222167 -Li2Cu1Ni4Sb2Br1_1_9880.vasp,Li2Cu1Ni4Sb2Br1,-0.467666302,0.7411572304999996 -Ge2Te2I2_59_6884.vasp,Ge2Te2I2,-1.432940215,-0.0738161855555571 -K1Ca2P4H11O18_1_8889.vasp,K1Ca2P4H11O18,-4.909535889444445,0.0345940166550866 -U4S2_1_19736.vasp,U4S2,-6.273878213333333,1.2947298283333266 -Tl1Au1I6_1_19220.vasp,Tl1Au1I6,0.3707893225,0.194273799140625 -Mn2Cl2_129_11051.vasp,Mn2Cl2,-1.04053502,0.8207078031896551 -Hf1Ge3O8_156_7186.vasp,Hf1Ge3O8,-5.380464065833333,0.2867070608333333 -B1Pt2_187_1633.vasp,B1Pt2,-2.93184576,1.6987964666666668 -Tl4Bi20_26_19591.vasp,Tl4Bi20,-0.8106532254166666,-0.3253026108333333 -Na2Ge1O6F6_147_12087.vasp,Na2Ge1O6F6,-2.249155903333333,0.9407458302777784 -In1_191_8371.vasp,In1,-0.2748046,2.25578852 -Cr1S1I2_47_4242.vasp,Cr1S1I2,-1.3919285925,0.1865736627343749 -K2V6O16_11_9388.vasp,K2V6O16,-5.164850842916667,0.1534735258333333 -Al4Se4Br4_14_1093.vasp,Al4Se4Br4,-2.3869852275,0.0487877975000001 -Sr2In1Cu1Hg1O5_99_17264.vasp,Sr2In1Cu1Hg1O5,-2.8251438230000003,0.4163728695624955 -Ca1C1O3_25_2813.vasp,Ca1C1O3,-5.486296149999999,0.3726906210000003 -Cu2H4N6Cl2_2_5127.vasp,Cu2H4N6Cl2,-3.698537032142857,0.1781264739285686 -Li2V1F6_12_10105.vasp,Li2V1F6,-3.448920245555556,0.1378553788888887 -Cu3Se2S1Br3Cl1_1_5389.vasp,Cu3Se2S1Br3Cl1,-0.582447589,0.2692293981249998 -Ag1Ge1Pb1Se1S1Br1_1_61.vasp,Ag1Ge1Pb1Se1S1Br1,-1.6156542033333334,0.1701589945557949 -Fe3H2S2N2_187_6054.vasp,Fe3H2S2N2,-3.1588573055555558,-1.156461298611113 -V1In2Se4_164_19874.vasp,V1In2Se4,-2.2720969571428573,0.1259415858928547 -Ag1S2_12_113.vasp,Ag1S2,-0.92297089,0.5951433530208333 -Cu1Ir1S2Cl2_6_4914.vasp,Cu1Ir1S2Cl2,-1.7670248949999998,0.0222301233333332 -Cd4W2O8_13_3635.vasp,Cd4W2O8,-3.5343861514285715,0.1222732778571447 -V2Co1Te4_164_20044.vasp,V2Co1Te4,-2.1746832342857143,0.0834810861904742 -In4S4_14_8685.vasp,In4S4,-1.748792705,0.5308774600000001 -Pa2P4_129_14167.vasp,Pa2P4,-5.60883384,0.55801414 -Te4Ru2_11_18625.vasp,Te4Ru2,-2.2811561866666668,0.3398385233333334 -Cu1O2_187_4929.vasp,Cu1O2,-1.67257002,1.0950102441666645 -Si2P2Se6_147_16425.vasp,Si2P2Se6,-2.782973944,0.3198553239999973 -Zr2Br6_189_21529.vasp,Zr2Br6,-2.2001594125,0.2334816324999997 -Co1H4C2N4F2_47_3750.vasp,Co1H4C2N4F2,-4.691156563076923,0.1883731895833261 -Co1Te1I1_156_3830.vasp,Co1Te1I1,-1.0629880866666668,0.0774165683333332 -Mg1H2O2_164_10370.vasp,Mg1H2O2,-4.409914834,0.0970957319999996 -Sb2Se2O1_1_15696.vasp,Sb2Se2O1,-2.775743958,0.2171660844999974 -Ge2I1Cl1O3_8_6778.vasp,Ge2I1Cl1O3,-3.425704977142857,0.1080727614285654 -K4Sn4P4S16_14_9518.vasp,K4Sn4P4S16,-2.660564873928571,0.1261581653571433 -Sn1Sb2Te4_164_16690.vasp,Sn1Sb2Te4,-1.72047834,-0.3914805785714288 -P2Pb2S6_147_14014.vasp,P2Pb2S6,-2.923360435,0.1437838624999998 -Zr1Sb1Te2_115_21422.vasp,Zr1Sb1Te2,-2.432993645,0.5453730106250001 -Sb2Os2O6_12_15617.vasp,Sb2Os2O6,-4.540968799,0.349555514249995 -Na1Al1As2S6_5_11807.vasp,Na1Al1As2S6,-2.897375742,0.4413916441874974 -Rb4Cd2F8_11_14965.vasp,Rb4Cd2F8,-1.4807397257142856,0.3453372328571431 -B6O9_150_1781.vasp,B6O9,-6.784460472666667,0.069873902666667 -Li2Fe2Sb2_129_9912.vasp,Li2Fe2Sb2,-1.4320334183333332,0.8723316337499982 -Sn2S2Br2_59_16836.vasp,Sn2S2Br2,-1.7391766266666666,0.1508866991666666 -Na4Cd2I8_11_12379.vasp,Na4Cd2I8,-0.36797237,-0.2675489854761904 -V2W2O8_25_20228.vasp,V2W2O8,-5.808977025833333,0.1821159928248482 -Ag2Sb4S12_12_409.vasp,Ag2Sb4S12,-2.0985400983333333,0.2680672059374951 -Ru2O6_11_15334.vasp,Ru2O6,-3.87233609375,0.6897401040625004 -K2Sn1O6F6_147_9352.vasp,K2Sn1O6F6,-1.975286812,0.941015343166667 -Ti2Cu2_129_18929.vasp,Ti2Cu2,-2.5402960875,0.1617650050000003 -Sn4P8_26_16954.vasp,Sn4P8,-3.0058700191666667,0.1970673245833298 -Ni1Bi1_25_13281.vasp,Ni1Bi1,0.48928557,2.54265367125 -Ba2Te2Au1Br2_38_2064.vasp,Ba2Te2Au1Br2,-1.39950219,0.356868407142854 -Hf1Sc1Mn1In1H1Ir1Cl2O8_1_7298.vasp,Hf1Sc1Mn1In1H1Ir1Cl2O8,-4.537824766875,0.3471423641536434 -Te4Pb2_12_18610.vasp,Te4Pb2,-1.1290505316666668,-0.6456333961111116 -Zr2Sb1Te2_164_21661.vasp,Zr2Sb1Te2,-3.352210098,0.1756889910000008 -Ta1Nb1I1N2Cl1_25_17570.vasp,Ta1Nb1I1N2Cl1,-5.572124675,0.0134390217142817 -Br4O2_4_2709.vasp,Br4O2,-0.7530855166666667,0.3616590220833324 -Hf2C1_164_7460.vasp,Hf2C1,-6.507010080000001,0.8287701279999935 -Mn1Cu1I1Br1O3_1_10686.vasp,Mn1Cu1I1Br1O3,-2.283446442857143,0.0718291005952359 -Au2Br2F2_1_1448.vasp,Au2Br2F2,-0.1451456816666666,0.0749115154166664 -Sn2Cl2O2_59_16759.vasp,Sn2Cl2O2,-2.667187615,0.3027520116666666 -Sn4S3I5_1_16956.vasp,Sn4S3I5,-1.2344498541666666,0.1927071027777778 -Cr1Cu2O8F6_2_4166.vasp,Cr1Cu2O8F6,-2.5448831888235297,0.1417775032352886 -Cu2P2Se4_26_5213.vasp,Cu2P2Se4,-1.84483036625,0.1942291003124983 -Cd1Pb2S2F2_12_3395.vasp,Cd1Pb2S2F2,-1.7220447057142858,-0.1668931982142881 -Bi2P2S8_11_2493.vasp,Bi2P2S8,-2.9181501825,0.0717202329166668 -Au4Se2_191_1592.vasp,Au4Se2,0.17975126,1.1296090099999991 -Mg3H2O4_164_10551.vasp,Mg3H2O4,-4.479946898888889,-0.2396040711111144 -Cd2Au2S2Cl2_26_3458.vasp,Cd2Au2S2Cl2,-0.26154822875,0.1976256103125 -K1W2I6O2_47_8958.vasp,K1W2I6O2,-2.249181150909091,-0.5093864721363676 -Sb2O3_6_15616.vasp,Sb2O3,-4.016913062,0.2405774055000007 -Al1In2Se1S2I1Cl1_1_683.vasp,Al1In2Se1S2I1Cl1,-2.0919990675,0.1432641614843692 -Sc1Ni1S1Br4_1_15967.vasp,Sc1Ni1S1Br4,-1.39541587,0.3204296143749962 -Ga1Se1_156_6273.vasp,Ga1Se1,-1.73528884,0.6821686675 -Sc2Se2Br2_59_16154.vasp,Sc2Se2Br2,-3.175742505,0.0311867883333332 -Al2Zn2Se5_156_1042.vasp,Al2Zn2Se5,-1.86444348,0.1685724230555534 -Cs2Te2N2Cl6O6_1_4794.vasp,Cs2Te2N2Cl6O6,-2.36439017,0.455005690208333 -Ga1Ag1Se1I2_1_6125.vasp,Ga1Ag1Se1I2,-0.67732731,0.175804951 -Ir2S2_25_8826.vasp,Ir2S2,-3.0810236275,0.751502930833329 -Sb2Pb2S6F2_7_15644.vasp,Sb2Pb2S6F2,-2.3349546158333334,0.2670561790624959 -Ga2Ge2Se6_162_6366.vasp,Ga2Ge2Se6,-2.460063405,0.0762321156666639 -Mg4Ti4_59_10591.vasp,Mg4Ti4,-2.76917859625,0.6294728295833334 -Ta2Ni1C1I2O1_6_17788.vasp,Ta2Ni1C1I2O1,-3.887919504285714,0.5241836739999909 -Cu1Ru1Se1Cl3_1_4952.vasp,Cu1Ru1Se1Cl3,-1.38086301,0.2431187212121186 -Ni3Sb2Se8_164_13717.vasp,Ni3Sb2Se8,-1.3498875646153847,0.3710216019230751 -Sn1Se1_123_16692.vasp,Sn1Se1,-1.49571888,0.0805594949999999 -Tl1Ga1Br2_1_19270.vasp,Tl1Ga1Br2,-0.9506725175,0.0284377993749982 -Si1I2_164_16344.vasp,Si1I2,-1.18985702,0.1199640386111098 -Ag2H8C10S2N2O6_1_286.vasp,Ag2H8C10S2N2O6,-5.037987074666666,0.3660919078888769 -Na2C2S6_1_12003.vasp,Na2C2S6,-3.277941086,0.3594720021249978 -Li1Al1Br4O12_2_9639.vasp,Li1Al1Br4O12,-2.825463301111111,0.2679841738888859 -Ni2Te4H2_11_13675.vasp,Ni2Te4H2,-1.28649441875,0.474564455 -Cr3W1Se8_25_4587.vasp,Cr3W1Se8,-2.9834433641666664,-0.0607140604166663 -Co2Te2F2_59_4034.vasp,Co2Te2F2,-1.7864181683333331,0.1929957668055555 -Zr1Mn1Br6_5_21318.vasp,Zr1Mn1Br6,-1.812319645,0.0597139284374999 -Ga1Pd5I2_123_6243.vasp,Ga1Pd5I2,-0.95777015875,0.0229912742939802 -Mn2H4S10_7_11100.vasp,Mn2H4S10,-2.836782353125,0.2899568329687501 -Co1Cl2O8_147_3727.vasp,Co1Cl2O8,-2.5120587436363637,0.2332398904545445 -Te2Ir2_164_18399.vasp,Te2Ir2,-2.2229834375,0.9124480575000002 -K2Sb4S7_5_9343.vasp,K2Sb4S7,-2.392133676153846,0.1339384700000006 -Fe2Br2O2_59_5818.vasp,Fe2Br2O2,-2.3778257183333333,0.0883062565277752 -Na2Os2Br8N2O4_7_12243.vasp,Na2Os2Br8N2O4,-2.615478528333333,-0.0967207852777798 -Mg2P2S6_12_10496.vasp,Mg2P2S6,-3.17062535,0.0431856229999998 -Ti1S1O1_156_18836.vasp,Ti1S1O1,-6.04340325,0.1531816858333332 -Zr2B1S2_164_21511.vasp,Zr2B1S2,-4.994747856,0.1678566934999956 -Sc2C2_164_16057.vasp,Sc2C2,-4.5964784075,1.167901076774188 -Nb2B1O2_164_12633.vasp,Nb2B1O2,-6.664934196,0.3771892347500016 -Au4O4F8_14_1576.vasp,Au4O4F8,-0.7851765325,0.4883853773784712 -Cs2I2Cl8_127_4749.vasp,Cs2I2Cl8,-0.6130097791666667,0.0756699658333333 -Rb2H6C6O6_1_14856.vasp,Rb2H6C6O6,-5.126307722,0.186812124437496 -Sb2P2S6_7_15626.vasp,Sb2P2S6,-2.937086502,0.1575351537031251 -H4Pd1C8I2_25_7081.vasp,H4Pd1C8I2,-4.872953734,0.4748786834999939 -Ga2H2S10_11_6376.vasp,Ga2H2S10,-2.640187747857143,0.2175626881249973 -Au2I4_14_1492.vasp,Au2I4,0.61868993,0.1455714412500005 -K2Ru2S4I8N2_7_9327.vasp,K2Ru2S4I8N2,-1.6237395744444445,0.231735362152776 -Sc1Cl2_115_15917.vasp,Sc1Cl2,-2.386924113333333,0.5025634577777747 -Y2Mg4_59_20756.vasp,Y2Mg4,-1.1311961016666667,0.2318178516666653 -Y2N1_164_20761.vasp,Y2N1,-5.7499866766666665,0.3148880849999944 -Ni2Sb2Se5_8_13613.vasp,Ni2Sb2Se5,-1.5233370522222225,0.2246026039393922 -Sc1I2_187_15946.vasp,Sc1I2,-1.6073565133333334,0.137872263888887 -Cu2S2_10_5255.vasp,Cu2S2,-1.074458945,0.2879447666666668 -Ca2S2O8_7_3104.vasp,Ca2S2O8,-4.659511495,0.1690330433333331 -Mn2S2N1_164_11218.vasp,Mn2S2N1,-3.623884448,0.2415557868333245 -Ca2N1_115_3069.vasp,Ca2N1,-2.32814433,0.6018418199999997 -Fe1Ge1S1Br1_1_5679.vasp,Fe1Ge1S1Br1,-1.8162233125,0.063070710625 -Cu2Te3P4F2_6_5347.vasp,Cu2Te3P4F2,-1.9604577909090908,0.4928397134343397 -Mo2S2N1_164_11666.vasp,Mo2S2N1,-4.31640025,0.2327900530000004 -Ni2Bi2Se4Cl2_10_13470.vasp,Ni2Bi2Se4Cl2,-1.200926809,0.2052549249999994 -Rb4Hg2Br8_11_14971.vasp,Rb4Hg2Br8,-0.3410776771428571,0.1680753464285714 -Hf2Cl2_129_7474.vasp,Hf2Cl2,-3.3736166325,0.9390414199999996 -Cu2Te1Rh1Se3_1_5323.vasp,Cu2Te1Rh1Se3,-1.1738427,0.2894443661904736 -In1Se4_8_8346.vasp,In1Se4,-1.574533542,0.5716214476666667 -B4I4_57_1755.vasp,B4I4,-1.26677752125,1.6077413206944415 -Co2W2S8F2_129_4058.vasp,Co2W2S8F2,-2.883471105714286,0.7266675653571365 -Ca1Au2S8_89_2804.vasp,Ca1Au2S8,-1.978445893636364,0.1149996915340869 -Cs2Hg4S2O6F6_31_4731.vasp,Cs2Hg4S2O6F6,-1.9407276695,0.28317769025 -Li1Ni1Te6As2_5_9769.vasp,Li1Ni1Te6As2,-1.529866183,-0.1171374345833347 -Yb2H4Cl2O4_11_20875.vasp,Yb2H4Cl2O4,-4.685908870833333,-0.6696618014930589 -Ta4Mo2O16_3_18057.vasp,Ta4Mo2O16,-6.319047369090909,0.2303188559090854 -Nb3S1Br2O1_1_12997.vasp,Nb3S1Br2O1,-4.402650292857143,0.2361156021564465 -In4Te4Br4O12_53_8697.vasp,In4Te4Br4O12,-3.181214005416667,0.0516139648611075 -Hf1Se2_187_7310.vasp,Hf1Se2,-4.39418746,0.3336308033333335 -Tl1Rh3S1Br1Cl2_8_19328.vasp,Tl1Rh3S1Br1Cl2,-1.49769076625,0.4106116330833296 -Ti1Mo1Br2N2_25_18801.vasp,Ti1Mo1Br2N2,-4.731273483333333,0.0180935273611055 -Pd2S12N4_14_14455.vasp,Pd2S12N4,-2.9395422744444444,0.2262885094444415 -Li1Bi3_187_9664.vasp,Li1Bi3,-1.0913235625,-0.4304294074999999 -B2N6_164_1686.vasp,B2N6,-6.3957217025,0.27259148 -Cu2P2Se4_1_5212.vasp,Cu2P2Se4,-1.85058964125,0.1884698253124983 -Mg2Ga2S5_156_10457.vasp,Mg2Ga2S5,-1.8283957022222224,0.9436930133333332 -Mg2Te2Mo2S12_18_10522.vasp,Mg2Te2Mo2S12,-2.618825396666667,0.140323746643516 -Ni3Se4_164_13723.vasp,Ni3Se4,-1.0424931814285714,0.0694554485714287 -Al2F6_2_823.vasp,Al2F6,-4.01318520375,-0.0185058637500001 -Sn2F2_164_16767.vasp,Sn2F2,-1.8272953,-0.4644418193749999 -Ga2Cl2O2_59_6318.vasp,Ga2Cl2O2,-3.2987893733333333,-0.3159946270833363 -Bi2I8_1_2470.vasp,Bi2I8,-0.1033257869999999,0.2122232403750003 -Mn2W2Br2O8_129_11335.vasp,Mn2W2Br2O8,-4.52441883,0.0691849495238057 -Ga1Cu1S2Br2_6_6168.vasp,Ga1Cu1S2Br2,-1.3511834533333331,0.269864577893517 -Sb10_6_15413.vasp,Sb10,-2.032164348,0.2514027245000001 -Te6Ir2_7_18653.vasp,Te6Ir2,-1.988227075,0.3191570863888869 -Br4O12_2_2708.vasp,Br4O12,-1.949025835,0.5672307396875003 -Mn2N1O2_164_11154.vasp,Mn2N1O2,-4.5804305880000005,0.2383531352499946 -Nb2S2N1_164_12843.vasp,Nb2S2N1,-6.065882974,-0.1232075868333395 -Pu2Br2O2_129_14717.vasp,Pu2Br2O2,-6.471372805000001,0.0447065433333335 -La1Ge5_47_9566.vasp,La1Ge5,-2.9842591166666668,-0.0788228094444472 -Hg2P2Se6_2_7984.vasp,Hg2P2Se6,-1.527636204,0.0738362584999998 -Bi1S1Br1_156_2365.vasp,Bi1S1Br1,-1.66323498,0.1754443666666665 -Mn2N1F2_164_11153.vasp,Mn2N1F2,-3.604419308,0.2864832300000004 -Tl1Hg1Br4_1_19284.vasp,Tl1Hg1Br4,0.0629040466666666,0.133472236875 -Hf1H2_187_7192.vasp,Hf1H2,-4.127339243333333,0.5263389866666666 -Ni1O2_187_13386.vasp,Ni1O2,-2.1013062033333334,0.234980958749998 -Tl2Re6Se8Cl4_2_19493.vasp,Tl2Re6Se8Cl4,-3.6599399235,0.0571741779999959 -V2Se2I2_59_20184.vasp,V2Se2I2,-2.115279128333333,0.1950613063888833 -Zr2Nb1I1N2Cl1O1_1_21610.vasp,Zr2Nb1I1N2Cl1O1,-5.17177680875,0.6789162999652744 -In2P2O6_149_8519.vasp,In2P2O6,-4.5174306,0.2798394930714245 -Zr2C2Br2_59_21539.vasp,Zr2C2Br2,-4.577044235,0.5626091516666603 -Cs2Cd4Te2I6O6_31_4701.vasp,Cs2Cd4Te2I6O6,-1.2597230135,0.2148026652083339 -Fe2P2N2O10_31_5908.vasp,Fe2P2N2O10,-4.75909326375,-0.1327672931249996 -Mo3H2C2_187_11708.vasp,Mo3H2C2,-4.531803874285714,0.36657496053571 -Cu2Cl6_191_5088.vasp,Cu2Cl6,-0.0542393675,0.363445755625 -Tl2F2_129_19408.vasp,Tl2F2,-1.4632261725,0.4897459399999999 -Re4Te8_2_15119.vasp,Re4Te8,-3.441434585,0.0788936050000002 -Fe2B1F2_164_5796.vasp,Fe2B1F2,-2.49891365,0.5298349459999971 -Cu4H4Br4O4_14_5410.vasp,Cu4H4Br4O4,-2.09043913875,0.133875187760417 -Cr1Ag1Sb2Se6_1_4105.vasp,Cr1Ag1Sb2Se6,-1.829482047,0.2390880913333313 -Li2S4I2_113_10060.vasp,Li2S4I2,-1.70584684375,0.5212140096875 -Na2Hg4S6O2F6_31_12158.vasp,Na2Hg4S6O2F6,-1.3171688435,0.4232820289166626 -Hf1Rh3S4Br4_1_7274.vasp,Hf1Rh3S4Br4,-2.535954953333333,0.3281130249999975 -Lu1Sn2_123_10300.vasp,Lu1Sn2,-1.52236071,-0.3567739249999999 -Si8_47_16553.vasp,Si8,-3.68912695,-0.6989779 -Co1B4H4I2N2_47_3702.vasp,Co1B4H4I2N2,-4.004717840769231,0.5304425617980674 -Ni2As2O6_162_13445.vasp,Ni2As2O6,-3.166211412,0.2288500372499954 -Ho2Br6_162_8129.vasp,Ho2Br6,-2.2951053875,0.0535238124999999 -Eu2Al4Cl16_13_5597.vasp,Eu2Al4Cl16,-2.334404418181818,0.0426021477272726 -Ba2Cl2F2_129_1946.vasp,Ba2Cl2F2,-3.185348395,0.0981846066666665 -Hf1Ge1S3Cl3_1_7178.vasp,Hf1Ge1S3Cl3,-3.04601366375,0.2944128763867188 -Os2Se1S1Cl4_1_13879.vasp,Os2Se1S1Cl4,-2.29911132875,0.1848329479687499 -Re6Te14Br14_147_15133.vasp,Re6Te14Br14,-2.092471984117647,0.0487500173529409 -In4S6_31_8687.vasp,In4S6,-2.451772179,0.0728682040000001 -Mn1Ni1Br2O1_1_10825.vasp,Mn1Ni1Br2O1,-1.61963313,-0.1196931574999997 -Ti1Cl2_115_18757.vasp,Ti1Cl2,-3.16991308,0.5376999908333335 -Ir1S2_187_8759.vasp,Ir1S2,-2.84786148,0.2414934533333328 -Sn3P4_5_16923.vasp,Sn3P4,-2.791627095714286,0.170436350535714 -Hg2Te2_164_8036.vasp,Hg2Te2,0.7173321775,0.2413651558333333 -Ti2Te2_187_19043.vasp,Ti2Te2,-3.74137579,0.6889740253124954 -Th1I2_164_18717.vasp,Th1I2,-2.4213793966666666,0.0613454350000002 -Ba3Ni2S5Br2_123_2122.vasp,Ba3Ni2S5Br2,-2.275562895833333,0.1175261073177034 -Mn2N1Cl2_1_11152.vasp,Mn2N1Cl2,-2.813532822,0.4692445779999998 -Te2Pt1_115_18478.vasp,Te2Pt1,-1.2761311866666667,0.5690562616666666 -Fe2H2S4_11_5856.vasp,Fe2H2S4,-2.67117451625,-0.2377347959374998 -Na2V4S10_31_12336.vasp,Na2V4S10,-3.125023990625,0.3142496628645769 -Tl1W2Cl6O2_10_19356.vasp,Tl1W2Cl6O2,-3.070618353636364,0.0600840418181816 -Mo2S2Cl2_59_11663.vasp,Mo2S2Cl2,-2.769628925,0.262348488055556 -Lu4Te10O26_2_10325.vasp,Lu4Te10O26,-4.44153582325,0.0760524572500003 -Au2S4O1_21_1528.vasp,Au2S4O1,-1.39110356,0.6850818359374979 -Zr1Te2_187_21466.vasp,Zr1Te2,-2.9677862466666665,0.2421802699999999 -In1Si1Te2_1_8351.vasp,In1Si1Te2,-1.8143471675,0.127153957727271 -Sc1Zn1Sn3Se5S1Br1Cl4_1_16023.vasp,Sc1Zn1Sn3Se5S1Br1Cl4,-1.829910244375,0.2549204121770833 -Cr1Ag1S2_156_4101.vasp,Cr1Ag1S2,-2.221714205,0.1951524837499998 -Re4Hg4O16_14_15107.vasp,Re4Hg4O16,-4.223015691666666,0.1101279958333334 -V1I1Cl1O1_6_19863.vasp,V1I1Cl1O1,-2.8929022725,0.1079309008593734 -Co3As1_187_4060.vasp,Co3As1,-1.0369452675,1.0414243181250002 -H8Au2C8Cl2_2_7089.vasp,H8Au2C8Cl2,-4.474543035,0.446729661000001 -Ti4C3S2_164_19132.vasp,Ti4C3S2,-6.980396087777778,0.2057586999999927 -Te2Rh1_187_18495.vasp,Te2Rh1,-1.7473444766666668,0.4546740655555552 -H4Pb1_123_7067.vasp,H4Pb1,-2.091519198,2.0347258140000006 -Mn1Nb1Sb2Te2_115_10810.vasp,Mn1Nb1Sb2Te2,-2.39272148,0.4009066367361064 -K4Ge4S10_1_9448.vasp,K4Ge4S10,-2.514517381111111,0.2013891102777782 -Cs1Ti1Te2_156_4657.vasp,Cs1Ti1Te2,-2.369756175,0.3154114562500001 -Ge1Te1Au1Se1_25_6711.vasp,Ge1Te1Au1Se1,-1.266724585,0.39774041125 -Ce2Mg2_59_3669.vasp,Ce2Mg2,-0.673948985,1.05802837 -La2Sm2I8_13_9616.vasp,La2Sm2I8,-1.8005264341666667,0.0612594791666665 -Ho2Cl6_162_8134.vasp,Ho2Cl6,-2.8745505575,0.0490937537499998 -Cu1H4C12O2_6_4897.vasp,Cu1H4C12O2,-5.750202328421053,0.8193547974561374 -Li2Tl2P2H2O6_4_10099.vasp,Li2Tl2P2H2O6,-4.377081784285714,-0.0585612676653546 -Na2Mg1S10F4_2_12194.vasp,Na2Mg1S10F4,-2.2095269494117646,0.5753927309558798 -Ag2Te3P4Br2_6_471.vasp,Ag2Te3P4Br2,-1.6096830927272727,0.2024464039772702 -Na2B6H6S6_4_11988.vasp,Na2B6H6S6,-3.749997705,0.3194502307099914 -Ga1Pd2_187_6238.vasp,Ga1Pd2,-1.18477787,0.7153786683333334 -Tl1Au1Se2Cl2_1_19224.vasp,Tl1Au1Se2Cl2,-0.6523241916666667,0.4116772645833326 -Hf1Pd2F8_2_7269.vasp,Hf1Pd2F8,-2.863736661818182,0.0355806931818167 -Sr3Be3_156_17355.vasp,Sr3Be3,-0.5851805783333334,1.1939801393589726 -Ag2Br2N2_59_200.vasp,Ag2Br2N2,-0.934083665,0.8464824591666651 -Mn2Nb3Mo1Se8_1_11165.vasp,Mn2Nb3Mo1Se8,-3.4780289092857144,0.2713696828355881 -Hf2Se6_59_7612.vasp,Hf2Se6,-3.92830019,0.075888936666667 -Pb2N2F2_59_14258.vasp,Pb2N2F2,-2.800877115,0.6078984858333307 -C6N6_8_2779.vasp,C6N6,-7.111242453333333,-0.0540467550000063 -K4Br2_51_9418.vasp,K4Br2,-0.1490358866666666,0.119772333333333 -Na2Mg1H4Se2O10_2_12191.vasp,Na2Mg1H4Se2O10,-3.937849310526316,0.0641739499999967 -Fe2S2_123_5938.vasp,Fe2S2,-1.2300370275,0.7517280524999999 -Ba1Bi2F12_2_1808.vasp,Ba1Bi2F12,-2.323396066666666,-0.0178449280000001 -Ag1Hg3_191_81.vasp,Ag1Hg3,2.4918193025,0.4698794415948277 -Os2S2_6_13874.vasp,Os2S2,-3.69997481,0.995725296875 -W1O3_6_20446.vasp,W1O3,-5.9133971625,-0.0493613593750001 -Zr4O8_57_21837.vasp,Zr4O8,-6.702086525833334,0.4809026174999999 -Hg2As2S6_147_7924.vasp,Hg2As2S6,-1.658616097,0.4454051911874973 -W1Cl2_187_20429.vasp,W1Cl2,-2.06112865,0.9790664199999948 -Ba1Si2_164_1857.vasp,Ba1Si2,-1.6138243266666663,1.5900391170833337 -Hf1H1O2_8_7188.vasp,Hf1H1O2,-5.944702605,1.1023577524999997 -Co1Te1O4F2_3_3831.vasp,Co1Te1O4F2,-2.93198949125,0.1941249787500001 -Si1F4_123_16333.vasp,Si1F4,-3.661417296,0.1888344610000003 -Te2Ru1_164_18510.vasp,Te2Ru1,-2.06229502,0.5586996900000001 -Cu2S2F2_59_5245.vasp,Cu2S2F2,-1.2336007666666666,0.3053806171180535 -Ba1Br2_115_1812.vasp,Ba1Br2,-1.71356436,0.5041953299999997 -Na2H6Pd1S6_147_12127.vasp,Na2H6Pd1S6,-2.77297303,0.0856235051666666 -Ni4As4O4_13_13739.vasp,Ni4As4O4,-2.561629018333333,0.5203864934259205 -Ta4Si2Te8_55_18115.vasp,Ta4Si2Te8,-3.843806498571429,0.0408029907440445 -Ba2Cl2_129_1948.vasp,Ba2Cl2,-1.379152945,0.7618886975000002 -Na1In1Cl4O12_2_11883.vasp,Na1In1Cl4O12,-2.583867406111111,0.210398728333331 -In1Sb1Te1Se1_1_8333.vasp,In1Sb1Te1Se1,-1.605055595,0.2620958756249977 -W1Cl2_12_20427.vasp,W1Cl2,-2.49029802,0.5498970499999949 -Ge2Br8_1_6759.vasp,Ge2Br8,-0.77570622,0.39456956675 -Nb2Sb2S6_2_12860.vasp,Nb2Sb2S6,-3.78064957,-0.1218383658333349 -Zn1S2_115_21006.vasp,Zn1S2,-1.03613978,0.6309285494583318 -Ni1Au1Se1I2_1_13261.vasp,Ni1Au1Se1I2,0.108713222,0.2288665705 -Ta1O2_115_17592.vasp,Ta1O2,-6.73677167,0.6182990186666603 -V2Se2F2_59_20183.vasp,V2Se2F2,-3.252099365,-0.0431535747222284 -In2P2Se6_143_8522.vasp,In2P2Se6,-2.30426228,0.1308855072499949 -Sc2N1_164_16106.vasp,Sc2N1,-4.70690717,0.5924507633333338 -U1Sb2O6_12_19698.vasp,U1Sb2O6,-5.7286257577777775,-0.0021225870833379 -Cr2C1O2_164_4342.vasp,Cr2C1O2,-5.00929107,0.0522987342727179 -Ca1Ag1Te2N1_6_2795.vasp,Ca1Ag1Te2N1,-1.907965738,-0.004043306333333 -Ti4Br4N3O1_8_19126.vasp,Ti4Br4N3O1,-5.592855320000001,-0.2273577163541772 -In1Ge1S2_1_8264.vasp,In1Ge1S2,-2.5389594075,-0.1266502515625003 -Cu2H4S2O10_2_5131.vasp,Cu2H4S2O10,-3.771742514444445,0.1106918879166636 -Ti3C2S2_187_19076.vasp,Ti3C2S2,-6.62184903,0.2761910692857088 -V2I2O2_59_20095.vasp,V2I2O2,-3.5299109116666667,0.0826205938888855 -Sr1Sn1Sb1S1Br2_1_17087.vasp,Sr1Sn1Sb1S1Br2,-1.8573754116666663,0.2660803491666645 -Cu4Te4Cl4_14_5485.vasp,Cu4Te4Cl4,-0.6000776741666667,0.1305278358333327 -Pd1C8I2F4_25_14357.vasp,Pd1C8I2F4,-4.405700790666667,0.5452923461666607 -Zr2Ge2S8_31_21569.vasp,Zr2Ge2S8,-3.893158425,0.0850358742708334 -Ga1_191_6299.vasp,Ga1,-1.1332099,-0.03831092 -Cd2Sb2S6_147_3563.vasp,Cd2Sb2S6,-1.669813422,0.2905371024374976 -Ta2Br10_1_17661.vasp,Ta2Br10,-1.7522332725,0.4022325975 -Sn2As2H6C2S6_7_16720.vasp,Sn2As2H6C2S6,-3.4929549255555554,0.149875364097212 -Tl2Ni1F4_123_19459.vasp,Tl2Ni1F4,-1.671891687142857,-0.0181004628571428 -Mn2S2Cl2_59_11215.vasp,Mn2S2Cl2,-2.3047402583333336,0.2735833620833328 -Sb2Cl6_147_15569.vasp,Sb2Cl6,-1.47176911125,0.0474727137499999 -Ba2Au1Se2I2_38_1914.vasp,Ba2Au1Se2I2,-1.567483507142857,0.1357577690624968 -Cd1C1N2_156_3289.vasp,Cd1C1N2,-3.302320585,0.9065153660416608 -Ga2Ni2O5_164_6403.vasp,Ga2Ni2O5,-3.40602449,0.0622765605555561 -Cr3S4_12_4579.vasp,Cr3S4,-3.3961759257142856,0.1808391842857144 -Na2Cd4S8Br6_31_12033.vasp,Na2Cd4S8Br6,-1.016013398,0.2629885644375003 -K1W2Cl6O2_47_8957.vasp,K1W2Cl6O2,-3.147128987272727,0.0587639818181822 -Sr2Ge4H12_2_17227.vasp,Sr2Ge4H12,-2.8937006344444445,0.6116782224999966 -K2Os2C2Cl8O4_31_9275.vasp,K2Os2C2Cl8O4,-3.0207414644444444,0.2733964268055499 -Ti2Cl2_164_18924.vasp,Ti2Cl2,-3.7365902225,0.8470073956250004 -Sr2C4_12_17164.vasp,Sr2C4,-4.277934121666667,1.2241483166666614 -Y1Cl2_187_20623.vasp,Y1Cl2,-3.42938533,0.1422258747222187 -Cd2C4O14_2_3482.vasp,Cd2C4O14,-4.4353919495,0.3542792149999976 -Tl6B2S6_11_19639.vasp,Tl6B2S6,-2.3538361485714288,0.3635866999999995 -Tl2O2_123_19471.vasp,Tl2O2,-1.9030078125,0.5049173772916642 -Hg2Sb2I2O4_11_8004.vasp,Hg2Sb2I2O4,-1.959342817,0.2067573882500002 -Hf2F2_164_7488.vasp,Hf2F2,-4.9944473075,0.3524838781250006 -K2N2O6_31_9249.vasp,K2N2O6,-4.0956674280000005,0.0755156997499995 -Ag2P2Se4_26_352.vasp,Ag2P2Se4,-1.69102766375,0.2090442803906237 -Te2W2Br2_59_18525.vasp,Te2W2Br2,-2.364650385,0.4503857155555553 -Cd4F8_55_3627.vasp,Cd4F8,-0.8481819508333334,0.3007833958333333 -Tb2Mg2Ni2_51_18204.vasp,Tb2Mg2Ni2,-0.5496745216666666,-0.1344455769444456 -Tl1Ag1Te6P2_149_19211.vasp,Tl1Ag1Te6P2,-1.364309691,0.2072639245833333 -Ag4S4F4_14_549.vasp,Ag4S4F4,-1.0702914733333333,0.2304190215104145 -Cr2Te1Se1_8_4516.vasp,Cr2Te1Se1,-2.44904557,0.4041940124999971 -Be2Bi4_12_2244.vasp,Be2Bi4,-1.5449886616666666,-0.4833574033333341 -Ga1Cu1Ag1I2N1F2_1_6156.vasp,Ga1Cu1Ag1I2N1F2,-1.34445208125,0.5592780411458272 -Fe2Se1S1Br2_1_5968.vasp,Fe2Se1S1Br2,-1.5504026883333333,-0.0633516091666666 -Nb3S1Br7_156_12998.vasp,Nb3S1Br7,-2.877363821818182,0.0632106363636362 -Si1Ni2P1S4_8_16349.vasp,Si1Ni2P1S4,-2.30596679125,0.4195831115056803 -As2Rh2S6_162_1284.vasp,As2Rh2S6,-2.924027206,0.2742040572499979 -Li1Ga1Sb2Se6_5_9716.vasp,Li1Ga1Sb2Se6,-2.111990957,0.3846780923333309 -Rh2O2_129_15206.vasp,Rh2O2,-2.6515292275,1.2169369062499995 -As4O6_59_1335.vasp,As4O6,-4.22031303,0.2649245420000001 -Cs4H28O16_14_4808.vasp,Cs4H28O16,-4.02123750625,0.0553161064583331 -Ir2C4_12_8772.vasp,Ir2C4,-5.337422431666667,1.8105341416666605 -Mo2W2Se8_25_11701.vasp,Mo2W2Se8,-3.416781350833333,-0.9231833524999996 -Ta4Fe2Se10_59_18038.vasp,Ta4Fe2Se10,-3.80338806375,0.0743077681250001 -Nb2C2I2_59_12670.vasp,Nb2C2I2,-4.861402985,0.2911696506249969 -Mn2O2F2_47_11172.vasp,Mn2O2F2,-3.553097188333333,0.1149408199999997 -Co2Br6_162_3878.vasp,Co2Br6,-0.88965436,0.0472043724999999 -Mg10Rh2_26_10328.vasp,Mg10Rh2,-0.3446816066666667,0.3656625013768109 -Al8Se12_14_1113.vasp,Al8Se12,-2.950069954,0.0025548360000002 -Cd1H12C12N2Cl2O2_2_3325.vasp,Cd1H12C12N2Cl2O2,-5.21932214,0.1970664182795657 -Cd2Bi2I2O4_11_3467.vasp,Cd2Bi2I2O4,-1.980163222,0.1243231180000004 -Ti1Cr1N2Cl2_6_18771.vasp,Ti1Cr1N2Cl2,-4.888989038333333,-0.1945091504166765 -Al18Se9_143_589.vasp,Al18Se9,-2.147966651481481,0.6255996668518493 -Mg2F4_51_10451.vasp,Mg2F4,-3.1592041300000004,-0.0385784583333341 -K4Cu2P4O14_113_9440.vasp,K4Cu2P4O14,-4.193449195,0.232272089166666 -H2Pd2S4_6_7016.vasp,H2Pd2S4,-2.37927878625,0.2293848574999999 -U1O2F2_191_19697.vasp,U1O2F2,-6.153052338,-0.0593674634500036 -Al1Ga1Hg1Te4_156_664.vasp,Al1Ga1Hg1Te4,-1.1538239642857142,0.18812621 -Mn2Se6_11_11290.vasp,Mn2Se6,-2.17057131375,0.1276935345833335 -Al4H12O12_2_1072.vasp,Al4H12O12,-4.90252528,-0.3756497688095277 -Ag2Cl2O4_11_241.vasp,Ag2Cl2O4,-1.47976951875,0.263471843125 -Ca2Cu1Te2Cl2_38_3007.vasp,Ca2Cu1Te2Cl2,-1.3073393985714286,0.2769821921428544 -Nb2Se1Br3O2_8_12863.vasp,Nb2Se1Br3O2,-4.07664062,0.1116221288281251 -Fe2Br2_12_5821.vasp,Fe2Br2,-0.55605301,0.63024667125 -Zr1Sc1C1Br1O1_156_21430.vasp,Zr1Sc1C1Br1O1,-5.39427506,0.0431843960000004 -Hf2S6_59_7581.vasp,Hf2S6,-4.67478347375,0.0536817474999997 -B2Te2_2_1715.vasp,B2Te2,-3.34323356,0.5231519675000001 -Fe1Ni1S2I1Cl1_6_5725.vasp,Fe1Ni1S2I1Cl1,-1.3044498916666667,-0.0967816428472256 -Ca2Co1S3_38_2986.vasp,Ca2Co1S3,-2.7323799,0.1448895945138864 -Al4Te6_31_1104.vasp,Al4Te6,-2.148039776,0.0672483182499998 -Hf1Co1Br6_149_7147.vasp,Hf1Co1Br6,-1.86806087375,0.1202535449999988 -In2Se4_1_8596.vasp,In2Se4,-1.6078458283333334,0.4304201188888867 -Ga1Te1_123_6292.vasp,Ga1Te1,-1.344718065,0.5884821508333336 -Ba2Cu1Se2Cl2_38_1971.vasp,Ba2Cu1Se2Cl2,-2.0513869928571427,0.2141419096428554 -Zr2C2F2_59_21543.vasp,Zr2C2F2,-5.344181348333334,0.4873569695833273 -In1Pd5F2_38_8313.vasp,In1Pd5F2,-0.98260184125,0.7443670691666646 -Mg2As2S6_162_10423.vasp,Mg2As2S6,-2.778915899,0.0643293011874971 -Dy1P2_21_5512.vasp,Dy1P2,-3.156331456666667,1.025522794999996 -Li1Ga1S4_3_9713.vasp,Li1Ga1S4,-2.616834191666667,0.135859177291664 -Ti2Ga1Br2N3_1_18938.vasp,Ti2Ga1Br2N3,-5.1788879575,0.0218978677083292 -B1P1S4_16_1630.vasp,B1P1S4,-3.672229106666667,0.0850253699999998 -Mn1Sn2B6C6_1_10899.vasp,Mn1Sn2B6C6,-4.933783474666667,0.6807223418888786 -Mo2S4_127_11676.vasp,Mo2S4,-2.43354998,1.3325686383333335 -Ni4As4Se4_13_13741.vasp,Ni4As4Se4,-1.6537970216666666,0.3345270308333334 -K2Sr2I6_51_9355.vasp,K2Sr2I6,-0.907960668,-0.1039792046666665 -K2Hg4S2Cl6O6_31_9177.vasp,K2Hg4S2Cl6O6,-1.7472797255,0.0942632338928555 -Te4Mo3O1_10_18595.vasp,Te4Mo3O1,-2.655191345,0.2234527815624998 -Ni4P4H16Cl4O12_14_13750.vasp,Ni4P4H16Cl4O12,-3.637909248,0.0861251254444389 -Nd1F2_123_13219.vasp,Nd1F2,-3.8595090266666663,0.5656674773148105 -Sb2Se2O10F2_4_15695.vasp,Sb2Se2O10F2,-3.3236164925,0.3208587987611579 -As8Se20_14_1405.vasp,As8Se20,-2.2578695307142858,0.2630022095238076 -Bi1S1I1_156_2369.vasp,Bi1S1I1,-1.5253151733333334,0.0817904499999999 -Al2Se3_150_974.vasp,Al2Se3,-2.589968012,0.3626567780000003 -Mn3Sb1O8_12_11404.vasp,Mn3Sb1O8,-4.340600036666666,-0.1381132874999999 -Ni2H2S4_6_13513.vasp,Ni2H2S4,-2.10716923125,0.1602543438281227 -Pt2S2O8_75_14659.vasp,Pt2S2O8,-2.89795708,0.9697954541666663 -Al2Cu1S4_1_817.vasp,Al2Cu1S4,-2.66937104,0.4289103284374975 -H4Pd1C6Br2N2_25_7074.vasp,H4Pd1C6Br2N2,-5.016125603333333,0.2847319716666612 -Rb2H2Se2O6_1_14848.vasp,Rb2H2Se2O6,-3.3236574141666666,0.2369382162499969 -P4Pt2_2_14103.vasp,P4Pt2,-3.183968328333333,1.0947180599999995 -Cr3H2C2O2_187_4554.vasp,Cr3H2C2O2,-4.781750646666667,0.1898402656481389 -Hg1I2_5_7882.vasp,Hg1I2,0.9039781766666668,0.0310979194444445 -Sb2Pb2Se6_147_15647.vasp,Sb2Pb2Se6,-1.918950889,0.2721435387083312 -As2P2_1_1243.vasp,As2P2,-3.47728915,0.1513011225000002 -Ca2H8Br4O4_53_3036.vasp,Ca2H8Br4O4,-3.483077606666667,-0.1427543844444443 -Au1Se2_164_1446.vasp,Au1Se2,-0.7242782866666667,0.4957980844444433 -Ru2Br6_191_15303.vasp,Ru2Br6,-0.86063999875,0.5527480775 -Cu2H4C4Br2N2_2_5118.vasp,Cu2H4C4Br2N2,-4.25106238,0.3165639042857037 -K2Mo6O18_10_9245.vasp,K2Mo6O18,-4.870658231538462,0.0759499969230723 -Al1Br2_187_617.vasp,Al1Br2,-1.20055191,0.5448754261111097 -Hf4N3Cl2_164_7794.vasp,Hf4N3Cl2,-6.574324094444445,0.1049520727777704 -Cu2N2Cl2_59_5190.vasp,Cu2N2Cl2,-1.51723727,0.7514419733333313 -Nb2S2N1F2_164_12842.vasp,Nb2S2N1F2,-4.5121500942857145,0.4346552497285612 -Ti4Zn2S10_59_19170.vasp,Ti4Zn2S10,-3.6174060375,0.5274954961249998 -Ga1Co5I2_123_6155.vasp,Ga1Co5I2,-1.1192246875,0.3412005222916648 -B6C2_191_1774.vasp,B6C2,-5.42071208875,1.3550312768749997 -Zn2Sb2S6_147_21147.vasp,Zn2Sb2S6,-1.748363547,0.3920855307374977 -Cd2Pt4S6_164_3535.vasp,Cd2Pt4S6,-1.7101381808333331,0.2803871629166652 -Sn3Bi4_1_16912.vasp,Sn3Bi4,-0.4685814671428571,-1.3192669635714274 -Co2S1Cl1_156_3975.vasp,Co2S1Cl1,-1.6924773,0.3119583381250004 -Ca3I6_5_3181.vasp,Ca3I6,-1.1573785533333334,0.1152327113333331 -Sr3Cu2S4I2_123_17371.vasp,Sr3Cu2S4I2,-1.9457447081818184,-0.0132779351515186 -Al2Ni2S5_187_902.vasp,Al2Ni2S5,-2.5765392222222223,0.1357177657870346 -P1O2_2_13929.vasp,P1O2,-4.67000939,0.7235507823333304 -Cr1Bi1As1_156_4124.vasp,Cr1Bi1As1,-2.1707972533333333,0.2550586408333311 -Cd2Sb2I2O4_11_3554.vasp,Cd2Sb2I2O4,-2.221727017,0.1218991169999998 -La2Ge1I2_164_9592.vasp,La2Ge1I2,-2.769262696,-0.3547607839999998 -Tl2Fe1Se4_156_19413.vasp,Tl2Fe1Se4,-1.1773098885714286,0.6065812283333315 -Li4V2F12_59_10238.vasp,Li4V2F12,-3.4664027383333336,0.1203728861111108 -Sb1Se2_187_15507.vasp,Sb1Se2,-1.9157221433333331,0.43612580722222 -Ga2F6_191_6343.vasp,Ga2F6,-2.79713753375,0.17243699625 -Cs2Hg4S8F6_31_4734.vasp,Cs2Hg4S8F6,-1.040980389,0.4073249398125003 -Bi1Te1S1_1_2401.vasp,Bi1Te1S1,-1.72550395,-0.0648639493055589 -Pb2O6_18_14265.vasp,Pb2O6,-3.15578930625,0.2758984390624999 -Zr1P2S6F2_164_21394.vasp,Zr1P2S6F2,-3.2923384418181816,0.4653145495454509 -Sc2S2F2_59_16133.vasp,Sc2S2F2,-4.412510991666667,-0.0861931980555597 -Sn1P2S6_149_16665.vasp,Sn1P2S6,-3.0428158888888888,-0.0279134377777805 -Ge2Os1_123_6795.vasp,Ge2Os1,-3.65142128,0.5399920216666669 -Cd1H4I2N6_1_3357.vasp,Cd1H4I2N6,-3.736136502307692,-0.0402340901831519 -Si4O8_2_16500.vasp,Si4O8,-6.175373821666667,0.2345390916666661 -Sn6F16_14_16986.vasp,Sn6F16,-2.6327178018181816,0.0747822663636368 -Cs2Cd4Te2S6Br6_31_4703.vasp,Cs2Cd4Te2S6Br6,-0.8385567469999999,0.2560814172916661 -Ni1Br1F1_8_13285.vasp,Ni1Br1F1,-0.7477807833333333,-0.1344580991666667 -Si2As2Se6_2_16384.vasp,Si2As2Se6,-2.822920743,0.135088302791664 -Ag1Au1I4_1_9.vasp,Ag1Au1I4,0.61093094,0.1932289900000003 -K2Te2C2Cl6O6_4_9364.vasp,K2Te2C2Cl6O6,-2.638070748333333,0.6819765471527774 -Mn3Co2Te3O16_1_11372.vasp,Mn3Co2Te3O16,-3.9124963075,0.2537203636718748 -Sc2S2_187_16136.vasp,Sc2S2,-3.76831645,0.1075196649999998 -Y1N2_164_20655.vasp,Y1N2,-5.2262700466666665,1.2789708108333278 -Ni2C4N6_123_13489.vasp,Ni2C4N6,-4.705376196666667,1.848046039305544 -Zr2Sb1S2_164_21659.vasp,Zr2Sb1S2,-4.25353432,-0.1819372882500048 -Ag4S4Cl4F4_2_547.vasp,Ag4S4Cl4F4,-0.918282164375,0.2752449229296875 -Sr1F2_164_17046.vasp,Sr1F2,-3.480434263333333,0.3330824066666671 -Y4Br6_12_20810.vasp,Y4Br6,-3.104260753,0.074066809 -Ni2S4F2_6_13595.vasp,Ni2S4F2,-1.7356265375,0.087028304374998 -P2Au2O4_26_13953.vasp,P2Au2O4,-3.23479771,1.093461384499999 -Au2F2_164_1478.vasp,Au2F2,0.0972584,1.0711706355555546 -Sc2S1Cl1_99_16127.vasp,Sc2S1Cl1,-3.2570542025,0.3727273297916639 -In2Se2I2_31_8582.vasp,In2Se2I2,-1.2405375866666668,0.0819926810416664 -Re2Se2_6_15084.vasp,Re2Se2,-4.4306273875,0.6156978262499999 -Hg2Se2O8_31_8019.vasp,Hg2Se2O8,-2.518132326666666,0.1441079929166643 -In2Fe1Se4_164_8431.vasp,In2Fe1Se4,-2.000341582857143,-0.1877140392857159 -Fe1B2_123_5620.vasp,Fe1B2,-3.4057270966666664,0.9845440575 -K2Cu2Te2_129_9090.vasp,K2Cu2Te2,-0.409171475,0.1431456983333333 -Ag1Sb1As2S6_143_115.vasp,Ag1Sb1As2S6,-2.354092819,0.3232751413124975 -Zn1Cd1Te1Se1_1_20913.vasp,Zn1Cd1Te1Se1,-0.05212043,-0.1368066306249999 -Ag2P2S4_26_350.vasp,Ag2P2S4,-2.144719415,0.2015499590494772 -Tl4N4_127_19610.vasp,Tl4N4,-1.81978133625,0.8409350150000002 -Mo4N4Cl12_2_11752.vasp,Mo4N4Cl12,-2.7706518410000003,-0.0616351104444503 -Ca6Te6O18_4_3258.vasp,Ca6Te6O18,-4.115594310666667,1.8724056893333323 -Hf1V1Se2O1_156_7358.vasp,Hf1V1Se2O1,-4.649007,0.4842475929999973 -Zn4Ge8W4O24_14_21221.vasp,Zn4Ge8W4O24,-4.172573529999999,0.441321571062496 -Bi16I4_10_2308.vasp,Bi16I4,-0.9742239995,-0.5012530628333338 -Ba1H2S2_5_1835.vasp,Ba1H2S2,-3.20576681,0.1385850724999997 -Ge6P6_2_6967.vasp,Ge6P6,-3.623343433333333,-0.5138576283333331 -Ti1Cd1S1I1Cl1_1_18755.vasp,Ti1Cd1S1I1Cl1,-1.976946228,0.056444897166667 -Mg2W2Se2S12_18_10538.vasp,Mg2W2Se2S12,-2.930666777222222,0.1457760207175899 -Mn1I2_115_10769.vasp,Mn1I2,-0.39050595,0.3373658683333333 -Cu3I1Br2O4_1_5373.vasp,Cu3I1Br2O4,-1.202241175,0.5059863889374986 -As8C6_187_1395.vasp,As8C6,-4.078349805714286,1.2350379757142802 -Hg2P2S7_5_7982.vasp,Hg2P2S7,-2.0859598654545453,0.078298523636366 -Sr1Si2_164_17083.vasp,Sr1Si2,-1.576428953333333,1.4369654766666666 -Ba2Ag2_191_1897.vasp,Ba2Ag2,0.4473134525,0.2614572275 -Ag2Te1O4_21_450.vasp,Ag2Te1O4,-2.183288511428571,0.3179505842857146 -Cu3As1O4_156_5370.vasp,Cu3As1O4,-2.3787078075,0.7756810021093749 -Fe2H8C8N16_51_5861.vasp,Fe2H8C8N16,-5.861162090588235,-1.5534765632843217 -Cr3Sb5O16_8_4580.vasp,Cr3Sb5O16,-4.446785779583333,0.1732031565625 -Si3Bi2S9_174_16467.vasp,Si3Bi2S9,-3.082705075,-0.0850897850000031 -Hf3B2Se2F2_187_7685.vasp,Hf3B2Se2F2,-4.542456033333334,0.7719094391666566 -Li1B12_191_9659.vasp,Li1B12,-4.932774831538461,0.8938040051923029 -Zr1As2_187_21247.vasp,Zr1As2,-3.638887033333333,-0.4538740183333338 -Fe2Bi2Sb2S8_26_5811.vasp,Fe2Bi2Sb2S8,-2.3937571692857142,-0.3615459355000021 -Te6Rh2_7_18683.vasp,Te6Rh2,-1.7242599375,0.3313198297222203 -Eu1Cd2P2_164_5587.vasp,Eu1Cd2P2,-1.434278798,0.289767192 -Mn2I4O12_4_11115.vasp,Mn2I4O12,-2.850716777777778,0.1452720144444446 -Sc1As2Au1S6_149_15898.vasp,Sc1As2Au1S6,-2.7465258930000003,0.4930823893437472 -Sb2Pb2O6F2_7_15640.vasp,Sb2Pb2O6F2,-3.6179617625,0.2923379741666663 -Hg1O2F2_164_7887.vasp,Hg1O2F2,-0.815649344,0.7952623080000001 -As4Au2Se3I2_6_1321.vasp,As4Au2Se3I2,-1.392669724545455,0.2934518765909059 -Ag6Sb2S6_7_582.vasp,Ag6Sb2S6,-1.1906265892857142,0.2703095735714287 -Ni2Sb4I4O6_2_13622.vasp,Ni2Sb4I4O6,-2.511040868125,0.212169208828125 -Kr1F2_47_9558.vasp,Kr1F2,0.8138130966666667,0.1730181816666667 -Zr2I8O24_85_21599.vasp,Zr2I8O24,-3.3074759273529413,0.1217694917647058 -Pb2I2O2_59_14250.vasp,Pb2I2O2,-1.958349595,0.2173928330324064 -Pd2Cl6_191_14419.vasp,Pd2Cl6,-0.29285672,0.4192151766666658 -Yb1Bi2_25_20852.vasp,Yb1Bi2,-1.5244130166666665,0.5122064816666667 -Hg2Bi2S4F2_11_7940.vasp,Hg2Bi2S4F2,-1.324672257,0.4091762668333298 -Cr1S1N1Cl1_6_4243.vasp,Cr1S1N1Cl1,-3.54860659,-0.2624731593749996 -Ge2Te6P2_147_6895.vasp,Ge2Te6P2,-2.148492643,-0.1252826133333348 -Gd1C2_123_6595.vasp,Gd1C2,-5.622525863333333,0.7942782912499999 -In1Ni1Au2I4O4_8_8281.vasp,In1Ni1Au2I4O4,-1.2071916958333333,0.1642740978541614 -Rb4Hg2I8_11_14974.vasp,Rb4Hg2I8,0.0551740235714285,0.1525980907142857 -Tl1Br1O3_156_19227.vasp,Tl1Br1O3,-1.908169884,0.4507310414999967 -Te1Mo3N1O9_143_18312.vasp,Te1Mo3N1O9,-4.668316013571428,0.2687253793712758 -Fe1Bi1O3_99_5631.vasp,Fe1Bi1O3,-2.924515008,0.9065673802500004 -Li1Al1Cl4O12_2_9640.vasp,Li1Al1Cl4O12,-2.933874046666667,0.2033593014444388 -Cr1Br2_187_4133.vasp,Cr1Br2,-1.2886496133333334,0.1881275355555541 -Hf3C2F2_187_7693.vasp,Hf3C2F2,-6.628369932857143,0.1237936614999938 -Nb4Ni8S8_51_13109.vasp,Nb4Ni8S8,-2.6136293375,2.2168263211666623 -Ta1Se2_187_17622.vasp,Ta1Se2,-4.566057206666667,0.1290219349999999 -Co2Te2_129_4038.vasp,Co2Te2,-1.4401541325,0.2116481208333334 -Ir2Br6_162_8769.vasp,Ir2Br6,-1.20775910375,0.07607664125 -In3I1Br1O3_8_8648.vasp,In3I1Br1O3,-2.56098508375,0.2580455930468712 -Hg2Se2F2_59_8017.vasp,Hg2Se2F2,-0.2162903733333333,0.1613545104166651 -Li6Sb2S6_147_10273.vasp,Li6Sb2S6,-2.98535197,0.0004816192857117 -Y1F2_123_20629.vasp,Y1F2,-4.396274256666667,0.6974159505555504 -Cr1W3S8_25_4287.vasp,Cr1W3S8,-4.28514586,-0.0647935708333333 -Ni1B6H4C2F2_25_13279.vasp,Ni1B6H4C2F2,-3.929359284,1.001183366616441 -Na1C12_191_11832.vasp,Na1C12,-7.488726537692307,0.0281318207692301 -Hf1Sn3O7F1_1_7312.vasp,Hf1Sn3O7F1,-4.681079420833333,0.319442272916655 -Sr2Sn4F12_2_17319.vasp,Sr2Sn4F12,-3.008219041111111,0.0538059394444419 -Li2Fe1P4O12_2_9901.vasp,Li2Fe1P4O12,-5.205708175263157,0.187220145842101 -Ti3H2C2Se2_1_19082.vasp,Ti3H2C2Se2,-5.476031308888889,0.2003748392222126 -Mn2S4_59_11226.vasp,Mn2S4,-2.79361539,0.5672292875 -Yb1P2_25_20857.vasp,Yb1P2,-3.66032507,0.8281578399999954 -Os2Se2I2_59_13883.vasp,Os2Se2I2,-2.247800428333333,0.3788278639583293 -Ga18Te9_143_6108.vasp,Ga18Te9,-1.528136264074074,0.12563020648148 -Fe2Te4As2F2_26_6011.vasp,Fe2Te4As2F2,-1.7935715040000002,0.3622104413888848 -Co2H2O2_59_3908.vasp,Co2H2O2,-3.416945743333333,0.2914544395370337 -V1Sb1As1_156_19920.vasp,V1Sb1As1,-2.821400856666666,0.5109883730555486 -Li2S4I2F8_2_10059.vasp,Li2S4I2F8,-1.764194815625,0.3445725650195314 -Nb4Fe4Te8_53_13074.vasp,Nb4Fe4Te8,-2.49628384625,0.5903737395833333 -Sr3Sn1_25_17401.vasp,Sr3Sn1,0.18337499,0.8054373956249999 -Ga2O4_12_6422.vasp,Ga2O4,-3.772965726666667,0.1766318204166626 -Ru2F8_14_15318.vasp,Ru2F8,-2.2535093,0.027173952 -B4O6_164_1759.vasp,B4O6,-6.359124001,0.4952103743333342 -Re2S4_11_15079.vasp,Re2S4,-4.7745676816666665,0.1655031425000004 -Ag2B2Br2O2_31_177.vasp,Ag2B2Br2O2,-2.49486891125,0.8360551765755146 -Ga6Se6_2_6586.vasp,Ga6Se6,-2.3421953058333336,0.0752622016666664 -Tl2I2O2_59_19433.vasp,Tl2I2O2,-1.4165949433333334,0.374741446666665 -V6S18_11_20394.vasp,V6S18,-3.45951900375,0.0543247409374965 -Ta3Br8_156_17947.vasp,Ta3Br8,-2.809201360909091,0.1258007959374976 -Ca4Mn2S6I2_129_3226.vasp,Ca4Mn2S6I2,-2.5788429192857145,0.0418178288571402 -Si1Te2_115_16376.vasp,Si1Te2,-2.14532729,0.2255402683333334 -Sb2Te2H2S10_4_15715.vasp,Sb2Te2H2S10,-2.363714713125,0.2966887723177086 -Ge6Sb6_2_6970.vasp,Ge6Sb6,-2.61926054,-0.3909891912500001 -Al1F2_115_653.vasp,Al1F2,-3.10173443,0.7184228572222187 -Sr2Sn4H12_2_17320.vasp,Sr2Sn4H12,-2.429394206111111,0.0136737374999978 -Mn1Co1Br4_1_10668.vasp,Mn1Co1Br4,-0.8031682716666667,0.347597032083332 -Y14C6I12O2_51_20600.vasp,Y14C6I12O2,-4.50942502382353,0.0351707614705878 -Co1Cl2_164_3729.vasp,Co1Cl2,-1.257297186666667,-0.1436389849999999 -Nb1C1Se1Br1_8_12485.vasp,Nb1C1Se1Br1,-4.164225205,0.6254558551785624 -Nd2Br2O2_129_13233.vasp,Nd2Br2O2,-4.8095131916666665,0.0718722449999997 -Pb1F2_187_14184.vasp,Pb1F2,-2.3194983566666667,0.3661570566666663 -Cu1H1O2_10_4890.vasp,Cu1H1O2,-2.924924445,0.345944483072917 -Al2Cl2_13_792.vasp,Al2Cl2,-2.0960301275,0.2349699966666645 -Hg2Bi2S4Cl2_11_7939.vasp,Hg2Bi2S4Cl2,-1.096356334,0.2030935125000002 -In1Br1_99_8210.vasp,In1Br1,-0.396976745,0.92588963 -Ti1Br2_164_18750.vasp,Ti1Br2,-2.9967199033333336,0.1818293533333332 -Ba2Au1Se2Br2_38_1911.vasp,Ba2Au1Se2Br2,-1.75658649,0.2341211533482105 -Ag2Sb2S6_2_402.vasp,Ag2Sb2S6,-1.691801668,0.3807294798749975 -As2S3_164_1294.vasp,As2S3,-2.946793098,0.5727018305000002 -Cs2I2O6_11_4751.vasp,Cs2I2O6,-2.527338026,0.4215403200000001 -Zr2S2_187_21652.vasp,Zr2S2,-4.2055156225,0.4636754024999998 -Ta4Br16_14_18010.vasp,Ta4Br16,-2.10519364,0.2945836344375001 -Ni2As2S6_2_13450.vasp,Ni2As2S6,-2.12057403,0.4835513085624982 -K2P2H4O4_13_9288.vasp,K2P2H4O4,-4.021149440833333,0.1831634722453672 -Sn2Te2_12_16895.vasp,Sn2Te2,-1.2540453225,-1.2183173424999998 -Na2Sr2_11_12308.vasp,Na2Sr2,0.5679264125,0.6274641143749999 -Ba2Au1S2Cl2_38_1908.vasp,Ba2Au1S2Cl2,-2.1839275085714287,0.2217564817633873 -Ti3Se2_123_19105.vasp,Ti3Se2,-5.31412272,-0.0264590145555656 -Sc4H2C3_164_16241.vasp,Sc4H2C3,-4.886038843333334,0.184881628566303 -P2Se1S2_5_14047.vasp,P2Se1S2,-3.015913316,0.2007300547023753 -K1Al1P4H4O14_2_8878.vasp,K1Al1P4H4O14,-5.236513957083333,0.0558999308333341 -Bi2Te1Se2_164_2555.vasp,Bi2Te1Se2,-1.817883638,0.1159241959999999 -Zn2P4H16O20_4_21133.vasp,Zn2P4H16O20,-4.549960348571428,0.0531786649900711 -H3Pd1_187_7048.vasp,H3Pd1,-1.99666794,1.8538587425 -H2Rh1O2_164_7023.vasp,H2Rh1O2,-3.681002284,0.4628671754444406 -P4H16C4O8_14_14080.vasp,P4H16C4O8,-4.7671640971875,0.10531423593749 -Cd1H4C2Br2N4_10_3344.vasp,Cd1H4C2Br2N4,-4.163268726153846,0.2063768163247794 -Zn1In2Se4_156_20968.vasp,Zn1In2Se4,-1.5460370228571427,0.1461207642857145 -Ni1Se2_164_13423.vasp,Ni1Se2,-1.23989235,0.2438631633333332 -Sb2Te1O2_1_15706.vasp,Sb2Te1O2,-3.02892542,0.4248367829999975 -Er6I7_12_5583.vasp,Er6I7,-1.6029115669230771,0.1497186191025625 -Co1Re2S8_2_3814.vasp,Co1Re2S8,-3.556628978181818,0.4746491249242391 -Ga1Ni2Se3Br4_1_6218.vasp,Ga1Ni2Se3Br4,-0.922298984,0.2002933139999985 -Nb4Te14Pt2_11_13169.vasp,Nb4Te14Pt2,-2.636643639,0.0936469893333304 -Ge2S2Cl2_59_6823.vasp,Ge2S2Cl2,-2.3974931466666667,0.1648629871875 -Pd2S2I1Br1_1_14461.vasp,Pd2S2I1Br1,-1.093144285,0.2860293770833334 -Hf1Pd1F6_149_7264.vasp,Hf1Pd1F6,-3.40937239,0.03822051625 -Fe2Cl2O2_59_5835.vasp,Fe2Cl2O2,-2.626641715,-0.0437668634722245 -Sc2O2_10_16115.vasp,Sc2O2,-5.144950565,0.7457576829687498 -Mg1Si2_164_10404.vasp,Mg1Si2,-2.264736453333333,-0.2681573533333332 -Ca2Ag1Se2Cl2_38_2913.vasp,Ca2Ag1Se2Cl2,-1.5866225714285715,0.1361537135714252 -Ag1P2_10_96.vasp,Ag1P2,-1.98322154,0.5142506719696955 -Tl2Te2Cl2_59_19546.vasp,Tl2Te2Cl2,-0.83047821,0.3117822488888878 -Zn1Te1_123_21020.vasp,Zn1Te1,0.515431095,0.638111955 -As1S1I1_156_1170.vasp,As1S1I1,-1.6962375133333334,0.3233922524999999 -Mn2Nb1Te1Se1I2_6_11161.vasp,Mn2Nb1Te1Se1I2,-2.020446052857143,0.2459246854936351 -Hg4Se4O12_14_8089.vasp,Hg4Se4O12,-2.440736115,0.0813142209999999 -Ag2Te2I2_59_458.vasp,Ag2Te2I2,-0.0069545833333333,0.2853251322222219 -Tl1In1Se2_8_19302.vasp,Tl1In1Se2,-1.423044835,0.29433950625 -Bi2Te2Br2_59_2556.vasp,Bi2Te2Br2,-1.19908515,0.18437593 -Mn1Zn2C6N6_2_10947.vasp,Mn1Zn2C6N6,-5.585959783333333,0.4916513373333193 -Na2P30_2_12260.vasp,Na2P30,-3.907122280625,0.0088598677343751 -Sr4Ni2Cl2O6_129_17454.vasp,Sr4Ni2Cl2O6,-3.361109301428572,-0.2608006748809615 -Ag1Bi1Sb2Te6_143_27.vasp,Ag1Bi1Sb2Te6,-1.164289348,0.3008177489166648 -K4Au4S20_49_9413.vasp,K4Au4S20,-1.7983615153571428,0.1735891414285713 -Zn1Te1Mo1O6_3_21018.vasp,Zn1Te1Mo1O6,-3.827937755555556,0.1912951024536995 -P2W2S6_12_14060.vasp,P2W2S6,-3.749996726,0.3390725768593725 -Mn1Te2Ir1_8_10907.vasp,Mn1Te2Ir1,-1.9290790475,0.4436615606250002 -Ca3Co2S5Cl2_123_3164.vasp,Ca3Co2S5Cl2,-2.569777935833333,0.1771085257291639 -Y1Ge1S2Br1Cl1_1_20633.vasp,Y1Ge1S2Br1Cl1,-3.3057265716666664,0.0185306420312444 -In1Cu1P2Se6_149_8230.vasp,In1Cu1P2Se6,-2.1834152060000003,0.1194756935416642 -Zr2Te4P2Se1S1_1_21716.vasp,Zr2Te4P2Se1S1,-3.070953496,0.3583471358749989 -Rb2Cd4S6Cl6O2_31_14811.vasp,Rb2Cd4S6Cl6O2,-1.1644658375,0.4493639681093722 -Li2Sb4F14_26_10066.vasp,Li2Sb4F14,-2.921297001,0.2336505385000002 -Al2Co1Se4_164_800.vasp,Al2Co1Se4,-2.6931808642857145,0.0309862620952336 -B1_191_1646.vasp,B1,-5.23243617,0.9285491283333336 -Te2Au2Br2_59_18365.vasp,Te2Au2Br2,-0.1080550383333333,0.2531588833333333 -Au2Se4_6_1559.vasp,Au2Se4,-0.80648759,0.41358878111111 -Ba1F2_164_1829.vasp,Ba1F2,-3.5077750566666666,0.3644356966666664 -Cs2I2_129_4752.vasp,Cs2I2,-0.455425655,0.273963245 -Y2C1Br2_164_20707.vasp,Y2C1Br2,-4.606893276,0.0398179519999999 -Nb2Cl6_189_12686.vasp,Nb2Cl6,-2.81224789125,0.218325012343747 -B2S2_12_1701.vasp,B2S2,-4.60631387,0.1973709024999994 -Te2N2_129_18415.vasp,Te2N2,-3.0522596625,0.5005085270833335 -Sr4Fe2I2O6_129_17435.vasp,Sr4Fe2I2O6,-3.4874908764285717,0.0164068900000002 -Li4Sb4O8_29_10224.vasp,Li4Sb4O8,-4.275242666875,0.1303983521875 -Ca1S2F2_12_2872.vasp,Ca1S2F2,-2.250571334,1.1028315637500004 -Sn2F8_1_16769.vasp,Sn2F8,-2.481947126,0.0731511059999996 -Cs2Hg4Se2O6F6_31_4738.vasp,Cs2Hg4Se2O6F6,-1.6389662829999998,0.1955121574999978 -Tl4Sb4_127_19624.vasp,Tl4Sb4,-0.30354517875,0.951925890625 -Y2I6_162_20748.vasp,Y2I6,-2.09538648375,0.081140135 -Ca2Cd1_123_2974.vasp,Ca2Cd1,1.1422741666666667,0.4234668788888895 -P2I10_51_13985.vasp,P2I10,-0.13646882,0.2789826983333333 -Sc2C1O2_164_16054.vasp,Sc2C1O2,-5.666728372,0.8280736915666607 -Cr1I2_164_4201.vasp,Cr1I2,-1.09336071,0.0664038955555543 -Ta4Te14Pd2_11_18127.vasp,Ta4Te14Pd2,-2.7542710315,0.0829313676666643 -Hf2O2_129_7546.vasp,Hf2O2,-6.14215593,1.164645845681811 -Ca8Sn4_1_3262.vasp,Ca8Sn4,-0.3571996741666667,0.4958566808333333 -I8Cl8O8F8_14_8167.vasp,I8Cl8O8F8,-1.3814159415625,0.0246879134374999 -Co1Sn2C6N6_1_3827.vasp,Co1Sn2C6N6,-5.868312412666667,0.1281330513333267 -Zn1Ga2Se4_156_20939.vasp,Zn1Ga2Se4,-1.7983779557142856,0.1877071042857145 -In2Te2I2_59_8623.vasp,In2Te2I2,-0.8687583716666666,0.1087761541666667 -Cd1Ge1S1I1Cl1_1_3313.vasp,Cd1Ge1S1I1Cl1,-1.1836779119999998,-0.3285530933333331 -Ti1As2_164_18738.vasp,Ti1As2,-4.382771193333333,-0.772069279583333 -Hf1As2H2O6_164_7105.vasp,Hf1As2H2O6,-5.018561427272728,0.3184661355302927 -Nb3Pt3S14_6_12995.vasp,Nb3Pt3S14,-3.6197897615,0.11132219768749 -Tb2Ga2I2_164_18195.vasp,Tb2Ga2I2,-2.1774917016666664,0.0060858746666647 -In3Te1Cl1_1_8659.vasp,In3Te1Cl1,-1.039429992,0.5794011213749974 -Cd1Pb1S1I2_1_3388.vasp,Cd1Pb1S1I2,-0.621220728,0.1076482161666667 -Ti1Ni1Te2P2Se1S3_1_18816.vasp,Ti1Ni1Te2P2Se1S3,-2.886361665,0.3509232759499929 -Nb2C2_164_12671.vasp,Nb2C2,-6.8244541475,0.9276927841666592 -Cu2S1O4_21_5239.vasp,Cu2S1O4,-2.979372577142857,0.3590235160714274 -Pt2S2_164_14665.vasp,Pt2S2,-1.9658255925,0.6492555674999998 -Ca1B2H2_164_2805.vasp,Ca1B2H2,-2.29636479,1.8108640721428535 -As1I2_164_1150.vasp,As1I2,-0.5723905533333333,0.3938052677777768 -Sn2Sb2S6_7_16868.vasp,Sn2Sb2S6,-2.515229534,0.1634735902499953 -Ni2Te2S6_11_13665.vasp,Ni2Te2S6,-1.842676427,0.1014240384583316 -Bi6Se4Cl2O16_59_2680.vasp,Bi6Se4Cl2O16,-3.222539504642857,0.4026210068749967 -K2S2N4O4F10_11_9331.vasp,K2S2N4O4F10,-3.073629828181818,0.0007695996212049 -Au1F1_156_1422.vasp,Au1F1,0.44625142,1.4201636555555546 -Zn2S2Br1Cl1_1_21142.vasp,Zn2S2Br1Cl1,-0.8992477066666668,0.1325124843645811 -Al2Co2Se5_156_807.vasp,Al2Co2Se5,-2.5167766088888888,0.0804695932592546 -K2Ir2N2Cl10O4_31_9209.vasp,K2Ir2N2Cl10O4,-2.1437155765,0.2872707361249999 -Ti1Pd1Se1S1_156_18830.vasp,Ti1Pd1Se1S1,-3.584557755,0.1371315236334028 -Li2Fe6O4F12_31_9920.vasp,Li2Fe6O4F12,-2.7164836620833337,0.3361711907291629 -Ti1H2_187_18790.vasp,Ti1H2,-4.23930832,0.4689934899999999 -Tm1P2_21_19667.vasp,Tm1P2,-3.1781110233333334,0.9392933583333296 -Te2Pb2_164_18457.vasp,Te2Pb2,-1.189463625,-1.2502308 -Cs2Os2N2O2F10_11_4761.vasp,Cs2Os2N2O2F10,-3.277635468333333,-0.2023221816161748 -Na6H2Se2S8_11_12441.vasp,Na6H2Se2S8,-2.35811517,0.1320069701388844 -Al2Te2F2_31_1001.vasp,Al2Te2F2,-2.8231305916666667,0.1829980562499971 -Ca2Si1O4_8_3122.vasp,Ca2Si1O4,-4.306889988571428,1.2533470585714284 -Ge4Te4_53_6952.vasp,Ge4Te4,-2.1983072,-0.7350658749999999 -Ti1S2I2_5_18837.vasp,Ti1S2I2,-2.715790654,0.2092901667499997 -Co2Sb1Te2_187_3994.vasp,Co2Sb1Te2,-1.830817756,0.1641622956666646 -Ta1Nb3S4Cl4_6_17584.vasp,Ta1Nb3S4Cl4,-4.297041460833333,0.0958147274007881 -Tl1As2Au1S6_149_19216.vasp,Tl1As2Au1S6,-2.018095838,0.5084271136249976 -H18Pb2C10S2N2O4_4_6981.vasp,H18Pb2C10S2N2O4,-4.958658523157895,-0.0496287257894805 -Li2Fe2B2O8_11_9904.vasp,Li2Fe2B2O8,-4.909727664285714,0.1336815897703997 -Ba2Cl4_51_1952.vasp,Ba2Cl4,-2.26778287,0.4564125133333334 -Hg3N2_191_8062.vasp,Hg3N2,-0.187105926,0.5535170072758622 -Cu1W1Se1Br3Cl2_1_5002.vasp,Cu1W1Se1Br3Cl2,-1.4318947275,0.0410093338602898 -Hf4Te4Cl4_31_7822.vasp,Hf4Te4Cl4,-3.4638473116666666,0.1383292114583301 -Li2V2F6_11_10121.vasp,Li2V2F6,-3.426236396,0.1337220899999965 -Bi2Te2I2_59_2559.vasp,Bi2Te2I2,-0.9733797766666666,0.1855742633333333 -Ta4N3F2_164_18060.vasp,Ta4N3F2,-6.917384045555555,0.5913185059999864 -Co1B6Pb2C6_1_3706.vasp,Co1B6Pb2C6,-5.1308442586666665,0.9833218047222104 -In1Se1_156_8343.vasp,In1Se1,-1.274804035,0.6286113275 -Bi1Te1F1_156_2399.vasp,Bi1Te1F1,-1.87577639,0.3262228469444422 -Ti6H4O14_2_19176.vasp,Ti6H4O14,-6.407744549166666,0.1166991475694452 -Sn2B2As2H6S6_7_16734.vasp,Sn2B2As2H6S6,-3.1405175877777776,0.4447695388888855 -Mn2H2C1O2_164_11088.vasp,Mn2H2C1O2,-4.3506278485714285,0.5408889414285669 -Sn2Br2_164_16747.vasp,Sn2Br2,-0.8236686875,-0.6002808699999999 -W2Se2_187_20548.vasp,W2Se2,-3.8418260525,0.4561460175 -Ba1Cu2S8_89_1827.vasp,Ba1Cu2S8,-2.0911583845454547,0.2263295976515104 -P1F3_187_13919.vasp,P1F3,-2.45219804,0.8790029125000003 -Ho2Br2O2_59_8126.vasp,Ho2Br2O2,-4.722710565,0.1237872933333337 -In2Pt1I1Cl1O3_1_8532.vasp,In2Pt1I1Cl1O3,-2.26763337375,0.5659830868750002 -Ba4Se4_11_2188.vasp,Ba4Se4,-2.403314,0.56512729671875 -Fe2Te2Br2_59_5994.vasp,Fe2Te2Br2,-1.0200365166666667,0.2216443516666666 -Ti2Se2_129_19024.vasp,Ti2Se2,-4.730437865,-0.3653582399999999 -Te6P1Pb2_157_18662.vasp,Te6P1Pb2,-1.3640950666666667,-0.2429761431481492 -Sm2Te6_129_16590.vasp,Sm2Te6,-2.506038775,0.0547838999999998 -Nb1Sb1Te1Mo3I1Br1_1_12568.vasp,Nb1Sb1Te1Mo3I1Br1,-2.4835508275,0.8214511650446396 -Cr2B1S2F2_164_4323.vasp,Cr2B1S2F2,-3.0174766414285714,0.6332500973214208 -Sr2C2Cl2O6_59_17159.vasp,Sr2C2Cl2O6,-4.644735933333333,0.2543705845833315 -Yb2H4I6O20_2_20876.vasp,Yb2H4I6O20,-3.47706477625,0.0250564308723959 -Ta2As2O8_26_17647.vasp,Ta2As2O8,-5.911623039999999,0.2969238478395031 -Mn6Se8O24_2_11472.vasp,Mn6Se8O24,-3.8853359286842095,0.027426633070168 -Hg1H1S1Br1_156_7862.vasp,Hg1H1S1Br1,-0.955394485,0.0724678362499983 -Ta9Se18_12_18166.vasp,Ta9Se18,-4.557771085925926,0.1373080557407409 -K1S2_115_8933.vasp,K1S2,-1.0653593133333332,1.0210425833333314 -Cr2W2S8_25_4539.vasp,Cr2W2S8,-3.9890827766666663,-0.0209768483333334 -Zn2As4S6I4_31_21037.vasp,Zn2As4S6I4,-1.602562100625,0.210075247374999 -Be1As2H4O4_1_2211.vasp,Be1As2H4O4,-4.093394417272728,0.4572268207575658 -Au2Se2_10_1546.vasp,Au2Se2,-0.49658979,0.17953049 -Cd3C2O6_38_3611.vasp,Cd3C2O6,-3.4279544618181816,0.4254452263636387 -Sn2P2S6F2_7_16820.vasp,Sn2P2S6F2,-2.9065410491666666,0.1051183786111056 -Ge2B2Sb2H6O6_7_6749.vasp,Ge2B2Sb2H6O6,-4.076186104444444,0.4952682738888844 -In2Br2_164_8388.vasp,In2Br2,-0.9395905275,0.3832758475 -Rb2H6C2Se2S6_4_14853.vasp,Rb2H6C2Se2S6,-3.177265095555556,0.1773065381134131 -As4Se4I4_14_1370.vasp,As4Se4I4,-1.7143152291666668,0.0630411008333331 -Bi2I10_51_2461.vasp,Bi2I10,0.1764608275,0.3758731889583331 -As2Pb2O6_147_1255.vasp,As2Pb2O6,-3.775276192,0.3901490625000003 -B6Se6_2_1788.vasp,B6Se6,-4.151470890833333,0.023513891666667 -Os1I2_25_13806.vasp,Os1I2,-1.3048388766666668,0.4037964479166651 -P8Se10_7_14158.vasp,P8Se10,-2.818098858888889,0.1662869756481454 -Sb2F6_189_15578.vasp,Sb2F6,-2.51753890625,0.5985945087500002 -Sn4P4S12_7_16949.vasp,Sn4P4S12,-2.953922872,0.1045031789999999 -Sr2Co1_123_17190.vasp,Sr2Co1,0.4386168066666667,1.2092799766666662 -Ta4B3H2O2_164_18003.vasp,Ta4B3H2O2,-6.45456122,0.654397964727262 -Te2Pd2Br2_59_18465.vasp,Te2Pd2Br2,-0.9768551016666668,-0.1128222208333333 -Mo2N2F2_59_11638.vasp,Mo2N2F2,-4.54478227,0.0345621697222187 -K4V2P4O16_100_9526.vasp,K4V2P4O16,-4.897150898846154,0.1762681680769224 -Nb1Cu1Se3Br2_1_12500.vasp,Nb1Cu1Se3Br2,-2.094169844285714,0.166095390052906 -Sb2Te2O1_1_15720.vasp,Sb2Te2O1,-2.402901082,0.2471328564999977 -Ba3Mn2Br2O5_123_2113.vasp,Ba3Mn2Br2O5,-3.8410411441666663,0.0825297600514743 -V3H2C2S2_6_20263.vasp,V3H2C2S2,-4.502684322222223,0.0604851306481322 -Y1Hg1Cl2O2_1_20639.vasp,Y1Hg1Cl2O2,-2.9890015183333336,0.2958479783333327 -Hf1Fe1F6_1_7159.vasp,Hf1Fe1F6,-3.94555069625,0.1257915899999999 -Hf1Zr2S2Br4_6_7411.vasp,Hf1Zr2S2Br4,-3.5444482833333333,-0.0414827500000032 -V3N2F2_187_20281.vasp,V3N2F2,-4.999739262857142,-0.0537121993650872 -P2Pb1Se4_164_14003.vasp,P2Pb1Se4,-2.4628453142857145,0.221107538839283 -Ta4O10_4_18075.vasp,Ta4O10,-6.896307650714285,0.3492767450000009 -Te5As2Pd2_8_18636.vasp,Te5As2Pd2,-1.5985459422222223,0.2844563085555532 -In2Br2N2_59_8386.vasp,In2Br2N2,-2.3650081716666667,0.361486285833331 -Li4Zn2Br8_11_10251.vasp,Li4Zn2Br8,-1.3413794592857144,0.0798161366071416 -As4O14_4_1331.vasp,As4O14,-3.732073548888889,0.4437684463888843 -B2W3O2_187_1722.vasp,B2W3O2,-5.967734031428571,0.7956325011111056 -Zr3Sc2Ga1S3I1Cl5_1_21784.vasp,Zr3Sc2Ga1S3I1Cl5,-3.342557092,0.1235859262222087 -Er2Ni2Ge4_129_5564.vasp,Er2Ni2Ge4,-2.28505411875,0.3984342106249996 -Zr1V1I2N2_25_21486.vasp,Zr1V1I2N2,-4.433823605,0.0509230757870304 -Cd2Ag2Te2Br2_26_3449.vasp,Cd2Ag2Te2Br2,0.2063819525,-0.0211625328124999 -Ta1Cr1Cu1S2I1Br1N1_1_17531.vasp,Ta1Cr1Cu1S2I1Br1N1,-3.21085682125,0.1433536591166593 -Tm4Te10_99_19693.vasp,Tm4Te10,-2.136786107142857,-0.2250136619047662 -Ni1H2_115_13327.vasp,Ni1H2,-1.5702522866666666,1.6479046283333307 -Ni2P4S6Br4_11_13569.vasp,Ni2P4S6Br4,-2.07347666,0.1876818126504583 -Mn2Zn2Se6_1_11348.vasp,Mn2Zn2Se6,-1.42516675,0.231848759499998 -In1S2O8_150_8329.vasp,In1S2O8,-4.121835710909091,0.1452359000568105 -Tl1Ni5I2_123_19308.vasp,Tl1Ni5I2,0.6253986225,3.78083103125 -Sb4Cl12_14_15774.vasp,Sb4Cl12,-1.45740407125,0.0618377537499998 -K2Ni2As2_129_9267.vasp,K2Ni2As2,-0.7236369283333333,0.553717466666662 -Fe2As2_129_5790.vasp,Fe2As2,-1.4153465425,0.4832499075000001 -Zr2Pb2F12_67_21631.vasp,Zr2Pb2F12,-3.745595011875,0.0687234231250002 -Tm2Sb2S4O2_129_19685.vasp,Tm2Sb2S4O2,-4.335643723,0.1192564080000004 -Hg2Te6Pd4_164_8042.vasp,Hg2Te6Pd4,-0.5835549691666667,0.2661440775 -Mn1Tl2S4_156_10916.vasp,Mn1Tl2S4,-1.9006592357142855,0.4516020152678525 -As1W1Br4Cl2_5_1182.vasp,As1W1Br4Cl2,-1.45612067375,0.3147778123958305 -K2Cd4S6Br6O2_31_9050.vasp,K2Cd4S6Br6O2,-1.0046958395,0.4241360094374974 -Sr1Sb1S1I1Br1O1_1_17078.vasp,Sr1Sb1S1I1Br1O1,-2.311149495,0.1163456494444367 -Ni2Sb4Br4O6_2_13620.vasp,Ni2Sb4Br4O6,-2.757624379375,0.2012879471874953 -Sb4P6H6O18_2_15801.vasp,Sb4P6H6O18,-4.774507669999999,0.1634475938602873 -Ca2N4Cl4_28_3073.vasp,Ca2N4Cl4,-2.23593375,1.3145051820000004 -Mg1Al2S3_156_10332.vasp,Mg1Al2S3,-3.005505715,0.2622735938888852 -Ru2S4_11_15347.vasp,Ru2S4,-3.4138419483333333,0.20090158 -C60_47_2774.vasp,C60,-7.7109449015,0.4053805085000004 -Li1Mo2Br6O2_47_9749.vasp,Li1Mo2Br6O2,-2.3759662827272727,0.0518042331818136 -K2Pd1S2_47_9299.vasp,K2Pd1S2,-1.047640028,0.6608980200000001 -Nb2Co4Se2S2_51_12697.vasp,Nb2Co4Se2S2,-3.352599508,0.1447279139166641 -Ag2B2F8_26_178.vasp,Ag2B2F8,-3.0086219625,0.112817587916667 -Al2Cd2Cl8_2_788.vasp,Al2Cd2Cl8,-1.3931280433333333,0.0433600433333334 -S2N2_8_15385.vasp,S2N2,-3.757903115,0.3179145959375002 -Na1Ge1S2_1_11872.vasp,Na1Ge1S2,-2.69288171,0.1828221334374999 -Au2F4_14_1481.vasp,Au2F4,-0.3660537083333333,0.4333850424074066 -Ta2Si2Sb2_129_17886.vasp,Ta2Si2Sb2,-4.760925935,0.3116650235317344 -Bi4Mo2S12_4_2616.vasp,Bi4Mo2S12,-2.5991006794444447,-0.2453951084027803 -Mg1H2S2_1_10371.vasp,Mg1H2S2,-3.003389034,-0.2425578064999999 -Ag2Cl2O4_67_243.vasp,Ag2Cl2O4,-1.21288588375,0.530355478125 -Ga2Bi1S1Br2_1_6305.vasp,Ga2Bi1S1Br2,-1.59005756,0.0930226687499987 -P2Se2O1_5_14049.vasp,P2Se2O1,-3.348735334,0.3371705988666619 -As1S2_115_1171.vasp,As1S2,-2.53927711,0.8299494636458302 -Ga2S2F2_59_6442.vasp,Ga2S2F2,-2.738666403333333,0.2039875488888862 -Sc4S2N3F2_164_16254.vasp,Sc4S2N3F2,-4.779224218181818,0.3322407676515058 -Cr1Te1Os1Br1N1_6_4272.vasp,Cr1Te1Os1Br1N1,-3.121264706,0.3190175804999918 -Sb12Cl12O12_14_15415.vasp,Sb12Cl12O12,-3.032566128888889,0.0987404933333331 -Nb13Te26_2_12461.vasp,Nb13Te26,-3.302465362051282,0.0864549990598289 -Si1C1_187_16325.vasp,Si1C1,-5.82705164,0.6627508841666669 -K2Os2N2Cl8O4_31_9281.vasp,K2Os2N2Cl8O4,-2.753948957222222,0.1115664397222196 -Hf2S2Br1Cl1_25_7565.vasp,Hf2S2Br1Cl1,-4.369218758333333,-0.0044577705208417 -Cr1Sb1As1S1I1Br1_1_4251.vasp,Cr1Sb1As1S1I1Br1,-1.8812137933333333,0.0079782702777755 -In2As2S6_147_8374.vasp,In2As2S6,-2.637464514,0.38460314175 -Mn1Ge1S2Br1_1_10739.vasp,Mn1Ge1S2Br1,-2.460707068,-0.1671943059999998 -Te2Mo2Se2_6_18409.vasp,Te2Mo2Se2,-2.218788498333333,0.3593652383333334 -Co1Br2O8_147_3708.vasp,Co1Br2O8,-2.312406130909091,0.4343809198106039 -Co3Si1Te2_187_4072.vasp,Co3Si1Te2,-2.195207995,0.0424222330555557 -Sb2F2_12_15574.vasp,Sb2F2,-2.1255566375,0.7130546633333311 -In1Se2_115_8344.vasp,In1Se2,-1.66243432,0.3758316272222202 -Na2Sn1H6S6_147_12302.vasp,Na2Sn1H6S6,-2.873917622,0.0437434856666668 -Bi1Te2H1O6_1_2403.vasp,Bi1Te2H1O6,-3.763540029,0.1128887331666671 -P4Pb6O16_13_14098.vasp,P4Pb6O16,-4.777695752692308,-0.1537393906730798 -Mn1Cd1Se1S2Cl2_1_10662.vasp,Mn1Cd1Se1S2Cl2,-1.4378765357142858,0.5055099851190437 -Co2P2Se6_162_3966.vasp,Co2P2Se6,-2.495763079,0.3225565293333312 -Hf2H2_164_7506.vasp,Hf2H2,-4.5914375075,0.6161087924999995 -Sc2Se2_115_16162.vasp,Sc2Se2,-3.1867201725,0.6052347450000002 -Hf4B3O2_164_7766.vasp,Hf4B3O2,-6.670490527777778,0.1168013229545383 -Ti3H2C2O2_187_19079.vasp,Ti3H2C2O2,-6.5954527488888886,-0.0056114924691481 -In1Au1S1Br2_1_8196.vasp,In1Au1S1Br2,-0.8354308420000001,0.1996404546666648 -Mo3N2O2_187_11713.vasp,Mo3N2O2,-5.232936081428571,0.314336297857138 -Bi1B1_187_2317.vasp,Bi1B1,-2.254668655,1.0592579916666665 -Hf1Sc1Nb1H1O6_1_7299.vasp,Hf1Sc1Nb1H1O6,-6.426577517,0.4941475830000011 -Al2Se4_12_975.vasp,Al2Se4,-2.342149371666667,0.5030360455555531 -Cs2C2S2Cl6O6_4_4670.vasp,Cs2C2S2Cl6O6,-3.158531347222222,0.1558339636111086 -Al2H6O6_1_867.vasp,Al2H6O6,-4.912229695,-0.3853541838095276 -In1Ni5I2_123_8293.vasp,In1Ni5I2,0.3959481175,4.072543176875 -Cu1H12C6O6_2_4889.vasp,Cu1H12C6O6,-4.8484730748,0.2634536241999994 -Ta2Fe2Te6_11_17730.vasp,Ta2Fe2Te6,-2.542096395,0.2625375301111073 -Rh2Br2N2_59_15172.vasp,Rh2Br2N2,-2.8095155533333336,0.1923486363888862 -Bi2Se2O1_1_2544.vasp,Bi2Se2O1,-2.495512136,0.1927746946666646 -Pd2N4_2_14441.vasp,Pd2N4,-4.324244748333333,-0.0857620533333369 -Gd2Zn2P2O2_164_6628.vasp,Gd2Zn2P2O2,-3.72958844125,0.141713035 -Hf1As2_164_7110.vasp,Hf1As2,-4.1743177933333335,-0.5367843716666667 -Cr1H5C4S6_1_4193.vasp,Cr1H5C4S6,-4.05329795375,0.405717706093751 -Ge2Se1S1I1Br1_1_6861.vasp,Ge2Se1S1I1Br1,-1.985237195,0.1710748662326387 -Fe2Se2Cl14_1_5971.vasp,Fe2Se2Cl14,-0.825190955,0.049502695 -Cu2H4C4I2N2_2_5119.vasp,Cu2H4C4I2N2,-4.160507907857143,0.2718695874999888 -Zr1W2S8_164_21489.vasp,Zr1W2S8,-3.7911874972727273,0.464210885852266 -Sb2W1_164_15746.vasp,Sb2W1,-3.126025196666667,0.73552190833333 -Ta1Sb2_164_17612.vasp,Ta1Sb2,-3.8538555733333335,0.340143148333333 -Ir2S6_7_8831.vasp,Ir2S6,-3.04865729,-0.07716989015625 -Y2Se2_129_20778.vasp,Y2Se2,-4.6104716275,0.2592730425000003 -Ir1Cl2_115_8731.vasp,Ir1Cl2,-1.0239716333333333,1.0519836255555537 -Ni3Te8P2_164_13737.vasp,Ni3Te8P2,-1.0703583069230769,0.5450394534935886 -Te2P2S10F2_4_18440.vasp,Te2P2S10F2,-2.45920184625,0.3071584251822885 -Ho2Br2O2_129_8124.vasp,Ho2Br2O2,-4.7955121216666665,0.050985736666667 -Li2Cr3O6_1_9875.vasp,Li2Cr3O6,-4.617416678181818,0.2719836551010059 -Sn4S4_57_16961.vasp,Sn4S4,-2.233996215,0.2298340062499999 -In2Ga1Se3Br2_1_8441.vasp,In2Ga1Se3Br2,-1.681721775,0.087218334375 -Ti2As2S6_2_18880.vasp,Ti2As2S6,-4.085070096,0.1964790993749972 -Pt1N2O6_147_14578.vasp,Pt1N2O6,-3.975671362222222,0.342252394999996 -Th4F16_14_18733.vasp,Th4F16,-4.8680766625,0.1853285465 -Al3Co1_187_1046.vasp,Al3Co1,-1.4805195075,1.259647653359372 -Te8P2Pd3_164_18705.vasp,Te8P2Pd3,-1.5065531776923076,0.4693773870512777 -Os2Se2_129_13884.vasp,Os2Se2,-3.37481497,0.7557629525 -K2Mn2P2_129_9242.vasp,K2Mn2P2,-2.046815235,0.0356463133333333 -Ni2C2I2_59_13487.vasp,Ni2C2I2,-1.5431264999999998,1.8739931883333276 -Li1Bi1S1_99_9663.vasp,Li1Bi1S1,-2.372866536666667,-0.0168123522222247 -Sn4As4Se4_17_16935.vasp,Sn4As4Se4,-2.2312930675,-0.1100459641666684 -Ba1Y1Sn4O7_156_1879.vasp,Ba1Y1Sn4O7,-4.351122723076923,0.2089232690865325 -Cs2C2S8F6_1_4674.vasp,Cs2C2S8F6,-2.6627311033333334,0.1698376858333246 -Ir2Pd1Se7_38_8804.vasp,Ir2Pd1Se7,-2.039976139,0.4610792068749978 -K4Ca2S4O18_4_9422.vasp,K4Ca2S4O18,-4.049150023928571,0.1842355947321397 -Mn4H2N3O2_164_11437.vasp,Mn4H2N3O2,-4.508191588181818,0.6776048918181776 -Mn2Bi2Se4Br2_26_11013.vasp,Mn2Bi2Se4Br2,-1.699756222,0.1606946486666653 -Y4N3F2_164_20831.vasp,Y4N3F2,-6.608998441111111,-0.2504443887037096 -Mn1Au1I3Br1_1_10639.vasp,Mn1Au1I3Br1,-0.039702435,0.2263731229166664 -Sn6As2_191_16978.vasp,Sn6As2,-1.00931955625,-0.7874094866666654 -Hf2F6_2_7492.vasp,Hf2F6,-4.60043545125,0.3970845221874995 -Ga4O6_31_6558.vasp,Ga4O6,-4.497929204,-0.4298449067500034 -Ni1N2_99_13378.vasp,Ni1N2,-3.5762914733333333,1.9655422749999951 -Ga1Pd1S2I2_1_6237.vasp,Ga1Pd1S2I2,-1.4714994183333332,0.1378722677083291 -Au1S2F2_12_1440.vasp,Au1S2F2,-1.27372084,0.4136058238124975 -Pd2Se4F2_1_14498.vasp,Pd2Se4F2,-1.69198604875,0.17188520890625 -Cr3H2S2N2_187_4558.vasp,Cr3H2S2N2,-3.9829635855555554,0.3317571173919715 -Be2_123_2273.vasp,Be2,-2.08180606,0.1693517250000002 -Ta2Rh2S8_11_17839.vasp,Ta2Rh2S8,-4.206892314166667,0.0938579316666632 -Ag2As2Se6F12_10_159.vasp,Ag2As2Se6F12,-2.022286288181818,0.0574616999999997 -Fe3Hg2O8_10_6055.vasp,Fe3Hg2O8,-2.600808726923077,0.2269490672756396 -Ti1I2_187_18797.vasp,Ti1I2,-2.4074758666666667,0.1169532983333332 -Sn2As2O8_13_16724.vasp,Sn2As2O8,-4.131270478333334,0.2699407618749954 -Sc2C1I2_164_16052.vasp,Sc2C1I2,-3.40869721,-0.0139261987142886 -Ni2I2N2_59_13521.vasp,Ni2I2N2,-1.5176694016666668,1.0385920241666613 -Pb1S1I1Br1_8_14196.vasp,Pb1S1I1Br1,-1.10859341,0.2637889558854169 -V1I2_115_19867.vasp,V1I2,-0.81281572,0.2906303255555554 -Mn2Cl8_14_11056.vasp,Mn2Cl8,-1.160307738,0.1319892850000001 -Al1Te1_123_745.vasp,Al1Te1,-1.64561821,0.6601339774999999 -Nb3Ni3Se14_6_12991.vasp,Nb3Ni3Se14,-2.6621088745000003,0.1234280478499931 -Ta3F8_156_17957.vasp,Ta3F8,-4.441829883636363,0.5005165507272675 -V6O18_11_20391.vasp,V6O18,-5.08344284125,0.1124588926562495 -K2Hg4Te2I6O6_31_9196.vasp,K2Hg4Te2I6O6,-1.0579668625,0.1382783642333305 -As4Pd4O4_13_1350.vasp,As4Pd4O4,-2.94928332,0.358585032499997 -Zr1Br2_115_21269.vasp,Zr1Br2,-2.119948283333333,0.5347638900000002 -Mn2C1_164_11042.vasp,Mn2C1,-3.3228904366666665,0.8225305466666613 -Si2Te2I2_59_16457.vasp,Si2Te2I2,-1.6749742333333335,0.1653700751388866 -Al2S2O8F2_11_942.vasp,Al2S2O8F2,-4.137440860714286,0.6579508423809477 -Li4Cu4F14_1_10181.vasp,Li4Cu4F14,-2.0192307354545456,0.010714751818179 -Hf2P2S6_12_7554.vasp,Hf2P2S6,-4.411322117,0.2452340297499958 -Ta2Te2S1_164_17907.vasp,Ta2Te2S1,-4.548889325999999,-0.0363167486666693 -Cu2P2O6_162_5209.vasp,Cu2P2O6,-3.961160734,0.5563205795000008 -Li4P4S8_14_10215.vasp,Li4P4S8,-3.346640755625,-0.0011050567545572 -Cu2W2O8_2_5367.vasp,Cu2W2O8,-4.612967265,0.1206527697916595 -Ti3I1N1Cl1O2_8_19092.vasp,Ti3I1N1Cl1O2,-5.84588530625,0.097458365989578 -Sc2Sb2Se8_2_16148.vasp,Sc2Sb2Se8,-2.727320333333333,0.2863673072222168 -Ni1H4C8Br2_25_13351.vasp,Ni1H4C8Br2,-4.854261807333333,0.4263487326666613 -Os3Se4_156_13893.vasp,Os3Se4,-3.307557537142857,0.5718961014285666 -Fe2W2S14_8_6033.vasp,Fe2W2S14,-2.9448115177777776,0.0640582703472196 -Co2O2_123_3948.vasp,Co2O2,-3.0223576925,-0.0551899424999997 -Ta2I10_2_17751.vasp,Ta2I10,-1.2937455816666663,0.1259124777083335 -W2S5_6_20538.vasp,W2S5,-3.757236887142857,0.4504026413392834 -Cr1Mo3S8_25_4215.vasp,Cr1Mo3S8,-3.6337760691666663,0.05671619625 -V1Ag1Te2_156_19763.vasp,V1Ag1Te2,-1.1815507575,0.4130368195833334 -Ge2Sb2H6C2O6_7_6845.vasp,Ge2Sb2H6C2O6,-4.374166486111111,0.2160012174305527 -Ca1Co1O3_8_2820.vasp,Ca1Co1O3,-3.780076656,0.4033258493333296 -P4I12_14_14083.vasp,P4I12,-0.70303296625,0.0754729987499996 -Re1Ir2S3Cl2_1_15010.vasp,Re1Ir2S3Cl2,-2.94497789625,0.5281673956423532 -Hf2Zr1Bi8Mo1_1_7664.vasp,Hf2Zr1Bi8Mo1,-2.4157184475,-0.2245064339583339 -Mn1Cu2Cl4_25_10699.vasp,Mn1Cu2Cl4,-0.7741990385714285,0.3589412335714266 -Cu1Ag1S2I2Br2_1_4822.vasp,Cu1Ag1S2I2Br2,-0.38202629,0.20867065171875 -Ca2Ag1Cl2O2_5_2902.vasp,Ca2Ag1Cl2O2,-2.5895294242857143,0.0816924408646574 -Na2F1_164_12074.vasp,Na2F1,-1.7159421266666666,-0.1434046933333348 -V2S2O7F2_1_20161.vasp,V2S2O7F2,-4.37113744,0.0774139987820472 -As2Cl6_31_1205.vasp,As2Cl6,-1.51342408375,0.07948140125 -Fe2Br2_129_5819.vasp,Fe2Br2,0.3279666425,1.5142663237499998 -Au2S1O4_21_1509.vasp,Au2S1O4,-2.584534727142857,0.5040323573214276 -Ti1S2_115_18838.vasp,Ti1S2,-4.725814616666667,0.4035007299999993 -V1B4H4S6F1_2_19775.vasp,V1B4H4S6F1,-3.79166778375,0.5505786279427041 -Cs2Cl2_129_4710.vasp,Cs2Cl2,-1.1711957475,0.1930918074999998 -Sm2Cl6_59_16569.vasp,Sm2Cl6,-2.949184525,0.0703530349999996 -Tl2Ga2Se6_31_19425.vasp,Tl2Ga2Se6,-1.775574678,0.2841698631666646 -Hf2I2N1_164_7514.vasp,Hf2I2N1,-4.50816253,0.429840416499994 -P2Pb2O6_2_14009.vasp,P2Pb2O6,-4.629455239,0.2580739797500003 -Sb2Pb2S6Cl2_7_15643.vasp,Sb2Pb2S6Cl2,-2.091424324166667,0.2330290494791627 -Bi1S2_115_2373.vasp,Bi1S2,-1.9036230666666667,-0.2561240192708355 -Mn2Te2I2_59_11298.vasp,Mn2Te2I2,-1.0916871383333333,0.1601466308333333 -Ag4Te2_191_570.vasp,Ag4Te2,0.2370682783333333,0.1899829499999999 -Hf1V1I1Br1O3_1_7350.vasp,Hf1V1I1Br1O3,-4.691769368571428,0.2360507743154651 -Cd4As2Cl4_7_3619.vasp,Cd4As2Cl4,-0.124663202,0.3270540239999996 -V4S2N3F2_164_20359.vasp,V4S2N3F2,-4.531521825454545,0.2028406301515066 -Ga2C4Cl4F10_10_6316.vasp,Ga2C4Cl4F10,-2.8137102245000003,0.4835036074999996 -Fe1O2_187_5733.vasp,Fe1O2,-3.217313123333333,0.524627971249997 -Co2P4Br4O6_11_3967.vasp,Co2P4Br4O6,-3.41182858,0.2608466571111036 -Ge8Pt2_100_6974.vasp,Ge8Pt2,-2.8730430040000003,-0.1728893220000003 -Ni2Sb4S6I4_2_13624.vasp,Ni2Sb4S6I4,-1.60991668125,-0.5000630729166682 -Mo2Se1S1Br1Cl1_6_11680.vasp,Mo2Se1S1Br1Cl1,-2.5406602716666664,0.2024272267361114 -Zr1Nb1I1Cl1_1_21342.vasp,Zr1Nb1I1Cl1,-2.7384892475,0.8336579981250001 -Sc1Sn1Se1S1Br1_1_16006.vasp,Sc1Sn1Se1S1Br1,-2.636122764,0.1475816030000004 -Al1I2_187_675.vasp,Al1I2,-0.7382525633333333,0.403795324999999 -Mo2Cl6_189_11602.vasp,Mo2Cl6,-1.7629109725,0.1671715485416645 -Fe2As2Pd2_129_5777.vasp,Fe2As2Pd2,-1.4163813016666669,0.5854528287499978 -As2I6_162_1222.vasp,As2I6,-0.63537969625,0.0501925325 -Ti2Se2_164_19026.vasp,Ti2Se2,-4.4916158275,-0.1265362025000005 -Ga1Pd5F2_123_6241.vasp,Ga1Pd5F2,-1.13941094125,0.4699333495653721 -Co2S4_14_3987.vasp,Co2S4,-2.38702058,0.6037437441666667 -Ga2Sb2O6_162_6457.vasp,Ga2Sb2O6,-4.407891668,-0.061184757166675 -K2Si6As6_10_9348.vasp,K2Si6As6,-3.0853873042857143,-0.9826798017857143 -C2N6_164_2752.vasp,C2N6,-5.9004353375,0.3950378229166609 -Te1Au2S4_21_18289.vasp,Te1Au2S4,-1.1003463857142857,0.4331543033035692 -K2P2Au2Se6_10_9287.vasp,K2P2Au2Se6,-1.5690568258333333,0.23581403 -Mn1Ga2Te4_164_10730.vasp,Mn1Ga2Te4,-1.72764803,0.1380931161904746 -Nb4O10_31_13114.vasp,Nb4O10,-6.7750484421428565,-0.3078734373214306 -Bi1Se2I1_1_2391.vasp,Bi1Se2I1,-1.236340645,0.3829182945833332 -Tl2P2S6_149_19481.vasp,Tl2P2S6,-2.394042571,0.367725821 -Pt3S4_10_14693.vasp,Pt3S4,-2.0304497628571427,0.5975157799999977 -Sb2Te1Se2_164_15709.vasp,Sb2Te1Se2,-2.086790362,0.1123286010000002 -Zn3As2H16O16_10_21200.vasp,Zn3As2H16O16,-3.963607336486487,0.0361797246696653 -Nb2Cr2Te10_11_12705.vasp,Nb2Cr2Te10,-2.4479005878571427,0.060749246178569 -Ho2C1F2_164_8130.vasp,Ho2C1F2,-4.851305148,0.1328028640000003 -K2Mg1H4S10_2_9215.vasp,K2Mg1H4S10,-2.549083979411765,0.0393632837499976 -Te1P1I1_156_18317.vasp,Te1P1I1,-1.3759621866666667,0.3597214816666653 -Cu2Sb2Te6_147_5272.vasp,Cu2Sb2Te6,-0.950851399,0.356472227666665 -Y1Sc1C2S1N1Cl1_156_20670.vasp,Y1Sc1C2S1N1Cl1,-5.304135392857143,0.7208628128571308 -Mn1Bi1Te1Br1_8_10651.vasp,Mn1Bi1Te1Br1,-1.082846185,0.4152680369073276 -Ta1Cr3Se4_111_17537.vasp,Ta1Cr3Se4,-3.42877210625,0.4848742229166624 -Be4As2_59_2285.vasp,Be4As2,-2.570173571666667,0.5733303333333305 -Cr2Ag2Te12As4_13_4304.vasp,Cr2Ag2Te12As4,-1.544895638,0.1500844661249984 -Fe2As4I4O6_11_5792.vasp,Fe2As4I4O6,-2.994499376875,-0.1905903353125 -Fe1Cu1Ge2H1Cl3O6_1_5665.vasp,Fe1Cu1Ge2H1Cl3O6,-3.1902575642857145,0.0901437066647972 -Na2B2C2Se2_31_11969.vasp,Na2B2C2Se2,-3.26367563625,1.2867253200148674 -Cd2Cl2_164_3484.vasp,Cd2Cl2,0.51230936,0.11240557125 -As4Au2Se3Cl2_6_1319.vasp,As4Au2Se3Cl2,-1.5349317845454544,0.3590469492207762 -Te1Mo2S1Br2_1_18308.vasp,Te1Mo2S1Br2,-2.060366515,0.3403776741666665 -Au4S4I4_14_1588.vasp,Au4S4I4,-0.39665133,0.1426568888194438 -Cu1Ag1Te1Se1_8_4831.vasp,Cu1Ag1Te1Se1,-0.3544085475,0.279743766875 -Sn4O6_11_16948.vasp,Sn4O6,-3.781169064,0.3302206659999958 -Co2Br2_129_3876.vasp,Co2Br2,-0.488125745,0.694746439999999 -Pd1Se2_115_14390.vasp,Pd1Se2,-1.4461125166666668,0.4022242316666666 -Cu2Se2_10_5302.vasp,Cu2Se2,-0.7377025425,0.1729696433333334 -N1Cl3_187_11771.vasp,N1Cl3,-0.4184186325,1.1174754100000002 -Al4O12_14_1077.vasp,Al4O12,-4.402616199375,0.6835294979687494 -Nb1Ni1F6_2_12542.vasp,Nb1Ni1F6,-3.10984617125,0.5320795640624949 -Pb2Br2_164_14220.vasp,Pb2Br2,-0.7343079475,0.4931815900000002 -Ta4B3O2_164_18006.vasp,Ta4B3O2,-7.367553265555555,0.2416716897777635 -Fe2C2O7_5_5834.vasp,Fe2C2O7,-4.916864144545454,0.1975955001136329 -Re6Cl18_164_15121.vasp,Re6Cl18,-2.6781616608333336,0.0598214149999978 -Cu3Te2Br2O6_12_5393.vasp,Cu3Te2Br2O6,-2.320604,0.181110379423075 -Ni4Te4As4_13_13769.vasp,Ni4Te4As4,-1.320857455,0.116371297916664 -Cd1Cl2_164_3301.vasp,Cd1Cl2,-0.3393728666666666,0.0650214866666666 -Bi2P2_1_2495.vasp,Bi2P2,-2.441986075,-0.1855540849999997 -Ta1As2_187_17507.vasp,Ta1As2,-4.64607207,0.5011971566666666 -Hf1P2_187_7260.vasp,Hf1P2,-4.544495496666666,1.0713505125000005 -P4Pt4Se4_13_14106.vasp,P4Pt4Se4,-2.982819918333333,0.281645898333333 -Sr4Cu2Bi4O12_53_17423.vasp,Sr4Cu2Bi4O12,-3.65045562,0.2155935754545441 -Sb2Pd2S5_8_15652.vasp,Sb2Pd2S5,-2.1890868733333333,0.3065232333333312 -Nb4V2O12_12_13177.vasp,Nb4V2O12,-6.365053556111111,0.2584888143939277 -Te2W2_12_18536.vasp,Te2W2,-3.46193068,0.57611957625 -Ti1Ni1I2_6_18809.vasp,Ti1Ni1I2,-1.3301494375,0.4810539604166652 -Tl2S2Br2_59_19497.vasp,Tl2S2Br2,-1.015319615,0.2417834847916656 -Sr1Ta2O7_123_17091.vasp,Sr1Ta2O7,-6.149866773,0.4446390958749973 -Ni1C8F6_25_13307.vasp,Ni1C8F6,-4.586706200666667,0.5603543003333273 -Ir2S4_14_8830.vasp,Ir2S4,-2.861814213333333,0.2275407199999994 -Ca1H2Se2_5_2846.vasp,Ca1H2Se2,-2.698913664,0.6531536536666667 -Tl1Au1I2_1_19218.vasp,Tl1Au1I2,0.1884124725,0.150657415625 -Na2H8Cl2O4_2_12137.vasp,Na2H8Cl2O4,-3.69116130125,0.0587843216145831 -Ta2Ni4Te4_51_17806.vasp,Ta2Ni4Te4,-2.069878078,0.0532669814999997 -N1F5_47_11774.vasp,N1F5,-1.1759983416666666,0.1538646439583333 -La2O6_10_9601.vasp,La2O6,-4.94254924125,0.3810616853125002 -K1Br1_123_8884.vasp,K1Br1,-0.92673335,0.09385951 -Nb2Fe4Se6_11_12723.vasp,Nb2Fe4Se6,-2.496906635833333,0.4554703570833318 -Cs2Hg4Se2S6Br6_31_4739.vasp,Cs2Hg4Se2S6Br6,-0.6731684419999999,0.2081205528124976 -Nb4Te6_12_13173.vasp,Nb4Te6,-3.655654654,-0.5761408896666698 -Ni2S2O6_11_13585.vasp,Ni2S2O6,-3.493104067,-0.1390380040000014 -V4O10_4_20342.vasp,V4O10,-5.434057509285714,0.0245210728571425 -Hg1S1Cl1F1_156_7905.vasp,Hg1S1Cl1F1,-0.4940666175,0.3187231501953124 -In4As20_26_8661.vasp,In4As20,-2.657027905833333,-0.0781252791666693 -As2Pt1_123_1276.vasp,As2Pt1,-2.5933066966666667,0.8278103808333332 -Mg1H2O2_156_10369.vasp,Mg1H2O2,-4.155594698,0.3514158680000001 -Mn2Te4F2_11_11318.vasp,Mn2Te4F2,-1.818785715,0.2935882916666667 -Sn2S4_12_16845.vasp,Sn2S4,-2.2216062666666665,0.3915288000000001 -V2Cr1Re1S8_1_20045.vasp,V2Cr1Re1S8,-3.7981968116666662,0.1802036127083333 -Hf3Mn1S2I1Br1_1_7714.vasp,Hf3Mn1S2I1Br1,-4.0412438025,0.0099581714062497 -Hf2Br2O2_59_7447.vasp,Hf2Br2O2,-5.182722768333334,0.2920242236111079 -Pb4S4_25_14316.vasp,Pb4S4,-1.95228343,-1.279149985 -Hg3As1S4Br1_156_8044.vasp,Hg3As1S4Br1,-0.7778940788888888,0.2375403198611084 -N2F6_12_11784.vasp,N2F6,-1.63284439125,0.49066565625 -Sr2Cu1Te2I2_38_17211.vasp,Sr2Cu1Te2I2,-1.0590602642857143,0.1592314438095214 -Cu1Re1Se1S1_25_4947.vasp,Cu1Re1Se1S1,-2.711093805,1.1431584537499997 -P1Pd2Se2_187_13936.vasp,P1Pd2Se2,-2.072641366,0.3135283916249998 -As2F2_11_1209.vasp,As2F2,-2.6262746875,0.3376448320833305 -Pb2N2O7F2_25_14259.vasp,Pb2N2O7F2,-3.629449007692308,0.3480014297115327 -P4W1O13_1_14126.vasp,P4W1O13,-5.578770761111112,0.0953334968055497 -Lu4P4S16_14_10324.vasp,Lu4P4S16,-3.7662957695833335,0.0647622133333332 -Sn1Pb1_156_16673.vasp,Sn1Pb1,-0.40772852,-1.0473472025 -Mn1Fe2Ge1Cl4O6_1_10713.vasp,Mn1Fe2Ge1Cl4O6,-3.005428464285714,0.0868353561383827 -Sm2H4Cl2O4_11_16572.vasp,Sm2H4Cl2O4,-4.656157689166666,0.1032394520833337 -Al2Sb6_164_957.vasp,Al2Sb6,-1.89124353,0.02498146875 -Cu1Re1Te3Rh1S3_1_4948.vasp,Cu1Re1Te3Rh1S3,-2.354164978888889,0.5088726838580205 -V3C2S2_187_20252.vasp,V3C2S2,-5.192439178571428,-0.3550253163095294 -Cd1Br2_187_3288.vasp,Cd1Br2,0.15630296,0.1761868308333333 -Ca4Ti4Ge8O24_14_3248.vasp,Ca4Ti4Ge8O24,-5.53245618625,-0.01732167245 -Ca2Cu1Cl2O2_123_2994.vasp,Ca2Cu1Cl2O2,-2.934599497142857,0.0720174485714233 -Ru2O2_129_15329.vasp,Ru2O2,-3.329584255,1.4426874850000002 -Ni2As4S6Br4_2_13456.vasp,Ni2As4S6Br4,-1.900941648125,0.1425904009659052 -Al1Cd1Ga1Te4_156_622.vasp,Al1Cd1Ga1Te4,-1.2797204028571427,0.1439374285714285 -Ca1Br2_187_2812.vasp,Ca1Br2,-1.7203394733333337,0.20979419 -Nb4S12Br2_2_13135.vasp,Nb4S12Br2,-3.825708584444444,0.1006585859814802 -Co2Bi2Se4I2_10_3867.vasp,Co2Bi2Se4I2,-1.436049686,0.2589689419333312 -Sc2Te1Br1O1_25_16170.vasp,Sc2Te1Br1O1,-3.790838454,0.3357566480000002 -Pd3Se4_10_14513.vasp,Pd3Se4,-1.3659292328571428,0.3906329349999986 -Co1Cl2O6_12_3726.vasp,Co1Cl2O6,-2.401365316666667,0.2079632813888867 -Sr1Sn2As2_164_17088.vasp,Sr1Sn2As2,-2.158951232,0.1287127159999999 -Ta2Ni1Te6_12_17793.vasp,Ta2Ni1Te6,-2.68503437,0.113748220740738 -Ta2W2O11_164_17935.vasp,Ta2W2O11,-6.622052240666666,-0.1132937610000057 -Si6Sb2_11_16541.vasp,Si6Sb2,-2.8613866575,-0.0478831018750001 -V1W2Se7_1_19962.vasp,V1W2Se7,-3.139771916,0.0401700548000005 -Hg2H10C8N6Cl4_11_7962.vasp,Hg2H10C8N6Cl4,-4.664796445666667,0.150557221799322 -Sn2Te4_12_16898.vasp,Sn2Te4,-1.162691615,-0.6149443761111115 -V4Ni2P4O20_14_20336.vasp,V4Ni2P4O20,-4.955832272666667,0.2481003763333227 -V2Cu2S8_51_20051.vasp,V2Cu2S8,-2.5313019391666667,0.3094572888888867 -Ho2Te6_51_8152.vasp,Ho2Te6,-2.037547915,-0.3884575575000002 -Zn2H8S2N4_4_21104.vasp,Zn2H8S2N4,-3.724460691875,-3.140337165125002 -Rb1Sn1Se2_156_14754.vasp,Rb1Sn1Se2,-1.40483495,0.2726460506250003 -Ta2O2F2_59_17808.vasp,Ta2O2F2,-5.968846968333334,0.4025885553333264 -Zn2H2_13_21097.vasp,Zn2H2,-0.4403595375,0.7741465300000001 -Li2V2Ag4O12_4_10108.vasp,Li2V2Ag4O12,-3.3079800560000003,0.2578247273333263 -Sn2P2S6Cl2_7_16819.vasp,Sn2P2S6Cl2,-2.5829854241666665,0.0728564037499985 -Rb2Cd4Se2Br6O6_31_14815.vasp,Rb2Cd4Se2Br6O6,-1.534458269,0.163397061625 -Ag2H4I2N6_2_281.vasp,Ag2H4I2N6,-3.447063230714285,-0.057249406607144 -Cr2Cu2Sb4Se12_13_4373.vasp,Cr2Cu2Sb4Se12,-1.944242492,0.2384989225999998 -Cs2Cd4Te2Br6O6_31_4699.vasp,Cs2Cd4Te2Br6O6,-1.4521888085,0.2832796416249993 -Sn2As2S6Cl2_7_16725.vasp,Sn2As2S6Cl2,-2.248360674166667,0.4842013689062442 -Te4W1Au2_111_18631.vasp,Te4W1Au2,-1.2354026299999998,0.3144888621428555 -Sb2S2_2_15683.vasp,Sb2S2,-2.428306315,0.2889491304166645 -Hg2Te2S8F4_7_8033.vasp,Hg2Te2S8F4,-1.496467336875,0.3220126663932291 -Zn2N1Cl2_115_21123.vasp,Zn2N1Cl2,-1.032519666,0.2568301077499959 -Sr2H12C8O14_2_17229.vasp,Sr2H12C8O14,-5.211592169722223,0.206697924027764 -Fe1Sb1O3_1_5748.vasp,Fe1Sb1O3,-3.541169612,0.648987033 -Nb2Co2Te10_51_12693.vasp,Nb2Co2Te10,-2.2933128307142856,0.0776924219642805 -Mg2Al2S5_164_10418.vasp,Mg2Al2S5,-3.333166188888889,-0.1064655161111109 -Mo4S2N3F2_164_11758.vasp,Mo4S2N3F2,-4.01121174,0.5544262739393848 -Os2Se2_164_13886.vasp,Os2Se2,-3.40583539,0.7247425325000001 -Mg3Ti3_156_10570.vasp,Mg3Ti3,-2.7993459900000004,0.5993054358333332 -Te4As2Pb1_164_18560.vasp,Te4As2Pb1,-1.8619036257142856,-0.3696403821428577 -Na2H10Ru2C2O2_6_12092.vasp,Na2H10Ru2C2O2,-3.7942566116666665,0.4047022727777743 -Ag2Sb4Te3Cl2_6_419.vasp,Ag2Sb4Te3Cl2,-1.0773805054545451,0.2993369318181803 -Na2Ti2N2F2_59_12328.vasp,Na2Ti2N2F2,-5.12621744625,-0.0894373937499999 -Rb2Hg4I6O8_31_14866.vasp,Rb2Hg4I6O8,-0.8409452475,0.559844145000001 -Mn2H4Se2S8_7_11104.vasp,Mn2H4Se2S8,-2.745458608125,0.3425435472135417 -Sn2As1O6_162_16710.vasp,Sn2As1O6,-4.091958313333333,0.2959222784722186 -Tl2Mo4Cl14O4_2_19454.vasp,Tl2Mo4Cl14O4,-2.2607593941666666,0.1358171579166642 -Mn1Au1Se1S1Br2_1_10642.vasp,Mn1Au1Se1S1Br2,-1.0762308133333334,0.2267904419791648 -Mn1Rh1S2Br2_25_10848.vasp,Mn1Rh1S2Br2,-2.0934121766666665,0.1383054704166639 -Cd2Au2S2I2_26_3460.vasp,Cd2Au2S2I2,0.0092187175,0.1084288880208333 -Cu1Ag1Br2N2_1_4815.vasp,Cu1Ag1Br2N2,-1.2385397683333337,0.7005948291666639 -Pt4Cl8_14_14700.vasp,Pt4Cl8,-1.0098667175,0.1081733441666668 -Sn4S4O16_2_16959.vasp,Sn4S4O16,-4.216676615833333,0.0551457714322885 -P2Cl6_26_13969.vasp,P2Cl6,-1.72073294125,0.0705319512499984 -Sc4Cl6_12_16236.vasp,Sc4Cl6,-2.824280373,0.0655773000000001 -Hf2Br1Cl1O2_1_7442.vasp,Hf2Br1Cl1O2,-5.320986358333333,0.2863480805208307 -Ta4Ge2Se8_55_18046.vasp,Ta4Ge2Se8,-4.344115041428571,-0.0093364021428588 -Mn2Fe1O6_12_11070.vasp,Mn2Fe1O6,-4.027412585555556,0.1964409315277696 -Sr3Au2S4Br2_123_17352.vasp,Sr3Au2S4Br2,-1.91496115,0.0419525672727236 -Cd1Cl2_1_3303.vasp,Cd1Cl2,-0.2325315033333333,0.17186285 -P2I6_31_13988.vasp,P2I6,-0.63990302625,0.1386029387499996 -Sb2Se1I2Br2_1_15686.vasp,Sb2Se1I2Br2,-1.02934804,0.1969015267857131 -Si4Sb4Se4_17_16511.vasp,Si4Sb4Se4,-2.8959622266666667,-0.0737024690625026 -Ca2V4O10_59_3138.vasp,Ca2V4O10,-5.2599203925,0.2466731668749999 -Mn2V1Cl2O4_8_11334.vasp,Mn2V1Cl2O4,-3.924498065555556,0.0620631718055517 -Sb12S12_7_15418.vasp,Sb12S12,-2.396846575833333,0.3204088695833309 -Al2F2_59_820.vasp,Al2F2,-2.75174218,0.7193710016666635 -Cu2B2S2F2_31_5031.vasp,Cu2B2S2F2,-2.18723169125,1.1767507304166602 -Al2Cd1S4_164_785.vasp,Al2Cd1S4,-2.7716966285714286,0.15528735 -Na1Al1P2Se6_5_11814.vasp,Na1Al1P2Se6,-2.661265256,0.0340503042187503 -Cd1Sn2Cl2O2_12_3428.vasp,Cd1Sn2Cl2O2,-2.2156171185714286,0.0929206799999984 -Ta4Te8Pd4_53_18134.vasp,Ta4Te8Pd4,-3.04314026,0.1293445508333307 -Pb2I6_1_14255.vasp,Pb2I6,-0.22755353875,0.2175080438020833 -V1As2Au1Se6_5_19768.vasp,V1As2Au1Se6,-2.133208967,0.2490087119999978 -Tl8S4_13_19651.vasp,Tl8S4,-1.123710013333333,0.1314266283333334 -Sb2Pb2O6_7_15642.vasp,Sb2Pb2O6,-3.615882516,0.3854011228750003 -Al2In2S6_31_890.vasp,Al2In2S6,-3.004987391,0.1187713576666666 -Nb1Cl2_187_12489.vasp,Nb1Cl2,-3.1420621533333333,0.3153630673809474 -Mn1Bi2Se4_164_10653.vasp,Mn1Bi2Se4,-2.075052857142857,0.0359234203571418 -Au1C12O2F4_6_1415.vasp,Au1C12O2F4,-5.217260808421052,0.983784756315786 -Nb1V1Mo1Br2O3_1_12611.vasp,Nb1V1Mo1Br2O3,-4.384505955,0.1520700932812504 -Ir2S2F2_11_8817.vasp,Ir2S2F2,-2.887978506666667,0.2886830751851832 -Ba2Bi2Br2O4_51_1918.vasp,Ba2Bi2Br2O4,-3.3853691,0.1203962850000004 -In4S6_1_8686.vasp,In4S6,-2.375795895,0.1488444879999999 -Rb2N6O6F6_1_14902.vasp,Rb2N6O6F6,-3.3727197070000003,0.1839646697499959 -Cs2Cd4S8Cl6_31_4690.vasp,Cs2Cd4S8Cl6,-1.041313782,0.3405984110624994 -Cr1Ge1Te2_1_4181.vasp,Cr1Ge1Te2,-2.1351708925,-0.2825034033928592 -Sn1I2_164_16650.vasp,Sn1I2,-0.6312718333333334,0.0842982577777777 -Pt4Se1Br1O2_6_14707.vasp,Pt4Se1Br1O2,-1.96964868,0.5029495890625001 -Si6P2_11_16536.vasp,Si6P2,-3.42691594,0.2664294145833328 -Sc1Sn1Cl4O1_6_16004.vasp,Sc1Sn1Cl4O1,-2.6278186542857145,0.3081935035714252 -Nb1Te1Mo1Se1Br2_6_12593.vasp,Nb1Te1Mo1Se1Br2,-2.7420063,0.0693645504364973 -Mg2Bi2P2O12_11_10430.vasp,Mg2Bi2P2O12,-4.437515646666666,0.38047306252314 -Hf1I2O1_156_7198.vasp,Hf1I2O1,-3.765337015,0.28792898875 -Ti2Ga1S1Br1Cl3_1_18939.vasp,Ti2Ga1S1Br1Cl3,-3.13384013,0.1369439018750002 -Tl1Pd5Br2_123_19318.vasp,Tl1Pd5Br2,-0.6535692025,0.458930455625 -Zn2Bi4S6Cl4_31_21048.vasp,Zn2Bi4S6Cl4,-1.606316941875,0.212803709875 -Cd2Ag2Se2Cl2_26_3446.vasp,Cd2Ag2Se2Cl2,-0.13750900875,0.0051276724999999 -Zn1Se1_156_21010.vasp,Zn1Se1,-0.301579355,0.39842399875 -Hf2Mo1Se4Cl4_3_7533.vasp,Hf2Mo1Se4Cl4,-3.283654787272727,0.2750441015909025 -Al2S5_1_952.vasp,Al2S5,-3.252851535714285,0.1660396639285692 -Bi6C6_12_2666.vasp,Bi6C6,-3.68052309,0.6110736125000003 -Mo2O2_129_11644.vasp,Mo2O2,-3.8718112625,1.45442674875 -Be1Sb2H4S4_5_2231.vasp,Be1Sb2H4S4,-2.804706163636364,0.2105425671212061 -Br5N1_3_2711.vasp,Br5N1,-0.5225881733333334,0.3943160220833297 -Rb4I2_51_14976.vasp,Rb4I2,0.1332457616666666,0.1431199216666666 -In1Pd1Cl2O2_6_8305.vasp,In1Pd1Cl2O2,-2.2623860116666665,0.1379181586805518 -Fe1B4C2Br2F4_47_5622.vasp,Fe1B4C2Br2F4,-3.831359236153846,0.3474338735256297 -Rh2Br6_150_15176.vasp,Rh2Br6,-0.9922170875,0.0706918924999999 -Sr4Mn2S6Cl2_129_17449.vasp,Sr4Mn2S6Cl2,-2.850316087142857,0.029729721428569 -Ni2Se6_11_13650.vasp,Ni2Se6,-1.3625113,0.3273024733333333 -Sr2H8S4Cl4_30_17248.vasp,Sr2H8S4Cl4,-2.8891796666666667,0.0653013916666638 -Mn2Sb4_8_11265.vasp,Mn2Sb4,-1.896291305,0.1690071183333313 -Zn8S2O20_147_21239.vasp,Zn8S2O20,-2.4592784893333337,0.59284597541666 -B4Cl4_57_1750.vasp,B4Cl4,-1.97099700625,1.7781183631944413 -Na2Mg1H4S8O2_2_12190.vasp,Na2Mg1H4S8O2,-2.8602523717647057,0.361903706249997 -Sb2I6_189_15592.vasp,Sb2I6,-0.4303633675,0.163348465 -Sr2H8S4Br4_53_17247.vasp,Sr2H8S4Br4,-2.7318025961111108,0.0371670444444425 -Sb2I2_12_15590.vasp,Sb2I2,-0.910897215,0.246099697499999 -Tb2H12C8O12F2_12_18197.vasp,Tb2H12C8O12F2,-5.367235756388889,0.1169808823611038 -Sn4O10_30_16945.vasp,Sn4O10,-3.673373385,0.5444094101785684 -Rb2Ru2S2N2F10_11_14931.vasp,Rb2Ru2S2N2F10,-2.848059199444444,-0.0112685061508004 -Y1F2_187_20631.vasp,Y1F2,-4.444461446666667,0.6492287605555502 -Ti4B3H2S2_164_19120.vasp,Ti4B3H2S2,-5.4335849218181815,0.2068674945454456 -Mn2Nb1Mo1S2Br2_6_11159.vasp,Mn2Nb1Mo1S2Br2,-2.80952750625,0.4752002954166618 -Cd2I4O12_4_3523.vasp,Cd2I4O12,-2.347656716666666,0.097090606388889 -Cu2Se4F2_4_5309.vasp,Cu2Se4F2,-1.34464390875,0.1048823174999999 -Li1Cu1Cl2O2_1_9685.vasp,Li1Cu1Cl2O2,-1.991033775,0.1749090986217887 -Na2C4S2_31_12009.vasp,Na2C4S2,-4.1514726725,1.0910999075000003 -Mo4O10_59_11753.vasp,Mo4O10,-5.052521152142857,0.1789798345238056 -V2Te2H2O7_2_20206.vasp,V2Te2H2O7,-4.076384363076923,0.3434959431890999 -Nb2N2Cl2_59_12769.vasp,Nb2N2Cl2,-5.640456156666667,0.0622719697666571 -Os2S2_129_13869.vasp,Os2S2,-3.91013611,0.7855639968750001 -Cu2H12Se4O16_14_5110.vasp,Cu2H12Se4O16,-3.6965166108823526,0.1043579910294085 -Li2Au1_187_9829.vasp,Li2Au1,-0.8366796,0.29131267875 -Ti2Nb4Zn4O16_2_18970.vasp,Ti2Nb4Zn4O16,-5.435931965384616,0.1615394023076872 -K2Mg1H4S2O8_2_9216.vasp,K2Mg1H4S2O8,-4.043507791176471,0.1035590412499883 -Pt2I2N2_59_14627.vasp,Pt2I2N2,-2.1810993916666668,0.4831282649999961 -Sc4H2N3_164_16243.vasp,Sc4H2N3,-5.585775983333333,-0.2482207633333377 -Ca2S6N2F2_59_3111.vasp,Ca2S6N2F2,-3.148519015,0.3164387609895762 -Fe2C2Br2_59_5830.vasp,Fe2C2Br2,-2.355151906666667,1.1411563508333291 -Pd2Cl4O12_14_14414.vasp,Pd2Cl4O12,-2.2422503755555554,0.2876808434259241 -Ti1I1Br1O1_156_18791.vasp,Ti1I1Br1O1,-3.6946014575,0.2536751212499983 -Ga2Te4_12_6517.vasp,Ga2Te4,-1.4772928383333337,0.3531789513333314 -Nd1Pb2_123_13223.vasp,Nd1Pb2,-1.4220841566666669,-0.0068164541666684 -Cd2S1I1Br1_1_3539.vasp,Cd2S1I1Br1,-0.073825286,0.0620527309166666 -Co2S2Br2_59_3976.vasp,Co2S2Br2,-1.989772213333333,0.0446844699999997 -P2W2Se6_2_14061.vasp,P2W2Se6,-3.2755656010000003,-0.0131151811250029 -Zr4B3H2O2_164_21802.vasp,Zr4B3H2O2,-5.375504888181818,0.3479154321212013 -Cu1C12S2F4_6_4865.vasp,Cu1C12S2F4,-4.91934393,0.9332489127741156 -Na1Ni1Te6P2_149_11921.vasp,Na1Ni1Te6P2,-1.59611908,0.4118511474999987 -Ge1Bi2Se2I4_1_6649.vasp,Ge1Bi2Se2I4,-1.2420705555555556,0.0833349999999988 -Sn2Bi6_164_16738.vasp,Sn2Bi6,-0.94623222,-1.247937095 -Cu2H12Br2N4_13_5103.vasp,Cu2H12Br2N4,-3.6907574215,0.1520792032499921 -Sn8Pt2_125_17007.vasp,Sn8Pt2,-1.450244275,0.5131285250000002 -Co2P2S6_162_3963.vasp,Co2P2S6,-3.02941936,0.2573395452499982 -Ga1Ag1Sb2Se6_149_6123.vasp,Ga1Ag1Sb2Se6,-1.737660682,0.3309475043333311 -Cu2P4H8O8_51_5216.vasp,Cu2P4H8O8,-3.961986412272728,0.2239704548484837 -Ni2Sn8_125_13651.vasp,Ni2Sn8,-0.790783028,-1.787069435333333 -Nb1Cu2H8C8N4F6_47_12503.vasp,Nb1Cu2H8C8N4F6,-4.982965629310344,0.3294822566551559 -Nb1O2_164_12552.vasp,Nb1O2,-6.606493466666667,0.3790167395833341 -Si2S2I2_59_16434.vasp,Si2S2I2,-2.3529935366666668,0.2425282693055535 -Zr2Se2Cl2_59_21673.vasp,Zr2Se2Cl2,-3.597703038333333,0.0489337699999969 -Cu2S1I1Br1_1_5238.vasp,Cu2S1I1Br1,-0.4008291919999999,0.1583107935714273 -Bi4B4S12_14_2599.vasp,Bi4B4S12,-3.3158499045,-0.3723092732499996 -Pt2S2O6_12_14658.vasp,Pt2S2O6,-3.598264883,0.3714296939999963 -Sb1Cl1O1_156_15444.vasp,Sb1Cl1O1,-2.582780516666667,0.5485261055555553 -Ca1Ag2F12_115_2796.vasp,Ca1Ag2F12,-1.0382448953333332,0.0570822349999998 -Ti2F2_129_18931.vasp,Ti2F2,-4.40618058,0.6103021016666625 -Nb2Sb2Te6_2_12862.vasp,Nb2Sb2Te6,-2.515238061,0.3011571665416613 -U2Te6_59_19734.vasp,U2Te6,-3.4667553775,0.0949458762499997 -Zr2Se2_123_21681.vasp,Zr2Se2,-3.72550779,0.1662925450000001 -Ta3S1F7_156_17983.vasp,Ta3S1F7,-4.677437147272728,0.1922617344999949 -P4S6_7_14116.vasp,P4S6,-3.21904067,0.1662095214062477 -Ir2Se2F2_11_8838.vasp,Ir2Se2F2,-2.5582229266666667,0.2339965344791639 -Ta2As2O6_12_17646.vasp,Ta2As2O6,-5.988395013,0.3949400030740688 -Ni2Te2F2_59_13660.vasp,Ni2Te2F2,-0.9784331866666666,0.2403842549999983 -Pt2O2_10_14644.vasp,Pt2O2,-2.6072719525,0.505564149375 -Mn2Mo2S8Br2_129_11144.vasp,Mn2Mo2S8Br2,-2.4431575164285717,0.5399151631249947 -Co1H4C4N2Cl2_47_3755.vasp,Co1H4C4N2Cl2,-4.907585960769231,0.1419348751922927 -V2Se2_187_20188.vasp,V2Se2,-2.9692969575,0.4773554037499963 -Bi6C6_2_2665.vasp,Bi6C6,-3.6805128208333335,0.6110838816666666 -Na2Mn1H4S2O10_2_12208.vasp,Na2Mn1H4S2O10,-4.277550929473684,0.0465610506725069 -Hf3H2N2_187_7709.vasp,Hf3H2N2,-6.425126527142857,0.2443492535714231 -Cu2Sb2Se4_26_5269.vasp,Cu2Sb2Se4,-1.50630985,0.1701040674999998 -Rb2Sb2Br2F6_2_14939.vasp,Rb2Sb2Br2F6,-2.258938225833333,0.0972115858333331 -V4H2N3O2_164_20328.vasp,V4H2N3O2,-5.484290752727272,0.0474224334848386 -Ag2W1S4_8_491.vasp,Ag2W1S4,-2.3577492500000004,0.1318061113392805 -Cs2Hg4S2I6O6_31_4730.vasp,Cs2Hg4S2I6O6,-1.4125158545,0.053177799333334 -P1S1Cl1_156_13940.vasp,P1S1Cl1,-2.2388773533333333,0.4379349274479143 -Mn2Al2S5_156_10954.vasp,Mn2Al2S5,-3.3085738155555555,-0.0382944116666663 -Ti6H4O14_6_19178.vasp,Ti6H4O14,-6.41090086625,0.1135428304861116 -Tb2Se2I2_59_18208.vasp,Tb2Se2I2,-2.8664538333333334,0.0453191033333335 -In2Fe2Se5_187_8437.vasp,In2Fe2Se5,-1.9930481255555557,-0.2758060722222237 -Zr1Te2_115_21464.vasp,Zr1Te2,-2.615693176666667,0.5942733399999995 -B1As1_187_1617.vasp,B1As1,-4.131948345,0.6549143662499965 -Li2Mg2P2O8_11_9980.vasp,Li2Mg2P2O8,-5.189574357857143,0.1869673460714294 -Sb4_11_15842.vasp,Sb4,-2.0197014075,0.2638656649999999 -Ti2Ge2Te12_2_18942.vasp,Ti2Ge2Te12,-2.37153181625,0.1065526537500001 -Na4Li1N2_191_12397.vasp,Na4Li1N2,-1.935035511428572,0.5882583702380892 -Al2F6_26_824.vasp,Al2F6,-3.8231846775,0.1714946624999997 -Ba1W1S1Br1_25_1878.vasp,Ba1W1S1Br1,-2.02411646,1.809233371835937 -Zr2Cl8_1_21556.vasp,Zr2Cl8,-2.7480905140000003,0.0714438719999996 -Rb2Bi2O4_13_14778.vasp,Rb2Bi2O4,-2.96683319,0.1512907124999998 -Na4Cd2Cl8_11_12377.vasp,Na4Cd2Cl8,-1.162961150714286,0.1971721840476183 -Te4Pt3_10_18621.vasp,Te4Pt3,-1.3825941685714285,0.4860190871428571 -Si1Te2_187_16378.vasp,Si1Te2,-1.9531454966666668,0.4177220616666666 -V3B2S2_187_20245.vasp,V3B2S2,-4.621308447142857,-0.1850047303571422 -Hg2Te4O12_2_8037.vasp,Hg2Te4O12,-2.8788136533333333,0.1626525026388861 -Ga1Cu1Sb2O6_5_6172.vasp,Ga1Cu1Sb2O6,-3.76397313,0.413280613624994 -Na2Ta2Br12_4_12309.vasp,Na2Ta2Br12,-1.9963978425,-0.1211587787499999 -Pb2Se2_59_14295.vasp,Pb2Se2,-1.7391003575,0.2108637859375 -Ta2Te6Pd4_11_17922.vasp,Ta2Te6Pd4,-2.50544135,0.0634334756249987 -Ru2I2N2_59_15320.vasp,Ru2I2N2,-3.1008774233333334,-0.0539810558333361 -Re2Te2_187_15088.vasp,Re2Te2,-3.741933805,0.8233146725000002 -Ca3Sb3_25_3199.vasp,Ca3Sb3,-1.067447535,1.0400471575 -Cu2P1Se1S1I2_1_5206.vasp,Cu2P1Se1S1I2,-1.0151621614285715,0.2303167619399314 -Mn2Sb2Se4Cl2_10_11248.vasp,Mn2Sb2Se4Cl2,-2.0492997,0.1170592344999981 -Hf4O4F4_31_7799.vasp,Hf4O4F4,-6.0192688641666665,0.4163875902272608 -Th1Pb2_123_18720.vasp,Th1Pb2,-1.91194411,0.1003607683333329 -Li2Cu2F8_1_9887.vasp,Li2Cu2F8,-1.823771405,0.2080718775000003 -Li2Os1_187_10035.vasp,Li2Os1,-2.47415235,0.4903887711111083 -Nb2V2I1Br1N3O2_8_12935.vasp,Nb2V2I1Br1N3O2,-5.415451611818182,0.2076180961363523 -Cu2Se4Br2_17_5307.vasp,Cu2Se4Br2,-0.980394115,0.1043397806250001 -Si12Rh4_127_16314.vasp,Si12Rh4,-3.698439215625,0.0055824014583301 -Tl4Bi4_127_19592.vasp,Tl4Bi4,0.14416302625,0.6664788799999999 -Ga1As2Au1Se6_149_6137.vasp,Ga1As2Au1Se6,-1.889969889,0.2511645964166643 -Yb2F6_1_20872.vasp,Yb2F6,-4.43765504375,-1.4256116553125002 -Ni1Se1_156_13421.vasp,Ni1Se1,-0.320467315,0.4757002899999994 -Tl2Br2_2_19380.vasp,Tl2Br2,-0.64068997,-0.06397772 -Te2Pb1_164_18448.vasp,Te2Pb1,-0.9891898566666668,-0.5057727211111116 -Ag1H2_187_71.vasp,Ag1H2,-1.31748815,1.6585607183333309 -Ga2Si2Te6_162_6493.vasp,Ga2Si2Te6,-2.055812008,0.0674337812142813 -Mn2Ni1I1Br1O3_1_11169.vasp,Mn2Ni1I1Br1O3,-2.61536612875,-0.099363081458336 -Ta1F2_164_17540.vasp,Ta1F2,-4.50833334,0.7628074573333294 -Ni1Se1I1_8_13420.vasp,Ni1Se1I1,-0.28915668,0.2535808483333333 -Ni1C8Cl2F4_25_13306.vasp,Ni1C8Cl2F4,-4.444329714,0.5103206946666605 -Re2Cl2_12_15038.vasp,Re2Cl2,-3.9306652075,0.4613266230555517 -Al2Ga2O6_31_843.vasp,Al2Ga2O6,-5.20704963,-0.1112400623750038 -Os1Se2_164_13825.vasp,Os1Se2,-2.950000746666667,0.5946205133333331 -Sc2I6_189_16099.vasp,Sc2I6,-1.43932357,0.1781939612500001 -La2Bi7O14_1_9579.vasp,La2Bi7O14,-4.267858927391305,0.1452485210326032 -Li2Nb2Br12_4_10011.vasp,Li2Nb2Br12,-1.93041636,-0.0221501081249997 -Sn2P2H10C12O6_7_16808.vasp,Sn2P2H10C12O6,-5.592695469375,0.1168558025624855 -Cu2As2Se6_162_5014.vasp,Cu2As2Se6,-1.623897852,0.2785425474444424 -La2P6H16O14_2_9605.vasp,La2P6H16O14,-4.7660308373684215,0.068586460789464 -Os4S8_13_13894.vasp,Os4S8,-3.4512228966666663,0.8468946091666667 -Na2Hg4Br6O8_31_12150.vasp,Na2Hg4Br6O8,-1.1214904755,0.2536444002708306 -Au4I8_13_1574.vasp,Au4I8,0.5968528391666666,0.123734350416667 -Cr2Te2Cl2_59_4519.vasp,Cr2Te2Cl2,-1.80545225,0.059085873888887 -Hf4Cl4O4_7_7779.vasp,Hf4Cl4O4,-5.320972379166666,0.4103648770833303 -Mn1Pb2C6N6_164_10841.vasp,Mn1Pb2C6N6,-5.9040770186666665,0.2849529351666616 -Au1Br2_164_1412.vasp,Au1Br2,0.4178291166666666,0.2355994287500001 -Tb2S2I2_59_18206.vasp,Tb2S2I2,-3.2463720533333333,0.0486813916666668 -Ti2Cl8_1_18928.vasp,Ti2Cl8,-2.812349257,0.0074278509999996 -Ag4Se4O12_14_565.vasp,Ag4Se4O12,-2.614174783,0.139208322249998 -Tl1Au1Se2Br2_1_19223.vasp,Tl1Au1Se2Br2,-0.50773053,0.3683502706249995 -Rb4Si8H72C24N4_14_14981.vasp,Rb4Si8H72C24N4,-4.634954556517857,-0.0276804132535228 -Bi1Sb1S1Cl3_1_2379.vasp,Bi1Sb1S1Cl3,-1.6028245566666666,0.2513973083333295 -Ba2Cl4O8_125_1949.vasp,Ba2Cl4O8,-2.7354661914285714,0.3050097232142832 -Tm2I2O2_129_19681.vasp,Tm2I2O2,-4.465909651666666,0.0253544325000003 -Nb2Ni4Se6_11_12787.vasp,Nb2Ni4Se6,-2.2930300291666668,0.0803393649999999 -Te2Au2_59_18374.vasp,Te2Au2,-0.1451392575,0.28349739 -Cr1As2Au1S6_1_4112.vasp,Cr1As2Au1S6,-2.43763531,0.56355382925 -Hf4C3S2_164_7777.vasp,Hf4C3S2,-7.040223956666667,0.0257232955555484 -Sr4N2_59_17452.vasp,Sr4N2,-2.3853963366666666,0.2188403333333335 -La5Cl8_10_9630.vasp,La5Cl8,-2.8550631515384617,0.2010837326153822 -V1H2S2_164_19850.vasp,V1H2S2,-3.290893306,0.6341557052499953 -Y1Ni1F5_47_20657.vasp,Y1Ni1F5,-2.862713635714286,0.6558459542857111 -Ni2S2_164_13590.vasp,Ni2S2,-0.94517742,0.4832836033333317 -Hg2As2Se6_147_7925.vasp,Hg2As2Se6,-1.237639523,-0.0206300661666688 -La1H1Br2_187_9567.vasp,La1H1Br2,-3.00512951,0.0568752774999996 -Mn2Mo2S8F2_129_11146.vasp,Mn2Mo2S8F2,-2.949452487857143,0.3607652779464226 -Hf1Ga1I1N2Cl1_156_7166.vasp,Hf1Ga1I1N2Cl1,-4.235939503333333,0.4395342852777735 -Pt2Se2_129_14681.vasp,Pt2Se2,-1.5310198975,0.6442811549999999 -Zn1Pd1S1O2_156_20992.vasp,Zn1Pd1S1O2,-2.275726386,0.4354657496111067 -Nb3Se6_2_13017.vasp,Nb3Se6,-4.138824501111111,0.1170445063888889 -S8Br8_2_15403.vasp,S8Br8,-1.21807839625,0.316897730625 -Hf1Ag1I1Br1O1_1_7101.vasp,Hf1Ag1I1Br1O1,-2.780412418,0.5068397802500005 -Ni1O2_115_13384.vasp,Ni1O2,-2.1848893766666664,0.151397785416665 -Te4Au2Cl2_25_18567.vasp,Te4Au2Cl2,-0.31676027,0.3978467025 -Al2Se2O8F2_11_967.vasp,Al2Se2O8F2,-3.88372036,0.4020247487499964 -Rh1Se2_187_15171.vasp,Rh1Se2,-2.12429384,0.5493766666666664 -Fe2Br2_164_5820.vasp,Fe2Br2,-0.54938753,0.63691215125 -Ni2As2Se5_8_13451.vasp,Ni2As2Se5,-1.684902498888889,0.3074944587777755 -Rh1S1O1_156_15164.vasp,Rh1S1O1,-3.0610320633333337,0.5058811588103834 -Cd2P2Se6_147_3528.vasp,Cd2P2Se6,-1.732912313,0.0494445709999999 -Ti2B1Cl2_164_18883.vasp,Ti2B1Cl2,-4.96012543,-0.1384509190000056 -Zn2S4_14_21145.vasp,Zn2S4,-1.2297902083333334,0.4372781211249984 -Sb2Br6_31_15557.vasp,Sb2Br6,-1.02045535125,0.07838327 -Cs2H6C2S2O6_4_4715.vasp,Cs2H6C2S2O6,-4.2593097138888885,0.1178662009374966 -Ag4H4S4Cl4_2_521.vasp,Ag4H4S4Cl4,-1.4583907075,0.0850263499218748 -Sb1Te6As2Au1_143_15520.vasp,Sb1Te6As2Au1,-1.398049917,0.1058937410416641 -Cu1Ge2Br1O6_8_4887.vasp,Cu1Ge2Br1O6,-3.517428321,0.160719627749996 -Sr4Cr2Cu4O14_26_17420.vasp,Sr4Cr2Cu4O14,-3.639357435833333,0.3659929129166646 -Fe3As2O16_2_6040.vasp,Fe3As2O16,-3.639562214285714,0.1868895412499971 -Mo2As2Se6_12_11563.vasp,Mo2As2Se6,-2.63008912,0.279912789666664 -Ca2Au1Br2O2_38_2927.vasp,Ca2Au1Br2O2,-2.317862107142857,0.3255233740476143 -Na2Nb2Cl12_4_12225.vasp,Na2Nb2Cl12,-2.340875799375,0.0499886509374998 -Zr1Nb2Br2N2_1_21367.vasp,Zr1Nb2Br2N2,-5.445114471428572,0.2412822596031618 -Ca4Mn2S6Br2_129_3224.vasp,Ca4Mn2S6Br2,-2.6854371992857144,0.076121205714283 -Au1O2_115_1434.vasp,Au1O2,-0.9397376733333332,1.1362500118749974 -Cr1Ni1S4_6_4218.vasp,Cr1Ni1S4,-2.461809491666666,0.1918024068749981 -Al2Bi2_129_768.vasp,Al2Bi2,-1.69818211,-0.2527576800000001 -Ca1Cu2O8_89_2828.vasp,Ca1Cu2O8,-2.934789278181818,0.2565800509090881 -Cr1As2_187_4115.vasp,Cr1As2,-3.007627223333333,0.3330008591666633 -Dy2B2C2_10_5515.vasp,Dy2B2C2,-5.489703938333334,0.5063122220833267 -V1F4_123_19827.vasp,V1F4,-3.292132184,-0.0117827349999997 -Sc1Ag1Sb2O6_149_15891.vasp,Sc1Ag1Sb2O6,-3.7611296,0.7472257846250003 -Cs1F2_115_4638.vasp,Cs1F2,-0.9944070133333334,0.4346776266666667 -Co2P2Pt2_129_3961.vasp,Co2P2Pt2,-2.569358765,0.405551370104164 -Cr2N2_12_4428.vasp,Cr2N2,-5.1763099925,0.1150112774999998 -Sn2N2F2_59_16790.vasp,Sn2N2F2,-3.5492196816666666,-0.7960671537499996 -Sb2Pb1Se4_164_15636.vasp,Sb2Pb1Se4,-2.2138064500000003,0.0294831838392837 -Nb2S2_123_12848.vasp,Nb2S2,-4.8799670675,0.2316141359999948 -Ba4P4S8F4_14_2171.vasp,Ba4P4S8F4,-3.5258132275,0.1134412881796843 -Mg5Sc1_8_10594.vasp,Mg5Sc1,-0.1852652816666666,-0.0670549011111111 -Ce1Ge2_123_3644.vasp,Ce1Ge2,-2.802308066666667,0.7430310272222185 -Cd4Mo2S8_13_3634.vasp,Cd4Mo2S8,-1.487968142857143,0.5497476714285692 -Mo2O6_11_11650.vasp,Mo2O6,-5.127874585,-0.0001512262499998 -Cd2Te4_12_3599.vasp,Cd2Te4,0.0119400916666666,-0.0437151594444443 -Sr4Sb4Se8Cl4_14_17470.vasp,Sr4Sb4Se8Cl4,-2.389570947,0.017216694499995 -Tl4S4I4_14_19621.vasp,Tl4S4I4,-0.8045592516666668,0.3602108864583323 -Ta4Te10Pd6_31_18120.vasp,Ta4Te10Pd6,-2.7612104405,0.0851346789999998 -Zr2I2_164_21592.vasp,Zr2I2,-2.37979672,0.1522532975000003 -Cd1Pd2S1I2_1_3404.vasp,Cd1Pd2S1I2,-0.4097365783333333,0.1694529030555539 -Nb2Te2O2_67_12910.vasp,Nb2Te2O2,-4.8256933533333335,0.3615219303472223 -Ta4Ni4S8_53_18068.vasp,Ta4Ni4S8,-3.748099105,0.1309589089999987 -In1Sn1Cl2O2_8_8356.vasp,In1Sn1Cl2O2,-2.7449557516666663,0.1877169408333339 -Mg1Cu3H6Cl2O6_164_10356.vasp,Mg1Cu3H6Cl2O6,-3.121522507222222,0.168457221064809 -Ta6In4Cl18_12_18146.vasp,Ta6In4Cl18,-2.98069767,0.0725356600000002 -Hf1Zr1Se1I4Br1_1_7399.vasp,Hf1Zr1Se1I4Br1,-2.24048397625,0.2058166492187499 -Li4N4_111_10206.vasp,Li4N4,-4.09362192125,0.52091296625 -Zr2C2Br2_164_21538.vasp,Zr2C2Br2,-4.594988093333334,0.5446652933333263 -Bi1O1F1_156_2347.vasp,Bi1O1F1,-3.05047293,0.210862856666667 -Fe1Bi2Se4_164_5633.vasp,Fe1Bi2Se4,-1.995396627142857,-0.0976892935714296 -Mn2Bi2Cl2O4_26_11001.vasp,Mn2Bi2Cl2O4,-3.137543249,0.2174990190919506 -Nb4Pd4Se8_53_13127.vasp,Nb4Pd4Se8,-3.232756045625,0.1903460469078894 -Hf2V1S1I3Cl1_1_7661.vasp,Hf2V1S1I3Cl1,-2.808938385,0.4977697125781253 -V2Mo2Se8_25_20108.vasp,V2Mo2Se8,-3.0283829683333336,0.0676255024999996 -Eu2I2F2_129_5602.vasp,Eu2I2F2,-2.842081925,0.054517408333333 -Nb3B2F2_187_12944.vasp,Nb3B2F2,-5.68307973,0.3041738537142751 -Si2Cl2_164_16397.vasp,Si2Cl2,-2.8410201975,-0.3449864562499998 -Mn2Bi2_51_11027.vasp,Mn2Bi2,-0.6764774975,0.5857383013793105 -Ga2Sb6_164_6462.vasp,Ga2Sb6,-1.7493499925,-0.04303207875 -Sr4P4Se8F4_14_17463.vasp,Sr4P4Se8F4,-3.0893546545,0.0859249099375003 -Ge3Mo1_191_6910.vasp,Ge3Mo1,-2.2729700075,0.8930854537499999 -K2Ag2Ge1Se4_21_8966.vasp,K2Ag2Ge1Se4,-1.2475620733333337,0.1671725366666665 -Mo4O12_7_11754.vasp,Mo4O12,-4.70996616375,0.4177571950000001 -In2Hg1Se4_164_8471.vasp,In2Hg1Se4,-1.3246596128571428,0.1214337342857143 -B2S5_12_1704.vasp,B2S5,-3.749563645714286,0.1653029866071407 -Al4Se4Cl4_14_1094.vasp,Al4Se4Cl4,-2.641943625833333,0.0500309291666662 -Cu4S4Br4F4_14_5449.vasp,Cu4S4Br4F4,-0.997683423125,0.2337344279963197 -Rb4F2_51_14969.vasp,Rb4F2,-0.7715809883333334,-0.2285764116666671 -Nb4Pd2Se10_13_13124.vasp,Nb4Pd2Se10,-3.511441473125,0.1213087436759812 -Ru1Se2_164_15295.vasp,Ru1Se2,-2.56868096,0.6259195000000002 -P2Pb1S4_164_14002.vasp,P2Pb1S4,-2.86326514,0.3314880102566903 -Ni3As6_147_13694.vasp,Ni3As6,-1.840876281111111,0.2940893047222226 -Ga2Co1S4_164_6326.vasp,Ga2Co1S4,-2.82403733,0.0454709638690453 -Ti1Co2O6_1_18767.vasp,Ti1Co2O6,-4.795434317777778,-0.1731653786111159 -Hf4H2N3_164_7786.vasp,Hf4H2N3,-6.825128745555556,0.1803132936111042 -Hf2Zr5H1C3N1O8_1_7674.vasp,Hf2Zr5H1C3N1O8,-6.732882042999999,0.4931861229999941 -V2I2N2_8_20093.vasp,V2I2N2,-3.819798253333333,0.1858300806249961 -Hf1Ti1Se2I1Br1_6_7336.vasp,Hf1Ti1Se2I1Br1,-3.657832503333333,-0.1077858943750023 -Pd2Se2S6_12_14491.vasp,Pd2Se2S6,-2.017340687,0.2796579184999979 -Mn2O2_6_11178.vasp,Mn2O2,-3.269124365,0.9415219978448276 -Ga2Cl6_162_6320.vasp,Ga2Cl6,-1.58631458375,0.0398682237500001 -Ta6Rh18_191_18148.vasp,Ta6Rh18,-2.705742130833333,1.744930974166667 -Ba2P2Cl1_164_2043.vasp,Ba2P2Cl1,-2.024685204,1.091773394999997 -Ge2P2S6_28_6811.vasp,Ge2P2S6,-3.1119105950000003,0.188110336484368 -Al2S2_164_943.vasp,Al2S2,-3.4423190925,0.0777558514583307 -Cs2S6Cl2_11_4780.vasp,Cs2S6Cl2,-1.790052975,0.3263929266250003 -Os2S2_67_13873.vasp,Os2S2,-3.1276013025,1.568098804375 -Ta1Bi1As1_156_17509.vasp,Ta1Bi1As1,-3.9170134,0.1528078066666631 -Cs2Te2C2S6Cl6_4_4791.vasp,Cs2Te2C2S6Cl6,-1.9317951377777776,0.5728098729398127 -Ni2I4O12_14_13525.vasp,Ni2I4O12,-2.477179741111111,-0.0849023166666689 -Hf4O8_29_7800.vasp,Hf4O8,-7.25938235,0.5281115483333334 -Si6Sb6_2_16543.vasp,Si6Sb6,-3.0770066691666664,-0.4401486079166665 -Ca2Rh1_123_3101.vasp,Ca2Rh1,-0.5686757333333333,0.2140152809374994 -Cu2Se2F2_59_5299.vasp,Cu2Se2F2,-1.0677198433333337,0.2112407518518504 -Hf4Se6S2_12_7818.vasp,Hf4Se6S2,-4.785929646666667,0.1203751175 -W12I16Cl8_127_20405.vasp,W12I16Cl8,-2.338022563055556,0.0769354222222222 -Zr2S2I2Br1Cl1_8_21648.vasp,Zr2S2I2Br1Cl1,-2.79786019875,0.2544756863541662 -Cd1Cu1H4Cl4O2_2_3304.vasp,Cd1Cu1H4Cl4O2,-2.290921801666667,0.0855711684722222 -Ni1S2_164_13415.vasp,Ni1S2,-1.7367096266666666,0.106900963749998 -Te2Os2_115_18431.vasp,Te2Os2,-2.9128409025,0.2106763262499997 -Al2Si2S6_162_985.vasp,Al2Si2S6,-3.723796483,0.0419079983749961 -As4Se4_14_1371.vasp,As4Se4,-2.52687075375,0.1800141854166639 -Li6Fe2H20C12O34_2_10264.vasp,Li6Fe2H20C12O34,-5.118291650135135,0.0624932734909856 -Cr3Te8W1_25_4584.vasp,Cr3Te8W1,-2.12485657,0.0936525220833336 -Pb3Se2Br2_1_14306.vasp,Pb3Se2Br2,-1.5086663385714283,0.1172806048214272 -Re1O2_164_15015.vasp,Re1O2,-5.836157053333333,0.4109868325000008 -Si4As8_26_16485.vasp,Si4As8,-3.558032245,-1.3698803766666665 -Hf2Br4_11_7451.vasp,Hf2Br4,-2.997976216666667,0.1640238688888857 -Li2Cr2P8O26_1_9872.vasp,Li2Cr2P8O26,-5.337242482105263,0.0498958933815748 -Cu2P4S12_12_5219.vasp,Cu2P4S12,-2.5731807561111117,0.2440984824652719 -Cr1Se1I1_156_4260.vasp,Cr1Se1I1,-1.69268044,0.0506928449999999 -Sc2Se6_129_16164.vasp,Sc2Se6,-3.09352228875,0.2401203475 -Al8S12_14_1111.vasp,Al8S12,-3.5985592485,0.1407345112500002 -N4_59_11802.vasp,N4,-5.18575628,0.3479943425000007 -Na1Nb3O4_25_11909.vasp,Na1Nb3O4,-5.4907334225,0.6180303697916667 -Ca4Ni2Br2O6_129_3229.vasp,Ca4Ni2Br2O6,-3.3192377171428573,-0.2733256103571486 -Ag2Te2H4O10_2_457.vasp,Ag2Te2H4O10,-3.1607291516666667,0.2616154631249937 -As1Cl1O1_156_1141.vasp,As1Cl1O1,-2.8385421,0.3672010300000004 -Hf1H1C1O1_156_7187.vasp,Hf1H1C1O1,-6.0553500275,0.7817914410416673 -Mn2Ni1O6_162_11170.vasp,Mn2Ni1O6,-3.777265618888889,-0.0219634126388921 -Pt2S2O8_49_14661.vasp,Pt2S2O8,-3.7907468466666665,0.0770056874999998 -K2Hg4Te2S6Cl6_31_9199.vasp,K2Hg4Te2S6Cl6,-0.746850768,0.2380444477187482 -Ta2Br5_1_17671.vasp,Ta2Br5,-2.4370596385714287,0.5935183901339256 -Sn2Se2_31_16884.vasp,Sn2Se2,-1.949181525,-0.3729031499999999 -Ca2Cu1I2O2_123_2995.vasp,Ca2Cu1I2O2,-2.4523014528571427,-0.1125022031547629 -Ba2Fe3O8_123_1985.vasp,Ba2Fe3O8,-3.699422905384616,0.2801997307478601 -Mn1Pd1S2Br2_6_10845.vasp,Mn1Pd1S2Br2,-1.72919522,0.0710445774999999 -Sr3Co2S2O5_123_17361.vasp,Sr3Co2S2O5,-3.6867866558333335,0.1867522233333277 -Sn3Se2S2_6_16931.vasp,Sn3Se2S2,-2.0612834242857145,-0.0406378957142878 -V1Ga1S2_1_19833.vasp,V1Ga1S2,-2.83771233,0.104032453991933 -Nb6Sn2Se12_26_13201.vasp,Nb6Sn2Se12,-3.8325716825,0.1266314349999959 -V2Br2O2_59_20001.vasp,V2Br2O2,-3.8662590383333337,0.037130194999996 -Cu1Ge1Te1Br1_8_4885.vasp,Cu1Ge1Te1Br1,-1.1650503075,0.0555920681249984 -Co2P2S7_6_3964.vasp,Co2P2S7,-2.68538851,0.5405636583522706 -Sc3S4Br1_1_16219.vasp,Sc3S4Br1,-3.844386115,0.3678816834375 -Ga2H10C4F4_10_6370.vasp,Ga2H10C4F4,-3.845574827,0.4077304389999981 -Na2Zr1_187_12346.vasp,Na2Zr1,-1.0064266633333332,0.5567828383333322 -V1P2S7_5_19899.vasp,V1P2S7,-3.309661145,0.0650247344999969 -Mg1I2_164_10378.vasp,Mg1I2,-0.8031017633333333,0.0586524833333333 -Sn2O2_12_16799.vasp,Sn2O2,-3.52387778,0.2127676025 -Te8Ir4_2_18697.vasp,Te8Ir4,-2.246180084166667,0.1973222758333332 -Nb2O4F4_12_12797.vasp,Nb2O4F4,-4.740085282,0.3414423860833229 -Zr3Ti1Se8_6_21796.vasp,Zr3Ti1Se8,-3.935791013333333,0.2499440810416668 -Zr2N1Cl2_164_21603.vasp,Zr2N1Cl2,-4.825854114,0.0282515399999994 -Y4N3_164_20833.vasp,Y4N3,-6.702957424285715,-0.1088762550000045 -Yb2S2Br2_59_20883.vasp,Yb2S2Br2,-3.57137134,-0.9238346106597248 -Zn2In2S5_156_21111.vasp,Zn2In2S5,-1.79016214,0.1420425592222203 -Ni2Te1S1_156_13654.vasp,Ni2Te1S1,-0.7372026425,0.0155048649999999 -Li2S2O6F2_12_10054.vasp,Li2S2O6F2,-4.0877738325,0.0270351058333337 -Sr3P3_25_17396.vasp,Sr3P3,-1.9553531716666663,1.0671893650000002 -Li2Ti2Br2N2_59_10089.vasp,Li2Ti2Br2N2,-5.00574769125,0.1037115612499999 -Re1S2_164_15019.vasp,Re1S2,-4.513152593333333,0.4269182308333334 -V2Cu2Te12P4_2_20054.vasp,V2Cu2Te12P4,-1.834732797,0.4187969058333337 -Sr4Bi4Te8F4_12_17414.vasp,Sr4Bi4Te8F4,-2.2117797705,0.0694472785000001 -Nb2Se2_164_12877.vasp,Nb2Se2,-4.236165645,0.0052333097500008 -Pr1Sn5_47_14538.vasp,Pr1Sn5,-1.4712228116666666,-1.546312951249999 -Hf1Sc2Se1S2I2_25_7301.vasp,Hf1Sc2Se1S2I2,-3.63800334875,0.0375720618750006 -Nb2Fe2Se6_11_12718.vasp,Nb2Fe2Se6,-3.056606271,0.0502722684999987 -Sb3Au1Se6_143_15755.vasp,Sb3Au1Se6,-1.7575856470000002,0.2648448301666665 -Fe1B4N2F6_47_5628.vasp,Fe1B4N2F6,-4.466921912307692,0.3897034592307619 -Sr4Ni2I2O6_129_17455.vasp,Sr4Ni2I2O6,-3.083855125714286,-0.1867382770982166 -Pt2Br2_129_14599.vasp,Pt2Br2,-0.331693805,1.0979748056249998 -Cu2As2S4_26_5010.vasp,Cu2As2S4,-2.1216969225,0.2328255265624976 -Cr1Cl1F1_156_4138.vasp,Cr1Cl1F1,-2.6629431166666664,0.0173305805555534 -Bi8Rh4_2_2690.vasp,Bi8Rh4,-1.7080490691666668,0.2420612683333332 -Cs2Tm1Br6_164_4795.vasp,Cs2Tm1Br6,-1.4380664833333334,0.1472797720833317 -Zn1Ga1S1Cl2F2_1_20934.vasp,Zn1Ga1S1Cl2F2,-1.5864264214285717,0.3455751214047554 -Ca3Sn1_25_3203.vasp,Ca3Sn1,0.0500459875,0.84887705875 -Na4Hg2I8_11_12395.vasp,Na4Hg2I8,-0.2487130614285714,-0.2843060316666664 -Sc7I10_2_16279.vasp,Sc7I10,-1.7660763705882354,0.0963226200980365 -Ag2Sb2O6_2_399.vasp,Ag2Sb2O6,-2.825008927,0.5306436610000005 -Zn2Te2H8N4_4_21179.vasp,Zn2Te2H8N4,-3.45727233875,-3.1403936206250016 -Ag2Br2O2_59_201.vasp,Ag2Br2O2,-0.7292081183333333,0.3258290637499992 -Al2Zn2S5_164_1040.vasp,Al2Zn2S5,-2.457174423333333,0.0708622826666642 -Sr1Mg2_187_17062.vasp,Sr1Mg2,0.61137279,0.5604432991666667 -Mn5O9F1_1_11460.vasp,Mn5O9F1,-4.231606464666666,0.0738489196666627 -Mn4S2N3_164_11451.vasp,Mn4S2N3,-4.119031867777777,0.4787636649074031 -V1H4C4S6Cl1_1_19854.vasp,V1H4C4S6Cl1,-3.993106448125,0.3701224318489562 -Hf2Al4C5_164_7426.vasp,Hf2Al4C5,-6.011408243636364,0.1494991809090847 -Pd3Se2S1I1Br1Cl2_1_14512.vasp,Pd3Se2S1I1Br1Cl2,-1.037884107,0.060324330499999 -Hf2Te10_59_7625.vasp,Hf2Te10,-2.4236913975000003,0.0848502733333331 -Ba2Au1S2Br2_38_1907.vasp,Ba2Au1S2Br2,-2.0468237142857144,0.1907802124999977 -K4S10_4_9502.vasp,K4S10,-2.045383123571429,0.1095263699999981 -Nb1Si1Te1I1_8_12581.vasp,Nb1Si1Te1I1,-2.89137412,0.4061178117447839 -Co2As4Cl4O6_11_3852.vasp,Co2As4Cl4O6,-3.229313768125,-0.00841846 -Fe2Te2_129_6004.vasp,Fe2Te2,-0.66715948,1.09899677125 -Zr1Br1N1_156_21267.vasp,Zr1Br1N1,-5.08560536,0.3706565616666664 -Hf1Ge1S2Br2_1_7176.vasp,Hf1Ge1S2Br2,-3.39978954,0.1297317983333279 -Nb3C2S2F2_187_12963.vasp,Nb3C2S2F2,-5.247888571111111,0.6254940251357961 -Al1Tl1Hg1Te4_156_758.vasp,Al1Tl1Hg1Te4,-0.8021552342857143,0.4040875547619029 -Ta1Nb1Se2I1Cl1_6_17575.vasp,Ta1Nb1Se2I1Cl1,-3.5319059383333333,0.2137482931150668 -Ta2Te6P2_1_17920.vasp,Ta2Te6P2,-3.103306487,0.5235148750000002 -Nb4B3F2_164_13033.vasp,Nb4B3F2,-5.904873408888889,0.3356667712222099 -Hf4Cu2Ge8_59_7781.vasp,Hf4Cu2Ge8,-3.751624542857143,0.1770493964285679 -Ti1Te2_187_18860.vasp,Ti1Te2,-3.4071314433333337,0.2230758149999996 -Sr1As2H12_2_17022.vasp,Sr1As2H12,-2.762010275333333,1.6576058413333308 -Mo2N4_12_11642.vasp,Mo2N4,-5.583870821666667,0.5915836849999998 -Mo1Br2_115_11498.vasp,Mo1Br2,-1.01319394,0.8497880041666666 -W2Cl2O2_1_20481.vasp,W2Cl2O2,-4.045882489999999,0.600173883826527 -Tl1S2O8_150_19332.vasp,Tl1S2O8,-3.8023289054545457,0.1213136010795414 -Re2I6_191_15055.vasp,Re2I6,-1777.14851687,-1775.4720651504167 -Mo2Br4_11_11575.vasp,Mo2Br4,-1.5162680999999998,0.3467138441666668 -Te4S2O14_31_18628.vasp,Te4S2O14,-3.92139056,0.3293719515000006 -Sn2Te2_59_16897.vasp,Sn2Te2,-1.3548271725,-1.3190991925 -Bi4C3_5_2605.vasp,Bi4C3,-2.8723008557142857,0.8729060314285668 -Pd1O2_115_14374.vasp,Pd1O2,-1.9961411466666668,0.906424215 -Mn1Nb1S1I1Br2_6_10806.vasp,Mn1Nb1S1I1Br2,-2.4005099583333336,0.0994477393402702 -Na2Mg1H4S2O8_2_12189.vasp,Na2Mg1H4S2O8,-4.2014539529411765,0.0926380648447589 -Zn2Cr8O18_85_21067.vasp,Zn2Cr8O18,-4.482023613571429,-0.0377114951785779 -V3Te6_12_20292.vasp,V3Te6,-2.2735469733333336,0.093694084444444 -Sn2As2H6C2O6_7_16719.vasp,Sn2As2H6C2O6,-4.351614313333333,0.2021562143055515 -Y2N1F2_164_20759.vasp,Y2N1F2,-5.863257878000001,-0.0106493636666719 -Li4B4H8O16_14_10163.vasp,Li4B4H8O16,-4.9274943765625,0.1259447390624998 -Nb2Sb2O6_2_12859.vasp,Nb2Sb2O6,-5.514829081,0.3423395633749949 -Zr2I2O2_59_21590.vasp,Zr2I2O2,-4.389768981666667,0.2359854675925885 -Sr2Cu1S2I2_38_17203.vasp,Sr2Cu1S2I2,-1.7952239571428572,-0.0012764871428607 -V2B1Se2_164_19994.vasp,V2B1Se2,-3.968071946,0.2118267030000005 -Ca4Ge8W4O24_14_3218.vasp,Ca4Ge8W4O24,-4.732552872,0.4818502472499952 -Se8Br8_2_16304.vasp,Se8Br8,-0.956796430625,0.088443449375 -Bi4Te6_12_2655.vasp,Bi4Te6,-1.40606987,0.1612840639999999 -Ca4Sn8O16_59_3244.vasp,Ca4Sn8O16,-4.108927577857143,0.2069277632142818 -Eu2Br2O2_129_5598.vasp,Eu2Br2O2,-4.8117692566666665,-1.0570993464583365 -Fe2Se4_127_5987.vasp,Fe2Se4,-1.219708805,1.0821499533333332 -Cu2C2Br2O2_31_5060.vasp,Cu2C2Br2O2,-3.1799954025,0.34717075375 -Ta4Te12Cl2_2_18123.vasp,Ta4Te12Cl2,-2.870789373888889,0.1325932784444385 -Cd2Ge1S4_21_3508.vasp,Cd2Ge1S4,-1.3018934228571428,0.4749935683035695 -Cu2Te2Cl2_59_5330.vasp,Cu2Te2Cl2,-0.4980265216666666,0.2325789883333328 -Yb2Sb2S4O2_12_20885.vasp,Yb2Sb2S4O2,-4.357855701,-0.6319687017500049 -Ta4Co2S10_59_18022.vasp,Ta4Co2S10,-4.652826805625,0.0978439615104149 -Na4As4O8_14_12361.vasp,Na4As4O8,-4.051117638125,0.0393803143750002 -Hf2Te2_129_7638.vasp,Hf2Te2,-3.7006324975,0.4934404193750004 -In1I2_115_8273.vasp,In1I2,-0.2413086833333333,0.2996114749999999 -Si2S2Br2_59_16431.vasp,Si2S2Br2,-2.59276861,0.2354597702777729 -Sn1Sb2Se4_164_16688.vasp,Sn1Sb2Se4,-2.2405294785714287,-0.1040072071428587 -K4P4Pd2_51_9494.vasp,K4P4Pd2,-1.737809086,0.1563698110000002 -Ba2Cu1Te2Cl2_38_1975.vasp,Ba2Cu1Te2Cl2,-1.635526337142857,0.3332062089285684 -P2Pd3Se8_164_14029.vasp,P2Pd3Se8,-2.1087206,0.3608760871794829 -Cr2Ag2P4O12_13_4296.vasp,Cr2Ag2P4O12,-4.5717302555,0.316935308166661 -Mo2I6_162_11627.vasp,Mo2I6,-0.54989636,0.3745501691666667 -Be2Cl4_49_2249.vasp,Be2Cl4,-2.5768317216666667,0.0731716916666664 -Zr4Se4S2Cl4_12_21851.vasp,Zr4Se4S2Cl4,-3.648684258571429,0.1462963294642818 -Zr3Te2C2F2_187_21788.vasp,Zr3Te2C2F2,-4.382210191111111,0.5754708597222118 -Sb4O8_31_15791.vasp,Sb4O8,-3.891111001666667,0.5269658654166665 -Hf2Se2F2_59_7604.vasp,Hf2Se2F2,-4.692145213333333,0.0653966787499955 -Sr1O1_187_17067.vasp,Sr1O1,-3.549866895,0.4764716299999998 -Cr2S6_11_4475.vasp,Cr2S6,-3.08215529375,0.1700258110937498 -In1Cu1P2S6_149_8229.vasp,In1Cu1P2S6,-2.740941101,0.0785717375000003 -Ti3C1S2I2O1_1_19071.vasp,Ti3C1S2I2O1,-4.916786603333333,0.1787016495485963 -Fe2As4Br4O6_11_5791.vasp,Fe2As4Br4O6,-3.206037665,-0.0820979993750003 -Te2Pd2O6_12_18471.vasp,Te2Pd2O6,-3.13151579,0.1164079627500003 -Ba1Te2F2_1_1866.vasp,Ba1Te2F2,-1.735995878,1.216044876666667 -Hf4N3O2_164_7796.vasp,Hf4N3O2,-7.904482942222223,0.1455643197222142 -Cu2Te1S4_21_5326.vasp,Cu2Te1S4,-1.2505154185714284,0.5005088960119014 -Sr2N1_164_17280.vasp,Sr2N1,-2.3316512633333333,0.2725854066666668 -Tl1Au1S4I2_1_19221.vasp,Tl1Au1S4I2,-1.02555377875,0.2842515373828111 -Fe2Mo2Se2O12_113_5878.vasp,Fe2Mo2Se2O12,-4.231893949444444,0.0491387804865766 -Ni2P2Pt2_129_13563.vasp,Ni2P2Pt2,-1.7988967083333334,0.5415402432465248 -Co1C6Br2F4_47_3716.vasp,Co1C6Br2F4,-4.217836574615385,0.4407420946794795 -Hf1Ti1Te2S1Cl1_1_7338.vasp,Hf1Ti1Te2S1Cl1,-3.7051341166666663,0.3452551819791626 -Fe2Te2Mo2O12_113_5998.vasp,Fe2Te2Mo2O12,-4.096030247222222,0.1602717714351795 -Ni1H1O2_8_13322.vasp,Ni1H1O2,-3.068932285,-0.1215331834895829 -Mo2H2N1O2_164_11613.vasp,Mo2H2N1O2,-4.604020607142857,0.420915122202371 -Sb4Au2Se3Cl2_6_15767.vasp,Sb4Au2Se3Cl2,-1.2221678690909092,0.750366347424239 -Cr1P2Au1S6_143_4228.vasp,Cr1P2Au1S6,-2.724213015,0.1686000589999974 -Cu4Sb4_51_5462.vasp,Cu4Sb4,-0.80897234625,1.12701779 -Li1In1Te6As2_5_9738.vasp,Li1In1Te6As2,-1.655955716,0.3043496006666651 -Se2Cl2O5_123_16286.vasp,Se2Cl2O5,-2.191510575555556,0.5733795795833307 -Ta1Br1Cl1_156_17516.vasp,Ta1Br1Cl1,-3.1278995,0.5490247907142825 -Sb4Pt2_2_15808.vasp,Sb4Pt2,-2.15032473,0.5473457266666664 -V1Br2O1_47_19786.vasp,V1Br2O1,-2.9688890875,0.0339959231249999 -Ge2Se1I4Cl1_1_6860.vasp,Ge2Se1I4Cl1,-1.0226268,0.2139495281770796 -Si4Pb8Se16_14_16506.vasp,Si4Pb8Se16,-2.378077669642857,0.1428945139285713 -Tl1Cd1Ga1O4_156_19232.vasp,Tl1Cd1Ga1O4,-2.8031823785714285,0.2310792682142859 -Al1Ni3Br3O5_1_695.vasp,Al1Ni3Br3O5,-2.385232558333333,-0.0583061589062541 -Hf1Mn1Ge1Se2_156_7213.vasp,Hf1Mn1Ge1Se2,-3.41902513,0.522657136666667 -Bi2S2_12_2519.vasp,Bi2S2,-1.936903335,-0.6479070883333342 -Mn3Sn1O8_156_11414.vasp,Mn3Sn1O8,-4.179077876666667,0.2598342433333331 -Sb4Pd4O4_13_15805.vasp,Sb4Pd4O4,-2.53319057,0.5913159117708298 -H4Pb8S2O16_2_7070.vasp,H4Pb8S2O16,-3.907046358666667,0.0485166029999999 -Y4C3O2_164_20815.vasp,Y4C3O2,-6.35191791,0.6093016376041527 -Si1Ni3S2_187_16350.vasp,Si1Ni3S2,-1.5552771783333332,0.0169216018333275 -Li1Ti1Bi1Te1Br1_1_9798.vasp,Li1Ti1Bi1Te1Br1,-2.48225572,0.3202728771249955 -B1Cl1_99_1621.vasp,B1Cl1,-1.92416191,1.8249534594444408 -Gd2Ga4Co2_6_6612.vasp,Gd2Ga4Co2,-1.964704405,0.36677211125 -Cu2Hg2Te2F2_26_5164.vasp,Cu2Hg2Te2F2,-0.109161575,0.6629039827370689 -Mg1In2O4_164_10380.vasp,Mg1In2O4,-3.836930374285714,0.164170507321425 -Cd2F2_164_3504.vasp,Cd2F2,-0.133853195,0.02467126125 -Ga1Fe5I2_123_6190.vasp,Ga1Fe5I2,-0.19308424375,1.2019026502083323 -Ti1V1S2Br1Cl1_8_18864.vasp,Ti1V1S2Br1Cl1,-3.482159796666666,-0.0766621987673671 -Ag1Te1I1_1_140.vasp,Ag1Te1I1,0.0639795333333333,0.3562592488888886 -Ag2Cl6_191_252.vasp,Ag2Cl6,0.16599912125,0.366226821875 -W2Br4O4_26_20463.vasp,W2Br4O4,-3.889594658,0.0208704210000001 -Sn2I8_1_16788.vasp,Sn2I8,-0.123850029,0.1374074305 -Ta2I4O2_47_17762.vasp,Ta2I4O2,-3.84929737625,-0.0446503625 -Mn1Te1O4_10_10906.vasp,Mn1Te1O4,-3.9056461933333337,0.2817414364583325 -Ba4Fe2Cl2O6_129_2151.vasp,Ba4Fe2Cl2O6,-3.758156389285714,-0.0441881509151818 -Cd3N1_191_3615.vasp,Cd3N1,1.2742371025,0.5480760968750005 -C2S4_12_2756.vasp,C2S4,-4.091591795,0.3591065412499958 -K2H8I2O4_2_9159.vasp,K2H8I2O4,-3.33661413125,-0.0867335672916666 -Nb2Cl4O4_12_12682.vasp,Nb2Cl4O4,-3.975466739,0.4415682016249995 -Ni1H4C2N6F2_6_13338.vasp,Ni1H4C2N6F2,-4.3694213526666665,0.7508187828222095 -Te1As1Cl1_156_18279.vasp,Te1As1Cl1,-1.6350930466666669,0.2778679350000002 -Mg2Sn2_164_10518.vasp,Mg2Sn2,-0.602210665,-1.25187738125 -Y2In2I2_164_20753.vasp,Y2In2I2,-2.353385241666667,0.1263703197222196 -Pt2Se2_164_14683.vasp,Pt2Se2,-1.785118855,0.3901821975000001 -Ni1C10N2Cl2_10_13290.vasp,Ni1C10N2Cl2,-5.148629894666667,1.247712339333325 -Zr2Nb1Mo1Se5Br3_1_21612.vasp,Zr2Nb1Mo1Se5Br3,-3.2280385175,0.1078333605034685 -Ni1S2F2_164_13412.vasp,Ni1S2F2,-1.580703384,0.2293780087500002 -Rb2Hg4Te2Br6O6_31_14884.vasp,Rb2Hg4Te2Br6O6,-1.225283622,0.2201431853124961 -In2F6_1_8426.vasp,In2F6,-2.526291005,0.0900474024999997 -K2H6N10O2_51_9148.vasp,K2H6N10O2,-4.7069270240000005,-1.4155506637500022 -Fe1H8C6S4_10_5712.vasp,Fe1H8C6S4,-4.463967050526316,0.1975388423026232 -Ba2P4_12_2047.vasp,Ba2P4,-3.1226641033333333,0.4070728433333297 -Zr1Cl2_164_21276.vasp,Zr1Cl2,-3.0176405466666663,0.1615681933333337 -Tl4Ge2S6_2_19602.vasp,Tl4Ge2S6,-2.187354285,0.1333225916666665 -Li1Mn1Se2_156_9746.vasp,Li1Mn1Se2,-2.3282414375,0.1141345881249999 -Te2Au1_187_18364.vasp,Te2Au1,-0.30417841,-0.1218017445833333 -Y4Cl10_11_20818.vasp,Y4Cl10,-3.434833785,0.0705952645238029 -Ti1Cl2_187_18759.vasp,Ti1Cl2,-3.656709476666667,0.0509035941666669 -Pb2S2_129_14278.vasp,Pb2S2,-1.875986895,-1.20285345 -V2Te6As2_8_20221.vasp,V2Te6As2,-2.0694234860000003,0.3774093769999999 -Ga1Pd1Br6_5_6234.vasp,Ga1Pd1Br6,-0.69564051375,0.10107732375 -Si1Se2_115_16366.vasp,Si1Se2,-2.9899224600000003,0.1355026568749999 -B4Pb12S2O24_26_1763.vasp,B4Pb12S2O24,-4.435239610476191,0.0846019945238099 -K2Ag2Te2_129_8969.vasp,K2Ag2Te2,-0.33560893,0.1227263899999999 -Zr2Br2Cl2_6_21516.vasp,Zr2Br2Cl2,-2.6604605633333334,0.2564998933333333 -Fe2Sb2Se4F2_26_5960.vasp,Fe2Sb2Se4F2,-2.125660126,0.2988962292666638 -Sn3N4_156_16917.vasp,Sn3N4,-3.9325037714285713,-1.887827766428572 -Ca3Fe2I2O5_123_3175.vasp,Ca3Fe2I2O5,-3.3462271875000003,-0.202019608685906 -Hf3S2N2F2_187_7724.vasp,Hf3S2N2F2,-5.44156557,1.0003245824999878 -In1Cu1S2I1Br1_1_8232.vasp,In1Cu1S2I1Br1,-1.0428012583333337,0.3019130345833319 -Ge2H2_164_6776.vasp,Ge2H2,-3.1071409275,0.3922267525 -Al1Pd5Br2_123_708.vasp,Al1Pd5Br2,-1.2018062975,0.1330943393750002 -Hf2O2F2_59_7545.vasp,Hf2O2F2,-6.006750968333333,0.4289054860605944 -Zn2Sn2S6_162_21172.vasp,Zn2Sn2S6,-1.882834992,0.1617100858000002 -Si1F2_187_16331.vasp,Si1F2,-2.66886259,1.0380387158333306 -P4Au2S12_12_14068.vasp,P4Au2S12,-2.484083026111111,0.2227234232986054 -Co2Cl2_129_3890.vasp,Co2Cl2,-0.72504024,0.5289281837500002 -Sr2Tc2N6_17_17323.vasp,Sr2Tc2N6,-5.445217786,0.6068585593793037 -Tl1Pd2_187_19317.vasp,Tl1Pd2,-0.0714108899999999,0.7674430361111103 -Sb2Te2Br2_59_15710.vasp,Sb2Te2Br2,-1.4184608166666666,0.1720979733333334 -Cs2Cd4Te2S6Cl6_31_4704.vasp,Cs2Cd4Te2S6Cl6,-1.012358594,0.2649436947916661 -La2Te4Se2_129_9618.vasp,La2Te4Se2,-2.99311990375,0.0528883725 -Zr2As1S2_164_21501.vasp,Zr2As1S2,-4.715423006,0.0586415507499999 -Al4Se6_31_1097.vasp,Al4Se6,-2.986973621,-0.0343488309999995 -Fe1Sn2C6N6_147_5760.vasp,Fe1Sn2C6N6,-5.960622004666666,-0.4347939701666694 -Zn2P4H8O8_51_21134.vasp,Zn2P4H8O8,-4.060866021363636,0.0774616692108477 -Li4C8Cl4O8_14_10173.vasp,Li4C8Cl4O8,-4.639879800416667,0.7231699262499941 -Rb2C4_129_14800.vasp,Rb2C4,-3.623937155,1.4332121833333331 -Sc1Ag1As2O6_149_15885.vasp,Sc1Ag1As2O6,-4.128051428,0.3938151619999953 -Li2Be2_11_9840.vasp,Li2Be2,-1.69704914,0.1798236158333334 -H2Pb6_164_7008.vasp,H2Pb6,-1.04509664625,1.1574828775 -Cd2Au2S2Br2_26_3457.vasp,Cd2Au2S2Br2,-0.14488803625,0.170094371875 -Rb2H6C8Cl8O8_2_14858.vasp,Rb2H6C8Cl8O8,-4.195810036875,0.1668149012500002 -Co2Bi2S4Cl2_10_3863.vasp,Co2Bi2S4Cl2,-2.025112777,0.2880458469166672 -Ca3Ni2Cl2O5_123_3192.vasp,Ca3Ni2Cl2O5,-3.2758046433333337,-0.2757068116666737 -Al4Cu2Cl16_14_1068.vasp,Al4Cu2Cl16,-1.7032244927272728,0.0916430836363628 -Sc2B1Br2_164_16031.vasp,Sc2B1Br2,-3.25908998,0.0210423050999999 -Sc1Mn1Br6_5_15952.vasp,Sc1Mn1Br6,-1.66978218,0.04849874 -Hf1Sb2S6F2_164_7290.vasp,Hf1Sb2S6F2,-2.9366444627272728,0.6742347378693108 -Rb2I2F8_127_14893.vasp,Rb2I2F8,-1.478665085,0.1432286866666651 -Ni1H8C4N2O4_10_13358.vasp,Ni1H8C4N2O4,-4.976737382631579,0.5112497386841979 -K1C1N1_25_8888.vasp,K1C1N1,-4.786580956666667,0.3205368699999935 -Ca2S2Br1Cl1_1_3102.vasp,Ca2S2Br1Cl1,-2.5202191133333334,-0.0624265830208362 -Mn2Te2S8F4_7_11302.vasp,Mn2Te2S8F4,-2.290027366875,0.2688924248958334 -Ti3Te2_123_19115.vasp,Ti3Te2,-4.668736539999999,0.2629112839999938 -Ba2H8O6_26_1996.vasp,Ba2H8O6,-4.35125035125,0.0625781787499999 -Ag2Se1Br1Cl2_1_422.vasp,Ag2Se1Br1Cl2,-0.1804950733333333,0.2583941921354164 -Co1Si2Se4_12_3825.vasp,Co1Si2Se4,-2.626399874285714,0.40831914525297 -Ni3Sb2O8_164_13716.vasp,Ni3Sb2O8,-3.04186097,0.1416913534615349 -Hf2Zr2O8_4_7669.vasp,Hf2Zr2O8,-6.9857971625,0.4994443583333336 -Ca2F2_123_3012.vasp,Ca2F2,-2.0002374325,1.041612595 -Ce2Se4_59_3680.vasp,Ce2Se4,-3.5854917050000004,0.2158360008333328 -Th2Br2N2_129_18724.vasp,Th2Br2N2,-5.937101305,0.1041691616666673 -Li2Mn1_187_9990.vasp,Li2Mn1,-1.21133908,0.4762406053639834 -Ga2P1Ru1Se4Br2_1_6425.vasp,Ga2P1Ru1Se4Br2,-2.176191051,0.3678652683888861 -K2H6C10O2_51_9134.vasp,K2H6C10O2,-5.0159112295,0.726306989499992 -Fe1C8Br2F4_25_5653.vasp,Fe1C8Br2F4,-4.52431598,0.4308708724999926 -Ti2F2_164_18933.vasp,Ti2F2,-5.169002655,-0.1525199733333373 -K2Cu3Se4O12_2_9091.vasp,K2Cu3Se4O12,-2.992454414285714,0.1580246833333309 -Sb6Pt3_157_15857.vasp,Sb6Pt3,-2.195349368888889,0.5023210877777773 -Ca2C2S6F2_59_2970.vasp,Ca2C2S6F2,-3.490855965833333,0.4045309414062412 -In2Os1_123_8517.vasp,In2Os1,-1.7396004966666665,1.9102775533333305 -Ba3Fe2Br2O5_123_2105.vasp,Ba3Fe2Br2O5,-3.501118065,0.0132728074999999 -Mg1I1Br1_156_10374.vasp,Mg1I1Br1,-1.11690806,0.0829543455555556 -Mo12O24_1_11484.vasp,Mo12O24,-5.041954177777778,0.2699509338888886 -Sr4As4S8F4_14_17406.vasp,Sr4As4S8F4,-3.3054267260000003,0.19584521825 -Mn2P2S4I2_10_11194.vasp,Mn2P2S4I2,-2.41482392,0.3984977490148078 -Sc2Cl2F2_164_16058.vasp,Sc2Cl2F2,-3.39163772,-0.0078631416666696 -Nb4Te2O16_13_13170.vasp,Nb4Te2O16,-5.535172985,0.0783102741287782 -Tl8Te8O20_14_19656.vasp,Tl8Te8O20,-3.121659376388889,0.0633082927777772 -Mo2Br6_162_11577.vasp,Mo2Br6,-1.20081193,0.2369623140624983 -Ag1Pb1Se2_1_100.vasp,Ag1Pb1Se2,-1.0010768275,0.1173832479687499 -Te4P4_14_18609.vasp,Te4P4,-2.45141123125,0.3574796395833336 -Re1Ag2Br6_147_14986.vasp,Re1Ag2Br6,-0.8174434355555555,0.1404377253703693 -Zr4H2S2N3_164_21826.vasp,Zr4H2S2N3,-5.692290717272727,0.3628607950757423 -Sr2H4I4O2_31_17237.vasp,Sr2H4I4O2,-2.7840591183333334,0.0120681670833332 -Tc1S2_164_18221.vasp,Tc1S2,-4.802732793333333,0.3708612683333339 -Ta1Se2_115_17620.vasp,Ta1Se2,-4.02534922,0.6697299216666668 -Li2H4N2_113_9940.vasp,Li2H4N2,-4.25188867,0.0533997843750002 -Ag1Sb1Te6P2_143_121.vasp,Ag1Sb1Te6P2,-1.615887463,0.2961820275075736 -Bi14Te13S8_147_2304.vasp,Bi14Te13S8,-1.8560577665714284,0.0152007564999984 -Mg1N8_83_10389.vasp,Mg1N8,-4.4691635,0.7290472708333291 -Y2Te2_129_20782.vasp,Y2Te2,-3.89129328,0.2083003324999994 -Li1Ni1P1O4_3_9760.vasp,Li1Ni1P1O4,-4.112826051428572,0.2922613214999975 -Ga2Se2_187_6478.vasp,Ga2Se2,-2.361001105,0.0564564024999998 -Te2W2N1_156_18530.vasp,Te2W2N1,-4.290733392,-0.0763636136666663 -Hf1Ru1Cl4_6_7275.vasp,Hf1Ru1Cl4,-2.886932573333333,0.4503906404166634 -Sn2As2S6_147_16727.vasp,Sn2As2S6,-2.555341996,0.2164990313750001 -Hg2Se2_164_8022.vasp,Hg2Se2,0.2861213025,-0.5058834625 -Ag2B2I2O2_31_179.vasp,Ag2B2I2O2,-2.2622936775,0.9429068203255144 -Zr3Ti1O8_1_21794.vasp,Zr3Ti1O8,-6.910085643333333,0.2931198454166672 -As1I5_47_1153.vasp,As1I5,-0.0563207533333333,0.273637076458333 -Al4Se6_1_1096.vasp,Al4Se6,-2.789337482,0.1632873080000005 -Co2Mo2S8I2_129_3935.vasp,Co2Mo2S8I2,-2.1435534257142854,0.69778626848214 -Sb4Te3Au2Br2_6_15830.vasp,Sb4Te3Au2Br2,-0.9169343336363636,0.378447848454543 -Zr3Sc1N3F5_1_21783.vasp,Zr3Sc1N3F5,-5.552819475833334,0.0970492699999938 -Tl2Fe2Se4_10_19418.vasp,Tl2Fe2Se4,-1.1384349675,0.4603489676388886 -Mg2Cl4_51_10439.vasp,Mg2Cl4,-1.8636079866666664,0.2034195583333331 -Ba1Th1Br6_25_1869.vasp,Ba1Th1Br6,-2.343286065,0.147353071875 -Mn1Au1S2Br2_1_10640.vasp,Mn1Au1S2Br2,-1.283988585,0.1309220986458312 -Na6Cu2Sn2Se8_4_12435.vasp,Na6Cu2Sn2Se8,-1.675725155,0.2068108319444432 -Ga1Ni2_187_6219.vasp,Ga1Ni2,0.3607711166666666,0.9256209708333334 -Ho2Cu2Pb2Se6_51_8137.vasp,Ho2Cu2Pb2Se6,-2.2851723516666667,0.1896620716666666 -Co2As2Se6_162_3849.vasp,Co2As2Se6,-2.319641787,0.2453696786666639 -K4H8S4N4O12_57_9455.vasp,K4H8S4N4O12,-4.2039014353125,0.0508792842773406 -In1Fe5F2_123_8248.vasp,In1Fe5F2,-0.7203097325,1.5837718375 -Hf1Nb1Br4_123_7241.vasp,Hf1Nb1Br4,-2.5974289633333334,0.6237647116666618 -Te2Pd2F2_59_18467.vasp,Te2Pd2F2,-1.3911632666666665,0.1636778777083316 -Nb4Co2Se10_59_13055.vasp,Nb4Co2Se10,-3.6401857375,0.1672760754166671 -Au4S4F4_14_1586.vasp,Au4S4F4,-1.086450075,0.1829467640624984 -Bi1Sb1Te2_1_2381.vasp,Bi1Sb1Te2,-1.493665215,0.2511725212499978 -Ag4S4Br4F4_2_544.vasp,Ag4S4Br4F4,-0.799816359375,0.2810382016796875 -W2S2Cl2_59_20527.vasp,W2S2Cl2,-3.5322061216666665,0.2241907383333298 -Cr2F6_162_4383.vasp,Cr2F6,-2.830439985,0.2157901837500002 -Ba1I2_187_1841.vasp,Ba1I2,-1.2900427966666668,0.2544791299999998 -Pd1N1_187_14367.vasp,Pd1N1,-2.321526005,1.2693227262500002 -Mn2Ge2Br4_8_11087.vasp,Mn2Ge2Br4,-1.4547593025,0.0504851468749999 -Al1In1Hg1O4_156_676.vasp,Al1In1Hg1O4,-3.4138410542857143,0.3972123794047606 -K2C2Se2S6Cl6_4_9029.vasp,K2C2Se2S6Cl6,-2.0721985372222225,0.4435260344212931 -Zn1I2_1_20961.vasp,Zn1I2,0.4107168366666667,0.09403899875 -Y1Se1_25_20673.vasp,Y1Se1,-3.9475255,0.9222191700000004 -Hg1B4Br2N2F4_10_7837.vasp,Hg1B4Br2N2F4,-3.7916455192307694,0.3667421652136653 -Pd2I2_129_14431.vasp,Pd2I2,-0.0606761525,0.5697172831249999 -In2Pt4S6_164_8534.vasp,In2Pt4S6,-2.39319522,0.1408489916666648 -Os2Br2_129_13832.vasp,Os2Br2,-1.478632395,1.48559856 -Ga2S2I2_59_6444.vasp,Ga2S2I2,-1.7628925750000002,0.1324697908333312 -In2Ni2S5_187_8495.vasp,In2Ni2S5,-1.858333505555556,0.179116050925924 -Cr1Cu1W1Br2N3Cl2_1_4165.vasp,Cr1Cu1W1Br2N3Cl2,-3.145219774,0.173991630374993 -Ta8Te1C3Se2Br1N1Cl4_1_18164.vasp,Ta8Te1C3Se2Br1N1Cl4,-5.6946874385,0.1757390242291668 -Te2P2_12_18443.vasp,Te2P2,-2.25685564,0.5520352308333335 -Y2Ga2I2_164_20735.vasp,Y2Ga2I2,-2.8592178316666668,0.0420127966666665 -In4Se4Br4_14_8692.vasp,In4Se4Br4,-1.5337924941666667,0.0217988358333334 -Ta3B2H2S2_187_17940.vasp,Ta3B2H2S2,-5.620608338888889,0.7668042238888826 -Mn1Sb2S4_164_10872.vasp,Mn1Sb2S4,-2.7399938414285714,0.2421132617857118 -Fe1Cl2_115_5657.vasp,Fe1Cl2,-0.7392654533333333,0.9310118033333336 -Te2Au4S12_14_18376.vasp,Te2Au4S12,-1.4265536255555555,0.3479213102083316 -Tl2Br2O2_59_19378.vasp,Tl2Br2O2,-1.650303335,0.04308901 -Zr3C2_187_21761.vasp,Zr3C2,-6.053453976,0.4260491470000005 -Rb2Te2H6N2O6_1_14953.vasp,Rb2Te2H6N2O6,-3.784987695555556,0.0884072535648087 -Mg1B2H8_164_10340.vasp,Mg1B2H8,-3.702040439090909,0.0286787817424238 -Li1H5C5N2O5_1_9722.vasp,Li1H5C5N2O5,-5.666657960555556,0.1637527651099428 -Hf4I1N2Cl2O3_1_7791.vasp,Hf4I1N2Cl2O3,-6.087843000833334,0.2747781835937413 -Hf3Mo1Se1S1Br3Cl3_1_7716.vasp,Hf3Mo1Se1S1Br3Cl3,-3.3501347533333337,0.3813833056770777 -Ca3Cl6_5_3160.vasp,Ca3Cl6,-2.312437855555556,-0.0842067172222225 -V1Mo3Se8_25_19888.vasp,V1Mo3Se8,-3.021627593333333,0.0490832537500001 -Ga1I2_187_6204.vasp,Ga1I2,-0.4994785966666666,0.2969972491666666 -Ta4C3S2_164_18015.vasp,Ta4C3S2,-7.466031011111111,-0.1262648000000075 -Ni1H2O2_164_13325.vasp,Ni1H2O2,-3.1952225380000003,0.1188437271666665 -K2Cd4I6O8_31_9044.vasp,K2Cd4I6O8,-1.049940491,0.4305373839583323 -Ta1Cr1Cl6_123_17530.vasp,Ta1Cr1Cl6,-2.25313504375,0.5333100270833313 -Nb2Se2_129_12875.vasp,Nb2Se2,-4.463435025,-0.2220360702499992 -Cu2Se1S4_21_5295.vasp,Cu2Se1S4,-1.2500279871428572,0.6061681555357101 -Na3Sc1Br6_149_12357.vasp,Na3Sc1Br6,-1.827742884,-0.2739223835000007 -Ag2As4S3I2_6_168.vasp,Ag2As4S3I2,-1.699385201818182,0.1079503573295415 -Mn2P2Se4Br2_10_11197.vasp,Mn2P2Se4Br2,-2.21442684,0.0864546591250001 -Sb1Se2_115_15505.vasp,Sb1Se2,-1.8260645033333327,0.5257834472222203 -Sc1Cu1As2Se6_149_15923.vasp,Sc1Cu1As2Se6,-2.356895233,0.233089991972218 -Sr2Fe2Ge2_129_17219.vasp,Sr2Fe2Ge2,-1.2004963533333333,0.901380591666665 -In1Ni5Cl2_123_8291.vasp,In1Ni5Cl2,0.1319147175,3.743065454947916 -Mn2P2Cl2O4_10_11183.vasp,Mn2P2Cl2O4,-3.759113836,0.4154758564259221 -Sn2Sb2O6_147_16862.vasp,Sn2Sb2O6,-3.944741357,0.2433915139999974 -Cr2P4Au2S12_13_4457.vasp,Cr2P4Au2S12,-2.888936017,0.0038770569999977 -Zr2B1H2_164_21509.vasp,Zr2B1H2,-4.515646192,0.1212514354999965 -Co1H4N6F2_47_3769.vasp,Co1H4N6F2,-4.2920406692307695,0.1187367524038389 -Zn3Cu1_183_21203.vasp,Zn3Cu1,2.05303048,0.0944479899999999 -K2Ru2S4Br8N2_7_9326.vasp,K2Ru2S4Br8N2,-1.9092124377777775,0.1824275680555537 -Ga2Se1S1I1Cl1_1_6464.vasp,Ga2Se1S1I1Cl1,-1.9246561416666663,0.0809649741666667 -Mn1Sn3O8_10_10903.vasp,Mn1Sn3O8,-4.145125153333333,0.2419917499999999 -Ag4Br4O4_14_505.vasp,Ag4Br4O4,-0.7153746066666667,0.3396625754166658 -Si2S2F2_59_16433.vasp,Si2S2F2,-3.265107353333333,0.5289545762499968 -K2Pd1F4_10_9297.vasp,K2Pd1F4,-1.8303885728571427,-0.0693582285714284 -Cu1Br2_187_4862.vasp,Cu1Br2,0.13177971,0.267067925 -La4H12O12_14_9628.vasp,La4H12O12,-4.970954005714286,0.1839016985714288 -Mg3P2O8_10_10557.vasp,Mg3P2O8,-4.945619130769231,0.4138544776923076 -Na4Cl4O12_14_12381.vasp,Na4Cl4O12,-2.7008623305,-0.1335065927499994 -Na4Sb4S8_29_12417.vasp,Na4Sb4S8,-2.59981444,0.067269 -Ta2I2N2_59_17755.vasp,Ta2I2N2,-5.508218398333334,0.1400140376547607 -Mn1In2S4_156_10785.vasp,Mn1In2S4,-2.5082913085714287,-0.0215395771428572 -Sr1Au1Br2_1_17023.vasp,Sr1Au1Br2,-0.6956903975,1.0610195375 -K2Sn1S2_156_9353.vasp,K2Sn1S2,-1.470359152,-0.0152253452499999 -Nb2Ir2Se8_11_12760.vasp,Nb2Ir2Se8,-3.5477097475000003,-0.2432318658333332 -In2F6_26_8427.vasp,In2F6,-2.47749576125,0.1388426462499996 -Fe1Ni2S1Cl4_38_5727.vasp,Fe1Ni2S1Cl4,-0.85978359875,0.0319966922569425 -Bi6Pt3_147_2675.vasp,Bi6Pt3,-1.4074437811111111,0.2824095834722222 -Li1Ga1P2Se6_5_9712.vasp,Li1Ga1P2Se6,-2.62201897,0.1527132175416645 -Cu8W4O16_2_5506.vasp,Cu8W4O16,-3.8207332675,0.4635715051785651 -Tl4Te6_1_19636.vasp,Tl4Te6,-0.7180119620000001,0.2696184039999999 -V1I1Br1_156_19862.vasp,V1I1Br1,-1.43339173,-0.0085112905555556 -Ga2Se1Cl5_8_6463.vasp,Ga2Se1Cl5,-1.51833427125,0.2434367417708331 -Fe2N2F2_59_5885.vasp,Fe2N2F2,-3.1764514266666666,0.5963446337499951 -As4O6_7_1337.vasp,As4O6,-4.43800706,0.0472305119999996 -U2Te2N2_129_19730.vasp,U2Te2N2,-6.7902742300000005,0.1170428983333327 -Mo1As1P1_156_11486.vasp,Mo1As1P1,-3.52314136,0.0628499966666633 -Ge3As4_5_6903.vasp,Ge3As4,-2.932423708571428,-0.2037378632142875 -P1S1Br1_156_13939.vasp,P1S1Br1,-2.05687886,0.3995536930034702 -Sb2S3_164_15684.vasp,Sb2S3,-2.70665758,0.0973355400000004 -Pd1N2_99_14369.vasp,Pd1N2,-4.4284061066666665,-0.1899234116666701 -V4B3O2_164_20305.vasp,V4B3O2,-5.297643853333334,0.3068706271604836 -Ge2Te2F2_59_6883.vasp,Ge2Te2F2,-2.3466031983333333,-0.0245452113888902 -Hf1Ge1Cl2O3_1_7172.vasp,Hf1Ge1Cl2O3,-4.748113824285714,0.2759814783928516 -Te4H4O12_4_18589.vasp,Te4H4O12,-3.826166396,0.1923294517499996 -Li1Al1P2Se6_5_9644.vasp,Li1Al1P2Se6,-2.805204111,0.1263254585416643 -Co1H8C6S4_10_3773.vasp,Co1H8C6S4,-4.542497471052632,0.3116129925877103 -Te2_2_18540.vasp,Te2,-0.993490395,0.5782953616666666 -Hf3I2N1Cl1O1_1_7713.vasp,Hf3I2N1Cl1O1,-4.65699875375,0.5640016606770804 -Te3Ir3I2Br1_1_18547.vasp,Te3Ir3I2Br1,-1.69217435,0.2589068440740707 -Ba4Bi4Te8H4_14_2146.vasp,Ba4Bi4Te8H4,-1.967297858,0.5640869960000003 -Tl2S2_2_19507.vasp,Tl2S2,-1.254788655,0.34103502609375 -Co2H4Se2O8_1_3916.vasp,Co2H4Se2O8,-3.616373160625,0.1921500704166644 -Na1B3H8_6_11826.vasp,Na1B3H8,-3.894120914166667,0.4985118536666582 -Ti2Ag2_129_18876.vasp,Ti2Ag2,-2.4697305025,0.2033363874999998 -P1_123_13952.vasp,P1,-3.41662974,0.6293662450000004 -Co1Te2_115_3834.vasp,Co1Te2,-1.19475516,0.4493481477777779 -Bi8Se20_14_2695.vasp,Bi8Se20,-1.8189386896428568,0.3464235470238073 -Sc1Pd1S2Br1_8_15979.vasp,Sc1Pd1S2Br1,-2.76147853,0.2357670230000003 -Ta2Cl10_1_17686.vasp,Ta2Cl10,-2.6633743733333333,0.0997454283333336 -Sb1W2O8_2_15526.vasp,Sb1W2O8,-5.408360425454545,0.0613229405681776 -Bi1H1Se2S6_1_2336.vasp,Bi1H1Se2S6,-2.303106064,0.2627687791979118 -Zr2B1Te2_164_21513.vasp,Zr2B1Te2,-4.078354378,-0.0129327125000024 -Fe1H4C8F2_25_5706.vasp,Fe1H4C8F2,-5.249223816666667,0.5839238746666601 -Li2Co2P2_12_9866.vasp,Li2Co2P2,-2.9711520266666667,0.1326752937499969 -Cs4Cd2I8_11_4807.vasp,Cs4Cd2I8,-0.0467909307142857,0.2045902964285714 -Hf4S4I4_7_7810.vasp,Hf4S4I4,-3.787632995833333,0.137601894166659 -Zr4N3Cl2_164_21830.vasp,Zr4N3Cl2,-5.9465862977777775,-0.1390450366666722 -K1Fe1P2H2O6_156_8896.vasp,K1Fe1P2H2O6,-4.332574528333333,0.2862614059781011 -Hf1V1I3Br1N1O1_1_7351.vasp,Hf1V1I3Br1N1O1,-3.28199334375,0.3174126425 -Mn2N1_164_11155.vasp,Mn2N1,-2.985600743333333,1.0283908458333335 -Li2Mg1H4Se2S8_2_9970.vasp,Li2Mg1H4Se2S8,-2.766521175294118,0.0940489421568577 -K4As4S8_14_9411.vasp,K4As4S8,-2.41964125,0.1074204068749997 -Ta2Te6Pt1_12_17923.vasp,Ta2Te6Pt1,-2.986521713333333,0.1240217744444407 -Ta1Nb2Ni1Ir1Br6O3_1_17583.vasp,Ta1Nb2Ni1Ir1Br6O3,-3.428015340714285,0.8015030958730022 -As2Pb4Cl4O6_11_1263.vasp,As2Pb4Cl4O6,-3.001566203125,0.2349273948958319 -Bi4Br12_14_2602.vasp,Bi4Br12,-0.91866921375,0.0726644524999999 -Co2W2Br2O8_129_4054.vasp,Co2W2Br2O8,-4.379260359285714,0.1329231920833264 -Zr1Pt1I2N2_1_21404.vasp,Zr1Pt1I2N2,-3.5081041766666665,0.2177274321568593 -V1O2_115_19892.vasp,V1O2,-5.377178273333333,0.3007608016666676 -Hf4H2C3O2_164_7782.vasp,Hf4H2C3O2,-6.806402166363636,0.3120727984343321 -Hf2I2_164_7520.vasp,Hf2I2,-3.1622423525,0.387087234999997 -Pb1F2_115_14182.vasp,Pb1F2,-2.2854557566666664,0.4001996566666665 -V1O1F2_25_19890.vasp,V1O1F2,-4.1168790075,-0.3361835545312572 -Mn2P2Br2O4_10_11181.vasp,Mn2P2Br2O4,-3.601877458,0.4187716826759226 -Pd2Se2Cl4_1_14485.vasp,Pd2Se2Cl4,-1.00644832,0.0677368726388877 -Sc2H2_164_16088.vasp,Sc2H2,-3.0057219675,0.3814706862500001 -Sc1Cu1As2O6_149_15921.vasp,Sc1Cu1As2O6,-4.160857808,0.5822487451249962 -Ce2I6_59_3667.vasp,Ce2I6,-1.71098141,0.08134489 -Zr1I2_115_21310.vasp,Zr1I2,-1.4247263366666667,0.603633345 -Cs2H6C6S6_1_4722.vasp,Cs2H6C6S6,-4.1942494230000005,0.3189799552499919 -Cu1Cl2_115_4871.vasp,Cu1Cl2,-0.30326818,0.1858869233333333 -Ca3Br6_5_3157.vasp,Ca3Br6,-1.738205968888889,0.1919276944444445 -Pb2S2F2_59_14273.vasp,Pb2S2F2,-2.1176929433333336,-0.1141732884375023 -Zr1Ta1Nb2N4F4_1_21449.vasp,Zr1Ta1Nb2N4F4,-6.273115511666667,0.3271134599999947 -Na1C5N2O5F5_1_11835.vasp,Na1C5N2O5F5,-4.429712279444445,0.6461504925694346 -Te4Au2_6_18572.vasp,Te4Au2,-0.4753785016666667,-0.29300183625 -Sr2Au1I2O2_38_17125.vasp,Sr2Au1I2O2,-2.165698992857142,0.1070696457242033 -W2Br6_12_20465.vasp,W2Br6,-1.80537883125,0.2295539484374995 -Ba2In1Cu1Hg1S5_99_2011.vasp,Ba2In1Cu1Hg1S5,-1.896475014,0.3190006010546857 -Co2O4_59_3951.vasp,Co2O4,-3.671752833333333,-0.5745864012500024 -Sr2Cl4_129_17183.vasp,Sr2Cl4,-2.2285308816666665,0.2689668716666666 -Ru1I2_164_15273.vasp,Ru1I2,-1.153709916666667,-0.1483995850000009 -Ta2Ni1C1I1F6_1_17787.vasp,Ta2Ni1C1I1F6,-3.6848971327272726,0.4580511065908984 -Yb2Co2Ge4_129_20869.vasp,Yb2Co2Ge4,-2.83652720875,0.3272076374999997 -Hf2Te2Cl2_59_7632.vasp,Hf2Te2Cl2,-3.537338263333333,0.0648382597916632 -Li4Cu4F10_11_10180.vasp,Li4Cu4F10,-2.210610808888889,-0.0687477666666689 -Sn12Pt4_100_16596.vasp,Sn12Pt4,-1.57026307125,0.0805329962499989 -Sc2F2_164_16069.vasp,Sc2F2,-3.552240735,-0.0139736533333358 -Co1C2I2N4F4_47_3712.vasp,Co1C2I2N4F4,-3.0015583361538463,0.8042948594230669 -In2Te2Br2_31_8614.vasp,In2Te2Br2,-1.1607173716666666,0.0682603833333335 -Ta2Pd4Se2S2_51_17831.vasp,Ta2Pd4Se2S2,-3.198661395,0.087151690624998 -K4Cl4O4_11_9432.vasp,K4Cl4O4,-1.5703522108333334,0.5317552374999985 -Pd2O4_14_14449.vasp,Pd2O4,-2.591705555,0.310859806666667 -Li2Pt1_187_10046.vasp,Li2Pt1,-1.760639436666667,0.80993782 -Ba5La1_1_2201.vasp,Ba5La1,0.1020073599999999,0.8462912749999982 -Li1Rh1S2_1_9781.vasp,Li1Rh1S2,-2.6546090475,0.5856659449999997 -Cu2P4S3I2_6_5223.vasp,Cu2P4S3I2,-2.150411557272728,0.1540115504283154 -Ge6P2_191_6965.vasp,Ge6P2,-2.5602720675,0.0809586474999999 -Mg2Sn3O8_10_10519.vasp,Mg2Sn3O8,-4.1811244038461535,0.2634541365384621 -Ca1Ge1Br1O1_1_2837.vasp,Ca1Ge1Br1O1,-2.8025334325,0.4797675843749994 -Na2Cd2P2O8_11_12019.vasp,Na2Cd2P2O8,-4.005659305,0.2185736910714286 -Cs2Cd4Se2S6Br6_31_4696.vasp,Cs2Cd4Se2S6Br6,-0.8445815905,0.3236768534583326 -Li4Bi4O8_57_10164.vasp,Li4Bi4O8,-3.88427552625,0.0523853912499996 -Mn1Sb1Br2N1_6_10855.vasp,Mn1Sb1Br2N1,-2.259380134,0.0736838395000005 -Te1Ir1S1_1_18294.vasp,Te1Ir1S1,-2.4888740466666666,0.2775546 -Dy2Br6_162_5520.vasp,Dy2Br6,-2.29690298625,0.0544627824999999 -Ag2Hg2Se2Cl2_26_302.vasp,Ag2Hg2Se2Cl2,0.06636187375,-0.200576455625 -Ga4As20_26_6539.vasp,Ga4As20,-2.767070435833333,-0.0597615541666689 -Al1In1Te2S1_1_682.vasp,Al1In1Te2S1,-1.979949046,0.3068347644999997 -Sb2Te8Pt3_164_15745.vasp,Sb2Te8Pt3,-1.3859911423076925,0.4988857450769212 -Ni2Sb1Se2_187_13602.vasp,Ni2Sb1Se2,-1.2003130560000002,0.1360514116666654 -Fe1Co2O6_12_5662.vasp,Fe1Co2O6,-3.651342172222222,-0.2554805452083402 -Ti1Cr1I1Br1O2_25_18770.vasp,Ti1Cr1I1Br1O2,-4.243929748333334,0.0471329527777741 -Ni2Se2_164_13642.vasp,Ni2Se2,-0.4560695525,0.3400980524999994 -Co2I2_164_3925.vasp,Co2I2,-0.3174444775,0.5086941183333327 -Ru2I8_14_15326.vasp,Ru2I8,-0.433200552,-0.0244700436249995 -Pr4I10_11_14563.vasp,Pr4I10,-1.8078690228571428,0.0606572235714286 -K2H6N2O8_4_9150.vasp,K2H6N2O8,-3.3628072716666666,0.8467549533888847 -In2H8C2Se2O14_2_8468.vasp,In2H8C2Se2O14,-4.457940682142857,0.0681905080505884 -Au4O4F8_2_1577.vasp,Au4O4F8,-0.79511399,0.4784479198784711 -Sc2F6_26_16073.vasp,Sc2F6,-4.2903427775,-0.2891720675 -Pb1I2_164_14188.vasp,Pb1I2,-0.63575293,0.0847528361111111 -Rb2H6S6N2O2_1_14860.vasp,Rb2H6S6N2O2,-3.446775018888889,0.1704007622482559 -Li2B2C4O8F4_59_9831.vasp,Li2B2C4O8F4,-5.540501129,0.122407276249989 -In2I6O18_147_8480.vasp,In2I6O18,-2.7498347434615384,0.0701579673076921 -P2Au2Se6_2_13959.vasp,P2Au2Se6,-1.775971689,0.0678891569999982 -In6Te6_2_8712.vasp,In6Te6,-1.3053159616666667,0.0796930583333332 -Ta2S2_129_17852.vasp,Ta2S2,-5.447659365,0.3204611812499944 -Ge3Se5Br1Cl1_1_6922.vasp,Ge3Se5Br1Cl1,-2.134410496,0.1718884434479166 -Ag2Cl4O12_4_249.vasp,Ag2Cl4O12,-2.0096827994444446,0.2948303558333314 -K2B2C8O16_51_8983.vasp,K2B2C8O16,-5.960331495,0.1287704487969869 -Ag1I2_115_85.vasp,Ag1I2,0.5602187433333333,0.2014795506250003 -Ag1Sn2S3I2_6_137.vasp,Ag1Sn2S3I2,-1.3327568325,0.184432708333333 -Sn3P4O14_2_16922.vasp,Sn3P4O14,-5.107906403333333,0.0870368370237999 -Sn1H4_123_16644.vasp,Sn1H4,-2.4442634080000003,0.894859683 -Ba2Hf1S4_123_1999.vasp,Ba2Hf1S4,-2.653958052857143,1.6621252185714257 -Cu2Te1O4_21_5322.vasp,Cu2Te1O4,-2.429309955714285,0.5497404717857135 -Ni3Se5I1Cl1_1_13726.vasp,Ni3Se5I1Cl1,-0.894598756,0.2265150811874995 -Nb2Te2Pd4Se2_51_12912.vasp,Nb2Te2Pd4Se2,-2.612205679,-0.2856413774545484 -Ba8C4_59_2205.vasp,Ba8C4,-1.651071625,1.3387169063888826 -Fe6Sb10I6O18_2_6097.vasp,Fe6Sb10I6O18,-3.35005796175,-0.1336792247500042 -Ga2S1Br1_8_6436.vasp,Ga2S1Br1,-1.8429978025,0.2670736699999998 -Ir1Se1Br1_156_8760.vasp,Ir1Se1Br1,-2.1334673033333336,-0.0968180998611145 -Mn1W1N2Cl2_6_10932.vasp,Mn1W1N2Cl2,-4.348041151666666,-0.0169633681250056 -K1Ga1Cl4O12_2_8899.vasp,K1Ga1Cl4O12,-2.589026054444444,0.2150212711111092 -Ta3B2H2O2_187_17939.vasp,Ta3B2H2O2,-6.242858641111111,0.6918139274444335 -Sr4Te4H8O16_14_17478.vasp,Sr4Te4H8O16,-4.1935850946875,0.0532746975 -Fe1H4C2Br2N4_47_5690.vasp,Fe1H4C2Br2N4,-4.480210786923077,0.055185792852556 -Ti2Se2I2_59_19022.vasp,Ti2Se2I2,-3.4992042983333334,-0.6405734925000024 -Hf1Zr3O8_1_7418.vasp,Hf1Zr3O8,-6.845977994166667,0.4881373379166671 -Sc7C2Cl10_12_16276.vasp,Sc7C2Cl10,-3.561397837368421,0.0883677826315789 -Sr4Te8P4F4_14_17485.vasp,Sr4Te8P4F4,-2.6265197445,0.1517652615000006 -As2Pb1Se4_164_1248.vasp,As2Pb1Se4,-2.358617827142857,0.0599612245535697 -Ti3H2N2_187_19086.vasp,Ti3H2N2,-6.63020398,-0.1115713042857189 -Ta2H2C1O2_164_17743.vasp,Ta2H2C1O2,-6.216228041428572,0.3624585037856951 -La2W2Cl2O8_31_9622.vasp,La2W2Cl2O8,-5.663525156428571,0.0421339871428578 -Te4O10_4_18598.vasp,Te4O10,-3.55136809,0.1557915050000002 -Li2Ni2P2O8_51_10026.vasp,Li2Ni2P2O8,-4.069812330714286,0.3352750422142833 -Ta2O3_12_17813.vasp,Ta2O3,-6.991833688,0.5165178108000004 -Sb8O16_26_15871.vasp,Sb8O16,-4.2294053429166665,0.1886715241666667 -Al4Cl4_57_1066.vasp,Al4Cl4,-1.66846449375,0.6625356304166647 -Hg2C2S2O6F6_2_7950.vasp,Hg2C2S2O6F6,-3.178130972777778,0.1922095406944415 -Zr1N2_164_21336.vasp,Zr1N2,-5.966900796666667,1.1791023122222164 -Si2Sb2Te6_1_16444.vasp,Si2Sb2Te6,-1.867603112,0.3017393559999999 -Sc2Cl6_59_16067.vasp,Sc2Cl6,-2.7517690575,0.1372558862500001 -Ru1Cl2_164_15266.vasp,Ru1Cl2,-1.94634111,0.1587636772222205 -Nb1Te2_164_12602.vasp,Nb1Te2,-3.2708744366666664,0.1180459244444445 -Cu2Sb2O4_26_5264.vasp,Cu2Sb2O4,-2.9402457275,0.7704152228125003 -Ta3Se6_2_17992.vasp,Ta3Se6,-4.55385535,0.1412237916666665 -Fe1S1F2_25_5742.vasp,Fe1S1F2,-2.026014,-0.1079982929687519 -In1Ag1P2Se6_149_8181.vasp,In1Ag1P2Se6,-2.147528875,-0.0750752519999999 -Ba2N1_115_2031.vasp,Ba2N1,-2.320809473333333,0.3621675299999998 -Ga2I2_129_6390.vasp,Ga2I2,-0.7674526375,0.1754420641666655 -Ga1Cl2_115_6148.vasp,Ga1Cl2,-1.3441735966666668,0.3791968749999999 -Pd1C6N2F6_25_14351.vasp,Pd1C6N2F6,-4.677497306,0.402090693249997 -Er2I6_162_5562.vasp,Er2I6,-1.54413735375,0.05615468125 -Te8Mo3W1_25_18701.vasp,Te8Mo3W1,-2.3479084166666664,-0.0035132412499997 -Mg10Co2_26_10326.vasp,Mg10Co2,0.0336933091666666,-0.0140471492708332 -Hf1Br2_187_7131.vasp,Hf1Br2,-3.01279574,0.1492043455555525 -Te4Au2_14_18571.vasp,Te4Au2,-0.341545105,-0.1591684395833333 -B3W4S2F2_164_1743.vasp,B3W4S2F2,-4.7339314,0.5185933925757484 -P4Pb3_5_14096.vasp,P4Pb3,-2.4689029085714287,0.4491538379591804 -In2Ni1S4_164_8490.vasp,In2Ni1S4,-2.119758622857143,0.0916876573809509 -Ru2Br2O2_59_15299.vasp,Ru2Br2O2,-2.9256282833333334,0.4176202477777748 -Ca8C4_1_3260.vasp,Ca8C4,-1.6324132975,1.4748141116666604 -Sr3Bi3_25_17356.vasp,Sr3Bi3,-0.4396673433333333,0.8178083536858962 -Fe1Cl2_187_5659.vasp,Fe1Cl2,-1.00541304,0.664864216666667 -Cr2Ag2As4S12_13_4293.vasp,Cr2Ag2As4S12,-2.5345989775,0.3499604248437474 -Te8As8O4_1_18689.vasp,Te8As8O4,-2.6836471445,0.2204156534999974 -Te2Au2_164_18373.vasp,Te2Au2,-0.0857151825,0.342921465 -Fe3B2H2_187_6045.vasp,Fe3B2H2,-2.6330138271428574,0.7685427124999928 -Ca2B6H10O16_4_2947.vasp,Ca2B6H10O16,-5.450029255294118,0.1213995162254844 -Na4As4S8_29_12364.vasp,Na4As4S8,-2.679555475625,0.3857581643749999 -Ni3Te4_10_13735.vasp,Ni3Te4,-0.4017552214285714,0.2507106971428572 -Fe2Br6_162_5822.vasp,Fe2Br6,-0.6478784725,0.1272977781249999 -Cr2F4_14_4381.vasp,Cr2F4,-3.25743219,0.0282149233333306 -Be4P2_59_2288.vasp,Be4P2,-3.0662157766666667,0.5440042189583306 -Sr2Mg2_164_17273.vasp,Sr2Mg2,0.5831951325,0.6246343168749999 -Pd2Cl4_14_14416.vasp,Pd2Cl4,-0.8312321533333332,0.0442339111111111 -H2W4S2N3_164_7045.vasp,H2W4S2N3,-5.105841685454545,-0.9922283866161696 -W2C1O2_164_20471.vasp,W2C1O2,-6.249991958,0.1619994771836672 -Ir2Se2Cl2_11_8835.vasp,Ir2Se2Cl2,-2.314998038333333,-0.100477030972226 -Nb2Pt2Se10_51_12825.vasp,Nb2Pt2Se10,-3.010115795714285,0.0742244181547524 -Nb1Br5_47_12484.vasp,Nb1Br5,-1.5465805333333331,0.2169285758333334 -Al1Se1Br7_1_733.vasp,Al1Se1Br7,-0.9436558566666666,0.0842895499999991 -Y4F6_12_20820.vasp,Y4F6,-4.670932895,0.3346535249999953 -U4Te2_1_19740.vasp,U4Te2,-5.332851095,1.2714031683333342 -Sn1Cl2_115_16624.vasp,Sn1Cl2,-1.2595726166666668,0.3190873416666666 -Na2H6C6O6_4_12118.vasp,Na2H6C6O6,-5.2722047775,0.1651798422083168 -Cr1Co2O6_8_4146.vasp,Cr1Co2O6,-4.226877281111111,-0.5976993307638967 -Mn1Ge1Se1S1I1Br1_1_10749.vasp,Mn1Ge1Se1S1I1Br1,-1.82762181,0.2889957405555552 -Nb2Ni4Te2Se2_51_12789.vasp,Nb2Ni4Te2Se2,-2.028419217,0.0056954053913017 -In2Ge2Se2_164_8451.vasp,In2Ge2Se2,-2.3097378666666666,-0.316469083333335 -Zr2Te2P1_156_21706.vasp,Zr2Te2P1,-2.91279922,1.234925326 -K2O2F2_2_9271.vasp,K2O2F2,-1.7303626416666666,0.3736568004166648 -Ru2Se2_6_15361.vasp,Ru2Se2,-2.6817789025,0.76365793375 -Mg1Cl2_164_10351.vasp,Mg1Cl2,-2.011313046666667,0.0557144983333328 -Mn3H2N2_156_11387.vasp,Mn3H2N2,-3.9426007857142857,-1.6331831210714325 -Ti1Se2_123_18850.vasp,Ti1Se2,-4.038151433333334,0.4343304216666661 -Si2C4O4_47_16396.vasp,Si2C4O4,-5.5930405180000005,1.499437394 -Na1N1O2_25_11905.vasp,Na1N1O2,-4.1843404525,0.252376795 -Zr2C2F2_164_21542.vasp,Zr2C2F2,-5.228490838333333,0.6030474795833276 -Bi8S8O4_2_2694.vasp,Bi8S8O4,-2.7867830555,-0.5318370481666685 -Li1Ni1Sb2Se6_5_9766.vasp,Li1Ni1Sb2Se6,-1.815458496,0.3186699956666641 -Zn2Sb4Cl4O6_31_21151.vasp,Zn2Sb4Cl4O6,-2.830808134375,0.1225806303125001 -Mn1Mo1S3I2_1_10798.vasp,Mn1Mo1S3I2,-2.0466247257142856,0.3891123643749974 -Ge1Ir1I2O2_1_6676.vasp,Ge1Ir1I2O2,-2.622373608333333,0.4838846087499971 -Al4S4I4_14_1086.vasp,Al4S4I4,-2.4276124608333336,0.0861313018055529 -Zr1Nb1I2_8_21347.vasp,Zr1Nb1I2,-2.627203,0.51337584875 -Sn4O4_29_16947.vasp,Sn4O4,-3.60558860625,0.1310567762499999 -Ca4As2_59_3205.vasp,Ca4As2,-1.4053776233333333,0.5383068355555538 -Cu2F2_51_5091.vasp,Cu2F2,-0.6908806325,0.6790216874999999 -Si6N6_12_16534.vasp,Si6N6,-6.151592394166666,-0.686084795416666 -Li2Co2P2O8_162_9864.vasp,Li2Co2P2O8,-4.568262604285715,0.2276272295238046 -Li1Te6As2Pd1_5_9796.vasp,Li1Te6As2Pd1,-1.698228604,-0.2084313431666682 -Fe1Ni1H12C14N8_10_5723.vasp,Fe1Ni1H12C14N8,-5.771398325,-1.9441602007407444 -W2Br10_6_20458.vasp,W2Br10,-0.9501241441666668,0.534567165763889 -Mn2I2N2_59_11109.vasp,Mn2I2N2,-2.967495051666667,0.1564791795833275 -Yb4Te10O26_2_20891.vasp,Yb4Te10O26,-4.4532099695,-0.1250603161458365 -Ga1Ir1S1Br2O1_1_6206.vasp,Ga1Ir1S1Br2O1,-2.496293946666667,0.3442365726666544 -Fe1O1_123_5729.vasp,Fe1O1,-2.56751882,0.9782065185416644 -Li8H6Br2O6_11_10285.vasp,Li8H6Br2O6,-3.805874726818182,0.1575282545454546 -Co2Sb4S6I4_11_4016.vasp,Co2Sb4S6I4,-1.8851391075,-0.447279429114586 -In2Ru1_123_8536.vasp,In2Ru1,-1.4969200066666666,0.610234218888887 -Ge1Pb1Se1S1_6_6689.vasp,Ge1Pb1Se1S1,-2.489422015,0.0164601092708284 -Na3P1S4_81_12355.vasp,Na3P1S4,-2.59488036875,0.2712465043749996 -V2Mo2S8_25_20107.vasp,V2Mo2S8,-3.7163383341666663,0.0442003916666666 -Sn2Cl4_11_16763.vasp,Sn2Cl4,-1.4727897833333332,0.1058701750000001 -In2Br6_162_8392.vasp,In2Br6,-0.94022219375,0.0421061649999999 -Rb4Re4S4O12_14_14979.vasp,Rb4Re4S4O12,-4.656767784166667,0.156693280104158 -Ge4P4Se4_17_6937.vasp,Ge4P4Se4,-3.154674205833333,0.1275200191666643 -Pb2S2Cl2_59_14272.vasp,Pb2S2Cl2,-1.6557057883333333,-0.3520376492708352 -Ge1Bi2Te4_164_6651.vasp,Ge1Bi2Te4,-1.7515866557142858,-0.2139791814285729 -Ni1Pd1I2_6_13397.vasp,Ni1Pd1I2,0.1670738775,1.774980603125 -Ce1Ge5_47_3645.vasp,Ce1Ge5,-2.938613316666667,-0.0794559572222251 -K1In2Br6_143_8912.vasp,K1In2Br6,-0.7942373077777778,0.2673588543055546 -Na4Si2O10_4_12421.vasp,Na4Si2O10,-4.066669564375,0.4459230715624998 -Nb2Te2N1_164_12909.vasp,Nb2Te2N1,-5.062439536,-0.0289195433333335 -Mo1W1I1O4_1_11552.vasp,Mo1W1I1O4,-4.493873747142858,0.4491295409391433 -Ni2Pt3Se8I2_1_13578.vasp,Ni2Pt3Se8I2,-1.340728622,0.2265135363333328 -Tl1Zn1Pd1Au2S7Br3_1_19357.vasp,Tl1Zn1Pd1Au2S7Br3,-1.0963524526666668,0.3203209122499992 -Mn2Te4P2Cl2_26_11323.vasp,Mn2Te4P2Cl2,-1.887431824,0.4864175869444403 -Li2Mg1H4S2O8_2_9968.vasp,Li2Mg1H4S2O8,-4.374795384117647,0.0974493733578315 -As2Pd1_123_1265.vasp,As2Pd1,-2.3955850466666666,0.4870651599999998 -Au1O2_187_1436.vasp,Au1O2,-0.9738417666666668,1.1021459185416638 -Mn2Sb2S4Cl2_10_11240.vasp,Mn2Sb2S4Cl2,-2.419173982,0.2147223684166646 -Sb2Cl2_12_15567.vasp,Sb2Cl2,-1.5172903575,0.2567265499999983 -In2Ni2S5_164_8497.vasp,In2Ni2S5,-1.873349601111111,0.1640999553703686 -Sm2I6_59_16578.vasp,Sm2I6,-1.63780754875,0.02833446375 -W2F4_14_20493.vasp,W2F4,-3.2041236633333336,1.0198337241666624 -Nb2Pt1S6_12_12822.vasp,Nb2Pt1S6,-4.164029542222222,0.0939940388888889 -Sr2H8I4O4_53_17243.vasp,Sr2H8I4O4,-3.2650351955555554,0.034453398703701 -Nb1Sn1Se1S1Br2_1_12589.vasp,Nb1Sn1Se1S1Br2,-2.4930497283333333,0.3954201011111016 -Tl2I4_10_19437.vasp,Tl2I4,9.800166666666668e-05,0.1651495506249999 -P4Au2Se3Cl2_6_14070.vasp,P4Au2Se3Cl2,-1.8414104881818183,0.2907219293181778 -Nb3Br8_156_12956.vasp,Nb3Br8,-2.553007359090909,0.0886724504545455 -Cs2Sb2C12Cl10_31_4785.vasp,Cs2Sb2C12Cl10,-3.596730918846154,0.9336804807051218 -Ta1Te1S1_156_17624.vasp,Ta1Te1S1,-4.428673086666667,0.1556348919444445 -Zn1Au1I2O1_5_20897.vasp,Zn1Au1I2O1,-0.263854736,0.3331580517499999 -Ba2Cd1In1Au1S5_99_1941.vasp,Ba2Cd1In1Au1S5,-1.749874947,0.5111323886875001 -Na2Co2P2_12_12060.vasp,Na2Co2P2,-2.431582403333333,0.0685278284722198 -Ba2Th2Br12_51_2070.vasp,Ba2Th2Br12,-2.428894830625,0.06174430625 -Ag3Sb1S4_156_501.vasp,Ag3Sb1S4,-1.02237759125,0.5831771511718751 -Au2N6_49_1497.vasp,Au2N6,-4.06616588,0.4584802593750003 -Hf1Te1Mo1Se2I1Br2_1_7318.vasp,Hf1Te1Mo1Se2I1Br2,-2.25125349,0.4309941911979101 -Ir1Ru1Cl4O2_65_8753.vasp,Ir1Ru1Cl4O2,-2.47559830375,0.1265738087499985 -Tl2Co2Te5_156_19400.vasp,Tl2Co2Te5,-1.0328968944444443,0.3051651696296287 -Ni3As2Se8_164_13693.vasp,Ni3As2Se8,-1.5096268146153844,0.366017948999998 -Li6Te2H2S8_11_10279.vasp,Li6Te2H2S8,-2.830880443888889,0.108579239166664 -Tl2I2_129_19434.vasp,Tl2I2,-0.1884984075,0.2497144 -In2Br6_26_8395.vasp,In2Br6,-0.833960575,0.14836778375 -Ge2Sb1S6_162_6836.vasp,Ge2Sb1S6,-2.880724597777778,0.1486124451041611 -Sb16F4_10_15423.vasp,Sb16F4,-2.2438006325,0.2617841313333304 -Zr3N2F2_187_21772.vasp,Zr3N2F2,-5.927684455714286,0.1639189803571357 -V13S26_2_19744.vasp,V13S26,-3.7701522107692313,-0.0151933774358972 -Rb2B2H6Se2O6_4_14773.vasp,Rb2B2H6Se2O6,-3.487128076111111,0.909028218593745 -Re2Br2_129_15031.vasp,Re2Br2,-2.74579204,1.3227944130555522 -Al2Bi4Se4Br2Cl8_2_770.vasp,Al2Bi4Se4Br2Cl8,-1.8728879315,0.0820619865000003 -V1H5C4O6_2_19858.vasp,V1H5C4O6,-5.253631668125,0.221069680164923 -Cu1As1Cl3O1_1_4834.vasp,Cu1As1Cl3O1,-1.62182609,0.2256230266666668 -Cu2S2N2F2_31_5249.vasp,Cu2S2N2F2,-2.43672123125,0.1009524622135418 -K2B2H6S2N8_51_8989.vasp,K2B2H6S2N8,-4.4908295635,-0.984413962250002 -Hf1W1Br2O3_1_7364.vasp,Hf1W1Br2O3,-4.920254118571428,0.1121167487450884 -Tl2Sn1As2S6_147_19544.vasp,Tl2Sn1As2S6,-2.3983122545454547,0.0895991327272724 -Ge4S4_57_6943.vasp,Ge4S4,-3.0804923625,-0.8293445087499998 -Cs2Ru2N2Cl8O4_7_4774.vasp,Cs2Ru2N2Cl8O4,-2.4454382688888887,0.2160170545833241 -Nb1Zn1Ni1Sn1H2O8_1_12616.vasp,Nb1Zn1Ni1Sn1H2O8,-4.147289513571429,0.1541108398958234 -Os1W1I6_5_13827.vasp,Os1W1I6,-0.9814334725,0.3530705578385416 -Ag1Sb1Te6As2_143_120.vasp,Ag1Sb1Te6As2,-1.420322029,0.2481078714166649 -Li8P8_14_10287.vasp,Li8P8,-3.18483470375,0.1976164868749998 -Y1V1Cu1F6_1_20685.vasp,Y1V1Cu1F6,-3.3790645544444446,0.4760534694444405 -Ca1H2S2_1_2845.vasp,Ca1H2S2,-3.169728452,-0.0523418445000001 -Ba2Bi1_25_1917.vasp,Ba2Bi1,-0.26173654,0.912656558888888 -Rh2O4_127_15208.vasp,Rh2O4,-3.152378335,0.9782615233333328 -Cd2Si1S4_21_3578.vasp,Cd2Si1S4,-1.5973010942857144,0.4897449778571405 -Mn1Ge1S2I1Br1_1_10742.vasp,Mn1Ge1S2I1Br1,-2.05314079,0.2018230490104164 -Rh2O6_7_15209.vasp,Rh2O6,-3.3639548125,0.5733160303125002 -Ir3Pd1O8_10_8852.vasp,Ir3Pd1O8,-3.733789685833333,0.4751081720833338 -Hf1I1Br1_156_7193.vasp,Hf1I1Br1,-2.6398372066666664,0.3039970262962936 -Sc4I2Cl1O4_1_16246.vasp,Sc4I2Cl1O4,-4.579585224545455,0.254617028740516 -K1W2S2I6_47_8961.vasp,K1W2S2I6,-1.6154363254545456,0.1679558940909056 -Cu4P40_2_5437.vasp,Cu4P40,-3.699315226363636,0.0548960286363637 -Zn2Cu1As2O8_2_21068.vasp,Zn2Cu1As2O8,-3.3223029615384614,0.1837493814423028 -In18S9_143_8171.vasp,In18S9,-1.6745126207407408,0.6887985292592572 -Lu2Se2I2_59_10318.vasp,Lu2Se2I2,-2.41421834,0.4328350900000002 -Pd2Se2I2_59_14487.vasp,Pd2Se2I2,-0.96725744,-0.1036049383333334 -Hg4Br8_115_8070.vasp,Hg4Br8,0.5765434208333333,0.1496260875 -Rb2Ru2C2Br8O4_59_14921.vasp,Rb2Ru2C2Br8O4,-2.563052586111111,0.3121486345370329 -Os1Br2_187_13793.vasp,Os1Br2,-1.0635601966666666,0.9259317733333292 -Ni2H2O2_59_13509.vasp,Ni2H2O2,-2.2528278900000003,1.435227330972218 -Mn1Mo1I1Br1O3_1_10793.vasp,Mn1Mo1I1Br1O3,-3.300546091428572,0.100224549571423 -Re6S8I2_2_15128.vasp,Re6S8I2,-4.620017735625,0.070654175625 -Sb4O6_18_15783.vasp,Sb4O6,-4.116042885000001,0.1414475824999996 -Na2Cd2Sb2S6_39_12020.vasp,Na2Cd2Sb2S6,-1.94109353,0.0841000004166647 -Hf4O8_11_7802.vasp,Hf4O8,-6.632554005,1.1549398933333332 -In1Ga1P2Se2S4_1_8255.vasp,In1Ga1P2Se2S4,-2.753308561,0.1496656787881888 -Fe2S10_31_5928.vasp,Fe2S10,-2.232696755,0.0443086021874998 -Rb2Hg4S2Br6O6_31_14868.vasp,Rb2Hg4S2Br6O6,-1.608169032,0.0908183998333289 -Ta1Te2_10_17627.vasp,Ta1Te2,-3.15727365,0.590609718888889 -Te4W2_127_18634.vasp,Te4W2,-1.635928388333333,1.4089695633333332 -Sr2Cl4_51_17185.vasp,Sr2Cl4,-2.148442175,0.3490555783333331 -Ni2Ir2S8_2_13534.vasp,Ni2Ir2S8,-2.510006703333333,-0.043523941458335 -Nb2Cl5_1_12684.vasp,Nb2Cl5,-2.7598939757142857,0.4774415432142824 -Rb2C2O6_11_14786.vasp,Rb2C2O6,-4.726093204,0.1395212015 -Ag2Te1Se1I2_1_452.vasp,Ag2Te1Se1I2,-0.06493385,0.2940858280555552 -Gd2I2_164_6617.vasp,Gd2I2,-1.712921895,0.1002060612499999 -Ta3H2N2_187_17962.vasp,Ta3H2N2,-6.708717215714286,0.305089458809519 -Na2Sn1S6F6_147_12305.vasp,Na2Sn1S6F6,-1.973726378,0.8052018150833338 -Ba2Fe2Ge2_129_1981.vasp,Ba2Fe2Ge2,-1.322612151666667,0.9157558116666644 -Cs2Zr12B2I24_53_4797.vasp,Cs2Zr12B2I24,-2.0951235305,0.2020915762499936 -Cd2O2_164_3525.vasp,Cd2O2,-1.2811758475,0.2739860158333336 -Mg1Bi4O8_1_10343.vasp,Mg1Bi4O8,-3.69611041,0.1244636411538387 -Cd1Hg4C6S6Br4N6_38_3363.vasp,Cd1Hg4C6S6Br4N6,-3.3076072222222224,0.1120766849614157 -Au4Se2S12_14_1591.vasp,Au4Se2S12,-1.4761025172222224,0.3533687813194424 -Sb1W1S2I1Br1_6_15525.vasp,Sb1W1S2I1Br1,-2.1955438983333333,0.5491146574999985 -Rb2C2S6_2_14791.vasp,Rb2C2S6,-3.111520371,0.3031224469374975 -Ag1Sn1H6_2_132.vasp,Ag1Sn1H6,-2.00261259375,1.302337625208335 -Na2H6C8N2O2_51_12120.vasp,Na2H6C8N2O2,-4.7689146895,-0.2314178785000007 -Na1B12_191_11825.vasp,Na1B12,-4.580034009230769,1.127810017476917 -Sb2Pb6_191_15648.vasp,Sb2Pb6,-0.37834019375,1.1886911643750002 -Ni1O1F1_156_13381.vasp,Ni1O1F1,-1.9376885266666664,-0.1337720514583361 -Zr2Ti2S8_28_21723.vasp,Zr2Ti2S8,-4.684664303333333,0.2794286537499997 -Mg8Ti8_59_10605.vasp,Mg8Ti8,-2.722193221875,0.6764582039583336 -Ga1Si2Ni7P1C1Se1S2Cl5_1_6282.vasp,Ga1Si2Ni7P1C1Se1S2Cl5,-1.579734663,0.3327019724599918 -P2Se2_12_14052.vasp,P2Se2,-2.8775662725,0.1913692221874998 -Hg2Au2Se2Br2_26_7930.vasp,Hg2Au2Se2Br2,0.28289837125,0.4525733015625 -Ge4Sb4Te4_17_6946.vasp,Ge4Sb4Te4,-2.154118560833333,-0.1503383033333354 -Fe2Si2Bi1O9_8_5989.vasp,Fe2Si2Bi1O9,-4.836350985,0.1085420529017759 -B3Mo4S2F2_164_1737.vasp,B3Mo4S2F2,-3.809258413636364,0.566742876212113 -Bi2O3_6_2486.vasp,Bi2O3,-3.534597246,0.3233969820000002 -La1Be5_1_9561.vasp,La1Be5,-2.55658034,0.6832162378205101 -In2Te3_150_8632.vasp,In2Te3,0.443180926,1.822550562 -Nb2F10_51_12709.vasp,Nb2F10,-3.814583263333333,0.2602646033333333 -Hf2S1I1Br1O1_6_7561.vasp,Hf2S1I1Br1O1,-4.4715011250000005,0.1901567410416631 -Sb8Br4O10_14_15861.vasp,Sb8Br4O10,-3.440131685,0.1250353290909092 -Sr2Ag1Te2F2_38_17115.vasp,Sr2Ag1Te2F2,-1.64947288,0.6621495719047581 -Nb2Sn2P2_129_12896.vasp,Nb2Sn2P2,-3.5609346916666667,-0.3337238516666688 -Al2Se2F2_31_964.vasp,Al2Se2F2,-3.2889145083333333,0.1268456372222191 -Al2Tl2F8_51_1024.vasp,Al2Tl2F8,-3.296509026666667,0.1196976083333329 -As1Pb2S6_162_1160.vasp,As1Pb2S6,-2.2394439688888887,0.4111354334220628 -Hf2Au2_129_7434.vasp,Hf2Au2,-2.6356692925,0.2481947250000002 -Nb2Se4Br4_2_12881.vasp,Nb2Se4Br4,-2.7233699170000003,0.0662238979999996 -Y2F6_59_20731.vasp,Y2F6,-4.98589085125,0.2179290900000001 -Tl2Br4_10_19382.vasp,Tl2Br4,-0.4607770116666667,0.1072767020833333 -Cs2Hg4S8Cl6_31_4733.vasp,Cs2Hg4S8Cl6,-0.8582597959999999,0.2423490025625003 -Hf2Te2As1_164_7629.vasp,Hf2Te2As1,-4.391486414,0.0558833419999995 -Ag4Br8_13_506.vasp,Ag4Br8,0.1785105766666666,0.11233813 -Ta1Nb2C1S1Br3O1_8_17580.vasp,Ta1Nb2C1S1Br3O1,-4.663898013333334,0.2823962431498943 -Al2Ni1S4_164_897.vasp,Al2Ni1S4,-2.91317666,0.1658791750595221 -K1Ge1S2_156_8902.vasp,K1Ge1S2,-2.13366942,0.44902686921875 -Zr1Ti1Te4_10_21480.vasp,Zr1Ti1Te4,-3.273199925,0.1468869624999997 -Rb2Os2C2I8O4_59_14907.vasp,Rb2Os2C2I8O4,-2.4435550566666664,0.3395880763888868 -Mg1Te2H2_1_10409.vasp,Mg1Te2H2,-1.962537146,0.9295438563333334 -H4C4N20O4_14_7065.vasp,H4C4N20O4,-5.8708570121875,-0.0664812042708331 -Pd2S8_12_14480.vasp,Pd2S8,-2.180012732,0.2578285102500002 -Hf1Zr1S2I4_8_7392.vasp,Hf1Zr1S2I4,-2.68935263125,0.2785288077083334 -Cr2Te6_11_4533.vasp,Cr2Te6,-1.668251815,0.1819792283333335 -Li2Mg1S2O8F4_2_9972.vasp,Li2Mg1S2O8F4,-3.659048876470589,0.1911812333823498 -Pd2O2_164_14444.vasp,Pd2O2,-1.881275115,0.7586739425 -Na2S2F2_1_12287.vasp,Na2S2F2,-2.290154428333333,0.0472600247916646 -Li4V2P8O26_2_10241.vasp,Li4V2P8O26,-5.504890563,0.0593157845499998 -P16Br4_10_13907.vasp,P16Br4,-3.258347758,0.0541587656666644 -Mn1H2O2_164_10763.vasp,Mn1H2O2,-4.135473364,0.6573913060000001 -Cu3Se2Br2_1_5387.vasp,Cu3Se2Br2,-0.4750572271428571,0.1624606986054407 -Ge2Sb1S1_1_6835.vasp,Ge2Sb1S1,-2.8277677125,-0.5880581112500002 -Ta4V2Zn4O16_13_18138.vasp,Ta4V2Zn4O16,-5.382472513846154,0.1656935169230664 -Mo2C1Se2_12_11585.vasp,Mo2C1Se2,-4.0459570540000005,0.1085191639999996 -Pb2Cl4_12_14240.vasp,Pb2Cl4,-1.420589205,-0.1346368233333332 -Y1Te2_115_20682.vasp,Y1Te2,-2.7272478,0.4048997761111077 -P2H2Pb4N4O18_31_13979.vasp,P2H2Pb4N4O18,-4.474158558,0.2037638809199865 -Mn1Ga1S2Br1Cl1_1_10721.vasp,Mn1Ga1S2Br1Cl1,-2.2010632416666667,0.1668363822916626 -K2Nb2F12_1_9264.vasp,K2Nb2F12,-3.71225481,0.0068564637499997 -Li4O12_13_10210.vasp,Li4O12,-3.47996519375,-0.5003089284375 -Fe2As2S4I2_26_5782.vasp,Fe2As2S4I2,-2.107561891,-0.1814510540416681 -Fe1O2F2_164_5730.vasp,Fe1O2F2,-2.259249194,0.3570444332499976 -K4In4P8Se24_14_9467.vasp,K4In4P8Se24,-2.3077447305,0.0833742499999998 -Zr4B3O2_164_21805.vasp,Zr4B3O2,-5.889276565555556,0.2896181894444387 -Cu3Si1S2Cl4_1_5391.vasp,Cu3Si1S2Cl4,-1.4209288839999998,-0.0578852104999998 -Hg2I2N2_59_7970.vasp,Hg2I2N2,-0.2024668783333333,0.8342068041666659 -As2Se3_164_1305.vasp,As2Se3,-2.537692912,0.0683321030000003 -H4Au2C4I2N2_1_7053.vasp,H4Au2C4I2N2,-3.987878797857143,0.3741815666071326 -Cu1Au1I1Cl1_8_4838.vasp,Cu1Au1I1Cl1,0.20176226,0.3529504543749998 -Zr1F2_164_21284.vasp,Zr1F2,-4.008649746666666,0.4915571366666625 -Hf1Zr1Te2S1_8_7404.vasp,Hf1Zr1Te2S1,-4.12000941,-0.0033770979999991 -Mn1V1I1Br1O2_1_10922.vasp,Mn1V1I1Br1O2,-3.2891552733333334,0.0524490664583328 -Al2Br6_189_778.vasp,Al2Br6,-1.41304388125,0.2475642637500001 -Zr1Nb1I2N3_1_21345.vasp,Zr1Nb1I2N3,-5.009229344285714,0.1815806536745929 -Nb6Ge2Se12_26_13191.vasp,Nb6Ge2Se12,-4.0943912485,-0.0468115792500061 -Tc4Cl10_13_18245.vasp,Tc4Cl10,-2.671887072857143,0.4990562261904702 -Al1Se4_8_739.vasp,Al1Se4,-2.10240276,0.5279039116666668 -Sb2Te2I2_59_15717.vasp,Sb2Te2I2,-1.198805745,0.1545068216666665 -Re6Se8F2_2_15131.vasp,Re6Se8F2,-4.466165906875,0.0514975537499999 -Ta2Te8I2_12_17925.vasp,Ta2Te8I2,-2.249963384166666,0.1986198716666667 -Cd2Au2Se2F2_26_3463.vasp,Cd2Au2Se2F2,-0.2693460025,0.15153255372 -Fe3Te4_164_6072.vasp,Fe3Te4,-1.183667622857143,0.5233867699999979 -Hg1H2S2_5_7868.vasp,Hg1H2S2,-1.94599584,0.0756114754999999 -Mo2I2_129_11623.vasp,Mo2I2,-0.9457789275,1.397633745416667 -Mn2W2O8F2_129_11339.vasp,Mn2W2O8F2,-4.863111665,0.0597822260714244 -Sn2C2Cl2_59_16752.vasp,Sn2C2Cl2,-2.5584544366666666,0.5017467649999994 -Cs2Cd4Se2Cl6O6_31_4693.vasp,Cs2Cd4Se2Cl6O6,-1.6621666155,0.23885143625 -Ti1Te2_115_18857.vasp,Ti1Te2,-3.1115926233333333,0.518614635 -Cu2As4Se3I2_6_5024.vasp,Cu2As4Se3I2,-1.5743068945454546,-0.177461124123381 -Mn1Fe1S1Cl1_25_10710.vasp,Mn1Fe1S1Cl1,-1.571209355,0.596765477499998 -Co1Te2_187_3836.vasp,Co1Te2,-1.4569655533333332,0.1871377544444445 -Pd1Br2_187_14348.vasp,Pd1Br2,-0.1030645033333333,0.46843096 -Sc1P2Au1S6_149_15973.vasp,Sc1P2Au1S6,-3.131791133,0.0767001217499978 -Yb1F2_164_20855.vasp,Yb1F2,-3.83107478,0.2613458300000006 -Zn2In4S8_10_21114.vasp,Zn2In4S8,-2.0943951071428573,0.0493937648571414 -Sb2Rh2Se6_162_15668.vasp,Sb2Rh2Se6,-2.296936382,0.3027982941315766 -Ti2B1Te2_164_18892.vasp,Ti2B1Te2,-4.715591374000001,0.1204429425000004 -Ba2Br2Cl2_129_1925.vasp,Ba2Br2Cl2,-2.2783091316666666,0.192668405 -Cu2Sb4Te3I2_6_5287.vasp,Cu2Sb4Te3I2,-0.9761460027272728,0.6073661809090878 -Sc4Te10O26_2_16264.vasp,Sc4Te10O26,-4.40111752925,0.0764439525 -Hg8As4Cl8_10_8104.vasp,Hg8As4Cl8,0.068195758,0.2611434039999999 -Cu2S5_21_5263.vasp,Cu2S5,-1.3916459,0.5088211349702362 -Ir2F4_65_8784.vasp,Ir2F4,-1.9789940266666664,0.6867127677777758 -Mg6_129_10600.vasp,Mg6,0.0960345433333333,-0.318213865 -Ta4Cl16_12_18018.vasp,Ta4Cl16,-2.9283204125,0.0271730675000001 -Sr4Fe2Br2O6_129_17432.vasp,Sr4Fe2Br2O6,-3.6526357357142856,0.0193894114285715 -Cu2Ag2I8_2_5005.vasp,Cu2Ag2I8,0.4430556791666666,0.1649372874652783 -K2S4Br2F8_1_9332.vasp,K2S4Br2F8,-1.660268165,0.3324438210351562 -Hg1Pb2O2F2_12_7898.vasp,Hg1Pb2O2F2,-2.23661586,0.0497970580952368 -Si4O4_57_16498.vasp,Si4O4,-5.0099747425,0.5449972049999997 -Co2Te2Cl2_59_4033.vasp,Co2Te2Cl2,-1.4954407433333332,-0.1165599886111109 -Co5Pd1S12_1_4091.vasp,Co5Pd1S12,-2.5824409327777778,0.3361335224999973 -Lu2Cl6_162_10306.vasp,Lu2Cl6,-2.8611188225,0.0683992524999999 -Cu1H4C10S4N4Cl2_2_4896.vasp,Cu1H4C10S4N4Cl2,-5.181081944400001,0.3061938387499991 -Pb2Br2N2_59_14218.vasp,Pb2Br2N2,-2.2031421116666667,0.4597677874999974 -Sb2Pb2O6_147_15641.vasp,Sb2Pb2O6,-3.47438012,0.5269035188750002 -Se12N12_7_16282.vasp,Se12N12,-3.5135741858333334,0.5055771135416665 -W2Se2N1_164_20545.vasp,W2Se2N1,-4.652053878,-0.2297466486666666 -Pb4O6_129_14315.vasp,Pb4O6,-3.236985677,0.180019757249997 -Sb4O8_11_15794.vasp,Sb4O8,-4.180096630833334,0.2379802362499994 -Pb1Br2_187_14174.vasp,Pb1Br2,-1.0455987233333337,0.1483252866666666 -Ho1S1_99_8118.vasp,Ho1S1,-3.468838165,0.6213669799999995 -Zr5B1P1Se1S2Br2_8_21859.vasp,Zr5B1P1Se1S2Br2,-4.459995500833333,-0.0478895382291763 -Ni2Se2_129_13640.vasp,Ni2Se2,-0.6716421125,0.1245254924999993 -Bi1H2O2_164_2338.vasp,Bi1H2O2,-3.660171624,0.2406777121666654 -Cr2Ag2As4O12_1_4292.vasp,Cr2Ag2As4O12,-3.847981177,0.2265278759999957 -Ru2Se2_67_15360.vasp,Ru2Se2,-2.10297536,1.3424614762500002 -Zn2Ga2Te5_156_21086.vasp,Zn2Ga2Te5,-0.9023324188888888,-0.3151675755555561 -Zr2N1_164_21606.vasp,Zr2N1,-5.52024023,0.7794848983333289 -W2Se6_11_20555.vasp,W2Se6,-3.132874625,-0.0122822091666665 -In4Se4I4_14_8694.vasp,In4Se4I4,-1.2438711441666668,0.0786591235416664 -Ag1Cl1O4_111_46.vasp,Ag1Cl1O4,-1.9509610266666664,0.3302544799999982 -Ir2Cl8_1_8781.vasp,Ir2Cl8,-1.217906873,0.1699860064999998 -P10S10_26_13900.vasp,P10S10,-3.1924993255,0.3212759566484378 -Ba1Nb2S7_123_1845.vasp,Ba1Nb2S7,-3.87402074,0.4175229894999925 -Ge4O8_14_6935.vasp,Ge4O8,-4.6482441875000005,0.2363880299999996 -Na2Cd4S2Cl6O6_31_12026.vasp,Na2Cd4S2Cl6O6,-2.081686179,0.1618378183124997 -Li2Mn1P2S7F3_1_9989.vasp,Li2Mn1P2S7F3,-3.1382919686666666,0.0572613446791606 -Hf1V1Ge1Mo1Br8O2_6_7347.vasp,Hf1V1Ge1Mo1Br8O2,-2.722070872142857,0.2184231074553528 -Ba2Tl1Cd1Cu1S5_99_2081.vasp,Ba2Tl1Cd1Cu1S5,-1.77659278,0.3489453035833301 -Hf1Nb1S2I1Br3_1_7242.vasp,Hf1Nb1S2I1Br3,-3.03961193125,0.0557506923437506 -Cu2F6_162_5095.vasp,Cu2F6,-0.89794958875,-0.08945283375 -Ca2In2Br6_51_3058.vasp,Ca2In2Br6,-1.480256279,0.2069704690000001 -Mn2In2Te5_156_11129.vasp,Mn2In2Te5,-1.4370531733333332,0.1807133401532551 -In4Te4O12F4_14_8702.vasp,In4Te4O12F4,-3.5750213758333333,0.0469235479166667 -Nb2Co4S6_11_12696.vasp,Nb2Co4S6,-3.4807727491666665,0.2706523419444387 -Ga2Co1Se4_156_6327.vasp,Ga2Co1Se4,-2.1447753914285714,0.1489411542380905 -Cr2Sb2Te6_157_4485.vasp,Cr2Sb2Te6,-1.647865978,0.3035180350999961 -Al2Hg1O4_164_871.vasp,Al2Hg1O4,-4.248935238571429,0.3452597509523788 -Tm2Br2F2_129_19670.vasp,Tm2Br2F2,-2.946344778333333,0.4004936194444416 -Hf4Te4F4_7_7823.vasp,Hf4Te4F4,-3.9973452325,0.3391809020833283 -In1Ir1S1Br2O1_6_8278.vasp,In1Ir1S1Br2O1,-2.315425553333333,0.3922437433796239 -Tl2S2_187_19504.vasp,Tl2S2,-1.332714175,0.26310950609375 -Ca1Pb1S1Cl1_1_2868.vasp,Ca1Pb1S1Cl1,-1.79759055,0.1087181506249999 -Mg1Ge2_164_10368.vasp,Mg1Ge2,-1.9229513066666664,-0.4580712058333333 -Ag2P4S3I2_6_362.vasp,Ag2P4S3I2,-2.0388763300000003,0.1292290526136348 -Ga1Ag1P2Se4S2_1_6117.vasp,Ga1Ag1P2Se4S2,-2.403675355,0.0929446016845211 -Co1B4I2N2F4_47_3703.vasp,Co1B4I2N2F4,-4.108362226923076,0.2766313695031978 -Sb16I4_10_15424.vasp,Sb16I4,-1.7278353725,0.1051036359999988 -V4Bi4O20_14_20308.vasp,V4Bi4O20,-4.307966228571429,0.4411846794642827 -K4Tc2N2O4F10_59_9520.vasp,K4Tc2N2O4F10,-3.277593839090909,0.3024377395201931 -V4Te6_11_20378.vasp,V4Te6,-2.438952726,0.1093812899999999 -Cu2Te3P4Br2_6_5345.vasp,Cu2Te3P4Br2,-1.715148079090909,0.2398629595322766 -Hg2Te2Cl2_59_8028.vasp,Hg2Te2Cl2,0.2321510883333333,0.284170698159721 -Al2Cr1Te4_164_816.vasp,Al2Cr1Te4,-2.078027235714285,0.2302864437499963 -Nb1Si1Te1S1_1_12582.vasp,Nb1Si1Te1S1,-3.818361015,0.4531982751657147 -Mn2As2Se4I2_10_10985.vasp,Mn2As2Se4I2,-1.90364765,0.0926191037499972 -Tl1Cu1As2O6_149_19249.vasp,Tl1Cu1As2O6,-3.204143963,0.6343249619999952 -Ba4S4_2_2174.vasp,Ba4S4,-2.8282524325,0.5646523548437501 -Mo1W1Se2Cl2_6_11554.vasp,Mo1W1Se2Cl2,-2.863824943333333,-0.0191766544444438 -Ru2Cl6_162_15310.vasp,Ru2Cl6,-1.59498983375,0.2485098062500002 -Ag1Sb2F12_2_122.vasp,Ag1Sb2F12,-2.131082664,-0.0094105564666698 -K2Cd4Te2S6F6_31_9072.vasp,K2Cd4Te2S6F6,-1.354240562,0.318078589520831 -Zn2Cr4O10_59_21065.vasp,Zn2Cr4O10,-3.9474962775,0.2165530389062497 -Hf1V1Se2N1_156_7357.vasp,Hf1V1Se2N1,-5.085446954,0.2308751980000005 -As2Se2_2_1303.vasp,As2Se2,-2.452006815,0.254878124166664 -Mn1Zn1Se4_10_10946.vasp,Mn1Zn1Se4,-1.4335260216666663,0.3319849951388874 -Ba2Zr1S4_123_2093.vasp,Ba2Zr1S4,-3.852226097142857,0.2067259100000003 -Li3Sb2P3O12_5_10149.vasp,Li3Sb2P3O12,-4.998033679000001,0.2022347394999948 -Li2F1_164_9899.vasp,Li2F1,-2.6203642166666667,-0.0118738644444469 -Sc4B3_164_16225.vasp,Sc4B3,-3.83160605,0.3428291667857102 -Bi2I6_31_2469.vasp,Bi2I6,-0.26347828125,0.2262757449999999 -Na4Se2O10_51_12418.vasp,Na4Se2O10,-2.900779191875,0.7075345714062503 -Mo2P2Se6_2_11658.vasp,Mo2P2Se6,-2.8067216200000003,0.2481005118749972 -As2Pb2S6F2_7_1259.vasp,As2Pb2S6F2,-2.4767138791666667,0.4521272151504602 -Cu2C4S8F4_2_5073.vasp,Cu2C4S8F4,-3.0663574944444445,0.3826920696064726 -Fe3B2S2F2_187_6047.vasp,Fe3B2S2F2,-2.622821785555556,0.396481743287034 -Pb1C1_156_14176.vasp,Pb1C1,-2.45085103,2.271404735 -Co1Cu1Ni1Te2_8_3731.vasp,Co1Cu1Ni1Te2,-0.42393786,0.713090869666664 -Li4C10O14_13_10168.vasp,Li4C10O14,-5.420140435,0.7341939417857013 -Ga2Te2O8F2_11_6507.vasp,Ga2Te2O8F2,-3.299801187142857,0.5171211896428503 -Sc7Cl10_12_16277.vasp,Sc7Cl10,-2.812903804117647,0.0715146953921546 -Li2Pd1_187_10042.vasp,Li2Pd1,-1.36579023,0.4777059433333332 -Pb2Br8_1_14225.vasp,Pb2Br8,-0.557665047,0.1561033230000002 -Na4Hg2Cl8_11_12393.vasp,Na4Hg2Cl8,-0.9940176171428572,0.1393939389285705 -Cr2Cl6_189_4355.vasp,Cr2Cl6,-1.66198155125,0.02215843125 -Zr1Nb2Br1N2Cl1O1_8_21364.vasp,Zr1Nb2Br1N2Cl1O1,-5.6274773175,0.2586923696874996 -Ti4Zn4Ge8O24_14_19172.vasp,Ti4Zn4Ge8O24,-4.94787078025,-0.0100201534166699 -Si2N2_164_16412.vasp,Si2N2,-6.32478618,-0.8592785812499999 -Ca2Ni2Sn2_129_3079.vasp,Ca2Ni2Sn2,-0.3086765783333333,0.3117099516666666 -Sb1S2_187_15495.vasp,Sb1S2,-2.3385276566666664,0.4344474098958311 -Cu4S4_2_5460.vasp,Cu4S4,-1.14664971625,0.2157539954166667 -Os2F8_14_13849.vasp,Os2F8,-2.540554393,0.0168178535999998 -Li8O2_123_10286.vasp,Li8O2,-2.602842877,0.217166087666667 -Pt2Pb8_125_14648.vasp,Pt2Pb8,-1.0578561519999998,0.5437769110000001 -V2Cl6_162_20038.vasp,V2Cl6,-2.0494567875,0.1827227549999999 -Ag1N1O3_143_88.vasp,Ag1N1O3,-3.373525442,0.1310333420000007 -Zr5Zn1Si1Ni1B1P1Se1Cl5_1_21860.vasp,Zr5Zn1Si1Ni1B1P1Se1Cl5,-3.303034375,0.2650802243117481 -Cs2Hg4Te2S6I6_31_4748.vasp,Cs2Hg4Te2S6I6,-0.3680993025,0.2419227799375006 -Ba1Ge2_164_1833.vasp,Ba1Ge2,-1.4561412433333334,1.265976716666667 -Li4Ni4P4O16_4_10209.vasp,Li4Ni4P4O16,-4.4965496060714285,-0.0914622331428592 -Mg2Te3O8_5_10525.vasp,Mg2Te3O8,-3.854449456153846,0.2094268038461537 -Sr2H4Se4O12_2_17239.vasp,Sr2H4Se4O12,-4.025400593636364,0.0703840305303038 -Cu4H4S4I4_14_5417.vasp,Cu4H4S4I4,-1.3273244575,0.1545143648660698 -W6Se4Cl2O16_6_20595.vasp,W6Se4Cl2O16,-4.2953331467857145,0.910886853708326 -Zr3N2O2F2_5_21773.vasp,Zr3N2O2F2,-6.102459273333333,0.4913227266666609 -Ta1Ag1Ge1S4Cl2_1_17504.vasp,Ta1Ag1Ge1S4Cl2,-2.9477554922222224,0.0744850547916592 -Ge1O2_164_6684.vasp,Ge1O2,-4.798230226666667,0.0864019908333331 -Ga1Ni5F2_123_6222.vasp,Ga1Ni5F2,-0.20155476125,0.3507809103064733 -Te8Cl8_2_18693.vasp,Te8Cl8,-0.9673054525,0.2363902817187499 -Hf2Ti2Te8_6_7654.vasp,Hf2Ti2Te8,-3.4298082358333333,0.2594253116666669 -Sr2Co1O3_123_17189.vasp,Sr2Co1O3,-3.873727395,0.0209257949999974 -H4Au2C6Br2_2_7056.vasp,H4Au2C6Br2,-4.087703219285714,0.3348145574999988 -Mn1S2_115_10852.vasp,Mn1S2,-2.6393918933333333,0.7214527841666665 -Te8As2Pd3_164_18687.vasp,Te8As2Pd3,-1.3300962823076925,0.4154010927692286 -Tl1Ag1As2O6_149_19198.vasp,Tl1Ag1As2O6,-3.168043429,0.439246889500001 -Na4Cu4O4_123_12384.vasp,Na4Cu4O4,-1.7022010908333334,0.7652528342592564 -Bi2I2O2_129_2463.vasp,Bi2I2O2,-2.425826315,0.0477441499999997 -Ca2Cu2_191_3010.vasp,Ca2Cu2,0.5355713475,0.087006295 -Sn2As2S6_7_16728.vasp,Sn2As2S6,-2.62389895,0.1479420773750002 -Ba2H12C8O14_2_1988.vasp,Ba2H12C8O14,-5.231014295833333,0.2017996349999864 -Co1H2_115_3743.vasp,Co1H2,-2.22342371,1.55204914333333 -Li4Ga4Cl16_14_10191.vasp,Li4Ga4Cl16,-1.9680994079166665,0.0731784037500002 -Cu2Hg1I4_10_5153.vasp,Cu2Hg1I4,0.7018696357142857,0.2794393257142857 -Ta2P2O6_162_17820.vasp,Ta2P2O6,-6.015116337,0.6967146979166606 -Li2N2F4_67_10006.vasp,Li2N2F4,-2.65424963375,0.5565996516666623 -Al2Si2Te2_164_988.vasp,Al2Si2Te2,-2.9118863483333333,-0.3780018733333355 -Na2Hg4Te2Cl6O6_31_12171.vasp,Na2Hg4Te2Cl6O6,-1.4417357000000002,0.2274058698749999 -Os2Cl2_5_13841.vasp,Os2Cl2,-2.452797805,0.7688009193750001 -Pb2Cl8_2_14242.vasp,Pb2Cl8,-0.838520701,0.0143608010000001 -Ag4S16_14_540.vasp,Ag4S16,-1.6426691285,0.3153533370625001 -V2S5_12_20167.vasp,V2S5,-3.4109775171428574,0.2062012655357106 -Ti2Te2F2_59_19038.vasp,Ti2Te2F2,-4.09862397,-0.152908471111119 -Li2C2F4_67_9848.vasp,Li2C2F4,-3.1017587825,1.0368350818749996 -Sb2S2O1_1_15680.vasp,Sb2S2O1,-3.054273804,0.2342184318333307 -Ge2Sb2H6N2O6_7_6847.vasp,Ge2Sb2H6N2O6,-4.360187715,0.1198670611573995 -V1Cu1Te6As2_5_19821.vasp,V1Cu1Te6As2,-1.667501432,0.3105225082777746 -Zr1I1F1_156_21309.vasp,Zr1I1F1,-2.847411783333333,0.4168714991666621 -Rb2B2Te2H6S6_1_14776.vasp,Rb2B2Te2H6S6,-2.792516557222222,0.3537338479629567 -Mg1Fe1S2Br1Cl1_1_10361.vasp,Mg1Fe1S2Br1Cl1,-1.902986361666667,-0.0336738768055556 -Ga1As1_156_6134.vasp,Ga1As1,-2.234465185,-0.53490766 -Hf3Bi2Sb1Br1N3O2_1_7689.vasp,Hf3Bi2Sb1Br1N3O2,-5.484493374166667,0.1550330547222068 -Ta1Se1Br1_156_17615.vasp,Ta1Se1Br1,-3.696058966666667,0.3170180958333335 -Mg4Ti2_51_10588.vasp,Mg4Ti2,-1.6354476766666668,0.4922371377777761 -Na2Se4O12_7_12300.vasp,Na2Se4O12,-3.357425473888889,0.192803401388885 -Sr2In1Ag1Hg1O5_99_17262.vasp,Sr2In1Ag1Hg1O5,-2.53330807,0.3119634649999999 -Sn6Bi6_2_16982.vasp,Sn6Bi6,-1.1324901841666668,-2.202767929166667 -In2Si2S2_164_8601.vasp,In2Si2S2,-2.875820935,-0.3593244750000023 -P8_55_14163.vasp,P8,-3.62658371625,0.4194122687500003 -La4Br10_11_9623.vasp,La4Br10,-2.513129636428572,0.1074598049999995 -Ba4Tl4Cu2O12_53_2198.vasp,Ba4Tl4Cu2O12,-2.6045843695454547,0.71503858420454 -Ge1Se2_115_6708.vasp,Ge1Se2,-2.48535124,0.1187816372222219 -Ba4P2_59_2167.vasp,Ba4P2,-1.8920006083333332,0.2625303791666658 -Mg2Ni2Ge2_129_10489.vasp,Mg2Ni2Ge2,-0.9451517983333332,0.4150224866666667 -Ni1C8I2F4_25_13308.vasp,Ni1C8I2F4,-4.304957522666667,0.5092446202499974 -As1Pb2Se6_162_1161.vasp,As1Pb2Se6,-1.79077846,0.4408760393981437 -Mn2Al2S5_38_10953.vasp,Mn2Al2S5,-3.440291618888889,-0.1700122149999996 -Na2Ti2I2N2_59_12326.vasp,Na2Ti2I2N2,-4.27234223375,-0.0379655737499997 -Sc2Te2_164_16178.vasp,Sc2Te2,-2.8738307675,0.3330107025000002 -Fe4N3O2F2_164_6082.vasp,Fe4N3O2F2,-3.1073744545454547,0.8178493246212094 -Nb6Si2Te12_26_13199.vasp,Nb6Si2Te12,-3.4743434100000004,0.0459791563124954 -Ti2S2Br2_59_18995.vasp,Ti2S2Br2,-4.212976675,0.0415344766666665 -Cd2Se2_129_3573.vasp,Cd2Se2,-0.08072489,-0.464192475 -Nb2Co2S6_11_12690.vasp,Nb2Co2S6,-3.899159379,0.2374542299999968 -Tl3Se4_164_19581.vasp,Tl3Se4,-1.2268939785714286,0.1662402324404748 -Hf1Zr1S4I2_1_7394.vasp,Hf1Zr1S4I2,-3.441851145,0.3042789231249949 -Cu2H4C4O8_14_5121.vasp,Cu2H4C4O8,-4.67010662,0.4897422167592532 -Mn1S2F2_12_10851.vasp,Mn1S2F2,-2.360249016,0.3725115797500005 -Tl2Se2_129_19534.vasp,Tl2Se2,-1.1135912175,0.1862884235416666 -U2I6_59_19715.vasp,U2I6,-2.3474694675,0.07421881 -Rh1Br2_187_15145.vasp,Rh1Br2,-0.5397504766666666,0.7474958344444433 -Fe2O2_164_5892.vasp,Fe2O2,-2.8886386525,0.6570866860416644 -Tm1Cu2S2_164_19663.vasp,Tm1Cu2S2,-2.051683268,0.8896754420000001 -Cr2I2N2_59_4411.vasp,Cr2I2N2,-3.4259479416666667,0.06700477833333 -Ag1Ge3Br8_1_67.vasp,Ag1Ge3Br8,-1.1545998316666666,0.101185819739583 -Pd1Cl2_187_14360.vasp,Pd1Cl2,-0.3332999633333333,0.5421661011111111 -Al3Se4_164_1054.vasp,Al3Se4,-2.9166821428571432,0.03472386285714 -Cu2Se4_12_5312.vasp,Cu2Se4,-0.9916694733333332,-0.7755794183333333 -Co2H4Se2O8_7_3918.vasp,Co2H4Se2O8,-3.821794121875,-0.0132708908333357 -Ta4Ni6Te10_31_18073.vasp,Ta4Ni6Te10,-2.280828718,0.0498202619999981 -Cr2As2O10_129_4306.vasp,Cr2As2O10,-4.5071127635714285,-0.0108199838690509 -Li1Tl1Br4O12_2_9803.vasp,Li1Tl1Br4O12,-2.361610456111111,0.190998000069442 -H2Os1_187_6999.vasp,H2Os1,-3.5403701633333333,1.639618963333329 -Ta4N3Cl2_164_18058.vasp,Ta4N3Cl2,-6.608504625555556,0.4725081933333197 -Ag2Au4S4_7_176.vasp,Ag2Au4S4,-0.501165427,0.1267911279999991 -Mn2Cr1O6_12_11061.vasp,Mn2Cr1O6,-4.522661847777778,0.0598765892361022 -Nb4N3F2_164_13095.vasp,Nb4N3F2,-6.551148845555556,0.0279567687407331 -Ge1F2_115_6662.vasp,Ge1F2,-2.7629547366666665,0.3817384350000004 -Cr2Cl10_10_4349.vasp,Cr2Cl10,-1.197855763333333,-0.0073373808333343 -Cd1Te1_156_3436.vasp,Cd1Te1,0.56167619,-0.3076995649999999 -Ca4Mg2Si4O14_113_3219.vasp,Ca4Mg2Si4O14,-5.259394039583333,0.4217571659722163 -V1Mo2O4F2_8_19885.vasp,V1Mo2O4F2,-4.551086078888889,0.0818083237036993 -Mn1Cu1Cl6_1_10683.vasp,Mn1Cu1Cl6,-0.90761253375,0.083506269375 -Ag2Sb4Se3I2_6_417.vasp,Ag2Sb4Se3I2,-1.157923941818182,0.203925155909088 -Cr2O5_12_4442.vasp,Cr2O5,-4.74789504,-0.1385894796428611 -Ni2Sb2Pd2_129_13609.vasp,Ni2Sb2Pd2,-0.8604243933333334,0.3184635208666639 -Te2Pb1_115_18447.vasp,Te2Pb1,-0.8661658766666666,-0.3827487411111114 -Nb1Ga1S2Br2_6_12510.vasp,Nb1Ga1S2Br2,-2.9137739083333334,0.2065386218749965 -Ta2Te2Pd4Se2_51_17906.vasp,Ta2Te2Pd4Se2,-2.8884239220000003,0.0752431749761863 -Hg3Bi1_187_8052.vasp,Hg3Bi1,1.9809558575,0.2565762115948276 -Cu2Sb2Te4_26_5271.vasp,Cu2Sb2Te4,-1.02135876875,0.2945777065624999 -Sr2Mn2Sn2_129_17277.vasp,Sr2Mn2Sn2,-0.7070076916666667,0.7039102275862058 -Al1Se1_156_736.vasp,Al1Se1,-2.140556915,0.8078021300000002 -Si1Hg2S4_21_16342.vasp,Si1Hg2S4,-1.5156097642857145,0.2656075357142835 -C2F6_1_2747.vasp,C2F6,-3.2371474875,0.3783089031249996 -In1Pt5Cl2_38_8322.vasp,In1Pt5Cl2,-1.31114236625,1.1794590833333318 -Be2Sb1_115_2267.vasp,Be2Sb1,-1.5970115566666667,0.6649493241666647 -W2S2_129_20531.vasp,W2S2,-4.1517195725,0.9571062075 -Ga1N1_187_6212.vasp,Ga1N1,-4.30953919,0.6914813400000002 -Cu2As2O6_2_5008.vasp,Cu2As2O6,-3.111804562,0.6284194941249966 -Ga2Se2Cl2_59_6469.vasp,Ga2Se2Cl2,-1.922817215,0.1992341066666665 -Rb4Br2_51_14962.vasp,Rb4Br2,-0.1530355366666666,0.1537608299999998 -Nb3Br3Cl1O4_8_12954.vasp,Nb3Br3Cl1O4,-4.716696325454546,0.153890734886354 -S4I4_2_15397.vasp,S4I4,-0.96869319125,0.1496137243749999 -Ta3Te1Br7_156_17995.vasp,Ta3Te1Br7,-2.9413219372727277,0.0437066482149595 -Np2I2O2_129_13782.vasp,Np2I2O2,-5.94453408,0.0822299949999951 -Cr1Sb1Br2_5_4253.vasp,Cr1Sb1Br2,-1.38251127,0.2959633597916644 -Re1Se2_164_15022.vasp,Re1Se2,-3.83264874,0.3291150983333333 -Al1Ni1S2Br2_25_691.vasp,Al1Ni1S2Br2,-1.8473723233333332,0.1057550856770793 -Zn2Mo2F10_1_21116.vasp,Zn2Mo2F10,-2.3093734685714287,0.1740923254464247 -Cu2Ge2O6_51_5099.vasp,Cu2Ge2O6,-3.622598964,0.297295765749997 -Ga2Fe1O4_164_6347.vasp,Ga2Fe1O4,-4.312340465714286,-0.0745205816071463 -Rh2Se2F2_11_15237.vasp,Rh2Se2F2,-2.333152795,0.0853453150000005 -Cs2Cd4Cl6O8_31_4683.vasp,Cs2Cd4Cl6O8,-1.391899429,0.3416374622500001 -Ge1Au1Se2_8_6639.vasp,Ge1Au1Se2,-1.51683444,0.2666826568220899 -Mg8Si8O24_14_10604.vasp,Mg8Si8O24,-5.62017505525,0.110333392999995 -K2Al4Br14_7_8973.vasp,K2Al4Br14,-1.5517198425,0.0725518929999999 -Te2W1_164_18523.vasp,Te2W1,-2.7137961333333336,0.3311018183333329 -V1P2Au1S6_5_19897.vasp,V1P2Au1S6,-2.934604424,0.1203772216785681 -Cr4P4O20_2_4618.vasp,Cr4P4O20,-5.246407197142857,-0.0827805060119077 -Rh1S2_187_15167.vasp,Rh1S2,-2.530384826666667,0.6503830766666636 -Sc1O2_187_15971.vasp,Sc1O2,-5.222811006666666,0.8414287891666623 -Nb3Ni3S14_6_12990.vasp,Nb3Ni3S14,-3.2390764345000003,-0.228277773593753 -Be1Si2_164_2233.vasp,Be1Si2,-3.34637717,-0.6025585416666697 -Lu4H12O12_14_10323.vasp,Lu4H12O12,-5.046677743571428,0.1169427497619008 -As4S4_14_1360.vasp,As4S4,-2.91890681,0.0909931584374996 -Sr2Co2Si2_129_17192.vasp,Sr2Co2Si2,-2.1560995983333333,0.1514959450000002 -Tl2O2_164_19469.vasp,Tl2O2,-2.0073167125,0.400608477291664 -Au2Br4_14_1457.vasp,Au2Br4,0.3150650883333333,0.1328354004166668 -Al1S1_123_721.vasp,Al1S1,-2.717699075,0.8023758689583307 -Ge1Bi1Br2O2_99_6643.vasp,Ge1Bi1Br2O2,-2.800765801666667,0.1080801584722213 -Zr1Au1Br2O1F2_1_21249.vasp,Zr1Au1Br2O1F2,-2.625321157142857,0.4756580983928551 -P2Pd2S6_162_14023.vasp,P2Pd2S6,-2.707507076,0.1741782567962905 -Sn2Te6_4_16904.vasp,Sn2Te6,-1.29470419125,-0.4909473229166666 -Ce1Al3Cu1_99_3641.vasp,Ce1Al3Cu1,-1.588493066,0.8536313659999999 -Sn4P6O20_11_16953.vasp,Sn4P6O20,-5.0734473226666665,0.1132825477499848 -Ru1S2_164_15292.vasp,Ru1S2,-3.098150656666667,0.5165928716666666 -Nd1Te3_191_13230.vasp,Nd1Te3,-1.768721125,0.8530190062500003 -Ta4Ni4Se8_53_18069.vasp,Ta4Ni4Se8,-3.248534446875,0.0939470896249983 -In2S2F2_59_8547.vasp,In2S2F2,-2.434642783333333,0.1553125700000004 -Na2Ti2As2O1_123_12319.vasp,Na2Ti2As2O1,-4.382126785714286,0.0815562762834674 -Sr4Cu4W2O14_6_17431.vasp,Sr4Cu4W2O14,-3.862243022083333,0.5934423825694327 -Fe2W2I2O8_129_6031.vasp,Fe2W2I2O8,-4.203975379285715,0.1038995067261874 -Cd2Se2F2_59_3570.vasp,Cd2Se2F2,-0.6735750266666667,0.1577498772222208 -Mn1Si1Ge1Te1Se1_8_10882.vasp,Mn1Si1Ge1Te1Se1,-2.642712652,-0.1345423120937531 -Zr3B2Te2H2_187_21746.vasp,Zr3B2Te2H2,-3.9948082822222224,0.4231544133333296 -Hf2B1H2_164_7437.vasp,Hf2B1H2,-5.166061426000001,0.3770789009999946 -Zr1Ni1S1I2_1_21380.vasp,Zr1Ni1S1I2,-1.852781138,0.9031224594166668 -Li2Sn1O6F6_162_10070.vasp,Li2Sn1O6F6,-2.291759220666667,0.9755964384999998 -As1F3_187_1147.vasp,As1F3,-2.2312491225,0.609037876875 -Si2Br6_1_16391.vasp,Si2Br6,-1.48877093375,0.167278976875 -Zn2W2Se2S12_18_21197.vasp,Zn2W2Se2S12,-2.506835067222222,0.377915942828701 -Si2Te2_59_16459.vasp,Si2Te2,-2.3801101175,0.1455778137499996 -Tl2I6O18_147_19438.vasp,Tl2I6O18,-2.4741314257692304,0.1434611242067257 -Cr3O8_164_4570.vasp,Cr3O8,-4.508085835454545,0.0443041901704504 -Sb2Se2_12_15699.vasp,Sb2Se2,-1.9778852225,0.3698924812499977 -Tl4As4S8_4_19588.vasp,Tl4As4S8,-2.301151193125,0.4069815615625001 -Hg1Te2_115_7919.vasp,Hg1Te2,0.1765541866666666,0.3831714244444443 -Mo2Os1Br2Cl2O3_1_11653.vasp,Mo2Os1Br2Cl2O3,-3.138470411,0.2682389239999999 -Mg4Sb2_59_10581.vasp,Mg4Sb2,-0.657166905,0.3934878900694444 -Nb2Bi1Te6Pt1_1_12638.vasp,Nb2Bi1Te6Pt1,-2.492737166,0.2452193622083279 -Cd1Cu1Te2Br2_6_3305.vasp,Cd1Cu1Te2Br2,-0.2124774166666666,0.2485889898611099 -Zr1Zn1H1Pd1O6_1_21492.vasp,Zr1Zn1H1Pd1O6,-3.961982004,0.3189906492708307 -Co2H9C15N6O6_157_3922.vasp,Co2H9C15N6O6,-5.9224913576315785,0.2294952531743303 -Ag2S2I2_59_380.vasp,Ag2S2I2,-0.3468611016666666,0.294118294791666 -Sr1Cu2F12_115_17042.vasp,Sr1Cu2F12,-1.1753082966666668,0.0409344380833318 -Hf1Pd1Cl6_149_7263.vasp,Hf1Pd1Cl6,-2.23428564375,0.0722632951041668 -K6O3_143_9542.vasp,K6O3,-1.3414257144444446,0.1989688755555554 -Hf1Mn1Br2O2_1_7208.vasp,Hf1Mn1Br2O2,-4.149868573333333,0.3852120712500002 -Co2Mo2S8Cl2_129_3933.vasp,Co2Mo2S8Cl2,-2.2974766200000003,0.7267885304813633 -Zr2H2C1_164_21577.vasp,Zr2H2C1,-5.144862028,0.2803104339999995 -In2Te4Pd1_164_8633.vasp,In2Te4Pd1,-1.33500568,0.1045646694117632 -Zn8Se4Cl8O12_14_21241.vasp,Zn8Se4Cl8O12,-2.1235169859375,0.0415081884375001 -Mn2S2Br1Cl1_25_11213.vasp,Mn2S2Br1Cl1,-2.2416570300000003,0.2083827972916663 -Ge2Te1Se1_1_6879.vasp,Ge2Te1Se1,-2.38537399,-0.203606655 -Ir1Cl2_187_8733.vasp,Ir1Cl2,-0.84121542,1.234739838888887 -Te2Ir1_187_18387.vasp,Te2Ir1,-2.02982646,0.4136758999999999 -Co2Te6P2_162_4051.vasp,Co2Te6P2,-1.947878451,0.4585362335000001 -Mg3Si2O9_157_10564.vasp,Mg3Si2O9,-4.732565927857143,0.5133066133035666 -Na2Ti2C2Br2_59_12321.vasp,Na2Ti2C2Br2,-4.31360248,-0.0954464550000002 -Co1F2_115_3733.vasp,Co1F2,-1.8235043,0.4912202624999999 -Sb2Ir2O6_162_15597.vasp,Sb2Ir2O6,-4.119570642,0.4456999752499953 -Ag2Te6As2_2_486.vasp,Ag2Te6As2,-1.058867686,0.2981015723333319 -K8Ba2V4S16_49_9548.vasp,K8Ba2V4S16,-2.749110851,0.1291700010000003 -Si3Sb2S9_174_16479.vasp,Si3Sb2S9,-3.2245813321428574,0.2719164235714251 -Rb4Hg4Sb4Se12_14_14975.vasp,Rb4Hg4Sb4Se12,-1.06941723625,-0.0503648829166676 -Ru2Br8_14_15305.vasp,Ru2Br8,-0.8472112900000001,0.282206153 -Mn1Br2_187_10658.vasp,Mn1Br2,-0.93944742,0.3432199708333334 -Hf3Se1Cl4_191_7729.vasp,Hf3Se1Cl4,-3.59785568625,0.3003334781249964 -Cd1Sn2S2I2_12_3434.vasp,Cd1Sn2S2I2,-1.11328479,0.1091720869047594 -Sc1Nb1Se4_3_15962.vasp,Sc1Nb1Se4,-3.5234277583333333,0.4321037077083298 -Na1Pb2C2O7_187_11926.vasp,Na1Pb2C2O7,-4.7848240675,0.1601481536458306 -Ba4P4H4Se8_14_2169.vasp,Ba4P4H4Se8,-2.8297617195,0.3001678900937465 -Pt1Cl2_164_14569.vasp,Pt1Cl2,-0.5600165133333334,0.5580235483333335 -Hf2Br2_129_7448.vasp,Hf2Br2,-3.1056024125,0.7964163549999999 -Te2As2_12_18359.vasp,Te2As2,-2.0694883575,0.2269385783333306 -V1Cl2_164_19799.vasp,V1Cl2,-2.28232817,0.0652021766666663 -V1Se1O1_156_19927.vasp,V1Se1O1,-4.214275003333333,0.1979963933333333 -H2S1O4_5_7029.vasp,H2S1O4,-4.287746371428571,0.0414787214285716 -Cu4Se12Br4_53_5464.vasp,Cu4Se12Br4,-1.0231968175,0.3061880096666644 -K2Os2N2Cl10O2_2_9280.vasp,K2Os2N2Cl10O2,-2.4949288694444447,0.0237998449999996 -Hf4H2C3_164_7784.vasp,Hf4H2C3,-6.741239442222222,0.1736676962962908 -W2Se2_164_20550.vasp,W2Se2,-4.0470693125,0.2509027575000004 -Ca2Ag1O2F2_38_2905.vasp,Ca2Ag1O2F2,-2.8905988685714283,0.3720974601785658 -Pb4W4O16_53_14324.vasp,Pb4W4O16,-5.103530732916666,0.2574692762500001 -Te2Pt2F2_59_18483.vasp,Te2Pt2F2,-1.66477362,0.5074858083333306 -Li4Bi4S8_29_10166.vasp,Li4Bi4S8,-2.691147031875,0.1515814631249998 -Te4As4_14_18563.vasp,Te4As4,-2.06004093875,0.2363859970833308 -Te4F4_2_18584.vasp,Te4F4,-1.6554857775,0.3476831037499999 -Ca2Co2Si2_129_2989.vasp,Ca2Co2Si2,-2.2419357083333336,0.3168618749999987 -Nb2B1H2O2_164_12629.vasp,Nb2B1H2O2,-5.597535328571429,0.253601151785702 -Hf1Fe1Te2O1_8_7164.vasp,Hf1Fe1Te2O1,-3.557298658,0.6098899630000014 -Ca1Ag1Br1Cl1_6_2789.vasp,Ca1Ag1Br1Cl1,-0.611202515,0.767341069375 -Cd4F8_115_3626.vasp,Cd4F8,-0.9467492575,0.2022160891666666 -Te2W2_164_18534.vasp,Te2W2,-3.40554488,0.6325053762500001 -Ta4Pd2S10_13_18084.vasp,Ta4Pd2S10,-4.485531614375,0.1075506618750004 -Rh2Cl6_162_15185.vasp,Rh2Cl6,-1.39363073125,0.0646523199999999 -Nb1Cu1Br1Cl1O2_1_12494.vasp,Nb1Cu1Br1Cl1O2,-3.51151226,0.2620307584374955 -Ti1C1I2_8_18754.vasp,Ti1C1I2,-3.3250342225,0.5535904893750001 -Be10Rh2_26_2210.vasp,Be10Rh2,-2.8964423016666667,0.608821339166667 -Ni2As2Pd2_129_13447.vasp,Ni2As2Pd2,-1.173084281666667,2.3207656436111064 -Ag1Br2F1_47_35.vasp,Ag1Br2F1,-0.054884935,0.2439960159375 -Sc2Se2_187_16159.vasp,Sc2Se2,-3.20915943,0.5827954874999999 -Tl2S1_164_19495.vasp,Tl2S1,-1.1492945266666668,0.1058421149999999 -Cu1H4C6S2N6_6_4901.vasp,Cu1H4C6S2N6,-5.473199139473684,0.1388666620668744 -Cs2C2S2O6F6_4_4671.vasp,Cs2C2S2O6F6,-3.72548441,0.1360108832175888 -V2O2_6_20126.vasp,V2O2,-4.67300577,0.859824373333329 -Hf2Cl6_2_7481.vasp,Hf2Cl6,-3.25985083,0.0965910649999965 -Mn2Te4P2I2_26_11326.vasp,Mn2Te4P2I2,-1.623069478,-0.35034050675 -Y2Se2F2_164_20777.vasp,Y2Se2F2,-4.407105761666666,0.5258976711111072 -As2S2_129_1292.vasp,As2S2,-2.42780225,0.5820977184374998 -Ga2Te2_187_6510.vasp,Ga2Te2,-1.7921591375,0.1410410783333333 -Ag2Se2_12_437.vasp,Ag2Se2,-0.322199125,-0.0352431174999999 -In18Se9_143_8172.vasp,In18Se9,-1.3991617088888888,0.7133129061111093 -Mn1In1Se4_10_10780.vasp,Mn1In1Se4,-1.9743559433333333,0.1922888369444425 -Nb2Te2I2_59_12908.vasp,Nb2Te2I2,-2.680754241666667,-0.0847915329365135 -Be2Cl4_51_2250.vasp,Be2Cl4,-2.27451425,0.3754891633333335 -Te4Os2_127_18603.vasp,Te4Os2,-1.8549289083333331,0.3469447599999997 -Li2O4F2_113_10034.vasp,Li2O4F2,-2.08115547375,1.178147256875 -K2Fe2Sb2_12_9104.vasp,K2Fe2Sb2,-0.4569747566666666,0.9454321416666652 -In4S4Br4_14_8682.vasp,In4S4Br4,-1.7933039741666663,0.0733341916666669 -Sc2Si1_164_16166.vasp,Sc2Si1,-2.82831024,1.0170488744444413 -Th1Si2_123_18722.vasp,Th1Si2,-4.11689336,0.853976086666667 -Mg3F6_12_10548.vasp,Mg3F6,-3.374461312222222,-0.2538356405555557 -Sr4In4I10_127_17442.vasp,Sr4In4I10,-0.834448015,0.5258536309259247 -Na6H4S2N2O16_11_12442.vasp,Na6H4S2N2O16,-4.2452860543333335,0.0550193753888803 -Sc1Pt1Au1O6_149_15983.vasp,Sc1Pt1Au1O6,-3.585506183333333,0.3218828229166641 -Ir2O2F2_59_8795.vasp,Ir2O2F2,-3.24633517,0.408689238888885 -Ge1Te1W1I3Cl1_1_6714.vasp,Ge1Te1W1I3Cl1,-1.3884556557142855,0.4195253505803541 -Fe2B3_123_5802.vasp,Fe2B3,-3.53158429,0.5410548039999958 -V2C1_164_20023.vasp,V2C1,-4.64464775,0.8636538174999995 -Ta3O5F5_47_17976.vasp,Ta3O5F5,-5.9169928423076925,0.0672975634615333 -Nb2Co4S4_51_12695.vasp,Nb2Co4S4,-3.524819644,0.2099091423333301 -Te2Ir2F2_59_18392.vasp,Te2Ir2F2,-2.21293451,0.7315489608333303 -Ag2I6_162_321.vasp,Ag2I6,0.5820448,0.2176726634375 -Zn1Ga2S4_164_20937.vasp,Zn1Ga2S4,-2.376820867142857,0.1333145671428575 -Cu4S14_14_5440.vasp,Cu4S14,-1.7293809205555557,0.3305122842824055 -Na1Ti1O2_156_11942.vasp,Na1Ti1O2,-5.4587645,0.3517221524999998 -Al1Cl2_164_629.vasp,Al1Cl2,-1.69853176,0.6014747838888868 -Ag1Bi1P2Se6_143_24.vasp,Ag1Bi1P2Se6,-2.142675377,0.0746345699999997 -Sn2As6_164_16731.vasp,Sn2As6,-2.38785288,0.3996908262499998 -Te10Rh5_1_18270.vasp,Te10Rh5,-1.8825040266666664,0.3195145155555554 -H8Au4O4_2_7091.vasp,H8Au4O4,-2.471226618125,1.1327649633333334 -Ba4As4H4Se8_14_2132.vasp,Ba4As4H4Se8,-2.692413865,0.5885741778958281 -Ag2Te3As4I2_6_470.vasp,Ag2Te3As4I2,-1.2234791618181815,0.1946892886363603 -Mg5Ti5_123_10596.vasp,Mg5Ti5,-2.772021521,0.6266299048333335 -Hf1Mn1I2N1_8_7215.vasp,Hf1Mn1I2N1,-3.6278788,0.1938822747758623 -Ca3Mn2Cl2O5_123_3185.vasp,Ca3Mn2Cl2O5,-3.9856285175,0.0769237077083301 -Mn2Te4As2I2_26_11316.vasp,Mn2Te4As2I2,-1.490295864,0.2287247719999964 -Sn2Sb2S6F2_7_16866.vasp,Sn2Sb2S6F2,-2.3682367441666665,0.4096918591666642 -Pt2Se2I2_59_14676.vasp,Pt2Se2I2,-1.286093411666667,0.0992255170833317 -Nb2Br2_129_12651.vasp,Nb2Br2,-2.9766493275,0.8636419009374998 -Hf2S10_59_7558.vasp,Hf2S10,-3.8090210125,0.2159174014583295 -Rb2F1_164_14838.vasp,Rb2F1,-0.7873599466666666,-0.2443553700000003 -Bi2Te4_10_2576.vasp,Bi2Te4,-1.2264717033333332,0.3416208677777763 -As2Pb1S4_164_1247.vasp,As2Pb1S4,-2.7463205442857146,0.3755876404365046 -V4P4O28_14_20351.vasp,V4P4O28,-4.875969797777778,0.2938231652777734 -Ge1Te1_123_6715.vasp,Ge1Te1,-1.75680968,-0.2935683549999999 -Tl2Co1F4_123_19397.vasp,Tl2Co1F4,-2.0136368,0.0232513378571408 -Si4Te4P4_17_16518.vasp,Si4Te4P4,-3.207844510833333,0.2471118474999969 -Ba4Cu4Te8Br4O22_2_2149.vasp,Ba4Cu4Te8Br4O22,-3.283702922142857,0.0918231390674533 -Ag1Sb3Te6_143_125.vasp,Ag1Sb3Te6,-1.2334419090000002,0.3035318464166662 -Na2Hf4Cu2Se10_59_12148.vasp,Na2Hf4Cu2Se10,-3.4750941783333333,0.1244873427777779 -Sn2P2_187_16825.vasp,Sn2P2,-2.58170198,0.1997060431249999 -Nb1As1Br1N2Cl1_1_12463.vasp,Nb1As1Br1N2Cl1,-4.412516915,0.1224011389111037 -Ho1Bi2_21_8114.vasp,Ho1Bi2,-1.7024478533333334,0.1659037472222206 -Sb1Te6Pb2_162_15522.vasp,Sb1Te6Pb2,-1.1857628233333335,-0.2633006148148176 -Fe1Se1I2_8_5753.vasp,Fe1Se1I2,-0.7738998525,0.1669458355468749 -Ca1I2_115_2848.vasp,Ca1I2,-0.9586267866666668,0.3139844779999998 -W4C3_164_20580.vasp,W4C3,-6.1338918200000005,0.5501197199999928 -Sb4S6_81_15819.vasp,Sb4S6,-2.578621541,0.2253715790000003 -Al2O3_164_916.vasp,Al2O3,-5.9183419200000005,0.2051929179999989 -Ta1Ni1I2_156_17587.vasp,Ta1Ni1I2,-1.4542414575,0.4783649659895812 -Hf1Se1Br2_25_7303.vasp,Hf1Se1Br2,-3.0491437025,0.3300288587500004 -Cr3Te4_164_4582.vasp,Cr3Te4,-2.0147540171428573,0.1461086214285676 -Zn1Cd1Sb1Pd1Br1Cl2O3_1_20911.vasp,Zn1Cd1Sb1Pd1Br1Cl2O3,-1.773890767,0.3393110208437445 -B2O3_1_1690.vasp,B2O3,-6.692233482000001,0.1621008933333332 -Fe1H4C2N6Cl2_6_5696.vasp,Fe1H4C2N6Cl2,-4.468103193999999,0.334111716166652 -Cu4H12C8O8_2_5408.vasp,Cu4H12C8O8,-4.5899267196875,0.3870113785937508 -Sc1Mn1I1Br1N1_156_15953.vasp,Sc1Mn1I1Br1N1,-3.05399331,0.2031374110833197 -K4S4O14_13_9506.vasp,K4S4O14,-3.963150957272727,0.1222864231818188 -Ni2S3Br3_1_13592.vasp,Ni2S3Br3,-0.87364208625,0.1012496130468728 -Hf1Fe1H6_156_7161.vasp,Hf1Fe1H6,-3.408655215,0.6939765831250002 -Hf3Te2C2F2_187_7734.vasp,Hf3Te2C2F2,-4.936977571111111,0.8007537008333219 -Re2Te6_11_15092.vasp,Re2Te6,-2.6471100775,0.3860825041666669 -Mn3B2S2F2_187_11357.vasp,Mn3B2S2F2,-3.138916058888889,0.6078345528067095 -Sr2H8O6_26_17246.vasp,Sr2H8O6,-4.341733920625,0.0128292435416672 -Ta4O8_6_18082.vasp,Ta4O8,-7.156574653333333,0.1984960353333266 -Bi12S12_7_2300.vasp,Bi12S12,-2.0034096341666667,-0.7144133875000009 -Pd2S2O8_3_14466.vasp,Pd2S2O8,-2.963099956666667,0.8311820033333328 -I3N1_187_8160.vasp,I3N1,-0.1158902375,0.98159419203125 -Sn1Te2_115_16701.vasp,Sn1Te2,-1.2162437533333332,-0.6684965144444448 -Ga2S2Cl2_59_6440.vasp,Ga2S2Cl2,-2.2596717666666666,0.138899635 -Zr2Sn4_129_21695.vasp,Zr2Sn4,-2.2606799333333334,0.5154059866666665 -Sb1S1O1F1_6_15490.vasp,Sb1S1O1F1,-2.9791287225,0.4337846409375001 -Cd1Br2_115_3286.vasp,Cd1Br2,0.1219045999999999,0.1417884708333333 -Sb2Pb2S6_7_15646.vasp,Sb2Pb2S6,-2.206288394,-0.0167338550625026 -Ru2Se1Cl2O1_1_15350.vasp,Ru2Se1Cl2O1,-2.6379513933333336,0.4541795315277745 -Li2V6Te4O24_2_10136.vasp,Li2V6Te4O24,-4.858257628055556,0.0573487038888886 -Li2Cu2P2O8_18_9891.vasp,Li2Cu2P2O8,-4.391336572857143,0.1583876490178538 -Zn2Co4S10_11_21060.vasp,Zn2Co4S10,-1.997195520625,0.543792746125 -Nb4N3Cl2_164_13094.vasp,Nb4N3Cl2,-6.222015833333334,-0.0487002982804373 -Mn2Al2Te5_187_10959.vasp,Mn2Al2Te5,-2.040653525555556,0.0116190647600986 -Ti2B1H2O2_164_18885.vasp,Ti2B1H2O2,-5.768950088571429,0.6154026257142813 -Os8S10_1_13898.vasp,Os8S10,-3.8198148077777776,0.7433577654166612 -Sb1O2_115_15471.vasp,Sb1O2,-3.804515763333333,0.61356110375 -Ta2Ni4Te2Se2_26_17805.vasp,Ta2Ni4Te2Se2,-2.310162517,0.0334095768000006 -Hf2Pb4_59_7557.vasp,Hf2Pb4,-2.150848081666666,0.6569783050000001 -B2As2_129_1648.vasp,B2As2,-3.9849540625,0.8019086487499962 -Ta4F16_14_18034.vasp,Ta4F16,-4.274144157,0.2736490417999991 -Mg2W8O18_2_10539.vasp,Mg2W8O18,-5.285905466428572,0.7920616399854163 -As1S2_187_1173.vasp,As1S2,-2.482121693333333,0.887104880312497 -Re1N2_187_15012.vasp,Re1N2,-6.620964076666667,-0.137666086388895 -Y2I2_164_20746.vasp,Y2I2,-2.6667929925,0.1884421983333308 -P4S10_31_14107.vasp,P4S10,-2.995779405714285,0.1942380314285716 -Ca2Mg2_164_3062.vasp,Ca2Mg2,0.48131084,0.652578845625 -Te2Ru2F2_59_18515.vasp,Te2Ru2F2,-2.252141351666667,0.5478032222916634 -Na2Ca2B10H32O34_2_12015.vasp,Na2Ca2B10H32O34,-5.101996713125,0.0396619452118018 -K1Pb1Se2_156_8927.vasp,K1Pb1Se2,-1.2686002325,0.4655960883854164 -Tl2Te6P2_147_19559.vasp,Tl2Te6P2,-1.440418234,0.3341318729999986 -Pd2Pt1S4Cl1_1_14454.vasp,Pd2Pt1S4Cl1,-1.73467781375,0.396067948515625 -Mn2As2I2O4_26_10966.vasp,Mn2As2I2O4,-3.12609316,0.0891538042631505 -Si1I4_123_16346.vasp,Si1I4,-0.3405900659999999,0.5480732160000001 -As6H2O12_4_1382.vasp,As6H2O12,-4.3843007335,0.0566418923999956 -Si2H2_164_16404.vasp,Si2H2,-3.7059833875,0.2019710050000001 -V2Sb2Te6_157_20176.vasp,V2Sb2Te6,-1.919088653,0.2689290111666647 -As8O12_51_1398.vasp,As8O12,-4.1270202985,0.3582172735000002 -Ge1Pb1_156_6690.vasp,Ge1Pb1,-1.308113405,0.4424674674999999 -Cu1S2F2_164_4956.vasp,Cu1S2F2,-1.469822722,0.3555704137500003 -Ta2Pd1S6_12_17825.vasp,Ta2Pd1S6,-4.360291831111111,0.0820378788888893 -Bi2Br10_3_2428.vasp,Bi2Br10,-0.5696930625,0.0890410183333327 -Cr3O8_12_4572.vasp,Cr3O8,-4.837141392727273,-0.2847513671022774 -Ag4Hg4S4Br4_51_525.vasp,Ag4Hg4S4Br4,-0.000879934375,0.110092771875 -Zr2Nb1Zn1I1Br1N3Cl1O2_1_21613.vasp,Zr2Nb1Zn1I1Br1N3Cl1O2,-4.6713508975,0.353247524979155 -Os1S1Cl1_8_13815.vasp,Os1S1Cl1,-2.92068794,0.3946953108333302 -Pd2Cl2_129_14412.vasp,Pd2Cl2,-0.31625736,0.7523288983333334 -Y2Ga2Cl2_164_20734.vasp,Y2Ga2Cl2,-3.36170895,0.0889361329166633 -Mn2O4_59_11179.vasp,Mn2O4,-4.333260693333333,0.1315490349999999 -Ge2Se2_31_6875.vasp,Ge2Se2,-2.75667141,0.1436219350000001 -Li2Mg2_164_9981.vasp,Li2Mg2,-0.6756273575,1.3553409625 -Fe2P2Se6_162_5923.vasp,Fe2P2Se6,-2.490185664,0.4725669338333316 -K2Li4H6O6_11_9211.vasp,K2Li4H6O6,-3.909038656111112,-0.0108002227777821 -Mn1Zn2Ge1H3O8_1_10948.vasp,Mn1Zn2Ge1H3O8,-3.711447409333333,0.2320527452638859 -Os2F2_5_13847.vasp,Os2F2,-3.29489612,0.5116295003749998 -Zr1Pd1Cl4O2_10_21398.vasp,Zr1Pd1Cl4O2,-2.72486138,0.3525316712499999 -Au2S4I2_17_1527.vasp,Au2S4I2,-0.92663905125,0.1323133127083323 -Ir2Se2Br2_11_8833.vasp,Ir2Se2Br2,-2.1365863833333334,-0.0999371798611143 -Ca2H8C8O16_2_3037.vasp,Ca2H8C8O16,-5.001362986470588,0.5974675565686225 -Sb6Pd3_147_15855.vasp,Sb6Pd3,-1.7720544111111112,0.4822223805555556 -V2Pb2Cl2O6_11_20143.vasp,V2Pb2Cl2O6,-4.2126200725,-0.0022501499131983 -Li1Fe1P2S6_149_9696.vasp,Li1Fe1P2S6,-3.096645933,-0.1757925844280357 -Zr3H2C2S2_187_21763.vasp,Zr3H2C2S2,-5.251579916666667,0.3347211897685016 -Y1V1F5_47_20686.vasp,Y1V1F5,-3.692939288571429,0.6841890997618971 -Ga2Te2F2_31_6501.vasp,Ga2Te2F2,-2.174445205,0.1415576832962923 -Al4Bi20_26_1058.vasp,Al4Bi20,-1.0379913541666668,-0.2449378808333351 -Na2Ni1F2_123_12231.vasp,Na2Ni1F2,-1.6382526160000002,1.2310908079999998 -V2Cu2P4O12_4_20050.vasp,V2Cu2P4O12,-4.711334645,0.5247556749999895 -Sc1Te6P2Au1_149_16020.vasp,Sc1Te6P2Au1,-1.908351386,0.3166612209999943 -Au2Cl6_191_1476.vasp,Au2Cl6,0.2681935,0.4460965025 -Li2Mg1H4Se2O8_2_9969.vasp,Li2Mg1H4Se2O8,-4.131710447647059,0.061290885980388 -Dy2S2Br2_59_5530.vasp,Dy2S2Br2,-3.553095785,0.0382890133333333 -Zn3P1_191_21208.vasp,Zn3P1,0.8678675575,0.38989954890625 -Cs2C6Se6N6_13_4681.vasp,Cs2C6Se6N6,-4.763942346,0.147742040499985 -Tc6F18_164_18260.vasp,Tc6F18,-3.8500530354166655,-0.1302527801041663 -K2H8Cl2O4_2_9158.vasp,K2H8Cl2O4,-3.540870440625,0.0695086995833333 -Te1As2Se2_164_18284.vasp,Te1As2Se2,-2.328990332,0.1193283695 -Rh2F6_12_15190.vasp,Rh2F6,-2.10298963625,0.1103289800000002 -Zr2S2Br1Cl1_1_21642.vasp,Zr2S2Br1Cl1,-3.6442976616666662,0.2852507791666629 -V1Ga1Ag1Br2N2_6_19832.vasp,V1Ga1Ag1Br2N2,-2.731678722857143,0.4274371923214172 -Sb4P2H2O12_4_15795.vasp,Sb4P2H2O12,-4.7653892805,0.1269387561666626 -Pt2Cl6_162_14617.vasp,Pt2Cl6,-0.7689278975,0.2287379166666666 -Rb2Cd4Te2S6Br6_31_14827.vasp,Rb2Cd4Te2S6Br6,-0.8501588345,0.2239807331666642 -Bi8C4_26_2683.vasp,Bi8C4,-2.5837101575,0.4329769758333306 -Si8O12_14_16548.vasp,Si8O12,-5.778758045,0.2891784819999934 -In8Se4_31_8719.vasp,In8Se4,-1.3288147166666666,0.7836598983333315 -Ga1Cu1Sb2Te6_149_6175.vasp,Ga1Cu1Sb2Te6,-1.214566362,0.368486891666665 -Li2H2Pd1_123_9929.vasp,Li2H2Pd1,-2.45114196,0.0366986879999995 -Ca2Au1Se2F2_38_2940.vasp,Ca2Au1Se2F2,-1.962513862857143,0.5657340264285671 -Sb8O20_14_15872.vasp,Sb8O20,-3.959029700714286,0.3480304935714287 -Ni1H4I2N6_47_13355.vasp,Ni1H4I2N6,-3.7264326115384616,0.1974709782692234 -Zn2Te2Mo2S12_18_21181.vasp,Zn2Te2Mo2S12,-2.1908177516666667,0.3766396037546273 -Pd2I4_2_14436.vasp,Pd2I4,-0.0309454933333333,0.2602634741666666 -Mg2Zn1_123_10540.vasp,Mg2Zn1,0.8506521766666667,0.3404870550000001 -In2O3_164_8513.vasp,In2O3,-3.771577234,0.2671607382499998 -Zn2H10C16O10_2_21091.vasp,Zn2H10C16O10,-5.605453136842105,0.1782487893420968 -Mn1Nb1Te1Se1_99_10816.vasp,Mn1Nb1Te1Se1,-2.958487105,0.4617578233638653 -Co2I2_2_3926.vasp,Co2I2,-0.3125576025,0.5135809933333326 -Mn1Si1H2O4_1_10883.vasp,Mn1Si1H2O4,-4.6649948075,0.7342629537499996 -Fe2Se2I2_59_5974.vasp,Fe2Se2I2,-1.0469778916666663,0.1047988995833333 -Sn3As2S9_174_16908.vasp,Sn3As2S9,-2.4863929935714286,0.4504420237499973 -Cu2N2Cl2O2_31_5189.vasp,Cu2N2Cl2O2,-2.51815698375,0.2552748718750002 -Zr4Tl4F20_14_21858.vasp,Zr4Tl4F20,-3.750221214285714,0.0532403853571392 -B8Te6_31_1795.vasp,B8Te6,-3.276091077142857,0.9180944176190442 -Fe1Co1O4_10_5660.vasp,Fe1Co1O4,-3.63215868,-0.0869494555208361 -Sc2I2_2_16094.vasp,Sc2I2,-1.7362374475,0.238670668333331 -Zn2S1I1_6_21141.vasp,Zn2S1I1,0.2396012575,0.41708366553125 -Sn1Se2_164_16695.vasp,Sn1Se2,-2.01388946,0.1321826866666664 -Pt2F2_129_14619.vasp,Pt2F2,-0.3965229475,1.809627236875 -Y1P2W1S6_5_20658.vasp,Y1P2W1S6,-3.905618537,0.3668341367500001 -K3Sn4Au1_25_9405.vasp,K3Sn4Au1,-0.24232634875,-0.12455819 -Nb4N3_164_13097.vasp,Nb4N3,-7.122292688571428,0.4170052519047553 -Bi2Cl2_11_2444.vasp,Bi2Cl2,-1.10953703,-0.0103853916666676 -Hf2Mo2Br3N1Cl1O3_3_7534.vasp,Hf2Mo2Br3N1Cl1O3,-4.628336646666667,0.3071423224218708 -Nb2O5_6_12799.vasp,Nb2O5,-6.619747882857142,-0.1525728780357164 -Sc2Sb2Te8_2_16150.vasp,Sc2Sb2Te8,-2.024409635833333,0.2900474790277736 -Ti1S1I1Cl1_6_18835.vasp,Ti1S1I1Cl1,-3.12009833,0.1917731134374998 -Mg1Br2_115_10346.vasp,Mg1Br2,-1.3598218266666666,0.1781487377777777 -Ta2Te8Ir2_11_17926.vasp,Ta2Te8Ir2,-3.0308131583333338,0.0947284624999995 -Cr4N3Cl2_164_4608.vasp,Cr4N3Cl2,-4.28814174,-0.1126378698765472 -Zr1O2_191_21388.vasp,Zr1O2,-3.695216406666667,3.487772736666667 -Mg1Mo6O16_156_10388.vasp,Mg1Mo6O16,-4.938311106086957,0.2740494849999904 -Sb2S2_164_15682.vasp,Sb2S2,-2.3419249625,0.3753304829166646 -V2Br4_11_20007.vasp,V2Br4,-1.764063515,-0.0177486816666667 -K4S4O8_13_9507.vasp,K4S4O8,-3.490316245625,0.1949548011718753 -Co2S2I2_59_3979.vasp,Co2S2I2,-1.7264333833333334,-0.026533503680557 -Zr1Fe1H6_156_21291.vasp,Zr1Fe1H6,-3.183327565,0.7457375200000003 -Mo12Cl24_127_11481.vasp,Mo12Cl24,-2.2329919661111117,0.0648442416666665 -Ta1Cl2_115_17524.vasp,Ta1Cl2,-3.239677873333333,0.7045464916666606 -Na2Zr1H6S6_147_12343.vasp,Na2Zr1H6S6,-3.288558512666667,0.1232981274999998 -Ca2Bi4O8_26_2955.vasp,Ca2Bi4O8,-3.7776361485714287,0.2546203960714286 -In1H2_115_8271.vasp,In1H2,-1.9202480633333328,2.14045613333333 -Ga1S2_115_6262.vasp,Ga1S2,-2.56912817,0.3014505382291639 -Sb2Os2Se6_162_15620.vasp,Sb2Os2Se6,-2.685858494,0.3928828824999976 -Cd1O2_164_3386.vasp,Cd1O2,-1.22737548,0.928453694305554 -Ti1Se1I1Br1_6_18846.vasp,Ti1Se1I1Br1,-2.6659230175,0.2355888099999981 -Bi4I4O16_29_2614.vasp,Bi4I4O16,-3.1467622483333333,0.0185121345833336 -Ge1C1_187_6657.vasp,Ge1C1,-4.67911744,0.4655330775000001 -Si1Sn2As1O8_5_16372.vasp,Si1Sn2As1O8,-4.535041739166666,0.3583469330208295 -In1Ir1I3Br3_1_8277.vasp,In1Ir1I3Br3,-0.82354143125,0.0888564387499999 -As2Au2O6_2_1186.vasp,As2Au2O6,-2.877019235,0.7090709686666604 -K1Cr1H4C4O10_10_8892.vasp,K1Cr1H4C4O10,-5.2275363065,0.0207329160416569 -Au2I2_129_1490.vasp,Au2I2,0.691720435,0.17799751375 -Au2Se1Cl2O1_1_1533.vasp,Au2Se1Cl2O1,-0.5766383266666667,0.3856766157499957 -Na2Hg4S6I6O2_31_12157.vasp,Na2Hg4S6I6O2,-0.758855866,0.2805398129166651 -Sb1Cl2_187_15447.vasp,Sb1Cl2,-1.25544322,0.3487236324999985 -Au2Se2_164_1550.vasp,Au2Se2,-0.17221756,0.50390272 -Mn2Cl6_162_11054.vasp,Mn2Cl6,-1.45593080125,0.0608732043749999 -Sr1Ca2S2Br2_8_17036.vasp,Sr1Ca2S2Br2,-2.6912664185714283,-0.2181016457142877 -Fe2As2Pt2_129_5778.vasp,Fe2As2Pt2,-1.6216628249999998,0.8831764470833317 -Al2Sn2Te2_164_995.vasp,Al2Sn2Te2,-1.8522146633333332,-1.1841877000000007 -Tl2Ge2Se6_162_19428.vasp,Tl2Ge2Se6,-1.937548498,0.2162827618333313 -Na1Ga1Te6P2_5_11871.vasp,Na1Ga1Te6P2,-1.808519038,0.2425250358333318 -Cd1I2_164_3367.vasp,Cd1I2,0.5527418166666667,-0.0027669461111111 -Li2C4O2_31_9852.vasp,Li2C4O2,-5.32595182875,0.9660859446875 -Nb2Te4Cl4_12_12920.vasp,Nb2Te4Cl4,-2.526237834,0.1986431317380899 -Ba4Ga2Bi2Te10_31_2154.vasp,Ba4Ga2Bi2Te10,-1.7756686727777775,0.2323021752777742 -Cd12P8_115_3264.vasp,Cd12P8,0.077080239,0.1781388715000031 -Cs2Os2S2N2Cl10_11_4762.vasp,Cs2Os2S2N2Cl10,-2.2928311794444443,0.0038911259027709 -Bi4Se6_11_2646.vasp,Bi4Se6,-1.94880528,0.1595064299999999 -Os2S2I2_59_13868.vasp,Os2S2I2,-2.6159838116666667,0.3873926035416626 -Li1Ta1Ni1Br2N1O2_1_9794.vasp,Li1Ta1Ni1Br2N1O2,-3.935900415,0.6164346646527714 -Cl4_55_3694.vasp,Cl4,-0.032813785,0.1704613975 -Mn2Bi2S4F2_26_11010.vasp,Mn2Bi2S4F2,-2.447616115,0.2302919090000008 -Bi1S2O6F1_1_2372.vasp,Bi1S2O6F1,-3.943768063,0.2304964180833297 -Rb4Cl2_51_14967.vasp,Rb4Cl2,-0.3678730083333333,0.1725292549999995 -Ho2I2O2_129_8140.vasp,Ho2I2O2,-4.481408798333333,0.0513550000000009 -Sb2Te6Au2_12_15734.vasp,Sb2Te6Au2,-0.8547397200000001,0.2102725951249996 -V2I6_162_20100.vasp,V2I6,-0.94807941375,0.10315084875 -K2V2Cu4Se8_28_9386.vasp,K2V2Cu4Se8,-1.66354698,0.187090553125 -Cr3C2_187_4552.vasp,Cr3C2,-4.66949071,0.5913502575000003 -K2B2C2S2_31_8981.vasp,K2B2C2S2,-3.2148831275,1.392749020694439 -W3C2S2_187_20559.vasp,W3C2S2,-5.800884924285714,-0.0963832542857185 -Hf1Mo2S8_164_7236.vasp,Hf1Mo2S8,-3.4036633454545453,0.607442533579539 -Y3N2_187_20804.vasp,Y3N2,-6.38813821,0.0471810369999958 -Mo1Cl5_47_11508.vasp,Mo1Cl5,-1.22564618,0.3010115820833334 -Cd2Sb2Cl2O4_11_3553.vasp,Cd2Sb2Cl2O4,-2.463764929,0.1794151030000002 -Re12Se12Cl12_18_14985.vasp,Re12Se12Cl12,-3.7476807977777775,0.072012016666664 -Ti2I2_164_18957.vasp,Ti2I2,-3.1929615075,0.5032481812499998 -Ta2Fe4Te6_11_17737.vasp,Ta2Fe4Te6,-2.1581877533333333,0.2637127263888866 -Mo2C1_164_11586.vasp,Mo2C1,-4.103977426666667,1.0124361508333335 -Nb4Te10Pd6_59_13162.vasp,Nb4Te10Pd6,-2.5206098185,-0.0378095165869584 -Co1H14C14N2O8_2_3738.vasp,Co1H14C14N2O8,-5.50373052051282,0.2904829997222138 -Hf2S2N1_164_7572.vasp,Hf2S2N1,-6.3869778660000005,0.0854350989999992 -Cu1Cl2_164_4869.vasp,Cu1Cl2,-0.3190430066666667,0.1701120966666666 -W1Au2O4_1_20411.vasp,W1Au2O4,-3.3670982985714284,0.5426691082142816 -Ti3V1I1N1O3F4_1_19116.vasp,Ti3V1I1N1O3F4,-5.348081108461538,-0.1779275175160316 -Li4Br2_51_10167.vasp,Li4Br2,-1.777235838333333,0.2853185238888871 -Sb2As2O8_11_15530.vasp,Sb2As2O8,-4.312591364166667,0.1228155962499957 -Fe2Se2_129_5978.vasp,Fe2Se2,-1.2993533275,0.0840395099999999 -V3W1S8_25_20296.vasp,V3W1S8,-3.96084198,-0.0264731925000001 -Lu2Co2Ge4_129_10307.vasp,Lu2Co2Ge4,-2.7876047925,-0.2282596237500027 -Ru1Br2_187_15262.vasp,Ru1Br2,-0.95081302,0.7719703772222206 -Cu1Te1Se1O1_1_4991.vasp,Cu1Te1Se1O1,-1.68758046,0.3341939335937501 -Ge2F2_164_6773.vasp,Ge2F2,-2.8291100575,0.0726537275000002 -V1Cu1Sb2Te6_1_19818.vasp,V1Cu1Sb2Te6,-1.46994118,0.2898784927777763 -Ta4Ni6S10_59_18071.vasp,Ta4Ni6S10,-3.3510567345,-0.0049535350400003 -Nb3H2C2S2_187_12974.vasp,Nb3H2C2S2,-5.574604911111112,0.350120207654309 -Hf1V1Cr1Mo1Se6S2_1_7346.vasp,Hf1V1Cr1Mo1Se6S2,-3.4181403833333337,0.1819263224999967 -K2Sb2Pd2_129_9341.vasp,K2Sb2Pd2,-0.989181555,0.1284432598870043 -Sc1Cl2_164_15919.vasp,Sc1Cl2,-2.741252063333333,0.148235507777775 -Pd2S3I1_8_14473.vasp,Pd2S3I1,-1.48273908,0.3284223150000001 -Li6Br3N1_10_10262.vasp,Li6Br3N1,-2.573584393,0.1851199369999974 -U2Te6_11_19733.vasp,U2Te6,-3.4919873625,0.0697138912499997 -Cu2Te2_164_5338.vasp,Cu2Te2,-0.0943437975,0.4731367374999999 -Co1Ni1Te2Se1Br1_6_3796.vasp,Co1Ni1Te2Se1Br1,-1.151478853333333,0.1111799370833308 -Ir2I2N2_59_8787.vasp,Ir2I2N2,-2.933253408333333,0.4438087241666639 -Hf2Se1Br1N1_156_7593.vasp,Hf2Se1Br1N1,-5.461611024,0.076030540999996 -Sn1Bi2Se4_156_16615.vasp,Sn1Bi2Se4,-2.056499627142857,-0.0322668485714298 -Li1Ni1Pd1Se2_8_9764.vasp,Li1Ni1Pd1Se2,-1.380497018,0.1038531741666641 -Mg4Sn2_164_10584.vasp,Mg4Sn2,-0.4283636283333333,-0.425444755 -Zr4H2C3_164_21823.vasp,Zr4H2C3,-5.993155465555556,-0.0973919400000058 -Hf3B2F2_187_7677.vasp,Hf3B2F2,-5.800391481428571,0.0098603246428523 -Nb2C2Br2_59_12667.vasp,Nb2C2Br2,-5.154576811666667,0.3007949988194387 -I10N2_51_8155.vasp,I10N2,-0.0420030025,0.5625629611458298 -As2Pb2Cl2O6_7_1251.vasp,As2Pb2Cl2O6,-3.5216678333333333,0.1465128054166669 -Zn2Bi8O18_13_21051.vasp,Zn2Bi8O18,-3.286312567142857,0.2685625136607084 -Ni1C4Br2N2F4_47_13294.vasp,Ni1C4Br2N2F4,-4.064267226153846,0.0320185113461418 -Hf2Sb2Se6_12_7587.vasp,Hf2Sb2Se6,-3.5024489690000005,0.2733530704999979 -Ta4Pt2S14_11_18092.vasp,Ta4Pt2S14,-4.2594765075,0.1113765724374977 -Ni2Se4_14_13649.vasp,Ni2Se4,-1.1965423383333331,0.287213175 -Fe2Mo2Cl2O8_129_5870.vasp,Fe2Mo2Cl2O8,-3.832296265714286,0.1682996480952354 -In2S2I2_59_8549.vasp,In2S2I2,-1.5320145266666667,0.0122139058333332 -Bi4O6_31_2626.vasp,Bi4O6,-3.669421816,0.188572412 -K4Mo6O20_13_9476.vasp,K4Mo6O20,-4.655565879333333,0.092240150666667 -Ba3Ni2I2O5_123_2121.vasp,Ba3Ni2I2O5,-2.903888745833333,-0.1417862536762182 -Li4B4H24O4_14_10162.vasp,Li4B4H24O4,-3.9668206819444447,0.7821508165277733 -Ta4Fe8Se8_59_18043.vasp,Ta4Fe8Se8,-2.9669984355,0.7219967535000005 -Cu2H8C6N6Cl2_2_5148.vasp,Cu2H8C6N6Cl2,-4.849237625833333,0.3292350768749954 -Ti1I1Br1_156_18792.vasp,Ti1I1Br1,-2.71770783,0.1337813808333332 -Er2I2O2_129_5561.vasp,Er2I2O2,-4.465192735,0.0426115433333338 -Sr2P4S12_2_17296.vasp,Sr2P4S12,-3.172447730555556,0.1486113255208272 -Ge1Te2_164_6719.vasp,Ge1Te2,-1.8160459966666669,-0.3166231944444457 -Ti1Br4_123_18752.vasp,Ti1Br4,-2.018207004,0.2500750000000002 -Bi2Pb1Se4_164_2499.vasp,Bi2Pb1Se4,-2.0357352285714287,0.0238496209821409 -Ir1Ru1Se2I1Br1_6_8755.vasp,Ir1Ru1Se2I1Br1,-2.0106145166666667,0.3487096802777745 -Pt1S1_156_14586.vasp,Pt1S1,-1.78157478,0.83350638 -In1Ag1Sb2Te6_149_8185.vasp,In1Ag1Sb2Te6,-1.122224789,0.3197208831666649 -In1Au1S1I2_1_8198.vasp,In1Au1S1I2,-0.61314471,0.107893538666665 -Ga1Pt5Br2_38_6249.vasp,Ga1Pt5Br2,-1.37614607125,0.1828092437190046 -Ti1S1Cl1_156_18834.vasp,Ti1S1Cl1,-4.342864146666667,-0.0479088913888929 -Pd1I2_164_14365.vasp,Pd1I2,-0.0126890066666666,0.2785199608333333 -Mn1Zn1Br2N2_6_10937.vasp,Mn1Zn1Br2N2,-2.2143830033333334,0.6420250606249944 -Au2Se4I2_1_1557.vasp,Au2Se4I2,-0.58764927625,0.215840324305554 -Ti1Mo1Se1S1Br2_6_18804.vasp,Ti1Mo1Se1S1Br2,-3.22796918,0.0993152374999919 -Zn4Te4O12_29_21233.vasp,Zn4Te4O12,-2.89016442,0.241071658999997 -K2Cd4Se2O6F6_31_9061.vasp,K2Cd4Se2O6F6,-1.939877064,0.3667505362499974 -Cu2Te3P4I2_6_5348.vasp,Cu2Te3P4I2,-1.6051709863636363,0.178804652483764 -Bi6Rh2S4_11_2678.vasp,Bi6Rh2S4,-2.001601173333333,-0.1031187039141431 -In2Te2_187_8629.vasp,In2Te2,-1.318427315,0.0665817049999999 -Ta4Se12Br2_2_18106.vasp,Ta4Se12Br2,-3.4970819477777777,0.1679470614043148 -Te6P2Ru2_162_18671.vasp,Te6P2Ru2,-2.391713119,0.3858416336666656 -Ni3Se4_10_13724.vasp,Ni3Se4,-0.6370091214285714,0.4749395085714287 -Hf1Ru1Pt1Rh1Cl4O4_1_7276.vasp,Hf1Ru1Pt1Rh1Cl4O4,-3.4923890833333338,0.4617537464583303 -Nb2H2C1S2_164_12731.vasp,Nb2H2C1S2,-5.0289292,0.2751231062857142 -Ca4Fe2S6Br2_129_3216.vasp,Ca4Fe2S6Br2,-2.519651206428571,-0.1456313182142897 -Hf3Cl2O5_1_7701.vasp,Hf3Cl2O5,-6.333158803,0.2987612866250009 -Tl1Pt5I2_38_19327.vasp,Tl1Pt5I2,-0.89219714125,1.2106215740625 -Li2H6C2N8O2_51_9944.vasp,Li2H6C2N8O2,-5.3672133,-1.9913725277083405 -Mn3B2Cl2_187_11351.vasp,Mn3B2Cl2,-3.0019568942857147,0.3009446407142832 -Zr4Te4Cl4_31_21854.vasp,Zr4Te4Cl4,-2.9924226991666667,0.1932276163888857 -Ga4Cl4O4_29_6547.vasp,Ga4Cl4O4,-3.25632847,-0.2735337237500031 -Nb1Cr1F6_123_12493.vasp,Nb1Cr1F6,-3.614205135,0.1020021418749961 -Be2Br4_51_2246.vasp,Be2Br4,-1.7200346,0.3682020266666668 -Te2Ru1_115_18512.vasp,Te2Ru1,-1.85715394,0.7638407700000003 -Ca1Se2F2_1_2878.vasp,Ca1Se2F2,-1.908014032,1.3214303673333334 -Be4Bi2_59_2286.vasp,Be4Bi2,-2.0378790466666667,-0.3814845250000014 -Li6Se2S8F2_11_10276.vasp,Li6Se2S8F2,-2.583721483333333,0.2367634023842571 -Nb4Se6_12_13152.vasp,Nb4Se6,-4.422654099,-0.5120330562500031 -Ru2Se6_11_15365.vasp,Ru2Se6,-2.51324964,0.4596978433333333 -P2Ir2_129_13995.vasp,P2Ir2,-4.143058,0.2847591025000002 -Hf3Ge1Se1S3Cl4_25_7702.vasp,Hf3Ge1Se1S3Cl4,-3.969015189166667,0.1543350274305472 -Lu1Ge2_123_10293.vasp,Lu1Ge2,-2.75668829,0.6910197133333336 -K1Sn1S2_156_8940.vasp,K1Sn1S2,-1.7954898075,0.3997238040625003 -Zr2I1Br1N1O1_6_21583.vasp,Zr2I1Br1N1O1,-4.878887263333334,0.1358507799999926 -Ni1Cl2_115_13311.vasp,Ni1Cl2,-0.14246736,0.1670279666666666 -Ge2P2H6C2O6_7_6804.vasp,Ge2P2H6C2O6,-4.998476431666667,-0.1104025269523917 -Si4S4_53_16507.vasp,Si4S4,-3.83685399,-0.1783998124999998 -Cr1Sn3_191_4268.vasp,Cr1Sn3,-0.6411644625,-1.29648640875 -Ag2Mo1O4_111_324.vasp,Ag2Mo1O4,-2.9683219771428573,0.3395916249999997 -Sc2Pd1S3I1Br2_8_16125.vasp,Sc2Pd1S3I1Br2,-2.540068138888889,0.2912997645833279 -Sr1Se2_115_17081.vasp,Sr1Se2,-1.4123136533333334,1.0455716827777757 -Sn1P7Au3_1_16667.vasp,Sn1P7Au3,-2.339412532727273,0.3868789972727273 -Ta1Mn1Ni1S2I2_6_17565.vasp,Ta1Mn1Ni1S2I2,-2.357783497142857,0.1707661472857128 -Zr2P2O6_12_21625.vasp,Zr2P2O6,-5.972287893,0.4843067364000008 -V1H1O2_156_19847.vasp,V1H1O2,-4.8795756525,0.1495456137499999 -V1Au2S1I4_1_19771.vasp,V1Au2S1I4,-0.47731723,0.2213443495312484 -Zr4B3_164_21808.vasp,Zr4B3,-5.075858812857143,0.2119003039285669 -Ba2Tl1Ag1Hg1S5_99_2075.vasp,Ba2Tl1Ag1Hg1S5,-1.640027774,0.2964334108671849 -V1Cu1P2Se6_5_19815.vasp,V1Cu1P2Se6,-2.443374588,0.1143497732749978 -Zr1Au1I1Cl1_8_21250.vasp,Zr1Au1I1Cl1,-1.4279238,0.4127933897499978 -Fe4Cu2S7_25_6077.vasp,Fe4Cu2S7,-1.5667998084615389,0.322853252692304 -V2Te2O7F2_2_20211.vasp,V2Te2O7F2,-4.210060266153846,-0.0042951529487211 -Sc2Pd1Br6_8_16124.vasp,Sc2Pd1Br6,-1.9948211433333336,0.2578069799999974 -Rh2O2_6_15207.vasp,Rh2O2,-3.00013678,0.8683293537499998 -Mg2W2S2O12_4_10536.vasp,Mg2W2S2O12,-4.972570826111111,0.2149972549768465 -Ga2Cl6_1_6322.vasp,Ga2Cl6,-1.5414419825,0.0847408249999999 -Bi4As4O16_14_2592.vasp,Bi4As4O16,-4.148091377916667,0.1938122787500003 -Mn4Pb4O12_13_11447.vasp,Mn4Pb4O12,-3.9169877815,-0.0244076281 -Li4As4O8_29_10157.vasp,Li4As4O8,-4.49742312125,0.0202458619444365 -Cr2Se2F2_59_4495.vasp,Cr2Se2F2,-2.740256691666667,0.1222872733333271 -In2As6_164_8378.vasp,In2As6,-2.29321068875,-0.0304490287499998 -Na2Hf1N2_164_12144.vasp,Na2Hf1N2,-4.864920696,0.0182314912222122 -Cu6Se4Cl4O12_2_5499.vasp,Cu6Se4Cl4O12,-2.360564988846154,0.0825661908653798 -Hf1W2O8_164_7365.vasp,Hf1W2O8,-6.398708106363636,-0.0100928227272794 -W2O2F2_59_20517.vasp,W2O2F2,-4.865479895,0.2903697766666606 -H3Cl1O1_156_7047.vasp,H3Cl1O1,-3.480309924,0.0414308454999998 -Ge2O2F2_59_6791.vasp,Ge2O2F2,-3.612405101666667,0.4022575929166665 -Rh3I1Br1O2_25_15250.vasp,Rh3I1Br1O2,-2.05787004,0.6193609759523764 -Ta4S12Cl2_2_18097.vasp,Ta4S12Cl2,-4.166009517222222,0.1904211287083264 -Ta2Cr2Te10_11_17716.vasp,Ta2Cr2Te10,-2.592436222142857,0.0601392416071397 -V1Br1F1_156_19784.vasp,V1Br1F1,-2.4346831433333334,0.0759107655555515 -Ti5I1N3Cl2O1_1_19173.vasp,Ti5I1N3Cl2O1,-6.101695625833333,0.1149235604166549 -Ag4C4N12O8_57_508.vasp,Ag4C4N12O8,-4.7104306835714285,0.212450125357138 -Te2P2O1_5_18439.vasp,Te2P2O1,-3.002025866,0.4585552838666619 -Hg1S2_115_7912.vasp,Hg1S2,-0.35147704,0.6586267997916657 -Ni3Sn1Te2_187_13729.vasp,Ni3Sn1Te2,-0.4847904133333333,0.0857000056249995 -Al2Co2S5_187_804.vasp,Al2Co2S5,-3.175674353333333,0.1197045369907381 -Ni2Te2Br2_59_13658.vasp,Ni2Te2Br2,-0.4808082616666667,-0.0184025825 -As1O2_191_1155.vasp,As1O2,-3.0708296333333336,1.3703735520833245 -Ge2Sb2Se6_147_6857.vasp,Ge2Sb2Se6,-2.247182142,0.2944263051666639 -Hg2Te4_11_8038.vasp,Hg2Te4,0.1667425983333333,0.373359836111111 -Cr2Se2N1_164_4497.vasp,Cr2Se2N1,-3.788516616,-0.0120967389999995 -Cr3As2_12_4541.vasp,Cr3As2,-3.013573976,0.6073211929999952 -As16I4_10_1127.vasp,As16I4,-2.4619796975,0.075708240833332 -Ca2Bi10O17_8_2951.vasp,Ca2Bi10O17,-3.785732950689655,0.1563879129310352 -Mo2S6_59_11678.vasp,Mo2S6,-3.249150305,0.22990985859375 -Tl2As2O6_149_19362.vasp,Tl2As2O6,-3.652969843,0.1626892995000002 -Ga2F2_59_6342.vasp,Ga2F2,-2.3815877575,-0.0369050775000023 -Cu4S4Cl4F4_14_5451.vasp,Cu4S4Cl4F4,-1.154142626875,0.2122857040257313 -Ga1Cu4As1S3Cl6_1_6182.vasp,Ga1Cu4As1S3Cl6,-1.293089142,0.1121653518055534 -Mn4B1W1Cl6O4_1_11420.vasp,Mn4B1W1Cl6O4,-3.194694030625,0.3714485366791222 -Y1Se2_115_20674.vasp,Y1Se2,-3.4433078766666667,0.5139676152777741 -Al1P1_187_702.vasp,Al1P1,-3.28661002,-0.3520080249999999 -Hf3Ti1Se8_6_7742.vasp,Hf3Ti1Se8,-4.34698721,0.3169969512500006 -Tl2Zn1S4_156_19565.vasp,Tl2Zn1S4,-1.3786558242857143,0.247701277535711 -Ta3S6_2_17987.vasp,Ta3S6,-5.2996036477777775,0.1211289405555557 -Mn2Bi2Te4Cl2_10_11023.vasp,Mn2Bi2Te4Cl2,-1.421517354,0.2701479201379288 -Yb2I6_12_20878.vasp,Yb2I6,-1.5590286575,-0.4385490345312501 -Mg2P2Se6_162_10497.vasp,Mg2P2Se6,-2.556004191,0.0435635360000001 -Nb2I10_7_12739.vasp,Nb2I10,-0.98727726,0.1976507683333335 -Mn6Cu1B1Se2Br3Cl1O6_1_11467.vasp,Mn6Cu1B1Se2Br3Cl1O6,-2.977511376,0.3043749286624968 -Mo6P4Pb2O28_11_11763.vasp,Mo6P4Pb2O28,-5.192802629,0.0488078695833287 -Hf3H2C2_187_7707.vasp,Hf3H2C2,-6.372342544285714,0.230867119047613 -Cr1Ag1Sb1Se1I2_1_4103.vasp,Cr1Ag1Sb1Se1I2,-0.9318683283333334,0.2045883912499984 -Ca2Au1Se2Br2_38_2938.vasp,Ca2Au1Se2Br2,-1.3966954828571427,0.3095145335714256 -Rb2Cd4O8F6_31_14806.vasp,Rb2Cd4O8F6,-1.708963039,0.4943692295416656 -Mg2Cd1_123_10437.vasp,Mg2Cd1,1.0239573566666669,-0.1794910191666655 -Ba4Sb4Te8F4_14_2186.vasp,Ba4Sb4Te8F4,-2.436114436,0.1278506804999977 -Mn3S2N2F2_187_11401.vasp,Mn3S2N2F2,-3.206113948888889,0.4926621818518483 -Co1I2O6_1_3774.vasp,Co1I2O6,-2.68255814,0.2005711950000002 -Te2As4S12_18_18362.vasp,Te2As4S12,-2.346058290555556,0.6564877980324044 -Te2Pt2I2_59_18484.vasp,Te2Pt2I2,-1.1160554483333334,-0.0986495316666666 -As1S1Cl1_156_1168.vasp,As1S1Cl1,-2.14698367,0.5162492836111086 -Ta2Sb2S6_2_17865.vasp,Ta2Sb2S6,-4.06750379,0.2718379411666648 -Fe4S8_54_6087.vasp,Fe4S8,-2.527957965833333,-0.5918320508333337 -Zr1Nb1N1Cl2O1_25_21349.vasp,Zr1Nb1N1Cl2O1,-5.29817029,0.1725228033333297 -Cr2S2Br2_59_4462.vasp,Cr2S2Br2,-2.300954218333333,0.0376454100000001 -As2Pb2F14_2_1252.vasp,As2Pb2F14,-2.559208055555556,0.0566301438888889 -Rb2N2O6_4_14901.vasp,Rb2N2O6,-4.0888564160000005,0.0966980539999999 -Rb1Na1Mg6O7_99_14744.vasp,Rb1Na1Mg6O7,-3.5817571753333337,0.002710151761902 -Hf3S1Br2N1_1_7723.vasp,Hf3S1Br2N1,-4.917631722857143,0.3515831399999949 -Co2Ge8_125_3902.vasp,Co2Ge8,-2.703354864,-0.0137910759999997 -Sc5F8_10_16270.vasp,Sc5F8,-3.924725995384615,-0.1728110852564129 -Ti2Br2_12_18903.vasp,Ti2Br2,-3.82756352,0.3592362375000002 -In2O4_12_8516.vasp,In2O4,-3.196226925,0.7289153512499964 -Cu2P4Se3Br2_6_5224.vasp,Cu2P4Se3Br2,-1.9964871718181816,0.1351513467207765 -W1Au2Se4_111_20415.vasp,W1Au2Se4,-1.7806951742857142,0.0591422871428555 -Cu4I4O4_14_5428.vasp,Cu4I4O4,-0.9580031791666668,0.4188878854999976 -Sb2As2S6_157_15532.vasp,Sb2As2S6,-2.71224056,0.44950346425 -In2Te6P2_147_8641.vasp,In2Te6P2,-1.705671641,0.2399096956666653 -Sn2O1_8_16794.vasp,Sn2O1,-2.469342856666666,-0.847387096666668 -Mg2Ag2_191_10416.vasp,Mg2Ag2,0.753193375,2.027021415 -Y6C2I7_12_20845.vasp,Y6C2I7,-3.66237626,0.0613589226666664 -Mo4H2N3O2_164_11744.vasp,Mo4H2N3O2,-4.909342043636364,0.2752167412499902 -V1Cu1Te6P2_5_19822.vasp,V1Cu1Te6P2,-1.855793405,0.3977362978333335 -Na2H2S6N2_4_12105.vasp,Na2H2S6N2,-3.0256019125000004,0.2693492762630206 -Au2Cl2_67_1471.vasp,Au2Cl2,0.1697106575,0.0209439137499999 -Cu2W2Se1S3Cl2_1_5368.vasp,Cu2W2Se1S3Cl2,-2.260622506,0.5653936504999961 -As2Pb2S6Cl2_7_1258.vasp,As2Pb2S6Cl2,-2.219567640833333,0.4317160322337939 -Hf4S1Br2N2Cl2O1_1_7803.vasp,Hf4S1Br2N2Cl2O1,-5.122551183333333,0.4119166988541627 -Sn2P2H10C4O6_7_16809.vasp,Sn2P2H10C4O6,-4.881932895,0.0253603309166501 -Cs2Hg4S2Br6O6_31_4728.vasp,Cs2Hg4S2Br6O6,-1.595957422,0.0877513555 -Ba2H2Cl2_129_1992.vasp,Ba2H2Cl2,-2.6444938066666666,0.1077404633333336 -Sr1Ag2H12_115_17018.vasp,Sr1Ag2H12,-2.057037826666667,1.5903135828333306 -Y3N2O2_187_20803.vasp,Y3N2O2,-6.960377394285715,0.1367646021428514 -Y2C1_164_20712.vasp,Y2C1,-5.377682366666666,0.4522482033333332 -Cu2Se1S3_1_5294.vasp,Cu2Se1S3,-1.4057710866666666,0.3234769465624961 -Ca1Br2_115_2810.vasp,Ca1Br2,-1.6017501433333334,0.32838352 -Tl4Br4_57_19594.vasp,Tl4Br4,-0.731227015,-0.1545147649999999 -Sr2Fe2Si2_129_17220.vasp,Sr2Fe2Si2,-1.6287412466666666,0.1328591937499977 -Nb1Bi1Sb1_156_12472.vasp,Nb1Bi1Sb1,-3.0816578700000004,0.1154605122222145 -Zn1Sn1F6_10_21012.vasp,Zn1Sn1F6,-2.1690706275,0.080272345 -Sb8Se8O4_2_15879.vasp,Sb8Se8O4,-2.860989146,0.1319208964999974 -Nb2S2F2_59_12838.vasp,Nb2S2F2,-4.720673748333334,0.1570692761111067 -Os1S2_164_13821.vasp,Os1S2,-3.555963703333333,0.7421538024999998 -Cu2P4Se3I2_6_5227.vasp,Cu2P4Se3I2,-1.8831399054545448,0.139514363701296 -P2Pb2Se6_147_14016.vasp,P2Pb2Se6,-2.375484529,0.1544752675 -Hf1Cl2_115_7143.vasp,Hf1Cl2,-3.122809923333333,0.5523706908333297 -Cu1F2_115_4876.vasp,Cu1F2,-1.1014172433333334,0.1956481166666666 -Cd1Ge1Se1S1Br2_1_3315.vasp,Cd1Ge1Se1S1Br2,-1.2807545516666667,0.169600110815972 -W1F5_47_20433.vasp,W1F5,-2.9870461966666664,0.5385237452083278 -V1Cu2S5_1_19823.vasp,V1Cu2S5,-2.19278616,0.2898540998177064 -Ag1Os1S2_6_95.vasp,Ag1Os1S2,-2.14868785,0.894057063125 -Ta3Cl7O1_156_17954.vasp,Ta3Cl7O1,-3.815706829090909,0.185257676590904 -K4Cu10Te10_59_9439.vasp,K4Cu10Te10,-0.4219621149999999,0.15103970125 -In2H4C2Se2O12_2_8465.vasp,In2H4C2Se2O12,-4.491252862727273,0.0948565033522645 -Cu2Cl2_67_5083.vasp,Cu2Cl2,-0.2999493175,0.3361942362500001 -W2F2_164_20492.vasp,W2F2,-3.967843365,0.9545014681249946 -Ca2As2H10O12_7_2924.vasp,Ca2As2H10O12,-4.406684406153846,0.0794509980448725 -Te2Pt2_164_18492.vasp,Te2Pt2,-1.5703171975,0.3272363724999998 -In2I2Br1O1_1_8474.vasp,In2I2Br1O1,-1.2881983466666669,0.3312489583333333 -V4I16_14_20331.vasp,V4I16,-0.641543357,0.1231866593750005 -Ti2Ge2O6_147_18941.vasp,Ti2Ge2O6,-6.12573278,-0.0847328372500033 -As2Pb2S6_7_1261.vasp,As2Pb2S6,-2.502547212,0.3701652622986049 -Mg1Se2F2_8_10403.vasp,Mg1Se2F2,-1.70952001,1.0860508143333334 -Ag1Sn1Se3Br1_1_136.vasp,Ag1Sn1Se3Br1,-1.1823921566666666,0.2570427595833323 -Cd2Sb2Se6_147_3564.vasp,Cd2Sb2Se6,-1.250072599,0.007649137333331 -V3Mo1Se8_25_20279.vasp,V3Mo1Se8,-3.06665378,0.0546523145833335 -Re6F18_164_15122.vasp,Re6F18,-3.6333211108333336,0.0064212891666665 -Sr2Br4O4F8_30_17154.vasp,Sr2Br4O4F8,-1.2638665861111111,1.0180859963888866 -Ba2Cu1S2Cl2_38_1967.vasp,Ba2Cu1S2Cl2,-2.364452642857142,0.1163035307886862 -Cu2P2O4_26_5207.vasp,Cu2P2O4,-3.5624059625,0.5787112299999988 -Na2Zr1Cu2S4_12_12341.vasp,Na2Zr1Cu2S4,-2.5799031922222224,-0.1422739188888888 -W1I1Br1_156_20434.vasp,W1I1Br1,-1.5018932733333334,0.8260391279166663 -Ti2P2Se6_12_18983.vasp,Ti2P2Se6,-3.66194932,0.249113990874997 -Bi4Mo2_2_2617.vasp,Bi4Mo2,-1.6413798183333332,0.459611081666665 -Rb2Au2Se2_51_14768.vasp,Rb2Au2Se2,-0.4196228933333333,0.3093663816666667 -Ti2H2S2N1_164_18950.vasp,Ti2H2S2N1,-5.253552777142858,-0.0558318766964455 -Nb1Sb1Te1Se1_99_12569.vasp,Nb1Sb1Te1Se1,-3.0106041375,0.0490309883333308 -Ti3C2_187_19078.vasp,Ti3C2,-7.231802424,0.4568865889999998 -Na2Hg4O8F6_31_12152.vasp,Na2Hg4O8F6,-1.404066114,0.4363031311249983 -In1Sn1Br4_6_8355.vasp,In1Sn1Br4,-0.9477291183333332,0.1514917793750001 -Cd1In2S4_164_3376.vasp,Cd1In2S4,-1.9299033571428568,0.0174815364285712 -V2Ag2S8_51_19975.vasp,V2Ag2S8,-2.3839415525,0.2944633605555533 -Ti2I6_189_18961.vasp,Ti2I6,-1.820789715,0.23320144375 -Mn3N2_187_11397.vasp,Mn3N2,-3.867408214,0.7462826014999959 -V2H4_12_20085.vasp,V2H4,-3.3020465100000003,0.3572369733333329 -Os2S4_127_13876.vasp,Os2S4,-3.2395758466666664,1.0585416591666663 -Hf4Br3Cl1O4_1_7770.vasp,Hf4Br3Cl1O4,-5.3428676658333325,0.2003192069444392 -Sr2Se2_164_17315.vasp,Sr2Se2,-2.326395675,0.2064380524999998 -Sc2Br6_189_16047.vasp,Sc2Br6,-2.15681319125,0.1714000924999998 -Na2Pt1F2_123_12269.vasp,Na2Pt1F2,-1.99072716,0.441375852 -W2N1F2_164_20508.vasp,W2N1F2,-4.790816850000001,0.1309885898333281 -Zr2Si2Se2_129_21687.vasp,Zr2Si2Se2,-4.476567718333333,0.0998655800000003 -Pt2N1Cl2O1_25_14637.vasp,Pt2N1Cl2O1,-2.29763183,0.221292005208326 -Ga2O2_164_6415.vasp,Ga2O2,-3.9758196825,0.2699947399999995 -Mg2Fe2Si2_129_10453.vasp,Mg2Fe2Si2,-1.648535625,0.0884286755555538 -Ba2Tl1Cu1Hg1S5_99_2083.vasp,Ba2Tl1Cu1Hg1S5,-1.768132168,0.2745991704882787 -Nb2F8_1_12715.vasp,Nb2F8,-4.011544028,0.187838445999996 -Nb2Br10_51_12641.vasp,Nb2Br10,-1.5546792016666666,0.2088299075000002 -Sr3Ni2S5Br2_123_17393.vasp,Sr3Ni2S5Br2,-2.1272578033333334,0.0329651444270788 -V1B4S6Cl1F4_1_19777.vasp,V1B4S6Cl1F4,-3.23538377875,0.6376518905338497 -Sr3Pb1_25_17397.vasp,Sr3Pb1,0.3397907675,0.8006840318749999 -Sn2Hg1Cl2O2_12_16774.vasp,Sn2Hg1Cl2O2,-1.962089507142857,0.232887954827585 -Te2Rh2_187_18505.vasp,Te2Rh2,-1.67288636,0.5504616820833312 -Cs2Hg4Se2S6F6_31_4741.vasp,Cs2Hg4Se2S6F6,-1.0262305,0.3346438884062479 -Nb1Bi1P1_156_12470.vasp,Nb1Bi1P1,-3.8855702366666662,0.3664044299999967 -Y2S2Cl2_164_20772.vasp,Y2S2Cl2,-4.411903203333334,0.1131327599999991 -Hf1Mn1I6_149_7218.vasp,Hf1Mn1I6,-1.3365587725,0.0752425612499998 -Ca2Ag1S2Br2_38_2907.vasp,Ca2Ag1S2Br2,-1.7293494,0.2161051856696387 -V4Se4O16_14_20368.vasp,V4Se4O16,-4.50279133625,0.1310362479166671 -Zn1In1I2_1_20962.vasp,Zn1In1I2,0.330345075,0.2846732087500001 -Be4Sb2_59_2289.vasp,Be4Sb2,-1.95351566,0.3084452208333316 -Sc1Ag1Sb2Se6_149_15893.vasp,Sc1Ag1Sb2Se6,-2.12733199,0.1207384901666642 -Cr2Si1O4_21_4507.vasp,Cr2Si1O4,-4.884128268571429,0.7917195514285655 -Au4Se4Br4_14_1596.vasp,Au4Se4Br4,-0.4186375466666667,0.0437725645833333 -Y1Si5_47_20676.vasp,Y1Si5,-3.888303516666667,-0.1907715922222261 -Zn2Se4_14_21168.vasp,Zn2Se4,-0.7146804250000001,0.5213179952777767 -Sr5Ce1_8_17488.vasp,Sr5Ce1,0.473447245,1.119170800833332 -Ga2P6_164_6431.vasp,Ga2P6,-3.25674921,-0.1619887275000002 -Ag2Se1S1Br2_1_424.vasp,Ag2Se1S1Br2,-0.461253165,0.2957083104513857 -Al2Br6_2_781.vasp,Al2Br6,-1.56741988875,0.0931882562500001 -Cu4Te4I4_14_5486.vasp,Cu4Te4I4,-0.2182277191666666,0.1282726636904758 -Rb2Te2H6C2O6_4_14951.vasp,Rb2Te2H6C2O6,-3.763008693333333,0.4931752688888758 -Co1B6C2Br2F4_6_3704.vasp,Co1B6C2Br2F4,-3.915912928,0.674346928388881 -Cd1Fe1I1O1F1_1_3308.vasp,Cd1Fe1I1O1F1,-1.344834612,0.3081908839444424 -Cu2As4Se3Cl2_6_5022.vasp,Cu2As4Se3Cl2,-1.7812237199999998,-0.2638915103030342 -Ti4B3_164_19125.vasp,Ti4B3,-6.134465568571429,0.4609846153571366 -Fe1O2_115_5731.vasp,Fe1O2,-3.3884325433333333,0.3535085512499969 -As2F8_1_1212.vasp,As2F8,-2.532973135,0.0882322510000004 -V2Br6_189_20010.vasp,V2Br6,-1.51280913,0.1928510199999999 -Ta1Co2I1Br1Cl2O1_1_17529.vasp,Ta1Co2I1Br1Cl2O1,-2.3884111775,0.4979487202083322 -Ag4Se4_2_567.vasp,Ag4Se4,-0.4957064725,-0.2087504649999999 -Ag2Cl4_14_250.vasp,Ag2Cl4,-0.0896726833333333,0.10953919 -Cu2Sb4Se3Br2_6_5280.vasp,Cu2Sb4Se3Br2,-1.3620652472727273,0.560373550454542 -K4Ni2As4_51_9485.vasp,K4Ni2As4,-1.019552429,0.13745351 -Te2As2I2_1_18353.vasp,Te2As2I2,-1.3329585583333332,0.1789362933333333 -Te2Ir2I2_59_18395.vasp,Te2Ir2I2,-1.6997549333333335,0.1859383549999966 -Ga3S4_164_6535.vasp,Ga3S4,-2.827179252857143,0.075255095714283 -Na3Mo1Cl6_149_12354.vasp,Na3Mo1Cl6,-1.810617914,0.2114217412395796 -Ag1F2_115_54.vasp,Ag1F2,-0.61508118,0.2203553216666666 -Re2F2_164_15044.vasp,Re2F2,-4.6809631575,0.3122015558333277 -Mg2Ni2Sn2_129_10491.vasp,Mg2Ni2Sn2,-0.2427045416666666,-0.237966135 -Bi4C2_113_2604.vasp,Bi4C2,-2.6168210533333336,0.3998660799999971 -P2Se2S1_164_14050.vasp,P2Se2S1,-2.884652346,0.1820423925595209 -Ti3B2Se2F2_187_19067.vasp,Ti3B2Se2F2,-4.604073416666667,0.1994990351851806 -Sc3B2Cl2_187_16193.vasp,Sc3B2Cl2,-3.850808252857143,-0.0159016090000065 -Zr1Mo1I3Br3_1_21327.vasp,Zr1Mo1I3Br3,-1.582313085,0.1933185988541668 -Bi6O9_1_2670.vasp,Bi6O9,-3.235798879333333,0.6221953486666667 -Pr2Br2O2_129_14541.vasp,Pr2Br2O2,-4.814056656666667,0.0753271433333333 -Hf1V1Ge2Se8_1_7348.vasp,Hf1V1Ge2Se8,-3.1187544666666667,0.151917467361111 -Al4Bi4O12_14_1060.vasp,Al4Bi4O12,-4.767119228,0.1977774499999995 -Li4Zn2I8_11_10254.vasp,Li4Zn2I8,-0.8342420500000001,0.0793171094642851 -Ta1Pb1F7_6_17599.vasp,Ta1Pb1F7,-3.730285457777777,0.1612036927777782 -Hf3H2N2O2_187_7708.vasp,Hf3H2N2O2,-6.501588691111111,0.5778066838888831 -Ag1C6N4O2_5_43.vasp,Ag1C6N4O2,-5.908719686923077,0.4679818635256276 -K2As2Pd2_12_8976.vasp,K2As2Pd2,-1.27423739,0.1607816152777748 -Li1W2S2I6_47_9814.vasp,Li1W2S2I6,-1.755001008181818,0.2685558159848438 -Bi2P2O8_11_2488.vasp,Bi2P2O8,-4.914408601666667,0.2677423266666663 -Na1Co1P2Se6_149_11846.vasp,Na1Co1P2Se6,-2.483002596,0.2399502940624981 -In1Pd1S2Br1Cl1_6_8306.vasp,In1Pd1S2Br1Cl1,-1.6430169166666666,0.1830337674999982 -Mn4H2S2N3_164_11438.vasp,Mn4H2S2N3,-3.8748075245454543,-0.5588739251894015 -Mg2Sb2S6_162_10504.vasp,Mg2Sb2S6,-2.52804018,-0.0425458840625023 -Cs2Cd4S2Cl6O6_31_4687.vasp,Cs2Cd4S2Cl6O6,-1.9641258175,0.1509376870624957 -Sb1H2O2_164_15457.vasp,Sb1H2O2,-3.752320012,0.4028080091666645 -Ta2Fe4Te2Se2_51_17736.vasp,Ta2Fe4Te2Se2,-2.714678354,0.1886673010000004 -Fe2P6H12O18_7_5924.vasp,Fe2P6H12O18,-4.637846064210526,0.1446435837499917 -Ti4S2N3_164_19156.vasp,Ti4S2N3,-7.217008197777777,-0.2563158655555611 -Ti2Te2_129_19042.vasp,Ti2Te2,-4.00603269,0.4243171253124957 -Mn4C3O2_164_11428.vasp,Mn4C3O2,-4.623781833333333,0.3215121668518454 -Li2Mg1H4O10_2_9966.vasp,Li2Mg1H4O10,-3.7143624988235295,0.2931818780882314 -Sb2Te1S2_5_15707.vasp,Sb2Te1S2,-2.334332828,0.1504311433333314 -V2N2F2_59_20114.vasp,V2N2F2,-5.033762511666667,-0.2979367547222264 -Sn2Br2Cl2_129_16740.vasp,Sn2Br2Cl2,-1.1710450383333333,0.2401046641666668 -Ca1Nb2N2Cl2_8_2859.vasp,Ca1Nb2N2Cl2,-4.950941868571428,0.2899682992857104 -Sb2Te2S1_164_15721.vasp,Sb2Te2S1,-2.098235246,0.0672995766666646 -Rb2Br2O6_11_14783.vasp,Rb2Br2O6,-2.30579823,0.1344569297500006 -P2O3_1_13997.vasp,P2O3,-4.874029139999999,0.3847746136000012 -Ta1S2N1_156_17605.vasp,Ta1S2N1,-4.34901075,1.0999763468750006 -Ga2As2Se6_147_6301.vasp,Ga2As2Se6,-2.24175379,0.2362557060000003 -Cu1Pb3Se4_1_4938.vasp,Cu1Pb3Se4,-1.40663141625,0.2835097377864584 -Ta1Se2_164_17621.vasp,Ta1Se2,-4.55047042,0.1446087216666667 -Zn1Cd1B1S1Cl1_1_20909.vasp,Zn1Cd1B1S1Cl1,-1.000279722,0.5486198599666667 -Co1C4Br2N2F4_47_3714.vasp,Co1C4Br2N2F4,-4.183874726153847,0.1904872055662251 -Ni1S1Cl1_8_13410.vasp,Ni1S1Cl1,-1.0342035166666668,0.0423494418749981 -Ba2Co2Sn2_129_1956.vasp,Ba2Co2Sn2,-1.0328141766666663,0.4184740566666656 -Ag4Bi4_51_503.vasp,Ag4Bi4,-0.0944695475,-0.2227219825 -V1Cr1Mo1Br1Cl1O3_1_19805.vasp,V1Cr1Mo1Br1Cl1O3,-3.846531995,0.1478586494270787 -Tm2Br2O2_129_19671.vasp,Tm2Br2O2,-4.784412128333334,0.0410832999999994 -Y2Se6_129_20779.vasp,Y2Se6,-3.70836055875,-0.7520982224999999 -Cr2Se2Cl2_59_4494.vasp,Cr2Se2Cl2,-2.3013842033333334,-0.1023696699999998 -Sn3P2S9_174_16921.vasp,Sn3P2S9,-2.633240192857143,0.2680668846428512 -P2Pt1_123_14030.vasp,P2Pt1,-2.9971635366666667,1.2815228516666664 -Ta4Co4Se8_53_18026.vasp,Ta4Co4Se8,-3.749930740625,0.1901033881249998 -Al1F2_164_654.vasp,Al1F2,-2.965603103333333,0.8545541838888855 -Cs2S6N2_11_4783.vasp,Cs2S6N2,-2.665507344,0.435917878999998 -Zr1P2H2S6_164_21391.vasp,Zr1P2H2S6,-3.3817656790909094,0.350705591193175 -V6N4O16_100_20389.vasp,V6N4O16,-5.097611452692307,0.3243567739999902 -Si1Se2_164_16367.vasp,Si1Se2,-2.992632233333333,0.1327928835416667 -K2Be2_11_9001.vasp,K2Be2,0.461341725,0.9695400875 -Bi2Cl6_191_2449.vasp,Bi2Cl6,-1.27776611625,0.1375273437499999 -V4Te4O16_14_20375.vasp,V4Te4O16,-4.469234737083333,0.2595145858333332 -Pt2Se6_11_14687.vasp,Pt2Se6,-1.92957666125,0.3351044108333331 -Sr2H2I2_129_17233.vasp,Sr2H2I2,-1.98693776,0.0505800999999999 -Pt2S4I1F1_1_14668.vasp,Pt2S4I1F1,-1.82033221,0.3503348258203125 -Zr2Ge2Te2_129_21572.vasp,Zr2Ge2Te2,-3.64364184,0.1061422016666662 -Tl1Ag1P2Se6_149_19203.vasp,Tl1Ag1P2Se6,-1.946408755,0.1107301726041647 -Te4Os3_156_18604.vasp,Te4Os3,-2.4917214985714287,0.2368056328571377 -Sn6W2O12_2_17002.vasp,Sn6W2O12,-4.4144329915,0.1604769312499967 -Li1Ga1Te6P2_5_9719.vasp,Li1Ga1Te6P2,-1.951394828,0.2561029631666652 -Ga1Ag1Br2_1_6112.vasp,Ga1Ag1Br2,-0.57119587,0.2259071533417329 -Ca5Sc1_1_3251.vasp,Ca5Sc1,0.3375524,1.3030917208333317 -Ca2F4_51_3014.vasp,Ca2F4,-3.3247222083333337,0.5190260883333329 -Pb2Se2O6_11_14289.vasp,Pb2Se2O6,-3.481164112,0.1759106850000003 -C1Cl2_164_2724.vasp,C1Cl2,-1.48495051,1.4307766083333278 -Na2Bi2Pd2_12_11991.vasp,Na2Bi2Pd2,-0.962574005,0.1759426588888877 -Li6S2O8F2_11_10272.vasp,Li6S2O8F2,-3.84536184,0.4762811677777736 -Fe1H4C6Br2N2_25_5701.vasp,Fe1H4C6Br2N2,-5.2042937553333335,0.1374261279999866 -Y1N2_187_20656.vasp,Y1N2,-6.2962675033333335,0.2089733541666607 -Ag1Au2Se2Br2_1_15.vasp,Ag1Au2Se2Br2,-0.1807250885714285,0.1831918605357136 -Mn1Te1Br2_25_10904.vasp,Mn1Te1Br2,-1.0671532925,0.2877936897916667 -Cr3Mo1O8_25_4561.vasp,Cr3Mo1O8,-5.001321356666667,0.0312096293576348 -Cr1I1Br1_156_4196.vasp,Cr1I1Br1,-0.9522867633333334,0.3659841138888875 -Si3Rh1_187_16477.vasp,Si3Rh1,-2.8159658425,0.8880557745833304 -Sn1As1Br2O3_1_16598.vasp,Sn1As1Br2O3,-2.920593854285714,0.2325853779464262 -Ag1I2_164_83.vasp,Ag1I2,0.5215032866666667,0.1627640939583336 -In2S2I2_31_8548.vasp,In2S2I2,-1.4934767649999998,0.0507516675000001 -Co2Bi4Cl4O6_11_3870.vasp,Co2Bi4Cl4O6,-2.855381160625,-0.0282930199999995 -Ca2Sb4S8_11_3121.vasp,Ca2Sb4S8,-2.8035452021428573,0.040924623571426 -Al1Ag1Sb2S6_149_601.vasp,Al1Ag1Sb2S6,-2.354260539,0.3453563349374979 -Na2C6S6F6_1_12014.vasp,Na2C6S6F6,-3.836766651,0.2459656113125 -Fe1H1O2_156_5684.vasp,Fe1H1O2,-3.8354503025,0.2830935987499998 -Zn2Bi4S6I4_31_21050.vasp,Zn2Bi4S6I4,-1.278375720625,0.2248685205000001 -Zr3H2C2_187_21765.vasp,Zr3H2C2,-5.67338035,0.0543149385714225 -V1W1Br2N1O1_25_19951.vasp,V1W1Br2N1O1,-4.252748495,-0.2090367706307274 -Mn1Nb1S3Br2_1_10809.vasp,Mn1Nb1S3Br2,-2.81441554,0.402290871749994 -Ba2Cu1Br2O2_123_1962.vasp,Ba2Cu1Br2O2,-2.753709787142857,0.1694292006547577 -Cr2Br2N2_59_4331.vasp,Cr2Br2N2,-3.71749324,-0.0660342483333367 -Sr2Cl4O8_50_17182.vasp,Sr2Cl4O8,-2.710380419285714,0.2364431514285694 -Se2_47_16293.vasp,Se2,-1.64519607,0.6627924833333334 -Ho2H4Cl2O4_11_8139.vasp,Ho2H4Cl2O4,-4.6664757325,0.0811622358333341 -K3Mo2Br9_174_9402.vasp,K3Mo2Br9,-1.2502942921428573,0.1071640698214274 -Mg1Sn2N2_115_10406.vasp,Mg1Sn2N2,-3.400245622,-0.4191383579999996 -V3I2N2_1_20273.vasp,V3I2N2,-3.935433688571429,0.2403602130158665 -Yb1I2_164_20856.vasp,Yb1I2,-1.52906642,0.0919967333333331 -Cd2Fe3O8_10_3505.vasp,Cd2Fe3O8,-2.8213210715384616,0.1929517021314057 -K2Zr2Cu2S6_51_9399.vasp,K2Zr2Cu2S6,-2.928377178333333,0.2028248075000003 -Nb1Te1S1Br1_1_12596.vasp,Nb1Te1S1Br1,-3.0194116975,0.4112568273809496 -Al1Fe5I2_123_660.vasp,Al1Fe5I2,-0.35945515875,1.247097794583332 -In2F2_129_8423.vasp,In2F2,-1.7538387075,0.6775012458333314 -Cd1Bi1Te1Br1_1_3282.vasp,Cd1Bi1Te1Br1,-0.1640808825,-0.025225230625 -Fe1Au1S2I1Cl1_1_5619.vasp,Fe1Au1S2I1Cl1,-1.078198765,-0.0510134592100728 -Bi1As2Au1S6_143_2315.vasp,Bi1As2Au1S6,-2.263388878,0.1929660134687476 -Ti1Fe2Se4_1_18780.vasp,Ti1Fe2Se4,-2.6171084757142857,0.0901796549999969 -Os2Cl6_191_13843.vasp,Os2Cl6,-1.49338167875,0.3947924528124997 -Zn2Te2H4O8_7_21177.vasp,Zn2Te2H4O8,-3.5042523675,0.0674884059027749 -Rb2I1_164_14891.vasp,Rb2I1,0.1051363366666666,0.1150104966666665 -Co4I4O4_14_4080.vasp,Co4I4O4,-2.16102282,-0.2592354937962974 -Mn2C2I2_59_11046.vasp,Mn2C2I2,-2.9121475783333337,0.5172249291666624 -Cd1H1_183_3335.vasp,Cd1H1,0.377962065,1.384442825 -Ni4Se3S5_8_13764.vasp,Ni4Se3S5,-1.5463270566666667,0.2102308735069424 -Sb1Te2H1O6_1_15513.vasp,Sb1Te2H1O6,-3.84345948,0.0851410193645799 -Au4S4Cl4_14_1585.vasp,Au4S4Cl4,-0.7579061083333333,0.087963594666666 -Hf2C2F2_59_7467.vasp,Hf2C2F2,-5.915409589999999,0.8170573995833281 -Te6P2Pb2_147_18667.vasp,Te6P2Pb2,-1.7453637560000002,-0.3317571263333349 -Ge4Te4P4_17_6951.vasp,Ge4Te4P4,-2.7958827441666667,-0.4717231991666686 -V1Cu1As2S6_5_19811.vasp,V1Cu1As2S6,-2.705355005,0.4797981482083309 -Ta2Se2I2_59_17872.vasp,Ta2Se2I2,-3.504397435,0.2049134403571433 -Mn1V1Te2_115_10927.vasp,Mn1V1Te2,-2.1742908975,0.2557319529166666 -Lu2Fe2Ge4_129_10309.vasp,Lu2Fe2Ge4,-2.35321444,0.2740598281249947 -Sn1I2_115_16649.vasp,Sn1I2,-0.39373076,0.3218393311111111 -Li2Ta2O3F6_5_10080.vasp,Li2Ta2O3F6,-5.181217753076923,0.0040926705128212 -Ga2I6_162_6391.vasp,Ga2I6,-0.45962702875,0.1535414318749999 -Pd2Se2F2_59_14486.vasp,Pd2Se2F2,-1.5955735233333332,0.0424590981249971 -Mg2Sb6P6O26_11_10512.vasp,Mg2Sb6P6O26,-4.90852064675,0.3198505350416618 -Te1P2S2_5_18318.vasp,Te1P2S2,-2.847620002,0.2777573750520833 -Hf1Te2_187_7326.vasp,Hf1Te2,-3.484423963333333,0.2638358733333339 -Tb1C2_123_18170.vasp,Tb1C2,-5.616882783333334,0.7966817033333329 -Sb3Pb1_187_15756.vasp,Sb3Pb1,-1.12671052,0.9180113143749996 -Al2In2Te6_31_892.vasp,Al2In2Te6,-1.719198974,0.078129891125 -K2H8Br2O4_2_9157.vasp,K2H8Br2O4,-3.457624945,0.0271816789583336 -B1Te2Mo2_164_1640.vasp,B1Te2Mo2,-3.27430898,-0.0069226019999995 -Rb2Cd4Te2S6Cl6_31_14828.vasp,Rb2Cd4Te2S6Cl6,-1.0195338995,0.0419690447916659 -Cr4H2S2N3_164_4605.vasp,Cr4H2S2N3,-4.285414824545454,0.2068696178661523 -Pd2I6_162_14437.vasp,Pd2I6,0.06954355875,0.1926325423437499 -Zn2Se2S8F4_7_21165.vasp,Zn2Se2S8F4,-1.69401259375,0.5021954416666667 -Sc2Ge1_164_16075.vasp,Sc2Ge1,-2.5804196966666666,0.3240578733333308 -Sb6C2_164_15845.vasp,Sb6C2,-2.76935513,0.9724015268749996 -Os2Br6_162_13834.vasp,Os2Br6,-1.40679056125,0.0953319162500001 -Nb2Co1S4_164_12688.vasp,Nb2Co1S4,-4.163000945714286,0.4545119961904733 -Eu2H2I2_129_5601.vasp,Eu2H2I2,-2.6016441666666665,0.0856110450000002 -Nb2Rh2S8_11_12827.vasp,Nb2Rh2S8,-3.953622410833333,0.0697560691666632 -In1Pd5F2_123_8312.vasp,In1Pd5F2,-0.98988309625,0.7370858141666645 -Nb4Co2Pd1Se12_12_13053.vasp,Nb4Co2Pd1Se12,-3.4278387936842107,0.0816320457894734 -Ag2Sn2S6_51_448.vasp,Ag2Sn2S6,-1.753755365,0.2171728629374977 -As18Cl4_11_1129.vasp,As18Cl4,-2.7544148695454544,0.0644596116666642 -Ba2H2Br2_129_1991.vasp,Ba2H2Br2,-2.423625518333333,0.0841977833333329 -Ba2Tl1Cd1Au1S5_99_2079.vasp,Ba2Tl1Cd1Au1S5,-1.635185293,0.3983501281249969 -Cr2S5_8_4474.vasp,Cr2S5,-2.989863824285714,0.3529310384821403 -Re2Ni1P2S8_8_15061.vasp,Re2Ni1P2S8,-3.60288569,0.2412123891880271 -Ni2S2Br4_35_13581.vasp,Ni2S2Br4,-0.6318516475,-0.0110557626562499 -Co2Sb1O6_12_3991.vasp,Co2Sb1O6,-4.015003435555555,-0.306987299236114 -Cu2F6_191_5096.vasp,Cu2F6,-0.72952234125,0.0789744137499999 -Te6P2W2_2_18672.vasp,Te6P2W2,-2.508295322,0.2206812000000001 -Bi2Cl2_12_2445.vasp,Bi2Cl2,-1.0488272,0.0503244383333323 -Zr2Si2Te8_31_21690.vasp,Zr2Si2Te8,-2.6791030041666666,-0.1237470837500047 -Mn3N12_12_11394.vasp,Mn3N12,-5.837585131333333,-0.3120388958333326 -Sn1S1_156_16677.vasp,Sn1S1,-2.23070145,0.2331287712499996 -Cr2Se6_11_4505.vasp,Cr2Se6,-2.3981160525,0.2537452970833335 -Mn1Cr1Te1I5_1_10680.vasp,Mn1Cr1Te1I5,-0.702674875,0.0940564502083326 -Ti1P2_164_18824.vasp,Ti1P2,-4.878631636666666,0.7590914541666667 -Ir1Pd1S2Br2_6_8747.vasp,Ir1Pd1S2Br2,-1.8872965666666663,-0.0568713683333363 -H8Ru2_1_7098.vasp,H8Ru2,-3.203878078,1.496318903 -K1Al1I4O12_2_8877.vasp,K1Al1I4O12,-3.00744415,0.1374956972916642 -Rb2Hg4Te2I6O6_31_14886.vasp,Rb2Hg4Te2I6O6,-1.063932481,0.1527027892083306 -Cr4H2C3O2_164_4601.vasp,Cr4H2C3O2,-4.9295219427272725,0.1637049256060512 -Cu2Sb4Se3Cl2_6_5281.vasp,Cu2Sb4Se3Cl2,-1.45430574,0.6266716604545419 -K4Pr4P8S24_14_9497.vasp,K4Pr4P8S24,-3.5106108345000004,0.0544698104999992 -In3Ge1F8_1_8647.vasp,In3Ge1F8,-2.472835305,0.0802471237499976 -Ba2V3O8_123_2087.vasp,Ba2V3O8,-5.302658195384615,0.2273452602403802 -Nb1Sn1I1Br1N1O2_1_12586.vasp,Nb1Sn1I1Br1N1O2,-4.086936407142857,0.1892875174999865 -Hf1Se2_164_7309.vasp,Hf1Se2,-4.5995802433333335,0.1282380200000004 -Cu2P4H8O8_14_5217.vasp,Cu2P4H8O8,-3.9945846263636366,0.191372240757575 -Zn1Ge1Se2Br2_1_20944.vasp,Zn1Ge1Se2Br2,-1.2542847083333333,0.1441514721527776 -Cr3O8_2_4573.vasp,Cr3O8,-4.789229582727272,-0.236839557102277 -Tl1I1O3_156_19287.vasp,Tl1I1O3,-2.216403216,0.6574320399999998 -K2Cd4S2O6F6_31_9049.vasp,K2Cd4S2O6F6,-2.255719791,0.1927425532187492 -Bi2F2_12_2454.vasp,Bi2F2,-1.6937481975,0.4587450445833314 -Ta2Fe2S10_51_17726.vasp,Ta2Fe2S10,-3.564494327857143,-0.0108494814285737 -Cr1Te6As2Au1_5_4280.vasp,Cr1Te6As2Au1,-1.505645373,0.2066355603333308 -Al2Hg1Se4_164_873.vasp,Al2Hg1Se4,-1.999597007142857,0.198789805714286 -Li1Si1Te1Br1_1_9789.vasp,Li1Si1Te1Br1,-2.06010776,0.3740050456249997 -Sr2Cd1In1Ag1S5_99_17170.vasp,Sr2Cd1In1Ag1S5,-1.710658096,0.3405281867500002 -Te6N4_11_18657.vasp,Te6N4,-2.696033957,0.4605377460000005 -V2B1H2S2_164_19989.vasp,V2B1H2S2,-3.828157301428572,0.8262481076190435 -Hg1Br2_12_7846.vasp,Hg1Br2,0.50386998,0.0769526466666667 -Ag2Sb2C4N4Cl4F12_14_397.vasp,Ag2Sb2C4N4Cl4F12,-3.2082894975,0.215041560084318 -Nb1Si1Te2Br1_1_12583.vasp,Nb1Si1Te2Br1,-2.60406276,0.5358322705083334 -Hf2I1N2Cl1_156_7511.vasp,Hf2I1N2Cl1,-5.595158179999999,0.3566567725000005 -Ce2Bi2S4O2_99_3664.vasp,Ce2Bi2S4O2,-4.14613529,-0.5395796002500053 -Cu1Ge1H6_2_4880.vasp,Cu1Ge1H6,-2.356049295,1.459267641249999 -W1O2F2_38_20440.vasp,W1O2F2,-4.83636788,-0.0528497080000001 -Ru2Se2I2_59_15356.vasp,Ru2Se2I2,-1.8990767116666667,0.2008786841666641 -Ca4Ce2_51_3208.vasp,Ca4Ce2,-0.11596057,1.0686813383333322 -K4Co2Se4_49_9436.vasp,K4Co2Se4,-1.218554452,0.2335247731851832 -Hf6N2F26_164_7827.vasp,Hf6N2F26,-4.422572932352941,0.308902348627443 -V1O2_164_19893.vasp,V1O2,-5.494078946666666,0.1838601283333343 -Cs2Hg4Se2S6Cl6_31_4740.vasp,Cs2Hg4Se2S6Cl6,-0.7855113055,0.2561624408124993 -Te6N4_2_18658.vasp,Te6N4,-2.679674559,0.4768971440000006 -Si2Sb2Te6_147_16443.vasp,Si2Sb2Te6,-1.934610761,0.2347317069999999 -V2Br5_1_20008.vasp,V2Br5,-1.4964221057142857,0.2266614799999984 -Rb6O3_143_14983.vasp,Rb6O3,-1.289162887777778,0.0624492322222223 -Tl4As4_127_19589.vasp,Tl4As4,-0.74262803125,0.7761726004999999 -Ba4P4Se8F4_14_2173.vasp,Ba4P4Se8F4,-3.1417529585,0.1002485351875002 -K2Pb1O6F6_147_9293.vasp,K2Pb1O6F6,-1.7994110386666666,0.8868235371666671 -Ba1O2_123_1849.vasp,Ba1O2,-3.8742595433333338,0.4671971599999991 -Ga2As2O6_2_6300.vasp,Ga2As2O6,-4.100879064,0.315091794666658 -Nb3H2S2N2_187_12978.vasp,Nb3H2S2N2,-5.5137376966666665,0.0831127885185154 -Mn2As2Cl2O4_26_10964.vasp,Mn2As2Cl2O4,-3.492588394,0.0430377937631506 -Tl1Fe5F2_123_19268.vasp,Tl1Fe5F2,-0.48320234125,1.6501096716666646 -Cd4Br8_115_3622.vasp,Cd4Br8,0.1471411325,0.1670250033333333 -Tc2Cl8_14_18227.vasp,Tc2Cl8,-2.257519589,0.1004537009999997 -Li2V2Au4O12_31_10110.vasp,Li2V2Au4O12,-3.361488667,0.2208151795000006 -Ag2H8C14N8_2_289.vasp,Ag2H8C14N8,-5.863558825625,-1.3199162116145875 -Zr3B2S2_187_21743.vasp,Zr3B2S2,-5.19380982,0.0368242185714238 -Er2Sb2S4O2_129_5571.vasp,Er2Sb2S4O2,-4.333321842,0.0204234994166618 -Fe1H4C2I2N4_47_5692.vasp,Fe1H4C2I2N4,-4.343840810769231,0.0161588127564038 -Co1H4C4I2N2_47_3753.vasp,Co1H4C4I2N2,-4.670002733846154,0.1185538389743441 -Mn2Cl2O2_59_11050.vasp,Mn2Cl2O2,-3.116506993333333,-0.0352768233333362 -Sb6C6_12_15847.vasp,Sb6C6,-4.3626657925000005,0.8372804487499994 -Ta2Te4_127_17918.vasp,Ta2Te4,-2.54289682,1.2049865488888891 -Nb2Ag2Se4O14_51_12621.vasp,Nb2Ag2Se4O14,-4.216037994090909,0.0913398440909087 -Mg1Hg3Cl8O6_2_10373.vasp,Mg1Hg3Cl8O6,-1.1591345322222222,0.2393055690277756 -Te2Mo2_25_18414.vasp,Te2Mo2,-2.220398055,0.6329096824999998 -Ta3Ni3Te14_6_17974.vasp,Ta3Ni3Te14,-2.1440499545,0.098852460999997 -V1Br5_10_19791.vasp,V1Br5,-0.843718485,0.3200811433333329 -Hf2H2N1O2_164_7504.vasp,Hf2H2N1O2,-6.06777676,0.8414060642857022 -K4Cd4Ge4As8_2_9429.vasp,K4Cd4Ge4As8,-1.3760706565,0.1234855974999999 -Nb2S2_164_12847.vasp,Nb2S2,-4.8435071025,0.2680741009999945 -Fe1H2_187_5687.vasp,Fe1H2,-2.0773888166666667,0.6439465116666643 -Sn4S4_29_16962.vasp,Sn4S4,-2.3537551925,0.1100750287499998 -Hf2Ge4_59_7501.vasp,Hf2Ge4,-4.198629101666667,0.3837140899999998 -Ba2Bi3O7_25_1920.vasp,Ba2Bi3O7,-3.8267756583333337,0.2150655022916591 -Ag2Se4F2_4_442.vasp,Ag2Se4F2,-1.13995531375,-0.3078434522321445 -In1Sn3Se1Cl5O4_1_8362.vasp,In1Sn3Se1Cl5O4,-2.5434387485714285,0.2405002484523765 -Rb2Hg4S6Br6O2_31_14871.vasp,Rb2Hg4S6Br6O2,-0.6744528175,0.5039218909340245 -Ni4Sb4Te4_13_13763.vasp,Ni4Sb4Te4,-0.9419998216666668,0.2876159454761892 -Ta2Br2_129_17667.vasp,Ta2Br2,-3.4357929825,1.3433948773214217 -Te4Au2Br2_1_18564.vasp,Te4Au2Br2,-0.38638883125,0.1818856437499999 -K6Tl11_150_9547.vasp,K6Tl11,0.4479597394117647,-0.0709817003109239 -Ni1C12N2Cl2_10_13291.vasp,Ni1C12N2Cl2,-5.336890555882353,1.261802639999993 -W2I6_189_20505.vasp,W2I6,-0.89780156625,0.5794720190624985 -Ge2F8_1_6775.vasp,Ge2F8,-2.799360868,-0.0506760019999998 -Ni1Se2_187_13424.vasp,Ni1Se2,-1.10787727,0.3758782433333332 -Sn1Bi2Te4_164_16616.vasp,Sn1Bi2Te4,-1.52237169,0.0592557171428571 -Ge4O6_11_6934.vasp,Ge4O6,-4.6241289000000005,-0.0106623417500051 -Fe1Br2_164_5639.vasp,Fe1Br2,-1.1329120566666666,-0.2778022349999999 -Ta1Re1Te4_6_17600.vasp,Ta1Re1Te4,-3.56727788,0.0668278994444444 -K2H6C2S2O6_4_9137.vasp,K2H6C2S2O6,-4.274037422222222,0.1097323568055517 -Co1O2_191_3807.vasp,Co1O2,-2.56459467,0.5325717620833308 -Mn2Mo2Cl2O8_129_11137.vasp,Mn2Mo2Cl2O8,-4.098304241428571,0.0799464570833267 -Au2S2_187_1516.vasp,Au2S2,-0.48383848,0.5279500850000001 -Pt2Cl6_164_14618.vasp,Pt2Cl6,-0.43384809125,0.5638177229166667 -Cd1B4N2Cl2F4_10_3278.vasp,Cd1B4N2Cl2F4,-3.9709397884615374,0.3645869778632402 -Y4Te6Mo2O24_11_20839.vasp,Y4Te6Mo2O24,-5.10382093,0.0330924138888741 -Nb2Ir2S8_11_12759.vasp,Nb2Ir2S8,-4.179238039166667,-0.4913030508333338 -Ag3Bi2Te4_164_497.vasp,Ag3Bi2Te4,-0.5091034855555556,0.2655788277777771 -Fe2Se4F2_1_5985.vasp,Fe2Se4F2,-1.79006460625,0.3534431126388868 -Mo1W3O8_25_11556.vasp,Mo1W3O8,-5.944104230833333,0.1742998142516958 -Sn2Pb2F8_129_16830.vasp,Sn2Pb2F8,-2.6577622,0.0282050745833331 -Bi1I3_187_2344.vasp,Bi1I3,-0.01389459,0.47585943625 -Ta2S4I2_11_17861.vasp,Ta2S4I2,-3.72112314875,0.22091675484375 -Cu2H8C16N4Cl2O2_2_5141.vasp,Cu2H8C16N4Cl2O2,-5.68833361117647,0.3212672386887107 -Ba4As4Se8Cl4_14_2135.vasp,Ba4As4Se8Cl4,-2.615427785,0.1010198047500002 -Na4B20H16O40_14_12367.vasp,Na4B20H16O40,-5.838565818,0.0422942017499998 -Na1In1Sb2S6_5_11889.vasp,Na1In1Sb2S6,-2.377996537,0.2901916461874974 -Li2V1_187_10107.vasp,Li2V1,-1.6438365633333334,0.9875947077777756 -Ba2Tl2Cu1O6_123_2086.vasp,Ba2Tl2Cu1O6,-2.604382331818182,0.7152406219318127 -Ta1I1F1_156_17554.vasp,Ta1I1F1,-2.9956269066666668,1.0409894130714168 -Na2B2F8_59_11972.vasp,Na2B2F8,-3.8560469391666663,0.0952085033333336 -Hg2Te2Au2Br2_26_8023.vasp,Hg2Te2Au2Br2,0.42569834125,0.2446498875 -Os2Cl2_129_13838.vasp,Os2Cl2,-1.6341233225,1.587475401875 -Ni2F2_129_13501.vasp,Ni2F2,0.01893213,2.36209147125 -Tl1Ni5F2_38_19307.vasp,Tl1Ni5F2,0.25643844625,4.106347106875 -K1Tl1Cl4O12_2_8950.vasp,K1Tl1Cl4O12,-2.341973771666667,0.2361663374999976 -Zn3Sb1_187_21209.vasp,Zn3Sb1,1.4244608875,0.30807174875 -Nb1Te1Se1_156_12598.vasp,Nb1Te1Se1,-3.694128623333333,0.1282660609722226 -Zr1Nb1Br1N1Cl1_8_21337.vasp,Zr1Nb1Br1N1Cl1,-4.770296638,0.2560025137618993 -Mn2Te2_164_11308.vasp,Mn2Te2,-1.5507296725,0.2955080181896552 -P4S8_11_14119.vasp,P4S8,-3.0742200516666665,0.2094982032291605 -Cu4Se2_4_5470.vasp,Cu4Se2,-0.3754680583333333,0.0402293408333321 -Nb2Se2_123_12878.vasp,Nb2Se2,-4.4110159325,-0.1696169777499991 -Hf2N2F2_164_7543.vasp,Hf2N2F2,-6.739210951666667,0.1568710629166609 -Rb1Hf1Mg6O7_99_14736.vasp,Rb1Hf1Mg6O7,-4.130793414,-0.1115730072424332 -Mn2In2Se5_156_11126.vasp,Mn2In2Se5,-2.077760302222222,0.045984686954021 -K2Cd4Se2S6I6_31_9065.vasp,K2Cd4Se2S6I6,-0.6415828905,0.110600762124998 -Al2Ga2S6_31_844.vasp,Al2Ga2S6,-3.305156669,0.025048955875 -K4Te4O8_13_9522.vasp,K4Te4O8,-2.895417824375,0.2313463294791666 -P6O12F2_4_14137.vasp,P6O12F2,-4.598183504,0.5531702848999969 -Tl2Se2_2_19533.vasp,Tl2Se2,-0.9541500925,0.3457295485416666 -Te2Mo2_187_18411.vasp,Te2Mo2,-1.8808245625,0.9724831749999998 -Ta3H2C2S2_187_17959.vasp,Ta3H2C2S2,-5.965094334444444,0.4390717744444317 -Fe2Te2_164_6007.vasp,Fe2Te2,-0.5296522675,1.2365039837499998 -Te8F8_2_18694.vasp,Te8F8,-1.655404948125,0.347763933125 -Fe2Bi2O4F2_26_5807.vasp,Fe2Bi2O4F2,-3.220423822,0.1728564052857085 -Nb2V2S10_11_12937.vasp,Nb2V2S10,-4.127709755714286,0.0068673449107101 -Pb1_123_14213.vasp,Pb1,-0.15504285,1.17314327 -Mn1H12C16N2O4_2_10759.vasp,Mn1H12C16N2O4,-5.883717262285714,0.2078466469880799 -V1Fe1Br3Cl1O2_8_19829.vasp,V1Fe1Br3Cl1O2,-2.40887010375,0.1306366156953114 -Zr2F8_1_21566.vasp,Zr2F8,-4.473009144000001,0.1186149109999989 -Cd2Te2Au2F2_26_3586.vasp,Cd2Te2Au2F2,-0.074682405,0.16332504967 -Na2Sc1_187_12297.vasp,Na2Sc1,-0.6635517766666666,0.4227706583333325 -Na2Cd4S2I6O6_31_12027.vasp,Na2Cd4S2I6O6,-1.6970124025,0.1145551925625007 -Ni4Sb2_129_13759.vasp,Ni4Sb2,-0.2344625133333333,0.3432964611111105 -Cu2P4O12_12_5218.vasp,Cu2P4O12,-4.503822085,0.3391112411111123 -Si6P2_191_16537.vasp,Si6P2,-3.42268753,0.2706578245833329 -As4Se6_7_1374.vasp,As4Se6,-2.431923148,0.174101867 -Sb2O3_164_15614.vasp,Sb2O3,-3.794670906,0.4628195614999999 -Zr1S2_123_21416.vasp,Zr1S2,-4.2835137266666665,0.5153568408333333 -B2W3Cl2_187_1720.vasp,B2W3Cl2,-4.650370928571428,0.3097521938095148 -Fe1P2S6_5_5734.vasp,Fe1P2S6,-2.8930729466666665,-0.0585521384027833 -Zr2S2I1Br1_6_21646.vasp,Zr2S2I1Br1,-3.47554264,0.1842364533333296 -Au4S4Br4F4_2_1582.vasp,Au4S4Br4F4,-0.815522860625,0.1730102934505195 -Bi2C6_191_2440.vasp,Bi2C6,-5.14576059875,1.0582004575 -Li2C10S2F6_51_9847.vasp,Li2C10S2F6,-4.31733292,1.0579399414375 -Na1Ga1Cl4O12_2_11861.vasp,Na1Ga1Cl4O12,-2.6518291466666666,0.0179969058333311 -Tl1Sb1Se4_47_19336.vasp,Tl1Sb1Se4,-1.2580590383333334,0.787601937777776 -Al1Ni5Br2_123_696.vasp,Al1Ni5Br2,-0.148553015,3.297304312916665 -Ni1H1S2_1_13323.vasp,Ni1H1S2,-2.080473895,0.1869496800781226 -Cu1H2_187_4894.vasp,Cu1H2,-1.6454517633333332,2.101192459999997 -Sr2Co2Ge2_129_17191.vasp,Sr2Co2Ge2,-1.731041498333333,0.2035428355555537 -Ca1N2O6_21_2857.vasp,Ca1N2O6,-4.699502716666667,0.0917643208333327 -Hf1Ag1Mo1Se1S2I1Br3_1_7102.vasp,Hf1Ag1Mo1Se1S2I1Br3,-2.142262366,0.3513018290416649 -Te1As2S2_1_18283.vasp,Te1As2S2,-2.567777036,0.1545000900833334 -Sb2Te1O2_12_15705.vasp,Sb2Te1O2,-3.00991673,0.4438454729999972 -Zr2I6_162_21596.vasp,Zr2I6,-1.5490439725,0.2010271774999998 -Co2H16C8O14_2_3906.vasp,Co2H16C8O14,-4.953438232,0.122245625416661 -Cu2P4Se3Cl2_6_5225.vasp,Cu2P4Se3Cl2,-2.0895142763636363,0.1506703421117388 -Pd2Se2Cl2_59_14484.vasp,Pd2Se2Cl2,-1.3213032033333334,-0.1704212416666668 -Zn4Ag4O10_6_21210.vasp,Zn4Ag4O10,-1.6465994105555557,0.3127797912499982 -Fe2P2S6_12_5917.vasp,Fe2P2S6,-3.086773457,-0.3764127321363697 -Ni2Ir2S4Br2_1_13532.vasp,Ni2Ir2S4Br2,-1.727862294,0.1889074066666619 -Hg4W2S8_13_8095.vasp,Hg4W2S8,-1.795738095,0.238926103571426 -Na4Sb4P8S24_14_12415.vasp,Na4Sb4P8S24,-3.054444229,0.0744518812499999 -Sn2As1_164_16713.vasp,Sn2As1,-1.7160499566666667,-0.5510287022222234 -Mo2Cl2O2_59_11594.vasp,Mo2Cl2O2,-3.5324331033333336,0.2724375563888888 -Nb1Se1O1_25_12575.vasp,Nb1Se1O1,-5.161189013333334,0.4595005935416667 -Ta2S3F3_8_17857.vasp,Ta2S3F3,-4.5742846125,0.3068537913749962 -Ga2P2Se2S4_1_6427.vasp,Ga2P2Se2S4,-2.823312426,0.159564440897053 -Co2H16N4O4F8_14_3907.vasp,Co2H16N4O4F8,-3.7768744229411766,0.1023908057026014 -Ga2Co1Se4_164_6328.vasp,Ga2Co1Se4,-2.307057124285714,-0.0133405786190521 -Tm1As2_21_19658.vasp,Tm1As2,-2.847223766666667,0.5765028433333299 -Cr2I2N2_12_4410.vasp,Cr2I2N2,-3.3754349083333337,0.117517811666663 -Si8Rh2_125_16551.vasp,Si8Rh2,-3.66857727,-0.107330166333337 -Co1Cl2_187_3730.vasp,Co1Cl2,-0.8665913633333333,0.2470668383333334 -Tl2I2N2_59_19432.vasp,Tl2I2N2,-1.235460378333333,0.9012650341666648 -K2Pt1C4N4Cl2_2_9304.vasp,K2Pt1C4N4Cl2,-4.746159426923077,0.3246786674358908 -Cr2Te8Mo2_25_4535.vasp,Cr2Te8Mo2,-2.010414005,0.0165561894444445 -Ga1Ni5I2_123_6223.vasp,Ga1Ni5I2,0.17594717625,-0.0571858419851926 -Fe2Te1Se1_99_5992.vasp,Fe2Te1Se1,-0.9966465075,0.578128036875 -Cs2Cl2O6_11_4709.vasp,Cs2Cl2O6,-2.435538584,0.0974081033749971 -Mn1Ga1S2I1Br1_6_10722.vasp,Mn1Ga1S2I1Br1,-1.928591235,0.1844078236805518 -Nb2Te2Cl2_59_12906.vasp,Nb2Te2Cl2,-3.2413257816666667,-0.1169417238888953 -Mn1Al2Te4_156_10631.vasp,Mn1Al2Te4,-1.9220771171428568,0.1884152960064891 -Ho1N2_21_8116.vasp,Ho1N2,-5.606273936666667,0.2430694541666618 -Sr4Mn2Br2O6_129_17444.vasp,Sr4Mn2Br2O6,-3.928745607142857,-0.0323150853571472 -Ca1Sb2O5_1_2875.vasp,Ca1Sb2O5,-4.17578417875,0.3272044220000001 -Sc2As2S6_157_16027.vasp,Sc2As2S6,-3.633046314,0.4199188805000002 -Co2Cu1S4_187_3896.vasp,Co2Cu1S4,-2.3649352728571427,0.1705324542857145 -K2Cd4Te2I6O6_31_9068.vasp,K2Cd4Te2I6O6,-1.2611734145,0.0582202442916671 -Hf1Bi2_187_7124.vasp,Hf1Bi2,-2.844062376666667,0.2377113849999994 -Pd2Br2N2_59_14399.vasp,Pd2Br2N2,-1.9960746616666667,0.4089144174999974 -Ag4S4I4F4_2_552.vasp,Ag4S4I4F4,-0.66239204,0.2927389310546875 -In2Fe1O4_156_8429.vasp,In2Fe1O4,-3.519097901428572,0.3787793183333301 -Ca2Cl2F2_129_2976.vasp,Ca2Cl2F2,-3.088744225,-0.0527545074999997 -Hf1N1Cl2_6_7237.vasp,Hf1N1Cl2,-4.2266723375,0.6737519691666628 -Li1Ni1P2S6_5_9762.vasp,Li1Ni1P2S6,-2.850269602,0.0649017696614557 -Al2O4_164_919.vasp,Al2O4,-5.061506448333334,0.6009665493749949 -Ga2Fe2Se5_187_6360.vasp,Ga2Fe2Se5,-2.269463836666666,-0.349070366111113 -K6P10Ru2Se20_11_9543.vasp,K6P10Ru2Se20,-2.5518378278947367,0.1036514392105267 -Li1Al1P2S6_5_9643.vasp,Li1Al1P2S6,-3.427780549,0.0662771595000002 -Al2Br6_26_780.vasp,Al2Br6,-1.57656816625,0.0840399787500001 -Pu2I2O2_99_14721.vasp,Pu2I2O2,-6.193394368333333,0.7149188341666672 -K4Cd1P2_10_9424.vasp,K4Cd1P2,0.0265127371428571,0.5616846642857138 -Tl18S9_143_19193.vasp,Tl18S9,-1.1511141114814816,0.1040225301851851 -Ir4S6_2_8863.vasp,Ir4S6,-3.29700095,0.2597871399999998 -Ca2S8Cl4_125_3113.vasp,Ca2S8Cl4,-1.9057128842857145,0.5451774889285692 -Ti2Te2I2_59_19039.vasp,Ti2Te2I2,-2.98511665,0.1317289672222155 -Pb3O6_1_14304.vasp,Pb3O6,-3.0624210966666663,0.3941079650000003 -Li2Fe2Si2O7_1_9913.vasp,Li2Fe2Si2O7,-4.869670578461538,0.1385420178205036 -K2Cd4Se2Br6O6_31_9058.vasp,K2Cd4Se2Br6O6,-1.5344135745,0.1542642103749999 -Ce2Mg2_164_3668.vasp,Ce2Mg2,-0.8940768225,0.8379005325 -Al1Ag1Te6P2_149_605.vasp,Al1Ag1Te6P2,-1.756862187,0.249014799666665 -Ge4S4_53_6942.vasp,Ge4S4,-3.11106468875,-0.8599168349999999 -B2Mo3O2_187_1681.vasp,B2Mo3O2,-4.83300689,1.1734930625396782 -Zn2S10F4_7_21140.vasp,Zn2S10F4,-1.7798428975,0.455102168671875 -Ni1O2_164_13385.vasp,Ni1O2,-2.8048016033333334,-0.4685144412500019 -Na2Cl2O4_13_12052.vasp,Na2Cl2O4,-2.33761396875,0.0322897543749987 -Cu1Ag1Se2_25_4829.vasp,Cu1Ag1Se2,-0.59576476,0.0030493366666666 -Sc1Tl1Cl2O2_6_16021.vasp,Sc1Tl1Cl2O2,-3.3389416466666666,0.0127823487499942 -In3Co1_187_8645.vasp,In3Co1,-0.370293545,0.8856505562499999 -Nb3Te14Pd3_6_13018.vasp,Nb3Te14Pd3,-2.241912572,0.0940745700833256 -Cr1Se2_115_4263.vasp,Cr1Se2,-2.2923058833333334,0.4741797316666667 -Na1Ga1Sb2S6_5_11867.vasp,Na1Ga1Sb2S6,-2.446836317,0.0154643964374978 -Ag1C6N6O2F4_6_44.vasp,Ag1C6N6O2F4,-5.326159332105263,0.040207662982446 -Al2I6_2_884.vasp,Al2I6,-0.87002992375,0.1117763425 -Os2O6_11_13863.vasp,Os2O6,-4.43484154875,0.3874854795833289 -Cs2Br2_129_4666.vasp,Cs2Br2,-0.86498682,0.1935206299999999 -Ga4O6_7_6557.vasp,Ga4O6,-4.497408058,-0.4293237607500029 -Be3F6_5_2278.vasp,Be3F6,-4.187594708888889,0.1187327611111115 -Zr4H2Br4_11_21820.vasp,Zr4H2Br4,-3.198299318,0.0468539029999968 -Sn6H2_164_16987.vasp,Sn6H2,-1.629412895,-2.378540575 -Zr2P2C2N2O6F6_2_21624.vasp,Zr2P2C2N2O6F6,-5.151371353,0.5342248934166604 -Ir1Pb3_187_8746.vasp,Ir1Pb3,-0.772804655,1.52613966 -Ca2Bi1_25_2953.vasp,Ca2Bi1,0.01203195,0.96820889 -K2Pt1Se2_47_9307.vasp,K2Pt1Se2,-1.010539446,0.571167282 -Rh4Pb12_127_15252.vasp,Rh4Pb12,-1.21566260375,0.4160870043269216 -Rb2Te2H6C2S6_1_14952.vasp,Rb2Te2H6C2S6,-3.106796715,0.1568504695717472 -Tl4Se6_1_19628.vasp,Tl4Se6,-1.1840480489999998,0.2463879900000001 -Tl3Te4_164_19582.vasp,Tl3Te4,-0.7195459014285713,0.2580927546428564 -W2C1F2_164_20470.vasp,W2C1F2,-4.738941568,0.4468044384999962 -Ag1Au2Se3Br1_1_16.vasp,Ag1Au2Se3Br1,-0.3661299671428571,0.3225010933333311 -Ni1Te2Ir2Rh1S2I4_1_13434.vasp,Ni1Te2Ir2Rh1S2I4,-1.4500934150000002,0.0804825631944411 -Co1C6I2F4_47_3719.vasp,Co1C6I2F4,-4.098163216923077,0.4487535250961504 -In2Te2_2_8630.vasp,In2Te2,-1.2292006675,0.1558083525 -Ni2Mo2S8Cl2_129_13537.vasp,Ni2Mo2S8Cl2,-1.8787366957142857,0.6370074892187478 -Mo1Se1O1_156_11547.vasp,Mo1Se1O1,-3.946345836666667,0.2323133308333329 -Co2Sb4I4O6_11_4013.vasp,Co2Sb4I4O6,-2.78490997875,0.0566347347135405 -Sr4Te8As4H4_14_17483.vasp,Sr4Te8As4H4,-2.1864993225,0.4042135608333308 -Sm2Sb2S4O2_129_16584.vasp,Sm2Sb2S4O2,-4.339842968,-0.0122531869166708 -Na4Co2Se4_49_12383.vasp,Na4Co2Se4,-1.704733639,0.1846639259333287 -Ca2P2H8O12_1_3087.vasp,Ca2P2H8O12,-4.73897765,0.1362197878645797 -H2W2_164_7035.vasp,H2W2,-4.4576922725,1.46394118 -Zn4As3_123_21211.vasp,Zn4As3,-0.2194819771428571,0.1582225933035695 -Os1Se2_115_13824.vasp,Os1Se2,-2.846294126666667,0.6983271333333332 -Sr2Ag1Se2Cl2_38_17110.vasp,Sr2Ag1Se2Cl2,-1.6770144542857144,0.2401797597619018 -V2H4S2O10_2_20083.vasp,V2H4S2O10,-4.631336701111112,-0.0441257155555563 -As2Ir2S6_162_1226.vasp,As2Ir2S6,-3.188619549,0.2736443137499977 -V2Zn2F10_1_20233.vasp,V2Zn2F10,-2.4828448164285715,-0.0424868475000019 -Zr1Te2_164_21465.vasp,Zr1Te2,-3.081510283333333,0.128456233333333 -Sc1I2_164_15945.vasp,Sc1I2,-1.6153108100000002,0.1299179672222202 -Na2Te2F10_26_12315.vasp,Na2Te2F10,-2.409051942857143,0.1127698875000002 -Cu1O2_115_4930.vasp,Cu1O2,-1.75434631,1.0132339541666646 -Sb8Te8O4_2_15881.vasp,Sb8Te8O4,-2.4509313895,0.1991025489999978 -Ir2Se2_187_8842.vasp,Ir2Se2,-2.568635575,0.4989842168750003 -Ga4Se6_1_6574.vasp,Ga4Se6,-2.230524399,0.2264674649999998 -Li2Cu2C2O6_2_9886.vasp,Li2Cu2C2O6,-4.5477738625,0.2755373034374983 -Sc1Hg2N1Cl2O1_1_15942.vasp,Sc1Hg2N1Cl2O1,-1.945032144285714,0.4714404194704387 -V1As1I1Br3O2_1_19766.vasp,V1As1I1Br3O2,-2.4684559225,0.0455861221093733 -Co1Ir1Br5Cl1_1_3778.vasp,Co1Ir1Br5Cl1,-1.1194561825,0.0685407777083321 -Re6Te8F2_2_15136.vasp,Re6Te8F2,-3.89464095625,0.0168409214062501 -Y2Co2_164_20724.vasp,Y2Co2,-2.7145186125,0.2944214249999999 -Ag4S2_191_542.vasp,Ag4S2,-0.0827098033333333,0.3356338833333334 -Cu4Te4_2_5489.vasp,Cu4Te4,-0.3549253925,0.2125551424999999 -Hf1Bi1Sb1_156_7117.vasp,Hf1Bi1Sb1,-3.1929284300000003,0.1068080891666629 -Sb4S2O12_18_15814.vasp,Sb4S2O12,-4.298830573888889,0.0805599960416623 -Ni1Bi2_187_13283.vasp,Ni1Bi2,-0.4550648466666667,0.4300926216666666 -K2Cr2Cd1H4O10_2_9086.vasp,K2Cr2Cd1H4O10,-4.0354069652631575,0.0640031063157895 -Ni1Pd3Se8_10_13405.vasp,Ni1Pd3Se8,-1.5765356858333333,0.1806557537500002 -Ag1Os1S2I1Br1_1_94.vasp,Ag1Os1S2I1Br1,-1.5643225533333334,0.4891823298958333 -P1Rh3S2Br4_1_13938.vasp,P1Rh3S2Br4,-1.887869251,0.4064103499999991 -Mo1F5_47_11511.vasp,Mo1F5,-2.457883618333333,0.3479007890277783 -Tl2P2_129_19483.vasp,Tl2P2,-1.26687232,0.73714768325 -Mg1Sn2_187_10407.vasp,Mg1Sn2,-0.7821717233333333,-2.0844240291666667 -K4Nb6Br18_12_9482.vasp,K4Nb6Br18,-2.2654073707142857,0.0638956235714287 -Ag4H4S4F4_2_522.vasp,Ag4H4S4F4,-1.623791635,0.4497154374218752 -Ni1H4C6Br2_47_13344.vasp,Ni1H4C6Br2,-4.4934182876923074,0.3509284261538388 -Ag1Sb1H2C2N2F6_10_117.vasp,Ag1Sb1H2C2N2F6,-3.683611117142857,0.1680317193333231 -B18Se9_143_1613.vasp,B18Se9,-4.1774411,0.6595438544444399 -Au1Cl2_115_1421.vasp,Au1Cl2,0.28491657,0.3430758216666666 -Zr3H2Se2N2_187_21769.vasp,Zr3H2Se2N2,-4.933850641111111,0.5589324555555515 -Fe2Te2F2_59_5996.vasp,Fe2Te2F2,-1.7467164283333334,0.3302402983333332 -Ga2F6_26_6345.vasp,Ga2F6,-2.90522246125,0.0643520687499998 -Os1I2_187_13805.vasp,Os1I2,-0.7595875566666667,0.9490477679166652 -Ir4Se3S5_1_8866.vasp,Ir4Se3S5,-3.1040893175,-0.2908349507291665 -Pb2N6_164_14260.vasp,Pb2N6,-4.66252659625,-0.1801670993750001 -Hg2Pt4Se6_164_7989.vasp,Hg2Pt4Se6,-1.2879433633333333,0.2486521391666667 -Zn4Br4O4_14_21212.vasp,Zn4Br4O4,-1.0081823908333334,0.4578023808333318 -K2Tm2I6_51_9381.vasp,K2Tm2I6,-0.99558708,0.0244085036666647 -Mo2N2_191_11639.vasp,Mo2N2,-3.26685938,2.45693845 -Si1Te1_156_16375.vasp,Si1Te1,-2.39539901,0.1302889212499995 -V3H4O8_12_20269.vasp,V3H4O8,-4.837653617333333,0.2915943124444409 -Cs2C6S6F6_4_4680.vasp,Cs2C6S6F6,-3.7172239185,0.1935645938124918 -Ta3C2F2_187_17949.vasp,Ta3C2F2,-6.711559481428572,0.3179097337857091 -Bi8Se8O4_2_2697.vasp,Bi8Se8O4,-2.4880386145,0.2002482161666647 -Au2I2_51_1487.vasp,Au2I2,0.786959555,0.27323663375 -W2C1Cl2_164_20469.vasp,W2C1Cl2,-4.3777749880000005,0.0739409421110993 -Te2Ru2_187_18518.vasp,Te2Ru2,-2.098269975,0.9169625487500002 -Mn6Zn2O14_147_11473.vasp,Mn6Zn2O14,-3.9153381,0.1632418061363596 -Ba4Sb4Te8Cl4_14_2185.vasp,Ba4Sb4Te8Cl4,-2.0848647455,0.1029047667499976 -Cr3B2S2F2_187_4544.vasp,Cr3B2S2F2,-3.40392077,0.4946964420833295 -Ge2Cl2O2_59_6765.vasp,Ge2Cl2O2,-3.157260195,0.2686530320833338 -Ag2C8Cl2F8_2_237.vasp,Ag2C8Cl2F8,-3.8018359895,0.3166246469999998 -Si1Sn1Te3Br1_1_16370.vasp,Si1Sn1Te3Br1,-1.6098664366666666,0.1282162778472213 -K6Ta4Cu6Se16_13_9546.vasp,K6Ta4Cu6Se16,-2.3928277475,0.0735953112499996 -Y4S2N3_164_20835.vasp,Y4S2N3,-6.3412796233333335,0.1475734012036973 -Zr2F6_189_21564.vasp,Zr2F6,-4.11012726125,0.4472153543750001 -Au2Se3O10_8_1552.vasp,Au2Se3O10,-2.8327907866666666,0.1509098529166641 -Fe2H2N1_164_5852.vasp,Fe2H2N1,-3.011609996,-2.1711556753333365 -Sc2Tl1Br2O1_1_16190.vasp,Sc2Tl1Br2O1,-2.794326965,0.3057737486111106 -B2P2H6Pb2O6_7_1692.vasp,B2P2H6Pb2O6,-4.290764298333333,0.3898126509920551 -Sb2Pb2Cl2O6_7_15639.vasp,Sb2Pb2Cl2O6,-3.33277788,0.2275960987499998 -Cu2S2_129_5251.vasp,Cu2S2,-1.0370299825,0.3253737291666667 -Li1Cu1O2_10_9688.vasp,Li1Cu1O2,-2.9418904925,0.2082516250000003 -Be2Cu2_191_2253.vasp,Be2Cu2,-0.480303275,1.3020035275 -Fe1Ag1Se1I1Br2_1_5615.vasp,Fe1Ag1Se1I1Br2,-0.45299479,0.1399795405729169 -As2Au2Se4_26_1189.vasp,As2Au2Se4,-1.43277993875,0.3230178422916647 -Sr2Ta4Bi4O18_26_17321.vasp,Sr2Ta4Bi4O18,-5.707448760357143,0.111955455714285 -Cr1W2O8_2_4285.vasp,Cr1W2O8,-5.610854096363636,-0.0321019156250033 -Hg2Te4_12_8039.vasp,Hg2Te4,0.1669687833333333,0.3735860211111109 -Li1B1H4_156_9661.vasp,Li1B1H4,-3.743043325,0.0739604770833333 -Ga2Br1Cl5_8_6308.vasp,Ga2Br1Cl5,-1.50032158375,0.04293244125 -Ni3As2S8_164_13692.vasp,Ni3As2S8,-2.0523813376923075,0.376240597451918 -Sr3Si2_164_17400.vasp,Sr3Si2,-1.317078406,0.5154312104999983 -Yb2P6H12O12_10_20882.vasp,Yb2P6H12O12,-4.84475478,-0.0689301509635444 -Rb2C2O8F6_4_14787.vasp,Rb2C2O8F6,-2.7811383444444444,0.6065883109722144 -Bi1Te2S6F1_1_2407.vasp,Bi1Te2S6F1,-2.015475669,0.2494349802708292 -Mn2As2S4Br2_26_10971.vasp,Mn2As2S4Br2,-2.441027196,0.1559864118750002 -In1Sn1S1I1Br1_1_8359.vasp,In1Sn1S1I1Br1,-1.228084748,0.2485518208333335 -V1Ag1I2O3_1_19753.vasp,V1Ag1I2O3,-2.5350731842857144,0.3082633353906243 -Hf1Ge1Cl4_6_7174.vasp,Hf1Ge1Cl4,-2.7693439816666667,0.2304841754166644 -Hf3S2_123_7726.vasp,Hf3S2,-5.589253148,0.0275375789999952 -Cr2Te2I2_59_4522.vasp,Cr2Te2I2,-1.3014313266666666,0.1055389594444471 -Ir2Se6_7_8849.vasp,Ir2Se6,-2.48055432125,0.3677635715277753 -Sc2H2N1O2_164_16083.vasp,Sc2H2N1O2,-5.424264222857143,-0.4614707785714365 -Ta2Cl6_189_17698.vasp,Ta2Cl6,-3.0579853,0.2682822618750003 -Pt1Br2_187_14567.vasp,Pt1Br2,-0.1368141366666666,0.6454780308333333 -Li2Co2As2_129_9861.vasp,Li2Co2As2,-2.490117988333333,0.1695574383333333 -Be2Co1_123_2251.vasp,Be2Co1,-2.5632130366666668,0.3553701983333308 -K1Ti1S2_156_8946.vasp,K1Ti1S2,-3.6173230925,0.1650262262500006 -Br1_123_2705.vasp,Br1,0.36207529,0.3556102 -Ni2W2Cl2O8_129_13685.vasp,Ni2W2Cl2O8,-3.9398157242857135,-0.0219847320535766 -K2Cd4Br6O8_31_9042.vasp,K2Cd4Br6O8,-1.266362432,0.2877428236666669 -Mg2Mn4O10_59_10479.vasp,Mg2Mn4O10,-4.1715888275,0.3296798990625 -Li2V2S6O24_2_10126.vasp,Li2V2S6O24,-4.560035348529412,0.0700723533333209 -Cu2Sb4O12_12_5273.vasp,Cu2Sb4O12,-3.726912815,0.1637063177777769 -Zr1Br2_164_21270.vasp,Zr1Br2,-2.4914816466666667,0.1632305266666667 -Y4I10_11_20827.vasp,Y4I10,-2.189349587142857,0.0841353990476158 -Sc2Cl6_162_16065.vasp,Sc2Cl6,-2.8416730775,0.04735186625 -Cd2Te2F2_59_3590.vasp,Cd2Te2F2,-0.4927170366666666,0.0539380111111104 -Bi1H1Se2O6_1_2335.vasp,Bi1H1Se2O6,-3.753602128,0.0684261587916637 -Ge2Se2_59_6874.vasp,Ge2Se2,-2.6996519575,0.2006413875000001 -Rh2Cl6_164_15186.vasp,Rh2Cl6,-0.87273838125,0.58554467 -Ga2Sb2_129_6461.vasp,Ga2Sb2,-1.84162746,-0.712558705 -Mn1Ge1Sb1S1Br2_1_10744.vasp,Mn1Ge1Sb1S1Br2,-1.847765245,-0.0754544195833352 -Ba2Cu1Te2F2_38_1976.vasp,Ba2Cu1Te2F2,-1.8748496985714287,0.6313051392857101 -Hf1Ge1Br2_8_7171.vasp,Hf1Ge1Br2,-2.75100725,0.5736121593750001 -Ir1Ru1S2Br4_1_8754.vasp,Ir1Ru1S2Br4,-1.83711754,0.1595210193749998 -Os2I2_129_13851.vasp,Os2I2,-1.30661717,1.4469713009375 -Mo3W1Se8_25_11732.vasp,Mo3W1Se8,-3.21813765,-0.4486320391666663 -Rb2Os2C2Br8O4_31_14905.vasp,Rb2Os2C2Br8O4,-2.7649229416666667,0.2248706977777716 -Sc2Br2O2_59_16040.vasp,Sc2Br2O2,-4.699739903333334,0.0400242866666662 -Ho2Br6_59_8128.vasp,Ho2Br6,-2.28994356625,0.0586856337500001 -Nb3C2F2_187_12961.vasp,Nb3C2F2,-6.25528145,0.1934473381904642 -Sr2Rh1_123_17300.vasp,Sr2Rh1,-0.2971693233333333,0.2609275649999996 -In2Ga2S6_31_8446.vasp,In2Ga2S6,-2.708825231,0.0140537054999998 -Sn4I10_127_16942.vasp,Sn4I10,-0.3644424921428571,0.1888730876785708 -Zn1O2_156_20987.vasp,Zn1O2,-0.8698000366666667,1.7173943637499975 -Sc3B2_187_16196.vasp,Sc3B2,-3.75517837,0.3151251539999975 -Tl2Se2_164_19530.vasp,Tl2Se2,-1.0343732725,0.2655063685416665 -Zn1Sn1I4Cl2_5_21013.vasp,Zn1Sn1I4Cl2,-0.26796702,0.1203806252343749 -Mo1Br2_164_11499.vasp,Mo1Br2,-1.4574935866666667,0.4054883574999999 -Cr2Te2C1_164_4518.vasp,Cr2Te2C1,-3.345377364,0.1056243408749999 -Gd2S2I2_59_6624.vasp,Gd2S2I2,-3.255238118333333,0.0485303666666672 -Lu1P2O8_164_10295.vasp,Lu1P2O8,-5.286486334545455,0.4238358381249897 -Mn1Ge1Sb1W2Se1Cl5O3_1_10745.vasp,Mn1Ge1Sb1W2Se1Cl5O3,-2.919137576428572,0.5186384042055332 -Na2Mn1P2O7F3_1_12209.vasp,Na2Mn1P2O7F3,-4.312223648,-0.0455086152500065 -Cu2C6Cl2F4_2_5075.vasp,Cu2C6Cl2F4,-3.743285722857143,0.452387010535711 -P2Pb2S6F2_7_14013.vasp,P2Pb2S6F2,-2.890079940833333,0.1239809184583281 -Si4H4O10_3_16490.vasp,Si4H4O10,-5.691220433888889,0.0174585789814765 -Li2V3F8_164_10129.vasp,Li2V3F8,-3.424997536923077,0.1962712292307655 -Ta4O10_59_18076.vasp,Ta4O10,-7.066063149285715,0.1795212464285711 -Hf4H2C3S2_164_7783.vasp,Hf4H2C3S2,-6.185247003636364,0.2516652872727203 -Cr4O12_7_4614.vasp,Cr4O12,-4.529357624375,-0.0765697845312498 -Zn1Mo6O16_156_20973.vasp,Zn1Mo6O16,-4.71275757652174,0.2675309873912894 -Nb4Fe2O10_59_13068.vasp,Nb4Fe2O10,-5.77291228875,0.5298257525000007 -Co2Se2_164_4023.vasp,Co2Se2,-1.9195844725,0.2334384948333308 -Mo2P4O12_4_11660.vasp,Mo2P4O12,-5.118575781111111,0.4051214652380913 -Cd2Cu2S2I2_26_3492.vasp,Cd2Cu2S2I2,-0.20157953375,0.1485492780208333 -Te2Ru1Rh1Se2_6_18509.vasp,Te2Ru1Rh1Se2,-2.2890149133333333,0.4092945877777778 -Ti2Te2_164_19044.vasp,Ti2Te2,-4.0258131675,0.4045366478124954 -Sn1Au1Se1S1I2_1_16608.vasp,Sn1Au1Se1S1I2,-0.8289710816666668,0.1905015237847202 -Pd1O2_164_14375.vasp,Pd1O2,-2.8373927233333336,0.0651726383333333 -Ti1Se1O1_156_18847.vasp,Ti1Se1O1,-5.69468752,0.1734806700000004 -Cs2S6I2_11_4781.vasp,Cs2S6I2,-1.1604481679999998,0.7020382716250005 -Mo2C3_187_11591.vasp,Mo2C3,-5.320368788,0.9573528619999918 -Y2Zn2P2O2_164_20784.vasp,Y2Zn2P2O2,-4.2279453575,0.1409968324999999 -Au1O2_47_1437.vasp,Au1O2,-1.1468751166666666,0.929112568541664 -Zn2Sb2Se6_147_21148.vasp,Zn2Sb2Se6,-1.316766748,0.374343363833331 -P2Ru2O6_162_14041.vasp,P2Ru2O6,-4.809309365,0.4209200336666621 -Nb6Ge2Te12_26_13192.vasp,Nb6Ge2Te12,-3.362432644,0.0796768790833304 -Hg1B2C8N8_164_7836.vasp,Hg1B2C8N8,-6.391584371578947,0.4823281216908548 -Nb2C2Cl2_59_12668.vasp,Nb2C2Cl2,-5.372579716666666,0.3482792549999933 -Li2Zr1H6O6_147_10140.vasp,Li2Zr1H6O6,-4.789117911333333,0.1118691819999999 -V1S2F2_164_19914.vasp,V1S2F2,-2.696032804,0.4150592997499971 -Cd1Sn2O2F2_12_3430.vasp,Cd1Sn2O2F2,-2.56521095,0.0533528838095198 -Hg1Te2_187_7921.vasp,Hg1Te2,0.3672632266666666,0.5738804644444443 -Ag2P2O6_162_348.vasp,Ag2P2O6,-3.873657743,0.3601160429999996 -Sr2Ag1Se2Br2_38_17109.vasp,Sr2Ag1Se2Br2,-1.53695192,0.0998156926190453 -Cd1Pd1Au1Br1Cl1O2_1_3397.vasp,Cd1Pd1Au1Br1Cl1O2,-0.9426501757142856,0.4409952381547608 -Ru2Se1S1Br2_8_15352.vasp,Ru2Se1S1Br2,-1.9805347133333333,0.5831929823611082 -Na4S8O4_7_12410.vasp,Na4S8O4,-2.854804304375,0.4136959962890626 -Y2F6_147_20732.vasp,Y2F6,-4.8793461425,0.3244737987499997 -B6N2_191_1779.vasp,B6N2,-5.7249860575,1.256944462916667 -Fe1C2I2N4F4_47_5641.vasp,Fe1C2I2N4F4,-2.996835571538462,0.6822254245031953 -V2Hg2O6_2_20086.vasp,V2Hg2O6,-3.724020939,0.1577194330000004 -Hg2Se2_129_8021.vasp,Hg2Se2,0.4002981475,-0.3917066175000001 -Tl1Ga1Hg1Se4_156_19273.vasp,Tl1Ga1Hg1Se4,-1.179618117142857,0.0653409079761884 -Co2P2Pd2_129_3960.vasp,Co2P2Pd2,-2.4722630933333334,0.4409550033333334 -Rb2Ta2Cu4Se8_28_14945.vasp,Rb2Ta2Cu4Se8,-2.21823065125,0.1513346018750003 -Nb2Te8Ru2_11_12934.vasp,Nb2Te8Ru2,-2.8351363175,0.1698212180555556 -Fe2S2Br2_59_5931.vasp,Fe2S2Br2,-1.60599826,-0.2103803916666666 -Nb2I2_129_12747.vasp,Nb2I2,-2.6815554325,0.7094810062499997 -Te2As2S1_164_18356.vasp,Te2As2S1,-2.357403946,0.0604723225416648 -Nb2S6_59_12856.vasp,Nb2S6,-4.35357883625,0.0189314173437504 -Mn3Ge1Te2_187_11381.vasp,Mn3Ge1Te2,-2.084309521666667,0.0839916836111082 -Re1S2_115_15018.vasp,Re1S2,-4.219750776666666,0.7203200475000004 -P4W2_2_14130.vasp,P4W2,-4.382538275,0.5970197316666672 -Zn2Ga2Se5_156_21085.vasp,Zn2Ga2Se5,-1.521305802222222,0.1789833230555542 -U1Tl2O4_123_19699.vasp,U1Tl2O4,-5.246995917142857,-0.3006538814880979 -Ti2Cl2O1_2_18921.vasp,Ti2Cl2O1,-5.042361544,0.0770931638333336 -V2I2N2_59_20094.vasp,V2I2N2,-3.964201128333333,0.0414272056249966 -Na2N4O4_1_12221.vasp,Na2N4O4,-4.44796573,0.208158192499996 -P2Pd3O8_164_14027.vasp,P2Pd3O8,-4.013181945384615,0.2321866111538435 -Nb3S1F7_156_13000.vasp,Nb3S1F7,-4.412678433636364,0.107567398484844 -B2S2O9_5_1698.vasp,B2S2O9,-5.246323476153846,0.0195083738461532 -Sc5C1Cl8_10_16268.vasp,Sc5C1Cl8,-3.3048726278571428,0.1065264492857114 -Ga1Pt3Br3N2Cl1_8_6247.vasp,Ga1Pt3Br3N2Cl1,-1.972069853,0.6216992285000001 -Ho2Te6_129_8151.vasp,Ho2Te6,-2.392294005,-0.7432036475000001 -Cu4S6Cl4_2_5461.vasp,Cu4S6Cl4,-1.1552707092857144,0.2491169101700659 -Sc12C4I22_2_15884.vasp,Sc12C4I22,-2.479408519736842,0.0807360173684212 -Ba4As2O1_123_2129.vasp,Ba4As2O1,-0.9872279528571428,1.8025789346428545 -Zn1Sb1_8_21007.vasp,Zn1Sb1,0.511077865,0.6750471874999999 -Zr1Bi1S1Br2_1_21254.vasp,Zr1Bi1S1Br2,-2.316868148,0.32899326275 -Cu2As2O6_162_5007.vasp,Cu2As2O6,-3.307192772,0.4330312841249971 -Pb2I2_1_14252.vasp,Pb2I2,-0.38610961,0.4863162445833334 -Ti2B1Se2_164_18891.vasp,Ti2B1Se2,-5.19195592,-0.6151481904999985 -Sr3Ni2Br2O5_123_17390.vasp,Sr3Ni2Br2O5,-3.096925039166667,-0.2578687512500028 -B18Te9_143_1616.vasp,B18Te9,-2.2748092007407408,2.3564429170370325 -Re1O2_115_15014.vasp,Re1O2,-5.4001756033333335,0.8469682825000007 -Cu2H2_129_5113.vasp,Cu2H2,-1.189420425,2.0176660425 -Na2Nb2Se4O14_26_12230.vasp,Na2Nb2Se4O14,-4.610762203181818,0.0861828804545457 -Ga1Si1Se3_143_6280.vasp,Ga1Si1Se3,-2.301214216,0.537635433124998 -Tb2V2O8_13_18212.vasp,Tb2V2O8,-5.876801576666666,0.3022938658333336 -Li2Ni2As2_12_10023.vasp,Li2Ni2As2,-1.6856903766666669,0.2157349983333332 -Fe2P2Br2O4_26_5902.vasp,Fe2P2Br2O4,-3.4632506480000003,0.2872089623571385 -Cu2I2N2O2_31_5166.vasp,Cu2I2N2O2,-2.220108095,0.201730353749999 -Au4S4_2_1590.vasp,Au4S4,-0.91938086125,0.09240770375 -Hf2S2I2_59_7571.vasp,Hf2S2I2,-3.9340024,-0.0087675100000081 -Co2Te2Mo2O12_18_4036.vasp,Co2Te2Mo2O12,-4.264049187222223,0.0527404123611066 -Na2Cd4Se2S6Br6_31_12040.vasp,Na2Cd4Se2S6Br6,-0.9565013655,0.2915109723333308 -Tl4Si2S6_2_19629.vasp,Tl4Si2S6,-2.549283170833333,0.1326365699999998 -As2Pd2Se6_12_1272.vasp,As2Pd2Se6,-1.972619327,0.2599976307999977 -Si1Te1W2S1Br3_1_16373.vasp,Si1Te1W2S1Br3,-2.512218695,0.6531562440624946 -In1Cu1P2S6_143_8228.vasp,In1Cu1P2S6,-2.7503163610000003,0.0691964774999998 -Tc2Cl6_12_18226.vasp,Tc2Cl6,-2.753341945,0.1600078637500002 -Li2Ti2C2Br2_59_10090.vasp,Li2Ti2C2Br2,-4.70234623,0.1682993124999998 -Te1Rh2S2Br1_6_18333.vasp,Te1Rh2S2Br1,-2.171627733333333,0.2158750478749989 -Er2Te6_129_5577.vasp,Er2Te6,-2.361250965,0.0545169337499999 -Sr2H2Br2_129_17231.vasp,Sr2H2Br2,-2.299145295,0.0668454649999996 -Li2Mg2_11_9982.vasp,Li2Mg2,-0.5077173125,1.5232510075 -Nb2Ni1S4_156_12773.vasp,Nb2Ni1S4,-4.033591884285714,0.4850590566666621 -Nb2F2_164_12711.vasp,Nb2F2,-4.8215434625,0.2853574675000006 -Ga1Ir1Pd1Rh1S5Br3_1_6205.vasp,Ga1Ir1Pd1Rh1S5Br3,-2.1166757225,0.1872413599999981 -Cd2Cu2S2Br2_26_3489.vasp,Cd2Cu2S2Br2,-0.37810718125,0.187793868125 -Zr1Ti3O8_1_21481.vasp,Zr1Ti3O8,-6.9205132075,0.3231249720833338 -Te2Os2_164_18430.vasp,Te2Os2,-2.6742524075,0.4492648212499999 -Zr1Bi1Mo1S1Br1Cl1_1_21252.vasp,Zr1Bi1Mo1S1Br1Cl1,-2.4331528116666665,0.7298368448958281 -Nb2Ni1Se6_12_12776.vasp,Nb2Ni1Se6,-3.2411892088888887,0.0920405322222222 -Bi2Te2_164_2566.vasp,Bi2Te2,-1.1219135975,0.3979234024999998 -Sb1Mo1Br1N2Cl1_1_15465.vasp,Sb1Mo1Br1N2Cl1,-3.4008258983333337,0.3955618470833313 -Al4N20_7_1075.vasp,Al4N20,-5.697425373333334,0.1030300083333277 -Ag1B6H4S2N6_6_19.vasp,Ag1B6H4S2N6,-4.839804020526316,1.0708462826315777 -P2Pt2O6_2_14031.vasp,P2Pt2O6,-4.17985459,0.7350984340000004 -Zr3Te2N2F2_187_21791.vasp,Zr3Te2N2F2,-4.466808436666667,0.6051245026388781 -Nb2N2Cl2_11_12768.vasp,Nb2N2Cl2,-5.587835955,0.1148921714333237 -Mo6O14_31_11762.vasp,Mo6O14,-4.973215777,0.2824064471666618 -Hg4O2_5_8083.vasp,Hg4O2,0.5437993033333334,0.239431040153257 -K2Ir2Br10N2O4_11_9208.vasp,K2Ir2Br10N2O4,-1.7908719705,0.3998370742500004 -Ga2H4C4F10_10_6380.vasp,Ga2H4C4F10,-3.068314801,1.0006765930000003 -Mo2Br2_164_11573.vasp,Mo2Br2,-1.8878710475,0.8516745881250001 -Ti1F2_164_18777.vasp,Ti1F2,-4.666685583333334,-0.3818924277777823 -Mo1Ir1S1Cl2O1_1_11522.vasp,Mo1Ir1S1Cl2O1,-2.711103033333333,0.6127502169444368 -Li4Se4O8_13_10227.vasp,Li4Se4O8,-3.80298668375,0.0988563256770833 -Ru1Se2_115_15294.vasp,Ru1Se2,-2.3495120666666667,0.8450883933333335 -Cr1S1O1_156_4244.vasp,Cr1S1O1,-4.01827183,0.115312424583329 -Mn2Ni2O6_147_11171.vasp,Mn2Ni2O6,-3.022459527,0.3867658479999961 -Mn2Sb2Se4F2_26_11249.vasp,Mn2Sb2Se4F2,-2.197324201,0.2730973024999983 -V1Ge1Te1Br1_1_19843.vasp,V1Ge1Te1Br1,-2.0379138475,0.160256518708328 -Gd2Ge1I2_164_6614.vasp,Gd2Ge1I2,-2.576360392,0.0433702339999997 -V1I1Cl1_156_19864.vasp,V1I1Cl1,-1.6525961633333337,0.0728920327777774 -Ge2Au2O6_51_6744.vasp,Ge2Au2O6,-3.215806453,0.1979520664999996 -Nb4S2N3_164_13142.vasp,Nb4S2N3,-6.786737597777778,0.0541565824073935 -Ga2Br2N2_59_6309.vasp,Ga2Br2N2,-2.799384558333333,0.5510828352777744 -Hg1O2_115_7891.vasp,Hg1O2,-0.6527959633333333,0.9801555476388876 -Bi12O12F12_14_2298.vasp,Bi12O12F12,-3.2353515522222223,0.0259842344444445 -Na2Be2_11_11989.vasp,Na2Be2,-0.60392186,0.6832839025 -Mo4O14_13_11755.vasp,Mo4O14,-4.561139444444445,0.3698550740277725 -Na2Ti2C2Cl2_59_12322.vasp,Na2Ti2C2Cl2,-4.50251511875,0.2374360115625 -Mn4H2C3S2_164_11436.vasp,Mn4H2C3S2,-3.913711709090909,0.4231688999999911 -Zn4Br8_115_21213.vasp,Zn4Br8,-0.0956538416666666,0.0970856420833333 -Rb2Cd4Br6O8_31_14803.vasp,Rb2Cd4Br6O8,-1.2594599745,0.303822826916667 -V1S2F1_156_19913.vasp,V1S2F1,-3.086940805,0.2799857956249973 -Li2I2O4_113_9964.vasp,Li2I2O4,-2.77417888875,0.2285578906249972 -Sr2S6N2F2_59_17304.vasp,Sr2S6N2F2,-3.1530202725,0.3113272309895765 -Ca4Co2S6Br2_129_3210.vasp,Ca4Co2S6Br2,-2.6198774828571425,0.091527395267855 -Ru2Cl8_14_15312.vasp,Ru2Cl8,-1.258257587,0.0613611910000002 -Mg1Br1Cl1_156_10344.vasp,Mg1Br1Cl1,-1.7329333266666669,0.0695657280555551 -Y1Br2_164_20614.vasp,Y1Br2,-2.921766013333333,0.1350174461111086 -K2Hg4Te2Br6O6_31_9194.vasp,K2Hg4Te2Br6O6,-1.22212073,0.2025914136666627 -Mn2Se2S8F4_7_11281.vasp,Mn2Se2S8F4,-2.25529469375,0.3956504476041669 -Sr4S4O12_14_17465.vasp,Sr4S4O12,-4.500132106000001,0.1643971129999948 -Ba1Ti4O8_162_1871.vasp,Ba1Ti4O8,-6.644862888461538,0.3478965119230708 -Li1Cu2C2O6_1_9691.vasp,Li1Cu2C2O6,-4.512845892727273,0.2569478028977207 -Sn1W1O4_3_16706.vasp,Sn1W1O4,-4.9077171066666665,0.3507019031585972 -Cr1Cu1S2_156_4153.vasp,Cr1Cu1S2,-2.1325808625,0.5850849393750004 -V2Cl8_1_20041.vasp,V2Cl8,-1.841620516,0.00983127 -Ag1Os1S2Br2_6_93.vasp,Ag1Os1S2Br2,-1.676296135,0.4272287955902758 -Pb1Br4_123_14175.vasp,Pb1Br4,-0.280726076,0.4330422940000002 -Ga4I4_51_6553.vasp,Ga4I4,-0.9422206975,0.0006740041666655 -Pd1Se2_164_14391.vasp,Pd1Se2,-1.69370045,0.1546362983333336 -Hf3Zr1Ti2Bi1Te3P3Se3_1_7760.vasp,Hf3Zr1Ti2Bi1Te3P3Se3,-4.50084596125,0.1697559107812506 -Nb4Co4Se8_53_13058.vasp,Nb4Co4Se8,-3.449214524375,0.2069682750000003 -Ba2Te2Au1F2_38_2066.vasp,Ba2Te2Au1F2,-1.826287604285714,0.6401975514285676 -Sr3Ag2S4Br2_123_17346.vasp,Sr3Ag2S4Br2,-1.9160961972727275,0.0249776653977213 -V2S6_59_20168.vasp,V2S6,-3.44047669125,0.0733670534374963 -Al1Ni1Se1I1Br2_1_692.vasp,Al1Ni1Se1I1Br2,-1.1287441166666663,0.0928723197222211 -Hf3Zr1Te8_6_7759.vasp,Hf3Zr1Te8,-3.3564769766666664,0.2572095300000003 -Al2Si2C1N1O10_1_979.vasp,Al2Si2C1N1O10,-5.7887537225,0.2879354496874995 -W2Cl2_129_20483.vasp,W2Cl2,-1.9980792075,2.0364438875 -As2Br6_150_1194.vasp,As2Br6,-1.081548515,0.0878502075 -Pt2I4_14_14633.vasp,Pt2I4,-0.36741193,0.147943655 -Sb4Pb8S8I12_14_15804.vasp,Sb4Pb8S8I12,-1.4723313075,0.0536652921875 -K4Ru2N2O4F10_59_9501.vasp,K4Ru2N2O4F10,-2.754144862727273,0.3378764319318104 -Cd2Ag2S2F2_26_3443.vasp,Cd2Ag2S2F2,-0.56925829875,0.2208579815625 -Ca2Cu1S2F2_38_3000.vasp,Ca2Cu1S2F2,-2.3776908857142858,0.5005056133333283 -Sb2P2O6_7_15621.vasp,Sb2P2O6,-4.750964777,0.3385489828749943 -Te1Pd1Rh1Se1_156_18325.vasp,Te1Pd1Rh1Se1,-1.646529265,0.4405588993749973 -Hf2Te2F2_59_7633.vasp,Hf2Te2F2,-4.165927723333334,0.1705984112499949 -Nb2I4_11_12750.vasp,Nb2I4,-2.140329131666667,0.2219740033333297 -Pd2O2_10_14445.vasp,Pd2O2,-2.17042026,0.4695287974999997 -Ta1Ti1Br1N1Cl1_156_17632.vasp,Ta1Ti1Br1N1Cl1,-5.332608098,0.2439007609999888 -Zr4Sn4_59_21852.vasp,Zr4Sn4,-2.72050313,0.7185227933333329 -Hf1Al5Ni2_123_7104.vasp,Hf1Al5Ni2,-2.01854929375,0.528587655625 -Al2In2Cl8_10_886.vasp,Al2In2Cl8,-1.861337053333333,0.1827366616666668 -Sc1Ni1Se2_156_15968.vasp,Sc1Ni1Se2,-2.327183315,0.5989867918749998 -Ga4_2_6581.vasp,Ga4,-1.4780109275,-0.3831119475 -Mn1Te2Ru1_156_10909.vasp,Mn1Te2Ru1,-1.96360486,0.5165320731896554 -Nb4H2C3S2_164_13084.vasp,Nb4H2C3S2,-6.020440315454545,0.2365433147474689 -Co1C8Br2F4_25_3722.vasp,Co1C8Br2F4,-4.600659300666666,0.5189522673888783 -K4Te4F20_57_9521.vasp,K4Te4F20,-2.311605784642857,0.0636882314285713 -Mo12F24_55_11482.vasp,Mo12F24,-3.0233618527777777,0.0710290655555527 -Be1F2_164_2221.vasp,Be1F2,-3.973292823333333,0.3330346466666669 -Ta2Br10_2_17662.vasp,Ta2Br10,-2.0410593733333333,0.1134064966666668 -Sb1S1_123_15491.vasp,Sb1S1,-2.058932435,0.6583230104166644 -Fe3B2Cl2_187_6041.vasp,Fe3B2Cl2,-2.368438742857143,-0.0139150438775555 -Ti1Ge1Se2I2_1_18785.vasp,Ti1Ge1Se2I2,-2.5857328716666665,0.2599206841666666 -Ag1S2F2_12_111.vasp,Ag1S2F2,-1.286629464,0.3968909317500001 -Ag2H8C8Br2_2_294.vasp,Ag2H8C8Br2,-4.3807130005,0.2879375465000002 -Cu2Sb2O6_12_5265.vasp,Cu2Sb2O6,-3.149977728,0.5104208114999995 -Y1Mn1Ge1S3I2_1_20651.vasp,Y1Mn1Ge1S3I2,-2.802137885,0.2948281214843748 -Ga1Ni5Br2_123_6220.vasp,Ga1Ni5Br2,0.02112421125,-0.031700477193526 -Tl2Pt4Se6_164_19491.vasp,Tl2Pt4Se6,-1.8867450925,0.1331123541666667 -Mg3Si4H2O12_2_10566.vasp,Mg3Si4H2O12,-5.67811345,0.0202353000000004 -Fe1Se1I1Br1_25_5752.vasp,Fe1Se1I1Br1,-0.66616577,0.42237970546875 -Ta2Cl2O2_59_17689.vasp,Ta2Cl2O2,-5.406260811666667,0.3186411296666616 -Co2S4_59_3988.vasp,Co2S4,-2.52443835,0.4663259741666667 -Cu2S2_59_5254.vasp,Cu2S2,-1.0686159525,0.2937877591666666 -Co2Sb2S4Cl2_10_4000.vasp,Co2Sb2S4Cl2,-2.240303508,0.2244162439166644 -Sb4Se6_11_15826.vasp,Sb4Se6,-2.2324789970000003,0.1281408329999998 -Ta4S12_11_18100.vasp,Ta4S12,-4.705516248125,0.0612677968750006 -Cd2H4Se2O8_31_3513.vasp,Cd2H4Se2O8,-3.403933020625,0.0268387347916667 -Si2P2S6_147_16424.vasp,Si2P2S6,-3.301057649,0.4331859958593729 -Cr4O8F8_14_4616.vasp,Cr4O8F8,-3.688998992,-0.2055000521250038 -Si2I8_1_16409.vasp,Si2I8,-0.42540136,0.463261922 -Ta3C2S2_187_17952.vasp,Ta3C2S2,-7.132428682857143,-0.0243829028571509 -Cu4S2_191_5445.vasp,Cu4S2,-0.5280221183333333,0.4668876683333323 -K1_191_8964.vasp,K1,1.49306033,0.2582992699999999 -Cu1Sb1Se1S1I2_8_4966.vasp,Cu1Sb1Se1S1I2,-0.9994646866666668,0.2446920427083305 -Y1Cu2S2_164_20627.vasp,Y1Cu2S2,-2.506761922,0.8427802025000002 -In2S2O8F2_11_8550.vasp,In2S2O8F2,-3.3744193207142854,0.6459382861904737 -Cd1H10C16S2N6_2_3319.vasp,Cd1H10C16S2N6,-5.786413636285714,-0.0555953141666705 -Cu4Hg4Se4Br4_51_5425.vasp,Cu4Hg4Se4Br4,0.04243452375,-0.1009725315972215 -Ce1Mg5_8_3648.vasp,Ce1Mg5,-0.13019849,0.3871702332051278 -Al2P2I16_7_922.vasp,Al2P2I16,-0.525316432,0.1196213545 -Cu2S2I2N2_31_5246.vasp,Cu2S2I2N2,-1.7415138475,0.2378526982440463 -K2Te2N2Cl6O6_4_9374.vasp,K2Te2N2Cl6O6,-2.3585001944444444,0.4501906407992376 -Y3N2Cl2_187_20801.vasp,Y3N2Cl2,-5.79445008,-0.09246997428572 -In2O2F2_59_8508.vasp,In2O2F2,-3.315769385,0.1334880591666669 -Zr2Ge2S2_129_21568.vasp,Zr2Ge2S2,-4.404335523333333,0.1541917233333336 -Rh3Br1O5_1_15249.vasp,Rh3Br1O5,-2.995312707777778,0.661428226018515 -Ge12Pd4_1_6633.vasp,Ge12Pd4,-2.642035228125,-0.1527887331250002 -Ba2Au1O2F2_38_1906.vasp,Ba2Au1O2F2,-3.01875937,0.4648968076190423 -Ta1S2_115_17607.vasp,Ta1S2,-4.784600356666666,0.6361322316666671 -Ta2Te2_187_17909.vasp,Ta2Te2,-4.0282294875,0.7181495437499952 -Li2S2F2_129_10051.vasp,Li2S2F2,-2.354048145,0.6262078981249971 -Bi2P2O6_7_2487.vasp,Bi2P2O6,-4.566273375,0.323305659499995 -Ti1W2O8_2_18871.vasp,Ti1W2O8,-6.2027110263636365,0.0430935190909025 -Ta4Ni6Se10_59_18072.vasp,Ta4Ni6Se10,-2.8484354775,0.0383161960999977 -Sr2N2Cl1_164_17282.vasp,Sr2N2Cl1,-2.567811058,1.3009039802499898 -P1Se1I1_156_13948.vasp,P1Se1I1,-1.60199489,0.3548172180555526 -Fe1S2F2_164_5743.vasp,Fe1S2F2,-2.180342612,-0.1223530865000023 -Ta6Si2Se12_26_18154.vasp,Ta6Si2Se12,-4.565131244,0.0846041724652699 -Al2S2Br2_31_933.vasp,Al2S2Br2,-2.77023733,0.0135351983333333 -Ga1Os1S2Br1Cl1_25_6226.vasp,Ga1Os1S2Br1Cl1,-2.563818373333333,0.3257729592708269 -In2Te2S1_6_8625.vasp,In2Te2S1,-1.576295594,0.1809371333404222 -Ga4Cl4_57_6548.vasp,Ga4Cl4,-1.61124483125,-0.0449922325 -K2Ru2Br8N2O4_31_9312.vasp,K2Ru2Br8N2O4,-2.3115035844444445,0.2297931336111089 -Na4Sb4F16_14_12411.vasp,Na4Sb4F16,-2.858670920416667,0.0552221654166662 -Bi2Pt2S4I2Br2_8_2507.vasp,Bi2Pt2S4I2Br2,-1.5950179891666665,0.1807673006944426 -Ge2P2C2S6F6_7_6800.vasp,Ge2P2C2S6F6,-3.331032897777778,0.3773097125694409 -Ta2Ge2Sb2_129_17742.vasp,Ta2Ge2Sb2,-4.278091128333333,0.3092605806745935 -Tl2As2Se6_1_19364.vasp,Tl2As2Se6,-1.783650926,0.3043554079166643 -Fe1H4C6N2Cl2_25_5705.vasp,Fe1H4C6N2Cl2,-5.2957856906666665,0.1641614718888724 -Na2Cd4O8F6_31_12024.vasp,Na2Cd4O8F6,-1.8472089035,0.2973673099861103 -Na2Cu2Te2_129_12070.vasp,Na2Cu2Te2,-0.80778541,-0.5929957366666667 -Mn5S2Br4Cl1O4_1_11461.vasp,Mn5S2Br4Cl1O4,-2.750143755625,-0.0152649917887929 -Ca3Cu2S4Cl2_123_3170.vasp,Ca3Cu2S4Cl2,-2.1007705781818182,0.0734980237878747 -Na6H2Se2O8_11_12440.vasp,Na6H2Se2O8,-3.538260823333333,0.087740358611108 -Mn2Ga2S5_187_11076.vasp,Mn2Ga2S5,-3.049121358888889,-0.1392068405555553 -Sm2Te2_129_16589.vasp,Sm2Te2,-2.9786956575,0.2320312537500002 -Tb2Br2O2_129_18183.vasp,Tb2Br2O2,-4.79643599,0.0534811800000003 -Nb2Te2_164_12915.vasp,Nb2Te2,-3.78410197,-0.151429739166671 -Sb1Br1O1_156_15437.vasp,Sb1Br1O1,-2.3772283233333336,0.5302511193333315 -Y1Sn3_191_20679.vasp,Y1Sn3,-1.60984823,0.4139301099999999 -Si2Sb2Se6_2_16442.vasp,Si2Sb2Se6,-2.331478404,0.4828877476249984 -Mg1Ga2O4_164_10362.vasp,Mg1Ga2O4,-4.521348724285715,0.1738669489285706 -K2Hf1O6F6_2_9167.vasp,K2Hf1O6F6,-2.6164637953333334,1.014000812166667 -Cu1O2_164_4928.vasp,Cu1O2,-2.0041258733333334,0.7634543908333311 -Ca4Si2Br2_129_3241.vasp,Ca4Si2Br2,-1.557120465,0.4166274353124977 -Mo1Pd1O4_5_11539.vasp,Mo1Pd1O4,-4.087280055,0.2111852033333293 -Ti1Mn3O8_164_18800.vasp,Ti1Mn3O8,-4.90032629,0.2642446375000002 -In5P1Pd1S2I6_1_8707.vasp,In5P1Pd1S2I6,-1.1851704626666666,0.1466501303703654 -Ba2Mg2Sn2_129_2021.vasp,Ba2Mg2Sn2,-0.1564828166666666,0.8350184625 -Mn2P2Se4I2_10_11201.vasp,Mn2P2Se4I2,-2.038005432,0.1690565091222192 -K2H2S2_11_9127.vasp,K2H2S2,-2.326164046666667,0.0891923766666664 -Ag2Se2_10_434.vasp,Ag2Se2,-0.384203325,-0.0972473174999999 -Sb1Pb2O6_162_15477.vasp,Sb1Pb2O6,-3.61576363,0.2717581563888893 -Hg2Cl2_129_7954.vasp,Hg2Cl2,1.13690531,0.5752937275 -Hf1Pd2_65_7270.vasp,Hf1Pd2,-1.7207617266666666,1.6348072318750009 -Pt1Se2_115_14593.vasp,Pt1Se2,-1.5884366200000002,0.6618086249999997 -Sb2Cl2O2_129_15564.vasp,Sb2Cl2O2,-3.0929714666666666,0.0383351555555555 -K2Ru2C2Cl10O2_11_9314.vasp,K2Ru2C2Cl10O2,-2.497486893888889,0.0992314863888795 -Al2Sb2Te6_162_955.vasp,Al2Sb2Te6,-1.760267,0.2705298841249999 -Ga1Sn1Se2Cl2_2_6285.vasp,Ga1Sn1Se2Cl2,-1.769269055,0.2229396320833334 -Mo1Pb3_191_11538.vasp,Mo1Pb3,-0.1520513875,2.18639738 -In1Sn1Te1Se1Br2_1_8361.vasp,In1Sn1Te1Se1Br2,-1.2146202483333333,0.2344643193055539 -Hg1H4C4N2Cl2_10_7875.vasp,Hg1H4C4N2Cl2,-4.490275381538462,0.2799254534615247 -Pt2S2Cl2_59_14653.vasp,Pt2S2Cl2,-1.86776915,0.0402831941666651 -Cr2Sb2Te6_162_4486.vasp,Cr2Sb2Te6,-1.581895155,0.3694888580999961 -Al2H6O6_2_868.vasp,Al2H6O6,-4.90766599,-0.3807904788095277 -Fe6Pb1S4O28_12_6094.vasp,Fe6Pb1S4O28,-3.7579584192307696,0.2497309208974237 -Nb2Te4_127_12924.vasp,Nb2Te4,-2.194725375,1.194194986111111 -In2Br6_1_8394.vasp,In2Br6,-0.8400559075,0.14227245125 -Fe1S2_115_5745.vasp,Fe1S2,-1.96338336,-0.027257445 -Ni1Se1Cl1_6_13419.vasp,Ni1Se1Cl1,-0.8035475833333333,0.0930778366666666 -Ga2S2_2_6448.vasp,Ga2S2,-2.6978177475,0.1579087475 -Ba2Ir1_123_2013.vasp,Ba2Ir1,-0.94335009,0.4929079766666652 -Au4S4Br4_14_1583.vasp,Au4S4Br4,-0.5948733241666667,0.0906423163194437 -Au3S2Br1F1_1_1561.vasp,Au3S2Br1F1,-0.4701536671428571,0.277530306383927 -Al2In1Te1Se4I2_1_885.vasp,Al2In1Te1Se4I2,-1.774711065,0.2472536223124984 -Zr1Nb1I3Br3_1_21348.vasp,Zr1Nb1I3Br3,-1.96614385625,0.1947997555208313 -Y1Co1F5_47_20624.vasp,Y1Co1F5,-3.0689670028571427,0.8966692046428539 -Fe2C1Cl2_164_5825.vasp,Fe2C1Cl2,-2.311417722,0.7499875660000006 -La2C2I2_12_9585.vasp,La2C2I2,-4.329017385,0.0227715808333279 -Hg1Br1N1_25_7841.vasp,Hg1Br1N1,-0.3657956633333333,0.9516321741666656 -Na1Fe1P2S6_5_11852.vasp,Na1Fe1P2S6,-2.935220718,-0.0549262860681879 -Mn2I2O3_1_11112.vasp,Mn2I2O3,-2.89021905,0.0956828887499994 -Zr2C1I2_164_21533.vasp,Zr2C1I2,-4.034376456,0.0613188731428575 -Os2Se6_11_13891.vasp,Os2Se6,-2.79360997375,0.4418531095833332 -Ta2Ga1Ni1S4Br3Cl1_6_17738.vasp,Ta2Ga1Ni1S4Br3Cl1,-2.9853966666666665,0.1945904906398728 -Al3S4_164_1052.vasp,Al3S4,-3.5435389571428573,0.1331208552380931 -Ga1P2Pd1S6_1_6233.vasp,Ga1P2Pd1S6,-2.8882445270000003,0.2026415630740677 -H4Pd1C2I2N6_6_7072.vasp,H4Pd1C2I2N6,-4.169340380666666,0.3171783814722113 -Cl2F2_4_3691.vasp,Cl2F2,-0.32846527,0.1165447547916663 -K2Mn1P2H3S7_1_9234.vasp,K2Mn1P2H3S7,-2.771193481333333,0.2463174686712862 -W1O3_187_20445.vasp,W1O3,-4.8618086575,1.0022271456249996 -Hf1Cd1Se2_156_7139.vasp,Hf1Cd1Se2,-2.1994367225,0.6432274212500007 -Zn12P8_115_20893.vasp,Zn12P8,-0.3678421639999999,0.30545758225 -Li2Hf1O6F6_1_9961.vasp,Li2Hf1O6F6,-2.94127759,1.0806789005000006 -Na2Ru2C2Cl8O4_7_12275.vasp,Na2Ru2C2Cl8O4,-2.9310609788888886,0.4154482356944421 -V1Te8W3_25_19949.vasp,V1Te8W3,-2.7340082758333337,0.1414754523611106 -In1Te4_8_8367.vasp,In1Te4,-1.014197402,0.4365418890000002 -P2Ir2O6_1_13992.vasp,P2Ir2O6,-4.497360819,0.8412931053333281 -Sr1As2F12_2_17021.vasp,Sr1As2F12,-2.7567815406666667,-0.0848946119999999 -Sn2As2Cl2O6_7_16716.vasp,Sn2As2Cl2O6,-3.5544545325,0.22902668 -Mo2Br4_14_11576.vasp,Mo2Br4,-1.4767090433333332,0.3862729008333334 -Zr3Br1Cl1O3_1_21749.vasp,Zr3Br1Cl1O3,-5.03744163875,0.3853567129166668 -Sc2Se1S1I2_6_16153.vasp,Sc2Se1S1I2,-3.0450572366666666,0.0539910875000004 -Ti2S2Cl2_59_18996.vasp,Ti2S2Cl2,-4.449038451666667,-0.1540831963888926 -Sb1I2_187_15462.vasp,Sb1I2,-0.4216972833333333,0.3597762424999993 -H4Au4Cl4O4_14_7059.vasp,H4Au4Cl4O4,-1.870788790625,0.1200676920833332 -Bi2Te6P2_1_2579.vasp,Bi2Te6P2,-1.733923512,0.3304883789999985 -Si1Pb1_156_16356.vasp,Si1Pb1,-1.538761415,0.62040617 -Na2Mn1P2S7F3_1_12211.vasp,Na2Mn1P2S7F3,-2.947539504,-0.0023440455875028 -Mn2Fe1C12_164_11068.vasp,Mn2Fe1C12,-5.135959934,1.790420847333324 -Cu4H4O4F4_14_5413.vasp,Cu4H4O4F4,-2.5100996925,0.2093261465104171 -Cr2S5F2_12_4473.vasp,Cr2S5F2,-2.7468768655555555,0.3738043724305526 -Cu1Pd2O4_187_4941.vasp,Cu1Pd2O4,-2.4290499442857145,0.2857793942857127 -Fe6O8F4_47_6092.vasp,Fe6O8F4,-3.3267833277777776,-0.1246958709722249 -Ge4Sb8_26_6947.vasp,Ge4Sb8,-2.4521663866666668,-0.205463130000002 -Na2N2F4_67_12216.vasp,Na2N2F4,-2.3205331725,0.4081849204166625 -Ba1Ti1O3_25_1870.vasp,Ba1Ti1O3,-5.368784078,0.5464013640000003 -V4B3H2S2_164_20303.vasp,V4B3H2S2,-4.310915223636363,0.2519787452272688 -K2Mn2Cl6O4_2_9239.vasp,K2Mn2Cl6O4,-2.214118685,0.1047386084873898 -Cd3B2O6_189_3608.vasp,Cd3B2O6,-3.590141303636364,0.429139299999997 -Mn2Se1Cl3_6_11268.vasp,Mn2Se1Cl3,-1.8838337516666668,0.0367740741666665 -Si12Ni4_127_16311.vasp,Si12Ni4,-2.941926010625,-0.762951745625 -Zn1In1Ni1I1Cl1O1_1_20963.vasp,Zn1In1Ni1I1Cl1O1,-0.89205209,0.7697964969965227 -Si8_65_16552.vasp,Si8,-3.40081826875,-0.4106692187500003 -Ba2Ga2O4F10_11_1986.vasp,Ba2Ga2O4F10,-3.143078920555556,0.2914985047222193 -Ba2I4O8_125_2005.vasp,Ba2I4O8,-2.713505506428572,0.2748270740476171 -Sr2Si2Ni2_129_17316.vasp,Sr2Si2Ni2,-1.347857245,0.2091852833333334 -W2N1O2_164_20509.vasp,W2N1O2,-6.079497134,0.0685537345170008 -Hf2Sb1Te2_164_7584.vasp,Hf2Sb1Te2,-3.946547472,0.1888767425000002 -Mn1Sn1Br2_3_10891.vasp,Mn1Sn1Br2,-1.01895349,-0.7088088181249999 -Ca2H8Cl4O4_53_3039.vasp,Ca2H8Cl4O4,-3.647332052777778,0.0575676627777772 -Ge2Se2_123_6872.vasp,Ge2Se2,-2.2681145575,0.6321787875 -Sc1Sn1Se1Cl3_1_16005.vasp,Sc1Sn1Se1Cl3,-2.322644711666667,0.1287980424999976 -Be1P2H4S4_5_2227.vasp,Be1P2H4S4,-3.424200596363636,-0.1005636683712184 -Nb3Cl7O1_156_12967.vasp,Nb3Cl7O1,-3.537830706363636,0.1162012805909051 -Ti1Pd1S2_115_18829.vasp,Ti1Pd1S2,-3.8903321725,0.1613108994552499 -Tl1I2_187_19291.vasp,Tl1I2,0.0545878633333333,0.2196394122916665 -K4La4P8Se24_14_9470.vasp,K4La4P8Se24,-2.929463208,0.0560964704999999 -As1I3_187_1152.vasp,As1I3,-0.2277963375,0.45777589125 -Rh5S10_1_15255.vasp,Rh5S10,-2.81535512,0.3654127833333305 -Ge1As1O2_1_6635.vasp,Ge1As1O2,-4.05534786,0.4109224431249996 -Te6P2Au2_147_18663.vasp,Te6P2Au2,-1.229768933,0.2675263431944424 -Rb1Br2_25_14723.vasp,Rb1Br2,-0.2925163633333333,0.4340115049999994 -K2Cd4S8Cl6_31_9055.vasp,K2Cd4S8Cl6,-1.0819853915,0.2786331598125003 -Ca2I2F2_129_3052.vasp,Ca2I2F2,-2.515164606666666,0.0512704233333333 -Cu2H12C14N8_51_5105.vasp,Cu2H12C14N8,-5.636157373333333,-1.7385553780555636 -Ir2F2_13_8783.vasp,Ir2F2,-2.16360474,1.1384800808333309 -Au2O1_191_1498.vasp,Au2O1,0.41051206,1.7145882716666656 -Sn2S2_129_16841.vasp,Sn2S2,-1.9448417475,0.5189884737499999 -Bi2Se2Br2_59_2538.vasp,Bi2Se2Br2,-1.5198437416666666,0.1169853116666665 -Cd2Te2Mo2O12_113_3594.vasp,Cd2Te2Mo2O12,-3.9153506394444446,0.054021082222222 -V3Fe3Te2O16_1_20260.vasp,V3Fe3Te2O16,-4.501450374583333,0.0318299911111106 -Co2Ni2Sb2_129_3942.vasp,Co2Ni2Sb2,-0.9034282316666666,0.3894318083333322 -Mn6I18_164_11469.vasp,Mn6I18,-0.3076624216666666,0.1429237000520833 -Au2Se1O4_21_1535.vasp,Au2Se1O4,-2.0699185114285714,0.2778202757142847 -Ge2S2O8_31_6827.vasp,Ge2S2O8,-4.369345663333333,0.2594092162500003 -Al2Se2Br2_59_960.vasp,Al2Se2Br2,-2.362316115,0.0734569099999999 -In1As2Au1Se6_149_8192.vasp,In1As2Au1Se6,-1.8051457760000005,0.2701992448333308 -Mg3Si4O12_12_10567.vasp,Mg3Si4O12,-5.646555104736842,0.0663148563157851 -Cs2Sb4Se8_2_4786.vasp,Cs2Sb4Se8,-1.9763414092857143,0.2218253014285713 -Cu8P8O24_14_5503.vasp,Cu8P8O24,-4.279657535749999,0.2378237777500009 -Nb1B1Te2S1_8_12468.vasp,Nb1B1Te2S1,-3.618730202,0.5927238086666672 -Sb2O2F2_31_15611.vasp,Sb2O2F2,-3.57746675,0.100456134791667 -Hf1S2_115_7280.vasp,Hf1S2,-4.853846496666667,0.5879177699999998 -Si4Te4Pt4_14_16519.vasp,Si4Te4Pt4,-2.75565314,0.1980966937500006 -Al1Co5Cl2_123_632.vasp,Al1Co5Cl2,-1.6075965575,0.4610537874999977 -Ir2S2_129_8821.vasp,Ir2S2,-2.9656553825,0.866871175833329 -Nd1Pb5_47_13224.vasp,Nd1Pb5,-0.988762215,0.2644891916666656 -Cd4W2S8_13_3636.vasp,Cd4W2S8,-1.9264933342857145,0.4139996364285689 -Si4Se4_57_16515.vasp,Si4Se4,-3.09199148875,-0.00038538859375 -Cu2Bi2O4_51_5040.vasp,Cu2Bi2O4,-2.6045566675,0.6182097669531254 -Sb6O12F2_4_15851.vasp,Sb6O12F2,-3.6273767425,0.5533997199821352 -Sb2Os2O6_162_15618.vasp,Sb2Os2O6,-4.540424436,0.3500998772499945 -Ta2Fe4Se6_11_17734.vasp,Ta2Fe4Se6,-2.698648460833333,0.4803591099999957 -K1Mo2Br6O2_47_8916.vasp,K1Mo2Br6O2,-2.2019945745454548,0.0458726736363632 -K2S6N2F2_1_9337.vasp,K2S6N2F2,-2.5027466691666667,0.2209699226041628 -Hf1Zr1Br1Cl1O2_1_7375.vasp,Hf1Zr1Br1Cl1O2,-4.964541165,0.3876860125000001 -Hf2Cu1H1Ir1Se7Cl2_1_7484.vasp,Hf2Cu1H1Ir1Se7Cl2,-2.983501527142857,0.3786645854265758 -P4_11_14131.vasp,P4,-3.8757668275,0.1702291575000001 -Pt1Se1S1_156_14591.vasp,Pt1Se1S1,-2.3816061066666667,0.0660888758333331 -Ni1Ir1Br6_149_13366.vasp,Ni1Ir1Br6,-0.60442963625,0.0198424424999999 -Sb1F3_187_15451.vasp,Sb1F3,-2.1960168025,0.9201166125000002 -Zn2Te4_14_21188.vasp,Zn2Te4,-0.117351535,0.488364290555555 -Ca2S8I4_125_3114.vasp,Ca2S8I4,-1.6493058978571429,0.3920331009285698 -Rb4Te2_51_14982.vasp,Rb4Te2,-0.30957816,0.3728284633333333 -Ba3Bi3_25_2098.vasp,Ba3Bi3,-0.7489561616666666,0.7514319861904749 -Hf3Te2H2C2_187_7735.vasp,Hf3Te2H2C2,-5.023036542222222,0.551832993827156 -As2Pd3S8_164_1274.vasp,As2Pd3S8,-2.364351470769231,0.3675868653461511 -Sn1Ge1_156_16637.vasp,Sn1Ge1,-1.65538942,-1.87261335 -Ta2S2Cl2_59_17845.vasp,Ta2S2Cl2,-4.527580763333334,0.0573682383333289 -Sc2Se2_129_16161.vasp,Sc2Se2,-3.6050150525,0.1869398649999998 -Cu1Bi1As2Se6_143_4848.vasp,Cu1Bi1As2Se6,-1.903780756,0.2248039804722179 -Hf3Zr1S8_156_7754.vasp,Hf3Zr1S8,-5.181155665,0.0998851768750004 -Cu4Bi2As2O12_31_5395.vasp,Cu4Bi2As2O12,-3.1823240695,0.4119335237499976 -Pt2Br4_14_14604.vasp,Pt2Br4,-0.6881060316666666,0.0941861358333333 -Rb2Te2C2S6F6_1_14950.vasp,Rb2Te2C2S6F6,-2.4721727327777776,0.4716384169675881 -Cs4Hg2Br8_11_4809.vasp,Cs4Hg2Br8,-0.309925485,0.2075126171428571 -B3Mo4Cl2_164_1732.vasp,B3Mo4Cl2,-3.939842407777778,0.1608527081481446 -As1Se1Br1_156_1174.vasp,As1Se1Br1,-1.7663865166666666,0.2332938141666669 -Te10P10_26_18269.vasp,Te10P10,-2.3193063030000003,0.4895845678333331 -P1Pt1_187_13937.vasp,P1Pt1,-2.43261043,1.2609064909374998 -Ba2I4_51_2007.vasp,Ba2I4,-1.240039035,0.3044828916666666 -Zn2Cr3O8_10_21063.vasp,Zn2Cr3O8,-3.93796713,0.0751714468749977 -Cu2N2O2F2_31_5191.vasp,Cu2N2O2F2,-2.8993353775,0.2409758612500003 -Sr2Cu1S2Cl2_38_17201.vasp,Sr2Cu1S2Cl2,-2.1534462957142857,0.1177839933333294 -Cu2Re1H6_5_5235.vasp,Cu2Re1H6,-2.722447674444444,1.7032627866666634 -Nb1Zn1Se2_1_12619.vasp,Nb1Zn1Se2,-2.21161042,0.078970333942306 -Be2Sb4_12_2268.vasp,Be2Sb4,-2.1909230066666665,0.0818409699999982 -Mg2Al2Te5_164_10420.vasp,Mg2Al2Te5,-1.8985785444444447,0.072003597222222 -Ce2S2I2_164_3674.vasp,Ce2S2I2,-3.353751678333333,-0.0102239475000001 -Te1Ir2Br1O2_1_18295.vasp,Te1Ir2Br1O2,-2.6386195166666666,0.9208582292361072 -Dy2S6_51_5533.vasp,Dy2S6,-3.6435462875,0.1985738877343748 -Ge1Br4_123_6655.vasp,Ge1Br4,-0.716308976,0.45396681075 -P2Pt3Se8_164_14036.vasp,P2Pt3Se8,-2.2992111284615384,0.4369030906410196 -Sr2Hg1_123_17253.vasp,Sr2Hg1,1.06526949,0.2448775866666666 -Sb2I6_1_15594.vasp,Sb2I6,-0.47013166625,0.12358016625 -B6Pd1C2I2F4_6_1785.vasp,B6Pd1C2I2F4,-3.815309266,0.6160841994629507 -V3Mo1Se1S7_8_20278.vasp,V3Mo1Se1S7,-3.5959967425,0.1352183986111076 -Ca3Cu2S4Br2_123_3169.vasp,Ca3Cu2S4Br2,-2.0157304454545457,0.077238845151511 -K2H2C6N8O10_2_9122.vasp,K2H2C6N8O10,-5.314122601428571,0.2685483738690375 -Cu1Ni1Pd1Pt1I3Cl1O4_1_4921.vasp,Cu1Ni1Pd1Pt1I3Cl1O4,-1.4183982883333333,0.2010243563472194 -Ta2S2F2_59_17847.vasp,Ta2S2F2,-5.085086045,-0.0874532698333432 -Ag2B4N2Cl2F4_2_189.vasp,Ag2B4N2Cl2F4,-3.6544381735714286,0.3724482588095147 -Sc4S2N3_164_16255.vasp,Sc4S2N3,-5.677464974444444,-0.1094673793518565 -Ta2I6_162_17766.vasp,Ta2I6,-1.7777639575,0.3157343739843754 -Cr1Te4Au1_10_4279.vasp,Cr1Te4Au1,-1.1187720533333334,0.2040782116666666 -Cr4S10_31_4622.vasp,Cr4S10,-2.8864348557142856,0.4563600070535688 -Mo2Se1S1I1_99_11682.vasp,Mo2Se1S1I1,-2.374252208,0.606572413666667 -Sr2Ag1Br2O2_123_17099.vasp,Sr2Ag1Br2O2,-2.487159808571428,0.0515729257142829 -Nb2Ru2S8_11_12829.vasp,Nb2Ru2S8,-4.146895069166667,-0.1962657833333332 -Ta2Ir2S8_11_17769.vasp,Ta2Ir2S8,-4.426044380833333,-0.17100062 -Si4Ni8As4_29_16495.vasp,Si4Ni8As4,-1.4617587325,0.394180893125 -Sn2Br4_12_16748.vasp,Sn2Br4,-1.0378458566666666,0.1291457283333335 -N4Cl12_14_11791.vasp,N4Cl12,-1.290898366875,0.244995675625 -Rb2Cl1_164_14832.vasp,Rb2Cl1,-0.3976642999999999,0.1427379633333329 -Na4Hg1P2_164_12391.vasp,Na4Hg1P2,-1.2247644771428572,0.0864699942857143 -B1_123_1645.vasp,B1,-4.30886605,1.8521192483333333 -H3Pt1_191_7049.vasp,H3Pt1,-2.30512238,2.1571469062500004 -Si3As2O9_174_16463.vasp,Si3As2O9,-5.643059272142857,0.0794695907142797 -Sc1Pd1S3Br2_1_15980.vasp,Sc1Pd1S3Br2,-2.34994288,0.2645982803124951 -In1Cu1P2Se6_143_8231.vasp,In1Cu1P2Se6,-2.1809036290000003,0.1219872705416642 -Fe2S4F2_11_5941.vasp,Fe2S4F2,-2.2032464275,-0.190955755937502 -Ca2Re4H12C2N4O20_2_3100.vasp,Ca2Re4H12C2N4O20,-5.371863937727273,0.0468772698863525 -C14_187_2719.vasp,C14,-7.305951527857142,0.8103738821428577 -Zr1Nb2Ga1Se3S1Br2_1_21368.vasp,Zr1Nb2Ga1Se3S1Br2,-3.421702068,0.0274375505384558 -V1H2_187_19851.vasp,V1H2,-3.224676043333333,0.4346074399999997 -Li2Pb1O6F6_147_10039.vasp,Li2Pb1O6F6,-2.13488253,0.9178869185000004 -Na2Se4O12_2_12299.vasp,Na2Se4O12,-3.331378088333333,0.2188507869444411 -Y3N2F2_187_20802.vasp,Y3N2F2,-6.332689641428572,-0.1548304240476289 -Pd1F2_164_14362.vasp,Pd1F2,-1.04386903,0.3933801883333332 -Bi10Se10_26_2294.vasp,Bi10Se10,-1.667871452,0.1668663054999989 -Ga2Te4Pd1_164_6515.vasp,Ga2Te4Pd1,-1.6057268957142856,0.094020341696427 -As2P2O6_7_1237.vasp,As2P2O6,-4.829947642,0.2384951741666579 -Ga1Pt5Cl2_38_6251.vasp,Ga1Pt5Cl2,-1.46064455875,0.255673875385671 -K2Hg4Te2S6I6_31_9200.vasp,K2Hg4Te2S6I6,-0.489012833,-0.0169080891458349 -As2Pd2O6_162_1266.vasp,As2Pd2O6,-3.136040742,0.5846607922499958 -Al2N2Cl2_59_893.vasp,Al2N2Cl2,-3.9763433833333335,0.4689065319444403 -Cr2S2N1_164_4467.vasp,Cr2S2N1,-4.142786486,0.0519099459999998 -Mn8Zn2O18_85_11479.vasp,Mn8Zn2O18,-3.922309946785714,0.2390334926785673 -B2W3S2_187_1723.vasp,B2W3S2,-5.445678612857143,0.181741101428567 -Hf2Se2_129_7607.vasp,Hf2Se2,-4.3141410825,0.2530737324999998 -Ca2Ag1S2I2_123_2911.vasp,Ca2Ag1S2I2,-1.527047347142857,-0.0487285750446451 -Cu1Te2Au1_25_4993.vasp,Cu1Te2Au1,-0.28744734,0.21061125125 -In4Se3S1I1Br2Cl1_1_8691.vasp,In4Se3S1I1Br2Cl1,-1.5188746041666663,0.1033339100520835 -Pb2F2_164_14243.vasp,Pb2F2,-1.4118679175,0.9344201725 -Mn3N2Cl2_187_11395.vasp,Mn3N2Cl2,-3.4248334985714286,0.4952188314285681 -Ga2Se2Cl2_31_6468.vasp,Ga2Se2Cl2,-2.0617493716666666,0.0603019499999999 -Zr2H2Br2_164_21575.vasp,Zr2H2Br2,-3.3515900933333334,0.0081144166666664 -Co2O2_129_3945.vasp,Co2O2,-3.0894929725,-0.1223252224999997 -Ir1S2_164_8758.vasp,Ir1S2,-3.1598709133333336,-0.0705159800000005 -Au1O2F2_12_1433.vasp,Au1O2F2,-0.97330028,0.7169820071527766 -Hf1Cd1Fe1Se3I1Br3_8_7135.vasp,Hf1Cd1Fe1Se3I1Br3,-1.60477412,0.2824412318333333 -In2S2F2_31_8546.vasp,In2S2F2,-2.353675358333333,0.2362799950000003 -Rb6Re6Cl24_51_14984.vasp,Rb6Re6Cl24,-2.2012384277777777,0.0721505040740677 -Ca2P2I2O16_13_3088.vasp,Ca2P2I2O16,-3.915313527727273,0.3160843439772695 -Ti1Te1O1_156_18854.vasp,Ti1Te1O1,-5.20210109,0.24228578944444 -P12S12_7_13905.vasp,P12S12,-3.16687777375,0.3468975083984378 -Pd2S2Cl2_59_14459.vasp,Pd2S2Cl2,-1.521838976666667,0.1082507760416664 -Au2I6_191_1494.vasp,Au2I6,0.79751091,0.3446946374999999 -K4Cl4O8_2_9434.vasp,K4Cl4O8,-2.001779635625,0.3899400743749999 -Sn2C2Br2_59_16751.vasp,Sn2C2Br2,-2.3701130216666666,0.4842539933333326 -H2W2N1O2_164_7033.vasp,H2W2N1O2,-5.234536285714285,-1.411573490027541 -K6In4As6_12_9539.vasp,K6In4As6,-1.320145663125,0.121473004375 -In2S4_12_8561.vasp,In2S4,-2.1085551483333336,0.4316259707291637 -Te10N10_26_18267.vasp,Te10N10,-3.1619749495,0.3907932400833332 -Hf2B1Te2_164_7441.vasp,Hf2B1Te2,-4.745163284,-0.0767469979999995 -Li2Mg4_164_9983.vasp,Li2Mg4,-0.4777525666666666,-0.0797404658333333 -Li1Co1P2Se6_149_9675.vasp,Li1Co1P2Se6,-2.643195557,0.1962275232499946 -Ta3C2Cl2_187_17948.vasp,Ta3C2Cl2,-6.32787565,0.1517067660714252 -Ti3B2H2S2_187_19060.vasp,Ti3B2H2S2,-5.2406824344444445,0.3169227933333287 -P2H6O8_4_13981.vasp,P2H6O8,-4.894449931875,0.0333963765625 -Li2Cl1_164_9858.vasp,Li2Cl1,-1.9280578533333332,0.3993668188888868 -Sb2Te2_12_15724.vasp,Sb2Te2,-1.61484702,0.3043355537499979 -Zr1Bi2_164_21261.vasp,Zr1Bi2,-2.34532959,-0.9098411158333336 -Mo2C1S2_164_11584.vasp,Mo2C1S2,-4.411967708000001,0.1749317469999995 -Sm2Si6Ni2_51_16588.vasp,Sm2Si6Ni2,-3.138403216,-0.28270843 -Ag4I4O4_14_531.vasp,Ag4I4O4,-0.6674137316666666,0.3468571490277768 -Nb3S2Br2_5_13002.vasp,Nb3S2Br2,-4.008996612857144,0.2275086850612142 -Tl2Cl6_189_19394.vasp,Tl2Cl6,-0.59422043875,0.1490710512500001 -Cu2Sb4S3F2_6_5278.vasp,Cu2Sb4S3F2,-1.8393542772727272,0.4272901231542678 -In2Te2Br2_59_8615.vasp,In2Te2Br2,-1.109076775,0.1199009800000001 -Hg2Bi2Cl2O4_11_7935.vasp,Hg2Bi2Cl2O4,-1.916876707,0.1594270281999964 -Ho2Se2I2_59_8149.vasp,Ho2Se2I2,-2.85153485,0.0445363483333332 -Cr1Fe2Te2Rh1Se3I1_1_4173.vasp,Cr1Fe2Te2Rh1Se3I1,-1.615658179,0.1213165041666654 -Cu1Cl1_156_4868.vasp,Cu1Cl1,-0.22539965,0.41074390375 -Al4Bi4Cl24_14_1059.vasp,Al4Bi4Cl24,-1.7719455528125,0.0835796824999999 -Mg2I4_51_10471.vasp,Mg2I4,-0.7094131,0.1523411466666666 -Mn2Te4P2Br2_10_11322.vasp,Mn2Te4P2Br2,-1.7994621729999998,0.4204466861944408 -Hf1Zr3Te4S4_156_7422.vasp,Hf1Zr3Te4S4,-4.039073348333333,0.0895981883333291 -Rb2Cd4Se2I6O6_31_14817.vasp,Rb2Cd4Se2I6O6,-1.3309813615,0.121179039833333 -Nb1Ni2Br8_2_12545.vasp,Nb1Ni2Br8,-0.9673334736363636,0.2288485959090878 -Sc1Te1_123_16014.vasp,Sc1Te1,-2.180648185,1.0261932850000002 -Sc1Ag1P2Se6_149_15890.vasp,Sc1Ag1P2Se6,-2.6193201640000003,0.0693877704999996 -Ga1Te6As2Au1_149_6296.vasp,Ga1Te6As2Au1,-1.369015242,0.1176681053749978 -Te1W2O8_1_18338.vasp,Te1W2O8,-5.239969929090909,0.0211216230681774 -Sc5I8_10_16271.vasp,Sc5I8,-1.7295564753846155,0.0942638378205109 -W1Br2O2_38_20419.vasp,W1Br2O2,-3.687176482,0.2232885969999998 -Ru3S4_156_15368.vasp,Ru3S4,-3.2575548814285717,0.4405032807142821 -Ge1Br2_164_6653.vasp,Ge1Br2,-1.5901407933333334,0.0546312866666667 -Nb1Se1N1Cl1_1_12573.vasp,Nb1Se1N1Cl1,-4.3730782175,0.2397710282361015 -Sr1Br2_187_17032.vasp,Sr1Br2,-1.7207843266666665,0.1223846900000003 -Na2Ru2S2N2F10_1_12283.vasp,Na2Ru2S2N2F10,-2.9529773338888887,-0.0208803960802549 -In1Ag1Te6P2_149_8187.vasp,In1Ag1Te6P2,-1.523392532,0.2761352271666651 -Nb4Fe8Te8_59_13077.vasp,Nb4Fe8Te8,-2.2045911425,0.7007087781666668 -P1Se2_187_13951.vasp,P1Se2,-2.3234171233333334,0.4918693909027755 -Zr3C2O2F2_5_21756.vasp,Zr3C2O2F2,-6.085518021111111,0.1965039052777668 -K1Mg1C2O10_2_8913.vasp,K1Mg1C2O10,-4.265236090714286,0.4908250542857114 -Tm2Bi2O6_147_19669.vasp,Tm2Bi2O6,-4.873467647,0.358514702875 -Ir5Se10_1_8871.vasp,Ir5Se10,-2.7296540966666667,-0.3765673408333332 -Ca10Rh2_26_2787.vasp,Ca10Rh2,0.068514425,0.16300321 -Ba4Sb4S8F4_14_2182.vasp,Ba4Sb4S8F4,-3.2335234925000003,0.0611838113750002 -Ta2I10_51_17752.vasp,Ta2I10,-1.1252933125,0.2943647468750001 -Ir1Br2_187_8728.vasp,Ir1Br2,-0.5755846466666666,1.1446270044444429 -Cd1H4C6I2_10_3356.vasp,Cd1H4C6I2,-4.27527677,0.4512372493589678 -Al1Te2_115_747.vasp,Al1Te2,-1.88096867,0.1916254196874959 -Mg3Cl6_12_10547.vasp,Mg3Cl6,-1.9668865466666663,0.1001409983333332 -K2Hg4S6Cl6O2_31_9179.vasp,K2Hg4S6Cl6O2,-0.9532747805,0.3915987242410692 -V4H2C3O2_164_20325.vasp,V4H2C3O2,-5.473556460909091,0.0896676343388326 -Hg12As4O20_1_7830.vasp,Hg12As4O20,-1.8045809805555555,0.2532363215740704 -Cd2Bi2Se4Br2_26_3475.vasp,Cd2Bi2Se4Br2,-0.894770207,-0.0660598089999998 -Ta1Cl5_47_17528.vasp,Ta1Cl5,-2.5955296916666666,0.1675901100000003 -Hf1Zr3Te8_1_7423.vasp,Hf1Zr3Te8,-3.0970438333333337,0.247496013333333 -Tl12As4S12_14_19189.vasp,Tl12As4S12,-1.8881935625,0.0736273178571429 -Ni1Ir1Br2Cl4_1_13365.vasp,Ni1Ir1Br2Cl4,-0.87067631125,0.0192889796875 -Sb4Au2O12_12_15763.vasp,Sb4Au2O12,-3.4958843016666665,0.17730767055555 -Cu2B2S2Cl2_31_5030.vasp,Cu2B2S2Cl2,-1.81338739875,1.3071799127083332 -Mn1F2_187_10705.vasp,Mn1F2,-2.379117313333333,0.4302271466666667 -Ga1Cu1I6_1_6162.vasp,Ga1Cu1I6,0.01320853875,0.22047487046875 -Y1Te1S1_8_20681.vasp,Y1Te1S1,-3.9364315566666663,0.0434210431944402 -Pt2S2_123_14666.vasp,Pt2S2,-2.1645813225,0.4504998374999998 -Ta4Pd2S14_11_18085.vasp,Ta4Pd2S14,-4.14335601,0.1165292089374978 -Na2Co1_187_12057.vasp,Na2Co1,0.2935211233333333,1.0673233133333326 -Ga2Ni2O5_187_6402.vasp,Ga2Ni2O5,-3.304780033333333,0.1635210172222228 -Tl4Ni2C8N8_14_19612.vasp,Tl4Ni2C8N8,-5.115468706818182,0.4837067246969564 -Ca2Yb2In2Se8_11_3139.vasp,Ca2Yb2In2Se8,-2.6907271035714286,-0.2100210254761955 -Mn1V1Se1Br4_1_10925.vasp,Mn1V1Se1Br4,-1.634505862857143,0.1102534326428506 -Ga2Ni2Se5_156_6408.vasp,Ga2Ni2Se5,-1.668201822222222,-0.0087973438888907 -Ga1Cu1Te6As2_149_6179.vasp,Ga1Cu1Te6As2,-1.411655874,0.304982248166665 -Sb2As2S8_31_15534.vasp,Sb2As2S8,-2.6195846433333334,0.4515161767708275 -Ag2I2O2_59_314.vasp,Ag2I2O2,-0.5973759983333333,0.4168948823611101 -Ag2Se4_14_445.vasp,Ag2Se4,-0.8039384933333333,-0.461641665 -Nb2Te4Pd4_51_12923.vasp,Nb2Te4Pd4,-2.39171543,0.1202992729565193 -W3O8_12_20569.vasp,W3O8,-5.796263092727273,0.4032723666975815 -Sc1Au3I2Br2O4_1_15903.vasp,Sc1Au3I2Br2O4,-1.6943125608333334,0.2672541640624943 -Cu1Mo1F6_2_4918.vasp,Cu1Mo1F6,-2.36032319375,0.0864837249999999 -Ag2P30_2_354.vasp,Ag2P30,-3.74818106875,0.0139144968749969 -Sb2P2O8_11_15622.vasp,Sb2P2O8,-5.1004100333333335,0.2029628633333331 -Li2Fe4F14_11_9918.vasp,Li2Fe4F14,-2.454074331,-0.0560139469999996 -Pd2S2O6_11_14463.vasp,Pd2S2O6,-3.507464718,0.118402179999996 -Mn1Al2O4_164_10625.vasp,Mn1Al2O4,-5.3825606442857135,0.0413908557142868 -Ba4Bi4Te8Cl4_14_2144.vasp,Ba4Bi4Te8Cl4,-1.9158777975,0.1324158447499978 -Li2Sn8P6O24_2_10075.vasp,Li2Sn8P6O24,-4.817443358,0.0872607559999956 -Bi4O6_156_2621.vasp,Bi4O6,-3.352333734,0.5056604940000002 -Co2Se2O1_5_4021.vasp,Co2Se2O1,-2.709671304,-0.2134015793749999 -Rb4Cd2Cl8_11_14964.vasp,Rb4Cd2Cl8,-0.837374685,0.0370244633333323 -Ge6N2_191_6961.vasp,Ge6N2,-3.2668060975,0.2734034162500003 -Zr3Br2O4_8_21752.vasp,Zr3Br2O4,-5.377172562222222,0.2963909244444398 -Na2C4N2O6_4_12006.vasp,Na2C4N2O6,-5.835379547857143,-0.0277518331250127 -Cd1S1F2_156_3410.vasp,Cd1S1F2,-1.0314437925,0.4847514173437501 -Cd1Se2_115_3426.vasp,Cd1Se2,-0.4192651766666667,0.094419284444444 -K2Se2F2_11_9346.vasp,K2Se2F2,-1.354514075,0.3997802861111095 -Ga2Fe2O5_164_6356.vasp,Ga2Fe2O5,-4.201948033333334,-0.08023530354167 -K6H2Pd2S4Cl4O12_26_9536.vasp,K6H2Pd2S4Cl4O12,-3.145824185,0.1388132301515054 -Pt2Br4_2_14605.vasp,Pt2Br4,-0.4738984766666667,0.3083936908333333 -Ni1Pd2S4Br1_1_13402.vasp,Ni1Pd2S4Br1,-1.319687545,0.4445354541666648 -Ga1As1S2I1Cl1_1_6133.vasp,Ga1As1S2I1Cl1,-2.0037217766666666,0.2053788070833333 -Ti1Co1Se1S1I2_1_18764.vasp,Ti1Co1Se1S1I2,-2.5402575583333333,0.1717718044444399 -Tl4F4_57_19601.vasp,Tl4F4,-1.706766555,0.2462055574999999 -Au1Se2_187_1447.vasp,Au1Se2,-0.5934341366666667,0.6266422344444433 -Ca2B2S6F2_59_2945.vasp,Ca2B2S6F2,-3.419340994166667,0.3362431283854136 -Ga2Hg1Te4_164_6385.vasp,Ga2Hg1Te4,-0.9982549914285714,0.1803157799999999 -Sb1As2Au1S6_143_15433.vasp,Sb1As2Au1S6,-2.3148864920000003,0.4791112052187471 -In1Te1_156_8364.vasp,In1Te1,-0.821543875,0.563465145 -Sc1Ag1P2S6_149_15889.vasp,Sc1Ag1P2S6,-3.206253771,0.0670781339999999 -Ta1Bi1Sb1_156_17512.vasp,Ta1Bi1Sb1,-3.4509086466666665,0.1098720586111028 -Nb2I2N2_59_12743.vasp,Nb2I2N2,-5.089125220000001,0.0981880990999908 -Mn2Mo2N1Cl4O3_1_11139.vasp,Mn2Mo2N1Cl4O3,-3.4239341475,0.2378633643749997 -Tl2Zn1Se4_156_19566.vasp,Tl2Zn1Se4,-0.9911531285714286,0.2305878574999991 -Te8I8_2_18696.vasp,Te8I8,-0.429978048125,0.150549461875 -Y2Co2Ge4_129_20723.vasp,Y2Co2Ge4,-3.3863221575,0.368670764375 -Nd2S6_129_13243.vasp,Nd2S6,-3.75707531125,0.2193507835781253 -Cr3Cl2O4_12_4553.vasp,Cr3Cl2O4,-4.021699275555555,-0.0240435270601876 -Sr1Nb2S7_123_17065.vasp,Sr1Nb2S7,-3.794804683,0.3598704769999955 -Mn2S3Cl3_1_11224.vasp,Mn2S3Cl3,-2.1091740575,0.1855944612499998 -Sb2Te6Ir2_162_15735.vasp,Sb2Te6Ir2,-2.042775468,0.3748761571666655 -Sr1Li4P2_164_17061.vasp,Sr1Li4P2,-2.6774531371428574,0.1694453199999994 -Ho1Sb2_21_8119.vasp,Ho1Sb2,-2.3376191966666666,0.2201673341666643 -Tl2P2S6_143_19480.vasp,Tl2P2S6,-2.58038525,0.181383142 -Cd2Sn1S4_21_3580.vasp,Cd2Sn1S4,-1.0473442571428573,0.4962357492857125 -Mg10Ir2_26_10327.vasp,Mg10Ir2,-0.5604759375,0.3830685803985499 -Hg8Cl4O4_13_8106.vasp,Hg8Cl4O4,0.117187008125,0.2218039010416666 -Ba4Te8P4Cl4_14_2195.vasp,Ba4Te8P4Cl4,-2.3294676890000003,0.2174850382916665 -Ni3P2O8_164_13707.vasp,Ni3P2O8,-4.023654717692308,-0.0364037473076948 -Ca4Te8O20_14_3247.vasp,Ca4Te8O20,-3.9473257390625,0.1101172943750001 -Rh2S2_6_15225.vasp,Rh2S2,-2.3688073625,0.6379379373913013 -Mn1H10C8O12_2_10758.vasp,Mn1H10C8O12,-5.17682424483871,0.3036226831182744 -As6C2_164_1379.vasp,As6C2,-3.67543374125,0.7620360312500001 -Y2Te6_129_20783.vasp,Y2Te6,-2.9318785375,-0.7471542124999999 -Re2Os1Rh1Se3S5_1_15069.vasp,Re2Os1Rh1Se3S5,-3.846515818333333,0.283831877083333 -H12Pb2C12N8O6_2_6979.vasp,H12Pb2C12N8O6,-5.60945922475,0.2504214170624925 -Cu1C12O2F4_6_4864.vasp,Cu1C12O2F4,-5.324083564210526,0.7803056823684157 -Mn1V1Br1Cl1O2_1_10920.vasp,Mn1V1Br1Cl1O2,-3.56857317,0.0400138560416667 -Au2S1O1_99_1508.vasp,Au2S1O1,-0.5932293675,1.543105411875 -Cd1Pb2S2Br2_12_3393.vasp,Cd1Pb2S2Br2,-1.2554192071428572,-0.3395811582142872 -Y2F6_191_20730.vasp,Y2F6,-4.84275439625,0.3610655449999997 -Mn3Se4_164_11410.vasp,Mn3Se4,-2.40026774,-0.0788297960591148 -Fe2Au1O4_187_5793.vasp,Fe2Au1O4,-3.076838748571429,0.0825086605357116 -Cu2H10C4S2N2O12_4_5102.vasp,Cu2H10C4S2N2O12,-4.582267918125,0.1622078886892342 -Pb1Se2O6_164_14207.vasp,Pb1Se2O6,-3.345901334444444,0.2854588777777751 -La2Te1I2_164_9617.vasp,La2Te1I2,-2.57498642,0.052251724 -B2Te2_164_1714.vasp,B2Te2,-3.47291049,0.3934750375000001 -Cd2Cl2_129_3487.vasp,Cd2Cl2,0.8747046725,0.4748008837499999 -Cu2As2O4_26_5006.vasp,Cu2As2O4,-3.1344012125,0.5936044765624959 -Pr2I6_59_14547.vasp,Pr2I6,-1.729958985,0.07890372875 -Na1In1Br4O12_2_11882.vasp,Na1In1Br4O12,-2.468592687222222,0.225669811805548 -As1Pd2Se2_187_1165.vasp,As1Pd2Se2,-1.892924102,0.3128447460000005 -Ca1Bi4O8_1_2808.vasp,Ca1Bi4O8,-3.6851868330769233,0.2538344840384574 -Na2H8Br2O4_2_12131.vasp,Na2H8Br2O4,-3.609027638125,-0.1199795679166664 -Ga2Se3_164_6481.vasp,Ga2Se3,-2.279930756,0.1770611080000002 -Pb2S2Br2_59_14271.vasp,Pb2S2Br2,-1.4917047433333332,-0.2340507901041683 -Tl1Cd1In1S4_156_19237.vasp,Tl1Cd1In1S4,-1.6183344442857144,0.1606821452678536 -Ta2B1Se2_164_17659.vasp,Ta2B1Se2,-5.817233758,0.157113310000001 -Cr3C2F2_187_4548.vasp,Cr3C2F2,-4.348960238571428,0.2495200717857051 -Sm1C2_123_16554.vasp,Sm1C2,-5.625943073333333,0.7938584400000006 -Mo2P2S6_12_11657.vasp,Mo2P2S6,-3.4358765730000003,0.2293047108593683 -In1S3_1_8331.vasp,In1S3,-2.290168605,0.269438434140625 -Mo2N2Cl2_59_11637.vasp,Mo2N2Cl2,-4.0401274166666665,0.1965179405555557 -Nb2I8_1_12754.vasp,Nb2I8,-1.250015972,0.1903169535 -Ni2Sb2O7_10_13608.vasp,Ni2Sb2O7,-3.2535485136363635,0.1768589877272703 -Cr2Br8_1_4337.vasp,Cr2Br8,-0.983561797,-0.1758536479999997 -Mn2Bi2S4I2_26_11011.vasp,Mn2Bi2S4I2,-1.904739081,0.1935623898333329 -K4Cd2I8_11_9428.vasp,K4Cd2I8,-0.0705253535714285,-0.2623784690476188 -Bi18Br4_11_2310.vasp,Bi18Br4,-1.128076409090909,-0.5340652210606067 -Rb2Cl10_127_14831.vasp,Rb2Cl10,-0.4143159,0.1899911458333328 -Mn3Cr1O8_156_11373.vasp,Mn3Cr1O8,-4.500394925833334,0.0527113340104125 -Au2Cl6_162_1475.vasp,Au2Cl6,0.1328728525,0.310775855 -Si2Te2Br2_59_16454.vasp,Si2Te2Br2,-1.8851066966666667,0.2024686566666647 -Ge2S2_31_6830.vasp,Ge2S2,-3.1644592125,-0.91331135875 -Zr1Ru1Br2N1O1_1_21411.vasp,Zr1Ru1Br2N1O1,-4.161961138333333,0.1830911133333258 -Co8P8H24O32_29_4092.vasp,Co8P8H24O32,-4.410370869305556,0.1560368593055514 -Ta4S2_129_18103.vasp,Ta4S2,-6.478461773333334,0.3346736608333256 -Cr1B4H5O6_2_4120.vasp,Cr1B4H5O6,-4.958833159375,0.7042054235937505 -Ba2Ag1Se2F2_38_1891.vasp,Ba2Ag1Se2F2,-2.1646262857142857,0.5646097128571402 -C12_191_2718.vasp,C12,-7.4072931575,0.7090322525000001 -Hg2S2O8_31_7999.vasp,Hg2S2O8,-3.1527316691666667,0.103797408333333 -V3B2H2O2_187_20238.vasp,V3B2H2O2,-4.79296912,0.2488461836111028 -Fe2Bi2Br2O4_26_5805.vasp,Fe2Bi2Br2O4,-2.793188294,0.1846479398124978 -Cu1Sn1S2I2_1_4984.vasp,Cu1Sn1S2I2,-1.0664632633333333,0.1950295578761554 -Dy2I6_162_5528.vasp,Dy2I6,-1.56692404375,0.0582163262499999 -V2Se2O7F2_1_20186.vasp,V2Se2O7F2,-4.150506402307692,0.0155064498717909 -Mn2Bi2I2O4_10_11004.vasp,Mn2Bi2I2O4,-2.677028426,0.4020118552284463 -Be8As4H20O28_14_2291.vasp,Be8As4H20O28,-4.773846079166666,0.0847640629999959 -Os2Se2Br2_59_13880.vasp,Os2Se2Br2,-2.434793655,0.3322629599999973 -Mn2I6_162_11116.vasp,Mn2I6,-0.3132605475,0.13732557421875 -Ga1Cu1Sb2S6_149_6173.vasp,Ga1Cu1Sb2S6,-2.185165236,0.3947496259374978 -Mn1Ge1P2S6_143_10736.vasp,Mn1Ge1P2S6,-3.215992441,0.1622134739097189 -Rb1F1_123_14728.vasp,Rb1F1,-1.85068417,-0.43147965 -Sb2Br8_1_15558.vasp,Sb2Br8,-0.7409561339999999,0.1368217450000001 -Ba5Ce1_8_2200.vasp,Ba5Ce1,0.1491827383333333,0.855768969166665 -Ag1Cl1O2_1_45.vasp,Ag1Cl1O2,-1.544020445,0.1992209168750001 -Hg2Te6Pt4_164_8043.vasp,Hg2Te6Pt4,-0.9505286458333332,0.258102995 -Te2P1Pd2_187_18432.vasp,Te2P1Pd2,-1.830387998,0.2312075072999965 -V2Te8W2_25_20226.vasp,V2Te8W2,-2.5481695,0.1579000047222223 -Bi2Pd2S2Br4_1_2503.vasp,Bi2Pd2S2Br4,-1.312315183,0.1794644666249965 -Fe2As2Cl2O4_26_5774.vasp,Fe2As2Cl2O4,-3.341324793,0.0940487447333259 -Nb1Cu1Si1Ge2Te2Se5Cl2_1_12501.vasp,Nb1Cu1Si1Ge2Te2Se5Cl2,-2.39294904,0.175330747800091 -Cr2Ag2As4Se12_13_4294.vasp,Cr2Ag2As4Se12,-2.046390335,0.7956318667499951 -Ir2S2Br2_11_8812.vasp,Ir2S2Br2,-2.4278217916666667,0.1045786616666664 -Na1Fe1Te6As2_5_11855.vasp,Na1Fe1Te6As2,-1.578716269,0.2563771178333318 -In3Se1S1Br5_1_8657.vasp,In3Se1S1Br5,-1.293708267,0.1258919252499993 -Pb1F2_156_14183.vasp,Pb1F2,-2.4572891166666664,0.2283662966666666 -Hf2Se2_11_7610.vasp,Hf2Se2,-4.870554875,-0.30334006 -Y2C1F2_164_20709.vasp,Y2C1F2,-5.655085562,0.1269190620000007 -Zn1Cl2_187_20916.vasp,Zn1Cl2,-0.34573754,0.2544270814583332 -Y1B3H15N1_8_20606.vasp,Y1B3H15N1,-4.2228268525,0.497347711055552 -Au2S2I1Cl1_1_1513.vasp,Au2S2I1Cl1,-0.4242254283333333,0.2639952028055551 -Sc2S6_129_16141.vasp,Sc2S6,-3.65971087875,0.188518083828125 -Li1Ni1As2Se6_5_9759.vasp,Li1Ni1As2Se6,-2.036362447,0.2789914794166643 -Cd2S2_164_3549.vasp,Cd2S2,-0.53385736,0.20755635125 -Cu2Bi2S4_26_5042.vasp,Cu2Bi2S4,-1.6862704975,0.2024954199999999 -Ag2S1_191_374.vasp,Ag2S1,0.0233045966666666,0.4416482833333334 -Na1Co1Sb2Se6_149_11847.vasp,Na1Co1Sb2Se6,-1.9954388560000005,0.3533330988333308 -Ni2I6_189_13528.vasp,Ni2I6,0.65561922,0.2383183054687499 -Nb2O4F2_1_12796.vasp,Nb2O4F2,-5.9082076825,-0.1126865626041766 -In1Au1S2Cl2_10_8199.vasp,In1Au1S2Cl2,-1.4644365199999998,0.0633806871527765 -Mn1Si1Ge1Se1Br3_1_10881.vasp,Mn1Si1Ge1Se1Br3,-1.9289921328571429,0.2626818239285658 -Tc2O4_59_18234.vasp,Tc2O4,-6.044993713333334,0.442100935 -Nb2Co2Se6_11_12692.vasp,Nb2Co2Se6,-3.270896044,0.2056779997999983 -Cu1B6H4S2N6_6_4845.vasp,Cu1B6H4S2N6,-4.883204798947368,1.1491184549999982 -Co2Se4Cl2_2_4025.vasp,Co2Se4Cl2,-1.76883469,0.3242760037499979 -Hf1Zr1Te2S1I2_1_7403.vasp,Hf1Zr1Te2S1I2,-2.915182392857143,0.2740131953571393 -Sb1As2Au1Se6_143_15434.vasp,Sb1As2Au1Se6,-1.883927239,0.2598637096666643 -As2H6Pb2C2S6_7_1217.vasp,As2H6Pb2C2S6,-3.47524236,0.2236276223881041 -Mn1Ga1Ge2Br2_25_10720.vasp,Mn1Ga1Ge2Br2,-1.8182815533333332,0.1180672059722197 -Hf4H3Cl1O7_1_7788.vasp,Hf4H3Cl1O7,-6.0189589193333335,0.7330305654583293 -Ta3Br7O1_156_17946.vasp,Ta3Br7O1,-3.3179761927272726,0.1813879207575759 -As4H4Pb16Cl16O16_14_1328.vasp,As4H4Pb16Cl16O16,-2.9560808926785715,0.0553356594642857 -Co1As2_164_3696.vasp,Co1As2,-2.487464603333333,0.7517107200000002 -Mn1B6Pb2C6_8_10645.vasp,Mn1B6Pb2C6,-5.118883582,1.0203701818888775 -Ca2Co1O3_38_2985.vasp,Ca2Co1O3,-3.939667685,0.0643775563888863 -Fe3Se4_12_6066.vasp,Fe3Se4,-1.7816144842857145,-0.0045933950000019 -Rb2Hg4Te2S6Cl6_31_14889.vasp,Rb2Hg4Te2S6Cl6,-0.752338929,0.222141050635415 -In2Te4_12_8635.vasp,In2Te4,-1.205256111666667,0.1854842066666638 -Re4Bi4O20_14_15100.vasp,Re4Bi4O20,-4.949730868571429,0.1545424311904719 -Hf2As2Se6_12_7431.vasp,Hf2As2Se6,-3.655496761,0.2639481726666646 -Ga2Sn2S2_164_6494.vasp,Ga2Sn2S2,-2.0573784416666667,-1.022701940000001 -Tl2Ag1Te2_115_19360.vasp,Tl2Ag1Te2,-0.395691072,-0.061664239 -Ca2Sn2_51_3127.vasp,Ca2Sn2,-0.7880287475,0.3384115225 -Al18Te9_143_592.vasp,Al18Te9,-1.7320444774074075,0.613117269259257 -Ti1Cl1F1_156_18756.vasp,Ti1Cl1F1,-4.152723563333333,-0.1565204501388936 -Re2Br4_11_15033.vasp,Re2Br4,-2.2316768650000003,0.6264352924074043 -Ta2Cr2Se10_11_17715.vasp,Ta2Cr2Se10,-3.4121705228571426,0.0876425782142833 -Tl2C1S3_5_19387.vasp,Tl2C1S3,-2.640179988333333,0.2127375006249942 -K2Au2S2_51_8977.vasp,K2Au2S2,-0.6917411283333333,0.2081527891666666 -V1Te1W3Se3S1Br1Cl2_1_19937.vasp,V1Te1W3Se3S1Br1Cl2,-3.1503796391666667,0.0893275652083263 -Nd2Sb2S4O2_129_13244.vasp,Nd2Sb2S4O2,-4.346199013,-0.018508257333337 -P6Pt3_8_14144.vasp,P6Pt3,-3.1542594144444447,1.1244269738888883 -Hf1Zn1I2O2_1_7371.vasp,Hf1Zn1I2O2,-3.44595502,0.2894530102083334 -Cd2Cl8_53_3488.vasp,Cd2Cl8,0.087941909,0.411888594 -Al2Si2O11_8_982.vasp,Al2Si2O11,-5.023312858,0.460150806333329 -Hf4Cl6O2_8_7780.vasp,Hf4Cl6O2,-4.407566113333334,0.2956928218749959 -Tl1Pt5F2_38_19326.vasp,Tl1Pt5F2,-1.05190479625,1.7256411124999995 -Rh1O2_115_15162.vasp,Rh1O2,-3.16634146,0.9642983983333328 -Mn2Te4As2Br2_26_11311.vasp,Mn2Te4As2Br2,-1.63861504,0.2468442677499964 -Pb1O2_164_14194.vasp,Pb1O2,-3.28694078,0.1695882816666665 -Fe1H8C10N2F3_16_5709.vasp,Fe1H8C10N2F3,-5.416014494166667,0.29454803479166 -Pr2Br6_59_14545.vasp,Pr2Br6,-2.44358672125,0.0750144612499998 -Mn1O2_164_10832.vasp,Mn1O2,-4.25970151,0.2051082183333328 -H2Pd2O4_6_7014.vasp,H2Pd2O4,-3.2156516825,0.2808261738541668 -Pb2Br2Cl2_129_14215.vasp,Pb2Br2Cl2,-1.1483052233333333,0.0916329725000001 -In1Si1Te3_143_8352.vasp,In1Si1Te3,-1.485960728,0.5275417310000001 -Cu2Se4Cl2_4_5308.vasp,Cu2Se4Cl2,-1.1164503075,0.1004592018749999 -Ag2Sb2O4_26_398.vasp,Ag2Sb2O4,-2.73759553625,0.3951188978125 -Li2I1_164_9963.vasp,Li2I1,-1.2671115933333332,0.4579089205555542 -Hg1Te1_156_7918.vasp,Hg1Te1,0.806373915,0.3304068933333333 -Al3Fe2_123_1047.vasp,Al3Fe2,-1.882773302,0.506500885999998 -Zn1Pd3Se6S1Cl1_8_20996.vasp,Zn1Pd3Se6S1Cl1,-1.3868322616666668,0.2828244184479144 -As1Pb2O6_162_1159.vasp,As1Pb2O6,-3.605868741111111,0.3261449929166629 -Mn4Te8_2_11456.vasp,Mn4Te8,-1.641604515,0.1341912049999998 -Nb1Te2_191_12603.vasp,Nb1Te2,-2.37465154,1.014268821111111 -Lu2Cu2Pb2Se6_26_10308.vasp,Lu2Cu2Pb2Se6,-2.2588896541666665,0.1898857179166668 -Pt2Cl4_14_14615.vasp,Pt2Cl4,-1.03797063,0.0800694316666668 -Hf1Ti3Te8_3_7344.vasp,Hf1Ti3Te8,-3.4162174183333334,0.2435029845833334 -In1Cl2_187_8218.vasp,In1Cl2,-1.07013927,0.3438505983333333 -Cu1Mo1Br2_25_4917.vasp,Cu1Mo1Br2,-0.622619945,1.1717198131250002 -Ti2Te10_59_19033.vasp,Ti2Te10,-2.37953516,-0.0835235350000003 -Co1Rh1Se2I2_6_3815.vasp,Co1Rh1Se2I2,-1.5098035833333334,0.1023461344444379 -Pb2I2N2_59_14249.vasp,Pb2I2N2,-1.9555822833333332,0.4706184938888864 -Ag2H8C6N2Cl2_2_293.vasp,Ag2H8C6N2Cl2,-4.4967805595,0.2401633435000003 -H4Pd1C6N2F2_25_7077.vasp,H4Pd1C6N2F2,-5.193487834666667,0.4853567687222088 -Y2Mg4_51_20755.vasp,Y2Mg4,-1.09192014,0.271093813333332 -Au3Se2Cl2_1_1565.vasp,Au3Se2Cl2,-0.13020346,0.2905525904285707 -Rh2Se2_187_15242.vasp,Rh2Se2,-2.1440980125,0.308205911704543 -Ta2Ti1Cr1Se1S1Br2_1_17930.vasp,Ta2Ti1Cr1Se1S1Br2,-3.9923772725,0.2928721767245232 -V1Te1Se1_156_19936.vasp,V1Te1Se1,-2.64993449,0.1485156916666641 -V1Mo1O6_1_19880.vasp,V1Mo1O6,-4.9952234725,0.1665890738281246 -Bi4Se4_14_2645.vasp,Bi4Se4,-1.593050455,0.2416873024999989 -Li2V2Ag4S12_4_10109.vasp,Li2V2Ag4S12,-2.04799239,0.3775558811041619 -Hf2Si2S8_31_7614.vasp,Hf2Si2S8,-4.3381143725,0.3105180150000002 -Ba4Te8P4F4_14_2196.vasp,Ba4Te8P4F4,-2.6886092845,0.2345390470416669 -In2Te1Se2I2_1_8613.vasp,In2Te1Se2I2,-1.0984836257142858,0.2596545689880938 -As2Ir2Se6_162_1227.vasp,As2Ir2Se6,-2.7243074920000003,0.4050434348333311 -Cr1Br2_164_4132.vasp,Cr1Br2,-1.6956642733333334,-0.2188871244444458 -Zr2S4_31_21657.vasp,Zr2S4,-4.513644491666667,0.2852260758333331 -B1Te2W2_164_1641.vasp,B1Te2W2,-4.255190048,0.1691629280000002 -Tl2F6_191_19409.vasp,Tl2F6,-1.50263911,-0.0290121493749999 -Sr1Pb2_164_17075.vasp,Sr1Pb2,-0.2213501766666666,0.2884134508333328 -Nb4Zn4Co2O16_13_13181.vasp,Nb4Zn4Co2O16,-4.830443778461539,0.1427137526923043 -Cr3N2_187_4566.vasp,Cr3N2,-4.504762938,0.5326344326666623 -V3Te8Mo1_25_20293.vasp,V3Te8Mo1,-2.2273984525,0.075755903333333 -Nb1Sn1Br2O2_1_12585.vasp,Nb1Sn1Br2O2,-3.64838103,0.4278698656250004 -Li2S2F2_1_10052.vasp,Li2S2F2,-2.7270354266666668,0.2532206164583305 -Te1Au1Cl7_1_18285.vasp,Te1Au1Cl7,-0.5500093033333333,0.0905778966666667 -Al2H14C4_10_857.vasp,Al2H14C4,-3.922158862,0.4801774134999972 -Ta3S1Cl7_156_17982.vasp,Ta3S1Cl7,-3.655910346363637,-0.0306643518181857 -Ca4Sb2_59_3237.vasp,Ca4Sb2,-0.8448539616666667,0.5577052350000001 -Te6P2Rh2_162_18670.vasp,Te6P2Rh2,-2.166792651,0.3601110173518463 -Ag2Se1O4_21_423.vasp,Ag2Se1O4,-2.2136360228571426,0.2111757535714291 -Sb2Te4_14_15731.vasp,Sb2Te4,-1.538953026666667,0.2615993277777761 -Ta4V2S12_14_18137.vasp,Ta4V2S12,-4.808500355,0.0569743149999959 -Na2Zn1Cl4O3_8_12337.vasp,Na2Zn1Cl4O3,-1.864322214,0.1792161853750002 -Ni3Sb6_147_13719.vasp,Ni3Sb6,-1.2234510388888888,-0.6849888305555555 -H4Au2_53_7057.vasp,H4Au2,-1.526125195,2.19015885833333 -In2S4_2_8559.vasp,In2S4,-2.095885688333333,0.4442954307291638 -Mg2Mn8O18_85_10480.vasp,Mg2Mn8O18,-4.240422060357143,0.2452213812499954 -Be2Te7Cl6_10_2271.vasp,Be2Te7Cl6,-1.6461121886666668,0.1504144596666665 -In1Ni5F2_123_8292.vasp,In1Ni5F2,0.021270775,4.024212501614582 -Si4Sb4Te4_17_16512.vasp,Si4Sb4Te4,-2.482228671666667,-0.2060572725000024 -Os1S1I2_47_13818.vasp,Os1S1I2,-1.71489897,0.4423155993750001 -W2F8_1_20496.vasp,W2F8,-3.414581808,0.2506656229999948 -Rb2Hg4Se2S6Br6_31_14880.vasp,Rb2Hg4Se2S6Br6,-0.684910888,0.1934783293124997 -Al2Se5_1_977.vasp,Al2Se5,-2.633629648571429,0.1348133595238076 -P1Br5_10_13914.vasp,P1Br5,-0.5148121766666667,0.3966922545833325 -Pt1Se2_164_14594.vasp,Pt1Se2,-2.1569459566666667,0.0932992883333332 -Bi2N2Cl2_59_2478.vasp,Bi2N2Cl2,-2.5485379150000003,0.0288133847222198 -V2N1Cl2_164_20109.vasp,V2N1Cl2,-3.98703017,0.0092897142222172 -Rb1Ti1O2_156_14759.vasp,Rb1Ti1O2,-4.8627981475,0.5385174716874999 -Al1Cd1In1Te4_156_626.vasp,Al1Cd1In1Te4,-1.1563086171428572,0.1347050657142856 -W2N2F2_59_20513.vasp,W2N2F2,-5.465363133333334,-0.1622278745833438 -Li4H20C8S4_14_10194.vasp,Li4H20C8S4,-4.236114190833333,0.2092282719097154 -Cr2Cu2As4O12_4_4363.vasp,Cr2Cu2As4O12,-3.745814478,0.5570763637916629 -In1Cl2_115_8216.vasp,In1Cl2,-1.075623123333333,0.3383667450000001 -Ag2C4N2Cl2F4_2_228.vasp,Ag2C4N2Cl2F4,-3.729469501428572,0.2158079482142794 -K2Mn1P2S7Cl3_1_9236.vasp,K2Mn1P2S7Cl3,-2.4384249913333336,0.1215952295416582 -Pt2Se4_14_14686.vasp,Pt2Se4,-2.000635935,0.2496093099999998 -Ag2As4Se3I2_6_172.vasp,Ag2As4Se3I2,-1.475831788181818,0.1662228459090873 -Mn2Br2N2_59_11029.vasp,Mn2Br2N2,-3.2316322566666664,0.1697397608333284 -Te2As2_2_18358.vasp,Te2As2,-1.9556570025,0.3407699333333307 -Si2Ni1Se4_12_16415.vasp,Si2Ni1Se4,-2.317549852857143,0.3071779309693847 -Al4P20_26_1081.vasp,Al4P20,-3.641248045416667,0.0342832762499969 -Ag2Sb2Se4_26_403.vasp,Ag2Sb2Se4,-1.3460515225,0.2196540812499998 -Dy2V2O8_51_5538.vasp,Dy2V2O8,-5.825444889166668,0.352967033333333 -Rb2Cd4Te2I6O6_31_14825.vasp,Rb2Cd4Te2I6O6,-1.2662426365,0.2030322877083311 -Cr1B4H5S6_2_4121.vasp,Cr1B4H5S6,-3.730087704375,0.8292320753124999 -In1Se1_123_8342.vasp,In1Se1,-1.47309868,0.4303166825 -Li2V4S10_31_10135.vasp,Li2V4S10,-3.29732937875,0.3441369435937498 -Na1Mn1Zn1S2Br1_1_11898.vasp,Na1Mn1Zn1S2Br1,-1.601287556666667,0.1276307639999984 -Ag2Cl2O4_11_242.vasp,Ag2Cl2O4,-1.4979271675,0.2453141943749999 -Ba2Si4_12_2060.vasp,Ba2Si4,-2.722161731666666,0.4817017120833333 -Ag2Te4_14_484.vasp,Ag2Te4,-0.3132471016666666,0.4491031125 -Fe2I2_129_5864.vasp,Fe2I2,0.546432,1.092670433125 -Ag1N2_10_89.vasp,Ag1N2,-3.71143292,-0.2633901266666698 -Fe2W2Br2O8_129_6028.vasp,Fe2W2Br2O8,-4.298740137857143,0.109051167440473 -Cu2Se2Br2_59_5297.vasp,Cu2Se2Br2,-0.5162735916666666,0.2593060406746026 -Hf2Tl4S6_11_7658.vasp,Hf2Tl4S6,-3.326342800833333,0.0868729141666668 -Ca4Mg4Si8O24_14_3220.vasp,Ca4Mg4Si8O24,-5.69167717775,0.1690419677500001 -Cu2Cl2O4_17_5079.vasp,Cu2Cl2O4,-1.76584807125,0.2308056037500001 -Sc1Br2_164_15913.vasp,Sc1Br2,-2.2400176533333336,0.1476956649999974 -Co2S2_123_3982.vasp,Co2S2,-1.914800225,0.8256850785416643 -Co1H4C6Cl2_47_3759.vasp,Co1H4C6Cl2,-4.841205188461538,0.2705012073076842 -Ga1Br1_99_6142.vasp,Ga1Br1,-0.84012237,0.52429408 -Hg1Pb2S2I2_12_7902.vasp,Hg1Pb2S2I2,-0.9329789471428572,-0.3729488173809533 -Si2P2_164_16426.vasp,Si2P2,-4.28733574,0.1092059191666665 -Sr2H8Cl4O4_13_17241.vasp,Sr2H8Cl4O4,-3.643913107222222,0.0267954574074043 -Pd1I2_115_14364.vasp,Pd1I2,0.1448226,0.4360315674999999 -Mn2Te6_11_11328.vasp,Mn2Te6,-1.47467776625,0.2501154629166667 -Co1Se2_164_3823.vasp,Co1Se2,-2.16592206,0.3157984355555552 -Au1F2_164_1423.vasp,Au1F2,-0.21167464,0.5877641107407399 -K2Te2N4_31_9375.vasp,K2Te2N4,-3.75689427,-0.4186210033333331 -V2F4_11_20059.vasp,V2F4,-3.3230304516666664,-0.0481574672222251 -Fe8Se10_1_6102.vasp,Fe8Se10,-1.5156634944444445,0.1738846499999984 -P6C6_2_14134.vasp,P6C6,-5.790530765833334,0.290629931666666 -Nb2B1S2F2_164_12634.vasp,Nb2B1S2F2,-4.2806355457142855,0.4546815265384571 -V3Cu2Se3Br5Cl1_1_20258.vasp,V3Cu2Se3Br5Cl1,-1.7070463500000002,0.1054975327678553 -Pd2Cl6_162_14418.vasp,Pd2Cl6,-0.57665606875,0.1354158279166659 -Ta2Co4Se4_51_17709.vasp,Ta2Co4Se4,-3.4342511,0.0527560210000004 -Sr2Cu1Cl2O2_123_17197.vasp,Sr2Cu1Cl2O2,-2.919420302857143,0.1084234809523753 -Zn1Ga1Te2_156_20935.vasp,Zn1Ga1Te2,-0.71892059,0.3090199479166667 -Ga1Sb2Au1O6_5_6265.vasp,Ga1Sb2Au1O6,-3.537089381,0.6310563116249945 -Fe2Te4_12_6020.vasp,Fe2Te4,-1.0714802216666668,0.5567716933333331 -Y3C2_187_20793.vasp,Y3C2,-5.872355724,0.2258571800000002 -Mn2Se3I2_1_11287.vasp,Mn2Se3I2,-1.4132084299999998,0.1687953084821418 -Au2Se2Br2_59_1541.vasp,Au2Se2Br2,-0.2600036466666667,0.2024064645833333 -Fe2I2O2_59_5863.vasp,Fe2I2O2,-2.178450246666667,0.0545434165277754 -Fe2H2Se4_11_5857.vasp,Fe2H2Se4,-2.19459524375,0.7382387587500001 -Mn2Te2W2O12_113_11304.vasp,Mn2Te2W2O12,-4.611641960555556,0.2139443004166619 -Hg2S1I2_6_7992.vasp,Hg2S1I2,0.473785708,0.0713790663333333 -K1Mg1H9C2O10_2_8914.vasp,K1Mg1H9C2O10,-4.711775747826087,0.0435341918840541 -Sc1H2O2_164_15940.vasp,Sc1H2O2,-4.798588706,0.7612541024583281 -Cd2Te2Au2Br2_26_3584.vasp,Cd2Te2Au2Br2,0.25963918,0.0742410812325 -B4Sb20_26_1765.vasp,B4Sb20,-2.211842330416667,0.7179611130555505 -Cu2O4_59_5204.vasp,Cu2O4,-1.9947038883333332,0.772876375833331 -Mo2As2S10_85_11561.vasp,Mo2As2S10,-2.825961577142857,0.6060270479017829 -Mn1Sb2H12_2_10870.vasp,Mn1Sb2H12,-2.8220464613333336,1.3944362591666628 -Zn1Ni1H12C14N8_10_20978.vasp,Zn1Ni1H12C14N8,-5.605019682222222,-1.802017476388896 -F4_55_5612.vasp,F4,0.196045465,-0.03304281125 -Ba2Cd1In1Cu1O5_99_1942.vasp,Ba2Cd1In1Cu1O5,-2.8250869720000003,0.614623865249996 -Nb2Ni4Te6_11_12790.vasp,Nb2Ni4Te6,-1.7693119991666666,0.0921557433333335 -Au2Se1S4_21_1539.vasp,Au2Se1S4,-1.1055998342857143,0.4986104640178546 -Ga1Br2_187_6145.vasp,Ga1Br2,-0.9367249033333334,0.3699952258333334 -V1Cl5_10_19802.vasp,V1Cl5,-1.3961266433333333,0.2499324674999983 -Mn2I2_12_11113.vasp,Mn2I2,-0.602318345,0.4579764194396551 -Cu1Sn1F6_12_4981.vasp,Cu1Sn1F6,-1.9931886175,0.0081279575000001 -Co2Bi2Te4I2_10_3868.vasp,Co2Bi2Te4I2,-1.052439715,0.3036536103333335 -Sc2S2N1F2_164_16135.vasp,Sc2S2N1F2,-3.759042877142857,0.7397653205952297 -Nb4Te10Pt6_59_13163.vasp,Nb4Te10Pt6,-2.7787901185,0.1125961134722207 -Tl1Cd1In1Te4_156_19239.vasp,Tl1Cd1In1Te4,-0.6585612628571429,0.1826884038095224 -Sn2Cl2_164_16761.vasp,Sn2Cl2,-1.1802879675,-0.64814887 -As2O3_6_1232.vasp,As2O3,-4.114163378,0.3710741940000002 -Sc1Te2_164_16016.vasp,Sc1Te2,-2.5343025266666666,0.2940593486111094 -Rb2I2O6_11_14894.vasp,Rb2I2O6,-2.553458896,0.4635098960000001 -Zn1Fe1Cu1S5_1_20927.vasp,Zn1Fe1Cu1S5,-1.4508984325,0.2409003370885415 -Nb2F6_189_12713.vasp,Nb2F6,-4.02407868,0.3621057049999967 -Ta2I4O2_10_17763.vasp,Ta2I4O2,-3.8493103,-0.04466328625 -Tm1Be5_1_19659.vasp,Tm1Be5,-2.482729515,0.7196478278205102 -Tl1Sb1_187_19337.vasp,Tl1Sb1,-0.348114425,0.907356644375 -Ba1Mo4O8_162_1844.vasp,Ba1Mo4O8,-4.502100041538461,0.68314124999999 -Ca1H2O2_156_2843.vasp,Ca1H2O2,-4.256744542,0.2637131520000002 -Ag2S2N2F2_31_382.vasp,Ag2S2N2F2,-2.23146945625,0.1275010705078124 -Hf2F8_1_7493.vasp,Hf2F8,-4.764517986,0.1631197450000003 -W1Se1Br1O1_25_20452.vasp,W1Se1Br1O1,-3.7789940225,-0.0631557093749999 -Cu2H2O4_31_5112.vasp,Cu2H2O4,-2.995839935,0.275028993072917 -Si2Te2F2_59_16456.vasp,Si2Te2F2,-2.5737304716666665,0.4651539604166634 -Co3S4_164_4067.vasp,Co3S4,-2.769340855714286,0.0904166521428573 -Zr1Nb1Te1S1_8_21363.vasp,Zr1Nb1Te1S1,-4.08771354,0.0632180879166628 -Nb1Cl4_123_12490.vasp,Nb1Cl4,-2.427758896,0.2861345445000003 -Ni1H4C8I2_25_13354.vasp,Ni1H4C8I2,-4.775660248666667,0.4280681959999937 -Cr1O2_187_4223.vasp,Cr1O2,-4.950122893333334,-0.1321270389583375 -Ba2Mn2Sn2_129_2026.vasp,Ba2Mn2Sn2,-1.0269149366666668,0.5519281342528721 -Zr1Ta3Se8_164_21458.vasp,Zr1Ta3Se8,-4.3972044025,0.1466431639583332 -K2Cd4O8F6_31_9045.vasp,K2Cd4O8F6,-1.7120317035,0.4600233675416655 -Be1Pb2_164_2230.vasp,Be1Pb2,-1.077492363333333,0.558350978333332 -Al3Os2_123_1049.vasp,Al3Os2,-3.913201462,0.2898232009999962 -Hg2Te2H4S8_31_8031.vasp,Hg2Te2H4S8,-1.9391489175,0.1355173590364582 -C3N4_1_2761.vasp,C3N4,-6.193307494285714,0.6462531932142812 -Mn3H2S2N2_187_11388.vasp,Mn3H2S2N2,-3.633896335555556,-0.8062529707870438 -Nb2Pt2S10_51_12824.vasp,Nb2Pt2S10,-3.575181595,0.1029195470535646 -Hf1Sb2_187_7291.vasp,Hf1Sb2,-3.55293919,-0.8289369295833335 -Mo2F10_51_11604.vasp,Mo2F10,-2.578839534166667,0.2269448731944447 -Ca6Zn2_59_3259.vasp,Ca6Zn2,1.00374595375,0.57501714125 -V2F5_1_20060.vasp,V2F5,-3.334426937142857,-0.1748571938095275 -Ir4S6I1Br1_1_8862.vasp,Ir4S6I1Br1,-2.6593115175,0.1060718951388853 -Hg1O1_187_7885.vasp,Hg1O1,-0.3642892,0.4065561683333333 -Hg2I2_2_7974.vasp,Hg2I2,1.2738969325,0.062032145 -K2Mn1As2S7F3_1_9233.vasp,K2Mn1As2S7F3,-2.505237010666667,0.3524431141666613 -Cu2H4Se4O12_14_5133.vasp,Cu2H4Se4O12,-3.420912829090909,0.1043236218939354 -Os1S1F2_47_13817.vasp,Os1S1F2,-2.7867745175,0.4233772013124999 -Ga2N2_129_6396.vasp,Ga2N2,-3.990795155,1.010225375 -Rb2Cd4S2Cl6O6_31_14808.vasp,Rb2Cd4S2Cl6O6,-1.9833233580000005,0.1312841689374992 -Hg8P4O14_13_8110.vasp,Hg8P4O14,-2.9300567619230766,0.0976878919230772 -Ag8Bi8S12Cl8_2_583.vasp,Ag8Bi8S12Cl8,-1.4727278255555556,0.0340334861111097 -Mn2W2I2O8_129_11338.vasp,Mn2W2I2O8,-4.419048810714286,0.1651347224107135 -Ca2H12Pb4_2_3029.vasp,Ca2H12Pb4,-2.302105012777778,1.0425465199999968 -P2Pd2S5_8_14022.vasp,P2Pd2S5,-2.704485925555556,0.2348819399691328 -In1Te6P2Au1_149_8369.vasp,In1Te6P2Au1,-1.482698046,0.3048184925833295 -Ni3H1O2F4_1_13702.vasp,Ni3H1O2F4,-2.094525057,-0.152637943395835 -Li2Fe4F10_51_9917.vasp,Li2Fe4F10,-2.643293349375,0.1643756918749948 -V4Ag2O11_12_20299.vasp,V4Ag2O11,-4.657431732941176,0.1370098998529383 -Cu1Te2_12_4995.vasp,Cu1Te2,-0.5249956633333334,0.377253278888888 -Ta3Br1Cl1O3_1_17945.vasp,Ta3Br1Cl1O3,-5.6414355775,0.4584011090178455 -Pb4I10_127_14311.vasp,Pb4I10,-0.3363386357142857,0.2267704540773812 -La1Sn3_187_9574.vasp,La1Sn3,-1.2469737625,0.4744770375 -U2P4Pb4O20_2_19718.vasp,U2P4Pb4O20,-5.63858526,0.1627861166666662 -Zr2Cl2O2_59_21548.vasp,Zr2Cl2O2,-4.964319994999999,0.2167789466666674 -Tl1O1_38_19309.vasp,Tl1O1,-1.84435171,0.5635734797916643 -Ca2Au2_191_2942.vasp,Ca2Au2,0.306123315,0.5171624125000001 -Os6Se8_11_13897.vasp,Os6Se8,-3.3182522885714287,0.5612013499999948 -Ru2Br6_162_15302.vasp,Ru2Br6,-1.1709156375,0.2424724387499999 -Fe2Bi1Se2_187_5804.vasp,Fe2Bi1Se2,-1.3340365520000002,0.6483193594999986 -As4S10_31_1357.vasp,As4S10,-2.6565505714285718,0.6053414630357119 -Tl4Bi4_1_19593.vasp,Tl4Bi4,-0.4787996425,0.0435162112499999 -Ti2Te6_59_19049.vasp,Ti2Te6,-2.95340322125,0.0097062204166644 -Se8I8_2_16307.vasp,Se8I8,-0.686808766875,0.2440501542361103 -Nb2Ni1S6_12_12774.vasp,Nb2Ni1S6,-3.904260801111111,-0.3536149683333367 -Al1Si1Te3_143_742.vasp,Al1Si1Te3,-1.758006114,0.6228413640000001 -Cr1I5_1_4203.vasp,Cr1I5,-0.1182167433333333,0.1911011656249997 -P6Pt3_2_14143.vasp,P6Pt3,-3.189177527777778,1.0895088605555552 -B4Sb4O12_14_1766.vasp,B4Sb4O12,-5.498911186,0.0852711691666616 -Ta1Nb1Ag1Cl2O3_1_17568.vasp,Ta1Nb1Ag1Cl2O3,-4.51624831375,0.3107422704999913 -Al1Si1S2Br2_6_740.vasp,Al1Si1S2Br2,-2.67106742,0.1584597616666643 -Sb1Br5_2_15443.vasp,Sb1Br5,-0.4653839633333334,0.2650200874999994 -As6S12F2_4_1393.vasp,As6S12F2,-2.5806765805,0.6679352649583302 -Co2Bi2S4I2_10_3864.vasp,Co2Bi2S4I2,-1.756538678,0.3039188174166641 -Eu3S3_123_5608.vasp,Eu3S3,-4.329480178333333,-0.106273578333333 -Tl2Ga2Te6_31_19426.vasp,Tl2Ga2Te6,-1.1724289369999998,0.5078958263333321 -W2Br2_164_20462.vasp,W2Br2,-3.1008059125,0.5924515670833332 -Hg2Au2S2Br2_26_7926.vasp,Hg2Au2S2Br2,0.13400786625,0.1413249184375 -Cu2H8C6N14_2_5146.vasp,Cu2H8C6N14,-5.423255504333333,-1.604005060333339 -In4As4Cl4O10_2_8662.vasp,In4As4Cl4O10,-3.6034321881818174,0.0481822177272723 -Mg2W2Se2O12_18_10537.vasp,Mg2W2Se2O12,-4.873435071111111,0.1011057599999949 -Fe2Sb2S6_162_5957.vasp,Fe2Sb2S6,-2.437010324,-0.0959818801000045 -V2H4O6_13_20082.vasp,V2H4O6,-4.905127860833333,0.0869472826388895 -Ta2Te1Se3_8_17898.vasp,Ta2Te1Se3,-4.08995979,0.368320408472222 -Mo3C2Cl2_187_11702.vasp,Mo3C2Cl2,-4.02455972,0.284839060476187 -Ga1Pd5F2_38_6242.vasp,Ga1Pd5F2,-1.13972045875,0.469623832065372 -Pr1Re2O8_147_14534.vasp,Pr1Re2O8,-5.8984014090909085,-0.2695765746212211 -Sc1Si4_191_16002.vasp,Sc1Si4,-3.697747136,-0.2111261820000001 -Cu1Ag1S2_25_4825.vasp,Cu1Ag1S2,-0.81331044,0.3690278632552084 -Mg2Te2Mo2O12_18_10521.vasp,Mg2Te2Mo2O12,-4.585540076666667,0.0441582672685192 -Cu1Hg3_191_4906.vasp,Cu1Hg3,2.502887455,1.0588941103448275 -Hf2Mo1Se2I3_1_7532.vasp,Hf2Mo1Se2I3,-2.7004377675,0.7210344035937503 -C2Br8_1_2742.vasp,C2Br8,-1.036081708,0.5820113020000002 -Cd2S2Cl2_59_3544.vasp,Cd2S2Cl2,-0.5159912583333334,0.369657955312498 -Fe1S2_187_5747.vasp,Fe1S2,-2.1461872200000003,-0.2100613050000004 -Sr8B4I4N8_11_17493.vasp,Sr8B4I4N8,-4.248807980833333,0.2016030075000001 -Gd2Cl2_164_6607.vasp,Gd2Cl2,-2.55937137,0.1761481116666641 -Te6Pd2_11_18679.vasp,Te6Pd2,-1.20431394875,0.3054158929166666 -Nb3N2_187_12989.vasp,Nb3N2,-6.932809752,0.6220395886666599 -Pd1S2F2_164_14384.vasp,Pd1S2F2,-1.786655064,0.351537623124998 -Ba2Al4Cl16_13_1898.vasp,Ba2Al4Cl16,-2.3679705440909093,0.0409726222727271 -Hf1Zr1Mo2O8_1_7384.vasp,Hf1Zr1Mo2O8,-6.073741238333334,0.3248320779166667 -Mn2Ni1C12_164_11168.vasp,Mn2Ni1C12,-5.23586764,1.5058250119999963 -Sc1As2Au1O6_149_15897.vasp,Sc1As2Au1O6,-4.012965809,0.7210326931249968 -Cs4Au4O4_123_4804.vasp,Cs4Au4O4,-0.93102717,0.3782099333333332 -Ta2H2N1O2_164_17746.vasp,Ta2H2N1O2,-6.0692334542857145,0.8324618514761721 -Zr4S2N3F2_164_21839.vasp,Zr4S2N3F2,-5.39765062,0.7145342369318065 -Al1Ni5F2_123_698.vasp,Al1Ni5F2,-0.38153203875,3.842349020833332 -Al2Co2O5_164_803.vasp,Al2Co2O5,-4.771076731111111,-0.0503717100000049 -Nb1Sb1P1_156_12565.vasp,Nb1Sb1P1,-4.247114416666666,0.6104266091666634 -Ag1Bi1Sb2S6_143_25.vasp,Ag1Bi1Sb2S6,-2.072735337,0.2962406774374954 -W2Se1S3_6_20541.vasp,W2Se1S3,-4.282105893333333,0.0038253316666669 -Ag2H2_2_269.vasp,Ag2H2,-0.9387427075,1.1124507275000002 -Cu2Hg2Se2I2_26_5161.vasp,Cu2Hg2Se2I2,0.20556417875,0.0355216713020833 -P1Pd1O3_6_13933.vasp,P1Pd1O3,-3.882559196,0.7452349885000006 -Ga1F2_164_6185.vasp,Ga1F2,-2.408217903333333,0.3530593433333308 -Ge2B2P2H6O6_7_6747.vasp,Ge2B2P2H6O6,-4.534424172222222,0.2328556408333287 -As8Se8S4_2_1407.vasp,As8Se8S4,-2.538533155,0.371981831166664 -La2Mg2I10_51_9599.vasp,La2Mg2I10,-1.3673645178571427,0.085817994999999 -Mn2Sb2Se4Br2_26_11245.vasp,Mn2Sb2Se4Br2,-1.8995405130000005,0.1128778697499977 -V2P2O10_129_20134.vasp,V2P2O10,-5.600903585714286,0.0867834250000001 -Zr1Mn1Nb1Se2Br4O1_1_21324.vasp,Zr1Mn1Nb1Se2Br4O1,-2.952558471,0.3428641407499962 -Mo2I10_13_11619.vasp,Mo2I10,-0.2745971533333333,0.214610210069444 -Nb1Sn1Se2Br2_1_12590.vasp,Nb1Sn1Se2Br2,-2.495478335,0.21595196125 -Mg2Sb1_164_10501.vasp,Mg2Sb1,-0.5607922200000001,0.4898625750694443 -Pb2F6_1_14245.vasp,Pb2F6,-2.12162875,0.1772482831249999 -Cr1O3_187_4225.vasp,Cr1O3,-3.942848675,0.5099391648437499 -Zn2Sn8O12_51_21174.vasp,Zn2Sn8O12,-3.248355943636364,0.3851512329545392 -Al2Ga1Cu1S4I3Br1_1_840.vasp,Al2Ga1Cu1S4I3Br1,-1.856623035,0.1810993822395813 -Na2Mg1H4S10_2_12188.vasp,Na2Mg1H4S10,-2.682097962352941,0.0264759572794098 -Mn1Si1Se1Cl1_156_10884.vasp,Mn1Si1Se1Cl1,-2.3496880425,0.4322083150976532 -Pr2S2I2_164_14549.vasp,Pr2S2I2,-3.3921386916666667,0.0441376033333336 -Si12Pt4_127_16313.vasp,Si12Pt4,-3.448807278125,-0.1275962581249998 -P1Pb2O6_162_13930.vasp,P1Pb2O6,-3.924255944444445,0.4455144790277781 -B1F1_99_1623.vasp,B1F1,-3.43618997,1.096201596111107 -Rb2Cd4S8F6_31_14814.vasp,Rb2Cd4S8F6,-1.3955819645,0.4232169745624995 -Tc8I28_1_18264.vasp,Tc8I28,-1.4782215116666668,0.104211150555554 -In1Sb2Au1Se6_149_8337.vasp,In1Sb2Au1Se6,-1.624845487,0.3277969413333311 -Ni2P2S5_8_13564.vasp,Ni2P2S5,-2.4553286088888893,0.1637457487962931 -Yb2Bi2S4O2_129_20860.vasp,Yb2Bi2S4O2,-4.175487523999999,-0.5405544651250073 -Sb2Te1Br1N1_1_15704.vasp,Sb2Te1Br1N1,-2.253881272,0.2639175410000003 -In2Te4_14_8637.vasp,In2Te4,-0.8694590433333333,0.5212812749999972 -Hf3H2S2N2_187_7710.vasp,Hf3H2S2N2,-5.775162043333333,0.5153427916666597 -Mg1B2_183_10341.vasp,Mg1B2,-3.5818890166666666,-0.1858824699999997 -Mo4Pb2Se4O22_13_11756.vasp,Mo4Pb2Se4O22,-4.378295050625,0.0460426734375003 -Ba4As4H4S8_14_2131.vasp,Ba4As4H4S8,-3.03829264,0.2807008104895769 -Nb4B3H2O2_164_13034.vasp,Nb4B3H2O2,-5.978619743636363,0.3364828411363529 -Sn2B2P2H6O6_7_16735.vasp,Sn2B2P2H6O6,-4.369946234444445,0.324427404861102 -Rb2Cd4Se2S6I6_31_14822.vasp,Rb2Cd4Se2S6I6,-0.6404045795,0.2616603385416647 -Ag1Se1Br2_6_126.vasp,Ag1Se1Br2,-0.110542375,0.3640645025 -V1S1Br2_47_19907.vasp,V1S1Br2,-2.05814991,0.2536445240833272 -Co4Si12_90_4088.vasp,Co4Si12,-3.60090556,-0.5947796725000004 -Au1I2_164_1428.vasp,Au1I2,0.6725704366666667,0.1994519479166671 -Ba3Fe2S5Br2_123_2108.vasp,Ba3Fe2S5Br2,-2.5800529683333333,-0.0809398513020855 -Mo2N3_187_11641.vasp,Mo2N3,-5.653477426,0.3413144099999945 -As2H2Se2O10_4_1215.vasp,As2H2Se2O10,-3.973861275625,0.0940621014374956 -Rh2Se2Cl2_59_15236.vasp,Rh2Se2Cl2,-1.9920066016666669,0.133614525 -Bi4Te6_11_2654.vasp,Bi4Te6,-1.392811362,0.174542572 -Ru4S8_54_15371.vasp,Ru4S8,-3.070616128333333,0.5441274000000003 -In2Pd1Se4_164_8528.vasp,In2Pd1Se4,-1.842060571428572,0.0686992221428552 -La2Cl2O4_10_9586.vasp,La2Cl2O4,-4.28409689125,0.4596626803125001 -V3W1Se8_25_20297.vasp,V3W1Se8,-3.266070465,-0.0582525837499999 -Li2Mn2Sb2_129_10000.vasp,Li2Mn2Sb2,-1.9829432683333328,0.3016924037931017 -Te24Mo4Br12_2_18343.vasp,Te24Mo4Br12,-1.27309998425,0.0914324592499999 -Mo1Cl2_187_11507.vasp,Mo1Cl2,-1.7274006466666665,0.5704355611111114 -Sr4Cu4Mo2O14_6_17425.vasp,Sr4Cu4Mo2O14,-3.636142015,0.5158966287499969 -Zr2Te2I2_59_21704.vasp,Zr2Te2I2,-2.5400473316666665,0.1035622255555532 -Al1C1_38_618.vasp,Al1C1,-4.136723195,1.3487293374999998 -Na4V2P2Cl4O10_12_12429.vasp,Na4V2P2Cl4O10,-4.234771764545455,0.0446147130681766 -Ba3Si1_25_2127.vasp,Ba3Si1,-0.7058711825,0.6560281456249999 -P2Ir2Se6_162_13994.vasp,P2Ir2Se6,-2.877498524,0.5332179883333317 -Sr2Ag1S2I2_38_17108.vasp,Sr2Ag1S2I2,-1.641498975714286,-0.145974516711312 -K8Be8H48N24_14_9549.vasp,K8Be8H48N24,-4.374714589431818,0.0220664282954512 -Cs4Hg2I8_11_4812.vasp,Cs4Hg2I8,0.0816706921428571,0.1478507607142857 -Y3H2S2N2_187_20799.vasp,Y3H2S2N2,-5.43763062,-0.8113857234722262 -Ni2Se2F2_59_13632.vasp,Ni2Se2F2,-1.2919195316666667,0.0857311191666665 -Ir1Br2_115_8726.vasp,Ir1Br2,-0.69151147,1.0287001811111096 -Al2Tl2O6_31_1027.vasp,Al2Tl2O6,-4.206878813,0.2099711952499994 -Hf1Cd1Te2_156_7141.vasp,Hf1Cd1Te2,-1.633927855,0.4740674687500004 -Ga2Ru1_123_6435.vasp,Ga2Ru1,-2.31866595,0.3271164066666667 -Cr3C2Cl2_187_4547.vasp,Cr3C2Cl2,-3.892606065714286,0.1869827451190393 -Fe2Au1S4_187_5794.vasp,Fe2Au1S4,-1.89818875,-0.0247475814285729 -Ag1Te1Cl1_1_139.vasp,Ag1Te1Cl1,-0.3177683466666667,0.2301378779166661 -Sr2Cu1Te2Br2_38_17208.vasp,Sr2Cu1Te2Br2,-1.23006816,0.2269916871428546 -Ir2I6_162_8791.vasp,Ir2I6,-0.78624430875,0.0562230725 -Cr2Hg2O6_2_4407.vasp,Cr2Hg2O6,-3.256453423,-0.0573177630416701 -In1Au1Se2Br1_1_8201.vasp,In1Au1Se2Br1,-0.8773240940000001,0.3264788160000001 -Mn1Ag1Se1Br1_8_10616.vasp,Mn1Ag1Se1Br1,-0.7839729375,0.3768179728125002 -Hg2Te6As2_147_8040.vasp,Hg2Te6As2,-0.7168234339999999,0.3067060384999985 -Ce1S2_8_3652.vasp,Ce1S2,-3.664733113333333,0.6632698124999998 -Co1H4C6I2_47_3762.vasp,Co1H4C6I2,-4.61806409,0.3620023587179404 -Ba2Ce2_59_1945.vasp,Ba2Ce2,-0.6078226225,0.72877523 -B8S6_31_1792.vasp,B8S6,-4.347846994285715,0.6497378533333267 -Ca1Ag1I2_8_2792.vasp,Ca1Ag1I2,-0.1235312775,0.6500839547499999 -Pd3Au1Br4O4_1_14503.vasp,Pd3Au1Br4O4,-1.3571308858333333,0.3216075384722205 -Si2S2Cl2_59_16432.vasp,Si2S2Cl2,-2.78025422,0.3260213758333312 -Cr2P2S10_129_4450.vasp,Cr2P2S10,-2.904362463571428,0.3001720556249977 -C6N2_191_2777.vasp,C6N2,-7.56921399375,0.2497042425 -Mn1Ge1S1I2O2_1_10738.vasp,Mn1Ge1S1I2O2,-2.5263132585714283,0.3887868025892827 -K2Mn1P2O7F3_1_9235.vasp,K2Mn1P2O7F3,-4.171118297333333,-0.0668333602500063 -Co2Se2I2_59_4020.vasp,Co2Se2I2,-1.4086555049999998,0.0755934745925913 -Sc4B3H2_164_16224.vasp,Sc4B3H2,-3.923397048888889,0.2482582269444417 -Hf4Se2S2Br3Cl1_8_7813.vasp,Hf4Se2S2Br3Cl1,-4.0957820683333335,0.0207199378645795 -B2W3F2_187_1721.vasp,B2W3F2,-4.945857037142857,0.4618524833333232 -Ti2H2O3_12_18949.vasp,Ti2H2O3,-5.86422965,0.7653192714285675 -B2Cl2_164_1661.vasp,B2Cl2,-3.21378447,0.5353308994444415 -Ga2Te2_2_6511.vasp,Ga2Te2,-1.70084414,0.2323560758333334 -Sr2Bi1_25_17142.vasp,Sr2Bi1,0.0702902466666666,1.0336261722222213 -Os1S2_115_13820.vasp,Os1S2,-3.43644913,0.8616683758333332 -V8O16F8_14_20398.vasp,V8O16F8,-4.7410340725,-0.2527354790625034 -In1Cu1S2I1Cl1_1_8233.vasp,In1Cu1S2I1Cl1,-1.1152273366666667,0.3315933992499982 -Ga2Os1_21_6424.vasp,Ga2Os1,-2.3627672866666667,1.008605338888886 -Hf1Zr1I1Br3_6_7378.vasp,Hf1Zr1I1Br3,-2.386990293333333,0.3743761337962941 -Ti3Te2C2F2_38_19107.vasp,Ti3Te2C2F2,-4.940134487777778,0.2245370131481434 -Y1F2_115_20628.vasp,Y1F2,-4.197750006666666,0.8959402005555506 -Sb2P2Se6_1_15628.vasp,Sb2P2Se6,-2.452035169,0.1658990217708313 -Cd1Au1S1I2O1_1_3270.vasp,Cd1Au1S1I2O1,-0.3890890116666667,0.5018074257812505 -Cu1N2_10_4919.vasp,Cu1N2,-3.888693323333333,0.3299448249999961 -Zn1In1Pd1Au1Br2Cl1O5_1_20964.vasp,Zn1In1Pd1Au1Br2Cl1O5,-1.7647519441666668,0.2984957719444391 -K4W4N4Cl4F20_14_9531.vasp,K4W4N4Cl4F20,-3.334229326388889,0.0159867354398101 -Ta2Pd1O6_12_17824.vasp,Ta2Pd1O6,-6.082127862222222,0.1399820138888836 -C1I2_164_2730.vasp,C1I2,-0.9627294633333332,1.4885316945833311 -Ca1S1Br2_8_2871.vasp,Ca1S1Br2,-1.6656314075,0.43644003984375 -Sr4Sb2_59_17466.vasp,Sr4Sb2,-0.829534635,0.5629734472222209 -Bi6Pb6_2_2672.vasp,Bi6Pb6,-0.7635130658333332,0.1340139916666668 -Mo1H2_187_11513.vasp,Mo1H2,-2.985540783333333,2.021377943333329 -Tl1Au3I4O4_1_19225.vasp,Tl1Au3I4O4,-0.8590722741666666,0.3589945074999945 -Te3P1O8_1_18552.vasp,Te3P1O8,-3.983446559166667,0.2510314522482596 -Sr1Cd2S2Br2_1_17037.vasp,Sr1Cd2S2Br2,-0.9946137485714284,0.2189808078571417 -Mg2Sb1_25_10502.vasp,Mg2Sb1,-0.2915534966666667,0.7591012984027776 -Hg2Sb2Te6_147_8013.vasp,Hg2Sb2Te6,-0.533383392,0.3565612119999984 -Ta4B3H2_164_18005.vasp,Ta4B3H2,-6.477599786666667,0.3569025199999944 -Zn2As4S6F4_31_21036.vasp,Zn2As4S6F4,-2.210586314375,0.5005472625833304 -Ru2S6_11_15349.vasp,Ru2S6,-3.09014107375,0.2753877723437501 -V3H5O8_1_20271.vasp,V3H5O8,-4.939696845,0.0616398291666664 -Nb2C1F2_164_12661.vasp,Nb2C1F2,-5.772334756,0.155026774799996 -Al2S3_150_948.vasp,Al2S3,-3.231860122,0.5074336377500006 -Al2Tl2H8_10_1026.vasp,Al2Tl2H8,-2.3830339766666664,0.4840325374999952 -Te4Au2I2_1_18569.vasp,Te4Au2I2,-0.26296932125,0.0855944237499999 -Al2_51_1045.vasp,Al2,-1.902308815,0.5216720499999998 -Ta2Cl10_51_17688.vasp,Ta2Cl10,-2.2301028416666666,0.5330169600000003 -Nb2I1Br1N1O1_6_12740.vasp,Nb2I1Br1N1O1,-4.910427715,0.0779567224999957 -Pb2S2_31_14280.vasp,Pb2S2,-2.233755275,-1.56062183 -V2Te2_129_20213.vasp,V2Te2,-2.53920712,0.2360379828571404 -Hf2Se1Br4O1_38_7594.vasp,Hf2Se1Br4O1,-3.64245388875,0.3104078540625001 -Fe2P2O4F2_26_5909.vasp,Fe2P2O4F2,-3.986366554,0.282194656999992 -Sr10Rh2_26_17013.vasp,Sr10Rh2,0.2636906908333333,0.2555641633333333 -B2Sb6_164_1709.vasp,B2Sb6,-2.49638928625,0.7565323427083332 -V2Ag2P4O12_13_19972.vasp,V2Ag2P4O12,-4.7207587150000005,0.2841529984999895 -Th4Cl16_14_18732.vasp,Th4Cl16,-3.247462033,0.0909004529999997 -Pr2Si2I2_164_14553.vasp,Pr2Si2I2,-3.183623025,0.0360089666666669 -Mo1W1O5_1_11553.vasp,Mo1W1O5,-5.38760326,0.2398051039285667 -Cr2Au2S8_51_4318.vasp,Cr2Au2S8,-2.11721894,0.3881646515624979 -Si2Sn1P1S4F2_1_16453.vasp,Si2Sn1P1S4F2,-3.14820862,0.4582701110000002 -Ti1Ge1Te2_8_18788.vasp,Ti1Ge1Te2,-3.174330355,0.0915689949999998 -Li2Fe2P2O8_11_9908.vasp,Li2Fe2P2O8,-4.959934424285714,0.0961531775000006 -Na2Cd4Te2O6F6_31_12046.vasp,Na2Cd4Te2O6F6,-1.9599266625,0.2940673611249964 -Ta2Se2_187_17875.vasp,Ta2Se2,-4.805290525,0.5986267474999947 -Bi20B4_26_2414.vasp,Bi20B4,-1.5129005354166667,-0.0970129898611153 -Ag2Bi2P4S12_2_194.vasp,Ag2Bi2P4S12,-2.6597776415,0.0997064205 -Ru2O4_11_15333.vasp,Ru2O4,-4.4060786316666665,0.5576350333333338 -Te1Pt1Se1_156_18328.vasp,Te1Pt1Se1,-1.89497077,0.1527455766666667 -As16Cl4_10_1125.vasp,As16Cl4,-2.705838256,0.0738052173333314 -Cd1Br1O1F1_156_3285.vasp,Cd1Br1O1F1,-0.728432255,0.549177150625 -Ni2Bi2S4I2_10_13468.vasp,Ni2Bi2S4I2,-1.243024145,0.2926236383333335 -Ta2N1_164_17781.vasp,Ta2N1,-7.124394153333333,1.2994304011111106 -Pd2Cl4_11_14415.vasp,Pd2Cl4,-0.64158899,0.2338770744444444 -Os1C2_123_13794.vasp,Os1C2,-5.095104656666667,2.278594919999993 -Ni2Bi1Te2_187_13463.vasp,Ni2Bi1Te2,-0.633192202,0.1959756867142835 -Ta4N3O2_164_18061.vasp,Ta4N3O2,-7.876610778888889,0.3751446244444367 -Zr2Se6_59_21682.vasp,Zr2Se6,-3.552338035,0.0535708187499999 -Co3Si1Se2_187_4071.vasp,Co3Si1Se2,-2.442821716666667,0.1445400507222174 -Ba2Zn2Bi2_129_2089.vasp,Ba2Zn2Bi2,-0.0577465233333333,0.3214232142753617 -Fe2Te5As2_8_6023.vasp,Fe2Te5As2,-1.5702000622222223,0.392312292777776 -Al4As20_26_1056.vasp,Al4As20,-2.79689952,0.115032019999997 -Sn4Se4_57_16971.vasp,Sn4Se4,-1.8466815525,-0.2704031775 -In1I1_99_8272.vasp,In1I1,-0.03108928,0.96684149 -Ru1Br2O1_47_15259.vasp,Ru1Br2O1,-2.3308096,0.0661494500000001 -Ag4S4F8_1_551.vasp,Ag4S4F8,-1.126630645,0.3232986498437494 -Hg3Br2_164_8053.vasp,Hg3Br2,1.832670896,0.7091249467586234 -Tl2Se3_150_19537.vasp,Tl2Se3,-0.940602464,0.4898335749999999 -Cr1Te1Se1_156_4274.vasp,Cr1Te1Se1,-2.25320343,0.1299380755555537 -Fe2Te4F2_11_6012.vasp,Fe2Te4F2,-1.42895304,0.2550507911111096 -Hf2F2_164_7487.vasp,Hf2F2,-5.1000302275,0.2469009581250008 -V2O6_59_20132.vasp,V2O6,-4.9420534225,0.2538483114062497 -Al1Cu1Sb2Se6_149_646.vasp,Al1Cu1Sb2Se6,-1.936529171,-0.0048391336666689 -Zr2S1Br1Cl3O1_1_21636.vasp,Zr2S1Br1Cl3O1,-3.66934036125,0.2475123329687496 -Sr1Sn2_164_17089.vasp,Sr1Sn2,-0.4372474333333333,0.6859725666666656 -Ca2Zn1_123_3140.vasp,Ca2Zn1,1.0294409533333333,0.2457507966666666 -Ag1Te2Au1_25_144.vasp,Ag1Te2Au1,-0.17886776,0.1829923772499997 -V1B4H4O6F1_2_19773.vasp,V1B4H4O6F1,-5.06395565875,0.5788523776388812 -As4I12_14_1329.vasp,As4I12,-0.63478635875,0.05078587 -V2Br3Cl1O2_8_20005.vasp,V2Br3Cl1O2,-3.0917615725,-0.0180016846874995 -Mn1As1S1Br2_1_10632.vasp,Mn1As1S1Br2,-1.832898222,0.140662199875 -Ga4Cu4Se14Cl16_13_6551.vasp,Ga4Cu4Se14Cl16,-1.4442152836842106,0.1172954634210509 -Ni2Te4F2_2_13673.vasp,Ni2Te4F2,-1.08198514,0.1142532284374999 -Sb12Au2_31_15414.vasp,Sb12Au2,-1.569061832142857,0.3856044707142839 -Sc1Bi2_21_15909.vasp,Sc1Bi2,-1.83730311,-1.4607099083333337 -P2Pd2S2_7_14021.vasp,P2Pd2S2,-2.533220695,0.6945598341666663 -Mn2Al2O5_164_10952.vasp,Mn2Al2O5,-5.084252376666666,0.070075759521066 -Ni3S4_164_13714.vasp,Ni3S4,-1.4938437271428573,0.1285456607142854 -Ga1H2O2_164_6198.vasp,Ga1H2O2,-3.894384262,0.387668234166667 -Y4C3Cl2_164_20812.vasp,Y4C3Cl2,-5.482397246666667,0.1925818729629571 -Bi2H12C4S2N18O2_2_2460.vasp,Bi2H12C4S2N18O2,-5.15619756825,-0.7473752507500047 -Nb2Co4Se6_11_12699.vasp,Nb2Co4Se6,-2.962725925833333,0.1818209147916621 -Sr2P4H8O8_13_17294.vasp,Sr2P4H8O8,-4.617017070909091,0.0614413933522688 -Ga2Hg2Cl8_2_6386.vasp,Ga2Hg2Cl8,-0.8650000591666666,0.04401766 -Nb2Fe4S6_11_12721.vasp,Nb2Fe4S6,-3.039546263333333,0.4959936438888856 -Ta1S1I1Br1_8_17603.vasp,Ta1S1I1Br1,-2.994852265,0.29402285625 -Rb2B12H12O12_5_14770.vasp,Rb2B12H12O12,-4.911288169210526,0.7906461340443112 -Na2Cd4S6Br6O2_31_12029.vasp,Na2Cd4S6Br6O2,-1.1358915325,0.4144642439374972 -W2O6_11_20523.vasp,W2O6,-6.01425280375,-0.1502170006250001 -Tl1In1S2I1Br1_1_19299.vasp,Tl1In1S2I1Br1,-1.2818010466666667,0.2339031053124964 -V4Te12_2_20371.vasp,V4Te12,-1.98913897875,0.1792382537499999 -Pb2_164_14301.vasp,Pb2,-0.702849595,0.625336525 -Ta1Ni1Se4_6_17590.vasp,Ta1Ni1Se4,-2.85203604,-0.3139319591203726 -Ni1P2_123_13391.vasp,Ni1P2,-2.47697481,0.708565025 -Be1P2H4O4_5_2226.vasp,Be1P2H4O4,-4.76197364,0.0748654711110985 -Hg2S2Cl2_59_7995.vasp,Hg2S2Cl2,-0.0926310183333333,0.3585601069791649 -V1W1Se2S2_5_19958.vasp,V1W1Se2S2,-3.4754769666666667,0.3341242174999999 -Hf2O2_187_7547.vasp,Hf2O2,-6.7080153175,0.5987864581818112 -In2Ga2F8_10_8443.vasp,In2Ga2F8,-2.570868455,0.1977176524999997 -Sn2Sb2Te6_147_16871.vasp,Sn2Sb2Te6,-1.430630903,-0.3360082983333349 -Sc4C3S2F2_164_16232.vasp,Sc4C3S2F2,-4.263209781818182,1.0547489693073469 -Rb1Ge1I3_156_14731.vasp,Rb1Ge1I3,-0.6512109340000001,0.3278877779999988 -Sr4Sb4Te8H4_11_17474.vasp,Sr4Sb4Te8H4,-2.05816029,0.3816548484999981 -Cd3Ag1_191_3605.vasp,Cd3Ag1,2.454618145,0.1222060074999999 -Cd1Ru1I1Br1O2_1_3406.vasp,Cd1Ru1I1Br1O2,-1.9300434116666667,0.4179071978472223 -U2Te2P2_8_19732.vasp,U2Te2P2,-5.2432399300000005,0.1148832929166545 -Sn2Cl2F2_129_16758.vasp,Sn2Cl2F2,-2.0924852483333334,0.0702869749999997 -Ta1Te1Se1_156_17625.vasp,Ta1Te1Se1,-4.07476065,0.1467206052777778 -Sr4P2_59_17456.vasp,Sr4P2,-1.6365440866666667,0.3858404024999991 -Cr4C3S2F2_164_4597.vasp,Cr4C3S2F2,-3.97270839,0.6189706840909039 -Ni1I2_187_13364.vasp,Ni1I2,0.71291987,0.2836089733333333 -P2Os2O6_8_13999.vasp,P2Os2O6,-4.833065818,0.6771841889999957 -Zr3S2_123_21781.vasp,Zr3S2,-4.668876454,-0.0736025380000043 -Ni2H2Se4_11_13514.vasp,Ni2H2Se4,-1.764146035,0.55511053375 -Ta4Co2Se10_59_18023.vasp,Ta4Co2Se10,-3.972718475,0.0956242796874997 -Si2Te6As2_147_16460.vasp,Si2Te6As2,-2.050647029,-0.0542268983333346 -Nb1Cu1N1Cl2O1_8_12496.vasp,Nb1Cu1N1Cl2O1,-3.614552145,0.535649078304153 -La1Te3_99_9575.vasp,La1Te3,-2.2835397125,-0.2351304400000002 -Pt2Cl2_129_14611.vasp,Pt2Cl2,-0.42566999,1.25580954125 -Zr2C1_164_21537.vasp,Zr2C1,-5.38303888,0.8100186858333327 -Nb4S1Cl4O3_1_13140.vasp,Nb4S1Cl4O3,-4.751452225,0.1588337214843636 -Lu2S2Br2_59_10314.vasp,Lu2S2Br2,-3.521334038333333,0.0352305183333334 -Cr3B2O2_187_4543.vasp,Cr3B2O2,-4.646715477142857,1.128315499682536 -Ge1Sb1Te1S1_1_6704.vasp,Ge1Sb1Te1S1,-2.2526934925,-0.1675282787500021 -Pt1Cl2_115_14568.vasp,Pt1Cl2,-0.43615127,0.6818887916666667 -V3B2Cl2_187_20236.vasp,V3B2Cl2,-3.977950831428572,0.302328485714282 -V1Cl2_115_19798.vasp,V1Cl2,-2.019593903333333,0.3279364433333329 -C8_65_2783.vasp,C8,-7.1802421725,0.9360832375 -Nb3Ni3Te14_6_12992.vasp,Nb3Ni3Te14,-1.976660827,0.1092418062916646 -In2Fe2O5_187_8435.vasp,In2Fe2O5,-3.5844777800000003,0.2351434661574036 -In2Ga2Se6_31_8447.vasp,In2Ga2Se6,-2.09553922,0.0716184814999999 -Ge1Pd1S2_1_6692.vasp,Ge1Pd1S2,-2.4044945175,0.4070257212499975 -P4Se6_1_14124.vasp,P4Se6,-2.711868929,0.2048771774166646 -K4C4S4N4_57_9420.vasp,K4C4S4N4,-4.5262882525,-0.0884820387500056 -H4Se2O8_4_7082.vasp,H4Se2O8,-3.759248232857143,0.07934873414285 -Ni3S4_10_13715.vasp,Ni3S4,-1.09220995,0.5301794378571427 -Sc2Pb1_164_16123.vasp,Sc2Pb1,-1.6400181766666666,0.8464977283333313 -V2Se2Cl2_59_20182.vasp,V2Se2Cl2,-2.65490932,0.2308802849999995 -Ni3Ge1Te2_187_13701.vasp,Ni3Ge1Te2,-0.8762512816666667,0.0746734566666667 -Ga1Fe5F2_123_6189.vasp,Ga1Fe5F2,-0.9687391625,1.211716421249999 -Ag2Sb4O3F2_6_408.vasp,Ag2Sb4O3F2,-2.275751220909091,0.5254939422537841 -Cd1C4Br2N2F4_10_3294.vasp,Cd1C4Br2N2F4,-3.983101317692308,0.1281346407692185 -Rb2Cd4S2I6O6_31_14809.vasp,Rb2Cd4S2I6O6,-1.6076970970000002,0.0842322552187504 -In2As2_129_8377.vasp,In2As2,-1.823480885,-0.5091421249999999 -Te3As4Au2F2_6_18545.vasp,Te3As4Au2F2,-1.49569231,0.2936213708712106 -Eu2I6O22_2_5604.vasp,Eu2I6O22,-3.149411962333333,0.167586067208331 -B2Sb2O6_2_1707.vasp,B2Sb2O6,-5.444412531999999,0.1397698231666622 -La4Br6_12_9624.vasp,La4Br6,-2.4991111320000003,0.1034322211999994 -Hf1P2S6F2_164_7258.vasp,Hf1P2S6F2,-3.440583539090909,0.4525731917897693 -Hf3Cd1Se6I2_1_7700.vasp,Hf3Cd1Se6I2,-3.1718899775,0.2350965293055562 -Te4W2N4O16_4_18632.vasp,Te4W2N4O16,-4.547594905,0.124003206346144 -Mn2Bi2S4Br2_26_11006.vasp,Mn2Bi2S4Br2,-2.058643747,0.176007126166666 -Zr1Nb1Br2N2_25_21338.vasp,Zr1Nb1Br2N2,-5.343867395,0.1158200668333235 -V1H4N4O6F1_1_19857.vasp,V1H4N4O6F1,-4.574323375625,0.0946483945729075 -Li2Bi2B4O10_4_9842.vasp,Li2Bi2B4O10,-5.550000482222222,0.1268578740277668 -Os2Br8_14_13836.vasp,Os2Br8,-1.090083051,0.1196177309999999 -Si4P4Se4_17_16503.vasp,Si4P4Se4,-3.634499363333333,-0.6365941594791664 -Hf1Re2Rh1Se6I1Br1_1_7271.vasp,Hf1Re2Rh1Se6I1Br1,-3.3282105066666667,0.3273520457985998 -Ag2S4Br2_1_388.vasp,Ag2S4Br2,-1.15675132875,0.1041780084375001 -Au2Br2O4_17_1451.vasp,Au2Br2O4,-1.35972397,0.1965139807291656 -Sr2_65_17342.vasp,Sr2,1.92466486,2.24321007 -Hg2Cl2O2_59_7952.vasp,Hg2Cl2O2,-0.3651089683333333,0.3967932135416643 -Te2Pb2S8_7_18455.vasp,Te2Pb2S8,-2.092466958333333,-0.2971824508680565 -Mg2Br4_51_10436.vasp,Mg2Br4,-1.35278618,0.1851843844444443 -V2F2_164_20058.vasp,V2F2,-3.52568835,0.1527459783333304 -Tc6Br18_164_18258.vasp,Tc6Br18,-2.381656060833333,-0.0887293177083333 -Cu1Sb1As2Se6_143_4961.vasp,Cu1Sb1As2Se6,-1.961356102,0.2315253089722181 -In2Co1S4_164_8408.vasp,In2Co1S4,-2.413293358571429,0.1730170017261878 -Ce1Se2_164_3654.vasp,Ce1Se2,-3.1507169433333337,0.6506107624999995 -Zn2Fe4O10_59_21077.vasp,Zn2Fe4O10,-2.91831995125,0.4747909920312502 -Mo1Au2S4_111_11494.vasp,Mo1Au2S4,-1.861539402857143,0.3306763278571403 -Ba1Sb2F12_1_1855.vasp,Ba1Sb2F12,-2.8225135713333334,-0.0091364999999998 -Ag2Hg2S2F2_26_299.vasp,Ag2Hg2S2F2,-0.31033954125,0.1695337747395818 -La2Bi2S4O2_129_9577.vasp,La2Bi2S4O2,-4.217394213,-0.4013741423333341 -Ga2Te2Cl2_31_6500.vasp,Ga2Te2Cl2,-1.6968728533333337,-0.8324756475000001 -Rb2H2C2S6_4_14845.vasp,Rb2H2C2S6,-3.25317239,0.192915628281247 -Bi4S12O42_2_2638.vasp,Bi4S12O42,-4.2811011096551725,0.0286207020689657 -V1Cu1As2Se6_5_19812.vasp,V1Cu1As2Se6,-2.21906031,0.2130177275999979 -Hf1Ag1S2Br2_1_7103.vasp,Hf1Ag1S2Br2,-2.543545313333333,0.2157107624999976 -Sb2Br6_162_15556.vasp,Sb2Br6,-1.04848448875,0.0503541325 -Ca2Fe1S3_38_3016.vasp,Ca2Fe1S3,-2.774101513333333,-0.1485936858333356 -Li2Nb2Cl12_4_10012.vasp,Li2Nb2Cl12,-2.4943277775,0.0457317937499972 -Mg1Br2_164_10347.vasp,Mg1Br2,-1.4747699233333331,0.063200641111111 -Ag4O4F4_14_534.vasp,Ag4O4F4,-1.2228020558333337,0.3051741574999984 -Ru1O2_187_15277.vasp,Ru1O2,-3.91754488,1.0461687850000003 -V2I5_1_20099.vasp,V2I5,-0.8415403214285714,0.2320681338095229 -As2Pd3O8_164_1273.vasp,As2Pd3O8,-3.32446898,0.2684498438461506 -As2I6_150_1221.vasp,As2I6,-0.55411880375,0.131453425 -W6C1Cl18_174_20594.vasp,W6C1Cl18,-2.7226259988,-0.0745329901999998 -K2H4C12N2Cl4O6_2_9130.vasp,K2H4C12N2Cl4O6,-5.087739585,0.4413031057499914 -Ga1Pt1S2I1Br1_1_6244.vasp,Ga1Pt1S2I1Br1,-1.7878396716666665,0.1015532735416648 -Au4Se4Br4_51_1597.vasp,Au4Se4Br4,-0.3941911366666666,0.0682189745833333 -Ca2Br2F2_129_2960.vasp,Ca2Br2F2,-2.8499592466666663,0.0369817333333337 -Cr1Ga1Ag1S3I2_1_4174.vasp,Cr1Ga1Ag1S3I2,-1.6515679825,0.2918210612499999 -Mg1Ga2_187_10366.vasp,Mg1Ga2,-0.9992764266666666,0.1478921970833334 -Ge2N6_164_6789.vasp,Ge2N6,-5.26475447875,0.1315225802083288 -Cd4Br4_1_3621.vasp,Cd4Br4,0.720758425,0.032471774375 -Mg1Sb4O8_6_10402.vasp,Mg1Sb4O8,-4.198826989230769,0.1938104315384579 -Mo1I2_187_11518.vasp,Mo1I2,-0.6368896633333333,0.6979149972222224 -Sb2Au2S6_2_15545.vasp,Sb2Au2S6,-1.838568976,0.2299314899374975 -Ho2S6_129_8145.vasp,Ho2S6,-3.732994335,0.1078399499218749 -Cr1H6W1_2_4195.vasp,Cr1H6W1,-2.93324237625,2.213388655 -Sr4Co2S6Cl2_129_17419.vasp,Sr4Co2S6Cl2,-2.762783891428572,0.0671083902678546 -Tl2Te6Pt4_164_19561.vasp,Tl2Te6Pt4,-1.5208469575,0.1790190808333334 -Fe2Mo2I2O8_129_5871.vasp,Fe2Mo2I2O8,-3.680917397857143,0.1697294352380933 -Mn4F14_13_11434.vasp,Mn4F14,-2.562446591111111,-0.1871290381944466 -Ba2Cr3O7_1_1959.vasp,Ba2Cr3O7,-4.668033593333333,0.2488175045833287 -Pb1O2_115_14193.vasp,Pb1O2,-2.9249497366666666,0.531579325 -Ta1Cl2_164_17525.vasp,Ta1Cl2,-3.4910772800000003,0.4531470849999934 -Ta2C2Br2_59_17682.vasp,Ta2C2Br2,-5.651992313333333,0.0979691793333232 -Sb2Rh2O6_162_15666.vasp,Sb2Rh2O6,-3.994720798,0.2035117757499955 -Ti2Zn1Br1Cl1O2_1_19055.vasp,Ti2Zn1Br1Cl1O2,-4.03896899,0.2702997886607087 -Mo1O2_164_11526.vasp,Mo1O2,-4.88789347,0.4240116416666666 -V1As2_187_19770.vasp,V1As2,-3.290664636666667,0.4024895066666629 -Rh1Pb3_187_15163.vasp,Rh1Pb3,-0.60971819,1.0220314180769217 -In2Se2F2_59_8580.vasp,In2Se2F2,-2.1284777216666666,0.1367401405555535 -Nb2Br6_162_12657.vasp,Nb2Br6,-2.2532421525,0.2321645962499978 -Rb4Pd6S8_191_14978.vasp,Rb4Pd6S8,-1.8932452116666667,0.0906165944444445 -Ba2Ag1O2F2_38_1883.vasp,Ba2Ag1O2F2,-3.097333152857143,0.1221863042857114 -Sr2Fe4Se4O2_59_17223.vasp,Sr2Fe4Se4O2,-2.090869625833333,0.173505107499998 -Bi18F4_11_2312.vasp,Bi18F4,-1.4388003868181818,-0.358977756515153 -In2Se3_189_8592.vasp,In2Se3,-1.6177118499999998,0.3666095760000001 -Hf2Br8_1_7454.vasp,Hf2Br8,-2.483442173,0.0865429670000001 -Cd2Cu2Te2I2_26_3500.vasp,Cd2Cu2Te2I2,0.265068075,0.0014037792708333 -Cd1Pd1Cl4_2_3398.vasp,Cd1Pd1Cl4,-0.5705772516666666,0.0693529572222222 -Sc2C1F2_164_16051.vasp,Sc2C1F2,-5.014266802,0.06612141 -Li1Ga1Sb2Te6_5_9717.vasp,Li1Ga1Sb2Te6,-1.538146045,0.3117696591666651 -Si1S1O1_8_16357.vasp,Si1S1O1,-4.555211376666667,0.5903563566666665 -Th2Te2O2_129_18728.vasp,Th2Te2O2,-5.829281676666667,0.1098993933333332 -Ag2Bi2S2Cl4_51_195.vasp,Ag2Bi2S2Cl4,-1.127952129,0.185768184249998 -Ni4P2_129_13749.vasp,Ni4P2,-1.058782143333333,0.0962035533333334 -Y2Al2I2_164_20692.vasp,Y2Al2I2,-2.9701999650000004,0.0320781149999995 -Y1Pb5_47_20661.vasp,Y1Pb5,-1.258214925,0.2329858983333318 -Co2As2Pt2_129_3844.vasp,Co2As2Pt2,-2.0657825216666668,0.5365453954166648 -Zn2Co3O8_10_21059.vasp,Zn2Co3O8,-3.1427217684615387,-0.3137142077884673 -Li4V4F24_14_10244.vasp,Li4V4F24,-3.1985238409375,0.1093626990625002 -Ca3As3_25_3148.vasp,Ca3As3,-1.563332835,1.2130303716666664 -Mn2Ag1S1I2_1_10949.vasp,Mn2Ag1S1I2,-1.0317753733333337,0.1974437991666661 -Bi2Sb2O6_1_2523.vasp,Bi2Sb2O6,-3.713335874,0.3126208983636303 -Mo2H8_129_11618.vasp,Mo2H8,-3.199839739,1.7346153910000002 -Sn2P2O6_164_16817.vasp,Sn2P2O6,-4.70916139,0.2184981681999949 -Na4Cd1P2_164_12375.vasp,Na4Cd1P2,-1.2144259571428573,0.0956230028571427 -Na2Hg4S6Br6O2_31_12155.vasp,Na2Hg4S6Br6O2,-0.921582618,0.3112153191874978 -Ga18Se9_143_6106.vasp,Ga18Se9,-1.892033534074074,0.0845711309259242 -Ba4Ni2Cl2O6_129_2166.vasp,Ba4Ni2Cl2O6,-3.3448157042857143,-0.1120386937723277 -Sr4P4H12O16_14_17457.vasp,Sr4P4H12O16,-4.825753754166667,0.4067137843749955 -Cs2Os2C2S4I8_7_4759.vasp,Cs2Os2C2S4I8,-1.8519570033333328,0.5547761366666644 -Sn2Sb2H2O6_7_16855.vasp,Sn2Sb2H2O6,-3.679350401666667,0.4228598440277736 -As1P1W1_156_1157.vasp,As1P1W1,-4.322050196666667,-0.2751468966666706 -Pb2O2_25_14264.vasp,Pb2O2,-2.8669685275,0.2741131321875001 -Mn2Bi4Se8_10_11028.vasp,Mn2Bi4Se8,-1.843874385,0.2671018924999989 -Ir2Br2O2_59_8765.vasp,Ir2Br2O2,-2.7298406383333336,0.4524361988888854 -Mn1Bi2Te4_164_10654.vasp,Mn1Bi2Te4,-1.49278016,0.1542548473398995 -Ta2Se1S1I2_6_17868.vasp,Ta2Se1S1I2,-3.7749893283333336,-0.0063647428059938 -Bi2Se2F2_59_2540.vasp,Bi2Se2F2,-2.1554120033333333,0.3471193313888865 -Rb1Hg3Cl8O1_6_14739.vasp,Rb1Hg3Cl8O1,-0.1987819407692307,0.2243894148076885 -Sc3N2_187_16214.vasp,Sc3N2,-5.419917286,0.2331432199999961 -Co2P2H12O12F2_2_3957.vasp,Co2P2H12O12F2,-4.348866326,0.0391571909722174 -Pb2Cl2O2_59_14236.vasp,Pb2Cl2O2,-2.338955395,0.0322853266666669 -Tl1Ge1Se1S1Br2_1_19278.vasp,Tl1Ge1Se1S1Br2,-1.5658229733333335,0.1754381382725633 -Cr2C1S2F2_164_4343.vasp,Cr2C1S2F2,-3.2401574314285715,0.6971925185714185 -Ta2Mo2O11_164_17775.vasp,Ta2Mo2O11,-6.170345636666667,0.0541187753333334 -As2Pt2Se6_12_1279.vasp,As2Pt2Se6,-2.220464391,0.2423450719499973 -Sn4P4S4_17_16950.vasp,Sn4P4S4,-2.748242133333333,0.2429766758333309 -Hf1V1Mo1Se6Br1_1_7352.vasp,Hf1V1Mo1Se6Br1,-3.001248453,0.3419061979000006 -Ca2Au1O2F2_38_2930.vasp,Ca2Au1O2F2,-2.8032085885714286,0.660297449761899 -Sr1V1I1Cl3_1_17097.vasp,Sr1V1I1Cl3,-1.9466155033333332,0.1159802297222198 -Ti6H4O14_11_19181.vasp,Ti6H4O14,-6.402124702916667,0.1223189938194444 -Ir2S2_164_8824.vasp,Ir2S2,-3.28860322,0.5439233383333288 -Cr2F2_129_4379.vasp,Cr2F2,-2.063088425,1.701392577499997 -W2N4_2_20516.vasp,W2N4,-6.554741445,0.3116115587499948 -Ag1Au1Cl2F3_1_6.vasp,Ag1Au1Cl2F3,-0.3421334742857143,0.2222811735714278 -B2C3N6_5_1658.vasp,B2C3N6,-7.175528424545454,0.0143286465908962 -Er2Se2F2_164_5573.vasp,Er2Se2F2,-4.001319011666667,0.2450453869444397 -Ba1Li2Si2_187_1842.vasp,Ba1Li2Si2,-2.105703574,0.5043318186346133 -Ag2Mo6P4O28_11_328.vasp,Ag2Mo6P4O28,-5.01360828825,0.0557429307999961 -Pt2S2F2_59_14654.vasp,Pt2S2F2,-2.1366630416666665,0.2614499322222172 -Ta1Mn2Nb1S4I4_1_17567.vasp,Ta1Mn2Nb1S4I4,-2.919936629166666,0.0674432635208298 -Co2Pd4Se4_49_3974.vasp,Co2Pd4Se4,-1.543771902,0.216464475 -Cu2Si4P6_6_5317.vasp,Cu2Si4P6,-3.447766934166667,0.2144364524999997 -Zn1In2S4_156_20967.vasp,Zn1In2S4,-2.015134542857143,0.1286543291428557 -Pd2I1Cl5_8_14428.vasp,Pd2I1Cl5,-0.52301791125,0.1446421345833333 -Fe2As2Se4I2_26_5788.vasp,Fe2As2Se4I2,-1.7618558759999998,0.1990327197999976 -Zr1Ge1S1Br5_1_21300.vasp,Zr1Ge1S1Br5,-2.11490413375,0.1765585639453125 -Mo2H1O6_1_11610.vasp,Mo2H1O6,-4.983389227777778,0.0670954214351855 -Sb8O10F4_14_15868.vasp,Sb8O10F4,-3.820877800909091,0.1347571688068152 -Cd12As8_115_3263.vasp,Cd12As8,0.4245659805,0.3232373242499999 -Ba2Bi4O8_11_1921.vasp,Ba2Bi4O8,-3.954775480714286,0.0452538725000002 -Au2O2F2_59_1499.vasp,Au2O2F2,-1.09523179,0.2322760264814802 -Au2Br4_11_1458.vasp,Au2Br4,0.3653337466666667,0.1831040587500002 -Sn1Se2_115_16694.vasp,Sn1Se2,-1.9009155166666665,0.2451566300000001 -Mn2Te2Cl2_59_11295.vasp,Mn2Te2Cl2,-1.6194671716666666,0.1663319699999998 -Na4Bi4S8_7_12370.vasp,Na4Bi4S8,-2.378697508125,0.1463153618749997 -B2Mo2Br4_99_1677.vasp,B2Mo2Br4,-2.26786635375,0.6716786886718751 -In2S10F2_11_8537.vasp,In2S10F2,-2.1537383778571426,0.4521766589285694 -V4Cu2P4O28_11_20320.vasp,V4Cu2P4O28,-4.641860684473684,0.2933109555921009 -Li4V4O8F8_29_10248.vasp,Li4V4O8F8,-4.373404020416666,0.0899725272569408 -Pd4Cl8_14_14517.vasp,Pd4Cl8,-0.8055659041666666,0.0699001602777777 -Mn2C2Br2_59_11043.vasp,Mn2C2Br2,-3.16685032,0.5399199737499962 -V1F2_187_19826.vasp,V1F2,-3.3272944533333333,-0.0524214688888919 -Zn1S2F2_164_21005.vasp,Zn1S2F2,-1.310432034,0.6947491922500003 -Ti2O2_129_18975.vasp,Ti2O2,-6.55601768,0.6811994833333337 -Hf1Ga1S2I1Br2_1_7167.vasp,Hf1Ga1S2I1Br2,-2.65945392,0.2404526946428512 -Ta2Cl5_1_17696.vasp,Ta2Cl5,-2.974806061428571,0.6163001303571398 -Cu2Br2_67_5054.vasp,Cu2Br2,-0.00520502,0.3744742749999999 -Y2B1F2_164_20694.vasp,Y2B1F2,-4.971473736,0.2562578128333285 -Li2Ti2Se1S1_25_10097.vasp,Li2Ti2Se1S1,-4.218991081666666,0.0014477756944448 -Te8Mo2Br2_2_18699.vasp,Te8Mo2Br2,-1.5785830066666666,0.0786509333333334 -K2Ru2S2N2F10_11_9325.vasp,K2Ru2S2N2F10,-2.846455725,-0.0272976357539753 -Gd2O2F2_129_6622.vasp,Gd2O2F2,-5.229552761666667,0.4903773733333327 -Mn2Sb2S4Br2_26_11238.vasp,Mn2Sb2S4Br2,-2.271608374,0.0441472512499976 -Ni2Te2H4O8_4_13661.vasp,Ni2Te2H4O8,-3.529253160625,-0.0879966638020832 -Nb2Te6Pd1_12_12927.vasp,Nb2Te6Pd1,-2.6563822722222223,0.0923829994444387 -As4Pt2_2_1353.vasp,As4Pt2,-2.6276589833333333,0.7934580941666667 -Tl1In1S2_10_19300.vasp,Tl1In1S2,-1.260754225,0.8271737915625001 -Pd1S2_115_14385.vasp,Pd1S2,-1.6807434233333334,0.6370687808333333 -Ga2Co2S5_156_6332.vasp,Ga2Co2S5,-2.761924784444444,0.0789117337962941 -Hf1Pd1I1Br1O2_1_7266.vasp,Hf1Pd1I1Br1O2,-3.5573775583333336,0.5566369508333332 -C18_191_2720.vasp,C18,-7.266706712777777,0.8496186972222226 -In2Se2I1Br1_6_8581.vasp,In2Se2I1Br1,-1.3753533633333337,0.0637074355208318 -Cu1Bi1Sb2S6_143_4852.vasp,Cu1Bi1Sb2S6,-2.135966772,0.0405688468749954 -In4Br4_129_8667.vasp,In4Br4,-0.99473987125,0.3281265037500001 -Sc1In1S3I2_1_15949.vasp,Sc1In1S3I2,-2.2675693671428574,0.1877661881249965 -Ca3Co2S5I2_123_3165.vasp,Ca3Co2S5I2,-2.3383680341666664,0.1696134589791641 -Ta2S4Cl4_12_17859.vasp,Ta2S4Cl4,-3.619748028,0.0995436294749976 -Nb4Pt6Se10_59_13133.vasp,Nb4Pt6Se10,-3.1964616225,0.2533905478437501 -N2Cl6_31_11780.vasp,N2Cl6,-1.2834031825,0.25249086 -Rb2Cd4Te2Br6O6_31_14823.vasp,Rb2Cd4Te2Br6O6,-1.4627793525,0.252190501 -Bi2As2O6_7_2416.vasp,Bi2As2O6,-4.121760665,0.0498552349999998 -B2S2_187_1700.vasp,B2S2,-4.764798335,0.0388864374999995 -Zn1H2S2_164_20954.vasp,Zn1H2S2,-2.20517683,0.2106091793 -V1W1S2_8_19956.vasp,V1W1S2,-3.6690187725,0.4274472070833282 -Mn4Se2Br4O1_2_11452.vasp,Mn4Se2Br4O1,-2.0973363145454544,0.0443032709090892 -Na4B1S4_38_12366.vasp,Na4B1S4,-2.6387600433333334,0.3099366405555525 -Ca4Cu2_11_3212.vasp,Ca4Cu2,0.5973658766666666,0.2651118016666666 -Ge4Te4_57_6953.vasp,Ge4Te4,-2.19222247125,-0.72898114625 -Li2Sb2P8O24_13_10063.vasp,Li2Sb2P8O24,-5.233560368333333,0.1793759983611114 -K2Hg2C4I2N4_51_9170.vasp,K2Hg2C4I2N4,-3.708679402857143,-0.0035701875533735 -Mn4S2N3F2_164_11450.vasp,Mn4S2N3F2,-3.543720643636364,0.4849579460606033 -Nb3Sb1Te6_1_13008.vasp,Nb3Sb1Te6,-3.010322806,0.2911171983124998 -Tb2I2_164_18201.vasp,Tb2I2,-1.68831125,0.1028203324999983 -Fe2Se1S1Br4_8_5969.vasp,Fe2Se1S1Br4,-1.22343003125,-0.0819295092708332 -Hf1Mg6Nb1_25_7206.vasp,Hf1Mg6Nb1,-0.93104819625,0.3236392425 -Sr2Cu1Te2F2_38_17210.vasp,Sr2Cu1Te2F2,-1.7015512457142858,0.5999433099999963 -Sn2P4O12_7_16827.vasp,Sn2P4O12,-5.2139966116666665,-0.0464312711111105 -Zr2O2F2_59_21616.vasp,Zr2O2F2,-5.543848919999999,0.3454980576388844 -Tl2Cl6_1_19395.vasp,Tl2Cl6,-0.62761416,0.11567733 -Tm1F2_164_19664.vasp,Tm1F2,-3.66981642,0.7201495561111072 -Cr2S2_123_4470.vasp,Cr2S2,-3.22348903,0.5565220249999998 -Rb2Be2_11_14777.vasp,Rb2Be2,0.4761761275,0.9970573650000002 -Zr1O2_187_21389.vasp,Zr1O2,-6.311651746666667,0.8713373966666671 -Te4Au4Br4_14_18573.vasp,Te4Au4Br4,-0.2546052458333333,0.1066086758333333 -Sn1O1F1_1_16657.vasp,Sn1O1F1,-3.0644471566666667,0.4593020587499998 -V2S4_127_20166.vasp,V2S4,-2.90607736,0.8488814733333334 -Ag2C8Br4O4_2_236.vasp,Ag2C8Br4O4,-4.391808941666667,0.3562738972222181 -Sb1S1Cl1_156_15487.vasp,Sb1S1Cl1,-2.00888193,0.2719941208333334 -Al1Cd1Ga1S4_156_620.vasp,Al1Cd1Ga1S4,-2.5140027742857143,0.1448507192857142 -Hg1O1F2_156_7884.vasp,Hg1O1F2,-0.6408379825,0.5335106334374999 -Hg2Te2_164_8035.vasp,Hg2Te2,0.6462637175,0.1702966958333333 -Co1Ni1F6_10_3784.vasp,Co1Ni1F6,-1.79249896375,0.067429285 -Zr1Nb1I1Br1O2_8_21341.vasp,Zr1Nb1I1Br1O2,-4.3295377083333335,0.5928600273958264 -Li1Ti2S4_164_9801.vasp,Li1Ti2S4,-4.873477618571428,0.0128927849999955 -P2I6_12_13987.vasp,P2I6,-0.6960802825,0.0824256824999996 -Cr2Ge2Se6_162_4388.vasp,Cr2Ge2Se6,-2.597351182,0.2009829350833314 -Ag1Ge1I1Br1O2_6_59.vasp,Ag1Ge1I1Br1O2,-2.0264440833333333,0.3203181557291672 -Hf1Ti3Se8_1_7343.vasp,Hf1Ti3Se8,-4.2782084241666665,0.2581075329166666 -Zr6S2O18_147_21863.vasp,Zr6S2O18,-6.212672984230769,0.1372187849999941 -Ge2W2O8_13_6897.vasp,Ge2W2O8,-5.16134667,0.3729708249652739 -Mo2I1Br1N2_6_11620.vasp,Mo2I1Br1N2,-3.6735486466666663,0.2136252578472222 -Hf3Zn1I3Br1O4_8_7747.vasp,Hf3Zn1I3Br1O4,-4.260752732499999,0.3077721525954837 -Tl2Re12Se16Cl6_2_19492.vasp,Tl2Re12Se16Cl6,-3.954438401111111,0.0726330661111109 -Ba4Sb4H4S8_14_2178.vasp,Ba4Sb4H4S8,-2.9168422055,0.2232113430208303 -Cu1Ag1P2Se5S1_1_4820.vasp,Cu1Ag1P2Se5S1,-1.958613442,0.1850910271145787 -As4O6_4_1336.vasp,As4O6,-4.40649779,0.0787397819999995 -K2Zn2P4H6O16_2_9395.vasp,K2Zn2P4H6O16,-4.543708591666667,0.0612001451666617 -Hg1Au1Br1Cl3_1_7835.vasp,Hg1Au1Br1Cl3,0.2054228233333333,0.1037887454166667 -Fe2Se4Cl2_11_5983.vasp,Fe2Se4Cl2,-1.489343485,0.41475623359375 -Fe1Si4O6_1_5759.vasp,Fe1Si4O6,-5.01521723,0.7406334545454509 -Ni2Se2Cl2_59_13631.vasp,Ni2Se2Cl2,-0.94137324,-0.0447478199999999 -Cd2Ag2Se2F2_26_3447.vasp,Cd2Ag2Se2F2,-0.37765254875,0.044198255 -Cs2Hg4Cl6O8_31_4726.vasp,Cs2Hg4Cl6O8,-1.150413859,0.2818744693125001 -Ru1F2_187_15270.vasp,Ru1F2,-1.8117431466666665,0.9401473483333308 -Te2Mo2I2_59_18407.vasp,Te2Mo2I2,-1.3924759016666668,0.330373553611111 -Na2Sb2Pd2_12_12296.vasp,Na2Sb2Pd2,-1.4026797183333333,0.1708942386666635 -Nd1B4_123_13214.vasp,Nd1B4,-4.646101076,1.2438106065000003 -Zr3B2S2F2_187_21741.vasp,Zr3B2S2F2,-4.223380766666667,0.916721452222208 -Y1S1I1_156_20663.vasp,Y1S1I1,-3.8398501666666665,0.1427015016666666 -Mo3N2F2_187_11712.vasp,Mo3N2F2,-4.412492461428571,0.0995518111904676 -Li2Cl2O4_113_9859.vasp,Li2Cl2O4,-2.79827396375,0.1850199737499975 -K5N1O4_1_9535.vasp,K5N1O4,-2.368567628,0.1837897245000006 -Hg4S4N4_2_8087.vasp,Hg4S4N4,-1.6920279491666663,0.2900311649999985 -Rb2Ru2N2Cl10O2_11_14927.vasp,Rb2Ru2N2Cl10O2,-2.3014938705555554,-0.0926571237500036 -As2Pb2N2O6F6_7_1253.vasp,As2Pb2N2O6F6,-3.0919025066666666,0.6179949143888778 -Sm2Al4Cl16_13_16563.vasp,Sm2Al4Cl16,-2.339338557272727,0.21668043242424 -Dy2Br2O2_129_5518.vasp,Dy2Br2O2,-4.7941484433333335,0.053599376666666 -Mn2P2I2O4_10_11185.vasp,Mn2P2I2O4,-3.370208777,0.4840016919259226 -In4Br4_57_8666.vasp,In4Br4,-0.99463157125,0.32823480375 -Al1Tl1Hg1O4_156_755.vasp,Al1Tl1Hg1O4,-2.9517475985714285,0.423386798273808 -Fe2Cl6_189_5839.vasp,Fe2Cl6,-0.81138617,0.226461553125 -La2Si1_164_9614.vasp,La2Si1,-3.128037256666667,0.5530182516666629 -Er6F7_2_5582.vasp,Er6F7,-3.536867206153846,0.4448972823717909 -Ge8Rh2_125_6975.vasp,Ge8Rh2,-2.956270138,-0.3456222934999995 -Hf2Hg2_129_7507.vasp,Hf2Hg2,-1.5296403075,0.3601628184482757 -Co1B4Br2N2F4_47_3699.vasp,Co1B4Br2N2F4,-4.226827572307692,0.2766099035256304 -Hf4S4I1Br1Cl2_35_7809.vasp,Hf4S4I1Br1Cl2,-4.295081085833334,-0.0092009181250113 -Au4I4O4_14_1573.vasp,Au4I4O4,-0.5393799858333334,0.6466951463333315 -Pb3Se2I2O6_5_14308.vasp,Pb3Se2I2O6,-2.9197869823076923,0.0890135938461536 -Cd2Sn2O6_162_3581.vasp,Cd2Sn2O6,-3.068020797,0.2013652579999996 -Tl1Cl2_187_19244.vasp,Tl1Cl2,-0.6215218066666667,0.0176863883333333 -Nb1I4_123_12524.vasp,Nb1I4,-1.055488424,0.3848445014999999 -Al2Br6_1_779.vasp,Al2Br6,-1.49531095,0.1652971950000001 -Zn1Ge1S1Br2_1_20943.vasp,Zn1Ge1S1Br2,-1.34552829,0.1179989958000001 -Er2S2I2_59_5569.vasp,Er2S2I2,-3.2198838983333338,0.0475820516666662 -Co2As4S6Br4_11_3854.vasp,Co2As4S6Br4,-2.159416465625,0.3189234404276257 -Hf2Sn2S8_31_7621.vasp,Hf2Sn2S8,-3.8327339833333336,0.175191778333333 -Nb1Bi1As1_156_12469.vasp,Nb1Bi1As1,-3.5093259433333333,0.22045231333333 -Ag1W1S2I2_1_150.vasp,Ag1W1S2I2,-1.7391206950000002,0.3178090336458334 -Hf1Sc1Br2O1_25_7293.vasp,Hf1Sc1Br2O1,-3.785761054,0.6152864124090797 -Fe2P2H6C2O14_2_5905.vasp,Fe2P2H6C2O14,-4.939266500769231,0.0949467653311839 -Ta2Pt2Se10_51_17838.vasp,Ta2Pt2Se10,-3.193963617857143,0.0846036103571399 -Sc1Br1Cl1O1_1_15910.vasp,Sc1Br1Cl1O1,-3.241950485,0.4963272462499999 -Hg2F2_123_7958.vasp,Hg2F2,0.64510626,0.623682505 -C1F4_123_2729.vasp,C1F4,-2.805381906,0.5100165499999996 -Be2Sb1_191_2266.vasp,Be2Sb1,-1.88999871,0.3719621708333313 -Ta2Se4Cl4_12_17879.vasp,Ta2Se4Cl4,-3.216637426,0.1458878044333311 -Ga1Ag1Te6P2_149_6132.vasp,Ga1Ag1Te6P2,-1.605827695,0.2842985901666653 -Th1Br2_187_18711.vasp,Th1Br2,-2.99408465,0.1051048933333334 -Pd2Br2_164_14402.vasp,Pd2Br2,-0.52036781,0.3202404975 -Mo2As2S6_12_11562.vasp,Mo2As2S6,-3.167142286,0.2964888723749976 -Hf1Cd1Te1Se1_1_7140.vasp,Hf1Cd1Te1Se1,-2.026348265,-0.1774287350000003 -Fe2O6_31_5899.vasp,Fe2O6,-3.4017647275,0.2439820425000003 -Ta2Co2Te10_51_17704.vasp,Ta2Co2Te10,-2.4502927278571427,0.067471200059518 -K2Nb6O16_59_9266.vasp,K2Nb6O16,-6.366049490833333,0.0561709541666664 -Fe2P2S4F2_26_5915.vasp,Fe2P2S4F2,-2.853037376,0.0101786745606009 -Ta4Co2Pd1Se12_12_18021.vasp,Ta4Co2Pd1Se12,-3.699885548947369,0.080687834736842 -C2Cl8_1_2745.vasp,C2Cl8,-1.528780028,0.346827432 -Mn2Br2_129_11033.vasp,Mn2Br2,-0.727727285,0.7486641588146553 -K2H6C4N16O4_2_9141.vasp,K2H6C4N16O4,-5.5794668471875,-0.2914623482031262 -Zr3B2O2F2_38_21739.vasp,Zr3B2O2F2,-5.4193841166666665,0.4999221095370265 -Te2W2C1_12_18526.vasp,Te2W2C1,-4.512267616,-0.0339572709999995 -Sn2Br6_1_16749.vasp,Sn2Br6,-0.84864400125,0.115419029062499 -Cu1Pt1Cl6_5_4943.vasp,Cu1Pt1Cl6,-0.68535858,0.0606832499999998 -Na2Mg1H4Se2S8_2_12193.vasp,Na2Mg1H4Se2S8,-2.602142944117648,0.0699725936274462 -Fe2P2Se4Cl2_26_5920.vasp,Fe2P2Se4Cl2,-2.19783142,0.2208091014444425 -Sb1Te1Cl1_156_15509.vasp,Sb1Te1Cl1,-1.482311596666667,0.2624726233333332 -As4Se6_11_1372.vasp,As4Se6,-2.4953005480000003,0.1107244669999998 -Ga1Pt5F2_38_6252.vasp,Ga1Pt5F2,-1.52137465375,0.6427410212190041 -Ta1Ni1S2_115_17588.vasp,Ta1Ni1S2,-3.5602299825,0.3188280314999987 -Hf3Cd1I1Br1Cl2O2_8_7699.vasp,Hf3Cd1I1Br1Cl2O2,-3.72670522,0.3182598968958302 -Nb2H2C1_164_12732.vasp,Nb2H2C1,-5.654525374,0.162756496 -Pt1N2_10_14579.vasp,Pt1N2,-4.77951625,0.0335834783333297 -Tl1F1_99_19261.vasp,Tl1F1,-0.775378525,1.1775935875 -Te6As2Au2_12_18638.vasp,Te6As2Au2,-1.073559249,-0.0455624754166695 -Sb2Mo2S10_7_15603.vasp,Sb2Mo2S10,-2.7810912942857144,0.3953609705803542 -Li2B2H6C8O2_51_9832.vasp,Li2B2H6C8O2,-4.861054588,1.1188867757894576 -Tb2Te6_129_18211.vasp,Tb2Te6,-2.43440830125,-0.7318711625000001 -Hf2Te2_187_7639.vasp,Hf2Te2,-3.57603719,0.6180357268750003 -Ga2Se4_12_6483.vasp,Ga2Se4,-1.977808245,0.4543497338888866 -Sn1W2O8_2_16708.vasp,Sn1W2O8,-5.3986668090909085,0.0555099463636326 -Sr2Cd1In1Cu1S5_99_17174.vasp,Sr2Cd1In1Cu1S5,-1.8444215,0.2854883127499953 -Ga2Co1S4_156_6325.vasp,Ga2Co1S4,-2.695829112857143,0.173679181011902 -Nb6Si2S12_26_13197.vasp,Nb6Si2S12,-4.8277415945,0.107329440651511 -As2P4H2O12_4_1244.vasp,As2P4H2O12,-4.713500382,0.4157701516666523 -Re2P1S4I1_1_15070.vasp,Re2P1S4I1,-3.604700215,0.584058015169266 -Ge2Te4_12_6889.vasp,Ge2Te4,-1.706035835,-0.2066130327777791 -Mn2Se2F2_59_11277.vasp,Mn2Se2F2,-2.458604036666667,0.09358 -Sr1I2_187_17060.vasp,Sr1I2,-1.119902306666667,0.1661410522222222 -Al1Pt5I2_38_718.vasp,Al1Pt5I2,-1.56241048375,0.156787636625 -Zn2Fe3O8_10_21076.vasp,Zn2Fe3O8,-3.05419177,0.2473113855288405 -Fe2P2H10C2O8_31_5904.vasp,Fe2P2H10C2O8,-4.745351070416667,-0.1564852650347252 -K4P2Au2S8_11_9487.vasp,K4P2Au2S8,-1.9499179725,0.2949903293749998 -K1Mo2S2Cl6_47_8920.vasp,K1Mo2S2Cl6,-1.917807309090909,0.2651794357867116 -As2Pb2O6F2_7_1254.vasp,As2Pb2O6F2,-3.7897909166666666,0.1559471433333336 -Mo2Se1S1I1Br1_6_11681.vasp,Mo2Se1S1I1Br1,-2.290464071666667,0.2118655399305554 -Cd3Au1_191_3607.vasp,Cd3Au1,2.3564343025,0.5753107058333333 -P2Br6_162_13962.vasp,P2Br6,-1.15482503,0.1405854749999988 -Ba1Cl2_164_1818.vasp,Ba1Cl2,-2.437952853333333,0.28624253 -P2Ir2S6_162_13993.vasp,P2Ir2S6,-3.402088843,0.3730442442499979 -Ag4Te2_51_572.vasp,Ag4Te2,0.2688236483333333,0.22173832 -Fe1Ru1Br2O2_1_5741.vasp,Fe1Ru1Br2O2,-2.5616748166666667,0.3477369266666668 -Na2Hg4Te2O6F6_31_12173.vasp,Na2Hg4Te2O6F6,-1.6947703345,0.276916558887492 -Ho4Te8Cl4O20_2_8154.vasp,Ho4Te8Cl4O20,-4.224516149722223,0.0348471411111104 -Al4Br4_39_1063.vasp,Al4Br4,-1.34436712375,0.5706985945833318 -Na2I2O6_11_12181.vasp,Na2I2O6,-2.754777527,0.1864545135000002 -Co2Te2I2_59_4035.vasp,Co2Te2I2,-1.0879124116666663,0.0524922433333334 -Zr2S3I1_3_21656.vasp,Zr2S3I1,-3.829559125,0.3082563903819413 -Ru3Se4_164_15370.vasp,Ru3Se4,-2.88350441,0.4544311221428536 -Pb1Au1S1Br2_1_14170.vasp,Pb1Au1S1Br2,-0.853818572,0.2672512600000002 -Zr2Cl6_162_21553.vasp,Zr2Cl6,-2.81497716625,0.15468569 -Zr2Ti2Te8_25_21725.vasp,Zr2Ti2Te8,-3.1706559750000003,0.2494309124999996 -Ca2Ag1Cl2O2_38_2903.vasp,Ca2Ag1Cl2O2,-2.581285747142857,0.0899361180075145 -Li4Te2O6_5_10230.vasp,Li4Te2O6,-4.0660895833333335,0.0439121895833336 -Sb2W2S6_2_15750.vasp,Sb2W2S6,-3.363010705,0.4074506631666651 -V2Pd1Se4_164_20146.vasp,V2Pd1Se4,-2.73342461,0.0289489240476159 -Al1Pd5F2_123_710.vasp,Al1Pd5F2,-1.3220552925,0.9630122641666644 -In1Cu1Sb2Se6_149_8236.vasp,In1Cu1Sb2Se6,-1.696497663,0.3283300983333311 -Na2Ni2Sb2_12_12239.vasp,Na2Ni2Sb2,-0.7398937433333334,0.2329168709259249 -Cr2Ag2Sb4Se12_13_4302.vasp,Cr2Ag2Sb4Se12,-1.854533149,0.2140369893333316 -Ba1H2O2_164_1834.vasp,Ba1H2O2,-4.338948362,0.1181996300000003 -Ag1I2_187_84.vasp,Ag1I2,0.5903322599999999,0.2315930672916669 -Ti1Bi2_164_18746.vasp,Ti1Bi2,-2.8460196,0.5170271191666633 -Gd2F6_12_6610.vasp,Gd2F6,-4.35358855375,0.3351103706250002 -Li2Te2H2O8_6_10083.vasp,Li2Te2H2O8,-3.895974552857143,0.1552033119047582 -Sb2F8_1_15580.vasp,Sb2F8,-2.4695046,0.2626333030000003 -Rh2S4_14_15227.vasp,Rh2S4,-2.5577341616666667,0.6230337416666638 -W2N1_164_20511.vasp,W2N1,-5.504772106666667,0.8134486288888834 -H4Pd1C8F2_25_7080.vasp,H4Pd1C8F2,-5.112564886666666,0.6450446573333277 -Cu1Ge1F6_2_4879.vasp,Cu1Ge1F6,-2.19395850125,0.0103690499999999 -Nb6Sn2Te12_26_13202.vasp,Nb6Sn2Te12,-3.13299565,-0.5694170635000035 -Ba4Ga2Sb2Te10_31_2155.vasp,Ba4Ga2Sb2Te10,-1.8624970244444443,0.2411106097222219 -Te2Ir2F2_11_18393.vasp,Te2Ir2F2,-2.25514741,0.6893360608333303 -Na1Ga1As2Se6_5_11859.vasp,Na1Ga1As2Se6,-2.190873235,0.276308037333331 -C6N2_4_2778.vasp,C6N2,-6.74106828625,1.07784995 -Ti2I8_1_18963.vasp,Ti2I8,-1.383675008,0.2393580869999998 -Fe2Cl2_164_5837.vasp,Fe2Cl2,-1.01197731,0.7856979475 -Ca4Te4O12_14_3245.vasp,Ca4Te4O12,-4.1223456585000005,1.865654341499999 -Co4N2O12_4_4081.vasp,Co4N2O12,-4.129471276666667,-0.4019132164583369 -Pb6Se2O10_26_14336.vasp,Pb6Se2O10,-3.408124737777777,0.1423023350000001 -Zr2O2_187_21618.vasp,Zr2O2,-5.8793430425,0.6619259641666666 -Th2Te6_59_18730.vasp,Th2Te6,-3.118417655,0.0679214474999998 -Sb4Pb4S10_2_15803.vasp,Sb4Pb4S10,-2.5294758133333333,-0.3875135255555557 -Sn1Sb2S4_164_16687.vasp,Sn1Sb2S4,-2.6388369385714285,0.0679667817857123 -In2Sb2S6_11_8565.vasp,In2Sb2S6,-2.577268784,0.1018638704999999 -Zn1Fe1Se2_8_20931.vasp,Zn1Fe1Se2,-0.80445502,0.2372430756249999 -Nb2I6_189_12753.vasp,Nb2I6,-1.552308085,0.2646960335937485 -Ga2H10N4Cl4_10_6371.vasp,Ga2H10N4Cl4,-3.7669721765,0.1310096101250002 -Cu4Se3_123_5471.vasp,Cu4Se3,-0.6567128214285713,-0.2671248833333338 -Ru2O2_6_15332.vasp,Ru2O2,-3.73067973,1.0415920100000002 -Mg1In2Se4_164_10382.vasp,Mg1In2Se4,-2.08104089,0.0408903414285712 -Cu2Sb4Se3F2_6_5282.vasp,Cu2Sb4Se3F2,-1.6002475445454545,0.7937861603030261 -Al2P6_164_927.vasp,Al2P6,-3.47845747125,0.0118415187500002 -Fe1Se2_115_5754.vasp,Fe1Se2,-1.334810973333333,0.967047785 -Sn3Bi2S9_174_16911.vasp,Sn3Bi2S9,-2.231232451428572,-0.0322806596428599 -Sn6As6_12_16979.vasp,Sn6As6,-2.1987016691666668,0.1652011833333331 -Na2Ru2C2I8O4_7_12276.vasp,Na2Ru2C2I8O4,-2.379491475555556,0.0862813199999977 -Mn1Bi1S1I2_1_10647.vasp,Mn1Bi1S1I2,-1.2479552740000002,0.2273858953333326 -V2W2Se8_25_20231.vasp,V2W2Se8,-3.4285409816666665,-0.1595089374999998 -Mn2Se2I2_59_11278.vasp,Mn2Se2I2,-1.46955183,0.0418958858333333 -Li1Mo2I6O2_47_9751.vasp,Li1Mo2I6O2,-1.919124479090909,0.1127877236647716 -Nb4S12I2_2_13137.vasp,Nb4S12I2,-3.724984515000001,0.1393162944444403 -Ta2Te8Ru2_11_17929.vasp,Ta2Te8Ru2,-3.0320932625,0.1523457769444445 -Cr2B1O2_164_4322.vasp,Cr2B1O2,-4.67549121,1.3180954391111062 -K4Hg1As2_164_9458.vasp,K4Hg1As2,-0.2469255771428571,0.0907465871428571 -Li2Fe2F8_13_9906.vasp,Li2Fe2F8,-2.6953754225,0.0855647225000004 -Nb3Te1Se3S1Br2_1_13025.vasp,Nb3Te1Se3S1Br2,-3.401029615,0.3375618529603099 -Li2Ag2C4O8_2_9820.vasp,Li2Ag2C4O8,-4.876382214375,0.2380297081250004 -Se2_51_16294.vasp,Se2,-1.58554161,0.7224469433333334 -Cu2Sb2Se6_12_5270.vasp,Cu2Sb2Se6,-1.419603977,0.3844552641111091 -Ag1Bi2F12_2_30.vasp,Ag1Bi2F12,-1.6363410686666666,-0.0177395663333344 -Sn3N4_5_16918.vasp,Sn3N4,-4.0710052985714285,-2.026329293571429 -Ta2B1F2_164_17652.vasp,Ta2B1F2,-5.770110898,0.0790325568999905 -Ga6Te6_12_6587.vasp,Ga6Te6,-1.7903527108333332,0.1428475050000002 -Li1O1_187_9772.vasp,Li1O1,-2.932667645,1.0217525950000002 -Fe2Si2Sb1O9_8_5990.vasp,Fe2Si2Sb1O9,-4.936412307142858,0.1645371785118961 -Ta2N1Cl2_164_17778.vasp,Ta2N1Cl2,-5.39165239,0.3650467426666677 -Bi4W2S12_4_2658.vasp,Bi4W2S12,-2.921412926666666,-0.3322140117361136 -Rh2S1Br2O1_1_15212.vasp,Rh2S1Br2O1,-1.9429718366666664,0.4825888394027726 -Na4H20S2O10_51_12389.vasp,Na4H20S2O10,-3.906088272222222,0.0867660622222219 -Eu2P6O14_2_5605.vasp,Eu2P6O14,-5.598422969090909,0.1028430596363594 -Zr2S2_123_21654.vasp,Zr2S2,-4.2009432375,0.4682477875000002 -Hg1Bi2S4_12_7840.vasp,Hg1Bi2S4,-1.7149229914285713,0.171027145 -Ba2Br2F2_129_1926.vasp,Ba2Br2F2,-2.96380053,0.0703301900000004 -V2F6_162_20062.vasp,V2F6,-3.5023529875,-0.4292606750000001 -Cu4Bi7S12_10_5397.vasp,Cu4Bi7S12,-1.8886763669565216,-0.2022492721739145 -Ag4S4_2_555.vasp,Ag4S4,-0.79565342625,0.17257553859375 -Na4Hg2F8_11_12394.vasp,Na4Hg2F8,-1.64312737,0.0294680164285696 -Zn2Ge2O6_162_21088.vasp,Zn2Ge2O6,-3.706485166,0.1282161449166623 -Ta2Ni2Se6_11_17797.vasp,Ta2Ni2Se6,-3.099325438,-0.1040914082000024 -Ir3Pd1S4Br4_35_8854.vasp,Ir3Pd1S4Br4,-2.184920695,-0.0035078691666701 -Fe2As2S4Cl2_26_5780.vasp,Fe2As2S4Cl2,-2.430372113,-0.2623057410416685 -Ti2C1Cl2_164_18908.vasp,Ti2C1Cl2,-5.524014646,0.0250595500000008 -U2Te2O2_129_19731.vasp,U2Te2O2,-6.2952495483333335,-0.0132762427083332 -Sc7F10_2_16278.vasp,Sc7F10,-3.895962914705882,-0.1943180818627469 -Pb6N4_59_14329.vasp,Pb6N4,-2.797268362,0.2131435590000004 -Sc1Pd2Br2N1_3_15981.vasp,Sc1Pd2Br2N1,-2.40648479,0.4795217258333307 -Ta2Pd4S6_11_17830.vasp,Ta2Pd4S6,-3.375047584166667,0.1845915069166608 -Fe2C1O2F2_164_5827.vasp,Fe2C1O2F2,-2.5275151542857146,1.6032722642857076 -Sn2As2_164_16730.vasp,Sn2As2,-2.073861055,0.2900417974999998 -Sb4Se4O20F4_14_15825.vasp,Sb4Se4O20F4,-3.3877894334375,0.2566858578236579 -Y2Sn1_164_20781.vasp,Y2Sn1,-2.9626399666666665,0.9659617961111076 -Sn8O12_14_17005.vasp,Sn8O12,-3.965187198,0.1462025319999957 -Cr2Cu2Te12As4_13_4375.vasp,Cr2Cu2Te12As4,-1.5395533445,0.2071943310833318 -Li2Te2H2_4_10084.vasp,Li2Te2H2,-2.350739645,-0.7876657522222246 -Ir2Br4_11_8768.vasp,Ir2Br4,-1.017603575,0.7026080761111095 -Te2W1_115_18522.vasp,Te2W1,-2.2104053233333336,0.8344926283333329 -B3W4Cl2_164_1741.vasp,B3W4Cl2,-5.031126643333334,0.2399522174074015 -As4Au2Se3Br2_6_1318.vasp,As4Au2Se3Br2,-1.4725183945454543,0.3348708434090879 -As2Pd3Se8_164_1275.vasp,As2Pd3Se8,-1.870337543076923,0.2735993663846136 -Nd1Ge5_47_13221.vasp,Nd1Ge5,-2.956049151666667,-0.0618391683333361 -Tl1Pd5F2_38_19321.vasp,Tl1Pd5F2,-0.732141075,0.96799789625 -Mn3C12_164_11360.vasp,Mn3C12,-5.248980745333333,1.6760733366666605 -Hg3Br6_143_8054.vasp,Hg3Br6,0.5141373833333334,0.08722005 -Al2Br6_162_777.vasp,Al2Br6,-1.6312535225,0.0293546225 -In2S2_164_8551.vasp,In2S2,-2.21429783,0.0653723350000001 -Zn2H4Se2S8_7_21101.vasp,Zn2H4Se2S8,-2.1956591775,0.2571768473229165 -Ta1Bi2_164_17514.vasp,Ta1Bi2,-3.05757154,0.2163000533333305 -Li2V4O10_59_10133.vasp,Li2V4O10,-5.291812389375,0.1779492824999948 -Ni1H16Au2C8N8_10_13321.vasp,Ni1H16Au2C8N8,-4.909315597714286,-2.641551408238106 -Mo2N2_12_11640.vasp,Mo2N2,-5.27745434,0.4463434899999994 -Tl2Te4_12_19555.vasp,Tl2Te4,-0.67806904,0.4069205577777764 -Tl2Te3_5_19554.vasp,Tl2Te3,-0.466671366,0.520959 -Cu6As4S10_2_5492.vasp,Cu6As4S10,-1.9473073835,0.2082587249374959 -Al2O1_164_910.vasp,Al2O1,-3.746770363333333,0.7325182644444395 -Fe2Cu1O4_187_5842.vasp,Fe2Cu1O4,-3.220610962857143,0.2136832896428522 -Tl8Ge4Pb4S16_14_19648.vasp,Tl8Ge4Pb4S16,-2.2463658340625,0.1071578987500001 -Li1Al1P2O6_5_9642.vasp,Li1Al1P2O6,-5.385997025,0.2666117146599955 -Mo3N2_187_11714.vasp,Mo3N2,-4.477149664000001,0.9381142753333274 -Te4P4Pt4_13_18608.vasp,Te4P4Pt4,-2.666111863333333,0.395825055 -Al1Ru1Br2F1_8_720.vasp,Al1Ru1Br2F1,-2.067801698,0.7226929963333301 -Na2Os2S4Br8N2_7_12254.vasp,Na2Os2S4Br8N2,-2.185008971111112,0.0660764042361093 -Mn2Ga2Se4_1_11078.vasp,Mn2Ga2Se4,-2.0969368975,0.2282417403448274 -Ge1As1S1I1_1_6636.vasp,Ge1As1S1I1,-2.119558315,0.3243665578906249 -K2V2Cu4S8_28_9385.vasp,K2V2Cu4S8,-2.146325551875,0.1977473437500001 -Cr3Mo1Se8_25_4563.vasp,Cr3Mo1Se8,-2.7828088716666666,0.0534086454166667 -Ti4Te4F4_31_19167.vasp,Ti4Te4F4,-4.022589171666667,-0.0768736727777854 -Hg1S1F2_1_7907.vasp,Hg1S1F2,-0.79250976,0.3107219798958318 -Al2Co2Se5_187_806.vasp,Al2Co2Se5,-2.5603324300000003,0.036913772148143 -Y5I8_10_20844.vasp,Y5I8,-2.438128767692308,0.1038563129487148 -Sr2Br4_2_17156.vasp,Sr2Br4,-1.5306949516666668,0.3124740649999999 -Ba4Ge4Te10_4_2157.vasp,Ba4Ge4Te10,-2.0083633044444444,0.3299226472222223 -Zr4H2C3S2_164_21822.vasp,Zr4H2C3S2,-5.578868933636364,0.3079945496969634 -Sr2Sb2Se4F2_129_17310.vasp,Sr2Sb2Se4F2,-2.8111560090000003,0.0197756524999935 -Cd1H4C2N4F2_1_3347.vasp,Cd1H4C2N4F2,-4.426976419230769,0.1454389121794826 -In2O2_187_8509.vasp,In2O2,-3.1581928675,0.4221263300000002 -Fe8S10_75_6101.vasp,Fe8S10,-1.9664021744444444,0.0001498505555538 -Bi2Sb2O6_2_2524.vasp,Bi2Sb2O6,-3.796713473,0.2292432993636304 -Ba2I4O2_26_2004.vasp,Ba2I4O2,-1.876155845,0.3000332427083332 -Sc2O2_129_16113.vasp,Sc2O2,-5.2714103525,0.6192978954687498 -Sb2W2S10_13_15749.vasp,Sb2W2S10,-3.1984845285714285,0.2807448927232112 -H4Pb6O8_81_7069.vasp,H4Pb6O8,-3.5570954672222226,-0.0276372901157436 -Te6Mo2_11_18656.vasp,Te6Mo2,-1.80542402375,0.1706931029166665 -W12I24_127_20406.vasp,W12I24,-1.9828943327777775,0.0877962202777777 -Cs2C2Se2Cl6O6_4_4675.vasp,Cs2C2Se2Cl6O6,-2.731103864444444,0.5260083804166631 -Mo2Se4_127_11695.vasp,Mo2Se4,-1.76414053,1.2812726933333336 -Pb8I2F14_51_14337.vasp,Pb8I2F14,-2.381321755,0.0588168082291663 -Cu2Se2N1O10_12_5301.vasp,Cu2Se2N1O10,-2.7003595446666666,0.727520303666664 -Ni1H4C8Cl2_25_13352.vasp,Ni1H4C8Cl2,-4.922172018,0.429317671333328 -Pd3S5Br1Cl1_1_14509.vasp,Pd3S5Br1Cl1,-1.646988104,0.2277539749999951 -Tl2Co2Se5_156_19399.vasp,Tl2Co2Se5,-1.5256913066666666,0.4752234160493808 -Li6Te2H2O8_11_10278.vasp,Li6Te2H2O8,-4.137358081666666,0.0571629622222227 -Pt4Se1S1Br5Cl1_1_14708.vasp,Pt4Se1S1Br5Cl1,-1.0995888425,0.1183981024999972 -Cr2Te12P4Au2_13_4515.vasp,Cr2Te12P4Au2,-1.7080286245,0.2384730342916651 -V1Cr1Se1Br1_25_19808.vasp,V1Cr1Se1Br1,-2.457544535,0.72856297989583 -Pd6S6Cl6_6_14527.vasp,Pd6S6Cl6,-1.5417599494444445,0.0883298032638886 -P2Ru2S6_157_14043.vasp,P2Ru2S6,-3.465067617,0.1841293474999932 -Zn1Ga1Ni3Te2P3Ru1I1Cl3_1_20933.vasp,Zn1Ga1Ni3Te2P3Ru1I1Cl3,-1.4546696246666668,0.1191544854618006 -As1Cl2_164_1142.vasp,As1Cl2,-1.1255008366666666,0.6472134344444429 -Zr1Ta1S2I2_25_21453.vasp,Zr1Ta1S2I2,-3.687510185,-0.0376615315740811 -Al2C4Cl4F10_10_782.vasp,Al2C4Cl4F10,-3.0445426285,0.6627131275000002 -Au1Br2_115_1414.vasp,Au1Br2,0.4755330433333333,0.2933033554166668 -Ge6Bi2_191_6956.vasp,Ge6Bi2,-1.859835355,-0.1133866374999998 -Li2Nb4O11_12_10016.vasp,Li2Nb4O11,-6.409399704117647,-0.0914268474264747 -Mn3Se1N1O2_99_11407.vasp,Mn3Se1N1O2,-3.856225524285714,0.4698913871428525 -Al4S4Cl4_14_1085.vasp,Al4S4Cl4,-3.017931475833333,0.0322389591666669 -Fe2N1O2_164_5883.vasp,Fe2N1O2,-3.684500088,0.4236369536666581 -Bi2S2Br2_11_2509.vasp,Bi2S2Br2,-1.7770024583333337,0.0616768883333331 -Mn1Al1S2I2_6_10624.vasp,Mn1Al1S2I2,-2.155877265,0.0938441406249976 -Cu2Te2I2_59_5332.vasp,Cu2Te2I2,-0.0893572483333333,0.2571431345238092 -Cd1H4C4N2Cl2_10_3351.vasp,Cd1H4C4N2Cl2,-4.6261579323076925,0.1689210248076786 -W1Br2_12_20421.vasp,W1Br2,-1.8759285,0.7092457494444442 -Nb1Sn1Te1I1_156_12591.vasp,Nb1Sn1Te1I1,-1.9179644975,0.2254509552604136 -Y1V1Se1Cl1_6_20688.vasp,Y1V1Se1Cl1,-3.059933135,1.296813106249996 -As8W4O28_14_1408.vasp,As8W4O28,-4.948616446,0.0617197864999954 -Ni1Ir1Se1S1_1_13370.vasp,Ni1Ir1Se1S1,-1.84916947,0.2060586356597164 -In4Te4I4_14_8701.vasp,In4Te4I4,-0.9134865958333332,0.06404793 -Ag2Te1Ir1Rh1Se3Br1Cl3_1_449.vasp,Ag2Te1Ir1Rh1Se3Br1Cl3,-1.1940988558333332,0.1404664194999973 -Ag2N2Cl2_59_330.vasp,Ag2N2Cl2,-1.0918143433333334,1.2823793950000002 -Mn2F6_189_11066.vasp,Mn2F6,-2.4609096925,-0.11670546625 -Ag1As1I2O2_1_2.vasp,Ag1As1I2O2,-1.6707844533333331,0.3704475430208295 -Ga2Fe1Te4_156_6353.vasp,Ga2Fe1Te4,-1.3420245657142855,0.4604835211904745 -Bi2S2F2_59_2512.vasp,Bi2S2F2,-2.4174880566666666,-0.2787843958333352 -H2W2C1_164_7032.vasp,H2W2C1,-4.967686276,0.7162098110000004 -Ca1Au1Br2_1_2801.vasp,Ca1Au1Br2,-0.527514,1.29441942 -Mn1Te2_164_10912.vasp,Mn1Te2,-1.4325717066666668,0.3432240133333331 -Sb1Pb2Se6_162_15479.vasp,Sb1Pb2Se6,-1.7730499,0.3904364924536994 -Cu4S4Br4_14_5450.vasp,Cu4S4Br4,-0.8890263608333333,0.121180198373015 -Eu2Sb2S4O2_129_5606.vasp,Eu2Sb2S4O2,-4.353625031,-0.4156337756666691 -Mg3P2H16O16_1_10555.vasp,Mg3P2H16O16,-4.668331281621621,0.0079450966666623 -Ni2P1S2_187_13554.vasp,Ni2P1S2,-1.928436198,0.103710114409089 -B2S5_1_1703.vasp,B2S5,-3.705740014285714,0.2091266180357125 -Sb2As2S6_7_15533.vasp,Sb2As2S6,-2.73962421,0.4221198142500004 -Sb1Se1_123_15502.vasp,Sb1Se1,-1.697374765,0.6504029387499979 -P6H2S12_4_14136.vasp,P6H2S12,-3.1791186155,0.1269599409687473 -Te6P4_1_18674.vasp,Te6P4,-2.102217479,0.4592523690000002 -B2P2H6Pb2S6_7_1693.vasp,B2P2H6Pb2S6,-3.247466786111111,-0.2914046556646876 -Li4Co1P2O8_2_10174.vasp,Li4Co1P2O8,-4.921804246,0.0072705837777733 -Y2Br2O2_164_20701.vasp,Y2Br2O2,-5.21990435,0.2747151133333334 -Zn5B2P1Pt1N1Cl6_1_21235.vasp,Zn5B2P1Pt1N1Cl6,-1.333447435,0.6265562742230901 -Na2I2O4_113_12180.vasp,Na2I2O4,-2.3141346025,0.2356208470833323 -Sn2Os1_123_16800.vasp,Sn2Os1,-2.314474316666667,-2.0899406700000003 -Ag2H12C16N8_2_265.vasp,Ag2H12C16N8,-5.681912949736843,-1.6839458307894832 -Rb2Hg4Se2Cl6O6_31_14877.vasp,Rb2Hg4Se2Cl6O6,-1.421732217,0.0955878557812499 -Ag2C2S2O6F6_147_225.vasp,Ag2C2S2O6F6,-3.3571146744444444,0.1600882882291573 -Al2S2_187_944.vasp,Al2S2,-3.4519581025,0.0681168414583308 -B8Se6_31_1793.vasp,B8Se6,-3.809202612857143,0.6494965290476139 -Mn1S2_164_10853.vasp,Mn1S2,-2.54053311,0.8203115675000001 -Li3V4O11F1_1_10151.vasp,Li3V4O11F1,-5.178830796842105,0.0768407404221374 -Sr2V2Si4O14_28_17340.vasp,Sr2V2Si4O14,-5.841041458636363,0.1241766950126151 -Sr2Cl4O4_7_17181.vasp,Sr2Cl4O4,-2.544913146,0.2377743345000005 -Bi2B13_164_2425.vasp,Bi2B13,-4.611857700666667,0.7899119572222181 -Na2Mg2As2_129_12202.vasp,Na2Mg2As2,-1.3055740083333334,0.5649726049999999 -Nb1Ga1Se1S1Br2_1_12511.vasp,Nb1Ga1Se1S1Br2,-2.7610530766666668,0.2002939518518449 -Sn4Sb4Te4_17_16967.vasp,Sn4Sb4Te4,-1.5409855766666667,-0.7559778991666674 -Hf2N2F2_59_7544.vasp,Hf2N2F2,-6.788718215,0.1073637995833269 -Sr4Bi4S8Cl4_14_17410.vasp,Sr4Bi4S8Cl4,-2.5160172845,0.1374805930000002 -Bi8Ru2Br4_12_2691.vasp,Bi8Ru2Br4,-1.4815895542857145,0.0950153907142856 -Cu1H1_156_4891.vasp,Cu1H1,-1.062288955,2.1447975125 -Tl2Si2Se6_162_19542.vasp,Tl2Si2Se6,-2.231524661,0.2390476893958313 -Cd1_191_3440.vasp,Cd1,2.86481304,0.0520148250000001 -Ni1C4N2Cl2F4_47_13295.vasp,Ni1C4N2Cl2F4,-4.164469048461538,0.0136003228846031 -Ag2W1Se4_111_492.vasp,Ag2W1Se4,-1.8393714385714288,-0.2219135614285732 -P2H2Pb2O6_7_13977.vasp,P2H2Pb2O6,-4.580797301666666,0.0773703324688138 -Ca2P2H4O12_7_3085.vasp,Ca2P2H4O12,-4.650699095,0.2433908464791666 -Al2I6_189_881.vasp,Al2I6,-0.67262305625,0.30918321 -Co2Te6_6_4053.vasp,Co2Te6,-1.36807220625,0.2579517137500001 -W2C2F2_59_20477.vasp,W2C2F2,-5.324825435,0.1407977265277662 -Te2Ru2Br2_59_18513.vasp,Te2Ru2Br2,-1.7726008283333332,0.3992882252777749 -Fe4H2C3O2_164_6079.vasp,Fe4H2C3O2,-3.780609698181818,0.8757600773484763 -Bi8S20_14_2692.vasp,Bi8S20,-2.319911534642857,-0.5337859512500018 -Pd2Se16Cl4_14_14481.vasp,Pd2Se16Cl4,-1.5946703840909089,0.0888881652272728 -Fe2Sb2Pt2_129_5952.vasp,Fe2Sb2Pt2,-1.32616566,0.8169503016666645 -V4O10_11_20338.vasp,V4O10,-5.546108730714286,-0.087530148571429 -P4S4_14_14110.vasp,P4S4,-3.41216482375,0.1016104583984378 -Tl1In1Hg1S4_156_19295.vasp,Tl1In1Hg1S4,-1.4348894057142856,0.1912127977678542 -Hg1H2O2_12_7867.vasp,Hg1H2O2,-2.7167332120000003,0.1753316624999998 -Ni2F6_162_13505.vasp,Ni2F6,-1.24152703375,0.1222586599999999 -Au2Se2_129_1547.vasp,Au2Se2,-0.14803854,0.52808174 -Bi16Cl4_10_2306.vasp,Bi16Cl4,-1.212134972,-0.4923535196666676 -Nb2Mo1I1Br1O2_1_12761.vasp,Nb2Mo1I1Br1O2,-4.062631588571429,0.6998957030952276 -Na2Pd3O4_47_12267.vasp,Na2Pd3O4,-2.662386333333333,0.1048916174074049 -Cu1Te1Au1Se1I1Br1_1_4986.vasp,Cu1Te1Au1Se1I1Br1,-0.260683015,0.2091255107879678 -Nb4Co2Te10_59_13056.vasp,Nb4Co2Te10,-2.8645139775,0.0873299250520831 -In1Fe5I2_123_8249.vasp,In1Fe5I2,0.01183554875,1.5770988956249998 -Sn3Bi4_5_16913.vasp,Sn3Bi4,-1.0628710885714283,-1.9135565849999987 -Li4S4O8_13_10221.vasp,Li4S4O8,-4.21571236875,0.1830111986718752 -Tl1Ag1Te6As2_149_19210.vasp,Tl1Ag1Te6As2,-1.17062984,0.1769465570833318 -Na2C4Se2_31_12011.vasp,Na2C4Se2,-3.8835194925,1.170349983125 -K2Cd4Te2Br6O6_31_9066.vasp,K2Cd4Te2Br6O6,-1.452453354,0.25333895375 -Ag1H4C6S2N6_6_76.vasp,Ag1H4C6S2N6,-5.424174932105263,0.1510465078618348 -Tc4Br10_13_18243.vasp,Tc4Br10,-2.095866317857143,0.484197871071426 -Cu2C12N12_31_5059.vasp,Cu2C12N12,-6.360914753461539,0.2756053680769155 -Pt2O2_187_14643.vasp,Pt2O2,-2.1115457075,1.0012903943750002 -Zn2Sb4S8_4_21162.vasp,Zn2Sb4S8,-2.155751542142857,0.1875749991428559 -Na2Ge1H6S6_147_12086.vasp,Na2Ge1H6S6,-2.960604045333333,0.1249524376666666 -Cr1Cl2_164_4142.vasp,Cr1Cl2,-2.1931450966666666,-0.1182448155555573 -Re2Cl2_129_15037.vasp,Re2Cl2,-2.930412975,1.4615788555555522 -Sn2Hg1S2F2_12_16779.vasp,Sn2Hg1S2F2,-1.7038350071428572,0.2102970742857109 -Cr3O8_10_4569.vasp,Cr3O8,-4.61558551,-0.0631954843750044 -Br10N2_51_2703.vasp,Br10N2,-0.2402926708333333,0.6766115245833297 -Na4Sb4Mo4O20_14_12412.vasp,Na4Sb4Mo4O20,-4.5093424509375,0.1311856596874996 -Y2Br6_191_20705.vasp,Y2Br6,-2.73736059375,0.1674927374999999 -Y1I2_164_20643.vasp,Y1I2,-2.314680743333333,0.088082066111109 -Ga2I6_26_6394.vasp,Ga2I6,-0.49507338125,0.1180950793749999 -Be1Cl2_115_2218.vasp,Be1Cl2,-2.5672127,0.0827907133333329 -Ta2P2S6_2_17821.vasp,Ta2P2S6,-4.401656833,0.2542369969999956 -Bi1H2S2_164_2339.vasp,Bi1H2S2,-2.589520432,0.0719034492499953 -Mn2As2S6_162_10978.vasp,Mn2As2S6,-2.864825569,0.3556412248749976 -Sn1Au1F6_2_16605.vasp,Sn1Au1F6,-1.68494913875,0.2117767877777763 -Ta2Co2S10_51_17700.vasp,Ta2Co2S10,-3.776164814285714,0.2294679217857114 -Fe1C8F6_25_5654.vasp,Fe1C8F6,-4.788591787333333,0.4494793061666635 -Zr2N2Cl2_59_21608.vasp,Zr2N2Cl2,-5.617497373333333,0.0847610599999999 -Nb4V2Zn4O16_13_13179.vasp,Nb4V2Zn4O16,-5.121174317692308,0.1630889366666562 -Fe1Bi1O3_1_5630.vasp,Fe1Bi1O3,-3.434179222,0.39690316625 -Sb2Cl10_2_15562.vasp,Sb2Cl10,-1.05280002,0.0614641574999998 -Co1H2O2_5_3739.vasp,Co1H2O2,-3.84763207,0.2674683314444419 -Ni2Te2_164_13669.vasp,Ni2Te2,0.0074559425,0.5705328674999995 -Hf2Ge2S2_129_7495.vasp,Hf2Ge2S2,-4.8625028483333335,-0.0681846033333379 -Al1Mo2S3Cl2_10_686.vasp,Al1Mo2S3Cl2,-2.8089352775,0.4599991199999946 -Cu1Ni1S2I1Br1_1_4922.vasp,Cu1Ni1S2I1Br1,-0.716628825,0.2112943801504614 -Hf3B2S2_187_7684.vasp,Hf3B2S2,-5.953458562857143,-0.1099350514285757 -Er2Cl6_162_5554.vasp,Er2Cl6,-2.8647034625,0.0482852499999997 -Mn1In1Se1Br1_1_10778.vasp,Mn1In1Se1Br1,-1.299946735,0.3899566681573276 -Y5F8_10_20843.vasp,Y5F8,-4.588450816153846,0.4374672470512779 -Sr4Ta2Cu4O14_6_17477.vasp,Sr4Ta2Cu4O14,-4.188605420416667,0.4782255020833301 -K2S6N2_4_9338.vasp,K2S6N2,-2.673407871,0.1983744064999983 -Mn3O4_164_11398.vasp,Mn3O4,-4.444712164285714,0.0735174500000006 -Nb2Ga1Ir1O8_1_12725.vasp,Nb2Ga1Ir1O8,-5.626939894166667,0.2685581248958331 -Na2H6Pt1S6_147_12129.vasp,Na2H6Pt1S6,-2.883716972666667,0.0403460656666665 -Cs1_191_4658.vasp,Cs1,1.66714867,0.3275619649999999 -Si1Sb3_191_16363.vasp,Si1Sb3,-1.7085727075,0.7516398593749999 -Ni2Te1Se1O1_99_13655.vasp,Ni2Te1Se1O1,-1.33918707,0.0464374648749998 -Ti2H2C1O2_164_18944.vasp,Ti2H2C1O2,-6.199570442857143,0.1591530568253842 -Te4H2Pd2_2_18585.vasp,Te4H2Pd2,-1.7154939425,0.6077293937500001 -Ba2Li2_11_2017.vasp,Ba2Li2,-0.3969328975,0.5501511758333334 -Ti2C1S2F2_164_18911.vasp,Ti2C1S2F2,-4.698656781428572,0.39287339642856 -Ga2H2Se2S8_11_6379.vasp,Ga2H2Se2S8,-2.5321046378571426,0.2813749058333287 -Hg4Se2O8_13_8088.vasp,Hg4Se2O8,-1.788937467142857,0.2327685923809515 -Cr2Se2_129_4500.vasp,Cr2Se2,-2.906977045,0.2586244774999999 -Zn2Bi4S6Br4_31_21047.vasp,Zn2Bi4S6Br4,-1.4633401575,0.2135843761249999 -Co2Mo2S8F2_129_3934.vasp,Co2Mo2S8F2,-2.4663089635714286,0.787977008809518 -Mo12S6Br12_51_11485.vasp,Mo12S6Br12,-2.629629635666667,0.037766303333333 -K2S6Br2_11_9333.vasp,K2S6Br2,-1.591189143,0.3877788806250004 -Al1Pd5F2_38_711.vasp,Al1Pd5F2,-1.321439205,0.9636283516666644 -Hf2Se1I5_8_7595.vasp,Hf2Se1I5,-2.3167454075,0.1135841464062503 -Na2Ag1_187_11962.vasp,Na2Ag1,0.3356575266666666,0.1823178966666666 -Pr6Os2I6_11_14564.vasp,Pr6Os2I6,-2.620964692142857,0.087023192857143 -In2Hg1Te4_164_8472.vasp,In2Hg1Te4,-0.7659821628571429,0.1460394585714284 -Cr5Se10_8_4627.vasp,Cr5Se10,-2.6976464313333333,0.0688391836666668 -Zn2Si2O6_162_21169.vasp,Zn2Si2O6,-4.517231952,0.2421875511666664 -Ag2C2N2O2_11_215.vasp,Ag2C2N2O2,-4.53588597,0.0620743986458274 -Ba2Ge4_12_1987.vasp,Ba2Ge4,-2.262781136666667,0.4593368233333335 -Na4Tl4O4_6_12427.vasp,Na4Tl4O4,-2.126598813333333,0.0893856250000002 -Cr1Te1Cl1_156_4269.vasp,Cr1Te1Cl1,-1.92043786,-0.0558997361111128 -Cd1Br1N1Cl1_6_3284.vasp,Cd1Br1N1Cl1,-0.8880988675,0.6544431221875 -La1Mg5_1_9569.vasp,La1Mg5,-0.1649537666666666,0.429805848484848 -Pd3S4_10_14508.vasp,Pd3S4,-1.7145493357142858,0.4845880889285695 -Tl2Br6_189_19384.vasp,Tl2Br6,-0.2394401125,0.1849839003125 -Y2O6_2_20763.vasp,Y2O6,-5.4350897375,0.4291540890624992 -Mg2Al2Se5_164_10419.vasp,Mg2Al2Se5,-2.695034008888889,0.0556850805555559 -Rb2C2S2Cl6O6_1_14788.vasp,Rb2C2S2Cl6O6,-3.160034327222222,0.1656673158333307 -Nb3Br2N1Cl1O3_1_12952.vasp,Nb3Br2N1Cl1O3,-5.200888273,0.127603683326904 -In2Bi6_164_8385.vasp,In2Bi6,-0.75074811625,-0.2395629875 -Nb2Cu1Se2S1I2_1_12707.vasp,Nb2Cu1Se2S1I2,-2.6972558075,0.2357367258996155 -Pd2S1I2_1_14457.vasp,Pd2S1I2,-0.6504933239999999,0.3682845925000001 -K2H2C2S6_4_9120.vasp,K2H2C2S6,-3.249309104166666,0.1748242616666562 -Mn1Ge1Br2N1_1_10733.vasp,Mn1Ge1Br2N1,-2.579294952,0.1532828435 -Mn1Tl2Se4_156_10917.vasp,Mn1Tl2Se4,-1.4660323242857145,0.3149294447619031 -Sb2As2_1_15537.vasp,Sb2As2,-2.57042697,-0.7274198200000002 -Mo2Se2_2_11692.vasp,Mo2Se2,-2.8895241125,0.7368449824999999 -Al2Ga2Te6_31_846.vasp,Al2Ga2Te6,-1.929951799,0.0742650355916649 -Hf3H2C2Se2_187_7706.vasp,Hf3H2C2Se2,-5.455235104444444,0.4461539071604892 -In2Te2I2_31_8622.vasp,In2Te2I2,-0.91546012,0.0620744058333333 -Ge2Cl4_11_6770.vasp,Ge2Cl4,-1.9436158133333332,0.0235784233333331 -Nd1Al3Cu1_99_13213.vasp,Nd1Al3Cu1,-1.617263844,0.8351301900000001 -Sr2Cd1In1Au1S5_99_17172.vasp,Sr2Cd1In1Au1S5,-1.684235866,0.3773856106875003 -Ga2I1Cl1_1_6387.vasp,Ga2I1Cl1,-1.2422766875,0.0122969627083323 -Tl2P6_2_19484.vasp,Tl2P6,-2.82514070875,0.2870482561249967 -Hg2Ge1S4_21_7961.vasp,Hg2Ge1S4,-1.2256021114285711,0.245456107589284 -Y1V1Ge1Cl4O3_1_20687.vasp,Y1V1Ge1Cl4O3,-3.962817708,0.1348619633928516 -Zn2P4O8_51_21136.vasp,Zn2P4O8,-4.22191593,0.3519045251428531 -W4N3Cl2_164_20583.vasp,W4N3Cl2,-4.926279737777778,0.1413469209259218 -Ga2Ni1Se4_164_6400.vasp,Ga2Ni1Se4,-1.9612795942857144,-0.055236009285716 -V6As4O18_100_20384.vasp,V6As4O18,-5.073230094642858,0.1787441578571376 -Hf4N3F2_164_7795.vasp,Hf4N3F2,-6.911335893333334,0.2768438791666527 -Au2I4O12_4_1491.vasp,Au2I4O12,-2.123420900555556,0.1314341077777754 -Y4H2N3_164_20825.vasp,Y4H2N3,-6.279985657777778,-0.2050596711111172 -Bi2Se4_12_2551.vasp,Bi2Se4,-1.8814254166666664,0.2601657672222199 -Ca1Pb1I2O2_1_2865.vasp,Ca1Pb1I2O2,-2.3451880283333333,0.091379248333328 -Li4Zn2Cl8_11_10252.vasp,Li4Zn2Cl8,-1.743633327857143,0.0770616492857141 -Zr4S6F2_8_21846.vasp,Zr4S6F2,-4.574887570833334,0.2104430096874947 -Mn3Co1O8_164_11371.vasp,Mn3Co1O8,-4.148682779166667,-0.0257838748958367 -Cr2Ag2P4Se12_13_4299.vasp,Cr2Ag2P4Se12,-2.3486594700000003,0.0103300656562498 -Mo4H2C3O2_164_11741.vasp,Mo4H2C3O2,-4.988236353636363,0.2978917632954445 -V2Cl2_129_20032.vasp,V2Cl2,-2.2785241725,0.7044031774999999 -Ni2Cl6_162_13499.vasp,Ni2Cl6,-0.34704793625,0.1013315499999999 -Si8Ir2_125_16546.vasp,Si8Ir2,-3.956542069,-0.0569614742500033 -Fe2Te2W2S12_113_6003.vasp,Fe2Te2W2S12,-2.8141494894444445,0.0784870717129602 -Na2S4F2_113_12291.vasp,Na2S4F2,-1.27894850875,1.1285835309375 -Cr2Te2H4O10_2_4521.vasp,Cr2Te2H4O10,-4.243581914444444,0.0917141589120337 -Al2As6_164_765.vasp,Al2As6,-2.74635361125,0.01595141875 -Mo2Br2O2_59_11571.vasp,Mo2Br2O2,-3.370957545,0.2164859829166667 -Pd2I1Cl1O2_6_14427.vasp,Pd2I1Cl1O2,-1.5495652516666667,0.2411162572222187 -Li2Au1O2_12_9827.vasp,Li2Au1O2,-2.6527214,0.8845179059999979 -Dy2Sb2S4O2_129_5534.vasp,Dy2Sb2S4O2,-4.342910644,0.0042912215416621 -Ti2S4Br2_1_19006.vasp,Ti2S4Br2,-3.58780277625,0.3543522368749994 -Co1H8C4N2O4_10_3771.vasp,Co1H8C4N2O4,-5.11360790368421,0.1700054855263048 -Tl6Te6_2_19647.vasp,Tl6Te6,-0.5969188525,0.35574052875 -Ta2Mn3H1C2N1O6_8_17774.vasp,Ta2Mn3H1C2N1O6,-5.657467914,0.4795895804999892 -Nb1Br1F1_156_12478.vasp,Nb1Br1F1,-3.2851203666666664,0.5205956222916635 -Na2Sn2P2H2O8F2_11_12307.vasp,Na2Sn2P2H2O8F2,-4.433724425555556,0.0405460144374869 -Bi2Se1S1Cl2_1_2535.vasp,Bi2Se1S1Cl2,-1.8164493916666664,0.1041166037499999 -Sc2H2Br2_164_16076.vasp,Sc2H2Br2,-3.04565045,0.0390752249999999 -Te2Mo1_164_18402.vasp,Te2Mo1,-2.024046583333333,0.0868476666666664 -K1Zn1B3H12_143_8962.vasp,K1Zn1B3H12,-3.3466217405882355,0.6916576859411689 -Cr1Cu1Te6As2_5_4163.vasp,Cr1Cu1Te6As2,-1.558827211,0.1879204645833318 -Al1H2S2_164_670.vasp,Al1H2S2,-2.947458714,0.8569010986249953 -Mg1Ga2Te4_164_10365.vasp,Mg1Ga2Te4,-1.6694382357142856,0.0705748342857144 -Cu1H4C6N8O4_2_4900.vasp,Cu1H4C6N8O4,-5.497140013478261,0.5065431661594141 -Mo4H2C3_164_11743.vasp,Mo4H2C3,-4.766672852222222,0.3360819548611067 -Eu3Te3_123_5610.vasp,Eu3Te3,-2.960378341666667,-0.2396099666666669 -Mo3O9_157_11720.vasp,Mo3O9,-4.2029673925,0.9247559662500002 -Ta3Se1Cl7_156_17989.vasp,Ta3Se1Cl7,-3.555188433636364,-0.047231955681822 -Fe2Te2Cl14_1_5995.vasp,Fe2Te2Cl14,-0.8999898244444444,0.0571928844444444 -Zn1C2S2O6F6_147_20906.vasp,Zn1C2S2O6F6,-3.681761635882353,0.173647822647056 -Bi4S8_12_2643.vasp,Bi4S8,-2.3612839691666667,-0.7137849217708356 -V3H2C2O2_187_20262.vasp,V3H2C2O2,-5.260650233333333,0.1547595286868583 -W1O2_187_20443.vasp,W1O2,-6.178117283333333,0.0895824853061162 -Y2Ge1_164_20737.vasp,Y2Ge1,-3.78295108,0.1746629316666628 -B1W2Se2_164_1644.vasp,B1W2Se2,-4.759840468,-0.1275500409999996 -Hf1Zr2Ge1B1W1Se1Cl6O3_1_7409.vasp,Hf1Zr2Ge1B1W1Se1Cl6O3,-3.982617993125,0.5572391640066869 -In2Cl6_1_8405.vasp,In2Cl6,-1.31207070625,0.1288947337499999 -Ga2Br6_189_6313.vasp,Ga2Br6,-0.8919639625,0.2621294875 -Zr1Ta1Mn2Mo1Br1N1Cl1O4_1_21447.vasp,Zr1Ta1Mn2Mo1Br1N1Cl1O4,-4.910826304166666,0.2898941133796198 -Na2Hg4Se2Cl6O6_31_12163.vasp,Na2Hg4Se2Cl6O6,-1.5138119525,0.1382690243750004 -Zr1I2_164_21311.vasp,Zr1I2,-1.82246395,0.2058957316666665 -Y1C3_187_20616.vasp,Y1C3,-5.9842763775,1.4073127592187509 -Ti3B2S2_187_19066.vasp,Ti3B2S2,-5.902238858571429,-0.1355349185714334 -Co1H4N6Cl2_47_3768.vasp,Co1H4N6Cl2,-4.133228418461538,0.0145043219230709 -B2O1_65_1687.vasp,B2O1,-5.786827483333333,0.8102800261805494 -Na2H8I2O4_2_12138.vasp,Na2H8I2O4,-3.501878335625,-0.1241268029166662 -Cr3O8_8_4574.vasp,Cr3O8,-4.73500673,-0.1826167043750048 -Sr2Ni2Sn2_129_17289.vasp,Sr2Ni2Sn2,-0.2491312716666666,0.1428872033333333 -Zr1Pt1S1I2O1_1_21405.vasp,Zr1Pt1S1I2O1,-2.6921304766666663,0.593457088472221 -Cr2S2I2_59_4466.vasp,Cr2S2I2,-2.107872278333333,-0.0460537266666665 -Ta8Ag2S16_11_18162.vasp,Ta8Ag2S16,-4.880288694615385,0.0678203973076918 -Ni1Ir3Se3S5_1_13376.vasp,Ni1Ir3Se3S5,-2.6775467658333336,-0.0816252096875005 -Bi1Sb1W1_156_2382.vasp,Bi1Sb1W1,-2.69487214,0.7781955599999972 -Zn3Ga2O6_156_21204.vasp,Zn3Ga2O6,-3.1514851681818183,-0.1011506498863705 -Co1Ni1Se2I1Br1_6_3792.vasp,Co1Ni1Se2I1Br1,-0.9988287083333334,0.1226782185185171 -Cd2Bi2Cl2O4_11_3466.vasp,Cd2Bi2Cl2O4,-2.230942473,0.1926294410000002 -Sb1S2O6F1_1_15493.vasp,Sb1S2O6F1,-3.675962638,0.5400861348333303 -Hf2F6_189_7491.vasp,Hf2F6,-4.48460777,0.5129122034374994 -Mg2P1_25_10494.vasp,Mg2P1,-1.1563067766666666,0.7845742209027773 -Ag1Au1I1Br1O2_1_8.vasp,Ag1Au1I1Br1O2,-0.6514647516666666,0.5705504676041665 -Li2B2H6S2N8_51_9835.vasp,Li2B2H6S2N8,-4.758304074,0.2822871695234332 -K2Y2Mo4O16_13_9391.vasp,K2Y2Mo4O16,-5.3425801775,0.1053616522916662 -Na1N3_10_11906.vasp,Na1N3,-4.253349535,1.1831932275000003 -Cu4Cl4O4F4_14_5403.vasp,Cu4Cl4O4F4,-1.021325721875,0.4877979009374999 -Li2Mn2O4_59_9996.vasp,Li2Mn2O4,-4.07564288375,0.2919515257112074 -V1Sb2_164_19924.vasp,V1Sb2,-2.5123821200000003,0.3707256852777747 -Zr2Te2_164_21711.vasp,Zr2Te2,-3.045373295,-0.0832027600000002 -Mn1Ag1Se1Cl1_1_10617.vasp,Mn1Ag1Se1Cl1,-0.918935455,0.4342811450000001 -Pd2S1Br1_1_14456.vasp,Pd2S1Br1,-1.0598996525,0.3246518783333316 -Pb2Br2Cl2_11_14214.vasp,Pb2Br2Cl2,-1.305037936666667,-0.0650997408333332 -Ru1I2_115_15272.vasp,Ru1I2,-0.5445226966666666,0.4607876349999991 -V2As2S10_129_19979.vasp,V2As2S10,-2.9042960792857144,0.5598984263392788 -In2Cu2Mo4O16_13_8420.vasp,In2Cu2Mo4O16,-4.416219188333334,0.0763719789409691 -Cu4Se4Br4_14_5472.vasp,Cu4Se4Br4,-0.6655465433333333,0.1100330890079359 -Ba2O10_2_2039.vasp,Ba2O10,-3.549038195833333,0.300272053958333 -In2Co2S5_164_8413.vasp,In2Co2S5,-2.409421957777778,0.211149501018516 -Mo2As2_12_11564.vasp,Mo2As2,-3.1651169075,0.4817233103571394 -V2Te4_11_20220.vasp,V2Te4,-1.9528624883333332,0.4143785694444442 -Ag4I4O4F4_14_530.vasp,Ag4I4O4F4,-0.509212745625,0.7306505025 -Te2Os2_187_18428.vasp,Te2Os2,-2.6349998325,0.4885173962499998 -Sr4Sb4Se8F4_14_17471.vasp,Sr4Sb4Se8F4,-2.8212620745,0.0096695869999939 -Fe4N3O2_164_6083.vasp,Fe4N3O2,-3.7582330066666665,0.5128808453703663 -Na2H6C2S2N8_51_12114.vasp,Na2H6C2S2N8,-4.8977851435,-0.1415278406458415 -Sr2Cu1S2F2_38_17202.vasp,Sr2Cu1S2F2,-2.404089922857142,0.4730603947619 -Cr2Ag2P4O12_4_4297.vasp,Cr2Ag2P4O12,-4.5540186585,0.3346469051666609 -Nb2Se2Br2_59_12869.vasp,Nb2Se2Br2,-3.5042820566666664,-0.1564280820238155 -Zn2Cl2O1_115_21055.vasp,Zn2Cl2O1,-1.159557038,0.0814256158749999 -Cr3I1N3Cl1_8_4559.vasp,Cr3I1N3Cl1,-4.092205705,0.021927091666662 -Ca1Si1Te1Cl3_1_2880.vasp,Ca1Si1Te1Cl3,-2.107627125,0.1820374933333305 -Be3Cl6_5_2277.vasp,Be3Cl6,-2.4758995333333336,0.1741038799999996 -Na1Fe1Sb2O6_5_11853.vasp,Na1Fe1Sb2O6,-3.665284064,0.5245026595 -Co2W2S8Br2_129_4056.vasp,Co2W2S8Br2,-2.634137461428572,0.62436038913865 -Cr1Rh1S2_99_4236.vasp,Cr1Rh1S2,-2.99956047,0.1058141587943213 -W1Br2_164_20422.vasp,W1Br2,-1.8771836066666667,0.7079906427777773 -V3H2C2_187_20265.vasp,V3H2C2,-4.952117712857143,0.1935848112244849 -Mo2S2_187_11668.vasp,Mo2S2,-3.2017582925,0.96513984875 -Cd2H10C12N16_2_3509.vasp,Cd2H10C12N16,-5.69561000425,-1.5971720100000106 -Hg2Pt4S6_164_7988.vasp,Hg2Pt4S6,-1.6521345883333334,0.1599906383333316 -Na4Se4S8_13_12420.vasp,Na4Se4S8,-2.17746259625,0.2627483498958335 -Ge2_164_6898.vasp,Ge2,-2.65881502,-0.4858393950000002 -Te2Pd2Cl2_59_18466.vasp,Te2Pd2Cl2,-1.131006255,-0.1091472086458342 -K2Mg5Sn3_123_9231.vasp,K2Mg5Sn3,-0.380867393,0.0632462009999999 -Ni2Pd2S4Br4_1_13577.vasp,Ni2Pd2S4Br4,-1.158459739166667,-0.0220038470833332 -Zr2Se2_187_21679.vasp,Zr2Se2,-3.63486653,0.256933805 -Zr1Sb2_187_21428.vasp,Zr1Sb2,-3.0381600766666668,-0.695627079166667 -Sc2Sb2Te6_157_16149.vasp,Sc2Sb2Te6,-2.256656217,0.2063351694999997 -Mn2Bi2Se4Cl2_10_11016.vasp,Mn2Bi2Se4Cl2,-1.853519887,0.1608715354166654 -Au1I2_115_1430.vasp,Au1I2,0.6864428766666667,0.2133243879166671 -Zr2Pd2Br2Cl2O4_6_21634.vasp,Zr2Pd2Br2Cl2O4,-3.6133797225,0.3398552311111111 -K2Pt4S6_164_9310.vasp,K2Pt4S6,-2.304429095,0.1186988383333331 -Mo2I2O2_59_11622.vasp,Mo2I2O2,-3.064085405,0.2592694811111107 -V2S2Cl2_59_20153.vasp,V2S2Cl2,-3.0574989416666667,0.1460653866666637 -Mn1Zn1In1I1Br1O2_8_10942.vasp,Mn1Zn1In1I1Br1O2,-1.9055172357142856,0.2010828582204416 -Li4N1O4_38_10205.vasp,Li4N1O4,-3.969354348888889,0.2112848356111066 -Al2I2O2_59_877.vasp,Al2I2O2,-3.6562720916666662,0.1820500477777736 -Zr1Cd1S2I2_1_21273.vasp,Zr1Cd1S2I2,-1.97375227,0.1479286323611108 -P2Se2O10F2_4_14048.vasp,P2Se2O10F2,-3.836983399375,0.2967027592187448 -As4Cl12_14_1326.vasp,As4Cl12,-1.53337334,0.0595321449999999 -Sb2Pb1S4_164_15635.vasp,Sb2Pb1S4,-2.612951594285714,-0.0513239228571449 -B18S9_1_1612.vasp,B18S9,-4.7762760477777775,0.4798422333333287 -Zr3C2Cl2_187_21754.vasp,Zr3C2Cl2,-5.491028875714286,-0.1560302471428625 -Te4Rh2_11_18623.vasp,Te4Rh2,-1.8754235716666667,0.3265949705555553 -Ag1Ge2Se2_1_66.vasp,Ag1Ge2Se2,-1.830702218,0.3434231071878963 -Nb1Sb2_164_12571.vasp,Nb1Sb2,-3.493235156666667,0.378911973333333 -Fe2Bi1S2_187_5803.vasp,Fe2Bi1S2,-1.754553808,-0.073019967 -Tl2Te2Br2_59_19545.vasp,Tl2Te2Br2,-0.5082977266666667,0.4001056922222214 -Nb1Ni3Se6_1_12547.vasp,Nb1Ni3Se6,-1.911938912,0.153082750999994 -Sr2In1Ag1Hg1S5_99_17263.vasp,Sr2In1Ag1Hg1S5,-1.702947264,0.2526650410000001 -Tl8Sn2S6_90_19654.vasp,Tl8Sn2S6,-1.4630391625,0.1048529487499999 -Mn1Mo1O2F2_1_10796.vasp,Mn1Mo1O2F2,-3.5162896333333333,0.5443351525 -Ga1S2F2_12_6260.vasp,Ga1S2F2,-1.98944303,0.8665484074791641 -B2Se5_1_1713.vasp,B2Se5,-3.0880402300000003,0.2868033114285683 -Cu4S2_26_5446.vasp,Cu4S2,-0.6358570633333334,0.3590527233333322 -Mg2Cu2Ge2_129_10448.vasp,Mg2Cu2Ge2,0.02049877,0.855456773611109 -Ge4P8_26_6938.vasp,Ge4P8,-3.7543814225,-0.3327255575000025 -Os4Se8_13_13895.vasp,Os4Se8,-2.91295635,0.63166491 -Fe2Se2Br2_59_5970.vasp,Fe2Se2Br2,-1.2999654966666667,0.2785187933333333 -Mn4Sn4S12_13_11455.vasp,Mn4Sn4S12,-2.7039754485,0.2980634464999966 -Te2Au2Cl2_59_18366.vasp,Te2Au2Cl2,-0.2532762616666666,0.4953371698958322 -Zr4N4F4_59_21834.vasp,Zr4N4F4,-6.1901689725,0.1090094558333332 -Ga1S4_8_6263.vasp,Ga1S4,-2.269961426,0.4995397186874999 -Rb2S6Br2_11_14933.vasp,Rb2S6Br2,-1.471906944,0.5247808176250002 -As4Pb3_5_1347.vasp,As4Pb3,-1.9896067814285716,0.2848069135714284 -Hg2Pb4Br6O4_5_7985.vasp,Hg2Pb4Br6O4,-1.367742461875,0.2238395059375001 -Zn2In2Te5_156_21113.vasp,Zn2In2Te5,-0.7294551866666666,0.1296237633333324 -Li8Te8O20_14_10288.vasp,Li8Te8O20,-3.943070984444444,0.0469861161111113 -Nb2O6_59_12800.vasp,Nb2O6,-6.16137167875,-0.0829480749999997 -Fe1F2_187_5675.vasp,Fe1F2,-1.9077679533333327,0.8100173833333335 -Hf2I6_189_7524.vasp,Hf2I6,-1.8179758325,0.4831417437499998 -Zn2H2Pd1O6_8_21096.vasp,Zn2H2Pd1O6,-2.771714221818182,0.3011717289393909 -Mo3H2N2O2_187_11709.vasp,Mo3H2N2O2,-4.841777198888889,0.2724552009722063 -Hf1Zn1F6_5_7370.vasp,Hf1Zn1F6,-3.5219528325,0.0459989087500001 -Au4S4O12_14_1589.vasp,Au4S4O12,-2.838826683,0.7949822124999999 -Ca2O2_129_3080.vasp,Ca2O2,-4.286767695,-0.0439958149999997 -Mo3H2N2_187_11710.vasp,Mo3H2N2,-4.479421777142857,-1.233655065793656 -Nb2Cl2O2_59_12676.vasp,Nb2Cl2O2,-5.08317338,0.095471838194433 -Zr1Pd1S2Cl2_6_21403.vasp,Zr1Pd1S2Cl2,-2.560317835,0.5175829143749978 -Li1Cu1O2F1_25_9687.vasp,Li1Cu1O2F1,-2.322881836,0.6022429885 -V2C1S2_164_20021.vasp,V2C1S2,-4.810404792,-0.5648711979444516 -Na2Ti2Br2N2_59_12320.vasp,Na2Ti2Br2N2,-4.594721505,-0.1377517699999995 -Ti2B1H2_164_18887.vasp,Ti2B1H2,-5.241848186,0.1802395685000006 -Mn1H2_187_10766.vasp,Mn1H2,-2.81075103,0.6634187408333334 -Al2Te2Cl14_4_998.vasp,Al2Te2Cl14,-1.4932458694444444,0.0594698622222209 -Mn2C2N1Cl1F1_1_11047.vasp,Mn2C2N1Cl1F1,-3.9872826914285713,0.8936959749999895 -Mn2S1I2_12_11212.vasp,Mn2S1I2,-1.555739362,0.063998218 -Ta3Pd3S14_6_17977.vasp,Ta3Pd3S14,-3.643080013,0.138788767124991 -Co2O6_2_3953.vasp,Co2O6,-3.3877815425,-0.2256157693749998 -Cu2I2O1_1_5168.vasp,Cu2I2O1,-0.482370402,0.3169469327999972 -Rb2S6N2_4_14938.vasp,Rb2S6N2,-2.676715635,0.2214122254374979 -S4O8_14_15399.vasp,S4O8,-4.0675916625,0.305285879166667 -Ba4Bi2_59_2138.vasp,Ba4Bi2,-0.73101569,0.4433774088888879 -Fe2Te2_187_6005.vasp,Fe2Te2,-0.45268975,1.3134665012499998 -Nb4Pd2Se14_11_13125.vasp,Nb4Pd2Se14,-3.2442853085000003,0.1054411849374934 -Tl6B2Se6_11_19640.vasp,Tl6B2Se6,-1.9168845121428573,0.387369112857143 -Na2Cd4Cl6O8_31_12022.vasp,Na2Cd4Cl6O8,-1.5383649204999998,0.3196800810416664 -Zn3I6_143_21205.vasp,Zn3I6,0.4810275566666666,0.1643497187499999 -Zr1Ti3Se8_1_21483.vasp,Zr1Ti3Se8,-4.14075866,0.2361409414583328 -Li2H4C2_67_9937.vasp,Li2H4C2,-3.715003505,1.0515050975000004 -Sn6O8_14_16992.vasp,Sn6O8,-3.9647063,0.0396136164285676 -Fe1As1O3_1_5618.vasp,Fe1As1O3,-3.5663626720000003,0.5332839121999964 -Cd2Bi2S4Cl2_26_3471.vasp,Cd2Bi2S4Cl2,-1.302944255,0.2105857320000001 -Mg8C4_57_10601.vasp,Mg8C4,-1.7950422616666666,0.6342339361111091 -Pt2S1Br1Cl1O1_6_14650.vasp,Pt2S1Br1Cl1O1,-1.8033751116666668,0.4817573527083305 -Cd1Cl1O1F1_156_3299.vasp,Cd1Cl1O1F1,-0.8835280725,0.5382727640625 -Ba2S8Br4_65_2050.vasp,Ba2S8Br4,-2.0307458221428574,0.4145926846428547 -K2Cd4S2Cl6O6_31_9047.vasp,K2Cd4S2Cl6O6,-1.987312772,0.1260926252187461 -Mg1Cl2_115_10350.vasp,Mg1Cl2,-1.880292,0.1867355449999999 -Sn1Cl2_164_16625.vasp,Sn1Cl2,-1.45716823,0.1214917283333334 -Na2Hg4Se2O6F6_31_12165.vasp,Na2Hg4Se2O6F6,-1.750761635,0.2416444474999985 -Sn2Sb2S6Cl2_7_16865.vasp,Sn2Sb2S6Cl2,-2.122631740833333,0.3243738179166668 -Re4F14_13_15106.vasp,Re4F14,-3.357387442222222,0.1319747007407352 -Ce2Mg4_51_3671.vasp,Ce2Mg4,-0.53311306,0.489610944999999 -Ni2As4_2_13457.vasp,Ni2As4,-1.8804921916666668,0.2544733941666668 -Au4I4O4F4_4_1572.vasp,Au4I4O4F4,-0.439848364375,1.0158623471250006 -Bi2Se2_164_2547.vasp,Bi2Se2,-1.595076205,0.2396615524999988 -Mg4Sn4O8_1_10585.vasp,Mg4Sn4O8,-3.888664676875,-0.0745539262499999 -H4I4O12_29_7066.vasp,H4I4O12,-3.0192788925,0.0604643840833294 -Ni2S4F2_2_13594.vasp,Ni2S4F2,-1.73556091125,0.0870939306249981 -Na2Pd1_187_12266.vasp,Na2Pd1,-0.2448312,0.2775922049999999 -B2As2H6Pb2S6_7_1647.vasp,B2As2H6Pb2S6,-3.0674044722222225,0.6950367317361075 -Li2Cu2P6O18_2_9894.vasp,Li2Cu2P6O18,-4.989843812857143,0.0772194982142853 -Cs2C4S6F6_1_4678.vasp,Cs2C4S6F6,-3.3328509116666667,0.110655723124991 -P2I8_2_13989.vasp,P2I8,-0.418892223,0.141781074 -Ni2Pd1Br4O3_1_13575.vasp,Ni2Pd1Br4O3,-1.194876504,0.09686302025 -Ca4Mn2Cl2O6_129_3222.vasp,Ca4Mn2Cl2O6,-4.091479204285714,-0.0031813141071455 -Te2Ir2I2_11_18394.vasp,Te2Ir2I2,-1.6952829166666668,0.1904103716666634 -Ca2Br2_129_2961.vasp,Ca2Br2,-0.671238825,0.9354002275 -Hg1Cl1O1F1_156_7848.vasp,Hg1Cl1O1F1,-0.438867975,0.51911249125 -Ge2Te2Br2_59_6881.vasp,Ge2Te2Br2,-1.6513062033333332,-0.0792087622222235 -C2O2_129_2753.vasp,C2O2,-3.80460343,2.8700495875000005 -Mo2Se2_187_11690.vasp,Mo2Se2,-2.6269527225,0.9994163725 -Cd5N2O16_10_3638.vasp,Cd5N2O16,-2.433056469565217,0.5539690740941978 -Al4Se4I4_14_1095.vasp,Al4Se4I4,-2.066922641666667,0.0372758824999999 -Cs2P2H6O6F2_1_4765.vasp,Cs2P2H6O6F2,-4.142300406111112,0.0169845376666536 -V2H2C1O2_164_20072.vasp,V2H2C1O2,-5.064841817142857,0.0864540992658646 -Th1I2_156_18718.vasp,Th1I2,-1.3723572733333331,1.1103675583333337 -K2Cu6Te4_12_9092.vasp,K2Cu6Te4,-0.2922291216666666,0.4217510633333321 -Os1S2_187_13822.vasp,Os1S2,-3.54805638,0.7500611258333327 -Ca1Cu1I1Br1_6_2823.vasp,Ca1Cu1I1Br1,-0.498179245,1.097380695 -Pd1Au1Se1Cl1_6_14343.vasp,Pd1Au1Se1Cl1,-0.677800055,0.55969458875 -Nb2Se1I2O1_6_12865.vasp,Nb2Se1I2O1,-3.7929141,0.0198459466145741 -K2Nb2I12_4_9265.vasp,K2Nb2I12,-0.996529840625,-0.0876116643749999 -Sc2F4_11_16071.vasp,Sc2F4,-3.85223666,-0.0053671594444479 -Mn2O2_123_11177.vasp,Mn2O2,-3.474636755,0.7360096078448275 -Zr1I1Br1N1_8_21306.vasp,Zr1I1Br1N1,-3.50453019,0.380195459166663 -Al2Cl2O2_59_789.vasp,Al2Cl2O2,-4.424887703333334,-0.9280843616666674 -Na2Nb2S12_7_12229.vasp,Na2Nb2S12,-3.408375113125,-0.0007439533854194 -Zr1Ge1Cl2O3_1_21298.vasp,Zr1Ge1Cl2O3,-4.502584184285714,0.2627516216071375 -Al2Se2I2_31_965.vasp,Al2Se2I2,-2.075335893333333,0.0288626308333332 -Mn3Si1Te2_187_11413.vasp,Mn3Si1Te2,-2.3145228166666665,0.2131530418749966 -Sb4C4S6N2_2_15773.vasp,Sb4C4S6N2,-4.21337808625,0.3759966351041612 -Ag2Sb4Se3F2_6_416.vasp,Ag2Sb4Se3F2,-1.4724919036363635,0.5012170621212095 -Co1O1_123_3800.vasp,Co1O1,-3.089915285,-0.1227475349999998 -Nb4H2N3O2_164_13086.vasp,Nb4H2N3O2,-6.505272802727273,-0.6188535512954645 -Zr2B1F2_164_21508.vasp,Zr2B1F2,-4.910678356,-0.0124747064999994 -Na1In1As2S6_5_11880.vasp,Na1In1As2S6,-2.604586545,0.3943612188124974 -Co2I6_162_3928.vasp,Co2I6,-0.35884622375,0.0429121249999999 -Zr3B2H2O2_38_21735.vasp,Zr3B2H2O2,-5.320268825555555,0.4220347455555517 -Cu2B4Pb4O12_14_5038.vasp,Cu2B4Pb4O12,-4.572945038181818,0.3084277633116815 -V2I10_1_20087.vasp,V2I10,-0.4022031666666666,0.1715266856249995 -Pt2Br4O12_14_14602.vasp,Pt2Br4O12,-2.2010907788888887,0.4721068661111089 -Bi12Au2_31_2297.vasp,Bi12Au2,-0.8105152957142857,-0.2456096742857148 -Ni2Bi2Te4Br2_10_13471.vasp,Ni2Bi2Te4Br2,-0.707373173,0.3479342449999996 -Cd6Se6O20_4_3639.vasp,Cd6Se6O20,-2.8418245090625,0.1129334828125001 -Fe2O6_11_5897.vasp,Fe2O6,-3.40162627875,0.2441204912500003 -Na1Co1P2O6_5_11844.vasp,Na1Co1P2O6,-4.621418465,0.3517158088750007 -Cd4I4O4_14_3631.vasp,Cd4I4O4,-0.5423972083333334,0.3694906076984122 -Ni1Ge2C12_164_13319.vasp,Ni1Ge2C12,-5.346895479333333,1.5214544154999987 -H2W4C3S2_164_7041.vasp,H2W4C3S2,-5.277175444545454,0.298595914999989 -Ga1Pt5Cl2_123_6250.vasp,Ga1Pt5Cl2,-1.43632432,0.2799941141356711 -B13N2_164_1607.vasp,B13N2,-5.956100891999999,0.6427218581111047 -Ta2Pt1Se6_12_17836.vasp,Ta2Pt1Se6,-3.79288585,0.095886276666667 -Zr3B2F2_187_21734.vasp,Zr3B2F2,-5.095255368571428,-0.0264816764285756 -Al1Cd1Ga1O4_156_619.vasp,Al1Cd1Ga1O4,-4.073071234285714,0.2037767654761906 -Cr2Cl2_129_4351.vasp,Cr2Cl2,-1.6541623025,1.2022585758333308 -Ni2Se4F2_11_13647.vasp,Ni2Se4F2,-1.36585494875,0.2443801777083332 -Fe1H2S2_164_5686.vasp,Fe1H2S2,-2.954377186,-0.2225491824999999 -V1B4S6F5_2_19778.vasp,V1B4S6F5,-3.262206393125,0.7040593026041627 -Mn1Nb1Se4_25_10814.vasp,Mn1Nb1Se4,-3.27253197,0.0029143404166673 -Ta1Nb2Ir1S4I4_1_17582.vasp,Ta1Nb2Ir1S4I4,-3.2647137125000003,0.2878694529642694 -Li1Ti1Br2N1F1_6_9799.vasp,Li1Ti1Br2N1F1,-3.810501205,-0.0376937922916759 -Hf2Sb2Te6_12_7588.vasp,Hf2Sb2Te6,-2.734320739,0.2823081924999983 -V3C2_187_20254.vasp,V3C2,-5.322880578,0.540307576541661 -Hf3B2Te2F2_187_7686.vasp,Hf3B2Te2F2,-4.3089218266666665,0.724766474166658 -Sr2Te2Au1Br2_38_17324.vasp,Sr2Te2Au1Br2,-1.1464630871428572,0.2709270778571404 -Au4Br8_13_1568.vasp,Au4Br8,0.305121215,0.1228915270833335 -Bi2Te4Br8_2_2573.vasp,Bi2Te4Br8,-0.8731268464285715,-0.2992513833928577 -Cu2Te2Br2_59_5329.vasp,Cu2Te2Br2,-0.3118500083333333,0.2455569591666662 -Re4S2I4O1_12_15112.vasp,Re4S2I4O1,-3.4393146581818184,0.4128234583459483 -Pb2Se6_4_14298.vasp,Pb2Se6,-1.77682049625,0.3521558521354165 -Ge2P2O6_7_6807.vasp,Ge2P2O6,-4.80968502,0.275910197714282 -Li1Zr1Ti1Ni1S3Cl1_6_9815.vasp,Li1Zr1Ti1Ni1S3Cl1,-3.55461813375,0.2524557153125 -Hf1Zr1Ga1Ag1S4Br4_1_7377.vasp,Hf1Zr1Ga1Ag1S4Br4,-2.8132875583333337,0.1708604604166643 -Sn4H4C8O12_12_16941.vasp,Sn4H4C8O12,-5.212466049642857,0.2721219268452262 -U2H4O8_53_19712.vasp,U2H4O8,-6.002145134285714,0.2356279653571436 -Pt2F2_164_14620.vasp,Pt2F2,-1.5151047125,0.6910454718750001 -Re4O14_51_15110.vasp,Re4O14,-5.621797418888889,0.0898233525000007 -Co2P4S6Br4_4_3971.vasp,Co2P4S6Br4,-2.39182821125,0.2867141491796854 -Te2Pt2_187_18491.vasp,Te2Pt2,-1.323208905,0.5743446649999999 -Ca3Mn2I2O5_123_3186.vasp,Ca3Mn2I2O5,-3.6739718,-0.1110561692013967 -Ga4F4_57_6552.vasp,Ga4F4,-2.4120262275,-0.0673435475000023 -Sb2Te2_164_15725.vasp,Sb2Te2,-1.56204321,0.357139363749998 -W2Se3Cl2_1_20552.vasp,W2Se3Cl2,-2.963378838571429,0.018535917142854 -Ag2Hg2Se2F2_26_303.vasp,Ag2Hg2Se2F2,-0.1511167425,0.1509523274999996 -Mo1O2_191_11528.vasp,Mo1O2,-3.3730141733333334,1.938890938333333 -Re2O6_12_15068.vasp,Re2O6,-5.66455249125,-0.8011362312500001 -Sr2Cu1Bi2O6_123_17195.vasp,Sr2Cu1Bi2O6,-3.615205,0.2508441954545439 -Zn2Sb4Br4O6_31_21150.vasp,Zn2Sb4Br4O6,-2.685084991875,0.0822229389453102 -Fe1Hg1O2F5_10_5713.vasp,Fe1Hg1O2F5,-1.186849862222222,0.5186524966666652 -Zn3Ag1_191_21198.vasp,Zn3Ag1,2.1188568925,0.0768504987500002 -Bi1Te2O6F1_1_2405.vasp,Bi1Te2O6F1,-3.293930322,0.3698073432083262 -Na2Sn1O6F6_147_12303.vasp,Na2Sn1O6F6,-2.0984742346666665,0.976165557166667 -Li1V1O2F2_1_9808.vasp,Li1V1O2F2,-4.329501946666666,0.1338746010069408 -Rb2Hg4S2Cl6O6_31_14869.vasp,Rb2Hg4S2Cl6O6,-1.746950488,0.0901338462499985 -Ta2S2_123_17856.vasp,Ta2S2,-5.469987555,0.2981329912499939 -Cu1Rh1Br2O1_1_4950.vasp,Cu1Rh1Br2O1,-1.257823946,0.4381501830555528 -Au2Se4Cl2_1_1555.vasp,Au2Se4Cl2,-0.80477940875,0.237372188125 -V1Mo3O8_25_19886.vasp,V1Mo3O8,-5.255561689166666,0.1057395919444397 -In1Pt2Se3Br4_1_8318.vasp,In1Pt2Se3Br4,-1.285058099,0.1787111984999978 -Ni1Rh1Se2_156_13406.vasp,Ni1Rh1Se2,-1.4425580575,1.119548463125 -V3Te8W1_25_20294.vasp,V3Te8W1,-2.41169218,0.1249631012500002 -Hf1Fe1Br6_149_7157.vasp,Hf1Fe1Br6,-1.9897936825,-0.0628867868750007 -Nb1Si1Te2_1_12584.vasp,Nb1Si1Te2,-3.2418785725,0.4643134903333308 -Ce1Sn5_47_3660.vasp,Ce1Sn5,-1.4455053433333334,-1.252995271666667 -Si3As4_5_16465.vasp,Si3As4,-3.59049773,-0.4390140316666692 -Hf2F4_11_7489.vasp,Hf2F4,-4.6141359516666665,0.4998544258333282 -Zr3Tl2Cu2Se8_12_21799.vasp,Zr3Tl2Cu2Se8,-2.7294958006666667,0.1267581479999999 -Nd2Te6_129_13247.vasp,Nd2Te6,-2.56754335875,0.0541967725000001 -Ge4Bi8_26_6928.vasp,Ge4Bi8,-1.7483344866666668,-0.7127639483333343 -Hf1Ti2Ni1S6I4_1_7339.vasp,Hf1Ti2Ni1S6I4,-3.097198918571429,0.1410508285714212 -Rb2Li2Se2_129_14898.vasp,Rb2Li2Se2,-1.93087249,0.0356412866666668 -Nd6O4F10_6_13251.vasp,Nd6O4F10,-5.0920545675,0.2290840796666624 -Lu1Bi2_21_10291.vasp,Lu1Bi2,-1.65510743,-0.3707832116666678 -Pt1N2_47_14580.vasp,Pt1N2,-4.728249243333333,0.0848504849999962 -Ca1Ag1S3I1Br1_1_2793.vasp,Ca1Ag1S3I1Br1,-1.4145141,0.2555755390624972 -Pt2S12N4_14_14649.vasp,Pt2S12N4,-3.0625491816666663,0.2123924408333306 -Sn3H1O7_1_16914.vasp,Sn3H1O7,-3.970620604545455,0.3374587019128743 -Nb1Cu1P2S6_5_12498.vasp,Nb1Cu1P2S6,-3.2930211300000005,0.1592086149374926 -Hf1Br2_164_7130.vasp,Hf1Br2,-2.879226226666667,0.2827738588888857 -Ta2Ni1O6_12_17789.vasp,Ta2Ni1O6,-6.061352841111112,-0.0201541233333406 -Sb2Mo1_164_15600.vasp,Sb2Mo1,-2.4147707566666665,0.3478223961904727 -Sr1Ag1Ge1Sb1S2Br2_1_17014.vasp,Sr1Ag1Ge1Sb1S2Br2,-1.85932214125,0.2104655504445932 -Li1Tl1I4O12_2_9805.vasp,Li1Tl1I4O12,-2.696249898888889,0.0925515483333336 -Li2Ti2C2F2_59_10092.vasp,Li2Ti2C2F2,-5.08303784875,0.1970596862499998 -Sc2Zn1Br2O3_1_16192.vasp,Sc2Zn1Br2O3,-3.88928838125,0.3115232974999995 -Cd1H4C4Br2N2_10_3348.vasp,Cd1H4C4Br2N2,-4.535222340769231,0.1841203111538449 -Ag2Se4_6_446.vasp,Ag2Se4,-0.8965643916666667,-0.5542675633333334 -K2Nb2Ag4Se8_28_9257.vasp,K2Nb2Ag4Se8,-1.885554995625,0.1428463734375001 -In2H4C4F10_10_8466.vasp,In2H4C4F10,-2.9644299065,0.9632670385000004 -Mn2Mo1S4_99_11132.vasp,Mn2Mo1S4,-2.850182247142857,0.4538892878571399 -H4Pd1C6N2Cl2_25_7076.vasp,H4Pd1C6N2Cl2,-5.080395968,0.3533145224444385 -Ca2Sb4O8_26_3118.vasp,Ca2Sb4O8,-4.184621832142857,0.1330131309999962 -Tl2Ga2O6_31_19423.vasp,Tl2Ga2O6,-3.494675146,0.0780007162499967 -Ca3Au2Br2O4_123_3149.vasp,Ca3Au2Br2O4,-2.5318628490909094,0.3060458551515101 -P2Br6_31_13963.vasp,P2Br6,-1.21044627375,0.0849642312499989 -V2Te2Cl2O7_2_20203.vasp,V2Te2Cl2O7,-3.9288864484615376,0.1224392204326894 -Tl1Ge1Se3_143_19279.vasp,Tl1Ge1Se3,-1.683389086,0.4704421738333312 -K2Tl2O2_11_9380.vasp,K2Tl2O2,-1.6763078216666667,0.1397095783333333 -Ba2Ag1S2I2_38_1888.vasp,Ba2Ag1S2I2,-1.864883632857143,0.0688785383314709 -Zn1Ir1Au2O4_1_20970.vasp,Zn1Ir1Au2O4,-1.95953607,0.8544192556250001 -Yb1Se1_187_20858.vasp,Yb1Se1,-2.442757845,0.7819002249999998 -Te1Mo1S1Br1_6_18304.vasp,Te1Mo1S1Br1,-1.968757245,0.4524263761874967 -Zn1F2_123_20922.vasp,Zn1F2,-1.21760719,0.3791049874999999 -Co1H2_187_3742.vasp,Co1H2,-2.555151786666667,1.2203210666666633 -Bi2B8H6O18_2_2427.vasp,Bi2B8H6O18,-5.7261204326470585,0.1088098767647065 -Ag4S4O12_14_554.vasp,Ag4S4O12,-2.994606296,0.3592090229999997 -Fe1Cl2_164_5658.vasp,Fe1Cl2,-1.6201796933333332,0.0500975633333335 -Cd1As1_8_3267.vasp,Cd1As1,0.337245015,0.8623996404687486 -Sn2Sb2Se6_147_16869.vasp,Sn2Sb2Se6,-1.927385874,0.2120013599999979 -Te6Pb2_4_18677.vasp,Te6Pb2,-1.21366328125,-0.4581539904166666 -Ca2Bi4O8_11_2956.vasp,Ca2Bi4O8,-3.959359977142857,0.0728965675000004 -Ag2Se2Cl2_59_431.vasp,Ag2Se2Cl2,-0.491330795,0.253270967916666 -V4O10_31_20341.vasp,V4O10,-5.4551321,0.0034464821428565 -Fe2Te4As2Cl2_26_6010.vasp,Fe2Te4As2Cl2,-1.616531788,0.2066150868888857 -Ca3Si1_25_3202.vasp,Ca3Si1,-0.5281442875,0.8110040518750001 -Al1Cu1Sb2O6_149_644.vasp,Al1Cu1Sb2O6,-4.125882215,0.4314946231249956 -Lu1Pb2_123_10297.vasp,Lu1Pb2,-1.1869278866666666,-0.3403208449999999 -Sr2S6N2Cl2_59_17303.vasp,Sr2S6N2Cl2,-2.8661876858333333,0.2447064676562427 -In2Au2Br3O3_1_8379.vasp,In2Au2Br3O3,-1.559718,0.3451840965000001 -P4Au2O12_12_14067.vasp,P4Au2O12,-4.285871239444444,0.4302149120370333 -Ni4P4O4_13_13751.vasp,Ni4P4O4,-3.1885485441666668,0.1534016951111065 -Na2V2P2O10_4_12333.vasp,Na2V2P2O10,-4.832361805,0.5109956021874953 -Ir2F8_7_8786.vasp,Ir2F8,-1.915818055,0.1068643959999999 -V3S2N2F2_187_20287.vasp,V3S2N2F2,-4.141414837777777,0.2674552779629595 -P1Br3_187_13913.vasp,P1Br3,-0.7963201175,0.4990903874999989 -Ge2Sb1Te6_162_6839.vasp,Ge2Sb1Te6,-1.7180090733333335,-0.1182097537037072 -Se2_51_16291.vasp,Se2,-1.63195349,0.6760350633333334 -Sb2W2Se6_12_15751.vasp,Sb2W2Se6,-2.946016401,0.0279709024999981 -Cr1Br2O1_47_4130.vasp,Cr1Br2O1,-2.63480141,-0.4763711575520858 -Ge1Bi1Se2_1_6648.vasp,Ge1Bi1Se2,-2.0965765225,0.214764474375 -Cr1Si3_191_4267.vasp,Cr1Si3,-3.1597419,0.8181139975000004 -In2N2_129_8487.vasp,In2N2,-3.09711161,0.9350602612500004 -Si1As3_191_16316.vasp,Si1As3,-2.4313902025,0.0125198387499998 -Cr1Bi1Sb1_156_4125.vasp,Cr1Bi1Sb1,-1.71957057,1.147988963333331 -Cu2F4_14_5094.vasp,Cu2F4,-1.1358285033333333,0.1612368566666666 -Te2Rh2_164_18506.vasp,Te2Rh2,-1.6685985175,0.5547495245833312 -Si3N4_174_16472.vasp,Si3N4,-5.956020784285714,-0.1368905357142855 -Fe1Pb2_123_5737.vasp,Fe1Pb2,-0.17352765,1.4385528499999984 -Sr2H8S6O24_2_17251.vasp,Sr2H8S6O24,-4.465231418,0.0299142407499992 -V1Br1N1F1_156_19785.vasp,V1Br1N1F1,-3.5463029475,0.0133699647395784 -Sc1Ag1Sb2S6_149_15892.vasp,Sc1Ag1Sb2S6,-2.574327138,0.3095455810624976 -Mo4N3O2_156_11750.vasp,Mo4N3O2,-5.242802972222222,0.3436972849999951 -Hg4Br4O16_57_8069.vasp,Hg4Br4O16,-1.5193992312500002,0.464224819270832 -Au2Se2Cl2_59_1542.vasp,Au2Se2Cl2,-0.398247815,0.2319472784999995 -Tl2F6_26_19411.vasp,Tl2F6,-1.5572452,-0.083618239375 -As2Se2O10F2_4_1298.vasp,As2Se2O10F2,-3.328484658125,0.32706658515625 -H2W1_187_7030.vasp,H2W1,-3.157487346666666,2.398854866666662 -Bi4Au4_51_2596.vasp,Bi4Au4,-0.130852815,0.224291595 -Li2Zr1_187_10143.vasp,Li2Zr1,-2.0281577366666665,0.3212744227777759 -Ga2Co2Te5_156_6338.vasp,Ga2Co2Te5,-1.618950763333333,0.2584500464814796 -Hg2H4S2O8_31_7966.vasp,Hg2H4S2O8,-3.3735256675,0.1417384775297612 -Mn1H1O2_8_10761.vasp,Mn1H1O2,-4.3617867025,0.308057364374996 -P2H6Pb2C2S6_7_13983.vasp,P2H6Pb2C2S6,-3.711125806111111,0.0957618558333223 -Ca2Sb4O12_2_3117.vasp,Ca2Sb4O12,-4.327929486111112,0.3192230549999992 -Cr2H2S5_12_4401.vasp,Cr2H2S5,-3.16904834,0.2173171152777742 -Au1N2_10_1431.vasp,Au1N2,-3.676110533333333,0.5121674449999967 -Ir1O2_115_8742.vasp,Ir1O2,-3.439379033333333,1.2049629900000003 -Hf1Bi1Se3Br1_1_7119.vasp,Hf1Bi1Se3Br1,-2.7525514133333338,0.4322244779166644 -Fe1B6Pb2C6_1_5629.vasp,Fe1B6Pb2C6,-5.045697485333333,0.9436804412777732 -Zr1Ni1Se1S1_156_21381.vasp,Zr1Ni1Se1S1,-3.0219771025,1.0294898706249995 -Re2N2_38_15058.vasp,Re2N2,-6.9172283325,0.0408433416666609 -Ga2Bi6_164_6307.vasp,Ga2Bi6,-0.96745449625,-0.343578755 -Pb1F4_123_14185.vasp,Pb1F4,-1.854858242,0.07692709 -Te2As2H2O10_4_18352.vasp,Te2As2H2O10,-4.0853384075,0.0545715998148108 -Bi2Te2_12_2569.vasp,Bi2Te2,-1.1717584575,0.3480785424999999 -In2Se2I2_59_8583.vasp,In2Se2I2,-1.249977545,0.0725527227083333 -Al2H2S10_11_862.vasp,Al2H2S10,-2.938058205,0.2118980416071404 -Re2S6_11_15080.vasp,Re2S6,-3.99894195875,0.3605823592187498 -Ba1I2_115_1839.vasp,Ba1I2,-1.1031917633333337,0.4413301633333331 -V1Ga2Te4_164_19837.vasp,V1Ga2Te4,-1.9243532342857144,0.1252639565277757 -Ag1W1Br2N1O1_1_149.vasp,Ag1W1Br2N1O1,-3.04630991,0.267630082187492 -V1In2O4_164_19872.vasp,V1In2O4,-4.000273418571429,0.4653480311309474 -Mn2Sb4Se8_53_11264.vasp,Mn2Sb4Se8,-2.1172489214285712,0.1969475876190458 -Ga1Sb2Te6Au1_149_6268.vasp,Ga1Sb2Te6Au1,-1.183003247,0.3412616358666649 -Ru1Br2_164_15261.vasp,Ru1Br2,-1.55086019,0.1719232072222208 -Cr2I2_164_4413.vasp,Cr2I2,-1.061178565,1.1088905566666647 -Ni4I4O4_14_13747.vasp,Ni4I4O4,-1.13852348,-0.0483812393750011 -Rb2Os2C2Cl8O4_7_14906.vasp,Rb2Os2C2Cl8O4,-3.0240877122222223,0.2584936170833273 -Zn1Ni3H4O8_1_20981.vasp,Zn1Ni3H4O8,-3.138599981875,-0.144322243854171 -Na2Ti1H4O5_2_12318.vasp,Na2Ti1H4O5,-4.688260568333333,0.0865465609722226 -Co2W2Cl2O8_129_4055.vasp,Co2W2Cl2O8,-4.451182626428571,0.1497434637499926 -In2P2_129_8523.vasp,In2P2,-2.14299813,-0.49109047 -Zn1Ni1Cl2_8_20977.vasp,Zn1Ni1Cl2,0.0911745075,1.93079797359375 -Mn2Te2_47_11309.vasp,Mn2Te2,-1.53139448,0.3148432106896552 -Cu2P2S4_26_5210.vasp,Cu2P2S4,-2.334041125,0.2034531407161435 -Ag1H4C6N6O2_6_75.vasp,Ag1H4C6N6O2,-5.68276848631579,0.1872169057748455 -Bi1Se2_164_2396.vasp,Bi1Se2,-1.7555100966666668,0.3860810872222198 -Ca3Pb3I14_6_3198.vasp,Ca3Pb3I14,-0.7109736805,0.1478018865374983 -Hf2O6_59_7550.vasp,Hf2O6,-6.4560151075,0.2238962653125 -Mo4Pb4Se4O24_2_11757.vasp,Mo4Pb4Se4O24,-4.343431219444444,0.0503826994444454 -Mo1I2_115_11516.vasp,Mo1I2,-0.5641821366666667,0.770622523888889 -Zr2Tl4Pb2S8_13_21728.vasp,Zr2Tl4Pb2S8,-2.797837755625,0.1639881524999999 -Nb2Te4I4_12_12922.vasp,Nb2Te4I4,-1.938718049,0.0984036972000005 -Mn1Br2_164_10657.vasp,Mn1Br2,-1.2516780566666668,0.0309893341666667 -Nb4Ge2Te8_55_13080.vasp,Nb4Ge2Te8,-3.395209858571429,0.0696950196428565 -Bi2Te2F2_59_2558.vasp,Bi2Te2F2,-1.82042463,0.3815746069444424 -Te1Pb2S1Br1_1_18323.vasp,Te1Pb2S1Br1,-1.559502952,-0.7870472303333332 -Nb4O4F12_2_13118.vasp,Nb4O4F12,-4.8324534835,0.0227521975 -Hf1O2_187_7253.vasp,Hf1O2,-6.899087043333334,0.8884068549999995 -Mo1Pb1S4_3_11537.vasp,Mo1Pb1S4,-2.709252858333333,-0.1655016009375016 -Te1Pd1S1I1_8_18326.vasp,Te1Pd1S1I1,-1.0841005625,0.2463344386875 -Zr1As2S6F2_164_21246.vasp,Zr1As2S6F2,-2.8859823418181816,0.9032280887784018 -Ge2P2S6_147_6810.vasp,Ge2P2S6,-3.262315785,0.0377051464843686 -Co2As4S6Cl4_4_3855.vasp,Co2As4S6Cl4,-2.303770860625,0.4252915825274067 -Tl1Ag1As2Se6_149_19200.vasp,Tl1Ag1As2Se6,-1.663673424,0.856299434124995 -Cu4H4S4Br4_14_5414.vasp,Cu4H4S4Br4,-1.48495768125,0.100690670099204 -Cd1H4N6F2_1_3359.vasp,Cd1H4N6F2,-4.135337899230769,-0.0316748988461581 -Tb2F6_59_18194.vasp,Tb2F6,-4.4893878475,0.2373022212500002 -Mg2Sb4O8_2_10508.vasp,Mg2Sb4O8,-4.241177535714286,0.0988181585714285 -Co1H8C4S4N2_10_3772.vasp,Co1H8C4S4N2,-4.590591207368421,0.2204560545065648 -Pt2Cl4O12_14_14613.vasp,Pt2Cl4O12,-2.295593736111111,0.4108263245833288 -Cu4C4O12_14_5401.vasp,Cu4C4O12,-4.3611765115,0.3443962197499975 -Na2H6N10O2_51_12123.vasp,Na2H6N10O2,-4.8492141195,-1.4149202187500016 -K2Mn2H8Cl6O4_2_9240.vasp,K2Mn2H8Cl6O4,-3.0667204918181814,0.0147553903787857 -Zn2Sn3O8_10_21173.vasp,Zn2Sn3O8,-3.5112302023076927,0.2092509988461509 -In1Ag1Sb2O6_149_8182.vasp,In1Ag1Sb2O6,-3.119249569,0.7160268571249968 -Tl1In1Au2Se4I3Br1_6_19292.vasp,Tl1In1Au2Se4I3Br1,-0.5678133516666667,0.31185598472222 -K1Ga1I4O12_2_8900.vasp,K1Ga1I4O12,-2.7950750927777777,0.1306196147916644 -K2Dy2I6_51_9093.vasp,K2Dy2I6,-1.047972163,-0.0106064001111131 -Fe2Sb2S4I2_26_5956.vasp,Fe2Sb2S4I2,-1.969561218,-0.3565042092000018 -Mg3Sb3_25_10560.vasp,Mg3Sb3,-1.066215575,0.4148736106249982 -Na1W2S2Br6_47_11954.vasp,Na1W2S2Br6,-2.112397349090909,0.1058809326893892 -P6Pd3_147_14141.vasp,P6Pd3,-2.716226417777777,0.7723359472222224 -Hf1Zr1N1Cl2O2_1_7385.vasp,Hf1Zr1N1Cl2O2,-5.437181228571428,0.464362497023798 -As1Pd2S2_187_1164.vasp,As1Pd2S2,-2.109041668,0.4141525995000003 -V1I4_123_19870.vasp,V1I4,-0.4172390339999999,0.3474909823750005 -In2Co2Se5_156_8415.vasp,In2Co2Se5,-1.936096745555556,0.1232031432592549 -Ge2Sb2Cl2O6_7_6842.vasp,Ge2Sb2Cl2O6,-3.652686895833333,0.3552825240277775 -Sn4S4_53_16960.vasp,Sn4S4,-2.107301995,0.35652822625 -In1Au1Se1S1Cl2_1_8200.vasp,In1Au1Se1S1Cl2,-1.1248318833333333,0.3097721920312463 -Bi2Se2I2_59_2543.vasp,Bi2Se2I2,-1.292755723333333,0.0969266783333333 -W1Br1Cl1_25_20417.vasp,W1Br1Cl1,-1.9767246166666668,0.8359600430555516 -Bi1Pd1Br2_1_2356.vasp,Bi1Pd1Br2,-0.7130026475,0.3167590754166657 -Mn2I2O1_8_11110.vasp,Mn2I2O1,-1.8852069,0.2357747361379294 -Na4Sb4S8_14_12416.vasp,Na4Sb4S8,-2.60010135625,0.0669820837499997 -Na2Hg4Se2S6Br6_31_12166.vasp,Na2Hg4Se2S6Br6,-0.7540059805,0.0896538075624979 -La2P4H16C4O12_13_9604.vasp,La2P4H16C4O12,-5.060936193947368,0.1961028639210434 -Nb3Br2N1O1_1_12953.vasp,Nb3Br2N1O1,-4.9958089871428575,0.5304089847618991 -Bi1Pt2_164_2361.vasp,Bi1Pt2,-0.7196194666666668,1.4481263016666648 -Ga2Pd1S4_164_6433.vasp,Ga2Pd1S4,-2.590758545714286,0.0986486157142834 -Sn2Se4_12_16886.vasp,Sn2Se4,-1.732739305,0.4133328416666666 -W3Se1Br1Cl4_1_20573.vasp,W3Se1Br1Cl4,-2.24910456,0.7737979232407347 -Rb2H6C2O8_1_14849.vasp,Rb2H6C2O8,-3.3215940866666664,1.3980735189814777 -Nb6In4Cl18_12_13193.vasp,Nb6In4Cl18,-2.715407479642857,0.0526990293080338 -As12O24_1_1121.vasp,As12O24,-4.311135901388889,0.1300672840277692 -Cr1Cu1Te1Br1_8_4160.vasp,Cr1Cu1Te1Br1,-1.061235465,0.4837242267708296 -Al4N4_127_1076.vasp,Al4N4,-5.407033445,0.9268314550000004 -Al1Pt2_187_713.vasp,Al1Pt2,-2.2733764366666667,0.32346071625 -W2I10_6_20497.vasp,W2I10,-0.5512415058333333,0.3102343776388881 -Ho1P2_21_8117.vasp,Ho1P2,-3.1709793666666664,0.9963170249999964 -Ag1Pb1Se1I1_1_99.vasp,Ag1Pb1Se1I1,-0.58672286,0.2145225592187499 -Ta1Ge1S2_1_17549.vasp,Ta1Ge1S2,-4.38103452,0.1538682570833298 -Ce2Br2O2_129_3665.vasp,Ce2Br2O2,-4.751546076666666,0.0715572933333339 -Y7Br10_2_20847.vasp,Y7Br10,-3.097969146470588,0.1006392934313686 -Ta3N2Cl2_187_17967.vasp,Ta3N2Cl2,-6.085222017142857,0.5228216280952349 -Mn1Zn1Fe1O5_1_10940.vasp,Mn1Zn1Fe1O5,-3.31223274875,0.3511945842968718 -Hf2Se2_123_7611.vasp,Hf2Se2,-4.4970785225,0.0701362924999999 -P4Se6_11_14123.vasp,P4Se6,-2.725646447,0.1910996594166646 -Hf1Co1Pt1S1I2_8_7150.vasp,Hf1Co1Pt1S1I2,-2.3107300016666668,0.4546075547222169 -Ag2Te3As4Cl2_6_468.vasp,Ag2Te3As4Cl2,-1.403635569090909,0.2234679893636312 -Sb1Te1F1_156_15510.vasp,Sb1Te1F1,-2.073964913333333,0.3367086455555537 -Ca2Br4O4F8_30_2962.vasp,Ca2Br4O4F8,-1.7083835744444444,0.5836462169444422 -Tl4Ag4Te4O12_29_19586.vasp,Tl4Ag4Te4O12,-2.4907331325,0.0995194364969096 -In1Ir1S4I1Br1_1_8279.vasp,In1Ir1S4I1Br1,-1.98167467125,0.165128246914062 -Bi2F6_31_2458.vasp,Bi2F6,-2.58510169375,0.4102041718749998 -Bi1F5_47_2332.vasp,Bi1F5,-1.6490567133333334,0.2039142166666665 -Ni1Ir2Pd1Se8_1_13371.vasp,Ni1Ir2Pd1Se8,-2.0975979316666664,-0.0880314883333329 -Ga2Sb2Te6_147_6460.vasp,Ga2Sb2Te6,-1.477092367,0.3426332574666648 -Ca2Br4O8_125_2963.vasp,Ca2Br4O8,-2.584025185,0.3127744733928543 -Pt2Se2_164_14684.vasp,Pt2Se2,-1.5545198975,0.6207811549999999 -Cu2Ir1S1I2Br2_1_5180.vasp,Cu2Ir1S1I2Br2,-0.63842842625,0.251374401527773 -Hf4S4Cl4_31_7807.vasp,Hf4S4Cl4,-4.340789815833333,0.1479739893749907 -Ba2Au1I2O2_123_1905.vasp,Ba2Au1I2O2,-2.3001208857142856,0.4861969376339224 -Ca4As4_14_3206.vasp,Ca4As4,-2.05767230125,0.7186909054166666 -Li2Ge1H6S6_147_9923.vasp,Li2Ge1H6S6,-3.1377322986666667,0.1377909618333335 -V2Cl5_1_20037.vasp,V2Cl5,-2.0433755185714286,0.2382400828571405 -W3C2Cl2_187_20556.vasp,W3C2Cl2,-4.955370357142857,0.1182635743650688 -Zn4Cl4O4_14_21215.vasp,Zn4Cl4O4,-1.1641878433333332,0.4294916676041637 -Zr4Cl4O4_7_21817.vasp,Zr4Cl4O4,-4.832035505,0.3490634366666674 -Co1Bi1O3_99_3707.vasp,Co1Bi1O3,-3.002364154,0.4450334535624973 -Mg3Sn1_25_10568.vasp,Mg3Sn1,-0.0676993425,-0.1690722895833333 -K3Sb2N2O6F7_12_9404.vasp,K3Sb2N2O6F7,-3.383743428,-0.0146251931833396 -Pr4Br10_11_14558.vasp,Pr4Br10,-2.440310854285714,0.0993685964285715 -Tl2Te2_164_19549.vasp,Tl2Te2,-0.59997456,0.35268482125 -Ba2Cd1In1Ag1S5_99_1939.vasp,Ba2Cd1In1Ag1S5,-1.764403699,0.490171288535713 -Be2As2O10_4_2238.vasp,Be2As2O10,-4.327732612142857,0.3769047959821374 -Zn4Cl8_115_21216.vasp,Zn4Cl8,-0.5156779058333333,0.0844867156249999 -Ru2S2_6_15346.vasp,Ru2S2,-3.1111063325,0.6494378050000003 -In1Pt5Cl2_123_8321.vasp,In1Pt5Cl2,-1.28256848875,1.2080329608333318 -Li6H2Se2S8_11_10268.vasp,Li6H2Se2S8,-2.8540464188888888,0.0695764277314789 -Ba4Ce2_51_2148.vasp,Ba4Ce2,-0.2619474916666667,0.7596445499999991 -Bi4Pt2_2_2636.vasp,Bi4Pt2,-1.4624084983333334,0.2274448662499999 -Mg2N1_25_10487.vasp,Mg2N1,-2.360081556666666,0.6724065615277768 -In2Co2Te5_164_8419.vasp,In2Co2Te5,-1.3740420455555555,0.1566191222222207 -Li6Te2O8F2_11_10280.vasp,Li6Te2O8F2,-3.6300247522222224,0.2940915474999963 -V1Ag1Te6As2_5_19764.vasp,V1Ag1Te6As2,-1.622259907,0.343105702916665 -Tl1Co5F2_123_19247.vasp,Tl1Co5F2,-0.92440773375,0.908861564687498 -Ba4Y2I14_7_2199.vasp,Ba4Y2I14,-1.5970408985,0.2002829049999985 -Zn2P2O6_147_21130.vasp,Zn2P2O6,-4.028563428,0.3127190271041624 -Bi4Te2Br2O9_99_2649.vasp,Bi4Te2Br2O9,-3.246897082352941,0.1940686411274481 -V1W1Br1N1Cl1O1_8_19950.vasp,V1W1Br1N1Cl1O1,-4.02290408,0.2951706826114852 -P1I5_10_13924.vasp,P1I5,0.0021744866666666,0.4176260049999999 -Ta2As2Se6_8_17650.vasp,Ta2As2Se6,-3.625107533,0.274693927666664 -Nb2Pd1O6_12_12811.vasp,Nb2Pd1O6,-5.718083071111112,-0.0935544797222271 -Ni1N1_187_13377.vasp,Ni1N1,-2.52244374,3.02343157125 -Sr1Ca1Mn1Se1I2_8_17035.vasp,Sr1Ca1Mn1Se1I2,-1.2213398633333334,0.5647471774042123 -Mo2Cl6_162_11601.vasp,Mo2Cl6,-1.79028413625,0.1397983847916646 -Pd1I2_187_14366.vasp,Pd1I2,0.14958177,0.4407907375 -Cu8W4O16_2_5505.vasp,Cu8W4O16,-3.9751242421428574,0.3091805305357078 -Tl2Bi2O6_149_19372.vasp,Tl2Bi2O6,-2.925745081,0.3583346222499999 -Sr3Mn2Br2O5_123_17383.vasp,Sr3Mn2Br2O5,-3.832318095833333,-0.0164933151389007 -W3Se4_12_20574.vasp,W3Se4,-3.375071412857143,0.534395642857137 -Al2C4F14_10_783.vasp,Al2C4F14,-3.5330986315,0.5341048735000002 -Fe2P2I2O4_26_5907.vasp,Fe2P2I2O4,-3.242789693,0.251645418107133 -Tl1Ag1Sb2Se6_149_19207.vasp,Tl1Ag1Sb2Se6,-1.468087381,0.1059549276666646 -Er1Sb2_21_5546.vasp,Er1Sb2,-2.3245094033333333,0.1908869274999975 -Sc4N3O2_164_16251.vasp,Sc4N3O2,-6.370124276666667,-0.0542675944444512 -Si2O2_12_16421.vasp,Si2O2,-4.975922515,0.5790494324999998 -K2C4S6F6_1_9035.vasp,K2C4S6F6,-3.3293939383333333,0.1452208597916576 -Pb2S2_164_14279.vasp,Pb2S2,-2.0833281625,-1.4101947175 -Ga2Te2_164_6509.vasp,Ga2Te2,-1.7879537775,0.1452464383333334 -In1Ga1Se2Br2_1_8259.vasp,In1Ga1Se2Br2,-1.6625959616666668,0.0533829045833333 -Re2I6_162_15054.vasp,Re2I6,-1.3359189925,0.3405327270833334 -Te2N2_2_18416.vasp,Te2N2,-3.0868833825,0.4658848070833336 -Mn2W2Se2O12_113_11346.vasp,Mn2W2Se2O12,-4.548678471666666,0.1832004029166625 -Nb3B2O2_187_12948.vasp,Nb3B2O2,-6.675204244285714,0.3911819969642796 -Ni1Ir1Pd2Cl8_6_13367.vasp,Ni1Ir1Pd2Cl8,-0.9431259525,0.0909697261111067 -Sr1Ta2H2O7_123_17090.vasp,Sr1Ta2H2O7,-6.183858903333333,0.1083518073611111 -Nb1P2_164_12554.vasp,Nb1P2,-4.771784936666667,0.8245496799999996 -Lu2I6_162_10313.vasp,Lu2I6,-1.51595026625,0.0555689825 -Mn2P2Cl2O4_26_11182.vasp,Mn2P2Cl2O4,-3.772118679,0.4024710134259225 -Mn2P2Se4Br2_26_11196.vasp,Mn2P2Se4Br2,-2.2105280350000003,0.0903534641250001 -Pt2S2_6_14667.vasp,Pt2S2,-2.192224805,0.4228563549999999 -Na1In1As2Se6_5_11881.vasp,Na1In1As2Se6,-2.120177048,-0.0117758286666687 -Tl1Si1S3_143_19345.vasp,Tl1Si1S3,-2.500376688,0.5300232646874976 -Tl1Cu1Te6P2_149_19260.vasp,Tl1Cu1Te6P2,-1.423679079,0.3425313609999985 -Co2P2S5_8_3962.vasp,Co2P2S5,-3.011948561111111,0.3491296892361083 -Ta2B1S2_164_17658.vasp,Ta2B1S2,-6.25114514,0.1585939960000004 -Na2Co2As2_129_12058.vasp,Na2Co2As2,-1.942409085,0.1166554733333329 -B3Mo4H2_164_1736.vasp,B3Mo4H2,-4.341572796666666,0.6621498255555518 -Li1In1Cl4O12_2_9729.vasp,Li1In1Cl4O12,-2.661521958333333,0.179492286458331 -Zn1P2Pd1Se6_149_20989.vasp,Zn1P2Pd1Se6,-2.025860348,0.2320255694166641 -Te2Au2I2_59_18368.vasp,Te2Au2I2,0.0709002233333333,0.23932502 -Ta2Te10Pt2_51_17892.vasp,Ta2Te10Pt2,-2.528398712142857,0.0727423778571432 -Tb2Cu2Pb2Se6_51_18192.vasp,Tb2Cu2Pb2Se6,-2.2910479275,0.1914731812500001 -B2Te5_1_1718.vasp,B2Te5,-2.336994541428571,0.5459910842857101 -Mg2Mn2Ge2_129_10476.vasp,Mg2Mn2Ge2,-1.6338626166666668,0.3890887299999996 -Tl2Sb6_164_19523.vasp,Tl2Sb6,-1.23098537625,0.5385336946874999 -Hf1Pd1I1Br4Cl1_1_7267.vasp,Hf1Pd1I1Br4Cl1,-1.73589863875,0.1285448567968752 -Hf1Bi2Se1Br2_6_7122.vasp,Hf1Bi2Se1Br2,-2.1577704816666667,0.2506338908333314 -Ge2Se1S1_6_6863.vasp,Ge2Se1S1,-2.95237503,-0.3766544306249997 -Ru1Rh1I2_1_15282.vasp,Ru1Rh1I2,-0.8308695425,0.8865585037499986 -Cu2Se2Cl2_59_5298.vasp,Cu2Se2Cl2,-0.6915126833333334,0.2572965411507928 -Mo2N1O2_164_11634.vasp,Mo2N1O2,-5.072855906,0.4038062930000006 -Ir1C1Br1F1_8_8729.vasp,Ir1C1Br1F1,-2.8415554375,1.0127993260416628 -Nb2C2F2_59_12669.vasp,Nb2C2F2,-5.849066271666668,0.4431225723333205 -Cr2As2O6_162_4307.vasp,Cr2As2O6,-4.7258829030000005,0.0718170159999993 -Al2Ge2Se6_162_850.vasp,Al2Ge2Se6,-2.804921078,0.0326898491666641 -Mn1Ni1H10C14N6_10_10827.vasp,Mn1Ni1H10C14N6,-5.864398189375,-1.5438112539583346 -Te2Rh1_115_18494.vasp,Te2Rh1,-1.5053283633333334,0.6966901788888886 -Li1Tl1Cl4O12_2_9804.vasp,Li1Tl1Cl4O12,-2.4824638244444444,0.2035117647916644 -B2Au2O2F2_31_1652.vasp,B2Au2O2F2,-2.8307984775,1.6388722513888834 -Te2Rh2_129_18504.vasp,Te2Rh2,-1.885464015,0.3378840270833312 -Cd1Ga2Se4_164_3311.vasp,Cd1Ga2Se4,-1.7571064314285714,0.1577366771428572 -Nb2O3_1_12795.vasp,Nb2O3,-6.109239572,0.6898638690833279 -Mg2Mo3O8_10_10485.vasp,Mg2Mo3O8,-4.693873475384615,0.469111896923077 -Pd1S2_187_14387.vasp,Pd1S2,-1.886233823333333,0.4315783808333335 -Ta1F2_115_17539.vasp,Ta1F2,-4.379761406666667,0.8913793906666627 -Al8Te6_31_1116.vasp,Al8Te6,-2.009170757142857,0.3134712414285694 -Tl2P2O6_149_19479.vasp,Tl2P2O6,-4.350290629,0.3330703102500001 -Bi1Te6P2Au1_143_2412.vasp,Bi1Te6P2Au1,-1.526862687,0.3200691287499944 -K1Eu1Cu2Te4_99_8894.vasp,K1Eu1Cu2Te4,-1.24813633125,-0.000673341562502 -Sn1Se2_187_16696.vasp,Sn1Se2,-1.7545121166666666,0.3915600299999999 -Hf4C3S2F2_164_7776.vasp,Hf4C3S2F2,-5.845195968181818,0.7091354074999952 -Na1C6Br4O2_2_11837.vasp,Na1C6Br4O2,-4.460011046153846,0.2491917023076819 -V1F2_115_19824.vasp,V1F2,-3.11915046,0.1557225244444411 -Sb2Mo2Se6_2_15605.vasp,Sb2Mo2Se6,-2.438884369,0.3274746464999979 -Ge2O2_31_6793.vasp,Ge2O2,-4.435849635,-0.2291315656250003 -Te2Os1Cl12_2_18419.vasp,Te2Os1Cl12,-1.1653766706666666,0.0303475474999989 -Ca2Au1S2Br2_38_2932.vasp,Ca2Au1S2Br2,-1.7013110185714286,0.2565891671428533 -K2Mg1H4Se2O8_2_9218.vasp,K2Mg1H4Se2O8,-3.796113438823529,0.0646805259803886 -Bi2S2_12_2516.vasp,Bi2S2,-1.97409519,-0.6850989433333343 -Al2As2O6_162_761.vasp,Al2As2O6,-5.300605694,0.0345910750000006 -Mn1Sn1Br1Cl1O2_6_10888.vasp,Mn1Sn1Br1Cl1O2,-2.8885690683333336,0.0616580677083329 -Bi12O24_1_2299.vasp,Bi12O24,-3.5095271719444443,0.2580236739930526 -Ca1Te2H2_5_2894.vasp,Ca1Te2H2,-2.14957189,0.7492084853333336 -Rb1Cl1_123_14727.vasp,Rb1Cl1,-1.23589604,0.1794050099999999 -Sb2P2S6_1_15625.vasp,Sb2P2S6,-2.947076059,0.1475455967031251 -Hf1Ge1Cl2_1_7173.vasp,Hf1Ge1Cl2,-3.1317814375,0.5648464240625 -Sc1Au2S1N1F3_1_15902.vasp,Sc1Au2S1N1F3,-2.48333536,0.3311413515624999 -Au1F2_10_1425.vasp,Au1F2,-0.3663466366666666,0.4330921140740733 -Tl2Cl2_129_19391.vasp,Tl2Cl2,-0.839054795,0.0884430149999999 -Rb1Sn1O2_156_14752.vasp,Rb1Sn1O2,-2.8019583075,0.4915993074999956 -Na2Hg4Te2Br6O6_31_12170.vasp,Na2Hg4Te2Br6O6,-1.3040315395,0.2302818888750004 -B4P4_127_1762.vasp,B4P4,-4.69077375375,-0.8399826787500002 -Cu2H8C12S2N4Cl2_28_5139.vasp,Cu2H8C12S2N4Cl2,-5.188448411666667,0.2844377392222168 -W4C3O2_164_20577.vasp,W4C3O2,-6.496064686666667,0.012121192879805 -Zr1Ti3Te8_25_21484.vasp,Zr1Ti3Te8,-3.2865190516666662,0.2386280212500002 -Y4C3S2_164_20816.vasp,Y4C3S2,-5.606339265555556,0.7578888499999943 -Cu2H4C4S8_14_5122.vasp,Cu2H4C4S8,-3.422955811111111,0.3567931534953609 -K2As2O2F8_2_8974.vasp,K2As2O2F8,-2.895626706428572,0.0549706774999996 -Nd1Si5_47_13228.vasp,Nd1Si5,-3.578619295,-0.001835200555559 -Zr3Nb1Br8_65_21776.vasp,Zr3Nb1Br8,-2.3914586166666667,0.4344164858333298 -Co1H4Br2N6_47_3744.vasp,Co1H4Br2N6,-4.036796859230769,-0.0182202963461604 -K2C4O2_31_9032.vasp,K2C4O2,-4.50865615125,1.0299676690625 -Fe2Te4_11_6022.vasp,Fe2Te4,-1.080424615,0.5478273 -Na1Al1Sb2Te6_5_11818.vasp,Na1Al1Sb2Te6,-1.55329628,0.3383439151666649 -Ni1Pd1S4_10_13399.vasp,Ni1Pd1S4,-1.9195000183333333,0.1612113789583316 -Mn3H2C2O2_187_11383.vasp,Mn3H2C2O2,-4.345638847777778,0.6006846755555459 -Ti2B1S2F2_164_18889.vasp,Ti2B1S2F2,-4.327393891428572,0.5748306274999855 -Hf3Se2N2F2_187_7730.vasp,Hf3Se2N2F2,-5.126491715555556,1.0504333919444333 -K2N2O6_1_9247.vasp,K2N2O6,-4.095945807,0.0752373207500003 -Zn2Ga2S5_164_21083.vasp,Zn2Ga2S5,-2.0593587233333333,0.1577821909999981 -Te1As1F1_156_18280.vasp,Te1As1F1,-2.184999523333333,0.2515032602777753 -Hg1Pb2S2F2_12_7901.vasp,Hg1Pb2S2F2,-1.6408309342857144,-0.2385938128571449 -Ta1I1N1Cl1_6_17555.vasp,Ta1I1N1Cl1,-4.1085897125,0.4837684417499979 -K2Fe4Se6_51_9107.vasp,K2Fe4Se6,-1.2812675833333331,0.264044563749998 -Mo2H2C1_164_11612.vasp,Mo2H2C1,-4.03733648,0.8243930842500011 -Ni4S4Br4_14_13756.vasp,Ni4S4Br4,-0.8796261566666667,0.0197289285416648 -Ti2Sb1Te2_164_19010.vasp,Ti2Sb1Te2,-3.915187174,0.2088072700000003 -Bi4O8_2_2629.vasp,Bi4O8,-3.4654864558333336,0.3020643901041633 -Hf1Sc1Se1S1Br2_25_7300.vasp,Hf1Sc1Se1S1Br2,-3.673409965,0.0826388974999959 -Cr1Se1O1_156_4261.vasp,Cr1Se1O1,-3.73246412,0.1711526124621176 -Ti2As2O6_12_18879.vasp,Ti2As2O6,-5.78689275,0.2805781263333307 -Na2Nb2F12_4_12227.vasp,Na2Nb2F12,-3.838831485625,27.791955838125 -Cr1Ga2Te4_164_4179.vasp,Cr1Ga2Te4,-1.79816898,0.132593599968254 -Cr1Mo3Se8_25_4216.vasp,Cr1Mo3Se8,-2.9326463766666664,0.0430349445833337 -Ru6Se8_11_15374.vasp,Ru6Se8,-2.931411752142857,0.4065237799999965 -Tl2Zn3O6_156_19572.vasp,Tl2Zn3O6,-2.252769178181818,0.1803293770454523 -Sb2Te2_129_15727.vasp,Sb2Te2,-1.5748638975,0.3443186762499979 -Li1Ga1As2O6_5_9704.vasp,Li1Ga1As2O6,-4.1805040490000005,0.3543244277499951 -Nb4Mo2O16_13_13092.vasp,Nb4Mo2O16,-6.078284276818182,0.0555609438068076 -Li2B2H8S8_2_9837.vasp,Li2B2H8S8,-3.525555342,0.0241019557500006 -Co1H4C8Br2_25_3764.vasp,Co1H4C8Br2,-5.07272034,0.4206429273333262 -Na1Mo2I6O2_47_11901.vasp,Na1Mo2I6O2,-1.8289703945454543,-0.0057245304166708 -Si1Mo1O4_111_16347.vasp,Si1Mo1O4,-5.417192431666667,0.4437165808333327 -As2Pt3Se8_164_1282.vasp,As2Pt3Se8,-2.0732675392307693,0.3404886426538438 -Zr2Pd1Se2S2Br3Cl1_1_21633.vasp,Zr2Pd1Se2S2Br3Cl1,-2.6193055845454545,0.2733263406818125 -Pd1O1_123_14372.vasp,Pd1O1,-2.02209706,0.6178519974999999 -Ca1Nb2S7_123_2861.vasp,Ca1Nb2S7,-3.746250448,0.4000875509999972 -Nb4O10_59_13115.vasp,Nb4O10,-6.658067861428571,-0.1908928566071452 -Nb1Br1Cl1_156_12477.vasp,Nb1Br1Cl1,-2.92034658,0.2890207909821385 -Mn1Ag1S1I1Br1F1_1_10614.vasp,Mn1Ag1S1I1Br1F1,-1.1197470033333332,0.2237456576041652 -As1Au1Br1Cl1O2_1_1132.vasp,As1Au1Br1Cl1O2,-1.9401599033333328,0.2514689881944385 -Na1C1N1_25_11833.vasp,Na1C1N1,-5.192318903333333,0.3930348116666606 -Ga1Ru1Se1I1_156_6257.vasp,Ga1Ru1Se1I1,-1.8603846875,0.378339976249997 -Sc2P2S8_2_16120.vasp,Sc2P2S8,-3.767101866666666,0.0613379070833302 -Sb2Br2O2_129_15549.vasp,Sb2Br2O2,-2.893764215,0.0137152276666654 -Ca2B4H16O16_2_2946.vasp,Ca2B4H16O16,-5.013765822631579,0.0667554356578845 -Nb6Ge2S12_26_13190.vasp,Nb6Ge2S12,-4.6637214005,-0.0112895685000005 -Cd2Si1O4_21_3577.vasp,Cd2Si1O4,-3.136337414285714,0.5798466996428573 -Mo2N1F2_164_11633.vasp,Mo2N1F2,-3.934598372,0.0927444776666619 -Sc1I2_115_15947.vasp,Sc1I2,-1.2915337833333334,0.4536949938888871 -Ta13Se26_2_17502.vasp,Ta13Se26,-4.568697582820513,0.1263815588461536 -Sc1Ag1As2S6_149_15886.vasp,Sc1Ag1As2S6,-2.8198416550000003,0.3031368904374973 -Sc1S2_164_15989.vasp,Sc1S2,-3.7883380066666663,0.4700056769791638 -Fe2Pb6F18_2_5926.vasp,Fe2Pb6F18,-2.543844721153846,0.0460513044230748 -V3S4_164_20289.vasp,V3S4,-3.913736792857143,-0.8130537264285715 -Zn2Sn2O6_162_21171.vasp,Zn2Sn2O6,-3.313954843,0.2143049300000006 -Ti1V3Se2Br4N2_1_18869.vasp,Ti1V3Se2Br4N2,-3.694591648333333,0.1035361112499968 -Ni2Sb2S6_162_13612.vasp,Ni2Sb2S6,-1.953441889,0.292932545312498 -Li1Fe2C2O7_1_9700.vasp,Li1Fe2C2O7,-4.861300748333334,0.3370922779687445 -Cr2Au1O6_1_4316.vasp,Cr2Au1O6,-4.010305486666667,-0.1658319904861189 -Ag1Sb1P2Se6_143_119.vasp,Ag1Sb1P2Se6,-2.200066084,0.0789798669374985 -Sr2Tl1Cd1Cu1O5_99_17335.vasp,Sr2Tl1Cd1Cu1O5,-2.6529801280000003,0.2501373327916625 -Li1Sb2Pd1S6_149_9783.vasp,Li1Sb2Pd1S6,-2.36319154,0.3641443847187477 -Ga2Hg1S4_164_6383.vasp,Ga2Hg1S4,-2.057513947142857,0.1891202171428569 -Pb1Br2O1_1_14171.vasp,Pb1Br2O1,-1.399729345,0.3350046115625003 -Fe1O1F3_25_5728.vasp,Fe1O1F3,-2.023331778,0.1070935752499999 -Tc1I2_164_18220.vasp,Tc1I2,-2.1279785833333333,0.4238712194444421 -Zr2I8_1_21600.vasp,Zr2I8,-1.390207959,0.0933437833333332 -Ga8Te6_31_6594.vasp,Ga8Te6,-1.6752713235714285,0.138171572857142 -Cr2N2F2_59_4427.vasp,Cr2N2F2,-4.403250058333334,0.1526439155555512 -Hf1Te4Cl6_2_7327.vasp,Hf1Te4Cl6,-1.9696832681818184,0.1925301652462099 -Hf2Ge2S8_31_7496.vasp,Hf2Ge2S8,-4.1512878325,0.1483533163541661 -Cu2I4Cl2_1_5175.vasp,Cu2I4Cl2,0.11259210375,0.151380644322917 -Zr2I2_164_21591.vasp,Zr2I2,-2.37980013,0.1522498875000002 -Mg1Mn1Cu1S2Cl3_1_10385.vasp,Mg1Mn1Cu1S2Cl3,-1.70833771625,0.29583296090625 -V1Te2_10_19940.vasp,V1Te2,-1.8442646333333328,0.5229764244444444 -Al1Sb2Te6Au1_149_731.vasp,Al1Sb2Te6Au1,-1.3322701179999998,0.2149249071249999 -Rb4Hg2Cl8_11_14972.vasp,Rb4Hg2Cl8,-0.6447487807142858,0.173622795 -Ca2Sm2Cu2Cl2O6_129_3125.vasp,Ca2Sm2Cu2Cl2O6,-4.085324096428571,0.0717023979464241 -Ag2Te3As4F2_6_469.vasp,Ag2Te3As4F2,-1.5548020090909092,0.3452097942424205 -Te1C1_156_18291.vasp,Te1C1,-2.88534314,1.9587124433333332 -W8O18_1_20596.vasp,W8O18,-5.650746936538462,0.5881140858948136 -Ni4Cl8_14_13744.vasp,Ni4Cl8,-0.5818772991666666,-0.2723819724999999 -Co1H2S2_164_3741.vasp,Co1H2S2,-2.855036432,0.1802796609166645 -Ti2Br2N2_59_18898.vasp,Ti2Br2N2,-5.687751211666666,-0.343297412291669 -V4S12_2_20357.vasp,V4S12,-3.47452818,0.0393155646874965 -In1Bi1I2_1_8208.vasp,In1Bi1I2,-0.4964988625,0.2435291970833328 -Ge1H2_115_6670.vasp,Ge1H2,-2.7037971400000003,1.2377012249999964 -Co2Te2_25_4041.vasp,Co2Te2,-1.4549534425,0.1968488108333335 -Fe2Mo2Br2O8_129_5869.vasp,Fe2Mo2Br2O8,-3.771275441428571,0.179287810952379 -Sb2Se1S2_164_15689.vasp,Sb2Se1S2,-2.549566198,0.1066358253333312 -Pd2S4Cl2_11_14474.vasp,Pd2S4Cl2,-1.73698554,0.1400529743749998 -Mn2P2S4F2_26_11192.vasp,Mn2P2S4F2,-3.004243853,0.4618273080277741 -Cu1O2_47_4927.vasp,Cu1O2,-1.503699473333333,1.2638807908333312 -Hf1Zr3S4I4_25_7419.vasp,Hf1Zr3S4I4,-3.580439125,0.0100488689583243 -Ti3B2H2O2_187_19059.vasp,Ti3B2H2O2,-5.918926975555555,0.3829617499999949 -Li1In1I4O12_2_9730.vasp,Li1In1I4O12,-2.9170815405555555,0.0721151866666667 -Na2Cd4S2O6F6_31_12028.vasp,Na2Cd4S2O6F6,-2.374752461,0.2038284833124991 -Zn4Sn4O8_1_21231.vasp,Zn4Sn4O8,-2.700686559375,0.2993303587500002 -Hf2N1_164_7540.vasp,Hf2N1,-6.63028743,1.543300019999999 -Na1Te6As2Pd1_5_11940.vasp,Na1Te6As2Pd1,-1.566328831,0.2624323836999979 -Re2Se2_187_15082.vasp,Re2Se2,-4.49886712,0.5474580937500004 -Sc2Br2_164_16042.vasp,Sc2Br2,-2.3487245925,0.1161131666666641 -Ta2I2O4_11_17757.vasp,Ta2I2O4,-5.64332224625,-0.45742607625 -Y2F4_11_20729.vasp,Y2F4,-4.6504395233333335,0.4432506838888835 -Ta4Te12_11_18126.vasp,Ta4Te12,-3.104943378125,0.0680660148958296 -Lu2Te5O13_1_10319.vasp,Lu2Te5O13,-4.345936244,0.1716520365000002 -Mn1Zn1Pd1Br2O3_8_10943.vasp,Mn1Zn1Pd1Br2O3,-2.12439348125,0.1394853735416644 -Ni1I2_115_13362.vasp,Ni1I2,0.59147206,0.1621611633333332 -Li1Fe1O2_156_9695.vasp,Li1Fe1O2,-3.635298455,0.4250079675 -Ga1P2Au1O6_149_6230.vasp,Ga1P2Au1O6,-4.265301212,0.6778272907999998 -Cd1In2Se4_164_3377.vasp,Cd1In2Se4,-1.4840044142857145,-0.3071389200000001 -Ti1F2_115_18775.vasp,Ti1F2,-4.327796536666667,-0.0430033811111153 -As2S2I2_2_1290.vasp,As2S2I2,-1.944054605,0.0755751608333332 -H2W4N3O2_164_7043.vasp,H2W4N3O2,-5.675752384545454,-1.072566053350858 -Ga1Ru1I2O2_6_6256.vasp,Ga1Ru1I2O2,-2.51843159,0.3506315784722194 -Te2Au4O12_14_18375.vasp,Te2Au4O12,-2.474948066111111,0.1702008884722197 -B13Sb2_164_1609.vasp,B13Sb2,-4.778810551333334,0.865185650222217 -Cu2Se4_14_5313.vasp,Cu2Se4,-0.99657845,-0.780488395 -Mo4S8_156_11760.vasp,Mo4S8,-3.543354903333333,0.2227637150000005 -Hf2Se1S1I4_8_7600.vasp,Hf2Se1S1I4,-2.88589822375,0.1415501752083332 -Cd2W2O8_13_3604.vasp,Cd2W2O8,-4.584934674166667,0.1499676958333324 -Cd1Te2F2_1_3437.vasp,Cd1Te2F2,-0.983684724,0.3344087866666668 -Zn2Bi4O6F4_31_21046.vasp,Zn2Bi4O6F4,-2.85142452875,0.145129736875 -Cu1W1Br2N2Cl2_8_4999.vasp,Cu1W1Br2N2Cl2,-2.38666110875,0.4052045242013835 -In2Si2Te6_162_8606.vasp,In2Si2Te6,-1.941382195,0.0721202640000002 -Sc4C3F2_164_16230.vasp,Sc4C3F2,-5.196790873333333,0.1875934596774147 -Tm2H4Cl2O4_11_19679.vasp,Tm2H4Cl2O4,-4.664419545,0.0959620249999995 -Mg3Si2H4O9_157_10563.vasp,Mg3Si2H4O9,-5.149249923888889,0.0515470163888887 -Ga4Te6_8_6580.vasp,Ga4Te6,-1.590540541,0.2194834442 -Zr1Bi1Sb1_156_21256.vasp,Zr1Bi1Sb1,-2.68877703,0.1367109333333305 -K2Ta2Ag4Se8_28_9357.vasp,K2Ta2Ag4Se8,-2.05689349875,0.1580977762499978 -Ge1O2_187_6685.vasp,Ge1O2,-4.250369233333333,0.6342629841666669 -Li2Co2Si2O8_11_9868.vasp,Li2Co2Si2O8,-5.0432062,0.1112072399999943 -Ta2S2Cl4_25_17846.vasp,Ta2S2Cl4,-3.6219892675,0.2457319668750002 -Cd1Au1Se1S1Br1Cl1_1_3271.vasp,Cd1Au1Se1S1Br1Cl1,-0.2886984266666667,0.4790586892708314 -Ir2Se2_6_8845.vasp,Ir2Se2,-2.4932473475,0.5743724443750002 -Zr3B2Cl2_187_21733.vasp,Zr3B2Cl2,-4.672682277142857,-0.1233918928571469 -P4W2O16_11_14128.vasp,P4W2O16,-5.770813430909091,0.0205659638636355 -Zr1Br4_123_21272.vasp,Zr1Br4,-1.953150688,0.2725025950000004 -Tl2In2Se6_31_19450.vasp,Tl2In2Se6,-1.565892351,0.2696128326666644 -Bi2S2Br2_59_2510.vasp,Bi2S2Br2,-1.7738380366666666,0.06484131 -Hf4C3_164_7778.vasp,Hf4C3,-7.352921981428572,0.3514372545714216 -Tl1O2F2_164_19310.vasp,Tl1O2F2,-1.5205986660000002,0.8945423665000001 -V8Zn2O18_85_20401.vasp,V8Zn2O18,-4.973684516428572,0.2077217910714273 -Zn2As4O8_4_21033.vasp,Zn2As4O8,-3.824424372857143,0.041466056071429 -V1W1I1Br1N2_25_19953.vasp,V1W1I1Br1N2,-4.311115516666667,0.154775199043205 -Tl1S1Br2_1_19329.vasp,Tl1S1Br2,-0.80471588,0.27579560515625 -Co1O2_164_3805.vasp,Co1O2,-3.7250249833333338,-0.627858551250003 -Ge6Sb2_191_6968.vasp,Ge6Sb2,-2.0764539225,0.1241695643750001 -Cu3Sb1O4_156_5383.vasp,Cu3Sb1O4,-2.1797748275,0.9247230342187496 -In1Co5F2_123_8221.vasp,In1Co5F2,-1.20779629125,0.7806789224999999 -Co1Se1Br1_156_3820.vasp,Co1Se1Br1,-1.6544727333333331,0.0986284433333337 -Ni1Te5Ir2Ru1Se3_1_13438.vasp,Ni1Te5Ir2Ru1Se3,-2.0112039608333334,0.2889475087499975 -Hf1Sb2H2S6_164_7288.vasp,Hf1Sb2H2S6,-3.0101357345454547,0.6299431979545382 -Zr1Fe1F6_5_21289.vasp,Zr1Fe1F6,-3.71532679625,0.13454833125 -V2Te2H4S10_2_20207.vasp,V2Te2H4S10,-2.8907725516666667,0.2329240118518492 -Ca2Sb4O8_2_3119.vasp,Ca2Sb4O8,-4.259046817857143,0.0585881452857104 -Hf2Br2N3_8_7446.vasp,Hf2Br2N3,-5.5370761971428575,0.3976115689285668 -Mn1Co1O4_10_10670.vasp,Mn1Co1O4,-4.035786548333333,-0.2547984681250033 -Y4H2C3_164_20823.vasp,Y4H2C3,-5.551049703333334,0.1969765699999885 -Li6Se2O8F2_11_10275.vasp,Li6Se2O8F2,-3.641452692777778,0.2368810909259222 -V3H2N2_187_20267.vasp,V3H2N2,-5.012722744285715,0.0978718828571376 -As1Br1O1_156_1135.vasp,As1Br1O1,-2.628229146666667,0.3833022699999966 -Zn1P1_8_20988.vasp,Zn1P1,-0.46345671,0.8362073334374978 -Ag2Te4W1_111_483.vasp,Ag2Te4W1,-1.2227215428571427,0.2865961180952352 -Ti1Mo3S6Br2_1_18805.vasp,Ti1Mo3S6Br2,-3.3912597725,0.2455299197916576 -In2Se5_1_8600.vasp,In2Se5,-1.8809286414285715,0.1958691066666644 -Nb4B3O2_164_13037.vasp,Nb4B3O2,-6.721549321111111,0.3583162593055506 -In3S1I1Br1_1_8654.vasp,In3S1I1Br1,-1.2056028783333332,0.3278862249999988 -Sc2O2F2_59_16111.vasp,Sc2O2F2,-5.58169301,0.0617794300000005 -Mg3P2O16_10_10556.vasp,Mg3P2O16,-4.292554099047619,0.3041348190476163 -Ca2P1_164_3082.vasp,Ca2P1,-1.6998429933333332,0.5398486849999988 -Te2Mo2C1_12_18405.vasp,Te2Mo2C1,-3.5755486920000004,0.0182161419999995 -Na2O2F2_11_12241.vasp,Na2O2F2,-2.211054355,0.3727864304166643 -In2Sb4S8Br2_11_8570.vasp,In2Sb4S8Br2,-2.336876378125,0.1314699749999999 -Sn1I3_99_16652.vasp,Sn1I3,-0.1795519625,0.252072733854166 -Al2Zn2O5_156_1038.vasp,Al2Zn2O5,-4.110100155555555,0.2706235111111067 -Zr2I1Br1N1_156_21584.vasp,Zr2I1Br1N1,-4.237807188,0.0679358924999966 -Cs2Lu1Br6_164_4753.vasp,Cs2Lu1Br6,-1.4354425199999998,0.0983678468055542 -Hf3Br2O5_1_7691.vasp,Hf3Br2O5,-6.198665051,0.2844516577500009 -Fe2O2_6_5894.vasp,Fe2O2,-2.676967075,0.8687582635416646 -Ir2Cl6_191_8780.vasp,Ir2Cl6,-1.03238380875,0.651663495 -B2I6_26_1675.vasp,B2I6,-1.12599409875,0.105291515 -Te2P1_187_18435.vasp,Te2P1,-1.8632476166666667,0.5332748827777758 -Cr1P2Au1Se6_5_4229.vasp,Cr1P2Au1Se6,-2.267703052,0.0979601544374983 -Co2C4_12_3886.vasp,Co2C4,-4.591316175,1.377867128333328 -Ni1H2S2_164_13326.vasp,Ni1H2S2,-2.306281676,0.2042247048333317 -Rb2B2H6S8_4_14772.vasp,Rb2B2H6S8,-3.005843977777777,0.3097417197222192 -W2C2Br2_59_20475.vasp,W2C2Br2,-4.66442018,0.1903641580555484 -Ta2Ni4Se6_11_17803.vasp,Ta2Ni4Se6,-2.5040975241666668,0.0788342408333333 -Cr2I8_1_4417.vasp,Cr2I8,-0.376472672,0.0709630123750003 -Ta3Te1Cl7_156_17996.vasp,Ta3Te1Cl7,-3.4296202000000005,-0.0432353389204633 -Sr3Au2I2O4_123_17351.vasp,Sr3Au2I2O4,-2.4310767736363634,0.1919114293181784 -Te4P2Pb1_164_18606.vasp,Te4P2Pb1,-1.9809448328571428,-0.1686855628571463 -Cu1Cl2_187_4870.vasp,Cu1Cl2,-0.1641576066666666,0.3249974966666666 -Nb2Se2N1_164_12874.vasp,Nb2Se2N1,-5.618766848,-0.0650776674999993 -K4Cd1As2_164_9423.vasp,K4Cd1As2,-0.2335467042857142,0.0968148157142856 -Hf3H2C2O2_187_7704.vasp,Hf3H2C2O2,-6.5443817088888885,0.3768991810493767 -Zn1N1F2_1_20975.vasp,Zn1N1F2,-1.7561912,0.8247805887500002 -Ba2Sn4H4O8_4_2062.vasp,Ba2Sn4H4O8,-4.066551559444445,0.0624401288888876 -Ni1Cl2O8_147_13310.vasp,Ni1Cl2O8,-2.2239369645454548,0.3020445218181811 -Ca3Mn2S5Br2_123_3187.vasp,Ca3Mn2S5Br2,-2.507286340833333,0.2235881999999969 -Ge4H4O10_1_6930.vasp,Ge4H4O10,-4.59677194888889,0.0950532667592543 -Nb1Cu1Te1Br1_156_12502.vasp,Nb1Cu1Te1Br1,-1.862199075,0.5802888465178532 -Na2Mg4H6S4O16_2_12206.vasp,Na2Mg4H6S4O16,-4.3192208803125,0.0664155785676967 -Al2Hg1S4_164_872.vasp,Al2Hg1S4,-2.566708415714285,0.2058909757142859 -As4Se2S12_18_1369.vasp,As4Se2S12,-2.360819334444445,0.723527064884256 -Cr1C4S6Cl1F4_1_4136.vasp,Cr1C4S6Cl1F4,-3.435820531875,0.495935710117187 -P10Se10_26_13901.vasp,P10Se10,-2.7558900585,0.3130454361875001 -Zr2P2S6_2_21627.vasp,Zr2P2S6,-4.062374908000001,0.2176779923749956 -Hf1Bi2_164_7123.vasp,Hf1Bi2,-2.851343333333333,0.2304304283333333 -Nb2S2Cl4_25_12837.vasp,Nb2S2Cl4,-3.31897333125,0.2368323197727224 -Hf2I1Br3_6_7509.vasp,Hf2I1Br3,-2.8291031266666664,0.22381403259259 -Ba1Ta1Cu1O5_99_1863.vasp,Ba1Ta1Cu1O5,-4.938523725,0.4271470603385356 -Cu1W1I5Br1_1_5000.vasp,Cu1W1I5Br1,-0.4854404475,0.2281131541362847 -Cu2Hg2Se2Br2_26_5158.vasp,Cu2Hg2Se2Br2,0.04570293,-0.0977041253472215 -Si3O6_5_16473.vasp,Si3O6,-6.267776266666667,0.1421366466666658 -As2Br2_2_1192.vasp,As2Br2,-1.730158185,0.1198358166666648 -Ru2S2_67_15345.vasp,Ru2S2,-2.4869443275,1.27359981 -Ag2As2O6_2_155.vasp,Ag2As2O6,-2.900819036,0.467726227 -Nb6S18_11_13195.vasp,Nb6S18,-4.389574911666666,-0.0170646580729161 -Mn4Br10_13_11424.vasp,Mn4Br10,-0.9630293342857142,0.2200272939285703 -In1H2O2_164_8269.vasp,In1H2O2,-3.73828503,0.2775693761666669 -Nb1Cl1F1_156_12486.vasp,Nb1Cl1F1,-3.66436751,0.3894063286904725 -Cr2Cu2As4S12_13_4364.vasp,Cr2Cu2As4S12,-2.5720753875,0.4826518047291645 -Er4Te10O26_2_5579.vasp,Er4Te10O26,-4.4355686475,0.0751966797500003 -Mn1V1Se2I1Br1_6_10926.vasp,Mn1V1Se2I1Br1,-2.092889138333333,-0.0169524768750007 -Ta2Cl8_1_17699.vasp,Ta2Cl8,-2.877392788,0.0781006920000004 -Ca2Cl2_129_2979.vasp,Ca2Cl2,-1.049228095,0.7809840637500001 -Ag2Sb2Se6_2_404.vasp,Ag2Sb2Se6,-1.321855393,0.0194581093333311 -Zn1F2_1_20925.vasp,Zn1F2,-1.3767733766666668,0.2199388008333331 -Ga2As2_129_6302.vasp,Ga2As2,-2.3928763625,-0.6933188375000001 -Zr1Zn2Se1Cl4_1_21498.vasp,Zr1Zn2Se1Cl4,-1.41850839625,0.2191079834375001 -Co4S8_2_4087.vasp,Co4S8,-2.6781926975,0.3125716266666667 -Ni3Te4_164_13734.vasp,Ni3Te4,-0.6099854514285715,0.0424804671428571 -Pd2Pt1S4Br4_3_14453.vasp,Pd2Pt1S4Br4,-1.3205565209090908,0.2254164721590864 -Al3Ru2_123_1051.vasp,Al3Ru2,-3.451116928,0.365334706 -Ca2As1_164_2921.vasp,Ca2As1,-1.3712026466666665,0.5724818122222206 -Tl2Te2F2_59_19547.vasp,Tl2Te2F2,-1.11816775,0.7077422438888872 -Nb5C2S2I2Cl1O2F1_1_13187.vasp,Nb5C2S2I2Cl1O2F1,-5.078138422666667,0.2293214410495881 -Os2Br2_164_13833.vasp,Os2Br2,-2.1402358625,0.8239950925000001 -In8Te6_31_8722.vasp,In8Te6,-1.1583574157142855,0.3903064757142838 -Ca1V4O10_25_2898.vasp,Ca1V4O10,-5.377407786,0.2068541966666619 -Be2Au2_191_2239.vasp,Be2Au2,-0.2475095125,0.8342181825000001 -Ag1C2S2O6F6_2_41.vasp,Ag1C2S2O6F6,-3.5469490929411767,0.2077688565257237 -Cu1C1O3_6_4866.vasp,Cu1C1O3,-4.331075532,0.3744971992499978 -B4Sb4_127_1767.vasp,B4Sb4,-2.910947,1.3113291854166664 -Mn1Mo1Cl2O2_1_10791.vasp,Mn1Mo1Cl2O2,-3.223385505,0.3304683324999997 -Nb2Cl6_162_12685.vasp,Nb2Cl6,-2.833169375,0.197403528593747 -Li1Ti1S2O1_156_9800.vasp,Li1Ti1S2O1,-4.266762318,0.6705563423333281 -Tb2H2O4_59_18198.vasp,Tb2H2O4,-5.6228941075,0.0945793612500001 -V8S18Br8_129_20400.vasp,V8S18Br8,-2.849053825882353,0.0597642467647054 -Sn2Br2_129_16746.vasp,Sn2Br2,-0.7904569075,-0.5670690899999998 -Pb4Se4_57_14322.vasp,Pb4Se4,-1.66384364625,0.2861204971875 -Cd2Pt4Se6_164_3536.vasp,Cd2Pt4Se6,-1.3424492325,-0.0200710591666679 -Co3Ge1Te2_187_4063.vasp,Co3Ge1Te2,-1.9224297083333333,-0.0414640779166686 -Se6N4_7_16302.vasp,Se6N4,-3.143896142,0.5723352927499965 -Sb4S8_11_15822.vasp,Sb4S8,-2.4034861066666666,0.3694889598958308 -Ta4Te6_12_18132.vasp,Ta4Te6,-4.094463464,0.0836654060000006 -Re2Te6_6_15093.vasp,Re2Te6,-2.5600224475,0.4731701341666666 -Al2N2_129_894.vasp,Al2N2,-5.564341225,0.7695236750000003 -Li2Fe1P2O8_2_9900.vasp,Li2Fe1P2O8,-4.5518973546153845,0.4714740709134527 -Sb4Mo2_2_15779.vasp,Sb4Mo2,-2.4793320016666667,0.2832611511904725 -Ca3Fe2S5Br2_123_3176.vasp,Ca3Fe2S5Br2,-2.332631021666667,-0.053884750416669 -Nb6Tl4Cl18_12_13204.vasp,Nb6Tl4Cl18,-2.6476097103571425,-0.0208712901785727 -Pt2S2I2_59_14656.vasp,Pt2S2I2,-1.4802502583333332,0.1360468589583319 -H2Ru1_187_7026.vasp,H2Ru1,-3.07863294,1.5378555383333294 -As8S8O4_1_1404.vasp,As8S8O4,-3.3760794385,0.4653297044999969 -As6Pb2_164_1385.vasp,As6Pb2,-2.30581113875,0.3589237499999997 -Pd1Pt1S1Br2_1_14377.vasp,Pd1Pt1S1Br2,-1.114086622,0.2748431200000003 -K4Se4O8_13_9512.vasp,K4Se4O8,-3.051033050625,0.1133326981770832 -Fe2Sb2Se4Br2_26_5958.vasp,Fe2Sb2Se4Br2,-1.78453308,0.153518873199998 -Cr8Te24_14_4633.vasp,Cr8Te24,-1.7380992665625,0.1121317767708336 -Cr2B1Te2_164_4326.vasp,Cr2B1Te2,-2.96820963,0.1041116008333336 -Ge1Br2_187_6654.vasp,Ge1Br2,-1.4873023200000002,0.1574697599999999 -Al1In1Hg1Se4_156_678.vasp,Al1In1Hg1Se4,-1.6520853071428572,0.1874307742857144 -Ag2O5_21_345.vasp,Ag2O5,-1.2596839128571429,0.9603020298214264 -Fe1H4I2N6_47_5708.vasp,Fe1H4I2N6,-3.9570694384615375,-0.0658221459615446 -K2Ag2Ge1S4_21_8965.vasp,K2Ag2Ge1S4,-1.6320939155555554,0.159263453092587 -Hf1Sc1I1Cl1O1_8_7295.vasp,Hf1Sc1I1Cl1O1,-3.909315868,0.4510159635757442 -Ag1Bi1P2S6_143_23.vasp,Ag1Bi1P2S6,-2.681910734,0.0775733280000001 -Ta4Fe2S10_59_18037.vasp,Ta4Fe2S10,-4.48716073375,0.0738299775000004 -Mn1Se2_115_10878.vasp,Mn1Se2,-2.0172715,0.2777521133333334 -Zr1S1O1_156_21412.vasp,Zr1S1O1,-5.74690355,0.2440263054166669 -Mn2Se2O8_31_11279.vasp,Mn2Se2O8,-3.875631570833333,0.1335186975 -Te2Pb2_129_18456.vasp,Te2Pb2,-1.092226605,-1.15299378 -Na2Br2_129_11995.vasp,Na2Br2,-1.4955036275,-0.4579449824999999 -H2Ir1_187_6996.vasp,H2Ir1,-3.07385313,1.8803929933333292 -Li2Cu4P2_164_9897.vasp,Li2Cu4P2,-1.40899252375,0.6585386279166645 -Co2W2S8I2_129_4059.vasp,Co2W2S8I2,-2.549959101428571,0.5941577491964254 -Nb2F10_1_12708.vasp,Nb2F10,-3.9770775675,0.0977702991666666 -Nb1Se1O1_156_12574.vasp,Nb1Se1O1,-5.29727476,0.3234148468750009 -Na2As2Pd2_12_11964.vasp,Na2As2Pd2,-1.681818775,0.1093679299999983 -Ag2Br2_164_203.vasp,Ag2Br2,0.1600829225,0.0640567975 -Zr2Hg2_129_21582.vasp,Zr2Hg2,-0.6636778725,-0.0179470724999999 -Ir5S10_1_8870.vasp,Ir5S10,-3.266362010666666,-0.1770070773333336 -Mg1Cu1S1Br1_25_10355.vasp,Mg1Cu1S1Br1,-1.35721103,0.1061873866666666 -Ca2Br2Cl2_129_2959.vasp,Ca2Br2Cl2,-1.953291855,0.1258905458333333 -B2I6_1_1674.vasp,B2I6,-1.1402476225,0.0910379912499999 -Zn1In1Te1I1_1_20965.vasp,Zn1In1Te1I1,-0.2186567425,0.3416490725 -Cr2Cu2Sb4S12_13_4372.vasp,Cr2Cu2Sb4S12,-2.4609126225,0.2360636654791645 -Hg2P2O6_147_7979.vasp,Hg2P2O6,-3.482151967,0.4073172229999973 -In2Fe1Te4_164_8432.vasp,In2Fe1Te4,-1.3732584828571428,0.1159974921428558 -B2_65_1725.vasp,B2,-4.83164901,1.3293362883333335 -Ru1O1F2_47_15275.vasp,Ru1O1F2,-3.197460325,0.0263361549999996 -Sn1F2_115_16628.vasp,Sn1F2,-2.3097149333333333,0.3765642025 -B2P6_164_1696.vasp,B2P6,-4.30919150375,-0.36079797375 -Li2Mg1S10F4_2_9971.vasp,Li2Mg1S10F4,-2.3662371270588234,0.468262382867644 -Zr2I4_11_21595.vasp,Zr2I4,-1.955636478333333,0.0727232033333333 -Tl1Cl2_115_19242.vasp,Tl1Cl2,-0.58773378,0.051474415 -Zr1N1Cl1_156_21333.vasp,Zr1N1Cl1,-5.360999226666666,0.3412592066666668 -Fe2S6_11_5944.vasp,Fe2S6,-2.3761379275,-0.2695722914062499 -Ta4B3F2_164_18002.vasp,Ta4B3F2,-6.472832208888889,0.2324869575555432 -Tl2S2_164_19503.vasp,Tl2S2,-1.33108725,0.2647364310937501 -Tl1P2Au1O6_149_19313.vasp,Tl1P2Au1O6,-3.865555358,0.7459769116249999 -U2Se2O10_11_19724.vasp,U2Se2O10,-5.858817069285714,0.114621735 -Na1Mo2Cl6O2_47_11900.vasp,Na1Mo2Cl6O2,-2.65925949,0.0432976609090909 -Sc2S2Br1Cl1_6_16130.vasp,Sc2S2Br1Cl1,-3.671282311666667,0.0344747966666632 -Bi1Br1O1_156_2318.vasp,Bi1Br1O1,-2.213579466666667,0.5408712483333336 -Te20N8_14_18341.vasp,Te20N8,-2.250785600714285,0.4529901176190438 -Hg4Mo2S8_13_8079.vasp,Hg4Mo2S8,-1.3470534357142856,0.3848336064285695 -Zn2Cu2Si4O12_13_21071.vasp,Zn2Cu2Si4O12,-4.482681449999999,0.3145598752083303 -Sb2Se3_164_15702.vasp,Sb2Se3,-2.294234094,0.0663857359999999 -Sn1As1I5Br1_1_16599.vasp,Sn1As1I5Br1,-0.55108925375,0.0946385214062486 -Cu4Br4O4F4_4_5399.vasp,Cu4Br4O4F4,-0.882519655,0.4939038846875 -Cu2Te4F2_4_5352.vasp,Cu2Te4F2,-1.00433359375,0.280991114375 -W3O9_157_20570.vasp,W3O9,-5.632011828333333,0.2320239747916668 -Ag2Te3P4Cl2_6_472.vasp,Ag2Te3P4Cl2,-1.692180390909091,0.2467147296212093 -Au2O2_187_1500.vasp,Au2O2,-0.6719198925,0.5355280800000001 -Mn2P4O13_5_11204.vasp,Mn2P4O13,-5.266189014736842,0.1446325124999949 -Mg2Ag4O8_51_10417.vasp,Mg2Ag4O8,-2.0552336335714285,0.3218506973214228 -Pt4I8_14_14704.vasp,Pt4I8,-0.3825163574999999,0.1328392275 -Mn2O2F2_59_11173.vasp,Mn2O2F2,-3.60215168,0.0658863283333333 -Ga8S6_31_6590.vasp,Ga8S6,-2.515532332142857,0.0886473749999989 -Ir2Br2_12_8767.vasp,Ir2Br2,-1.202751095,1.3902123683333312 -Mg2Te6P2_162_10527.vasp,Mg2Te6P2,-1.84480139,0.2405320666666653 -Ti3N2Cl2_187_19094.vasp,Ti3N2Cl2,-6.24461974,0.0205573142857078 -Na2Mg1Se2S8F4_2_12197.vasp,Na2Mg1Se2S8F4,-2.108110265882353,0.6403510325980338 -Mn2S2O8_31_11219.vasp,Mn2S2O8,-4.143631970833334,0.2604509933333325 -S2_51_15389.vasp,S2,-2.08420951,0.5336752893750001 -Ni2Cl4O12_14_13496.vasp,Ni2Cl4O12,-2.231613843333333,0.1096604630555537 -Mn1In2Te4_164_10788.vasp,Mn1In2Te4,-1.4300149714285717,0.1224740628571413 -Sc1Ta1Nb1S4Cl3_1_16012.vasp,Sc1Ta1Nb1S4Cl3,-3.975693987,0.2675051755000004 -Ta4Ni2S10_59_18064.vasp,Ta4Ni2S10,-4.377024758125,0.0690921075000003 -Ir1Cl2_164_8732.vasp,Ir1Cl2,-1.2554869266666666,0.8204683322222204 -As1S2_164_1172.vasp,As1S2,-2.751072693333333,0.6181538803124971 -Tm4H12O12_14_19691.vasp,Tm4H12O12,-5.03312165,0.092607735119043 -Co3P2H16O16_10_4066.vasp,Co3P2H16O16,-4.400660391621622,0.0236061485585543 -Ag2P4S12_10_358.vasp,Ag2P4S12,-2.455384902777778,0.2798841234837936 -Li4B1S4_38_10161.vasp,Li4B1S4,-3.307744587777778,0.2641079582986049 -Cu1Ni1Os1S3Br1Cl1_1_4920.vasp,Cu1Ni1Os1S3Br1Cl1,-1.60630217,0.4774526590039063 -Tc3I8_1_18242.vasp,Tc3I8,-1.82266018,0.2045565953030266 -Pb1Cl2_187_14180.vasp,Pb1Cl2,-1.4094302566666668,-0.123477875 -Zr2Si2O8_13_21683.vasp,Zr2Si2O8,-6.63245726,0.250848812500001 -Mn1Ag1Se2_156_10620.vasp,Mn1Ag1Se2,-1.2493897075,0.2910347862500002 -V6O4F10_26_20392.vasp,V6O4F10,-4.113379676999999,-0.1774606353333361 -Sc4B3F2_164_16223.vasp,Sc4B3F2,-4.226000476666666,0.0127989893518497 -Dy2F6_59_5526.vasp,Dy2F6,-4.49000889125,0.1904921375000006 -Tl1As2Au1O6_149_19215.vasp,Tl1As2Au1O6,-3.050395668,0.7789652060000005 -Cu4Re1S4Cl5_1_5439.vasp,Cu4Re1S4Cl5,-1.530199382857143,0.2255072437499974 -Hf4S2N3F2_164_7804.vasp,Hf4S2N3F2,-5.967965541818182,0.7753727607954336 -Ir3Pd1Br1O10_1_8851.vasp,Ir3Pd1Br1O10,-3.287783511333333,0.5265256084999999 -Te2As2Cl2_156_18351.vasp,Te2As2Cl2,-1.684423241666667,0.2285377400000001 -Sr2P1_164_17291.vasp,Sr2P1,-1.5952212866666666,0.4271632024999992 -Ca3Mg3_156_3183.vasp,Ca3Mg3,0.3947494983333333,0.5660175039583333 -Bi2Te4Pb1_164_2574.vasp,Bi2Te4Pb1,-1.4962407885714286,-0.3940643142857147 -Na1Al1Te6P2_5_11820.vasp,Na1Al1Te6P2,-1.959084509,0.0847437654999989 -Ag1Ge1F6_2_57.vasp,Ag1Ge1F6,-2.02007250625,0.0610029737499999 -Li8Ge4N8_14_10284.vasp,Li8Ge4N8,-4.3822456585,0.1593169810000008 -Mo12Br24_127_11480.vasp,Mo12Br24,-1.7897312166666666,0.0732507275 -Nb1O1F2_6_12550.vasp,Nb1O1F2,-5.069072925,0.162457462499995 -Cd1Sb1_8_3421.vasp,Cd1Sb1,0.80157733,0.6982465425 -Te4Ir2_14_18591.vasp,Te4Ir2,-1.6520339083333333,0.7914684516666668 -Te2Pb2_6_18460.vasp,Te2Pb2,-0.9212887475,-0.9820559225 -Na2Ge6P6_26_12089.vasp,Na2Ge6P6,-3.2568239585714283,0.1374444992857149 -Ta2Cl2_129_17691.vasp,Ta2Cl2,-3.71384981,1.46628816125 -Li2H4N2_7_9942.vasp,Li2H4N2,-4.26113015,0.0441583043750002 -Cu1Si1Te3Br1_1_4979.vasp,Cu1Si1Te3Br1,-1.2741926683333331,0.2665695536342561 -V1Ge1S2Cl4_1_19840.vasp,V1Ge1S2Cl4,-2.2618978975,0.1807857059374999 -Ni4Sb4O4_13_13760.vasp,Ni4Sb4O4,-2.0883888466666667,0.2717547919444421 -Hg2Br2_164_7945.vasp,Hg2Br2,1.11458793,0.3238543749999999 -Sc1Sn1Se1S1I1Cl1_1_16007.vasp,Sc1Sn1Se1S1I1Cl1,-2.4584800833333333,0.1683600702777778 -In2Cl6_26_8406.vasp,In2Cl6,-1.31195541625,0.12901002375 -Rb2S6F2_11_14935.vasp,Rb2S6F2,-2.082703993,0.0557086946250005 -Pd2O2_187_14443.vasp,Pd2O2,-1.7996706875,0.84027837 -Hf2Zr2Se8_6_7672.vasp,Hf2Zr2Se8,-4.1209183325,0.288067219583334 -Ti1S2_123_18839.vasp,Ti1S2,-4.629885986666666,0.4994293599999997 -Mo4C3O2_164_11736.vasp,Mo4C3O2,-5.33769561,0.3116532338888838 -As1Pt1_187_1166.vasp,As1Pt1,-1.783255355,1.24527654515625 -Mo3Se4_12_11729.vasp,Mo3Se4,-2.739737334285714,0.6376506728571383 -Ni1S1_156_13411.vasp,Ni1S1,-0.84845554,0.5800054833333317 -Cu2C4O8F4_14_5072.vasp,Cu2C4O8F4,-4.391190516666667,0.1705616388888851 -V1Co1S2Br2_6_19803.vasp,V1Co1S2Br2,-2.332430525,0.1673910316481398 -Au4O4_26_1578.vasp,Au4O4,-1.19965839125,0.0077895812499999 -Nb2Ni2S10_51_12779.vasp,Nb2Ni2S10,-3.218586665714286,-0.2264981886904797 -Li2Mn2F8_51_9995.vasp,Li2Mn2F8,-2.9329226575000003,-0.3163059516666693 -K2Co2As2_12_9082.vasp,K2Co2As2,-1.5094645433333334,0.1168645603333307 -Sn4As4S4_17_16934.vasp,Sn4As4S4,-2.488125275,0.2248230591666637 -Nb2As1Se4S1I6_1_12623.vasp,Nb2As1Se4S1I6,-1.9589295907142856,0.2143554124404683 -Mo2Ir1Cl2O4_8_11630.vasp,Mo2Ir1Cl2O4,-3.76224517,0.4815295173611069 -Ta2Ag1F12_2_17643.vasp,Ta2Ag1F12,-3.630940692666667,0.0230710286666662 -Mn1Mo1N2Cl2_6_10795.vasp,Mn1Mo1N2Cl2,-3.791044696666667,0.1945838383333331 -K2H6Pt1O6_147_9155.vasp,K2H6Pt1O6,-3.695959618,0.0514790146666661 -Hf2C1O2_164_7457.vasp,Hf2C1O2,-7.661565994,0.2132696656666679 -Sb2F6_147_15577.vasp,Sb2F6,-2.72765485875,0.3884785562500004 -Nb1Te2_10_12605.vasp,Nb1Te2,-2.79204124,0.5968791211111109 -Ta1Nb1Te2I1Cl1_6_17578.vasp,Ta1Nb1Te2I1Cl1,-3.09229545,0.2256342272817337 -Cu1C2S2O6F6_2_4867.vasp,Cu1C2S2O6F6,-3.620505094117647,0.1820255142647031 -Nb2B1S2_164_12635.vasp,Nb2B1S2,-5.673924444,0.1565166552000008 -Al2Cd1Te4_164_787.vasp,Al2Cd1Te4,-1.4375386842857143,0.1478466300000001 -Ti2Br2O2_59_18900.vasp,Ti2Br2O2,-5.249165121666667,0.0464351294444398 -Mo2Br4O4_26_11574.vasp,Mo2Br4O4,-3.182094555,-0.001978744 -Li2Co2P2O8_147_9865.vasp,Li2Co2P2O8,-4.655608787857142,0.1402810459523771 -Re2O4_59_15067.vasp,Re2O4,-5.63578123,0.611362655833334 -Ni2N2Cl2_59_13539.vasp,Ni2N2Cl2,-1.9931917833333332,0.9324727541666612 -Bi6Rh2O4_11_2677.vasp,Bi6Rh2O4,-2.6461974825,0.3612129180555526 -Pb2Br6_1_14224.vasp,Pb2Br6,-0.609671145,0.2841555900000002 -Mn2Al2Se5_156_10957.vasp,Mn2Al2Se5,-2.640158873333333,0.0071713113984651 -Ti2Br1N2Cl1_25_18894.vasp,Ti2Br1N2Cl1,-5.8030654366666665,-0.3437168239583443 -In2Se3_156_8590.vasp,In2Se3,-1.596377048,0.3879443779999998 -Rb2Br2_129_14784.vasp,Rb2Br2,-0.9206460875,0.1442461175 -V1S2_164_19918.vasp,V1S2,-3.7597095,-0.0047506666666667 -Sn2Se2_59_16885.vasp,Sn2Se2,-1.882792235,-0.3065138599999999 -Mn2Se6_4_11289.vasp,Mn2Se6,-2.141181335,0.1570835133333333 -V4C3_164_20316.vasp,V4C3,-5.640551690000001,0.3747307161309461 -Pb2Se2_31_14294.vasp,Pb2Se2,-1.8513470325,0.0986171109374998 -Mg2In2Se5_164_10473.vasp,Mg2In2Se5,-2.130041067777778,0.0395616316666664 -K2Pd1C4S4N4_2_9296.vasp,K2Pd1C4S4N4,-4.705321964,0.0079028038888783 -Ti4Mo2N3Cl6_157_19142.vasp,Ti4Mo2N3Cl6,-4.923743182666667,-0.0157487944444483 -Pt2Br2O2_59_14598.vasp,Pt2Br2O2,-1.7873284533333331,0.293643170833328 -Nb4Cl16_12_13050.vasp,Nb4Cl16,-2.646648923,0.0672445175000002 -K4Sm2P4S14_5_9516.vasp,K4Sm2P4S14,-3.2165724408333336,0.0554382520833329 -F1_123_5611.vasp,F1,0.69047118,0.4613829037499999 -Co1Ni1Te2_115_3797.vasp,Co1Ni1Te2,-0.8780511575,0.2660472263888864 -Ni2P2Se6_162_13568.vasp,Ni2P2Se6,-1.905577945,0.2122495608749988 -Sm2I2O2_164_16576.vasp,Sm2I2O2,-4.40766437,0.1339676349999994 -Te8P2Pt3_164_18706.vasp,Te8P2Pt3,-1.710063373846154,0.612577155512815 -Ca2Cu1Se2Br2_38_3002.vasp,Ca2Cu1Se2Br2,-1.5794429142857145,0.1937819323809492 -Ta4B3H2S2_164_18004.vasp,Ta4B3H2S2,-5.940391931818183,0.7208090663636252 -Cu2S2N2Cl2_31_5248.vasp,Cu2S2N2Cl2,-2.10983839375,0.1665413284226178 -Cr2Sb1W1S6I1Br1_1_4477.vasp,Cr2Sb1W1S6I1Br1,-2.9854444566666665,0.1186914245833306 -Pd2S4F2_2_14475.vasp,Pd2S4F2,-2.00451144,0.2010385660156251 -Sr4Te8P4Cl4_14_17484.vasp,Sr4Te8P4Cl4,-2.2200946785,0.1340463075000006 -Co2H12C8O12_14_3903.vasp,Co2H12C8O12,-5.016716165294118,0.1947569824999906 -V2Ag2P4Se12_13_19974.vasp,V2Ag2P4Se12,-2.44407123,0.0701606741958318 -Sr4Mn3Cl2O8_123_17450.vasp,Sr4Mn3Cl2O8,-4.137426781176471,0.0242970017647055 -Sn2Te2_31_16896.vasp,Sn2Te2,-1.436240815,-1.4005128349999998 -Sc2F6_191_16072.vasp,Sc2F6,-4.25233289875,-0.2511621887499995 -K2Hg4Se2Cl6O6_31_9187.vasp,K2Hg4Se2Cl6O6,-1.421533653,0.0896574635000002 -Sb2Pt3O8_164_15663.vasp,Sb2Pt3O8,-3.210057905384616,0.4852768698076883 -Rh2I6_162_15198.vasp,Rh2I6,-0.559927845,0.0567413674999999 -Ag2H8C6I2N2_2_292.vasp,Ag2H8C6I2N2,-4.400301114,0.0829552125000017 -K6In11_150_9537.vasp,K6In11,-0.1194430247058823,0.2257716080672263 -Nb4Pt2S14_11_13130.vasp,Nb4Pt2S14,-3.9685282195,0.1254814834374973 -Ca2Ni1S3_38_3077.vasp,Ca2Ni1S3,-2.441763493333333,-0.0018354255555578 -Na2Sn1H6O6_147_12301.vasp,Na2Sn1H6O6,-4.0733386393333335,0.0482285073333335 -Sb4Te2O12_18_15828.vasp,Sb4Te2O12,-3.8854590966666662,0.2776722201388852 -Sb2S2I2_11_15677.vasp,Sb2S2I2,-1.6713006866666669,-0.6676495500000001 -K2Fe4S6_51_9106.vasp,K2Fe4S6,-1.8249641108333328,0.1295193566666668 -Rh2Cl2_164_15184.vasp,Rh2Cl2,-1.079838365,0.9196653224999982 -Sc4Br6_12_16228.vasp,Sc4Br6,-2.334939074,0.1003742719999998 -Ba3Sn1_25_2128.vasp,Ba3Sn1,-0.180708475,0.6380251825 -Hg3Ge1Se2S2Br4_1_8058.vasp,Hg3Ge1Se2S2Br4,-0.4728799125,0.2429806557465249 -Nb2Pd4S4_51_12816.vasp,Nb2Pd4S4,-3.072392577,0.2672083143103398 -Ca2Au1S2F2_38_2935.vasp,Ca2Au1S2F2,-2.226165907142857,0.5518548357142811 -Mn2Co1B6N6_150_11058.vasp,Mn2Co1B6N6,-5.252855238,1.4419301806666656 -V1Cu1Te2_156_19820.vasp,V1Cu1Te2,-1.238333645,0.4638124701190461 -Sc2Te1H1S1Br1_1_16171.vasp,Sc2Te1H1S1Br1,-3.191156795,-0.033719386111114 -As4Au2S3F2_6_1317.vasp,As4Au2S3F2,-1.8963065018181815,0.3852616535984814 -Sc3N1Cl4_12_16210.vasp,Sc3N1Cl4,-3.49630189875,-0.0131397365625045 -Ta4W2O16_3_18139.vasp,Ta4W2O16,-6.658876458181819,0.0843266311363573 -In1Ir1Br4O2_12_8276.vasp,In1Ir1Br4O2,-1.8151206525,0.4168636493749997 -Cd1B4C2Br2F4_10_3273.vasp,Cd1B4C2Br2F4,-3.5394618746153843,0.5373966887393083 -Bi6Ir2S4_11_2668.vasp,Bi6Ir2S4,-2.1576050991666667,-0.1475674627777792 -Sr4Bi2_59_17409.vasp,Sr4Bi2,-0.3844100216666666,0.5789259038888879 -Hf2I2N2_164_7515.vasp,Hf2I2N2,-5.598574326666667,0.0641642883333322 -Ge6As6_12_6955.vasp,Ge6As6,-3.1948265625,0.194331735 -Ag1Bi1Sb2Se6_143_26.vasp,Ag1Bi1Sb2Se6,-1.672400601,0.1142693906666643 -Al1Ni1F5_47_689.vasp,Al1Ni1F5,-2.36789564,0.4597264635714262 -Te2W1_187_18524.vasp,Te2W1,-2.882311853333333,0.1625860983333336 -K1Cu8Se2_123_8893.vasp,K1Cu8Se2,0.4724917136363636,1.766445888181817 -Nb2Br2O2_59_12649.vasp,Nb2Br2O2,-4.807395173333333,0.017455587777774 -Sn2Hg1S2I2_12_16780.vasp,Sn2Hg1S2I2,-0.9772220714285714,0.0989034843650766 -Al2Te2I2_59_1007.vasp,Al2Te2I2,-1.5557848083333334,0.1252683783333332 -Re2Br2_12_15032.vasp,Re2Br2,-3.59392268,0.4746637730555525 -N4O8_31_11799.vasp,N4O8,-4.572760051666667,0.1302832841666656 -Ag2F2_1_255.vasp,Ag2F2,-0.4374065675,0.3086405874999999 -Ga1Ag1Pt1S1I2_1_6119.vasp,Ga1Ag1Pt1S1I2,-0.8739982633333333,0.2731115916666655 -C2S2_31_2754.vasp,C2S2,-4.2093701525,1.1577349521875 -Sr3Mg3_156_17382.vasp,Sr3Mg3,0.506474865,0.5479140493750001 -Ti3Te2H2C2_38_19109.vasp,Ti3Te2H2C2,-5.030861915555556,0.345092286481476 -Co1H4C2Br2N4_47_3745.vasp,Co1H4C2Br2N4,-4.446595572307692,0.0407333216025574 -Bi16Br4_10_2305.vasp,Bi16Br4,-1.1084456235,-0.5017201161666676 -Ru2Br2N2_59_15298.vasp,Ru2Br2N2,-3.380200723333333,0.0254321769444415 -Cu2Cl6_162_5087.vasp,Cu2Cl6,-0.1574977125,0.260187410625 -Hg2Sb2S6_147_8011.vasp,Hg2Sb2S6,-1.429347762,0.3253639984374976 -Fe2B1H2S2_164_5798.vasp,Fe2B1H2S2,-2.822839732857143,0.2786326826428488 -Y2C2Br2_12_20713.vasp,Y2C2Br2,-5.200936615,0.0240436433333268 -P2W2O10_85_14057.vasp,P2W2O10,-5.703033070714286,0.2728081762499998 -Sn1Pb1Se1S2I2_1_16671.vasp,Sn1Pb1Se1S2I2,-1.4536617328571428,0.304754131666663 -Rb2Cd4S8Cl6_31_14813.vasp,Rb2Cd4S8Cl6,-1.0786339875,0.0874788610624994 -K2Cl10_127_9074.vasp,K2Cl10,-0.411203945,0.1969925524999994 -K4V6O16_100_9529.vasp,K4V6O16,-4.708561745384615,0.274990493461539 -Li2H6C8N2O2_51_9945.vasp,Li2H6C8N2O2,-4.938042326,-0.5575813532083544 -Na4Cd2F8_11_12378.vasp,Na4Cd2F8,-1.877916926428572,-0.1299721892857159 -Ta4Ni8S8_51_18074.vasp,Ta4Ni8S8,-2.884786304,0.0076698141599996 -Hg8P4O12F4_57_8109.vasp,Hg8P4O12F4,-2.6485168821428573,0.1722020807142854 -Ga2S2Br2_31_6437.vasp,Ga2S2Br2,-2.1377769416666665,0.0196986858333332 -C60_164_2773.vasp,C60,-7.706103089,0.410222321 -Cr1Ag1Sb2Te6_5_4106.vasp,Cr1Ag1Sb2Te6,-1.3171825,0.2442127356249984 -K2Hg4I6O8_31_9174.vasp,K2Hg4I6O8,-0.8420865300000001,0.3863165976249998 -Ta1Ga1Te3Br1_6_17548.vasp,Ta1Ga1Te3Br1,-2.4345024116666667,0.204311392777778 -As2Pt3S8_164_1281.vasp,As2Pt3S8,-2.585125107692308,0.3648645544999966 -Li1Ni1As2O6_149_9757.vasp,Li1Ni1As2O6,-3.558703613,0.411403502624996 -Hf2Se2Br2_59_7602.vasp,Hf2Se2Br2,-3.82099957,-0.0458129241666696 -B6Te6_2_1789.vasp,B6Te6,-3.495963043333333,0.3704224841666669 -Tl2Ga2Cl8_3_19420.vasp,Tl2Ga2Cl8,-1.353651595,0.2011312577083335 -Cd1S1Cl1_8_3409.vasp,Cd1S1Cl1,-0.4017233033333333,0.4839259103124981 -Te24Mo8_14_18344.vasp,Te24Mo8,-1.89509921625,0.0810179104166666 -Re1Te2_187_15028.vasp,Re1Te2,-3.17284898,0.3474792100000003 -Na1Li2As1_47_11894.vasp,Na1Li2As1,-1.5833614075,0.6711608138888869 -Re1F2_164_15001.vasp,Re1F2,-3.23464498,0.856238191111107 -Hf2Br2_12_7450.vasp,Hf2Br2,-3.8508619975,0.0511567699999999 -Cr1Ag1P2S6_149_4099.vasp,Cr1Ag1P2S6,-2.87575925,0.0877626384999996 -Hf1Mn1N2Cl2_8_7220.vasp,Hf1Mn1N2Cl2,-4.656820346666667,0.292595100208328 -Ir2Se2I2_11_8839.vasp,Ir2Se2I2,-1.93767993,-0.0971944437500031 -Ta9S18_12_18165.vasp,Ta9S18,-5.301784519259259,0.118948069074074 -Ca3Mn2Br2O5_123_3184.vasp,Ca3Mn2Br2O5,-3.8606821,-0.1788296156250013 -Cu4S4Cl4_14_5453.vasp,Cu4S4Cl4,-1.0683327475,0.1222566745634911 -V2Ag2Sb4S12_13_19976.vasp,V2Ag2Sb4S12,-2.5228661785,0.2255175483333307 -Mn1Bi2S4_164_10652.vasp,Mn1Bi2S4,-2.5312712985714287,0.0903068242857143 -Al2Ni1Te4_164_899.vasp,Al2Ni1Te4,-1.627816317142857,0.1942769650510169 -K4H12C4N4_14_9449.vasp,K4H12C4N4,-4.074324657083333,0.2612592520486037 -Al2Bi2Br12_2_767.vasp,Al2Bi2Br12,-1.27944037,0.0465305356249999 -Ga2Se5_12_6486.vasp,Ga2Se5,-2.2045449614285717,0.2098745280952361 -Ca2H8S4F4_53_3046.vasp,Ca2H8S4F4,-3.296162198333333,0.1396672022222191 -Te2H4O8_14_18383.vasp,Te2H4O8,-3.9097697978571433,0.0505625934523732 -Sb4O6_4_15786.vasp,Sb4O6,-4.165711071,0.0917793965000006 -Na1Mo2S2I6_47_11904.vasp,Na1Mo2S2I6,-1.2228386472727273,0.1788290823106028 -Hf2I1Br4Cl1_1_7510.vasp,Hf2I1Br4Cl1,-2.6582303625,0.1503156938541599 -Te8O18_147_18702.vasp,Te8O18,-3.610980580769231,0.0712931471153848 -Sn4N8_26_16944.vasp,Sn4N8,-3.884016475,-1.063990555000002 -W4O12_7_20590.vasp,W4O12,-5.954431336875,-0.0903955337500006 -Na2S4Cl2F8_1_12289.vasp,Na2S4Cl2F8,-1.85865723375,0.1111286770507813 -Ni1H4C4I2N2_47_13340.vasp,Ni1H4C4I2N2,-4.471888400769231,0.3538032846153678 -As12Se12_7_1123.vasp,As12Se12,-2.406294637083333,0.3005903020833307 -B3Mo4H2O2_164_1734.vasp,B3Mo4H2O2,-4.581564952727273,0.8167024540908938 -Ni1B6C2I2F4_6_13278.vasp,Ni1B6C2I2F4,-3.670308343333333,0.6245266350833215 -Tl4Ge4S10_5_19604.vasp,Tl4Ge4S10,-2.401278655,0.2053358658333333 -Bi4B4_1_2601.vasp,Bi4B4,-3.1456554775,0.1682711691666665 -Na2Co2Sb2_129_12061.vasp,Na2Co2Sb2,-1.4120586316666666,0.3064847499999985 -Ag2N2_129_333.vasp,Ag2N2,-1.302666155,1.1025227237500002 -Te6As2Pt2_12_18645.vasp,Te6As2Pt2,-1.786042284,0.4225633764166655 -Tl1Cd1Ga1Se4_156_19234.vasp,Tl1Cd1Ga1Se4,-1.3373729442857143,0.0243109894047595 -Si2C2Cl2_59_16394.vasp,Si2C2Cl2,-3.957254045,0.880492899583329 -Mn1Bi1Br4_1_10646.vasp,Mn1Bi1Br4,-0.89030088,0.2175626668055549 -Ca2C1_164_2966.vasp,Ca2C1,-2.00450885,1.1027185591666604 -Sn2P2H2S6_7_16812.vasp,Sn2P2H2S6,-2.9792045591666665,0.1141815619791633 -In4Te4Br4_14_8698.vasp,In4Te4Br4,-1.1582025625,0.0707751925000002 -Ge4Sb4Se4_17_6945.vasp,Ge4Sb4Se4,-2.508380535,0.1863373858333309 -Bi2Se3_164_2550.vasp,Bi2Se3,-2.033421,0.07489071 -Bi1Te1Br1_156_2397.vasp,Bi1Te1Br1,-1.14000014,0.24346094 -Nb2Ru2Se8_11_12830.vasp,Nb2Ru2Se8,-3.537900704166667,0.1873340295833334 -Zr1Mn1S1Br1Cl2_6_21326.vasp,Zr1Mn1S1Br1Cl2,-2.7191884133333333,0.0939145841738418 -Ti6H4O14_6_19180.vasp,Ti6H4O14,-6.361695527916667,0.1627481688194443 -Co2Te2_187_4039.vasp,Co2Te2,-1.12732113,0.5244811233333335 -Ni2Pd1Se6_162_13576.vasp,Ni2Pd1Se6,-1.3876920866666669,0.2175905049999986 -Sr3Ag2Br2O4_123_17343.vasp,Sr3Ag2Br2O4,-2.6590855809090908,0.0212807695454501 -Sn2P2N2O6F6_7_16815.vasp,Sn2P2N2O6F6,-3.711525459444444,0.5551945169444422 -Tl2Zn2Se5_156_19570.vasp,Tl2Zn2Se5,-0.8967208444444444,0.2090784455555545 -Zr2Nb1I2N1_6_21611.vasp,Zr2Nb1I2N1,-4.03522114,0.4712231956666544 -Fe2Cl8_14_5841.vasp,Fe2Cl8,-0.807699489,0.0632337259999998 -Y1Se1Br1_156_20672.vasp,Y1Se1Br1,-3.78327163,0.1511554152777745 -Cr1H2S2_164_4186.vasp,Cr1H2S2,-3.208491606,0.7999802120000004 -Si2Au2S6_51_16387.vasp,Si2Au2S6,-2.527384914,0.2060640440000001 -Tl1Te1F5_6_19350.vasp,Tl1Te1F5,-2.115155501428572,0.150184127142857 -Nb2S4F4_12_12853.vasp,Nb2S4F4,-4.114085325,0.0808804515749973 -Mn8Se2S4Br6_1_11477.vasp,Mn8Se2S4Br6,-2.083007782,0.0478847518749931 -K2Te2C2N2_31_9365.vasp,K2Te2C2N2,-3.886816005,0.2131797995833274 -Cu1Bi1P2Se6_143_4850.vasp,Cu1Bi1P2Se6,-2.175627312,0.0739894185 -Ag2Au2Cl8_13_173.vasp,Ag2Au2Cl8,-0.1462093591666666,0.0796360516666666 -Ni2S1I1Br1O1_25_13579.vasp,Ni2S1I1Br1O1,-0.9939105683333334,0.09263098738095 -Hg1H4C4N2F2_10_7876.vasp,Hg1H4C4N2F2,-4.61984251,0.3759121940212117 -Ge6Bi6_2_6957.vasp,Ge6Bi6,-2.071494495833333,-0.7515726858333336 -Cr2S6_59_4476.vasp,Cr2S6,-3.09937763625,0.15280346859375 -Cu4Te4S12_14_5488.vasp,Cu4Te4S12,-1.566834644,0.3396379117499974 -Nb6C1Br4N1O4_6_13188.vasp,Nb6C1Br4N1O4,-5.6191781775,0.0669185829635414 -Cu4S2_4_5447.vasp,Cu4S2,-0.6750183183333333,0.3198914683333324 -Ta2S2_187_17853.vasp,Ta2S2,-5.4223732075,0.3457473387499945 -Sb1Te6P2Au1_143_15521.vasp,Sb1Te6P2Au1,-1.592064706,0.3246050447499944 -V3B2Se2F2_1_20246.vasp,V3B2Se2F2,-3.5495113666666667,0.574953863783065 -Ir2Se2F2_59_8837.vasp,Ir2Se2F2,-2.53713538,0.2550840811458306 -As2Cl6_11_1201.vasp,As2Cl6,-1.54197908625,0.0509263987499999 -Sb4Se2O12_18_15823.vasp,Sb4Se2O12,-3.888661676111111,0.2300727483333298 -Rb3Mo2Cl9_187_14959.vasp,Rb3Mo2Cl9,-1.7343874271428572,-0.0153543119047634 -Ga1Pd1Pt2Br4N3O1_1_6235.vasp,Ga1Pd1Pt2Br4N3O1,-2.4020908875,0.330946935989578 -Al2I2_164_878.vasp,Al2I2,-1.1786392825,0.2838918499999986 -Sc2Te2_187_16177.vasp,Sc2Te2,-2.4303972925,0.7764441775000002 -Cr4C3S2_164_4598.vasp,Cr4C3S2,-4.726779686666666,0.2313661444444394 -Ag1W1Se1Br5_1_151.vasp,Ag1W1Se1Br5,-1.184907865,0.1001614346428539 -Bi4Cl12_14_2608.vasp,Bi4Cl12,-1.352573128125,0.062720331875 -Ga2O2F2_59_6414.vasp,Ga2O2F2,-3.848664063333333,-0.2688063293055585 -Pb2Br2_129_14221.vasp,Pb2Br2,-0.661656795,0.5658327425000003 -Ru2Cl2_164_15309.vasp,Ru2Cl2,-1.7607223975,0.8675926841666644 -Bi2Br2_129_2432.vasp,Bi2Br2,-0.6606211425,0.1558906333333325 -Ta2Te4F4_12_17915.vasp,Ta2Te4F4,-3.435257078,0.2418619528666634 -Cu1Cl2_12_4872.vasp,Cu1Cl2,-0.4028045766666666,0.0863505266666666 -Hf3Zr1O8_156_7752.vasp,Hf3Zr1O8,-7.355819659166666,0.2805480504166668 -Be3Br6_5_2275.vasp,Be3Br6,-1.9187331277777775,0.169503498888889 -Tl2Fe1Te4_156_19414.vasp,Tl2Fe1Te4,-0.6300361057142857,0.6121629328571416 -Sc1Zn1I2_156_16022.vasp,Sc1Zn1I2,-0.5054476825,0.2307754433333327 -Be2Hg1_123_2256.vasp,Be2Hg1,-0.13684327,0.5456634112643673 -Co3Se4_164_4069.vasp,Co3Se4,-2.195003844285714,0.0988894922857122 -Rb2Te2C2O6F6_4_14948.vasp,Rb2Te2C2O6F6,-3.197785948888889,0.6416487584444363 -Au4S4I4F4_14_1587.vasp,Au4S4I4F4,-0.632469393125,0.2464081947005198 -Co1S2F2_164_3817.vasp,Co1S2F2,-2.17416351,0.2618251472500001 -Ga1Te1_156_6293.vasp,Ga1Te1,-1.258505955,0.6746942608333335 -Co1H4C4Br2N2_47_3752.vasp,Co1H4C4Br2N2,-4.802698683846153,0.1176659746153692 -Ni2Te2As1_187_13657.vasp,Ni2Te2As1,-1.104143992,1.1066324496071394 -Cd1Mo1F5_1_3379.vasp,Cd1Mo1F5,-2.075239314285714,0.0229088024999986 -Mo4C3S2F2_164_11737.vasp,Mo4C3S2F2,-4.117473528181818,0.551041316666657 -Li4V4F16_14_10242.vasp,Li4V4F16,-3.60891467,-0.5063725733333362 -Sr3Co2Cl2O4_123_17359.vasp,Sr3Co2Cl2O4,-3.542051603636364,-0.0498697334848545 -Mo3N2Cl2_187_11711.vasp,Mo3N2Cl2,-3.911167638571429,0.3443609247619013 -Ag2Cl2_129_245.vasp,Ag2Cl2,-0.0006982875,0.12862064 -Mo2Se2I1Br1_6_11685.vasp,Mo2Se2I1Br1,-2.108672126666667,0.2134811361805553 -Fe1Cu1S2I1Cl1_8_5667.vasp,Fe1Cu1S2I1Cl1,-1.19706496,-0.1102298612708338 -V2Cl2O2_59_20030.vasp,V2Cl2O2,-4.1158188566666665,0.0215789955555516 -Sc2I6_59_16100.vasp,Sc2I6,-1.46839865125,0.14911888 -Sb2O2_164_15613.vasp,Sb2O2,-3.313923645,0.6145795899999975 -W2S1Br1Cl3_1_20525.vasp,W2S1Br1Cl3,-2.3847721857142856,0.5807683255952297 -Sb2I6_150_15591.vasp,Sb2I6,-0.44647706125,0.14723477125 -Co2As2Se5_8_3848.vasp,Co2As2Se5,-2.253766863333333,0.343986610555553 -Hf2H2C1_164_7503.vasp,Hf2H2C1,-5.773320008000001,0.2688341999999997 -Ta2Pt1S6_12_17835.vasp,Ta2Pt1S6,-4.474109377777777,0.091517955555556 -V2O2_123_20122.vasp,V2O2,-4.75593623,0.7768939133333289 -In4Cl4_57_8669.vasp,In4Cl4,-1.28910949625,0.1076627071875 -Zn2S2_129_21143.vasp,Zn2S2,-0.8551346575,0.336525437 -Nb2Sn2As2_129_12894.vasp,Nb2Sn2As2,-3.3300719933333336,-0.6250575633333361 -Ta2Te2C1_164_17900.vasp,Ta2Te2C1,-5.63608208,0.0386468880000006 -As2_164_1313.vasp,As2,-3.063136905,0.148047655 -W2O4_11_20522.vasp,W2O4,-6.025588605,0.242111163639449 -As4S14_18_1358.vasp,As4S14,-2.489775894444444,0.6290034211111084 -Co2O2F2_47_3943.vasp,Co2O2F2,-3.0955610266666667,-0.3896155293750031 -Pr4Cl10_11_14560.vasp,Pr4Cl10,-2.95852568,0.1397807504761845 -Rb1Te2Pb1_156_14757.vasp,Rb1Te2Pb1,-0.787662965,-0.2543993587500001 -Mg1Cl2_187_10352.vasp,Mg1Cl2,-1.82078695,0.2462405949999999 -Mn1Sb1O4_10_10858.vasp,Mn1Sb1O4,-4.421985671666667,-0.4818219016666667 -Ga2Te2I14_7_6504.vasp,Ga2Te2I14,-0.1960756099999999,0.1084783255555552 -Sm1Sn5_47_16561.vasp,Sm1Sn5,-1.441177115,-1.4848506108333337 -Bi1Mo1As1_156_2345.vasp,Bi1Mo1As1,-2.405680046666667,0.1811694302380926 -Cu1Sb6S2O16_2_4974.vasp,Cu1Sb6S2O16,-4.1404330932,0.1366030932499917 -Ce2Be4_12_3662.vasp,Ce2Be4,-2.7671223516666665,0.2568127830769202 -Ca2Au1S2Br2_123_2931.vasp,Ca2Au1S2Br2,-1.6607323471428572,0.2971678385714247 -V2S1Br1Cl1_156_20149.vasp,V2S1Br1Cl1,-2.58684589,0.3771454804999996 -As2C6_191_1198.vasp,As2C6,-5.92892420875,0.9611159887499996 -Fe2I6_162_5866.vasp,Fe2I6,-0.16901781,0.081597239375 -Pd1Au2F5_1_14344.vasp,Pd1Au2F5,-0.5838584525,0.5886395471527766 -Au2S4Br2_12_1521.vasp,Au2S4Br2,-0.63216273,0.5364452002083324 -Fe1C4I2N2F4_47_5646.vasp,Fe1C4I2N2F4,-4.10390457,0.0439087570672981 -Hf3B2H2S2_187_7679.vasp,Hf3B2H2S2,-5.195667041111111,0.2725134155555504 -B6Au1S2N6F4_6_1773.vasp,B6Au1S2N6F4,-4.940052391578948,0.5692357534758663 -Bi8Ir4_2_2685.vasp,Bi8Ir4,-1.9913920716666669,0.2746269591666666 -Zn1As4H8O16_2_20896.vasp,Zn1As4H8O16,-4.038835798275862,0.1903194163170379 -Cu1Ir1O6_5_4913.vasp,Cu1Ir1O6,-2.86480964875,0.7539521581250002 -Pd2F4_14_14422.vasp,Pd2F4,-1.370740208333333,0.0665090099999998 -Te1W1Se1_156_18337.vasp,Te1W1Se1,-3.3150249466666666,-0.0968457858333331 -W1S2_115_20449.vasp,W1S2,-3.82574871,0.6468499400000005 -Mn1As1S2_1_10633.vasp,Mn1As1S2,-2.62986507,0.6935645781249997 -Cu4S4I4_14_5458.vasp,Cu4S4I4,-0.6692351916666667,0.125336661825396 -Fe1Br2O8_147_5637.vasp,Fe1Br2O8,-2.38147903,0.3847281459469638 -Cu1Ag1O2_10_4819.vasp,Cu1Ag1O2,-1.58487759,0.3350679353124999 -Ni1Sb1_187_13417.vasp,Ni1Sb1,-0.02156478,1.0802757349999998 -Ni1H4C2Br2N4_47_13331.vasp,Ni1H4C2Br2N4,-4.263042053846154,0.2508949169871713 -Nb1Ga1Cl4_10_12509.vasp,Nb1Ga1Cl4,-2.377607701666667,0.2456230244871771 -Ag1Rh1Se1S1I1Br1_1_108.vasp,Ag1Rh1Se1S1I1Br1,-1.085193485,0.3186140409850769 -Ge2As2H6C2S6_7_6735.vasp,Ge2As2H6C2S6,-3.670264645,0.1540266327777673 -Ni3Sb2Te8_164_13718.vasp,Ni3Sb2Te8,-0.744483946923077,0.3882920727472502 -Ti2Br2_164_18902.vasp,Ti2Br2,-3.3510753575,0.8357244000000001 -Cu2S4Cl2_17_5257.vasp,Cu2S4Cl2,-1.48340387625,0.0813323912500001 -Mn1Ni1S2I1Cl1_8_10828.vasp,Mn1Ni1S2I1Cl1,-1.4220686066666666,0.1820411188541642 -Li1Se1S1_6_9788.vasp,Li1Se1S1,-2.3751115966666667,0.313838336006942 -Al2Cr1Se4_164_815.vasp,Al2Cr1Se4,-2.801582277142857,0.2039321661904725 -Ge2Se2O8_31_6870.vasp,Ge2Se2O8,-3.748581195,0.5175748277083336 -Zn1Ni1Te1Se1_156_20980.vasp,Zn1Ni1Te1Se1,-0.3538482125,0.2776919268749994 -As10S10_26_1117.vasp,As10S10,-2.752981627,0.2569183414374998 -Cd1I1O1F1_156_3365.vasp,Cd1I1O1F1,-0.49236737,0.7580209082638888 -Re3Te1I4_1_15098.vasp,Re3Te1I4,-2.42360595125,0.4979806857738056 -Os2Se2_6_13888.vasp,Os2Se2,-3.3527355825,0.7778423400000003 -Re6Pb3O24_157_15124.vasp,Re6Pb3O24,-5.335025035454545,0.1024526554545461 -Ag2C2S2N2_31_224.vasp,Ag2C2S2N2,-3.83679925875,0.1929350378385357 -Ni3Ge1S2_187_13699.vasp,Ni3Ge1S2,-1.2874090116666668,0.1008013783333305 -Rh2S2Cl2_59_15217.vasp,Rh2S2Cl2,-2.3064595466666664,0.0685538866666668 -As2P2S8_11_1241.vasp,As2P2S8,-2.9560214775,0.1836975066145801 -Al1Se1I1_1_734.vasp,Al1Se1I1,-2.0206159033333333,0.0835826208333334 -Sc1I1Cl1_1_15943.vasp,Sc1I1Cl1,-1.9107847366666664,0.4135884288888865 -Al1Bi1_187_613.vasp,Al1Bi1,1.87191529,3.31733972 -Cs2Ru2S2N2F10_11_4776.vasp,Cs2Ru2S2N2F10,-2.838566653888889,-0.0347004600396892 -Sc2C1_164_16056.vasp,Sc2C1,-4.308542013333333,0.5971832866666675 -Nb4Pd6S10_59_13128.vasp,Nb4Pd6S10,-3.4233571905,0.170655818224132 -Na2O4F2_113_12242.vasp,Na2O4F2,-1.61877686875,1.158394669375 -Li1Cu1Mo1Br2O2_8_9686.vasp,Li1Cu1Mo1Br2O2,-2.6125922085714284,0.4417148321428518 -Sr3Co2S5Br2_123_17362.vasp,Sr3Co2S5Br2,-2.5307400091666667,0.1337761903124971 -Mg3Br6_5_10545.vasp,Mg3Br6,-1.3946043088888889,0.1433662555555555 -Ni2Se1S1_99_13627.vasp,Ni2Se1S1,-0.93649369,0.186081907395832 -Hf2Tl2Cu2S6_51_7655.vasp,Hf2Tl2Cu2S6,-3.187672195833333,0.1423022183333335 -Zr1Zn1P2S5Cl1_1_21494.vasp,Zr1Zn1P2S5Cl1,-2.99273077,0.2264023254312501 -Cu2O4F2_31_5203.vasp,Cu2O4F2,-2.05508061625,0.3084524418749998 -Ca2N4Cl4_28_3074.vasp,Ca2N4Cl4,-4.068389613,-0.5179506809999994 -Rh2I8_7_15200.vasp,Rh2I8,-0.246865791,0.1702153853750003 -Ni1Ir3Se2S6_1_13375.vasp,Ni1Ir3Se2S6,-2.731906469166667,-0.0439513908333336 -Cu2As2S6_162_5011.vasp,Cu2As2S6,-2.037362664,0.4753238040833307 -Cr1In2Te4_164_4207.vasp,Cr1In2Te4,-1.5104600985714285,0.1297278816190476 -Ta2Br6_162_17672.vasp,Ta2Br6,-2.4680384825,0.2997058985937504 -Cr2P2S8_12_4452.vasp,Cr2P2S8,-3.263072558333333,0.0392369141666666 -Os2Se2F2_59_13882.vasp,Os2Se2F2,-2.9123643733333338,0.4677699039583298 -Sr1Ta2S7_123_17092.vasp,Sr1Ta2S7,-4.091707831,0.3191888840000008 -Na2Zr1O6F6_1_12345.vasp,Na2Zr1O6F6,-2.6508619,1.039850375766662 -Sr4Bi4Se8F4_12_17412.vasp,Sr4Bi4Se8F4,-2.658777598,0.0435607145000005 -Zr2Cl4_11_21552.vasp,Zr2Cl4,-3.0801540616666667,0.0990546783333332 -Ga4Br4N4_2_6545.vasp,Ga4Br4N4,-3.149365536666666,0.2011018569444413 -In2Te2_164_8628.vasp,In2Te2,-1.3144050175,0.0706040025000001 -Ni2Se2I2_59_13634.vasp,Ni2Se2I2,-0.4960113633333333,0.0467261649999999 -Sn2Br2N1_5_16742.vasp,Sn2Br2N1,-1.9748335,-0.6893731214999999 -As4P2H2O12_4_1342.vasp,As4P2H2O12,-4.8508665055,0.0366763555833289 -Ti1Pb9O11_75_18827.vasp,Ti1Pb9O11,-3.783564498095239,0.0387294409523775 -Nb2Br4_11_12655.vasp,Nb2Br4,-2.7509654566666666,0.2103440645833295 -K2Cl2O6_11_9078.vasp,K2Cl2O6,-2.466603454,0.0988836129999977 -Co2O2F2_59_3944.vasp,Co2O2F2,-3.358069903333333,-0.6521244060416702 -N2O3_1_11787.vasp,N2O3,-4.645015722,0.1410983424999949 -Sr3Mn2S5Br2_123_17386.vasp,Sr3Mn2S5Br2,-2.6392836625,0.0837449849999969 -Mn1W1Se2I1Cl1_25_10934.vasp,Mn1W1Se2I1Cl1,-2.334643581666666,-0.0079948012500005 -Sb2N18_147_15609.vasp,Sb2N18,-5.857555023,-0.6488227554999991 -Au4S2_191_1579.vasp,Au4S2,0.08080028,0.40659369 -Ni1Te1_156_13433.vasp,Ni1Te1,0.164323795,0.7274007199999996 -Mn3C6N6_164_11367.vasp,Mn3C6N6,-6.001224290666667,0.7430780054999925 -Sr3Ag2S4I2_123_17348.vasp,Sr3Ag2S4I2,-1.7995769881818182,-0.2469213200568212 -La2F2_164_9591.vasp,La2F2,-3.4991704425,0.4907971274999966 -Hg8Se4O12_14_8111.vasp,Hg8Se4O12,-1.6168376745833333,0.1165348925 -P2Cl10_51_13967.vasp,P2Cl10,-0.9343447141666666,0.4396423070833321 -Cd2Ag2Te2Cl2_26_3450.vasp,Cd2Ag2Te2Cl2,0.0828392675,-0.000513786875 -Nb1O1F1_8_12549.vasp,Nb1O1F1,-5.35645207,0.3703615779629585 -Ni2Se2_187_13641.vasp,Ni2Se2,-0.4976039875,0.2985636174999994 -Zr1Ta1V1S3Br4_1_21455.vasp,Zr1Ta1V1S3Br4,-3.304697642,0.2555444514999958 -Ba4Sb2_59_2177.vasp,Ba4Sb2,-1.1596929933333333,0.4213798766666652 -Ta4Se12I2_2_18108.vasp,Ta4Se12I2,-3.404811733888889,0.1501160216792869 -Cu2Cl2_129_5080.vasp,Cu2Cl2,-0.3050226925,0.33112086125 -Al1Ag1As2Se6_149_595.vasp,Al1Ag1As2Se6,-2.130397803,0.2145787693333309 -Ca2P4H8O8_13_3094.vasp,Ca2P4H8O8,-4.613443038636364,0.0517722698484767 -Nb2Os2S8_11_12801.vasp,Nb2Os2S8,-4.387548458333334,-0.0952321837500003 -Hf2Ge2Te8_31_7500.vasp,Hf2Ge2Te8,-2.788212940833333,0.1012631399999999 -Cr1F2_12_4171.vasp,Cr1F2,-3.25816906,0.0274780533333303 -Li3Mn1P2_115_10148.vasp,Li3Mn1P2,-2.655627598333333,0.4525266791666638 -Re2H4N2O4_51_15049.vasp,Re2H4N2O4,-4.467893191666667,1.0128843969444388 -Pd2Br4O12_14_14403.vasp,Pd2Br4O12,-2.138229830555556,0.3199280683333314 -Rh1O2_164_15160.vasp,Rh1O2,-3.630709033333333,0.4999308249999994 -Ba2La2Cl10_11_2015.vasp,Ba2La2Cl10,-2.781761805714286,0.1454440724999974 -V1Cu1Sb2S6_1_19817.vasp,V1Cu1Sb2S6,-2.486425518,0.340976730958331 -Hf2Cl6_162_7479.vasp,Hf2Cl6,-3.15996844875,0.1964734462499966 -Sm2Bi2S4O2_129_16564.vasp,Sm2Bi2S4O2,-4.173241523,0.0139192480833303 -Sn6H4O8_81_16988.vasp,Sn6H4O8,-3.792685488888889,0.1338151700925895 -Ba3Co2S5Br2_123_2101.vasp,Ba3Co2S5Br2,-2.6740169575,0.2002707589843693 -Mn2Bi2Se4F2_26_11017.vasp,Mn2Bi2Se4F2,-2.061110025,0.2573439664166653 -Te4Pd2F2_2_18615.vasp,Te4Pd2F2,-1.48137969,0.2107728926562498 -Ti3C2F2_187_19073.vasp,Ti3C2F2,-6.71573678,-0.3857247757143052 -Mn1Re2O8_147_10846.vasp,Mn1Re2O8,-5.4894447363636365,0.0189747609090904 -Mn2As2O4F2_26_10969.vasp,Mn2As2O4F2,-3.778408958,0.173982935699996 -K2Pt4Se6_164_9311.vasp,K2Pt4Se6,-1.8917708875,0.1038929216666666 -K2I2Cl4O2_11_9202.vasp,K2I2Cl4O2,-1.219894557,0.150581325833332 -Th4I16_14_18735.vasp,Th4I16,-1.838284089,0.050711892 -Be3I6_5_2280.vasp,Be3I6,-1.2657899,0.1585014716666664 -Bi1S1_123_2370.vasp,Bi1S1,-1.67967054,-0.3906742933333342 -Al2P2Se2S4_1_924.vasp,Al2P2Se2S4,-3.237193037,0.1355630479166604 -V2Ag2O8_51_19971.vasp,V2Ag2O8,-3.8229858975,0.2481383097916634 -Mo2Br6_189_11578.vasp,Mo2Br6,-1.2170060975,0.2207681465624982 -Ag2Te4As2_26_475.vasp,Ag2Te4As2,-1.0653637475,0.2379013862499999 -Tl2S2_129_19505.vasp,Tl2S2,-1.4106341775,0.18518950359375 -Os2I6_189_13854.vasp,Os2I6,-0.715420195,0.47073855640625 -Y1Fe1F5_47_20632.vasp,Y1Fe1F5,-3.118267885714286,1.020108653571425 -Li1Mn1I2O2_1_9744.vasp,Li1Mn1I2O2,-2.586423145,0.0532843211458298 -Cu1B6H4C6O2_6_4844.vasp,Cu1B6H4C6O2,-5.214327437368421,0.934799649555911 -Sr2Cd1_123_17175.vasp,Sr2Cd1,1.23609026,0.2547511733333333 -Ag2Se2_164_438.vasp,Ag2Se2,-0.1425535075,0.1444025 -Si6As6_12_16524.vasp,Si6As6,-3.753634993333333,0.1203475775000004 -K2S2N2O6F6_4_9330.vasp,K2S2N2O6F6,-2.9804264961111118,0.3695209851851766 -Al2I2N2_59_876.vasp,Al2I2N2,-3.534950638333333,0.5605356389583301 -Te2Os2Br2_59_18423.vasp,Te2Os2Br2,-2.100212805,0.189461776145831 -Rb2Cd4Cl6O8_31_14804.vasp,Rb2Cd4Cl6O8,-1.411108392,0.3118493130416651 -In2Se2F2_31_8579.vasp,In2Se2F2,-2.0750585633333336,0.1901592988888865 -Al2Se4_12_976.vasp,Al2Se4,-2.6490197733333334,0.1961656438888865 -Ta4C3_164_18016.vasp,Ta4C3,-8.046533865714286,0.3839112835714209 -Sr2Tl1Ag1Hg1O5_99_17330.vasp,Sr2Tl1Ag1Hg1O5,-2.379846913,0.2364098448249963 -Pb2Br2O2_59_14219.vasp,Pb2Br2O2,-2.174903293333333,0.1503232425 -Ba4P4Se8Cl4_14_2172.vasp,Ba4P4Se8Cl4,-2.749948355,0.1158575344375003 -Ag2Hg2S2I2_26_300.vasp,Ag2Hg2S2I2,0.16335173375,0.11875080125 -W1O2_115_20441.vasp,W1O2,-5.580354953333334,0.6873448153061155 -Cu2Te2F2_59_5331.vasp,Cu2Te2F2,-0.876092125,0.3239141866666645 -Cs2Cd4Te2Cl6O6_31_4700.vasp,Cs2Cd4Te2Cl6O6,-1.590986617,0.327145957625 -Zr3N2_187_21775.vasp,Zr3N2,-6.19630674,0.5034423180000003 -Co1H4C8I2_25_3766.vasp,Co1H4C8I2,-4.979154049333333,0.4190802608888824 -Mo1Ir1Br2O2_25_11520.vasp,Mo1Ir1Br2O2,-2.9253047050000003,0.5625082087698381 -In1Ge1S3_143_8265.vasp,In1Ge1S3,-2.31786768,0.3419374915624968 -Ta4O10_11_18078.vasp,Ta4O10,-7.081862685,0.1637217107142863 -Fe2Mo2S8I2_129_5877.vasp,Fe2Mo2S8I2,-2.043640541428572,0.3457112631249972 -Ag2S2Cl2_59_377.vasp,Ag2S2Cl2,-0.6005185533333334,0.3583223314583325 -P4O6_1_14086.vasp,P4O6,-5.144050696,0.1147530576000006 -K2Pt1C4S4N4_2_9305.vasp,K2Pt1C4S4N4,-4.7649116346666665,0.0239403909444347 -Al2S2F2_31_937.vasp,Al2S2F2,-3.667129526666667,0.1856689354166629 -Fe4B3H2O2_164_6073.vasp,Fe4B3H2O2,-3.38696259,0.4828518077272644 -Zn2P4S6F4_31_21137.vasp,Zn2P4S6F4,-2.417149384375,0.3675410657994761 -Na1In1P2Se6_5_11887.vasp,Na1In1P2Se6,-2.4078241040000004,0.0761798174999999 -Sb2P8O24_4_15634.vasp,Sb2P8O24,-5.248316847352942,0.1216535716911715 -Sb18Br4_11_15425.vasp,Sb18Br4,-1.903473844090909,0.0928863311363619 -Ir2Cl2_129_8775.vasp,Ir2Cl2,-0.9101150775,1.9496560916666643 -Tl1Pt5Br2_38_19324.vasp,Tl1Pt5Br2,-0.91481634125,1.3794518415625 -Mg1Sn1_47_10405.vasp,Mg1Sn1,-0.237092895,-0.88675961125 -Li4Mn4F16_14_10202.vasp,Li4Mn4F16,-2.926358001666667,-0.3097412958333359 -Sc2N2Cl2_59_16107.vasp,Sc2N2Cl2,-4.439077655,0.2080676624999955 -Pd2Br1N1Cl1_6_14396.vasp,Pd2Br1N1Cl1,-1.60489587,0.2655320808333337 -Co2Se2Cl2_59_4019.vasp,Co2Se2Cl2,-1.8523749383333328,0.1188829 -Ta4Br16_2_18009.vasp,Ta4Br16,-2.196654298,0.2031229764375002 -Te2Pd2_123_18477.vasp,Te2Pd2,-1.16365158,0.01787177625 -Hg4Mo2Se2O12_28_8080.vasp,Hg4Mo2Se2O12,-2.968525201,0.1338250913499952 -Ge2Te2Cl2_59_6882.vasp,Ge2Te2Cl2,-1.85260875,-0.3002899138194459 -Y2S2Br2_164_20771.vasp,Y2S2Br2,-4.210032969999999,0.0736439616666668 -Ru2Se2_187_15358.vasp,Ru2Se2,-2.64045491,0.8049819262500002 -V6H12O20_100_20386.vasp,V6H12O20,-4.907316443157894,0.0400397782894645 -Ni1Ru1S2_99_13409.vasp,Ni1Ru1S2,-2.26742803,0.3488732182812499 -Bi4F12_11_2610.vasp,Bi4F12,-2.587373268125,0.4079325974999999 -Ti2Pd1I2N1O2_1_18987.vasp,Ti2Pd1I2N1O2,-4.6248971225,0.1773468934375 -Yb2Si4Ni2_129_20888.vasp,Yb2Si4Ni2,-2.844043405,0.4918453275000001 -Cu4H12C6Br4N12_11_5406.vasp,Cu4H12C6Br4N12,-4.68881659631579,-0.1247852294079071 -Ag2I4O12_4_319.vasp,Ag2I4O12,-2.1955636772222222,0.1605906144444396 -Ti2Br4_11_18904.vasp,Ti2Br4,-3.114934343333333,0.0636149133333336 -Te2As1_164_18349.vasp,Te2As1,-1.7802851366666663,0.2429086652777763 -V2Br2_129_20003.vasp,V2Br2,-1.9613787725,0.5706369425000002 -K2S6Cl2_11_9334.vasp,K2S6Cl2,-1.594077278,0.5858067716250005 -Sc1Cu1P2S6_149_15925.vasp,Sc1Cu1P2S6,-3.243826721,0.0682348495364567 -Ca2Au1I2O2_38_2929.vasp,Ca2Au1I2O2,-2.098464544285714,0.1232114633928564 -Au1F2_115_1426.vasp,Au1F2,0.0796809833333333,0.8791197340740733 -Ni1As1O4_111_13255.vasp,Ni1As1O4,-3.323899166666666,0.1368349617708305 -Ga1Te2_115_6294.vasp,Ga1Te2,-1.50743357,0.323038219666665 -Hf2Se2I2_59_7605.vasp,Hf2Se2I2,-3.510776546666667,-0.0511131812500025 -Cu2Hg2Te2I2_26_5165.vasp,Cu2Hg2Te2I2,0.4099749175,0.1601723216145833 -Ag2H4C4S4N4Cl2_4_276.vasp,Ag2H4C4S4N4Cl2,-4.1286558945000005,0.1770781759739509 -In2Pd4Se6_164_8531.vasp,In2Pd4Se6,-1.621904235,0.1811299361904746 -Hf2Tl4Se6_11_7659.vasp,Hf2Tl4Se6,-2.82414968,0.0915792583333328 -Sr2H4O6_26_17238.vasp,Sr2H4O6,-4.089177964166667,0.123327948124996 -Mn2B1S2F2_164_10997.vasp,Mn2B1S2F2,-2.8234884542857146,0.7271263996800483 -N4O6_59_11793.vasp,N4O6,-3.974329681,0.811784383499996 -U2Te10_11_19729.vasp,U2Te10,-2.716464123333333,-0.4782761929166663 -Ca1Th1Br6_25_2896.vasp,Ca1Th1Br6,-2.2756332125,0.1080772543750001 -Si1S2_164_16360.vasp,Si1S2,-3.72408518,0.1571373733333336 -Ti7C2Se1Br3Cl1O6_1_19185.vasp,Ti7C2Se1Br3Cl1O6,-5.9189067325,0.0523102056499915 -Pb1Se1I2_8_14204.vasp,Pb1Se1I2,-0.7880201725,0.3293562904166667 -Cr4Bi4O16_14_4593.vasp,Cr4Bi4O16,-4.3805519183333335,0.0534505669097138 -Nb1Sb1Te3Mo1_25_12570.vasp,Nb1Sb1Te3Mo1,-2.6442156716666667,0.2851251381249908 -In2Se2S8F2_11_8585.vasp,In2Se2S8F2,-2.0480845257142857,0.5135596187797573 -Mn1Mo1Ir1Br2O5_1_10794.vasp,Mn1Mo1Ir1Br2O5,-3.614271713,0.2433026272499946 -Li2Re1_187_10047.vasp,Li2Re1,-3.1579477866666665,0.4104471444444417 -Ta2Te2_123_17911.vasp,Ta2Te2,-4.433330045,0.3130489862499952 -Pt2Se2S6_12_14680.vasp,Pt2Se2S6,-2.20534858,0.3104223292499976 -Au3S2I1Br1_1_1563.vasp,Au3S2I1Br1,-0.1629344714285714,0.274471661607143 -Zr3C2S2_187_21759.vasp,Zr3C2S2,-5.923578572857143,0.2278755621428522 -Mn2Sb2Te4I2_10_11260.vasp,Mn2Sb2Te4I2,-1.352022169,0.1667511219999979 -Bi4Mo2O12_4_2615.vasp,Bi4Mo2O12,-4.328727977222222,1.051418694999994 -K2B2Te2C2_31_9000.vasp,K2B2Te2C2,-2.71422724875,1.4684727302083336 -In4Cl4_39_8670.vasp,In4Cl4,-1.2893905025,0.1073817009374999 -Nb4Mo6I22O1_2_13093.vasp,Nb4Mo6I22O1,-1.7210602454545454,0.1027237733333316 -Si3N4_5_16471.vasp,Si3N4,-5.879805451428572,-0.0606752028571433 -Sr2Au1S2Cl2_123_17128.vasp,Sr2Au1S2Cl2,-1.92554977,0.2874166842857103 -K2Cd4S2I6O6_31_9048.vasp,K2Cd4S2I6O6,-1.6051349739999998,0.0763140209687508 -Bi2Mo1_187_2472.vasp,Bi2Mo1,-1.5502833166666663,0.5507075833333317 -Sc2S2_10_16139.vasp,Sc2S2,-3.5495146975,0.3263214175 -Sc2I2_129_16096.vasp,Sc2I2,-1.4209370275,0.5539710883333311 -Cu1Bi1Te1Se1_8_4855.vasp,Cu1Bi1Te1Se1,-1.1119179175,0.2587325021875 -K2H6C6O6_4_9145.vasp,K2H6C6O6,-5.1375327075,0.1791991301874956 -B2Se2_2_1711.vasp,B2Se2,-3.9984852925,0.1764994900000003 -K4H4Se2I4O20_13_9453.vasp,K4H4Se2I4O20,-3.109001953529412,0.0878913800000003 -Au2C4O8F4_14_1463.vasp,Au2C4O8F4,-4.165865566666667,0.1204479972222136 -Cd2Se2Br2_59_3568.vasp,Cd2Se2Br2,-0.1732997966666666,0.0934843693055542 -Rb2Sn1H12N6_147_14942.vasp,Rb2Sn1H12N6,-4.12010625,-2.723808135625005 -Tb2F2_164_18193.vasp,Tb2F2,-3.356681805,0.4950192774999966 -V2Sb2Te6_162_20177.vasp,V2Sb2Te6,-1.911397728,0.2766199361666646 -Ga1Co5F2_123_6154.vasp,Ga1Co5F2,-1.53472792375,0.7111659758333309 -Mo2I6_189_11628.vasp,Mo2I6,-0.5882837525,0.3361627766666667 -V2Br2N2_59_20000.vasp,V2Br2N2,-4.27901449,-0.1358910406250024 -Ba2Bi2I2O4_51_1919.vasp,Ba2Bi2I2O4,-3.220144292,0.1611974490000003 -Li2Mn2F10_4_9993.vasp,Li2Mn2F10,-2.763068407857143,0.0796474608035686 -Mo1As2_187_11488.vasp,Mo1As2,-3.18236099,0.3597332233333334 -Ca3In2As4_10_3182.vasp,Ca3In2As4,-2.0516378333333334,-0.3005976044444445 -Si2Bi4O10_26_16388.vasp,Si2Bi4O10,-4.620883508125,0.2525760287499952 -Bi1S1F1_156_2368.vasp,Bi1S1F1,-2.443018353333333,-0.3043146925000018 -Be2N1_25_2261.vasp,Be2N1,-4.72264449,0.5956820022916632 -Ti2I4_11_18959.vasp,Ti2I4,-2.4533261333333334,0.0711030316666665 -Ca2As2H10O12_7_2923.vasp,Ca2As2H10O12,-4.444850947692308,0.0412844565064109 -V2S2O10_85_20160.vasp,V2S2O10,-4.80650466,0.1312635164285716 -Al2Ni2Se5_164_906.vasp,Al2Ni2Se5,-2.003287518888889,-0.0090881444444467 -Nb4Br16_14_13041.vasp,Nb4Br16,-1.9430518995,0.1985541154999999 -Mn2Ga2Se5_156_11080.vasp,Mn2Ga2Se5,-2.335525627777778,0.0112269058429093 -Os2Se4_127_13890.vasp,Os2Se4,-2.5007546066666664,1.0438666533333336 -Ru2Se4_11_15362.vasp,Ru2Se4,-2.8558603833333334,0.3387400766666668 -Ir2Br8_2_8771.vasp,Ir2Br8,-0.829001181,0.1967743970000001 -Ni2H2Se4_6_13515.vasp,Ni2H2Se4,-1.665250465,0.65400610375 -Ca3Ni2S5Br2_123_3194.vasp,Ca3Ni2S5Br2,-1.9941177008333333,0.173951140260412 -Ge2As2O6_147_6737.vasp,Ge2As2O6,-4.261649139,0.3782883528333296 -Zr2Si2Se8_31_21688.vasp,Zr2Si2Se8,-3.445215891666667,0.1625730871874999 -Sc3N2Cl2_187_16211.vasp,Sc3N2Cl2,-5.030380995714286,-0.0798922857142909 -Nb4Fe8S8_59_13075.vasp,Nb4Fe8S8,-3.0403449680000003,0.844196651666663 -Os2F2_129_13845.vasp,Os2F2,-1.8444842675,1.962041352875 -Mg1C2_164_10349.vasp,Mg1C2,-2.242356823333333,3.0304439805555505 -Hf1Mn1Te1Se1S1I1Cl1_1_7224.vasp,Hf1Mn1Te1Se1S1I1Cl1,-2.655006562857143,0.2896149083035612 -Ag2C2Cl2O2_31_212.vasp,Ag2C2Cl2O2,-3.10494995,0.2970360225000004 -In1Ga1Hg1Te4_156_8254.vasp,In1Ga1Hg1Te4,-0.8781178514285715,0.1637800128571427 -Ni1Au1Se2_156_13262.vasp,Ni1Au1Se2,-0.475763075,0.5252616449999991 -Ta2Fe2Te10_51_17729.vasp,Ta2Fe2Te10,-2.219242217142857,0.2917282567261846 -Ho2I6_162_8142.vasp,Ho2I6,-1.56118771125,0.0574264687499999 -Mo3Se1N1O12_143_11728.vasp,Mo3Se1N1O12,-4.651150772352942,0.1673356533823478 -V2Cu2Sb4Se12_13_20052.vasp,V2Cu2Sb4Se12,-2.0699499475,0.2394254975999979 -Ta4Cr2O12_14_18031.vasp,Ta4Cr2O12,-6.673344163333334,0.1313369129629564 -Sb2I2_129_15589.vasp,Sb2I2,-0.78698705,0.370009862499999 -Cd1S2F2_164_3415.vasp,Cd1S2F2,-1.167808224,0.5687249037500003 -Nb2Cl2O4_11_12678.vasp,Nb2Cl2O4,-5.5804663825,-0.1099915023437576 -In2Ge2S2_164_8449.vasp,In2Ge2S2,-2.5575366683333334,-0.3134313500000019 -Cs2Os2Br8N2O4_7_4755.vasp,Cs2Os2Br8N2O4,-2.488443931111111,0.0961366332407381 -V1P2_187_19901.vasp,V1P2,-3.870928376666667,0.6428740149999994 -Co2P4Cl4O6_11_3968.vasp,Co2P4Cl4O6,-3.547699590625,0.2637714291666619 -Ga2Sb2Se6_147_6459.vasp,Ga2Sb2Se6,-2.072212411,0.2830944925000003 -Nb2Sb2Se6_2_12861.vasp,Nb2Sb2Se6,-3.2111882940000003,0.281444191999998 -Ca1Ta2O7_123_2891.vasp,Ca1Ta2O7,-6.133069537,0.4735259323749969 -Na3Cr1Cl6_149_12350.vasp,Na3Cr1Cl6,-1.816493214,0.1698549189999998 -Hg2Te2Au2Cl2_26_8024.vasp,Hg2Te2Au2Cl2,0.3210223675,0.2545349 -Na2H2Pt1_123_12103.vasp,Na2H2Pt1,-2.018647292,0.0637300255000001 -Ba1Mn4O8_162_1843.vasp,Ba1Mn4O8,-4.403332258461538,0.0906399146153802 -Zr2N1F2_164_21604.vasp,Zr2N1F2,-5.436238408,0.2530215367499946 -Ag2Te3P4F2_6_473.vasp,Ag2Te3P4F2,-1.8507171172727277,0.4856050837741004 -Sb2F2_2_15575.vasp,Sb2F2,-2.199931395,0.6386799058333309 -Sc2H2S2N1_164_16087.vasp,Sc2H2S2N1,-4.37982088,-1.1685832621428636 -Fe2B1H2O2_164_5797.vasp,Fe2B1H2O2,-3.4913076071428573,0.6981674714285666 -Sn2Se2Cl2_59_16877.vasp,Sn2Se2Cl2,-1.6558126666666666,0.2065533858333333 -Sc2N1Cl2_164_16103.vasp,Sc2N1Cl2,-4.415733596,0.041504852 -Mg4As2_59_10572.vasp,Mg4As2,-1.1671528533333333,0.4188069469444441 -Pt4Se5S3_6_14710.vasp,Pt4Se5S3,-2.333861496666666,0.0644710514583333 -In1Ni1Se2Br2_25_8285.vasp,In1Ni1Se2Br2,-1.0306016766666668,0.1955267316666641 -Zr2C1O2_164_21534.vasp,Zr2C1O2,-6.926871628000001,-0.0234771999999994 -Nb4Ni4Te8_53_13105.vasp,Nb4Ni4Te8,-2.413395194375,0.0396850949999998 -Sb8_55_15883.vasp,Sb8,-1.68827415,0.5952929224999999 -Mn4Pb4S12_13_11448.vasp,Mn4Pb4S12,-2.6229016175,-0.3371414330000034 -C1Se1_156_2737.vasp,C1Se1,-3.32191106,1.8902459216666665 -Sb2Mo2_2_15606.vasp,Sb2Mo2,-2.706552635,0.7077014071428531 -B8O6_11_1790.vasp,B8O6,-6.041955933571429,0.6470183137351198 -Ca2H8S4Cl4_53_3045.vasp,Ca2H8S4Cl4,-2.897443088888889,-0.0001194077777806 -Mn1Al2Se4_156_10629.vasp,Mn1Al2Se4,-2.716709342857143,0.0331569942857141 -Pd2S2_123_14472.vasp,Pd2S2,-1.76461863,0.3455127100000001 -Hf1Zr1I1N1Cl1_1_7379.vasp,Hf1Zr1I1N1Cl1,-4.310519224,0.5242808800000005 -Fe4C3_164_6076.vasp,Fe4C3,-3.21363697,1.5104277828571375 -La1Ge3_187_9565.vasp,La1Ge3,-2.609681305,0.6619853433333303 -Sr2In1Cu1Hg1S5_99_17265.vasp,Sr2In1Cu1Hg1S5,-1.837906634,0.196429201 -Te4C4_28_18581.vasp,Te4C4,-3.87946227375,0.9645933095833332 -Sr1S2F2_12_17077.vasp,Sr1S2F2,-2.146736024,1.188527897750001 -Sc2Sn1_164_16168.vasp,Sc2Sn1,-1.8903754366666667,0.9148924127777752 -B3W2_187_1740.vasp,B3W2,-5.3821276220000005,0.9926499809999938 -Y1Ge2S1Cl2_6_20634.vasp,Y1Ge2S1Cl2,-3.0600276333333336,0.1415973837499951 -Zr1Br2O1_156_21268.vasp,Zr1Br2O1,-3.917127655,0.1675265756250001 -Ba2F4_2_1979.vasp,Ba2F4,-3.254778941666667,0.6174318116666662 -K2Fe2As2_12_9099.vasp,K2Fe2As2,-0.9734495666666666,0.7596058670833319 -Zr1Sc1Ta1Cl2O2_25_21438.vasp,Zr1Sc1Ta1Cl2O2,-4.971367012857143,0.6558832199999873 -Cu2S1_191_5240.vasp,Cu2S1,-0.4371136966666666,0.557796089999999 -Nb4Te12Br2_2_13164.vasp,Nb4Te12Br2,-2.574572197777778,0.1233789512103122 -Sc1Mn1Zn1S3Br2_1_15955.vasp,Sc1Mn1Zn1S3Br2,-2.0901398825,0.4125417261249969 -In1Se1Br1Cl1O1_1_8339.vasp,In1Se1Br1Cl1O1,-1.852135692,0.3686275417499944 -Te1Pt4Se7_1_18330.vasp,Te1Pt4Se7,-1.9919654775,0.2076475429166665 -I5N1_10_8164.vasp,I5N1,-0.2331398616666666,0.3714261019791631 -Cr1S2O8_164_4247.vasp,Cr1S2O8,-4.3864646327272725,0.0028234035795378 -Sb2F10_51_15573.vasp,Sb2F10,-2.1856967725,0.2679595983333334 -Nb1Mo3S1Br2N2O1_8_12536.vasp,Nb1Mo3S1Br2N2O1,-4.291071285,0.3477489149375002 -Co2Br8_1_3880.vasp,Co2Br8,-0.531268258,0.2169257099999999 -Sn2Sb2C2O6F6_7_16852.vasp,Sn2Sb2C2O6F6,-3.60402094,0.7179232355555447 -Hf1Zn1Br1Cl1O2_1_7367.vasp,Hf1Zn1Br1Cl1O2,-3.6873919483333335,0.4045810271354164 -Cu4H6C8S2N4Cl2_2_5418.vasp,Cu4H6C8S2N4Cl2,-4.536785155384616,0.219926161490376 -Na1W2S2I6_47_11956.vasp,Na1W2S2I6,-1.6810331509090908,0.1163665073484812 -V4Zn2S10_59_20381.vasp,V4Zn2S10,-2.676376154375,0.4377579942499996 -In1Ag1As2Se6_149_8178.vasp,In1Ag1As2Se6,-1.866950757,0.231403383333331 -Zr2S3Br2_5_21655.vasp,Zr2S3Br2,-3.655330404285714,0.2245339901785676 -As2Ir2_129_1228.vasp,As2Ir2,-3.501381145,0.8254801925000002 -Ti4S4Br4_31_19157.vasp,Ti4S4Br4,-4.06709837,0.1874127816666666 -Ti4O8_11_19152.vasp,Ti4O8,-6.579589205,0.6842653199999997 -K4H12C4S4O16_14_9450.vasp,K4H12C4S4O16,-4.337362440750001,0.1022357757708336 -Tl1Cu1P2O6_149_19252.vasp,Tl1Cu1P2O6,-4.027637171,0.5930031496250001 -Rb1V3Se2O12_143_14763.vasp,Rb1V3Se2O12,-4.651970250555555,0.0920814269444445 -Ir2S2Cl2_59_8815.vasp,Ir2S2Cl2,-2.66550021,0.047462845 -Fe3Hg2S8_10_6056.vasp,Fe3Hg2S8,-1.458408460769231,-0.0545633319230778 -K2Ni2P2_129_9269.vasp,K2Ni2P2,-1.1315648733333334,0.1267774699999999 -Hf2Se1S1I1Br1Cl2_1_7597.vasp,Hf2Se1S1I1Br1Cl2,-3.27011609875,0.2983002167708335 -Ba3Fe2S5I2_123_2110.vasp,Ba3Fe2S5I2,-2.437135033333333,-0.1057106304687525 -Mo2As4_2_11567.vasp,Mo2As4,-2.827779586666667,0.7143146266666665 -Ni1Br2O8_147_13286.vasp,Ni1Br2O8,-1.9764737809090909,0.490700226704543 -Sr2Sb1_25_17309.vasp,Sr2Sb1,-0.3609067633333333,1.0316013188888875 -Be1I2_115_2223.vasp,Be1I2,-1.3136301533333332,0.1106612183333333 -Fe3Ge1S2_187_6050.vasp,Fe3Ge1S2,-1.87324123,0.0632002986666632 -Nb4S6_11_13145.vasp,Nb4S6,-5.071472056999999,-0.1689305605000033 -Au2S4_6_1530.vasp,Au2S4,-0.9742095233333332,0.5729444531249986 -Hf2Se1S1I1Br3_1_7599.vasp,Hf2Se1S1I1Br3,-3.0857386425,0.2966734469270835 -V2Sn2Te6_162_20199.vasp,V2Sn2Te6,-1.741650043,-0.3070142163333331 -Nb2Fe2Se10_51_12717.vasp,Nb2Fe2Se10,-2.7715850800000004,0.3511536935714252 -Mg2Mo2S14_4_10481.vasp,Mg2Mo2S14,-2.671278258333333,0.2041041119444422 -Ta1O2_164_17593.vasp,Ta1O2,-7.04920366,0.3058670286666599 -B2Au2Br2O2_31_1650.vasp,B2Au2Br2O2,-2.39578124375,1.4709005530555506 -Zn4Si4N8_53_21227.vasp,Zn4Si4N8,-4.314146314375,0.723539578125 -Sr2Gd1S3_38_17224.vasp,Sr2Gd1S3,-3.453212733333333,0.0384992333333304 -Ru2Se2Br2_59_15353.vasp,Ru2Se2Br2,-2.0927420016666667,0.3659499269444415 -Cu4S4Cl4F4_14_5452.vasp,Cu4S4Cl4F4,-1.14582790125,0.2206004296507314 -Li4As4O8_14_10156.vasp,Li4As4O8,-4.493627068125,0.0240419150694364 -Fe2W2Se2S12_113_6039.vasp,Fe2W2Se2S12,-2.840895535,0.1335413368981454 -Rb2Cd4Te2Cl6O6_31_14824.vasp,Rb2Cd4Te2Cl6O6,-1.6041091604999995,0.0982240696249997 -Mn7Ga1S4I2Br4Cl2_1_11474.vasp,Mn7Ga1S4I2Br4Cl2,-1.8736340825,0.0395175820689635 -Li1N3_10_9753.vasp,Li1N3,-4.698720775,0.37542198 -V6Se4Cl2O16_1_20396.vasp,V6Se4Cl2O16,-4.302058104285714,0.2310992900793619 -Ti4B3F2_164_19118.vasp,Ti4B3F2,-5.995247236666667,-0.2384717373148204 -Al2Ni2O5_164_901.vasp,Al2Ni2O5,-4.144720735555556,0.0687314388888844 -Al4Sb4_127_1090.vasp,Al4Sb4,-1.733120395,-0.18423747 -Y1B1C1_99_20605.vasp,Y1B1C1,-5.432578846666666,1.060584650277772 -Be2B1O5_5_2240.vasp,Be2B1O5,-5.1650553475,0.722040101588542 -B4Br4_28_1749.vasp,B4Br4,-1.50678577375,1.8196279281944412 -Ga2H10C4Cl4_10_6369.vasp,Ga2H10C4Cl4,-3.501152493,0.4407807405000004 -As1I2_187_1151.vasp,As1I2,-0.4829207466666667,0.4832750744444435 -Ni2S2O6_12_13586.vasp,Ni2S2O6,-3.501812774,-0.1477467110000012 -V4Te12_11_20372.vasp,V4Te12,-2.001464105625,0.1669131268749997 -Na2N4O2_31_12220.vasp,Na2N4O2,-4.54908668125,-0.1433673135416718 -Ta1Bi1S2Br1_1_17511.vasp,Ta1Bi1S2Br1,-3.089524196,0.6158754473333308 -Mn2C1S2_164_11041.vasp,Mn2C1S2,-3.6729147,0.3163793600000004 -Mo2As4S12_1_11566.vasp,Mo2As4S12,-2.93044273,0.5710811918749965 -K2B2H12N4_4_8985.vasp,K2B2H12N4,-4.108245472,0.2170064207499962 -In2Bi2S6_149_8382.vasp,In2Bi2S6,-1.875393227,0.2949661496666648 -Nb4O10_11_13112.vasp,Nb4O10,-6.809451870714286,-0.3422768658928598 -Mn2As2S4F2_26_10975.vasp,Mn2As2S4F2,-2.812668111,0.2423486176250004 -Sr2O8F4_125_17290.vasp,Sr2O8F4,-1.8582945342857144,1.6944490649999966 -Cu2I2_51_5173.vasp,Cu2I2,0.4762491,0.4092058399999996 -Zr2S1Br2N1_1_21637.vasp,Zr2S1Br2N1,-4.2353348550000005,0.3981581733333323 -Zr4B3S2F2_164_21806.vasp,Zr4B3S2F2,-4.459026303636364,0.728458741136359 -Ag1Bi2_10_31.vasp,Ag1Bi2,-0.23623636,-0.1661153183333334 -Mn1Cl2_115_10664.vasp,Mn1Cl2,-1.4390411966666663,0.3567613666666667 -Ti3B2F2_187_19058.vasp,Ti3B2F2,-5.843876827142857,-0.2973845197619154 -N1O2_191_11775.vasp,N1O2,-3.994179033333333,0.7088643024999994 -Tl2V6O16_11_19563.vasp,Tl2V6O16,-5.16174262875,0.0629765783333331 -Ti2B1H2S2_164_18886.vasp,Ti2B1H2S2,-4.85665247,0.4924278487499902 -Te2Au1_164_18363.vasp,Te2Au1,-0.3495349,-0.1671582345833333 -Mg1Al2O4_164_10331.vasp,Mg1Al2O4,-5.555393621428571,-0.0651521214285753 -Fe1Mo1Cl2O4_8_5719.vasp,Fe1Mo1Cl2O4,-3.34170986125,0.159766358776035 -Ga2S5_5_6455.vasp,Ga2S5,-2.734796382857143,0.0996831955357115 -Cd2Te2I2_59_3593.vasp,Cd2Te2I2,0.3017028016666667,-0.0038792052777785 -V2P2S6_12_20140.vasp,V2P2S6,-3.5584095410000005,0.1245516332031244 -Zr4C3S2_164_21815.vasp,Zr4C3S2,-6.239419827777778,0.1531385633333271 -K2Te2F2_1_9370.vasp,K2Te2F2,-1.1408156033333332,0.3680778255555542 -Tc1Te2_164_18223.vasp,Tc1Te2,-3.48501154,0.3719154741666668 -Cu1I1_187_4907.vasp,Cu1I1,0.397665765,0.3306225049999995 -Te4Os2_11_18602.vasp,Te4Os2,-2.6847271266666666,-0.4828534583333335 -Fe2As2Se4Cl2_26_5786.vasp,Fe2As2Se4Cl2,-2.057478244,0.1393980739999982 -Ce1C2_123_3642.vasp,Ce1C2,-5.6030424,0.7712455091666599 -Sc4S4I4_11_16260.vasp,Sc4S4I4,-3.066589870833333,0.2187609208333336 -K2V1Ag1Se4_21_9384.vasp,K2V1Ag1Se4,-1.74122059125,0.144575905625 -Ba3F6_1_2104.vasp,Ba3F6,-3.641379225555556,0.2308315277777772 -Au2F2_129_1477.vasp,Au2F2,0.372087365,1.3459996005555546 -Hf2I6_2_7525.vasp,Hf2I6,-1.9758591725,0.3252584037499997 -Au2C4S8F4_2_1464.vasp,Au2C4S8F4,-3.0034387016666666,0.3676963853472135 -K8Ge4Te16_14_9553.vasp,K8Ge4Te16,-1.374256747142857,0.0601104335714286 -Ti2C1F2_164_18909.vasp,Ti2C1F2,-6.209517316,-0.4823437673333401 -Ag2C2O4_2_219.vasp,Ag2C2O4,-4.1347290575,0.3299993912500003 -Ti3S2N2F2_187_19100.vasp,Ti3S2N2F2,-5.478597344444444,0.1359942520370316 -Ag2Te2_129_460.vasp,Ag2Te2,-0.0861186375,0.2715138054166667 -Nb3Te1F7_156_13023.vasp,Nb3Te1F7,-4.18216095,0.1108829453977248 -Ge1I2_115_6672.vasp,Ge1I2,-0.91391505,0.3049102066666667 -Cr2Si2Te6_162_4510.vasp,Cr2Si2Te6,-2.064127361,0.2051351440000002 -Na1P2Pd1Se6_5_11925.vasp,Na1P2Pd1Se6,-2.318563687,0.2503159634166666 -Sb4Pt4O4_13_15809.vasp,Sb4Pt4O4,-2.792598640833333,0.5586120697499977 -La2P1Br2_164_9602.vasp,La2P1Br2,-3.607490716,0.0400571360000001 -Ag2P4Se3Cl2_6_364.vasp,Ag2P4Se3Cl2,-1.9523266054545452,0.1700908480160962 -K2Pt1C4Br2N4_2_9302.vasp,K2Pt1C4Br2N4,-4.678873813846153,0.2374134912820453 -Bi2Te2S1_164_2563.vasp,Bi2Te2S1,-1.82577755,0.0776222519999996 -Tl1Br2_164_19230.vasp,Tl1Br2,-0.3885105933333333,0.1795431204166667 -Cd2P2S6_162_3527.vasp,Cd2P2S6,-2.287778363,0.0488943509999995 -Mo1Br2N1_8_11497.vasp,Mo1Br2N1,-2.828733485,-0.0480593712499997 -Ba2Cl4_2_1951.vasp,Ba2Cl4,-2.1558176033333334,0.56837778 -Sb2Se1S1I2_1_15688.vasp,Sb2Se1S1I2,-1.54607938,-0.2446821412499998 -Ag4Te4_2_579.vasp,Ag4Te4,-0.16807547,0.1895569729166666 -In2H2Se2S8_11_8464.vasp,In2H2Se2S8,-2.412585851428571,0.2592947254761858 -Cr1Ag1Te2_156_4108.vasp,Cr1Ag1Te2,-0.9317416825,0.2875613756249999 -Ca1Sn2N2_115_2886.vasp,Ca1Sn2N2,-3.335128946,-0.4605356079999968 -Sc2F2_129_16070.vasp,Sc2F2,-2.749099785,0.7891672966666641 -Li1P2Pd1Se6_5_9775.vasp,Li1P2Pd1Se6,-2.463961453,0.2562845877083281 -Zr4Tl4F20_14_21857.vasp,Zr4Tl4F20,-3.764809959642857,0.0386516399999958 -Fe2Bi2Te4Br2_26_5812.vasp,Fe2Bi2Te4Br2,-1.148701057,0.3878380915000001 -Ga2Te2H2O8_11_6502.vasp,Ga2Te2H2O8,-4.075278044285715,-0.3502056980357175 -Ca2I2_129_3054.vasp,Ca2I2,-0.1990043775,0.9144928759999998 -Cu2S2Br1Cl1_1_5241.vasp,Cu2S2Br1Cl1,-0.83900269,0.2660986458134907 -Ta2Se2Br2_59_17869.vasp,Ta2Se2Br2,-3.835425925,0.1776511375000009 -In1Pb1S2I2_1_8303.vasp,In1Pb1S2I2,-1.3791165416666666,0.2512269009201364 -Cd1Sn2Br2O2_12_3427.vasp,Cd1Sn2Br2O2,-2.044915277142857,0.0988323146428555 -V3N2Cl2_187_20280.vasp,V3N2Cl2,-4.461274012857143,0.1644053287301504 -Eu1N2_6_5590.vasp,Eu1N2,-4.89858438,1.3742784383333335 -Cd2Cu2S2F2_26_3491.vasp,Cd2Cu2S2F2,-0.77361004125,0.2156965615625 -V4Ni2P4O20_7_20337.vasp,V4Ni2P4O20,-5.042005893,0.1619267559999899 -Ga1Fe5Cl2_123_6188.vasp,Ga1Fe5Cl2,-0.7253665075,1.0072918354166658 -Tl2Pd4S6_164_19487.vasp,Tl2Pd4S6,-1.8828864858333332,0.1467036166666664 -Mg2Br4_2_10435.vasp,Mg2Br4,-1.2479975583333334,0.289973006111111 -Pt2C4S12_14_14608.vasp,Pt2C4S12,-3.581680818888889,0.2671663119444405 -Ni1Se2_115_13422.vasp,Ni1Se2,-0.9580292466666666,0.5257262666666668 -Ti2S2N1F2_164_18999.vasp,Ti2S2N1F2,-4.738535784285714,0.2298303183333243 -Co2Cl2O2_59_3888.vasp,Co2Cl2O2,-2.8795373916666667,-0.7741250747916699 -Mg2Co2Ge2_129_10441.vasp,Mg2Co2Ge2,-1.7095557149999998,0.3192207733333336 -Rb2C2Se2S6Cl6_1_14796.vasp,Rb2C2Se2S6Cl6,-2.0785554866666667,0.4302235516435154 -La2P1I2_164_9603.vasp,La2P1I2,-3.256076582,0.0516758539999999 -Ca3Ag2S4Cl2_123_3146.vasp,Ca3Ag2S4Cl2,-1.899537223636364,0.1313951067613575 -Re2I6_12_15056.vasp,Re2I6,-906.26046149375,-904.5840097741666 -Cu1Sb3Te6_143_4973.vasp,Cu1Sb3Te6,-1.255675211,0.3211394393333333 -Ag2F6_162_261.vasp,Ag2F6,-0.52105195625,-0.02092967125 -Ta4S2N3F2_164_18101.vasp,Ta4S2N3F2,-6.064927502727272,0.7134702122727228 -Sc1Nb1S2I1Br1_25_15959.vasp,Sc1Nb1S2I1Br1,-3.491932145,0.2227562594444407 -Sb2Au2Se6_2_15547.vasp,Sb2Au2Se6,-1.371265403,0.3129757213333312 -V4N3_164_20335.vasp,V4N3,-5.582997351428571,0.4294829233333277 -Ni4As2_129_13738.vasp,Ni4As2,-0.6017629866666666,1.8021354847839504 -Rb2Cd4S6O2F6_31_14812.vasp,Rb2Cd4S6O2F6,-1.596205655,0.4186305133749965 -Sc2As2Se8_2_16030.vasp,Sc2As2Se8,-2.8242910208333334,0.2916487801388829 -Sc1S2Br1_8_15987.vasp,Sc1S2Br1,-2.994439625,0.3515228460937498 -Cr2Se2Br2_59_4493.vasp,Cr2Se2Br2,-2.0745041483333333,-0.1165721783333333 -Ca2Mn2Sn2_129_3067.vasp,Ca2Mn2Sn2,-0.7996044016666667,0.6372103125862056 -Ca5Ce1_8_3249.vasp,Ca5Ce1,0.3345309166666666,1.2449294808333318 -Zr4S4I1Br3_6_21844.vasp,Zr4S4I1Br3,-3.6920064633333336,0.0432451508333328 -Fe2As1S2_187_5771.vasp,Fe2As1S2,-2.18166095,0.3136087245000002 -Ca2Si2_51_3124.vasp,Ca2Si2,-2.17356217,0.3782681650000001 -B1Cl3_189_1622.vasp,B1Cl3,-2.4769418775,0.0662385275000003 -Nb4Te14Pd2_11_13168.vasp,Nb4Te14Pd2,-2.527456476,0.09660045633333 -V2O5_6_20130.vasp,V2O5,-5.35270562,0.1058729621428566 -W1Se2_164_20456.vasp,W1Se2,-3.562968693333333,-0.1715083233333332 -Si6P6_12_16539.vasp,Si6P6,-4.291541025,0.1050006341666662 -Sr2Br4O8_125_17155.vasp,Sr2Br4O8,-2.576145625,0.1300157654761891 -B3Mo4F2_164_1733.vasp,B3Mo4F2,-4.194112491111111,0.4955425137036997 -As2Cl10_51_1199.vasp,As2Cl10,-0.78045691,0.3492384741666657 -Hf2C1S2_164_7458.vasp,Hf2C1S2,-6.308855408,0.1074186499999916 -Ca4Ni2Cl2O6_129_3230.vasp,Ca4Ni2Cl2O6,-3.4313245078571426,-0.2537018121428659 -P2W2S6_2_14059.vasp,P2W2S6,-3.750092148,0.3389771548593723 -Li2V2F10_4_10118.vasp,Li2V2F10,-3.4074512278571425,-0.0247635045238152 -Sb4I12_14_15777.vasp,Sb4I12,-0.540194905,0.0535169275 -Mn2Bi2Te4Cl2_26_11022.vasp,Mn2Bi2Te4Cl2,-1.369835977,0.321829297137929 -Sr3Mn2S5I2_123_17388.vasp,Sr3Mn2S5I2,-2.457916980833333,0.1258302522222196 -Sc2S18_1_16126.vasp,Sc2S18,-2.8612052545,0.24881721015625 -Zr2Cu4Te6_12_21558.vasp,Zr2Cu4Te6,-1.5718577866666663,0.1706132941666667 -Tl2Bi1Se2_164_19371.vasp,Tl2Bi1Se2,-1.27471457,0.1143374831481471 -Fe2B1Cl2_164_5795.vasp,Fe2B1Cl2,-1.899558228,0.2496915382857102 -Ir2Se2Cl2_59_8836.vasp,Ir2Se2Cl2,-2.3178878183333333,-0.1033668109722258 -Pd2I1Br1_156_14426.vasp,Pd2I1Br1,-0.40594249,0.33644556 -Pb1S2F2_12_14199.vasp,Pb1S2F2,-1.7774226460000002,0.8811245217499999 -As2I10_51_1219.vasp,As2I10,-0.0671535766666666,0.2628042531249996 -H2Pd1_187_7011.vasp,H2Pd1,-2.2245110033333333,1.3009379949999968 -Ga2S2_129_6449.vasp,Ga2S2,-2.5146712025,0.3410552924999996 -V1Cu1O2_156_19813.vasp,V1Cu1O2,-3.8150697125,0.8404878937499998 -Si1Te2_164_16377.vasp,Si1Te2,-2.17563043,0.1952371283333334 -Bi2Te3_164_2571.vasp,Bi2Te3,-1.478525218,0.0888287159999998 -H2Au2O4_2_6989.vasp,H2Au2O4,-2.54108249,0.2110920038541668 -Ag2N4O10_1_334.vasp,Ag2N4O10,-3.81358184875,0.1404086421874999 -In2Sn2Se2_164_8608.vasp,In2Sn2Se2,-1.58310549,-1.1833030766666672 -Ni2Ag1S4_187_13441.vasp,Ni2Ag1S4,-1.4112819142857145,0.0716090389732132 -Ag2B2O2F2_31_180.vasp,Ag2B2O2F2,-2.8595390575,1.0549552826388842 -Nb4Te8Pd4_53_13175.vasp,Nb4Te8Pd4,-2.76597836,-0.1770891064673937 -Th1Rh5_65_18721.vasp,Th1Rh5,-1.007144431666667,2.711118961666663 -Au2N12_31_1495.vasp,Au2N12,-4.9705790585714285,-0.0134595692857155 -V4I16_14_20332.vasp,V4I16,-0.6533438730000001,0.1113861433750004 -Zr1As2H2S6_164_21244.vasp,Zr1As2H2S6,-3.030284614545455,0.5234531351136293 -Li4Fe2P4O14_113_10185.vasp,Li4Fe2P4O14,-4.764294815,0.3699675304861034 -Sn1Au2Cl2O3_6_16610.vasp,Sn1Au2Cl2O3,-1.45649587625,0.5549886376041664 -Li1Ni1Te1Ir6Se1S4I5Br1_1_9768.vasp,Li1Ni1Te1Ir6Se1S4I5Br1,-1.8619403385,0.3856290749131887 -In1Pd5Br2_38_8310.vasp,In1Pd5Br2,-0.8960373225,0.0396601644736833 -Zr2P1Se2_164_21623.vasp,Zr2P1Se2,-4.614673292,0.043252245000001 -Cu2Bi4O8_90_5045.vasp,Cu2Bi4O8,-2.74839166,0.7078538079464235 -In2Cl2_164_8400.vasp,In2Cl2,-1.2127093475,0.1840628559375001 -Mn2Sb2S4F2_26_11241.vasp,Mn2Sb2S4F2,-2.649976026,0.2879828934166647 -Zr3B2S2F2_1_21742.vasp,Zr3B2S2F2,-4.654942616666666,0.4851596022222085 -Cd1Se1_123_3423.vasp,Cd1Se1,0.202393835,-0.18107375 -Cu1Bi1Sb2Te6_143_4854.vasp,Cu1Bi1Sb2Te6,-1.1834404040000002,0.3236363113333315 -Ta3Pd3Se14_6_17978.vasp,Ta3Pd3Se14,-3.076010538,-0.1183546528541682 -Ga1Os1Br6_149_6225.vasp,Ga1Os1Br6,-1.273015575,0.05509238875 -Ba4As4S8Cl4_14_2133.vasp,Ba4As4S8Cl4,-2.9368121115,0.2172281155000002 -Ba3Be3_156_2097.vasp,Ba3Be3,-0.7321508883333333,0.5892182141666668 -Ba2Ag1Te2F2_38_1895.vasp,Ba2Ag1Te2F2,-1.8204770314285716,0.6572983715476146 -Si1Ge1_156_16335.vasp,Si1Ge1,-3.047075515,-0.4655131775000001 -Na1C5S5N2F5_1_11836.vasp,Na1C5S5N2F5,-4.016857971111111,0.3970775388078628 -Cu2Br6_191_5058.vasp,Cu2Br6,0.23530408,0.33515396875 -P4Se4_14_14122.vasp,P4Se4,-2.9508540925,0.1180814021874998 -W2N2_12_20514.vasp,W2N2,-6.64944662,-0.6808691016666666 -Al2Fe2O5_164_834.vasp,Al2Fe2O5,-5.011601735555555,-0.0337600084259304 -Sb6S12F2_4_15860.vasp,Sb6S12F2,-2.3653804195,0.4430097423749974 -Pd2Se2O6_12_14489.vasp,Pd2Se2O6,-3.150392556,0.070146014 -Ni2Ir2Pd1Se5S1_1_13531.vasp,Ni2Ir2Pd1Se5S1,-1.865825498181818,-0.1127874433623029 -Hf2Cl4_11_7478.vasp,Hf2Cl4,-3.500735765,0.1744448491666632 -Cr1Cu4Cl5O6_1_4167.vasp,Cr1Cu4Cl5O6,-1.949609251875,0.0913698159765625 -Ta1Ti3Te8_164_17637.vasp,Ta1Ti3Te8,-3.5490628466666667,0.1105634393055554 -Co1H6C4N14_2_3770.vasp,Co1H6C4N14,-5.7608128412,-1.748683998333339 -Hf1Mn2Mo1Br7Cl1_1_7229.vasp,Hf1Mn2Mo1Br7Cl1,-1.9524611033333332,0.2691375349479129 -Na1Mn1Te2_156_11897.vasp,Na1Mn1Te2,-1.1843267375,0.4941609821982741 -V1Ag1Te6P2_5_19765.vasp,V1Ag1Te6P2,-1.794841692,0.4167183924166654 -K3H8Rh1C4Cl2O12_10_9401.vasp,K3H8Rh1C4Cl2O12,-4.434769954333333,0.1111809717638849 -Ca2C4S4N4_13_2971.vasp,Ca2C4S4N4,-5.404194934285714,-0.1559105381845374 -K6Nb4Cu6S16_13_9541.vasp,K6Nb4Cu6S16,-2.718618205,0.0753241909375002 -Nb2Te6Pt1_12_12929.vasp,Nb2Te6Pt1,-2.752902048888889,0.1214406746296264 -Bi2Sb2Te6_157_2531.vasp,Bi2Sb2Te6,-1.489657771,0.2171720329999998 -Cr1Cu1Te1Se2Br1_1_4161.vasp,Cr1Cu1Te1Se2Br1,-1.3213253216666667,0.2622441708333307 -In1Au3I1Br3O4_1_8205.vasp,In1Au3I1Br3O4,-1.244229085,0.185542487465274 -Pd2Cl2_164_14413.vasp,Pd2Cl2,-0.42601933,0.6425669283333333 -As6C6_2_1381.vasp,As6C6,-5.061531335,0.60222365 -Fe2Se2_129_5977.vasp,Fe2Se2,-0.6181584925,0.765234345 -P1Au3S4_156_13911.vasp,P1Au3S4,-1.32736257875,0.2713335240624997 -Ag2C2S2Br2_31_220.vasp,Ag2C2S2Br2,-1.96333512625,0.67220436359375 -K1Ti1Se2_156_8947.vasp,K1Ti1Se2,-3.1026168075,0.0870588656249999 -In1S2_115_8330.vasp,In1S2,-2.032184303333333,0.5079968157291641 -Si1Cl2_187_16327.vasp,Si1Cl2,-1.8488723933333333,0.4824562449999973 -Cs2Hg4Te2S6Cl6_31_4747.vasp,Cs2Hg4Te2S6Cl6,-0.7506336665,0.2348736002395834 -Co2S4_12_3986.vasp,Co2S4,-2.6778761783333334,0.3128881458333334 -Nb4Ni2Te10_59_13102.vasp,Nb4Ni2Te10,-2.60217301,0.0871042887499977 -Ir2Se4_14_8847.vasp,Ir2Se4,-2.203397445,0.1496893108333337 -Re1O2_187_15016.vasp,Re1O2,-5.744520186666667,0.5026236991666675 -Nb4Pt2Se14_11_13131.vasp,Nb4Pt2Se14,-3.355515876,0.0889334353888862 -Nb1Sb1S2I2_8_12567.vasp,Nb1Sb1S2I2,-2.4735489466666665,0.0604453379166655 -Ru2I2O2_59_15321.vasp,Ru2I2O2,-2.6478328566666667,0.3366791416666641 -Li1Co2O4_156_9678.vasp,Li1Co2O4,-4.075908048571429,0.1063830387499997 -Ni1S2_187_13416.vasp,Ni1S2,-1.6202098066666668,0.2234007837499978 -K2H6C2S8_1_9138.vasp,K2H6C2S8,-3.215051376666666,0.1593167382638787 -Cu2Te2_164_5337.vasp,Cu2Te2,-0.41069377,0.1567867649999999 -Mn2N1Cl2O2_8_11150.vasp,Mn2N1Cl2O2,-3.3249478114285718,0.088112238174596 -Zr2Te1S1I1_1_21697.vasp,Zr2Te1S1I1,-3.472928486,-0.0190863416666684 -Ag2Sb4O12_12_407.vasp,Ag2Sb4O12,-3.562331866666667,0.1790446228472146 -B1Pd2_187_1632.vasp,B1Pd2,-2.29094953,0.4087711166666663 -Th2Te4I4_12_18729.vasp,Th2Te4I4,-2.276522926,0.066244943 -Hf1Cl4_123_7146.vasp,Hf1Cl4,-2.92790502,0.2372936435000001 -Mn1Ga1Cl2O2_1_10717.vasp,Mn1Ga1Cl2O2,-3.3201211550000003,-0.3000705127083405 -Cu4H24C4N8O12_14_5409.vasp,Cu4H24C4N8O12,-4.549228103269231,0.2138383712766978 -Nb2Si2Sb2_129_12892.vasp,Nb2Si2Sb2,-4.412137086666667,0.3315556116666664 -Ta2S6_59_17863.vasp,Ta2S6,-4.67678443125,0.0899996137500007 -Fe1Sb2F12_2_5749.vasp,Fe1Sb2F12,-2.540621166,-0.1621151186666662 -Pd1C8F6_25_14356.vasp,Pd1C8F6,-4.632770002,0.6518666929999961 -Co1Te1S1_156_3833.vasp,Co1Te1S1,-1.9783634966666668,0.3725552912499978 -Nb1Sn1I1Cl1O2_1_12587.vasp,Nb1Sn1I1Cl1O2,-3.7347807816666663,0.3315318338194446 -Tl1Ge1S3_143_19277.vasp,Tl1Ge1S3,-2.100142308,0.5075992406874978 -Na2B2C2S2_31_11968.vasp,Na2B2C2S2,-3.5266027675,1.3740115869444387 -Ti1Ni1S5_6_18813.vasp,Ti1Ni1S5,-2.969422755714286,0.4167763651785678 -Ti4O4F4_31_19148.vasp,Ti4O4F4,-5.840314182499999,-0.0146345658333384 -Nb2Cl4_11_12683.vasp,Nb2Cl4,-3.279257466666667,0.1781677540476137 -Nb2Ni4Te2S2_51_12788.vasp,Nb2Ni4Te2S2,-2.242812609,0.1287014307878758 -Fe1O2_164_5732.vasp,Fe1O2,-3.341170646666667,0.4007704479166634 -Ir2O2_164_8798.vasp,Ir2O2,-3.7137089975,1.0723522450000005 -Cr3H2C2S2_187_4555.vasp,Cr3H2C2S2,-4.088610892222222,0.3954369341666499 -Bi1O2_187_2351.vasp,Bi1O2,-3.0825378666666663,0.6850129792708306 -K1Sn1O2_156_8939.vasp,K1Sn1O2,-2.860004775,0.5138152520312502 -Mn6Sb10I6O18_2_11471.vasp,Mn6Sb10I6O18,-3.43695305575,0.0076153740624991 -Zr2I2Br2_6_21586.vasp,Zr2I2Br2,-1.80328334,0.5382525874999999 -Ta1Nb1I1Br1_6_17569.vasp,Ta1Nb1I1Br1,-3.178810655,1.3671704352130578 -Mo3P2_5_11721.vasp,Mo3P2,-3.498578202,0.2118410932500003 -S4F4_2_15396.vasp,S4F4,-2.10236093125,0.1553743158593752 -Tl2Se4_12_19538.vasp,Tl2Se4,-1.1761361,0.3087460287499984 -Nb2Te6Pd4_11_12928.vasp,Nb2Te6Pd4,-2.3070246933333336,0.105049640833331 -Hg3S1O6_1_8064.vasp,Hg3S1O6,-2.147154455,0.1660867443333336 -Li1Fe1Te6P2_5_9699.vasp,Li1Fe1Te6P2,-1.922744771,0.1984938506666652 -V2Si2Te6_162_20196.vasp,V2Si2Te6,-2.417145134,0.2630386360000002 -Au1F2_187_1424.vasp,Au1F2,-0.0230119833333333,0.7764267674074066 -Ni2F4_14_13503.vasp,Ni2F4,-1.0359170233333332,0.2356287649999999 -Mn2Te4As2I2_10_11317.vasp,Mn2Te4As2I2,-1.517747629,0.2012730069999962 -Sb2Ir2S6_162_15598.vasp,Sb2Ir2S6,-2.999955907,0.0328507490999943 -V1S1Cl1_25_19908.vasp,V1S1Cl1,-3.008575576666667,0.194988751666663 -Al2O2_129_914.vasp,Al2O2,-4.7527724375,0.7541700716666622 -Cd2Cu2Se2I2_26_3496.vasp,Cd2Cu2Se2I2,0.01468838875,-0.1336077688541667 -Ni2C2Br2_59_13485.vasp,Ni2C2Br2,-1.7717183333333333,1.8376065933333277 -Sb1O1F1_156_15470.vasp,Sb1O1F1,-3.21952702,0.458395864791667 -Ti2I2_164_18958.vasp,Ti2I2,-2.92130144,0.7749082487499999 -Cd4Hg4As4Br4_51_3629.vasp,Cd4Hg4As4Br4,0.191168290625,0.1734108962607757 -V1Se1S1_156_19928.vasp,V1Se1S1,-3.42671518,0.0570646281111077 -Ga2O2_123_6418.vasp,Ga2O2,-3.268785215,0.9770292074999998 -V2Cl2O3_5_20031.vasp,V2Cl2O3,-4.196378528571429,0.1149579432142813 -Ni2P2Se5_8_13567.vasp,Ni2P2Se5,-1.9384721377777776,0.2154920628124976 -Ba1Fe4O8_162_1831.vasp,Ba1Fe4O8,-3.6558802084615385,0.2477464297115352 -Cr2C1Se2_164_4345.vasp,Cr2C1Se2,-3.840103404,0.0411829689999967 -Ca2P4H12C4O18_2_3090.vasp,Ca2P4H12C4O18,-4.83768867,0.4703095047499996 -Y2C1Cl2_164_20708.vasp,Y2C1Cl2,-4.929570076,0.0347849360000003 -Mn2Cl6_191_11055.vasp,Mn2Cl6,-1.301902615,0.2149013906250001 -Lu1Si2_123_10299.vasp,Lu1Si2,-3.1419294333333334,0.3955089477777744 -Sb2Pd3O8_164_15656.vasp,Sb2Pd3O8,-3.071330833846154,0.4879600492307654 -Ga1Ge1S3_143_6192.vasp,Ga1Ge1S3,-2.600898808,0.2571449170624967 -Hf1I1Cl1_156_7195.vasp,Hf1I1Cl1,-2.7336125300000003,0.4725350536111075 -Ir2S1Br2_2_8809.vasp,Ir2S1Br2,-1.841935518,0.7146901393333306 -Cu2N12_31_5188.vasp,Cu2N12,-5.20417877,-0.2340477792857154 -Mo2Cl8_1_11603.vasp,Mo2Cl8,-1.685448052,0.0239822570000001 -P42_5_14066.vasp,P42,-3.993462453571429,0.0525335314285717 -Ag4H4Br4O4_14_514.vasp,Ag4H4Br4O4,-1.829981025,0.1564805915104169 -Ga1Rh1Cl2O2_25_6254.vasp,Ga1Rh1Cl2O2,-3.015652991666667,-0.009821865277781 -Co3O4_164_4065.vasp,Co3O4,-3.7530762342857145,-0.7301947633928603 -Ni2Te2S6_12_13666.vasp,Ni2Te2S6,-1.689315792,0.2547846734583316 -Nb4Te10Pd2_59_13161.vasp,Nb4Te10Pd2,-2.805759434375,0.0988912614583275 -Hf1Zr1Te2Se2_1_7405.vasp,Hf1Zr1Te2Se2,-3.4898453616666667,0.4790470283333334 -Te6As4_1_18650.vasp,Te6As4,-1.829366824,0.2841085870000002 -Na6P2H32S8O16_2_12444.vasp,Na6P2H32S8O16,-3.889893780625,0.0550673890104165 -Cu3Pt1Se4Br2_1_5382.vasp,Cu3Pt1Se4Br2,-0.915852319,0.2054838025238087 -Ga1Se2O8_150_6274.vasp,Ga1Se2O8,-3.493595271818182,0.1139881344318107 -Mn1Ga2S4_164_10727.vasp,Mn1Ga2S4,-2.93760636,-0.041298042857143 -Ta1W2O8_1_17641.vasp,Ta1W2O8,-6.299437690909091,0.205743006045437 -Sb2Br2_1_15552.vasp,Sb2Br2,-1.3240643825,0.1696837224999987 -Ru1Se2_187_15296.vasp,Ru1Se2,-2.617174926666667,0.5774255333333334 -Zn2Te6P2_147_21190.vasp,Zn2Te6P2,-1.170903914,0.3160819296666653 -Cd1Ni1H14C16N6_10_3381.vasp,Cd1Ni1H14C16N6,-5.576479665263157,-2.127814800526325 -In4Te4Cl4O12_14_8699.vasp,In4Te4Cl4O12,-3.291115599583333,0.0436317220833299 -Na2Cl2O4_1_12053.vasp,Na2Cl2O4,-2.28113958625,0.0887641368749985 -Ca1C1_123_2814.vasp,Ca1C1,-2.082652885,2.260110618749998 -Sc2O2_187_16114.vasp,Sc2O2,-5.5107790825,0.37992916546875 -Al2Cl2_164_791.vasp,Al2Cl2,-1.929224685,0.4017754391666646 -Ca2Ge4W2O12_13_3025.vasp,Ca2Ge4W2O12,-4.817691905,0.3967112142499953 -Zr1Nb1I2N1O1_25_21343.vasp,Zr1Nb1I2N1O1,-4.727831985,0.1862016734722189 -Ag3Sn1P7_1_502.vasp,Ag3Sn1P7,-2.2734075636363635,0.3942228299999999 -Cr2Cu2P4Se12_13_4370.vasp,Cr2Cu2P4Se12,-2.3831384995,0.0776660533083333 -Mn1Cu1W1Se1S4_6_10698.vasp,Mn1Cu1W1Se1S4,-2.79005755125,0.2615161869999973 -Ga1Te1I7_1_6290.vasp,Ga1Te1I7,-0.2139529466666666,0.0906009888888886 -Sn2Te6As1_157_16899.vasp,Sn2Te6As1,-1.4643139877777778,-0.4247512278703732 -Cs2S6N2_1_4784.vasp,Cs2S6N2,-2.699418368,0.402006854999998 -K2H6C2Se2S6_4_9140.vasp,K2H6C2Se2S6,-3.177841951111111,0.1620932475925826 -Te4S8_14_18629.vasp,Te4S8,-1.9681814608333332,0.3010036576388868 -Rb2Ru2C2S4I8_7_14925.vasp,Rb2Ru2C2S4I8,-1.7092775338888888,0.4616235352777758 -Nb2Ni1O6_12_12772.vasp,Nb2Ni1O6,-5.69682766,0.1307089011111113 -Nb2Se1S1Br4_1_12866.vasp,Nb2Se1S1Br4,-2.84536759,0.2173106733593723 -Hg2S2_129_8000.vasp,Hg2S2,0.1560052825,0.3622186425 -Ge3As2S9_174_6902.vasp,Ge3As2S9,-2.8977543042857143,0.3890411901339252 -Ca2Cu1S2Cl2_123_2998.vasp,Ca2Cu1S2Cl2,-2.0430150842857144,0.142816918333329 -Cd1Ga2O4_164_3309.vasp,Cd1Ga2O4,-3.586963888571429,0.1558987078571427 -Zr2Ge1Se3I2Br2O1_1_21567.vasp,Zr2Ge1Se3I2Br2O1,-2.891953819090909,0.2370214634090851 -As2N2_1_1229.vasp,As2N2,-4.69310148,0.3300551 -Ti1Se2_115_18849.vasp,Ti1Se2,-4.038852583333333,0.4336292716666667 -Hg1H10C4S2_5_7857.vasp,Hg1H10C4S2,-4.148596036470588,0.0589776905514661 -Sb1Se1Cl1_156_15498.vasp,Sb1Se1Cl1,-1.78744145,0.3350256375 -V4Se4I1Br1O1_8_20367.vasp,V4Se4I1Br1O1,-3.147503678181818,0.0598353219047534 -Ta2O5_6_17816.vasp,Ta2O5,-7.064537692857143,0.1810467028571434 -Li1Ni1Te6P2_5_9770.vasp,Li1Ni1Te6P2,-1.735614185,-0.0077131618333331 -As2W2S6_12_1310.vasp,As2W2S6,-3.635629807,0.2518893703749976 -Co1Ni1S2Cl2_6_3788.vasp,Co1Ni1S2Cl2,-1.61424899,0.0449193069270814 -Zr1Br1N1Cl1_156_21266.vasp,Zr1Br1N1Cl1,-3.865644305,0.4364082327083299 -Ru2O2_187_15330.vasp,Ru2O2,-4.0312157825,0.7410559574999998 -Ta2Sn2As2_129_17887.vasp,Ta2Sn2As2,-3.6246178866666665,-0.579560506666669 -Co1Se2_187_3824.vasp,Co1Se2,-1.9993861766666667,0.4823343188888886 -C2Se2_59_2757.vasp,C2Se2,-3.402472115,1.8096848666666665 -Tl2Se2Br2_59_19526.vasp,Tl2Se2Br2,-0.7970621449999999,0.3567422061111102 -Co2Sb4Br4O6_11_4010.vasp,Co2Sb4Br4O6,-2.98697778875,0.0760795757291648 -Li1H3C3N3Cl1O3_156_9720.vasp,Li1H3C3N3Cl1O3,-5.418800092857143,0.1797497792857125 -K2Hg4Br6O8_31_9172.vasp,K2Hg4Br6O8,-1.0226523345,0.2294901901250001 -I8O16_14_8168.vasp,I8O16,-2.2874024470833336,0.0710193723749994 -Ag2N2O2F2_31_331.vasp,Ag2N2O2F2,-2.64809277625,0.0827580306250001 -Nb1H2O2_12_12515.vasp,Nb1H2O2,-5.097651214,1.0239588037500016 -V1Se1I1N1_1_19926.vasp,V1Se1I1N1,-3.1790953025,0.3858731505555537 -Sn12O24_1_16594.vasp,Sn12O24,-3.949708313888889,0.4115109811111108 -Tl2Cu2Se2_129_19404.vasp,Tl2Cu2Se2,-0.749946,0.2817319070370361 -Sc1As2_21_15900.vasp,Sc1As2,-3.0727093933333336,-0.9085324733333356 -Zr3B2H2Se2_187_21737.vasp,Zr3B2H2Se2,-4.330264328888889,0.4680915722222178 -Mn2Co1O6_12_11060.vasp,Mn2Co1O6,-4.136922106666667,-0.1279934770833373 -U2I2N2_129_19714.vasp,U2I2N2,-6.239108155,0.0499715416666672 -Fe4Pb4O12_13_6086.vasp,Fe4Pb4O12,-3.48790271,0.1300482842499966 -Al2I6_26_883.vasp,Al2I6,-0.819249655,0.1625566112499999 -V1O1F1_25_19889.vasp,V1O1F1,-4.520289073333333,-0.0091522122222262 -C4N8_26_2764.vasp,C4N8,-6.6919373025,-0.1425566294444507 -Li2S4Br2_113_10056.vasp,Li2S4Br2,-1.71175307,0.7684581696874999 -Ti2I2_129_18956.vasp,Ti2I2,-3.171718505,0.5244911837500001 -Cu2O5_21_5205.vasp,Cu2O5,-1.5401995442857144,1.311606938749998 -Tl2O2_129_19470.vasp,Tl2O2,-2.119794,0.2881311897916641 -Ta3Se1F7_156_17990.vasp,Ta3Se1F7,-4.577088534545454,0.1590877788181721 -C2Se2_8_2758.vasp,C2Se2,-3.447955995,1.7642009866666666 -Re1Mo1Ru2O8_1_15011.vasp,Re1Mo1Ru2O8,-5.036340789166666,-0.08826379822917 -Ge1W2S1Cl4_25_6724.vasp,Ge1W2S1Cl4,-2.35717854875,0.8317903334375 -Bi2Br6_189_2435.vasp,Bi2Br6,-0.84516534375,0.1461683225 -Fe2Ag1S4_187_5770.vasp,Fe2Ag1S4,-1.8777684628571427,-0.3215709449999995 -Hf1Bi1As1_156_7115.vasp,Hf1Bi1As1,-3.4625992,0.3509149233333299 -Ti6H4O14_1_19175.vasp,Ti6H4O14,-6.407486409583334,0.1169572871527773 -Cr2Bi4_2_4328.vasp,Cr2Bi4,-1.5030802133333332,0.5418260066666651 -Tl2Mo2Pb1O8_164_19453.vasp,Tl2Mo2Pb1O8,-4.197886196923077,0.1452901242307644 -Hf4N1Cl4O3_1_7793.vasp,Hf4N1Cl4O3,-5.679919568333333,0.1821561759374939 -Gd2Se2I2_59_6626.vasp,Gd2Se2I2,-2.8784167666666662,0.0462948966666671 -Os1I2_115_13803.vasp,Os1I2,-0.7842846166666666,0.9243507079166652 -Li1Ag1S1F1_8_9635.vasp,Li1Ag1S1F1,-1.6632889025,0.4185683774218749 -Li1Ta1S2_1_9795.vasp,Li1Ta1S2,-4.280915945,0.6680412899999997 -Nb2Ir1Se1I3Br1_1_12756.vasp,Nb2Ir1Se1I3Br1,-2.32137894625,0.5368792138541618 -Bi2O3_1_2485.vasp,Bi2O3,-3.538651144,0.3193430839999998 -Zr1Nb1Te1I1O1_8_21361.vasp,Zr1Nb1Te1I1O1,-3.892598274,0.5808934413333311 -Sr2Bi4_12_17148.vasp,Sr2Bi4,-0.8611567816666666,0.4468928233333334 -Pd2I4_11_14434.vasp,Pd2I4,-0.156892115,0.1343168524999999 -Sc2Cl2_12_16063.vasp,Sc2Cl2,-2.714726305,0.1288983933333307 -Cr3N2O2_187_4565.vasp,Cr3N2O2,-5.23918864,0.0783197109523698 -Cr1Br1F1_156_4129.vasp,Cr1Br1F1,-2.3557322966666665,0.0254798344444424 -Mn2Te4P2I2_10_11327.vasp,Mn2Te4P2I2,-1.646214582,-0.37348561075 -Li2H6N10O2_51_9947.vasp,Li2H6N10O2,-5.008456979,-1.4079623887500017 -Cs2Hg4Te2O6F6_31_4745.vasp,Cs2Hg4Te2O6F6,-1.577736498,0.3637920731791849 -Cu2Mo1Se4_111_5187.vasp,Cu2Mo1Se4,-1.688546162857143,0.1370150390476172 -Cr2As2S6_157_4309.vasp,Cr2As2S6,-2.956870749,0.3252571623749971 -Na1Ni1As2O6_149_11910.vasp,Na1Ni1As2O6,-3.389763378,0.4165479946249955 -Sr2Th2Br12_51_17328.vasp,Sr2Th2Br12,-2.360205175,-0.009106450625 -Fe3I1Br1O3_1_6057.vasp,Fe3I1Br1O3,-2.5228139125,0.0246473049999962 -Sb1Te2_164_15518.vasp,Sb1Te2,-1.53925522,0.2612971344444428 -Ba2Bi1_164_1916.vasp,Ba2Bi1,-0.71081067,0.4635824288888879 -Mg1Re2O8_147_10394.vasp,Mg1Re2O8,-5.613526868181818,0.0700479209090909 -Ti4P4Se12_2_19154.vasp,Ti4P4Se12,-3.6735994225,0.2374638883749975 -Sb2Pd2O6_162_15650.vasp,Sb2Pd2O6,-3.3258270439999995,0.3809986992500005 -Cu1Ge1Te1Se1_1_4886.vasp,Cu1Ge1Te1Se1,-1.4980347025,0.2229243381249982 -Sr2Bi2S4F2_129_17145.vasp,Sr2Bi2S4F2,-2.992191664,0.064100658 -Cd2Se1I1Cl1O1_1_3567.vasp,Cd2Se1I1Cl1O1,-0.601334865,0.0827570919444422 -Al1O2_25_700.vasp,Al1O2,-4.89983107,0.7626419277083283 -Sr2Mo4Se4O22_13_17279.vasp,Sr2Mo4Se4O22,-4.5679020034375,0.0458686324999995 -Tl1Fe5Br2_123_19266.vasp,Tl1Fe5Br2,-0.11274673125,1.4179408815625 -Ir2F6_12_8785.vasp,Ir2F6,-2.22359119375,0.1239265875000001 -Al2Br2_129_775.vasp,Al2Br2,-1.1381351575,0.7769305608333317 -Ag1Sn1F6_2_131.vasp,Ag1Sn1F6,-1.809310355,0.0480065649999998 -Hf1Te1Se4_10_7322.vasp,Hf1Te1Se4,-3.114241113333333,0.1227328833333276 -Te2As4O12_18_18361.vasp,Te2As4O12,-3.941382450555556,0.2611920252777685 -Hf1Zr1Mo1S3Br5Cl1_1_7383.vasp,Hf1Zr1Mo1S3Br5Cl1,-2.9136621066666666,0.2328585953645754 -Ta1Cl4_123_17527.vasp,Ta1Cl4,-2.672851954,0.2826415260000003 -Te2Os2_129_18427.vasp,Te2Os2,-2.9283248825,0.1951923462499998 -Sn4Sb2S4I6_59_16963.vasp,Sn4Sb2S4I6,-1.425008893125,0.1617259107812494 -Mn4H8C8N12Cl4_14_11439.vasp,Mn4H8C8N12Cl4,-5.2009595825,0.1694820147453603 -V4S12_11_20358.vasp,V4S12,-3.422766975625,0.0910767690624965 -Li2H4N2_67_9941.vasp,Li2H4N2,-4.2589637475,0.0463247068749996 -Rh2F8_1_15191.vasp,Rh2F8,-1.733380195,0.0716600029999998 -Pd1S1Cl1F1_25_14381.vasp,Pd1S1Cl1F1,-1.0855775375,0.5916366480208333 -K2Mn1P2S7F3_1_9237.vasp,K2Mn1P2S7F3,-2.773372039333333,0.1807097309791638 -B2N2_129_1685.vasp,B2N2,-6.6659661975,1.136909545 -Bi2Cl10_51_2441.vasp,Bi2Cl10,-0.8953555091666666,0.1159318583333325 -Ca3Cu2I2O4_123_3168.vasp,Ca3Cu2I2O4,-2.7859424363636367,-0.1213490943573718 -Li2Pb1S6F6_147_10040.vasp,Li2Pb1S6F6,-2.0211172913333333,0.6592302477291615 -Al2Te2_2_1013.vasp,Al2Te2,-2.143217185,0.1625350024999998 -Mn2Sn1O4_25_11291.vasp,Mn2Sn1O4,-4.03871406,0.2079956458128056 -Cd2Sb2S4Br2_10_3557.vasp,Cd2Sb2S4Br2,-1.376233695,-0.3144308014999998 -Cu2I4O12_4_5177.vasp,Cu2I4O12,-2.3297183416666667,0.2063234501388866 -In18Te9_143_8174.vasp,In18Te9,-1.036063043333333,0.7308073433333317 -Na2Hg4Te2S6F6_31_12176.vasp,Na2Hg4Te2S6F6,-1.194357957,0.3149476373645833 -Mg2H8N4O16_14_10467.vasp,Mg2H8N4O16,-4.494467629666668,0.0546962489999991 -Rb2U3I4O20_2_14955.vasp,Rb2U3I4O20,-4.652834092758621,0.109486520344828 -Ag2Te2_59_465.vasp,Ag2Te2,-0.20996687,0.1476655729166666 -Pt1Br2_115_14565.vasp,Pt1Br2,-0.20318062,0.5791115474999999 -As2Se1I3_1_1295.vasp,As2Se1I3,-1.1686719916666666,0.2031040838888868 -K2Bi2P4Se12_4_9004.vasp,K2Bi2P4Se12,-2.266115049,0.1475561009999997 -Ti3Pd1O7F1_1_19098.vasp,Ti3Pd1O7F1,-5.7608827458333325,0.316185415416664 -Zn1Sn2N2_1_21015.vasp,Zn1Sn2N2,-2.673217884,-0.4124297234999998 -Fe2S2Cl2_59_5932.vasp,Fe2S2Cl2,-1.8133094383333332,-0.233827277708335 -Zr1Zn1Br4_6_21490.vasp,Zr1Zn1Br4,-1.3297556,0.1254975358333345 -Nb2Te10Pt2_51_12899.vasp,Nb2Te10Pt2,-2.370249853571429,0.077770889285714 -Te4P2Au2_26_18605.vasp,Te4P2Au2,-1.20610174,0.2725709160763868 -Al1Sb2Au1O6_149_728.vasp,Al1Sb2Au1O6,-3.90882435,0.6394444371249957 -K2Cd4Te2O6F6_31_9069.vasp,K2Cd4Te2O6F6,-1.8602562665,0.4634858566249999 -Mo4S2N3_156_11759.vasp,Mo4S2N3,-4.76573067888889,0.3055074138888836 -Nb2Ni2Se10_51_12781.vasp,Nb2Ni2Se10,-2.6489382892857143,0.1000310922857108 -Dy2As2O8_51_5514.vasp,Dy2As2O8,-5.1544956775,0.3723368924999999 -As3H5O10_2_1314.vasp,As3H5O10,-4.2940352016666665,0.0975171111111112 -K2Cd4Te2S6I6_31_9073.vasp,K2Cd4Te2S6I6,-0.6395130145000001,0.0390503584583312 -Cs2S2N2Cl6O6_4_4777.vasp,Cs2S2N2Cl6O6,-2.773371605,0.1323351419444426 -Mn1Ag1Se2Br2_1_10619.vasp,Mn1Ag1Se2Br2,-1.00755911,0.2395196915972207 -Li2Ni1_187_10022.vasp,Li2Ni1,-0.4707427166666666,0.4518098955555547 -Ta3Pt3S14_6_17979.vasp,Ta3Pt3S14,-3.840673287500001,0.0980712044374896 -Te2Pt1_164_18479.vasp,Te2Pt1,-1.6856351566666667,0.1595522916666665 -Mn2As4_187_10987.vasp,Mn2As4,-2.75163451,1.066331378333333 -Cu2Cl2_51_5082.vasp,Cu2Cl2,-0.1979369625,0.43820659125 -Zr2Te2Cl2_59_21702.vasp,Zr2Te2Cl2,-3.0738353650000003,0.1118149505555521 -Rh2O2_123_15203.vasp,Rh2O2,-2.6514026025,1.2170635312499996 -Pt1F2_164_14572.vasp,Pt1F2,-0.9593034,0.8582975324999973 -W3N2_187_20564.vasp,W3N2,-5.955742264,0.2226211846666603 -Li2V2F12_4_10120.vasp,Li2V2F12,-3.305968000625,0.001918539375 -Bi1S8F1_1_2376.vasp,Bi1S8F1,-2.302108526,0.1720219318124982 -Nb2Te1Se1I2O1_1_12902.vasp,Nb2Te1Se1I2O1,-3.4503863185714287,0.2289238975595204 -Tl3Fe2_123_19575.vasp,Tl3Fe2,1.177997472,1.922554424 -In1Te2_115_8366.vasp,In1Te2,-1.1209977666666666,0.2697425516666639 -Na2H6C2N8O2_51_12113.vasp,Na2H6C2N8O2,-5.2200488435,-2.0138859330416725 -Sb2Te2H2O10_4_15714.vasp,Sb2Te2H2O10,-4.00953839875,0.1145585335677044 -Cr2O6_7_4445.vasp,Cr2O6,-4.63875477375,-0.1859669339062497 -Mo2F4_14_11606.vasp,Mo2F4,-2.803430393333333,0.2909605249999973 -Na2Ge1S6F6_147_12088.vasp,Na2Ge1S6F6,-2.1821989860000004,0.7119911488611113 -Ta1V1F6_123_17639.vasp,Ta1V1F6,-3.90709163875,0.0870014503409054 -P1O2_191_13928.vasp,P1O2,-4.22412705,1.1694331223333303 -Sb3Se2S2I2Br1_1_15758.vasp,Sb3Se2S2I2Br1,-1.621000396,-0.0171072070624998 -Rh2I1Br1O3_1_15192.vasp,Rh2I1Br1O3,-2.237113652857143,0.6522532985863054 -Mg1O2F2_5_10390.vasp,Mg1O2F2,-2.42698863,0.7882522915000001 -Rb2C4S6F6_2_14799.vasp,Rb2C4S6F6,-3.337141967777778,0.1245299981249909 -Te6P2Pd2_162_18668.vasp,Te6P2Pd2,-1.7067273239999998,0.4152690491666654 -Cr1Te2_164_4277.vasp,Cr1Te2,-1.86549271,0.077553428888889 -Hf2Sn2Te8_31_7623.vasp,Hf2Sn2Te8,-2.478953145833333,-0.3763061755555572 -Ga3S1I2_1_6533.vasp,Ga3S1I2,-1.4976975033333335,0.0828077961111093 -V2C2F2_59_20024.vasp,V2C2F2,-4.68841624,0.3868229590123415 -Re2Ni1O8_147_15060.vasp,Re2Ni1O8,-5.033641646363637,-0.0285248615909115 -Mn2C1S2F2_164_11040.vasp,Mn2C1S2F2,-3.021442697142857,0.7823991346428472 -Cu2F2_129_5089.vasp,Cu2F2,-0.558903925,0.8109983949999999 -Pd2F4_2_14423.vasp,Pd2F4,-1.13919348,0.2980557383333331 -Cd2Se4_12_3575.vasp,Cd2Se4,-0.539055695,-0.0253712338888892 -Cu1Bi1Te6As2_143_4856.vasp,Cu1Bi1Te6As2,-1.372169863,0.2684917208333317 -Al2Si4O12_12_992.vasp,Al2Si4O12,-6.117881341666666,0.0287820503472175 -Pb2S6_4_14284.vasp,Pb2S6,-2.32403245375,-0.6785233315625001 -Nb2Ni1Ir1S8_1_12771.vasp,Nb2Ni1Ir1S8,-3.693224765,-0.2579016570833373 -Cu2H8C6Br2N6_2_5144.vasp,Cu2H8C6Br2N6,-4.8172018266666665,0.2332010568749953 -Sn1P2Se4_164_16666.vasp,Sn1P2Se4,-2.503601762857143,0.1628201784821401 -Mo3O8_8_11719.vasp,Mo3O8,-4.9640647990909095,0.2455077898484798 -Os2S2_187_13870.vasp,Os2S2,-3.8036304825,0.8920696243749999 -In1Si1Se1Cl1_8_8348.vasp,In1Si1Se1Cl1,-1.8087186375,0.3910059143750001 -Zr4C3F2_164_21812.vasp,Zr4C3F2,-6.188427494444444,-0.0151369541666845 -Cs2Br2O6_11_4665.vasp,Cs2Br2O6,-2.280413625,0.1572876327500005 -Ta2C1Se2_164_17680.vasp,Ta2C1Se2,-6.226126164,0.02780657 -Si2F2_164_16401.vasp,Si2F2,-3.695613865,-0.1679006231249997 -Cd1Se1_156_3424.vasp,Cd1Se1,0.0745209,-0.308946685 -Ti1Ga1Te1Br1_8_18781.vasp,Ti1Ga1Te1Br1,-2.58222352,0.0890746532371768 -Cd1S2_115_3418.vasp,Cd1S2,-0.64477467,0.7221294039583321 -Fe1H4C2N4Cl2_47_5694.vasp,Fe1H4C2N4Cl2,-4.585690936923077,0.103980017499991 -Hf1V2I2O4_1_7362.vasp,Hf1V2I2O4,-4.7704277033333335,0.2337579331481434 -V1Cr1Se1S1N1_25_19809.vasp,V1Cr1Se1S1N1,-4.249764588,0.1584826470000004 -Ta2Pd2Se10_51_17828.vasp,Ta2Pd2Se10,-3.028550437142857,-0.1018310916071456 -Nb3H2C2O2_187_12973.vasp,Nb3H2C2O2,-6.266011612222222,0.2925557479563445 -Li2Sn1H6S6_147_10069.vasp,Li2Sn1H6S6,-3.0510291940000003,0.0861827414999998 -Ir3Se3S1Br2_1_8858.vasp,Ir3Se3S1Br2,-2.19250105,0.1148777542129593 -P16I4_10_13908.vasp,P16I4,-3.134034642,0.0406306710000001 -Pd4Pb12_10_14521.vasp,Pd4Pb12,-0.930912735625,0.3501125481249991 -Nb2Pd2S10_51_12814.vasp,Nb2Pd2S10,-3.385966645714286,-0.0328680290625034 -Sc1Se2_164_15998.vasp,Sc1Se2,-3.241771333333333,0.4337559972222198 -Nb4O8_2_13119.vasp,Nb4O8,-6.6805737775,0.3049364287500005 -Te2Ru2_25_18521.vasp,Te2Ru2,-2.1528305925,0.8624019312500002 -Cr3S2Br3Cl1O1_1_4577.vasp,Cr3S2Br3Cl1O1,-2.519283332,-0.0310225228333381 -Cr3O8_12_4571.vasp,Cr3O8,-4.746068397272727,-0.1936783716477315 -Au2Br2N2_59_1449.vasp,Au2Br2N2,-1.0150857133333333,0.6301712166666653 -Cu3As1S4_156_5371.vasp,Cu3As1S4,-1.354747705,0.5023838924999999 -Cr2Sn2S6_162_4511.vasp,Cr2Sn2S6,-2.684172574,0.3795274384999964 -Sc2Se1S1Cl2_25_16152.vasp,Sc2Se1S1Cl2,-3.5939805066666666,0.0564088211111075 -S5N6_5_15400.vasp,S5N6,-4.269526738181818,-0.0611696716477299 -Mg2H8C10N4O10_4_10465.vasp,Mg2H8C10N4O10,-5.761528899411765,0.2002593740168798 -Fe2Sb2Te4Cl2_26_5963.vasp,Fe2Sb2Te4Cl2,-1.446132593,0.2045222565999983 -Zr2I6_2_21598.vasp,Zr2I6,-1.6255246775,0.1245464724999998 -Au2Cl2_51_1470.vasp,Au2Cl2,0.38875578,0.2399890362499999 -Sn1Ge1P2S6_1_16634.vasp,Sn1Ge1P2S6,-3.09823496,0.0809885312421842 -Tl2P2O6_1_19478.vasp,Tl2P2O6,-4.272204606,0.4111563332500001 -Hf1V1Te2N1_156_7359.vasp,Hf1V1Te2N1,-4.520710729999999,0.2078763660000011 -Hg2Pd4S6_164_7986.vasp,Hg2Pd4S6,-1.244296625,0.2311953883333319 -Ba2H8O6_11_1995.vasp,Ba2H8O6,-4.2952278425,0.1186006874999998 -Ta1Nb1Zn1I1N2Cl1O1F1_8_17579.vasp,Ta1Nb1Zn1I1N2Cl1O1F1,-4.512122986666666,0.26781103640507 -Ta3Te1F7_156_17997.vasp,Ta3Te1F7,-4.456694573636363,0.1549207789090823 -Os2I8_14_13855.vasp,Os2I8,-0.630711247,0.2419615604999998 -Cu2Hg2Te2Cl2_26_5163.vasp,Cu2Hg2Te2Cl2,0.12237763625,0.1747972662499986 -Ag2Te2Cl2_59_455.vasp,Ag2Te2Cl2,-0.3429662083333333,0.2049400162499995 -Ca3Au2S4Cl2_123_3153.vasp,Ca3Au2S4Cl2,-1.8907780009090909,0.1559941840909052 -Mn2As2I2O4_10_10967.vasp,Mn2As2I2O4,-3.097698762,0.1175482022631506 -Os1Se2_187_13826.vasp,Os1Se2,-2.98185245,0.5627688100000001 -Cu3Mo3O12_1_5376.vasp,Cu3Mo3O12,-3.9981879016666655,0.0863795397222224 -Cs4Ag4O4_123_4803.vasp,Cs4Ag4O4,-0.8931105083333333,0.3446052525 -V2W2S10_85_20229.vasp,V2W2S10,-3.463268755,0.461469949107139 -Ac1Se3_191_1.vasp,Ac1Se3,-2.3403958025,0.8970584658333336 -Bi8Te4O20_39_2699.vasp,Bi8Te4O20,-3.77979748625,0.057868396875 -V1S2_47_19916.vasp,V1S2,-3.2229385133333337,0.5320203199999995 -Mn2Bi2Te4I2_26_11025.vasp,Mn2Bi2Te4I2,-1.122544822,0.3113226782758621 -Sr2Cu2Bi2O8_123_17212.vasp,Sr2Cu2Bi2O8,-3.30043034,0.2821883878571403 -Mg2P1_164_10493.vasp,Mg2P1,-1.4405690333333334,0.5003119642361105 -Mn2Bi2I2O4_26_11003.vasp,Mn2Bi2I2O4,-2.813435005,0.2656052762284467 -B2Cl6_12_1662.vasp,B2Cl6,-2.42793668125,0.1152437237500003 -Sn2Br1Cl1O2_8_16739.vasp,Sn2Br1Cl1O2,-2.7278300766666668,0.1583544220833332 -Al1Tl1Hg1Se4_156_757.vasp,Al1Tl1Hg1Se4,-1.3796679685714286,0.0846688097619026 -Y1Au1I1Br1_6_20604.vasp,Y1Au1I1Br1,-1.7349027525,0.2858217749999983 -Nb2C1S2F2_164_12663.vasp,Nb2C1S2F2,-4.551082204285715,0.7893154466666554 -Hg1S1Br1F1_156_7904.vasp,Hg1S1Br1F1,-0.40073012,0.2998934448611074 -Li1Al1Sb2Te6_5_9648.vasp,Li1Al1Sb2Te6,-1.674969891,0.3096845476666651 -Au3Se1S1Br2_1_1564.vasp,Au3Se1S1Br2,-0.22934174,0.1724907787499993 -Fe3Ge1Te2_187_6052.vasp,Fe3Ge1Te2,-1.3061816316666668,0.1457862533333318 -Re6Br18_164_15120.vasp,Re6Br18,-2.191749005,0.061126004583333 -Bi4Cl16_13_2609.vasp,Bi4Cl16,-1.012448029,0.1604417754999998 -Co2S2_129_3980.vasp,Co2S2,-2.482900365,0.2575849385416644 -Sn2As2C2O6F6_7_16714.vasp,Sn2As2C2O6F6,-3.782705115,0.438151916666652 -Ag2I2_129_315.vasp,Ag2I2,0.42087067,0.0733973649999999 -Te2Rh2F2_59_18500.vasp,Te2Rh2F2,-1.9417328783333327,0.2851608982638869 -Ga2Ge2Te2_164_6367.vasp,Ga2Ge2Te2,-2.291480901666666,-0.278355549444446 -Ir1Au1Br2O2_6_8724.vasp,Ir1Au1Br2O2,-1.7689773233333332,0.4620788443750003 -Sb8Se20_2_15878.vasp,Sb8Se20,-2.060589762142857,0.2849925602380934 -Rb2H6C2S8_1_14851.vasp,Rb2H6C2S8,-3.20884173,0.1801628198958206 -Rb2Mn2P2_129_14900.vasp,Rb2Mn2P2,-2.0111057233333334,-0.0484419116666685 -Al1Cu1As2Se6_149_638.vasp,Al1Cu1As2Se6,-2.151995798,-0.097603168166669 -Si1Se1_156_16365.vasp,Si1Se1,-2.972235365,0.1193707351562501 -Zr1Ti1Br1Cl1O2_1_21467.vasp,Zr1Ti1Br1Cl1O2,-4.981925641666667,0.3488044730786974 -Pr1Si5_47_14537.vasp,Pr1Si5,-3.585769168333333,0.0227619041666664 -Zn2P2H6C4O8_31_21129.vasp,Zn2P2H6C4O8,-4.33436336909091,0.6443838255492365 -K2Nb2Cl12_1_9260.vasp,K2Nb2Cl12,-2.18683645125,0.0697868793749998 -Fe2O2_123_5893.vasp,Fe2O2,-2.5500131075,0.9957122310416646 -V3O8_5_20286.vasp,V3O8,-5.25843802,0.104621708238632 -B6Au1C6S2F4_6_1771.vasp,B6Au1C6S2F4,-4.595370803684211,0.9897283084795166 -Ta4Pt6Se10_59_18095.vasp,Ta4Pt6Se10,-3.4502616765,-0.0883954402916693 -Mn2W2Se2S12_8_11347.vasp,Mn2W2Se2S12,-3.019418966111111,0.4299241599537006 -Ni3As6_157_13695.vasp,Ni3As6,-1.8539470244444445,0.2810185613888891 -Mg2Fe8O18_2_10455.vasp,Mg2Fe8O18,-3.497407720714285,0.2681143824999936 -W2S2F2_59_20528.vasp,W2S2F2,-4.071444081666667,0.2768339370833297 -Bi2Se2I1Br3_1_2541.vasp,Bi2Se2I1Br3,-0.99386156125,0.3114347416666666 -Sn2Sb2H6S6N2_7_16860.vasp,Sn2Sb2H6S6N2,-3.334395931111111,0.1380553918402672 -Na2H2O2_4_12100.vasp,Na2H2O2,-3.638518745,0.0491820899999995 -Si6Bi6_12_16528.vasp,Si6Bi6,-2.477494374166666,-0.7489858516666665 -Sn3As2O9_174_16907.vasp,Sn3As2O9,-4.073565397857143,0.3319461389285671 -Y2S1I2O1_6_20769.vasp,Y2S1I2O1,-4.340158535,0.2521324016666668 -Li4Cu4F14_2_10182.vasp,Li4Cu4F14,-2.057702226818182,-0.0277567395454573 -Hf3B2Cl2_187_7676.vasp,Hf3B2Cl2,-5.374599904285715,-0.1553613171428622 -Sm1Si2_123_16558.vasp,Sm1Si2,-3.21032615,0.8877903416666628 -In8S6_31_8717.vasp,In8S6,-1.935805237142857,0.3797110642857122 -Re2I8_14_15057.vasp,Re2I8,-1.045123901,0.2197832810416671 -U2Se4O14_1_19725.vasp,U2Se4O14,-5.1708436485,0.0652647549999994 -Rh2Br2O2_59_15173.vasp,Rh2Br2O2,-2.494235498333333,0.2147075863888865 -K2Ni2Bi2_129_9268.vasp,K2Ni2Bi2,0.170822995,2.326431995208331 -Mn5Se2Br2Cl5O2_1_11462.vasp,Mn5Se2Br2Cl5O2,-2.22172373625,0.0067069747098185 -In2H10N4Cl4_10_8457.vasp,In2H10N4Cl4,-3.648651886,0.1069838213124941 -Bi1H1S8_1_2334.vasp,Bi1H1S8,-2.442995689,-0.0241288422499996 -Au1Br2_187_1413.vasp,Au1Br2,0.5260444466666666,0.3438147587500001 -In1Sn1I1Br1O2_1_8358.vasp,In1Sn1I1Br1O2,-2.457264336666667,0.1609202356944399 -As2F6_12_1210.vasp,As2F6,-2.51432824625,0.3259587531250001 -Al2V1Se4_164_1032.vasp,Al2V1Se4,-2.9547488257142858,0.1390266989285685 -Dy2Bi2S4O2_129_5516.vasp,Dy2Bi2S4O2,-4.167848287,-0.495932032958338 -Hg2H4Se2O8_31_7967.vasp,Hg2H4Se2O8,-3.144214025625,0.0468966388541667 -Li2Ti1F6_12_10087.vasp,Li2Ti1F6,-3.894722546666667,0.2938706638888892 -Sc1Cu1As2S6_149_15922.vasp,Sc1Cu1As2S6,-2.849760767,0.4330650642916615 -Pd1O2F2_164_14373.vasp,Pd1O2F2,-1.48984049,0.7171609353333307 -Pt1O1F1_25_14582.vasp,Pt1O1F1,-2.2333196766666665,0.1887385341666649 -Ti2V2S4I4_2_19054.vasp,Ti2V2S4I4,-3.247654839166667,-0.3654472897916732 -Ge2Te1_156_6880.vasp,Ge2Te1,-2.0826769,-0.3828574750000015 -Li1I1_123_9724.vasp,Li1I1,-1.593234885,0.2430020225 -Cu4P4O14_13_5438.vasp,Cu4P4O14,-4.269918145909091,0.0893848948484814 -Cd2Cl2_1_3485.vasp,Cd2Cl2,0.8040173975,0.4041136087500001 -Ta2Br2_164_17668.vasp,Ta2Br2,-4.0709017125,0.7082861473214215 -Al2S2Cl2_31_935.vasp,Al2S2Cl2,-3.03036423,0.019806205 -Al2Zn1S4_164_1035.vasp,Al2Zn1S4,-2.891680175714286,0.0181784192857139 -V2S1I1_156_20151.vasp,V2S1I1,-2.560787225,0.3701892257886865 -Ta4Pd4Se8_53_18089.vasp,Ta4Pd4Se8,-3.52443511625,0.0525361137499937 -Nb2Fe2S10_51_12716.vasp,Nb2Fe2S10,-3.368143137857143,-0.0397976008035773 -K4Cl4O8_11_9433.vasp,K4Cl4O8,-1.898555078125,0.493164631875 -Co2S2F2_59_3978.vasp,Co2S2F2,-2.556811315,0.0959331283333333 -Si2Se2Br2_59_16446.vasp,Si2Se2Br2,-2.266438216666667,0.198415915937498 -Hf1As2_187_7109.vasp,Hf1As2,-4.17815,-0.5406165783333328 -Tl2S3_164_19509.vasp,Tl2S3,-1.550631754,0.2496041507499977 -Ga2Se5_1_6487.vasp,Ga2Se5,-2.2043954785714286,0.2100240109523787 -Nb1I2_164_12522.vasp,Nb1I2,-1.9483009933333333,0.4140021416666635 -Si1Cl2_115_16328.vasp,Si1Cl2,-1.7679482866666667,0.5633803516666639 -Al2Si2S2_164_984.vasp,Al2Si2S2,-3.7304761966666655,-0.3870432173611141 -K2Mg1Te2H4O8_2_9226.vasp,K2Mg1Te2H4O8,-3.7595871111764714,0.0905512647548982 -Te1As1O6_38_18282.vasp,Te1As1O6,-3.636341165,0.3411945046093747 -Tl18Se9_143_19194.vasp,Tl18Se9,-0.9055428322222222,0.1767428122222222 -Te2Pb2Cl2_59_18451.vasp,Te2Pb2Cl2,-1.237564225,0.1529708611111095 -Os2Se2_187_13885.vasp,Os2Se2,-3.15315948,0.9774184425000004 -In1Bi1_187_8209.vasp,In1Bi1,-0.41163821,0.1438640525 -Cr2Mo2Se8_25_4421.vasp,Cr2Mo2Se8,-2.852530065,0.0534193541666669 -As2Cl8_1_1207.vasp,As2Cl8,-0.977398222,0.3375812024999999 -Nb2Cl10_2_12673.vasp,Nb2Cl10,-2.3783217366666665,0.09514331 -Sn2B2Sb2H6O6_7_16737.vasp,Sn2B2Sb2H6O6,-3.9094790655555554,0.5748326411805488 -Al2Se2Cl2_59_962.vasp,Al2Se2Cl2,-2.601547463333333,0.0904270916666667 -Nb4Ni8Te8_51_13111.vasp,Nb4Ni8Te8,-1.795384088,0.0721939321249978 -Mo1Cl2_12_11505.vasp,Mo1Cl2,-1.8938467433333332,0.4039894644444444 -Te8As2Pt3_164_18688.vasp,Te8As2Pt3,-1.5358853746153849,0.5888545445512774 -V2H2O5_12_20077.vasp,V2H2O5,-5.110329708888889,0.110366745092588 -Mn1I2_164_10770.vasp,Mn1I2,-0.6702061333333332,0.0576656850000001 -V1W2S4_8_19961.vasp,V1W2S4,-4.3669724542857145,-0.1093067588095278 -W2Se2Cl2_59_20543.vasp,W2Se2Cl2,-3.1217696,0.0940581199999964 -V1Te2_191_19943.vasp,V1Te2,-1.34493074,1.0223103177777777 -Sr2Au1Se2Br2_38_17132.vasp,Sr2Au1Se2Br2,-1.507252152857143,0.1995214278571396 -Rh1I2_164_15156.vasp,Rh1I2,-0.57794122,0.312647519999999 -Cr1F2_115_4168.vasp,Cr1F2,-2.9640548666666664,0.3215922466666641 -Ta2C1O2_164_17677.vasp,Ta2C1O2,-7.717176544,0.027963263999994 -Ti2Se6_59_19028.vasp,Ti2Se6,-3.7795781775,0.0687784204166634 -Sr1Sb2F12_2_17080.vasp,Sr1Sb2F12,-2.7900037686666668,-0.0122334573333335 -W1F2_12_20432.vasp,W1F2,-3.2197805966666664,1.0041767908333297 -Sb1_191_15528.vasp,Sb1,-1.3921314,0.8914356724999999 -Zn2Cl2_164_21058.vasp,Zn2Cl2,0.3504418075,0.20137837359375 -Zr3H2N2_187_21767.vasp,Zr3H2N2,-5.786669771428572,-0.0450363971428622 -Co4Te2Cl4O6_2_4090.vasp,Co4Te2Cl4O6,-2.7185654425,-0.0706920997656253 -Ag2Br4O12_4_206.vasp,Ag2Br4O12,-1.8779576288888888,0.3380940863888872 -Ni3O2F4_8_13705.vasp,Ni3O2F4,-1.7556212077777775,-0.1291616281944459 -Ag2P2O4_26_347.vasp,Ag2P2O4,-3.43728316625,0.4301386850227264 -Hg1B4N2Cl2F4_10_7838.vasp,Hg1B4N2Cl2F4,-3.864884419230769,0.3942202159327989 -Hf1Mn1Te2O1_8_7225.vasp,Hf1Mn1Te2O1,-3.777176116,0.4220450807758632 -Fe1B4H4C2F2_47_5626.vasp,Fe1B4H4C2F2,-4.1426276,0.6396916160042636 -In3P2S6Br3_1_8651.vasp,In3P2S6Br3,-2.234343662857143,0.1954370517857068 -Sn1Mo1S4_3_16655.vasp,Sn1Mo1S4,-2.743351581666667,0.4462752608333331 -K2H2N2O6_1_9123.vasp,K2H2N2O6,-3.833860173333333,0.3273775582777702 -Hf1Cd1Br2O2_1_7133.vasp,Hf1Cd1Br2O2,-3.64039858,0.2632903045833337 -Mn2As2Se4I2_26_10984.vasp,Mn2As2Se4I2,-1.890792556,0.1054741977499973 -Te1Mo1Ir1S2I2_1_18297.vasp,Te1Mo1Ir1S2I2,-1.9078316942857143,0.4491276336688266 -Nb1Ni1Te1I1_1_12544.vasp,Nb1Ni1Te1I1,-1.5283249575,0.5389692564508892 -Cu1Br2_115_4863.vasp,Cu1Br2,0.0044938533333333,0.1397820683333333 -Cu1Ag1Sb1I1Br1N1_1_4826.vasp,Cu1Ag1Sb1I1Br1N1,-1.1392910616666667,0.4298278420833283 -Li1Ni1Sb2Te6_5_9767.vasp,Li1Ni1Sb2Te6,-1.317036321,-0.1856897136666682 -Mg4Cl8O4_14_10574.vasp,Mg4Cl8O4,-2.230958696875,0.1586029109374995 -As2P2Se6_8_1242.vasp,As2P2Se6,-2.484170251,0.2772153097083311 -Se4O8_14_16301.vasp,Se4O8,-3.45775027,0.0622992691666666 -K4Pt2N6Cl6O12_11_9498.vasp,K4Pt2N6Cl6O12,-3.414225821,0.0927095200000001 -Ba4P4S8Cl4_14_2170.vasp,Ba4P4S8Cl4,-3.10313511,0.1599238014296843 -Si6N6_2_16533.vasp,Si6N6,-6.151637151666667,-0.6861295529166664 -As4P2O12F2_4_1345.vasp,As4P2O12F2,-4.2801809815,0.3866025224166629 -Li4Mo2P8O26_2_10203.vasp,Li4Mo2P8O26,-5.44831639425,0.0591827007999943 -Sb1As1_156_15432.vasp,Sb1As1,-2.54218841,-0.69918126 -Nb2S2Br2_59_12834.vasp,Nb2S2Br2,-3.932664918333333,-0.0578204419047698 -Ti1Cl4_123_18761.vasp,Ti1Cl4,-2.6090276500000003,0.2107494579999995 -Ti1Ge1S2I2_6_18784.vasp,Ti1Ge1S2I2,-3.004748273333333,0.1693220283333327 -Tl2Te6As2_2_19558.vasp,Tl2Te6As2,-1.290926524,0.2868572673333317 -Nb4C3O2_164_13045.vasp,Nb4C3O2,-7.455487124444444,0.041114232083327 -Ta2Cr2S10_11_17714.vasp,Ta2Cr2S10,-4.123260415,0.0850218421428543 -K2Hf1H6O6_147_9165.vasp,K2Hf1H6O6,-4.535368781333333,0.0836080163333339 -Cu2Ag1S2I2_1_5004.vasp,Cu2Ag1S2I2,-0.4808727457142857,0.1496381648299319 -Re4Cl14_13_15104.vasp,Re4Cl14,-2.3261173844444443,0.8898713327777752 -Sb2S2I2_59_15678.vasp,Sb2S2I2,-1.7369165316666668,-0.7332653950000001 -Tl1Sn2_123_19349.vasp,Tl1Sn2,-0.59125943,-2.4003143933333315 -Na2H6C4S6_2_12117.vasp,Na2H6C4S6,-3.99803764,0.1066506165277683 -Zr4N3F2_164_21831.vasp,Zr4N3F2,-6.294924543333334,0.0515995638888973 -Sb4Mo2O12_4_15778.vasp,Sb4Mo2O12,-4.619835778888889,0.1165375530555561 -Cu2S4_14_5261.vasp,Cu2S4,-1.52184514,0.259052267569443 -K2Cu2Pd2Se10_11_9089.vasp,K2Cu2Pd2Se10,-1.407417195,0.2002966568749999 -Cl4O12_2_3693.vasp,Cl4O12,-2.25972758125,0.3089640615625004 -Ta1Te1O1_156_17623.vasp,Ta1Te1O1,-5.12677665,0.3967823651111021 -Zr4Se4Cl4_31_21848.vasp,Zr4Se4Cl4,-3.4787873050000004,0.16784950333333 -K2Ru2C2O2F10_11_9317.vasp,K2Ru2C2O2F10,-3.2851084766666663,0.1239066541666579 -Nb3Se1S3Br3_1_13014.vasp,Nb3Se1S3Br3,-3.684907063,0.2151338567812502 -Hf1Bi2S1I1Br1_1_7120.vasp,Hf1Bi2S1I1Br1,-2.3025433766666668,0.1265858564583317 -Sm2I6_162_16577.vasp,Sm2I6,-1.60835048125,0.0577915312499999 -Ba2Cu1Se2F2_38_1972.vasp,Ba2Cu1Se2F2,-2.2825729871428573,0.5203782071428542 -Tl3Rh1_187_19579.vasp,Tl3Rh1,-0.015798425,0.5954493750000001 -Cd1S1Cl1F1_156_3408.vasp,Cd1S1Cl1F1,-0.8295603425,0.4074207448437501 -Hf1Zr1S2I2_25_7391.vasp,Hf1Zr1S2I2,-3.699419251666667,-0.0272773154166694 -Re1Cl2_164_14998.vasp,Re1Cl2,-2.550422283333333,0.7388970440740711 -Mn2H2O4_11_11093.vasp,Mn2H2O4,-4.4810796625,0.1887644043749958 -Mn2W2S8Br2_129_11342.vasp,Mn2W2S8Br2,-2.703797266428571,0.5820525695535661 -Zn1S1I1_1_21002.vasp,Zn1S1I1,-0.2328880066666666,0.4423072391041646 -Mn2Se1I1Br1O1_6_11269.vasp,Mn2Se1I1Br1O1,-2.161618058333333,0.0509019301190442 -Cu1Sb1S2I2_6_4965.vasp,Cu1Sb1S2I2,-1.10014256,0.0209658055034699 -Si2Te2_31_16458.vasp,Si2Te2,-2.457626625,0.0680613062499997 -In1Pd1Se2_1_8308.vasp,In1Pd1Se2,-1.6032475225,0.2378758780357124 -In2S4_2_8560.vasp,In2S4,-2.0485802200000003,0.491600899062497 -Hf6O6_129_7828.vasp,Hf6O6,-7.1006007816666665,0.2062009940151448 -Ca2Te2Au1F2_38_3133.vasp,Ca2Te2Au1F2,-1.6576257714285716,0.579390633571425 -Co2Sb2Te4I2_10_4008.vasp,Co2Sb2Te4I2,-1.234960277,0.3326400211333318 -Sn2P2Se6_147_16823.vasp,Sn2P2Se6,-2.385816813,0.1195997069999998 -Ga1Cu1As2S6_149_6160.vasp,Ga1Cu1As2S6,-2.432620012,0.5050457541874974 -Hg1H4C4Br2N2_10_7874.vasp,Hg1H4C4Br2N2,-4.414372152307693,0.2023608538461394 -Li2H6Pb1S6_147_9949.vasp,Li2H6Pb1S6,-2.9344932146666665,-0.0616004840416681 -Zn2Ni4O10_11_21126.vasp,Zn2Ni4O10,-2.31203383,-0.0092660328124997 -Tl4Hg6Se8_13_19608.vasp,Tl4Hg6Se8,-0.1161882372222222,-0.2834295324074073 -Mn2Te2Mo2S12_113_11300.vasp,Mn2Te2Mo2S12,-2.619162701111111,0.5128867703240712 -Ge1B1H2_156_6641.vasp,Ge1B1H2,-3.6503383175,0.3387172358749952 -Sb1I2_115_15460.vasp,Sb1I2,-0.2603548566666666,0.521118669166666 -K2Mg2Sb2_129_9230.vasp,K2Mg2Sb2,-0.9179764016666666,0.105859845 -Cr1As2_164_4114.vasp,Cr1As2,-3.0833628833333333,0.2572651991666634 -K2Mo4Cl14O4_13_9244.vasp,K2Mo4Cl14O4,-2.3339966325,0.0839764020833335 -Rb2Os2C2S4I8_7_14908.vasp,Rb2Os2C2S4I8,-1.8782472844444444,0.5204451105555532 -Tc2O4_2_18233.vasp,Tc2O4,-6.3038177016666666,0.183276946666667 -Re2Pd1S8_2_15073.vasp,Re2Pd1S8,-3.4333888554545453,0.3693048860227219 -Sn1Se1S1_156_16691.vasp,Sn1Se1S1,-2.2744574966666664,0.1051461100000001 -Ba1Te2_115_1868.vasp,Ba1Te2,-1.0550549633333333,1.0660371338888872 -Mn2Ga2O5_38_11073.vasp,Mn2Ga2O5,-4.427629873333333,-0.1335061847222265 -Mn1Ag1S1I2O1_1_10615.vasp,Mn1Ag1S1I2O1,-1.409497745,0.2720370714843753 -Hf2C4_129_7471.vasp,Hf2C4,-6.303347745,1.7393262594444376 -Zr4B3F2_164_21801.vasp,Zr4B3F2,-5.213473495555555,-0.0499386686111148 -Ba4Fe2I2O6_129_2152.vasp,Ba4Fe2I2O6,-3.490939248571429,0.0348005312499961 -Hg2Te2I2_59_8032.vasp,Hg2Te2I2,0.5085057833333334,0.2214060428472214 -Hf2Sc1Se1Br4Cl1O1_1_7590.vasp,Hf2Sc1Se1Br4Cl1O1,-3.556528717,0.1732216196875001 -Zr1Se2_123_21444.vasp,Zr1Se2,-3.64565412,0.4444987208333333 -Ge1B1Ir1S1Br4_1_6642.vasp,Ge1B1Ir1S1Br4,-1.72884700125,0.6247107647321368 -Ag4Te2S12_14_569.vasp,Ag4Te2S12,-1.428627275,0.322417957569443 -Co1O2_47_3802.vasp,Co1O2,-3.1048064466666667,-0.0076400145833359 -Li4S4_111_10222.vasp,Li4S4,-2.591300005,0.2881306173437501 -Cu3P2C4S2O16_2_5380.vasp,Cu3P2C4S2O16,-4.180285796666666,0.8976767943518441 -Ti1Br2_115_18749.vasp,Ti1Br2,-2.6365960266666666,0.5419532300000003 -K4Mo2O4F8_4_9475.vasp,K4Mo2O4F8,-3.341600702777778,-0.1648926916666702 -Mg2I4_2_10470.vasp,Mg2I4,-0.5785313,0.2832229466666667 -Hf4O8_35_7801.vasp,Hf4O8,-7.408653881666667,0.3788400166666665 -Tc2I6_12_18230.vasp,Tc2I6,-1.72517177125,0.1053076187499999 -W2C1S2_164_20472.vasp,W2C1S2,-5.44925772,-0.1143269559999997 -Al1Se1Br2_6_732.vasp,Al1Se1Br2,-1.6238557125,0.4083618135416668 -V1Ga2O4_164_19834.vasp,V1Ga2O4,-4.651433894285715,0.1806359225396732 -Nb2Br2N2_59_12647.vasp,Nb2Br2N2,-5.405502988333333,0.013242763099992 -Co2Sb4S6Cl4_2_4015.vasp,Co2Sb4S6Cl4,-2.126881310625,0.2688970533854141 -Mn3S4_164_11403.vasp,Mn3S4,-3.0368930971428574,0.185197804285714 -Cs2N2O6_4_4754.vasp,Cs2N2O6,-4.060285946,0.0766676240000006 -B1Br1_99_1618.vasp,B1Br1,-1.47022637,1.8561873319444413 -V2Cl6_191_20039.vasp,V2Cl6,-2.022253485,0.2099260575000001 -V3B2H2Se2_187_20240.vasp,V3B2H2Se2,-3.843828618888889,0.8240263594444395 -Tb1Sn5_47_18182.vasp,Tb1Sn5,-1.4274778466666669,-1.283897797083332 -Te4As4Pt4_13_18562.vasp,Te4As4Pt4,-2.2537291016666665,0.379423161249995 -Mo1Au2O4_1_11491.vasp,Mo1Au2O4,-2.919571691428572,0.5694457471428529 -Bi2S2_164_2518.vasp,Bi2S2,-1.92714574,-0.6381494933333343 -Sr3Au2Br2O4_123_17349.vasp,Sr3Au2Br2O4,-2.587640499090909,0.1508175235930694 -Ti2Se2_187_19025.vasp,Ti2Se2,-4.5139643075,-0.1488846825000003 -Cr8O18_1_4630.vasp,Cr8O18,-4.9019846,-0.1963604424038494 -Ag2S2_164_386.vasp,Ag2S2,-0.5809271875,0.38730177734375 -Nd1I2_123_13222.vasp,Nd1I2,-1.8129079866666664,0.0323753599999998 -Pt2I4O12_14_14632.vasp,Pt2I4O12,-2.5342568266666667,0.2205859196388875 -Re2O2_187_15064.vasp,Re2O2,-6.2239908225,0.3863694268750002 -In1Fe5Br2_123_8246.vasp,In1Fe5Br2,-0.3249915575,1.42422055890625 -Cu2H8C6I2N2_2_5145.vasp,Cu2H8C6I2N2,-4.454584999,0.2598499339999933 -Ni1H4C2I2N4_47_13333.vasp,Ni1H4C2I2N4,-4.138921334615384,0.2537345862179416 -Nb2S2_2_12846.vasp,Nb2S2,-5.11866959,-0.0070883865000048 -Sr3Fe2S5Br2_123_17378.vasp,Sr3Fe2S5Br2,-2.4121455916666665,-0.1412452137500019 -Hf2Cl2_12_7476.vasp,Hf2Cl2,-4.179844,0.1328140524999996 -Zn1H1_183_20951.vasp,Zn1H1,0.08357396,1.2980800275 -Cu2H8C6Br2N2_2_5143.vasp,Cu2H8C6Br2N2,-4.522020607,0.2924181194999988 -Cu1Pd1I1Br1O2_6_4940.vasp,Cu1Pd1I1Br1O2,-1.29870093,0.2081417627314797 -Sn1H1Br1O1_8_16639.vasp,Sn1H1Br1O1,-2.7845131625,0.2020992319791668 -Bi1_123_2413.vasp,Bi1,-0.56926841,-0.1024004149999999 -Ag2H2O4_1_267.vasp,Ag2H2O4,-2.52876261,0.189263345260417 -Mn1Tl1S2Br2_1_10915.vasp,Mn1Tl1S2Br2,-1.5036181266666666,0.1975301453124975 -Zn2O2_164_21128.vasp,Zn2O2,-1.9791506825,0.2230590199999997 -In2Te5_12_8638.vasp,In2Te5,-1.286537401428571,0.1123248328571429 -Zn2Te2W2O12_18_21183.vasp,Zn2Te2W2O12,-4.366585132777778,0.0365091070370324 -Sb1Br2_164_15440.vasp,Sb1Br2,-0.7925481366666666,0.4379269791666657 -Fe2P8_18_5925.vasp,Fe2P8,-3.234322268,0.6426602885000001 -Tl1As1O4_111_19213.vasp,Tl1As1O4,-3.4975103116666664,0.2183610900000001 -Br4_55_2710.vasp,Br4,0.22357092,0.21710583 -V2P2S10_129_20139.vasp,V2P2S10,-3.1757637807142856,0.2449586128571397 -Pb2Cl2_164_14237.vasp,Pb2Cl2,-1.00010295,0.29640786625 -Al1Co5Br2_123_631.vasp,Al1Co5Br2,-1.45179775625,0.4088853858333312 -Sr3Cu2S4Br2_123_17369.vasp,Sr3Cu2S4Br2,-2.0769675736363635,0.0074425606060568 -Na2Ti2Cu2S6_11_12325.vasp,Na2Ti2Cu2S6,-3.2017654083333333,0.227926644583333 -Au2F6_191_1482.vasp,Au2F6,-0.1770699,0.5351321083333332 -Co2Ni2As2_129_3940.vasp,Co2Ni2As2,-1.3431802833333333,0.3567256916666668 -K2Ga2H4_51_9108.vasp,K2Ga2H4,-1.93737225125,0.0942083012499999 -Mn1In1S3I1Cl1_1_10777.vasp,Mn1In1S3I1Cl1,-1.9089010828571429,0.3617070558482102 -Sb1Cl5_47_15449.vasp,Sb1Cl5,-0.7419035716666667,0.3723606058333333 -H2Au2_12_6990.vasp,H2Au2,-0.92908673,2.2324594825 -Pd1N2_47_14370.vasp,Pd1N2,-4.4625435,-0.2240608050000034 -Hf1Sn1Cl4O2_8_7311.vasp,Hf1Sn1Cl4O2,-3.49703952875,0.2294004712499999 -Ag1Rh1S2I2_6_107.vasp,Ag1Rh1S2I2,-1.06520019,0.3890713729947908 -B4I4_39_1756.vasp,B4I4,-1.2706728625,1.6038459794444415 -Sc5Cl8_10_16269.vasp,Sc5Cl8,-2.7931878823076923,0.0965843825640995 -Mn1Te3W1Se1_6_10914.vasp,Mn1Te3W1Se1,-2.423847288333333,0.0731401520833304 -V1Mo1F6_10_19878.vasp,V1Mo1F6,-3.191892555,-0.2503288015624998 -Ta2F5_1_17722.vasp,Ta2F5,-4.2420024,0.770799969285707 -Li2Br2O4_113_9846.vasp,Li2Br2O4,-2.56124566375,0.1683076152083313 -Ag2I1O6_162_310.vasp,Ag2I1O6,-1.9453927377777775,0.2731476893055534 -Co1Pd1S2I2_1_3811.vasp,Co1Pd1S2I2,-1.2193192066666667,0.3645192759374993 -Tl2Ni2Te5_156_19462.vasp,Tl2Ni2Te5,-0.5567958655555556,0.1781919399999993 -Ba2Ag1Se2I2_38_1892.vasp,Ba2Ag1Se2I2,-1.5908981699999998,0.123766246785713 -Ba2Cr3O8_123_1960.vasp,Ba2Cr3O8,-4.790005858461539,0.1841326386538404 -Na1Cd1Bi1Br1Cl1O2_1_11838.vasp,Na1Cd1Bi1Br1Cl1O2,-2.021716185714286,0.1955993323214266 -Sr1Ge1S1I2_8_17049.vasp,Sr1Ge1S1I2,-1.95656148,-0.2844763231666665 -C1F2_187_2728.vasp,C1F2,-1.820056763333333,2.295496184999993 -Bi1Te6As2Au1_143_2411.vasp,Bi1Te6As2Au1,-1.330824468,0.1033812550416643 -Na4Zn2Ge2_164_12432.vasp,Na4Zn2Ge2,-0.40154690125,0.08447002125 -In2Pd1S4_164_8527.vasp,In2Pd1S4,-2.2351972457142857,0.1710119821428553 -K2Ge1H6S6_147_9110.vasp,K2Ge1H6S6,-2.816162931333333,0.1034261455000005 -S2N2_4_15384.vasp,S2N2,-4.179301075,-0.1034833640624994 -Ga4S4Cl4_14_6563.vasp,Ga4S4Cl4,-2.3379824916666667,0.0605889099999998 -Cd1C2N4Cl2F4_1_3292.vasp,Cd1C2N4Cl2F4,-2.994440646923077,0.7367761687820445 -Ru2Cl6_191_15311.vasp,Ru2Cl6,-1.2688556725,0.5746439675000001 -Ru1Pt1Se2I1Cl1_6_15281.vasp,Ru1Pt1Se2I1Cl1,-1.783774735,0.2069177109615325 -Ta2Ru2S8_11_17841.vasp,Ta2Ru2S8,-4.386187508333333,0.13155055 -Ag2B2S2Br2_31_181.vasp,Ag2B2S2Br2,-1.78128149,0.5725478337499998 -Ga1Cu1P2Se6_149_6165.vasp,Ga1Cu1P2Se6,-2.257303922,0.1548505890416648 -As2H2Pb2S6_7_1214.vasp,As2H2Pb2S6,-2.616303085833333,0.3674343975925896 -Ag4Se4S12_14_566.vasp,Ag4Se4S12,-1.5009008005,0.1846124821250006 -Pb2N2Cl2_59_14257.vasp,Pb2N2Cl2,-2.3750813166666664,0.4785794416666644 -Y1N1_187_20654.vasp,Y1N1,-6.243594095,0.7473918800000003 -Ag2Se2I2_59_433.vasp,Ag2Se2I2,-0.2100977983333333,0.327582849444444 -Na2Hg4Cl6O8_31_12151.vasp,Na2Hg4Cl6O8,-1.2636811905,0.2734487231041649 -Ca3Bi12O18_8_3155.vasp,Ca3Bi12O18,-3.616761293333333,0.1466043341666653 -Zr2I2N2_59_21589.vasp,Zr2I2N2,-5.048323046666667,0.0482541216666669 -Ti1S2_187_18841.vasp,Ti1S2,-4.903374243333333,0.2259411033333327 -Ca2H8O6_26_3042.vasp,Ca2H8O6,-4.375047085625,0.0650681776041628 -Ge2S2I2_59_6826.vasp,Ge2S2I2,-2.01134519,0.1768264538541664 -Al2Zn2S5_187_1041.vasp,Al2Zn2S5,-2.4507489211111118,0.0772877848888859 -Ta2H2C1S2_164_17744.vasp,Ta2H2C1S2,-5.332794649999999,0.2573762647618927 -Nb2P2O10_129_12804.vasp,Nb2P2O10,-6.230238025714286,0.0738027596428576 -Ge4As4Se4_17_6926.vasp,Ge4As4Se4,-2.8731474316666668,0.0926054554166664 -K2N2O6_26_9248.vasp,K2N2O6,-4.102651248,0.06853187975 -Sn7S2Br10_1_17003.vasp,Sn7S2Br10,-1.333787901578947,0.1062223436842086 -Bi2O2F2_59_2481.vasp,Bi2O2F2,-3.1983202966666666,0.0630154900000001 -Hg8O4_14_8108.vasp,Hg8O4,0.5054338425,0.2010655793199236 -Sn2Te2I2_59_16891.vasp,Sn2Te2I2,-0.9373992733333334,-0.3057406083333344 -Hf1P2H2O6_164_7255.vasp,Hf1P2H2O6,-5.848867489090909,0.0633437772727267 -Cs1Pb1S2_156_4647.vasp,Cs1Pb1S2,-1.556894605,-0.37569575 -Cd1H1S1O1_8_3334.vasp,Cd1H1S1O1,-2.1738121775,0.4530767357812501 -In2Co2Te5_187_8417.vasp,In2Co2Te5,-1.4165008444444445,0.1141603233333318 -Sc1F2_123_15935.vasp,Sc1F2,-3.8569851533333335,-0.010115652777781 -Ta1O2_191_17594.vasp,Ta1O2,-4.908107393333333,2.4469632953333265 -Hg2Sb2O6_147_8006.vasp,Hg2Sb2O6,-2.322522201,0.7251339900000002 -Hf4B3H2_164_7765.vasp,Hf4B3H2,-5.729210063333333,0.1351364761111057 -Ga2P2Se6_143_6428.vasp,Ga2P2Se6,-2.466467221,0.1710655852499949 -In2Te1S1_8_8612.vasp,In2Te1S1,-1.724460565,0.1078790275000001 -Cu1H2O2_164_4892.vasp,Cu1H2O2,-3.192634126,0.3802080004166668 -Nb1V1Cl6_123_12608.vasp,Nb1V1Cl6,-2.20327072,0.4281055030468723 -Ti2C1_164_18914.vasp,Ti2C1,-6.708396976666666,0.9007690774999926 -Fe2Sb2Br2O4_26_5946.vasp,Fe2Sb2Br2O4,-3.090325231,0.0350407617499981 -Ba4Te8P4H4_14_2197.vasp,Ba4Te8P4H4,-2.3826794855,0.365332971527773 -Hf1V1S2_25_7354.vasp,Hf1V1S2,-4.3358424525,0.4862384482500008 -Cu3Mo1Se2S3Br3_1_5375.vasp,Cu3Mo1Se2S3Br3,-1.3219185925,0.2654964700297604 -Co2As4Br4O6_11_3851.vasp,Co2As4Br4O6,-3.079768381875,0.1055788068749983 -Ca1Cu1Se1Cl1_156_2825.vasp,Ca1Cu1Se1Cl1,-1.57556227,0.0160145021874999 -Bi4Te6_7_2656.vasp,Bi4Te6,-1.268283956,0.2990699780000001 -Nb1In1Se2I4_1_12527.vasp,Nb1In1Se2I4,-1.564403465,0.1963879092187433 -Sr4Mn4Ga2O14_26_17451.vasp,Sr4Mn4Ga2O14,-4.33493454625,0.2522206926041631 -V1Sb2Au1S6_1_19922.vasp,V1Sb2Au1S6,-2.419489772,0.3415443759166621 -Lu2C1Br2_164_10304.vasp,Lu2C1Br2,-3.793326002,0.0425258920000004 -Co1Ge3_187_3736.vasp,Co1Ge3,-2.1260490025,0.6926618262500003 -Ba1F2_187_1830.vasp,Ba1F2,-3.3300270466666664,0.5421837066666666 -Hf1Zr1I3Br1O2_8_7382.vasp,Hf1Zr1I3Br1O2,-3.75033048625,0.2131529303124999 -U2Br6_59_19702.vasp,U2Br6,-3.0868540275,0.0636593912500003 -Al4H12O12_14_1070.vasp,Al4H12O12,-4.912535005357142,-0.3856594941666702 -In4Bi4_127_8665.vasp,In4Bi4,-0.32677217625,0.22873008625 -Cr2Sb2Se6_157_4483.vasp,Cr2Sb2Se6,-2.365632355,0.1967600860000002 -Cr1Te8Mo3_25_4282.vasp,Cr1Te8Mo3,-2.088058025,-0.0191258027777778 -Na2Ru2S4I8N2_7_12285.vasp,Na2Ru2S4I8N2,-1.730939496666667,0.0933842025694428 -Na1Sn2S4_164_11937.vasp,Na1Sn2S4,-2.503971957142857,0.0393012691071379 -Pb2I2_129_14251.vasp,Pb2I2,-0.3618602375,0.5105656170833334 -Ta2Co4S6_11_17707.vasp,Ta2Co4S6,-3.6746495183333336,0.2331675749999973 -B2Cl6_1_1663.vasp,B2Cl6,-2.52302887125,0.02015153375 -Cu2P4S3Cl2_6_5221.vasp,Cu2P4S3Cl2,-2.3659250000000003,0.1426215498557177 -Hf2Zr2S8_7_7670.vasp,Hf2Zr2S8,-4.797075485833333,0.3232419312500001 -Hg1I2_115_7879.vasp,Hg1I2,0.91065173,0.0377714727777778 -Zn2Te2_164_21186.vasp,Zn2Te2,0.0434477025,0.1661285625 -Co1Te1O4_10_3832.vasp,Co1Te1O4,-3.5923809316666664,0.2491864908333338 -Zn2Fe8O18_1_21079.vasp,Zn2Fe8O18,-3.1840791892857143,0.3585303902678541 -Ni1P1S3_1_13388.vasp,Ni1P1S3,-2.251905498,0.3588204082222165 -In1Co5Br2_123_8219.vasp,In1Co5Br2,-0.97392648125,0.4596792789062499 -Al2Pd1O4_164_928.vasp,Al2Pd1O4,-4.9228852042857145,0.2053394107142822 -Mn2Mo2S2O12_8_11143.vasp,Mn2Mo2S2O12,-4.444112686111111,0.2345388739211815 -Sb1P2Au1S6_143_15475.vasp,Sb1P2Au1S6,-2.682466904,0.050393661625 -Ta2Se4I4_12_17881.vasp,Ta2Se4I4,-2.588856755,0.1119631220909023 -Tl2Cl6_26_19396.vasp,Tl2Cl6,-0.6270224525,0.1162690375 -Hf3Zr1O8_1_7753.vasp,Hf3Zr1O8,-7.1244644575,0.5119032520833331 -Rb2I6_26_14896.vasp,Rb2I6,-0.0012579725,0.2451555581249999 -Sr2Sn4Cl12_2_17318.vasp,Sr2Sn4Cl12,-1.7798529449999998,0.0724881172222209 -Rb2Te2C2Cl6O6_4_14947.vasp,Rb2Te2C2Cl6O6,-2.64338429,0.6897597185416662 -Cu4H4I4O4_14_5412.vasp,Cu4H4I4O4,-1.926783413125,0.1876191256041663 -Yb1Br2_164_20853.vasp,Yb1Br2,-2.157620046666666,0.0889011066666669 -Ni3P6_164_13711.vasp,Ni3P6,-2.45165471,0.733885125 -Tl2In2H8_3_19446.vasp,Tl2In2H8,-1.946746795,1.6568055616666624 -Ga2Br2_129_6311.vasp,Ga2Br2,-1.138356465,0.226059985 -K2H8S4I2_2_9164.vasp,K2H8S4I2,-2.5228998725,-0.0787752531250002 -Cu2H4_12_5134.vasp,Cu2H4,-1.6813856216666665,2.065258601666664 -Cd1C4N2F6_10_3296.vasp,Cd1C4N2F6,-4.251399543846154,0.1203936782692174 -Zn4Mo4O24_14_21223.vasp,Zn4Mo4O24,-3.7405598340625,0.2504029991666663 -Cs2C2S6_1_4672.vasp,Cs2C2S6,-3.106861864,0.5110783165000004 -W12F24_32_20404.vasp,W12F24,-3.424430789444445,0.7995265980555515 -Tl2I6_127_19439.vasp,Tl2I6,0.18036218,0.2088330996875 -Zr2Ge2Se8_31_21571.vasp,Zr2Ge2Se8,-3.2910425133333336,0.0806268899999995 -Sn1Cl4_123_16627.vasp,Sn1Cl4,-1.060535958,0.229271703 -Al1Ge1S3_143_666.vasp,Al1Ge1S3,-2.91902028,0.3481115799374968 -Cu3Sb1S4_156_5384.vasp,Cu3Sb1S4,-1.24641599375,0.5172990987500001 -Eu1P2_6_5591.vasp,Eu1P2,-3.72252361,0.7808246163333288 -Tm4Te10O26_2_19692.vasp,Tm4Te10O26,-4.43934432175,0.0755152067499995 -Al2Zn3O6_156_1044.vasp,Al2Zn3O6,-3.735233524545454,0.2493966940909051 -Mo2O2_187_11645.vasp,Mo2O2,-4.3840160925,0.94222191875 -Sr10Co2_26_17011.vasp,Sr10Co2,0.6731219916666666,1.2177261816666656 -Ta1Ga1Au1S3Cl2_1_17544.vasp,Ta1Ga1Au1S3Cl2,-2.700588315,0.325866036125 -Fe1Co2O6_12_5661.vasp,Fe1Co2O6,-3.6681001322222224,-0.2722385052083407 -Cr1Br5_10_4134.vasp,Cr1Br5,-0.688349805,-0.0163371958333338 -Si1Ni3Te2_187_16352.vasp,Si1Ni3Te2,-1.1344145866666666,-0.0719422275 -In2Co1Se4_164_8409.vasp,In2Co1Se4,-1.9620393842857144,0.0704824820952334 -Li4V1F8_3_10235.vasp,Li4V1F8,-3.451448227692308,0.0044554092307662 -Mo2W2S8_25_11699.vasp,Mo2W2S8,-4.158919905,-0.0648246633333338 -Ta2Te2Br2_59_17899.vasp,Ta2Te2Br2,-3.308863125,0.2499492293253892 -Na2Ca2_11_12016.vasp,Na2Ca2,0.50604195,0.98574643 -Cd2Te2_129_3596.vasp,Cd2Te2,0.3646265325,-0.5047492225 -Sr2Li2_11_17272.vasp,Sr2Li2,-0.1225226075,0.3674624775438587 -V2Te2_187_20214.vasp,V2Te2,-2.2567813225,0.5184637803571401 -Sm2F6_59_16570.vasp,Sm2F6,-4.4769644925,0.2575192181250001 -Al2I2Br2_1_875.vasp,Al2I2Br2,-1.2104879716666666,0.2332496405555544 -Tl4Te4Cl4_14_19634.vasp,Tl4Te4Cl4,-0.7580350858333333,0.3842253730555545 -Ni1Te1Ru1Br1N1_1_13431.vasp,Ni1Te1Ru1Br1N1,-2.226737514,0.6284354940000004 -Mn1F2_115_10703.vasp,Mn1F2,-2.3115069900000003,0.4978374699999999 -Hf2Te2P1_164_7636.vasp,Hf2Te2P1,-4.692869812,0.0520856480000002 -Tc4Cl14_13_18246.vasp,Tc4Cl14,-2.5058886666666664,0.0989186316666643 -K1W2S2Br6_47_8959.vasp,K1W2S2Br6,-2.055384253636364,0.1343343818181783 -Mn2H2Se4_11_11097.vasp,Mn2H2Se4,-2.55700393625,0.3707037075000001 -Y4I6_12_20828.vasp,Y4I6,-2.486476711,0.097275050999998 -P4S6_81_14114.vasp,P4S6,-3.236332382,0.1489178094062473 -V1W2O8_2_19960.vasp,V1W2O8,-5.781899259090909,0.0313828909090858 -In1Pd5I2_123_8314.vasp,In1Pd5I2,-0.83546018,0.0455520725624999 -Sn2Sb2H6C2S6_7_16858.vasp,Sn2Sb2H6C2S6,-3.3646458333333333,0.2264411768055426 -W3O8_8_20567.vasp,W3O8,-5.743889812727272,0.4556456466975818 -Ga3P1Se3S1Br2_1_6530.vasp,Ga3P1Se3S1Br2,-2.054285656,0.2619592693958297 -Cu1Ag1I2_1_4818.vasp,Cu1Ag1I2,0.3530421125,0.145783829999999 -Cu1As1S2I2_6_4836.vasp,Cu1As1S2I2,-1.2219888966666663,0.1989777815972209 -Hf1Sb2H2O6_164_7287.vasp,Hf1Sb2H2O6,-4.706862871818182,0.5266432798484744 -Na1Mo2S2Br6_47_11902.vasp,Na1Mo2S2Br6,-1.62812781,0.1440876572727234 -As4W2_2_1377.vasp,As4W2,-3.598591483333333,0.6737308958333295 -H2Pb4I2O4_12_7007.vasp,H2Pb4I2O4,-2.9404929516666667,-0.0049817239409744 -Ga2I2N2_59_6388.vasp,Ga2I2N2,-2.592941725,0.5171145622222195 -Ni1H4C4Br2N2_47_13339.vasp,Ni1H4C4Br2N2,-4.604073954615385,0.3428987807692136 -H4Au4Br4O4_2_7058.vasp,H4Au4Br4O4,-1.775195034375,0.1233601918749998 -Al2In2Se6_31_891.vasp,Al2In2Se6,-2.44073066,0.0277424480000002 -Na2H2C2O4_13_12097.vasp,Na2H2C2O4,-4.881992619,0.1625197292499951 -Co2Cl2O4_11_3889.vasp,Co2Cl2O4,-2.92276069625,-0.5044105095312501 -P2H6Pb2N2O6_7_13984.vasp,P2H6Pb2N2O6,-4.604653880555556,0.1678676111111032 -Te10As10_26_18265.vasp,Te10As10,-2.0208139205,0.2756130153333309 -Hf1Au1Br1Cl1O3_1_7111.vasp,Hf1Au1Br1Cl1O3,-3.2403291342857146,0.5630446165773746 -In2Te2Cl2_59_8616.vasp,In2Te2Cl2,-1.2853940433333333,-0.5531383133333333 -Cr1Te1W1Se1S2_8_4275.vasp,Cr1Te1W1Se1S2,-2.8920706983333333,0.535799379444443 -Ba3Mn2S5I2_123_2117.vasp,Ba3Mn2S5I2,-2.664524448333333,0.16417018958333 -Ta1Ni1Cl2O2_1_17586.vasp,Ta1Ni1Cl2O2,-3.76529019,0.7314279866666555 -Fe1C4Br2N2F4_47_5645.vasp,Fe1C4Br2N2F4,-4.25334541,-0.0478696401442406 -Tc8F28_4_18263.vasp,Tc8F28,-3.5239742719444447,0.0253440259722151 -Cd1O1F2_156_3383.vasp,Cd1O1F2,-1.1765207225,0.5244942365625 -Rb2H6C4S6_2_14855.vasp,Rb2H6C4S6,-3.879809725555556,0.1201326699652648 -Fe2B1S2F2_164_5801.vasp,Fe2B1S2F2,-2.37953957,0.4749389660118948 -V2Mo2S10_85_20106.vasp,V2Mo2S10,-3.0627138085714285,0.5592477391071398 -Mg1S2F2_1_10396.vasp,Mg1S2F2,-2.062954268,0.8565750547500002 -Li1Ga1Cl4O12_2_9708.vasp,Li1Ga1Cl4O12,-2.730184061666667,0.1987955887222174 -In2Sn2S2_164_8607.vasp,In2Sn2S2,-1.7968920949999998,-1.146253146666667 -Tc2I8_14_18231.vasp,Tc2I8,-1.279278939,0.1047163410000002 -Ga2Si2Te2_164_6492.vasp,Ga2Si2Te2,-2.5985656066666665,-0.3130491127777796 -Ag2O4F2_17_341.vasp,Ag2O4F2,-1.80383202375,0.1151087187499999 -Sn1H2_115_16643.vasp,Sn1H2,-2.0419678566666666,0.3060641383333314 -Tl2Ga2S6_31_19424.vasp,Tl2Ga2S6,-2.230316254,0.2409378343749978 -Li2Ni1O2_164_10021.vasp,Li2Ni1O2,-2.979237626,-0.0299242139999996 -Sc2B1Cl2_164_16032.vasp,Sc2B1Cl2,-3.585854728,0.0091087938999998 -Li2Cr2Si2O8_11_9873.vasp,Li2Cr2Si2O8,-5.378733857857143,0.1894681099999937 -Cd2I2O2_59_3518.vasp,Cd2I2O2,-0.62303784,0.2888499760317456 -Ag1Au1Se1S1I2_1_13.vasp,Ag1Au1Se1S1I2,-0.1614498399999999,0.3301148510416662 -Be3Ge1_25_2279.vasp,Be3Ge1,-2.6942972175,-0.4626849724999998 -K2Ta2Cl12_4_9359.vasp,K2Ta2Cl12,-2.4564721275,0.0273580024999997 -Cr1S2F2_164_4246.vasp,Cr1S2F2,-2.44279661,0.5726847344999976 -V4C3Cl2_164_20311.vasp,V4C3Cl2,-4.911389521111111,0.1287364635390884 -Cu2B2Br2O2_31_5025.vasp,Cu2B2Br2O2,-2.5442568325,1.3451950918055506 -P8Se8S4_2_14161.vasp,P8Se8S4,-2.8448396695,0.2218550690595213 -Mn2P2Br2O4_26_11180.vasp,Mn2P2Br2O4,-3.57623668,0.4444124606759222 -S4Br4_2_15394.vasp,S4Br4,-1.2340640475,0.300912079375 -Os2O4_11_13862.vasp,Os2O4,-4.91195496,0.5908230466666664 -W2Br8_1_20468.vasp,W2Br8,-1.330127681,0.3746602168333308 -Ge3As1O8_10_6900.vasp,Ge3As1O8,-4.574681240833333,0.197225949010408 -Y2S2Br2_59_20770.vasp,Y2S2Br2,-4.248594953333334,0.0350819783333324 -Rh2N2Cl2_59_15201.vasp,Rh2N2Cl2,-3.021960561666667,0.155625437499997 -Hg4W4O14_2_8096.vasp,Hg4W4O14,-4.299639622272728,-0.0050704993181907 -In1P1_156_8296.vasp,In1P1,-2.06152933,-0.4096216699999999 -V1Cu1Se2_156_19819.vasp,V1Cu1Se2,-1.903972165,0.4901768993749998 -As16F4_10_1126.vasp,As16F4,-2.973374516,0.13890402783333 -K4S4O10_11_9505.vasp,K4S4O10,-3.733285742777778,0.115016032546293 -V1C4S6F5_1_19794.vasp,V1C4S6F5,-3.617727818125,0.425729251953125 -Mn2Nb1Pd1Se4_6_11160.vasp,Mn2Nb1Pd1Se4,-2.68205907625,0.1168071685937505 -Mn2In2O5_38_11120.vasp,Mn2In2O5,-3.864614632222223,0.0875663742648426 -Ca2Br4_2_2964.vasp,Ca2Br4,-1.54367399,0.3864596733333334 -In2N6_1_8488.vasp,In2N6,-4.64567029,0.1372909568749998 -Mn1In2S1N1Cl2_1_10783.vasp,Mn1In2S1N1Cl2,-2.325549045714286,0.5069922749999938 -Sn1Au1S2_1_16607.vasp,Sn1Au1S2,-1.4232001725,0.3652231707421873 -Sc4Se6_65_16263.vasp,Sc4Se6,-3.585723212,0.3633118739999998 -Ta2B1H2S2_164_17654.vasp,Ta2B1H2S2,-5.105650534285714,0.8515230585714171 -Al2P2_129_926.vasp,Al2P2,-3.5346099225,-0.6000079275000001 -Si8Pd2_125_16549.vasp,Si8Pd2,-3.187010901,-0.1299468304999995 -Ta2C2I2_59_17685.vasp,Ta2C2I2,-5.3497734150000005,0.1062649534166567 -Mg4Sb8O16_57_10583.vasp,Mg4Sb8O16,-4.089552830357143,0.2504428639285709 -Li1Cl1_123_9670.vasp,Li1Cl1,-2.51941986,0.2204232849999998 -Ta2Te4Br4_12_17913.vasp,Ta2Te4Br4,-2.457731035,0.1573925898666639 -Ta2Pd4Se6_11_17833.vasp,Ta2Pd4Se6,-2.95010224,-0.2780800739583361 -Mg4Ge8W4O24_14_10576.vasp,Mg4Ge8W4O24,-5.08010804725,0.0600829444999959 -Mn2H2_164_11098.vasp,Mn2H2,-2.66700763,0.13136715875 -Na2B2H16O12_2_11973.vasp,Na2B2H16O12,-4.5928395315625,0.0447537647569444 -Cd1Sb6S8I4_12_3422.vasp,Cd1Sb6S8I4,-1.8686849242105263,-0.4188635209210534 -Tl4Te2S6_26_19632.vasp,Tl4Te2S6,-1.6735459041666667,0.5345273229166665 -Hf1Zr2S3I2_8_7412.vasp,Hf1Zr2S3I2,-3.85262421875,0.0687799896875001 -Mn2Sn1O6_162_11292.vasp,Mn2Sn1O6,-4.167744948888889,0.2625346349999953 -Zn2Sb4S6Br4_31_21158.vasp,Zn2Sb4S6Br4,-1.66390956625,-0.409447781375 -Zn1Ga2S4_156_20938.vasp,Zn1Ga2S4,-2.309212144285714,0.2009232900000004 -Tb1Si2_123_18179.vasp,Tb1Si2,-3.18207349,0.8994311222222189 -Sc2Te2F2_59_16175.vasp,Sc2Te2F2,-3.497486015,-0.0082562000000028 -V1H4C4S6F1_1_19855.vasp,V1H4C4S6F1,-4.1627456425,0.2705593016406225 -Pb2C4S4N4_13_14233.vasp,Pb2C4S4N4,-5.033505776428571,-0.4345151360416786 -Nb1I1Cl1_156_12519.vasp,Nb1I1Cl1,-2.43849193,0.4713722478571386 -As2Br6_31_1196.vasp,As2Br6,-1.05609566,0.1133030625 -Sr2Ag1O2F2_38_17102.vasp,Sr2Ag1O2F2,-2.93170346,0.3659463994285654 -Na3In1Cl6_149_12352.vasp,Na3In1Cl6,-1.70678001,0.1436950975000002 -Ni1B6Br2N2F4_25_13275.vasp,Ni1B6Br2N2F4,-3.900444,0.6556439443749881 -Cs2C2Se2S6Cl6_1_4677.vasp,Cs2C2Se2S6Cl6,-2.086433016111111,0.4219695749768489 -Cs2Cd4I6O8_31_4684.vasp,Cs2Cd4I6O8,-1.030182517,0.4805411534055531 -Ca3Bi3_25_3156.vasp,Ca3Bi3,-0.5768464266666666,0.6441670731060598 -H4Pd1C2N6F2_6_7073.vasp,H4Pd1C2N6F2,-4.397347505333333,0.5309017728333199 -Ta1Ti1Se2_25_17636.vasp,Ta1Ti1Se2,-4.860373705,-0.236994677083338 -Ca2Au1Cl2O2_38_2928.vasp,Ca2Au1Cl2O2,-2.476643615714285,0.4301630433333285 -V1Ge1S2I1Br1_6_19841.vasp,V1Ge1S2I1Br1,-2.3721596016666666,0.2308299141319399 -Ir2Cl2O2_59_8774.vasp,Ir2Cl2O2,-2.951768051666667,0.4083805894444405 -Cd1H2_115_3342.vasp,Cd1H2,-1.0779365066666666,1.2016372449999984 -Ni1N2_47_13379.vasp,Ni1N2,-4.107417383333334,1.4344163649999946 -Na1Sb2Te6Pd1_149_11931.vasp,Na1Sb2Te6Pd1,-1.370442499,0.3026125453999969 -Cr2Te2N1_164_4523.vasp,Cr2Te2N1,-3.291563726,-0.009207534666666 -Si4Te8_14_16522.vasp,Si4Te8,-2.2235311833333333,0.147336375 -Ti2S2_123_19005.vasp,Ti2S2,-5.215894305,-0.0190806849999995 -Mo2S2_12_11670.vasp,Mo2S2,-3.4579253325,0.7089728087500005 -I4O12_2_8162.vasp,I4O12,-2.44465455125,0.2098408145312499 -Cr2Ag1O6_2_4289.vasp,Cr2Ag1O6,-4.051164257777778,-0.1818227621527854 -Ge4As8_26_6927.vasp,Ge4As8,-3.1864297983333336,-1.338373889166667 -Sr2Au1S2F2_38_17130.vasp,Sr2Au1S2F2,-2.24315617,0.5338183914285671 -Co2Se2_123_4024.vasp,Co2Se2,-1.9905546425,0.1624683248333305 -Na2Hf1H6O6_147_12142.vasp,Na2Hf1H6O6,-4.722831210666667,0.0503772215000004 -Zr1I4_123_21313.vasp,Zr1I4,-1.175824958,0.3077267843333333 -Si4Te4As4_17_16517.vasp,Si4Te4As4,-2.8842843141666665,-0.6047746008333332 -Al1N1_187_687.vasp,Al1N1,-5.61857765,0.7152872500000003 -Pb6S2O12_11_14333.vasp,Pb6S2O12,-3.851288083,0.0730126229375002 -Nb1Cr1Cl6_123_12492.vasp,Nb1Cr1Cl6,-2.1018924675,0.2554639755468724 -Pb6S2O12_2_14334.vasp,Pb6S2O12,-3.8537523515,0.0705483544375004 -In2I4_10_8479.vasp,In2I4,-0.4038751316666666,0.1370450266666666 -Rb2Ta2Cu4Te8_7_14946.vasp,Rb2Ta2Cu4Te8,-1.637487548125,0.0960981331249999 -Ag2Ir2F14_26_323.vasp,Ag2Ir2F14,-1.4519853816666666,0.0626487822222223 -Al1Cd1Ga1Se4_156_621.vasp,Al1Cd1Ga1Se4,-1.9647235171428568,0.1576735257142838 -Zn1Cl2_115_20914.vasp,Zn1Cl2,-0.5298355533333333,0.0703290681249999 -Sc4H2C3O2_164_16239.vasp,Sc4H2C3O2,-5.333021974545455,0.4098054834393891 -Mn1Ag1Ge1S4_1_10611.vasp,Mn1Ag1Ge1S4,-2.3453538957142857,0.3441204060944438 -Li2Ge1O6F6_147_9924.vasp,Li2Ge1O6F6,-2.4238183613333333,0.7610003956111115 -Sb2Cl6_12_15568.vasp,Sb2Cl6,-1.449153965,0.0700878599999998 -Ni2O6_31_13553.vasp,Ni2O6,-2.721153105,-0.1296467843749997 -V4F16_14_20323.vasp,V4F16,-3.2925465835,-0.0121971344999995 -Pd1Au1O2F1_6_14341.vasp,Pd1Au1O2F1,-1.436065874,0.4160815996666647 -Te1Pb2S1I1_1_18324.vasp,Te1Pb2S1I1,-1.391376548,-0.7609462994999999 -Tl2S5_12_19514.vasp,Tl2S5,-1.6506149628571427,0.3832349117857128 -Zr2I2N2_164_21588.vasp,Zr2I2N2,-5.049743736666667,0.0468334316666672 -Cr1O2F1_156_4220.vasp,Cr1O2F1,-3.428175695,0.5557595878124959 -Ga4Se4I4_14_6573.vasp,Ga4Se4I4,-1.573617905,0.039052925 -Hf3Zr1Se3S1Br3Cl1_1_7757.vasp,Hf3Zr1Se3S1Br3Cl1,-3.7653470341666666,0.0989289161979088 -Ru2I6_189_15324.vasp,Ru2I6,-0.4308516075,0.17537927 -Pb1Se1Br2_1_14203.vasp,Pb1Se1Br2,-1.0497686275,0.4226715183333335 -Cu2Ge2S6_51_5100.vasp,Cu2Ge2S6,-2.301846604,0.1783763010416642 -V2Cd2O6_12_20026.vasp,V2Cd2O6,-3.866124606000001,0.1911007294999995 -Fe1Cu1Rh1Se1S1I2Br1_1_5666.vasp,Fe1Cu1Rh1Se1S1I2Br1,-1.09702716125,0.070229840190969 -Tl2S2Cl2_129_19498.vasp,Tl2S2Cl2,-1.0223699166666669,0.4685902231249986 -Zr1Pd1F6_149_21400.vasp,Zr1Pd1F6,-3.188892,0.2198414912499995 -V1Cr1Br2N1O1_6_19804.vasp,V1Cr1Br2N1O1,-3.8016958966666663,-0.1524212214930641 -Ru2F6_67_15316.vasp,Ru2F6,-2.43922214875,0.1319114125 -Ba1I2_164_1840.vasp,Ba1I2,-1.3646098633333337,0.1799120633333331 -Li2H4C2N8O2_2_9934.vasp,Li2H4C2N8O2,-5.64513469,-1.6503717980092691 -Nd1Se3_191_13226.vasp,Nd1Se3,-2.51766024,0.9187092614583332 -Rb1Ge1Te2_156_14735.vasp,Rb1Ge1Te2,-1.259119615,0.1882606125000001 -Mn2As2Se4F2_26_10983.vasp,Mn2As2Se4F2,-2.407175086,0.206889311666664 -Li1Cu1S2_1_9690.vasp,Li1Cu1S2,-1.89440786,0.2265093070052084 -Hg4N4O12_4_8081.vasp,Hg4N4O12,-3.1386242695,0.0546773404999996 -Mn2P2O4F2_26_11186.vasp,Mn2P2O4F2,-4.130115364,0.3485368974259227 -Cd2S2I2_59_3547.vasp,Cd2S2I2,-0.11445672,0.2912409355902758 -Zr1Pd1Br6_149_21397.vasp,Zr1Pd1Br6,-1.51355147,0.0917926306250001 -Cr1Cu1I6_5_4150.vasp,Cr1Cu1I6,-0.05504741125,0.1505382949739585 -Sb6Ir2S4_11_15850.vasp,Sb6Ir2S4,-2.684630575,0.3374308633333309 -Sn1H6Au1_1_16645.vasp,Sn1H6Au1,-2.05945829125,1.60451744125 -Cr2Te8W2_25_4536.vasp,Cr2Te8W2,-2.3681448075,0.125827237777778 -Zn2W2S8_13_21195.vasp,Zn2W2S8,-2.820047375833333,0.2497861138958315 -Ti2Cl4_11_18925.vasp,Ti2Cl4,-3.65398671,0.0536263608333338 -Si4Sb4S4_17_16510.vasp,Si4Sb4S4,-3.246943746666666,-0.0467852708333358 -Gd2H4N2O10_4_6616.vasp,Gd2H4N2O10,-5.0909779,0.0528037466666662 -Nb4Co8Se8_59_13061.vasp,Nb4Co8Se8,-3.135812511,0.1241135465000002 -V6Te18_11_20397.vasp,V6Te18,-2.0004292825000003,0.1679479499999996 -Nb4Ni6Se10_59_13107.vasp,Nb4Ni6Se10,-2.594571682,-0.0707317689565245 -K2H6Pb1S6_147_9152.vasp,K2H6Pb1S6,-2.616356206,-0.0931888763750017 -Hf1Zr1Se1Cl3_6_7398.vasp,Hf1Zr1Se1Cl3,-3.452115708333333,0.082778999999997 -V2Ag4P2O12_12_19977.vasp,V2Ag4P2O12,-4.1246936315,0.1204128689999937 -Sc1Pd3Br4O4_3_15982.vasp,Sc1Pd3Br4O4,-2.3115567425,0.2801670088194414 -Sb2Te2F2_59_15713.vasp,Sb2Te2F2,-2.0384381133333336,0.3722354455555532 -La2Si2I2_164_9615.vasp,La2Si2I2,-3.249736045,0.0381959266666669 -Na2Eu2Cl8_2_12073.vasp,Na2Eu2Cl8,-2.5920545833333333,-0.4604280331250006 -Zr2Sc1I4Br1_8_21667.vasp,Zr2Sc1I4Br1,-1.83404084625,0.376061995625 -Sc4Te6_65_16266.vasp,Sc4Te6,-2.74549592,0.3341811789999998 -Ta1S2_187_17609.vasp,Ta1S2,-5.3092021,0.111530488333333 -Ni2B1_187_13460.vasp,Ni2B1,-1.2477948666666667,0.5005407933333335 -Sc2N1O2_164_16105.vasp,Sc2N1O2,-6.053079816,0.3685707199999877 -Na8Ti8O20_29_12455.vasp,Na8Ti8O20,-5.681846253611111,0.2863527451111056 -Sr2Co1Br2O2_123_17186.vasp,Sr2Co1Br2O2,-3.033217015714285,0.0480993292857097 -Au2I2_67_1488.vasp,Au2I2,0.583186795,0.06946387375 -B4S6_1_1764.vasp,B4S6,-4.26628966,0.1673697055000005 -Bi2P2S6_1_2491.vasp,Bi2P2S6,-2.812888822,-0.0458180647000002 -Sc2Te2Cl2_59_16174.vasp,Sc2Te2Cl2,-2.906185353333333,0.0887574544444418 -Hf1O2_164_7251.vasp,Hf1O2,-7.510399043333333,0.2770948550000005 -Sc2Sb2S8_2_16146.vasp,Sc2Sb2S8,-3.2521141975,0.2635451776041608 -Zn2Ni3O8_10_21125.vasp,Zn2Ni3O8,-2.4628522553846155,-0.1678196962500051 -Mn1Ag1F4_2_10610.vasp,Mn1Ag1F4,-2.052994135,-0.2102540214583335 -Cu2As2Se6_2_5015.vasp,Cu2As2Se6,-1.626409946,0.2760304534444424 -Hf1Mn1S2I1Br1_1_7223.vasp,Hf1Mn1S2I1Br1,-3.1124164000000003,0.1111005356249998 -Na2H8S4I2_2_12141.vasp,Na2H8S4I2,-2.6576410975,-0.0856455093750002 -Te2Ir2_25_18400.vasp,Te2Ir2,-2.3459253475,0.7895061475 -Cr1Ni1F5_10_4217.vasp,Cr1Ni1F5,-2.348626161428572,-0.0629750128571449 -Zr1Nb1Ga1S3I2_1_21340.vasp,Zr1Nb1Ga1S3I2,-3.1283095325,0.3586706707291608 -W4N3F2_164_20584.vasp,W4N3F2,-5.532862234444445,-0.1458247597222273 -P4Au2Se3Br2_6_14069.vasp,P4Au2Se3Br2,-1.7708283454545453,0.2443099763636331 -Ti6V4O18_13_19184.vasp,Ti6V4O18,-6.448126867857143,0.2092134364285653 -In2Te2O8F2_11_8624.vasp,In2Te2O8F2,-3.0995327157142856,0.5172279136111049 -Ba4Fe2Br2O6_129_2150.vasp,Ba4Fe2Br2O6,-3.645982505,-0.0373039244866109 -Tl2S4_12_19512.vasp,Tl2S4,-1.6371419883333334,0.2993687321875 -Al1I2_115_673.vasp,Al1I2,-0.7325960166666667,0.4094518716666656 -P1I1O1_156_13921.vasp,P1I1O1,-2.3666154633333334,0.9009448286666616 -Te6O14_31_18660.vasp,Te6O14,-3.511587688,0.1793960933749967 -Na2Mg1Te2H4S8_2_12199.vasp,Na2Mg1Te2H4S8,-2.578531267058824,0.0327516395833289 -Hf1Sb1As1_156_7284.vasp,Hf1Sb1As1,-3.84172111,0.5773593724999962 -Sn2Se1Br2_8_16874.vasp,Sn2Se1Br2,-1.486323806,-0.1556175049999999 -Li4Cr8O26_18_10179.vasp,Li4Cr8O26,-4.743926463157894,-0.2354815917653584 -Li1Nb1Br6_1_9754.vasp,Li1Nb1Br6,-1.920393645,-0.0121273931249998 -W1Br2_115_20420.vasp,W1Br2,-1.6693836666666666,0.9157905827777776 -Zn2Bi4O10_51_21045.vasp,Zn2Bi4O10,-2.955730646875,0.439637610078125 -Mo1N2_187_11524.vasp,Mo1N2,-5.209562973333333,0.965891533333334 -Zr1W1I2_6_21487.vasp,Zr1W1I2,-2.0558207175,1.1263839724999969 -Sr4P4S8F4_14_17461.vasp,Sr4P4S8F4,-3.4846472785,0.1037155864296842 -Pt2F6_191_14624.vasp,Pt2F6,-0.90477961375,0.7185466928125 -Hf6C1I1N2Cl1O4_1_7826.vasp,Hf6C1I1N2Cl1O4,-6.7978095173333335,0.0098268084166498 -Mn3C2F2_187_11362.vasp,Mn3C2F2,-3.791622524285714,0.348466295714281 -K1In1Br4O12_2_8909.vasp,K1In1Br4O12,-2.395538025,0.2596755103472175 -Sn2Sb1Se6_162_16850.vasp,Sn2Sb1Se6,-2.0462543,0.1684097812962921 -Nb2Ni4S6_11_12785.vasp,Nb2Ni4S6,-2.7841880866666666,0.1686236538888819 -Sn2F6_1_16768.vasp,Sn2F6,-2.5331950075,-0.3918424124999999 -Y1I2_115_20645.vasp,Y1I2,-1.9292176766666669,0.4735451327777754 -Nb2As2Se6_2_12626.vasp,Nb2As2Se6,-3.3798816700000005,0.2563937101666638 -Er1As2_21_5542.vasp,Er1As2,-2.8468577833333337,0.6012195466666634 -Co2C4O12_14_3885.vasp,Co2C4O12,-5.241023867777778,0.0685155254166622 -Al2H14N4_10_858.vasp,Al2H14N4,-4.192568616,-1.1004541712500049 -Hf2Si2Se2_129_7615.vasp,Hf2Si2Se2,-4.955288483333333,0.0526182083333339 -Sb1As1W1_156_15431.vasp,Sb1As1W1,-3.574689393333333,0.457639284722218 -Cr1Cu1Se3I1Br1_1_4159.vasp,Cr1Cu1Se3I1Br1,-1.2348599242857143,0.1453426573979552 -Sb1Br3_187_15442.vasp,Sb1Br3,-0.68563609,0.41320253125 -Fe2H2Br2_59_5850.vasp,Fe2H2Br2,-1.6435906850000002,0.1446318899999963 -Ag2Cl2O4_1_244.vasp,Ag2Cl2O4,-1.24610496125,0.4971364006250001 -Li4C8Br4O8_14_10172.vasp,Li4C8Br4O8,-4.547235229166667,0.6833793424999945 -Na1W2I6O2_47_11953.vasp,Na1W2I6O2,-2.339472341818181,-0.5066805948636405 -Rb1F2_115_14730.vasp,Rb1F2,-0.9055220433333332,0.288053019999999 -Tl1Ga1S2_1_19275.vasp,Tl1Ga1S2,-2.002303775,0.4322926356250001 -Al1Pt5F2_38_717.vasp,Al1Pt5F2,-1.76550408625,1.3210023762499965 -Sn3S1Br2O1_1_16925.vasp,Sn3S1Br2O1,-2.085550704285714,0.1861530046428525 -Au4Br4O4_14_1567.vasp,Au4Br4O4,-0.7237950033333332,0.2321343322222213 -Sr2F4_2_17216.vasp,Sr2F4,-3.2070557783333338,0.6064608916666665 -Cd1Sn2I2O2_12_3429.vasp,Cd1Sn2I2O2,-1.7984572457142856,0.0986935030952369 -Bi2P4O13_5_2496.vasp,Bi2P4O13,-5.170168048947368,0.1229461923684205 -Zr2S6_59_21658.vasp,Zr2S6,-4.2852628,0.05371357875 -V2H2_12_20079.vasp,V2H2,-3.39129331,0.3553810474999999 -Ni1H4C4N2F2_47_13342.vasp,Ni1H4C4N2F2,-4.881119604615384,0.6299692373076803 -Mn2Se4F2_11_11288.vasp,Mn2Se4F2,-2.2177380475,0.2733971183333333 -Sc1Zn1Te1Se1I4_1_16024.vasp,Sc1Zn1Te1Se1I4,-0.81276161625,0.343857789296875 -Ti3Te2N2F2_38_19113.vasp,Ti3Te2N2F2,-5.0284977022222215,0.2017249846913534 -Ti2C1S2_164_18912.vasp,Ti2C1S2,-6.177648762,0.2017848979999938 -Mn1Cd1S2I2_1_10661.vasp,Mn1Cd1S2I2,-1.0112627766666666,0.3914051806944443 -Ba1Au2S8_89_1805.vasp,Ba1Au2S8,-1.9984092409090908,0.1915823243181776 -V2Ge2Te6_162_20068.vasp,V2Ge2Te6,-2.197265801,-0.1916246363333344 -Al1Pd2_187_707.vasp,Al1Pd2,-1.6221084266666663,0.6892736541666669 -Mg6B1C1_25_10597.vasp,Mg6B1C1,-1.02437753,0.5209458084895832 -Ag4H4I4O4_14_516.vasp,Ag4H4I4O4,-1.751837435,0.1564750234895828 -Sc2Br2F2_164_16036.vasp,Sc2Br2F2,-3.153568866666667,-0.0223189144444473 -Ta6Ge2Se12_26_18144.vasp,Ta6Ge2Se12,-4.426716353,0.0161524369999934 -Au2Br2_164_1453.vasp,Au2Br2,0.61316127,0.31417135375 -Os1F2_187_13801.vasp,Os1F2,-1.946669276666667,1.165882247166664 -Zr2S2I2_59_21649.vasp,Zr2S2I2,-3.460879886666667,0.0479541649999992 -Zr2F2_12_21561.vasp,Zr2F2,-4.2500243675,0.1359110512499999 -Mn1Sb1S1Br2_1_10859.vasp,Mn1Sb1S1Br2,-1.674713366,0.0175890732499977 -Sn1Pb1S2_6_16670.vasp,Sn1Pb1S2,-2.28770217,-0.7192203368750003 -Nb2Mo2S11_5_12763.vasp,Nb2Mo2S11,-3.6161182053333336,0.4363253492916633 -Cu4As4O22_2_5394.vasp,Cu4As4O22,-3.336228402666667,0.2763089001666596 -Tb2C1_164_18187.vasp,Tb2C1,-4.044983383333333,0.3032923679999948 -Tl2Te3_164_19553.vasp,Tl2Te3,-0.6645521600000001,0.3230782059999999 -Ge2Cl2_164_6768.vasp,Ge2Cl2,-2.1865515,-0.1679119162500003 -In2S1Cl2O1_6_8539.vasp,In2S1Cl2O1,-2.266944255,0.2022621616666647 -B6Pd1C2Cl2F4_25_1784.vasp,B6Pd1C2Cl2F4,-3.800575039333333,0.802423227194428 -Re2Ge1Te5Rh3I1_1_15047.vasp,Re2Ge1Te5Rh3I1,-2.6290632925,0.4551493579513812 -Ba2I4_2_2006.vasp,Ba2I4,-1.0571346666666666,0.48738726 -Y3C2O2_187_20791.vasp,Y3C2O2,-6.62597891,0.4285471543415116 -Hg2Cl4_55_7957.vasp,Hg2Cl4,0.309290515,0.1790523383333333 -Cr4N3O2_164_4610.vasp,Cr4N3O2,-5.183621193333334,0.1280678062962907 -Pd1Se1S1_25_14388.vasp,Pd1Se1S1,-1.85073403,0.2323404462500001 -Na1Al1P2O6_5_11812.vasp,Na1Al1P2O6,-5.23135229,0.2744760230333282 -Mn8F28_4_11475.vasp,Mn8F28,-2.606256728611111,-0.2309391756944465 -Sr1Br2_115_17030.vasp,Sr1Br2,-1.5745483366666668,0.2686206799999999 -Al2Te4Pd1_164_1017.vasp,Al2Te4Pd1,-1.8908986671428567,0.1066796879081594 -Fe1H8C6O4_10_5711.vasp,Fe1H8C6O4,-5.118871416842105,0.27862101807017 -Hf1Zr1Sc1Br2N1O1_6_7395.vasp,Hf1Zr1Sc1Br2N1O1,-4.727060287142857,0.610035292678562 -Mo4C3_164_11739.vasp,Mo4C3,-5.006109795714286,0.511250714642852 -Co1Ni1Br6_5_3783.vasp,Co1Ni1Br6,-0.43864104,0.0121425324999999 -Zr1Mn1N1Cl2O1_1_21323.vasp,Zr1Mn1N1Cl2O1,-4.203280596666667,0.3814668392708283 -As2Pd2S7_6_1270.vasp,As2Pd2S7,-2.173793307272728,0.6902383170454516 -Ag2B4Br2N2F4_2_184.vasp,Ag2B4Br2N2F4,-3.601627904285714,0.3101264101587184 -Sc2B1H2_164_16034.vasp,Sc2B1H2,-3.75064051,0.2105274274999983 -Ag2H4C4I2N2_2_273.vasp,Ag2H4C4I2N2,-4.07110712,0.1560813642857048 -Zr2C2I2_164_21544.vasp,Zr2C2I2,-4.290074395,0.3146673409523743 -Na2Hg4S2I6O6_31_12154.vasp,Na2Hg4S2I6O6,-1.5055299515,0.1031085518611073 -Nb8Pt1Se20_12_13208.vasp,Nb8Pt1Se20,-3.843562266551724,0.0721169389655171 -Ni1B6C2F6_25_13277.vasp,Ni1B6C2F6,-3.935623470666667,0.8013109008611002 -In2Hg1S4_164_8470.vasp,In2Hg1S4,-1.741311697142857,0.0518813178571428 -Hf1Zn1Te1S1_156_7373.vasp,Hf1Zn1Te1S1,-2.3987983325,0.3651204324999999 -Li2Pt1O6_162_10045.vasp,Li2Pt1O6,-2.867641667777778,0.8774009265277747 -K2Fe2P2_129_9103.vasp,K2Fe2P2,-1.5085982733333332,0.0602371516666666 -Ni2S2Br2_59_13580.vasp,Ni2S2Br2,-0.976079015,-0.0767239297916684 -In2Ni4Te6_164_8506.vasp,In2Ni4Te6,-0.6946886233333333,0.1423656666666661 -Hf1Mn1Cl2O2_1_7210.vasp,Hf1Mn1Cl2O2,-4.40142902,0.3902192108333331 -V2Ni1Te4_164_20117.vasp,V2Ni1Te4,-1.831004485714285,0.2396801801190458 -Li4Fe4F16_10_10187.vasp,Li4Fe4F16,-2.4876784425,0.2932617025000001 -Ga2Cu1S3I1Br1_1_6341.vasp,Ga2Cu1S3I1Br1,-1.63274946125,0.2702255451171874 -Rb2Br2Cl8_127_14780.vasp,Rb2Br2Cl8,-0.5074264541666667,0.121100144583333 -Co1S2_115_3818.vasp,Co1S2,-2.2789784666666666,0.7117858575000002 -Ga2Br2O2_59_6310.vasp,Ga2Br2O2,-3.050591588333333,-0.2776143343055582 -Cd3C2S6_164_3612.vasp,Cd3C2S6,-1.9953814863636363,0.5986901032386276 -Nb4H1I1Br1O4_1_13082.vasp,Nb4H1I1Br1O4,-4.965786792727273,0.3069762479734752 -Zr2P2Se1S5_1_21628.vasp,Zr2P2Se1S5,-3.964922664,0.2285520553749958 -Y18C8I16O2_59_20601.vasp,Y18C8I16O2,-4.433265395227273,0.0371256515909097 -Re6S8Cl2_2_15126.vasp,Re6S8Cl2,-4.787737905,0.0554851793750001 -Au2O4_14_1504.vasp,Au2O4,-1.657356726666667,0.4186309585416639 -Sr2Au1S2Br2_38_17127.vasp,Sr2Au1S2Br2,-1.8088117528571428,0.1237280999999965 -Sr1Cl2_187_17040.vasp,Sr1Cl2,-2.18238814,0.3151096133333331 -Mn1Sb1S2_1_10861.vasp,Mn1Sb1S2,-2.4853601475,0.5773628443750002 -Rb2Hg4Te2Cl6O6_31_14885.vasp,Rb2Hg4Te2Cl6O6,-1.3551759255,0.2375287464999959 -Zr2Si4_129_21691.vasp,Zr2Si4,-4.305046196666667,0.5373119166666669 -Mo2C1O2_164_11583.vasp,Mo2C1O2,-5.1491550660000005,0.3652162849999998 -Co2As2S6_162_3846.vasp,Co2As2S6,-2.788286763,0.4636822239473652 -Tl4Ag4C8N8_2_19585.vasp,Tl4Ag4C8N8,-4.48935453375,0.0594941343055522 -Hf4Te4I4_31_7824.vasp,Hf4Te4I4,-2.9187706775,0.1198769304166642 -Pt2S2O8_3_14660.vasp,Pt2S2O8,-3.021484576666667,0.8462679574999994 -Ta2I5_1_17765.vasp,Ta2I5,-1.826706784285714,0.5555802352455337 -Nb1S1F1_156_12558.vasp,Nb1S1F1,-4.465691586666667,0.4120514377777731 -Sr4Mn2S6Br2_129_17448.vasp,Sr4Mn2S6Br2,-2.772712220714286,-0.0119237521428594 -P2Pd2O6_162_14020.vasp,P2Pd2O6,-3.959386286,0.6684078985000005 -Se10N10_4_16281.vasp,Se10N10,-3.3871643395,0.6319869598750003 -Ga1Ni1S2Br1Cl1_1_6214.vasp,Ga1Ni1S2Br1Cl1,-1.4310205466666668,0.3050729535937459 -Fe2As2I2O4_26_5775.vasp,Fe2As2I2O4,-2.977704385,-0.0429055770166745 -Li2V4Ni2O12_13_10131.vasp,Li2V4Ni2O12,-4.5865465895,0.1544325169999947 -Sc2H2I2_164_16082.vasp,Sc2H2I2,-2.675398283333333,0.0199345702777762 -Ag2Sb4S3Br2_6_410.vasp,Ag2Sb4S3Br2,-1.475274339090909,-0.2094828551515169 -Ge2Sb2S6_28_6856.vasp,Ge2Sb2S6,-2.817348145,0.1640648517916646 -Rh1Se2_164_15170.vasp,Rh1Se2,-2.30901455,0.3646559566666663 -S6N4_11_15401.vasp,S6N4,-3.540939744,0.2432913846250006 -K2H2C2O6_2_9118.vasp,K2H2C2O6,-4.844006449166667,-0.0340958274999998 -Pd3S1I1Br1O2_1_14506.vasp,Pd3S1I1Br1O2,-1.348526475,0.6228339953124999 -Cu4Se2_25_5469.vasp,Cu4Se2,-0.3113853016666666,0.1043120974999988 -Cr2F10_25_4378.vasp,Cr2F10,-2.51847474,0.0241735700000003 -Li2Fe2Bi2_129_9905.vasp,Li2Fe2Bi2,-0.7615612833333333,0.5350086799999988 -Ag2B4H4Br2N2_2_186.vasp,Ag2B4H4Br2N2,-3.5887690792857145,0.4724359732857066 -Cu4Cl4O4_14_5404.vasp,Cu4Cl4O4,-1.3149280633333331,0.2282222379166653 -Cu3Se2Cl2O6_12_5388.vasp,Cu3Se2Cl2O6,-2.3831732800000003,0.0599578997115334 -Ta2Co4S4_51_17706.vasp,Ta2Co4S4,-3.820291537,0.1021076520000003 -As4O8_31_1338.vasp,As4O8,-4.2506390650000005,0.1905641204166577 -Si1I2_115_16343.vasp,Si1I2,-0.9388572966666668,0.3709637619444431 -V1Re1Cl6_5_19904.vasp,V1Re1Cl6,-2.32725822625,0.157823082916664 -Te2Pb1_187_18449.vasp,Te2Pb1,-1.0201783466666667,-0.5367612111111115 -Y2H4N2O10_4_20742.vasp,Y2H4N2O10,-5.312258910555555,0.0508055888888892 -Be2F4_2_2254.vasp,Be2F4,-4.165967873333334,0.1403595966666664 -Co1Ni1Te2P1_8_3795.vasp,Co1Ni1Te2P1,-1.786447378,0.1205910044999999 -Mn1Fe1Te1Se1_6_10711.vasp,Mn1Fe1Te1Se1,-1.5150432975,0.5593397431249976 -Ni2Sb2Pt2_129_13610.vasp,Ni2Sb2Pt2,-1.083933675,0.1984753044444431 -Ca2Cl2O1_12_2977.vasp,Ca2Cl2O1,-3.127434656,0.0965439429999965 -Tl1In1Hg1Se4_156_19296.vasp,Tl1In1Hg1Se4,-1.0587088085714285,0.0260792469047599 -Fe1B4C2Cl2F4_47_5623.vasp,Fe1B4C2Cl2F4,-3.941178085384616,0.3676770758333219 -K2Cd4Se2S6F6_31_9064.vasp,K2Cd4Se2S6F6,-1.3465026105,0.4100295064583327 -Ge2Te4_127_6890.vasp,Ge2Te4,-1.5147710633333331,-0.0153482611111122 -Li1Al1As2Se6_5_9638.vasp,Li1Al1As2Se6,-2.506589804,0.2695792198333312 -W2F2_129_20491.vasp,W2F2,-2747.2542571225,-2742.331912289375 -B2Te3_189_1717.vasp,B2Te3,-2.627953958,0.7795116153333336 -Pt1I2_164_14575.vasp,Pt1I2,-0.1438904133333333,0.3714651716666667 -Tm2Cl2O2_164_19674.vasp,Tm2Cl2O2,-5.064365261666667,0.0328597550000004 -Zr2Te2N1_164_21705.vasp,Zr2Te2N1,-4.65286659,0.0728476279999998 -Ge1Te2_115_6718.vasp,Ge1Te2,-1.77162582,-0.272203017777779 -Zr2Te6As2_2_21717.vasp,Zr2Te6As2,-2.583451681,0.2358927189999946 -Co1Ni1O1F5_38_3785.vasp,Co1Ni1O1F5,-1.88767970375,0.2062885489062477 -Hf1Ge2Rh1O8_6_7184.vasp,Hf1Ge2Rh1O8,-5.125270310833334,0.3534027260416661 -Ti2Pb4_59_18986.vasp,Ti2Pb4,-2.195823895,0.7246469338888866 -Nb2Ir1Se3I1Br1_1_12758.vasp,Nb2Ir1Se3I1Br1,-3.0812090375,0.3125661346986536 -Sc2Te2_129_16180.vasp,Sc2Te2,-2.8747676175,0.3320738525000002 -Ta1F2_187_17541.vasp,Ta1F2,-4.370480976666667,0.9006598206666623 -Zn3N1_191_21207.vasp,Zn3N1,0.659470315,0.2453472706249999 -Bi2Pb1S4_164_2498.vasp,Bi2Pb1S4,-2.4378445385714285,-0.4573961064285734 -Au2O5_21_1505.vasp,Au2O5,-1.2229969628571429,1.036015881071426 -Ta2Ni4Te2S2_51_17804.vasp,Ta2Ni4Te2S2,-2.522686158,0.0149061755769219 -Li3Fe3O4F4_6_10147.vasp,Li3Fe3O4F4,-3.550129627857143,-0.1255707495535776 -Cd1C2N4F6_1_3293.vasp,Cd1C2N4F6,-3.170123547692308,0.7329173433974288 -V2W2O10_85_20227.vasp,V2W2O10,-5.739356550714286,0.0449235117857091 -Sr4As4Se8F4_14_17408.vasp,Sr4As4Se8F4,-2.944846258,0.0087879960000003 -Ni2Sb1S2_187_13601.vasp,Ni2Sb1S2,-1.455725898,0.2903246433333317 -Hf3N2F2_187_7720.vasp,Hf3N2F2,-6.516784374285714,0.3876399207142795 -Ti1I1F1_156_18794.vasp,Ti1I1F1,-3.2708807866666665,0.1337303736111056 -Ge2P2Se1S5_8_6812.vasp,Ge2P2Se1S5,-3.172862928,0.0441502304114517 -Rb2Cl2F8_127_14833.vasp,Rb2Cl2F8,-1.1255228441666667,0.1165794741666665 -K2Fe2Se4_67_9105.vasp,K2Fe2Se4,-1.3122172775,0.3140545243749999 -Si3As2S9_174_16464.vasp,Si3As2S9,-3.3289804842857142,0.4230536316071394 -Cr1Te8W3_25_4283.vasp,Cr1Te8W3,-2.6250615875,0.1443734109722223 -Tl1Pd5Cl2_123_19319.vasp,Tl1Pd5Cl2,-0.72388565625,0.6651307299999999 -Na1Sr1Mn2Sb1S1Br1_1_11938.vasp,Na1Sr1Mn2Sb1S1Br1,-1.5511808042857145,0.4680924839655115 -In1As1_187_8189.vasp,In1As1,-1.591581925,-0.277243165 -Zn2Ni1C6N6_12_21124.vasp,Zn2Ni1C6N6,-5.281356878666667,0.4068462436481425 -Ca3Pb1_25_3197.vasp,Ca3Pb1,0.2184689125,0.8437108175 -Sr4Sb4S8F4_14_17469.vasp,Sr4Sb4S8F4,-3.175797046,0.0460578960000002 -Sc6N3Cl1O5_157_16273.vasp,Sc6N3Cl1O5,-5.867254457333333,0.2356328829999947 -Ca1Sn1S3_25_2883.vasp,Ca1Sn1S3,-2.494605098,0.4230688622499973 -Se2N2_129_16287.vasp,Se2N2,-3.20200511,0.817146189375 -V2Se2_129_20187.vasp,V2Se2,-3.1782137775,0.2684385837499965 -Mn1P2F12_2_10835.vasp,Mn1P2F12,-3.016827652666667,0.026909566 -Sn1Sb1_156_16686.vasp,Sn1Sb1,-1.275424425,0.5607049015625001 -Ga2P2_164_6430.vasp,Ga2P2,-2.6674570275,-0.5239320474999998 -Hg1Cl2_164_7849.vasp,Hg1Cl2,0.21788293,0.0876447533333333 -Sn2I6_1_16787.vasp,Sn2I6,-0.24560183,0.186022866354166 -La2Cr2Bi2O12_7_9589.vasp,La2Cr2Bi2O12,-4.965593836666667,0.1824880028935107 -Hf1V1Se1Br1_25_7356.vasp,Hf1V1Se1Br1,-3.1987351,0.8549344743750003 -Na2Hg4Te2S6Cl6_31_12175.vasp,Na2Hg4Te2S6Cl6,-0.8305047695000001,0.2594230032083327 -K8Fe2_125_9551.vasp,K8Fe2,1.548732717,0.996897721 -Th1Co5_65_18714.vasp,Th1Co5,-0.2887313683333333,1.9224023818888865 -Hf2N2Cl2_164_7541.vasp,Hf2N2Cl2,-6.227644608333333,0.0132466816666676 -V2Se6_59_20193.vasp,V2Se6,-2.7624694225,0.1001949494999998 -Ga1_123_6298.vasp,Ga1,-1.07274395,0.0221550299999999 -Tl2Cl2_12_19389.vasp,Tl2Cl2,-0.92954395,-0.00204614 -Na2Tm2S4O16_11_12329.vasp,Na2Tm2S4O16,-4.875887280416666,0.0761035225000004 -Au4Br4O4F4_14_1566.vasp,Au4Br4O4F4,-0.541878878125,0.4760304741145828 -K2S6I2_11_9336.vasp,K2S6I2,-1.369687165,0.2333991626250002 -Cu2Te2_12_5336.vasp,Cu2Te2,-0.1109071525,0.4565733824999999 -Na2As2H8O10_11_11963.vasp,Na2As2H8O10,-4.136376914090909,0.1318426084848449 -Tl2Zn1O4_156_19564.vasp,Tl2Zn1O4,-2.3203804985714287,0.2446545439285692 -Fe2Si4O12_12_5991.vasp,Fe2Si4O12,-5.453398948888889,0.0671900248611025 -Cr1Te6P2Au1_5_4281.vasp,Cr1Te6P2Au1,-1.705048011,0.2414536477916652 -Pb4N8_26_14312.vasp,Pb4N8,-4.473678578333334,-0.3417827900000039 -Sr3Au2S4Cl2_123_17353.vasp,Sr3Au2S4Cl2,-1.9973477927272727,0.1380192163636322 -Cr1Mo3O8_25_4214.vasp,Cr1Mo3O8,-5.127822256666667,0.0810345056944399 -Mo2O8_10_11652.vasp,Mo2O8,-4.480787669,0.2928237772499973 -Cr4B3H2S2_164_4590.vasp,Cr4B3H2S2,-3.8578242954545456,0.4849502135908996 -Rb1Pb1S2_156_14748.vasp,Rb1Pb1S2,-1.58034601,-0.3542743629166666 -Tl1Cu1As2S6_149_19250.vasp,Tl1Cu1As2S6,-2.1339474540000003,0.4674373618541612 -P1S2_115_13943.vasp,P1S2,-2.9507947100000003,0.3329235448958267 -Ge2Sb2H6S6N2_7_6848.vasp,Ge2Sb2H6S6N2,-3.516850167222222,0.1515814694372073 -Mg2Ag2O5_6_10415.vasp,Mg2Ag2O5,-2.7092462511111117,0.007821151805553 -Nb2S4Cl4_12_12852.vasp,Nb2S4Cl4,-3.400311131,0.050026657 -Al2Sb2_129_956.vasp,Al2Sb2,-2.291596535,-0.74271361 -Hg4O4_55_8084.vasp,Hg4O4,-0.5521412775,0.2187040908333333 -Tb5F8_10_18215.vasp,Tb5F8,-3.725863113846154,0.5296790392307655 -Ba2Tl1Bi2O7_25_2076.vasp,Ba2Tl1Bi2O7,-3.628205558333333,0.1900967157986085 -Ca2S4I4F8_30_3108.vasp,Ca2S4I4F8,-1.546485798888889,0.6534746391319399 -Ge6Bi6_12_6958.vasp,Ge6Bi6,-2.0711177491666666,-0.7511959391666667 -K2Mg1H4O10_2_9214.vasp,K2Mg1H4O10,-3.342684078823529,0.3307474081372449 -Cd1Ag2P2S6_149_3266.vasp,Cd1Ag2P2S6,-2.064898630909091,0.0718079413636361 -B4Se6_1_1768.vasp,B4Se6,-3.50902692,0.2925586166666644 -Mg2H14C10O14_2_10463.vasp,Mg2H14C10O14,-5.2979670675,0.1587899333958287 -In2Ni2Te5_187_8501.vasp,In2Ni2Te5,-0.90330878,0.0892361838888872 -Re2Te2_164_15089.vasp,Re2Te2,-4.086288175,0.4789603025000004 -Au2Cl2O2_59_1465.vasp,Au2Cl2O2,-0.74611822,0.3557990177777776 -Ti2Te6As2_162_19047.vasp,Ti2Te6As2,-2.830881603,0.1403598259999947 -Y4C1I5_10_20811.vasp,Y4C1I5,-3.381115223,0.0760127490000002 -Ta2Te4Cl4_12_17914.vasp,Ta2Te4Cl4,-2.737148039,0.170129473066664 -Zr1Ni1H6_5_21375.vasp,Zr1Ni1H6,-2.86575311,0.8962203800000001 -Ca2Co2Ge2_129_2988.vasp,Ca2Co2Ge2,-1.81524125,0.1801228839999984 -Zr1Mo2O8_164_21331.vasp,Zr1Mo2O8,-5.6351780281818185,0.063844139090909 -Tl1H2S2_164_19282.vasp,Tl1H2S2,-2.363829432,0.2136220119375 -Ni3P2S8_164_13708.vasp,Ni3P2S8,-2.3854868684615385,0.0669491346153847 -Ag4I8_13_532.vasp,Ag4I8,0.5101462425,0.1514070497916669 -Mn1In1Ir1S3Br2_1_10775.vasp,Mn1In1Ir1S3Br2,-2.27686062375,0.1044077882031226 -Zr3N2Cl2_187_21771.vasp,Zr3N2Cl2,-5.479840647142857,-0.0128121028571488 -W3N2O2_187_20563.vasp,W3N2O2,-6.282427818571429,-0.1856550501069062 -Ga1Ge1Te1Se1_1_6195.vasp,Ga1Ge1Te1Se1,-2.2480516825,-0.254967303125 -B1I3_189_1625.vasp,B1I3,-1.104902635,0.1263829787499999 -Mn1As2F12_2_10635.vasp,Mn1As2F12,-2.5193536166666664,-0.0659055636666686 -P4Au4S4_29_14073.vasp,P4Au4S4,-1.9610130833333332,0.1777733224999997 -Fe2Cl6_1_5840.vasp,Fe2Cl6,-1.0821720075,-0.044324284375 -Zr1Nb1S1Cl2_156_21350.vasp,Zr1Nb1S1Cl2,-3.8767766,0.163084126499994 -Hf1Ni1I6_149_7248.vasp,Hf1Ni1I6,-0.84976477625,0.1221994293749999 -Mn1Sb2Te4_164_10874.vasp,Mn1Sb2Te4,-1.70722806,0.1408822766666646 -Nb1O2_187_12553.vasp,Nb1O2,-6.58999013,0.3955200762500004 -Sc2Te2Br2_59_16173.vasp,Sc2Te2Br2,-2.6712724883333334,0.074420692777775 -Ta2As2Se6_2_17649.vasp,Ta2As2Se6,-3.631441808,0.2683596526666636 -Ru1S1F1_8_15287.vasp,Ru1S1F1,-2.941781333333333,0.24153567833333 -Al2Cr1S4_164_814.vasp,Al2Cr1S4,-3.475627671428572,0.2232494671977937 -Ge2Sb2Te6_143_6858.vasp,Ge2Sb2Te6,-1.747810612,-0.0821826693333349 -Ge2Pb2S12O42_2_6817.vasp,Ge2Pb2S12O42,-4.317377430172414,0.0189435074137929 -Mn1W1I1Br1N3_8_10931.vasp,Mn1W1I1Br1N3,-3.9780431257142856,0.186045223928569 -Ir4S8_2_8864.vasp,Ir4S8,-3.30015102,-0.2107960866666669 -Mn1Cd1Se2_8_10663.vasp,Mn1Cd1Se2,-0.98438329,-0.0318902568534503 -Si4H4S10_4_16492.vasp,Si4H4S10,-3.491885166111111,0.1728865202777743 -Zn2Cu2H6Cl2O6_11_21070.vasp,Zn2Cu2H6Cl2O6,-2.8717766138888887,0.0982873120601772 -Hf1Os1Se2I2_6_7254.vasp,Hf1Os1Se2I2,-2.927140395,0.3869773395833306 -In2Ni2Se5_156_8499.vasp,In2Ni2Se5,-1.4012408388888888,0.0550122222222205 -Os8Se10_1_13899.vasp,Os8Se10,-3.2618175205555557,0.6734415144444399 -Zr2P1S2_164_21622.vasp,Zr2P1S2,-5.019322084000001,0.0104708492499998 -Sn2N6_164_16793.vasp,Sn2N6,-4.8131333,-1.3146762043749995 -V2Br10_2_19997.vasp,V2Br10,-1.1133240291666666,0.0504755991666663 -Sn2Se2I2_59_16879.vasp,Sn2Se2I2,-1.2617136016666668,0.169107517222222 -Sb2Br2_129_15551.vasp,Sb2Br2,-1.055999055,0.4377490499999987 -Cu2B4I2N2F4_2_5036.vasp,Cu2B4I2N2F4,-3.635881140714286,0.2841539923015735 -Os2Se2_67_13887.vasp,Os2Se2,-2.7553859825,1.37519194 -Yb2Cl6_12_20866.vasp,Yb2Cl6,-2.8950608375,-1.0169336193749998 -Fe1Te2_115_5766.vasp,Fe1Te2,-0.74435689,0.8838950249999998 -Cs2Hg4Se2Br6O6_31_4735.vasp,Cs2Hg4Se2Br6O6,-1.2805580195,0.1005315796666665 -Sn2P2H2O6_7_16810.vasp,Sn2P2H2O6,-4.6231300725,0.0533181171626906 -Bi4W2_2_2659.vasp,Bi4W2,-2.405416871666666,0.2449975149999979 -V2Se2_164_20189.vasp,V2Se2,-3.2339985175,0.2126538437499965 -Nb4Fe2Se10_59_13070.vasp,Nb4Fe2Se10,-3.471033878125,0.0667160868750005 -Ca1Te2F2_1_2893.vasp,Ca1Te2F2,-1.608693794,1.3262694866666669 -Ta4F16_14_18035.vasp,Ta4F16,-4.25977615,0.2880170487999999 -V1Ag1Sb2Te6_5_19761.vasp,V1Ag1Sb2Te6,-1.421642953,0.2744253754444433 -Nb1Se2_10_12577.vasp,Nb1Se2,-3.49778952,0.7580794875000003 -Cd1H8C10Br2N2_47_3360.vasp,Cd1H8C10Br2N2,-5.243527926521739,0.0940569236956498 -W3O8_10_20565.vasp,W3O8,-5.872173956363636,0.3273615030612178 -Mn1W1Br2_156_10929.vasp,Mn1W1Br2,-2.07642779,0.6399495456250002 -Ni2Bi2Br2O4_10_13464.vasp,Ni2Bi2Br2O4,-2.061613931,0.3179474790000002 -In2H14N4_10_8460.vasp,In2H14N4,-3.8250816255,-3.2993711985000047 -Mn2P4O14_2_11205.vasp,Mn2P4O14,-5.2063540405,0.101784600187492 -Cu1Au1Br2_5_4837.vasp,Cu1Au1Br2,0.16069978,0.3065659620833328 -Na4C1S4_5_12374.vasp,Na4C1S4,-2.640137942222222,0.367293547777775 -Zr2I2_12_21593.vasp,Zr2I2,-2.47467188,0.0573781375000004 -Mn2As2S4Cl2_26_10973.vasp,Mn2As2S4Cl2,-2.579954766,0.1709993936249999 -Zr2S2Cl2_59_21644.vasp,Zr2S2Cl2,-4.0100225583333335,0.0383501883333332 -Sr2Br2_129_17153.vasp,Sr2Br2,-0.697555715,0.76445735 -Ca1Br2_164_2811.vasp,Ca1Br2,-1.8452405066666664,0.0848931566666668 -Mn3Cr1Se1S2Br3O1_1_11374.vasp,Mn3Cr1Se1S2Br3O1,-2.547666431818182,-0.0553459441666733 -Pa2N4_123_14166.vasp,Pa2N4,-7.592362141666666,0.4032635744444377 -Zn1W2O5_38_21024.vasp,Zn1W2O5,-4.8424305675,0.2953503174744842 -Ba2Cu1S2I2_38_1969.vasp,Ba2Cu1S2I2,-1.9755262957142856,0.0450712440029721 -Re2F2_129_15043.vasp,Re2F2,-3.1986151075,1.7945496058333277 -Sb4O6_81_15785.vasp,Sb4O6,-4.073814623,0.1836758445000006 -Ti4Zn4F20_14_19171.vasp,Ti4Zn4F20,-3.2296465189285715,-0.0501969365476218 -Tl4Pt2C8N8_14_19618.vasp,Tl4Pt2C8N8,-5.376368178181818,-0.1777546948484933 -Li2Cd2P2O8_11_9855.vasp,Li2Cd2P2O8,-4.227770849285714,0.1886670707142856 -Ag2P4Se3Br2_6_363.vasp,Ag2P4Se3Br2,-1.8744372227272728,0.1324268184659045 -Cs2Cd4O8F6_31_4685.vasp,Cs2Cd4O8F6,-1.6761123269999998,0.4604864230416672 -Nb2O5_12_12798.vasp,Nb2O5,-6.6602381657142855,-0.1930631608928596 -In1Ag1Te6As2_149_8186.vasp,In1Ag1Te6As2,-1.3120540200000002,0.263476520666665 -I8O20_14_8169.vasp,I8O20,-2.449495819642857,0.1046183417857147 -Al2Fe2O5_187_833.vasp,Al2Fe2O5,-5.003763157777778,-0.0259214306481532 -Ti4S4I4_7_19160.vasp,Ti4S4I4,-3.751852633333333,-0.0752211418750081 -Ge2Te5As2_164_6891.vasp,Ge2Te5As2,-2.208556487777778,-0.3840740038888907 -Li4P4O8_14_10213.vasp,Li4P4O8,-4.994079289375,0.219312686024991 -K2Te2C2S6Cl6_1_9367.vasp,K2Te2C2S6Cl6,-1.9961945138888888,0.512044526273146 -Ni1As2_123_13257.vasp,Ni1As2,-1.8852540933333333,0.2497114925000001 -Pr4B2C2_12_14556.vasp,Pr4B2C2,-4.83866287375,0.2432152925000004 -K2Y1Te2_164_9390.vasp,K2Y1Te2,-1.91035808,0.1438542316666629 -Na2C2F4_67_11996.vasp,Na2C2F4,-2.74525456875,0.9112081031249996 -Rh2I2_129_15196.vasp,Rh2I2,-0.583111785,0.8553160099999986 -Na2Ni1H2_123_12232.vasp,Na2Ni1H2,-1.301737146,1.828658994 -Nb2B1Se2_164_12636.vasp,Nb2B1Se2,-5.26115661,-0.2283417425000031 -Tl2Se2_12_19532.vasp,Tl2Se2,-1.121175175,0.1787044660416665 -Ni2S4_59_13597.vasp,Ni2S4,-1.5481137433333334,0.2954968470833312 -Fe2As2S5_8_5783.vasp,Fe2As2S5,-2.6410768355555554,-0.196779543437503 -Cr2P2O10_85_4447.vasp,Cr2P2O10,-5.215385339285715,-0.0517586481547651 -Ga1Cu1As2O6_149_6159.vasp,Ga1Cu1As2O6,-3.614332458,0.5598815506249961 -Cd1Cl2_187_3302.vasp,Cd1Cl2,-0.22025186,0.1841424933333333 -Co2Bi1Te2_187_3861.vasp,Co2Bi1Te2,-1.502003428,0.1145037166666667 -Nb2Se2_187_12876.vasp,Nb2Se2,-4.2307315225,0.0106674322500004 -Sn3O6_5_16919.vasp,Sn3O6,-3.885654281111112,0.4755650138888883 -Cu2Sb4Te3Br2_6_5284.vasp,Cu2Sb4Te3Br2,-1.0871621227272728,0.6257570918181785 -Si2_164_16462.vasp,Si2,-3.47139981,-0.48125076 -Mn2H2S2_59_11095.vasp,Mn2H2S2,-2.7551861950000003,0.8250911983333298 -Zr1S2_187_21418.vasp,Zr1S2,-4.51380607,0.2850644974999996 -Ag4Te4I4_14_575.vasp,Ag4Te4I4,-0.0455606408333333,0.246719074722222 -Cu2O2_10_5200.vasp,Cu2O2,-1.8349594125,0.637829085625 -Lu2I2O2_129_10312.vasp,Lu2I2O2,-4.45577725,0.0357569900000003 -Ba2Ag1Te2Cl2_38_1894.vasp,Ba2Ag1Te2Cl2,-1.5271090271428571,0.4400052787127932 -Sr2P4H8O12_2_17293.vasp,Sr2P4H8O12,-4.885497428076923,0.0437477930224219 -Rh2S2_129_15222.vasp,Rh2S2,-2.571834575,0.4349107248913014 -Sb4As2H2S12_4_15761.vasp,Sb4As2H2S12,-2.6798839155,0.3485553494374975 -Tl2Se5_1_19540.vasp,Tl2Se5,-1.3511776985714286,0.1725944942857142 -Yb2Br2O2_129_20862.vasp,Yb2Br2O2,-4.823774925,-1.1933042250000023 -Na2B2S4O16_13_11985.vasp,Na2B2S4O16,-4.782341372083333,-0.0479584454166666 -Mg1I2_187_10379.vasp,Mg1I2,-0.64296862,0.2187856266666666 -Sc2Cl2O2_129_16060.vasp,Sc2Cl2O2,-3.640937186666666,1.3455881516666666 -Bi2Te2_2_2568.vasp,Bi2Te2,-1.214765405,0.3050715949999998 -Cr1S1Br2_47_4239.vasp,Cr1S1Br2,-1.734054855,0.0241731524479154 -Co1O2F2_164_3801.vasp,Co1O2F2,-2.1180386980000003,0.6136615579999998 -P1Se2_115_13949.vasp,P1Se2,-2.368841136666666,0.4464453775694422 -Na1As2Pd1S6_149_11821.vasp,Na1As2Pd1S6,-2.45845129,0.4737857993437474 -Tl2S2I2_59_19502.vasp,Tl2S2I2,-0.7926443416666666,0.3721257964583323 -Ta4Cr2S12_14_18033.vasp,Ta4Cr2S12,-4.699060975,0.0692984861111067 -Re6S8F2_2_15127.vasp,Re6S8F2,-4.957479385,-0.0041350885416724 -Ca1Ag2S8_89_2798.vasp,Ca1Ag2S8,-1.9430743618181816,0.1345313687499967 -B4Au2N2Cl2F4_2_1747.vasp,B4Au2N2Cl2F4,-3.607496512142857,0.7366335709523704 -Ge2I2O2_59_6780.vasp,Ge2I2O2,-2.7141013266666665,0.3376274104166668 -Fe6Se8_11_6098.vasp,Fe6Se8,-1.784776405,-0.0077553157142876 -W4C3_164_20581.vasp,W4C3,-6.381439967142858,0.3025715728571356 -K2C2S2O6F6_4_9021.vasp,K2C2S2O6F6,-3.732928671111111,0.070687635162029 -Ho1Cu2S2_164_8115.vasp,Ho1Cu2S2,-2.086689996,0.8660364740000004 -U2F12_2_19707.vasp,U2F12,-4.346045296428572,0.0553953560714282 -Li2V2F10_85_10119.vasp,Li2V2F10,-3.3366951435714287,0.0459925797618985 -Ge1S2_164_6700.vasp,Ge1S2,-3.031778333333333,0.1257396977083331 -B2Se3_189_1712.vasp,B2Se3,-3.471815394,0.3297701426666645 -K2Sb6O10_7_9345.vasp,K2Sb6O10,-3.864549067777778,0.1228753369444404 -Pt2N4O12_14_14639.vasp,Pt2N4O12,-4.152449040555556,0.1654747166666621 -Mn1W1Cl4_1_10930.vasp,Mn1W1Cl4,-2.15629619,0.2617026266666629 -K4V4O4F12_11_9527.vasp,K4V4O4F12,-3.5686394220833333,0.0019273315624965 -P2Ru2O6_8_14042.vasp,P2Ru2O6,-4.650087327,0.5801420716666623 -Sr4Ga2Sb4O14_4_17441.vasp,Sr4Ga2Sb4O14,-4.310244924166667,0.2032136646874918 -Mo2O2_6_11646.vasp,Mo2O2,-4.02894291,1.29729510125 -Fe1Ge2_123_5682.vasp,Fe1Ge2,-2.0291155733333333,0.2103425616666645 -Li4V1Te3O12_3_10236.vasp,Li4V1Te3O12,-4.0994356465,0.2186054871250005 -Ca2Cl4_2_2982.vasp,Ca2Cl4,-2.057667095,0.1705640433333335 -Ba1Fe8As2_123_1832.vasp,Ba1Fe8As2,-0.1389945981818181,1.93334539181818 -Mo12I24_127_11483.vasp,Mo12I24,-1.2481996938888889,0.0866049666666668 -Pd4_164_14526.vasp,Pd4,-0.09790755,1.55003929 -Pb4Se4O16_14_14321.vasp,Pb4Se4O16,-3.538034530833333,0.1489810179166673 -Ta2I2O2_59_17756.vasp,Ta2I2O2,-4.742986578333333,0.3728690021666623 -Cd2Au2Se2I2_26_3464.vasp,Cd2Au2Se2I2,0.2169189875,-0.0013802473216666 -Mn1H2O2_156_10762.vasp,Mn1H2O2,-3.871094008,0.921770662 -Te2W2_164_18535.vasp,Te2W2,-3.2785418925,0.7595083637500002 -Yb2I6_2_20879.vasp,Yb2I6,-1.5589248775,-0.43844525453125 -In18Se9_143_8173.vasp,In18Se9,-1.3989618637037038,0.7135127512962943 -Cr1H1O2_156_4183.vasp,Cr1H1O2,-4.54359485,0.0772517950000004 -Rb2Cd4Se2Cl6O6_31_14816.vasp,Rb2Cd4Se2Cl6O6,-1.679030597,0.0061881102499995 -Ag4Te2_4_571.vasp,Ag4Te2,0.192120575,0.1450352466666666 -Ga3Ni1S8_6_6529.vasp,Ga3Ni1S8,-2.3023990091666664,0.3114376696093731 -P6Pb6_12_14140.vasp,P6Pb6,-2.03958841,0.6797345082142838 -Li4H8C10O14_13_10198.vasp,Li4H8C10O14,-5.435624597777778,0.2050413631481356 -Ti6O6_129_19183.vasp,Ti6O6,-7.182057205,0.0551599583333342 -Pd1Br2_115_14346.vasp,Pd1Br2,-0.0885707366666666,0.4829247266666667 -Mg2As2Se6_162_10424.vasp,Mg2As2Se6,-2.265573072,0.2028194258333311 -Ho2Co2Sn4_59_8136.vasp,Ho2Co2Sn4,-1.6342754775,0.4409910416666651 -Li1Cr1O2_156_9682.vasp,Li1Cr1O2,-4.299985005,0.5763643612500005 -Sr4Bi4Se8Cl4_14_17411.vasp,Sr4Bi4Se8Cl4,-2.2121155420000003,0.0660787505 -In1Ni1Se1Cl5_1_8284.vasp,In1Ni1Se1Cl5,-0.900118245,0.2249237916666666 -Mn2B1H2_164_10995.vasp,Mn2B1H2,-3.283335826,0.5822508760000005 -Nb1Cu1Cl2O2_6_12495.vasp,Nb1Cu1Cl2O2,-3.618755325,0.2402757796874953 -Eu2Br4O2_59_5599.vasp,Eu2Br4O2,-3.057228205,-0.4491714388281249 -Cr1B4H4S6F1_2_4119.vasp,Cr1B4H4S6F1,-3.724504378125,0.6438116606770792 -Ir2S3I1Br2_1_8827.vasp,Ir2S3I1Br2,-1.86592093375,0.1477312721874999 -Al2H10C4F4_10_854.vasp,Al2H10C4F4,-4.1698985925,0.4154239786666629 -In2Te1S1I1Br1_1_8610.vasp,In2Te1S1I1Br1,-1.2082500083333334,0.2138363375 -Al2Si2Se6_162_987.vasp,Al2Si2Se6,-3.096236895,-0.0639757449062525 -Li1Mn1Nb1Si1Te4Br2_1_9745.vasp,Li1Mn1Nb1Si1Te4Br2,-2.202536193,0.3935256374999974 -Hf1Mn1S2Br2_1_7222.vasp,Hf1Mn1S2Br2,-3.0926149966666667,0.2696008320833334 -Nb1Ir1S4_10_12531.vasp,Nb1Ir1S4,-4.058299188333334,-0.3703642000000005 -Nb2Fe2Te6_11_12720.vasp,Nb2Fe2Te6,-2.301777439,0.4380372781666652 -Li1Ir1O4_1_9740.vasp,Li1Ir1O4,-3.8395685116666662,0.2429532960416631 -Ba3N3_25_2118.vasp,Ba3N3,-2.602733171666667,1.3232229949999998 -Ba3Sb3_25_2126.vasp,Ba3Sb3,-1.3239948283333334,0.9593638933333332 -V13Se26_2_19745.vasp,V13Se26,-3.1047040779487176,0.0418996403846154 -Ag2N2O4_5_332.vasp,Ag2N2O4,-3.29751340125,0.0238170652083312 -Nb4H2C3O2_164_13083.vasp,Nb4H2C3O2,-6.601715579090908,0.1870153526136322 -Nb2Br1N1Cl1O1_8_12644.vasp,Nb2Br1N1Cl1O1,-5.25051714,0.0345908508333288 -In4Se6_31_8696.vasp,In4Se6,-1.97463132,0.009690106 -Hg1I2_164_7880.vasp,Hg1I2,0.9218042466666666,0.0489239894444444 -Hf1Ti3O8_1_7341.vasp,Hf1Ti3O8,-7.035007794166667,0.359756574166667 -Nb2Br2N3_6_12648.vasp,Nb2Br2N3,-5.39328234,0.0418926787285625 -Ca4P2_59_3232.vasp,Ca4P2,-1.7377009133333334,0.5019907649999986 -Cs2Te2H6N2O6_1_4793.vasp,Cs2Te2H6N2O6,-3.7675694716666666,0.0731213670454493 -Co2H4S2O8_4_3915.vasp,Co2H4S2O8,-4.025991524375,0.0932775481874947 -Pd1Se1_156_14389.vasp,Pd1Se1,-1.00753822,0.7193174924999999 -Ga1Au1Se2Cl2_1_6139.vasp,Ga1Au1Se2Cl2,-1.2162363116666668,0.2740432606944428 -Ba4Sb4Se8Cl4_14_2183.vasp,Ba4Sb4Se8Cl4,-2.5012565835,0.0827546836250003 -Sc1S1F1_25_15985.vasp,Sc1S1F1,-4.176801476666667,0.1495163169444402 -Na2B2Te2C2_31_11987.vasp,Na2B2Te2C2,-3.0048442575,1.2957803100416656 -Li2H10C6O6_4_9927.vasp,Li2H10C6O6,-5.16924042625,0.1021862892708271 -Pb1Cl2_164_14179.vasp,Pb1Cl2,-1.4921966,-0.2062442183333332 -Hg4Te4_1_8093.vasp,Hg4Te4,0.60075594375,0.1247889220833333 -V2F10_1_20055.vasp,V2F10,-3.031512365,0.0820470797916668 -Re1Br2_187_14996.vasp,Re1Br2,-799.9562596466667,-797.0981474892593 -Nb2H2C1O2_164_12730.vasp,Nb2H2C1O2,-5.921828717142858,0.2750530306377436 -Ni1C6Cl2F4_47_13300.vasp,Ni1C6Cl2F4,-4.06156783,0.4066710399999924 -Sr5La1_1_17489.vasp,Sr5La1,0.4279837766666667,1.111405016666665 -V1Te8Mo3_25_19948.vasp,V1Te8Mo3,-2.1880296466666667,-0.0130486947222222 -Mn1Cl4_123_10666.vasp,Mn1Cl4,-0.8707942259999999,0.4215027970000002 -Sb6Pt3_147_15858.vasp,Sb6Pt3,-2.1467808522222223,0.550889604444444 -Al1Ni1Pt2S4Br3Cl1_6_690.vasp,Al1Ni1Pt2S4Br3Cl1,-1.8376118658333327,0.1096458125694426 -Hf4N3_164_7797.vasp,Hf4N3,-7.529044785714285,0.4225414410714219 -Ta3C2_187_17953.vasp,Ta3C2,-7.735297426,0.749606021499992 -Ta2Se2N1_164_17873.vasp,Ta2Se2N1,-6.070498784,0.2411106716666675 -Al2Fe1O4_164_825.vasp,Al2Fe1O4,-5.344685995714285,0.0423318424404736 -Sr3Fe2Br2O5_123_17373.vasp,Sr3Fe2Br2O5,-3.4964750625,0.0082573347916632 -Bi1Pt3Se6_157_2362.vasp,Bi1Pt3Se6,-1.885622218,0.3338359036499978 -In2As2S6_149_8375.vasp,In2As2S6,-2.223875552,0.7981921037499999 -Ag1Au1Br4_1_5.vasp,Ag1Au1Br4,0.1595929016666666,0.0973992833333333 -Nb3B2H2S2_187_12946.vasp,Nb3B2H2S2,-5.200940712222223,0.4789913761110993 -Cr2Sb2Se6_162_4484.vasp,Cr2Sb2Se6,-2.26773412,0.294658321 -Cd1S2_164_3416.vasp,Cd1S2,-0.7455563000000001,0.6213477739583321 -S2N2_2_15383.vasp,S2N2,-4.0434453,0.0323724109375 -Tc2Br6_12_18224.vasp,Tc2Br6,-2.26480291625,0.0281238268750002 -Te2Au4_191_18377.vasp,Te2Au4,0.2947395066666666,1.0796081683333327 -Ag2Pb8Cl2O8_85_367.vasp,Ag2Pb8Cl2O8,-2.609870441,0.104752547187498 -Ba1Cu2O8_89_1826.vasp,Ba1Cu2O8,-2.9006892763636363,0.2622872004545431 -Al2Cd1O4_164_784.vasp,Al2Cd1O4,-4.575318609999999,0.2355147930952386 -Re1Ir2Rh1Se8_1_15009.vasp,Re1Ir2Rh1Se8,-2.965943730833333,-0.0805417666666665 -Nb2Pd4Se2S2_51_12818.vasp,Nb2Pd4Se2S2,-2.921051139,0.2269404589629552 -Ag2As4Se3Cl2_6_170.vasp,Ag2As4Se3Cl2,-1.650523588181818,1.1885817546969646 -Zr2S2I1Cl1_6_21647.vasp,Zr2S2I1Cl1,-3.729770935,0.0488324641666633 -In1_123_8370.vasp,In1,-0.21476176,2.31583136 -Ta1Cr1Te2_156_17536.vasp,Ta1Cr1Te2,-3.2829946275,0.1980234176562474 -Al1Ni5Cl2_123_697.vasp,Al1Ni5Cl2,-0.29243137125,3.361393159583332 -Mg1B1H1_6_10338.vasp,Mg1B1H1,-2.504172233333333,0.8799046633333338 -Te4Mo2_11_18593.vasp,Te4Mo2,-2.21811506,-0.1072208100000002 -Tl1Cu1Sb2Te6_149_19258.vasp,Tl1Cu1Sb2Te6,-1.023377752,0.3630197759999984 -V1Mo1Cl6_12_19877.vasp,V1Mo1Cl6,-1.91111600625,0.1077299379166667 -Ge4Sb4S4_17_6944.vasp,Ge4Sb4S4,-2.7908326533333336,-0.5288783933333355 -Ag1Te1Se1_6_143.vasp,Ag1Te1Se1,-0.6380676200000001,0.2907392633333324 -Ta6Se18_11_18152.vasp,Ta6Se18,-3.976614667916667,0.0731940477083328 -Rb2H6C2Se2O6_4_14852.vasp,Rb2H6C2Se2O6,-3.851737083888889,0.5058895681110973 -Na4I2_51_12396.vasp,Na4I2,-0.6187356016666666,-0.1160693583333337 -Zr1Cl2_187_21277.vasp,Zr1Cl2,-3.13892279,0.0402859499999999 -In1F2_115_8245.vasp,In1F2,-2.0642239066666668,0.4468781799999997 -Ti2N1O2_164_18966.vasp,Ti2N1O2,-7.549843604,-0.0409785589999991 -V2Br6_162_20009.vasp,V2Br6,-1.49500982375,0.2106503262499999 -Mn1Mo1Se1Br1O1_25_10799.vasp,Mn1Mo1Se1Br1O1,-3.00161939,0.0961326880258606 -Au4S4Cl4F4_2_1584.vasp,Au4S4Cl4F4,-0.929277405625,0.1659426830156249 -K2Pt1S2_47_9306.vasp,K2Pt1S2,-1.304929488,0.625045418 -Al2Te2_187_1011.vasp,Al2Te2,-2.2197962025,0.085955985 -Ba1Sn4O8_162_1862.vasp,Ba1Sn4O8,-3.898148372307692,0.4400803236538426 -Zr2H2C1O2_164_21576.vasp,Zr2H2C1O2,-5.66466139,0.4458207971428454 -Xe1O2F2_38_20599.vasp,Xe1O2F2,-0.211126668,1.0226999025 -Y2I2_129_20745.vasp,Y2I2,-2.3153279275,0.5399072633333311 -Zn4I8_25_21222.vasp,Zn4I8,0.42637057,0.1096927320833333 -Ta1As1Br2_6_17505.vasp,Ta1As1Br2,-2.9902117775,0.4337782937500003 -Ti2Br8_1_18907.vasp,Ti2Br8,-2.248879424,0.0194025799999999 -Cd2Te6P2_147_3601.vasp,Cd2Te6P2,-1.095152343,-0.0049891453333349 -Ca3Cu2S4I2_123_3171.vasp,Ca3Cu2S4I2,-1.8943324663636365,0.0193125336969662 -Fe2Br8_14_5824.vasp,Fe2Br8,-0.4780907219999999,0.1407572605 -Bi1Br3_187_2322.vasp,Bi1Br3,-0.54460598,0.4467276862499999 -Ba1Br2_187_1814.vasp,Ba1Br2,-1.8711257766666665,0.3466339133333334 -Cr2O4_59_4440.vasp,Cr2O4,-4.921117978333333,-0.1031221239583368 -Ga1Sn1Au2Se1S3Cl4_1_6283.vasp,Ga1Sn1Au2Se1S3Cl4,-1.35620526,0.2233637520312474 -Te3O6_1_18550.vasp,Te3O6,-3.49779174,0.1554484762500001 -V2N2Cl2_59_20113.vasp,V2N2Cl2,-4.509799625,-0.1477128769444493 -Zr1Se1I2_25_21440.vasp,Zr1Se1I2,-2.196159125,0.2648680292708334 -Ta2Ge2As2_129_17739.vasp,Ta2Ge2As2,-4.733502108333333,-0.094978358333337 -Y6Ru1I10_2_20846.vasp,Y6Ru1I10,-2.596556259411765,0.0922550803921509 -Tl1Fe1I2_1_19265.vasp,Tl1Fe1I2,-0.2134411975,0.3479548856249984 -Pt3Se4_10_14695.vasp,Pt3Se4,-1.6734979357142856,0.5339220564285695 -Si1F2_164_16330.vasp,Si1F2,-2.872133733333333,0.8347675724999969 -K1N1O3_187_8922.vasp,K1N1O3,-3.947286076,0.2238970517499998 -Na2Zr1H6O6_147_12342.vasp,Na2Zr1H6O6,-4.589987952666666,0.0623195285000006 -Ta3Pt3Se14_6_17980.vasp,Ta3Pt3Se14,-3.2465194095000003,0.0922197721249896 -V2Te6_59_20224.vasp,V2Te6,-1.95290297125,0.21547426125 -Si4Ag12O14_13_16482.vasp,Si4Ag12O14,-2.8616847066666664,0.0848365436666664 -Hf1Mn1Ir2Se3S1Br4_1_7219.vasp,Hf1Mn1Ir2Se3S1Br4,-2.5739541658333334,-0.0013667173674329 -Ca1Cu2H12_115_2827.vasp,Ca1Cu2H12,-2.165561353333333,1.8062304043333304 -Ba3Mn2Cl2O5_123_2114.vasp,Ba3Mn2Cl2O5,-3.9737897825,0.0674548765792516 -Li2Mg1Te2H4O8_2_9976.vasp,Li2Mg1Te2H4O8,-4.098624497647059,0.0962508808169857 -Sn2Te2_164_16894.vasp,Sn2Te2,-1.4810302075,-1.4453022274999998 -As6Pd3_157_1390.vasp,As6Pd3,-2.269997463333333,0.6126527433333329 -O1_123_13789.vasp,O1,-1.76336586,1.59379793625 -Sn2Se6_4_16887.vasp,Sn2Se6,-1.8624059925,0.3241452558333333 -Hf2Se1S1Br2_25_7596.vasp,Hf2Se1S1Br2,-4.02930798,0.0251926174999974 -Nb3S2N2_187_13005.vasp,Nb3S2N2,-6.472060285714286,0.1803981059523742 -Nb4Si2Se8_55_13156.vasp,Nb4Si2Se8,-4.235644049285715,0.0310188321329279 -Zn8S2O26_2_21240.vasp,Zn8S2O26,-2.6536757802777777,0.4492885730555499 -Tl1Ni2_187_19304.vasp,Tl1Ni2,1.6455286966666665,5.280089389999997 -Si2Se2_59_16451.vasp,Si2Se2,-2.936025685,0.1555804151562499 -Sr2Pb4Cl12_2_17298.vasp,Sr2Pb4Cl12,-1.7932039050000002,0.0569810038888871 -Sr1F2_115_17045.vasp,Sr1F2,-3.225210243333333,0.5883064266666671 -W3C2O2_187_20558.vasp,W3C2O2,-6.433952138571429,0.0398785822740458 -Co3Sb1O8_164_4068.vasp,Co3Sb1O8,-3.936693239166667,-0.3813895289062533 -Pt2I6_162_14635.vasp,Pt2I6,-0.1274687675,0.2009222879687498 -K2Sn1H6S6_147_9351.vasp,K2Sn1H6S6,-2.730563426666667,0.0508284414999998 -In8Se6_31_8720.vasp,In8Se6,-1.6047762414285711,0.3882359435714264 -Hg2Pd4Se6_164_7987.vasp,Hg2Pd4Se6,-0.9147394816666666,0.2704860708333333 -Rh2S2_164_15224.vasp,Rh2S2,-2.6072747475,0.3994705523913014 -Zr2Br2N1F1_1_21518.vasp,Zr2Br2N1F1,-4.102087625,0.3306653464583289 -Hf2Sb2S6_12_7586.vasp,Hf2Sb2S6,-4.098443459,0.2535172791666645 -As2Ru2Se6_162_1288.vasp,As2Ru2Se6,-2.653649676,0.3533517047999976 -Ga2Ni2S5_156_6405.vasp,Ga2Ni2S5,-2.1830364455555555,0.0746781703703683 -Ga2Te4_14_6518.vasp,Ga2Te4,-1.1339737316666667,0.6964980579999982 -Sb2Te2Se1_164_15722.vasp,Sb2Te2Se1,-1.95685718,0.080760916 -Fe2P2O7_10_5911.vasp,Fe2P2O7,-4.613255871818182,0.5436680627272725 -Fe2P2Pd2_129_5912.vasp,Fe2P2Pd2,-1.89410856,0.4066903799999999 -Hg1Te1Au1I1_3_7917.vasp,Hg1Te1Au1I1,0.662858715,0.5453864381770833 -Zn5Cl2O6_164_21236.vasp,Zn5Cl2O6,-1.397466228461539,0.6127260082211495 -Zr1Sb2_164_21427.vasp,Zr1Sb2,-3.0436257566666662,-0.7010927591666665 -Mn2Sb4S8_26_11263.vasp,Mn2Sb4S8,-2.668802300714286,0.3133048024999974 -Al2Cl4_6_794.vasp,Al2Cl4,-1.970295825,0.3297107188888867 -Cr2W2O8_25_4538.vasp,Cr2W2O8,-5.586564760000001,0.031225442083322 -Zr2Te2P1_164_21707.vasp,Zr2Te2P1,-4.086082506,0.0616420399999997 -In4P4_127_8681.vasp,In4P4,-1.86885791125,-0.2169502512499999 -Zn3Bi1_187_21202.vasp,Zn3Bi1,1.747157785,0.06631408375 -Rb2Ru2I8N2O4_7_14926.vasp,Rb2Ru2I8N2O4,-2.046945631111111,0.2866593961111092 -H1Pb1S1O1_1_6984.vasp,H1Pb1S1O1,-3.0193212375,-0.291376283333333 -Ni1As1O3_8_13254.vasp,Ni1As1O3,-3.175470462,0.2195909872499956 -Ta4N3_164_18062.vasp,Ta4N3,-7.723380731428572,0.8790611785714204 -In2I6_1_8483.vasp,In2I6,-0.24645114625,0.1470652475 -Mn2Te4Mo1Se1_6_11320.vasp,Mn2Te4Mo1Se1,-1.73646532875,0.3695677879687499 -Cu4Te2_51_5483.vasp,Cu4Te2,0.0295779333333333,0.4615657441666659 -Cr2Sb2_2_4487.vasp,Cr2Sb2,-2.224099745,1.5181751262499998 -Cd1In1Ga1Te4_156_3372.vasp,Cd1In1Ga1Te4,-1.00088474,0.12732344 -Rb2Li2S2_129_14897.vasp,Rb2Li2S2,-2.1999749433333333,0.0283163316666668 -Sc2As2Se6_157_16029.vasp,Sc2As2Se6,-3.042423077,0.2351069734999999 -Sr4Fe2Cl2O6_129_17433.vasp,Sr4Fe2Cl2O6,-3.765190877857143,0.0294593999999999 -Pt2Se2_187_14682.vasp,Pt2Se2,-1.5608210225,0.6144800299999998 -Na2Ta2I12_4_12312.vasp,Na2Ta2I12,-1.30058112875,-0.0877444604687498 -Fe1Cu1S2_156_5669.vasp,Fe1Cu1S2,-1.522547225,0.3266505112499998 -Nb1N2_164_12539.vasp,Nb1N2,-6.794750823333334,0.480364466999994 -W2C3_187_20479.vasp,W2C3,-6.4691394,0.4568688299999917 -Ge2As2Se6_147_6742.vasp,Ge2As2Se6,-2.458028869,0.1872048329999971 -Br8N2_1_2714.vasp,Br8N2,-0.681821628,0.4197564245000001 -Ti1Cl2_164_18758.vasp,Ti1Cl2,-3.5487351733333337,0.1588778975 -Sr2Ag1Se2F2_38_17111.vasp,Sr2Ag1Se2F2,-1.9841887571428567,0.6404810870238047 -Mn4S2Br2N3Cl1_1_11449.vasp,Mn4S2Br2N3Cl1,-3.1663179866666664,0.1405797450347137 -Rh2Se1S1Br2_1_15231.vasp,Rh2Se1S1Br2,-1.7436172033333337,0.3133976124999998 -Ta2Fe4S4_51_17731.vasp,Ta2Fe4S4,-3.2755308120000004,0.8412936536666624 -Zr3H2C2O2_187_21762.vasp,Zr3H2C2O2,-5.995137886666666,0.314990463333328 -Pb1Br2_115_14172.vasp,Pb1Br2,-0.90281589,0.2911081200000002 -Hf4I1Br2Cl1O4_8_7789.vasp,Hf4I1Br2Cl1O4,-5.264651459166667,0.2239939504629555 -Co2Ag1O4_187_3838.vasp,Co2Ag1O4,-3.3204503214285714,-0.7547303355357191 -Ti2H2_164_18951.vasp,Ti2H2,-4.782423075,0.5516910975000004 -Fe2W2S8Cl2_129_6036.vasp,Fe2W2S8Cl2,-2.62261411,0.2510896926562445 -Nb4H2C3_164_13085.vasp,Nb4H2C3,-6.6433606377777785,0.0660035138095107 -Zr3Ti1Te8_6_21797.vasp,Zr3Ti1Te8,-3.066866265833333,0.24816043625 -Sn6Cl16_1_16985.vasp,Sn6Cl16,-1.385292344090909,0.0620711154545442 -Bi4_11_2660.vasp,Bi4,-1.07087277,-0.604004775 -Ge1Bi1Br4_1_6644.vasp,Ge1Bi1Br4,-1.1754106483333333,0.077752784583332 -K2Cd4S6Cl6O2_31_9051.vasp,K2Cd4S6Cl6O2,-1.1568035934999998,0.4548095254374965 -In4Se6_1_8695.vasp,In4Se6,-1.904601949,0.079719477 -Cr2Te6As2_162_4531.vasp,Cr2Te6As2,-1.955378579,0.1290198786666643 -Al1Ga1Hg1S4_156_662.vasp,Al1Ga1Hg1S4,-2.31180931,0.1978074678571426 -Ca1I2_164_2849.vasp,Ca1I2,-1.20170527,0.0709059946666665 -Y3H2N2O2_187_20797.vasp,Y3H2N2O2,-6.239428862222223,-0.9085752042361226 -Fe2H2_164_5858.vasp,Fe2H2,-1.3724500325,0.2966730925 -Hf2Cl2_164_7475.vasp,Hf2Cl2,-4.2751703,0.0374877524999996 -Ni1H4C6I2_47_13348.vasp,Ni1H4C6I2,-4.394458462307693,0.361178141538454 -Gd2Br6_59_6602.vasp,Gd2Br6,-2.33625776,0.0480475837499998 -Na2Hg4Se2S6I6_31_12169.vasp,Na2Hg4Se2S6I6,-0.5741879405,0.0689087726041651 -V2Cu2As4O12_2_20047.vasp,V2Cu2As4O12,-3.970562942,0.5031625061249958 -Ga1Cu1Ag1S4I2Br1_1_6158.vasp,Ga1Cu1Ag1S4I2Br1,-1.078920176,0.2885232569444421 -Te4Br4_2_18579.vasp,Te4Br4,-0.76466984875,-0.5502466758928573 -Al2Tl2S6_31_1028.vasp,Al2Tl2S6,-2.593045374,0.0826655886249975 -Ag4Te4Br4_14_573.vasp,Ag4Te4Br4,-0.2316825616666666,0.1635828020833329 -Hf2Ti2Br7Cl1_1_7649.vasp,Hf2Ti2Br7Cl1,-3.1203861341666665,0.1616546233333245 -Ti1Cr1Ge2I4_1_18769.vasp,Ti1Cr1Ge2I4,-1.82773943875,0.2086799345833303 -Pt4I16_29_14702.vasp,Pt4I16,-0.081786915,0.1102158874999999 -Ti2Sb1S2_164_19008.vasp,Ti2Sb1S2,-4.83792688,-0.2237625694999991 -Hf1H2O2_164_7190.vasp,Hf1H2O2,-5.053765496,1.5490347370000015 -Zn2Te2Mo2O12_18_21180.vasp,Zn2Te2Mo2O12,-4.0144032166666666,0.0048296413425887 -In1Ga1Hg1Se4_156_8253.vasp,In1Ga1Hg1Se4,-1.4510675000000002,0.1580672357142853 -Li2Ag2C4O8_7_9822.vasp,Li2Ag2C4O8,-4.872750136875,0.2416617856250003 -Ti2Sn2P4O16_11_19031.vasp,Ti2Sn2P4O16,-5.723841395833333,0.0708962457638828 -Zr4Te4I4_31_21856.vasp,Zr4Te4I4,-2.4624438741666665,0.1811656830555532 -Tl1I2_115_19289.vasp,Tl1I2,0.13870703,0.3037585789583332 -Ni2Sb4Cl4O6_2_13621.vasp,Ni2Sb4Cl4O6,-2.91090865875,0.1857548682291616 -Al1Te1_156_746.vasp,Al1Te1,-1.539580955,0.7661712325000001 -V4Br16_14_20309.vasp,V4Br16,-1.2882861135,0.1095664585 -B2F2_1_1667.vasp,B2F2,-3.53849986,0.993891706111107 -La2Eu2I8_13_9590.vasp,La2Eu2I8,-1.7953283808333331,0.0798018208333332 -Sn6N2_191_16989.vasp,Sn6N2,-1.861005915,-2.433135873125 -Sn2H8C16O8_1_16772.vasp,Sn2H8C16O8,-5.912145564999999,0.1967678724509746 -Cr4H4O8_14_4606.vasp,Cr4H4O8,-4.681750706875,-0.060904061875 -Y1S3_99_20665.vasp,Y1S3,-3.8635849775,0.4982540002343745 -Al1Cu1F5_47_639.vasp,Al1Cu1F5,-2.397628077142857,0.4409309857142834 -Na1Ti1S2_156_11943.vasp,Na1Ti1S2,-3.9940678525,0.3249701850000002 -Mn1Si1Se1S1_1_10886.vasp,Mn1Si1Se1S1,-2.7885579075,0.4523731553125001 -Ca2Ge4_12_3026.vasp,Ca2Ge4,-2.121295985,0.4841380083333333 -Ti2Pd1S3Cl2_8_18988.vasp,Ti2Pd1S3Cl2,-3.72582923375,0.1408532791707177 -Ta2Pd4Se4_51_17832.vasp,Ta2Pd4Se4,-2.993076574,-0.0869700910000064 -Ga2Te2I2_59_6505.vasp,Ga2Te2I2,-1.0636047266666666,0.1945074275 -Bi2Mo4O16_11_2475.vasp,Bi2Mo4O16,-4.51740348,1.8920488230113528 -Bi2Sb2O8_59_2526.vasp,Bi2Sb2O8,-3.9552370625,0.321127189166666 -Nb4Te12_11_13167.vasp,Nb4Te12,-2.84400409375,0.0721776176041635 -Te3N2_164_18549.vasp,Te3N2,-2.43462622,0.7219454830000004 -U4Se2_1_19738.vasp,U4Se2,-6.387444535,0.7694176683333334 -K2Mg1Te2S8F4_2_9229.vasp,K2Mg1Te2S8F4,-2.179409605882353,0.4113063199019589 -Ca2Cr8O18_85_2992.vasp,Ca2Cr8O18,-4.893809552142857,0.124896147366063 -Ge2P2Se6_147_6813.vasp,Ge2P2Se6,-2.7286802260000003,0.0613736982083306 -Si4H4O10_1_16488.vasp,Si4H4O10,-5.693815615,0.0148633978703651 -Ni2Br4_2_13482.vasp,Ni2Br4,-0.19969068,-0.2445911 -Tc1Cl2_164_18218.vasp,Tc1Cl2,-3.00002677,0.5143745161111081 -Ga1Ag1Se1S1I2_1_6127.vasp,Ga1Ag1Se1S1I2,-0.860502695,0.3835408522222201 -Ta1S1Cl1_156_17602.vasp,Ta1S1Cl1,-4.34966433,0.2352846716666623 -Ca2_65_3141.vasp,Ca2,1.53617447,2.17232969 -P4S2O12_18_14109.vasp,P4S2O12,-4.719234630555556,0.4248722596874916 -In1Ga1Hg1O4_156_8251.vasp,In1Ga1Hg1O4,-2.97023367,0.1067302848511856 -Mn2Te2Mo2O12_18_11299.vasp,Mn2Te2Mo2O12,-4.433394811111111,-0.0040929937500031 -B4Cl4_28_1751.vasp,B4Cl4,-1.94309296375,1.8060224056944407 -Al1Au1Br1Cl1O2_8_610.vasp,Al1Au1Br1Cl1O2,-2.421515718333333,0.393715907986107 -As18Br4_11_1128.vasp,As18Br4,-2.6571208631818184,0.0590853119696945 -Ag1Br1O4_81_33.vasp,Ag1Br1O4,-1.684056335,0.5220441541666649 -Ba1Br1Cl1_156_1811.vasp,Ba1Br1Cl1,-2.2038901133333333,0.2670874233333333 -V1Cl4_123_19801.vasp,V1Cl4,-1.694517742,0.1569340440000002 -Sb8Rh4_2_15874.vasp,Sb8Rh4,-2.4536100816666666,0.4206004825000002 -Tl2Br2N2_59_19377.vasp,Tl2Br2N2,-1.45715965,0.7718987241666646 -As1Pd1_187_1163.vasp,As1Pd1,-1.21983064,1.227151567083333 -La2Mg4_12_9600.vasp,La2Mg4,-0.5728566700000001,0.3749234604166657 -Pd2S2_123_14470.vasp,Pd2S2,-1.43603618,0.67409516 -K4Zr2Te6_39_9533.vasp,K4Zr2Te6,-1.8347254391666663,0.1976076566666667 -Cs2H6C4S6_2_4720.vasp,Cs2H6C4S6,-3.8723113311111113,0.2405740436111003 -Sr2I2_129_17256.vasp,Sr2I2,-0.18480091,0.8593679116666667 -Cr1Bi2_164_4126.vasp,Cr1Bi2,-1.3706906566666666,0.6742155633333318 -Fe1Te1Pt1Cl1_8_5764.vasp,Fe1Te1Pt1Cl1,-1.2309639325,0.410562224375 -Sb2Pd2S6_12_15653.vasp,Sb2Pd2S6,-2.183821861,0.3355446282499961 -Cs4Cd2Cl8_11_4806.vasp,Cs4Cd2Cl8,-0.8069357221428571,0.2578792207142858 -Cu4Te2_4_5482.vasp,Cu4Te2,-0.058834905,0.3731529058333326 -Ni1Pd1I1Br3_1_13396.vasp,Ni1Pd1I1Br3,-0.1192320716666666,0.0785852783333333 -Ru2Se6_11_15364.vasp,Ru2Se6,-2.49448609875,0.4784613845833335 -Cu6O2F10_4_5497.vasp,Cu6O2F10,-1.3712992394444443,0.170851937916665 -Cu2S2N2O6_164_5250.vasp,Cu2S2N2O6,-2.8520267975,1.113619137499992 -Mn1S2_187_10854.vasp,Mn1S2,-2.9009751766666665,0.4598695008333333 -C1S1_156_2735.vasp,C1S1,-3.88739941,1.4797056946875 -Co1P1S3_1_3808.vasp,Co1P1S3,-2.776003124,0.5107557812499983 -Hg2O4_14_7978.vasp,Hg2O4,-1.0331679466666668,0.5997835643055541 -Bi2Mo4O20_11_2476.vasp,Bi2Mo4O20,-4.400745897307693,1.539123558509611 -As2Pb2C2O6F6_7_1249.vasp,As2Pb2C2O6F6,-3.754685142222222,0.4541842788888857 -Pd4Se1S3I4_8_14524.vasp,Pd4Se1S3I4,-1.1030024191666663,0.091293645625 -Y2Pb1_164_20766.vasp,Y2Pb1,-2.7193173633333334,0.9104371761111072 -Ni2H2_164_13516.vasp,Ni2H2,-1.1790033625,1.2353521425 -Ni2P4_14_13571.vasp,Ni2P4,-2.383662718333333,0.8018771166666667 -Zn2W2Se2O12_18_21196.vasp,Zn2W2Se2O12,-4.295773335555555,0.0379509280555514 -Ag1Te6Mo6_12_148.vasp,Ag1Te6Mo6,-2.2900291376923074,0.0606306692307696 -Pb2Cl6_1_14241.vasp,Pb2Cl6,-1.01759292125,-0.0023098393749998 -Ga1Te1Pb1S1Br2_1_6291.vasp,Ga1Te1Pb1S1Br2,-1.476527405,0.311185460138887 -Cd1Br2_164_3287.vasp,Cd1Br2,0.0407290499999999,0.0606129208333333 -Te2Ir2Cl2_59_18391.vasp,Te2Ir2Cl2,-2.0318658816666666,0.2278629277777741 -Al2Co2Te5_187_809.vasp,Al2Co2Te5,-1.8814240222222225,0.2836088912632216 -V1Ge1Se1S1_6_19842.vasp,V1Ge1Se1S1,-2.8936953225,0.4062046257291607 -Tc2Br8_14_18225.vasp,Tc2Br8,-1.784404443,0.1065298759999999 -Si12Pd4_75_16312.vasp,Si12Pd4,-3.28082550125,-0.2070326756249998 -Si2P2O6_12_16423.vasp,Si2P2O6,-5.385475092,0.547523283533333 -As4Pd4S4_13_1351.vasp,As4Pd4S4,-2.4565079516666666,0.3420616008333335 -Pd1Au1S2Br2_1_14342.vasp,Pd1Au1S2Br2,-0.83448476,0.2294690372916659 -Cs4Hg2Cl8_11_4810.vasp,Cs4Hg2Cl8,-0.6090526628571429,0.2103228714285714 -Nb2Br4O2_25_12653.vasp,Nb2Br4O2,-3.9582377025,0.0192917925000002 -W1I5_47_20439.vasp,W1I5,-0.4669398183333333,0.3945360651388881 -Ga3Ru2_123_6532.vasp,Ga3Ru2,-2.676381758,0.1246169594999972 -Hf2Ti1N3Cl2_6_7648.vasp,Hf2Ti1N3Cl2,-6.4701685575,0.1795951162500002 -Mn1Ga2O4_164_10725.vasp,Mn1Ga2O4,-4.4004411885714285,-0.060771635000004 -In2Te2F2_59_8618.vasp,In2Te2F2,-1.7273031683333333,0.2018303661111093 -Na1Mn1S1Br1_1_11895.vasp,Na1Mn1S1Br1,-1.715307335,0.28224009875 -K2Cd4S6O2F6_31_9053.vasp,K2Cd4S6O2F6,-1.597479802,0.3943702866874939 -Hf1Zr3S8_1_7420.vasp,Hf1Zr3S8,-4.6552345908333335,0.304359401458333 -Tl2O3_1_19473.vasp,Tl2O3,-2.270039774,0.4401254045000002 -Mg1Mn1W1Cl2O5_1_10386.vasp,Mg1Mn1W1Cl2O5,-4.130922577,0.2894486878749982 -Ti2S6_59_19007.vasp,Ti2S6,-4.49353702375,0.0496034949999995 -Ti4O8_11_19150.vasp,Ti4O8,-7.068336481666667,0.1955180433333332 -Au2Se1I3Br1_1_1534.vasp,Au2Se1I3Br1,0.3800578699999999,0.3194814762499999 -Te4Pd2Cl2_2_18613.vasp,Te4Pd2Cl2,-1.19411569875,0.098300310390625 -Ge2Pt2_31_6818.vasp,Ge2Pt2,-2.5838525725,0.3910005912500001 -Bi2I2N2_59_2462.vasp,Bi2I2N2,-2.179360743333333,-0.0133603030555571 -K4W2Se8_26_9530.vasp,K4W2Se8,-2.242735315714285,0.2362844164285715 -Zn2Mo2S8_13_21119.vasp,Zn2Mo2S8,-2.3125206375,0.4040728363958313 -Tl1Si1Se3_143_19346.vasp,Tl1Si1Se3,-1.975068806,0.4955035443958314 -Ag1H2_123_72.vasp,Ag1H2,-1.3749154533333332,1.6011334149999976 -Mg2Rh1_123_10499.vasp,Mg2Rh1,-0.9826833266666668,0.0601175799999998 -Nb2I1N2Cl1O1_1_12742.vasp,Nb2I1N2Cl1O1,-5.37944564,0.0539266108321372 -Ga4Se6_31_6575.vasp,Ga4Se6,-2.336365073,0.1206267909999998 -Zr4H2N3_164_21825.vasp,Zr4H2N3,-6.16913178,-0.1480089844444494 -Nb3Cu1S2Br1Cl1_6_12970.vasp,Nb3Cu1S2Br1Cl1,-3.4730869225,0.5244370140781149 -Mo1C3_187_11503.vasp,Mo1C3,-5.16848361,1.79871445 -Nb2Te2Br2_59_12904.vasp,Nb2Te2Br2,-2.996079198333333,-0.1165392634127041 -Ag4S4F8_14_550.vasp,Ag4S4F8,-1.1684723625,0.2814569323437496 -Mg2Ga2Te5_164_10459.vasp,Mg2Ga2Te5,-1.6500992244444446,0.0629220283333332 -Ag2Hg2S2Br2_26_297.vasp,Ag2Hg2S2Br2,0.018851505,0.12982421125 -Cd2S10F4_31_3537.vasp,Cd2S10F4,-1.642426320625,0.424613683984375 -Y4B3Cl2_164_20806.vasp,Y4B3Cl2,-4.515572805555555,0.3336751286111067 -Al2Ge2Te6_162_852.vasp,Al2Ge2Te6,-2.111174449,-0.2823214651875019 -Sr2Co1Cl2O2_123_17188.vasp,Sr2Co1Cl2O2,-3.2390998271428573,0.0607228130952328 -Zr3C2O2_187_21757.vasp,Zr3C2O2,-6.877097957142857,-0.0935298357142917 -Ni2Bi4_11_13476.vasp,Ni2Bi4,-0.5227761266666667,0.3623813416666666 -Zn1Cd1I2_1_20910.vasp,Zn1Cd1I2,1.2696007025,0.2537822304166667 -Sr4Se4S12_14_17476.vasp,Sr4Se4S12,-2.4933390695,0.210351518916664 -Ni1Te2_187_13436.vasp,Ni1Te2,-0.6427262866666666,0.0967656333333333 -Nb1Mo1Se1S1Br2_1_12533.vasp,Nb1Mo1Se1S1Br2,-3.175462235,0.0149472587499928 -Mo1Ir1Rh2Cl1O7_1_11521.vasp,Mo1Ir1Rh2Cl1O7,-3.897248393333333,0.2429893070312472 -K2Pd1O2_47_9298.vasp,K2Pd1O2,-1.372534386,0.825855972 -Ti2P1Se2_164_18980.vasp,Ti2P1Se2,-5.145285698,0.0604258230000001 -Sb4Au2S12_12_15764.vasp,Sb4Au2S12,-2.1411046522222223,0.2232633843055533 -C12N4_5_2717.vasp,C12N4,-6.940005116875,0.8789131193750004 -Rh2I2N2_59_15194.vasp,Rh2I2N2,-2.6149623883333333,0.1885730158333307 -Mg2H8Cl4O16_14_10466.vasp,Mg2H8Cl4O16,-3.407541021666667,0.1069980901666669 -Re1Ni1Te1S1Br1Cl1_1_15013.vasp,Re1Ni1Te1S1Br1Cl1,-1.94470224,0.357238807013886 -Cr1I2_187_4202.vasp,Cr1I2,-0.69335479,0.4664098155555544 -Pd2Se4F2_2_14499.vasp,Pd2Se4F2,-1.69241828625,0.1714529714062501 -Ge2Se1S1I4_1_6862.vasp,Ge2Se1S1I4,-1.1866915825,0.2661279244618013 -Ta2I10_1_17750.vasp,Ta2I10,-1.0610564466666668,0.3586016127083333 -Te8As8S4_2_18690.vasp,Te8As8S4,-2.1605850060000003,0.2572912625416648 -Sc2As2S8_2_16028.vasp,Sc2As2S8,-3.4221293058333333,0.3916558228124933 -As1Se1F1_156_1177.vasp,As1Se1F1,-2.509334283333333,0.2008071691666642 -Ti2Sb2Br1Cl1_1_19011.vasp,Ti2Sb2Br1Cl1,-3.300856405,0.4896546638333261 -Zr2Sc1Cl2O3_8_21666.vasp,Zr2Sc1Cl2O3,-5.02895048375,0.4192258729166667 -Si3Sb2O9_174_16478.vasp,Si3Sb2O9,-5.54722599,0.0939646212499933 -Ca5La1_1_3250.vasp,Ca5La1,0.2914272383333333,1.239523486666665 -Ge2Te1Br2_38_6877.vasp,Ge2Te1Br2,-1.879256492,-0.3070967139999998 -Rh2S1Br4_8_15213.vasp,Rh2S1Br4,-1.1617824142857145,0.3778411807142843 -Te8Ru4_2_18709.vasp,Te8Ru4,-2.2106718858333334,0.4103228241666667 -Cr4C3_164_4599.vasp,Cr4C3,-4.932090327142857,0.4647260899999931 -Ge2S2_129_6828.vasp,Ge2S2,-2.9277115875,-0.6765637337500001 -As4P2H2S12_4_1344.vasp,As4P2H2S12,-2.994055833,0.2544297824687473 -Li2Zr1O6F6_1_10142.vasp,Li2Zr1O6F6,-2.8294716726666667,1.0690886885 -Ba2Tl1Ni2O7_123_2085.vasp,Ba2Tl1Ni2O7,-3.03581533,0.113705838802078 -Zn2Sb8O18_13_21163.vasp,Zn2Sb8O18,-3.786751471785714,0.2976960908928534 -P2N2_1_13996.vasp,P2N2,-5.559378815,0.2101808084999967 -Cd1H1O1F1_156_3329.vasp,Cd1H1O1F1,-2.40263494,0.143550174375 -Mn1Ga1Br5Cl1_1_10716.vasp,Mn1Ga1Br5Cl1,-1.1746839775,0.0286939324999999 -Ca2Cl4_51_2983.vasp,Ca2Cl4,-2.17853225,0.0496988883333333 -Mg2Co2Sn2_129_10443.vasp,Mg2Co2Sn2,-0.923673315,-0.2528451122222236 -Ni1Ru1S1I2O1_6_13407.vasp,Ni1Ru1S1I2O1,-1.618043371666667,0.3119154783333284 -Bi2S4_12_2521.vasp,Bi2S4,-1.98257509,-0.3350760426041689 -Ag4H4S4Cl4_14_520.vasp,Ag4H4S4Cl4,-1.4410477875,0.1023692699218747 -In3Ir1_187_8649.vasp,In3Ir1,-1.0134953975,0.8622928974999999 -Mn2F8_14_11067.vasp,Mn2F8,-2.3758610520000003,0.0243471622499997 -K4Mn2S4_49_9473.vasp,K4Mn2S4,-1.729843294,-0.0247037110000001 -Ge2As2C2S6F6_7_6730.vasp,Ge2As2C2S6F6,-3.1038105444444444,0.5338997367013822 -U2Cl6_59_19705.vasp,U2Cl6,-3.6851726275,0.058971965 -Cd1I2_115_3366.vasp,Cd1I2,0.58983704,0.0343282772222222 -Mn4Cl14_13_11432.vasp,Mn4Cl14,-1.3572531255555556,0.03482477861111 -Bi12Te12_7_2302.vasp,Bi12Te12,-1.2159300129166668,0.3039069870833331 -Bi2Sb2S8_6_2529.vasp,Bi2Sb2S8,-2.320693636666667,-0.1104565796875047 -Ni2S4Cl2_11_13593.vasp,Ni2S4Cl2,-1.44312156875,0.0187643499999979 -Tl4S4Br4_14_19619.vasp,Tl4S4Br4,-1.047815258333333,0.2092878414583322 -Ag1O2_115_91.vasp,Ag1O2,-1.16819094,0.8622653604166651 -Al8Se6_31_1114.vasp,Al8Se6,-2.5681646985714286,0.3052831778571409 -Zn2H2I2O8_7_21095.vasp,Zn2H2I2O8,-2.7551485742857147,0.1207035351785683 -Mn2Sn1S1I2_1_11293.vasp,Mn2Sn1S1I2,-1.3396946333333333,0.3468630868486567 -Zr4S4I4_7_21845.vasp,Zr4S4I4,-3.3075725833333336,0.2012614683333327 -Mn4O2F8_31_11445.vasp,Mn4O2F8,-3.0258365992857144,-0.1142750378571457 -Nb2Br2O4_11_12650.vasp,Nb2Br2O4,-5.4258157025,-0.1882993203124989 -P2Au2Se4_26_13958.vasp,P2Au2Se4,-1.60932852625,0.2370925562500001 -V2O2F6_7_20121.vasp,V2O2F6,-3.787453871,-0.65754726175 -Nb2Br2_164_12652.vasp,Nb2Br2,-3.55053777,0.2897534584374999 -In1Sn1Cl3_1_8357.vasp,In1Sn1Cl3,-1.36146731,0.1753178551875003 -Lu1Sb2_21_10298.vasp,Lu1Sb2,-2.30645114,0.1174334708333308 -Sn2I2N1O1_1_16781.vasp,Sn2I2N1O1,-2.404918728333333,0.1207065484722178 -Sr2Al4Cl16_13_17118.vasp,Sr2Al4Cl16,-2.3114097745454547,0.042903589772727 -Ta4Ti2Zn4O16_2_18135.vasp,Ta4Ti2Zn4O16,-5.694793893846153,0.0600012478846044 -Na6H2S10_11_12438.vasp,Na6H2S10,-2.436185567222222,0.1385762452777756 -Ge2Se2I1Br1_1_6868.vasp,Ge2Se2I1Br1,-1.8604447466666667,0.1575210261111108 -Ca2Ti8O18_85_3136.vasp,Ca2Ti8O18,-6.654176000357142,0.2855846012499943 -Sb1Br2O1_47_15438.vasp,Sb1Br2O1,-1.9781939075,0.2271960920312501 -Ca3Cu2Cl2O4_123_3167.vasp,Ca3Cu2Cl2O4,-3.095383498181818,0.037188138636358 -Zr3Ti1Br1N3Cl3O1_1_21793.vasp,Zr3Ti1Br1N3Cl3O1,-5.385378229166666,0.2024544364583276 -V4Se6_11_20370.vasp,V4Se6,-3.239567076,0.078061496499997 -Ag2Bi2O4_51_193.vasp,Ag2Bi2O4,-2.3953258075,0.2915719757500001 -Mn3C2_187_11366.vasp,Mn3C2,-3.910747444,0.6317639819999963 -Hf2Ti2S4Br3Cl1_1_7651.vasp,Hf2Ti2S4Br3Cl1,-4.324825525833334,-0.0992847021354261 -Te3P2_164_18553.vasp,Te3P2,-2.2237183000000003,0.337751548 -Nb2Sb1S1I1_99_12858.vasp,Nb2Sb1S1I1,-3.44536362,0.479709603499997 -V2S2_129_20162.vasp,V2S2,-3.7052493075,-0.0498367790625047 -Tl1F2_187_19264.vasp,Tl1F2,-1.4793201166666667,0.30780574 -Pd2Se4Cl2_11_14497.vasp,Pd2Se4Cl2,-1.43239407125,-0.0330181463281268 -Ir4Se6S2_1_8867.vasp,Ir4Se6S2,-2.6520902075,-0.1149364072916667 -Mo3Se1Cl4O2_1_11727.vasp,Mo3Se1Cl4O2,-2.966113463,0.2046417880833259 -Na6Te2H2S8_11_12446.vasp,Na6Te2H2S8,-2.335050188333333,0.1484646908333313 -Ge2As2S6F2_7_6740.vasp,Ge2As2S6F2,-2.7577677066666664,0.4948859127604111 -Ta4Se6_2_18111.vasp,Ta4Se6,-4.87509904,0.0743066769999991 -Na2Pt1O6_162_12270.vasp,Na2Pt1O6,-2.4896245033333333,0.8687865981944416 -Nb4Tl2P2S20_7_13176.vasp,Nb4Tl2P2S20,-3.627136289642857,0.0907108996428571 -Tl1Se2_115_19344.vasp,Tl1Se2,-0.97966398,0.5052181487499985 -Hg6Ge4Se16_32_8098.vasp,Hg6Ge4Se16,-1.1398309619230769,0.2155915597676268 -Zn4Se4O12_29_21225.vasp,Zn4Se4O12,-2.8899307505,0.2195442814999997 -Si1Ge1Te2_1_16334.vasp,Si1Ge1Te2,-2.35473628,-0.360271651875 -Bi16O24_14_2309.vasp,Bi16O24,-3.6997884865,0.1582057414999997 -Pd3Pt1Cl4O4_3_14505.vasp,Pd3Pt1Cl4O4,-1.8872477525,0.1630477701388887 -Zn2Ge4W2O12_13_21090.vasp,Zn2Ge4W2O12,-4.210049563,0.4038455380624948 -Zn2F2_129_21072.vasp,Zn2F2,0.02624433,0.624591563125 -Sr2Cl2_129_17180.vasp,Sr2Cl2,-1.47673472,0.4760248974999999 -Hf2Ti2Se8_6_7653.vasp,Hf2Ti2Se8,-4.304585990833333,0.2955640683333338 -Ba3Fe2Cl2O5_123_2106.vasp,Ba3Fe2Cl2O5,-3.6329277866666665,0.0043010200000002 -Al2Se2F2_59_963.vasp,Al2Se2F2,-3.182474706666667,0.2332854388888854 -Li1Al1Sb2S6_5_9646.vasp,Li1Al1Sb2S6,-2.7778828140000003,0.3687300996874973 -In2Ni2O5_187_8493.vasp,In2Ni2O5,-2.7397016966666667,0.3155299968055525 -Er2Br2O2_129_5548.vasp,Er2Br2O2,-4.7812495083333335,0.0354339733333333 -Tl4C8O8_1_19597.vasp,Tl4C8O8,-5.0828910255,0.4020909015000002 -Pt2Se2S6_11_14679.vasp,Pt2Se2S6,-2.307060398,0.2087105112499975 -Sb2Te2_2_15726.vasp,Sb2Te2,-1.617904185,0.3012783887499979 -Ni1S2_115_13413.vasp,Ni1S2,-1.3533201033333333,0.4902904870833313 -Hf2Cu2_129_7485.vasp,Hf2Cu2,-2.3314815525,0.54377634480769 -Nb2Rh2Se8_11_12828.vasp,Nb2Rh2Se8,-3.3434694191666665,0.1213003379166668 -K4Cd2Br8_11_9425.vasp,K4Cd2Br8,-0.5087118964285714,0.156834285 -Sc2O1F4_1_16110.vasp,Sc2O1F4,-4.600297411428572,0.1047168971428527 -Li2Te2F2_1_10082.vasp,Li2Te2F2,-1.9145859133333332,0.7169704488888864 -Pb2I2F2_129_14248.vasp,Pb2I2F2,-1.6787036566666669,0.0248843562499998 -Te2As1Rh1_38_18347.vasp,Te2As1Rh1,-2.04968525,0.5345054866666665 -Sb2P2_31_15630.vasp,Sb2P2,-2.884896955,0.2798845737500002 -Ga1S2O8_164_6261.vasp,Ga1S2O8,-4.19956946,0.1848007314204461 -Cu1Br2N1_1_4860.vasp,Cu1Br2N1,-0.938374735,0.5465290818750002 -Zr4O8_35_21836.vasp,Zr4O8,-6.831298726666667,0.351690416666667 -Rb2Cd4S2O6F6_31_14810.vasp,Rb2Cd4S2O6F6,-2.2442474725,0.2146952289687452 -Al1In1S2I3Cl1_6_680.vasp,Al1In1S2I3Cl1,-1.36098389375,0.306823816171875 -Ca2La2I10_26_3060.vasp,Ca2La2I10,-1.5282577592857145,0.1010063327142841 -Tl2I2_12_19435.vasp,Tl2I2,-0.24341113,0.1948016775 -Na4Bi4O8_57_12369.vasp,Na4Bi4O8,-3.451992603125,-0.2290684731249999 -Ca2Cl4O8_125_2980.vasp,Ca2Cl4O8,-2.7279163964285718,0.1454191178571404 -In2Se2_187_8587.vasp,In2Se2,-1.8397248075,0.0636905550000002 -Cu4P16Se16I4_53_5436.vasp,Cu4P16Se16I4,-2.3743644055,0.0880761532499998 -B2_191_1724.vasp,B2,-4.72144749,1.4395378083333332 -Bi2I2_164_2466.vasp,Bi2I2,-0.54158456,-0.0594592108333338 -Ta2Rh2Se8_11_17840.vasp,Ta2Rh2Se8,-3.571983915833333,0.1123909083333329 -Ca3Ni2Br2O5_123_3191.vasp,Ca3Ni2Br2O5,-3.147863323333333,-0.3014278454166698 -Tl2Cl6_162_19393.vasp,Tl2Cl6,-0.69936580375,0.04392568625 -Zn1O1_156_20983.vasp,Zn1O1,-1.840885465,0.3613242374999998 -Fe2P2S4Br2_26_5914.vasp,Fe2P2S4Br2,-2.45907951,-0.1750576302121256 -Cu1Br2_164_4861.vasp,Cu1Br2,0.0002872333333333,0.1355754483333333 -Er2Se2Br2_59_5572.vasp,Er2Se2Br2,-3.145761825,0.033621496666667 -Cs2Zr12B2I28_53_4798.vasp,Cs2Zr12B2I28,-2.083557236136364,0.1145682461363635 -V1Cr1N2Cl2_6_19806.vasp,V1Cr1N2Cl2,-4.134451261666666,0.0009276795833241 -Hf2Zr2Se2S3I1Br2_1_7671.vasp,Hf2Zr2Se2S3I1Br2,-3.908261435,0.128328762361102 -Ca2Ag1Te2I2_38_2919.vasp,Ca2Ag1Te2I2,-0.84687088,0.2750186665476165 -Na2Zn2As2_129_12338.vasp,Na2Zn2As2,-0.8248705766666666,0.147480625 -In18S9_143_8170.vasp,In18S9,-1.6744209611111112,0.6888901888888869 -Nb2O2_187_12793.vasp,Nb2O2,-6.234839755,0.284653538333333 -Y1Sb2O4_123_20667.vasp,Y1Sb2O4,-5.126911755714287,0.1711921292857049 -Sr1Cl2_164_17039.vasp,Sr1Cl2,-2.32189434,0.175603413333333 -Mo2I2_164_11624.vasp,Mo2I2,-1.28862375,1.054788922916667 -Sm2S6_129_16583.vasp,Sm2S6,-3.74607259375,0.1954367310937499 -K2C2O6F2_4_9014.vasp,K2C2O6F2,-4.049272776666666,0.0997847210416645 -Al6O9_150_1105.vasp,Al6O9,-5.899144272666666,0.2243905653333335 -Si2Ru1_123_16430.vasp,Si2Ru1,-3.93144902,0.7268088274999998 -Mn2Sb2Br2O4_26_11230.vasp,Mn2Sb2Br2O4,-3.228306532,0.1117265569999999 -Er6Br7_2_5580.vasp,Er6Br7,-2.115224043846154,0.1646532696153824 -Sb3Au1S6_143_15754.vasp,Sb3Au1S6,-2.1031752310000003,0.3330715619687499 -Ce2Se2_129_3679.vasp,Ce2Se2,-3.73657059,0.2941840216666667 -Zr3N2O2_187_21774.vasp,Zr3N2O2,-7.167056238571428,-0.0890118800000054 -Pd2Se2S6_11_14490.vasp,Pd2Se2S6,-2.111695631,0.1853029744999978 -Nb2N1O2_164_12766.vasp,Nb2N1O2,-7.132742609999999,0.0587312897500016 -Sr2P4_12_17297.vasp,Sr2P4,-2.94841474,0.4597450009999968 -Ti1As2_187_18739.vasp,Ti1As2,-4.370043766666667,-0.7593418529166667 -V1Ag1S1Br1_8_19759.vasp,V1Ag1S1Br1,-1.5118326125,0.5344909533333309 -Cu2As2Se4_26_5013.vasp,Cu2As2Se4,-1.67870792125,0.00254205953125 -Si3Sb4_5_16480.vasp,Si3Sb4,-2.5888047585714284,-0.0024168385714309 -Sn2P1S6_162_16802.vasp,Sn2P1S6,-2.686643637777778,0.1273751211111109 -Cr1Sb2_164_4258.vasp,Cr1Sb2,-2.191781426666666,1.064257511666664 -Na2Er2S4O16_11_12072.vasp,Na2Er2S4O16,-4.873805209583334,0.0770357612499994 -Au2S4Br2_1_1523.vasp,Au2S4Br2,-1.0578650125,0.1107429177083322 -Ga2Ge1I2_6_6362.vasp,Ga2Ge1I2,-1.28425006,0.1648661786666658 -Ta4Pd2Se10_13_18086.vasp,Ta4Pd2Se10,-3.85629335,-0.1441692837500063 -Co2Ni1O6_12_3937.vasp,Co2Ni1O6,-3.406043441111111,-0.5625034323611138 -Cd1P1_8_3387.vasp,Cd1P1,-0.023865215,0.8056576293750002 -Ir2Se1S1I2_6_8832.vasp,Ir2Se1S1I2,-2.0816211716666664,0.0138332367361042 -Ir2S2I2_59_8820.vasp,Ir2S2I2,-2.2586387316666667,0.0917845988888865 -Ir1O1F1_156_8741.vasp,Ir1O1F1,-3.1151263100000004,0.5398980988888851 -Zr2Ge2Se2_129_21570.vasp,Zr2Ge2Se2,-4.085774408333333,0.1282199416666669 -Bi2I6_189_2468.vasp,Bi2I6,-0.3166465825,0.1731074437499999 -Ga3Cu1S2Cl4_1_6527.vasp,Ga3Cu1S2Cl4,-1.698560441,0.2515916639999985 -Zr2Sb2Te6_2_21665.vasp,Zr2Sb2Te6,-2.403272055,0.2903808844999982 -Ti3Se2N2F2_6_19104.vasp,Ti3Se2N2F2,-5.15810063,0.287781610314804 -Ta2Fe4S6_11_17732.vasp,Ta2Fe4S6,-3.255213786666667,0.4727500847222186 -Tb2Si1_164_18209.vasp,Tb2Si1,-2.684964036666667,0.7696369091666633 -Au2Se4Cl2_17_1554.vasp,Au2Se4Cl2,-0.78029612875,0.261855468125 -Li2H2S2_11_9932.vasp,Li2H2S2,-3.178788688333333,0.1108812375000005 -In2Sb2Se6_147_8567.vasp,In2Sb2Se6,-2.030080735,0.1423898930000002 -Hf1Zr3Ge2N6Cl4_1_7416.vasp,Hf1Zr3Ge2N6Cl4,-5.351315319375,0.2532330168749984 -Ni2C4N4_123_13488.vasp,Ni2C4N4,-5.577201617,1.18015494166666 -B3Rh1_187_1739.vasp,B3Rh1,-3.1470318875,2.152886265416667 -Ga4Sb4_127_6569.vasp,Ga4Sb4,-1.34652979125,-0.21746103625 -V4Se2_129_20366.vasp,V4Se2,-3.384541913333333,0.4552346108333334 -Ir1Rh2S2Br4_6_8752.vasp,Ir1Rh2S2Br4,-1.7386621466666667,0.3045072778600719 -Ag1Ge1H6_2_58.vasp,Ag1Ge1H6,-2.26530058875,1.535731067091732 -Zn2Co8O18_13_21061.vasp,Zn2Co8O18,-3.2251785721428567,-0.2525144732142906 -Na2Au1S2_12_11966.vasp,Na2Au1S2,-1.359311012,0.4349883048333316 -Tl1Ag1As2S6_149_19199.vasp,Tl1Ag1As2S6,-2.092379716,0.3491578139999974 -Bi18Cl4_11_2311.vasp,Bi18Cl4,-1.2225540163636364,-0.5257646965151523 -Li2Mo1_187_10005.vasp,Li2Mo1,-1.6741245133333331,1.1173462077777754 -As2Pt2O6_12_1277.vasp,As2Pt2O6,-3.460801738,0.357910814749997 -Ag2Te8Au2_13_488.vasp,Ag2Te8Au2,-0.5338217241666666,0.1479485316666667 -Cu2W2O6F4_11_5366.vasp,Cu2W2O6F4,-3.816112192857143,0.0906505632142824 -Mn2In2Te5_164_11130.vasp,Mn2In2Te5,-1.457611248888889,0.1601552645976992 -V2P2O12_129_20136.vasp,V2P2O12,-4.8622258075,0.5341458014062503 -Zr3S2N2F2_187_21779.vasp,Zr3S2N2F2,-4.91959679,0.9483896709722122 -Ni2Bi4S6Cl4_2_13475.vasp,Ni2Bi4S6Cl4,-1.74004785125,0.138273032708332 -Gd2Cl6_59_6608.vasp,Gd2Cl6,-2.92615158625,0.0171072987499973 -Li1Co1As2Se6_5_9672.vasp,Li1Co1As2Se6,-2.362021152,0.252722269083331 -Na2Ru2N2O2F10_1_12281.vasp,Na2Ru2N2O2F10,-3.18247661,-0.1474592071296367 -Bi8Te8O4_11_2700.vasp,Bi8Te8O4,-2.092753766,0.2381469326666647 -Hf2P2S6_2_7555.vasp,Hf2P2S6,-4.411090566,0.2454655807499955 -Ni2Sb4S6Cl4_2_13623.vasp,Ni2Sb4S6Cl4,-1.895125214375,0.172647079583332 -K1In1I4O12_2_8911.vasp,K1In1I4O12,-2.722661048888889,0.0562770928472198 -Tl1Ni5Br2_123_19305.vasp,Tl1Ni5Br2,0.5052196325,3.76735386625 -Hf4C3F2_164_7774.vasp,Hf4C3F2,-6.918964352222222,0.1090119776851648 -Ir1I2_115_8737.vasp,Ir1I2,-0.4305102166666666,0.897373999999999 -W2Se2_129_20547.vasp,W2Se2,-3.708671965,0.589300105 -Ag2Te2Br2_59_454.vasp,Ag2Te2Br2,-0.1789389816666666,0.2163263820833329 -Cu2I2N2_59_5167.vasp,Cu2I2N2,-1.196822243333333,0.6030657908333308 -U2Se6_129_19726.vasp,U2Se6,-4.38119797625,0.0928034287499999 -H4W2O8_31_7083.vasp,H4W2O8,-5.2408214385714285,-0.0444247459523854 -Sn1Ge1S2Br2_6_16635.vasp,Sn1Ge1S2Br2,-1.9828560233333332,0.1793987846874998 -Tl1Sb1Se2_47_19335.vasp,Tl1Sb1Se2,-1.40485092,0.5096462675000002 -Hf2Te6_59_7647.vasp,Hf2Te6,-3.04186758875,0.086533165 -Si6N2_191_16532.vasp,Si6N2,-4.484683725,-0.2568554006249999 -Zn2N12_2_21122.vasp,Zn2N12,-5.238306394285714,-0.8374840892857123 -Ga2Co2Se5_187_6334.vasp,Ga2Co2Se5,-2.2556419355555555,0.0068093704814771 -Fe2Mo2O8F2_129_5872.vasp,Fe2Mo2O8F2,-4.0236550921428575,0.1266347301190444 -Cr2Se2I2_59_4496.vasp,Cr2Se2I2,-1.6629323566666667,0.0804409283333331 -Nb4Pd6Se10_59_13129.vasp,Nb4Pd6Se10,-2.9905603525,0.100600090467102 -Re1Ag2Cl6_147_14987.vasp,Re1Ag2Cl6,-1.206870653333333,0.849711775740739 -Ho1Te1_8_8121.vasp,Ho1Te1,-2.03411453,0.9765625399999998 -Te2Au2_164_18372.vasp,Te2Au2,0.09126484,0.5199014875 -Ti2C1Se2_164_18913.vasp,Ti2C1Se2,-5.771132074,-0.5587482808000068 -Yb2Br6_12_20863.vasp,Yb2Br6,-2.30496696125,-0.6216923687499998 -Tl2I1Br1_1_19431.vasp,Tl2I1Br1,-0.5248927225,-0.0174301937499999 -Cd1H1S1Br1_156_3330.vasp,Cd1H1S1Br1,-1.2971378275,0.1076232840624997 -H8Pb2C10I4N2O2_2_7094.vasp,H8Pb2C10I4N2O2,-4.702048167142857,0.3194152070349587 -Tl2Ni4Te6_164_19465.vasp,Tl2Ni4Te6,-0.5755171958333333,0.1452287270833328 -Mn1Rh1Se2Br2_35_10849.vasp,Mn1Rh1Se2Br2,-1.5094466416666668,0.4687223070833332 -Ta1I2_187_17558.vasp,Ta1I2,-2.14601219,0.6560796521428511 -Sb4Te3Au2I2_6_15833.vasp,Sb4Te3Au2I2,-0.8332723554545454,0.3347884112727253 -Zr2Te2_123_21713.vasp,Zr2Te2,-3.1096567975,-0.1474862625000002 -Ag2As4S3F2_6_167.vasp,Ag2As4S3F2,-2.0102728772727274,0.2858314499053001 -Mn1In1Se2Br2_8_10779.vasp,Mn1In1Se2Br2,-1.4797766783333337,0.1924417377083311 -Hf2I2Br2_6_7512.vasp,Hf2I2Br2,-2.217854725,0.7259795079629601 -Hf1P2O6F2_164_7257.vasp,Hf1P2O6F2,-5.809739479090909,0.0395790690909096 -Al2O2_164_913.vasp,Al2O2,-5.20687633,0.3000661791666621 -As2W1_187_1307.vasp,As2W1,-3.94895913,0.3233632491666627 -Tl2S5_1_19513.vasp,Tl2S5,-1.7880736785714286,0.2457761960714268 -Te2W2I2_25_18528.vasp,Te2W2I2,-2.115154685,0.4426395673611112 -Na1H4C3N3O4_1_11875.vasp,Na1H4C3N3O4,-5.549964143333333,-0.1038049700833443 -Na2Dy2Cl8_2_12071.vasp,Na2Dy2Cl8,-2.5640129233333333,0.0898881930555528 -K4S12_13_9503.vasp,K4S12,-2.104455349375,0.1018348418750001 -Ba1Bi4O7_156_1809.vasp,Ba1Bi4O7,-3.3184497991666664,0.6223982518749929 -Ag2S2N2Cl2_31_381.vasp,Ag2S2N2Cl2,-1.85649131875,0.57862518484375 -Sn2P2S6_147_16821.vasp,Sn2P2S6,-2.942060489,0.1163655619999999 -Nb4I16_14_13089.vasp,Nb4I16,-1.258441218,0.1818917074999999 -Ta4Se12_11_18109.vasp,Ta4Se12,-3.98186508875,0.067943626875 -In1Sb2Au1S6_149_8336.vasp,In1Sb2Au1S6,-2.006900901,0.3258903739374976 -In1Ni2Pd1S3I3Br1O1_1_8287.vasp,In1Ni2Pd1S3I3Br1O1,-1.1638916266666668,0.2564389783601603 -Ge1Se2_164_6709.vasp,Ge1Se2,-2.461669193333333,0.1424636838888884 -Ho4Te10O26_2_8153.vasp,Ho4Te10O26,-4.437609486,0.0747847194999993 -Cr2Cu2P4O12_4_4367.vasp,Cr2Cu2P4O12,-4.6074295005,0.5124146696666593 -H2Au2_129_6991.vasp,H2Au2,-0.7722374575,2.389308755 -Na1Ga1I4O12_2_11862.vasp,Na1Ga1I4O12,-2.878726075,0.121700793194442 -Cd2As2S6_147_3455.vasp,Cd2As2S6,-1.906127483,0.4119739456874975 -Ti1I2_164_18796.vasp,Ti1I2,-2.341136966666667,0.1832921983333331 -Ge2Sb2H2S6_7_6844.vasp,Ge2Sb2H2S6,-2.6909587816666662,0.3389408855902754 -Ti4B3H2O2_164_19119.vasp,Ti4B3H2O2,-6.0267808800000005,0.2558821866666618 -In1S1_123_8326.vasp,In1S1,-1.82251987,0.4571502950000001 -Ge3S1Br4_1_6918.vasp,Ge3S1Br4,-1.870201475,-0.0738354515624999 -Al8O6_11_1110.vasp,Al8O6,-4.645309666428572,0.421209750714282 -Er4I5_10_5578.vasp,Er4I5,-1.6013974233333332,0.1389226090740725 -Fe1Ag2I1N1Cl1O1_1_5617.vasp,Fe1Ag2I1N1Cl1O1,-1.3515408871428571,0.3604302437499956 -Sc1P2Au1O6_149_15972.vasp,Sc1P2Au1O6,-4.865151277,0.657622673599993 -Ca2Fe2Ge2_129_3017.vasp,Ca2Fe2Ge2,-1.30281375,0.866566844999998 -Pb8S2O16_2_14339.vasp,Pb8S2O16,-3.673710414230769,0.1759719635576893 -Fe2N2Cl2_59_5884.vasp,Fe2N2Cl2,-2.667892145,0.5811498754166622 -Mn2W2S8F2_129_11344.vasp,Mn2W2S8F2,-3.1352427535714287,0.4777521686607082 -Al2Cl6_26_798.vasp,Al2Cl6,-2.13836967,0.1461400837500002 -Nb2Br1Cl1O2_1_12642.vasp,Nb2Br1Cl1O2,-4.7187305450000006,0.2830174446527659 -P4O6_81_14087.vasp,P4O6,-5.112611974,0.1461917796000005 -In1Au1Br2O2_6_8193.vasp,In1Au1Br2O2,-1.6772697049999998,0.2032369260763848 -Ta2Ni4Se2S2_51_17801.vasp,Ta2Ni4Se2S2,-2.70126325,0.0207484773272708 -Ca2Ag1I2O2_38_2904.vasp,Ca2Ag1I2O2,-2.1901688842857143,-0.0697185858035724 -Si2S2_59_16437.vasp,Si2S2,-3.4130246625,0.2454295150000002 -Sm1_191_16562.vasp,Sm1,-0.60819529,1.5802315424999998 -Mn1Ge1Te2S1Cl1_6_10753.vasp,Mn1Ge1Te2S1Cl1,-2.0769180533333333,-0.0537384900781275 -Bi4S6_31_2642.vasp,Bi4S6,-2.286683499,-0.8332616020000001 -Ge2P2O6F2_7_6806.vasp,Ge2P2O6F2,-4.845631149166667,-0.0025431435714352 -Au4S2_26_1580.vasp,Au4S2,-0.1611360266666666,0.1646573833333333 -Na2B2H6C8S2_51_11976.vasp,Na2B2H6C8S2,-4.289837038,1.1783950948245476 -La1Si3_187_9573.vasp,La1Si3,-3.09496736,0.86364714625 -Hf1Ti1S3I1_1_7335.vasp,Hf1Ti1S3I1,-4.282461751666667,0.2700838774999954 -Zn1Ga2O4_156_20936.vasp,Zn1Ga2O4,-3.745839102857143,-0.2108618326785775 -Hf1Cd1Cl2O2_6_7134.vasp,Hf1Cd1Cl2O2,-3.86104342,0.2349007058333332 -Zr2B1Cl2_164_21507.vasp,Zr2B1Cl2,-4.32464874,-0.1654465576470662 -Nb2P2O6_162_12805.vasp,Nb2P2O6,-5.853195352,0.4253233881 -Fe1C8I2F4_25_5655.vasp,Fe1C8I2F4,-4.427471612000001,0.4777411234166585 -Ta1Sb2_187_17613.vasp,Ta1Sb2,-3.8474227366666662,0.3465759849999998 -Ni2S2_187_13589.vasp,Ni2S2,-0.975825735,0.4526352883333318 -Cr3Br2Cl1O4_1_4546.vasp,Cr3Br2Cl1O4,-3.498114516,-0.0209838323749997 -Na2H4N2O6_7_12110.vasp,Na2H4N2O6,-4.289330272857143,0.0331936381190391 -Zn1Se2_115_21011.vasp,Zn1Se2,-0.71722915,0.5187692702777768 -Co2Pb8_125_3973.vasp,Co2Pb8,-0.713532885,0.6839958290000001 -Ta4H2C3_164_18050.vasp,Ta4H2C3,-7.18264318,0.2181642863888759 -Mn4Se2I1Br3O1_1_11453.vasp,Mn4Se2I1Br3O1,-2.020111699090909,0.0458739446590892 -Pt4C12_55_14698.vasp,Pt4C12,-4.8230344175,2.107159125 -Si2S2_123_16435.vasp,Si2S2,-2.9246725875,0.7337815900000001 -Ga1Ni1Te2_156_6217.vasp,Ga1Ni1Te2,-1.0037080075,0.0966408660833334 -As1Au3S4_156_1134.vasp,As1Au3S4,-1.09536750125,0.5714552107812501 -Sc2P2O6_157_16117.vasp,Sc2P2O6,-5.674492422,0.4715002961499928 -Tl1Sb2Te6Au1_149_19341.vasp,Tl1Sb2Te6Au1,-0.982403138,0.1880327069583318 -Ca2Ge4F12_2_3023.vasp,Ca2Ge4F12,-3.3438356316666664,-0.6713542333333357 -Si3Bi4_5_16468.vasp,Si3Bi4,-1.9755660657142855,-0.4272919042857159 -Ti2Zn2_129_19056.vasp,Ti2Zn2,-1.9072017625,0.0389981825 -Li2Ni2P2O8_51_10027.vasp,Li2Ni2P2O8,-4.202230232857143,0.2028571400714266 -Li1Hf1S2_156_9723.vasp,Li1Hf1S2,-4.44340821,0.0695935942857104 -Te1O3_187_18314.vasp,Te1O3,-2.8734127275,0.8034818415625002 -Au2Se2I2_59_1545.vasp,Au2Se2I2,-0.09902481,0.2298148638888885 -Mg1Al2Se4_164_10335.vasp,Mg1Al2Se4,-2.7965382828571426,0.0725425928571432 -Ge1Mo1Br2O2_25_6678.vasp,Ge1Mo1Br2O2,-3.34249239,0.1358462058333334 -Ti1Se1S1_156_18848.vasp,Ti1Se1S1,-4.589698976666667,0.1928162699999998 -Pb5S2I6_12_14326.vasp,Pb5S2I6,-1.1217888176923076,-0.4158591503846159 -Sb2W1_187_15747.vasp,Sb2W1,-3.0635166166666665,0.7980304883333302 -H6N2O8_7_7085.vasp,H6N2O8,-4.403110273125,0.0363620203125005 -Hg10O4_14_7829.vasp,Hg10O4,1.0454788857142856,0.4339067278160927 -Pr4I10_11_14562.vasp,Pr4I10,-1.7803412478571428,0.0881849985714287 -Cu2W1S4_111_5363.vasp,Cu2W1S4,-2.627590428571428,0.0677539709523786 -Mn2N2Cl2_59_11156.vasp,Mn2N2Cl2,-3.45102285,0.2069167537499947 -Rb2Hg4Te2S6I6_31_14890.vasp,Rb2Hg4Te2S6I6,-0.4945368625,0.1264206194374975 -Mg2Ti8O18_85_10530.vasp,Mg2Ti8O18,-6.595031574642857,0.3049248832142792 -Nb1Sn3As1Se1S2Br4Cl2_1_12592.vasp,Nb1Sn3As1Se1S2Br4Cl2,-2.1063538457142856,0.1986783681745947 -Zr3Ti1S8_1_21795.vasp,Zr3Ti1S8,-4.595588301666667,0.2858934606249992 -V2Br8_1_20011.vasp,V2Br8,-1.317903189,0.0799493830000002 -Ga4Te4I4_14_6578.vasp,Ga4Te4I4,-1.2179135666666667,0.0401985874999999 -K2C4_129_9036.vasp,K2C4,-3.6417533416666665,1.4021309208333332 -W8S24_14_20597.vasp,W8S24,-3.8538412278125,0.15507895953125 -Tm2Br2O2_59_19672.vasp,Tm2Br2O2,-4.730924906666666,0.0945705216666672 -Cs1Ge1S2_156_4640.vasp,Cs1Ge1S2,-2.049927785,0.528288785 -H4Pd1C6I2N2_25_7075.vasp,H4Pd1C6I2N2,-4.929385740666667,0.276773989083328 -Mn1Mo1S2Br4_3_10797.vasp,Mn1Mo1S2Br4,-1.82441942875,0.1592358606696409 -Sr2Cl4_2_17184.vasp,Sr2Cl4,-2.0274064516666668,0.4700913016666663 -K2Sb2S4_13_9342.vasp,K2Sb2S4,-2.16305197625,0.18931956125 -Hf1V1Sb1H1Br1O4_1_7355.vasp,Hf1V1Sb1H1Br1O4,-4.858929597777777,0.1719530746759141 -B6H4Au1S2N6_6_1777.vasp,B6H4Au1S2N6,-4.852831068421052,1.1746984744736824 -Ga4Se4Cl4_14_6572.vasp,Ga4Se4Cl4,-2.0514337641666667,0.0706175574999998 -Sc2Sb2O6_162_16143.vasp,Sc2Sb2O6,-5.3579659280000005,0.0736068036249992 -Tl2Bi2_129_19375.vasp,Tl2Bi2,-0.2421645925,0.28015126125 -Hf2Sc1I2N3_8_7589.vasp,Hf2Sc1I2N3,-5.64771778125,0.1427483924062421 -Cd2Cu2S2Cl2_26_3490.vasp,Cd2Cu2S2Cl2,-0.511859695,0.1982327853125 -Ag4O4F8_14_536.vasp,Ag4O4F8,-0.96479326625,0.5010750590625 -Na2Te2F2_2_12316.vasp,Na2Te2F2,-1.7081335066666667,0.2805812655555535 -K4Hg2F8_51_9461.vasp,K4Hg2F8,-1.2472726507142855,0.0354067171428561 -Au6F16_14_1605.vasp,Au6F16,-0.5746597831818182,0.1613340639898979 -Cu1Pb1F6_2_4936.vasp,Cu1Pb1F6,-1.605328425,-0.0026391974999999 -Ge2Cl8_1_6772.vasp,Ge2Cl8,-1.570970216,0.0843482494999998 -Hg1H1S1F1_156_7864.vasp,Hg1H1S1F1,-1.334697685,0.3407796199999999 -Ca2Cu1O2F2_38_2996.vasp,Ca2Cu1O2F2,-3.2497233442857145,0.3135929807142799 -Hf1Fe2I1O6_8_7165.vasp,Hf1Fe2I1O6,-4.288449733,0.2994381636624976 -Co2Te5P2_8_4049.vasp,Co2Te5P2,-1.927931172222222,0.5712200598148125 -Zr2Br8_1_21530.vasp,Zr2Br8,-2.142567477,0.0830858060000001 -Te2Pt2_129_18489.vasp,Te2Pt2,-1.4360763075,0.4614772624999999 -Zr1Te1Se1_156_21463.vasp,Zr1Te1Se1,-3.54491089,0.1051487887499997 -Cr2H4_12_4404.vasp,Cr2H4,-3.133293168333333,1.8175408783333291 -Nb3S4Br4Cl1_1_13006.vasp,Nb3S4Br4Cl1,-3.276619073333333,-0.1320208233333324 -Hf2Zr1H1O6_1_7665.vasp,Hf2Zr1H1O6,-6.687448983,0.6225200724999884 -Ni2N4O12_14_13540.vasp,Ni2N4O12,-4.091543805555556,-0.1774191943055599 -P8S8_5_14157.vasp,P8S8,-3.398013289375,0.1157619927734376 -K2Co2P2_129_9084.vasp,K2Co2P2,-1.9929055616666669,0.0827098733333336 -Ti4Se4Cl4_31_19162.vasp,Ti4Se4Cl4,-3.946077145,-0.374265041190484 -Ni1C6I2F4_47_13302.vasp,Ni1C6I2F4,-3.881165386923077,0.4250177918269208 -Au2S2_59_1518.vasp,Au2S2,-0.5671883375,0.4446002275 -V2Te2C1_164_20202.vasp,V2Te2C1,-3.860545374,0.1090351535999984 -Nb4C3S2_164_13047.vasp,Nb4C3S2,-6.865338578888889,-0.2102800524074202 -Tc4F14_13_18248.vasp,Tc4F14,-3.562643565555556,-0.0133252676388959 -Sb2S2Cl2_59_15675.vasp,Sb2S2Cl2,-2.128698868333333,0.1521771825 -Ta2Fe4Te2S2_51_17735.vasp,Ta2Fe4Te2S2,-2.919301671,0.1979586223333307 -P4Se2O12_18_14120.vasp,P4Se2O12,-4.326234863888889,0.6585175678240667 -In2_51_8644.vasp,In2,-0.563572365,1.967020755 -Co4S4Cl4_14_4085.vasp,Co4S4Cl4,-2.1065718725,0.1740686325 -Li2Ni2P2_12_10028.vasp,Li2Ni2P2,-2.102217395,0.1184664242424248 -Ag2As2Se6_2_160.vasp,Ag2As2Se6,-1.52107147,-0.0504185167368447 -Cd1H4N6Cl2_1_3358.vasp,Cd1H4N6Cl2,-3.952497577692308,-0.0592067161538509 -Sr1Ge2_164_17051.vasp,Sr1Ge2,-1.3911060466666667,0.9681518800000002 -Li4V4O12_13_10245.vasp,Li4V4O12,-5.1907546415,0.1541005885000004 -Mg2Sb2O6_162_10503.vasp,Mg2Sb2O6,-4.119654239,0.243430805249996 -In2Te6Pt4_164_8643.vasp,In2Te6Pt4,-1.6520810491666669,0.191244345833333 -Ca2P2H10O12_7_3084.vasp,Ca2P2H10O12,-4.824079232692307,0.0438518576282003 -Te1As1Br1_156_18278.vasp,Te1As1Br1,-1.49131354,0.2772077233333334 -Cr2Se4_127_4503.vasp,Cr2Se4,-1.8651168066666663,0.9013688083333335 -Mn2Nb2S6_11_11162.vasp,Mn2Nb2S6,-4.068154814,0.1989652493333296 -Au4Se4Cl4_14_1599.vasp,Au4Se4Cl4,-0.5761274241666666,0.054067669333333 -Bi2Pd4O8_129_2504.vasp,Bi2Pd4O8,-2.832803369285714,0.3647343064285689 -Ca6Al2As6_26_3254.vasp,Ca6Al2As6,-2.3436064757142856,0.3278772300000003 -Ge4O4_57_6933.vasp,Ge4O4,-4.41318868125,-0.2064706118750003 -Zr2Br2_164_21523.vasp,Zr2Br2,-2.9547233125,0.1186029749999999 -Au2Se2_164_1549.vasp,Au2Se2,-0.257765085,0.418355195 -Tl2Cl4_10_19392.vasp,Tl2Cl4,-0.8011040349999999,-0.1618958399999999 -Na1Ti1Se2_156_11944.vasp,Na1Ti1Se2,-3.4542053425,0.2894445450000003 -Zn2Fe1C6N6_2_21074.vasp,Zn2Fe1C6N6,-5.589901336,0.3492558126666534 -Bi2W2_12_2582.vasp,Bi2W2,-3.3139524125,0.4282351700000002 -Ni4Se6S2_7_13765.vasp,Ni4Se6S2,-1.358302435833333,0.2345740442361093 -Nd1Sn2_123_13229.vasp,Nd1Sn2,-1.6088251666666666,0.6960696816666667 -Mn1Sb2Br1_156_10868.vasp,Mn1Sb2Br1,-1.37298122,0.4677988706249999 -Sc2F2_164_16068.vasp,Sc2F2,-3.668015495,-0.1297484133333362 -Fe2S4_11_5942.vasp,Fe2S4,-2.307543265,-0.3714173500000002 -Na2B2C8S2F6_51_11971.vasp,Na2B2C8S2F6,-3.8907084615,1.6343581436015588 -Fe2Se2O8_31_5975.vasp,Fe2Se2O8,-3.426465375833333,0.2315553349999932 -Hf2C1Cl2_164_7455.vasp,Hf2C1Cl2,-5.4484513020000005,0.0276546899999994 -Sn2S1Br1Cl1_1_16832.vasp,Sn2S1Br1Cl1,-1.738388428,0.0938334820000003 -Mg2Se1O1_6_10513.vasp,Mg2Se1O1,-2.8690837125,0.2526467837499999 -Cu2Br4O12_4_5055.vasp,Cu2Br4O12,-2.0049596411111112,0.2782456280555536 -Ba4Sb2O1_123_2175.vasp,Ba4Sb2O1,-2.3646924171428574,0.1034372835714285 -Y2C1O2_164_20711.vasp,Y2C1O2,-6.369785688,0.8526921064687425 -Na1Tl3Hg2N1O2F6_1_11950.vasp,Na1Tl3Hg2N1O2F6,-1.6348309086666668,0.3325790891111051 -Cs2C2O6_11_4667.vasp,Cs2C2O6,-4.7019816720000005,0.122016112624997 -Cu1B6N6O2F4_6_4846.vasp,Cu1B6N6O2F4,-5.340748352105263,0.5035607423391739 -Sb8Pb4_26_15873.vasp,Sb8Pb4,-1.5479013258333334,0.4172054291666649 -Ti4H2C3_164_19137.vasp,Ti4H2C3,-6.832290064444445,-0.1262563955555622 -Zr1Mo2O8_12_21330.vasp,Zr1Mo2O8,-5.583605815454546,0.1154163518181814 -Fe2Mo2S8Cl2_129_5876.vasp,Fe2Mo2S8Cl2,-2.2044145942857143,0.3714673213392807 -Ge1F2_164_6663.vasp,Ge1F2,-2.852003003333333,0.2926901683333334 -V2S2F2_59_20154.vasp,V2S2F2,-3.637558173333333,-0.0602548361111145 -Hg1H1_183_7866.vasp,Hg1H1,0.419776785,1.6052588893965516 -Ag2C6N8O10_2_235.vasp,Ag2C6N8O10,-5.169188734615385,0.3814010086217902 -Cr2Cu2P4S12_2_4369.vasp,Cr2Cu2P4S12,-2.966372334,0.0300110557864525 -Li2H4I2O2_6_9938.vasp,Li2H4I2O2,-3.315494863,-0.1679730830000001 -Al2Tl2F8_3_1025.vasp,Al2Tl2F8,-3.1666214216666666,0.2495852133333334 -Hf1Tl1I1N1Cl1O1_1_7345.vasp,Hf1Tl1I1N1Cl1O1,-3.6737561816666666,0.5138088828472149 -K2Mg1S10F4_2_9222.vasp,K2Mg1S10F4,-2.095054347647059,0.6187320537499974 -Mn2Te4As2Cl2_26_11313.vasp,Mn2Te4As2Cl2,-1.748192035,0.2912078244999963 -Co1O2_12_3804.vasp,Co1O2,-3.724858356666666,-0.6276919245833359 -In2S3_150_8557.vasp,In2S3,-2.035816234,0.488824149 -Sb6H2O12_4_15848.vasp,Sb6H2O12,-4.1556092985,0.205541120416667 -Ag4Se4Br4_14_562.vasp,Ag4Se4Br4,-0.4180390858333333,0.2872730152777772 -Co1C6Cl2F4_47_3717.vasp,Co1C6Cl2F4,-4.324319869230769,0.4298276880128132 -Nb3Br2Cl1O4_1_12951.vasp,Nb3Br2Cl1O4,-5.053908444,0.1863499813333273 -Cu2S4_6_5262.vasp,Cu2S4,-1.5460432533333333,0.2348541542361096 -Nb4B3S2F2_164_13038.vasp,Nb4B3S2F2,-5.181963593636364,0.4288898609673606 -Ag1Br2_187_37.vasp,Ag1Br2,0.2951813633333333,0.2290089166666667 -Mo2F6_162_11607.vasp,Mo2F6,-2.99854155,-0.1885063556249999 -As4_53_1378.vasp,As4,-3.0546317275,0.1565528325 -Ag2Br4_14_207.vasp,Ag2Br4,0.1863894633333333,0.1202170166666666 -Ta1Cu1Ni1S1I2N2O1_1_17538.vasp,Ta1Cu1Ni1S1I2N2O1,-3.18201322,0.3277786738734519 -Sr2As4O12_2_17121.vasp,Sr2As4O12,-4.413589533333333,0.2785400538888893 -Nb2B1H2S2_164_12630.vasp,Nb2B1H2S2,-4.763380085714286,0.7800091951428472 -Al1In1Hg1S4_156_677.vasp,Al1In1Hg1S4,-2.139340184285714,0.1435560189285716 -Ti1Te2_123_18858.vasp,Ti1Te2,-3.2500595066666667,0.3801477516666667 -Cu2C2Cl2O2_31_5061.vasp,Cu2C2Cl2O2,-3.33404776625,0.3213505193750001 -Zr1Ti1I6_5_21470.vasp,Zr1Ti1I6,-1.7666600425,0.2705834387499999 -Na1O4_143_11922.vasp,Na1O4,-2.576305208,0.2544287535000002 -B18Se9_143_1614.vasp,B18Se9,-4.2446269725925925,0.5923579818518476 -Cu1Si2Ni1Te5Se1_1_4980.vasp,Cu1Si2Ni1Te5Se1,-1.501742578,0.3393973342534686 -Li1W2I6O2_47_9813.vasp,Li1W2I6O2,-2.4298674463636365,-0.3709185335000057 -P1I3_157_13922.vasp,P1I3,-0.6011263875,0.1773795774999996 -Sr2Ti2Si4O14_51_17329.vasp,Sr2Ti2Si4O14,-6.286734445909091,0.1167122774242302 -Mg1Br2_187_10348.vasp,Mg1Br2,-1.3051826766666668,0.2327878877777776 -K2Bi2F8_8_9002.vasp,K2Bi2F8,-2.3228903858333334,0.270904658333333 -Pr2Br2O4_11_14543.vasp,Pr2Br2O4,-4.17574283875,0.3305859603125001 -Cr2O2_164_4437.vasp,Cr2O2,-4.4332579675,0.6920410324999948 -Nb4S6_2_13144.vasp,Nb4S6,-5.054460158,-0.1519186615000034 -Sr1Te2H2_5_17094.vasp,Sr1Te2H2,-2.145499378,0.8061518293333338 -Bi4Cl12_11_2607.vasp,Bi4Cl12,-1.36745721,0.04783625 -K2B2O8F8_1_8995.vasp,K2B2O8F8,-2.7050946705000003,0.90938552725 -K4As8F28_14_9412.vasp,K4As8F28,-2.73993377075,0.0288914184999997 -Te2Pd1_164_18463.vasp,Te2Pd1,-1.24881506,0.2402294766666668 -Hf2Mo2O8_10_7535.vasp,Hf2Mo2O8,-6.2178421475,0.3318573575000001 -Ag1Pt1F5_1_105.vasp,Ag1Pt1F5,-1.164201471428571,0.1697011114285703 -Mg2Si1O4_123_10514.vasp,Mg2Si1O4,-3.4781022214285717,1.9612328846428568 -B2O3_189_1688.vasp,B2O3,-6.739961461999999,0.1143729133333346 -Ti3N2O2_187_19096.vasp,Ti3N2O2,-7.782488634285714,-0.1686190807142922 -K4Mn2Se4_49_9474.vasp,K4Mn2Se4,-1.218126311,0.08623534 -Hg1Cl2_115_7851.vasp,Hg1Cl2,0.2785309433333333,0.1482927666666666 -Mo1W2O8_2_11555.vasp,Mo1W2O8,-5.697613050909091,0.0158416545454498 -Sr1Bi2F12_2_17028.vasp,Sr1Bi2F12,-2.277339833333333,0.0040894753333333 -Ba4As2_59_2130.vasp,Ba4As2,-1.6149881266666668,0.2920533766666648 -Ge1Te4As2_164_6721.vasp,Ge1Te4As2,-2.1439585514285717,-0.2162643078571442 -As2Pb2Se6_147_1262.vasp,As2Pb2Se6,-2.0988254690000003,0.2149715512083308 -Ag2I4_14_320.vasp,Ag2I4,0.5108258933333333,0.1520867006250002 -Mn1In1Au1O4_25_10772.vasp,Mn1In1Au1O4,-2.9187230785714284,0.7057533274999956 -Ag2F2_67_258.vasp,Ag2F2,-0.28344088,0.4626062749999999 -Ni1Cl2O6_12_13309.vasp,Ni1Cl2O6,-2.056906193333333,0.2843681130555535 -Nb2Cu1S4_164_12706.vasp,Nb2Cu1S4,-3.715251562857143,0.6275791180952357 -Ni1C8Br2F4_25_13305.vasp,Ni1C8Br2F4,-4.378563183333333,0.5052080759999942 -Tl2N6_164_19458.vasp,Tl2N6,-4.4117018325,-0.3144683456250003 -Mn2Sb2O4F2_26_11236.vasp,Mn2Sb2O4F2,-3.706843225,0.0653808739999977 -Ca3Si1Br2_8_3201.vasp,Ca3Si1Br2,-1.5328865383333332,0.2189199829166669 -Hf2Cl6_189_7480.vasp,Hf2Cl6,-3.11024399,0.2461979049999967 -Ca2As1_25_2922.vasp,Ca2As1,-0.93279061,1.0108938488888872 -Ba2Mn3O8_99_2029.vasp,Ba2Mn3O8,-4.34249820923077,0.2822045830769186 -Sc3C2O2_187_16200.vasp,Sc3C2O2,-5.867703212857143,0.4251489484081507 -Cr4O10_31_4612.vasp,Cr4O10,-4.8875592021428576,-0.2782536417857183 -Ta1Te2_191_17630.vasp,Ta1Te2,-2.783292376666666,0.9645909922222224 -Sr2Be2_164_17140.vasp,Sr2Be2,-0.5511540525,1.2280066651923058 -Cr2S2_129_4468.vasp,Cr2S2,-3.42701255,0.3529985049999997 -K4Sb8F28_14_9510.vasp,K4Sb8F28,-2.7421412615,0.0363834044999999 -Cr1Se2_164_4264.vasp,Cr1Se2,-2.62434818,0.1421374349999999 -Cu10C4O24_2_4814.vasp,Cu10C4O24,-3.42023430631579,0.3673419931578898 -Ta3Cr2C1Br4N3_1_17956.vasp,Ta3Cr2C1Br4N3,-5.011559153846154,0.2319961691025511 -As2Se2S1_164_1300.vasp,As2Se2S1,-2.689632862,0.2208821241666643 -Ru2Se1I1Br3_1_15351.vasp,Ru2Se1I1Br3,-1.3694496328571428,0.3760765392618997 -Mn1Bi1Se1Br2N1_1_10649.vasp,Mn1Bi1Se1Br2N1,-2.1768380933333336,0.3422624420833275 -Ga2Ge2S2_164_6363.vasp,Ga2Ge2S2,-2.903277063333333,-0.2751341916666687 -Ni2Sb2Te6_162_13619.vasp,Ni2Sb2Te6,-1.048764356,0.2019968935714263 -Mn2Br6_162_11034.vasp,Mn2Br6,-0.94882397125,0.159524585 -Zr1Ta2Ni1Te1Se1Br1Cl1_1_21457.vasp,Zr1Ta2Ni1Te1Se1Br1Cl1,-3.03150879625,0.7868633804947784 -V2I6_189_20101.vasp,V2I6,-0.8393951975,0.211835065 -Be3C1_99_2276.vasp,Be3C1,-3.8311685425,-0.2273026162499998 -Hf2I6_162_7523.vasp,Hf2I6,-1.88334288125,0.4177746949999998 -Al2Fe2Te5_156_839.vasp,Al2Fe2Te5,-1.6926985833333332,0.1598709578240725 -Ta2Cl10_2_17687.vasp,Ta2Cl10,-2.6560016066666665,0.1071181950000004 -Ti2C1O2_164_18910.vasp,Ti2C1O2,-7.400541042,0.0142579573333181 -Co2Mo2Cl2O8_129_3931.vasp,Co2Mo2Cl2O8,-3.925591052857143,0.1344973743452308 -Ho2Se2F2_164_8148.vasp,Ho2Se2F2,-4.0184588733333335,0.2463907252777737 -Pt2Br2_164_14600.vasp,Pt2Br2,-0.97270983,0.4569587806249999 -Sb2Se2Cl2_59_15691.vasp,Sb2Se2Cl2,-1.8916121266666668,0.2308549608333332 -Mn4C3_164_11430.vasp,Mn4C3,-4.231716002857143,0.4809770414285679 -Li1Co1P2S6_149_9674.vasp,Li1Co1P2S6,-3.201734243,0.0521821324427066 -B2F2_164_1666.vasp,B2F2,-4.353930235,0.1784613311111069 -As2Se2_164_1302.vasp,As2Se2,-2.3284482675,0.378436671666664 -Cr1Ru1Cl2O2_25_4237.vasp,Cr1Ru1Cl2O2,-3.4054254383333333,0.0891330193055476 -Sn2Te2Cl2_59_16889.vasp,Sn2Te2Cl2,-1.3187216816666667,-0.2555180830555565 -Ca1Cu2S8_89_2829.vasp,Ca1Cu2S8,-2.071419729090909,0.149522273049238 -Ga2Cl6_189_6321.vasp,Ga2Cl6,-1.398166965,0.2280158425 -Ag2I1Br3_1_309.vasp,Ag2I1Br3,0.2782095066666666,0.18062926 -Sb1Au3O4_156_15435.vasp,Sb1Au3O4,-1.63381122875,0.9850397710416652 -Ta2F10_51_17719.vasp,Ta2F10,-4.1187336750000005,0.248222624166666 -Hg2Bi2I2O4_11_7936.vasp,Hg2Bi2I2O4,-1.700492762,0.1300239126372505 -Li2H4C2S6_7_9936.vasp,Li2H4C2S6,-3.520659324285714,0.2389955747767814 -Zr1In1S2_156_21314.vasp,Zr1In1S2,-3.2202597475,0.7097305931249975 -Mo1I5_6_11519.vasp,Mo1I5,-0.208515745,0.2806916184027773 -Bi6Pd3_147_2673.vasp,Bi6Pd3,-1.0685386855555556,-0.3149609755555556 -Sb1H2S2_164_15458.vasp,Sb1H2S2,-2.693564952,0.3324591976666645 -K2Cd4S8Br6_31_9054.vasp,K2Cd4S8Br6,-0.9139223845,0.2556495416875003 -Li4Zn2Ge2_164_10253.vasp,Li4Zn2Ge2,-1.1647937325,0.299478645 -Ru2Se4_127_15363.vasp,Ru2Se4,-2.201643933333333,0.9929565266666668 -Nb4Ni2S10_13_13100.vasp,Nb4Ni2S10,-4.009746963125,-0.2615628723437493 -Ga1Cl2_164_6149.vasp,Ga1Cl2,-1.3638818966666666,0.3594885750000001 -Ca1Cl2_164_2818.vasp,Ca1Cl2,-2.3455334066666667,-0.1173022683333333 -Sb2Te6Ru2_162_15743.vasp,Sb2Te6Ru2,-1.966353167,0.3790153330999981 -Zn2Ni4S10_6_21127.vasp,Zn2Ni4S10,-1.30103575125,0.3809692906249978 -Sb2H2Pb2O6_7_15581.vasp,Sb2H2Pb2O6,-3.6927481575,0.2819562570833298 -K4S4N4O12_57_9504.vasp,K4S4N4O12,-3.6758155345833337,0.5620815342881873 -Cu2Sb4Se3I2_6_5283.vasp,Cu2Sb4Se3I2,-1.2456763400000002,0.5498517440909055 -Ru2Se2Cl2_59_15354.vasp,Ru2Se2Cl2,-2.260706083333333,0.3891465402777747 -Sn2Au2O6_51_16732.vasp,Sn2Au2O6,-2.742690643,0.3570201229999989 -Sc2Te2_164_16179.vasp,Sc2Te2,-2.4132212475,0.7936202225 -Bi1Sb2Te6Au1_143_2385.vasp,Bi1Sb2Te6Au1,-1.142151393,0.2430600920624996 -Pb2S2I2_59_14275.vasp,Pb2S2I2,-1.2743390933333334,-0.2533942620486131 -Cd2S4_14_3550.vasp,Cd2S4,-1.00265206,0.3642520139583322 -Cs2B2Te2H6O6_4_4662.vasp,Cs2B2Te2H6O6,-3.409330619444445,0.934220648499993 -Li1Ni2Te2Br1_6_9771.vasp,Li1Ni2Te2Br1,-0.7482886350000001,0.407941874999999 -Ge3Sb4_5_6921.vasp,Ge3Sb4,-2.312875892857143,-0.0767051550000021 -H2Pd2S4_11_7015.vasp,H2Pd2S4,-2.5074691975,0.10119444625 -Hf2B1S2_164_7439.vasp,Hf2B1S2,-5.701620388,0.0307006364999948 -Fe2Sb2P4O16_11_5950.vasp,Fe2Sb2P4O16,-4.930391883333333,-0.0129414808333327 -Os2O2_129_13858.vasp,Os2O2,-3.6439136175,1.955281865 -Ge1F4_123_6665.vasp,Ge1F4,-2.762267488,-0.0135826219999999 -V1Rh1Br2O2_6_19905.vasp,V1Rh1Br2O2,-3.0460796683333338,0.2064138058333255 -Li6H2S10_11_10265.vasp,Li6H2S10,-2.9295102094444445,0.028545553402775 -Pr4C2Cl5_47_14559.vasp,Pr4C2Cl5,-3.98864925,0.1327200381818185 -Sc1Br2_187_15914.vasp,Sc1Br2,-2.2512236766666667,0.1364896416666643 -Yb2Se2F2_164_20886.vasp,Yb2Se2F2,-4.036455325,-0.5306942377777795 -Li4Te4O8_13_10231.vasp,Li4Te4O8,-3.58288739625,0.301006997447917 -Li2S4Br2F8_1_10055.vasp,Li2S4Br2F8,-1.941357510625,0.2715771728320312 -Ba2N1_164_2030.vasp,Ba2N1,-2.483683016666667,0.1992939866666665 -Nb3Cu1Br6O2_1_12969.vasp,Nb3Cu1Br6O2,-3.072213518333333,0.4392668703240668 -W1Se1S1_156_20454.vasp,W1Se1S1,-3.932584373333333,0.1666794266666671 -In6Se6_2_8711.vasp,In6Se6,-1.8072245708333328,0.0961907916666668 -Cs2C2Se2O6F6_1_4676.vasp,Cs2C2Se2O6F6,-3.274062221111111,0.4590829484722194 -Ta1As2_164_17506.vasp,Ta1As2,-4.668809503333333,0.4784597233333336 -In2Te2S8F2_11_8626.vasp,In2Te2S8F2,-1.989751967142857,0.4667203492559486 -Ge2P6_164_6816.vasp,Ge2P6,-3.54414866875,0.0335922262499996 -Ni2P4S6I4_11_13570.vasp,Ni2P4S6I4,-1.90735583375,0.2199805276636839 -Zr2Br2_129_21525.vasp,Zr2Br2,-2.4127971325,0.6605291549999999 -Pt2I2N1O1_25_14626.vasp,Pt2I2N1O1,-1.8922936566666664,0.3252879402083257 -Cd2Au2Se2Cl2_26_3462.vasp,Cd2Au2Se2Cl2,-0.0372291125,0.10443532122 -Ga2Se2_164_6477.vasp,Ga2Se2,-2.3566248825,0.0608326250000001 -K2Hg3Ge2S8_3_9171.vasp,K2Hg3Ge2S8,-1.527944962,0.22259717 -Zr1H2_187_21305.vasp,Zr1H2,-3.563133823333333,0.501563023333333 -Li1Al1Te2_156_9649.vasp,Li1Al1Te2,-2.16996274,0.0950678775 -Nb1Br4_123_12483.vasp,Nb1Br4,-1.801931868,0.3396741469999997 -Ge2I2_164_6782.vasp,Ge2I2,-1.30392043,0.1534424187499999 -V1Se2_187_19932.vasp,V1Se2,-3.0775828633333333,0.0690208549999997 -Mg1Au2F12_115_10337.vasp,Mg1Au2F12,-1.0473945353333334,-0.0130283376666667 -Ta4Pt6S10_31_18094.vasp,Ta4Pt6S10,-3.8561238705,0.0998669212083295 -Mo3O8_12_11717.vasp,Mo3O8,-5.090781574545455,0.1187910143939348 -Sn2O2F4_1_16796.vasp,Sn2O2F4,-3.06091814,0.1714754906249995 -V2B1S2_164_19993.vasp,V2B1S2,-4.372298218,0.2135654606666626 -Sc2Cl2O2_59_16061.vasp,Sc2Cl2O2,-4.951829981666667,0.0346953566666661 -Bi2Se2Cl2_59_2539.vasp,Bi2Se2Cl2,-1.6953350716666666,0.1175227483333332 -Er2Co2Ge4_129_5555.vasp,Er2Co2Ge4,-2.83071203375,0.3898631271874968 -Hg1H4C2N4Cl2_10_7872.vasp,Hg1H4C2N4Cl2,-4.165303865384615,0.1718612050640982 -Sn2Se2S8_7_16881.vasp,Sn2Se2S8,-2.2076490525,0.3562115061805533 -Bi8O12_51_2687.vasp,Bi8O12,-3.385671395,0.4723228329999998 -As2F10_51_1208.vasp,As2F10,-1.8247590291666669,0.5617204641666667 -Ag2Hg2Te2Cl2_26_306.vasp,Ag2Hg2Te2Cl2,0.24087066,0.1088045202083333 -Mn1Bi1Se1I2_1_10650.vasp,Mn1Bi1Se1I2,-1.04705505,0.1148886181428533 -Sb2Te8Pd3_164_15744.vasp,Sb2Te8Pd3,-1.1829031184615384,0.4638786106153829 -Zn2Cr4O10_59_21064.vasp,Zn2Cr4O10,-4.15384547875,0.0102038376562496 -Nb2Se1S1_8_12868.vasp,Nb2Se1S1,-4.8839942575,-0.2608290130625057 -Cr4C3Cl2_164_4594.vasp,Cr4C3Cl2,-4.249442734444445,0.1984052387036919 -Sr2Tl1Hg1Au1S5_99_17339.vasp,Sr2Tl1Hg1Au1S5,-1.556158209,0.2250483919374977 -In1Cu1P2O6_149_8227.vasp,In1Cu1P2O6,-4.354467492,0.4516154329999893 -Ca2C4_51_2973.vasp,Ca2C4,-4.996373226666667,0.5819263716666612 -P4Pd4S4_13_14101.vasp,P4Pd4S4,-2.891355959166667,0.3364245699999997 -Si2Sb2S6_12_16440.vasp,Si2Sb2S6,-3.056306078,0.3593296321666651 -Tl16S12_14_19191.vasp,Tl16S12,-1.2919529682142856,0.1578619816964265 -Cr2F2_164_4380.vasp,Cr2F2,-3.056409335,0.708071667499997 -Tl2P2Se6_147_19482.vasp,Tl2P2Se6,-2.049319119,0.2203239708541646 -Ni1C6F6_47_13301.vasp,Ni1C6F6,-4.246978248461539,0.4432722665384532 -Cu2Pt1C6N8_164_5230.vasp,Cu2Pt1C6N8,-5.056882654705882,0.7043299717646991 -Ga1Cu1S2Cl3_1_6169.vasp,Ga1Cu1S2Cl3,-1.4886449542857143,0.203844110386901 -Zr1Ti1Ir1S1I2O1_1_21471.vasp,Zr1Ti1Ir1S1I2O1,-3.840836068571429,0.4208726235714239 -Rb2B12H12O12_12_14771.vasp,Rb2B12H12O12,-5.065731862631579,0.6362024406232585 -Zr3Br2N1_47_21751.vasp,Zr3Br2N1,-4.179011191666667,0.3067264499999953 -Mn1Nb1S1I2O2_1_10808.vasp,Mn1Nb1S1I2O2,-3.50645447,0.3090218720535672 -V1Br2_115_19787.vasp,V1Br2,-1.5035663033333335,0.2427485299999998 -Tm1Mg5_8_19666.vasp,Tm1Mg5,-0.0779483033333333,0.3068644977222221 -As1Se1Cl1_156_1176.vasp,As1Se1Cl1,-2.0863229333333333,0.0694267349999979 -V2S2_164_20164.vasp,V2S2,-3.74463736,-0.0892248315625043 -Li1Mo2Cl6O2_47_9750.vasp,Li1Mo2Cl6O2,-2.739349108181818,0.0586965436363586 -Cu1Ge1I1Br1_1_4881.vasp,Cu1Ge1I1Br1,-0.72792291,0.7430293912500001 -B2Os1_123_1691.vasp,B2Os1,-4.741070616666667,1.4130064750000004 -Fe2P1Se2_187_5901.vasp,Fe2P1Se2,-2.0836647580000003,0.4686519514999998 -Mg2Ni2P4O14_2_10490.vasp,Mg2Ni2P4O14,-4.849036337272728,0.0406410249999978 -In2P6_164_8524.vasp,In2P6,-2.94903357375,-0.1000817512499998 -Rh2F2_12_15189.vasp,Rh2F2,-1.67241686,0.830443870833331 -Ni1H4C2N4Cl2_47_13335.vasp,Ni1H4C2N4Cl2,-4.353663156923077,0.3193839254487094 -Cd2Te2H4O8_31_3591.vasp,Cd2Te2H4O8,-3.3822220875,0.0699428215104165 -Sb2Pd1_123_15649.vasp,Sb2Pd1,-1.8825106333333328,0.3717661583333336 -Te2As1Pd2_187_18346.vasp,Te2As1Pd2,-1.673627418,0.1104903474999985 -Te1Pd1_156_18327.vasp,Te1Pd1,-0.69811785,0.48340550625 -K2B2H6N8O2_51_8988.vasp,K2B2H6N8O2,-4.788423516,-1.4924774530833331 -Cu4Te2O12_14_5478.vasp,Cu4Te2O12,-2.7534529194444444,0.3096227011111087 -Rb2Hg4S8Cl6_31_14873.vasp,Rb2Hg4S8Cl6,-0.8369126785000001,0.2633447345625 -Tl2Au2Se1S3I3Br1_1_19368.vasp,Tl2Au2Se1S3I3Br1,-0.6073745991666667,0.2335427488020825 -Ta3B2O2_187_17942.vasp,Ta3B2O2,-7.290589602857143,0.2374856375714138 -Dy2Te6_129_5537.vasp,Dy2Te6,-2.4117120325,0.054553045 -Cu2Te4Br2_4_5350.vasp,Cu2Te4Br2,-0.63166730875,0.1284630318749999 -Te3O9_157_18551.vasp,Te3O9,-2.8812085641666667,0.7956860048958334 -Ca2B8H40N4_30_2948.vasp,Ca2B8H40N4,-4.1303904650000005,0.7371305666666619 -In1Pt5F2_38_8323.vasp,In1Pt5F2,-1.367280775,1.5151116637499975 -Cd1H2O2_156_3336.vasp,Cd1H2O2,-2.9700087440000003,0.2332372119999997 -Ta2Cl4O2_47_17693.vasp,Ta2Cl4O2,-4.67172240625,0.0464941487499999 -Cd2Bi2S4Br2_11_3470.vasp,Cd2Bi2S4Br2,-1.2052535880000002,0.1945195045 -Pd2O4F2_11_14447.vasp,Pd2O4F2,-2.03766980625,0.4301680952083309 -Sn1Se1_156_16693.vasp,Sn1Se1,-1.84781238,-0.2715340049999999 -Na2Te2H2_4_12317.vasp,Na2Te2H2,-1.8874338,0.6402495036666631 -K2C8O4F4_3_9038.vasp,K2C8O4F4,-5.168158188888889,0.1653222708333249 -V3Mo1Cl3O5_1_20275.vasp,V3Mo1Cl3O5,-4.272723543333333,0.0016352856249983 -Cd1C6Br2F4_10_3297.vasp,Cd1C6Br2F4,-3.808426959230769,0.5929784978846082 -Al2Fe1_123_832.vasp,Al2Fe1,-1.7669029733333332,0.3189485566666665 -Sb4Te6_13_15837.vasp,Sb4Te6,-1.491935723,0.354369951 -Cr2Sn2Se6_162_4512.vasp,Cr2Sn2Se6,-2.213240356,0.0771623629999974 -Zn2Te1Se1N1_1_21176.vasp,Zn2Te1Se1N1,-1.234779138,0.2010446720000002 -Na2Mg2Sb2_129_12204.vasp,Na2Mg2Sb2,-0.8555987266666666,0.5737821516666667 -Li1W2Br6O2_47_9811.vasp,Li1W2Br6O2,-2.922649239090909,-0.5268482014803972 -Zr1Ge3Te1Se4Cl3_1_21303.vasp,Zr1Ge3Te1Se4Cl3,-2.5261054883333336,0.278653694340272 -Hf2Br2N2_164_7444.vasp,Hf2Br2N2,-5.977169969999999,0.0243406533333345 -Nb3Pd3S14_6_12993.vasp,Nb3Pd3S14,-3.4225990685,-0.032739760984377 -Sr1I2_115_17058.vasp,Sr1I2,-0.9468477466666668,0.3391956122222221 -Ga2Se2_123_6475.vasp,Ga2Se2,-1.8633270275,0.55413048 -Ru2F2_129_15313.vasp,Ru2F2,-1.5331228625,1.5802814999999972 -Sr2Ge4F12_2_17226.vasp,Sr2Ge4F12,-3.330507996111111,-0.3799428400000021 -Nd2N2O10_4_13241.vasp,Nd2N2O10,-5.008758832857143,0.1538979606547571 -Bi2S1O2_164_2508.vasp,Bi2S1O2,-3.178814336,-0.1223442183333357 -Nb1Bi2_187_12476.vasp,Nb1Bi2,-2.69511672,-0.2247926066666687 -As4S6_81_1363.vasp,As4S6,-2.869897804,0.6495971245000001 -Ta1Cl1F1_156_17523.vasp,Ta1Cl1F1,-3.93519522,0.6691180166666595 -Bi2Br8_1_2437.vasp,Bi2Br8,-0.574564542,0.217209373 -Ca2S6F8_26_3109.vasp,Ca2S6F8,-2.305027834375,0.5889804921484373 -Zr1Sb2S6F2_164_21426.vasp,Zr1Sb2S6F2,-2.776443985454545,0.687538350369311 -Nb4Pb2O12_26_13120.vasp,Nb4Pb2O12,-5.980450011666666,0.2644719750000002 -Si2Te6P2_147_16461.vasp,Si2Te6P2,-2.217438365,0.4842497526666666 -Sb4Te4Pd4_13_15834.vasp,Sb4Te4Pd4,-1.580556445,0.416976225 -Y1F2_164_20630.vasp,Y1F2,-4.407960496666667,0.68572971055555 -Ni3Se5Br2_1_13725.vasp,Ni3Se5Br2,-0.894454896,0.2229761041666668 -Li1C12_191_9666.vasp,Li1C12,-7.61144758,0.0148363530769231 -Zr1Sc1S1I2O1_6_21435.vasp,Zr1Sc1S1I2O1,-3.73895273,0.2027149618749966 -Li2Cu1P1_187_9882.vasp,Li2Cu1P1,-2.02600967,0.2324552975 -Li10Si2_164_9633.vasp,Li10Si2,-2.0483204241666666,0.1527814200555535 -Hf2Te1S1I1_1_7626.vasp,Hf2Te1S1I1,-3.971455264,0.0137959687500002 -In2Cl2O2_59_8399.vasp,In2Cl2O2,-2.8588940666666667,0.036511691666667 -Cu3Se3_187_5390.vasp,Cu3Se3,-0.6428964383333333,0.2677757475000001 -Er2Cl6_59_5553.vasp,Er2Cl6,-2.87086763625,0.0421210762499999 -Co2C2I2_59_3883.vasp,Co2C2I2,-2.583375903333333,0.6728249638888861 -La1Se3_99_9572.vasp,La1Se3,-2.997148575,0.373357242708333 -Hf1Ge2W2Se1S2I6_1_7185.vasp,Hf1Ge2W2Se1S2I6,-2.07518472,0.5968539007142775 -Ga1Pd1S2Br2_1_6236.vasp,Ga1Pd1S2Br2,-1.5557759016666666,0.2994324295833294 -V2B1O2_12_19991.vasp,V2B1O2,-5.300357412,0.6683972221111059 -Pr2Te4Se2_129_14554.vasp,Pr2Te4Se2,-2.91173710125,0.0507556012500001 -Rh2Br2_164_15175.vasp,Rh2Br2,-0.81643082,0.9194901533333318 -Ge2Cl2O3_8_6766.vasp,Ge2Cl2O3,-3.637830888571429,0.0934749889285671 -Y1Ag1Br2O2_1_20602.vasp,Y1Ag1Br2O2,-3.0234574750000003,0.2934248866666662 -K1I1O3_143_8906.vasp,K1I1O3,-2.378364806,0.2938314562499999 -Nb2Ni1Te6_12_12778.vasp,Nb2Ni1Te6,-2.443624476666667,0.1174149165740714 -Cu2F2_67_5092.vasp,Cu2F2,-0.675906755,0.693995565 -Zr3B2_187_21747.vasp,Zr3B2,-4.8810449,0.323738343999997 -Cu2N6O18_11_5192.vasp,Cu2N6O18,-4.074196124999999,0.0463951225961467 -Ga4S4I4_14_6564.vasp,Ga4S4I4,-1.8492677358333331,0.046094629999998 -K1Sn1Te2_156_8942.vasp,K1Sn1Te2,-0.9315858025,-0.0221623371875011 -Li2Pb1_187_10041.vasp,Li2Pb1,-1.2941876333333333,-0.0144409583333333 -Cr1Ga2O4_164_4176.vasp,Cr1Ga2O4,-4.487193352857143,0.0038416833035674 -Hf3N2Cl2_187_7719.vasp,Hf3N2Cl2,-6.078165198571428,0.1719544610714241 -Ga4P4S16_14_6560.vasp,Ga4P4S16,-3.07188552625,0.0719439362499998 -Ca3Ge1_25_3179.vasp,Ca3Ge1,-0.400734945,0.88078751 -Sc2I2N2_59_16091.vasp,Sc2I2N2,-3.92586313,0.1561677819444411 -Si4S4_57_16508.vasp,Si4S4,-3.5834248025,0.0750293749999998 -Mg1Al2S4_156_10333.vasp,Mg1Al2S4,-3.26028778,0.301392187857143 -Nb1Cl2_164_12488.vasp,Nb1Cl2,-3.22841287,0.2290123507142805 -Si1Br2_164_16321.vasp,Si1Br2,-1.6239418600000002,0.1803412883333307 -Sb8Cl2O11_2_15863.vasp,Sb8Cl2O11,-3.850327754761905,0.1051024146428569 -Rh1F2_164_15151.vasp,Rh1F2,-1.69933315,0.6104995044444423 -Zr1Ni1Br6_5_21371.vasp,Zr1Ni1Br6,-1.3644200225,0.009775621875 -Zn2Cl2O2_59_21056.vasp,Zn2Cl2O2,-1.2304947316666668,0.3631847792708301 -Mg6Ti6_51_10598.vasp,Mg6Ti6,-2.806310065,0.5923413608333337 -Ni2Ir1S5_38_13530.vasp,Ni2Ir1S5,-2.08878548,0.1251949628906227 -Ba4Sb4H4Se8_14_2179.vasp,Ba4Sb4H4Se8,-2.5751019765,0.5329012180416618 -Ca1Bi2O5_38_2807.vasp,Ca1Bi2O5,-3.5760854,0.4161922141015626 -Ge2As2H2O6_7_6732.vasp,Ge2As2H2O6,-4.166441638333334,0.3321752206249952 -V2Te2N1_164_20209.vasp,V2Te2N1,-3.846905696,0.0530701326666664 -Bi2B2_129_2426.vasp,Bi2B2,-2.5342930475,0.7796335991666667 -Fe1B4C2I2F4_47_5625.vasp,Fe1B4C2I2F4,-3.7076751315384615,0.3320734058333223 -Ce1Pb5_47_3651.vasp,Ce1Pb5,-0.98419604,0.6570958283333319 -Y2In2Br2_164_20751.vasp,Y2In2Br2,-2.6035265483333334,0.1999297741666639 -Te2Pd2O6_11_18470.vasp,Te2Pd2O6,-3.122857654,0.1250660987500005 -Ni3Pd1Se5S3_1_13712.vasp,Ni3Pd1Se5S3,-1.5185433216666666,0.2200389505208333 -Tb1Ge2_123_18172.vasp,Tb1Ge2,-2.760971023333333,0.6606241244444413 -Mn2Bi1_164_10999.vasp,Mn2Bi1,0.4587215,1.986053233505746 -Al2Co1Te4_164_801.vasp,Al2Co1Te4,-1.9684879657142853,0.2144932266156418 -B3H2W4O2_164_1728.vasp,B3H2W4O2,-5.477033826363637,0.6169468422727166 -Nb1Au1S2Cl2_1_12467.vasp,Nb1Au1S2Cl2,-2.4946659233333333,0.2311329276515082 -Ru1Pt1S2I2_25_15280.vasp,Ru1Pt1S2I2,-1.8711955133333331,0.1938540433333333 -Ti2I6_162_18960.vasp,Ti2I6,-1.89593898375,0.1580521750000001 -Li4Cr4O14_2_10177.vasp,Li4Cr4O14,-4.704672658636364,-0.1557499461174286 -Ti2Tl2Cu2Te6_11_19050.vasp,Ti2Tl2Cu2Te6,-1.940789951666667,0.1428123524999998 -Pt2S8_11_14671.vasp,Pt2S8,-2.444837051,0.1894037007500002 -Hg1H4C2I2N4_6_7871.vasp,Hg1H4C2I2N4,-3.981508739230769,0.0604730869871754 -Sn1I2_187_16651.vasp,Sn1I2,-0.5540381600000001,0.161531931111111 -W12O24_1_20407.vasp,W12O24,-5.706718638333333,0.5609811303061161 -Pd2C8_191_14409.vasp,Pd2C8,-6.397768386,0.4248813100000002 -Ca2Cu1S2Br2_123_2997.vasp,Ca2Cu1S2Br2,-1.9096115328571428,0.1484644090476153 -K4P4S8_14_9495.vasp,K4P4S8,-2.66301633125,0.1625546082986081 -Sn2P4O14_2_16828.vasp,Sn2P4O14,-5.135905267,0.2068600714999995 -V1F5_47_19828.vasp,V1F5,-2.59985868,0.5137007647916665 -In2Ag1Ge1Te1Br1_1_8372.vasp,In2Ag1Ge1Te1Br1,-0.9680506383333332,0.1100296922916638 -V2Mo2O10_85_20104.vasp,V2Mo2O10,-5.227945570714286,0.1355845235714237 -Hf1Au1Se1S1Cl2_1_7113.vasp,Hf1Au1Se1S1Cl2,-2.4656759,0.4389713697916644 -Cs1O2_115_4645.vasp,Cs1O2,-1.07119798,1.6148500933333336 -Na2Cl2O4_113_12051.vasp,Na2Cl2O4,-2.35043594125,0.0194677818749984 -Sr5Tm1_1_17491.vasp,Sr5Tm1,0.577135965,1.1921693741666652 -Rb2Hg4Se2I6O6_31_14878.vasp,Rb2Hg4Se2I6O6,-1.119937385,0.0431970986666633 -V2Fe1Te4_164_20064.vasp,V2Fe1Te4,-2.0290471285714284,0.0941970836904744 -Mn3S1Cl2O1_8_11399.vasp,Mn3S1Cl2O1,-2.596937151428571,0.0441200018226558 -Zr1Ta1Nb2Br2N3Cl2O1_1_21448.vasp,Zr1Ta1Nb2Br2N3Cl2O1,-5.440823064166668,0.0940116818981353 -Al4S6_1_1087.vasp,Al4S6,-3.585128777,0.1541649827500002 -B2F6_1_1668.vasp,B2F6,-4.1396780125,-0.4215833125000001 -Ta1Mn1S2Br2_1_17566.vasp,Ta1Mn1S2Br2,-3.32167344,0.0300265495833333 -W2Se2_25_20551.vasp,W2Se2,-3.37282999,0.92514208 -Ta4O8_2_18081.vasp,Ta4O8,-7.133919168333333,0.221151520333327 -Ta1Mn1Br1Cl1O1_8_17561.vasp,Ta1Mn1Br1Cl1O1,-3.630211678,0.3585782984090842 -K1Pb1O2_156_8925.vasp,K1Pb1O2,-2.498848305,0.4612624153125 -Bi6C2_164_2664.vasp,Bi6C2,-1.88502661375,0.494205735 -Nb2Si2Bi2_129_12890.vasp,Nb2Si2Bi2,-4.0148995266666665,0.0620606153968221 -Pt2I2O2_59_14628.vasp,Pt2I2O2,-1.6005431116666669,0.3624252779166645 -Na2B2C8O16_51_11970.vasp,Na2B2C8O16,-6.043377306785715,0.1370647878968145 -Hf2S2_164_7575.vasp,Hf2S2,-5.002249565,0.4029071050000006 -In1P2Au1S6_149_8298.vasp,In1P2Au1S6,-2.618790492,0.0917459310624972 -Co2S4F2_2_3985.vasp,Co2S4F2,-2.49039800125,0.2155779833333305 -Hf3C2_187_7698.vasp,Hf3C2,-7.060741108,0.5330444196000012 -Zr2As1Se2_164_21502.vasp,Zr2As1Se2,-4.315943492000001,0.0589620230000003 -Na1Al1Sb2S6_5_11816.vasp,Na1Al1Sb2S6,-2.659443829,0.3215726529374978 -Nb1Se2_115_12578.vasp,Nb1Se2,-3.63909704,0.6167719675000005 -Pb1S1_156_14198.vasp,Pb1S1,-1.98478563,-1.3116521849999998 -Sc2S6_59_16142.vasp,Sc2S6,-3.622729405,0.2254995575781251 -Li2Fe4O4F6_8_9919.vasp,Li2Fe4O4F6,-3.0785851375,0.1819481624999906 -Sb12O8F20_13_15417.vasp,Sb12O8F20,-3.2559367207500003,0.0905290967499992 -Ag4Te4Cl4_14_574.vasp,Ag4Te4Cl4,-0.38267911,0.1652271145833329 -Ni1F2_115_13314.vasp,Ni1F2,-1.4110108933333334,-0.1394651050000002 -Nb4C3S2F2_164_13046.vasp,Nb4C3S2F2,-5.73379161,0.4811845017777725 -Sn1Ge2As2Se2S1I1Cl5_1_16638.vasp,Sn1Ge2As2Se2S1I1Cl5,-1.9697217564285716,0.1015726773511861 -Hf1Sb1P1_156_7286.vasp,Hf1Sb1P1,-4.143625356666667,0.7715938216666621 -Na3Ti10S20_8_12359.vasp,Na3Ti10S20,-4.827034487878787,-0.0440478757575792 -Rb2Fe4Te6_51_14841.vasp,Rb2Fe4Te6,-0.8118867575,0.7413155391666648 -Ag4S4I4_14_553.vasp,Ag4S4I4,-0.42065077,0.2203286264583327 -Hf3Zr1Se2I6_1_7756.vasp,Hf3Zr1Se2I6,-2.7873738875,0.1480838891666642 -Mn3C2S2F2_187_11365.vasp,Mn3C2S2F2,-3.436843701111111,0.6176928644444407 -V1P2Au1Se6_5_19898.vasp,V1P2Au1Se6,-2.338316529,0.1413821084374981 -Hf3Zr1Cl6O2_1_7749.vasp,Hf3Zr1Cl6O2,-4.218481983333334,0.3607839833333299 -Tc2Se2_129_18237.vasp,Tc2Se2,-5.07573761,0.416172719375 -Hf4B3S2F2_164_7767.vasp,Hf4B3S2F2,-5.07629758909091,0.638773125227261 -Zr2Se2F2_59_21674.vasp,Zr2Se2F2,-4.211140398333334,0.1738671054166616 -Li1Ga1Te6As2_5_9718.vasp,Li1Ga1Te6As2,-1.724044838,0.2594557346666652 -Li6Re6O24_2_10270.vasp,Li6Re6O24,-5.400308953333333,0.1706383830555555 -Fe2Br2O1_164_5817.vasp,Fe2Br2O1,-2.010795038,-0.0794390095833357 -Mg1O2_123_10391.vasp,Mg1O2,-3.6699071166666655,0.0538195854166638 -Nb3N2Cl2_1_12986.vasp,Nb3N2Cl2,-5.437011194285715,0.357131796496592 -Te1W1O1_156_18335.vasp,Te1W1O1,-4.163396643333333,0.4929022168197215 -Cu2Sn2Au2_123_5318.vasp,Cu2Sn2Au2,0.2447275966666666,0.8932811466666661 -K4Li4C4O12_14_9471.vasp,K4Li4C4O12,-4.8482485325,0.1310059841666664 -Nb2Ni2Te6_11_12784.vasp,Nb2Ni2Te6,-2.15480675,0.1146847113333316 -Te2Au2_129_18370.vasp,Te2Au2,-0.0289237325,0.399712915 -Tm2Se2F2_164_19686.vasp,Tm2Se2F2,-3.997558125,0.2398087497222185 -Tl2Sb2S6_1_19519.vasp,Tl2Sb2S6,-1.99468898,0.3330658633749972 -Ni2Br2O2_59_13479.vasp,Ni2Br2O2,-1.4274960633333331,-0.2124185300000007 -Ta2Ir2Se8_11_17770.vasp,Ta2Ir2Se8,-3.772684965,-0.0773959975000044 -Sc2Br6_162_16046.vasp,Sc2Br6,-2.27930299875,0.0489102849999998 -Mn1V1I2N2_6_10923.vasp,Mn1V1I2N2,-3.3411547916666664,0.0114322162499949 -Ta2C1S2_164_17679.vasp,Ta2C1S2,-6.664662286,0.0262867179999997 -Ga3Co1_187_6526.vasp,Ga3Co1,-1.1486142,1.0097326343750002 -Co2Sb2O7_6_3996.vasp,Co2Sb2O7,-3.706510048181818,0.3665925031818156 -Hf1I2N1_156_7197.vasp,Hf1I2N1,-3.792412145,0.3593240742187497 -Ca2S4F12_53_3107.vasp,Ca2S4F12,-2.266241051111111,0.4339088529861086 -Cd1H4C2I2N4_6_3345.vasp,Cd1H4C2I2N4,-4.047077865384615,0.1993397296581122 -As8Se8O4_1_1406.vasp,As8Se8O4,-3.056171842,0.176257358666664 -Li2H6Pt1S6_147_9953.vasp,Li2H6Pt1S6,-3.0638650373333336,0.0737798579999999 -Ni2I2O2_59_13522.vasp,Ni2I2O2,-1.286296468333333,-0.1961542277083343 -Ag4Se4I4_14_564.vasp,Ag4Se4I4,-0.2359643425,0.3017163052777773 -Pb2I8_1_14256.vasp,Pb2I8,-0.1313841,0.1484109724166667 -Ti3H2Se2N2_6_19090.vasp,Ti3H2Se2N2,-5.4683827888888885,0.5954492483333276 -In2Se1S1Br1_1_8574.vasp,In2Se1S1Br1,-1.723593718,0.1577553265000003 -Cu2O2F2_59_5196.vasp,Cu2O2F2,-1.62206972,0.4102530920833314 -Zn1Ge1Br2O2_6_20941.vasp,Zn1Ge1Br2O2,-2.330201613333333,0.2084842372916666 -Ta1Ti1C1Cl2_8_17633.vasp,Ta1Ti1C1Cl2,-5.60203631,0.0724496112499881 -Mn2Mo2S8Cl2_129_11145.vasp,Mn2Mo2S8Cl2,-2.4168201135714287,0.6762101029464228 -Sn6P6_12_16998.vasp,Sn6P6,-2.572587925833333,0.2088200972916665 -Bi2Pd1_123_2502.vasp,Bi2Pd1,-1.2177219833333333,-0.4641442733333332 -Hf1I2_164_7200.vasp,Hf1I2,-2.18787251,0.5293157366666636 -Cu8P32Se12Br8_57_5502.vasp,Cu8P32Se12Br8,-2.6271751893333337,0.0552485324999993 -Zr4C3_164_21816.vasp,Zr4C3,-6.35797437,0.3760147971428571 -K1V4O10_38_8955.vasp,K1V4O10,-5.292804546,0.0974427639999948 -Ni2Te1Ir1O8_1_13653.vasp,Ni2Te1Ir1O8,-3.146642665,0.1284542952083307 -Hf1Zr1Pd2S8_1_7389.vasp,Hf1Zr1Pd2S8,-3.5240729666666666,0.2138351672916643 -Ti1Br1Cl1_156_18747.vasp,Ti1Br1Cl1,-3.359392026666667,0.0836891370833334 -Tl2O3_164_19472.vasp,Tl2O3,-2.503574912,0.2065902665000001 -V2Te6_11_20223.vasp,V2Te6,-1.98894447375,0.1794327587499999 -Cd1In1S2Br2_1_3373.vasp,Cd1In1S2Br2,-0.985842055,0.2744182652604146 -Zr3B2Te2F2_187_21745.vasp,Zr3B2Te2F2,-3.760872544444444,0.7696836277777671 -Al2Se2Br2_31_959.vasp,Al2Se2Br2,-2.3978671533333333,0.0379058716666667 -V1Ge2I1Br1O2_6_19845.vasp,V1Ge2I1Br1O2,-3.1371861057142856,0.151579431809518 -Cr2O6_59_4444.vasp,Cr2O6,-4.50414405,-0.0513562101562499 -Tb2Ge1_164_18196.vasp,Tb2Ge1,-2.42559629,0.7689044152083335 -Cd4Cl8_55_3625.vasp,Cd4Cl8,-0.03915812,0.3652362333333333 -Cs2Cd4S2I6O6_31_4688.vasp,Cs2Cd4S2I6O6,-1.5959745455,0.0680235369375007 -Ca3Fe2Br2O5_123_3173.vasp,Ca3Fe2Br2O5,-3.5347741441666667,-0.0026678166666702 -Ba2As1_164_1900.vasp,Ba2As1,-1.5861181033333331,0.3209233999999984 -Mg1I2O6_1_10376.vasp,Mg1I2O6,-2.9292027177777777,0.2063769152777776 -Sn4Se1S5I3Cl1_1_16969.vasp,Sn4Se1S5I3Cl1,-1.6757297392857142,0.1951801964434484 -Fe3Te1Rh1Se1I1Br1_6_6071.vasp,Fe3Te1Rh1Se1I1Br1,-1.04462605375,0.4284039609374998 -Ge2I6_1_6783.vasp,Ge2I6,-0.65651395375,0.1736242135937488 -Al2Cr1Rh1Br2Cl2O4_3_813.vasp,Al2Cr1Rh1Br2Cl2O4,-3.645616841666667,0.1269080088425833 -Cr2O2_123_4435.vasp,Cr2O2,-3.6528735775,1.4724254224999953 -Fe2N1F2_164_5881.vasp,Fe2N1F2,-3.04416812,0.3764370280000002 -Sb4Pt4S4_13_15810.vasp,Sb4Pt4S4,-2.425857333333333,0.2455502549999995 -Na2H8C2O8_2_12133.vasp,Na2H8C2O8,-4.5063878895,0.242963851562483 -Sn2P2_164_16824.vasp,Sn2P2,-2.56941501,0.2119930131249998 -Y2I6_189_20749.vasp,Y2I6,-2.01000553875,0.1665210799999998 -Na2Cd4S2Br6O6_31_12025.vasp,Na2Cd4S2Br6O6,-1.9180974895,0.1523967906875004 -Ta2Ni2Te6_11_17799.vasp,Ta2Ni2Te6,-2.393672434,0.0932193399999974 -Sr4Cu4Te2O14_26_17430.vasp,Sr4Cu4Te2O14,-3.2438136416666663,0.4017816992187403 -Li2Ta1_187_10076.vasp,Li2Ta1,-3.0558252866666664,0.9085261277777748 -Au2Br2_51_1454.vasp,Au2Br2,0.56064565,0.26165573375 -Mn2Bi2Cl2O4_10_11002.vasp,Mn2Bi2Cl2O4,-3.136312115,0.2187301530919508 -Sb8I4O10_14_15865.vasp,Sb8I4O10,-3.2992001104545454,0.1036406998863634 -Er1Bi2_21_5543.vasp,Er1Bi2,-1.6824262366666665,-0.2968632683333343 -Sb2Se2_164_15698.vasp,Sb2Se2,-1.9983936875,0.3493840162499979 -Fe2Sb2Te4F2_26_5964.vasp,Fe2Sb2Te4F2,-1.633858215,0.4321127303333291 -Cr1O1F2_47_4219.vasp,Cr1O1F2,-3.6790728075,-0.163990081718753 -Mo2S2I2_59_11665.vasp,Mo2S2I2,-2.2122939083333333,0.3381677311111113 -Fe4Se8_54_6089.vasp,Fe4Se8,-1.883099345,0.4187594133333332 -Ba2Tl1Cd1Cu1O5_99_2080.vasp,Ba2Tl1Cd1Cu1O5,-2.629789142,0.4364705152083276 -V2Cl10_51_20029.vasp,V2Cl10,-1.421288690833333,0.2247704199999982 -Ca1Ag1Br4_6_2790.vasp,Ca1Ag1Br4,-0.77474929,0.1572313183333333 -Bi1Cl1O1_156_2324.vasp,Bi1Cl1O1,-2.4173489333333333,0.5509464900000003 -Ni2I4_2_13526.vasp,Ni2I4,0.4794629316666667,0.0501520349999999 -P4C2_113_14075.vasp,P4C2,-5.124580291666667,0.2781921683333288 -K4Ge2Se6_2_9447.vasp,K4Ge2Se6,-1.8592997,0.0951589524999998 -Ba1B2Se6_8_1807.vasp,Ba1B2Se6,-2.603604724444444,0.5912542500000004 -La1Bi2O4_164_9562.vasp,La1Bi2O4,-4.430816881428571,0.1805961226785695 -In2Co2O5_187_8411.vasp,In2Co2O5,-3.4189575533333336,0.1435269868055519 -Sb6Pd3_157_15856.vasp,Sb6Pd3,-1.8228301744444444,0.4314466172222224 -Ag2Au2I8_1_175.vasp,Ag2Au2I8,0.507274135,0.0895721850000003 -V2As2Se6_157_19982.vasp,V2As2Se6,-2.699415552,0.2713006546666638 -Ta2Sn2Bi2_129_17888.vasp,Ta2Sn2Bi2,-2.91584743,0.3497532163333252 -Ga2S3_164_6450.vasp,Ga2S3,-2.826172238,0.094945252 -In4Ga2Bi2S12_11_8674.vasp,In4Ga2Bi2S12,-2.486257889,0.0510253859166647 -Co2N2Cl2_59_3936.vasp,Co2N2Cl2,-3.0205763766666665,-0.3400138866666691 -Ta4Pd4S8_53_18088.vasp,Ta4Pd4S8,-3.9752207625,0.3091722041249984 -K4Nb2O4F10_12_9481.vasp,K4Nb2O4F10,-3.698561827,-0.0198936510937504 -Mn2In2Te5_187_11128.vasp,Mn2In2Te5,-1.582848968888889,0.0349175445976993 -Ag2I2Br4_1_311.vasp,Ag2I2Br4,0.2866146125,0.1882573049999999 -Al4Cl4_28_1067.vasp,Al4Cl4,-1.65474076125,0.6762593629166647 -V4S10_59_20355.vasp,V4S10,-3.5157198864285717,0.1014588962499967 -Pb2Se2_164_14293.vasp,Pb2Se2,-1.7051477225,0.2448164209374999 -Ru2I1Br1O3_8_15319.vasp,Ru2I1Br1O3,-2.9557087857142856,0.4988548020153032 -Li2C2S2N2_31_9850.vasp,Li2C2S2N2,-5.1116815875,-0.1433684271614639 -Bi6Pd3_157_2674.vasp,Bi6Pd3,-1.1624023033333333,-0.4088245933333332 -Cs2Cd4Br6O8_31_4682.vasp,Cs2Cd4Br6O8,-1.2413502635,0.3424311345416669 -Cs1Ge1Te2_156_4642.vasp,Cs1Ge1Te2,-1.2331198375,0.2041573193749987 -Cu4S4F4_14_5454.vasp,Cu4S4F4,-1.4265748866666668,0.1124064971180533 -Pd2I2_164_14432.vasp,Pd2I2,-0.30889997,0.3214934656249999 -Al6Te6_2_1109.vasp,Al6Te6,-2.21539654,0.0903556475 -Ag2S2I2N2_31_379.vasp,Ag2S2I2N2,-1.53635863375,0.3278135692187502 -Zr3Pd1Br6N2_1_21778.vasp,Zr3Pd1Br6N2,-3.48082543,0.3119899687499979 -Cd1H4C4N2F2_10_3352.vasp,Cd1H4C4N2F2,-4.794852264615384,0.2105988313461403 -Cr4Pb8F28_1_4620.vasp,Cr4Pb8F28,-2.67599871225,0.2315156487499998 -Ir2S2F2_59_8816.vasp,Ir2S2F2,-2.924860225,0.2518013568518498 -Ag2C2S2I2_31_223.vasp,Ag2C2S2I2,-1.8087455225,0.7010703773437501 -As2H2Pb2O6_7_1213.vasp,As2H2Pb2O6,-3.855180480833333,0.2806783627777787 -Ti1Ni1Te1Br1_8_18815.vasp,Ti1Ni1Te1Br1,-2.2309981625,0.2560895191666649 -Nb2Se4F4_12_12884.vasp,Nb2Se4F4,-3.701250686,0.1254904225333293 -Bi2_164_2587.vasp,Bi2,-1.02538662,-0.5585186249999999 -Li1Te6P2Pd1_5_9797.vasp,Li1Te6P2Pd1,-1.901184387,-0.0823766048333348 -Nb1Cl2_115_12487.vasp,Nb1Cl2,-2.887583613333333,0.5698416073809474 -Al1Se1_123_735.vasp,Al1Se1,-2.241626855,0.7067321900000003 -Tl2Ga2H8_3_19422.vasp,Tl2Ga2H8,-2.23156985,1.132700149999997 -Hg3C2S6_5_8055.vasp,Hg3C2S6,-1.8852067518181816,0.4169373734659007 -Pd2Cl2O2_59_14410.vasp,Pd2Cl2O2,-1.749756173333333,0.1392595397222222 -Hf1Mn1Nb1Cr1Te2Se2_6_7221.vasp,Hf1Mn1Nb1Cr1Te2Se2,-3.268200575,0.6828946932614947 -Ca2Ti4O10_59_3135.vasp,Ca2Ti4O10,-6.326571701875,0.3701184571874993 -Nb2Te1I1O1_1_12900.vasp,Nb2Te1I1O1,-4.040125586,0.0562980971249876 -Ni1Pb2C6N6_12_13394.vasp,Ni1Pb2C6N6,-5.460365155333333,0.7330162193333226 -K2B2S2N2_31_8996.vasp,K2B2S2N2,-3.81471142125,0.9995276033333332 -Zr3B2H2_187_21738.vasp,Zr3B2H2,-4.791692901428571,0.0904336321428489 -B1W2O2_164_1642.vasp,B1W2O2,-5.932165064,0.891284598462585 -Ta2Co4Te2S2_51_17711.vasp,Ta2Co4Te2S2,-3.477168987,0.0426763137499996 -Sc3H2C2_187_16205.vasp,Sc3H2C2,-4.682165154285714,0.1906241712211934 -Pd2Cl4_2_14417.vasp,Pd2Cl4,-0.6017930383333333,0.2736730261111111 -Ti2N2Cl2_59_18968.vasp,Ti2N2Cl2,-5.922951721666667,-0.3487082956250038 -Ge2P1Se6_162_6798.vasp,Ge2P1Se6,-2.4996765444444446,0.1516011752546271 -Sn2S2Cl2_59_16837.vasp,Sn2S2Cl2,-1.914126665,0.1817708474999997 -Ba2Cl4_129_1950.vasp,Ba2Cl4,-2.457058228333333,0.2671371550000003 -Zn2Cu2Ge4O12_13_21069.vasp,Zn2Cu2Ge4O12,-3.5610254025000003,0.3162726178333299 -In2I2_164_8477.vasp,In2I2,-0.573506385,0.424424385 -Ge2Se2Cl2_59_6866.vasp,Ge2Se2Cl2,-2.1269174166666667,0.1805962782638869 -Ge3Bi2O9_174_6905.vasp,Ge3Bi2O9,-4.290964502142857,0.2641134233035676 -Nb2P1H1S1_8_12803.vasp,Nb2P1H1S1,-4.750374914,0.549143920000001 -Cd2Bi2O4F2_11_3468.vasp,Cd2Bi2O4F2,-2.471933541,0.106932676333334 -Ca2N2O6F2_59_3071.vasp,Ca2N2O6F2,-4.424776580833334,0.1296107714583327 -Ti1Fe2I2O2_1_18779.vasp,Ti1Fe2I2O2,-2.9600544728571427,0.4651622853571373 -Hg3P1_191_8063.vasp,Hg3P1,1.5095843825,0.6799867340948276 -Hf1Se1Br1N1_8_7302.vasp,Hf1Se1Br1N1,-4.551601235,0.5265288708333339 -Ge3Ir1_187_6909.vasp,Ge3Ir1,-2.575557415,0.8225707758333307 -Bi2Te6As2_143_2578.vasp,Bi2Te6As2,-1.589889411,0.2505252614999999 -Na2Fe2Sb2_129_12080.vasp,Na2Fe2Sb2,-0.8409425483333334,0.955238585416665 -Al2Ni1O4_164_896.vasp,Al2Ni1O4,-4.683035891428572,0.2125886628571395 -Fe2O2_187_5891.vasp,Fe2O2,-2.9238563025,0.6218690360416645 -Hf1F2_187_7154.vasp,Hf1F2,-4.6160078533333335,0.4979825241666611 -Mo2Se2Br2_59_11683.vasp,Mo2Se2Br2,-2.1462034016666665,0.3079941820833336 -Mn1In1S2I1Br1_6_10776.vasp,Mn1In1S2I1Br1,-1.7686576150000002,0.1449937309027727 -Ba2Ni3_164_2038.vasp,Ba2Ni3,0.670675548,0.07706888 -Al6S6_2_1106.vasp,Al6S6,-3.4095662625000003,0.1105086814583304 -Ir2F2_129_8782.vasp,Ir2F2,-1.0321106375,2.2699741833333307 -Sb2P4H2O12_4_15631.vasp,Sb2P4H2O12,-4.5755333685,0.5948052684833289 -V2Sb2P4O16_11_20171.vasp,V2Sb2P4O16,-5.3282152370833336,0.2062614587499993 -Tc4S4O24F4_14_18254.vasp,Tc4S4O24F4,-4.698039049444445,0.0282085802777771 -Hf3Br1N2Cl1_8_7690.vasp,Hf3Br1N2Cl1,-5.845285127142858,0.2985464033035629 -Sr1O2_123_17070.vasp,Sr1O2,-3.844934156666667,0.2257508099999996 -Si2Se2_8_16452.vasp,Si2Se2,-2.9676683075,0.1239377926562502 -K2Hg4Se2I6O6_31_9188.vasp,K2Hg4Se2I6O6,-1.115436952,0.0452062551666633 -Sm2Ga4Co2_47_16571.vasp,Sm2Ga4Co2,-1.97620084,0.3710969162500002 -Co2Sb2Se4Br2_10_4003.vasp,Co2Sb2Se4Br2,-1.771205426,0.3418410171999977 -In1Au1S1I2Br1_1_8197.vasp,In1Au1S1I2Br1,-0.297710705,0.4327435158333326 -Sb2N2_6_15610.vasp,Sb2N2,-4.20008074,-0.2914218924999996 -C2I8_1_2750.vasp,C2I8,-0.599162964,0.7190853435 -Mo3S4Br2_1_11724.vasp,Mo3S4Br2,-2.7736954944444445,0.358044232499997 -Lu2Br6_162_10303.vasp,Lu2Br6,-2.26637274125,0.0766113712499998 -Cd2S2Br2_1_3542.vasp,Cd2S2Br2,-0.568737265,0.1246567073958314 -Bi1Te2_187_2409.vasp,Bi1Te2,-1.136610653333333,0.4314819177777762 -Au2Se1_191_1540.vasp,Au2Se1,0.3532412666666666,1.3030990166666658 -Re1S2_187_15020.vasp,Re1S2,-4.569980506666666,0.3700903175000007 -In1Ge1Se3_143_8266.vasp,In1Ge1Se3,-1.864775358,0.51478107 -Nb4B3S2_164_13039.vasp,Nb4B3S2,-6.180441246666667,-0.0394583200000049 -In2Ni1Se4_164_8491.vasp,In2Ni1Se4,-1.6336290414285717,0.0112198642857126 -Bi2Cl2O2_129_2442.vasp,Bi2Cl2O2,-2.8981195250000003,0.0701758983333333 -Rb2Os2S2N2Cl10_11_14913.vasp,Rb2Os2S2N2Cl10,-2.295991825555556,-0.0261120668750071 -Li4Ga4Br16_14_10190.vasp,Li4Ga4Br16,-1.5209682974999998,0.0751225241666668 -Nb2S1Br2_12_12832.vasp,Nb2S1Br2,-3.699455222,0.1870197136857048 -V2Se2Br2_59_20180.vasp,V2Se2Br2,-2.4165920066666664,0.1846061558333278 -Sb2Te2O10F2_1_15718.vasp,Sb2Te2O10F2,-3.28039128625,0.4364731932161394 -Li2Zr1H6S6_1_10141.vasp,Li2Zr1H6S6,-3.4551492526666667,0.1132408121666668 -Zn2Br2_12_21054.vasp,Zn2Br2,0.470684045,0.0160517578125 -Na4Br2_51_12372.vasp,Na4Br2,-0.9347786583333332,-0.1353216483333339 -Ga2Fe1_123_6354.vasp,Ga2Fe1,-1.071006363333333,0.4764686002083323 -Zr3Br1N1Cl1O1_8_21750.vasp,Zr3Br1N1Cl1O1,-4.807234214285714,0.3930374502380834 -Sr2Au1O2F2_38_17126.vasp,Sr2Au1O2F2,-2.849040727142857,0.6008955635714233 -V2Sb2O10_129_20169.vasp,V2Sb2O10,-4.698691706428571,0.2685478614285719 -Co1Ni1S2_8_3790.vasp,Co1Ni1S2,-1.85744324,0.1827635642857127 -Hg2Te6P2_147_8041.vasp,Hg2Te6P2,-0.92802203,0.3195046609999986 -Ag2Cl2O2_59_240.vasp,Ag2Cl2O2,-0.8506940833333334,0.354573133749999 -Ca4Bi2_59_3207.vasp,Ca4Bi2,-0.3831451183333333,0.5730318216666668 -Al2H10N4F4_10_856.vasp,Al2H10N4F4,-4.481739246,0.0875305272499935 -Ba2Co3O8_123_1958.vasp,Ba2Co3O8,-3.744485276153846,0.3619042812499935 -Tl1Ag1P2S6_149_19202.vasp,Tl1Ag1P2S6,-2.472209276,0.1230167006666661 -Cu2Hg2Se2F2_26_5160.vasp,Cu2Hg2Se2F2,-0.31145556,0.12588384625 -N2Cl6_12_11779.vasp,N2Cl6,-0.8407177225,0.6951763200000001 -Al1S1_156_722.vasp,Al1S1,-2.69433937,0.825735573958331 -Nb2Pd4S6_11_12817.vasp,Nb2Pd4S6,-3.1409531975,0.2057461997701093 -H4Au2C4O8_14_7054.vasp,H4Au2C4O8,-4.452381838888889,0.6973469412036977 -Mg4In8Se16_2_10578.vasp,Mg4In8Se16,-2.0837891278571425,0.0381421035714288 -Sc2Se2Cl2_59_16155.vasp,Sc2Se2Cl2,-3.414617858333333,0.0633016088888855 -Y1Cl2O1_1_20619.vasp,Y1Cl2O1,-4.0189637625,0.3499185793750001 -In4Sb20_26_8688.vasp,In4Sb20,-1.7639702441666667,0.0123680658333318 -Sb6Rh2S4_11_15859.vasp,Sb6Rh2S4,-2.5054447925,0.3214620883333305 -Mn1W1S2Cl2_1_10933.vasp,Mn1W1S2Cl2,-3.010934123333333,0.123266483333333 -Ta2S4I4_12_17862.vasp,Ta2S4I4,-2.983035309,0.0913680417500004 -Au4Se4Cl4O12_2_1598.vasp,Au4Se4Cl4O12,-2.257973837083333,0.0970632470833332 -As1F5_47_1148.vasp,As1F5,-1.784544005,0.6019354883333334 -Pt2Br6_162_14606.vasp,Pt2Br6,-0.46248454,0.19795853 -Pd2Se2_187_14493.vasp,Pd2Se2,-1.1495486875,0.5773070249999999 -Mn2Ga2Se5_187_11079.vasp,Mn2Ga2Se5,-2.4763261533333334,-0.1295736197126462 -Ba2P4H8O8_50_2044.vasp,Ba2P4H8O8,-4.6360558509090914,0.0936722173484803 -Ta2Se2_123_17877.vasp,Ta2Se2,-4.9979481075,0.4059691649999948 -Cu2H4C6Br2_2_5123.vasp,Cu2H4C6Br2,-4.167900952142857,0.4485223135714263 -Cd1Pd1Se2_1_3403.vasp,Cd1Pd1Se2,-0.6239392675,0.04775479625 -Ti2Te2_123_19046.vasp,Ti2Te2,-4.04593592,0.3844138953124956 -Li2Nd1As2_164_10018.vasp,Li2Nd1As2,-3.089724308,0.3391963380000002 -Ca2Mn2Ge2_129_3065.vasp,Ca2Mn2Ge2,-1.7221833716666666,0.4064286709195386 -Nb2V2Te10_11_12939.vasp,Nb2V2Te10,-2.6195239100000003,0.0613975212499974 -Sb1Cl2_164_15446.vasp,Sb1Cl2,-1.1514374833333334,0.4527293691666649 -Li9V6O12F6_6_10289.vasp,Li9V6O12F6,-4.6858259409090905,0.035847914545446 -K2S2N2Cl6O6_1_9329.vasp,K2S2N2Cl6O6,-2.759592153333333,0.1534759380555533 -Na2P2H8S2O16_4_12258.vasp,Na2P2H8S2O16,-4.599554525666666,0.0447647960000008 -Nb3S2I1Br1_1_13003.vasp,Nb3S2I1Br1,-3.817867791428572,0.2712037035147316 -Cu2S2Br2N2_31_5242.vasp,Cu2S2Br2N2,-1.9346428875,0.206449687529761 -Hf2Sn4_59_7624.vasp,Hf2Sn4,-2.697732998333333,0.4299268650000001 -V1Bi2_164_19781.vasp,V1Bi2,-1.7352932533333334,0.205658196666665 -Nb2Pd4Se6_11_12820.vasp,Nb2Pd4Se6,-2.7311014458333336,0.138764564089906 -Te2Ir1_164_18386.vasp,Te2Ir1,-2.2017146233333333,0.2417877366666667 -Co2Sb1S2_187_3992.vasp,Co2Sb1S2,-2.419194452,0.2807020940900001 -Ta4Sn2Te8_55_18118.vasp,Ta4Sn2Te8,-3.346985175,-0.3523994164285722 -Li2Ta2F12_4_10078.vasp,Li2Ta2F12,-4.242455138125,0.0593367418749997 -Nb4Br1Cl3O4_1_13042.vasp,Nb4Br1Cl3O4,-5.10531487,-0.0151182660764004 -Cu2B4H4Br2N2_2_5033.vasp,Cu2B4H4Br2N2,-3.667495355,0.5296255318571342 -Ta1Br1F1_156_17517.vasp,Ta1Br1F1,-3.5473779800000003,0.7930045268809403 -Nb3B2H2_187_12947.vasp,Nb3B2H2,-5.617813921428572,0.316121437142852 -Li1Fe1As2O6_5_9693.vasp,Li1Fe1As2O6,-3.96467868,0.3577210030999922 -Tl2N2Cl2_59_19456.vasp,Tl2N2Cl2,-1.6072138833333334,1.3347820133333332 -Bi1Se2_115_2394.vasp,Bi1Se2,-1.47374492,0.6678462638888867 -Co2P2O8_31_3959.vasp,Co2P2O8,-4.72490338,0.0362947996874969 -K2Hg4Te2O6F6_31_9197.vasp,K2Hg4Te2O6F6,-1.58520451,0.3158702847249979 -Ni2P2Pd2_129_13562.vasp,Ni2P2Pd2,-1.6042916816666668,0.1493419424166633 -Ca3H2O6_12_3180.vasp,Ca3H2O6,-4.285444275454545,0.0561975136363597 -Mn1Sn1Te1I1_1_10898.vasp,Mn1Sn1Te1I1,-1.041164125,-0.4931527527801725 -Rb2H2S6N2_1_14847.vasp,Rb2H2S6N2,-2.8202843491666667,0.288182499283851 -Co2Cl6_191_3893.vasp,Co2Cl6,-0.8465753575,0.55618170375 -Te2Rh2I2_11_18502.vasp,Te2Rh2I2,-1.39368928,0.0946393266666665 -In2Ge2Se6_162_8452.vasp,In2Ge2Se6,-2.333884225,0.045672203 -Mn2As2Br2O4_10_10963.vasp,Mn2As2Br2O4,-3.332053373,0.0496322630131505 -Fe2P2O6_12_5910.vasp,Fe2P2O6,-4.734563657000001,0.2932042949999998 -Zn1H1O1F1_156_20950.vasp,Zn1H1O1F1,-2.6567161225,0.1314790668749998 -Rb1Se2_25_14751.vasp,Rb1Se2,-0.8037248533333333,0.9791689295833296 -Sr2Ag1S2Cl2_38_17105.vasp,Sr2Ag1S2Cl2,-1.978193077142857,0.2223277770982098 -Y1Hf1I1Cl5_1_20638.vasp,Y1Hf1I1Cl5,-3.052687525,0.1402186699999941 -Nb1Te2Ir1Se1Br1_1_12599.vasp,Nb1Te2Ir1Se1Br1,-2.731623875,0.3235945865327282 -Al1Br1_99_614.vasp,Al1Br1,-1.043057495,0.8720082233333317 -Ga5S4Br4Cl2_1_6583.vasp,Ga5S4Br4Cl2,-1.8468235073333328,0.2326219648333315 -Mg3Sn3_156_10569.vasp,Mg3Sn3,-0.653033785,-1.30270050125 -V1S1Cl2_47_19909.vasp,V1S1Cl2,-2.394845185,0.2645557582291644 -K2Nb2Cl12_2_9259.vasp,K2Nb2Cl12,-2.226088571875,0.03053475875 -Os2S2_164_13872.vasp,Os2S2,-3.897996655,0.7977034518749999 -Mo2F2_164_11605.vasp,Mo2F2,-3.1376754875,0.5254268787499967 -Sn1I1Br1O1_6_16648.vasp,Sn1I1Br1O1,-1.6894573625,0.2835444105208327 -Ca2P4S12_2_3096.vasp,Ca2P4S12,-3.1557761372222224,0.1473385271874936 -Cd1Au1Cl4_1_3269.vasp,Cd1Au1Cl4,-0.1257584633333333,0.116654688125 -P2Cl6_31_13970.vasp,P2Cl6,-1.72790134625,0.0633635462499986 -Nd2I6_59_13240.vasp,Nd2I6,-1.6998726175,0.0060591612499998 -Ba1Cr4O8_162_1822.vasp,Ba1Cr4O8,-4.764640391538462,0.2914283681410148 -Ti1Pt1Cl2O2_1_18832.vasp,Ti1Pt1Cl2O2,-3.828762965,0.3621843283333339 -Ta2O2F4_1_17809.vasp,Ta2O2F4,-5.37997608125,0.269567980749992 -Rb2Cl2O6_11_14834.vasp,Rb2Cl2O6,-2.461797257,0.0950904404999975 -Tc2P6_31_18235.vasp,Tc2P6,-5.13928757375,0.494460863125 -Au2Cl2_164_1468.vasp,Au2Cl2,0.2122569275,0.0634901837499999 -Mn2P2S6_162_11195.vasp,Mn2P2S6,-3.2335608880000004,0.2056430208472153 -In1Cu1Ni1Br1Cl1O3_1_8226.vasp,In1Cu1Ni1Br1Cl1O3,-1.988753155,0.02447714234375 -Te2Os2I2_59_18426.vasp,Te2Os2I2,-1.9417216616666664,0.1384243866666648 -Te2Os2Cl2_59_18424.vasp,Te2Os2Cl2,-2.2365710733333333,0.2254089171874973 -Tc6I18_164_18261.vasp,Tc6I18,-1.8211877054166663,0.0092916845833335 -Pb2_12_14300.vasp,Pb2,-0.171601225,1.156584895 -H2Ru1O2_164_7025.vasp,H2Ru1O2,-4.157435016,0.3352004071666671 -Fe2F8_1_5849.vasp,Fe2F8,-1.826428354,0.061756707 -Ti2P1S2_164_18979.vasp,Ti2P1S2,-5.515187516,-0.1321307375000047 -Ga1S1_156_6258.vasp,Ga1S1,-2.111069005,0.7446574899999998 -As4Pd2_11_1349.vasp,As4Pd2,-2.396618736666667,0.4860314699999994 -Sc1Bi1Sb3Se4S1Br4_1_15907.vasp,Sc1Bi1Sb3Se4S1Br4,-2.0285411714285715,0.2116649391071386 -V2Sn2S6_162_20197.vasp,V2Sn2S6,-3.085920281,-0.0416921389999993 -V2Te2S10F4_2_20212.vasp,V2Te2S10F4,-2.499494485555556,0.2761611448379604 -Ho2S6_51_8146.vasp,Ho2S6,-3.64035927625,0.2004750086718749 -Hf1Zn1Te2O1_8_7374.vasp,Hf1Zn1Te2O1,-3.044952008,0.4648464565000007 -Ca2Cu1Se2F2_38_3004.vasp,Ca2Cu1Se2F2,-2.071442524285714,0.5219028795238054 -Ag2As4S12_10_164.vasp,Ag2As4S12,-2.171800945555556,0.4604794991319392 -Hf2N1O2_164_7539.vasp,Hf2N1O2,-7.669663798,0.2753621185000012 -Sc2H2C1S2_164_16078.vasp,Sc2H2C1S2,-4.265369284285714,0.4738854681632563 -In1Cu1As2Se6_149_8225.vasp,In1Cu1As2Se6,-1.8988977,0.2486326538333313 -Ta3Ni4Sb3Te4I1_1_17975.vasp,Ta3Ni4Sb3Te4I1,-2.1954283066666664,0.2374221439285649 -In2F2_164_8421.vasp,In2F2,-1.9246835475,0.5066564058333314 -Al1Cl2_115_628.vasp,Al1Cl2,-1.7153372166666667,0.5846693272222201 -Sn1O2_115_16660.vasp,Sn1O2,-3.811158386666667,0.5500609083333328 -As4S6_1_1364.vasp,As4S6,-2.859180875,0.6603140535 -Zr2Al4C5_164_21500.vasp,Zr2Al4C5,-5.684095825454545,0.1633559418181756 -Ce1Te2_8_3661.vasp,Ce1Te2,-2.40544076,0.6111421058333337 -Cu2H4I2N6_2_5126.vasp,Cu2H4I2N6,-3.530465007857143,0.0645378273214256 -Ni1H4C6N2Cl2_25_13349.vasp,Ni1H4C6N2Cl2,-5.054541954,0.452906567999993 -Cu4Hg4S4Cl4_51_5423.vasp,Cu4Hg4S4Cl4,-0.288334795,0.1120612695833334 -Ba4Ce2_12_2147.vasp,Ba4Ce2,-0.2771308916666666,0.7444611499999991 -Al6Se6_2_1107.vasp,Al6Se6,-2.879017201666666,0.0693418433333334 -Co4Pb12_127_4084.vasp,Co4Pb12,-0.783399963125,0.631464399375 -Ca2H8I4O4_53_3040.vasp,Ca2H8I4O4,-3.2702068194444447,0.0494117765897414 -Sb2Se1O2_164_15687.vasp,Sb2Se1O2,-3.26426835,0.3609319049999975 -Ga1Ni1Pd1Au1I3Br1O4_1_6213.vasp,Ga1Ni1Pd1Au1I3Br1O4,-1.4671425100000002,0.3083038905092533 -Li2As2Pd2_12_9826.vasp,Li2As2Pd2,-2.175468678333333,-0.0601645666666688 -Cr2Br10_2_4329.vasp,Cr2Br10,-0.762813565,-0.0908009558333338 -P2F6_31_13975.vasp,P2F6,-3.19398569,0.1372152625000002 -Rb2Br2F8_35_14782.vasp,Rb2Br2F8,-0.9283867916666666,0.4873105691666668 -K4Nd4S8O32_14_9484.vasp,K4Nd4S8O32,-4.7872335970833335,0.1070369087499996 -Hf3Ge1Te5Br3_8_7703.vasp,Hf3Ge1Te5Br3,-3.01762155,0.1063723924999986 -Al4H12O12_1_1071.vasp,Al4H12O12,-4.9134773525,-0.386601841309528 -Al4Sn2Cl12O2_2_1099.vasp,Al4Sn2Cl12O2,-2.66374191,0.0694683417500003 -Hg2P2Se6_147_7983.vasp,Hg2P2Se6,-1.516332188,0.0851402744999998 -Hg2S2Br2_59_7994.vasp,Hg2S2Br2,0.0554201466666666,0.3385936444791649 -Fe2Te2Mo2S12_113_5999.vasp,Fe2Te2Mo2S12,-2.52106052,0.1360826972685159 -Zr1Nb1Se1S1Br2_25_21357.vasp,Zr1Nb1Se1S1Br2,-3.613301703333333,-0.1530306774305612 -Cr2Cl6_162_4354.vasp,Cr2Cl6,-1.62740671375,0.0567332687500001 -Mn1Ga2Te4_156_10731.vasp,Mn1Ga2Te4,-1.5948709185714287,0.2708702276190458 -Cr1P2_164_4232.vasp,Cr1P2,-3.7440983333333335,0.466149521666666 -Na2Se2F2_4_12298.vasp,Na2Se2F2,-1.5925316433333334,0.6415840611111089 -K2B2C2F12_7_8980.vasp,K2B2C2F12,-3.671087073888889,0.2247802191666569 -Pd4Br8_14_14515.vasp,Pd4Br8,-0.4826313383333333,0.088864125 -Cu1Se2_187_4977.vasp,Cu1Se2,-0.9448820966666666,-0.7287920416666666 -Na2Cd4Se2I6O6_31_12038.vasp,Na2Cd4Se2I6O6,-1.4140283185,0.1409151652500001 -Sc1Bi1Cl2O2_6_15905.vasp,Sc1Bi1Cl2O2,-3.88370722,0.0813640036458283 -Tl4H8C12S4_2_19606.vasp,Tl4H8C12S4,-4.783755666071428,0.180137424241069 -Cd2Ag2S2Cl2_26_3442.vasp,Cd2Ag2S2Cl2,-0.33633403125,0.1745681265625 -Fe2Mo2Se2S12_113_5879.vasp,Fe2Mo2Se2S12,-2.514990115,0.223953413009257 -Ti6H4O14_6_19179.vasp,Ti6H4O14,-6.395189492499999,0.129254204236112 -Li2Mg1Te2O8F4_2_9978.vasp,Li2Mg1Te2O8F4,-2.9740602011764707,0.4457708470588168 -Te2Pt2S6_12_18487.vasp,Te2Pt2S6,-2.108379325,0.2858742452499974 -Co1Te2_164_3835.vasp,Co1Te2,-1.5853535033333337,0.0587498044444443 -K2B2H8S8_2_8994.vasp,K2B2H8S8,-3.2799679665,0.0379335296666667 -Ga1As2Au1S6_149_6136.vasp,Ga1As2Au1S6,-2.320096885,0.5031819047187475 -Sn2C2F2_59_16753.vasp,Sn2C2F2,-3.0075723616666665,0.6064384287499994 -In2Br3Cl1_6_8390.vasp,In2Br3Cl1,-1.0253511483333333,0.1017339765625001 -Ir2I2_129_8789.vasp,Ir2I2,-0.7975647825,1.5011531049999982 -Na2S4I2_113_12293.vasp,Na2S4I2,-1.27860667875,0.3265219684375001 -Pt1N1_187_14577.vasp,Pt1N1,-2.84459097,1.60818331125 -Cs2Cd4Se2Br6O6_31_4692.vasp,Cs2Cd4Se2Br6O6,-1.5200024085,0.1983515187499993 -Ni2S6_11_13598.vasp,Ni2S6,-1.91090115375,0.1262779889062476 -N2F2_164_11783.vasp,N2F2,-2.66781073,0.5924461758333306 -Ag1F1_187_51.vasp,Ag1F1,-0.241950005,0.50409715 -Ni2P2O7_10_13561.vasp,Ni2P2O7,-4.32527547,0.0549577049999974 -Na2Cr4S10_31_12065.vasp,Na2Cr4S10,-2.81896796625,0.326361723828125 -Ba3Ni2S5Cl2_123_2123.vasp,Ba3Ni2S5Cl2,-2.3772882008333336,0.116537957942703 -As4Pt4Se4_13_1356.vasp,As4Pt4Se4,-2.535023290833333,0.3006578704166667 -B2Br6_1_1656.vasp,B2Br6,-1.87828763625,0.0308402674999999 -Nb2Te6_59_12930.vasp,Nb2Te6,-2.78879603625,0.1273856751041637 -Mo1Au2S4_1_11493.vasp,Mo1Au2S4,-1.8467166157142856,0.3454991149999975 -Tm2Te6_51_19689.vasp,Tm2Te6,-1.9987581225,-0.4239177162499998 -Mn2H2C1_164_11089.vasp,Mn2H2C1,-3.525543792,0.401327653212642 -Fe2O2F2_47_5888.vasp,Fe2O2F2,-2.9215181666666665,0.0106424712499975 -Sr2Ag1S2Cl2_123_17104.vasp,Sr2Ag1S2Cl2,-1.9586898214285715,0.2418310328124956 -Ag1Te2_187_147.vasp,Ag1Te2,-0.2708579299999999,0.4914922841666667 -W4C3S2_164_20579.vasp,W4C3S2,-6.029794454444445,-0.1199756144444503 -S2O4_59_15386.vasp,S2O4,-2.870638798333333,1.5022387433333335 -Nb2Se4I2_2_12885.vasp,Nb2Se4I2,-2.81617571625,0.311890638437496 -Rb1C2_99_14726.vasp,Rb1C2,-2.82215404,2.2349952983333337 -Mn2H2S4_11_11096.vasp,Mn2H2S4,-3.08838841875,0.0232437059374996 -Pt4S4I2Br2_13_14706.vasp,Pt4S4I2Br2,-1.5905517733333332,0.0814333787499991 -Nb2Br1Cl3_1_12643.vasp,Nb2Br1Cl3,-2.793490635,0.5399056608482116 -P4S6_7_14117.vasp,P4S6,-3.290559726,0.0946904654062472 -Mo4N3F2_164_11749.vasp,Mo4N3F2,-4.614882748888889,0.1664400920370317 -Li2Mn1As2S7Cl3_1_9984.vasp,Li2Mn1As2S7Cl3,-2.499267418666667,0.4590695675347143 -Cu2S2I2_59_5247.vasp,Cu2S2I2,-0.5152361383333334,0.2793357151587293 -Sr2Sn2F8_129_17317.vasp,Sr2Sn2F8,-3.1725090058333336,0.0773888970833331 -Zn4F8_25_21219.vasp,Zn4F8,-1.367602850833333,0.2291093266666666 -Ag2C4Br2N2F4_2_227.vasp,Ag2C4Br2N2F4,-3.66763075,0.1182486319642776 -Ca1Ge2_164_2839.vasp,Ca1Ge2,-1.61612841,0.9893055833333336 -Tl6O9_150_19643.vasp,Tl6O9,-2.463271694,0.2468934845000001 -Ag2H2_129_270.vasp,Ag2H2,-0.82141426,1.229779175 -Sb4S14_4_15813.vasp,Sb4S14,-2.342126140555556,0.3791521702777753 -Tl1Cd1Ga1S4_156_19233.vasp,Tl1Cd1Ga1S4,-1.7636393242857142,0.2133746563392823 -Sb2Te1Se2_156_15708.vasp,Sb2Te1Se2,-2.122275486,0.0768434770000001 -Bi1O2_115_2349.vasp,Bi1O2,-3.1713316166666665,0.5962192292708304 -Mo2S2Br2_59_11662.vasp,Mo2S2Br2,-2.5249085616666664,0.2896417195833336 -Al1Tl1Cd1O4_156_751.vasp,Al1Tl1Cd1O4,-3.2506242685714284,0.3176227815476191 -Pr1I2_187_14532.vasp,Pr1I2,-1.8320888133333333,0.0469367699999998 -Cu1I2_115_4911.vasp,Cu1I2,0.3616202666666666,0.1641226759722223 -Er1Re2O8_1_5545.vasp,Er1Re2O8,-5.913922891818182,-0.2376033045833447 -Co2S6_31_3990.vasp,Co2S6,-2.63834546125,0.3830918861979135 -Pt2I2_39_14630.vasp,Pt2I2,-0.4115097925,0.8179563812499999 -Zn1H1Br1N1_1_20948.vasp,Zn1H1Br1N1,-2.13053678,0.3025009876432269 -Ni1Ag1Se2_156_13252.vasp,Ni1Ag1Se2,-0.5205750275,0.330962351875 -Na2Mn2P2_129_12213.vasp,Na2Mn2P2,-2.512669751666667,-0.1189942750000027 -Cu2I2_164_5172.vasp,Cu2I2,0.2126809375,0.1456376774999995 -Ca1Ga1Ag1S1I2_1_2835.vasp,Ca1Ga1Ag1S1I2,-1.1817038016666668,0.2848096704933303 -Sn1Te1_156_16700.vasp,Sn1Te1,-1.333721055,-1.297993075 -Y1Sc1Nb1I1Br1N1_6_20671.vasp,Y1Sc1Nb1I1Br1N1,-4.10349202,0.4037935091666578 -Ta12O26_51_17500.vasp,Ta12O26,-7.214419038947367,0.1003145944210461 -P4Pd4Se4_13_14102.vasp,P4Pd4Se4,-2.58714552,0.3008198924999998 -Ta4Ni2Se14_11_18066.vasp,Ta4Ni2Se14,-3.3575407515,-0.2147548167222255 -Bi4Br12_14_2603.vasp,Bi4Br12,-0.94108847125,0.050245195 -Tl1Te1_156_19351.vasp,Tl1Te1,-0.29615808,0.6565013012500001 -Y1Sn1I1Cl1O2_6_20677.vasp,Y1Sn1I1Cl1O2,-3.931172378333333,0.2167339990277779 -Bi2O2_129_2482.vasp,Bi2O2,-2.78812151,0.5046850124999986 -Al2Fe1S4_156_827.vasp,Al2Fe1S4,-3.1118961214285714,0.1252465869642838 -Sc2Si6Ni4_129_16167.vasp,Sc2Si6Ni4,-2.6946786491666668,0.357708011874998 -Al4Cd2Cl16_7_1065.vasp,Al4Cd2Cl16,-1.6937921722727274,0.0543227777272725 -Y1Cl2_115_20620.vasp,Y1Cl2,-3.044560763333333,0.5270504413888857 -Cr2Sb4_2_4489.vasp,Cr2Sb4,-2.2403248766666666,1.015714061666664 -Co9Te18_189_4093.vasp,Co9Te18,-1.467156949259259,0.1769463585185184 -Nd2H6Se4O14_4_13238.vasp,Nd2H6Se4O14,-4.4240007765384615,-0.0420101865384656 -Li1Si5Pd1_99_9790.vasp,Li1Si5Pd1,-3.089870812857143,0.0460549249999973 -Al2Sn2Se2_164_994.vasp,Al2Sn2Se2,-2.2025291483333334,-1.1060976133333345 -Sn2As2O6_5_16722.vasp,Sn2As2O6,-3.908834904,0.4170548343333307 -Bi2Cl8_1_2451.vasp,Bi2Cl8,-0.915583074,0.2573067304999997 -Ba2In1Hg1Au1S5_99_2012.vasp,Ba2In1Hg1Au1S5,-1.749441672,0.415432291687498 -As16Br4_10_1124.vasp,As16Br4,-2.6000881805,0.0666201561666648 -Mn2S2Br2_59_11214.vasp,Mn2S2Br2,-2.0842273316666664,0.2375287025000003 -Ga2Fe1S4_156_6348.vasp,Ga2Fe1S4,-2.5705577485714284,0.0821733385714265 -Te6Se2O16_2_18685.vasp,Te6Se2O16,-3.6550421679166663,0.0015606331249999 -Cr12O24_1_4095.vasp,Cr12O24,-4.903489312777777,-0.0854934584027811 -Re2Pb2Cl2O8_31_15071.vasp,Re2Pb2Cl2O8,-4.540390461428571,0.0695046660714249 -Mg1In2S4_164_10381.vasp,Mg1In2S4,-2.5733194228571428,0.0718161653571427 -Bi1H1_1_2337.vasp,Bi1H1,-1.433819775,1.21249409 -In2Sb2O6_149_8564.vasp,In2Sb2O6,-3.733111258,0.4150029618749999 -Cd1In1Ga1S4_156_3370.vasp,Cd1In1Ga1S4,-2.0831694585714287,0.0858844924999997 -Te2Rh2Cl2_59_18499.vasp,Te2Rh2Cl2,-1.7242138383333332,0.1529557716666667 -Zr1Zn1I1Br1O1_6_21493.vasp,Zr1Zn1I1Br1O1,-2.326882698,0.3737845912701609 -Tl1Au1Se1S1_1_19222.vasp,Tl1Au1Se1S1,-0.8100643725,0.264156332304686 -Mn1V1I2O3_8_10924.vasp,Mn1V1I2O3,-3.466738101428572,0.0637164008333239 -N2Cl8_1_11781.vasp,N2Cl8,-1.044898436,0.2244718345000003 -Cu2H8I4O16_14_5152.vasp,Cu2H8I4O16,-3.0858789656666668,0.1582305941944399 -As2S1O2_5_1289.vasp,As2S1O2,-3.672118354,0.4912050034999966 -Nb3C1N1Cl3_6_12958.vasp,Nb3C1N1Cl3,-5.24607992125,0.0996521097499916 -Ba2In1Cu1Hg1O5_99_2010.vasp,Ba2In1Cu1Hg1O5,-2.792006483,0.5340842184999959 -Zr2V1I2N2_12_21730.vasp,Zr2V1I2N2,-4.588802344285715,0.1758278924999938 -Fe1Cl2O8_147_5656.vasp,Fe1Cl2O8,-2.658421449090909,0.1714636595833276 -Ta2B1O2_164_17656.vasp,Ta2B1O2,-7.252244826,0.1297609275999791 -Ge2P1S6_162_6797.vasp,Ge2P1S6,-3.0541269166666667,0.145457855659716 -Ge3W1_191_6924.vasp,Ge3W1,-2.66113824,0.7229702712499999 -Mn1Ag2S3I1Br1_1_10623.vasp,Mn1Ag2S3I1Br1,-1.15139607875,0.325281417734375 -Sr1Bi5O9_1_17029.vasp,Sr1Bi5O9,-3.753595294666667,0.1830051223333297 -Pb2C2F2_59_14230.vasp,Pb2C2F2,-2.4283069216666666,1.8413269416666636 -Sr2F4_51_17217.vasp,Sr2F4,-3.2197260316666667,0.5937906383333336 -Sm4Cl14_11_16592.vasp,Sm4Cl14,-2.485800233888889,0.2208192841666636 -Mn1Ag1Se1S1_8_10618.vasp,Mn1Ag1Se1S1,-1.408836245,0.5320805572916666 -Ce2S2_129_3675.vasp,Ce2S2,-4.2397847675,0.1598969874999998 -Ti2Te2N1_164_19040.vasp,Ti2Te2N1,-5.357792526,-0.0291158409999994 -Hf2C2Cl2_59_7465.vasp,Hf2C2Cl2,-5.361286371666666,0.6368310064583291 -Ca2H8S6_26_3048.vasp,Ca2H8S6,-3.18258253125,-0.0222646693750001 -Sn1Br4_123_16621.vasp,Sn1Br4,-0.548852042,0.2934538554999999 -Co2Te6As2_162_4050.vasp,Co2Te6As2,-1.7934130549999998,0.2150618199999977 -B1Te2Mo1W1_1_1639.vasp,B1Te2Mo1W1,-3.5545108480000005,0.3094399069999998 -Sr2Au1Se2F2_38_17134.vasp,Sr2Au1Se2F2,-1.9683344385714283,0.5847911664285672 -Ge2Sb2O6F2_7_6849.vasp,Ge2Sb2O6F2,-3.9256230908333336,0.3556544603124996 -W4C3Cl2_164_20575.vasp,W4C3Cl2,-5.452169592222223,-0.0330256599382818 -K6Na4Sn2As6_12_9540.vasp,K6Na4Sn2As6,-1.2718656361111111,0.1165284908333332 -Cs2Cd4Te2S6F6_31_4705.vasp,Cs2Cd4Te2S6F6,-1.347266217,0.3269875560277742 -Ta1Te2_115_17628.vasp,Ta1Te2,-3.07543704,0.6724463288888889 -In2Br6_189_8393.vasp,In2Br6,-0.8057541825,0.17657417625 -Nb1Ir1S2Br2_6_12530.vasp,Nb1Ir1S2Br2,-3.172921615,0.0106309908225036 -Ag2As2O4_26_153.vasp,Ag2As2O4,-2.9429665,0.2088808704166622 -Pd4S4I3F1_6_14523.vasp,Pd4S4I3F1,-1.320070975833333,0.1657308045052062 -V1Cr1Te1Se1_25_19810.vasp,V1Cr1Te1Se1,-2.77129381,0.0614559046314048 -Hf3Zr1I1Br3O4_1_7750.vasp,Hf3Zr1I1Br3O4,-4.991579671666667,0.2828504910648086 -Ge6N6_2_6962.vasp,Ge6N6,-4.776574331666667,0.1308690708333335 -Cu4S4F8_14_5456.vasp,Cu4S4F8,-1.414214855,0.2130553648437499 -Cd2H8C12S4N8_11_3515.vasp,Cd2H8C12S4N8,-5.35413423382353,0.1940874710845447 -Sb2Te2_164_15723.vasp,Sb2Te2,-1.5688090975,0.3503734762499979 -Sb1S1I1_156_15489.vasp,Sb1S1I1,-1.5830255666666666,-0.5793744299999999 -Ag2S1Br2_1_372.vasp,Ag2S1Br2,-0.213028632,0.233727427875 -Hf1Ti2Se1S2Br2N1Cl1_1_7340.vasp,Hf1Ti2Se1S2Br2N1Cl1,-4.436607793,0.1942484862708244 -K2Nb1Cu1S4_21_9254.vasp,K2Nb1Cu1S4,-2.731499245,0.1239358456249997 -Sn6As6_2_16980.vasp,Sn6As6,-2.1986590041666667,0.1652438483333332 -Cu2Bi2Te4_26_5044.vasp,Cu2Bi2Te4,-0.79979815125,0.3417934865624999 -As6O12F2_4_1384.vasp,As6O12F2,-3.8264296885,0.384452537 -Zr1Co1H6_5_21281.vasp,Zr1Co1H6,-3.148582585,0.8922895774999999 -Rb2Ru2N2O2F10_11_14929.vasp,Rb2Ru2N2O2F10,-3.0721916505555558,-0.0846660968518639 -Al2Zn1Te4_156_1037.vasp,Al2Zn1Te4,-1.5002093971428572,0.1579085457142857 -Cu2Te4W1_111_5356.vasp,Cu2Te4W1,-1.398347717142857,0.2308831392857124 -K2Cd4S8F6_31_9056.vasp,K2Cd4S8F6,-1.3967381615,0.3907835800624993 -Sn4F8_5_16939.vasp,Sn4F8,-2.602821753333333,0.0834573824999997 -Ag2O1_191_336.vasp,Ag2O1,0.1264792633333333,0.7640727383333333 -Na2Fe1_187_12076.vasp,Na2Fe1,1.0358664733333334,1.9779920533333324 -V2N1O2_164_20111.vasp,V2N1O2,-5.804131474,0.0822631650000005 -Cr1Sb1As1_156_4252.vasp,Cr1Sb1As1,-2.61724596,0.4141762933333305 -Rb2Pb2I6_26_14919.vasp,Rb2Pb2I6,-0.585619173,0.1813233389999999 -Ba2Ag1S2Br2_123_1885.vasp,Ba2Ag1S2Br2,-2.0674812385714287,0.1527201754743276 -Zr2C2Cl2_164_21540.vasp,Zr2C2Cl2,-4.8069163433333335,0.6086355066666598 -Ag1Sb3S6_143_123.vasp,Ag1Sb3S6,-2.129770628,0.3084915059374975 -Si4O8_156_16501.vasp,Si4O8,-6.1536578825,0.2562550308333327 -Mg2Mn2Sn2_129_10478.vasp,Mg2Mn2Sn2,-0.747760125,0.0937108154597684 -Tl1Ag1Sb2Te6_149_19208.vasp,Tl1Ag1Sb2Te6,-0.983478386,0.3630890326666635 -Hf1W1Br2O2_6_7363.vasp,Hf1W1Br2O2,-4.502744236666667,0.6835898372222222 -Y2Cl6_162_20720.vasp,Y2Cl6,-3.39311483125,0.0626776018749999 -Fe2Cu1S2I1Cl1_1_5843.vasp,Fe2Cu1S2I1Cl1,-1.3289367328571429,-0.1473857833928586 -Bi18I4_11_2313.vasp,Bi18I4,-1.0050509804545456,-0.5326348566666672 -Fe3O1F7_156_6058.vasp,Fe3O1F7,-2.4252444572727274,-0.2992073796590935 -Ta2Mn2Te6_11_17773.vasp,Ta2Mn2Te6,-2.900556497,0.0948867115277762 -Bi1F3_187_2331.vasp,Bi1F3,-1.964871695,1.0304341706249998 -Cs4Te16_14_4813.vasp,Cs4Te16,-1.003309386,0.1901909579999998 -Nb2W2O11_164_12940.vasp,Nb2W2O11,-6.358288659333334,-0.2127878954166711 -Li1Ta1Cr1Mo1S2Br2_1_9793.vasp,Li1Ta1Cr1Mo1S2Br2,-3.07061378,0.7855085187499926 -Nb4Cr2S12_14_13065.vasp,Nb4Cr2S12,-4.361580847222222,0.1179310475925883 -Zn1C4N6_115_20907.vasp,Zn1C4N6,-6.239707179090908,-0.1618141525000118 -As8Pb8O20_14_1401.vasp,As8Pb8O20,-3.992684968611112,0.0863897522222223 -In1As2Au1O6_149_8190.vasp,In1As2Au1O6,-3.359402051,0.6964911071249962 -Na2Fe2S4O4_13_12079.vasp,Na2Fe2S4O4,-2.9938451291666666,0.2824397291666627 -Sc4S4I2Br2_35_16259.vasp,Sc4S4I2Br2,-3.3941302516666667,0.04287265833333 -In2Si2S6_162_8602.vasp,In2Si2S6,-3.170525446,0.0700761519999981 -Na2Zn2P2_129_12339.vasp,Na2Zn2P2,-1.125652105,0.1308555166666665 -Tb2Br2_164_18184.vasp,Tb2Br2,-2.1838182825,0.0880425524999981 -Ta2H2N1_164_17747.vasp,Ta2H2N1,-6.0135456220000005,0.3112217516666673 -Hf2Au1I1O3_1_7432.vasp,Hf2Au1I1O3,-4.920993628571429,0.5884783348214198 -K2Sn1As2S6_147_9349.vasp,K2Sn1As2S6,-2.4729676863636363,0.1094801790909092 -Ge2Te2_59_6888.vasp,Ge2Te2,-2.184584675,-0.7213433499999999 -P2H2Se2O10_4_13980.vasp,P2H2Se2O10,-4.544119598125,0.0197103860416609 -Na3Sc1Cl6_10_12358.vasp,Na3Sc1Cl6,-2.292070863,0.1375467024999999 -Hf1Te2_115_7323.vasp,Hf1Te2,-3.15929611,0.588963726666667 -Ga2Co2Se5_164_6336.vasp,Ga2Co2Se5,-2.225528326666667,0.0369229793703658 -Li2Ni2Bi2_12_10024.vasp,Li2Ni2Bi2,-0.7816693866666666,0.8448197172222207 -Cu2As4S3Cl2_6_5018.vasp,Cu2As4S3Cl2,-2.023692311818182,0.1136544045643889 -Zr1Ga1Te2_25_21296.vasp,Zr1Ga1Te2,-2.52170409,0.3581951254166622 -Sn2C2I2_59_16754.vasp,Sn2C2I2,-2.103531795,0.525124473055555 -Cd2Cu4Te6Cl4O16_13_3502.vasp,Cd2Cu4Te6Cl4O16,-2.609072329375,0.07327953453125 -Fe1C4N2Cl2F4_47_5647.vasp,Fe1C4N2Cl2F4,-4.372311985384616,0.0007407267427761 -K2Hg4O8F6_31_9175.vasp,K2Hg4O8F6,-1.414942961,0.348761356041667 -Sc1As2Au1Se6_149_15899.vasp,Sc1As2Au1Se6,-2.2759840010000003,0.264910761666664 -Au1O2_164_1435.vasp,Au1O2,-1.5806821066666668,0.4953055785416638 -Ti2I2N2_59_18953.vasp,Ti2I2N2,-5.311944913333334,-0.2363448260416696 -Al1Ge1Se3_143_667.vasp,Al1Ge1Se3,-2.371402244,0.4662086831666642 -W2Se4_127_20554.vasp,W2Se4,-2.390031963333333,1.0014284066666672 -Ag4Se2_191_559.vasp,Ag4Se2,0.0618757283333333,0.293490915 -Sb2Cl6_164_15570.vasp,Sb2Cl6,-1.408041695,0.1112001299999998 -Sn2Hg1S2Br2_12_16777.vasp,Sn2Hg1S2Br2,-1.1757893657142855,0.1052040526785693 -Cu1Ir1I4O2_8_4912.vasp,Cu1Ir1I4O2,-1.12724233625,0.4450065839583335 -Ag2Sb4Te3F2_6_420.vasp,Ag2Sb4Te3F2,-1.210294509090909,0.5296352948484826 -Hf2O2_10_7549.vasp,Hf2O2,-6.5078057825,0.7989959931818111 -Ag2P4S3F2_6_361.vasp,Ag2P4S3F2,-2.3477901990909094,0.3626621000082289 -P4Se2S12_4_14121.vasp,P4Se2S12,-2.5994294872222223,0.4290144475231449 -Pt1O2_115_14583.vasp,Pt1O2,-2.42891177,1.1187728300000002 -Nb1Zn1Cl2_8_12614.vasp,Nb1Zn1Cl2,-1.758844205,0.279936643825 -Hf1Mo2O8_12_7235.vasp,Hf1Mo2O8,-5.800558171818182,0.081638086363637 -Cu2Te1_191_5328.vasp,Cu2Te1,0.14490534,0.5768931508333326 -Ir1I2_187_8739.vasp,Ir1I2,-0.3369523733333333,0.9909318433333324 -Ge2I8_2_6784.vasp,Ge2I8,-0.4205781509999999,0.17634776275 -Ag1S2_187_114.vasp,Ag1S2,-1.0688300233333334,0.4492842196875 -Cu1Ni3Te3Se5_1_4925.vasp,Cu1Ni3Te3Se5,-0.9811421691666666,0.1961650356944432 -Mn4I14_2_11441.vasp,Mn4I14,-0.1399568461111111,0.2182007100694441 -V2Pb1O2F8_2_20142.vasp,V2Pb1O2F8,-3.6124900176923074,-0.3795611015625103 -Cr3Ru1Cl1O7_1_4576.vasp,Cr3Ru1Cl1O7,-4.282104619166667,0.2216337319878425 -Ho2Cl2O2_164_8132.vasp,Ho2Cl2O2,-5.062346071666666,0.0279519066666669 -Cu2S2_164_5253.vasp,Cu2S2,-1.100444875,0.2619588366666667 -Mn2Sb2Se4Cl2_26_11247.vasp,Mn2Sb2Se4Cl2,-2.0197143090000003,0.1466446254999975 -Rb2Ru2C2Cl8O4_59_14922.vasp,Rb2Ru2C2Cl8O4,-2.8182897122222226,0.3325079167592549 -Cu4N2O12_4_5430.vasp,Cu4N2O12,-3.0740014844444445,0.3154215595833309 -Y3H2C2_187_20796.vasp,Y3H2C2,-5.326100688571429,0.2068941185714174 -Cu2As4Se3F2_6_5023.vasp,Cu2As4Se3F2,-1.926898536363636,-0.1071708080303074 -Ga1Cu1W1S3Br2_8_6181.vasp,Ga1Cu1W1S3Br2,-1.8952526125,0.6852959531250002 -Ge2P2_187_6814.vasp,Ge2P2,-3.6236989425,-0.5142131375000001 -Se2N2_39_16289.vasp,Se2N2,-3.205741665,0.8134096343749999 -W2O2_129_20518.vasp,W2O2,-4.5322261725,1.9229254464795864 -Zn2In2O5_156_21110.vasp,Zn2In2O5,-2.9769492222222222,0.2455539634722189 -Sr4P4S8Cl4_14_17460.vasp,Sr4P4S8Cl4,-2.9976916795,0.1665271654296841 -La4Cl6_1_9626.vasp,La4Cl6,-2.941117616,0.1013206308 -Zr1Nb2Br2N2O1_25_21366.vasp,Zr1Nb2Br2N2O1,-5.77583190625,0.0167049290624909 -Co2Sb2Se6_162_4006.vasp,Co2Sb2Se6,-2.123992814,0.313569840666664 -Li2Hf1H6S6_1_9960.vasp,Li2Hf1H6S6,-3.5828510946666667,0.1141177100000001 -Tm1Sb2_21_19668.vasp,Tm1Sb2,-2.31689544,0.1649763208333308 -Tb1P2_21_18175.vasp,Tb1P2,-3.144916353333333,1.2861174204166668 -P2Pb2O6_147_14008.vasp,P2Pb2O6,-4.610565008,0.2769642107500006 -Mn2Bi2S4Cl2_26_11008.vasp,Mn2Bi2S4Cl2,-2.1766541960000003,0.2609990369999995 -Hf1S1O1_156_7278.vasp,Hf1S1O1,-6.347960489999999,0.2666685925000007 -Fe1Sb2Te4_164_5751.vasp,Fe1Sb2Te4,-1.6291425814285714,0.1321949071428555 -Hg2Au2S2Cl2_26_7927.vasp,Hg2Au2S2Cl2,0.03166654625,0.1649968190625 -V2Se2Cl2O7_1_20181.vasp,V2Se2Cl2O7,-3.849479480769231,0.1288014317307655 -Zn2B1Cl2O3_150_21040.vasp,Zn2B1Cl2O3,-2.933128805,0.2318085032291627 -Ba2Cd1In1Au1O5_99_1940.vasp,Ba2Cd1In1Au1O5,-2.58306186,0.6146185712085509 -V1H5C4S6_2_19859.vasp,V1H5C4S6,-4.10352123625,0.4316984385156259 -Ag1Bi1As2S6_143_21.vasp,Ag1Bi1As2S6,-2.299412481,0.0403126735624972 -Ga1Cu1S2_156_6170.vasp,Ga1Cu1S2,-1.39994875,0.8903758050000001 -Cs1Ti1O2_156_4654.vasp,Cs1Ti1O2,-4.71458368,0.6478135745000011 -In2Te6As2_147_8640.vasp,In2Te6As2,-1.528508279,0.2310991281666643 -Ag1H2S2_12_70.vasp,Ag1H2S2,-2.125075866,0.1511275506874976 -Cr4H2N3O2_164_4603.vasp,Cr4H2N3O2,-4.9533347681818185,-0.0421370389394082 -Zr1Ti1Ga1Se3I2_1_21468.vasp,Zr1Ti1Ga1Se3I2,-2.79326935375,0.002517743697907 -Ti2F2_164_18932.vasp,Ti2F2,-5.26417932,-0.2476966383333376 -Hg1C2S2N2_1_7847.vasp,Hg1C2S2N2,-4.3389209385714285,0.1266639632440357 -Sr4Ti2Cu4O14_26_17486.vasp,Sr4Ti2Cu4O14,-4.134367892916667,0.2271486087499945 -Co2P4I4O6_2_3969.vasp,Co2P4I4O6,-3.23399881875,0.3147003594062423 -Mn2S1I2O1_6_11211.vasp,Mn2S1I2O1,-2.14825138,0.0560893258333332 -Rb2Cu2Te2_129_14836.vasp,Rb2Cu2Te2,-0.393991365,0.1299704983333333 -Al1_123_760.vasp,Al1,-1.41461763,1.009363235 -Hg1I2_12_7883.vasp,Hg1I2,0.9056050933333334,0.0327248361111112 -Ta3Ir2Br1Cl1O7_1_17966.vasp,Ta3Ir2Br1Cl1O7,-5.4304885164285706,0.6304616740476153 -Ca2Bi10O17_1_2950.vasp,Ca2Bi10O17,-3.790595613103448,0.1515252505172419 -Ba2F4_51_1980.vasp,Ba2F4,-3.263296511666667,0.6089142416666662 -Ta6S18_59_18150.vasp,Ta6S18,-4.716065242083333,0.0507188029166671 -W4Cl1O9_1_20582.vasp,W4Cl1O9,-5.570485972142857,0.2961611117966376 -Y2C2Cl2_12_20714.vasp,Y2C2Cl2,-5.446916125,0.0427672866666606 -K1Ga1Br4O12_2_8898.vasp,K1Ga1Br4O12,-2.4708122016666665,0.3267737145391372 -Ni3Ir1Se5S3_1_13703.vasp,Ni3Ir1Se5S3,-1.801926105,0.1377897467013869 -Ni2H4S2O8_4_13517.vasp,Ni2H4S2O8,-3.772170481875,0.7106514743749996 -Cu1P2H14C8O8_2_4934.vasp,Cu1P2H14C8O8,-5.068881184848484,0.20963607499999 -Ba3Mn2S5Br2_123_2115.vasp,Ba3Mn2S5Br2,-2.7678846025,0.2284987495833299 -V4B3Cl2_164_20300.vasp,V4B3Cl2,-4.222225482222222,0.380178663333329 -Ag1Sb3Se6_143_124.vasp,Ag1Sb3Se6,-1.712326834,0.1386398321666648 -Ga2Fe1Se4_156_6351.vasp,Ga2Fe1Se4,-1.978385724285714,0.0954364985714271 -Cu3Pb2Se2N1O11_8_5381.vasp,Cu3Pb2Se2N1O11,-3.194204674736842,0.3152823643256476 -Te1P1Cl1_156_18316.vasp,Te1P1Cl1,-1.7303294033333334,0.4888271311111091 -P4O10_31_14084.vasp,P4O10,-5.391927086428572,0.0978876707142859 -H2Pb2_164_7005.vasp,H2Pb2,-1.5415355725,1.535437355 -Zr1H2O2_164_21304.vasp,Zr1H2O2,-4.742559432,1.497537948000001 -Si6As8_1_16525.vasp,Si6As8,-3.313758207142857,-0.1622745088095262 -Cd2Te2Au2Cl2_26_3585.vasp,Cd2Te2Au2Cl2,0.147582095,0.10637542717 -Al2Bi4O8_90_769.vasp,Al2Bi4O8,-3.848852645,0.6383039885714222 -Na2Pb1S6F6_147_12263.vasp,Na2Pb1S6F6,-1.8507495466666664,0.5724613563958288 -Ga2Os1_123_6423.vasp,Ga2Os1,-2.584276093333333,0.7870965322222192 -Sr2Ge4Cl12_2_17225.vasp,Sr2Ge4Cl12,-2.092437725,0.0189261894444427 -Nb1Zn2In1Br4O4_3_12620.vasp,Nb1Zn2In1Br4O4,-2.8275930541666665,0.1649856110416667 -Nb2F6_162_12714.vasp,Nb2F6,-4.05313398375,0.3330504012499968 -Ba1Cu1Sb1O5_99_1824.vasp,Ba1Cu1Sb1O5,-3.5523316825,0.3966742843749949 -Mn1Sb1Br2O2_6_10856.vasp,Mn1Sb1Br2O2,-2.671110703333333,0.179261425625 -Cr2Co1Se4_164_4358.vasp,Cr2Co1Se4,-2.568655378571429,0.0168141506349208 -Li2Ti2N2Cl2_59_10095.vasp,Li2Ti2N2Cl2,-5.18419987375,0.1239121112500001 -Cr3C2S2F2_187_4550.vasp,Cr3C2S2F2,-3.7329322722222233,0.604285475833329 -Hf1Ti1Te1I1_25_7337.vasp,Hf1Ti1Te1I1,-3.3889905575,0.617107406249995 -Nb3Te2C1I1_8_13026.vasp,Nb3Te2C1I1,-3.89179837,0.3808002018658792 -Y4C3F2_164_20813.vasp,Y4C3F2,-5.885351837777778,0.2160446888888838 -Ag2Te2N2O10_13_459.vasp,Ag2Te2N2O10,-3.4492388225,0.1110754985937503 -Ta2Sn2Sb2_129_17890.vasp,Ta2Sn2Sb2,-3.3118155016666666,-0.7757986230555628 -Pd2Br4_2_14405.vasp,Pd2Br4,-0.31230346,0.2591920033333333 -Sb2Br2_12_15553.vasp,Sb2Br2,-1.324191505,0.1695565999999988 -Sr4Te8As4Cl4_14_17481.vasp,Sr4Te8As4Cl4,-2.0958918375,0.0342519300000002 -Mn5Zn1Ge2S12_6_11463.vasp,Mn5Zn1Ge2S12,-2.785829067,0.0558189750749998 -Na4Cl2_51_12380.vasp,Na4Cl2,-1.1738960483333334,0.3212877687499986 -Tl1Sb2Au1Se6_149_19340.vasp,Tl1Sb2Au1Se6,-1.427234829,0.4101413424999977 -Te4Mo1Au2_111_18592.vasp,Te4Mo1Au2,-0.9009521028571428,0.2486520885714273 -Sb2Se4_14_15703.vasp,Sb2Se4,-1.7810381366666668,0.5708098138888866 -Sb18F4_11_15427.vasp,Sb18F4,-2.2465774131818184,0.2388239241666638 -Fe2Br6_189_5823.vasp,Fe2Br6,-0.37518116375,0.3999950868749999 -Ag1H4S2N12_6_78.vasp,Ag1H4S2N12,-4.660126618421053,-0.0470810158223748 -Ti1Co1S2Br2_8_18763.vasp,Ti1Co1S2Br2,-2.976133021666667,0.1648084178472169 -Ag2P4Br2O3_6_355.vasp,Ag2P4Br2O3,-2.806721433636364,0.2843609516363574 -K1Se2_115_8937.vasp,K1Se2,-0.9268456366666666,0.8429565008333297 -Zr2N2Cl2_164_21607.vasp,Zr2N2Cl2,-5.670460993333333,0.03179744 -Mn1C2O6_147_10659.vasp,Mn1C2O6,-5.436350027777777,0.0629762693055506 -Bi1Te2Pd2_187_2406.vasp,Bi1Te2Pd2,-1.331535006,0.1188672709999988 -Re6I18_164_15123.vasp,Re6I18,-1.619066875,0.0573848445833333 -Sc1Te6As2Au1_149_16019.vasp,Sc1Te6As2Au1,-1.702170353,0.1101161612916641 -Na4As4O8_29_12362.vasp,Na4As4O8,-4.050912349375,0.0395856031249994 -Mn3Cl8_2_11369.vasp,Mn3Cl8,-1.6477597145454546,-0.0548651931818195 -Na2H6C4O10_2_12115.vasp,Na2H6C4O10,-5.028456102272727,0.060000539621202 -Fe2Se3S1I2_1_5982.vasp,Fe2Se3S1I2,-1.342992525,0.2195088935937497 -Nb2Se6_59_12887.vasp,Nb2Se6,-3.6600542625,0.0783445224999996 -Ta1P2_187_17598.vasp,Ta1P2,-5.164014496666667,0.8374096316666666 -Cu2H12C8N16_14_5106.vasp,Cu2H12C8N16,-5.52832934368421,-2.001264530701764 -Ag2As4O3F2_6_163.vasp,Ag2As4O3F2,-2.547657090909091,0.433376856060602 -Nb4Ge2S8_55_13078.vasp,Nb4Ge2S8,-4.537593201428572,-0.0032307126190511 -Mn2Ni1B6N6_150_11167.vasp,Mn2Ni1B6N6,-5.0414989346666665,1.438055631417625 -Zr4B3H2S2_164_21803.vasp,Zr4B3H2S2,-4.81944355,0.2664462188636323 -Hf4H2S2N3_164_7787.vasp,Hf4H2S2N3,-6.229395780000001,0.4048943474999849 -Ga4Te6_31_6579.vasp,Ga4Te6,-1.650818325,0.1592056602 -Nb3Te1Cl4_156_13021.vasp,Nb3Te1Cl4,-3.2627256475,0.3605071762053494 -Mo2Cl2_164_11597.vasp,Mo2Cl2,-2.3439182575,0.7217680758333336 -Hf1Mn2I1Br1O3_35_7228.vasp,Hf1Mn2I1Br1O3,-4.08666873875,0.2632791655549571 -B6C8_6_1775.vasp,B6C8,-6.232472543571428,1.117805983928565 -K12Ge4Te12_13_8874.vasp,K12Ge4Te12,-1.1637190103571429,0.1896663632142858 -Cd1Pb2I2O2_12_3391.vasp,Cd1Pb2I2O2,-1.6955113414285716,0.0775891557142856 -Mg2Mo2Se2O12_18_10483.vasp,Mg2Mo2Se2O12,-4.530171138888889,0.049768899861107 -Cu2C2I2O2_31_5062.vasp,Cu2C2I2O2,-3.00052193625,0.3032829424999989 -Nb1F2_164_12505.vasp,Nb1F2,-4.238444863333333,0.4116775933333286 -Li1Mg6C1_25_9741.vasp,Li1Mg6C1,-0.77360257125,0.1830684386458333 -Cs2F2_129_4711.vasp,Cs2F2,-1.75650703,-0.4190465000000001 -Na1W2Br6O2_10_11951.vasp,Na1W2Br6O2,-2.660946327272727,0.2218614754545456 -Ba1Bi4O8_162_1810.vasp,Ba1Bi4O8,-3.527412599230769,0.4013256471153807 -Ga2Se2I2_31_6472.vasp,Ga2Se2I2,-1.5781405116666667,0.0345303183333332 -Rh2O2F2_59_15202.vasp,Rh2O2F2,-3.0610831383333337,0.1591531180555523 -Ta3Ni1Te1I3_6_17971.vasp,Ta3Ni1Te1I3,-2.84301244375,0.2232114695535654 -Sc4S4Br4_11_16257.vasp,Sc4S4Br4,-3.3745946991666664,0.2140603291666667 -K2H8O4F2_26_9161.vasp,K2H8O4F2,-3.71737169,-0.1183514647916661 -Sc2Sb2O8_2_16144.vasp,Sc2Sb2O8,-4.9777767866666665,0.4476725650000004 -Sc3H2N2O2_187_16206.vasp,Sc3H2N2O2,-5.691980518888888,-0.457893536666671 -Ru1Cl2O1_47_15264.vasp,Ru1Cl2O1,-2.63199079,0.058721835 -Mo1S2_115_11543.vasp,Mo1S2,-3.03986383,0.7262547883333337 -Sc3N2O2_187_16213.vasp,Sc3N2O2,-6.217261987142857,0.1363782142857088 -As2Os2S6_162_1235.vasp,As2Os2S6,-3.38409719,0.3987333008749973 -Th1Ge2_123_18716.vasp,Th1Ge2,-3.675629433333333,0.8411124416666671 -Ta2Ru2Se8_11_17842.vasp,Ta2Ru2Se8,-3.7575396425,0.1873001583333335 -Co1H4C6Br2_47_3758.vasp,Co1H4C6Br2,-4.734657546923077,0.3551730830769142 -Sn1O1_156_16658.vasp,Sn1O1,-3.234894615,0.5017507674999999 -Hg3As1Se4Br1_156_8046.vasp,Hg3As1Se4Br1,-0.4821755399999999,-0.1169254916666681 -Zr2H2N1O2_164_21579.vasp,Zr2H2N1O2,-5.674311347142857,0.7827112871428454 -Re4I14_1_15109.vasp,Re4I14,-1.234319182222222,0.213496683171295 -Mo1Se1I2_47_11546.vasp,Mo1Se1I2,-1.264072555,0.2925217973177083 -Na2Os2C2S4I8_7_12248.vasp,Na2Os2C2S4I8,-1.98529347,0.3537743092361088 -Co1Te1Br1_156_3829.vasp,Co1Te1Br1,-1.3351085033333332,0.0863463983333334 -Be2Ag2_191_2235.vasp,Be2Ag2,-0.0844286825,0.6794637775000001 -P2Rh2Se6_162_14039.vasp,P2Rh2Se6,-2.649245922,0.4764252128333317 -Ag3Sb1O4_156_500.vasp,Ag3Sb1O4,-1.8561621325,0.4802182881249996 -Tl12Bi4I24_14_19190.vasp,Tl12Bi4I24,-0.45873801025,9.128474999953172e-05 -Fe1H4C4N2Cl2_47_5700.vasp,Fe1H4C4N2Cl2,-4.97105071076923,0.0802228752563944 -Hf1F3_25_7155.vasp,Hf1F3,-4.548683625,0.4488363484374998 -Mo2Br6_25_11579.vasp,Mo2Br6,-1.296276565,0.1414976790624982 -Te4Ru3_164_18627.vasp,Te4Ru3,-2.423835788571429,0.4224376721428537 -Rh2Se2Br2_59_15234.vasp,Rh2Se2Br2,-1.8221779333333328,0.1166086166666666 -Ti4H2S2N3_164_19140.vasp,Ti4H2S2N3,-6.334094527272726,-0.1623154724431866 -Ta2Te8Os2_11_17927.vasp,Ta2Te8Os2,-3.2336793633333336,0.1010739558333333 -Ba1V4O8_162_1877.vasp,Ba1V4O8,-5.26126709,0.3379215027884625 -Ti1O2_187_18822.vasp,Ti1O2,-6.651943406666667,0.6119111183333334 -W1Cl2_115_20426.vasp,W1Cl2,-2.284941723333333,0.7552533466666618 -Ni1H2O2_156_13324.vasp,Ni1H2O2,-2.988365468,0.3257007971666669 -K2Os2S2N2F10_11_9285.vasp,K2Os2S2N2F10,-3.063746060555556,-0.1436676617083395 -Sn1P2S4_164_16664.vasp,Sn1P2S4,-2.8998378957142856,0.2886879356138364 -Ta4Fe2Te10_59_18039.vasp,Ta4Fe2Te10,-2.973219595,0.1851328715277775 -Na4Ti2S4O2_7_12425.vasp,Na4Ti2S4O2,-4.13924351,0.1073988616666667 -Cd1I2_187_3368.vasp,Cd1I2,0.6783111433333334,0.1228023805555555 -Ge4Se2S6_1_6948.vasp,Ge4Se2S6,-2.8399576616666664,0.179214080920139 -Bi2Au2O4_11_2423.vasp,Bi2Au2O4,-2.49534631375,0.6181702509374978 -In2Se2Cl2_59_8578.vasp,In2Se2Cl2,-1.6895907216666668,0.0544835716666665 -Y2B2C2_51_20696.vasp,Y2B2C2,-6.187757463333334,0.3054060336111042 -Zr1Nb1I2N1_1_21344.vasp,Zr1Nb1I2N1,-4.143936578,0.2750472295000004 -La1I2_123_9568.vasp,La1I2,-1.96140371,-0.0071359500000001 -In2I6_189_8482.vasp,In2I6,-0.19835212,0.19516427375 -Mg2F4_2_10450.vasp,Mg2F4,-3.2315514800000003,-0.1109258083333339 -K4I4Cl16_14_9466.vasp,K4I4Cl16,-0.6263978425,0.02753717875 -Al2Zn2Te5_156_1043.vasp,Al2Zn2Te5,-1.1662853244444444,0.1506243777777765 -Sc1In1S1Br3Cl1_1_15948.vasp,Sc1In1S1Br3Cl1,-2.0202683842857145,0.2169482603571382 -Ge10F24_14_6631.vasp,Ge10F24,-3.0483327311764703,0.016211018529409 -Y1Te3_99_20683.vasp,Y1Te3,-2.5188389275,-0.3341146025000001 -Sb2I6_162_15593.vasp,Sb2I6,-0.541220135,0.0524916975 -Mn2Sb2Cl2O4_26_11232.vasp,Mn2Sb2Cl2O4,-3.3893150400000005,0.1046586007499952 -Tl4P4_127_19616.vasp,Tl4P4,-1.04045161625,0.963568387 -Mn2H4C12S2O8_13_11099.vasp,Mn2H4C12S2O8,-5.758550912857143,0.2148598010714222 -Li4W4F24_14_10250.vasp,Li4W4F24,-3.5101529303125,1444.1547096046877 -Bi2P2Pb2O10_2_2489.vasp,Bi2P2Pb2O10,-4.543465574375,0.0947620503124972 -In2Fe1S4_164_8430.vasp,In2Fe1S4,-2.483580607142857,-0.1140474535714304 -As1Au3O4_156_1133.vasp,As1Au3O4,-1.832685005,1.03270283125 -Ta4S2N3_164_18102.vasp,Ta4S2N3,-7.268216434444445,0.3629643794444379 -Ta1Cr1H6_123_17533.vasp,Ta1Cr1H6,-2.901825175,1.9300559031250004 -Na2Cd4Te2S6Br6_31_12047.vasp,Na2Cd4Te2S6Br6,-0.935030967,0.2393610911666641 -Zn2Sb4O8_4_21155.vasp,Zn2Sb4O8,-3.6080006292857134,0.0841555589285693 -Te6As2Rh2_162_18646.vasp,Te6As2Rh2,-2.018017854,0.3636918866666653 -Ru1Cl2_187_15267.vasp,Ru1Cl2,-1.3013073333333334,0.803797453888887 -Ag2As4S3Cl2_6_166.vasp,Ag2As4S3Cl2,-1.8774263554545456,0.1162824530871184 -In2Se2Br2_59_8576.vasp,In2Se2Br2,-1.5048634666666667,0.0507278633333334 -Ca3Si1Br2_47_3200.vasp,Ca3Si1Br2,-1.58984874,0.1619577812500002 -Ru1F2_115_15268.vasp,Ru1F2,-2.0207245533333333,0.7311659416666638 -Pd2Br2Cl4_1_14398.vasp,Pd2Br2Cl4,-0.534055225,0.1209280508333333 -Ni2Se3S2Br1_8_13644.vasp,Ni2Se3S2Br1,-1.24569848625,0.3334849532291667 -Na1Ni1P2Se6_149_11915.vasp,Na1Ni1P2Se6,-2.165626546,0.1341795229375002 -Nd2I2O2_129_13239.vasp,Nd2I2O2,-4.510676723333334,0.0550765883333328 -K1I1_123_8907.vasp,K1I1,-0.4890124,-0.40812378 -Nb1S2_115_12560.vasp,Nb1S2,-4.374657083333333,0.582728321666667 -Fe1B4Br2N2F4_47_5621.vasp,Fe1B4Br2N2F4,-4.145137116153847,0.277470187641017 -Tc4Br14_13_18244.vasp,Tc4Br14,-1.955546885555556,0.1140507330555489 -Ga2Ni1S4_164_6399.vasp,Ga2Ni1S4,-2.4211977528571427,0.0734464609523793 -Cu1Ge2W1Se1S3I2Br2_1_4888.vasp,Cu1Ge2W1Se1S3I2Br2,-2.0455105875,0.0945180959837912 -Ba2Ca2I8_18_1936.vasp,Ba2Ca2I8,-1.1593531625,0.2492134331666665 -Si2C2Br2_59_16393.vasp,Si2C2Br2,-3.691705066666667,0.8825191329166628 -H2W4N3_164_7044.vasp,H2W4N3,-5.701468358888889,-1.3848619691975346 -Hg3N1_191_8061.vasp,Hg3N1,1.51878949,1.0611305009698278 -Ga2O2_187_6416.vasp,Ga2O2,-3.98216958,0.2636448424999997 -In2Se2Cl2_31_8577.vasp,In2Se2Cl2,-1.6662461966666668,0.0778280966666664 -Ag1B6C6S2F4_6_17.vasp,Ag1B6C6S2F4,-4.567050778947369,0.9011690934795172 -Mn1In2S4_164_10784.vasp,Mn1In2S4,-2.523592328571429,-0.0368405971428571 -Sc2Te1S1Br2_1_16172.vasp,Sc2Te1S1Br2,-2.9291617916666666,0.2380123130555527 -Na6H10C4O16_13_12436.vasp,Na6H10C4O16,-4.764727488611111,0.0367272177777735 -Sc2I6_162_16098.vasp,Sc2I6,-1.5649557225,0.0525618087500001 -P8Se20_14_14159.vasp,P8Se20,-2.439507489642857,0.3033078873214262 -Pr1Te3_191_14539.vasp,Pr1Te3,-1.8110252875,0.136573255 -Mn1As2F12_81_10636.vasp,Mn1As2F12,-2.3635053413333336,0.0899427116666641 -Li1Re1Te1Br1_8_9780.vasp,Li1Re1Te1Br1,-2.55910305,0.89479002875 -Nb2P4S16_8_12810.vasp,Nb2P4S16,-3.591985496818182,0.0766303252272724 -Sc4Br4O4_11_16227.vasp,Sc4Br4O4,-4.6666090075,0.0731551824999998 -Mn2P2S4Br2_26_11189.vasp,Mn2P2S4Br2,-2.615454352,0.2002963708472189 -In1Pd2_187_8309.vasp,In1Pd2,-0.6479137533333333,0.8581118133333333 -Li2Fe1_187_9902.vasp,Li2Fe1,-0.5022748033333333,1.226073434444443 -Al2Ni2S5_164_903.vasp,Al2Ni2S5,-2.597037038888889,0.115219949120368 -Br4O10_4_2707.vasp,Br4O10,-1.953589157857143,0.4425378137499991 -Bi1Sb1Mo1_156_2378.vasp,Bi1Sb1Mo1,-2.0015711633333333,0.4302208630952353 -Sn1Pb1Se2_1_16672.vasp,Sn1Pb1Se2,-1.80640335,-0.0432820907812501 -Y7Cl10_2_20848.vasp,Y7Cl10,-3.548894077647059,0.1261248132352893 -Fe1C6Br2F4_47_5648.vasp,Fe1C6Br2F4,-4.129458744615385,0.339399099038457 -Mg1H2Se2_1_10372.vasp,Mg1H2Se2,-2.518591256,0.8078914836666672 -Rb2Au2S2_51_14767.vasp,Rb2Au2S2,-0.6844119399999999,0.3435721316666666 -Be2Bi1_191_2242.vasp,Be2Bi1,-1.3710777966666667,0.2853167249999986 -Zr1Ni1F6_149_21373.vasp,Zr1Ni1F6,-3.27960819875,0.0739397262499999 -Hf3B2S2F2_187_7683.vasp,Hf3B2S2F2,-4.787617317777777,0.8371291711111013 -Sc1H2_187_15941.vasp,Sc1H2,-3.15388276,0.4915541700000001 -Zr4B3Cl2_164_21800.vasp,Zr4B3Cl2,-4.882545546666666,-0.1230532925000025 -Pr1S3_191_14535.vasp,Pr1S3,-3.0321562275,0.9697245617187504 -Bi1Sb2Au1S6_143_2383.vasp,Bi1Sb2Au1S6,-2.041432971,0.0571710162187477 -Cu2Sb4S3I2_6_5279.vasp,Cu2Sb4S3I2,-1.4684736036363637,0.1866746555785111 -Mg2Ga1Cu5Se4Cl8_1_10456.vasp,Mg2Ga1Cu5Se4Cl8,-1.1831274994999998,0.1848649548333335 -Al1Br2_164_616.vasp,Al1Br2,-1.3119776533333334,0.4334496827777762 -Cs2Hg4S2Cl6O6_31_4729.vasp,Cs2Hg4S2Cl6O6,-1.7322233485000005,0.0863135704999997 -Ba2Tl1Ag1Hg1O5_99_2074.vasp,Ba2Tl1Ag1Hg1O5,-2.420871477,0.2707246751071401 -Zr1Zn1Cl2_156_21491.vasp,Zr1Zn1Cl2,-1.6059026925,0.186549647916665 -Si2N6_164_16414.vasp,Si2N6,-5.55873869,0.1414833810416613 -K2C10S2F6_51_9011.vasp,K2C10S2F6,-4.0480576445,0.9904163369375 -Fe8Cu4S14_51_6100.vasp,Fe8Cu4S14,-1.633812816923077,0.2558402442307657 -Ti1Ni1Pd1Se1S1I2_1_18811.vasp,Ti1Ni1Pd1Se1S1I2,-1.880653487142857,0.0797049387460277 -Mg1F2_187_10358.vasp,Mg1F2,-3.10945103,0.011174641666666 -Ba1Sn1Te2_1_1859.vasp,Ba1Sn1Te2,-1.731287245,-0.51555062125 -Fe1Ni1C4N4O2_123_5722.vasp,Fe1Ni1C4N4O2,-5.1915346275,0.5143853487760358 -Na3Lu1Cl6_10_12353.vasp,Na3Lu1Cl6,-2.303775605,0.1341931250000003 -Pb1I2_187_14189.vasp,Pb1I2,-0.5645286566666666,0.1559771094444445 -Te1Ru1Se1_1_18334.vasp,Te1Ru1Se1,-2.3521491633333333,0.5556484216666668 -Cr1Ag1P2Se6_149_4100.vasp,Cr1Ag1P2Se6,-2.319957608,0.0390319276562499 -Cr1P2O8_2_4230.vasp,Cr1P2O8,-5.097197599090909,0.115269030359839 -Ni1Au1Br1Cl1O4_1_13258.vasp,Ni1Au1Br1Cl1O4,-1.29976638375,0.4039136503559022 -W1I1Cl1_156_20435.vasp,W1I1Cl1,-1.37865022,1.1926170364583282 -Zr2Cl6_2_21555.vasp,Zr2Cl6,-2.900461585,0.0692012712499998 -Mn1Nb1Te1S2_1_10815.vasp,Mn1Nb1Te1S2,-3.417615542,0.4376655480919501 -Co2O2_164_3947.vasp,Co2O2,-3.3400901475,-0.3729223975 -Nb3I2O4_1_12980.vasp,Nb3I2O4,-5.196983537777778,0.1678503139351796 -Mn2S4F2_11_11225.vasp,Mn2S4F2,-2.66699093,0.3013011964062502 -Mn2Bi2Se4I2_10_11018.vasp,Mn2Bi2Se4I2,-1.570510145,0.1146916374285687 -Hf1Ta1Te2_8_7315.vasp,Hf1Ta1Te2,-3.8921610175,1.1410035575000004 -Ge8S12I8_147_6976.vasp,Ge8S12I8,-1.829605653571429,0.4044349810714285 -Ti4C3S2F2_164_19131.vasp,Ti4C3S2F2,-5.860091723636364,0.4410702871590795 -Ta3I7O1_156_17964.vasp,Ta3I7O1,-2.698567097272728,0.2462128061931774 -In6O9_150_8709.vasp,In6O9,-3.728974326,0.3097636462499999 -Na2Br1_164_11992.vasp,Na2Br1,-0.8998704466666667,-0.1004134366666673 -Sc2I2O2_59_16093.vasp,Sc2I2O2,-4.351182131666667,0.052575468333333 -Pt4F8_14_14701.vasp,Pt4F8,-1.3753734408333331,0.442227491666664 -Ca5Tm1_1_3252.vasp,Ca5Tm1,0.4345903966666666,1.3142988141666652 -Cd1H2Se2_12_3341.vasp,Cd1H2Se2,-1.684582586,0.5539319846666666 -Hf1Se1S1_156_7306.vasp,Hf1Se1S1,-4.740311136666667,0.3444801283333336 -Cu4Te16_14_5477.vasp,Cu4Te16,-0.6778869710000001,0.4921766970000001 -V4C3O2_164_20313.vasp,V4C3O2,-5.974825375555556,0.0272882920931434 -Co1H2O2_8_3740.vasp,Co1H2O2,-3.936470414,0.1786299874444423 -Hf2I2_129_7518.vasp,Hf2I2,-2.7925766775,0.7567529099999968 -Nb4Pd2S14_11_13123.vasp,Nb4Pd2S14,-3.8506515785,0.1379442554374979 -Hg2S2O10_31_7998.vasp,Hg2S2O10,-2.709826174285714,0.5610792916071399 -Ni4Br8_14_13743.vasp,Ni4Br8,-0.1450215208333333,-0.1899219408333333 -As2Ru2S6_157_1287.vasp,As2Ru2S6,-3.1415317810000003,0.2312743233749969 -Rb2Hg4S2I6O6_31_14870.vasp,Rb2Hg4S2I6O6,-1.421366579,0.0694613214027738 -Hg2I2_12_7973.vasp,Hg2I2,1.2714582375,0.0595934500000001 -Te2W2N1_164_18531.vasp,Te2W2N1,-4.290716658,-0.0763468796666664 -V2I1Br3O2_8_20090.vasp,V2I1Br3O2,-2.89448114125,0.0399172158593748 -K1Se1O2F1_6_8936.vasp,K1Se1O2F1,-2.462287508,0.5886067369999997 -Ge2Te1S1_6_6878.vasp,Ge2Te1S1,-2.6708753025,-0.8136807131249998 -Ta6Co18_191_18142.vasp,Ta6Co18,-2.23245999,1.1965230683333332 -Cu2H16N4O4F8_14_5111.vasp,Cu2H16N4O4F8,-3.5948994111764705,0.1937248376470527 -Ag2Xe2F18_83_493.vasp,Ag2Xe2F18,-0.2231558286363636,0.0146981818181818 -Dy2C1_164_5521.vasp,Dy2C1,-4.03997052,0.4173681966666667 -Rb1Li1Mg6O7_99_14742.vasp,Rb1Li1Mg6O7,-3.733891327333333,0.0251681923333304 -Pd3Se2Cl1O2_1_14511.vasp,Pd3Se2Cl1O2,-1.57376245625,0.4632644877083289 -Mn2Te2_187_11307.vasp,Mn2Te2,-1.3550210175,0.4912166731896552 -Fe2Se2Cl4_12_5973.vasp,Fe2Se2Cl4,-1.32763457125,0.1771736588541665 -Co1C8F6_25_3724.vasp,Co1C8F6,-4.8502984693333335,0.5053977864999939 -Sr4Cu4Sb2O14_6_17428.vasp,Sr4Cu4Sb2O14,-3.3807274350000003,0.3947375458333266 -Mn2Se2Cl2_59_11276.vasp,Mn2Se2Cl2,-1.9631352066666663,0.0822778816666669 -Zn2Sb4O6F4_31_21153.vasp,Zn2Sb4O6F4,-3.112609568125,0.1963850210937502 -Ta3N2_187_17970.vasp,Ta3N2,-7.644145352,0.9047113513333258 -V1W3Se8_25_19965.vasp,V1W3Se8,-3.614577245,-0.2843310379166666 -Ga1Si1S2I1Br1_1_6278.vasp,Ga1Si1S2I1Br1,-2.1919939266666666,0.2541257985416638 -Nd1C2_123_13216.vasp,Nd1C2,-5.652204073333333,0.7829747499999935 -Bi1Se1Cl1_156_2387.vasp,Bi1Se1Cl1,-1.6182273533333331,0.1946304666666665 -Rb2Ru2S4I8N2_7_14932.vasp,Rb2Ru2S4I8N2,-1.597016343888889,0.2869319711111093 -Sn1Pb1Br2O2_8_16668.vasp,Sn1Pb1Br2O2,-2.62748943,0.1500822224999995 -Zn1Fe2H2O6_8_20932.vasp,Zn1Fe2H2O6,-3.4614489254545457,0.1806893638257501 -Ni2Bi2Se4Br2_10_13469.vasp,Ni2Bi2Se4Br2,-1.090924298,0.2096401759999995 -Ca1Fe1S1O1_156_2834.vasp,Ca1Fe1S1O1,-2.91484672,0.1974217600000002 -Mo6N2O18_10_11761.vasp,Mo6N2O18,-4.970090584230769,0.1888656409615333 -Hg1Bi1_156_7839.vasp,Hg1Bi1,1.357833795,0.3638700293965515 -Na1In1Te6As2_5_11892.vasp,Na1In1Te6As2,-1.519913678,0.2896226571666652 -K2F1_164_9096.vasp,K2F1,-0.8042640133333333,-0.2308861900000006 -Ru2I2_129_15322.vasp,Ru2I2,-1.0553920675,0.7480771724999985 -Ta2H2_12_17749.vasp,Ta2H2,-5.3531273425,0.3789750300000003 -Sn1Te1Se1_156_16698.vasp,Sn1Te1Se1,-1.6298911133333334,-0.0551102777777792 -Ce4Se8_11_3689.vasp,Ce4Se8,-3.465741245833333,0.33558646 -Sb2C6_191_15560.vasp,Sb2C6,-5.51325449875,1.144881326874999 -Zn1Cu1Se2I1Cl1_1_20920.vasp,Zn1Cu1Se2I1Cl1,-0.3454987216666667,0.358010881325231 -Hf1Ge1Te2_25_7182.vasp,Hf1Ge1Te2,-3.1864614475,0.1679773362499999 -Nb2Ge2As2_129_12726.vasp,Nb2Ge2As2,-4.39482617,-0.0963453700000038 -Cu2Te3As4Cl2_6_5341.vasp,Cu2Te3As4Cl2,-1.5131193554545457,0.1865022710606028 -Ga2Br6_1_6314.vasp,Ga2Br6,-1.08303221625,0.07106123375 -Hf1Ta1N1O3_25_7313.vasp,Hf1Ta1N1O3,-7.587608615,0.2711295254629557 -Rb2Os2Br8N2O4_7_14904.vasp,Rb2Os2Br8N2O4,-2.4954309011111118,0.0872380601851779 -Cu2Bi2S2Cl4_51_5041.vasp,Cu2Bi2S2Cl4,-1.215668174,0.2574043972499966 -Co1H4I2N6_47_3767.vasp,Co1H4I2N6,-3.91178491,-0.0250164327564159 -Sn2Hg1Br2O2_12_16773.vasp,Sn2Hg1Br2O2,-1.8065363714285716,0.2120117876847282 -Sn2As1S6_162_16711.vasp,Sn2As1S6,-2.597952851111111,0.2672127178819385 -H2C2_164_6993.vasp,H2C2,-5.8092368525,0.0505828625000006 -Cd2H4Se2S8_31_3514.vasp,Cd2H4Se2S8,-2.123180365625,0.2170940633854164 -Mg2Cr8O18_85_10447.vasp,Mg2Cr8O18,-4.828940799285713,-0.0367082001785736 -Ni2S2_129_13587.vasp,Ni2S2,-1.1692063825,0.2592546408333316 -Sc3S2Cl1_8_16217.vasp,Sc3S2Cl1,-3.666158333333333,0.2256754769444378 -V1S1I2_47_19911.vasp,V1S1I2,-1.670034305,0.2436714392187471 -Tb1Si5_47_18180.vasp,Tb1Si5,-3.5507565,-0.014929668888892 -Cu4Se4Cl4_14_5473.vasp,Cu4Se4Cl4,-0.8374213300000001,0.1113878944841261 -Rb2C6O6F6_4_14801.vasp,Rb2C6O6F6,-4.6414464275,0.0702196304999939 -Mn2Sb2Te4Cl2_10_11256.vasp,Mn2Sb2Te4Cl2,-1.610633201,0.2285193134999981 -Ge2Te2_31_6887.vasp,Ge2Te2,-2.2620995375,-0.7988582125000001 -Mn3H2N2O2_156_11386.vasp,Mn3H2N2O2,-4.370981921111111,0.7420494088888838 -Ba2Co3O7_6_1957.vasp,Ba2Co3O7,-3.67265898,0.4961660574999963 -Ca3Ag2Br2O4_123_3142.vasp,Ca3Ag2Br2O4,-2.626940887272727,0.0244108059090859 -Ta1Nb1S2Br1Cl3_1_17573.vasp,Ta1Nb1S2Br1Cl3,-3.41000145625,0.2457745067187402 -Sr1O2F2_1_17069.vasp,Sr1O2F2,-2.497761282,1.1332142385000008 -Zr1N1F3_1_21334.vasp,Zr1N1F3,-4.278493892,0.7802579133333287 -Bi2Te1Se2_156_2554.vasp,Bi2Te1Se2,-1.854638174,0.0791696599999998 -Hf2Te6P2_2_7645.vasp,Hf2Te6P2,-3.057922235,0.2891351459166658 -Mo3W1O8_25_11730.vasp,Mo3W1O8,-5.453934908333333,0.1336051537847173 -Sc2Se2F2_59_16156.vasp,Sc2Se2F2,-4.026609078333333,-0.0544026038888927 -Sb8O16_1_15870.vasp,Sb8O16,-4.004120684166667,0.4139561829166664 -Ni2Te4H2_6_13676.vasp,Ni2Te4H2,-1.21873590625,0.5423229675 -W1Br1Cl1_156_20416.vasp,W1Br1Cl1,-2.1697320466666667,0.6429526130555516 -Cs1Ti1Se2_156_4656.vasp,Cs1Ti1Se2,-3.004542745,0.2153426062500001 -Al2Hg1Te4_164_874.vasp,Al2Hg1Te4,-1.3081532242857143,0.1911571957142857 -Ba2Tl1Cu1Hg1O5_99_2082.vasp,Ba2Tl1Cu1Hg1O5,-2.595857441,0.3718486405624929 -Sb4_53_15843.vasp,Sb4,-2.0532543,0.2303127725 -Cr1Sb2Au1S6_149_4255.vasp,Cr1Sb2Au1S6,-2.270837469,0.3726007659999995 -Te2P2Se1_164_18442.vasp,Te2P2Se1,-2.414039712,0.2514479855416668 -Mn1Ga1Br4Cl2_1_10715.vasp,Mn1Ga1Br4Cl2,-1.258473365,0.0129804532291653 -Pb2Se4_12_14297.vasp,Pb2Se4,-1.704880675,0.3644249384027759 -Ba2Te4F20_13_2069.vasp,Ba2Te4F20,-2.636286375384615,0.0588167384615387 -Sr2Cu1Se2Br2_38_17204.vasp,Sr2Cu1Se2Br2,-1.6806951542857145,0.0930932566666634 -K1Mo2I6O2_47_8918.vasp,K1Mo2I6O2,-1.78561904,0.063114200151511 -P2Pd2S7_6_14024.vasp,P2Pd2S7,-2.5002516127272725,0.3471020230303004 -Pb2Se2Br2_59_14285.vasp,Pb2Se2Br2,-1.300016445,0.3315983667013868 -Hf1Ge1I2N1_1_7175.vasp,Hf1Ge1I2N1,-3.61470194,0.3658863685 -Pb1S2_164_14201.vasp,Pb1S2,-2.008578683333333,-0.6871947868750014 -Sb4O8_59_15792.vasp,Sb4O8,-4.161610068333333,0.25646679875 -Pt1Cl2_187_14570.vasp,Pt1Cl2,-0.3504761766666666,0.7675638850000002 -K4Ge2As4_49_9446.vasp,K4Ge2As4,-1.740063735,0.1397667729999998 -Ba2Cl2O6_129_1947.vasp,Ba2Cl2O6,-2.417322016,1.013725024249997 -Al1Ag1P2S6_149_598.vasp,Al1Ag1P2S6,-2.9793227250000003,0.0281275051197896 -Na2Ga2H8_51_12083.vasp,Na2Ga2H8,-2.5420427025,0.094354256666667 -Ge1Sb2Te4_164_6706.vasp,Ge1Sb2Te4,-1.9564317885714289,-0.2195730714285728 -Na2H8S4Cl2_2_12140.vasp,Na2H8S4Cl2,-2.83991620375,0.1042734745312499 -Ba2P4O12_2_2045.vasp,Ba2P4O12,-5.494511806666667,0.1780161602777772 -Hf1Fe1Cl6_149_7158.vasp,Hf1Fe1Cl6,-2.5587509525,0.0458521834374998 -Si1Se2_187_16368.vasp,Si1Se2,-2.5959899866666665,0.5294351302083338 -Ag2Te1_191_453.vasp,Ag2Te1,0.4005737533333333,0.353488425 -K2Nb1Ag1S4_21_9253.vasp,K2Nb1Ag1S4,-2.6143550075,0.1376129806250001 -Al1Te4_8_748.vasp,Al1Te4,-1.434591714,0.4164128735000001 -Pd2O2F2_59_14442.vasp,Pd2O2F2,-2.052210955,0.2297361861111089 -Al2Fe2S5_164_836.vasp,Al2Fe2S5,-3.194931285555556,-0.2367613834722249 -Fe1I2_164_5716.vasp,Fe1I2,-0.5449209133333334,-0.5432260891666667 -Cu2Sb4O3F2_6_5274.vasp,Cu2Sb4O3F2,-2.382020217272727,0.8395496849810555 -Ta1P1_123_17596.vasp,Ta1P1,-4.94934716,1.76002761 -Cu2Te3O8_5_5344.vasp,Cu2Te3O8,-3.011729536153846,0.3601567593269179 -Mn2I8_14_11119.vasp,Mn2I8,-0.198265372,0.08594933175 -Ni2Pd1Br4Cl4_1_13574.vasp,Ni2Pd1Br4Cl4,-0.38266322,-0.0591606590909096 -P4S6_1_14112.vasp,P4S6,-3.2742815819999995,0.1109686094062474 -B4Cl8_14_1752.vasp,B4Cl8,-2.8094405291666664,0.1357181973148123 -Zr1Ta2Ni1C2O1F2_8_21456.vasp,Zr1Ta2Ni1C2O1F2,-5.320369596666667,0.7103016847222108 -Cu6O2F10_2_5495.vasp,Cu6O2F10,-1.3790333116666669,0.1631178656944427 -K2Eu2P2Se8_11_9095.vasp,K2Eu2P2Se8,-2.7196781828571432,0.0926388242857134 -Mn2Bi2Se4Br2_10_11014.vasp,Mn2Bi2Se4Br2,-1.7316925680000002,0.1287583026666651 -Zr1Pt1Se1S1_156_21409.vasp,Zr1Pt1Se1S1,-3.3813486675,0.4520811968749993 -As4O8_156_1341.vasp,As4O8,-4.065830561666666,0.3753726237499921 -Zn1In2Te4_156_20969.vasp,Zn1In2Te4,-0.9356916028571428,0.1337868014285712 -C1_123_2740.vasp,C1,-5.43728203,2.6790433799999995 -Ga1P2Au1Se6_149_6232.vasp,Ga1P2Au1Se6,-2.159571065,0.055325946187498 -Au2I2N2_59_1484.vasp,Au2I2N2,-0.8273447516666667,0.6747568416666654 -Co2Se4F2_2_4026.vasp,Co2Se4F2,-2.0611063675,0.3145576676041667 -Ru2S2_187_15343.vasp,Ru2S2,-3.249789615,0.5107545224999996 -Cu3P1O4_156_5378.vasp,Cu3P1O4,-2.96431925375,0.6033999063541671 -K2Pb1S6F6_147_9294.vasp,K2Pb1S6F6,-1.757265764,0.560410033437498 -Nb1In1Br6_5_12526.vasp,Nb1In1Br6,-1.63500204125,0.098865512499998 -S2_51_15387.vasp,S2,-2.300266965,0.317617834375 -Li1In1As2O6_5_9725.vasp,Li1In1As2O6,-4.059360602,0.3517244505208243 -Co2O4F2_11_3950.vasp,Co2O4F2,-2.9784043625,-0.1096542904687503 -Li2Mg1Te2H4S8_2_9977.vasp,Li2Mg1Te2H4S8,-2.739514657647059,0.0344433660784269 -Ni2Bi4Br4O6_2_13473.vasp,Ni2Bi4Br4O6,-2.505641919375,0.0123476318750001 -Co3Ni1O8_164_4064.vasp,Co3Ni1O8,-3.4879947058333336,-0.5810480912500025 -Ca1S2F2_12_2873.vasp,Ca1S2F2,-2.177318142,1.1760847557500005 -Ir2Br2N2_59_8764.vasp,Ir2Br2N2,-3.1994636483333334,0.3737622013888859 -Pd2Se2_123_14496.vasp,Pd2Se2,-1.44650187,0.2803538424999998 -Zr3I2N1O1_8_21770.vasp,Zr3I2N1O1,-4.4050077,0.4012733967618964 -Ba4Sb4O10_11_2180.vasp,Ba4Sb4O10,-4.382167770555555,0.0364561589814777 -Sr1P2F12_2_17071.vasp,Sr1P2F12,-3.264697281333333,-0.0201256206666663 -Mn1Cu1Br2O2_6_10681.vasp,Mn1Cu1Br2O2,-2.122302671666666,0.1777462999999999 -Bi2Te2Se1_164_2564.vasp,Bi2Te2Se1,-1.682860754,0.081402084 -Hg1As1_8_7834.vasp,Hg1As1,0.443746505,0.8219410218965515 -Fe3B2O2F2_187_6046.vasp,Fe3B2O2F2,-2.5998789222222225,1.767044214567897 -Nb3H2N2_187_12977.vasp,Nb3H2N2,-6.257791258571428,-0.1104980871428615 -Al2S1I2_5_932.vasp,Al2S1I2,-1.798792636,0.2944660745833312 -Ta2Sb2O6_2_17864.vasp,Ta2Sb2O6,-5.826632163,0.2593342682499975 -Nb2Te4Br4_12_12918.vasp,Nb2Te4Br4,-2.259291678,0.1190419831666645 -S8Cl8_2_15404.vasp,S8Cl8,-1.4670264425,0.05961697875 -Fe2S2I2_59_5933.vasp,Fe2S2I2,-1.3561078383333334,-0.1589558269444456 -Pb1Cl2O1_187_14177.vasp,Pb1Cl2O1,-1.652342425,0.1514128103124999 -Sc4S6_1_16261.vasp,Sc4S6,-4.203749147,0.3826863135000007 -Tl2Te2_129_19551.vasp,Tl2Te2,-0.68843231,0.26422707125 -Ga1Ag1P2O6_149_6115.vasp,Ga1Ag1P2O6,-4.396898216,0.3618953895090904 -Cr2Cl8_1_4356.vasp,Cr2Cl8,-1.498201732,-0.1102347095 -V3Mo1O8_25_20276.vasp,V3Mo1O8,-5.3437691025000005,0.2293717902083334 -P2Pb2S6_7_14015.vasp,P2Pb2S6,-2.82532942,0.2418148774999999 -Os1Br2_164_13792.vasp,Os1Br2,-1.748719693333333,0.2407722766666624 -Pd2S2O6_12_14464.vasp,Pd2S2O6,-3.509608806,0.1162580919999959 -Au1Se1Br2_6_1444.vasp,Au1Se1Br2,-0.072804155,0.2846855099479165 -W2S2_187_20532.vasp,W2S2,-4.18348494,0.9253408400000004 -Ni4Te1Se5_1_13768.vasp,Ni4Te1Se5,-0.885367443,0.2264837129999987 -Cu1H4C4N2Cl2_10_4898.vasp,Cu1H4C4N2Cl2,-4.6500363338461534,0.3044345221153696 -Li2V2F8_51_10123.vasp,Li2V2F8,-3.458416676666667,-0.3558745800000027 -Ca4S16_14_3235.vasp,Ca4S16,-2.6355263565,0.1134691591250001 -K2Al2C2O10_51_8972.vasp,K2Al2C2O10,-4.91137802875,0.2518081585156251 -Ta1Ni1Se1S3_6_17589.vasp,Ta1Ni1Se1S3,-3.34132553,0.043672585787034 -Ga1Co5Br2_123_6152.vasp,Ga1Co5Br2,-1.27143632375,0.3692972158333315 -Ti2Cu4Te6_12_18930.vasp,Ti2Cu4Te6,-1.8211666266666664,0.1458997549999998 -Cd1H1Br1O1_156_3326.vasp,Cd1H1Br1O1,-1.91909218,0.1238748712500001 -Ba2Mg2Bi2_164_2018.vasp,Ba2Mg2Bi2,-0.7151445983333334,0.2659394548148125 -Sn1Hg2O4_21_16646.vasp,Sn1Hg2O4,-1.9340440571428568,0.3755329940476162 -C4Se4_51_2770.vasp,C4Se4,-4.21154481375,1.0006121679166669 -Ti2Te2As1_164_19034.vasp,Ti2Te2As1,-4.359855334000001,0.0569961859999992 -Cu4S4I4F4_14_5457.vasp,Cu4S4I4F4,-0.8435493575,0.2232597558333335 -Al2Te3_164_1015.vasp,Al2Te3,-2.107013144,0.1082749502499997 -V4S4F12_14_20361.vasp,V4S4F12,-3.2454596555000004,-0.263408845625 -Cu2H4C6Cl2_2_5124.vasp,Cu2H4C6Cl2,-4.2540412907142855,0.4356574774999979 -In2O3_150_8515.vasp,In2O3,-2.995913664,1.0428243082499995 -Bi4O8_31_2631.vasp,Bi4O8,-3.5237193516666667,0.2438314942708301 -Mn2P2S4Cl2_26_11190.vasp,Mn2P2S4Cl2,-2.761346438,0.2083448365972189 -Ti1I1Cl1_156_18793.vasp,Ti1I1Cl1,-2.9419983066666666,0.1740228112500002 -Na1Co1P2S6_149_11845.vasp,Na1Co1P2S6,-3.027343629,0.1411498931250007 -Pt2S2_164_14664.vasp,Pt2S2,-2.12863471,0.4864464499999998 -Ni2P2S7_6_13566.vasp,Ni2P2S7,-2.2970755990909093,0.3118170718181762 -Rb1Te2_115_14758.vasp,Rb1Te2,-0.57040703,0.3986948372916647 -Pd2Br4_13_14404.vasp,Pd2Br4,-0.5012378766666666,0.0702575866666667 -Ni2Pb8_125_13573.vasp,Ni2Pb8,-0.399858271,1.774290625 -Rh1Au1Se2I1Br1_1_15142.vasp,Rh1Au1Se2I1Br1,-0.7489583299999999,0.4612206749264689 -Ga1Ag1Te6As2_149_6131.vasp,Ga1Ag1Te6As2,-1.397683352,0.268445714666665 -Na1Ni1As2Se6_149_11912.vasp,Na1Ni1As2Se6,-1.898480064,0.2690377139166646 -Ga1Sb1_187_6264.vasp,Ga1Sb1,-1.496700925,-0.36763217 -Sr4Sb4Te8F4_14_17473.vasp,Sr4Sb4Te8F4,-2.371673357,0.0490295619999988 -Ag2I2_51_317.vasp,Ag2I2,0.51917315,0.1716998449999999 -Zn2Ga2O5_156_21081.vasp,Zn2Ga2O5,-3.3767781144444444,-0.1379714148611143 -Ta2C1_164_17681.vasp,Ta2C1,-7.343368843333334,1.2686039666666655 -K6In2P4_49_9538.vasp,K6In2P4,-1.2035728158333334,0.1435616191666666 -Ga1Te1Br1_3_6288.vasp,Ga1Te1Br1,-1.3089821933333334,0.2207620466666666 -Hf1Cd1Se2Cl2_8_7138.vasp,Hf1Cd1Se2Cl2,-2.345925783333333,0.0270390306249983 -Rh2Br6_189_15177.vasp,Rh2Br6,-0.49850125,0.56440773 -Ga1Pt5I2_38_6253.vasp,Ga1Pt5I2,-1.3285740325,0.1789023853047502 -Tl4V4O12_57_19637.vasp,Tl4V4O12,-4.4815027005,0.1308212172142815 -Nb8C4_51_13206.vasp,Nb8C4,-6.200054865833334,1.7425293099999992 -Zr6N2F26_164_21861.vasp,Zr6N2F26,-4.111654831176471,0.323337794509796 -Au2S4F2_1_1526.vasp,Au2S4F2,-1.43237379875,0.2023881073046874 -K2Te2C2S6F6_1_9368.vasp,K2Te2C2S6F6,-2.5691483277777776,0.4430329698842571 -Nb4Co8S8_59_13060.vasp,Nb4Co8S8,-3.5302530665,0.2044757198333298 -Cr2W2O10_85_4537.vasp,Cr2W2O10,-5.540741295714286,-0.1250083277678615 -Nb1Se1S1_156_12576.vasp,Nb1Se1S1,-4.48714536,0.1680911133333325 -Cr2Pd1S4_164_4460.vasp,Cr2Pd1S4,-2.935576074285714,0.0934279778571407 -Na2Os2S2N2Cl10_1_12252.vasp,Na2Os2S2N2Cl10,-2.371713000555556,-0.003081360436517 -Sn4Sb4S4_17_16965.vasp,Sn4Sb4S4,-2.138743865,0.2649986399999978 -In4Te4_11_8703.vasp,In4Te4,-1.21517035375,0.16983866625 -Sb2Se2I2_31_15693.vasp,Sb2Se2I2,-1.3787359866666666,0.2204073541666669 -K2I2F8_127_9204.vasp,K2I2F8,-1.4622330308333331,0.1997427891666667 -Na6Te2O8F2_11_12447.vasp,Na6Te2O8F2,-3.0032337088888887,0.3129157020833304 -Ni2H4Se2O8_4_13518.vasp,Ni2H4Se2O8,-3.546339674375,-0.1550296814583331 -Na1Y1C1O10_3_11957.vasp,Na1Y1C1O10,-4.329169423076923,0.5237974709294768 -Cr2I4_14_4414.vasp,Cr2I4,-0.8013072816666668,0.3584573238888876 -Mo2Cl6_12_11600.vasp,Mo2Cl6,-1.81746137375,0.1126211472916645 -Ca1Cu4I2Br3O4_1_2830.vasp,Ca1Cu4I2Br3O4,-1.3547315092857144,0.2082685485160053 -V1H2O2_164_19849.vasp,V1H2O2,-4.546280506,0.1843432114444387 -Mg2Sn1_65_10516.vasp,Mg2Sn1,-0.01675422,-0.0138353466666666 -Ca2Ni2Ge2_129_3078.vasp,Ca2Ni2Ge2,-1.0474946183333331,0.1916640349999998 -Sr1Sn1I2O2_1_17085.vasp,Sr1Sn1I2O2,-2.5401440466666667,0.2834872802777775 -Ni2Se1Cl5_8_13626.vasp,Ni2Se1Cl5,-0.51135566875,0.0728115546875 -Cr5Bi6Se16_8_4626.vasp,Cr5Bi6Se16,-2.3009136333333333,0.0657232639506137 -Ag2Se4Cl2_4_441.vasp,Ag2Se4Cl2,-0.93040387375,0.1218393068750001 -Te2Pt1_187_18480.vasp,Te2Pt1,-1.41917147,0.4260159783333332 -Hf2Te1Se1_25_7628.vasp,Hf2Te1Se1,-4.09215146,0.2884924059374999 -Ta2Se6_59_17882.vasp,Ta2Se6,-3.9537531775,0.0960555381249999 -Cu2Te1S2I2_1_5325.vasp,Cu2Te1S2I2,-0.6349904514285714,0.2699217332142851 -Sb1Se1I1_156_15500.vasp,Sb1Se1I1,-1.38301549,0.2161278508333335 -Be1Br2_164_2216.vasp,Be1Br2,-1.802390816666667,0.2858458100000001 -Hg1I1Br1_8_7877.vasp,Hg1I1Br1,0.7128885,0.0629897047222222 -Te2Pb2_129_18458.vasp,Te2Pb2,-1.3465795925,-1.4073467675 -Co2Te2_164_4040.vasp,Co2Te2,-1.3725522425,0.2792500108333333 -Sn2I2_164_16785.vasp,Sn2I2,-0.4931329075,-0.6083112104166666 -Mg2In2Te5_164_10474.vasp,Mg2In2Te5,-1.4534105744444443,0.0575765683333332 -C1N1Cl1_25_2733.vasp,C1N1Cl1,-4.589643343333333,0.1816034993749971 -Ni1Ir1S2I2Cl2_8_13368.vasp,Ni1Ir1S2I2Cl2,-1.10863420125,0.07061690421875 -Hf1Br1Cl1_156_7125.vasp,Hf1Br1Cl1,-3.142781863333333,0.2843931160416606 -Y1W1F5_47_20689.vasp,Y1W1F5,-3.54981126,1.2340675867857098 -Sc1Nb1Zn1S4I1Br2_1_15964.vasp,Sc1Nb1Zn1S4I1Br2,-2.539471799,0.2135470936499922 -Sc1Mn2Br3N1O3_1_15956.vasp,Sc1Mn2Br3N1O3,-3.483483879,0.1608517878958227 -Hf3S2N2_187_7725.vasp,Hf3S2N2,-6.892124278571429,0.0086734335714222 -Tm2Se2I2_59_19687.vasp,Tm2Se2I2,-2.8205614000000003,0.043738826666666 -Au1C1N1_25_1417.vasp,Au1C1N1,-4.240659133333334,0.9632488955555508 -Li4As4S8_29_10159.vasp,Li4As4S8,-3.106046246875,0.0840696793749997 -Nb3Ir1Se8_1_12984.vasp,Nb3Ir1Se8,-3.8184131741666665,-0.0382397295833327 -H2Pb1O2_164_7001.vasp,H2Pb1O2,-3.798156066,0.0420033250416658 -Na1Sb5O8_1_11932.vasp,Na1Sb5O8,-3.992197717142857,0.1695788599107106 -Ba2Fe2Sn2_12_1984.vasp,Ba2Fe2Sn2,-0.567944295,1.0516673283333318 -Rb4Cd2I8_11_14966.vasp,Rb4Cd2I8,-0.0711168442857142,0.1652622271428571 -Cd2Sb2Br2O4_11_3552.vasp,Cd2Sb2Br2O4,-2.359308667,0.1595379179999998 -Zn2W2S2O12_4_21194.vasp,Zn2W2S2O12,-4.421491107222222,0.128350045041664 -Ti2F8_1_18937.vasp,Ti2F8,-4.319682611999999,0.0574561850000003 -Sb2Ir1S1I2_1_15596.vasp,Sb2Ir1S1I2,-1.7365522016666668,0.3754856678124977 -Ba2Ti3O8_123_2073.vasp,Ba2Ti3O8,-6.3626143861538464,0.0360224403846158 -Nb2Te1S1Br2_8_12901.vasp,Nb2Te1S1Br2,-3.2804854183333334,0.1625912745039582 -Hf2Ga1S5Br2_1_7494.vasp,Hf2Ga1S5Br2,-3.704576639,0.2499541997499959 -U1O2F2_10_19696.vasp,U1O2F2,-6.047059964000001,0.0466249105499958 -Bi8Pb4_26_2689.vasp,Bi8Pb4,-0.9059328516666666,-0.1519588150000006 -Ag2O2_10_339.vasp,Ag2O2,-1.17488469,0.1922178624999999 -Ba2Sr2_164_2063.vasp,Ba2Sr2,0.6361061675,0.9911689825 -Ru1Rh1S2Br2_8_15283.vasp,Ru1Rh1S2Br2,-1.9041246,0.5241000737908439 -W1I2_164_20437.vasp,W1I2,-1.17602283,0.8946677230555555 -Tc2N4_187_18232.vasp,Tc2N4,-7.162201453333334,-0.3974919170833342 -Mn2Sb2S6_162_11244.vasp,Mn2Sb2S6,-2.718389093,0.3773392824999982 -Ni1Te1Pd1Se2Cl1_1_13430.vasp,Ni1Te1Pd1Se2Cl1,-1.1040270783333332,0.1476344720659701 -Cu2Re1Cl6_147_5233.vasp,Cu2Re1Cl6,-1.3296274177777778,0.4073096643827146 -Cr12I24_127_4094.vasp,Cr12I24,-1.0233741538888887,0.1363904516666656 -K2H2O2_4_9124.vasp,K2H2O2,-3.084485471666667,0.1268235616666659 -Zn1H2O2_164_20953.vasp,Zn1H2O2,-3.3626424040000003,0.1014354979999994 -Li2V4O8_1_10134.vasp,Li2V4O8,-5.293436318571429,0.1511933021428575 -Hf2Se2_164_7609.vasp,Hf2Se2,-4.3872093325,0.1800054824999994 -Si2Se2F2_59_16448.vasp,Si2Se2F2,-2.926475136666667,0.4896880746874965 -Sb2_164_15753.vasp,Sb2,-2.02556701,0.2580000624999998 -Hf2C2Br2_59_7463.vasp,Hf2C2Br2,-5.131425943333333,0.6186857999999962 -Al2Se2_164_969.vasp,Al2Se2,-2.895069035,0.05329001 -Ge2Br1Cl1_1_6752.vasp,Ge2Br1Cl1,-1.8170264475,0.0807048275 -Tl2H8C14N6O2_2_19430.vasp,Tl2H8C14N6O2,-5.8021057871875,0.3280696246874994 -Cr1I2_115_4200.vasp,Cr1I2,-0.5019847000000001,0.6577799055555543 -Rb2C2O6F2_1_14785.vasp,Rb2C2O6F2,-4.043724376666667,0.0859188727083307 -Rh2S2I2_59_15221.vasp,Rh2S2I2,-1.8997788716666664,0.1075867727777759 -Na4Zn2Cl8_11_12431.vasp,Na4Zn2Cl8,-1.355451357857143,0.1251047285714284 -V3Zn2O8_10_20298.vasp,V3Zn2O8,-4.422062577692308,0.1864213057692283 -Ta3Te14Pd3_6_17993.vasp,Ta3Te14Pd3,-2.411792588,0.0844758675416642 -Zr2Sb1Se2_164_21660.vasp,Zr2Sb1Se2,-3.857423814,-0.188466937749999 -Li1B1C1_156_9660.vasp,Li1B1C1,-5.2359538033333335,0.4017757033333327 -Sb1S2_164_15494.vasp,Sb1S2,-2.5674959,0.2054791665624975 -Zr1W2O8_164_21488.vasp,Zr1W2O8,-6.229905385454546,-0.006155035000007 -Ca3Mn2S5Cl2_123_3188.vasp,Ca3Mn2S5Cl2,-2.594681893333333,0.2107170162499967 -Ir2S1I2O1_6_8810.vasp,Ir2S1I2O1,-2.266748723333333,0.5634354384722153 -Si2N2_187_16413.vasp,Si2N2,-6.336942235,-0.8714346362500001 -V4O4F12_2_20348.vasp,V4O4F12,-3.7900897815,-0.6601831722499996 -Li1C6_183_9668.vasp,Li1C6,-7.069080698571428,0.1334195630476131 -Li1C2_99_9667.vasp,Li1C2,-3.550614003333333,2.427622318518513 -Sc2Te6P2_162_16186.vasp,Sc2Te6P2,-2.551452052,0.2691214214999984 -Zn1Pd3Se3S2Cl3_1_20994.vasp,Zn1Pd3Se3S2Cl3,-1.247195765,0.2321031189062488 -Be3Sb3_25_2282.vasp,Be3Sb3,-2.3604710516666665,-0.0931086229166664 -W2I2N2_59_20498.vasp,W2I2N2,-4.328878311666666,0.2903952151388846 -U2S10_4_19720.vasp,U2S10,-4.248197399166666,0.0789161806249962 -V1Te2_115_19941.vasp,V1Te2,-1.8300040133333333,0.5372370444444443 -Hg4S2O8_13_8086.vasp,Hg4S2O8,-2.328428245714285,0.1774095092857148 -Y1Sn5_47_20680.vasp,Y1Sn5,-1.7573320083333333,-1.277287609999999 -V6Rh18_1_20393.vasp,V6Rh18,-1.930542682083333,0.7976095729166668 -Ca2Co2Sn2_129_2990.vasp,Ca2Co2Sn2,-0.98246646,0.3267934166666656 -Hg2O2_12_7977.vasp,Hg2O2,-0.49334353,0.2775018383333333 -Ta6Ir18_183_18147.vasp,Ta6Ir18,-3.874397857916666,1.502456942083334 -Hf3Ti1O8_6_7739.vasp,Hf3Ti1O8,-7.371263888333334,0.285320166666666 -Y2Cl2_129_20718.vasp,Y2Cl2,-2.93365794,0.8220059674999961 -Si2Ag2O6_51_16380.vasp,Si2Ag2O6,-4.167356452,0.2254323169999992 -Ge2Bi4O10_26_6750.vasp,Ge2Bi4O10,-4.1041341075,0.1758411488671871 -Zr1Nb2Br2N1O1_6_21365.vasp,Zr1Nb2Br2N1O1,-5.20673543,0.3806966765476125 -Ba2Au1Cl2O2_123_1904.vasp,Ba2Au1Cl2O2,-2.735360302857143,0.1852537330612191 -Ca1Ti8S16_164_2897.vasp,Ca1Ti8S16,-5.0208358812,-0.0676444971000047 -Mn1Sb1Te1Se2_1_10866.vasp,Mn1Sb1Te1Se2,-2.02864057,0.1160466274999983 -Co2Sb2Pd2_129_3997.vasp,Co2Sb2Pd2,-1.5482716866666666,0.3575504859090871 -Mo4N3_164_11751.vasp,Mo4N3,-4.999348222857143,0.419203375714285 -Y3I7O1_156_20800.vasp,Y3I7O1,-2.8514093245454544,0.1341614749999962 -Fe2I2N2_59_5862.vasp,Fe2I2N2,-2.255838685,0.1589121191666617 -C1Br1N1_25_2721.vasp,C1Br1N1,-4.37357797,0.3290641322222178 -Ba4Hg4Se8_26_2158.vasp,Ba4Hg4Se8,-1.351396908125,0.1160870412500001 -Fe2O4F2_2_5895.vasp,Fe2O4F2,-2.7406865225,0.2977249049999972 -Rb2I2Cl8_127_14892.vasp,Rb2I2Cl8,-0.6214219083333333,0.1173301691666667 -Al1Cu1Se1S1Br2_25_648.vasp,Al1Cu1Se1S1Br2,-1.5610114433333333,0.3023550907870337 -Ta2F2_12_17721.vasp,Ta2F2,-5.44751234,0.7278129555000006 -Rh2S2F2_11_15219.vasp,Rh2S2F2,-2.63502144,0.0465342619696924 -Mn2N2F2_59_11157.vasp,Mn2N2F2,-3.80883468,0.3558758720833281 -Ag2Sb4Se3Br2_6_414.vasp,Ag2Sb4Se3Br2,-1.2582583372727272,0.2438557213636346 -Ba4Mn2Br2O6_129_2160.vasp,Ba4Mn2Br2O6,-3.8125634592857143,0.1513138317056625 -Mg1Sb2O5_38_10399.vasp,Mg1Sb2O5,-4.01876948,0.4583347865625007 -Ba1F2_115_1828.vasp,Ba1F2,-3.26832556,0.6038851933333333 -Ag1Mo1Br4_2_86.vasp,Ag1Mo1Br4,-0.8103523516666667,0.1204735185416646 -Sr4As4Se8Cl4_14_17407.vasp,Sr4As4Se8Cl4,-2.505815731,0.0236745030000005 -Sc1In2I2O3_1_15951.vasp,Sc1In2I2O3,-3.203165825,0.3260520368749993 -Sr2N2O6F2_59_17284.vasp,Sr2N2O6F2,-4.420025328333334,0.1477959972916669 -Ti4H2N3O2_164_19138.vasp,Ti4H2N3O2,-7.019339176363636,-0.5659939014394046 -Li2Cu2P2O8_51_9892.vasp,Li2Cu2P2O8,-4.13826491,0.4114593118749966 -Pt2S2I1Cl1_6_14655.vasp,Pt2S2I1Cl1,-1.66656458,0.0931455095833321 -Ca3Au2I2O4_123_3151.vasp,Ca3Au2I2O4,-2.386021758181818,0.2049495861818162 -Na1Bi3_187_11829.vasp,Na1Bi3,-0.696225305,-0.2838222975 -Ta4Co8Te8_59_18030.vasp,Ta4Co8Te8,-3.008259853,0.1090315594999999 -Ti1Te1Se1_156_18856.vasp,Ti1Te1Se1,-3.84946908,0.2055301333333328 -Zn1H1_1_20952.vasp,Zn1H1,-0.18742392,1.0270821475 -Bi14I4_11_2303.vasp,Bi14I4,-0.9342662,-0.460617158703704 -Hg1S2_187_7911.vasp,Hg1S2,-0.3444174633333333,0.6656863764583325 -Sr2Cu1Se2F2_38_17206.vasp,Sr2Cu1Se2F2,-2.087560111428572,0.5306630080952337 -P4S14_18_14108.vasp,P4S14,-2.7214040177777776,0.3414728331944414 -Pt2S2_129_14662.vasp,Pt2S2,-1.9307857425,0.6842954175 -Sb12Se12_7_15419.vasp,Sb12Se12,-2.05057511375,0.2972025899999979 -As8O12_2_1396.vasp,As8O12,-4.0974397155,0.3877978564999997 -Fe2W2S2O12_8_6034.vasp,Fe2W2S2O12,-4.685313956666667,0.1855455588888857 -Al4S4Br4_14_1084.vasp,Al4S4Br4,-2.758059065,0.0257134633333335 -Li4V4O4F12_14_10247.vasp,Li4V4O4F12,-4.037755191666666,-0.0767759683333377 -Y2Mg2_164_20754.vasp,Y2Mg2,-1.772896445,0.3629433124999999 -Ni1Te1Se1I1_1_13432.vasp,Ni1Te1Se1I1,-0.51771381,0.2324737951562488 -Ba1Co4O8_162_1820.vasp,Ba1Co4O8,-3.628983983846154,-0.0472057863461611 -V2H4Se2O10_2_20084.vasp,V2H4Se2O10,-4.432505713333333,0.0921164134259218 -Hf4B3F2_164_7762.vasp,Hf4B3F2,-5.964923083333334,-0.0386277058333384 -Ta2Ni4Se4_51_17802.vasp,Ta2Ni4Se4,-2.487939701,0.0524801868000002 -Sn2I4_12_16786.vasp,Sn2I4,-0.5243022,0.1912678911111111 -Mg3Au1_187_10543.vasp,Mg3Au1,0.308513285,0.60080312125 -Ir2Br2_129_8766.vasp,Ir2Br2,-0.774475385,1.8184880783333317 -Mn2Fe1O6_12_11071.vasp,Mn2Fe1O6,-4.010473378888888,0.2133801381944372 -V1Cr1S2I1Br1_25_19807.vasp,V1Cr1S2I1Br1,-2.5161980616666666,-0.0151040720833361 -Cu1Ag1Br2_1_4816.vasp,Cu1Ag1Br2,0.0936059125,0.2354324975 -Nb1Ni2Te1Br1_1_12546.vasp,Nb1Ni2Te1Br1,-1.339990914,0.3875811154805172 -Pd2Pt1F5_1_14452.vasp,Pd2Pt1F5,-1.1424598525,0.3293660706249984 -V2H4C4N2O2F4_2_20081.vasp,V2H4C4N2O2F4,-5.146532481666666,0.0073605740856335 -Zr2Se2N1_164_21677.vasp,Zr2Se2N1,-5.247317836,0.006508176500001 -Cu2Te4As2_26_5349.vasp,Cu2Te4As2,-1.20644268375,0.2255110516666642 -Cs2Hg4I6O8_31_4727.vasp,Cs2Hg4I6O8,-0.828512345,0.5382318244999978 -Sb10O14F2_1_15408.vasp,Sb10O14F2,-4.038220832692308,0.0975998096153847 -Cu1Ag1Se1S1I2_8_4827.vasp,Cu1Ag1Se1S1I2,-0.465300275,0.1355498589583327 -Na1In1P2S6_5_11886.vasp,Na1In1P2S6,-2.9848368140000003,0.0597154265491037 -Rh2S6_2_15229.vasp,Rh2S6,-2.75469229,0.4298729491145807 -In2Se4_12_8594.vasp,In2Se4,-1.5779782716666666,0.4602876755555536 -La2Ge2I2_164_9593.vasp,La2Ge2I2,-2.913983398333333,0.0425779133333334 -Co2Se6_11_4028.vasp,Co2Se6,-2.03158848875,0.4066990212499998 -Sn1Sb1S1I1Br1O1_1_16684.vasp,Sn1Sb1S1I1Br1O1,-2.1243506450000003,-0.217455457638894 -Cu1Ge1Se1S1Br1Cl1_6_4884.vasp,Cu1Ge1Se1S1Br1Cl1,-1.4860937016666669,0.2621409480787 -Y1I1Cl1_156_20641.vasp,Y1I1Cl1,-2.848714446666667,0.1543341738888858 -Fe1Pb2C6N6_147_5735.vasp,Fe1Pb2C6N6,-5.870701216666666,0.1798747651666622 -Ta2Te2F2_59_17902.vasp,Ta2Te2F2,-4.115786141666667,0.2894070763333248 -Sn4Te4Pd4_14_16974.vasp,Sn4Te4Pd4,-1.3545818741666666,0.2169291708333334 -Ag1Cl2_187_49.vasp,Ag1Cl2,0.0630813533333333,0.2622932266666666 -Tl1V3Se2O12_143_19355.vasp,Tl1V3Se2O12,-4.609206477777778,-0.0176997991666665 -Fe2As2Br2O4_26_5773.vasp,Fe2As2Br2O4,-3.178685214,0.0121380932333253 -Pb1W1S4_3_14212.vasp,Pb1W1S4,-3.211924991666667,-0.3149337184375018 -Zn1As1_8_20895.vasp,Zn1As1,-0.035030395,0.6716200728124985 -Os2I2O2_59_13850.vasp,Os2I2O2,-2.956254578333333,0.6494520872916629 -As1Br2_187_1137.vasp,As1Br2,-0.9050261266666668,0.4912376888888874 -In2Sb4Se8Br2_11_8572.vasp,In2Sb4Se8Br2,-1.95958373375,0.0991504087500003 -Bi8_55_2702.vasp,Bi8,-0.85122286125,-0.38435486625 -Mg2Sb2Te6_162_10506.vasp,Mg2Sb2Te6,-1.428062832,0.2996885376666651 -Si4I12_26_16493.vasp,Si4I12,-1.008136178125,0.0916438815625 -Tl4S4Cl4_14_19620.vasp,Tl4S4Cl4,-1.2271049383333332,0.2638552014583321 -Ir2Pb8_125_8803.vasp,Ir2Pb8,-1.235568952,0.8692237240000003 -Fe2P2Se4I2_26_5922.vasp,Fe2P2Se4I2,-1.890628418,0.2410146374444436 -Tl12Ag4Te8_14_19188.vasp,Tl12Ag4Te8,-0.4416155245833333,0.1341323325 -V1B4H5S6_2_19776.vasp,V1B4H5S6,-3.78356146875,0.7496886838281203 -S8O18_147_15407.vasp,S8O18,-4.056674893846154,0.253141234038458 -Ta4S12_2_18099.vasp,Ta4S12,-4.63787684375,0.1289072012500005 -Sr2Cu2_191_17214.vasp,Sr2Cu2,0.603490665,0.202581665 -Te2H4O8_7_18384.vasp,Te2H4O8,-3.9068863142857135,0.0534460770238021 -Li1Ag1F4_1_9634.vasp,Li1Ag1F4,-1.6898946266666668,-0.3026658816666681 -La2I2O2_129_9595.vasp,La2I2O2,-4.584111455,0.0581308383333336 -Al2Te4_1_1018.vasp,Al2Te4,-1.7056593166666667,0.3669347730208291 -Mn1Co1Ir1Cl1O4_1_10669.vasp,Mn1Co1Ir1Cl1O4,-3.558103515,0.1285221931249999 -Sn2Sb2O6_162_16863.vasp,Sn2Sb2O6,-3.944800183,0.2433326879999973 -Ni2W2S8I2_129_13690.vasp,Ni2W2S8I2,-2.150997335,0.5014822011607112 -Zr1Fe1H6_149_21290.vasp,Zr1Fe1H6,-3.1151768675,0.8138882175000004 -Zr1F2_187_21285.vasp,Zr1F2,-4.148428746666666,0.3517781366666627 -Sb4S10_31_15812.vasp,Sb4S10,-2.4286006064285712,0.3222187076785696 -Ta1Br4_123_17521.vasp,Ta1Br4,-2.029153698,0.3706235764375001 -Mn1Sn1S1Br2_156_10894.vasp,Mn1Sn1S1Br2,-1.714923942,0.2055494276428529 -Fe2C2I2_59_5833.vasp,Fe2C2I2,-2.1553530016666667,0.9142477570833296 -Sc3Bi1Br2O3_1_16197.vasp,Sc3Bi1Br2O3,-4.254050926666667,0.1881964066203658 -Si4P8_26_16504.vasp,Si4P8,-4.23597537,-1.365590079166667 -Hf1Zr1Sc1I2N1O3_1_7396.vasp,Hf1Zr1Sc1I2N1O3,-5.477498152222222,0.2851114033333286 -Nb2Cl2O3_8_12677.vasp,Nb2Cl2O3,-5.263617482857143,0.2315297698214307 -Zn2Sb4O8_51_21157.vasp,Zn2Sb4O8,-3.344192980714286,0.3479632074999977 -Rh1S2_164_15166.vasp,Rh1S2,-2.743537213333333,0.4372306899999973 -Si1B1H2_156_16318.vasp,Si1B1H2,-4.0009418425,0.1924070671249957 -Al2Cl6_162_795.vasp,Al2Cl6,-2.24921562125,0.0352941325000002 -Tl2B2S6_7_19369.vasp,Tl2B2S6,-3.128411063,0.0978110494999935 -Ba4Bi4S8Cl4_14_2140.vasp,Ba4Bi4S8Cl4,-2.622602855,0.1479312277500003 -Cu1Te1O4_10_4989.vasp,Cu1Te1O4,-3.0635139033333334,0.1473093954166668 -Sr1H12Au2_115_17052.vasp,Sr1H12Au2,-2.3330222513333334,1.5152621430000002 -S3N3Cl3_6_15392.vasp,S3N3Cl3,-2.9032409233333336,0.4048018716666663 -In2Hg1O4_164_8469.vasp,In2Hg1O4,-2.740362615714286,0.287549262142857 -Sc1Sn4Cl3O6_1_16009.vasp,Sc1Sn4Cl3O6,-3.617040054285714,0.2041362608482064 -Nb1Ni1Sn1Cl3O4_1_12543.vasp,Nb1Ni1Sn1Cl3O4,-3.5556351200000003,0.0275280602499914 -In2Ni2Te5_164_8503.vasp,In2Ni2Te5,-0.8852219577777778,0.1073230061111095 -Ca2H2Cl2_129_3031.vasp,Ca2H2Cl2,-2.56297047,0.0618864199999995 -Tl1Pd1I2_25_19316.vasp,Tl1Pd1I2,-0.2117162925,0.3225868290625 -Ta4Si2Se8_55_18114.vasp,Ta4Si2Se8,-4.537294325714286,0.0930080656646742 -Cd3P1_191_3616.vasp,Cd3P1,1.337620545,0.3459828596875001 -Na2C2Se2N2_31_12005.vasp,Na2C2Se2N2,-4.4663959475,0.057908672291661 -K2H2C6N12_2_9121.vasp,K2H2C6N12,-5.860214145454545,0.0693333898484793 -V1In2Te4_164_19875.vasp,V1In2Te4,-1.5737893757142858,0.2321762319047601 -Mn4F10_13_11433.vasp,Mn4F10,-2.686133922142857,-0.1425838814285736 -Fe2Br2N2_59_5816.vasp,Fe2Br2N2,-2.465791805,0.3756664979166619 -Zn1S1_123_21003.vasp,Zn1S1,-0.48510273,0.7065573645000001 -As1Cl5_10_1145.vasp,As1Cl5,-0.762459095,0.3672362891666657 -N2_51_11789.vasp,N2,-6.474166275,-0.9404156524999996 -Mn1Mo1Se2Br3Cl1_1_10800.vasp,Mn1Mo1Se2Br3Cl1,-1.629439135,0.1979401971153803 -Cu2Hg2S2F2_26_5156.vasp,Cu2Hg2S2F2,-0.49959318375,0.1708967945833333 -Na8Zn4S8_29_12456.vasp,Na8Zn4S8,-1.6529101220000002,0.1642783278666652 -Te4Pd2Pb4Cl4O12_14_18616.vasp,Te4Pd2Pb4Cl4O12,-2.9490992865384618,0.1088797055448654 -Ge3Bi1Br3O5_1_6904.vasp,Ge3Bi1Br3O5,-3.3556376983333336,0.1182426440624979 -Fe1H4C6I2_47_5704.vasp,Fe1H4C6I2,-4.509953309230769,0.3451461532692233 -Cu1Hg1O2_10_4904.vasp,Cu1Hg1O2,-1.199278845,0.4225380882291665 -Na4Te2O10_51_12422.vasp,Na4Te2O10,-2.89472034,0.7062984018749999 -Sn2As2H2O6_7_16717.vasp,Sn2As2H2O6,-3.91247755,0.3244328477083285 -Hf1Mn1Br2N1_156_7207.vasp,Hf1Mn1Br2N1,-3.950865348,0.2405976035258633 -Si1H1W4O10_1_16336.vasp,Si1H1W4O10,-5.7146689275,0.407521994225653 -Zr2Cl6_189_21554.vasp,Zr2Cl6,-2.76649972125,0.2031631349999996 -Tl1Ge1S2Br2_1_19276.vasp,Tl1Ge1S2Br2,-1.58970428,0.2520847007812483 -Mn2Se1S1Cl2_8_11273.vasp,Mn2Se1S1Cl2,-2.0166485533333334,0.2957594073611078 -Ni2Se1S3_8_13628.vasp,Ni2Se1S3,-1.6191474566666668,0.1728137594097177 -V2Te2_164_20216.vasp,V2Te2,-2.2361550475,0.5390900553571403 -Bi1Se2S6F1_1_2393.vasp,Bi1Se2S6F1,-2.084606031,0.4668700080416624 -Ir1Pt3Br4O4_3_8750.vasp,Ir1Pt3Br4O4,-2.064626186666666,0.3115139832291647 -Hg3Cl6_143_8056.vasp,Hg3Cl6,0.2174652566666666,0.0872270799999999 -Ge1Pt1Br2O2_6_6693.vasp,Ge1Pt1Br2O2,-2.396127051666667,0.437335140833333 -K2Ge6As6_26_9114.vasp,K2Ge6As6,-2.718474765714286,0.124412756785714 -Ba2As1_25_1901.vasp,Ba2As1,-1.1819712066666666,0.7250702966666651 -Ni1Ir2Se1Br1Cl2O1_6_13372.vasp,Ni1Ir2Se1Br1Cl2O1,-1.66852384,0.4077956694270808 -H2W3N2O2_187_7038.vasp,H2W3N2O2,-5.584356425555556,-1.2845903581695757 -Cu1F2_187_4875.vasp,Cu1F2,-0.8368291466666666,0.4602362133333333 -Au2Cl4_14_1474.vasp,Au2Cl4,0.01820738,0.0763666316666666 -Nb4Se6_11_13153.vasp,Nb4Se6,-4.408510145999999,-0.4978891032500026 -Nb2I4O2_3_12749.vasp,Nb2I4O2,-3.50970492375,0.0622919412499998 -Sr4Sb4S8Cl4_14_17468.vasp,Sr4Sb4S8Cl4,-2.7109942755,-0.2761871107500049 -Re1Se2_187_15023.vasp,Re1Se2,-3.87666018,0.285103658333333 -K2Cl1_164_9075.vasp,K2Cl1,-0.3832679566666666,0.141488266666666 -Nb2Te2_123_12917.vasp,Nb2Te2,-3.8385794225,-0.2059071916666706 -Pa2Bi4_129_14165.vasp,Pa2Bi4,-2.92247279,0.1799396272222191 -Sb1Pd1_187_15482.vasp,Sb1Pd1,-1.050690425,0.9538775183333336 -Sr2C2O6_10_17161.vasp,Sr2C2O6,-5.5033387320000005,0.3349340529999995 -Cd2Ag2Te2F2_26_3451.vasp,Cd2Ag2Te2F2,-0.15979009375,0.036070974375 -H4Au4S4F4_2_7064.vasp,H4Au4S4F4,-1.71648919125,0.3617757162499999 -In2O2_129_8511.vasp,In2O2,-2.985768165,0.5945510325000001 -Ge1S1_123_6696.vasp,Ge1S1,-2.665683,-0.41453514625 -Co2Sb4Cl4O6_11_4012.vasp,Co2Sb4Cl4O6,-3.14128520625,-0.0053768317708364 -As2S2_12_1293.vasp,As2S2,-2.67459699,0.3353029784374999 -Tl2O2_187_19468.vasp,Tl2O2,-2.0084799825,0.3994452072916643 -Fe1Sn2C6N6_164_5761.vasp,Fe1Sn2C6N6,-5.960617261333334,-0.4347892268333371 -Mo2F8_7_11609.vasp,Mo2F8,-3.055303962,-0.2478192398333358 -Sb2H6Pb2N2O6_7_15586.vasp,Sb2H6Pb2N2O6,-4.0304936188888885,0.0676856438888855 -Rh1Br2_164_15144.vasp,Rh1Br2,-0.88190167,0.40534464111111 -Mo4C3S2_164_11738.vasp,Mo4C3S2,-4.90325517,0.2308315094444402 -Te4Au2Cl2_51_18568.vasp,Te4Au2Cl2,-0.58033597625,0.13427099625 -Na1Co1Te6P2_149_11850.vasp,Na1Co1Te6P2,-1.897593922,0.3902552794999988 -H8Au2C8I2_1_7090.vasp,H8Au2C8I2,-4.3298904305,0.2552207572500009 -V3Br8_156_20247.vasp,V3Br8,-1.6567466563636364,0.0600011345454529 -In2Se4_164_8595.vasp,In2Se4,-1.296339905,0.7419260422222203 -K4P4H8O16_13_9491.vasp,K4P4H8O16,-4.5980420084375,0.1140696673437497 -Zr1Mn1Cl2O2_1_21319.vasp,Zr1Mn1Cl2O2,-4.1166102,0.3727856533333331 -Li1Fe1Sb2O6_5_9698.vasp,Li1Fe1Sb2O6,-3.900455156000001,0.4501942417499953 -Rb2Hg2Pd1Br8_12_14862.vasp,Rb2Hg2Pd1Br8,-0.2501907569230769,0.0963441146153846 -Ta2N1F2_164_17779.vasp,Ta2N1F2,-5.93543384,0.5911068114666667 -Ca1Sb2O5_38_2876.vasp,Ca1Sb2O5,-4.095945515,0.4070430857499996 -Ta1Cr1I2N1_8_17535.vasp,Ta1Cr1I2N1,-3.706324796,0.4840959379999967 -Tl2Cu6S4_12_19406.vasp,Tl2Cu6S4,-0.8925172675,0.0381351341666666 -Ru1S2_187_15293.vasp,Ru1S2,-3.146074293333333,0.4686692350000001 -Ga1Ag1Se2_1_6129.vasp,Ga1Ag1Se2,-1.3722265525,0.2715219875000001 -Sc1O2_164_15970.vasp,Sc1O2,-5.380727803333333,0.6835119924999953 -Bi1P2Au1S6_143_2354.vasp,Bi1P2Au1S6,-2.631694531,0.0736551087499977 -Sr2Sb4S8_11_17313.vasp,Sr2Sb4S8,-2.835009167857143,-0.3851574767857166 -W1Br5_47_20424.vasp,W1Br5,-1.15271286,0.3319784499305556 -Ni2O4F2_11_13550.vasp,Ni2O4F2,-2.0481060325,0.1441222729687503 -Ti2C2Cl2_59_18916.vasp,Ti2C2Cl2,-5.245885501666667,0.7310638966666603 -Cr1F2_187_4170.vasp,Cr1F2,-2.8326751233333334,0.4529719899999971 -Na1Cd1Br2O1_1_11839.vasp,Na1Cd1Br2O1,-0.963356424,0.3606403701249974 -Y2H2N1O2_164_20740.vasp,Y2H2N1O2,-5.89615623,-1.039626091160723 -Ba2Zn2F8_31_2090.vasp,Ba2Zn2F8,-2.5802618041666667,0.1725476053571406 -U4Te3O4_123_19741.vasp,U4Te3O4,-6.667567596363637,0.0185007912878667 -Cr2Sb2S6_162_4482.vasp,Cr2Sb2S6,-2.839913092,0.3251570101666644 -V1O2_187_19894.vasp,V1O2,-5.388874653333333,0.2890644216666675 -Cr1Cu1Se2Br2_1_4157.vasp,Cr1Cu1Se2Br2,-1.3176142966666666,0.0391557848148135 -Tl2In2S6_31_19449.vasp,Tl2In2S6,-1.985543532,0.2083758411249975 -Cu2Cl4_14_5086.vasp,Cu2Cl4,-0.3593741216666666,0.1297809816666666 -Al1Cu1Ni1Se4I1_1_640.vasp,Al1Cu1Ni1Se4I1,-1.3497349275,-0.0698043617968748 -B1Br3_189_1619.vasp,B1Br3,-1.823174365,0.0859535387499998 -Sb2Pt3Se8_164_15665.vasp,Sb2Pt3Se8,-1.920567603076923,0.3944304876923056 -Mn3Co1Ni2S7Cl7_1_11370.vasp,Mn3Co1Ni2S7Cl7,-1.7987973920000002,0.1641054797812456 -V4P8S26_2_20352.vasp,V4P8S26,-3.338355713421053,0.0624516221052591 -V1I1F1_156_19865.vasp,V1I1F1,-2.006127793333333,0.1830317216666624 -K2C6O6F6_4_9037.vasp,K2C6O6F6,-4.643947537,0.0793670699999943 -K2C2S2Cl6O6_1_9019.vasp,K2C2S2Cl6O6,-3.178755247222222,0.1708534791666642 -Mn2Sb4O4F16_2_11262.vasp,Mn2Sb4O4F16,-2.896565741153846,0.0777844548901035 -V4Te6_2_20377.vasp,V4Te6,-2.477608304,0.0707257120000002 -Pb2W2O8_2_14299.vasp,Pb2W2O8,-5.2381433091666665,0.1228566999999998 -Cr1H1S2_156_4184.vasp,Cr1H1S2,-3.0328213975,0.7713284412500001 -Mn2Te2F2_59_11296.vasp,Mn2Te2F2,-2.063865385,0.2287047049999998 -Co2Br6_191_3879.vasp,Co2Br6,-0.42536275375,0.51149597875 -B1Mo2Se2_164_1628.vasp,B1Mo2Se2,-3.738514912,0.0895828500000002 -P4O8_31_14092.vasp,P4O8,-5.2893763125,0.1041838598333301 -Ca1Al1I2O2_1_2799.vasp,Ca1Al1I2O2,-3.297208933333333,0.2964497924315405 -Ta2Ni1Ru1Se6_1_17790.vasp,Ta2Ni1Ru1Se6,-3.527806244,0.181598138249997 -V2Co1O6_12_20042.vasp,V2Co1O6,-4.77522712,0.3489431961111005 -Sb2Au2Se4_26_15546.vasp,Sb2Au2Se4,-1.25853734625,0.5747243550000003 -H24Pb2C8S8N4O16_2_6985.vasp,H24Pb2C8S8N4O16,-4.498270583870968,0.2079583902284899 -Zr1Sb2H2S6_164_21424.vasp,Zr1Sb2H2S6,-2.852127168181818,0.6126171190909022 -Sc1Ag1Te6P2_149_15896.vasp,Sc1Ag1Te6P2,-1.952490321,0.262141600530298 -Ir2C8_67_8773.vasp,Ir2C8,-5.190929602,2.3443745060000007 -Ni2Te2O6_12_13663.vasp,Ni2Te2O6,-3.135234227,-0.2129505592500016 -Ge2As1O6_162_6726.vasp,Ge2As1O6,-4.4919922522222215,0.242339928402774 -Hf4Te1Se7_1_7819.vasp,Hf4Te1Se7,-4.30217814,0.3051217479166676 -H2W2C1O2_164_7031.vasp,H2W2C1O2,-5.204712555714286,0.5388692401311823 -Ni2Sb2Cl2O4_10_13605.vasp,Ni2Sb2Cl2O4,-2.606770265,0.6927244532499945 -Mn2Bi2O4F2_26_11005.vasp,Mn2Bi2O4F2,-3.450692287,0.0672531269999994 -Ag2S2Br2N2_31_375.vasp,Ag2S2Br2N2,-1.71185674125,0.2780390517187501 -Pt2N4_2_14640.vasp,Pt2N4,-3.361424055,1.4516756733333291 -Cu1I2_164_4909.vasp,Cu1I2,0.3905750966666666,0.1930775059722223 -La2I6_59_9598.vasp,La2I6,-1.81432304375,0.08243066875 -W2S4_127_20537.vasp,W2S4,-3.168586318333333,1.3040123316666672 -Mn2Al2S5_164_10955.vasp,Mn2Al2S5,-3.3164643566666667,-0.0461849527777775 -Li4P4S8_29_10216.vasp,Li4P4S8,-3.34513452125,0.000401177620443 -As6H2S12_4_1383.vasp,As6H2S12,-2.802942914,0.5832472551874999 -Sb6Pb6_12_15854.vasp,Sb6Pb6,-1.2474455391666666,0.5584310570833334 -Ni3Sb6_157_13720.vasp,Ni3Sb6,-1.2349893166666666,-0.6965271083333332 -Co2Te4Pd4_49_4047.vasp,Co2Te4Pd4,-1.313460453,-0.0966461474444471 -Zn1O1F1_156_20982.vasp,Zn1O1F1,-1.4831197166666668,0.6088335722916636 -Sr1Au2F12_115_17025.vasp,Sr1Au2F12,-1.2205214893333334,0.0148268386666665 -Si2F6_1_16402.vasp,Si2F6,-3.6485652025,0.1479301353125 -Cu4Br4O4_14_5400.vasp,Cu4Br4O4,-1.14089347,0.2312806587499986 -Sr4P4H4S8_14_17458.vasp,Sr4P4H4S8,-3.16300984,0.2457026279999932 -Cr1Sb2Au1Se6_149_4256.vasp,Cr1Sb2Au1Se6,-1.849396896,0.2960827594999995 -Sc1Se1Br1O1_1_15996.vasp,Sc1Se1Br1O1,-3.61230867,0.5195116108333334 -Mn2Au1F6_8_10988.vasp,Mn2Au1F6,-1.9899920622222225,0.2601153266666647 -Ba2Br2Cl2_11_1924.vasp,Ba2Br2Cl2,-2.20577793,0.2651996066666666 -Cd1H2S2_12_3339.vasp,Cd1H2S2,-2.099770998,0.1359164580000003 -Ag4C2O6_11_507.vasp,Ag4C2O6,-3.360828563333333,0.1884372116666668 -V1W1Se1I1Cl2_8_19957.vasp,V1W1Se1I1Cl2,-2.194701176666667,0.4636427016666632 -Sr2Tb2F12_51_17322.vasp,Sr2Tb2F12,-3.42074101,0.3440367410937504 -Sc1Cu1Sb2Te6_149_15930.vasp,Sc1Cu1Sb2Te6,-1.558681964,0.3264755425833316 -Sn2Ge1Cl2O5_1_16770.vasp,Sn2Ge1Cl2O5,-3.5474450230000003,0.2158110029999953 -B8_65_1796.vasp,B8,-5.532729395,0.6282559033333337 -Mo1F2_115_11509.vasp,Mo1F2,-2.614292353333333,0.4800985649999969 -Mn2I6_12_11118.vasp,Mn2I6,-0.311656475,0.13892964671875 -Mn2S2I2_59_11217.vasp,Mn2S2I2,-1.8168917033333327,0.2274665445833334 -Co2As2O7_1_3842.vasp,Co2As2O7,-3.8567350972727272,0.3410158232954505 -Cu2Te4_6_5358.vasp,Cu2Te4,-0.6604300633333333,0.2418188788888881 -Bi2S3_164_2520.vasp,Bi2S3,-2.449370772,-0.995948875 -K4Hg2S4_28_9463.vasp,K4Hg2S4,-0.7214400280000001,0.2663094984999999 -Hg3B2O6_150_8050.vasp,Hg3B2O6,-3.366216413636364,0.1951421559090906 -V2Sb2S6_157_20172.vasp,V2Sb2S6,-3.069721252,0.3226113865000002 -Mn3B2H2_187_11355.vasp,Mn3B2H2,-3.3972729857142854,0.6304963053571353 -Rb2P30_2_14916.vasp,Rb2P30,-3.8373599515625,-0.0076974138541696 -Eu1Re2O8_147_5593.vasp,Eu1Re2O8,-5.908079843636363,-0.2997852472916698 -Ba2Rh1_123_2049.vasp,Ba2Rh1,-0.5069515066666667,0.2661370511111103 -Tc4Se8_2_18256.vasp,Tc4Se8,-4.481319526666667,0.0669565441666666 -Si6As2_191_16523.vasp,Si6As2,-3.1099522,0.3221136104166668 -Ag2Pd1O2_47_368.vasp,Ag2Pd1O2,-1.336256144,0.165965431 -Na6O3_157_12443.vasp,Na6O3,-2.388068677777778,0.0962680922222221 -Tl1In1S2_1_19301.vasp,Tl1In1S2,-1.6474800025,0.4404480140625 -Ga2N2Cl2_59_6395.vasp,Ga2N2Cl2,-3.0300811233333333,0.5302037624999965 -Ge1Os1S2I4_1_6686.vasp,Ge1Os1S2I4,-1.47414575625,0.51072700453125 -Fe2Sb2Se4Cl2_26_5959.vasp,Fe2Sb2Se4Cl2,-1.904832618,0.1702408329999979 -Hf2Ge2Se2_129_7497.vasp,Hf2Ge2Se2,-4.543367651666666,0.1117130758333337 -Ga2Se2Br14_7_6465.vasp,Ga2Se2Br14,-0.7092672733333333,0.092210236666666 -Bi2Pt1S1I1Br1_1_2505.vasp,Bi2Pt1S1I1Br1,-1.3507413433333333,0.1294878901111058 -Ag4Sb4S8_7_556.vasp,Ag4Sb4S8,-1.695465624375,0.2407271106250001 -Tl2Bi2P4S12_4_19373.vasp,Tl2Bi2P4S12,-2.8305068775,0.0936373315000058 -Sr4Fe2S6Cl2_129_17438.vasp,Sr4Fe2S6Cl2,-2.668809743571429,-0.1763024517857188 -Cr2Cl4_14_4353.vasp,Cr2Cl4,-2.1934316983333333,-0.118531417222224 -Bi4Au3Br20_2_2593.vasp,Bi4Au3Br20,-0.3550598985185185,0.1754531757870367 -Zr1Sc1Cl2O2_1_21431.vasp,Zr1Sc1Cl2O2,-4.7289586266666666,0.3548535133333304 -Co1F2_187_3735.vasp,Co1F2,-1.5799281433333334,0.7347964191666665 -Na2Pt4Se6_164_12271.vasp,Na2Pt4Se6,-2.0392793758333334,0.1375316495833329 -Zn2As4S6Cl4_31_21035.vasp,Zn2As4S6Cl4,-1.930353074375,0.494392988984375 -Zr2C2I2_59_21545.vasp,Zr2C2I2,-4.276337963333334,0.3284037726190409 -Mn2Se2_129_11283.vasp,Mn2Se2,-2.303140585,-0.0146869337068986 -Zr1Fe1Cl6_149_21288.vasp,Zr1Fe1Cl6,-2.3277238425,0.0608391199999998 -Zr4O8_11_21838.vasp,Zr4O8,-6.154257216666667,1.0287319266666666 -Re2Br6_189_15035.vasp,Re2Br6,-907.0922118775,-904.8393368679166 -Mn2H2O2_59_11092.vasp,Mn2H2O2,-3.5248882266666666,0.8120929321264343 -Mn1Ge1H1Ir1O6_1_10735.vasp,Mn1Ge1H1Ir1O6,-4.4097835750000005,0.3047367212499912 -Zr1Pt1Se1Br3Cl2_1_21408.vasp,Zr1Pt1Se1Br3Cl2,-1.83700175125,0.2360027299999998 -Ga4P20_26_6559.vasp,Ga4P20,-3.60293413125,-0.1910951479166693 -Ti2Au2_129_18882.vasp,Ti2Au2,-2.729090145,0.0840500475000003 -Ir2Cl6_162_8779.vasp,Ir2Cl6,-1.6209092875,0.0631380162499999 -V1Te2Mo1S2_1_19939.vasp,V1Te2Mo1S2,-2.7297735333333333,0.3221721828472191 -K1_123_8963.vasp,K1,1.54447723,0.3097161699999999 -P2Cl6_12_13968.vasp,P2Cl6,-1.5293155825,0.2619493099999985 -Ce1Mg2_187_3647.vasp,Ce1Mg2,-0.4257827733333333,0.5969412316666658 -Zn2H4S2O8_7_21099.vasp,Zn2H4S2O8,-3.74633647125,0.0901434323385425 -Ag2Te4Br2_1_476.vasp,Ag2Te4Br2,-0.49021552375,0.1506955843749999 -Sm1Ge5_47_16556.vasp,Sm1Ge5,-2.934684406666667,-0.101082386111114 -V3N2O2_187_20282.vasp,V3N2O2,-5.926764042857143,0.0489686949999943 -Tl1Ge1Te3_143_19280.vasp,Tl1Ge1Te3,-1.131689984,0.3173326804583321 -Li1Sb2Te6Pd1_149_9785.vasp,Li1Sb2Te6Pd1,-1.499426804,-0.1417952626666684 -K4Sb4O8_14_9508.vasp,K4Sb4O8,-3.455562658125,0.194279168125 -Mo2H4O8_31_11616.vasp,Mo2H4O8,-4.710505572857143,0.0651411515476141 -Ba3In2Br2O5_123_2112.vasp,Ba3In2Br2O5,-3.659444118333333,0.0498527378333263 -Te6As2P2_8_18642.vasp,Te6As2P2,-1.964680858,0.3727917714999987 -Fe1H4C6Br2_47_5702.vasp,Fe1H4C6Br2,-4.637908661538462,0.4141327234615299 -Sn1O2_187_16662.vasp,Sn1O2,-3.692942753333333,0.6682765416666663 -Ti1W1I1Br1_8_18870.vasp,Ti1W1I1Br1,-3.0417397,0.4238025903124955 -In1H2S2_12_8270.vasp,In1H2S2,-2.621248,0.5757851242499954 -Tl2Pb2I6_51_19485.vasp,Tl2Pb2I6,-0.4736229879999999,0.1339655946666668 -Cs2Cd4Te2S6I6_31_4706.vasp,Cs2Cd4Te2S6I6,-0.629963256,0.203732136874998 -Tl1Ag1Se3Br1_1_19209.vasp,Tl1Ag1Se3Br1,-0.8285794616666666,-0.080528871944446 -Na4Cd2Br8_11_12376.vasp,Na4Cd2Br8,-0.8177039021428572,0.1604995257142852 -In1Se2_156_8345.vasp,In1Se2,-1.6191233333333337,0.4191426138888867 -Y1Si3_187_20675.vasp,Y1Si3,-3.52873523,0.522488131666663 -Na6H12S4N2O20_26_12437.vasp,Na6H12S4N2O20,-4.2036657625,0.1413279261552857 -Pt4Pb12_127_14705.vasp,Pt4Pb12,-1.146663181875,0.4272257228750001 -Cr1B4S6F5_2_4123.vasp,Cr1B4S6F5,-3.213176908125,0.6912156213932256 -Sn2P2H6C2O6_7_16813.vasp,Sn2P2H6C2O6,-4.824652068888889,0.0158551823333171 -Zn1Fe1Br2F2_1_20926.vasp,Zn1Fe1Br2F2,-1.225145415,0.2301169952083332 -Hg1O2_187_7889.vasp,Hg1O2,-0.5659161433333334,1.0670353676388875 -W2S6_59_20539.vasp,W2S6,-3.77253476875,0.2363854185937501 -Ba2Fe2S2_129_1982.vasp,Ba2Fe2S2,-1.6510072733333334,1.337552338229164 -Co2Sb2Te4Br2_10_4007.vasp,Co2Sb2Te4Br2,-1.362914613,0.3424450649333317 -Pt2S4_14_14669.vasp,Pt2S4,-2.546267176666667,0.0988775433333328 -Ca1C6_183_2816.vasp,Ca1C6,-6.82743455,0.1629062992857148 -Fe2S2_164_5937.vasp,Fe2S2,-1.9699038,0.0118612799999999 -Sb4Pb3_5_15802.vasp,Sb4Pb3,-1.43222496,0.4418931328571414 -Ca1H2O2_164_2844.vasp,Ca1H2O2,-4.43923439,0.0812233039999998 -Au4Cl4O4_14_1570.vasp,Au4Cl4O4,-0.8860921341666667,0.215825103611111 -Mn2C1F2_164_11038.vasp,Mn2C1F2,-3.541230606,0.1996349059999935 -Sc1Pt1Br2N1O1_1_15984.vasp,Sc1Pt1Br2N1O1,-3.07854841,0.6901816589583287 -Dy4Te10O26_2_5540.vasp,Dy4Te10O26,-4.435000932,0.0743005185000003 -In1C1_187_8214.vasp,In1C1,-2.46130898,2.862150285 -Ag2P4Se3I2_6_366.vasp,Ag2P4Se3I2,-1.7793488581818182,0.136079844829541 -Cu2Hg2Se2Cl2_26_5159.vasp,Cu2Hg2Se2Cl2,-0.0814315775,-0.0973704417361107 -Ca1F2_164_2832.vasp,Ca1F2,-3.5843762433333333,0.2593720533333332 -Na2Cd4S8I6_31_12035.vasp,Na2Cd4S8I6,-0.814470888,0.0709991642291675 -Ca2H8O4F4_53_3041.vasp,Ca2H8O4F4,-4.046679436111111,0.1053774707407373 -Au1Cl1_156_1418.vasp,Au1Cl1,0.532058735,0.38329199125 -As4O6_4_1334.vasp,As4O6,-4.407087521999999,0.0781500500000005 -Nb3N2O2_187_12988.vasp,Nb3N2O2,-7.256660699999999,0.0230833541071371 -Fe1H4C2I2N6_6_5693.vasp,Fe1H4C2I2N6,-4.27536972,0.2411300367222109 -Sb2F6_31_15579.vasp,Sb2F6,-2.7296182425,0.3865151725000002 -K4Zn1As2_164_9532.vasp,K4Zn1As2,-0.3388375671428571,0.0942748442857143 -Ag2H12C6S2N4_2_266.vasp,Ag2H12C6S2N4,-4.643929817307693,0.1970290809615262 -Y4N3O2_164_20832.vasp,Y4N3O2,-7.098038848888889,-0.0244870794444516 -Ta2Te2Cl2_59_17901.vasp,Ta2Te2Cl2,-3.565526541666667,0.1978792760416632 -K2H2O2_11_9125.vasp,K2H2O2,-3.142962198333333,0.0683468349999998 -Hg6Te4Se2O20_4_8101.vasp,Hg6Te4Se2O20,-2.5298403875,0.0883409934765621 -Mn2As2N2O10_31_10968.vasp,Mn2As2N2O10,-4.4559009225,0.10395441710069 -Ta2Co4Se6_11_17710.vasp,Ta2Co4Se6,-3.1622637175,0.1938035662499975 -Al2S2I2_59_941.vasp,Al2S2I2,-2.4345394666666667,0.0792042959722199 -Ba1Br2_164_1813.vasp,Ba1Br2,-1.9709313566666669,0.2468283333333329 -Pd2F2_129_14420.vasp,Pd2F2,-0.5585583875,0.93136523625 -In2Se3_1_8593.vasp,In2Se3,-1.963236678,0.0210847479999998 -P2Cl8_1_13971.vasp,P2Cl8,-1.457390645,0.0835075247499969 -In2Sb4S8Cl2_11_8571.vasp,In2Sb4S8Cl2,-2.40999222125,0.1318410868750001 -Hg8Te4Br12_14_8112.vasp,Hg8Te4Br12,0.37096086,0.1203625274999999 -K4Ru2Br12_31_9499.vasp,K4Ru2Br12,-0.9756840855555556,0.1025866116666666 -Er2P6O12_10_5566.vasp,Er2P6O12,-5.4921991305,0.3761310185000003 -Ta2Ni2Te10_51_17798.vasp,Ta2Ni2Te10,-2.1298808135714284,0.0781659792857141 -Fe2Ni2As2_129_5886.vasp,Fe2Ni2As2,-0.7595948149999999,3.280148602575751 -Ba1Cr2N2O8_164_1821.vasp,Ba1Cr2N2O8,-4.348685659230769,0.6525519602472377 -Nb2B1Cl2_164_12627.vasp,Nb2B1Cl2,-4.803513402,0.0435068439999883 -Sn2S1I2O3_1_16834.vasp,Sn2S1I2O3,-2.630189675,0.2333515858398436 -Ni1P1_187_13389.vasp,Ni1P1,-1.00158484,1.2762055702083337 -Cd2Sb4Se6Br4_11_3566.vasp,Cd2Sb4Se6Br4,-1.374780415625,0.1090736681249999 -Eu1Ge3_187_5588.vasp,Eu1Ge3,-2.5371843675,-1.14830414125 -Al1Pt5Br2_38_714.vasp,Al1Pt5Br2,-1.61366946625,0.6948132645833308 -Ge2N2_164_6787.vasp,Ge2N2,-4.919247135,-0.0118037324999997 -V1Ag1Se2_156_19762.vasp,V1Ag1Se2,-1.885180835,0.2939287374999995 -V1H4C4Cl1O6_2_19852.vasp,V1H4C4Cl1O6,-5.14760399125,0.1788126695023032 -Te1Ir1Au2Se2S1_1_18292.vasp,Te1Ir1Au2Se2S1,-1.1528497385714285,0.4150440945663231 -Cu3Te1Pb1O8_35_5392.vasp,Cu3Te1Pb1O8,-2.7351399246153845,0.3792025488461485 -Ba2Co2Ge2_129_1954.vasp,Ba2Co2Ge2,-1.86554341,0.2045011633333315 -Cr2Cu2Te12P4_13_4376.vasp,Cr2Cu2Te12P4,-1.720275456,0.4421878858333333 -Ba3As3_25_2095.vasp,Ba3As3,-1.7976432233333333,0.9761808150000004 -Sn4Te4_57_16976.vasp,Sn4Te4,-1.3469687125,-1.3112407325 -B2As6_164_1649.vasp,B2As6,-3.4400496025,0.5589740331249957 -Fe1Ir1Pd1S1Br3Cl1_1_5718.vasp,Fe1Ir1Pd1S1Br3Cl1,-1.16202076,0.4078274236197876 -Bi2S2Cl2_59_2511.vasp,Bi2S2Cl2,-1.9498933,0.0783808708333333 -Bi6B2_164_2663.vasp,Bi6B2,-1.62427560625,0.2661217145833334 -Sn4As8_26_16936.vasp,Sn4As8,-2.5122106158333333,0.1341194724999972 -P2Pt2Se6_12_14033.vasp,P2Pt2Se6,-2.372468075,0.5094068363333312 -Sb1Se1Br1_156_15497.vasp,Sb1Se1Br1,-1.7354914433333333,0.0963215391666667 -Sn1P1O4_111_16663.vasp,Sn1P1O4,-4.746898126666667,0.3480547334027725 -Te2Pt2Cl2_59_18482.vasp,Te2Pt2Cl2,-1.4494538283333334,-0.1855856266666666 -Ti2Cl2_129_18923.vasp,Ti2Cl2,-3.9057369025,0.677860715625 -Si1B1F2_156_16317.vasp,Si1B1F2,-3.98086216,0.4508104941666631 -Te2Rh4_2_18508.vasp,Te2Rh4,-1.954385466666667,0.3869446024999974 -Fe2I8_14_5868.vasp,Fe2I8,-0.026350917,0.0978869288750004 -Re4S8_38_15115.vasp,Re4S8,-4.672375158333334,0.2676956658333331 -Ag1Ge1Cl2_6_55.vasp,Ag1Ge1Cl2,-1.0530724975,0.2397739557812483 -Co2P1Se2_187_3955.vasp,Co2P1Se2,-2.7049389560000003,0.1194599302222219 -Y1Ge3_25_20636.vasp,Y1Ge3,-3.4283855575,0.1839443370833304 -Ca1Se2_115_2879.vasp,Ca1Se2,-1.6437288666666667,0.7258768394444423 -Na2F2_129_12075.vasp,Na2F2,-2.6559932275,-0.4588139475000004 -Fe2Mo2S2O12_8_5874.vasp,Fe2Mo2S2O12,-4.353539179444444,0.2294926867361046 -K2S2F2_1_9328.vasp,K2S2F2,-1.5548627233333334,0.3027303864583315 -K2Hg4S6I6O2_31_9180.vasp,K2Hg4S6I6O2,-0.5991093345,0.322329047541665 -Cd3Cu1_191_3613.vasp,Cd3Cu1,2.470917575,0.7584222137500003 -K4Si2As4_49_9514.vasp,K4Si2As4,-1.997172338,0.1375290329999998 -Hg1Pb2Br2O2_12_7895.vasp,Hg1Pb2Br2O2,-1.7258243228571428,0.1019905728571428 -Sr3Fe2Cl2O4_123_17374.vasp,Sr3Fe2Cl2O4,-3.497758206363636,0.08067412762626 -Yb2Cu3Te4Cl4O12_2_20871.vasp,Yb2Cu3Te4Cl4O12,-3.403310686,-0.067746275250003 -Ca2C2O6F2_59_2968.vasp,Ca2C2O6F2,-4.982194203333333,0.2482748967708287 -K2C2Se2N2_31_9027.vasp,K2C2Se2N2,-4.1903569225,0.0974551758333269 -Nb2Cr2Se10_11_12704.vasp,Nb2Cr2Se10,-3.249942692857143,0.071921876428568 -Hf2I2N2_59_7516.vasp,Hf2I2N2,-5.624026703333333,0.0387119116666667 -Ge2Se2Br2_59_6865.vasp,Ge2Se2Br2,-1.967606505,0.1568459736111109 -Sm2I2F2_129_16574.vasp,Sm2I2F2,-2.854159095,0.2713344618055524 -Sc2Se5O13_1_16163.vasp,Sc2Se5O13,-4.3011208475,0.0593122017500005 -Na1H5C5N2O5_1_11876.vasp,Na1H5C5N2O5,-5.56874406,0.1099978121270457 -Te8I4_31_18695.vasp,Te8I4,-0.7046806433333334,-0.9492612729166668 -Tl2Se1S1Cl2_1_19524.vasp,Tl2Se1S1Cl2,-1.040119065,0.399191700451385 -Rh4Se8_2_15254.vasp,Rh4Se8,-2.3587776875,0.3148928191666664 -Tl2Sb2Se6_143_19521.vasp,Tl2Sb2Se6,-1.601100869,0.3920945916666644 -Si3Bi2O9_174_16466.vasp,Si3Bi2O9,-5.314604325,0.2340483166071387 -W2Se2_12_20549.vasp,W2Se2,-4.140316875,0.1576551950000002 -Te6P2Ir2_162_18665.vasp,Te6P2Ir2,-2.395569064,0.4849597170555538 -Cr1Mo1H6_2_4211.vasp,Cr1Mo1H6,-2.727248665,2.21334855875 -Ga1H2_115_6200.vasp,Ga1H2,-2.2974962766666667,1.2846432066666635 -Cr2H2N1O2_164_4397.vasp,Cr2H2N1O2,-4.573215314285714,0.1207689630952246 -Al1I2_164_674.vasp,Al1I2,-0.8495097399999999,0.2925381483333323 -Fe3B2H2O2_187_6043.vasp,Fe3B2H2O2,-3.5942694744444443,0.1961139244444414 -K2Mo6P4O28_11_9246.vasp,K2Mo6P4O28,-5.1769176285,0.0601672989999997 -P1Cl5_47_13918.vasp,P1Cl5,-0.9136242616666668,0.460362759583332 -Ni2Te6As2_162_13681.vasp,Ni2Te6As2,-1.22627627,0.2647752844166653 -Nb4Pt6S10_59_13132.vasp,Nb4Pt6S10,-3.587248382,0.3020049426666602 -Nb2C1S2_164_12664.vasp,Nb2C1S2,-6.117774952,-0.3403871496666735 -Yb2Cl6_162_20867.vasp,Yb2Cl6,-2.8953790775,-1.0172518593749995 -Sr2Ce2I8_13_17177.vasp,Sr2Ce2I8,-1.4761651383333334,0.0905968294444443 -Ca4Mn2S6Cl2_129_3225.vasp,Ca4Mn2S6Cl2,-2.7601515078571426,0.0652849274999978 -Pb2Cl4O8_125_14239.vasp,Pb2Cl4O8,-2.305773050714286,0.1637287107142835 -In1Cu1S2I4_1_8234.vasp,In1Cu1S2I4,-0.59282999625,0.24922644984375 -Cs2H6C2Se2O6_4_4717.vasp,Cs2H6C2Se2O6,-3.839363215000001,0.4658968764444285 -Ta2Te2N1_164_17904.vasp,Ta2Te2N1,-5.459550746,0.2837412460000013 -Np2Se6_11_13785.vasp,Np2Se6,-4.51608106125,0.0626404737499992 -Na1I1_123_11877.vasp,Na1I1,-0.99332549,-0.400952995 -Ag2Sb4Te3Br2_6_418.vasp,Ag2Sb4Te3Br2,-0.9972116854545454,0.2953827899999985 -Rb2Ru2S2N2Cl10_11_14930.vasp,Rb2Ru2S2N2Cl10,-2.101373233888889,0.0872167811111051 -Hf1Ti1Cl6_5_7329.vasp,Hf1Ti1Cl6,-3.23411957375,0.1344844924999964 -Pb1F4_99_14186.vasp,Pb1F4,-1.3820218,0.549763532 -Ga1Se2_115_6275.vasp,Ga1Se2,-2.122744813333333,0.3094131655555532 -Te2Pb2I2_59_18453.vasp,Te2Pb2I2,-0.8204620216666667,-0.2185005708333343 -Co4Te2Cl4O6_11_4089.vasp,Co4Te2Cl4O6,-2.718540773125,-0.0706674303906251 -Hg3Au1_191_8049.vasp,Hg3Au1,2.4707800175,1.0040165453448278 -K2Zr1H6O6_147_9396.vasp,K2Zr1H6O6,-4.403875028,0.0942008186666671 -Zr1Co1F6_5_21280.vasp,Zr1Co1F6,-3.50546201375,0.1295698350000003 -Sb2Pt3S8_164_15664.vasp,Sb2Pt3S8,-2.4088451569230767,0.2876002586153824 -Fe4N3_164_6084.vasp,Fe4N3,-3.205328482857143,0.5743003932142833 -Bi1H1S2O6_1_2333.vasp,Bi1H1S2O6,-4.111893879,0.0818739324687439 -Cd1In2O4_164_3375.vasp,Cd1In2O4,-3.017945084285714,0.3111997139880933 -Al2H2O4_1_859.vasp,Al2H2O4,-5.2020663925,-0.509692656875 -Na2Nb2Br12_4_12224.vasp,Na2Nb2Br12,-1.78848090875,-0.2064594156250008 -Ni3P2H16O16_10_13706.vasp,Ni3P2H16O16,-4.242508515675675,-0.0654359558558593 -Te4Mo4Cl28O4_14_18597.vasp,Te4Mo4Cl28O4,-1.7167371880000002,0.05526761775 -Cs2Cl2F8_127_4708.vasp,Cs2Cl2F8,-1.1115402416666669,0.1131518375 -Nb9Se18_12_13211.vasp,Nb9Se18,-4.140830084814815,0.1150389226851853 -Mn2I2_129_11114.vasp,Mn2I2,-0.38978698,0.6705077844396552 -Sn2N2_156_16791.vasp,Sn2N2,-3.853855095,-2.39069152625 -Fe1Co3O8_164_5663.vasp,Fe1Co3O8,-3.6711351975,-0.3499473692187566 -Na2C6O6F6_4_12013.vasp,Na2C6O6F6,-4.7520298555,0.1152311544999939 -Y2Cl2O4_11_20717.vasp,Y2Cl2O4,-4.58667666375,0.5706778315625007 -Mo4H4O14_4_11747.vasp,Mo4H4O14,-4.812637180454545,0.0910374109848448 -Ge2P2H6C2S6_7_6805.vasp,Ge2P2H6C2S6,-3.902189315,0.0340742547135275 -Ag2Ge2O6_51_263.vasp,Ag2Ge2O6,-3.315715287,0.1619050644999995 -Nb2Br2Cl4_1_12646.vasp,Nb2Br2Cl4,-2.73306704125,0.1060788529687497 -Sn2Hg1I2O2_12_16775.vasp,Sn2Hg1I2O2,-1.5924291657142855,0.2326526388752046 -Hf1Mn3Se1S4Cl3_1_7231.vasp,Hf1Mn3Se1S4Cl3,-2.998054696666667,0.0711032760416585 -Cs2Pr2Cl8O8_18_4767.vasp,Cs2Pr2Cl8O8,-2.4848464815,0.4219533786250005 -Ba2O8F4_125_2040.vasp,Ba2O8F4,-1.86840377,1.709494436428568 -Sr2P4O12_2_17295.vasp,Sr2P4O12,-5.454251962222222,0.1723838926388889 -Ti2B1S2_164_18890.vasp,Ti2B1S2,-5.59633379,-0.0379252377500045 -Rh1N4Cl6_156_15158.vasp,Rh1N4Cl6,-1.6736190054545454,0.9243773802272686 -Ta4Fe4Te8_53_18042.vasp,Ta4Fe4Te8,-2.820731018125,0.1449148284027757 -Cu2C2S2F2_31_5067.vasp,Cu2C2S2F2,-2.61506503875,0.6240098489583331 -Hf1Zr1Te1Br1Cl2_1_7402.vasp,Hf1Zr1Te1Br1Cl2,-2.946769945,0.1542453459374977 -Cs2Cd4S2O6F6_31_4689.vasp,Cs2Cd4S2O6F6,-2.218699423,0.2123120086875002 -Bi2Se1O2_99_2534.vasp,Bi2Se1O2,-3.033843816,0.2392967133333305 -Si2S4_49_16438.vasp,Si2S4,-3.7576720466666655,0.1235505066666671 -Ni1Sn2C6N6_12_13426.vasp,Ni1Sn2C6N6,-5.542985153999999,0.118332400222217 -K1Re2O4F7_3_8932.vasp,K1Re2O4F7,-3.990686002142857,0.0357040196428566 -Co1Se1Br2_25_3821.vasp,Co1Se1Br2,-1.00138277,0.4097726061666658 -As1Br3_187_1138.vasp,As1Br3,-0.733088715,0.4363100075 -Ni1Ge2C6N6_12_13320.vasp,Ni1Ge2C6N6,-5.894180791333333,0.3142573837222122 -Hf3Ti1S8_6_7740.vasp,Hf3Ti1S8,-5.022183381666667,0.3414686549999992 -Al2Ge2Te2_164_851.vasp,Al2Ge2Te2,-2.602490305,0.0402396333333334 -Li4P2S8_59_10211.vasp,Li4P2S8,-3.0424459857142856,0.1510711322916645 -Hf2Te6P2_12_7644.vasp,Hf2Te6P2,-3.058117727,0.2889396539166658 -Te1Pb1_123_18321.vasp,Te1Pb1,-0.89193561,-0.952702785 -Rb2C2S2O6F6_4_14789.vasp,Rb2C2S2O6F6,-3.736960859444444,0.1930887277777694 -V3W1O8_25_20295.vasp,V3W1O8,-5.602824059166667,0.2629075108333332 -Al2S3_164_947.vasp,Al2S3,-3.633797192,0.1054965677499999 -W1S2_187_20451.vasp,W1S2,-4.586394596666667,-0.1137959466666664 -Mg2As2O6_162_10422.vasp,Mg2As2O6,-4.179887618,0.4066188831111064 -Au1Se1I1Br1_1_1445.vasp,Au1Se1I1Br1,-0.0339012725,0.2217983660329859 -Hf2Sn2O6_147_7620.vasp,Hf2Sn2O6,-6.041024822,0.1261296699999934 -Se1O1_6_16283.vasp,Se1O1,-2.59921211,0.6178221827083333 -Si6Sb8_1_16545.vasp,Si6Sb8,-2.726903712142857,-0.1405157921428597 -Cr1B4H4O6F1_2_4117.vasp,Cr1B4H4O6F1,-4.97286457875,0.5621298229513816 -Au2F2_2_1479.vasp,Au2F2,-0.108197355,0.8657148805555546 -Cu4H8C2O10_4_5421.vasp,Cu4H8C2O10,-3.822273622083333,0.4238550552430533 -In2As2O6_149_8373.vasp,In2As2O6,-3.811107972,0.450879800125 -Zr1Te1O1_156_21461.vasp,Zr1Te1O1,-4.787063186666667,0.4094146433333332 -Nb3H2C2_187_12975.vasp,Nb3H2C2,-6.240324165714285,0.1504391710204036 -Hf3B2H2_187_7681.vasp,Hf3B2H2,-5.500811805714286,0.2297914942857088 -Co1H4C8Cl2_25_3765.vasp,Co1H4C8Cl2,-5.15521607,0.3571061943333277 -Si2I2N2_59_16407.vasp,Si2I2N2,-3.9027748083333336,-0.1380057958333358 -Te2Ir2_164_18398.vasp,Te2Ir2,-2.32150071,0.8139307850000002 -Sr4S16_14_17464.vasp,Sr4S16,-2.617733474,0.1479363636250004 -Al1Pb1S2Br2O1_1_706.vasp,Al1Pb1S2Br2O1,-2.2755233471428573,0.7002721898363076 -Cd1H4C6Br2_10_3353.vasp,Cd1H4C6Br2,-4.380599606923076,0.4786973278846085 -Ge2Sb2O6_7_6851.vasp,Ge2Sb2O6,-4.217580717,0.309293802583331 -As6Pb4Br2O12_11_1386.vasp,As6Pb4Br2O12,-3.836511834166666,0.0517898100000002 -Ta1Se1O1_156_17617.vasp,Ta1Se1O1,-5.700625093333334,0.2694653586666609 -Ag1Bi1Te6P2_143_29.vasp,Ag1Bi1Te6P2,-1.547747443,0.2945841125075736 -Si1O1_156_16354.vasp,Si1O1,-4.926976405,0.6279955425 -Na2I1_164_12179.vasp,Na2I1,-0.5506487933333334,-0.0479825500000005 -K2Ag6Te4_12_8971.vasp,K2Ag6Te4,-0.1239228391666666,-0.2417126508333333 -Ca1Mg1Mn1Br2N1O1_8_2854.vasp,Ca1Mg1Mn1Br2N1O1,-3.0119719714285718,0.506727544285707 -Na2H6Pd1O6_147_12126.vasp,Na2H6Pd1O6,-3.7895395466666666,0.0886025340000005 -Zr1Nb1Sn1I1Cl1O3_8_21360.vasp,Zr1Nb1Sn1I1Cl1O3,-4.414586565,0.1922317448437442 -Ru2O2F2_59_15328.vasp,Ru2O2F2,-3.5173900783333334,0.3404120016666632 -Tl1Cd1S2I1Br1_1_19240.vasp,Tl1Cd1S2I1Br1,-0.6828639416666666,0.2462181135937494 -Ba2Ag1Br2O2_123_1880.vasp,Ba2Ag1Br2O2,-2.615609612857143,0.0215343660331563 -Ta2S2Br4_25_17844.vasp,Ta2S2Br4,-3.27523952875,0.2504287088636294 -Sb1O2_164_15472.vasp,Sb1O2,-3.9170593,0.5010175670833332 -Cd2N2Cl6_11_3524.vasp,Cd2N2Cl6,-0.7460444350000001,0.6439973379999999 -K2Ag2Te2S6_39_8968.vasp,K2Ag2Te2S6,-1.5556438433333335,0.0986420424861088 -W2I2_164_20501.vasp,W2I2,-2.48839746,0.8189972472916667 -Li4Fe4F20_57_10188.vasp,Li4Fe4F20,-2.347808249285714,0.142939861428569 -Rh2O2_164_15205.vasp,Rh2O2,-3.255936175,0.6125299587499998 -N4O6_4_11792.vasp,N4O6,-4.377598974,0.4085150904999959 -Nb1Ga1Te1Se1I2_8_12512.vasp,Nb1Ga1Te1Se1I2,-2.0550371133333334,-0.0150627342361135 -Li2H6Pd1S6_147_9951.vasp,Li2H6Pd1S6,-2.952111094,0.1200672981666667 -Ca1Sn1Te1Br1_99_2884.vasp,Ca1Sn1Te1Br1,-1.27471572,-0.459086955625 -Rb1V4O10_12_14764.vasp,Rb1V4O10,-5.309068524666667,0.0671881473333328 -Al2Sb2O6_162_953.vasp,Al2Sb2O6,-5.189273418,0.0012392347499998 -Ge2O2_12_6794.vasp,Ge2O2,-4.3365207325,-0.1298026631250004 -K2Hg4Se2O6F6_31_9189.vasp,K2Hg4Se2O6F6,-1.6568900085,0.206521264 -Ca2H12C4O14_2_3027.vasp,Ca2H12C4O14,-5.005993163125,0.0815156367187501 -Ni2Sb2Te4I2_10_13617.vasp,Ni2Sb2Te4I2,-0.7564411480000001,0.2506841394285692 -Te2C2_8_18382.vasp,Te2C2,-3.1477240725,1.6963315108333332 -Mn2Tl2Se5_156_11331.vasp,Mn2Tl2Se5,-1.6666887822222225,0.2097613523456772 -Co2Sb2Se4Cl2_10_4004.vasp,Co2Sb2Se4Cl2,-1.881499185,0.3685687559999975 -Y2H2C1_164_20739.vasp,Y2H2C1,-5.03714584,0.1087923279999949 -Sb8S4O8_2_15876.vasp,Sb8S4O8,-3.517088726,0.2559026256666639 -Nb1Te1S1_156_12597.vasp,Nb1Te1S1,-4.03284376,0.1915647428240681 -Se2O4_59_16290.vasp,Se2O4,-2.638159228333333,0.8818903108333336 -Cu1B2C8N8_12_4842.vasp,Cu1B2C8N8,-6.510217166842105,0.5764957857017421 -Te1Mo2I1_8_18307.vasp,Te1Mo2I1,-1.781990135,0.8163700702083334 -Mo1H2O2_164_11512.vasp,Mo1H2O2,-4.2769433800000005,0.4372785516666666 -Nb3Br7O1_156_12955.vasp,Nb3Br7O1,-3.04198567,0.1220065740404007 -In1As1S1Cl1_1_8188.vasp,In1As1S1Cl1,-1.902738415,0.4323130312499978 -Zn2As2Se6_147_21028.vasp,Zn2As2Se6,-1.531635433,0.2821772713333311 -Ho1As2_21_8113.vasp,Ho1As2,-2.8563107333333337,0.6272492766666629 -La2Tl4P4S14_2_9621.vasp,La2Tl4P4S14,-3.1714438145833337,0.0874404762499994 -V1Br1Cl1_156_19783.vasp,V1Br1Cl1,-1.93607145,0.1108511399999998 -Tl2B6S20_2_19370.vasp,Tl2B6S20,-3.336972364642857,0.168099770446422 -Fe2H4C6O14_2_5859.vasp,Fe2H4C6O14,-5.275667333076924,0.1739759650640955 -Sn4Te4P4_17_16973.vasp,Sn4Te4P4,-2.1551121933333333,-0.7826282116666676 -Co2P2H12C12N2O6_2_3956.vasp,Co2P2H12C12N2O6,-5.512131016944444,0.1998429610833207 -Ag1F2_187_53.vasp,Ag1F2,-0.4041157733333333,0.4313207283333333 -Si1S1_156_16358.vasp,Si1S1,-3.46678743,0.1916667474999999 -Mo2O2F2_59_11643.vasp,Mo2O2F2,-4.071714078333334,0.1314339366666623 -Pb4S4_57_14319.vasp,Pb4S4,-2.0177834425,-1.3446499975 -V2Se2N1_164_20185.vasp,V2Se2N1,-4.380933812,-0.0133403870000001 -Hf4Te3Se5_156_7820.vasp,Hf4Te3Se5,-4.231059926666666,0.1352032104166673 -Bi4Te4_14_2653.vasp,Bi4Te4,-1.13726630625,0.3825706937499999 -Sb8Ir4_2_15866.vasp,Sb8Ir4,-2.7742565066666667,0.4960270083333329 -Mg1Zn7O8_6_10414.vasp,Mg1Zn7O8,-2.074637776875,0.3406717321874999 -Be2I4_2_2257.vasp,Be2I4,-1.1385683466666667,0.2857230249999998 -Rb1Sn1Te2_156_14755.vasp,Rb1Sn1Te2,-0.9196426125,-0.035528813125001 -Nb2I10_51_12738.vasp,Nb2I10,-0.922796725,0.2621313033333334 -Ta4Ni2O10_59_18063.vasp,Ta4Ni2O10,-6.1155072925,0.91912905375 -Nb4Co2S10_59_13054.vasp,Nb4Co2S10,-4.293882803125,0.1607797645312423 -Te2Ir2_129_18396.vasp,Te2Ir2,-2.3268514925,0.8085800025000003 -Mn3Cd2O8_10_11368.vasp,Mn3Cd2O8,-3.356121820769231,0.2357132453846118 -Na3S2_164_12356.vasp,Na3S2,-1.899901126,0.2453974099999982 -Ge2Te6As2_147_6893.vasp,Ge2Te6As2,-1.949867555,-0.150654743833335 -V4O10_59_20344.vasp,V4O10,-5.497497987857143,-0.038919405714286 -W1Cl5_47_20430.vasp,W1Cl5,-1.6677080666666668,0.3462066608333313 -Gd4Cl6_12_6630.vasp,Gd4Cl6,-2.768909994,0.0922627409999998 -Ni2Br2_164_13481.vasp,Ni2Br2,0.353137225,1.70896191 -Ag2_164_494.vasp,Ag2,1.18640598,0.463033115 -V1H8C10N2F3_16_19860.vasp,V1H8C10N2F3,-5.6424060625,0.1391718633333232 -Cu2Ni1S3I2_8_5194.vasp,Cu2Ni1S3I2,-0.6761948975,0.2842504640972204 -In2H2Se2O8_11_8463.vasp,In2H2Se2O8,-3.875000005,0.0607710971428572 -Sn1Te2_164_16702.vasp,Sn1Te2,-1.30715998,-0.7594127411111116 -Dy2Zn2P2O2_164_5539.vasp,Dy2Zn2P2O2,-3.7246863175,0.1422152625000001 -S4I8N8_2_15398.vasp,S4I8N8,-2.396294557,0.1882742646250003 -Zn1Sn1S2Br1_1_21014.vasp,Zn1Sn1S2Br1,-1.403746546,0.2069554873000002 -In2H10C4Cl4_10_8455.vasp,In2H10C4Cl4,-3.4041253015,0.4449937510000005 -Li4V2F12_7_10239.vasp,Li4V2F12,-3.4560021316666667,0.1307734927777777 -As4S8_11_1367.vasp,As4S8,-2.6360362375,0.7331903361458303 -Ga2Se2F2_31_6471.vasp,Ga2Se2F2,-2.5311669533333334,0.0941961583333308 -V1Cu1P2S6_5_19814.vasp,V1Cu1P2S6,-3.0600112630000003,0.0656967785624971 -Ir2Cl2_12_8776.vasp,Ir2Cl2,-1.7218735725,1.1378975966666642 -Hf1Ni1Ag1Mo1Se5S3_1_7243.vasp,Hf1Ni1Ag1Mo1Se5S3,-2.4934713491666667,0.1749242831250001 -Fe4B3O2F2_164_6074.vasp,Fe4B3O2F2,-2.6935469381818185,1.3145833591919076 -Nb2S2Br4_25_12835.vasp,Nb2S2Br4,-2.97372425,0.2302438759090861 -Ca6Ga2As6_26_3256.vasp,Ca6Ga2As6,-2.186412999285714,0.3161506496428576 -Li1Pt1F2_1_9779.vasp,Li1Pt1F2,-2.0071604575,0.9082307071875 -Mg3Bi3_25_10544.vasp,Mg3Bi3,-0.6271464483333333,0.1757722624999995 -Bi4O6_2_2622.vasp,Bi4O6,-3.604802585,0.2531916429999996 -Zr2P2S6_12_21626.vasp,Zr2P2S6,-3.940978913,0.3390739873749964 -Cd2Ag2S2Br2_26_3441.vasp,Cd2Ag2S2Br2,-0.21428442625,0.152426300625 -V4Cu2H12N4O12_7_20319.vasp,V4Cu2H12N4O12,-4.655238507058823,0.0738640731617568 -W2F6_162_20494.vasp,W2F6,-3.57729090875,0.2974727559374999 -Hf2Zr2Te8_6_7673.vasp,Hf2Zr2Te8,-3.2268006066666666,0.2523125700000002 -Ca1O2_123_2864.vasp,Ca1O2,-3.96951902,0.2231095149999999 -Rb1Pb1Se2_156_14749.vasp,Rb1Pb1Se2,-1.24521707,0.4664711217187499 -As2P2O8_31_1238.vasp,As2P2O8,-5.015959414166667,0.1799688895833293 -Mo2O4_11_11648.vasp,Mo2O4,-5.072850388333333,0.2390547233333331 -Si3P4_5_16476.vasp,Si3P4,-4.034940485714285,-0.2924658415476222 -Tl1N1_187_19303.vasp,Tl1N1,-1.936748585,0.7239677662500003 -Gd2Br2O4_11_6600.vasp,Gd2Br2O4,-4.20416983125,0.2807937006250008 -Hf1W2S8_164_7366.vasp,Hf1W2S8,-3.939051319090909,0.4574073044886297 -Ag2Se2_187_436.vasp,Ag2Se2,-0.38068799,-0.0937319824999999 -Hg2Cl2O8_28_7953.vasp,Hg2Cl2O8,-1.6159375466666666,0.4435954423958321 -K1Cl1_123_8891.vasp,K1Cl1,-1.254827345,0.1496875199999998 -Cr1Ag1I2_6_4098.vasp,Cr1Ag1I2,-0.1071571125,0.5818231254166646 -In5Cu1P1Se1S3Cl8O1_1_8706.vasp,In5Cu1P1Se1S3Cl8O1,-1.8860744955,0.1667128892560079 -Rb2S6Cl2_11_14934.vasp,Rb2S6Cl2,-1.695029746,0.4418215536250003 -Sr2Cd1In1Ag1O5_99_17169.vasp,Sr2Cd1In1Ag1O5,-2.555619414,0.3461979166666669 -Pd1Pt3Se1S1Cl6_1_14380.vasp,Pd1Pt3Se1S1Cl6,-1.23272771,0.1209602906249979 -Nb13Se26_2_12460.vasp,Nb13Se26,-4.154507365897436,0.1013616416025646 -Mn2P2Se4Cl2_26_11198.vasp,Mn2P2Se4Cl2,-2.342701479,0.1121205718750002 -Tl1P2Au1S6_149_19314.vasp,Tl1P2Au1S6,-2.397149197,0.173680471472217 -Co1Cl2_115_3728.vasp,Co1Cl2,-0.9828829966666668,0.130775205 -Ho2I2O2_164_8141.vasp,Ho2I2O2,-4.411909641666667,0.1208541566666667 -Cr3O9_157_4575.vasp,Cr3O9,-3.9943839341666663,0.4584039056770832 -Al2O2F2_59_911.vasp,Al2O2F2,-5.174657586666666,0.0027192522222172 -Co1Ni1S2Br1Cl3_1_3786.vasp,Co1Ni1S2Br1Cl3,-1.28323893375,0.0934904724999974 -K2Hg4Se2S6I6_31_9193.vasp,K2Hg4Se2S6I6,-0.518420597,0.0223793411041649 -Tl1Ag1Sb2S6_149_19206.vasp,Tl1Ag1Sb2S6,-1.860902805,0.3392401906249976 -Al2S2_129_946.vasp,Al2S2,-2.986897885,0.5331770589583309 -Ir2O2_129_8796.vasp,Ir2O2,-2.4639993375,2.322061905 -Mn2Tl2O6_162_11329.vasp,Mn2Tl2O6,-3.5786171510000004,0.0275672624999996 -Te1P2Se2_1_18319.vasp,Te1P2Se2,-2.530967584,0.2385379630833337 -V4H2C3_164_20327.vasp,V4H2C3,-5.296666764444445,0.127369394126974 -Sc2Te6_11_16187.vasp,Sc2Te6,-2.2554163425,0.2588015031250001 -Na1In1Sb2Se6_5_11890.vasp,Na1In1Sb2Se6,-1.926609029,0.0590895978333309 -V1I2O1_25_19866.vasp,V1I2O1,-2.52796543,0.0792179833593746 -Sb4P2H2S12_4_15796.vasp,Sb4P2H2S12,-2.8731141835,0.1301689723749974 -Li2V3C6O18_2_10128.vasp,Li2V3C6O18,-5.810184544137931,0.0949911737643514 -Tb1As2_21_18168.vasp,Tb1As2,-2.8435583933333333,0.6852220399999971 -Tl3Mo2O8_143_19577.vasp,Tl3Mo2O8,-3.961111462307692,0.1664934400480736 -Hf4I1Br3N4_35_7790.vasp,Hf4I1Br3N4,-5.876932018333334,0.039885602916666 -Fe2Se2_164_5979.vasp,Fe2Se2,-1.20401628,0.1793765574999999 -Ga4Bi4_2_6544.vasp,Ga4Bi4,-1.3111469525,-0.530263465 -Zr1Ti1Te2_25_21479.vasp,Zr1Ti1Te2,-3.5301072175,0.1661529576562457 -Ag2As2O6_162_154.vasp,Ag2As2O6,-2.980853696,0.387691567 -K2B2Se2N2_31_8999.vasp,K2B2Se2N2,-3.661478815,1.0027660941666665 -K2Te2C4_31_9369.vasp,K2Te2C4,-3.47174374625,1.1578169141666668 -Mn3B2F2_187_11352.vasp,Mn3B2F2,-3.387203595714286,0.1593373563392781 -Sn1Bi2S4_164_16614.vasp,Sn1Bi2S4,-2.4568454385714285,-0.7147354489285733 -Sr3Cu2I2O4_123_17368.vasp,Sr3Cu2I2O4,-2.7231340881818182,-0.1101555335454613 -V2C1O2F2_164_20018.vasp,V2C1O2F2,-3.850084597142857,0.9465599806709808 -Zr2H2_164_21581.vasp,Zr2H2,-3.74908417,0.3102187212499994 -Nb1Bi1Se2_99_12473.vasp,Nb1Bi1Se2,-2.8950508425,0.4135679118750004 -Co2P2O6_162_3958.vasp,Co2P2O6,-4.515459799,0.3041342697500004 -S8F8_2_15405.vasp,S8F8,-2.119064753125,0.138670493984375 -Os1O2_164_13809.vasp,Os1O2,-4.609830143333333,0.8929478633333332 -Fe1C2O6_147_5643.vasp,Fe1C2O6,-5.2422226088888895,0.1344881248611026 -K2C2O6_11_9015.vasp,K2C2O6,-4.718641452,0.1449726490000005 -Y1Mn1Br2O2_1_20648.vasp,Y1Mn1Br2O2,-4.121121866666667,0.0637329324702329 -Rh2Br8_2_15179.vasp,Rh2Br8,-0.652617143,0.1964170230000001 -Nb9Ir1Se20_2_13209.vasp,Nb9Ir1Se20,-3.997478913,0.0681118693333289 -Sn6P6_2_16997.vasp,Sn6P6,-2.5725137125,0.2088943106250003 -Ti2V1Se1I1Br1N2O1_1_19053.vasp,Ti2V1Se1I1Br1N2O1,-4.967511355555555,0.1179663487222076 -Rh2Se2F2_59_15238.vasp,Rh2Se2F2,-2.246656576666666,0.1718415333333336 -Ni1C6N2F6_25_13303.vasp,Ni1C6N2F6,-4.684111880000001,0.2733771040555495 -Gd2Ga2I2_164_6611.vasp,Gd2Ga2I2,-2.2014494366666666,0.0369651766666669 -Fe6S8_50_6095.vasp,Fe6S8,-1.9882806085714289,-0.0260751707142876 -Li2Te2C2N2_31_10081.vasp,Li2Te2C2N2,-4.4542483975,0.583156910416667 -Sn12Rh4_35_16597.vasp,Sn12Rh4,-1.68224582625,0.4132827187500001 -Mn1In2O4_164_10781.vasp,Mn1In2O4,-3.75042904,0.2326651685452556 -Zr1Bi1Te2W1_156_21259.vasp,Zr1Bi1Te2W1,-2.740400988,0.682453955 -Yb2H2Br2_129_20874.vasp,Yb2H2Br2,-2.797304195,0.0760298116666664 -Ni1Br2_164_13288.vasp,Ni1Br2,0.1086233766666666,0.0637229566666666 -Ag2Sb2S6_12_401.vasp,Ag2Sb2S6,-1.676630622,0.3959005258749976 -Hg1H1O1F1_156_7861.vasp,Hg1H1O1F1,-1.8380033525,0.2109712850000002 -Mo2Se2N1_12_11687.vasp,Mo2Se2N1,-3.902561444,0.2142056220000006 -Hf4Se4F4_31_7816.vasp,Hf4Se4F4,-4.4796745966666665,0.2778672954166623 -Ta1Cr1I1N2Cl1_25_17534.vasp,Ta1Cr1I1N2Cl1,-4.786974618333333,0.0285236188888848 -Cr2Se1S4Cl1_1_4492.vasp,Cr2Se1S4Cl1,-2.65938031375,0.2927235732812477 -Mn8S4Cl8_164_11476.vasp,Mn8S4Cl8,-2.2234808445,0.0370151825 -Ni2Bi2S4Cl2_10_13467.vasp,Ni2Bi2S4Cl2,-1.518302562,0.2700463498333335 -Pb1O2F2_164_14192.vasp,Pb1O2F2,-1.906631118,1.0476276485 -Sb10Te10_26_15412.vasp,Sb10Te10,-1.623133772,0.296048801749998 -Cr2Ge2S6_162_4387.vasp,Cr2Ge2S6,-3.094386256,-0.1157591905000032 -Nd2S2I2_164_13242.vasp,Nd2S2I2,-3.367366495,0.0439513666666666 -K4Ir2C2Br10O2_31_9468.vasp,K4Ir2C2Br10O2,-2.2514536955,0.0052483499999989 -H2Au1O2_12_6986.vasp,H2Au1O2,-2.78870401,0.2780019061666667 -K2Yb2I6_51_9393.vasp,K2Yb2I6,-1.008741348,-0.0037480079999999 -Mn1Ni1Se2S2_1_10830.vasp,Mn1Ni1Se2S2,-2.0188674216666667,0.2277508980555535 -Ge2S3_2_6832.vasp,Ge2S3,-3.129599352,-0.3346293918750027 -Co2Ni2P2_129_3941.vasp,Co2Ni2P2,-1.8510700716666664,0.4711072205555557 -Fe2Te2O8_31_6000.vasp,Fe2Te2O8,-3.465449510833333,0.3682449203124999 -Zr3H2S2N2_38_21768.vasp,Zr3H2S2N2,-5.283240164444445,0.577895214629624 -Cs1Br3_191_4636.vasp,Cs1Br3,-0.09614004,0.532277210625 -Li2W1S4_111_10137.vasp,Li2W1S4,-3.593234935714286,-0.0310180158035775 -Ca2P4H12O14_2_3091.vasp,Ca2P4H12O14,-4.756060080625,0.0647337665625 -As6Pt3_157_1392.vasp,As6Pt3,-2.6716038866666665,0.7495131908333335 -Hf3Zr1S8_6_7755.vasp,Hf3Zr1S8,-4.939494889166666,0.3415459527083335 -Na2Ti2N2Cl2_59_12327.vasp,Na2Ti2N2Cl2,-4.799338915,0.1794259253125001 -Zr2F2_164_21560.vasp,Zr2F2,-4.161937795,0.2239976237499998 -Mg3H2O6_12_10552.vasp,Mg3H2O6,-3.892367016363637,0.1873978056818107 -Ga2S2_164_6447.vasp,Ga2S2,-2.79538421,0.0603422849999999 -Bi1Se1F1_156_2388.vasp,Bi1Se1F1,-2.209213043333333,0.2933182913888863 -Mo2Se6_11_11696.vasp,Mo2Se6,-2.53041361,0.3306434458333332 -Li1Fe3O6_1_9703.vasp,Li1Fe3O6,-3.691700319,0.1775869067500002 -H2Pd2Se4_6_7018.vasp,H2Pd2Se4,-1.99012644875,0.60256604625 -Cr4H12O4_2_4600.vasp,Cr4H12O4,-3.5186495295,1.0704256786666622 -Te3As2_164_18542.vasp,Te3As2,-2.02913434,0.0843410710000003 -Co1H4C2I2N4_47_3747.vasp,Co1H4C2I2N4,-4.325753646153846,0.029767162115379 -Al4In4I16_11_1074.vasp,Al4In4I16,-0.8555304745833333,-0.1541922275 -Mo1Se2_164_11550.vasp,Mo1Se2,-2.8001661433333336,0.2452470799999999 -Tl4Se4I4_14_19627.vasp,Tl4Se4I4,-0.617095445,0.4443759444444435 -Hf4S4Br4_31_7806.vasp,Hf4S4Br4,-4.1013233025,0.1394348679166581 -Bi8O10F4_14_2686.vasp,Bi8O10F4,-3.3446465513636365,0.1878976177272693 -Al2Fe1Se4_156_829.vasp,Al2Fe1Se4,-2.444943118571429,0.0593296849999983 -Sb1P1W1_156_15474.vasp,Sb1P1W1,-3.9371015633333335,-0.1994040925000034 -Co1Ir3Se1S3I4_8_3779.vasp,Co1Ir3Se1S3I4,-2.0378698383333336,-0.0729555841319498 -Li2Mg1Se2O8F4_2_9974.vasp,Li2Mg1Se2O8F4,-2.9190940482352943,0.4077645455882287 -Ta9Te18_12_18167.vasp,Ta9Te18,-3.663084237407407,0.0847991314814819 -Zn2Sb4S6I4_31_21161.vasp,Zn2Sb4S6I4,-1.48115989625,-0.4305065201250001 -W12Cl24_127_20403.vasp,W12Cl24,-2.705408372222222,0.3347866977777727 -Hf2Br2N2_59_7445.vasp,Hf2Br2N2,-5.959529408333334,0.0419812149999998 -Na4Se4O8_13_12419.vasp,Na4Se4O8,-3.398733141875,0.1018889478645832 -Ta4Co2Te10_59_18024.vasp,Ta4Co2Te10,-3.155362853125,0.0995317611197919 -Mo2Se2_25_11693.vasp,Mo2Se2,-2.7453330125,0.8810360824999999 -Rb1Sr1Au1S2Br2_1_14756.vasp,Rb1Sr1Au1S2Br2,-1.4691473985714285,0.1798325110267803 -Cu4H4S4Cl4_14_5415.vasp,Cu4H4S4Cl4,-1.657768229375,0.1334712689583334 -Mg2S2O8_39_10500.vasp,Mg2S2O8,-4.023813531666667,0.6394472454166662 -Y1Pb3_191_20660.vasp,Y1Pb3,-1.1995098775,0.3731982974999988 -Ba2P1_115_2042.vasp,Ba2P1,-1.4703033666666665,0.6842276208333327 -Al2H2O4_59_861.vasp,Al2H2O4,-5.39449892375,-0.7021251881249997 -K2Ru2C2S4Br8_31_9318.vasp,K2Ru2C2S4Br8,-1.9931781805555555,0.3854145794444423 -Ge3Se5S1_157_6923.vasp,Ge3Se5S1,-2.5509252788888888,0.1454384573032379 -Ge2I1Cl1O2_1_6777.vasp,Ge2I1Cl1O2,-2.951513806666666,0.2873071754166667 -Cr2Se2S3Cl1_1_4499.vasp,Cr2Se2S3Cl1,-2.507020075,0.3881024825694425 -Li2H8C6S2O10_2_9956.vasp,Li2H8C6S2O10,-5.035727568214286,0.1795666029538591 -Tl1As1_187_19214.vasp,Tl1As1,-0.824711105,0.6940895267499999 -Ga3Au1Cl4O4_35_6525.vasp,Ga3Au1Cl4O4,-2.659044740833333,-0.1446524600520895 -Ti2Se1S2I1_6_19018.vasp,Ti2Se1S2I1,-4.252305616666667,-0.0252525797916753 -Sr3Co2Cl2O5_123_17360.vasp,Sr3Co2Cl2O5,-3.6999674391666666,0.0206161938888795 -Ga4N4_127_6555.vasp,Ga4N4,-4.09604487875,0.90497565125 -Te6P4_11_18673.vasp,Te6P4,-2.20939913,0.3520707180000003 -Zr2B1O2_164_21510.vasp,Zr2B1O2,-6.233640694,0.3315310686666617 -Hf3Te2N2F2_38_7737.vasp,Hf3Te2N2F2,-4.984157636666667,0.8390983880555454 -Cu4Bi4_51_5396.vasp,Cu4Bi4,-0.33077534375,0.69686525375 -Cd1S1_187_3413.vasp,Cd1S1,-0.33128897,0.41012474125 -Te1Mo1O1_156_18298.vasp,Te1Mo1O1,-3.3476984266666663,0.3637012541666669 -As4C3_5_1325.vasp,As4C3,-4.151793948571429,1.161593832857137 -Ag6S2I2_1_581.vasp,Ag6S2I2,-0.077367162,0.061884872 -Te6Os2_11_18661.vasp,Te6Os2,-2.18010266875,-0.1357509783333334 -Si1F2_115_16332.vasp,Si1F2,-2.902532636666667,0.8043686691666635 -Sn1Sb2Te4_156_16689.vasp,Sn1Sb2Te4,-1.6114454957142856,-0.2824477342857145 -Cr3B2Cl2_187_4542.vasp,Cr3B2Cl2,-3.380675904285714,0.1936237519642798 -Na2Cu1O2_12_12066.vasp,Na2Cu1O2,-2.291390866,0.3518712041111089 -Sb2H6Pb2C2O6_7_15584.vasp,Sb2H6Pb2C2O6,-4.129316997777778,0.2617476366666572 -Al1F2_25_655.vasp,Al1F2,-3.3119861333333334,0.5081711538888853 -As4Pt4O4_13_1354.vasp,As4Pt4O4,-3.2427841591666664,0.4178064166666632 -K1Sb3_10_8934.vasp,K1Sb3,-1.0901206125,0.617275924375 -Sn12Ir4_127_16593.vasp,Sn12Ir4,-1.910067193125,0.1479587840624985 -Hf2Zr1Se6_157_7667.vasp,Hf2Zr1Se6,-4.404493855555556,0.1107692669444408 -In2Sb2O6_162_8563.vasp,In2Sb2O6,-4.046543465,0.101570754875 -Cd1H1S1I1_156_3333.vasp,Cd1H1S1I1,-1.1090866,0.0799022739583332 -Mn2O2_187_11175.vasp,Mn2O2,-3.849699195,0.3609471678448277 -Sr2Bi2I2O4_51_17144.vasp,Sr2Bi2I2O4,-3.175276966,0.1462448860000003 -Na2Nb1S2_187_12222.vasp,Na2Nb1S2,-3.289447792,0.2175286079999941 -V1Mo1Pt1S4I2Br1_1_19881.vasp,V1Mo1Pt1S4I2Br1,-2.239961289,0.2275030477083275 -Hf2Te6As2_12_7643.vasp,Hf2Te6As2,-2.9157331710000003,0.2292243439999977 -Sr1Sn1As1I1Br1O2_1_17084.vasp,Sr1Sn1As1I1Br1O2,-2.6994425271428573,0.2989376169047561 -Ag2Br6_191_209.vasp,Ag2Br6,0.40497387125,0.35372826375 -Ca2Cl4_129_2981.vasp,Ca2Cl4,-2.1203738916666666,0.1078572466666667 -Cs2C2O6_1_4668.vasp,Cs2C2O6,-4.678608592,0.1453891926249977 -Na2S6N2_1_12294.vasp,Na2S6N2,-3.136406181,-0.0155080503750019 -K6Ta4Ag6Se16_13_9544.vasp,K6Ta4Ag6Se16,-2.266908121875,0.0770669912500001 -Ir1Se2_115_8761.vasp,Ir1Se2,-2.30214854,0.0509382158333333 -Pd1N2Cl2_1_14368.vasp,Pd1N2Cl2,-2.426368058,0.3124118296666671 -Hf2Se2N1_164_7606.vasp,Hf2Se2N1,-5.90329517,0.101633334000001 -As12S12_7_1122.vasp,As12S12,-2.767384690833333,0.2425152776041663 -Zr1Zn2Pd1Cl4O4_1_21497.vasp,Zr1Zn2Pd1Cl4O4,-2.66923865,0.150482733467879 -Mn1In2Se4_164_10786.vasp,Mn1In2Se4,-2.066793214285714,0.0098921571428571 -Ta2Cl2O4_11_17690.vasp,Ta2Cl2O4,-6.01867017375,-0.0844036562500045 -Ru1Pb2_123_15279.vasp,Ru1Pb2,-1.4682890233333332,0.8164837116666648 -Na1Ni1Sb2Se6_149_11918.vasp,Na1Ni1Sb2Se6,-1.68423304,0.3651494201666644 -Nb4S12_11_13139.vasp,Nb4S12,-4.3580711725,0.0144390810937502 -Ga3Te4_164_6538.vasp,Ga3Te4,-1.6869042457142858,0.143660763730157 -Te2Pt2_123_18493.vasp,Te2Pt2,-1.54634946,0.3512041099999998 -Ga2Se2_129_6480.vasp,Ga2Se2,-2.14105246,0.2764050474999999 -Au4O4F4_14_1575.vasp,Au4O4F4,-1.2261411608333332,0.1013666556481469 -Al1Cu1P2S6_149_642.vasp,Al1Cu1P2S6,-3.029157871,0.054782315786453 -Al2S2_2_945.vasp,Al2S2,-3.3593123825,0.1607625614583305 -Bi2F6_189_2456.vasp,Bi2F6,-2.43367703125,0.561628834375 -Sr8P4I4O16_14_17496.vasp,Sr8P4I4O16,-4.665315273125,0.1005370037500004 -Hg2Cl2_2_7956.vasp,Hg2Cl2,0.7558954325,0.19428385 -Li2V2F10_12_10116.vasp,Li2V2F10,-3.3917015435714286,-0.0090138202381013 -Ti2O1_164_18972.vasp,Ti2O1,-6.0606961933333325,1.2638663400000016 -H2W3N2_187_7039.vasp,H2W3N2,-5.202084332857143,-1.3574696942063544 -Hf1Cl2_187_7145.vasp,Hf1Cl2,-3.563217976666667,0.1119626374999962 -Li2Ag1S2_12_9817.vasp,Li2Ag1S2,-2.0078381060000003,0.2575564189374975 -K2Ta2Cu4Se8_28_9360.vasp,K2Ta2Cu4Se8,-2.21775431375,0.1665860716666644 -Te2Mo2_164_18413.vasp,Te2Mo2,-2.313003735,0.5403040024999997 -Bi4B4O14_2_2598.vasp,Bi4B4O14,-4.932370947727272,0.2780768851136335 -Ca2N1_164_3068.vasp,Ca2N1,-2.622107123333333,0.3078790266666669 -Bi3Te4_156_2590.vasp,Bi3Te4,-1.4288857642857145,0.1248919028571411 -H2Os2_164_7000.vasp,H2Os2,-3.8986430875,1.458460735 -Ca2Be2_164_2949.vasp,Ca2Be2,-0.2270331875,1.726412126923075 -Mn1Ga2Se4_156_10729.vasp,Mn1Ga2Se4,-2.28624797,0.0771613871428567 -Li4Bi4O8_29_10165.vasp,Li4Bi4O8,-3.877053923125,0.0596069943749997 -V2Sb2Se6_162_20175.vasp,V2Sb2Se6,-2.575888901,0.2511844114999981 -Ga2S2I2_31_6443.vasp,Ga2S2I2,-1.8561559866666668,0.0392063791666645 -K3Ti2Br9_174_9406.vasp,K3Ti2Br9,-1.979814751428572,0.0154506571428556 -V2I2Br1Cl1O2_8_20091.vasp,V2I2Br1Cl1O2,-2.8752604825,0.0505095983593736 -Hg1Se2_187_7916.vasp,Hg1Se2,0.0126158966666666,0.2539422377777776 -Te2O4_129_18418.vasp,Te2O4,-3.1762751,0.4769651162500001 -Al2Ni2Se5_187_904.vasp,Al2Ni2Se5,-2.002965716666667,-0.0087663422222247 -Mn2Se2_164_11285.vasp,Mn2Se2,-2.15937359,0.1290800612931013 -La2Cl6_12_9588.vasp,La2Cl6,-2.969109995,0.1898312374999999 -Ba4Bi4Se8F4_14_2143.vasp,Ba4Bi4Se8F4,-2.710397081,0.1172941577500001 -Nb3N2F2_187_12987.vasp,Nb3N2F2,-6.238649381428572,0.0772237112380828 -Bi1S1Br3_1_2366.vasp,Bi1S1Br3,-0.8600749560000001,0.456568936874999 -Tl6S6_2_19644.vasp,Tl6S6,-1.2992557833333334,0.2965678977604167 -In1Ni5Br2_123_8290.vasp,In1Ni5Br2,0.2635088625,4.12405269140625 -Sn1Au1I2O1F1_1_16606.vasp,Sn1Au1I2O1F1,-1.08838541,0.4434873247083312 -Mg2Ti4_51_10529.vasp,Mg2Ti4,-3.642832523333333,1.0267855138888855 -Hf4I4O4_7_7792.vasp,Hf4I4O4,-4.746852228333333,0.4954317218181699 -Mn2Cl2_164_11052.vasp,Mn2Cl2,-1.48423743,0.3770053931896551 -Cr1O2_191_4224.vasp,Cr1O2,-3.3163615600000003,1.501634294374996 -W2Br2N2_59_20459.vasp,W2Br2N2,-4.68035895,0.1867631076388853 -Ba2H8O6_4_1997.vasp,Ba2H8O6,-4.35333229375,0.0604962362499996 -P4O6_7_14090.vasp,P4O6,-5.163356202,0.0954475516000004 -Pt1O2_187_14585.vasp,Pt1O2,-2.173977733333333,1.3737068666666667 -V2Cl4_11_20036.vasp,V2Cl4,-2.3868267383333333,-0.0392963916666668 -Sr3Mn2Cl2O5_123_17384.vasp,Sr3Mn2Cl2O5,-3.963598868333333,0.0077695082916462 -Hf1Ru1S2Br1Cl1_8_7277.vasp,Hf1Ru1S2Br1Cl1,-3.356507561666667,0.4522781765624963 -Sb2As2O8_31_15531.vasp,Sb2As2O8,-4.2652803775,0.1701265829166627 -In1Se1I2_1_8341.vasp,In1Se1I2,-0.6149665125,0.3662391039322916 -W2S2Br2_59_20526.vasp,W2S2Br2,-3.2739332266666668,0.2549532230555553 -Li2Nb3Te6Ir1_1_10015.vasp,Li2Nb3Te6Ir1,-3.043628696666667,-0.4906910530092631 -Cr2Te2Br2_59_4517.vasp,Cr2Te2Br2,-1.5795998216666665,-0.0141232638888901 -Hf2S1_187_7564.vasp,Hf2S1,-4.908143076666667,0.8497370216666669 -Ta2P2Se6_2_17823.vasp,Ta2P2Se6,-3.801469932,0.2475762375000001 -Li2Sn2P2O8_7_10073.vasp,Li2Sn2P2O8,-4.87273565,0.0722277746428528 -Zn2P4S8_4_21138.vasp,Zn2P4S8,-2.626934805714286,0.131575358004463 -As10Se10_26_1118.vasp,As10Se10,-2.4167965625,0.2900883766666637 -C1_191_2739.vasp,C1,-4.08591426,4.03041115 -Mn2Nb2Se6_11_11163.vasp,Mn2Nb2Se6,-3.429509656,0.1018860321293084 -V3O4F4_6_20285.vasp,V3O4F4,-4.567287782727273,-0.2453667410606153 -As2Os2Se6_162_1236.vasp,As2Os2Se6,-2.869037634,0.3576077995999971 -Ni1Au1Se4_10_13263.vasp,Ni1Au1Se4,-0.9921138916666666,0.3620389188888872 -Sn1F2_187_16630.vasp,Sn1F2,-2.283422586666666,0.4028565491666667 -Sc1Cl2_123_15918.vasp,Sc1Cl2,-2.67443264,0.2150549311111085 -As2Au1_10_1184.vasp,As2Au1,-1.5242210433333332,0.2589205274999977 -Fe2Sb4Br4O6_11_5965.vasp,Fe2Sb4Br4O6,-3.10658633125,-0.0724756475000039 -Co2Si8_125_4029.vasp,Co2Si8,-3.4836093220000004,-0.4806788020000003 -Pd2I2O2_59_14430.vasp,Pd2I2O2,-1.382653765,0.2619634696527743 -Nb2Te8Ir2_6_12931.vasp,Nb2Te8Ir2,-2.838646858333333,0.1034178020833334 -Sb2P2S8_11_15627.vasp,Sb2P2S8,-2.8673375625,0.1618364091666639 -Hf1Cd1S2Br2_6_7137.vasp,Hf1Cd1S2Br2,-2.5272196,0.20360446875 -Mn2Ga2Te5_187_11082.vasp,Mn2Ga2Te5,-1.807870635555556,0.0535364094125139 -La2As1I2_164_9576.vasp,La2As1I2,-3.040139562,0.0468909720000003 -Cr1O3_6_4226.vasp,Cr1O3,-4.6695022575,-0.2167144176562496 -Mg2P2O6_162_10495.vasp,Mg2P2O6,-5.040498722000001,0.3290373771999995 -Ni2Ir1S4I1_1_13529.vasp,Ni2Ir1S4I1,-1.56045014625,0.2646295944010401 -P4O14_4_14085.vasp,P4O14,-4.740185072777778,0.2757072486111065 -Sn4O4_57_16946.vasp,Sn4O4,-3.59736440625,0.1392809762499998 -V4O4F12_29_20347.vasp,V4O4F12,-3.7821825105,-0.6522759012499999 -Zr4Bi1Se4I7_1_21809.vasp,Zr4Bi1Se4I7,-2.2600292375,0.1878628250651002 -Mo1S2_187_11545.vasp,Mo1S2,-3.7242016,0.0419170183333332 -Ga2Co2O5_187_6330.vasp,Ga2Co2O5,-3.975828327777778,-0.1293315522222268 -Ho2Co2Ge4_129_8135.vasp,Ho2Co2Ge4,-2.8536148925,0.3830928412499998 -Mn1Sb1Br2O3_6_10857.vasp,Mn1Sb1Br2O3,-2.9911967285714285,0.193450944880948 -Cr2S4_127_4471.vasp,Cr2S4,-2.5576014183333333,0.9060117883333332 -Nb4Ge2Se8_55_13079.vasp,Nb4Ge2Se8,-4.04379386,-0.0854810500000016 -Ta4Ge2Te8_55_18047.vasp,Ta4Ge2Te8,-3.680779235,-0.1578826866666682 -As1O2_2_1156.vasp,As1O2,-3.948494266666666,0.4927089187499915 -Zr2Te2_129_21709.vasp,Zr2Te2,-3.00807721,-0.0459066750000003 -Te2Ru2Cl2_59_18514.vasp,Te2Ru2Cl2,-1.9253274466666663,0.4377223019444416 -Si4Te4_53_16520.vasp,Si4Te4,-2.70819415875,-0.1825062275000002 -Cu2Mo1S4_111_5184.vasp,Cu2Mo1S4,-2.2180310000000003,0.1745362430952355 -Ti1Sb2_164_18844.vasp,Ti1Sb2,-3.6012672633333334,0.5518241949999996 -Ni1Pd1S2I2_6_13398.vasp,Ni1Pd1S2I2,-0.932014325,0.1399231303472191 -Ta2O4F4_12_17815.vasp,Ta2O4F4,-4.963563293,0.5660441466249937 -Ta2Ni1Se6_12_17792.vasp,Ta2Ni1Se6,-3.527260382222222,-0.1409952757777814 -Hf2Br2_164_7449.vasp,Hf2Br2,-3.7517734725,0.1502452949999999 -Cu1Sb1As2S6_143_4960.vasp,Cu1Sb1As2S6,-2.412762707,0.4244525391666619 -Nb2S2_187_12845.vasp,Nb2S2,-4.8274018175,0.2841793859999946 -In2Te2H2S8_11_8621.vasp,In2Te2H2S8,-2.375905280714285,0.190803468095234 -Fe2S2_123_5939.vasp,Fe2S2,-1.7241655825,0.2575994975 -Ni1Te1O4_10_13429.vasp,Ni1Te1O4,-3.237037256666667,-0.1771579289583362 -P2Ir2O6_12_13991.vasp,P2Ir2O6,-4.566443155,0.772210769333328 -Cu1H2S2_12_4893.vasp,Cu1H2S2,-2.2717391620000003,0.2123442941666664 -Cr2H2C1S2_164_4395.vasp,Cr2H2C1S2,-3.7546976342857135,0.3714338449999876 -Ag2C4S8F4_2_230.vasp,Ag2C4S8F4,-3.008958795,0.360061698645823 -Ag2P4Cl2O3_6_356.vasp,Ag2P4Cl2O3,-2.884238510909091,0.3069009386515096 -Mg1Fe1Br2O2_8_10360.vasp,Mg1Fe1Br2O2,-2.3886026883333336,0.0684220902777714 -Zn2Mo2O8_13_21117.vasp,Zn2Mo2O8,-4.167431929166667,0.0347972497222217 -K2P2O8_11_9290.vasp,K2P2O8,-4.169944275,0.4587741372916634 -Tl2Br6_1_19385.vasp,Tl2Br6,-0.26310824625,0.1613157665625 -Si2Cl8_1_16399.vasp,Si2Cl8,-2.116414203,0.0831503529999997 -Mn3B2O2F2_187_11356.vasp,Mn3B2O2F2,-3.1021733955555555,1.2421006481055732 -V4Br4N1O2_12_20310.vasp,V4Br4N1O2,-3.6429502036363632,0.1750391697979725 -Ca2Ga2N2_129_3020.vasp,Ca2Ga2N2,-3.222064018333333,0.415726713333334 -In1Bi1F3_1_8207.vasp,In1Bi1F3,-2.048605862,0.3190526868333312 -In4Te6_1_8704.vasp,In4Te6,-1.221272522,0.158097114 -Hf2Mo2Se2S2I3Cl1_1_7536.vasp,Hf2Mo2Se2S2I3Cl1,-3.1126390891666667,0.3527777658854079 -Cr3H2N2_187_4557.vasp,Cr3H2N2,-4.437516962857143,-1.5080354705555603 -Te8P8S4_2_18708.vasp,Te8P8S4,-2.438619414,0.4121645152499965 -Nb3Se1Br7_156_13009.vasp,Nb3Se1Br7,-2.777118897272727,0.0591286518181823 -Te12Cl8_14_18274.vasp,Te12Cl8,-1.002688708,0.2746250307083333 -Y1Br2_123_20613.vasp,Y1Br2,-2.903635003333333,0.1531484561111085 -Cu2H4S2O10_2_5130.vasp,Cu2H4S2O10,-3.788507585,0.0939268173611081 -N2F6_31_11785.vasp,N2F6,-2.04929291,0.0742171374999998 -Sc2In1S1Br2_1_16102.vasp,Sc2In1S1Br2,-2.4608949033333336,0.2220651654166636 -Zr2Br2O2_164_21521.vasp,Zr2Br2O2,-4.796985431666667,0.1218652266666664 -V1Sb1W3Se1Br2_1_19921.vasp,V1Sb1W3Se1Br2,-2.81750202125,1.1073493712847131 -Ni2S8_11_13599.vasp,Ni2S8,-2.003767517,0.1495527569999979 -Ta2Te6_59_17924.vasp,Ta2Te6,-3.04475794625,0.12825144677083 -Ce1C5_25_3643.vasp,Ce1C5,-5.913231978333333,1.3320746812499933 -Be1P2O4F4_1_2228.vasp,Be1P2O4F4,-4.718700093636364,-0.0202417822727318 -Ge2Sb1Se6_162_6837.vasp,Ge2Sb1Se6,-2.3575005577777777,0.1392976406944424 -Na2Cd4Se2Cl6O6_31_12037.vasp,Na2Cd4Se2Cl6O6,-1.7767254529999998,0.2127344079166663 -Ti1Ga2S4_164_18782.vasp,Ti1Ga2S4,-3.722330341428571,-0.0338104405357169 -Zn1F2_187_20924.vasp,Zn1F2,-1.2774576633333334,0.3192545141666665 -Y2Al2Cl2_164_20691.vasp,Y2Al2Cl2,-3.450466535,0.1665969608333299 -Ni1Cl2_164_13312.vasp,Ni1Cl2,-0.2497438433333333,0.0597514833333333 -Co1H4C2Br2N6_6_3746.vasp,Co1H4C2Br2N6,-4.354206434666667,0.2726453563888763 -K2Fe2Bi2_129_9100.vasp,K2Fe2Bi2,0.1261058333333333,1.1556712535416658 -Nb4Ni4S8_53_13103.vasp,Nb4Ni4S8,-3.452321635,1.1962479383333282 -Cu4S3_123_5448.vasp,Cu4S3,-0.9820196814285714,-0.2166737702380963 -La2H4N2O10_4_9594.vasp,La2H4N2O10,-5.093646248333333,0.0678763311111065 -Te16Ir8_1_18277.vasp,Te16Ir8,-2.2317739870833333,0.2117283729166668 -P2W2S10_85_14058.vasp,P2W2S10,-3.4245739914285718,0.2742544913839253 -Te3P4Au2I2_6_18557.vasp,Te3P4Au2I2,-1.4533754618181818,-0.1105533480357188 -Cu1H4C6N6O2_6_4899.vasp,Cu1H4C6N6O2,-5.760185755263159,0.2314725876169492 -Zn1Fe1I2_8_20929.vasp,Zn1Fe1I2,0.5783322125,0.8857911490624999 -Cs3Zr2I9_187_4802.vasp,Cs3Zr2I9,-1.133713205,0.1628322189285704 -Cr1Ag1Te6P2_149_4111.vasp,Cr1Ag1Te6P2,-1.7015761609999998,0.4189175624166669 -Nb1Mo1Se4Br2_1_12534.vasp,Nb1Mo1Se4Br2,-2.54552404875,0.340002044375 -Pb2S4_12_14283.vasp,Pb2S4,-2.188485185,-0.8671012885416677 -Fe1Ge2C6N6_164_5681.vasp,Fe1Ge2C6N6,-6.186034206,0.3519644756111045 -Sb6C6_2_15846.vasp,Sb6C6,-4.362528789166666,0.8374174520833335 -Al8S6_31_1112.vasp,Al8S6,-3.0241413635714283,0.3393487119642837 -Ca2H8S4I4_53_3047.vasp,Ca2H8S4I4,-2.524881512222222,0.0539022109999978 -Li2Ce1P2_164_9857.vasp,Li2Ce1P2,-3.405914684,0.3044548581250006 -Tm1Br2_164_19661.vasp,Tm1Br2,-2.138083796666667,0.1656270227777755 -Cr2I6_189_4416.vasp,Cr2I6,-0.4952563925,0.159355955 -Ti1Mo1S6_1_18803.vasp,Ti1Mo1S6,-3.62459554,0.3865048011718748 -Re2Cl6_162_15040.vasp,Re2Cl6,-2.41597916375,0.3220039120833315 -Pb2S1Br2_12_14267.vasp,Pb2S1Br2,-1.62715429,-0.6415465059999997 -Re4Te1Se7_1_15118.vasp,Re4Te1Se7,-3.8484337975,0.2459187343749995 -Hf2Te2C1_164_7631.vasp,Hf2Te2C1,-5.239031450000001,0.0009580420000001 -V2P2Se6_8_20141.vasp,V2P2Se6,-2.946006693,0.1695297358749969 -Bi1Cl2_164_2326.vasp,Bi1Cl2,-1.0124669666666668,0.2974458861111098 -Se3O9_157_16296.vasp,Se3O9,-2.773188128333333,0.7061399751041668 -Fe3S1I1Cl3_1_6060.vasp,Fe3S1I1Cl3,-1.25948299,0.1758070164062501 -Zn2Ge1Pd1Cl8_1_21087.vasp,Zn2Ge1Pd1Cl8,-0.9320213591666668,0.134762861522816 -V2Pb4O4F10_2_20145.vasp,V2Pb4O4F10,-3.4500182995000004,0.0256804899062463 -Ca2As4S12_2_2926.vasp,Ca2As4S12,-2.710732846111111,0.4808857562499969 -Mn2Sb2Te4Br2_26_11254.vasp,Mn2Sb2Te4Br2,-1.455266339,0.2299456237499979 -Cd2Se2Cl2_59_3569.vasp,Cd2Se2Cl2,-0.33836342,0.1206759872222208 -Hf3W1Se1I4Cl1O2_1_7746.vasp,Hf3W1Se1I4Cl1O2,-3.66392647,0.6288412001562435 -Mn3B2H2S2_187_11354.vasp,Mn3B2H2S2,-3.4654397033333333,0.4240259954166602 -As1Se1Br2_1_1175.vasp,As1Se1Br2,-1.30392833,0.3191497244791667 -Ta1Nb1I2N1_1_17571.vasp,Ta1Nb1I2N1,-4.473181314,0.4423822646666588 -Hf2S1I2O1_25_7563.vasp,Hf2S1I2O1,-4.306451211666666,0.1974450141666643 -Hg2I2_129_7972.vasp,Hg2I2,1.6430366,0.4311718125000001 -Zr1Nb1Se2_8_21359.vasp,Zr1Nb1Se2,-4.32571999,-0.259120345125003 -Nb3C1I2O1_1_12957.vasp,Nb3C1I2O1,-4.706422978571429,0.4244828812871928 -Cr4N2F16_129_4607.vasp,Cr4N2F16,-2.6315791818181817,0.3911437729545407 -Ba1Ta2S7_123_1865.vasp,Ba1Ta2S7,-4.17018265,0.3678420323124962 -Ge2Te2O8_31_6885.vasp,Ge2Te2O8,-4.160261289166667,0.1596004206249994 -P4S5_6_14111.vasp,P4S5,-3.3634518455555558,0.0789206084027747 -Na2H6Pb1O6_147_12124.vasp,Na2H6Pb1O6,-3.873230576,0.0630926271666674 -Bi4O8_11_2627.vasp,Bi4O8,-3.459020789166667,0.30853005677083 -Tl2Mo6O18_10_19455.vasp,Tl2Mo6O18,-4.821485372307692,0.05891898799998 -K2Ti2P2Se10_10_9379.vasp,K2Ti2P2Se10,-2.96423531,0.122731983125 -Rb2Sn2I6_26_14943.vasp,Rb2Sn2I6,-0.623086291,0.1431834715 -Li1Ga1Br4O12_2_9707.vasp,Li1Ga1Br4O12,-2.6205506794444444,0.270130100555553 -In2N2Cl2_59_8486.vasp,In2N2Cl2,-2.558799083333333,0.2169659264583312 -Co2Se2Br2_59_4018.vasp,Co2Se2Br2,-1.6556458183333334,0.0974553583333335 -Ca2Au1S2Cl2_123_2933.vasp,Ca2Au1S2Cl2,-1.7773734928571427,0.3082827535714246 -Sb8C4_26_15862.vasp,Sb8C4,-3.4022638466666666,0.8255560049999964 -Nb2Co2S10_51_12689.vasp,Nb2Co2S10,-3.578885937142857,0.2437314024999963 -Hf2Te2_164_7640.vasp,Hf2Te2,-3.7199708825,0.4741020343750002 -Bi2Br2O2_129_2430.vasp,Bi2Br2O2,-2.699398443333333,0.0550522716666672 -As2Se1O2_5_1296.vasp,As2Se1O2,-3.5069254360000004,0.3519079503333296 -Sn2O2_31_16798.vasp,Sn2O2,-3.606563265,0.1300821174999997 -V3C2F2_187_20249.vasp,V3C2F2,-4.967293334285714,0.0283265013756506 -K2H6N2O8_1_9149.vasp,K2H6N2O8,-3.5889132938888886,0.6206489311666628 -Ag1C4S8N4_81_42.vasp,Ag1C4S8N4,-4.217807571764705,0.2990927207046524 -Cu1Sn1Ge1W1Cl4O6_1_4982.vasp,Cu1Sn1Ge1W1Cl4O6,-3.1593381428571425,0.3744126355357071 -Rb2Pb2F6_1_14918.vasp,Rb2Pb2F6,-2.417630712,0.0399269489999998 -W2S2_10_20535.vasp,W2S2,-3.9592152275,1.1496105525 -Ni2Te4_14_13678.vasp,Ni2Te4,-0.5953297433333333,0.1441621766666666 -Ba2S8Cl4_50_2051.vasp,Ba2S8Cl4,-1.9669294771428567,0.6965170010714261 -Cu4O4_26_5434.vasp,Cu4O4,-1.82313085125,0.6496576468750002 -Bi8Se8S4_2_2698.vasp,Bi8Se8S4,-2.0211974130000003,0.2269906769999998 -Mn2Ga2O5_164_11074.vasp,Mn2Ga2O5,-4.331415081111111,-0.0372913925000046 -Al1Se2O8_164_737.vasp,Al1Se2O8,-3.822975716363637,0.2517555400568141 -In1Ga1Br2N1O1_6_8250.vasp,In1Ga1Br2N1O1,-2.612654185,0.3915672581249895 -Ag1Au1F6_1_7.vasp,Ag1Au1F6,-0.65651979875,0.07890524875 -Sr2S4I4F8_30_17302.vasp,Sr2S4I4F8,-1.549854985,0.64002824413194 -Nd2Se6_129_13245.vasp,Nd2Se6,-3.28123370375,0.1551357977083333 -Cd1Ag2H12C8N16_2_3265.vasp,Cd1Ag2H12C8N16,-5.393131496410256,-2.125281429829063 -Pb2S2Br1Cl1_6_14270.vasp,Pb2S2Br1Cl1,-1.5735839166666663,-0.2149436578819476 -Cr2As4Au2O12_13_4313.vasp,Cr2As4Au2O12,-3.744097929,0.5496848617916628 -Ca2Cu1Te2F2_38_3008.vasp,Ca2Cu1Te2F2,-1.7026165985714286,0.574069488571425 -Sr4Fe2Cu4O14_6_17434.vasp,Sr4Fe2Cu4O14,-3.283234335416666,0.1430358945833298 -Mn4N3_164_11443.vasp,Mn4N3,-4.161856395714286,0.7088483739285669 -Ag1Cl1_187_47.vasp,Ag1Cl1,0.08890306,0.2182219875 -K2H8S4Br2_2_9162.vasp,K2H8S4Br2,-2.62556316875,0.0534875106250001 -Fe1Se2_164_5756.vasp,Fe1Se2,-1.6299475333333333,0.6719112249999999 -Cr1In2O4_164_4204.vasp,Cr1In2O4,-3.91775978,0.4314242001785668 -Re2S2_129_15075.vasp,Re2S2,-4.9981812975,0.6318741556249998 -Zn1Br2_187_20904.vasp,Zn1Br2,0.08585603,0.27859551375 -Nb2Os2Se8_11_12802.vasp,Nb2Os2Se8,-3.7520557691666663,0.1481893645833334 -Sc3H2N2_187_16207.vasp,Sc3H2N2,-5.22159909,-0.1257750542857181 -Nb1As1Br2O1_6_12464.vasp,Nb1As1Br2O1,-3.434019852,0.3902406559999973 -Sc3B2H2_187_16195.vasp,Sc3B2H2,-3.83732094,0.2591602864285645 -Y2F2_129_20728.vasp,Y2F2,-3.5919901025,1.281440636666662 -Zr1Ta1S1Br3_6_21451.vasp,Zr1Ta1S1Br3,-3.376026503333333,0.2728423327777696 -K2Nb1Cu1Se4_21_9255.vasp,K2Nb1Cu1Se4,-2.233709225,0.123535135 -Li1In1As2Se6_5_9727.vasp,Li1In1As2Se6,-2.251695215,0.260047188833331 -Na1Ga1P2O6_5_11863.vasp,Na1Ga1P2O6,-4.875679039,0.169245746999993 -Sc4B3Cl2_164_16222.vasp,Sc4B3Cl2,-3.804164097777778,0.1640442804999965 -Zr2Br6_162_21528.vasp,Zr2Br6,-2.24870313875,0.18493790625 -Rh2S2Br2_59_15215.vasp,Rh2S2Br2,-2.125431155,0.049811926666667 -In1Te1S1_1_8363.vasp,In1Te1S1,-1.7873938566666665,0.2691473664814802 -H2Pd1S2_164_7010.vasp,H2Pd1S2,-2.510030196,0.2731443115000004 -In2Se5_12_8599.vasp,In2Se5,-1.87429106,0.2025066880952362 -Ti4Zn2O10_59_19169.vasp,Ti4Zn2O10,-5.638971311875,0.3803223467187493 -Hf3V1Br2Cl2O4_1_7745.vasp,Hf3V1Br2Cl2O4,-5.1393378258333335,0.35666561239583 -Cs2S6Br2_11_4779.vasp,Cs2S6Br2,-1.439521094,0.5546127656250004 -Sb1Se2S6F1_1_15504.vasp,Sb1Se2S6F1,-2.15002435,0.460426478624998 -Pb2Cl2F2_129_14235.vasp,Pb2Cl2F2,-1.893103085,0.3726706166666669 -Ta4S6_2_18104.vasp,Ta4S6,-5.524912221999999,-0.1760411715000041 -Mn2In2S5_187_11122.vasp,Mn2In2S5,-2.723644985555556,-0.1322744783333334 -Zr3Se2_123_21786.vasp,Zr3Se2,-4.21304273,-0.2653345956666704 -Tl2Co2S5_156_19398.vasp,Tl2Co2S5,-1.94969202,0.4625297433333312 -B2H2W3_187_1671.vasp,B2H2W3,-5.090026951428571,0.8869015178571311 -Hg1H1S1Cl1_156_7863.vasp,Hg1H1S1Cl1,-1.054716935,0.114279601249998 -Li2Hf1H6O6_147_9959.vasp,Li2Hf1H6O6,-4.920281285333333,0.1016067590000002 -Pd1C6S4F8_10_14353.vasp,Pd1C6S4F8,-3.757049929473684,0.3381338816447282 -V2O4F2_7_20127.vasp,V2O4F2,-4.7671257075,-0.2788271140625036 -As2W2S10_85_1309.vasp,As2W2S10,-3.3282205278571437,0.4065452536160676 -Pd4I8_14_14520.vasp,Pd4I8,-0.1562726541666666,0.1349363133333333 -Co2Sb2S4Br2_10_3999.vasp,Co2Sb2S4Br2,-2.117879475,-0.256447944583336 -Cu1Sb1Te6P2_143_4969.vasp,Cu1Sb1Te6P2,-1.639200642,0.3416786249999984 -Ti2Ga1Se1Cl4_6_18940.vasp,Ti2Ga1Se1Cl4,-3.12542402,-0.1675397593200598 -Hf2Br6_189_7453.vasp,Hf2Br6,-2.53138171875,0.2606090258333302 -Na2V4O10_59_12335.vasp,Na2V4O10,-5.075637085,0.1961515806249942 -Y1C5_47_20618.vasp,Y1C5,-5.729797153333333,1.9033707411458267 -Bi4Sb4O20_14_2644.vasp,Bi4Sb4O20,-3.672370130357143,0.4726797705357105 -Ni1H4C2Br2N6_6_13332.vasp,Ni1H4C2Br2N6,-4.186819466,0.4630926583888759 -Ca5Y1_1_3253.vasp,Ca5Y1,0.0745161999999999,1.306754272499997 -K1W2S2Cl6_47_8960.vasp,K1W2S2Cl6,-2.4246920327272727,0.2113520490909055 -Pt2Se2O6_11_14677.vasp,Pt2Se2O6,-3.2567816790000004,0.1032640265833271 -Tl2Cu2H2Se2O10_11_19403.vasp,Tl2Cu2H2Se2O10,-3.10610641,0.1290077108796231 -Pb2I1Br3_1_14247.vasp,Pb2I1Br3,-0.923497965,0.1520714840277779 -Ti6N3Cl6_164_19182.vasp,Ti6N3Cl6,-5.594973456666667,0.0257220893333336 -Ag2Se1_191_427.vasp,Ag2Se1,0.19437082,0.4259860066666667 -Na2Ho2Cl8_2_12178.vasp,Na2Ho2Cl8,-2.559582386666667,0.0958437644444416 -Sc2Te8P2_2_16189.vasp,Sc2Te8P2,-2.2550193825,0.3574228048611054 -Li5Br2N1_47_10256.vasp,Li5Br2N1,-2.744622465,0.1181235274999998 -Cs2Ru2N2Cl10O2_4_4773.vasp,Cs2Ru2N2Cl10O2,-2.294422210555556,-0.0941212386805602 -Si1Hg2O4_21_16341.vasp,Si1Hg2O4,-2.929633725714286,0.2579548761904719 -Ga2C4F14_10_6317.vasp,Ga2C4F14,-3.2024826405,0.4546789405000002 -Al2F6_12_821.vasp,Al2F6,-3.99865564125,-0.0039763012500002 -Ga2S2F2_31_6441.vasp,Ga2S2F2,-2.8086535083333337,0.1340004438888857 -Li1As3_187_9655.vasp,Li1As3,-2.47957838,0.5663259440624999 -Ti1Se2_164_18851.vasp,Ti1Se2,-4.3716701066666666,0.1008117483333332 -S3N2_164_15391.vasp,S3N2,-2.924407724,0.8598234046250008 -Y3H2N2_187_20798.vasp,Y3H2N2,-5.9149195642857135,-0.101725002857147 -Sc1Bi1S2I4_1_15906.vasp,Sc1Bi1S2I4,-1.50953861,0.2945805499218752 -Ni2I2_164_13524.vasp,Ni2I2,0.60474574,1.6722625675 -Cs1Sn1O2_156_4649.vasp,Cs1Sn1O2,-2.7061771325,0.567139719375 -H4Au1C12S2_6_7051.vasp,H4Au1C12S2,-5.33915810368421,0.7898220504934146 -Sr3Cu2Br2O4_123_17366.vasp,Sr3Cu2Br2O4,-2.913984475454545,0.1115425028571384 -Pd1C6N2Cl2F4_25_14350.vasp,Pd1C6N2Cl2F4,-4.607994776,0.2702782632777725 -Tb2Co2Ge4_129_18191.vasp,Tb2Co2Ge4,-2.87958835,0.3864268562499999 -Pb2S10_7_14266.vasp,Pb2S10,-2.1912072041666666,-0.2215728562500016 -Fe2P2Se4F2_26_5921.vasp,Fe2P2Se4F2,-2.423232439,0.3742688681333332 -Hf1Te2_123_7324.vasp,Hf1Te2,-3.2642486466666667,0.4840111900000003 -Hf1Pd1Br2O2_25_7261.vasp,Hf1Pd1Br2O2,-3.819981005,0.359513675833333 -Ca10Ir2_26_2786.vasp,Ca10Ir2,-0.19598569,0.1672500391666666 -Ag2H2_164_268.vasp,Ag2H2,-0.942619345,1.10857409 -Ga2Ni2Te5_187_6410.vasp,Ga2Ni2Te5,-1.1402886877777778,0.0248526106666661 -Ag4Cl4O4_14_510.vasp,Ag4Cl4O4,-0.8693233825000001,0.3359438345833323 -Ba1Ag2O8_89_1800.vasp,Ba1Ag2O8,-2.6758675745454545,0.2260811077272668 -Te6Rh2_11_18682.vasp,Te6Rh2,-1.630587465,0.4249923022222203 -Cu4Se2S12_14_5467.vasp,Cu4Se2S12,-1.6728995066666663,0.3525607819444427 -Bi2Te1S2_164_2553.vasp,Bi2Te1S2,-2.068069416,-0.3896585665000002 -Mn6O2F12_2_11470.vasp,Mn6O2F12,-3.1061297075,-0.2252332765000024 -Sc2Cl2O2_129_16059.vasp,Sc2Cl2O2,-4.852934185,0.1335911533333336 -Cu2C6N2Cl2F8_2_5077.vasp,Cu2C6N2Cl2F8,-3.8926654135,0.1193809205104101 -Ta2O2_187_17811.vasp,Ta2O2,-6.86040571,0.877867004000001 -Ta2Pd4S4_51_17829.vasp,Ta2Pd4S4,-3.336412284,0.2661769096000004 -Hf1Fe1H6_149_7160.vasp,Hf1Fe1H6,-3.37207371625,0.7305580818750002 -Ag2C8N6_31_239.vasp,Ag2C8N6,-5.97105105,0.3040042123958268 -Os2I6_162_13853.vasp,Os2I6,-0.9634295725,0.22272917890625 -Ca1Mn1I2O1_1_2855.vasp,Ca1Mn1I2O1,-2.109434144,0.0243976989999999 -Ge2Br2_164_6756.vasp,Ge2Br2,-1.6160630075,0.16075995875 -K2Hg4S8I6_31_9185.vasp,K2Hg4S8I6,-0.5073750985000001,0.0929647444791675 -Mo1As2_164_11487.vasp,Mo1As2,-3.249353263333333,0.2927409500000002 -Te2Pd2S6_11_18472.vasp,Te2Pd2S6,-2.086729888,0.1024810539999978 -Sr1Pb1O2_1_17072.vasp,Sr1Pb1O2,-3.10632257,0.4773875223437499 -Sr2H2N2O6_59_17234.vasp,Sr2H2N2O6,-4.136330524166667,0.4961633536666577 -As6Pb6_12_1387.vasp,As6Pb6,-1.8291871266666664,0.2890980908333334 -Sn1Te4P2_164_16705.vasp,Sn1Te4P2,-2.019347394285714,-0.1795180800000033 -V2O2F2_59_20118.vasp,V2O2F2,-4.608033823333334,-0.0968969622222268 -Mn3Ge1S2_187_11378.vasp,Mn3Ge1S2,-2.606574263333333,0.2859426422222191 -Li1Au1S4O14_2_9658.vasp,Li1Au1S4O14,-3.968729941,0.0679895879999996 -K2Zr2Cu2Se6_51_9400.vasp,K2Zr2Cu2Se6,-2.4131382275,0.185743937916667 -P2Br6_26_13964.vasp,P2Br6,-1.2155744125,0.0798360924999987 -Mn1Tl2Te4_156_10918.vasp,Mn1Tl2Te4,-0.89671825,0.4087138478571415 -Tl2Se2_65_19535.vasp,Tl2Se2,-0.89305737,0.4068222710416667 -Ga1Ag1Te1Se1_8_6130.vasp,Ga1Ag1Te1Se1,-1.12325768,0.2638825718749999 -Sn4Sb8_6_16968.vasp,Sn4Sb8,-1.8192029283333333,0.1660723135416645 -In2Te3_164_8631.vasp,In2Te3,-1.321283438,0.058086198 -Sr8Si4_11_17497.vasp,Sr8Si4,-0.5841479925,0.8950732533333333 -Cs1Sn1Se2_156_4651.vasp,Cs1Sn1Se2,-1.369826355,0.3026425237500003 -Sc2S2Cl2_59_16132.vasp,Sc2S2Cl2,-3.792135625,0.0307235633333333 -In1P2S7_5_8301.vasp,In1P2S7,-2.861501992,0.1886175439687478 -Sn1Pt1S4_10_16674.vasp,Sn1Pt1S4,-2.61429389,0.0287578000000001 -Sn2Sb2H6C2O6_7_16857.vasp,Sn2Sb2H6C2O6,-4.178285636111111,0.2724162818055513 -Rh2C8_117_15181.vasp,Rh2C8,-4.869415801000001,2.240033519 -La2Br6_12_9582.vasp,La2Br6,-2.423879855,0.0458135400000001 -Sb2Pd2O7_1_15651.vasp,Sb2Pd2O7,-3.2301504436363637,0.4962934986363607 -K1Ge1O2_156_8901.vasp,K1Ge1O2,-3.1632794175,0.6569272639062469 -Mn1Zn1S2_8_10944.vasp,Mn1Zn1S2,-1.8172252525,0.2573729059999998 -B8Te4O20_14_1794.vasp,B8Te4O20,-5.5392662471875,0.1146578184895839 -B2H2_164_1672.vasp,B2H2,-4.368128215,0.4005092374404709 -Hf2B1F2_164_7436.vasp,Hf2B1F2,-5.54127935,0.0600940275000005 -V2O2_187_20124.vasp,V2O2,-4.95304052,0.5797896233333285 -Au4Se4O14_32_1602.vasp,Au4Se4O14,-2.652343735909091,0.1323669886363609 -Zr1Sc1Se2S2_3_21437.vasp,Zr1Sc1Se2S2,-3.804238461666667,0.4238125056249957 -Cu2As4S3F2_6_5019.vasp,Cu2As4S3F2,-2.17362789,0.266114345018934 -Hg1_65_7922.vasp,Hg1,2.76116682,0.3063712937931035 -Sc1Cu1P2Se6_149_15926.vasp,Sc1Cu1P2Se6,-2.646232024,0.0934967852395811 -Na2Br2O4_113_11993.vasp,Na2Br2O4,-2.2288986975,0.1507855516666651 -Ni2Se2O6_12_13636.vasp,Ni2Se2O6,-3.1462374090000003,-0.3038681475000016 -K2Os2Br8N2O4_7_9273.vasp,K2Os2Br8N2O4,-2.502578789444444,0.0702887943518448 -In2Br6_12_8396.vasp,In2Br6,-0.93980121625,0.0425271425 -Y1Ge3_187_20635.vasp,Y1Ge3,-3.0444394425,0.5678904520833306 -Hf1V1O2_25_7353.vasp,Hf1V1O2,-5.573166385,1.4897336287499996 -Ti4B3S2_164_19124.vasp,Ti4B3S2,-5.948971562222223,0.0163997857870316 -Na2Cd2Cl6_162_12018.vasp,Na2Cd2Cl6,-0.936302317,0.1371093233333329 -B6H4Au1C6O2_6_1776.vasp,B6H4Au1C6O2,-5.070138856842105,1.0741945190295958 -Cd2Ag2Te2I2_26_3452.vasp,Cd2Ag2Te2I2,0.364731515,-0.2436930149999999 -Zn2Sb2O6_162_21146.vasp,Zn2Sb2O6,-3.138813949,0.403945491874996 -Co1Au1Br2O2_6_3697.vasp,Co1Au1Br2O2,-1.3681637983333337,0.39921115256944 -Ir2Cl4_11_8778.vasp,Ir2Cl4,-1.3671527033333335,0.7088025555555535 -Ta4C3F2_164_18012.vasp,Ta4C3F2,-7.176201924444445,0.1343406659999944 -Cu1Sb1Te6As2_143_4968.vasp,Cu1Sb1Te6As2,-1.443178843,0.2672206758333318 -Cu1Bi1Te6P2_143_4857.vasp,Cu1Bi1Te6P2,-1.570610717,0.3405306149999986 -Si3Mo1_191_16470.vasp,Si3Mo1,-3.13021728,1.1013633649999992 -Na2Cl1_164_12050.vasp,Na2Cl1,-1.15129398,0.3438898370833321 -Nd1Br2_123_13215.vasp,Nd1Br2,-2.4341479,-0.0091721200000001 -Mn2Sb2I2O4_10_11235.vasp,Mn2Sb2I2O4,-2.98546805,0.1881263672499997 -Sb1W1Br6_143_15523.vasp,Sb1W1Br6,-1.24597357875,0.32091212171875 -I1N2O6_147_8158.vasp,I1N2O6,-3.635678231111112,0.2547456281944353 -Cd1S2_1_3417.vasp,Cd1S2,-0.9043156866666666,0.4625883872916655 -Te2As2O1_5_18355.vasp,Te2As2O1,-2.66699056,0.2370722379999976 -Ru1Cl2_115_15265.vasp,Ru1Cl2,-1.3938405266666667,0.7112642605555537 -K2Hg4S2I6O6_31_9178.vasp,K2Hg4S2I6O6,-1.4167520975,0.0719997326111074 -K1I2_25_8908.vasp,K1I2,0.0045438499999999,0.1486007549999998 -Ba2Ni2Sn2_129_2035.vasp,Ba2Ni2Sn2,-0.399542655,2.346112548333331 -In2S5_1_8562.vasp,In2S5,-2.3715073757142853,0.1797742691071411 -Ba2In1Ag1Hg1O5_99_2008.vasp,Ba2In1Ag1Hg1O5,-2.57167222,0.4540517652499977 -Hf2Te2_123_7642.vasp,Hf2Te2,-3.885193355,0.3088795618750002 -Sn1H2S2_164_16642.vasp,Sn1H2S2,-2.727313646,0.1973404140000002 -B18S9_143_1611.vasp,B18S9,-4.601625987407408,0.6544922937036985 -Pt4Se1S3I4_8_14709.vasp,Pt4Se1S3I4,-1.452479015,0.1127976431250001 -In2Si2Se6_162_8604.vasp,In2Si2Se6,-2.627316844,0.0474524770000002 -Ni2Te5As2_8_13679.vasp,Ni2Te5As2,-1.2157756199999998,0.2663054674999989 -Sc1Ge5_47_15939.vasp,Sc1Ge5,-2.963262411666667,-0.1077614516666669 -Ga13N2_12_6103.vasp,Ga13N2,-2.1968150226666667,-0.060283629333337 -V2Ge2S6_162_20066.vasp,V2Ge2S6,-3.4277912200000005,-0.0399701614375058 -P1Ir2Se2S2I1_1_13925.vasp,P1Ir2Se2S2I1,-2.37082259875,0.7139633498263853 -Au2Se4_14_1558.vasp,Au2Se4,-0.8003585183333333,0.4197178527777768 -Te2C1_115_18379.vasp,Te2C1,-2.4698321566666666,1.2834668177777746 -Zr2Sb2Se6_12_21664.vasp,Zr2Sb2Se6,-3.155773554,0.2374292319999984 -Cu2H12C8O12_14_5108.vasp,Cu2H12C8O12,-4.856845098529412,0.3495406439705786 -Cd2S2Br1Cl1_1_3541.vasp,Cd2S2Br1Cl1,-0.6794688566666666,0.1100527363541648 -Co2F6_189_3900.vasp,Co2F6,-1.8037599825,0.5912262325 -Ti6H4O14_4_19177.vasp,Ti6H4O14,-6.334857290833334,0.1895864059027774 -Sn1Pb1S1Br2_1_16669.vasp,Sn1Pb1S1Br2,-1.628011424,0.0738750705000003 -Sc2Se1N1Cl1_1_16151.vasp,Sc2Se1N1Cl1,-4.508159186,0.0520382403333303 -Cr1Ag1As2Se6_149_4097.vasp,Cr1Ag1As2Se6,-2.043210953,0.798811248749995 -Ca6B2C2Br4N2_31_3255.vasp,Ca6B2C2Br4N2,-3.64748372125,0.1213971878124998 -Sr2I4O12_4_17257.vasp,Sr2I4O12,-3.0703130822222224,0.1377099805555555 -Fe1Cu1C5N6O3_99_5664.vasp,Fe1Cu1C5N6O3,-4.97149266875,1.0355391276302022 -Zr2B1Se2_164_21512.vasp,Zr2B1Se2,-4.570464364,0.1895000300000009 -Sb1H1Se2O6_1_15455.vasp,Sb1H1Se2O6,-3.825275567,0.0518048968124969 -Zr1Nb1S2Cl2_6_21352.vasp,Zr1Nb1S2Cl2,-4.081060088333333,-0.0509952461111189 -Cu2I6_189_5179.vasp,Cu2I6,0.5958748575,0.352433922447917 -Bi1I2_164_2342.vasp,Bi1I2,-0.1572669766666666,0.3299441572222217 -Te4Au4Cl4_14_18574.vasp,Te4Au4Cl4,-0.4063603125,0.3422531190624989 -Rb2Br1_164_14779.vasp,Rb2Br1,-0.19133345,0.1154629166666664 -La2Br2O2_129_9580.vasp,La2Br2O2,-4.877065436666666,0.080038 -Mg2Bi4_51_10433.vasp,Mg2Bi4,-0.8238505116666667,-0.1329487061111117 -Si1_123_16379.vasp,Si1,-3.22898977,-0.2388407200000002 -Te4Mo2_127_18594.vasp,Te4Mo2,-1.0527516516666666,1.0581425983333332 -C2I6_1_2749.vasp,C2I6,-0.78312332375,0.96000480265625 -Al2Fe2Se5_187_837.vasp,Al2Fe2Se5,-2.5861238933333333,-0.3309355266666687 -V3Co3Te2O16_1_20256.vasp,V3Co3Te2O16,-4.546411394166666,0.0103893001736072 -B6Pd1I2N2F4_25_1786.vasp,B6Pd1I2N2F4,-3.915883333333333,0.6404008267592476 -Na2Ta2Cl12_4_12310.vasp,Na2Ta2Cl12,-2.5681115525,0.0492121703124999 -Cr2Te6P2_162_4532.vasp,Cr2Te6P2,-2.164103442,0.4618499660000003 -Ta4I16_14_18054.vasp,Ta4I16,-1.474674365,0.21451980321875 -Nb1Te2_115_12601.vasp,Nb1Te2,-2.7166362766666663,0.6722840844444447 -Ba2Hg1_123_2000.vasp,Ba2Hg1,0.7721885466666666,0.2494907633333332 -Cd2H4S10_31_3511.vasp,Cd2H4S10,-2.212656193125,0.1663552666406251 -As1Se2_187_1180.vasp,As1Se2,-2.117859176666667,0.4384930947222198 -Cr2Ag1S6_1_4290.vasp,Cr2Ag1S6,-2.421117745555556,0.3939958065624954 -Cd2P4H12O14_2_3529.vasp,Cd2P4H12O14,-4.319139451875,0.0754935337847153 -Ba2Au1Se2F2_38_1913.vasp,Ba2Au1Se2F2,-2.150884797142857,0.5499374047767812 -Fe1Si2_123_5758.vasp,Fe1Si2,-2.8002550566666664,0.6012436108333339 -Mn2C2Cl2_59_11044.vasp,Mn2C2Cl2,-3.3538096016666668,0.6095282783333292 -Sc2Te4_127_16182.vasp,Sc2Te4,-1.98346936,0.844892515277776 -Cr2B1H2S2_164_4320.vasp,Cr2B1H2S2,-3.469894068571429,0.6309036634999963 -Al2Te2F2_59_1002.vasp,Al2Te2F2,-2.584446855,0.4216817929166638 -Fe1B4I2N2F4_47_5627.vasp,Fe1B4I2N2F4,-4.01562002,0.2758526830288387 -Rh2Pb8_125_15211.vasp,Rh2Pb8,-1.072800869,0.5532942410000001 -Mn4B3H2S2_156_11422.vasp,Mn4B3H2S2,-3.6288269654545457,0.3595041996590876 -Co1H4C2N4Cl2_47_3749.vasp,Co1H4C2N4Cl2,-4.539458982307692,0.0770260891025583 -Ga1Cu1Se3Br1_1_6178.vasp,Ga1Cu1Se3Br1,-1.3698226616666669,0.3027897764236075 -Mo1I1Br1_156_11514.vasp,Mo1I1Br1,-1.16745488,0.4314384223611112 -Ti1O2_115_18820.vasp,Ti1O2,-6.90540394,0.3584505849999999 -P2Br2_12_13961.vasp,P2Br2,-2.0226015225,0.1896708091666648 -Tl2As2_129_19365.vasp,Tl2As2,-1.03868777,0.48011286175 -Mg1Al1F5_47_10329.vasp,Mg1Al1F5,-3.1493074757142856,0.4707774349999967 -Na2Os2C2I8O4_7_12245.vasp,Na2Os2C2I8O4,-2.5567027144444445,0.1668158028472196 -Ti4N3O2_164_19145.vasp,Ti4N3O2,-7.918434028888888,-0.2462286372222282 -Ga1N1Cl2_10_6211.vasp,Ga1N1Cl2,-2.52320835,0.3167087137499921 -Pt2S1I2F1_1_14651.vasp,Pt2S1I2F1,-0.998948835,0.4577854444444389 -As2Pb6_191_1264.vasp,As2Pb6,-0.6552474775,1.0427548374999986 -Cu2Bi2O4_11_5039.vasp,Cu2Bi2O4,-2.761227645,0.4615387894531252 -Ru2Br2N1O1_1_15297.vasp,Ru2Br2N1O1,-2.912433955,0.4620067606944369 -As2Pb2O6_1_1256.vasp,As2Pb2O6,-3.797017291,0.3684079634999997 -Pr4Br10_11_14557.vasp,Pr4Br10,-2.4403432,0.0993362507142854 -Ba1Te2H2_12_1867.vasp,Ba1Te2H2,-2.234840574,0.9681185783333336 -Mn2Mo2S8I2_129_11147.vasp,Mn2Mo2S8I2,-2.272506197142857,0.7274393627678537 -Rh2Se4_14_15246.vasp,Rh2Se4,-1.9376609083333332,0.736009598333333 -Ge6N6_12_6963.vasp,Ge6N6,-4.7765666925,0.1308767099999999 -Li4Cr2P8O26_2_10176.vasp,Li4Cr2P8O26,-5.4138271445,0.0055813967562446 -Hg2Sb2S4I2_11_8010.vasp,Hg2Sb2S4I2,-1.041535948,0.1957232448999982 -B3W4F2_164_1742.vasp,B3W4F2,-5.278041838888889,0.3411597759259197 -Mn2I1Br1F2_1_11107.vasp,Mn2I1Br1F2,-1.798229028333333,0.1090780039583322 -Nb2C1Se2_164_12665.vasp,Nb2C1Se2,-5.707715564,0.0300147959999996 -Ca1Sn1Te1Cl3_1_2885.vasp,Ca1Sn1Te1Cl3,-1.6421521616666668,0.0035652068055549 -Ni2Se2_123_13643.vasp,Ni2Se2,-0.83041426,-0.0342466550000005 -Co3Sn1Te2_187_4073.vasp,Co3Sn1Te2,-1.46571696,0.2248332138888873 -Ba2Sb1_164_2053.vasp,Ba2Sb1,-1.1382581066666666,0.4428147633333319 -Eu2I2O2_129_5603.vasp,Eu2I2O2,-4.5067809316666665,-0.9734644318750028 -Te2P4O12_18_18445.vasp,Te2P4O12,-4.302891424444444,0.7283458909259185 -Sn2S2F2_59_16838.vasp,Sn2S2F2,-2.391840608333333,0.2578664929166667 -Li2Ag1Sn2_115_9818.vasp,Li2Ag1Sn2,-1.002092078,0.3147858240000001 -Cr2O5F2_12_4441.vasp,Cr2O5F2,-3.61330623,0.3009877765277742 -Zr1P2_187_21396.vasp,Zr1P2,-3.98865085,1.1308956474999996 -Tm2Cl2O2_59_19675.vasp,Tm2Cl2O2,-4.983059776666667,0.1141652400000001 -Zn1Mo2Br1Cl1O3_8_20972.vasp,Zn1Mo2Br1Cl1O3,-3.01407012625,0.4581233131640624 -Hf1Mg6B1O7_99_7205.vasp,Hf1Mg6B1O7,-4.442756287333333,0.1044008898333257 -Mn4Se8_2_11454.vasp,Mn4Se8,-2.3041674366666665,-0.0091438233333329 -Si2Bi6_164_16389.vasp,Si2Bi6,-1.486588725,-0.3889004662500001 -Ti1H2O2_164_18789.vasp,Ti1H2O2,-5.32025973,0.9683568790000012 -V8O18_85_20399.vasp,V8O18,-5.475580336923077,0.0842415496153847 -Zn2Bi4Cl4O6_31_21043.vasp,Zn2Bi4Cl4O6,-2.5403214225,0.2330824693749998 -Na4P4S8_29_12405.vasp,Na4P4S8,-2.925753229375,0.1581118811160684 -Nb2Pt1O6_12_12821.vasp,Nb2Pt1O6,-5.811173626666667,0.0283947108333282 -Ag4I4O12_7_529.vasp,Ag4I4O12,-2.0205157145,0.0831505147499998 -Co2H4S10_4_3914.vasp,Co2H4S10,-2.724380075625,0.3255254302083304 -Ru3S3Cl6_8_15367.vasp,Ru3S3Cl6,-2.1855074941666666,0.1518687948464889 -Ga2Ge2S6_162_6364.vasp,Ga2Ge2S6,-2.947291364,-0.0892476389375032 -Ta4S6_11_18105.vasp,Ta4S6,-5.503200566,-0.154329515500005 -Cd1Pd1S2_1_3402.vasp,Cd1Pd1S2,-0.929867795,0.4959047306249999 -Zn1Pt1Se1S1I2_1_20997.vasp,Zn1Pt1Se1S1I2,-0.8252927833333333,0.2402157889583333 -Ga1Sn1S2Cl2_1_6284.vasp,Ga1Sn1S2Cl2,-2.047036585,0.2001978720833334 -Hg1Br2_1_7845.vasp,Hg1Br2,0.55228483,0.1253674966666666 -Cu2H8C6N2Cl2_2_5147.vasp,Cu2H8C6N2Cl2,-4.5763948135,0.3917276959999984 -Cd2Te2_164_3598.vasp,Cd2Te2,0.48581483,-0.383560925 -Co2O6_31_3952.vasp,Co2O6,-3.5377164125,-0.3755506393750001 -Cd2I2_2_3522.vasp,Cd2I2,1.050843955,-0.0689871708333333 -Cs2Ru2I8N2O4_7_4772.vasp,Cs2Ru2I8N2O4,-2.046400076111111,0.2952456961111092 -Cu2O2_123_5198.vasp,Cu2O2,-1.827707855,0.645080643125 -Ge12Ir4_127_6632.vasp,Ge12Ir4,-3.27813258625,0.1199956045833308 -Cd2Pd4Se6_164_3534.vasp,Cd2Pd4Se6,-0.9572762525,0.0661383608333323 -Na2Os2N2Cl10O2_1_12250.vasp,Na2Os2N2Cl10O2,-2.5817887388888887,-0.1460208876736178 -Ti4B3H2_164_19121.vasp,Ti4B3H2,-5.775859233333333,0.122085817499995 -In2Ni2O5_164_8494.vasp,In2Ni2O5,-3.0443818322222223,0.0108498612499969 -Ti1Te1Br1_156_18853.vasp,Ti1Te1Br1,-3.24415698,0.1714791533333262 -In1Ga1S2Br2_1_8257.vasp,In1Ga1S2Br2,-1.9374477316666667,0.0737868835416628 -Ti2S2_129_19001.vasp,Ti2S2,-5.32076821,-0.1239545899999994 -V1W1Se2_8_19959.vasp,V1W1Se2,-3.6233433275,0.3721458408333276 -Cd2Sn1O4_21_3579.vasp,Cd2Sn1O4,-2.092549264285714,0.2185065364285714 -Al4Sb8Te8Br2Cl16_13_1092.vasp,Al4Sb8Te8Br2Cl16,-1.8308847965789476,0.1315848735526257 -In2Se2_12_8588.vasp,In2Se2,-1.732867855,0.1705475075 -Al1S2_115_725.vasp,Al1S2,-3.178940966666667,0.3734512996874968 -Ga2Si2S6_162_6489.vasp,Ga2Si2S6,-3.315244548,0.1557795819999978 -Hg3As1Se4I1_156_8047.vasp,Hg3As1Se4I1,-0.4126374688888889,-0.0969778720833346 -Ga2Se4_12_6485.vasp,Ga2Se4,-2.0699817350000003,0.3621762438888865 -K4Hg1As2_156_9457.vasp,K4Hg1As2,-0.1331806814285714,0.2044914828571428 -Sb1W1S1Cl3_1_15524.vasp,Sb1W1S1Cl3,-2.1535770666666667,0.5621927433333301 -Ir2S2I2_11_8819.vasp,Ir2S2I2,-2.206260138333333,0.1441631922222201 -Mn1In1I1Br1_1_10774.vasp,Mn1In1I1Br1,-0.73213587,0.5050252369073276 -N1_123_11777.vasp,N1,-4.02173352,1.5120171025000009 -Rh2I1Br1_156_15193.vasp,Rh2I1Br1,-0.986667975,0.6005064091666652 -Ag2H4C4N2Cl2_2_274.vasp,Ag2H4C4N2Cl2,-4.222113020714286,0.2543940514285608 -Li2Nb1_187_10010.vasp,Li2Nb1,-2.5984995466666665,0.5623043877777754 -Li1Mn1Te2_156_9747.vasp,Li1Mn1Te2,-1.6754300325,-0.7785549485775862 -Ta4Co4S8_53_18025.vasp,Ta4Co4S8,-4.228638410625,0.2556358031250001 -Na1Fe1Sb2Te6_5_11854.vasp,Na1Fe1Sb2Te6,-1.378889249,0.3359280088999967 -Nb1Sb1As1_156_12564.vasp,Nb1Sb1As1,-3.8034113,0.5319333158333294 -Li2Cr4O10_59_9876.vasp,Li2Cr4O10,-4.79888432625,-0.0745742532682288 -Ta2I4Cl4_47_17760.vasp,Ta2I4Cl4,-2.245050636,0.0809652840000003 -Ce2Sb4Se8_12_3678.vasp,Ce2Sb4Se8,-2.485143259285714,0.4841327682142837 -In1Br2_115_8211.vasp,In1Br2,-0.7208902233333333,0.3105599870833334 -Bi4Au3Cl20_2_2594.vasp,Bi4Au3Cl20,-0.7878026877777777,0.1446075558796289 -Fe1C6Br2N2F4_25_5649.vasp,Fe1C6Br2N2F4,-4.684098612666667,0.104732491097216 -V4B3S2F2_164_20306.vasp,V4B3S2F2,-4.051432018181818,0.5569329501731524 -Ba2Sb4O12_2_2055.vasp,Ba2Sb4O12,-3.994308158333333,0.6523595538888882 -Co2Te4H2_1_4046.vasp,Co2Te4H2,-1.8145847375,0.6249326770833334 -Tl1Sb2Au1S6_149_19339.vasp,Tl1Sb2Au1S6,-1.81226677,0.3553609233749971 -Al1Ni1Br1Cl1O2_1_688.vasp,Al1Ni1Br1Cl1O2,-2.9276161283333333,0.0044611783333281 -Fe1H4C2N6F2_6_5697.vasp,Fe1H4C2N6F2,-4.622317974,0.4427813059722105 -Mn1Co2O6_12_10675.vasp,Mn1Co2O6,-3.942556728888889,-0.3895091980555584 -Mg8Pb4_1_10602.vasp,Mg8Pb4,-0.2572399025,-0.5074328758333333 -Cr1I2O1_47_4199.vasp,Cr1I2O1,-2.2619505125,-0.00982986119792 -Na2Ag1S2_12_11961.vasp,Na2Ag1S2,-1.36990465,0.3575983660833316 -Sc8Se4S1I6Cl1_1_16280.vasp,Sc8Se4S1I6Cl1,-2.8545677365,0.048690185916664 -H1Ir2Rh1O6_8_6983.vasp,H1Ir2Rh1O6,-3.966709547,0.4818371500000009 -Ag2Bi2O4_10_191.vasp,Ag2Bi2O4,-2.3899175125,0.2969802707500002 -H8Pd1C6O4_10_7096.vasp,H8Pd1C6O4,-4.969123188421053,0.4003733296491177 -Ti3B2H2Se2_187_19061.vasp,Ti3B2H2Se2,-4.943108825555556,0.00823424638888 -Hg2C4N4O4_55_7951.vasp,Hg2C4N4O4,-4.391091665,0.7197130711371049 -Ag1Te1S1_1_142.vasp,Ag1Te1S1,-0.7184135700000001,0.4492794920833321 -Bi2W4Cl16O4_2_2585.vasp,Bi2W4Cl16O4,-2.8256958584615384,0.0615304450000002 -Fe1Ag1I2N2_1_5613.vasp,Fe1Ag1I2N2,-1.66222282,0.436171048888887 -Pt2Br4_11_14603.vasp,Pt2Br4,-0.465421695,0.3168704724999999 -V2Au2S8_51_19984.vasp,V2Au2S8,-2.4511215,0.2538640388888868 -Cu2H2_164_5114.vasp,Cu2H2,-1.240917015,1.9661694525 -Hf2Se2Cl2_59_7603.vasp,Hf2Se2Cl2,-4.072743241666667,-0.0495509610416706 -Sb2S2Br2_11_15672.vasp,Sb2S2Br2,-1.9813919266666664,-0.7059962449999999 -Co1I2_187_3777.vasp,Co1I2,-0.0203909666666666,0.522827464444444 -Ta2I1N1Cl1_8_17753.vasp,Ta2I1N1Cl1,-5.010345288,0.4270910236666503 -Re2S2_164_15077.vasp,Re2S2,-4.9941116275,0.6359438256250005 -Ge2Sb2S6_2_6855.vasp,Ge2Sb2S6,-2.66415814,0.3172548567916645 -Ag2Sn2O6_51_447.vasp,Ag2Sn2O6,-2.805272107,0.3583004909999991 -Cr2F6_191_4382.vasp,Cr2F6,-2.89221260625,0.1540175624999999 -Sn3Sb2O9_174_16928.vasp,Sn3Sb2O9,-3.959440382857143,0.3647329023214247 -Hf1Ga2Ge1S4I1Br3_1_7169.vasp,Hf1Ga2Ge1S4I1Br3,-2.641375434166666,0.150598050208325 -Sb1As1Au2Cl2O6_1_15429.vasp,Sb1As1Au2Cl2O6,-2.4536893025,0.3722185684027764 -Mn2Al2Se5_164_10958.vasp,Mn2Al2Se5,-2.663957168888889,-0.0166269841570906 -Cr1H5N4O6_1_4194.vasp,Cr1H5N4O6,-4.4644144025,0.2192679824166616 -Ni1P1O3_1_13387.vasp,Ni1P1O3,-3.85216485,1.1567218735000004 -Ho2Sb2S4O2_129_8147.vasp,Ho2Sb2S4O2,-4.34274873,0.012288333624995 -Pr2Br2_164_14544.vasp,Pr2Br2,-2.3278995025,0.1111063993749997 -Li2V2Cu2O8_51_10113.vasp,Li2V2Cu2O8,-4.020673000714286,0.4052546619642742 -Cr1S1F2_47_4241.vasp,Cr1S1F2,-2.88729174,0.2275887407812473 -Hf2V1I1Cl1O4_1_7660.vasp,Hf2V1I1Cl1O4,-5.477100464444444,0.2897248664814755 -Cu2Se2_164_5305.vasp,Cu2Se2,-0.7525580725,0.1581141133333334 -Ge2Br6_1_6758.vasp,Ge2Br6,-1.18607798375,0.1621339129687485 -Bi4Rh6S4_12_2637.vasp,Bi4Rh6S4,-2.3720127664285715,0.1912773378571426 -Ti6H4O14_11_19174.vasp,Ti6H4O14,-6.21750778375,0.3069359129861109 -Sr2Br4_51_17157.vasp,Sr2Br4,-1.6841761033333331,0.1589929133333336 -Mg3Si2O9_8_10565.vasp,Mg3Si2O9,-4.904320139285715,0.3415524018749951 -Ti1I4_123_18798.vasp,Ti1I4,-1.294270502,0.3287625929999997 -As2S2O1_5_1291.vasp,As2S2O1,-3.302182924,0.5392262189999963 -In2P2O6_1_8518.vasp,In2P2O6,-4.666168162,0.1311019310714245 -Li1Fe1F4_81_9694.vasp,Li1Fe1F4,-2.3711378716666665,0.4098022733333337 -Al18Se9_143_590.vasp,Al18Se9,-2.3115160444444447,0.4620502738888861 -Mg1Cr2F12_2_10353.vasp,Mg1Cr2F12,-2.745859387333333,0.0448584446666644 -K2C2O6_4_9016.vasp,K2C2O6,-4.73640908,0.1272050210000008 -Mo2C2Cl2_59_11588.vasp,Mo2C2Cl2,-3.930784471666666,0.5102114372222157 -Ga1Ge1Se3_174_6194.vasp,Ga1Ge1Se3,-2.07695015,0.459345370666664 -Y4S6_1_20836.vasp,Y4S6,-4.949527315,0.4586841697499997 -K4P4H12O12F4_7_9490.vasp,K4P4H12O12F4,-4.120507721944445,0.0725187443333256 -Si1Br4_123_16323.vasp,Si1Br4,-1.017413596,0.5496963720000001 -Bi2Se2S1_164_2545.vasp,Bi2Se2S1,-2.18521419,0.0629739000000002 -Cu2Ge4P6_6_5101.vasp,Cu2Ge4P6,-2.9732802541666667,0.1917275375000002 -Te1Mo1Os1I1Br4_1_18300.vasp,Te1Mo1Os1I1Br4,-1.3527952825,0.281375036171873 -V2Ni1S4_164_20115.vasp,V2Ni1S4,-3.1777890285714285,0.0437176719841212 -Zn2Au2Se4_1_21039.vasp,Zn2Au2Se4,-0.30727397,0.380787846875 -In2S2_164_8553.vasp,In2S2,-2.213887635,0.0657825300000003 -Cd2P4H8O8_13_3530.vasp,Cd2P4H8O8,-3.981582676818182,0.0804014594949387 -Ti3C2Cl2_187_19072.vasp,Ti3C2Cl2,-6.21903452,-0.1414805500000056 -Ag2S4O1_21_392.vasp,Ag2S4O1,-1.3666501885714286,0.7040976815624984 -Dy2S2I2_164_5531.vasp,Dy2S2I2,-3.2494456316666667,0.0378685083333332 -Ti4Cl4O4_7_19134.vasp,Ti4Cl4O4,-5.321385005,0.211852227777773 -Mn1Sb1Se2_1_10863.vasp,Mn1Sb1Se2,-1.8825650875,0.3807921062500002 -Re1Se2_115_15021.vasp,Re1Se2,-3.472476206666667,0.6892876316666663 -Hf1Ir1Br4Cl2_1_7204.vasp,Hf1Ir1Br4Cl2,-2.1027363925,0.3345879152604125 -Te2P2H2O10_4_18436.vasp,Te2P2H2O10,-4.66996311625,0.0426113063020787 -Zr2Se1I2_8_21671.vasp,Zr2Se1I2,-2.641467608,0.1322683350000002 -Tl2In2P4Se12_2_19448.vasp,Tl2In2P4Se12,-2.2637895035,-0.1347112164999999 -Zr1Mn1F6_1_21321.vasp,Zr1Mn1F6,-3.7479311075,0.1051794699999999 -Cd3F6_143_3614.vasp,Cd3F6,-1.1618309088888887,-0.012865562222222 -Hf2Ag1S3I1Br3_1_7424.vasp,Hf2Ag1S3I1Br3,-2.768333544,0.2956915904999957 -Zr1F2_115_21283.vasp,Zr1F2,-3.7313778266666655,0.7688290566666626 -Ag2H4C6Br2_1_278.vasp,Ag2H4C6Br2,-4.081927889285714,0.3985795421428566 -Tl1S1_156_19330.vasp,Tl1S1,-0.94742392,0.6483997610937501 -Mo2Cl10_6_11592.vasp,Mo2Cl10,-1.2390051225,0.2876526395833334 -B6H4Pd1C2I2_6_1778.vasp,B6H4Pd1C2I2,-3.892957735333333,0.7129710228675105 -Ru1S2_115_15291.vasp,Ru1S2,-2.9900147666666665,0.6247287616666668 -V1Ag1I1Br1_6_19752.vasp,V1Ag1I1Br1,-0.525622155,0.3621949583333333 -Zr2F4_11_21562.vasp,Zr2F4,-4.040016021666667,0.4601908616666618 -Ca4Pb4I16_14_3234.vasp,Ca4Pb4I16,-0.8232406170833334,0.1733178983055554 -Ag2S4_14_393.vasp,Ag2S4,-1.2863194233333333,0.2317948196875001 -Ge1W1Se2I3Br1_1_6723.vasp,Ge1W1Se2I3Br1,-1.51906313375,0.192600243125 -Ti3B2O2_187_19064.vasp,Ti3B2O2,-6.696676951428572,0.2359718704761846 -Ge2S1Br2_1_6821.vasp,Ge2S1Br2,-2.216096422,-0.3287740324999999 -Sb2Br6_150_15554.vasp,Sb2Br6,-0.98616822,0.11267040125 -Sr1Cu1S1Br2F1_1_17041.vasp,Sr1Cu1S1Br2F1,-1.5971493233333334,0.3640232912698391 -Si4As4S4_17_16483.vasp,Si4As4S4,-3.663848840833333,-0.6291616299999998 -Tl2Fe2Se4_12_19417.vasp,Tl2Fe2Se4,-1.24464858625,0.3541353488888886 -Hf2Se10_59_7592.vasp,Hf2Se10,-3.2057245066666664,0.0748354833333335 -H2Rh1_187_7024.vasp,H2Rh1,-2.737053553333333,1.5074345899999968 -Hg3As1S4Cl1_156_8045.vasp,Hg3As1S4Cl1,-0.8297840922222223,0.2482155320833304 -Na2N2O6_2_12219.vasp,Na2N2O6,-4.331569995000001,0.078291576999999 -Ca2Cu1Se2Cl2_38_3003.vasp,Ca2Cu1Se2Cl2,-1.72337434,0.177606567380949 -Ni1H2_187_13328.vasp,Ni1H2,-1.8111412566666667,1.4070156583333306 -In3S1I2_1_8655.vasp,In3S1I2,-1.067157075,0.3580201599999987 -Sr2Bi4S8_11_17147.vasp,Sr2Bi4S8,-2.595057502142857,0.1672094928571428 -Ir2O6_31_8802.vasp,Ir2O6,-3.41994958625,0.9025978803125 -Sr4Ga2Bi4O14_4_17439.vasp,Sr4Ga2Bi4O14,-4.061773536666666,0.1551222943749928 -Li1Au1I4_2_9657.vasp,Li1Au1I4,-0.2374942833333333,0.0727071708333331 -Ta2H2C1_164_17745.vasp,Ta2H2C1,-6.10193268,0.3150368604999998 -Cs2H2C2O6_4_4712.vasp,Cs2H2C2O6,-4.805504945,0.0974595791666663 -Ag2H8C12N10_2_287.vasp,Ag2H8C12N10,-5.8053580459375,-1.4521460664062535 -Lu2S2I2_59_10315.vasp,Lu2S2I2,-3.1989039600000004,0.0487845783333331 -Y3H2C2S2_187_20795.vasp,Y3H2C2S2,-5.0350719433333335,0.4953612744444335 -Li1Ga1Sb2O6_5_9714.vasp,Li1Ga1Sb2O6,-3.815675074,0.6676638635833294 -Li2Fe2P4O14_2_9911.vasp,Li2Fe2P4O14,-4.447254885909091,0.7191833668181822 -In1N1_187_8280.vasp,In1N1,-3.20141852,0.8307533512500003 -Hg2Se2I2_59_8018.vasp,Hg2Se2I2,0.349667855,0.2997605710416653 -Rb2Cd4Te2S6F6_31_14829.vasp,Rb2Cd4Te2S6F6,-1.356075237,0.2547107813958309 -In1Cu1Se2_6_8238.vasp,In1Cu1Se2,-1.2442133475,0.2900841300000001 -Cd1Pb2S2I2_12_3396.vasp,Cd1Pb2S2I2,-1.0497989728571429,-0.3368544570238108 -Hf1Se1I1Cl1_6_7304.vasp,Hf1Se1I1Cl1,-3.010009745,0.3185245820312503 -Fe2Te4As2Br2_26_6009.vasp,Fe2Te4As2Br2,-1.507807093,0.2024046452222193 -Co2O2_6_3949.vasp,Co2O2,-3.078727815,-0.1115600649999999 -Hf2Au1I2O2_8_7433.vasp,Hf2Au1I2O2,-4.075977921428572,0.2975538496428522 -Mn2Mo1Se1Cl6_1_11133.vasp,Mn2Mo1Se1Cl6,-1.7855102509999998,0.1761408477500002 -P4O6_59_14089.vasp,P4O6,-4.959697507,0.2991062466000009 -Ni2Mo2Cl2O8_129_13535.vasp,Ni2Mo2Cl2O8,-3.417976825,0.0791041990178521 -Mn2Sb2Te6_12_11261.vasp,Mn2Sb2Te6,-1.550562216,0.2758537356666647 -Ga2S5_12_6456.vasp,Ga2S5,-2.678716787142857,0.1557627912499974 -Ti2P2S6_162_18982.vasp,Ti2P2S6,-4.283836079,0.1896575522499954 -N2Cl10_51_11778.vasp,N2Cl10,-0.3973334775,0.6943542783333297 -Mg1Cu1O2_115_10354.vasp,Mg1Cu1O2,-2.9791781575,0.2107201690625002 -Nb4Zn4Sb2O16_1_13185.vasp,Nb4Zn4Sb2O16,-4.829121248846154,0.2300850539102473 -Sb2Se2I2_59_15694.vasp,Sb2Se2I2,-1.4989479033333335,0.1001954375 -Sn2S2Br1Cl1_6_16835.vasp,Sn2S2Br1Cl1,-1.8263085666666663,0.1858338179166669 -In1Au3S4Br4_6_8206.vasp,In1Au3S4Br4,-0.7559128216666666,0.2983287963194435 -Pd2Se6_11_14502.vasp,Pd2Se6,-1.71466381375,0.2485858858333333 -Ru1S1Br2_47_15285.vasp,Ru1S1Br2,-1.6959656875,0.3654490374999999 -Mo2S6_11_11677.vasp,Mo2S6,-3.15343130625,0.3256288573437502 -Fe2Te4P2Cl2_10_6017.vasp,Fe2Te4P2Cl2,-1.747342582,0.2196113935833323 -Co1H4C6N2Cl2_25_3763.vasp,Co1H4C6N2Cl2,-5.247043595333333,0.2113845171666608 -Sn2Sb1S6_162_16849.vasp,Sn2Sb1S6,-2.558845608888889,0.1075694577430504 -Cd2Te6Pd4_164_3602.vasp,Cd2Te6Pd4,-0.6150715833333333,-0.117181264166667 -Si6Sb2_191_16542.vasp,Si6Sb2,-2.64294358875,0.1705599668749999 -K4Ba4Sb4Se12_14_9415.vasp,K4Ba4Sb4Se12,-2.1745394325,0.1085184764062476 -Hg1S1I1F1_156_7908.vasp,Hg1S1I1F1,-0.25459139,0.2969299834114574 -Pb1I2_115_14187.vasp,Pb1I2,-0.40716255,0.3133432161111111 -Zn2B4H16_26_21041.vasp,Zn2B4H16,-3.3320707827272726,0.0097713345454542 -Bi16F4_10_2307.vasp,Bi16F4,-1.4595793925,-0.3184612986666689 -Cu2W1O4_111_5361.vasp,Cu2W1O4,-3.6785040642857134,0.6058007083928509 -Hf1H1Se1Cl1_156_7189.vasp,Hf1H1Se1Cl1,-3.45691641,0.6491601192187504 -Sr3Ag2Cl2O4_123_17344.vasp,Sr3Ag2Cl2O4,-2.771140840909091,0.0449436990259713 -Mg1Mn2S5Cl2_1_10387.vasp,Mg1Mn2S5Cl2,-2.328239808,0.5701637419374976 -Ca1Ga1S1I1Cl1_1_2836.vasp,Ca1Ga1S1I1Cl1,-1.872194718,0.3203486008999971 -V4S6_11_20363.vasp,V4S6,-3.886826677,0.0938454800000001 -Mn1P2O2_1_10837.vasp,Mn1P2O2,-4.135504378,0.7067388847037002 -Hf2Cl8_13_7483.vasp,Hf2Cl8,-3.09845132,0.0667473435000003 -Cr2Cu2O8_51_4366.vasp,Cr2Cu2O8,-3.8133569291666665,-0.0205688698958397 -Rb2Hg4S8I6_31_14875.vasp,Rb2Hg4S8I6,-0.508805584,0.2403869970625002 -Mg2Sb4O10_2_10507.vasp,Mg2Sb4O10,-4.301163494375,0.1759407721874999 -Ba4Mn2I2O6_129_2162.vasp,Ba4Mn2I2O6,-3.7153096014285714,0.1320122888485202 -V4B3H2_164_20304.vasp,V4B3H2,-4.561576386666667,0.478078804444439 -Nb2Se4I4_12_12886.vasp,Nb2Se4I4,-2.391425282,0.0599594809999999 -Na2Ru2C2S4Br8_7_12277.vasp,Na2Ru2C2S4Br8,-2.093513376111111,0.2416286255555536 -K2Y1O2_164_9389.vasp,K2Y1O2,-3.814372576,0.193061428 -Cu2Se1_191_5296.vasp,Cu2Se1,-0.1560741566666666,0.2596232424999989 -Li2V2Au4S12_4_10111.vasp,Li2V2Au4S12,-2.125655733,0.280588385944442 -Nb1Br2_164_12481.vasp,Nb1Br2,-2.646995466666666,0.3143140545833295 -Al2Tl2Se6_31_1029.vasp,Al2Tl2Se6,-2.070496987,0.2963764086666648 -K2H6C6S6_1_9146.vasp,K2H6C6S6,-4.178978851,0.2194290544999921 -Hg1H1Br1O1_156_7858.vasp,Hg1H1Br1O1,-1.49628528,0.1564616785416672 -Sr2Mg4_51_17274.vasp,Sr2Mg4,0.5080132199999999,0.4570837291666666 -Hg4F8_115_8073.vasp,Hg4F8,-0.1749266141666666,0.2718169416666666 -Cu1Pt2Se5Br1Cl1_1_4945.vasp,Cu1Pt2Se5Br1Cl1,-1.354943987,0.2981407587499998 -Ge2Cl2F2_129_6764.vasp,Ge2Cl2F2,-2.4751984016666664,0.0807453025000004 -Ag2Mo1O4_1_325.vasp,Ag2Mo1O4,-3.008999477142857,0.2989141249999996 -Ga3Se1S2Cl4_1_6536.vasp,Ga3Se1S2Cl4,-1.942517831,0.2555686974166648 -Na2Ru2I8N2O4_7_12279.vasp,Na2Ru2I8N2O4,-2.135110363888889,0.1388700475694423 -Ga1Au1S2I1Cl1_1_6138.vasp,Ga1Au1S2I1Cl1,-1.1971924983333333,0.2710027417187475 -Hf4S2N3_164_7805.vasp,Hf4S2N3,-7.155564744444444,-0.0281456650000073 -Cs1Br2_25_4635.vasp,Cs1Br2,-0.1884086833333333,0.5833719670833326 -Hg2C2S2N2Cl2_31_7949.vasp,Hg2C2S2N2Cl2,-2.898910462,0.1946824925208267 -Ta2S4F4_12_17860.vasp,Ta2S4F4,-4.353005628,0.1359051291749975 -V4S2_129_20360.vasp,V4S2,-3.805975945,0.1324576248214246 -Ba5Tm1_1_2203.vasp,Ba5Tm1,0.260957265,0.9368533491666652 -Mn3Hg2O8_10_11389.vasp,Mn3Hg2O8,-3.137195767692308,0.2051316746153846 -W1S1Br2_47_20447.vasp,W1S1Br2,-2.4114425275,0.3312744023958331 -Tl1Co5Br2_123_19245.vasp,Tl1Co5Br2,-0.70533932375,0.5720063299999989 -Ba2Ni2F8_31_2033.vasp,Ba2Ni2F8,-2.6134825308333336,0.1090586291666664 -As4O6_81_1333.vasp,As4O6,-4.366867581999999,0.1183699900000005 -V4Cl16_14_20318.vasp,V4Cl16,-1.821249762,0.030202024 -P1Se1Br1_156_13946.vasp,P1Se1Br1,-1.8533905333333331,0.3591940504444428 -Zn4C8S8N8_2_21214.vasp,Zn4C8S8N8,-4.692433554642856,0.0547075570297501 -Sr2C2O6F2_59_17160.vasp,Sr2C2O6F2,-4.968647211666666,0.245633154270823 -Fe1Te1S1_156_5765.vasp,Fe1Te1S1,-1.5593445566666666,0.2857607488888873 -Ru1Au1Br2O2_6_15257.vasp,Ru1Au1Br2O2,-1.73606986,0.654672128541667 -P4F12_14_14079.vasp,P4F12,-3.195263756875,0.1359371956249999 -V2Br1N1Cl1O1_6_19999.vasp,V2Br1N1Cl1O1,-4.131436618333333,0.0557252257638797 -Nb1As2_187_12466.vasp,Nb1As2,-4.25203118,0.526901473333333 -Ag2I6_191_322.vasp,Ag2I6,0.68590563875,0.3215335021875 -Ag2Se2F2_59_432.vasp,Ag2Se2F2,-0.7147263349999999,0.1669334676190462 -Zn1I2_187_20960.vasp,Zn1I2,0.6616744366666667,0.34499659875 -Ca2N2_164_3072.vasp,Ca2N2,-3.188712535,0.8850732671874999 -Li2Cu1F5_6_9879.vasp,Li2Cu1F5,-2.351218755,-0.0369758768750001 -Cu2H8C8Br2_2_5149.vasp,Cu2H8C8Br2,-4.454482636,0.3093089949999995 -Ca2S4Br4F8_30_3106.vasp,Ca2S4Br4F8,-1.7550624611111112,0.6046102627777744 -Hg2H4Se2S8_31_7968.vasp,Hg2H4Se2S8,-1.973147500625,0.0225093400781247 -Te4Cl4_12_18583.vasp,Te4Cl4,-1.00899982625,0.19469590796875 -Pr2N2O10_4_14548.vasp,Pr2N2O10,-5.012639184285715,0.1502732639285662 -Al2Si4H1O12_12_990.vasp,Al2Si4H1O12,-6.026148040526316,-0.1025194641776425 -Pb2C2N4_11_14231.vasp,Pb2C2N4,-5.60467167375,-0.3605896389583395 -Te2Pt2O6_11_18485.vasp,Te2Pt2O6,-3.2329873630000003,0.2040912074999973 -Pb4S4_28_14317.vasp,Pb4S4,-2.06273876,-1.3896053149999998 -Al2Ga1S3I1Cl1_8_842.vasp,Al2Ga1S3I1Cl1,-2.58144802875,0.2372002172656246 -K2Ru2N2Cl8O4_31_9322.vasp,K2Ru2N2Cl8O4,-2.5520627016666664,0.1889261313888842 -Ag2S4I2_4_391.vasp,Ag2S4I2,-1.02194690125,0.1132588459375001 -Cu2S4Br2_4_5256.vasp,Cu2S4Br2,-1.3426687675,0.0773736625000001 -Pd1C8Cl2F4_25_14355.vasp,Pd1C8Cl2F4,-4.52288071,0.5449638462222164 -Cr2P2O10_129_4446.vasp,Cr2P2O10,-5.205862874285714,-0.0422361831547643 -Y1Mn1Se2Cl2_1_20653.vasp,Y1Mn1Se2Cl2,-2.936535455,0.2329807652083261 -Na2Pd3O4_6_12268.vasp,Na2Pd3O4,-2.2577779322222225,0.5095000185185156 -Tl2In2Cl8_10_19444.vasp,Tl2In2Cl8,-1.2504198758333334,0.0889214552777765 -Mn1S1I1Br1_1_10850.vasp,Mn1S1I1Br1,-1.28276262,0.36323666359375 -Si6P6_2_16538.vasp,Si6P6,-4.2916013175000005,0.1049403416666656 -Al4As4_127_1057.vasp,Al4As4,-2.52562576,-0.2122002599999999 -Ta2N1O2_164_17780.vasp,Ta2N1O2,-7.596410822,0.2676249626666598 -Nb2Co4Se4_51_12698.vasp,Nb2Co4Se4,-3.136269379,0.1236566785000001 -K4P4Se24_29_9496.vasp,K4P4Se24,-2.061771465,0.0957918521874998 -Hg2N2Cl2_59_7976.vasp,Hg2N2Cl2,-0.5017855866666666,0.9683902324999988 -Mn3H2C2S2_187_11384.vasp,Mn3H2C2S2,-3.7974054133333337,0.361415977777763 -Ti2Tl2P2S10_2_19051.vasp,Ti2Tl2P2S10,-3.572041845,0.1621211531249997 -In2I1Br1O1_1_8473.vasp,In2I1Br1O1,-1.572073368,0.4038145737083308 -Ga1O2_115_6224.vasp,Ga1O2,-3.597677953333333,0.3519195937499964 -Rh1Cl2_187_15149.vasp,Rh1Cl2,-0.82712522,0.8115647099999984 -Ag2Se2Br2_59_429.vasp,Ag2Se2Br2,-0.3506167216666667,0.3546953794444438 -Y1S2_115_20664.vasp,Y1S2,-3.964970456666667,0.97818658052083 -Hg3H2S2O10_2_8059.vasp,Hg3H2S2O10,-3.110352707058824,0.0575863055294045 -Sr5Sc1_1_17490.vasp,Sr5Sc1,0.4780296116666667,1.178893924166665 -Zr1I1Br1_156_21307.vasp,Zr1I1Br1,-2.2488196466666666,0.0927162808333335 -Au1S2_164_1442.vasp,Au1S2,-1.0625040266666663,0.4846499497916654 -Pd4Se2Br5Cl1_1_14525.vasp,Pd4Se2Br5Cl1,-0.7804108241666667,0.0447607479166655 -Zn2Br2_164_21053.vasp,Zn2Br2,0.47243711,0.0178048228125 -V4Zn4O8_1_20383.vasp,V4Zn4O8,-3.67270231375,0.1933044312499963 -Cu2Br1Cl1O2_1_5046.vasp,Cu2Br1Cl1O2,-1.2594450216666666,0.1982171933333317 -Te4Pt3_12_18622.vasp,Te4Pt3,-1.6126943842857142,0.2559188714285714 -Bi7S9Cl3_6_2682.vasp,Bi7S9Cl3,-2.068392401052632,-0.3426720585526336 -In2I2N2_59_8475.vasp,In2I2N2,-2.0900612683333333,0.419809452499998 -Zr2I2_129_21594.vasp,Zr2I2,-2.087014615,0.4450354025 -Sc1C3_156_15916.vasp,Sc1C3,-5.484304535,1.4800026182499932 -Cd3Sb1_191_3618.vasp,Cd3Sb1,1.73066214,0.27259763875 -Mn1Co1Te3Rh1Br1_6_10673.vasp,Mn1Co1Te3Rh1Br1,-1.5957990814285714,0.2425794018452347 -Sb4Au2Se3F2_6_15768.vasp,Sb4Au2Se3F2,-1.3613365581818182,0.9242539627272688 -Yb1Cl2_164_20854.vasp,Yb1Cl2,-2.6631143366666667,-0.2267031066666667 -In2Ge2S6_162_8450.vasp,In2Ge2S6,-2.80141363,-0.141608458437503 -K2Ti2P2S10_10_9378.vasp,K2Ti2P2S10,-3.601075703125,0.1272373618750002 -Ge4P4S4_17_6936.vasp,Ge4P4S4,-3.4396900075,-0.5902594433333355 -Mg1Sb2F12_115_10397.vasp,Mg1Sb2F12,-2.545497559333333,0.0432764486666661 -Nb2C1_164_12666.vasp,Nb2C1,-6.472286486666667,1.4702976891666657 -Be2Cd1_123_2247.vasp,Be2Cd1,-0.2049047533333333,0.358267698333333 -Hg2C2N4_4_7948.vasp,Hg2C2N4,-4.2813267675,0.017009855739936 -Sn1Te1Br1O1_1_16697.vasp,Sn1Te1Br1O1,-2.02687278,0.4391527391666666 -Ca2C2S6Cl2_59_2969.vasp,Ca2C2S6Cl2,-3.2117396741666666,0.2797679434895745 -Ta6Ge2S12_26_18143.vasp,Ta6Ge2S12,-5.017043184,-0.0097549765 -Os2Br2N2_59_13830.vasp,Os2Br2N2,-3.7814456966666663,0.039291814166664 -Na1Ga1Sb2Te6_5_11869.vasp,Na1Ga1Sb2Te6,-1.401568599,0.3470067598571396 -Rb1Ge1S2_156_14733.vasp,Rb1Ge1S2,-2.102230765,0.5903405459375 -In4Br8_2_8668.vasp,In4Br8,-0.9544708958333332,0.0769793145833334 -Au1Br1_156_1411.vasp,Au1Br1,0.69714388,0.39815396375 -Ni3Sn1S2_187_13727.vasp,Ni3Sn1S2,-0.85185071,0.2218049358333323 -Bi1S2F2_164_2371.vasp,Bi1S2F2,-1.742645852,0.882453032312498 -V2Ag2As4O12_2_19969.vasp,V2Ag2As4O12,-3.89120837,0.3541352893333288 -Mo2S2_25_11672.vasp,Mo2S2,-3.186818955,0.98007918625 -Ga2O3_150_6420.vasp,Ga2O3,-3.905488806,0.1625954912499965 -Cr2Ag2S8_51_4300.vasp,Cr2Ag2S8,-2.093410815,0.39745290984375 -Pd2S2O8_75_14465.vasp,Pd2S2O8,-2.937780753333333,0.8565012066666662 -Ni2Cl4_14_13497.vasp,Ni2Cl4,-0.248457495,0.0610378316666666 -Na2Zr2Cu2Se6_11_12347.vasp,Na2Zr2Cu2Se6,-2.622507515,0.1452448524999998 -Y2Ge1I2_164_20736.vasp,Y2Ge1I2,-3.384615044,0.0377361279999997 -Mn1Cu1Se1S2_1_10691.vasp,Mn1Cu1Se1S2,-1.934193906,0.2647648851999976 -Rb2Hg4Cl6O8_31_14865.vasp,Rb2Hg4Cl6O8,-1.1613557335,0.2521466026249959 -Ni1Ru1S2Cl2_25_13408.vasp,Ni1Ru1S2Cl2,-1.89711872,0.0650007075 -Zr2Se2Br2_59_21672.vasp,Zr2Se2Br2,-3.357869511666667,0.0418953583333334 -Cu2C2N4_51_5063.vasp,Cu2C2N4,-4.949662715,0.3594760897916611 -Re2O2_6_15065.vasp,Re2O2,-5.7649787575,0.8453814918750007 -Ge1F2_187_6664.vasp,Ge1F2,-2.697306923333333,0.4473862483333337 -Tl2Sb2O6_162_19516.vasp,Tl2Sb2O6,-3.732844409,0.0617176239999999 -Al1Co5F2_123_633.vasp,Al1Co5F2,-1.7277429875,0.9109638862499968 -Cr2Te2_164_4526.vasp,Cr2Te2,-2.123761605,0.4171160374999962 -Co2Te4Cl2_2_4043.vasp,Co2Te4Cl2,-1.39947434375,0.0395301843124988 -Hf2Cl2O2_59_7473.vasp,Hf2Cl2O2,-5.436415978333333,0.2949212779166639 -Mo2O4F4_26_11647.vasp,Mo2O4F4,-4.05046802,0.0707839029999997 -Ta2F2_129_17720.vasp,Ta2F2,-4.1610315975,2.014293698000001 -V2I2N2Cl6_2_20092.vasp,V2I2N2Cl6,-2.3373965491666664,0.0094697548958289 -Zr4Br4O4_7_21810.vasp,Zr4Br4O4,-4.592386065,0.3264645933333332 -Mn2Sb2Te4I2_26_11259.vasp,Mn2Sb2Te4I2,-1.315594844,0.2031784469999979 -H6O2F2_31_7086.vasp,H6O2F2,-3.868421062,0.0372533509999994 -Mn1Se1Cl1O1_25_10876.vasp,Mn1Se1Cl1O1,-2.626787265,0.0253750507499979 -Sr2Ir1_123_17268.vasp,Sr2Ir1,-0.7156771333333333,0.4305600788888879 -Cr2Br6_162_4335.vasp,Cr2Br6,-1.09775010125,-0.0864986424999998 -Zn1Bi1Br2O2_1_20899.vasp,Zn1Bi1Br2O2,-1.835211885,0.2721320608333327 -Te2Pd2I2_59_18468.vasp,Te2Pd2I2,-0.7924916033333332,-0.0617560099999999 -Ba2Cu1I2O2_123_1964.vasp,Ba2Cu1I2O2,-2.461276904285714,0.338052420491068 -Sr1Au2O8_89_17026.vasp,Sr1Au2O8,-2.6393791818181818,0.3294861731818153 -Ag1Sn1S1I2_1_133.vasp,Ag1Sn1S1I2,-0.7250948580000001,0.1345273673333334 -Ni2Cl2_164_13495.vasp,Ni2Cl2,0.092713815,1.71433531 -Cs2Hg4Te2Cl6O6_31_4743.vasp,Cs2Hg4Te2Cl6O6,-1.344916354,0.2599118870833301 -Sr2Tl1Cd1Ag1O5_99_17332.vasp,Sr2Tl1Cd1Ag1O5,-2.38583796,0.2938167428416646 -Ba4Te4O16_14_2191.vasp,Ba4Te4O16,-3.905258080833333,0.3332887629166667 -Sc2As2O6_157_16025.vasp,Sc2As2O6,-5.2346789000000005,0.3107673838749991 -Ta2Co2Se6_11_17703.vasp,Ta2Co2Se6,-3.533628437,0.158672485499999 -Rb1Hf1Mg6O7_99_14738.vasp,Rb1Hf1Mg6O7,-4.109008721333334,-0.0897883145757667 -K2Mg1Se2S8F4_2_9225.vasp,K2Mg1Se2S8F4,-1.9921546852941177,0.6851733342156812 -W4N4Cl12_2_20588.vasp,W4N4Cl12,-3.352089854,0.0448029079999972 -Mo1Br1Cl1_156_11496.vasp,Mo1Br1Cl1,-1.4612328066666669,0.6191762693055556 -Y1Br1_156_20611.vasp,Y1Br1,-2.744439265,0.606275759166663 -Zn1O2F2_65_20985.vasp,Zn1O2F2,-1.654929026,0.6459637990000001 -Zr1Pd1I6_149_21402.vasp,Zr1Pd1I6,-0.877962305,0.1584608967708332 -H2W3C2_187_7037.vasp,H2W3C2,-5.57000883,0.3837537849999946 -Ga1Se1Br2_1_6269.vasp,Ga1Se1Br2,-1.2201443175,0.3490383776041667 -Ca2Mg4_59_3063.vasp,Ca2Mg4,0.4181307716666667,0.4344363725 -Na2H10Ru2N2O2_1_12093.vasp,Na2H10Ru2N2O2,-3.502567396111111,-1.567580229708335 -K4Si2P4_49_9515.vasp,K4Si2P4,-2.406919491,0.1438142679999998 -Ti4O4F8_4_19149.vasp,Ti4O4F8,-5.36241091125,0.0972462837500005 -Ni2Se2S6_12_13639.vasp,Ni2Se2S6,-1.778795021,0.3125460037916646 -Si1I2_187_16345.vasp,Si1I2,-1.0631700666666666,0.2466509919444433 -Ti4H2C3S2_164_19136.vasp,Ti4H2C3S2,-6.2016843663636365,0.3330448272727215 -Au2Br2O2_59_1450.vasp,Au2Br2O2,-0.625004665,0.3309246705555546 -Sr1Ag1I2_1_17015.vasp,Sr1Ag1I2,-0.2684183375,0.5152709654166667 -Zn4Sn8O16_13_21232.vasp,Zn4Sn8O16,-3.365833930357143,0.2175554349999932 -V1C4S6Cl1F4_1_19793.vasp,V1C4S6Cl1F4,-3.62553107375,0.3129407041796872 -Cu2Hg2Te2Br2_26_5162.vasp,Cu2Hg2Te2Br2,0.24860471875,0.1660986093749987 -Ru2S2Br2_59_15337.vasp,Ru2S2Br2,-2.456194868333333,0.2125685944444415 -Tl2Te2_2_19550.vasp,Tl2Te2,-0.52350668,0.42915270125 -Cr4B3S2F2_164_4592.vasp,Cr4B3S2F2,-3.5770399854545456,0.4793257096590836 -Mo3S4_12_11725.vasp,Mo3S4,-3.479120832857143,0.5160146557142813 -Hf2Mn2Br8_2_7529.vasp,Hf2Mn2Br8,-2.2659109066666665,0.2186706437931017 -Ba3Ge1_25_2111.vasp,Ba3Ge1,-0.592110295,0.6547135881249999 -Ba2Mn2Ge2_129_2024.vasp,Ba2Mn2Ge2,-1.7860518583333331,0.4115475525862051 -Rb4Cd2Br8_11_14963.vasp,Rb4Cd2Br8,-0.50622007,0.1855476707142856 -Hf1Pd1Br6_149_7262.vasp,Hf1Pd1Br6,-1.73245360375,0.0880979074999994 -Ge6As2_191_6954.vasp,Ge6As2,-2.4767676425,0.3042993187499998 -Ge2C2F2_59_6762.vasp,Ge2C2F2,-3.648286695,0.9916642983333296 -Ir1F2_164_8735.vasp,Ir1F2,-1.6036565266666667,1.0620502677777757 -Na2P1S4_81_12256.vasp,Na2P1S4,-2.6066406614285715,0.3075050870982116 -Co2Mo2S8Br2_129_3932.vasp,Co2Mo2S8Br2,-2.224721710714286,0.7188021595039632 -Cr2Pd1Se4_164_4461.vasp,Cr2Pd1Se4,-2.35875066,0.1186343455042022 -Tc4O14_51_18252.vasp,Tc4O14,-5.501562237777778,0.1311998111111112 -O16F8_14_13788.vasp,O16F8,-1.89436386375,0.3173266145833333 -Cd2Br2_129_3480.vasp,Cd2Br2,1.1248034375,0.4365167868749999 -Re6S8Br2_2_15125.vasp,Re6S8Br2,-4.711045743125,0.0604334893749998 -Ti3H2C2Se2_38_19083.vasp,Ti3H2C2Se2,-5.469260117777778,0.2071460303333232 -Te4O8_31_18601.vasp,Te4O8,-3.567746023333333,0.0854941929166668 -Al1In1S2I4_1_681.vasp,Al1In1S2I4,-1.21358039375,0.2676660319921875 -Co2Ni1Se1S3Br1_1_3939.vasp,Co2Ni1Se1S3Br1,-1.67307547,0.4678001305133901 -K2S8N2Cl6_1_9339.vasp,K2S8N2Cl6,-1.75536672,0.6067389106944423 -In3Te4_164_8660.vasp,In3Te4,-1.376314217142857,0.0410664047619038 -V2I10_2_20088.vasp,V2I10,-0.4746506,0.0990792522916661 -Li2S4F2_113_10058.vasp,Li2S4F2,-1.74927458375,1.1403886484375 -Li4S2O8_51_10219.vasp,Li4S2O8,-4.35862981,0.294499295714286 -Zr1O1_38_21385.vasp,Zr1O1,-5.307945315,1.2333236916666666 -Pb1I4_10_14190.vasp,Pb1I4,0.248451902,0.5282469744166668 -Mo3Se1Br3O3_1_11726.vasp,Mo3Se1Br3O3,-3.193775412,0.2101172571249905 -Na2H8Cl2O12_2_12136.vasp,Na2H8Cl2O12,-3.533451874583333,0.0855664727430536 -In2P2S6_143_8520.vasp,In2P2S6,-2.8440983,0.152301949874997 -Ca2Ag1S2Cl2_38_2909.vasp,Ca2Ag1S2Cl2,-1.8818525557142856,0.1913580906696384 -Te5P2Pd2_8_18637.vasp,Te5P2Pd2,-1.787318558888889,0.3958123272222203 -Al2Te2Br2_31_996.vasp,Al2Te2Br2,-1.9409124083333331,0.0413266666666667 -Ca1Cr2F12_2_2821.vasp,Ca1Cr2F12,-2.794068834,-0.0234070040000022 -Mo4As8O28_14_11733.vasp,Mo4As8O28,-4.683540421,0.0463660570000001 -Bi1Te1_123_2402.vasp,Bi1Te1,-0.8595579,0.6602790999999999 -B1Mo2S2_164_1627.vasp,B1Mo2S2,-4.0985481,0.1619728990000002 -Li4C1S4_38_10170.vasp,Li4C1S4,-3.301900228888889,0.1594075920833306 -Tl2Br2_129_19379.vasp,Tl2Br2,-0.56183767,0.01487458 -Na4S4O8_13_12409.vasp,Na4S4O8,-3.839340123125,0.1799754705468752 -Al8Te12_4_1115.vasp,Al8Te12,-2.140198079,0.0750900152499998 -Ca1Pb1I4_10_2866.vasp,Ca1Pb1I4,-0.9186951733333334,0.0778633420555554 -Lu1N2_21_10294.vasp,Lu1N2,-5.59679402,0.2915896374999951 -Cd1Te1_123_3435.vasp,Cd1Te1,0.711346065,-0.15802969 -Al1Ag1As2S6_149_594.vasp,Al1Ag1As2S6,-2.6035117100000003,0.4538560681874972 -Fe2Sb2Te4Br2_26_5962.vasp,Fe2Sb2Te4Br2,-1.339783556,0.2065926777999983 -Cu2B4N2Cl2F4_2_5037.vasp,Cu2B4N2Cl2F4,-3.794320739285714,0.5628208452380847 -B5_47_1770.vasp,B5,-4.86719373,1.293791568333333 -Ga2I2O2_59_6389.vasp,Ga2I2O2,-2.68554117,0.0129541581249971 -Cu3H12C12N8_2_5372.vasp,Cu3H12C12N8,-5.376580902285714,-1.786025639142859 -Tl1Ag1S2Br2_1_19204.vasp,Tl1Ag1S2Br2,-0.7076280549999999,0.3252289197916658 -K2Mg1Cl4_123_9212.vasp,K2Mg1Cl4,-0.7792779271428572,1.0041621153571414 -Mo2C2I2_59_11590.vasp,Mo2C2I2,-3.4567895400000004,0.5026905952777705 -Sn2Se2_129_16882.vasp,Sn2Se2,-1.600395085,-0.0241167099999999 -Nb4W2O16_13_13180.vasp,Nb4W2O16,-6.4153346531818185,-0.1674829944318276 -Mn4C3O2F2_164_11427.vasp,Mn4C3O2F2,-3.6628256718181817,0.9441872209090878 -Li1Ga1Sb2S6_5_9715.vasp,Li1Ga1Sb2S6,-2.567625244,0.3829873999374977 -Na2Fe2Se2O1_123_12081.vasp,Na2Fe2Se2O1,-2.396122762857143,-0.2464452005357191 -Al2S4_1_949.vasp,Al2S4,-3.2077449516666667,0.3446473146874971 -Bi6Pt3_157_2676.vasp,Bi6Pt3,-1.4905985833333333,0.19925478125 -Sr1H2O2_12_17054.vasp,Sr1H2O2,-4.348386864,0.0351874714999995 -W2S4_11_20536.vasp,W2S4,-4.4562618983333335,0.0163367516666665 -Na2Ru2Br8N2O4_7_12273.vasp,Na2Ru2Br8N2O4,-2.4283731377777777,0.0694728219444423 -Hf4B3_164_7769.vasp,Hf4B3,-6.045339294285715,0.2461522592857079 -Mo3O8_10_11715.vasp,Mo3O8,-5.002005874545454,0.207566714393935 -Co2H2_164_3913.vasp,Co2H2,-2.2009042575,1.0494251550000002 -Mg2Cl4_2_10438.vasp,Mg2Cl4,-1.7946223633333334,0.2724051816666664 -Cs2B2C6N2O4F18_2_4659.vasp,Cs2B2C6N2O4F18,-3.890778448529412,0.4494911337132248 -Ba4P4H4S8_14_2168.vasp,Ba4P4H4S8,-3.209167977,0.3139393952187465 -Bi1Rh2_164_2363.vasp,Bi1Rh2,-0.90917229,1.4024036649999982 -V1O2F1_1_19891.vasp,V1O2F1,-4.71545095,-0.2271523565625037 -Sr2Ag1Te2I2_38_17116.vasp,Sr2Ag1Te2I2,-0.9596763942857144,0.2802176292857114 -Cr8S24_14_4631.vasp,Cr8S24,-3.1279371503125,0.1242439545312499 -W2F10_51_20490.vasp,W2F10,-3.1654042841666663,0.3601656577083278 -Mn1Co1Te3Br3_1_10672.vasp,Mn1Co1Te3Br3,-1.10282532875,0.0483194764434522 -Mn1Sb1Te1Se1S1_156_10865.vasp,Mn1Sb1Te1Se1S1,-2.212353584,0.2081709799999983 -K1Al1Br4O12_2_8875.vasp,K1Al1Br4O12,-2.680108852777778,0.2646598028124933 -Mn2S10_31_11208.vasp,Mn2S10,-2.538704885833333,0.4506598526041665 -Cr6O14_31_4628.vasp,Cr6O14,-4.87829234,-0.2063796914375 -K4Br2O1_123_9417.vasp,K4Br2O1,-0.3544273185714285,0.9689600071428572 -P2Rh2S6_162_14038.vasp,P2Rh2S6,-3.177207383,0.3030327057499977 -Na4P4O8_29_12402.vasp,Na4P4O8,-4.57297199125,0.2399861392499948 -Ni2O2_47_13549.vasp,Ni2O2,-1.8141951325,0.0116537125 -K2C4N6_28_9031.vasp,K2C4N6,-5.968815140833333,-0.1018729439583376 -Zr2Se2I2_59_21676.vasp,Zr2Se2I2,-3.0524399433333333,0.0375374301388866 -Zn1Hg3S2Cl4_156_20958.vasp,Zn1Hg3S2Cl4,0.295617037,0.5325902669375 -In2Sb2S6_149_8566.vasp,In2Sb2S6,-2.192346034,0.4867866205000002 -Li4Mn2P4O14_113_10201.vasp,Li4Mn2P4O14,-4.991523208333334,0.2960068123958228 -Zn2Te2W2S12_18_21184.vasp,Zn2Te2W2S12,-2.5163556744444446,0.2865950248657379 -Ba2Ni3O7_1_2036.vasp,Ba2Ni3O7,-3.009354785833333,0.0747594700000003 -Sc2I6O18_147_16097.vasp,Sc2I6O18,-3.2770282019230765,0.1274597703846156 -Nb2Ni2S6_11_12780.vasp,Nb2Ni2S6,-3.415631737,-0.1851592288636367 -Ag4I4O12_14_528.vasp,Ag4I4O12,-2.0331977845,0.0704684447499999 -Tl18Te9_143_19196.vasp,Tl18Te9,-0.5712046914814815,0.1984350791245791 -Cu1Au1S2_25_4840.vasp,Cu1Au1S2,-0.7779991125,0.4090970258333334 -Ba3C1_25_2099.vasp,Ba3C1,-0.8831368425,1.457099661041662 -Bi2F10_51_2452.vasp,Bi2F10,-1.7173473783333335,0.1356235516666664 -Si2P4_113_16428.vasp,Si2P4,-4.156481491666667,-1.2860962008333336 -Zr2Ge2Te8_31_21573.vasp,Zr2Ge2Te8,-2.5514986825,-0.2481476791666668 -Y5Br8_10_20841.vasp,Y5Br8,-3.052934913846154,0.0973440091025614 -Hg4H8C4N20Cl4_57_8074.vasp,Hg4H8C4N20Cl4,-4.62802080025,-0.2714780940186838 -P1S2_187_13945.vasp,P1S2,-2.755122946666667,0.5285953082291601 -Zn2Se2_164_21167.vasp,Zn2Se2,-0.5168765525,0.18312680125 -Ba2Ag1Te2Br2_38_1893.vasp,Ba2Ag1Te2Br2,-1.4083838314285717,0.3416866058556507 -Na2Nb1Se2_187_12223.vasp,Na2Nb1Se2,-2.808638646,0.2592267193333278 -Ta2Co4Te2Se2_51_17712.vasp,Ta2Co4Te2Se2,-3.253710144,0.0484391227499996 -Ir2Br6_189_8770.vasp,Ir2Br6,-0.72352346375,0.56031228125 -Nb9S18_12_13210.vasp,Nb9S18,-4.844929659259259,0.1124557457407409 -Pt4Br8_14_14697.vasp,Pt4Br8,-0.6796874383333332,0.1026047291666667 -Sc2H2C1_164_16079.vasp,Sc2H2C1,-4.441678619999999,0.074474642000001 -Co2H12Se4O16_14_3905.vasp,Co2H12Se4O16,-3.91510972,0.0590911802941178 -Cu4Hg4S4Cl4_26_5424.vasp,Cu4Hg4S4Cl4,-0.288131645,0.1122644195833334 -Nb1H2_187_12516.vasp,Nb1H2,-4.030563016666666,0.3125617966666674 -Cd2Te1Se1_8_3583.vasp,Cd2Te1Se1,0.0918070275,-0.5346146425 -Re1Te2_164_15027.vasp,Re1Te2,-3.059825583333333,0.4605026066666671 -Ga2Si2Se2_164_6490.vasp,Ga2Si2Se2,-2.998470646666666,-0.3957633316666692 -Hg3Se1O6_1_8066.vasp,Hg3Se1O6,-1.7636995949999998,0.145519760291666 -Ta2Br2N2_59_17664.vasp,Ta2Br2N2,-5.835288018333333,0.1068675419047602 -H2Pt1_187_7021.vasp,H2Pt1,-2.4607960933333333,1.8803097099999964 -Mg4Ti4_129_10590.vasp,Mg4Ti4,-2.7907677225,0.6078837033333335 -Tl2Ni4S6_164_19463.vasp,Tl2Ni4S6,-1.4955596025,0.1637462441666666 -Ir4Se8_2_8868.vasp,Ir4Se8,-2.7614702816666665,-0.408383525833333 -Li1Ga1As2Se6_5_9706.vasp,Li1Ga1As2Se6,-2.323732531,0.295639110833331 -Ta2Ge2Bi2_129_17740.vasp,Ta2Ge2Bi2,-3.863521445,0.1182639048412608 -Li4Al4H32N16_14_10155.vasp,Li4Al4H32N16,-4.694019141607143,-0.0103498650000002 -Os2O2_6_13861.vasp,Os2O2,-4.40360638,1.1955891024999996 -Na4Sb4O8_29_12414.vasp,Na4Sb4O8,-3.8365148675,0.0132716149999998 -Na2Co4H6S4O16_2_12062.vasp,Na2Co4H6S4O16,-3.9659441909375,0.0584677180624946 -Ni1S2_123_13414.vasp,Ni1S2,-1.2444641766666666,0.599146413749998 -Sc1Pb3_191_15977.vasp,Sc1Pb3,-0.72612618,1.0296275187499986 -Li2V2B2O8_2_10112.vasp,Li2V2B2O8,-5.773253226428571,0.1024011457936457 -Ta4Ni4Te8_53_18070.vasp,Ta4Ni4Te8,-2.689930803125,0.0409503293749997 -K1Mg2B12H19O30_5_8915.vasp,K1Mg2B12H19O30,-5.4694317690625,-0.0377635583007928 -Mo1Ru1S1Br2N1_1_11541.vasp,Mo1Ru1S1Br2N1,-2.955514276666667,0.1517831783333281 -Hf1N2_164_7239.vasp,Hf1N2,-6.588581983333333,1.098339879444437 -Ag2C2I2N4F4_2_213.vasp,Ag2C2I2N4F4,-2.6335932685714285,0.6451740402976124 -Ga1Cu1Se2I2_1_6177.vasp,Ga1Cu1Se2I2,-0.8621548200000001,0.2453909079166656 -V2Zn1O6_12_20232.vasp,V2Zn1O6,-4.608833955555556,0.1988797233333272 -Y2Bi2O6_147_20697.vasp,Y2Bi2O6,-5.262956641000001,0.3458590506249996 -W2Cl4O4_26_20486.vasp,W2Cl4O4,-4.15216504,-0.0139294349999996 -Hf3C2Se2F2_187_7697.vasp,Hf3C2Se2F2,-5.072303828888889,0.9919469186110994 -Ca2Ag1Br2O2_38_2901.vasp,Ca2Ag1Br2O2,-2.4239152928571426,0.0728896796428532 -Sb2Mo4O16_13_15607.vasp,Sb2Mo4O16,-4.8276483659090905,0.121955105265148 -Zr2Te2Br2_59_21700.vasp,Zr2Te2Br2,-2.8373601166666664,0.1100582827777751 -Ga4O6_164_6556.vasp,Ga4O6,-4.48351262,-0.4154283227500033 -Al2In2O6_31_889.vasp,Al2In2O6,-4.920709802999999,0.1604266021250002 -Ti2Cl6_189_18927.vasp,Ti2Cl6,-3.08065115625,0.1803018724999998 -Hg3S2_12_8065.vasp,Hg3S2,0.595953854,0.2699654367586231 -Ba2Ca2_164_1937.vasp,Ba2Ca2,0.5930779,1.10694572 -Nb4Se12I2_2_13148.vasp,Nb4Se12I2,-3.1586452,0.1203577483333301 -Zr1Ga1I1N1Cl3O1_1_21293.vasp,Zr1Ga1I1N1Cl3O1,-3.1012623,0.372054214635413 -Fe1N6F6_47_5721.vasp,Fe1N6F6,-3.0423521538461538,0.3897213398717922 -Nb2Si1Te4_6_12888.vasp,Nb2Si1Te4,-3.264709982857142,0.3514063410714287 -Ru8Se10_1_15376.vasp,Ru8Se10,-2.8169970716666666,0.5448276391666633 -Ge1Se1_156_6707.vasp,Ge1Se1,-2.7010751,0.1992182449999999 -Tl1_191_19358.vasp,Tl1,0.53587837,0.32356045 -Pd2Br6_162_14406.vasp,Pd2Br6,-0.27196802875,0.15503729625 -Mn2Te4As2Cl2_10_11314.vasp,Mn2Te4As2Cl2,-1.7807235810000002,0.2586762784999961 -Te8Mo2W2_25_18700.vasp,Te8Mo2W2,-2.5273702425,0.0505258583333332 -Sr3Fe2I2O5_123_17376.vasp,Sr3Fe2I2O5,-3.3069762083333334,-0.0154243570439262 -In1Si1Se3_143_8349.vasp,In1Si1Se3,-2.148383796,0.5263855250000002 -Co1Ni1Te1S2I1_6_3794.vasp,Co1Ni1Te1S2I1,-1.2687447166666663,0.3609981256666661 -Hf2Si2Te2_129_7617.vasp,Hf2Si2Te2,-4.463134628333333,0.0766476633333335 -Ag1O2F2_12_90.vasp,Ag1O2F2,-1.114347422,0.7297799975 -Sn2Te2O8_31_16892.vasp,Sn2Te2O8,-3.398388125,0.608841630625 -Rb2Se2N2O6F6_1_14941.vasp,Rb2Se2N2O6F6,-2.6971228083333334,0.5395525879166533 -Sn2I2N2_59_16782.vasp,Sn2I2N2,-2.56564285,-0.7978448444444445 -Ge2Te6P1_162_6894.vasp,Ge2Te6P1,-1.8873606966666665,-0.0889046620370384 -Li1V1F6_8_9807.vasp,Li1V1F6,-3.23702646625,0.07086007375 -Sb4Pd4S4_13_15806.vasp,Sb4Pd4S4,-2.09765788,0.4026653666666671 -Zr2S2F2_59_21645.vasp,Zr2S2F2,-4.6191201600000005,0.1014208066666566 -Hg1Pt1S1Br2O1_1_7903.vasp,Hg1Pt1S1Br2O1,-1.00598281,0.4379211294047584 -Cd1F2_187_3307.vasp,Cd1F2,-0.98706551,0.1618998366666667 -Nb2As2S6_2_12625.vasp,Nb2As2S6,-3.945991179,-0.1701221656250022 -V4O8_12_20350.vasp,V4O8,-5.561805856666666,0.1161332183333341 -Sb2Pb2S6_147_15645.vasp,Sb2Pb2S6,-2.337845191,-0.1482906520625027 -As1Cl3_187_1144.vasp,As1Cl3,-1.1292112425,0.4636942424999999 -Nb2Se1S1I2_6_12867.vasp,Nb2Se1S1I2,-3.429062645,0.1137134083333257 -B4O6_7_1760.vasp,B4O6,-6.741856213,0.1124781623333337 -Zn2Ga2N2O2_26_21080.vasp,Zn2Ga2N2O2,-3.28371894375,0.3178961725 -Yb2Cl6_59_20868.vasp,Yb2Cl6,-2.88187823375,-1.003751015625 -Ta2Te1S1Br1_8_17895.vasp,Ta2Te1S1Br1,-4.15311962,0.272880520619039 -K1Rb1Mg6O7_99_8929.vasp,K1Rb1Mg6O7,-3.4245800466666667,0.0809425713333276 -Nb1O2_115_12551.vasp,Nb1O2,-6.340763330000001,0.6447468762500002 -Ca4Fe2I2O6_129_3215.vasp,Ca4Fe2I2O6,-3.5511585,-0.2500131638736304 -Sr2S8Cl4_125_17306.vasp,Sr2S8Cl4,-1.905074707142857,0.661215643928569 -Fe2W2Cl2O8_129_6030.vasp,Fe2W2Cl2O8,-4.361500215,0.0959875140401718 -Ba2Co1_123_1953.vasp,Ba2Co1,0.18813125,1.0074845599999993 -B16S24_14_1610.vasp,B16S24,-4.3328495615,0.1008098040000007 -Al2Cl2_129_793.vasp,Al2Cl2,-1.4223443225,0.9086558016666646 -Ni2Se2O8_7_13637.vasp,Ni2Se2O8,-2.957526410833333,-0.029358060208336 -La2Pb12Cl2O14_12_9607.vasp,La2Pb12Cl2O14,-3.662177287333333,0.053562604333333 -Ti2F4_11_18934.vasp,Ti2F4,-4.770496165,-0.4857030094444484 -Fe1Br2_187_5640.vasp,Fe1Br2,-0.55044728,0.3046625416666667 -B8P4Cl8_7_1791.vasp,B8P4Cl8,-3.6911102305,-0.3213431461666709 -W1Cl2_164_20428.vasp,W1Cl2,-2.4898950466666667,0.5503000233333282 -Zr2S1I1Cl1_156_21638.vasp,Zr2S1I1Cl1,-3.41180507,0.0181418664999974 -Hg2Br2N2_59_7942.vasp,Hg2Br2N2,-0.3713279616666666,0.9460998758333324 -Mn1In1Br6_5_10773.vasp,Mn1In1Br6,-1.00662748,0.0387109775 -Y4H2C3O2_164_20821.vasp,Y4H2C3O2,-5.882812378181819,0.5085650738446845 -Ge1Sb1S2I2_1_6703.vasp,Ge1Sb1S2I2,-1.7905604533333337,-0.1946490630729168 -K4Na2Ga2As4_49_9478.vasp,K4Na2Ga2As4,-1.4380568116666668,0.1103379474999999 -Ta4H2N3_164_18052.vasp,Ta4H2N3,-6.968373258888889,0.428233027222217 -Zn1W1O4_3_21023.vasp,Zn1W1O4,-4.56386511,0.337324268333333 -Ag2Br2_67_205.vasp,Ag2Br2,0.212749315,0.1167231899999999 -Li1Sb1Br1Cl1O1_1_9782.vasp,Li1Sb1Br1Cl1O1,-2.58143998,0.2589849435999989 -V3B2F2_187_20237.vasp,V3B2F2,-4.3625534,0.1486119666666581 -Pb2C2Cl2O4_12_14228.vasp,Pb2C2Cl2O4,-4.370667981,0.0640520247499929 -Ni2W2S8Br2_129_13687.vasp,Ni2W2S8Br2,-2.220127853571429,0.5158435320312444 -Tl2O1_164_19466.vasp,Tl2O1,-1.7255070533333334,0.0979205785185182 -Ba2Mg2_164_2023.vasp,Ba2Mg2,0.39306184,0.543320429375 -Cd2Pd4S6_164_3533.vasp,Cd2Pd4S6,-1.2929784775,0.3609136529166654 -Cs2H2C2S6_4_4713.vasp,Cs2H2C2S6,-3.241659293333333,0.3738431937499968 -Zr4H12N4F16_2_21819.vasp,Zr4H12N4F16,-4.576117688611111,0.0409490799999998 -P2Pb2C2O6F6_7_14004.vasp,P2Pb2C2O6F6,-4.261075637222223,0.2714489032638721 -Nb2Pt2Se4S4_1_12826.vasp,Nb2Pt2Se4S4,-3.3414472175000003,-0.0730670733333334 -Sr2As4_12_17122.vasp,Sr2As4,-2.1259672066666666,0.6690744366666641 -Tl8Se6_31_19653.vasp,Tl8Se6,-0.9032047807142856,0.3034202903571418 -Co2Cl2_164_3891.vasp,Co2Cl2,-0.996756325,0.2572120987500001 -Rb4Sb8F28_14_14980.vasp,Rb4Sb8F28,-2.7174817725,0.0600212424999995 -La1Br2_187_9564.vasp,La1Br2,-2.4722281366666667,0.140842101333331 -Ba4Te8As4Cl4_14_2192.vasp,Ba4Te8As4Cl4,-2.209128525,0.1122258557500005 -Zr2Mo1Se2I1Br2N1O1_1_21602.vasp,Zr2Mo1Se2I1Br2N1O1,-3.617938475,0.4736630681666647 -Cd1Te2_115_3439.vasp,Cd1Te2,-0.0093349133333333,-0.0649901644444443 -In1Pt5I2_123_8324.vasp,In1Pt5I2,-1.19507693,0.392798155625 -K1Mo2S2I6_47_8921.vasp,K1Mo2S2I6,-1.1558429772727272,0.2713121283333303 -P2C6_191_13966.vasp,P2C6,-6.47312647,0.6256165837499992 -Y1Bi2O4_123_20608.vasp,Y1Bi2O4,-4.779580244285714,0.1675185418749984 -Nd2F6_59_13237.vasp,Nd2F6,-4.48461178125,0.2023533716666667 -Sb4P4O24_2_15800.vasp,Sb4P4O24,-4.426474051875,0.4294913589062501 -Te1Mo2Se1S1Br1_8_18310.vasp,Te1Mo2Se1S1Br1,-2.293019925,0.4033320839583335 -Dy2Se6_51_5535.vasp,Dy2Se6,-2.8341046075,-0.38139303125 -Cr1Cu1Sb2Se6_143_4155.vasp,Cr1Cu1Sb2Se6,-1.911917328,0.2708240866 -Au2Se1Br2O1_1_1532.vasp,Au2Se1Br2O1,-0.43379092,0.4123290344791667 -Pd2I4O12_14_14433.vasp,Pd2I4O12,-2.480932687777778,0.0922558949999974 -Ni2S2_123_13591.vasp,Ni2S2,-1.2605731425,0.1678878808333317 -Al2In2F8_3_887.vasp,Al2In2F8,-3.2667832625,0.2067829486111052 -Cs1Te2Pb1_156_4653.vasp,Cs1Te2Pb1,-0.7645101775,-0.2605728975 -Zr2Se2_164_21680.vasp,Zr2Se2,-3.61971826,0.2720820750000001 -Fe2Bi2Te4F2_26_5813.vasp,Fe2Bi2Te4F2,-1.486041721,0.5416203216666643 -Co1H4C6Br2N2_25_3757.vasp,Co1H4C6Br2N2,-5.163226859333333,0.1832658993333267 -V1Te6P2Au1_5_19947.vasp,V1Te6P2Au1,-1.7731640030000002,0.2644040167916651 -Al2Ni2Te5_164_909.vasp,Al2Ni2Te5,-1.3640337044444444,0.239618015496027 -Ca1Sn4S9_25_2890.vasp,Ca1Sn4S9,-2.528668302142857,0.1932306550892835 -Er2H2Cl2_164_5559.vasp,Er2H2Cl2,-3.2688079183333336,0.0376180816666664 -Cu2B4H4N2Cl2_2_5035.vasp,Cu2B4H4N2Cl2,-3.737913257142857,0.7580265279142753 -Cr4S8_162_4625.vasp,Cr4S8,-3.1148057166666665,0.34880749 -Hf2Cd2_129_7472.vasp,Hf2Cd2,-1.5122137075,0.31035359 -Ga1Ag1Se1I3_1_6126.vasp,Ga1Ag1Se1I3,-0.443608185,0.2672233406944426 -Cs2Yb1Br6_164_4796.vasp,Cs2Yb1Br6,-1.45158701,-0.2086870775000009 -Mn2As2Se4Cl2_26_10981.vasp,Mn2As2Se4Cl2,-2.191989616,0.118012212666664 -Ca2Ag1Se2I2_38_2915.vasp,Ca2Ag1Se2I2,-1.2314889528571429,-0.0647185478571457 -Na2Pd1F2_123_12264.vasp,Na2Pd1F2,-1.984973598,0.1023591940000002 -Ru2F2_164_15314.vasp,Ru2F2,-2.52116737,0.5922369924999971 -As4S6_11_1361.vasp,As4S6,-2.921920858,0.5975740704999999 -Ge1Cl2_115_6658.vasp,Ge1Cl2,-1.7410766733333334,0.2261175633333332 -Mn1Cu2S6I1_1_10701.vasp,Mn1Cu2S6I1,-1.73602092,0.1771447305124972 -Sr4As2O1_123_17402.vasp,Sr4As2O1,-0.8467709428571428,1.9054302357142856 -Nb1Te1Pd1Se1I1Br2Cl1_1_12595.vasp,Nb1Te1Pd1Se1I1Br2Cl1,-1.70022858875,0.2309546615948222 -Sb2Pd2Se5_8_15654.vasp,Sb2Pd2Se5,-1.8004609844444444,0.3399883697777757 -Hf1Cd1S1I2_8_7136.vasp,Hf1Cd1S1I2,-1.755188996,0.0735684143333337 -Rb2Hg4Se2S6I6_31_14883.vasp,Rb2Hg4Se2S6I6,-0.4194587849999999,0.2701938911875002 -Ag2Te4F2_4_478.vasp,Ag2Te4F2,-0.85108372375,0.3293169383333333 -In4Te6_31_8705.vasp,In4Te6,-1.334530461,0.0448391750000001 -P2Pt2S6_162_14032.vasp,P2Pt2S6,-2.814354538,0.2587660547857078 -Mn2Se1Cl2_12_11267.vasp,Mn2Se1Cl2,-1.850473712,0.1423892865172391 -Al2Se2S8F2_11_968.vasp,Al2Se2S8F2,-2.484150828571429,0.618711791101185 -Dy1I2_164_5511.vasp,Dy1I2,-1.604911303333333,0.0701058881481466 -Er2Br2_164_5549.vasp,Er2Br2,-2.1391309525,0.1307836974999978 -Ca4Ni2I2O6_129_3231.vasp,Ca4Ni2I2O6,-3.1571510028571432,-0.2655061111607169 -Cr4O6_49_4615.vasp,Cr4O6,-4.455323522,0.6548387440000001 -Eu1As2_6_5584.vasp,Eu1As2,-3.124856766666667,0.7479768583333333 -Bi1Pd2Se2_187_2359.vasp,Bi1Pd2Se2,-1.52063124,0.2979295585000001 -Co2Sb2O6_162_3995.vasp,Co2Sb2O6,-4.162756563,-0.1082873975000002 -Ba2Ag1Se2Cl2_38_1890.vasp,Ba2Ag1Se2Cl2,-1.92525687,0.2928906582142834 -Sb1Se2_164_15506.vasp,Sb1Se2,-2.1197519433333336,0.2320960072222198 -Nb1In2Br1Cl1O2_1_12528.vasp,Nb1In2Br1Cl1O2,-3.40270163,0.3681280522321377 -Cr1S2_164_4249.vasp,Cr1S2,-3.26242735,0.2011858566666666 -Ce4C2Br5_47_3687.vasp,Ce4C2Br5,-3.626547374545455,0.1052508336363637 -Al2Co2Te5_164_811.vasp,Al2Co2Te5,-1.8455808877777773,0.3194520257076664 -Ni2Sb2Te4Cl2_10_13616.vasp,Ni2Sb2Te4Cl2,-0.988150298,0.2589686982857115 -Na2Mn1As2S7Cl3_1_12207.vasp,Na2Mn1As2S7Cl3,-2.3334920986666665,0.449193077034715 -Cs2Hg4Te2S6Br6_31_4746.vasp,Cs2Hg4Te2S6Br6,-0.506782767,0.3074162418125006 -Zn2As4S8_4_21038.vasp,Zn2As4S8,-2.358236758571429,0.496162503071427 -Na2Cd4S6I6O2_31_12031.vasp,Na2Cd4S6I6O2,-0.941822997,0.2823034817708312 -Ge1H2N1_156_6667.vasp,Ge1H2N1,-3.9464865875,-2.9413541316666683 -Mo2P2O10_85_11655.vasp,Mo2P2O10,-5.342752370714286,0.1185100335714279 -Tl1Ga1Hg1S4_156_19272.vasp,Tl1Ga1Hg1S4,-1.5761833514285717,0.2479162431249968 -K2Pt2Br6N2_51_9308.vasp,K2Pt2Br6N2,-1.2078898033333334,0.692422470416662 -K1N3_10_8923.vasp,K1N3,-3.9202821025,1.1634149049999998 -Ni2S2F2_59_13583.vasp,Ni2S2F2,-1.5734186083333332,-0.0158404189583351 -Rb3Nb2Br9_187_14960.vasp,Rb3Nb2Br9,-1.6970866557142856,0.1873596898214251 -Ge2N2F2_59_6786.vasp,Ge2N2F2,-4.15377028,0.0938025747222173 -Sr2Ni1S3_38_17287.vasp,Sr2Ni1S3,-2.40943856,0.0582800444444411 -Ag4Te4O12_11_576.vasp,Ag4Te4O12,-2.6732030985,0.1977306274999999 -Hf2As1S2_164_7427.vasp,Hf2As1S2,-5.352043772,0.1077496630000003 -K4H8Se4N4O12_14_9456.vasp,K4H8Se4N4O12,-3.7615114084375,0.1547461477734379 -Ge2S4_12_6833.vasp,Ge2S4,-2.7438963750000003,0.4136216560416663 -Mn2P2Se6_147_11203.vasp,Mn2P2Se6,-2.577580854,0.0270075118749983 -Cu6Se1S3Br2Cl6_1_5498.vasp,Cu6Se1S3Br2Cl6,-0.7530977222222223,0.1293495140972208 -Gd2I6_12_6620.vasp,Gd2I6,-1.58726285,0.05997363 -Zr2S2_129_21651.vasp,Zr2S2,-4.1950293325,0.4741616925 -Th1Cl2_187_18713.vasp,Th1Cl2,-3.45037758,0.1223986066666624 -Nb6Si2Se12_26_13198.vasp,Nb6Si2Se12,-4.230102162,0.0333225572430518 -Ti2Tl8S8_1_19052.vasp,Ti2Tl8S8,-2.458198783888889,0.1452222949999999 -In2Pt4O6_164_8533.vasp,In2Pt4O6,-2.843115210833333,0.6770934902083294 -Fe2S2N1_164_5934.vasp,Fe2S2N1,-2.897814084,-0.2056518954999995 -Zr2I2Cl2_6_21587.vasp,Zr2I2Cl2,-2.231326171666667,0.3724580391666665 -Ti2Se2F2_59_19021.vasp,Ti2Se2F2,-4.6199363883333335,-0.6778565605555638 -Nb4S12_2_13138.vasp,Nb4S12,-4.3607856875,0.0117245660937501 -Na4Ti4Si4O18_2_12426.vasp,Na4Ti4Si4O18,-6.130874096333333,0.0618248006666668 -Hf1Ni1Br6_5_7244.vasp,Hf1Ni1Br6,-1.588043785,0.00135927 -N14_187_11770.vasp,N14,-5.196658182142857,0.3370924403571438 -In2Se2_129_8589.vasp,In2Se2,-1.7270408275,0.1763745350000001 -Cu2C6I2N2F8_2_5076.vasp,Cu2C6I2N2F8,-3.768724009000001,0.1311467840249918 -Zr2S2N1_164_21650.vasp,Zr2S2N1,-5.712994244,0.1354558994999952 -Ag3As1S4_156_496.vasp,Ag3As1S4,-1.13247447625,0.4057320664843749 -Sr4Co2S2O6_4_17418.vasp,Sr4Co2S2O6,-3.8008240357142857,0.0945433642857047 -Mo1C1I1_8_11502.vasp,Mo1C1I1,-2.8966750666666665,1.0628050686111044 -Nd2Zn2P2O2_164_13248.vasp,Nd2Zn2P2O2,-3.73082073625,0.14331136875 -Nb3C2S2_187_12964.vasp,Nb3C2S2,-6.56500458,-0.2233998835714361 -Cu2B2H8Cl2O8_85_5026.vasp,Cu2B2H8Cl2O8,-4.112445368181818,0.0781666800946913 -Y2N1Cl2_164_20758.vasp,Y2N1Cl2,-5.154693054,0.0316847039999999 -Ag2H8C2N8_2_290.vasp,Ag2H8C2N8,-4.671381834,-2.549938116083337 -Hf2S2F2_59_7569.vasp,Hf2S2F2,-5.104999626666666,0.11811378999999 -Mg1S2F2_164_10395.vasp,Mg1S2F2,-2.047616514,0.8719128087500001 -N4_53_11801.vasp,N4,-5.82478118,-0.2910305574999992 -Nb4F16_14_13066.vasp,Nb4F16,-4.041121601,0.1582608729999968 -Fe2Te4P2F2_26_6018.vasp,Fe2Te4P2F2,-1.927591479,0.4522918545333332 -Ta1I1Br1_156_17552.vasp,Ta1I1Br1,-2.4837751666666668,0.6220828626190413 -In1Pd5Cl2_38_8311.vasp,In1Pd5Cl2,-0.96707995625,0.3680979649999984 -Nb4Te2_129_13171.vasp,Nb4Te2,-4.791284953333333,0.1155361399999939 -In2Pb2Cl6_11_8525.vasp,In2Pb2Cl6,-1.382711956,0.1212523623750001 -K2Cl2_129_9080.vasp,K2Cl2,-1.25633899,0.1481758749999999 -Te2Rh2Br2_11_18496.vasp,Te2Rh2Br2,-1.5966205866666667,0.0941231483333331 -V6O14_31_20390.vasp,V6O14,-5.4942451605,0.0301415694999951 -Cr4S4F12_14_4624.vasp,Cr4S4F12,-2.7072888495000003,0.253272245374997 -Ag2Bi2Se4_26_197.vasp,Ag2Bi2Se4,-1.11522071375,0.0774184337499999 -Mn1Nb2W1Se4_6_10822.vasp,Mn1Nb2W1Se4,-3.69357316625,0.6928979583593746 -In1I2_187_8275.vasp,In1I2,-0.3093236666666666,0.2315964916666666 -Zr1Bi1Se3_1_21258.vasp,Zr1Bi1Se3,-2.899467974,0.2868926408333334 -P1S1I1_156_13942.vasp,P1S1I1,-1.7735449133333334,0.4651069487626238 -Cd3S1I2O1_1_3617.vasp,Cd3S1I2O1,-0.1859667814285714,0.2321224844047606 -Te1Ir1I1_156_18293.vasp,Te1Ir1I1,-1.6800937633333335,0.2055995249999966 -Co2As4I4O6_11_3853.vasp,Co2As4I4O6,-2.88902181375,0.1179585804166654 -Mn1P2O8_2_10838.vasp,Mn1P2O8,-4.868881107272727,0.2618961839204455 -H2Pt1O2_164_7020.vasp,H2Pt1O2,-3.2922569860000004,0.5366041819166631 -Mn1Nb3I1Br2O3_1_10823.vasp,Mn1Nb3I1Br2O3,-4.24137316,0.1080374232291599 -Ag2Te2_164_462.vasp,Ag2Te2,-0.0823298225,0.2753026204166666 -Cr2P2O8_5_4449.vasp,Cr2P2O8,-5.180983510833333,0.2837203294444448 -V3O1F11_1_20284.vasp,V3O1F11,-3.437924707333333,-0.2077228715833361 -Pt1S2_164_14589.vasp,Pt1S2,-2.6401953666666667,0.0049493533333331 -Sn1Sb1Se1S1Cl2_1_16685.vasp,Sn1Sb1Se1S1Cl2,-1.8031043316666664,0.3060779683333314 -Rb4P4Se24_29_14977.vasp,Rb4P4Se24,-2.0702739253125,0.0986923931249998 -Cu2As2O6_162_5009.vasp,Cu2As2O6,-3.43349498,0.3067290761249969 -Mo2O5_35_11649.vasp,Mo2O5,-4.909033714285714,0.3224672723809485 -H8Pb1C10Br2N2_10_7093.vasp,H8Pb1C10Br2N2,-5.383799267826086,0.1338283795652146 -Zr3C2Se2F2_6_21760.vasp,Zr3C2Se2F2,-4.527077112222222,0.9266082209722126 -Cu2H12C14N10_1_5104.vasp,Cu2H12C14N10,-5.739838988157895,-1.7316862564912363 -Ni2Se4Cl2_11_13646.vasp,Ni2Se4Cl2,-1.08575477875,0.1637114245833333 -Zr4S4F4_31_21843.vasp,Zr4S4F4,-4.337940420833333,0.3826005458333239 -Cs2S6N2F2_1_4782.vasp,Cs2S6N2F2,-2.478562089166666,0.1984922576041625 -Y1Ge5_47_20637.vasp,Y1Ge5,-3.25427818,-0.1217330419444471 -Na2Hf1O6F6_143_12145.vasp,Na2Hf1O6F6,-2.762538972666667,1.050480279166667 -Hf2C1Se2_164_7459.vasp,Hf2C1Se2,-5.84216045,-0.023682755999999 -Ca4Fe2S6Cl2_129_3217.vasp,Ca4Fe2S6Cl2,-2.5929054,-0.1550074814285759 -Tc3Br8_1_18239.vasp,Tc3Br8,-2.326926698181818,0.1487238740909018 -Hf2As2S6_2_7430.vasp,Hf2As2S6,-4.2434572930000005,0.2255612543749969 -Sn1_123_16709.vasp,Sn1,-0.59023658,-3.197660065 -Mg1I2_115_10377.vasp,Mg1I2,-0.7139681033333334,0.1477861433333333 -K2S6F2_11_9335.vasp,K2S6F2,-1.852106961,0.3096028246250004 -Ta2S2_8_17854.vasp,Ta2S2,-5.407741805,0.3603787412499946 -Yb2Cl2O2_164_20865.vasp,Yb2Cl2O2,-5.111292833333334,-0.9808672916666668 -Zr2Te3Mo1S3_157_21714.vasp,Zr2Te3Mo1S3,-3.42078699,0.1692992270555478 -Ni2S2I2_59_13584.vasp,Ni2S2I2,-0.72330068,0.1019163461805546 -Tl4Se4Br4_14_19625.vasp,Tl4Se4Br4,-0.8576248624999999,0.2961794886111102 -La2Sb1I2_164_9611.vasp,La2Sb1I2,-2.692240338,0.046473578 -Y4Se6_1_20837.vasp,Y4Se6,-4.360906738,0.3971792785000003 -Cd2Sb2S4Cl2_11_3560.vasp,Cd2Sb2S4Cl2,-1.465843919,0.2057536892500002 -Zr1Ni1F6_5_21374.vasp,Zr1Ni1F6,-3.28003292375,0.0735150012500001 -Sn1S2_164_16681.vasp,Sn1S2,-2.56251014,0.0506249266666665 -Te6Pd8Br8_2_18680.vasp,Te6Pd8Br8,-0.9224555868181816,-0.1031487951136378 -Sb4O6_1_15784.vasp,Sb4O6,-4.11496726,0.1425232075 -Nb1F4_123_12507.vasp,Nb1F4,-4.056220478,0.1431619959999961 -Li1P2Pd1S6_5_9774.vasp,Li1P2Pd1S6,-2.995357947,0.0509669553281221 -Ti1Ga4O8_12_18783.vasp,Ti1Ga4O8,-5.030272927692308,-0.2247031932692409 -Pb2C2Br2_59_14227.vasp,Pb2C2Br2,-1.8515610516666667,1.6722071099999969 -Cs2Cd4Se2O6F6_31_4695.vasp,Cs2Cd4Se2O6F6,-1.910209149,0.3609621302499972 -Cs3Nb2I9_187_4800.vasp,Cs3Nb2I9,-1.12832569,0.2088990417857126 -Mn2S2_164_11220.vasp,Mn2S2,-2.73343112,0.2241051024999998 -Ge4As4S4_17_6925.vasp,Ge4As4S4,-3.157424211666666,-0.6546372415624999 -Ni1H4C2N6Cl2_6_13337.vasp,Ni1H4C2N6Cl2,-4.255333164666667,0.5324743897222091 -Sr2Te2Au1I2_38_17327.vasp,Sr2Te2Au1I2,-0.9450538085714284,0.2335682173809503 -Al4S6_31_1088.vasp,Al4S6,-3.675859289,0.0634344707499998 -Li5Ni1O1F5_8_10258.vasp,Li5Ni1O1F5,-3.318845464166667,-0.3800026025000022 -Nb4N3O2_164_13096.vasp,Nb4N3O2,-7.40284778,-0.0740647512500061 -Cr1Sb1O4_10_4254.vasp,Cr1Sb1O4,-4.547407838333333,0.1398851208333331 -Ti2Mo1Os1Cl4O6_1_18964.vasp,Ti2Mo1Os1Cl4O6,-4.644772281428572,0.2094208608035563 -Ca2F4_2_3013.vasp,Ca2F4,-3.32315904,0.5205892566666663 -Nb2Ni4Se2S2_51_12786.vasp,Nb2Ni4Se2S2,-2.42527629,1.763201446333328 -Cu2P2O6_12_5208.vasp,Cu2P2O6,-3.946089414,0.5713918995000005 -Cu2Cl2O2_59_5078.vasp,Cu2Cl2O2,-1.2976140116666668,0.2455362895833316 -Zr4B3H2_164_21804.vasp,Zr4B3H2,-4.97412557,0.0442392447222187 -Bi1F2_115_2330.vasp,Bi1F2,-1.8327077033333328,0.8816606211111088 -As8Pb4_26_1400.vasp,As8Pb4,-2.1788185083333333,0.3037664899999972 -Zr4I2Br2N1O3_3_21827.vasp,Zr4I2Br2N1O3,-4.723507805833333,0.1568774216666599 -Fe2Te6As2_162_6025.vasp,Fe2Te6As2,-1.614614993,0.3088247021666653 -Cu2Te1I1O1_1_5321.vasp,Cu2Te1I1O1,-0.8335944559999999,0.3651566481249999 -Li3V5O14_8_10152.vasp,Li3V5O14,-5.209748818636363,0.2214651281818191 -Sn1Bi1Se1S1I2_1_16613.vasp,Sn1Bi1Se1S1I2,-1.3068908116666669,0.2201266786111111 -Hf1Se2_115_7307.vasp,Hf1Se2,-4.129275456666667,0.5985428066666669 -Y2Br2_164_20703.vasp,Y2Br2,-3.20855698,0.142158044166663 -Cr2H2_164_4402.vasp,Cr2H2,-3.057479195,1.9558920075 -Hf1F2_164_7153.vasp,Hf1F2,-4.441079163333334,0.6729112141666609 -Mg2Ge2O6_51_10460.vasp,Mg2Ge2O6,-4.335319522000001,0.5380346154999991 -Nb1Cl5_47_12491.vasp,Nb1Cl5,-2.049313685,0.4241513616666665 -Sr2I4_51_17260.vasp,Sr2I4,-1.0852709983333333,0.2007723605555555 -V1Te1O1_156_19934.vasp,V1Te1O1,-3.768248303333333,0.3293951669841204 -Al1Cu1As2S6_149_637.vasp,Al1Cu1As2S6,-2.641325043,0.4832901791874973 -In2N2Cl2_1_8485.vasp,In2N2Cl2,-2.931521768333333,-0.155756758541669 -Y1Mn1Se1Br1O2_6_20652.vasp,Y1Mn1Se1Br1O2,-4.217736925,0.1159021405624924 -Ni2N8O16_14_13542.vasp,Ni2N8O16,-4.215986058461539,0.0763622513461463 -Y1Cl2_164_20622.vasp,Y1Cl2,-3.4086261066666665,0.1629850980555522 -Sn6Sb6_2_17000.vasp,Sn6Sb6,-1.6528179916666668,0.1833113348958333 -Li2Ru1_187_10050.vasp,Li2Ru1,-1.87253604,0.5285044327777757 -Cr1F5_10_4172.vasp,Cr1F5,-2.1202068400000003,0.4224414699999999 -Pd1S1_156_14383.vasp,Pd1S1,-1.384615215,0.7255161250000002 -Re1Ag2I6_147_14990.vasp,Re1Ag2I6,-0.3698433211111111,0.1784503111342587 -Mg2Sb4_10_10510.vasp,Mg2Sb4,-1.423922195,0.2862565737499983 -Te2Ru1_187_18511.vasp,Te2Ru1,-2.0882322933333333,0.5327624166666669 -La2S2_47_9609.vasp,La2S2,-3.1989949775,1.50962409 -Ga2Ni2Te5_164_6412.vasp,Ga2Ni2Te5,-1.1344164866666668,0.0307248117777771 -B4As20_26_1744.vasp,B4As20,-2.956012268333333,0.7803983420833291 -Zn2Hg3Se6_147_21107.vasp,Zn2Hg3Se6,0.0419113236363636,0.0742725398484826 -Sb4W2O12_4_15840.vasp,Sb4W2O12,-5.048917992222222,0.1123211652777778 -Cu4Se4I4_14_5474.vasp,Cu4Se4I4,-0.453794295,0.100041638055555 -Tl1As2Au1Se6_149_19217.vasp,Tl1As2Au1Se6,-1.639681681,0.3064512233749976 -Co1Br2_164_3709.vasp,Co1Br2,-0.84118327,0.1776799466666657 -Ti4B3S2F2_164_19123.vasp,Ti4B3S2F2,-5.104368042727272,0.3209904803409005 -Na1Ni1Sb2S6_149_11917.vasp,Na1Ni1Sb2S6,-2.0714474750000003,0.3803615980937474 -Ta1Sb4Mo1_6_17614.vasp,Ta1Sb4Mo1,-3.1270625,0.3047000042916623 -Cu1As1Br2_6_4833.vasp,Cu1As1Br2,-0.66938601,0.3356291338888871 -Fe2Bi2S4Br2_10_5808.vasp,Fe2Bi2S4Br2,-1.916026315,-0.0201126749999996 -P2Pt3O8_164_14034.vasp,P2Pt3O8,-4.093656867692308,0.4589992849038428 -Cu2H4Br2N6_2_5115.vasp,Cu2H4Br2N6,-3.62224498,0.1080066441071401 -V6F24_147_20385.vasp,V6F24,-3.256851552666667,0.0234978963333332 -Nb4Pd2O10_59_13121.vasp,Nb4Pd2O10,-5.826557545625,0.0725623734375007 -Ba3P3_25_2125.vasp,Ba3P3,-2.1581875,0.9785615083333336 -Mg2V4S10_59_10532.vasp,Mg2V4S10,-3.0998559675,0.2299314424999998 -In1Cu1Te6P2_149_8241.vasp,In1Cu1Te6P2,-1.553132549,0.3251316267142827 -Cr2As4Au2S12_13_4314.vasp,Cr2As4Au2S12,-2.4712546845,0.5299344547500002 -Al2Cl2O3_1_790.vasp,Al2Cl2O3,-3.973773994285714,0.4582580849999985 -Ta2Ni2S10_51_17794.vasp,Ta2Ni2S10,-3.41755843,-0.1503517824553606 -In2Fe2Se5_156_8438.vasp,In2Fe2Se5,-1.757100331111111,-0.0398582777777793 -Li1Ni1Sb2S6_5_9765.vasp,Li1Ni1Sb2S6,-2.21204538,0.3763711159687476 -Ti1Ag1F6_2_18736.vasp,Ti1Ag1F6,-2.926935995,0.0557048737499998 -Li4C1O4_5_10169.vasp,Li4C1O4,-4.69240589,0.1807414994444403 -Ni2Sb1Te2_187_13603.vasp,Ni2Sb1Te2,-0.924774494,0.0731614709999999 -K2Y2P4Se12_4_9392.vasp,K2Y2P4Se12,-3.0013647815,0.0900146852499998 -Ni2Te2Cl2_59_13659.vasp,Ni2Te2Cl2,-0.6682394,-0.0187365208333333 -In8Bi4S18_11_8713.vasp,In8Bi4S18,-2.3869731520000004,0.0223653845555556 -Tl2Pt4O6_164_19489.vasp,Tl2Pt4O6,-2.735445414166667,0.3687269400771578 -Te6As2Ir2_162_18640.vasp,Te6As2Ir2,-2.247231756,0.3870682276666654 -Pb1Se2_164_14209.vasp,Pb1Se2,-1.5584912400000002,0.5108143734027758 -Ba1Tl1Co2O6_1_1872.vasp,Ba1Tl1Co2O6,-3.220728526,0.4226827559374967 -Y7I10_2_20850.vasp,Y7I10,-2.517591615882353,0.0980993730392116 -Ni1Ir1Se1S1I2_6_13369.vasp,Ni1Ir1Se1S1I2,-1.316475845,-0.0105703868518555 -Tl1Cu1Sb2O6_149_19255.vasp,Tl1Cu1Sb2O6,-3.2039973779999995,0.5260433009166569 -Sr2Co2Sn2_129_17193.vasp,Sr2Co2Sn2,-0.8978007250000001,0.3855623566666656 -Te3Rh4Se1_6_18558.vasp,Te3Rh4Se1,-2.0182481075,0.2724770490277759 -Hf1Cl1F1_156_7142.vasp,Hf1Cl1F1,-4.0552232833333335,0.3543069422916587 -Bi4S4O2_129_2639.vasp,Bi4S4O2,-2.932763568,-0.6778175606666685 -Mn2B1H2O2_164_10993.vasp,Mn2B1H2O2,-3.97561006,0.3352398628571399 -Zn1Cu1Br1Cl1F2_1_20918.vasp,Zn1Cu1Br1Cl1F2,-0.73509854,0.1763771920833333 -Ga1Ni1S2I2_6_6215.vasp,Ga1Ni1S2I2,-1.21738031,0.1644979969270768 -Cs2Cl10_127_4707.vasp,Cs2Cl10,-0.396666555,0.2329448774999996 -Zr2O6_59_21621.vasp,Zr2O6,-6.028875105,0.1976577015625 -P4O6_4_14088.vasp,P4O6,-5.147921694,0.1108820596000006 -Fe2Pd4Se4_49_5927.vasp,Fe2Pd4Se4,-1.278244135,0.1668681835957421 -Mg6V1C1_25_10599.vasp,Mg6V1C1,-1.0735894875,0.1950028394444377 -Sr1Te2F2_1_17093.vasp,Sr1Te2F2,-1.61816667,1.2986576346666672 -Hg1S1_156_7909.vasp,Hg1S1,0.103435825,0.309649185 -Nb1Cu1Ni1I2N3_1_12497.vasp,Nb1Cu1Ni1I2N3,-3.01940385625,0.7676969941874987 -K1Pb2C2O6F1_187_8928.vasp,K1Pb2C2O6F1,-4.685011586666667,0.0801182530208288 -Ti1Br2_187_18751.vasp,Ti1Br2,-3.09123299,0.0873162666666669 -Mo2N1O2_2_11635.vasp,Mo2N1O2,-5.186294302,0.2903678970000003 -Zr2S2_164_21653.vasp,Zr2S2,-4.2027689025,0.4664221225 -Nd1Ge2_123_13220.vasp,Nd1Ge2,-2.82967805,0.7857662916666635 -Bi4S6_11_2640.vasp,Bi4S6,-2.379014006,-0.925592109 -P6Pb6_2_14139.vasp,P6Pb6,-2.039854791666667,0.6794681265476168 -Na2Gd2Cl8_2_12084.vasp,Na2Gd2Cl8,-2.578088978333333,0.0795414138888865 -Co1C6F6_47_3718.vasp,Co1C6F6,-4.5459764,0.3850076782692222 -Ga1I2_115_6202.vasp,Ga1I2,-0.49757651,0.2988993358333333 -Cs4Cd2Br8_11_4805.vasp,Cs4Cd2Br8,-0.4791101314285714,0.2183701557142855 -Cu2As4Se3Br2_6_5021.vasp,Cu2As4Se3Br2,-1.6889720563636366,-0.265538364469701 -Tb2Cl2_164_18189.vasp,Tb2Cl2,-2.547004955,0.113347478333331 -Cu1Te2_164_4996.vasp,Cu1Te2,-0.5151541566666666,0.3870947855555547 -Sr4Fe2S2O6_129_17436.vasp,Sr4Fe2S2O6,-3.7147804621428575,0.2527255335714182 -Mn4O14_51_11444.vasp,Mn4O14,-3.864067937222222,0.231526480416663 -Er2Cu2Pb2Se6_51_5557.vasp,Er2Cu2Pb2Se6,-2.2744239275,0.1899535129166669 -Sc3Nb1Te4_6_16215.vasp,Sc3Nb1Te4,-3.14337782875,0.3788910287500004 -Ti4O14_1_19147.vasp,Ti4O14,-5.639327783333333,0.3222964987499948 -Os2Cl8_14_13844.vasp,Os2Cl8,-1.558437388,0.0630518249999998 -Mg2Sn2F8_1_10517.vasp,Mg2Sn2F8,-3.023601770833333,-0.1201493670833331 -P2Au2S6_2_13957.vasp,P2Au2S6,-2.283486191,0.0789515274999974 -Si1C1F2_156_16324.vasp,Si1C1F2,-4.327470355,0.715928300416667 -Mg4P2_59_10580.vasp,Mg4P2,-1.510544955,0.4303360425694438 -Fe2As2S6_162_5784.vasp,Fe2As2S6,-2.7011675310000003,-0.335531994625003 -Sc2C1S2F2_164_16055.vasp,Sc2C1S2F2,-3.6038329357142858,1.2639145173809414 -Sr2Mn2Si2_129_17276.vasp,Sr2Mn2Si2,-2.029670265,0.3431316154166635 -Ag1Sb1P2S6_143_118.vasp,Ag1Sb1P2S6,-2.736009586,0.0321694115104176 -Na1Al1I4O12_2_11811.vasp,Na1Al1I4O12,-3.087241006666667,0.1324310012499971 -Al2Te6P2_162_1022.vasp,Al2Te6P2,-2.101275,0.0156372519999999 -Au1O1F1_25_1432.vasp,Au1O1F1,-0.7979348,0.5295730164814801 -Zr1O2_164_21387.vasp,Zr1O2,-6.896310133333333,0.2866790100000003 -Ag2Cl2_51_247.vasp,Ag2Cl2,-0.0439669475,0.08535198 -Ta2I2_129_17758.vasp,Ta2I2,-3.1640710275,1.1594675516071364 -Nb3F8_156_12972.vasp,Nb3F8,-4.2262196154545455,0.2448747290909048 -Te12P12_7_18276.vasp,Te12P12,-2.319594935833333,0.489295935 -Ba3Cl6_5_2100.vasp,Ba3Cl6,-2.3964489466666667,0.3277464366666667 -Be2Br4_2_2245.vasp,Be2Br4,-1.8413921,0.2468445266666667 -Ta2B1H2O2_164_17653.vasp,Ta2B1H2O2,-5.930036815714286,0.73075678457141 -Mn5Br2Cl3O6_1_11459.vasp,Mn5Br2Cl3O6,-3.092938856875,0.0479511981770811 -Bi1As1W1_156_2314.vasp,Bi1As1W1,-3.139698093333333,0.287064225555552 -Ir3Pd1S8_1_8855.vasp,Ir3Pd1S8,-2.9599923133333337,-0.0635230622916671 -Cr2As4_2_4315.vasp,Cr2As4,-3.1247694900000003,0.2158585924999965 -Y3C2S2F2_187_20792.vasp,Y3C2S2F2,-4.580225505555556,1.392231292407395 -Pd2Se2_11_14494.vasp,Pd2Se2,-1.4873978025,0.2394579099999998 -Ag3P1S4_156_499.vasp,Ag3P1S4,-1.3729324625,0.3895839575000002 -Hf1Zr1Se2_1_7401.vasp,Hf1Zr1Se2,-4.4631446575,-0.2336370825 -La2Cl2_164_9587.vasp,La2Cl2,-2.7329742825,0.2203578215000008 -Ta1Br2_115_17518.vasp,Ta1Br2,-2.633527126666667,0.7760970897618982 -Cr2C1O2F2_164_4341.vasp,Cr2C1O2F2,-3.372892998571429,1.082727289653671 -Ca3Fe2Cl2O5_123_3174.vasp,Ca3Fe2Cl2O5,-3.6612558991666666,0.0190343858333295 -Nb2Cl2O1_1_12675.vasp,Nb2Cl2O1,-4.113388154,0.5688642957618999 -In2F6_12_8424.vasp,In2F6,-2.51191002625,0.1044283812499999 -Ge2Sb2S6_147_6854.vasp,Ge2Sb2S6,-2.652750487,0.3286625097916645 -Mn1Sn2Sb1Br4O6_1_10902.vasp,Mn1Sn2Sb1Br4O6,-2.981887989285714,0.1501459754464242 -Ca2H8S4Br4_53_3044.vasp,Ca2H8S4Br4,-2.7341663916666668,0.0637914644444417 -Ga3S2O14_164_6534.vasp,Ga3S2O14,-3.655713514210527,0.5353554294078908 -Tl2Se2F2_59_19528.vasp,Tl2Se2F2,-1.3238105866666667,0.7475003394444425 -Ga1Cu1S2Br1Cl1_25_6167.vasp,Ga1Cu1S2Br1Cl1,-1.4266103583333332,0.2945589187268503 -Nb2O2_6_12794.vasp,Nb2O2,-5.962010635,0.557482658333333 -K2C2Se2Cl6O6_1_9026.vasp,K2C2Se2Cl6O6,-2.7243813683333333,0.5400528570833281 -Ag1Pd2O4_187_102.vasp,Ag1Pd2O4,-2.3325509414285714,0.2085053899999984 -Al3Te4_164_1055.vasp,Al3Te4,-2.1599200185714285,0.0812149594642837 -Nb4Te12Cl2_2_13165.vasp,Nb4Te12Cl2,-2.640199900555556,0.1393659560515818 -Na2Ru2C2S4I8_13_12278.vasp,Na2Ru2C2S4I8,-1.823694755,0.287581698402776 -In2Ni2S5_156_8496.vasp,In2Ni2S5,-1.8457902933333328,0.1916592631481464 -Ge1Bi2Te4_156_6650.vasp,Ge1Bi2Te4,-1.7317195542857142,-0.1941120800000013 -Ca1Cu1Ag1S1Br2N1_1_2822.vasp,Ca1Cu1Ag1S1Br2N1,-1.717153777142857,0.1865013901190418 -Sb4O8_11_15790.vasp,Sb4O8,-4.226056385000001,0.1920204820833326 -K3V5O14_157_9407.vasp,K3V5O14,-4.833694736363636,0.2270558413636365 -Pd2Au1S4_187_14395.vasp,Pd2Au1S4,-1.7305141757142857,0.1307681633928534 -Ag2B4I2N2F4_2_188.vasp,Ag2B4I2N2F4,-3.5353341435714287,0.3045781194444323 -Li4S12_13_10218.vasp,Li4S12,-2.726401224375,0.022256486484375 -Rb4As4O8_57_14961.vasp,Rb4As4O8,-3.6922874075,-0.0250083312500031 -Ti4H2N3_164_19139.vasp,Ti4H2N3,-7.069349273333334,-0.2489947866666728 -Hg1F2_187_7853.vasp,Hg1F2,-0.2385173566666666,0.2082261991666666 -Ti2S2N1_164_19000.vasp,Ti2S2N1,-6.33223914,-0.1040976020000004 -Al1_191_759.vasp,Al1,-1.6782724,0.7457084649999999 -Cu1Hg2H16C8N8Cl2_2_4905.vasp,Cu1Hg2H16C8N8Cl2,-4.561342521351351,-0.0426104998400168 -Zn2Mo2Se2O12_18_21120.vasp,Zn2Mo2Se2O12,-3.9530924427777774,0.053381845555551 -Cd2S1O1_1_3540.vasp,Cd2S1O1,-0.74786434,0.4004234472916667 -Eu1Si2_164_5594.vasp,Eu1Si2,-2.8948908,1.2161664 -Co1Mo1S2I2_1_3780.vasp,Co1Mo1S2I2,-1.89157572,0.2778687750146165 -Mn2Te4H2_11_11319.vasp,Mn2Te4H2,-1.99079720625,0.5474895175000001 -Tl1Ga1Hg1Te4_156_19274.vasp,Tl1Ga1Hg1Te4,-0.64969216,0.4145278933333318 -Hf2Si4_129_7619.vasp,Hf2Si4,-4.778816183333333,0.5091789366666664 -Li2Pr1As2_164_10043.vasp,Li2Pr1As2,-3.095965984,0.3428403434999998 -Zr1P2Pd1Se6_1_21393.vasp,Zr1P2Pd1Se6,-2.859676294,0.2206381635937444 -Tl1Br1_99_19228.vasp,Tl1Br1,-0.034294985,0.5424172650000001 -Sn4S4O16_11_16958.vasp,Sn4S4O16,-4.1938815145833335,0.0779408726822883 -Zr2C1Cl2_164_21531.vasp,Zr2C1Cl2,-4.848480862000001,0.0269162759999996 -Ni1I2O6_1_13361.vasp,Ni1I2O6,-2.3833422455555557,0.0089351788888869 -Ag2Sb4S3F2_6_412.vasp,Ag2Sb4S3F2,-1.6910144372727274,0.4842278421212094 -Ni3P2Se8_164_13709.vasp,Ni3P2Se8,-1.7491332276923075,0.2223699722115361 -Nb2Br1N2Cl1_25_12645.vasp,Nb2Br1N2Cl1,-5.5213325483333335,0.06472699259999 -Ta4H2C3O2_164_18048.vasp,Ta4H2C3O2,-7.034051354545454,0.1929529915908947 -H4Au1C12O2_6_7050.vasp,H4Au1C12O2,-5.599443595789474,0.9653198190350848 -Mg1I1Cl1_1_10375.vasp,Mg1I1Cl1,-1.34387987,0.1205110258333331 -Sb2H2Se2O10_4_15583.vasp,Sb2H2Se2O10,-3.867518921875,0.1442530925520833 -Tl8O6_11_19649.vasp,Tl8O6,-2.1249604485714286,0.0670790349999999 -Sn1Au1Br2O2_1_16604.vasp,Sn1Au1Br2O2,-1.7508444683333335,0.3386503352083332 -Ti1Ni1Ir1Se3S2_6_18810.vasp,Ti1Ni1Ir1Se3S2,-2.9823369425,0.0722038650000005 -Pb4W4O8_13_14325.vasp,Pb4W4O8,-4.35848901,0.6743323464795854 -V4O10_11_20343.vasp,V4O10,-5.508465787857142,-0.0498872057142856 -H2Pd2Se4_11_7017.vasp,H2Pd2Se4,-2.1055531225,0.4871393725000001 -Nb12O26_51_12458.vasp,Nb12O26,-6.808109981052632,-0.013565375328952 -Ta1Zn1O3_8_17642.vasp,Ta1Zn1O3,-4.81673194,0.5107869824999971 -Co2F2_164_3898.vasp,Co2F2,-1.62823587,0.526532324375 -In2S2Cl2_31_8544.vasp,In2S2Cl2,-1.9037287666666665,0.1392783083333315 -Ge3P2S9_174_6915.vasp,Ge3P2S9,-3.043428007142857,0.1954229383147292 -In2As2Se6_147_8376.vasp,In2As2Se6,-2.177931145,0.1172420754999999 -Te4As2Au2_26_18559.vasp,Te4As2Au2,-1.05260856375,-0.1130299246875 -Pb1O1_156_14191.vasp,Pb1O1,-2.86521819,0.2758634696875 -Sc1Ag1Te6As2_149_15895.vasp,Sc1Ag1Te6As2,-1.74315089,0.220904931166665 -Nb2Co4Te2S2_51_12700.vasp,Nb2Co4Te2S2,-3.174577186,-0.1279835619583378 -Sb2Pb2C2O6F6_7_15637.vasp,Sb2Pb2C2O6F6,-3.5724468655555555,0.6134444182638854 -In1Sn1Br1Cl1O2_1_8353.vasp,In1Sn1Br1Cl1O2,-2.6548601566666665,0.174895442499996 -Bi4O6_59_2625.vasp,Bi4O6,-3.570533873,0.2874603549999999 -Sc1Sb2Au1O6_149_15992.vasp,Sc1Sb2Au1O6,-3.650196945,1.0802289951250006 -Cd2S2I1Br3_1_3546.vasp,Cd2S2I1Br3,-0.30048052875,0.2610174554166667 -Mn1Ga1Cu2Se3Br2Cl3_1_10719.vasp,Mn1Ga1Cu2Se3Br2Cl3,-1.1671129133333331,0.2051600950208313 -Ta3Ni3Se14_6_17973.vasp,Ta3Ni3Se14,-2.8583702295,-0.3432777013750018 -Co1I2_115_3775.vasp,Co1I2,-0.07054171,0.4726767211111106 -Sb2O3_1_15615.vasp,Sb2O3,-3.97925782,0.2782326475000003 -Mg1Mn1Cu1S2Br2Cl2_1_10384.vasp,Mg1Mn1Cu1S2Br2Cl2,-1.5093791844444444,0.2148850161388832 -Li6Bi2H16O14_2_10260.vasp,Li6Bi2H16O14,-4.202176646052632,0.0591306688157859 -Al1Cl2_187_630.vasp,Al1Cl2,-1.57771659,0.722289953888887 -Pd1Br2O8_147_14345.vasp,Pd1Br2O8,-1.99442206,0.6271914565909058 -Sr1F2_187_17047.vasp,Sr1F2,-3.2566221166666662,0.556894553333334 -Pt4I2N3Cl2O1_1_14703.vasp,Pt4I2N3Cl2O1,-2.2753130925,0.3162626534374972 -V3B2S2F2_187_20244.vasp,V3B2S2F2,-3.82331508,0.5674336656084586 -Zn1Te1_156_21021.vasp,Zn1Te1,0.273793015,0.396473875 -B1Se1_156_1637.vasp,B1Se1,-3.05371469,1.1212700925 -In2O1_164_8507.vasp,In2O1,-2.3737007566666666,0.8567097483333308 -Mn2Bi2Te4Br2_26_11020.vasp,Mn2Bi2Te4Br2,-1.26245029,0.2752744323879291 -Mn1Zn1Br2O1_8_10938.vasp,Mn1Zn1Br2O1,-1.4621156,0.1883687155000001 -Zr1Cl2_115_21275.vasp,Zr1Cl2,-2.64891934,0.5302894 -Sb2Te6As2_157_15733.vasp,Sb2Te6As2,-1.728046639,0.2518439034999999 -Hg4P4O16_57_8085.vasp,Hg4P4O16,-3.687541152083333,0.2235399030208298 -Cu2P2Se6_2_5215.vasp,Cu2P2Se6,-1.917389589,0.1291774332708312 -V6Se18_11_20395.vasp,V6Se18,-2.7932740375,0.0693903345000002 -Ca1Ge1Br2_8_2838.vasp,Ca1Ge1Br2,-1.4240772325,0.56676692125 -Pt3Se1S1I1Br1O1_1_14694.vasp,Pt3Se1S1I1Br1O1,-1.63072206625,0.5288870081250001 -In1Ge1S1I2Br2_1_8263.vasp,In1Ge1S1I2Br2,-1.1217533885714286,0.2712944442708312 -Mg4N2_59_10579.vasp,Mg4N2,-2.754120185,0.2783679331944433 -Tl1Hg1Se1S1_8_19286.vasp,Tl1Hg1Se1S1,-0.5354901975,-0.1335807394531249 -Ir2S2_12_8823.vasp,Ir2S2,-3.22962254,0.6029040183333292 -Tl2Se5_12_19539.vasp,Tl2Se5,-1.3276796614285715,0.1960925314285713 -Ag1Au1S1Br2_1_10.vasp,Ag1Au1S1Br2,-0.2771506099999999,0.1167009132916643 -Sc3Pt1I1Br3O4_8_16216.vasp,Sc3Pt1I1Br3O4,-3.8481576375,0.2709141547291605 -Sc2S2_164_16137.vasp,Sc2S2,-3.87565853,0.0001775849999998 -Nb2Se4Br4_12_12880.vasp,Nb2Se4Br4,-2.723368794,0.0662250210000001 -Ta2I8_1_17768.vasp,Ta2I8,-1.558504785,0.1306893832187501 -Nb4S2_129_13143.vasp,Nb4S2,-5.642668025,0.0115164033333279 -Cu2Te3As4I2_6_5343.vasp,Cu2Te3As4I2,-1.31202912,0.1766436464935028 -In1Br2_187_8213.vasp,In1Br2,-0.7324497166666667,0.29900049375 -Ca1In1S1Br3_1_2852.vasp,Ca1In1S1Br3,-1.7522956966666667,0.1460902179166667 -Al1Se2_115_738.vasp,Al1Se2,-2.616776693333333,0.2284087238888867 -Ga8O6_11_6588.vasp,Ga8O6,-3.5457052292857143,0.2499784157142843 -Cu8S2O24_7_5504.vasp,Cu8S2O24,-2.705829849705882,0.4355177633823501 -Sb1Br2_115_15439.vasp,Sb1Br2,-0.7385248633333333,0.4919502524999989 -Zn5N2O16_10_21237.vasp,Zn5N2O16,-2.732488217391304,0.5046741111956461 -Al2Te6As2_162_1021.vasp,Al2Te6As2,-1.955328695,0.209053057625 -Ga2Se2Br2_59_6467.vasp,Ga2Se2Br2,-1.728218203333333,0.1481481991666668 -Y2P2H8O12_13_20765.vasp,Y2P2H8O12,-5.436447832916667,0.056998311388889 -Bi2W1_164_2580.vasp,Bi2W1,-2.26479046,0.3856239266666645 -Pd2F6_162_14424.vasp,Pd2F6,-1.18081105,0.19027271375 -Na2Hg2Cl6_11_12149.vasp,Na2Hg2Cl6,-0.657765704,0.09655093225 -Tl1H2_115_19283.vasp,Tl1H2,-1.4734689466666666,1.6729315699999974 -Au4Se2_4_1593.vasp,Au4Se2,0.0059270766666666,0.9557848266666658 -Zr2Tl4S6_11_21729.vasp,Zr2Tl4S6,-3.0313422733333333,0.0894319541666641 -Na2In2Br8_4_12185.vasp,Na2In2Br8,-1.1739734641666668,-0.1732350100000009 -Ag2F2_164_254.vasp,Ag2F2,-0.3522383,0.3938088549999999 -Na1Ga1As2S6_5_11858.vasp,Na1Ga1As2S6,-2.681286689,0.1387649286874976 -Zn2H8Cl4O12_14_21102.vasp,Zn2H8Cl4O12,-2.9598605850000004,0.1990945166185846 -Li1Co1Te6P2_5_9677.vasp,Li1Co1Te6P2,-2.04365185,-0.0358718528333344 -As1Se2_115_1179.vasp,As1Se2,-2.06330647,0.4930458013888865 -Na2Mg1Te2S8F4_2_12201.vasp,Na2Mg1Te2S8F4,-2.3053922411764707,0.3564569635784262 -Rb1Ti1Se2_156_14761.vasp,Rb1Ti1Se2,-3.0703292925,0.1598022756250001 -Lu1P2_21_10296.vasp,Lu1P2,-3.1998763033333333,0.8784324516666631 -Ce1Si2Au4_123_3655.vasp,Ce1Si2Au4,-1.2410187571428573,0.4278700871428571 -Nb2Te2F2_59_12907.vasp,Nb2Te2F2,-3.772223403333333,0.0412186069999932 -Cu1Ir1Se2_6_4915.vasp,Cu1Ir1Se2,-1.577153185,0.5847651818750002 -Au2S4_14_1529.vasp,Au2S4,-1.26187233,0.2852816464583321 -P1O1F1_156_13927.vasp,P1O1F1,-3.35136466,1.0102468696666629 -N4O8_2_11795.vasp,N4O8,-4.5732453175000005,0.1297980183333322 -Sr2H8S4F4_53_17249.vasp,Sr2H8S4F4,-3.272964281666667,0.1527879099999967 -Ga1Ag1P2Se6_149_6118.vasp,Ga1Ag1P2Se6,-2.223020908,0.1236504165416644 -Ta1Bi1P1_156_17510.vasp,Ta1Bi1P1,-4.316930233333333,0.3116089449999961 -Cu2Br4_14_5056.vasp,Cu2Br4,-0.0174323366666666,0.1178558783333333 -K4Cd2Cl8_11_9426.vasp,K4Cd2Cl8,-0.8420509042857143,0.2003062914285703 -Ti2P4O16_59_18985.vasp,Ti2P4O16,-5.633491505454545,0.2780530767045421 -Na2Hg4S8I6_31_12161.vasp,Na2Hg4S8I6,-0.6531235040000001,0.0495131139791676 -Zn1Ge1I1Br1_1_20942.vasp,Zn1Ge1I1Br1,-0.4538650625,0.0429019609374999 -K2Te2H6C2O6_4_9372.vasp,K2Te2H6C2O6,-3.792543824444445,0.4266171598888758 -Th1Sn2_123_18723.vasp,Th1Sn2,-2.324106583333333,0.1089487300000002 -Zr1As2H2O6_164_21243.vasp,Zr1As2H2O6,-4.856893300909091,0.3152693287121113 -Mn3Mo1S4Br2_1_11393.vasp,Mn3Mo1S4Br2,-2.570879444,0.1267708477499989 -Na1Al1Sb2Se6_5_11817.vasp,Na1Al1Sb2Se6,-2.173377619,0.330130898833331 -Ag1Sn1S2Br2_8_134.vasp,Ag1Sn1S2Br2,-1.103459821666667,0.245877266145829 -Te2Pd2_164_18475.vasp,Te2Pd2,-1.1245485075,0.0569748487500001 -Ca1Mn1Sn1Cl1O4_25_2856.vasp,Ca1Mn1Sn1Cl1O4,-3.88306815625,0.1597457131250002 -Tl1F2_115_19262.vasp,Tl1F2,-1.3788015433333334,0.4083243133333334 -Al2Si2H4O9_8_981.vasp,Al2Si2H4O9,-5.586318811764706,-0.3559011058333379 -Ni3Sn1Se2_187_13728.vasp,Ni3Sn1Se2,-0.659706755,-0.0807546863541678 -W2Br6_162_20466.vasp,W2Br6,-1.73405943875,0.3008733409374997 -Ru6S8_11_15373.vasp,Ru6S8,-3.5015334692857145,0.1965246928571389 -Ga1Ge1Se2_1_6193.vasp,Ga1Ge1Se2,-2.3922608175,0.0731807075 -Co1Ru1S2Br1Cl1_6_3816.vasp,Co1Ru1S2Br1Cl1,-2.2500175616666667,0.0977586194444383 -Al2Co2S5_164_805.vasp,Al2Co2S5,-3.148229788888889,0.1471491014351822 -Au2C2I2O2_31_1462.vasp,Au2C2I2O2,-2.73797366375,0.3424913843749999 -Rb2H6C2S2O6_4_14850.vasp,Rb2H6C2S2O6,-4.270642982777778,0.1283104603819407 -Ta2Ni1S6_12_17791.vasp,Ta2Ni1S6,-4.219637631111111,0.0843218988888896 -Co1W2Cl10_5_3837.vasp,Co1W2Cl10,-1.98345846,0.0043781415384578 -Nb1S2_164_12562.vasp,Nb1S2,-4.84366818,0.1137172250000002 -Mn2B1F2_164_10992.vasp,Mn2B1F2,-3.069106444,0.2372019922857111 -Cu4Hg4S4Br4_26_5422.vasp,Cu4Hg4S4Br4,-0.15105567125,0.1347794070833333 -Ca3Au2Cl2O4_123_3150.vasp,Ca3Au2Cl2O4,-2.6288385645454544,0.3767017983333276 -Ag2S2_10_383.vasp,Ag2S2,-0.704892285,0.26333667984375 -Al1Pt5Cl2_123_715.vasp,Al1Pt5Cl2,-1.67802256125,0.8384273724999973 -Sr2Mn2Sn2_12_17278.vasp,Sr2Mn2Sn2,-0.8286078966666667,0.5823100225862058 -Zn1Ni1Se2_8_20979.vasp,Zn1Ni1Se2,-0.5056131925,0.2424722868749991 -Sc4O6_65_16253.vasp,Sc4O6,-5.984233094,0.6214219017499998 -Ge1H2S2_164_6669.vasp,Ge1H2S2,-3.042225518,-0.2026444049999995 -Cu2H8C4N16O4_2_5142.vasp,Cu2H8C4N16O4,-5.398810110294117,-0.070195600702623 -Na2H10C10N4O8_2_12090.vasp,Na2H10C10N4O8,-5.3309315594117646,0.4289379416470474 -Ca6Ge6O18_2_3257.vasp,Ca6Ge6O18,-4.750814578333333,0.163178545 -Sr2In1Hg1Au1O5_99_17266.vasp,Sr2In1Hg1Au1O5,-2.5097727240000003,0.6942077653958305 -Be1I2_164_2224.vasp,Be1I2,-1.1190266033333334,0.3052647683333331 -Ca2Pb2I8_6_3097.vasp,Ca2Pb2I8,-0.9192850725,0.0772734428888888 -Li4V2O4F2_51_10240.vasp,Li4V2O4F2,-4.475416949166667,0.1333525729166568 -Ba1S2F2_1_1853.vasp,Ba1S2F2,-2.73815575,0.6323246217500007 -Nb4H2S2N3_164_13088.vasp,Nb4H2S2N3,-5.936713128181818,0.0062408033333227 -Si3P2O9_174_16474.vasp,Si3P2O9,-5.923997872857143,0.1437863877142796 -Li2O2F2_6_10033.vasp,Li2O2F2,-2.7179606933333336,0.5087216820833302 -Zn2Bi4S6F4_31_21049.vasp,Zn2Bi4S6F4,-1.90456968,-0.0026269107500019 -W4N3_164_20587.vasp,W4N3,-6.585925658571428,-0.4675010471428631 -Sn2Te2_129_16893.vasp,Sn2Te2,-1.140644125,-1.1049161449999998 -Cu4Se2_191_5468.vasp,Cu4Se2,-0.2964515166666666,0.1192458824999989 -Ca2S6N2Cl2_59_3110.vasp,Ca2S6N2Cl2,-2.8258552600000004,0.2352232264062423 -P2W1_164_14056.vasp,P2W1,-4.67973453,0.299823476666667 -Re2Bi2O8_51_15030.vasp,Re2Bi2O8,-4.764718875833333,0.4694001024999998 -Te4Rh2_14_18624.vasp,Te4Rh2,-1.396967495,0.8050510472222221 -K2Co2Sb2_12_9085.vasp,K2Co2Sb2,-0.9819853433333332,0.2520981649999989 -Co4Bi8S4O28_57_4077.vasp,Co4Bi8S4O28,-3.9115449504545454,0.1010698959848411 -Lu2H2Cl2_164_10310.vasp,Lu2H2Cl2,-3.2362749866666665,0.0377750266666669 -Co1Re2Rh1S8_1_3813.vasp,Co1Re2Rh1S8,-3.7745097808333337,0.2403923152777748 -Sn12Pd4_127_16595.vasp,Sn12Pd4,-1.3185991125,0.4430009662499982 -Sn2Cl6_1_16765.vasp,Sn2Cl6,-1.31089685625,0.0872304162499985 -Cd4Br8_26_3623.vasp,Cd4Br8,0.3360762041666666,0.355960075 -Sr4Cu4Bi2O14_26_17424.vasp,Sr4Cu4Bi2O14,-3.22614176625,0.2607109791666631 -P4Au2Se3F2_6_14071.vasp,P4Au2Se3F2,-1.977008009090909,0.5284422411363592 -In1F1_99_8242.vasp,In1F1,-1.278189505,1.1531504483333312 -Sn4_191_16977.vasp,Sn4,-0.9283396525,-3.5357631375 -Sb4Te6_7_15839.vasp,Sb4Te6,-1.580216112,0.2660895619999999 -Na2Mn2Sb2_129_12214.vasp,Na2Mn2Sb2,-1.4574784550000002,0.2979341263362052 -H4Au4S4Br4_2_7062.vasp,H4Au4S4Br4,-1.34218041875,0.0724995865625001 -Ti1Tl2F6_164_18861.vasp,Ti1Tl2F6,-3.278291468888889,0.1321059677777776 -Tl1Te6P2Au1_149_19354.vasp,Tl1Te6P2Au1,-1.358691789,0.3433091347499942 -Os2S2Cl2_59_13866.vasp,Os2S2Cl2,-3.0049030900000004,0.3104801608333298 -Mn1Nb1I2O1_1_10805.vasp,Mn1Nb1I2O1,-3.0128569,0.0316635083333336 -Si2N2F2_59_16411.vasp,Si2N2F2,-5.3383717,-0.339607489583337 -Co1Br2_115_3711.vasp,Co1Br2,-0.52609734,0.4927658766666657 -Na2Ni2Bi2_129_12237.vasp,Na2Ni2Bi2,-0.2467530366666666,1.8445389766666649 -As2I2_2_1220.vasp,As2I2,-1.3815187875,0.145924218333332 -Sr4Sb4H4Se8_14_17467.vasp,Sr4Sb4H4Se8,-2.5025501725000003,0.4148463469999974 -Na1In1Te6P2_5_11893.vasp,Na1In1Te6P2,-1.741979236,0.2915543176666654 -As4W2O12_4_1375.vasp,As4W2O12,-5.169182027777778,-0.0711452419444489 -Mn2As2S4I2_10_10977.vasp,Mn2As2S4I2,-2.252751103,0.3747329058333319 -Cu4Br2O6_11_5398.vasp,Cu4Br2O6,-1.6332047550000002,0.4366724414583327 -Fe1H4C2Br2N6_6_5691.vasp,Fe1H4C2Br2N6,-4.3828020573333335,0.2857083948055432 -K1Rb1Mg6O7_99_8931.vasp,K1Rb1Mg6O7,-3.4267089446666663,0.078813673333328 -Cd2Br2_2_3479.vasp,Cd2Br2,0.68656189,-0.0017247606249999 -Ni2H8C16S4N6O2_2_13519.vasp,Ni2H8C16S4N6O2,-5.382772422368421,0.5089266140131421 -Ni2O2_164_13547.vasp,Ni2O2,-1.7010633325,0.1247855125000001 -Au1C12S2F4_6_1416.vasp,Au1C12S2F4,-4.9574203163157895,0.8582656689144665 -Zn2Ga2S5_187_21084.vasp,Zn2Ga2S5,-2.053656702222222,0.1634842121111095 -Ni2As1Se2_187_13444.vasp,Ni2As1Se2,-1.40852088,0.575480591777773 -Zr2Te2As1_164_21699.vasp,Zr2Te2As1,-3.794536048,0.05832805 -Ir4Se2S6_1_8865.vasp,Ir4Se2S6,-3.163944375833333,-0.258656486875 -Tc4I14_13_18250.vasp,Tc4I14,-1.4402584716666669,0.1421741905555542 -W2S2N1_8_20530.vasp,W2S2N1,-5.303437606,-0.2324474086666663 -Ti2Sn2O6_147_19030.vasp,Ti2Sn2O6,-5.809960934,-0.0149393522499998 -Ag2Hg2Se2Br2_26_301.vasp,Ag2Hg2Se2Br2,0.18060370375,0.103393525625 -Sb2As2O6_7_15529.vasp,Sb2As2O6,-4.338901192,0.1711210819999999 -Mg3I6_5_10553.vasp,Mg3I6,-0.7389693488888889,0.1227848977777777 -Na1Co1Sb2Te6_149_11848.vasp,Na1Co1Sb2Te6,-1.48103609,0.2385365857333301 -Cr1Pb3_191_4234.vasp,Cr1Pb3,-0.177385475,2.1189997825000004 -As2H6Pb2S6N2_7_1218.vasp,As2H6Pb2S6N2,-3.3588414083333333,0.234198684115536 -Ge2Bi6_12_6751.vasp,Ge2Bi6,-1.38725650625,-0.49386160375 -Sn2Te6P1_162_16902.vasp,Sn2Te6P1,-1.534598061111111,-0.3705924020370379 -Mo2Br8_2_11580.vasp,Mo2Br8,-1.120146979,0.0625026450000001 -Pd1Pt3O8_10_14379.vasp,Pd1Pt3O8,-3.173905490833333,0.2124992995833339 -Yb2I6_59_20880.vasp,Yb2I6,-1.501033375,-0.3805537520312501 -Lu2Bi2O6_147_10301.vasp,Lu2Bi2O6,-4.884514359,0.366640645875 -Ge2Sb2C2O6F6_7_6840.vasp,Ge2Sb2C2O6F6,-3.80347373,0.6929414197222106 -Sr4Bi4Te8Cl4_14_17413.vasp,Sr4Bi4Te8Cl4,-1.803097714,0.0539853149999999 -Li2H8C2N8O6_2_9955.vasp,Li2H8C2N8O6,-5.173071996538462,0.0131161224999889 -Mn2N4_187_11158.vasp,Mn2N4,-5.101908916666667,0.4181677274999946 -Ti1Br1F1_156_18748.vasp,Ti1Br1F1,-3.7831074233333335,-0.0514362172222279 -W2I4_11_20503.vasp,W2I4,-1.2318712416666666,0.8388193113888889 -Hg1Ge1S2Br2_1_7855.vasp,Hg1Ge1S2Br2,-1.2391220283333333,0.1106466371990723 -Fe3Se4_164_6067.vasp,Fe3Se4,-1.7810146314285713,-0.0039935421428588 -Tl2F6_1_19410.vasp,Tl2F6,-1.54547207375,-0.0718451131249999 -Mn1Te1Mo1Se1_8_10905.vasp,Mn1Te1Mo1Se1,-2.234984835,0.2599919593749998 -As1I1O1_156_1149.vasp,As1I1O1,-2.30259865,0.4938987694444421 -Rb2Cl2_129_14835.vasp,Rb2Cl2,-1.23736334,0.1779377100000001 -Ba2Ni3O8_47_2037.vasp,Ba2Ni3O8,-3.017273930769231,0.0878441358653783 -Li4P4O8_29_10214.vasp,Li4P4O8,-4.995724135,0.217667840399991 -Ni1B4H4C2Br2_47_13269.vasp,Ni1B4H4C2Br2,-3.6568390184615382,0.6965661102670773 -Fe1H8C4S4N2_10_5710.vasp,Fe1H8C4S4N2,-4.558228624736842,0.0616329269407789 -Bi2P2Pb8O16_2_2490.vasp,Bi2P2Pb8O16,-4.093160415,-0.0965667753125019 -Cr1W3O8_25_4286.vasp,Cr1W3O8,-5.892206793333333,0.2241159336394499 -La2Ti2O8_129_9620.vasp,La2Ti2O8,-6.307308043333333,0.3941884959374939 -Ca8Ge4_1_3261.vasp,Ca8Ge4,-0.99188077,0.5047640966666666 -Cr3W1S8_25_4586.vasp,Cr3W1S8,-3.6993957175,0.01646385 -In2C4Cl4F10_10_8397.vasp,In2C4Cl4F10,-2.7219745790000003,0.4804597616666644 -K2Te2C2O6F6_1_9366.vasp,K2Te2C2O6F6,-3.214343025,0.6599322023611081 -Sb2Te5Pd2_8_15732.vasp,Sb2Te5Pd2,-1.3960544,0.3486201173333315 -Al2S5_12_951.vasp,Al2S5,-3.208358222857143,0.2105329767857118 -Rh2S6_11_15228.vasp,Rh2S6,-2.73718789625,0.4473773428645806 -Fe2S1Br2O2_1_5929.vasp,Fe2S1Br2O2,-2.0598954785714283,0.4364237314285675 -V2Pb3O8_5_20144.vasp,V2Pb3O8,-4.627068975384615,0.1035952426923074 -Ba2Au1Br2O2_123_1903.vasp,Ba2Au1Br2O2,-2.5559721242857143,0.1643633053061173 -Na4H8C8O12_14_12390.vasp,Na4H8C8O12,-5.094526445625,0.241874702473954 -As2Cl2_12_1200.vasp,As2Cl2,-2.00101412,0.1313177233333315 -Sc5Br8_10_16267.vasp,Sc5Br8,-2.3308499115384618,0.0934788126923051 -W3C2_187_20560.vasp,W3C2,-6.266236672,0.4400079099999936 -Hg2P2S6_2_7981.vasp,Hg2P2S6,-2.049451061,0.0641223714999998 -V1Br2_187_19789.vasp,V1Br2,-1.6849410566666665,0.0613737766666668 -Fe3C2Cl2_187_6048.vasp,Fe3C2Cl2,-2.852712614285714,0.8048904014285635 -Pr1Ge5_47_14530.vasp,Pr1Ge5,-2.963680801666667,-0.0574463645833362 -Sc2Se2S1Br3_1_16158.vasp,Sc2Se2S1Br3,-2.54901764625,0.4128284065625001 -Cr2C1S2_164_4344.vasp,Cr2C1S2,-4.202751132,0.1325073309999958 -Cu2O4F2_17_5201.vasp,Cu2O4F2,-2.14896464,0.214568418125 -Hf1Zr1Nb2Te8_12_7387.vasp,Hf1Zr1Nb2Te8,-3.2717029091666667,0.1623138597222222 -Li2H8Br2O4_2_9954.vasp,Li2H8Br2O4,-3.789494123125,0.0439683822916625 -Mn1Nb2Te2Se3I1Br1_1_10821.vasp,Mn1Nb2Te2Se3I1Br1,-2.620113773,0.2856124610162431 -P8Pb4_26_14152.vasp,P8Pb4,-2.6090665483333333,0.5739686359523777 -K2Hg4S2Br6O6_31_9176.vasp,K2Hg4S2Br6O6,-1.6065072690000002,0.0904040925416622 -Zr4Se4F4_31_21849.vasp,Zr4Se4F4,-3.9767016366666663,0.408305867083329 -V2As2S6_157_19980.vasp,V2As2S6,-3.246473021,0.2104622663749973 -Y4Te10O26_2_20838.vasp,Y4Te10O26,-4.635941599000001,0.0739332294999997 -Co2Br2_164_3877.vasp,Co2Br2,-0.5757071325,0.607165052499999 -Ti4Te4Br4_31_19165.vasp,Ti4Te4Br4,-3.2220322925,0.1936038408333265 -Nb4Zn4Cr2O16_7_13182.vasp,Nb4Zn4Cr2O16,-5.015618512307692,0.198885014102554 -Hg2Te2Au2F2_26_8025.vasp,Hg2Te2Au2F2,0.129040675,0.8783361052370688 -Bi2As2S6_7_2419.vasp,Bi2As2S6,-2.5802947620000003,-0.0938363492500004 -W1Au2O4_8_20412.vasp,W1Au2O4,-3.36776072,0.5420066867857098 -Hf1Te1I1_156_7317.vasp,Hf1Te1I1,-2.89271234,0.1459352679166645 -Y2S6_129_20775.vasp,Y2S6,-4.2426353325,0.1192036452343749 -Fe2Te5P2_8_6024.vasp,Fe2Te5P2,-1.79268072,0.3818685387037017 -Ti2As1S2_164_18877.vasp,Ti2As1S2,-5.212698898,-0.5290470816250052 -Li4Fe2P8O26_2_10186.vasp,Li4Fe2P8O26,-5.19848015675,0.0625967576937457 -Mn1Ge3S1Br6Cl1_1_10757.vasp,Mn1Ge3S1Br6Cl1,-1.7240412741666666,0.0834397739843736 -Mn2Al2Te5_164_10961.vasp,Mn2Al2Te5,-1.9213605444444444,0.13091204587121 -Mo3C2O2_187_11704.vasp,Mo3C2O2,-5.305820462857143,0.2953221335714238 -K2Ta2Br12_4_9358.vasp,K2Ta2Br12,-1.89020960625,0.0117587787499982 -Al4Br4_57_1064.vasp,Al4Br4,-1.3465804125,0.5684853058333317 -B2Te5_12_1719.vasp,B2Te5,-2.33675517,0.5462304557142812 -In3Ru2_123_8653.vasp,In3Ru2,-1.844159404,0.4720739954999985 -V2Cl4O2_51_20035.vasp,V2Cl4O2,-3.36507912375,-0.0786946043750003 -Ti1Sb1As1_156_18842.vasp,Ti1Sb1As1,-3.9264314633333335,0.5596366674999961 -Ge2Sb2S6F2_7_6853.vasp,Ge2Sb2S6F2,-2.6194844975,0.4306355880208309 -S4Cl4_2_15395.vasp,S4Cl4,-1.47384818,0.0527952412499999 -Zr1Ga1S1Br1N1Cl1_6_21294.vasp,Zr1Ga1S1Br1N1Cl1,-3.550509233333333,0.3793577970833328 -Pd3Se1S1I3_1_14510.vasp,Pd3Se1S1I3,-0.79837566625,0.1622302196875 -Sn2Sb2O6_7_16864.vasp,Sn2Sb2O6,-3.89668163,0.291451240999998 -Ti2F6_189_18935.vasp,Ti2F6,-4.45029047625,-0.5313420837500002 -V3N2_187_20283.vasp,V3N2,-5.256318616,0.6815225746666616 -K2Os2S4I8N2_7_9286.vasp,K2Os2S4I8N2,-1.7956955038888889,0.2875707585416647 -Fe2F2_129_5845.vasp,Fe2F2,-0.5021095925,2.081196725 -Al2H10N4Cl4_10_855.vasp,Al2H10N4Cl4,-4.037003049,0.148393420430546 -Ga1Cu1Sb2Se6_149_6174.vasp,Ga1Cu1Sb2Se6,-1.760986699,0.3731046738333311 -Rb2Pa2F12_51_14917.vasp,Rb2Pa2F12,-4.151554634375,0.0827976237499958 -Hf1S2_164_7282.vasp,Hf1S2,-5.332944893333333,0.1088193733333335 -Ga4Bi4_127_6543.vasp,Ga4Bi4,-0.7428853175,0.03799817 -Nb2Te8Rh2_11_12933.vasp,Nb2Te8Rh2,-2.6476892508333334,0.1477802008333331 -Ga18S9_143_6105.vasp,Ga18S9,-2.180704162962963,0.0880798270370346 -Ni1Pd3Br2Cl2O4_1_13404.vasp,Ni1Pd3Br2Cl2O4,-1.643805085,0.1530516047222204 -V4F16_31_20324.vasp,V4F16,-3.2994499825,-0.0191005334999996 -Yb4I4O4_14_20890.vasp,Yb4I4O4,-4.50388062,-1.0033025102083362 -Ag2B6H8I2N2_1_190.vasp,Ag2B6H8I2N2,-3.726600259500001,0.3674274545999949 -Cr1H2_187_4187.vasp,Cr1H2,-3.0699185300000003,1.8809155166666625 -Ta2Ni4S6_11_17800.vasp,Ta2Ni4S6,-2.9988945966666667,-0.0080946069000045 -Cr1Cl1_1_4139.vasp,Cr1Cl1,-1.09658951,1.7598313683333309 -Er2Cl2O2_59_5552.vasp,Er2Cl2O2,-4.9687145883333335,0.1143636949999997 -Ga2Ge2Se2_164_6365.vasp,Ga2Ge2Se2,-2.6517828383333333,-0.3214666650000022 -Mo3C2F2_187_11703.vasp,Mo3C2F2,-4.394163981428571,0.1777517036904687 -Y2I2O2_164_20744.vasp,Y2I2O2,-5.083640225,0.1183899799999999 -Ag4Te4S12_14_578.vasp,Ag4Te4S12,-1.436607227,0.2965120579791643 -K2B2C8S2F6_51_8984.vasp,K2B2C8S2F6,-3.773561289,1.6599563081171815 -Ni1B4H4C2I2_47_13271.vasp,Ni1B4H4C2I2,-3.534305583846153,0.6800549725747705 -Nb3S1Cl7_156_12999.vasp,Nb3S1Cl7,-3.361945203636364,0.0537181354545452 -Zn1Se1_123_21009.vasp,Zn1Se1,-0.024719115,0.67528423875 -Mn1Nb2S4_164_10820.vasp,Mn1Nb2S4,-4.167214745714285,0.5792743601313601 -Hf1Zn1Br2O1_1_7368.vasp,Hf1Zn1Br2O1,-2.891570748,0.2503204715000007 -Cr1H4C4S6Cl1_1_4190.vasp,Cr1H4C4S6Cl1,-3.94800978,0.3187464600260394 -Ag1H1Br2_1_68.vasp,Ag1H1Br2,-0.752920275,0.1078523853124999 -Zn2Sb4I4O6_31_21152.vasp,Zn2Sb4I4O6,-2.49725611,0.04492124296875 -Te2W2_25_18537.vasp,Te2W2,-3.1521091825,0.8859410737500002 -Y1Mg5_1_20647.vasp,Y1Mg5,-0.4290798233333333,0.0839047413888883 -Hg2H4N2Cl2_51_7964.vasp,Hg2H4N2Cl2,-2.472847062,0.0971096976293105 -Ga2Sn2Se2_164_6495.vasp,Ga2Sn2Se2,-1.84133446,-1.1044846566666675 -Ag2O2F2_59_337.vasp,Ag2O2F2,-1.1054115033333334,0.4225647099999985 -Mn2Br8_14_11036.vasp,Mn2Br8,-0.7279236520000001,0.1574621749999999 -Ta3C2O2_187_17950.vasp,Ta3C2O2,-7.901740234285714,-0.0407010228571649 -As6C6_12_1380.vasp,As6C6,-5.0614796858333335,0.6022752991666662 -Te2_164_18539.vasp,Te2,-0.787818275,0.7839674816666666 -Ba4Sb4S8Cl4_14_2181.vasp,Ba4Sb4S8Cl4,-2.8191804915,0.0993312081250001 -Dy2Bi7O14_8_5517.vasp,Dy2Bi7O14,-4.269400972608696,0.1605154234239092 -Rh2Se6_11_15247.vasp,Rh2Se6,-2.1147087375,0.4859804152777757 -W2Cl6_12_20487.vasp,W2Cl6,-2.35689927375,0.1861317837499999 -Hf1Ni1F6_149_7246.vasp,Hf1Ni1F6,-3.50331112,0.0703260475 -Cr1Ga1Fe1H1Br1O5_1_4175.vasp,Cr1Ga1Fe1H1Br1O5,-3.910989296,-0.0663014298541773 -Ni2Au1S4_187_13459.vasp,Ni2Au1S4,-1.4289119842857143,0.0664245690178537 -Mn2As2S4Cl2_10_10974.vasp,Mn2As2S4Cl2,-2.581846569,0.169107590625 -Zn1S1Cl2_1_21000.vasp,Zn1S1Cl2,-0.8047998125,0.2997948534375 -V1Ag1As2S6_5_19747.vasp,V1Ag1As2S6,-2.630288214,0.4367230912999965 -Ti2S2Br2N1_1_18994.vasp,Ti2S2Br2N1,-4.404471582857143,0.124372300892845 -Na1_123_11958.vasp,Na1,0.1798327,0.50308644 -Ga1Se4_8_6276.vasp,Ga1Se4,-1.819943158,0.5625470506666668 -Mn2Cr1O6_162_11062.vasp,Mn2Cr1O6,-4.4572054733333335,0.1253329636805467 -V2I2_129_20096.vasp,V2I2,-1.581157175,0.4687069491666666 -Cu2Se1I2Cl3_1_5290.vasp,Cu2Se1I2Cl3,-0.20789872375,0.2707556140791661 -Sc2Br4N1O1_8_16045.vasp,Sc2Br4N1O1,-3.2220441425,0.4111928984374998 -Tc2F6_12_18228.vasp,Tc2F6,-3.7529905225,-0.0331902671875 -Ga1Fe1I2N3_1_6186.vasp,Ga1Fe1I2N3,-3.148634984285714,0.1573245894047568 -Ag2Cl6_162_251.vasp,Ag2Cl6,0.05240036375,0.252628064375 -Be2Zn1_123_2272.vasp,Be2Zn1,-0.7932670633333333,-0.0914110733333337 -Co1Pb3_187_3810.vasp,Co1Pb3,-0.3261076,1.0887567625 -W1Au2O4_111_20410.vasp,W1Au2O4,-3.1322220485714287,0.7775453582142813 -Cd1Pd1S2I1Cl1_25_3400.vasp,Cd1Pd1S2I1Cl1,-0.7935657100000001,0.3275617897222221 -P8O16_26_14151.vasp,P8O16,-4.95177684375,0.4417833285833298 -Nb4Ir1Se10_2_13091.vasp,Nb4Ir1Se10,-3.868945768666667,0.006366788499998 -Mn1Ge1Te2Pb1_6_10752.vasp,Mn1Ge1Te2Pb1,-1.547787654,-0.2695625911666667 -Ge1Pb1S3_1_6688.vasp,Ge1Pb1S3,-2.54692294,0.3125103805 -Hf2Te2Br2_59_7630.vasp,Hf2Te2Br2,-3.29027365,0.0638972383333302 -Co2Cl8_1_3894.vasp,Co2Cl8,-0.911982409,0.2508782764999999 -Na2C2O6_4_11999.vasp,Na2C2O6,-4.974750986,0.1686836206249975 -K2Os2C2Br8O4_31_9274.vasp,K2Os2C2Br8O4,-2.7611123766666665,0.248481096111104 -Mn2H4S2O8_7_11102.vasp,Mn2H4S2O8,-4.22885892625,0.1601537914880876 -Cd2Se2S8F4_7_3572.vasp,Cd2Se2S8F4,-1.56908698375,0.4592159901041666 -Ni2S2Cl2_59_13582.vasp,Ni2S2Cl2,-1.187958555,-0.1114055964583351 -Tl2Zn2O5_156_19568.vasp,Tl2Zn2O5,-2.261301241111111,0.2231059480555532 -Ta2Si2As2_129_17883.vasp,Ta2Si2As2,-5.254629246666666,0.3062563850000011 -Cu3Ag1Se4Cl2_1_5369.vasp,Cu3Ag1Se4Cl2,-0.705190432,0.1717060315833324 -K2Pt1C4I2N4_2_9303.vasp,K2Pt1C4I2N4,-4.573688413846154,0.0534591251281988 -Sr4P4H8O16F4_14_17459.vasp,Sr4P4H8O16F4,-4.810398970555556,0.0922554177777634 -As12Au2_31_1120.vasp,As12Au2,-2.280544626428572,0.3186215096428542 -Al2Fe1Te4_156_831.vasp,Al2Fe1Te4,-1.6745323028571428,0.3075795786904743 -Sn2P2C2O6F6_7_16805.vasp,Sn2P2C2O6F6,-4.277406898333333,0.1362322966666553 -Ba2Cu1Se2I2_38_1973.vasp,Ba2Cu1Se2I2,-1.701772727142857,0.1035975414285697 -Nb6Se18_11_13196.vasp,Nb6Se18,-3.680767463333333,0.0576313216666664 -Ga3Ir1_187_6528.vasp,Ga3Ir1,-1.82795511,0.50962484125 -La4I10_11_9629.vasp,La4I10,-1.861641155,0.0935674371428572 -Te12Br4O22_51_18273.vasp,Te12Br4O22,-3.184215997368421,0.0632437612500003 -Ta2Nb1Te3H1Se3_1_17785.vasp,Ta2Nb1Te3H1Se3,-3.781437634,0.3927825669166617 -Ga2B4P4O24_14_6304.vasp,Ga2B4P4O24,-5.300574723235294,0.2537483949387157 -Te4C4F8_1_18580.vasp,Te4C4F8,-2.9233015375,0.7160022570833332 -Zr1Se2_187_21446.vasp,Zr1Se2,-3.847013263333333,0.2431395775000004 -Tl2S2F2_59_19500.vasp,Tl2S2F2,-1.5370008883333333,0.6376087864583314 -Sn3Mo1_191_16916.vasp,Sn3Mo1,-0.66617774,-1.27943617625 -Ta4Te10Pt6_59_18121.vasp,Ta4Te10Pt6,-3.0117119325,0.1609222685000004 -K1W2Br6O2_47_8956.vasp,K1W2Br6O2,-2.7494885054545453,0.0624974000000002 -Ca2Ge4Cl12_2_3022.vasp,Ca2Ge4Cl12,-2.067530663888889,-0.0133241266666683 -Sb2Br10_51_15548.vasp,Sb2Br10,-0.4516834341666667,0.2787206166666661 -V4O4F12_1_20345.vasp,V4O4F12,-3.789888907,-0.6599822977500001 -Mn2Sb2S4I2_10_11243.vasp,Mn2Sb2S4I2,-2.108969043,0.3703365284999989 -Ge2B2As2H6S6_7_6746.vasp,Ge2B2As2H6S6,-3.347140893333333,0.2535124172222183 -Zr3C2S2F2_5_21758.vasp,Zr3C2S2F2,-4.808596714444445,0.8989489056712858 -Ga4Se4Br4_14_6571.vasp,Ga4Se4Br4,-1.84305064,0.0333157625 -Cr2B1Cl2_164_4319.vasp,Cr2B1Cl2,-2.894049994,0.2034759772499915 -Na2Fe2As2_129_12077.vasp,Na2Fe2As2,-1.4227032183333332,0.12443468 -Cr2Cl2O2_59_4350.vasp,Cr2Cl2O2,-3.64476647,-0.0572807744444481 -Co2H4Se2O8_4_3917.vasp,Co2H4Se2O8,-3.8211369425,-0.0126137114583356 -Te4Au2_12_18570.vasp,Te4Au2,-0.386461815,-0.2040851495833333 -In1Pt1Br1N2Cl1_25_8315.vasp,In1Pt1Br1N2Cl1,-2.5280758216666666,0.2864124045833309 -Pt2S6_11_14670.vasp,Pt2S6,-2.4782891,0.1600406398437499 -Pt2Se2F2_59_14675.vasp,Pt2Se2F2,-1.8810451683333331,0.2228967515624977 -U4Te4O20_57_19742.vasp,U4Te4O20,-5.8780560875,0.1471550528571432 -La2Sb2Se4O2_129_9612.vasp,La2Sb2Se4O2,-4.046466517000001,-0.0260110758333373 -Tl2I6_189_19441.vasp,Tl2I6,0.270580875,0.2990517946875 -Sr1Sb1S2I2_1_17079.vasp,Sr1Sb1S2I2,-1.7948980866666666,0.2346111260590251 -Cr4C3F2_164_4595.vasp,Cr4C3F2,-4.627373961111111,0.2240562894444328 -Sb2As2Se6_157_15536.vasp,Sb2As2Se6,-2.278098239,0.2052241835000003 -Co1H12C16N8_10_3737.vasp,Co1H12C16N8,-6.037816665135135,-1.847427601891896 -Ge2Sb1Te1Br1_1_6838.vasp,Ge2Sb1Te1Br1,-1.99340731,-0.1698817859999997 -C4O6_11_2767.vasp,C4O6,-5.490861796,0.8954567429999944 -Cu1S2_164_4958.vasp,Cu1S2,-1.2473932966666668,0.5335041109027762 -Fe2Bi2I2O4_26_5806.vasp,Fe2Bi2I2O4,-2.382895026,0.3538855984423067 -Sc2I2F2_164_16089.vasp,Sc2I2F2,-2.8183723950000004,-0.0137422050000028 -V2Re2O11_1_20147.vasp,V2Re2O11,-5.588068772666667,0.1329157126666666 -Na1Al1As2O6_5_11806.vasp,Na1Al1As2O6,-4.392709397,0.4003244095833241 -Y3B2F2_187_20786.vasp,Y3B2F2,-4.90959414,0.3755836980952278 -Ho2Br2O2_164_8125.vasp,Ho2Br2O2,-4.795166598333333,0.0513312600000004 -Mn2F2_129_11064.vasp,Mn2F2,-1.4217555525,1.1996436931896552 -Bi6Ir2O4_11_2667.vasp,Bi6Ir2O4,-2.81794175,0.4143190534027704 -As6Pt3_2_1391.vasp,As6Pt3,-2.6483415722222223,0.7727755052777776 -Mn2Sb2Se6_162_11252.vasp,Mn2Sb2Se6,-2.167530189,0.1409144513333317 -Bi2Cl8_12_2450.vasp,Bi2Cl8,-0.902073114,0.2708166904999998 -Nb2Fe2Te10_51_12719.vasp,Nb2Fe2Te10,-2.0618902521428573,0.3023215464880897 -V2Br4N1O1_6_20006.vasp,V2Br4N1O1,-3.00959163625,0.0494239598437498 -Ni2O2_129_13545.vasp,Ni2O2,-2.212763265,-0.3869144199999998 -Zr1Br1Cl1O1_6_21263.vasp,Zr1Br1Cl1O1,-4.08761852,0.1843014143749997 -Sr4Mn2I2O6_129_17446.vasp,Sr4Mn2I2O6,-3.765125013571428,-0.007017294642861 -Rb2F2_129_14839.vasp,Rb2F2,-1.8508112975,-0.4316067774999998 -Zr2Au2_129_21506.vasp,Zr2Au2,-1.7361253375,0.2508183099999999 -In1Pt5Br2_38_8320.vasp,In1Pt5Br2,-1.2266396425,1.1110827799999985 -Hf2Zn2_129_7663.vasp,Hf2Zn2,-1.7025134275,1.8010493775 -In8S12_14_8715.vasp,In8S12,-2.322751447,0.201888936 -Ga1Te6P2Au1_149_6297.vasp,Ga1Te6P2Au1,-1.56931984,0.3110779555833294 -Zn1Re2S8_147_20999.vasp,Zn1Re2S8,-3.224045290909091,0.4011728483749954 -Sb4P2O12F2_4_15797.vasp,Sb4P2O12F2,-4.197869054,0.5279426534166629 -Ba4As4Se8F4_14_2136.vasp,Ba4As4Se8F4,-3.003007747,0.0896354470000004 -Cu2Br2_129_5051.vasp,Cu2Br2,-0.067678685,0.31200061 -Ga1Se1S1Cl2_1_6271.vasp,Ga1Se1S1Cl2,-1.4254276300000002,0.6680031041041616 -Sn1Au2S4_1_16612.vasp,Sn1Au2S4,-1.2507719185714286,0.4473080042857126 -W1Au2S4_111_20414.vasp,W1Au2S4,-2.2621522842857145,0.2328406028571401 -Ca2Bi4_12_2958.vasp,Ca2Bi4,-0.9561130216666666,0.0135186431818175 -Cu2Si2S6_51_5316.vasp,Cu2Si2S6,-2.705915642,0.188407937958331 -Li2Mn2P2O8_11_9997.vasp,Li2Mn2P2O8,-5.0472829542857145,0.0882299628571381 -Hf3C2S2F2_187_7695.vasp,Hf3C2S2F2,-5.362548296666667,0.8974080380555443 -Hf2S4I2_1_7580.vasp,Hf2S4I2,-3.58982315,0.39618230796875 -Ni3Te1Cl1O5_1_13730.vasp,Ni3Te1Cl1O5,-2.39112513,-0.1342705502499994 -Cu2S2Cl2_59_5244.vasp,Cu2S2Cl2,-0.8554413166666667,0.3351481053968245 -Si4O10_30_16497.vasp,Si4O10,-5.4333945792857135,0.5404113173214258 -Cu4H4Cl4O4_14_5411.vasp,Cu4H4Cl4O4,-2.23292380875,0.1196226471354172 -Li4P4H16C4O12_14_10212.vasp,Li4P4H16C4O12,-4.9418717367500005,0.0294778042999999 -Er2Se6_51_5575.vasp,Er2Se6,-2.79868396375,0.4913928568750001 -Sb4F12_14_15775.vasp,Sb4F12,-2.72260964125,0.3935237737500001 -Ag2H4C4O8_14_275.vasp,Ag2H4C4O8,-4.526132138333334,0.3768515800925867 -K2P30_2_9292.vasp,K2P30,-3.8385330803125,-0.0096990581250029 -Sc1Bi1Se1I4Cl1_1_15908.vasp,Sc1Bi1Se1I4Cl1,-1.3027577725,0.2488056582291644 -Nb2S2Cl2_59_12836.vasp,Nb2S2Cl2,-4.179978698333334,-0.0562781414285795 -C8_67_2784.vasp,C8,-6.86810582875,1.24821958125 -Fe3B2H2S2_187_6044.vasp,Fe3B2H2S2,-2.9606466222222223,0.2507632573333254 -Ca2S2O12_13_3103.vasp,Ca2S2O12,-3.88894496125,0.5717543915625003 -Cu2W1Se4_111_5365.vasp,Cu2W1Se4,-2.06863281,0.1529861357142858 -Ag4S4Br4_14_545.vasp,Ag4S4Br4,-0.6130933658333334,0.1955174839583325 -Sb2Au2O6_2_15543.vasp,Sb2Au2O6,-2.558972845,0.6253158829999999 -Ag2S2_129_384.vasp,Ag2S2,-0.53894605,0.4292829148437501 -Al2B2Mo2_51_766.vasp,Al2B2Mo2,-4.06775377,0.4361253949999994 -Te2Os1_164_18421.vasp,Te2Os1,-2.4071526133333334,-0.2052789450000003 -Ag2Te2F2_59_456.vasp,Ag2Te2F2,-0.5947405783333334,0.4551983855555535 -Hf1Ge1Se1I1_6_7179.vasp,Hf1Ge1Se1I1,-3.07599937,0.396418490312496 -Ta3B2S2F2_187_17943.vasp,Ta3B2S2F2,-5.281229328888888,0.772428550999988 -Ag2Te4Mo1_111_481.vasp,Ag2Te4Mo1,-0.8763176471428571,0.2327127130952356 -Mg2Co8O18_1_10445.vasp,Mg2Co8O18,-3.60143554,-0.2445937846428637 -Y1Sb1Te1Se1Br2_1_20666.vasp,Y1Sb1Te1Se1Br2,-2.432736428333333,0.3681623167361043 -Ga2Te4_1_6516.vasp,Ga2Te4,-1.41530379,0.4151679996666648 -Hg1Se2_115_7914.vasp,Hg1Se2,-0.1681966299999999,0.073129711111111 -Tl2Ru1_123_19494.vasp,Tl2Ru1,-0.5763285366666667,0.6814415049999988 -Hf1Te1O1_156_7319.vasp,Hf1Te1O1,-5.3284234066666665,0.4394534608333338 -Sb1S2_115_15496.vasp,Sb1S2,-2.3013980333333333,0.4715770332291642 -Mg2Fe2Ge2_129_10452.vasp,Mg2Fe2Ge2,-1.0938387616666667,-0.0131789772222236 -Al2Ge2Se2_164_849.vasp,Al2Ge2Se2,-3.036799058333333,0.0364191750000002 -Na2H2S2_11_12104.vasp,Na2H2S2,-2.713364565,0.042350718333334 -Au2I6_162_1493.vasp,Au2I6,0.6517495925,0.1989333199999999 -Mn1Cu2Se1S2Br2_1_10702.vasp,Mn1Cu2Se1S2Br2,-1.2007273275,0.225031297802733 -Ta3N2F2_187_17968.vasp,Ta3N2F2,-6.65408033,0.5038501143809473 -Hg2Au2S2I2_26_7929.vasp,Hg2Au2S2I2,0.25535409125,0.0913013097916675 -Li2Ti1_187_10088.vasp,Li2Ti1,-2.65921276,0.7463628111111085 -K2Os2C2S4I8_129_9278.vasp,K2Os2C2S4I8,-1.883586875,0.4866321415972199 -Ag2Se2_59_439.vasp,Ag2Se2,-0.47153583,-0.1845798224999999 -Cu2Te4I2_4_5353.vasp,Cu2Te4I2,-0.46450466375,0.13186894875 -Mn2Te4As2F2_26_11315.vasp,Mn2Te4As2F2,-1.959370381,0.3840920474999964 -Bi1S2_187_2375.vasp,Bi1S2,-1.9839768633333328,-0.3364778159375021 -Li2Mn4F18_2_10002.vasp,Li2Mn4F18,-2.4135802825,0.2447573968229168 -Ba2Sb4O8_11_2056.vasp,Ba2Sb4O8,-4.387425763571429,-0.0268402390476276 -Hf2Br2Cl2_6_7443.vasp,Hf2Br2Cl2,-3.244227953333333,0.1829470260416605 -Ta2F6_189_17724.vasp,Ta2F6,-4.2726827675,0.5463657807499955 -Ir1Se2_187_8763.vasp,Ir1Se2,-2.40656474,-0.0534779841666663 -Cu2Te3P4Cl2_6_5346.vasp,Cu2Te3P4Cl2,-1.8063888681818183,0.2709945090043241 -Ni1F2_187_13316.vasp,Ni1F2,-0.7217559699999999,0.5497898183333333 -Cr4O8_12_4617.vasp,Cr4O8,-4.874822218333334,-0.0568263639583372 -Ta2Fe2Se10_51_17727.vasp,Ta2Fe2Se10,-2.9513361257142856,0.3493511796428543 -U2C4_2_19704.vasp,U2C4,-7.736580776666667,1.211208873333332 -Mn2Se2S8_31_11282.vasp,Mn2Se2S8,-2.3990602400000003,0.5386551240972196 -Li4W4Cl24_143_10249.vasp,Li4W4Cl24,-2.1150012834375,0.0803955484374983 -Er2Mg2Ru1_123_5563.vasp,Er2Mg2Ru1,-1.685173386,0.21188702 -Gd1I2_187_6596.vasp,Gd1I2,-1.67591511,0.0391710933333333 -Ir2S4_11_8829.vasp,Ir2S4,-3.2070798433333336,-0.1177249100000006 -Na2Ru2S4Br8N2_7_12284.vasp,Na2Ru2S4Br8N2,-2.013193147222222,0.034996100277776 -In1Ag1As2S6_149_8177.vasp,In1Ag1As2S6,-2.316927524,0.4125730026874974 -V1I2_164_19868.vasp,V1I2,-1.1469122466666668,-0.0434662011111113 -Te2P2O10F2_1_18438.vasp,Te2P2O10F2,-3.9864241825,0.3092922341927009 -Bi2Br2O2_59_2431.vasp,Bi2Br2O2,-2.522429428333333,0.2320212866666668 -Te4H4O12_1_18588.vasp,Te4H4O12,-3.8259922015,0.1925036462499996 -Li6Bi2S6_147_10261.vasp,Li6Bi2S6,-2.830109491428572,0.0657121757142831 -Mn2Pt1Se1S5_8_11206.vasp,Mn2Pt1Se1S5,-2.7013033655555554,0.3551580802777728 -Ge4Te4As4_17_6950.vasp,Ge4Te4As4,-2.5144977816666665,-0.4686087116666684 -Na2Mg2_11_12205.vasp,Na2Mg2,0.2207195075,0.1752221733333333 -Cr2Co1S4_164_4357.vasp,Cr2Co1S4,-3.2181360371428576,-0.0054828712698475 -Os2S2F2_59_13867.vasp,Os2S2F2,-3.3372729233333334,0.3680615914999974 -Mn1W1Br1Cl1O2_1_10928.vasp,Mn1W1Br1Cl1O2,-3.631550406666667,0.271916966194721 -Ga4S4Br4_14_6562.vasp,Ga4S4Br4,-2.1270324525,0.0304431749999998 -B2Mo3F2_187_1679.vasp,B2Mo3F2,-3.9208692,0.6795087861904683 -Zn4Cr2N4_2_21217.vasp,Zn4Cr2N4,-2.415128089,0.2732693810000008 -Mn2Te4P2F2_26_11325.vasp,Mn2Te4P2F2,-2.107071332,0.5708406479444409 -In1Ag1Sb2Se6_149_8184.vasp,In1Ag1Sb2Se6,-1.6661967489999998,0.3094547988333312 -I6N2_12_8165.vasp,I6N2,-0.53678528625,0.56069914328125 -Cd2Au2Se2Br2_26_3461.vasp,Cd2Au2Se2Br2,0.0742533475,0.0717263502824999 -Hg5Cl10_12_8097.vasp,Hg5Cl10,0.27591726,0.1456790833333333 -Tl1Pt2_187_19323.vasp,Tl1Pt2,-0.3734079433333333,1.1639834208333308 -Sb16Cl4_10_15422.vasp,Sb16Cl4,-1.9717758725,0.1079711339999982 -Mo2Se2I2_59_11686.vasp,Mo2Se2I2,-1.83414522,0.3559637219444447 -Sr4V2Cu4O14_6_17487.vasp,Sr4V2Cu4O14,-3.7962493891666655,0.4156241221874932 -Zr1Nb1Se1Br1_25_21355.vasp,Zr1Nb1Se1Br1,-3.45427707,0.5335885977083294 -V1Ag1Br2O1_1_19750.vasp,V1Ag1Br2O1,-2.027620484,0.2933644422857115 -Cu2Te4P2_26_5355.vasp,Cu2Te4P2,-1.35293176,0.3933571050000001 -Ta2Pt2S10_51_17837.vasp,Ta2Pt2S10,-3.779124461428572,0.0967219499107073 -Nb1Br1N1Cl1_8_12479.vasp,Nb1Br1N1Cl1,-4.1524681275,0.1537223717750007 -Al2Tl2Cl8_10_1023.vasp,Al2Tl2Cl8,-1.7796620491666666,0.1958238545833335 -Ni2O2F2_59_13544.vasp,Ni2O2F2,-2.12998575,-0.3260692747916692 -Ta2Nb4Zn4O16_2_17786.vasp,Ta2Nb4Zn4O16,-5.490985365,0.114484638701918 -Ga2Se4_127_6484.vasp,Ga2Se4,-1.7364217583333332,0.6957362205555535 -Zr1N1_156_21335.vasp,Zr1N1,-6.039638615,0.9596971549999996 -Be2I4_51_2258.vasp,Be2I4,-1.0482705616666668,0.3760208099999997 -Zn2As2S6_147_21027.vasp,Zn2As2S6,-2.001142118,0.4970578639874976 -Cu1Si1Mo1As1I1Br1Cl2O2_1_4978.vasp,Cu1Si1Mo1As1I1Br1Cl2O2,-2.36678726,0.7211165556101151 -Ag4H4O4F4_2_518.vasp,Ag4H4O4F4,-1.33516217875,0.990547463125 -In2O3_1_8514.vasp,In2O3,-3.503320642,0.53541733025 -Ni2Br6_162_13483.vasp,Ni2Br6,0.03525474875,-3.683874999999524e-05 -Zn2As4Br4O6_31_21029.vasp,Zn2As4Br4O6,-2.792802206875,0.08274858203125 -Hf1Fe1I6_149_7162.vasp,Hf1Fe1I6,-1.28439379875,-0.1508024478125 -V4Pb2O12_12_20353.vasp,V4Pb2O12,-5.117721606111111,0.0253078247222173 -Hf1Ni1H6_1_7247.vasp,Hf1Ni1H6,-3.0845223125,0.8801967081250004 -Sr1Ag1Se2_1_17016.vasp,Sr1Ag1Se2,-1.309935655,0.1720309045833317 -Ga2F6_1_6344.vasp,Ga2F6,-2.9057775475,0.0637969824999999 -Nb4H2N3_164_13087.vasp,Nb4H2N3,-6.534960471111111,-0.0869725733333384 -Na4Hg2Br8_11_12392.vasp,Na4Hg2Br8,-0.6657064214285714,-0.2557803385714286 -P4Pt4O4_13_14104.vasp,P4Pt4O4,-3.954126919166667,0.343594538374996 -Ni1Br2_115_13287.vasp,Ni1Br2,0.2248929133333333,0.1799924933333333 -Na1In1As2O6_5_11879.vasp,Na1In1As2O6,-3.938613685,0.3303455798541626 -Sc4C3Cl2_164_16229.vasp,Sc4C3Cl2,-4.771535584444445,0.1766003218996361 -Ru2Br2_129_15300.vasp,Ru2Br2,-1.05492435,1.2866496891666643 -Zn1Fe1O1F2_6_20930.vasp,Zn1Fe1O1F2,-2.147864234,0.3636908490000001 -Hf1Ge1Au1S5Cl1_1_7170.vasp,Hf1Ge1Au1S5Cl1,-3.030525084444444,0.1903345636111045 -Hf2Cl8_1_7482.vasp,Hf2Cl8,-3.102211768,0.0629868954999999 -Bi1Te1I1_156_2400.vasp,Bi1Te1I1,-0.91400201,0.24495203 -Hg4H8Se4O20_14_8075.vasp,Hg4H8Se4O20,-3.124887727222222,0.0827867788888889 -Ta1I2_115_17556.vasp,Ta1I2,-1.8754665833333333,0.9266252588095178 -Ta1H4_123_17551.vasp,Ta1H4,-3.390499774,1.3700095230000011 -Mg2Ge4_12_10462.vasp,Mg2Ge4,-1.953509985,-0.4886298841666667 -Mn2Sb2Se4I2_26_11250.vasp,Mn2Sb2Se4I2,-1.7362500669999998,0.1137910412500006 -Na2H6C6S6_1_12119.vasp,Na2H6C6S6,-4.2998541525,0.2059978193749977 -P2Pb2Cl2O6_7_14006.vasp,P2Pb2Cl2O6,-4.250226469166667,0.1058888018749995 -P2Pb2O6_7_14010.vasp,P2Pb2O6,-4.486756175,0.4007730437500006 -Fe2C1S2F2_164_5829.vasp,Fe2C1S2F2,-2.493871172857143,0.2910201595237984 -Bi4Se6_7_2647.vasp,Bi4Se6,-1.826837158,0.2814745519999997 -Ti3H2N2O2_187_19085.vasp,Ti3H2N2O2,-6.668586365555556,-0.5314712128703762 -Rb2S6N2_1_14937.vasp,Rb2S6N2,-2.710311411,0.1878164494374976 -Cr2Sb4Te12Au2_13_4488.vasp,Cr2Sb4Te12Au2,-1.3269205835,0.2625715119999982 -Ti1V1I2_25_18863.vasp,Ti1V1I2,-2.4169524675,0.6986489962500002 -Os1Cl2_164_13797.vasp,Os1Cl2,-2.12380178,0.208847215833329 -Te2W2_129_18532.vasp,Te2W2,-3.53766176,0.5003884962499998 -Pd2O4F2_6_14448.vasp,Pd2O4F2,-2.037601775,0.4302361264583305 -Al2Te2O8F2_11_1008.vasp,Al2Te2O8F2,-3.8775116314285714,0.5044523305952304 -Cr2P2O6_162_4448.vasp,Cr2P2O6,-5.105722923,0.3753781941666609 -In8S4I6Br1Cl1_1_8716.vasp,In8S4I6Br1Cl1,-1.2730639585,0.0753826622395816 -Te4Au4S12_14_18577.vasp,Te4Au4S12,-1.4407391465,0.3014463921250006 -Ga2O1_164_6413.vasp,Ga2O1,-2.96635749,0.2291517849999969 -Ti2Se1I2_2_19017.vasp,Ti2Se1I2,-3.474387498,0.1066274092407315 -In2Br2_129_8389.vasp,In2Br2,-0.80457496,0.5182914150000001 -P2Se3_164_14053.vasp,P2Se3,-2.725019654,0.1917264524166645 -Te2Ir2Br2_59_18389.vasp,Te2Ir2Br2,-1.8780700883333332,0.2037869172222186 -Mn2Au2I8_1_10989.vasp,Mn2Au2I8,-0.0594993333333333,0.0678773314583338 -Hf1As2H2S6_164_7106.vasp,Hf1As2H2S6,-3.186224598181818,0.7790824290909015 -Rb2Ru2Br8N2O4_7_14920.vasp,Rb2Ru2Br8N2O4,-2.30192892,0.2491691755555536 -Mn4Zn2S10_6_11458.vasp,Mn4Zn2S10,-2.180347770625,0.6382007611249999 -Ta2N2Cl2_59_17782.vasp,Ta2N2Cl2,-6.078939526666667,0.1066776062380927 -Ca2Co1_123_2987.vasp,Ca2Co1,0.1748392833333333,1.157242459999999 -Sc1P2S7_5_15975.vasp,Sc1P2S7,-3.379726696,0.1647375112187479 -Cu2Pt1S1I2O2_1_5231.vasp,Cu2Pt1S1I2O2,-1.2225798725,0.6154049574999989 -Pb1Se1_156_14206.vasp,Pb1Se1,-1.64096998,0.3089941634374999 -Nb1Bi1Te1I1_1_12474.vasp,Nb1Bi1Te1I1,-2.015824485,-0.0665631038425966 -Na4V2P4O16_100_12430.vasp,Na4V2P4O16,-5.062994479230769,0.1970233401922976 -Mn4P4O16_14_11446.vasp,Mn4P4O16,-5.0433538887500005,0.2238607979166662 -Li2Mn2As2_129_9991.vasp,Li2Mn2As2,-2.58707515,0.139845095 -Mn1Co3O8_164_10676.vasp,Mn1Co3O8,-3.8891931175,-0.4501158613541665 -Si3W1_191_16481.vasp,Si3W1,-3.5579597275,1.2491244474999998 -Mn2Se2S1I2_1_11280.vasp,Mn2Se2S1I2,-1.558706507142857,0.2524968688541624 -Tb1Pb5_47_18177.vasp,Tb1Pb5,-0.9175999533333332,0.2005432266666658 -U2Br2O4_51_19701.vasp,U2Br2O4,-6.4099356375,0.0003974040000001 -Si2Hg6O7_10_16406.vasp,Si2Hg6O7,-2.15317288,0.282893575333333 -Ni1B4C2Br2F4_47_13264.vasp,Ni1B4C2Br2F4,-3.680645678461538,0.4403034559935805 -Li4Sb4S8_14_10225.vasp,Li4Sb4S8,-2.918810403125,0.0814389556249999 -Ca1H1Cl1O1_156_2841.vasp,Ca1H1Cl1O1,-3.6279430825,0.1624042949999999 -Cr1Cu1Te2_156_4162.vasp,Cr1Cu1Te2,-0.928922985,0.656310236875 -Sb2Pt2S6_12_15661.vasp,Sb2Pt2S6,-2.450221132,0.2616144921999973 -Nd2Br6_59_13235.vasp,Nd2Br6,-2.419386085,0.0727779037499996 -Ga2Sb2S6_162_6458.vasp,Ga2Sb2S6,-2.643258059,0.2192972460000002 -Sn1N2F2_10_16656.vasp,Sn1N2F2,-4.027683654,-0.2024159234999989 -H8Pd1C4N2O4_10_7095.vasp,H8Pd1C4N2O4,-4.968706627368421,0.3134882223684048 -Cr1Ag1As2S6_149_4096.vasp,Cr1Ag1As2S6,-2.493821218,0.3907381843437475 -Ta6Sn2Te12_26_18158.vasp,Ta6Sn2Te12,-3.433431392,-0.2128563503333369 -Mn1Al2S4_164_10627.vasp,Mn1Al2S4,-3.4344659342857145,-0.0748313357142858 -Ag2N12_31_329.vasp,Ag2N12,-5.056004872857143,-0.4161290342857136 -Li2Cr1P4O13_1_9870.vasp,Li2Cr1P4O13,-5.3636219205,0.0557866207562446 -P2Br10_51_13960.vasp,P2Br10,-0.5307556166666666,0.3807488145833326 -Tc2F8_14_18229.vasp,Tc2F8,-3.375845827,0.0370869050000002 -Ni1C6Br2F4_47_13299.vasp,Ni1C6Br2F4,-3.972924326923077,0.4135309092307624 -Zr1Se1S1_156_21442.vasp,Zr1Se1S1,-4.182731563333333,0.2775347333333329 -Ba2Ag1I2O2_123_1882.vasp,Ba2Ag1I2O2,-2.352238175714286,0.1168359969196379 -Sc3H2C2S2_187_16204.vasp,Sc3H2C2S2,-4.503543304444444,0.5532702976190309 -V2Mo1O8_35_20103.vasp,V2Mo1O8,-5.319074287272727,0.0191933045454493 -In2Te5_1_8639.vasp,In2Te5,-1.2864337528571428,0.1124284814285714 -Ba2Sb4_12_2058.vasp,Ba2Sb4,-1.65557906,0.5577232916666666 -Ca4Sn4S12_14_3243.vasp,Ca4Sn4S12,-2.7504177395,0.1672562207499973 -V1Se2_115_19930.vasp,V1Se2,-2.71409553,0.4325081883333332 -Ti2Se2N1_164_19023.vasp,Ti2Se2N1,-5.9003202020000005,-0.0662787590000002 -Ge4Br2Cl1O5_1_6929.vasp,Ge4Br2Cl1O5,-3.4503861558333333,0.2596012796875002 -W2Cl2O2_59_20482.vasp,W2Cl2O2,-4.31055859,0.3354977838265262 -Tl2Ge2Te6_162_19429.vasp,Tl2Ge2Te6,-1.369894265,0.079128399458332 -Sc2H2O4_31_16086.vasp,Sc2H2O4,-5.6662090725,0.0771545043229169 -Sn1Br2_115_16618.vasp,Sn1Br2,-0.8820431666666666,0.2849484183333335 -Pb2S1I2_5_14269.vasp,Pb2S1I2,-1.300811662,-0.599254824333333 -Te2Ru2I2_59_18516.vasp,Te2Ru2I2,-1.6047084683333337,0.2084440524999973 -Hg1Se1_156_7913.vasp,Hg1Se1,0.42773903,-0.364265735 -Nb6Cu2Te1Se5S1I3Br2_1_13189.vasp,Nb6Cu2Te1Se5S1I3Br2,-2.8879147245,0.071674237541657 -Zr3C2F2_187_21755.vasp,Zr3C2F2,-5.943839037142857,0.0511792030952333 -Ni4_11_13771.vasp,Ni4,1.6409769075,7.1989769075 -Fe1Cu1Te1I1_156_5671.vasp,Fe1Cu1Te1I1,-0.2483542625,0.6012022331249989 -Ni2O4_59_13552.vasp,Ni2O4,-2.5247323966666664,-0.1884452345833349 -P4Pb4Se12_14_14097.vasp,P4Pb4Se12,-2.35036607,0.1795937264999998 -K2Nb2Br12_4_9258.vasp,K2Nb2Br12,-1.67666675625,-0.0988867093750007 -Pd2S2_187_14468.vasp,Pd2S2,-1.5157872775,0.5943440625 -Hg1H4C2Br2N4_10_7870.vasp,Hg1H4C2Br2N4,-4.088673498461539,0.0950237431410205 -Zr2Cl2_129_21549.vasp,Zr2Cl2,-2.682536815,0.794302815 -H2Os1O2_164_6998.vasp,H2Os1O2,-4.249495766,0.5739091541666671 -Sb2Te3_164_15728.vasp,Sb2Te3,-1.75831214,0.0879935339999999 -Pd2Se2Br2_59_14483.vasp,Pd2Se2Br2,-1.1550429416666663,-0.1482295416666665 -Os2O2F2_59_13857.vasp,Os2O2F2,-3.81158372,0.4926594549999961 -Li4H4S4O16_14_10195.vasp,Li4H4S4O16,-4.445285458571428,0.0609674246428575 -Cu2S4O1_21_5260.vasp,Cu2S4O1,-1.5281752685714287,0.7483616397470214 -Mg8Si4_2_10603.vasp,Mg8Si4,-1.059860515,-0.0568513649999999 -B2P2_129_1694.vasp,B2P2,-4.6575671675,-0.8067760924999998 -Rb2H6C6S6_1_14857.vasp,Rb2H6C6S6,-4.196579106,0.21500159096874 -Cd2Sb2Te6_147_3565.vasp,Cd2Sb2Te6,-0.6934302609999999,0.0391508496666651 -Sr2Fe2Sn2_129_17221.vasp,Sr2Fe2Sn2,-0.4359907649999999,1.0156957066666654 -Nb1V1I2O1_8_12610.vasp,Nb1V1I2O1,-3.233613656,0.0362512886666666 -Tl2In2O6_31_19447.vasp,Tl2In2O6,-3.08442952,0.2900220553749999 -Tl4Cr16Bi4O56_14_19599.vasp,Tl4Cr16Bi4O56,-4.531495481875,-0.2747804799895909 -Ge1Te1_156_6716.vasp,Ge1Te1,-2.18117306,-0.7179317349999998 -Fe2P2H6C2O8_7_5906.vasp,Fe2P2H6C2O8,-4.554197851,0.4176986627499924 -V2Te2F2_59_20205.vasp,V2Te2F2,-2.767753438333333,0.0138064872222198 -Ge2B2P2H6S6_7_6748.vasp,Ge2B2P2H6S6,-3.4808638166666666,-0.232816945937503 -Tc4S8_2_18255.vasp,Tc4S8,-5.106562231666667,0.0670318300000003 -Zn1Pd1Cl2F2_1_20990.vasp,Zn1Pd1Cl2F2,-0.89574431,0.3403448109722222 -Hf2Si2S2_129_7613.vasp,Hf2Si2S2,-5.304559243333333,0.0603204499999998 -Ba3Co2S5I2_123_2103.vasp,Ba3Co2S5I2,-2.52503928,0.1853912805121471 -Hf2Sb1Se2_164_7583.vasp,Hf2Sb1Se2,-4.466435186,0.2567240845000005 -Sn1I4_123_16653.vasp,Sn1I4,0.067506622,0.3287640815 -Ba8Li4N4_115_2206.vasp,Ba8Li4N4,-2.132948978125,0.314935700208331 -Eu2Br6_59_5600.vasp,Eu2Br6,-2.365049785,-0.6065315093750001 -Ga1Si1Ni2Br2N2_1_6277.vasp,Ga1Si1Ni2Br2N2,-2.4730536225,-0.0012476919025534 -Mg4Fe2_51_10575.vasp,Mg4Fe2,0.2959356966666667,0.7463931777777775 -Ta4Cl16_14_18019.vasp,Ta4Cl16,-2.7677571675,0.1877363125000002 -Cd1S1_156_3414.vasp,Cd1S1,-0.329834345,0.41157936625 -Ge4Se4_57_6949.vasp,Ge4Se4,-2.68543408625,0.2148592587500002 -Sr2C1_164_17158.vasp,Sr2C1,-1.7191256366666667,1.191188187499994 -C10N2_65_2716.vasp,C10N2,-6.939140681666667,0.978913279166659 -Al2P2S6_157_923.vasp,Al2P2S6,-3.416054245,0.1382151623499999 -Sr2Co4Te6Cl4O16_17_17194.vasp,Sr2Co4Te6Cl4O16,-3.38641447375,-0.1217308165624999 -Sr2Au1S2Cl2_38_17129.vasp,Sr2Au1S2Cl2,-1.9489851171428567,0.2639813371428531 -Li2Ni2P2O8_11_10025.vasp,Li2Ni2P2O8,-4.512947408571429,-0.1078600356428595 -Os1W1Se1I2Cl3_1_13828.vasp,Os1W1Se1I2Cl3,-1.91741169,0.1681824685937485 -Ba1I1Br1_156_1837.vasp,Ba1I1Br1,-1.6662310466666668,0.2492290458333332 -Ag4Se2_26_561.vasp,Ag4Se2,0.0078057616666666,0.2394209483333333 -Nb2Ni2Te10_51_12783.vasp,Nb2Ni2Te10,-1.9715590114285717,0.0881166464285714 -Cu4Cl2O6_11_5402.vasp,Cu4Cl2O6,-1.8103907133333332,0.3449745693749992 -Co1C8I2F4_25_3725.vasp,Co1C8I2F4,-4.511013279333333,0.5118246184166653 -Fe2F6_191_5847.vasp,Fe2F6,-1.84544930375,-0.0217085612499998 -Cr3Se4_12_4581.vasp,Cr3Se4,-2.744466331428572,0.1303664557142854 -H1Au1O2_10_6982.vasp,H1Au1O2,-2.6120021825,0.1401723113541668 -Cu4Se4_2_5476.vasp,Cu4Se4,-0.75649646125,0.1541757245833334 -Ti2Se2_123_19027.vasp,Ti2Se2,-4.7127950025,-0.3477153775000001 -Al1As2Au1S6_149_608.vasp,Al1As2Au1S6,-2.529275874,0.4767053511874974 -Ta4Te14Pt2_11_18128.vasp,Ta4Te14Pt2,-2.8603447205,0.0848190531666648 -Sc1Be5_1_15904.vasp,Sc1Be5,-2.613888431666666,0.1679136300000001 -K1Tl1Cl4_81_8951.vasp,K1Tl1Cl4,-0.8450366366666667,0.1750560983333332 -Mn3Te4_164_11417.vasp,Mn3Te4,-1.6408794757142855,0.1751687989655153 -Ta2Cl4_11_17695.vasp,Ta2Cl4,-3.515059536666667,0.4291648283333267 -Ni1H4C6F2_47_13346.vasp,Ni1H4C6F2,-4.764857789230769,0.9306457107692224 -Cu2H12C8O16_14_5109.vasp,Cu2H12C8O16,-4.878834474473685,0.3303507293420948 -Ta2S2N1F2_164_17850.vasp,Ta2S2N1F2,-4.8281616085714285,0.8991464149999886 -Hf1Zr2Se2S1Cl2_1_7413.vasp,Hf1Zr2Se2S1Cl2,-4.1020317275,-0.0861933807812547 -P2Os2Se6_162_14001.vasp,P2Os2Se6,-3.091951211,0.5208761618333315 -Bi1Br2_187_2321.vasp,Bi1Br2,-0.74118482,0.1918748827777769 -Al1Ag1Sb2Se6_149_602.vasp,Al1Ag1Sb2Se6,-1.914819533,0.3074544468333312 -Mn1Sb1S1_156_10860.vasp,Mn1Sb1S1,-2.45512255,0.2393542433333307 -Ni4I8_14_13748.vasp,Ni4I8,0.3376969566666667,-0.09161394 -Li1In1Sb2Se6_5_9736.vasp,Li1In1Sb2Se6,-2.048079279,0.3409605323333312 -In2S2Br2_31_8542.vasp,In2S2Br2,-1.7262003166666666,0.1404378491666669 -Ge2As2S6Cl2_7_6739.vasp,Ge2As2S6Cl2,-2.51390536,0.4846666031249971 -Li1Al1Te6P2_5_9651.vasp,Li1Al1Te6P2,-2.099182736,0.2430537896666654 diff --git a/stability_prediction/data/2D_structure/structures.pickle b/stability_prediction/data/2D_structure/structures.pickle deleted file mode 100644 index 8d22815b..00000000 Binary files a/stability_prediction/data/2D_structure/structures.pickle and /dev/null differ diff --git a/stability_prediction/data/2D_structure/structures_0621.pickle b/stability_prediction/data/2D_structure/structures_0621.pickle deleted file mode 100644 index 51c568de..00000000 Binary files a/stability_prediction/data/2D_structure/structures_0621.pickle and /dev/null differ diff --git a/stability_prediction/dataset/collate_fn.py b/stability_prediction/dataset/collate_fn.py deleted file mode 100644 index 08dbbec7..00000000 --- a/stability_prediction/dataset/collate_fn.py +++ /dev/null @@ -1,26 +0,0 @@ -from __future__ import annotations - -import json -import os -from functools import partial -from typing import TYPE_CHECKING -from typing import Callable - -import numpy as np -import paddle -import pgl -from tqdm import trange - - -def collate_fn_graph(batch): - """Merge a list of graphs to form a batch.""" - line_graphs = None - graphs, lattices, state_attr, labels = map(list, zip(*batch)) - g = pgl.Graph.batch(graphs) - new_labels = {} - for k, v in labels[0].items(): - new_labels[k] = np.array([d[k] for d in labels], dtype="float32") - labels = new_labels - state_attr = np.asarray(state_attr) - lat = lattices[0] if g.num_graph == 1 else np.squeeze(np.asarray(lattices)) - return g.tensor(), lat, state_attr, labels diff --git a/stability_prediction/dataset/preprocess_2d.py b/stability_prediction/dataset/preprocess_2d.py deleted file mode 100644 index 897bcfc2..00000000 --- a/stability_prediction/dataset/preprocess_2d.py +++ /dev/null @@ -1,42 +0,0 @@ -import os -import pickle - -import pandas as pd -import pymatgen -import tqdm -from pymatgen.io.cif import CifParser - -csv_file = "./data/2D_structure/ehull_0621.csv" -cif_path = "./data/2D_structure/cif_structure" - -filter_thresh = 1 - -cif_names = os.listdir(cif_path) -csv_data = pd.read_csv(csv_file) -ehull_dict = {name: value for name, value in zip(csv_data["cif"], csv_data["ehull"])} -energy_dict = {name: value for name, value in zip(csv_data["cif"], csv_data["energy"])} - -structures = [] -ehulls = [] -energys = [] -for cif_name in tqdm.tqdm(cif_names): - if not cif_name.endswith(".cif"): - continue - ehull = ehull_dict[cif_name.replace(".cif", "")] - # if abs(ehull) > 5: - # continue - cif_file = os.path.join(cif_path, cif_name) - parser = CifParser(cif_file) - structure = parser.get_structures()[0] - structures.append(structure) - ehulls.append(ehull) - energys.append(energy_dict[cif_name.replace(".cif", "")]) - -with open("./data/2D_structure/structures_0621.pickle", "wb") as f: - pickle.dump(structures, f) - -with open("./data/2D_structure/ehulls_0621.pickle", "wb") as f: - pickle.dump(ehulls, f) - -with open("./data/2D_structure/energys_0621.pickle", "wb") as f: - pickle.dump(energys, f) diff --git a/stability_prediction/dataset/structure_dataset.py b/stability_prediction/dataset/structure_dataset.py deleted file mode 100644 index f4b25403..00000000 --- a/stability_prediction/dataset/structure_dataset.py +++ /dev/null @@ -1,291 +0,0 @@ -from __future__ import absolute_import -from __future__ import annotations - -import abc -import hashlib -import json -import os -import traceback -from functools import partial -from typing import TYPE_CHECKING -from typing import Callable - -import numpy as np -import paddle -from tqdm import trange - - -class BaseDataset(object): - def __init__( - self, - name, - url=None, - raw_dir=None, - hash_key=(), - force_reload=False, - verbose=False, - transform=None, - ): - self._name = name - self._url = url - self._force_reload = force_reload - self._verbose = verbose - self._hash_key = hash_key - self._hash = self._get_hash() - self._transform = transform - self._raw_dir = raw_dir - self._load() - - @abc.abstractmethod - def process(self): - """Overwrite to realize your own logic of processing the input data.""" - pass - - def has_cache(self): - """Overwrite to realize your own logic of - deciding whether there exists a cached dataset. - - By default False. - """ - return False - - def _load(self): - """Entry point from __init__ to load the dataset. - - If cache exists: - - - Load the dataset from saved pgl graph and information files. - - If loadin process fails, re-download and process the dataset. - - else: - - - Download the dataset if needed. - - Process the dataset and build the pgl graph. - - Save the processed dataset into files. - """ - self.process() - - def _get_hash(self): - """Compute the hash of the input tuple - - Example - ------- - Assume `self._hash_key = (10, False, True)` - - >>> hash_value = self._get_hash() - >>> hash_value - 'a770b222' - """ - hash_func = hashlib.sha1() - hash_func.update(str(self._hash_key).encode("utf-8")) - return hash_func.hexdigest()[:8] - - def _get_hash_url_suffix(self): - """Get the suffix based on the hash value of the url.""" - if self._url is None: - return "" - else: - hash_func = hashlib.sha1() - hash_func.update(str(self._url).encode("utf-8")) - return "_" + hash_func.hexdigest()[:8] - - @property - def url(self): - """Get url to download the raw dataset.""" - return self._url - - @property - def name(self): - """Name of the dataset.""" - return self._name - - @property - def raw_dir(self): - """Raw file directory contains the input data folder.""" - return self._raw_dir - - @property - def raw_path(self): - """Directory contains the input data files. - By default raw_path = os.path.join(self.raw_dir, self.name) - """ - return os.path.join(self.raw_dir, self.name + self._get_hash_url_suffix()) - - @property - def verbose(self): - """Whether to print information.""" - return self._verbose - - @property - def hash(self): - """Hash value for the dataset and the setting.""" - return self._hash - - @abc.abstractmethod - def __getitem__(self, idx): - """Gets the data object at index.""" - pass - - @abc.abstractmethod - def __len__(self): - """The number of examples in the dataset.""" - pass - - def __repr__(self): - return ( - f'Dataset("{self.name}", num_graphs={len(self)},' - + f" save_path={self.save_path})" - ) - - -def compute_pair_vector_and_distance(g): - """Calculate bond vectors and distances using pgl graphs. - - Args: - g: PGL graph - - Returns: - bond_vec (paddle.tensor): bond distance between two atoms - bond_dist (paddle.tensor): vector from src node to dst node - """ - dst_pos = g.node_feat["pos"][g.edges[:, 1]] + g.edge_feat["pbc_offshift"] - src_pos = g.node_feat["pos"][g.edges[:, 0]] - bond_vec = dst_pos - src_pos - bond_dist = np.linalg.norm(bond_vec, axis=1) - return bond_vec, bond_dist - - -class StructureDataset(BaseDataset): - """Create a dataset including pgl graphs.""" - - def __init__( - self, - filename: str = "pgl_graph.bin", - filename_lattice: str = "lattice.pt", - filename_line_graph: str = "pgl_line_graph.bin", - filename_state_attr: str = "state_attr.pt", - filename_labels: str = "labels.json", - converter: (GraphConverter | None) = None, - threebody_cutoff: (float | None) = None, - directed_line_graph: bool = False, - structures: (list | None) = None, - labels: (dict[str, list] | None) = None, - name: str = "StructureDataset", - graph_labels: (list[int | float] | None) = None, - clear_processed: bool = False, - raw_dir: (str | None) = None, - ): - """ - Args: - filename: file name for storing pgl graphs. - filename_lattice: file name for storing lattice matrixs. - filename_line_graph: file name for storing pgl line graphs. - filename_state_attr: file name for storing state attributes. - filename_labels: file name for storing labels. - converter: pgl graph converter. - threebody_cutoff: cutoff for three body. - directed_line_graph (bool): Whether to create a directed line graph (CHGNet), or an - undirected 3body line graph (M3GNet) - Default: False (for M3GNet) - structures: Pymatgen structure. - labels: targets, as a dict of {name: list of values}. - name: name of dataset. - graph_labels: state attributes. - clear_processed: Whether to clear the stored structures after processing into graphs. Structures - are not really needed after the conversion to pgl graphs and can take a significant amount of memory. - Setting this to True will delete the structures from memory. - raw_dir : str specifying the directory that will store the downloaded data or the directory that already - stores the input data. - """ - self.filename = filename - self.filename_lattice = filename_lattice - self.filename_line_graph = filename_line_graph - self.filename_state_attr = filename_state_attr - self.filename_labels = filename_labels - self.converter = converter - self.structures = structures or [] - self.labels = labels or {} - for k, v in self.labels.items(): - self.labels[k] = v.tolist() if isinstance(v, np.ndarray) else v - self.threebody_cutoff = threebody_cutoff - self.directed_line_graph = directed_line_graph - self.graph_labels = graph_labels - self.clear_processed = clear_processed - super().__init__( - name=name, - raw_dir=raw_dir, - verbose=True, - force_reload=True, - ) - - def has_cache(self) -> bool: - """Check if the pgl_graph.bin exists or not.""" - files_to_check = [ - self.filename, - self.filename_lattice, - self.filename_state_attr, - self.filename_labels, - ] - return all( - os.path.exists(os.path.join(self.save_path, f)) for f in files_to_check - ) - - def process(self): - """Convert Pymatgen structure into pgl graphs.""" - num_graphs = len(self.structures) - graphs, lattices, line_graphs, state_attrs = [], [], [], [] - not_use_idxs = [] - for idx in trange(num_graphs): - structure = self.structures[idx] - graph, lattice, state_attr = self.converter.get_graph(structure) - if graph.num_edges == 0: - not_use_idxs.append(idx) - continue - graphs.append(graph) - lattices.append(lattice) - state_attrs.append(state_attr) - graph.node_feat["pos"] = structure.cart_coords.astype("float32") - graph.edge_feat["pbc_offshift"] = np.matmul( - graph.edge_feat["pbc_offset"], lattice[0] - ) - bond_vec, bond_dist = compute_pair_vector_and_distance(graph) - graph.edge_feat["bond_vec"] = bond_vec - graph.edge_feat["bond_dist"] = bond_dist - graph.node_feat.pop("pos") - graph.edge_feat.pop("pbc_offshift") - graph.numpy() - if self.graph_labels is not None: - state_attrs = paddle.to_tensor(data=self.graph_labels).astype(dtype="int64") - else: - state_attrs = np.array(state_attrs, dtype="float32") - if self.clear_processed: - del self.structures - self.structures = [] - self.graphs = graphs - self.lattices = lattices - self.state_attr = state_attrs - for key, value in self.labels.items(): - new_value = [] - for idx in range(len(value)): - if idx in not_use_idxs: - continue - new_value.append(value[idx]) - self.labels[key] = new_value - return self.graphs, self.lattices, self.state_attr - - def __getitem__(self, idx: int): - """Get graph and label with idx.""" - # items = [self.graphs[idx], self.lattices[idx], self.state_attr[idx], - # {k: paddle.to_tensor(data=v[idx], dtype='float32') for k, - # v in self.labels.items()}] - items = [ - self.graphs[idx], - self.lattices[idx], - self.state_attr[idx], - {k: np.array(v[idx], dtype="float32") for k, v in self.labels.items()}, - ] - return tuple(items) - - def __len__(self): - """Get size of dataset.""" - return len(self.graphs) diff --git a/stability_prediction/dataset/utils.py b/stability_prediction/dataset/utils.py deleted file mode 100644 index 92ee84e9..00000000 --- a/stability_prediction/dataset/utils.py +++ /dev/null @@ -1,86 +0,0 @@ -import numpy as np - - -class Subset(object): - """Subset of a dataset at specified indices - - Code adapted from PyTorch. - - Parameters - ---------- - dataset - dataset[i] should return the ith datapoint - indices : list - List of datapoint indices to construct the subset - """ - - def __init__(self, dataset, indices): - self.dataset = dataset - self.indices = indices - - def __getitem__(self, item): - """Get the datapoint indexed by item - - Returns - ------- - tuple - datapoint - """ - return self.dataset[self.indices[item]] - - def __len__(self): - """Get subset size - - Returns - ------- - int - Number of datapoints in the subset - """ - return len(self.indices) - - -def split_dataset(dataset, frac_list=None, shuffle=False, random_state=None): - """Split dataset into training, validation and test set. - - Parameters - ---------- - dataset - We assume ``len(dataset)`` gives the number of datapoints and ``dataset[i]`` - gives the ith datapoint. - frac_list : list or None, optional - A list of length 3 containing the fraction to use for training, - validation and test. If None, we will use [0.8, 0.1, 0.1]. - shuffle : bool, optional - By default we perform a consecutive split of the dataset. If True, - we will first randomly shuffle the dataset. - random_state : None, int or array_like, optional - Random seed used to initialize the pseudo-random number generator. - Can be any integer between 0 and 2**32 - 1 inclusive, an array - (or other sequence) of such integers, or None (the default). - If seed is None, then RandomState will try to read data from /dev/urandom - (or the Windows analogue) if available or seed from the clock otherwise. - - Returns - ------- - list of length 3 - Subsets for training, validation and test. - """ - from itertools import accumulate - - if frac_list is None: - frac_list = [0.8, 0.1, 0.1] - frac_list = np.asarray(frac_list) - assert np.allclose( - np.sum(frac_list), 1.0 - ), "Expect frac_list sum to 1, got {:.4f}".format(np.sum(frac_list)) - num_data = len(dataset) - lengths = (num_data * frac_list).astype(int) - lengths[-1] = num_data - np.sum(lengths[:-1]) - if shuffle: - indices = np.random.RandomState(seed=random_state).permutation(num_data) - else: - indices = np.arange(num_data) - return [ - Subset(dataset, indices[offset - length : offset]) - for offset, length in zip(accumulate(lengths), lengths) - ] diff --git a/stability_prediction/main.py b/stability_prediction/main.py deleted file mode 100644 index 80615630..00000000 --- a/stability_prediction/main.py +++ /dev/null @@ -1,432 +0,0 @@ -from __future__ import annotations - -import argparse -import os -import pickle -import shutil -import warnings -import zipfile -from collections import defaultdict - -import matplotlib.pyplot as plt -import numpy as np -import paddle -import paddle.distributed as dist -import paddle.distributed.fleet as fleet -import pandas as pd -import yaml -from dataset.collate_fn import collate_fn_graph -from dataset.structure_dataset import StructureDataset -from dataset.utils import split_dataset -from models.megnet import MEGNetPlus -from pymatgen.core import Structure -from tqdm import tqdm -from utils._bond import BondExpansion -from utils.default_elements import DEFAULT_ELEMENTS -from utils.ext_pymatgen import Structure2Graph -from utils.ext_pymatgen import get_element_list -from utils.logger import init_logger -from utils.misc import set_random_seed - -# To suppress warnings for clearer output -warnings.simplefilter("ignore") - -if dist.get_world_size() > 1: - fleet.init(is_collective=True) - - -def load_dataset() -> tuple[list[Structure], list[str], list[float]]: - """Raw data loading function. - - Returns: - tuple[list[Structure], list[str], list[float]]: structures, mp_id, Eform_per_atom - """ - # if not os.path.exists("mp.2018.6.1.json"): - # f = RemoteFile("https://figshare.com/ndownloader/files/15087992") - # with zipfile.ZipFile(f.local_path) as zf: - # zf.extractall(".") - data = pd.read_json("data/mp.2018.6.1.json") - structures = [] - mp_ids = [] - - for mid, structure_str in tqdm(zip(data["material_id"], data["structure"])): - struct = Structure.from_str(structure_str, fmt="cif") - structures.append(struct) - mp_ids.append(mid) - if len(mp_ids) >= 100: - break - return structures, mp_ids, data["formation_energy_per_atom"].tolist() - - -def load_dataset_from_pickle( - structures_path, - ehull_path, - energy_path=None, - ehull_clip=None, - energy_clip=None, - **kwargs, -): - with open(structures_path, "rb") as f: - structures = pickle.load(f) - with open(ehull_path, "rb") as f: - ehulls = pickle.load(f) - if energy_path is not None: - with open(energy_path, "rb") as f: - energys = pickle.load(f) - else: - energys = None - - if ehull_clip: - ehulls = np.asarray(ehulls) - ehulls = ehulls.clip(ehull_clip[0], ehull_clip[1]) - ehulls = ehulls.tolist() - if energy_clip and energys is not None: - energys = np.asarray(energys) - energys = energys.clip(energy_clip[0], energy_clip[1]) - energys = energys.tolist() - - return structures, ehulls, energys - - -def get_dataloader(cfg): - # structures, mp_ids, ehulls = load_dataset() - # structures = structures[:100] - # ehulls = ehulls[:100] - - structures, ehulls, energys = load_dataset_from_pickle(**cfg["dataset"]) - # structures = structures[:100] - # ehulls = ehulls[:100] - - # get element types in the dataset - elem_list = get_element_list(structures) - elem_list = DEFAULT_ELEMENTS - # setup a graph converter - converter = Structure2Graph( - element_types=elem_list, cutoff=cfg["dataset"]["cutoff"] - ) - # convert the raw dataset into MEGNetDataset - labels = ( - {"ehull": ehulls, "energy": energys} - if energys is not None - else {"ehull": ehulls} - ) - mp_dataset = StructureDataset( - structures=structures, - labels=labels, - converter=converter, - ) - - train_data, val_data, test_data = split_dataset( - mp_dataset, - frac_list=cfg["dataset"]["split_list"], - shuffle=True, - random_state=42, - ) - - train_loader = paddle.io.DataLoader( - train_data, - batch_sampler=paddle.io.DistributedBatchSampler( - train_data, - batch_size=cfg["batch_size"], - shuffle=True, - ), - collate_fn=collate_fn_graph, - num_workers=0, - ) - val_loader = paddle.io.DataLoader( - val_data, - batch_sampler=paddle.io.DistributedBatchSampler( - val_data, - batch_size=cfg["batch_size"], - ), - collate_fn=collate_fn_graph, - ) - test_loader = paddle.io.DataLoader( - test_data, - batch_sampler=paddle.io.DistributedBatchSampler( - test_data, - batch_size=cfg["batch_size"], - ), - collate_fn=collate_fn_graph, - ) - - return train_loader, val_loader, test_loader, elem_list - - -def get_model(cfg, elem_list): - # define the bond expansion - bond_expansion = BondExpansion( - rbf_type="Gaussian", initial=0.0, final=5.0, num_centers=100, width=0.5 - ) - # setup the architecture of MEGNet model - model_cfg = cfg["model"] - model_cfg.update({"bond_expansion": bond_expansion, "element_types": elem_list}) - model = MEGNetPlus(**model_cfg) - # model.set_dict(paddle.load('data/paddle_weight.pdparams')) - - if dist.get_world_size() > 1: - model = fleet.distributed_model(model) - - return model - - -def get_optimizer(cfg, model): - - lr_scheduler = paddle.optimizer.lr.CosineAnnealingDecay(**cfg["lr_cfg"]) - optimizer = paddle.optimizer.Adam( - parameters=model.parameters(), - learning_rate=lr_scheduler, - epsilon=1e-08, - weight_decay=0.0, - ) - if dist.get_world_size() > 1: - optimizer = fleet.distributed_optimizer(optimizer) - return optimizer, lr_scheduler - - -def train_epoch(model, loader, loss_fn, metric_fn, optimizer, loss_weight, epoch, log): - model.train() - total_loss = defaultdict(list) - total_metric = defaultdict(list) - total_num_data = 0 - - for idx, batch_data in enumerate(loader): - graph, _, state_attr, labels = batch_data - batch_size = state_attr.shape[0] - - preds = model(graph, state_attr) - - keys = labels.keys() - keys = sorted(keys) - train_loss = 0.0 - - msg = "" - for i, key in enumerate(keys): - label = labels[key] - if len(preds.shape) > 1: - pred = preds[:, i] - else: - pred = preds - - # loss = loss_fn(pred, label, reduction='none') - loss = loss_fn(pred, label) - metric = metric_fn(pred, label) - - total_loss[key].append(loss * batch_size) - # total_loss[key].append(loss.sum()) - total_metric[key].append(metric * batch_size) - if key in loss_weight.keys(): - train_loss += loss * loss_weight[key] - else: - # weights = paddle.exp(0.5 * paddle.abs(label - 0.1)) - # weights = paddle.log(paddle.abs(label - 0.1) + 1.3) - # loss = loss * weights - # loss = loss.mean() - train_loss += loss - msg += f" | {key}_loss: {loss.item():.6f} | {key}_mae: {metric.item():.6f}" - - train_loss.backward() - optimizer.step() - optimizer.clear_grad() - - total_num_data += batch_size - - if paddle.distributed.get_rank() == 0 and ( - idx % 10 == 0 or idx == len(loader) - 1 - ): - message = "train: epoch %d | step %d | lr %.6f" % ( - epoch, - idx, - optimizer.get_lr(), - ) - message += msg - log.info(message) - - total_loss = {key: sum(total_loss[key]) / total_num_data for key in keys} - total_metric = {key: sum(total_metric[key]) / total_num_data for key in keys} - return total_loss, total_metric - - -@paddle.no_grad() -def eval_epoch(model, loader, loss_fn, metric_fn, log): - model.eval() - total_loss = defaultdict(list) - total_metric = defaultdict(list) - total_preds = defaultdict(list) - total_labels = defaultdict(list) - - total_num_data = 0 - for idx, batch_data in enumerate(loader): - graph, _, state_attr, labels = batch_data - batch_size = state_attr.shape[0] - - preds = model(graph, state_attr) - - keys = labels.keys() - keys = sorted(keys) - - msg = "" - for i, key in enumerate(keys): - label = labels[key] - if len(preds.shape) > 1: - pred = preds[:, i] - else: - pred = preds - - loss = loss_fn(pred, label) - metric = metric_fn(pred, label) - - total_loss[key].append(loss * batch_size) - total_metric[key].append(metric * batch_size) - - total_preds[key].extend(pred.tolist()) - total_labels[key].extend(label.tolist()) - - total_num_data += batch_size - total_loss = {key: sum(total_loss[key]) / total_num_data for key in keys} - total_metric = {key: sum(total_metric[key]) / total_num_data for key in keys} - return total_loss, total_metric, total_preds, total_labels - - -def train(cfg): - log = init_logger(log_file=os.path.join(cfg["save_path"], "train.log")) - train_loader, val_loader, test_loader, elem_list = get_dataloader(cfg) - - model = get_model(cfg, elem_list) - optimizer, lr_scheduler = get_optimizer(cfg, model) - - loss_fn = paddle.nn.functional.mse_loss - metric_fn = paddle.nn.functional.l1_loss - - loss_weight = cfg.get("loss_weight", {}) - - global_step = 0 - best_metric = float("inf") - - for epoch in range(cfg["epochs"]): - train_loss, train_metric = train_epoch( - model, train_loader, loss_fn, metric_fn, optimizer, loss_weight, epoch, log - ) - lr_scheduler.step() - - if paddle.distributed.get_rank() == 0: - eval_loss, eval_metric, total_preds, total_labels = eval_epoch( - model, val_loader, loss_fn, metric_fn, log - ) - msg = "" - for key in train_loss.keys(): - msg += f", train_{key}_loss: {train_loss[key].item():.6f}" - msg += f", train_{key}_mae: {train_metric[key].item():.6f}" - for key in eval_loss.keys(): - msg += f", eval_{key}_loss: {eval_loss[key].item():.6f}" - msg += f", eval_{key}_mae: {eval_metric[key].item():.6f}" - - log.info(f"epoch: {epoch}" + msg) - - if eval_metric["ehull"] < best_metric: - best_metric = eval_metric["ehull"] - paddle.save( - model.state_dict(), "{}/best.pdparams".format(cfg["save_path"]) - ) - log.info("Saving best checkpoint at {}".format(cfg["save_path"])) - - paddle.save( - model.state_dict(), "{}/latest.pdparams".format(cfg["save_path"]) - ) - if epoch % 500 == 0: - paddle.save( - model.state_dict(), - "{}/epoch_{}.pdparams".format(cfg["save_path"], epoch), - ) - if paddle.distributed.get_rank() == 0: - test_loss, test_metric, total_preds, total_labels = eval_epoch( - model, test_loader, loss_fn, metric_fn, log - ) - msg = "" - for key in test_loss.keys(): - msg += f", test_{key}_loss: {test_loss[key].item():.6f}" - msg += f", test_{key}_mae: {test_metric[key].item():.6f}" - log.info(f"epoch: {epoch}" + msg) - - -def evaluate(cfg): - log = init_logger(log_file=os.path.join(cfg["save_path"], "evaluate.log")) - train_loader, val_loader, test_loader, elem_list = get_dataloader(cfg) - - model = get_model(cfg, elem_list) - optimizer, lr_scheduler = get_optimizer(cfg, model) - - loss_fn = paddle.nn.functional.mse_loss - metric_fn = paddle.nn.functional.l1_loss - - test_loss, test_metric, total_preds, total_labels = eval_epoch( - model, val_loader, loss_fn, metric_fn, log - ) - msg = "" - for key in test_loss.keys(): - msg += f", eval_{key}_loss: {test_loss[key].item():.6f}" - msg += f", eval_{key}_mae: {test_metric[key].item():.6f}" - log.info(f"epoch: 0" + msg) - - -def test(cfg): - log = init_logger(log_file=os.path.join(cfg["save_path"], "test.log")) - train_loader, val_loader, test_loader, elem_list = get_dataloader(cfg) - - model = get_model(cfg, elem_list) - optimizer, lr_scheduler = get_optimizer(cfg, model) - - loss_fn = paddle.nn.functional.mse_loss - metric_fn = paddle.nn.functional.l1_loss - - test_loss, test_metric, total_preds, total_labels = eval_epoch( - model, test_loader, loss_fn, metric_fn, log - ) - msg = "" - for key in test_loss.keys(): - msg += f", test_{key}_loss: {test_loss[key].item():.6f}" - msg += f", test_{key}_mae: {test_metric[key].item():.6f}" - log.info("epoch: 0" + msg) - - data = {} - for key in total_preds.keys(): - data[f"pred_{key}"] = total_preds[key] - data[f"label_{key}"] = total_labels[key] - df = pd.DataFrame(data) - df.to_csv(os.path.join(cfg["save_path"], "predictions.csv"), index=False) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "-c", - "--config", - type=str, - default="./configs/megnet_2d.yaml", - help="Path to config file", - ) - parser.add_argument( - "--mode", type=str, default="train", choices=["train", "eval", "test"] - ) - args = parser.parse_args() - - with open(args.config, "r") as f: - cfg = yaml.safe_load(f) - - if paddle.distributed.get_rank() == 0: - os.makedirs(cfg["save_path"], exist_ok=True) - try: - shutil.copy(args.config, cfg["save_path"]) - except shutil.SameFileError: - pass - - set_random_seed(cfg.get("seed", 42)) - - if args.mode == "train": - train(cfg) - elif args.mode == "eval": - evaluate(cfg) - elif args.mode == "test": - test(cfg) - else: - raise ValueError("Unknown mode: {}".format(args.mode)) diff --git a/stability_prediction/models/layers.py b/stability_prediction/models/layers.py deleted file mode 100644 index 7ec110ee..00000000 --- a/stability_prediction/models/layers.py +++ /dev/null @@ -1,508 +0,0 @@ -from __future__ import annotations - -import math -import sys -from collections.abc import Sequence -from enum import Enum -from typing import TYPE_CHECKING -from typing import Any -from typing import Callable -from typing import Literal - -import paddle -import paddle.nn as nn -from pgl.math import segment_pool -from pgl.math import segment_softmax -from pgl.math import segment_sum - - -class MLP(paddle.nn.Layer): - """An implementation of a multi-layer perceptron.""" - - def __init__( - self, - dims: Sequence[int], - activation: (Callable[[paddle.Tensor], paddle.Tensor] | None) = None, - activate_last: bool = False, - bias_last: bool = True, - ) -> None: - """:param dims: Dimensions of each layer of MLP. - :param activation: Activation function. - :param activate_last: Whether to apply activation to last layer. - :param bias_last: Whether to apply bias to last layer. - """ - super().__init__() - self._depth = len(dims) - 1 - self.layers = paddle.nn.LayerList() - bias_attr = paddle.ParamAttr(initializer=paddle.nn.initializer.XavierNormal()) - for i, (in_dim, out_dim) in enumerate(zip(dims[:-1], dims[1:])): - if i < self._depth - 1: - self.layers.append( - paddle.nn.Linear( - in_features=in_dim, out_features=out_dim, bias_attr=bias_attr - ) - ) - if activation is not None: - self.layers.append(activation) - else: - if bias_last: - bias_last = bias_attr - self.layers.append( - paddle.nn.Linear( - in_features=in_dim, out_features=out_dim, bias_attr=bias_last - ) - ) - if activation is not None and activate_last: - self.layers.append(activation) - - @property - def last_linear(self) -> (Linear | None): - """:return: The last linear layer.""" - for layer in reversed(self.layers): - if isinstance(layer, paddle.nn.Linear): - return layer - raise RuntimeError - - @property - def depth(self) -> int: - """Returns depth of MLP.""" - return self._depth - - @property - def in_features(self) -> int: - """Return input features of MLP.""" - return self.layers[0].in_features - - @property - def out_features(self) -> int: - """Returns output features of MLP.""" - for layer in reversed(self.layers): - if isinstance(layer, paddle.nn.Linear): - return layer.out_features - raise RuntimeError - - def forward(self, inputs): - """Applies all layers in turn. - - :param inputs: Input tensor - :return: Output tensor - """ - x = inputs - for layer in self.layers: - x = layer(x) - return x - - -class SoftPlus2(paddle.nn.Layer): - """SoftPlus2 activation function: - out = log(exp(x)+1) - log(2) - softplus function that is 0 at x=0, the implementation aims at avoiding overflow. - """ - - def __init__(self) -> None: - """Initializes the SoftPlus2 class.""" - super().__init__() - self.ssp = paddle.nn.Softplus() - - def forward(self, x: paddle.Tensor) -> paddle.Tensor: - """Evaluate activation function given the input tensor x. - - Args: - x (paddle.tensor): Input tensor - - Returns: - out (paddle.tensor): Output tensor - """ - return self.ssp(x) - math.log(2.0) - - -class ActivationFunction(Enum): - """Enumeration of optional activation functions.""" - - softplus2 = SoftPlus2 - - -class EmbeddingBlock(paddle.nn.Layer): - """Embedding block for generating node, bond and state features.""" - - def __init__( - self, - degree_rbf: int, - activation: paddle.nn.Layer, - dim_node_embedding: int, - dim_edge_embedding: (int | None) = None, - dim_state_feats: (int | None) = None, - ntypes_node: (int | None) = None, - include_state: bool = False, - ntypes_state: (int | None) = None, - dim_state_embedding: (int | None) = None, - ): - """ - Args: - degree_rbf (int): number of rbf - activation (nn.Module): activation type - dim_node_embedding (int): dimensionality of node features - dim_edge_embedding (int): dimensionality of edge features - dim_state_feats: dimensionality of state features - ntypes_node: number of node labels - include_state: Whether to include state embedding - ntypes_state: number of state labels - dim_state_embedding: dimensionality of state embedding. - """ - super().__init__() - self.include_state = include_state - self.ntypes_state = ntypes_state - self.dim_node_embedding = dim_node_embedding - self.dim_edge_embedding = dim_edge_embedding - self.dim_state_feats = dim_state_feats - self.ntypes_node = ntypes_node - self.dim_state_embedding = dim_state_embedding - self.activation = activation - - self.layer_node_embedding = paddle.nn.Embedding( - num_embeddings=ntypes_node, embedding_dim=dim_node_embedding - ) - - if dim_edge_embedding is not None: - dim_edges = [degree_rbf, dim_edge_embedding] - self.layer_edge_embedding = MLP( - dim_edges, activation=activation, activate_last=True - ) - - def forward(self, node_attr, edge_attr, state_attr): - """Output embedded features. - - Args: - node_attr: node attribute - edge_attr: edge attribute - state_attr: state attribute - - Returns: - node_feat: embedded node features - edge_feat: embedded edge features - state_feat: embedded state features - """ - if self.ntypes_node is not None: - node_feat = self.layer_node_embedding(node_attr) - else: - node_feat = self.layer_node_embedding(node_attr.to("float32")) - if self.dim_edge_embedding is not None: - edge_feat = self.layer_edge_embedding(edge_attr.to("float32")) - else: - edge_feat = edge_attr - if self.include_state is True: - state_feat = state_attr - else: - state_feat = None - return node_feat, edge_feat, state_feat - - -class MEGNetGraphConv(paddle.nn.Layer): - """A MEGNet graph convolution layer in DGL.""" - - def __init__( - self, - edge_func: paddle.nn.Layer, - node_func: paddle.nn.Layer, - state_func: paddle.nn.Layer, - ) -> None: - """ - Args: - edge_func: Edge update function. - node_func: Node update function. - state_func: Global state update function. - """ - super().__init__() - self.edge_func = edge_func - self.node_func = node_func - self.state_func = state_func - - @staticmethod - def from_dims( - edge_dims: list[int], - node_dims: list[int], - state_dims: list[int], - activation: paddle.nn.Layer, - ) -> MEGNetGraphConv: - """Create a MEGNet graph convolution layer from dimensions. - - Args: - edge_dims (list[int]): Edge dimensions. - node_dims (list[int]): Node dimensions. - state_dims (list[int]): State dimensions. - activation (Module): Activation function. - - Returns: - MEGNetGraphConv: MEGNet graph convolution layer. - """ - edge_update = MLP(edge_dims, activation, activate_last=True) - node_update = MLP(node_dims, activation, activate_last=True) - attr_update = MLP(state_dims, activation, activate_last=True) - return MEGNetGraphConv(edge_update, node_update, attr_update) - - def edge_update(self, graph, node_feat, edge_feat, u): - vi = node_feat[graph.edges[:, 0]] - vj = node_feat[graph.edges[:, 1]] - u = u[graph.edges[:, 0]] - edge_feat = paddle.concat([vi, vj, edge_feat, u], axis=1) - edge_feat = self.edge_func(edge_feat) - return edge_feat - - def node_update(self, graph, node_feat, edge_feat, u): - src, dst, eid = graph.sorted_edges(sort_by="dst") - node_feat_e = paddle.geometric.segment_mean(edge_feat[eid], dst) - node_feat = paddle.concat([node_feat, node_feat_e, u], axis=1) - node_feat = self.node_func(node_feat) - return node_feat - - def state_update(self, graph, node_feat, edge_feat, state_feat): - u_edge_feat = paddle.geometric.segment_mean(edge_feat, graph.graph_edge_id) - u_node_feat = paddle.geometric.segment_mean(node_feat, graph.graph_node_id) - state = paddle.concat([state_feat, u_edge_feat, u_node_feat], axis=1) - state_feat = self.state_func(state) - return state_feat - - def forward( - self, - graph: pgl.Graph, - edge_feat: paddle.Tensor, - node_feat: paddle.Tensor, - state_feat: paddle.Tensor, - ) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: - """Perform sequence of edge->node->attribute updates. - - Args: - graph: Input g - edge_feat: Edge features - node_feat: Node features - state_feat: Graph attributes (global state) - - Returns: - (edge features, node features, graph attributes) - """ - batch_num_nodes = graph._graph_node_index - batch_num_nodes = batch_num_nodes[1:] - batch_num_nodes[:-1] - u = paddle.repeat_interleave(state_feat, batch_num_nodes, axis=0) - - edge_feat = self.edge_update(graph, node_feat, edge_feat, u) - node_feat = self.node_update(graph, node_feat, edge_feat, u) - state_feat = self.state_update(graph, node_feat, edge_feat, state_feat) - return edge_feat, node_feat, state_feat - - -class MEGNetBlock(paddle.nn.Layer): - """A MEGNet block comprising a sequence of update operations.""" - - def __init__( - self, - dims: list[int], - conv_hiddens: list[int], - act: paddle.nn.Layer, - dropout: (float | None) = None, - skip: bool = True, - ) -> None: - """ - Init the MEGNet block with key parameters. - - Args: - dims: Dimension of dense layers before graph convolution. - conv_hiddens: Architecture of hidden layers of graph convolution. - act: Activation type. - dropout: Randomly zeroes some elements in the input tensor with given probability (0 < x < 1) according - to a Bernoulli distribution. - skip: Residual block. - """ - super().__init__() - self.has_dense = len(dims) > 1 - self.activation = act - conv_dim = dims[-1] - out_dim = conv_hiddens[-1] - mlp_kwargs = { - "dims": dims, - "activation": self.activation, - "activate_last": True, - "bias_last": True, - } - self.edge_func = MLP(**mlp_kwargs) if self.has_dense else paddle.nn.Identity() - self.node_func = MLP(**mlp_kwargs) if self.has_dense else paddle.nn.Identity() - self.state_func = MLP(**mlp_kwargs) if self.has_dense else paddle.nn.Identity() - edge_in = 2 * conv_dim + conv_dim + conv_dim - node_in = out_dim + conv_dim + conv_dim - attr_in = out_dim + out_dim + conv_dim - self.conv = MEGNetGraphConv.from_dims( - edge_dims=[edge_in, *conv_hiddens], - node_dims=[node_in, *conv_hiddens], - state_dims=[attr_in, *conv_hiddens], - activation=self.activation, - ) - self.dropout = paddle.nn.Dropout(p=dropout) if dropout else None - self.skip = skip - - def forward( - self, - graph: pgl.Graph, - edge_feat: paddle.Tensor, - node_feat: paddle.Tensor, - state_feat: paddle.Tensor, - ) -> tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor]: - """MEGNetBlock forward pass. - - Args: - graph (pgl.Graph): A Graph. - edge_feat (Tensor): Edge features. - node_feat (Tensor): Node features. - state_feat (Tensor): Graph attributes (global state). - - Returns: - tuple[Tensor, Tensor, Tensor]: Updated (edge features, - node features, graph attributes) - """ - inputs = edge_feat, node_feat, state_feat - edge_feat = self.edge_func(edge_feat) - node_feat = self.node_func(node_feat) - state_feat = self.state_func(state_feat) - edge_feat, node_feat, state_feat = self.conv( - graph, edge_feat, node_feat, state_feat - ) - if self.dropout: - edge_feat = self.dropout(edge_feat) - node_feat = self.dropout(node_feat) - state_feat = self.dropout(state_feat) - if self.skip: - edge_feat = edge_feat + inputs[0] - node_feat = node_feat + inputs[1] - state_feat = state_feat + inputs[2] - return edge_feat, node_feat, state_feat - - -class Set2Set(nn.Layer): - """Implementation of Graph Global Pooling "Set2Set". - - Reference Paper: ORDER MATTERS: SEQUENCE TO SEQUENCE - - Args: - input_dim (int): dimentional size of input - n_iters: number of iteration - n_layers: number of LSTM layers - Return: - output_feat: output feature of set2set pooling with shape [batch, 2*dim]. - """ - - def __init__(self, input_dim, n_iters, n_layers=1): - super(Set2Set, self).__init__() - self.input_dim = input_dim - self.output_dim = 2 * input_dim - self.n_iters = n_iters - self.n_layers = n_layers - self.lstm = paddle.nn.LSTM( - input_size=self.output_dim, - hidden_size=self.input_dim, - num_layers=n_layers, - time_major=True, - ) - - def forward(self, graph, x): - """Forward function of Graph Global Pooling "Set2Set". - - Args: - graph: the graph object from (:code:`Graph`) - x: A tensor with shape (num_nodes, feature_size). - Return: - output_feat: A tensor with shape (num_nodes, output_size). - """ - graph_id = graph.graph_node_id - batch_size = graph_id.max() + 1 - h = ( - paddle.zeros((self.n_layers, batch_size, self.input_dim)), - paddle.zeros((self.n_layers, batch_size, self.input_dim)), - ) - q_star = paddle.zeros((batch_size, self.output_dim)) - for _ in range(self.n_iters): - q, h = self.lstm(q_star.unsqueeze(0), h) - q = q.reshape((batch_size, self.input_dim)) - e = (x * q.index_select(graph_id, axis=0)).sum(axis=-1, keepdim=True) - a = segment_softmax(e, graph_id) - r = segment_sum(a * x, graph_id) - q_star = paddle.concat([q, r], axis=-1) - - return q_star - - -class EdgeSet2Set(paddle.nn.Layer): - """Implementation of Set2Set.""" - - def __init__(self, input_dim: int, n_iters: int, n_layers: int) -> None: - """:param input_dim: The size of each input sample. - :param n_iters: The number of iterations. - :param n_layers: The number of recurrent layers. - """ - super().__init__() - self.input_dim = input_dim - self.output_dim = 2 * input_dim - self.n_iters = n_iters - self.n_layers = n_layers - self.lstm = paddle.nn.LSTM( - input_size=self.output_dim, - hidden_size=self.input_dim, - num_layers=n_layers, - time_major=True, - direction="forward", - ) - - # self.reset_parameters() - - # def reset_parameters(self): - # """Reinitialize learnable parameters.""" - # self.lstm.reset_parameters() - - def forward(self, g: Graph, feat: paddle.Tensor): - """Defines the computation performed at every call. - - :param g: Input graph - :param feat: Input features. - :return: One hot vector - """ - with g.local_scope(): - batch_size = g.batch_size - h = paddle.zeros( - shape=(self.n_layers, batch_size, self.input_dim), dtype=feat.dtype - ), paddle.zeros( - shape=(self.n_layers, batch_size, self.input_dim), dtype=feat.dtype - ) - q_star = paddle.zeros(shape=[batch_size, self.output_dim], dtype=feat.dtype) - for _ in range(self.n_iters): - q, h = self.lstm(q_star.unsqueeze(axis=0), h) - q = q.view(batch_size, self.input_dim) - e = (feat * broadcast_edges(g, q)).sum(dim=-1, keepdim=True) - g.edata["e"] = e - alpha = softmax_edges(g, "e") - g.edata["r"] = feat * alpha - readout = sum_edges(g, "r") - q_star = paddle.concat(x=[q, readout], axis=-1) - return q_star - - def forward(self, graph, x): - """Forward function of Graph Global Pooling "Set2Set". - - Args: - graph: the graph object from (:code:`Graph`) - x: A tensor with shape (num_nodes, feature_size). - Return: - output_feat: A tensor with shape (num_nodes, output_size). - """ - graph_id = graph.graph_edge_id - batch_size = graph_id.max() + 1 - h = ( - paddle.zeros((self.n_layers, batch_size, self.input_dim)), - paddle.zeros((self.n_layers, batch_size, self.input_dim)), - ) - q_star = paddle.zeros((batch_size, self.output_dim)) - for _ in range(self.n_iters): - q, h = self.lstm(q_star.unsqueeze(0), h) - q = q.reshape((batch_size, self.input_dim)) - e = (x * q.index_select(graph_id, axis=0)).sum(axis=-1, keepdim=True) - a = segment_softmax(e, graph_id) - r = segment_sum(a * x, graph_id) - q_star = paddle.concat([q, r], axis=-1) - - return q_star diff --git a/stability_prediction/models/megnet.py b/stability_prediction/models/megnet.py deleted file mode 100644 index 213e042b..00000000 --- a/stability_prediction/models/megnet.py +++ /dev/null @@ -1,172 +0,0 @@ -from __future__ import annotations - -import logging -from typing import TYPE_CHECKING - -import paddle -import paddle.nn as nn -from models import initializer -from models.layers import MLP -from models.layers import ActivationFunction -from models.layers import EdgeSet2Set -from models.layers import EmbeddingBlock -from models.layers import MEGNetBlock -from models.layers import Set2Set -from utils.default_elements import DEFAULT_ELEMENTS - - -class MEGNetPlus(paddle.nn.Layer): - def __init__( - self, - dim_node_embedding: int = 16, - dim_edge_embedding: int = 100, - dim_state_embedding: int = 2, - ntypes_state: (int | None) = None, - nblocks: int = 3, - hidden_layer_sizes_input: tuple[int, ...] = (64, 32), - hidden_layer_sizes_conv: tuple[int, ...] = (64, 64, 32), - hidden_layer_sizes_output: tuple[int, ...] = (32, 16), - nlayers_set2set: int = 1, - niters_set2set: int = 2, - activation_type: str = "softplus2", - is_classification: bool = False, - include_state: bool = True, - dropout: float = 0.0, - element_types: tuple[str, ...] = DEFAULT_ELEMENTS, - bond_expansion: (BondExpansion | None) = None, - cutoff: float = 4.0, - gauss_width: float = 0.5, - pretrained=None, - num_predictions: int = 1, - **kwargs, - ): - """Useful defaults for all arguments have been specified based on MEGNet formation energy model. - - Args: - dim_node_embedding: Dimension of node embedding. - dim_edge_embedding: Dimension of edge embedding. - dim_state_embedding: Dimension of state embedding. - ntypes_state: Number of state types. - nblocks: Number of blocks. - hidden_layer_sizes_input: Architecture of dense layers before the graph convolution - hidden_layer_sizes_conv: Architecture of dense layers for message and update functions - nlayers_set2set: Number of layers in Set2Set layer - niters_set2set: Number of iterations in Set2Set layer - hidden_layer_sizes_output: Architecture of dense layers for concatenated features after graph convolution - activation_type: Activation used for non-linearity - is_classification: Whether this is classification task or not - layer_node_embedding: Architecture of embedding layer for node attributes - layer_edge_embedding: Architecture of embedding layer for edge attributes - layer_state_embedding: Architecture of embedding layer for state attributes - include_state: Whether the state embedding is included - dropout: Randomly zeroes some elements in the input tensor with given probability (0 < x < 1) according to - a Bernoulli distribution. Defaults to 0, i.e., no dropout. - element_types: Elements included in the training set - bond_expansion: Gaussian expansion for edge attributes - cutoff: cutoff for forming bonds - gauss_width: width of Gaussian function for bond expansion - **kwargs: For future flexibility. Not used at the moment. - """ - super().__init__() - # self.save_args(locals(), kwargs) - self.element_types = element_types or DEFAULT_ELEMENTS - self.cutoff = cutoff - self.bond_expansion = bond_expansion - self.pretrained = pretrained - node_dims = [dim_node_embedding, *hidden_layer_sizes_input] - edge_dims = [dim_edge_embedding, *hidden_layer_sizes_input] - state_dims = [dim_state_embedding, *hidden_layer_sizes_input] - try: - activation: paddle.nn.Layer = ActivationFunction[activation_type].value() - except KeyError: - raise ValueError( - f"Invalid activation type, please try using one of {[af.name for af in ActivationFunction]}" - ) from None - self.embedding = EmbeddingBlock( - degree_rbf=dim_edge_embedding, - dim_node_embedding=dim_node_embedding, - ntypes_node=len(self.element_types), - ntypes_state=ntypes_state, - include_state=include_state, - dim_state_embedding=dim_state_embedding, - activation=activation, - ) - self.edge_encoder = MLP(edge_dims, activation, activate_last=True) - self.node_encoder = MLP(node_dims, activation, activate_last=True) - self.state_encoder = MLP(state_dims, activation, activate_last=True) - dim_blocks_in = hidden_layer_sizes_input[-1] - dim_blocks_out = hidden_layer_sizes_conv[-1] - block_args = { - "conv_hiddens": hidden_layer_sizes_conv, - "dropout": dropout, - "act": activation, - "skip": True, - } - blocks = [MEGNetBlock(dims=[dim_blocks_in], **block_args)] + [ - MEGNetBlock(dims=[dim_blocks_out, *hidden_layer_sizes_input], **block_args) - for _ in range(nblocks - 1) - ] - self.blocks = paddle.nn.LayerList(sublayers=blocks) - s2s_kwargs = {"n_iters": niters_set2set, "n_layers": nlayers_set2set} - self.edge_s2s = EdgeSet2Set(dim_blocks_out, **s2s_kwargs) - self.node_s2s = Set2Set(dim_blocks_out, **s2s_kwargs) - self.output_proj = MLP( - dims=[ - 2 * 2 * dim_blocks_out + dim_blocks_out, - *hidden_layer_sizes_output, - num_predictions, - ], - activation=activation, - activate_last=False, - ) - self.dropout = paddle.nn.Dropout(p=dropout) if dropout else None - self.is_classification = is_classification - self.include_state_embedding = include_state - - if self.pretrained: - self.set_dict(paddle.load(self.pretrained)) - else: - self.apply(self._init_weights) - - def _init_weights(self, m): - if isinstance(m, nn.Linear): - initializer.linear_init_(m) - elif isinstance(m, nn.Embedding): - initializer.normal_(m.weight) - elif isinstance(m, nn.LSTM): - initializer.lstm_init_(m) - - def forward( - self, g: pgl.Graph, state_attr: (paddle.Tensor | None) = None, **kwargs - ): - """Forward pass of MEGnet. Executes all blocks. - - Args: - g (pgl.Graph): PGL graphs - state_attr (paddle.Tensor): State attributes - **kwargs: For future flexibility. Not used at the moment. - - Returns: - Prediction - """ - node_attr = g.node_feat["node_type"] - edge_attr = self.bond_expansion(g.edge_feat["bond_dist"]) - node_feat, edge_feat, state_feat = self.embedding( - node_attr, edge_attr, state_attr - ) - edge_feat = self.edge_encoder(edge_feat) - node_feat = self.node_encoder(node_feat) - state_feat = self.state_encoder(state_feat) - for block in self.blocks: - output = block(g, edge_feat, node_feat, state_feat) - edge_feat, node_feat, state_feat = output - node_vec = self.node_s2s(g, node_feat) - edge_vec = self.edge_s2s(g, edge_feat) - - vec = paddle.concat([node_vec, edge_vec, state_feat], axis=1) - if self.dropout: - vec = self.dropout(vec) - output = self.output_proj(vec) - if self.is_classification: - output = paddle.nn.functional.sigmoid(x=output) - return paddle.squeeze(x=output) diff --git a/stability_prediction/train.sh b/stability_prediction/train.sh deleted file mode 100644 index ff5b1f07..00000000 --- a/stability_prediction/train.sh +++ /dev/null @@ -1,3 +0,0 @@ - - -python -m paddle.distributed.launch --gpus="2,3,4,5" main.py diff --git a/stability_prediction/utils/_bond.py b/stability_prediction/utils/_bond.py deleted file mode 100644 index c7fdb8d5..00000000 --- a/stability_prediction/utils/_bond.py +++ /dev/null @@ -1,129 +0,0 @@ -from __future__ import annotations - -from functools import lru_cache -from math import pi -from math import sqrt -from typing import Literal - -import paddle -import sympy - - -class GaussianExpansion(paddle.nn.Layer): - """Gaussian Radial Expansion. - - The bond distance is expanded to a vector of shape [m], where m is the number of Gaussian basis centers. - """ - - def __init__( - self, - initial: float = 0.0, - final: float = 4.0, - num_centers: int = 20, - width: (None | float) = 0.5, - ): - """ - Args: - initial: Location of initial Gaussian basis center. - final: Location of final Gaussian basis center - num_centers: Number of Gaussian Basis functions - width: Width of Gaussian Basis functions. - """ - super().__init__() - out_0 = paddle.create_parameter( - shape=paddle.linspace(start=initial, stop=final, num=num_centers).shape, - dtype=paddle.linspace(start=initial, stop=final, num=num_centers) - .numpy() - .dtype, - default_initializer=paddle.nn.initializer.Assign( - paddle.linspace(start=initial, stop=final, num=num_centers) - ), - ) - out_0.stop_gradient = not False - self.centers = out_0 - if width is None: - self.width = 1.0 / paddle.diff(x=self.centers).mean() - else: - self.width = width - - def reset_parameters(self): - """Reinitialize model parameters.""" - out_1 = paddle.create_parameter( - shape=self.centers.shape, - dtype=self.centers.numpy().dtype, - default_initializer=paddle.nn.initializer.Assign(self.centers), - ) - out_1.stop_gradient = not False - self.centers = out_1 - - def forward(self, bond_dists): - """Expand distances. - - Args: - bond_dists : - Bond (edge) distances between two atoms (nodes) - - Returns: - A vector of expanded distance with shape [num_centers] - """ - diff = bond_dists[:, None] - self.centers[None, :] - return paddle.exp(x=-self.width * diff**2) - - -class BondExpansion(paddle.nn.Layer): - """Expand pair distances into a set of spherical bessel or gaussian functions.""" - - def __init__( - self, - max_l: int = 3, - max_n: int = 3, - cutoff: float = 5.0, - rbf_type: Literal["SphericalBessel", "Gaussian"] = "SphericalBessel", - smooth: bool = False, - initial: float = 0.0, - final: float = 5.0, - num_centers: int = 100, - width: float = 0.5, - ) -> None: - """ - Args: - max_l (int): order of angular part - max_n (int): order of radial part - cutoff (float): cutoff radius - rbf_type (str): type of radial basis function .i.e. either "SphericalBessel" or 'Gaussian' - smooth (bool): whether apply the smooth version of spherical bessel functions or not - initial (float): initial point for gaussian expansion - final (float): final point for gaussian expansion - num_centers (int): Number of centers for gaussian expansion. - width (float): width of gaussian function. - """ - super().__init__() - self.max_n = max_n - self.cutoff = cutoff - self.max_l = max_l - self.smooth = smooth - self.num_centers = num_centers - self.width = width - self.initial = initial - self.final = final - self.rbf_type = rbf_type - if rbf_type.lower() == "sphericalbessel": - self.rbf = SphericalBesselFunction(max_l, max_n, cutoff, smooth) - elif rbf_type.lower() == "gaussian": - self.rbf = GaussianExpansion(initial, final, num_centers, width) - else: - raise ValueError( - "Undefined rbf_type, please use SphericalBessel or Gaussian instead." - ) - - def forward(self, bond_dist: paddle.Tensor): - """Forward. - - Args: - bond_dist: Bond distance - - Return: - bond_basis: Radial basis functions - """ - bond_basis = self.rbf(bond_dist) - return bond_basis diff --git a/stability_prediction/utils/default_elements.py b/stability_prediction/utils/default_elements.py deleted file mode 100644 index 153e717a..00000000 --- a/stability_prediction/utils/default_elements.py +++ /dev/null @@ -1,92 +0,0 @@ -# Default set of elements supported by universal matgl models. -DEFAULT_ELEMENTS = ( - "H", - "He", - "Li", - "Be", - "B", - "C", - "N", - "O", - "F", - "Ne", - "Na", - "Mg", - "Al", - "Si", - "P", - "S", - "Cl", - "Ar", - "K", - "Ca", - "Sc", - "Ti", - "V", - "Cr", - "Mn", - "Fe", - "Co", - "Ni", - "Cu", - "Zn", - "Ga", - "Ge", - "As", - "Se", - "Br", - "Kr", - "Rb", - "Sr", - "Y", - "Zr", - "Nb", - "Mo", - "Tc", - "Ru", - "Rh", - "Pd", - "Ag", - "Cd", - "In", - "Sn", - "Sb", - "Te", - "I", - "Xe", - "Cs", - "Ba", - "La", - "Ce", - "Pr", - "Nd", - "Pm", - "Sm", - "Eu", - "Gd", - "Tb", - "Dy", - "Ho", - "Er", - "Tm", - "Yb", - "Lu", - "Hf", - "Ta", - "W", - "Re", - "Os", - "Ir", - "Pt", - "Au", - "Hg", - "Tl", - "Pb", - "Bi", - "Ac", - "Th", - "Pa", - "U", - "Np", - "Pu", -) diff --git a/stability_prediction/utils/ext_pymatgen.py b/stability_prediction/utils/ext_pymatgen.py deleted file mode 100644 index 67de5b59..00000000 --- a/stability_prediction/utils/ext_pymatgen.py +++ /dev/null @@ -1,186 +0,0 @@ -from __future__ import annotations - -import abc -from typing import TYPE_CHECKING - -import numpy as np -import paddle -import pgl -import scipy.sparse as sp -from pymatgen.core import Element -from pymatgen.core import Molecule -from pymatgen.core import Structure -from pymatgen.optimization.neighbors import find_points_in_spheres - - -def get_element_list(train_structures: list[Structure | Molecule]) -> tuple[str, ...]: - """Get the tuple of elements in the training set for atomic features. - - Args: - train_structures: pymatgen Molecule/Structure object - - Returns: - Tuple of elements covered in training set - """ - elements: set[str] = set() - for s in train_structures: - elements.update(s.composition.get_el_amt_dict().keys()) - return tuple(sorted(elements, key=lambda el: Element(el).Z)) - - -class GraphConverter(metaclass=abc.ABCMeta): - """Abstract base class for converters from input crystals/molecules to graphs.""" - - @abc.abstractmethod - def get_graph(self, structure) -> tuple[pgl.Graph, paddle.Tensor, list]: - """Args: - structure: Input crystals or molecule. - - Returns: - DGLGraph object, state_attr - """ - - def get_graph_from_processed_structure_tensor( - self, - structure, - src_id, - dst_id, - images, - lattice_matrix, - element_types, - frac_coords, - is_atoms: bool = False, - ) -> tuple[pgl.Graph, paddle.Tensor, list]: - """Construct a pgl graph from processed structure and bond information. - - Args: - structure: Input crystals or molecule of pymatgen structure or molecule types. - src_id: site indices for starting point of bonds. - dst_id: site indices for destination point of bonds. - images: the periodic image offsets for the bonds. - lattice_matrix: lattice information of the structure. - element_types: Element symbols of all atoms in the structure. - frac_coords: Fractional coordinates of all atoms in the structure. Note: Cartesian coordinates for molecule - is_atoms: whether the input structure object is ASE atoms object or not. - - Returns: - DGLGraph object, state_attr - - """ - u, v = paddle.to_tensor(data=src_id), paddle.to_tensor(data=dst_id) - g = pgl.Graph((u, v), num_nodes=len(structure)) - pbc_offset = paddle.to_tensor(data=images, dtype="float32") - g.edge_feat["pbc_offset"] = pbc_offset - lattice = paddle.to_tensor(data=np.array(lattice_matrix), dtype="float32") - element_to_index = {elem: idx for idx, elem in enumerate(element_types)} - node_type = ( - np.array([element_types.index(site.specie.symbol) for site in structure]) - if is_atoms is False - else np.array( - [element_to_index[elem] for elem in structure.get_chemical_symbols()] - ) - ) - g.node_feat["node_type"] = paddle.to_tensor(data=node_type, dtype="int32") - g.node_feat["frac_coords"] = paddle.to_tensor(data=frac_coords, dtype="float32") - state_attr = np.array([0.0, 0.0]).astype("float32") - return g, lattice, state_attr - - def get_graph_from_processed_structure( - self, - structure, - src_id, - dst_id, - images, - lattice_matrix, - element_types, - frac_coords, - is_atoms: bool = False, - ) -> tuple[pgl.Graph, paddle.Tensor, list]: - """Construct a pgl graph from processed structure and bond information. - - Args: - structure: Input crystals or molecule of pymatgen structure or molecule types. - src_id: site indices for starting point of bonds. - dst_id: site indices for destination point of bonds. - images: the periodic image offsets for the bonds. - lattice_matrix: lattice information of the structure. - element_types: Element symbols of all atoms in the structure. - frac_coords: Fractional coordinates of all atoms in the structure. Note: Cartesian coordinates for molecule - is_atoms: whether the input structure object is ASE atoms object or not. - - Returns: - DGLGraph object, state_attr - - """ - # u, v = src_id, dst_id - edges = [(u, v) for u, v in zip(src_id, dst_id)] - g = pgl.Graph(edges, num_nodes=len(structure)) - pbc_offset = np.array(images, dtype="float32") - g.edge_feat["pbc_offset"] = pbc_offset - lattice = np.array(lattice_matrix, dtype="float32") - element_to_index = {elem: idx for idx, elem in enumerate(element_types)} - node_type = ( - np.array([element_types.index(site.specie.symbol) for site in structure]) - if is_atoms is False - else np.array( - [element_to_index[elem] for elem in structure.get_chemical_symbols()] - ) - ) - g.node_feat["node_type"] = np.array(node_type, dtype="int32") - g.node_feat["frac_coords"] = np.array(frac_coords, dtype="float32") - state_attr = np.array([0.0, 0.0]).astype("float32") - return g, lattice, state_attr - - -class Structure2Graph(GraphConverter): - """Construct a DGL graph from Pymatgen Structure.""" - - def __init__(self, element_types: tuple[str, ...], cutoff: float = 5.0): - """Parameters - ---------- - element_types: List of elements present in dataset for graph conversion. This ensures all graphs are - constructed with the same dimensionality of features. - cutoff: Cutoff radius for graph representation - """ - self.element_types = tuple(element_types) - self.cutoff = cutoff - - def get_graph(self, structure: Structure) -> tuple[pgl.Graph, paddle.Tensor, list]: - """Get a DGL graph from an input Structure. - - :param structure: pymatgen structure object - :return: - g: DGL graph - lat: lattice for periodic systems - state_attr: state features - """ - numerical_tol = 1e-08 - pbc = np.array([1, 1, 1], dtype=int) - element_types = self.element_types - lattice_matrix = structure.lattice.matrix - cart_coords = structure.cart_coords - src_id, dst_id, images, bond_dist = find_points_in_spheres( - cart_coords, - cart_coords, - r=self.cutoff, - pbc=pbc, - lattice=lattice_matrix, - tol=numerical_tol, - ) - exclude_self = (src_id != dst_id) | (bond_dist > numerical_tol) - src_id, dst_id, images, bond_dist = ( - src_id[exclude_self], - dst_id[exclude_self], - images[exclude_self], - bond_dist[exclude_self], - ) - g, lat, state_attr = super().get_graph_from_processed_structure( - structure, - src_id, - dst_id, - images, - [lattice_matrix], - element_types, - structure.frac_coords, - ) - return g, lat, state_attr diff --git a/stability_prediction/utils/hist_data.py b/stability_prediction/utils/hist_data.py deleted file mode 100644 index 3bcc4124..00000000 --- a/stability_prediction/utils/hist_data.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -import argparse -import pickle - -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -from pymatgen.core import Structure -from tqdm import tqdm - - -def load_dataset_from_pickle(file_path): - with open(file_path, "rb") as f: - data = pickle.load(f) - return data - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--path", type=str, help="Path to energy file") - parser.add_argument("--save_path", type=str, help="Path to save file") - args = parser.parse_args() - - data = load_dataset_from_pickle(args.path) - new_data = [] - for d in data: - if abs(d) > 50: - print(d) - else: - new_data.append(d) - data = new_data - - data = np.asarray(data) - n, bins, patch = plt.hist(data, bins=100) - plt.savefig(args.save_path) diff --git a/stability_prediction/utils/logger.py b/stability_prediction/utils/logger.py deleted file mode 100644 index 83c9ab23..00000000 --- a/stability_prediction/utils/logger.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import annotations - -import functools -import logging -import os -import sys -from typing import TYPE_CHECKING -from typing import Callable -from typing import Dict -from typing import Optional - -import colorlog -import paddle.distributed as dist - -# INFO(20) is white(no color) -# use custom log level `MESSAGE` for printing message in color -_MESSAGE_LEVEL = 25 - -_COLORLOG_CONFIG = { - "DEBUG": "green", - "WARNING": "yellow", - "ERROR": "red", - "MESSAGE": "cyan", -} - -__all__ = [ - "init_logger", - "set_log_level", - "info", - "message", - "debug", - "warning", - "error", - "scalar", -] - - -def init_logger( - name: str = "ppsci", - log_file: Optional[str] = None, - log_level: int = logging.INFO, -) -> None: - """Initialize and get a logger by name. - - If the logger has not been initialized, this method will initialize the logger by - adding one or two handlers, otherwise the initialized logger will be directly - returned. During initialization, a StreamHandler will always be added. If `log_file` - is specified a FileHandler will also be added. - - Args: - name (str, optional): Logger name. Defaults to "ppsci". - log_file (Optional[str]): The log filename. If specified, a FileHandler - will be added to the logger. Defaults to None. - log_level (int, optional): The logger level. Note that only the process of - rank 0 is affected, and other processes will set the level to - "Error" thus be silent most of the time. Defaults to logging.INFO. - """ - # Add custom log level MESSAGE(25), between WARNING(30) and INFO(20) - logging.addLevelName(_MESSAGE_LEVEL, "MESSAGE") - - if isinstance(log_level, str): - log_level = getattr(logging, log_level.upper()) - - # get a clean logger - _logger = logging.getLogger(name) - _logger.handlers.clear() - - # add stream_handler, output to stdout such as terminal - stream_formatter = colorlog.ColoredFormatter( - "%(log_color)s[%(asctime)s] %(name)s %(levelname)s: %(message)s", - datefmt="%Y/%m/%d %H:%M:%S", - log_colors=_COLORLOG_CONFIG, - ) - stream_handler = logging.StreamHandler(stream=sys.stdout) - stream_handler.setFormatter(stream_formatter) - stream_handler._name = "stream_handler" - _logger.addHandler(stream_handler) - - # add file_handler, output to log_file(if specified), only for rank 0 device - if log_file is not None and dist.get_rank() == 0: - log_file_folder = os.path.dirname(log_file) - if len(log_file_folder): - os.makedirs(log_file_folder, exist_ok=True) - file_formatter = logging.Formatter( - "[%(asctime)s] %(name)s %(levelname)s: %(message)s", - datefmt="%Y/%m/%d %H:%M:%S", - ) - file_handler = logging.FileHandler(log_file, "a") # append mode - file_handler.setFormatter(file_formatter) - file_handler._name = "file_handler" - _logger.addHandler(file_handler) - - if dist.get_rank() == 0: - _logger.setLevel(log_level) - else: - _logger.setLevel(logging.ERROR) - - _logger.propagate = False - return _logger diff --git a/stability_prediction/utils/misc.py b/stability_prediction/utils/misc.py deleted file mode 100644 index c22b0c6b..00000000 --- a/stability_prediction/utils/misc.py +++ /dev/null @@ -1,15 +0,0 @@ -import random - -import numpy as np -import paddle - - -def set_random_seed(seed: int): - """Set numpy, random, paddle random_seed to given seed. - - Args: - seed (int): Random seed. - """ - paddle.seed(seed) - np.random.seed(seed) - random.seed(seed) diff --git a/stability_prediction/weights/megnet_2d_dp0.5/best.pdparams b/stability_prediction/weights/megnet_2d_dp0.5/best.pdparams deleted file mode 100644 index 031529fa..00000000 Binary files a/stability_prediction/weights/megnet_2d_dp0.5/best.pdparams and /dev/null differ diff --git a/stability_prediction/weights/megnet_2d_dp0.5/latest.pdparams b/stability_prediction/weights/megnet_2d_dp0.5/latest.pdparams deleted file mode 100644 index 40362048..00000000 Binary files a/stability_prediction/weights/megnet_2d_dp0.5/latest.pdparams and /dev/null differ diff --git a/stability_prediction/weights/megnet_2d_dp0.5/megnet_2d_test.yaml b/stability_prediction/weights/megnet_2d_dp0.5/megnet_2d_test.yaml deleted file mode 100644 index bb45322c..00000000 --- a/stability_prediction/weights/megnet_2d_dp0.5/megnet_2d_test.yaml +++ /dev/null @@ -1,37 +0,0 @@ - -dataset: - structures_path: "./data/2D_structure/structures_0621.pickle" - ehull_path: "./data/2D_structure/ehulls_0621.pickle" - ehull_clip: [-4, 4] - # select: [0.0, 0.5] - - cutoff: 4.0 - split_list: [0.9, 0.05, 0.05] - # split_list: [0.8, 0.1, 0.1] - -model: - dim_node_embedding: 16 - dim_edge_embedding: 100 - dim_state_embedding: 2 - nblocks: 3 - hidden_layer_sizes_input: [64, 32] - hidden_layer_sizes_conv: [64, 64, 32] - nlayers_set2set: 1 - niters_set2set: 2 - hidden_layer_sizes_output: [32, 16] - is_classification: False - activation_type: "softplus2" - cutoff: 4.0 - gauss_width: 0.5 - dropout: 0.5 - pretrained: './weights/megnet_2d_dp0.5/best.pdparams' - - -lr_cfg: - T_max: 1000 - eta_min: 0.00001 - learning_rate: 0.0005 -epochs: 2000 -batch_size: 128 - -save_path: "./checkpoints/megnet_2d_dp0.5_debug" diff --git a/stability_prediction/weights/megnet_2d_dp0.5/megnet_2d_train.yaml b/stability_prediction/weights/megnet_2d_dp0.5/megnet_2d_train.yaml deleted file mode 100644 index 6716f74b..00000000 --- a/stability_prediction/weights/megnet_2d_dp0.5/megnet_2d_train.yaml +++ /dev/null @@ -1,37 +0,0 @@ - -dataset: - structures_path: "./data/2D_structure/structures_0621.pickle" - ehull_path: "./data/2D_structure/ehulls_0621.pickle" - ehull_clip: [-4, 4] - # select: [0.0, 0.5] - - cutoff: 4.0 - split_list: [0.9, 0.05, 0.05] - # split_list: [0.8, 0.1, 0.1] - -model: - dim_node_embedding: 16 - dim_edge_embedding: 100 - dim_state_embedding: 2 - nblocks: 3 - hidden_layer_sizes_input: [64, 32] - hidden_layer_sizes_conv: [64, 64, 32] - nlayers_set2set: 1 - niters_set2set: 2 - hidden_layer_sizes_output: [32, 16] - is_classification: False - activation_type: "softplus2" - cutoff: 4.0 - gauss_width: 0.5 - dropout: 0.5 - # pretrained: './checkpoints/megnet_3d_init/latest.pdparams' - - -lr_cfg: - T_max: 1000 - eta_min: 0.00001 - learning_rate: 0.0005 -epochs: 2000 -batch_size: 128 - -save_path: "./checkpoints/megnet_2d_dp0.5_debug" diff --git a/stability_prediction/weights/megnet_2d_dp0.5/test.log b/stability_prediction/weights/megnet_2d_dp0.5/test.log deleted file mode 100644 index 5f37c113..00000000 --- a/stability_prediction/weights/megnet_2d_dp0.5/test.log +++ /dev/null @@ -1 +0,0 @@ -[2024/06/24 07:37:47] ppsci INFO: test_loss: 0.060355, test_mae: 0.142522 diff --git a/stability_prediction/weights/megnet_2d_dp0.5/train.log b/stability_prediction/weights/megnet_2d_dp0.5/train.log deleted file mode 100644 index 70e2fed2..00000000 --- a/stability_prediction/weights/megnet_2d_dp0.5/train.log +++ /dev/null @@ -1,12092 +0,0 @@ -[2024/06/24 06:21:26] ppsci INFO: train: epoch 0 | step 0 | lr 0.000500 | loss 0.260138 | mae 0.421541 -[2024/06/24 06:21:27] ppsci INFO: train: epoch 0 | step 10 | lr 0.000500 | loss 0.295115 | mae 0.369312 -[2024/06/24 06:21:27] ppsci INFO: train: epoch 0 | step 20 | lr 0.000500 | loss 0.237465 | mae 0.310268 -[2024/06/24 06:21:27] ppsci INFO: train: epoch 0 | step 30 | lr 0.000500 | loss 0.150817 | mae 0.251036 -[2024/06/24 06:21:28] ppsci INFO: train: epoch 0 | step 38 | lr 0.000500 | loss 0.537510 | mae 0.431064 -[2024/06/24 06:21:28] ppsci INFO: epoch: 0, train_loss: 0.234025, train_metric: 0.326248, eval_loss: 0.142550, eval_mae: 0.242267 -[2024/06/24 06:21:28] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:28] ppsci INFO: train: epoch 1 | step 0 | lr 0.000500 | loss 0.189273 | mae 0.287416 -[2024/06/24 06:21:28] ppsci INFO: train: epoch 1 | step 10 | lr 0.000500 | loss 0.268547 | mae 0.297055 -[2024/06/24 06:21:29] ppsci INFO: train: epoch 1 | step 20 | lr 0.000500 | loss 0.235974 | mae 0.264324 -[2024/06/24 06:21:29] ppsci INFO: train: epoch 1 | step 30 | lr 0.000500 | loss 0.178318 | mae 0.287192 -[2024/06/24 06:21:29] ppsci INFO: train: epoch 1 | step 38 | lr 0.000500 | loss 0.058948 | mae 0.210285 -[2024/06/24 06:21:30] ppsci INFO: epoch: 1, train_loss: 0.168914, train_metric: 0.258256, eval_loss: 0.145864, eval_mae: 0.228981 -[2024/06/24 06:21:30] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:30] ppsci INFO: train: epoch 2 | step 0 | lr 0.000500 | loss 0.155023 | mae 0.275040 -[2024/06/24 06:21:30] ppsci INFO: train: epoch 2 | step 10 | lr 0.000500 | loss 0.274383 | mae 0.297761 -[2024/06/24 06:21:31] ppsci INFO: train: epoch 2 | step 20 | lr 0.000500 | loss 0.152684 | mae 0.259835 -[2024/06/24 06:21:31] ppsci INFO: train: epoch 2 | step 30 | lr 0.000500 | loss 0.107040 | mae 0.207923 -[2024/06/24 06:21:31] ppsci INFO: train: epoch 2 | step 38 | lr 0.000500 | loss 0.137162 | mae 0.268492 -[2024/06/24 06:21:31] ppsci INFO: epoch: 2, train_loss: 0.170688, train_metric: 0.258932, eval_loss: 0.142717, eval_mae: 0.228551 -[2024/06/24 06:21:31] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:31] ppsci INFO: train: epoch 3 | step 0 | lr 0.000500 | loss 0.197833 | mae 0.296299 -[2024/06/24 06:21:32] ppsci INFO: train: epoch 3 | step 10 | lr 0.000500 | loss 0.119624 | mae 0.246643 -[2024/06/24 06:21:32] ppsci INFO: train: epoch 3 | step 20 | lr 0.000500 | loss 0.198319 | mae 0.291267 -[2024/06/24 06:21:33] ppsci INFO: train: epoch 3 | step 30 | lr 0.000500 | loss 0.129753 | mae 0.253060 -[2024/06/24 06:21:33] ppsci INFO: train: epoch 3 | step 38 | lr 0.000500 | loss 0.116710 | mae 0.229981 -[2024/06/24 06:21:33] ppsci INFO: epoch: 3, train_loss: 0.161087, train_metric: 0.256880, eval_loss: 0.136185, eval_mae: 0.228379 -[2024/06/24 06:21:33] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:33] ppsci INFO: train: epoch 4 | step 0 | lr 0.000500 | loss 0.138169 | mae 0.255412 -[2024/06/24 06:21:34] ppsci INFO: train: epoch 4 | step 10 | lr 0.000500 | loss 0.160858 | mae 0.259648 -[2024/06/24 06:21:34] ppsci INFO: train: epoch 4 | step 20 | lr 0.000500 | loss 0.115022 | mae 0.237082 -[2024/06/24 06:21:35] ppsci INFO: train: epoch 4 | step 30 | lr 0.000500 | loss 0.104080 | mae 0.243021 -[2024/06/24 06:21:35] ppsci INFO: train: epoch 4 | step 38 | lr 0.000500 | loss 0.221507 | mae 0.292103 -[2024/06/24 06:21:35] ppsci INFO: epoch: 4, train_loss: 0.173045, train_metric: 0.261933, eval_loss: 0.133459, eval_mae: 0.227260 -[2024/06/24 06:21:35] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:35] ppsci INFO: train: epoch 5 | step 0 | lr 0.000500 | loss 0.276850 | mae 0.272293 -[2024/06/24 06:21:36] ppsci INFO: train: epoch 5 | step 10 | lr 0.000500 | loss 0.154794 | mae 0.243742 -[2024/06/24 06:21:36] ppsci INFO: train: epoch 5 | step 20 | lr 0.000500 | loss 0.138451 | mae 0.250291 -[2024/06/24 06:21:36] ppsci INFO: train: epoch 5 | step 30 | lr 0.000500 | loss 0.122765 | mae 0.224236 -[2024/06/24 06:21:37] ppsci INFO: train: epoch 5 | step 38 | lr 0.000500 | loss 0.041541 | mae 0.172080 -[2024/06/24 06:21:37] ppsci INFO: epoch: 5, train_loss: 0.154474, train_metric: 0.251489, eval_loss: 0.130630, eval_mae: 0.227223 -[2024/06/24 06:21:37] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:37] ppsci INFO: train: epoch 6 | step 0 | lr 0.000500 | loss 0.145169 | mae 0.257014 -[2024/06/24 06:21:37] ppsci INFO: train: epoch 6 | step 10 | lr 0.000500 | loss 0.151018 | mae 0.246229 -[2024/06/24 06:21:38] ppsci INFO: train: epoch 6 | step 20 | lr 0.000500 | loss 0.095366 | mae 0.220748 -[2024/06/24 06:21:38] ppsci INFO: train: epoch 6 | step 30 | lr 0.000500 | loss 0.201153 | mae 0.286556 -[2024/06/24 06:21:39] ppsci INFO: train: epoch 6 | step 38 | lr 0.000500 | loss 0.041106 | mae 0.156580 -[2024/06/24 06:21:39] ppsci INFO: epoch: 6, train_loss: 0.160197, train_metric: 0.256012, eval_loss: 0.128651, eval_mae: 0.228813 -[2024/06/24 06:21:39] ppsci INFO: train: epoch 7 | step 0 | lr 0.000500 | loss 0.260398 | mae 0.290069 -[2024/06/24 06:21:39] ppsci INFO: train: epoch 7 | step 10 | lr 0.000500 | loss 0.106616 | mae 0.221533 -[2024/06/24 06:21:40] ppsci INFO: train: epoch 7 | step 20 | lr 0.000500 | loss 0.195275 | mae 0.261135 -[2024/06/24 06:21:40] ppsci INFO: train: epoch 7 | step 30 | lr 0.000500 | loss 0.094722 | mae 0.216272 -[2024/06/24 06:21:41] ppsci INFO: train: epoch 7 | step 38 | lr 0.000500 | loss 0.128363 | mae 0.261955 -[2024/06/24 06:21:41] ppsci INFO: epoch: 7, train_loss: 0.180528, train_metric: 0.262314, eval_loss: 0.127187, eval_mae: 0.226427 -[2024/06/24 06:21:41] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:41] ppsci INFO: train: epoch 8 | step 0 | lr 0.000500 | loss 0.163958 | mae 0.280800 -[2024/06/24 06:21:41] ppsci INFO: train: epoch 8 | step 10 | lr 0.000500 | loss 0.080187 | mae 0.203902 -[2024/06/24 06:21:42] ppsci INFO: train: epoch 8 | step 20 | lr 0.000500 | loss 0.134851 | mae 0.240254 -[2024/06/24 06:21:42] ppsci INFO: train: epoch 8 | step 30 | lr 0.000500 | loss 0.142690 | mae 0.253262 -[2024/06/24 06:21:42] ppsci INFO: train: epoch 8 | step 38 | lr 0.000500 | loss 0.096404 | mae 0.241387 -[2024/06/24 06:21:42] ppsci INFO: epoch: 8, train_loss: 0.156390, train_metric: 0.254826, eval_loss: 0.131596, eval_mae: 0.227421 -[2024/06/24 06:21:43] ppsci INFO: train: epoch 9 | step 0 | lr 0.000500 | loss 0.241599 | mae 0.269080 -[2024/06/24 06:21:43] ppsci INFO: train: epoch 9 | step 10 | lr 0.000500 | loss 0.089821 | mae 0.217473 -[2024/06/24 06:21:43] ppsci INFO: train: epoch 9 | step 20 | lr 0.000500 | loss 0.197075 | mae 0.281620 -[2024/06/24 06:21:44] ppsci INFO: train: epoch 9 | step 30 | lr 0.000500 | loss 0.074432 | mae 0.189683 -[2024/06/24 06:21:44] ppsci INFO: train: epoch 9 | step 38 | lr 0.000500 | loss 0.059510 | mae 0.202911 -[2024/06/24 06:21:44] ppsci INFO: epoch: 9, train_loss: 0.158540, train_metric: 0.254309, eval_loss: 0.125887, eval_mae: 0.226325 -[2024/06/24 06:21:44] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:45] ppsci INFO: train: epoch 10 | step 0 | lr 0.000500 | loss 0.120458 | mae 0.252411 -[2024/06/24 06:21:45] ppsci INFO: train: epoch 10 | step 10 | lr 0.000500 | loss 0.119784 | mae 0.238416 -[2024/06/24 06:21:46] ppsci INFO: train: epoch 10 | step 20 | lr 0.000500 | loss 0.215949 | mae 0.279582 -[2024/06/24 06:21:46] ppsci INFO: train: epoch 10 | step 30 | lr 0.000500 | loss 0.118184 | mae 0.240055 -[2024/06/24 06:21:46] ppsci INFO: train: epoch 10 | step 38 | lr 0.000500 | loss 0.048631 | mae 0.177592 -[2024/06/24 06:21:47] ppsci INFO: epoch: 10, train_loss: 0.154460, train_metric: 0.253385, eval_loss: 0.126383, eval_mae: 0.225195 -[2024/06/24 06:21:47] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:21:47] ppsci INFO: train: epoch 11 | step 0 | lr 0.000500 | loss 0.118842 | mae 0.235292 -[2024/06/24 06:21:47] ppsci INFO: train: epoch 11 | step 10 | lr 0.000500 | loss 0.215532 | mae 0.292528 -[2024/06/24 06:21:48] ppsci INFO: train: epoch 11 | step 20 | lr 0.000500 | loss 0.099742 | mae 0.213201 -[2024/06/24 06:21:48] ppsci INFO: train: epoch 11 | step 30 | lr 0.000500 | loss 0.210820 | mae 0.242991 -[2024/06/24 06:21:49] ppsci INFO: train: epoch 11 | step 38 | lr 0.000500 | loss 0.022214 | mae 0.129964 -[2024/06/24 06:21:49] ppsci INFO: epoch: 11, train_loss: 0.142591, train_metric: 0.247933, eval_loss: 0.123611, eval_mae: 0.227057 -[2024/06/24 06:21:49] ppsci INFO: train: epoch 12 | step 0 | lr 0.000500 | loss 0.206375 | mae 0.238958 -[2024/06/24 06:21:49] ppsci INFO: train: epoch 12 | step 10 | lr 0.000500 | loss 0.138892 | mae 0.251619 -[2024/06/24 06:21:50] ppsci INFO: train: epoch 12 | step 20 | lr 0.000500 | loss 0.104540 | mae 0.236894 -[2024/06/24 06:21:50] ppsci INFO: train: epoch 12 | step 30 | lr 0.000500 | loss 0.216240 | mae 0.282410 -[2024/06/24 06:21:51] ppsci INFO: train: epoch 12 | step 38 | lr 0.000500 | loss 0.112357 | mae 0.260792 -[2024/06/24 06:21:51] ppsci INFO: epoch: 12, train_loss: 0.155377, train_metric: 0.252673, eval_loss: 0.121299, eval_mae: 0.227211 -[2024/06/24 06:21:51] ppsci INFO: train: epoch 13 | step 0 | lr 0.000500 | loss 0.116788 | mae 0.237432 -[2024/06/24 06:21:51] ppsci INFO: train: epoch 13 | step 10 | lr 0.000500 | loss 0.114188 | mae 0.231961 -[2024/06/24 06:21:52] ppsci INFO: train: epoch 13 | step 20 | lr 0.000500 | loss 0.142303 | mae 0.247960 -[2024/06/24 06:21:52] ppsci INFO: train: epoch 13 | step 30 | lr 0.000500 | loss 0.118400 | mae 0.257685 -[2024/06/24 06:21:53] ppsci INFO: train: epoch 13 | step 38 | lr 0.000500 | loss 0.743551 | mae 0.459796 -[2024/06/24 06:21:53] ppsci INFO: epoch: 13, train_loss: 0.159053, train_metric: 0.250178, eval_loss: 0.120862, eval_mae: 0.227136 -[2024/06/24 06:21:53] ppsci INFO: train: epoch 14 | step 0 | lr 0.000500 | loss 0.239996 | mae 0.320623 -[2024/06/24 06:21:54] ppsci INFO: train: epoch 14 | step 10 | lr 0.000500 | loss 0.092019 | mae 0.208918 -[2024/06/24 06:21:54] ppsci INFO: train: epoch 14 | step 20 | lr 0.000500 | loss 0.165807 | mae 0.264534 -[2024/06/24 06:21:55] ppsci INFO: train: epoch 14 | step 30 | lr 0.000500 | loss 0.160457 | mae 0.244526 -[2024/06/24 06:21:55] ppsci INFO: train: epoch 14 | step 38 | lr 0.000500 | loss 0.110103 | mae 0.287468 -[2024/06/24 06:21:55] ppsci INFO: epoch: 14, train_loss: 0.149501, train_metric: 0.248357, eval_loss: 0.117295, eval_mae: 0.230626 -[2024/06/24 06:21:55] ppsci INFO: train: epoch 15 | step 0 | lr 0.000500 | loss 0.168545 | mae 0.258594 -[2024/06/24 06:21:56] ppsci INFO: train: epoch 15 | step 10 | lr 0.000500 | loss 0.122210 | mae 0.240935 -[2024/06/24 06:21:56] ppsci INFO: train: epoch 15 | step 20 | lr 0.000500 | loss 0.249227 | mae 0.252882 -[2024/06/24 06:21:57] ppsci INFO: train: epoch 15 | step 30 | lr 0.000500 | loss 0.098081 | mae 0.228056 -[2024/06/24 06:21:57] ppsci INFO: train: epoch 15 | step 38 | lr 0.000500 | loss 0.508129 | mae 0.500966 -[2024/06/24 06:21:57] ppsci INFO: epoch: 15, train_loss: 0.151184, train_metric: 0.248558, eval_loss: 0.116752, eval_mae: 0.229494 -[2024/06/24 06:21:57] ppsci INFO: train: epoch 16 | step 0 | lr 0.000500 | loss 0.160958 | mae 0.270856 -[2024/06/24 06:21:58] ppsci INFO: train: epoch 16 | step 10 | lr 0.000500 | loss 0.158040 | mae 0.252720 -[2024/06/24 06:21:58] ppsci INFO: train: epoch 16 | step 20 | lr 0.000500 | loss 0.093864 | mae 0.222462 -[2024/06/24 06:21:59] ppsci INFO: train: epoch 16 | step 30 | lr 0.000500 | loss 0.124349 | mae 0.244484 -[2024/06/24 06:21:59] ppsci INFO: train: epoch 16 | step 38 | lr 0.000500 | loss 0.209457 | mae 0.350619 -[2024/06/24 06:21:59] ppsci INFO: epoch: 16, train_loss: 0.137375, train_metric: 0.244174, eval_loss: 0.117401, eval_mae: 0.231609 -[2024/06/24 06:22:00] ppsci INFO: train: epoch 17 | step 0 | lr 0.000500 | loss 0.129117 | mae 0.250348 -[2024/06/24 06:22:00] ppsci INFO: train: epoch 17 | step 10 | lr 0.000500 | loss 0.133342 | mae 0.249053 -[2024/06/24 06:22:01] ppsci INFO: train: epoch 17 | step 20 | lr 0.000500 | loss 0.254664 | mae 0.287872 -[2024/06/24 06:22:01] ppsci INFO: train: epoch 17 | step 30 | lr 0.000500 | loss 0.109733 | mae 0.242102 -[2024/06/24 06:22:02] ppsci INFO: train: epoch 17 | step 38 | lr 0.000500 | loss 0.085948 | mae 0.220362 -[2024/06/24 06:22:02] ppsci INFO: epoch: 17, train_loss: 0.139384, train_metric: 0.245243, eval_loss: 0.115806, eval_mae: 0.224077 -[2024/06/24 06:22:02] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:22:02] ppsci INFO: train: epoch 18 | step 0 | lr 0.000500 | loss 0.223681 | mae 0.257204 -[2024/06/24 06:22:02] ppsci INFO: train: epoch 18 | step 10 | lr 0.000500 | loss 0.117249 | mae 0.244243 -[2024/06/24 06:22:03] ppsci INFO: train: epoch 18 | step 20 | lr 0.000500 | loss 0.094002 | mae 0.212781 -[2024/06/24 06:22:03] ppsci INFO: train: epoch 18 | step 30 | lr 0.000500 | loss 0.125900 | mae 0.226028 -[2024/06/24 06:22:04] ppsci INFO: train: epoch 18 | step 38 | lr 0.000500 | loss 0.093137 | mae 0.228115 -[2024/06/24 06:22:04] ppsci INFO: epoch: 18, train_loss: 0.135407, train_metric: 0.243948, eval_loss: 0.116833, eval_mae: 0.232263 -[2024/06/24 06:22:04] ppsci INFO: train: epoch 19 | step 0 | lr 0.000500 | loss 0.166309 | mae 0.270278 -[2024/06/24 06:22:04] ppsci INFO: train: epoch 19 | step 10 | lr 0.000500 | loss 0.103350 | mae 0.224052 -[2024/06/24 06:22:05] ppsci INFO: train: epoch 19 | step 20 | lr 0.000500 | loss 0.163872 | mae 0.261284 -[2024/06/24 06:22:05] ppsci INFO: train: epoch 19 | step 30 | lr 0.000500 | loss 0.152313 | mae 0.258390 -[2024/06/24 06:22:06] ppsci INFO: train: epoch 19 | step 38 | lr 0.000500 | loss 0.143676 | mae 0.294865 -[2024/06/24 06:22:06] ppsci INFO: epoch: 19, train_loss: 0.152950, train_metric: 0.252208, eval_loss: 0.118320, eval_mae: 0.227628 -[2024/06/24 06:22:06] ppsci INFO: train: epoch 20 | step 0 | lr 0.000500 | loss 0.097724 | mae 0.235368 -[2024/06/24 06:22:06] ppsci INFO: train: epoch 20 | step 10 | lr 0.000500 | loss 0.255718 | mae 0.264870 -[2024/06/24 06:22:07] ppsci INFO: train: epoch 20 | step 20 | lr 0.000500 | loss 0.137367 | mae 0.260160 -[2024/06/24 06:22:08] ppsci INFO: train: epoch 20 | step 30 | lr 0.000500 | loss 0.107386 | mae 0.229012 -[2024/06/24 06:22:08] ppsci INFO: train: epoch 20 | step 38 | lr 0.000500 | loss 0.071920 | mae 0.209978 -[2024/06/24 06:22:08] ppsci INFO: epoch: 20, train_loss: 0.153658, train_metric: 0.248638, eval_loss: 0.122371, eval_mae: 0.236430 -[2024/06/24 06:22:08] ppsci INFO: train: epoch 21 | step 0 | lr 0.000499 | loss 0.137859 | mae 0.243546 -[2024/06/24 06:22:09] ppsci INFO: train: epoch 21 | step 10 | lr 0.000499 | loss 0.118228 | mae 0.239206 -[2024/06/24 06:22:09] ppsci INFO: train: epoch 21 | step 20 | lr 0.000499 | loss 0.098784 | mae 0.221197 -[2024/06/24 06:22:10] ppsci INFO: train: epoch 21 | step 30 | lr 0.000499 | loss 0.090811 | mae 0.204034 -[2024/06/24 06:22:10] ppsci INFO: train: epoch 21 | step 38 | lr 0.000499 | loss 0.118790 | mae 0.225453 -[2024/06/24 06:22:10] ppsci INFO: epoch: 21, train_loss: 0.125523, train_metric: 0.243739, eval_loss: 0.126948, eval_mae: 0.231066 -[2024/06/24 06:22:10] ppsci INFO: train: epoch 22 | step 0 | lr 0.000499 | loss 0.133929 | mae 0.254168 -[2024/06/24 06:22:11] ppsci INFO: train: epoch 22 | step 10 | lr 0.000499 | loss 0.228912 | mae 0.273611 -[2024/06/24 06:22:12] ppsci INFO: train: epoch 22 | step 20 | lr 0.000499 | loss 0.111409 | mae 0.226270 -[2024/06/24 06:22:12] ppsci INFO: train: epoch 22 | step 30 | lr 0.000499 | loss 0.141240 | mae 0.255977 -[2024/06/24 06:22:12] ppsci INFO: train: epoch 22 | step 38 | lr 0.000499 | loss 0.331716 | mae 0.451298 -[2024/06/24 06:22:12] ppsci INFO: epoch: 22, train_loss: 0.133633, train_metric: 0.240953, eval_loss: 0.122782, eval_mae: 0.228382 -[2024/06/24 06:22:13] ppsci INFO: train: epoch 23 | step 0 | lr 0.000499 | loss 0.153955 | mae 0.264847 -[2024/06/24 06:22:13] ppsci INFO: train: epoch 23 | step 10 | lr 0.000499 | loss 0.089533 | mae 0.210902 -[2024/06/24 06:22:14] ppsci INFO: train: epoch 23 | step 20 | lr 0.000499 | loss 0.136394 | mae 0.252529 -[2024/06/24 06:22:14] ppsci INFO: train: epoch 23 | step 30 | lr 0.000499 | loss 0.123648 | mae 0.237513 -[2024/06/24 06:22:14] ppsci INFO: train: epoch 23 | step 38 | lr 0.000499 | loss 0.205658 | mae 0.300514 -[2024/06/24 06:22:15] ppsci INFO: epoch: 23, train_loss: 0.137390, train_metric: 0.243860, eval_loss: 0.118013, eval_mae: 0.231857 -[2024/06/24 06:22:15] ppsci INFO: train: epoch 24 | step 0 | lr 0.000499 | loss 0.113516 | mae 0.219305 -[2024/06/24 06:22:15] ppsci INFO: train: epoch 24 | step 10 | lr 0.000499 | loss 0.170630 | mae 0.268888 -[2024/06/24 06:22:16] ppsci INFO: train: epoch 24 | step 20 | lr 0.000499 | loss 0.106945 | mae 0.222945 -[2024/06/24 06:22:16] ppsci INFO: train: epoch 24 | step 30 | lr 0.000499 | loss 0.074703 | mae 0.192275 -[2024/06/24 06:22:17] ppsci INFO: train: epoch 24 | step 38 | lr 0.000499 | loss 0.175316 | mae 0.273862 -[2024/06/24 06:22:17] ppsci INFO: epoch: 24, train_loss: 0.135546, train_metric: 0.241028, eval_loss: 0.123151, eval_mae: 0.231426 -[2024/06/24 06:22:17] ppsci INFO: train: epoch 25 | step 0 | lr 0.000499 | loss 0.146513 | mae 0.263901 -[2024/06/24 06:22:17] ppsci INFO: train: epoch 25 | step 10 | lr 0.000499 | loss 0.120708 | mae 0.264571 -[2024/06/24 06:22:18] ppsci INFO: train: epoch 25 | step 20 | lr 0.000499 | loss 0.155115 | mae 0.271313 -[2024/06/24 06:22:18] ppsci INFO: train: epoch 25 | step 30 | lr 0.000499 | loss 0.136636 | mae 0.240056 -[2024/06/24 06:22:19] ppsci INFO: train: epoch 25 | step 38 | lr 0.000499 | loss 0.034663 | mae 0.130516 -[2024/06/24 06:22:19] ppsci INFO: epoch: 25, train_loss: 0.131936, train_metric: 0.245417, eval_loss: 0.123745, eval_mae: 0.236516 -[2024/06/24 06:22:19] ppsci INFO: train: epoch 26 | step 0 | lr 0.000499 | loss 0.209046 | mae 0.260941 -[2024/06/24 06:22:19] ppsci INFO: train: epoch 26 | step 10 | lr 0.000499 | loss 0.115816 | mae 0.224369 -[2024/06/24 06:22:20] ppsci INFO: train: epoch 26 | step 20 | lr 0.000499 | loss 0.155525 | mae 0.266802 -[2024/06/24 06:22:20] ppsci INFO: train: epoch 26 | step 30 | lr 0.000499 | loss 0.240308 | mae 0.288733 -[2024/06/24 06:22:21] ppsci INFO: train: epoch 26 | step 38 | lr 0.000499 | loss 0.147821 | mae 0.280732 -[2024/06/24 06:22:21] ppsci INFO: epoch: 26, train_loss: 0.129623, train_metric: 0.241403, eval_loss: 0.121933, eval_mae: 0.235364 -[2024/06/24 06:22:21] ppsci INFO: train: epoch 27 | step 0 | lr 0.000499 | loss 0.106749 | mae 0.238029 -[2024/06/24 06:22:22] ppsci INFO: train: epoch 27 | step 10 | lr 0.000499 | loss 0.302913 | mae 0.279236 -[2024/06/24 06:22:22] ppsci INFO: train: epoch 27 | step 20 | lr 0.000499 | loss 0.118081 | mae 0.242771 -[2024/06/24 06:22:23] ppsci INFO: train: epoch 27 | step 30 | lr 0.000499 | loss 0.206148 | mae 0.268106 -[2024/06/24 06:22:23] ppsci INFO: train: epoch 27 | step 38 | lr 0.000499 | loss 0.175240 | mae 0.346777 -[2024/06/24 06:22:23] ppsci INFO: epoch: 27, train_loss: 0.137880, train_metric: 0.243785, eval_loss: 0.118820, eval_mae: 0.234428 -[2024/06/24 06:22:23] ppsci INFO: train: epoch 28 | step 0 | lr 0.000499 | loss 0.175352 | mae 0.245071 -[2024/06/24 06:22:24] ppsci INFO: train: epoch 28 | step 10 | lr 0.000499 | loss 0.114795 | mae 0.226382 -[2024/06/24 06:22:24] ppsci INFO: train: epoch 28 | step 20 | lr 0.000499 | loss 0.103611 | mae 0.222184 -[2024/06/24 06:22:25] ppsci INFO: train: epoch 28 | step 30 | lr 0.000499 | loss 0.093755 | mae 0.222626 -[2024/06/24 06:22:25] ppsci INFO: train: epoch 28 | step 38 | lr 0.000499 | loss 0.064146 | mae 0.197625 -[2024/06/24 06:22:25] ppsci INFO: epoch: 28, train_loss: 0.135147, train_metric: 0.245733, eval_loss: 0.115939, eval_mae: 0.229805 -[2024/06/24 06:22:25] ppsci INFO: train: epoch 29 | step 0 | lr 0.000499 | loss 0.118109 | mae 0.272743 -[2024/06/24 06:22:26] ppsci INFO: train: epoch 29 | step 10 | lr 0.000499 | loss 0.161735 | mae 0.289536 -[2024/06/24 06:22:26] ppsci INFO: train: epoch 29 | step 20 | lr 0.000499 | loss 0.072698 | mae 0.204752 -[2024/06/24 06:22:27] ppsci INFO: train: epoch 29 | step 30 | lr 0.000499 | loss 0.100223 | mae 0.216823 -[2024/06/24 06:22:27] ppsci INFO: train: epoch 29 | step 38 | lr 0.000499 | loss 0.112027 | mae 0.262906 -[2024/06/24 06:22:27] ppsci INFO: epoch: 29, train_loss: 0.136468, train_metric: 0.245239, eval_loss: 0.121941, eval_mae: 0.230002 -[2024/06/24 06:22:28] ppsci INFO: train: epoch 30 | step 0 | lr 0.000499 | loss 0.091282 | mae 0.201486 -[2024/06/24 06:22:28] ppsci INFO: train: epoch 30 | step 10 | lr 0.000499 | loss 0.126165 | mae 0.235719 -[2024/06/24 06:22:29] ppsci INFO: train: epoch 30 | step 20 | lr 0.000499 | loss 0.171942 | mae 0.280234 -[2024/06/24 06:22:29] ppsci INFO: train: epoch 30 | step 30 | lr 0.000499 | loss 0.283303 | mae 0.265129 -[2024/06/24 06:22:29] ppsci INFO: train: epoch 30 | step 38 | lr 0.000499 | loss 0.141822 | mae 0.294310 -[2024/06/24 06:22:30] ppsci INFO: epoch: 30, train_loss: 0.135860, train_metric: 0.246848, eval_loss: 0.117979, eval_mae: 0.227419 -[2024/06/24 06:22:30] ppsci INFO: train: epoch 31 | step 0 | lr 0.000499 | loss 0.076556 | mae 0.200038 -[2024/06/24 06:22:30] ppsci INFO: train: epoch 31 | step 10 | lr 0.000499 | loss 0.131896 | mae 0.248833 -[2024/06/24 06:22:31] ppsci INFO: train: epoch 31 | step 20 | lr 0.000499 | loss 0.154964 | mae 0.262729 -[2024/06/24 06:22:31] ppsci INFO: train: epoch 31 | step 30 | lr 0.000499 | loss 0.153121 | mae 0.255168 -[2024/06/24 06:22:31] ppsci INFO: train: epoch 31 | step 38 | lr 0.000499 | loss 0.038170 | mae 0.155796 -[2024/06/24 06:22:32] ppsci INFO: epoch: 31, train_loss: 0.124382, train_metric: 0.239280, eval_loss: 0.115376, eval_mae: 0.229596 -[2024/06/24 06:22:32] ppsci INFO: train: epoch 32 | step 0 | lr 0.000499 | loss 0.153717 | mae 0.277761 -[2024/06/24 06:22:32] ppsci INFO: train: epoch 32 | step 10 | lr 0.000499 | loss 0.104420 | mae 0.220839 -[2024/06/24 06:22:33] ppsci INFO: train: epoch 32 | step 20 | lr 0.000499 | loss 0.106870 | mae 0.234998 -[2024/06/24 06:22:33] ppsci INFO: train: epoch 32 | step 30 | lr 0.000499 | loss 0.075452 | mae 0.196413 -[2024/06/24 06:22:34] ppsci INFO: train: epoch 32 | step 38 | lr 0.000499 | loss 0.074940 | mae 0.227195 -[2024/06/24 06:22:34] ppsci INFO: epoch: 32, train_loss: 0.128434, train_metric: 0.242274, eval_loss: 0.112933, eval_mae: 0.221837 -[2024/06/24 06:22:34] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:22:34] ppsci INFO: train: epoch 33 | step 0 | lr 0.000499 | loss 0.152467 | mae 0.247003 -[2024/06/24 06:22:34] ppsci INFO: train: epoch 33 | step 10 | lr 0.000499 | loss 0.104060 | mae 0.232767 -[2024/06/24 06:22:35] ppsci INFO: train: epoch 33 | step 20 | lr 0.000499 | loss 0.218092 | mae 0.289660 -[2024/06/24 06:22:36] ppsci INFO: train: epoch 33 | step 30 | lr 0.000499 | loss 0.092529 | mae 0.211908 -[2024/06/24 06:22:36] ppsci INFO: train: epoch 33 | step 38 | lr 0.000499 | loss 0.253619 | mae 0.343634 -[2024/06/24 06:22:36] ppsci INFO: epoch: 33, train_loss: 0.134061, train_metric: 0.239736, eval_loss: 0.118208, eval_mae: 0.234724 -[2024/06/24 06:22:36] ppsci INFO: train: epoch 34 | step 0 | lr 0.000499 | loss 0.112892 | mae 0.237526 -[2024/06/24 06:22:37] ppsci INFO: train: epoch 34 | step 10 | lr 0.000499 | loss 0.108215 | mae 0.249787 -[2024/06/24 06:22:37] ppsci INFO: train: epoch 34 | step 20 | lr 0.000499 | loss 0.268867 | mae 0.287270 -[2024/06/24 06:22:38] ppsci INFO: train: epoch 34 | step 30 | lr 0.000499 | loss 0.123977 | mae 0.225304 -[2024/06/24 06:22:38] ppsci INFO: train: epoch 34 | step 38 | lr 0.000499 | loss 0.141132 | mae 0.297440 -[2024/06/24 06:22:38] ppsci INFO: epoch: 34, train_loss: 0.126991, train_metric: 0.236868, eval_loss: 0.117143, eval_mae: 0.240797 -[2024/06/24 06:22:38] ppsci INFO: train: epoch 35 | step 0 | lr 0.000499 | loss 0.124029 | mae 0.236191 -[2024/06/24 06:22:39] ppsci INFO: train: epoch 35 | step 10 | lr 0.000499 | loss 0.120393 | mae 0.226772 -[2024/06/24 06:22:39] ppsci INFO: train: epoch 35 | step 20 | lr 0.000499 | loss 0.132934 | mae 0.245830 -[2024/06/24 06:22:40] ppsci INFO: train: epoch 35 | step 30 | lr 0.000499 | loss 0.241360 | mae 0.277885 -[2024/06/24 06:22:40] ppsci INFO: train: epoch 35 | step 38 | lr 0.000499 | loss 0.094833 | mae 0.210591 -[2024/06/24 06:22:40] ppsci INFO: epoch: 35, train_loss: 0.137562, train_metric: 0.242774, eval_loss: 0.114951, eval_mae: 0.229875 -[2024/06/24 06:22:41] ppsci INFO: train: epoch 36 | step 0 | lr 0.000498 | loss 0.080158 | mae 0.209545 -[2024/06/24 06:22:41] ppsci INFO: train: epoch 36 | step 10 | lr 0.000498 | loss 0.112554 | mae 0.232644 -[2024/06/24 06:22:42] ppsci INFO: train: epoch 36 | step 20 | lr 0.000498 | loss 0.124188 | mae 0.234531 -[2024/06/24 06:22:42] ppsci INFO: train: epoch 36 | step 30 | lr 0.000498 | loss 0.102417 | mae 0.223784 -[2024/06/24 06:22:42] ppsci INFO: train: epoch 36 | step 38 | lr 0.000498 | loss 0.026425 | mae 0.150614 -[2024/06/24 06:22:43] ppsci INFO: epoch: 36, train_loss: 0.116030, train_metric: 0.230873, eval_loss: 0.113988, eval_mae: 0.226519 -[2024/06/24 06:22:43] ppsci INFO: train: epoch 37 | step 0 | lr 0.000498 | loss 0.104788 | mae 0.229673 -[2024/06/24 06:22:43] ppsci INFO: train: epoch 37 | step 10 | lr 0.000498 | loss 0.114858 | mae 0.206820 -[2024/06/24 06:22:44] ppsci INFO: train: epoch 37 | step 20 | lr 0.000498 | loss 0.128401 | mae 0.262871 -[2024/06/24 06:22:44] ppsci INFO: train: epoch 37 | step 30 | lr 0.000498 | loss 0.068503 | mae 0.198312 -[2024/06/24 06:22:44] ppsci INFO: train: epoch 37 | step 38 | lr 0.000498 | loss 0.055117 | mae 0.191392 -[2024/06/24 06:22:45] ppsci INFO: epoch: 37, train_loss: 0.113595, train_metric: 0.229602, eval_loss: 0.113725, eval_mae: 0.230649 -[2024/06/24 06:22:45] ppsci INFO: train: epoch 38 | step 0 | lr 0.000498 | loss 0.084970 | mae 0.219140 -[2024/06/24 06:22:45] ppsci INFO: train: epoch 38 | step 10 | lr 0.000498 | loss 0.135867 | mae 0.252815 -[2024/06/24 06:22:46] ppsci INFO: train: epoch 38 | step 20 | lr 0.000498 | loss 0.093234 | mae 0.202021 -[2024/06/24 06:22:46] ppsci INFO: train: epoch 38 | step 30 | lr 0.000498 | loss 0.115330 | mae 0.235373 -[2024/06/24 06:22:47] ppsci INFO: train: epoch 38 | step 38 | lr 0.000498 | loss 0.092274 | mae 0.203833 -[2024/06/24 06:22:47] ppsci INFO: epoch: 38, train_loss: 0.125133, train_metric: 0.235025, eval_loss: 0.111998, eval_mae: 0.230405 -[2024/06/24 06:22:47] ppsci INFO: train: epoch 39 | step 0 | lr 0.000498 | loss 0.093546 | mae 0.221308 -[2024/06/24 06:22:47] ppsci INFO: train: epoch 39 | step 10 | lr 0.000498 | loss 0.185258 | mae 0.252381 -[2024/06/24 06:22:48] ppsci INFO: train: epoch 39 | step 20 | lr 0.000498 | loss 0.103375 | mae 0.234869 -[2024/06/24 06:22:48] ppsci INFO: train: epoch 39 | step 30 | lr 0.000498 | loss 0.104915 | mae 0.216975 -[2024/06/24 06:22:49] ppsci INFO: train: epoch 39 | step 38 | lr 0.000498 | loss 0.285873 | mae 0.323546 -[2024/06/24 06:22:49] ppsci INFO: epoch: 39, train_loss: 0.129369, train_metric: 0.238297, eval_loss: 0.106857, eval_mae: 0.223628 -[2024/06/24 06:22:49] ppsci INFO: train: epoch 40 | step 0 | lr 0.000498 | loss 0.066916 | mae 0.190044 -[2024/06/24 06:22:50] ppsci INFO: train: epoch 40 | step 10 | lr 0.000498 | loss 0.091033 | mae 0.224886 -[2024/06/24 06:22:50] ppsci INFO: train: epoch 40 | step 20 | lr 0.000498 | loss 0.115375 | mae 0.236918 -[2024/06/24 06:22:51] ppsci INFO: train: epoch 40 | step 30 | lr 0.000498 | loss 0.070447 | mae 0.187981 -[2024/06/24 06:22:51] ppsci INFO: train: epoch 40 | step 38 | lr 0.000498 | loss 0.103445 | mae 0.239588 -[2024/06/24 06:22:51] ppsci INFO: epoch: 40, train_loss: 0.111603, train_metric: 0.228481, eval_loss: 0.105632, eval_mae: 0.221893 -[2024/06/24 06:22:51] ppsci INFO: train: epoch 41 | step 0 | lr 0.000498 | loss 0.146815 | mae 0.253287 -[2024/06/24 06:22:52] ppsci INFO: train: epoch 41 | step 10 | lr 0.000498 | loss 0.091736 | mae 0.207870 -[2024/06/24 06:22:52] ppsci INFO: train: epoch 41 | step 20 | lr 0.000498 | loss 0.130816 | mae 0.246053 -[2024/06/24 06:22:53] ppsci INFO: train: epoch 41 | step 30 | lr 0.000498 | loss 0.094427 | mae 0.230934 -[2024/06/24 06:22:53] ppsci INFO: train: epoch 41 | step 38 | lr 0.000498 | loss 0.087792 | mae 0.212343 -[2024/06/24 06:22:53] ppsci INFO: epoch: 41, train_loss: 0.128168, train_metric: 0.240855, eval_loss: 0.104774, eval_mae: 0.221613 -[2024/06/24 06:22:53] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:22:53] ppsci INFO: train: epoch 42 | step 0 | lr 0.000498 | loss 0.185429 | mae 0.272143 -[2024/06/24 06:22:54] ppsci INFO: train: epoch 42 | step 10 | lr 0.000498 | loss 0.130121 | mae 0.253141 -[2024/06/24 06:22:54] ppsci INFO: train: epoch 42 | step 20 | lr 0.000498 | loss 0.063825 | mae 0.191887 -[2024/06/24 06:22:55] ppsci INFO: train: epoch 42 | step 30 | lr 0.000498 | loss 0.081893 | mae 0.216844 -[2024/06/24 06:22:55] ppsci INFO: train: epoch 42 | step 38 | lr 0.000498 | loss 0.126163 | mae 0.271107 -[2024/06/24 06:22:55] ppsci INFO: epoch: 42, train_loss: 0.126851, train_metric: 0.233685, eval_loss: 0.106671, eval_mae: 0.219695 -[2024/06/24 06:22:55] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:22:55] ppsci INFO: train: epoch 43 | step 0 | lr 0.000498 | loss 0.103970 | mae 0.220758 -[2024/06/24 06:22:56] ppsci INFO: train: epoch 43 | step 10 | lr 0.000498 | loss 0.111507 | mae 0.231848 -[2024/06/24 06:22:56] ppsci INFO: train: epoch 43 | step 20 | lr 0.000498 | loss 0.214220 | mae 0.223932 -[2024/06/24 06:22:57] ppsci INFO: train: epoch 43 | step 30 | lr 0.000498 | loss 0.149715 | mae 0.272019 -[2024/06/24 06:22:57] ppsci INFO: train: epoch 43 | step 38 | lr 0.000498 | loss 0.080293 | mae 0.221926 -[2024/06/24 06:22:57] ppsci INFO: epoch: 43, train_loss: 0.119045, train_metric: 0.231792, eval_loss: 0.107193, eval_mae: 0.229033 -[2024/06/24 06:22:58] ppsci INFO: train: epoch 44 | step 0 | lr 0.000498 | loss 0.105151 | mae 0.233540 -[2024/06/24 06:22:58] ppsci INFO: train: epoch 44 | step 10 | lr 0.000498 | loss 0.224807 | mae 0.260575 -[2024/06/24 06:22:59] ppsci INFO: train: epoch 44 | step 20 | lr 0.000498 | loss 0.074829 | mae 0.196517 -[2024/06/24 06:22:59] ppsci INFO: train: epoch 44 | step 30 | lr 0.000498 | loss 0.068901 | mae 0.192535 -[2024/06/24 06:22:59] ppsci INFO: train: epoch 44 | step 38 | lr 0.000498 | loss 0.139312 | mae 0.269705 -[2024/06/24 06:23:00] ppsci INFO: epoch: 44, train_loss: 0.123051, train_metric: 0.233728, eval_loss: 0.107877, eval_mae: 0.232212 -[2024/06/24 06:23:00] ppsci INFO: train: epoch 45 | step 0 | lr 0.000498 | loss 0.113519 | mae 0.224323 -[2024/06/24 06:23:00] ppsci INFO: train: epoch 45 | step 10 | lr 0.000498 | loss 0.120613 | mae 0.228220 -[2024/06/24 06:23:01] ppsci INFO: train: epoch 45 | step 20 | lr 0.000498 | loss 0.057914 | mae 0.184655 -[2024/06/24 06:23:01] ppsci INFO: train: epoch 45 | step 30 | lr 0.000498 | loss 0.101858 | mae 0.215305 -[2024/06/24 06:23:02] ppsci INFO: train: epoch 45 | step 38 | lr 0.000498 | loss 0.160220 | mae 0.240429 -[2024/06/24 06:23:02] ppsci INFO: epoch: 45, train_loss: 0.123125, train_metric: 0.233147, eval_loss: 0.101782, eval_mae: 0.222303 -[2024/06/24 06:23:02] ppsci INFO: train: epoch 46 | step 0 | lr 0.000497 | loss 0.126471 | mae 0.238598 -[2024/06/24 06:23:02] ppsci INFO: train: epoch 46 | step 10 | lr 0.000497 | loss 0.098299 | mae 0.216330 -[2024/06/24 06:23:03] ppsci INFO: train: epoch 46 | step 20 | lr 0.000497 | loss 0.114809 | mae 0.236614 -[2024/06/24 06:23:03] ppsci INFO: train: epoch 46 | step 30 | lr 0.000497 | loss 0.108667 | mae 0.236122 -[2024/06/24 06:23:04] ppsci INFO: train: epoch 46 | step 38 | lr 0.000497 | loss 0.128473 | mae 0.258810 -[2024/06/24 06:23:04] ppsci INFO: epoch: 46, train_loss: 0.111326, train_metric: 0.228589, eval_loss: 0.103235, eval_mae: 0.218527 -[2024/06/24 06:23:04] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:23:04] ppsci INFO: train: epoch 47 | step 0 | lr 0.000497 | loss 0.127980 | mae 0.232225 -[2024/06/24 06:23:05] ppsci INFO: train: epoch 47 | step 10 | lr 0.000497 | loss 0.145013 | mae 0.246715 -[2024/06/24 06:23:05] ppsci INFO: train: epoch 47 | step 20 | lr 0.000497 | loss 0.086929 | mae 0.201740 -[2024/06/24 06:23:06] ppsci INFO: train: epoch 47 | step 30 | lr 0.000497 | loss 0.088006 | mae 0.229783 -[2024/06/24 06:23:06] ppsci INFO: train: epoch 47 | step 38 | lr 0.000497 | loss 0.227081 | mae 0.340700 -[2024/06/24 06:23:06] ppsci INFO: epoch: 47, train_loss: 0.124361, train_metric: 0.231038, eval_loss: 0.104541, eval_mae: 0.225061 -[2024/06/24 06:23:06] ppsci INFO: train: epoch 48 | step 0 | lr 0.000497 | loss 0.125636 | mae 0.235473 -[2024/06/24 06:23:07] ppsci INFO: train: epoch 48 | step 10 | lr 0.000497 | loss 0.251774 | mae 0.286939 -[2024/06/24 06:23:07] ppsci INFO: train: epoch 48 | step 20 | lr 0.000497 | loss 0.098746 | mae 0.222389 -[2024/06/24 06:23:08] ppsci INFO: train: epoch 48 | step 30 | lr 0.000497 | loss 0.237596 | mae 0.274010 -[2024/06/24 06:23:08] ppsci INFO: train: epoch 48 | step 38 | lr 0.000497 | loss 0.070116 | mae 0.217011 -[2024/06/24 06:23:08] ppsci INFO: epoch: 48, train_loss: 0.124118, train_metric: 0.235379, eval_loss: 0.099613, eval_mae: 0.218301 -[2024/06/24 06:23:08] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:23:08] ppsci INFO: train: epoch 49 | step 0 | lr 0.000497 | loss 0.110125 | mae 0.221693 -[2024/06/24 06:23:09] ppsci INFO: train: epoch 49 | step 10 | lr 0.000497 | loss 0.097098 | mae 0.211865 -[2024/06/24 06:23:09] ppsci INFO: train: epoch 49 | step 20 | lr 0.000497 | loss 0.074154 | mae 0.196222 -[2024/06/24 06:23:10] ppsci INFO: train: epoch 49 | step 30 | lr 0.000497 | loss 0.074937 | mae 0.198390 -[2024/06/24 06:23:10] ppsci INFO: train: epoch 49 | step 38 | lr 0.000497 | loss 0.072519 | mae 0.210547 -[2024/06/24 06:23:10] ppsci INFO: epoch: 49, train_loss: 0.120369, train_metric: 0.225707, eval_loss: 0.106966, eval_mae: 0.231076 -[2024/06/24 06:23:11] ppsci INFO: train: epoch 50 | step 0 | lr 0.000497 | loss 0.118676 | mae 0.241157 -[2024/06/24 06:23:11] ppsci INFO: train: epoch 50 | step 10 | lr 0.000497 | loss 0.124440 | mae 0.254474 -[2024/06/24 06:23:12] ppsci INFO: train: epoch 50 | step 20 | lr 0.000497 | loss 0.101911 | mae 0.233089 -[2024/06/24 06:23:12] ppsci INFO: train: epoch 50 | step 30 | lr 0.000497 | loss 0.083017 | mae 0.203778 -[2024/06/24 06:23:13] ppsci INFO: train: epoch 50 | step 38 | lr 0.000497 | loss 0.235321 | mae 0.340878 -[2024/06/24 06:23:13] ppsci INFO: epoch: 50, train_loss: 0.117611, train_metric: 0.231412, eval_loss: 0.101861, eval_mae: 0.226177 -[2024/06/24 06:23:13] ppsci INFO: train: epoch 51 | step 0 | lr 0.000497 | loss 0.097171 | mae 0.218750 -[2024/06/24 06:23:13] ppsci INFO: train: epoch 51 | step 10 | lr 0.000497 | loss 0.216843 | mae 0.248193 -[2024/06/24 06:23:14] ppsci INFO: train: epoch 51 | step 20 | lr 0.000497 | loss 0.132518 | mae 0.249178 -[2024/06/24 06:23:14] ppsci INFO: train: epoch 51 | step 30 | lr 0.000497 | loss 0.114362 | mae 0.233356 -[2024/06/24 06:23:15] ppsci INFO: train: epoch 51 | step 38 | lr 0.000497 | loss 0.076710 | mae 0.220487 -[2024/06/24 06:23:15] ppsci INFO: epoch: 51, train_loss: 0.115291, train_metric: 0.228944, eval_loss: 0.102770, eval_mae: 0.218829 -[2024/06/24 06:23:15] ppsci INFO: train: epoch 52 | step 0 | lr 0.000497 | loss 0.129117 | mae 0.251929 -[2024/06/24 06:23:16] ppsci INFO: train: epoch 52 | step 10 | lr 0.000497 | loss 0.048614 | mae 0.171824 -[2024/06/24 06:23:16] ppsci INFO: train: epoch 52 | step 20 | lr 0.000497 | loss 0.099036 | mae 0.225017 -[2024/06/24 06:23:17] ppsci INFO: train: epoch 52 | step 30 | lr 0.000497 | loss 0.089623 | mae 0.211118 -[2024/06/24 06:23:17] ppsci INFO: train: epoch 52 | step 38 | lr 0.000497 | loss 0.041242 | mae 0.164368 -[2024/06/24 06:23:17] ppsci INFO: epoch: 52, train_loss: 0.119490, train_metric: 0.229362, eval_loss: 0.099397, eval_mae: 0.224007 -[2024/06/24 06:23:17] ppsci INFO: train: epoch 53 | step 0 | lr 0.000497 | loss 0.086874 | mae 0.210442 -[2024/06/24 06:23:18] ppsci INFO: train: epoch 53 | step 10 | lr 0.000497 | loss 0.120459 | mae 0.247429 -[2024/06/24 06:23:18] ppsci INFO: train: epoch 53 | step 20 | lr 0.000497 | loss 0.094813 | mae 0.223285 -[2024/06/24 06:23:19] ppsci INFO: train: epoch 53 | step 30 | lr 0.000497 | loss 0.099029 | mae 0.238103 -[2024/06/24 06:23:19] ppsci INFO: train: epoch 53 | step 38 | lr 0.000497 | loss 0.085163 | mae 0.206156 -[2024/06/24 06:23:19] ppsci INFO: epoch: 53, train_loss: 0.117375, train_metric: 0.231056, eval_loss: 0.094860, eval_mae: 0.224676 -[2024/06/24 06:23:20] ppsci INFO: train: epoch 54 | step 0 | lr 0.000496 | loss 0.069233 | mae 0.202184 -[2024/06/24 06:23:20] ppsci INFO: train: epoch 54 | step 10 | lr 0.000496 | loss 0.074123 | mae 0.203273 -[2024/06/24 06:23:21] ppsci INFO: train: epoch 54 | step 20 | lr 0.000496 | loss 0.072806 | mae 0.203247 -[2024/06/24 06:23:21] ppsci INFO: train: epoch 54 | step 30 | lr 0.000496 | loss 0.105541 | mae 0.234142 -[2024/06/24 06:23:21] ppsci INFO: train: epoch 54 | step 38 | lr 0.000496 | loss 0.111592 | mae 0.286839 -[2024/06/24 06:23:21] ppsci INFO: epoch: 54, train_loss: 0.115067, train_metric: 0.230667, eval_loss: 0.094566, eval_mae: 0.218814 -[2024/06/24 06:23:22] ppsci INFO: train: epoch 55 | step 0 | lr 0.000496 | loss 0.282139 | mae 0.261002 -[2024/06/24 06:23:22] ppsci INFO: train: epoch 55 | step 10 | lr 0.000496 | loss 0.097308 | mae 0.218083 -[2024/06/24 06:23:23] ppsci INFO: train: epoch 55 | step 20 | lr 0.000496 | loss 0.193890 | mae 0.217379 -[2024/06/24 06:23:23] ppsci INFO: train: epoch 55 | step 30 | lr 0.000496 | loss 0.145267 | mae 0.254062 -[2024/06/24 06:23:24] ppsci INFO: train: epoch 55 | step 38 | lr 0.000496 | loss 0.037622 | mae 0.143035 -[2024/06/24 06:23:24] ppsci INFO: epoch: 55, train_loss: 0.127916, train_metric: 0.234877, eval_loss: 0.095919, eval_mae: 0.215319 -[2024/06/24 06:23:24] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:23:24] ppsci INFO: train: epoch 56 | step 0 | lr 0.000496 | loss 0.129492 | mae 0.258105 -[2024/06/24 06:23:24] ppsci INFO: train: epoch 56 | step 10 | lr 0.000496 | loss 0.104724 | mae 0.227349 -[2024/06/24 06:23:25] ppsci INFO: train: epoch 56 | step 20 | lr 0.000496 | loss 0.110303 | mae 0.216294 -[2024/06/24 06:23:25] ppsci INFO: train: epoch 56 | step 30 | lr 0.000496 | loss 0.254353 | mae 0.271467 -[2024/06/24 06:23:26] ppsci INFO: train: epoch 56 | step 38 | lr 0.000496 | loss 0.046886 | mae 0.203578 -[2024/06/24 06:23:26] ppsci INFO: epoch: 56, train_loss: 0.105999, train_metric: 0.226099, eval_loss: 0.101236, eval_mae: 0.219531 -[2024/06/24 06:23:26] ppsci INFO: train: epoch 57 | step 0 | lr 0.000496 | loss 0.073599 | mae 0.203775 -[2024/06/24 06:23:27] ppsci INFO: train: epoch 57 | step 10 | lr 0.000496 | loss 0.123188 | mae 0.250834 -[2024/06/24 06:23:27] ppsci INFO: train: epoch 57 | step 20 | lr 0.000496 | loss 0.130315 | mae 0.239079 -[2024/06/24 06:23:28] ppsci INFO: train: epoch 57 | step 30 | lr 0.000496 | loss 0.098617 | mae 0.228048 -[2024/06/24 06:23:28] ppsci INFO: train: epoch 57 | step 38 | lr 0.000496 | loss 0.093595 | mae 0.256901 -[2024/06/24 06:23:28] ppsci INFO: epoch: 57, train_loss: 0.120545, train_metric: 0.228767, eval_loss: 0.095019, eval_mae: 0.217055 -[2024/06/24 06:23:28] ppsci INFO: train: epoch 58 | step 0 | lr 0.000496 | loss 0.085970 | mae 0.208017 -[2024/06/24 06:23:29] ppsci INFO: train: epoch 58 | step 10 | lr 0.000496 | loss 0.096872 | mae 0.225213 -[2024/06/24 06:23:29] ppsci INFO: train: epoch 58 | step 20 | lr 0.000496 | loss 0.096573 | mae 0.208151 -[2024/06/24 06:23:30] ppsci INFO: train: epoch 58 | step 30 | lr 0.000496 | loss 0.113180 | mae 0.215172 -[2024/06/24 06:23:30] ppsci INFO: train: epoch 58 | step 38 | lr 0.000496 | loss 0.104005 | mae 0.175164 -[2024/06/24 06:23:30] ppsci INFO: epoch: 58, train_loss: 0.117423, train_metric: 0.226681, eval_loss: 0.098190, eval_mae: 0.219358 -[2024/06/24 06:23:30] ppsci INFO: train: epoch 59 | step 0 | lr 0.000496 | loss 0.108743 | mae 0.219792 -[2024/06/24 06:23:31] ppsci INFO: train: epoch 59 | step 10 | lr 0.000496 | loss 0.060461 | mae 0.186786 -[2024/06/24 06:23:31] ppsci INFO: train: epoch 59 | step 20 | lr 0.000496 | loss 0.084494 | mae 0.206338 -[2024/06/24 06:23:32] ppsci INFO: train: epoch 59 | step 30 | lr 0.000496 | loss 0.086185 | mae 0.213284 -[2024/06/24 06:23:32] ppsci INFO: train: epoch 59 | step 38 | lr 0.000496 | loss 0.057048 | mae 0.174591 -[2024/06/24 06:23:32] ppsci INFO: epoch: 59, train_loss: 0.108214, train_metric: 0.220726, eval_loss: 0.094544, eval_mae: 0.217713 -[2024/06/24 06:23:33] ppsci INFO: train: epoch 60 | step 0 | lr 0.000496 | loss 0.160297 | mae 0.235070 -[2024/06/24 06:23:33] ppsci INFO: train: epoch 60 | step 10 | lr 0.000496 | loss 0.133247 | mae 0.255953 -[2024/06/24 06:23:34] ppsci INFO: train: epoch 60 | step 20 | lr 0.000496 | loss 0.081580 | mae 0.195442 -[2024/06/24 06:23:34] ppsci INFO: train: epoch 60 | step 30 | lr 0.000496 | loss 0.095150 | mae 0.222392 -[2024/06/24 06:23:34] ppsci INFO: train: epoch 60 | step 38 | lr 0.000496 | loss 0.057217 | mae 0.199990 -[2024/06/24 06:23:34] ppsci INFO: epoch: 60, train_loss: 0.116967, train_metric: 0.228205, eval_loss: 0.095926, eval_mae: 0.214988 -[2024/06/24 06:23:35] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:23:35] ppsci INFO: train: epoch 61 | step 0 | lr 0.000496 | loss 0.086760 | mae 0.210035 -[2024/06/24 06:23:35] ppsci INFO: train: epoch 61 | step 10 | lr 0.000496 | loss 0.086900 | mae 0.206783 -[2024/06/24 06:23:36] ppsci INFO: train: epoch 61 | step 20 | lr 0.000496 | loss 0.110436 | mae 0.226256 -[2024/06/24 06:23:36] ppsci INFO: train: epoch 61 | step 30 | lr 0.000496 | loss 0.242733 | mae 0.314645 -[2024/06/24 06:23:36] ppsci INFO: train: epoch 61 | step 38 | lr 0.000496 | loss 0.082656 | mae 0.235349 -[2024/06/24 06:23:37] ppsci INFO: epoch: 61, train_loss: 0.116859, train_metric: 0.231121, eval_loss: 0.093404, eval_mae: 0.219276 -[2024/06/24 06:23:37] ppsci INFO: train: epoch 62 | step 0 | lr 0.000495 | loss 0.078300 | mae 0.194961 -[2024/06/24 06:23:37] ppsci INFO: train: epoch 62 | step 10 | lr 0.000495 | loss 0.068275 | mae 0.192456 -[2024/06/24 06:23:38] ppsci INFO: train: epoch 62 | step 20 | lr 0.000495 | loss 0.140821 | mae 0.260642 -[2024/06/24 06:23:38] ppsci INFO: train: epoch 62 | step 30 | lr 0.000495 | loss 0.144970 | mae 0.266743 -[2024/06/24 06:23:39] ppsci INFO: train: epoch 62 | step 38 | lr 0.000495 | loss 0.104881 | mae 0.237776 -[2024/06/24 06:23:39] ppsci INFO: epoch: 62, train_loss: 0.113377, train_metric: 0.226790, eval_loss: 0.090263, eval_mae: 0.216389 -[2024/06/24 06:23:39] ppsci INFO: train: epoch 63 | step 0 | lr 0.000495 | loss 0.105957 | mae 0.212361 -[2024/06/24 06:23:39] ppsci INFO: train: epoch 63 | step 10 | lr 0.000495 | loss 0.115359 | mae 0.228898 -[2024/06/24 06:23:40] ppsci INFO: train: epoch 63 | step 20 | lr 0.000495 | loss 0.084115 | mae 0.201410 -[2024/06/24 06:23:41] ppsci INFO: train: epoch 63 | step 30 | lr 0.000495 | loss 0.085185 | mae 0.209092 -[2024/06/24 06:23:41] ppsci INFO: train: epoch 63 | step 38 | lr 0.000495 | loss 0.036443 | mae 0.140882 -[2024/06/24 06:23:41] ppsci INFO: epoch: 63, train_loss: 0.107413, train_metric: 0.222867, eval_loss: 0.092655, eval_mae: 0.216938 -[2024/06/24 06:23:41] ppsci INFO: train: epoch 64 | step 0 | lr 0.000495 | loss 0.086809 | mae 0.223095 -[2024/06/24 06:23:42] ppsci INFO: train: epoch 64 | step 10 | lr 0.000495 | loss 0.082902 | mae 0.205356 -[2024/06/24 06:23:42] ppsci INFO: train: epoch 64 | step 20 | lr 0.000495 | loss 0.122231 | mae 0.249872 -[2024/06/24 06:23:43] ppsci INFO: train: epoch 64 | step 30 | lr 0.000495 | loss 0.106891 | mae 0.214034 -[2024/06/24 06:23:43] ppsci INFO: train: epoch 64 | step 38 | lr 0.000495 | loss 0.054813 | mae 0.191268 -[2024/06/24 06:23:43] ppsci INFO: epoch: 64, train_loss: 0.107085, train_metric: 0.227716, eval_loss: 0.091028, eval_mae: 0.217717 -[2024/06/24 06:23:43] ppsci INFO: train: epoch 65 | step 0 | lr 0.000495 | loss 0.121234 | mae 0.238793 -[2024/06/24 06:23:44] ppsci INFO: train: epoch 65 | step 10 | lr 0.000495 | loss 0.157658 | mae 0.245118 -[2024/06/24 06:23:44] ppsci INFO: train: epoch 65 | step 20 | lr 0.000495 | loss 0.130042 | mae 0.213926 -[2024/06/24 06:23:45] ppsci INFO: train: epoch 65 | step 30 | lr 0.000495 | loss 0.096975 | mae 0.204160 -[2024/06/24 06:23:45] ppsci INFO: train: epoch 65 | step 38 | lr 0.000495 | loss 0.177068 | mae 0.297240 -[2024/06/24 06:23:45] ppsci INFO: epoch: 65, train_loss: 0.116139, train_metric: 0.222700, eval_loss: 0.086833, eval_mae: 0.215921 -[2024/06/24 06:23:45] ppsci INFO: train: epoch 66 | step 0 | lr 0.000495 | loss 0.101661 | mae 0.244257 -[2024/06/24 06:23:46] ppsci INFO: train: epoch 66 | step 10 | lr 0.000495 | loss 0.098462 | mae 0.222660 -[2024/06/24 06:23:46] ppsci INFO: train: epoch 66 | step 20 | lr 0.000495 | loss 0.133797 | mae 0.237266 -[2024/06/24 06:23:47] ppsci INFO: train: epoch 66 | step 30 | lr 0.000495 | loss 0.083702 | mae 0.214118 -[2024/06/24 06:23:47] ppsci INFO: train: epoch 66 | step 38 | lr 0.000495 | loss 0.038343 | mae 0.153369 -[2024/06/24 06:23:47] ppsci INFO: epoch: 66, train_loss: 0.103711, train_metric: 0.222072, eval_loss: 0.091149, eval_mae: 0.213789 -[2024/06/24 06:23:47] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:23:47] ppsci INFO: train: epoch 67 | step 0 | lr 0.000495 | loss 0.068925 | mae 0.197752 -[2024/06/24 06:23:48] ppsci INFO: train: epoch 67 | step 10 | lr 0.000495 | loss 0.251944 | mae 0.252720 -[2024/06/24 06:23:48] ppsci INFO: train: epoch 67 | step 20 | lr 0.000495 | loss 0.083569 | mae 0.197040 -[2024/06/24 06:23:49] ppsci INFO: train: epoch 67 | step 30 | lr 0.000495 | loss 0.144972 | mae 0.252327 -[2024/06/24 06:23:49] ppsci INFO: train: epoch 67 | step 38 | lr 0.000495 | loss 0.046498 | mae 0.185285 -[2024/06/24 06:23:49] ppsci INFO: epoch: 67, train_loss: 0.106661, train_metric: 0.218254, eval_loss: 0.096580, eval_mae: 0.215748 -[2024/06/24 06:23:50] ppsci INFO: train: epoch 68 | step 0 | lr 0.000494 | loss 0.236595 | mae 0.256171 -[2024/06/24 06:23:50] ppsci INFO: train: epoch 68 | step 10 | lr 0.000494 | loss 0.112485 | mae 0.226105 -[2024/06/24 06:23:51] ppsci INFO: train: epoch 68 | step 20 | lr 0.000494 | loss 0.102666 | mae 0.216864 -[2024/06/24 06:23:51] ppsci INFO: train: epoch 68 | step 30 | lr 0.000494 | loss 0.105045 | mae 0.239617 -[2024/06/24 06:23:52] ppsci INFO: train: epoch 68 | step 38 | lr 0.000494 | loss 0.085408 | mae 0.219167 -[2024/06/24 06:23:52] ppsci INFO: epoch: 68, train_loss: 0.113699, train_metric: 0.220488, eval_loss: 0.096040, eval_mae: 0.210576 -[2024/06/24 06:23:52] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:23:52] ppsci INFO: train: epoch 69 | step 0 | lr 0.000494 | loss 0.109457 | mae 0.231482 -[2024/06/24 06:23:52] ppsci INFO: train: epoch 69 | step 10 | lr 0.000494 | loss 0.123118 | mae 0.237743 -[2024/06/24 06:23:53] ppsci INFO: train: epoch 69 | step 20 | lr 0.000494 | loss 0.079744 | mae 0.202467 -[2024/06/24 06:23:53] ppsci INFO: train: epoch 69 | step 30 | lr 0.000494 | loss 0.084862 | mae 0.202515 -[2024/06/24 06:23:54] ppsci INFO: train: epoch 69 | step 38 | lr 0.000494 | loss 0.038881 | mae 0.165157 -[2024/06/24 06:23:54] ppsci INFO: epoch: 69, train_loss: 0.110927, train_metric: 0.225240, eval_loss: 0.094452, eval_mae: 0.214881 -[2024/06/24 06:23:54] ppsci INFO: train: epoch 70 | step 0 | lr 0.000494 | loss 0.134666 | mae 0.241534 -[2024/06/24 06:23:55] ppsci INFO: train: epoch 70 | step 10 | lr 0.000494 | loss 0.073304 | mae 0.198460 -[2024/06/24 06:23:55] ppsci INFO: train: epoch 70 | step 20 | lr 0.000494 | loss 0.228681 | mae 0.261878 -[2024/06/24 06:23:56] ppsci INFO: train: epoch 70 | step 30 | lr 0.000494 | loss 0.117455 | mae 0.239612 -[2024/06/24 06:23:56] ppsci INFO: train: epoch 70 | step 38 | lr 0.000494 | loss 0.091788 | mae 0.253001 -[2024/06/24 06:23:56] ppsci INFO: epoch: 70, train_loss: 0.109861, train_metric: 0.221976, eval_loss: 0.094155, eval_mae: 0.212869 -[2024/06/24 06:23:56] ppsci INFO: train: epoch 71 | step 0 | lr 0.000494 | loss 0.085373 | mae 0.202194 -[2024/06/24 06:23:57] ppsci INFO: train: epoch 71 | step 10 | lr 0.000494 | loss 0.101407 | mae 0.220225 -[2024/06/24 06:23:57] ppsci INFO: train: epoch 71 | step 20 | lr 0.000494 | loss 0.070500 | mae 0.181350 -[2024/06/24 06:23:58] ppsci INFO: train: epoch 71 | step 30 | lr 0.000494 | loss 0.119503 | mae 0.250567 -[2024/06/24 06:23:58] ppsci INFO: train: epoch 71 | step 38 | lr 0.000494 | loss 0.115981 | mae 0.261141 -[2024/06/24 06:23:58] ppsci INFO: epoch: 71, train_loss: 0.106264, train_metric: 0.219442, eval_loss: 0.088012, eval_mae: 0.215135 -[2024/06/24 06:23:58] ppsci INFO: train: epoch 72 | step 0 | lr 0.000494 | loss 0.083602 | mae 0.210241 -[2024/06/24 06:23:59] ppsci INFO: train: epoch 72 | step 10 | lr 0.000494 | loss 0.078886 | mae 0.210581 -[2024/06/24 06:23:59] ppsci INFO: train: epoch 72 | step 20 | lr 0.000494 | loss 0.103250 | mae 0.230674 -[2024/06/24 06:24:00] ppsci INFO: train: epoch 72 | step 30 | lr 0.000494 | loss 0.119878 | mae 0.249387 -[2024/06/24 06:24:00] ppsci INFO: train: epoch 72 | step 38 | lr 0.000494 | loss 0.069917 | mae 0.219154 -[2024/06/24 06:24:00] ppsci INFO: epoch: 72, train_loss: 0.112350, train_metric: 0.222070, eval_loss: 0.086540, eval_mae: 0.210674 -[2024/06/24 06:24:01] ppsci INFO: train: epoch 73 | step 0 | lr 0.000494 | loss 0.072919 | mae 0.196319 -[2024/06/24 06:24:01] ppsci INFO: train: epoch 73 | step 10 | lr 0.000494 | loss 0.144917 | mae 0.261389 -[2024/06/24 06:24:02] ppsci INFO: train: epoch 73 | step 20 | lr 0.000494 | loss 0.074823 | mae 0.191206 -[2024/06/24 06:24:02] ppsci INFO: train: epoch 73 | step 30 | lr 0.000494 | loss 0.080445 | mae 0.193247 -[2024/06/24 06:24:03] ppsci INFO: train: epoch 73 | step 38 | lr 0.000494 | loss 0.136341 | mae 0.259063 -[2024/06/24 06:24:03] ppsci INFO: epoch: 73, train_loss: 0.104603, train_metric: 0.220533, eval_loss: 0.087599, eval_mae: 0.220776 -[2024/06/24 06:24:03] ppsci INFO: train: epoch 74 | step 0 | lr 0.000493 | loss 0.062128 | mae 0.184926 -[2024/06/24 06:24:03] ppsci INFO: train: epoch 74 | step 10 | lr 0.000493 | loss 0.082000 | mae 0.218254 -[2024/06/24 06:24:04] ppsci INFO: train: epoch 74 | step 20 | lr 0.000493 | loss 0.113517 | mae 0.222497 -[2024/06/24 06:24:04] ppsci INFO: train: epoch 74 | step 30 | lr 0.000493 | loss 0.085806 | mae 0.209783 -[2024/06/24 06:24:05] ppsci INFO: train: epoch 74 | step 38 | lr 0.000493 | loss 0.060779 | mae 0.192381 -[2024/06/24 06:24:05] ppsci INFO: epoch: 74, train_loss: 0.106603, train_metric: 0.219608, eval_loss: 0.083463, eval_mae: 0.212327 -[2024/06/24 06:24:05] ppsci INFO: train: epoch 75 | step 0 | lr 0.000493 | loss 0.138506 | mae 0.240233 -[2024/06/24 06:24:05] ppsci INFO: train: epoch 75 | step 10 | lr 0.000493 | loss 0.111788 | mae 0.221490 -[2024/06/24 06:24:06] ppsci INFO: train: epoch 75 | step 20 | lr 0.000493 | loss 0.070577 | mae 0.196561 -[2024/06/24 06:24:06] ppsci INFO: train: epoch 75 | step 30 | lr 0.000493 | loss 0.075117 | mae 0.190106 -[2024/06/24 06:24:07] ppsci INFO: train: epoch 75 | step 38 | lr 0.000493 | loss 0.303976 | mae 0.357958 -[2024/06/24 06:24:07] ppsci INFO: epoch: 75, train_loss: 0.108038, train_metric: 0.217987, eval_loss: 0.087903, eval_mae: 0.207927 -[2024/06/24 06:24:07] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:24:07] ppsci INFO: train: epoch 76 | step 0 | lr 0.000493 | loss 0.104697 | mae 0.225165 -[2024/06/24 06:24:08] ppsci INFO: train: epoch 76 | step 10 | lr 0.000493 | loss 0.060154 | mae 0.177418 -[2024/06/24 06:24:08] ppsci INFO: train: epoch 76 | step 20 | lr 0.000493 | loss 0.078446 | mae 0.197380 -[2024/06/24 06:24:09] ppsci INFO: train: epoch 76 | step 30 | lr 0.000493 | loss 0.087019 | mae 0.206218 -[2024/06/24 06:24:09] ppsci INFO: train: epoch 76 | step 38 | lr 0.000493 | loss 0.123688 | mae 0.240320 -[2024/06/24 06:24:09] ppsci INFO: epoch: 76, train_loss: 0.109141, train_metric: 0.220266, eval_loss: 0.084253, eval_mae: 0.207302 -[2024/06/24 06:24:09] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:24:09] ppsci INFO: train: epoch 77 | step 0 | lr 0.000493 | loss 0.095875 | mae 0.216668 -[2024/06/24 06:24:10] ppsci INFO: train: epoch 77 | step 10 | lr 0.000493 | loss 0.097843 | mae 0.217414 -[2024/06/24 06:24:10] ppsci INFO: train: epoch 77 | step 20 | lr 0.000493 | loss 0.065200 | mae 0.188787 -[2024/06/24 06:24:11] ppsci INFO: train: epoch 77 | step 30 | lr 0.000493 | loss 0.112544 | mae 0.236657 -[2024/06/24 06:24:11] ppsci INFO: train: epoch 77 | step 38 | lr 0.000493 | loss 0.026088 | mae 0.141870 -[2024/06/24 06:24:11] ppsci INFO: epoch: 77, train_loss: 0.106074, train_metric: 0.221517, eval_loss: 0.086155, eval_mae: 0.210431 -[2024/06/24 06:24:11] ppsci INFO: train: epoch 78 | step 0 | lr 0.000493 | loss 0.086623 | mae 0.206898 -[2024/06/24 06:24:12] ppsci INFO: train: epoch 78 | step 10 | lr 0.000493 | loss 0.115434 | mae 0.231269 -[2024/06/24 06:24:12] ppsci INFO: train: epoch 78 | step 20 | lr 0.000493 | loss 0.125106 | mae 0.237904 -[2024/06/24 06:24:13] ppsci INFO: train: epoch 78 | step 30 | lr 0.000493 | loss 0.099083 | mae 0.223856 -[2024/06/24 06:24:13] ppsci INFO: train: epoch 78 | step 38 | lr 0.000493 | loss 0.121492 | mae 0.255096 -[2024/06/24 06:24:13] ppsci INFO: epoch: 78, train_loss: 0.114409, train_metric: 0.222665, eval_loss: 0.083937, eval_mae: 0.206393 -[2024/06/24 06:24:13] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:24:14] ppsci INFO: train: epoch 79 | step 0 | lr 0.000492 | loss 0.120664 | mae 0.219317 -[2024/06/24 06:24:14] ppsci INFO: train: epoch 79 | step 10 | lr 0.000492 | loss 0.099800 | mae 0.196415 -[2024/06/24 06:24:15] ppsci INFO: train: epoch 79 | step 20 | lr 0.000492 | loss 0.222715 | mae 0.212160 -[2024/06/24 06:24:15] ppsci INFO: train: epoch 79 | step 30 | lr 0.000492 | loss 0.073088 | mae 0.207138 -[2024/06/24 06:24:16] ppsci INFO: train: epoch 79 | step 38 | lr 0.000492 | loss 0.050965 | mae 0.173563 -[2024/06/24 06:24:16] ppsci INFO: epoch: 79, train_loss: 0.099976, train_metric: 0.210855, eval_loss: 0.084080, eval_mae: 0.209484 -[2024/06/24 06:24:16] ppsci INFO: train: epoch 80 | step 0 | lr 0.000492 | loss 0.072029 | mae 0.201274 -[2024/06/24 06:24:16] ppsci INFO: train: epoch 80 | step 10 | lr 0.000492 | loss 0.160161 | mae 0.261719 -[2024/06/24 06:24:17] ppsci INFO: train: epoch 80 | step 20 | lr 0.000492 | loss 0.066074 | mae 0.183387 -[2024/06/24 06:24:17] ppsci INFO: train: epoch 80 | step 30 | lr 0.000492 | loss 0.074384 | mae 0.197776 -[2024/06/24 06:24:18] ppsci INFO: train: epoch 80 | step 38 | lr 0.000492 | loss 0.179746 | mae 0.306677 -[2024/06/24 06:24:18] ppsci INFO: epoch: 80, train_loss: 0.110833, train_metric: 0.216227, eval_loss: 0.085367, eval_mae: 0.209261 -[2024/06/24 06:24:18] ppsci INFO: train: epoch 81 | step 0 | lr 0.000492 | loss 0.114646 | mae 0.246009 -[2024/06/24 06:24:18] ppsci INFO: train: epoch 81 | step 10 | lr 0.000492 | loss 0.071259 | mae 0.178171 -[2024/06/24 06:24:19] ppsci INFO: train: epoch 81 | step 20 | lr 0.000492 | loss 0.075742 | mae 0.193548 -[2024/06/24 06:24:19] ppsci INFO: train: epoch 81 | step 30 | lr 0.000492 | loss 0.129312 | mae 0.245974 -[2024/06/24 06:24:20] ppsci INFO: train: epoch 81 | step 38 | lr 0.000492 | loss 0.034898 | mae 0.154494 -[2024/06/24 06:24:20] ppsci INFO: epoch: 81, train_loss: 0.108019, train_metric: 0.217559, eval_loss: 0.082426, eval_mae: 0.208908 -[2024/06/24 06:24:20] ppsci INFO: train: epoch 82 | step 0 | lr 0.000492 | loss 0.120184 | mae 0.217736 -[2024/06/24 06:24:21] ppsci INFO: train: epoch 82 | step 10 | lr 0.000492 | loss 0.110803 | mae 0.222853 -[2024/06/24 06:24:21] ppsci INFO: train: epoch 82 | step 20 | lr 0.000492 | loss 0.134582 | mae 0.259538 -[2024/06/24 06:24:22] ppsci INFO: train: epoch 82 | step 30 | lr 0.000492 | loss 0.135843 | mae 0.235412 -[2024/06/24 06:24:22] ppsci INFO: train: epoch 82 | step 38 | lr 0.000492 | loss 0.072155 | mae 0.192330 -[2024/06/24 06:24:22] ppsci INFO: epoch: 82, train_loss: 0.100204, train_metric: 0.216539, eval_loss: 0.084398, eval_mae: 0.206375 -[2024/06/24 06:24:22] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:24:22] ppsci INFO: train: epoch 83 | step 0 | lr 0.000492 | loss 0.071486 | mae 0.196351 -[2024/06/24 06:24:23] ppsci INFO: train: epoch 83 | step 10 | lr 0.000492 | loss 0.087416 | mae 0.206770 -[2024/06/24 06:24:23] ppsci INFO: train: epoch 83 | step 20 | lr 0.000492 | loss 0.244383 | mae 0.238940 -[2024/06/24 06:24:24] ppsci INFO: train: epoch 83 | step 30 | lr 0.000492 | loss 0.076760 | mae 0.200104 -[2024/06/24 06:24:24] ppsci INFO: train: epoch 83 | step 38 | lr 0.000492 | loss 0.098631 | mae 0.248765 -[2024/06/24 06:24:24] ppsci INFO: epoch: 83, train_loss: 0.106712, train_metric: 0.217888, eval_loss: 0.087871, eval_mae: 0.205256 -[2024/06/24 06:24:24] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:24:24] ppsci INFO: train: epoch 84 | step 0 | lr 0.000492 | loss 0.075236 | mae 0.202045 -[2024/06/24 06:24:25] ppsci INFO: train: epoch 84 | step 10 | lr 0.000492 | loss 0.124621 | mae 0.257025 -[2024/06/24 06:24:25] ppsci INFO: train: epoch 84 | step 20 | lr 0.000492 | loss 0.059869 | mae 0.187124 -[2024/06/24 06:24:26] ppsci INFO: train: epoch 84 | step 30 | lr 0.000492 | loss 0.102129 | mae 0.227205 -[2024/06/24 06:24:26] ppsci INFO: train: epoch 84 | step 38 | lr 0.000492 | loss 0.091630 | mae 0.236192 -[2024/06/24 06:24:26] ppsci INFO: epoch: 84, train_loss: 0.098390, train_metric: 0.216970, eval_loss: 0.094374, eval_mae: 0.217505 -[2024/06/24 06:24:27] ppsci INFO: train: epoch 85 | step 0 | lr 0.000491 | loss 0.091090 | mae 0.219555 -[2024/06/24 06:24:27] ppsci INFO: train: epoch 85 | step 10 | lr 0.000491 | loss 0.164977 | mae 0.238484 -[2024/06/24 06:24:28] ppsci INFO: train: epoch 85 | step 20 | lr 0.000491 | loss 0.069321 | mae 0.191397 -[2024/06/24 06:24:28] ppsci INFO: train: epoch 85 | step 30 | lr 0.000491 | loss 0.099408 | mae 0.214750 -[2024/06/24 06:24:28] ppsci INFO: train: epoch 85 | step 38 | lr 0.000491 | loss 0.035549 | mae 0.154408 -[2024/06/24 06:24:29] ppsci INFO: epoch: 85, train_loss: 0.107987, train_metric: 0.222273, eval_loss: 0.084024, eval_mae: 0.206361 -[2024/06/24 06:24:29] ppsci INFO: train: epoch 86 | step 0 | lr 0.000491 | loss 0.101236 | mae 0.219718 -[2024/06/24 06:24:29] ppsci INFO: train: epoch 86 | step 10 | lr 0.000491 | loss 0.091659 | mae 0.212593 -[2024/06/24 06:24:30] ppsci INFO: train: epoch 86 | step 20 | lr 0.000491 | loss 0.103687 | mae 0.226834 -[2024/06/24 06:24:30] ppsci INFO: train: epoch 86 | step 30 | lr 0.000491 | loss 0.111289 | mae 0.235698 -[2024/06/24 06:24:31] ppsci INFO: train: epoch 86 | step 38 | lr 0.000491 | loss 0.055849 | mae 0.199521 -[2024/06/24 06:24:31] ppsci INFO: epoch: 86, train_loss: 0.099593, train_metric: 0.220506, eval_loss: 0.083213, eval_mae: 0.208536 -[2024/06/24 06:24:31] ppsci INFO: train: epoch 87 | step 0 | lr 0.000491 | loss 0.090200 | mae 0.205382 -[2024/06/24 06:24:31] ppsci INFO: train: epoch 87 | step 10 | lr 0.000491 | loss 0.098785 | mae 0.217212 -[2024/06/24 06:24:32] ppsci INFO: train: epoch 87 | step 20 | lr 0.000491 | loss 0.123198 | mae 0.234528 -[2024/06/24 06:24:32] ppsci INFO: train: epoch 87 | step 30 | lr 0.000491 | loss 0.099416 | mae 0.229148 -[2024/06/24 06:24:33] ppsci INFO: train: epoch 87 | step 38 | lr 0.000491 | loss 0.039955 | mae 0.154135 -[2024/06/24 06:24:33] ppsci INFO: epoch: 87, train_loss: 0.101663, train_metric: 0.215344, eval_loss: 0.079781, eval_mae: 0.205650 -[2024/06/24 06:24:33] ppsci INFO: train: epoch 88 | step 0 | lr 0.000491 | loss 0.096752 | mae 0.228752 -[2024/06/24 06:24:33] ppsci INFO: train: epoch 88 | step 10 | lr 0.000491 | loss 0.106540 | mae 0.224865 -[2024/06/24 06:24:34] ppsci INFO: train: epoch 88 | step 20 | lr 0.000491 | loss 0.095213 | mae 0.216289 -[2024/06/24 06:24:34] ppsci INFO: train: epoch 88 | step 30 | lr 0.000491 | loss 0.075081 | mae 0.196136 -[2024/06/24 06:24:35] ppsci INFO: train: epoch 88 | step 38 | lr 0.000491 | loss 0.150514 | mae 0.253892 -[2024/06/24 06:24:35] ppsci INFO: epoch: 88, train_loss: 0.099898, train_metric: 0.214381, eval_loss: 0.086718, eval_mae: 0.206699 -[2024/06/24 06:24:35] ppsci INFO: train: epoch 89 | step 0 | lr 0.000490 | loss 0.246431 | mae 0.253785 -[2024/06/24 06:24:36] ppsci INFO: train: epoch 89 | step 10 | lr 0.000490 | loss 0.108908 | mae 0.236031 -[2024/06/24 06:24:36] ppsci INFO: train: epoch 89 | step 20 | lr 0.000490 | loss 0.094536 | mae 0.202173 -[2024/06/24 06:24:37] ppsci INFO: train: epoch 89 | step 30 | lr 0.000490 | loss 0.077131 | mae 0.205016 -[2024/06/24 06:24:37] ppsci INFO: train: epoch 89 | step 38 | lr 0.000490 | loss 0.236356 | mae 0.374209 -[2024/06/24 06:24:37] ppsci INFO: epoch: 89, train_loss: 0.105520, train_metric: 0.217166, eval_loss: 0.086613, eval_mae: 0.205665 -[2024/06/24 06:24:37] ppsci INFO: train: epoch 90 | step 0 | lr 0.000490 | loss 0.054936 | mae 0.173965 -[2024/06/24 06:24:38] ppsci INFO: train: epoch 90 | step 10 | lr 0.000490 | loss 0.075019 | mae 0.197088 -[2024/06/24 06:24:39] ppsci INFO: train: epoch 90 | step 20 | lr 0.000490 | loss 0.081756 | mae 0.208543 -[2024/06/24 06:24:39] ppsci INFO: train: epoch 90 | step 30 | lr 0.000490 | loss 0.110338 | mae 0.215016 -[2024/06/24 06:24:39] ppsci INFO: train: epoch 90 | step 38 | lr 0.000490 | loss 0.094179 | mae 0.247189 -[2024/06/24 06:24:40] ppsci INFO: epoch: 90, train_loss: 0.105387, train_metric: 0.217929, eval_loss: 0.080178, eval_mae: 0.207003 -[2024/06/24 06:24:40] ppsci INFO: train: epoch 91 | step 0 | lr 0.000490 | loss 0.096878 | mae 0.216436 -[2024/06/24 06:24:40] ppsci INFO: train: epoch 91 | step 10 | lr 0.000490 | loss 0.094441 | mae 0.206468 -[2024/06/24 06:24:41] ppsci INFO: train: epoch 91 | step 20 | lr 0.000490 | loss 0.080226 | mae 0.189584 -[2024/06/24 06:24:41] ppsci INFO: train: epoch 91 | step 30 | lr 0.000490 | loss 0.085958 | mae 0.203723 -[2024/06/24 06:24:42] ppsci INFO: train: epoch 91 | step 38 | lr 0.000490 | loss 1.435208 | mae 0.548946 -[2024/06/24 06:24:42] ppsci INFO: epoch: 91, train_loss: 0.129136, train_metric: 0.210487, eval_loss: 0.081089, eval_mae: 0.205924 -[2024/06/24 06:24:42] ppsci INFO: train: epoch 92 | step 0 | lr 0.000490 | loss 0.107871 | mae 0.231539 -[2024/06/24 06:24:42] ppsci INFO: train: epoch 92 | step 10 | lr 0.000490 | loss 0.100551 | mae 0.219018 -[2024/06/24 06:24:43] ppsci INFO: train: epoch 92 | step 20 | lr 0.000490 | loss 0.149793 | mae 0.264647 -[2024/06/24 06:24:43] ppsci INFO: train: epoch 92 | step 30 | lr 0.000490 | loss 0.086062 | mae 0.218540 -[2024/06/24 06:24:44] ppsci INFO: train: epoch 92 | step 38 | lr 0.000490 | loss 0.062193 | mae 0.170724 -[2024/06/24 06:24:44] ppsci INFO: epoch: 92, train_loss: 0.100199, train_metric: 0.216681, eval_loss: 0.084878, eval_mae: 0.207309 -[2024/06/24 06:24:44] ppsci INFO: train: epoch 93 | step 0 | lr 0.000490 | loss 0.085656 | mae 0.206151 -[2024/06/24 06:24:44] ppsci INFO: train: epoch 93 | step 10 | lr 0.000490 | loss 0.094932 | mae 0.237866 -[2024/06/24 06:24:45] ppsci INFO: train: epoch 93 | step 20 | lr 0.000490 | loss 0.137530 | mae 0.237265 -[2024/06/24 06:24:45] ppsci INFO: train: epoch 93 | step 30 | lr 0.000490 | loss 0.105030 | mae 0.229094 -[2024/06/24 06:24:46] ppsci INFO: train: epoch 93 | step 38 | lr 0.000490 | loss 0.069581 | mae 0.205319 -[2024/06/24 06:24:46] ppsci INFO: epoch: 93, train_loss: 0.103938, train_metric: 0.214943, eval_loss: 0.088188, eval_mae: 0.200782 -[2024/06/24 06:24:46] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:24:46] ppsci INFO: train: epoch 94 | step 0 | lr 0.000489 | loss 0.079874 | mae 0.200329 -[2024/06/24 06:24:46] ppsci INFO: train: epoch 94 | step 10 | lr 0.000489 | loss 0.083338 | mae 0.195353 -[2024/06/24 06:24:47] ppsci INFO: train: epoch 94 | step 20 | lr 0.000489 | loss 0.076828 | mae 0.196316 -[2024/06/24 06:24:47] ppsci INFO: train: epoch 94 | step 30 | lr 0.000489 | loss 0.073085 | mae 0.178959 -[2024/06/24 06:24:48] ppsci INFO: train: epoch 94 | step 38 | lr 0.000489 | loss 0.111788 | mae 0.251834 -[2024/06/24 06:24:48] ppsci INFO: epoch: 94, train_loss: 0.103967, train_metric: 0.215506, eval_loss: 0.079403, eval_mae: 0.203170 -[2024/06/24 06:24:48] ppsci INFO: train: epoch 95 | step 0 | lr 0.000489 | loss 0.087554 | mae 0.207156 -[2024/06/24 06:24:49] ppsci INFO: train: epoch 95 | step 10 | lr 0.000489 | loss 0.100718 | mae 0.230368 -[2024/06/24 06:24:49] ppsci INFO: train: epoch 95 | step 20 | lr 0.000489 | loss 0.107744 | mae 0.224402 -[2024/06/24 06:24:50] ppsci INFO: train: epoch 95 | step 30 | lr 0.000489 | loss 0.103883 | mae 0.214715 -[2024/06/24 06:24:50] ppsci INFO: train: epoch 95 | step 38 | lr 0.000489 | loss 0.123601 | mae 0.263925 -[2024/06/24 06:24:50] ppsci INFO: epoch: 95, train_loss: 0.107075, train_metric: 0.216827, eval_loss: 0.085721, eval_mae: 0.210269 -[2024/06/24 06:24:50] ppsci INFO: train: epoch 96 | step 0 | lr 0.000489 | loss 0.083633 | mae 0.208317 -[2024/06/24 06:24:51] ppsci INFO: train: epoch 96 | step 10 | lr 0.000489 | loss 0.079202 | mae 0.194876 -[2024/06/24 06:24:51] ppsci INFO: train: epoch 96 | step 20 | lr 0.000489 | loss 0.100291 | mae 0.226086 -[2024/06/24 06:24:52] ppsci INFO: train: epoch 96 | step 30 | lr 0.000489 | loss 0.104721 | mae 0.223104 -[2024/06/24 06:24:52] ppsci INFO: train: epoch 96 | step 38 | lr 0.000489 | loss 0.109116 | mae 0.246088 -[2024/06/24 06:24:52] ppsci INFO: epoch: 96, train_loss: 0.100374, train_metric: 0.215974, eval_loss: 0.086588, eval_mae: 0.203534 -[2024/06/24 06:24:52] ppsci INFO: train: epoch 97 | step 0 | lr 0.000489 | loss 0.073550 | mae 0.198210 -[2024/06/24 06:24:53] ppsci INFO: train: epoch 97 | step 10 | lr 0.000489 | loss 0.086444 | mae 0.210121 -[2024/06/24 06:24:53] ppsci INFO: train: epoch 97 | step 20 | lr 0.000489 | loss 0.066909 | mae 0.183659 -[2024/06/24 06:24:54] ppsci INFO: train: epoch 97 | step 30 | lr 0.000489 | loss 0.113451 | mae 0.222583 -[2024/06/24 06:24:54] ppsci INFO: train: epoch 97 | step 38 | lr 0.000489 | loss 0.135635 | mae 0.249786 -[2024/06/24 06:24:54] ppsci INFO: epoch: 97, train_loss: 0.095510, train_metric: 0.212262, eval_loss: 0.081152, eval_mae: 0.203480 -[2024/06/24 06:24:54] ppsci INFO: train: epoch 98 | step 0 | lr 0.000488 | loss 0.091335 | mae 0.214932 -[2024/06/24 06:24:55] ppsci INFO: train: epoch 98 | step 10 | lr 0.000488 | loss 0.079613 | mae 0.208817 -[2024/06/24 06:24:56] ppsci INFO: train: epoch 98 | step 20 | lr 0.000488 | loss 0.083537 | mae 0.194005 -[2024/06/24 06:24:56] ppsci INFO: train: epoch 98 | step 30 | lr 0.000488 | loss 0.072524 | mae 0.209237 -[2024/06/24 06:24:56] ppsci INFO: train: epoch 98 | step 38 | lr 0.000488 | loss 1.410841 | mae 0.536247 -[2024/06/24 06:24:56] ppsci INFO: epoch: 98, train_loss: 0.130985, train_metric: 0.213555, eval_loss: 0.089233, eval_mae: 0.206834 -[2024/06/24 06:24:57] ppsci INFO: train: epoch 99 | step 0 | lr 0.000488 | loss 0.099017 | mae 0.225952 -[2024/06/24 06:24:57] ppsci INFO: train: epoch 99 | step 10 | lr 0.000488 | loss 0.080209 | mae 0.206217 -[2024/06/24 06:24:58] ppsci INFO: train: epoch 99 | step 20 | lr 0.000488 | loss 0.074064 | mae 0.201152 -[2024/06/24 06:24:58] ppsci INFO: train: epoch 99 | step 30 | lr 0.000488 | loss 0.075025 | mae 0.204949 -[2024/06/24 06:24:59] ppsci INFO: train: epoch 99 | step 38 | lr 0.000488 | loss 0.138392 | mae 0.259300 -[2024/06/24 06:24:59] ppsci INFO: epoch: 99, train_loss: 0.102146, train_metric: 0.215050, eval_loss: 0.083508, eval_mae: 0.201164 -[2024/06/24 06:24:59] ppsci INFO: train: epoch 100 | step 0 | lr 0.000488 | loss 0.093396 | mae 0.209047 -[2024/06/24 06:24:59] ppsci INFO: train: epoch 100 | step 10 | lr 0.000488 | loss 0.079216 | mae 0.197172 -[2024/06/24 06:25:00] ppsci INFO: train: epoch 100 | step 20 | lr 0.000488 | loss 0.127587 | mae 0.210382 -[2024/06/24 06:25:00] ppsci INFO: train: epoch 100 | step 30 | lr 0.000488 | loss 0.094063 | mae 0.202911 -[2024/06/24 06:25:01] ppsci INFO: train: epoch 100 | step 38 | lr 0.000488 | loss 0.027629 | mae 0.130247 -[2024/06/24 06:25:01] ppsci INFO: epoch: 100, train_loss: 0.099655, train_metric: 0.212834, eval_loss: 0.074902, eval_mae: 0.204333 -[2024/06/24 06:25:01] ppsci INFO: train: epoch 101 | step 0 | lr 0.000488 | loss 0.069276 | mae 0.198994 -[2024/06/24 06:25:02] ppsci INFO: train: epoch 101 | step 10 | lr 0.000488 | loss 0.088826 | mae 0.216974 -[2024/06/24 06:25:02] ppsci INFO: train: epoch 101 | step 20 | lr 0.000488 | loss 0.062198 | mae 0.178932 -[2024/06/24 06:25:03] ppsci INFO: train: epoch 101 | step 30 | lr 0.000488 | loss 0.229139 | mae 0.250114 -[2024/06/24 06:25:03] ppsci INFO: train: epoch 101 | step 38 | lr 0.000488 | loss 0.039907 | mae 0.155698 -[2024/06/24 06:25:03] ppsci INFO: epoch: 101, train_loss: 0.093579, train_metric: 0.206203, eval_loss: 0.086522, eval_mae: 0.200966 -[2024/06/24 06:25:03] ppsci INFO: train: epoch 102 | step 0 | lr 0.000488 | loss 0.077138 | mae 0.199049 -[2024/06/24 06:25:04] ppsci INFO: train: epoch 102 | step 10 | lr 0.000488 | loss 0.092044 | mae 0.211844 -[2024/06/24 06:25:04] ppsci INFO: train: epoch 102 | step 20 | lr 0.000488 | loss 0.077490 | mae 0.214128 -[2024/06/24 06:25:05] ppsci INFO: train: epoch 102 | step 30 | lr 0.000488 | loss 0.105483 | mae 0.228433 -[2024/06/24 06:25:05] ppsci INFO: train: epoch 102 | step 38 | lr 0.000488 | loss 0.054720 | mae 0.184660 -[2024/06/24 06:25:05] ppsci INFO: epoch: 102, train_loss: 0.103255, train_metric: 0.214051, eval_loss: 0.077629, eval_mae: 0.201809 -[2024/06/24 06:25:05] ppsci INFO: train: epoch 103 | step 0 | lr 0.000487 | loss 0.098563 | mae 0.220597 -[2024/06/24 06:25:06] ppsci INFO: train: epoch 103 | step 10 | lr 0.000487 | loss 0.108046 | mae 0.225467 -[2024/06/24 06:25:06] ppsci INFO: train: epoch 103 | step 20 | lr 0.000487 | loss 0.106057 | mae 0.220741 -[2024/06/24 06:25:07] ppsci INFO: train: epoch 103 | step 30 | lr 0.000487 | loss 0.122092 | mae 0.234529 -[2024/06/24 06:25:07] ppsci INFO: train: epoch 103 | step 38 | lr 0.000487 | loss 0.074531 | mae 0.207945 -[2024/06/24 06:25:07] ppsci INFO: epoch: 103, train_loss: 0.096101, train_metric: 0.209413, eval_loss: 0.085023, eval_mae: 0.202120 -[2024/06/24 06:25:08] ppsci INFO: train: epoch 104 | step 0 | lr 0.000487 | loss 0.083229 | mae 0.209928 -[2024/06/24 06:25:08] ppsci INFO: train: epoch 104 | step 10 | lr 0.000487 | loss 0.074115 | mae 0.188068 -[2024/06/24 06:25:09] ppsci INFO: train: epoch 104 | step 20 | lr 0.000487 | loss 0.142519 | mae 0.260577 -[2024/06/24 06:25:09] ppsci INFO: train: epoch 104 | step 30 | lr 0.000487 | loss 0.105262 | mae 0.226519 -[2024/06/24 06:25:09] ppsci INFO: train: epoch 104 | step 38 | lr 0.000487 | loss 0.030263 | mae 0.143449 -[2024/06/24 06:25:10] ppsci INFO: epoch: 104, train_loss: 0.096753, train_metric: 0.211974, eval_loss: 0.081690, eval_mae: 0.206307 -[2024/06/24 06:25:10] ppsci INFO: train: epoch 105 | step 0 | lr 0.000487 | loss 0.230008 | mae 0.243213 -[2024/06/24 06:25:10] ppsci INFO: train: epoch 105 | step 10 | lr 0.000487 | loss 0.088348 | mae 0.205162 -[2024/06/24 06:25:11] ppsci INFO: train: epoch 105 | step 20 | lr 0.000487 | loss 0.098835 | mae 0.202827 -[2024/06/24 06:25:11] ppsci INFO: train: epoch 105 | step 30 | lr 0.000487 | loss 0.091228 | mae 0.206133 -[2024/06/24 06:25:12] ppsci INFO: train: epoch 105 | step 38 | lr 0.000487 | loss 0.074790 | mae 0.210820 -[2024/06/24 06:25:12] ppsci INFO: epoch: 105, train_loss: 0.100634, train_metric: 0.211074, eval_loss: 0.076410, eval_mae: 0.202476 -[2024/06/24 06:25:12] ppsci INFO: train: epoch 106 | step 0 | lr 0.000487 | loss 0.049419 | mae 0.162316 -[2024/06/24 06:25:12] ppsci INFO: train: epoch 106 | step 10 | lr 0.000487 | loss 0.127005 | mae 0.261635 -[2024/06/24 06:25:13] ppsci INFO: train: epoch 106 | step 20 | lr 0.000487 | loss 0.091003 | mae 0.213301 -[2024/06/24 06:25:13] ppsci INFO: train: epoch 106 | step 30 | lr 0.000487 | loss 0.103255 | mae 0.205291 -[2024/06/24 06:25:14] ppsci INFO: train: epoch 106 | step 38 | lr 0.000487 | loss 0.329924 | mae 0.379711 -[2024/06/24 06:25:14] ppsci INFO: epoch: 106, train_loss: 0.114080, train_metric: 0.215852, eval_loss: 0.082628, eval_mae: 0.199076 -[2024/06/24 06:25:14] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:25:14] ppsci INFO: train: epoch 107 | step 0 | lr 0.000486 | loss 0.102810 | mae 0.228276 -[2024/06/24 06:25:15] ppsci INFO: train: epoch 107 | step 10 | lr 0.000486 | loss 0.108519 | mae 0.219300 -[2024/06/24 06:25:15] ppsci INFO: train: epoch 107 | step 20 | lr 0.000486 | loss 0.096367 | mae 0.219159 -[2024/06/24 06:25:16] ppsci INFO: train: epoch 107 | step 30 | lr 0.000486 | loss 0.089824 | mae 0.204053 -[2024/06/24 06:25:16] ppsci INFO: train: epoch 107 | step 38 | lr 0.000486 | loss 0.080996 | mae 0.206663 -[2024/06/24 06:25:16] ppsci INFO: epoch: 107, train_loss: 0.091038, train_metric: 0.208875, eval_loss: 0.082565, eval_mae: 0.204381 -[2024/06/24 06:25:17] ppsci INFO: train: epoch 108 | step 0 | lr 0.000486 | loss 0.079794 | mae 0.204124 -[2024/06/24 06:25:17] ppsci INFO: train: epoch 108 | step 10 | lr 0.000486 | loss 0.067367 | mae 0.183161 -[2024/06/24 06:25:18] ppsci INFO: train: epoch 108 | step 20 | lr 0.000486 | loss 0.046421 | mae 0.170731 -[2024/06/24 06:25:18] ppsci INFO: train: epoch 108 | step 30 | lr 0.000486 | loss 0.112457 | mae 0.207162 -[2024/06/24 06:25:19] ppsci INFO: train: epoch 108 | step 38 | lr 0.000486 | loss 0.076998 | mae 0.238351 -[2024/06/24 06:25:19] ppsci INFO: epoch: 108, train_loss: 0.097083, train_metric: 0.207751, eval_loss: 0.080076, eval_mae: 0.202106 -[2024/06/24 06:25:19] ppsci INFO: train: epoch 109 | step 0 | lr 0.000486 | loss 0.058377 | mae 0.189319 -[2024/06/24 06:25:19] ppsci INFO: train: epoch 109 | step 10 | lr 0.000486 | loss 0.072033 | mae 0.187405 -[2024/06/24 06:25:20] ppsci INFO: train: epoch 109 | step 20 | lr 0.000486 | loss 0.088516 | mae 0.200476 -[2024/06/24 06:25:20] ppsci INFO: train: epoch 109 | step 30 | lr 0.000486 | loss 0.160792 | mae 0.235127 -[2024/06/24 06:25:21] ppsci INFO: train: epoch 109 | step 38 | lr 0.000486 | loss 0.524033 | mae 0.432160 -[2024/06/24 06:25:21] ppsci INFO: epoch: 109, train_loss: 0.113837, train_metric: 0.211682, eval_loss: 0.086687, eval_mae: 0.200090 -[2024/06/24 06:25:21] ppsci INFO: train: epoch 110 | step 0 | lr 0.000486 | loss 0.071225 | mae 0.188846 -[2024/06/24 06:25:21] ppsci INFO: train: epoch 110 | step 10 | lr 0.000486 | loss 0.072648 | mae 0.192185 -[2024/06/24 06:25:22] ppsci INFO: train: epoch 110 | step 20 | lr 0.000486 | loss 0.075473 | mae 0.205353 -[2024/06/24 06:25:23] ppsci INFO: train: epoch 110 | step 30 | lr 0.000486 | loss 0.079561 | mae 0.190718 -[2024/06/24 06:25:23] ppsci INFO: train: epoch 110 | step 38 | lr 0.000486 | loss 0.055766 | mae 0.190760 -[2024/06/24 06:25:23] ppsci INFO: epoch: 110, train_loss: 0.094319, train_metric: 0.207391, eval_loss: 0.078414, eval_mae: 0.199148 -[2024/06/24 06:25:23] ppsci INFO: train: epoch 111 | step 0 | lr 0.000485 | loss 0.083356 | mae 0.203075 -[2024/06/24 06:25:24] ppsci INFO: train: epoch 111 | step 10 | lr 0.000485 | loss 0.088033 | mae 0.207078 -[2024/06/24 06:25:24] ppsci INFO: train: epoch 111 | step 20 | lr 0.000485 | loss 0.076512 | mae 0.191162 -[2024/06/24 06:25:25] ppsci INFO: train: epoch 111 | step 30 | lr 0.000485 | loss 0.064845 | mae 0.198256 -[2024/06/24 06:25:25] ppsci INFO: train: epoch 111 | step 38 | lr 0.000485 | loss 0.007903 | mae 0.076107 -[2024/06/24 06:25:25] ppsci INFO: epoch: 111, train_loss: 0.101939, train_metric: 0.210841, eval_loss: 0.079451, eval_mae: 0.199973 -[2024/06/24 06:25:25] ppsci INFO: train: epoch 112 | step 0 | lr 0.000485 | loss 0.087365 | mae 0.200192 -[2024/06/24 06:25:26] ppsci INFO: train: epoch 112 | step 10 | lr 0.000485 | loss 0.079158 | mae 0.198931 -[2024/06/24 06:25:26] ppsci INFO: train: epoch 112 | step 20 | lr 0.000485 | loss 0.077184 | mae 0.193295 -[2024/06/24 06:25:27] ppsci INFO: train: epoch 112 | step 30 | lr 0.000485 | loss 0.122484 | mae 0.237281 -[2024/06/24 06:25:27] ppsci INFO: train: epoch 112 | step 38 | lr 0.000485 | loss 0.107882 | mae 0.221051 -[2024/06/24 06:25:27] ppsci INFO: epoch: 112, train_loss: 0.089370, train_metric: 0.206010, eval_loss: 0.086780, eval_mae: 0.204429 -[2024/06/24 06:25:27] ppsci INFO: train: epoch 113 | step 0 | lr 0.000485 | loss 0.100040 | mae 0.236484 -[2024/06/24 06:25:28] ppsci INFO: train: epoch 113 | step 10 | lr 0.000485 | loss 0.081357 | mae 0.195881 -[2024/06/24 06:25:28] ppsci INFO: train: epoch 113 | step 20 | lr 0.000485 | loss 0.098815 | mae 0.213792 -[2024/06/24 06:25:29] ppsci INFO: train: epoch 113 | step 30 | lr 0.000485 | loss 0.238115 | mae 0.261918 -[2024/06/24 06:25:29] ppsci INFO: train: epoch 113 | step 38 | lr 0.000485 | loss 0.085361 | mae 0.225880 -[2024/06/24 06:25:29] ppsci INFO: epoch: 113, train_loss: 0.097669, train_metric: 0.211117, eval_loss: 0.080724, eval_mae: 0.201415 -[2024/06/24 06:25:30] ppsci INFO: train: epoch 114 | step 0 | lr 0.000484 | loss 0.068273 | mae 0.189728 -[2024/06/24 06:25:30] ppsci INFO: train: epoch 114 | step 10 | lr 0.000484 | loss 0.069796 | mae 0.188284 -[2024/06/24 06:25:31] ppsci INFO: train: epoch 114 | step 20 | lr 0.000484 | loss 0.105503 | mae 0.216364 -[2024/06/24 06:25:31] ppsci INFO: train: epoch 114 | step 30 | lr 0.000484 | loss 0.054781 | mae 0.176282 -[2024/06/24 06:25:32] ppsci INFO: train: epoch 114 | step 38 | lr 0.000484 | loss 0.053684 | mae 0.189444 -[2024/06/24 06:25:32] ppsci INFO: epoch: 114, train_loss: 0.095245, train_metric: 0.205603, eval_loss: 0.081118, eval_mae: 0.201100 -[2024/06/24 06:25:32] ppsci INFO: train: epoch 115 | step 0 | lr 0.000484 | loss 0.096372 | mae 0.222553 -[2024/06/24 06:25:32] ppsci INFO: train: epoch 115 | step 10 | lr 0.000484 | loss 0.070795 | mae 0.209287 -[2024/06/24 06:25:33] ppsci INFO: train: epoch 115 | step 20 | lr 0.000484 | loss 0.082895 | mae 0.193302 -[2024/06/24 06:25:33] ppsci INFO: train: epoch 115 | step 30 | lr 0.000484 | loss 0.271708 | mae 0.250345 -[2024/06/24 06:25:34] ppsci INFO: train: epoch 115 | step 38 | lr 0.000484 | loss 0.043796 | mae 0.148879 -[2024/06/24 06:25:34] ppsci INFO: epoch: 115, train_loss: 0.091741, train_metric: 0.208446, eval_loss: 0.078628, eval_mae: 0.199501 -[2024/06/24 06:25:34] ppsci INFO: train: epoch 116 | step 0 | lr 0.000484 | loss 0.075374 | mae 0.197333 -[2024/06/24 06:25:34] ppsci INFO: train: epoch 116 | step 10 | lr 0.000484 | loss 0.076168 | mae 0.213294 -[2024/06/24 06:25:35] ppsci INFO: train: epoch 116 | step 20 | lr 0.000484 | loss 0.087046 | mae 0.202965 -[2024/06/24 06:25:36] ppsci INFO: train: epoch 116 | step 30 | lr 0.000484 | loss 0.081279 | mae 0.202174 -[2024/06/24 06:25:36] ppsci INFO: train: epoch 116 | step 38 | lr 0.000484 | loss 0.017218 | mae 0.103401 -[2024/06/24 06:25:36] ppsci INFO: epoch: 116, train_loss: 0.096751, train_metric: 0.208260, eval_loss: 0.086118, eval_mae: 0.202946 -[2024/06/24 06:25:36] ppsci INFO: train: epoch 117 | step 0 | lr 0.000484 | loss 0.118241 | mae 0.236435 -[2024/06/24 06:25:37] ppsci INFO: train: epoch 117 | step 10 | lr 0.000484 | loss 0.074365 | mae 0.188960 -[2024/06/24 06:25:37] ppsci INFO: train: epoch 117 | step 20 | lr 0.000484 | loss 0.073677 | mae 0.173465 -[2024/06/24 06:25:38] ppsci INFO: train: epoch 117 | step 30 | lr 0.000484 | loss 0.111182 | mae 0.225603 -[2024/06/24 06:25:38] ppsci INFO: train: epoch 117 | step 38 | lr 0.000484 | loss 0.102264 | mae 0.196754 -[2024/06/24 06:25:38] ppsci INFO: epoch: 117, train_loss: 0.106036, train_metric: 0.209822, eval_loss: 0.088577, eval_mae: 0.201092 -[2024/06/24 06:25:39] ppsci INFO: train: epoch 118 | step 0 | lr 0.000483 | loss 0.091750 | mae 0.214685 -[2024/06/24 06:25:39] ppsci INFO: train: epoch 118 | step 10 | lr 0.000483 | loss 0.082240 | mae 0.196221 -[2024/06/24 06:25:40] ppsci INFO: train: epoch 118 | step 20 | lr 0.000483 | loss 0.093213 | mae 0.221055 -[2024/06/24 06:25:40] ppsci INFO: train: epoch 118 | step 30 | lr 0.000483 | loss 0.087491 | mae 0.197866 -[2024/06/24 06:25:41] ppsci INFO: train: epoch 118 | step 38 | lr 0.000483 | loss 0.115663 | mae 0.176765 -[2024/06/24 06:25:41] ppsci INFO: epoch: 118, train_loss: 0.104204, train_metric: 0.211963, eval_loss: 0.086472, eval_mae: 0.198615 -[2024/06/24 06:25:41] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:25:41] ppsci INFO: train: epoch 119 | step 0 | lr 0.000483 | loss 0.186918 | mae 0.196314 -[2024/06/24 06:25:41] ppsci INFO: train: epoch 119 | step 10 | lr 0.000483 | loss 0.094748 | mae 0.224862 -[2024/06/24 06:25:42] ppsci INFO: train: epoch 119 | step 20 | lr 0.000483 | loss 0.110371 | mae 0.224267 -[2024/06/24 06:25:42] ppsci INFO: train: epoch 119 | step 30 | lr 0.000483 | loss 0.104034 | mae 0.213982 -[2024/06/24 06:25:43] ppsci INFO: train: epoch 119 | step 38 | lr 0.000483 | loss 0.241376 | mae 0.284307 -[2024/06/24 06:25:43] ppsci INFO: epoch: 119, train_loss: 0.097563, train_metric: 0.207441, eval_loss: 0.082351, eval_mae: 0.206461 -[2024/06/24 06:25:43] ppsci INFO: train: epoch 120 | step 0 | lr 0.000483 | loss 0.135545 | mae 0.224062 -[2024/06/24 06:25:43] ppsci INFO: train: epoch 120 | step 10 | lr 0.000483 | loss 0.242533 | mae 0.253624 -[2024/06/24 06:25:44] ppsci INFO: train: epoch 120 | step 20 | lr 0.000483 | loss 0.059888 | mae 0.187431 -[2024/06/24 06:25:44] ppsci INFO: train: epoch 120 | step 30 | lr 0.000483 | loss 0.087926 | mae 0.200675 -[2024/06/24 06:25:45] ppsci INFO: train: epoch 120 | step 38 | lr 0.000483 | loss 0.181884 | mae 0.273503 -[2024/06/24 06:25:45] ppsci INFO: epoch: 120, train_loss: 0.107262, train_metric: 0.212813, eval_loss: 0.081474, eval_mae: 0.200951 -[2024/06/24 06:25:45] ppsci INFO: train: epoch 121 | step 0 | lr 0.000483 | loss 0.082097 | mae 0.219093 -[2024/06/24 06:25:46] ppsci INFO: train: epoch 121 | step 10 | lr 0.000483 | loss 0.081296 | mae 0.192608 -[2024/06/24 06:25:46] ppsci INFO: train: epoch 121 | step 20 | lr 0.000483 | loss 0.058066 | mae 0.177446 -[2024/06/24 06:25:47] ppsci INFO: train: epoch 121 | step 30 | lr 0.000483 | loss 0.088975 | mae 0.214018 -[2024/06/24 06:25:47] ppsci INFO: train: epoch 121 | step 38 | lr 0.000483 | loss 0.109062 | mae 0.255690 -[2024/06/24 06:25:47] ppsci INFO: epoch: 121, train_loss: 0.092736, train_metric: 0.204597, eval_loss: 0.080008, eval_mae: 0.200747 -[2024/06/24 06:25:47] ppsci INFO: train: epoch 122 | step 0 | lr 0.000482 | loss 0.068268 | mae 0.200902 -[2024/06/24 06:25:48] ppsci INFO: train: epoch 122 | step 10 | lr 0.000482 | loss 0.096748 | mae 0.207285 -[2024/06/24 06:25:48] ppsci INFO: train: epoch 122 | step 20 | lr 0.000482 | loss 0.104254 | mae 0.223040 -[2024/06/24 06:25:49] ppsci INFO: train: epoch 122 | step 30 | lr 0.000482 | loss 0.077334 | mae 0.202575 -[2024/06/24 06:25:49] ppsci INFO: train: epoch 122 | step 38 | lr 0.000482 | loss 0.122449 | mae 0.259077 -[2024/06/24 06:25:49] ppsci INFO: epoch: 122, train_loss: 0.100329, train_metric: 0.211761, eval_loss: 0.079192, eval_mae: 0.199705 -[2024/06/24 06:25:49] ppsci INFO: train: epoch 123 | step 0 | lr 0.000482 | loss 0.065738 | mae 0.192113 -[2024/06/24 06:25:50] ppsci INFO: train: epoch 123 | step 10 | lr 0.000482 | loss 0.085669 | mae 0.206627 -[2024/06/24 06:25:50] ppsci INFO: train: epoch 123 | step 20 | lr 0.000482 | loss 0.089187 | mae 0.222719 -[2024/06/24 06:25:51] ppsci INFO: train: epoch 123 | step 30 | lr 0.000482 | loss 0.060312 | mae 0.183288 -[2024/06/24 06:25:51] ppsci INFO: train: epoch 123 | step 38 | lr 0.000482 | loss 0.027754 | mae 0.129757 -[2024/06/24 06:25:51] ppsci INFO: epoch: 123, train_loss: 0.084919, train_metric: 0.203780, eval_loss: 0.082585, eval_mae: 0.201135 -[2024/06/24 06:25:52] ppsci INFO: train: epoch 124 | step 0 | lr 0.000482 | loss 0.088964 | mae 0.207306 -[2024/06/24 06:25:52] ppsci INFO: train: epoch 124 | step 10 | lr 0.000482 | loss 0.054250 | mae 0.172860 -[2024/06/24 06:25:53] ppsci INFO: train: epoch 124 | step 20 | lr 0.000482 | loss 0.081980 | mae 0.209699 -[2024/06/24 06:25:53] ppsci INFO: train: epoch 124 | step 30 | lr 0.000482 | loss 0.091412 | mae 0.220063 -[2024/06/24 06:25:53] ppsci INFO: train: epoch 124 | step 38 | lr 0.000482 | loss 0.115602 | mae 0.222996 -[2024/06/24 06:25:54] ppsci INFO: epoch: 124, train_loss: 0.084561, train_metric: 0.199845, eval_loss: 0.078378, eval_mae: 0.200836 -[2024/06/24 06:25:54] ppsci INFO: train: epoch 125 | step 0 | lr 0.000481 | loss 0.193252 | mae 0.221363 -[2024/06/24 06:25:54] ppsci INFO: train: epoch 125 | step 10 | lr 0.000481 | loss 0.073372 | mae 0.195890 -[2024/06/24 06:25:55] ppsci INFO: train: epoch 125 | step 20 | lr 0.000481 | loss 0.093799 | mae 0.214708 -[2024/06/24 06:25:55] ppsci INFO: train: epoch 125 | step 30 | lr 0.000481 | loss 0.093304 | mae 0.221153 -[2024/06/24 06:25:56] ppsci INFO: train: epoch 125 | step 38 | lr 0.000481 | loss 0.168929 | mae 0.301347 -[2024/06/24 06:25:56] ppsci INFO: epoch: 125, train_loss: 0.100923, train_metric: 0.206214, eval_loss: 0.084249, eval_mae: 0.197902 -[2024/06/24 06:25:56] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:25:56] ppsci INFO: train: epoch 126 | step 0 | lr 0.000481 | loss 0.083998 | mae 0.205861 -[2024/06/24 06:25:56] ppsci INFO: train: epoch 126 | step 10 | lr 0.000481 | loss 0.071624 | mae 0.200286 -[2024/06/24 06:25:57] ppsci INFO: train: epoch 126 | step 20 | lr 0.000481 | loss 0.103950 | mae 0.225745 -[2024/06/24 06:25:57] ppsci INFO: train: epoch 126 | step 30 | lr 0.000481 | loss 0.086870 | mae 0.218779 -[2024/06/24 06:25:58] ppsci INFO: train: epoch 126 | step 38 | lr 0.000481 | loss 0.097824 | mae 0.222032 -[2024/06/24 06:25:58] ppsci INFO: epoch: 126, train_loss: 0.088738, train_metric: 0.207091, eval_loss: 0.082575, eval_mae: 0.204664 -[2024/06/24 06:25:58] ppsci INFO: train: epoch 127 | step 0 | lr 0.000481 | loss 0.073807 | mae 0.177712 -[2024/06/24 06:25:59] ppsci INFO: train: epoch 127 | step 10 | lr 0.000481 | loss 0.055009 | mae 0.169467 -[2024/06/24 06:25:59] ppsci INFO: train: epoch 127 | step 20 | lr 0.000481 | loss 0.071945 | mae 0.195564 -[2024/06/24 06:26:00] ppsci INFO: train: epoch 127 | step 30 | lr 0.000481 | loss 0.066209 | mae 0.188247 -[2024/06/24 06:26:00] ppsci INFO: train: epoch 127 | step 38 | lr 0.000481 | loss 0.054843 | mae 0.200445 -[2024/06/24 06:26:00] ppsci INFO: epoch: 127, train_loss: 0.083774, train_metric: 0.201090, eval_loss: 0.081187, eval_mae: 0.197882 -[2024/06/24 06:26:00] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:26:00] ppsci INFO: train: epoch 128 | step 0 | lr 0.000480 | loss 0.109289 | mae 0.238670 -[2024/06/24 06:26:01] ppsci INFO: train: epoch 128 | step 10 | lr 0.000480 | loss 0.097532 | mae 0.230271 -[2024/06/24 06:26:01] ppsci INFO: train: epoch 128 | step 20 | lr 0.000480 | loss 0.083782 | mae 0.198166 -[2024/06/24 06:26:02] ppsci INFO: train: epoch 128 | step 30 | lr 0.000480 | loss 0.075531 | mae 0.192903 -[2024/06/24 06:26:02] ppsci INFO: train: epoch 128 | step 38 | lr 0.000480 | loss 0.166471 | mae 0.317008 -[2024/06/24 06:26:02] ppsci INFO: epoch: 128, train_loss: 0.092766, train_metric: 0.208191, eval_loss: 0.075687, eval_mae: 0.198325 -[2024/06/24 06:26:02] ppsci INFO: train: epoch 129 | step 0 | lr 0.000480 | loss 0.055609 | mae 0.171374 -[2024/06/24 06:26:03] ppsci INFO: train: epoch 129 | step 10 | lr 0.000480 | loss 0.062900 | mae 0.184763 -[2024/06/24 06:26:03] ppsci INFO: train: epoch 129 | step 20 | lr 0.000480 | loss 0.083469 | mae 0.221557 -[2024/06/24 06:26:04] ppsci INFO: train: epoch 129 | step 30 | lr 0.000480 | loss 0.074212 | mae 0.180989 -[2024/06/24 06:26:04] ppsci INFO: train: epoch 129 | step 38 | lr 0.000480 | loss 0.085605 | mae 0.229702 -[2024/06/24 06:26:04] ppsci INFO: epoch: 129, train_loss: 0.089827, train_metric: 0.205111, eval_loss: 0.078285, eval_mae: 0.194017 -[2024/06/24 06:26:04] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:26:05] ppsci INFO: train: epoch 130 | step 0 | lr 0.000480 | loss 0.078920 | mae 0.207762 -[2024/06/24 06:26:05] ppsci INFO: train: epoch 130 | step 10 | lr 0.000480 | loss 0.131008 | mae 0.222596 -[2024/06/24 06:26:06] ppsci INFO: train: epoch 130 | step 20 | lr 0.000480 | loss 0.098890 | mae 0.220470 -[2024/06/24 06:26:06] ppsci INFO: train: epoch 130 | step 30 | lr 0.000480 | loss 0.128814 | mae 0.208511 -[2024/06/24 06:26:07] ppsci INFO: train: epoch 130 | step 38 | lr 0.000480 | loss 0.048011 | mae 0.179280 -[2024/06/24 06:26:07] ppsci INFO: epoch: 130, train_loss: 0.094977, train_metric: 0.207094, eval_loss: 0.078249, eval_mae: 0.199447 -[2024/06/24 06:26:07] ppsci INFO: train: epoch 131 | step 0 | lr 0.000480 | loss 0.069197 | mae 0.196901 -[2024/06/24 06:26:07] ppsci INFO: train: epoch 131 | step 10 | lr 0.000480 | loss 0.081822 | mae 0.203119 -[2024/06/24 06:26:08] ppsci INFO: train: epoch 131 | step 20 | lr 0.000480 | loss 0.055713 | mae 0.175748 -[2024/06/24 06:26:08] ppsci INFO: train: epoch 131 | step 30 | lr 0.000480 | loss 0.089081 | mae 0.198910 -[2024/06/24 06:26:09] ppsci INFO: train: epoch 131 | step 38 | lr 0.000480 | loss 0.179137 | mae 0.253890 -[2024/06/24 06:26:09] ppsci INFO: epoch: 131, train_loss: 0.087865, train_metric: 0.201634, eval_loss: 0.084131, eval_mae: 0.207693 -[2024/06/24 06:26:09] ppsci INFO: train: epoch 132 | step 0 | lr 0.000479 | loss 0.072334 | mae 0.201586 -[2024/06/24 06:26:10] ppsci INFO: train: epoch 132 | step 10 | lr 0.000479 | loss 0.093579 | mae 0.213878 -[2024/06/24 06:26:10] ppsci INFO: train: epoch 132 | step 20 | lr 0.000479 | loss 0.079442 | mae 0.206136 -[2024/06/24 06:26:11] ppsci INFO: train: epoch 132 | step 30 | lr 0.000479 | loss 0.060493 | mae 0.174331 -[2024/06/24 06:26:11] ppsci INFO: train: epoch 132 | step 38 | lr 0.000479 | loss 0.046336 | mae 0.172055 -[2024/06/24 06:26:11] ppsci INFO: epoch: 132, train_loss: 0.100799, train_metric: 0.206424, eval_loss: 0.081380, eval_mae: 0.199495 -[2024/06/24 06:26:11] ppsci INFO: train: epoch 133 | step 0 | lr 0.000479 | loss 0.120053 | mae 0.225429 -[2024/06/24 06:26:12] ppsci INFO: train: epoch 133 | step 10 | lr 0.000479 | loss 0.089403 | mae 0.214662 -[2024/06/24 06:26:12] ppsci INFO: train: epoch 133 | step 20 | lr 0.000479 | loss 0.084553 | mae 0.205785 -[2024/06/24 06:26:13] ppsci INFO: train: epoch 133 | step 30 | lr 0.000479 | loss 0.092935 | mae 0.189338 -[2024/06/24 06:26:13] ppsci INFO: train: epoch 133 | step 38 | lr 0.000479 | loss 0.038589 | mae 0.150054 -[2024/06/24 06:26:13] ppsci INFO: epoch: 133, train_loss: 0.092947, train_metric: 0.205785, eval_loss: 0.075978, eval_mae: 0.203649 -[2024/06/24 06:26:13] ppsci INFO: train: epoch 134 | step 0 | lr 0.000479 | loss 0.069774 | mae 0.190325 -[2024/06/24 06:26:14] ppsci INFO: train: epoch 134 | step 10 | lr 0.000479 | loss 0.085351 | mae 0.186326 -[2024/06/24 06:26:14] ppsci INFO: train: epoch 134 | step 20 | lr 0.000479 | loss 0.111834 | mae 0.229459 -[2024/06/24 06:26:15] ppsci INFO: train: epoch 134 | step 30 | lr 0.000479 | loss 0.214809 | mae 0.237631 -[2024/06/24 06:26:15] ppsci INFO: train: epoch 134 | step 38 | lr 0.000479 | loss 0.050681 | mae 0.191063 -[2024/06/24 06:26:15] ppsci INFO: epoch: 134, train_loss: 0.090706, train_metric: 0.205363, eval_loss: 0.075009, eval_mae: 0.197337 -[2024/06/24 06:26:16] ppsci INFO: train: epoch 135 | step 0 | lr 0.000478 | loss 0.085224 | mae 0.199955 -[2024/06/24 06:26:16] ppsci INFO: train: epoch 135 | step 10 | lr 0.000478 | loss 0.097334 | mae 0.222161 -[2024/06/24 06:26:17] ppsci INFO: train: epoch 135 | step 20 | lr 0.000478 | loss 0.073591 | mae 0.198112 -[2024/06/24 06:26:17] ppsci INFO: train: epoch 135 | step 30 | lr 0.000478 | loss 0.060920 | mae 0.183776 -[2024/06/24 06:26:18] ppsci INFO: train: epoch 135 | step 38 | lr 0.000478 | loss 0.066306 | mae 0.208801 -[2024/06/24 06:26:18] ppsci INFO: epoch: 135, train_loss: 0.083500, train_metric: 0.200153, eval_loss: 0.076693, eval_mae: 0.197041 -[2024/06/24 06:26:18] ppsci INFO: train: epoch 136 | step 0 | lr 0.000478 | loss 0.068000 | mae 0.197419 -[2024/06/24 06:26:18] ppsci INFO: train: epoch 136 | step 10 | lr 0.000478 | loss 0.078319 | mae 0.167385 -[2024/06/24 06:26:19] ppsci INFO: train: epoch 136 | step 20 | lr 0.000478 | loss 0.096319 | mae 0.203713 -[2024/06/24 06:26:19] ppsci INFO: train: epoch 136 | step 30 | lr 0.000478 | loss 0.059541 | mae 0.183421 -[2024/06/24 06:26:20] ppsci INFO: train: epoch 136 | step 38 | lr 0.000478 | loss 0.044893 | mae 0.172840 -[2024/06/24 06:26:20] ppsci INFO: epoch: 136, train_loss: 0.078701, train_metric: 0.197185, eval_loss: 0.075790, eval_mae: 0.194168 -[2024/06/24 06:26:20] ppsci INFO: train: epoch 137 | step 0 | lr 0.000478 | loss 0.087998 | mae 0.207928 -[2024/06/24 06:26:20] ppsci INFO: train: epoch 137 | step 10 | lr 0.000478 | loss 0.096336 | mae 0.224573 -[2024/06/24 06:26:21] ppsci INFO: train: epoch 137 | step 20 | lr 0.000478 | loss 0.074332 | mae 0.200449 -[2024/06/24 06:26:21] ppsci INFO: train: epoch 137 | step 30 | lr 0.000478 | loss 0.092955 | mae 0.214449 -[2024/06/24 06:26:22] ppsci INFO: train: epoch 137 | step 38 | lr 0.000478 | loss 0.044317 | mae 0.152932 -[2024/06/24 06:26:22] ppsci INFO: epoch: 137, train_loss: 0.080995, train_metric: 0.198620, eval_loss: 0.076468, eval_mae: 0.198182 -[2024/06/24 06:26:22] ppsci INFO: train: epoch 138 | step 0 | lr 0.000477 | loss 0.068951 | mae 0.192660 -[2024/06/24 06:26:22] ppsci INFO: train: epoch 138 | step 10 | lr 0.000477 | loss 0.063017 | mae 0.166952 -[2024/06/24 06:26:23] ppsci INFO: train: epoch 138 | step 20 | lr 0.000477 | loss 0.073092 | mae 0.195542 -[2024/06/24 06:26:23] ppsci INFO: train: epoch 138 | step 30 | lr 0.000477 | loss 0.102746 | mae 0.232698 -[2024/06/24 06:26:24] ppsci INFO: train: epoch 138 | step 38 | lr 0.000477 | loss 0.141429 | mae 0.210588 -[2024/06/24 06:26:24] ppsci INFO: epoch: 138, train_loss: 0.086376, train_metric: 0.202725, eval_loss: 0.075124, eval_mae: 0.196619 -[2024/06/24 06:26:24] ppsci INFO: train: epoch 139 | step 0 | lr 0.000477 | loss 0.073132 | mae 0.195266 -[2024/06/24 06:26:24] ppsci INFO: train: epoch 139 | step 10 | lr 0.000477 | loss 0.077515 | mae 0.201139 -[2024/06/24 06:26:25] ppsci INFO: train: epoch 139 | step 20 | lr 0.000477 | loss 0.133174 | mae 0.249123 -[2024/06/24 06:26:25] ppsci INFO: train: epoch 139 | step 30 | lr 0.000477 | loss 0.076709 | mae 0.198733 -[2024/06/24 06:26:26] ppsci INFO: train: epoch 139 | step 38 | lr 0.000477 | loss 0.022756 | mae 0.122258 -[2024/06/24 06:26:26] ppsci INFO: epoch: 139, train_loss: 0.088023, train_metric: 0.203264, eval_loss: 0.074044, eval_mae: 0.194220 -[2024/06/24 06:26:26] ppsci INFO: train: epoch 140 | step 0 | lr 0.000477 | loss 0.068898 | mae 0.193348 -[2024/06/24 06:26:27] ppsci INFO: train: epoch 140 | step 10 | lr 0.000477 | loss 0.063948 | mae 0.181421 -[2024/06/24 06:26:27] ppsci INFO: train: epoch 140 | step 20 | lr 0.000477 | loss 0.113286 | mae 0.230801 -[2024/06/24 06:26:28] ppsci INFO: train: epoch 140 | step 30 | lr 0.000477 | loss 0.076433 | mae 0.201691 -[2024/06/24 06:26:28] ppsci INFO: train: epoch 140 | step 38 | lr 0.000477 | loss 0.035405 | mae 0.147681 -[2024/06/24 06:26:28] ppsci INFO: epoch: 140, train_loss: 0.090656, train_metric: 0.203062, eval_loss: 0.075232, eval_mae: 0.195153 -[2024/06/24 06:26:28] ppsci INFO: train: epoch 141 | step 0 | lr 0.000476 | loss 0.056071 | mae 0.172002 -[2024/06/24 06:26:29] ppsci INFO: train: epoch 141 | step 10 | lr 0.000476 | loss 0.051609 | mae 0.170845 -[2024/06/24 06:26:29] ppsci INFO: train: epoch 141 | step 20 | lr 0.000476 | loss 0.088990 | mae 0.215299 -[2024/06/24 06:26:30] ppsci INFO: train: epoch 141 | step 30 | lr 0.000476 | loss 0.073411 | mae 0.185775 -[2024/06/24 06:26:30] ppsci INFO: train: epoch 141 | step 38 | lr 0.000476 | loss 0.090142 | mae 0.266055 -[2024/06/24 06:26:31] ppsci INFO: epoch: 141, train_loss: 0.081404, train_metric: 0.198358, eval_loss: 0.075318, eval_mae: 0.197642 -[2024/06/24 06:26:31] ppsci INFO: train: epoch 142 | step 0 | lr 0.000476 | loss 0.108383 | mae 0.205665 -[2024/06/24 06:26:31] ppsci INFO: train: epoch 142 | step 10 | lr 0.000476 | loss 0.071490 | mae 0.197531 -[2024/06/24 06:26:32] ppsci INFO: train: epoch 142 | step 20 | lr 0.000476 | loss 0.102357 | mae 0.206125 -[2024/06/24 06:26:32] ppsci INFO: train: epoch 142 | step 30 | lr 0.000476 | loss 0.057951 | mae 0.172523 -[2024/06/24 06:26:33] ppsci INFO: train: epoch 142 | step 38 | lr 0.000476 | loss 0.151281 | mae 0.285945 -[2024/06/24 06:26:33] ppsci INFO: epoch: 142, train_loss: 0.088175, train_metric: 0.200656, eval_loss: 0.070315, eval_mae: 0.197686 -[2024/06/24 06:26:33] ppsci INFO: train: epoch 143 | step 0 | lr 0.000476 | loss 0.055505 | mae 0.178149 -[2024/06/24 06:26:33] ppsci INFO: train: epoch 143 | step 10 | lr 0.000476 | loss 0.064566 | mae 0.181753 -[2024/06/24 06:26:34] ppsci INFO: train: epoch 143 | step 20 | lr 0.000476 | loss 0.079959 | mae 0.197527 -[2024/06/24 06:26:34] ppsci INFO: train: epoch 143 | step 30 | lr 0.000476 | loss 0.095032 | mae 0.205711 -[2024/06/24 06:26:35] ppsci INFO: train: epoch 143 | step 38 | lr 0.000476 | loss 0.048827 | mae 0.183856 -[2024/06/24 06:26:35] ppsci INFO: epoch: 143, train_loss: 0.084136, train_metric: 0.197694, eval_loss: 0.068247, eval_mae: 0.193319 -[2024/06/24 06:26:35] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:26:35] ppsci INFO: train: epoch 144 | step 0 | lr 0.000475 | loss 0.091631 | mae 0.220870 -[2024/06/24 06:26:35] ppsci INFO: train: epoch 144 | step 10 | lr 0.000475 | loss 0.067170 | mae 0.188870 -[2024/06/24 06:26:36] ppsci INFO: train: epoch 144 | step 20 | lr 0.000475 | loss 0.091516 | mae 0.227463 -[2024/06/24 06:26:36] ppsci INFO: train: epoch 144 | step 30 | lr 0.000475 | loss 0.064117 | mae 0.185587 -[2024/06/24 06:26:37] ppsci INFO: train: epoch 144 | step 38 | lr 0.000475 | loss 0.038428 | mae 0.157640 -[2024/06/24 06:26:37] ppsci INFO: epoch: 144, train_loss: 0.083665, train_metric: 0.202899, eval_loss: 0.071890, eval_mae: 0.192859 -[2024/06/24 06:26:37] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:26:37] ppsci INFO: train: epoch 145 | step 0 | lr 0.000475 | loss 0.113395 | mae 0.209854 -[2024/06/24 06:26:38] ppsci INFO: train: epoch 145 | step 10 | lr 0.000475 | loss 0.061825 | mae 0.180373 -[2024/06/24 06:26:38] ppsci INFO: train: epoch 145 | step 20 | lr 0.000475 | loss 0.071713 | mae 0.193006 -[2024/06/24 06:26:39] ppsci INFO: train: epoch 145 | step 30 | lr 0.000475 | loss 0.076626 | mae 0.190324 -[2024/06/24 06:26:39] ppsci INFO: train: epoch 145 | step 38 | lr 0.000475 | loss 0.087945 | mae 0.230934 -[2024/06/24 06:26:39] ppsci INFO: epoch: 145, train_loss: 0.080042, train_metric: 0.199523, eval_loss: 0.072548, eval_mae: 0.196193 -[2024/06/24 06:26:39] ppsci INFO: train: epoch 146 | step 0 | lr 0.000475 | loss 0.058628 | mae 0.172271 -[2024/06/24 06:26:40] ppsci INFO: train: epoch 146 | step 10 | lr 0.000475 | loss 0.068946 | mae 0.191097 -[2024/06/24 06:26:40] ppsci INFO: train: epoch 146 | step 20 | lr 0.000475 | loss 0.059920 | mae 0.177825 -[2024/06/24 06:26:41] ppsci INFO: train: epoch 146 | step 30 | lr 0.000475 | loss 0.066583 | mae 0.198986 -[2024/06/24 06:26:41] ppsci INFO: train: epoch 146 | step 38 | lr 0.000475 | loss 0.026863 | mae 0.121854 -[2024/06/24 06:26:41] ppsci INFO: epoch: 146, train_loss: 0.087056, train_metric: 0.198360, eval_loss: 0.072307, eval_mae: 0.198504 -[2024/06/24 06:26:41] ppsci INFO: train: epoch 147 | step 0 | lr 0.000474 | loss 0.056287 | mae 0.176463 -[2024/06/24 06:26:42] ppsci INFO: train: epoch 147 | step 10 | lr 0.000474 | loss 0.082784 | mae 0.211395 -[2024/06/24 06:26:42] ppsci INFO: train: epoch 147 | step 20 | lr 0.000474 | loss 0.061055 | mae 0.168326 -[2024/06/24 06:26:43] ppsci INFO: train: epoch 147 | step 30 | lr 0.000474 | loss 0.192000 | mae 0.209846 -[2024/06/24 06:26:43] ppsci INFO: train: epoch 147 | step 38 | lr 0.000474 | loss 0.085721 | mae 0.217499 -[2024/06/24 06:26:43] ppsci INFO: epoch: 147, train_loss: 0.088104, train_metric: 0.200409, eval_loss: 0.072370, eval_mae: 0.194944 -[2024/06/24 06:26:43] ppsci INFO: train: epoch 148 | step 0 | lr 0.000474 | loss 0.091472 | mae 0.191301 -[2024/06/24 06:26:44] ppsci INFO: train: epoch 148 | step 10 | lr 0.000474 | loss 0.069026 | mae 0.183129 -[2024/06/24 06:26:44] ppsci INFO: train: epoch 148 | step 20 | lr 0.000474 | loss 0.055849 | mae 0.165142 -[2024/06/24 06:26:45] ppsci INFO: train: epoch 148 | step 30 | lr 0.000474 | loss 0.094654 | mae 0.209597 -[2024/06/24 06:26:45] ppsci INFO: train: epoch 148 | step 38 | lr 0.000474 | loss 0.075674 | mae 0.192636 -[2024/06/24 06:26:45] ppsci INFO: epoch: 148, train_loss: 0.091633, train_metric: 0.201167, eval_loss: 0.075184, eval_mae: 0.197699 -[2024/06/24 06:26:46] ppsci INFO: train: epoch 149 | step 0 | lr 0.000474 | loss 0.083485 | mae 0.201137 -[2024/06/24 06:26:46] ppsci INFO: train: epoch 149 | step 10 | lr 0.000474 | loss 0.081672 | mae 0.199196 -[2024/06/24 06:26:47] ppsci INFO: train: epoch 149 | step 20 | lr 0.000474 | loss 0.032908 | mae 0.133734 -[2024/06/24 06:26:47] ppsci INFO: train: epoch 149 | step 30 | lr 0.000474 | loss 0.094720 | mae 0.224165 -[2024/06/24 06:26:47] ppsci INFO: train: epoch 149 | step 38 | lr 0.000474 | loss 0.036724 | mae 0.146498 -[2024/06/24 06:26:48] ppsci INFO: epoch: 149, train_loss: 0.087484, train_metric: 0.200224, eval_loss: 0.075244, eval_mae: 0.203716 -[2024/06/24 06:26:48] ppsci INFO: train: epoch 150 | step 0 | lr 0.000473 | loss 0.080333 | mae 0.216886 -[2024/06/24 06:26:48] ppsci INFO: train: epoch 150 | step 10 | lr 0.000473 | loss 0.079806 | mae 0.180424 -[2024/06/24 06:26:49] ppsci INFO: train: epoch 150 | step 20 | lr 0.000473 | loss 0.080480 | mae 0.214154 -[2024/06/24 06:26:49] ppsci INFO: train: epoch 150 | step 30 | lr 0.000473 | loss 0.085473 | mae 0.209090 -[2024/06/24 06:26:49] ppsci INFO: train: epoch 150 | step 38 | lr 0.000473 | loss 0.136938 | mae 0.256793 -[2024/06/24 06:26:50] ppsci INFO: epoch: 150, train_loss: 0.096955, train_metric: 0.204598, eval_loss: 0.073632, eval_mae: 0.193737 -[2024/06/24 06:26:50] ppsci INFO: train: epoch 151 | step 0 | lr 0.000473 | loss 0.079293 | mae 0.201390 -[2024/06/24 06:26:50] ppsci INFO: train: epoch 151 | step 10 | lr 0.000473 | loss 0.105549 | mae 0.199150 -[2024/06/24 06:26:51] ppsci INFO: train: epoch 151 | step 20 | lr 0.000473 | loss 0.075708 | mae 0.197153 -[2024/06/24 06:26:51] ppsci INFO: train: epoch 151 | step 30 | lr 0.000473 | loss 0.081165 | mae 0.205083 -[2024/06/24 06:26:52] ppsci INFO: train: epoch 151 | step 38 | lr 0.000473 | loss 0.055586 | mae 0.123274 -[2024/06/24 06:26:52] ppsci INFO: epoch: 151, train_loss: 0.084731, train_metric: 0.200791, eval_loss: 0.076872, eval_mae: 0.196836 -[2024/06/24 06:26:52] ppsci INFO: train: epoch 152 | step 0 | lr 0.000473 | loss 0.044152 | mae 0.156796 -[2024/06/24 06:26:52] ppsci INFO: train: epoch 152 | step 10 | lr 0.000473 | loss 0.096612 | mae 0.228180 -[2024/06/24 06:26:53] ppsci INFO: train: epoch 152 | step 20 | lr 0.000473 | loss 0.096998 | mae 0.211306 -[2024/06/24 06:26:53] ppsci INFO: train: epoch 152 | step 30 | lr 0.000473 | loss 0.067559 | mae 0.180228 -[2024/06/24 06:26:54] ppsci INFO: train: epoch 152 | step 38 | lr 0.000473 | loss 0.024002 | mae 0.129168 -[2024/06/24 06:26:54] ppsci INFO: epoch: 152, train_loss: 0.081767, train_metric: 0.195637, eval_loss: 0.072561, eval_mae: 0.196790 -[2024/06/24 06:26:54] ppsci INFO: train: epoch 153 | step 0 | lr 0.000472 | loss 0.108157 | mae 0.228000 -[2024/06/24 06:26:54] ppsci INFO: train: epoch 153 | step 10 | lr 0.000472 | loss 0.075602 | mae 0.189317 -[2024/06/24 06:26:55] ppsci INFO: train: epoch 153 | step 20 | lr 0.000472 | loss 0.070252 | mae 0.192860 -[2024/06/24 06:26:56] ppsci INFO: train: epoch 153 | step 30 | lr 0.000472 | loss 0.123557 | mae 0.226084 -[2024/06/24 06:26:56] ppsci INFO: train: epoch 153 | step 38 | lr 0.000472 | loss 0.127744 | mae 0.251041 -[2024/06/24 06:26:56] ppsci INFO: epoch: 153, train_loss: 0.083552, train_metric: 0.197735, eval_loss: 0.071540, eval_mae: 0.192881 -[2024/06/24 06:26:56] ppsci INFO: train: epoch 154 | step 0 | lr 0.000472 | loss 0.083325 | mae 0.202082 -[2024/06/24 06:26:57] ppsci INFO: train: epoch 154 | step 10 | lr 0.000472 | loss 0.065387 | mae 0.193650 -[2024/06/24 06:26:57] ppsci INFO: train: epoch 154 | step 20 | lr 0.000472 | loss 0.105136 | mae 0.205794 -[2024/06/24 06:26:58] ppsci INFO: train: epoch 154 | step 30 | lr 0.000472 | loss 0.071448 | mae 0.189897 -[2024/06/24 06:26:58] ppsci INFO: train: epoch 154 | step 38 | lr 0.000472 | loss 0.101734 | mae 0.246036 -[2024/06/24 06:26:58] ppsci INFO: epoch: 154, train_loss: 0.076131, train_metric: 0.193845, eval_loss: 0.071367, eval_mae: 0.196732 -[2024/06/24 06:26:58] ppsci INFO: train: epoch 155 | step 0 | lr 0.000472 | loss 0.051448 | mae 0.172822 -[2024/06/24 06:26:59] ppsci INFO: train: epoch 155 | step 10 | lr 0.000472 | loss 0.080284 | mae 0.195845 -[2024/06/24 06:27:00] ppsci INFO: train: epoch 155 | step 20 | lr 0.000472 | loss 0.063762 | mae 0.190109 -[2024/06/24 06:27:00] ppsci INFO: train: epoch 155 | step 30 | lr 0.000472 | loss 0.076767 | mae 0.189161 -[2024/06/24 06:27:00] ppsci INFO: train: epoch 155 | step 38 | lr 0.000472 | loss 0.221033 | mae 0.302322 -[2024/06/24 06:27:01] ppsci INFO: epoch: 155, train_loss: 0.086303, train_metric: 0.195216, eval_loss: 0.069558, eval_mae: 0.193687 -[2024/06/24 06:27:01] ppsci INFO: train: epoch 156 | step 0 | lr 0.000471 | loss 0.069806 | mae 0.186578 -[2024/06/24 06:27:01] ppsci INFO: train: epoch 156 | step 10 | lr 0.000471 | loss 0.074716 | mae 0.206151 -[2024/06/24 06:27:02] ppsci INFO: train: epoch 156 | step 20 | lr 0.000471 | loss 0.096659 | mae 0.226412 -[2024/06/24 06:27:02] ppsci INFO: train: epoch 156 | step 30 | lr 0.000471 | loss 0.099226 | mae 0.222653 -[2024/06/24 06:27:03] ppsci INFO: train: epoch 156 | step 38 | lr 0.000471 | loss 0.063322 | mae 0.211158 -[2024/06/24 06:27:03] ppsci INFO: epoch: 156, train_loss: 0.088600, train_metric: 0.197652, eval_loss: 0.070449, eval_mae: 0.192738 -[2024/06/24 06:27:03] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:27:03] ppsci INFO: train: epoch 157 | step 0 | lr 0.000471 | loss 0.087919 | mae 0.215659 -[2024/06/24 06:27:03] ppsci INFO: train: epoch 157 | step 10 | lr 0.000471 | loss 0.091948 | mae 0.194273 -[2024/06/24 06:27:04] ppsci INFO: train: epoch 157 | step 20 | lr 0.000471 | loss 0.096099 | mae 0.209861 -[2024/06/24 06:27:05] ppsci INFO: train: epoch 157 | step 30 | lr 0.000471 | loss 0.079167 | mae 0.198581 -[2024/06/24 06:27:05] ppsci INFO: train: epoch 157 | step 38 | lr 0.000471 | loss 0.131989 | mae 0.279352 -[2024/06/24 06:27:05] ppsci INFO: epoch: 157, train_loss: 0.077902, train_metric: 0.192453, eval_loss: 0.071620, eval_mae: 0.196741 -[2024/06/24 06:27:05] ppsci INFO: train: epoch 158 | step 0 | lr 0.000470 | loss 0.045631 | mae 0.161627 -[2024/06/24 06:27:06] ppsci INFO: train: epoch 158 | step 10 | lr 0.000470 | loss 0.113318 | mae 0.215920 -[2024/06/24 06:27:06] ppsci INFO: train: epoch 158 | step 20 | lr 0.000470 | loss 0.074849 | mae 0.197713 -[2024/06/24 06:27:07] ppsci INFO: train: epoch 158 | step 30 | lr 0.000470 | loss 0.096026 | mae 0.204527 -[2024/06/24 06:27:07] ppsci INFO: train: epoch 158 | step 38 | lr 0.000470 | loss 0.072083 | mae 0.195953 -[2024/06/24 06:27:08] ppsci INFO: epoch: 158, train_loss: 0.095647, train_metric: 0.201563, eval_loss: 0.068041, eval_mae: 0.192971 -[2024/06/24 06:27:08] ppsci INFO: train: epoch 159 | step 0 | lr 0.000470 | loss 0.112764 | mae 0.216410 -[2024/06/24 06:27:08] ppsci INFO: train: epoch 159 | step 10 | lr 0.000470 | loss 0.076722 | mae 0.190516 -[2024/06/24 06:27:09] ppsci INFO: train: epoch 159 | step 20 | lr 0.000470 | loss 0.057410 | mae 0.175053 -[2024/06/24 06:27:09] ppsci INFO: train: epoch 159 | step 30 | lr 0.000470 | loss 0.077426 | mae 0.190555 -[2024/06/24 06:27:10] ppsci INFO: train: epoch 159 | step 38 | lr 0.000470 | loss 0.044724 | mae 0.165390 -[2024/06/24 06:27:10] ppsci INFO: epoch: 159, train_loss: 0.089807, train_metric: 0.197896, eval_loss: 0.070306, eval_mae: 0.192578 -[2024/06/24 06:27:10] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:27:10] ppsci INFO: train: epoch 160 | step 0 | lr 0.000470 | loss 0.074337 | mae 0.193947 -[2024/06/24 06:27:10] ppsci INFO: train: epoch 160 | step 10 | lr 0.000470 | loss 0.096176 | mae 0.213315 -[2024/06/24 06:27:11] ppsci INFO: train: epoch 160 | step 20 | lr 0.000470 | loss 0.066338 | mae 0.183988 -[2024/06/24 06:27:12] ppsci INFO: train: epoch 160 | step 30 | lr 0.000470 | loss 0.057429 | mae 0.169100 -[2024/06/24 06:27:12] ppsci INFO: train: epoch 160 | step 38 | lr 0.000470 | loss 0.029550 | mae 0.147375 -[2024/06/24 06:27:12] ppsci INFO: epoch: 160, train_loss: 0.089597, train_metric: 0.197110, eval_loss: 0.068572, eval_mae: 0.194695 -[2024/06/24 06:27:12] ppsci INFO: train: epoch 161 | step 0 | lr 0.000469 | loss 0.099031 | mae 0.192853 -[2024/06/24 06:27:13] ppsci INFO: train: epoch 161 | step 10 | lr 0.000469 | loss 0.078247 | mae 0.195572 -[2024/06/24 06:27:13] ppsci INFO: train: epoch 161 | step 20 | lr 0.000469 | loss 0.062914 | mae 0.186963 -[2024/06/24 06:27:14] ppsci INFO: train: epoch 161 | step 30 | lr 0.000469 | loss 0.062950 | mae 0.178520 -[2024/06/24 06:27:14] ppsci INFO: train: epoch 161 | step 38 | lr 0.000469 | loss 0.364047 | mae 0.420902 -[2024/06/24 06:27:14] ppsci INFO: epoch: 161, train_loss: 0.086304, train_metric: 0.196035, eval_loss: 0.073491, eval_mae: 0.205581 -[2024/06/24 06:27:14] ppsci INFO: train: epoch 162 | step 0 | lr 0.000469 | loss 0.082261 | mae 0.197062 -[2024/06/24 06:27:15] ppsci INFO: train: epoch 162 | step 10 | lr 0.000469 | loss 0.082649 | mae 0.201967 -[2024/06/24 06:27:15] ppsci INFO: train: epoch 162 | step 20 | lr 0.000469 | loss 0.086161 | mae 0.212497 -[2024/06/24 06:27:16] ppsci INFO: train: epoch 162 | step 30 | lr 0.000469 | loss 0.122269 | mae 0.224169 -[2024/06/24 06:27:16] ppsci INFO: train: epoch 162 | step 38 | lr 0.000469 | loss 0.058222 | mae 0.177437 -[2024/06/24 06:27:16] ppsci INFO: epoch: 162, train_loss: 0.091757, train_metric: 0.200555, eval_loss: 0.066493, eval_mae: 0.193390 -[2024/06/24 06:27:16] ppsci INFO: train: epoch 163 | step 0 | lr 0.000469 | loss 0.056056 | mae 0.171710 -[2024/06/24 06:27:17] ppsci INFO: train: epoch 163 | step 10 | lr 0.000469 | loss 0.060981 | mae 0.192630 -[2024/06/24 06:27:18] ppsci INFO: train: epoch 163 | step 20 | lr 0.000469 | loss 0.052143 | mae 0.168136 -[2024/06/24 06:27:18] ppsci INFO: train: epoch 163 | step 30 | lr 0.000469 | loss 0.078142 | mae 0.202445 -[2024/06/24 06:27:19] ppsci INFO: train: epoch 163 | step 38 | lr 0.000469 | loss 0.253297 | mae 0.383368 -[2024/06/24 06:27:19] ppsci INFO: epoch: 163, train_loss: 0.087315, train_metric: 0.197487, eval_loss: 0.070059, eval_mae: 0.197895 -[2024/06/24 06:27:19] ppsci INFO: train: epoch 164 | step 0 | lr 0.000468 | loss 0.085432 | mae 0.204532 -[2024/06/24 06:27:20] ppsci INFO: train: epoch 164 | step 10 | lr 0.000468 | loss 0.091362 | mae 0.215810 -[2024/06/24 06:27:20] ppsci INFO: train: epoch 164 | step 20 | lr 0.000468 | loss 0.088533 | mae 0.205393 -[2024/06/24 06:27:21] ppsci INFO: train: epoch 164 | step 30 | lr 0.000468 | loss 0.075643 | mae 0.201558 -[2024/06/24 06:27:21] ppsci INFO: train: epoch 164 | step 38 | lr 0.000468 | loss 0.103369 | mae 0.255714 -[2024/06/24 06:27:21] ppsci INFO: epoch: 164, train_loss: 0.084200, train_metric: 0.199726, eval_loss: 0.071228, eval_mae: 0.197772 -[2024/06/24 06:27:21] ppsci INFO: train: epoch 165 | step 0 | lr 0.000468 | loss 0.126617 | mae 0.223587 -[2024/06/24 06:27:22] ppsci INFO: train: epoch 165 | step 10 | lr 0.000468 | loss 0.062363 | mae 0.182228 -[2024/06/24 06:27:22] ppsci INFO: train: epoch 165 | step 20 | lr 0.000468 | loss 0.087053 | mae 0.210883 -[2024/06/24 06:27:23] ppsci INFO: train: epoch 165 | step 30 | lr 0.000468 | loss 0.076821 | mae 0.179392 -[2024/06/24 06:27:23] ppsci INFO: train: epoch 165 | step 38 | lr 0.000468 | loss 0.031687 | mae 0.148447 -[2024/06/24 06:27:23] ppsci INFO: epoch: 165, train_loss: 0.084349, train_metric: 0.195784, eval_loss: 0.067956, eval_mae: 0.195208 -[2024/06/24 06:27:23] ppsci INFO: train: epoch 166 | step 0 | lr 0.000467 | loss 0.111092 | mae 0.233550 -[2024/06/24 06:27:24] ppsci INFO: train: epoch 166 | step 10 | lr 0.000467 | loss 0.068060 | mae 0.194287 -[2024/06/24 06:27:25] ppsci INFO: train: epoch 166 | step 20 | lr 0.000467 | loss 0.052887 | mae 0.166894 -[2024/06/24 06:27:25] ppsci INFO: train: epoch 166 | step 30 | lr 0.000467 | loss 0.079951 | mae 0.203610 -[2024/06/24 06:27:26] ppsci INFO: train: epoch 166 | step 38 | lr 0.000467 | loss 0.321577 | mae 0.360830 -[2024/06/24 06:27:26] ppsci INFO: epoch: 166, train_loss: 0.091416, train_metric: 0.195517, eval_loss: 0.067202, eval_mae: 0.196789 -[2024/06/24 06:27:26] ppsci INFO: train: epoch 167 | step 0 | lr 0.000467 | loss 0.094206 | mae 0.195117 -[2024/06/24 06:27:26] ppsci INFO: train: epoch 167 | step 10 | lr 0.000467 | loss 0.069665 | mae 0.182140 -[2024/06/24 06:27:27] ppsci INFO: train: epoch 167 | step 20 | lr 0.000467 | loss 0.057148 | mae 0.170243 -[2024/06/24 06:27:27] ppsci INFO: train: epoch 167 | step 30 | lr 0.000467 | loss 0.078158 | mae 0.200681 -[2024/06/24 06:27:28] ppsci INFO: train: epoch 167 | step 38 | lr 0.000467 | loss 0.215574 | mae 0.325308 -[2024/06/24 06:27:28] ppsci INFO: epoch: 167, train_loss: 0.088477, train_metric: 0.200301, eval_loss: 0.070635, eval_mae: 0.193465 -[2024/06/24 06:27:28] ppsci INFO: train: epoch 168 | step 0 | lr 0.000467 | loss 0.054202 | mae 0.177938 -[2024/06/24 06:27:29] ppsci INFO: train: epoch 168 | step 10 | lr 0.000467 | loss 0.089428 | mae 0.195793 -[2024/06/24 06:27:29] ppsci INFO: train: epoch 168 | step 20 | lr 0.000467 | loss 0.043678 | mae 0.161852 -[2024/06/24 06:27:30] ppsci INFO: train: epoch 168 | step 30 | lr 0.000467 | loss 0.086455 | mae 0.204549 -[2024/06/24 06:27:30] ppsci INFO: train: epoch 168 | step 38 | lr 0.000467 | loss 0.288725 | mae 0.327976 -[2024/06/24 06:27:30] ppsci INFO: epoch: 168, train_loss: 0.087271, train_metric: 0.193302, eval_loss: 0.063874, eval_mae: 0.193869 -[2024/06/24 06:27:30] ppsci INFO: train: epoch 169 | step 0 | lr 0.000466 | loss 0.060125 | mae 0.171683 -[2024/06/24 06:27:31] ppsci INFO: train: epoch 169 | step 10 | lr 0.000466 | loss 0.072680 | mae 0.187996 -[2024/06/24 06:27:31] ppsci INFO: train: epoch 169 | step 20 | lr 0.000466 | loss 0.200230 | mae 0.215877 -[2024/06/24 06:27:32] ppsci INFO: train: epoch 169 | step 30 | lr 0.000466 | loss 0.097561 | mae 0.215436 -[2024/06/24 06:27:32] ppsci INFO: train: epoch 169 | step 38 | lr 0.000466 | loss 0.064846 | mae 0.164331 -[2024/06/24 06:27:32] ppsci INFO: epoch: 169, train_loss: 0.084295, train_metric: 0.193307, eval_loss: 0.066439, eval_mae: 0.191187 -[2024/06/24 06:27:32] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:27:32] ppsci INFO: train: epoch 170 | step 0 | lr 0.000466 | loss 0.061979 | mae 0.180167 -[2024/06/24 06:27:33] ppsci INFO: train: epoch 170 | step 10 | lr 0.000466 | loss 0.073330 | mae 0.187224 -[2024/06/24 06:27:33] ppsci INFO: train: epoch 170 | step 20 | lr 0.000466 | loss 0.123186 | mae 0.222725 -[2024/06/24 06:27:34] ppsci INFO: train: epoch 170 | step 30 | lr 0.000466 | loss 0.077677 | mae 0.197530 -[2024/06/24 06:27:34] ppsci INFO: train: epoch 170 | step 38 | lr 0.000466 | loss 0.073203 | mae 0.196539 -[2024/06/24 06:27:34] ppsci INFO: epoch: 170, train_loss: 0.083130, train_metric: 0.194841, eval_loss: 0.070200, eval_mae: 0.193771 -[2024/06/24 06:27:35] ppsci INFO: train: epoch 171 | step 0 | lr 0.000465 | loss 0.060835 | mae 0.192620 -[2024/06/24 06:27:35] ppsci INFO: train: epoch 171 | step 10 | lr 0.000465 | loss 0.114471 | mae 0.222113 -[2024/06/24 06:27:36] ppsci INFO: train: epoch 171 | step 20 | lr 0.000465 | loss 0.068977 | mae 0.191564 -[2024/06/24 06:27:36] ppsci INFO: train: epoch 171 | step 30 | lr 0.000465 | loss 0.093021 | mae 0.206765 -[2024/06/24 06:27:37] ppsci INFO: train: epoch 171 | step 38 | lr 0.000465 | loss 0.043303 | mae 0.158485 -[2024/06/24 06:27:37] ppsci INFO: epoch: 171, train_loss: 0.078169, train_metric: 0.194060, eval_loss: 0.067277, eval_mae: 0.192963 -[2024/06/24 06:27:37] ppsci INFO: train: epoch 172 | step 0 | lr 0.000465 | loss 0.063712 | mae 0.185402 -[2024/06/24 06:27:37] ppsci INFO: train: epoch 172 | step 10 | lr 0.000465 | loss 0.067734 | mae 0.174591 -[2024/06/24 06:27:38] ppsci INFO: train: epoch 172 | step 20 | lr 0.000465 | loss 0.063286 | mae 0.183249 -[2024/06/24 06:27:38] ppsci INFO: train: epoch 172 | step 30 | lr 0.000465 | loss 0.095328 | mae 0.219228 -[2024/06/24 06:27:39] ppsci INFO: train: epoch 172 | step 38 | lr 0.000465 | loss 0.049936 | mae 0.162508 -[2024/06/24 06:27:39] ppsci INFO: epoch: 172, train_loss: 0.081301, train_metric: 0.195015, eval_loss: 0.067648, eval_mae: 0.194752 -[2024/06/24 06:27:39] ppsci INFO: train: epoch 173 | step 0 | lr 0.000465 | loss 0.066001 | mae 0.189180 -[2024/06/24 06:27:40] ppsci INFO: train: epoch 173 | step 10 | lr 0.000465 | loss 0.065389 | mae 0.182488 -[2024/06/24 06:27:40] ppsci INFO: train: epoch 173 | step 20 | lr 0.000465 | loss 0.083941 | mae 0.200871 -[2024/06/24 06:27:41] ppsci INFO: train: epoch 173 | step 30 | lr 0.000465 | loss 0.048632 | mae 0.164572 -[2024/06/24 06:27:41] ppsci INFO: train: epoch 173 | step 38 | lr 0.000465 | loss 0.074659 | mae 0.207795 -[2024/06/24 06:27:41] ppsci INFO: epoch: 173, train_loss: 0.078704, train_metric: 0.193905, eval_loss: 0.067577, eval_mae: 0.196682 -[2024/06/24 06:27:41] ppsci INFO: train: epoch 174 | step 0 | lr 0.000464 | loss 0.080959 | mae 0.194889 -[2024/06/24 06:27:42] ppsci INFO: train: epoch 174 | step 10 | lr 0.000464 | loss 0.100669 | mae 0.215874 -[2024/06/24 06:27:42] ppsci INFO: train: epoch 174 | step 20 | lr 0.000464 | loss 0.113828 | mae 0.209808 -[2024/06/24 06:27:43] ppsci INFO: train: epoch 174 | step 30 | lr 0.000464 | loss 0.068884 | mae 0.200206 -[2024/06/24 06:27:43] ppsci INFO: train: epoch 174 | step 38 | lr 0.000464 | loss 0.059591 | mae 0.204852 -[2024/06/24 06:27:43] ppsci INFO: epoch: 174, train_loss: 0.086858, train_metric: 0.195187, eval_loss: 0.068562, eval_mae: 0.194357 -[2024/06/24 06:27:43] ppsci INFO: train: epoch 175 | step 0 | lr 0.000464 | loss 0.063988 | mae 0.168298 -[2024/06/24 06:27:44] ppsci INFO: train: epoch 175 | step 10 | lr 0.000464 | loss 0.057045 | mae 0.177064 -[2024/06/24 06:27:44] ppsci INFO: train: epoch 175 | step 20 | lr 0.000464 | loss 0.085351 | mae 0.196395 -[2024/06/24 06:27:45] ppsci INFO: train: epoch 175 | step 30 | lr 0.000464 | loss 0.067360 | mae 0.185315 -[2024/06/24 06:27:45] ppsci INFO: train: epoch 175 | step 38 | lr 0.000464 | loss 0.098397 | mae 0.233942 -[2024/06/24 06:27:45] ppsci INFO: epoch: 175, train_loss: 0.078838, train_metric: 0.191265, eval_loss: 0.067474, eval_mae: 0.195939 -[2024/06/24 06:27:45] ppsci INFO: train: epoch 176 | step 0 | lr 0.000463 | loss 0.095265 | mae 0.198981 -[2024/06/24 06:27:46] ppsci INFO: train: epoch 176 | step 10 | lr 0.000463 | loss 0.064304 | mae 0.182723 -[2024/06/24 06:27:46] ppsci INFO: train: epoch 176 | step 20 | lr 0.000463 | loss 0.087572 | mae 0.189582 -[2024/06/24 06:27:47] ppsci INFO: train: epoch 176 | step 30 | lr 0.000463 | loss 0.127500 | mae 0.205527 -[2024/06/24 06:27:47] ppsci INFO: train: epoch 176 | step 38 | lr 0.000463 | loss 0.042605 | mae 0.172091 -[2024/06/24 06:27:47] ppsci INFO: epoch: 176, train_loss: 0.085019, train_metric: 0.194955, eval_loss: 0.068813, eval_mae: 0.193381 -[2024/06/24 06:27:47] ppsci INFO: train: epoch 177 | step 0 | lr 0.000463 | loss 0.078179 | mae 0.199014 -[2024/06/24 06:27:48] ppsci INFO: train: epoch 177 | step 10 | lr 0.000463 | loss 0.046678 | mae 0.171225 -[2024/06/24 06:27:48] ppsci INFO: train: epoch 177 | step 20 | lr 0.000463 | loss 0.061746 | mae 0.180460 -[2024/06/24 06:27:49] ppsci INFO: train: epoch 177 | step 30 | lr 0.000463 | loss 0.088919 | mae 0.208464 -[2024/06/24 06:27:49] ppsci INFO: train: epoch 177 | step 38 | lr 0.000463 | loss 0.096572 | mae 0.226985 -[2024/06/24 06:27:49] ppsci INFO: epoch: 177, train_loss: 0.080013, train_metric: 0.193213, eval_loss: 0.068110, eval_mae: 0.193338 -[2024/06/24 06:27:50] ppsci INFO: train: epoch 178 | step 0 | lr 0.000463 | loss 0.069846 | mae 0.193250 -[2024/06/24 06:27:50] ppsci INFO: train: epoch 178 | step 10 | lr 0.000463 | loss 0.103720 | mae 0.226345 -[2024/06/24 06:27:51] ppsci INFO: train: epoch 178 | step 20 | lr 0.000463 | loss 0.052729 | mae 0.166972 -[2024/06/24 06:27:51] ppsci INFO: train: epoch 178 | step 30 | lr 0.000463 | loss 0.053853 | mae 0.177243 -[2024/06/24 06:27:51] ppsci INFO: train: epoch 178 | step 38 | lr 0.000463 | loss 0.065674 | mae 0.153845 -[2024/06/24 06:27:52] ppsci INFO: epoch: 178, train_loss: 0.085260, train_metric: 0.193652, eval_loss: 0.065550, eval_mae: 0.191455 -[2024/06/24 06:27:52] ppsci INFO: train: epoch 179 | step 0 | lr 0.000462 | loss 0.052030 | mae 0.172636 -[2024/06/24 06:27:52] ppsci INFO: train: epoch 179 | step 10 | lr 0.000462 | loss 0.107635 | mae 0.208140 -[2024/06/24 06:27:53] ppsci INFO: train: epoch 179 | step 20 | lr 0.000462 | loss 0.076729 | mae 0.205580 -[2024/06/24 06:27:53] ppsci INFO: train: epoch 179 | step 30 | lr 0.000462 | loss 0.055176 | mae 0.167941 -[2024/06/24 06:27:54] ppsci INFO: train: epoch 179 | step 38 | lr 0.000462 | loss 0.067923 | mae 0.203221 -[2024/06/24 06:27:54] ppsci INFO: epoch: 179, train_loss: 0.079546, train_metric: 0.189018, eval_loss: 0.066377, eval_mae: 0.191255 -[2024/06/24 06:27:54] ppsci INFO: train: epoch 180 | step 0 | lr 0.000462 | loss 0.079240 | mae 0.189490 -[2024/06/24 06:27:55] ppsci INFO: train: epoch 180 | step 10 | lr 0.000462 | loss 0.069574 | mae 0.190685 -[2024/06/24 06:27:55] ppsci INFO: train: epoch 180 | step 20 | lr 0.000462 | loss 0.095980 | mae 0.192791 -[2024/06/24 06:27:56] ppsci INFO: train: epoch 180 | step 30 | lr 0.000462 | loss 0.062913 | mae 0.193789 -[2024/06/24 06:27:56] ppsci INFO: train: epoch 180 | step 38 | lr 0.000462 | loss 0.092417 | mae 0.219000 -[2024/06/24 06:27:56] ppsci INFO: epoch: 180, train_loss: 0.075706, train_metric: 0.187015, eval_loss: 0.066163, eval_mae: 0.193205 -[2024/06/24 06:27:56] ppsci INFO: train: epoch 181 | step 0 | lr 0.000461 | loss 0.106186 | mae 0.230920 -[2024/06/24 06:27:57] ppsci INFO: train: epoch 181 | step 10 | lr 0.000461 | loss 0.053980 | mae 0.165448 -[2024/06/24 06:27:57] ppsci INFO: train: epoch 181 | step 20 | lr 0.000461 | loss 0.087298 | mae 0.190264 -[2024/06/24 06:27:58] ppsci INFO: train: epoch 181 | step 30 | lr 0.000461 | loss 0.066160 | mae 0.189375 -[2024/06/24 06:27:58] ppsci INFO: train: epoch 181 | step 38 | lr 0.000461 | loss 0.180572 | mae 0.321554 -[2024/06/24 06:27:58] ppsci INFO: epoch: 181, train_loss: 0.073821, train_metric: 0.186715, eval_loss: 0.067833, eval_mae: 0.193316 -[2024/06/24 06:27:58] ppsci INFO: train: epoch 182 | step 0 | lr 0.000461 | loss 0.069908 | mae 0.174575 -[2024/06/24 06:27:59] ppsci INFO: train: epoch 182 | step 10 | lr 0.000461 | loss 0.070581 | mae 0.194502 -[2024/06/24 06:27:59] ppsci INFO: train: epoch 182 | step 20 | lr 0.000461 | loss 0.058292 | mae 0.175018 -[2024/06/24 06:28:00] ppsci INFO: train: epoch 182 | step 30 | lr 0.000461 | loss 0.056414 | mae 0.164864 -[2024/06/24 06:28:00] ppsci INFO: train: epoch 182 | step 38 | lr 0.000461 | loss 0.068218 | mae 0.204659 -[2024/06/24 06:28:00] ppsci INFO: epoch: 182, train_loss: 0.092854, train_metric: 0.196127, eval_loss: 0.068016, eval_mae: 0.196602 -[2024/06/24 06:28:00] ppsci INFO: train: epoch 183 | step 0 | lr 0.000461 | loss 0.077127 | mae 0.200690 -[2024/06/24 06:28:01] ppsci INFO: train: epoch 183 | step 10 | lr 0.000461 | loss 0.063617 | mae 0.181676 -[2024/06/24 06:28:01] ppsci INFO: train: epoch 183 | step 20 | lr 0.000461 | loss 0.062304 | mae 0.177158 -[2024/06/24 06:28:02] ppsci INFO: train: epoch 183 | step 30 | lr 0.000461 | loss 0.080014 | mae 0.194119 -[2024/06/24 06:28:02] ppsci INFO: train: epoch 183 | step 38 | lr 0.000461 | loss 0.123380 | mae 0.259242 -[2024/06/24 06:28:02] ppsci INFO: epoch: 183, train_loss: 0.083709, train_metric: 0.190313, eval_loss: 0.067075, eval_mae: 0.196184 -[2024/06/24 06:28:03] ppsci INFO: train: epoch 184 | step 0 | lr 0.000460 | loss 0.070438 | mae 0.193195 -[2024/06/24 06:28:03] ppsci INFO: train: epoch 184 | step 10 | lr 0.000460 | loss 0.074494 | mae 0.197562 -[2024/06/24 06:28:04] ppsci INFO: train: epoch 184 | step 20 | lr 0.000460 | loss 0.074146 | mae 0.198854 -[2024/06/24 06:28:04] ppsci INFO: train: epoch 184 | step 30 | lr 0.000460 | loss 0.062419 | mae 0.182254 -[2024/06/24 06:28:05] ppsci INFO: train: epoch 184 | step 38 | lr 0.000460 | loss 0.061572 | mae 0.170372 -[2024/06/24 06:28:05] ppsci INFO: epoch: 184, train_loss: 0.081143, train_metric: 0.193942, eval_loss: 0.068023, eval_mae: 0.194534 -[2024/06/24 06:28:05] ppsci INFO: train: epoch 185 | step 0 | lr 0.000460 | loss 0.083599 | mae 0.198135 -[2024/06/24 06:28:06] ppsci INFO: train: epoch 185 | step 10 | lr 0.000460 | loss 0.057646 | mae 0.174003 -[2024/06/24 06:28:06] ppsci INFO: train: epoch 185 | step 20 | lr 0.000460 | loss 0.065895 | mae 0.190023 -[2024/06/24 06:28:06] ppsci INFO: train: epoch 185 | step 30 | lr 0.000460 | loss 0.072692 | mae 0.201604 -[2024/06/24 06:28:07] ppsci INFO: train: epoch 185 | step 38 | lr 0.000460 | loss 0.038550 | mae 0.165143 -[2024/06/24 06:28:07] ppsci INFO: epoch: 185, train_loss: 0.074391, train_metric: 0.189892, eval_loss: 0.074288, eval_mae: 0.197175 -[2024/06/24 06:28:07] ppsci INFO: train: epoch 186 | step 0 | lr 0.000459 | loss 0.052310 | mae 0.166380 -[2024/06/24 06:28:08] ppsci INFO: train: epoch 186 | step 10 | lr 0.000459 | loss 0.061490 | mae 0.181914 -[2024/06/24 06:28:08] ppsci INFO: train: epoch 186 | step 20 | lr 0.000459 | loss 0.085302 | mae 0.216036 -[2024/06/24 06:28:09] ppsci INFO: train: epoch 186 | step 30 | lr 0.000459 | loss 0.058594 | mae 0.174651 -[2024/06/24 06:28:09] ppsci INFO: train: epoch 186 | step 38 | lr 0.000459 | loss 0.049640 | mae 0.204756 -[2024/06/24 06:28:09] ppsci INFO: epoch: 186, train_loss: 0.077705, train_metric: 0.189800, eval_loss: 0.066422, eval_mae: 0.189069 -[2024/06/24 06:28:09] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:28:09] ppsci INFO: train: epoch 187 | step 0 | lr 0.000459 | loss 0.063603 | mae 0.169376 -[2024/06/24 06:28:10] ppsci INFO: train: epoch 187 | step 10 | lr 0.000459 | loss 0.058087 | mae 0.180750 -[2024/06/24 06:28:10] ppsci INFO: train: epoch 187 | step 20 | lr 0.000459 | loss 0.075648 | mae 0.192679 -[2024/06/24 06:28:11] ppsci INFO: train: epoch 187 | step 30 | lr 0.000459 | loss 0.073253 | mae 0.182987 -[2024/06/24 06:28:11] ppsci INFO: train: epoch 187 | step 38 | lr 0.000459 | loss 0.243398 | mae 0.290414 -[2024/06/24 06:28:11] ppsci INFO: epoch: 187, train_loss: 0.077318, train_metric: 0.184604, eval_loss: 0.067152, eval_mae: 0.193863 -[2024/06/24 06:28:12] ppsci INFO: train: epoch 188 | step 0 | lr 0.000458 | loss 0.058001 | mae 0.170886 -[2024/06/24 06:28:12] ppsci INFO: train: epoch 188 | step 10 | lr 0.000458 | loss 0.051993 | mae 0.178521 -[2024/06/24 06:28:13] ppsci INFO: train: epoch 188 | step 20 | lr 0.000458 | loss 0.094152 | mae 0.202542 -[2024/06/24 06:28:13] ppsci INFO: train: epoch 188 | step 30 | lr 0.000458 | loss 0.060388 | mae 0.181658 -[2024/06/24 06:28:14] ppsci INFO: train: epoch 188 | step 38 | lr 0.000458 | loss 0.088934 | mae 0.233484 -[2024/06/24 06:28:14] ppsci INFO: epoch: 188, train_loss: 0.082401, train_metric: 0.192187, eval_loss: 0.066048, eval_mae: 0.192824 -[2024/06/24 06:28:14] ppsci INFO: train: epoch 189 | step 0 | lr 0.000458 | loss 0.070092 | mae 0.188807 -[2024/06/24 06:28:14] ppsci INFO: train: epoch 189 | step 10 | lr 0.000458 | loss 0.059813 | mae 0.185734 -[2024/06/24 06:28:15] ppsci INFO: train: epoch 189 | step 20 | lr 0.000458 | loss 0.065706 | mae 0.171147 -[2024/06/24 06:28:15] ppsci INFO: train: epoch 189 | step 30 | lr 0.000458 | loss 0.069348 | mae 0.188065 -[2024/06/24 06:28:16] ppsci INFO: train: epoch 189 | step 38 | lr 0.000458 | loss 0.035550 | mae 0.162313 -[2024/06/24 06:28:16] ppsci INFO: epoch: 189, train_loss: 0.084440, train_metric: 0.191704, eval_loss: 0.066151, eval_mae: 0.191866 -[2024/06/24 06:28:16] ppsci INFO: train: epoch 190 | step 0 | lr 0.000458 | loss 0.070366 | mae 0.169394 -[2024/06/24 06:28:16] ppsci INFO: train: epoch 190 | step 10 | lr 0.000458 | loss 0.058055 | mae 0.186117 -[2024/06/24 06:28:17] ppsci INFO: train: epoch 190 | step 20 | lr 0.000458 | loss 0.076159 | mae 0.203058 -[2024/06/24 06:28:18] ppsci INFO: train: epoch 190 | step 30 | lr 0.000458 | loss 0.061848 | mae 0.178495 -[2024/06/24 06:28:18] ppsci INFO: train: epoch 190 | step 38 | lr 0.000458 | loss 0.101385 | mae 0.232733 -[2024/06/24 06:28:18] ppsci INFO: epoch: 190, train_loss: 0.075699, train_metric: 0.188311, eval_loss: 0.065445, eval_mae: 0.190348 -[2024/06/24 06:28:18] ppsci INFO: train: epoch 191 | step 0 | lr 0.000457 | loss 0.049528 | mae 0.173862 -[2024/06/24 06:28:19] ppsci INFO: train: epoch 191 | step 10 | lr 0.000457 | loss 0.081963 | mae 0.196828 -[2024/06/24 06:28:19] ppsci INFO: train: epoch 191 | step 20 | lr 0.000457 | loss 0.071576 | mae 0.188072 -[2024/06/24 06:28:20] ppsci INFO: train: epoch 191 | step 30 | lr 0.000457 | loss 0.054734 | mae 0.169605 -[2024/06/24 06:28:20] ppsci INFO: train: epoch 191 | step 38 | lr 0.000457 | loss 0.059633 | mae 0.198768 -[2024/06/24 06:28:20] ppsci INFO: epoch: 191, train_loss: 0.071521, train_metric: 0.187565, eval_loss: 0.067894, eval_mae: 0.194169 -[2024/06/24 06:28:21] ppsci INFO: train: epoch 192 | step 0 | lr 0.000457 | loss 0.055610 | mae 0.170877 -[2024/06/24 06:28:21] ppsci INFO: train: epoch 192 | step 10 | lr 0.000457 | loss 0.061125 | mae 0.188683 -[2024/06/24 06:28:21] ppsci INFO: train: epoch 192 | step 20 | lr 0.000457 | loss 0.058207 | mae 0.174985 -[2024/06/24 06:28:22] ppsci INFO: train: epoch 192 | step 30 | lr 0.000457 | loss 0.052425 | mae 0.173164 -[2024/06/24 06:28:22] ppsci INFO: train: epoch 192 | step 38 | lr 0.000457 | loss 0.101150 | mae 0.229727 -[2024/06/24 06:28:23] ppsci INFO: epoch: 192, train_loss: 0.075151, train_metric: 0.184389, eval_loss: 0.067406, eval_mae: 0.193583 -[2024/06/24 06:28:23] ppsci INFO: train: epoch 193 | step 0 | lr 0.000456 | loss 0.063563 | mae 0.177254 -[2024/06/24 06:28:23] ppsci INFO: train: epoch 193 | step 10 | lr 0.000456 | loss 0.050118 | mae 0.166539 -[2024/06/24 06:28:24] ppsci INFO: train: epoch 193 | step 20 | lr 0.000456 | loss 0.069822 | mae 0.189956 -[2024/06/24 06:28:24] ppsci INFO: train: epoch 193 | step 30 | lr 0.000456 | loss 0.066325 | mae 0.184105 -[2024/06/24 06:28:25] ppsci INFO: train: epoch 193 | step 38 | lr 0.000456 | loss 0.021903 | mae 0.114547 -[2024/06/24 06:28:25] ppsci INFO: epoch: 193, train_loss: 0.074742, train_metric: 0.190073, eval_loss: 0.066076, eval_mae: 0.189404 -[2024/06/24 06:28:25] ppsci INFO: train: epoch 194 | step 0 | lr 0.000456 | loss 0.386356 | mae 0.257370 -[2024/06/24 06:28:25] ppsci INFO: train: epoch 194 | step 10 | lr 0.000456 | loss 0.077852 | mae 0.176661 -[2024/06/24 06:28:26] ppsci INFO: train: epoch 194 | step 20 | lr 0.000456 | loss 0.083740 | mae 0.214099 -[2024/06/24 06:28:26] ppsci INFO: train: epoch 194 | step 30 | lr 0.000456 | loss 0.050220 | mae 0.169766 -[2024/06/24 06:28:27] ppsci INFO: train: epoch 194 | step 38 | lr 0.000456 | loss 0.054737 | mae 0.144460 -[2024/06/24 06:28:27] ppsci INFO: epoch: 194, train_loss: 0.083213, train_metric: 0.188193, eval_loss: 0.065615, eval_mae: 0.191414 -[2024/06/24 06:28:27] ppsci INFO: train: epoch 195 | step 0 | lr 0.000455 | loss 0.084018 | mae 0.205809 -[2024/06/24 06:28:27] ppsci INFO: train: epoch 195 | step 10 | lr 0.000455 | loss 0.076732 | mae 0.205691 -[2024/06/24 06:28:28] ppsci INFO: train: epoch 195 | step 20 | lr 0.000455 | loss 0.083650 | mae 0.204277 -[2024/06/24 06:28:28] ppsci INFO: train: epoch 195 | step 30 | lr 0.000455 | loss 0.077112 | mae 0.187888 -[2024/06/24 06:28:29] ppsci INFO: train: epoch 195 | step 38 | lr 0.000455 | loss 0.108876 | mae 0.255241 -[2024/06/24 06:28:29] ppsci INFO: epoch: 195, train_loss: 0.085178, train_metric: 0.191296, eval_loss: 0.066997, eval_mae: 0.192046 -[2024/06/24 06:28:29] ppsci INFO: train: epoch 196 | step 0 | lr 0.000455 | loss 0.051537 | mae 0.174127 -[2024/06/24 06:28:30] ppsci INFO: train: epoch 196 | step 10 | lr 0.000455 | loss 0.095596 | mae 0.219123 -[2024/06/24 06:28:30] ppsci INFO: train: epoch 196 | step 20 | lr 0.000455 | loss 0.080073 | mae 0.203357 -[2024/06/24 06:28:31] ppsci INFO: train: epoch 196 | step 30 | lr 0.000455 | loss 0.052984 | mae 0.179557 -[2024/06/24 06:28:31] ppsci INFO: train: epoch 196 | step 38 | lr 0.000455 | loss 0.033870 | mae 0.120446 -[2024/06/24 06:28:31] ppsci INFO: epoch: 196, train_loss: 0.083609, train_metric: 0.194205, eval_loss: 0.063873, eval_mae: 0.188532 -[2024/06/24 06:28:31] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:28:31] ppsci INFO: train: epoch 197 | step 0 | lr 0.000455 | loss 0.082567 | mae 0.181417 -[2024/06/24 06:28:32] ppsci INFO: train: epoch 197 | step 10 | lr 0.000455 | loss 0.061821 | mae 0.187205 -[2024/06/24 06:28:32] ppsci INFO: train: epoch 197 | step 20 | lr 0.000455 | loss 0.078646 | mae 0.190355 -[2024/06/24 06:28:33] ppsci INFO: train: epoch 197 | step 30 | lr 0.000455 | loss 0.090075 | mae 0.192925 -[2024/06/24 06:28:33] ppsci INFO: train: epoch 197 | step 38 | lr 0.000455 | loss 0.044500 | mae 0.186389 -[2024/06/24 06:28:33] ppsci INFO: epoch: 197, train_loss: 0.076500, train_metric: 0.188383, eval_loss: 0.067015, eval_mae: 0.191311 -[2024/06/24 06:28:33] ppsci INFO: train: epoch 198 | step 0 | lr 0.000454 | loss 0.056614 | mae 0.178724 -[2024/06/24 06:28:34] ppsci INFO: train: epoch 198 | step 10 | lr 0.000454 | loss 0.075351 | mae 0.195317 -[2024/06/24 06:28:34] ppsci INFO: train: epoch 198 | step 20 | lr 0.000454 | loss 0.047187 | mae 0.163882 -[2024/06/24 06:28:35] ppsci INFO: train: epoch 198 | step 30 | lr 0.000454 | loss 0.065880 | mae 0.190379 -[2024/06/24 06:28:35] ppsci INFO: train: epoch 198 | step 38 | lr 0.000454 | loss 0.081864 | mae 0.207143 -[2024/06/24 06:28:35] ppsci INFO: epoch: 198, train_loss: 0.073075, train_metric: 0.186274, eval_loss: 0.066002, eval_mae: 0.195029 -[2024/06/24 06:28:35] ppsci INFO: train: epoch 199 | step 0 | lr 0.000454 | loss 0.054768 | mae 0.158632 -[2024/06/24 06:28:36] ppsci INFO: train: epoch 199 | step 10 | lr 0.000454 | loss 0.078167 | mae 0.190520 -[2024/06/24 06:28:36] ppsci INFO: train: epoch 199 | step 20 | lr 0.000454 | loss 0.079282 | mae 0.198072 -[2024/06/24 06:28:37] ppsci INFO: train: epoch 199 | step 30 | lr 0.000454 | loss 0.257039 | mae 0.242650 -[2024/06/24 06:28:37] ppsci INFO: train: epoch 199 | step 38 | lr 0.000454 | loss 0.084959 | mae 0.222493 -[2024/06/24 06:28:37] ppsci INFO: epoch: 199, train_loss: 0.083922, train_metric: 0.188606, eval_loss: 0.068316, eval_mae: 0.196471 -[2024/06/24 06:28:37] ppsci INFO: train: epoch 200 | step 0 | lr 0.000453 | loss 0.175495 | mae 0.211434 -[2024/06/24 06:28:38] ppsci INFO: train: epoch 200 | step 10 | lr 0.000453 | loss 0.079631 | mae 0.207119 -[2024/06/24 06:28:38] ppsci INFO: train: epoch 200 | step 20 | lr 0.000453 | loss 0.072165 | mae 0.203492 -[2024/06/24 06:28:39] ppsci INFO: train: epoch 200 | step 30 | lr 0.000453 | loss 0.079860 | mae 0.181945 -[2024/06/24 06:28:39] ppsci INFO: train: epoch 200 | step 38 | lr 0.000453 | loss 0.052575 | mae 0.164133 -[2024/06/24 06:28:39] ppsci INFO: epoch: 200, train_loss: 0.076394, train_metric: 0.185607, eval_loss: 0.061486, eval_mae: 0.188353 -[2024/06/24 06:28:39] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:28:40] ppsci INFO: train: epoch 201 | step 0 | lr 0.000453 | loss 0.097059 | mae 0.211357 -[2024/06/24 06:28:40] ppsci INFO: train: epoch 201 | step 10 | lr 0.000453 | loss 0.065436 | mae 0.189720 -[2024/06/24 06:28:41] ppsci INFO: train: epoch 201 | step 20 | lr 0.000453 | loss 0.080465 | mae 0.199329 -[2024/06/24 06:28:41] ppsci INFO: train: epoch 201 | step 30 | lr 0.000453 | loss 0.062316 | mae 0.171319 -[2024/06/24 06:28:42] ppsci INFO: train: epoch 201 | step 38 | lr 0.000453 | loss 0.160733 | mae 0.313526 -[2024/06/24 06:28:42] ppsci INFO: epoch: 201, train_loss: 0.080775, train_metric: 0.188406, eval_loss: 0.067826, eval_mae: 0.192518 -[2024/06/24 06:28:42] ppsci INFO: train: epoch 202 | step 0 | lr 0.000452 | loss 0.083144 | mae 0.199639 -[2024/06/24 06:28:42] ppsci INFO: train: epoch 202 | step 10 | lr 0.000452 | loss 0.192160 | mae 0.225591 -[2024/06/24 06:28:43] ppsci INFO: train: epoch 202 | step 20 | lr 0.000452 | loss 0.243818 | mae 0.238272 -[2024/06/24 06:28:43] ppsci INFO: train: epoch 202 | step 30 | lr 0.000452 | loss 0.062525 | mae 0.181464 -[2024/06/24 06:28:44] ppsci INFO: train: epoch 202 | step 38 | lr 0.000452 | loss 0.030914 | mae 0.144735 -[2024/06/24 06:28:44] ppsci INFO: epoch: 202, train_loss: 0.082606, train_metric: 0.188020, eval_loss: 0.067877, eval_mae: 0.192109 -[2024/06/24 06:28:44] ppsci INFO: train: epoch 203 | step 0 | lr 0.000452 | loss 0.077451 | mae 0.191488 -[2024/06/24 06:28:44] ppsci INFO: train: epoch 203 | step 10 | lr 0.000452 | loss 0.077474 | mae 0.203579 -[2024/06/24 06:28:45] ppsci INFO: train: epoch 203 | step 20 | lr 0.000452 | loss 0.061149 | mae 0.176133 -[2024/06/24 06:28:45] ppsci INFO: train: epoch 203 | step 30 | lr 0.000452 | loss 0.056915 | mae 0.177389 -[2024/06/24 06:28:46] ppsci INFO: train: epoch 203 | step 38 | lr 0.000452 | loss 0.238875 | mae 0.293507 -[2024/06/24 06:28:46] ppsci INFO: epoch: 203, train_loss: 0.070963, train_metric: 0.184519, eval_loss: 0.065445, eval_mae: 0.191131 -[2024/06/24 06:28:46] ppsci INFO: train: epoch 204 | step 0 | lr 0.000451 | loss 0.075263 | mae 0.189627 -[2024/06/24 06:28:46] ppsci INFO: train: epoch 204 | step 10 | lr 0.000451 | loss 0.164066 | mae 0.191991 -[2024/06/24 06:28:47] ppsci INFO: train: epoch 204 | step 20 | lr 0.000451 | loss 0.059180 | mae 0.175581 -[2024/06/24 06:28:47] ppsci INFO: train: epoch 204 | step 30 | lr 0.000451 | loss 0.057965 | mae 0.172134 -[2024/06/24 06:28:48] ppsci INFO: train: epoch 204 | step 38 | lr 0.000451 | loss 0.063967 | mae 0.185749 -[2024/06/24 06:28:48] ppsci INFO: epoch: 204, train_loss: 0.070192, train_metric: 0.186677, eval_loss: 0.068671, eval_mae: 0.196776 -[2024/06/24 06:28:48] ppsci INFO: train: epoch 205 | step 0 | lr 0.000451 | loss 0.057537 | mae 0.171867 -[2024/06/24 06:28:49] ppsci INFO: train: epoch 205 | step 10 | lr 0.000451 | loss 0.151461 | mae 0.179204 -[2024/06/24 06:28:49] ppsci INFO: train: epoch 205 | step 20 | lr 0.000451 | loss 0.076350 | mae 0.196775 -[2024/06/24 06:28:50] ppsci INFO: train: epoch 205 | step 30 | lr 0.000451 | loss 0.074334 | mae 0.191546 -[2024/06/24 06:28:50] ppsci INFO: train: epoch 205 | step 38 | lr 0.000451 | loss 0.035916 | mae 0.160681 -[2024/06/24 06:28:50] ppsci INFO: epoch: 205, train_loss: 0.072636, train_metric: 0.184110, eval_loss: 0.063648, eval_mae: 0.187547 -[2024/06/24 06:28:50] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:28:50] ppsci INFO: train: epoch 206 | step 0 | lr 0.000450 | loss 0.075756 | mae 0.184394 -[2024/06/24 06:28:51] ppsci INFO: train: epoch 206 | step 10 | lr 0.000450 | loss 0.081244 | mae 0.196039 -[2024/06/24 06:28:51] ppsci INFO: train: epoch 206 | step 20 | lr 0.000450 | loss 0.064448 | mae 0.193533 -[2024/06/24 06:28:52] ppsci INFO: train: epoch 206 | step 30 | lr 0.000450 | loss 0.071046 | mae 0.185597 -[2024/06/24 06:28:52] ppsci INFO: train: epoch 206 | step 38 | lr 0.000450 | loss 0.036342 | mae 0.115886 -[2024/06/24 06:28:52] ppsci INFO: epoch: 206, train_loss: 0.075994, train_metric: 0.184986, eval_loss: 0.064767, eval_mae: 0.191260 -[2024/06/24 06:28:53] ppsci INFO: train: epoch 207 | step 0 | lr 0.000450 | loss 0.198126 | mae 0.245906 -[2024/06/24 06:28:53] ppsci INFO: train: epoch 207 | step 10 | lr 0.000450 | loss 0.054119 | mae 0.174791 -[2024/06/24 06:28:54] ppsci INFO: train: epoch 207 | step 20 | lr 0.000450 | loss 0.091639 | mae 0.213785 -[2024/06/24 06:28:54] ppsci INFO: train: epoch 207 | step 30 | lr 0.000450 | loss 0.062594 | mae 0.175162 -[2024/06/24 06:28:55] ppsci INFO: train: epoch 207 | step 38 | lr 0.000450 | loss 0.057555 | mae 0.172127 -[2024/06/24 06:28:55] ppsci INFO: epoch: 207, train_loss: 0.084919, train_metric: 0.190169, eval_loss: 0.065787, eval_mae: 0.191913 -[2024/06/24 06:28:55] ppsci INFO: train: epoch 208 | step 0 | lr 0.000450 | loss 0.054601 | mae 0.178943 -[2024/06/24 06:28:55] ppsci INFO: train: epoch 208 | step 10 | lr 0.000450 | loss 0.064887 | mae 0.191610 -[2024/06/24 06:28:56] ppsci INFO: train: epoch 208 | step 20 | lr 0.000450 | loss 0.061457 | mae 0.191453 -[2024/06/24 06:28:57] ppsci INFO: train: epoch 208 | step 30 | lr 0.000450 | loss 0.066326 | mae 0.186559 -[2024/06/24 06:28:57] ppsci INFO: train: epoch 208 | step 38 | lr 0.000450 | loss 0.054006 | mae 0.210979 -[2024/06/24 06:28:57] ppsci INFO: epoch: 208, train_loss: 0.070002, train_metric: 0.181235, eval_loss: 0.062374, eval_mae: 0.185839 -[2024/06/24 06:28:57] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:28:57] ppsci INFO: train: epoch 209 | step 0 | lr 0.000449 | loss 0.047666 | mae 0.154637 -[2024/06/24 06:28:58] ppsci INFO: train: epoch 209 | step 10 | lr 0.000449 | loss 0.060473 | mae 0.176179 -[2024/06/24 06:28:58] ppsci INFO: train: epoch 209 | step 20 | lr 0.000449 | loss 0.045558 | mae 0.158662 -[2024/06/24 06:28:59] ppsci INFO: train: epoch 209 | step 30 | lr 0.000449 | loss 0.047946 | mae 0.169062 -[2024/06/24 06:28:59] ppsci INFO: train: epoch 209 | step 38 | lr 0.000449 | loss 0.050061 | mae 0.176838 -[2024/06/24 06:28:59] ppsci INFO: epoch: 209, train_loss: 0.073049, train_metric: 0.184382, eval_loss: 0.062090, eval_mae: 0.186555 -[2024/06/24 06:28:59] ppsci INFO: train: epoch 210 | step 0 | lr 0.000449 | loss 0.064078 | mae 0.187506 -[2024/06/24 06:29:00] ppsci INFO: train: epoch 210 | step 10 | lr 0.000449 | loss 0.050960 | mae 0.164939 -[2024/06/24 06:29:00] ppsci INFO: train: epoch 210 | step 20 | lr 0.000449 | loss 0.049692 | mae 0.173967 -[2024/06/24 06:29:01] ppsci INFO: train: epoch 210 | step 30 | lr 0.000449 | loss 0.051117 | mae 0.165115 -[2024/06/24 06:29:01] ppsci INFO: train: epoch 210 | step 38 | lr 0.000449 | loss 0.030962 | mae 0.135691 -[2024/06/24 06:29:01] ppsci INFO: epoch: 210, train_loss: 0.067691, train_metric: 0.187009, eval_loss: 0.066589, eval_mae: 0.191493 -[2024/06/24 06:29:01] ppsci INFO: train: epoch 211 | step 0 | lr 0.000448 | loss 0.173531 | mae 0.223077 -[2024/06/24 06:29:02] ppsci INFO: train: epoch 211 | step 10 | lr 0.000448 | loss 0.075139 | mae 0.198553 -[2024/06/24 06:29:02] ppsci INFO: train: epoch 211 | step 20 | lr 0.000448 | loss 0.066028 | mae 0.185408 -[2024/06/24 06:29:03] ppsci INFO: train: epoch 211 | step 30 | lr 0.000448 | loss 0.052918 | mae 0.169241 -[2024/06/24 06:29:03] ppsci INFO: train: epoch 211 | step 38 | lr 0.000448 | loss 0.062654 | mae 0.189794 -[2024/06/24 06:29:03] ppsci INFO: epoch: 211, train_loss: 0.067141, train_metric: 0.182906, eval_loss: 0.063171, eval_mae: 0.186483 -[2024/06/24 06:29:03] ppsci INFO: train: epoch 212 | step 0 | lr 0.000448 | loss 0.051271 | mae 0.163167 -[2024/06/24 06:29:04] ppsci INFO: train: epoch 212 | step 10 | lr 0.000448 | loss 0.057149 | mae 0.180443 -[2024/06/24 06:29:04] ppsci INFO: train: epoch 212 | step 20 | lr 0.000448 | loss 0.059943 | mae 0.180179 -[2024/06/24 06:29:05] ppsci INFO: train: epoch 212 | step 30 | lr 0.000448 | loss 0.074851 | mae 0.180836 -[2024/06/24 06:29:05] ppsci INFO: train: epoch 212 | step 38 | lr 0.000448 | loss 0.031847 | mae 0.147996 -[2024/06/24 06:29:05] ppsci INFO: epoch: 212, train_loss: 0.066589, train_metric: 0.181199, eval_loss: 0.069485, eval_mae: 0.188808 -[2024/06/24 06:29:05] ppsci INFO: train: epoch 213 | step 0 | lr 0.000447 | loss 0.053048 | mae 0.166616 -[2024/06/24 06:29:06] ppsci INFO: train: epoch 213 | step 10 | lr 0.000447 | loss 0.090536 | mae 0.208290 -[2024/06/24 06:29:07] ppsci INFO: train: epoch 213 | step 20 | lr 0.000447 | loss 0.090001 | mae 0.194080 -[2024/06/24 06:29:07] ppsci INFO: train: epoch 213 | step 30 | lr 0.000447 | loss 0.041788 | mae 0.154222 -[2024/06/24 06:29:08] ppsci INFO: train: epoch 213 | step 38 | lr 0.000447 | loss 0.083478 | mae 0.198396 -[2024/06/24 06:29:08] ppsci INFO: epoch: 213, train_loss: 0.075773, train_metric: 0.183772, eval_loss: 0.063989, eval_mae: 0.186742 -[2024/06/24 06:29:08] ppsci INFO: train: epoch 214 | step 0 | lr 0.000447 | loss 0.089483 | mae 0.195540 -[2024/06/24 06:29:08] ppsci INFO: train: epoch 214 | step 10 | lr 0.000447 | loss 0.048751 | mae 0.158402 -[2024/06/24 06:29:09] ppsci INFO: train: epoch 214 | step 20 | lr 0.000447 | loss 0.059170 | mae 0.185073 -[2024/06/24 06:29:09] ppsci INFO: train: epoch 214 | step 30 | lr 0.000447 | loss 0.062016 | mae 0.179094 -[2024/06/24 06:29:10] ppsci INFO: train: epoch 214 | step 38 | lr 0.000447 | loss 0.094290 | mae 0.220046 -[2024/06/24 06:29:10] ppsci INFO: epoch: 214, train_loss: 0.070375, train_metric: 0.184040, eval_loss: 0.069562, eval_mae: 0.192246 -[2024/06/24 06:29:10] ppsci INFO: train: epoch 215 | step 0 | lr 0.000446 | loss 0.089589 | mae 0.176153 -[2024/06/24 06:29:11] ppsci INFO: train: epoch 215 | step 10 | lr 0.000446 | loss 0.081129 | mae 0.196650 -[2024/06/24 06:29:11] ppsci INFO: train: epoch 215 | step 20 | lr 0.000446 | loss 0.086652 | mae 0.206586 -[2024/06/24 06:29:12] ppsci INFO: train: epoch 215 | step 30 | lr 0.000446 | loss 0.075311 | mae 0.182807 -[2024/06/24 06:29:12] ppsci INFO: train: epoch 215 | step 38 | lr 0.000446 | loss 0.036930 | mae 0.154600 -[2024/06/24 06:29:12] ppsci INFO: epoch: 215, train_loss: 0.075742, train_metric: 0.186815, eval_loss: 0.067704, eval_mae: 0.192670 -[2024/06/24 06:29:12] ppsci INFO: train: epoch 216 | step 0 | lr 0.000446 | loss 0.072568 | mae 0.196137 -[2024/06/24 06:29:13] ppsci INFO: train: epoch 216 | step 10 | lr 0.000446 | loss 0.061650 | mae 0.184603 -[2024/06/24 06:29:13] ppsci INFO: train: epoch 216 | step 20 | lr 0.000446 | loss 0.064594 | mae 0.180162 -[2024/06/24 06:29:14] ppsci INFO: train: epoch 216 | step 30 | lr 0.000446 | loss 0.062692 | mae 0.182746 -[2024/06/24 06:29:14] ppsci INFO: train: epoch 216 | step 38 | lr 0.000446 | loss 0.076164 | mae 0.233798 -[2024/06/24 06:29:14] ppsci INFO: epoch: 216, train_loss: 0.079018, train_metric: 0.188694, eval_loss: 0.069046, eval_mae: 0.188212 -[2024/06/24 06:29:15] ppsci INFO: train: epoch 217 | step 0 | lr 0.000445 | loss 0.122472 | mae 0.211664 -[2024/06/24 06:29:15] ppsci INFO: train: epoch 217 | step 10 | lr 0.000445 | loss 0.066560 | mae 0.182674 -[2024/06/24 06:29:16] ppsci INFO: train: epoch 217 | step 20 | lr 0.000445 | loss 0.078490 | mae 0.201950 -[2024/06/24 06:29:16] ppsci INFO: train: epoch 217 | step 30 | lr 0.000445 | loss 0.062153 | mae 0.158273 -[2024/06/24 06:29:17] ppsci INFO: train: epoch 217 | step 38 | lr 0.000445 | loss 0.092043 | mae 0.221619 -[2024/06/24 06:29:17] ppsci INFO: epoch: 217, train_loss: 0.073716, train_metric: 0.181424, eval_loss: 0.061832, eval_mae: 0.184143 -[2024/06/24 06:29:17] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:29:17] ppsci INFO: train: epoch 218 | step 0 | lr 0.000445 | loss 0.110715 | mae 0.208825 -[2024/06/24 06:29:17] ppsci INFO: train: epoch 218 | step 10 | lr 0.000445 | loss 0.073265 | mae 0.196577 -[2024/06/24 06:29:18] ppsci INFO: train: epoch 218 | step 20 | lr 0.000445 | loss 0.049516 | mae 0.163925 -[2024/06/24 06:29:18] ppsci INFO: train: epoch 218 | step 30 | lr 0.000445 | loss 0.054376 | mae 0.180815 -[2024/06/24 06:29:19] ppsci INFO: train: epoch 218 | step 38 | lr 0.000445 | loss 0.029154 | mae 0.132553 -[2024/06/24 06:29:19] ppsci INFO: epoch: 218, train_loss: 0.070478, train_metric: 0.184992, eval_loss: 0.068807, eval_mae: 0.189110 -[2024/06/24 06:29:19] ppsci INFO: train: epoch 219 | step 0 | lr 0.000444 | loss 0.085717 | mae 0.204038 -[2024/06/24 06:29:19] ppsci INFO: train: epoch 219 | step 10 | lr 0.000444 | loss 0.056764 | mae 0.164524 -[2024/06/24 06:29:20] ppsci INFO: train: epoch 219 | step 20 | lr 0.000444 | loss 0.063337 | mae 0.191355 -[2024/06/24 06:29:21] ppsci INFO: train: epoch 219 | step 30 | lr 0.000444 | loss 0.053650 | mae 0.164332 -[2024/06/24 06:29:21] ppsci INFO: train: epoch 219 | step 38 | lr 0.000444 | loss 0.036445 | mae 0.166531 -[2024/06/24 06:29:21] ppsci INFO: epoch: 219, train_loss: 0.069978, train_metric: 0.184129, eval_loss: 0.059760, eval_mae: 0.188883 -[2024/06/24 06:29:21] ppsci INFO: train: epoch 220 | step 0 | lr 0.000444 | loss 0.052776 | mae 0.166346 -[2024/06/24 06:29:22] ppsci INFO: train: epoch 220 | step 10 | lr 0.000444 | loss 0.052941 | mae 0.166197 -[2024/06/24 06:29:22] ppsci INFO: train: epoch 220 | step 20 | lr 0.000444 | loss 0.065100 | mae 0.190287 -[2024/06/24 06:29:23] ppsci INFO: train: epoch 220 | step 30 | lr 0.000444 | loss 0.064292 | mae 0.186482 -[2024/06/24 06:29:23] ppsci INFO: train: epoch 220 | step 38 | lr 0.000444 | loss 0.171320 | mae 0.229842 -[2024/06/24 06:29:23] ppsci INFO: epoch: 220, train_loss: 0.066894, train_metric: 0.182216, eval_loss: 0.061295, eval_mae: 0.186985 -[2024/06/24 06:29:23] ppsci INFO: train: epoch 221 | step 0 | lr 0.000443 | loss 0.064226 | mae 0.173001 -[2024/06/24 06:29:24] ppsci INFO: train: epoch 221 | step 10 | lr 0.000443 | loss 0.054279 | mae 0.174014 -[2024/06/24 06:29:24] ppsci INFO: train: epoch 221 | step 20 | lr 0.000443 | loss 0.067715 | mae 0.192637 -[2024/06/24 06:29:25] ppsci INFO: train: epoch 221 | step 30 | lr 0.000443 | loss 0.047509 | mae 0.165908 -[2024/06/24 06:29:25] ppsci INFO: train: epoch 221 | step 38 | lr 0.000443 | loss 0.029857 | mae 0.121876 -[2024/06/24 06:29:25] ppsci INFO: epoch: 221, train_loss: 0.075970, train_metric: 0.186750, eval_loss: 0.059624, eval_mae: 0.185694 -[2024/06/24 06:29:25] ppsci INFO: train: epoch 222 | step 0 | lr 0.000443 | loss 0.063620 | mae 0.177983 -[2024/06/24 06:29:26] ppsci INFO: train: epoch 222 | step 10 | lr 0.000443 | loss 0.081124 | mae 0.194256 -[2024/06/24 06:29:26] ppsci INFO: train: epoch 222 | step 20 | lr 0.000443 | loss 0.088309 | mae 0.194173 -[2024/06/24 06:29:27] ppsci INFO: train: epoch 222 | step 30 | lr 0.000443 | loss 0.190785 | mae 0.212417 -[2024/06/24 06:29:27] ppsci INFO: train: epoch 222 | step 38 | lr 0.000443 | loss 0.051927 | mae 0.153842 -[2024/06/24 06:29:28] ppsci INFO: epoch: 222, train_loss: 0.068098, train_metric: 0.183097, eval_loss: 0.063499, eval_mae: 0.192999 -[2024/06/24 06:29:28] ppsci INFO: train: epoch 223 | step 0 | lr 0.000442 | loss 0.076487 | mae 0.186365 -[2024/06/24 06:29:28] ppsci INFO: train: epoch 223 | step 10 | lr 0.000442 | loss 0.043344 | mae 0.162573 -[2024/06/24 06:29:29] ppsci INFO: train: epoch 223 | step 20 | lr 0.000442 | loss 0.064711 | mae 0.188435 -[2024/06/24 06:29:29] ppsci INFO: train: epoch 223 | step 30 | lr 0.000442 | loss 0.062894 | mae 0.188836 -[2024/06/24 06:29:30] ppsci INFO: train: epoch 223 | step 38 | lr 0.000442 | loss 0.081300 | mae 0.201382 -[2024/06/24 06:29:30] ppsci INFO: epoch: 223, train_loss: 0.066708, train_metric: 0.182373, eval_loss: 0.060635, eval_mae: 0.182473 -[2024/06/24 06:29:30] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:29:30] ppsci INFO: train: epoch 224 | step 0 | lr 0.000442 | loss 0.065687 | mae 0.178358 -[2024/06/24 06:29:30] ppsci INFO: train: epoch 224 | step 10 | lr 0.000442 | loss 0.073611 | mae 0.194454 -[2024/06/24 06:29:31] ppsci INFO: train: epoch 224 | step 20 | lr 0.000442 | loss 0.045271 | mae 0.171827 -[2024/06/24 06:29:31] ppsci INFO: train: epoch 224 | step 30 | lr 0.000442 | loss 0.059531 | mae 0.187760 -[2024/06/24 06:29:32] ppsci INFO: train: epoch 224 | step 38 | lr 0.000442 | loss 0.034799 | mae 0.166230 -[2024/06/24 06:29:32] ppsci INFO: epoch: 224, train_loss: 0.069533, train_metric: 0.180199, eval_loss: 0.063975, eval_mae: 0.195454 -[2024/06/24 06:29:32] ppsci INFO: train: epoch 225 | step 0 | lr 0.000441 | loss 0.070550 | mae 0.193294 -[2024/06/24 06:29:32] ppsci INFO: train: epoch 225 | step 10 | lr 0.000441 | loss 0.089502 | mae 0.210440 -[2024/06/24 06:29:33] ppsci INFO: train: epoch 225 | step 20 | lr 0.000441 | loss 0.048929 | mae 0.155053 -[2024/06/24 06:29:33] ppsci INFO: train: epoch 225 | step 30 | lr 0.000441 | loss 0.035068 | mae 0.145987 -[2024/06/24 06:29:34] ppsci INFO: train: epoch 225 | step 38 | lr 0.000441 | loss 0.025786 | mae 0.114713 -[2024/06/24 06:29:34] ppsci INFO: epoch: 225, train_loss: 0.066492, train_metric: 0.181476, eval_loss: 0.058354, eval_mae: 0.184003 -[2024/06/24 06:29:34] ppsci INFO: train: epoch 226 | step 0 | lr 0.000441 | loss 0.064767 | mae 0.177460 -[2024/06/24 06:29:34] ppsci INFO: train: epoch 226 | step 10 | lr 0.000441 | loss 0.120491 | mae 0.198515 -[2024/06/24 06:29:35] ppsci INFO: train: epoch 226 | step 20 | lr 0.000441 | loss 0.091029 | mae 0.216595 -[2024/06/24 06:29:35] ppsci INFO: train: epoch 226 | step 30 | lr 0.000441 | loss 0.055074 | mae 0.174307 -[2024/06/24 06:29:36] ppsci INFO: train: epoch 226 | step 38 | lr 0.000441 | loss 0.065121 | mae 0.190380 -[2024/06/24 06:29:36] ppsci INFO: epoch: 226, train_loss: 0.071493, train_metric: 0.183888, eval_loss: 0.067352, eval_mae: 0.191369 -[2024/06/24 06:29:36] ppsci INFO: train: epoch 227 | step 0 | lr 0.000440 | loss 0.062994 | mae 0.173076 -[2024/06/24 06:29:36] ppsci INFO: train: epoch 227 | step 10 | lr 0.000440 | loss 0.064125 | mae 0.182302 -[2024/06/24 06:29:37] ppsci INFO: train: epoch 227 | step 20 | lr 0.000440 | loss 0.077813 | mae 0.183200 -[2024/06/24 06:29:37] ppsci INFO: train: epoch 227 | step 30 | lr 0.000440 | loss 0.094792 | mae 0.204508 -[2024/06/24 06:29:38] ppsci INFO: train: epoch 227 | step 38 | lr 0.000440 | loss 0.125269 | mae 0.228968 -[2024/06/24 06:29:38] ppsci INFO: epoch: 227, train_loss: 0.076462, train_metric: 0.183317, eval_loss: 0.061532, eval_mae: 0.185697 -[2024/06/24 06:29:38] ppsci INFO: train: epoch 228 | step 0 | lr 0.000440 | loss 0.092709 | mae 0.198731 -[2024/06/24 06:29:39] ppsci INFO: train: epoch 228 | step 10 | lr 0.000440 | loss 0.069557 | mae 0.179928 -[2024/06/24 06:29:39] ppsci INFO: train: epoch 228 | step 20 | lr 0.000440 | loss 0.061428 | mae 0.192713 -[2024/06/24 06:29:40] ppsci INFO: train: epoch 228 | step 30 | lr 0.000440 | loss 0.056120 | mae 0.160640 -[2024/06/24 06:29:40] ppsci INFO: train: epoch 228 | step 38 | lr 0.000440 | loss 0.078358 | mae 0.207477 -[2024/06/24 06:29:40] ppsci INFO: epoch: 228, train_loss: 0.065706, train_metric: 0.181244, eval_loss: 0.067739, eval_mae: 0.192769 -[2024/06/24 06:29:40] ppsci INFO: train: epoch 229 | step 0 | lr 0.000439 | loss 0.062964 | mae 0.190764 -[2024/06/24 06:29:41] ppsci INFO: train: epoch 229 | step 10 | lr 0.000439 | loss 0.073676 | mae 0.197829 -[2024/06/24 06:29:41] ppsci INFO: train: epoch 229 | step 20 | lr 0.000439 | loss 0.086578 | mae 0.205919 -[2024/06/24 06:29:42] ppsci INFO: train: epoch 229 | step 30 | lr 0.000439 | loss 0.051780 | mae 0.168376 -[2024/06/24 06:29:42] ppsci INFO: train: epoch 229 | step 38 | lr 0.000439 | loss 0.085072 | mae 0.218543 -[2024/06/24 06:29:42] ppsci INFO: epoch: 229, train_loss: 0.070225, train_metric: 0.185048, eval_loss: 0.064438, eval_mae: 0.185592 -[2024/06/24 06:29:42] ppsci INFO: train: epoch 230 | step 0 | lr 0.000439 | loss 0.052880 | mae 0.170007 -[2024/06/24 06:29:43] ppsci INFO: train: epoch 230 | step 10 | lr 0.000439 | loss 0.065580 | mae 0.186167 -[2024/06/24 06:29:43] ppsci INFO: train: epoch 230 | step 20 | lr 0.000439 | loss 0.048865 | mae 0.159008 -[2024/06/24 06:29:44] ppsci INFO: train: epoch 230 | step 30 | lr 0.000439 | loss 0.055825 | mae 0.177497 -[2024/06/24 06:29:44] ppsci INFO: train: epoch 230 | step 38 | lr 0.000439 | loss 0.044482 | mae 0.163282 -[2024/06/24 06:29:44] ppsci INFO: epoch: 230, train_loss: 0.065337, train_metric: 0.178249, eval_loss: 0.064151, eval_mae: 0.189096 -[2024/06/24 06:29:44] ppsci INFO: train: epoch 231 | step 0 | lr 0.000438 | loss 0.067947 | mae 0.185676 -[2024/06/24 06:29:45] ppsci INFO: train: epoch 231 | step 10 | lr 0.000438 | loss 0.067012 | mae 0.185630 -[2024/06/24 06:29:45] ppsci INFO: train: epoch 231 | step 20 | lr 0.000438 | loss 0.091657 | mae 0.184126 -[2024/06/24 06:29:46] ppsci INFO: train: epoch 231 | step 30 | lr 0.000438 | loss 0.064600 | mae 0.180439 -[2024/06/24 06:29:46] ppsci INFO: train: epoch 231 | step 38 | lr 0.000438 | loss 0.085461 | mae 0.221863 -[2024/06/24 06:29:46] ppsci INFO: epoch: 231, train_loss: 0.071715, train_metric: 0.181369, eval_loss: 0.071635, eval_mae: 0.196533 -[2024/06/24 06:29:46] ppsci INFO: train: epoch 232 | step 0 | lr 0.000438 | loss 0.070915 | mae 0.179071 -[2024/06/24 06:29:47] ppsci INFO: train: epoch 232 | step 10 | lr 0.000438 | loss 0.059745 | mae 0.180762 -[2024/06/24 06:29:47] ppsci INFO: train: epoch 232 | step 20 | lr 0.000438 | loss 0.063442 | mae 0.188125 -[2024/06/24 06:29:48] ppsci INFO: train: epoch 232 | step 30 | lr 0.000438 | loss 0.073005 | mae 0.196123 -[2024/06/24 06:29:48] ppsci INFO: train: epoch 232 | step 38 | lr 0.000438 | loss 0.030321 | mae 0.124279 -[2024/06/24 06:29:48] ppsci INFO: epoch: 232, train_loss: 0.062949, train_metric: 0.178298, eval_loss: 0.064582, eval_mae: 0.182601 -[2024/06/24 06:29:49] ppsci INFO: train: epoch 233 | step 0 | lr 0.000437 | loss 0.119815 | mae 0.229864 -[2024/06/24 06:29:49] ppsci INFO: train: epoch 233 | step 10 | lr 0.000437 | loss 0.074209 | mae 0.198759 -[2024/06/24 06:29:50] ppsci INFO: train: epoch 233 | step 20 | lr 0.000437 | loss 0.046644 | mae 0.162529 -[2024/06/24 06:29:50] ppsci INFO: train: epoch 233 | step 30 | lr 0.000437 | loss 0.109626 | mae 0.205728 -[2024/06/24 06:29:50] ppsci INFO: train: epoch 233 | step 38 | lr 0.000437 | loss 0.033249 | mae 0.130127 -[2024/06/24 06:29:51] ppsci INFO: epoch: 233, train_loss: 0.067952, train_metric: 0.179151, eval_loss: 0.068898, eval_mae: 0.189012 -[2024/06/24 06:29:51] ppsci INFO: train: epoch 234 | step 0 | lr 0.000437 | loss 0.071403 | mae 0.187845 -[2024/06/24 06:29:51] ppsci INFO: train: epoch 234 | step 10 | lr 0.000437 | loss 0.050710 | mae 0.166198 -[2024/06/24 06:29:52] ppsci INFO: train: epoch 234 | step 20 | lr 0.000437 | loss 0.048793 | mae 0.167862 -[2024/06/24 06:29:52] ppsci INFO: train: epoch 234 | step 30 | lr 0.000437 | loss 0.044147 | mae 0.158998 -[2024/06/24 06:29:53] ppsci INFO: train: epoch 234 | step 38 | lr 0.000437 | loss 0.010892 | mae 0.088296 -[2024/06/24 06:29:53] ppsci INFO: epoch: 234, train_loss: 0.066079, train_metric: 0.176749, eval_loss: 0.064208, eval_mae: 0.185265 -[2024/06/24 06:29:53] ppsci INFO: train: epoch 235 | step 0 | lr 0.000436 | loss 0.045931 | mae 0.161678 -[2024/06/24 06:29:53] ppsci INFO: train: epoch 235 | step 10 | lr 0.000436 | loss 0.069747 | mae 0.178616 -[2024/06/24 06:29:54] ppsci INFO: train: epoch 235 | step 20 | lr 0.000436 | loss 0.050858 | mae 0.173494 -[2024/06/24 06:29:54] ppsci INFO: train: epoch 235 | step 30 | lr 0.000436 | loss 0.056134 | mae 0.168423 -[2024/06/24 06:29:55] ppsci INFO: train: epoch 235 | step 38 | lr 0.000436 | loss 0.136818 | mae 0.264553 -[2024/06/24 06:29:55] ppsci INFO: epoch: 235, train_loss: 0.070094, train_metric: 0.180897, eval_loss: 0.065957, eval_mae: 0.191508 -[2024/06/24 06:29:55] ppsci INFO: train: epoch 236 | step 0 | lr 0.000436 | loss 0.065437 | mae 0.184672 -[2024/06/24 06:29:56] ppsci INFO: train: epoch 236 | step 10 | lr 0.000436 | loss 0.052699 | mae 0.174371 -[2024/06/24 06:29:56] ppsci INFO: train: epoch 236 | step 20 | lr 0.000436 | loss 0.066206 | mae 0.174311 -[2024/06/24 06:29:57] ppsci INFO: train: epoch 236 | step 30 | lr 0.000436 | loss 0.060708 | mae 0.173806 -[2024/06/24 06:29:57] ppsci INFO: train: epoch 236 | step 38 | lr 0.000436 | loss 0.032200 | mae 0.140403 -[2024/06/24 06:29:57] ppsci INFO: epoch: 236, train_loss: 0.061710, train_metric: 0.178364, eval_loss: 0.072414, eval_mae: 0.195255 -[2024/06/24 06:29:57] ppsci INFO: train: epoch 237 | step 0 | lr 0.000435 | loss 0.080331 | mae 0.190361 -[2024/06/24 06:29:58] ppsci INFO: train: epoch 237 | step 10 | lr 0.000435 | loss 0.055880 | mae 0.160588 -[2024/06/24 06:29:58] ppsci INFO: train: epoch 237 | step 20 | lr 0.000435 | loss 0.051713 | mae 0.157698 -[2024/06/24 06:29:59] ppsci INFO: train: epoch 237 | step 30 | lr 0.000435 | loss 0.077560 | mae 0.200091 -[2024/06/24 06:29:59] ppsci INFO: train: epoch 237 | step 38 | lr 0.000435 | loss 0.045017 | mae 0.167266 -[2024/06/24 06:29:59] ppsci INFO: epoch: 237, train_loss: 0.063902, train_metric: 0.174418, eval_loss: 0.061608, eval_mae: 0.189420 -[2024/06/24 06:29:59] ppsci INFO: train: epoch 238 | step 0 | lr 0.000435 | loss 0.168177 | mae 0.208993 -[2024/06/24 06:30:00] ppsci INFO: train: epoch 238 | step 10 | lr 0.000435 | loss 0.049135 | mae 0.171128 -[2024/06/24 06:30:00] ppsci INFO: train: epoch 238 | step 20 | lr 0.000435 | loss 0.046035 | mae 0.163945 -[2024/06/24 06:30:01] ppsci INFO: train: epoch 238 | step 30 | lr 0.000435 | loss 0.069828 | mae 0.180475 -[2024/06/24 06:30:01] ppsci INFO: train: epoch 238 | step 38 | lr 0.000435 | loss 0.137194 | mae 0.259266 -[2024/06/24 06:30:01] ppsci INFO: epoch: 238, train_loss: 0.064834, train_metric: 0.177338, eval_loss: 0.060130, eval_mae: 0.187117 -[2024/06/24 06:30:01] ppsci INFO: train: epoch 239 | step 0 | lr 0.000434 | loss 0.070437 | mae 0.187638 -[2024/06/24 06:30:02] ppsci INFO: train: epoch 239 | step 10 | lr 0.000434 | loss 0.066539 | mae 0.188004 -[2024/06/24 06:30:03] ppsci INFO: train: epoch 239 | step 20 | lr 0.000434 | loss 0.066793 | mae 0.188380 -[2024/06/24 06:30:03] ppsci INFO: train: epoch 239 | step 30 | lr 0.000434 | loss 0.102054 | mae 0.202953 -[2024/06/24 06:30:04] ppsci INFO: train: epoch 239 | step 38 | lr 0.000434 | loss 0.038291 | mae 0.163132 -[2024/06/24 06:30:04] ppsci INFO: epoch: 239, train_loss: 0.067914, train_metric: 0.181826, eval_loss: 0.065589, eval_mae: 0.184509 -[2024/06/24 06:30:04] ppsci INFO: train: epoch 240 | step 0 | lr 0.000434 | loss 0.060235 | mae 0.185792 -[2024/06/24 06:30:04] ppsci INFO: train: epoch 240 | step 10 | lr 0.000434 | loss 0.049692 | mae 0.168647 -[2024/06/24 06:30:05] ppsci INFO: train: epoch 240 | step 20 | lr 0.000434 | loss 0.046812 | mae 0.160423 -[2024/06/24 06:30:05] ppsci INFO: train: epoch 240 | step 30 | lr 0.000434 | loss 0.082671 | mae 0.200658 -[2024/06/24 06:30:06] ppsci INFO: train: epoch 240 | step 38 | lr 0.000434 | loss 0.018470 | mae 0.103487 -[2024/06/24 06:30:06] ppsci INFO: epoch: 240, train_loss: 0.059049, train_metric: 0.178232, eval_loss: 0.066107, eval_mae: 0.185815 -[2024/06/24 06:30:06] ppsci INFO: train: epoch 241 | step 0 | lr 0.000433 | loss 0.041975 | mae 0.156654 -[2024/06/24 06:30:06] ppsci INFO: train: epoch 241 | step 10 | lr 0.000433 | loss 0.059296 | mae 0.178679 -[2024/06/24 06:30:07] ppsci INFO: train: epoch 241 | step 20 | lr 0.000433 | loss 0.097603 | mae 0.199638 -[2024/06/24 06:30:07] ppsci INFO: train: epoch 241 | step 30 | lr 0.000433 | loss 0.065243 | mae 0.187318 -[2024/06/24 06:30:08] ppsci INFO: train: epoch 241 | step 38 | lr 0.000433 | loss 0.029527 | mae 0.136882 -[2024/06/24 06:30:08] ppsci INFO: epoch: 241, train_loss: 0.069474, train_metric: 0.181446, eval_loss: 0.065898, eval_mae: 0.190073 -[2024/06/24 06:30:08] ppsci INFO: train: epoch 242 | step 0 | lr 0.000433 | loss 0.072187 | mae 0.208895 -[2024/06/24 06:30:09] ppsci INFO: train: epoch 242 | step 10 | lr 0.000433 | loss 0.058964 | mae 0.173292 -[2024/06/24 06:30:09] ppsci INFO: train: epoch 242 | step 20 | lr 0.000433 | loss 0.038030 | mae 0.142731 -[2024/06/24 06:30:10] ppsci INFO: train: epoch 242 | step 30 | lr 0.000433 | loss 0.124992 | mae 0.198911 -[2024/06/24 06:30:10] ppsci INFO: train: epoch 242 | step 38 | lr 0.000433 | loss 0.089604 | mae 0.247418 -[2024/06/24 06:30:10] ppsci INFO: epoch: 242, train_loss: 0.070115, train_metric: 0.180088, eval_loss: 0.063195, eval_mae: 0.187692 -[2024/06/24 06:30:10] ppsci INFO: train: epoch 243 | step 0 | lr 0.000432 | loss 0.053349 | mae 0.167633 -[2024/06/24 06:30:11] ppsci INFO: train: epoch 243 | step 10 | lr 0.000432 | loss 0.056777 | mae 0.175309 -[2024/06/24 06:30:11] ppsci INFO: train: epoch 243 | step 20 | lr 0.000432 | loss 0.068829 | mae 0.186284 -[2024/06/24 06:30:12] ppsci INFO: train: epoch 243 | step 30 | lr 0.000432 | loss 0.069608 | mae 0.172584 -[2024/06/24 06:30:12] ppsci INFO: train: epoch 243 | step 38 | lr 0.000432 | loss 0.031476 | mae 0.138597 -[2024/06/24 06:30:12] ppsci INFO: epoch: 243, train_loss: 0.063118, train_metric: 0.174852, eval_loss: 0.066981, eval_mae: 0.195927 -[2024/06/24 06:30:12] ppsci INFO: train: epoch 244 | step 0 | lr 0.000431 | loss 0.071503 | mae 0.190664 -[2024/06/24 06:30:13] ppsci INFO: train: epoch 244 | step 10 | lr 0.000431 | loss 0.107590 | mae 0.215298 -[2024/06/24 06:30:13] ppsci INFO: train: epoch 244 | step 20 | lr 0.000431 | loss 0.047075 | mae 0.170014 -[2024/06/24 06:30:14] ppsci INFO: train: epoch 244 | step 30 | lr 0.000431 | loss 0.053488 | mae 0.170072 -[2024/06/24 06:30:14] ppsci INFO: train: epoch 244 | step 38 | lr 0.000431 | loss 0.095438 | mae 0.238242 -[2024/06/24 06:30:14] ppsci INFO: epoch: 244, train_loss: 0.069955, train_metric: 0.183386, eval_loss: 0.067357, eval_mae: 0.186194 -[2024/06/24 06:30:14] ppsci INFO: train: epoch 245 | step 0 | lr 0.000431 | loss 0.042397 | mae 0.153956 -[2024/06/24 06:30:15] ppsci INFO: train: epoch 245 | step 10 | lr 0.000431 | loss 0.071239 | mae 0.178009 -[2024/06/24 06:30:15] ppsci INFO: train: epoch 245 | step 20 | lr 0.000431 | loss 0.090205 | mae 0.212226 -[2024/06/24 06:30:16] ppsci INFO: train: epoch 245 | step 30 | lr 0.000431 | loss 0.061907 | mae 0.170721 -[2024/06/24 06:30:16] ppsci INFO: train: epoch 245 | step 38 | lr 0.000431 | loss 0.151892 | mae 0.303126 -[2024/06/24 06:30:16] ppsci INFO: epoch: 245, train_loss: 0.071503, train_metric: 0.178301, eval_loss: 0.066424, eval_mae: 0.183980 -[2024/06/24 06:30:17] ppsci INFO: train: epoch 246 | step 0 | lr 0.000430 | loss 0.077389 | mae 0.181837 -[2024/06/24 06:30:17] ppsci INFO: train: epoch 246 | step 10 | lr 0.000430 | loss 0.052952 | mae 0.154384 -[2024/06/24 06:30:18] ppsci INFO: train: epoch 246 | step 20 | lr 0.000430 | loss 0.070916 | mae 0.172008 -[2024/06/24 06:30:18] ppsci INFO: train: epoch 246 | step 30 | lr 0.000430 | loss 0.079067 | mae 0.196869 -[2024/06/24 06:30:19] ppsci INFO: train: epoch 246 | step 38 | lr 0.000430 | loss 0.024583 | mae 0.138740 -[2024/06/24 06:30:19] ppsci INFO: epoch: 246, train_loss: 0.073561, train_metric: 0.180159, eval_loss: 0.065825, eval_mae: 0.187513 -[2024/06/24 06:30:19] ppsci INFO: train: epoch 247 | step 0 | lr 0.000430 | loss 0.056612 | mae 0.173498 -[2024/06/24 06:30:19] ppsci INFO: train: epoch 247 | step 10 | lr 0.000430 | loss 0.052609 | mae 0.167258 -[2024/06/24 06:30:20] ppsci INFO: train: epoch 247 | step 20 | lr 0.000430 | loss 0.064834 | mae 0.189173 -[2024/06/24 06:30:20] ppsci INFO: train: epoch 247 | step 30 | lr 0.000430 | loss 0.063619 | mae 0.186506 -[2024/06/24 06:30:21] ppsci INFO: train: epoch 247 | step 38 | lr 0.000430 | loss 0.035702 | mae 0.161602 -[2024/06/24 06:30:21] ppsci INFO: epoch: 247, train_loss: 0.059299, train_metric: 0.173674, eval_loss: 0.061167, eval_mae: 0.183512 -[2024/06/24 06:30:21] ppsci INFO: train: epoch 248 | step 0 | lr 0.000429 | loss 0.066071 | mae 0.176010 -[2024/06/24 06:30:21] ppsci INFO: train: epoch 248 | step 10 | lr 0.000429 | loss 0.049131 | mae 0.159044 -[2024/06/24 06:30:22] ppsci INFO: train: epoch 248 | step 20 | lr 0.000429 | loss 0.049630 | mae 0.164012 -[2024/06/24 06:30:22] ppsci INFO: train: epoch 248 | step 30 | lr 0.000429 | loss 0.088551 | mae 0.194452 -[2024/06/24 06:30:23] ppsci INFO: train: epoch 248 | step 38 | lr 0.000429 | loss 0.076772 | mae 0.224069 -[2024/06/24 06:30:23] ppsci INFO: epoch: 248, train_loss: 0.066325, train_metric: 0.179036, eval_loss: 0.064591, eval_mae: 0.185036 -[2024/06/24 06:30:23] ppsci INFO: train: epoch 249 | step 0 | lr 0.000429 | loss 0.071327 | mae 0.194162 -[2024/06/24 06:30:23] ppsci INFO: train: epoch 249 | step 10 | lr 0.000429 | loss 0.063814 | mae 0.174251 -[2024/06/24 06:30:24] ppsci INFO: train: epoch 249 | step 20 | lr 0.000429 | loss 0.070107 | mae 0.190391 -[2024/06/24 06:30:24] ppsci INFO: train: epoch 249 | step 30 | lr 0.000429 | loss 0.053180 | mae 0.161162 -[2024/06/24 06:30:25] ppsci INFO: train: epoch 249 | step 38 | lr 0.000429 | loss 0.078189 | mae 0.228812 -[2024/06/24 06:30:25] ppsci INFO: epoch: 249, train_loss: 0.076053, train_metric: 0.182305, eval_loss: 0.066524, eval_mae: 0.188869 -[2024/06/24 06:30:25] ppsci INFO: train: epoch 250 | step 0 | lr 0.000428 | loss 0.100022 | mae 0.177132 -[2024/06/24 06:30:26] ppsci INFO: train: epoch 250 | step 10 | lr 0.000428 | loss 0.061147 | mae 0.177513 -[2024/06/24 06:30:26] ppsci INFO: train: epoch 250 | step 20 | lr 0.000428 | loss 0.078083 | mae 0.206848 -[2024/06/24 06:30:27] ppsci INFO: train: epoch 250 | step 30 | lr 0.000428 | loss 0.062622 | mae 0.177319 -[2024/06/24 06:30:27] ppsci INFO: train: epoch 250 | step 38 | lr 0.000428 | loss 0.128286 | mae 0.306620 -[2024/06/24 06:30:27] ppsci INFO: epoch: 250, train_loss: 0.070669, train_metric: 0.182503, eval_loss: 0.059304, eval_mae: 0.182464 -[2024/06/24 06:30:27] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:30:27] ppsci INFO: train: epoch 251 | step 0 | lr 0.000428 | loss 0.063568 | mae 0.176279 -[2024/06/24 06:30:28] ppsci INFO: train: epoch 251 | step 10 | lr 0.000428 | loss 0.071021 | mae 0.186654 -[2024/06/24 06:30:28] ppsci INFO: train: epoch 251 | step 20 | lr 0.000428 | loss 0.060808 | mae 0.171588 -[2024/06/24 06:30:29] ppsci INFO: train: epoch 251 | step 30 | lr 0.000428 | loss 0.060454 | mae 0.167481 -[2024/06/24 06:30:29] ppsci INFO: train: epoch 251 | step 38 | lr 0.000428 | loss 0.053399 | mae 0.154643 -[2024/06/24 06:30:29] ppsci INFO: epoch: 251, train_loss: 0.069892, train_metric: 0.178818, eval_loss: 0.070020, eval_mae: 0.191187 -[2024/06/24 06:30:29] ppsci INFO: train: epoch 252 | step 0 | lr 0.000427 | loss 0.063411 | mae 0.168644 -[2024/06/24 06:30:30] ppsci INFO: train: epoch 252 | step 10 | lr 0.000427 | loss 0.090947 | mae 0.198595 -[2024/06/24 06:30:30] ppsci INFO: train: epoch 252 | step 20 | lr 0.000427 | loss 0.069603 | mae 0.173322 -[2024/06/24 06:30:31] ppsci INFO: train: epoch 252 | step 30 | lr 0.000427 | loss 0.076344 | mae 0.194314 -[2024/06/24 06:30:31] ppsci INFO: train: epoch 252 | step 38 | lr 0.000427 | loss 0.066259 | mae 0.163376 -[2024/06/24 06:30:31] ppsci INFO: epoch: 252, train_loss: 0.063990, train_metric: 0.174596, eval_loss: 0.062650, eval_mae: 0.180968 -[2024/06/24 06:30:31] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:30:31] ppsci INFO: train: epoch 253 | step 0 | lr 0.000427 | loss 0.062240 | mae 0.179657 -[2024/06/24 06:30:32] ppsci INFO: train: epoch 253 | step 10 | lr 0.000427 | loss 0.068605 | mae 0.171463 -[2024/06/24 06:30:33] ppsci INFO: train: epoch 253 | step 20 | lr 0.000427 | loss 0.076541 | mae 0.182624 -[2024/06/24 06:30:33] ppsci INFO: train: epoch 253 | step 30 | lr 0.000427 | loss 0.068961 | mae 0.197128 -[2024/06/24 06:30:34] ppsci INFO: train: epoch 253 | step 38 | lr 0.000427 | loss 0.186854 | mae 0.259557 -[2024/06/24 06:30:34] ppsci INFO: epoch: 253, train_loss: 0.070293, train_metric: 0.178303, eval_loss: 0.065709, eval_mae: 0.187835 -[2024/06/24 06:30:34] ppsci INFO: train: epoch 254 | step 0 | lr 0.000426 | loss 0.037432 | mae 0.156872 -[2024/06/24 06:30:34] ppsci INFO: train: epoch 254 | step 10 | lr 0.000426 | loss 0.067175 | mae 0.179970 -[2024/06/24 06:30:35] ppsci INFO: train: epoch 254 | step 20 | lr 0.000426 | loss 0.073130 | mae 0.189455 -[2024/06/24 06:30:35] ppsci INFO: train: epoch 254 | step 30 | lr 0.000426 | loss 0.059325 | mae 0.175474 -[2024/06/24 06:30:36] ppsci INFO: train: epoch 254 | step 38 | lr 0.000426 | loss 0.059118 | mae 0.191401 -[2024/06/24 06:30:36] ppsci INFO: epoch: 254, train_loss: 0.062604, train_metric: 0.177228, eval_loss: 0.060735, eval_mae: 0.181874 -[2024/06/24 06:30:36] ppsci INFO: train: epoch 255 | step 0 | lr 0.000425 | loss 0.064982 | mae 0.170328 -[2024/06/24 06:30:36] ppsci INFO: train: epoch 255 | step 10 | lr 0.000425 | loss 0.067277 | mae 0.167607 -[2024/06/24 06:30:37] ppsci INFO: train: epoch 255 | step 20 | lr 0.000425 | loss 0.093779 | mae 0.215027 -[2024/06/24 06:30:37] ppsci INFO: train: epoch 255 | step 30 | lr 0.000425 | loss 0.053940 | mae 0.168731 -[2024/06/24 06:30:38] ppsci INFO: train: epoch 255 | step 38 | lr 0.000425 | loss 0.065447 | mae 0.184615 -[2024/06/24 06:30:38] ppsci INFO: epoch: 255, train_loss: 0.069418, train_metric: 0.179774, eval_loss: 0.062798, eval_mae: 0.183946 -[2024/06/24 06:30:38] ppsci INFO: train: epoch 256 | step 0 | lr 0.000425 | loss 0.064435 | mae 0.167548 -[2024/06/24 06:30:38] ppsci INFO: train: epoch 256 | step 10 | lr 0.000425 | loss 0.055257 | mae 0.166660 -[2024/06/24 06:30:39] ppsci INFO: train: epoch 256 | step 20 | lr 0.000425 | loss 0.098722 | mae 0.201621 -[2024/06/24 06:30:39] ppsci INFO: train: epoch 256 | step 30 | lr 0.000425 | loss 0.068942 | mae 0.165618 -[2024/06/24 06:30:40] ppsci INFO: train: epoch 256 | step 38 | lr 0.000425 | loss 0.021847 | mae 0.123019 -[2024/06/24 06:30:40] ppsci INFO: epoch: 256, train_loss: 0.070138, train_metric: 0.181316, eval_loss: 0.062115, eval_mae: 0.182163 -[2024/06/24 06:30:40] ppsci INFO: train: epoch 257 | step 0 | lr 0.000424 | loss 0.039607 | mae 0.152086 -[2024/06/24 06:30:41] ppsci INFO: train: epoch 257 | step 10 | lr 0.000424 | loss 0.084257 | mae 0.190574 -[2024/06/24 06:30:41] ppsci INFO: train: epoch 257 | step 20 | lr 0.000424 | loss 0.084903 | mae 0.191127 -[2024/06/24 06:30:42] ppsci INFO: train: epoch 257 | step 30 | lr 0.000424 | loss 0.060704 | mae 0.177827 -[2024/06/24 06:30:42] ppsci INFO: train: epoch 257 | step 38 | lr 0.000424 | loss 0.038469 | mae 0.157324 -[2024/06/24 06:30:42] ppsci INFO: epoch: 257, train_loss: 0.062462, train_metric: 0.176147, eval_loss: 0.065839, eval_mae: 0.185745 -[2024/06/24 06:30:42] ppsci INFO: train: epoch 258 | step 0 | lr 0.000424 | loss 0.068778 | mae 0.186364 -[2024/06/24 06:30:43] ppsci INFO: train: epoch 258 | step 10 | lr 0.000424 | loss 0.053909 | mae 0.178037 -[2024/06/24 06:30:43] ppsci INFO: train: epoch 258 | step 20 | lr 0.000424 | loss 0.082067 | mae 0.213771 -[2024/06/24 06:30:44] ppsci INFO: train: epoch 258 | step 30 | lr 0.000424 | loss 0.077105 | mae 0.182050 -[2024/06/24 06:30:44] ppsci INFO: train: epoch 258 | step 38 | lr 0.000424 | loss 0.013589 | mae 0.097457 -[2024/06/24 06:30:44] ppsci INFO: epoch: 258, train_loss: 0.061795, train_metric: 0.177961, eval_loss: 0.067573, eval_mae: 0.187808 -[2024/06/24 06:30:44] ppsci INFO: train: epoch 259 | step 0 | lr 0.000423 | loss 0.077290 | mae 0.190888 -[2024/06/24 06:30:45] ppsci INFO: train: epoch 259 | step 10 | lr 0.000423 | loss 0.053782 | mae 0.170881 -[2024/06/24 06:30:46] ppsci INFO: train: epoch 259 | step 20 | lr 0.000423 | loss 0.053077 | mae 0.154434 -[2024/06/24 06:30:46] ppsci INFO: train: epoch 259 | step 30 | lr 0.000423 | loss 0.042569 | mae 0.154434 -[2024/06/24 06:30:46] ppsci INFO: train: epoch 259 | step 38 | lr 0.000423 | loss 0.018971 | mae 0.115803 -[2024/06/24 06:30:47] ppsci INFO: epoch: 259, train_loss: 0.066171, train_metric: 0.177012, eval_loss: 0.070180, eval_mae: 0.187646 -[2024/06/24 06:30:47] ppsci INFO: train: epoch 260 | step 0 | lr 0.000423 | loss 0.054746 | mae 0.167193 -[2024/06/24 06:30:47] ppsci INFO: train: epoch 260 | step 10 | lr 0.000423 | loss 0.063823 | mae 0.185583 -[2024/06/24 06:30:48] ppsci INFO: train: epoch 260 | step 20 | lr 0.000423 | loss 0.066173 | mae 0.181449 -[2024/06/24 06:30:48] ppsci INFO: train: epoch 260 | step 30 | lr 0.000423 | loss 0.046916 | mae 0.171110 -[2024/06/24 06:30:49] ppsci INFO: train: epoch 260 | step 38 | lr 0.000423 | loss 0.016703 | mae 0.108001 -[2024/06/24 06:30:49] ppsci INFO: epoch: 260, train_loss: 0.066524, train_metric: 0.178766, eval_loss: 0.064491, eval_mae: 0.182025 -[2024/06/24 06:30:49] ppsci INFO: train: epoch 261 | step 0 | lr 0.000422 | loss 0.053735 | mae 0.170322 -[2024/06/24 06:30:49] ppsci INFO: train: epoch 261 | step 10 | lr 0.000422 | loss 0.051655 | mae 0.164529 -[2024/06/24 06:30:50] ppsci INFO: train: epoch 261 | step 20 | lr 0.000422 | loss 0.052141 | mae 0.165520 -[2024/06/24 06:30:50] ppsci INFO: train: epoch 261 | step 30 | lr 0.000422 | loss 0.062838 | mae 0.176970 -[2024/06/24 06:30:51] ppsci INFO: train: epoch 261 | step 38 | lr 0.000422 | loss 0.079963 | mae 0.155995 -[2024/06/24 06:30:51] ppsci INFO: epoch: 261, train_loss: 0.061467, train_metric: 0.173196, eval_loss: 0.069002, eval_mae: 0.186752 -[2024/06/24 06:30:51] ppsci INFO: train: epoch 262 | step 0 | lr 0.000422 | loss 0.055399 | mae 0.172758 -[2024/06/24 06:30:51] ppsci INFO: train: epoch 262 | step 10 | lr 0.000422 | loss 0.058348 | mae 0.174463 -[2024/06/24 06:30:52] ppsci INFO: train: epoch 262 | step 20 | lr 0.000422 | loss 0.060222 | mae 0.183060 -[2024/06/24 06:30:52] ppsci INFO: train: epoch 262 | step 30 | lr 0.000422 | loss 0.064973 | mae 0.187575 -[2024/06/24 06:30:53] ppsci INFO: train: epoch 262 | step 38 | lr 0.000422 | loss 0.057571 | mae 0.195879 -[2024/06/24 06:30:53] ppsci INFO: epoch: 262, train_loss: 0.065593, train_metric: 0.174531, eval_loss: 0.064460, eval_mae: 0.179545 -[2024/06/24 06:30:53] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:30:53] ppsci INFO: train: epoch 263 | step 0 | lr 0.000421 | loss 0.075612 | mae 0.178001 -[2024/06/24 06:30:54] ppsci INFO: train: epoch 263 | step 10 | lr 0.000421 | loss 0.065101 | mae 0.165168 -[2024/06/24 06:30:54] ppsci INFO: train: epoch 263 | step 20 | lr 0.000421 | loss 0.058034 | mae 0.185584 -[2024/06/24 06:30:55] ppsci INFO: train: epoch 263 | step 30 | lr 0.000421 | loss 0.059704 | mae 0.175163 -[2024/06/24 06:30:55] ppsci INFO: train: epoch 263 | step 38 | lr 0.000421 | loss 0.037370 | mae 0.147978 -[2024/06/24 06:30:55] ppsci INFO: epoch: 263, train_loss: 0.063686, train_metric: 0.178125, eval_loss: 0.065981, eval_mae: 0.183805 -[2024/06/24 06:30:55] ppsci INFO: train: epoch 264 | step 0 | lr 0.000420 | loss 0.048906 | mae 0.155369 -[2024/06/24 06:30:56] ppsci INFO: train: epoch 264 | step 10 | lr 0.000420 | loss 0.161326 | mae 0.205570 -[2024/06/24 06:30:56] ppsci INFO: train: epoch 264 | step 20 | lr 0.000420 | loss 0.061434 | mae 0.180309 -[2024/06/24 06:30:57] ppsci INFO: train: epoch 264 | step 30 | lr 0.000420 | loss 0.089605 | mae 0.206076 -[2024/06/24 06:30:57] ppsci INFO: train: epoch 264 | step 38 | lr 0.000420 | loss 0.167990 | mae 0.257857 -[2024/06/24 06:30:57] ppsci INFO: epoch: 264, train_loss: 0.065618, train_metric: 0.174242, eval_loss: 0.069865, eval_mae: 0.185777 -[2024/06/24 06:30:57] ppsci INFO: train: epoch 265 | step 0 | lr 0.000420 | loss 0.060720 | mae 0.176390 -[2024/06/24 06:30:58] ppsci INFO: train: epoch 265 | step 10 | lr 0.000420 | loss 0.072852 | mae 0.187711 -[2024/06/24 06:30:58] ppsci INFO: train: epoch 265 | step 20 | lr 0.000420 | loss 0.087643 | mae 0.186482 -[2024/06/24 06:30:59] ppsci INFO: train: epoch 265 | step 30 | lr 0.000420 | loss 0.068592 | mae 0.183922 -[2024/06/24 06:30:59] ppsci INFO: train: epoch 265 | step 38 | lr 0.000420 | loss 0.190163 | mae 0.228008 -[2024/06/24 06:30:59] ppsci INFO: epoch: 265, train_loss: 0.071848, train_metric: 0.177914, eval_loss: 0.065802, eval_mae: 0.184699 -[2024/06/24 06:31:00] ppsci INFO: train: epoch 266 | step 0 | lr 0.000419 | loss 0.053732 | mae 0.171083 -[2024/06/24 06:31:00] ppsci INFO: train: epoch 266 | step 10 | lr 0.000419 | loss 0.047594 | mae 0.157356 -[2024/06/24 06:31:01] ppsci INFO: train: epoch 266 | step 20 | lr 0.000419 | loss 0.042442 | mae 0.159275 -[2024/06/24 06:31:01] ppsci INFO: train: epoch 266 | step 30 | lr 0.000419 | loss 0.091168 | mae 0.215350 -[2024/06/24 06:31:01] ppsci INFO: train: epoch 266 | step 38 | lr 0.000419 | loss 0.157028 | mae 0.296338 -[2024/06/24 06:31:02] ppsci INFO: epoch: 266, train_loss: 0.068100, train_metric: 0.174513, eval_loss: 0.069578, eval_mae: 0.184319 -[2024/06/24 06:31:02] ppsci INFO: train: epoch 267 | step 0 | lr 0.000419 | loss 0.075764 | mae 0.196549 -[2024/06/24 06:31:02] ppsci INFO: train: epoch 267 | step 10 | lr 0.000419 | loss 0.060354 | mae 0.177099 -[2024/06/24 06:31:03] ppsci INFO: train: epoch 267 | step 20 | lr 0.000419 | loss 0.046698 | mae 0.164253 -[2024/06/24 06:31:03] ppsci INFO: train: epoch 267 | step 30 | lr 0.000419 | loss 0.052696 | mae 0.167493 -[2024/06/24 06:31:04] ppsci INFO: train: epoch 267 | step 38 | lr 0.000419 | loss 0.128471 | mae 0.280044 -[2024/06/24 06:31:04] ppsci INFO: epoch: 267, train_loss: 0.066652, train_metric: 0.175323, eval_loss: 0.072399, eval_mae: 0.195491 -[2024/06/24 06:31:04] ppsci INFO: train: epoch 268 | step 0 | lr 0.000418 | loss 0.062259 | mae 0.178562 -[2024/06/24 06:31:04] ppsci INFO: train: epoch 268 | step 10 | lr 0.000418 | loss 0.071997 | mae 0.184312 -[2024/06/24 06:31:05] ppsci INFO: train: epoch 268 | step 20 | lr 0.000418 | loss 0.046236 | mae 0.166916 -[2024/06/24 06:31:05] ppsci INFO: train: epoch 268 | step 30 | lr 0.000418 | loss 0.084037 | mae 0.192954 -[2024/06/24 06:31:06] ppsci INFO: train: epoch 268 | step 38 | lr 0.000418 | loss 0.046767 | mae 0.168778 -[2024/06/24 06:31:06] ppsci INFO: epoch: 268, train_loss: 0.063876, train_metric: 0.177215, eval_loss: 0.069001, eval_mae: 0.187751 -[2024/06/24 06:31:06] ppsci INFO: train: epoch 269 | step 0 | lr 0.000418 | loss 0.056392 | mae 0.164653 -[2024/06/24 06:31:06] ppsci INFO: train: epoch 269 | step 10 | lr 0.000418 | loss 0.059807 | mae 0.163745 -[2024/06/24 06:31:07] ppsci INFO: train: epoch 269 | step 20 | lr 0.000418 | loss 0.059320 | mae 0.179584 -[2024/06/24 06:31:08] ppsci INFO: train: epoch 269 | step 30 | lr 0.000418 | loss 0.081156 | mae 0.184203 -[2024/06/24 06:31:08] ppsci INFO: train: epoch 269 | step 38 | lr 0.000418 | loss 0.087200 | mae 0.201472 -[2024/06/24 06:31:08] ppsci INFO: epoch: 269, train_loss: 0.065493, train_metric: 0.174813, eval_loss: 0.061580, eval_mae: 0.178399 -[2024/06/24 06:31:08] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:31:08] ppsci INFO: train: epoch 270 | step 0 | lr 0.000417 | loss 0.050881 | mae 0.160872 -[2024/06/24 06:31:09] ppsci INFO: train: epoch 270 | step 10 | lr 0.000417 | loss 0.046916 | mae 0.152614 -[2024/06/24 06:31:09] ppsci INFO: train: epoch 270 | step 20 | lr 0.000417 | loss 0.045981 | mae 0.157240 -[2024/06/24 06:31:10] ppsci INFO: train: epoch 270 | step 30 | lr 0.000417 | loss 0.041269 | mae 0.152153 -[2024/06/24 06:31:10] ppsci INFO: train: epoch 270 | step 38 | lr 0.000417 | loss 0.037633 | mae 0.136171 -[2024/06/24 06:31:10] ppsci INFO: epoch: 270, train_loss: 0.066451, train_metric: 0.175587, eval_loss: 0.068437, eval_mae: 0.183087 -[2024/06/24 06:31:10] ppsci INFO: train: epoch 271 | step 0 | lr 0.000416 | loss 0.065284 | mae 0.176522 -[2024/06/24 06:31:11] ppsci INFO: train: epoch 271 | step 10 | lr 0.000416 | loss 0.049047 | mae 0.160919 -[2024/06/24 06:31:11] ppsci INFO: train: epoch 271 | step 20 | lr 0.000416 | loss 0.047566 | mae 0.156063 -[2024/06/24 06:31:12] ppsci INFO: train: epoch 271 | step 30 | lr 0.000416 | loss 0.080907 | mae 0.188634 -[2024/06/24 06:31:12] ppsci INFO: train: epoch 271 | step 38 | lr 0.000416 | loss 0.090998 | mae 0.234032 -[2024/06/24 06:31:13] ppsci INFO: epoch: 271, train_loss: 0.065827, train_metric: 0.174691, eval_loss: 0.070970, eval_mae: 0.181828 -[2024/06/24 06:31:13] ppsci INFO: train: epoch 272 | step 0 | lr 0.000416 | loss 0.070364 | mae 0.188303 -[2024/06/24 06:31:13] ppsci INFO: train: epoch 272 | step 10 | lr 0.000416 | loss 0.041437 | mae 0.147074 -[2024/06/24 06:31:14] ppsci INFO: train: epoch 272 | step 20 | lr 0.000416 | loss 0.051078 | mae 0.163084 -[2024/06/24 06:31:14] ppsci INFO: train: epoch 272 | step 30 | lr 0.000416 | loss 0.051402 | mae 0.162846 -[2024/06/24 06:31:15] ppsci INFO: train: epoch 272 | step 38 | lr 0.000416 | loss 0.046699 | mae 0.167741 -[2024/06/24 06:31:15] ppsci INFO: epoch: 272, train_loss: 0.061856, train_metric: 0.171927, eval_loss: 0.066235, eval_mae: 0.179722 -[2024/06/24 06:31:15] ppsci INFO: train: epoch 273 | step 0 | lr 0.000415 | loss 0.072762 | mae 0.194453 -[2024/06/24 06:31:15] ppsci INFO: train: epoch 273 | step 10 | lr 0.000415 | loss 0.052097 | mae 0.173118 -[2024/06/24 06:31:16] ppsci INFO: train: epoch 273 | step 20 | lr 0.000415 | loss 0.064082 | mae 0.171939 -[2024/06/24 06:31:16] ppsci INFO: train: epoch 273 | step 30 | lr 0.000415 | loss 0.035734 | mae 0.144783 -[2024/06/24 06:31:17] ppsci INFO: train: epoch 273 | step 38 | lr 0.000415 | loss 0.034945 | mae 0.135940 -[2024/06/24 06:31:17] ppsci INFO: epoch: 273, train_loss: 0.062914, train_metric: 0.175863, eval_loss: 0.067591, eval_mae: 0.180722 -[2024/06/24 06:31:17] ppsci INFO: train: epoch 274 | step 0 | lr 0.000415 | loss 0.063741 | mae 0.184031 -[2024/06/24 06:31:17] ppsci INFO: train: epoch 274 | step 10 | lr 0.000415 | loss 0.047699 | mae 0.155408 -[2024/06/24 06:31:18] ppsci INFO: train: epoch 274 | step 20 | lr 0.000415 | loss 0.056896 | mae 0.171709 -[2024/06/24 06:31:18] ppsci INFO: train: epoch 274 | step 30 | lr 0.000415 | loss 0.072213 | mae 0.177428 -[2024/06/24 06:31:19] ppsci INFO: train: epoch 274 | step 38 | lr 0.000415 | loss 0.167979 | mae 0.302472 -[2024/06/24 06:31:19] ppsci INFO: epoch: 274, train_loss: 0.063654, train_metric: 0.173816, eval_loss: 0.070253, eval_mae: 0.185305 -[2024/06/24 06:31:19] ppsci INFO: train: epoch 275 | step 0 | lr 0.000414 | loss 0.043994 | mae 0.160083 -[2024/06/24 06:31:19] ppsci INFO: train: epoch 275 | step 10 | lr 0.000414 | loss 0.069257 | mae 0.184747 -[2024/06/24 06:31:20] ppsci INFO: train: epoch 275 | step 20 | lr 0.000414 | loss 0.085148 | mae 0.193893 -[2024/06/24 06:31:20] ppsci INFO: train: epoch 275 | step 30 | lr 0.000414 | loss 0.063620 | mae 0.166534 -[2024/06/24 06:31:21] ppsci INFO: train: epoch 275 | step 38 | lr 0.000414 | loss 0.038202 | mae 0.124718 -[2024/06/24 06:31:21] ppsci INFO: epoch: 275, train_loss: 0.063279, train_metric: 0.176422, eval_loss: 0.069505, eval_mae: 0.182833 -[2024/06/24 06:31:21] ppsci INFO: train: epoch 276 | step 0 | lr 0.000414 | loss 0.068548 | mae 0.160570 -[2024/06/24 06:31:21] ppsci INFO: train: epoch 276 | step 10 | lr 0.000414 | loss 0.063722 | mae 0.190051 -[2024/06/24 06:31:22] ppsci INFO: train: epoch 276 | step 20 | lr 0.000414 | loss 0.044720 | mae 0.158300 -[2024/06/24 06:31:22] ppsci INFO: train: epoch 276 | step 30 | lr 0.000414 | loss 0.053883 | mae 0.167438 -[2024/06/24 06:31:23] ppsci INFO: train: epoch 276 | step 38 | lr 0.000414 | loss 0.036815 | mae 0.139517 -[2024/06/24 06:31:23] ppsci INFO: epoch: 276, train_loss: 0.066112, train_metric: 0.177619, eval_loss: 0.061406, eval_mae: 0.177601 -[2024/06/24 06:31:23] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:31:23] ppsci INFO: train: epoch 277 | step 0 | lr 0.000413 | loss 0.045177 | mae 0.153245 -[2024/06/24 06:31:23] ppsci INFO: train: epoch 277 | step 10 | lr 0.000413 | loss 0.054203 | mae 0.174015 -[2024/06/24 06:31:24] ppsci INFO: train: epoch 277 | step 20 | lr 0.000413 | loss 0.049411 | mae 0.172358 -[2024/06/24 06:31:24] ppsci INFO: train: epoch 277 | step 30 | lr 0.000413 | loss 0.071892 | mae 0.199842 -[2024/06/24 06:31:25] ppsci INFO: train: epoch 277 | step 38 | lr 0.000413 | loss 0.039809 | mae 0.151429 -[2024/06/24 06:31:25] ppsci INFO: epoch: 277, train_loss: 0.066062, train_metric: 0.176338, eval_loss: 0.072795, eval_mae: 0.189034 -[2024/06/24 06:31:25] ppsci INFO: train: epoch 278 | step 0 | lr 0.000412 | loss 0.051595 | mae 0.170302 -[2024/06/24 06:31:26] ppsci INFO: train: epoch 278 | step 10 | lr 0.000412 | loss 0.048299 | mae 0.149981 -[2024/06/24 06:31:26] ppsci INFO: train: epoch 278 | step 20 | lr 0.000412 | loss 0.067880 | mae 0.175005 -[2024/06/24 06:31:27] ppsci INFO: train: epoch 278 | step 30 | lr 0.000412 | loss 0.051680 | mae 0.169903 -[2024/06/24 06:31:27] ppsci INFO: train: epoch 278 | step 38 | lr 0.000412 | loss 0.031844 | mae 0.138947 -[2024/06/24 06:31:27] ppsci INFO: epoch: 278, train_loss: 0.058974, train_metric: 0.171548, eval_loss: 0.062474, eval_mae: 0.178241 -[2024/06/24 06:31:27] ppsci INFO: train: epoch 279 | step 0 | lr 0.000412 | loss 0.039860 | mae 0.148421 -[2024/06/24 06:31:28] ppsci INFO: train: epoch 279 | step 10 | lr 0.000412 | loss 0.047513 | mae 0.160969 -[2024/06/24 06:31:28] ppsci INFO: train: epoch 279 | step 20 | lr 0.000412 | loss 0.050295 | mae 0.167736 -[2024/06/24 06:31:29] ppsci INFO: train: epoch 279 | step 30 | lr 0.000412 | loss 0.049235 | mae 0.163357 -[2024/06/24 06:31:29] ppsci INFO: train: epoch 279 | step 38 | lr 0.000412 | loss 0.062762 | mae 0.203009 -[2024/06/24 06:31:29] ppsci INFO: epoch: 279, train_loss: 0.059503, train_metric: 0.171469, eval_loss: 0.061119, eval_mae: 0.178742 -[2024/06/24 06:31:29] ppsci INFO: train: epoch 280 | step 0 | lr 0.000411 | loss 0.059000 | mae 0.174244 -[2024/06/24 06:31:30] ppsci INFO: train: epoch 280 | step 10 | lr 0.000411 | loss 0.057464 | mae 0.154554 -[2024/06/24 06:31:30] ppsci INFO: train: epoch 280 | step 20 | lr 0.000411 | loss 0.049910 | mae 0.163596 -[2024/06/24 06:31:31] ppsci INFO: train: epoch 280 | step 30 | lr 0.000411 | loss 0.120013 | mae 0.207289 -[2024/06/24 06:31:31] ppsci INFO: train: epoch 280 | step 38 | lr 0.000411 | loss 0.052595 | mae 0.181876 -[2024/06/24 06:31:31] ppsci INFO: epoch: 280, train_loss: 0.060756, train_metric: 0.175234, eval_loss: 0.062657, eval_mae: 0.177518 -[2024/06/24 06:31:31] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:31:32] ppsci INFO: train: epoch 281 | step 0 | lr 0.000411 | loss 0.062478 | mae 0.181228 -[2024/06/24 06:31:32] ppsci INFO: train: epoch 281 | step 10 | lr 0.000411 | loss 0.097376 | mae 0.194496 -[2024/06/24 06:31:32] ppsci INFO: train: epoch 281 | step 20 | lr 0.000411 | loss 0.052400 | mae 0.168210 -[2024/06/24 06:31:33] ppsci INFO: train: epoch 281 | step 30 | lr 0.000411 | loss 0.049119 | mae 0.163219 -[2024/06/24 06:31:33] ppsci INFO: train: epoch 281 | step 38 | lr 0.000411 | loss 0.029490 | mae 0.115203 -[2024/06/24 06:31:33] ppsci INFO: epoch: 281, train_loss: 0.059199, train_metric: 0.173169, eval_loss: 0.070915, eval_mae: 0.188149 -[2024/06/24 06:31:33] ppsci INFO: train: epoch 282 | step 0 | lr 0.000410 | loss 0.074900 | mae 0.188209 -[2024/06/24 06:31:34] ppsci INFO: train: epoch 282 | step 10 | lr 0.000410 | loss 0.066606 | mae 0.191317 -[2024/06/24 06:31:35] ppsci INFO: train: epoch 282 | step 20 | lr 0.000410 | loss 0.069079 | mae 0.177551 -[2024/06/24 06:31:35] ppsci INFO: train: epoch 282 | step 30 | lr 0.000410 | loss 0.050239 | mae 0.159238 -[2024/06/24 06:31:35] ppsci INFO: train: epoch 282 | step 38 | lr 0.000410 | loss 0.017833 | mae 0.104307 -[2024/06/24 06:31:36] ppsci INFO: epoch: 282, train_loss: 0.058354, train_metric: 0.170719, eval_loss: 0.071768, eval_mae: 0.187851 -[2024/06/24 06:31:36] ppsci INFO: train: epoch 283 | step 0 | lr 0.000409 | loss 0.059865 | mae 0.181050 -[2024/06/24 06:31:36] ppsci INFO: train: epoch 283 | step 10 | lr 0.000409 | loss 0.069891 | mae 0.192751 -[2024/06/24 06:31:37] ppsci INFO: train: epoch 283 | step 20 | lr 0.000409 | loss 0.074300 | mae 0.190431 -[2024/06/24 06:31:37] ppsci INFO: train: epoch 283 | step 30 | lr 0.000409 | loss 0.051100 | mae 0.156544 -[2024/06/24 06:31:38] ppsci INFO: train: epoch 283 | step 38 | lr 0.000409 | loss 0.086064 | mae 0.231150 -[2024/06/24 06:31:38] ppsci INFO: epoch: 283, train_loss: 0.064967, train_metric: 0.177597, eval_loss: 0.065265, eval_mae: 0.183510 -[2024/06/24 06:31:38] ppsci INFO: train: epoch 284 | step 0 | lr 0.000409 | loss 0.032124 | mae 0.136183 -[2024/06/24 06:31:38] ppsci INFO: train: epoch 284 | step 10 | lr 0.000409 | loss 0.038256 | mae 0.144367 -[2024/06/24 06:31:39] ppsci INFO: train: epoch 284 | step 20 | lr 0.000409 | loss 0.055906 | mae 0.172824 -[2024/06/24 06:31:39] ppsci INFO: train: epoch 284 | step 30 | lr 0.000409 | loss 0.050025 | mae 0.158783 -[2024/06/24 06:31:40] ppsci INFO: train: epoch 284 | step 38 | lr 0.000409 | loss 0.046105 | mae 0.163764 -[2024/06/24 06:31:40] ppsci INFO: epoch: 284, train_loss: 0.056450, train_metric: 0.170078, eval_loss: 0.070210, eval_mae: 0.191943 -[2024/06/24 06:31:40] ppsci INFO: train: epoch 285 | step 0 | lr 0.000408 | loss 0.059581 | mae 0.188571 -[2024/06/24 06:31:40] ppsci INFO: train: epoch 285 | step 10 | lr 0.000408 | loss 0.076751 | mae 0.193363 -[2024/06/24 06:31:41] ppsci INFO: train: epoch 285 | step 20 | lr 0.000408 | loss 0.073651 | mae 0.185176 -[2024/06/24 06:31:41] ppsci INFO: train: epoch 285 | step 30 | lr 0.000408 | loss 0.040362 | mae 0.151861 -[2024/06/24 06:31:42] ppsci INFO: train: epoch 285 | step 38 | lr 0.000408 | loss 0.064421 | mae 0.168166 -[2024/06/24 06:31:42] ppsci INFO: epoch: 285, train_loss: 0.058620, train_metric: 0.171290, eval_loss: 0.067117, eval_mae: 0.182901 -[2024/06/24 06:31:42] ppsci INFO: train: epoch 286 | step 0 | lr 0.000408 | loss 0.048527 | mae 0.163365 -[2024/06/24 06:31:43] ppsci INFO: train: epoch 286 | step 10 | lr 0.000408 | loss 0.057754 | mae 0.168629 -[2024/06/24 06:31:43] ppsci INFO: train: epoch 286 | step 20 | lr 0.000408 | loss 0.050642 | mae 0.160272 -[2024/06/24 06:31:44] ppsci INFO: train: epoch 286 | step 30 | lr 0.000408 | loss 0.064413 | mae 0.189285 -[2024/06/24 06:31:44] ppsci INFO: train: epoch 286 | step 38 | lr 0.000408 | loss 0.106555 | mae 0.232677 -[2024/06/24 06:31:44] ppsci INFO: epoch: 286, train_loss: 0.070965, train_metric: 0.179562, eval_loss: 0.074887, eval_mae: 0.189542 -[2024/06/24 06:31:44] ppsci INFO: train: epoch 287 | step 0 | lr 0.000407 | loss 0.054025 | mae 0.162626 -[2024/06/24 06:31:45] ppsci INFO: train: epoch 287 | step 10 | lr 0.000407 | loss 0.072159 | mae 0.178340 -[2024/06/24 06:31:45] ppsci INFO: train: epoch 287 | step 20 | lr 0.000407 | loss 0.067386 | mae 0.186412 -[2024/06/24 06:31:46] ppsci INFO: train: epoch 287 | step 30 | lr 0.000407 | loss 0.059533 | mae 0.173543 -[2024/06/24 06:31:46] ppsci INFO: train: epoch 287 | step 38 | lr 0.000407 | loss 0.049619 | mae 0.175211 -[2024/06/24 06:31:46] ppsci INFO: epoch: 287, train_loss: 0.067016, train_metric: 0.176783, eval_loss: 0.065341, eval_mae: 0.182242 -[2024/06/24 06:31:46] ppsci INFO: train: epoch 288 | step 0 | lr 0.000406 | loss 0.043220 | mae 0.153236 -[2024/06/24 06:31:47] ppsci INFO: train: epoch 288 | step 10 | lr 0.000406 | loss 0.057677 | mae 0.172829 -[2024/06/24 06:31:47] ppsci INFO: train: epoch 288 | step 20 | lr 0.000406 | loss 0.048184 | mae 0.168325 -[2024/06/24 06:31:48] ppsci INFO: train: epoch 288 | step 30 | lr 0.000406 | loss 0.051497 | mae 0.168060 -[2024/06/24 06:31:48] ppsci INFO: train: epoch 288 | step 38 | lr 0.000406 | loss 0.035998 | mae 0.145425 -[2024/06/24 06:31:48] ppsci INFO: epoch: 288, train_loss: 0.063918, train_metric: 0.176434, eval_loss: 0.068931, eval_mae: 0.182177 -[2024/06/24 06:31:48] ppsci INFO: train: epoch 289 | step 0 | lr 0.000406 | loss 0.057584 | mae 0.169313 -[2024/06/24 06:31:49] ppsci INFO: train: epoch 289 | step 10 | lr 0.000406 | loss 0.046488 | mae 0.166026 -[2024/06/24 06:31:49] ppsci INFO: train: epoch 289 | step 20 | lr 0.000406 | loss 0.068270 | mae 0.173850 -[2024/06/24 06:31:50] ppsci INFO: train: epoch 289 | step 30 | lr 0.000406 | loss 0.069586 | mae 0.199356 -[2024/06/24 06:31:50] ppsci INFO: train: epoch 289 | step 38 | lr 0.000406 | loss 0.091047 | mae 0.248968 -[2024/06/24 06:31:50] ppsci INFO: epoch: 289, train_loss: 0.060527, train_metric: 0.170097, eval_loss: 0.075154, eval_mae: 0.190387 -[2024/06/24 06:31:51] ppsci INFO: train: epoch 290 | step 0 | lr 0.000405 | loss 0.060474 | mae 0.165466 -[2024/06/24 06:31:51] ppsci INFO: train: epoch 290 | step 10 | lr 0.000405 | loss 0.043835 | mae 0.152303 -[2024/06/24 06:31:52] ppsci INFO: train: epoch 290 | step 20 | lr 0.000405 | loss 0.071825 | mae 0.182703 -[2024/06/24 06:31:52] ppsci INFO: train: epoch 290 | step 30 | lr 0.000405 | loss 0.052587 | mae 0.168737 -[2024/06/24 06:31:53] ppsci INFO: train: epoch 290 | step 38 | lr 0.000405 | loss 0.050117 | mae 0.174160 -[2024/06/24 06:31:53] ppsci INFO: epoch: 290, train_loss: 0.069779, train_metric: 0.175058, eval_loss: 0.072096, eval_mae: 0.188081 -[2024/06/24 06:31:53] ppsci INFO: train: epoch 291 | step 0 | lr 0.000405 | loss 0.060395 | mae 0.168528 -[2024/06/24 06:31:53] ppsci INFO: train: epoch 291 | step 10 | lr 0.000405 | loss 0.058041 | mae 0.182137 -[2024/06/24 06:31:54] ppsci INFO: train: epoch 291 | step 20 | lr 0.000405 | loss 0.063968 | mae 0.182182 -[2024/06/24 06:31:54] ppsci INFO: train: epoch 291 | step 30 | lr 0.000405 | loss 0.048948 | mae 0.160609 -[2024/06/24 06:31:55] ppsci INFO: train: epoch 291 | step 38 | lr 0.000405 | loss 0.043021 | mae 0.170735 -[2024/06/24 06:31:55] ppsci INFO: epoch: 291, train_loss: 0.061381, train_metric: 0.173362, eval_loss: 0.066591, eval_mae: 0.187921 -[2024/06/24 06:31:55] ppsci INFO: train: epoch 292 | step 0 | lr 0.000404 | loss 0.055711 | mae 0.165029 -[2024/06/24 06:31:55] ppsci INFO: train: epoch 292 | step 10 | lr 0.000404 | loss 0.075872 | mae 0.198784 -[2024/06/24 06:31:56] ppsci INFO: train: epoch 292 | step 20 | lr 0.000404 | loss 0.061978 | mae 0.175237 -[2024/06/24 06:31:56] ppsci INFO: train: epoch 292 | step 30 | lr 0.000404 | loss 0.073864 | mae 0.179894 -[2024/06/24 06:31:57] ppsci INFO: train: epoch 292 | step 38 | lr 0.000404 | loss 0.062016 | mae 0.197063 -[2024/06/24 06:31:57] ppsci INFO: epoch: 292, train_loss: 0.060967, train_metric: 0.173749, eval_loss: 0.064042, eval_mae: 0.179528 -[2024/06/24 06:31:57] ppsci INFO: train: epoch 293 | step 0 | lr 0.000403 | loss 0.049284 | mae 0.167023 -[2024/06/24 06:31:57] ppsci INFO: train: epoch 293 | step 10 | lr 0.000403 | loss 0.058679 | mae 0.170830 -[2024/06/24 06:31:58] ppsci INFO: train: epoch 293 | step 20 | lr 0.000403 | loss 0.054173 | mae 0.168320 -[2024/06/24 06:31:58] ppsci INFO: train: epoch 293 | step 30 | lr 0.000403 | loss 0.046964 | mae 0.171559 -[2024/06/24 06:31:59] ppsci INFO: train: epoch 293 | step 38 | lr 0.000403 | loss 0.070414 | mae 0.171525 -[2024/06/24 06:31:59] ppsci INFO: epoch: 293, train_loss: 0.065837, train_metric: 0.173606, eval_loss: 0.066296, eval_mae: 0.178258 -[2024/06/24 06:31:59] ppsci INFO: train: epoch 294 | step 0 | lr 0.000403 | loss 0.046596 | mae 0.156711 -[2024/06/24 06:31:59] ppsci INFO: train: epoch 294 | step 10 | lr 0.000403 | loss 0.066698 | mae 0.190829 -[2024/06/24 06:32:00] ppsci INFO: train: epoch 294 | step 20 | lr 0.000403 | loss 0.054319 | mae 0.173362 -[2024/06/24 06:32:01] ppsci INFO: train: epoch 294 | step 30 | lr 0.000403 | loss 0.069099 | mae 0.192134 -[2024/06/24 06:32:01] ppsci INFO: train: epoch 294 | step 38 | lr 0.000403 | loss 0.081014 | mae 0.193582 -[2024/06/24 06:32:01] ppsci INFO: epoch: 294, train_loss: 0.057933, train_metric: 0.170789, eval_loss: 0.064550, eval_mae: 0.179094 -[2024/06/24 06:32:01] ppsci INFO: train: epoch 295 | step 0 | lr 0.000402 | loss 0.078448 | mae 0.181656 -[2024/06/24 06:32:02] ppsci INFO: train: epoch 295 | step 10 | lr 0.000402 | loss 0.077978 | mae 0.185935 -[2024/06/24 06:32:02] ppsci INFO: train: epoch 295 | step 20 | lr 0.000402 | loss 0.069507 | mae 0.180630 -[2024/06/24 06:32:03] ppsci INFO: train: epoch 295 | step 30 | lr 0.000402 | loss 0.051297 | mae 0.169982 -[2024/06/24 06:32:03] ppsci INFO: train: epoch 295 | step 38 | lr 0.000402 | loss 0.028890 | mae 0.119963 -[2024/06/24 06:32:03] ppsci INFO: epoch: 295, train_loss: 0.065022, train_metric: 0.171948, eval_loss: 0.075140, eval_mae: 0.190343 -[2024/06/24 06:32:03] ppsci INFO: train: epoch 296 | step 0 | lr 0.000401 | loss 0.150885 | mae 0.193216 -[2024/06/24 06:32:04] ppsci INFO: train: epoch 296 | step 10 | lr 0.000401 | loss 0.047432 | mae 0.167421 -[2024/06/24 06:32:04] ppsci INFO: train: epoch 296 | step 20 | lr 0.000401 | loss 0.052056 | mae 0.169664 -[2024/06/24 06:32:05] ppsci INFO: train: epoch 296 | step 30 | lr 0.000401 | loss 0.069386 | mae 0.183258 -[2024/06/24 06:32:05] ppsci INFO: train: epoch 296 | step 38 | lr 0.000401 | loss 0.085288 | mae 0.189657 -[2024/06/24 06:32:05] ppsci INFO: epoch: 296, train_loss: 0.064838, train_metric: 0.173817, eval_loss: 0.066739, eval_mae: 0.177730 -[2024/06/24 06:32:05] ppsci INFO: train: epoch 297 | step 0 | lr 0.000401 | loss 0.049181 | mae 0.156724 -[2024/06/24 06:32:06] ppsci INFO: train: epoch 297 | step 10 | lr 0.000401 | loss 0.047996 | mae 0.164533 -[2024/06/24 06:32:06] ppsci INFO: train: epoch 297 | step 20 | lr 0.000401 | loss 0.063315 | mae 0.178978 -[2024/06/24 06:32:07] ppsci INFO: train: epoch 297 | step 30 | lr 0.000401 | loss 0.053054 | mae 0.169279 -[2024/06/24 06:32:07] ppsci INFO: train: epoch 297 | step 38 | lr 0.000401 | loss 0.112499 | mae 0.248819 -[2024/06/24 06:32:07] ppsci INFO: epoch: 297, train_loss: 0.061818, train_metric: 0.173305, eval_loss: 0.064676, eval_mae: 0.174847 -[2024/06/24 06:32:07] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:32:07] ppsci INFO: train: epoch 298 | step 0 | lr 0.000400 | loss 0.062210 | mae 0.175335 -[2024/06/24 06:32:08] ppsci INFO: train: epoch 298 | step 10 | lr 0.000400 | loss 0.045371 | mae 0.161752 -[2024/06/24 06:32:09] ppsci INFO: train: epoch 298 | step 20 | lr 0.000400 | loss 0.049024 | mae 0.167869 -[2024/06/24 06:32:09] ppsci INFO: train: epoch 298 | step 30 | lr 0.000400 | loss 0.049847 | mae 0.152748 -[2024/06/24 06:32:09] ppsci INFO: train: epoch 298 | step 38 | lr 0.000400 | loss 0.020917 | mae 0.123348 -[2024/06/24 06:32:10] ppsci INFO: epoch: 298, train_loss: 0.053522, train_metric: 0.167961, eval_loss: 0.063153, eval_mae: 0.175606 -[2024/06/24 06:32:10] ppsci INFO: train: epoch 299 | step 0 | lr 0.000400 | loss 0.050759 | mae 0.174186 -[2024/06/24 06:32:10] ppsci INFO: train: epoch 299 | step 10 | lr 0.000400 | loss 0.072202 | mae 0.178471 -[2024/06/24 06:32:11] ppsci INFO: train: epoch 299 | step 20 | lr 0.000400 | loss 0.067115 | mae 0.177712 -[2024/06/24 06:32:11] ppsci INFO: train: epoch 299 | step 30 | lr 0.000400 | loss 0.046399 | mae 0.156270 -[2024/06/24 06:32:12] ppsci INFO: train: epoch 299 | step 38 | lr 0.000400 | loss 0.029992 | mae 0.138958 -[2024/06/24 06:32:12] ppsci INFO: epoch: 299, train_loss: 0.055752, train_metric: 0.169347, eval_loss: 0.066452, eval_mae: 0.177924 -[2024/06/24 06:32:12] ppsci INFO: train: epoch 300 | step 0 | lr 0.000399 | loss 0.035372 | mae 0.150211 -[2024/06/24 06:32:12] ppsci INFO: train: epoch 300 | step 10 | lr 0.000399 | loss 0.077610 | mae 0.187253 -[2024/06/24 06:32:13] ppsci INFO: train: epoch 300 | step 20 | lr 0.000399 | loss 0.063752 | mae 0.179880 -[2024/06/24 06:32:14] ppsci INFO: train: epoch 300 | step 30 | lr 0.000399 | loss 0.056174 | mae 0.165729 -[2024/06/24 06:32:14] ppsci INFO: train: epoch 300 | step 38 | lr 0.000399 | loss 0.029623 | mae 0.136097 -[2024/06/24 06:32:14] ppsci INFO: epoch: 300, train_loss: 0.057526, train_metric: 0.170895, eval_loss: 0.069805, eval_mae: 0.181588 -[2024/06/24 06:32:14] ppsci INFO: train: epoch 301 | step 0 | lr 0.000398 | loss 0.074432 | mae 0.199197 -[2024/06/24 06:32:15] ppsci INFO: train: epoch 301 | step 10 | lr 0.000398 | loss 0.043110 | mae 0.145983 -[2024/06/24 06:32:15] ppsci INFO: train: epoch 301 | step 20 | lr 0.000398 | loss 0.044761 | mae 0.152228 -[2024/06/24 06:32:16] ppsci INFO: train: epoch 301 | step 30 | lr 0.000398 | loss 0.062415 | mae 0.187127 -[2024/06/24 06:32:16] ppsci INFO: train: epoch 301 | step 38 | lr 0.000398 | loss 0.036981 | mae 0.135928 -[2024/06/24 06:32:16] ppsci INFO: epoch: 301, train_loss: 0.058237, train_metric: 0.173634, eval_loss: 0.071135, eval_mae: 0.184328 -[2024/06/24 06:32:16] ppsci INFO: train: epoch 302 | step 0 | lr 0.000398 | loss 0.058137 | mae 0.171008 -[2024/06/24 06:32:17] ppsci INFO: train: epoch 302 | step 10 | lr 0.000398 | loss 0.037993 | mae 0.148346 -[2024/06/24 06:32:18] ppsci INFO: train: epoch 302 | step 20 | lr 0.000398 | loss 0.044021 | mae 0.161359 -[2024/06/24 06:32:18] ppsci INFO: train: epoch 302 | step 30 | lr 0.000398 | loss 0.046503 | mae 0.162247 -[2024/06/24 06:32:18] ppsci INFO: train: epoch 302 | step 38 | lr 0.000398 | loss 0.083242 | mae 0.193709 -[2024/06/24 06:32:19] ppsci INFO: epoch: 302, train_loss: 0.063117, train_metric: 0.170315, eval_loss: 0.064462, eval_mae: 0.179463 -[2024/06/24 06:32:19] ppsci INFO: train: epoch 303 | step 0 | lr 0.000397 | loss 0.040675 | mae 0.157860 -[2024/06/24 06:32:19] ppsci INFO: train: epoch 303 | step 10 | lr 0.000397 | loss 0.123925 | mae 0.185504 -[2024/06/24 06:32:20] ppsci INFO: train: epoch 303 | step 20 | lr 0.000397 | loss 0.046425 | mae 0.159094 -[2024/06/24 06:32:20] ppsci INFO: train: epoch 303 | step 30 | lr 0.000397 | loss 0.088810 | mae 0.201932 -[2024/06/24 06:32:21] ppsci INFO: train: epoch 303 | step 38 | lr 0.000397 | loss 0.058434 | mae 0.176411 -[2024/06/24 06:32:21] ppsci INFO: epoch: 303, train_loss: 0.060320, train_metric: 0.173090, eval_loss: 0.072604, eval_mae: 0.185949 -[2024/06/24 06:32:21] ppsci INFO: train: epoch 304 | step 0 | lr 0.000397 | loss 0.068266 | mae 0.183175 -[2024/06/24 06:32:21] ppsci INFO: train: epoch 304 | step 10 | lr 0.000397 | loss 0.074157 | mae 0.184935 -[2024/06/24 06:32:22] ppsci INFO: train: epoch 304 | step 20 | lr 0.000397 | loss 0.069188 | mae 0.191326 -[2024/06/24 06:32:22] ppsci INFO: train: epoch 304 | step 30 | lr 0.000397 | loss 0.080652 | mae 0.190937 -[2024/06/24 06:32:23] ppsci INFO: train: epoch 304 | step 38 | lr 0.000397 | loss 0.048816 | mae 0.171548 -[2024/06/24 06:32:23] ppsci INFO: epoch: 304, train_loss: 0.062019, train_metric: 0.173449, eval_loss: 0.067613, eval_mae: 0.175734 -[2024/06/24 06:32:23] ppsci INFO: train: epoch 305 | step 0 | lr 0.000396 | loss 0.060316 | mae 0.168671 -[2024/06/24 06:32:23] ppsci INFO: train: epoch 305 | step 10 | lr 0.000396 | loss 0.066921 | mae 0.185707 -[2024/06/24 06:32:24] ppsci INFO: train: epoch 305 | step 20 | lr 0.000396 | loss 0.039608 | mae 0.151340 -[2024/06/24 06:32:24] ppsci INFO: train: epoch 305 | step 30 | lr 0.000396 | loss 0.050546 | mae 0.167497 -[2024/06/24 06:32:25] ppsci INFO: train: epoch 305 | step 38 | lr 0.000396 | loss 0.046162 | mae 0.171695 -[2024/06/24 06:32:25] ppsci INFO: epoch: 305, train_loss: 0.061203, train_metric: 0.170373, eval_loss: 0.064793, eval_mae: 0.183124 -[2024/06/24 06:32:25] ppsci INFO: train: epoch 306 | step 0 | lr 0.000395 | loss 0.077950 | mae 0.191115 -[2024/06/24 06:32:26] ppsci INFO: train: epoch 306 | step 10 | lr 0.000395 | loss 0.051677 | mae 0.166714 -[2024/06/24 06:32:26] ppsci INFO: train: epoch 306 | step 20 | lr 0.000395 | loss 0.064424 | mae 0.186789 -[2024/06/24 06:32:27] ppsci INFO: train: epoch 306 | step 30 | lr 0.000395 | loss 0.064944 | mae 0.176028 -[2024/06/24 06:32:27] ppsci INFO: train: epoch 306 | step 38 | lr 0.000395 | loss 0.055905 | mae 0.164183 -[2024/06/24 06:32:27] ppsci INFO: epoch: 306, train_loss: 0.061540, train_metric: 0.171271, eval_loss: 0.061247, eval_mae: 0.174320 -[2024/06/24 06:32:27] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:32:27] ppsci INFO: train: epoch 307 | step 0 | lr 0.000395 | loss 0.066113 | mae 0.180992 -[2024/06/24 06:32:28] ppsci INFO: train: epoch 307 | step 10 | lr 0.000395 | loss 0.048078 | mae 0.169951 -[2024/06/24 06:32:29] ppsci INFO: train: epoch 307 | step 20 | lr 0.000395 | loss 0.067804 | mae 0.173943 -[2024/06/24 06:32:29] ppsci INFO: train: epoch 307 | step 30 | lr 0.000395 | loss 0.201815 | mae 0.215323 -[2024/06/24 06:32:29] ppsci INFO: train: epoch 307 | step 38 | lr 0.000395 | loss 0.009505 | mae 0.073825 -[2024/06/24 06:32:30] ppsci INFO: epoch: 307, train_loss: 0.058986, train_metric: 0.168149, eval_loss: 0.067693, eval_mae: 0.182277 -[2024/06/24 06:32:30] ppsci INFO: train: epoch 308 | step 0 | lr 0.000394 | loss 0.034973 | mae 0.145718 -[2024/06/24 06:32:30] ppsci INFO: train: epoch 308 | step 10 | lr 0.000394 | loss 0.046483 | mae 0.156384 -[2024/06/24 06:32:31] ppsci INFO: train: epoch 308 | step 20 | lr 0.000394 | loss 0.045843 | mae 0.158076 -[2024/06/24 06:32:31] ppsci INFO: train: epoch 308 | step 30 | lr 0.000394 | loss 0.049482 | mae 0.155883 -[2024/06/24 06:32:32] ppsci INFO: train: epoch 308 | step 38 | lr 0.000394 | loss 0.018630 | mae 0.100080 -[2024/06/24 06:32:32] ppsci INFO: epoch: 308, train_loss: 0.056566, train_metric: 0.168114, eval_loss: 0.062490, eval_mae: 0.178049 -[2024/06/24 06:32:32] ppsci INFO: train: epoch 309 | step 0 | lr 0.000393 | loss 0.049391 | mae 0.165010 -[2024/06/24 06:32:32] ppsci INFO: train: epoch 309 | step 10 | lr 0.000393 | loss 0.052363 | mae 0.167700 -[2024/06/24 06:32:33] ppsci INFO: train: epoch 309 | step 20 | lr 0.000393 | loss 0.059638 | mae 0.176376 -[2024/06/24 06:32:33] ppsci INFO: train: epoch 309 | step 30 | lr 0.000393 | loss 0.102231 | mae 0.201131 -[2024/06/24 06:32:34] ppsci INFO: train: epoch 309 | step 38 | lr 0.000393 | loss 0.048570 | mae 0.166110 -[2024/06/24 06:32:34] ppsci INFO: epoch: 309, train_loss: 0.056453, train_metric: 0.167150, eval_loss: 0.065876, eval_mae: 0.181070 -[2024/06/24 06:32:34] ppsci INFO: train: epoch 310 | step 0 | lr 0.000393 | loss 0.051340 | mae 0.174213 -[2024/06/24 06:32:34] ppsci INFO: train: epoch 310 | step 10 | lr 0.000393 | loss 0.064599 | mae 0.176210 -[2024/06/24 06:32:35] ppsci INFO: train: epoch 310 | step 20 | lr 0.000393 | loss 0.042434 | mae 0.140064 -[2024/06/24 06:32:36] ppsci INFO: train: epoch 310 | step 30 | lr 0.000393 | loss 0.060268 | mae 0.162098 -[2024/06/24 06:32:36] ppsci INFO: train: epoch 310 | step 38 | lr 0.000393 | loss 0.061373 | mae 0.206168 -[2024/06/24 06:32:36] ppsci INFO: epoch: 310, train_loss: 0.056309, train_metric: 0.168773, eval_loss: 0.069709, eval_mae: 0.182269 -[2024/06/24 06:32:36] ppsci INFO: train: epoch 311 | step 0 | lr 0.000392 | loss 0.043562 | mae 0.162545 -[2024/06/24 06:32:37] ppsci INFO: train: epoch 311 | step 10 | lr 0.000392 | loss 0.066189 | mae 0.195381 -[2024/06/24 06:32:37] ppsci INFO: train: epoch 311 | step 20 | lr 0.000392 | loss 0.057992 | mae 0.183048 -[2024/06/24 06:32:38] ppsci INFO: train: epoch 311 | step 30 | lr 0.000392 | loss 0.068242 | mae 0.191219 -[2024/06/24 06:32:38] ppsci INFO: train: epoch 311 | step 38 | lr 0.000392 | loss 0.102225 | mae 0.235734 -[2024/06/24 06:32:38] ppsci INFO: epoch: 311, train_loss: 0.054629, train_metric: 0.168145, eval_loss: 0.064296, eval_mae: 0.176585 -[2024/06/24 06:32:38] ppsci INFO: train: epoch 312 | step 0 | lr 0.000391 | loss 0.060051 | mae 0.169004 -[2024/06/24 06:32:39] ppsci INFO: train: epoch 312 | step 10 | lr 0.000391 | loss 0.062908 | mae 0.193384 -[2024/06/24 06:32:39] ppsci INFO: train: epoch 312 | step 20 | lr 0.000391 | loss 0.052783 | mae 0.172444 -[2024/06/24 06:32:40] ppsci INFO: train: epoch 312 | step 30 | lr 0.000391 | loss 0.053058 | mae 0.179347 -[2024/06/24 06:32:40] ppsci INFO: train: epoch 312 | step 38 | lr 0.000391 | loss 0.034742 | mae 0.146656 -[2024/06/24 06:32:40] ppsci INFO: epoch: 312, train_loss: 0.056322, train_metric: 0.168795, eval_loss: 0.067829, eval_mae: 0.181136 -[2024/06/24 06:32:41] ppsci INFO: train: epoch 313 | step 0 | lr 0.000391 | loss 0.060828 | mae 0.176815 -[2024/06/24 06:32:41] ppsci INFO: train: epoch 313 | step 10 | lr 0.000391 | loss 0.046708 | mae 0.163147 -[2024/06/24 06:32:42] ppsci INFO: train: epoch 313 | step 20 | lr 0.000391 | loss 0.045925 | mae 0.156904 -[2024/06/24 06:32:42] ppsci INFO: train: epoch 313 | step 30 | lr 0.000391 | loss 0.068165 | mae 0.172275 -[2024/06/24 06:32:43] ppsci INFO: train: epoch 313 | step 38 | lr 0.000391 | loss 0.035471 | mae 0.142497 -[2024/06/24 06:32:43] ppsci INFO: epoch: 313, train_loss: 0.056633, train_metric: 0.170426, eval_loss: 0.064372, eval_mae: 0.175967 -[2024/06/24 06:32:43] ppsci INFO: train: epoch 314 | step 0 | lr 0.000390 | loss 0.096743 | mae 0.188529 -[2024/06/24 06:32:43] ppsci INFO: train: epoch 314 | step 10 | lr 0.000390 | loss 0.052065 | mae 0.165490 -[2024/06/24 06:32:44] ppsci INFO: train: epoch 314 | step 20 | lr 0.000390 | loss 0.041203 | mae 0.150089 -[2024/06/24 06:32:44] ppsci INFO: train: epoch 314 | step 30 | lr 0.000390 | loss 0.059434 | mae 0.166194 -[2024/06/24 06:32:45] ppsci INFO: train: epoch 314 | step 38 | lr 0.000390 | loss 0.051395 | mae 0.190263 -[2024/06/24 06:32:45] ppsci INFO: epoch: 314, train_loss: 0.054120, train_metric: 0.164647, eval_loss: 0.059702, eval_mae: 0.169610 -[2024/06/24 06:32:45] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:32:45] ppsci INFO: train: epoch 315 | step 0 | lr 0.000390 | loss 0.038516 | mae 0.141776 -[2024/06/24 06:32:46] ppsci INFO: train: epoch 315 | step 10 | lr 0.000390 | loss 0.101192 | mae 0.193246 -[2024/06/24 06:32:46] ppsci INFO: train: epoch 315 | step 20 | lr 0.000390 | loss 0.052476 | mae 0.163965 -[2024/06/24 06:32:47] ppsci INFO: train: epoch 315 | step 30 | lr 0.000390 | loss 0.045739 | mae 0.162975 -[2024/06/24 06:32:47] ppsci INFO: train: epoch 315 | step 38 | lr 0.000390 | loss 0.038293 | mae 0.142943 -[2024/06/24 06:32:47] ppsci INFO: epoch: 315, train_loss: 0.058016, train_metric: 0.166465, eval_loss: 0.061132, eval_mae: 0.174219 -[2024/06/24 06:32:47] ppsci INFO: train: epoch 316 | step 0 | lr 0.000389 | loss 0.048903 | mae 0.161862 -[2024/06/24 06:32:48] ppsci INFO: train: epoch 316 | step 10 | lr 0.000389 | loss 0.054110 | mae 0.176476 -[2024/06/24 06:32:48] ppsci INFO: train: epoch 316 | step 20 | lr 0.000389 | loss 0.055421 | mae 0.169277 -[2024/06/24 06:32:49] ppsci INFO: train: epoch 316 | step 30 | lr 0.000389 | loss 0.045568 | mae 0.161945 -[2024/06/24 06:32:49] ppsci INFO: train: epoch 316 | step 38 | lr 0.000389 | loss 0.034791 | mae 0.150374 -[2024/06/24 06:32:49] ppsci INFO: epoch: 316, train_loss: 0.059112, train_metric: 0.169679, eval_loss: 0.060722, eval_mae: 0.172287 -[2024/06/24 06:32:49] ppsci INFO: train: epoch 317 | step 0 | lr 0.000388 | loss 0.050331 | mae 0.169321 -[2024/06/24 06:32:50] ppsci INFO: train: epoch 317 | step 10 | lr 0.000388 | loss 0.062101 | mae 0.173546 -[2024/06/24 06:32:50] ppsci INFO: train: epoch 317 | step 20 | lr 0.000388 | loss 0.061666 | mae 0.159191 -[2024/06/24 06:32:51] ppsci INFO: train: epoch 317 | step 30 | lr 0.000388 | loss 0.061792 | mae 0.174029 -[2024/06/24 06:32:51] ppsci INFO: train: epoch 317 | step 38 | lr 0.000388 | loss 0.109354 | mae 0.241294 -[2024/06/24 06:32:51] ppsci INFO: epoch: 317, train_loss: 0.058781, train_metric: 0.169667, eval_loss: 0.072134, eval_mae: 0.179317 -[2024/06/24 06:32:52] ppsci INFO: train: epoch 318 | step 0 | lr 0.000388 | loss 0.061445 | mae 0.172830 -[2024/06/24 06:32:52] ppsci INFO: train: epoch 318 | step 10 | lr 0.000388 | loss 0.059486 | mae 0.176475 -[2024/06/24 06:32:53] ppsci INFO: train: epoch 318 | step 20 | lr 0.000388 | loss 0.046599 | mae 0.165132 -[2024/06/24 06:32:53] ppsci INFO: train: epoch 318 | step 30 | lr 0.000388 | loss 0.042687 | mae 0.159473 -[2024/06/24 06:32:53] ppsci INFO: train: epoch 318 | step 38 | lr 0.000388 | loss 0.028199 | mae 0.123330 -[2024/06/24 06:32:54] ppsci INFO: epoch: 318, train_loss: 0.057147, train_metric: 0.168603, eval_loss: 0.065256, eval_mae: 0.178453 -[2024/06/24 06:32:54] ppsci INFO: train: epoch 319 | step 0 | lr 0.000387 | loss 0.038190 | mae 0.149490 -[2024/06/24 06:32:54] ppsci INFO: train: epoch 319 | step 10 | lr 0.000387 | loss 0.058098 | mae 0.179739 -[2024/06/24 06:32:55] ppsci INFO: train: epoch 319 | step 20 | lr 0.000387 | loss 0.057017 | mae 0.168164 -[2024/06/24 06:32:55] ppsci INFO: train: epoch 319 | step 30 | lr 0.000387 | loss 0.043483 | mae 0.151309 -[2024/06/24 06:32:56] ppsci INFO: train: epoch 319 | step 38 | lr 0.000387 | loss 0.056579 | mae 0.185153 -[2024/06/24 06:32:56] ppsci INFO: epoch: 319, train_loss: 0.059403, train_metric: 0.171456, eval_loss: 0.065202, eval_mae: 0.175562 -[2024/06/24 06:32:56] ppsci INFO: train: epoch 320 | step 0 | lr 0.000386 | loss 0.040582 | mae 0.150822 -[2024/06/24 06:32:56] ppsci INFO: train: epoch 320 | step 10 | lr 0.000386 | loss 0.055827 | mae 0.176026 -[2024/06/24 06:32:57] ppsci INFO: train: epoch 320 | step 20 | lr 0.000386 | loss 0.074014 | mae 0.183773 -[2024/06/24 06:32:57] ppsci INFO: train: epoch 320 | step 30 | lr 0.000386 | loss 0.077624 | mae 0.200916 -[2024/06/24 06:32:58] ppsci INFO: train: epoch 320 | step 38 | lr 0.000386 | loss 0.056124 | mae 0.178450 -[2024/06/24 06:32:58] ppsci INFO: epoch: 320, train_loss: 0.062112, train_metric: 0.174592, eval_loss: 0.066339, eval_mae: 0.178968 -[2024/06/24 06:32:58] ppsci INFO: train: epoch 321 | step 0 | lr 0.000386 | loss 0.064058 | mae 0.180340 -[2024/06/24 06:32:58] ppsci INFO: train: epoch 321 | step 10 | lr 0.000386 | loss 0.058819 | mae 0.173382 -[2024/06/24 06:32:59] ppsci INFO: train: epoch 321 | step 20 | lr 0.000386 | loss 0.059624 | mae 0.173653 -[2024/06/24 06:32:59] ppsci INFO: train: epoch 321 | step 30 | lr 0.000386 | loss 0.067822 | mae 0.176683 -[2024/06/24 06:33:00] ppsci INFO: train: epoch 321 | step 38 | lr 0.000386 | loss 0.028980 | mae 0.101123 -[2024/06/24 06:33:00] ppsci INFO: epoch: 321, train_loss: 0.057194, train_metric: 0.166470, eval_loss: 0.063192, eval_mae: 0.175675 -[2024/06/24 06:33:00] ppsci INFO: train: epoch 322 | step 0 | lr 0.000385 | loss 0.035703 | mae 0.142340 -[2024/06/24 06:33:01] ppsci INFO: train: epoch 322 | step 10 | lr 0.000385 | loss 0.075339 | mae 0.193454 -[2024/06/24 06:33:01] ppsci INFO: train: epoch 322 | step 20 | lr 0.000385 | loss 0.054280 | mae 0.172997 -[2024/06/24 06:33:02] ppsci INFO: train: epoch 322 | step 30 | lr 0.000385 | loss 0.052659 | mae 0.163220 -[2024/06/24 06:33:02] ppsci INFO: train: epoch 322 | step 38 | lr 0.000385 | loss 0.044824 | mae 0.172585 -[2024/06/24 06:33:02] ppsci INFO: epoch: 322, train_loss: 0.055942, train_metric: 0.164216, eval_loss: 0.061638, eval_mae: 0.179070 -[2024/06/24 06:33:02] ppsci INFO: train: epoch 323 | step 0 | lr 0.000384 | loss 0.044416 | mae 0.162275 -[2024/06/24 06:33:03] ppsci INFO: train: epoch 323 | step 10 | lr 0.000384 | loss 0.039469 | mae 0.148639 -[2024/06/24 06:33:03] ppsci INFO: train: epoch 323 | step 20 | lr 0.000384 | loss 0.064922 | mae 0.174028 -[2024/06/24 06:33:04] ppsci INFO: train: epoch 323 | step 30 | lr 0.000384 | loss 0.057762 | mae 0.144041 -[2024/06/24 06:33:04] ppsci INFO: train: epoch 323 | step 38 | lr 0.000384 | loss 0.025808 | mae 0.124828 -[2024/06/24 06:33:04] ppsci INFO: epoch: 323, train_loss: 0.054011, train_metric: 0.168776, eval_loss: 0.066803, eval_mae: 0.183906 -[2024/06/24 06:33:04] ppsci INFO: train: epoch 324 | step 0 | lr 0.000384 | loss 0.060069 | mae 0.163289 -[2024/06/24 06:33:05] ppsci INFO: train: epoch 324 | step 10 | lr 0.000384 | loss 0.036291 | mae 0.146018 -[2024/06/24 06:33:05] ppsci INFO: train: epoch 324 | step 20 | lr 0.000384 | loss 0.073475 | mae 0.163958 -[2024/06/24 06:33:06] ppsci INFO: train: epoch 324 | step 30 | lr 0.000384 | loss 0.076287 | mae 0.196022 -[2024/06/24 06:33:06] ppsci INFO: train: epoch 324 | step 38 | lr 0.000384 | loss 0.126618 | mae 0.255290 -[2024/06/24 06:33:06] ppsci INFO: epoch: 324, train_loss: 0.058559, train_metric: 0.166807, eval_loss: 0.070513, eval_mae: 0.184857 -[2024/06/24 06:33:06] ppsci INFO: train: epoch 325 | step 0 | lr 0.000383 | loss 0.042258 | mae 0.152674 -[2024/06/24 06:33:07] ppsci INFO: train: epoch 325 | step 10 | lr 0.000383 | loss 0.056019 | mae 0.178759 -[2024/06/24 06:33:08] ppsci INFO: train: epoch 325 | step 20 | lr 0.000383 | loss 0.065110 | mae 0.176654 -[2024/06/24 06:33:08] ppsci INFO: train: epoch 325 | step 30 | lr 0.000383 | loss 0.052086 | mae 0.168061 -[2024/06/24 06:33:09] ppsci INFO: train: epoch 325 | step 38 | lr 0.000383 | loss 0.068004 | mae 0.195798 -[2024/06/24 06:33:09] ppsci INFO: epoch: 325, train_loss: 0.056916, train_metric: 0.167412, eval_loss: 0.068714, eval_mae: 0.177544 -[2024/06/24 06:33:09] ppsci INFO: train: epoch 326 | step 0 | lr 0.000382 | loss 0.067126 | mae 0.159157 -[2024/06/24 06:33:09] ppsci INFO: train: epoch 326 | step 10 | lr 0.000382 | loss 0.050095 | mae 0.173239 -[2024/06/24 06:33:10] ppsci INFO: train: epoch 326 | step 20 | lr 0.000382 | loss 0.049612 | mae 0.169731 -[2024/06/24 06:33:10] ppsci INFO: train: epoch 326 | step 30 | lr 0.000382 | loss 0.053429 | mae 0.169154 -[2024/06/24 06:33:11] ppsci INFO: train: epoch 326 | step 38 | lr 0.000382 | loss 0.037334 | mae 0.129381 -[2024/06/24 06:33:11] ppsci INFO: epoch: 326, train_loss: 0.058305, train_metric: 0.167833, eval_loss: 0.062568, eval_mae: 0.176786 -[2024/06/24 06:33:11] ppsci INFO: train: epoch 327 | step 0 | lr 0.000382 | loss 0.038929 | mae 0.134876 -[2024/06/24 06:33:11] ppsci INFO: train: epoch 327 | step 10 | lr 0.000382 | loss 0.043302 | mae 0.160620 -[2024/06/24 06:33:12] ppsci INFO: train: epoch 327 | step 20 | lr 0.000382 | loss 0.056479 | mae 0.173906 -[2024/06/24 06:33:12] ppsci INFO: train: epoch 327 | step 30 | lr 0.000382 | loss 0.065160 | mae 0.172094 -[2024/06/24 06:33:13] ppsci INFO: train: epoch 327 | step 38 | lr 0.000382 | loss 0.030227 | mae 0.146519 -[2024/06/24 06:33:13] ppsci INFO: epoch: 327, train_loss: 0.054312, train_metric: 0.166168, eval_loss: 0.068696, eval_mae: 0.178451 -[2024/06/24 06:33:13] ppsci INFO: train: epoch 328 | step 0 | lr 0.000381 | loss 0.053931 | mae 0.157196 -[2024/06/24 06:33:13] ppsci INFO: train: epoch 328 | step 10 | lr 0.000381 | loss 0.050113 | mae 0.158801 -[2024/06/24 06:33:14] ppsci INFO: train: epoch 328 | step 20 | lr 0.000381 | loss 0.057407 | mae 0.162566 -[2024/06/24 06:33:15] ppsci INFO: train: epoch 328 | step 30 | lr 0.000381 | loss 0.055813 | mae 0.164292 -[2024/06/24 06:33:15] ppsci INFO: train: epoch 328 | step 38 | lr 0.000381 | loss 0.064385 | mae 0.178752 -[2024/06/24 06:33:15] ppsci INFO: epoch: 328, train_loss: 0.054984, train_metric: 0.163475, eval_loss: 0.070812, eval_mae: 0.183307 -[2024/06/24 06:33:15] ppsci INFO: train: epoch 329 | step 0 | lr 0.000380 | loss 0.079737 | mae 0.188555 -[2024/06/24 06:33:16] ppsci INFO: train: epoch 329 | step 10 | lr 0.000380 | loss 0.046043 | mae 0.151833 -[2024/06/24 06:33:16] ppsci INFO: train: epoch 329 | step 20 | lr 0.000380 | loss 0.045234 | mae 0.164097 -[2024/06/24 06:33:17] ppsci INFO: train: epoch 329 | step 30 | lr 0.000380 | loss 0.059115 | mae 0.173375 -[2024/06/24 06:33:17] ppsci INFO: train: epoch 329 | step 38 | lr 0.000380 | loss 0.035623 | mae 0.163576 -[2024/06/24 06:33:17] ppsci INFO: epoch: 329, train_loss: 0.054193, train_metric: 0.166993, eval_loss: 0.066634, eval_mae: 0.175498 -[2024/06/24 06:33:17] ppsci INFO: train: epoch 330 | step 0 | lr 0.000380 | loss 0.046235 | mae 0.162279 -[2024/06/24 06:33:18] ppsci INFO: train: epoch 330 | step 10 | lr 0.000380 | loss 0.134961 | mae 0.199356 -[2024/06/24 06:33:18] ppsci INFO: train: epoch 330 | step 20 | lr 0.000380 | loss 0.052892 | mae 0.178731 -[2024/06/24 06:33:19] ppsci INFO: train: epoch 330 | step 30 | lr 0.000380 | loss 0.050998 | mae 0.169628 -[2024/06/24 06:33:19] ppsci INFO: train: epoch 330 | step 38 | lr 0.000380 | loss 0.013968 | mae 0.082088 -[2024/06/24 06:33:19] ppsci INFO: epoch: 330, train_loss: 0.057152, train_metric: 0.167694, eval_loss: 0.064490, eval_mae: 0.174827 -[2024/06/24 06:33:20] ppsci INFO: train: epoch 331 | step 0 | lr 0.000379 | loss 0.047162 | mae 0.169054 -[2024/06/24 06:33:20] ppsci INFO: train: epoch 331 | step 10 | lr 0.000379 | loss 0.057484 | mae 0.165192 -[2024/06/24 06:33:21] ppsci INFO: train: epoch 331 | step 20 | lr 0.000379 | loss 0.040400 | mae 0.162854 -[2024/06/24 06:33:21] ppsci INFO: train: epoch 331 | step 30 | lr 0.000379 | loss 0.079678 | mae 0.187770 -[2024/06/24 06:33:21] ppsci INFO: train: epoch 331 | step 38 | lr 0.000379 | loss 0.028828 | mae 0.129922 -[2024/06/24 06:33:21] ppsci INFO: epoch: 331, train_loss: 0.055448, train_metric: 0.166578, eval_loss: 0.063961, eval_mae: 0.171371 -[2024/06/24 06:33:22] ppsci INFO: train: epoch 332 | step 0 | lr 0.000378 | loss 0.036049 | mae 0.136641 -[2024/06/24 06:33:22] ppsci INFO: train: epoch 332 | step 10 | lr 0.000378 | loss 0.051618 | mae 0.166444 -[2024/06/24 06:33:23] ppsci INFO: train: epoch 332 | step 20 | lr 0.000378 | loss 0.074686 | mae 0.182433 -[2024/06/24 06:33:23] ppsci INFO: train: epoch 332 | step 30 | lr 0.000378 | loss 0.040776 | mae 0.153759 -[2024/06/24 06:33:23] ppsci INFO: train: epoch 332 | step 38 | lr 0.000378 | loss 0.090607 | mae 0.217183 -[2024/06/24 06:33:24] ppsci INFO: epoch: 332, train_loss: 0.053622, train_metric: 0.164132, eval_loss: 0.071080, eval_mae: 0.173100 -[2024/06/24 06:33:24] ppsci INFO: train: epoch 333 | step 0 | lr 0.000378 | loss 0.032506 | mae 0.135290 -[2024/06/24 06:33:24] ppsci INFO: train: epoch 333 | step 10 | lr 0.000378 | loss 0.039457 | mae 0.140391 -[2024/06/24 06:33:25] ppsci INFO: train: epoch 333 | step 20 | lr 0.000378 | loss 0.072329 | mae 0.161739 -[2024/06/24 06:33:25] ppsci INFO: train: epoch 333 | step 30 | lr 0.000378 | loss 0.049734 | mae 0.159603 -[2024/06/24 06:33:26] ppsci INFO: train: epoch 333 | step 38 | lr 0.000378 | loss 0.071648 | mae 0.195700 -[2024/06/24 06:33:26] ppsci INFO: epoch: 333, train_loss: 0.053375, train_metric: 0.161326, eval_loss: 0.069970, eval_mae: 0.175654 -[2024/06/24 06:33:26] ppsci INFO: train: epoch 334 | step 0 | lr 0.000377 | loss 0.057421 | mae 0.168137 -[2024/06/24 06:33:26] ppsci INFO: train: epoch 334 | step 10 | lr 0.000377 | loss 0.048158 | mae 0.164283 -[2024/06/24 06:33:27] ppsci INFO: train: epoch 334 | step 20 | lr 0.000377 | loss 0.077540 | mae 0.196197 -[2024/06/24 06:33:28] ppsci INFO: train: epoch 334 | step 30 | lr 0.000377 | loss 0.072039 | mae 0.173238 -[2024/06/24 06:33:28] ppsci INFO: train: epoch 334 | step 38 | lr 0.000377 | loss 0.133009 | mae 0.253850 -[2024/06/24 06:33:28] ppsci INFO: epoch: 334, train_loss: 0.055170, train_metric: 0.164144, eval_loss: 0.062927, eval_mae: 0.172420 -[2024/06/24 06:33:28] ppsci INFO: train: epoch 335 | step 0 | lr 0.000376 | loss 0.063027 | mae 0.181592 -[2024/06/24 06:33:29] ppsci INFO: train: epoch 335 | step 10 | lr 0.000376 | loss 0.053519 | mae 0.169758 -[2024/06/24 06:33:29] ppsci INFO: train: epoch 335 | step 20 | lr 0.000376 | loss 0.056666 | mae 0.167819 -[2024/06/24 06:33:30] ppsci INFO: train: epoch 335 | step 30 | lr 0.000376 | loss 0.039639 | mae 0.152089 -[2024/06/24 06:33:30] ppsci INFO: train: epoch 335 | step 38 | lr 0.000376 | loss 0.130254 | mae 0.240567 -[2024/06/24 06:33:30] ppsci INFO: epoch: 335, train_loss: 0.056225, train_metric: 0.167090, eval_loss: 0.068019, eval_mae: 0.176202 -[2024/06/24 06:33:30] ppsci INFO: train: epoch 336 | step 0 | lr 0.000376 | loss 0.056924 | mae 0.177768 -[2024/06/24 06:33:31] ppsci INFO: train: epoch 336 | step 10 | lr 0.000376 | loss 0.037197 | mae 0.141152 -[2024/06/24 06:33:31] ppsci INFO: train: epoch 336 | step 20 | lr 0.000376 | loss 0.060153 | mae 0.175744 -[2024/06/24 06:33:32] ppsci INFO: train: epoch 336 | step 30 | lr 0.000376 | loss 0.054338 | mae 0.171041 -[2024/06/24 06:33:32] ppsci INFO: train: epoch 336 | step 38 | lr 0.000376 | loss 0.041630 | mae 0.142294 -[2024/06/24 06:33:32] ppsci INFO: epoch: 336, train_loss: 0.054357, train_metric: 0.165014, eval_loss: 0.067009, eval_mae: 0.177695 -[2024/06/24 06:33:32] ppsci INFO: train: epoch 337 | step 0 | lr 0.000375 | loss 0.044803 | mae 0.151777 -[2024/06/24 06:33:33] ppsci INFO: train: epoch 337 | step 10 | lr 0.000375 | loss 0.048754 | mae 0.145510 -[2024/06/24 06:33:33] ppsci INFO: train: epoch 337 | step 20 | lr 0.000375 | loss 0.040797 | mae 0.153924 -[2024/06/24 06:33:34] ppsci INFO: train: epoch 337 | step 30 | lr 0.000375 | loss 0.068699 | mae 0.191087 -[2024/06/24 06:33:34] ppsci INFO: train: epoch 337 | step 38 | lr 0.000375 | loss 0.022776 | mae 0.113787 -[2024/06/24 06:33:34] ppsci INFO: epoch: 337, train_loss: 0.051948, train_metric: 0.164455, eval_loss: 0.066171, eval_mae: 0.173043 -[2024/06/24 06:33:34] ppsci INFO: train: epoch 338 | step 0 | lr 0.000374 | loss 0.057117 | mae 0.158016 -[2024/06/24 06:33:35] ppsci INFO: train: epoch 338 | step 10 | lr 0.000374 | loss 0.059846 | mae 0.175930 -[2024/06/24 06:33:35] ppsci INFO: train: epoch 338 | step 20 | lr 0.000374 | loss 0.081235 | mae 0.205355 -[2024/06/24 06:33:36] ppsci INFO: train: epoch 338 | step 30 | lr 0.000374 | loss 0.070098 | mae 0.179472 -[2024/06/24 06:33:36] ppsci INFO: train: epoch 338 | step 38 | lr 0.000374 | loss 0.030891 | mae 0.140391 -[2024/06/24 06:33:36] ppsci INFO: epoch: 338, train_loss: 0.054986, train_metric: 0.165075, eval_loss: 0.063549, eval_mae: 0.175519 -[2024/06/24 06:33:36] ppsci INFO: train: epoch 339 | step 0 | lr 0.000374 | loss 0.050396 | mae 0.164127 -[2024/06/24 06:33:37] ppsci INFO: train: epoch 339 | step 10 | lr 0.000374 | loss 0.047228 | mae 0.160063 -[2024/06/24 06:33:37] ppsci INFO: train: epoch 339 | step 20 | lr 0.000374 | loss 0.072423 | mae 0.193510 -[2024/06/24 06:33:38] ppsci INFO: train: epoch 339 | step 30 | lr 0.000374 | loss 0.057435 | mae 0.174628 -[2024/06/24 06:33:38] ppsci INFO: train: epoch 339 | step 38 | lr 0.000374 | loss 0.043153 | mae 0.169370 -[2024/06/24 06:33:38] ppsci INFO: epoch: 339, train_loss: 0.053778, train_metric: 0.162431, eval_loss: 0.067572, eval_mae: 0.174676 -[2024/06/24 06:33:39] ppsci INFO: train: epoch 340 | step 0 | lr 0.000373 | loss 0.151825 | mae 0.191682 -[2024/06/24 06:33:39] ppsci INFO: train: epoch 340 | step 10 | lr 0.000373 | loss 0.045632 | mae 0.156949 -[2024/06/24 06:33:40] ppsci INFO: train: epoch 340 | step 20 | lr 0.000373 | loss 0.056092 | mae 0.169783 -[2024/06/24 06:33:40] ppsci INFO: train: epoch 340 | step 30 | lr 0.000373 | loss 0.067562 | mae 0.168402 -[2024/06/24 06:33:40] ppsci INFO: train: epoch 340 | step 38 | lr 0.000373 | loss 0.109814 | mae 0.244241 -[2024/06/24 06:33:41] ppsci INFO: epoch: 340, train_loss: 0.055712, train_metric: 0.164258, eval_loss: 0.066191, eval_mae: 0.175785 -[2024/06/24 06:33:41] ppsci INFO: train: epoch 341 | step 0 | lr 0.000372 | loss 0.067554 | mae 0.181208 -[2024/06/24 06:33:41] ppsci INFO: train: epoch 341 | step 10 | lr 0.000372 | loss 0.033219 | mae 0.137887 -[2024/06/24 06:33:42] ppsci INFO: train: epoch 341 | step 20 | lr 0.000372 | loss 0.054314 | mae 0.177446 -[2024/06/24 06:33:42] ppsci INFO: train: epoch 341 | step 30 | lr 0.000372 | loss 0.052378 | mae 0.160153 -[2024/06/24 06:33:43] ppsci INFO: train: epoch 341 | step 38 | lr 0.000372 | loss 0.021301 | mae 0.120085 -[2024/06/24 06:33:43] ppsci INFO: epoch: 341, train_loss: 0.052058, train_metric: 0.164292, eval_loss: 0.070696, eval_mae: 0.179213 -[2024/06/24 06:33:43] ppsci INFO: train: epoch 342 | step 0 | lr 0.000372 | loss 0.061069 | mae 0.176615 -[2024/06/24 06:33:43] ppsci INFO: train: epoch 342 | step 10 | lr 0.000372 | loss 0.055831 | mae 0.170960 -[2024/06/24 06:33:44] ppsci INFO: train: epoch 342 | step 20 | lr 0.000372 | loss 0.049062 | mae 0.157323 -[2024/06/24 06:33:44] ppsci INFO: train: epoch 342 | step 30 | lr 0.000372 | loss 0.050102 | mae 0.163849 -[2024/06/24 06:33:45] ppsci INFO: train: epoch 342 | step 38 | lr 0.000372 | loss 0.025478 | mae 0.114135 -[2024/06/24 06:33:45] ppsci INFO: epoch: 342, train_loss: 0.050570, train_metric: 0.159447, eval_loss: 0.062849, eval_mae: 0.175738 -[2024/06/24 06:33:45] ppsci INFO: train: epoch 343 | step 0 | lr 0.000371 | loss 0.047794 | mae 0.165721 -[2024/06/24 06:33:45] ppsci INFO: train: epoch 343 | step 10 | lr 0.000371 | loss 0.069668 | mae 0.183324 -[2024/06/24 06:33:46] ppsci INFO: train: epoch 343 | step 20 | lr 0.000371 | loss 0.034649 | mae 0.137995 -[2024/06/24 06:33:46] ppsci INFO: train: epoch 343 | step 30 | lr 0.000371 | loss 0.063967 | mae 0.174717 -[2024/06/24 06:33:47] ppsci INFO: train: epoch 343 | step 38 | lr 0.000371 | loss 0.044588 | mae 0.155419 -[2024/06/24 06:33:47] ppsci INFO: epoch: 343, train_loss: 0.054635, train_metric: 0.167671, eval_loss: 0.060070, eval_mae: 0.171564 -[2024/06/24 06:33:47] ppsci INFO: train: epoch 344 | step 0 | lr 0.000370 | loss 0.051904 | mae 0.163096 -[2024/06/24 06:33:48] ppsci INFO: train: epoch 344 | step 10 | lr 0.000370 | loss 0.047824 | mae 0.152290 -[2024/06/24 06:33:48] ppsci INFO: train: epoch 344 | step 20 | lr 0.000370 | loss 0.056927 | mae 0.168628 -[2024/06/24 06:33:49] ppsci INFO: train: epoch 344 | step 30 | lr 0.000370 | loss 0.073947 | mae 0.183704 -[2024/06/24 06:33:49] ppsci INFO: train: epoch 344 | step 38 | lr 0.000370 | loss 0.073571 | mae 0.208987 -[2024/06/24 06:33:49] ppsci INFO: epoch: 344, train_loss: 0.055005, train_metric: 0.167064, eval_loss: 0.065609, eval_mae: 0.178350 -[2024/06/24 06:33:49] ppsci INFO: train: epoch 345 | step 0 | lr 0.000370 | loss 0.044811 | mae 0.157720 -[2024/06/24 06:33:50] ppsci INFO: train: epoch 345 | step 10 | lr 0.000370 | loss 0.055825 | mae 0.174680 -[2024/06/24 06:33:50] ppsci INFO: train: epoch 345 | step 20 | lr 0.000370 | loss 0.046057 | mae 0.162459 -[2024/06/24 06:33:51] ppsci INFO: train: epoch 345 | step 30 | lr 0.000370 | loss 0.050888 | mae 0.163613 -[2024/06/24 06:33:51] ppsci INFO: train: epoch 345 | step 38 | lr 0.000370 | loss 0.055988 | mae 0.201890 -[2024/06/24 06:33:51] ppsci INFO: epoch: 345, train_loss: 0.049986, train_metric: 0.161725, eval_loss: 0.061356, eval_mae: 0.175720 -[2024/06/24 06:33:51] ppsci INFO: train: epoch 346 | step 0 | lr 0.000369 | loss 0.055737 | mae 0.152261 -[2024/06/24 06:33:52] ppsci INFO: train: epoch 346 | step 10 | lr 0.000369 | loss 0.069698 | mae 0.181704 -[2024/06/24 06:33:52] ppsci INFO: train: epoch 346 | step 20 | lr 0.000369 | loss 0.074100 | mae 0.186073 -[2024/06/24 06:33:53] ppsci INFO: train: epoch 346 | step 30 | lr 0.000369 | loss 0.058789 | mae 0.175321 -[2024/06/24 06:33:53] ppsci INFO: train: epoch 346 | step 38 | lr 0.000369 | loss 0.038901 | mae 0.161484 -[2024/06/24 06:33:53] ppsci INFO: epoch: 346, train_loss: 0.054815, train_metric: 0.167771, eval_loss: 0.068409, eval_mae: 0.179700 -[2024/06/24 06:33:53] ppsci INFO: train: epoch 347 | step 0 | lr 0.000368 | loss 0.049848 | mae 0.165755 -[2024/06/24 06:33:54] ppsci INFO: train: epoch 347 | step 10 | lr 0.000368 | loss 0.054841 | mae 0.169256 -[2024/06/24 06:33:55] ppsci INFO: train: epoch 347 | step 20 | lr 0.000368 | loss 0.034910 | mae 0.141293 -[2024/06/24 06:33:55] ppsci INFO: train: epoch 347 | step 30 | lr 0.000368 | loss 0.053988 | mae 0.171962 -[2024/06/24 06:33:56] ppsci INFO: train: epoch 347 | step 38 | lr 0.000368 | loss 0.019775 | mae 0.109900 -[2024/06/24 06:33:56] ppsci INFO: epoch: 347, train_loss: 0.053979, train_metric: 0.166859, eval_loss: 0.072691, eval_mae: 0.179755 -[2024/06/24 06:33:56] ppsci INFO: train: epoch 348 | step 0 | lr 0.000368 | loss 0.074091 | mae 0.181298 -[2024/06/24 06:33:56] ppsci INFO: train: epoch 348 | step 10 | lr 0.000368 | loss 0.050761 | mae 0.162683 -[2024/06/24 06:33:57] ppsci INFO: train: epoch 348 | step 20 | lr 0.000368 | loss 0.038503 | mae 0.156688 -[2024/06/24 06:33:57] ppsci INFO: train: epoch 348 | step 30 | lr 0.000368 | loss 0.045307 | mae 0.156377 -[2024/06/24 06:33:58] ppsci INFO: train: epoch 348 | step 38 | lr 0.000368 | loss 0.026827 | mae 0.135145 -[2024/06/24 06:33:58] ppsci INFO: epoch: 348, train_loss: 0.051530, train_metric: 0.161988, eval_loss: 0.069397, eval_mae: 0.177974 -[2024/06/24 06:33:58] ppsci INFO: train: epoch 349 | step 0 | lr 0.000367 | loss 0.050532 | mae 0.166438 -[2024/06/24 06:33:59] ppsci INFO: train: epoch 349 | step 10 | lr 0.000367 | loss 0.051527 | mae 0.168242 -[2024/06/24 06:33:59] ppsci INFO: train: epoch 349 | step 20 | lr 0.000367 | loss 0.049030 | mae 0.165226 -[2024/06/24 06:34:00] ppsci INFO: train: epoch 349 | step 30 | lr 0.000367 | loss 0.047855 | mae 0.157847 -[2024/06/24 06:34:00] ppsci INFO: train: epoch 349 | step 38 | lr 0.000367 | loss 0.093796 | mae 0.165824 -[2024/06/24 06:34:00] ppsci INFO: epoch: 349, train_loss: 0.054699, train_metric: 0.164762, eval_loss: 0.064846, eval_mae: 0.175120 -[2024/06/24 06:34:00] ppsci INFO: train: epoch 350 | step 0 | lr 0.000366 | loss 0.059671 | mae 0.159994 -[2024/06/24 06:34:01] ppsci INFO: train: epoch 350 | step 10 | lr 0.000366 | loss 0.045827 | mae 0.158988 -[2024/06/24 06:34:01] ppsci INFO: train: epoch 350 | step 20 | lr 0.000366 | loss 0.049628 | mae 0.155151 -[2024/06/24 06:34:02] ppsci INFO: train: epoch 350 | step 30 | lr 0.000366 | loss 0.055215 | mae 0.165891 -[2024/06/24 06:34:02] ppsci INFO: train: epoch 350 | step 38 | lr 0.000366 | loss 0.073507 | mae 0.198232 -[2024/06/24 06:34:02] ppsci INFO: epoch: 350, train_loss: 0.057469, train_metric: 0.165042, eval_loss: 0.068772, eval_mae: 0.179386 -[2024/06/24 06:34:02] ppsci INFO: train: epoch 351 | step 0 | lr 0.000366 | loss 0.053181 | mae 0.163308 -[2024/06/24 06:34:03] ppsci INFO: train: epoch 351 | step 10 | lr 0.000366 | loss 0.044640 | mae 0.154915 -[2024/06/24 06:34:03] ppsci INFO: train: epoch 351 | step 20 | lr 0.000366 | loss 0.056814 | mae 0.169977 -[2024/06/24 06:34:04] ppsci INFO: train: epoch 351 | step 30 | lr 0.000366 | loss 0.035420 | mae 0.142622 -[2024/06/24 06:34:04] ppsci INFO: train: epoch 351 | step 38 | lr 0.000366 | loss 0.092381 | mae 0.219733 -[2024/06/24 06:34:04] ppsci INFO: epoch: 351, train_loss: 0.051898, train_metric: 0.162130, eval_loss: 0.066590, eval_mae: 0.174075 -[2024/06/24 06:34:05] ppsci INFO: train: epoch 352 | step 0 | lr 0.000365 | loss 0.063121 | mae 0.178117 -[2024/06/24 06:34:05] ppsci INFO: train: epoch 352 | step 10 | lr 0.000365 | loss 0.058483 | mae 0.162237 -[2024/06/24 06:34:06] ppsci INFO: train: epoch 352 | step 20 | lr 0.000365 | loss 0.054648 | mae 0.172123 -[2024/06/24 06:34:06] ppsci INFO: train: epoch 352 | step 30 | lr 0.000365 | loss 0.045820 | mae 0.162658 -[2024/06/24 06:34:06] ppsci INFO: train: epoch 352 | step 38 | lr 0.000365 | loss 0.041738 | mae 0.174306 -[2024/06/24 06:34:07] ppsci INFO: epoch: 352, train_loss: 0.054647, train_metric: 0.165324, eval_loss: 0.064979, eval_mae: 0.172956 -[2024/06/24 06:34:07] ppsci INFO: train: epoch 353 | step 0 | lr 0.000364 | loss 0.046856 | mae 0.155576 -[2024/06/24 06:34:07] ppsci INFO: train: epoch 353 | step 10 | lr 0.000364 | loss 0.057360 | mae 0.158156 -[2024/06/24 06:34:08] ppsci INFO: train: epoch 353 | step 20 | lr 0.000364 | loss 0.049481 | mae 0.161149 -[2024/06/24 06:34:08] ppsci INFO: train: epoch 353 | step 30 | lr 0.000364 | loss 0.050396 | mae 0.171710 -[2024/06/24 06:34:09] ppsci INFO: train: epoch 353 | step 38 | lr 0.000364 | loss 0.029179 | mae 0.134785 -[2024/06/24 06:34:09] ppsci INFO: epoch: 353, train_loss: 0.050378, train_metric: 0.160660, eval_loss: 0.062375, eval_mae: 0.170367 -[2024/06/24 06:34:09] ppsci INFO: train: epoch 354 | step 0 | lr 0.000363 | loss 0.047891 | mae 0.166251 -[2024/06/24 06:34:10] ppsci INFO: train: epoch 354 | step 10 | lr 0.000363 | loss 0.051309 | mae 0.163441 -[2024/06/24 06:34:10] ppsci INFO: train: epoch 354 | step 20 | lr 0.000363 | loss 0.053639 | mae 0.166899 -[2024/06/24 06:34:11] ppsci INFO: train: epoch 354 | step 30 | lr 0.000363 | loss 0.055935 | mae 0.163031 -[2024/06/24 06:34:11] ppsci INFO: train: epoch 354 | step 38 | lr 0.000363 | loss 0.019426 | mae 0.116477 -[2024/06/24 06:34:11] ppsci INFO: epoch: 354, train_loss: 0.052021, train_metric: 0.162470, eval_loss: 0.064715, eval_mae: 0.172700 -[2024/06/24 06:34:11] ppsci INFO: train: epoch 355 | step 0 | lr 0.000363 | loss 0.044193 | mae 0.152877 -[2024/06/24 06:34:12] ppsci INFO: train: epoch 355 | step 10 | lr 0.000363 | loss 0.042426 | mae 0.151266 -[2024/06/24 06:34:12] ppsci INFO: train: epoch 355 | step 20 | lr 0.000363 | loss 0.038990 | mae 0.144912 -[2024/06/24 06:34:13] ppsci INFO: train: epoch 355 | step 30 | lr 0.000363 | loss 0.045416 | mae 0.155385 -[2024/06/24 06:34:13] ppsci INFO: train: epoch 355 | step 38 | lr 0.000363 | loss 0.070592 | mae 0.202315 -[2024/06/24 06:34:13] ppsci INFO: epoch: 355, train_loss: 0.051804, train_metric: 0.161221, eval_loss: 0.062911, eval_mae: 0.174377 -[2024/06/24 06:34:13] ppsci INFO: train: epoch 356 | step 0 | lr 0.000362 | loss 0.068375 | mae 0.182986 -[2024/06/24 06:34:14] ppsci INFO: train: epoch 356 | step 10 | lr 0.000362 | loss 0.056547 | mae 0.169417 -[2024/06/24 06:34:14] ppsci INFO: train: epoch 356 | step 20 | lr 0.000362 | loss 0.036777 | mae 0.147122 -[2024/06/24 06:34:15] ppsci INFO: train: epoch 356 | step 30 | lr 0.000362 | loss 0.051584 | mae 0.162324 -[2024/06/24 06:34:15] ppsci INFO: train: epoch 356 | step 38 | lr 0.000362 | loss 0.051785 | mae 0.159705 -[2024/06/24 06:34:16] ppsci INFO: epoch: 356, train_loss: 0.051875, train_metric: 0.165103, eval_loss: 0.068375, eval_mae: 0.176429 -[2024/06/24 06:34:16] ppsci INFO: train: epoch 357 | step 0 | lr 0.000361 | loss 0.042375 | mae 0.149983 -[2024/06/24 06:34:16] ppsci INFO: train: epoch 357 | step 10 | lr 0.000361 | loss 0.049843 | mae 0.158788 -[2024/06/24 06:34:17] ppsci INFO: train: epoch 357 | step 20 | lr 0.000361 | loss 0.034037 | mae 0.143124 -[2024/06/24 06:34:17] ppsci INFO: train: epoch 357 | step 30 | lr 0.000361 | loss 0.044338 | mae 0.157697 -[2024/06/24 06:34:18] ppsci INFO: train: epoch 357 | step 38 | lr 0.000361 | loss 0.109799 | mae 0.245103 -[2024/06/24 06:34:18] ppsci INFO: epoch: 357, train_loss: 0.056319, train_metric: 0.164044, eval_loss: 0.066508, eval_mae: 0.174237 -[2024/06/24 06:34:18] ppsci INFO: train: epoch 358 | step 0 | lr 0.000361 | loss 0.048897 | mae 0.146677 -[2024/06/24 06:34:18] ppsci INFO: train: epoch 358 | step 10 | lr 0.000361 | loss 0.066121 | mae 0.180291 -[2024/06/24 06:34:19] ppsci INFO: train: epoch 358 | step 20 | lr 0.000361 | loss 0.063621 | mae 0.173217 -[2024/06/24 06:34:19] ppsci INFO: train: epoch 358 | step 30 | lr 0.000361 | loss 0.046570 | mae 0.156859 -[2024/06/24 06:34:20] ppsci INFO: train: epoch 358 | step 38 | lr 0.000361 | loss 0.031981 | mae 0.129003 -[2024/06/24 06:34:20] ppsci INFO: epoch: 358, train_loss: 0.050256, train_metric: 0.158922, eval_loss: 0.066355, eval_mae: 0.178405 -[2024/06/24 06:34:20] ppsci INFO: train: epoch 359 | step 0 | lr 0.000360 | loss 0.048380 | mae 0.165249 -[2024/06/24 06:34:20] ppsci INFO: train: epoch 359 | step 10 | lr 0.000360 | loss 0.045598 | mae 0.156270 -[2024/06/24 06:34:21] ppsci INFO: train: epoch 359 | step 20 | lr 0.000360 | loss 0.044866 | mae 0.151676 -[2024/06/24 06:34:21] ppsci INFO: train: epoch 359 | step 30 | lr 0.000360 | loss 0.078978 | mae 0.181550 -[2024/06/24 06:34:22] ppsci INFO: train: epoch 359 | step 38 | lr 0.000360 | loss 0.015437 | mae 0.098815 -[2024/06/24 06:34:22] ppsci INFO: epoch: 359, train_loss: 0.055440, train_metric: 0.166620, eval_loss: 0.066406, eval_mae: 0.174956 -[2024/06/24 06:34:22] ppsci INFO: train: epoch 360 | step 0 | lr 0.000359 | loss 0.055121 | mae 0.162321 -[2024/06/24 06:34:23] ppsci INFO: train: epoch 360 | step 10 | lr 0.000359 | loss 0.050717 | mae 0.161436 -[2024/06/24 06:34:23] ppsci INFO: train: epoch 360 | step 20 | lr 0.000359 | loss 0.042959 | mae 0.152263 -[2024/06/24 06:34:24] ppsci INFO: train: epoch 360 | step 30 | lr 0.000359 | loss 0.039028 | mae 0.149077 -[2024/06/24 06:34:24] ppsci INFO: train: epoch 360 | step 38 | lr 0.000359 | loss 0.052909 | mae 0.163636 -[2024/06/24 06:34:24] ppsci INFO: epoch: 360, train_loss: 0.052292, train_metric: 0.162056, eval_loss: 0.065655, eval_mae: 0.177729 -[2024/06/24 06:34:24] ppsci INFO: train: epoch 361 | step 0 | lr 0.000359 | loss 0.051054 | mae 0.169059 -[2024/06/24 06:34:25] ppsci INFO: train: epoch 361 | step 10 | lr 0.000359 | loss 0.066877 | mae 0.181103 -[2024/06/24 06:34:25] ppsci INFO: train: epoch 361 | step 20 | lr 0.000359 | loss 0.057737 | mae 0.178818 -[2024/06/24 06:34:26] ppsci INFO: train: epoch 361 | step 30 | lr 0.000359 | loss 0.038016 | mae 0.147351 -[2024/06/24 06:34:26] ppsci INFO: train: epoch 361 | step 38 | lr 0.000359 | loss 0.046902 | mae 0.163535 -[2024/06/24 06:34:26] ppsci INFO: epoch: 361, train_loss: 0.052000, train_metric: 0.161900, eval_loss: 0.065652, eval_mae: 0.170968 -[2024/06/24 06:34:26] ppsci INFO: train: epoch 362 | step 0 | lr 0.000358 | loss 0.047336 | mae 0.153867 -[2024/06/24 06:34:27] ppsci INFO: train: epoch 362 | step 10 | lr 0.000358 | loss 0.059632 | mae 0.169758 -[2024/06/24 06:34:27] ppsci INFO: train: epoch 362 | step 20 | lr 0.000358 | loss 0.053370 | mae 0.159627 -[2024/06/24 06:34:28] ppsci INFO: train: epoch 362 | step 30 | lr 0.000358 | loss 0.033530 | mae 0.139037 -[2024/06/24 06:34:28] ppsci INFO: train: epoch 362 | step 38 | lr 0.000358 | loss 0.032187 | mae 0.134860 -[2024/06/24 06:34:28] ppsci INFO: epoch: 362, train_loss: 0.051800, train_metric: 0.160352, eval_loss: 0.066653, eval_mae: 0.175853 -[2024/06/24 06:34:28] ppsci INFO: train: epoch 363 | step 0 | lr 0.000357 | loss 0.047039 | mae 0.161345 -[2024/06/24 06:34:29] ppsci INFO: train: epoch 363 | step 10 | lr 0.000357 | loss 0.055319 | mae 0.161813 -[2024/06/24 06:34:29] ppsci INFO: train: epoch 363 | step 20 | lr 0.000357 | loss 0.050080 | mae 0.164642 -[2024/06/24 06:34:30] ppsci INFO: train: epoch 363 | step 30 | lr 0.000357 | loss 0.069175 | mae 0.172468 -[2024/06/24 06:34:30] ppsci INFO: train: epoch 363 | step 38 | lr 0.000357 | loss 0.107765 | mae 0.186315 -[2024/06/24 06:34:30] ppsci INFO: epoch: 363, train_loss: 0.054769, train_metric: 0.164372, eval_loss: 0.065899, eval_mae: 0.174845 -[2024/06/24 06:34:31] ppsci INFO: train: epoch 364 | step 0 | lr 0.000357 | loss 0.047011 | mae 0.153118 -[2024/06/24 06:34:31] ppsci INFO: train: epoch 364 | step 10 | lr 0.000357 | loss 0.040283 | mae 0.144622 -[2024/06/24 06:34:31] ppsci INFO: train: epoch 364 | step 20 | lr 0.000357 | loss 0.033907 | mae 0.136909 -[2024/06/24 06:34:32] ppsci INFO: train: epoch 364 | step 30 | lr 0.000357 | loss 0.084086 | mae 0.165729 -[2024/06/24 06:34:32] ppsci INFO: train: epoch 364 | step 38 | lr 0.000357 | loss 0.038869 | mae 0.175222 -[2024/06/24 06:34:32] ppsci INFO: epoch: 364, train_loss: 0.052053, train_metric: 0.159222, eval_loss: 0.072456, eval_mae: 0.181055 -[2024/06/24 06:34:33] ppsci INFO: train: epoch 365 | step 0 | lr 0.000356 | loss 0.034293 | mae 0.141407 -[2024/06/24 06:34:33] ppsci INFO: train: epoch 365 | step 10 | lr 0.000356 | loss 0.042097 | mae 0.147970 -[2024/06/24 06:34:34] ppsci INFO: train: epoch 365 | step 20 | lr 0.000356 | loss 0.071040 | mae 0.183367 -[2024/06/24 06:34:34] ppsci INFO: train: epoch 365 | step 30 | lr 0.000356 | loss 0.096969 | mae 0.209069 -[2024/06/24 06:34:34] ppsci INFO: train: epoch 365 | step 38 | lr 0.000356 | loss 0.070997 | mae 0.212057 -[2024/06/24 06:34:34] ppsci INFO: epoch: 365, train_loss: 0.055329, train_metric: 0.162262, eval_loss: 0.067393, eval_mae: 0.170692 -[2024/06/24 06:34:35] ppsci INFO: train: epoch 366 | step 0 | lr 0.000355 | loss 0.048020 | mae 0.160397 -[2024/06/24 06:34:35] ppsci INFO: train: epoch 366 | step 10 | lr 0.000355 | loss 0.047352 | mae 0.162887 -[2024/06/24 06:34:36] ppsci INFO: train: epoch 366 | step 20 | lr 0.000355 | loss 0.044941 | mae 0.164056 -[2024/06/24 06:34:36] ppsci INFO: train: epoch 366 | step 30 | lr 0.000355 | loss 0.056689 | mae 0.167896 -[2024/06/24 06:34:37] ppsci INFO: train: epoch 366 | step 38 | lr 0.000355 | loss 0.076413 | mae 0.203504 -[2024/06/24 06:34:37] ppsci INFO: epoch: 366, train_loss: 0.049947, train_metric: 0.157425, eval_loss: 0.069878, eval_mae: 0.169450 -[2024/06/24 06:34:37] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:34:37] ppsci INFO: train: epoch 367 | step 0 | lr 0.000354 | loss 0.057060 | mae 0.165018 -[2024/06/24 06:34:37] ppsci INFO: train: epoch 367 | step 10 | lr 0.000354 | loss 0.053662 | mae 0.154120 -[2024/06/24 06:34:38] ppsci INFO: train: epoch 367 | step 20 | lr 0.000354 | loss 0.040845 | mae 0.145193 -[2024/06/24 06:34:38] ppsci INFO: train: epoch 367 | step 30 | lr 0.000354 | loss 0.059197 | mae 0.170834 -[2024/06/24 06:34:39] ppsci INFO: train: epoch 367 | step 38 | lr 0.000354 | loss 0.027039 | mae 0.121771 -[2024/06/24 06:34:39] ppsci INFO: epoch: 367, train_loss: 0.054433, train_metric: 0.163955, eval_loss: 0.065822, eval_mae: 0.167120 -[2024/06/24 06:34:39] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:34:39] ppsci INFO: train: epoch 368 | step 0 | lr 0.000354 | loss 0.066569 | mae 0.177323 -[2024/06/24 06:34:39] ppsci INFO: train: epoch 368 | step 10 | lr 0.000354 | loss 0.035507 | mae 0.129548 -[2024/06/24 06:34:40] ppsci INFO: train: epoch 368 | step 20 | lr 0.000354 | loss 0.035582 | mae 0.144548 -[2024/06/24 06:34:41] ppsci INFO: train: epoch 368 | step 30 | lr 0.000354 | loss 0.052118 | mae 0.172823 -[2024/06/24 06:34:41] ppsci INFO: train: epoch 368 | step 38 | lr 0.000354 | loss 0.054636 | mae 0.190961 -[2024/06/24 06:34:41] ppsci INFO: epoch: 368, train_loss: 0.049014, train_metric: 0.160198, eval_loss: 0.062860, eval_mae: 0.170685 -[2024/06/24 06:34:41] ppsci INFO: train: epoch 369 | step 0 | lr 0.000353 | loss 0.043388 | mae 0.159805 -[2024/06/24 06:34:42] ppsci INFO: train: epoch 369 | step 10 | lr 0.000353 | loss 0.034493 | mae 0.146223 -[2024/06/24 06:34:42] ppsci INFO: train: epoch 369 | step 20 | lr 0.000353 | loss 0.035808 | mae 0.133502 -[2024/06/24 06:34:43] ppsci INFO: train: epoch 369 | step 30 | lr 0.000353 | loss 0.051402 | mae 0.161627 -[2024/06/24 06:34:43] ppsci INFO: train: epoch 369 | step 38 | lr 0.000353 | loss 0.049945 | mae 0.171303 -[2024/06/24 06:34:43] ppsci INFO: epoch: 369, train_loss: 0.045540, train_metric: 0.155219, eval_loss: 0.065654, eval_mae: 0.174425 -[2024/06/24 06:34:43] ppsci INFO: train: epoch 370 | step 0 | lr 0.000352 | loss 0.040653 | mae 0.144897 -[2024/06/24 06:34:44] ppsci INFO: train: epoch 370 | step 10 | lr 0.000352 | loss 0.057515 | mae 0.156190 -[2024/06/24 06:34:44] ppsci INFO: train: epoch 370 | step 20 | lr 0.000352 | loss 0.048506 | mae 0.162788 -[2024/06/24 06:34:45] ppsci INFO: train: epoch 370 | step 30 | lr 0.000352 | loss 0.054847 | mae 0.167582 -[2024/06/24 06:34:45] ppsci INFO: train: epoch 370 | step 38 | lr 0.000352 | loss 0.030409 | mae 0.145246 -[2024/06/24 06:34:45] ppsci INFO: epoch: 370, train_loss: 0.049627, train_metric: 0.158732, eval_loss: 0.063015, eval_mae: 0.174886 -[2024/06/24 06:34:45] ppsci INFO: train: epoch 371 | step 0 | lr 0.000352 | loss 0.059731 | mae 0.175509 -[2024/06/24 06:34:46] ppsci INFO: train: epoch 371 | step 10 | lr 0.000352 | loss 0.038455 | mae 0.146487 -[2024/06/24 06:34:47] ppsci INFO: train: epoch 371 | step 20 | lr 0.000352 | loss 0.038397 | mae 0.152084 -[2024/06/24 06:34:47] ppsci INFO: train: epoch 371 | step 30 | lr 0.000352 | loss 0.072457 | mae 0.173649 -[2024/06/24 06:34:47] ppsci INFO: train: epoch 371 | step 38 | lr 0.000352 | loss 0.022944 | mae 0.126826 -[2024/06/24 06:34:48] ppsci INFO: epoch: 371, train_loss: 0.050112, train_metric: 0.160696, eval_loss: 0.065083, eval_mae: 0.174075 -[2024/06/24 06:34:48] ppsci INFO: train: epoch 372 | step 0 | lr 0.000351 | loss 0.037114 | mae 0.143348 -[2024/06/24 06:34:48] ppsci INFO: train: epoch 372 | step 10 | lr 0.000351 | loss 0.037134 | mae 0.140522 -[2024/06/24 06:34:49] ppsci INFO: train: epoch 372 | step 20 | lr 0.000351 | loss 0.065134 | mae 0.171194 -[2024/06/24 06:34:49] ppsci INFO: train: epoch 372 | step 30 | lr 0.000351 | loss 0.039619 | mae 0.150349 -[2024/06/24 06:34:50] ppsci INFO: train: epoch 372 | step 38 | lr 0.000351 | loss 0.046259 | mae 0.173357 -[2024/06/24 06:34:50] ppsci INFO: epoch: 372, train_loss: 0.051552, train_metric: 0.160823, eval_loss: 0.066545, eval_mae: 0.178355 -[2024/06/24 06:34:50] ppsci INFO: train: epoch 373 | step 0 | lr 0.000350 | loss 0.038270 | mae 0.151774 -[2024/06/24 06:34:50] ppsci INFO: train: epoch 373 | step 10 | lr 0.000350 | loss 0.053870 | mae 0.172500 -[2024/06/24 06:34:51] ppsci INFO: train: epoch 373 | step 20 | lr 0.000350 | loss 0.035186 | mae 0.137866 -[2024/06/24 06:34:51] ppsci INFO: train: epoch 373 | step 30 | lr 0.000350 | loss 0.048272 | mae 0.157571 -[2024/06/24 06:34:52] ppsci INFO: train: epoch 373 | step 38 | lr 0.000350 | loss 0.038511 | mae 0.159247 -[2024/06/24 06:34:52] ppsci INFO: epoch: 373, train_loss: 0.047760, train_metric: 0.157296, eval_loss: 0.069343, eval_mae: 0.176045 -[2024/06/24 06:34:52] ppsci INFO: train: epoch 374 | step 0 | lr 0.000349 | loss 0.055727 | mae 0.171646 -[2024/06/24 06:34:53] ppsci INFO: train: epoch 374 | step 10 | lr 0.000349 | loss 0.048682 | mae 0.148703 -[2024/06/24 06:34:53] ppsci INFO: train: epoch 374 | step 20 | lr 0.000349 | loss 0.075777 | mae 0.199334 -[2024/06/24 06:34:54] ppsci INFO: train: epoch 374 | step 30 | lr 0.000349 | loss 0.054693 | mae 0.160311 -[2024/06/24 06:34:54] ppsci INFO: train: epoch 374 | step 38 | lr 0.000349 | loss 0.063393 | mae 0.173213 -[2024/06/24 06:34:54] ppsci INFO: epoch: 374, train_loss: 0.049119, train_metric: 0.158579, eval_loss: 0.066974, eval_mae: 0.173213 -[2024/06/24 06:34:54] ppsci INFO: train: epoch 375 | step 0 | lr 0.000349 | loss 0.069075 | mae 0.179643 -[2024/06/24 06:34:55] ppsci INFO: train: epoch 375 | step 10 | lr 0.000349 | loss 0.056108 | mae 0.169172 -[2024/06/24 06:34:55] ppsci INFO: train: epoch 375 | step 20 | lr 0.000349 | loss 0.082421 | mae 0.181566 -[2024/06/24 06:34:56] ppsci INFO: train: epoch 375 | step 30 | lr 0.000349 | loss 0.076519 | mae 0.182023 -[2024/06/24 06:34:56] ppsci INFO: train: epoch 375 | step 38 | lr 0.000349 | loss 0.051766 | mae 0.155123 -[2024/06/24 06:34:56] ppsci INFO: epoch: 375, train_loss: 0.051095, train_metric: 0.163002, eval_loss: 0.068733, eval_mae: 0.174562 -[2024/06/24 06:34:56] ppsci INFO: train: epoch 376 | step 0 | lr 0.000348 | loss 0.042506 | mae 0.141288 -[2024/06/24 06:34:57] ppsci INFO: train: epoch 376 | step 10 | lr 0.000348 | loss 0.057477 | mae 0.166327 -[2024/06/24 06:34:57] ppsci INFO: train: epoch 376 | step 20 | lr 0.000348 | loss 0.057757 | mae 0.179301 -[2024/06/24 06:34:58] ppsci INFO: train: epoch 376 | step 30 | lr 0.000348 | loss 0.055310 | mae 0.166015 -[2024/06/24 06:34:58] ppsci INFO: train: epoch 376 | step 38 | lr 0.000348 | loss 0.043636 | mae 0.166268 -[2024/06/24 06:34:58] ppsci INFO: epoch: 376, train_loss: 0.050185, train_metric: 0.160755, eval_loss: 0.063526, eval_mae: 0.168396 -[2024/06/24 06:34:58] ppsci INFO: train: epoch 377 | step 0 | lr 0.000347 | loss 0.036993 | mae 0.144121 -[2024/06/24 06:34:59] ppsci INFO: train: epoch 377 | step 10 | lr 0.000347 | loss 0.049041 | mae 0.156571 -[2024/06/24 06:34:59] ppsci INFO: train: epoch 377 | step 20 | lr 0.000347 | loss 0.039262 | mae 0.148524 -[2024/06/24 06:35:00] ppsci INFO: train: epoch 377 | step 30 | lr 0.000347 | loss 0.057779 | mae 0.167642 -[2024/06/24 06:35:00] ppsci INFO: train: epoch 377 | step 38 | lr 0.000347 | loss 0.032202 | mae 0.149528 -[2024/06/24 06:35:01] ppsci INFO: epoch: 377, train_loss: 0.046699, train_metric: 0.155410, eval_loss: 0.069512, eval_mae: 0.176412 -[2024/06/24 06:35:01] ppsci INFO: train: epoch 378 | step 0 | lr 0.000347 | loss 0.036987 | mae 0.130914 -[2024/06/24 06:35:01] ppsci INFO: train: epoch 378 | step 10 | lr 0.000347 | loss 0.056163 | mae 0.169944 -[2024/06/24 06:35:02] ppsci INFO: train: epoch 378 | step 20 | lr 0.000347 | loss 0.040942 | mae 0.156192 -[2024/06/24 06:35:02] ppsci INFO: train: epoch 378 | step 30 | lr 0.000347 | loss 0.042565 | mae 0.149864 -[2024/06/24 06:35:03] ppsci INFO: train: epoch 378 | step 38 | lr 0.000347 | loss 0.040994 | mae 0.163071 -[2024/06/24 06:35:03] ppsci INFO: epoch: 378, train_loss: 0.048552, train_metric: 0.160058, eval_loss: 0.064416, eval_mae: 0.176197 -[2024/06/24 06:35:03] ppsci INFO: train: epoch 379 | step 0 | lr 0.000346 | loss 0.048670 | mae 0.158516 -[2024/06/24 06:35:03] ppsci INFO: train: epoch 379 | step 10 | lr 0.000346 | loss 0.055338 | mae 0.155538 -[2024/06/24 06:35:04] ppsci INFO: train: epoch 379 | step 20 | lr 0.000346 | loss 0.057018 | mae 0.170071 -[2024/06/24 06:35:04] ppsci INFO: train: epoch 379 | step 30 | lr 0.000346 | loss 0.039345 | mae 0.154904 -[2024/06/24 06:35:05] ppsci INFO: train: epoch 379 | step 38 | lr 0.000346 | loss 0.032982 | mae 0.142781 -[2024/06/24 06:35:05] ppsci INFO: epoch: 379, train_loss: 0.049155, train_metric: 0.160413, eval_loss: 0.070692, eval_mae: 0.178989 -[2024/06/24 06:35:05] ppsci INFO: train: epoch 380 | step 0 | lr 0.000345 | loss 0.060526 | mae 0.172276 -[2024/06/24 06:35:05] ppsci INFO: train: epoch 380 | step 10 | lr 0.000345 | loss 0.029960 | mae 0.130508 -[2024/06/24 06:35:06] ppsci INFO: train: epoch 380 | step 20 | lr 0.000345 | loss 0.026665 | mae 0.126097 -[2024/06/24 06:35:06] ppsci INFO: train: epoch 380 | step 30 | lr 0.000345 | loss 0.036463 | mae 0.138158 -[2024/06/24 06:35:07] ppsci INFO: train: epoch 380 | step 38 | lr 0.000345 | loss 0.040120 | mae 0.159551 -[2024/06/24 06:35:07] ppsci INFO: epoch: 380, train_loss: 0.045719, train_metric: 0.153789, eval_loss: 0.065456, eval_mae: 0.170980 -[2024/06/24 06:35:07] ppsci INFO: train: epoch 381 | step 0 | lr 0.000344 | loss 0.037754 | mae 0.146360 -[2024/06/24 06:35:08] ppsci INFO: train: epoch 381 | step 10 | lr 0.000344 | loss 0.049939 | mae 0.162641 -[2024/06/24 06:35:08] ppsci INFO: train: epoch 381 | step 20 | lr 0.000344 | loss 0.074404 | mae 0.183439 -[2024/06/24 06:35:09] ppsci INFO: train: epoch 381 | step 30 | lr 0.000344 | loss 0.046683 | mae 0.158437 -[2024/06/24 06:35:09] ppsci INFO: train: epoch 381 | step 38 | lr 0.000344 | loss 0.030232 | mae 0.148718 -[2024/06/24 06:35:09] ppsci INFO: epoch: 381, train_loss: 0.052607, train_metric: 0.160629, eval_loss: 0.064462, eval_mae: 0.170458 -[2024/06/24 06:35:09] ppsci INFO: train: epoch 382 | step 0 | lr 0.000344 | loss 0.078171 | mae 0.166947 -[2024/06/24 06:35:10] ppsci INFO: train: epoch 382 | step 10 | lr 0.000344 | loss 0.038240 | mae 0.143595 -[2024/06/24 06:35:10] ppsci INFO: train: epoch 382 | step 20 | lr 0.000344 | loss 0.041353 | mae 0.150439 -[2024/06/24 06:35:11] ppsci INFO: train: epoch 382 | step 30 | lr 0.000344 | loss 0.040569 | mae 0.147571 -[2024/06/24 06:35:11] ppsci INFO: train: epoch 382 | step 38 | lr 0.000344 | loss 0.070535 | mae 0.180173 -[2024/06/24 06:35:11] ppsci INFO: epoch: 382, train_loss: 0.050368, train_metric: 0.157869, eval_loss: 0.064718, eval_mae: 0.172044 -[2024/06/24 06:35:11] ppsci INFO: train: epoch 383 | step 0 | lr 0.000343 | loss 0.038735 | mae 0.146126 -[2024/06/24 06:35:12] ppsci INFO: train: epoch 383 | step 10 | lr 0.000343 | loss 0.041072 | mae 0.155168 -[2024/06/24 06:35:12] ppsci INFO: train: epoch 383 | step 20 | lr 0.000343 | loss 0.036319 | mae 0.146482 -[2024/06/24 06:35:13] ppsci INFO: train: epoch 383 | step 30 | lr 0.000343 | loss 0.062149 | mae 0.179160 -[2024/06/24 06:35:13] ppsci INFO: train: epoch 383 | step 38 | lr 0.000343 | loss 0.110317 | mae 0.229473 -[2024/06/24 06:35:13] ppsci INFO: epoch: 383, train_loss: 0.050943, train_metric: 0.160296, eval_loss: 0.071291, eval_mae: 0.179877 -[2024/06/24 06:35:13] ppsci INFO: train: epoch 384 | step 0 | lr 0.000342 | loss 0.043324 | mae 0.158000 -[2024/06/24 06:35:14] ppsci INFO: train: epoch 384 | step 10 | lr 0.000342 | loss 0.045436 | mae 0.142520 -[2024/06/24 06:35:14] ppsci INFO: train: epoch 384 | step 20 | lr 0.000342 | loss 0.036436 | mae 0.142827 -[2024/06/24 06:35:15] ppsci INFO: train: epoch 384 | step 30 | lr 0.000342 | loss 0.048366 | mae 0.163358 -[2024/06/24 06:35:15] ppsci INFO: train: epoch 384 | step 38 | lr 0.000342 | loss 0.070131 | mae 0.169332 -[2024/06/24 06:35:15] ppsci INFO: epoch: 384, train_loss: 0.051221, train_metric: 0.157386, eval_loss: 0.065464, eval_mae: 0.170921 -[2024/06/24 06:35:16] ppsci INFO: train: epoch 385 | step 0 | lr 0.000342 | loss 0.055679 | mae 0.185832 -[2024/06/24 06:35:16] ppsci INFO: train: epoch 385 | step 10 | lr 0.000342 | loss 0.040963 | mae 0.152382 -[2024/06/24 06:35:17] ppsci INFO: train: epoch 385 | step 20 | lr 0.000342 | loss 0.044288 | mae 0.164914 -[2024/06/24 06:35:17] ppsci INFO: train: epoch 385 | step 30 | lr 0.000342 | loss 0.037875 | mae 0.147575 -[2024/06/24 06:35:17] ppsci INFO: train: epoch 385 | step 38 | lr 0.000342 | loss 0.019129 | mae 0.110064 -[2024/06/24 06:35:18] ppsci INFO: epoch: 385, train_loss: 0.050864, train_metric: 0.158313, eval_loss: 0.069578, eval_mae: 0.173497 -[2024/06/24 06:35:18] ppsci INFO: train: epoch 386 | step 0 | lr 0.000341 | loss 0.060694 | mae 0.167908 -[2024/06/24 06:35:18] ppsci INFO: train: epoch 386 | step 10 | lr 0.000341 | loss 0.060443 | mae 0.174367 -[2024/06/24 06:35:19] ppsci INFO: train: epoch 386 | step 20 | lr 0.000341 | loss 0.077230 | mae 0.180953 -[2024/06/24 06:35:19] ppsci INFO: train: epoch 386 | step 30 | lr 0.000341 | loss 0.051221 | mae 0.169496 -[2024/06/24 06:35:20] ppsci INFO: train: epoch 386 | step 38 | lr 0.000341 | loss 0.034548 | mae 0.151376 -[2024/06/24 06:35:20] ppsci INFO: epoch: 386, train_loss: 0.048389, train_metric: 0.157577, eval_loss: 0.066237, eval_mae: 0.173207 -[2024/06/24 06:35:20] ppsci INFO: train: epoch 387 | step 0 | lr 0.000340 | loss 0.040037 | mae 0.150330 -[2024/06/24 06:35:20] ppsci INFO: train: epoch 387 | step 10 | lr 0.000340 | loss 0.033676 | mae 0.139171 -[2024/06/24 06:35:21] ppsci INFO: train: epoch 387 | step 20 | lr 0.000340 | loss 0.047974 | mae 0.161905 -[2024/06/24 06:35:21] ppsci INFO: train: epoch 387 | step 30 | lr 0.000340 | loss 0.040343 | mae 0.143434 -[2024/06/24 06:35:22] ppsci INFO: train: epoch 387 | step 38 | lr 0.000340 | loss 0.035545 | mae 0.128662 -[2024/06/24 06:35:22] ppsci INFO: epoch: 387, train_loss: 0.047083, train_metric: 0.156474, eval_loss: 0.065030, eval_mae: 0.171151 -[2024/06/24 06:35:22] ppsci INFO: train: epoch 388 | step 0 | lr 0.000339 | loss 0.045649 | mae 0.150199 -[2024/06/24 06:35:23] ppsci INFO: train: epoch 388 | step 10 | lr 0.000339 | loss 0.050964 | mae 0.152748 -[2024/06/24 06:35:23] ppsci INFO: train: epoch 388 | step 20 | lr 0.000339 | loss 0.053538 | mae 0.173368 -[2024/06/24 06:35:24] ppsci INFO: train: epoch 388 | step 30 | lr 0.000339 | loss 0.057859 | mae 0.164099 -[2024/06/24 06:35:24] ppsci INFO: train: epoch 388 | step 38 | lr 0.000339 | loss 0.034107 | mae 0.147382 -[2024/06/24 06:35:24] ppsci INFO: epoch: 388, train_loss: 0.050433, train_metric: 0.160631, eval_loss: 0.063887, eval_mae: 0.170919 -[2024/06/24 06:35:24] ppsci INFO: train: epoch 389 | step 0 | lr 0.000339 | loss 0.049791 | mae 0.157529 -[2024/06/24 06:35:25] ppsci INFO: train: epoch 389 | step 10 | lr 0.000339 | loss 0.057779 | mae 0.163668 -[2024/06/24 06:35:25] ppsci INFO: train: epoch 389 | step 20 | lr 0.000339 | loss 0.065344 | mae 0.173351 -[2024/06/24 06:35:26] ppsci INFO: train: epoch 389 | step 30 | lr 0.000339 | loss 0.041488 | mae 0.142237 -[2024/06/24 06:35:26] ppsci INFO: train: epoch 389 | step 38 | lr 0.000339 | loss 0.067414 | mae 0.197537 -[2024/06/24 06:35:26] ppsci INFO: epoch: 389, train_loss: 0.048443, train_metric: 0.156773, eval_loss: 0.068480, eval_mae: 0.176734 -[2024/06/24 06:35:26] ppsci INFO: train: epoch 390 | step 0 | lr 0.000338 | loss 0.040090 | mae 0.148834 -[2024/06/24 06:35:27] ppsci INFO: train: epoch 390 | step 10 | lr 0.000338 | loss 0.050962 | mae 0.167055 -[2024/06/24 06:35:27] ppsci INFO: train: epoch 390 | step 20 | lr 0.000338 | loss 0.042963 | mae 0.155194 -[2024/06/24 06:35:28] ppsci INFO: train: epoch 390 | step 30 | lr 0.000338 | loss 0.055230 | mae 0.176754 -[2024/06/24 06:35:28] ppsci INFO: train: epoch 390 | step 38 | lr 0.000338 | loss 0.048166 | mae 0.156822 -[2024/06/24 06:35:28] ppsci INFO: epoch: 390, train_loss: 0.051067, train_metric: 0.157577, eval_loss: 0.064498, eval_mae: 0.168601 -[2024/06/24 06:35:29] ppsci INFO: train: epoch 391 | step 0 | lr 0.000337 | loss 0.041099 | mae 0.137718 -[2024/06/24 06:35:29] ppsci INFO: train: epoch 391 | step 10 | lr 0.000337 | loss 0.046905 | mae 0.153295 -[2024/06/24 06:35:30] ppsci INFO: train: epoch 391 | step 20 | lr 0.000337 | loss 0.031940 | mae 0.138549 -[2024/06/24 06:35:30] ppsci INFO: train: epoch 391 | step 30 | lr 0.000337 | loss 0.041727 | mae 0.158027 -[2024/06/24 06:35:31] ppsci INFO: train: epoch 391 | step 38 | lr 0.000337 | loss 0.041223 | mae 0.166215 -[2024/06/24 06:35:31] ppsci INFO: epoch: 391, train_loss: 0.046819, train_metric: 0.154534, eval_loss: 0.067971, eval_mae: 0.175792 -[2024/06/24 06:35:31] ppsci INFO: train: epoch 392 | step 0 | lr 0.000337 | loss 0.034902 | mae 0.137576 -[2024/06/24 06:35:31] ppsci INFO: train: epoch 392 | step 10 | lr 0.000337 | loss 0.057243 | mae 0.160170 -[2024/06/24 06:35:32] ppsci INFO: train: epoch 392 | step 20 | lr 0.000337 | loss 0.036235 | mae 0.138920 -[2024/06/24 06:35:32] ppsci INFO: train: epoch 392 | step 30 | lr 0.000337 | loss 0.044713 | mae 0.155602 -[2024/06/24 06:35:33] ppsci INFO: train: epoch 392 | step 38 | lr 0.000337 | loss 0.029618 | mae 0.120569 -[2024/06/24 06:35:33] ppsci INFO: epoch: 392, train_loss: 0.047640, train_metric: 0.156463, eval_loss: 0.067192, eval_mae: 0.174322 -[2024/06/24 06:35:33] ppsci INFO: train: epoch 393 | step 0 | lr 0.000336 | loss 0.058641 | mae 0.172164 -[2024/06/24 06:35:33] ppsci INFO: train: epoch 393 | step 10 | lr 0.000336 | loss 0.047159 | mae 0.162651 -[2024/06/24 06:35:34] ppsci INFO: train: epoch 393 | step 20 | lr 0.000336 | loss 0.064719 | mae 0.169814 -[2024/06/24 06:35:34] ppsci INFO: train: epoch 393 | step 30 | lr 0.000336 | loss 0.036137 | mae 0.133246 -[2024/06/24 06:35:35] ppsci INFO: train: epoch 393 | step 38 | lr 0.000336 | loss 0.031984 | mae 0.127525 -[2024/06/24 06:35:35] ppsci INFO: epoch: 393, train_loss: 0.048976, train_metric: 0.159836, eval_loss: 0.064292, eval_mae: 0.173841 -[2024/06/24 06:35:35] ppsci INFO: train: epoch 394 | step 0 | lr 0.000335 | loss 0.039112 | mae 0.141490 -[2024/06/24 06:35:35] ppsci INFO: train: epoch 394 | step 10 | lr 0.000335 | loss 0.048681 | mae 0.153384 -[2024/06/24 06:35:36] ppsci INFO: train: epoch 394 | step 20 | lr 0.000335 | loss 0.043305 | mae 0.152733 -[2024/06/24 06:35:37] ppsci INFO: train: epoch 394 | step 30 | lr 0.000335 | loss 0.036307 | mae 0.151060 -[2024/06/24 06:35:37] ppsci INFO: train: epoch 394 | step 38 | lr 0.000335 | loss 0.037075 | mae 0.149677 -[2024/06/24 06:35:37] ppsci INFO: epoch: 394, train_loss: 0.051385, train_metric: 0.161438, eval_loss: 0.069205, eval_mae: 0.173045 -[2024/06/24 06:35:37] ppsci INFO: train: epoch 395 | step 0 | lr 0.000334 | loss 0.073319 | mae 0.174952 -[2024/06/24 06:35:38] ppsci INFO: train: epoch 395 | step 10 | lr 0.000334 | loss 0.056175 | mae 0.172307 -[2024/06/24 06:35:38] ppsci INFO: train: epoch 395 | step 20 | lr 0.000334 | loss 0.051477 | mae 0.169966 -[2024/06/24 06:35:39] ppsci INFO: train: epoch 395 | step 30 | lr 0.000334 | loss 0.047634 | mae 0.164199 -[2024/06/24 06:35:39] ppsci INFO: train: epoch 395 | step 38 | lr 0.000334 | loss 0.029690 | mae 0.130391 -[2024/06/24 06:35:39] ppsci INFO: epoch: 395, train_loss: 0.051266, train_metric: 0.158230, eval_loss: 0.063382, eval_mae: 0.167620 -[2024/06/24 06:35:39] ppsci INFO: train: epoch 396 | step 0 | lr 0.000334 | loss 0.062683 | mae 0.183561 -[2024/06/24 06:35:40] ppsci INFO: train: epoch 396 | step 10 | lr 0.000334 | loss 0.040216 | mae 0.152016 -[2024/06/24 06:35:40] ppsci INFO: train: epoch 396 | step 20 | lr 0.000334 | loss 0.055926 | mae 0.161936 -[2024/06/24 06:35:41] ppsci INFO: train: epoch 396 | step 30 | lr 0.000334 | loss 0.042806 | mae 0.150295 -[2024/06/24 06:35:41] ppsci INFO: train: epoch 396 | step 38 | lr 0.000334 | loss 0.026961 | mae 0.125763 -[2024/06/24 06:35:41] ppsci INFO: epoch: 396, train_loss: 0.045833, train_metric: 0.155380, eval_loss: 0.067755, eval_mae: 0.172748 -[2024/06/24 06:35:41] ppsci INFO: train: epoch 397 | step 0 | lr 0.000333 | loss 0.055996 | mae 0.167526 -[2024/06/24 06:35:42] ppsci INFO: train: epoch 397 | step 10 | lr 0.000333 | loss 0.054802 | mae 0.168167 -[2024/06/24 06:35:42] ppsci INFO: train: epoch 397 | step 20 | lr 0.000333 | loss 0.039672 | mae 0.150215 -[2024/06/24 06:35:43] ppsci INFO: train: epoch 397 | step 30 | lr 0.000333 | loss 0.168724 | mae 0.186419 -[2024/06/24 06:35:43] ppsci INFO: train: epoch 397 | step 38 | lr 0.000333 | loss 0.023536 | mae 0.122477 -[2024/06/24 06:35:43] ppsci INFO: epoch: 397, train_loss: 0.050850, train_metric: 0.158491, eval_loss: 0.067856, eval_mae: 0.173473 -[2024/06/24 06:35:43] ppsci INFO: train: epoch 398 | step 0 | lr 0.000332 | loss 0.032108 | mae 0.136477 -[2024/06/24 06:35:44] ppsci INFO: train: epoch 398 | step 10 | lr 0.000332 | loss 0.044586 | mae 0.150076 -[2024/06/24 06:35:44] ppsci INFO: train: epoch 398 | step 20 | lr 0.000332 | loss 0.051919 | mae 0.148642 -[2024/06/24 06:35:45] ppsci INFO: train: epoch 398 | step 30 | lr 0.000332 | loss 0.051178 | mae 0.170766 -[2024/06/24 06:35:45] ppsci INFO: train: epoch 398 | step 38 | lr 0.000332 | loss 0.035218 | mae 0.140278 -[2024/06/24 06:35:46] ppsci INFO: epoch: 398, train_loss: 0.045316, train_metric: 0.153035, eval_loss: 0.068698, eval_mae: 0.169013 -[2024/06/24 06:35:46] ppsci INFO: train: epoch 399 | step 0 | lr 0.000331 | loss 0.046915 | mae 0.162745 -[2024/06/24 06:35:46] ppsci INFO: train: epoch 399 | step 10 | lr 0.000331 | loss 0.138778 | mae 0.193352 -[2024/06/24 06:35:47] ppsci INFO: train: epoch 399 | step 20 | lr 0.000331 | loss 0.043638 | mae 0.153866 -[2024/06/24 06:35:47] ppsci INFO: train: epoch 399 | step 30 | lr 0.000331 | loss 0.042240 | mae 0.149297 -[2024/06/24 06:35:48] ppsci INFO: train: epoch 399 | step 38 | lr 0.000331 | loss 0.044663 | mae 0.175954 -[2024/06/24 06:35:48] ppsci INFO: epoch: 399, train_loss: 0.049829, train_metric: 0.156078, eval_loss: 0.067249, eval_mae: 0.173022 -[2024/06/24 06:35:48] ppsci INFO: train: epoch 400 | step 0 | lr 0.000331 | loss 0.058055 | mae 0.160097 -[2024/06/24 06:35:48] ppsci INFO: train: epoch 400 | step 10 | lr 0.000331 | loss 0.038837 | mae 0.151623 -[2024/06/24 06:35:49] ppsci INFO: train: epoch 400 | step 20 | lr 0.000331 | loss 0.058272 | mae 0.171911 -[2024/06/24 06:35:49] ppsci INFO: train: epoch 400 | step 30 | lr 0.000331 | loss 0.042332 | mae 0.159392 -[2024/06/24 06:35:50] ppsci INFO: train: epoch 400 | step 38 | lr 0.000331 | loss 0.030784 | mae 0.140639 -[2024/06/24 06:35:50] ppsci INFO: epoch: 400, train_loss: 0.048766, train_metric: 0.158411, eval_loss: 0.069962, eval_mae: 0.176390 -[2024/06/24 06:35:50] ppsci INFO: train: epoch 401 | step 0 | lr 0.000330 | loss 0.048511 | mae 0.166465 -[2024/06/24 06:35:50] ppsci INFO: train: epoch 401 | step 10 | lr 0.000330 | loss 0.047026 | mae 0.157917 -[2024/06/24 06:35:51] ppsci INFO: train: epoch 401 | step 20 | lr 0.000330 | loss 0.038337 | mae 0.146001 -[2024/06/24 06:35:52] ppsci INFO: train: epoch 401 | step 30 | lr 0.000330 | loss 0.054316 | mae 0.171459 -[2024/06/24 06:35:52] ppsci INFO: train: epoch 401 | step 38 | lr 0.000330 | loss 0.024869 | mae 0.132698 -[2024/06/24 06:35:52] ppsci INFO: epoch: 401, train_loss: 0.050535, train_metric: 0.156293, eval_loss: 0.066827, eval_mae: 0.172004 -[2024/06/24 06:35:52] ppsci INFO: train: epoch 402 | step 0 | lr 0.000329 | loss 0.049068 | mae 0.167669 -[2024/06/24 06:35:53] ppsci INFO: train: epoch 402 | step 10 | lr 0.000329 | loss 0.058344 | mae 0.170002 -[2024/06/24 06:35:53] ppsci INFO: train: epoch 402 | step 20 | lr 0.000329 | loss 0.062509 | mae 0.155767 -[2024/06/24 06:35:54] ppsci INFO: train: epoch 402 | step 30 | lr 0.000329 | loss 0.040853 | mae 0.151263 -[2024/06/24 06:35:54] ppsci INFO: train: epoch 402 | step 38 | lr 0.000329 | loss 0.047185 | mae 0.174445 -[2024/06/24 06:35:54] ppsci INFO: epoch: 402, train_loss: 0.048821, train_metric: 0.158931, eval_loss: 0.066471, eval_mae: 0.176557 -[2024/06/24 06:35:54] ppsci INFO: train: epoch 403 | step 0 | lr 0.000329 | loss 0.055020 | mae 0.160838 -[2024/06/24 06:35:55] ppsci INFO: train: epoch 403 | step 10 | lr 0.000329 | loss 0.062729 | mae 0.181728 -[2024/06/24 06:35:56] ppsci INFO: train: epoch 403 | step 20 | lr 0.000329 | loss 0.054041 | mae 0.167879 -[2024/06/24 06:35:56] ppsci INFO: train: epoch 403 | step 30 | lr 0.000329 | loss 0.055246 | mae 0.161491 -[2024/06/24 06:35:57] ppsci INFO: train: epoch 403 | step 38 | lr 0.000329 | loss 0.036607 | mae 0.166476 -[2024/06/24 06:35:57] ppsci INFO: epoch: 403, train_loss: 0.044722, train_metric: 0.153701, eval_loss: 0.065777, eval_mae: 0.171259 -[2024/06/24 06:35:57] ppsci INFO: train: epoch 404 | step 0 | lr 0.000328 | loss 0.050847 | mae 0.157022 -[2024/06/24 06:35:57] ppsci INFO: train: epoch 404 | step 10 | lr 0.000328 | loss 0.051345 | mae 0.162538 -[2024/06/24 06:35:58] ppsci INFO: train: epoch 404 | step 20 | lr 0.000328 | loss 0.053096 | mae 0.159633 -[2024/06/24 06:35:58] ppsci INFO: train: epoch 404 | step 30 | lr 0.000328 | loss 0.045066 | mae 0.158700 -[2024/06/24 06:35:59] ppsci INFO: train: epoch 404 | step 38 | lr 0.000328 | loss 0.067116 | mae 0.203692 -[2024/06/24 06:35:59] ppsci INFO: epoch: 404, train_loss: 0.045988, train_metric: 0.154014, eval_loss: 0.063392, eval_mae: 0.167749 -[2024/06/24 06:35:59] ppsci INFO: train: epoch 405 | step 0 | lr 0.000327 | loss 0.052094 | mae 0.163341 -[2024/06/24 06:35:59] ppsci INFO: train: epoch 405 | step 10 | lr 0.000327 | loss 0.047485 | mae 0.158515 -[2024/06/24 06:36:00] ppsci INFO: train: epoch 405 | step 20 | lr 0.000327 | loss 0.037027 | mae 0.140352 -[2024/06/24 06:36:00] ppsci INFO: train: epoch 405 | step 30 | lr 0.000327 | loss 0.050141 | mae 0.166014 -[2024/06/24 06:36:01] ppsci INFO: train: epoch 405 | step 38 | lr 0.000327 | loss 0.039701 | mae 0.156915 -[2024/06/24 06:36:01] ppsci INFO: epoch: 405, train_loss: 0.045702, train_metric: 0.155173, eval_loss: 0.068269, eval_mae: 0.169467 -[2024/06/24 06:36:01] ppsci INFO: train: epoch 406 | step 0 | lr 0.000326 | loss 0.043553 | mae 0.150278 -[2024/06/24 06:36:02] ppsci INFO: train: epoch 406 | step 10 | lr 0.000326 | loss 0.057845 | mae 0.168404 -[2024/06/24 06:36:02] ppsci INFO: train: epoch 406 | step 20 | lr 0.000326 | loss 0.049659 | mae 0.162490 -[2024/06/24 06:36:03] ppsci INFO: train: epoch 406 | step 30 | lr 0.000326 | loss 0.051640 | mae 0.161300 -[2024/06/24 06:36:03] ppsci INFO: train: epoch 406 | step 38 | lr 0.000326 | loss 0.082888 | mae 0.167260 -[2024/06/24 06:36:03] ppsci INFO: epoch: 406, train_loss: 0.048890, train_metric: 0.157896, eval_loss: 0.065923, eval_mae: 0.172030 -[2024/06/24 06:36:03] ppsci INFO: train: epoch 407 | step 0 | lr 0.000326 | loss 0.063213 | mae 0.168328 -[2024/06/24 06:36:04] ppsci INFO: train: epoch 407 | step 10 | lr 0.000326 | loss 0.033866 | mae 0.140709 -[2024/06/24 06:36:04] ppsci INFO: train: epoch 407 | step 20 | lr 0.000326 | loss 0.034747 | mae 0.143893 -[2024/06/24 06:36:05] ppsci INFO: train: epoch 407 | step 30 | lr 0.000326 | loss 0.041030 | mae 0.149370 -[2024/06/24 06:36:05] ppsci INFO: train: epoch 407 | step 38 | lr 0.000326 | loss 0.050010 | mae 0.193381 -[2024/06/24 06:36:05] ppsci INFO: epoch: 407, train_loss: 0.045560, train_metric: 0.152677, eval_loss: 0.059544, eval_mae: 0.164938 -[2024/06/24 06:36:05] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:36:05] ppsci INFO: train: epoch 408 | step 0 | lr 0.000325 | loss 0.047471 | mae 0.145148 -[2024/06/24 06:36:06] ppsci INFO: train: epoch 408 | step 10 | lr 0.000325 | loss 0.042683 | mae 0.155052 -[2024/06/24 06:36:06] ppsci INFO: train: epoch 408 | step 20 | lr 0.000325 | loss 0.046821 | mae 0.163573 -[2024/06/24 06:36:07] ppsci INFO: train: epoch 408 | step 30 | lr 0.000325 | loss 0.048662 | mae 0.158439 -[2024/06/24 06:36:07] ppsci INFO: train: epoch 408 | step 38 | lr 0.000325 | loss 0.042097 | mae 0.170478 -[2024/06/24 06:36:08] ppsci INFO: epoch: 408, train_loss: 0.050787, train_metric: 0.156303, eval_loss: 0.065138, eval_mae: 0.173803 -[2024/06/24 06:36:08] ppsci INFO: train: epoch 409 | step 0 | lr 0.000324 | loss 0.044116 | mae 0.140903 -[2024/06/24 06:36:08] ppsci INFO: train: epoch 409 | step 10 | lr 0.000324 | loss 0.053457 | mae 0.175690 -[2024/06/24 06:36:09] ppsci INFO: train: epoch 409 | step 20 | lr 0.000324 | loss 0.050868 | mae 0.160450 -[2024/06/24 06:36:09] ppsci INFO: train: epoch 409 | step 30 | lr 0.000324 | loss 0.043150 | mae 0.159140 -[2024/06/24 06:36:10] ppsci INFO: train: epoch 409 | step 38 | lr 0.000324 | loss 0.030126 | mae 0.129400 -[2024/06/24 06:36:10] ppsci INFO: epoch: 409, train_loss: 0.049629, train_metric: 0.158668, eval_loss: 0.062108, eval_mae: 0.166807 -[2024/06/24 06:36:10] ppsci INFO: train: epoch 410 | step 0 | lr 0.000323 | loss 0.045092 | mae 0.152700 -[2024/06/24 06:36:10] ppsci INFO: train: epoch 410 | step 10 | lr 0.000323 | loss 0.065850 | mae 0.151675 -[2024/06/24 06:36:11] ppsci INFO: train: epoch 410 | step 20 | lr 0.000323 | loss 0.037163 | mae 0.142213 -[2024/06/24 06:36:11] ppsci INFO: train: epoch 410 | step 30 | lr 0.000323 | loss 0.036411 | mae 0.142116 -[2024/06/24 06:36:12] ppsci INFO: train: epoch 410 | step 38 | lr 0.000323 | loss 0.074560 | mae 0.199382 -[2024/06/24 06:36:12] ppsci INFO: epoch: 410, train_loss: 0.048397, train_metric: 0.153522, eval_loss: 0.067093, eval_mae: 0.170311 -[2024/06/24 06:36:12] ppsci INFO: train: epoch 411 | step 0 | lr 0.000323 | loss 0.038600 | mae 0.143637 -[2024/06/24 06:36:13] ppsci INFO: train: epoch 411 | step 10 | lr 0.000323 | loss 0.048439 | mae 0.159353 -[2024/06/24 06:36:13] ppsci INFO: train: epoch 411 | step 20 | lr 0.000323 | loss 0.197673 | mae 0.189287 -[2024/06/24 06:36:14] ppsci INFO: train: epoch 411 | step 30 | lr 0.000323 | loss 0.032241 | mae 0.127887 -[2024/06/24 06:36:14] ppsci INFO: train: epoch 411 | step 38 | lr 0.000323 | loss 0.027281 | mae 0.123769 -[2024/06/24 06:36:14] ppsci INFO: epoch: 411, train_loss: 0.054035, train_metric: 0.158779, eval_loss: 0.061946, eval_mae: 0.166257 -[2024/06/24 06:36:14] ppsci INFO: train: epoch 412 | step 0 | lr 0.000322 | loss 0.037840 | mae 0.146609 -[2024/06/24 06:36:15] ppsci INFO: train: epoch 412 | step 10 | lr 0.000322 | loss 0.034745 | mae 0.141116 -[2024/06/24 06:36:15] ppsci INFO: train: epoch 412 | step 20 | lr 0.000322 | loss 0.047730 | mae 0.165028 -[2024/06/24 06:36:16] ppsci INFO: train: epoch 412 | step 30 | lr 0.000322 | loss 0.045071 | mae 0.159379 -[2024/06/24 06:36:16] ppsci INFO: train: epoch 412 | step 38 | lr 0.000322 | loss 0.051929 | mae 0.201157 -[2024/06/24 06:36:17] ppsci INFO: epoch: 412, train_loss: 0.048402, train_metric: 0.154252, eval_loss: 0.063888, eval_mae: 0.164858 -[2024/06/24 06:36:17] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:36:17] ppsci INFO: train: epoch 413 | step 0 | lr 0.000321 | loss 0.035915 | mae 0.145339 -[2024/06/24 06:36:17] ppsci INFO: train: epoch 413 | step 10 | lr 0.000321 | loss 0.041147 | mae 0.146042 -[2024/06/24 06:36:18] ppsci INFO: train: epoch 413 | step 20 | lr 0.000321 | loss 0.040926 | mae 0.152308 -[2024/06/24 06:36:18] ppsci INFO: train: epoch 413 | step 30 | lr 0.000321 | loss 0.048291 | mae 0.158367 -[2024/06/24 06:36:19] ppsci INFO: train: epoch 413 | step 38 | lr 0.000321 | loss 0.141989 | mae 0.288543 -[2024/06/24 06:36:19] ppsci INFO: epoch: 413, train_loss: 0.049917, train_metric: 0.156385, eval_loss: 0.060941, eval_mae: 0.169975 -[2024/06/24 06:36:19] ppsci INFO: train: epoch 414 | step 0 | lr 0.000320 | loss 0.034346 | mae 0.137528 -[2024/06/24 06:36:19] ppsci INFO: train: epoch 414 | step 10 | lr 0.000320 | loss 0.049858 | mae 0.165166 -[2024/06/24 06:36:20] ppsci INFO: train: epoch 414 | step 20 | lr 0.000320 | loss 0.041864 | mae 0.151806 -[2024/06/24 06:36:20] ppsci INFO: train: epoch 414 | step 30 | lr 0.000320 | loss 0.036531 | mae 0.147497 -[2024/06/24 06:36:21] ppsci INFO: train: epoch 414 | step 38 | lr 0.000320 | loss 0.036269 | mae 0.137455 -[2024/06/24 06:36:21] ppsci INFO: epoch: 414, train_loss: 0.044167, train_metric: 0.151609, eval_loss: 0.067571, eval_mae: 0.176615 -[2024/06/24 06:36:21] ppsci INFO: train: epoch 415 | step 0 | lr 0.000320 | loss 0.053518 | mae 0.178000 -[2024/06/24 06:36:21] ppsci INFO: train: epoch 415 | step 10 | lr 0.000320 | loss 0.047243 | mae 0.156390 -[2024/06/24 06:36:22] ppsci INFO: train: epoch 415 | step 20 | lr 0.000320 | loss 0.043161 | mae 0.150276 -[2024/06/24 06:36:23] ppsci INFO: train: epoch 415 | step 30 | lr 0.000320 | loss 0.042538 | mae 0.152653 -[2024/06/24 06:36:23] ppsci INFO: train: epoch 415 | step 38 | lr 0.000320 | loss 0.042245 | mae 0.140795 -[2024/06/24 06:36:23] ppsci INFO: epoch: 415, train_loss: 0.045903, train_metric: 0.155569, eval_loss: 0.068579, eval_mae: 0.172075 -[2024/06/24 06:36:23] ppsci INFO: train: epoch 416 | step 0 | lr 0.000319 | loss 0.057494 | mae 0.163283 -[2024/06/24 06:36:24] ppsci INFO: train: epoch 416 | step 10 | lr 0.000319 | loss 0.037190 | mae 0.146062 -[2024/06/24 06:36:24] ppsci INFO: train: epoch 416 | step 20 | lr 0.000319 | loss 0.057567 | mae 0.175945 -[2024/06/24 06:36:25] ppsci INFO: train: epoch 416 | step 30 | lr 0.000319 | loss 0.046952 | mae 0.154690 -[2024/06/24 06:36:25] ppsci INFO: train: epoch 416 | step 38 | lr 0.000319 | loss 0.097425 | mae 0.205030 -[2024/06/24 06:36:25] ppsci INFO: epoch: 416, train_loss: 0.049439, train_metric: 0.156428, eval_loss: 0.060578, eval_mae: 0.165706 -[2024/06/24 06:36:25] ppsci INFO: train: epoch 417 | step 0 | lr 0.000318 | loss 0.061464 | mae 0.175979 -[2024/06/24 06:36:26] ppsci INFO: train: epoch 417 | step 10 | lr 0.000318 | loss 0.054309 | mae 0.174142 -[2024/06/24 06:36:26] ppsci INFO: train: epoch 417 | step 20 | lr 0.000318 | loss 0.059304 | mae 0.162850 -[2024/06/24 06:36:27] ppsci INFO: train: epoch 417 | step 30 | lr 0.000318 | loss 0.025395 | mae 0.114356 -[2024/06/24 06:36:27] ppsci INFO: train: epoch 417 | step 38 | lr 0.000318 | loss 0.023605 | mae 0.132702 -[2024/06/24 06:36:27] ppsci INFO: epoch: 417, train_loss: 0.046943, train_metric: 0.156144, eval_loss: 0.067126, eval_mae: 0.168480 -[2024/06/24 06:36:28] ppsci INFO: train: epoch 418 | step 0 | lr 0.000317 | loss 0.043246 | mae 0.155384 -[2024/06/24 06:36:28] ppsci INFO: train: epoch 418 | step 10 | lr 0.000317 | loss 0.058526 | mae 0.172139 -[2024/06/24 06:36:29] ppsci INFO: train: epoch 418 | step 20 | lr 0.000317 | loss 0.044048 | mae 0.152346 -[2024/06/24 06:36:29] ppsci INFO: train: epoch 418 | step 30 | lr 0.000317 | loss 0.049135 | mae 0.158987 -[2024/06/24 06:36:29] ppsci INFO: train: epoch 418 | step 38 | lr 0.000317 | loss 0.099231 | mae 0.191680 -[2024/06/24 06:36:30] ppsci INFO: epoch: 418, train_loss: 0.049544, train_metric: 0.159250, eval_loss: 0.074765, eval_mae: 0.176808 -[2024/06/24 06:36:30] ppsci INFO: train: epoch 419 | step 0 | lr 0.000317 | loss 0.049520 | mae 0.161881 -[2024/06/24 06:36:30] ppsci INFO: train: epoch 419 | step 10 | lr 0.000317 | loss 0.038093 | mae 0.148665 -[2024/06/24 06:36:31] ppsci INFO: train: epoch 419 | step 20 | lr 0.000317 | loss 0.036019 | mae 0.138141 -[2024/06/24 06:36:31] ppsci INFO: train: epoch 419 | step 30 | lr 0.000317 | loss 0.044585 | mae 0.160500 -[2024/06/24 06:36:32] ppsci INFO: train: epoch 419 | step 38 | lr 0.000317 | loss 0.025981 | mae 0.127997 -[2024/06/24 06:36:32] ppsci INFO: epoch: 419, train_loss: 0.051188, train_metric: 0.159459, eval_loss: 0.068131, eval_mae: 0.170836 -[2024/06/24 06:36:32] ppsci INFO: train: epoch 420 | step 0 | lr 0.000316 | loss 0.043636 | mae 0.147549 -[2024/06/24 06:36:32] ppsci INFO: train: epoch 420 | step 10 | lr 0.000316 | loss 0.044237 | mae 0.151181 -[2024/06/24 06:36:33] ppsci INFO: train: epoch 420 | step 20 | lr 0.000316 | loss 0.044983 | mae 0.158829 -[2024/06/24 06:36:33] ppsci INFO: train: epoch 420 | step 30 | lr 0.000316 | loss 0.037114 | mae 0.144527 -[2024/06/24 06:36:34] ppsci INFO: train: epoch 420 | step 38 | lr 0.000316 | loss 0.063446 | mae 0.201042 -[2024/06/24 06:36:34] ppsci INFO: epoch: 420, train_loss: 0.047618, train_metric: 0.154667, eval_loss: 0.068692, eval_mae: 0.171600 -[2024/06/24 06:36:34] ppsci INFO: train: epoch 421 | step 0 | lr 0.000315 | loss 0.039802 | mae 0.144546 -[2024/06/24 06:36:34] ppsci INFO: train: epoch 421 | step 10 | lr 0.000315 | loss 0.038510 | mae 0.139576 -[2024/06/24 06:36:35] ppsci INFO: train: epoch 421 | step 20 | lr 0.000315 | loss 0.037433 | mae 0.149481 -[2024/06/24 06:36:36] ppsci INFO: train: epoch 421 | step 30 | lr 0.000315 | loss 0.024267 | mae 0.124354 -[2024/06/24 06:36:36] ppsci INFO: train: epoch 421 | step 38 | lr 0.000315 | loss 0.029676 | mae 0.121357 -[2024/06/24 06:36:36] ppsci INFO: epoch: 421, train_loss: 0.044126, train_metric: 0.152124, eval_loss: 0.062685, eval_mae: 0.164631 -[2024/06/24 06:36:36] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:36:36] ppsci INFO: train: epoch 422 | step 0 | lr 0.000314 | loss 0.036318 | mae 0.142933 -[2024/06/24 06:36:37] ppsci INFO: train: epoch 422 | step 10 | lr 0.000314 | loss 0.076137 | mae 0.189407 -[2024/06/24 06:36:37] ppsci INFO: train: epoch 422 | step 20 | lr 0.000314 | loss 0.042688 | mae 0.150140 -[2024/06/24 06:36:38] ppsci INFO: train: epoch 422 | step 30 | lr 0.000314 | loss 0.087971 | mae 0.195287 -[2024/06/24 06:36:38] ppsci INFO: train: epoch 422 | step 38 | lr 0.000314 | loss 0.034736 | mae 0.136907 -[2024/06/24 06:36:38] ppsci INFO: epoch: 422, train_loss: 0.047892, train_metric: 0.154757, eval_loss: 0.061303, eval_mae: 0.167873 -[2024/06/24 06:36:38] ppsci INFO: train: epoch 423 | step 0 | lr 0.000314 | loss 0.059946 | mae 0.170706 -[2024/06/24 06:36:39] ppsci INFO: train: epoch 423 | step 10 | lr 0.000314 | loss 0.049346 | mae 0.157728 -[2024/06/24 06:36:39] ppsci INFO: train: epoch 423 | step 20 | lr 0.000314 | loss 0.064263 | mae 0.185478 -[2024/06/24 06:36:40] ppsci INFO: train: epoch 423 | step 30 | lr 0.000314 | loss 0.052542 | mae 0.166327 -[2024/06/24 06:36:40] ppsci INFO: train: epoch 423 | step 38 | lr 0.000314 | loss 0.015957 | mae 0.105628 -[2024/06/24 06:36:41] ppsci INFO: epoch: 423, train_loss: 0.045776, train_metric: 0.154915, eval_loss: 0.066532, eval_mae: 0.170468 -[2024/06/24 06:36:41] ppsci INFO: train: epoch 424 | step 0 | lr 0.000313 | loss 0.043125 | mae 0.161162 -[2024/06/24 06:36:41] ppsci INFO: train: epoch 424 | step 10 | lr 0.000313 | loss 0.034345 | mae 0.143276 -[2024/06/24 06:36:42] ppsci INFO: train: epoch 424 | step 20 | lr 0.000313 | loss 0.042839 | mae 0.156829 -[2024/06/24 06:36:42] ppsci INFO: train: epoch 424 | step 30 | lr 0.000313 | loss 0.044692 | mae 0.145213 -[2024/06/24 06:36:43] ppsci INFO: train: epoch 424 | step 38 | lr 0.000313 | loss 0.039214 | mae 0.149132 -[2024/06/24 06:36:43] ppsci INFO: epoch: 424, train_loss: 0.043954, train_metric: 0.151777, eval_loss: 0.067621, eval_mae: 0.169633 -[2024/06/24 06:36:43] ppsci INFO: train: epoch 425 | step 0 | lr 0.000312 | loss 0.030895 | mae 0.134278 -[2024/06/24 06:36:43] ppsci INFO: train: epoch 425 | step 10 | lr 0.000312 | loss 0.039874 | mae 0.147957 -[2024/06/24 06:36:44] ppsci INFO: train: epoch 425 | step 20 | lr 0.000312 | loss 0.042515 | mae 0.154473 -[2024/06/24 06:36:44] ppsci INFO: train: epoch 425 | step 30 | lr 0.000312 | loss 0.041897 | mae 0.146873 -[2024/06/24 06:36:45] ppsci INFO: train: epoch 425 | step 38 | lr 0.000312 | loss 0.019706 | mae 0.103166 -[2024/06/24 06:36:45] ppsci INFO: epoch: 425, train_loss: 0.042261, train_metric: 0.150316, eval_loss: 0.069587, eval_mae: 0.169627 -[2024/06/24 06:36:45] ppsci INFO: train: epoch 426 | step 0 | lr 0.000311 | loss 0.034093 | mae 0.140417 -[2024/06/24 06:36:45] ppsci INFO: train: epoch 426 | step 10 | lr 0.000311 | loss 0.043884 | mae 0.154632 -[2024/06/24 06:36:46] ppsci INFO: train: epoch 426 | step 20 | lr 0.000311 | loss 0.054245 | mae 0.170741 -[2024/06/24 06:36:46] ppsci INFO: train: epoch 426 | step 30 | lr 0.000311 | loss 0.061432 | mae 0.175549 -[2024/06/24 06:36:47] ppsci INFO: train: epoch 426 | step 38 | lr 0.000311 | loss 0.016186 | mae 0.114345 -[2024/06/24 06:36:47] ppsci INFO: epoch: 426, train_loss: 0.045496, train_metric: 0.153253, eval_loss: 0.067055, eval_mae: 0.170204 -[2024/06/24 06:36:47] ppsci INFO: train: epoch 427 | step 0 | lr 0.000311 | loss 0.047513 | mae 0.153739 -[2024/06/24 06:36:48] ppsci INFO: train: epoch 427 | step 10 | lr 0.000311 | loss 0.031210 | mae 0.136043 -[2024/06/24 06:36:48] ppsci INFO: train: epoch 427 | step 20 | lr 0.000311 | loss 0.039161 | mae 0.144723 -[2024/06/24 06:36:49] ppsci INFO: train: epoch 427 | step 30 | lr 0.000311 | loss 0.042439 | mae 0.143883 -[2024/06/24 06:36:49] ppsci INFO: train: epoch 427 | step 38 | lr 0.000311 | loss 0.026757 | mae 0.133466 -[2024/06/24 06:36:49] ppsci INFO: epoch: 427, train_loss: 0.044892, train_metric: 0.151407, eval_loss: 0.062959, eval_mae: 0.163175 -[2024/06/24 06:36:49] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:36:49] ppsci INFO: train: epoch 428 | step 0 | lr 0.000310 | loss 0.062148 | mae 0.167758 -[2024/06/24 06:36:50] ppsci INFO: train: epoch 428 | step 10 | lr 0.000310 | loss 0.043361 | mae 0.153290 -[2024/06/24 06:36:50] ppsci INFO: train: epoch 428 | step 20 | lr 0.000310 | loss 0.049503 | mae 0.158376 -[2024/06/24 06:36:51] ppsci INFO: train: epoch 428 | step 30 | lr 0.000310 | loss 0.062330 | mae 0.175401 -[2024/06/24 06:36:51] ppsci INFO: train: epoch 428 | step 38 | lr 0.000310 | loss 0.051245 | mae 0.151833 -[2024/06/24 06:36:51] ppsci INFO: epoch: 428, train_loss: 0.044521, train_metric: 0.152124, eval_loss: 0.063703, eval_mae: 0.168169 -[2024/06/24 06:36:51] ppsci INFO: train: epoch 429 | step 0 | lr 0.000309 | loss 0.047043 | mae 0.151617 -[2024/06/24 06:36:52] ppsci INFO: train: epoch 429 | step 10 | lr 0.000309 | loss 0.043666 | mae 0.149967 -[2024/06/24 06:36:52] ppsci INFO: train: epoch 429 | step 20 | lr 0.000309 | loss 0.046962 | mae 0.162271 -[2024/06/24 06:36:53] ppsci INFO: train: epoch 429 | step 30 | lr 0.000309 | loss 0.036936 | mae 0.140003 -[2024/06/24 06:36:53] ppsci INFO: train: epoch 429 | step 38 | lr 0.000309 | loss 0.025158 | mae 0.122554 -[2024/06/24 06:36:53] ppsci INFO: epoch: 429, train_loss: 0.045436, train_metric: 0.152406, eval_loss: 0.064525, eval_mae: 0.166515 -[2024/06/24 06:36:54] ppsci INFO: train: epoch 430 | step 0 | lr 0.000308 | loss 0.033445 | mae 0.138777 -[2024/06/24 06:36:54] ppsci INFO: train: epoch 430 | step 10 | lr 0.000308 | loss 0.059298 | mae 0.165768 -[2024/06/24 06:36:55] ppsci INFO: train: epoch 430 | step 20 | lr 0.000308 | loss 0.053335 | mae 0.150542 -[2024/06/24 06:36:55] ppsci INFO: train: epoch 430 | step 30 | lr 0.000308 | loss 0.057213 | mae 0.172679 -[2024/06/24 06:36:56] ppsci INFO: train: epoch 430 | step 38 | lr 0.000308 | loss 0.040727 | mae 0.144059 -[2024/06/24 06:36:56] ppsci INFO: epoch: 430, train_loss: 0.044239, train_metric: 0.152415, eval_loss: 0.067083, eval_mae: 0.170117 -[2024/06/24 06:36:56] ppsci INFO: train: epoch 431 | step 0 | lr 0.000308 | loss 0.039206 | mae 0.145410 -[2024/06/24 06:36:56] ppsci INFO: train: epoch 431 | step 10 | lr 0.000308 | loss 0.031033 | mae 0.129234 -[2024/06/24 06:36:57] ppsci INFO: train: epoch 431 | step 20 | lr 0.000308 | loss 0.048549 | mae 0.159446 -[2024/06/24 06:36:57] ppsci INFO: train: epoch 431 | step 30 | lr 0.000308 | loss 0.054156 | mae 0.162278 -[2024/06/24 06:36:58] ppsci INFO: train: epoch 431 | step 38 | lr 0.000308 | loss 0.055811 | mae 0.172265 -[2024/06/24 06:36:58] ppsci INFO: epoch: 431, train_loss: 0.045974, train_metric: 0.151222, eval_loss: 0.070172, eval_mae: 0.177835 -[2024/06/24 06:36:58] ppsci INFO: train: epoch 432 | step 0 | lr 0.000307 | loss 0.042276 | mae 0.151568 -[2024/06/24 06:36:59] ppsci INFO: train: epoch 432 | step 10 | lr 0.000307 | loss 0.061992 | mae 0.177289 -[2024/06/24 06:36:59] ppsci INFO: train: epoch 432 | step 20 | lr 0.000307 | loss 0.044163 | mae 0.146611 -[2024/06/24 06:37:00] ppsci INFO: train: epoch 432 | step 30 | lr 0.000307 | loss 0.054910 | mae 0.166778 -[2024/06/24 06:37:00] ppsci INFO: train: epoch 432 | step 38 | lr 0.000307 | loss 0.120133 | mae 0.235444 -[2024/06/24 06:37:00] ppsci INFO: epoch: 432, train_loss: 0.048682, train_metric: 0.153325, eval_loss: 0.065079, eval_mae: 0.168401 -[2024/06/24 06:37:00] ppsci INFO: train: epoch 433 | step 0 | lr 0.000306 | loss 0.041303 | mae 0.148636 -[2024/06/24 06:37:01] ppsci INFO: train: epoch 433 | step 10 | lr 0.000306 | loss 0.063416 | mae 0.178239 -[2024/06/24 06:37:01] ppsci INFO: train: epoch 433 | step 20 | lr 0.000306 | loss 0.036497 | mae 0.145578 -[2024/06/24 06:37:02] ppsci INFO: train: epoch 433 | step 30 | lr 0.000306 | loss 0.059391 | mae 0.166001 -[2024/06/24 06:37:02] ppsci INFO: train: epoch 433 | step 38 | lr 0.000306 | loss 0.136266 | mae 0.216714 -[2024/06/24 06:37:02] ppsci INFO: epoch: 433, train_loss: 0.046813, train_metric: 0.149944, eval_loss: 0.070718, eval_mae: 0.173106 -[2024/06/24 06:37:02] ppsci INFO: train: epoch 434 | step 0 | lr 0.000305 | loss 0.048155 | mae 0.164961 -[2024/06/24 06:37:03] ppsci INFO: train: epoch 434 | step 10 | lr 0.000305 | loss 0.027309 | mae 0.127754 -[2024/06/24 06:37:03] ppsci INFO: train: epoch 434 | step 20 | lr 0.000305 | loss 0.039715 | mae 0.147275 -[2024/06/24 06:37:04] ppsci INFO: train: epoch 434 | step 30 | lr 0.000305 | loss 0.035628 | mae 0.136044 -[2024/06/24 06:37:04] ppsci INFO: train: epoch 434 | step 38 | lr 0.000305 | loss 0.078716 | mae 0.218989 -[2024/06/24 06:37:04] ppsci INFO: epoch: 434, train_loss: 0.044021, train_metric: 0.151566, eval_loss: 0.064467, eval_mae: 0.173688 -[2024/06/24 06:37:04] ppsci INFO: train: epoch 435 | step 0 | lr 0.000305 | loss 0.032873 | mae 0.141335 -[2024/06/24 06:37:05] ppsci INFO: train: epoch 435 | step 10 | lr 0.000305 | loss 0.040455 | mae 0.148639 -[2024/06/24 06:37:05] ppsci INFO: train: epoch 435 | step 20 | lr 0.000305 | loss 0.043583 | mae 0.147998 -[2024/06/24 06:37:06] ppsci INFO: train: epoch 435 | step 30 | lr 0.000305 | loss 0.041627 | mae 0.142387 -[2024/06/24 06:37:06] ppsci INFO: train: epoch 435 | step 38 | lr 0.000305 | loss 0.032959 | mae 0.154284 -[2024/06/24 06:37:06] ppsci INFO: epoch: 435, train_loss: 0.041219, train_metric: 0.149220, eval_loss: 0.061741, eval_mae: 0.167074 -[2024/06/24 06:37:06] ppsci INFO: train: epoch 436 | step 0 | lr 0.000304 | loss 0.041873 | mae 0.141858 -[2024/06/24 06:37:07] ppsci INFO: train: epoch 436 | step 10 | lr 0.000304 | loss 0.041371 | mae 0.154014 -[2024/06/24 06:37:07] ppsci INFO: train: epoch 436 | step 20 | lr 0.000304 | loss 0.045411 | mae 0.159755 -[2024/06/24 06:37:08] ppsci INFO: train: epoch 436 | step 30 | lr 0.000304 | loss 0.055143 | mae 0.164019 -[2024/06/24 06:37:08] ppsci INFO: train: epoch 436 | step 38 | lr 0.000304 | loss 0.084559 | mae 0.236165 -[2024/06/24 06:37:08] ppsci INFO: epoch: 436, train_loss: 0.044436, train_metric: 0.151466, eval_loss: 0.062444, eval_mae: 0.167856 -[2024/06/24 06:37:09] ppsci INFO: train: epoch 437 | step 0 | lr 0.000303 | loss 0.035594 | mae 0.141280 -[2024/06/24 06:37:09] ppsci INFO: train: epoch 437 | step 10 | lr 0.000303 | loss 0.032077 | mae 0.138268 -[2024/06/24 06:37:10] ppsci INFO: train: epoch 437 | step 20 | lr 0.000303 | loss 0.040848 | mae 0.141448 -[2024/06/24 06:37:10] ppsci INFO: train: epoch 437 | step 30 | lr 0.000303 | loss 0.044727 | mae 0.147337 -[2024/06/24 06:37:11] ppsci INFO: train: epoch 437 | step 38 | lr 0.000303 | loss 0.029869 | mae 0.137275 -[2024/06/24 06:37:11] ppsci INFO: epoch: 437, train_loss: 0.047336, train_metric: 0.155019, eval_loss: 0.063154, eval_mae: 0.172116 -[2024/06/24 06:37:11] ppsci INFO: train: epoch 438 | step 0 | lr 0.000302 | loss 0.056418 | mae 0.155143 -[2024/06/24 06:37:12] ppsci INFO: train: epoch 438 | step 10 | lr 0.000302 | loss 0.133646 | mae 0.173497 -[2024/06/24 06:37:12] ppsci INFO: train: epoch 438 | step 20 | lr 0.000302 | loss 0.041459 | mae 0.155528 -[2024/06/24 06:37:13] ppsci INFO: train: epoch 438 | step 30 | lr 0.000302 | loss 0.052369 | mae 0.155208 -[2024/06/24 06:37:13] ppsci INFO: train: epoch 438 | step 38 | lr 0.000302 | loss 0.076756 | mae 0.180664 -[2024/06/24 06:37:13] ppsci INFO: epoch: 438, train_loss: 0.046201, train_metric: 0.152086, eval_loss: 0.067760, eval_mae: 0.171474 -[2024/06/24 06:37:13] ppsci INFO: train: epoch 439 | step 0 | lr 0.000302 | loss 0.053223 | mae 0.163203 -[2024/06/24 06:37:14] ppsci INFO: train: epoch 439 | step 10 | lr 0.000302 | loss 0.051763 | mae 0.164521 -[2024/06/24 06:37:14] ppsci INFO: train: epoch 439 | step 20 | lr 0.000302 | loss 0.038273 | mae 0.145482 -[2024/06/24 06:37:15] ppsci INFO: train: epoch 439 | step 30 | lr 0.000302 | loss 0.043741 | mae 0.148510 -[2024/06/24 06:37:15] ppsci INFO: train: epoch 439 | step 38 | lr 0.000302 | loss 0.012634 | mae 0.090863 -[2024/06/24 06:37:15] ppsci INFO: epoch: 439, train_loss: 0.042123, train_metric: 0.149571, eval_loss: 0.061937, eval_mae: 0.167116 -[2024/06/24 06:37:16] ppsci INFO: train: epoch 440 | step 0 | lr 0.000301 | loss 0.048742 | mae 0.146917 -[2024/06/24 06:37:16] ppsci INFO: train: epoch 440 | step 10 | lr 0.000301 | loss 0.036903 | mae 0.143253 -[2024/06/24 06:37:17] ppsci INFO: train: epoch 440 | step 20 | lr 0.000301 | loss 0.044467 | mae 0.145035 -[2024/06/24 06:37:17] ppsci INFO: train: epoch 440 | step 30 | lr 0.000301 | loss 0.038682 | mae 0.140656 -[2024/06/24 06:37:18] ppsci INFO: train: epoch 440 | step 38 | lr 0.000301 | loss 0.027680 | mae 0.144552 -[2024/06/24 06:37:18] ppsci INFO: epoch: 440, train_loss: 0.043160, train_metric: 0.148684, eval_loss: 0.067295, eval_mae: 0.171319 -[2024/06/24 06:37:18] ppsci INFO: train: epoch 441 | step 0 | lr 0.000300 | loss 0.044941 | mae 0.142205 -[2024/06/24 06:37:18] ppsci INFO: train: epoch 441 | step 10 | lr 0.000300 | loss 0.033681 | mae 0.143156 -[2024/06/24 06:37:19] ppsci INFO: train: epoch 441 | step 20 | lr 0.000300 | loss 0.038787 | mae 0.137329 -[2024/06/24 06:37:20] ppsci INFO: train: epoch 441 | step 30 | lr 0.000300 | loss 0.030560 | mae 0.131661 -[2024/06/24 06:37:20] ppsci INFO: train: epoch 441 | step 38 | lr 0.000300 | loss 0.023245 | mae 0.136405 -[2024/06/24 06:37:20] ppsci INFO: epoch: 441, train_loss: 0.041958, train_metric: 0.148515, eval_loss: 0.059677, eval_mae: 0.164428 -[2024/06/24 06:37:20] ppsci INFO: train: epoch 442 | step 0 | lr 0.000299 | loss 0.053739 | mae 0.167485 -[2024/06/24 06:37:21] ppsci INFO: train: epoch 442 | step 10 | lr 0.000299 | loss 0.039085 | mae 0.153999 -[2024/06/24 06:37:21] ppsci INFO: train: epoch 442 | step 20 | lr 0.000299 | loss 0.053920 | mae 0.161200 -[2024/06/24 06:37:22] ppsci INFO: train: epoch 442 | step 30 | lr 0.000299 | loss 0.048127 | mae 0.167642 -[2024/06/24 06:37:22] ppsci INFO: train: epoch 442 | step 38 | lr 0.000299 | loss 0.029534 | mae 0.133330 -[2024/06/24 06:37:22] ppsci INFO: epoch: 442, train_loss: 0.044387, train_metric: 0.153758, eval_loss: 0.065792, eval_mae: 0.165776 -[2024/06/24 06:37:22] ppsci INFO: train: epoch 443 | step 0 | lr 0.000299 | loss 0.037240 | mae 0.142155 -[2024/06/24 06:37:23] ppsci INFO: train: epoch 443 | step 10 | lr 0.000299 | loss 0.041596 | mae 0.150514 -[2024/06/24 06:37:23] ppsci INFO: train: epoch 443 | step 20 | lr 0.000299 | loss 0.055984 | mae 0.164231 -[2024/06/24 06:37:24] ppsci INFO: train: epoch 443 | step 30 | lr 0.000299 | loss 0.045848 | mae 0.161300 -[2024/06/24 06:37:24] ppsci INFO: train: epoch 443 | step 38 | lr 0.000299 | loss 0.113761 | mae 0.254873 -[2024/06/24 06:37:24] ppsci INFO: epoch: 443, train_loss: 0.044212, train_metric: 0.150506, eval_loss: 0.062135, eval_mae: 0.164172 -[2024/06/24 06:37:24] ppsci INFO: train: epoch 444 | step 0 | lr 0.000298 | loss 0.034109 | mae 0.138868 -[2024/06/24 06:37:25] ppsci INFO: train: epoch 444 | step 10 | lr 0.000298 | loss 0.031714 | mae 0.136546 -[2024/06/24 06:37:25] ppsci INFO: train: epoch 444 | step 20 | lr 0.000298 | loss 0.048676 | mae 0.157656 -[2024/06/24 06:37:26] ppsci INFO: train: epoch 444 | step 30 | lr 0.000298 | loss 0.048143 | mae 0.161956 -[2024/06/24 06:37:26] ppsci INFO: train: epoch 444 | step 38 | lr 0.000298 | loss 0.042023 | mae 0.172596 -[2024/06/24 06:37:26] ppsci INFO: epoch: 444, train_loss: 0.045283, train_metric: 0.153145, eval_loss: 0.062572, eval_mae: 0.163487 -[2024/06/24 06:37:26] ppsci INFO: train: epoch 445 | step 0 | lr 0.000297 | loss 0.043299 | mae 0.141232 -[2024/06/24 06:37:27] ppsci INFO: train: epoch 445 | step 10 | lr 0.000297 | loss 0.027542 | mae 0.125350 -[2024/06/24 06:37:27] ppsci INFO: train: epoch 445 | step 20 | lr 0.000297 | loss 0.044051 | mae 0.156269 -[2024/06/24 06:37:28] ppsci INFO: train: epoch 445 | step 30 | lr 0.000297 | loss 0.034420 | mae 0.142802 -[2024/06/24 06:37:28] ppsci INFO: train: epoch 445 | step 38 | lr 0.000297 | loss 0.020085 | mae 0.109357 -[2024/06/24 06:37:28] ppsci INFO: epoch: 445, train_loss: 0.042102, train_metric: 0.148556, eval_loss: 0.064570, eval_mae: 0.163759 -[2024/06/24 06:37:28] ppsci INFO: train: epoch 446 | step 0 | lr 0.000296 | loss 0.041711 | mae 0.142799 -[2024/06/24 06:37:29] ppsci INFO: train: epoch 446 | step 10 | lr 0.000296 | loss 0.031459 | mae 0.128288 -[2024/06/24 06:37:30] ppsci INFO: train: epoch 446 | step 20 | lr 0.000296 | loss 0.036647 | mae 0.142093 -[2024/06/24 06:37:30] ppsci INFO: train: epoch 446 | step 30 | lr 0.000296 | loss 0.032976 | mae 0.131631 -[2024/06/24 06:37:30] ppsci INFO: train: epoch 446 | step 38 | lr 0.000296 | loss 0.025444 | mae 0.095182 -[2024/06/24 06:37:31] ppsci INFO: epoch: 446, train_loss: 0.044529, train_metric: 0.147866, eval_loss: 0.064619, eval_mae: 0.167859 -[2024/06/24 06:37:31] ppsci INFO: train: epoch 447 | step 0 | lr 0.000296 | loss 0.038609 | mae 0.143255 -[2024/06/24 06:37:31] ppsci INFO: train: epoch 447 | step 10 | lr 0.000296 | loss 0.038600 | mae 0.144141 -[2024/06/24 06:37:32] ppsci INFO: train: epoch 447 | step 20 | lr 0.000296 | loss 0.033390 | mae 0.138816 -[2024/06/24 06:37:32] ppsci INFO: train: epoch 447 | step 30 | lr 0.000296 | loss 0.037750 | mae 0.149494 -[2024/06/24 06:37:33] ppsci INFO: train: epoch 447 | step 38 | lr 0.000296 | loss 0.021506 | mae 0.122089 -[2024/06/24 06:37:33] ppsci INFO: epoch: 447, train_loss: 0.042581, train_metric: 0.150361, eval_loss: 0.065814, eval_mae: 0.166407 -[2024/06/24 06:37:33] ppsci INFO: train: epoch 448 | step 0 | lr 0.000295 | loss 0.029187 | mae 0.130130 -[2024/06/24 06:37:33] ppsci INFO: train: epoch 448 | step 10 | lr 0.000295 | loss 0.036713 | mae 0.144463 -[2024/06/24 06:37:34] ppsci INFO: train: epoch 448 | step 20 | lr 0.000295 | loss 0.037009 | mae 0.144351 -[2024/06/24 06:37:34] ppsci INFO: train: epoch 448 | step 30 | lr 0.000295 | loss 0.043320 | mae 0.144765 -[2024/06/24 06:37:35] ppsci INFO: train: epoch 448 | step 38 | lr 0.000295 | loss 0.053566 | mae 0.163793 -[2024/06/24 06:37:35] ppsci INFO: epoch: 448, train_loss: 0.042654, train_metric: 0.149293, eval_loss: 0.069801, eval_mae: 0.169951 -[2024/06/24 06:37:35] ppsci INFO: train: epoch 449 | step 0 | lr 0.000294 | loss 0.032150 | mae 0.141831 -[2024/06/24 06:37:35] ppsci INFO: train: epoch 449 | step 10 | lr 0.000294 | loss 0.031936 | mae 0.139626 -[2024/06/24 06:37:36] ppsci INFO: train: epoch 449 | step 20 | lr 0.000294 | loss 0.039719 | mae 0.146934 -[2024/06/24 06:37:36] ppsci INFO: train: epoch 449 | step 30 | lr 0.000294 | loss 0.050619 | mae 0.155797 -[2024/06/24 06:37:37] ppsci INFO: train: epoch 449 | step 38 | lr 0.000294 | loss 0.026758 | mae 0.133112 -[2024/06/24 06:37:37] ppsci INFO: epoch: 449, train_loss: 0.046158, train_metric: 0.152674, eval_loss: 0.066140, eval_mae: 0.171138 -[2024/06/24 06:37:37] ppsci INFO: train: epoch 450 | step 0 | lr 0.000293 | loss 0.046865 | mae 0.156891 -[2024/06/24 06:37:38] ppsci INFO: train: epoch 450 | step 10 | lr 0.000293 | loss 0.058446 | mae 0.168831 -[2024/06/24 06:37:38] ppsci INFO: train: epoch 450 | step 20 | lr 0.000293 | loss 0.059476 | mae 0.154082 -[2024/06/24 06:37:39] ppsci INFO: train: epoch 450 | step 30 | lr 0.000293 | loss 0.039640 | mae 0.151016 -[2024/06/24 06:37:39] ppsci INFO: train: epoch 450 | step 38 | lr 0.000293 | loss 0.052872 | mae 0.169544 -[2024/06/24 06:37:39] ppsci INFO: epoch: 450, train_loss: 0.042786, train_metric: 0.149484, eval_loss: 0.063367, eval_mae: 0.166871 -[2024/06/24 06:37:40] ppsci INFO: train: epoch 451 | step 0 | lr 0.000293 | loss 0.041820 | mae 0.152168 -[2024/06/24 06:37:40] ppsci INFO: train: epoch 451 | step 10 | lr 0.000293 | loss 0.038150 | mae 0.151873 -[2024/06/24 06:37:41] ppsci INFO: train: epoch 451 | step 20 | lr 0.000293 | loss 0.038977 | mae 0.135245 -[2024/06/24 06:37:41] ppsci INFO: train: epoch 451 | step 30 | lr 0.000293 | loss 0.035744 | mae 0.140343 -[2024/06/24 06:37:42] ppsci INFO: train: epoch 451 | step 38 | lr 0.000293 | loss 0.043333 | mae 0.168174 -[2024/06/24 06:37:42] ppsci INFO: epoch: 451, train_loss: 0.041322, train_metric: 0.147265, eval_loss: 0.065623, eval_mae: 0.170026 -[2024/06/24 06:37:42] ppsci INFO: train: epoch 452 | step 0 | lr 0.000292 | loss 0.036652 | mae 0.142818 -[2024/06/24 06:37:42] ppsci INFO: train: epoch 452 | step 10 | lr 0.000292 | loss 0.030053 | mae 0.134363 -[2024/06/24 06:37:43] ppsci INFO: train: epoch 452 | step 20 | lr 0.000292 | loss 0.034350 | mae 0.138113 -[2024/06/24 06:37:43] ppsci INFO: train: epoch 452 | step 30 | lr 0.000292 | loss 0.054613 | mae 0.154115 -[2024/06/24 06:37:44] ppsci INFO: train: epoch 452 | step 38 | lr 0.000292 | loss 0.010403 | mae 0.088547 -[2024/06/24 06:37:44] ppsci INFO: epoch: 452, train_loss: 0.042845, train_metric: 0.149863, eval_loss: 0.066473, eval_mae: 0.165947 -[2024/06/24 06:37:44] ppsci INFO: train: epoch 453 | step 0 | lr 0.000291 | loss 0.043299 | mae 0.153918 -[2024/06/24 06:37:44] ppsci INFO: train: epoch 453 | step 10 | lr 0.000291 | loss 0.041395 | mae 0.147463 -[2024/06/24 06:37:45] ppsci INFO: train: epoch 453 | step 20 | lr 0.000291 | loss 0.037819 | mae 0.144002 -[2024/06/24 06:37:45] ppsci INFO: train: epoch 453 | step 30 | lr 0.000291 | loss 0.038522 | mae 0.143373 -[2024/06/24 06:37:46] ppsci INFO: train: epoch 453 | step 38 | lr 0.000291 | loss 0.008080 | mae 0.076628 -[2024/06/24 06:37:46] ppsci INFO: epoch: 453, train_loss: 0.041868, train_metric: 0.149602, eval_loss: 0.068869, eval_mae: 0.170867 -[2024/06/24 06:37:46] ppsci INFO: train: epoch 454 | step 0 | lr 0.000290 | loss 0.044420 | mae 0.162762 -[2024/06/24 06:37:47] ppsci INFO: train: epoch 454 | step 10 | lr 0.000290 | loss 0.042455 | mae 0.155557 -[2024/06/24 06:37:47] ppsci INFO: train: epoch 454 | step 20 | lr 0.000290 | loss 0.045560 | mae 0.154049 -[2024/06/24 06:37:48] ppsci INFO: train: epoch 454 | step 30 | lr 0.000290 | loss 0.031125 | mae 0.129093 -[2024/06/24 06:37:48] ppsci INFO: train: epoch 454 | step 38 | lr 0.000290 | loss 0.034066 | mae 0.152254 -[2024/06/24 06:37:48] ppsci INFO: epoch: 454, train_loss: 0.042466, train_metric: 0.150056, eval_loss: 0.072603, eval_mae: 0.172028 -[2024/06/24 06:37:48] ppsci INFO: train: epoch 455 | step 0 | lr 0.000290 | loss 0.032882 | mae 0.141698 -[2024/06/24 06:37:49] ppsci INFO: train: epoch 455 | step 10 | lr 0.000290 | loss 0.046551 | mae 0.162233 -[2024/06/24 06:37:49] ppsci INFO: train: epoch 455 | step 20 | lr 0.000290 | loss 0.050156 | mae 0.161812 -[2024/06/24 06:37:50] ppsci INFO: train: epoch 455 | step 30 | lr 0.000290 | loss 0.047130 | mae 0.159386 -[2024/06/24 06:37:50] ppsci INFO: train: epoch 455 | step 38 | lr 0.000290 | loss 0.024363 | mae 0.114683 -[2024/06/24 06:37:50] ppsci INFO: epoch: 455, train_loss: 0.043904, train_metric: 0.151619, eval_loss: 0.068487, eval_mae: 0.174129 -[2024/06/24 06:37:50] ppsci INFO: train: epoch 456 | step 0 | lr 0.000289 | loss 0.038317 | mae 0.144378 -[2024/06/24 06:37:51] ppsci INFO: train: epoch 456 | step 10 | lr 0.000289 | loss 0.036750 | mae 0.146016 -[2024/06/24 06:37:51] ppsci INFO: train: epoch 456 | step 20 | lr 0.000289 | loss 0.039650 | mae 0.139952 -[2024/06/24 06:37:52] ppsci INFO: train: epoch 456 | step 30 | lr 0.000289 | loss 0.050750 | mae 0.162415 -[2024/06/24 06:37:52] ppsci INFO: train: epoch 456 | step 38 | lr 0.000289 | loss 0.054002 | mae 0.170548 -[2024/06/24 06:37:52] ppsci INFO: epoch: 456, train_loss: 0.050050, train_metric: 0.156136, eval_loss: 0.072098, eval_mae: 0.170244 -[2024/06/24 06:37:52] ppsci INFO: train: epoch 457 | step 0 | lr 0.000288 | loss 0.047740 | mae 0.158050 -[2024/06/24 06:37:53] ppsci INFO: train: epoch 457 | step 10 | lr 0.000288 | loss 0.040714 | mae 0.143094 -[2024/06/24 06:37:54] ppsci INFO: train: epoch 457 | step 20 | lr 0.000288 | loss 0.036219 | mae 0.143238 -[2024/06/24 06:37:54] ppsci INFO: train: epoch 457 | step 30 | lr 0.000288 | loss 0.053646 | mae 0.164369 -[2024/06/24 06:37:54] ppsci INFO: train: epoch 457 | step 38 | lr 0.000288 | loss 0.055629 | mae 0.167605 -[2024/06/24 06:37:55] ppsci INFO: epoch: 457, train_loss: 0.043750, train_metric: 0.151179, eval_loss: 0.063384, eval_mae: 0.165825 -[2024/06/24 06:37:55] ppsci INFO: train: epoch 458 | step 0 | lr 0.000287 | loss 0.044066 | mae 0.159059 -[2024/06/24 06:37:55] ppsci INFO: train: epoch 458 | step 10 | lr 0.000287 | loss 0.035691 | mae 0.132354 -[2024/06/24 06:37:56] ppsci INFO: train: epoch 458 | step 20 | lr 0.000287 | loss 0.037101 | mae 0.146436 -[2024/06/24 06:37:56] ppsci INFO: train: epoch 458 | step 30 | lr 0.000287 | loss 0.034461 | mae 0.132758 -[2024/06/24 06:37:57] ppsci INFO: train: epoch 458 | step 38 | lr 0.000287 | loss 0.053386 | mae 0.168675 -[2024/06/24 06:37:57] ppsci INFO: epoch: 458, train_loss: 0.043856, train_metric: 0.150277, eval_loss: 0.065864, eval_mae: 0.167331 -[2024/06/24 06:37:57] ppsci INFO: train: epoch 459 | step 0 | lr 0.000286 | loss 0.050309 | mae 0.167855 -[2024/06/24 06:37:57] ppsci INFO: train: epoch 459 | step 10 | lr 0.000286 | loss 0.036019 | mae 0.142815 -[2024/06/24 06:37:58] ppsci INFO: train: epoch 459 | step 20 | lr 0.000286 | loss 0.043934 | mae 0.147224 -[2024/06/24 06:37:58] ppsci INFO: train: epoch 459 | step 30 | lr 0.000286 | loss 0.034733 | mae 0.144314 -[2024/06/24 06:37:59] ppsci INFO: train: epoch 459 | step 38 | lr 0.000286 | loss 0.039603 | mae 0.164485 -[2024/06/24 06:37:59] ppsci INFO: epoch: 459, train_loss: 0.041622, train_metric: 0.150017, eval_loss: 0.065967, eval_mae: 0.166738 -[2024/06/24 06:37:59] ppsci INFO: train: epoch 460 | step 0 | lr 0.000286 | loss 0.032917 | mae 0.141515 -[2024/06/24 06:37:59] ppsci INFO: train: epoch 460 | step 10 | lr 0.000286 | loss 0.033803 | mae 0.138019 -[2024/06/24 06:38:00] ppsci INFO: train: epoch 460 | step 20 | lr 0.000286 | loss 0.052344 | mae 0.166751 -[2024/06/24 06:38:00] ppsci INFO: train: epoch 460 | step 30 | lr 0.000286 | loss 0.132096 | mae 0.203847 -[2024/06/24 06:38:01] ppsci INFO: train: epoch 460 | step 38 | lr 0.000286 | loss 0.093944 | mae 0.183906 -[2024/06/24 06:38:01] ppsci INFO: epoch: 460, train_loss: 0.047214, train_metric: 0.153456, eval_loss: 0.070533, eval_mae: 0.167956 -[2024/06/24 06:38:01] ppsci INFO: train: epoch 461 | step 0 | lr 0.000285 | loss 0.037069 | mae 0.150626 -[2024/06/24 06:38:01] ppsci INFO: train: epoch 461 | step 10 | lr 0.000285 | loss 0.045535 | mae 0.154138 -[2024/06/24 06:38:02] ppsci INFO: train: epoch 461 | step 20 | lr 0.000285 | loss 0.033515 | mae 0.141542 -[2024/06/24 06:38:02] ppsci INFO: train: epoch 461 | step 30 | lr 0.000285 | loss 0.036072 | mae 0.142556 -[2024/06/24 06:38:03] ppsci INFO: train: epoch 461 | step 38 | lr 0.000285 | loss 0.082219 | mae 0.229408 -[2024/06/24 06:38:03] ppsci INFO: epoch: 461, train_loss: 0.044584, train_metric: 0.148858, eval_loss: 0.064357, eval_mae: 0.165879 -[2024/06/24 06:38:03] ppsci INFO: train: epoch 462 | step 0 | lr 0.000284 | loss 0.038080 | mae 0.146876 -[2024/06/24 06:38:04] ppsci INFO: train: epoch 462 | step 10 | lr 0.000284 | loss 0.069687 | mae 0.192604 -[2024/06/24 06:38:04] ppsci INFO: train: epoch 462 | step 20 | lr 0.000284 | loss 0.048671 | mae 0.161261 -[2024/06/24 06:38:05] ppsci INFO: train: epoch 462 | step 30 | lr 0.000284 | loss 0.057640 | mae 0.177018 -[2024/06/24 06:38:05] ppsci INFO: train: epoch 462 | step 38 | lr 0.000284 | loss 0.026155 | mae 0.135905 -[2024/06/24 06:38:05] ppsci INFO: epoch: 462, train_loss: 0.047372, train_metric: 0.158049, eval_loss: 0.063817, eval_mae: 0.166230 -[2024/06/24 06:38:05] ppsci INFO: train: epoch 463 | step 0 | lr 0.000283 | loss 0.045811 | mae 0.156062 -[2024/06/24 06:38:06] ppsci INFO: train: epoch 463 | step 10 | lr 0.000283 | loss 0.034320 | mae 0.138545 -[2024/06/24 06:38:06] ppsci INFO: train: epoch 463 | step 20 | lr 0.000283 | loss 0.037997 | mae 0.148937 -[2024/06/24 06:38:07] ppsci INFO: train: epoch 463 | step 30 | lr 0.000283 | loss 0.048518 | mae 0.165599 -[2024/06/24 06:38:07] ppsci INFO: train: epoch 463 | step 38 | lr 0.000283 | loss 0.021728 | mae 0.103049 -[2024/06/24 06:38:07] ppsci INFO: epoch: 463, train_loss: 0.045121, train_metric: 0.151612, eval_loss: 0.065085, eval_mae: 0.166139 -[2024/06/24 06:38:07] ppsci INFO: train: epoch 464 | step 0 | lr 0.000283 | loss 0.042755 | mae 0.148073 -[2024/06/24 06:38:08] ppsci INFO: train: epoch 464 | step 10 | lr 0.000283 | loss 0.041138 | mae 0.155931 -[2024/06/24 06:38:08] ppsci INFO: train: epoch 464 | step 20 | lr 0.000283 | loss 0.031074 | mae 0.130719 -[2024/06/24 06:38:09] ppsci INFO: train: epoch 464 | step 30 | lr 0.000283 | loss 0.043570 | mae 0.138992 -[2024/06/24 06:38:09] ppsci INFO: train: epoch 464 | step 38 | lr 0.000283 | loss 0.021879 | mae 0.118029 -[2024/06/24 06:38:09] ppsci INFO: epoch: 464, train_loss: 0.040614, train_metric: 0.147357, eval_loss: 0.065335, eval_mae: 0.164196 -[2024/06/24 06:38:09] ppsci INFO: train: epoch 465 | step 0 | lr 0.000282 | loss 0.040338 | mae 0.134312 -[2024/06/24 06:38:10] ppsci INFO: train: epoch 465 | step 10 | lr 0.000282 | loss 0.042007 | mae 0.153965 -[2024/06/24 06:38:10] ppsci INFO: train: epoch 465 | step 20 | lr 0.000282 | loss 0.035784 | mae 0.138389 -[2024/06/24 06:38:11] ppsci INFO: train: epoch 465 | step 30 | lr 0.000282 | loss 0.048585 | mae 0.156839 -[2024/06/24 06:38:11] ppsci INFO: train: epoch 465 | step 38 | lr 0.000282 | loss 0.171295 | mae 0.200535 -[2024/06/24 06:38:11] ppsci INFO: epoch: 465, train_loss: 0.045159, train_metric: 0.147078, eval_loss: 0.067451, eval_mae: 0.168349 -[2024/06/24 06:38:12] ppsci INFO: train: epoch 466 | step 0 | lr 0.000281 | loss 0.033621 | mae 0.141697 -[2024/06/24 06:38:12] ppsci INFO: train: epoch 466 | step 10 | lr 0.000281 | loss 0.039460 | mae 0.152811 -[2024/06/24 06:38:13] ppsci INFO: train: epoch 466 | step 20 | lr 0.000281 | loss 0.045168 | mae 0.132431 -[2024/06/24 06:38:13] ppsci INFO: train: epoch 466 | step 30 | lr 0.000281 | loss 0.056736 | mae 0.172490 -[2024/06/24 06:38:13] ppsci INFO: train: epoch 466 | step 38 | lr 0.000281 | loss 0.022051 | mae 0.097199 -[2024/06/24 06:38:14] ppsci INFO: epoch: 466, train_loss: 0.044421, train_metric: 0.151952, eval_loss: 0.064600, eval_mae: 0.166953 -[2024/06/24 06:38:14] ppsci INFO: train: epoch 467 | step 0 | lr 0.000280 | loss 0.037303 | mae 0.141882 -[2024/06/24 06:38:14] ppsci INFO: train: epoch 467 | step 10 | lr 0.000280 | loss 0.037432 | mae 0.144997 -[2024/06/24 06:38:15] ppsci INFO: train: epoch 467 | step 20 | lr 0.000280 | loss 0.032490 | mae 0.140135 -[2024/06/24 06:38:15] ppsci INFO: train: epoch 467 | step 30 | lr 0.000280 | loss 0.032920 | mae 0.138421 -[2024/06/24 06:38:16] ppsci INFO: train: epoch 467 | step 38 | lr 0.000280 | loss 0.022093 | mae 0.123642 -[2024/06/24 06:38:16] ppsci INFO: epoch: 467, train_loss: 0.043551, train_metric: 0.149802, eval_loss: 0.065960, eval_mae: 0.166526 -[2024/06/24 06:38:16] ppsci INFO: train: epoch 468 | step 0 | lr 0.000280 | loss 0.046856 | mae 0.149635 -[2024/06/24 06:38:16] ppsci INFO: train: epoch 468 | step 10 | lr 0.000280 | loss 0.040205 | mae 0.148204 -[2024/06/24 06:38:17] ppsci INFO: train: epoch 468 | step 20 | lr 0.000280 | loss 0.032563 | mae 0.131413 -[2024/06/24 06:38:17] ppsci INFO: train: epoch 468 | step 30 | lr 0.000280 | loss 0.053342 | mae 0.167408 -[2024/06/24 06:38:18] ppsci INFO: train: epoch 468 | step 38 | lr 0.000280 | loss 0.039120 | mae 0.149509 -[2024/06/24 06:38:18] ppsci INFO: epoch: 468, train_loss: 0.043165, train_metric: 0.149382, eval_loss: 0.064965, eval_mae: 0.169291 -[2024/06/24 06:38:18] ppsci INFO: train: epoch 469 | step 0 | lr 0.000279 | loss 0.040151 | mae 0.146465 -[2024/06/24 06:38:18] ppsci INFO: train: epoch 469 | step 10 | lr 0.000279 | loss 0.048563 | mae 0.168522 -[2024/06/24 06:38:19] ppsci INFO: train: epoch 469 | step 20 | lr 0.000279 | loss 0.037609 | mae 0.140184 -[2024/06/24 06:38:19] ppsci INFO: train: epoch 469 | step 30 | lr 0.000279 | loss 0.047754 | mae 0.156810 -[2024/06/24 06:38:20] ppsci INFO: train: epoch 469 | step 38 | lr 0.000279 | loss 0.047141 | mae 0.176419 -[2024/06/24 06:38:20] ppsci INFO: epoch: 469, train_loss: 0.044154, train_metric: 0.149029, eval_loss: 0.060019, eval_mae: 0.163597 -[2024/06/24 06:38:20] ppsci INFO: train: epoch 470 | step 0 | lr 0.000278 | loss 0.031485 | mae 0.130965 -[2024/06/24 06:38:21] ppsci INFO: train: epoch 470 | step 10 | lr 0.000278 | loss 0.032025 | mae 0.130519 -[2024/06/24 06:38:21] ppsci INFO: train: epoch 470 | step 20 | lr 0.000278 | loss 0.040317 | mae 0.146155 -[2024/06/24 06:38:22] ppsci INFO: train: epoch 470 | step 30 | lr 0.000278 | loss 0.033876 | mae 0.135503 -[2024/06/24 06:38:22] ppsci INFO: train: epoch 470 | step 38 | lr 0.000278 | loss 0.044754 | mae 0.180235 -[2024/06/24 06:38:22] ppsci INFO: epoch: 470, train_loss: 0.042516, train_metric: 0.148752, eval_loss: 0.069207, eval_mae: 0.167414 -[2024/06/24 06:38:22] ppsci INFO: train: epoch 471 | step 0 | lr 0.000277 | loss 0.035010 | mae 0.138551 -[2024/06/24 06:38:23] ppsci INFO: train: epoch 471 | step 10 | lr 0.000277 | loss 0.035115 | mae 0.133061 -[2024/06/24 06:38:23] ppsci INFO: train: epoch 471 | step 20 | lr 0.000277 | loss 0.031327 | mae 0.132100 -[2024/06/24 06:38:24] ppsci INFO: train: epoch 471 | step 30 | lr 0.000277 | loss 0.036575 | mae 0.148405 -[2024/06/24 06:38:24] ppsci INFO: train: epoch 471 | step 38 | lr 0.000277 | loss 0.077076 | mae 0.212956 -[2024/06/24 06:38:24] ppsci INFO: epoch: 471, train_loss: 0.042279, train_metric: 0.147726, eval_loss: 0.068739, eval_mae: 0.167811 -[2024/06/24 06:38:24] ppsci INFO: train: epoch 472 | step 0 | lr 0.000277 | loss 0.037258 | mae 0.149595 -[2024/06/24 06:38:25] ppsci INFO: train: epoch 472 | step 10 | lr 0.000277 | loss 0.038512 | mae 0.144161 -[2024/06/24 06:38:25] ppsci INFO: train: epoch 472 | step 20 | lr 0.000277 | loss 0.038455 | mae 0.143467 -[2024/06/24 06:38:26] ppsci INFO: train: epoch 472 | step 30 | lr 0.000277 | loss 0.037627 | mae 0.149631 -[2024/06/24 06:38:26] ppsci INFO: train: epoch 472 | step 38 | lr 0.000277 | loss 0.036203 | mae 0.136702 -[2024/06/24 06:38:26] ppsci INFO: epoch: 472, train_loss: 0.041219, train_metric: 0.147191, eval_loss: 0.064979, eval_mae: 0.167772 -[2024/06/24 06:38:26] ppsci INFO: train: epoch 473 | step 0 | lr 0.000276 | loss 0.033994 | mae 0.135728 -[2024/06/24 06:38:27] ppsci INFO: train: epoch 473 | step 10 | lr 0.000276 | loss 0.042959 | mae 0.150824 -[2024/06/24 06:38:27] ppsci INFO: train: epoch 473 | step 20 | lr 0.000276 | loss 0.093870 | mae 0.157462 -[2024/06/24 06:38:28] ppsci INFO: train: epoch 473 | step 30 | lr 0.000276 | loss 0.036583 | mae 0.132036 -[2024/06/24 06:38:28] ppsci INFO: train: epoch 473 | step 38 | lr 0.000276 | loss 0.042759 | mae 0.153631 -[2024/06/24 06:38:28] ppsci INFO: epoch: 473, train_loss: 0.048158, train_metric: 0.151626, eval_loss: 0.062200, eval_mae: 0.165473 -[2024/06/24 06:38:29] ppsci INFO: train: epoch 474 | step 0 | lr 0.000275 | loss 0.073794 | mae 0.167301 -[2024/06/24 06:38:29] ppsci INFO: train: epoch 474 | step 10 | lr 0.000275 | loss 0.124942 | mae 0.184932 -[2024/06/24 06:38:30] ppsci INFO: train: epoch 474 | step 20 | lr 0.000275 | loss 0.040561 | mae 0.144967 -[2024/06/24 06:38:30] ppsci INFO: train: epoch 474 | step 30 | lr 0.000275 | loss 0.029963 | mae 0.128494 -[2024/06/24 06:38:30] ppsci INFO: train: epoch 474 | step 38 | lr 0.000275 | loss 0.058417 | mae 0.189338 -[2024/06/24 06:38:30] ppsci INFO: epoch: 474, train_loss: 0.046382, train_metric: 0.152244, eval_loss: 0.065518, eval_mae: 0.167225 -[2024/06/24 06:38:31] ppsci INFO: train: epoch 475 | step 0 | lr 0.000274 | loss 0.049325 | mae 0.156385 -[2024/06/24 06:38:31] ppsci INFO: train: epoch 475 | step 10 | lr 0.000274 | loss 0.041496 | mae 0.147121 -[2024/06/24 06:38:32] ppsci INFO: train: epoch 475 | step 20 | lr 0.000274 | loss 0.046611 | mae 0.150900 -[2024/06/24 06:38:32] ppsci INFO: train: epoch 475 | step 30 | lr 0.000274 | loss 0.052564 | mae 0.148135 -[2024/06/24 06:38:32] ppsci INFO: train: epoch 475 | step 38 | lr 0.000274 | loss 0.029929 | mae 0.141082 -[2024/06/24 06:38:33] ppsci INFO: epoch: 475, train_loss: 0.041064, train_metric: 0.147116, eval_loss: 0.063165, eval_mae: 0.164724 -[2024/06/24 06:38:33] ppsci INFO: train: epoch 476 | step 0 | lr 0.000273 | loss 0.035511 | mae 0.141971 -[2024/06/24 06:38:33] ppsci INFO: train: epoch 476 | step 10 | lr 0.000273 | loss 0.051435 | mae 0.144927 -[2024/06/24 06:38:34] ppsci INFO: train: epoch 476 | step 20 | lr 0.000273 | loss 0.040566 | mae 0.137002 -[2024/06/24 06:38:34] ppsci INFO: train: epoch 476 | step 30 | lr 0.000273 | loss 0.031151 | mae 0.135884 -[2024/06/24 06:38:35] ppsci INFO: train: epoch 476 | step 38 | lr 0.000273 | loss 0.021738 | mae 0.116051 -[2024/06/24 06:38:35] ppsci INFO: epoch: 476, train_loss: 0.043232, train_metric: 0.149611, eval_loss: 0.060617, eval_mae: 0.160500 -[2024/06/24 06:38:35] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:38:35] ppsci INFO: train: epoch 477 | step 0 | lr 0.000273 | loss 0.033232 | mae 0.137849 -[2024/06/24 06:38:35] ppsci INFO: train: epoch 477 | step 10 | lr 0.000273 | loss 0.030868 | mae 0.130316 -[2024/06/24 06:38:36] ppsci INFO: train: epoch 477 | step 20 | lr 0.000273 | loss 0.040387 | mae 0.151442 -[2024/06/24 06:38:36] ppsci INFO: train: epoch 477 | step 30 | lr 0.000273 | loss 0.040087 | mae 0.151580 -[2024/06/24 06:38:37] ppsci INFO: train: epoch 477 | step 38 | lr 0.000273 | loss 0.060128 | mae 0.128051 -[2024/06/24 06:38:37] ppsci INFO: epoch: 477, train_loss: 0.041561, train_metric: 0.146696, eval_loss: 0.064452, eval_mae: 0.165896 -[2024/06/24 06:38:37] ppsci INFO: train: epoch 478 | step 0 | lr 0.000272 | loss 0.035476 | mae 0.140649 -[2024/06/24 06:38:37] ppsci INFO: train: epoch 478 | step 10 | lr 0.000272 | loss 0.041631 | mae 0.147217 -[2024/06/24 06:38:38] ppsci INFO: train: epoch 478 | step 20 | lr 0.000272 | loss 0.034140 | mae 0.139474 -[2024/06/24 06:38:38] ppsci INFO: train: epoch 478 | step 30 | lr 0.000272 | loss 0.051442 | mae 0.139514 -[2024/06/24 06:38:39] ppsci INFO: train: epoch 478 | step 38 | lr 0.000272 | loss 0.069684 | mae 0.208165 -[2024/06/24 06:38:39] ppsci INFO: epoch: 478, train_loss: 0.043553, train_metric: 0.150518, eval_loss: 0.064290, eval_mae: 0.164223 -[2024/06/24 06:38:39] ppsci INFO: train: epoch 479 | step 0 | lr 0.000271 | loss 0.047793 | mae 0.163831 -[2024/06/24 06:38:39] ppsci INFO: train: epoch 479 | step 10 | lr 0.000271 | loss 0.032571 | mae 0.134745 -[2024/06/24 06:38:40] ppsci INFO: train: epoch 479 | step 20 | lr 0.000271 | loss 0.031718 | mae 0.133064 -[2024/06/24 06:38:41] ppsci INFO: train: epoch 479 | step 30 | lr 0.000271 | loss 0.040172 | mae 0.152166 -[2024/06/24 06:38:41] ppsci INFO: train: epoch 479 | step 38 | lr 0.000271 | loss 0.112269 | mae 0.216394 -[2024/06/24 06:38:41] ppsci INFO: epoch: 479, train_loss: 0.042458, train_metric: 0.147596, eval_loss: 0.061848, eval_mae: 0.163615 -[2024/06/24 06:38:41] ppsci INFO: train: epoch 480 | step 0 | lr 0.000270 | loss 0.039225 | mae 0.148593 -[2024/06/24 06:38:42] ppsci INFO: train: epoch 480 | step 10 | lr 0.000270 | loss 0.050125 | mae 0.167095 -[2024/06/24 06:38:42] ppsci INFO: train: epoch 480 | step 20 | lr 0.000270 | loss 0.039144 | mae 0.139359 -[2024/06/24 06:38:43] ppsci INFO: train: epoch 480 | step 30 | lr 0.000270 | loss 0.042090 | mae 0.148619 -[2024/06/24 06:38:43] ppsci INFO: train: epoch 480 | step 38 | lr 0.000270 | loss 0.062796 | mae 0.208194 -[2024/06/24 06:38:43] ppsci INFO: epoch: 480, train_loss: 0.042442, train_metric: 0.149302, eval_loss: 0.066472, eval_mae: 0.171759 -[2024/06/24 06:38:44] ppsci INFO: train: epoch 481 | step 0 | lr 0.000270 | loss 0.040525 | mae 0.151184 -[2024/06/24 06:38:44] ppsci INFO: train: epoch 481 | step 10 | lr 0.000270 | loss 0.036187 | mae 0.148094 -[2024/06/24 06:38:45] ppsci INFO: train: epoch 481 | step 20 | lr 0.000270 | loss 0.039666 | mae 0.152327 -[2024/06/24 06:38:45] ppsci INFO: train: epoch 481 | step 30 | lr 0.000270 | loss 0.046360 | mae 0.147292 -[2024/06/24 06:38:46] ppsci INFO: train: epoch 481 | step 38 | lr 0.000270 | loss 0.034951 | mae 0.130193 -[2024/06/24 06:38:46] ppsci INFO: epoch: 481, train_loss: 0.040353, train_metric: 0.144582, eval_loss: 0.061190, eval_mae: 0.162402 -[2024/06/24 06:38:46] ppsci INFO: train: epoch 482 | step 0 | lr 0.000269 | loss 0.029514 | mae 0.129982 -[2024/06/24 06:38:46] ppsci INFO: train: epoch 482 | step 10 | lr 0.000269 | loss 0.054252 | mae 0.155067 -[2024/06/24 06:38:47] ppsci INFO: train: epoch 482 | step 20 | lr 0.000269 | loss 0.053712 | mae 0.152560 -[2024/06/24 06:38:47] ppsci INFO: train: epoch 482 | step 30 | lr 0.000269 | loss 0.055855 | mae 0.172005 -[2024/06/24 06:38:48] ppsci INFO: train: epoch 482 | step 38 | lr 0.000269 | loss 0.040924 | mae 0.150725 -[2024/06/24 06:38:48] ppsci INFO: epoch: 482, train_loss: 0.039601, train_metric: 0.144503, eval_loss: 0.059570, eval_mae: 0.159499 -[2024/06/24 06:38:48] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:38:48] ppsci INFO: train: epoch 483 | step 0 | lr 0.000268 | loss 0.031718 | mae 0.133863 -[2024/06/24 06:38:48] ppsci INFO: train: epoch 483 | step 10 | lr 0.000268 | loss 0.046908 | mae 0.151782 -[2024/06/24 06:38:49] ppsci INFO: train: epoch 483 | step 20 | lr 0.000268 | loss 0.067228 | mae 0.183862 -[2024/06/24 06:38:49] ppsci INFO: train: epoch 483 | step 30 | lr 0.000268 | loss 0.033736 | mae 0.136746 -[2024/06/24 06:38:50] ppsci INFO: train: epoch 483 | step 38 | lr 0.000268 | loss 0.010562 | mae 0.086673 -[2024/06/24 06:38:50] ppsci INFO: epoch: 483, train_loss: 0.040003, train_metric: 0.146738, eval_loss: 0.065492, eval_mae: 0.165212 -[2024/06/24 06:38:50] ppsci INFO: train: epoch 484 | step 0 | lr 0.000267 | loss 0.056761 | mae 0.159742 -[2024/06/24 06:38:51] ppsci INFO: train: epoch 484 | step 10 | lr 0.000267 | loss 0.043681 | mae 0.159926 -[2024/06/24 06:38:51] ppsci INFO: train: epoch 484 | step 20 | lr 0.000267 | loss 0.050686 | mae 0.154116 -[2024/06/24 06:38:52] ppsci INFO: train: epoch 484 | step 30 | lr 0.000267 | loss 0.031524 | mae 0.133462 -[2024/06/24 06:38:52] ppsci INFO: train: epoch 484 | step 38 | lr 0.000267 | loss 0.063428 | mae 0.149706 -[2024/06/24 06:38:52] ppsci INFO: epoch: 484, train_loss: 0.042889, train_metric: 0.148663, eval_loss: 0.062431, eval_mae: 0.161051 -[2024/06/24 06:38:52] ppsci INFO: train: epoch 485 | step 0 | lr 0.000267 | loss 0.025816 | mae 0.124156 -[2024/06/24 06:38:53] ppsci INFO: train: epoch 485 | step 10 | lr 0.000267 | loss 0.031532 | mae 0.138792 -[2024/06/24 06:38:53] ppsci INFO: train: epoch 485 | step 20 | lr 0.000267 | loss 0.036062 | mae 0.129837 -[2024/06/24 06:38:54] ppsci INFO: train: epoch 485 | step 30 | lr 0.000267 | loss 0.038978 | mae 0.144395 -[2024/06/24 06:38:54] ppsci INFO: train: epoch 485 | step 38 | lr 0.000267 | loss 0.032815 | mae 0.134458 -[2024/06/24 06:38:54] ppsci INFO: epoch: 485, train_loss: 0.038144, train_metric: 0.142375, eval_loss: 0.061649, eval_mae: 0.163713 -[2024/06/24 06:38:54] ppsci INFO: train: epoch 486 | step 0 | lr 0.000266 | loss 0.041311 | mae 0.155953 -[2024/06/24 06:38:55] ppsci INFO: train: epoch 486 | step 10 | lr 0.000266 | loss 0.034179 | mae 0.135632 -[2024/06/24 06:38:55] ppsci INFO: train: epoch 486 | step 20 | lr 0.000266 | loss 0.034589 | mae 0.134027 -[2024/06/24 06:38:56] ppsci INFO: train: epoch 486 | step 30 | lr 0.000266 | loss 0.045222 | mae 0.148769 -[2024/06/24 06:38:56] ppsci INFO: train: epoch 486 | step 38 | lr 0.000266 | loss 0.026544 | mae 0.142989 -[2024/06/24 06:38:56] ppsci INFO: epoch: 486, train_loss: 0.040849, train_metric: 0.144554, eval_loss: 0.065527, eval_mae: 0.166385 -[2024/06/24 06:38:56] ppsci INFO: train: epoch 487 | step 0 | lr 0.000265 | loss 0.036314 | mae 0.143844 -[2024/06/24 06:38:57] ppsci INFO: train: epoch 487 | step 10 | lr 0.000265 | loss 0.039049 | mae 0.151097 -[2024/06/24 06:38:58] ppsci INFO: train: epoch 487 | step 20 | lr 0.000265 | loss 0.092531 | mae 0.204170 -[2024/06/24 06:38:58] ppsci INFO: train: epoch 487 | step 30 | lr 0.000265 | loss 0.053248 | mae 0.163207 -[2024/06/24 06:38:58] ppsci INFO: train: epoch 487 | step 38 | lr 0.000265 | loss 0.015607 | mae 0.103434 -[2024/06/24 06:38:59] ppsci INFO: epoch: 487, train_loss: 0.039558, train_metric: 0.146005, eval_loss: 0.063603, eval_mae: 0.169833 -[2024/06/24 06:38:59] ppsci INFO: train: epoch 488 | step 0 | lr 0.000264 | loss 0.030088 | mae 0.131611 -[2024/06/24 06:38:59] ppsci INFO: train: epoch 488 | step 10 | lr 0.000264 | loss 0.152289 | mae 0.188379 -[2024/06/24 06:39:00] ppsci INFO: train: epoch 488 | step 20 | lr 0.000264 | loss 0.053979 | mae 0.171486 -[2024/06/24 06:39:00] ppsci INFO: train: epoch 488 | step 30 | lr 0.000264 | loss 0.062232 | mae 0.141171 -[2024/06/24 06:39:01] ppsci INFO: train: epoch 488 | step 38 | lr 0.000264 | loss 0.041522 | mae 0.117388 -[2024/06/24 06:39:01] ppsci INFO: epoch: 488, train_loss: 0.048584, train_metric: 0.151215, eval_loss: 0.060371, eval_mae: 0.164042 -[2024/06/24 06:39:01] ppsci INFO: train: epoch 489 | step 0 | lr 0.000263 | loss 0.058969 | mae 0.166010 -[2024/06/24 06:39:01] ppsci INFO: train: epoch 489 | step 10 | lr 0.000263 | loss 0.037701 | mae 0.147006 -[2024/06/24 06:39:02] ppsci INFO: train: epoch 489 | step 20 | lr 0.000263 | loss 0.043732 | mae 0.160545 -[2024/06/24 06:39:02] ppsci INFO: train: epoch 489 | step 30 | lr 0.000263 | loss 0.035542 | mae 0.134288 -[2024/06/24 06:39:03] ppsci INFO: train: epoch 489 | step 38 | lr 0.000263 | loss 0.013889 | mae 0.095587 -[2024/06/24 06:39:03] ppsci INFO: epoch: 489, train_loss: 0.040286, train_metric: 0.146485, eval_loss: 0.063498, eval_mae: 0.164632 -[2024/06/24 06:39:03] ppsci INFO: train: epoch 490 | step 0 | lr 0.000263 | loss 0.040045 | mae 0.145015 -[2024/06/24 06:39:03] ppsci INFO: train: epoch 490 | step 10 | lr 0.000263 | loss 0.034047 | mae 0.137209 -[2024/06/24 06:39:04] ppsci INFO: train: epoch 490 | step 20 | lr 0.000263 | loss 0.042212 | mae 0.148617 -[2024/06/24 06:39:04] ppsci INFO: train: epoch 490 | step 30 | lr 0.000263 | loss 0.047545 | mae 0.163951 -[2024/06/24 06:39:05] ppsci INFO: train: epoch 490 | step 38 | lr 0.000263 | loss 0.029017 | mae 0.108809 -[2024/06/24 06:39:05] ppsci INFO: epoch: 490, train_loss: 0.041231, train_metric: 0.145450, eval_loss: 0.061538, eval_mae: 0.160597 -[2024/06/24 06:39:05] ppsci INFO: train: epoch 491 | step 0 | lr 0.000262 | loss 0.028322 | mae 0.129680 -[2024/06/24 06:39:06] ppsci INFO: train: epoch 491 | step 10 | lr 0.000262 | loss 0.097983 | mae 0.168465 -[2024/06/24 06:39:06] ppsci INFO: train: epoch 491 | step 20 | lr 0.000262 | loss 0.074197 | mae 0.168318 -[2024/06/24 06:39:07] ppsci INFO: train: epoch 491 | step 30 | lr 0.000262 | loss 0.043903 | mae 0.148714 -[2024/06/24 06:39:07] ppsci INFO: train: epoch 491 | step 38 | lr 0.000262 | loss 0.023248 | mae 0.125006 -[2024/06/24 06:39:07] ppsci INFO: epoch: 491, train_loss: 0.039963, train_metric: 0.143039, eval_loss: 0.066138, eval_mae: 0.164123 -[2024/06/24 06:39:07] ppsci INFO: train: epoch 492 | step 0 | lr 0.000261 | loss 0.040515 | mae 0.147183 -[2024/06/24 06:39:08] ppsci INFO: train: epoch 492 | step 10 | lr 0.000261 | loss 0.038501 | mae 0.138854 -[2024/06/24 06:39:08] ppsci INFO: train: epoch 492 | step 20 | lr 0.000261 | loss 0.048073 | mae 0.142524 -[2024/06/24 06:39:09] ppsci INFO: train: epoch 492 | step 30 | lr 0.000261 | loss 0.029536 | mae 0.125854 -[2024/06/24 06:39:09] ppsci INFO: train: epoch 492 | step 38 | lr 0.000261 | loss 0.058311 | mae 0.179490 -[2024/06/24 06:39:09] ppsci INFO: epoch: 492, train_loss: 0.043159, train_metric: 0.147782, eval_loss: 0.060755, eval_mae: 0.162407 -[2024/06/24 06:39:09] ppsci INFO: train: epoch 493 | step 0 | lr 0.000260 | loss 0.051472 | mae 0.160908 -[2024/06/24 06:39:10] ppsci INFO: train: epoch 493 | step 10 | lr 0.000260 | loss 0.041876 | mae 0.153582 -[2024/06/24 06:39:10] ppsci INFO: train: epoch 493 | step 20 | lr 0.000260 | loss 0.031705 | mae 0.136890 -[2024/06/24 06:39:11] ppsci INFO: train: epoch 493 | step 30 | lr 0.000260 | loss 0.039736 | mae 0.146409 -[2024/06/24 06:39:11] ppsci INFO: train: epoch 493 | step 38 | lr 0.000260 | loss 0.059476 | mae 0.199749 -[2024/06/24 06:39:11] ppsci INFO: epoch: 493, train_loss: 0.043148, train_metric: 0.147423, eval_loss: 0.064791, eval_mae: 0.162545 -[2024/06/24 06:39:12] ppsci INFO: train: epoch 494 | step 0 | lr 0.000260 | loss 0.062377 | mae 0.154958 -[2024/06/24 06:39:12] ppsci INFO: train: epoch 494 | step 10 | lr 0.000260 | loss 0.046435 | mae 0.148033 -[2024/06/24 06:39:13] ppsci INFO: train: epoch 494 | step 20 | lr 0.000260 | loss 0.039104 | mae 0.140413 -[2024/06/24 06:39:13] ppsci INFO: train: epoch 494 | step 30 | lr 0.000260 | loss 0.037723 | mae 0.144602 -[2024/06/24 06:39:14] ppsci INFO: train: epoch 494 | step 38 | lr 0.000260 | loss 0.037904 | mae 0.127737 -[2024/06/24 06:39:14] ppsci INFO: epoch: 494, train_loss: 0.040257, train_metric: 0.145205, eval_loss: 0.062692, eval_mae: 0.168778 -[2024/06/24 06:39:14] ppsci INFO: train: epoch 495 | step 0 | lr 0.000259 | loss 0.041836 | mae 0.156921 -[2024/06/24 06:39:14] ppsci INFO: train: epoch 495 | step 10 | lr 0.000259 | loss 0.037903 | mae 0.144299 -[2024/06/24 06:39:15] ppsci INFO: train: epoch 495 | step 20 | lr 0.000259 | loss 0.038403 | mae 0.141493 -[2024/06/24 06:39:16] ppsci INFO: train: epoch 495 | step 30 | lr 0.000259 | loss 0.106491 | mae 0.193793 -[2024/06/24 06:39:16] ppsci INFO: train: epoch 495 | step 38 | lr 0.000259 | loss 0.054555 | mae 0.168834 -[2024/06/24 06:39:16] ppsci INFO: epoch: 495, train_loss: 0.042614, train_metric: 0.149119, eval_loss: 0.065992, eval_mae: 0.166767 -[2024/06/24 06:39:16] ppsci INFO: train: epoch 496 | step 0 | lr 0.000258 | loss 0.032264 | mae 0.134803 -[2024/06/24 06:39:17] ppsci INFO: train: epoch 496 | step 10 | lr 0.000258 | loss 0.044217 | mae 0.154133 -[2024/06/24 06:39:17] ppsci INFO: train: epoch 496 | step 20 | lr 0.000258 | loss 0.043728 | mae 0.159570 -[2024/06/24 06:39:18] ppsci INFO: train: epoch 496 | step 30 | lr 0.000258 | loss 0.038923 | mae 0.143847 -[2024/06/24 06:39:18] ppsci INFO: train: epoch 496 | step 38 | lr 0.000258 | loss 0.014494 | mae 0.096925 -[2024/06/24 06:39:18] ppsci INFO: epoch: 496, train_loss: 0.039432, train_metric: 0.146227, eval_loss: 0.061275, eval_mae: 0.161070 -[2024/06/24 06:39:18] ppsci INFO: train: epoch 497 | step 0 | lr 0.000257 | loss 0.040963 | mae 0.151747 -[2024/06/24 06:39:19] ppsci INFO: train: epoch 497 | step 10 | lr 0.000257 | loss 0.039949 | mae 0.140311 -[2024/06/24 06:39:19] ppsci INFO: train: epoch 497 | step 20 | lr 0.000257 | loss 0.030808 | mae 0.130305 -[2024/06/24 06:39:20] ppsci INFO: train: epoch 497 | step 30 | lr 0.000257 | loss 0.056834 | mae 0.164850 -[2024/06/24 06:39:20] ppsci INFO: train: epoch 497 | step 38 | lr 0.000257 | loss 0.021455 | mae 0.099867 -[2024/06/24 06:39:20] ppsci INFO: epoch: 497, train_loss: 0.041010, train_metric: 0.146299, eval_loss: 0.060135, eval_mae: 0.160345 -[2024/06/24 06:39:20] ppsci INFO: train: epoch 498 | step 0 | lr 0.000257 | loss 0.037212 | mae 0.149308 -[2024/06/24 06:39:21] ppsci INFO: train: epoch 498 | step 10 | lr 0.000257 | loss 0.039463 | mae 0.148398 -[2024/06/24 06:39:21] ppsci INFO: train: epoch 498 | step 20 | lr 0.000257 | loss 0.038977 | mae 0.151016 -[2024/06/24 06:39:22] ppsci INFO: train: epoch 498 | step 30 | lr 0.000257 | loss 0.036337 | mae 0.147461 -[2024/06/24 06:39:22] ppsci INFO: train: epoch 498 | step 38 | lr 0.000257 | loss 0.014040 | mae 0.098274 -[2024/06/24 06:39:22] ppsci INFO: epoch: 498, train_loss: 0.039925, train_metric: 0.146566, eval_loss: 0.061400, eval_mae: 0.162968 -[2024/06/24 06:39:22] ppsci INFO: train: epoch 499 | step 0 | lr 0.000256 | loss 0.033037 | mae 0.135783 -[2024/06/24 06:39:23] ppsci INFO: train: epoch 499 | step 10 | lr 0.000256 | loss 0.042330 | mae 0.156620 -[2024/06/24 06:39:23] ppsci INFO: train: epoch 499 | step 20 | lr 0.000256 | loss 0.026775 | mae 0.111043 -[2024/06/24 06:39:24] ppsci INFO: train: epoch 499 | step 30 | lr 0.000256 | loss 0.040771 | mae 0.146470 -[2024/06/24 06:39:24] ppsci INFO: train: epoch 499 | step 38 | lr 0.000256 | loss 0.019727 | mae 0.117571 -[2024/06/24 06:39:24] ppsci INFO: epoch: 499, train_loss: 0.038536, train_metric: 0.142668, eval_loss: 0.065914, eval_mae: 0.165023 -[2024/06/24 06:39:24] ppsci INFO: train: epoch 500 | step 0 | lr 0.000255 | loss 0.035071 | mae 0.131015 -[2024/06/24 06:39:25] ppsci INFO: train: epoch 500 | step 10 | lr 0.000255 | loss 0.029613 | mae 0.129909 -[2024/06/24 06:39:25] ppsci INFO: train: epoch 500 | step 20 | lr 0.000255 | loss 0.042346 | mae 0.154949 -[2024/06/24 06:39:26] ppsci INFO: train: epoch 500 | step 30 | lr 0.000255 | loss 0.048434 | mae 0.147132 -[2024/06/24 06:39:26] ppsci INFO: train: epoch 500 | step 38 | lr 0.000255 | loss 0.061074 | mae 0.178157 -[2024/06/24 06:39:26] ppsci INFO: epoch: 500, train_loss: 0.040665, train_metric: 0.146094, eval_loss: 0.064549, eval_mae: 0.162629 -[2024/06/24 06:39:26] ppsci INFO: train: epoch 501 | step 0 | lr 0.000254 | loss 0.042214 | mae 0.141803 -[2024/06/24 06:39:27] ppsci INFO: train: epoch 501 | step 10 | lr 0.000254 | loss 0.029007 | mae 0.129832 -[2024/06/24 06:39:28] ppsci INFO: train: epoch 501 | step 20 | lr 0.000254 | loss 0.052021 | mae 0.162017 -[2024/06/24 06:39:28] ppsci INFO: train: epoch 501 | step 30 | lr 0.000254 | loss 0.053516 | mae 0.152436 -[2024/06/24 06:39:28] ppsci INFO: train: epoch 501 | step 38 | lr 0.000254 | loss 0.019520 | mae 0.107155 -[2024/06/24 06:39:29] ppsci INFO: epoch: 501, train_loss: 0.042221, train_metric: 0.148535, eval_loss: 0.065643, eval_mae: 0.169497 -[2024/06/24 06:39:29] ppsci INFO: train: epoch 502 | step 0 | lr 0.000253 | loss 0.038289 | mae 0.145256 -[2024/06/24 06:39:29] ppsci INFO: train: epoch 502 | step 10 | lr 0.000253 | loss 0.049577 | mae 0.160758 -[2024/06/24 06:39:30] ppsci INFO: train: epoch 502 | step 20 | lr 0.000253 | loss 0.036802 | mae 0.141572 -[2024/06/24 06:39:30] ppsci INFO: train: epoch 502 | step 30 | lr 0.000253 | loss 0.034925 | mae 0.138048 -[2024/06/24 06:39:31] ppsci INFO: train: epoch 502 | step 38 | lr 0.000253 | loss 0.042414 | mae 0.170690 -[2024/06/24 06:39:31] ppsci INFO: epoch: 502, train_loss: 0.042076, train_metric: 0.148623, eval_loss: 0.061723, eval_mae: 0.164792 -[2024/06/24 06:39:31] ppsci INFO: train: epoch 503 | step 0 | lr 0.000253 | loss 0.030617 | mae 0.130889 -[2024/06/24 06:39:31] ppsci INFO: train: epoch 503 | step 10 | lr 0.000253 | loss 0.031571 | mae 0.124887 -[2024/06/24 06:39:32] ppsci INFO: train: epoch 503 | step 20 | lr 0.000253 | loss 0.036192 | mae 0.149957 -[2024/06/24 06:39:32] ppsci INFO: train: epoch 503 | step 30 | lr 0.000253 | loss 0.049889 | mae 0.141555 -[2024/06/24 06:39:33] ppsci INFO: train: epoch 503 | step 38 | lr 0.000253 | loss 0.020284 | mae 0.114227 -[2024/06/24 06:39:33] ppsci INFO: epoch: 503, train_loss: 0.040852, train_metric: 0.145523, eval_loss: 0.063454, eval_mae: 0.165491 -[2024/06/24 06:39:33] ppsci INFO: train: epoch 504 | step 0 | lr 0.000252 | loss 0.050226 | mae 0.169883 -[2024/06/24 06:39:33] ppsci INFO: train: epoch 504 | step 10 | lr 0.000252 | loss 0.040829 | mae 0.155623 -[2024/06/24 06:39:34] ppsci INFO: train: epoch 504 | step 20 | lr 0.000252 | loss 0.031795 | mae 0.132666 -[2024/06/24 06:39:34] ppsci INFO: train: epoch 504 | step 30 | lr 0.000252 | loss 0.031833 | mae 0.131339 -[2024/06/24 06:39:35] ppsci INFO: train: epoch 504 | step 38 | lr 0.000252 | loss 0.013665 | mae 0.070599 -[2024/06/24 06:39:35] ppsci INFO: epoch: 504, train_loss: 0.039978, train_metric: 0.147500, eval_loss: 0.061900, eval_mae: 0.167284 -[2024/06/24 06:39:35] ppsci INFO: train: epoch 505 | step 0 | lr 0.000251 | loss 0.027885 | mae 0.121626 -[2024/06/24 06:39:36] ppsci INFO: train: epoch 505 | step 10 | lr 0.000251 | loss 0.032924 | mae 0.139210 -[2024/06/24 06:39:36] ppsci INFO: train: epoch 505 | step 20 | lr 0.000251 | loss 0.038139 | mae 0.149405 -[2024/06/24 06:39:37] ppsci INFO: train: epoch 505 | step 30 | lr 0.000251 | loss 0.036277 | mae 0.130377 -[2024/06/24 06:39:37] ppsci INFO: train: epoch 505 | step 38 | lr 0.000251 | loss 0.077689 | mae 0.214415 -[2024/06/24 06:39:37] ppsci INFO: epoch: 505, train_loss: 0.041733, train_metric: 0.148384, eval_loss: 0.062252, eval_mae: 0.160599 -[2024/06/24 06:39:37] ppsci INFO: train: epoch 506 | step 0 | lr 0.000250 | loss 0.032363 | mae 0.129061 -[2024/06/24 06:39:38] ppsci INFO: train: epoch 506 | step 10 | lr 0.000250 | loss 0.027420 | mae 0.130147 -[2024/06/24 06:39:38] ppsci INFO: train: epoch 506 | step 20 | lr 0.000250 | loss 0.030925 | mae 0.130755 -[2024/06/24 06:39:39] ppsci INFO: train: epoch 506 | step 30 | lr 0.000250 | loss 0.031174 | mae 0.137766 -[2024/06/24 06:39:39] ppsci INFO: train: epoch 506 | step 38 | lr 0.000250 | loss 0.071720 | mae 0.199392 -[2024/06/24 06:39:39] ppsci INFO: epoch: 506, train_loss: 0.041259, train_metric: 0.145238, eval_loss: 0.059865, eval_mae: 0.161874 -[2024/06/24 06:39:39] ppsci INFO: train: epoch 507 | step 0 | lr 0.000250 | loss 0.030903 | mae 0.131700 -[2024/06/24 06:39:40] ppsci INFO: train: epoch 507 | step 10 | lr 0.000250 | loss 0.043476 | mae 0.159437 -[2024/06/24 06:39:41] ppsci INFO: train: epoch 507 | step 20 | lr 0.000250 | loss 0.045180 | mae 0.147769 -[2024/06/24 06:39:41] ppsci INFO: train: epoch 507 | step 30 | lr 0.000250 | loss 0.035045 | mae 0.132005 -[2024/06/24 06:39:41] ppsci INFO: train: epoch 507 | step 38 | lr 0.000250 | loss 0.070474 | mae 0.211737 -[2024/06/24 06:39:42] ppsci INFO: epoch: 507, train_loss: 0.042282, train_metric: 0.148248, eval_loss: 0.057518, eval_mae: 0.157575 -[2024/06/24 06:39:42] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:39:42] ppsci INFO: train: epoch 508 | step 0 | lr 0.000249 | loss 0.050441 | mae 0.154488 -[2024/06/24 06:39:42] ppsci INFO: train: epoch 508 | step 10 | lr 0.000249 | loss 0.038247 | mae 0.141851 -[2024/06/24 06:39:43] ppsci INFO: train: epoch 508 | step 20 | lr 0.000249 | loss 0.039695 | mae 0.144259 -[2024/06/24 06:39:43] ppsci INFO: train: epoch 508 | step 30 | lr 0.000249 | loss 0.058989 | mae 0.148278 -[2024/06/24 06:39:44] ppsci INFO: train: epoch 508 | step 38 | lr 0.000249 | loss 0.012790 | mae 0.097706 -[2024/06/24 06:39:44] ppsci INFO: epoch: 508, train_loss: 0.037671, train_metric: 0.141982, eval_loss: 0.058954, eval_mae: 0.161549 -[2024/06/24 06:39:44] ppsci INFO: train: epoch 509 | step 0 | lr 0.000248 | loss 0.032239 | mae 0.137869 -[2024/06/24 06:39:44] ppsci INFO: train: epoch 509 | step 10 | lr 0.000248 | loss 0.046019 | mae 0.147204 -[2024/06/24 06:39:45] ppsci INFO: train: epoch 509 | step 20 | lr 0.000248 | loss 0.029294 | mae 0.124739 -[2024/06/24 06:39:46] ppsci INFO: train: epoch 509 | step 30 | lr 0.000248 | loss 0.036981 | mae 0.143816 -[2024/06/24 06:39:46] ppsci INFO: train: epoch 509 | step 38 | lr 0.000248 | loss 0.033871 | mae 0.152961 -[2024/06/24 06:39:46] ppsci INFO: epoch: 509, train_loss: 0.039029, train_metric: 0.145013, eval_loss: 0.059459, eval_mae: 0.162739 -[2024/06/24 06:39:46] ppsci INFO: train: epoch 510 | step 0 | lr 0.000247 | loss 0.048686 | mae 0.151999 -[2024/06/24 06:39:47] ppsci INFO: train: epoch 510 | step 10 | lr 0.000247 | loss 0.037737 | mae 0.144495 -[2024/06/24 06:39:47] ppsci INFO: train: epoch 510 | step 20 | lr 0.000247 | loss 0.030275 | mae 0.134752 -[2024/06/24 06:39:48] ppsci INFO: train: epoch 510 | step 30 | lr 0.000247 | loss 0.035060 | mae 0.146214 -[2024/06/24 06:39:48] ppsci INFO: train: epoch 510 | step 38 | lr 0.000247 | loss 0.094518 | mae 0.183523 -[2024/06/24 06:39:48] ppsci INFO: epoch: 510, train_loss: 0.040530, train_metric: 0.146782, eval_loss: 0.063141, eval_mae: 0.166438 -[2024/06/24 06:39:48] ppsci INFO: train: epoch 511 | step 0 | lr 0.000247 | loss 0.032854 | mae 0.130476 -[2024/06/24 06:39:49] ppsci INFO: train: epoch 511 | step 10 | lr 0.000247 | loss 0.048765 | mae 0.155899 -[2024/06/24 06:39:49] ppsci INFO: train: epoch 511 | step 20 | lr 0.000247 | loss 0.026236 | mae 0.121793 -[2024/06/24 06:39:50] ppsci INFO: train: epoch 511 | step 30 | lr 0.000247 | loss 0.036990 | mae 0.144069 -[2024/06/24 06:39:50] ppsci INFO: train: epoch 511 | step 38 | lr 0.000247 | loss 0.050784 | mae 0.167665 -[2024/06/24 06:39:50] ppsci INFO: epoch: 511, train_loss: 0.039486, train_metric: 0.141950, eval_loss: 0.060656, eval_mae: 0.159506 -[2024/06/24 06:39:50] ppsci INFO: train: epoch 512 | step 0 | lr 0.000246 | loss 0.035265 | mae 0.139871 -[2024/06/24 06:39:51] ppsci INFO: train: epoch 512 | step 10 | lr 0.000246 | loss 0.034558 | mae 0.126505 -[2024/06/24 06:39:52] ppsci INFO: train: epoch 512 | step 20 | lr 0.000246 | loss 0.037715 | mae 0.146261 -[2024/06/24 06:39:52] ppsci INFO: train: epoch 512 | step 30 | lr 0.000246 | loss 0.032749 | mae 0.138110 -[2024/06/24 06:39:52] ppsci INFO: train: epoch 512 | step 38 | lr 0.000246 | loss 0.023115 | mae 0.118808 -[2024/06/24 06:39:53] ppsci INFO: epoch: 512, train_loss: 0.038153, train_metric: 0.143573, eval_loss: 0.060625, eval_mae: 0.163100 -[2024/06/24 06:39:53] ppsci INFO: train: epoch 513 | step 0 | lr 0.000245 | loss 0.044367 | mae 0.157758 -[2024/06/24 06:39:53] ppsci INFO: train: epoch 513 | step 10 | lr 0.000245 | loss 0.027485 | mae 0.128208 -[2024/06/24 06:39:54] ppsci INFO: train: epoch 513 | step 20 | lr 0.000245 | loss 0.047667 | mae 0.150562 -[2024/06/24 06:39:54] ppsci INFO: train: epoch 513 | step 30 | lr 0.000245 | loss 0.032904 | mae 0.136896 -[2024/06/24 06:39:55] ppsci INFO: train: epoch 513 | step 38 | lr 0.000245 | loss 0.026747 | mae 0.127950 -[2024/06/24 06:39:55] ppsci INFO: epoch: 513, train_loss: 0.040235, train_metric: 0.145307, eval_loss: 0.057275, eval_mae: 0.156368 -[2024/06/24 06:39:55] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:39:55] ppsci INFO: train: epoch 514 | step 0 | lr 0.000244 | loss 0.034222 | mae 0.141273 -[2024/06/24 06:39:55] ppsci INFO: train: epoch 514 | step 10 | lr 0.000244 | loss 0.043929 | mae 0.153887 -[2024/06/24 06:39:56] ppsci INFO: train: epoch 514 | step 20 | lr 0.000244 | loss 0.043648 | mae 0.153125 -[2024/06/24 06:39:56] ppsci INFO: train: epoch 514 | step 30 | lr 0.000244 | loss 0.039705 | mae 0.138198 -[2024/06/24 06:39:57] ppsci INFO: train: epoch 514 | step 38 | lr 0.000244 | loss 0.031336 | mae 0.125611 -[2024/06/24 06:39:57] ppsci INFO: epoch: 514, train_loss: 0.037611, train_metric: 0.141831, eval_loss: 0.062479, eval_mae: 0.162468 -[2024/06/24 06:39:57] ppsci INFO: train: epoch 515 | step 0 | lr 0.000243 | loss 0.086387 | mae 0.166547 -[2024/06/24 06:39:57] ppsci INFO: train: epoch 515 | step 10 | lr 0.000243 | loss 0.036987 | mae 0.140483 -[2024/06/24 06:39:58] ppsci INFO: train: epoch 515 | step 20 | lr 0.000243 | loss 0.029814 | mae 0.126467 -[2024/06/24 06:39:58] ppsci INFO: train: epoch 515 | step 30 | lr 0.000243 | loss 0.034029 | mae 0.133924 -[2024/06/24 06:39:59] ppsci INFO: train: epoch 515 | step 38 | lr 0.000243 | loss 0.008630 | mae 0.075019 -[2024/06/24 06:39:59] ppsci INFO: epoch: 515, train_loss: 0.038277, train_metric: 0.142133, eval_loss: 0.063102, eval_mae: 0.163237 -[2024/06/24 06:39:59] ppsci INFO: train: epoch 516 | step 0 | lr 0.000243 | loss 0.038796 | mae 0.145902 -[2024/06/24 06:40:00] ppsci INFO: train: epoch 516 | step 10 | lr 0.000243 | loss 0.041618 | mae 0.148808 -[2024/06/24 06:40:00] ppsci INFO: train: epoch 516 | step 20 | lr 0.000243 | loss 0.051006 | mae 0.158630 -[2024/06/24 06:40:01] ppsci INFO: train: epoch 516 | step 30 | lr 0.000243 | loss 0.035811 | mae 0.139772 -[2024/06/24 06:40:01] ppsci INFO: train: epoch 516 | step 38 | lr 0.000243 | loss 0.033625 | mae 0.137556 -[2024/06/24 06:40:01] ppsci INFO: epoch: 516, train_loss: 0.041658, train_metric: 0.145951, eval_loss: 0.066595, eval_mae: 0.163771 -[2024/06/24 06:40:01] ppsci INFO: train: epoch 517 | step 0 | lr 0.000242 | loss 0.039808 | mae 0.147123 -[2024/06/24 06:40:02] ppsci INFO: train: epoch 517 | step 10 | lr 0.000242 | loss 0.030936 | mae 0.130964 -[2024/06/24 06:40:02] ppsci INFO: train: epoch 517 | step 20 | lr 0.000242 | loss 0.041654 | mae 0.141408 -[2024/06/24 06:40:03] ppsci INFO: train: epoch 517 | step 30 | lr 0.000242 | loss 0.041250 | mae 0.153501 -[2024/06/24 06:40:03] ppsci INFO: train: epoch 517 | step 38 | lr 0.000242 | loss 0.017849 | mae 0.101074 -[2024/06/24 06:40:03] ppsci INFO: epoch: 517, train_loss: 0.041379, train_metric: 0.146170, eval_loss: 0.060596, eval_mae: 0.161218 -[2024/06/24 06:40:03] ppsci INFO: train: epoch 518 | step 0 | lr 0.000241 | loss 0.035588 | mae 0.146262 -[2024/06/24 06:40:04] ppsci INFO: train: epoch 518 | step 10 | lr 0.000241 | loss 0.028277 | mae 0.125864 -[2024/06/24 06:40:05] ppsci INFO: train: epoch 518 | step 20 | lr 0.000241 | loss 0.032914 | mae 0.144160 -[2024/06/24 06:40:05] ppsci INFO: train: epoch 518 | step 30 | lr 0.000241 | loss 0.036624 | mae 0.146969 -[2024/06/24 06:40:05] ppsci INFO: train: epoch 518 | step 38 | lr 0.000241 | loss 0.017872 | mae 0.118270 -[2024/06/24 06:40:06] ppsci INFO: epoch: 518, train_loss: 0.037592, train_metric: 0.141808, eval_loss: 0.062726, eval_mae: 0.158675 -[2024/06/24 06:40:06] ppsci INFO: train: epoch 519 | step 0 | lr 0.000240 | loss 0.025349 | mae 0.118077 -[2024/06/24 06:40:06] ppsci INFO: train: epoch 519 | step 10 | lr 0.000240 | loss 0.026195 | mae 0.123589 -[2024/06/24 06:40:07] ppsci INFO: train: epoch 519 | step 20 | lr 0.000240 | loss 0.034052 | mae 0.135322 -[2024/06/24 06:40:07] ppsci INFO: train: epoch 519 | step 30 | lr 0.000240 | loss 0.047913 | mae 0.150331 -[2024/06/24 06:40:08] ppsci INFO: train: epoch 519 | step 38 | lr 0.000240 | loss 0.045350 | mae 0.136955 -[2024/06/24 06:40:08] ppsci INFO: epoch: 519, train_loss: 0.037520, train_metric: 0.141460, eval_loss: 0.063379, eval_mae: 0.161783 -[2024/06/24 06:40:08] ppsci INFO: train: epoch 520 | step 0 | lr 0.000240 | loss 0.038916 | mae 0.148596 -[2024/06/24 06:40:08] ppsci INFO: train: epoch 520 | step 10 | lr 0.000240 | loss 0.037548 | mae 0.142429 -[2024/06/24 06:40:09] ppsci INFO: train: epoch 520 | step 20 | lr 0.000240 | loss 0.043517 | mae 0.147088 -[2024/06/24 06:40:09] ppsci INFO: train: epoch 520 | step 30 | lr 0.000240 | loss 0.036126 | mae 0.133994 -[2024/06/24 06:40:10] ppsci INFO: train: epoch 520 | step 38 | lr 0.000240 | loss 0.102267 | mae 0.220803 -[2024/06/24 06:40:10] ppsci INFO: epoch: 520, train_loss: 0.041061, train_metric: 0.144770, eval_loss: 0.064421, eval_mae: 0.166015 -[2024/06/24 06:40:10] ppsci INFO: train: epoch 521 | step 0 | lr 0.000239 | loss 0.038069 | mae 0.140399 -[2024/06/24 06:40:10] ppsci INFO: train: epoch 521 | step 10 | lr 0.000239 | loss 0.032041 | mae 0.139912 -[2024/06/24 06:40:11] ppsci INFO: train: epoch 521 | step 20 | lr 0.000239 | loss 0.044669 | mae 0.148575 -[2024/06/24 06:40:12] ppsci INFO: train: epoch 521 | step 30 | lr 0.000239 | loss 0.031205 | mae 0.128657 -[2024/06/24 06:40:12] ppsci INFO: train: epoch 521 | step 38 | lr 0.000239 | loss 0.022300 | mae 0.114633 -[2024/06/24 06:40:12] ppsci INFO: epoch: 521, train_loss: 0.039498, train_metric: 0.145082, eval_loss: 0.061197, eval_mae: 0.163456 -[2024/06/24 06:40:12] ppsci INFO: train: epoch 522 | step 0 | lr 0.000238 | loss 0.043248 | mae 0.156163 -[2024/06/24 06:40:13] ppsci INFO: train: epoch 522 | step 10 | lr 0.000238 | loss 0.031496 | mae 0.141349 -[2024/06/24 06:40:13] ppsci INFO: train: epoch 522 | step 20 | lr 0.000238 | loss 0.029931 | mae 0.129754 -[2024/06/24 06:40:14] ppsci INFO: train: epoch 522 | step 30 | lr 0.000238 | loss 0.044091 | mae 0.163818 -[2024/06/24 06:40:14] ppsci INFO: train: epoch 522 | step 38 | lr 0.000238 | loss 0.043094 | mae 0.136816 -[2024/06/24 06:40:14] ppsci INFO: epoch: 522, train_loss: 0.042771, train_metric: 0.147812, eval_loss: 0.062596, eval_mae: 0.164384 -[2024/06/24 06:40:14] ppsci INFO: train: epoch 523 | step 0 | lr 0.000237 | loss 0.047445 | mae 0.154813 -[2024/06/24 06:40:15] ppsci INFO: train: epoch 523 | step 10 | lr 0.000237 | loss 0.047443 | mae 0.155004 -[2024/06/24 06:40:15] ppsci INFO: train: epoch 523 | step 20 | lr 0.000237 | loss 0.035221 | mae 0.145055 -[2024/06/24 06:40:16] ppsci INFO: train: epoch 523 | step 30 | lr 0.000237 | loss 0.032056 | mae 0.133722 -[2024/06/24 06:40:16] ppsci INFO: train: epoch 523 | step 38 | lr 0.000237 | loss 0.047578 | mae 0.183190 -[2024/06/24 06:40:16] ppsci INFO: epoch: 523, train_loss: 0.037701, train_metric: 0.142678, eval_loss: 0.057807, eval_mae: 0.161513 -[2024/06/24 06:40:17] ppsci INFO: train: epoch 524 | step 0 | lr 0.000237 | loss 0.037777 | mae 0.149198 -[2024/06/24 06:40:17] ppsci INFO: train: epoch 524 | step 10 | lr 0.000237 | loss 0.036047 | mae 0.141618 -[2024/06/24 06:40:18] ppsci INFO: train: epoch 524 | step 20 | lr 0.000237 | loss 0.036976 | mae 0.140582 -[2024/06/24 06:40:18] ppsci INFO: train: epoch 524 | step 30 | lr 0.000237 | loss 0.054838 | mae 0.161644 -[2024/06/24 06:40:18] ppsci INFO: train: epoch 524 | step 38 | lr 0.000237 | loss 0.047865 | mae 0.132419 -[2024/06/24 06:40:19] ppsci INFO: epoch: 524, train_loss: 0.038438, train_metric: 0.143134, eval_loss: 0.064361, eval_mae: 0.167647 -[2024/06/24 06:40:19] ppsci INFO: train: epoch 525 | step 0 | lr 0.000236 | loss 0.038887 | mae 0.147593 -[2024/06/24 06:40:19] ppsci INFO: train: epoch 525 | step 10 | lr 0.000236 | loss 0.040970 | mae 0.155944 -[2024/06/24 06:40:20] ppsci INFO: train: epoch 525 | step 20 | lr 0.000236 | loss 0.041355 | mae 0.143359 -[2024/06/24 06:40:20] ppsci INFO: train: epoch 525 | step 30 | lr 0.000236 | loss 0.036518 | mae 0.151141 -[2024/06/24 06:40:21] ppsci INFO: train: epoch 525 | step 38 | lr 0.000236 | loss 0.065331 | mae 0.145983 -[2024/06/24 06:40:21] ppsci INFO: epoch: 525, train_loss: 0.041139, train_metric: 0.144355, eval_loss: 0.066951, eval_mae: 0.168428 -[2024/06/24 06:40:21] ppsci INFO: train: epoch 526 | step 0 | lr 0.000235 | loss 0.030943 | mae 0.134014 -[2024/06/24 06:40:21] ppsci INFO: train: epoch 526 | step 10 | lr 0.000235 | loss 0.034834 | mae 0.138645 -[2024/06/24 06:40:22] ppsci INFO: train: epoch 526 | step 20 | lr 0.000235 | loss 0.044251 | mae 0.156466 -[2024/06/24 06:40:22] ppsci INFO: train: epoch 526 | step 30 | lr 0.000235 | loss 0.052131 | mae 0.157448 -[2024/06/24 06:40:23] ppsci INFO: train: epoch 526 | step 38 | lr 0.000235 | loss 0.098205 | mae 0.223539 -[2024/06/24 06:40:23] ppsci INFO: epoch: 526, train_loss: 0.040047, train_metric: 0.142557, eval_loss: 0.060642, eval_mae: 0.162373 -[2024/06/24 06:40:23] ppsci INFO: train: epoch 527 | step 0 | lr 0.000234 | loss 0.035595 | mae 0.144901 -[2024/06/24 06:40:23] ppsci INFO: train: epoch 527 | step 10 | lr 0.000234 | loss 0.033468 | mae 0.135891 -[2024/06/24 06:40:24] ppsci INFO: train: epoch 527 | step 20 | lr 0.000234 | loss 0.053497 | mae 0.160785 -[2024/06/24 06:40:24] ppsci INFO: train: epoch 527 | step 30 | lr 0.000234 | loss 0.047790 | mae 0.153485 -[2024/06/24 06:40:25] ppsci INFO: train: epoch 527 | step 38 | lr 0.000234 | loss 0.024043 | mae 0.126337 -[2024/06/24 06:40:25] ppsci INFO: epoch: 527, train_loss: 0.037698, train_metric: 0.142726, eval_loss: 0.064550, eval_mae: 0.163238 -[2024/06/24 06:40:25] ppsci INFO: train: epoch 528 | step 0 | lr 0.000233 | loss 0.035656 | mae 0.135821 -[2024/06/24 06:40:25] ppsci INFO: train: epoch 528 | step 10 | lr 0.000233 | loss 0.032987 | mae 0.142650 -[2024/06/24 06:40:26] ppsci INFO: train: epoch 528 | step 20 | lr 0.000233 | loss 0.032274 | mae 0.140182 -[2024/06/24 06:40:26] ppsci INFO: train: epoch 528 | step 30 | lr 0.000233 | loss 0.054141 | mae 0.173258 -[2024/06/24 06:40:27] ppsci INFO: train: epoch 528 | step 38 | lr 0.000233 | loss 0.054936 | mae 0.153957 -[2024/06/24 06:40:27] ppsci INFO: epoch: 528, train_loss: 0.039946, train_metric: 0.144945, eval_loss: 0.062129, eval_mae: 0.167907 -[2024/06/24 06:40:27] ppsci INFO: train: epoch 529 | step 0 | lr 0.000233 | loss 0.028317 | mae 0.120593 -[2024/06/24 06:40:28] ppsci INFO: train: epoch 529 | step 10 | lr 0.000233 | loss 0.044191 | mae 0.151306 -[2024/06/24 06:40:28] ppsci INFO: train: epoch 529 | step 20 | lr 0.000233 | loss 0.037630 | mae 0.131737 -[2024/06/24 06:40:29] ppsci INFO: train: epoch 529 | step 30 | lr 0.000233 | loss 0.038211 | mae 0.151575 -[2024/06/24 06:40:29] ppsci INFO: train: epoch 529 | step 38 | lr 0.000233 | loss 0.035849 | mae 0.146003 -[2024/06/24 06:40:29] ppsci INFO: epoch: 529, train_loss: 0.041217, train_metric: 0.145471, eval_loss: 0.061121, eval_mae: 0.162057 -[2024/06/24 06:40:29] ppsci INFO: train: epoch 530 | step 0 | lr 0.000232 | loss 0.031656 | mae 0.136672 -[2024/06/24 06:40:30] ppsci INFO: train: epoch 530 | step 10 | lr 0.000232 | loss 0.029315 | mae 0.134002 -[2024/06/24 06:40:30] ppsci INFO: train: epoch 530 | step 20 | lr 0.000232 | loss 0.037466 | mae 0.147221 -[2024/06/24 06:40:31] ppsci INFO: train: epoch 530 | step 30 | lr 0.000232 | loss 0.035108 | mae 0.146541 -[2024/06/24 06:40:31] ppsci INFO: train: epoch 530 | step 38 | lr 0.000232 | loss 0.022116 | mae 0.118683 -[2024/06/24 06:40:31] ppsci INFO: epoch: 530, train_loss: 0.038513, train_metric: 0.142775, eval_loss: 0.064056, eval_mae: 0.164493 -[2024/06/24 06:40:31] ppsci INFO: train: epoch 531 | step 0 | lr 0.000231 | loss 0.038661 | mae 0.151826 -[2024/06/24 06:40:32] ppsci INFO: train: epoch 531 | step 10 | lr 0.000231 | loss 0.037649 | mae 0.152105 -[2024/06/24 06:40:32] ppsci INFO: train: epoch 531 | step 20 | lr 0.000231 | loss 0.032023 | mae 0.134585 -[2024/06/24 06:40:33] ppsci INFO: train: epoch 531 | step 30 | lr 0.000231 | loss 0.028544 | mae 0.126742 -[2024/06/24 06:40:33] ppsci INFO: train: epoch 531 | step 38 | lr 0.000231 | loss 0.020186 | mae 0.111221 -[2024/06/24 06:40:33] ppsci INFO: epoch: 531, train_loss: 0.037912, train_metric: 0.141350, eval_loss: 0.062675, eval_mae: 0.165506 -[2024/06/24 06:40:33] ppsci INFO: train: epoch 532 | step 0 | lr 0.000230 | loss 0.035066 | mae 0.139152 -[2024/06/24 06:40:34] ppsci INFO: train: epoch 532 | step 10 | lr 0.000230 | loss 0.045143 | mae 0.147286 -[2024/06/24 06:40:35] ppsci INFO: train: epoch 532 | step 20 | lr 0.000230 | loss 0.047881 | mae 0.141569 -[2024/06/24 06:40:35] ppsci INFO: train: epoch 532 | step 30 | lr 0.000230 | loss 0.035569 | mae 0.146219 -[2024/06/24 06:40:36] ppsci INFO: train: epoch 532 | step 38 | lr 0.000230 | loss 0.071827 | mae 0.190522 -[2024/06/24 06:40:36] ppsci INFO: epoch: 532, train_loss: 0.039849, train_metric: 0.142325, eval_loss: 0.065788, eval_mae: 0.162441 -[2024/06/24 06:40:36] ppsci INFO: train: epoch 533 | step 0 | lr 0.000230 | loss 0.033912 | mae 0.128065 -[2024/06/24 06:40:36] ppsci INFO: train: epoch 533 | step 10 | lr 0.000230 | loss 0.034737 | mae 0.146487 -[2024/06/24 06:40:37] ppsci INFO: train: epoch 533 | step 20 | lr 0.000230 | loss 0.043073 | mae 0.151744 -[2024/06/24 06:40:38] ppsci INFO: train: epoch 533 | step 30 | lr 0.000230 | loss 0.045701 | mae 0.144482 -[2024/06/24 06:40:38] ppsci INFO: train: epoch 533 | step 38 | lr 0.000230 | loss 0.036033 | mae 0.140802 -[2024/06/24 06:40:38] ppsci INFO: epoch: 533, train_loss: 0.040161, train_metric: 0.144399, eval_loss: 0.058835, eval_mae: 0.159842 -[2024/06/24 06:40:38] ppsci INFO: train: epoch 534 | step 0 | lr 0.000229 | loss 0.039603 | mae 0.151263 -[2024/06/24 06:40:39] ppsci INFO: train: epoch 534 | step 10 | lr 0.000229 | loss 0.038419 | mae 0.140004 -[2024/06/24 06:40:39] ppsci INFO: train: epoch 534 | step 20 | lr 0.000229 | loss 0.045093 | mae 0.150268 -[2024/06/24 06:40:40] ppsci INFO: train: epoch 534 | step 30 | lr 0.000229 | loss 0.048304 | mae 0.147840 -[2024/06/24 06:40:40] ppsci INFO: train: epoch 534 | step 38 | lr 0.000229 | loss 0.038654 | mae 0.145230 -[2024/06/24 06:40:40] ppsci INFO: epoch: 534, train_loss: 0.039957, train_metric: 0.144333, eval_loss: 0.065632, eval_mae: 0.167815 -[2024/06/24 06:40:40] ppsci INFO: train: epoch 535 | step 0 | lr 0.000228 | loss 0.043074 | mae 0.147447 -[2024/06/24 06:40:41] ppsci INFO: train: epoch 535 | step 10 | lr 0.000228 | loss 0.030520 | mae 0.125014 -[2024/06/24 06:40:41] ppsci INFO: train: epoch 535 | step 20 | lr 0.000228 | loss 0.046001 | mae 0.157097 -[2024/06/24 06:40:42] ppsci INFO: train: epoch 535 | step 30 | lr 0.000228 | loss 0.078182 | mae 0.186041 -[2024/06/24 06:40:42] ppsci INFO: train: epoch 535 | step 38 | lr 0.000228 | loss 0.008659 | mae 0.070227 -[2024/06/24 06:40:42] ppsci INFO: epoch: 535, train_loss: 0.052453, train_metric: 0.156470, eval_loss: 0.067263, eval_mae: 0.169937 -[2024/06/24 06:40:42] ppsci INFO: train: epoch 536 | step 0 | lr 0.000227 | loss 0.055785 | mae 0.164771 -[2024/06/24 06:40:43] ppsci INFO: train: epoch 536 | step 10 | lr 0.000227 | loss 0.048240 | mae 0.163764 -[2024/06/24 06:40:43] ppsci INFO: train: epoch 536 | step 20 | lr 0.000227 | loss 0.028498 | mae 0.127268 -[2024/06/24 06:40:44] ppsci INFO: train: epoch 536 | step 30 | lr 0.000227 | loss 0.037559 | mae 0.150815 -[2024/06/24 06:40:44] ppsci INFO: train: epoch 536 | step 38 | lr 0.000227 | loss 0.023861 | mae 0.130048 -[2024/06/24 06:40:44] ppsci INFO: epoch: 536, train_loss: 0.041246, train_metric: 0.145485, eval_loss: 0.063058, eval_mae: 0.168674 -[2024/06/24 06:40:44] ppsci INFO: train: epoch 537 | step 0 | lr 0.000227 | loss 0.043549 | mae 0.152217 -[2024/06/24 06:40:45] ppsci INFO: train: epoch 537 | step 10 | lr 0.000227 | loss 0.033631 | mae 0.133284 -[2024/06/24 06:40:45] ppsci INFO: train: epoch 537 | step 20 | lr 0.000227 | loss 0.042072 | mae 0.141299 -[2024/06/24 06:40:46] ppsci INFO: train: epoch 537 | step 30 | lr 0.000227 | loss 0.038051 | mae 0.137814 -[2024/06/24 06:40:46] ppsci INFO: train: epoch 537 | step 38 | lr 0.000227 | loss 0.018462 | mae 0.107010 -[2024/06/24 06:40:46] ppsci INFO: epoch: 537, train_loss: 0.040008, train_metric: 0.146579, eval_loss: 0.062355, eval_mae: 0.165551 -[2024/06/24 06:40:47] ppsci INFO: train: epoch 538 | step 0 | lr 0.000226 | loss 0.030318 | mae 0.122597 -[2024/06/24 06:40:47] ppsci INFO: train: epoch 538 | step 10 | lr 0.000226 | loss 0.036454 | mae 0.140733 -[2024/06/24 06:40:48] ppsci INFO: train: epoch 538 | step 20 | lr 0.000226 | loss 0.024883 | mae 0.119396 -[2024/06/24 06:40:48] ppsci INFO: train: epoch 538 | step 30 | lr 0.000226 | loss 0.034750 | mae 0.133505 -[2024/06/24 06:40:48] ppsci INFO: train: epoch 538 | step 38 | lr 0.000226 | loss 0.031174 | mae 0.141470 -[2024/06/24 06:40:49] ppsci INFO: epoch: 538, train_loss: 0.037497, train_metric: 0.141667, eval_loss: 0.061250, eval_mae: 0.165081 -[2024/06/24 06:40:49] ppsci INFO: train: epoch 539 | step 0 | lr 0.000225 | loss 0.049220 | mae 0.150992 -[2024/06/24 06:40:49] ppsci INFO: train: epoch 539 | step 10 | lr 0.000225 | loss 0.031997 | mae 0.130069 -[2024/06/24 06:40:50] ppsci INFO: train: epoch 539 | step 20 | lr 0.000225 | loss 0.045079 | mae 0.151732 -[2024/06/24 06:40:50] ppsci INFO: train: epoch 539 | step 30 | lr 0.000225 | loss 0.030567 | mae 0.132933 -[2024/06/24 06:40:51] ppsci INFO: train: epoch 539 | step 38 | lr 0.000225 | loss 0.029234 | mae 0.133333 -[2024/06/24 06:40:51] ppsci INFO: epoch: 539, train_loss: 0.039852, train_metric: 0.143124, eval_loss: 0.065002, eval_mae: 0.164719 -[2024/06/24 06:40:51] ppsci INFO: train: epoch 540 | step 0 | lr 0.000224 | loss 0.036641 | mae 0.137673 -[2024/06/24 06:40:51] ppsci INFO: train: epoch 540 | step 10 | lr 0.000224 | loss 0.037676 | mae 0.140893 -[2024/06/24 06:40:52] ppsci INFO: train: epoch 540 | step 20 | lr 0.000224 | loss 0.037018 | mae 0.144558 -[2024/06/24 06:40:52] ppsci INFO: train: epoch 540 | step 30 | lr 0.000224 | loss 0.038267 | mae 0.146543 -[2024/06/24 06:40:53] ppsci INFO: train: epoch 540 | step 38 | lr 0.000224 | loss 0.156958 | mae 0.212748 -[2024/06/24 06:40:53] ppsci INFO: epoch: 540, train_loss: 0.039061, train_metric: 0.140639, eval_loss: 0.064726, eval_mae: 0.167248 -[2024/06/24 06:40:53] ppsci INFO: train: epoch 541 | step 0 | lr 0.000224 | loss 0.044079 | mae 0.151416 -[2024/06/24 06:40:54] ppsci INFO: train: epoch 541 | step 10 | lr 0.000224 | loss 0.035265 | mae 0.140183 -[2024/06/24 06:40:54] ppsci INFO: train: epoch 541 | step 20 | lr 0.000224 | loss 0.095264 | mae 0.166184 -[2024/06/24 06:40:55] ppsci INFO: train: epoch 541 | step 30 | lr 0.000224 | loss 0.030861 | mae 0.129970 -[2024/06/24 06:40:55] ppsci INFO: train: epoch 541 | step 38 | lr 0.000224 | loss 0.055599 | mae 0.196904 -[2024/06/24 06:40:56] ppsci INFO: epoch: 541, train_loss: 0.040639, train_metric: 0.143759, eval_loss: 0.062204, eval_mae: 0.162323 -[2024/06/24 06:40:56] ppsci INFO: train: epoch 542 | step 0 | lr 0.000223 | loss 0.025197 | mae 0.120144 -[2024/06/24 06:40:56] ppsci INFO: train: epoch 542 | step 10 | lr 0.000223 | loss 0.046422 | mae 0.155729 -[2024/06/24 06:40:57] ppsci INFO: train: epoch 542 | step 20 | lr 0.000223 | loss 0.025917 | mae 0.119971 -[2024/06/24 06:40:57] ppsci INFO: train: epoch 542 | step 30 | lr 0.000223 | loss 0.037129 | mae 0.145098 -[2024/06/24 06:40:58] ppsci INFO: train: epoch 542 | step 38 | lr 0.000223 | loss 0.089558 | mae 0.213571 -[2024/06/24 06:40:58] ppsci INFO: epoch: 542, train_loss: 0.038529, train_metric: 0.140072, eval_loss: 0.061190, eval_mae: 0.161684 -[2024/06/24 06:40:58] ppsci INFO: train: epoch 543 | step 0 | lr 0.000222 | loss 0.036167 | mae 0.140607 -[2024/06/24 06:40:58] ppsci INFO: train: epoch 543 | step 10 | lr 0.000222 | loss 0.039242 | mae 0.147097 -[2024/06/24 06:40:59] ppsci INFO: train: epoch 543 | step 20 | lr 0.000222 | loss 0.028279 | mae 0.124734 -[2024/06/24 06:41:00] ppsci INFO: train: epoch 543 | step 30 | lr 0.000222 | loss 0.027139 | mae 0.123200 -[2024/06/24 06:41:00] ppsci INFO: train: epoch 543 | step 38 | lr 0.000222 | loss 0.018446 | mae 0.112345 -[2024/06/24 06:41:00] ppsci INFO: epoch: 543, train_loss: 0.037719, train_metric: 0.142856, eval_loss: 0.061518, eval_mae: 0.160462 -[2024/06/24 06:41:00] ppsci INFO: train: epoch 544 | step 0 | lr 0.000221 | loss 0.032752 | mae 0.137356 -[2024/06/24 06:41:01] ppsci INFO: train: epoch 544 | step 10 | lr 0.000221 | loss 0.032043 | mae 0.138348 -[2024/06/24 06:41:01] ppsci INFO: train: epoch 544 | step 20 | lr 0.000221 | loss 0.036670 | mae 0.142276 -[2024/06/24 06:41:02] ppsci INFO: train: epoch 544 | step 30 | lr 0.000221 | loss 0.045124 | mae 0.147279 -[2024/06/24 06:41:02] ppsci INFO: train: epoch 544 | step 38 | lr 0.000221 | loss 0.023767 | mae 0.120748 -[2024/06/24 06:41:02] ppsci INFO: epoch: 544, train_loss: 0.039298, train_metric: 0.144353, eval_loss: 0.062049, eval_mae: 0.163544 -[2024/06/24 06:41:03] ppsci INFO: train: epoch 545 | step 0 | lr 0.000220 | loss 0.029056 | mae 0.130105 -[2024/06/24 06:41:03] ppsci INFO: train: epoch 545 | step 10 | lr 0.000220 | loss 0.049644 | mae 0.146500 -[2024/06/24 06:41:03] ppsci INFO: train: epoch 545 | step 20 | lr 0.000220 | loss 0.060006 | mae 0.158704 -[2024/06/24 06:41:04] ppsci INFO: train: epoch 545 | step 30 | lr 0.000220 | loss 0.047587 | mae 0.163247 -[2024/06/24 06:41:04] ppsci INFO: train: epoch 545 | step 38 | lr 0.000220 | loss 0.062731 | mae 0.213220 -[2024/06/24 06:41:04] ppsci INFO: epoch: 545, train_loss: 0.040276, train_metric: 0.144129, eval_loss: 0.059803, eval_mae: 0.158424 -[2024/06/24 06:41:05] ppsci INFO: train: epoch 546 | step 0 | lr 0.000220 | loss 0.031109 | mae 0.134381 -[2024/06/24 06:41:05] ppsci INFO: train: epoch 546 | step 10 | lr 0.000220 | loss 0.031618 | mae 0.133955 -[2024/06/24 06:41:06] ppsci INFO: train: epoch 546 | step 20 | lr 0.000220 | loss 0.034495 | mae 0.142227 -[2024/06/24 06:41:06] ppsci INFO: train: epoch 546 | step 30 | lr 0.000220 | loss 0.038671 | mae 0.152987 -[2024/06/24 06:41:07] ppsci INFO: train: epoch 546 | step 38 | lr 0.000220 | loss 0.069537 | mae 0.218649 -[2024/06/24 06:41:07] ppsci INFO: epoch: 546, train_loss: 0.039165, train_metric: 0.143190, eval_loss: 0.060250, eval_mae: 0.160084 -[2024/06/24 06:41:07] ppsci INFO: train: epoch 547 | step 0 | lr 0.000219 | loss 0.027572 | mae 0.123759 -[2024/06/24 06:41:07] ppsci INFO: train: epoch 547 | step 10 | lr 0.000219 | loss 0.043908 | mae 0.150520 -[2024/06/24 06:41:08] ppsci INFO: train: epoch 547 | step 20 | lr 0.000219 | loss 0.030844 | mae 0.135887 -[2024/06/24 06:41:08] ppsci INFO: train: epoch 547 | step 30 | lr 0.000219 | loss 0.032134 | mae 0.133973 -[2024/06/24 06:41:09] ppsci INFO: train: epoch 547 | step 38 | lr 0.000219 | loss 0.012518 | mae 0.076197 -[2024/06/24 06:41:09] ppsci INFO: epoch: 547, train_loss: 0.037871, train_metric: 0.142776, eval_loss: 0.062945, eval_mae: 0.162820 -[2024/06/24 06:41:09] ppsci INFO: train: epoch 548 | step 0 | lr 0.000218 | loss 0.042164 | mae 0.158071 -[2024/06/24 06:41:10] ppsci INFO: train: epoch 548 | step 10 | lr 0.000218 | loss 0.036838 | mae 0.146599 -[2024/06/24 06:41:10] ppsci INFO: train: epoch 548 | step 20 | lr 0.000218 | loss 0.032013 | mae 0.135042 -[2024/06/24 06:41:11] ppsci INFO: train: epoch 548 | step 30 | lr 0.000218 | loss 0.038831 | mae 0.140535 -[2024/06/24 06:41:11] ppsci INFO: train: epoch 548 | step 38 | lr 0.000218 | loss 0.026444 | mae 0.136735 -[2024/06/24 06:41:11] ppsci INFO: epoch: 548, train_loss: 0.037270, train_metric: 0.142055, eval_loss: 0.059211, eval_mae: 0.162361 -[2024/06/24 06:41:11] ppsci INFO: train: epoch 549 | step 0 | lr 0.000217 | loss 0.047419 | mae 0.142085 -[2024/06/24 06:41:12] ppsci INFO: train: epoch 549 | step 10 | lr 0.000217 | loss 0.034915 | mae 0.131576 -[2024/06/24 06:41:12] ppsci INFO: train: epoch 549 | step 20 | lr 0.000217 | loss 0.031582 | mae 0.134542 -[2024/06/24 06:41:13] ppsci INFO: train: epoch 549 | step 30 | lr 0.000217 | loss 0.031731 | mae 0.132846 -[2024/06/24 06:41:13] ppsci INFO: train: epoch 549 | step 38 | lr 0.000217 | loss 0.011046 | mae 0.087272 -[2024/06/24 06:41:13] ppsci INFO: epoch: 549, train_loss: 0.038536, train_metric: 0.142137, eval_loss: 0.060282, eval_mae: 0.162024 -[2024/06/24 06:41:13] ppsci INFO: train: epoch 550 | step 0 | lr 0.000217 | loss 0.034767 | mae 0.130609 -[2024/06/24 06:41:14] ppsci INFO: train: epoch 550 | step 10 | lr 0.000217 | loss 0.032922 | mae 0.142710 -[2024/06/24 06:41:14] ppsci INFO: train: epoch 550 | step 20 | lr 0.000217 | loss 0.038086 | mae 0.137653 -[2024/06/24 06:41:15] ppsci INFO: train: epoch 550 | step 30 | lr 0.000217 | loss 0.033767 | mae 0.140432 -[2024/06/24 06:41:15] ppsci INFO: train: epoch 550 | step 38 | lr 0.000217 | loss 0.026350 | mae 0.130634 -[2024/06/24 06:41:15] ppsci INFO: epoch: 550, train_loss: 0.036351, train_metric: 0.139748, eval_loss: 0.060134, eval_mae: 0.160029 -[2024/06/24 06:41:16] ppsci INFO: train: epoch 551 | step 0 | lr 0.000216 | loss 0.032690 | mae 0.129721 -[2024/06/24 06:41:16] ppsci INFO: train: epoch 551 | step 10 | lr 0.000216 | loss 0.030570 | mae 0.121837 -[2024/06/24 06:41:17] ppsci INFO: train: epoch 551 | step 20 | lr 0.000216 | loss 0.035842 | mae 0.141229 -[2024/06/24 06:41:17] ppsci INFO: train: epoch 551 | step 30 | lr 0.000216 | loss 0.041848 | mae 0.147919 -[2024/06/24 06:41:18] ppsci INFO: train: epoch 551 | step 38 | lr 0.000216 | loss 0.054771 | mae 0.149780 -[2024/06/24 06:41:18] ppsci INFO: epoch: 551, train_loss: 0.039264, train_metric: 0.141579, eval_loss: 0.059718, eval_mae: 0.161085 -[2024/06/24 06:41:18] ppsci INFO: train: epoch 552 | step 0 | lr 0.000215 | loss 0.033030 | mae 0.140386 -[2024/06/24 06:41:18] ppsci INFO: train: epoch 552 | step 10 | lr 0.000215 | loss 0.042889 | mae 0.156010 -[2024/06/24 06:41:19] ppsci INFO: train: epoch 552 | step 20 | lr 0.000215 | loss 0.032641 | mae 0.138169 -[2024/06/24 06:41:19] ppsci INFO: train: epoch 552 | step 30 | lr 0.000215 | loss 0.030261 | mae 0.127590 -[2024/06/24 06:41:20] ppsci INFO: train: epoch 552 | step 38 | lr 0.000215 | loss 0.035099 | mae 0.121639 -[2024/06/24 06:41:20] ppsci INFO: epoch: 552, train_loss: 0.037214, train_metric: 0.141571, eval_loss: 0.060088, eval_mae: 0.163044 -[2024/06/24 06:41:20] ppsci INFO: train: epoch 553 | step 0 | lr 0.000214 | loss 0.024937 | mae 0.113919 -[2024/06/24 06:41:21] ppsci INFO: train: epoch 553 | step 10 | lr 0.000214 | loss 0.048668 | mae 0.151735 -[2024/06/24 06:41:21] ppsci INFO: train: epoch 553 | step 20 | lr 0.000214 | loss 0.039629 | mae 0.147315 -[2024/06/24 06:41:22] ppsci INFO: train: epoch 553 | step 30 | lr 0.000214 | loss 0.043099 | mae 0.149650 -[2024/06/24 06:41:22] ppsci INFO: train: epoch 553 | step 38 | lr 0.000214 | loss 0.043845 | mae 0.143498 -[2024/06/24 06:41:22] ppsci INFO: epoch: 553, train_loss: 0.036447, train_metric: 0.139817, eval_loss: 0.062531, eval_mae: 0.165161 -[2024/06/24 06:41:22] ppsci INFO: train: epoch 554 | step 0 | lr 0.000214 | loss 0.044169 | mae 0.153879 -[2024/06/24 06:41:23] ppsci INFO: train: epoch 554 | step 10 | lr 0.000214 | loss 0.037403 | mae 0.140772 -[2024/06/24 06:41:23] ppsci INFO: train: epoch 554 | step 20 | lr 0.000214 | loss 0.029234 | mae 0.129181 -[2024/06/24 06:41:24] ppsci INFO: train: epoch 554 | step 30 | lr 0.000214 | loss 0.039936 | mae 0.142455 -[2024/06/24 06:41:24] ppsci INFO: train: epoch 554 | step 38 | lr 0.000214 | loss 0.030730 | mae 0.149648 -[2024/06/24 06:41:24] ppsci INFO: epoch: 554, train_loss: 0.038725, train_metric: 0.143497, eval_loss: 0.060431, eval_mae: 0.163637 -[2024/06/24 06:41:24] ppsci INFO: train: epoch 555 | step 0 | lr 0.000213 | loss 0.064133 | mae 0.176384 -[2024/06/24 06:41:25] ppsci INFO: train: epoch 555 | step 10 | lr 0.000213 | loss 0.044525 | mae 0.155959 -[2024/06/24 06:41:25] ppsci INFO: train: epoch 555 | step 20 | lr 0.000213 | loss 0.040210 | mae 0.142341 -[2024/06/24 06:41:26] ppsci INFO: train: epoch 555 | step 30 | lr 0.000213 | loss 0.055855 | mae 0.153160 -[2024/06/24 06:41:26] ppsci INFO: train: epoch 555 | step 38 | lr 0.000213 | loss 0.050664 | mae 0.187712 -[2024/06/24 06:41:26] ppsci INFO: epoch: 555, train_loss: 0.038563, train_metric: 0.141983, eval_loss: 0.060153, eval_mae: 0.158290 -[2024/06/24 06:41:27] ppsci INFO: train: epoch 556 | step 0 | lr 0.000212 | loss 0.033990 | mae 0.135342 -[2024/06/24 06:41:27] ppsci INFO: train: epoch 556 | step 10 | lr 0.000212 | loss 0.031327 | mae 0.135781 -[2024/06/24 06:41:28] ppsci INFO: train: epoch 556 | step 20 | lr 0.000212 | loss 0.034190 | mae 0.139841 -[2024/06/24 06:41:28] ppsci INFO: train: epoch 556 | step 30 | lr 0.000212 | loss 0.040782 | mae 0.140707 -[2024/06/24 06:41:28] ppsci INFO: train: epoch 556 | step 38 | lr 0.000212 | loss 0.020250 | mae 0.108867 -[2024/06/24 06:41:29] ppsci INFO: epoch: 556, train_loss: 0.036319, train_metric: 0.140799, eval_loss: 0.060521, eval_mae: 0.162523 -[2024/06/24 06:41:29] ppsci INFO: train: epoch 557 | step 0 | lr 0.000211 | loss 0.055136 | mae 0.143519 -[2024/06/24 06:41:29] ppsci INFO: train: epoch 557 | step 10 | lr 0.000211 | loss 0.047803 | mae 0.157390 -[2024/06/24 06:41:30] ppsci INFO: train: epoch 557 | step 20 | lr 0.000211 | loss 0.045227 | mae 0.145417 -[2024/06/24 06:41:30] ppsci INFO: train: epoch 557 | step 30 | lr 0.000211 | loss 0.034060 | mae 0.137883 -[2024/06/24 06:41:31] ppsci INFO: train: epoch 557 | step 38 | lr 0.000211 | loss 0.053041 | mae 0.185274 -[2024/06/24 06:41:31] ppsci INFO: epoch: 557, train_loss: 0.039090, train_metric: 0.142827, eval_loss: 0.061534, eval_mae: 0.160402 -[2024/06/24 06:41:31] ppsci INFO: train: epoch 558 | step 0 | lr 0.000211 | loss 0.024668 | mae 0.119712 -[2024/06/24 06:41:31] ppsci INFO: train: epoch 558 | step 10 | lr 0.000211 | loss 0.044154 | mae 0.147930 -[2024/06/24 06:41:32] ppsci INFO: train: epoch 558 | step 20 | lr 0.000211 | loss 0.050614 | mae 0.168089 -[2024/06/24 06:41:32] ppsci INFO: train: epoch 558 | step 30 | lr 0.000211 | loss 0.027328 | mae 0.126609 -[2024/06/24 06:41:33] ppsci INFO: train: epoch 558 | step 38 | lr 0.000211 | loss 0.017728 | mae 0.106567 -[2024/06/24 06:41:33] ppsci INFO: epoch: 558, train_loss: 0.036870, train_metric: 0.140889, eval_loss: 0.060383, eval_mae: 0.160804 -[2024/06/24 06:41:33] ppsci INFO: train: epoch 559 | step 0 | lr 0.000210 | loss 0.043451 | mae 0.159179 -[2024/06/24 06:41:33] ppsci INFO: train: epoch 559 | step 10 | lr 0.000210 | loss 0.033698 | mae 0.128692 -[2024/06/24 06:41:34] ppsci INFO: train: epoch 559 | step 20 | lr 0.000210 | loss 0.028796 | mae 0.133390 -[2024/06/24 06:41:35] ppsci INFO: train: epoch 559 | step 30 | lr 0.000210 | loss 0.046659 | mae 0.150586 -[2024/06/24 06:41:35] ppsci INFO: train: epoch 559 | step 38 | lr 0.000210 | loss 0.025361 | mae 0.122302 -[2024/06/24 06:41:35] ppsci INFO: epoch: 559, train_loss: 0.035642, train_metric: 0.138363, eval_loss: 0.063850, eval_mae: 0.161431 -[2024/06/24 06:41:35] ppsci INFO: train: epoch 560 | step 0 | lr 0.000209 | loss 0.034301 | mae 0.134845 -[2024/06/24 06:41:36] ppsci INFO: train: epoch 560 | step 10 | lr 0.000209 | loss 0.034403 | mae 0.140114 -[2024/06/24 06:41:36] ppsci INFO: train: epoch 560 | step 20 | lr 0.000209 | loss 0.030414 | mae 0.128446 -[2024/06/24 06:41:37] ppsci INFO: train: epoch 560 | step 30 | lr 0.000209 | loss 0.030486 | mae 0.133246 -[2024/06/24 06:41:37] ppsci INFO: train: epoch 560 | step 38 | lr 0.000209 | loss 0.010403 | mae 0.087894 -[2024/06/24 06:41:37] ppsci INFO: epoch: 560, train_loss: 0.037890, train_metric: 0.140051, eval_loss: 0.065652, eval_mae: 0.161946 -[2024/06/24 06:41:37] ppsci INFO: train: epoch 561 | step 0 | lr 0.000208 | loss 0.030206 | mae 0.131720 -[2024/06/24 06:41:38] ppsci INFO: train: epoch 561 | step 10 | lr 0.000208 | loss 0.035326 | mae 0.134113 -[2024/06/24 06:41:38] ppsci INFO: train: epoch 561 | step 20 | lr 0.000208 | loss 0.029792 | mae 0.130566 -[2024/06/24 06:41:39] ppsci INFO: train: epoch 561 | step 30 | lr 0.000208 | loss 0.028889 | mae 0.122169 -[2024/06/24 06:41:39] ppsci INFO: train: epoch 561 | step 38 | lr 0.000208 | loss 0.040660 | mae 0.167370 -[2024/06/24 06:41:39] ppsci INFO: epoch: 561, train_loss: 0.033987, train_metric: 0.136650, eval_loss: 0.061245, eval_mae: 0.159028 -[2024/06/24 06:41:39] ppsci INFO: train: epoch 562 | step 0 | lr 0.000208 | loss 0.033376 | mae 0.142807 -[2024/06/24 06:41:40] ppsci INFO: train: epoch 562 | step 10 | lr 0.000208 | loss 0.040987 | mae 0.138475 -[2024/06/24 06:41:40] ppsci INFO: train: epoch 562 | step 20 | lr 0.000208 | loss 0.022897 | mae 0.118995 -[2024/06/24 06:41:41] ppsci INFO: train: epoch 562 | step 30 | lr 0.000208 | loss 0.037753 | mae 0.139792 -[2024/06/24 06:41:41] ppsci INFO: train: epoch 562 | step 38 | lr 0.000208 | loss 0.017959 | mae 0.104411 -[2024/06/24 06:41:41] ppsci INFO: epoch: 562, train_loss: 0.036269, train_metric: 0.137165, eval_loss: 0.066771, eval_mae: 0.167148 -[2024/06/24 06:41:41] ppsci INFO: train: epoch 563 | step 0 | lr 0.000207 | loss 0.038049 | mae 0.149182 -[2024/06/24 06:41:42] ppsci INFO: train: epoch 563 | step 10 | lr 0.000207 | loss 0.033886 | mae 0.135347 -[2024/06/24 06:41:43] ppsci INFO: train: epoch 563 | step 20 | lr 0.000207 | loss 0.035163 | mae 0.138857 -[2024/06/24 06:41:43] ppsci INFO: train: epoch 563 | step 30 | lr 0.000207 | loss 0.041967 | mae 0.137838 -[2024/06/24 06:41:43] ppsci INFO: train: epoch 563 | step 38 | lr 0.000207 | loss 0.012148 | mae 0.090624 -[2024/06/24 06:41:44] ppsci INFO: epoch: 563, train_loss: 0.036404, train_metric: 0.140040, eval_loss: 0.063436, eval_mae: 0.161984 -[2024/06/24 06:41:44] ppsci INFO: train: epoch 564 | step 0 | lr 0.000206 | loss 0.024638 | mae 0.121680 -[2024/06/24 06:41:44] ppsci INFO: train: epoch 564 | step 10 | lr 0.000206 | loss 0.034482 | mae 0.138609 -[2024/06/24 06:41:45] ppsci INFO: train: epoch 564 | step 20 | lr 0.000206 | loss 0.045969 | mae 0.149984 -[2024/06/24 06:41:45] ppsci INFO: train: epoch 564 | step 30 | lr 0.000206 | loss 0.042859 | mae 0.135533 -[2024/06/24 06:41:46] ppsci INFO: train: epoch 564 | step 38 | lr 0.000206 | loss 0.022556 | mae 0.121202 -[2024/06/24 06:41:46] ppsci INFO: epoch: 564, train_loss: 0.034777, train_metric: 0.137054, eval_loss: 0.062711, eval_mae: 0.161690 -[2024/06/24 06:41:46] ppsci INFO: train: epoch 565 | step 0 | lr 0.000205 | loss 0.043322 | mae 0.138312 -[2024/06/24 06:41:46] ppsci INFO: train: epoch 565 | step 10 | lr 0.000205 | loss 0.029431 | mae 0.130940 -[2024/06/24 06:41:47] ppsci INFO: train: epoch 565 | step 20 | lr 0.000205 | loss 0.032407 | mae 0.141521 -[2024/06/24 06:41:47] ppsci INFO: train: epoch 565 | step 30 | lr 0.000205 | loss 0.030896 | mae 0.128633 -[2024/06/24 06:41:48] ppsci INFO: train: epoch 565 | step 38 | lr 0.000205 | loss 0.019220 | mae 0.109211 -[2024/06/24 06:41:48] ppsci INFO: epoch: 565, train_loss: 0.035412, train_metric: 0.137394, eval_loss: 0.064841, eval_mae: 0.161706 -[2024/06/24 06:41:48] ppsci INFO: train: epoch 566 | step 0 | lr 0.000205 | loss 0.034708 | mae 0.136876 -[2024/06/24 06:41:49] ppsci INFO: train: epoch 566 | step 10 | lr 0.000205 | loss 0.041372 | mae 0.144566 -[2024/06/24 06:41:49] ppsci INFO: train: epoch 566 | step 20 | lr 0.000205 | loss 0.040785 | mae 0.143027 -[2024/06/24 06:41:49] ppsci INFO: train: epoch 566 | step 30 | lr 0.000205 | loss 0.034977 | mae 0.142922 -[2024/06/24 06:41:50] ppsci INFO: train: epoch 566 | step 38 | lr 0.000205 | loss 0.024894 | mae 0.122282 -[2024/06/24 06:41:50] ppsci INFO: epoch: 566, train_loss: 0.036875, train_metric: 0.140747, eval_loss: 0.062186, eval_mae: 0.160642 -[2024/06/24 06:41:50] ppsci INFO: train: epoch 567 | step 0 | lr 0.000204 | loss 0.040317 | mae 0.148969 -[2024/06/24 06:41:51] ppsci INFO: train: epoch 567 | step 10 | lr 0.000204 | loss 0.033413 | mae 0.132048 -[2024/06/24 06:41:51] ppsci INFO: train: epoch 567 | step 20 | lr 0.000204 | loss 0.040435 | mae 0.148844 -[2024/06/24 06:41:52] ppsci INFO: train: epoch 567 | step 30 | lr 0.000204 | loss 0.041173 | mae 0.137303 -[2024/06/24 06:41:52] ppsci INFO: train: epoch 567 | step 38 | lr 0.000204 | loss 0.068932 | mae 0.218029 -[2024/06/24 06:41:52] ppsci INFO: epoch: 567, train_loss: 0.040130, train_metric: 0.141256, eval_loss: 0.065371, eval_mae: 0.167534 -[2024/06/24 06:41:52] ppsci INFO: train: epoch 568 | step 0 | lr 0.000203 | loss 0.038677 | mae 0.148258 -[2024/06/24 06:41:53] ppsci INFO: train: epoch 568 | step 10 | lr 0.000203 | loss 0.038754 | mae 0.146885 -[2024/06/24 06:41:54] ppsci INFO: train: epoch 568 | step 20 | lr 0.000203 | loss 0.046594 | mae 0.155355 -[2024/06/24 06:41:54] ppsci INFO: train: epoch 568 | step 30 | lr 0.000203 | loss 0.026169 | mae 0.117629 -[2024/06/24 06:41:54] ppsci INFO: train: epoch 568 | step 38 | lr 0.000203 | loss 0.090274 | mae 0.243188 -[2024/06/24 06:41:55] ppsci INFO: epoch: 568, train_loss: 0.038289, train_metric: 0.141455, eval_loss: 0.063183, eval_mae: 0.164923 -[2024/06/24 06:41:55] ppsci INFO: train: epoch 569 | step 0 | lr 0.000202 | loss 0.095198 | mae 0.144898 -[2024/06/24 06:41:55] ppsci INFO: train: epoch 569 | step 10 | lr 0.000202 | loss 0.043405 | mae 0.150359 -[2024/06/24 06:41:56] ppsci INFO: train: epoch 569 | step 20 | lr 0.000202 | loss 0.027001 | mae 0.123819 -[2024/06/24 06:41:56] ppsci INFO: train: epoch 569 | step 30 | lr 0.000202 | loss 0.029335 | mae 0.136780 -[2024/06/24 06:41:57] ppsci INFO: train: epoch 569 | step 38 | lr 0.000202 | loss 0.013206 | mae 0.101214 -[2024/06/24 06:41:57] ppsci INFO: epoch: 569, train_loss: 0.038893, train_metric: 0.141027, eval_loss: 0.062765, eval_mae: 0.161147 -[2024/06/24 06:41:57] ppsci INFO: train: epoch 570 | step 0 | lr 0.000202 | loss 0.032696 | mae 0.133178 -[2024/06/24 06:41:57] ppsci INFO: train: epoch 570 | step 10 | lr 0.000202 | loss 0.064486 | mae 0.163168 -[2024/06/24 06:41:58] ppsci INFO: train: epoch 570 | step 20 | lr 0.000202 | loss 0.033782 | mae 0.130080 -[2024/06/24 06:41:58] ppsci INFO: train: epoch 570 | step 30 | lr 0.000202 | loss 0.034282 | mae 0.142270 -[2024/06/24 06:41:59] ppsci INFO: train: epoch 570 | step 38 | lr 0.000202 | loss 0.010882 | mae 0.082000 -[2024/06/24 06:41:59] ppsci INFO: epoch: 570, train_loss: 0.037482, train_metric: 0.142036, eval_loss: 0.064104, eval_mae: 0.165132 -[2024/06/24 06:41:59] ppsci INFO: train: epoch 571 | step 0 | lr 0.000201 | loss 0.033733 | mae 0.135785 -[2024/06/24 06:41:59] ppsci INFO: train: epoch 571 | step 10 | lr 0.000201 | loss 0.036467 | mae 0.136975 -[2024/06/24 06:42:00] ppsci INFO: train: epoch 571 | step 20 | lr 0.000201 | loss 0.040130 | mae 0.143349 -[2024/06/24 06:42:00] ppsci INFO: train: epoch 571 | step 30 | lr 0.000201 | loss 0.023927 | mae 0.115212 -[2024/06/24 06:42:01] ppsci INFO: train: epoch 571 | step 38 | lr 0.000201 | loss 0.043664 | mae 0.166206 -[2024/06/24 06:42:01] ppsci INFO: epoch: 571, train_loss: 0.035454, train_metric: 0.138318, eval_loss: 0.059529, eval_mae: 0.158905 -[2024/06/24 06:42:01] ppsci INFO: train: epoch 572 | step 0 | lr 0.000200 | loss 0.069579 | mae 0.163197 -[2024/06/24 06:42:02] ppsci INFO: train: epoch 572 | step 10 | lr 0.000200 | loss 0.042618 | mae 0.151619 -[2024/06/24 06:42:02] ppsci INFO: train: epoch 572 | step 20 | lr 0.000200 | loss 0.058223 | mae 0.166381 -[2024/06/24 06:42:03] ppsci INFO: train: epoch 572 | step 30 | lr 0.000200 | loss 0.031313 | mae 0.131783 -[2024/06/24 06:42:03] ppsci INFO: train: epoch 572 | step 38 | lr 0.000200 | loss 0.036144 | mae 0.136214 -[2024/06/24 06:42:03] ppsci INFO: epoch: 572, train_loss: 0.037262, train_metric: 0.139363, eval_loss: 0.060575, eval_mae: 0.163624 -[2024/06/24 06:42:03] ppsci INFO: train: epoch 573 | step 0 | lr 0.000199 | loss 0.043670 | mae 0.145656 -[2024/06/24 06:42:04] ppsci INFO: train: epoch 573 | step 10 | lr 0.000199 | loss 0.026201 | mae 0.125380 -[2024/06/24 06:42:04] ppsci INFO: train: epoch 573 | step 20 | lr 0.000199 | loss 0.045542 | mae 0.157166 -[2024/06/24 06:42:05] ppsci INFO: train: epoch 573 | step 30 | lr 0.000199 | loss 0.033095 | mae 0.133575 -[2024/06/24 06:42:05] ppsci INFO: train: epoch 573 | step 38 | lr 0.000199 | loss 0.046677 | mae 0.171583 -[2024/06/24 06:42:06] ppsci INFO: epoch: 573, train_loss: 0.035824, train_metric: 0.137957, eval_loss: 0.059442, eval_mae: 0.158058 -[2024/06/24 06:42:06] ppsci INFO: train: epoch 574 | step 0 | lr 0.000199 | loss 0.039986 | mae 0.139212 -[2024/06/24 06:42:06] ppsci INFO: train: epoch 574 | step 10 | lr 0.000199 | loss 0.041925 | mae 0.154964 -[2024/06/24 06:42:07] ppsci INFO: train: epoch 574 | step 20 | lr 0.000199 | loss 0.039074 | mae 0.142680 -[2024/06/24 06:42:07] ppsci INFO: train: epoch 574 | step 30 | lr 0.000199 | loss 0.028620 | mae 0.128640 -[2024/06/24 06:42:08] ppsci INFO: train: epoch 574 | step 38 | lr 0.000199 | loss 0.030676 | mae 0.150136 -[2024/06/24 06:42:08] ppsci INFO: epoch: 574, train_loss: 0.036976, train_metric: 0.141802, eval_loss: 0.061783, eval_mae: 0.160666 -[2024/06/24 06:42:08] ppsci INFO: train: epoch 575 | step 0 | lr 0.000198 | loss 0.036941 | mae 0.144855 -[2024/06/24 06:42:09] ppsci INFO: train: epoch 575 | step 10 | lr 0.000198 | loss 0.044994 | mae 0.139824 -[2024/06/24 06:42:09] ppsci INFO: train: epoch 575 | step 20 | lr 0.000198 | loss 0.034723 | mae 0.138153 -[2024/06/24 06:42:10] ppsci INFO: train: epoch 575 | step 30 | lr 0.000198 | loss 0.031659 | mae 0.134536 -[2024/06/24 06:42:10] ppsci INFO: train: epoch 575 | step 38 | lr 0.000198 | loss 0.044574 | mae 0.145453 -[2024/06/24 06:42:10] ppsci INFO: epoch: 575, train_loss: 0.036296, train_metric: 0.136929, eval_loss: 0.062394, eval_mae: 0.164695 -[2024/06/24 06:42:10] ppsci INFO: train: epoch 576 | step 0 | lr 0.000197 | loss 0.040922 | mae 0.155113 -[2024/06/24 06:42:11] ppsci INFO: train: epoch 576 | step 10 | lr 0.000197 | loss 0.038536 | mae 0.138013 -[2024/06/24 06:42:11] ppsci INFO: train: epoch 576 | step 20 | lr 0.000197 | loss 0.066206 | mae 0.155989 -[2024/06/24 06:42:12] ppsci INFO: train: epoch 576 | step 30 | lr 0.000197 | loss 0.029484 | mae 0.126575 -[2024/06/24 06:42:12] ppsci INFO: train: epoch 576 | step 38 | lr 0.000197 | loss 0.020695 | mae 0.123043 -[2024/06/24 06:42:12] ppsci INFO: epoch: 576, train_loss: 0.038329, train_metric: 0.142691, eval_loss: 0.062750, eval_mae: 0.163712 -[2024/06/24 06:42:12] ppsci INFO: train: epoch 577 | step 0 | lr 0.000196 | loss 0.034131 | mae 0.134788 -[2024/06/24 06:42:13] ppsci INFO: train: epoch 577 | step 10 | lr 0.000196 | loss 0.029943 | mae 0.118506 -[2024/06/24 06:42:14] ppsci INFO: train: epoch 577 | step 20 | lr 0.000196 | loss 0.042647 | mae 0.141545 -[2024/06/24 06:42:14] ppsci INFO: train: epoch 577 | step 30 | lr 0.000196 | loss 0.048292 | mae 0.151167 -[2024/06/24 06:42:14] ppsci INFO: train: epoch 577 | step 38 | lr 0.000196 | loss 0.176519 | mae 0.232058 -[2024/06/24 06:42:15] ppsci INFO: epoch: 577, train_loss: 0.041765, train_metric: 0.140554, eval_loss: 0.061465, eval_mae: 0.164969 -[2024/06/24 06:42:15] ppsci INFO: train: epoch 578 | step 0 | lr 0.000196 | loss 0.041846 | mae 0.144109 -[2024/06/24 06:42:15] ppsci INFO: train: epoch 578 | step 10 | lr 0.000196 | loss 0.051262 | mae 0.150340 -[2024/06/24 06:42:16] ppsci INFO: train: epoch 578 | step 20 | lr 0.000196 | loss 0.034296 | mae 0.139368 -[2024/06/24 06:42:16] ppsci INFO: train: epoch 578 | step 30 | lr 0.000196 | loss 0.043959 | mae 0.145888 -[2024/06/24 06:42:17] ppsci INFO: train: epoch 578 | step 38 | lr 0.000196 | loss 0.044853 | mae 0.175592 -[2024/06/24 06:42:17] ppsci INFO: epoch: 578, train_loss: 0.036854, train_metric: 0.139149, eval_loss: 0.060266, eval_mae: 0.162020 -[2024/06/24 06:42:17] ppsci INFO: train: epoch 579 | step 0 | lr 0.000195 | loss 0.029836 | mae 0.129354 -[2024/06/24 06:42:17] ppsci INFO: train: epoch 579 | step 10 | lr 0.000195 | loss 0.036674 | mae 0.145594 -[2024/06/24 06:42:18] ppsci INFO: train: epoch 579 | step 20 | lr 0.000195 | loss 0.027688 | mae 0.129199 -[2024/06/24 06:42:19] ppsci INFO: train: epoch 579 | step 30 | lr 0.000195 | loss 0.031535 | mae 0.133224 -[2024/06/24 06:42:19] ppsci INFO: train: epoch 579 | step 38 | lr 0.000195 | loss 0.015266 | mae 0.097744 -[2024/06/24 06:42:19] ppsci INFO: epoch: 579, train_loss: 0.034804, train_metric: 0.138788, eval_loss: 0.059437, eval_mae: 0.157682 -[2024/06/24 06:42:19] ppsci INFO: train: epoch 580 | step 0 | lr 0.000194 | loss 0.029132 | mae 0.126024 -[2024/06/24 06:42:20] ppsci INFO: train: epoch 580 | step 10 | lr 0.000194 | loss 0.037540 | mae 0.149077 -[2024/06/24 06:42:20] ppsci INFO: train: epoch 580 | step 20 | lr 0.000194 | loss 0.034955 | mae 0.135876 -[2024/06/24 06:42:21] ppsci INFO: train: epoch 580 | step 30 | lr 0.000194 | loss 0.029196 | mae 0.137194 -[2024/06/24 06:42:21] ppsci INFO: train: epoch 580 | step 38 | lr 0.000194 | loss 0.016560 | mae 0.108920 -[2024/06/24 06:42:21] ppsci INFO: epoch: 580, train_loss: 0.036241, train_metric: 0.139298, eval_loss: 0.059683, eval_mae: 0.160039 -[2024/06/24 06:42:21] ppsci INFO: train: epoch 581 | step 0 | lr 0.000193 | loss 0.038920 | mae 0.150406 -[2024/06/24 06:42:22] ppsci INFO: train: epoch 581 | step 10 | lr 0.000193 | loss 0.042282 | mae 0.152629 -[2024/06/24 06:42:22] ppsci INFO: train: epoch 581 | step 20 | lr 0.000193 | loss 0.034705 | mae 0.129419 -[2024/06/24 06:42:23] ppsci INFO: train: epoch 581 | step 30 | lr 0.000193 | loss 0.053598 | mae 0.160939 -[2024/06/24 06:42:23] ppsci INFO: train: epoch 581 | step 38 | lr 0.000193 | loss 0.020867 | mae 0.119735 -[2024/06/24 06:42:23] ppsci INFO: epoch: 581, train_loss: 0.038214, train_metric: 0.140624, eval_loss: 0.059610, eval_mae: 0.157477 -[2024/06/24 06:42:23] ppsci INFO: train: epoch 582 | step 0 | lr 0.000193 | loss 0.038949 | mae 0.146946 -[2024/06/24 06:42:24] ppsci INFO: train: epoch 582 | step 10 | lr 0.000193 | loss 0.036364 | mae 0.147027 -[2024/06/24 06:42:24] ppsci INFO: train: epoch 582 | step 20 | lr 0.000193 | loss 0.025332 | mae 0.126629 -[2024/06/24 06:42:25] ppsci INFO: train: epoch 582 | step 30 | lr 0.000193 | loss 0.036780 | mae 0.139743 -[2024/06/24 06:42:25] ppsci INFO: train: epoch 582 | step 38 | lr 0.000193 | loss 0.033337 | mae 0.139482 -[2024/06/24 06:42:26] ppsci INFO: epoch: 582, train_loss: 0.036513, train_metric: 0.140038, eval_loss: 0.062187, eval_mae: 0.157389 -[2024/06/24 06:42:26] ppsci INFO: train: epoch 583 | step 0 | lr 0.000192 | loss 0.033170 | mae 0.134216 -[2024/06/24 06:42:26] ppsci INFO: train: epoch 583 | step 10 | lr 0.000192 | loss 0.024618 | mae 0.124873 -[2024/06/24 06:42:27] ppsci INFO: train: epoch 583 | step 20 | lr 0.000192 | loss 0.044002 | mae 0.144105 -[2024/06/24 06:42:27] ppsci INFO: train: epoch 583 | step 30 | lr 0.000192 | loss 0.030968 | mae 0.133152 -[2024/06/24 06:42:28] ppsci INFO: train: epoch 583 | step 38 | lr 0.000192 | loss 0.050421 | mae 0.168721 -[2024/06/24 06:42:28] ppsci INFO: epoch: 583, train_loss: 0.039089, train_metric: 0.139777, eval_loss: 0.059432, eval_mae: 0.157678 -[2024/06/24 06:42:28] ppsci INFO: train: epoch 584 | step 0 | lr 0.000191 | loss 0.038148 | mae 0.144668 -[2024/06/24 06:42:28] ppsci INFO: train: epoch 584 | step 10 | lr 0.000191 | loss 0.037324 | mae 0.147776 -[2024/06/24 06:42:29] ppsci INFO: train: epoch 584 | step 20 | lr 0.000191 | loss 0.055837 | mae 0.176966 -[2024/06/24 06:42:29] ppsci INFO: train: epoch 584 | step 30 | lr 0.000191 | loss 0.024711 | mae 0.119308 -[2024/06/24 06:42:30] ppsci INFO: train: epoch 584 | step 38 | lr 0.000191 | loss 0.041489 | mae 0.147164 -[2024/06/24 06:42:30] ppsci INFO: epoch: 584, train_loss: 0.037740, train_metric: 0.140835, eval_loss: 0.061671, eval_mae: 0.156870 -[2024/06/24 06:42:30] ppsci INFO: train: epoch 585 | step 0 | lr 0.000190 | loss 0.031419 | mae 0.123177 -[2024/06/24 06:42:30] ppsci INFO: train: epoch 585 | step 10 | lr 0.000190 | loss 0.049138 | mae 0.152921 -[2024/06/24 06:42:31] ppsci INFO: train: epoch 585 | step 20 | lr 0.000190 | loss 0.032975 | mae 0.134853 -[2024/06/24 06:42:31] ppsci INFO: train: epoch 585 | step 30 | lr 0.000190 | loss 0.034371 | mae 0.141401 -[2024/06/24 06:42:32] ppsci INFO: train: epoch 585 | step 38 | lr 0.000190 | loss 0.068744 | mae 0.176470 -[2024/06/24 06:42:32] ppsci INFO: epoch: 585, train_loss: 0.037405, train_metric: 0.138529, eval_loss: 0.059874, eval_mae: 0.159403 -[2024/06/24 06:42:32] ppsci INFO: train: epoch 586 | step 0 | lr 0.000190 | loss 0.027128 | mae 0.124515 -[2024/06/24 06:42:33] ppsci INFO: train: epoch 586 | step 10 | lr 0.000190 | loss 0.034575 | mae 0.125194 -[2024/06/24 06:42:33] ppsci INFO: train: epoch 586 | step 20 | lr 0.000190 | loss 0.043623 | mae 0.147920 -[2024/06/24 06:42:34] ppsci INFO: train: epoch 586 | step 30 | lr 0.000190 | loss 0.029361 | mae 0.131057 -[2024/06/24 06:42:34] ppsci INFO: train: epoch 586 | step 38 | lr 0.000190 | loss 0.013009 | mae 0.100487 -[2024/06/24 06:42:34] ppsci INFO: epoch: 586, train_loss: 0.034955, train_metric: 0.137848, eval_loss: 0.060223, eval_mae: 0.159848 -[2024/06/24 06:42:34] ppsci INFO: train: epoch 587 | step 0 | lr 0.000189 | loss 0.031506 | mae 0.132449 -[2024/06/24 06:42:35] ppsci INFO: train: epoch 587 | step 10 | lr 0.000189 | loss 0.031643 | mae 0.135543 -[2024/06/24 06:42:35] ppsci INFO: train: epoch 587 | step 20 | lr 0.000189 | loss 0.032525 | mae 0.132119 -[2024/06/24 06:42:36] ppsci INFO: train: epoch 587 | step 30 | lr 0.000189 | loss 0.029606 | mae 0.134760 -[2024/06/24 06:42:36] ppsci INFO: train: epoch 587 | step 38 | lr 0.000189 | loss 0.013217 | mae 0.091084 -[2024/06/24 06:42:36] ppsci INFO: epoch: 587, train_loss: 0.036428, train_metric: 0.140556, eval_loss: 0.056657, eval_mae: 0.159479 -[2024/06/24 06:42:36] ppsci INFO: train: epoch 588 | step 0 | lr 0.000188 | loss 0.043996 | mae 0.154514 -[2024/06/24 06:42:37] ppsci INFO: train: epoch 588 | step 10 | lr 0.000188 | loss 0.039335 | mae 0.139116 -[2024/06/24 06:42:37] ppsci INFO: train: epoch 588 | step 20 | lr 0.000188 | loss 0.046674 | mae 0.157039 -[2024/06/24 06:42:38] ppsci INFO: train: epoch 588 | step 30 | lr 0.000188 | loss 0.037123 | mae 0.140509 -[2024/06/24 06:42:38] ppsci INFO: train: epoch 588 | step 38 | lr 0.000188 | loss 0.006903 | mae 0.069819 -[2024/06/24 06:42:38] ppsci INFO: epoch: 588, train_loss: 0.038355, train_metric: 0.141822, eval_loss: 0.057756, eval_mae: 0.160267 -[2024/06/24 06:42:38] ppsci INFO: train: epoch 589 | step 0 | lr 0.000187 | loss 0.032696 | mae 0.131936 -[2024/06/24 06:42:39] ppsci INFO: train: epoch 589 | step 10 | lr 0.000187 | loss 0.025949 | mae 0.124926 -[2024/06/24 06:42:39] ppsci INFO: train: epoch 589 | step 20 | lr 0.000187 | loss 0.033644 | mae 0.136916 -[2024/06/24 06:42:40] ppsci INFO: train: epoch 589 | step 30 | lr 0.000187 | loss 0.039687 | mae 0.153654 -[2024/06/24 06:42:40] ppsci INFO: train: epoch 589 | step 38 | lr 0.000187 | loss 0.018661 | mae 0.108407 -[2024/06/24 06:42:40] ppsci INFO: epoch: 589, train_loss: 0.036057, train_metric: 0.138151, eval_loss: 0.059057, eval_mae: 0.159877 -[2024/06/24 06:42:41] ppsci INFO: train: epoch 590 | step 0 | lr 0.000187 | loss 0.032017 | mae 0.136290 -[2024/06/24 06:42:41] ppsci INFO: train: epoch 590 | step 10 | lr 0.000187 | loss 0.032178 | mae 0.135518 -[2024/06/24 06:42:42] ppsci INFO: train: epoch 590 | step 20 | lr 0.000187 | loss 0.032824 | mae 0.130760 -[2024/06/24 06:42:42] ppsci INFO: train: epoch 590 | step 30 | lr 0.000187 | loss 0.040925 | mae 0.151528 -[2024/06/24 06:42:43] ppsci INFO: train: epoch 590 | step 38 | lr 0.000187 | loss 0.026715 | mae 0.132190 -[2024/06/24 06:42:43] ppsci INFO: epoch: 590, train_loss: 0.035238, train_metric: 0.137304, eval_loss: 0.062268, eval_mae: 0.162107 -[2024/06/24 06:42:43] ppsci INFO: train: epoch 591 | step 0 | lr 0.000186 | loss 0.032862 | mae 0.133226 -[2024/06/24 06:42:43] ppsci INFO: train: epoch 591 | step 10 | lr 0.000186 | loss 0.054349 | mae 0.158826 -[2024/06/24 06:42:44] ppsci INFO: train: epoch 591 | step 20 | lr 0.000186 | loss 0.027080 | mae 0.122506 -[2024/06/24 06:42:44] ppsci INFO: train: epoch 591 | step 30 | lr 0.000186 | loss 0.033862 | mae 0.133225 -[2024/06/24 06:42:45] ppsci INFO: train: epoch 591 | step 38 | lr 0.000186 | loss 0.059922 | mae 0.191402 -[2024/06/24 06:42:45] ppsci INFO: epoch: 591, train_loss: 0.036444, train_metric: 0.135977, eval_loss: 0.059722, eval_mae: 0.160565 -[2024/06/24 06:42:45] ppsci INFO: train: epoch 592 | step 0 | lr 0.000185 | loss 0.031110 | mae 0.134159 -[2024/06/24 06:42:46] ppsci INFO: train: epoch 592 | step 10 | lr 0.000185 | loss 0.028196 | mae 0.121914 -[2024/06/24 06:42:46] ppsci INFO: train: epoch 592 | step 20 | lr 0.000185 | loss 0.043531 | mae 0.138323 -[2024/06/24 06:42:47] ppsci INFO: train: epoch 592 | step 30 | lr 0.000185 | loss 0.040129 | mae 0.144069 -[2024/06/24 06:42:47] ppsci INFO: train: epoch 592 | step 38 | lr 0.000185 | loss 0.028896 | mae 0.120625 -[2024/06/24 06:42:47] ppsci INFO: epoch: 592, train_loss: 0.035505, train_metric: 0.138404, eval_loss: 0.058789, eval_mae: 0.159968 -[2024/06/24 06:42:47] ppsci INFO: train: epoch 593 | step 0 | lr 0.000184 | loss 0.031630 | mae 0.132539 -[2024/06/24 06:42:48] ppsci INFO: train: epoch 593 | step 10 | lr 0.000184 | loss 0.040742 | mae 0.154822 -[2024/06/24 06:42:48] ppsci INFO: train: epoch 593 | step 20 | lr 0.000184 | loss 0.045122 | mae 0.144267 -[2024/06/24 06:42:49] ppsci INFO: train: epoch 593 | step 30 | lr 0.000184 | loss 0.039112 | mae 0.141804 -[2024/06/24 06:42:49] ppsci INFO: train: epoch 593 | step 38 | lr 0.000184 | loss 0.041080 | mae 0.174886 -[2024/06/24 06:42:49] ppsci INFO: epoch: 593, train_loss: 0.039849, train_metric: 0.143415, eval_loss: 0.057309, eval_mae: 0.159406 -[2024/06/24 06:42:49] ppsci INFO: train: epoch 594 | step 0 | lr 0.000184 | loss 0.027671 | mae 0.124828 -[2024/06/24 06:42:50] ppsci INFO: train: epoch 594 | step 10 | lr 0.000184 | loss 0.029032 | mae 0.127350 -[2024/06/24 06:42:50] ppsci INFO: train: epoch 594 | step 20 | lr 0.000184 | loss 0.039634 | mae 0.145390 -[2024/06/24 06:42:51] ppsci INFO: train: epoch 594 | step 30 | lr 0.000184 | loss 0.044433 | mae 0.150896 -[2024/06/24 06:42:51] ppsci INFO: train: epoch 594 | step 38 | lr 0.000184 | loss 0.041200 | mae 0.145959 -[2024/06/24 06:42:51] ppsci INFO: epoch: 594, train_loss: 0.036063, train_metric: 0.139607, eval_loss: 0.055243, eval_mae: 0.157746 -[2024/06/24 06:42:51] ppsci INFO: train: epoch 595 | step 0 | lr 0.000183 | loss 0.045233 | mae 0.156142 -[2024/06/24 06:42:52] ppsci INFO: train: epoch 595 | step 10 | lr 0.000183 | loss 0.022827 | mae 0.117143 -[2024/06/24 06:42:52] ppsci INFO: train: epoch 595 | step 20 | lr 0.000183 | loss 0.030751 | mae 0.125890 -[2024/06/24 06:42:53] ppsci INFO: train: epoch 595 | step 30 | lr 0.000183 | loss 0.042268 | mae 0.145790 -[2024/06/24 06:42:53] ppsci INFO: train: epoch 595 | step 38 | lr 0.000183 | loss 0.014763 | mae 0.104979 -[2024/06/24 06:42:53] ppsci INFO: epoch: 595, train_loss: 0.036384, train_metric: 0.139244, eval_loss: 0.058371, eval_mae: 0.158563 -[2024/06/24 06:42:53] ppsci INFO: train: epoch 596 | step 0 | lr 0.000182 | loss 0.042119 | mae 0.154213 -[2024/06/24 06:42:54] ppsci INFO: train: epoch 596 | step 10 | lr 0.000182 | loss 0.037989 | mae 0.139321 -[2024/06/24 06:42:55] ppsci INFO: train: epoch 596 | step 20 | lr 0.000182 | loss 0.034667 | mae 0.140145 -[2024/06/24 06:42:55] ppsci INFO: train: epoch 596 | step 30 | lr 0.000182 | loss 0.025977 | mae 0.122373 -[2024/06/24 06:42:55] ppsci INFO: train: epoch 596 | step 38 | lr 0.000182 | loss 0.036911 | mae 0.153717 -[2024/06/24 06:42:56] ppsci INFO: epoch: 596, train_loss: 0.034609, train_metric: 0.135563, eval_loss: 0.058014, eval_mae: 0.159027 -[2024/06/24 06:42:56] ppsci INFO: train: epoch 597 | step 0 | lr 0.000181 | loss 0.032438 | mae 0.136595 -[2024/06/24 06:42:56] ppsci INFO: train: epoch 597 | step 10 | lr 0.000181 | loss 0.029585 | mae 0.134379 -[2024/06/24 06:42:57] ppsci INFO: train: epoch 597 | step 20 | lr 0.000181 | loss 0.032532 | mae 0.136992 -[2024/06/24 06:42:57] ppsci INFO: train: epoch 597 | step 30 | lr 0.000181 | loss 0.026953 | mae 0.122844 -[2024/06/24 06:42:57] ppsci INFO: train: epoch 597 | step 38 | lr 0.000181 | loss 0.020421 | mae 0.122126 -[2024/06/24 06:42:58] ppsci INFO: epoch: 597, train_loss: 0.034079, train_metric: 0.134616, eval_loss: 0.062150, eval_mae: 0.161135 -[2024/06/24 06:42:58] ppsci INFO: train: epoch 598 | step 0 | lr 0.000181 | loss 0.035465 | mae 0.136951 -[2024/06/24 06:42:58] ppsci INFO: train: epoch 598 | step 10 | lr 0.000181 | loss 0.036968 | mae 0.136665 -[2024/06/24 06:42:59] ppsci INFO: train: epoch 598 | step 20 | lr 0.000181 | loss 0.031753 | mae 0.129793 -[2024/06/24 06:42:59] ppsci INFO: train: epoch 598 | step 30 | lr 0.000181 | loss 0.051198 | mae 0.159677 -[2024/06/24 06:43:00] ppsci INFO: train: epoch 598 | step 38 | lr 0.000181 | loss 0.028381 | mae 0.140245 -[2024/06/24 06:43:00] ppsci INFO: epoch: 598, train_loss: 0.034905, train_metric: 0.136144, eval_loss: 0.061813, eval_mae: 0.160132 -[2024/06/24 06:43:00] ppsci INFO: train: epoch 599 | step 0 | lr 0.000180 | loss 0.027698 | mae 0.122613 -[2024/06/24 06:43:00] ppsci INFO: train: epoch 599 | step 10 | lr 0.000180 | loss 0.032745 | mae 0.129755 -[2024/06/24 06:43:01] ppsci INFO: train: epoch 599 | step 20 | lr 0.000180 | loss 0.031836 | mae 0.132592 -[2024/06/24 06:43:01] ppsci INFO: train: epoch 599 | step 30 | lr 0.000180 | loss 0.036391 | mae 0.143099 -[2024/06/24 06:43:02] ppsci INFO: train: epoch 599 | step 38 | lr 0.000180 | loss 0.032030 | mae 0.156916 -[2024/06/24 06:43:02] ppsci INFO: epoch: 599, train_loss: 0.035130, train_metric: 0.138358, eval_loss: 0.064640, eval_mae: 0.163175 -[2024/06/24 06:43:02] ppsci INFO: train: epoch 600 | step 0 | lr 0.000179 | loss 0.023506 | mae 0.114554 -[2024/06/24 06:43:03] ppsci INFO: train: epoch 600 | step 10 | lr 0.000179 | loss 0.042158 | mae 0.147762 -[2024/06/24 06:43:03] ppsci INFO: train: epoch 600 | step 20 | lr 0.000179 | loss 0.032486 | mae 0.133784 -[2024/06/24 06:43:03] ppsci INFO: train: epoch 600 | step 30 | lr 0.000179 | loss 0.030271 | mae 0.131589 -[2024/06/24 06:43:04] ppsci INFO: train: epoch 600 | step 38 | lr 0.000179 | loss 0.036104 | mae 0.155614 -[2024/06/24 06:43:04] ppsci INFO: epoch: 600, train_loss: 0.035235, train_metric: 0.138305, eval_loss: 0.061454, eval_mae: 0.157767 -[2024/06/24 06:43:04] ppsci INFO: train: epoch 601 | step 0 | lr 0.000179 | loss 0.036634 | mae 0.136080 -[2024/06/24 06:43:05] ppsci INFO: train: epoch 601 | step 10 | lr 0.000179 | loss 0.028240 | mae 0.128602 -[2024/06/24 06:43:05] ppsci INFO: train: epoch 601 | step 20 | lr 0.000179 | loss 0.032304 | mae 0.136144 -[2024/06/24 06:43:06] ppsci INFO: train: epoch 601 | step 30 | lr 0.000179 | loss 0.041625 | mae 0.152196 -[2024/06/24 06:43:06] ppsci INFO: train: epoch 601 | step 38 | lr 0.000179 | loss 0.018574 | mae 0.115268 -[2024/06/24 06:43:06] ppsci INFO: epoch: 601, train_loss: 0.035503, train_metric: 0.139072, eval_loss: 0.060995, eval_mae: 0.158429 -[2024/06/24 06:43:06] ppsci INFO: train: epoch 602 | step 0 | lr 0.000178 | loss 0.028897 | mae 0.127745 -[2024/06/24 06:43:07] ppsci INFO: train: epoch 602 | step 10 | lr 0.000178 | loss 0.025959 | mae 0.120521 -[2024/06/24 06:43:07] ppsci INFO: train: epoch 602 | step 20 | lr 0.000178 | loss 0.035004 | mae 0.131602 -[2024/06/24 06:43:08] ppsci INFO: train: epoch 602 | step 30 | lr 0.000178 | loss 0.038380 | mae 0.151180 -[2024/06/24 06:43:08] ppsci INFO: train: epoch 602 | step 38 | lr 0.000178 | loss 0.020760 | mae 0.107390 -[2024/06/24 06:43:08] ppsci INFO: epoch: 602, train_loss: 0.033253, train_metric: 0.134882, eval_loss: 0.059150, eval_mae: 0.159166 -[2024/06/24 06:43:08] ppsci INFO: train: epoch 603 | step 0 | lr 0.000177 | loss 0.022115 | mae 0.116889 -[2024/06/24 06:43:09] ppsci INFO: train: epoch 603 | step 10 | lr 0.000177 | loss 0.021628 | mae 0.118848 -[2024/06/24 06:43:10] ppsci INFO: train: epoch 603 | step 20 | lr 0.000177 | loss 0.042382 | mae 0.153406 -[2024/06/24 06:43:10] ppsci INFO: train: epoch 603 | step 30 | lr 0.000177 | loss 0.031131 | mae 0.135945 -[2024/06/24 06:43:11] ppsci INFO: train: epoch 603 | step 38 | lr 0.000177 | loss 0.038912 | mae 0.150715 -[2024/06/24 06:43:11] ppsci INFO: epoch: 603, train_loss: 0.034853, train_metric: 0.137591, eval_loss: 0.057879, eval_mae: 0.158892 -[2024/06/24 06:43:11] ppsci INFO: train: epoch 604 | step 0 | lr 0.000176 | loss 0.028052 | mae 0.124352 -[2024/06/24 06:43:11] ppsci INFO: train: epoch 604 | step 10 | lr 0.000176 | loss 0.052368 | mae 0.155089 -[2024/06/24 06:43:12] ppsci INFO: train: epoch 604 | step 20 | lr 0.000176 | loss 0.036478 | mae 0.139109 -[2024/06/24 06:43:12] ppsci INFO: train: epoch 604 | step 30 | lr 0.000176 | loss 0.023203 | mae 0.117218 -[2024/06/24 06:43:13] ppsci INFO: train: epoch 604 | step 38 | lr 0.000176 | loss 0.031501 | mae 0.132244 -[2024/06/24 06:43:13] ppsci INFO: epoch: 604, train_loss: 0.037475, train_metric: 0.137760, eval_loss: 0.062005, eval_mae: 0.161722 -[2024/06/24 06:43:13] ppsci INFO: train: epoch 605 | step 0 | lr 0.000176 | loss 0.034778 | mae 0.136434 -[2024/06/24 06:43:13] ppsci INFO: train: epoch 605 | step 10 | lr 0.000176 | loss 0.033783 | mae 0.131121 -[2024/06/24 06:43:14] ppsci INFO: train: epoch 605 | step 20 | lr 0.000176 | loss 0.033028 | mae 0.142978 -[2024/06/24 06:43:14] ppsci INFO: train: epoch 605 | step 30 | lr 0.000176 | loss 0.049706 | mae 0.160437 -[2024/06/24 06:43:15] ppsci INFO: train: epoch 605 | step 38 | lr 0.000176 | loss 0.037795 | mae 0.137804 -[2024/06/24 06:43:15] ppsci INFO: epoch: 605, train_loss: 0.035957, train_metric: 0.136247, eval_loss: 0.058449, eval_mae: 0.157774 -[2024/06/24 06:43:15] ppsci INFO: train: epoch 606 | step 0 | lr 0.000175 | loss 0.035647 | mae 0.131544 -[2024/06/24 06:43:16] ppsci INFO: train: epoch 606 | step 10 | lr 0.000175 | loss 0.029461 | mae 0.127467 -[2024/06/24 06:43:16] ppsci INFO: train: epoch 606 | step 20 | lr 0.000175 | loss 0.027480 | mae 0.121193 -[2024/06/24 06:43:17] ppsci INFO: train: epoch 606 | step 30 | lr 0.000175 | loss 0.036008 | mae 0.136495 -[2024/06/24 06:43:17] ppsci INFO: train: epoch 606 | step 38 | lr 0.000175 | loss 0.024798 | mae 0.130254 -[2024/06/24 06:43:17] ppsci INFO: epoch: 606, train_loss: 0.036947, train_metric: 0.138256, eval_loss: 0.060204, eval_mae: 0.161984 -[2024/06/24 06:43:17] ppsci INFO: train: epoch 607 | step 0 | lr 0.000174 | loss 0.036362 | mae 0.135542 -[2024/06/24 06:43:18] ppsci INFO: train: epoch 607 | step 10 | lr 0.000174 | loss 0.031766 | mae 0.129139 -[2024/06/24 06:43:18] ppsci INFO: train: epoch 607 | step 20 | lr 0.000174 | loss 0.042303 | mae 0.147484 -[2024/06/24 06:43:19] ppsci INFO: train: epoch 607 | step 30 | lr 0.000174 | loss 0.029857 | mae 0.123333 -[2024/06/24 06:43:19] ppsci INFO: train: epoch 607 | step 38 | lr 0.000174 | loss 0.020002 | mae 0.117618 -[2024/06/24 06:43:19] ppsci INFO: epoch: 607, train_loss: 0.033205, train_metric: 0.134614, eval_loss: 0.059001, eval_mae: 0.159243 -[2024/06/24 06:43:19] ppsci INFO: train: epoch 608 | step 0 | lr 0.000173 | loss 0.031969 | mae 0.134832 -[2024/06/24 06:43:20] ppsci INFO: train: epoch 608 | step 10 | lr 0.000173 | loss 0.043204 | mae 0.153971 -[2024/06/24 06:43:20] ppsci INFO: train: epoch 608 | step 20 | lr 0.000173 | loss 0.032790 | mae 0.129223 -[2024/06/24 06:43:21] ppsci INFO: train: epoch 608 | step 30 | lr 0.000173 | loss 0.041754 | mae 0.151513 -[2024/06/24 06:43:21] ppsci INFO: train: epoch 608 | step 38 | lr 0.000173 | loss 0.059113 | mae 0.145106 -[2024/06/24 06:43:21] ppsci INFO: epoch: 608, train_loss: 0.036991, train_metric: 0.139316, eval_loss: 0.060630, eval_mae: 0.161864 -[2024/06/24 06:43:21] ppsci INFO: train: epoch 609 | step 0 | lr 0.000173 | loss 0.048652 | mae 0.155250 -[2024/06/24 06:43:22] ppsci INFO: train: epoch 609 | step 10 | lr 0.000173 | loss 0.035934 | mae 0.137681 -[2024/06/24 06:43:23] ppsci INFO: train: epoch 609 | step 20 | lr 0.000173 | loss 0.030569 | mae 0.131534 -[2024/06/24 06:43:23] ppsci INFO: train: epoch 609 | step 30 | lr 0.000173 | loss 0.042884 | mae 0.140104 -[2024/06/24 06:43:24] ppsci INFO: train: epoch 609 | step 38 | lr 0.000173 | loss 0.020707 | mae 0.117988 -[2024/06/24 06:43:24] ppsci INFO: epoch: 609, train_loss: 0.034706, train_metric: 0.136438, eval_loss: 0.061946, eval_mae: 0.165800 -[2024/06/24 06:43:24] ppsci INFO: train: epoch 610 | step 0 | lr 0.000172 | loss 0.024460 | mae 0.119517 -[2024/06/24 06:43:24] ppsci INFO: train: epoch 610 | step 10 | lr 0.000172 | loss 0.040940 | mae 0.145312 -[2024/06/24 06:43:25] ppsci INFO: train: epoch 610 | step 20 | lr 0.000172 | loss 0.042077 | mae 0.142276 -[2024/06/24 06:43:26] ppsci INFO: train: epoch 610 | step 30 | lr 0.000172 | loss 0.029019 | mae 0.133852 -[2024/06/24 06:43:26] ppsci INFO: train: epoch 610 | step 38 | lr 0.000172 | loss 0.016563 | mae 0.094824 -[2024/06/24 06:43:26] ppsci INFO: epoch: 610, train_loss: 0.034449, train_metric: 0.134496, eval_loss: 0.057490, eval_mae: 0.158986 -[2024/06/24 06:43:26] ppsci INFO: train: epoch 611 | step 0 | lr 0.000171 | loss 0.031939 | mae 0.135348 -[2024/06/24 06:43:27] ppsci INFO: train: epoch 611 | step 10 | lr 0.000171 | loss 0.028281 | mae 0.116029 -[2024/06/24 06:43:27] ppsci INFO: train: epoch 611 | step 20 | lr 0.000171 | loss 0.046476 | mae 0.163405 -[2024/06/24 06:43:28] ppsci INFO: train: epoch 611 | step 30 | lr 0.000171 | loss 0.040946 | mae 0.142298 -[2024/06/24 06:43:28] ppsci INFO: train: epoch 611 | step 38 | lr 0.000171 | loss 0.019866 | mae 0.105123 -[2024/06/24 06:43:28] ppsci INFO: epoch: 611, train_loss: 0.034913, train_metric: 0.137457, eval_loss: 0.059312, eval_mae: 0.158155 -[2024/06/24 06:43:28] ppsci INFO: train: epoch 612 | step 0 | lr 0.000171 | loss 0.038215 | mae 0.134134 -[2024/06/24 06:43:29] ppsci INFO: train: epoch 612 | step 10 | lr 0.000171 | loss 0.025675 | mae 0.128987 -[2024/06/24 06:43:29] ppsci INFO: train: epoch 612 | step 20 | lr 0.000171 | loss 0.029423 | mae 0.129200 -[2024/06/24 06:43:30] ppsci INFO: train: epoch 612 | step 30 | lr 0.000171 | loss 0.034502 | mae 0.140716 -[2024/06/24 06:43:30] ppsci INFO: train: epoch 612 | step 38 | lr 0.000171 | loss 0.025364 | mae 0.117203 -[2024/06/24 06:43:30] ppsci INFO: epoch: 612, train_loss: 0.034630, train_metric: 0.136885, eval_loss: 0.054481, eval_mae: 0.154983 -[2024/06/24 06:43:30] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:43:31] ppsci INFO: train: epoch 613 | step 0 | lr 0.000170 | loss 0.033502 | mae 0.138039 -[2024/06/24 06:43:31] ppsci INFO: train: epoch 613 | step 10 | lr 0.000170 | loss 0.057512 | mae 0.147777 -[2024/06/24 06:43:32] ppsci INFO: train: epoch 613 | step 20 | lr 0.000170 | loss 0.042082 | mae 0.143345 -[2024/06/24 06:43:32] ppsci INFO: train: epoch 613 | step 30 | lr 0.000170 | loss 0.036506 | mae 0.137806 -[2024/06/24 06:43:32] ppsci INFO: train: epoch 613 | step 38 | lr 0.000170 | loss 0.025643 | mae 0.140090 -[2024/06/24 06:43:33] ppsci INFO: epoch: 613, train_loss: 0.036107, train_metric: 0.137908, eval_loss: 0.057501, eval_mae: 0.158575 -[2024/06/24 06:43:33] ppsci INFO: train: epoch 614 | step 0 | lr 0.000169 | loss 0.033402 | mae 0.134339 -[2024/06/24 06:43:33] ppsci INFO: train: epoch 614 | step 10 | lr 0.000169 | loss 0.028666 | mae 0.130277 -[2024/06/24 06:43:34] ppsci INFO: train: epoch 614 | step 20 | lr 0.000169 | loss 0.032914 | mae 0.130349 -[2024/06/24 06:43:34] ppsci INFO: train: epoch 614 | step 30 | lr 0.000169 | loss 0.034534 | mae 0.133593 -[2024/06/24 06:43:35] ppsci INFO: train: epoch 614 | step 38 | lr 0.000169 | loss 0.035844 | mae 0.141026 -[2024/06/24 06:43:35] ppsci INFO: epoch: 614, train_loss: 0.033389, train_metric: 0.133573, eval_loss: 0.058368, eval_mae: 0.159024 -[2024/06/24 06:43:35] ppsci INFO: train: epoch 615 | step 0 | lr 0.000168 | loss 0.037014 | mae 0.131638 -[2024/06/24 06:43:35] ppsci INFO: train: epoch 615 | step 10 | lr 0.000168 | loss 0.030044 | mae 0.123552 -[2024/06/24 06:43:36] ppsci INFO: train: epoch 615 | step 20 | lr 0.000168 | loss 0.029440 | mae 0.132343 -[2024/06/24 06:43:36] ppsci INFO: train: epoch 615 | step 30 | lr 0.000168 | loss 0.037676 | mae 0.139471 -[2024/06/24 06:43:37] ppsci INFO: train: epoch 615 | step 38 | lr 0.000168 | loss 0.012706 | mae 0.100542 -[2024/06/24 06:43:37] ppsci INFO: epoch: 615, train_loss: 0.032714, train_metric: 0.132913, eval_loss: 0.057494, eval_mae: 0.158385 -[2024/06/24 06:43:37] ppsci INFO: train: epoch 616 | step 0 | lr 0.000168 | loss 0.050727 | mae 0.154038 -[2024/06/24 06:43:38] ppsci INFO: train: epoch 616 | step 10 | lr 0.000168 | loss 0.033281 | mae 0.130406 -[2024/06/24 06:43:38] ppsci INFO: train: epoch 616 | step 20 | lr 0.000168 | loss 0.026952 | mae 0.123646 -[2024/06/24 06:43:39] ppsci INFO: train: epoch 616 | step 30 | lr 0.000168 | loss 0.021792 | mae 0.112310 -[2024/06/24 06:43:39] ppsci INFO: train: epoch 616 | step 38 | lr 0.000168 | loss 0.034739 | mae 0.138633 -[2024/06/24 06:43:39] ppsci INFO: epoch: 616, train_loss: 0.032660, train_metric: 0.131310, eval_loss: 0.060006, eval_mae: 0.158691 -[2024/06/24 06:43:39] ppsci INFO: train: epoch 617 | step 0 | lr 0.000167 | loss 0.026474 | mae 0.121866 -[2024/06/24 06:43:40] ppsci INFO: train: epoch 617 | step 10 | lr 0.000167 | loss 0.047248 | mae 0.153649 -[2024/06/24 06:43:41] ppsci INFO: train: epoch 617 | step 20 | lr 0.000167 | loss 0.026626 | mae 0.122764 -[2024/06/24 06:43:41] ppsci INFO: train: epoch 617 | step 30 | lr 0.000167 | loss 0.071283 | mae 0.159648 -[2024/06/24 06:43:41] ppsci INFO: train: epoch 617 | step 38 | lr 0.000167 | loss 0.046945 | mae 0.177654 -[2024/06/24 06:43:42] ppsci INFO: epoch: 617, train_loss: 0.036612, train_metric: 0.137484, eval_loss: 0.060500, eval_mae: 0.159785 -[2024/06/24 06:43:42] ppsci INFO: train: epoch 618 | step 0 | lr 0.000166 | loss 0.033971 | mae 0.137627 -[2024/06/24 06:43:42] ppsci INFO: train: epoch 618 | step 10 | lr 0.000166 | loss 0.036809 | mae 0.148022 -[2024/06/24 06:43:43] ppsci INFO: train: epoch 618 | step 20 | lr 0.000166 | loss 0.033745 | mae 0.144102 -[2024/06/24 06:43:43] ppsci INFO: train: epoch 618 | step 30 | lr 0.000166 | loss 0.034381 | mae 0.146280 -[2024/06/24 06:43:43] ppsci INFO: train: epoch 618 | step 38 | lr 0.000166 | loss 0.022479 | mae 0.122653 -[2024/06/24 06:43:44] ppsci INFO: epoch: 618, train_loss: 0.035996, train_metric: 0.139216, eval_loss: 0.062856, eval_mae: 0.158908 -[2024/06/24 06:43:44] ppsci INFO: train: epoch 619 | step 0 | lr 0.000166 | loss 0.030485 | mae 0.132423 -[2024/06/24 06:43:44] ppsci INFO: train: epoch 619 | step 10 | lr 0.000166 | loss 0.029854 | mae 0.131029 -[2024/06/24 06:43:45] ppsci INFO: train: epoch 619 | step 20 | lr 0.000166 | loss 0.033165 | mae 0.132402 -[2024/06/24 06:43:45] ppsci INFO: train: epoch 619 | step 30 | lr 0.000166 | loss 0.030119 | mae 0.133654 -[2024/06/24 06:43:46] ppsci INFO: train: epoch 619 | step 38 | lr 0.000166 | loss 0.010379 | mae 0.076887 -[2024/06/24 06:43:46] ppsci INFO: epoch: 619, train_loss: 0.033369, train_metric: 0.134522, eval_loss: 0.060884, eval_mae: 0.160473 -[2024/06/24 06:43:46] ppsci INFO: train: epoch 620 | step 0 | lr 0.000165 | loss 0.036414 | mae 0.135465 -[2024/06/24 06:43:46] ppsci INFO: train: epoch 620 | step 10 | lr 0.000165 | loss 0.039060 | mae 0.153087 -[2024/06/24 06:43:47] ppsci INFO: train: epoch 620 | step 20 | lr 0.000165 | loss 0.025195 | mae 0.124796 -[2024/06/24 06:43:47] ppsci INFO: train: epoch 620 | step 30 | lr 0.000165 | loss 0.028335 | mae 0.126230 -[2024/06/24 06:43:48] ppsci INFO: train: epoch 620 | step 38 | lr 0.000165 | loss 0.022938 | mae 0.116904 -[2024/06/24 06:43:48] ppsci INFO: epoch: 620, train_loss: 0.035976, train_metric: 0.136465, eval_loss: 0.058553, eval_mae: 0.156729 -[2024/06/24 06:43:48] ppsci INFO: train: epoch 621 | step 0 | lr 0.000164 | loss 0.042133 | mae 0.146295 -[2024/06/24 06:43:49] ppsci INFO: train: epoch 621 | step 10 | lr 0.000164 | loss 0.037958 | mae 0.129005 -[2024/06/24 06:43:49] ppsci INFO: train: epoch 621 | step 20 | lr 0.000164 | loss 0.066154 | mae 0.147197 -[2024/06/24 06:43:50] ppsci INFO: train: epoch 621 | step 30 | lr 0.000164 | loss 0.036274 | mae 0.141645 -[2024/06/24 06:43:50] ppsci INFO: train: epoch 621 | step 38 | lr 0.000164 | loss 0.024032 | mae 0.132756 -[2024/06/24 06:43:50] ppsci INFO: epoch: 621, train_loss: 0.033355, train_metric: 0.133358, eval_loss: 0.061403, eval_mae: 0.161570 -[2024/06/24 06:43:50] ppsci INFO: train: epoch 622 | step 0 | lr 0.000163 | loss 0.046556 | mae 0.157913 -[2024/06/24 06:43:51] ppsci INFO: train: epoch 622 | step 10 | lr 0.000163 | loss 0.049418 | mae 0.154479 -[2024/06/24 06:43:51] ppsci INFO: train: epoch 622 | step 20 | lr 0.000163 | loss 0.038795 | mae 0.149789 -[2024/06/24 06:43:52] ppsci INFO: train: epoch 622 | step 30 | lr 0.000163 | loss 0.034863 | mae 0.132935 -[2024/06/24 06:43:52] ppsci INFO: train: epoch 622 | step 38 | lr 0.000163 | loss 0.029979 | mae 0.123189 -[2024/06/24 06:43:52] ppsci INFO: epoch: 622, train_loss: 0.034923, train_metric: 0.137271, eval_loss: 0.061415, eval_mae: 0.158407 -[2024/06/24 06:43:52] ppsci INFO: train: epoch 623 | step 0 | lr 0.000163 | loss 0.033151 | mae 0.136582 -[2024/06/24 06:43:53] ppsci INFO: train: epoch 623 | step 10 | lr 0.000163 | loss 0.030202 | mae 0.135750 -[2024/06/24 06:43:53] ppsci INFO: train: epoch 623 | step 20 | lr 0.000163 | loss 0.032460 | mae 0.128503 -[2024/06/24 06:43:54] ppsci INFO: train: epoch 623 | step 30 | lr 0.000163 | loss 0.031031 | mae 0.128760 -[2024/06/24 06:43:54] ppsci INFO: train: epoch 623 | step 38 | lr 0.000163 | loss 0.028183 | mae 0.102747 -[2024/06/24 06:43:54] ppsci INFO: epoch: 623, train_loss: 0.034856, train_metric: 0.135662, eval_loss: 0.058226, eval_mae: 0.154014 -[2024/06/24 06:43:54] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:43:55] ppsci INFO: train: epoch 624 | step 0 | lr 0.000162 | loss 0.035293 | mae 0.145533 -[2024/06/24 06:43:55] ppsci INFO: train: epoch 624 | step 10 | lr 0.000162 | loss 0.031270 | mae 0.131146 -[2024/06/24 06:43:56] ppsci INFO: train: epoch 624 | step 20 | lr 0.000162 | loss 0.045627 | mae 0.162483 -[2024/06/24 06:43:56] ppsci INFO: train: epoch 624 | step 30 | lr 0.000162 | loss 0.033143 | mae 0.141774 -[2024/06/24 06:43:56] ppsci INFO: train: epoch 624 | step 38 | lr 0.000162 | loss 0.010261 | mae 0.079482 -[2024/06/24 06:43:57] ppsci INFO: epoch: 624, train_loss: 0.033466, train_metric: 0.137271, eval_loss: 0.060311, eval_mae: 0.161404 -[2024/06/24 06:43:57] ppsci INFO: train: epoch 625 | step 0 | lr 0.000161 | loss 0.022330 | mae 0.113587 -[2024/06/24 06:43:57] ppsci INFO: train: epoch 625 | step 10 | lr 0.000161 | loss 0.029201 | mae 0.129484 -[2024/06/24 06:43:58] ppsci INFO: train: epoch 625 | step 20 | lr 0.000161 | loss 0.045074 | mae 0.151998 -[2024/06/24 06:43:58] ppsci INFO: train: epoch 625 | step 30 | lr 0.000161 | loss 0.030005 | mae 0.127115 -[2024/06/24 06:43:59] ppsci INFO: train: epoch 625 | step 38 | lr 0.000161 | loss 0.044105 | mae 0.178416 -[2024/06/24 06:43:59] ppsci INFO: epoch: 625, train_loss: 0.033299, train_metric: 0.134368, eval_loss: 0.060294, eval_mae: 0.156676 -[2024/06/24 06:43:59] ppsci INFO: train: epoch 626 | step 0 | lr 0.000161 | loss 0.038891 | mae 0.153054 -[2024/06/24 06:43:59] ppsci INFO: train: epoch 626 | step 10 | lr 0.000161 | loss 0.035756 | mae 0.144016 -[2024/06/24 06:44:00] ppsci INFO: train: epoch 626 | step 20 | lr 0.000161 | loss 0.033147 | mae 0.131447 -[2024/06/24 06:44:00] ppsci INFO: train: epoch 626 | step 30 | lr 0.000161 | loss 0.035242 | mae 0.126008 -[2024/06/24 06:44:01] ppsci INFO: train: epoch 626 | step 38 | lr 0.000161 | loss 0.014337 | mae 0.097775 -[2024/06/24 06:44:01] ppsci INFO: epoch: 626, train_loss: 0.034034, train_metric: 0.134402, eval_loss: 0.058637, eval_mae: 0.156262 -[2024/06/24 06:44:01] ppsci INFO: train: epoch 627 | step 0 | lr 0.000160 | loss 0.024829 | mae 0.124668 -[2024/06/24 06:44:02] ppsci INFO: train: epoch 627 | step 10 | lr 0.000160 | loss 0.041494 | mae 0.146297 -[2024/06/24 06:44:02] ppsci INFO: train: epoch 627 | step 20 | lr 0.000160 | loss 0.035707 | mae 0.148082 -[2024/06/24 06:44:02] ppsci INFO: train: epoch 627 | step 30 | lr 0.000160 | loss 0.031925 | mae 0.128783 -[2024/06/24 06:44:03] ppsci INFO: train: epoch 627 | step 38 | lr 0.000160 | loss 0.017805 | mae 0.114786 -[2024/06/24 06:44:03] ppsci INFO: epoch: 627, train_loss: 0.034440, train_metric: 0.136622, eval_loss: 0.059339, eval_mae: 0.155894 -[2024/06/24 06:44:03] ppsci INFO: train: epoch 628 | step 0 | lr 0.000159 | loss 0.031408 | mae 0.133288 -[2024/06/24 06:44:04] ppsci INFO: train: epoch 628 | step 10 | lr 0.000159 | loss 0.051953 | mae 0.157256 -[2024/06/24 06:44:04] ppsci INFO: train: epoch 628 | step 20 | lr 0.000159 | loss 0.037618 | mae 0.141442 -[2024/06/24 06:44:05] ppsci INFO: train: epoch 628 | step 30 | lr 0.000159 | loss 0.024417 | mae 0.110169 -[2024/06/24 06:44:05] ppsci INFO: train: epoch 628 | step 38 | lr 0.000159 | loss 0.020405 | mae 0.122822 -[2024/06/24 06:44:05] ppsci INFO: epoch: 628, train_loss: 0.033543, train_metric: 0.134835, eval_loss: 0.060467, eval_mae: 0.161759 -[2024/06/24 06:44:05] ppsci INFO: train: epoch 629 | step 0 | lr 0.000158 | loss 0.030810 | mae 0.131981 -[2024/06/24 06:44:06] ppsci INFO: train: epoch 629 | step 10 | lr 0.000158 | loss 0.034515 | mae 0.139487 -[2024/06/24 06:44:06] ppsci INFO: train: epoch 629 | step 20 | lr 0.000158 | loss 0.027955 | mae 0.124651 -[2024/06/24 06:44:07] ppsci INFO: train: epoch 629 | step 30 | lr 0.000158 | loss 0.033563 | mae 0.132078 -[2024/06/24 06:44:07] ppsci INFO: train: epoch 629 | step 38 | lr 0.000158 | loss 0.105189 | mae 0.193829 -[2024/06/24 06:44:07] ppsci INFO: epoch: 629, train_loss: 0.036820, train_metric: 0.137340, eval_loss: 0.059136, eval_mae: 0.160145 -[2024/06/24 06:44:07] ppsci INFO: train: epoch 630 | step 0 | lr 0.000158 | loss 0.031932 | mae 0.120690 -[2024/06/24 06:44:08] ppsci INFO: train: epoch 630 | step 10 | lr 0.000158 | loss 0.037798 | mae 0.133594 -[2024/06/24 06:44:08] ppsci INFO: train: epoch 630 | step 20 | lr 0.000158 | loss 0.038994 | mae 0.144848 -[2024/06/24 06:44:09] ppsci INFO: train: epoch 630 | step 30 | lr 0.000158 | loss 0.029946 | mae 0.130872 -[2024/06/24 06:44:09] ppsci INFO: train: epoch 630 | step 38 | lr 0.000158 | loss 0.045090 | mae 0.159610 -[2024/06/24 06:44:09] ppsci INFO: epoch: 630, train_loss: 0.034530, train_metric: 0.135461, eval_loss: 0.058858, eval_mae: 0.155829 -[2024/06/24 06:44:10] ppsci INFO: train: epoch 631 | step 0 | lr 0.000157 | loss 0.035618 | mae 0.138106 -[2024/06/24 06:44:10] ppsci INFO: train: epoch 631 | step 10 | lr 0.000157 | loss 0.027896 | mae 0.123562 -[2024/06/24 06:44:11] ppsci INFO: train: epoch 631 | step 20 | lr 0.000157 | loss 0.032845 | mae 0.134436 -[2024/06/24 06:44:11] ppsci INFO: train: epoch 631 | step 30 | lr 0.000157 | loss 0.017589 | mae 0.102053 -[2024/06/24 06:44:12] ppsci INFO: train: epoch 631 | step 38 | lr 0.000157 | loss 0.029638 | mae 0.130416 -[2024/06/24 06:44:12] ppsci INFO: epoch: 631, train_loss: 0.034088, train_metric: 0.135247, eval_loss: 0.056213, eval_mae: 0.155132 -[2024/06/24 06:44:12] ppsci INFO: train: epoch 632 | step 0 | lr 0.000156 | loss 0.028203 | mae 0.122852 -[2024/06/24 06:44:12] ppsci INFO: train: epoch 632 | step 10 | lr 0.000156 | loss 0.035355 | mae 0.134423 -[2024/06/24 06:44:13] ppsci INFO: train: epoch 632 | step 20 | lr 0.000156 | loss 0.031698 | mae 0.135308 -[2024/06/24 06:44:13] ppsci INFO: train: epoch 632 | step 30 | lr 0.000156 | loss 0.029022 | mae 0.133306 -[2024/06/24 06:44:14] ppsci INFO: train: epoch 632 | step 38 | lr 0.000156 | loss 0.123722 | mae 0.179726 -[2024/06/24 06:44:14] ppsci INFO: epoch: 632, train_loss: 0.038697, train_metric: 0.137270, eval_loss: 0.058183, eval_mae: 0.156203 -[2024/06/24 06:44:14] ppsci INFO: train: epoch 633 | step 0 | lr 0.000156 | loss 0.033997 | mae 0.142703 -[2024/06/24 06:44:14] ppsci INFO: train: epoch 633 | step 10 | lr 0.000156 | loss 0.037120 | mae 0.146586 -[2024/06/24 06:44:15] ppsci INFO: train: epoch 633 | step 20 | lr 0.000156 | loss 0.044762 | mae 0.143633 -[2024/06/24 06:44:16] ppsci INFO: train: epoch 633 | step 30 | lr 0.000156 | loss 0.038563 | mae 0.140592 -[2024/06/24 06:44:16] ppsci INFO: train: epoch 633 | step 38 | lr 0.000156 | loss 0.016927 | mae 0.107598 -[2024/06/24 06:44:16] ppsci INFO: epoch: 633, train_loss: 0.032974, train_metric: 0.135021, eval_loss: 0.059388, eval_mae: 0.159858 -[2024/06/24 06:44:16] ppsci INFO: train: epoch 634 | step 0 | lr 0.000155 | loss 0.039805 | mae 0.147882 -[2024/06/24 06:44:17] ppsci INFO: train: epoch 634 | step 10 | lr 0.000155 | loss 0.036227 | mae 0.137415 -[2024/06/24 06:44:17] ppsci INFO: train: epoch 634 | step 20 | lr 0.000155 | loss 0.026938 | mae 0.121383 -[2024/06/24 06:44:18] ppsci INFO: train: epoch 634 | step 30 | lr 0.000155 | loss 0.040962 | mae 0.136589 -[2024/06/24 06:44:18] ppsci INFO: train: epoch 634 | step 38 | lr 0.000155 | loss 0.038484 | mae 0.165972 -[2024/06/24 06:44:18] ppsci INFO: epoch: 634, train_loss: 0.033533, train_metric: 0.134635, eval_loss: 0.057555, eval_mae: 0.151772 -[2024/06/24 06:44:18] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:44:18] ppsci INFO: train: epoch 635 | step 0 | lr 0.000154 | loss 0.035980 | mae 0.139990 -[2024/06/24 06:44:19] ppsci INFO: train: epoch 635 | step 10 | lr 0.000154 | loss 0.037734 | mae 0.136776 -[2024/06/24 06:44:19] ppsci INFO: train: epoch 635 | step 20 | lr 0.000154 | loss 0.033134 | mae 0.135537 -[2024/06/24 06:44:20] ppsci INFO: train: epoch 635 | step 30 | lr 0.000154 | loss 0.035065 | mae 0.130530 -[2024/06/24 06:44:20] ppsci INFO: train: epoch 635 | step 38 | lr 0.000154 | loss 0.019663 | mae 0.119835 -[2024/06/24 06:44:20] ppsci INFO: epoch: 635, train_loss: 0.033585, train_metric: 0.135084, eval_loss: 0.056963, eval_mae: 0.154537 -[2024/06/24 06:44:20] ppsci INFO: train: epoch 636 | step 0 | lr 0.000153 | loss 0.034421 | mae 0.138284 -[2024/06/24 06:44:21] ppsci INFO: train: epoch 636 | step 10 | lr 0.000153 | loss 0.038178 | mae 0.145250 -[2024/06/24 06:44:22] ppsci INFO: train: epoch 636 | step 20 | lr 0.000153 | loss 0.031183 | mae 0.130695 -[2024/06/24 06:44:22] ppsci INFO: train: epoch 636 | step 30 | lr 0.000153 | loss 0.024975 | mae 0.118827 -[2024/06/24 06:44:22] ppsci INFO: train: epoch 636 | step 38 | lr 0.000153 | loss 0.017857 | mae 0.106813 -[2024/06/24 06:44:22] ppsci INFO: epoch: 636, train_loss: 0.032520, train_metric: 0.132967, eval_loss: 0.059172, eval_mae: 0.157761 -[2024/06/24 06:44:23] ppsci INFO: train: epoch 637 | step 0 | lr 0.000153 | loss 0.028255 | mae 0.135972 -[2024/06/24 06:44:23] ppsci INFO: train: epoch 637 | step 10 | lr 0.000153 | loss 0.027978 | mae 0.126735 -[2024/06/24 06:44:24] ppsci INFO: train: epoch 637 | step 20 | lr 0.000153 | loss 0.032531 | mae 0.134644 -[2024/06/24 06:44:24] ppsci INFO: train: epoch 637 | step 30 | lr 0.000153 | loss 0.041574 | mae 0.148045 -[2024/06/24 06:44:24] ppsci INFO: train: epoch 637 | step 38 | lr 0.000153 | loss 0.008073 | mae 0.078005 -[2024/06/24 06:44:25] ppsci INFO: epoch: 637, train_loss: 0.031912, train_metric: 0.132726, eval_loss: 0.058826, eval_mae: 0.155920 -[2024/06/24 06:44:25] ppsci INFO: train: epoch 638 | step 0 | lr 0.000152 | loss 0.034444 | mae 0.131888 -[2024/06/24 06:44:25] ppsci INFO: train: epoch 638 | step 10 | lr 0.000152 | loss 0.032789 | mae 0.143004 -[2024/06/24 06:44:26] ppsci INFO: train: epoch 638 | step 20 | lr 0.000152 | loss 0.023777 | mae 0.115282 -[2024/06/24 06:44:26] ppsci INFO: train: epoch 638 | step 30 | lr 0.000152 | loss 0.027663 | mae 0.128463 -[2024/06/24 06:44:27] ppsci INFO: train: epoch 638 | step 38 | lr 0.000152 | loss 0.047568 | mae 0.179641 -[2024/06/24 06:44:27] ppsci INFO: epoch: 638, train_loss: 0.034280, train_metric: 0.134148, eval_loss: 0.060343, eval_mae: 0.155298 -[2024/06/24 06:44:27] ppsci INFO: train: epoch 639 | step 0 | lr 0.000151 | loss 0.040017 | mae 0.151287 -[2024/06/24 06:44:27] ppsci INFO: train: epoch 639 | step 10 | lr 0.000151 | loss 0.028898 | mae 0.120416 -[2024/06/24 06:44:28] ppsci INFO: train: epoch 639 | step 20 | lr 0.000151 | loss 0.034547 | mae 0.136882 -[2024/06/24 06:44:28] ppsci INFO: train: epoch 639 | step 30 | lr 0.000151 | loss 0.028725 | mae 0.126453 -[2024/06/24 06:44:29] ppsci INFO: train: epoch 639 | step 38 | lr 0.000151 | loss 0.060351 | mae 0.153615 -[2024/06/24 06:44:29] ppsci INFO: epoch: 639, train_loss: 0.035747, train_metric: 0.136899, eval_loss: 0.059273, eval_mae: 0.158659 -[2024/06/24 06:44:29] ppsci INFO: train: epoch 640 | step 0 | lr 0.000151 | loss 0.024430 | mae 0.119442 -[2024/06/24 06:44:30] ppsci INFO: train: epoch 640 | step 10 | lr 0.000151 | loss 0.034082 | mae 0.135615 -[2024/06/24 06:44:30] ppsci INFO: train: epoch 640 | step 20 | lr 0.000151 | loss 0.027596 | mae 0.130782 -[2024/06/24 06:44:31] ppsci INFO: train: epoch 640 | step 30 | lr 0.000151 | loss 0.043016 | mae 0.147506 -[2024/06/24 06:44:31] ppsci INFO: train: epoch 640 | step 38 | lr 0.000151 | loss 0.036477 | mae 0.142845 -[2024/06/24 06:44:31] ppsci INFO: epoch: 640, train_loss: 0.032506, train_metric: 0.134542, eval_loss: 0.059308, eval_mae: 0.156273 -[2024/06/24 06:44:31] ppsci INFO: train: epoch 641 | step 0 | lr 0.000150 | loss 0.034885 | mae 0.129802 -[2024/06/24 06:44:32] ppsci INFO: train: epoch 641 | step 10 | lr 0.000150 | loss 0.021616 | mae 0.113873 -[2024/06/24 06:44:32] ppsci INFO: train: epoch 641 | step 20 | lr 0.000150 | loss 0.026207 | mae 0.126617 -[2024/06/24 06:44:33] ppsci INFO: train: epoch 641 | step 30 | lr 0.000150 | loss 0.032480 | mae 0.130681 -[2024/06/24 06:44:33] ppsci INFO: train: epoch 641 | step 38 | lr 0.000150 | loss 0.027678 | mae 0.143749 -[2024/06/24 06:44:33] ppsci INFO: epoch: 641, train_loss: 0.034061, train_metric: 0.133503, eval_loss: 0.059634, eval_mae: 0.155968 -[2024/06/24 06:44:33] ppsci INFO: train: epoch 642 | step 0 | lr 0.000149 | loss 0.029464 | mae 0.129216 -[2024/06/24 06:44:34] ppsci INFO: train: epoch 642 | step 10 | lr 0.000149 | loss 0.033052 | mae 0.128969 -[2024/06/24 06:44:34] ppsci INFO: train: epoch 642 | step 20 | lr 0.000149 | loss 0.039772 | mae 0.141132 -[2024/06/24 06:44:35] ppsci INFO: train: epoch 642 | step 30 | lr 0.000149 | loss 0.031185 | mae 0.130573 -[2024/06/24 06:44:35] ppsci INFO: train: epoch 642 | step 38 | lr 0.000149 | loss 0.015986 | mae 0.111775 -[2024/06/24 06:44:35] ppsci INFO: epoch: 642, train_loss: 0.033341, train_metric: 0.133160, eval_loss: 0.060302, eval_mae: 0.157668 -[2024/06/24 06:44:35] ppsci INFO: train: epoch 643 | step 0 | lr 0.000149 | loss 0.032096 | mae 0.130402 -[2024/06/24 06:44:36] ppsci INFO: train: epoch 643 | step 10 | lr 0.000149 | loss 0.037505 | mae 0.136501 -[2024/06/24 06:44:37] ppsci INFO: train: epoch 643 | step 20 | lr 0.000149 | loss 0.042102 | mae 0.152061 -[2024/06/24 06:44:37] ppsci INFO: train: epoch 643 | step 30 | lr 0.000149 | loss 0.028688 | mae 0.129359 -[2024/06/24 06:44:37] ppsci INFO: train: epoch 643 | step 38 | lr 0.000149 | loss 0.016370 | mae 0.105083 -[2024/06/24 06:44:38] ppsci INFO: epoch: 643, train_loss: 0.033281, train_metric: 0.133679, eval_loss: 0.058219, eval_mae: 0.155659 -[2024/06/24 06:44:38] ppsci INFO: train: epoch 644 | step 0 | lr 0.000148 | loss 0.031516 | mae 0.130776 -[2024/06/24 06:44:38] ppsci INFO: train: epoch 644 | step 10 | lr 0.000148 | loss 0.039990 | mae 0.147712 -[2024/06/24 06:44:39] ppsci INFO: train: epoch 644 | step 20 | lr 0.000148 | loss 0.037395 | mae 0.139111 -[2024/06/24 06:44:39] ppsci INFO: train: epoch 644 | step 30 | lr 0.000148 | loss 0.033377 | mae 0.125968 -[2024/06/24 06:44:40] ppsci INFO: train: epoch 644 | step 38 | lr 0.000148 | loss 0.010720 | mae 0.088581 -[2024/06/24 06:44:40] ppsci INFO: epoch: 644, train_loss: 0.032624, train_metric: 0.134901, eval_loss: 0.054908, eval_mae: 0.150741 -[2024/06/24 06:44:40] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:44:40] ppsci INFO: train: epoch 645 | step 0 | lr 0.000147 | loss 0.036715 | mae 0.143581 -[2024/06/24 06:44:40] ppsci INFO: train: epoch 645 | step 10 | lr 0.000147 | loss 0.036808 | mae 0.141328 -[2024/06/24 06:44:41] ppsci INFO: train: epoch 645 | step 20 | lr 0.000147 | loss 0.033169 | mae 0.133461 -[2024/06/24 06:44:41] ppsci INFO: train: epoch 645 | step 30 | lr 0.000147 | loss 0.025492 | mae 0.121798 -[2024/06/24 06:44:42] ppsci INFO: train: epoch 645 | step 38 | lr 0.000147 | loss 0.033405 | mae 0.149805 -[2024/06/24 06:44:42] ppsci INFO: epoch: 645, train_loss: 0.032110, train_metric: 0.132844, eval_loss: 0.055359, eval_mae: 0.155006 -[2024/06/24 06:44:42] ppsci INFO: train: epoch 646 | step 0 | lr 0.000147 | loss 0.032905 | mae 0.133624 -[2024/06/24 06:44:42] ppsci INFO: train: epoch 646 | step 10 | lr 0.000147 | loss 0.025332 | mae 0.112650 -[2024/06/24 06:44:43] ppsci INFO: train: epoch 646 | step 20 | lr 0.000147 | loss 0.030199 | mae 0.131322 -[2024/06/24 06:44:43] ppsci INFO: train: epoch 646 | step 30 | lr 0.000147 | loss 0.038514 | mae 0.135191 -[2024/06/24 06:44:44] ppsci INFO: train: epoch 646 | step 38 | lr 0.000147 | loss 0.019822 | mae 0.098905 -[2024/06/24 06:44:44] ppsci INFO: epoch: 646, train_loss: 0.034670, train_metric: 0.136712, eval_loss: 0.056755, eval_mae: 0.153824 -[2024/06/24 06:44:44] ppsci INFO: train: epoch 647 | step 0 | lr 0.000146 | loss 0.032158 | mae 0.130897 -[2024/06/24 06:44:44] ppsci INFO: train: epoch 647 | step 10 | lr 0.000146 | loss 0.041540 | mae 0.134070 -[2024/06/24 06:44:45] ppsci INFO: train: epoch 647 | step 20 | lr 0.000146 | loss 0.036627 | mae 0.140952 -[2024/06/24 06:44:45] ppsci INFO: train: epoch 647 | step 30 | lr 0.000146 | loss 0.034724 | mae 0.137286 -[2024/06/24 06:44:46] ppsci INFO: train: epoch 647 | step 38 | lr 0.000146 | loss 0.026806 | mae 0.145303 -[2024/06/24 06:44:46] ppsci INFO: epoch: 647, train_loss: 0.034998, train_metric: 0.136710, eval_loss: 0.057352, eval_mae: 0.157876 -[2024/06/24 06:44:46] ppsci INFO: train: epoch 648 | step 0 | lr 0.000145 | loss 0.036300 | mae 0.137921 -[2024/06/24 06:44:47] ppsci INFO: train: epoch 648 | step 10 | lr 0.000145 | loss 0.036502 | mae 0.139846 -[2024/06/24 06:44:47] ppsci INFO: train: epoch 648 | step 20 | lr 0.000145 | loss 0.042281 | mae 0.135710 -[2024/06/24 06:44:48] ppsci INFO: train: epoch 648 | step 30 | lr 0.000145 | loss 0.038581 | mae 0.139776 -[2024/06/24 06:44:48] ppsci INFO: train: epoch 648 | step 38 | lr 0.000145 | loss 0.033757 | mae 0.141017 -[2024/06/24 06:44:48] ppsci INFO: epoch: 648, train_loss: 0.035205, train_metric: 0.135543, eval_loss: 0.058865, eval_mae: 0.157500 -[2024/06/24 06:44:48] ppsci INFO: train: epoch 649 | step 0 | lr 0.000144 | loss 0.025971 | mae 0.126023 -[2024/06/24 06:44:49] ppsci INFO: train: epoch 649 | step 10 | lr 0.000144 | loss 0.024278 | mae 0.120234 -[2024/06/24 06:44:49] ppsci INFO: train: epoch 649 | step 20 | lr 0.000144 | loss 0.027812 | mae 0.127615 -[2024/06/24 06:44:50] ppsci INFO: train: epoch 649 | step 30 | lr 0.000144 | loss 0.026627 | mae 0.126102 -[2024/06/24 06:44:50] ppsci INFO: train: epoch 649 | step 38 | lr 0.000144 | loss 0.022415 | mae 0.109832 -[2024/06/24 06:44:50] ppsci INFO: epoch: 649, train_loss: 0.032656, train_metric: 0.132718, eval_loss: 0.057612, eval_mae: 0.156023 -[2024/06/24 06:44:50] ppsci INFO: train: epoch 650 | step 0 | lr 0.000144 | loss 0.029818 | mae 0.119616 -[2024/06/24 06:44:51] ppsci INFO: train: epoch 650 | step 10 | lr 0.000144 | loss 0.021473 | mae 0.114576 -[2024/06/24 06:44:51] ppsci INFO: train: epoch 650 | step 20 | lr 0.000144 | loss 0.032268 | mae 0.135463 -[2024/06/24 06:44:52] ppsci INFO: train: epoch 650 | step 30 | lr 0.000144 | loss 0.029770 | mae 0.123214 -[2024/06/24 06:44:52] ppsci INFO: train: epoch 650 | step 38 | lr 0.000144 | loss 0.007759 | mae 0.073763 -[2024/06/24 06:44:52] ppsci INFO: epoch: 650, train_loss: 0.032674, train_metric: 0.131510, eval_loss: 0.055866, eval_mae: 0.155343 -[2024/06/24 06:44:52] ppsci INFO: train: epoch 651 | step 0 | lr 0.000143 | loss 0.027647 | mae 0.123906 -[2024/06/24 06:44:53] ppsci INFO: train: epoch 651 | step 10 | lr 0.000143 | loss 0.026114 | mae 0.116965 -[2024/06/24 06:44:53] ppsci INFO: train: epoch 651 | step 20 | lr 0.000143 | loss 0.044433 | mae 0.157303 -[2024/06/24 06:44:54] ppsci INFO: train: epoch 651 | step 30 | lr 0.000143 | loss 0.027250 | mae 0.119341 -[2024/06/24 06:44:54] ppsci INFO: train: epoch 651 | step 38 | lr 0.000143 | loss 0.025405 | mae 0.134511 -[2024/06/24 06:44:55] ppsci INFO: epoch: 651, train_loss: 0.032148, train_metric: 0.132486, eval_loss: 0.055472, eval_mae: 0.154564 -[2024/06/24 06:44:55] ppsci INFO: train: epoch 652 | step 0 | lr 0.000142 | loss 0.028686 | mae 0.127361 -[2024/06/24 06:44:55] ppsci INFO: train: epoch 652 | step 10 | lr 0.000142 | loss 0.032395 | mae 0.134617 -[2024/06/24 06:44:56] ppsci INFO: train: epoch 652 | step 20 | lr 0.000142 | loss 0.040950 | mae 0.143092 -[2024/06/24 06:44:56] ppsci INFO: train: epoch 652 | step 30 | lr 0.000142 | loss 0.035244 | mae 0.140624 -[2024/06/24 06:44:57] ppsci INFO: train: epoch 652 | step 38 | lr 0.000142 | loss 0.031186 | mae 0.140612 -[2024/06/24 06:44:57] ppsci INFO: epoch: 652, train_loss: 0.033375, train_metric: 0.133456, eval_loss: 0.055991, eval_mae: 0.155795 -[2024/06/24 06:44:57] ppsci INFO: train: epoch 653 | step 0 | lr 0.000142 | loss 0.037109 | mae 0.142855 -[2024/06/24 06:44:57] ppsci INFO: train: epoch 653 | step 10 | lr 0.000142 | loss 0.040754 | mae 0.151664 -[2024/06/24 06:44:58] ppsci INFO: train: epoch 653 | step 20 | lr 0.000142 | loss 0.041531 | mae 0.145541 -[2024/06/24 06:44:58] ppsci INFO: train: epoch 653 | step 30 | lr 0.000142 | loss 0.038076 | mae 0.137379 -[2024/06/24 06:44:59] ppsci INFO: train: epoch 653 | step 38 | lr 0.000142 | loss 0.023008 | mae 0.119627 -[2024/06/24 06:44:59] ppsci INFO: epoch: 653, train_loss: 0.033939, train_metric: 0.135658, eval_loss: 0.056842, eval_mae: 0.155715 -[2024/06/24 06:44:59] ppsci INFO: train: epoch 654 | step 0 | lr 0.000141 | loss 0.025878 | mae 0.113709 -[2024/06/24 06:44:59] ppsci INFO: train: epoch 654 | step 10 | lr 0.000141 | loss 0.034379 | mae 0.131202 -[2024/06/24 06:45:00] ppsci INFO: train: epoch 654 | step 20 | lr 0.000141 | loss 0.044917 | mae 0.155986 -[2024/06/24 06:45:00] ppsci INFO: train: epoch 654 | step 30 | lr 0.000141 | loss 0.034597 | mae 0.141063 -[2024/06/24 06:45:01] ppsci INFO: train: epoch 654 | step 38 | lr 0.000141 | loss 0.066102 | mae 0.199614 -[2024/06/24 06:45:01] ppsci INFO: epoch: 654, train_loss: 0.036015, train_metric: 0.137632, eval_loss: 0.056196, eval_mae: 0.154803 -[2024/06/24 06:45:01] ppsci INFO: train: epoch 655 | step 0 | lr 0.000140 | loss 0.052560 | mae 0.162431 -[2024/06/24 06:45:02] ppsci INFO: train: epoch 655 | step 10 | lr 0.000140 | loss 0.039406 | mae 0.131213 -[2024/06/24 06:45:02] ppsci INFO: train: epoch 655 | step 20 | lr 0.000140 | loss 0.034641 | mae 0.142472 -[2024/06/24 06:45:03] ppsci INFO: train: epoch 655 | step 30 | lr 0.000140 | loss 0.035972 | mae 0.142001 -[2024/06/24 06:45:03] ppsci INFO: train: epoch 655 | step 38 | lr 0.000140 | loss 0.012425 | mae 0.091728 -[2024/06/24 06:45:03] ppsci INFO: epoch: 655, train_loss: 0.032540, train_metric: 0.133652, eval_loss: 0.059123, eval_mae: 0.158073 -[2024/06/24 06:45:03] ppsci INFO: train: epoch 656 | step 0 | lr 0.000140 | loss 0.034005 | mae 0.134492 -[2024/06/24 06:45:04] ppsci INFO: train: epoch 656 | step 10 | lr 0.000140 | loss 0.038924 | mae 0.150494 -[2024/06/24 06:45:04] ppsci INFO: train: epoch 656 | step 20 | lr 0.000140 | loss 0.027240 | mae 0.129259 -[2024/06/24 06:45:05] ppsci INFO: train: epoch 656 | step 30 | lr 0.000140 | loss 0.032344 | mae 0.127682 -[2024/06/24 06:45:05] ppsci INFO: train: epoch 656 | step 38 | lr 0.000140 | loss 0.009846 | mae 0.081638 -[2024/06/24 06:45:05] ppsci INFO: epoch: 656, train_loss: 0.034818, train_metric: 0.136724, eval_loss: 0.058833, eval_mae: 0.156379 -[2024/06/24 06:45:05] ppsci INFO: train: epoch 657 | step 0 | lr 0.000139 | loss 0.024922 | mae 0.115335 -[2024/06/24 06:45:06] ppsci INFO: train: epoch 657 | step 10 | lr 0.000139 | loss 0.025988 | mae 0.119639 -[2024/06/24 06:45:07] ppsci INFO: train: epoch 657 | step 20 | lr 0.000139 | loss 0.044448 | mae 0.150966 -[2024/06/24 06:45:07] ppsci INFO: train: epoch 657 | step 30 | lr 0.000139 | loss 0.027155 | mae 0.122946 -[2024/06/24 06:45:08] ppsci INFO: train: epoch 657 | step 38 | lr 0.000139 | loss 0.034467 | mae 0.142026 -[2024/06/24 06:45:08] ppsci INFO: epoch: 657, train_loss: 0.032803, train_metric: 0.132033, eval_loss: 0.056938, eval_mae: 0.156236 -[2024/06/24 06:45:08] ppsci INFO: train: epoch 658 | step 0 | lr 0.000138 | loss 0.023144 | mae 0.121314 -[2024/06/24 06:45:08] ppsci INFO: train: epoch 658 | step 10 | lr 0.000138 | loss 0.023326 | mae 0.125417 -[2024/06/24 06:45:09] ppsci INFO: train: epoch 658 | step 20 | lr 0.000138 | loss 0.031130 | mae 0.134022 -[2024/06/24 06:45:09] ppsci INFO: train: epoch 658 | step 30 | lr 0.000138 | loss 0.025392 | mae 0.118087 -[2024/06/24 06:45:10] ppsci INFO: train: epoch 658 | step 38 | lr 0.000138 | loss 0.029477 | mae 0.137976 -[2024/06/24 06:45:10] ppsci INFO: epoch: 658, train_loss: 0.033859, train_metric: 0.133531, eval_loss: 0.059434, eval_mae: 0.156925 -[2024/06/24 06:45:10] ppsci INFO: train: epoch 659 | step 0 | lr 0.000138 | loss 0.028083 | mae 0.126333 -[2024/06/24 06:45:11] ppsci INFO: train: epoch 659 | step 10 | lr 0.000138 | loss 0.031823 | mae 0.135862 -[2024/06/24 06:45:11] ppsci INFO: train: epoch 659 | step 20 | lr 0.000138 | loss 0.030488 | mae 0.124693 -[2024/06/24 06:45:12] ppsci INFO: train: epoch 659 | step 30 | lr 0.000138 | loss 0.031844 | mae 0.127657 -[2024/06/24 06:45:12] ppsci INFO: train: epoch 659 | step 38 | lr 0.000138 | loss 0.024050 | mae 0.137932 -[2024/06/24 06:45:12] ppsci INFO: epoch: 659, train_loss: 0.035219, train_metric: 0.135170, eval_loss: 0.059199, eval_mae: 0.156349 -[2024/06/24 06:45:12] ppsci INFO: train: epoch 660 | step 0 | lr 0.000137 | loss 0.031899 | mae 0.127897 -[2024/06/24 06:45:13] ppsci INFO: train: epoch 660 | step 10 | lr 0.000137 | loss 0.056369 | mae 0.159907 -[2024/06/24 06:45:13] ppsci INFO: train: epoch 660 | step 20 | lr 0.000137 | loss 0.024702 | mae 0.116406 -[2024/06/24 06:45:14] ppsci INFO: train: epoch 660 | step 30 | lr 0.000137 | loss 0.047246 | mae 0.159030 -[2024/06/24 06:45:14] ppsci INFO: train: epoch 660 | step 38 | lr 0.000137 | loss 0.031851 | mae 0.154762 -[2024/06/24 06:45:14] ppsci INFO: epoch: 660, train_loss: 0.032408, train_metric: 0.132446, eval_loss: 0.055562, eval_mae: 0.153825 -[2024/06/24 06:45:14] ppsci INFO: train: epoch 661 | step 0 | lr 0.000136 | loss 0.029530 | mae 0.123770 -[2024/06/24 06:45:15] ppsci INFO: train: epoch 661 | step 10 | lr 0.000136 | loss 0.028079 | mae 0.122986 -[2024/06/24 06:45:16] ppsci INFO: train: epoch 661 | step 20 | lr 0.000136 | loss 0.032309 | mae 0.131298 -[2024/06/24 06:45:16] ppsci INFO: train: epoch 661 | step 30 | lr 0.000136 | loss 0.026221 | mae 0.124809 -[2024/06/24 06:45:17] ppsci INFO: train: epoch 661 | step 38 | lr 0.000136 | loss 0.018158 | mae 0.104562 -[2024/06/24 06:45:17] ppsci INFO: epoch: 661, train_loss: 0.033275, train_metric: 0.133451, eval_loss: 0.057660, eval_mae: 0.155384 -[2024/06/24 06:45:17] ppsci INFO: train: epoch 662 | step 0 | lr 0.000136 | loss 0.032938 | mae 0.132072 -[2024/06/24 06:45:17] ppsci INFO: train: epoch 662 | step 10 | lr 0.000136 | loss 0.043722 | mae 0.158133 -[2024/06/24 06:45:18] ppsci INFO: train: epoch 662 | step 20 | lr 0.000136 | loss 0.033151 | mae 0.134618 -[2024/06/24 06:45:18] ppsci INFO: train: epoch 662 | step 30 | lr 0.000136 | loss 0.033140 | mae 0.141991 -[2024/06/24 06:45:19] ppsci INFO: train: epoch 662 | step 38 | lr 0.000136 | loss 0.028981 | mae 0.130016 -[2024/06/24 06:45:19] ppsci INFO: epoch: 662, train_loss: 0.034496, train_metric: 0.135573, eval_loss: 0.056366, eval_mae: 0.154090 -[2024/06/24 06:45:19] ppsci INFO: train: epoch 663 | step 0 | lr 0.000135 | loss 0.035173 | mae 0.132352 -[2024/06/24 06:45:19] ppsci INFO: train: epoch 663 | step 10 | lr 0.000135 | loss 0.028342 | mae 0.126722 -[2024/06/24 06:45:20] ppsci INFO: train: epoch 663 | step 20 | lr 0.000135 | loss 0.047944 | mae 0.154903 -[2024/06/24 06:45:20] ppsci INFO: train: epoch 663 | step 30 | lr 0.000135 | loss 0.037916 | mae 0.139304 -[2024/06/24 06:45:21] ppsci INFO: train: epoch 663 | step 38 | lr 0.000135 | loss 0.019920 | mae 0.126570 -[2024/06/24 06:45:21] ppsci INFO: epoch: 663, train_loss: 0.033055, train_metric: 0.132994, eval_loss: 0.058850, eval_mae: 0.156766 -[2024/06/24 06:45:21] ppsci INFO: train: epoch 664 | step 0 | lr 0.000134 | loss 0.036043 | mae 0.141558 -[2024/06/24 06:45:22] ppsci INFO: train: epoch 664 | step 10 | lr 0.000134 | loss 0.034581 | mae 0.139142 -[2024/06/24 06:45:22] ppsci INFO: train: epoch 664 | step 20 | lr 0.000134 | loss 0.030845 | mae 0.123927 -[2024/06/24 06:45:23] ppsci INFO: train: epoch 664 | step 30 | lr 0.000134 | loss 0.029463 | mae 0.130884 -[2024/06/24 06:45:23] ppsci INFO: train: epoch 664 | step 38 | lr 0.000134 | loss 0.022587 | mae 0.102885 -[2024/06/24 06:45:23] ppsci INFO: epoch: 664, train_loss: 0.033973, train_metric: 0.136137, eval_loss: 0.060767, eval_mae: 0.157052 -[2024/06/24 06:45:23] ppsci INFO: train: epoch 665 | step 0 | lr 0.000134 | loss 0.023957 | mae 0.120322 -[2024/06/24 06:45:24] ppsci INFO: train: epoch 665 | step 10 | lr 0.000134 | loss 0.032593 | mae 0.137840 -[2024/06/24 06:45:24] ppsci INFO: train: epoch 665 | step 20 | lr 0.000134 | loss 0.049672 | mae 0.155125 -[2024/06/24 06:45:25] ppsci INFO: train: epoch 665 | step 30 | lr 0.000134 | loss 0.030156 | mae 0.130243 -[2024/06/24 06:45:25] ppsci INFO: train: epoch 665 | step 38 | lr 0.000134 | loss 0.058898 | mae 0.191888 -[2024/06/24 06:45:25] ppsci INFO: epoch: 665, train_loss: 0.035164, train_metric: 0.135532, eval_loss: 0.057053, eval_mae: 0.155489 -[2024/06/24 06:45:26] ppsci INFO: train: epoch 666 | step 0 | lr 0.000133 | loss 0.037055 | mae 0.137345 -[2024/06/24 06:45:26] ppsci INFO: train: epoch 666 | step 10 | lr 0.000133 | loss 0.029896 | mae 0.132604 -[2024/06/24 06:45:27] ppsci INFO: train: epoch 666 | step 20 | lr 0.000133 | loss 0.041075 | mae 0.152436 -[2024/06/24 06:45:27] ppsci INFO: train: epoch 666 | step 30 | lr 0.000133 | loss 0.028011 | mae 0.129369 -[2024/06/24 06:45:28] ppsci INFO: train: epoch 666 | step 38 | lr 0.000133 | loss 0.016241 | mae 0.114365 -[2024/06/24 06:45:28] ppsci INFO: epoch: 666, train_loss: 0.033185, train_metric: 0.134230, eval_loss: 0.058769, eval_mae: 0.155274 -[2024/06/24 06:45:28] ppsci INFO: train: epoch 667 | step 0 | lr 0.000132 | loss 0.020040 | mae 0.107428 -[2024/06/24 06:45:28] ppsci INFO: train: epoch 667 | step 10 | lr 0.000132 | loss 0.034376 | mae 0.138042 -[2024/06/24 06:45:29] ppsci INFO: train: epoch 667 | step 20 | lr 0.000132 | loss 0.032373 | mae 0.130967 -[2024/06/24 06:45:29] ppsci INFO: train: epoch 667 | step 30 | lr 0.000132 | loss 0.032705 | mae 0.125632 -[2024/06/24 06:45:30] ppsci INFO: train: epoch 667 | step 38 | lr 0.000132 | loss 0.027049 | mae 0.130775 -[2024/06/24 06:45:30] ppsci INFO: epoch: 667, train_loss: 0.033362, train_metric: 0.133486, eval_loss: 0.058459, eval_mae: 0.152545 -[2024/06/24 06:45:30] ppsci INFO: train: epoch 668 | step 0 | lr 0.000132 | loss 0.033419 | mae 0.134993 -[2024/06/24 06:45:30] ppsci INFO: train: epoch 668 | step 10 | lr 0.000132 | loss 0.031251 | mae 0.128529 -[2024/06/24 06:45:31] ppsci INFO: train: epoch 668 | step 20 | lr 0.000132 | loss 0.031840 | mae 0.136139 -[2024/06/24 06:45:31] ppsci INFO: train: epoch 668 | step 30 | lr 0.000132 | loss 0.028416 | mae 0.121571 -[2024/06/24 06:45:32] ppsci INFO: train: epoch 668 | step 38 | lr 0.000132 | loss 0.035810 | mae 0.148937 -[2024/06/24 06:45:32] ppsci INFO: epoch: 668, train_loss: 0.033026, train_metric: 0.131687, eval_loss: 0.058410, eval_mae: 0.154448 -[2024/06/24 06:45:32] ppsci INFO: train: epoch 669 | step 0 | lr 0.000131 | loss 0.026763 | mae 0.126871 -[2024/06/24 06:45:33] ppsci INFO: train: epoch 669 | step 10 | lr 0.000131 | loss 0.031462 | mae 0.143491 -[2024/06/24 06:45:33] ppsci INFO: train: epoch 669 | step 20 | lr 0.000131 | loss 0.032066 | mae 0.134195 -[2024/06/24 06:45:34] ppsci INFO: train: epoch 669 | step 30 | lr 0.000131 | loss 0.028129 | mae 0.125276 -[2024/06/24 06:45:34] ppsci INFO: train: epoch 669 | step 38 | lr 0.000131 | loss 0.027769 | mae 0.127182 -[2024/06/24 06:45:34] ppsci INFO: epoch: 669, train_loss: 0.033820, train_metric: 0.131776, eval_loss: 0.058171, eval_mae: 0.155737 -[2024/06/24 06:45:34] ppsci INFO: train: epoch 670 | step 0 | lr 0.000130 | loss 0.035032 | mae 0.137830 -[2024/06/24 06:45:35] ppsci INFO: train: epoch 670 | step 10 | lr 0.000130 | loss 0.036583 | mae 0.143931 -[2024/06/24 06:45:35] ppsci INFO: train: epoch 670 | step 20 | lr 0.000130 | loss 0.030429 | mae 0.130107 -[2024/06/24 06:45:36] ppsci INFO: train: epoch 670 | step 30 | lr 0.000130 | loss 0.037487 | mae 0.136746 -[2024/06/24 06:45:36] ppsci INFO: train: epoch 670 | step 38 | lr 0.000130 | loss 0.035611 | mae 0.146648 -[2024/06/24 06:45:36] ppsci INFO: epoch: 670, train_loss: 0.033153, train_metric: 0.133039, eval_loss: 0.059427, eval_mae: 0.156008 -[2024/06/24 06:45:36] ppsci INFO: train: epoch 671 | step 0 | lr 0.000130 | loss 0.030352 | mae 0.131056 -[2024/06/24 06:45:37] ppsci INFO: train: epoch 671 | step 10 | lr 0.000130 | loss 0.025780 | mae 0.125705 -[2024/06/24 06:45:37] ppsci INFO: train: epoch 671 | step 20 | lr 0.000130 | loss 0.041331 | mae 0.146261 -[2024/06/24 06:45:38] ppsci INFO: train: epoch 671 | step 30 | lr 0.000130 | loss 0.031933 | mae 0.133762 -[2024/06/24 06:45:38] ppsci INFO: train: epoch 671 | step 38 | lr 0.000130 | loss 0.013325 | mae 0.087626 -[2024/06/24 06:45:38] ppsci INFO: epoch: 671, train_loss: 0.033002, train_metric: 0.134226, eval_loss: 0.057361, eval_mae: 0.156226 -[2024/06/24 06:45:38] ppsci INFO: train: epoch 672 | step 0 | lr 0.000129 | loss 0.034611 | mae 0.141274 -[2024/06/24 06:45:39] ppsci INFO: train: epoch 672 | step 10 | lr 0.000129 | loss 0.028121 | mae 0.130146 -[2024/06/24 06:45:40] ppsci INFO: train: epoch 672 | step 20 | lr 0.000129 | loss 0.027354 | mae 0.122407 -[2024/06/24 06:45:40] ppsci INFO: train: epoch 672 | step 30 | lr 0.000129 | loss 0.029641 | mae 0.131235 -[2024/06/24 06:45:40] ppsci INFO: train: epoch 672 | step 38 | lr 0.000129 | loss 0.054829 | mae 0.175694 -[2024/06/24 06:45:40] ppsci INFO: epoch: 672, train_loss: 0.032936, train_metric: 0.131392, eval_loss: 0.058851, eval_mae: 0.156559 -[2024/06/24 06:45:41] ppsci INFO: train: epoch 673 | step 0 | lr 0.000128 | loss 0.031475 | mae 0.134498 -[2024/06/24 06:45:41] ppsci INFO: train: epoch 673 | step 10 | lr 0.000128 | loss 0.033402 | mae 0.142792 -[2024/06/24 06:45:42] ppsci INFO: train: epoch 673 | step 20 | lr 0.000128 | loss 0.031639 | mae 0.135307 -[2024/06/24 06:45:42] ppsci INFO: train: epoch 673 | step 30 | lr 0.000128 | loss 0.054314 | mae 0.147831 -[2024/06/24 06:45:43] ppsci INFO: train: epoch 673 | step 38 | lr 0.000128 | loss 0.032725 | mae 0.141274 -[2024/06/24 06:45:43] ppsci INFO: epoch: 673, train_loss: 0.033481, train_metric: 0.133814, eval_loss: 0.057553, eval_mae: 0.157585 -[2024/06/24 06:45:43] ppsci INFO: train: epoch 674 | step 0 | lr 0.000128 | loss 0.035941 | mae 0.146265 -[2024/06/24 06:45:43] ppsci INFO: train: epoch 674 | step 10 | lr 0.000128 | loss 0.027071 | mae 0.128369 -[2024/06/24 06:45:44] ppsci INFO: train: epoch 674 | step 20 | lr 0.000128 | loss 0.032630 | mae 0.133892 -[2024/06/24 06:45:45] ppsci INFO: train: epoch 674 | step 30 | lr 0.000128 | loss 0.034524 | mae 0.126974 -[2024/06/24 06:45:45] ppsci INFO: train: epoch 674 | step 38 | lr 0.000128 | loss 0.018287 | mae 0.118991 -[2024/06/24 06:45:45] ppsci INFO: epoch: 674, train_loss: 0.030879, train_metric: 0.131879, eval_loss: 0.057808, eval_mae: 0.154936 -[2024/06/24 06:45:45] ppsci INFO: train: epoch 675 | step 0 | lr 0.000127 | loss 0.033030 | mae 0.137702 -[2024/06/24 06:45:46] ppsci INFO: train: epoch 675 | step 10 | lr 0.000127 | loss 0.030863 | mae 0.130674 -[2024/06/24 06:45:46] ppsci INFO: train: epoch 675 | step 20 | lr 0.000127 | loss 0.030440 | mae 0.126346 -[2024/06/24 06:45:47] ppsci INFO: train: epoch 675 | step 30 | lr 0.000127 | loss 0.033314 | mae 0.133578 -[2024/06/24 06:45:47] ppsci INFO: train: epoch 675 | step 38 | lr 0.000127 | loss 0.028296 | mae 0.139387 -[2024/06/24 06:45:47] ppsci INFO: epoch: 675, train_loss: 0.032989, train_metric: 0.133065, eval_loss: 0.058460, eval_mae: 0.154764 -[2024/06/24 06:45:47] ppsci INFO: train: epoch 676 | step 0 | lr 0.000126 | loss 0.039000 | mae 0.149001 -[2024/06/24 06:45:48] ppsci INFO: train: epoch 676 | step 10 | lr 0.000126 | loss 0.034432 | mae 0.140898 -[2024/06/24 06:45:48] ppsci INFO: train: epoch 676 | step 20 | lr 0.000126 | loss 0.029022 | mae 0.129841 -[2024/06/24 06:45:49] ppsci INFO: train: epoch 676 | step 30 | lr 0.000126 | loss 0.029037 | mae 0.127866 -[2024/06/24 06:45:49] ppsci INFO: train: epoch 676 | step 38 | lr 0.000126 | loss 0.020147 | mae 0.105709 -[2024/06/24 06:45:49] ppsci INFO: epoch: 676, train_loss: 0.033826, train_metric: 0.133497, eval_loss: 0.058554, eval_mae: 0.157927 -[2024/06/24 06:45:49] ppsci INFO: train: epoch 677 | step 0 | lr 0.000126 | loss 0.024942 | mae 0.122636 -[2024/06/24 06:45:50] ppsci INFO: train: epoch 677 | step 10 | lr 0.000126 | loss 0.029531 | mae 0.129425 -[2024/06/24 06:45:51] ppsci INFO: train: epoch 677 | step 20 | lr 0.000126 | loss 0.030381 | mae 0.133569 -[2024/06/24 06:45:51] ppsci INFO: train: epoch 677 | step 30 | lr 0.000126 | loss 0.029335 | mae 0.125566 -[2024/06/24 06:45:51] ppsci INFO: train: epoch 677 | step 38 | lr 0.000126 | loss 0.023863 | mae 0.123236 -[2024/06/24 06:45:51] ppsci INFO: epoch: 677, train_loss: 0.033607, train_metric: 0.132239, eval_loss: 0.055599, eval_mae: 0.152718 -[2024/06/24 06:45:52] ppsci INFO: train: epoch 678 | step 0 | lr 0.000125 | loss 0.024725 | mae 0.119553 -[2024/06/24 06:45:52] ppsci INFO: train: epoch 678 | step 10 | lr 0.000125 | loss 0.022384 | mae 0.119753 -[2024/06/24 06:45:53] ppsci INFO: train: epoch 678 | step 20 | lr 0.000125 | loss 0.026487 | mae 0.124751 -[2024/06/24 06:45:53] ppsci INFO: train: epoch 678 | step 30 | lr 0.000125 | loss 0.034456 | mae 0.139170 -[2024/06/24 06:45:54] ppsci INFO: train: epoch 678 | step 38 | lr 0.000125 | loss 0.014498 | mae 0.089605 -[2024/06/24 06:45:54] ppsci INFO: epoch: 678, train_loss: 0.032378, train_metric: 0.132092, eval_loss: 0.056641, eval_mae: 0.151270 -[2024/06/24 06:45:54] ppsci INFO: train: epoch 679 | step 0 | lr 0.000124 | loss 0.041374 | mae 0.144297 -[2024/06/24 06:45:54] ppsci INFO: train: epoch 679 | step 10 | lr 0.000124 | loss 0.031308 | mae 0.139310 -[2024/06/24 06:45:55] ppsci INFO: train: epoch 679 | step 20 | lr 0.000124 | loss 0.031617 | mae 0.133793 -[2024/06/24 06:45:55] ppsci INFO: train: epoch 679 | step 30 | lr 0.000124 | loss 0.033693 | mae 0.133900 -[2024/06/24 06:45:56] ppsci INFO: train: epoch 679 | step 38 | lr 0.000124 | loss 0.032627 | mae 0.139071 -[2024/06/24 06:45:56] ppsci INFO: epoch: 679, train_loss: 0.032425, train_metric: 0.132805, eval_loss: 0.057401, eval_mae: 0.156244 -[2024/06/24 06:45:56] ppsci INFO: train: epoch 680 | step 0 | lr 0.000124 | loss 0.029110 | mae 0.124242 -[2024/06/24 06:45:56] ppsci INFO: train: epoch 680 | step 10 | lr 0.000124 | loss 0.026641 | mae 0.113772 -[2024/06/24 06:45:57] ppsci INFO: train: epoch 680 | step 20 | lr 0.000124 | loss 0.047285 | mae 0.156884 -[2024/06/24 06:45:57] ppsci INFO: train: epoch 680 | step 30 | lr 0.000124 | loss 0.032318 | mae 0.136216 -[2024/06/24 06:45:58] ppsci INFO: train: epoch 680 | step 38 | lr 0.000124 | loss 0.024754 | mae 0.137138 -[2024/06/24 06:45:58] ppsci INFO: epoch: 680, train_loss: 0.032001, train_metric: 0.131671, eval_loss: 0.057799, eval_mae: 0.157563 -[2024/06/24 06:45:58] ppsci INFO: train: epoch 681 | step 0 | lr 0.000123 | loss 0.051913 | mae 0.139808 -[2024/06/24 06:45:58] ppsci INFO: train: epoch 681 | step 10 | lr 0.000123 | loss 0.031207 | mae 0.116042 -[2024/06/24 06:45:59] ppsci INFO: train: epoch 681 | step 20 | lr 0.000123 | loss 0.033602 | mae 0.140404 -[2024/06/24 06:45:59] ppsci INFO: train: epoch 681 | step 30 | lr 0.000123 | loss 0.027526 | mae 0.122071 -[2024/06/24 06:46:00] ppsci INFO: train: epoch 681 | step 38 | lr 0.000123 | loss 0.026473 | mae 0.141777 -[2024/06/24 06:46:00] ppsci INFO: epoch: 681, train_loss: 0.033487, train_metric: 0.133738, eval_loss: 0.058364, eval_mae: 0.154153 -[2024/06/24 06:46:00] ppsci INFO: train: epoch 682 | step 0 | lr 0.000122 | loss 0.033827 | mae 0.134893 -[2024/06/24 06:46:00] ppsci INFO: train: epoch 682 | step 10 | lr 0.000122 | loss 0.027382 | mae 0.119115 -[2024/06/24 06:46:01] ppsci INFO: train: epoch 682 | step 20 | lr 0.000122 | loss 0.022461 | mae 0.120585 -[2024/06/24 06:46:01] ppsci INFO: train: epoch 682 | step 30 | lr 0.000122 | loss 0.029308 | mae 0.121895 -[2024/06/24 06:46:02] ppsci INFO: train: epoch 682 | step 38 | lr 0.000122 | loss 0.010399 | mae 0.085413 -[2024/06/24 06:46:02] ppsci INFO: epoch: 682, train_loss: 0.031514, train_metric: 0.130001, eval_loss: 0.057750, eval_mae: 0.155707 -[2024/06/24 06:46:02] ppsci INFO: train: epoch 683 | step 0 | lr 0.000122 | loss 0.041307 | mae 0.144120 -[2024/06/24 06:46:02] ppsci INFO: train: epoch 683 | step 10 | lr 0.000122 | loss 0.028642 | mae 0.119848 -[2024/06/24 06:46:03] ppsci INFO: train: epoch 683 | step 20 | lr 0.000122 | loss 0.026998 | mae 0.124122 -[2024/06/24 06:46:04] ppsci INFO: train: epoch 683 | step 30 | lr 0.000122 | loss 0.029097 | mae 0.125865 -[2024/06/24 06:46:04] ppsci INFO: train: epoch 683 | step 38 | lr 0.000122 | loss 0.039731 | mae 0.131155 -[2024/06/24 06:46:04] ppsci INFO: epoch: 683, train_loss: 0.032611, train_metric: 0.131472, eval_loss: 0.057018, eval_mae: 0.155013 -[2024/06/24 06:46:04] ppsci INFO: train: epoch 684 | step 0 | lr 0.000121 | loss 0.031503 | mae 0.129683 -[2024/06/24 06:46:05] ppsci INFO: train: epoch 684 | step 10 | lr 0.000121 | loss 0.035769 | mae 0.138623 -[2024/06/24 06:46:05] ppsci INFO: train: epoch 684 | step 20 | lr 0.000121 | loss 0.032955 | mae 0.137573 -[2024/06/24 06:46:06] ppsci INFO: train: epoch 684 | step 30 | lr 0.000121 | loss 0.036996 | mae 0.131743 -[2024/06/24 06:46:06] ppsci INFO: train: epoch 684 | step 38 | lr 0.000121 | loss 0.030960 | mae 0.150251 -[2024/06/24 06:46:06] ppsci INFO: epoch: 684, train_loss: 0.032817, train_metric: 0.133360, eval_loss: 0.056579, eval_mae: 0.153514 -[2024/06/24 06:46:06] ppsci INFO: train: epoch 685 | step 0 | lr 0.000120 | loss 0.026373 | mae 0.129378 -[2024/06/24 06:46:07] ppsci INFO: train: epoch 685 | step 10 | lr 0.000120 | loss 0.035316 | mae 0.141253 -[2024/06/24 06:46:07] ppsci INFO: train: epoch 685 | step 20 | lr 0.000120 | loss 0.034570 | mae 0.127568 -[2024/06/24 06:46:08] ppsci INFO: train: epoch 685 | step 30 | lr 0.000120 | loss 0.034478 | mae 0.134431 -[2024/06/24 06:46:08] ppsci INFO: train: epoch 685 | step 38 | lr 0.000120 | loss 0.021483 | mae 0.132268 -[2024/06/24 06:46:08] ppsci INFO: epoch: 685, train_loss: 0.033525, train_metric: 0.134476, eval_loss: 0.059000, eval_mae: 0.154025 -[2024/06/24 06:46:09] ppsci INFO: train: epoch 686 | step 0 | lr 0.000120 | loss 0.043124 | mae 0.154284 -[2024/06/24 06:46:09] ppsci INFO: train: epoch 686 | step 10 | lr 0.000120 | loss 0.035357 | mae 0.138716 -[2024/06/24 06:46:10] ppsci INFO: train: epoch 686 | step 20 | lr 0.000120 | loss 0.031494 | mae 0.131971 -[2024/06/24 06:46:10] ppsci INFO: train: epoch 686 | step 30 | lr 0.000120 | loss 0.025953 | mae 0.110161 -[2024/06/24 06:46:11] ppsci INFO: train: epoch 686 | step 38 | lr 0.000120 | loss 0.043422 | mae 0.148939 -[2024/06/24 06:46:11] ppsci INFO: epoch: 686, train_loss: 0.036021, train_metric: 0.136000, eval_loss: 0.058724, eval_mae: 0.155586 -[2024/06/24 06:46:11] ppsci INFO: train: epoch 687 | step 0 | lr 0.000119 | loss 0.044522 | mae 0.148683 -[2024/06/24 06:46:11] ppsci INFO: train: epoch 687 | step 10 | lr 0.000119 | loss 0.047117 | mae 0.154819 -[2024/06/24 06:46:12] ppsci INFO: train: epoch 687 | step 20 | lr 0.000119 | loss 0.033625 | mae 0.131131 -[2024/06/24 06:46:13] ppsci INFO: train: epoch 687 | step 30 | lr 0.000119 | loss 0.048699 | mae 0.133972 -[2024/06/24 06:46:13] ppsci INFO: train: epoch 687 | step 38 | lr 0.000119 | loss 0.023490 | mae 0.112549 -[2024/06/24 06:46:13] ppsci INFO: epoch: 687, train_loss: 0.034681, train_metric: 0.135750, eval_loss: 0.060417, eval_mae: 0.156778 -[2024/06/24 06:46:13] ppsci INFO: train: epoch 688 | step 0 | lr 0.000119 | loss 0.045082 | mae 0.150941 -[2024/06/24 06:46:14] ppsci INFO: train: epoch 688 | step 10 | lr 0.000119 | loss 0.031352 | mae 0.136397 -[2024/06/24 06:46:14] ppsci INFO: train: epoch 688 | step 20 | lr 0.000119 | loss 0.031043 | mae 0.133726 -[2024/06/24 06:46:15] ppsci INFO: train: epoch 688 | step 30 | lr 0.000119 | loss 0.031548 | mae 0.136272 -[2024/06/24 06:46:15] ppsci INFO: train: epoch 688 | step 38 | lr 0.000119 | loss 0.015239 | mae 0.092535 -[2024/06/24 06:46:15] ppsci INFO: epoch: 688, train_loss: 0.033435, train_metric: 0.133677, eval_loss: 0.060088, eval_mae: 0.158460 -[2024/06/24 06:46:15] ppsci INFO: train: epoch 689 | step 0 | lr 0.000118 | loss 0.017984 | mae 0.107497 -[2024/06/24 06:46:16] ppsci INFO: train: epoch 689 | step 10 | lr 0.000118 | loss 0.037942 | mae 0.143464 -[2024/06/24 06:46:16] ppsci INFO: train: epoch 689 | step 20 | lr 0.000118 | loss 0.038587 | mae 0.141013 -[2024/06/24 06:46:17] ppsci INFO: train: epoch 689 | step 30 | lr 0.000118 | loss 0.026033 | mae 0.123791 -[2024/06/24 06:46:17] ppsci INFO: train: epoch 689 | step 38 | lr 0.000118 | loss 0.042906 | mae 0.155062 -[2024/06/24 06:46:17] ppsci INFO: epoch: 689, train_loss: 0.033319, train_metric: 0.133262, eval_loss: 0.058874, eval_mae: 0.154171 -[2024/06/24 06:46:17] ppsci INFO: train: epoch 690 | step 0 | lr 0.000117 | loss 0.032507 | mae 0.141288 -[2024/06/24 06:46:18] ppsci INFO: train: epoch 690 | step 10 | lr 0.000117 | loss 0.034668 | mae 0.137887 -[2024/06/24 06:46:18] ppsci INFO: train: epoch 690 | step 20 | lr 0.000117 | loss 0.030727 | mae 0.129935 -[2024/06/24 06:46:19] ppsci INFO: train: epoch 690 | step 30 | lr 0.000117 | loss 0.025420 | mae 0.120792 -[2024/06/24 06:46:19] ppsci INFO: train: epoch 690 | step 38 | lr 0.000117 | loss 0.021153 | mae 0.121326 -[2024/06/24 06:46:19] ppsci INFO: epoch: 690, train_loss: 0.033071, train_metric: 0.134543, eval_loss: 0.060407, eval_mae: 0.155026 -[2024/06/24 06:46:19] ppsci INFO: train: epoch 691 | step 0 | lr 0.000117 | loss 0.028073 | mae 0.132138 -[2024/06/24 06:46:20] ppsci INFO: train: epoch 691 | step 10 | lr 0.000117 | loss 0.050973 | mae 0.132215 -[2024/06/24 06:46:21] ppsci INFO: train: epoch 691 | step 20 | lr 0.000117 | loss 0.029312 | mae 0.120394 -[2024/06/24 06:46:21] ppsci INFO: train: epoch 691 | step 30 | lr 0.000117 | loss 0.035251 | mae 0.145519 -[2024/06/24 06:46:22] ppsci INFO: train: epoch 691 | step 38 | lr 0.000117 | loss 0.030504 | mae 0.145475 -[2024/06/24 06:46:22] ppsci INFO: epoch: 691, train_loss: 0.033988, train_metric: 0.133826, eval_loss: 0.063757, eval_mae: 0.157189 -[2024/06/24 06:46:22] ppsci INFO: train: epoch 692 | step 0 | lr 0.000116 | loss 0.032761 | mae 0.132646 -[2024/06/24 06:46:22] ppsci INFO: train: epoch 692 | step 10 | lr 0.000116 | loss 0.025818 | mae 0.113050 -[2024/06/24 06:46:23] ppsci INFO: train: epoch 692 | step 20 | lr 0.000116 | loss 0.044871 | mae 0.151549 -[2024/06/24 06:46:23] ppsci INFO: train: epoch 692 | step 30 | lr 0.000116 | loss 0.028957 | mae 0.128308 -[2024/06/24 06:46:24] ppsci INFO: train: epoch 692 | step 38 | lr 0.000116 | loss 0.027443 | mae 0.143749 -[2024/06/24 06:46:24] ppsci INFO: epoch: 692, train_loss: 0.032825, train_metric: 0.131450, eval_loss: 0.058329, eval_mae: 0.156075 -[2024/06/24 06:46:24] ppsci INFO: train: epoch 693 | step 0 | lr 0.000115 | loss 0.032219 | mae 0.130117 -[2024/06/24 06:46:24] ppsci INFO: train: epoch 693 | step 10 | lr 0.000115 | loss 0.031824 | mae 0.127020 -[2024/06/24 06:46:25] ppsci INFO: train: epoch 693 | step 20 | lr 0.000115 | loss 0.037702 | mae 0.139156 -[2024/06/24 06:46:25] ppsci INFO: train: epoch 693 | step 30 | lr 0.000115 | loss 0.028227 | mae 0.124698 -[2024/06/24 06:46:26] ppsci INFO: train: epoch 693 | step 38 | lr 0.000115 | loss 0.052370 | mae 0.168764 -[2024/06/24 06:46:26] ppsci INFO: epoch: 693, train_loss: 0.035100, train_metric: 0.133531, eval_loss: 0.061694, eval_mae: 0.155904 -[2024/06/24 06:46:26] ppsci INFO: train: epoch 694 | step 0 | lr 0.000115 | loss 0.023913 | mae 0.121248 -[2024/06/24 06:46:26] ppsci INFO: train: epoch 694 | step 10 | lr 0.000115 | loss 0.024767 | mae 0.119896 -[2024/06/24 06:46:27] ppsci INFO: train: epoch 694 | step 20 | lr 0.000115 | loss 0.033780 | mae 0.141106 -[2024/06/24 06:46:27] ppsci INFO: train: epoch 694 | step 30 | lr 0.000115 | loss 0.029599 | mae 0.125235 -[2024/06/24 06:46:28] ppsci INFO: train: epoch 694 | step 38 | lr 0.000115 | loss 0.016384 | mae 0.107915 -[2024/06/24 06:46:28] ppsci INFO: epoch: 694, train_loss: 0.030731, train_metric: 0.129870, eval_loss: 0.061860, eval_mae: 0.158089 -[2024/06/24 06:46:28] ppsci INFO: train: epoch 695 | step 0 | lr 0.000114 | loss 0.038140 | mae 0.135345 -[2024/06/24 06:46:28] ppsci INFO: train: epoch 695 | step 10 | lr 0.000114 | loss 0.149354 | mae 0.156920 -[2024/06/24 06:46:29] ppsci INFO: train: epoch 695 | step 20 | lr 0.000114 | loss 0.038121 | mae 0.139631 -[2024/06/24 06:46:29] ppsci INFO: train: epoch 695 | step 30 | lr 0.000114 | loss 0.029420 | mae 0.127959 -[2024/06/24 06:46:30] ppsci INFO: train: epoch 695 | step 38 | lr 0.000114 | loss 0.020448 | mae 0.117261 -[2024/06/24 06:46:30] ppsci INFO: epoch: 695, train_loss: 0.037563, train_metric: 0.136287, eval_loss: 0.066808, eval_mae: 0.170614 -[2024/06/24 06:46:30] ppsci INFO: train: epoch 696 | step 0 | lr 0.000113 | loss 0.029601 | mae 0.125768 -[2024/06/24 06:46:31] ppsci INFO: train: epoch 696 | step 10 | lr 0.000113 | loss 0.033849 | mae 0.138744 -[2024/06/24 06:46:31] ppsci INFO: train: epoch 696 | step 20 | lr 0.000113 | loss 0.038594 | mae 0.147216 -[2024/06/24 06:46:32] ppsci INFO: train: epoch 696 | step 30 | lr 0.000113 | loss 0.027034 | mae 0.127525 -[2024/06/24 06:46:32] ppsci INFO: train: epoch 696 | step 38 | lr 0.000113 | loss 0.015199 | mae 0.106832 -[2024/06/24 06:46:32] ppsci INFO: epoch: 696, train_loss: 0.037498, train_metric: 0.136791, eval_loss: 0.060735, eval_mae: 0.156994 -[2024/06/24 06:46:32] ppsci INFO: train: epoch 697 | step 0 | lr 0.000113 | loss 0.032109 | mae 0.131126 -[2024/06/24 06:46:33] ppsci INFO: train: epoch 697 | step 10 | lr 0.000113 | loss 0.036748 | mae 0.146188 -[2024/06/24 06:46:33] ppsci INFO: train: epoch 697 | step 20 | lr 0.000113 | loss 0.036397 | mae 0.132518 -[2024/06/24 06:46:34] ppsci INFO: train: epoch 697 | step 30 | lr 0.000113 | loss 0.030598 | mae 0.132173 -[2024/06/24 06:46:34] ppsci INFO: train: epoch 697 | step 38 | lr 0.000113 | loss 0.020113 | mae 0.121077 -[2024/06/24 06:46:34] ppsci INFO: epoch: 697, train_loss: 0.031157, train_metric: 0.128894, eval_loss: 0.061968, eval_mae: 0.156980 -[2024/06/24 06:46:34] ppsci INFO: train: epoch 698 | step 0 | lr 0.000112 | loss 0.026092 | mae 0.125330 -[2024/06/24 06:46:35] ppsci INFO: train: epoch 698 | step 10 | lr 0.000112 | loss 0.036927 | mae 0.143858 -[2024/06/24 06:46:35] ppsci INFO: train: epoch 698 | step 20 | lr 0.000112 | loss 0.031507 | mae 0.134786 -[2024/06/24 06:46:36] ppsci INFO: train: epoch 698 | step 30 | lr 0.000112 | loss 0.039300 | mae 0.144851 -[2024/06/24 06:46:36] ppsci INFO: train: epoch 698 | step 38 | lr 0.000112 | loss 0.016503 | mae 0.107965 -[2024/06/24 06:46:36] ppsci INFO: epoch: 698, train_loss: 0.033117, train_metric: 0.132726, eval_loss: 0.061581, eval_mae: 0.155594 -[2024/06/24 06:46:36] ppsci INFO: train: epoch 699 | step 0 | lr 0.000112 | loss 0.017065 | mae 0.094572 -[2024/06/24 06:46:37] ppsci INFO: train: epoch 699 | step 10 | lr 0.000112 | loss 0.035954 | mae 0.131027 -[2024/06/24 06:46:37] ppsci INFO: train: epoch 699 | step 20 | lr 0.000112 | loss 0.028350 | mae 0.115452 -[2024/06/24 06:46:38] ppsci INFO: train: epoch 699 | step 30 | lr 0.000112 | loss 0.029676 | mae 0.126953 -[2024/06/24 06:46:38] ppsci INFO: train: epoch 699 | step 38 | lr 0.000112 | loss 0.024538 | mae 0.114042 -[2024/06/24 06:46:38] ppsci INFO: epoch: 699, train_loss: 0.031436, train_metric: 0.130388, eval_loss: 0.060737, eval_mae: 0.155578 -[2024/06/24 06:46:38] ppsci INFO: train: epoch 700 | step 0 | lr 0.000111 | loss 0.025277 | mae 0.120696 -[2024/06/24 06:46:39] ppsci INFO: train: epoch 700 | step 10 | lr 0.000111 | loss 0.039593 | mae 0.145410 -[2024/06/24 06:46:39] ppsci INFO: train: epoch 700 | step 20 | lr 0.000111 | loss 0.029059 | mae 0.127638 -[2024/06/24 06:46:40] ppsci INFO: train: epoch 700 | step 30 | lr 0.000111 | loss 0.026348 | mae 0.127678 -[2024/06/24 06:46:40] ppsci INFO: train: epoch 700 | step 38 | lr 0.000111 | loss 0.029400 | mae 0.125785 -[2024/06/24 06:46:41] ppsci INFO: epoch: 700, train_loss: 0.031912, train_metric: 0.132139, eval_loss: 0.058742, eval_mae: 0.155746 -[2024/06/24 06:46:41] ppsci INFO: train: epoch 701 | step 0 | lr 0.000110 | loss 0.032057 | mae 0.126894 -[2024/06/24 06:46:41] ppsci INFO: train: epoch 701 | step 10 | lr 0.000110 | loss 0.028788 | mae 0.126853 -[2024/06/24 06:46:42] ppsci INFO: train: epoch 701 | step 20 | lr 0.000110 | loss 0.023915 | mae 0.126708 -[2024/06/24 06:46:42] ppsci INFO: train: epoch 701 | step 30 | lr 0.000110 | loss 0.032566 | mae 0.130197 -[2024/06/24 06:46:43] ppsci INFO: train: epoch 701 | step 38 | lr 0.000110 | loss 0.030563 | mae 0.136369 -[2024/06/24 06:46:43] ppsci INFO: epoch: 701, train_loss: 0.031999, train_metric: 0.132669, eval_loss: 0.057726, eval_mae: 0.153355 -[2024/06/24 06:46:43] ppsci INFO: train: epoch 702 | step 0 | lr 0.000110 | loss 0.056960 | mae 0.162511 -[2024/06/24 06:46:43] ppsci INFO: train: epoch 702 | step 10 | lr 0.000110 | loss 0.022423 | mae 0.110841 -[2024/06/24 06:46:44] ppsci INFO: train: epoch 702 | step 20 | lr 0.000110 | loss 0.028236 | mae 0.130034 -[2024/06/24 06:46:44] ppsci INFO: train: epoch 702 | step 30 | lr 0.000110 | loss 0.041413 | mae 0.137632 -[2024/06/24 06:46:45] ppsci INFO: train: epoch 702 | step 38 | lr 0.000110 | loss 0.039845 | mae 0.139507 -[2024/06/24 06:46:45] ppsci INFO: epoch: 702, train_loss: 0.034536, train_metric: 0.134475, eval_loss: 0.059760, eval_mae: 0.155300 -[2024/06/24 06:46:45] ppsci INFO: train: epoch 703 | step 0 | lr 0.000109 | loss 0.037314 | mae 0.142852 -[2024/06/24 06:46:45] ppsci INFO: train: epoch 703 | step 10 | lr 0.000109 | loss 0.017665 | mae 0.104431 -[2024/06/24 06:46:46] ppsci INFO: train: epoch 703 | step 20 | lr 0.000109 | loss 0.030665 | mae 0.131957 -[2024/06/24 06:46:46] ppsci INFO: train: epoch 703 | step 30 | lr 0.000109 | loss 0.031813 | mae 0.135385 -[2024/06/24 06:46:47] ppsci INFO: train: epoch 703 | step 38 | lr 0.000109 | loss 0.025748 | mae 0.110026 -[2024/06/24 06:46:47] ppsci INFO: epoch: 703, train_loss: 0.032630, train_metric: 0.132343, eval_loss: 0.059333, eval_mae: 0.155451 -[2024/06/24 06:46:47] ppsci INFO: train: epoch 704 | step 0 | lr 0.000109 | loss 0.028501 | mae 0.129346 -[2024/06/24 06:46:48] ppsci INFO: train: epoch 704 | step 10 | lr 0.000109 | loss 0.038991 | mae 0.139792 -[2024/06/24 06:46:48] ppsci INFO: train: epoch 704 | step 20 | lr 0.000109 | loss 0.034153 | mae 0.138241 -[2024/06/24 06:46:49] ppsci INFO: train: epoch 704 | step 30 | lr 0.000109 | loss 0.019426 | mae 0.102749 -[2024/06/24 06:46:49] ppsci INFO: train: epoch 704 | step 38 | lr 0.000109 | loss 0.042316 | mae 0.188542 -[2024/06/24 06:46:49] ppsci INFO: epoch: 704, train_loss: 0.030160, train_metric: 0.128093, eval_loss: 0.059205, eval_mae: 0.154404 -[2024/06/24 06:46:49] ppsci INFO: train: epoch 705 | step 0 | lr 0.000108 | loss 0.042044 | mae 0.154087 -[2024/06/24 06:46:50] ppsci INFO: train: epoch 705 | step 10 | lr 0.000108 | loss 0.025455 | mae 0.115670 -[2024/06/24 06:46:50] ppsci INFO: train: epoch 705 | step 20 | lr 0.000108 | loss 0.027239 | mae 0.130287 -[2024/06/24 06:46:51] ppsci INFO: train: epoch 705 | step 30 | lr 0.000108 | loss 0.030492 | mae 0.129278 -[2024/06/24 06:46:51] ppsci INFO: train: epoch 705 | step 38 | lr 0.000108 | loss 0.034341 | mae 0.156043 -[2024/06/24 06:46:51] ppsci INFO: epoch: 705, train_loss: 0.031935, train_metric: 0.129653, eval_loss: 0.058779, eval_mae: 0.155646 -[2024/06/24 06:46:51] ppsci INFO: train: epoch 706 | step 0 | lr 0.000107 | loss 0.029611 | mae 0.125007 -[2024/06/24 06:46:52] ppsci INFO: train: epoch 706 | step 10 | lr 0.000107 | loss 0.025690 | mae 0.120948 -[2024/06/24 06:46:52] ppsci INFO: train: epoch 706 | step 20 | lr 0.000107 | loss 0.033765 | mae 0.131297 -[2024/06/24 06:46:53] ppsci INFO: train: epoch 706 | step 30 | lr 0.000107 | loss 0.026338 | mae 0.127496 -[2024/06/24 06:46:53] ppsci INFO: train: epoch 706 | step 38 | lr 0.000107 | loss 0.010433 | mae 0.084356 -[2024/06/24 06:46:53] ppsci INFO: epoch: 706, train_loss: 0.029010, train_metric: 0.126988, eval_loss: 0.057405, eval_mae: 0.154944 -[2024/06/24 06:46:53] ppsci INFO: train: epoch 707 | step 0 | lr 0.000107 | loss 0.022718 | mae 0.110889 -[2024/06/24 06:46:54] ppsci INFO: train: epoch 707 | step 10 | lr 0.000107 | loss 0.020545 | mae 0.114008 -[2024/06/24 06:46:54] ppsci INFO: train: epoch 707 | step 20 | lr 0.000107 | loss 0.032954 | mae 0.135741 -[2024/06/24 06:46:55] ppsci INFO: train: epoch 707 | step 30 | lr 0.000107 | loss 0.028179 | mae 0.130066 -[2024/06/24 06:46:55] ppsci INFO: train: epoch 707 | step 38 | lr 0.000107 | loss 0.026950 | mae 0.131221 -[2024/06/24 06:46:56] ppsci INFO: epoch: 707, train_loss: 0.030991, train_metric: 0.130236, eval_loss: 0.058805, eval_mae: 0.156238 -[2024/06/24 06:46:56] ppsci INFO: train: epoch 708 | step 0 | lr 0.000106 | loss 0.032685 | mae 0.133370 -[2024/06/24 06:46:56] ppsci INFO: train: epoch 708 | step 10 | lr 0.000106 | loss 0.028743 | mae 0.124888 -[2024/06/24 06:46:57] ppsci INFO: train: epoch 708 | step 20 | lr 0.000106 | loss 0.038860 | mae 0.139470 -[2024/06/24 06:46:57] ppsci INFO: train: epoch 708 | step 30 | lr 0.000106 | loss 0.038491 | mae 0.147028 -[2024/06/24 06:46:57] ppsci INFO: train: epoch 708 | step 38 | lr 0.000106 | loss 0.041315 | mae 0.158612 -[2024/06/24 06:46:58] ppsci INFO: epoch: 708, train_loss: 0.030524, train_metric: 0.128735, eval_loss: 0.058158, eval_mae: 0.154169 -[2024/06/24 06:46:58] ppsci INFO: train: epoch 709 | step 0 | lr 0.000105 | loss 0.028056 | mae 0.126496 -[2024/06/24 06:46:58] ppsci INFO: train: epoch 709 | step 10 | lr 0.000105 | loss 0.025927 | mae 0.120886 -[2024/06/24 06:46:59] ppsci INFO: train: epoch 709 | step 20 | lr 0.000105 | loss 0.034669 | mae 0.134845 -[2024/06/24 06:46:59] ppsci INFO: train: epoch 709 | step 30 | lr 0.000105 | loss 0.026843 | mae 0.119577 -[2024/06/24 06:47:00] ppsci INFO: train: epoch 709 | step 38 | lr 0.000105 | loss 0.047341 | mae 0.182139 -[2024/06/24 06:47:00] ppsci INFO: epoch: 709, train_loss: 0.032298, train_metric: 0.130279, eval_loss: 0.060377, eval_mae: 0.154148 -[2024/06/24 06:47:00] ppsci INFO: train: epoch 710 | step 0 | lr 0.000105 | loss 0.029575 | mae 0.130066 -[2024/06/24 06:47:00] ppsci INFO: train: epoch 710 | step 10 | lr 0.000105 | loss 0.036248 | mae 0.134628 -[2024/06/24 06:47:01] ppsci INFO: train: epoch 710 | step 20 | lr 0.000105 | loss 0.033546 | mae 0.134897 -[2024/06/24 06:47:01] ppsci INFO: train: epoch 710 | step 30 | lr 0.000105 | loss 0.025894 | mae 0.122129 -[2024/06/24 06:47:02] ppsci INFO: train: epoch 710 | step 38 | lr 0.000105 | loss 0.053079 | mae 0.163330 -[2024/06/24 06:47:02] ppsci INFO: epoch: 710, train_loss: 0.033672, train_metric: 0.132290, eval_loss: 0.059259, eval_mae: 0.154088 -[2024/06/24 06:47:02] ppsci INFO: train: epoch 711 | step 0 | lr 0.000104 | loss 0.037937 | mae 0.144119 -[2024/06/24 06:47:02] ppsci INFO: train: epoch 711 | step 10 | lr 0.000104 | loss 0.030755 | mae 0.124903 -[2024/06/24 06:47:03] ppsci INFO: train: epoch 711 | step 20 | lr 0.000104 | loss 0.023665 | mae 0.114832 -[2024/06/24 06:47:03] ppsci INFO: train: epoch 711 | step 30 | lr 0.000104 | loss 0.033666 | mae 0.129100 -[2024/06/24 06:47:04] ppsci INFO: train: epoch 711 | step 38 | lr 0.000104 | loss 0.021597 | mae 0.121466 -[2024/06/24 06:47:04] ppsci INFO: epoch: 711, train_loss: 0.031325, train_metric: 0.128876, eval_loss: 0.061229, eval_mae: 0.154788 -[2024/06/24 06:47:04] ppsci INFO: train: epoch 712 | step 0 | lr 0.000104 | loss 0.026854 | mae 0.120124 -[2024/06/24 06:47:04] ppsci INFO: train: epoch 712 | step 10 | lr 0.000104 | loss 0.027325 | mae 0.129486 -[2024/06/24 06:47:05] ppsci INFO: train: epoch 712 | step 20 | lr 0.000104 | loss 0.037474 | mae 0.145865 -[2024/06/24 06:47:05] ppsci INFO: train: epoch 712 | step 30 | lr 0.000104 | loss 0.037450 | mae 0.150033 -[2024/06/24 06:47:06] ppsci INFO: train: epoch 712 | step 38 | lr 0.000104 | loss 0.039885 | mae 0.152124 -[2024/06/24 06:47:06] ppsci INFO: epoch: 712, train_loss: 0.030438, train_metric: 0.128416, eval_loss: 0.058067, eval_mae: 0.154972 -[2024/06/24 06:47:06] ppsci INFO: train: epoch 713 | step 0 | lr 0.000103 | loss 0.034451 | mae 0.128909 -[2024/06/24 06:47:07] ppsci INFO: train: epoch 713 | step 10 | lr 0.000103 | loss 0.029447 | mae 0.127776 -[2024/06/24 06:47:07] ppsci INFO: train: epoch 713 | step 20 | lr 0.000103 | loss 0.031367 | mae 0.130303 -[2024/06/24 06:47:08] ppsci INFO: train: epoch 713 | step 30 | lr 0.000103 | loss 0.032851 | mae 0.131650 -[2024/06/24 06:47:08] ppsci INFO: train: epoch 713 | step 38 | lr 0.000103 | loss 0.136852 | mae 0.266649 -[2024/06/24 06:47:08] ppsci INFO: epoch: 713, train_loss: 0.036699, train_metric: 0.133150, eval_loss: 0.058223, eval_mae: 0.153464 -[2024/06/24 06:47:08] ppsci INFO: train: epoch 714 | step 0 | lr 0.000102 | loss 0.037780 | mae 0.144344 -[2024/06/24 06:47:09] ppsci INFO: train: epoch 714 | step 10 | lr 0.000102 | loss 0.040711 | mae 0.145700 -[2024/06/24 06:47:09] ppsci INFO: train: epoch 714 | step 20 | lr 0.000102 | loss 0.031304 | mae 0.130780 -[2024/06/24 06:47:10] ppsci INFO: train: epoch 714 | step 30 | lr 0.000102 | loss 0.037422 | mae 0.145020 -[2024/06/24 06:47:10] ppsci INFO: train: epoch 714 | step 38 | lr 0.000102 | loss 0.064536 | mae 0.161081 -[2024/06/24 06:47:10] ppsci INFO: epoch: 714, train_loss: 0.034760, train_metric: 0.134739, eval_loss: 0.056275, eval_mae: 0.153321 -[2024/06/24 06:47:10] ppsci INFO: train: epoch 715 | step 0 | lr 0.000102 | loss 0.028939 | mae 0.131711 -[2024/06/24 06:47:11] ppsci INFO: train: epoch 715 | step 10 | lr 0.000102 | loss 0.026552 | mae 0.123833 -[2024/06/24 06:47:11] ppsci INFO: train: epoch 715 | step 20 | lr 0.000102 | loss 0.033948 | mae 0.130551 -[2024/06/24 06:47:12] ppsci INFO: train: epoch 715 | step 30 | lr 0.000102 | loss 0.027902 | mae 0.126891 -[2024/06/24 06:47:12] ppsci INFO: train: epoch 715 | step 38 | lr 0.000102 | loss 0.045149 | mae 0.143970 -[2024/06/24 06:47:12] ppsci INFO: epoch: 715, train_loss: 0.030304, train_metric: 0.129104, eval_loss: 0.059485, eval_mae: 0.156381 -[2024/06/24 06:47:13] ppsci INFO: train: epoch 716 | step 0 | lr 0.000101 | loss 0.029035 | mae 0.131171 -[2024/06/24 06:47:13] ppsci INFO: train: epoch 716 | step 10 | lr 0.000101 | loss 0.030879 | mae 0.122794 -[2024/06/24 06:47:14] ppsci INFO: train: epoch 716 | step 20 | lr 0.000101 | loss 0.033051 | mae 0.140414 -[2024/06/24 06:47:14] ppsci INFO: train: epoch 716 | step 30 | lr 0.000101 | loss 0.028247 | mae 0.130971 -[2024/06/24 06:47:15] ppsci INFO: train: epoch 716 | step 38 | lr 0.000101 | loss 0.022992 | mae 0.129959 -[2024/06/24 06:47:15] ppsci INFO: epoch: 716, train_loss: 0.029659, train_metric: 0.126378, eval_loss: 0.056807, eval_mae: 0.155257 -[2024/06/24 06:47:15] ppsci INFO: train: epoch 717 | step 0 | lr 0.000101 | loss 0.033386 | mae 0.135215 -[2024/06/24 06:47:15] ppsci INFO: train: epoch 717 | step 10 | lr 0.000101 | loss 0.039906 | mae 0.146085 -[2024/06/24 06:47:16] ppsci INFO: train: epoch 717 | step 20 | lr 0.000101 | loss 0.022815 | mae 0.107260 -[2024/06/24 06:47:16] ppsci INFO: train: epoch 717 | step 30 | lr 0.000101 | loss 0.039839 | mae 0.134071 -[2024/06/24 06:47:17] ppsci INFO: train: epoch 717 | step 38 | lr 0.000101 | loss 0.036578 | mae 0.127351 -[2024/06/24 06:47:17] ppsci INFO: epoch: 717, train_loss: 0.031792, train_metric: 0.130952, eval_loss: 0.057127, eval_mae: 0.154309 -[2024/06/24 06:47:17] ppsci INFO: train: epoch 718 | step 0 | lr 0.000100 | loss 0.022138 | mae 0.114523 -[2024/06/24 06:47:18] ppsci INFO: train: epoch 718 | step 10 | lr 0.000100 | loss 0.024334 | mae 0.118150 -[2024/06/24 06:47:18] ppsci INFO: train: epoch 718 | step 20 | lr 0.000100 | loss 0.033320 | mae 0.127139 -[2024/06/24 06:47:19] ppsci INFO: train: epoch 718 | step 30 | lr 0.000100 | loss 0.032568 | mae 0.132894 -[2024/06/24 06:47:19] ppsci INFO: train: epoch 718 | step 38 | lr 0.000100 | loss 0.034790 | mae 0.146228 -[2024/06/24 06:47:19] ppsci INFO: epoch: 718, train_loss: 0.030376, train_metric: 0.128519, eval_loss: 0.059624, eval_mae: 0.154707 -[2024/06/24 06:47:19] ppsci INFO: train: epoch 719 | step 0 | lr 0.000099 | loss 0.032327 | mae 0.136031 -[2024/06/24 06:47:20] ppsci INFO: train: epoch 719 | step 10 | lr 0.000099 | loss 0.048688 | mae 0.148660 -[2024/06/24 06:47:20] ppsci INFO: train: epoch 719 | step 20 | lr 0.000099 | loss 0.029384 | mae 0.124869 -[2024/06/24 06:47:21] ppsci INFO: train: epoch 719 | step 30 | lr 0.000099 | loss 0.030135 | mae 0.142618 -[2024/06/24 06:47:21] ppsci INFO: train: epoch 719 | step 38 | lr 0.000099 | loss 0.047812 | mae 0.142631 -[2024/06/24 06:47:21] ppsci INFO: epoch: 719, train_loss: 0.031931, train_metric: 0.130924, eval_loss: 0.056187, eval_mae: 0.153756 -[2024/06/24 06:47:21] ppsci INFO: train: epoch 720 | step 0 | lr 0.000099 | loss 0.020316 | mae 0.105598 -[2024/06/24 06:47:22] ppsci INFO: train: epoch 720 | step 10 | lr 0.000099 | loss 0.026983 | mae 0.122343 -[2024/06/24 06:47:22] ppsci INFO: train: epoch 720 | step 20 | lr 0.000099 | loss 0.027542 | mae 0.122012 -[2024/06/24 06:47:23] ppsci INFO: train: epoch 720 | step 30 | lr 0.000099 | loss 0.028241 | mae 0.124161 -[2024/06/24 06:47:23] ppsci INFO: train: epoch 720 | step 38 | lr 0.000099 | loss 0.028114 | mae 0.111702 -[2024/06/24 06:47:23] ppsci INFO: epoch: 720, train_loss: 0.030441, train_metric: 0.127067, eval_loss: 0.056815, eval_mae: 0.156321 -[2024/06/24 06:47:23] ppsci INFO: train: epoch 721 | step 0 | lr 0.000098 | loss 0.027988 | mae 0.117829 -[2024/06/24 06:47:24] ppsci INFO: train: epoch 721 | step 10 | lr 0.000098 | loss 0.028242 | mae 0.126967 -[2024/06/24 06:47:25] ppsci INFO: train: epoch 721 | step 20 | lr 0.000098 | loss 0.028915 | mae 0.124137 -[2024/06/24 06:47:25] ppsci INFO: train: epoch 721 | step 30 | lr 0.000098 | loss 0.039334 | mae 0.137662 -[2024/06/24 06:47:25] ppsci INFO: train: epoch 721 | step 38 | lr 0.000098 | loss 0.020570 | mae 0.097820 -[2024/06/24 06:47:25] ppsci INFO: epoch: 721, train_loss: 0.030532, train_metric: 0.129841, eval_loss: 0.057640, eval_mae: 0.155115 -[2024/06/24 06:47:26] ppsci INFO: train: epoch 722 | step 0 | lr 0.000098 | loss 0.036611 | mae 0.146375 -[2024/06/24 06:47:26] ppsci INFO: train: epoch 722 | step 10 | lr 0.000098 | loss 0.037154 | mae 0.137788 -[2024/06/24 06:47:27] ppsci INFO: train: epoch 722 | step 20 | lr 0.000098 | loss 0.038368 | mae 0.147906 -[2024/06/24 06:47:27] ppsci INFO: train: epoch 722 | step 30 | lr 0.000098 | loss 0.029760 | mae 0.118053 -[2024/06/24 06:47:28] ppsci INFO: train: epoch 722 | step 38 | lr 0.000098 | loss 0.037787 | mae 0.154364 -[2024/06/24 06:47:28] ppsci INFO: epoch: 722, train_loss: 0.030926, train_metric: 0.129128, eval_loss: 0.058300, eval_mae: 0.154861 -[2024/06/24 06:47:28] ppsci INFO: train: epoch 723 | step 0 | lr 0.000097 | loss 0.027464 | mae 0.121657 -[2024/06/24 06:47:28] ppsci INFO: train: epoch 723 | step 10 | lr 0.000097 | loss 0.034470 | mae 0.135586 -[2024/06/24 06:47:29] ppsci INFO: train: epoch 723 | step 20 | lr 0.000097 | loss 0.019944 | mae 0.109867 -[2024/06/24 06:47:29] ppsci INFO: train: epoch 723 | step 30 | lr 0.000097 | loss 0.037768 | mae 0.129198 -[2024/06/24 06:47:30] ppsci INFO: train: epoch 723 | step 38 | lr 0.000097 | loss 0.073286 | mae 0.214610 -[2024/06/24 06:47:30] ppsci INFO: epoch: 723, train_loss: 0.031958, train_metric: 0.129984, eval_loss: 0.057776, eval_mae: 0.156198 -[2024/06/24 06:47:30] ppsci INFO: train: epoch 724 | step 0 | lr 0.000096 | loss 0.033293 | mae 0.136533 -[2024/06/24 06:47:30] ppsci INFO: train: epoch 724 | step 10 | lr 0.000096 | loss 0.031941 | mae 0.123706 -[2024/06/24 06:47:31] ppsci INFO: train: epoch 724 | step 20 | lr 0.000096 | loss 0.043986 | mae 0.136447 -[2024/06/24 06:47:32] ppsci INFO: train: epoch 724 | step 30 | lr 0.000096 | loss 0.029798 | mae 0.129193 -[2024/06/24 06:47:32] ppsci INFO: train: epoch 724 | step 38 | lr 0.000096 | loss 0.055958 | mae 0.176771 -[2024/06/24 06:47:32] ppsci INFO: epoch: 724, train_loss: 0.032461, train_metric: 0.130807, eval_loss: 0.056466, eval_mae: 0.156161 -[2024/06/24 06:47:32] ppsci INFO: train: epoch 725 | step 0 | lr 0.000096 | loss 0.025743 | mae 0.128963 -[2024/06/24 06:47:33] ppsci INFO: train: epoch 725 | step 10 | lr 0.000096 | loss 0.027377 | mae 0.122415 -[2024/06/24 06:47:33] ppsci INFO: train: epoch 725 | step 20 | lr 0.000096 | loss 0.029816 | mae 0.129569 -[2024/06/24 06:47:34] ppsci INFO: train: epoch 725 | step 30 | lr 0.000096 | loss 0.030561 | mae 0.125947 -[2024/06/24 06:47:34] ppsci INFO: train: epoch 725 | step 38 | lr 0.000096 | loss 0.026528 | mae 0.124828 -[2024/06/24 06:47:34] ppsci INFO: epoch: 725, train_loss: 0.032378, train_metric: 0.131933, eval_loss: 0.056648, eval_mae: 0.152477 -[2024/06/24 06:47:34] ppsci INFO: train: epoch 726 | step 0 | lr 0.000095 | loss 0.030603 | mae 0.125413 -[2024/06/24 06:47:35] ppsci INFO: train: epoch 726 | step 10 | lr 0.000095 | loss 0.034111 | mae 0.144238 -[2024/06/24 06:47:35] ppsci INFO: train: epoch 726 | step 20 | lr 0.000095 | loss 0.027883 | mae 0.124924 -[2024/06/24 06:47:36] ppsci INFO: train: epoch 726 | step 30 | lr 0.000095 | loss 0.023503 | mae 0.116135 -[2024/06/24 06:47:36] ppsci INFO: train: epoch 726 | step 38 | lr 0.000095 | loss 0.026972 | mae 0.139175 -[2024/06/24 06:47:36] ppsci INFO: epoch: 726, train_loss: 0.031578, train_metric: 0.130727, eval_loss: 0.056965, eval_mae: 0.156241 -[2024/06/24 06:47:36] ppsci INFO: train: epoch 727 | step 0 | lr 0.000095 | loss 0.032782 | mae 0.132767 -[2024/06/24 06:47:37] ppsci INFO: train: epoch 727 | step 10 | lr 0.000095 | loss 0.029304 | mae 0.133269 -[2024/06/24 06:47:37] ppsci INFO: train: epoch 727 | step 20 | lr 0.000095 | loss 0.036476 | mae 0.136097 -[2024/06/24 06:47:38] ppsci INFO: train: epoch 727 | step 30 | lr 0.000095 | loss 0.032703 | mae 0.133643 -[2024/06/24 06:47:38] ppsci INFO: train: epoch 727 | step 38 | lr 0.000095 | loss 0.035975 | mae 0.135027 -[2024/06/24 06:47:38] ppsci INFO: epoch: 727, train_loss: 0.032665, train_metric: 0.130944, eval_loss: 0.058524, eval_mae: 0.156020 -[2024/06/24 06:47:38] ppsci INFO: train: epoch 728 | step 0 | lr 0.000094 | loss 0.038587 | mae 0.143725 -[2024/06/24 06:47:39] ppsci INFO: train: epoch 728 | step 10 | lr 0.000094 | loss 0.026819 | mae 0.118640 -[2024/06/24 06:47:39] ppsci INFO: train: epoch 728 | step 20 | lr 0.000094 | loss 0.023116 | mae 0.118303 -[2024/06/24 06:47:40] ppsci INFO: train: epoch 728 | step 30 | lr 0.000094 | loss 0.049335 | mae 0.159998 -[2024/06/24 06:47:40] ppsci INFO: train: epoch 728 | step 38 | lr 0.000094 | loss 0.029202 | mae 0.116736 -[2024/06/24 06:47:40] ppsci INFO: epoch: 728, train_loss: 0.031207, train_metric: 0.128301, eval_loss: 0.059914, eval_mae: 0.156221 -[2024/06/24 06:47:40] ppsci INFO: train: epoch 729 | step 0 | lr 0.000094 | loss 0.040552 | mae 0.143341 -[2024/06/24 06:47:41] ppsci INFO: train: epoch 729 | step 10 | lr 0.000094 | loss 0.024651 | mae 0.120946 -[2024/06/24 06:47:41] ppsci INFO: train: epoch 729 | step 20 | lr 0.000094 | loss 0.030153 | mae 0.131060 -[2024/06/24 06:47:42] ppsci INFO: train: epoch 729 | step 30 | lr 0.000094 | loss 0.033027 | mae 0.134896 -[2024/06/24 06:47:42] ppsci INFO: train: epoch 729 | step 38 | lr 0.000094 | loss 0.037301 | mae 0.170603 -[2024/06/24 06:47:42] ppsci INFO: epoch: 729, train_loss: 0.031856, train_metric: 0.132416, eval_loss: 0.057298, eval_mae: 0.153259 -[2024/06/24 06:47:43] ppsci INFO: train: epoch 730 | step 0 | lr 0.000093 | loss 0.025118 | mae 0.124896 -[2024/06/24 06:47:43] ppsci INFO: train: epoch 730 | step 10 | lr 0.000093 | loss 0.031972 | mae 0.140621 -[2024/06/24 06:47:44] ppsci INFO: train: epoch 730 | step 20 | lr 0.000093 | loss 0.035959 | mae 0.140763 -[2024/06/24 06:47:44] ppsci INFO: train: epoch 730 | step 30 | lr 0.000093 | loss 0.031922 | mae 0.134234 -[2024/06/24 06:47:44] ppsci INFO: train: epoch 730 | step 38 | lr 0.000093 | loss 0.027799 | mae 0.142412 -[2024/06/24 06:47:44] ppsci INFO: epoch: 730, train_loss: 0.031274, train_metric: 0.130539, eval_loss: 0.055984, eval_mae: 0.152227 -[2024/06/24 06:47:45] ppsci INFO: train: epoch 731 | step 0 | lr 0.000092 | loss 0.035562 | mae 0.140257 -[2024/06/24 06:47:45] ppsci INFO: train: epoch 731 | step 10 | lr 0.000092 | loss 0.027812 | mae 0.122712 -[2024/06/24 06:47:46] ppsci INFO: train: epoch 731 | step 20 | lr 0.000092 | loss 0.026498 | mae 0.129485 -[2024/06/24 06:47:46] ppsci INFO: train: epoch 731 | step 30 | lr 0.000092 | loss 0.027914 | mae 0.120021 -[2024/06/24 06:47:47] ppsci INFO: train: epoch 731 | step 38 | lr 0.000092 | loss 0.033391 | mae 0.132965 -[2024/06/24 06:47:47] ppsci INFO: epoch: 731, train_loss: 0.030297, train_metric: 0.129083, eval_loss: 0.057328, eval_mae: 0.153809 -[2024/06/24 06:47:47] ppsci INFO: train: epoch 732 | step 0 | lr 0.000092 | loss 0.035837 | mae 0.136504 -[2024/06/24 06:47:47] ppsci INFO: train: epoch 732 | step 10 | lr 0.000092 | loss 0.018268 | mae 0.106390 -[2024/06/24 06:47:48] ppsci INFO: train: epoch 732 | step 20 | lr 0.000092 | loss 0.027698 | mae 0.124467 -[2024/06/24 06:47:48] ppsci INFO: train: epoch 732 | step 30 | lr 0.000092 | loss 0.029604 | mae 0.129784 -[2024/06/24 06:47:49] ppsci INFO: train: epoch 732 | step 38 | lr 0.000092 | loss 0.013464 | mae 0.093353 -[2024/06/24 06:47:49] ppsci INFO: epoch: 732, train_loss: 0.031255, train_metric: 0.131045, eval_loss: 0.057239, eval_mae: 0.153079 -[2024/06/24 06:47:49] ppsci INFO: train: epoch 733 | step 0 | lr 0.000091 | loss 0.041093 | mae 0.144593 -[2024/06/24 06:47:49] ppsci INFO: train: epoch 733 | step 10 | lr 0.000091 | loss 0.025648 | mae 0.122123 -[2024/06/24 06:47:50] ppsci INFO: train: epoch 733 | step 20 | lr 0.000091 | loss 0.030653 | mae 0.128571 -[2024/06/24 06:47:51] ppsci INFO: train: epoch 733 | step 30 | lr 0.000091 | loss 0.026572 | mae 0.119658 -[2024/06/24 06:47:51] ppsci INFO: train: epoch 733 | step 38 | lr 0.000091 | loss 0.063994 | mae 0.149734 -[2024/06/24 06:47:51] ppsci INFO: epoch: 733, train_loss: 0.033125, train_metric: 0.128942, eval_loss: 0.056694, eval_mae: 0.151654 -[2024/06/24 06:47:51] ppsci INFO: train: epoch 734 | step 0 | lr 0.000091 | loss 0.025516 | mae 0.125601 -[2024/06/24 06:47:52] ppsci INFO: train: epoch 734 | step 10 | lr 0.000091 | loss 0.033161 | mae 0.135970 -[2024/06/24 06:47:52] ppsci INFO: train: epoch 734 | step 20 | lr 0.000091 | loss 0.029715 | mae 0.122151 -[2024/06/24 06:47:53] ppsci INFO: train: epoch 734 | step 30 | lr 0.000091 | loss 0.032305 | mae 0.129169 -[2024/06/24 06:47:53] ppsci INFO: train: epoch 734 | step 38 | lr 0.000091 | loss 0.024079 | mae 0.134998 -[2024/06/24 06:47:53] ppsci INFO: epoch: 734, train_loss: 0.031871, train_metric: 0.129582, eval_loss: 0.054324, eval_mae: 0.150554 -[2024/06/24 06:47:53] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 06:47:53] ppsci INFO: train: epoch 735 | step 0 | lr 0.000090 | loss 0.024208 | mae 0.118346 -[2024/06/24 06:47:54] ppsci INFO: train: epoch 735 | step 10 | lr 0.000090 | loss 0.028982 | mae 0.127013 -[2024/06/24 06:47:54] ppsci INFO: train: epoch 735 | step 20 | lr 0.000090 | loss 0.022217 | mae 0.105903 -[2024/06/24 06:47:55] ppsci INFO: train: epoch 735 | step 30 | lr 0.000090 | loss 0.055124 | mae 0.140164 -[2024/06/24 06:47:55] ppsci INFO: train: epoch 735 | step 38 | lr 0.000090 | loss 0.031603 | mae 0.121066 -[2024/06/24 06:47:55] ppsci INFO: epoch: 735, train_loss: 0.031661, train_metric: 0.129725, eval_loss: 0.055866, eval_mae: 0.152863 -[2024/06/24 06:47:55] ppsci INFO: train: epoch 736 | step 0 | lr 0.000090 | loss 0.027349 | mae 0.119953 -[2024/06/24 06:47:56] ppsci INFO: train: epoch 736 | step 10 | lr 0.000090 | loss 0.048308 | mae 0.151992 -[2024/06/24 06:47:56] ppsci INFO: train: epoch 736 | step 20 | lr 0.000090 | loss 0.033053 | mae 0.129779 -[2024/06/24 06:47:57] ppsci INFO: train: epoch 736 | step 30 | lr 0.000090 | loss 0.030197 | mae 0.127586 -[2024/06/24 06:47:57] ppsci INFO: train: epoch 736 | step 38 | lr 0.000090 | loss 0.056004 | mae 0.161932 -[2024/06/24 06:47:57] ppsci INFO: epoch: 736, train_loss: 0.033378, train_metric: 0.132327, eval_loss: 0.056001, eval_mae: 0.153243 -[2024/06/24 06:47:57] ppsci INFO: train: epoch 737 | step 0 | lr 0.000089 | loss 0.034235 | mae 0.138383 -[2024/06/24 06:47:58] ppsci INFO: train: epoch 737 | step 10 | lr 0.000089 | loss 0.025136 | mae 0.120831 -[2024/06/24 06:47:58] ppsci INFO: train: epoch 737 | step 20 | lr 0.000089 | loss 0.029908 | mae 0.122777 -[2024/06/24 06:47:59] ppsci INFO: train: epoch 737 | step 30 | lr 0.000089 | loss 0.041263 | mae 0.142560 -[2024/06/24 06:47:59] ppsci INFO: train: epoch 737 | step 38 | lr 0.000089 | loss 0.071395 | mae 0.212958 -[2024/06/24 06:47:59] ppsci INFO: epoch: 737, train_loss: 0.031360, train_metric: 0.129057, eval_loss: 0.056779, eval_mae: 0.153611 -[2024/06/24 06:48:00] ppsci INFO: train: epoch 738 | step 0 | lr 0.000088 | loss 0.034633 | mae 0.137741 -[2024/06/24 06:48:00] ppsci INFO: train: epoch 738 | step 10 | lr 0.000088 | loss 0.031435 | mae 0.130291 -[2024/06/24 06:48:01] ppsci INFO: train: epoch 738 | step 20 | lr 0.000088 | loss 0.029441 | mae 0.121226 -[2024/06/24 06:48:01] ppsci INFO: train: epoch 738 | step 30 | lr 0.000088 | loss 0.030110 | mae 0.136875 -[2024/06/24 06:48:01] ppsci INFO: train: epoch 738 | step 38 | lr 0.000088 | loss 0.019231 | mae 0.083713 -[2024/06/24 06:48:01] ppsci INFO: epoch: 738, train_loss: 0.030687, train_metric: 0.129228, eval_loss: 0.057286, eval_mae: 0.153779 -[2024/06/24 06:48:02] ppsci INFO: train: epoch 739 | step 0 | lr 0.000088 | loss 0.026888 | mae 0.121666 -[2024/06/24 06:48:02] ppsci INFO: train: epoch 739 | step 10 | lr 0.000088 | loss 0.046461 | mae 0.148912 -[2024/06/24 06:48:03] ppsci INFO: train: epoch 739 | step 20 | lr 0.000088 | loss 0.032616 | mae 0.132660 -[2024/06/24 06:48:03] ppsci INFO: train: epoch 739 | step 30 | lr 0.000088 | loss 0.034894 | mae 0.131529 -[2024/06/24 06:48:03] ppsci INFO: train: epoch 739 | step 38 | lr 0.000088 | loss 0.021203 | mae 0.116031 -[2024/06/24 06:48:04] ppsci INFO: epoch: 739, train_loss: 0.031173, train_metric: 0.130059, eval_loss: 0.057080, eval_mae: 0.153791 -[2024/06/24 06:48:04] ppsci INFO: train: epoch 740 | step 0 | lr 0.000087 | loss 0.029764 | mae 0.125700 -[2024/06/24 06:48:04] ppsci INFO: train: epoch 740 | step 10 | lr 0.000087 | loss 0.026487 | mae 0.121664 -[2024/06/24 06:48:05] ppsci INFO: train: epoch 740 | step 20 | lr 0.000087 | loss 0.027586 | mae 0.117923 -[2024/06/24 06:48:05] ppsci INFO: train: epoch 740 | step 30 | lr 0.000087 | loss 0.043979 | mae 0.148516 -[2024/06/24 06:48:06] ppsci INFO: train: epoch 740 | step 38 | lr 0.000087 | loss 0.021017 | mae 0.107444 -[2024/06/24 06:48:06] ppsci INFO: epoch: 740, train_loss: 0.031785, train_metric: 0.131415, eval_loss: 0.059410, eval_mae: 0.153919 -[2024/06/24 06:48:06] ppsci INFO: train: epoch 741 | step 0 | lr 0.000087 | loss 0.025518 | mae 0.114813 -[2024/06/24 06:48:06] ppsci INFO: train: epoch 741 | step 10 | lr 0.000087 | loss 0.034673 | mae 0.137883 -[2024/06/24 06:48:07] ppsci INFO: train: epoch 741 | step 20 | lr 0.000087 | loss 0.034786 | mae 0.136917 -[2024/06/24 06:48:07] ppsci INFO: train: epoch 741 | step 30 | lr 0.000087 | loss 0.039332 | mae 0.145110 -[2024/06/24 06:48:08] ppsci INFO: train: epoch 741 | step 38 | lr 0.000087 | loss 0.009263 | mae 0.077949 -[2024/06/24 06:48:08] ppsci INFO: epoch: 741, train_loss: 0.030012, train_metric: 0.128709, eval_loss: 0.060980, eval_mae: 0.154891 -[2024/06/24 06:48:08] ppsci INFO: train: epoch 742 | step 0 | lr 0.000086 | loss 0.029826 | mae 0.129409 -[2024/06/24 06:48:08] ppsci INFO: train: epoch 742 | step 10 | lr 0.000086 | loss 0.039718 | mae 0.145031 -[2024/06/24 06:48:09] ppsci INFO: train: epoch 742 | step 20 | lr 0.000086 | loss 0.032142 | mae 0.127170 -[2024/06/24 06:48:09] ppsci INFO: train: epoch 742 | step 30 | lr 0.000086 | loss 0.024793 | mae 0.119779 -[2024/06/24 06:48:10] ppsci INFO: train: epoch 742 | step 38 | lr 0.000086 | loss 0.082319 | mae 0.203294 -[2024/06/24 06:48:10] ppsci INFO: epoch: 742, train_loss: 0.034064, train_metric: 0.132055, eval_loss: 0.060166, eval_mae: 0.158213 -[2024/06/24 06:48:10] ppsci INFO: train: epoch 743 | step 0 | lr 0.000086 | loss 0.032756 | mae 0.130050 -[2024/06/24 06:48:11] ppsci INFO: train: epoch 743 | step 10 | lr 0.000086 | loss 0.028977 | mae 0.130201 -[2024/06/24 06:48:11] ppsci INFO: train: epoch 743 | step 20 | lr 0.000086 | loss 0.040380 | mae 0.143369 -[2024/06/24 06:48:12] ppsci INFO: train: epoch 743 | step 30 | lr 0.000086 | loss 0.031534 | mae 0.131388 -[2024/06/24 06:48:12] ppsci INFO: train: epoch 743 | step 38 | lr 0.000086 | loss 0.020539 | mae 0.110392 -[2024/06/24 06:48:12] ppsci INFO: epoch: 743, train_loss: 0.031817, train_metric: 0.128659, eval_loss: 0.057497, eval_mae: 0.156645 -[2024/06/24 06:48:13] ppsci INFO: train: epoch 744 | step 0 | lr 0.000085 | loss 0.032249 | mae 0.134192 -[2024/06/24 06:48:13] ppsci INFO: train: epoch 744 | step 10 | lr 0.000085 | loss 0.028411 | mae 0.132661 -[2024/06/24 06:48:14] ppsci INFO: train: epoch 744 | step 20 | lr 0.000085 | loss 0.032937 | mae 0.128428 -[2024/06/24 06:48:14] ppsci INFO: train: epoch 744 | step 30 | lr 0.000085 | loss 0.044488 | mae 0.149980 -[2024/06/24 06:48:14] ppsci INFO: train: epoch 744 | step 38 | lr 0.000085 | loss 0.027261 | mae 0.121614 -[2024/06/24 06:48:15] ppsci INFO: epoch: 744, train_loss: 0.032423, train_metric: 0.128729, eval_loss: 0.060529, eval_mae: 0.156794 -[2024/06/24 06:48:15] ppsci INFO: train: epoch 745 | step 0 | lr 0.000085 | loss 0.023170 | mae 0.120139 -[2024/06/24 06:48:15] ppsci INFO: train: epoch 745 | step 10 | lr 0.000085 | loss 0.021272 | mae 0.109049 -[2024/06/24 06:48:16] ppsci INFO: train: epoch 745 | step 20 | lr 0.000085 | loss 0.031517 | mae 0.132693 -[2024/06/24 06:48:16] ppsci INFO: train: epoch 745 | step 30 | lr 0.000085 | loss 0.026800 | mae 0.123591 -[2024/06/24 06:48:17] ppsci INFO: train: epoch 745 | step 38 | lr 0.000085 | loss 0.044892 | mae 0.152140 -[2024/06/24 06:48:17] ppsci INFO: epoch: 745, train_loss: 0.031409, train_metric: 0.129098, eval_loss: 0.058819, eval_mae: 0.156642 -[2024/06/24 06:48:17] ppsci INFO: train: epoch 746 | step 0 | lr 0.000084 | loss 0.026390 | mae 0.125912 -[2024/06/24 06:48:17] ppsci INFO: train: epoch 746 | step 10 | lr 0.000084 | loss 0.025697 | mae 0.119795 -[2024/06/24 06:48:18] ppsci INFO: train: epoch 746 | step 20 | lr 0.000084 | loss 0.032496 | mae 0.137770 -[2024/06/24 06:48:18] ppsci INFO: train: epoch 746 | step 30 | lr 0.000084 | loss 0.027546 | mae 0.125271 -[2024/06/24 06:48:19] ppsci INFO: train: epoch 746 | step 38 | lr 0.000084 | loss 0.054328 | mae 0.174400 -[2024/06/24 06:48:19] ppsci INFO: epoch: 746, train_loss: 0.030256, train_metric: 0.126871, eval_loss: 0.057579, eval_mae: 0.154417 -[2024/06/24 06:48:19] ppsci INFO: train: epoch 747 | step 0 | lr 0.000083 | loss 0.034080 | mae 0.138196 -[2024/06/24 06:48:19] ppsci INFO: train: epoch 747 | step 10 | lr 0.000083 | loss 0.025969 | mae 0.115397 -[2024/06/24 06:48:20] ppsci INFO: train: epoch 747 | step 20 | lr 0.000083 | loss 0.031114 | mae 0.131639 -[2024/06/24 06:48:20] ppsci INFO: train: epoch 747 | step 30 | lr 0.000083 | loss 0.033902 | mae 0.134782 -[2024/06/24 06:48:21] ppsci INFO: train: epoch 747 | step 38 | lr 0.000083 | loss 0.039846 | mae 0.148133 -[2024/06/24 06:48:21] ppsci INFO: epoch: 747, train_loss: 0.031357, train_metric: 0.128777, eval_loss: 0.059222, eval_mae: 0.155386 -[2024/06/24 06:48:21] ppsci INFO: train: epoch 748 | step 0 | lr 0.000083 | loss 0.022854 | mae 0.119119 -[2024/06/24 06:48:21] ppsci INFO: train: epoch 748 | step 10 | lr 0.000083 | loss 0.029323 | mae 0.128459 -[2024/06/24 06:48:22] ppsci INFO: train: epoch 748 | step 20 | lr 0.000083 | loss 0.028158 | mae 0.123157 -[2024/06/24 06:48:22] ppsci INFO: train: epoch 748 | step 30 | lr 0.000083 | loss 0.030719 | mae 0.134115 -[2024/06/24 06:48:23] ppsci INFO: train: epoch 748 | step 38 | lr 0.000083 | loss 0.031717 | mae 0.136025 -[2024/06/24 06:48:23] ppsci INFO: epoch: 748, train_loss: 0.032021, train_metric: 0.129139, eval_loss: 0.059265, eval_mae: 0.156091 -[2024/06/24 06:48:23] ppsci INFO: train: epoch 749 | step 0 | lr 0.000082 | loss 0.024384 | mae 0.110294 -[2024/06/24 06:48:24] ppsci INFO: train: epoch 749 | step 10 | lr 0.000082 | loss 0.025690 | mae 0.126518 -[2024/06/24 06:48:24] ppsci INFO: train: epoch 749 | step 20 | lr 0.000082 | loss 0.040800 | mae 0.142819 -[2024/06/24 06:48:25] ppsci INFO: train: epoch 749 | step 30 | lr 0.000082 | loss 0.032618 | mae 0.133488 -[2024/06/24 06:48:25] ppsci INFO: train: epoch 749 | step 38 | lr 0.000082 | loss 0.010652 | mae 0.079049 -[2024/06/24 06:48:25] ppsci INFO: epoch: 749, train_loss: 0.031085, train_metric: 0.129412, eval_loss: 0.059051, eval_mae: 0.155092 -[2024/06/24 06:48:25] ppsci INFO: train: epoch 750 | step 0 | lr 0.000082 | loss 0.037158 | mae 0.144808 -[2024/06/24 06:48:26] ppsci INFO: train: epoch 750 | step 10 | lr 0.000082 | loss 0.027701 | mae 0.123800 -[2024/06/24 06:48:26] ppsci INFO: train: epoch 750 | step 20 | lr 0.000082 | loss 0.026195 | mae 0.115876 -[2024/06/24 06:48:27] ppsci INFO: train: epoch 750 | step 30 | lr 0.000082 | loss 0.035824 | mae 0.141975 -[2024/06/24 06:48:27] ppsci INFO: train: epoch 750 | step 38 | lr 0.000082 | loss 0.063270 | mae 0.179769 -[2024/06/24 06:48:27] ppsci INFO: epoch: 750, train_loss: 0.032243, train_metric: 0.130396, eval_loss: 0.057105, eval_mae: 0.153895 -[2024/06/24 06:48:27] ppsci INFO: train: epoch 751 | step 0 | lr 0.000081 | loss 0.030318 | mae 0.121450 -[2024/06/24 06:48:28] ppsci INFO: train: epoch 751 | step 10 | lr 0.000081 | loss 0.029989 | mae 0.130697 -[2024/06/24 06:48:28] ppsci INFO: train: epoch 751 | step 20 | lr 0.000081 | loss 0.039845 | mae 0.147390 -[2024/06/24 06:48:29] ppsci INFO: train: epoch 751 | step 30 | lr 0.000081 | loss 0.033756 | mae 0.137312 -[2024/06/24 06:48:29] ppsci INFO: train: epoch 751 | step 38 | lr 0.000081 | loss 0.028991 | mae 0.143601 -[2024/06/24 06:48:30] ppsci INFO: epoch: 751, train_loss: 0.030906, train_metric: 0.128593, eval_loss: 0.057164, eval_mae: 0.152869 -[2024/06/24 06:48:30] ppsci INFO: train: epoch 752 | step 0 | lr 0.000081 | loss 0.027049 | mae 0.120864 -[2024/06/24 06:48:30] ppsci INFO: train: epoch 752 | step 10 | lr 0.000081 | loss 0.031049 | mae 0.131898 -[2024/06/24 06:48:31] ppsci INFO: train: epoch 752 | step 20 | lr 0.000081 | loss 0.037334 | mae 0.140702 -[2024/06/24 06:48:31] ppsci INFO: train: epoch 752 | step 30 | lr 0.000081 | loss 0.013955 | mae 0.095060 -[2024/06/24 06:48:32] ppsci INFO: train: epoch 752 | step 38 | lr 0.000081 | loss 0.031644 | mae 0.142414 -[2024/06/24 06:48:32] ppsci INFO: epoch: 752, train_loss: 0.030131, train_metric: 0.127508, eval_loss: 0.058492, eval_mae: 0.155081 -[2024/06/24 06:48:32] ppsci INFO: train: epoch 753 | step 0 | lr 0.000080 | loss 0.026676 | mae 0.126092 -[2024/06/24 06:48:32] ppsci INFO: train: epoch 753 | step 10 | lr 0.000080 | loss 0.026586 | mae 0.122554 -[2024/06/24 06:48:33] ppsci INFO: train: epoch 753 | step 20 | lr 0.000080 | loss 0.030973 | mae 0.126855 -[2024/06/24 06:48:34] ppsci INFO: train: epoch 753 | step 30 | lr 0.000080 | loss 0.031778 | mae 0.137832 -[2024/06/24 06:48:34] ppsci INFO: train: epoch 753 | step 38 | lr 0.000080 | loss 0.049843 | mae 0.188695 -[2024/06/24 06:48:34] ppsci INFO: epoch: 753, train_loss: 0.031800, train_metric: 0.129526, eval_loss: 0.058189, eval_mae: 0.153963 -[2024/06/24 06:48:34] ppsci INFO: train: epoch 754 | step 0 | lr 0.000080 | loss 0.032784 | mae 0.127388 -[2024/06/24 06:48:35] ppsci INFO: train: epoch 754 | step 10 | lr 0.000080 | loss 0.026554 | mae 0.118507 -[2024/06/24 06:48:35] ppsci INFO: train: epoch 754 | step 20 | lr 0.000080 | loss 0.032496 | mae 0.131697 -[2024/06/24 06:48:36] ppsci INFO: train: epoch 754 | step 30 | lr 0.000080 | loss 0.032602 | mae 0.135887 -[2024/06/24 06:48:36] ppsci INFO: train: epoch 754 | step 38 | lr 0.000080 | loss 0.020283 | mae 0.098505 -[2024/06/24 06:48:36] ppsci INFO: epoch: 754, train_loss: 0.030126, train_metric: 0.127255, eval_loss: 0.056009, eval_mae: 0.153847 -[2024/06/24 06:48:36] ppsci INFO: train: epoch 755 | step 0 | lr 0.000079 | loss 0.031341 | mae 0.133043 -[2024/06/24 06:48:37] ppsci INFO: train: epoch 755 | step 10 | lr 0.000079 | loss 0.026146 | mae 0.119471 -[2024/06/24 06:48:37] ppsci INFO: train: epoch 755 | step 20 | lr 0.000079 | loss 0.033569 | mae 0.126137 -[2024/06/24 06:48:38] ppsci INFO: train: epoch 755 | step 30 | lr 0.000079 | loss 0.043597 | mae 0.117772 -[2024/06/24 06:48:38] ppsci INFO: train: epoch 755 | step 38 | lr 0.000079 | loss 0.034840 | mae 0.142543 -[2024/06/24 06:48:38] ppsci INFO: epoch: 755, train_loss: 0.030747, train_metric: 0.128088, eval_loss: 0.056974, eval_mae: 0.154984 -[2024/06/24 06:48:38] ppsci INFO: train: epoch 756 | step 0 | lr 0.000079 | loss 0.033192 | mae 0.130954 -[2024/06/24 06:48:39] ppsci INFO: train: epoch 756 | step 10 | lr 0.000079 | loss 0.025612 | mae 0.114648 -[2024/06/24 06:48:39] ppsci INFO: train: epoch 756 | step 20 | lr 0.000079 | loss 0.026883 | mae 0.126230 -[2024/06/24 06:48:40] ppsci INFO: train: epoch 756 | step 30 | lr 0.000079 | loss 0.030768 | mae 0.130346 -[2024/06/24 06:48:40] ppsci INFO: train: epoch 756 | step 38 | lr 0.000079 | loss 0.088909 | mae 0.209608 -[2024/06/24 06:48:40] ppsci INFO: epoch: 756, train_loss: 0.031893, train_metric: 0.127641, eval_loss: 0.055983, eval_mae: 0.153499 -[2024/06/24 06:48:40] ppsci INFO: train: epoch 757 | step 0 | lr 0.000078 | loss 0.024329 | mae 0.121252 -[2024/06/24 06:48:41] ppsci INFO: train: epoch 757 | step 10 | lr 0.000078 | loss 0.025843 | mae 0.113893 -[2024/06/24 06:48:41] ppsci INFO: train: epoch 757 | step 20 | lr 0.000078 | loss 0.031231 | mae 0.136182 -[2024/06/24 06:48:42] ppsci INFO: train: epoch 757 | step 30 | lr 0.000078 | loss 0.036085 | mae 0.130308 -[2024/06/24 06:48:42] ppsci INFO: train: epoch 757 | step 38 | lr 0.000078 | loss 0.056603 | mae 0.152587 -[2024/06/24 06:48:43] ppsci INFO: epoch: 757, train_loss: 0.030930, train_metric: 0.128352, eval_loss: 0.058576, eval_mae: 0.155753 -[2024/06/24 06:48:43] ppsci INFO: train: epoch 758 | step 0 | lr 0.000077 | loss 0.023467 | mae 0.115471 -[2024/06/24 06:48:43] ppsci INFO: train: epoch 758 | step 10 | lr 0.000077 | loss 0.030303 | mae 0.133738 -[2024/06/24 06:48:44] ppsci INFO: train: epoch 758 | step 20 | lr 0.000077 | loss 0.032236 | mae 0.134367 -[2024/06/24 06:48:44] ppsci INFO: train: epoch 758 | step 30 | lr 0.000077 | loss 0.042507 | mae 0.144021 -[2024/06/24 06:48:44] ppsci INFO: train: epoch 758 | step 38 | lr 0.000077 | loss 0.028871 | mae 0.128139 -[2024/06/24 06:48:45] ppsci INFO: epoch: 758, train_loss: 0.032698, train_metric: 0.131479, eval_loss: 0.057062, eval_mae: 0.152518 -[2024/06/24 06:48:45] ppsci INFO: train: epoch 759 | step 0 | lr 0.000077 | loss 0.024105 | mae 0.116106 -[2024/06/24 06:48:45] ppsci INFO: train: epoch 759 | step 10 | lr 0.000077 | loss 0.030255 | mae 0.135134 -[2024/06/24 06:48:46] ppsci INFO: train: epoch 759 | step 20 | lr 0.000077 | loss 0.044803 | mae 0.147346 -[2024/06/24 06:48:46] ppsci INFO: train: epoch 759 | step 30 | lr 0.000077 | loss 0.027795 | mae 0.131835 -[2024/06/24 06:48:47] ppsci INFO: train: epoch 759 | step 38 | lr 0.000077 | loss 0.050920 | mae 0.171115 -[2024/06/24 06:48:47] ppsci INFO: epoch: 759, train_loss: 0.030332, train_metric: 0.128242, eval_loss: 0.058857, eval_mae: 0.154310 -[2024/06/24 06:48:47] ppsci INFO: train: epoch 760 | step 0 | lr 0.000076 | loss 0.038059 | mae 0.136606 -[2024/06/24 06:48:47] ppsci INFO: train: epoch 760 | step 10 | lr 0.000076 | loss 0.032791 | mae 0.132419 -[2024/06/24 06:48:48] ppsci INFO: train: epoch 760 | step 20 | lr 0.000076 | loss 0.026328 | mae 0.116052 -[2024/06/24 06:48:48] ppsci INFO: train: epoch 760 | step 30 | lr 0.000076 | loss 0.034531 | mae 0.134142 -[2024/06/24 06:48:49] ppsci INFO: train: epoch 760 | step 38 | lr 0.000076 | loss 0.086113 | mae 0.190159 -[2024/06/24 06:48:49] ppsci INFO: epoch: 760, train_loss: 0.033083, train_metric: 0.129230, eval_loss: 0.060016, eval_mae: 0.155470 -[2024/06/24 06:48:49] ppsci INFO: train: epoch 761 | step 0 | lr 0.000076 | loss 0.035943 | mae 0.142442 -[2024/06/24 06:48:49] ppsci INFO: train: epoch 761 | step 10 | lr 0.000076 | loss 0.023651 | mae 0.117047 -[2024/06/24 06:48:50] ppsci INFO: train: epoch 761 | step 20 | lr 0.000076 | loss 0.030139 | mae 0.136952 -[2024/06/24 06:48:51] ppsci INFO: train: epoch 761 | step 30 | lr 0.000076 | loss 0.043845 | mae 0.145710 -[2024/06/24 06:48:51] ppsci INFO: train: epoch 761 | step 38 | lr 0.000076 | loss 0.028565 | mae 0.133538 -[2024/06/24 06:48:51] ppsci INFO: epoch: 761, train_loss: 0.031362, train_metric: 0.129863, eval_loss: 0.059641, eval_mae: 0.155043 -[2024/06/24 06:48:51] ppsci INFO: train: epoch 762 | step 0 | lr 0.000075 | loss 0.027918 | mae 0.127686 -[2024/06/24 06:48:52] ppsci INFO: train: epoch 762 | step 10 | lr 0.000075 | loss 0.035551 | mae 0.143826 -[2024/06/24 06:48:52] ppsci INFO: train: epoch 762 | step 20 | lr 0.000075 | loss 0.022650 | mae 0.113394 -[2024/06/24 06:48:53] ppsci INFO: train: epoch 762 | step 30 | lr 0.000075 | loss 0.030600 | mae 0.128103 -[2024/06/24 06:48:53] ppsci INFO: train: epoch 762 | step 38 | lr 0.000075 | loss 0.024758 | mae 0.119348 -[2024/06/24 06:48:53] ppsci INFO: epoch: 762, train_loss: 0.030056, train_metric: 0.127866, eval_loss: 0.058509, eval_mae: 0.154547 -[2024/06/24 06:48:53] ppsci INFO: train: epoch 763 | step 0 | lr 0.000075 | loss 0.027693 | mae 0.128886 -[2024/06/24 06:48:54] ppsci INFO: train: epoch 763 | step 10 | lr 0.000075 | loss 0.032786 | mae 0.134767 -[2024/06/24 06:48:55] ppsci INFO: train: epoch 763 | step 20 | lr 0.000075 | loss 0.042673 | mae 0.138558 -[2024/06/24 06:48:55] ppsci INFO: train: epoch 763 | step 30 | lr 0.000075 | loss 0.020937 | mae 0.103351 -[2024/06/24 06:48:55] ppsci INFO: train: epoch 763 | step 38 | lr 0.000075 | loss 0.028495 | mae 0.122630 -[2024/06/24 06:48:56] ppsci INFO: epoch: 763, train_loss: 0.028814, train_metric: 0.125275, eval_loss: 0.059326, eval_mae: 0.155257 -[2024/06/24 06:48:56] ppsci INFO: train: epoch 764 | step 0 | lr 0.000074 | loss 0.026709 | mae 0.119563 -[2024/06/24 06:48:56] ppsci INFO: train: epoch 764 | step 10 | lr 0.000074 | loss 0.029318 | mae 0.123934 -[2024/06/24 06:48:57] ppsci INFO: train: epoch 764 | step 20 | lr 0.000074 | loss 0.020691 | mae 0.115283 -[2024/06/24 06:48:57] ppsci INFO: train: epoch 764 | step 30 | lr 0.000074 | loss 0.022920 | mae 0.114578 -[2024/06/24 06:48:58] ppsci INFO: train: epoch 764 | step 38 | lr 0.000074 | loss 0.049536 | mae 0.169770 -[2024/06/24 06:48:58] ppsci INFO: epoch: 764, train_loss: 0.029994, train_metric: 0.126568, eval_loss: 0.059799, eval_mae: 0.156403 -[2024/06/24 06:48:58] ppsci INFO: train: epoch 765 | step 0 | lr 0.000074 | loss 0.036849 | mae 0.138399 -[2024/06/24 06:48:58] ppsci INFO: train: epoch 765 | step 10 | lr 0.000074 | loss 0.022736 | mae 0.117100 -[2024/06/24 06:48:59] ppsci INFO: train: epoch 765 | step 20 | lr 0.000074 | loss 0.027604 | mae 0.121007 -[2024/06/24 06:48:59] ppsci INFO: train: epoch 765 | step 30 | lr 0.000074 | loss 0.032530 | mae 0.129769 -[2024/06/24 06:49:00] ppsci INFO: train: epoch 765 | step 38 | lr 0.000074 | loss 0.023990 | mae 0.120754 -[2024/06/24 06:49:00] ppsci INFO: epoch: 765, train_loss: 0.030274, train_metric: 0.127909, eval_loss: 0.059502, eval_mae: 0.154725 -[2024/06/24 06:49:00] ppsci INFO: train: epoch 766 | step 0 | lr 0.000073 | loss 0.037908 | mae 0.155256 -[2024/06/24 06:49:00] ppsci INFO: train: epoch 766 | step 10 | lr 0.000073 | loss 0.026421 | mae 0.123848 -[2024/06/24 06:49:01] ppsci INFO: train: epoch 766 | step 20 | lr 0.000073 | loss 0.028029 | mae 0.120946 -[2024/06/24 06:49:02] ppsci INFO: train: epoch 766 | step 30 | lr 0.000073 | loss 0.031663 | mae 0.135863 -[2024/06/24 06:49:02] ppsci INFO: train: epoch 766 | step 38 | lr 0.000073 | loss 0.008946 | mae 0.080811 -[2024/06/24 06:49:02] ppsci INFO: epoch: 766, train_loss: 0.029729, train_metric: 0.127341, eval_loss: 0.062454, eval_mae: 0.158858 -[2024/06/24 06:49:02] ppsci INFO: train: epoch 767 | step 0 | lr 0.000073 | loss 0.025659 | mae 0.116043 -[2024/06/24 06:49:03] ppsci INFO: train: epoch 767 | step 10 | lr 0.000073 | loss 0.029065 | mae 0.129660 -[2024/06/24 06:49:03] ppsci INFO: train: epoch 767 | step 20 | lr 0.000073 | loss 0.039341 | mae 0.151290 -[2024/06/24 06:49:04] ppsci INFO: train: epoch 767 | step 30 | lr 0.000073 | loss 0.026677 | mae 0.123525 -[2024/06/24 06:49:04] ppsci INFO: train: epoch 767 | step 38 | lr 0.000073 | loss 0.065134 | mae 0.189445 -[2024/06/24 06:49:04] ppsci INFO: epoch: 767, train_loss: 0.030854, train_metric: 0.128953, eval_loss: 0.060524, eval_mae: 0.155983 -[2024/06/24 06:49:04] ppsci INFO: train: epoch 768 | step 0 | lr 0.000072 | loss 0.043766 | mae 0.145146 -[2024/06/24 06:49:05] ppsci INFO: train: epoch 768 | step 10 | lr 0.000072 | loss 0.036184 | mae 0.144953 -[2024/06/24 06:49:05] ppsci INFO: train: epoch 768 | step 20 | lr 0.000072 | loss 0.024848 | mae 0.122899 -[2024/06/24 06:49:06] ppsci INFO: train: epoch 768 | step 30 | lr 0.000072 | loss 0.029807 | mae 0.128877 -[2024/06/24 06:49:06] ppsci INFO: train: epoch 768 | step 38 | lr 0.000072 | loss 0.044854 | mae 0.184211 -[2024/06/24 06:49:06] ppsci INFO: epoch: 768, train_loss: 0.031475, train_metric: 0.129049, eval_loss: 0.058859, eval_mae: 0.154053 -[2024/06/24 06:49:06] ppsci INFO: train: epoch 769 | step 0 | lr 0.000072 | loss 0.028046 | mae 0.126996 -[2024/06/24 06:49:07] ppsci INFO: train: epoch 769 | step 10 | lr 0.000072 | loss 0.024565 | mae 0.119187 -[2024/06/24 06:49:08] ppsci INFO: train: epoch 769 | step 20 | lr 0.000072 | loss 0.024453 | mae 0.120282 -[2024/06/24 06:49:08] ppsci INFO: train: epoch 769 | step 30 | lr 0.000072 | loss 0.031318 | mae 0.136374 -[2024/06/24 06:49:09] ppsci INFO: train: epoch 769 | step 38 | lr 0.000072 | loss 0.056881 | mae 0.171957 -[2024/06/24 06:49:09] ppsci INFO: epoch: 769, train_loss: 0.032353, train_metric: 0.130084, eval_loss: 0.060336, eval_mae: 0.154017 -[2024/06/24 06:49:09] ppsci INFO: train: epoch 770 | step 0 | lr 0.000071 | loss 0.027073 | mae 0.123603 -[2024/06/24 06:49:09] ppsci INFO: train: epoch 770 | step 10 | lr 0.000071 | loss 0.035848 | mae 0.134213 -[2024/06/24 06:49:10] ppsci INFO: train: epoch 770 | step 20 | lr 0.000071 | loss 0.027490 | mae 0.126423 -[2024/06/24 06:49:10] ppsci INFO: train: epoch 770 | step 30 | lr 0.000071 | loss 0.025202 | mae 0.115514 -[2024/06/24 06:49:11] ppsci INFO: train: epoch 770 | step 38 | lr 0.000071 | loss 0.026761 | mae 0.116087 -[2024/06/24 06:49:11] ppsci INFO: epoch: 770, train_loss: 0.032022, train_metric: 0.130522, eval_loss: 0.058309, eval_mae: 0.153409 -[2024/06/24 06:49:11] ppsci INFO: train: epoch 771 | step 0 | lr 0.000071 | loss 0.019337 | mae 0.100974 -[2024/06/24 06:49:12] ppsci INFO: train: epoch 771 | step 10 | lr 0.000071 | loss 0.027741 | mae 0.126568 -[2024/06/24 06:49:12] ppsci INFO: train: epoch 771 | step 20 | lr 0.000071 | loss 0.037622 | mae 0.133549 -[2024/06/24 06:49:13] ppsci INFO: train: epoch 771 | step 30 | lr 0.000071 | loss 0.029312 | mae 0.129267 -[2024/06/24 06:49:13] ppsci INFO: train: epoch 771 | step 38 | lr 0.000071 | loss 0.017816 | mae 0.095464 -[2024/06/24 06:49:13] ppsci INFO: epoch: 771, train_loss: 0.030227, train_metric: 0.128193, eval_loss: 0.057949, eval_mae: 0.152435 -[2024/06/24 06:49:13] ppsci INFO: train: epoch 772 | step 0 | lr 0.000070 | loss 0.051018 | mae 0.138848 -[2024/06/24 06:49:14] ppsci INFO: train: epoch 772 | step 10 | lr 0.000070 | loss 0.029767 | mae 0.122464 -[2024/06/24 06:49:15] ppsci INFO: train: epoch 772 | step 20 | lr 0.000070 | loss 0.028847 | mae 0.129586 -[2024/06/24 06:49:15] ppsci INFO: train: epoch 772 | step 30 | lr 0.000070 | loss 0.023459 | mae 0.115454 -[2024/06/24 06:49:15] ppsci INFO: train: epoch 772 | step 38 | lr 0.000070 | loss 0.042260 | mae 0.166577 -[2024/06/24 06:49:16] ppsci INFO: epoch: 772, train_loss: 0.030964, train_metric: 0.128087, eval_loss: 0.058537, eval_mae: 0.153526 -[2024/06/24 06:49:16] ppsci INFO: train: epoch 773 | step 0 | lr 0.000070 | loss 0.036416 | mae 0.130144 -[2024/06/24 06:49:16] ppsci INFO: train: epoch 773 | step 10 | lr 0.000070 | loss 0.031721 | mae 0.131241 -[2024/06/24 06:49:17] ppsci INFO: train: epoch 773 | step 20 | lr 0.000070 | loss 0.030275 | mae 0.135085 -[2024/06/24 06:49:17] ppsci INFO: train: epoch 773 | step 30 | lr 0.000070 | loss 0.032717 | mae 0.128101 -[2024/06/24 06:49:18] ppsci INFO: train: epoch 773 | step 38 | lr 0.000070 | loss 0.011691 | mae 0.078324 -[2024/06/24 06:49:18] ppsci INFO: epoch: 773, train_loss: 0.030040, train_metric: 0.128146, eval_loss: 0.060020, eval_mae: 0.155381 -[2024/06/24 06:49:18] ppsci INFO: train: epoch 774 | step 0 | lr 0.000069 | loss 0.030395 | mae 0.134984 -[2024/06/24 06:49:18] ppsci INFO: train: epoch 774 | step 10 | lr 0.000069 | loss 0.029821 | mae 0.135115 -[2024/06/24 06:49:19] ppsci INFO: train: epoch 774 | step 20 | lr 0.000069 | loss 0.029862 | mae 0.120017 -[2024/06/24 06:49:20] ppsci INFO: train: epoch 774 | step 30 | lr 0.000069 | loss 0.027072 | mae 0.124885 -[2024/06/24 06:49:20] ppsci INFO: train: epoch 774 | step 38 | lr 0.000069 | loss 0.049876 | mae 0.153683 -[2024/06/24 06:49:20] ppsci INFO: epoch: 774, train_loss: 0.030559, train_metric: 0.127444, eval_loss: 0.059730, eval_mae: 0.155756 -[2024/06/24 06:49:20] ppsci INFO: train: epoch 775 | step 0 | lr 0.000069 | loss 0.019175 | mae 0.107071 -[2024/06/24 06:49:21] ppsci INFO: train: epoch 775 | step 10 | lr 0.000069 | loss 0.028411 | mae 0.128774 -[2024/06/24 06:49:21] ppsci INFO: train: epoch 775 | step 20 | lr 0.000069 | loss 0.024601 | mae 0.118928 -[2024/06/24 06:49:22] ppsci INFO: train: epoch 775 | step 30 | lr 0.000069 | loss 0.017736 | mae 0.104669 -[2024/06/24 06:49:22] ppsci INFO: train: epoch 775 | step 38 | lr 0.000069 | loss 0.015597 | mae 0.108011 -[2024/06/24 06:49:22] ppsci INFO: epoch: 775, train_loss: 0.029926, train_metric: 0.128325, eval_loss: 0.061481, eval_mae: 0.156303 -[2024/06/24 06:49:22] ppsci INFO: train: epoch 776 | step 0 | lr 0.000068 | loss 0.035945 | mae 0.139031 -[2024/06/24 06:49:23] ppsci INFO: train: epoch 776 | step 10 | lr 0.000068 | loss 0.030696 | mae 0.133541 -[2024/06/24 06:49:23] ppsci INFO: train: epoch 776 | step 20 | lr 0.000068 | loss 0.024967 | mae 0.122478 -[2024/06/24 06:49:24] ppsci INFO: train: epoch 776 | step 30 | lr 0.000068 | loss 0.028687 | mae 0.121736 -[2024/06/24 06:49:24] ppsci INFO: train: epoch 776 | step 38 | lr 0.000068 | loss 0.012087 | mae 0.090914 -[2024/06/24 06:49:24] ppsci INFO: epoch: 776, train_loss: 0.028663, train_metric: 0.126179, eval_loss: 0.058844, eval_mae: 0.154630 -[2024/06/24 06:49:24] ppsci INFO: train: epoch 777 | step 0 | lr 0.000068 | loss 0.037799 | mae 0.132517 -[2024/06/24 06:49:25] ppsci INFO: train: epoch 777 | step 10 | lr 0.000068 | loss 0.027829 | mae 0.128021 -[2024/06/24 06:49:26] ppsci INFO: train: epoch 777 | step 20 | lr 0.000068 | loss 0.031599 | mae 0.135426 -[2024/06/24 06:49:26] ppsci INFO: train: epoch 777 | step 30 | lr 0.000068 | loss 0.030520 | mae 0.133930 -[2024/06/24 06:49:26] ppsci INFO: train: epoch 777 | step 38 | lr 0.000068 | loss 0.027254 | mae 0.114826 -[2024/06/24 06:49:27] ppsci INFO: epoch: 777, train_loss: 0.031262, train_metric: 0.128907, eval_loss: 0.058347, eval_mae: 0.153571 -[2024/06/24 06:49:27] ppsci INFO: train: epoch 778 | step 0 | lr 0.000067 | loss 0.022631 | mae 0.113228 -[2024/06/24 06:49:27] ppsci INFO: train: epoch 778 | step 10 | lr 0.000067 | loss 0.026845 | mae 0.124686 -[2024/06/24 06:49:28] ppsci INFO: train: epoch 778 | step 20 | lr 0.000067 | loss 0.034510 | mae 0.135501 -[2024/06/24 06:49:28] ppsci INFO: train: epoch 778 | step 30 | lr 0.000067 | loss 0.040190 | mae 0.123148 -[2024/06/24 06:49:29] ppsci INFO: train: epoch 778 | step 38 | lr 0.000067 | loss 0.025651 | mae 0.123268 -[2024/06/24 06:49:29] ppsci INFO: epoch: 778, train_loss: 0.030258, train_metric: 0.127632, eval_loss: 0.056966, eval_mae: 0.152739 -[2024/06/24 06:49:29] ppsci INFO: train: epoch 779 | step 0 | lr 0.000067 | loss 0.026236 | mae 0.124803 -[2024/06/24 06:49:29] ppsci INFO: train: epoch 779 | step 10 | lr 0.000067 | loss 0.026914 | mae 0.122888 -[2024/06/24 06:49:30] ppsci INFO: train: epoch 779 | step 20 | lr 0.000067 | loss 0.024785 | mae 0.119714 -[2024/06/24 06:49:30] ppsci INFO: train: epoch 779 | step 30 | lr 0.000067 | loss 0.028973 | mae 0.128724 -[2024/06/24 06:49:31] ppsci INFO: train: epoch 779 | step 38 | lr 0.000067 | loss 0.009191 | mae 0.071600 -[2024/06/24 06:49:31] ppsci INFO: epoch: 779, train_loss: 0.028642, train_metric: 0.126366, eval_loss: 0.058431, eval_mae: 0.153092 -[2024/06/24 06:49:31] ppsci INFO: train: epoch 780 | step 0 | lr 0.000066 | loss 0.028853 | mae 0.125678 -[2024/06/24 06:49:31] ppsci INFO: train: epoch 780 | step 10 | lr 0.000066 | loss 0.026404 | mae 0.121232 -[2024/06/24 06:49:32] ppsci INFO: train: epoch 780 | step 20 | lr 0.000066 | loss 0.035316 | mae 0.135820 -[2024/06/24 06:49:32] ppsci INFO: train: epoch 780 | step 30 | lr 0.000066 | loss 0.023972 | mae 0.112483 -[2024/06/24 06:49:33] ppsci INFO: train: epoch 780 | step 38 | lr 0.000066 | loss 0.012537 | mae 0.097059 -[2024/06/24 06:49:33] ppsci INFO: epoch: 780, train_loss: 0.028943, train_metric: 0.126591, eval_loss: 0.060693, eval_mae: 0.155846 -[2024/06/24 06:49:33] ppsci INFO: train: epoch 781 | step 0 | lr 0.000066 | loss 0.030189 | mae 0.118616 -[2024/06/24 06:49:34] ppsci INFO: train: epoch 781 | step 10 | lr 0.000066 | loss 0.028662 | mae 0.128755 -[2024/06/24 06:49:34] ppsci INFO: train: epoch 781 | step 20 | lr 0.000066 | loss 0.031207 | mae 0.134355 -[2024/06/24 06:49:35] ppsci INFO: train: epoch 781 | step 30 | lr 0.000066 | loss 0.040481 | mae 0.133111 -[2024/06/24 06:49:35] ppsci INFO: train: epoch 781 | step 38 | lr 0.000066 | loss 0.024985 | mae 0.120515 -[2024/06/24 06:49:35] ppsci INFO: epoch: 781, train_loss: 0.031177, train_metric: 0.130522, eval_loss: 0.061035, eval_mae: 0.156764 -[2024/06/24 06:49:35] ppsci INFO: train: epoch 782 | step 0 | lr 0.000065 | loss 0.026386 | mae 0.118642 -[2024/06/24 06:49:36] ppsci INFO: train: epoch 782 | step 10 | lr 0.000065 | loss 0.024540 | mae 0.106741 -[2024/06/24 06:49:36] ppsci INFO: train: epoch 782 | step 20 | lr 0.000065 | loss 0.029038 | mae 0.127970 -[2024/06/24 06:49:37] ppsci INFO: train: epoch 782 | step 30 | lr 0.000065 | loss 0.029790 | mae 0.135417 -[2024/06/24 06:49:37] ppsci INFO: train: epoch 782 | step 38 | lr 0.000065 | loss 0.015410 | mae 0.104081 -[2024/06/24 06:49:37] ppsci INFO: epoch: 782, train_loss: 0.029228, train_metric: 0.125431, eval_loss: 0.058805, eval_mae: 0.155374 -[2024/06/24 06:49:37] ppsci INFO: train: epoch 783 | step 0 | lr 0.000065 | loss 0.031564 | mae 0.126003 -[2024/06/24 06:49:38] ppsci INFO: train: epoch 783 | step 10 | lr 0.000065 | loss 0.039779 | mae 0.141090 -[2024/06/24 06:49:38] ppsci INFO: train: epoch 783 | step 20 | lr 0.000065 | loss 0.028206 | mae 0.122902 -[2024/06/24 06:49:39] ppsci INFO: train: epoch 783 | step 30 | lr 0.000065 | loss 0.026444 | mae 0.122753 -[2024/06/24 06:49:39] ppsci INFO: train: epoch 783 | step 38 | lr 0.000065 | loss 0.041665 | mae 0.141952 -[2024/06/24 06:49:39] ppsci INFO: epoch: 783, train_loss: 0.030985, train_metric: 0.128680, eval_loss: 0.057884, eval_mae: 0.153112 -[2024/06/24 06:49:39] ppsci INFO: train: epoch 784 | step 0 | lr 0.000064 | loss 0.031166 | mae 0.115804 -[2024/06/24 06:49:40] ppsci INFO: train: epoch 784 | step 10 | lr 0.000064 | loss 0.022610 | mae 0.116382 -[2024/06/24 06:49:41] ppsci INFO: train: epoch 784 | step 20 | lr 0.000064 | loss 0.025071 | mae 0.118588 -[2024/06/24 06:49:41] ppsci INFO: train: epoch 784 | step 30 | lr 0.000064 | loss 0.036066 | mae 0.133795 -[2024/06/24 06:49:41] ppsci INFO: train: epoch 784 | step 38 | lr 0.000064 | loss 0.015163 | mae 0.099145 -[2024/06/24 06:49:42] ppsci INFO: epoch: 784, train_loss: 0.029165, train_metric: 0.126390, eval_loss: 0.057579, eval_mae: 0.152581 -[2024/06/24 06:49:42] ppsci INFO: train: epoch 785 | step 0 | lr 0.000064 | loss 0.025499 | mae 0.121211 -[2024/06/24 06:49:42] ppsci INFO: train: epoch 785 | step 10 | lr 0.000064 | loss 0.037825 | mae 0.136893 -[2024/06/24 06:49:43] ppsci INFO: train: epoch 785 | step 20 | lr 0.000064 | loss 0.031129 | mae 0.128640 -[2024/06/24 06:49:43] ppsci INFO: train: epoch 785 | step 30 | lr 0.000064 | loss 0.024206 | mae 0.116385 -[2024/06/24 06:49:44] ppsci INFO: train: epoch 785 | step 38 | lr 0.000064 | loss 0.022802 | mae 0.127877 -[2024/06/24 06:49:44] ppsci INFO: epoch: 785, train_loss: 0.030453, train_metric: 0.128361, eval_loss: 0.057719, eval_mae: 0.153845 -[2024/06/24 06:49:44] ppsci INFO: train: epoch 786 | step 0 | lr 0.000063 | loss 0.029437 | mae 0.124667 -[2024/06/24 06:49:44] ppsci INFO: train: epoch 786 | step 10 | lr 0.000063 | loss 0.034208 | mae 0.129211 -[2024/06/24 06:49:45] ppsci INFO: train: epoch 786 | step 20 | lr 0.000063 | loss 0.027598 | mae 0.121966 -[2024/06/24 06:49:45] ppsci INFO: train: epoch 786 | step 30 | lr 0.000063 | loss 0.034642 | mae 0.139559 -[2024/06/24 06:49:46] ppsci INFO: train: epoch 786 | step 38 | lr 0.000063 | loss 0.012632 | mae 0.096497 -[2024/06/24 06:49:46] ppsci INFO: epoch: 786, train_loss: 0.029497, train_metric: 0.126340, eval_loss: 0.059682, eval_mae: 0.153642 -[2024/06/24 06:49:46] ppsci INFO: train: epoch 787 | step 0 | lr 0.000063 | loss 0.019441 | mae 0.106987 -[2024/06/24 06:49:46] ppsci INFO: train: epoch 787 | step 10 | lr 0.000063 | loss 0.021395 | mae 0.116035 -[2024/06/24 06:49:47] ppsci INFO: train: epoch 787 | step 20 | lr 0.000063 | loss 0.023850 | mae 0.111119 -[2024/06/24 06:49:47] ppsci INFO: train: epoch 787 | step 30 | lr 0.000063 | loss 0.030753 | mae 0.140372 -[2024/06/24 06:49:48] ppsci INFO: train: epoch 787 | step 38 | lr 0.000063 | loss 0.043651 | mae 0.145350 -[2024/06/24 06:49:48] ppsci INFO: epoch: 787, train_loss: 0.030582, train_metric: 0.127254, eval_loss: 0.060167, eval_mae: 0.155573 -[2024/06/24 06:49:48] ppsci INFO: train: epoch 788 | step 0 | lr 0.000062 | loss 0.026191 | mae 0.129148 -[2024/06/24 06:49:48] ppsci INFO: train: epoch 788 | step 10 | lr 0.000062 | loss 0.026531 | mae 0.121206 -[2024/06/24 06:49:49] ppsci INFO: train: epoch 788 | step 20 | lr 0.000062 | loss 0.035118 | mae 0.129064 -[2024/06/24 06:49:49] ppsci INFO: train: epoch 788 | step 30 | lr 0.000062 | loss 0.026436 | mae 0.117568 -[2024/06/24 06:49:50] ppsci INFO: train: epoch 788 | step 38 | lr 0.000062 | loss 0.032306 | mae 0.117153 -[2024/06/24 06:49:50] ppsci INFO: epoch: 788, train_loss: 0.031792, train_metric: 0.130504, eval_loss: 0.058045, eval_mae: 0.153645 -[2024/06/24 06:49:50] ppsci INFO: train: epoch 789 | step 0 | lr 0.000062 | loss 0.025120 | mae 0.114938 -[2024/06/24 06:49:51] ppsci INFO: train: epoch 789 | step 10 | lr 0.000062 | loss 0.026885 | mae 0.123436 -[2024/06/24 06:49:51] ppsci INFO: train: epoch 789 | step 20 | lr 0.000062 | loss 0.028175 | mae 0.126167 -[2024/06/24 06:49:52] ppsci INFO: train: epoch 789 | step 30 | lr 0.000062 | loss 0.044302 | mae 0.144427 -[2024/06/24 06:49:52] ppsci INFO: train: epoch 789 | step 38 | lr 0.000062 | loss 0.030688 | mae 0.138410 -[2024/06/24 06:49:52] ppsci INFO: epoch: 789, train_loss: 0.030253, train_metric: 0.128850, eval_loss: 0.059598, eval_mae: 0.154811 -[2024/06/24 06:49:52] ppsci INFO: train: epoch 790 | step 0 | lr 0.000061 | loss 0.033631 | mae 0.133444 -[2024/06/24 06:49:53] ppsci INFO: train: epoch 790 | step 10 | lr 0.000061 | loss 0.030545 | mae 0.126473 -[2024/06/24 06:49:53] ppsci INFO: train: epoch 790 | step 20 | lr 0.000061 | loss 0.025925 | mae 0.125698 -[2024/06/24 06:49:54] ppsci INFO: train: epoch 790 | step 30 | lr 0.000061 | loss 0.038602 | mae 0.145225 -[2024/06/24 06:49:54] ppsci INFO: train: epoch 790 | step 38 | lr 0.000061 | loss 0.064974 | mae 0.168104 -[2024/06/24 06:49:54] ppsci INFO: epoch: 790, train_loss: 0.031170, train_metric: 0.126400, eval_loss: 0.058104, eval_mae: 0.152951 -[2024/06/24 06:49:54] ppsci INFO: train: epoch 791 | step 0 | lr 0.000061 | loss 0.023460 | mae 0.121055 -[2024/06/24 06:49:55] ppsci INFO: train: epoch 791 | step 10 | lr 0.000061 | loss 0.026783 | mae 0.121307 -[2024/06/24 06:49:55] ppsci INFO: train: epoch 791 | step 20 | lr 0.000061 | loss 0.039205 | mae 0.146110 -[2024/06/24 06:49:56] ppsci INFO: train: epoch 791 | step 30 | lr 0.000061 | loss 0.032976 | mae 0.135127 -[2024/06/24 06:49:56] ppsci INFO: train: epoch 791 | step 38 | lr 0.000061 | loss 0.036807 | mae 0.114732 -[2024/06/24 06:49:56] ppsci INFO: epoch: 791, train_loss: 0.031481, train_metric: 0.130901, eval_loss: 0.057483, eval_mae: 0.153703 -[2024/06/24 06:49:56] ppsci INFO: train: epoch 792 | step 0 | lr 0.000060 | loss 0.030097 | mae 0.136614 -[2024/06/24 06:49:57] ppsci INFO: train: epoch 792 | step 10 | lr 0.000060 | loss 0.027480 | mae 0.120736 -[2024/06/24 06:49:58] ppsci INFO: train: epoch 792 | step 20 | lr 0.000060 | loss 0.023862 | mae 0.115731 -[2024/06/24 06:49:58] ppsci INFO: train: epoch 792 | step 30 | lr 0.000060 | loss 0.022495 | mae 0.111092 -[2024/06/24 06:49:58] ppsci INFO: train: epoch 792 | step 38 | lr 0.000060 | loss 0.047876 | mae 0.168304 -[2024/06/24 06:49:59] ppsci INFO: epoch: 792, train_loss: 0.031595, train_metric: 0.129577, eval_loss: 0.058022, eval_mae: 0.154432 -[2024/06/24 06:49:59] ppsci INFO: train: epoch 793 | step 0 | lr 0.000060 | loss 0.046430 | mae 0.141701 -[2024/06/24 06:49:59] ppsci INFO: train: epoch 793 | step 10 | lr 0.000060 | loss 0.022898 | mae 0.115086 -[2024/06/24 06:50:00] ppsci INFO: train: epoch 793 | step 20 | lr 0.000060 | loss 0.034138 | mae 0.146193 -[2024/06/24 06:50:00] ppsci INFO: train: epoch 793 | step 30 | lr 0.000060 | loss 0.032901 | mae 0.135414 -[2024/06/24 06:50:00] ppsci INFO: train: epoch 793 | step 38 | lr 0.000060 | loss 0.023490 | mae 0.114657 -[2024/06/24 06:50:01] ppsci INFO: epoch: 793, train_loss: 0.031496, train_metric: 0.130018, eval_loss: 0.058850, eval_mae: 0.154978 -[2024/06/24 06:50:01] ppsci INFO: train: epoch 794 | step 0 | lr 0.000060 | loss 0.026259 | mae 0.113307 -[2024/06/24 06:50:01] ppsci INFO: train: epoch 794 | step 10 | lr 0.000060 | loss 0.034261 | mae 0.133183 -[2024/06/24 06:50:02] ppsci INFO: train: epoch 794 | step 20 | lr 0.000060 | loss 0.032631 | mae 0.131238 -[2024/06/24 06:50:02] ppsci INFO: train: epoch 794 | step 30 | lr 0.000060 | loss 0.037821 | mae 0.144681 -[2024/06/24 06:50:03] ppsci INFO: train: epoch 794 | step 38 | lr 0.000060 | loss 0.040091 | mae 0.162112 -[2024/06/24 06:50:03] ppsci INFO: epoch: 794, train_loss: 0.030292, train_metric: 0.125490, eval_loss: 0.058926, eval_mae: 0.155080 -[2024/06/24 06:50:03] ppsci INFO: train: epoch 795 | step 0 | lr 0.000059 | loss 0.030807 | mae 0.124733 -[2024/06/24 06:50:03] ppsci INFO: train: epoch 795 | step 10 | lr 0.000059 | loss 0.039813 | mae 0.152429 -[2024/06/24 06:50:04] ppsci INFO: train: epoch 795 | step 20 | lr 0.000059 | loss 0.032467 | mae 0.126266 -[2024/06/24 06:50:04] ppsci INFO: train: epoch 795 | step 30 | lr 0.000059 | loss 0.026888 | mae 0.118587 -[2024/06/24 06:50:05] ppsci INFO: train: epoch 795 | step 38 | lr 0.000059 | loss 0.019990 | mae 0.121583 -[2024/06/24 06:50:05] ppsci INFO: epoch: 795, train_loss: 0.031713, train_metric: 0.131269, eval_loss: 0.057675, eval_mae: 0.153398 -[2024/06/24 06:50:05] ppsci INFO: train: epoch 796 | step 0 | lr 0.000059 | loss 0.041570 | mae 0.141015 -[2024/06/24 06:50:05] ppsci INFO: train: epoch 796 | step 10 | lr 0.000059 | loss 0.023362 | mae 0.111063 -[2024/06/24 06:50:06] ppsci INFO: train: epoch 796 | step 20 | lr 0.000059 | loss 0.025608 | mae 0.123148 -[2024/06/24 06:50:06] ppsci INFO: train: epoch 796 | step 30 | lr 0.000059 | loss 0.041870 | mae 0.134098 -[2024/06/24 06:50:07] ppsci INFO: train: epoch 796 | step 38 | lr 0.000059 | loss 0.020247 | mae 0.121143 -[2024/06/24 06:50:07] ppsci INFO: epoch: 796, train_loss: 0.031307, train_metric: 0.127900, eval_loss: 0.056800, eval_mae: 0.152899 -[2024/06/24 06:50:07] ppsci INFO: train: epoch 797 | step 0 | lr 0.000058 | loss 0.035447 | mae 0.134661 -[2024/06/24 06:50:08] ppsci INFO: train: epoch 797 | step 10 | lr 0.000058 | loss 0.030695 | mae 0.130865 -[2024/06/24 06:50:08] ppsci INFO: train: epoch 797 | step 20 | lr 0.000058 | loss 0.029991 | mae 0.135442 -[2024/06/24 06:50:09] ppsci INFO: train: epoch 797 | step 30 | lr 0.000058 | loss 0.047969 | mae 0.155208 -[2024/06/24 06:50:09] ppsci INFO: train: epoch 797 | step 38 | lr 0.000058 | loss 0.041971 | mae 0.149154 -[2024/06/24 06:50:09] ppsci INFO: epoch: 797, train_loss: 0.031264, train_metric: 0.129436, eval_loss: 0.057083, eval_mae: 0.151975 -[2024/06/24 06:50:09] ppsci INFO: train: epoch 798 | step 0 | lr 0.000058 | loss 0.038015 | mae 0.140953 -[2024/06/24 06:50:10] ppsci INFO: train: epoch 798 | step 10 | lr 0.000058 | loss 0.023704 | mae 0.121642 -[2024/06/24 06:50:10] ppsci INFO: train: epoch 798 | step 20 | lr 0.000058 | loss 0.029131 | mae 0.130100 -[2024/06/24 06:50:11] ppsci INFO: train: epoch 798 | step 30 | lr 0.000058 | loss 0.033509 | mae 0.130183 -[2024/06/24 06:50:11] ppsci INFO: train: epoch 798 | step 38 | lr 0.000058 | loss 0.021422 | mae 0.108293 -[2024/06/24 06:50:11] ppsci INFO: epoch: 798, train_loss: 0.029278, train_metric: 0.126703, eval_loss: 0.059492, eval_mae: 0.155212 -[2024/06/24 06:50:11] ppsci INFO: train: epoch 799 | step 0 | lr 0.000057 | loss 0.027608 | mae 0.117651 -[2024/06/24 06:50:12] ppsci INFO: train: epoch 799 | step 10 | lr 0.000057 | loss 0.033511 | mae 0.134808 -[2024/06/24 06:50:12] ppsci INFO: train: epoch 799 | step 20 | lr 0.000057 | loss 0.032766 | mae 0.136827 -[2024/06/24 06:50:13] ppsci INFO: train: epoch 799 | step 30 | lr 0.000057 | loss 0.032967 | mae 0.141925 -[2024/06/24 06:50:13] ppsci INFO: train: epoch 799 | step 38 | lr 0.000057 | loss 0.055412 | mae 0.188450 -[2024/06/24 06:50:13] ppsci INFO: epoch: 799, train_loss: 0.030865, train_metric: 0.127562, eval_loss: 0.058639, eval_mae: 0.154423 -[2024/06/24 06:50:14] ppsci INFO: train: epoch 800 | step 0 | lr 0.000057 | loss 0.030614 | mae 0.130632 -[2024/06/24 06:50:14] ppsci INFO: train: epoch 800 | step 10 | lr 0.000057 | loss 0.027909 | mae 0.131106 -[2024/06/24 06:50:15] ppsci INFO: train: epoch 800 | step 20 | lr 0.000057 | loss 0.026121 | mae 0.120249 -[2024/06/24 06:50:15] ppsci INFO: train: epoch 800 | step 30 | lr 0.000057 | loss 0.028966 | mae 0.123803 -[2024/06/24 06:50:16] ppsci INFO: train: epoch 800 | step 38 | lr 0.000057 | loss 0.027559 | mae 0.143437 -[2024/06/24 06:50:16] ppsci INFO: epoch: 800, train_loss: 0.028961, train_metric: 0.124926, eval_loss: 0.057188, eval_mae: 0.151933 -[2024/06/24 06:50:16] ppsci INFO: train: epoch 801 | step 0 | lr 0.000056 | loss 0.017282 | mae 0.102553 -[2024/06/24 06:50:16] ppsci INFO: train: epoch 801 | step 10 | lr 0.000056 | loss 0.018770 | mae 0.104211 -[2024/06/24 06:50:17] ppsci INFO: train: epoch 801 | step 20 | lr 0.000056 | loss 0.029817 | mae 0.130788 -[2024/06/24 06:50:17] ppsci INFO: train: epoch 801 | step 30 | lr 0.000056 | loss 0.023287 | mae 0.115789 -[2024/06/24 06:50:18] ppsci INFO: train: epoch 801 | step 38 | lr 0.000056 | loss 0.026815 | mae 0.140688 -[2024/06/24 06:50:18] ppsci INFO: epoch: 801, train_loss: 0.028398, train_metric: 0.124700, eval_loss: 0.057856, eval_mae: 0.153180 -[2024/06/24 06:50:18] ppsci INFO: train: epoch 802 | step 0 | lr 0.000056 | loss 0.033334 | mae 0.134012 -[2024/06/24 06:50:18] ppsci INFO: train: epoch 802 | step 10 | lr 0.000056 | loss 0.029582 | mae 0.132372 -[2024/06/24 06:50:19] ppsci INFO: train: epoch 802 | step 20 | lr 0.000056 | loss 0.026539 | mae 0.130366 -[2024/06/24 06:50:19] ppsci INFO: train: epoch 802 | step 30 | lr 0.000056 | loss 0.027390 | mae 0.132395 -[2024/06/24 06:50:20] ppsci INFO: train: epoch 802 | step 38 | lr 0.000056 | loss 0.040388 | mae 0.161360 -[2024/06/24 06:50:20] ppsci INFO: epoch: 802, train_loss: 0.030074, train_metric: 0.127303, eval_loss: 0.058441, eval_mae: 0.155098 -[2024/06/24 06:50:20] ppsci INFO: train: epoch 803 | step 0 | lr 0.000055 | loss 0.032104 | mae 0.132740 -[2024/06/24 06:50:20] ppsci INFO: train: epoch 803 | step 10 | lr 0.000055 | loss 0.030512 | mae 0.125883 -[2024/06/24 06:50:21] ppsci INFO: train: epoch 803 | step 20 | lr 0.000055 | loss 0.027605 | mae 0.124822 -[2024/06/24 06:50:22] ppsci INFO: train: epoch 803 | step 30 | lr 0.000055 | loss 0.030680 | mae 0.131502 -[2024/06/24 06:50:22] ppsci INFO: train: epoch 803 | step 38 | lr 0.000055 | loss 0.038471 | mae 0.156458 -[2024/06/24 06:50:22] ppsci INFO: epoch: 803, train_loss: 0.030272, train_metric: 0.127339, eval_loss: 0.059574, eval_mae: 0.155958 -[2024/06/24 06:50:22] ppsci INFO: train: epoch 804 | step 0 | lr 0.000055 | loss 0.022686 | mae 0.117689 -[2024/06/24 06:50:23] ppsci INFO: train: epoch 804 | step 10 | lr 0.000055 | loss 0.028350 | mae 0.130319 -[2024/06/24 06:50:23] ppsci INFO: train: epoch 804 | step 20 | lr 0.000055 | loss 0.041440 | mae 0.145036 -[2024/06/24 06:50:24] ppsci INFO: train: epoch 804 | step 30 | lr 0.000055 | loss 0.020705 | mae 0.109202 -[2024/06/24 06:50:24] ppsci INFO: train: epoch 804 | step 38 | lr 0.000055 | loss 0.031823 | mae 0.136455 -[2024/06/24 06:50:24] ppsci INFO: epoch: 804, train_loss: 0.030055, train_metric: 0.129159, eval_loss: 0.058249, eval_mae: 0.153317 -[2024/06/24 06:50:24] ppsci INFO: train: epoch 805 | step 0 | lr 0.000055 | loss 0.037502 | mae 0.137456 -[2024/06/24 06:50:25] ppsci INFO: train: epoch 805 | step 10 | lr 0.000055 | loss 0.036122 | mae 0.137018 -[2024/06/24 06:50:25] ppsci INFO: train: epoch 805 | step 20 | lr 0.000055 | loss 0.033650 | mae 0.132840 -[2024/06/24 06:50:26] ppsci INFO: train: epoch 805 | step 30 | lr 0.000055 | loss 0.033249 | mae 0.127953 -[2024/06/24 06:50:26] ppsci INFO: train: epoch 805 | step 38 | lr 0.000055 | loss 0.051839 | mae 0.166090 -[2024/06/24 06:50:26] ppsci INFO: epoch: 805, train_loss: 0.030608, train_metric: 0.128103, eval_loss: 0.058841, eval_mae: 0.155175 -[2024/06/24 06:50:26] ppsci INFO: train: epoch 806 | step 0 | lr 0.000054 | loss 0.029822 | mae 0.122307 -[2024/06/24 06:50:27] ppsci INFO: train: epoch 806 | step 10 | lr 0.000054 | loss 0.016655 | mae 0.101720 -[2024/06/24 06:50:27] ppsci INFO: train: epoch 806 | step 20 | lr 0.000054 | loss 0.018839 | mae 0.105667 -[2024/06/24 06:50:28] ppsci INFO: train: epoch 806 | step 30 | lr 0.000054 | loss 0.026787 | mae 0.121930 -[2024/06/24 06:50:28] ppsci INFO: train: epoch 806 | step 38 | lr 0.000054 | loss 0.031654 | mae 0.145259 -[2024/06/24 06:50:28] ppsci INFO: epoch: 806, train_loss: 0.030696, train_metric: 0.127972, eval_loss: 0.059641, eval_mae: 0.155110 -[2024/06/24 06:50:29] ppsci INFO: train: epoch 807 | step 0 | lr 0.000054 | loss 0.033358 | mae 0.138474 -[2024/06/24 06:50:29] ppsci INFO: train: epoch 807 | step 10 | lr 0.000054 | loss 0.037289 | mae 0.135164 -[2024/06/24 06:50:30] ppsci INFO: train: epoch 807 | step 20 | lr 0.000054 | loss 0.034013 | mae 0.123566 -[2024/06/24 06:50:30] ppsci INFO: train: epoch 807 | step 30 | lr 0.000054 | loss 0.029271 | mae 0.128504 -[2024/06/24 06:50:31] ppsci INFO: train: epoch 807 | step 38 | lr 0.000054 | loss 0.032855 | mae 0.140695 -[2024/06/24 06:50:31] ppsci INFO: epoch: 807, train_loss: 0.031765, train_metric: 0.129940, eval_loss: 0.059339, eval_mae: 0.155615 -[2024/06/24 06:50:31] ppsci INFO: train: epoch 808 | step 0 | lr 0.000053 | loss 0.036831 | mae 0.126927 -[2024/06/24 06:50:31] ppsci INFO: train: epoch 808 | step 10 | lr 0.000053 | loss 0.028690 | mae 0.127584 -[2024/06/24 06:50:32] ppsci INFO: train: epoch 808 | step 20 | lr 0.000053 | loss 0.029566 | mae 0.130758 -[2024/06/24 06:50:32] ppsci INFO: train: epoch 808 | step 30 | lr 0.000053 | loss 0.021575 | mae 0.111703 -[2024/06/24 06:50:33] ppsci INFO: train: epoch 808 | step 38 | lr 0.000053 | loss 0.025872 | mae 0.123593 -[2024/06/24 06:50:33] ppsci INFO: epoch: 808, train_loss: 0.029468, train_metric: 0.123597, eval_loss: 0.057828, eval_mae: 0.153372 -[2024/06/24 06:50:33] ppsci INFO: train: epoch 809 | step 0 | lr 0.000053 | loss 0.031696 | mae 0.135407 -[2024/06/24 06:50:33] ppsci INFO: train: epoch 809 | step 10 | lr 0.000053 | loss 0.028873 | mae 0.129368 -[2024/06/24 06:50:34] ppsci INFO: train: epoch 809 | step 20 | lr 0.000053 | loss 0.039389 | mae 0.138773 -[2024/06/24 06:50:34] ppsci INFO: train: epoch 809 | step 30 | lr 0.000053 | loss 0.035037 | mae 0.133234 -[2024/06/24 06:50:35] ppsci INFO: train: epoch 809 | step 38 | lr 0.000053 | loss 0.054685 | mae 0.181205 -[2024/06/24 06:50:35] ppsci INFO: epoch: 809, train_loss: 0.030628, train_metric: 0.127938, eval_loss: 0.057600, eval_mae: 0.154035 -[2024/06/24 06:50:35] ppsci INFO: train: epoch 810 | step 0 | lr 0.000052 | loss 0.025737 | mae 0.117754 -[2024/06/24 06:50:36] ppsci INFO: train: epoch 810 | step 10 | lr 0.000052 | loss 0.019957 | mae 0.106842 -[2024/06/24 06:50:36] ppsci INFO: train: epoch 810 | step 20 | lr 0.000052 | loss 0.028020 | mae 0.125910 -[2024/06/24 06:50:37] ppsci INFO: train: epoch 810 | step 30 | lr 0.000052 | loss 0.034891 | mae 0.136102 -[2024/06/24 06:50:37] ppsci INFO: train: epoch 810 | step 38 | lr 0.000052 | loss 0.010855 | mae 0.087531 -[2024/06/24 06:50:37] ppsci INFO: epoch: 810, train_loss: 0.030429, train_metric: 0.127522, eval_loss: 0.056470, eval_mae: 0.152335 -[2024/06/24 06:50:37] ppsci INFO: train: epoch 811 | step 0 | lr 0.000052 | loss 0.037929 | mae 0.143604 -[2024/06/24 06:50:38] ppsci INFO: train: epoch 811 | step 10 | lr 0.000052 | loss 0.035046 | mae 0.142245 -[2024/06/24 06:50:38] ppsci INFO: train: epoch 811 | step 20 | lr 0.000052 | loss 0.036068 | mae 0.136864 -[2024/06/24 06:50:39] ppsci INFO: train: epoch 811 | step 30 | lr 0.000052 | loss 0.026298 | mae 0.115006 -[2024/06/24 06:50:39] ppsci INFO: train: epoch 811 | step 38 | lr 0.000052 | loss 0.020537 | mae 0.112466 -[2024/06/24 06:50:39] ppsci INFO: epoch: 811, train_loss: 0.029985, train_metric: 0.127164, eval_loss: 0.056187, eval_mae: 0.151614 -[2024/06/24 06:50:39] ppsci INFO: train: epoch 812 | step 0 | lr 0.000052 | loss 0.046823 | mae 0.161652 -[2024/06/24 06:50:40] ppsci INFO: train: epoch 812 | step 10 | lr 0.000052 | loss 0.030690 | mae 0.128940 -[2024/06/24 06:50:40] ppsci INFO: train: epoch 812 | step 20 | lr 0.000052 | loss 0.034875 | mae 0.140425 -[2024/06/24 06:50:41] ppsci INFO: train: epoch 812 | step 30 | lr 0.000052 | loss 0.037954 | mae 0.144962 -[2024/06/24 06:50:41] ppsci INFO: train: epoch 812 | step 38 | lr 0.000052 | loss 0.031027 | mae 0.158263 -[2024/06/24 06:50:41] ppsci INFO: epoch: 812, train_loss: 0.030932, train_metric: 0.127606, eval_loss: 0.058630, eval_mae: 0.153402 -[2024/06/24 06:50:41] ppsci INFO: train: epoch 813 | step 0 | lr 0.000051 | loss 0.036302 | mae 0.147641 -[2024/06/24 06:50:42] ppsci INFO: train: epoch 813 | step 10 | lr 0.000051 | loss 0.032999 | mae 0.139867 -[2024/06/24 06:50:42] ppsci INFO: train: epoch 813 | step 20 | lr 0.000051 | loss 0.037880 | mae 0.137501 -[2024/06/24 06:50:43] ppsci INFO: train: epoch 813 | step 30 | lr 0.000051 | loss 0.032387 | mae 0.124108 -[2024/06/24 06:50:43] ppsci INFO: train: epoch 813 | step 38 | lr 0.000051 | loss 0.030950 | mae 0.147533 -[2024/06/24 06:50:43] ppsci INFO: epoch: 813, train_loss: 0.032019, train_metric: 0.131101, eval_loss: 0.057371, eval_mae: 0.152938 -[2024/06/24 06:50:44] ppsci INFO: train: epoch 814 | step 0 | lr 0.000051 | loss 0.025666 | mae 0.122890 -[2024/06/24 06:50:44] ppsci INFO: train: epoch 814 | step 10 | lr 0.000051 | loss 0.027287 | mae 0.124050 -[2024/06/24 06:50:44] ppsci INFO: train: epoch 814 | step 20 | lr 0.000051 | loss 0.022547 | mae 0.111285 -[2024/06/24 06:50:45] ppsci INFO: train: epoch 814 | step 30 | lr 0.000051 | loss 0.041172 | mae 0.151263 -[2024/06/24 06:50:45] ppsci INFO: train: epoch 814 | step 38 | lr 0.000051 | loss 0.022801 | mae 0.124792 -[2024/06/24 06:50:45] ppsci INFO: epoch: 814, train_loss: 0.030099, train_metric: 0.128474, eval_loss: 0.056137, eval_mae: 0.152595 -[2024/06/24 06:50:46] ppsci INFO: train: epoch 815 | step 0 | lr 0.000050 | loss 0.031048 | mae 0.132277 -[2024/06/24 06:50:46] ppsci INFO: train: epoch 815 | step 10 | lr 0.000050 | loss 0.034027 | mae 0.134294 -[2024/06/24 06:50:47] ppsci INFO: train: epoch 815 | step 20 | lr 0.000050 | loss 0.039633 | mae 0.140189 -[2024/06/24 06:50:47] ppsci INFO: train: epoch 815 | step 30 | lr 0.000050 | loss 0.028878 | mae 0.127632 -[2024/06/24 06:50:47] ppsci INFO: train: epoch 815 | step 38 | lr 0.000050 | loss 0.068228 | mae 0.191226 -[2024/06/24 06:50:47] ppsci INFO: epoch: 815, train_loss: 0.031957, train_metric: 0.130032, eval_loss: 0.056701, eval_mae: 0.152259 -[2024/06/24 06:50:48] ppsci INFO: train: epoch 816 | step 0 | lr 0.000050 | loss 0.022154 | mae 0.108986 -[2024/06/24 06:50:48] ppsci INFO: train: epoch 816 | step 10 | lr 0.000050 | loss 0.024138 | mae 0.117167 -[2024/06/24 06:50:49] ppsci INFO: train: epoch 816 | step 20 | lr 0.000050 | loss 0.034746 | mae 0.138129 -[2024/06/24 06:50:49] ppsci INFO: train: epoch 816 | step 30 | lr 0.000050 | loss 0.026757 | mae 0.120357 -[2024/06/24 06:50:50] ppsci INFO: train: epoch 816 | step 38 | lr 0.000050 | loss 0.026383 | mae 0.126567 -[2024/06/24 06:50:50] ppsci INFO: epoch: 816, train_loss: 0.029324, train_metric: 0.125652, eval_loss: 0.058181, eval_mae: 0.152544 -[2024/06/24 06:50:50] ppsci INFO: train: epoch 817 | step 0 | lr 0.000049 | loss 0.029817 | mae 0.132550 -[2024/06/24 06:50:50] ppsci INFO: train: epoch 817 | step 10 | lr 0.000049 | loss 0.027997 | mae 0.124806 -[2024/06/24 06:50:51] ppsci INFO: train: epoch 817 | step 20 | lr 0.000049 | loss 0.027625 | mae 0.123824 -[2024/06/24 06:50:51] ppsci INFO: train: epoch 817 | step 30 | lr 0.000049 | loss 0.031377 | mae 0.131623 -[2024/06/24 06:50:52] ppsci INFO: train: epoch 817 | step 38 | lr 0.000049 | loss 0.013297 | mae 0.102631 -[2024/06/24 06:50:52] ppsci INFO: epoch: 817, train_loss: 0.029987, train_metric: 0.126748, eval_loss: 0.058822, eval_mae: 0.152362 -[2024/06/24 06:50:52] ppsci INFO: train: epoch 818 | step 0 | lr 0.000049 | loss 0.021279 | mae 0.108860 -[2024/06/24 06:50:52] ppsci INFO: train: epoch 818 | step 10 | lr 0.000049 | loss 0.021840 | mae 0.112513 -[2024/06/24 06:50:53] ppsci INFO: train: epoch 818 | step 20 | lr 0.000049 | loss 0.030734 | mae 0.133052 -[2024/06/24 06:50:53] ppsci INFO: train: epoch 818 | step 30 | lr 0.000049 | loss 0.029842 | mae 0.124272 -[2024/06/24 06:50:54] ppsci INFO: train: epoch 818 | step 38 | lr 0.000049 | loss 0.018705 | mae 0.121882 -[2024/06/24 06:50:54] ppsci INFO: epoch: 818, train_loss: 0.030285, train_metric: 0.128725, eval_loss: 0.058796, eval_mae: 0.153059 -[2024/06/24 06:50:54] ppsci INFO: train: epoch 819 | step 0 | lr 0.000049 | loss 0.022149 | mae 0.110926 -[2024/06/24 06:50:55] ppsci INFO: train: epoch 819 | step 10 | lr 0.000049 | loss 0.026062 | mae 0.125818 -[2024/06/24 06:50:55] ppsci INFO: train: epoch 819 | step 20 | lr 0.000049 | loss 0.028118 | mae 0.120747 -[2024/06/24 06:50:56] ppsci INFO: train: epoch 819 | step 30 | lr 0.000049 | loss 0.023101 | mae 0.111389 -[2024/06/24 06:50:56] ppsci INFO: train: epoch 819 | step 38 | lr 0.000049 | loss 0.032609 | mae 0.145201 -[2024/06/24 06:50:56] ppsci INFO: epoch: 819, train_loss: 0.028547, train_metric: 0.124347, eval_loss: 0.057668, eval_mae: 0.151741 -[2024/06/24 06:50:56] ppsci INFO: train: epoch 820 | step 0 | lr 0.000048 | loss 0.026057 | mae 0.124757 -[2024/06/24 06:50:57] ppsci INFO: train: epoch 820 | step 10 | lr 0.000048 | loss 0.022810 | mae 0.116076 -[2024/06/24 06:50:57] ppsci INFO: train: epoch 820 | step 20 | lr 0.000048 | loss 0.031175 | mae 0.128081 -[2024/06/24 06:50:58] ppsci INFO: train: epoch 820 | step 30 | lr 0.000048 | loss 0.038588 | mae 0.132748 -[2024/06/24 06:50:58] ppsci INFO: train: epoch 820 | step 38 | lr 0.000048 | loss 0.041075 | mae 0.139485 -[2024/06/24 06:50:58] ppsci INFO: epoch: 820, train_loss: 0.030063, train_metric: 0.126338, eval_loss: 0.057155, eval_mae: 0.151716 -[2024/06/24 06:50:58] ppsci INFO: train: epoch 821 | step 0 | lr 0.000048 | loss 0.034806 | mae 0.131689 -[2024/06/24 06:50:59] ppsci INFO: train: epoch 821 | step 10 | lr 0.000048 | loss 0.029433 | mae 0.129541 -[2024/06/24 06:50:59] ppsci INFO: train: epoch 821 | step 20 | lr 0.000048 | loss 0.022629 | mae 0.110355 -[2024/06/24 06:51:00] ppsci INFO: train: epoch 821 | step 30 | lr 0.000048 | loss 0.021723 | mae 0.117601 -[2024/06/24 06:51:00] ppsci INFO: train: epoch 821 | step 38 | lr 0.000048 | loss 0.052929 | mae 0.172910 -[2024/06/24 06:51:00] ppsci INFO: epoch: 821, train_loss: 0.031151, train_metric: 0.128021, eval_loss: 0.057026, eval_mae: 0.151586 -[2024/06/24 06:51:01] ppsci INFO: train: epoch 822 | step 0 | lr 0.000047 | loss 0.032270 | mae 0.141380 -[2024/06/24 06:51:01] ppsci INFO: train: epoch 822 | step 10 | lr 0.000047 | loss 0.027093 | mae 0.122772 -[2024/06/24 06:51:01] ppsci INFO: train: epoch 822 | step 20 | lr 0.000047 | loss 0.030309 | mae 0.130960 -[2024/06/24 06:51:02] ppsci INFO: train: epoch 822 | step 30 | lr 0.000047 | loss 0.026664 | mae 0.124888 -[2024/06/24 06:51:02] ppsci INFO: train: epoch 822 | step 38 | lr 0.000047 | loss 0.057167 | mae 0.151036 -[2024/06/24 06:51:03] ppsci INFO: epoch: 822, train_loss: 0.029929, train_metric: 0.127234, eval_loss: 0.057868, eval_mae: 0.155008 -[2024/06/24 06:51:03] ppsci INFO: train: epoch 823 | step 0 | lr 0.000047 | loss 0.031033 | mae 0.138711 -[2024/06/24 06:51:03] ppsci INFO: train: epoch 823 | step 10 | lr 0.000047 | loss 0.029292 | mae 0.128275 -[2024/06/24 06:51:04] ppsci INFO: train: epoch 823 | step 20 | lr 0.000047 | loss 0.031167 | mae 0.126635 -[2024/06/24 06:51:04] ppsci INFO: train: epoch 823 | step 30 | lr 0.000047 | loss 0.034732 | mae 0.129709 -[2024/06/24 06:51:05] ppsci INFO: train: epoch 823 | step 38 | lr 0.000047 | loss 0.020792 | mae 0.115070 -[2024/06/24 06:51:05] ppsci INFO: epoch: 823, train_loss: 0.030353, train_metric: 0.129181, eval_loss: 0.055685, eval_mae: 0.152166 -[2024/06/24 06:51:05] ppsci INFO: train: epoch 824 | step 0 | lr 0.000047 | loss 0.023228 | mae 0.113512 -[2024/06/24 06:51:05] ppsci INFO: train: epoch 824 | step 10 | lr 0.000047 | loss 0.026677 | mae 0.115606 -[2024/06/24 06:51:06] ppsci INFO: train: epoch 824 | step 20 | lr 0.000047 | loss 0.038059 | mae 0.146035 -[2024/06/24 06:51:07] ppsci INFO: train: epoch 824 | step 30 | lr 0.000047 | loss 0.029743 | mae 0.127107 -[2024/06/24 06:51:07] ppsci INFO: train: epoch 824 | step 38 | lr 0.000047 | loss 0.054002 | mae 0.194576 -[2024/06/24 06:51:07] ppsci INFO: epoch: 824, train_loss: 0.030643, train_metric: 0.128227, eval_loss: 0.055643, eval_mae: 0.151110 -[2024/06/24 06:51:07] ppsci INFO: train: epoch 825 | step 0 | lr 0.000046 | loss 0.031236 | mae 0.131028 -[2024/06/24 06:51:08] ppsci INFO: train: epoch 825 | step 10 | lr 0.000046 | loss 0.024791 | mae 0.123838 -[2024/06/24 06:51:08] ppsci INFO: train: epoch 825 | step 20 | lr 0.000046 | loss 0.022042 | mae 0.110178 -[2024/06/24 06:51:09] ppsci INFO: train: epoch 825 | step 30 | lr 0.000046 | loss 0.029703 | mae 0.126914 -[2024/06/24 06:51:09] ppsci INFO: train: epoch 825 | step 38 | lr 0.000046 | loss 0.025668 | mae 0.123827 -[2024/06/24 06:51:09] ppsci INFO: epoch: 825, train_loss: 0.029724, train_metric: 0.126339, eval_loss: 0.057406, eval_mae: 0.153276 -[2024/06/24 06:51:09] ppsci INFO: train: epoch 826 | step 0 | lr 0.000046 | loss 0.024827 | mae 0.115284 -[2024/06/24 06:51:10] ppsci INFO: train: epoch 826 | step 10 | lr 0.000046 | loss 0.022439 | mae 0.108058 -[2024/06/24 06:51:10] ppsci INFO: train: epoch 826 | step 20 | lr 0.000046 | loss 0.024653 | mae 0.120478 -[2024/06/24 06:51:11] ppsci INFO: train: epoch 826 | step 30 | lr 0.000046 | loss 0.026225 | mae 0.121378 -[2024/06/24 06:51:11] ppsci INFO: train: epoch 826 | step 38 | lr 0.000046 | loss 0.036817 | mae 0.127648 -[2024/06/24 06:51:11] ppsci INFO: epoch: 826, train_loss: 0.029917, train_metric: 0.126909, eval_loss: 0.055532, eval_mae: 0.151298 -[2024/06/24 06:51:11] ppsci INFO: train: epoch 827 | step 0 | lr 0.000045 | loss 0.024172 | mae 0.117103 -[2024/06/24 06:51:12] ppsci INFO: train: epoch 827 | step 10 | lr 0.000045 | loss 0.026468 | mae 0.124300 -[2024/06/24 06:51:12] ppsci INFO: train: epoch 827 | step 20 | lr 0.000045 | loss 0.038365 | mae 0.146636 -[2024/06/24 06:51:13] ppsci INFO: train: epoch 827 | step 30 | lr 0.000045 | loss 0.028066 | mae 0.127612 -[2024/06/24 06:51:13] ppsci INFO: train: epoch 827 | step 38 | lr 0.000045 | loss 0.027726 | mae 0.125006 -[2024/06/24 06:51:13] ppsci INFO: epoch: 827, train_loss: 0.030517, train_metric: 0.128516, eval_loss: 0.056116, eval_mae: 0.153614 -[2024/06/24 06:51:14] ppsci INFO: train: epoch 828 | step 0 | lr 0.000045 | loss 0.025941 | mae 0.120618 -[2024/06/24 06:51:14] ppsci INFO: train: epoch 828 | step 10 | lr 0.000045 | loss 0.029457 | mae 0.130931 -[2024/06/24 06:51:15] ppsci INFO: train: epoch 828 | step 20 | lr 0.000045 | loss 0.022803 | mae 0.112781 -[2024/06/24 06:51:15] ppsci INFO: train: epoch 828 | step 30 | lr 0.000045 | loss 0.022440 | mae 0.106015 -[2024/06/24 06:51:16] ppsci INFO: train: epoch 828 | step 38 | lr 0.000045 | loss 0.006360 | mae 0.052793 -[2024/06/24 06:51:16] ppsci INFO: epoch: 828, train_loss: 0.030658, train_metric: 0.127532, eval_loss: 0.057057, eval_mae: 0.152101 -[2024/06/24 06:51:16] ppsci INFO: train: epoch 829 | step 0 | lr 0.000045 | loss 0.034918 | mae 0.133914 -[2024/06/24 06:51:17] ppsci INFO: train: epoch 829 | step 10 | lr 0.000045 | loss 0.022910 | mae 0.112374 -[2024/06/24 06:51:17] ppsci INFO: train: epoch 829 | step 20 | lr 0.000045 | loss 0.034101 | mae 0.136119 -[2024/06/24 06:51:18] ppsci INFO: train: epoch 829 | step 30 | lr 0.000045 | loss 0.030297 | mae 0.134227 -[2024/06/24 06:51:18] ppsci INFO: train: epoch 829 | step 38 | lr 0.000045 | loss 0.030215 | mae 0.137451 -[2024/06/24 06:51:18] ppsci INFO: epoch: 829, train_loss: 0.031044, train_metric: 0.128916, eval_loss: 0.055680, eval_mae: 0.152254 -[2024/06/24 06:51:18] ppsci INFO: train: epoch 830 | step 0 | lr 0.000044 | loss 0.025716 | mae 0.125113 -[2024/06/24 06:51:19] ppsci INFO: train: epoch 830 | step 10 | lr 0.000044 | loss 0.026850 | mae 0.124152 -[2024/06/24 06:51:19] ppsci INFO: train: epoch 830 | step 20 | lr 0.000044 | loss 0.040265 | mae 0.144594 -[2024/06/24 06:51:20] ppsci INFO: train: epoch 830 | step 30 | lr 0.000044 | loss 0.023670 | mae 0.117995 -[2024/06/24 06:51:20] ppsci INFO: train: epoch 830 | step 38 | lr 0.000044 | loss 0.026862 | mae 0.132701 -[2024/06/24 06:51:20] ppsci INFO: epoch: 830, train_loss: 0.028940, train_metric: 0.126520, eval_loss: 0.056262, eval_mae: 0.151944 -[2024/06/24 06:51:20] ppsci INFO: train: epoch 831 | step 0 | lr 0.000044 | loss 0.027299 | mae 0.123955 -[2024/06/24 06:51:21] ppsci INFO: train: epoch 831 | step 10 | lr 0.000044 | loss 0.019447 | mae 0.104366 -[2024/06/24 06:51:21] ppsci INFO: train: epoch 831 | step 20 | lr 0.000044 | loss 0.027163 | mae 0.124118 -[2024/06/24 06:51:22] ppsci INFO: train: epoch 831 | step 30 | lr 0.000044 | loss 0.027582 | mae 0.120754 -[2024/06/24 06:51:22] ppsci INFO: train: epoch 831 | step 38 | lr 0.000044 | loss 0.027461 | mae 0.134131 -[2024/06/24 06:51:22] ppsci INFO: epoch: 831, train_loss: 0.028622, train_metric: 0.125381, eval_loss: 0.056860, eval_mae: 0.153677 -[2024/06/24 06:51:22] ppsci INFO: train: epoch 832 | step 0 | lr 0.000043 | loss 0.034766 | mae 0.139203 -[2024/06/24 06:51:23] ppsci INFO: train: epoch 832 | step 10 | lr 0.000043 | loss 0.026104 | mae 0.127253 -[2024/06/24 06:51:24] ppsci INFO: train: epoch 832 | step 20 | lr 0.000043 | loss 0.023327 | mae 0.121665 -[2024/06/24 06:51:24] ppsci INFO: train: epoch 832 | step 30 | lr 0.000043 | loss 0.025034 | mae 0.122726 -[2024/06/24 06:51:24] ppsci INFO: train: epoch 832 | step 38 | lr 0.000043 | loss 0.056218 | mae 0.134407 -[2024/06/24 06:51:25] ppsci INFO: epoch: 832, train_loss: 0.030837, train_metric: 0.127629, eval_loss: 0.055852, eval_mae: 0.153463 -[2024/06/24 06:51:25] ppsci INFO: train: epoch 833 | step 0 | lr 0.000043 | loss 0.026903 | mae 0.124965 -[2024/06/24 06:51:25] ppsci INFO: train: epoch 833 | step 10 | lr 0.000043 | loss 0.025378 | mae 0.120574 -[2024/06/24 06:51:26] ppsci INFO: train: epoch 833 | step 20 | lr 0.000043 | loss 0.030246 | mae 0.130328 -[2024/06/24 06:51:26] ppsci INFO: train: epoch 833 | step 30 | lr 0.000043 | loss 0.026339 | mae 0.124233 -[2024/06/24 06:51:27] ppsci INFO: train: epoch 833 | step 38 | lr 0.000043 | loss 0.020307 | mae 0.094785 -[2024/06/24 06:51:27] ppsci INFO: epoch: 833, train_loss: 0.030661, train_metric: 0.128494, eval_loss: 0.056627, eval_mae: 0.152276 -[2024/06/24 06:51:27] ppsci INFO: train: epoch 834 | step 0 | lr 0.000043 | loss 0.045431 | mae 0.157572 -[2024/06/24 06:51:28] ppsci INFO: train: epoch 834 | step 10 | lr 0.000043 | loss 0.022780 | mae 0.116068 -[2024/06/24 06:51:28] ppsci INFO: train: epoch 834 | step 20 | lr 0.000043 | loss 0.029361 | mae 0.128265 -[2024/06/24 06:51:29] ppsci INFO: train: epoch 834 | step 30 | lr 0.000043 | loss 0.019483 | mae 0.105845 -[2024/06/24 06:51:29] ppsci INFO: train: epoch 834 | step 38 | lr 0.000043 | loss 0.068927 | mae 0.192443 -[2024/06/24 06:51:29] ppsci INFO: epoch: 834, train_loss: 0.029063, train_metric: 0.124096, eval_loss: 0.056628, eval_mae: 0.153366 -[2024/06/24 06:51:29] ppsci INFO: train: epoch 835 | step 0 | lr 0.000042 | loss 0.038391 | mae 0.142710 -[2024/06/24 06:51:30] ppsci INFO: train: epoch 835 | step 10 | lr 0.000042 | loss 0.024194 | mae 0.117172 -[2024/06/24 06:51:30] ppsci INFO: train: epoch 835 | step 20 | lr 0.000042 | loss 0.030372 | mae 0.125477 -[2024/06/24 06:51:31] ppsci INFO: train: epoch 835 | step 30 | lr 0.000042 | loss 0.024954 | mae 0.118119 -[2024/06/24 06:51:31] ppsci INFO: train: epoch 835 | step 38 | lr 0.000042 | loss 0.152669 | mae 0.276536 -[2024/06/24 06:51:31] ppsci INFO: epoch: 835, train_loss: 0.032667, train_metric: 0.126024, eval_loss: 0.057589, eval_mae: 0.153324 -[2024/06/24 06:51:31] ppsci INFO: train: epoch 836 | step 0 | lr 0.000042 | loss 0.026689 | mae 0.125618 -[2024/06/24 06:51:32] ppsci INFO: train: epoch 836 | step 10 | lr 0.000042 | loss 0.023757 | mae 0.115402 -[2024/06/24 06:51:32] ppsci INFO: train: epoch 836 | step 20 | lr 0.000042 | loss 0.022626 | mae 0.112387 -[2024/06/24 06:51:33] ppsci INFO: train: epoch 836 | step 30 | lr 0.000042 | loss 0.033837 | mae 0.134933 -[2024/06/24 06:51:33] ppsci INFO: train: epoch 836 | step 38 | lr 0.000042 | loss 0.076821 | mae 0.208903 -[2024/06/24 06:51:33] ppsci INFO: epoch: 836, train_loss: 0.031136, train_metric: 0.128267, eval_loss: 0.057342, eval_mae: 0.152991 -[2024/06/24 06:51:34] ppsci INFO: train: epoch 837 | step 0 | lr 0.000041 | loss 0.037870 | mae 0.131092 -[2024/06/24 06:51:34] ppsci INFO: train: epoch 837 | step 10 | lr 0.000041 | loss 0.036208 | mae 0.136266 -[2024/06/24 06:51:35] ppsci INFO: train: epoch 837 | step 20 | lr 0.000041 | loss 0.035015 | mae 0.131072 -[2024/06/24 06:51:35] ppsci INFO: train: epoch 837 | step 30 | lr 0.000041 | loss 0.030623 | mae 0.137744 -[2024/06/24 06:51:35] ppsci INFO: train: epoch 837 | step 38 | lr 0.000041 | loss 0.026924 | mae 0.134929 -[2024/06/24 06:51:36] ppsci INFO: epoch: 837, train_loss: 0.030275, train_metric: 0.126899, eval_loss: 0.056498, eval_mae: 0.152763 -[2024/06/24 06:51:36] ppsci INFO: train: epoch 838 | step 0 | lr 0.000041 | loss 0.025339 | mae 0.113660 -[2024/06/24 06:51:36] ppsci INFO: train: epoch 838 | step 10 | lr 0.000041 | loss 0.031220 | mae 0.129822 -[2024/06/24 06:51:37] ppsci INFO: train: epoch 838 | step 20 | lr 0.000041 | loss 0.037701 | mae 0.133218 -[2024/06/24 06:51:37] ppsci INFO: train: epoch 838 | step 30 | lr 0.000041 | loss 0.029927 | mae 0.128042 -[2024/06/24 06:51:38] ppsci INFO: train: epoch 838 | step 38 | lr 0.000041 | loss 0.038570 | mae 0.118374 -[2024/06/24 06:51:38] ppsci INFO: epoch: 838, train_loss: 0.030318, train_metric: 0.127058, eval_loss: 0.057375, eval_mae: 0.152580 -[2024/06/24 06:51:38] ppsci INFO: train: epoch 839 | step 0 | lr 0.000041 | loss 0.021851 | mae 0.107216 -[2024/06/24 06:51:38] ppsci INFO: train: epoch 839 | step 10 | lr 0.000041 | loss 0.031485 | mae 0.140742 -[2024/06/24 06:51:39] ppsci INFO: train: epoch 839 | step 20 | lr 0.000041 | loss 0.034604 | mae 0.135066 -[2024/06/24 06:51:39] ppsci INFO: train: epoch 839 | step 30 | lr 0.000041 | loss 0.026822 | mae 0.124014 -[2024/06/24 06:51:40] ppsci INFO: train: epoch 839 | step 38 | lr 0.000041 | loss 0.014546 | mae 0.107571 -[2024/06/24 06:51:40] ppsci INFO: epoch: 839, train_loss: 0.031701, train_metric: 0.129997, eval_loss: 0.056706, eval_mae: 0.153008 -[2024/06/24 06:51:40] ppsci INFO: train: epoch 840 | step 0 | lr 0.000040 | loss 0.022455 | mae 0.113403 -[2024/06/24 06:51:40] ppsci INFO: train: epoch 840 | step 10 | lr 0.000040 | loss 0.026231 | mae 0.127017 -[2024/06/24 06:51:41] ppsci INFO: train: epoch 840 | step 20 | lr 0.000040 | loss 0.027124 | mae 0.130892 -[2024/06/24 06:51:41] ppsci INFO: train: epoch 840 | step 30 | lr 0.000040 | loss 0.041809 | mae 0.149359 -[2024/06/24 06:51:42] ppsci INFO: train: epoch 840 | step 38 | lr 0.000040 | loss 0.029590 | mae 0.146427 -[2024/06/24 06:51:42] ppsci INFO: epoch: 840, train_loss: 0.029952, train_metric: 0.126768, eval_loss: 0.056722, eval_mae: 0.153325 -[2024/06/24 06:51:42] ppsci INFO: train: epoch 841 | step 0 | lr 0.000040 | loss 0.020097 | mae 0.114196 -[2024/06/24 06:51:42] ppsci INFO: train: epoch 841 | step 10 | lr 0.000040 | loss 0.030755 | mae 0.127328 -[2024/06/24 06:51:43] ppsci INFO: train: epoch 841 | step 20 | lr 0.000040 | loss 0.038655 | mae 0.126418 -[2024/06/24 06:51:43] ppsci INFO: train: epoch 841 | step 30 | lr 0.000040 | loss 0.022159 | mae 0.114705 -[2024/06/24 06:51:44] ppsci INFO: train: epoch 841 | step 38 | lr 0.000040 | loss 0.013855 | mae 0.093565 -[2024/06/24 06:51:44] ppsci INFO: epoch: 841, train_loss: 0.029738, train_metric: 0.126541, eval_loss: 0.056124, eval_mae: 0.152939 -[2024/06/24 06:51:44] ppsci INFO: train: epoch 842 | step 0 | lr 0.000040 | loss 0.025242 | mae 0.125951 -[2024/06/24 06:51:44] ppsci INFO: train: epoch 842 | step 10 | lr 0.000040 | loss 0.036643 | mae 0.137648 -[2024/06/24 06:51:45] ppsci INFO: train: epoch 842 | step 20 | lr 0.000040 | loss 0.033169 | mae 0.140310 -[2024/06/24 06:51:45] ppsci INFO: train: epoch 842 | step 30 | lr 0.000040 | loss 0.038543 | mae 0.136425 -[2024/06/24 06:51:46] ppsci INFO: train: epoch 842 | step 38 | lr 0.000040 | loss 0.048673 | mae 0.191694 -[2024/06/24 06:51:46] ppsci INFO: epoch: 842, train_loss: 0.030985, train_metric: 0.128142, eval_loss: 0.056138, eval_mae: 0.152713 -[2024/06/24 06:51:46] ppsci INFO: train: epoch 843 | step 0 | lr 0.000039 | loss 0.028226 | mae 0.125928 -[2024/06/24 06:51:47] ppsci INFO: train: epoch 843 | step 10 | lr 0.000039 | loss 0.033999 | mae 0.137169 -[2024/06/24 06:51:47] ppsci INFO: train: epoch 843 | step 20 | lr 0.000039 | loss 0.020330 | mae 0.105537 -[2024/06/24 06:51:48] ppsci INFO: train: epoch 843 | step 30 | lr 0.000039 | loss 0.030389 | mae 0.132370 -[2024/06/24 06:51:48] ppsci INFO: train: epoch 843 | step 38 | lr 0.000039 | loss 0.020984 | mae 0.122887 -[2024/06/24 06:51:48] ppsci INFO: epoch: 843, train_loss: 0.030173, train_metric: 0.128487, eval_loss: 0.056840, eval_mae: 0.154805 -[2024/06/24 06:51:48] ppsci INFO: train: epoch 844 | step 0 | lr 0.000039 | loss 0.017464 | mae 0.094706 -[2024/06/24 06:51:49] ppsci INFO: train: epoch 844 | step 10 | lr 0.000039 | loss 0.026908 | mae 0.123660 -[2024/06/24 06:51:49] ppsci INFO: train: epoch 844 | step 20 | lr 0.000039 | loss 0.031228 | mae 0.131056 -[2024/06/24 06:51:50] ppsci INFO: train: epoch 844 | step 30 | lr 0.000039 | loss 0.045098 | mae 0.136392 -[2024/06/24 06:51:50] ppsci INFO: train: epoch 844 | step 38 | lr 0.000039 | loss 0.031448 | mae 0.143136 -[2024/06/24 06:51:50] ppsci INFO: epoch: 844, train_loss: 0.030907, train_metric: 0.127390, eval_loss: 0.056265, eval_mae: 0.153446 -[2024/06/24 06:51:50] ppsci INFO: train: epoch 845 | step 0 | lr 0.000038 | loss 0.039596 | mae 0.125943 -[2024/06/24 06:51:51] ppsci INFO: train: epoch 845 | step 10 | lr 0.000038 | loss 0.031695 | mae 0.130156 -[2024/06/24 06:51:51] ppsci INFO: train: epoch 845 | step 20 | lr 0.000038 | loss 0.035976 | mae 0.139977 -[2024/06/24 06:51:52] ppsci INFO: train: epoch 845 | step 30 | lr 0.000038 | loss 0.024080 | mae 0.107400 -[2024/06/24 06:51:52] ppsci INFO: train: epoch 845 | step 38 | lr 0.000038 | loss 0.023316 | mae 0.111398 -[2024/06/24 06:51:52] ppsci INFO: epoch: 845, train_loss: 0.030418, train_metric: 0.126625, eval_loss: 0.057105, eval_mae: 0.153875 -[2024/06/24 06:51:53] ppsci INFO: train: epoch 846 | step 0 | lr 0.000038 | loss 0.029305 | mae 0.122732 -[2024/06/24 06:51:53] ppsci INFO: train: epoch 846 | step 10 | lr 0.000038 | loss 0.023054 | mae 0.120972 -[2024/06/24 06:51:53] ppsci INFO: train: epoch 846 | step 20 | lr 0.000038 | loss 0.035689 | mae 0.148320 -[2024/06/24 06:51:54] ppsci INFO: train: epoch 846 | step 30 | lr 0.000038 | loss 0.035695 | mae 0.139452 -[2024/06/24 06:51:54] ppsci INFO: train: epoch 846 | step 38 | lr 0.000038 | loss 0.018890 | mae 0.115368 -[2024/06/24 06:51:54] ppsci INFO: epoch: 846, train_loss: 0.028177, train_metric: 0.125670, eval_loss: 0.057593, eval_mae: 0.153441 -[2024/06/24 06:51:55] ppsci INFO: train: epoch 847 | step 0 | lr 0.000038 | loss 0.032388 | mae 0.132014 -[2024/06/24 06:51:55] ppsci INFO: train: epoch 847 | step 10 | lr 0.000038 | loss 0.025425 | mae 0.124156 -[2024/06/24 06:51:56] ppsci INFO: train: epoch 847 | step 20 | lr 0.000038 | loss 0.040093 | mae 0.139707 -[2024/06/24 06:51:56] ppsci INFO: train: epoch 847 | step 30 | lr 0.000038 | loss 0.043006 | mae 0.142208 -[2024/06/24 06:51:56] ppsci INFO: train: epoch 847 | step 38 | lr 0.000038 | loss 0.023850 | mae 0.112587 -[2024/06/24 06:51:56] ppsci INFO: epoch: 847, train_loss: 0.029993, train_metric: 0.126964, eval_loss: 0.057283, eval_mae: 0.153024 -[2024/06/24 06:51:57] ppsci INFO: train: epoch 848 | step 0 | lr 0.000037 | loss 0.024041 | mae 0.120785 -[2024/06/24 06:51:57] ppsci INFO: train: epoch 848 | step 10 | lr 0.000037 | loss 0.026502 | mae 0.125132 -[2024/06/24 06:51:58] ppsci INFO: train: epoch 848 | step 20 | lr 0.000037 | loss 0.023603 | mae 0.115667 -[2024/06/24 06:51:58] ppsci INFO: train: epoch 848 | step 30 | lr 0.000037 | loss 0.020675 | mae 0.112209 -[2024/06/24 06:51:58] ppsci INFO: train: epoch 848 | step 38 | lr 0.000037 | loss 0.017862 | mae 0.104633 -[2024/06/24 06:51:59] ppsci INFO: epoch: 848, train_loss: 0.030198, train_metric: 0.126959, eval_loss: 0.056613, eval_mae: 0.152842 -[2024/06/24 06:51:59] ppsci INFO: train: epoch 849 | step 0 | lr 0.000037 | loss 0.024672 | mae 0.120647 -[2024/06/24 06:51:59] ppsci INFO: train: epoch 849 | step 10 | lr 0.000037 | loss 0.037078 | mae 0.138953 -[2024/06/24 06:52:00] ppsci INFO: train: epoch 849 | step 20 | lr 0.000037 | loss 0.029117 | mae 0.127464 -[2024/06/24 06:52:00] ppsci INFO: train: epoch 849 | step 30 | lr 0.000037 | loss 0.031807 | mae 0.119769 -[2024/06/24 06:52:01] ppsci INFO: train: epoch 849 | step 38 | lr 0.000037 | loss 0.016424 | mae 0.108230 -[2024/06/24 06:52:01] ppsci INFO: epoch: 849, train_loss: 0.029527, train_metric: 0.127858, eval_loss: 0.056802, eval_mae: 0.153018 -[2024/06/24 06:52:01] ppsci INFO: train: epoch 850 | step 0 | lr 0.000037 | loss 0.027815 | mae 0.119410 -[2024/06/24 06:52:01] ppsci INFO: train: epoch 850 | step 10 | lr 0.000037 | loss 0.020352 | mae 0.109281 -[2024/06/24 06:52:02] ppsci INFO: train: epoch 850 | step 20 | lr 0.000037 | loss 0.054598 | mae 0.159021 -[2024/06/24 06:52:02] ppsci INFO: train: epoch 850 | step 30 | lr 0.000037 | loss 0.026353 | mae 0.120832 -[2024/06/24 06:52:03] ppsci INFO: train: epoch 850 | step 38 | lr 0.000037 | loss 0.035870 | mae 0.172398 -[2024/06/24 06:52:03] ppsci INFO: epoch: 850, train_loss: 0.031730, train_metric: 0.130463, eval_loss: 0.056231, eval_mae: 0.152641 -[2024/06/24 06:52:03] ppsci INFO: train: epoch 851 | step 0 | lr 0.000036 | loss 0.034995 | mae 0.131431 -[2024/06/24 06:52:03] ppsci INFO: train: epoch 851 | step 10 | lr 0.000036 | loss 0.023886 | mae 0.117457 -[2024/06/24 06:52:04] ppsci INFO: train: epoch 851 | step 20 | lr 0.000036 | loss 0.037307 | mae 0.136222 -[2024/06/24 06:52:04] ppsci INFO: train: epoch 851 | step 30 | lr 0.000036 | loss 0.029975 | mae 0.127751 -[2024/06/24 06:52:05] ppsci INFO: train: epoch 851 | step 38 | lr 0.000036 | loss 0.041024 | mae 0.139216 -[2024/06/24 06:52:05] ppsci INFO: epoch: 851, train_loss: 0.030835, train_metric: 0.127503, eval_loss: 0.057598, eval_mae: 0.153415 -[2024/06/24 06:52:05] ppsci INFO: train: epoch 852 | step 0 | lr 0.000036 | loss 0.027447 | mae 0.123274 -[2024/06/24 06:52:05] ppsci INFO: train: epoch 852 | step 10 | lr 0.000036 | loss 0.023261 | mae 0.119312 -[2024/06/24 06:52:06] ppsci INFO: train: epoch 852 | step 20 | lr 0.000036 | loss 0.025901 | mae 0.123559 -[2024/06/24 06:52:06] ppsci INFO: train: epoch 852 | step 30 | lr 0.000036 | loss 0.024519 | mae 0.126639 -[2024/06/24 06:52:07] ppsci INFO: train: epoch 852 | step 38 | lr 0.000036 | loss 0.022204 | mae 0.122578 -[2024/06/24 06:52:07] ppsci INFO: epoch: 852, train_loss: 0.029499, train_metric: 0.126322, eval_loss: 0.057037, eval_mae: 0.153593 -[2024/06/24 06:52:07] ppsci INFO: train: epoch 853 | step 0 | lr 0.000036 | loss 0.038349 | mae 0.138582 -[2024/06/24 06:52:07] ppsci INFO: train: epoch 853 | step 10 | lr 0.000036 | loss 0.021748 | mae 0.113157 -[2024/06/24 06:52:08] ppsci INFO: train: epoch 853 | step 20 | lr 0.000036 | loss 0.028163 | mae 0.130666 -[2024/06/24 06:52:09] ppsci INFO: train: epoch 853 | step 30 | lr 0.000036 | loss 0.035564 | mae 0.144105 -[2024/06/24 06:52:09] ppsci INFO: train: epoch 853 | step 38 | lr 0.000036 | loss 0.027143 | mae 0.130503 -[2024/06/24 06:52:09] ppsci INFO: epoch: 853, train_loss: 0.027155, train_metric: 0.122928, eval_loss: 0.056773, eval_mae: 0.153289 -[2024/06/24 06:52:09] ppsci INFO: train: epoch 854 | step 0 | lr 0.000035 | loss 0.025539 | mae 0.117372 -[2024/06/24 06:52:10] ppsci INFO: train: epoch 854 | step 10 | lr 0.000035 | loss 0.024244 | mae 0.120776 -[2024/06/24 06:52:10] ppsci INFO: train: epoch 854 | step 20 | lr 0.000035 | loss 0.035341 | mae 0.140981 -[2024/06/24 06:52:11] ppsci INFO: train: epoch 854 | step 30 | lr 0.000035 | loss 0.024983 | mae 0.122777 -[2024/06/24 06:52:11] ppsci INFO: train: epoch 854 | step 38 | lr 0.000035 | loss 0.021337 | mae 0.112342 -[2024/06/24 06:52:11] ppsci INFO: epoch: 854, train_loss: 0.030970, train_metric: 0.128020, eval_loss: 0.058485, eval_mae: 0.154950 -[2024/06/24 06:52:11] ppsci INFO: train: epoch 855 | step 0 | lr 0.000035 | loss 0.029219 | mae 0.128332 -[2024/06/24 06:52:12] ppsci INFO: train: epoch 855 | step 10 | lr 0.000035 | loss 0.031410 | mae 0.128195 -[2024/06/24 06:52:12] ppsci INFO: train: epoch 855 | step 20 | lr 0.000035 | loss 0.040520 | mae 0.141961 -[2024/06/24 06:52:13] ppsci INFO: train: epoch 855 | step 30 | lr 0.000035 | loss 0.022656 | mae 0.114188 -[2024/06/24 06:52:13] ppsci INFO: train: epoch 855 | step 38 | lr 0.000035 | loss 0.024302 | mae 0.126980 -[2024/06/24 06:52:13] ppsci INFO: epoch: 855, train_loss: 0.032026, train_metric: 0.130585, eval_loss: 0.058174, eval_mae: 0.153783 -[2024/06/24 06:52:14] ppsci INFO: train: epoch 856 | step 0 | lr 0.000035 | loss 0.034623 | mae 0.143137 -[2024/06/24 06:52:14] ppsci INFO: train: epoch 856 | step 10 | lr 0.000035 | loss 0.049531 | mae 0.148883 -[2024/06/24 06:52:15] ppsci INFO: train: epoch 856 | step 20 | lr 0.000035 | loss 0.034044 | mae 0.131551 -[2024/06/24 06:52:15] ppsci INFO: train: epoch 856 | step 30 | lr 0.000035 | loss 0.033912 | mae 0.143278 -[2024/06/24 06:52:15] ppsci INFO: train: epoch 856 | step 38 | lr 0.000035 | loss 0.054114 | mae 0.158749 -[2024/06/24 06:52:16] ppsci INFO: epoch: 856, train_loss: 0.031099, train_metric: 0.127370, eval_loss: 0.056758, eval_mae: 0.152440 -[2024/06/24 06:52:16] ppsci INFO: train: epoch 857 | step 0 | lr 0.000034 | loss 0.025949 | mae 0.118937 -[2024/06/24 06:52:16] ppsci INFO: train: epoch 857 | step 10 | lr 0.000034 | loss 0.025524 | mae 0.114736 -[2024/06/24 06:52:17] ppsci INFO: train: epoch 857 | step 20 | lr 0.000034 | loss 0.029743 | mae 0.123319 -[2024/06/24 06:52:17] ppsci INFO: train: epoch 857 | step 30 | lr 0.000034 | loss 0.029877 | mae 0.130912 -[2024/06/24 06:52:18] ppsci INFO: train: epoch 857 | step 38 | lr 0.000034 | loss 0.031617 | mae 0.153091 -[2024/06/24 06:52:18] ppsci INFO: epoch: 857, train_loss: 0.029627, train_metric: 0.125912, eval_loss: 0.057193, eval_mae: 0.151963 -[2024/06/24 06:52:18] ppsci INFO: train: epoch 858 | step 0 | lr 0.000034 | loss 0.038466 | mae 0.140845 -[2024/06/24 06:52:18] ppsci INFO: train: epoch 858 | step 10 | lr 0.000034 | loss 0.054668 | mae 0.141414 -[2024/06/24 06:52:19] ppsci INFO: train: epoch 858 | step 20 | lr 0.000034 | loss 0.026495 | mae 0.131101 -[2024/06/24 06:52:19] ppsci INFO: train: epoch 858 | step 30 | lr 0.000034 | loss 0.032663 | mae 0.129897 -[2024/06/24 06:52:20] ppsci INFO: train: epoch 858 | step 38 | lr 0.000034 | loss 0.029157 | mae 0.123931 -[2024/06/24 06:52:20] ppsci INFO: epoch: 858, train_loss: 0.029391, train_metric: 0.126213, eval_loss: 0.058016, eval_mae: 0.152341 -[2024/06/24 06:52:20] ppsci INFO: train: epoch 859 | step 0 | lr 0.000034 | loss 0.029176 | mae 0.114919 -[2024/06/24 06:52:20] ppsci INFO: train: epoch 859 | step 10 | lr 0.000034 | loss 0.035635 | mae 0.141459 -[2024/06/24 06:52:21] ppsci INFO: train: epoch 859 | step 20 | lr 0.000034 | loss 0.042879 | mae 0.150137 -[2024/06/24 06:52:21] ppsci INFO: train: epoch 859 | step 30 | lr 0.000034 | loss 0.028277 | mae 0.128520 -[2024/06/24 06:52:22] ppsci INFO: train: epoch 859 | step 38 | lr 0.000034 | loss 0.018782 | mae 0.108950 -[2024/06/24 06:52:22] ppsci INFO: epoch: 859, train_loss: 0.029973, train_metric: 0.127337, eval_loss: 0.058055, eval_mae: 0.153085 -[2024/06/24 06:52:22] ppsci INFO: train: epoch 860 | step 0 | lr 0.000033 | loss 0.030960 | mae 0.129769 -[2024/06/24 06:52:23] ppsci INFO: train: epoch 860 | step 10 | lr 0.000033 | loss 0.030147 | mae 0.117607 -[2024/06/24 06:52:23] ppsci INFO: train: epoch 860 | step 20 | lr 0.000033 | loss 0.027930 | mae 0.125347 -[2024/06/24 06:52:24] ppsci INFO: train: epoch 860 | step 30 | lr 0.000033 | loss 0.023082 | mae 0.114929 -[2024/06/24 06:52:24] ppsci INFO: train: epoch 860 | step 38 | lr 0.000033 | loss 0.021191 | mae 0.126335 -[2024/06/24 06:52:24] ppsci INFO: epoch: 860, train_loss: 0.028807, train_metric: 0.126680, eval_loss: 0.058417, eval_mae: 0.153107 -[2024/06/24 06:52:24] ppsci INFO: train: epoch 861 | step 0 | lr 0.000033 | loss 0.027727 | mae 0.125818 -[2024/06/24 06:52:25] ppsci INFO: train: epoch 861 | step 10 | lr 0.000033 | loss 0.021179 | mae 0.104094 -[2024/06/24 06:52:25] ppsci INFO: train: epoch 861 | step 20 | lr 0.000033 | loss 0.026794 | mae 0.118865 -[2024/06/24 06:52:26] ppsci INFO: train: epoch 861 | step 30 | lr 0.000033 | loss 0.023248 | mae 0.117541 -[2024/06/24 06:52:26] ppsci INFO: train: epoch 861 | step 38 | lr 0.000033 | loss 0.040464 | mae 0.117588 -[2024/06/24 06:52:26] ppsci INFO: epoch: 861, train_loss: 0.028236, train_metric: 0.122921, eval_loss: 0.057416, eval_mae: 0.152849 -[2024/06/24 06:52:26] ppsci INFO: train: epoch 862 | step 0 | lr 0.000033 | loss 0.030427 | mae 0.132320 -[2024/06/24 06:52:27] ppsci INFO: train: epoch 862 | step 10 | lr 0.000033 | loss 0.027063 | mae 0.118278 -[2024/06/24 06:52:27] ppsci INFO: train: epoch 862 | step 20 | lr 0.000033 | loss 0.037484 | mae 0.138212 -[2024/06/24 06:52:28] ppsci INFO: train: epoch 862 | step 30 | lr 0.000033 | loss 0.030971 | mae 0.123286 -[2024/06/24 06:52:28] ppsci INFO: train: epoch 862 | step 38 | lr 0.000033 | loss 0.013817 | mae 0.077703 -[2024/06/24 06:52:28] ppsci INFO: epoch: 862, train_loss: 0.029823, train_metric: 0.127592, eval_loss: 0.057546, eval_mae: 0.152777 -[2024/06/24 06:52:28] ppsci INFO: train: epoch 863 | step 0 | lr 0.000032 | loss 0.032901 | mae 0.136659 -[2024/06/24 06:52:29] ppsci INFO: train: epoch 863 | step 10 | lr 0.000032 | loss 0.028398 | mae 0.127685 -[2024/06/24 06:52:30] ppsci INFO: train: epoch 863 | step 20 | lr 0.000032 | loss 0.032155 | mae 0.122503 -[2024/06/24 06:52:30] ppsci INFO: train: epoch 863 | step 30 | lr 0.000032 | loss 0.026656 | mae 0.124093 -[2024/06/24 06:52:30] ppsci INFO: train: epoch 863 | step 38 | lr 0.000032 | loss 0.018608 | mae 0.105590 -[2024/06/24 06:52:30] ppsci INFO: epoch: 863, train_loss: 0.029237, train_metric: 0.126642, eval_loss: 0.056737, eval_mae: 0.152168 -[2024/06/24 06:52:31] ppsci INFO: train: epoch 864 | step 0 | lr 0.000032 | loss 0.031819 | mae 0.127274 -[2024/06/24 06:52:31] ppsci INFO: train: epoch 864 | step 10 | lr 0.000032 | loss 0.026544 | mae 0.120074 -[2024/06/24 06:52:32] ppsci INFO: train: epoch 864 | step 20 | lr 0.000032 | loss 0.036904 | mae 0.137999 -[2024/06/24 06:52:32] ppsci INFO: train: epoch 864 | step 30 | lr 0.000032 | loss 0.033796 | mae 0.130377 -[2024/06/24 06:52:32] ppsci INFO: train: epoch 864 | step 38 | lr 0.000032 | loss 0.017014 | mae 0.103847 -[2024/06/24 06:52:32] ppsci INFO: epoch: 864, train_loss: 0.029247, train_metric: 0.125820, eval_loss: 0.057315, eval_mae: 0.152697 -[2024/06/24 06:52:33] ppsci INFO: train: epoch 865 | step 0 | lr 0.000032 | loss 0.039359 | mae 0.136813 -[2024/06/24 06:52:33] ppsci INFO: train: epoch 865 | step 10 | lr 0.000032 | loss 0.030246 | mae 0.125185 -[2024/06/24 06:52:34] ppsci INFO: train: epoch 865 | step 20 | lr 0.000032 | loss 0.025837 | mae 0.118941 -[2024/06/24 06:52:34] ppsci INFO: train: epoch 865 | step 30 | lr 0.000032 | loss 0.022596 | mae 0.114254 -[2024/06/24 06:52:35] ppsci INFO: train: epoch 865 | step 38 | lr 0.000032 | loss 0.036055 | mae 0.109029 -[2024/06/24 06:52:35] ppsci INFO: epoch: 865, train_loss: 0.028901, train_metric: 0.124362, eval_loss: 0.056839, eval_mae: 0.152385 -[2024/06/24 06:52:35] ppsci INFO: train: epoch 866 | step 0 | lr 0.000031 | loss 0.028505 | mae 0.125047 -[2024/06/24 06:52:35] ppsci INFO: train: epoch 866 | step 10 | lr 0.000031 | loss 0.029644 | mae 0.128199 -[2024/06/24 06:52:36] ppsci INFO: train: epoch 866 | step 20 | lr 0.000031 | loss 0.031150 | mae 0.120736 -[2024/06/24 06:52:36] ppsci INFO: train: epoch 866 | step 30 | lr 0.000031 | loss 0.042017 | mae 0.125296 -[2024/06/24 06:52:37] ppsci INFO: train: epoch 866 | step 38 | lr 0.000031 | loss 0.057235 | mae 0.167779 -[2024/06/24 06:52:37] ppsci INFO: epoch: 866, train_loss: 0.030501, train_metric: 0.125993, eval_loss: 0.056428, eval_mae: 0.152137 -[2024/06/24 06:52:37] ppsci INFO: train: epoch 867 | step 0 | lr 0.000031 | loss 0.031842 | mae 0.129538 -[2024/06/24 06:52:38] ppsci INFO: train: epoch 867 | step 10 | lr 0.000031 | loss 0.030693 | mae 0.127020 -[2024/06/24 06:52:38] ppsci INFO: train: epoch 867 | step 20 | lr 0.000031 | loss 0.045175 | mae 0.140945 -[2024/06/24 06:52:39] ppsci INFO: train: epoch 867 | step 30 | lr 0.000031 | loss 0.026109 | mae 0.119332 -[2024/06/24 06:52:39] ppsci INFO: train: epoch 867 | step 38 | lr 0.000031 | loss 0.052759 | mae 0.149943 -[2024/06/24 06:52:39] ppsci INFO: epoch: 867, train_loss: 0.029542, train_metric: 0.125852, eval_loss: 0.055741, eval_mae: 0.152261 -[2024/06/24 06:52:39] ppsci INFO: train: epoch 868 | step 0 | lr 0.000031 | loss 0.028852 | mae 0.130380 -[2024/06/24 06:52:40] ppsci INFO: train: epoch 868 | step 10 | lr 0.000031 | loss 0.031077 | mae 0.133638 -[2024/06/24 06:52:40] ppsci INFO: train: epoch 868 | step 20 | lr 0.000031 | loss 0.031830 | mae 0.128961 -[2024/06/24 06:52:41] ppsci INFO: train: epoch 868 | step 30 | lr 0.000031 | loss 0.034118 | mae 0.131058 -[2024/06/24 06:52:41] ppsci INFO: train: epoch 868 | step 38 | lr 0.000031 | loss 0.015199 | mae 0.104314 -[2024/06/24 06:52:42] ppsci INFO: epoch: 868, train_loss: 0.028910, train_metric: 0.126133, eval_loss: 0.056560, eval_mae: 0.152775 -[2024/06/24 06:52:42] ppsci INFO: train: epoch 869 | step 0 | lr 0.000030 | loss 0.025457 | mae 0.120016 -[2024/06/24 06:52:42] ppsci INFO: train: epoch 869 | step 10 | lr 0.000030 | loss 0.018828 | mae 0.109740 -[2024/06/24 06:52:43] ppsci INFO: train: epoch 869 | step 20 | lr 0.000030 | loss 0.026720 | mae 0.123293 -[2024/06/24 06:52:43] ppsci INFO: train: epoch 869 | step 30 | lr 0.000030 | loss 0.030171 | mae 0.124690 -[2024/06/24 06:52:44] ppsci INFO: train: epoch 869 | step 38 | lr 0.000030 | loss 0.022709 | mae 0.122460 -[2024/06/24 06:52:44] ppsci INFO: epoch: 869, train_loss: 0.029668, train_metric: 0.124972, eval_loss: 0.056069, eval_mae: 0.151326 -[2024/06/24 06:52:44] ppsci INFO: train: epoch 870 | step 0 | lr 0.000030 | loss 0.031214 | mae 0.131006 -[2024/06/24 06:52:44] ppsci INFO: train: epoch 870 | step 10 | lr 0.000030 | loss 0.028988 | mae 0.133205 -[2024/06/24 06:52:45] ppsci INFO: train: epoch 870 | step 20 | lr 0.000030 | loss 0.024798 | mae 0.114684 -[2024/06/24 06:52:46] ppsci INFO: train: epoch 870 | step 30 | lr 0.000030 | loss 0.028493 | mae 0.125458 -[2024/06/24 06:52:46] ppsci INFO: train: epoch 870 | step 38 | lr 0.000030 | loss 0.036268 | mae 0.158439 -[2024/06/24 06:52:46] ppsci INFO: epoch: 870, train_loss: 0.029692, train_metric: 0.126924, eval_loss: 0.056707, eval_mae: 0.152007 -[2024/06/24 06:52:46] ppsci INFO: train: epoch 871 | step 0 | lr 0.000030 | loss 0.026995 | mae 0.122189 -[2024/06/24 06:52:47] ppsci INFO: train: epoch 871 | step 10 | lr 0.000030 | loss 0.026247 | mae 0.126257 -[2024/06/24 06:52:47] ppsci INFO: train: epoch 871 | step 20 | lr 0.000030 | loss 0.032310 | mae 0.129867 -[2024/06/24 06:52:48] ppsci INFO: train: epoch 871 | step 30 | lr 0.000030 | loss 0.042565 | mae 0.146069 -[2024/06/24 06:52:48] ppsci INFO: train: epoch 871 | step 38 | lr 0.000030 | loss 0.027804 | mae 0.132593 -[2024/06/24 06:52:48] ppsci INFO: epoch: 871, train_loss: 0.032152, train_metric: 0.130987, eval_loss: 0.058015, eval_mae: 0.152683 -[2024/06/24 06:52:48] ppsci INFO: train: epoch 872 | step 0 | lr 0.000030 | loss 0.028719 | mae 0.129522 -[2024/06/24 06:52:49] ppsci INFO: train: epoch 872 | step 10 | lr 0.000030 | loss 0.024256 | mae 0.116179 -[2024/06/24 06:52:49] ppsci INFO: train: epoch 872 | step 20 | lr 0.000030 | loss 0.024213 | mae 0.116230 -[2024/06/24 06:52:50] ppsci INFO: train: epoch 872 | step 30 | lr 0.000030 | loss 0.016307 | mae 0.099580 -[2024/06/24 06:52:50] ppsci INFO: train: epoch 872 | step 38 | lr 0.000030 | loss 0.032550 | mae 0.139330 -[2024/06/24 06:52:50] ppsci INFO: epoch: 872, train_loss: 0.028507, train_metric: 0.123791, eval_loss: 0.058070, eval_mae: 0.152466 -[2024/06/24 06:52:50] ppsci INFO: train: epoch 873 | step 0 | lr 0.000029 | loss 0.024413 | mae 0.117298 -[2024/06/24 06:52:51] ppsci INFO: train: epoch 873 | step 10 | lr 0.000029 | loss 0.021125 | mae 0.113285 -[2024/06/24 06:52:52] ppsci INFO: train: epoch 873 | step 20 | lr 0.000029 | loss 0.030111 | mae 0.129514 -[2024/06/24 06:52:52] ppsci INFO: train: epoch 873 | step 30 | lr 0.000029 | loss 0.029800 | mae 0.132553 -[2024/06/24 06:52:52] ppsci INFO: train: epoch 873 | step 38 | lr 0.000029 | loss 0.041570 | mae 0.155478 -[2024/06/24 06:52:53] ppsci INFO: epoch: 873, train_loss: 0.029281, train_metric: 0.125540, eval_loss: 0.057549, eval_mae: 0.153072 -[2024/06/24 06:52:53] ppsci INFO: train: epoch 874 | step 0 | lr 0.000029 | loss 0.038878 | mae 0.141037 -[2024/06/24 06:52:53] ppsci INFO: train: epoch 874 | step 10 | lr 0.000029 | loss 0.025605 | mae 0.124551 -[2024/06/24 06:52:54] ppsci INFO: train: epoch 874 | step 20 | lr 0.000029 | loss 0.033755 | mae 0.125613 -[2024/06/24 06:52:54] ppsci INFO: train: epoch 874 | step 30 | lr 0.000029 | loss 0.037861 | mae 0.143733 -[2024/06/24 06:52:55] ppsci INFO: train: epoch 874 | step 38 | lr 0.000029 | loss 0.027665 | mae 0.128067 -[2024/06/24 06:52:55] ppsci INFO: epoch: 874, train_loss: 0.029386, train_metric: 0.125120, eval_loss: 0.056420, eval_mae: 0.152365 -[2024/06/24 06:52:55] ppsci INFO: train: epoch 875 | step 0 | lr 0.000029 | loss 0.030531 | mae 0.117682 -[2024/06/24 06:52:55] ppsci INFO: train: epoch 875 | step 10 | lr 0.000029 | loss 0.031549 | mae 0.123739 -[2024/06/24 06:52:56] ppsci INFO: train: epoch 875 | step 20 | lr 0.000029 | loss 0.021728 | mae 0.116252 -[2024/06/24 06:52:56] ppsci INFO: train: epoch 875 | step 30 | lr 0.000029 | loss 0.030563 | mae 0.128617 -[2024/06/24 06:52:57] ppsci INFO: train: epoch 875 | step 38 | lr 0.000029 | loss 0.022739 | mae 0.111700 -[2024/06/24 06:52:57] ppsci INFO: epoch: 875, train_loss: 0.029831, train_metric: 0.126695, eval_loss: 0.056956, eval_mae: 0.152370 -[2024/06/24 06:52:57] ppsci INFO: train: epoch 876 | step 0 | lr 0.000028 | loss 0.034544 | mae 0.135956 -[2024/06/24 06:52:57] ppsci INFO: train: epoch 876 | step 10 | lr 0.000028 | loss 0.032315 | mae 0.133536 -[2024/06/24 06:52:58] ppsci INFO: train: epoch 876 | step 20 | lr 0.000028 | loss 0.035203 | mae 0.140684 -[2024/06/24 06:52:59] ppsci INFO: train: epoch 876 | step 30 | lr 0.000028 | loss 0.025072 | mae 0.124117 -[2024/06/24 06:52:59] ppsci INFO: train: epoch 876 | step 38 | lr 0.000028 | loss 0.021436 | mae 0.116156 -[2024/06/24 06:52:59] ppsci INFO: epoch: 876, train_loss: 0.028729, train_metric: 0.123115, eval_loss: 0.058076, eval_mae: 0.152975 -[2024/06/24 06:52:59] ppsci INFO: train: epoch 877 | step 0 | lr 0.000028 | loss 0.030549 | mae 0.121276 -[2024/06/24 06:53:00] ppsci INFO: train: epoch 877 | step 10 | lr 0.000028 | loss 0.028615 | mae 0.122512 -[2024/06/24 06:53:00] ppsci INFO: train: epoch 877 | step 20 | lr 0.000028 | loss 0.042884 | mae 0.138301 -[2024/06/24 06:53:01] ppsci INFO: train: epoch 877 | step 30 | lr 0.000028 | loss 0.024498 | mae 0.123098 -[2024/06/24 06:53:01] ppsci INFO: train: epoch 877 | step 38 | lr 0.000028 | loss 0.032029 | mae 0.145945 -[2024/06/24 06:53:01] ppsci INFO: epoch: 877, train_loss: 0.028981, train_metric: 0.125369, eval_loss: 0.058157, eval_mae: 0.153522 -[2024/06/24 06:53:01] ppsci INFO: train: epoch 878 | step 0 | lr 0.000028 | loss 0.028775 | mae 0.128627 -[2024/06/24 06:53:02] ppsci INFO: train: epoch 878 | step 10 | lr 0.000028 | loss 0.051613 | mae 0.141073 -[2024/06/24 06:53:02] ppsci INFO: train: epoch 878 | step 20 | lr 0.000028 | loss 0.046178 | mae 0.139709 -[2024/06/24 06:53:03] ppsci INFO: train: epoch 878 | step 30 | lr 0.000028 | loss 0.033678 | mae 0.139624 -[2024/06/24 06:53:03] ppsci INFO: train: epoch 878 | step 38 | lr 0.000028 | loss 0.018116 | mae 0.105756 -[2024/06/24 06:53:03] ppsci INFO: epoch: 878, train_loss: 0.030132, train_metric: 0.126771, eval_loss: 0.058705, eval_mae: 0.151993 -[2024/06/24 06:53:03] ppsci INFO: train: epoch 879 | step 0 | lr 0.000027 | loss 0.023373 | mae 0.121114 -[2024/06/24 06:53:04] ppsci INFO: train: epoch 879 | step 10 | lr 0.000027 | loss 0.028408 | mae 0.122707 -[2024/06/24 06:53:04] ppsci INFO: train: epoch 879 | step 20 | lr 0.000027 | loss 0.054237 | mae 0.141860 -[2024/06/24 06:53:05] ppsci INFO: train: epoch 879 | step 30 | lr 0.000027 | loss 0.027124 | mae 0.123511 -[2024/06/24 06:53:05] ppsci INFO: train: epoch 879 | step 38 | lr 0.000027 | loss 0.017305 | mae 0.094909 -[2024/06/24 06:53:05] ppsci INFO: epoch: 879, train_loss: 0.028842, train_metric: 0.124754, eval_loss: 0.058608, eval_mae: 0.153095 -[2024/06/24 06:53:05] ppsci INFO: train: epoch 880 | step 0 | lr 0.000027 | loss 0.031309 | mae 0.134340 -[2024/06/24 06:53:06] ppsci INFO: train: epoch 880 | step 10 | lr 0.000027 | loss 0.029848 | mae 0.127503 -[2024/06/24 06:53:07] ppsci INFO: train: epoch 880 | step 20 | lr 0.000027 | loss 0.040404 | mae 0.129661 -[2024/06/24 06:53:07] ppsci INFO: train: epoch 880 | step 30 | lr 0.000027 | loss 0.026843 | mae 0.118871 -[2024/06/24 06:53:07] ppsci INFO: train: epoch 880 | step 38 | lr 0.000027 | loss 0.014482 | mae 0.100054 -[2024/06/24 06:53:08] ppsci INFO: epoch: 880, train_loss: 0.029333, train_metric: 0.126209, eval_loss: 0.058420, eval_mae: 0.153136 -[2024/06/24 06:53:08] ppsci INFO: train: epoch 881 | step 0 | lr 0.000027 | loss 0.023927 | mae 0.115574 -[2024/06/24 06:53:08] ppsci INFO: train: epoch 881 | step 10 | lr 0.000027 | loss 0.029768 | mae 0.128854 -[2024/06/24 06:53:09] ppsci INFO: train: epoch 881 | step 20 | lr 0.000027 | loss 0.060140 | mae 0.155835 -[2024/06/24 06:53:09] ppsci INFO: train: epoch 881 | step 30 | lr 0.000027 | loss 0.029003 | mae 0.126906 -[2024/06/24 06:53:10] ppsci INFO: train: epoch 881 | step 38 | lr 0.000027 | loss 0.020425 | mae 0.128006 -[2024/06/24 06:53:10] ppsci INFO: epoch: 881, train_loss: 0.028434, train_metric: 0.124775, eval_loss: 0.058015, eval_mae: 0.153057 -[2024/06/24 06:53:10] ppsci INFO: train: epoch 882 | step 0 | lr 0.000027 | loss 0.029267 | mae 0.126439 -[2024/06/24 06:53:10] ppsci INFO: train: epoch 882 | step 10 | lr 0.000027 | loss 0.032285 | mae 0.126751 -[2024/06/24 06:53:11] ppsci INFO: train: epoch 882 | step 20 | lr 0.000027 | loss 0.028092 | mae 0.122190 -[2024/06/24 06:53:11] ppsci INFO: train: epoch 882 | step 30 | lr 0.000027 | loss 0.034343 | mae 0.118073 -[2024/06/24 06:53:12] ppsci INFO: train: epoch 882 | step 38 | lr 0.000027 | loss 0.021244 | mae 0.113987 -[2024/06/24 06:53:12] ppsci INFO: epoch: 882, train_loss: 0.030310, train_metric: 0.127287, eval_loss: 0.057006, eval_mae: 0.152196 -[2024/06/24 06:53:12] ppsci INFO: train: epoch 883 | step 0 | lr 0.000026 | loss 0.028169 | mae 0.132908 -[2024/06/24 06:53:12] ppsci INFO: train: epoch 883 | step 10 | lr 0.000026 | loss 0.026018 | mae 0.123122 -[2024/06/24 06:53:13] ppsci INFO: train: epoch 883 | step 20 | lr 0.000026 | loss 0.024606 | mae 0.116980 -[2024/06/24 06:53:14] ppsci INFO: train: epoch 883 | step 30 | lr 0.000026 | loss 0.038981 | mae 0.140839 -[2024/06/24 06:53:14] ppsci INFO: train: epoch 883 | step 38 | lr 0.000026 | loss 0.014182 | mae 0.082287 -[2024/06/24 06:53:14] ppsci INFO: epoch: 883, train_loss: 0.028275, train_metric: 0.124648, eval_loss: 0.057082, eval_mae: 0.152356 -[2024/06/24 06:53:14] ppsci INFO: train: epoch 884 | step 0 | lr 0.000026 | loss 0.024013 | mae 0.119005 -[2024/06/24 06:53:15] ppsci INFO: train: epoch 884 | step 10 | lr 0.000026 | loss 0.019361 | mae 0.103163 -[2024/06/24 06:53:15] ppsci INFO: train: epoch 884 | step 20 | lr 0.000026 | loss 0.035352 | mae 0.138199 -[2024/06/24 06:53:16] ppsci INFO: train: epoch 884 | step 30 | lr 0.000026 | loss 0.027757 | mae 0.126031 -[2024/06/24 06:53:16] ppsci INFO: train: epoch 884 | step 38 | lr 0.000026 | loss 0.025070 | mae 0.114871 -[2024/06/24 06:53:16] ppsci INFO: epoch: 884, train_loss: 0.028218, train_metric: 0.124296, eval_loss: 0.057312, eval_mae: 0.151642 -[2024/06/24 06:53:16] ppsci INFO: train: epoch 885 | step 0 | lr 0.000026 | loss 0.027782 | mae 0.128221 -[2024/06/24 06:53:17] ppsci INFO: train: epoch 885 | step 10 | lr 0.000026 | loss 0.032684 | mae 0.127838 -[2024/06/24 06:53:17] ppsci INFO: train: epoch 885 | step 20 | lr 0.000026 | loss 0.034769 | mae 0.133868 -[2024/06/24 06:53:18] ppsci INFO: train: epoch 885 | step 30 | lr 0.000026 | loss 0.022495 | mae 0.115358 -[2024/06/24 06:53:18] ppsci INFO: train: epoch 885 | step 38 | lr 0.000026 | loss 0.009258 | mae 0.087819 -[2024/06/24 06:53:18] ppsci INFO: epoch: 885, train_loss: 0.029205, train_metric: 0.127657, eval_loss: 0.057723, eval_mae: 0.152461 -[2024/06/24 06:53:18] ppsci INFO: train: epoch 886 | step 0 | lr 0.000026 | loss 0.023032 | mae 0.118107 -[2024/06/24 06:53:19] ppsci INFO: train: epoch 886 | step 10 | lr 0.000026 | loss 0.023236 | mae 0.116572 -[2024/06/24 06:53:19] ppsci INFO: train: epoch 886 | step 20 | lr 0.000026 | loss 0.028352 | mae 0.126358 -[2024/06/24 06:53:20] ppsci INFO: train: epoch 886 | step 30 | lr 0.000026 | loss 0.035696 | mae 0.137584 -[2024/06/24 06:53:20] ppsci INFO: train: epoch 886 | step 38 | lr 0.000026 | loss 0.026030 | mae 0.131200 -[2024/06/24 06:53:20] ppsci INFO: epoch: 886, train_loss: 0.027655, train_metric: 0.124267, eval_loss: 0.057346, eval_mae: 0.152031 -[2024/06/24 06:53:20] ppsci INFO: train: epoch 887 | step 0 | lr 0.000025 | loss 0.025470 | mae 0.112870 -[2024/06/24 06:53:21] ppsci INFO: train: epoch 887 | step 10 | lr 0.000025 | loss 0.040627 | mae 0.135944 -[2024/06/24 06:53:21] ppsci INFO: train: epoch 887 | step 20 | lr 0.000025 | loss 0.021102 | mae 0.107505 -[2024/06/24 06:53:22] ppsci INFO: train: epoch 887 | step 30 | lr 0.000025 | loss 0.025603 | mae 0.117822 -[2024/06/24 06:53:22] ppsci INFO: train: epoch 887 | step 38 | lr 0.000025 | loss 0.066936 | mae 0.188883 -[2024/06/24 06:53:22] ppsci INFO: epoch: 887, train_loss: 0.031862, train_metric: 0.128520, eval_loss: 0.057573, eval_mae: 0.152364 -[2024/06/24 06:53:22] ppsci INFO: train: epoch 888 | step 0 | lr 0.000025 | loss 0.025107 | mae 0.128748 -[2024/06/24 06:53:23] ppsci INFO: train: epoch 888 | step 10 | lr 0.000025 | loss 0.021690 | mae 0.112713 -[2024/06/24 06:53:23] ppsci INFO: train: epoch 888 | step 20 | lr 0.000025 | loss 0.034311 | mae 0.138114 -[2024/06/24 06:53:24] ppsci INFO: train: epoch 888 | step 30 | lr 0.000025 | loss 0.028924 | mae 0.123894 -[2024/06/24 06:53:24] ppsci INFO: train: epoch 888 | step 38 | lr 0.000025 | loss 0.127817 | mae 0.244153 -[2024/06/24 06:53:24] ppsci INFO: epoch: 888, train_loss: 0.030512, train_metric: 0.123905, eval_loss: 0.057228, eval_mae: 0.153369 -[2024/06/24 06:53:25] ppsci INFO: train: epoch 889 | step 0 | lr 0.000025 | loss 0.022297 | mae 0.115889 -[2024/06/24 06:53:25] ppsci INFO: train: epoch 889 | step 10 | lr 0.000025 | loss 0.024570 | mae 0.113608 -[2024/06/24 06:53:26] ppsci INFO: train: epoch 889 | step 20 | lr 0.000025 | loss 0.029339 | mae 0.123599 -[2024/06/24 06:53:26] ppsci INFO: train: epoch 889 | step 30 | lr 0.000025 | loss 0.033780 | mae 0.131681 -[2024/06/24 06:53:27] ppsci INFO: train: epoch 889 | step 38 | lr 0.000025 | loss 0.044601 | mae 0.164528 -[2024/06/24 06:53:27] ppsci INFO: epoch: 889, train_loss: 0.029886, train_metric: 0.124897, eval_loss: 0.057222, eval_mae: 0.152409 -[2024/06/24 06:53:27] ppsci INFO: train: epoch 890 | step 0 | lr 0.000024 | loss 0.029197 | mae 0.135274 -[2024/06/24 06:53:27] ppsci INFO: train: epoch 890 | step 10 | lr 0.000024 | loss 0.022642 | mae 0.113822 -[2024/06/24 06:53:28] ppsci INFO: train: epoch 890 | step 20 | lr 0.000024 | loss 0.019226 | mae 0.106315 -[2024/06/24 06:53:28] ppsci INFO: train: epoch 890 | step 30 | lr 0.000024 | loss 0.025234 | mae 0.119316 -[2024/06/24 06:53:29] ppsci INFO: train: epoch 890 | step 38 | lr 0.000024 | loss 0.044597 | mae 0.155345 -[2024/06/24 06:53:29] ppsci INFO: epoch: 890, train_loss: 0.029131, train_metric: 0.125873, eval_loss: 0.057850, eval_mae: 0.153535 -[2024/06/24 06:53:29] ppsci INFO: train: epoch 891 | step 0 | lr 0.000024 | loss 0.033293 | mae 0.144524 -[2024/06/24 06:53:29] ppsci INFO: train: epoch 891 | step 10 | lr 0.000024 | loss 0.036879 | mae 0.141206 -[2024/06/24 06:53:30] ppsci INFO: train: epoch 891 | step 20 | lr 0.000024 | loss 0.030194 | mae 0.124974 -[2024/06/24 06:53:30] ppsci INFO: train: epoch 891 | step 30 | lr 0.000024 | loss 0.033174 | mae 0.136898 -[2024/06/24 06:53:31] ppsci INFO: train: epoch 891 | step 38 | lr 0.000024 | loss 0.054263 | mae 0.153521 -[2024/06/24 06:53:31] ppsci INFO: epoch: 891, train_loss: 0.033086, train_metric: 0.130302, eval_loss: 0.058570, eval_mae: 0.153555 -[2024/06/24 06:53:31] ppsci INFO: train: epoch 892 | step 0 | lr 0.000024 | loss 0.028015 | mae 0.124295 -[2024/06/24 06:53:31] ppsci INFO: train: epoch 892 | step 10 | lr 0.000024 | loss 0.028856 | mae 0.130479 -[2024/06/24 06:53:32] ppsci INFO: train: epoch 892 | step 20 | lr 0.000024 | loss 0.026755 | mae 0.117269 -[2024/06/24 06:53:32] ppsci INFO: train: epoch 892 | step 30 | lr 0.000024 | loss 0.033604 | mae 0.131936 -[2024/06/24 06:53:33] ppsci INFO: train: epoch 892 | step 38 | lr 0.000024 | loss 0.024826 | mae 0.130936 -[2024/06/24 06:53:33] ppsci INFO: epoch: 892, train_loss: 0.029431, train_metric: 0.127865, eval_loss: 0.057082, eval_mae: 0.152948 -[2024/06/24 06:53:33] ppsci INFO: train: epoch 893 | step 0 | lr 0.000024 | loss 0.033003 | mae 0.137038 -[2024/06/24 06:53:34] ppsci INFO: train: epoch 893 | step 10 | lr 0.000024 | loss 0.036203 | mae 0.132302 -[2024/06/24 06:53:34] ppsci INFO: train: epoch 893 | step 20 | lr 0.000024 | loss 0.024131 | mae 0.118555 -[2024/06/24 06:53:35] ppsci INFO: train: epoch 893 | step 30 | lr 0.000024 | loss 0.027793 | mae 0.121747 -[2024/06/24 06:53:35] ppsci INFO: train: epoch 893 | step 38 | lr 0.000024 | loss 0.008442 | mae 0.077498 -[2024/06/24 06:53:35] ppsci INFO: epoch: 893, train_loss: 0.028371, train_metric: 0.125274, eval_loss: 0.057272, eval_mae: 0.152790 -[2024/06/24 06:53:35] ppsci INFO: train: epoch 894 | step 0 | lr 0.000023 | loss 0.034101 | mae 0.124442 -[2024/06/24 06:53:36] ppsci INFO: train: epoch 894 | step 10 | lr 0.000023 | loss 0.027201 | mae 0.119667 -[2024/06/24 06:53:36] ppsci INFO: train: epoch 894 | step 20 | lr 0.000023 | loss 0.024156 | mae 0.111121 -[2024/06/24 06:53:37] ppsci INFO: train: epoch 894 | step 30 | lr 0.000023 | loss 0.031772 | mae 0.129933 -[2024/06/24 06:53:37] ppsci INFO: train: epoch 894 | step 38 | lr 0.000023 | loss 0.015459 | mae 0.099527 -[2024/06/24 06:53:38] ppsci INFO: epoch: 894, train_loss: 0.028525, train_metric: 0.125991, eval_loss: 0.057207, eval_mae: 0.153003 -[2024/06/24 06:53:38] ppsci INFO: train: epoch 895 | step 0 | lr 0.000023 | loss 0.024453 | mae 0.120230 -[2024/06/24 06:53:38] ppsci INFO: train: epoch 895 | step 10 | lr 0.000023 | loss 0.025699 | mae 0.119092 -[2024/06/24 06:53:39] ppsci INFO: train: epoch 895 | step 20 | lr 0.000023 | loss 0.037636 | mae 0.138526 -[2024/06/24 06:53:39] ppsci INFO: train: epoch 895 | step 30 | lr 0.000023 | loss 0.033249 | mae 0.133135 -[2024/06/24 06:53:40] ppsci INFO: train: epoch 895 | step 38 | lr 0.000023 | loss 0.028856 | mae 0.102885 -[2024/06/24 06:53:40] ppsci INFO: epoch: 895, train_loss: 0.028649, train_metric: 0.125189, eval_loss: 0.057513, eval_mae: 0.152857 -[2024/06/24 06:53:40] ppsci INFO: train: epoch 896 | step 0 | lr 0.000023 | loss 0.027129 | mae 0.132704 -[2024/06/24 06:53:40] ppsci INFO: train: epoch 896 | step 10 | lr 0.000023 | loss 0.029972 | mae 0.131604 -[2024/06/24 06:53:41] ppsci INFO: train: epoch 896 | step 20 | lr 0.000023 | loss 0.027281 | mae 0.122766 -[2024/06/24 06:53:41] ppsci INFO: train: epoch 896 | step 30 | lr 0.000023 | loss 0.031280 | mae 0.127316 -[2024/06/24 06:53:42] ppsci INFO: train: epoch 896 | step 38 | lr 0.000023 | loss 0.021374 | mae 0.110337 -[2024/06/24 06:53:42] ppsci INFO: epoch: 896, train_loss: 0.028506, train_metric: 0.124768, eval_loss: 0.056838, eval_mae: 0.152610 -[2024/06/24 06:53:42] ppsci INFO: train: epoch 897 | step 0 | lr 0.000023 | loss 0.028310 | mae 0.127628 -[2024/06/24 06:53:43] ppsci INFO: train: epoch 897 | step 10 | lr 0.000023 | loss 0.021170 | mae 0.109150 -[2024/06/24 06:53:43] ppsci INFO: train: epoch 897 | step 20 | lr 0.000023 | loss 0.027713 | mae 0.131020 -[2024/06/24 06:53:44] ppsci INFO: train: epoch 897 | step 30 | lr 0.000023 | loss 0.030522 | mae 0.131698 -[2024/06/24 06:53:44] ppsci INFO: train: epoch 897 | step 38 | lr 0.000023 | loss 0.031078 | mae 0.134781 -[2024/06/24 06:53:44] ppsci INFO: epoch: 897, train_loss: 0.029061, train_metric: 0.124823, eval_loss: 0.057163, eval_mae: 0.152109 -[2024/06/24 06:53:44] ppsci INFO: train: epoch 898 | step 0 | lr 0.000022 | loss 0.029212 | mae 0.123006 -[2024/06/24 06:53:45] ppsci INFO: train: epoch 898 | step 10 | lr 0.000022 | loss 0.025810 | mae 0.124115 -[2024/06/24 06:53:45] ppsci INFO: train: epoch 898 | step 20 | lr 0.000022 | loss 0.028672 | mae 0.126175 -[2024/06/24 06:53:46] ppsci INFO: train: epoch 898 | step 30 | lr 0.000022 | loss 0.031003 | mae 0.126724 -[2024/06/24 06:53:46] ppsci INFO: train: epoch 898 | step 38 | lr 0.000022 | loss 0.082242 | mae 0.242852 -[2024/06/24 06:53:46] ppsci INFO: epoch: 898, train_loss: 0.030874, train_metric: 0.126236, eval_loss: 0.056868, eval_mae: 0.152955 -[2024/06/24 06:53:46] ppsci INFO: train: epoch 899 | step 0 | lr 0.000022 | loss 0.032201 | mae 0.126849 -[2024/06/24 06:53:47] ppsci INFO: train: epoch 899 | step 10 | lr 0.000022 | loss 0.025649 | mae 0.117253 -[2024/06/24 06:53:47] ppsci INFO: train: epoch 899 | step 20 | lr 0.000022 | loss 0.022547 | mae 0.118274 -[2024/06/24 06:53:48] ppsci INFO: train: epoch 899 | step 30 | lr 0.000022 | loss 0.024654 | mae 0.120406 -[2024/06/24 06:53:48] ppsci INFO: train: epoch 899 | step 38 | lr 0.000022 | loss 0.025168 | mae 0.117151 -[2024/06/24 06:53:48] ppsci INFO: epoch: 899, train_loss: 0.031487, train_metric: 0.129065, eval_loss: 0.057111, eval_mae: 0.153546 -[2024/06/24 06:53:49] ppsci INFO: train: epoch 900 | step 0 | lr 0.000022 | loss 0.029414 | mae 0.129745 -[2024/06/24 06:53:49] ppsci INFO: train: epoch 900 | step 10 | lr 0.000022 | loss 0.024391 | mae 0.119053 -[2024/06/24 06:53:49] ppsci INFO: train: epoch 900 | step 20 | lr 0.000022 | loss 0.029833 | mae 0.117015 -[2024/06/24 06:53:50] ppsci INFO: train: epoch 900 | step 30 | lr 0.000022 | loss 0.027210 | mae 0.119766 -[2024/06/24 06:53:50] ppsci INFO: train: epoch 900 | step 38 | lr 0.000022 | loss 0.043031 | mae 0.163213 -[2024/06/24 06:53:51] ppsci INFO: epoch: 900, train_loss: 0.029441, train_metric: 0.125579, eval_loss: 0.058204, eval_mae: 0.153217 -[2024/06/24 06:53:51] ppsci INFO: train: epoch 901 | step 0 | lr 0.000022 | loss 0.033962 | mae 0.139686 -[2024/06/24 06:53:51] ppsci INFO: train: epoch 901 | step 10 | lr 0.000022 | loss 0.025944 | mae 0.121155 -[2024/06/24 06:53:52] ppsci INFO: train: epoch 901 | step 20 | lr 0.000022 | loss 0.032752 | mae 0.137315 -[2024/06/24 06:53:52] ppsci INFO: train: epoch 901 | step 30 | lr 0.000022 | loss 0.025141 | mae 0.119048 -[2024/06/24 06:53:53] ppsci INFO: train: epoch 901 | step 38 | lr 0.000022 | loss 0.036714 | mae 0.147672 -[2024/06/24 06:53:53] ppsci INFO: epoch: 901, train_loss: 0.027996, train_metric: 0.123545, eval_loss: 0.058225, eval_mae: 0.152966 -[2024/06/24 06:53:53] ppsci INFO: train: epoch 902 | step 0 | lr 0.000022 | loss 0.020308 | mae 0.108799 -[2024/06/24 06:53:53] ppsci INFO: train: epoch 902 | step 10 | lr 0.000022 | loss 0.031808 | mae 0.127453 -[2024/06/24 06:53:54] ppsci INFO: train: epoch 902 | step 20 | lr 0.000022 | loss 0.030726 | mae 0.132175 -[2024/06/24 06:53:55] ppsci INFO: train: epoch 902 | step 30 | lr 0.000022 | loss 0.032174 | mae 0.129369 -[2024/06/24 06:53:55] ppsci INFO: train: epoch 902 | step 38 | lr 0.000022 | loss 0.042667 | mae 0.139471 -[2024/06/24 06:53:55] ppsci INFO: epoch: 902, train_loss: 0.029429, train_metric: 0.124966, eval_loss: 0.058969, eval_mae: 0.154152 -[2024/06/24 06:53:55] ppsci INFO: train: epoch 903 | step 0 | lr 0.000021 | loss 0.035221 | mae 0.136953 -[2024/06/24 06:53:56] ppsci INFO: train: epoch 903 | step 10 | lr 0.000021 | loss 0.027042 | mae 0.123580 -[2024/06/24 06:53:56] ppsci INFO: train: epoch 903 | step 20 | lr 0.000021 | loss 0.024877 | mae 0.121992 -[2024/06/24 06:53:57] ppsci INFO: train: epoch 903 | step 30 | lr 0.000021 | loss 0.025981 | mae 0.123920 -[2024/06/24 06:53:57] ppsci INFO: train: epoch 903 | step 38 | lr 0.000021 | loss 0.027170 | mae 0.142545 -[2024/06/24 06:53:57] ppsci INFO: epoch: 903, train_loss: 0.028738, train_metric: 0.125066, eval_loss: 0.058699, eval_mae: 0.153693 -[2024/06/24 06:53:57] ppsci INFO: train: epoch 904 | step 0 | lr 0.000021 | loss 0.027464 | mae 0.130653 -[2024/06/24 06:53:58] ppsci INFO: train: epoch 904 | step 10 | lr 0.000021 | loss 0.030859 | mae 0.135665 -[2024/06/24 06:53:58] ppsci INFO: train: epoch 904 | step 20 | lr 0.000021 | loss 0.026106 | mae 0.123811 -[2024/06/24 06:53:59] ppsci INFO: train: epoch 904 | step 30 | lr 0.000021 | loss 0.032701 | mae 0.126472 -[2024/06/24 06:53:59] ppsci INFO: train: epoch 904 | step 38 | lr 0.000021 | loss 0.019290 | mae 0.118601 -[2024/06/24 06:53:59] ppsci INFO: epoch: 904, train_loss: 0.028732, train_metric: 0.125754, eval_loss: 0.057821, eval_mae: 0.153130 -[2024/06/24 06:53:59] ppsci INFO: train: epoch 905 | step 0 | lr 0.000021 | loss 0.031048 | mae 0.139440 -[2024/06/24 06:54:00] ppsci INFO: train: epoch 905 | step 10 | lr 0.000021 | loss 0.027743 | mae 0.113160 -[2024/06/24 06:54:01] ppsci INFO: train: epoch 905 | step 20 | lr 0.000021 | loss 0.021603 | mae 0.115452 -[2024/06/24 06:54:01] ppsci INFO: train: epoch 905 | step 30 | lr 0.000021 | loss 0.028928 | mae 0.123668 -[2024/06/24 06:54:01] ppsci INFO: train: epoch 905 | step 38 | lr 0.000021 | loss 0.025738 | mae 0.119681 -[2024/06/24 06:54:02] ppsci INFO: epoch: 905, train_loss: 0.030503, train_metric: 0.127001, eval_loss: 0.058114, eval_mae: 0.152938 -[2024/06/24 06:54:02] ppsci INFO: train: epoch 906 | step 0 | lr 0.000021 | loss 0.021252 | mae 0.111887 -[2024/06/24 06:54:02] ppsci INFO: train: epoch 906 | step 10 | lr 0.000021 | loss 0.023324 | mae 0.117933 -[2024/06/24 06:54:03] ppsci INFO: train: epoch 906 | step 20 | lr 0.000021 | loss 0.022207 | mae 0.108455 -[2024/06/24 06:54:04] ppsci INFO: train: epoch 906 | step 30 | lr 0.000021 | loss 0.026621 | mae 0.125385 -[2024/06/24 06:54:04] ppsci INFO: train: epoch 906 | step 38 | lr 0.000021 | loss 0.034214 | mae 0.138312 -[2024/06/24 06:54:04] ppsci INFO: epoch: 906, train_loss: 0.028656, train_metric: 0.124863, eval_loss: 0.058269, eval_mae: 0.153175 -[2024/06/24 06:54:04] ppsci INFO: train: epoch 907 | step 0 | lr 0.000020 | loss 0.024365 | mae 0.120384 -[2024/06/24 06:54:05] ppsci INFO: train: epoch 907 | step 10 | lr 0.000020 | loss 0.021399 | mae 0.116020 -[2024/06/24 06:54:05] ppsci INFO: train: epoch 907 | step 20 | lr 0.000020 | loss 0.034804 | mae 0.133567 -[2024/06/24 06:54:06] ppsci INFO: train: epoch 907 | step 30 | lr 0.000020 | loss 0.026473 | mae 0.114151 -[2024/06/24 06:54:06] ppsci INFO: train: epoch 907 | step 38 | lr 0.000020 | loss 0.032309 | mae 0.128835 -[2024/06/24 06:54:06] ppsci INFO: epoch: 907, train_loss: 0.029421, train_metric: 0.125706, eval_loss: 0.058475, eval_mae: 0.153926 -[2024/06/24 06:54:06] ppsci INFO: train: epoch 908 | step 0 | lr 0.000020 | loss 0.027196 | mae 0.126138 -[2024/06/24 06:54:07] ppsci INFO: train: epoch 908 | step 10 | lr 0.000020 | loss 0.021577 | mae 0.109306 -[2024/06/24 06:54:07] ppsci INFO: train: epoch 908 | step 20 | lr 0.000020 | loss 0.025188 | mae 0.121003 -[2024/06/24 06:54:08] ppsci INFO: train: epoch 908 | step 30 | lr 0.000020 | loss 0.028973 | mae 0.125206 -[2024/06/24 06:54:08] ppsci INFO: train: epoch 908 | step 38 | lr 0.000020 | loss 0.058557 | mae 0.162824 -[2024/06/24 06:54:09] ppsci INFO: epoch: 908, train_loss: 0.030504, train_metric: 0.127916, eval_loss: 0.058221, eval_mae: 0.153197 -[2024/06/24 06:54:09] ppsci INFO: train: epoch 909 | step 0 | lr 0.000020 | loss 0.038270 | mae 0.149154 -[2024/06/24 06:54:09] ppsci INFO: train: epoch 909 | step 10 | lr 0.000020 | loss 0.035835 | mae 0.126745 -[2024/06/24 06:54:10] ppsci INFO: train: epoch 909 | step 20 | lr 0.000020 | loss 0.026305 | mae 0.125377 -[2024/06/24 06:54:10] ppsci INFO: train: epoch 909 | step 30 | lr 0.000020 | loss 0.031117 | mae 0.132467 -[2024/06/24 06:54:11] ppsci INFO: train: epoch 909 | step 38 | lr 0.000020 | loss 0.017100 | mae 0.097494 -[2024/06/24 06:54:11] ppsci INFO: epoch: 909, train_loss: 0.029567, train_metric: 0.125829, eval_loss: 0.058254, eval_mae: 0.153981 -[2024/06/24 06:54:11] ppsci INFO: train: epoch 910 | step 0 | lr 0.000020 | loss 0.032589 | mae 0.142822 -[2024/06/24 06:54:11] ppsci INFO: train: epoch 910 | step 10 | lr 0.000020 | loss 0.030616 | mae 0.124230 -[2024/06/24 06:54:12] ppsci INFO: train: epoch 910 | step 20 | lr 0.000020 | loss 0.036622 | mae 0.137743 -[2024/06/24 06:54:12] ppsci INFO: train: epoch 910 | step 30 | lr 0.000020 | loss 0.037913 | mae 0.143261 -[2024/06/24 06:54:13] ppsci INFO: train: epoch 910 | step 38 | lr 0.000020 | loss 0.039733 | mae 0.162460 -[2024/06/24 06:54:13] ppsci INFO: epoch: 910, train_loss: 0.030878, train_metric: 0.127849, eval_loss: 0.058602, eval_mae: 0.154485 -[2024/06/24 06:54:13] ppsci INFO: train: epoch 911 | step 0 | lr 0.000020 | loss 0.025305 | mae 0.117555 -[2024/06/24 06:54:13] ppsci INFO: train: epoch 911 | step 10 | lr 0.000020 | loss 0.026483 | mae 0.115776 -[2024/06/24 06:54:14] ppsci INFO: train: epoch 911 | step 20 | lr 0.000020 | loss 0.023553 | mae 0.116763 -[2024/06/24 06:54:15] ppsci INFO: train: epoch 911 | step 30 | lr 0.000020 | loss 0.023579 | mae 0.120309 -[2024/06/24 06:54:15] ppsci INFO: train: epoch 911 | step 38 | lr 0.000020 | loss 0.041595 | mae 0.184929 -[2024/06/24 06:54:15] ppsci INFO: epoch: 911, train_loss: 0.028856, train_metric: 0.125113, eval_loss: 0.057402, eval_mae: 0.152737 -[2024/06/24 06:54:15] ppsci INFO: train: epoch 912 | step 0 | lr 0.000019 | loss 0.054859 | mae 0.137059 -[2024/06/24 06:54:16] ppsci INFO: train: epoch 912 | step 10 | lr 0.000019 | loss 0.033362 | mae 0.131999 -[2024/06/24 06:54:16] ppsci INFO: train: epoch 912 | step 20 | lr 0.000019 | loss 0.025152 | mae 0.128325 -[2024/06/24 06:54:17] ppsci INFO: train: epoch 912 | step 30 | lr 0.000019 | loss 0.030153 | mae 0.132359 -[2024/06/24 06:54:17] ppsci INFO: train: epoch 912 | step 38 | lr 0.000019 | loss 0.034737 | mae 0.131845 -[2024/06/24 06:54:17] ppsci INFO: epoch: 912, train_loss: 0.030326, train_metric: 0.127643, eval_loss: 0.058077, eval_mae: 0.153618 -[2024/06/24 06:54:17] ppsci INFO: train: epoch 913 | step 0 | lr 0.000019 | loss 0.027984 | mae 0.118264 -[2024/06/24 06:54:18] ppsci INFO: train: epoch 913 | step 10 | lr 0.000019 | loss 0.023076 | mae 0.115377 -[2024/06/24 06:54:18] ppsci INFO: train: epoch 913 | step 20 | lr 0.000019 | loss 0.024513 | mae 0.119979 -[2024/06/24 06:54:19] ppsci INFO: train: epoch 913 | step 30 | lr 0.000019 | loss 0.019181 | mae 0.101249 -[2024/06/24 06:54:19] ppsci INFO: train: epoch 913 | step 38 | lr 0.000019 | loss 0.022403 | mae 0.118094 -[2024/06/24 06:54:19] ppsci INFO: epoch: 913, train_loss: 0.028885, train_metric: 0.124313, eval_loss: 0.058236, eval_mae: 0.153938 -[2024/06/24 06:54:20] ppsci INFO: train: epoch 914 | step 0 | lr 0.000019 | loss 0.030670 | mae 0.134358 -[2024/06/24 06:54:20] ppsci INFO: train: epoch 914 | step 10 | lr 0.000019 | loss 0.024077 | mae 0.117995 -[2024/06/24 06:54:21] ppsci INFO: train: epoch 914 | step 20 | lr 0.000019 | loss 0.026837 | mae 0.127407 -[2024/06/24 06:54:21] ppsci INFO: train: epoch 914 | step 30 | lr 0.000019 | loss 0.028694 | mae 0.129521 -[2024/06/24 06:54:21] ppsci INFO: train: epoch 914 | step 38 | lr 0.000019 | loss 0.031500 | mae 0.148235 -[2024/06/24 06:54:22] ppsci INFO: epoch: 914, train_loss: 0.029084, train_metric: 0.127007, eval_loss: 0.057888, eval_mae: 0.153811 -[2024/06/24 06:54:22] ppsci INFO: train: epoch 915 | step 0 | lr 0.000019 | loss 0.027120 | mae 0.124147 -[2024/06/24 06:54:22] ppsci INFO: train: epoch 915 | step 10 | lr 0.000019 | loss 0.026558 | mae 0.119465 -[2024/06/24 06:54:23] ppsci INFO: train: epoch 915 | step 20 | lr 0.000019 | loss 0.028823 | mae 0.117792 -[2024/06/24 06:54:23] ppsci INFO: train: epoch 915 | step 30 | lr 0.000019 | loss 0.027147 | mae 0.128455 -[2024/06/24 06:54:24] ppsci INFO: train: epoch 915 | step 38 | lr 0.000019 | loss 0.017586 | mae 0.097156 -[2024/06/24 06:54:24] ppsci INFO: epoch: 915, train_loss: 0.028315, train_metric: 0.124059, eval_loss: 0.057762, eval_mae: 0.153806 -[2024/06/24 06:54:24] ppsci INFO: train: epoch 916 | step 0 | lr 0.000018 | loss 0.040961 | mae 0.135054 -[2024/06/24 06:54:24] ppsci INFO: train: epoch 916 | step 10 | lr 0.000018 | loss 0.042008 | mae 0.145114 -[2024/06/24 06:54:25] ppsci INFO: train: epoch 916 | step 20 | lr 0.000018 | loss 0.022924 | mae 0.112975 -[2024/06/24 06:54:25] ppsci INFO: train: epoch 916 | step 30 | lr 0.000018 | loss 0.030747 | mae 0.130813 -[2024/06/24 06:54:26] ppsci INFO: train: epoch 916 | step 38 | lr 0.000018 | loss 0.022671 | mae 0.122944 -[2024/06/24 06:54:26] ppsci INFO: epoch: 916, train_loss: 0.028554, train_metric: 0.124870, eval_loss: 0.058462, eval_mae: 0.154326 -[2024/06/24 06:54:26] ppsci INFO: train: epoch 917 | step 0 | lr 0.000018 | loss 0.023385 | mae 0.121494 -[2024/06/24 06:54:26] ppsci INFO: train: epoch 917 | step 10 | lr 0.000018 | loss 0.032647 | mae 0.133325 -[2024/06/24 06:54:27] ppsci INFO: train: epoch 917 | step 20 | lr 0.000018 | loss 0.023863 | mae 0.116596 -[2024/06/24 06:54:27] ppsci INFO: train: epoch 917 | step 30 | lr 0.000018 | loss 0.021464 | mae 0.108773 -[2024/06/24 06:54:28] ppsci INFO: train: epoch 917 | step 38 | lr 0.000018 | loss 0.066640 | mae 0.209135 -[2024/06/24 06:54:28] ppsci INFO: epoch: 917, train_loss: 0.029576, train_metric: 0.124738, eval_loss: 0.058150, eval_mae: 0.154248 -[2024/06/24 06:54:28] ppsci INFO: train: epoch 918 | step 0 | lr 0.000018 | loss 0.025214 | mae 0.114995 -[2024/06/24 06:54:28] ppsci INFO: train: epoch 918 | step 10 | lr 0.000018 | loss 0.024098 | mae 0.123681 -[2024/06/24 06:54:29] ppsci INFO: train: epoch 918 | step 20 | lr 0.000018 | loss 0.025541 | mae 0.129552 -[2024/06/24 06:54:29] ppsci INFO: train: epoch 918 | step 30 | lr 0.000018 | loss 0.027525 | mae 0.127981 -[2024/06/24 06:54:30] ppsci INFO: train: epoch 918 | step 38 | lr 0.000018 | loss 0.026103 | mae 0.098505 -[2024/06/24 06:54:30] ppsci INFO: epoch: 918, train_loss: 0.029647, train_metric: 0.125970, eval_loss: 0.058008, eval_mae: 0.152855 -[2024/06/24 06:54:30] ppsci INFO: train: epoch 919 | step 0 | lr 0.000018 | loss 0.026918 | mae 0.126260 -[2024/06/24 06:54:30] ppsci INFO: train: epoch 919 | step 10 | lr 0.000018 | loss 0.023719 | mae 0.116765 -[2024/06/24 06:54:31] ppsci INFO: train: epoch 919 | step 20 | lr 0.000018 | loss 0.032040 | mae 0.124978 -[2024/06/24 06:54:32] ppsci INFO: train: epoch 919 | step 30 | lr 0.000018 | loss 0.032720 | mae 0.132397 -[2024/06/24 06:54:32] ppsci INFO: train: epoch 919 | step 38 | lr 0.000018 | loss 0.020314 | mae 0.110067 -[2024/06/24 06:54:32] ppsci INFO: epoch: 919, train_loss: 0.028417, train_metric: 0.124439, eval_loss: 0.058226, eval_mae: 0.153281 -[2024/06/24 06:54:32] ppsci INFO: train: epoch 920 | step 0 | lr 0.000018 | loss 0.030687 | mae 0.114946 -[2024/06/24 06:54:33] ppsci INFO: train: epoch 920 | step 10 | lr 0.000018 | loss 0.022782 | mae 0.114815 -[2024/06/24 06:54:33] ppsci INFO: train: epoch 920 | step 20 | lr 0.000018 | loss 0.037057 | mae 0.145707 -[2024/06/24 06:54:34] ppsci INFO: train: epoch 920 | step 30 | lr 0.000018 | loss 0.024501 | mae 0.116928 -[2024/06/24 06:54:34] ppsci INFO: train: epoch 920 | step 38 | lr 0.000018 | loss 0.007686 | mae 0.072700 -[2024/06/24 06:54:34] ppsci INFO: epoch: 920, train_loss: 0.028238, train_metric: 0.123342, eval_loss: 0.058588, eval_mae: 0.153729 -[2024/06/24 06:54:34] ppsci INFO: train: epoch 921 | step 0 | lr 0.000018 | loss 0.035409 | mae 0.148613 -[2024/06/24 06:54:35] ppsci INFO: train: epoch 921 | step 10 | lr 0.000018 | loss 0.029207 | mae 0.130298 -[2024/06/24 06:54:35] ppsci INFO: train: epoch 921 | step 20 | lr 0.000018 | loss 0.038836 | mae 0.141496 -[2024/06/24 06:54:36] ppsci INFO: train: epoch 921 | step 30 | lr 0.000018 | loss 0.036056 | mae 0.118050 -[2024/06/24 06:54:36] ppsci INFO: train: epoch 921 | step 38 | lr 0.000018 | loss 0.015396 | mae 0.102940 -[2024/06/24 06:54:36] ppsci INFO: epoch: 921, train_loss: 0.028791, train_metric: 0.125755, eval_loss: 0.057967, eval_mae: 0.152585 -[2024/06/24 06:54:36] ppsci INFO: train: epoch 922 | step 0 | lr 0.000017 | loss 0.029533 | mae 0.119218 -[2024/06/24 06:54:37] ppsci INFO: train: epoch 922 | step 10 | lr 0.000017 | loss 0.016836 | mae 0.104956 -[2024/06/24 06:54:38] ppsci INFO: train: epoch 922 | step 20 | lr 0.000017 | loss 0.025438 | mae 0.127964 -[2024/06/24 06:54:38] ppsci INFO: train: epoch 922 | step 30 | lr 0.000017 | loss 0.031841 | mae 0.129528 -[2024/06/24 06:54:38] ppsci INFO: train: epoch 922 | step 38 | lr 0.000017 | loss 0.026126 | mae 0.107205 -[2024/06/24 06:54:38] ppsci INFO: epoch: 922, train_loss: 0.027885, train_metric: 0.124770, eval_loss: 0.057876, eval_mae: 0.153319 -[2024/06/24 06:54:39] ppsci INFO: train: epoch 923 | step 0 | lr 0.000017 | loss 0.023965 | mae 0.115120 -[2024/06/24 06:54:39] ppsci INFO: train: epoch 923 | step 10 | lr 0.000017 | loss 0.028887 | mae 0.116938 -[2024/06/24 06:54:40] ppsci INFO: train: epoch 923 | step 20 | lr 0.000017 | loss 0.034167 | mae 0.122801 -[2024/06/24 06:54:40] ppsci INFO: train: epoch 923 | step 30 | lr 0.000017 | loss 0.020390 | mae 0.101910 -[2024/06/24 06:54:40] ppsci INFO: train: epoch 923 | step 38 | lr 0.000017 | loss 0.029561 | mae 0.133122 -[2024/06/24 06:54:41] ppsci INFO: epoch: 923, train_loss: 0.029259, train_metric: 0.126550, eval_loss: 0.056180, eval_mae: 0.151293 -[2024/06/24 06:54:41] ppsci INFO: train: epoch 924 | step 0 | lr 0.000017 | loss 0.026294 | mae 0.119511 -[2024/06/24 06:54:41] ppsci INFO: train: epoch 924 | step 10 | lr 0.000017 | loss 0.026466 | mae 0.116482 -[2024/06/24 06:54:42] ppsci INFO: train: epoch 924 | step 20 | lr 0.000017 | loss 0.024976 | mae 0.120014 -[2024/06/24 06:54:42] ppsci INFO: train: epoch 924 | step 30 | lr 0.000017 | loss 0.018383 | mae 0.105660 -[2024/06/24 06:54:43] ppsci INFO: train: epoch 924 | step 38 | lr 0.000017 | loss 0.038695 | mae 0.169886 -[2024/06/24 06:54:43] ppsci INFO: epoch: 924, train_loss: 0.030501, train_metric: 0.126765, eval_loss: 0.056542, eval_mae: 0.153364 -[2024/06/24 06:54:43] ppsci INFO: train: epoch 925 | step 0 | lr 0.000017 | loss 0.022837 | mae 0.116197 -[2024/06/24 06:54:43] ppsci INFO: train: epoch 925 | step 10 | lr 0.000017 | loss 0.029097 | mae 0.127702 -[2024/06/24 06:54:44] ppsci INFO: train: epoch 925 | step 20 | lr 0.000017 | loss 0.030924 | mae 0.134663 -[2024/06/24 06:54:44] ppsci INFO: train: epoch 925 | step 30 | lr 0.000017 | loss 0.037117 | mae 0.130386 -[2024/06/24 06:54:45] ppsci INFO: train: epoch 925 | step 38 | lr 0.000017 | loss 0.062653 | mae 0.204090 -[2024/06/24 06:54:45] ppsci INFO: epoch: 925, train_loss: 0.031533, train_metric: 0.126146, eval_loss: 0.056525, eval_mae: 0.152734 -[2024/06/24 06:54:45] ppsci INFO: train: epoch 926 | step 0 | lr 0.000017 | loss 0.025657 | mae 0.114947 -[2024/06/24 06:54:45] ppsci INFO: train: epoch 926 | step 10 | lr 0.000017 | loss 0.029726 | mae 0.128790 -[2024/06/24 06:54:46] ppsci INFO: train: epoch 926 | step 20 | lr 0.000017 | loss 0.027750 | mae 0.118832 -[2024/06/24 06:54:46] ppsci INFO: train: epoch 926 | step 30 | lr 0.000017 | loss 0.032803 | mae 0.128113 -[2024/06/24 06:54:47] ppsci INFO: train: epoch 926 | step 38 | lr 0.000017 | loss 0.027890 | mae 0.134301 -[2024/06/24 06:54:47] ppsci INFO: epoch: 926, train_loss: 0.027648, train_metric: 0.122039, eval_loss: 0.057105, eval_mae: 0.151965 -[2024/06/24 06:54:47] ppsci INFO: train: epoch 927 | step 0 | lr 0.000016 | loss 0.029389 | mae 0.128609 -[2024/06/24 06:54:47] ppsci INFO: train: epoch 927 | step 10 | lr 0.000016 | loss 0.031807 | mae 0.132319 -[2024/06/24 06:54:48] ppsci INFO: train: epoch 927 | step 20 | lr 0.000016 | loss 0.023264 | mae 0.120695 -[2024/06/24 06:54:49] ppsci INFO: train: epoch 927 | step 30 | lr 0.000016 | loss 0.030630 | mae 0.125234 -[2024/06/24 06:54:49] ppsci INFO: train: epoch 927 | step 38 | lr 0.000016 | loss 0.011317 | mae 0.097409 -[2024/06/24 06:54:49] ppsci INFO: epoch: 927, train_loss: 0.027836, train_metric: 0.125126, eval_loss: 0.056863, eval_mae: 0.152042 -[2024/06/24 06:54:49] ppsci INFO: train: epoch 928 | step 0 | lr 0.000016 | loss 0.036069 | mae 0.136140 -[2024/06/24 06:54:50] ppsci INFO: train: epoch 928 | step 10 | lr 0.000016 | loss 0.026943 | mae 0.128426 -[2024/06/24 06:54:50] ppsci INFO: train: epoch 928 | step 20 | lr 0.000016 | loss 0.024496 | mae 0.117368 -[2024/06/24 06:54:51] ppsci INFO: train: epoch 928 | step 30 | lr 0.000016 | loss 0.026508 | mae 0.122023 -[2024/06/24 06:54:51] ppsci INFO: train: epoch 928 | step 38 | lr 0.000016 | loss 0.047479 | mae 0.152569 -[2024/06/24 06:54:51] ppsci INFO: epoch: 928, train_loss: 0.028803, train_metric: 0.124814, eval_loss: 0.056486, eval_mae: 0.151471 -[2024/06/24 06:54:51] ppsci INFO: train: epoch 929 | step 0 | lr 0.000016 | loss 0.028401 | mae 0.120411 -[2024/06/24 06:54:52] ppsci INFO: train: epoch 929 | step 10 | lr 0.000016 | loss 0.017357 | mae 0.104810 -[2024/06/24 06:54:52] ppsci INFO: train: epoch 929 | step 20 | lr 0.000016 | loss 0.033505 | mae 0.125884 -[2024/06/24 06:54:53] ppsci INFO: train: epoch 929 | step 30 | lr 0.000016 | loss 0.027463 | mae 0.120716 -[2024/06/24 06:54:53] ppsci INFO: train: epoch 929 | step 38 | lr 0.000016 | loss 0.042210 | mae 0.137883 -[2024/06/24 06:54:53] ppsci INFO: epoch: 929, train_loss: 0.028116, train_metric: 0.122871, eval_loss: 0.057277, eval_mae: 0.152552 -[2024/06/24 06:54:53] ppsci INFO: train: epoch 930 | step 0 | lr 0.000016 | loss 0.026643 | mae 0.119015 -[2024/06/24 06:54:54] ppsci INFO: train: epoch 930 | step 10 | lr 0.000016 | loss 0.026206 | mae 0.123201 -[2024/06/24 06:54:54] ppsci INFO: train: epoch 930 | step 20 | lr 0.000016 | loss 0.038103 | mae 0.137806 -[2024/06/24 06:54:55] ppsci INFO: train: epoch 930 | step 30 | lr 0.000016 | loss 0.031279 | mae 0.129521 -[2024/06/24 06:54:55] ppsci INFO: train: epoch 930 | step 38 | lr 0.000016 | loss 0.090453 | mae 0.194861 -[2024/06/24 06:54:55] ppsci INFO: epoch: 930, train_loss: 0.030342, train_metric: 0.125769, eval_loss: 0.056932, eval_mae: 0.152211 -[2024/06/24 06:54:55] ppsci INFO: train: epoch 931 | step 0 | lr 0.000016 | loss 0.022959 | mae 0.116597 -[2024/06/24 06:54:56] ppsci INFO: train: epoch 931 | step 10 | lr 0.000016 | loss 0.033787 | mae 0.134183 -[2024/06/24 06:54:57] ppsci INFO: train: epoch 931 | step 20 | lr 0.000016 | loss 0.026315 | mae 0.119734 -[2024/06/24 06:54:57] ppsci INFO: train: epoch 931 | step 30 | lr 0.000016 | loss 0.032264 | mae 0.135664 -[2024/06/24 06:54:57] ppsci INFO: train: epoch 931 | step 38 | lr 0.000016 | loss 0.036688 | mae 0.171514 -[2024/06/24 06:54:58] ppsci INFO: epoch: 931, train_loss: 0.029824, train_metric: 0.125814, eval_loss: 0.057100, eval_mae: 0.152916 -[2024/06/24 06:54:58] ppsci INFO: train: epoch 932 | step 0 | lr 0.000016 | loss 0.031590 | mae 0.126313 -[2024/06/24 06:54:58] ppsci INFO: train: epoch 932 | step 10 | lr 0.000016 | loss 0.026750 | mae 0.122037 -[2024/06/24 06:54:59] ppsci INFO: train: epoch 932 | step 20 | lr 0.000016 | loss 0.029202 | mae 0.133373 -[2024/06/24 06:54:59] ppsci INFO: train: epoch 932 | step 30 | lr 0.000016 | loss 0.027575 | mae 0.124982 -[2024/06/24 06:55:00] ppsci INFO: train: epoch 932 | step 38 | lr 0.000016 | loss 0.031479 | mae 0.141708 -[2024/06/24 06:55:00] ppsci INFO: epoch: 932, train_loss: 0.029800, train_metric: 0.125993, eval_loss: 0.056301, eval_mae: 0.152168 -[2024/06/24 06:55:00] ppsci INFO: train: epoch 933 | step 0 | lr 0.000015 | loss 0.030405 | mae 0.132477 -[2024/06/24 06:55:00] ppsci INFO: train: epoch 933 | step 10 | lr 0.000015 | loss 0.035393 | mae 0.134598 -[2024/06/24 06:55:01] ppsci INFO: train: epoch 933 | step 20 | lr 0.000015 | loss 0.027781 | mae 0.119479 -[2024/06/24 06:55:01] ppsci INFO: train: epoch 933 | step 30 | lr 0.000015 | loss 0.029764 | mae 0.123974 -[2024/06/24 06:55:02] ppsci INFO: train: epoch 933 | step 38 | lr 0.000015 | loss 0.024603 | mae 0.115785 -[2024/06/24 06:55:02] ppsci INFO: epoch: 933, train_loss: 0.029034, train_metric: 0.125441, eval_loss: 0.055925, eval_mae: 0.151045 -[2024/06/24 06:55:02] ppsci INFO: train: epoch 934 | step 0 | lr 0.000015 | loss 0.030830 | mae 0.133305 -[2024/06/24 06:55:02] ppsci INFO: train: epoch 934 | step 10 | lr 0.000015 | loss 0.030385 | mae 0.122990 -[2024/06/24 06:55:03] ppsci INFO: train: epoch 934 | step 20 | lr 0.000015 | loss 0.043482 | mae 0.139214 -[2024/06/24 06:55:03] ppsci INFO: train: epoch 934 | step 30 | lr 0.000015 | loss 0.033742 | mae 0.136166 -[2024/06/24 06:55:04] ppsci INFO: train: epoch 934 | step 38 | lr 0.000015 | loss 0.020376 | mae 0.106666 -[2024/06/24 06:55:04] ppsci INFO: epoch: 934, train_loss: 0.027935, train_metric: 0.123927, eval_loss: 0.056205, eval_mae: 0.151130 -[2024/06/24 06:55:04] ppsci INFO: train: epoch 935 | step 0 | lr 0.000015 | loss 0.024429 | mae 0.115849 -[2024/06/24 06:55:05] ppsci INFO: train: epoch 935 | step 10 | lr 0.000015 | loss 0.024892 | mae 0.114424 -[2024/06/24 06:55:05] ppsci INFO: train: epoch 935 | step 20 | lr 0.000015 | loss 0.029234 | mae 0.125807 -[2024/06/24 06:55:05] ppsci INFO: train: epoch 935 | step 30 | lr 0.000015 | loss 0.024222 | mae 0.120199 -[2024/06/24 06:55:06] ppsci INFO: train: epoch 935 | step 38 | lr 0.000015 | loss 0.015500 | mae 0.090601 -[2024/06/24 06:55:06] ppsci INFO: epoch: 935, train_loss: 0.028964, train_metric: 0.125970, eval_loss: 0.056055, eval_mae: 0.151755 -[2024/06/24 06:55:06] ppsci INFO: train: epoch 936 | step 0 | lr 0.000015 | loss 0.029626 | mae 0.127740 -[2024/06/24 06:55:07] ppsci INFO: train: epoch 936 | step 10 | lr 0.000015 | loss 0.024895 | mae 0.124617 -[2024/06/24 06:55:07] ppsci INFO: train: epoch 936 | step 20 | lr 0.000015 | loss 0.038350 | mae 0.143308 -[2024/06/24 06:55:08] ppsci INFO: train: epoch 936 | step 30 | lr 0.000015 | loss 0.029116 | mae 0.124116 -[2024/06/24 06:55:08] ppsci INFO: train: epoch 936 | step 38 | lr 0.000015 | loss 0.012532 | mae 0.095268 -[2024/06/24 06:55:08] ppsci INFO: epoch: 936, train_loss: 0.028695, train_metric: 0.125224, eval_loss: 0.055923, eval_mae: 0.151896 -[2024/06/24 06:55:08] ppsci INFO: train: epoch 937 | step 0 | lr 0.000015 | loss 0.029850 | mae 0.119828 -[2024/06/24 06:55:09] ppsci INFO: train: epoch 937 | step 10 | lr 0.000015 | loss 0.040202 | mae 0.144894 -[2024/06/24 06:55:09] ppsci INFO: train: epoch 937 | step 20 | lr 0.000015 | loss 0.025972 | mae 0.121795 -[2024/06/24 06:55:10] ppsci INFO: train: epoch 937 | step 30 | lr 0.000015 | loss 0.024353 | mae 0.117989 -[2024/06/24 06:55:10] ppsci INFO: train: epoch 937 | step 38 | lr 0.000015 | loss 0.022891 | mae 0.129750 -[2024/06/24 06:55:10] ppsci INFO: epoch: 937, train_loss: 0.028140, train_metric: 0.123438, eval_loss: 0.056248, eval_mae: 0.152236 -[2024/06/24 06:55:11] ppsci INFO: train: epoch 938 | step 0 | lr 0.000015 | loss 0.029665 | mae 0.127503 -[2024/06/24 06:55:11] ppsci INFO: train: epoch 938 | step 10 | lr 0.000015 | loss 0.023924 | mae 0.115596 -[2024/06/24 06:55:12] ppsci INFO: train: epoch 938 | step 20 | lr 0.000015 | loss 0.029487 | mae 0.124867 -[2024/06/24 06:55:12] ppsci INFO: train: epoch 938 | step 30 | lr 0.000015 | loss 0.024030 | mae 0.116827 -[2024/06/24 06:55:13] ppsci INFO: train: epoch 938 | step 38 | lr 0.000015 | loss 0.012027 | mae 0.086580 -[2024/06/24 06:55:13] ppsci INFO: epoch: 938, train_loss: 0.027717, train_metric: 0.124310, eval_loss: 0.056275, eval_mae: 0.152013 -[2024/06/24 06:55:13] ppsci INFO: train: epoch 939 | step 0 | lr 0.000014 | loss 0.026541 | mae 0.129232 -[2024/06/24 06:55:13] ppsci INFO: train: epoch 939 | step 10 | lr 0.000014 | loss 0.025262 | mae 0.118760 -[2024/06/24 06:55:14] ppsci INFO: train: epoch 939 | step 20 | lr 0.000014 | loss 0.029344 | mae 0.129964 -[2024/06/24 06:55:14] ppsci INFO: train: epoch 939 | step 30 | lr 0.000014 | loss 0.030695 | mae 0.132186 -[2024/06/24 06:55:15] ppsci INFO: train: epoch 939 | step 38 | lr 0.000014 | loss 0.029431 | mae 0.136930 -[2024/06/24 06:55:15] ppsci INFO: epoch: 939, train_loss: 0.029631, train_metric: 0.125385, eval_loss: 0.056752, eval_mae: 0.152496 -[2024/06/24 06:55:15] ppsci INFO: train: epoch 940 | step 0 | lr 0.000014 | loss 0.029257 | mae 0.125925 -[2024/06/24 06:55:16] ppsci INFO: train: epoch 940 | step 10 | lr 0.000014 | loss 0.032589 | mae 0.130621 -[2024/06/24 06:55:16] ppsci INFO: train: epoch 940 | step 20 | lr 0.000014 | loss 0.032793 | mae 0.120344 -[2024/06/24 06:55:17] ppsci INFO: train: epoch 940 | step 30 | lr 0.000014 | loss 0.027256 | mae 0.119755 -[2024/06/24 06:55:17] ppsci INFO: train: epoch 940 | step 38 | lr 0.000014 | loss 0.025979 | mae 0.128120 -[2024/06/24 06:55:17] ppsci INFO: epoch: 940, train_loss: 0.028064, train_metric: 0.123893, eval_loss: 0.056869, eval_mae: 0.151869 -[2024/06/24 06:55:17] ppsci INFO: train: epoch 941 | step 0 | lr 0.000014 | loss 0.033153 | mae 0.138292 -[2024/06/24 06:55:18] ppsci INFO: train: epoch 941 | step 10 | lr 0.000014 | loss 0.029823 | mae 0.133175 -[2024/06/24 06:55:18] ppsci INFO: train: epoch 941 | step 20 | lr 0.000014 | loss 0.028356 | mae 0.127213 -[2024/06/24 06:55:19] ppsci INFO: train: epoch 941 | step 30 | lr 0.000014 | loss 0.023968 | mae 0.115951 -[2024/06/24 06:55:19] ppsci INFO: train: epoch 941 | step 38 | lr 0.000014 | loss 0.017717 | mae 0.104671 -[2024/06/24 06:55:19] ppsci INFO: epoch: 941, train_loss: 0.029671, train_metric: 0.128540, eval_loss: 0.057065, eval_mae: 0.152364 -[2024/06/24 06:55:19] ppsci INFO: train: epoch 942 | step 0 | lr 0.000014 | loss 0.026791 | mae 0.113487 -[2024/06/24 06:55:20] ppsci INFO: train: epoch 942 | step 10 | lr 0.000014 | loss 0.033381 | mae 0.133022 -[2024/06/24 06:55:20] ppsci INFO: train: epoch 942 | step 20 | lr 0.000014 | loss 0.028270 | mae 0.127596 -[2024/06/24 06:55:21] ppsci INFO: train: epoch 942 | step 30 | lr 0.000014 | loss 0.025899 | mae 0.121164 -[2024/06/24 06:55:21] ppsci INFO: train: epoch 942 | step 38 | lr 0.000014 | loss 0.019939 | mae 0.112579 -[2024/06/24 06:55:21] ppsci INFO: epoch: 942, train_loss: 0.028301, train_metric: 0.126159, eval_loss: 0.056498, eval_mae: 0.151795 -[2024/06/24 06:55:21] ppsci INFO: train: epoch 943 | step 0 | lr 0.000014 | loss 0.022795 | mae 0.112304 -[2024/06/24 06:55:22] ppsci INFO: train: epoch 943 | step 10 | lr 0.000014 | loss 0.022982 | mae 0.116791 -[2024/06/24 06:55:23] ppsci INFO: train: epoch 943 | step 20 | lr 0.000014 | loss 0.023649 | mae 0.112192 -[2024/06/24 06:55:23] ppsci INFO: train: epoch 943 | step 30 | lr 0.000014 | loss 0.025855 | mae 0.122101 -[2024/06/24 06:55:23] ppsci INFO: train: epoch 943 | step 38 | lr 0.000014 | loss 0.024506 | mae 0.137870 -[2024/06/24 06:55:24] ppsci INFO: epoch: 943, train_loss: 0.028811, train_metric: 0.125194, eval_loss: 0.057231, eval_mae: 0.152313 -[2024/06/24 06:55:24] ppsci INFO: train: epoch 944 | step 0 | lr 0.000014 | loss 0.035552 | mae 0.132557 -[2024/06/24 06:55:24] ppsci INFO: train: epoch 944 | step 10 | lr 0.000014 | loss 0.031408 | mae 0.124284 -[2024/06/24 06:55:25] ppsci INFO: train: epoch 944 | step 20 | lr 0.000014 | loss 0.028423 | mae 0.123516 -[2024/06/24 06:55:25] ppsci INFO: train: epoch 944 | step 30 | lr 0.000014 | loss 0.028217 | mae 0.116416 -[2024/06/24 06:55:25] ppsci INFO: train: epoch 944 | step 38 | lr 0.000014 | loss 0.040905 | mae 0.160065 -[2024/06/24 06:55:26] ppsci INFO: epoch: 944, train_loss: 0.030387, train_metric: 0.125730, eval_loss: 0.057518, eval_mae: 0.153826 -[2024/06/24 06:55:26] ppsci INFO: train: epoch 945 | step 0 | lr 0.000014 | loss 0.033138 | mae 0.132942 -[2024/06/24 06:55:26] ppsci INFO: train: epoch 945 | step 10 | lr 0.000014 | loss 0.032114 | mae 0.134862 -[2024/06/24 06:55:27] ppsci INFO: train: epoch 945 | step 20 | lr 0.000014 | loss 0.021635 | mae 0.111896 -[2024/06/24 06:55:27] ppsci INFO: train: epoch 945 | step 30 | lr 0.000014 | loss 0.024292 | mae 0.126101 -[2024/06/24 06:55:28] ppsci INFO: train: epoch 945 | step 38 | lr 0.000014 | loss 0.034160 | mae 0.131341 -[2024/06/24 06:55:28] ppsci INFO: epoch: 945, train_loss: 0.028956, train_metric: 0.126270, eval_loss: 0.056976, eval_mae: 0.152409 -[2024/06/24 06:55:28] ppsci INFO: train: epoch 946 | step 0 | lr 0.000014 | loss 0.022771 | mae 0.108850 -[2024/06/24 06:55:28] ppsci INFO: train: epoch 946 | step 10 | lr 0.000014 | loss 0.022695 | mae 0.115324 -[2024/06/24 06:55:29] ppsci INFO: train: epoch 946 | step 20 | lr 0.000014 | loss 0.025318 | mae 0.122331 -[2024/06/24 06:55:30] ppsci INFO: train: epoch 946 | step 30 | lr 0.000014 | loss 0.032696 | mae 0.134879 -[2024/06/24 06:55:30] ppsci INFO: train: epoch 946 | step 38 | lr 0.000014 | loss 0.035096 | mae 0.140687 -[2024/06/24 06:55:30] ppsci INFO: epoch: 946, train_loss: 0.028648, train_metric: 0.124720, eval_loss: 0.057305, eval_mae: 0.152448 -[2024/06/24 06:55:30] ppsci INFO: train: epoch 947 | step 0 | lr 0.000013 | loss 0.021653 | mae 0.108601 -[2024/06/24 06:55:31] ppsci INFO: train: epoch 947 | step 10 | lr 0.000013 | loss 0.020651 | mae 0.110283 -[2024/06/24 06:55:31] ppsci INFO: train: epoch 947 | step 20 | lr 0.000013 | loss 0.038330 | mae 0.144139 -[2024/06/24 06:55:32] ppsci INFO: train: epoch 947 | step 30 | lr 0.000013 | loss 0.025398 | mae 0.114571 -[2024/06/24 06:55:32] ppsci INFO: train: epoch 947 | step 38 | lr 0.000013 | loss 0.027099 | mae 0.139752 -[2024/06/24 06:55:32] ppsci INFO: epoch: 947, train_loss: 0.029275, train_metric: 0.123552, eval_loss: 0.057496, eval_mae: 0.152415 -[2024/06/24 06:55:32] ppsci INFO: train: epoch 948 | step 0 | lr 0.000013 | loss 0.027709 | mae 0.117177 -[2024/06/24 06:55:33] ppsci INFO: train: epoch 948 | step 10 | lr 0.000013 | loss 0.021761 | mae 0.111650 -[2024/06/24 06:55:33] ppsci INFO: train: epoch 948 | step 20 | lr 0.000013 | loss 0.027346 | mae 0.127239 -[2024/06/24 06:55:34] ppsci INFO: train: epoch 948 | step 30 | lr 0.000013 | loss 0.027166 | mae 0.120443 -[2024/06/24 06:55:34] ppsci INFO: train: epoch 948 | step 38 | lr 0.000013 | loss 0.008198 | mae 0.068321 -[2024/06/24 06:55:34] ppsci INFO: epoch: 948, train_loss: 0.028772, train_metric: 0.126061, eval_loss: 0.057701, eval_mae: 0.152340 -[2024/06/24 06:55:34] ppsci INFO: train: epoch 949 | step 0 | lr 0.000013 | loss 0.021848 | mae 0.107789 -[2024/06/24 06:55:35] ppsci INFO: train: epoch 949 | step 10 | lr 0.000013 | loss 0.040578 | mae 0.142823 -[2024/06/24 06:55:35] ppsci INFO: train: epoch 949 | step 20 | lr 0.000013 | loss 0.026309 | mae 0.122624 -[2024/06/24 06:55:36] ppsci INFO: train: epoch 949 | step 30 | lr 0.000013 | loss 0.039590 | mae 0.145935 -[2024/06/24 06:55:36] ppsci INFO: train: epoch 949 | step 38 | lr 0.000013 | loss 0.030432 | mae 0.110022 -[2024/06/24 06:55:36] ppsci INFO: epoch: 949, train_loss: 0.029314, train_metric: 0.125985, eval_loss: 0.057788, eval_mae: 0.153130 -[2024/06/24 06:55:36] ppsci INFO: train: epoch 950 | step 0 | lr 0.000013 | loss 0.030055 | mae 0.131179 -[2024/06/24 06:55:37] ppsci INFO: train: epoch 950 | step 10 | lr 0.000013 | loss 0.035951 | mae 0.147167 -[2024/06/24 06:55:37] ppsci INFO: train: epoch 950 | step 20 | lr 0.000013 | loss 0.030218 | mae 0.130048 -[2024/06/24 06:55:38] ppsci INFO: train: epoch 950 | step 30 | lr 0.000013 | loss 0.028727 | mae 0.125115 -[2024/06/24 06:55:38] ppsci INFO: train: epoch 950 | step 38 | lr 0.000013 | loss 0.037019 | mae 0.155660 -[2024/06/24 06:55:38] ppsci INFO: epoch: 950, train_loss: 0.031424, train_metric: 0.127104, eval_loss: 0.057638, eval_mae: 0.153172 -[2024/06/24 06:55:39] ppsci INFO: train: epoch 951 | step 0 | lr 0.000013 | loss 0.024083 | mae 0.120184 -[2024/06/24 06:55:39] ppsci INFO: train: epoch 951 | step 10 | lr 0.000013 | loss 0.035040 | mae 0.133381 -[2024/06/24 06:55:40] ppsci INFO: train: epoch 951 | step 20 | lr 0.000013 | loss 0.024899 | mae 0.116528 -[2024/06/24 06:55:40] ppsci INFO: train: epoch 951 | step 30 | lr 0.000013 | loss 0.029875 | mae 0.126507 -[2024/06/24 06:55:40] ppsci INFO: train: epoch 951 | step 38 | lr 0.000013 | loss 0.046475 | mae 0.169805 -[2024/06/24 06:55:41] ppsci INFO: epoch: 951, train_loss: 0.029935, train_metric: 0.125735, eval_loss: 0.057885, eval_mae: 0.153298 -[2024/06/24 06:55:41] ppsci INFO: train: epoch 952 | step 0 | lr 0.000013 | loss 0.031851 | mae 0.131393 -[2024/06/24 06:55:41] ppsci INFO: train: epoch 952 | step 10 | lr 0.000013 | loss 0.030143 | mae 0.130744 -[2024/06/24 06:55:42] ppsci INFO: train: epoch 952 | step 20 | lr 0.000013 | loss 0.023253 | mae 0.124447 -[2024/06/24 06:55:42] ppsci INFO: train: epoch 952 | step 30 | lr 0.000013 | loss 0.024589 | mae 0.118594 -[2024/06/24 06:55:43] ppsci INFO: train: epoch 952 | step 38 | lr 0.000013 | loss 0.026081 | mae 0.133674 -[2024/06/24 06:55:43] ppsci INFO: epoch: 952, train_loss: 0.027327, train_metric: 0.123448, eval_loss: 0.057690, eval_mae: 0.153304 -[2024/06/24 06:55:43] ppsci INFO: train: epoch 953 | step 0 | lr 0.000013 | loss 0.030183 | mae 0.128053 -[2024/06/24 06:55:43] ppsci INFO: train: epoch 953 | step 10 | lr 0.000013 | loss 0.026008 | mae 0.116671 -[2024/06/24 06:55:44] ppsci INFO: train: epoch 953 | step 20 | lr 0.000013 | loss 0.032210 | mae 0.135094 -[2024/06/24 06:55:44] ppsci INFO: train: epoch 953 | step 30 | lr 0.000013 | loss 0.034368 | mae 0.138262 -[2024/06/24 06:55:45] ppsci INFO: train: epoch 953 | step 38 | lr 0.000013 | loss 0.042866 | mae 0.172426 -[2024/06/24 06:55:45] ppsci INFO: epoch: 953, train_loss: 0.031458, train_metric: 0.129398, eval_loss: 0.057496, eval_mae: 0.153182 -[2024/06/24 06:55:45] ppsci INFO: train: epoch 954 | step 0 | lr 0.000013 | loss 0.031756 | mae 0.130458 -[2024/06/24 06:55:45] ppsci INFO: train: epoch 954 | step 10 | lr 0.000013 | loss 0.029952 | mae 0.124733 -[2024/06/24 06:55:46] ppsci INFO: train: epoch 954 | step 20 | lr 0.000013 | loss 0.037007 | mae 0.138638 -[2024/06/24 06:55:46] ppsci INFO: train: epoch 954 | step 30 | lr 0.000013 | loss 0.028545 | mae 0.122559 -[2024/06/24 06:55:47] ppsci INFO: train: epoch 954 | step 38 | lr 0.000013 | loss 0.010325 | mae 0.078885 -[2024/06/24 06:55:47] ppsci INFO: epoch: 954, train_loss: 0.027139, train_metric: 0.122563, eval_loss: 0.057871, eval_mae: 0.153571 -[2024/06/24 06:55:47] ppsci INFO: train: epoch 955 | step 0 | lr 0.000012 | loss 0.024069 | mae 0.114980 -[2024/06/24 06:55:48] ppsci INFO: train: epoch 955 | step 10 | lr 0.000012 | loss 0.030625 | mae 0.121690 -[2024/06/24 06:55:48] ppsci INFO: train: epoch 955 | step 20 | lr 0.000012 | loss 0.021876 | mae 0.117840 -[2024/06/24 06:55:49] ppsci INFO: train: epoch 955 | step 30 | lr 0.000012 | loss 0.028636 | mae 0.123096 -[2024/06/24 06:55:49] ppsci INFO: train: epoch 955 | step 38 | lr 0.000012 | loss 0.027511 | mae 0.111801 -[2024/06/24 06:55:49] ppsci INFO: epoch: 955, train_loss: 0.030031, train_metric: 0.126118, eval_loss: 0.058138, eval_mae: 0.153531 -[2024/06/24 06:55:49] ppsci INFO: train: epoch 956 | step 0 | lr 0.000012 | loss 0.022088 | mae 0.114100 -[2024/06/24 06:55:50] ppsci INFO: train: epoch 956 | step 10 | lr 0.000012 | loss 0.023961 | mae 0.123772 -[2024/06/24 06:55:50] ppsci INFO: train: epoch 956 | step 20 | lr 0.000012 | loss 0.025946 | mae 0.125633 -[2024/06/24 06:55:51] ppsci INFO: train: epoch 956 | step 30 | lr 0.000012 | loss 0.028044 | mae 0.124401 -[2024/06/24 06:55:51] ppsci INFO: train: epoch 956 | step 38 | lr 0.000012 | loss 0.049363 | mae 0.181574 -[2024/06/24 06:55:51] ppsci INFO: epoch: 956, train_loss: 0.029173, train_metric: 0.124796, eval_loss: 0.057919, eval_mae: 0.152970 -[2024/06/24 06:55:52] ppsci INFO: train: epoch 957 | step 0 | lr 0.000012 | loss 0.036595 | mae 0.128227 -[2024/06/24 06:55:52] ppsci INFO: train: epoch 957 | step 10 | lr 0.000012 | loss 0.035590 | mae 0.140857 -[2024/06/24 06:55:53] ppsci INFO: train: epoch 957 | step 20 | lr 0.000012 | loss 0.033770 | mae 0.136805 -[2024/06/24 06:55:53] ppsci INFO: train: epoch 957 | step 30 | lr 0.000012 | loss 0.026200 | mae 0.114842 -[2024/06/24 06:55:54] ppsci INFO: train: epoch 957 | step 38 | lr 0.000012 | loss 0.031750 | mae 0.136533 -[2024/06/24 06:55:54] ppsci INFO: epoch: 957, train_loss: 0.030080, train_metric: 0.125834, eval_loss: 0.057428, eval_mae: 0.152897 -[2024/06/24 06:55:54] ppsci INFO: train: epoch 958 | step 0 | lr 0.000012 | loss 0.025198 | mae 0.117835 -[2024/06/24 06:55:54] ppsci INFO: train: epoch 958 | step 10 | lr 0.000012 | loss 0.022887 | mae 0.115317 -[2024/06/24 06:55:55] ppsci INFO: train: epoch 958 | step 20 | lr 0.000012 | loss 0.030040 | mae 0.122032 -[2024/06/24 06:55:55] ppsci INFO: train: epoch 958 | step 30 | lr 0.000012 | loss 0.026926 | mae 0.118978 -[2024/06/24 06:55:56] ppsci INFO: train: epoch 958 | step 38 | lr 0.000012 | loss 0.043080 | mae 0.160693 -[2024/06/24 06:55:56] ppsci INFO: epoch: 958, train_loss: 0.029315, train_metric: 0.124414, eval_loss: 0.057248, eval_mae: 0.153200 -[2024/06/24 06:55:56] ppsci INFO: train: epoch 959 | step 0 | lr 0.000012 | loss 0.035951 | mae 0.130401 -[2024/06/24 06:55:56] ppsci INFO: train: epoch 959 | step 10 | lr 0.000012 | loss 0.031793 | mae 0.131477 -[2024/06/24 06:55:57] ppsci INFO: train: epoch 959 | step 20 | lr 0.000012 | loss 0.025301 | mae 0.115031 -[2024/06/24 06:55:57] ppsci INFO: train: epoch 959 | step 30 | lr 0.000012 | loss 0.019100 | mae 0.100677 -[2024/06/24 06:55:58] ppsci INFO: train: epoch 959 | step 38 | lr 0.000012 | loss 0.061759 | mae 0.189141 -[2024/06/24 06:55:58] ppsci INFO: epoch: 959, train_loss: 0.030128, train_metric: 0.126054, eval_loss: 0.057480, eval_mae: 0.153009 -[2024/06/24 06:55:58] ppsci INFO: train: epoch 960 | step 0 | lr 0.000012 | loss 0.031258 | mae 0.126749 -[2024/06/24 06:55:59] ppsci INFO: train: epoch 960 | step 10 | lr 0.000012 | loss 0.026196 | mae 0.117323 -[2024/06/24 06:55:59] ppsci INFO: train: epoch 960 | step 20 | lr 0.000012 | loss 0.023196 | mae 0.123072 -[2024/06/24 06:56:00] ppsci INFO: train: epoch 960 | step 30 | lr 0.000012 | loss 0.036567 | mae 0.139131 -[2024/06/24 06:56:00] ppsci INFO: train: epoch 960 | step 38 | lr 0.000012 | loss 0.015941 | mae 0.098672 -[2024/06/24 06:56:00] ppsci INFO: epoch: 960, train_loss: 0.029168, train_metric: 0.124756, eval_loss: 0.057753, eval_mae: 0.153382 -[2024/06/24 06:56:00] ppsci INFO: train: epoch 961 | step 0 | lr 0.000012 | loss 0.036488 | mae 0.142720 -[2024/06/24 06:56:01] ppsci INFO: train: epoch 961 | step 10 | lr 0.000012 | loss 0.036112 | mae 0.141391 -[2024/06/24 06:56:01] ppsci INFO: train: epoch 961 | step 20 | lr 0.000012 | loss 0.025178 | mae 0.122734 -[2024/06/24 06:56:02] ppsci INFO: train: epoch 961 | step 30 | lr 0.000012 | loss 0.028723 | mae 0.119594 -[2024/06/24 06:56:02] ppsci INFO: train: epoch 961 | step 38 | lr 0.000012 | loss 0.034316 | mae 0.140456 -[2024/06/24 06:56:02] ppsci INFO: epoch: 961, train_loss: 0.028796, train_metric: 0.124358, eval_loss: 0.057449, eval_mae: 0.153286 -[2024/06/24 06:56:02] ppsci INFO: train: epoch 962 | step 0 | lr 0.000012 | loss 0.021687 | mae 0.118180 -[2024/06/24 06:56:03] ppsci INFO: train: epoch 962 | step 10 | lr 0.000012 | loss 0.038092 | mae 0.135917 -[2024/06/24 06:56:03] ppsci INFO: train: epoch 962 | step 20 | lr 0.000012 | loss 0.026682 | mae 0.128314 -[2024/06/24 06:56:04] ppsci INFO: train: epoch 962 | step 30 | lr 0.000012 | loss 0.022972 | mae 0.117352 -[2024/06/24 06:56:04] ppsci INFO: train: epoch 962 | step 38 | lr 0.000012 | loss 0.043096 | mae 0.135177 -[2024/06/24 06:56:04] ppsci INFO: epoch: 962, train_loss: 0.029077, train_metric: 0.125368, eval_loss: 0.057375, eval_mae: 0.153099 -[2024/06/24 06:56:04] ppsci INFO: train: epoch 963 | step 0 | lr 0.000012 | loss 0.024308 | mae 0.114470 -[2024/06/24 06:56:05] ppsci INFO: train: epoch 963 | step 10 | lr 0.000012 | loss 0.032305 | mae 0.128594 -[2024/06/24 06:56:05] ppsci INFO: train: epoch 963 | step 20 | lr 0.000012 | loss 0.030962 | mae 0.134034 -[2024/06/24 06:56:06] ppsci INFO: train: epoch 963 | step 30 | lr 0.000012 | loss 0.025254 | mae 0.116863 -[2024/06/24 06:56:06] ppsci INFO: train: epoch 963 | step 38 | lr 0.000012 | loss 0.039500 | mae 0.147944 -[2024/06/24 06:56:06] ppsci INFO: epoch: 963, train_loss: 0.028001, train_metric: 0.122176, eval_loss: 0.057818, eval_mae: 0.153182 -[2024/06/24 06:56:06] ppsci INFO: train: epoch 964 | step 0 | lr 0.000012 | loss 0.027927 | mae 0.127644 -[2024/06/24 06:56:07] ppsci INFO: train: epoch 964 | step 10 | lr 0.000012 | loss 0.029487 | mae 0.119777 -[2024/06/24 06:56:07] ppsci INFO: train: epoch 964 | step 20 | lr 0.000012 | loss 0.041072 | mae 0.151138 -[2024/06/24 06:56:08] ppsci INFO: train: epoch 964 | step 30 | lr 0.000012 | loss 0.025196 | mae 0.121401 -[2024/06/24 06:56:08] ppsci INFO: train: epoch 964 | step 38 | lr 0.000012 | loss 0.034209 | mae 0.136822 -[2024/06/24 06:56:08] ppsci INFO: epoch: 964, train_loss: 0.029609, train_metric: 0.126562, eval_loss: 0.057597, eval_mae: 0.153275 -[2024/06/24 06:56:09] ppsci INFO: train: epoch 965 | step 0 | lr 0.000011 | loss 0.023191 | mae 0.120661 -[2024/06/24 06:56:09] ppsci INFO: train: epoch 965 | step 10 | lr 0.000011 | loss 0.020571 | mae 0.114748 -[2024/06/24 06:56:10] ppsci INFO: train: epoch 965 | step 20 | lr 0.000011 | loss 0.026610 | mae 0.122317 -[2024/06/24 06:56:10] ppsci INFO: train: epoch 965 | step 30 | lr 0.000011 | loss 0.026805 | mae 0.118161 -[2024/06/24 06:56:11] ppsci INFO: train: epoch 965 | step 38 | lr 0.000011 | loss 0.015863 | mae 0.099257 -[2024/06/24 06:56:11] ppsci INFO: epoch: 965, train_loss: 0.028900, train_metric: 0.124816, eval_loss: 0.057458, eval_mae: 0.152949 -[2024/06/24 06:56:11] ppsci INFO: train: epoch 966 | step 0 | lr 0.000011 | loss 0.021005 | mae 0.111865 -[2024/06/24 06:56:11] ppsci INFO: train: epoch 966 | step 10 | lr 0.000011 | loss 0.031393 | mae 0.133658 -[2024/06/24 06:56:12] ppsci INFO: train: epoch 966 | step 20 | lr 0.000011 | loss 0.037043 | mae 0.136382 -[2024/06/24 06:56:13] ppsci INFO: train: epoch 966 | step 30 | lr 0.000011 | loss 0.028267 | mae 0.125565 -[2024/06/24 06:56:13] ppsci INFO: train: epoch 966 | step 38 | lr 0.000011 | loss 0.030231 | mae 0.123751 -[2024/06/24 06:56:13] ppsci INFO: epoch: 966, train_loss: 0.029189, train_metric: 0.125129, eval_loss: 0.057750, eval_mae: 0.153210 -[2024/06/24 06:56:13] ppsci INFO: train: epoch 967 | step 0 | lr 0.000011 | loss 0.040651 | mae 0.146685 -[2024/06/24 06:56:14] ppsci INFO: train: epoch 967 | step 10 | lr 0.000011 | loss 0.028833 | mae 0.126667 -[2024/06/24 06:56:14] ppsci INFO: train: epoch 967 | step 20 | lr 0.000011 | loss 0.026021 | mae 0.124053 -[2024/06/24 06:56:15] ppsci INFO: train: epoch 967 | step 30 | lr 0.000011 | loss 0.030259 | mae 0.129090 -[2024/06/24 06:56:15] ppsci INFO: train: epoch 967 | step 38 | lr 0.000011 | loss 0.029994 | mae 0.134858 -[2024/06/24 06:56:15] ppsci INFO: epoch: 967, train_loss: 0.028716, train_metric: 0.125739, eval_loss: 0.057631, eval_mae: 0.153290 -[2024/06/24 06:56:15] ppsci INFO: train: epoch 968 | step 0 | lr 0.000011 | loss 0.030375 | mae 0.128469 -[2024/06/24 06:56:16] ppsci INFO: train: epoch 968 | step 10 | lr 0.000011 | loss 0.023296 | mae 0.109940 -[2024/06/24 06:56:16] ppsci INFO: train: epoch 968 | step 20 | lr 0.000011 | loss 0.029663 | mae 0.132849 -[2024/06/24 06:56:17] ppsci INFO: train: epoch 968 | step 30 | lr 0.000011 | loss 0.025680 | mae 0.120522 -[2024/06/24 06:56:17] ppsci INFO: train: epoch 968 | step 38 | lr 0.000011 | loss 0.040144 | mae 0.155018 -[2024/06/24 06:56:17] ppsci INFO: epoch: 968, train_loss: 0.027912, train_metric: 0.123210, eval_loss: 0.057795, eval_mae: 0.153645 -[2024/06/24 06:56:17] ppsci INFO: train: epoch 969 | step 0 | lr 0.000011 | loss 0.031685 | mae 0.129654 -[2024/06/24 06:56:18] ppsci INFO: train: epoch 969 | step 10 | lr 0.000011 | loss 0.021442 | mae 0.113178 -[2024/06/24 06:56:18] ppsci INFO: train: epoch 969 | step 20 | lr 0.000011 | loss 0.029078 | mae 0.127346 -[2024/06/24 06:56:19] ppsci INFO: train: epoch 969 | step 30 | lr 0.000011 | loss 0.027124 | mae 0.128793 -[2024/06/24 06:56:19] ppsci INFO: train: epoch 969 | step 38 | lr 0.000011 | loss 0.031794 | mae 0.131875 -[2024/06/24 06:56:20] ppsci INFO: epoch: 969, train_loss: 0.028036, train_metric: 0.122378, eval_loss: 0.057684, eval_mae: 0.153282 -[2024/06/24 06:56:20] ppsci INFO: train: epoch 970 | step 0 | lr 0.000011 | loss 0.025900 | mae 0.118269 -[2024/06/24 06:56:20] ppsci INFO: train: epoch 970 | step 10 | lr 0.000011 | loss 0.030220 | mae 0.132661 -[2024/06/24 06:56:21] ppsci INFO: train: epoch 970 | step 20 | lr 0.000011 | loss 0.028931 | mae 0.123293 -[2024/06/24 06:56:21] ppsci INFO: train: epoch 970 | step 30 | lr 0.000011 | loss 0.022185 | mae 0.117464 -[2024/06/24 06:56:21] ppsci INFO: train: epoch 970 | step 38 | lr 0.000011 | loss 0.043289 | mae 0.158845 -[2024/06/24 06:56:22] ppsci INFO: epoch: 970, train_loss: 0.028692, train_metric: 0.123562, eval_loss: 0.057723, eval_mae: 0.153313 -[2024/06/24 06:56:22] ppsci INFO: train: epoch 971 | step 0 | lr 0.000011 | loss 0.021289 | mae 0.116798 -[2024/06/24 06:56:22] ppsci INFO: train: epoch 971 | step 10 | lr 0.000011 | loss 0.021707 | mae 0.110410 -[2024/06/24 06:56:23] ppsci INFO: train: epoch 971 | step 20 | lr 0.000011 | loss 0.034646 | mae 0.124549 -[2024/06/24 06:56:23] ppsci INFO: train: epoch 971 | step 30 | lr 0.000011 | loss 0.030307 | mae 0.126524 -[2024/06/24 06:56:24] ppsci INFO: train: epoch 971 | step 38 | lr 0.000011 | loss 0.004734 | mae 0.062986 -[2024/06/24 06:56:24] ppsci INFO: epoch: 971, train_loss: 0.028013, train_metric: 0.123818, eval_loss: 0.057103, eval_mae: 0.153081 -[2024/06/24 06:56:24] ppsci INFO: train: epoch 972 | step 0 | lr 0.000011 | loss 0.027134 | mae 0.121029 -[2024/06/24 06:56:24] ppsci INFO: train: epoch 972 | step 10 | lr 0.000011 | loss 0.029249 | mae 0.118237 -[2024/06/24 06:56:25] ppsci INFO: train: epoch 972 | step 20 | lr 0.000011 | loss 0.023043 | mae 0.115823 -[2024/06/24 06:56:25] ppsci INFO: train: epoch 972 | step 30 | lr 0.000011 | loss 0.024981 | mae 0.123795 -[2024/06/24 06:56:26] ppsci INFO: train: epoch 972 | step 38 | lr 0.000011 | loss 0.019790 | mae 0.105141 -[2024/06/24 06:56:26] ppsci INFO: epoch: 972, train_loss: 0.029092, train_metric: 0.125304, eval_loss: 0.057265, eval_mae: 0.152827 -[2024/06/24 06:56:26] ppsci INFO: train: epoch 973 | step 0 | lr 0.000011 | loss 0.028766 | mae 0.128689 -[2024/06/24 06:56:26] ppsci INFO: train: epoch 973 | step 10 | lr 0.000011 | loss 0.028378 | mae 0.134051 -[2024/06/24 06:56:27] ppsci INFO: train: epoch 973 | step 20 | lr 0.000011 | loss 0.047094 | mae 0.126717 -[2024/06/24 06:56:27] ppsci INFO: train: epoch 973 | step 30 | lr 0.000011 | loss 0.032065 | mae 0.123131 -[2024/06/24 06:56:28] ppsci INFO: train: epoch 973 | step 38 | lr 0.000011 | loss 0.027015 | mae 0.138708 -[2024/06/24 06:56:28] ppsci INFO: epoch: 973, train_loss: 0.028962, train_metric: 0.124229, eval_loss: 0.057292, eval_mae: 0.152829 -[2024/06/24 06:56:28] ppsci INFO: train: epoch 974 | step 0 | lr 0.000011 | loss 0.023948 | mae 0.113959 -[2024/06/24 06:56:28] ppsci INFO: train: epoch 974 | step 10 | lr 0.000011 | loss 0.040267 | mae 0.135342 -[2024/06/24 06:56:29] ppsci INFO: train: epoch 974 | step 20 | lr 0.000011 | loss 0.028221 | mae 0.126306 -[2024/06/24 06:56:29] ppsci INFO: train: epoch 974 | step 30 | lr 0.000011 | loss 0.031729 | mae 0.134984 -[2024/06/24 06:56:30] ppsci INFO: train: epoch 974 | step 38 | lr 0.000011 | loss 0.037410 | mae 0.151791 -[2024/06/24 06:56:30] ppsci INFO: epoch: 974, train_loss: 0.028829, train_metric: 0.124994, eval_loss: 0.057328, eval_mae: 0.152964 -[2024/06/24 06:56:30] ppsci INFO: train: epoch 975 | step 0 | lr 0.000011 | loss 0.029866 | mae 0.135033 -[2024/06/24 06:56:31] ppsci INFO: train: epoch 975 | step 10 | lr 0.000011 | loss 0.037528 | mae 0.125498 -[2024/06/24 06:56:31] ppsci INFO: train: epoch 975 | step 20 | lr 0.000011 | loss 0.029908 | mae 0.127961 -[2024/06/24 06:56:32] ppsci INFO: train: epoch 975 | step 30 | lr 0.000011 | loss 0.032986 | mae 0.124618 -[2024/06/24 06:56:32] ppsci INFO: train: epoch 975 | step 38 | lr 0.000011 | loss 0.062303 | mae 0.185414 -[2024/06/24 06:56:32] ppsci INFO: epoch: 975, train_loss: 0.029973, train_metric: 0.125741, eval_loss: 0.056752, eval_mae: 0.152549 -[2024/06/24 06:56:32] ppsci INFO: train: epoch 976 | step 0 | lr 0.000011 | loss 0.025453 | mae 0.117942 -[2024/06/24 06:56:33] ppsci INFO: train: epoch 976 | step 10 | lr 0.000011 | loss 0.025853 | mae 0.121328 -[2024/06/24 06:56:33] ppsci INFO: train: epoch 976 | step 20 | lr 0.000011 | loss 0.031118 | mae 0.134811 -[2024/06/24 06:56:34] ppsci INFO: train: epoch 976 | step 30 | lr 0.000011 | loss 0.021869 | mae 0.111365 -[2024/06/24 06:56:34] ppsci INFO: train: epoch 976 | step 38 | lr 0.000011 | loss 0.026046 | mae 0.129048 -[2024/06/24 06:56:34] ppsci INFO: epoch: 976, train_loss: 0.028313, train_metric: 0.124216, eval_loss: 0.057013, eval_mae: 0.153061 -[2024/06/24 06:56:35] ppsci INFO: train: epoch 977 | step 0 | lr 0.000011 | loss 0.032354 | mae 0.131316 -[2024/06/24 06:56:35] ppsci INFO: train: epoch 977 | step 10 | lr 0.000011 | loss 0.022667 | mae 0.107912 -[2024/06/24 06:56:36] ppsci INFO: train: epoch 977 | step 20 | lr 0.000011 | loss 0.029395 | mae 0.124119 -[2024/06/24 06:56:36] ppsci INFO: train: epoch 977 | step 30 | lr 0.000011 | loss 0.023153 | mae 0.112304 -[2024/06/24 06:56:36] ppsci INFO: train: epoch 977 | step 38 | lr 0.000011 | loss 0.024023 | mae 0.128499 -[2024/06/24 06:56:37] ppsci INFO: epoch: 977, train_loss: 0.028886, train_metric: 0.123491, eval_loss: 0.056406, eval_mae: 0.152118 -[2024/06/24 06:56:37] ppsci INFO: train: epoch 978 | step 0 | lr 0.000011 | loss 0.037841 | mae 0.141574 -[2024/06/24 06:56:37] ppsci INFO: train: epoch 978 | step 10 | lr 0.000011 | loss 0.027952 | mae 0.122826 -[2024/06/24 06:56:38] ppsci INFO: train: epoch 978 | step 20 | lr 0.000011 | loss 0.024923 | mae 0.115608 -[2024/06/24 06:56:38] ppsci INFO: train: epoch 978 | step 30 | lr 0.000011 | loss 0.021838 | mae 0.115143 -[2024/06/24 06:56:38] ppsci INFO: train: epoch 978 | step 38 | lr 0.000011 | loss 0.019822 | mae 0.115565 -[2024/06/24 06:56:39] ppsci INFO: epoch: 978, train_loss: 0.028221, train_metric: 0.124241, eval_loss: 0.055987, eval_mae: 0.152247 -[2024/06/24 06:56:39] ppsci INFO: train: epoch 979 | step 0 | lr 0.000011 | loss 0.036612 | mae 0.132803 -[2024/06/24 06:56:39] ppsci INFO: train: epoch 979 | step 10 | lr 0.000011 | loss 0.025045 | mae 0.119589 -[2024/06/24 06:56:40] ppsci INFO: train: epoch 979 | step 20 | lr 0.000011 | loss 0.021281 | mae 0.115770 -[2024/06/24 06:56:40] ppsci INFO: train: epoch 979 | step 30 | lr 0.000011 | loss 0.028648 | mae 0.126922 -[2024/06/24 06:56:41] ppsci INFO: train: epoch 979 | step 38 | lr 0.000011 | loss 0.011812 | mae 0.098031 -[2024/06/24 06:56:41] ppsci INFO: epoch: 979, train_loss: 0.028649, train_metric: 0.125441, eval_loss: 0.056330, eval_mae: 0.152491 -[2024/06/24 06:56:41] ppsci INFO: train: epoch 980 | step 0 | lr 0.000010 | loss 0.032707 | mae 0.130735 -[2024/06/24 06:56:41] ppsci INFO: train: epoch 980 | step 10 | lr 0.000010 | loss 0.023793 | mae 0.111765 -[2024/06/24 06:56:42] ppsci INFO: train: epoch 980 | step 20 | lr 0.000010 | loss 0.027117 | mae 0.122159 -[2024/06/24 06:56:42] ppsci INFO: train: epoch 980 | step 30 | lr 0.000010 | loss 0.027717 | mae 0.124238 -[2024/06/24 06:56:43] ppsci INFO: train: epoch 980 | step 38 | lr 0.000010 | loss 0.018350 | mae 0.113782 -[2024/06/24 06:56:43] ppsci INFO: epoch: 980, train_loss: 0.029961, train_metric: 0.128122, eval_loss: 0.056022, eval_mae: 0.152398 -[2024/06/24 06:56:43] ppsci INFO: train: epoch 981 | step 0 | lr 0.000010 | loss 0.038698 | mae 0.135831 -[2024/06/24 06:56:43] ppsci INFO: train: epoch 981 | step 10 | lr 0.000010 | loss 0.029657 | mae 0.130356 -[2024/06/24 06:56:44] ppsci INFO: train: epoch 981 | step 20 | lr 0.000010 | loss 0.023624 | mae 0.109503 -[2024/06/24 06:56:44] ppsci INFO: train: epoch 981 | step 30 | lr 0.000010 | loss 0.028863 | mae 0.122823 -[2024/06/24 06:56:45] ppsci INFO: train: epoch 981 | step 38 | lr 0.000010 | loss 0.025228 | mae 0.128138 -[2024/06/24 06:56:45] ppsci INFO: epoch: 981, train_loss: 0.028639, train_metric: 0.124241, eval_loss: 0.056239, eval_mae: 0.152619 -[2024/06/24 06:56:45] ppsci INFO: train: epoch 982 | step 0 | lr 0.000010 | loss 0.034441 | mae 0.134362 -[2024/06/24 06:56:46] ppsci INFO: train: epoch 982 | step 10 | lr 0.000010 | loss 0.042085 | mae 0.146952 -[2024/06/24 06:56:46] ppsci INFO: train: epoch 982 | step 20 | lr 0.000010 | loss 0.033337 | mae 0.137215 -[2024/06/24 06:56:47] ppsci INFO: train: epoch 982 | step 30 | lr 0.000010 | loss 0.020260 | mae 0.109222 -[2024/06/24 06:56:47] ppsci INFO: train: epoch 982 | step 38 | lr 0.000010 | loss 0.031274 | mae 0.135024 -[2024/06/24 06:56:47] ppsci INFO: epoch: 982, train_loss: 0.028755, train_metric: 0.125066, eval_loss: 0.056335, eval_mae: 0.152704 -[2024/06/24 06:56:47] ppsci INFO: train: epoch 983 | step 0 | lr 0.000010 | loss 0.023221 | mae 0.109695 -[2024/06/24 06:56:48] ppsci INFO: train: epoch 983 | step 10 | lr 0.000010 | loss 0.026360 | mae 0.125474 -[2024/06/24 06:56:48] ppsci INFO: train: epoch 983 | step 20 | lr 0.000010 | loss 0.036630 | mae 0.144639 -[2024/06/24 06:56:49] ppsci INFO: train: epoch 983 | step 30 | lr 0.000010 | loss 0.035177 | mae 0.120387 -[2024/06/24 06:56:49] ppsci INFO: train: epoch 983 | step 38 | lr 0.000010 | loss 0.015171 | mae 0.103204 -[2024/06/24 06:56:49] ppsci INFO: epoch: 983, train_loss: 0.027136, train_metric: 0.122438, eval_loss: 0.056427, eval_mae: 0.153179 -[2024/06/24 06:56:49] ppsci INFO: train: epoch 984 | step 0 | lr 0.000010 | loss 0.024586 | mae 0.114322 -[2024/06/24 06:56:50] ppsci INFO: train: epoch 984 | step 10 | lr 0.000010 | loss 0.026623 | mae 0.117835 -[2024/06/24 06:56:50] ppsci INFO: train: epoch 984 | step 20 | lr 0.000010 | loss 0.032213 | mae 0.135300 -[2024/06/24 06:56:51] ppsci INFO: train: epoch 984 | step 30 | lr 0.000010 | loss 0.034674 | mae 0.122070 -[2024/06/24 06:56:51] ppsci INFO: train: epoch 984 | step 38 | lr 0.000010 | loss 0.023768 | mae 0.132121 -[2024/06/24 06:56:51] ppsci INFO: epoch: 984, train_loss: 0.027392, train_metric: 0.123166, eval_loss: 0.056464, eval_mae: 0.153445 -[2024/06/24 06:56:52] ppsci INFO: train: epoch 985 | step 0 | lr 0.000010 | loss 0.025544 | mae 0.115313 -[2024/06/24 06:56:52] ppsci INFO: train: epoch 985 | step 10 | lr 0.000010 | loss 0.019148 | mae 0.108591 -[2024/06/24 06:56:53] ppsci INFO: train: epoch 985 | step 20 | lr 0.000010 | loss 0.026394 | mae 0.119621 -[2024/06/24 06:56:53] ppsci INFO: train: epoch 985 | step 30 | lr 0.000010 | loss 0.029825 | mae 0.123479 -[2024/06/24 06:56:54] ppsci INFO: train: epoch 985 | step 38 | lr 0.000010 | loss 0.013125 | mae 0.095079 -[2024/06/24 06:56:54] ppsci INFO: epoch: 985, train_loss: 0.029301, train_metric: 0.126707, eval_loss: 0.056619, eval_mae: 0.153180 -[2024/06/24 06:56:54] ppsci INFO: train: epoch 986 | step 0 | lr 0.000010 | loss 0.018796 | mae 0.109916 -[2024/06/24 06:56:54] ppsci INFO: train: epoch 986 | step 10 | lr 0.000010 | loss 0.028694 | mae 0.128427 -[2024/06/24 06:56:55] ppsci INFO: train: epoch 986 | step 20 | lr 0.000010 | loss 0.037728 | mae 0.134687 -[2024/06/24 06:56:55] ppsci INFO: train: epoch 986 | step 30 | lr 0.000010 | loss 0.024487 | mae 0.116669 -[2024/06/24 06:56:56] ppsci INFO: train: epoch 986 | step 38 | lr 0.000010 | loss 0.029822 | mae 0.125181 -[2024/06/24 06:56:56] ppsci INFO: epoch: 986, train_loss: 0.028598, train_metric: 0.125248, eval_loss: 0.056386, eval_mae: 0.152853 -[2024/06/24 06:56:56] ppsci INFO: train: epoch 987 | step 0 | lr 0.000010 | loss 0.025128 | mae 0.113958 -[2024/06/24 06:56:57] ppsci INFO: train: epoch 987 | step 10 | lr 0.000010 | loss 0.023598 | mae 0.122250 -[2024/06/24 06:56:57] ppsci INFO: train: epoch 987 | step 20 | lr 0.000010 | loss 0.029165 | mae 0.121936 -[2024/06/24 06:56:58] ppsci INFO: train: epoch 987 | step 30 | lr 0.000010 | loss 0.028252 | mae 0.133669 -[2024/06/24 06:56:58] ppsci INFO: train: epoch 987 | step 38 | lr 0.000010 | loss 0.021837 | mae 0.111281 -[2024/06/24 06:56:58] ppsci INFO: epoch: 987, train_loss: 0.028988, train_metric: 0.125447, eval_loss: 0.056753, eval_mae: 0.153534 -[2024/06/24 06:56:58] ppsci INFO: train: epoch 988 | step 0 | lr 0.000010 | loss 0.031951 | mae 0.135937 -[2024/06/24 06:56:59] ppsci INFO: train: epoch 988 | step 10 | lr 0.000010 | loss 0.023063 | mae 0.099816 -[2024/06/24 06:56:59] ppsci INFO: train: epoch 988 | step 20 | lr 0.000010 | loss 0.030588 | mae 0.117658 -[2024/06/24 06:57:00] ppsci INFO: train: epoch 988 | step 30 | lr 0.000010 | loss 0.030425 | mae 0.126295 -[2024/06/24 06:57:00] ppsci INFO: train: epoch 988 | step 38 | lr 0.000010 | loss 0.026349 | mae 0.108479 -[2024/06/24 06:57:00] ppsci INFO: epoch: 988, train_loss: 0.028681, train_metric: 0.123359, eval_loss: 0.056603, eval_mae: 0.153548 -[2024/06/24 06:57:00] ppsci INFO: train: epoch 989 | step 0 | lr 0.000010 | loss 0.031619 | mae 0.125944 -[2024/06/24 06:57:01] ppsci INFO: train: epoch 989 | step 10 | lr 0.000010 | loss 0.023444 | mae 0.117024 -[2024/06/24 06:57:01] ppsci INFO: train: epoch 989 | step 20 | lr 0.000010 | loss 0.033457 | mae 0.122992 -[2024/06/24 06:57:02] ppsci INFO: train: epoch 989 | step 30 | lr 0.000010 | loss 0.021067 | mae 0.115246 -[2024/06/24 06:57:02] ppsci INFO: train: epoch 989 | step 38 | lr 0.000010 | loss 0.046429 | mae 0.169513 -[2024/06/24 06:57:02] ppsci INFO: epoch: 989, train_loss: 0.029117, train_metric: 0.124254, eval_loss: 0.056363, eval_mae: 0.152991 -[2024/06/24 06:57:02] ppsci INFO: train: epoch 990 | step 0 | lr 0.000010 | loss 0.031072 | mae 0.118688 -[2024/06/24 06:57:03] ppsci INFO: train: epoch 990 | step 10 | lr 0.000010 | loss 0.018319 | mae 0.105291 -[2024/06/24 06:57:04] ppsci INFO: train: epoch 990 | step 20 | lr 0.000010 | loss 0.027364 | mae 0.125359 -[2024/06/24 06:57:04] ppsci INFO: train: epoch 990 | step 30 | lr 0.000010 | loss 0.021142 | mae 0.112799 -[2024/06/24 06:57:04] ppsci INFO: train: epoch 990 | step 38 | lr 0.000010 | loss 0.011825 | mae 0.087815 -[2024/06/24 06:57:05] ppsci INFO: epoch: 990, train_loss: 0.028204, train_metric: 0.125600, eval_loss: 0.056450, eval_mae: 0.152815 -[2024/06/24 06:57:05] ppsci INFO: train: epoch 991 | step 0 | lr 0.000010 | loss 0.026034 | mae 0.118849 -[2024/06/24 06:57:05] ppsci INFO: train: epoch 991 | step 10 | lr 0.000010 | loss 0.031617 | mae 0.127524 -[2024/06/24 06:57:06] ppsci INFO: train: epoch 991 | step 20 | lr 0.000010 | loss 0.026233 | mae 0.127168 -[2024/06/24 06:57:06] ppsci INFO: train: epoch 991 | step 30 | lr 0.000010 | loss 0.034588 | mae 0.135401 -[2024/06/24 06:57:07] ppsci INFO: train: epoch 991 | step 38 | lr 0.000010 | loss 0.067085 | mae 0.198892 -[2024/06/24 06:57:07] ppsci INFO: epoch: 991, train_loss: 0.029219, train_metric: 0.123064, eval_loss: 0.056613, eval_mae: 0.153235 -[2024/06/24 06:57:07] ppsci INFO: train: epoch 992 | step 0 | lr 0.000010 | loss 0.029657 | mae 0.127484 -[2024/06/24 06:57:07] ppsci INFO: train: epoch 992 | step 10 | lr 0.000010 | loss 0.046132 | mae 0.145225 -[2024/06/24 06:57:08] ppsci INFO: train: epoch 992 | step 20 | lr 0.000010 | loss 0.024492 | mae 0.124617 -[2024/06/24 06:57:08] ppsci INFO: train: epoch 992 | step 30 | lr 0.000010 | loss 0.029349 | mae 0.129988 -[2024/06/24 06:57:09] ppsci INFO: train: epoch 992 | step 38 | lr 0.000010 | loss 0.025946 | mae 0.124890 -[2024/06/24 06:57:09] ppsci INFO: epoch: 992, train_loss: 0.029262, train_metric: 0.126782, eval_loss: 0.056710, eval_mae: 0.152791 -[2024/06/24 06:57:09] ppsci INFO: train: epoch 993 | step 0 | lr 0.000010 | loss 0.027724 | mae 0.120244 -[2024/06/24 06:57:09] ppsci INFO: train: epoch 993 | step 10 | lr 0.000010 | loss 0.035477 | mae 0.138845 -[2024/06/24 06:57:10] ppsci INFO: train: epoch 993 | step 20 | lr 0.000010 | loss 0.027116 | mae 0.120010 -[2024/06/24 06:57:11] ppsci INFO: train: epoch 993 | step 30 | lr 0.000010 | loss 0.028029 | mae 0.120034 -[2024/06/24 06:57:11] ppsci INFO: train: epoch 993 | step 38 | lr 0.000010 | loss 0.044482 | mae 0.158497 -[2024/06/24 06:57:11] ppsci INFO: epoch: 993, train_loss: 0.029483, train_metric: 0.124334, eval_loss: 0.056344, eval_mae: 0.152394 -[2024/06/24 06:57:11] ppsci INFO: train: epoch 994 | step 0 | lr 0.000010 | loss 0.042740 | mae 0.136383 -[2024/06/24 06:57:12] ppsci INFO: train: epoch 994 | step 10 | lr 0.000010 | loss 0.024125 | mae 0.125766 -[2024/06/24 06:57:12] ppsci INFO: train: epoch 994 | step 20 | lr 0.000010 | loss 0.041002 | mae 0.117257 -[2024/06/24 06:57:13] ppsci INFO: train: epoch 994 | step 30 | lr 0.000010 | loss 0.033564 | mae 0.134382 -[2024/06/24 06:57:13] ppsci INFO: train: epoch 994 | step 38 | lr 0.000010 | loss 0.020387 | mae 0.106676 -[2024/06/24 06:57:13] ppsci INFO: epoch: 994, train_loss: 0.029161, train_metric: 0.125685, eval_loss: 0.055866, eval_mae: 0.152593 -[2024/06/24 06:57:13] ppsci INFO: train: epoch 995 | step 0 | lr 0.000010 | loss 0.032547 | mae 0.134295 -[2024/06/24 06:57:14] ppsci INFO: train: epoch 995 | step 10 | lr 0.000010 | loss 0.026794 | mae 0.118035 -[2024/06/24 06:57:15] ppsci INFO: train: epoch 995 | step 20 | lr 0.000010 | loss 0.026435 | mae 0.113713 -[2024/06/24 06:57:15] ppsci INFO: train: epoch 995 | step 30 | lr 0.000010 | loss 0.025240 | mae 0.122221 -[2024/06/24 06:57:15] ppsci INFO: train: epoch 995 | step 38 | lr 0.000010 | loss 0.011029 | mae 0.083643 -[2024/06/24 06:57:16] ppsci INFO: epoch: 995, train_loss: 0.027207, train_metric: 0.124311, eval_loss: 0.056506, eval_mae: 0.152897 -[2024/06/24 06:57:16] ppsci INFO: train: epoch 996 | step 0 | lr 0.000010 | loss 0.032805 | mae 0.133582 -[2024/06/24 06:57:16] ppsci INFO: train: epoch 996 | step 10 | lr 0.000010 | loss 0.021259 | mae 0.111530 -[2024/06/24 06:57:17] ppsci INFO: train: epoch 996 | step 20 | lr 0.000010 | loss 0.022297 | mae 0.106615 -[2024/06/24 06:57:17] ppsci INFO: train: epoch 996 | step 30 | lr 0.000010 | loss 0.018783 | mae 0.105491 -[2024/06/24 06:57:18] ppsci INFO: train: epoch 996 | step 38 | lr 0.000010 | loss 0.014237 | mae 0.099468 -[2024/06/24 06:57:18] ppsci INFO: epoch: 996, train_loss: 0.028464, train_metric: 0.124962, eval_loss: 0.056852, eval_mae: 0.153371 -[2024/06/24 06:57:18] ppsci INFO: train: epoch 997 | step 0 | lr 0.000010 | loss 0.024222 | mae 0.118299 -[2024/06/24 06:57:18] ppsci INFO: train: epoch 997 | step 10 | lr 0.000010 | loss 0.040751 | mae 0.144771 -[2024/06/24 06:57:19] ppsci INFO: train: epoch 997 | step 20 | lr 0.000010 | loss 0.026399 | mae 0.113585 -[2024/06/24 06:57:19] ppsci INFO: train: epoch 997 | step 30 | lr 0.000010 | loss 0.026135 | mae 0.118986 -[2024/06/24 06:57:20] ppsci INFO: train: epoch 997 | step 38 | lr 0.000010 | loss 0.005928 | mae 0.064139 -[2024/06/24 06:57:20] ppsci INFO: epoch: 997, train_loss: 0.027487, train_metric: 0.124497, eval_loss: 0.056389, eval_mae: 0.152635 -[2024/06/24 06:57:20] ppsci INFO: train: epoch 998 | step 0 | lr 0.000010 | loss 0.025321 | mae 0.113073 -[2024/06/24 06:57:20] ppsci INFO: train: epoch 998 | step 10 | lr 0.000010 | loss 0.034421 | mae 0.131906 -[2024/06/24 06:57:21] ppsci INFO: train: epoch 998 | step 20 | lr 0.000010 | loss 0.030076 | mae 0.125641 -[2024/06/24 06:57:21] ppsci INFO: train: epoch 998 | step 30 | lr 0.000010 | loss 0.029172 | mae 0.133613 -[2024/06/24 06:57:22] ppsci INFO: train: epoch 998 | step 38 | lr 0.000010 | loss 0.024502 | mae 0.127662 -[2024/06/24 06:57:22] ppsci INFO: epoch: 998, train_loss: 0.028949, train_metric: 0.126209, eval_loss: 0.056448, eval_mae: 0.152922 -[2024/06/24 06:57:22] ppsci INFO: train: epoch 999 | step 0 | lr 0.000010 | loss 0.033586 | mae 0.134859 -[2024/06/24 06:57:23] ppsci INFO: train: epoch 999 | step 10 | lr 0.000010 | loss 0.039554 | mae 0.139567 -[2024/06/24 06:57:23] ppsci INFO: train: epoch 999 | step 20 | lr 0.000010 | loss 0.025755 | mae 0.119161 -[2024/06/24 06:57:24] ppsci INFO: train: epoch 999 | step 30 | lr 0.000010 | loss 0.022218 | mae 0.116910 -[2024/06/24 06:57:24] ppsci INFO: train: epoch 999 | step 38 | lr 0.000010 | loss 0.014004 | mae 0.094654 -[2024/06/24 06:57:24] ppsci INFO: epoch: 999, train_loss: 0.029247, train_metric: 0.125977, eval_loss: 0.056721, eval_mae: 0.153675 -[2024/06/24 06:57:24] ppsci INFO: train: epoch 1000 | step 0 | lr 0.000010 | loss 0.027658 | mae 0.124052 -[2024/06/24 06:57:25] ppsci INFO: train: epoch 1000 | step 10 | lr 0.000010 | loss 0.029719 | mae 0.129270 -[2024/06/24 06:57:25] ppsci INFO: train: epoch 1000 | step 20 | lr 0.000010 | loss 0.022861 | mae 0.116275 -[2024/06/24 06:57:26] ppsci INFO: train: epoch 1000 | step 30 | lr 0.000010 | loss 0.031077 | mae 0.130812 -[2024/06/24 06:57:26] ppsci INFO: train: epoch 1000 | step 38 | lr 0.000010 | loss 0.042454 | mae 0.161889 -[2024/06/24 06:57:26] ppsci INFO: epoch: 1000, train_loss: 0.030008, train_metric: 0.127369, eval_loss: 0.056139, eval_mae: 0.152882 -[2024/06/24 06:57:27] ppsci INFO: train: epoch 1001 | step 0 | lr 0.000010 | loss 0.039522 | mae 0.138999 -[2024/06/24 06:57:27] ppsci INFO: train: epoch 1001 | step 10 | lr 0.000010 | loss 0.023109 | mae 0.116763 -[2024/06/24 06:57:28] ppsci INFO: train: epoch 1001 | step 20 | lr 0.000010 | loss 0.021411 | mae 0.107722 -[2024/06/24 06:57:28] ppsci INFO: train: epoch 1001 | step 30 | lr 0.000010 | loss 0.029289 | mae 0.131544 -[2024/06/24 06:57:29] ppsci INFO: train: epoch 1001 | step 38 | lr 0.000010 | loss 0.043121 | mae 0.156453 -[2024/06/24 06:57:29] ppsci INFO: epoch: 1001, train_loss: 0.029970, train_metric: 0.125977, eval_loss: 0.055540, eval_mae: 0.152336 -[2024/06/24 06:57:29] ppsci INFO: train: epoch 1002 | step 0 | lr 0.000010 | loss 0.046070 | mae 0.139510 -[2024/06/24 06:57:29] ppsci INFO: train: epoch 1002 | step 10 | lr 0.000010 | loss 0.033284 | mae 0.140712 -[2024/06/24 06:57:30] ppsci INFO: train: epoch 1002 | step 20 | lr 0.000010 | loss 0.026870 | mae 0.120926 -[2024/06/24 06:57:30] ppsci INFO: train: epoch 1002 | step 30 | lr 0.000010 | loss 0.024562 | mae 0.110163 -[2024/06/24 06:57:31] ppsci INFO: train: epoch 1002 | step 38 | lr 0.000010 | loss 0.011315 | mae 0.082571 -[2024/06/24 06:57:31] ppsci INFO: epoch: 1002, train_loss: 0.028073, train_metric: 0.123338, eval_loss: 0.055942, eval_mae: 0.152354 -[2024/06/24 06:57:31] ppsci INFO: train: epoch 1003 | step 0 | lr 0.000010 | loss 0.026227 | mae 0.125324 -[2024/06/24 06:57:31] ppsci INFO: train: epoch 1003 | step 10 | lr 0.000010 | loss 0.033567 | mae 0.134809 -[2024/06/24 06:57:32] ppsci INFO: train: epoch 1003 | step 20 | lr 0.000010 | loss 0.018522 | mae 0.106227 -[2024/06/24 06:57:33] ppsci INFO: train: epoch 1003 | step 30 | lr 0.000010 | loss 0.024513 | mae 0.119976 -[2024/06/24 06:57:33] ppsci INFO: train: epoch 1003 | step 38 | lr 0.000010 | loss 0.012506 | mae 0.098621 -[2024/06/24 06:57:33] ppsci INFO: epoch: 1003, train_loss: 0.026596, train_metric: 0.120988, eval_loss: 0.056443, eval_mae: 0.152662 -[2024/06/24 06:57:33] ppsci INFO: train: epoch 1004 | step 0 | lr 0.000010 | loss 0.023586 | mae 0.112304 -[2024/06/24 06:57:34] ppsci INFO: train: epoch 1004 | step 10 | lr 0.000010 | loss 0.022765 | mae 0.107192 -[2024/06/24 06:57:34] ppsci INFO: train: epoch 1004 | step 20 | lr 0.000010 | loss 0.031026 | mae 0.131370 -[2024/06/24 06:57:35] ppsci INFO: train: epoch 1004 | step 30 | lr 0.000010 | loss 0.030432 | mae 0.130956 -[2024/06/24 06:57:35] ppsci INFO: train: epoch 1004 | step 38 | lr 0.000010 | loss 0.014180 | mae 0.087870 -[2024/06/24 06:57:35] ppsci INFO: epoch: 1004, train_loss: 0.026311, train_metric: 0.120671, eval_loss: 0.056287, eval_mae: 0.152972 -[2024/06/24 06:57:35] ppsci INFO: train: epoch 1005 | step 0 | lr 0.000010 | loss 0.024056 | mae 0.118497 -[2024/06/24 06:57:36] ppsci INFO: train: epoch 1005 | step 10 | lr 0.000010 | loss 0.022895 | mae 0.116159 -[2024/06/24 06:57:36] ppsci INFO: train: epoch 1005 | step 20 | lr 0.000010 | loss 0.035309 | mae 0.135387 -[2024/06/24 06:57:37] ppsci INFO: train: epoch 1005 | step 30 | lr 0.000010 | loss 0.033088 | mae 0.133456 -[2024/06/24 06:57:37] ppsci INFO: train: epoch 1005 | step 38 | lr 0.000010 | loss 0.042820 | mae 0.147516 -[2024/06/24 06:57:37] ppsci INFO: epoch: 1005, train_loss: 0.027496, train_metric: 0.122103, eval_loss: 0.056907, eval_mae: 0.153387 -[2024/06/24 06:57:37] ppsci INFO: train: epoch 1006 | step 0 | lr 0.000010 | loss 0.025818 | mae 0.118521 -[2024/06/24 06:57:38] ppsci INFO: train: epoch 1006 | step 10 | lr 0.000010 | loss 0.032543 | mae 0.125773 -[2024/06/24 06:57:38] ppsci INFO: train: epoch 1006 | step 20 | lr 0.000010 | loss 0.033488 | mae 0.132540 -[2024/06/24 06:57:39] ppsci INFO: train: epoch 1006 | step 30 | lr 0.000010 | loss 0.026135 | mae 0.117443 -[2024/06/24 06:57:39] ppsci INFO: train: epoch 1006 | step 38 | lr 0.000010 | loss 0.033409 | mae 0.126052 -[2024/06/24 06:57:40] ppsci INFO: epoch: 1006, train_loss: 0.028457, train_metric: 0.125250, eval_loss: 0.056625, eval_mae: 0.153229 -[2024/06/24 06:57:40] ppsci INFO: train: epoch 1007 | step 0 | lr 0.000010 | loss 0.033751 | mae 0.133167 -[2024/06/24 06:57:40] ppsci INFO: train: epoch 1007 | step 10 | lr 0.000010 | loss 0.028517 | mae 0.113055 -[2024/06/24 06:57:41] ppsci INFO: train: epoch 1007 | step 20 | lr 0.000010 | loss 0.039511 | mae 0.144899 -[2024/06/24 06:57:41] ppsci INFO: train: epoch 1007 | step 30 | lr 0.000010 | loss 0.032253 | mae 0.135762 -[2024/06/24 06:57:42] ppsci INFO: train: epoch 1007 | step 38 | lr 0.000010 | loss 0.069025 | mae 0.171784 -[2024/06/24 06:57:42] ppsci INFO: epoch: 1007, train_loss: 0.028453, train_metric: 0.122055, eval_loss: 0.056637, eval_mae: 0.153221 -[2024/06/24 06:57:42] ppsci INFO: train: epoch 1008 | step 0 | lr 0.000010 | loss 0.030614 | mae 0.133940 -[2024/06/24 06:57:42] ppsci INFO: train: epoch 1008 | step 10 | lr 0.000010 | loss 0.030941 | mae 0.133693 -[2024/06/24 06:57:43] ppsci INFO: train: epoch 1008 | step 20 | lr 0.000010 | loss 0.022732 | mae 0.112337 -[2024/06/24 06:57:43] ppsci INFO: train: epoch 1008 | step 30 | lr 0.000010 | loss 0.036825 | mae 0.126302 -[2024/06/24 06:57:44] ppsci INFO: train: epoch 1008 | step 38 | lr 0.000010 | loss 0.021130 | mae 0.112645 -[2024/06/24 06:57:44] ppsci INFO: epoch: 1008, train_loss: 0.028580, train_metric: 0.125103, eval_loss: 0.056322, eval_mae: 0.152970 -[2024/06/24 06:57:44] ppsci INFO: train: epoch 1009 | step 0 | lr 0.000010 | loss 0.027169 | mae 0.129862 -[2024/06/24 06:57:45] ppsci INFO: train: epoch 1009 | step 10 | lr 0.000010 | loss 0.030957 | mae 0.127736 -[2024/06/24 06:57:45] ppsci INFO: train: epoch 1009 | step 20 | lr 0.000010 | loss 0.024083 | mae 0.117315 -[2024/06/24 06:57:46] ppsci INFO: train: epoch 1009 | step 30 | lr 0.000010 | loss 0.032773 | mae 0.132820 -[2024/06/24 06:57:46] ppsci INFO: train: epoch 1009 | step 38 | lr 0.000010 | loss 0.010366 | mae 0.082414 -[2024/06/24 06:57:46] ppsci INFO: epoch: 1009, train_loss: 0.028294, train_metric: 0.124304, eval_loss: 0.056339, eval_mae: 0.152764 -[2024/06/24 06:57:46] ppsci INFO: train: epoch 1010 | step 0 | lr 0.000010 | loss 0.038330 | mae 0.142081 -[2024/06/24 06:57:47] ppsci INFO: train: epoch 1010 | step 10 | lr 0.000010 | loss 0.025292 | mae 0.115316 -[2024/06/24 06:57:47] ppsci INFO: train: epoch 1010 | step 20 | lr 0.000010 | loss 0.028040 | mae 0.121269 -[2024/06/24 06:57:48] ppsci INFO: train: epoch 1010 | step 30 | lr 0.000010 | loss 0.023289 | mae 0.111648 -[2024/06/24 06:57:48] ppsci INFO: train: epoch 1010 | step 38 | lr 0.000010 | loss 0.012400 | mae 0.088923 -[2024/06/24 06:57:48] ppsci INFO: epoch: 1010, train_loss: 0.028706, train_metric: 0.123931, eval_loss: 0.056645, eval_mae: 0.153273 -[2024/06/24 06:57:48] ppsci INFO: train: epoch 1011 | step 0 | lr 0.000010 | loss 0.031938 | mae 0.136981 -[2024/06/24 06:57:49] ppsci INFO: train: epoch 1011 | step 10 | lr 0.000010 | loss 0.026455 | mae 0.120086 -[2024/06/24 06:57:49] ppsci INFO: train: epoch 1011 | step 20 | lr 0.000010 | loss 0.029574 | mae 0.125321 -[2024/06/24 06:57:50] ppsci INFO: train: epoch 1011 | step 30 | lr 0.000010 | loss 0.032362 | mae 0.132697 -[2024/06/24 06:57:50] ppsci INFO: train: epoch 1011 | step 38 | lr 0.000010 | loss 0.014248 | mae 0.094221 -[2024/06/24 06:57:50] ppsci INFO: epoch: 1011, train_loss: 0.027900, train_metric: 0.123809, eval_loss: 0.056879, eval_mae: 0.152940 -[2024/06/24 06:57:50] ppsci INFO: train: epoch 1012 | step 0 | lr 0.000010 | loss 0.029976 | mae 0.125399 -[2024/06/24 06:57:51] ppsci INFO: train: epoch 1012 | step 10 | lr 0.000010 | loss 0.025865 | mae 0.119253 -[2024/06/24 06:57:51] ppsci INFO: train: epoch 1012 | step 20 | lr 0.000010 | loss 0.026289 | mae 0.119831 -[2024/06/24 06:57:52] ppsci INFO: train: epoch 1012 | step 30 | lr 0.000010 | loss 0.030795 | mae 0.120035 -[2024/06/24 06:57:52] ppsci INFO: train: epoch 1012 | step 38 | lr 0.000010 | loss 0.014852 | mae 0.097646 -[2024/06/24 06:57:52] ppsci INFO: epoch: 1012, train_loss: 0.026898, train_metric: 0.121598, eval_loss: 0.057254, eval_mae: 0.153435 -[2024/06/24 06:57:52] ppsci INFO: train: epoch 1013 | step 0 | lr 0.000010 | loss 0.024416 | mae 0.117278 -[2024/06/24 06:57:53] ppsci INFO: train: epoch 1013 | step 10 | lr 0.000010 | loss 0.019968 | mae 0.107111 -[2024/06/24 06:57:53] ppsci INFO: train: epoch 1013 | step 20 | lr 0.000010 | loss 0.019742 | mae 0.105894 -[2024/06/24 06:57:54] ppsci INFO: train: epoch 1013 | step 30 | lr 0.000010 | loss 0.024434 | mae 0.122713 -[2024/06/24 06:57:54] ppsci INFO: train: epoch 1013 | step 38 | lr 0.000010 | loss 0.041356 | mae 0.160701 -[2024/06/24 06:57:54] ppsci INFO: epoch: 1013, train_loss: 0.028412, train_metric: 0.123687, eval_loss: 0.056855, eval_mae: 0.153452 -[2024/06/24 06:57:55] ppsci INFO: train: epoch 1014 | step 0 | lr 0.000010 | loss 0.021642 | mae 0.114487 -[2024/06/24 06:57:55] ppsci INFO: train: epoch 1014 | step 10 | lr 0.000010 | loss 0.036198 | mae 0.132515 -[2024/06/24 06:57:56] ppsci INFO: train: epoch 1014 | step 20 | lr 0.000010 | loss 0.027866 | mae 0.128360 -[2024/06/24 06:57:56] ppsci INFO: train: epoch 1014 | step 30 | lr 0.000010 | loss 0.026103 | mae 0.121047 -[2024/06/24 06:57:57] ppsci INFO: train: epoch 1014 | step 38 | lr 0.000010 | loss 0.009989 | mae 0.080900 -[2024/06/24 06:57:57] ppsci INFO: epoch: 1014, train_loss: 0.029339, train_metric: 0.125934, eval_loss: 0.056148, eval_mae: 0.153149 -[2024/06/24 06:57:57] ppsci INFO: train: epoch 1015 | step 0 | lr 0.000010 | loss 0.021218 | mae 0.109543 -[2024/06/24 06:57:57] ppsci INFO: train: epoch 1015 | step 10 | lr 0.000010 | loss 0.038119 | mae 0.140336 -[2024/06/24 06:57:58] ppsci INFO: train: epoch 1015 | step 20 | lr 0.000010 | loss 0.029496 | mae 0.125074 -[2024/06/24 06:57:58] ppsci INFO: train: epoch 1015 | step 30 | lr 0.000010 | loss 0.024893 | mae 0.120994 -[2024/06/24 06:57:59] ppsci INFO: train: epoch 1015 | step 38 | lr 0.000010 | loss 0.054670 | mae 0.161979 -[2024/06/24 06:57:59] ppsci INFO: epoch: 1015, train_loss: 0.028838, train_metric: 0.123744, eval_loss: 0.056161, eval_mae: 0.152799 -[2024/06/24 06:57:59] ppsci INFO: train: epoch 1016 | step 0 | lr 0.000010 | loss 0.027864 | mae 0.116634 -[2024/06/24 06:57:59] ppsci INFO: train: epoch 1016 | step 10 | lr 0.000010 | loss 0.024667 | mae 0.116285 -[2024/06/24 06:58:00] ppsci INFO: train: epoch 1016 | step 20 | lr 0.000010 | loss 0.043093 | mae 0.133579 -[2024/06/24 06:58:00] ppsci INFO: train: epoch 1016 | step 30 | lr 0.000010 | loss 0.032509 | mae 0.140935 -[2024/06/24 06:58:01] ppsci INFO: train: epoch 1016 | step 38 | lr 0.000010 | loss 0.032848 | mae 0.154193 -[2024/06/24 06:58:01] ppsci INFO: epoch: 1016, train_loss: 0.028574, train_metric: 0.124604, eval_loss: 0.056650, eval_mae: 0.152772 -[2024/06/24 06:58:01] ppsci INFO: train: epoch 1017 | step 0 | lr 0.000010 | loss 0.022428 | mae 0.112685 -[2024/06/24 06:58:02] ppsci INFO: train: epoch 1017 | step 10 | lr 0.000010 | loss 0.025460 | mae 0.120235 -[2024/06/24 06:58:02] ppsci INFO: train: epoch 1017 | step 20 | lr 0.000010 | loss 0.036257 | mae 0.132736 -[2024/06/24 06:58:03] ppsci INFO: train: epoch 1017 | step 30 | lr 0.000010 | loss 0.019969 | mae 0.113303 -[2024/06/24 06:58:03] ppsci INFO: train: epoch 1017 | step 38 | lr 0.000010 | loss 0.024112 | mae 0.112842 -[2024/06/24 06:58:03] ppsci INFO: epoch: 1017, train_loss: 0.028015, train_metric: 0.124189, eval_loss: 0.056138, eval_mae: 0.152806 -[2024/06/24 06:58:03] ppsci INFO: train: epoch 1018 | step 0 | lr 0.000010 | loss 0.027064 | mae 0.121960 -[2024/06/24 06:58:04] ppsci INFO: train: epoch 1018 | step 10 | lr 0.000010 | loss 0.032267 | mae 0.132381 -[2024/06/24 06:58:04] ppsci INFO: train: epoch 1018 | step 20 | lr 0.000010 | loss 0.030373 | mae 0.130881 -[2024/06/24 06:58:05] ppsci INFO: train: epoch 1018 | step 30 | lr 0.000010 | loss 0.020290 | mae 0.112350 -[2024/06/24 06:58:05] ppsci INFO: train: epoch 1018 | step 38 | lr 0.000010 | loss 0.038681 | mae 0.148967 -[2024/06/24 06:58:05] ppsci INFO: epoch: 1018, train_loss: 0.028456, train_metric: 0.124273, eval_loss: 0.056590, eval_mae: 0.152518 -[2024/06/24 06:58:05] ppsci INFO: train: epoch 1019 | step 0 | lr 0.000010 | loss 0.032511 | mae 0.134552 -[2024/06/24 06:58:06] ppsci INFO: train: epoch 1019 | step 10 | lr 0.000010 | loss 0.025177 | mae 0.116489 -[2024/06/24 06:58:06] ppsci INFO: train: epoch 1019 | step 20 | lr 0.000010 | loss 0.027601 | mae 0.124736 -[2024/06/24 06:58:07] ppsci INFO: train: epoch 1019 | step 30 | lr 0.000010 | loss 0.035421 | mae 0.131917 -[2024/06/24 06:58:07] ppsci INFO: train: epoch 1019 | step 38 | lr 0.000010 | loss 0.063623 | mae 0.202317 -[2024/06/24 06:58:07] ppsci INFO: epoch: 1019, train_loss: 0.030056, train_metric: 0.125418, eval_loss: 0.056694, eval_mae: 0.152708 -[2024/06/24 06:58:07] ppsci INFO: train: epoch 1020 | step 0 | lr 0.000010 | loss 0.023618 | mae 0.122373 -[2024/06/24 06:58:08] ppsci INFO: train: epoch 1020 | step 10 | lr 0.000010 | loss 0.031199 | mae 0.127489 -[2024/06/24 06:58:08] ppsci INFO: train: epoch 1020 | step 20 | lr 0.000010 | loss 0.021363 | mae 0.111326 -[2024/06/24 06:58:09] ppsci INFO: train: epoch 1020 | step 30 | lr 0.000010 | loss 0.036171 | mae 0.128315 -[2024/06/24 06:58:09] ppsci INFO: train: epoch 1020 | step 38 | lr 0.000010 | loss 0.042680 | mae 0.140851 -[2024/06/24 06:58:09] ppsci INFO: epoch: 1020, train_loss: 0.027896, train_metric: 0.122441, eval_loss: 0.056345, eval_mae: 0.152384 -[2024/06/24 06:58:10] ppsci INFO: train: epoch 1021 | step 0 | lr 0.000011 | loss 0.035980 | mae 0.133202 -[2024/06/24 06:58:10] ppsci INFO: train: epoch 1021 | step 10 | lr 0.000011 | loss 0.029668 | mae 0.121545 -[2024/06/24 06:58:11] ppsci INFO: train: epoch 1021 | step 20 | lr 0.000011 | loss 0.024441 | mae 0.116447 -[2024/06/24 06:58:11] ppsci INFO: train: epoch 1021 | step 30 | lr 0.000011 | loss 0.017619 | mae 0.103479 -[2024/06/24 06:58:11] ppsci INFO: train: epoch 1021 | step 38 | lr 0.000011 | loss 0.010007 | mae 0.073735 -[2024/06/24 06:58:12] ppsci INFO: epoch: 1021, train_loss: 0.028308, train_metric: 0.123891, eval_loss: 0.057132, eval_mae: 0.153997 -[2024/06/24 06:58:12] ppsci INFO: train: epoch 1022 | step 0 | lr 0.000011 | loss 0.021907 | mae 0.112115 -[2024/06/24 06:58:12] ppsci INFO: train: epoch 1022 | step 10 | lr 0.000011 | loss 0.028933 | mae 0.125540 -[2024/06/24 06:58:13] ppsci INFO: train: epoch 1022 | step 20 | lr 0.000011 | loss 0.026698 | mae 0.118423 -[2024/06/24 06:58:13] ppsci INFO: train: epoch 1022 | step 30 | lr 0.000011 | loss 0.029396 | mae 0.132391 -[2024/06/24 06:58:14] ppsci INFO: train: epoch 1022 | step 38 | lr 0.000011 | loss 0.028412 | mae 0.146637 -[2024/06/24 06:58:14] ppsci INFO: epoch: 1022, train_loss: 0.028733, train_metric: 0.125014, eval_loss: 0.057210, eval_mae: 0.154223 -[2024/06/24 06:58:14] ppsci INFO: train: epoch 1023 | step 0 | lr 0.000011 | loss 0.019466 | mae 0.106173 -[2024/06/24 06:58:14] ppsci INFO: train: epoch 1023 | step 10 | lr 0.000011 | loss 0.029671 | mae 0.125925 -[2024/06/24 06:58:15] ppsci INFO: train: epoch 1023 | step 20 | lr 0.000011 | loss 0.022481 | mae 0.122020 -[2024/06/24 06:58:15] ppsci INFO: train: epoch 1023 | step 30 | lr 0.000011 | loss 0.022736 | mae 0.120486 -[2024/06/24 06:58:16] ppsci INFO: train: epoch 1023 | step 38 | lr 0.000011 | loss 0.029544 | mae 0.144438 -[2024/06/24 06:58:16] ppsci INFO: epoch: 1023, train_loss: 0.029581, train_metric: 0.126465, eval_loss: 0.056671, eval_mae: 0.153688 -[2024/06/24 06:58:16] ppsci INFO: train: epoch 1024 | step 0 | lr 0.000011 | loss 0.030638 | mae 0.130270 -[2024/06/24 06:58:17] ppsci INFO: train: epoch 1024 | step 10 | lr 0.000011 | loss 0.025477 | mae 0.119041 -[2024/06/24 06:58:17] ppsci INFO: train: epoch 1024 | step 20 | lr 0.000011 | loss 0.026016 | mae 0.122465 -[2024/06/24 06:58:18] ppsci INFO: train: epoch 1024 | step 30 | lr 0.000011 | loss 0.057457 | mae 0.152451 -[2024/06/24 06:58:18] ppsci INFO: train: epoch 1024 | step 38 | lr 0.000011 | loss 0.024527 | mae 0.123724 -[2024/06/24 06:58:18] ppsci INFO: epoch: 1024, train_loss: 0.028669, train_metric: 0.125863, eval_loss: 0.056916, eval_mae: 0.153545 -[2024/06/24 06:58:18] ppsci INFO: train: epoch 1025 | step 0 | lr 0.000011 | loss 0.047713 | mae 0.143871 -[2024/06/24 06:58:19] ppsci INFO: train: epoch 1025 | step 10 | lr 0.000011 | loss 0.022256 | mae 0.108008 -[2024/06/24 06:58:19] ppsci INFO: train: epoch 1025 | step 20 | lr 0.000011 | loss 0.027138 | mae 0.122362 -[2024/06/24 06:58:20] ppsci INFO: train: epoch 1025 | step 30 | lr 0.000011 | loss 0.027163 | mae 0.120166 -[2024/06/24 06:58:20] ppsci INFO: train: epoch 1025 | step 38 | lr 0.000011 | loss 0.009877 | mae 0.078172 -[2024/06/24 06:58:20] ppsci INFO: epoch: 1025, train_loss: 0.027977, train_metric: 0.124746, eval_loss: 0.056938, eval_mae: 0.153081 -[2024/06/24 06:58:20] ppsci INFO: train: epoch 1026 | step 0 | lr 0.000011 | loss 0.022469 | mae 0.109515 -[2024/06/24 06:58:21] ppsci INFO: train: epoch 1026 | step 10 | lr 0.000011 | loss 0.026402 | mae 0.124196 -[2024/06/24 06:58:21] ppsci INFO: train: epoch 1026 | step 20 | lr 0.000011 | loss 0.028436 | mae 0.128350 -[2024/06/24 06:58:22] ppsci INFO: train: epoch 1026 | step 30 | lr 0.000011 | loss 0.025193 | mae 0.124283 -[2024/06/24 06:58:22] ppsci INFO: train: epoch 1026 | step 38 | lr 0.000011 | loss 0.028070 | mae 0.130550 -[2024/06/24 06:58:22] ppsci INFO: epoch: 1026, train_loss: 0.027974, train_metric: 0.124791, eval_loss: 0.056761, eval_mae: 0.152960 -[2024/06/24 06:58:22] ppsci INFO: train: epoch 1027 | step 0 | lr 0.000011 | loss 0.024319 | mae 0.120827 -[2024/06/24 06:58:23] ppsci INFO: train: epoch 1027 | step 10 | lr 0.000011 | loss 0.022342 | mae 0.115319 -[2024/06/24 06:58:23] ppsci INFO: train: epoch 1027 | step 20 | lr 0.000011 | loss 0.022801 | mae 0.112127 -[2024/06/24 06:58:24] ppsci INFO: train: epoch 1027 | step 30 | lr 0.000011 | loss 0.031238 | mae 0.122348 -[2024/06/24 06:58:24] ppsci INFO: train: epoch 1027 | step 38 | lr 0.000011 | loss 0.110357 | mae 0.209952 -[2024/06/24 06:58:25] ppsci INFO: epoch: 1027, train_loss: 0.029686, train_metric: 0.122785, eval_loss: 0.056454, eval_mae: 0.153178 -[2024/06/24 06:58:25] ppsci INFO: train: epoch 1028 | step 0 | lr 0.000011 | loss 0.030938 | mae 0.129878 -[2024/06/24 06:58:25] ppsci INFO: train: epoch 1028 | step 10 | lr 0.000011 | loss 0.020529 | mae 0.105663 -[2024/06/24 06:58:26] ppsci INFO: train: epoch 1028 | step 20 | lr 0.000011 | loss 0.036027 | mae 0.144453 -[2024/06/24 06:58:26] ppsci INFO: train: epoch 1028 | step 30 | lr 0.000011 | loss 0.035953 | mae 0.134152 -[2024/06/24 06:58:27] ppsci INFO: train: epoch 1028 | step 38 | lr 0.000011 | loss 0.028695 | mae 0.137469 -[2024/06/24 06:58:27] ppsci INFO: epoch: 1028, train_loss: 0.029207, train_metric: 0.125199, eval_loss: 0.056250, eval_mae: 0.152545 -[2024/06/24 06:58:27] ppsci INFO: train: epoch 1029 | step 0 | lr 0.000011 | loss 0.029630 | mae 0.130949 -[2024/06/24 06:58:27] ppsci INFO: train: epoch 1029 | step 10 | lr 0.000011 | loss 0.024991 | mae 0.114651 -[2024/06/24 06:58:28] ppsci INFO: train: epoch 1029 | step 20 | lr 0.000011 | loss 0.026180 | mae 0.115636 -[2024/06/24 06:58:28] ppsci INFO: train: epoch 1029 | step 30 | lr 0.000011 | loss 0.028295 | mae 0.128023 -[2024/06/24 06:58:29] ppsci INFO: train: epoch 1029 | step 38 | lr 0.000011 | loss 0.012587 | mae 0.097861 -[2024/06/24 06:58:29] ppsci INFO: epoch: 1029, train_loss: 0.028862, train_metric: 0.124816, eval_loss: 0.056789, eval_mae: 0.153189 -[2024/06/24 06:58:29] ppsci INFO: train: epoch 1030 | step 0 | lr 0.000011 | loss 0.019339 | mae 0.105742 -[2024/06/24 06:58:29] ppsci INFO: train: epoch 1030 | step 10 | lr 0.000011 | loss 0.032458 | mae 0.129160 -[2024/06/24 06:58:30] ppsci INFO: train: epoch 1030 | step 20 | lr 0.000011 | loss 0.041659 | mae 0.147571 -[2024/06/24 06:58:30] ppsci INFO: train: epoch 1030 | step 30 | lr 0.000011 | loss 0.023686 | mae 0.109103 -[2024/06/24 06:58:31] ppsci INFO: train: epoch 1030 | step 38 | lr 0.000011 | loss 0.010624 | mae 0.085148 -[2024/06/24 06:58:31] ppsci INFO: epoch: 1030, train_loss: 0.029402, train_metric: 0.125246, eval_loss: 0.056349, eval_mae: 0.152423 -[2024/06/24 06:58:31] ppsci INFO: train: epoch 1031 | step 0 | lr 0.000011 | loss 0.022331 | mae 0.113789 -[2024/06/24 06:58:31] ppsci INFO: train: epoch 1031 | step 10 | lr 0.000011 | loss 0.039773 | mae 0.141678 -[2024/06/24 06:58:32] ppsci INFO: train: epoch 1031 | step 20 | lr 0.000011 | loss 0.028095 | mae 0.132200 -[2024/06/24 06:58:32] ppsci INFO: train: epoch 1031 | step 30 | lr 0.000011 | loss 0.024114 | mae 0.118192 -[2024/06/24 06:58:33] ppsci INFO: train: epoch 1031 | step 38 | lr 0.000011 | loss 0.025757 | mae 0.137318 -[2024/06/24 06:58:33] ppsci INFO: epoch: 1031, train_loss: 0.028316, train_metric: 0.124202, eval_loss: 0.056700, eval_mae: 0.153233 -[2024/06/24 06:58:33] ppsci INFO: train: epoch 1032 | step 0 | lr 0.000011 | loss 0.026379 | mae 0.118446 -[2024/06/24 06:58:33] ppsci INFO: train: epoch 1032 | step 10 | lr 0.000011 | loss 0.026393 | mae 0.119673 -[2024/06/24 06:58:34] ppsci INFO: train: epoch 1032 | step 20 | lr 0.000011 | loss 0.039933 | mae 0.139447 -[2024/06/24 06:58:34] ppsci INFO: train: epoch 1032 | step 30 | lr 0.000011 | loss 0.037828 | mae 0.128043 -[2024/06/24 06:58:35] ppsci INFO: train: epoch 1032 | step 38 | lr 0.000011 | loss 0.024468 | mae 0.122092 -[2024/06/24 06:58:35] ppsci INFO: epoch: 1032, train_loss: 0.028965, train_metric: 0.124064, eval_loss: 0.057018, eval_mae: 0.153455 -[2024/06/24 06:58:35] ppsci INFO: train: epoch 1033 | step 0 | lr 0.000011 | loss 0.030572 | mae 0.128361 -[2024/06/24 06:58:36] ppsci INFO: train: epoch 1033 | step 10 | lr 0.000011 | loss 0.033328 | mae 0.137006 -[2024/06/24 06:58:36] ppsci INFO: train: epoch 1033 | step 20 | lr 0.000011 | loss 0.033129 | mae 0.132144 -[2024/06/24 06:58:37] ppsci INFO: train: epoch 1033 | step 30 | lr 0.000011 | loss 0.023993 | mae 0.113455 -[2024/06/24 06:58:37] ppsci INFO: train: epoch 1033 | step 38 | lr 0.000011 | loss 0.021972 | mae 0.097227 -[2024/06/24 06:58:37] ppsci INFO: epoch: 1033, train_loss: 0.029177, train_metric: 0.126330, eval_loss: 0.056604, eval_mae: 0.152888 -[2024/06/24 06:58:37] ppsci INFO: train: epoch 1034 | step 0 | lr 0.000011 | loss 0.024224 | mae 0.110231 -[2024/06/24 06:58:38] ppsci INFO: train: epoch 1034 | step 10 | lr 0.000011 | loss 0.026724 | mae 0.127891 -[2024/06/24 06:58:38] ppsci INFO: train: epoch 1034 | step 20 | lr 0.000011 | loss 0.024968 | mae 0.104585 -[2024/06/24 06:58:39] ppsci INFO: train: epoch 1034 | step 30 | lr 0.000011 | loss 0.022602 | mae 0.117264 -[2024/06/24 06:58:39] ppsci INFO: train: epoch 1034 | step 38 | lr 0.000011 | loss 0.030492 | mae 0.108522 -[2024/06/24 06:58:39] ppsci INFO: epoch: 1034, train_loss: 0.031163, train_metric: 0.126994, eval_loss: 0.056397, eval_mae: 0.152560 -[2024/06/24 06:58:39] ppsci INFO: train: epoch 1035 | step 0 | lr 0.000011 | loss 0.028703 | mae 0.122337 -[2024/06/24 06:58:40] ppsci INFO: train: epoch 1035 | step 10 | lr 0.000011 | loss 0.022162 | mae 0.113650 -[2024/06/24 06:58:40] ppsci INFO: train: epoch 1035 | step 20 | lr 0.000011 | loss 0.021277 | mae 0.110594 -[2024/06/24 06:58:41] ppsci INFO: train: epoch 1035 | step 30 | lr 0.000011 | loss 0.021201 | mae 0.109366 -[2024/06/24 06:58:41] ppsci INFO: train: epoch 1035 | step 38 | lr 0.000011 | loss 0.035345 | mae 0.147909 -[2024/06/24 06:58:41] ppsci INFO: epoch: 1035, train_loss: 0.030028, train_metric: 0.126965, eval_loss: 0.056747, eval_mae: 0.153181 -[2024/06/24 06:58:41] ppsci INFO: train: epoch 1036 | step 0 | lr 0.000012 | loss 0.026392 | mae 0.122312 -[2024/06/24 06:58:42] ppsci INFO: train: epoch 1036 | step 10 | lr 0.000012 | loss 0.032282 | mae 0.127302 -[2024/06/24 06:58:42] ppsci INFO: train: epoch 1036 | step 20 | lr 0.000012 | loss 0.024849 | mae 0.122189 -[2024/06/24 06:58:43] ppsci INFO: train: epoch 1036 | step 30 | lr 0.000012 | loss 0.028934 | mae 0.132373 -[2024/06/24 06:58:43] ppsci INFO: train: epoch 1036 | step 38 | lr 0.000012 | loss 0.011873 | mae 0.090359 -[2024/06/24 06:58:43] ppsci INFO: epoch: 1036, train_loss: 0.028143, train_metric: 0.123500, eval_loss: 0.056496, eval_mae: 0.152895 -[2024/06/24 06:58:43] ppsci INFO: train: epoch 1037 | step 0 | lr 0.000012 | loss 0.032128 | mae 0.128250 -[2024/06/24 06:58:44] ppsci INFO: train: epoch 1037 | step 10 | lr 0.000012 | loss 0.021465 | mae 0.110269 -[2024/06/24 06:58:45] ppsci INFO: train: epoch 1037 | step 20 | lr 0.000012 | loss 0.048413 | mae 0.152761 -[2024/06/24 06:58:45] ppsci INFO: train: epoch 1037 | step 30 | lr 0.000012 | loss 0.026939 | mae 0.124688 -[2024/06/24 06:58:46] ppsci INFO: train: epoch 1037 | step 38 | lr 0.000012 | loss 0.015261 | mae 0.101229 -[2024/06/24 06:58:46] ppsci INFO: epoch: 1037, train_loss: 0.028884, train_metric: 0.125723, eval_loss: 0.057017, eval_mae: 0.153514 -[2024/06/24 06:58:46] ppsci INFO: train: epoch 1038 | step 0 | lr 0.000012 | loss 0.026668 | mae 0.124327 -[2024/06/24 06:58:46] ppsci INFO: train: epoch 1038 | step 10 | lr 0.000012 | loss 0.025498 | mae 0.117378 -[2024/06/24 06:58:47] ppsci INFO: train: epoch 1038 | step 20 | lr 0.000012 | loss 0.033750 | mae 0.134537 -[2024/06/24 06:58:47] ppsci INFO: train: epoch 1038 | step 30 | lr 0.000012 | loss 0.054279 | mae 0.153698 -[2024/06/24 06:58:48] ppsci INFO: train: epoch 1038 | step 38 | lr 0.000012 | loss 0.021437 | mae 0.101375 -[2024/06/24 06:58:48] ppsci INFO: epoch: 1038, train_loss: 0.028915, train_metric: 0.124717, eval_loss: 0.056215, eval_mae: 0.153449 -[2024/06/24 06:58:48] ppsci INFO: train: epoch 1039 | step 0 | lr 0.000012 | loss 0.023237 | mae 0.115052 -[2024/06/24 06:58:49] ppsci INFO: train: epoch 1039 | step 10 | lr 0.000012 | loss 0.045140 | mae 0.154024 -[2024/06/24 06:58:49] ppsci INFO: train: epoch 1039 | step 20 | lr 0.000012 | loss 0.031882 | mae 0.135107 -[2024/06/24 06:58:49] ppsci INFO: train: epoch 1039 | step 30 | lr 0.000012 | loss 0.023523 | mae 0.113266 -[2024/06/24 06:58:50] ppsci INFO: train: epoch 1039 | step 38 | lr 0.000012 | loss 0.009730 | mae 0.079548 -[2024/06/24 06:58:50] ppsci INFO: epoch: 1039, train_loss: 0.027321, train_metric: 0.123024, eval_loss: 0.055728, eval_mae: 0.152138 -[2024/06/24 06:58:50] ppsci INFO: train: epoch 1040 | step 0 | lr 0.000012 | loss 0.028236 | mae 0.127758 -[2024/06/24 06:58:50] ppsci INFO: train: epoch 1040 | step 10 | lr 0.000012 | loss 0.030391 | mae 0.133902 -[2024/06/24 06:58:51] ppsci INFO: train: epoch 1040 | step 20 | lr 0.000012 | loss 0.025459 | mae 0.123790 -[2024/06/24 06:58:52] ppsci INFO: train: epoch 1040 | step 30 | lr 0.000012 | loss 0.023829 | mae 0.114346 -[2024/06/24 06:58:52] ppsci INFO: train: epoch 1040 | step 38 | lr 0.000012 | loss 0.035854 | mae 0.141886 -[2024/06/24 06:58:52] ppsci INFO: epoch: 1040, train_loss: 0.028988, train_metric: 0.125302, eval_loss: 0.056140, eval_mae: 0.152851 -[2024/06/24 06:58:52] ppsci INFO: train: epoch 1041 | step 0 | lr 0.000012 | loss 0.024794 | mae 0.117231 -[2024/06/24 06:58:53] ppsci INFO: train: epoch 1041 | step 10 | lr 0.000012 | loss 0.025686 | mae 0.122616 -[2024/06/24 06:58:53] ppsci INFO: train: epoch 1041 | step 20 | lr 0.000012 | loss 0.027538 | mae 0.125155 -[2024/06/24 06:58:54] ppsci INFO: train: epoch 1041 | step 30 | lr 0.000012 | loss 0.024272 | mae 0.123680 -[2024/06/24 06:58:54] ppsci INFO: train: epoch 1041 | step 38 | lr 0.000012 | loss 0.051696 | mae 0.146286 -[2024/06/24 06:58:54] ppsci INFO: epoch: 1041, train_loss: 0.028132, train_metric: 0.123541, eval_loss: 0.056035, eval_mae: 0.152719 -[2024/06/24 06:58:54] ppsci INFO: train: epoch 1042 | step 0 | lr 0.000012 | loss 0.028276 | mae 0.121604 -[2024/06/24 06:58:55] ppsci INFO: train: epoch 1042 | step 10 | lr 0.000012 | loss 0.023295 | mae 0.118492 -[2024/06/24 06:58:56] ppsci INFO: train: epoch 1042 | step 20 | lr 0.000012 | loss 0.033298 | mae 0.138409 -[2024/06/24 06:58:56] ppsci INFO: train: epoch 1042 | step 30 | lr 0.000012 | loss 0.025765 | mae 0.125281 -[2024/06/24 06:58:56] ppsci INFO: train: epoch 1042 | step 38 | lr 0.000012 | loss 0.016728 | mae 0.096989 -[2024/06/24 06:58:57] ppsci INFO: epoch: 1042, train_loss: 0.028022, train_metric: 0.124187, eval_loss: 0.055832, eval_mae: 0.152289 -[2024/06/24 06:58:57] ppsci INFO: train: epoch 1043 | step 0 | lr 0.000012 | loss 0.021031 | mae 0.113408 -[2024/06/24 06:58:57] ppsci INFO: train: epoch 1043 | step 10 | lr 0.000012 | loss 0.028458 | mae 0.128603 -[2024/06/24 06:58:58] ppsci INFO: train: epoch 1043 | step 20 | lr 0.000012 | loss 0.022606 | mae 0.115886 -[2024/06/24 06:58:58] ppsci INFO: train: epoch 1043 | step 30 | lr 0.000012 | loss 0.038126 | mae 0.141557 -[2024/06/24 06:58:59] ppsci INFO: train: epoch 1043 | step 38 | lr 0.000012 | loss 0.015114 | mae 0.089032 -[2024/06/24 06:58:59] ppsci INFO: epoch: 1043, train_loss: 0.028494, train_metric: 0.125531, eval_loss: 0.056089, eval_mae: 0.152922 -[2024/06/24 06:58:59] ppsci INFO: train: epoch 1044 | step 0 | lr 0.000012 | loss 0.030820 | mae 0.123770 -[2024/06/24 06:58:59] ppsci INFO: train: epoch 1044 | step 10 | lr 0.000012 | loss 0.022134 | mae 0.112972 -[2024/06/24 06:59:00] ppsci INFO: train: epoch 1044 | step 20 | lr 0.000012 | loss 0.025879 | mae 0.124467 -[2024/06/24 06:59:00] ppsci INFO: train: epoch 1044 | step 30 | lr 0.000012 | loss 0.032329 | mae 0.125045 -[2024/06/24 06:59:01] ppsci INFO: train: epoch 1044 | step 38 | lr 0.000012 | loss 0.028620 | mae 0.126130 -[2024/06/24 06:59:01] ppsci INFO: epoch: 1044, train_loss: 0.028391, train_metric: 0.124696, eval_loss: 0.056291, eval_mae: 0.152926 -[2024/06/24 06:59:01] ppsci INFO: train: epoch 1045 | step 0 | lr 0.000012 | loss 0.022378 | mae 0.118834 -[2024/06/24 06:59:01] ppsci INFO: train: epoch 1045 | step 10 | lr 0.000012 | loss 0.021272 | mae 0.112240 -[2024/06/24 06:59:02] ppsci INFO: train: epoch 1045 | step 20 | lr 0.000012 | loss 0.025207 | mae 0.119288 -[2024/06/24 06:59:02] ppsci INFO: train: epoch 1045 | step 30 | lr 0.000012 | loss 0.026935 | mae 0.116419 -[2024/06/24 06:59:03] ppsci INFO: train: epoch 1045 | step 38 | lr 0.000012 | loss 0.026048 | mae 0.129261 -[2024/06/24 06:59:03] ppsci INFO: epoch: 1045, train_loss: 0.027743, train_metric: 0.124118, eval_loss: 0.056497, eval_mae: 0.153326 -[2024/06/24 06:59:03] ppsci INFO: train: epoch 1046 | step 0 | lr 0.000013 | loss 0.025423 | mae 0.127052 -[2024/06/24 06:59:04] ppsci INFO: train: epoch 1046 | step 10 | lr 0.000013 | loss 0.031735 | mae 0.135097 -[2024/06/24 06:59:04] ppsci INFO: train: epoch 1046 | step 20 | lr 0.000013 | loss 0.029914 | mae 0.128668 -[2024/06/24 06:59:05] ppsci INFO: train: epoch 1046 | step 30 | lr 0.000013 | loss 0.058261 | mae 0.121727 -[2024/06/24 06:59:05] ppsci INFO: train: epoch 1046 | step 38 | lr 0.000013 | loss 0.037980 | mae 0.142451 -[2024/06/24 06:59:05] ppsci INFO: epoch: 1046, train_loss: 0.030383, train_metric: 0.126329, eval_loss: 0.056877, eval_mae: 0.153405 -[2024/06/24 06:59:05] ppsci INFO: train: epoch 1047 | step 0 | lr 0.000013 | loss 0.024830 | mae 0.112259 -[2024/06/24 06:59:06] ppsci INFO: train: epoch 1047 | step 10 | lr 0.000013 | loss 0.037331 | mae 0.129852 -[2024/06/24 06:59:06] ppsci INFO: train: epoch 1047 | step 20 | lr 0.000013 | loss 0.026179 | mae 0.115553 -[2024/06/24 06:59:07] ppsci INFO: train: epoch 1047 | step 30 | lr 0.000013 | loss 0.020443 | mae 0.105598 -[2024/06/24 06:59:07] ppsci INFO: train: epoch 1047 | step 38 | lr 0.000013 | loss 0.012465 | mae 0.073592 -[2024/06/24 06:59:07] ppsci INFO: epoch: 1047, train_loss: 0.028790, train_metric: 0.125561, eval_loss: 0.057200, eval_mae: 0.153883 -[2024/06/24 06:59:07] ppsci INFO: train: epoch 1048 | step 0 | lr 0.000013 | loss 0.030015 | mae 0.130335 -[2024/06/24 06:59:08] ppsci INFO: train: epoch 1048 | step 10 | lr 0.000013 | loss 0.022783 | mae 0.114292 -[2024/06/24 06:59:09] ppsci INFO: train: epoch 1048 | step 20 | lr 0.000013 | loss 0.078234 | mae 0.161537 -[2024/06/24 06:59:09] ppsci INFO: train: epoch 1048 | step 30 | lr 0.000013 | loss 0.020459 | mae 0.105992 -[2024/06/24 06:59:10] ppsci INFO: train: epoch 1048 | step 38 | lr 0.000013 | loss 0.008444 | mae 0.063738 -[2024/06/24 06:59:10] ppsci INFO: epoch: 1048, train_loss: 0.029603, train_metric: 0.126053, eval_loss: 0.057386, eval_mae: 0.154139 -[2024/06/24 06:59:10] ppsci INFO: train: epoch 1049 | step 0 | lr 0.000013 | loss 0.025505 | mae 0.122382 -[2024/06/24 06:59:10] ppsci INFO: train: epoch 1049 | step 10 | lr 0.000013 | loss 0.029349 | mae 0.121950 -[2024/06/24 06:59:11] ppsci INFO: train: epoch 1049 | step 20 | lr 0.000013 | loss 0.027269 | mae 0.124427 -[2024/06/24 06:59:11] ppsci INFO: train: epoch 1049 | step 30 | lr 0.000013 | loss 0.022571 | mae 0.115744 -[2024/06/24 06:59:12] ppsci INFO: train: epoch 1049 | step 38 | lr 0.000013 | loss 0.024249 | mae 0.133568 -[2024/06/24 06:59:12] ppsci INFO: epoch: 1049, train_loss: 0.027716, train_metric: 0.123227, eval_loss: 0.057104, eval_mae: 0.153211 -[2024/06/24 06:59:12] ppsci INFO: train: epoch 1050 | step 0 | lr 0.000013 | loss 0.044771 | mae 0.151319 -[2024/06/24 06:59:12] ppsci INFO: train: epoch 1050 | step 10 | lr 0.000013 | loss 0.023617 | mae 0.111928 -[2024/06/24 06:59:13] ppsci INFO: train: epoch 1050 | step 20 | lr 0.000013 | loss 0.026953 | mae 0.124299 -[2024/06/24 06:59:14] ppsci INFO: train: epoch 1050 | step 30 | lr 0.000013 | loss 0.029501 | mae 0.125936 -[2024/06/24 06:59:14] ppsci INFO: train: epoch 1050 | step 38 | lr 0.000013 | loss 0.027841 | mae 0.125764 -[2024/06/24 06:59:14] ppsci INFO: epoch: 1050, train_loss: 0.029180, train_metric: 0.125347, eval_loss: 0.056591, eval_mae: 0.152840 -[2024/06/24 06:59:14] ppsci INFO: train: epoch 1051 | step 0 | lr 0.000013 | loss 0.028533 | mae 0.128039 -[2024/06/24 06:59:15] ppsci INFO: train: epoch 1051 | step 10 | lr 0.000013 | loss 0.019303 | mae 0.105120 -[2024/06/24 06:59:15] ppsci INFO: train: epoch 1051 | step 20 | lr 0.000013 | loss 0.028929 | mae 0.127219 -[2024/06/24 06:59:16] ppsci INFO: train: epoch 1051 | step 30 | lr 0.000013 | loss 0.022322 | mae 0.114141 -[2024/06/24 06:59:16] ppsci INFO: train: epoch 1051 | step 38 | lr 0.000013 | loss 0.011222 | mae 0.091828 -[2024/06/24 06:59:16] ppsci INFO: epoch: 1051, train_loss: 0.028063, train_metric: 0.124509, eval_loss: 0.056438, eval_mae: 0.152925 -[2024/06/24 06:59:16] ppsci INFO: train: epoch 1052 | step 0 | lr 0.000013 | loss 0.028706 | mae 0.125056 -[2024/06/24 06:59:17] ppsci INFO: train: epoch 1052 | step 10 | lr 0.000013 | loss 0.027683 | mae 0.123833 -[2024/06/24 06:59:17] ppsci INFO: train: epoch 1052 | step 20 | lr 0.000013 | loss 0.020955 | mae 0.111795 -[2024/06/24 06:59:18] ppsci INFO: train: epoch 1052 | step 30 | lr 0.000013 | loss 0.030716 | mae 0.135150 -[2024/06/24 06:59:18] ppsci INFO: train: epoch 1052 | step 38 | lr 0.000013 | loss 0.013970 | mae 0.090853 -[2024/06/24 06:59:18] ppsci INFO: epoch: 1052, train_loss: 0.029209, train_metric: 0.127499, eval_loss: 0.056236, eval_mae: 0.152808 -[2024/06/24 06:59:18] ppsci INFO: train: epoch 1053 | step 0 | lr 0.000013 | loss 0.031382 | mae 0.119455 -[2024/06/24 06:59:19] ppsci INFO: train: epoch 1053 | step 10 | lr 0.000013 | loss 0.027980 | mae 0.131988 -[2024/06/24 06:59:20] ppsci INFO: train: epoch 1053 | step 20 | lr 0.000013 | loss 0.031614 | mae 0.124800 -[2024/06/24 06:59:20] ppsci INFO: train: epoch 1053 | step 30 | lr 0.000013 | loss 0.036575 | mae 0.142800 -[2024/06/24 06:59:20] ppsci INFO: train: epoch 1053 | step 38 | lr 0.000013 | loss 0.020390 | mae 0.113375 -[2024/06/24 06:59:21] ppsci INFO: epoch: 1053, train_loss: 0.028492, train_metric: 0.125337, eval_loss: 0.056355, eval_mae: 0.152237 -[2024/06/24 06:59:21] ppsci INFO: train: epoch 1054 | step 0 | lr 0.000014 | loss 0.031842 | mae 0.115511 -[2024/06/24 06:59:21] ppsci INFO: train: epoch 1054 | step 10 | lr 0.000014 | loss 0.025875 | mae 0.118794 -[2024/06/24 06:59:22] ppsci INFO: train: epoch 1054 | step 20 | lr 0.000014 | loss 0.018025 | mae 0.104526 -[2024/06/24 06:59:22] ppsci INFO: train: epoch 1054 | step 30 | lr 0.000014 | loss 0.027690 | mae 0.120985 -[2024/06/24 06:59:23] ppsci INFO: train: epoch 1054 | step 38 | lr 0.000014 | loss 0.019940 | mae 0.105377 -[2024/06/24 06:59:23] ppsci INFO: epoch: 1054, train_loss: 0.028347, train_metric: 0.123287, eval_loss: 0.057626, eval_mae: 0.153542 -[2024/06/24 06:59:23] ppsci INFO: train: epoch 1055 | step 0 | lr 0.000014 | loss 0.029508 | mae 0.129084 -[2024/06/24 06:59:23] ppsci INFO: train: epoch 1055 | step 10 | lr 0.000014 | loss 0.021755 | mae 0.108998 -[2024/06/24 06:59:24] ppsci INFO: train: epoch 1055 | step 20 | lr 0.000014 | loss 0.025246 | mae 0.125942 -[2024/06/24 06:59:24] ppsci INFO: train: epoch 1055 | step 30 | lr 0.000014 | loss 0.039582 | mae 0.151431 -[2024/06/24 06:59:25] ppsci INFO: train: epoch 1055 | step 38 | lr 0.000014 | loss 0.035601 | mae 0.142306 -[2024/06/24 06:59:25] ppsci INFO: epoch: 1055, train_loss: 0.028328, train_metric: 0.124148, eval_loss: 0.056577, eval_mae: 0.152383 -[2024/06/24 06:59:25] ppsci INFO: train: epoch 1056 | step 0 | lr 0.000014 | loss 0.038918 | mae 0.136439 -[2024/06/24 06:59:25] ppsci INFO: train: epoch 1056 | step 10 | lr 0.000014 | loss 0.028071 | mae 0.122595 -[2024/06/24 06:59:26] ppsci INFO: train: epoch 1056 | step 20 | lr 0.000014 | loss 0.033275 | mae 0.128317 -[2024/06/24 06:59:26] ppsci INFO: train: epoch 1056 | step 30 | lr 0.000014 | loss 0.026450 | mae 0.123546 -[2024/06/24 06:59:27] ppsci INFO: train: epoch 1056 | step 38 | lr 0.000014 | loss 0.037901 | mae 0.157016 -[2024/06/24 06:59:27] ppsci INFO: epoch: 1056, train_loss: 0.029514, train_metric: 0.125626, eval_loss: 0.056013, eval_mae: 0.151866 -[2024/06/24 06:59:27] ppsci INFO: train: epoch 1057 | step 0 | lr 0.000014 | loss 0.044317 | mae 0.139114 -[2024/06/24 06:59:28] ppsci INFO: train: epoch 1057 | step 10 | lr 0.000014 | loss 0.030951 | mae 0.124575 -[2024/06/24 06:59:28] ppsci INFO: train: epoch 1057 | step 20 | lr 0.000014 | loss 0.031190 | mae 0.129248 -[2024/06/24 06:59:29] ppsci INFO: train: epoch 1057 | step 30 | lr 0.000014 | loss 0.029309 | mae 0.127377 -[2024/06/24 06:59:29] ppsci INFO: train: epoch 1057 | step 38 | lr 0.000014 | loss 0.016996 | mae 0.109706 -[2024/06/24 06:59:29] ppsci INFO: epoch: 1057, train_loss: 0.028406, train_metric: 0.124285, eval_loss: 0.056774, eval_mae: 0.152660 -[2024/06/24 06:59:29] ppsci INFO: train: epoch 1058 | step 0 | lr 0.000014 | loss 0.029805 | mae 0.127400 -[2024/06/24 06:59:30] ppsci INFO: train: epoch 1058 | step 10 | lr 0.000014 | loss 0.026356 | mae 0.126037 -[2024/06/24 06:59:30] ppsci INFO: train: epoch 1058 | step 20 | lr 0.000014 | loss 0.026316 | mae 0.121592 -[2024/06/24 06:59:31] ppsci INFO: train: epoch 1058 | step 30 | lr 0.000014 | loss 0.017830 | mae 0.102304 -[2024/06/24 06:59:31] ppsci INFO: train: epoch 1058 | step 38 | lr 0.000014 | loss 0.034015 | mae 0.136857 -[2024/06/24 06:59:31] ppsci INFO: epoch: 1058, train_loss: 0.028153, train_metric: 0.124682, eval_loss: 0.056852, eval_mae: 0.153440 -[2024/06/24 06:59:31] ppsci INFO: train: epoch 1059 | step 0 | lr 0.000014 | loss 0.025992 | mae 0.122519 -[2024/06/24 06:59:32] ppsci INFO: train: epoch 1059 | step 10 | lr 0.000014 | loss 0.040453 | mae 0.144532 -[2024/06/24 06:59:32] ppsci INFO: train: epoch 1059 | step 20 | lr 0.000014 | loss 0.033842 | mae 0.130842 -[2024/06/24 06:59:33] ppsci INFO: train: epoch 1059 | step 30 | lr 0.000014 | loss 0.022204 | mae 0.112011 -[2024/06/24 06:59:33] ppsci INFO: train: epoch 1059 | step 38 | lr 0.000014 | loss 0.014007 | mae 0.089293 -[2024/06/24 06:59:33] ppsci INFO: epoch: 1059, train_loss: 0.027026, train_metric: 0.121797, eval_loss: 0.057736, eval_mae: 0.154282 -[2024/06/24 06:59:34] ppsci INFO: train: epoch 1060 | step 0 | lr 0.000014 | loss 0.026035 | mae 0.118836 -[2024/06/24 06:59:34] ppsci INFO: train: epoch 1060 | step 10 | lr 0.000014 | loss 0.026853 | mae 0.124592 -[2024/06/24 06:59:35] ppsci INFO: train: epoch 1060 | step 20 | lr 0.000014 | loss 0.031312 | mae 0.134821 -[2024/06/24 06:59:35] ppsci INFO: train: epoch 1060 | step 30 | lr 0.000014 | loss 0.025868 | mae 0.111220 -[2024/06/24 06:59:35] ppsci INFO: train: epoch 1060 | step 38 | lr 0.000014 | loss 0.025310 | mae 0.114539 -[2024/06/24 06:59:36] ppsci INFO: epoch: 1060, train_loss: 0.029034, train_metric: 0.124097, eval_loss: 0.057106, eval_mae: 0.153523 -[2024/06/24 06:59:36] ppsci INFO: train: epoch 1061 | step 0 | lr 0.000014 | loss 0.021189 | mae 0.114785 -[2024/06/24 06:59:36] ppsci INFO: train: epoch 1061 | step 10 | lr 0.000014 | loss 0.027092 | mae 0.124685 -[2024/06/24 06:59:37] ppsci INFO: train: epoch 1061 | step 20 | lr 0.000014 | loss 0.023854 | mae 0.120518 -[2024/06/24 06:59:37] ppsci INFO: train: epoch 1061 | step 30 | lr 0.000014 | loss 0.029847 | mae 0.128838 -[2024/06/24 06:59:38] ppsci INFO: train: epoch 1061 | step 38 | lr 0.000014 | loss 0.034849 | mae 0.129155 -[2024/06/24 06:59:38] ppsci INFO: epoch: 1061, train_loss: 0.028482, train_metric: 0.124697, eval_loss: 0.057473, eval_mae: 0.153929 -[2024/06/24 06:59:38] ppsci INFO: train: epoch 1062 | step 0 | lr 0.000015 | loss 0.026535 | mae 0.128945 -[2024/06/24 06:59:38] ppsci INFO: train: epoch 1062 | step 10 | lr 0.000015 | loss 0.030335 | mae 0.131000 -[2024/06/24 06:59:39] ppsci INFO: train: epoch 1062 | step 20 | lr 0.000015 | loss 0.030606 | mae 0.135195 -[2024/06/24 06:59:39] ppsci INFO: train: epoch 1062 | step 30 | lr 0.000015 | loss 0.027519 | mae 0.122692 -[2024/06/24 06:59:40] ppsci INFO: train: epoch 1062 | step 38 | lr 0.000015 | loss 0.053480 | mae 0.184769 -[2024/06/24 06:59:40] ppsci INFO: epoch: 1062, train_loss: 0.028888, train_metric: 0.125671, eval_loss: 0.056739, eval_mae: 0.153120 -[2024/06/24 06:59:40] ppsci INFO: train: epoch 1063 | step 0 | lr 0.000015 | loss 0.029130 | mae 0.127935 -[2024/06/24 06:59:40] ppsci INFO: train: epoch 1063 | step 10 | lr 0.000015 | loss 0.021957 | mae 0.113142 -[2024/06/24 06:59:41] ppsci INFO: train: epoch 1063 | step 20 | lr 0.000015 | loss 0.021955 | mae 0.111847 -[2024/06/24 06:59:41] ppsci INFO: train: epoch 1063 | step 30 | lr 0.000015 | loss 0.031821 | mae 0.124800 -[2024/06/24 06:59:42] ppsci INFO: train: epoch 1063 | step 38 | lr 0.000015 | loss 0.022293 | mae 0.123933 -[2024/06/24 06:59:42] ppsci INFO: epoch: 1063, train_loss: 0.027801, train_metric: 0.122816, eval_loss: 0.056650, eval_mae: 0.152468 -[2024/06/24 06:59:42] ppsci INFO: train: epoch 1064 | step 0 | lr 0.000015 | loss 0.031772 | mae 0.123435 -[2024/06/24 06:59:43] ppsci INFO: train: epoch 1064 | step 10 | lr 0.000015 | loss 0.026198 | mae 0.120081 -[2024/06/24 06:59:43] ppsci INFO: train: epoch 1064 | step 20 | lr 0.000015 | loss 0.033584 | mae 0.138426 -[2024/06/24 06:59:44] ppsci INFO: train: epoch 1064 | step 30 | lr 0.000015 | loss 0.025805 | mae 0.112216 -[2024/06/24 06:59:44] ppsci INFO: train: epoch 1064 | step 38 | lr 0.000015 | loss 0.010741 | mae 0.075875 -[2024/06/24 06:59:44] ppsci INFO: epoch: 1064, train_loss: 0.029682, train_metric: 0.126602, eval_loss: 0.057120, eval_mae: 0.152880 -[2024/06/24 06:59:44] ppsci INFO: train: epoch 1065 | step 0 | lr 0.000015 | loss 0.028787 | mae 0.126954 -[2024/06/24 06:59:45] ppsci INFO: train: epoch 1065 | step 10 | lr 0.000015 | loss 0.021960 | mae 0.110720 -[2024/06/24 06:59:45] ppsci INFO: train: epoch 1065 | step 20 | lr 0.000015 | loss 0.028390 | mae 0.120531 -[2024/06/24 06:59:46] ppsci INFO: train: epoch 1065 | step 30 | lr 0.000015 | loss 0.021140 | mae 0.108418 -[2024/06/24 06:59:46] ppsci INFO: train: epoch 1065 | step 38 | lr 0.000015 | loss 0.023734 | mae 0.127947 -[2024/06/24 06:59:46] ppsci INFO: epoch: 1065, train_loss: 0.027671, train_metric: 0.123823, eval_loss: 0.057209, eval_mae: 0.153369 -[2024/06/24 06:59:46] ppsci INFO: train: epoch 1066 | step 0 | lr 0.000015 | loss 0.024633 | mae 0.122786 -[2024/06/24 06:59:47] ppsci INFO: train: epoch 1066 | step 10 | lr 0.000015 | loss 0.032908 | mae 0.124887 -[2024/06/24 06:59:47] ppsci INFO: train: epoch 1066 | step 20 | lr 0.000015 | loss 0.029211 | mae 0.118104 -[2024/06/24 06:59:48] ppsci INFO: train: epoch 1066 | step 30 | lr 0.000015 | loss 0.030018 | mae 0.131514 -[2024/06/24 06:59:48] ppsci INFO: train: epoch 1066 | step 38 | lr 0.000015 | loss 0.029302 | mae 0.143080 -[2024/06/24 06:59:48] ppsci INFO: epoch: 1066, train_loss: 0.028955, train_metric: 0.124848, eval_loss: 0.057345, eval_mae: 0.153411 -[2024/06/24 06:59:49] ppsci INFO: train: epoch 1067 | step 0 | lr 0.000015 | loss 0.030521 | mae 0.125835 -[2024/06/24 06:59:49] ppsci INFO: train: epoch 1067 | step 10 | lr 0.000015 | loss 0.031412 | mae 0.127559 -[2024/06/24 06:59:50] ppsci INFO: train: epoch 1067 | step 20 | lr 0.000015 | loss 0.022107 | mae 0.107956 -[2024/06/24 06:59:50] ppsci INFO: train: epoch 1067 | step 30 | lr 0.000015 | loss 0.034667 | mae 0.136033 -[2024/06/24 06:59:51] ppsci INFO: train: epoch 1067 | step 38 | lr 0.000015 | loss 0.015485 | mae 0.101100 -[2024/06/24 06:59:51] ppsci INFO: epoch: 1067, train_loss: 0.029318, train_metric: 0.124851, eval_loss: 0.056859, eval_mae: 0.153364 -[2024/06/24 06:59:51] ppsci INFO: train: epoch 1068 | step 0 | lr 0.000016 | loss 0.023490 | mae 0.111654 -[2024/06/24 06:59:51] ppsci INFO: train: epoch 1068 | step 10 | lr 0.000016 | loss 0.020668 | mae 0.110152 -[2024/06/24 06:59:52] ppsci INFO: train: epoch 1068 | step 20 | lr 0.000016 | loss 0.032110 | mae 0.123729 -[2024/06/24 06:59:52] ppsci INFO: train: epoch 1068 | step 30 | lr 0.000016 | loss 0.021352 | mae 0.108537 -[2024/06/24 06:59:53] ppsci INFO: train: epoch 1068 | step 38 | lr 0.000016 | loss 0.012582 | mae 0.064676 -[2024/06/24 06:59:53] ppsci INFO: epoch: 1068, train_loss: 0.028776, train_metric: 0.124255, eval_loss: 0.056309, eval_mae: 0.153203 -[2024/06/24 06:59:53] ppsci INFO: train: epoch 1069 | step 0 | lr 0.000016 | loss 0.024332 | mae 0.122779 -[2024/06/24 06:59:53] ppsci INFO: train: epoch 1069 | step 10 | lr 0.000016 | loss 0.040557 | mae 0.144212 -[2024/06/24 06:59:54] ppsci INFO: train: epoch 1069 | step 20 | lr 0.000016 | loss 0.032817 | mae 0.133602 -[2024/06/24 06:59:54] ppsci INFO: train: epoch 1069 | step 30 | lr 0.000016 | loss 0.021913 | mae 0.115024 -[2024/06/24 06:59:55] ppsci INFO: train: epoch 1069 | step 38 | lr 0.000016 | loss 0.020114 | mae 0.109052 -[2024/06/24 06:59:55] ppsci INFO: epoch: 1069, train_loss: 0.027767, train_metric: 0.123045, eval_loss: 0.056803, eval_mae: 0.152813 -[2024/06/24 06:59:55] ppsci INFO: train: epoch 1070 | step 0 | lr 0.000016 | loss 0.028699 | mae 0.119439 -[2024/06/24 06:59:56] ppsci INFO: train: epoch 1070 | step 10 | lr 0.000016 | loss 0.026100 | mae 0.122666 -[2024/06/24 06:59:56] ppsci INFO: train: epoch 1070 | step 20 | lr 0.000016 | loss 0.032098 | mae 0.127832 -[2024/06/24 06:59:57] ppsci INFO: train: epoch 1070 | step 30 | lr 0.000016 | loss 0.039680 | mae 0.140011 -[2024/06/24 06:59:57] ppsci INFO: train: epoch 1070 | step 38 | lr 0.000016 | loss 0.035125 | mae 0.152612 -[2024/06/24 06:59:57] ppsci INFO: epoch: 1070, train_loss: 0.030141, train_metric: 0.126951, eval_loss: 0.056195, eval_mae: 0.153088 -[2024/06/24 06:59:57] ppsci INFO: train: epoch 1071 | step 0 | lr 0.000016 | loss 0.020715 | mae 0.114549 -[2024/06/24 06:59:58] ppsci INFO: train: epoch 1071 | step 10 | lr 0.000016 | loss 0.035744 | mae 0.138960 -[2024/06/24 06:59:58] ppsci INFO: train: epoch 1071 | step 20 | lr 0.000016 | loss 0.021870 | mae 0.109013 -[2024/06/24 06:59:59] ppsci INFO: train: epoch 1071 | step 30 | lr 0.000016 | loss 0.025695 | mae 0.127298 -[2024/06/24 06:59:59] ppsci INFO: train: epoch 1071 | step 38 | lr 0.000016 | loss 0.011664 | mae 0.080291 -[2024/06/24 06:59:59] ppsci INFO: epoch: 1071, train_loss: 0.027337, train_metric: 0.124041, eval_loss: 0.056157, eval_mae: 0.152214 -[2024/06/24 06:59:59] ppsci INFO: train: epoch 1072 | step 0 | lr 0.000016 | loss 0.027346 | mae 0.114441 -[2024/06/24 07:00:00] ppsci INFO: train: epoch 1072 | step 10 | lr 0.000016 | loss 0.026178 | mae 0.120526 -[2024/06/24 07:00:00] ppsci INFO: train: epoch 1072 | step 20 | lr 0.000016 | loss 0.031495 | mae 0.130147 -[2024/06/24 07:00:01] ppsci INFO: train: epoch 1072 | step 30 | lr 0.000016 | loss 0.043681 | mae 0.134048 -[2024/06/24 07:00:01] ppsci INFO: train: epoch 1072 | step 38 | lr 0.000016 | loss 0.016528 | mae 0.097226 -[2024/06/24 07:00:01] ppsci INFO: epoch: 1072, train_loss: 0.027977, train_metric: 0.123725, eval_loss: 0.056644, eval_mae: 0.153282 -[2024/06/24 07:00:02] ppsci INFO: train: epoch 1073 | step 0 | lr 0.000016 | loss 0.032983 | mae 0.126621 -[2024/06/24 07:00:02] ppsci INFO: train: epoch 1073 | step 10 | lr 0.000016 | loss 0.017680 | mae 0.105896 -[2024/06/24 07:00:03] ppsci INFO: train: epoch 1073 | step 20 | lr 0.000016 | loss 0.017735 | mae 0.103987 -[2024/06/24 07:00:03] ppsci INFO: train: epoch 1073 | step 30 | lr 0.000016 | loss 0.027365 | mae 0.126224 -[2024/06/24 07:00:04] ppsci INFO: train: epoch 1073 | step 38 | lr 0.000016 | loss 0.024422 | mae 0.110106 -[2024/06/24 07:00:04] ppsci INFO: epoch: 1073, train_loss: 0.028467, train_metric: 0.124262, eval_loss: 0.056324, eval_mae: 0.152284 -[2024/06/24 07:00:04] ppsci INFO: train: epoch 1074 | step 0 | lr 0.000017 | loss 0.023739 | mae 0.111683 -[2024/06/24 07:00:04] ppsci INFO: train: epoch 1074 | step 10 | lr 0.000017 | loss 0.026978 | mae 0.124763 -[2024/06/24 07:00:05] ppsci INFO: train: epoch 1074 | step 20 | lr 0.000017 | loss 0.026042 | mae 0.121994 -[2024/06/24 07:00:05] ppsci INFO: train: epoch 1074 | step 30 | lr 0.000017 | loss 0.024457 | mae 0.114794 -[2024/06/24 07:00:06] ppsci INFO: train: epoch 1074 | step 38 | lr 0.000017 | loss 0.015141 | mae 0.099452 -[2024/06/24 07:00:06] ppsci INFO: epoch: 1074, train_loss: 0.027491, train_metric: 0.122558, eval_loss: 0.056554, eval_mae: 0.152906 -[2024/06/24 07:00:06] ppsci INFO: train: epoch 1075 | step 0 | lr 0.000017 | loss 0.028916 | mae 0.131989 -[2024/06/24 07:00:07] ppsci INFO: train: epoch 1075 | step 10 | lr 0.000017 | loss 0.040665 | mae 0.145521 -[2024/06/24 07:00:07] ppsci INFO: train: epoch 1075 | step 20 | lr 0.000017 | loss 0.022321 | mae 0.115889 -[2024/06/24 07:00:08] ppsci INFO: train: epoch 1075 | step 30 | lr 0.000017 | loss 0.029087 | mae 0.124857 -[2024/06/24 07:00:08] ppsci INFO: train: epoch 1075 | step 38 | lr 0.000017 | loss 0.008069 | mae 0.071101 -[2024/06/24 07:00:08] ppsci INFO: epoch: 1075, train_loss: 0.027491, train_metric: 0.124412, eval_loss: 0.056233, eval_mae: 0.152868 -[2024/06/24 07:00:08] ppsci INFO: train: epoch 1076 | step 0 | lr 0.000017 | loss 0.035994 | mae 0.137866 -[2024/06/24 07:00:09] ppsci INFO: train: epoch 1076 | step 10 | lr 0.000017 | loss 0.026711 | mae 0.118082 -[2024/06/24 07:00:09] ppsci INFO: train: epoch 1076 | step 20 | lr 0.000017 | loss 0.030516 | mae 0.134797 -[2024/06/24 07:00:10] ppsci INFO: train: epoch 1076 | step 30 | lr 0.000017 | loss 0.026937 | mae 0.120724 -[2024/06/24 07:00:10] ppsci INFO: train: epoch 1076 | step 38 | lr 0.000017 | loss 0.020586 | mae 0.114922 -[2024/06/24 07:00:10] ppsci INFO: epoch: 1076, train_loss: 0.027353, train_metric: 0.123307, eval_loss: 0.056652, eval_mae: 0.153361 -[2024/06/24 07:00:10] ppsci INFO: train: epoch 1077 | step 0 | lr 0.000017 | loss 0.035725 | mae 0.146388 -[2024/06/24 07:00:11] ppsci INFO: train: epoch 1077 | step 10 | lr 0.000017 | loss 0.036392 | mae 0.146207 -[2024/06/24 07:00:11] ppsci INFO: train: epoch 1077 | step 20 | lr 0.000017 | loss 0.035878 | mae 0.138478 -[2024/06/24 07:00:12] ppsci INFO: train: epoch 1077 | step 30 | lr 0.000017 | loss 0.022286 | mae 0.119043 -[2024/06/24 07:00:12] ppsci INFO: train: epoch 1077 | step 38 | lr 0.000017 | loss 0.043506 | mae 0.160600 -[2024/06/24 07:00:12] ppsci INFO: epoch: 1077, train_loss: 0.030252, train_metric: 0.126342, eval_loss: 0.057536, eval_mae: 0.153653 -[2024/06/24 07:00:13] ppsci INFO: train: epoch 1078 | step 0 | lr 0.000017 | loss 0.024199 | mae 0.115220 -[2024/06/24 07:00:13] ppsci INFO: train: epoch 1078 | step 10 | lr 0.000017 | loss 0.022698 | mae 0.114132 -[2024/06/24 07:00:14] ppsci INFO: train: epoch 1078 | step 20 | lr 0.000017 | loss 0.021473 | mae 0.110887 -[2024/06/24 07:00:14] ppsci INFO: train: epoch 1078 | step 30 | lr 0.000017 | loss 0.030978 | mae 0.131247 -[2024/06/24 07:00:15] ppsci INFO: train: epoch 1078 | step 38 | lr 0.000017 | loss 0.012366 | mae 0.095526 -[2024/06/24 07:00:15] ppsci INFO: epoch: 1078, train_loss: 0.026941, train_metric: 0.123400, eval_loss: 0.057650, eval_mae: 0.153858 -[2024/06/24 07:00:15] ppsci INFO: train: epoch 1079 | step 0 | lr 0.000018 | loss 0.030156 | mae 0.126057 -[2024/06/24 07:00:15] ppsci INFO: train: epoch 1079 | step 10 | lr 0.000018 | loss 0.029220 | mae 0.128511 -[2024/06/24 07:00:16] ppsci INFO: train: epoch 1079 | step 20 | lr 0.000018 | loss 0.027770 | mae 0.124322 -[2024/06/24 07:00:16] ppsci INFO: train: epoch 1079 | step 30 | lr 0.000018 | loss 0.025599 | mae 0.121653 -[2024/06/24 07:00:17] ppsci INFO: train: epoch 1079 | step 38 | lr 0.000018 | loss 0.022513 | mae 0.107070 -[2024/06/24 07:00:17] ppsci INFO: epoch: 1079, train_loss: 0.027338, train_metric: 0.123518, eval_loss: 0.057626, eval_mae: 0.153537 -[2024/06/24 07:00:17] ppsci INFO: train: epoch 1080 | step 0 | lr 0.000018 | loss 0.032701 | mae 0.132181 -[2024/06/24 07:00:17] ppsci INFO: train: epoch 1080 | step 10 | lr 0.000018 | loss 0.032653 | mae 0.134461 -[2024/06/24 07:00:18] ppsci INFO: train: epoch 1080 | step 20 | lr 0.000018 | loss 0.031478 | mae 0.133021 -[2024/06/24 07:00:18] ppsci INFO: train: epoch 1080 | step 30 | lr 0.000018 | loss 0.021323 | mae 0.112407 -[2024/06/24 07:00:19] ppsci INFO: train: epoch 1080 | step 38 | lr 0.000018 | loss 0.071267 | mae 0.192379 -[2024/06/24 07:00:19] ppsci INFO: epoch: 1080, train_loss: 0.027508, train_metric: 0.122345, eval_loss: 0.057104, eval_mae: 0.152526 -[2024/06/24 07:00:19] ppsci INFO: train: epoch 1081 | step 0 | lr 0.000018 | loss 0.037559 | mae 0.146331 -[2024/06/24 07:00:19] ppsci INFO: train: epoch 1081 | step 10 | lr 0.000018 | loss 0.032051 | mae 0.125175 -[2024/06/24 07:00:20] ppsci INFO: train: epoch 1081 | step 20 | lr 0.000018 | loss 0.029454 | mae 0.129149 -[2024/06/24 07:00:21] ppsci INFO: train: epoch 1081 | step 30 | lr 0.000018 | loss 0.036108 | mae 0.135123 -[2024/06/24 07:00:21] ppsci INFO: train: epoch 1081 | step 38 | lr 0.000018 | loss 0.021110 | mae 0.120466 -[2024/06/24 07:00:21] ppsci INFO: epoch: 1081, train_loss: 0.028223, train_metric: 0.124110, eval_loss: 0.056542, eval_mae: 0.151756 -[2024/06/24 07:00:21] ppsci INFO: train: epoch 1082 | step 0 | lr 0.000018 | loss 0.028282 | mae 0.127220 -[2024/06/24 07:00:22] ppsci INFO: train: epoch 1082 | step 10 | lr 0.000018 | loss 0.026679 | mae 0.122078 -[2024/06/24 07:00:22] ppsci INFO: train: epoch 1082 | step 20 | lr 0.000018 | loss 0.029897 | mae 0.126434 -[2024/06/24 07:00:23] ppsci INFO: train: epoch 1082 | step 30 | lr 0.000018 | loss 0.024329 | mae 0.119578 -[2024/06/24 07:00:23] ppsci INFO: train: epoch 1082 | step 38 | lr 0.000018 | loss 0.021097 | mae 0.091574 -[2024/06/24 07:00:23] ppsci INFO: epoch: 1082, train_loss: 0.029795, train_metric: 0.125306, eval_loss: 0.056190, eval_mae: 0.151653 -[2024/06/24 07:00:23] ppsci INFO: train: epoch 1083 | step 0 | lr 0.000018 | loss 0.027708 | mae 0.121430 -[2024/06/24 07:00:24] ppsci INFO: train: epoch 1083 | step 10 | lr 0.000018 | loss 0.026694 | mae 0.125832 -[2024/06/24 07:00:24] ppsci INFO: train: epoch 1083 | step 20 | lr 0.000018 | loss 0.025815 | mae 0.114615 -[2024/06/24 07:00:25] ppsci INFO: train: epoch 1083 | step 30 | lr 0.000018 | loss 0.028812 | mae 0.125869 -[2024/06/24 07:00:25] ppsci INFO: train: epoch 1083 | step 38 | lr 0.000018 | loss 0.015717 | mae 0.103595 -[2024/06/24 07:00:25] ppsci INFO: epoch: 1083, train_loss: 0.029595, train_metric: 0.125781, eval_loss: 0.056268, eval_mae: 0.152928 -[2024/06/24 07:00:26] ppsci INFO: train: epoch 1084 | step 0 | lr 0.000018 | loss 0.030705 | mae 0.126838 -[2024/06/24 07:00:26] ppsci INFO: train: epoch 1084 | step 10 | lr 0.000018 | loss 0.031061 | mae 0.135488 -[2024/06/24 07:00:27] ppsci INFO: train: epoch 1084 | step 20 | lr 0.000018 | loss 0.027103 | mae 0.118491 -[2024/06/24 07:00:27] ppsci INFO: train: epoch 1084 | step 30 | lr 0.000018 | loss 0.021508 | mae 0.106780 -[2024/06/24 07:00:27] ppsci INFO: train: epoch 1084 | step 38 | lr 0.000018 | loss 0.017417 | mae 0.103318 -[2024/06/24 07:00:27] ppsci INFO: epoch: 1084, train_loss: 0.027744, train_metric: 0.123049, eval_loss: 0.056005, eval_mae: 0.152609 -[2024/06/24 07:00:28] ppsci INFO: train: epoch 1085 | step 0 | lr 0.000019 | loss 0.030800 | mae 0.125534 -[2024/06/24 07:00:28] ppsci INFO: train: epoch 1085 | step 10 | lr 0.000019 | loss 0.029504 | mae 0.124912 -[2024/06/24 07:00:28] ppsci INFO: train: epoch 1085 | step 20 | lr 0.000019 | loss 0.025965 | mae 0.114872 -[2024/06/24 07:00:29] ppsci INFO: train: epoch 1085 | step 30 | lr 0.000019 | loss 0.028337 | mae 0.136548 -[2024/06/24 07:00:29] ppsci INFO: train: epoch 1085 | step 38 | lr 0.000019 | loss 0.025822 | mae 0.110830 -[2024/06/24 07:00:29] ppsci INFO: epoch: 1085, train_loss: 0.029024, train_metric: 0.125980, eval_loss: 0.056770, eval_mae: 0.153598 -[2024/06/24 07:00:30] ppsci INFO: train: epoch 1086 | step 0 | lr 0.000019 | loss 0.034768 | mae 0.124447 -[2024/06/24 07:00:30] ppsci INFO: train: epoch 1086 | step 10 | lr 0.000019 | loss 0.026568 | mae 0.120738 -[2024/06/24 07:00:31] ppsci INFO: train: epoch 1086 | step 20 | lr 0.000019 | loss 0.022184 | mae 0.117730 -[2024/06/24 07:00:31] ppsci INFO: train: epoch 1086 | step 30 | lr 0.000019 | loss 0.024993 | mae 0.117075 -[2024/06/24 07:00:32] ppsci INFO: train: epoch 1086 | step 38 | lr 0.000019 | loss 0.033373 | mae 0.123158 -[2024/06/24 07:00:32] ppsci INFO: epoch: 1086, train_loss: 0.029211, train_metric: 0.123996, eval_loss: 0.055789, eval_mae: 0.153253 -[2024/06/24 07:00:32] ppsci INFO: train: epoch 1087 | step 0 | lr 0.000019 | loss 0.030716 | mae 0.131779 -[2024/06/24 07:00:32] ppsci INFO: train: epoch 1087 | step 10 | lr 0.000019 | loss 0.033432 | mae 0.129653 -[2024/06/24 07:00:33] ppsci INFO: train: epoch 1087 | step 20 | lr 0.000019 | loss 0.031675 | mae 0.129099 -[2024/06/24 07:00:33] ppsci INFO: train: epoch 1087 | step 30 | lr 0.000019 | loss 0.032095 | mae 0.131319 -[2024/06/24 07:00:34] ppsci INFO: train: epoch 1087 | step 38 | lr 0.000019 | loss 0.022716 | mae 0.140632 -[2024/06/24 07:00:34] ppsci INFO: epoch: 1087, train_loss: 0.029191, train_metric: 0.126102, eval_loss: 0.055870, eval_mae: 0.152802 -[2024/06/24 07:00:34] ppsci INFO: train: epoch 1088 | step 0 | lr 0.000019 | loss 0.036167 | mae 0.139059 -[2024/06/24 07:00:35] ppsci INFO: train: epoch 1088 | step 10 | lr 0.000019 | loss 0.029006 | mae 0.126203 -[2024/06/24 07:00:35] ppsci INFO: train: epoch 1088 | step 20 | lr 0.000019 | loss 0.027569 | mae 0.121906 -[2024/06/24 07:00:36] ppsci INFO: train: epoch 1088 | step 30 | lr 0.000019 | loss 0.026468 | mae 0.120483 -[2024/06/24 07:00:36] ppsci INFO: train: epoch 1088 | step 38 | lr 0.000019 | loss 0.026066 | mae 0.098611 -[2024/06/24 07:00:36] ppsci INFO: epoch: 1088, train_loss: 0.029684, train_metric: 0.125557, eval_loss: 0.055603, eval_mae: 0.152406 -[2024/06/24 07:00:36] ppsci INFO: train: epoch 1089 | step 0 | lr 0.000020 | loss 0.026665 | mae 0.118663 -[2024/06/24 07:00:37] ppsci INFO: train: epoch 1089 | step 10 | lr 0.000020 | loss 0.028605 | mae 0.127298 -[2024/06/24 07:00:37] ppsci INFO: train: epoch 1089 | step 20 | lr 0.000020 | loss 0.029204 | mae 0.127683 -[2024/06/24 07:00:38] ppsci INFO: train: epoch 1089 | step 30 | lr 0.000020 | loss 0.020956 | mae 0.114514 -[2024/06/24 07:00:38] ppsci INFO: train: epoch 1089 | step 38 | lr 0.000020 | loss 0.016009 | mae 0.106262 -[2024/06/24 07:00:38] ppsci INFO: epoch: 1089, train_loss: 0.028370, train_metric: 0.125379, eval_loss: 0.057109, eval_mae: 0.153163 -[2024/06/24 07:00:38] ppsci INFO: train: epoch 1090 | step 0 | lr 0.000020 | loss 0.033147 | mae 0.137450 -[2024/06/24 07:00:39] ppsci INFO: train: epoch 1090 | step 10 | lr 0.000020 | loss 0.040040 | mae 0.155242 -[2024/06/24 07:00:39] ppsci INFO: train: epoch 1090 | step 20 | lr 0.000020 | loss 0.028518 | mae 0.124862 -[2024/06/24 07:00:40] ppsci INFO: train: epoch 1090 | step 30 | lr 0.000020 | loss 0.024938 | mae 0.118347 -[2024/06/24 07:00:40] ppsci INFO: train: epoch 1090 | step 38 | lr 0.000020 | loss 0.037871 | mae 0.144029 -[2024/06/24 07:00:40] ppsci INFO: epoch: 1090, train_loss: 0.029499, train_metric: 0.125444, eval_loss: 0.056985, eval_mae: 0.152714 -[2024/06/24 07:00:40] ppsci INFO: train: epoch 1091 | step 0 | lr 0.000020 | loss 0.025772 | mae 0.104595 -[2024/06/24 07:00:41] ppsci INFO: train: epoch 1091 | step 10 | lr 0.000020 | loss 0.022731 | mae 0.111339 -[2024/06/24 07:00:41] ppsci INFO: train: epoch 1091 | step 20 | lr 0.000020 | loss 0.033290 | mae 0.135520 -[2024/06/24 07:00:42] ppsci INFO: train: epoch 1091 | step 30 | lr 0.000020 | loss 0.041779 | mae 0.149319 -[2024/06/24 07:00:42] ppsci INFO: train: epoch 1091 | step 38 | lr 0.000020 | loss 0.021722 | mae 0.116712 -[2024/06/24 07:00:42] ppsci INFO: epoch: 1091, train_loss: 0.028279, train_metric: 0.123974, eval_loss: 0.057494, eval_mae: 0.153917 -[2024/06/24 07:00:43] ppsci INFO: train: epoch 1092 | step 0 | lr 0.000020 | loss 0.027066 | mae 0.125025 -[2024/06/24 07:00:43] ppsci INFO: train: epoch 1092 | step 10 | lr 0.000020 | loss 0.032372 | mae 0.135312 -[2024/06/24 07:00:44] ppsci INFO: train: epoch 1092 | step 20 | lr 0.000020 | loss 0.027911 | mae 0.126193 -[2024/06/24 07:00:44] ppsci INFO: train: epoch 1092 | step 30 | lr 0.000020 | loss 0.023323 | mae 0.120959 -[2024/06/24 07:00:45] ppsci INFO: train: epoch 1092 | step 38 | lr 0.000020 | loss 0.056078 | mae 0.178612 -[2024/06/24 07:00:45] ppsci INFO: epoch: 1092, train_loss: 0.028556, train_metric: 0.123758, eval_loss: 0.057055, eval_mae: 0.152853 -[2024/06/24 07:00:45] ppsci INFO: train: epoch 1093 | step 0 | lr 0.000020 | loss 0.033306 | mae 0.130932 -[2024/06/24 07:00:45] ppsci INFO: train: epoch 1093 | step 10 | lr 0.000020 | loss 0.031994 | mae 0.127897 -[2024/06/24 07:00:46] ppsci INFO: train: epoch 1093 | step 20 | lr 0.000020 | loss 0.034143 | mae 0.137592 -[2024/06/24 07:00:46] ppsci INFO: train: epoch 1093 | step 30 | lr 0.000020 | loss 0.030692 | mae 0.124917 -[2024/06/24 07:00:47] ppsci INFO: train: epoch 1093 | step 38 | lr 0.000020 | loss 0.024228 | mae 0.124246 -[2024/06/24 07:00:47] ppsci INFO: epoch: 1093, train_loss: 0.028409, train_metric: 0.124739, eval_loss: 0.056901, eval_mae: 0.153777 -[2024/06/24 07:00:47] ppsci INFO: train: epoch 1094 | step 0 | lr 0.000021 | loss 0.028647 | mae 0.124657 -[2024/06/24 07:00:47] ppsci INFO: train: epoch 1094 | step 10 | lr 0.000021 | loss 0.029234 | mae 0.124410 -[2024/06/24 07:00:48] ppsci INFO: train: epoch 1094 | step 20 | lr 0.000021 | loss 0.025251 | mae 0.123284 -[2024/06/24 07:00:48] ppsci INFO: train: epoch 1094 | step 30 | lr 0.000021 | loss 0.026314 | mae 0.121368 -[2024/06/24 07:00:49] ppsci INFO: train: epoch 1094 | step 38 | lr 0.000021 | loss 0.006220 | mae 0.065934 -[2024/06/24 07:00:49] ppsci INFO: epoch: 1094, train_loss: 0.030171, train_metric: 0.127613, eval_loss: 0.057300, eval_mae: 0.153482 -[2024/06/24 07:00:49] ppsci INFO: train: epoch 1095 | step 0 | lr 0.000021 | loss 0.031444 | mae 0.130161 -[2024/06/24 07:00:49] ppsci INFO: train: epoch 1095 | step 10 | lr 0.000021 | loss 0.023523 | mae 0.114701 -[2024/06/24 07:00:50] ppsci INFO: train: epoch 1095 | step 20 | lr 0.000021 | loss 0.025522 | mae 0.128157 -[2024/06/24 07:00:50] ppsci INFO: train: epoch 1095 | step 30 | lr 0.000021 | loss 0.025844 | mae 0.121605 -[2024/06/24 07:00:51] ppsci INFO: train: epoch 1095 | step 38 | lr 0.000021 | loss 0.022300 | mae 0.092358 -[2024/06/24 07:00:51] ppsci INFO: epoch: 1095, train_loss: 0.027814, train_metric: 0.124387, eval_loss: 0.056729, eval_mae: 0.152359 -[2024/06/24 07:00:51] ppsci INFO: train: epoch 1096 | step 0 | lr 0.000021 | loss 0.029599 | mae 0.140437 -[2024/06/24 07:00:52] ppsci INFO: train: epoch 1096 | step 10 | lr 0.000021 | loss 0.034408 | mae 0.123373 -[2024/06/24 07:00:52] ppsci INFO: train: epoch 1096 | step 20 | lr 0.000021 | loss 0.027121 | mae 0.123281 -[2024/06/24 07:00:53] ppsci INFO: train: epoch 1096 | step 30 | lr 0.000021 | loss 0.027483 | mae 0.127091 -[2024/06/24 07:00:53] ppsci INFO: train: epoch 1096 | step 38 | lr 0.000021 | loss 0.041122 | mae 0.144826 -[2024/06/24 07:00:53] ppsci INFO: epoch: 1096, train_loss: 0.028195, train_metric: 0.123400, eval_loss: 0.057256, eval_mae: 0.153597 -[2024/06/24 07:00:53] ppsci INFO: train: epoch 1097 | step 0 | lr 0.000021 | loss 0.028702 | mae 0.118463 -[2024/06/24 07:00:54] ppsci INFO: train: epoch 1097 | step 10 | lr 0.000021 | loss 0.029109 | mae 0.130602 -[2024/06/24 07:00:54] ppsci INFO: train: epoch 1097 | step 20 | lr 0.000021 | loss 0.028426 | mae 0.124141 -[2024/06/24 07:00:55] ppsci INFO: train: epoch 1097 | step 30 | lr 0.000021 | loss 0.026244 | mae 0.121058 -[2024/06/24 07:00:55] ppsci INFO: train: epoch 1097 | step 38 | lr 0.000021 | loss 0.012816 | mae 0.090979 -[2024/06/24 07:00:55] ppsci INFO: epoch: 1097, train_loss: 0.028247, train_metric: 0.124434, eval_loss: 0.057306, eval_mae: 0.153197 -[2024/06/24 07:00:56] ppsci INFO: train: epoch 1098 | step 0 | lr 0.000022 | loss 0.031112 | mae 0.132424 -[2024/06/24 07:00:56] ppsci INFO: train: epoch 1098 | step 10 | lr 0.000022 | loss 0.035266 | mae 0.144260 -[2024/06/24 07:00:57] ppsci INFO: train: epoch 1098 | step 20 | lr 0.000022 | loss 0.032464 | mae 0.120705 -[2024/06/24 07:00:57] ppsci INFO: train: epoch 1098 | step 30 | lr 0.000022 | loss 0.029984 | mae 0.121461 -[2024/06/24 07:00:58] ppsci INFO: train: epoch 1098 | step 38 | lr 0.000022 | loss 0.038023 | mae 0.139480 -[2024/06/24 07:00:58] ppsci INFO: epoch: 1098, train_loss: 0.028354, train_metric: 0.123600, eval_loss: 0.058130, eval_mae: 0.154314 -[2024/06/24 07:00:58] ppsci INFO: train: epoch 1099 | step 0 | lr 0.000022 | loss 0.025456 | mae 0.121642 -[2024/06/24 07:00:58] ppsci INFO: train: epoch 1099 | step 10 | lr 0.000022 | loss 0.023045 | mae 0.111023 -[2024/06/24 07:00:59] ppsci INFO: train: epoch 1099 | step 20 | lr 0.000022 | loss 0.027929 | mae 0.127280 -[2024/06/24 07:00:59] ppsci INFO: train: epoch 1099 | step 30 | lr 0.000022 | loss 0.024862 | mae 0.114663 -[2024/06/24 07:01:00] ppsci INFO: train: epoch 1099 | step 38 | lr 0.000022 | loss 0.036604 | mae 0.145113 -[2024/06/24 07:01:00] ppsci INFO: epoch: 1099, train_loss: 0.029021, train_metric: 0.125674, eval_loss: 0.058471, eval_mae: 0.154963 -[2024/06/24 07:01:00] ppsci INFO: train: epoch 1100 | step 0 | lr 0.000022 | loss 0.029813 | mae 0.127298 -[2024/06/24 07:01:00] ppsci INFO: train: epoch 1100 | step 10 | lr 0.000022 | loss 0.036252 | mae 0.133015 -[2024/06/24 07:01:01] ppsci INFO: train: epoch 1100 | step 20 | lr 0.000022 | loss 0.024839 | mae 0.116316 -[2024/06/24 07:01:02] ppsci INFO: train: epoch 1100 | step 30 | lr 0.000022 | loss 0.035846 | mae 0.127445 -[2024/06/24 07:01:02] ppsci INFO: train: epoch 1100 | step 38 | lr 0.000022 | loss 0.016143 | mae 0.106914 -[2024/06/24 07:01:02] ppsci INFO: epoch: 1100, train_loss: 0.028544, train_metric: 0.123349, eval_loss: 0.058301, eval_mae: 0.154796 -[2024/06/24 07:01:02] ppsci INFO: train: epoch 1101 | step 0 | lr 0.000022 | loss 0.030908 | mae 0.129658 -[2024/06/24 07:01:03] ppsci INFO: train: epoch 1101 | step 10 | lr 0.000022 | loss 0.022518 | mae 0.108306 -[2024/06/24 07:01:03] ppsci INFO: train: epoch 1101 | step 20 | lr 0.000022 | loss 0.028411 | mae 0.123717 -[2024/06/24 07:01:04] ppsci INFO: train: epoch 1101 | step 30 | lr 0.000022 | loss 0.032518 | mae 0.141257 -[2024/06/24 07:01:04] ppsci INFO: train: epoch 1101 | step 38 | lr 0.000022 | loss 0.032181 | mae 0.140779 -[2024/06/24 07:01:04] ppsci INFO: epoch: 1101, train_loss: 0.027862, train_metric: 0.124286, eval_loss: 0.058196, eval_mae: 0.154765 -[2024/06/24 07:01:04] ppsci INFO: train: epoch 1102 | step 0 | lr 0.000022 | loss 0.031321 | mae 0.130698 -[2024/06/24 07:01:05] ppsci INFO: train: epoch 1102 | step 10 | lr 0.000022 | loss 0.040630 | mae 0.143882 -[2024/06/24 07:01:05] ppsci INFO: train: epoch 1102 | step 20 | lr 0.000022 | loss 0.022369 | mae 0.108115 -[2024/06/24 07:01:06] ppsci INFO: train: epoch 1102 | step 30 | lr 0.000022 | loss 0.023462 | mae 0.119502 -[2024/06/24 07:01:06] ppsci INFO: train: epoch 1102 | step 38 | lr 0.000022 | loss 0.051303 | mae 0.113260 -[2024/06/24 07:01:06] ppsci INFO: epoch: 1102, train_loss: 0.030255, train_metric: 0.125958, eval_loss: 0.056671, eval_mae: 0.154443 -[2024/06/24 07:01:06] ppsci INFO: train: epoch 1103 | step 0 | lr 0.000023 | loss 0.030951 | mae 0.133397 -[2024/06/24 07:01:07] ppsci INFO: train: epoch 1103 | step 10 | lr 0.000023 | loss 0.025180 | mae 0.119842 -[2024/06/24 07:01:07] ppsci INFO: train: epoch 1103 | step 20 | lr 0.000023 | loss 0.037385 | mae 0.142032 -[2024/06/24 07:01:08] ppsci INFO: train: epoch 1103 | step 30 | lr 0.000023 | loss 0.033476 | mae 0.136618 -[2024/06/24 07:01:08] ppsci INFO: train: epoch 1103 | step 38 | lr 0.000023 | loss 0.020698 | mae 0.108680 -[2024/06/24 07:01:08] ppsci INFO: epoch: 1103, train_loss: 0.028093, train_metric: 0.124382, eval_loss: 0.056794, eval_mae: 0.152910 -[2024/06/24 07:01:08] ppsci INFO: train: epoch 1104 | step 0 | lr 0.000023 | loss 0.031439 | mae 0.125879 -[2024/06/24 07:01:09] ppsci INFO: train: epoch 1104 | step 10 | lr 0.000023 | loss 0.033412 | mae 0.129871 -[2024/06/24 07:01:10] ppsci INFO: train: epoch 1104 | step 20 | lr 0.000023 | loss 0.023921 | mae 0.114667 -[2024/06/24 07:01:10] ppsci INFO: train: epoch 1104 | step 30 | lr 0.000023 | loss 0.027450 | mae 0.114972 -[2024/06/24 07:01:10] ppsci INFO: train: epoch 1104 | step 38 | lr 0.000023 | loss 0.014148 | mae 0.084721 -[2024/06/24 07:01:11] ppsci INFO: epoch: 1104, train_loss: 0.028961, train_metric: 0.124090, eval_loss: 0.057294, eval_mae: 0.154343 -[2024/06/24 07:01:11] ppsci INFO: train: epoch 1105 | step 0 | lr 0.000023 | loss 0.043478 | mae 0.147764 -[2024/06/24 07:01:11] ppsci INFO: train: epoch 1105 | step 10 | lr 0.000023 | loss 0.026309 | mae 0.123602 -[2024/06/24 07:01:12] ppsci INFO: train: epoch 1105 | step 20 | lr 0.000023 | loss 0.027363 | mae 0.128448 -[2024/06/24 07:01:12] ppsci INFO: train: epoch 1105 | step 30 | lr 0.000023 | loss 0.027450 | mae 0.112928 -[2024/06/24 07:01:13] ppsci INFO: train: epoch 1105 | step 38 | lr 0.000023 | loss 0.031506 | mae 0.142233 -[2024/06/24 07:01:13] ppsci INFO: epoch: 1105, train_loss: 0.029785, train_metric: 0.126287, eval_loss: 0.056980, eval_mae: 0.152456 -[2024/06/24 07:01:13] ppsci INFO: train: epoch 1106 | step 0 | lr 0.000023 | loss 0.028304 | mae 0.130036 -[2024/06/24 07:01:13] ppsci INFO: train: epoch 1106 | step 10 | lr 0.000023 | loss 0.019547 | mae 0.111467 -[2024/06/24 07:01:14] ppsci INFO: train: epoch 1106 | step 20 | lr 0.000023 | loss 0.037382 | mae 0.140711 -[2024/06/24 07:01:14] ppsci INFO: train: epoch 1106 | step 30 | lr 0.000023 | loss 0.030027 | mae 0.124459 -[2024/06/24 07:01:15] ppsci INFO: train: epoch 1106 | step 38 | lr 0.000023 | loss 0.042121 | mae 0.121319 -[2024/06/24 07:01:15] ppsci INFO: epoch: 1106, train_loss: 0.028488, train_metric: 0.124080, eval_loss: 0.057554, eval_mae: 0.153999 -[2024/06/24 07:01:15] ppsci INFO: train: epoch 1107 | step 0 | lr 0.000024 | loss 0.030595 | mae 0.127122 -[2024/06/24 07:01:15] ppsci INFO: train: epoch 1107 | step 10 | lr 0.000024 | loss 0.021144 | mae 0.113468 -[2024/06/24 07:01:16] ppsci INFO: train: epoch 1107 | step 20 | lr 0.000024 | loss 0.017461 | mae 0.099950 -[2024/06/24 07:01:16] ppsci INFO: train: epoch 1107 | step 30 | lr 0.000024 | loss 0.027656 | mae 0.131843 -[2024/06/24 07:01:17] ppsci INFO: train: epoch 1107 | step 38 | lr 0.000024 | loss 0.037032 | mae 0.148245 -[2024/06/24 07:01:17] ppsci INFO: epoch: 1107, train_loss: 0.029344, train_metric: 0.123825, eval_loss: 0.057456, eval_mae: 0.153327 -[2024/06/24 07:01:17] ppsci INFO: train: epoch 1108 | step 0 | lr 0.000024 | loss 0.034792 | mae 0.128240 -[2024/06/24 07:01:18] ppsci INFO: train: epoch 1108 | step 10 | lr 0.000024 | loss 0.041208 | mae 0.141341 -[2024/06/24 07:01:18] ppsci INFO: train: epoch 1108 | step 20 | lr 0.000024 | loss 0.022635 | mae 0.115625 -[2024/06/24 07:01:19] ppsci INFO: train: epoch 1108 | step 30 | lr 0.000024 | loss 0.037451 | mae 0.141722 -[2024/06/24 07:01:19] ppsci INFO: train: epoch 1108 | step 38 | lr 0.000024 | loss 0.018067 | mae 0.104668 -[2024/06/24 07:01:19] ppsci INFO: epoch: 1108, train_loss: 0.028978, train_metric: 0.126270, eval_loss: 0.057133, eval_mae: 0.153781 -[2024/06/24 07:01:19] ppsci INFO: train: epoch 1109 | step 0 | lr 0.000024 | loss 0.027838 | mae 0.121462 -[2024/06/24 07:01:20] ppsci INFO: train: epoch 1109 | step 10 | lr 0.000024 | loss 0.021741 | mae 0.117326 -[2024/06/24 07:01:20] ppsci INFO: train: epoch 1109 | step 20 | lr 0.000024 | loss 0.035181 | mae 0.127080 -[2024/06/24 07:01:21] ppsci INFO: train: epoch 1109 | step 30 | lr 0.000024 | loss 0.024767 | mae 0.117791 -[2024/06/24 07:01:21] ppsci INFO: train: epoch 1109 | step 38 | lr 0.000024 | loss 0.049743 | mae 0.143078 -[2024/06/24 07:01:21] ppsci INFO: epoch: 1109, train_loss: 0.029019, train_metric: 0.124785, eval_loss: 0.056707, eval_mae: 0.153500 -[2024/06/24 07:01:22] ppsci INFO: train: epoch 1110 | step 0 | lr 0.000024 | loss 0.022639 | mae 0.108277 -[2024/06/24 07:01:22] ppsci INFO: train: epoch 1110 | step 10 | lr 0.000024 | loss 0.028551 | mae 0.126023 -[2024/06/24 07:01:22] ppsci INFO: train: epoch 1110 | step 20 | lr 0.000024 | loss 0.033961 | mae 0.128053 -[2024/06/24 07:01:23] ppsci INFO: train: epoch 1110 | step 30 | lr 0.000024 | loss 0.026314 | mae 0.114441 -[2024/06/24 07:01:23] ppsci INFO: train: epoch 1110 | step 38 | lr 0.000024 | loss 0.010570 | mae 0.087755 -[2024/06/24 07:01:23] ppsci INFO: epoch: 1110, train_loss: 0.028229, train_metric: 0.124221, eval_loss: 0.056196, eval_mae: 0.152792 -[2024/06/24 07:01:24] ppsci INFO: train: epoch 1111 | step 0 | lr 0.000025 | loss 0.030094 | mae 0.129396 -[2024/06/24 07:01:24] ppsci INFO: train: epoch 1111 | step 10 | lr 0.000025 | loss 0.029204 | mae 0.130808 -[2024/06/24 07:01:25] ppsci INFO: train: epoch 1111 | step 20 | lr 0.000025 | loss 0.032672 | mae 0.137801 -[2024/06/24 07:01:25] ppsci INFO: train: epoch 1111 | step 30 | lr 0.000025 | loss 0.040971 | mae 0.145018 -[2024/06/24 07:01:26] ppsci INFO: train: epoch 1111 | step 38 | lr 0.000025 | loss 0.019944 | mae 0.120745 -[2024/06/24 07:01:26] ppsci INFO: epoch: 1111, train_loss: 0.029218, train_metric: 0.125172, eval_loss: 0.057064, eval_mae: 0.154046 -[2024/06/24 07:01:26] ppsci INFO: train: epoch 1112 | step 0 | lr 0.000025 | loss 0.026138 | mae 0.113510 -[2024/06/24 07:01:26] ppsci INFO: train: epoch 1112 | step 10 | lr 0.000025 | loss 0.024089 | mae 0.117362 -[2024/06/24 07:01:27] ppsci INFO: train: epoch 1112 | step 20 | lr 0.000025 | loss 0.023550 | mae 0.115996 -[2024/06/24 07:01:27] ppsci INFO: train: epoch 1112 | step 30 | lr 0.000025 | loss 0.027193 | mae 0.127985 -[2024/06/24 07:01:28] ppsci INFO: train: epoch 1112 | step 38 | lr 0.000025 | loss 0.021926 | mae 0.119538 -[2024/06/24 07:01:28] ppsci INFO: epoch: 1112, train_loss: 0.029153, train_metric: 0.123686, eval_loss: 0.056910, eval_mae: 0.154738 -[2024/06/24 07:01:28] ppsci INFO: train: epoch 1113 | step 0 | lr 0.000025 | loss 0.026666 | mae 0.122630 -[2024/06/24 07:01:28] ppsci INFO: train: epoch 1113 | step 10 | lr 0.000025 | loss 0.027041 | mae 0.118110 -[2024/06/24 07:01:29] ppsci INFO: train: epoch 1113 | step 20 | lr 0.000025 | loss 0.027486 | mae 0.118670 -[2024/06/24 07:01:29] ppsci INFO: train: epoch 1113 | step 30 | lr 0.000025 | loss 0.022956 | mae 0.112885 -[2024/06/24 07:01:30] ppsci INFO: train: epoch 1113 | step 38 | lr 0.000025 | loss 0.042300 | mae 0.162028 -[2024/06/24 07:01:30] ppsci INFO: epoch: 1113, train_loss: 0.029110, train_metric: 0.124603, eval_loss: 0.056416, eval_mae: 0.152919 -[2024/06/24 07:01:30] ppsci INFO: train: epoch 1114 | step 0 | lr 0.000026 | loss 0.025729 | mae 0.121311 -[2024/06/24 07:01:31] ppsci INFO: train: epoch 1114 | step 10 | lr 0.000026 | loss 0.032234 | mae 0.131894 -[2024/06/24 07:01:31] ppsci INFO: train: epoch 1114 | step 20 | lr 0.000026 | loss 0.027088 | mae 0.123597 -[2024/06/24 07:01:32] ppsci INFO: train: epoch 1114 | step 30 | lr 0.000026 | loss 0.027501 | mae 0.125613 -[2024/06/24 07:01:32] ppsci INFO: train: epoch 1114 | step 38 | lr 0.000026 | loss 0.038479 | mae 0.177416 -[2024/06/24 07:01:32] ppsci INFO: epoch: 1114, train_loss: 0.028034, train_metric: 0.123739, eval_loss: 0.055754, eval_mae: 0.152843 -[2024/06/24 07:01:32] ppsci INFO: train: epoch 1115 | step 0 | lr 0.000026 | loss 0.034539 | mae 0.128632 -[2024/06/24 07:01:33] ppsci INFO: train: epoch 1115 | step 10 | lr 0.000026 | loss 0.023416 | mae 0.108989 -[2024/06/24 07:01:33] ppsci INFO: train: epoch 1115 | step 20 | lr 0.000026 | loss 0.035748 | mae 0.134065 -[2024/06/24 07:01:34] ppsci INFO: train: epoch 1115 | step 30 | lr 0.000026 | loss 0.022198 | mae 0.112801 -[2024/06/24 07:01:34] ppsci INFO: train: epoch 1115 | step 38 | lr 0.000026 | loss 0.055099 | mae 0.164522 -[2024/06/24 07:01:34] ppsci INFO: epoch: 1115, train_loss: 0.030319, train_metric: 0.125899, eval_loss: 0.056404, eval_mae: 0.153636 -[2024/06/24 07:01:34] ppsci INFO: train: epoch 1116 | step 0 | lr 0.000026 | loss 0.020136 | mae 0.113043 -[2024/06/24 07:01:35] ppsci INFO: train: epoch 1116 | step 10 | lr 0.000026 | loss 0.024049 | mae 0.115552 -[2024/06/24 07:01:35] ppsci INFO: train: epoch 1116 | step 20 | lr 0.000026 | loss 0.025393 | mae 0.120188 -[2024/06/24 07:01:36] ppsci INFO: train: epoch 1116 | step 30 | lr 0.000026 | loss 0.021995 | mae 0.109310 -[2024/06/24 07:01:36] ppsci INFO: train: epoch 1116 | step 38 | lr 0.000026 | loss 0.022628 | mae 0.132267 -[2024/06/24 07:01:36] ppsci INFO: epoch: 1116, train_loss: 0.027490, train_metric: 0.122018, eval_loss: 0.056375, eval_mae: 0.153023 -[2024/06/24 07:01:36] ppsci INFO: train: epoch 1117 | step 0 | lr 0.000026 | loss 0.027534 | mae 0.122722 -[2024/06/24 07:01:37] ppsci INFO: train: epoch 1117 | step 10 | lr 0.000026 | loss 0.035918 | mae 0.131042 -[2024/06/24 07:01:37] ppsci INFO: train: epoch 1117 | step 20 | lr 0.000026 | loss 0.029413 | mae 0.125793 -[2024/06/24 07:01:38] ppsci INFO: train: epoch 1117 | step 30 | lr 0.000026 | loss 0.027686 | mae 0.122301 -[2024/06/24 07:01:38] ppsci INFO: train: epoch 1117 | step 38 | lr 0.000026 | loss 0.019795 | mae 0.116882 -[2024/06/24 07:01:38] ppsci INFO: epoch: 1117, train_loss: 0.030114, train_metric: 0.127894, eval_loss: 0.055014, eval_mae: 0.152396 -[2024/06/24 07:01:39] ppsci INFO: train: epoch 1118 | step 0 | lr 0.000027 | loss 0.028845 | mae 0.124774 -[2024/06/24 07:01:39] ppsci INFO: train: epoch 1118 | step 10 | lr 0.000027 | loss 0.018403 | mae 0.107388 -[2024/06/24 07:01:40] ppsci INFO: train: epoch 1118 | step 20 | lr 0.000027 | loss 0.029188 | mae 0.126987 -[2024/06/24 07:01:40] ppsci INFO: train: epoch 1118 | step 30 | lr 0.000027 | loss 0.024543 | mae 0.121489 -[2024/06/24 07:01:41] ppsci INFO: train: epoch 1118 | step 38 | lr 0.000027 | loss 0.024894 | mae 0.111715 -[2024/06/24 07:01:41] ppsci INFO: epoch: 1118, train_loss: 0.028886, train_metric: 0.124920, eval_loss: 0.055601, eval_mae: 0.154008 -[2024/06/24 07:01:41] ppsci INFO: train: epoch 1119 | step 0 | lr 0.000027 | loss 0.026160 | mae 0.121042 -[2024/06/24 07:01:41] ppsci INFO: train: epoch 1119 | step 10 | lr 0.000027 | loss 0.030943 | mae 0.129582 -[2024/06/24 07:01:42] ppsci INFO: train: epoch 1119 | step 20 | lr 0.000027 | loss 0.022596 | mae 0.111611 -[2024/06/24 07:01:42] ppsci INFO: train: epoch 1119 | step 30 | lr 0.000027 | loss 0.036629 | mae 0.136138 -[2024/06/24 07:01:43] ppsci INFO: train: epoch 1119 | step 38 | lr 0.000027 | loss 0.029398 | mae 0.144406 -[2024/06/24 07:01:43] ppsci INFO: epoch: 1119, train_loss: 0.029214, train_metric: 0.125291, eval_loss: 0.055877, eval_mae: 0.153537 -[2024/06/24 07:01:43] ppsci INFO: train: epoch 1120 | step 0 | lr 0.000027 | loss 0.028146 | mae 0.121152 -[2024/06/24 07:01:43] ppsci INFO: train: epoch 1120 | step 10 | lr 0.000027 | loss 0.027180 | mae 0.123522 -[2024/06/24 07:01:44] ppsci INFO: train: epoch 1120 | step 20 | lr 0.000027 | loss 0.025516 | mae 0.126873 -[2024/06/24 07:01:44] ppsci INFO: train: epoch 1120 | step 30 | lr 0.000027 | loss 0.027971 | mae 0.127722 -[2024/06/24 07:01:45] ppsci INFO: train: epoch 1120 | step 38 | lr 0.000027 | loss 0.046647 | mae 0.147275 -[2024/06/24 07:01:45] ppsci INFO: epoch: 1120, train_loss: 0.029116, train_metric: 0.124492, eval_loss: 0.055895, eval_mae: 0.152261 -[2024/06/24 07:01:45] ppsci INFO: train: epoch 1121 | step 0 | lr 0.000027 | loss 0.023683 | mae 0.118545 -[2024/06/24 07:01:46] ppsci INFO: train: epoch 1121 | step 10 | lr 0.000027 | loss 0.027018 | mae 0.130126 -[2024/06/24 07:01:46] ppsci INFO: train: epoch 1121 | step 20 | lr 0.000027 | loss 0.022715 | mae 0.114952 -[2024/06/24 07:01:47] ppsci INFO: train: epoch 1121 | step 30 | lr 0.000027 | loss 0.027499 | mae 0.124889 -[2024/06/24 07:01:47] ppsci INFO: train: epoch 1121 | step 38 | lr 0.000027 | loss 0.035220 | mae 0.154571 -[2024/06/24 07:01:47] ppsci INFO: epoch: 1121, train_loss: 0.028528, train_metric: 0.124378, eval_loss: 0.056523, eval_mae: 0.154521 -[2024/06/24 07:01:47] ppsci INFO: train: epoch 1122 | step 0 | lr 0.000028 | loss 0.024477 | mae 0.118483 -[2024/06/24 07:01:48] ppsci INFO: train: epoch 1122 | step 10 | lr 0.000028 | loss 0.031725 | mae 0.136848 -[2024/06/24 07:01:48] ppsci INFO: train: epoch 1122 | step 20 | lr 0.000028 | loss 0.026903 | mae 0.131770 -[2024/06/24 07:01:49] ppsci INFO: train: epoch 1122 | step 30 | lr 0.000028 | loss 0.034282 | mae 0.144107 -[2024/06/24 07:01:49] ppsci INFO: train: epoch 1122 | step 38 | lr 0.000028 | loss 0.014618 | mae 0.105809 -[2024/06/24 07:01:49] ppsci INFO: epoch: 1122, train_loss: 0.028000, train_metric: 0.124198, eval_loss: 0.055647, eval_mae: 0.153227 -[2024/06/24 07:01:49] ppsci INFO: train: epoch 1123 | step 0 | lr 0.000028 | loss 0.027024 | mae 0.121208 -[2024/06/24 07:01:50] ppsci INFO: train: epoch 1123 | step 10 | lr 0.000028 | loss 0.030306 | mae 0.130664 -[2024/06/24 07:01:50] ppsci INFO: train: epoch 1123 | step 20 | lr 0.000028 | loss 0.027886 | mae 0.126520 -[2024/06/24 07:01:51] ppsci INFO: train: epoch 1123 | step 30 | lr 0.000028 | loss 0.032566 | mae 0.134073 -[2024/06/24 07:01:51] ppsci INFO: train: epoch 1123 | step 38 | lr 0.000028 | loss 0.025203 | mae 0.122965 -[2024/06/24 07:01:51] ppsci INFO: epoch: 1123, train_loss: 0.026545, train_metric: 0.120759, eval_loss: 0.055315, eval_mae: 0.153682 -[2024/06/24 07:01:52] ppsci INFO: train: epoch 1124 | step 0 | lr 0.000028 | loss 0.027343 | mae 0.124545 -[2024/06/24 07:01:52] ppsci INFO: train: epoch 1124 | step 10 | lr 0.000028 | loss 0.030284 | mae 0.126699 -[2024/06/24 07:01:53] ppsci INFO: train: epoch 1124 | step 20 | lr 0.000028 | loss 0.029056 | mae 0.129757 -[2024/06/24 07:01:53] ppsci INFO: train: epoch 1124 | step 30 | lr 0.000028 | loss 0.021259 | mae 0.114011 -[2024/06/24 07:01:53] ppsci INFO: train: epoch 1124 | step 38 | lr 0.000028 | loss 0.019120 | mae 0.107921 -[2024/06/24 07:01:54] ppsci INFO: epoch: 1124, train_loss: 0.028792, train_metric: 0.126105, eval_loss: 0.054679, eval_mae: 0.151987 -[2024/06/24 07:01:54] ppsci INFO: train: epoch 1125 | step 0 | lr 0.000029 | loss 0.026656 | mae 0.127333 -[2024/06/24 07:01:54] ppsci INFO: train: epoch 1125 | step 10 | lr 0.000029 | loss 0.025176 | mae 0.119390 -[2024/06/24 07:01:55] ppsci INFO: train: epoch 1125 | step 20 | lr 0.000029 | loss 0.028300 | mae 0.124820 -[2024/06/24 07:01:56] ppsci INFO: train: epoch 1125 | step 30 | lr 0.000029 | loss 0.026632 | mae 0.124508 -[2024/06/24 07:01:56] ppsci INFO: train: epoch 1125 | step 38 | lr 0.000029 | loss 0.008305 | mae 0.082229 -[2024/06/24 07:01:56] ppsci INFO: epoch: 1125, train_loss: 0.027782, train_metric: 0.123609, eval_loss: 0.056957, eval_mae: 0.154011 -[2024/06/24 07:01:56] ppsci INFO: train: epoch 1126 | step 0 | lr 0.000029 | loss 0.026447 | mae 0.121574 -[2024/06/24 07:01:57] ppsci INFO: train: epoch 1126 | step 10 | lr 0.000029 | loss 0.022765 | mae 0.114380 -[2024/06/24 07:01:57] ppsci INFO: train: epoch 1126 | step 20 | lr 0.000029 | loss 0.021601 | mae 0.112308 -[2024/06/24 07:01:58] ppsci INFO: train: epoch 1126 | step 30 | lr 0.000029 | loss 0.033836 | mae 0.132338 -[2024/06/24 07:01:58] ppsci INFO: train: epoch 1126 | step 38 | lr 0.000029 | loss 0.023168 | mae 0.126696 -[2024/06/24 07:01:58] ppsci INFO: epoch: 1126, train_loss: 0.030057, train_metric: 0.126218, eval_loss: 0.056512, eval_mae: 0.154257 -[2024/06/24 07:01:58] ppsci INFO: train: epoch 1127 | step 0 | lr 0.000029 | loss 0.018515 | mae 0.104873 -[2024/06/24 07:01:59] ppsci INFO: train: epoch 1127 | step 10 | lr 0.000029 | loss 0.041298 | mae 0.145148 -[2024/06/24 07:01:59] ppsci INFO: train: epoch 1127 | step 20 | lr 0.000029 | loss 0.028458 | mae 0.129178 -[2024/06/24 07:02:00] ppsci INFO: train: epoch 1127 | step 30 | lr 0.000029 | loss 0.022417 | mae 0.116261 -[2024/06/24 07:02:00] ppsci INFO: train: epoch 1127 | step 38 | lr 0.000029 | loss 0.026145 | mae 0.132365 -[2024/06/24 07:02:00] ppsci INFO: epoch: 1127, train_loss: 0.027701, train_metric: 0.123335, eval_loss: 0.055632, eval_mae: 0.153188 -[2024/06/24 07:02:00] ppsci INFO: train: epoch 1128 | step 0 | lr 0.000030 | loss 0.029822 | mae 0.119062 -[2024/06/24 07:02:01] ppsci INFO: train: epoch 1128 | step 10 | lr 0.000030 | loss 0.036006 | mae 0.133805 -[2024/06/24 07:02:01] ppsci INFO: train: epoch 1128 | step 20 | lr 0.000030 | loss 0.032195 | mae 0.127764 -[2024/06/24 07:02:02] ppsci INFO: train: epoch 1128 | step 30 | lr 0.000030 | loss 0.036360 | mae 0.140119 -[2024/06/24 07:02:02] ppsci INFO: train: epoch 1128 | step 38 | lr 0.000030 | loss 0.018180 | mae 0.104943 -[2024/06/24 07:02:02] ppsci INFO: epoch: 1128, train_loss: 0.027796, train_metric: 0.123990, eval_loss: 0.056238, eval_mae: 0.152558 -[2024/06/24 07:02:02] ppsci INFO: train: epoch 1129 | step 0 | lr 0.000030 | loss 0.021364 | mae 0.108263 -[2024/06/24 07:02:03] ppsci INFO: train: epoch 1129 | step 10 | lr 0.000030 | loss 0.026453 | mae 0.120683 -[2024/06/24 07:02:03] ppsci INFO: train: epoch 1129 | step 20 | lr 0.000030 | loss 0.028791 | mae 0.128345 -[2024/06/24 07:02:04] ppsci INFO: train: epoch 1129 | step 30 | lr 0.000030 | loss 0.024888 | mae 0.115382 -[2024/06/24 07:02:04] ppsci INFO: train: epoch 1129 | step 38 | lr 0.000030 | loss 0.034475 | mae 0.138433 -[2024/06/24 07:02:04] ppsci INFO: epoch: 1129, train_loss: 0.027330, train_metric: 0.121918, eval_loss: 0.056335, eval_mae: 0.154172 -[2024/06/24 07:02:04] ppsci INFO: train: epoch 1130 | step 0 | lr 0.000030 | loss 0.037344 | mae 0.145423 -[2024/06/24 07:02:05] ppsci INFO: train: epoch 1130 | step 10 | lr 0.000030 | loss 0.024047 | mae 0.118363 -[2024/06/24 07:02:06] ppsci INFO: train: epoch 1130 | step 20 | lr 0.000030 | loss 0.025737 | mae 0.116063 -[2024/06/24 07:02:06] ppsci INFO: train: epoch 1130 | step 30 | lr 0.000030 | loss 0.021041 | mae 0.105243 -[2024/06/24 07:02:06] ppsci INFO: train: epoch 1130 | step 38 | lr 0.000030 | loss 0.038703 | mae 0.147374 -[2024/06/24 07:02:07] ppsci INFO: epoch: 1130, train_loss: 0.029705, train_metric: 0.126250, eval_loss: 0.057027, eval_mae: 0.154582 -[2024/06/24 07:02:07] ppsci INFO: train: epoch 1131 | step 0 | lr 0.000030 | loss 0.027717 | mae 0.130812 -[2024/06/24 07:02:07] ppsci INFO: train: epoch 1131 | step 10 | lr 0.000030 | loss 0.028532 | mae 0.121428 -[2024/06/24 07:02:08] ppsci INFO: train: epoch 1131 | step 20 | lr 0.000030 | loss 0.029384 | mae 0.131086 -[2024/06/24 07:02:08] ppsci INFO: train: epoch 1131 | step 30 | lr 0.000030 | loss 0.025665 | mae 0.122287 -[2024/06/24 07:02:09] ppsci INFO: train: epoch 1131 | step 38 | lr 0.000030 | loss 0.055484 | mae 0.158419 -[2024/06/24 07:02:09] ppsci INFO: epoch: 1131, train_loss: 0.027926, train_metric: 0.123082, eval_loss: 0.055977, eval_mae: 0.153085 -[2024/06/24 07:02:09] ppsci INFO: train: epoch 1132 | step 0 | lr 0.000031 | loss 0.034257 | mae 0.136458 -[2024/06/24 07:02:09] ppsci INFO: train: epoch 1132 | step 10 | lr 0.000031 | loss 0.032847 | mae 0.133069 -[2024/06/24 07:02:10] ppsci INFO: train: epoch 1132 | step 20 | lr 0.000031 | loss 0.023190 | mae 0.122612 -[2024/06/24 07:02:10] ppsci INFO: train: epoch 1132 | step 30 | lr 0.000031 | loss 0.031021 | mae 0.130807 -[2024/06/24 07:02:11] ppsci INFO: train: epoch 1132 | step 38 | lr 0.000031 | loss 0.032160 | mae 0.141381 -[2024/06/24 07:02:11] ppsci INFO: epoch: 1132, train_loss: 0.027902, train_metric: 0.124255, eval_loss: 0.053943, eval_mae: 0.151842 -[2024/06/24 07:02:11] ppsci INFO: train: epoch 1133 | step 0 | lr 0.000031 | loss 0.028991 | mae 0.126756 -[2024/06/24 07:02:12] ppsci INFO: train: epoch 1133 | step 10 | lr 0.000031 | loss 0.029645 | mae 0.126481 -[2024/06/24 07:02:12] ppsci INFO: train: epoch 1133 | step 20 | lr 0.000031 | loss 0.032784 | mae 0.137059 -[2024/06/24 07:02:13] ppsci INFO: train: epoch 1133 | step 30 | lr 0.000031 | loss 0.027325 | mae 0.127887 -[2024/06/24 07:02:13] ppsci INFO: train: epoch 1133 | step 38 | lr 0.000031 | loss 0.088329 | mae 0.221526 -[2024/06/24 07:02:13] ppsci INFO: epoch: 1133, train_loss: 0.031638, train_metric: 0.129069, eval_loss: 0.054883, eval_mae: 0.152773 -[2024/06/24 07:02:13] ppsci INFO: train: epoch 1134 | step 0 | lr 0.000031 | loss 0.039242 | mae 0.132828 -[2024/06/24 07:02:14] ppsci INFO: train: epoch 1134 | step 10 | lr 0.000031 | loss 0.040319 | mae 0.136228 -[2024/06/24 07:02:14] ppsci INFO: train: epoch 1134 | step 20 | lr 0.000031 | loss 0.042819 | mae 0.132796 -[2024/06/24 07:02:15] ppsci INFO: train: epoch 1134 | step 30 | lr 0.000031 | loss 0.020658 | mae 0.108258 -[2024/06/24 07:02:15] ppsci INFO: train: epoch 1134 | step 38 | lr 0.000031 | loss 0.050545 | mae 0.180643 -[2024/06/24 07:02:15] ppsci INFO: epoch: 1134, train_loss: 0.027932, train_metric: 0.121353, eval_loss: 0.055057, eval_mae: 0.152479 -[2024/06/24 07:02:15] ppsci INFO: train: epoch 1135 | step 0 | lr 0.000032 | loss 0.023695 | mae 0.117229 -[2024/06/24 07:02:16] ppsci INFO: train: epoch 1135 | step 10 | lr 0.000032 | loss 0.022469 | mae 0.121111 -[2024/06/24 07:02:17] ppsci INFO: train: epoch 1135 | step 20 | lr 0.000032 | loss 0.027018 | mae 0.129353 -[2024/06/24 07:02:17] ppsci INFO: train: epoch 1135 | step 30 | lr 0.000032 | loss 0.034289 | mae 0.131138 -[2024/06/24 07:02:17] ppsci INFO: train: epoch 1135 | step 38 | lr 0.000032 | loss 0.017293 | mae 0.102439 -[2024/06/24 07:02:17] ppsci INFO: epoch: 1135, train_loss: 0.027120, train_metric: 0.123006, eval_loss: 0.055016, eval_mae: 0.152221 -[2024/06/24 07:02:18] ppsci INFO: train: epoch 1136 | step 0 | lr 0.000032 | loss 0.021510 | mae 0.105897 -[2024/06/24 07:02:18] ppsci INFO: train: epoch 1136 | step 10 | lr 0.000032 | loss 0.053639 | mae 0.134614 -[2024/06/24 07:02:19] ppsci INFO: train: epoch 1136 | step 20 | lr 0.000032 | loss 0.025008 | mae 0.114776 -[2024/06/24 07:02:19] ppsci INFO: train: epoch 1136 | step 30 | lr 0.000032 | loss 0.036107 | mae 0.134982 -[2024/06/24 07:02:20] ppsci INFO: train: epoch 1136 | step 38 | lr 0.000032 | loss 0.029215 | mae 0.109490 -[2024/06/24 07:02:20] ppsci INFO: epoch: 1136, train_loss: 0.030142, train_metric: 0.125555, eval_loss: 0.056706, eval_mae: 0.152737 -[2024/06/24 07:02:20] ppsci INFO: train: epoch 1137 | step 0 | lr 0.000032 | loss 0.034039 | mae 0.138902 -[2024/06/24 07:02:20] ppsci INFO: train: epoch 1137 | step 10 | lr 0.000032 | loss 0.027176 | mae 0.126116 -[2024/06/24 07:02:21] ppsci INFO: train: epoch 1137 | step 20 | lr 0.000032 | loss 0.024494 | mae 0.122145 -[2024/06/24 07:02:21] ppsci INFO: train: epoch 1137 | step 30 | lr 0.000032 | loss 0.022859 | mae 0.111361 -[2024/06/24 07:02:22] ppsci INFO: train: epoch 1137 | step 38 | lr 0.000032 | loss 0.040704 | mae 0.141464 -[2024/06/24 07:02:22] ppsci INFO: epoch: 1137, train_loss: 0.028954, train_metric: 0.125000, eval_loss: 0.056523, eval_mae: 0.152651 -[2024/06/24 07:02:22] ppsci INFO: train: epoch 1138 | step 0 | lr 0.000033 | loss 0.027334 | mae 0.118370 -[2024/06/24 07:02:23] ppsci INFO: train: epoch 1138 | step 10 | lr 0.000033 | loss 0.031191 | mae 0.127052 -[2024/06/24 07:02:23] ppsci INFO: train: epoch 1138 | step 20 | lr 0.000033 | loss 0.024654 | mae 0.126370 -[2024/06/24 07:02:24] ppsci INFO: train: epoch 1138 | step 30 | lr 0.000033 | loss 0.028088 | mae 0.128002 -[2024/06/24 07:02:24] ppsci INFO: train: epoch 1138 | step 38 | lr 0.000033 | loss 0.020727 | mae 0.107240 -[2024/06/24 07:02:24] ppsci INFO: epoch: 1138, train_loss: 0.028516, train_metric: 0.124415, eval_loss: 0.055287, eval_mae: 0.151482 -[2024/06/24 07:02:24] ppsci INFO: train: epoch 1139 | step 0 | lr 0.000033 | loss 0.029666 | mae 0.123505 -[2024/06/24 07:02:25] ppsci INFO: train: epoch 1139 | step 10 | lr 0.000033 | loss 0.030553 | mae 0.132586 -[2024/06/24 07:02:26] ppsci INFO: train: epoch 1139 | step 20 | lr 0.000033 | loss 0.024195 | mae 0.114548 -[2024/06/24 07:02:26] ppsci INFO: train: epoch 1139 | step 30 | lr 0.000033 | loss 0.027001 | mae 0.126362 -[2024/06/24 07:02:26] ppsci INFO: train: epoch 1139 | step 38 | lr 0.000033 | loss 0.018082 | mae 0.104978 -[2024/06/24 07:02:27] ppsci INFO: epoch: 1139, train_loss: 0.027559, train_metric: 0.122776, eval_loss: 0.055473, eval_mae: 0.153887 -[2024/06/24 07:02:27] ppsci INFO: train: epoch 1140 | step 0 | lr 0.000033 | loss 0.027802 | mae 0.130534 -[2024/06/24 07:02:27] ppsci INFO: train: epoch 1140 | step 10 | lr 0.000033 | loss 0.032632 | mae 0.140760 -[2024/06/24 07:02:28] ppsci INFO: train: epoch 1140 | step 20 | lr 0.000033 | loss 0.022630 | mae 0.117997 -[2024/06/24 07:02:28] ppsci INFO: train: epoch 1140 | step 30 | lr 0.000033 | loss 0.025527 | mae 0.121744 -[2024/06/24 07:02:29] ppsci INFO: train: epoch 1140 | step 38 | lr 0.000033 | loss 0.024148 | mae 0.119292 -[2024/06/24 07:02:29] ppsci INFO: epoch: 1140, train_loss: 0.028084, train_metric: 0.124296, eval_loss: 0.055559, eval_mae: 0.152582 -[2024/06/24 07:02:29] ppsci INFO: train: epoch 1141 | step 0 | lr 0.000034 | loss 0.026323 | mae 0.124104 -[2024/06/24 07:02:29] ppsci INFO: train: epoch 1141 | step 10 | lr 0.000034 | loss 0.034860 | mae 0.132932 -[2024/06/24 07:02:30] ppsci INFO: train: epoch 1141 | step 20 | lr 0.000034 | loss 0.021845 | mae 0.112156 -[2024/06/24 07:02:31] ppsci INFO: train: epoch 1141 | step 30 | lr 0.000034 | loss 0.029812 | mae 0.121972 -[2024/06/24 07:02:31] ppsci INFO: train: epoch 1141 | step 38 | lr 0.000034 | loss 0.030861 | mae 0.146917 -[2024/06/24 07:02:31] ppsci INFO: epoch: 1141, train_loss: 0.028380, train_metric: 0.123746, eval_loss: 0.056073, eval_mae: 0.152673 -[2024/06/24 07:02:31] ppsci INFO: train: epoch 1142 | step 0 | lr 0.000034 | loss 0.020668 | mae 0.108848 -[2024/06/24 07:02:32] ppsci INFO: train: epoch 1142 | step 10 | lr 0.000034 | loss 0.039451 | mae 0.139639 -[2024/06/24 07:02:32] ppsci INFO: train: epoch 1142 | step 20 | lr 0.000034 | loss 0.027627 | mae 0.122931 -[2024/06/24 07:02:33] ppsci INFO: train: epoch 1142 | step 30 | lr 0.000034 | loss 0.026973 | mae 0.120521 -[2024/06/24 07:02:33] ppsci INFO: train: epoch 1142 | step 38 | lr 0.000034 | loss 0.013465 | mae 0.096552 -[2024/06/24 07:02:33] ppsci INFO: epoch: 1142, train_loss: 0.027811, train_metric: 0.123683, eval_loss: 0.055896, eval_mae: 0.152265 -[2024/06/24 07:02:33] ppsci INFO: train: epoch 1143 | step 0 | lr 0.000034 | loss 0.019274 | mae 0.105607 -[2024/06/24 07:02:34] ppsci INFO: train: epoch 1143 | step 10 | lr 0.000034 | loss 0.031496 | mae 0.134124 -[2024/06/24 07:02:34] ppsci INFO: train: epoch 1143 | step 20 | lr 0.000034 | loss 0.025924 | mae 0.122503 -[2024/06/24 07:02:35] ppsci INFO: train: epoch 1143 | step 30 | lr 0.000034 | loss 0.029923 | mae 0.122119 -[2024/06/24 07:02:35] ppsci INFO: train: epoch 1143 | step 38 | lr 0.000034 | loss 0.016931 | mae 0.105529 -[2024/06/24 07:02:35] ppsci INFO: epoch: 1143, train_loss: 0.028617, train_metric: 0.124701, eval_loss: 0.053884, eval_mae: 0.150995 -[2024/06/24 07:02:35] ppsci INFO: train: epoch 1144 | step 0 | lr 0.000035 | loss 0.035863 | mae 0.141368 -[2024/06/24 07:02:36] ppsci INFO: train: epoch 1144 | step 10 | lr 0.000035 | loss 0.039907 | mae 0.145465 -[2024/06/24 07:02:36] ppsci INFO: train: epoch 1144 | step 20 | lr 0.000035 | loss 0.031842 | mae 0.129731 -[2024/06/24 07:02:37] ppsci INFO: train: epoch 1144 | step 30 | lr 0.000035 | loss 0.037181 | mae 0.142732 -[2024/06/24 07:02:37] ppsci INFO: train: epoch 1144 | step 38 | lr 0.000035 | loss 0.011830 | mae 0.083199 -[2024/06/24 07:02:37] ppsci INFO: epoch: 1144, train_loss: 0.027513, train_metric: 0.123378, eval_loss: 0.053885, eval_mae: 0.150217 -[2024/06/24 07:02:37] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:02:37] ppsci INFO: train: epoch 1145 | step 0 | lr 0.000035 | loss 0.026375 | mae 0.126473 -[2024/06/24 07:02:38] ppsci INFO: train: epoch 1145 | step 10 | lr 0.000035 | loss 0.027476 | mae 0.117939 -[2024/06/24 07:02:38] ppsci INFO: train: epoch 1145 | step 20 | lr 0.000035 | loss 0.030774 | mae 0.131345 -[2024/06/24 07:02:39] ppsci INFO: train: epoch 1145 | step 30 | lr 0.000035 | loss 0.034031 | mae 0.132831 -[2024/06/24 07:02:39] ppsci INFO: train: epoch 1145 | step 38 | lr 0.000035 | loss 0.024267 | mae 0.136897 -[2024/06/24 07:02:39] ppsci INFO: epoch: 1145, train_loss: 0.027571, train_metric: 0.121563, eval_loss: 0.054182, eval_mae: 0.150970 -[2024/06/24 07:02:39] ppsci INFO: train: epoch 1146 | step 0 | lr 0.000035 | loss 0.032669 | mae 0.131929 -[2024/06/24 07:02:40] ppsci INFO: train: epoch 1146 | step 10 | lr 0.000035 | loss 0.024940 | mae 0.120182 -[2024/06/24 07:02:40] ppsci INFO: train: epoch 1146 | step 20 | lr 0.000035 | loss 0.024311 | mae 0.116572 -[2024/06/24 07:02:41] ppsci INFO: train: epoch 1146 | step 30 | lr 0.000035 | loss 0.033818 | mae 0.124122 -[2024/06/24 07:02:41] ppsci INFO: train: epoch 1146 | step 38 | lr 0.000035 | loss 0.023491 | mae 0.138847 -[2024/06/24 07:02:41] ppsci INFO: epoch: 1146, train_loss: 0.027109, train_metric: 0.122963, eval_loss: 0.053812, eval_mae: 0.150525 -[2024/06/24 07:02:41] ppsci INFO: train: epoch 1147 | step 0 | lr 0.000036 | loss 0.024227 | mae 0.121159 -[2024/06/24 07:02:42] ppsci INFO: train: epoch 1147 | step 10 | lr 0.000036 | loss 0.035377 | mae 0.137604 -[2024/06/24 07:02:43] ppsci INFO: train: epoch 1147 | step 20 | lr 0.000036 | loss 0.026866 | mae 0.116780 -[2024/06/24 07:02:43] ppsci INFO: train: epoch 1147 | step 30 | lr 0.000036 | loss 0.020854 | mae 0.107255 -[2024/06/24 07:02:43] ppsci INFO: train: epoch 1147 | step 38 | lr 0.000036 | loss 0.044058 | mae 0.142385 -[2024/06/24 07:02:44] ppsci INFO: epoch: 1147, train_loss: 0.029406, train_metric: 0.124643, eval_loss: 0.054921, eval_mae: 0.151799 -[2024/06/24 07:02:44] ppsci INFO: train: epoch 1148 | step 0 | lr 0.000036 | loss 0.035358 | mae 0.140783 -[2024/06/24 07:02:44] ppsci INFO: train: epoch 1148 | step 10 | lr 0.000036 | loss 0.032123 | mae 0.142637 -[2024/06/24 07:02:45] ppsci INFO: train: epoch 1148 | step 20 | lr 0.000036 | loss 0.025950 | mae 0.120186 -[2024/06/24 07:02:45] ppsci INFO: train: epoch 1148 | step 30 | lr 0.000036 | loss 0.039627 | mae 0.136013 -[2024/06/24 07:02:46] ppsci INFO: train: epoch 1148 | step 38 | lr 0.000036 | loss 0.017323 | mae 0.099030 -[2024/06/24 07:02:46] ppsci INFO: epoch: 1148, train_loss: 0.028711, train_metric: 0.124632, eval_loss: 0.055188, eval_mae: 0.152080 -[2024/06/24 07:02:46] ppsci INFO: train: epoch 1149 | step 0 | lr 0.000036 | loss 0.023693 | mae 0.117510 -[2024/06/24 07:02:46] ppsci INFO: train: epoch 1149 | step 10 | lr 0.000036 | loss 0.019988 | mae 0.112744 -[2024/06/24 07:02:47] ppsci INFO: train: epoch 1149 | step 20 | lr 0.000036 | loss 0.035359 | mae 0.132758 -[2024/06/24 07:02:47] ppsci INFO: train: epoch 1149 | step 30 | lr 0.000036 | loss 0.029915 | mae 0.123003 -[2024/06/24 07:02:48] ppsci INFO: train: epoch 1149 | step 38 | lr 0.000036 | loss 0.044867 | mae 0.140851 -[2024/06/24 07:02:48] ppsci INFO: epoch: 1149, train_loss: 0.027750, train_metric: 0.121330, eval_loss: 0.055357, eval_mae: 0.151014 -[2024/06/24 07:02:48] ppsci INFO: train: epoch 1150 | step 0 | lr 0.000037 | loss 0.033047 | mae 0.132480 -[2024/06/24 07:02:48] ppsci INFO: train: epoch 1150 | step 10 | lr 0.000037 | loss 0.031279 | mae 0.128636 -[2024/06/24 07:02:49] ppsci INFO: train: epoch 1150 | step 20 | lr 0.000037 | loss 0.032615 | mae 0.133375 -[2024/06/24 07:02:50] ppsci INFO: train: epoch 1150 | step 30 | lr 0.000037 | loss 0.021099 | mae 0.107939 -[2024/06/24 07:02:50] ppsci INFO: train: epoch 1150 | step 38 | lr 0.000037 | loss 0.030273 | mae 0.123373 -[2024/06/24 07:02:50] ppsci INFO: epoch: 1150, train_loss: 0.028457, train_metric: 0.123318, eval_loss: 0.055140, eval_mae: 0.152284 -[2024/06/24 07:02:50] ppsci INFO: train: epoch 1151 | step 0 | lr 0.000037 | loss 0.033252 | mae 0.113246 -[2024/06/24 07:02:51] ppsci INFO: train: epoch 1151 | step 10 | lr 0.000037 | loss 0.031445 | mae 0.138493 -[2024/06/24 07:02:51] ppsci INFO: train: epoch 1151 | step 20 | lr 0.000037 | loss 0.022945 | mae 0.116621 -[2024/06/24 07:02:52] ppsci INFO: train: epoch 1151 | step 30 | lr 0.000037 | loss 0.026112 | mae 0.119584 -[2024/06/24 07:02:52] ppsci INFO: train: epoch 1151 | step 38 | lr 0.000037 | loss 0.046574 | mae 0.185435 -[2024/06/24 07:02:52] ppsci INFO: epoch: 1151, train_loss: 0.027917, train_metric: 0.122010, eval_loss: 0.055486, eval_mae: 0.153010 -[2024/06/24 07:02:52] ppsci INFO: train: epoch 1152 | step 0 | lr 0.000037 | loss 0.029982 | mae 0.135290 -[2024/06/24 07:02:53] ppsci INFO: train: epoch 1152 | step 10 | lr 0.000037 | loss 0.024531 | mae 0.111532 -[2024/06/24 07:02:53] ppsci INFO: train: epoch 1152 | step 20 | lr 0.000037 | loss 0.036740 | mae 0.137310 -[2024/06/24 07:02:54] ppsci INFO: train: epoch 1152 | step 30 | lr 0.000037 | loss 0.025777 | mae 0.120363 -[2024/06/24 07:02:54] ppsci INFO: train: epoch 1152 | step 38 | lr 0.000037 | loss 0.037780 | mae 0.120027 -[2024/06/24 07:02:54] ppsci INFO: epoch: 1152, train_loss: 0.028829, train_metric: 0.124814, eval_loss: 0.056549, eval_mae: 0.152811 -[2024/06/24 07:02:54] ppsci INFO: train: epoch 1153 | step 0 | lr 0.000038 | loss 0.038026 | mae 0.134340 -[2024/06/24 07:02:55] ppsci INFO: train: epoch 1153 | step 10 | lr 0.000038 | loss 0.021467 | mae 0.107963 -[2024/06/24 07:02:55] ppsci INFO: train: epoch 1153 | step 20 | lr 0.000038 | loss 0.030772 | mae 0.120359 -[2024/06/24 07:02:56] ppsci INFO: train: epoch 1153 | step 30 | lr 0.000038 | loss 0.033029 | mae 0.142402 -[2024/06/24 07:02:56] ppsci INFO: train: epoch 1153 | step 38 | lr 0.000038 | loss 0.034624 | mae 0.127939 -[2024/06/24 07:02:56] ppsci INFO: epoch: 1153, train_loss: 0.030189, train_metric: 0.125392, eval_loss: 0.056055, eval_mae: 0.151688 -[2024/06/24 07:02:56] ppsci INFO: train: epoch 1154 | step 0 | lr 0.000038 | loss 0.035783 | mae 0.129845 -[2024/06/24 07:02:57] ppsci INFO: train: epoch 1154 | step 10 | lr 0.000038 | loss 0.024151 | mae 0.121932 -[2024/06/24 07:02:57] ppsci INFO: train: epoch 1154 | step 20 | lr 0.000038 | loss 0.024455 | mae 0.121352 -[2024/06/24 07:02:58] ppsci INFO: train: epoch 1154 | step 30 | lr 0.000038 | loss 0.033090 | mae 0.140376 -[2024/06/24 07:02:58] ppsci INFO: train: epoch 1154 | step 38 | lr 0.000038 | loss 0.017888 | mae 0.109753 -[2024/06/24 07:02:58] ppsci INFO: epoch: 1154, train_loss: 0.027964, train_metric: 0.124903, eval_loss: 0.055574, eval_mae: 0.151616 -[2024/06/24 07:02:59] ppsci INFO: train: epoch 1155 | step 0 | lr 0.000038 | loss 0.030934 | mae 0.126765 -[2024/06/24 07:02:59] ppsci INFO: train: epoch 1155 | step 10 | lr 0.000038 | loss 0.035451 | mae 0.143845 -[2024/06/24 07:02:59] ppsci INFO: train: epoch 1155 | step 20 | lr 0.000038 | loss 0.022561 | mae 0.114328 -[2024/06/24 07:03:00] ppsci INFO: train: epoch 1155 | step 30 | lr 0.000038 | loss 0.020617 | mae 0.112345 -[2024/06/24 07:03:00] ppsci INFO: train: epoch 1155 | step 38 | lr 0.000038 | loss 0.016558 | mae 0.102808 -[2024/06/24 07:03:01] ppsci INFO: epoch: 1155, train_loss: 0.028927, train_metric: 0.125664, eval_loss: 0.056188, eval_mae: 0.154908 -[2024/06/24 07:03:01] ppsci INFO: train: epoch 1156 | step 0 | lr 0.000039 | loss 0.025810 | mae 0.117838 -[2024/06/24 07:03:01] ppsci INFO: train: epoch 1156 | step 10 | lr 0.000039 | loss 0.023612 | mae 0.117088 -[2024/06/24 07:03:02] ppsci INFO: train: epoch 1156 | step 20 | lr 0.000039 | loss 0.022405 | mae 0.119658 -[2024/06/24 07:03:02] ppsci INFO: train: epoch 1156 | step 30 | lr 0.000039 | loss 0.028296 | mae 0.125549 -[2024/06/24 07:03:03] ppsci INFO: train: epoch 1156 | step 38 | lr 0.000039 | loss 0.009297 | mae 0.080853 -[2024/06/24 07:03:03] ppsci INFO: epoch: 1156, train_loss: 0.027215, train_metric: 0.122061, eval_loss: 0.055095, eval_mae: 0.153714 -[2024/06/24 07:03:03] ppsci INFO: train: epoch 1157 | step 0 | lr 0.000039 | loss 0.025393 | mae 0.119100 -[2024/06/24 07:03:03] ppsci INFO: train: epoch 1157 | step 10 | lr 0.000039 | loss 0.035668 | mae 0.132428 -[2024/06/24 07:03:04] ppsci INFO: train: epoch 1157 | step 20 | lr 0.000039 | loss 0.030290 | mae 0.133730 -[2024/06/24 07:03:04] ppsci INFO: train: epoch 1157 | step 30 | lr 0.000039 | loss 0.022996 | mae 0.117564 -[2024/06/24 07:03:05] ppsci INFO: train: epoch 1157 | step 38 | lr 0.000039 | loss 0.024211 | mae 0.104535 -[2024/06/24 07:03:05] ppsci INFO: epoch: 1157, train_loss: 0.027374, train_metric: 0.122587, eval_loss: 0.056072, eval_mae: 0.154003 -[2024/06/24 07:03:05] ppsci INFO: train: epoch 1158 | step 0 | lr 0.000040 | loss 0.034708 | mae 0.121924 -[2024/06/24 07:03:05] ppsci INFO: train: epoch 1158 | step 10 | lr 0.000040 | loss 0.023423 | mae 0.116989 -[2024/06/24 07:03:06] ppsci INFO: train: epoch 1158 | step 20 | lr 0.000040 | loss 0.026681 | mae 0.119363 -[2024/06/24 07:03:06] ppsci INFO: train: epoch 1158 | step 30 | lr 0.000040 | loss 0.025745 | mae 0.120998 -[2024/06/24 07:03:07] ppsci INFO: train: epoch 1158 | step 38 | lr 0.000040 | loss 0.033794 | mae 0.108336 -[2024/06/24 07:03:07] ppsci INFO: epoch: 1158, train_loss: 0.028291, train_metric: 0.122634, eval_loss: 0.057749, eval_mae: 0.153827 -[2024/06/24 07:03:07] ppsci INFO: train: epoch 1159 | step 0 | lr 0.000040 | loss 0.028576 | mae 0.128730 -[2024/06/24 07:03:08] ppsci INFO: train: epoch 1159 | step 10 | lr 0.000040 | loss 0.035317 | mae 0.140748 -[2024/06/24 07:03:08] ppsci INFO: train: epoch 1159 | step 20 | lr 0.000040 | loss 0.026664 | mae 0.124202 -[2024/06/24 07:03:09] ppsci INFO: train: epoch 1159 | step 30 | lr 0.000040 | loss 0.026706 | mae 0.127018 -[2024/06/24 07:03:09] ppsci INFO: train: epoch 1159 | step 38 | lr 0.000040 | loss 0.041026 | mae 0.152951 -[2024/06/24 07:03:09] ppsci INFO: epoch: 1159, train_loss: 0.030113, train_metric: 0.127727, eval_loss: 0.057492, eval_mae: 0.153270 -[2024/06/24 07:03:09] ppsci INFO: train: epoch 1160 | step 0 | lr 0.000040 | loss 0.036179 | mae 0.132122 -[2024/06/24 07:03:10] ppsci INFO: train: epoch 1160 | step 10 | lr 0.000040 | loss 0.026918 | mae 0.125110 -[2024/06/24 07:03:10] ppsci INFO: train: epoch 1160 | step 20 | lr 0.000040 | loss 0.023377 | mae 0.117725 -[2024/06/24 07:03:11] ppsci INFO: train: epoch 1160 | step 30 | lr 0.000040 | loss 0.029422 | mae 0.135602 -[2024/06/24 07:03:11] ppsci INFO: train: epoch 1160 | step 38 | lr 0.000040 | loss 0.026142 | mae 0.116211 -[2024/06/24 07:03:11] ppsci INFO: epoch: 1160, train_loss: 0.027952, train_metric: 0.123763, eval_loss: 0.055527, eval_mae: 0.151809 -[2024/06/24 07:03:12] ppsci INFO: train: epoch 1161 | step 0 | lr 0.000041 | loss 0.029061 | mae 0.123387 -[2024/06/24 07:03:12] ppsci INFO: train: epoch 1161 | step 10 | lr 0.000041 | loss 0.023756 | mae 0.117415 -[2024/06/24 07:03:13] ppsci INFO: train: epoch 1161 | step 20 | lr 0.000041 | loss 0.019853 | mae 0.100531 -[2024/06/24 07:03:13] ppsci INFO: train: epoch 1161 | step 30 | lr 0.000041 | loss 0.017569 | mae 0.101557 -[2024/06/24 07:03:14] ppsci INFO: train: epoch 1161 | step 38 | lr 0.000041 | loss 0.020666 | mae 0.120522 -[2024/06/24 07:03:14] ppsci INFO: epoch: 1161, train_loss: 0.027455, train_metric: 0.121528, eval_loss: 0.055802, eval_mae: 0.152489 -[2024/06/24 07:03:14] ppsci INFO: train: epoch 1162 | step 0 | lr 0.000041 | loss 0.032813 | mae 0.134262 -[2024/06/24 07:03:14] ppsci INFO: train: epoch 1162 | step 10 | lr 0.000041 | loss 0.029764 | mae 0.122096 -[2024/06/24 07:03:15] ppsci INFO: train: epoch 1162 | step 20 | lr 0.000041 | loss 0.027386 | mae 0.129371 -[2024/06/24 07:03:15] ppsci INFO: train: epoch 1162 | step 30 | lr 0.000041 | loss 0.018152 | mae 0.109364 -[2024/06/24 07:03:16] ppsci INFO: train: epoch 1162 | step 38 | lr 0.000041 | loss 0.020161 | mae 0.094192 -[2024/06/24 07:03:16] ppsci INFO: epoch: 1162, train_loss: 0.033312, train_metric: 0.125694, eval_loss: 0.056325, eval_mae: 0.153173 -[2024/06/24 07:03:16] ppsci INFO: train: epoch 1163 | step 0 | lr 0.000041 | loss 0.037771 | mae 0.146726 -[2024/06/24 07:03:16] ppsci INFO: train: epoch 1163 | step 10 | lr 0.000041 | loss 0.032604 | mae 0.130777 -[2024/06/24 07:03:17] ppsci INFO: train: epoch 1163 | step 20 | lr 0.000041 | loss 0.034223 | mae 0.135680 -[2024/06/24 07:03:18] ppsci INFO: train: epoch 1163 | step 30 | lr 0.000041 | loss 0.025243 | mae 0.114194 -[2024/06/24 07:03:18] ppsci INFO: train: epoch 1163 | step 38 | lr 0.000041 | loss 0.041598 | mae 0.159373 -[2024/06/24 07:03:18] ppsci INFO: epoch: 1163, train_loss: 0.030218, train_metric: 0.125812, eval_loss: 0.055741, eval_mae: 0.153815 -[2024/06/24 07:03:18] ppsci INFO: train: epoch 1164 | step 0 | lr 0.000042 | loss 0.039583 | mae 0.142192 -[2024/06/24 07:03:19] ppsci INFO: train: epoch 1164 | step 10 | lr 0.000042 | loss 0.026785 | mae 0.124690 -[2024/06/24 07:03:19] ppsci INFO: train: epoch 1164 | step 20 | lr 0.000042 | loss 0.027467 | mae 0.114792 -[2024/06/24 07:03:20] ppsci INFO: train: epoch 1164 | step 30 | lr 0.000042 | loss 0.043983 | mae 0.149275 -[2024/06/24 07:03:20] ppsci INFO: train: epoch 1164 | step 38 | lr 0.000042 | loss 0.021424 | mae 0.124768 -[2024/06/24 07:03:21] ppsci INFO: epoch: 1164, train_loss: 0.029805, train_metric: 0.125352, eval_loss: 0.055785, eval_mae: 0.154330 -[2024/06/24 07:03:21] ppsci INFO: train: epoch 1165 | step 0 | lr 0.000042 | loss 0.025235 | mae 0.121961 -[2024/06/24 07:03:21] ppsci INFO: train: epoch 1165 | step 10 | lr 0.000042 | loss 0.017134 | mae 0.102507 -[2024/06/24 07:03:22] ppsci INFO: train: epoch 1165 | step 20 | lr 0.000042 | loss 0.022327 | mae 0.114793 -[2024/06/24 07:03:22] ppsci INFO: train: epoch 1165 | step 30 | lr 0.000042 | loss 0.046771 | mae 0.133218 -[2024/06/24 07:03:22] ppsci INFO: train: epoch 1165 | step 38 | lr 0.000042 | loss 0.014179 | mae 0.082632 -[2024/06/24 07:03:23] ppsci INFO: epoch: 1165, train_loss: 0.029143, train_metric: 0.124372, eval_loss: 0.055974, eval_mae: 0.153993 -[2024/06/24 07:03:23] ppsci INFO: train: epoch 1166 | step 0 | lr 0.000043 | loss 0.028271 | mae 0.118447 -[2024/06/24 07:03:23] ppsci INFO: train: epoch 1166 | step 10 | lr 0.000043 | loss 0.024266 | mae 0.112292 -[2024/06/24 07:03:24] ppsci INFO: train: epoch 1166 | step 20 | lr 0.000043 | loss 0.026630 | mae 0.119628 -[2024/06/24 07:03:24] ppsci INFO: train: epoch 1166 | step 30 | lr 0.000043 | loss 0.031633 | mae 0.128362 -[2024/06/24 07:03:25] ppsci INFO: train: epoch 1166 | step 38 | lr 0.000043 | loss 0.018328 | mae 0.112546 -[2024/06/24 07:03:25] ppsci INFO: epoch: 1166, train_loss: 0.029020, train_metric: 0.125394, eval_loss: 0.057011, eval_mae: 0.153616 -[2024/06/24 07:03:25] ppsci INFO: train: epoch 1167 | step 0 | lr 0.000043 | loss 0.029379 | mae 0.132869 -[2024/06/24 07:03:25] ppsci INFO: train: epoch 1167 | step 10 | lr 0.000043 | loss 0.022931 | mae 0.110111 -[2024/06/24 07:03:26] ppsci INFO: train: epoch 1167 | step 20 | lr 0.000043 | loss 0.024793 | mae 0.117927 -[2024/06/24 07:03:26] ppsci INFO: train: epoch 1167 | step 30 | lr 0.000043 | loss 0.036901 | mae 0.140124 -[2024/06/24 07:03:27] ppsci INFO: train: epoch 1167 | step 38 | lr 0.000043 | loss 0.026766 | mae 0.132129 -[2024/06/24 07:03:27] ppsci INFO: epoch: 1167, train_loss: 0.027874, train_metric: 0.123216, eval_loss: 0.054521, eval_mae: 0.151579 -[2024/06/24 07:03:27] ppsci INFO: train: epoch 1168 | step 0 | lr 0.000043 | loss 0.029944 | mae 0.131756 -[2024/06/24 07:03:27] ppsci INFO: train: epoch 1168 | step 10 | lr 0.000043 | loss 0.022946 | mae 0.115513 -[2024/06/24 07:03:28] ppsci INFO: train: epoch 1168 | step 20 | lr 0.000043 | loss 0.022585 | mae 0.112167 -[2024/06/24 07:03:29] ppsci INFO: train: epoch 1168 | step 30 | lr 0.000043 | loss 0.033126 | mae 0.138966 -[2024/06/24 07:03:29] ppsci INFO: train: epoch 1168 | step 38 | lr 0.000043 | loss 0.013924 | mae 0.091651 -[2024/06/24 07:03:29] ppsci INFO: epoch: 1168, train_loss: 0.028516, train_metric: 0.125255, eval_loss: 0.056991, eval_mae: 0.154722 -[2024/06/24 07:03:29] ppsci INFO: train: epoch 1169 | step 0 | lr 0.000044 | loss 0.032198 | mae 0.131201 -[2024/06/24 07:03:30] ppsci INFO: train: epoch 1169 | step 10 | lr 0.000044 | loss 0.031008 | mae 0.134820 -[2024/06/24 07:03:30] ppsci INFO: train: epoch 1169 | step 20 | lr 0.000044 | loss 0.034298 | mae 0.129063 -[2024/06/24 07:03:31] ppsci INFO: train: epoch 1169 | step 30 | lr 0.000044 | loss 0.043162 | mae 0.135288 -[2024/06/24 07:03:31] ppsci INFO: train: epoch 1169 | step 38 | lr 0.000044 | loss 0.025774 | mae 0.130542 -[2024/06/24 07:03:31] ppsci INFO: epoch: 1169, train_loss: 0.029519, train_metric: 0.124850, eval_loss: 0.056746, eval_mae: 0.153373 -[2024/06/24 07:03:31] ppsci INFO: train: epoch 1170 | step 0 | lr 0.000044 | loss 0.023782 | mae 0.116953 -[2024/06/24 07:03:32] ppsci INFO: train: epoch 1170 | step 10 | lr 0.000044 | loss 0.022738 | mae 0.113867 -[2024/06/24 07:03:32] ppsci INFO: train: epoch 1170 | step 20 | lr 0.000044 | loss 0.029234 | mae 0.129507 -[2024/06/24 07:03:33] ppsci INFO: train: epoch 1170 | step 30 | lr 0.000044 | loss 0.039353 | mae 0.132536 -[2024/06/24 07:03:33] ppsci INFO: train: epoch 1170 | step 38 | lr 0.000044 | loss 0.007483 | mae 0.063904 -[2024/06/24 07:03:33] ppsci INFO: epoch: 1170, train_loss: 0.027997, train_metric: 0.124200, eval_loss: 0.056806, eval_mae: 0.153104 -[2024/06/24 07:03:33] ppsci INFO: train: epoch 1171 | step 0 | lr 0.000045 | loss 0.020309 | mae 0.108978 -[2024/06/24 07:03:34] ppsci INFO: train: epoch 1171 | step 10 | lr 0.000045 | loss 0.035405 | mae 0.140830 -[2024/06/24 07:03:34] ppsci INFO: train: epoch 1171 | step 20 | lr 0.000045 | loss 0.029847 | mae 0.128351 -[2024/06/24 07:03:35] ppsci INFO: train: epoch 1171 | step 30 | lr 0.000045 | loss 0.031649 | mae 0.131504 -[2024/06/24 07:03:35] ppsci INFO: train: epoch 1171 | step 38 | lr 0.000045 | loss 0.032648 | mae 0.150132 -[2024/06/24 07:03:35] ppsci INFO: epoch: 1171, train_loss: 0.028010, train_metric: 0.123588, eval_loss: 0.057851, eval_mae: 0.153289 -[2024/06/24 07:03:35] ppsci INFO: train: epoch 1172 | step 0 | lr 0.000045 | loss 0.033223 | mae 0.136362 -[2024/06/24 07:03:36] ppsci INFO: train: epoch 1172 | step 10 | lr 0.000045 | loss 0.034021 | mae 0.119801 -[2024/06/24 07:03:36] ppsci INFO: train: epoch 1172 | step 20 | lr 0.000045 | loss 0.018095 | mae 0.100669 -[2024/06/24 07:03:37] ppsci INFO: train: epoch 1172 | step 30 | lr 0.000045 | loss 0.027547 | mae 0.130273 -[2024/06/24 07:03:37] ppsci INFO: train: epoch 1172 | step 38 | lr 0.000045 | loss 0.029601 | mae 0.119133 -[2024/06/24 07:03:37] ppsci INFO: epoch: 1172, train_loss: 0.028144, train_metric: 0.121962, eval_loss: 0.056857, eval_mae: 0.152287 -[2024/06/24 07:03:38] ppsci INFO: train: epoch 1173 | step 0 | lr 0.000045 | loss 0.027040 | mae 0.118232 -[2024/06/24 07:03:38] ppsci INFO: train: epoch 1173 | step 10 | lr 0.000045 | loss 0.033388 | mae 0.130543 -[2024/06/24 07:03:38] ppsci INFO: train: epoch 1173 | step 20 | lr 0.000045 | loss 0.027651 | mae 0.120312 -[2024/06/24 07:03:39] ppsci INFO: train: epoch 1173 | step 30 | lr 0.000045 | loss 0.026691 | mae 0.122803 -[2024/06/24 07:03:39] ppsci INFO: train: epoch 1173 | step 38 | lr 0.000045 | loss 0.014753 | mae 0.096183 -[2024/06/24 07:03:39] ppsci INFO: epoch: 1173, train_loss: 0.029229, train_metric: 0.123872, eval_loss: 0.056041, eval_mae: 0.152079 -[2024/06/24 07:03:40] ppsci INFO: train: epoch 1174 | step 0 | lr 0.000046 | loss 0.024115 | mae 0.118675 -[2024/06/24 07:03:40] ppsci INFO: train: epoch 1174 | step 10 | lr 0.000046 | loss 0.033411 | mae 0.122844 -[2024/06/24 07:03:41] ppsci INFO: train: epoch 1174 | step 20 | lr 0.000046 | loss 0.026739 | mae 0.117657 -[2024/06/24 07:03:41] ppsci INFO: train: epoch 1174 | step 30 | lr 0.000046 | loss 0.030987 | mae 0.127650 -[2024/06/24 07:03:42] ppsci INFO: train: epoch 1174 | step 38 | lr 0.000046 | loss 0.072464 | mae 0.191340 -[2024/06/24 07:03:42] ppsci INFO: epoch: 1174, train_loss: 0.028267, train_metric: 0.123018, eval_loss: 0.055103, eval_mae: 0.151753 -[2024/06/24 07:03:42] ppsci INFO: train: epoch 1175 | step 0 | lr 0.000046 | loss 0.023154 | mae 0.117449 -[2024/06/24 07:03:42] ppsci INFO: train: epoch 1175 | step 10 | lr 0.000046 | loss 0.021874 | mae 0.109153 -[2024/06/24 07:03:43] ppsci INFO: train: epoch 1175 | step 20 | lr 0.000046 | loss 0.022102 | mae 0.111583 -[2024/06/24 07:03:43] ppsci INFO: train: epoch 1175 | step 30 | lr 0.000046 | loss 0.026898 | mae 0.118952 -[2024/06/24 07:03:44] ppsci INFO: train: epoch 1175 | step 38 | lr 0.000046 | loss 0.044816 | mae 0.148136 -[2024/06/24 07:03:44] ppsci INFO: epoch: 1175, train_loss: 0.028573, train_metric: 0.123151, eval_loss: 0.056623, eval_mae: 0.152551 -[2024/06/24 07:03:44] ppsci INFO: train: epoch 1176 | step 0 | lr 0.000047 | loss 0.032475 | mae 0.136195 -[2024/06/24 07:03:44] ppsci INFO: train: epoch 1176 | step 10 | lr 0.000047 | loss 0.022418 | mae 0.113540 -[2024/06/24 07:03:45] ppsci INFO: train: epoch 1176 | step 20 | lr 0.000047 | loss 0.040221 | mae 0.150729 -[2024/06/24 07:03:45] ppsci INFO: train: epoch 1176 | step 30 | lr 0.000047 | loss 0.029847 | mae 0.121311 -[2024/06/24 07:03:46] ppsci INFO: train: epoch 1176 | step 38 | lr 0.000047 | loss 0.025927 | mae 0.135526 -[2024/06/24 07:03:46] ppsci INFO: epoch: 1176, train_loss: 0.028264, train_metric: 0.124692, eval_loss: 0.055737, eval_mae: 0.153539 -[2024/06/24 07:03:46] ppsci INFO: train: epoch 1177 | step 0 | lr 0.000047 | loss 0.027298 | mae 0.118395 -[2024/06/24 07:03:47] ppsci INFO: train: epoch 1177 | step 10 | lr 0.000047 | loss 0.041710 | mae 0.145876 -[2024/06/24 07:03:47] ppsci INFO: train: epoch 1177 | step 20 | lr 0.000047 | loss 0.031529 | mae 0.131145 -[2024/06/24 07:03:48] ppsci INFO: train: epoch 1177 | step 30 | lr 0.000047 | loss 0.024481 | mae 0.117024 -[2024/06/24 07:03:48] ppsci INFO: train: epoch 1177 | step 38 | lr 0.000047 | loss 0.011397 | mae 0.083296 -[2024/06/24 07:03:48] ppsci INFO: epoch: 1177, train_loss: 0.027948, train_metric: 0.123328, eval_loss: 0.055594, eval_mae: 0.152251 -[2024/06/24 07:03:48] ppsci INFO: train: epoch 1178 | step 0 | lr 0.000047 | loss 0.030245 | mae 0.121480 -[2024/06/24 07:03:49] ppsci INFO: train: epoch 1178 | step 10 | lr 0.000047 | loss 0.020991 | mae 0.111422 -[2024/06/24 07:03:49] ppsci INFO: train: epoch 1178 | step 20 | lr 0.000047 | loss 0.026479 | mae 0.127656 -[2024/06/24 07:03:50] ppsci INFO: train: epoch 1178 | step 30 | lr 0.000047 | loss 0.030959 | mae 0.122104 -[2024/06/24 07:03:50] ppsci INFO: train: epoch 1178 | step 38 | lr 0.000047 | loss 0.008311 | mae 0.078595 -[2024/06/24 07:03:50] ppsci INFO: epoch: 1178, train_loss: 0.029072, train_metric: 0.124637, eval_loss: 0.055987, eval_mae: 0.153007 -[2024/06/24 07:03:50] ppsci INFO: train: epoch 1179 | step 0 | lr 0.000048 | loss 0.027758 | mae 0.124897 -[2024/06/24 07:03:51] ppsci INFO: train: epoch 1179 | step 10 | lr 0.000048 | loss 0.038302 | mae 0.129915 -[2024/06/24 07:03:51] ppsci INFO: train: epoch 1179 | step 20 | lr 0.000048 | loss 0.035489 | mae 0.139605 -[2024/06/24 07:03:52] ppsci INFO: train: epoch 1179 | step 30 | lr 0.000048 | loss 0.027080 | mae 0.119715 -[2024/06/24 07:03:52] ppsci INFO: train: epoch 1179 | step 38 | lr 0.000048 | loss 0.043447 | mae 0.170862 -[2024/06/24 07:03:52] ppsci INFO: epoch: 1179, train_loss: 0.028739, train_metric: 0.123942, eval_loss: 0.056240, eval_mae: 0.152586 -[2024/06/24 07:03:53] ppsci INFO: train: epoch 1180 | step 0 | lr 0.000048 | loss 0.029371 | mae 0.127810 -[2024/06/24 07:03:53] ppsci INFO: train: epoch 1180 | step 10 | lr 0.000048 | loss 0.035257 | mae 0.139326 -[2024/06/24 07:03:54] ppsci INFO: train: epoch 1180 | step 20 | lr 0.000048 | loss 0.025409 | mae 0.116697 -[2024/06/24 07:03:54] ppsci INFO: train: epoch 1180 | step 30 | lr 0.000048 | loss 0.027530 | mae 0.127641 -[2024/06/24 07:03:54] ppsci INFO: train: epoch 1180 | step 38 | lr 0.000048 | loss 0.042925 | mae 0.177292 -[2024/06/24 07:03:55] ppsci INFO: epoch: 1180, train_loss: 0.028907, train_metric: 0.124642, eval_loss: 0.056186, eval_mae: 0.151917 -[2024/06/24 07:03:55] ppsci INFO: train: epoch 1181 | step 0 | lr 0.000049 | loss 0.019802 | mae 0.109367 -[2024/06/24 07:03:55] ppsci INFO: train: epoch 1181 | step 10 | lr 0.000049 | loss 0.027990 | mae 0.119895 -[2024/06/24 07:03:56] ppsci INFO: train: epoch 1181 | step 20 | lr 0.000049 | loss 0.022773 | mae 0.120894 -[2024/06/24 07:03:56] ppsci INFO: train: epoch 1181 | step 30 | lr 0.000049 | loss 0.030503 | mae 0.127786 -[2024/06/24 07:03:57] ppsci INFO: train: epoch 1181 | step 38 | lr 0.000049 | loss 0.021403 | mae 0.130685 -[2024/06/24 07:03:57] ppsci INFO: epoch: 1181, train_loss: 0.028868, train_metric: 0.126041, eval_loss: 0.054665, eval_mae: 0.152304 -[2024/06/24 07:03:57] ppsci INFO: train: epoch 1182 | step 0 | lr 0.000049 | loss 0.032750 | mae 0.135247 -[2024/06/24 07:03:57] ppsci INFO: train: epoch 1182 | step 10 | lr 0.000049 | loss 0.031999 | mae 0.138119 -[2024/06/24 07:03:58] ppsci INFO: train: epoch 1182 | step 20 | lr 0.000049 | loss 0.028432 | mae 0.123964 -[2024/06/24 07:03:59] ppsci INFO: train: epoch 1182 | step 30 | lr 0.000049 | loss 0.032426 | mae 0.132803 -[2024/06/24 07:03:59] ppsci INFO: train: epoch 1182 | step 38 | lr 0.000049 | loss 0.025212 | mae 0.128867 -[2024/06/24 07:03:59] ppsci INFO: epoch: 1182, train_loss: 0.028560, train_metric: 0.125213, eval_loss: 0.055540, eval_mae: 0.153819 -[2024/06/24 07:03:59] ppsci INFO: train: epoch 1183 | step 0 | lr 0.000049 | loss 0.025190 | mae 0.117847 -[2024/06/24 07:04:00] ppsci INFO: train: epoch 1183 | step 10 | lr 0.000049 | loss 0.017257 | mae 0.100215 -[2024/06/24 07:04:00] ppsci INFO: train: epoch 1183 | step 20 | lr 0.000049 | loss 0.019960 | mae 0.106832 -[2024/06/24 07:04:01] ppsci INFO: train: epoch 1183 | step 30 | lr 0.000049 | loss 0.020881 | mae 0.110180 -[2024/06/24 07:04:01] ppsci INFO: train: epoch 1183 | step 38 | lr 0.000049 | loss 0.025469 | mae 0.118584 -[2024/06/24 07:04:01] ppsci INFO: epoch: 1183, train_loss: 0.027397, train_metric: 0.122554, eval_loss: 0.056422, eval_mae: 0.151846 -[2024/06/24 07:04:01] ppsci INFO: train: epoch 1184 | step 0 | lr 0.000050 | loss 0.027203 | mae 0.127587 -[2024/06/24 07:04:02] ppsci INFO: train: epoch 1184 | step 10 | lr 0.000050 | loss 0.024177 | mae 0.114997 -[2024/06/24 07:04:02] ppsci INFO: train: epoch 1184 | step 20 | lr 0.000050 | loss 0.030420 | mae 0.120756 -[2024/06/24 07:04:03] ppsci INFO: train: epoch 1184 | step 30 | lr 0.000050 | loss 0.022588 | mae 0.108284 -[2024/06/24 07:04:03] ppsci INFO: train: epoch 1184 | step 38 | lr 0.000050 | loss 0.016137 | mae 0.103386 -[2024/06/24 07:04:03] ppsci INFO: epoch: 1184, train_loss: 0.028603, train_metric: 0.125337, eval_loss: 0.057247, eval_mae: 0.153914 -[2024/06/24 07:04:03] ppsci INFO: train: epoch 1185 | step 0 | lr 0.000050 | loss 0.027173 | mae 0.124534 -[2024/06/24 07:04:04] ppsci INFO: train: epoch 1185 | step 10 | lr 0.000050 | loss 0.024826 | mae 0.119377 -[2024/06/24 07:04:04] ppsci INFO: train: epoch 1185 | step 20 | lr 0.000050 | loss 0.039628 | mae 0.144054 -[2024/06/24 07:04:05] ppsci INFO: train: epoch 1185 | step 30 | lr 0.000050 | loss 0.026746 | mae 0.120071 -[2024/06/24 07:04:05] ppsci INFO: train: epoch 1185 | step 38 | lr 0.000050 | loss 0.021550 | mae 0.108788 -[2024/06/24 07:04:05] ppsci INFO: epoch: 1185, train_loss: 0.028473, train_metric: 0.123756, eval_loss: 0.056956, eval_mae: 0.153034 -[2024/06/24 07:04:05] ppsci INFO: train: epoch 1186 | step 0 | lr 0.000051 | loss 0.031659 | mae 0.132643 -[2024/06/24 07:04:06] ppsci INFO: train: epoch 1186 | step 10 | lr 0.000051 | loss 0.029332 | mae 0.128556 -[2024/06/24 07:04:07] ppsci INFO: train: epoch 1186 | step 20 | lr 0.000051 | loss 0.026003 | mae 0.128682 -[2024/06/24 07:04:07] ppsci INFO: train: epoch 1186 | step 30 | lr 0.000051 | loss 0.034141 | mae 0.127558 -[2024/06/24 07:04:08] ppsci INFO: train: epoch 1186 | step 38 | lr 0.000051 | loss 0.024604 | mae 0.122866 -[2024/06/24 07:04:08] ppsci INFO: epoch: 1186, train_loss: 0.029493, train_metric: 0.125512, eval_loss: 0.055785, eval_mae: 0.154612 -[2024/06/24 07:04:08] ppsci INFO: train: epoch 1187 | step 0 | lr 0.000051 | loss 0.024948 | mae 0.121997 -[2024/06/24 07:04:08] ppsci INFO: train: epoch 1187 | step 10 | lr 0.000051 | loss 0.036576 | mae 0.145018 -[2024/06/24 07:04:09] ppsci INFO: train: epoch 1187 | step 20 | lr 0.000051 | loss 0.024354 | mae 0.121057 -[2024/06/24 07:04:10] ppsci INFO: train: epoch 1187 | step 30 | lr 0.000051 | loss 0.016924 | mae 0.103494 -[2024/06/24 07:04:10] ppsci INFO: train: epoch 1187 | step 38 | lr 0.000051 | loss 0.038651 | mae 0.162519 -[2024/06/24 07:04:10] ppsci INFO: epoch: 1187, train_loss: 0.028896, train_metric: 0.125403, eval_loss: 0.057742, eval_mae: 0.153162 -[2024/06/24 07:04:10] ppsci INFO: train: epoch 1188 | step 0 | lr 0.000052 | loss 0.027189 | mae 0.131014 -[2024/06/24 07:04:11] ppsci INFO: train: epoch 1188 | step 10 | lr 0.000052 | loss 0.019722 | mae 0.105652 -[2024/06/24 07:04:11] ppsci INFO: train: epoch 1188 | step 20 | lr 0.000052 | loss 0.023742 | mae 0.115044 -[2024/06/24 07:04:12] ppsci INFO: train: epoch 1188 | step 30 | lr 0.000052 | loss 0.041673 | mae 0.137747 -[2024/06/24 07:04:12] ppsci INFO: train: epoch 1188 | step 38 | lr 0.000052 | loss 0.035920 | mae 0.116773 -[2024/06/24 07:04:12] ppsci INFO: epoch: 1188, train_loss: 0.027521, train_metric: 0.122480, eval_loss: 0.056964, eval_mae: 0.152440 -[2024/06/24 07:04:12] ppsci INFO: train: epoch 1189 | step 0 | lr 0.000052 | loss 0.024328 | mae 0.117841 -[2024/06/24 07:04:13] ppsci INFO: train: epoch 1189 | step 10 | lr 0.000052 | loss 0.029319 | mae 0.129593 -[2024/06/24 07:04:13] ppsci INFO: train: epoch 1189 | step 20 | lr 0.000052 | loss 0.030718 | mae 0.116285 -[2024/06/24 07:04:14] ppsci INFO: train: epoch 1189 | step 30 | lr 0.000052 | loss 0.025687 | mae 0.118074 -[2024/06/24 07:04:14] ppsci INFO: train: epoch 1189 | step 38 | lr 0.000052 | loss 0.008133 | mae 0.066581 -[2024/06/24 07:04:14] ppsci INFO: epoch: 1189, train_loss: 0.028077, train_metric: 0.124031, eval_loss: 0.055326, eval_mae: 0.152991 -[2024/06/24 07:04:14] ppsci INFO: train: epoch 1190 | step 0 | lr 0.000052 | loss 0.027750 | mae 0.122490 -[2024/06/24 07:04:15] ppsci INFO: train: epoch 1190 | step 10 | lr 0.000052 | loss 0.032167 | mae 0.131942 -[2024/06/24 07:04:16] ppsci INFO: train: epoch 1190 | step 20 | lr 0.000052 | loss 0.024984 | mae 0.115288 -[2024/06/24 07:04:16] ppsci INFO: train: epoch 1190 | step 30 | lr 0.000052 | loss 0.026996 | mae 0.121570 -[2024/06/24 07:04:16] ppsci INFO: train: epoch 1190 | step 38 | lr 0.000052 | loss 0.044961 | mae 0.179722 -[2024/06/24 07:04:17] ppsci INFO: epoch: 1190, train_loss: 0.029079, train_metric: 0.125058, eval_loss: 0.053951, eval_mae: 0.151973 -[2024/06/24 07:04:17] ppsci INFO: train: epoch 1191 | step 0 | lr 0.000053 | loss 0.026196 | mae 0.119893 -[2024/06/24 07:04:17] ppsci INFO: train: epoch 1191 | step 10 | lr 0.000053 | loss 0.030419 | mae 0.126801 -[2024/06/24 07:04:18] ppsci INFO: train: epoch 1191 | step 20 | lr 0.000053 | loss 0.023532 | mae 0.115605 -[2024/06/24 07:04:18] ppsci INFO: train: epoch 1191 | step 30 | lr 0.000053 | loss 0.026750 | mae 0.126688 -[2024/06/24 07:04:19] ppsci INFO: train: epoch 1191 | step 38 | lr 0.000053 | loss 0.025924 | mae 0.123847 -[2024/06/24 07:04:19] ppsci INFO: epoch: 1191, train_loss: 0.027254, train_metric: 0.120994, eval_loss: 0.055442, eval_mae: 0.152133 -[2024/06/24 07:04:19] ppsci INFO: train: epoch 1192 | step 0 | lr 0.000053 | loss 0.023854 | mae 0.113079 -[2024/06/24 07:04:19] ppsci INFO: train: epoch 1192 | step 10 | lr 0.000053 | loss 0.022882 | mae 0.110747 -[2024/06/24 07:04:20] ppsci INFO: train: epoch 1192 | step 20 | lr 0.000053 | loss 0.026068 | mae 0.121489 -[2024/06/24 07:04:21] ppsci INFO: train: epoch 1192 | step 30 | lr 0.000053 | loss 0.029963 | mae 0.130497 -[2024/06/24 07:04:21] ppsci INFO: train: epoch 1192 | step 38 | lr 0.000053 | loss 0.014504 | mae 0.085036 -[2024/06/24 07:04:21] ppsci INFO: epoch: 1192, train_loss: 0.027438, train_metric: 0.122595, eval_loss: 0.054024, eval_mae: 0.153156 -[2024/06/24 07:04:21] ppsci INFO: train: epoch 1193 | step 0 | lr 0.000054 | loss 0.054519 | mae 0.155397 -[2024/06/24 07:04:22] ppsci INFO: train: epoch 1193 | step 10 | lr 0.000054 | loss 0.023087 | mae 0.114617 -[2024/06/24 07:04:22] ppsci INFO: train: epoch 1193 | step 20 | lr 0.000054 | loss 0.033490 | mae 0.133047 -[2024/06/24 07:04:23] ppsci INFO: train: epoch 1193 | step 30 | lr 0.000054 | loss 0.031382 | mae 0.131314 -[2024/06/24 07:04:23] ppsci INFO: train: epoch 1193 | step 38 | lr 0.000054 | loss 0.018117 | mae 0.089150 -[2024/06/24 07:04:23] ppsci INFO: epoch: 1193, train_loss: 0.027182, train_metric: 0.121816, eval_loss: 0.056184, eval_mae: 0.151484 -[2024/06/24 07:04:23] ppsci INFO: train: epoch 1194 | step 0 | lr 0.000054 | loss 0.024683 | mae 0.122727 -[2024/06/24 07:04:24] ppsci INFO: train: epoch 1194 | step 10 | lr 0.000054 | loss 0.033667 | mae 0.141307 -[2024/06/24 07:04:24] ppsci INFO: train: epoch 1194 | step 20 | lr 0.000054 | loss 0.028671 | mae 0.121402 -[2024/06/24 07:04:25] ppsci INFO: train: epoch 1194 | step 30 | lr 0.000054 | loss 0.021280 | mae 0.111058 -[2024/06/24 07:04:25] ppsci INFO: train: epoch 1194 | step 38 | lr 0.000054 | loss 0.019606 | mae 0.124872 -[2024/06/24 07:04:25] ppsci INFO: epoch: 1194, train_loss: 0.027560, train_metric: 0.124459, eval_loss: 0.057037, eval_mae: 0.152748 -[2024/06/24 07:04:25] ppsci INFO: train: epoch 1195 | step 0 | lr 0.000055 | loss 0.027390 | mae 0.121077 -[2024/06/24 07:04:26] ppsci INFO: train: epoch 1195 | step 10 | lr 0.000055 | loss 0.031945 | mae 0.131985 -[2024/06/24 07:04:26] ppsci INFO: train: epoch 1195 | step 20 | lr 0.000055 | loss 0.034503 | mae 0.126863 -[2024/06/24 07:04:27] ppsci INFO: train: epoch 1195 | step 30 | lr 0.000055 | loss 0.030249 | mae 0.122257 -[2024/06/24 07:04:27] ppsci INFO: train: epoch 1195 | step 38 | lr 0.000055 | loss 0.025075 | mae 0.123232 -[2024/06/24 07:04:27] ppsci INFO: epoch: 1195, train_loss: 0.027774, train_metric: 0.123930, eval_loss: 0.054724, eval_mae: 0.151662 -[2024/06/24 07:04:28] ppsci INFO: train: epoch 1196 | step 0 | lr 0.000055 | loss 0.026987 | mae 0.121401 -[2024/06/24 07:04:28] ppsci INFO: train: epoch 1196 | step 10 | lr 0.000055 | loss 0.038952 | mae 0.132832 -[2024/06/24 07:04:29] ppsci INFO: train: epoch 1196 | step 20 | lr 0.000055 | loss 0.022550 | mae 0.114343 -[2024/06/24 07:04:29] ppsci INFO: train: epoch 1196 | step 30 | lr 0.000055 | loss 0.025594 | mae 0.119640 -[2024/06/24 07:04:30] ppsci INFO: train: epoch 1196 | step 38 | lr 0.000055 | loss 0.029741 | mae 0.147919 -[2024/06/24 07:04:30] ppsci INFO: epoch: 1196, train_loss: 0.028238, train_metric: 0.124192, eval_loss: 0.054693, eval_mae: 0.150689 -[2024/06/24 07:04:30] ppsci INFO: train: epoch 1197 | step 0 | lr 0.000055 | loss 0.024995 | mae 0.119378 -[2024/06/24 07:04:30] ppsci INFO: train: epoch 1197 | step 10 | lr 0.000055 | loss 0.033391 | mae 0.139653 -[2024/06/24 07:04:31] ppsci INFO: train: epoch 1197 | step 20 | lr 0.000055 | loss 0.028614 | mae 0.124946 -[2024/06/24 07:04:31] ppsci INFO: train: epoch 1197 | step 30 | lr 0.000055 | loss 0.026923 | mae 0.128414 -[2024/06/24 07:04:32] ppsci INFO: train: epoch 1197 | step 38 | lr 0.000055 | loss 0.028338 | mae 0.129625 -[2024/06/24 07:04:32] ppsci INFO: epoch: 1197, train_loss: 0.029413, train_metric: 0.125831, eval_loss: 0.056075, eval_mae: 0.153084 -[2024/06/24 07:04:32] ppsci INFO: train: epoch 1198 | step 0 | lr 0.000056 | loss 0.032605 | mae 0.139416 -[2024/06/24 07:04:32] ppsci INFO: train: epoch 1198 | step 10 | lr 0.000056 | loss 0.026987 | mae 0.125198 -[2024/06/24 07:04:33] ppsci INFO: train: epoch 1198 | step 20 | lr 0.000056 | loss 0.024366 | mae 0.115646 -[2024/06/24 07:04:33] ppsci INFO: train: epoch 1198 | step 30 | lr 0.000056 | loss 0.048831 | mae 0.133655 -[2024/06/24 07:04:34] ppsci INFO: train: epoch 1198 | step 38 | lr 0.000056 | loss 0.035848 | mae 0.143990 -[2024/06/24 07:04:34] ppsci INFO: epoch: 1198, train_loss: 0.028908, train_metric: 0.124386, eval_loss: 0.055252, eval_mae: 0.151819 -[2024/06/24 07:04:34] ppsci INFO: train: epoch 1199 | step 0 | lr 0.000056 | loss 0.029815 | mae 0.121794 -[2024/06/24 07:04:35] ppsci INFO: train: epoch 1199 | step 10 | lr 0.000056 | loss 0.025099 | mae 0.122262 -[2024/06/24 07:04:35] ppsci INFO: train: epoch 1199 | step 20 | lr 0.000056 | loss 0.021120 | mae 0.103617 -[2024/06/24 07:04:36] ppsci INFO: train: epoch 1199 | step 30 | lr 0.000056 | loss 0.029886 | mae 0.130231 -[2024/06/24 07:04:36] ppsci INFO: train: epoch 1199 | step 38 | lr 0.000056 | loss 0.029784 | mae 0.143082 -[2024/06/24 07:04:36] ppsci INFO: epoch: 1199, train_loss: 0.028803, train_metric: 0.122648, eval_loss: 0.057572, eval_mae: 0.151819 -[2024/06/24 07:04:36] ppsci INFO: train: epoch 1200 | step 0 | lr 0.000057 | loss 0.025068 | mae 0.123513 -[2024/06/24 07:04:37] ppsci INFO: train: epoch 1200 | step 10 | lr 0.000057 | loss 0.036428 | mae 0.140885 -[2024/06/24 07:04:37] ppsci INFO: train: epoch 1200 | step 20 | lr 0.000057 | loss 0.024188 | mae 0.117647 -[2024/06/24 07:04:38] ppsci INFO: train: epoch 1200 | step 30 | lr 0.000057 | loss 0.029547 | mae 0.128481 -[2024/06/24 07:04:38] ppsci INFO: train: epoch 1200 | step 38 | lr 0.000057 | loss 0.042299 | mae 0.150319 -[2024/06/24 07:04:38] ppsci INFO: epoch: 1200, train_loss: 0.029358, train_metric: 0.125221, eval_loss: 0.057299, eval_mae: 0.151931 -[2024/06/24 07:04:38] ppsci INFO: train: epoch 1201 | step 0 | lr 0.000057 | loss 0.018686 | mae 0.110580 -[2024/06/24 07:04:39] ppsci INFO: train: epoch 1201 | step 10 | lr 0.000057 | loss 0.028042 | mae 0.124300 -[2024/06/24 07:04:39] ppsci INFO: train: epoch 1201 | step 20 | lr 0.000057 | loss 0.031107 | mae 0.128081 -[2024/06/24 07:04:40] ppsci INFO: train: epoch 1201 | step 30 | lr 0.000057 | loss 0.031176 | mae 0.131708 -[2024/06/24 07:04:40] ppsci INFO: train: epoch 1201 | step 38 | lr 0.000057 | loss 0.090621 | mae 0.206727 -[2024/06/24 07:04:40] ppsci INFO: epoch: 1201, train_loss: 0.029285, train_metric: 0.123622, eval_loss: 0.055788, eval_mae: 0.152144 -[2024/06/24 07:04:40] ppsci INFO: train: epoch 1202 | step 0 | lr 0.000058 | loss 0.037710 | mae 0.140169 -[2024/06/24 07:04:41] ppsci INFO: train: epoch 1202 | step 10 | lr 0.000058 | loss 0.022740 | mae 0.104353 -[2024/06/24 07:04:42] ppsci INFO: train: epoch 1202 | step 20 | lr 0.000058 | loss 0.028966 | mae 0.128357 -[2024/06/24 07:04:42] ppsci INFO: train: epoch 1202 | step 30 | lr 0.000058 | loss 0.043146 | mae 0.139058 -[2024/06/24 07:04:43] ppsci INFO: train: epoch 1202 | step 38 | lr 0.000058 | loss 0.029594 | mae 0.135065 -[2024/06/24 07:04:43] ppsci INFO: epoch: 1202, train_loss: 0.030128, train_metric: 0.124639, eval_loss: 0.056120, eval_mae: 0.152224 -[2024/06/24 07:04:43] ppsci INFO: train: epoch 1203 | step 0 | lr 0.000058 | loss 0.032997 | mae 0.136660 -[2024/06/24 07:04:43] ppsci INFO: train: epoch 1203 | step 10 | lr 0.000058 | loss 0.029770 | mae 0.128683 -[2024/06/24 07:04:44] ppsci INFO: train: epoch 1203 | step 20 | lr 0.000058 | loss 0.026919 | mae 0.125618 -[2024/06/24 07:04:44] ppsci INFO: train: epoch 1203 | step 30 | lr 0.000058 | loss 0.026937 | mae 0.122234 -[2024/06/24 07:04:45] ppsci INFO: train: epoch 1203 | step 38 | lr 0.000058 | loss 0.043168 | mae 0.129647 -[2024/06/24 07:04:45] ppsci INFO: epoch: 1203, train_loss: 0.028078, train_metric: 0.124113, eval_loss: 0.055857, eval_mae: 0.152245 -[2024/06/24 07:04:45] ppsci INFO: train: epoch 1204 | step 0 | lr 0.000059 | loss 0.032137 | mae 0.129083 -[2024/06/24 07:04:45] ppsci INFO: train: epoch 1204 | step 10 | lr 0.000059 | loss 0.023943 | mae 0.116080 -[2024/06/24 07:04:46] ppsci INFO: train: epoch 1204 | step 20 | lr 0.000059 | loss 0.037282 | mae 0.135515 -[2024/06/24 07:04:46] ppsci INFO: train: epoch 1204 | step 30 | lr 0.000059 | loss 0.029641 | mae 0.123082 -[2024/06/24 07:04:47] ppsci INFO: train: epoch 1204 | step 38 | lr 0.000059 | loss 0.012204 | mae 0.080105 -[2024/06/24 07:04:47] ppsci INFO: epoch: 1204, train_loss: 0.028034, train_metric: 0.123570, eval_loss: 0.055201, eval_mae: 0.152970 -[2024/06/24 07:04:47] ppsci INFO: train: epoch 1205 | step 0 | lr 0.000059 | loss 0.029850 | mae 0.124148 -[2024/06/24 07:04:48] ppsci INFO: train: epoch 1205 | step 10 | lr 0.000059 | loss 0.028567 | mae 0.123463 -[2024/06/24 07:04:48] ppsci INFO: train: epoch 1205 | step 20 | lr 0.000059 | loss 0.025984 | mae 0.122446 -[2024/06/24 07:04:49] ppsci INFO: train: epoch 1205 | step 30 | lr 0.000059 | loss 0.026981 | mae 0.122821 -[2024/06/24 07:04:49] ppsci INFO: train: epoch 1205 | step 38 | lr 0.000059 | loss 0.009066 | mae 0.071168 -[2024/06/24 07:04:49] ppsci INFO: epoch: 1205, train_loss: 0.028298, train_metric: 0.124570, eval_loss: 0.057187, eval_mae: 0.153527 -[2024/06/24 07:04:49] ppsci INFO: train: epoch 1206 | step 0 | lr 0.000060 | loss 0.027663 | mae 0.121836 -[2024/06/24 07:04:50] ppsci INFO: train: epoch 1206 | step 10 | lr 0.000060 | loss 0.032802 | mae 0.126818 -[2024/06/24 07:04:50] ppsci INFO: train: epoch 1206 | step 20 | lr 0.000060 | loss 0.028897 | mae 0.131097 -[2024/06/24 07:04:51] ppsci INFO: train: epoch 1206 | step 30 | lr 0.000060 | loss 0.027424 | mae 0.122759 -[2024/06/24 07:04:51] ppsci INFO: train: epoch 1206 | step 38 | lr 0.000060 | loss 0.045981 | mae 0.150673 -[2024/06/24 07:04:51] ppsci INFO: epoch: 1206, train_loss: 0.028099, train_metric: 0.123218, eval_loss: 0.058610, eval_mae: 0.154404 -[2024/06/24 07:04:52] ppsci INFO: train: epoch 1207 | step 0 | lr 0.000060 | loss 0.029393 | mae 0.124456 -[2024/06/24 07:04:52] ppsci INFO: train: epoch 1207 | step 10 | lr 0.000060 | loss 0.032267 | mae 0.133980 -[2024/06/24 07:04:52] ppsci INFO: train: epoch 1207 | step 20 | lr 0.000060 | loss 0.017631 | mae 0.100640 -[2024/06/24 07:04:53] ppsci INFO: train: epoch 1207 | step 30 | lr 0.000060 | loss 0.043040 | mae 0.142427 -[2024/06/24 07:04:53] ppsci INFO: train: epoch 1207 | step 38 | lr 0.000060 | loss 0.017357 | mae 0.106625 -[2024/06/24 07:04:53] ppsci INFO: epoch: 1207, train_loss: 0.028095, train_metric: 0.125159, eval_loss: 0.057308, eval_mae: 0.154405 -[2024/06/24 07:04:54] ppsci INFO: train: epoch 1208 | step 0 | lr 0.000060 | loss 0.040068 | mae 0.143162 -[2024/06/24 07:04:54] ppsci INFO: train: epoch 1208 | step 10 | lr 0.000060 | loss 0.041840 | mae 0.144969 -[2024/06/24 07:04:55] ppsci INFO: train: epoch 1208 | step 20 | lr 0.000060 | loss 0.016238 | mae 0.096263 -[2024/06/24 07:04:55] ppsci INFO: train: epoch 1208 | step 30 | lr 0.000060 | loss 0.028951 | mae 0.130495 -[2024/06/24 07:04:55] ppsci INFO: train: epoch 1208 | step 38 | lr 0.000060 | loss 0.021261 | mae 0.111803 -[2024/06/24 07:04:56] ppsci INFO: epoch: 1208, train_loss: 0.027073, train_metric: 0.121412, eval_loss: 0.055566, eval_mae: 0.151964 -[2024/06/24 07:04:56] ppsci INFO: train: epoch 1209 | step 0 | lr 0.000061 | loss 0.034895 | mae 0.125626 -[2024/06/24 07:04:56] ppsci INFO: train: epoch 1209 | step 10 | lr 0.000061 | loss 0.032844 | mae 0.129132 -[2024/06/24 07:04:57] ppsci INFO: train: epoch 1209 | step 20 | lr 0.000061 | loss 0.032067 | mae 0.132346 -[2024/06/24 07:04:57] ppsci INFO: train: epoch 1209 | step 30 | lr 0.000061 | loss 0.020831 | mae 0.103671 -[2024/06/24 07:04:58] ppsci INFO: train: epoch 1209 | step 38 | lr 0.000061 | loss 0.026777 | mae 0.132803 -[2024/06/24 07:04:58] ppsci INFO: epoch: 1209, train_loss: 0.027872, train_metric: 0.122615, eval_loss: 0.054470, eval_mae: 0.151949 -[2024/06/24 07:04:58] ppsci INFO: train: epoch 1210 | step 0 | lr 0.000061 | loss 0.034184 | mae 0.133965 -[2024/06/24 07:04:58] ppsci INFO: train: epoch 1210 | step 10 | lr 0.000061 | loss 0.022380 | mae 0.113432 -[2024/06/24 07:04:59] ppsci INFO: train: epoch 1210 | step 20 | lr 0.000061 | loss 0.040682 | mae 0.141735 -[2024/06/24 07:04:59] ppsci INFO: train: epoch 1210 | step 30 | lr 0.000061 | loss 0.021954 | mae 0.112076 -[2024/06/24 07:05:00] ppsci INFO: train: epoch 1210 | step 38 | lr 0.000061 | loss 0.024570 | mae 0.135226 -[2024/06/24 07:05:00] ppsci INFO: epoch: 1210, train_loss: 0.027605, train_metric: 0.123234, eval_loss: 0.054850, eval_mae: 0.151705 -[2024/06/24 07:05:00] ppsci INFO: train: epoch 1211 | step 0 | lr 0.000062 | loss 0.027914 | mae 0.126163 -[2024/06/24 07:05:00] ppsci INFO: train: epoch 1211 | step 10 | lr 0.000062 | loss 0.032265 | mae 0.128379 -[2024/06/24 07:05:01] ppsci INFO: train: epoch 1211 | step 20 | lr 0.000062 | loss 0.029053 | mae 0.127966 -[2024/06/24 07:05:02] ppsci INFO: train: epoch 1211 | step 30 | lr 0.000062 | loss 0.027456 | mae 0.124922 -[2024/06/24 07:05:02] ppsci INFO: train: epoch 1211 | step 38 | lr 0.000062 | loss 0.015992 | mae 0.101101 -[2024/06/24 07:05:02] ppsci INFO: epoch: 1211, train_loss: 0.028272, train_metric: 0.124082, eval_loss: 0.055101, eval_mae: 0.151481 -[2024/06/24 07:05:02] ppsci INFO: train: epoch 1212 | step 0 | lr 0.000062 | loss 0.023297 | mae 0.114862 -[2024/06/24 07:05:03] ppsci INFO: train: epoch 1212 | step 10 | lr 0.000062 | loss 0.027998 | mae 0.120660 -[2024/06/24 07:05:03] ppsci INFO: train: epoch 1212 | step 20 | lr 0.000062 | loss 0.016681 | mae 0.101170 -[2024/06/24 07:05:04] ppsci INFO: train: epoch 1212 | step 30 | lr 0.000062 | loss 0.025406 | mae 0.117922 -[2024/06/24 07:05:04] ppsci INFO: train: epoch 1212 | step 38 | lr 0.000062 | loss 0.014699 | mae 0.102902 -[2024/06/24 07:05:04] ppsci INFO: epoch: 1212, train_loss: 0.029251, train_metric: 0.126219, eval_loss: 0.054459, eval_mae: 0.150971 -[2024/06/24 07:05:04] ppsci INFO: train: epoch 1213 | step 0 | lr 0.000063 | loss 0.042156 | mae 0.136481 -[2024/06/24 07:05:05] ppsci INFO: train: epoch 1213 | step 10 | lr 0.000063 | loss 0.024601 | mae 0.122226 -[2024/06/24 07:05:05] ppsci INFO: train: epoch 1213 | step 20 | lr 0.000063 | loss 0.018319 | mae 0.103206 -[2024/06/24 07:05:06] ppsci INFO: train: epoch 1213 | step 30 | lr 0.000063 | loss 0.019874 | mae 0.106358 -[2024/06/24 07:05:06] ppsci INFO: train: epoch 1213 | step 38 | lr 0.000063 | loss 0.019406 | mae 0.108285 -[2024/06/24 07:05:06] ppsci INFO: epoch: 1213, train_loss: 0.028807, train_metric: 0.125219, eval_loss: 0.055639, eval_mae: 0.153550 -[2024/06/24 07:05:06] ppsci INFO: train: epoch 1214 | step 0 | lr 0.000063 | loss 0.031555 | mae 0.131987 -[2024/06/24 07:05:07] ppsci INFO: train: epoch 1214 | step 10 | lr 0.000063 | loss 0.029768 | mae 0.124154 -[2024/06/24 07:05:07] ppsci INFO: train: epoch 1214 | step 20 | lr 0.000063 | loss 0.027421 | mae 0.131427 -[2024/06/24 07:05:08] ppsci INFO: train: epoch 1214 | step 30 | lr 0.000063 | loss 0.027478 | mae 0.125639 -[2024/06/24 07:05:08] ppsci INFO: train: epoch 1214 | step 38 | lr 0.000063 | loss 0.045326 | mae 0.132953 -[2024/06/24 07:05:09] ppsci INFO: epoch: 1214, train_loss: 0.027488, train_metric: 0.121564, eval_loss: 0.056920, eval_mae: 0.152447 -[2024/06/24 07:05:09] ppsci INFO: train: epoch 1215 | step 0 | lr 0.000064 | loss 0.023571 | mae 0.118443 -[2024/06/24 07:05:09] ppsci INFO: train: epoch 1215 | step 10 | lr 0.000064 | loss 0.023064 | mae 0.115605 -[2024/06/24 07:05:10] ppsci INFO: train: epoch 1215 | step 20 | lr 0.000064 | loss 0.023747 | mae 0.118531 -[2024/06/24 07:05:10] ppsci INFO: train: epoch 1215 | step 30 | lr 0.000064 | loss 0.026003 | mae 0.121618 -[2024/06/24 07:05:11] ppsci INFO: train: epoch 1215 | step 38 | lr 0.000064 | loss 0.019840 | mae 0.096658 -[2024/06/24 07:05:11] ppsci INFO: epoch: 1215, train_loss: 0.027080, train_metric: 0.122546, eval_loss: 0.054339, eval_mae: 0.152219 -[2024/06/24 07:05:11] ppsci INFO: train: epoch 1216 | step 0 | lr 0.000064 | loss 0.031517 | mae 0.113834 -[2024/06/24 07:05:11] ppsci INFO: train: epoch 1216 | step 10 | lr 0.000064 | loss 0.030654 | mae 0.129360 -[2024/06/24 07:05:12] ppsci INFO: train: epoch 1216 | step 20 | lr 0.000064 | loss 0.019304 | mae 0.110831 -[2024/06/24 07:05:12] ppsci INFO: train: epoch 1216 | step 30 | lr 0.000064 | loss 0.029518 | mae 0.133109 -[2024/06/24 07:05:13] ppsci INFO: train: epoch 1216 | step 38 | lr 0.000064 | loss 0.023624 | mae 0.134939 -[2024/06/24 07:05:13] ppsci INFO: epoch: 1216, train_loss: 0.027453, train_metric: 0.123022, eval_loss: 0.054781, eval_mae: 0.152086 -[2024/06/24 07:05:13] ppsci INFO: train: epoch 1217 | step 0 | lr 0.000065 | loss 0.034724 | mae 0.128829 -[2024/06/24 07:05:14] ppsci INFO: train: epoch 1217 | step 10 | lr 0.000065 | loss 0.025994 | mae 0.123598 -[2024/06/24 07:05:14] ppsci INFO: train: epoch 1217 | step 20 | lr 0.000065 | loss 0.028242 | mae 0.120679 -[2024/06/24 07:05:15] ppsci INFO: train: epoch 1217 | step 30 | lr 0.000065 | loss 0.021243 | mae 0.109921 -[2024/06/24 07:05:15] ppsci INFO: train: epoch 1217 | step 38 | lr 0.000065 | loss 0.020490 | mae 0.129229 -[2024/06/24 07:05:15] ppsci INFO: epoch: 1217, train_loss: 0.026621, train_metric: 0.120499, eval_loss: 0.055978, eval_mae: 0.153719 -[2024/06/24 07:05:15] ppsci INFO: train: epoch 1218 | step 0 | lr 0.000065 | loss 0.018432 | mae 0.105901 -[2024/06/24 07:05:16] ppsci INFO: train: epoch 1218 | step 10 | lr 0.000065 | loss 0.028250 | mae 0.122850 -[2024/06/24 07:05:17] ppsci INFO: train: epoch 1218 | step 20 | lr 0.000065 | loss 0.034561 | mae 0.136146 -[2024/06/24 07:05:17] ppsci INFO: train: epoch 1218 | step 30 | lr 0.000065 | loss 0.031226 | mae 0.129627 -[2024/06/24 07:05:17] ppsci INFO: train: epoch 1218 | step 38 | lr 0.000065 | loss 0.039283 | mae 0.141595 -[2024/06/24 07:05:18] ppsci INFO: epoch: 1218, train_loss: 0.028152, train_metric: 0.123106, eval_loss: 0.054995, eval_mae: 0.151660 -[2024/06/24 07:05:18] ppsci INFO: train: epoch 1219 | step 0 | lr 0.000066 | loss 0.024442 | mae 0.118293 -[2024/06/24 07:05:18] ppsci INFO: train: epoch 1219 | step 10 | lr 0.000066 | loss 0.026301 | mae 0.113452 -[2024/06/24 07:05:19] ppsci INFO: train: epoch 1219 | step 20 | lr 0.000066 | loss 0.026229 | mae 0.121081 -[2024/06/24 07:05:19] ppsci INFO: train: epoch 1219 | step 30 | lr 0.000066 | loss 0.037328 | mae 0.137813 -[2024/06/24 07:05:20] ppsci INFO: train: epoch 1219 | step 38 | lr 0.000066 | loss 0.153749 | mae 0.268182 -[2024/06/24 07:05:20] ppsci INFO: epoch: 1219, train_loss: 0.032812, train_metric: 0.127698, eval_loss: 0.055609, eval_mae: 0.152641 -[2024/06/24 07:05:20] ppsci INFO: train: epoch 1220 | step 0 | lr 0.000066 | loss 0.033362 | mae 0.127066 -[2024/06/24 07:05:20] ppsci INFO: train: epoch 1220 | step 10 | lr 0.000066 | loss 0.028355 | mae 0.129120 -[2024/06/24 07:05:21] ppsci INFO: train: epoch 1220 | step 20 | lr 0.000066 | loss 0.029396 | mae 0.128167 -[2024/06/24 07:05:21] ppsci INFO: train: epoch 1220 | step 30 | lr 0.000066 | loss 0.035314 | mae 0.138057 -[2024/06/24 07:05:22] ppsci INFO: train: epoch 1220 | step 38 | lr 0.000066 | loss 0.031421 | mae 0.121183 -[2024/06/24 07:05:22] ppsci INFO: epoch: 1220, train_loss: 0.028970, train_metric: 0.125401, eval_loss: 0.056159, eval_mae: 0.154552 -[2024/06/24 07:05:22] ppsci INFO: train: epoch 1221 | step 0 | lr 0.000067 | loss 0.024249 | mae 0.115564 -[2024/06/24 07:05:22] ppsci INFO: train: epoch 1221 | step 10 | lr 0.000067 | loss 0.035500 | mae 0.129032 -[2024/06/24 07:05:23] ppsci INFO: train: epoch 1221 | step 20 | lr 0.000067 | loss 0.026976 | mae 0.125297 -[2024/06/24 07:05:23] ppsci INFO: train: epoch 1221 | step 30 | lr 0.000067 | loss 0.026184 | mae 0.120819 -[2024/06/24 07:05:24] ppsci INFO: train: epoch 1221 | step 38 | lr 0.000067 | loss 0.009394 | mae 0.073734 -[2024/06/24 07:05:24] ppsci INFO: epoch: 1221, train_loss: 0.027565, train_metric: 0.123859, eval_loss: 0.056076, eval_mae: 0.153818 -[2024/06/24 07:05:24] ppsci INFO: train: epoch 1222 | step 0 | lr 0.000067 | loss 0.030728 | mae 0.126497 -[2024/06/24 07:05:25] ppsci INFO: train: epoch 1222 | step 10 | lr 0.000067 | loss 0.021386 | mae 0.114933 -[2024/06/24 07:05:25] ppsci INFO: train: epoch 1222 | step 20 | lr 0.000067 | loss 0.036897 | mae 0.144573 -[2024/06/24 07:05:26] ppsci INFO: train: epoch 1222 | step 30 | lr 0.000067 | loss 0.023866 | mae 0.117745 -[2024/06/24 07:05:26] ppsci INFO: train: epoch 1222 | step 38 | lr 0.000067 | loss 0.019917 | mae 0.120918 -[2024/06/24 07:05:26] ppsci INFO: epoch: 1222, train_loss: 0.027930, train_metric: 0.123865, eval_loss: 0.053594, eval_mae: 0.152753 -[2024/06/24 07:05:26] ppsci INFO: train: epoch 1223 | step 0 | lr 0.000068 | loss 0.026067 | mae 0.119666 -[2024/06/24 07:05:27] ppsci INFO: train: epoch 1223 | step 10 | lr 0.000068 | loss 0.042783 | mae 0.143814 -[2024/06/24 07:05:27] ppsci INFO: train: epoch 1223 | step 20 | lr 0.000068 | loss 0.022187 | mae 0.116616 -[2024/06/24 07:05:28] ppsci INFO: train: epoch 1223 | step 30 | lr 0.000068 | loss 0.022961 | mae 0.115354 -[2024/06/24 07:05:28] ppsci INFO: train: epoch 1223 | step 38 | lr 0.000068 | loss 0.022987 | mae 0.107182 -[2024/06/24 07:05:28] ppsci INFO: epoch: 1223, train_loss: 0.027555, train_metric: 0.122281, eval_loss: 0.053260, eval_mae: 0.153232 -[2024/06/24 07:05:28] ppsci INFO: train: epoch 1224 | step 0 | lr 0.000068 | loss 0.032097 | mae 0.137775 -[2024/06/24 07:05:29] ppsci INFO: train: epoch 1224 | step 10 | lr 0.000068 | loss 0.016903 | mae 0.098720 -[2024/06/24 07:05:29] ppsci INFO: train: epoch 1224 | step 20 | lr 0.000068 | loss 0.026223 | mae 0.118906 -[2024/06/24 07:05:30] ppsci INFO: train: epoch 1224 | step 30 | lr 0.000068 | loss 0.029559 | mae 0.125594 -[2024/06/24 07:05:30] ppsci INFO: train: epoch 1224 | step 38 | lr 0.000068 | loss 0.021267 | mae 0.116617 -[2024/06/24 07:05:30] ppsci INFO: epoch: 1224, train_loss: 0.027356, train_metric: 0.123110, eval_loss: 0.053409, eval_mae: 0.153191 -[2024/06/24 07:05:31] ppsci INFO: train: epoch 1225 | step 0 | lr 0.000069 | loss 0.033144 | mae 0.134130 -[2024/06/24 07:05:31] ppsci INFO: train: epoch 1225 | step 10 | lr 0.000069 | loss 0.039597 | mae 0.134897 -[2024/06/24 07:05:32] ppsci INFO: train: epoch 1225 | step 20 | lr 0.000069 | loss 0.035889 | mae 0.126798 -[2024/06/24 07:05:32] ppsci INFO: train: epoch 1225 | step 30 | lr 0.000069 | loss 0.024052 | mae 0.113402 -[2024/06/24 07:05:32] ppsci INFO: train: epoch 1225 | step 38 | lr 0.000069 | loss 0.048681 | mae 0.144712 -[2024/06/24 07:05:33] ppsci INFO: epoch: 1225, train_loss: 0.028039, train_metric: 0.123799, eval_loss: 0.055681, eval_mae: 0.152758 -[2024/06/24 07:05:33] ppsci INFO: train: epoch 1226 | step 0 | lr 0.000069 | loss 0.030636 | mae 0.132448 -[2024/06/24 07:05:33] ppsci INFO: train: epoch 1226 | step 10 | lr 0.000069 | loss 0.022131 | mae 0.115716 -[2024/06/24 07:05:34] ppsci INFO: train: epoch 1226 | step 20 | lr 0.000069 | loss 0.039467 | mae 0.149312 -[2024/06/24 07:05:34] ppsci INFO: train: epoch 1226 | step 30 | lr 0.000069 | loss 0.020890 | mae 0.112893 -[2024/06/24 07:05:35] ppsci INFO: train: epoch 1226 | step 38 | lr 0.000069 | loss 0.014498 | mae 0.098062 -[2024/06/24 07:05:35] ppsci INFO: epoch: 1226, train_loss: 0.031532, train_metric: 0.127501, eval_loss: 0.051881, eval_mae: 0.150045 -[2024/06/24 07:05:35] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:05:35] ppsci INFO: train: epoch 1227 | step 0 | lr 0.000070 | loss 0.027470 | mae 0.119237 -[2024/06/24 07:05:35] ppsci INFO: train: epoch 1227 | step 10 | lr 0.000070 | loss 0.018284 | mae 0.105691 -[2024/06/24 07:05:36] ppsci INFO: train: epoch 1227 | step 20 | lr 0.000070 | loss 0.025386 | mae 0.127808 -[2024/06/24 07:05:36] ppsci INFO: train: epoch 1227 | step 30 | lr 0.000070 | loss 0.029949 | mae 0.134104 -[2024/06/24 07:05:37] ppsci INFO: train: epoch 1227 | step 38 | lr 0.000070 | loss 0.013289 | mae 0.089702 -[2024/06/24 07:05:37] ppsci INFO: epoch: 1227, train_loss: 0.026849, train_metric: 0.122795, eval_loss: 0.051434, eval_mae: 0.151053 -[2024/06/24 07:05:37] ppsci INFO: train: epoch 1228 | step 0 | lr 0.000070 | loss 0.024673 | mae 0.114324 -[2024/06/24 07:05:37] ppsci INFO: train: epoch 1228 | step 10 | lr 0.000070 | loss 0.035014 | mae 0.140370 -[2024/06/24 07:05:38] ppsci INFO: train: epoch 1228 | step 20 | lr 0.000070 | loss 0.024420 | mae 0.106086 -[2024/06/24 07:05:38] ppsci INFO: train: epoch 1228 | step 30 | lr 0.000070 | loss 0.021826 | mae 0.117386 -[2024/06/24 07:05:39] ppsci INFO: train: epoch 1228 | step 38 | lr 0.000070 | loss 0.025352 | mae 0.128492 -[2024/06/24 07:05:39] ppsci INFO: epoch: 1228, train_loss: 0.028678, train_metric: 0.124726, eval_loss: 0.052267, eval_mae: 0.151621 -[2024/06/24 07:05:39] ppsci INFO: train: epoch 1229 | step 0 | lr 0.000071 | loss 0.026787 | mae 0.120086 -[2024/06/24 07:05:40] ppsci INFO: train: epoch 1229 | step 10 | lr 0.000071 | loss 0.031255 | mae 0.128359 -[2024/06/24 07:05:40] ppsci INFO: train: epoch 1229 | step 20 | lr 0.000071 | loss 0.026645 | mae 0.123706 -[2024/06/24 07:05:41] ppsci INFO: train: epoch 1229 | step 30 | lr 0.000071 | loss 0.025734 | mae 0.123188 -[2024/06/24 07:05:41] ppsci INFO: train: epoch 1229 | step 38 | lr 0.000071 | loss 0.031298 | mae 0.141982 -[2024/06/24 07:05:41] ppsci INFO: epoch: 1229, train_loss: 0.028873, train_metric: 0.124961, eval_loss: 0.053989, eval_mae: 0.152274 -[2024/06/24 07:05:41] ppsci INFO: train: epoch 1230 | step 0 | lr 0.000071 | loss 0.027679 | mae 0.123228 -[2024/06/24 07:05:42] ppsci INFO: train: epoch 1230 | step 10 | lr 0.000071 | loss 0.028465 | mae 0.126559 -[2024/06/24 07:05:42] ppsci INFO: train: epoch 1230 | step 20 | lr 0.000071 | loss 0.030969 | mae 0.126399 -[2024/06/24 07:05:43] ppsci INFO: train: epoch 1230 | step 30 | lr 0.000071 | loss 0.029386 | mae 0.127903 -[2024/06/24 07:05:43] ppsci INFO: train: epoch 1230 | step 38 | lr 0.000071 | loss 0.040906 | mae 0.173990 -[2024/06/24 07:05:43] ppsci INFO: epoch: 1230, train_loss: 0.029051, train_metric: 0.125695, eval_loss: 0.055226, eval_mae: 0.151392 -[2024/06/24 07:05:43] ppsci INFO: train: epoch 1231 | step 0 | lr 0.000072 | loss 0.039937 | mae 0.134608 -[2024/06/24 07:05:44] ppsci INFO: train: epoch 1231 | step 10 | lr 0.000072 | loss 0.023472 | mae 0.112027 -[2024/06/24 07:05:45] ppsci INFO: train: epoch 1231 | step 20 | lr 0.000072 | loss 0.032894 | mae 0.134502 -[2024/06/24 07:05:45] ppsci INFO: train: epoch 1231 | step 30 | lr 0.000072 | loss 0.034588 | mae 0.139187 -[2024/06/24 07:05:46] ppsci INFO: train: epoch 1231 | step 38 | lr 0.000072 | loss 0.061046 | mae 0.168411 -[2024/06/24 07:05:46] ppsci INFO: epoch: 1231, train_loss: 0.030162, train_metric: 0.125100, eval_loss: 0.053483, eval_mae: 0.151312 -[2024/06/24 07:05:46] ppsci INFO: train: epoch 1232 | step 0 | lr 0.000072 | loss 0.031137 | mae 0.137294 -[2024/06/24 07:05:46] ppsci INFO: train: epoch 1232 | step 10 | lr 0.000072 | loss 0.037457 | mae 0.140784 -[2024/06/24 07:05:47] ppsci INFO: train: epoch 1232 | step 20 | lr 0.000072 | loss 0.028185 | mae 0.131316 -[2024/06/24 07:05:47] ppsci INFO: train: epoch 1232 | step 30 | lr 0.000072 | loss 0.024970 | mae 0.120844 -[2024/06/24 07:05:48] ppsci INFO: train: epoch 1232 | step 38 | lr 0.000072 | loss 0.017405 | mae 0.110314 -[2024/06/24 07:05:48] ppsci INFO: epoch: 1232, train_loss: 0.027152, train_metric: 0.123580, eval_loss: 0.056247, eval_mae: 0.153659 -[2024/06/24 07:05:48] ppsci INFO: train: epoch 1233 | step 0 | lr 0.000073 | loss 0.034385 | mae 0.131094 -[2024/06/24 07:05:48] ppsci INFO: train: epoch 1233 | step 10 | lr 0.000073 | loss 0.045423 | mae 0.133072 -[2024/06/24 07:05:49] ppsci INFO: train: epoch 1233 | step 20 | lr 0.000073 | loss 0.021701 | mae 0.109648 -[2024/06/24 07:05:49] ppsci INFO: train: epoch 1233 | step 30 | lr 0.000073 | loss 0.021146 | mae 0.106468 -[2024/06/24 07:05:50] ppsci INFO: train: epoch 1233 | step 38 | lr 0.000073 | loss 0.008880 | mae 0.074331 -[2024/06/24 07:05:50] ppsci INFO: epoch: 1233, train_loss: 0.029262, train_metric: 0.126148, eval_loss: 0.055531, eval_mae: 0.150959 -[2024/06/24 07:05:50] ppsci INFO: train: epoch 1234 | step 0 | lr 0.000073 | loss 0.030548 | mae 0.128585 -[2024/06/24 07:05:51] ppsci INFO: train: epoch 1234 | step 10 | lr 0.000073 | loss 0.026293 | mae 0.119883 -[2024/06/24 07:05:51] ppsci INFO: train: epoch 1234 | step 20 | lr 0.000073 | loss 0.030388 | mae 0.130835 -[2024/06/24 07:05:52] ppsci INFO: train: epoch 1234 | step 30 | lr 0.000073 | loss 0.038288 | mae 0.132827 -[2024/06/24 07:05:52] ppsci INFO: train: epoch 1234 | step 38 | lr 0.000073 | loss 0.029265 | mae 0.125397 -[2024/06/24 07:05:52] ppsci INFO: epoch: 1234, train_loss: 0.029506, train_metric: 0.125788, eval_loss: 0.056145, eval_mae: 0.152767 -[2024/06/24 07:05:52] ppsci INFO: train: epoch 1235 | step 0 | lr 0.000074 | loss 0.025380 | mae 0.121602 -[2024/06/24 07:05:53] ppsci INFO: train: epoch 1235 | step 10 | lr 0.000074 | loss 0.022090 | mae 0.113219 -[2024/06/24 07:05:53] ppsci INFO: train: epoch 1235 | step 20 | lr 0.000074 | loss 0.024690 | mae 0.118366 -[2024/06/24 07:05:54] ppsci INFO: train: epoch 1235 | step 30 | lr 0.000074 | loss 0.028200 | mae 0.121938 -[2024/06/24 07:05:54] ppsci INFO: train: epoch 1235 | step 38 | lr 0.000074 | loss 0.169270 | mae 0.227100 -[2024/06/24 07:05:54] ppsci INFO: epoch: 1235, train_loss: 0.030553, train_metric: 0.121395, eval_loss: 0.057958, eval_mae: 0.153561 -[2024/06/24 07:05:54] ppsci INFO: train: epoch 1236 | step 0 | lr 0.000074 | loss 0.024514 | mae 0.116361 -[2024/06/24 07:05:55] ppsci INFO: train: epoch 1236 | step 10 | lr 0.000074 | loss 0.028817 | mae 0.134256 -[2024/06/24 07:05:56] ppsci INFO: train: epoch 1236 | step 20 | lr 0.000074 | loss 0.017324 | mae 0.100828 -[2024/06/24 07:05:56] ppsci INFO: train: epoch 1236 | step 30 | lr 0.000074 | loss 0.041843 | mae 0.140027 -[2024/06/24 07:05:56] ppsci INFO: train: epoch 1236 | step 38 | lr 0.000074 | loss 0.062870 | mae 0.199929 -[2024/06/24 07:05:56] ppsci INFO: epoch: 1236, train_loss: 0.030322, train_metric: 0.126766, eval_loss: 0.057072, eval_mae: 0.154561 -[2024/06/24 07:05:57] ppsci INFO: train: epoch 1237 | step 0 | lr 0.000075 | loss 0.051971 | mae 0.135175 -[2024/06/24 07:05:57] ppsci INFO: train: epoch 1237 | step 10 | lr 0.000075 | loss 0.025162 | mae 0.123681 -[2024/06/24 07:05:58] ppsci INFO: train: epoch 1237 | step 20 | lr 0.000075 | loss 0.025206 | mae 0.117855 -[2024/06/24 07:05:58] ppsci INFO: train: epoch 1237 | step 30 | lr 0.000075 | loss 0.025991 | mae 0.122669 -[2024/06/24 07:05:58] ppsci INFO: train: epoch 1237 | step 38 | lr 0.000075 | loss 0.076934 | mae 0.204179 -[2024/06/24 07:05:59] ppsci INFO: epoch: 1237, train_loss: 0.029849, train_metric: 0.123334, eval_loss: 0.055101, eval_mae: 0.153294 -[2024/06/24 07:05:59] ppsci INFO: train: epoch 1238 | step 0 | lr 0.000075 | loss 0.021709 | mae 0.112338 -[2024/06/24 07:05:59] ppsci INFO: train: epoch 1238 | step 10 | lr 0.000075 | loss 0.027198 | mae 0.120558 -[2024/06/24 07:06:00] ppsci INFO: train: epoch 1238 | step 20 | lr 0.000075 | loss 0.037095 | mae 0.140894 -[2024/06/24 07:06:00] ppsci INFO: train: epoch 1238 | step 30 | lr 0.000075 | loss 0.023551 | mae 0.115506 -[2024/06/24 07:06:01] ppsci INFO: train: epoch 1238 | step 38 | lr 0.000075 | loss 0.020281 | mae 0.099587 -[2024/06/24 07:06:01] ppsci INFO: epoch: 1238, train_loss: 0.028681, train_metric: 0.123946, eval_loss: 0.057663, eval_mae: 0.154801 -[2024/06/24 07:06:01] ppsci INFO: train: epoch 1239 | step 0 | lr 0.000076 | loss 0.029757 | mae 0.129389 -[2024/06/24 07:06:01] ppsci INFO: train: epoch 1239 | step 10 | lr 0.000076 | loss 0.019439 | mae 0.106552 -[2024/06/24 07:06:02] ppsci INFO: train: epoch 1239 | step 20 | lr 0.000076 | loss 0.027199 | mae 0.120249 -[2024/06/24 07:06:02] ppsci INFO: train: epoch 1239 | step 30 | lr 0.000076 | loss 0.022854 | mae 0.109895 -[2024/06/24 07:06:03] ppsci INFO: train: epoch 1239 | step 38 | lr 0.000076 | loss 0.036695 | mae 0.153762 -[2024/06/24 07:06:03] ppsci INFO: epoch: 1239, train_loss: 0.029436, train_metric: 0.125883, eval_loss: 0.054436, eval_mae: 0.151010 -[2024/06/24 07:06:03] ppsci INFO: train: epoch 1240 | step 0 | lr 0.000076 | loss 0.025107 | mae 0.117441 -[2024/06/24 07:06:03] ppsci INFO: train: epoch 1240 | step 10 | lr 0.000076 | loss 0.034970 | mae 0.126338 -[2024/06/24 07:06:04] ppsci INFO: train: epoch 1240 | step 20 | lr 0.000076 | loss 0.032904 | mae 0.135762 -[2024/06/24 07:06:04] ppsci INFO: train: epoch 1240 | step 30 | lr 0.000076 | loss 0.030115 | mae 0.124522 -[2024/06/24 07:06:05] ppsci INFO: train: epoch 1240 | step 38 | lr 0.000076 | loss 0.025870 | mae 0.146868 -[2024/06/24 07:06:05] ppsci INFO: epoch: 1240, train_loss: 0.027281, train_metric: 0.122309, eval_loss: 0.054163, eval_mae: 0.150826 -[2024/06/24 07:06:05] ppsci INFO: train: epoch 1241 | step 0 | lr 0.000077 | loss 0.027619 | mae 0.118636 -[2024/06/24 07:06:06] ppsci INFO: train: epoch 1241 | step 10 | lr 0.000077 | loss 0.024928 | mae 0.120650 -[2024/06/24 07:06:06] ppsci INFO: train: epoch 1241 | step 20 | lr 0.000077 | loss 0.030414 | mae 0.127150 -[2024/06/24 07:06:06] ppsci INFO: train: epoch 1241 | step 30 | lr 0.000077 | loss 0.023139 | mae 0.121832 -[2024/06/24 07:06:07] ppsci INFO: train: epoch 1241 | step 38 | lr 0.000077 | loss 0.022848 | mae 0.122575 -[2024/06/24 07:06:07] ppsci INFO: epoch: 1241, train_loss: 0.028120, train_metric: 0.123625, eval_loss: 0.053177, eval_mae: 0.151926 -[2024/06/24 07:06:07] ppsci INFO: train: epoch 1242 | step 0 | lr 0.000077 | loss 0.019988 | mae 0.109733 -[2024/06/24 07:06:08] ppsci INFO: train: epoch 1242 | step 10 | lr 0.000077 | loss 0.038229 | mae 0.144888 -[2024/06/24 07:06:08] ppsci INFO: train: epoch 1242 | step 20 | lr 0.000077 | loss 0.033662 | mae 0.138692 -[2024/06/24 07:06:09] ppsci INFO: train: epoch 1242 | step 30 | lr 0.000077 | loss 0.017695 | mae 0.094138 -[2024/06/24 07:06:09] ppsci INFO: train: epoch 1242 | step 38 | lr 0.000077 | loss 0.064109 | mae 0.182243 -[2024/06/24 07:06:09] ppsci INFO: epoch: 1242, train_loss: 0.031433, train_metric: 0.125888, eval_loss: 0.055672, eval_mae: 0.153056 -[2024/06/24 07:06:09] ppsci INFO: train: epoch 1243 | step 0 | lr 0.000078 | loss 0.024668 | mae 0.115693 -[2024/06/24 07:06:10] ppsci INFO: train: epoch 1243 | step 10 | lr 0.000078 | loss 0.034907 | mae 0.139151 -[2024/06/24 07:06:10] ppsci INFO: train: epoch 1243 | step 20 | lr 0.000078 | loss 0.044278 | mae 0.138465 -[2024/06/24 07:06:11] ppsci INFO: train: epoch 1243 | step 30 | lr 0.000078 | loss 0.030119 | mae 0.131285 -[2024/06/24 07:06:11] ppsci INFO: train: epoch 1243 | step 38 | lr 0.000078 | loss 0.033615 | mae 0.120158 -[2024/06/24 07:06:11] ppsci INFO: epoch: 1243, train_loss: 0.027911, train_metric: 0.122603, eval_loss: 0.055543, eval_mae: 0.151903 -[2024/06/24 07:06:11] ppsci INFO: train: epoch 1244 | step 0 | lr 0.000079 | loss 0.032186 | mae 0.133364 -[2024/06/24 07:06:12] ppsci INFO: train: epoch 1244 | step 10 | lr 0.000079 | loss 0.021185 | mae 0.111277 -[2024/06/24 07:06:12] ppsci INFO: train: epoch 1244 | step 20 | lr 0.000079 | loss 0.027338 | mae 0.123861 -[2024/06/24 07:06:13] ppsci INFO: train: epoch 1244 | step 30 | lr 0.000079 | loss 0.024514 | mae 0.118048 -[2024/06/24 07:06:13] ppsci INFO: train: epoch 1244 | step 38 | lr 0.000079 | loss 0.064356 | mae 0.184004 -[2024/06/24 07:06:13] ppsci INFO: epoch: 1244, train_loss: 0.030333, train_metric: 0.126772, eval_loss: 0.054216, eval_mae: 0.151719 -[2024/06/24 07:06:13] ppsci INFO: train: epoch 1245 | step 0 | lr 0.000079 | loss 0.033591 | mae 0.138901 -[2024/06/24 07:06:14] ppsci INFO: train: epoch 1245 | step 10 | lr 0.000079 | loss 0.029950 | mae 0.132378 -[2024/06/24 07:06:14] ppsci INFO: train: epoch 1245 | step 20 | lr 0.000079 | loss 0.032689 | mae 0.130628 -[2024/06/24 07:06:15] ppsci INFO: train: epoch 1245 | step 30 | lr 0.000079 | loss 0.031180 | mae 0.126567 -[2024/06/24 07:06:15] ppsci INFO: train: epoch 1245 | step 38 | lr 0.000079 | loss 0.032924 | mae 0.144628 -[2024/06/24 07:06:15] ppsci INFO: epoch: 1245, train_loss: 0.028907, train_metric: 0.125556, eval_loss: 0.053860, eval_mae: 0.151447 -[2024/06/24 07:06:16] ppsci INFO: train: epoch 1246 | step 0 | lr 0.000080 | loss 0.022853 | mae 0.120268 -[2024/06/24 07:06:16] ppsci INFO: train: epoch 1246 | step 10 | lr 0.000080 | loss 0.034640 | mae 0.116912 -[2024/06/24 07:06:17] ppsci INFO: train: epoch 1246 | step 20 | lr 0.000080 | loss 0.036242 | mae 0.142306 -[2024/06/24 07:06:17] ppsci INFO: train: epoch 1246 | step 30 | lr 0.000080 | loss 0.031750 | mae 0.127013 -[2024/06/24 07:06:18] ppsci INFO: train: epoch 1246 | step 38 | lr 0.000080 | loss 0.011193 | mae 0.088703 -[2024/06/24 07:06:18] ppsci INFO: epoch: 1246, train_loss: 0.027657, train_metric: 0.121499, eval_loss: 0.053181, eval_mae: 0.152276 -[2024/06/24 07:06:18] ppsci INFO: train: epoch 1247 | step 0 | lr 0.000080 | loss 0.030005 | mae 0.131291 -[2024/06/24 07:06:18] ppsci INFO: train: epoch 1247 | step 10 | lr 0.000080 | loss 0.026216 | mae 0.114401 -[2024/06/24 07:06:19] ppsci INFO: train: epoch 1247 | step 20 | lr 0.000080 | loss 0.027825 | mae 0.119308 -[2024/06/24 07:06:19] ppsci INFO: train: epoch 1247 | step 30 | lr 0.000080 | loss 0.038596 | mae 0.138731 -[2024/06/24 07:06:20] ppsci INFO: train: epoch 1247 | step 38 | lr 0.000080 | loss 0.026509 | mae 0.136787 -[2024/06/24 07:06:20] ppsci INFO: epoch: 1247, train_loss: 0.028794, train_metric: 0.123864, eval_loss: 0.053376, eval_mae: 0.151083 -[2024/06/24 07:06:20] ppsci INFO: train: epoch 1248 | step 0 | lr 0.000081 | loss 0.021461 | mae 0.112904 -[2024/06/24 07:06:21] ppsci INFO: train: epoch 1248 | step 10 | lr 0.000081 | loss 0.027619 | mae 0.120547 -[2024/06/24 07:06:21] ppsci INFO: train: epoch 1248 | step 20 | lr 0.000081 | loss 0.027532 | mae 0.125414 -[2024/06/24 07:06:22] ppsci INFO: train: epoch 1248 | step 30 | lr 0.000081 | loss 0.035976 | mae 0.136060 -[2024/06/24 07:06:22] ppsci INFO: train: epoch 1248 | step 38 | lr 0.000081 | loss 0.044044 | mae 0.135650 -[2024/06/24 07:06:22] ppsci INFO: epoch: 1248, train_loss: 0.029890, train_metric: 0.125860, eval_loss: 0.054882, eval_mae: 0.151961 -[2024/06/24 07:06:22] ppsci INFO: train: epoch 1249 | step 0 | lr 0.000081 | loss 0.027201 | mae 0.124075 -[2024/06/24 07:06:23] ppsci INFO: train: epoch 1249 | step 10 | lr 0.000081 | loss 0.020146 | mae 0.109739 -[2024/06/24 07:06:23] ppsci INFO: train: epoch 1249 | step 20 | lr 0.000081 | loss 0.021558 | mae 0.114400 -[2024/06/24 07:06:24] ppsci INFO: train: epoch 1249 | step 30 | lr 0.000081 | loss 0.020099 | mae 0.106154 -[2024/06/24 07:06:24] ppsci INFO: train: epoch 1249 | step 38 | lr 0.000081 | loss 0.012447 | mae 0.094159 -[2024/06/24 07:06:24] ppsci INFO: epoch: 1249, train_loss: 0.029507, train_metric: 0.125539, eval_loss: 0.055813, eval_mae: 0.152407 -[2024/06/24 07:06:24] ppsci INFO: train: epoch 1250 | step 0 | lr 0.000082 | loss 0.028929 | mae 0.121327 -[2024/06/24 07:06:25] ppsci INFO: train: epoch 1250 | step 10 | lr 0.000082 | loss 0.025818 | mae 0.126448 -[2024/06/24 07:06:25] ppsci INFO: train: epoch 1250 | step 20 | lr 0.000082 | loss 0.033746 | mae 0.136246 -[2024/06/24 07:06:26] ppsci INFO: train: epoch 1250 | step 30 | lr 0.000082 | loss 0.022477 | mae 0.111693 -[2024/06/24 07:06:26] ppsci INFO: train: epoch 1250 | step 38 | lr 0.000082 | loss 0.027823 | mae 0.140289 -[2024/06/24 07:06:26] ppsci INFO: epoch: 1250, train_loss: 0.026454, train_metric: 0.121756, eval_loss: 0.054016, eval_mae: 0.150789 -[2024/06/24 07:06:26] ppsci INFO: train: epoch 1251 | step 0 | lr 0.000082 | loss 0.025347 | mae 0.121672 -[2024/06/24 07:06:27] ppsci INFO: train: epoch 1251 | step 10 | lr 0.000082 | loss 0.028912 | mae 0.125267 -[2024/06/24 07:06:27] ppsci INFO: train: epoch 1251 | step 20 | lr 0.000082 | loss 0.021872 | mae 0.111142 -[2024/06/24 07:06:28] ppsci INFO: train: epoch 1251 | step 30 | lr 0.000082 | loss 0.070267 | mae 0.157575 -[2024/06/24 07:06:28] ppsci INFO: train: epoch 1251 | step 38 | lr 0.000082 | loss 0.015336 | mae 0.096446 -[2024/06/24 07:06:28] ppsci INFO: epoch: 1251, train_loss: 0.028318, train_metric: 0.122804, eval_loss: 0.055415, eval_mae: 0.151965 -[2024/06/24 07:06:28] ppsci INFO: train: epoch 1252 | step 0 | lr 0.000083 | loss 0.032290 | mae 0.122378 -[2024/06/24 07:06:29] ppsci INFO: train: epoch 1252 | step 10 | lr 0.000083 | loss 0.027299 | mae 0.126178 -[2024/06/24 07:06:29] ppsci INFO: train: epoch 1252 | step 20 | lr 0.000083 | loss 0.036364 | mae 0.125387 -[2024/06/24 07:06:30] ppsci INFO: train: epoch 1252 | step 30 | lr 0.000083 | loss 0.024155 | mae 0.115822 -[2024/06/24 07:06:30] ppsci INFO: train: epoch 1252 | step 38 | lr 0.000083 | loss 0.031012 | mae 0.138664 -[2024/06/24 07:06:31] ppsci INFO: epoch: 1252, train_loss: 0.029378, train_metric: 0.123555, eval_loss: 0.055668, eval_mae: 0.150018 -[2024/06/24 07:06:31] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:06:31] ppsci INFO: train: epoch 1253 | step 0 | lr 0.000083 | loss 0.032262 | mae 0.128039 -[2024/06/24 07:06:31] ppsci INFO: train: epoch 1253 | step 10 | lr 0.000083 | loss 0.022524 | mae 0.115691 -[2024/06/24 07:06:32] ppsci INFO: train: epoch 1253 | step 20 | lr 0.000083 | loss 0.020005 | mae 0.109392 -[2024/06/24 07:06:32] ppsci INFO: train: epoch 1253 | step 30 | lr 0.000083 | loss 0.040620 | mae 0.131865 -[2024/06/24 07:06:33] ppsci INFO: train: epoch 1253 | step 38 | lr 0.000083 | loss 0.036904 | mae 0.130215 -[2024/06/24 07:06:33] ppsci INFO: epoch: 1253, train_loss: 0.029567, train_metric: 0.123932, eval_loss: 0.055411, eval_mae: 0.154371 -[2024/06/24 07:06:33] ppsci INFO: train: epoch 1254 | step 0 | lr 0.000084 | loss 0.032365 | mae 0.126133 -[2024/06/24 07:06:33] ppsci INFO: train: epoch 1254 | step 10 | lr 0.000084 | loss 0.029173 | mae 0.123811 -[2024/06/24 07:06:34] ppsci INFO: train: epoch 1254 | step 20 | lr 0.000084 | loss 0.026567 | mae 0.121622 -[2024/06/24 07:06:34] ppsci INFO: train: epoch 1254 | step 30 | lr 0.000084 | loss 0.025330 | mae 0.120481 -[2024/06/24 07:06:35] ppsci INFO: train: epoch 1254 | step 38 | lr 0.000084 | loss 0.009915 | mae 0.084515 -[2024/06/24 07:06:35] ppsci INFO: epoch: 1254, train_loss: 0.027437, train_metric: 0.123429, eval_loss: 0.052804, eval_mae: 0.150452 -[2024/06/24 07:06:35] ppsci INFO: train: epoch 1255 | step 0 | lr 0.000085 | loss 0.026268 | mae 0.124954 -[2024/06/24 07:06:36] ppsci INFO: train: epoch 1255 | step 10 | lr 0.000085 | loss 0.034295 | mae 0.138981 -[2024/06/24 07:06:36] ppsci INFO: train: epoch 1255 | step 20 | lr 0.000085 | loss 0.028105 | mae 0.124148 -[2024/06/24 07:06:36] ppsci INFO: train: epoch 1255 | step 30 | lr 0.000085 | loss 0.039424 | mae 0.144405 -[2024/06/24 07:06:37] ppsci INFO: train: epoch 1255 | step 38 | lr 0.000085 | loss 0.008808 | mae 0.079212 -[2024/06/24 07:06:37] ppsci INFO: epoch: 1255, train_loss: 0.027403, train_metric: 0.123568, eval_loss: 0.054951, eval_mae: 0.152769 -[2024/06/24 07:06:37] ppsci INFO: train: epoch 1256 | step 0 | lr 0.000085 | loss 0.027429 | mae 0.127566 -[2024/06/24 07:06:38] ppsci INFO: train: epoch 1256 | step 10 | lr 0.000085 | loss 0.030992 | mae 0.133747 -[2024/06/24 07:06:38] ppsci INFO: train: epoch 1256 | step 20 | lr 0.000085 | loss 0.023163 | mae 0.115656 -[2024/06/24 07:06:39] ppsci INFO: train: epoch 1256 | step 30 | lr 0.000085 | loss 0.026453 | mae 0.118660 -[2024/06/24 07:06:39] ppsci INFO: train: epoch 1256 | step 38 | lr 0.000085 | loss 0.038816 | mae 0.131936 -[2024/06/24 07:06:39] ppsci INFO: epoch: 1256, train_loss: 0.028399, train_metric: 0.124887, eval_loss: 0.053231, eval_mae: 0.150101 -[2024/06/24 07:06:39] ppsci INFO: train: epoch 1257 | step 0 | lr 0.000086 | loss 0.029881 | mae 0.123027 -[2024/06/24 07:06:40] ppsci INFO: train: epoch 1257 | step 10 | lr 0.000086 | loss 0.026286 | mae 0.125650 -[2024/06/24 07:06:40] ppsci INFO: train: epoch 1257 | step 20 | lr 0.000086 | loss 0.031460 | mae 0.136091 -[2024/06/24 07:06:41] ppsci INFO: train: epoch 1257 | step 30 | lr 0.000086 | loss 0.028875 | mae 0.127660 -[2024/06/24 07:06:41] ppsci INFO: train: epoch 1257 | step 38 | lr 0.000086 | loss 0.041529 | mae 0.140840 -[2024/06/24 07:06:41] ppsci INFO: epoch: 1257, train_loss: 0.028958, train_metric: 0.124680, eval_loss: 0.053361, eval_mae: 0.151731 -[2024/06/24 07:06:41] ppsci INFO: train: epoch 1258 | step 0 | lr 0.000086 | loss 0.024545 | mae 0.116626 -[2024/06/24 07:06:42] ppsci INFO: train: epoch 1258 | step 10 | lr 0.000086 | loss 0.036185 | mae 0.116014 -[2024/06/24 07:06:42] ppsci INFO: train: epoch 1258 | step 20 | lr 0.000086 | loss 0.035655 | mae 0.121315 -[2024/06/24 07:06:43] ppsci INFO: train: epoch 1258 | step 30 | lr 0.000086 | loss 0.033947 | mae 0.137471 -[2024/06/24 07:06:43] ppsci INFO: train: epoch 1258 | step 38 | lr 0.000086 | loss 0.036154 | mae 0.141709 -[2024/06/24 07:06:43] ppsci INFO: epoch: 1258, train_loss: 0.029470, train_metric: 0.125078, eval_loss: 0.054621, eval_mae: 0.151776 -[2024/06/24 07:06:43] ppsci INFO: train: epoch 1259 | step 0 | lr 0.000087 | loss 0.028308 | mae 0.133263 -[2024/06/24 07:06:44] ppsci INFO: train: epoch 1259 | step 10 | lr 0.000087 | loss 0.023311 | mae 0.111113 -[2024/06/24 07:06:45] ppsci INFO: train: epoch 1259 | step 20 | lr 0.000087 | loss 0.026993 | mae 0.125434 -[2024/06/24 07:06:45] ppsci INFO: train: epoch 1259 | step 30 | lr 0.000087 | loss 0.034981 | mae 0.134970 -[2024/06/24 07:06:45] ppsci INFO: train: epoch 1259 | step 38 | lr 0.000087 | loss 0.045364 | mae 0.185890 -[2024/06/24 07:06:45] ppsci INFO: epoch: 1259, train_loss: 0.029282, train_metric: 0.126194, eval_loss: 0.054939, eval_mae: 0.151651 -[2024/06/24 07:06:46] ppsci INFO: train: epoch 1260 | step 0 | lr 0.000087 | loss 0.026978 | mae 0.127056 -[2024/06/24 07:06:46] ppsci INFO: train: epoch 1260 | step 10 | lr 0.000087 | loss 0.024705 | mae 0.114448 -[2024/06/24 07:06:47] ppsci INFO: train: epoch 1260 | step 20 | lr 0.000087 | loss 0.038620 | mae 0.137552 -[2024/06/24 07:06:47] ppsci INFO: train: epoch 1260 | step 30 | lr 0.000087 | loss 0.035272 | mae 0.132844 -[2024/06/24 07:06:48] ppsci INFO: train: epoch 1260 | step 38 | lr 0.000087 | loss 0.031672 | mae 0.150654 -[2024/06/24 07:06:48] ppsci INFO: epoch: 1260, train_loss: 0.029382, train_metric: 0.125631, eval_loss: 0.055549, eval_mae: 0.153915 -[2024/06/24 07:06:48] ppsci INFO: train: epoch 1261 | step 0 | lr 0.000088 | loss 0.033631 | mae 0.132586 -[2024/06/24 07:06:48] ppsci INFO: train: epoch 1261 | step 10 | lr 0.000088 | loss 0.020610 | mae 0.105905 -[2024/06/24 07:06:49] ppsci INFO: train: epoch 1261 | step 20 | lr 0.000088 | loss 0.027172 | mae 0.123505 -[2024/06/24 07:06:49] ppsci INFO: train: epoch 1261 | step 30 | lr 0.000088 | loss 0.036270 | mae 0.143830 -[2024/06/24 07:06:50] ppsci INFO: train: epoch 1261 | step 38 | lr 0.000088 | loss 0.023440 | mae 0.087310 -[2024/06/24 07:06:50] ppsci INFO: epoch: 1261, train_loss: 0.027337, train_metric: 0.122157, eval_loss: 0.057393, eval_mae: 0.153111 -[2024/06/24 07:06:50] ppsci INFO: train: epoch 1262 | step 0 | lr 0.000088 | loss 0.028755 | mae 0.133898 -[2024/06/24 07:06:51] ppsci INFO: train: epoch 1262 | step 10 | lr 0.000088 | loss 0.034576 | mae 0.137608 -[2024/06/24 07:06:51] ppsci INFO: train: epoch 1262 | step 20 | lr 0.000088 | loss 0.027584 | mae 0.123482 -[2024/06/24 07:06:52] ppsci INFO: train: epoch 1262 | step 30 | lr 0.000088 | loss 0.021053 | mae 0.107926 -[2024/06/24 07:06:52] ppsci INFO: train: epoch 1262 | step 38 | lr 0.000088 | loss 0.025912 | mae 0.124948 -[2024/06/24 07:06:52] ppsci INFO: epoch: 1262, train_loss: 0.027783, train_metric: 0.122943, eval_loss: 0.057127, eval_mae: 0.156369 -[2024/06/24 07:06:52] ppsci INFO: train: epoch 1263 | step 0 | lr 0.000089 | loss 0.023110 | mae 0.116428 -[2024/06/24 07:06:53] ppsci INFO: train: epoch 1263 | step 10 | lr 0.000089 | loss 0.019226 | mae 0.104229 -[2024/06/24 07:06:53] ppsci INFO: train: epoch 1263 | step 20 | lr 0.000089 | loss 0.025777 | mae 0.122875 -[2024/06/24 07:06:54] ppsci INFO: train: epoch 1263 | step 30 | lr 0.000089 | loss 0.032205 | mae 0.134710 -[2024/06/24 07:06:54] ppsci INFO: train: epoch 1263 | step 38 | lr 0.000089 | loss 0.048456 | mae 0.186048 -[2024/06/24 07:06:54] ppsci INFO: epoch: 1263, train_loss: 0.028257, train_metric: 0.122981, eval_loss: 0.055151, eval_mae: 0.152565 -[2024/06/24 07:06:54] ppsci INFO: train: epoch 1264 | step 0 | lr 0.000090 | loss 0.022908 | mae 0.119812 -[2024/06/24 07:06:55] ppsci INFO: train: epoch 1264 | step 10 | lr 0.000090 | loss 0.028123 | mae 0.127818 -[2024/06/24 07:06:55] ppsci INFO: train: epoch 1264 | step 20 | lr 0.000090 | loss 0.034304 | mae 0.135168 -[2024/06/24 07:06:56] ppsci INFO: train: epoch 1264 | step 30 | lr 0.000090 | loss 0.033881 | mae 0.134970 -[2024/06/24 07:06:56] ppsci INFO: train: epoch 1264 | step 38 | lr 0.000090 | loss 0.033213 | mae 0.116532 -[2024/06/24 07:06:56] ppsci INFO: epoch: 1264, train_loss: 0.027567, train_metric: 0.122781, eval_loss: 0.056420, eval_mae: 0.152071 -[2024/06/24 07:06:56] ppsci INFO: train: epoch 1265 | step 0 | lr 0.000090 | loss 0.028466 | mae 0.118402 -[2024/06/24 07:06:57] ppsci INFO: train: epoch 1265 | step 10 | lr 0.000090 | loss 0.028931 | mae 0.122242 -[2024/06/24 07:06:58] ppsci INFO: train: epoch 1265 | step 20 | lr 0.000090 | loss 0.030119 | mae 0.126596 -[2024/06/24 07:06:58] ppsci INFO: train: epoch 1265 | step 30 | lr 0.000090 | loss 0.021081 | mae 0.112765 -[2024/06/24 07:06:58] ppsci INFO: train: epoch 1265 | step 38 | lr 0.000090 | loss 0.021035 | mae 0.123490 -[2024/06/24 07:06:59] ppsci INFO: epoch: 1265, train_loss: 0.027350, train_metric: 0.122031, eval_loss: 0.055225, eval_mae: 0.150309 -[2024/06/24 07:06:59] ppsci INFO: train: epoch 1266 | step 0 | lr 0.000091 | loss 0.023527 | mae 0.105695 -[2024/06/24 07:06:59] ppsci INFO: train: epoch 1266 | step 10 | lr 0.000091 | loss 0.038503 | mae 0.125055 -[2024/06/24 07:07:00] ppsci INFO: train: epoch 1266 | step 20 | lr 0.000091 | loss 0.026341 | mae 0.122826 -[2024/06/24 07:07:00] ppsci INFO: train: epoch 1266 | step 30 | lr 0.000091 | loss 0.031098 | mae 0.135616 -[2024/06/24 07:07:01] ppsci INFO: train: epoch 1266 | step 38 | lr 0.000091 | loss 0.025442 | mae 0.133286 -[2024/06/24 07:07:01] ppsci INFO: epoch: 1266, train_loss: 0.028377, train_metric: 0.123508, eval_loss: 0.055529, eval_mae: 0.150705 -[2024/06/24 07:07:01] ppsci INFO: train: epoch 1267 | step 0 | lr 0.000091 | loss 0.027168 | mae 0.123568 -[2024/06/24 07:07:01] ppsci INFO: train: epoch 1267 | step 10 | lr 0.000091 | loss 0.033095 | mae 0.135014 -[2024/06/24 07:07:02] ppsci INFO: train: epoch 1267 | step 20 | lr 0.000091 | loss 0.032326 | mae 0.127455 -[2024/06/24 07:07:02] ppsci INFO: train: epoch 1267 | step 30 | lr 0.000091 | loss 0.023156 | mae 0.112800 -[2024/06/24 07:07:03] ppsci INFO: train: epoch 1267 | step 38 | lr 0.000091 | loss 0.027267 | mae 0.123107 -[2024/06/24 07:07:03] ppsci INFO: epoch: 1267, train_loss: 0.028679, train_metric: 0.124893, eval_loss: 0.054944, eval_mae: 0.151021 -[2024/06/24 07:07:03] ppsci INFO: train: epoch 1268 | step 0 | lr 0.000092 | loss 0.023266 | mae 0.116850 -[2024/06/24 07:07:03] ppsci INFO: train: epoch 1268 | step 10 | lr 0.000092 | loss 0.028687 | mae 0.127982 -[2024/06/24 07:07:04] ppsci INFO: train: epoch 1268 | step 20 | lr 0.000092 | loss 0.023511 | mae 0.109069 -[2024/06/24 07:07:04] ppsci INFO: train: epoch 1268 | step 30 | lr 0.000092 | loss 0.023330 | mae 0.110149 -[2024/06/24 07:07:05] ppsci INFO: train: epoch 1268 | step 38 | lr 0.000092 | loss 0.054865 | mae 0.177049 -[2024/06/24 07:07:05] ppsci INFO: epoch: 1268, train_loss: 0.029661, train_metric: 0.126245, eval_loss: 0.057275, eval_mae: 0.151617 -[2024/06/24 07:07:05] ppsci INFO: train: epoch 1269 | step 0 | lr 0.000092 | loss 0.030456 | mae 0.130060 -[2024/06/24 07:07:05] ppsci INFO: train: epoch 1269 | step 10 | lr 0.000092 | loss 0.025264 | mae 0.117980 -[2024/06/24 07:07:06] ppsci INFO: train: epoch 1269 | step 20 | lr 0.000092 | loss 0.025811 | mae 0.124729 -[2024/06/24 07:07:06] ppsci INFO: train: epoch 1269 | step 30 | lr 0.000092 | loss 0.027679 | mae 0.119852 -[2024/06/24 07:07:07] ppsci INFO: train: epoch 1269 | step 38 | lr 0.000092 | loss 0.009317 | mae 0.074184 -[2024/06/24 07:07:07] ppsci INFO: epoch: 1269, train_loss: 0.027927, train_metric: 0.122038, eval_loss: 0.057877, eval_mae: 0.152763 -[2024/06/24 07:07:07] ppsci INFO: train: epoch 1270 | step 0 | lr 0.000093 | loss 0.025804 | mae 0.121175 -[2024/06/24 07:07:08] ppsci INFO: train: epoch 1270 | step 10 | lr 0.000093 | loss 0.028263 | mae 0.125474 -[2024/06/24 07:07:08] ppsci INFO: train: epoch 1270 | step 20 | lr 0.000093 | loss 0.029728 | mae 0.133108 -[2024/06/24 07:07:09] ppsci INFO: train: epoch 1270 | step 30 | lr 0.000093 | loss 0.027396 | mae 0.131796 -[2024/06/24 07:07:09] ppsci INFO: train: epoch 1270 | step 38 | lr 0.000093 | loss 0.030132 | mae 0.139770 -[2024/06/24 07:07:09] ppsci INFO: epoch: 1270, train_loss: 0.027645, train_metric: 0.121807, eval_loss: 0.054024, eval_mae: 0.152643 -[2024/06/24 07:07:09] ppsci INFO: train: epoch 1271 | step 0 | lr 0.000094 | loss 0.027817 | mae 0.115670 -[2024/06/24 07:07:10] ppsci INFO: train: epoch 1271 | step 10 | lr 0.000094 | loss 0.037302 | mae 0.129090 -[2024/06/24 07:07:10] ppsci INFO: train: epoch 1271 | step 20 | lr 0.000094 | loss 0.032292 | mae 0.136536 -[2024/06/24 07:07:11] ppsci INFO: train: epoch 1271 | step 30 | lr 0.000094 | loss 0.040485 | mae 0.130172 -[2024/06/24 07:07:11] ppsci INFO: train: epoch 1271 | step 38 | lr 0.000094 | loss 0.015948 | mae 0.101361 -[2024/06/24 07:07:11] ppsci INFO: epoch: 1271, train_loss: 0.027234, train_metric: 0.122488, eval_loss: 0.054893, eval_mae: 0.151090 -[2024/06/24 07:07:11] ppsci INFO: train: epoch 1272 | step 0 | lr 0.000094 | loss 0.020796 | mae 0.109707 -[2024/06/24 07:07:12] ppsci INFO: train: epoch 1272 | step 10 | lr 0.000094 | loss 0.030308 | mae 0.132356 -[2024/06/24 07:07:12] ppsci INFO: train: epoch 1272 | step 20 | lr 0.000094 | loss 0.033644 | mae 0.132959 -[2024/06/24 07:07:13] ppsci INFO: train: epoch 1272 | step 30 | lr 0.000094 | loss 0.029514 | mae 0.130817 -[2024/06/24 07:07:13] ppsci INFO: train: epoch 1272 | step 38 | lr 0.000094 | loss 0.021168 | mae 0.118718 -[2024/06/24 07:07:13] ppsci INFO: epoch: 1272, train_loss: 0.027996, train_metric: 0.123145, eval_loss: 0.054279, eval_mae: 0.152541 -[2024/06/24 07:07:14] ppsci INFO: train: epoch 1273 | step 0 | lr 0.000095 | loss 0.031957 | mae 0.118648 -[2024/06/24 07:07:14] ppsci INFO: train: epoch 1273 | step 10 | lr 0.000095 | loss 0.032581 | mae 0.135091 -[2024/06/24 07:07:15] ppsci INFO: train: epoch 1273 | step 20 | lr 0.000095 | loss 0.027823 | mae 0.124895 -[2024/06/24 07:07:15] ppsci INFO: train: epoch 1273 | step 30 | lr 0.000095 | loss 0.025162 | mae 0.115679 -[2024/06/24 07:07:16] ppsci INFO: train: epoch 1273 | step 38 | lr 0.000095 | loss 0.021924 | mae 0.094061 -[2024/06/24 07:07:16] ppsci INFO: epoch: 1273, train_loss: 0.028534, train_metric: 0.123322, eval_loss: 0.053254, eval_mae: 0.152280 -[2024/06/24 07:07:16] ppsci INFO: train: epoch 1274 | step 0 | lr 0.000095 | loss 0.032850 | mae 0.135183 -[2024/06/24 07:07:16] ppsci INFO: train: epoch 1274 | step 10 | lr 0.000095 | loss 0.034872 | mae 0.132858 -[2024/06/24 07:07:17] ppsci INFO: train: epoch 1274 | step 20 | lr 0.000095 | loss 0.016279 | mae 0.096551 -[2024/06/24 07:07:17] ppsci INFO: train: epoch 1274 | step 30 | lr 0.000095 | loss 0.022972 | mae 0.108163 -[2024/06/24 07:07:18] ppsci INFO: train: epoch 1274 | step 38 | lr 0.000095 | loss 0.038974 | mae 0.152633 -[2024/06/24 07:07:18] ppsci INFO: epoch: 1274, train_loss: 0.028826, train_metric: 0.123594, eval_loss: 0.053114, eval_mae: 0.151144 -[2024/06/24 07:07:18] ppsci INFO: train: epoch 1275 | step 0 | lr 0.000096 | loss 0.025980 | mae 0.117838 -[2024/06/24 07:07:19] ppsci INFO: train: epoch 1275 | step 10 | lr 0.000096 | loss 0.022792 | mae 0.111160 -[2024/06/24 07:07:19] ppsci INFO: train: epoch 1275 | step 20 | lr 0.000096 | loss 0.031248 | mae 0.130854 -[2024/06/24 07:07:20] ppsci INFO: train: epoch 1275 | step 30 | lr 0.000096 | loss 0.022419 | mae 0.106843 -[2024/06/24 07:07:20] ppsci INFO: train: epoch 1275 | step 38 | lr 0.000096 | loss 0.011625 | mae 0.093834 -[2024/06/24 07:07:20] ppsci INFO: epoch: 1275, train_loss: 0.027104, train_metric: 0.121939, eval_loss: 0.055317, eval_mae: 0.153971 -[2024/06/24 07:07:20] ppsci INFO: train: epoch 1276 | step 0 | lr 0.000096 | loss 0.025347 | mae 0.120828 -[2024/06/24 07:07:21] ppsci INFO: train: epoch 1276 | step 10 | lr 0.000096 | loss 0.032440 | mae 0.131918 -[2024/06/24 07:07:21] ppsci INFO: train: epoch 1276 | step 20 | lr 0.000096 | loss 0.020532 | mae 0.110208 -[2024/06/24 07:07:22] ppsci INFO: train: epoch 1276 | step 30 | lr 0.000096 | loss 0.023172 | mae 0.114927 -[2024/06/24 07:07:22] ppsci INFO: train: epoch 1276 | step 38 | lr 0.000096 | loss 0.028771 | mae 0.145995 -[2024/06/24 07:07:22] ppsci INFO: epoch: 1276, train_loss: 0.028392, train_metric: 0.123041, eval_loss: 0.053242, eval_mae: 0.152747 -[2024/06/24 07:07:22] ppsci INFO: train: epoch 1277 | step 0 | lr 0.000097 | loss 0.026469 | mae 0.124399 -[2024/06/24 07:07:23] ppsci INFO: train: epoch 1277 | step 10 | lr 0.000097 | loss 0.034078 | mae 0.119555 -[2024/06/24 07:07:23] ppsci INFO: train: epoch 1277 | step 20 | lr 0.000097 | loss 0.043312 | mae 0.137672 -[2024/06/24 07:07:24] ppsci INFO: train: epoch 1277 | step 30 | lr 0.000097 | loss 0.027838 | mae 0.122933 -[2024/06/24 07:07:24] ppsci INFO: train: epoch 1277 | step 38 | lr 0.000097 | loss 0.024993 | mae 0.134259 -[2024/06/24 07:07:24] ppsci INFO: epoch: 1277, train_loss: 0.029294, train_metric: 0.126305, eval_loss: 0.053568, eval_mae: 0.150383 -[2024/06/24 07:07:25] ppsci INFO: train: epoch 1278 | step 0 | lr 0.000098 | loss 0.021859 | mae 0.113282 -[2024/06/24 07:07:25] ppsci INFO: train: epoch 1278 | step 10 | lr 0.000098 | loss 0.022386 | mae 0.113763 -[2024/06/24 07:07:26] ppsci INFO: train: epoch 1278 | step 20 | lr 0.000098 | loss 0.020884 | mae 0.111316 -[2024/06/24 07:07:26] ppsci INFO: train: epoch 1278 | step 30 | lr 0.000098 | loss 0.022165 | mae 0.119625 -[2024/06/24 07:07:27] ppsci INFO: train: epoch 1278 | step 38 | lr 0.000098 | loss 0.012565 | mae 0.093981 -[2024/06/24 07:07:27] ppsci INFO: epoch: 1278, train_loss: 0.026666, train_metric: 0.122984, eval_loss: 0.051605, eval_mae: 0.151614 -[2024/06/24 07:07:27] ppsci INFO: train: epoch 1279 | step 0 | lr 0.000098 | loss 0.029145 | mae 0.125902 -[2024/06/24 07:07:27] ppsci INFO: train: epoch 1279 | step 10 | lr 0.000098 | loss 0.021226 | mae 0.105515 -[2024/06/24 07:07:28] ppsci INFO: train: epoch 1279 | step 20 | lr 0.000098 | loss 0.037724 | mae 0.133185 -[2024/06/24 07:07:28] ppsci INFO: train: epoch 1279 | step 30 | lr 0.000098 | loss 0.027731 | mae 0.125680 -[2024/06/24 07:07:29] ppsci INFO: train: epoch 1279 | step 38 | lr 0.000098 | loss 0.016356 | mae 0.096804 -[2024/06/24 07:07:29] ppsci INFO: epoch: 1279, train_loss: 0.027006, train_metric: 0.121717, eval_loss: 0.051673, eval_mae: 0.151791 -[2024/06/24 07:07:29] ppsci INFO: train: epoch 1280 | step 0 | lr 0.000099 | loss 0.017518 | mae 0.100653 -[2024/06/24 07:07:30] ppsci INFO: train: epoch 1280 | step 10 | lr 0.000099 | loss 0.026213 | mae 0.121511 -[2024/06/24 07:07:30] ppsci INFO: train: epoch 1280 | step 20 | lr 0.000099 | loss 0.026824 | mae 0.121968 -[2024/06/24 07:07:31] ppsci INFO: train: epoch 1280 | step 30 | lr 0.000099 | loss 0.024069 | mae 0.123982 -[2024/06/24 07:07:31] ppsci INFO: train: epoch 1280 | step 38 | lr 0.000099 | loss 0.010767 | mae 0.077780 -[2024/06/24 07:07:31] ppsci INFO: epoch: 1280, train_loss: 0.025887, train_metric: 0.120234, eval_loss: 0.051942, eval_mae: 0.151249 -[2024/06/24 07:07:31] ppsci INFO: train: epoch 1281 | step 0 | lr 0.000099 | loss 0.022423 | mae 0.118092 -[2024/06/24 07:07:32] ppsci INFO: train: epoch 1281 | step 10 | lr 0.000099 | loss 0.025204 | mae 0.114627 -[2024/06/24 07:07:32] ppsci INFO: train: epoch 1281 | step 20 | lr 0.000099 | loss 0.029106 | mae 0.129945 -[2024/06/24 07:07:33] ppsci INFO: train: epoch 1281 | step 30 | lr 0.000099 | loss 0.023111 | mae 0.111688 -[2024/06/24 07:07:33] ppsci INFO: train: epoch 1281 | step 38 | lr 0.000099 | loss 0.022916 | mae 0.127853 -[2024/06/24 07:07:33] ppsci INFO: epoch: 1281, train_loss: 0.028146, train_metric: 0.125076, eval_loss: 0.053156, eval_mae: 0.148398 -[2024/06/24 07:07:33] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:07:34] ppsci INFO: train: epoch 1282 | step 0 | lr 0.000100 | loss 0.025912 | mae 0.118398 -[2024/06/24 07:07:34] ppsci INFO: train: epoch 1282 | step 10 | lr 0.000100 | loss 0.024970 | mae 0.117967 -[2024/06/24 07:07:35] ppsci INFO: train: epoch 1282 | step 20 | lr 0.000100 | loss 0.027961 | mae 0.129216 -[2024/06/24 07:07:35] ppsci INFO: train: epoch 1282 | step 30 | lr 0.000100 | loss 0.029352 | mae 0.128505 -[2024/06/24 07:07:35] ppsci INFO: train: epoch 1282 | step 38 | lr 0.000100 | loss 0.014129 | mae 0.097428 -[2024/06/24 07:07:36] ppsci INFO: epoch: 1282, train_loss: 0.029267, train_metric: 0.124334, eval_loss: 0.051291, eval_mae: 0.149360 -[2024/06/24 07:07:36] ppsci INFO: train: epoch 1283 | step 0 | lr 0.000101 | loss 0.022258 | mae 0.119933 -[2024/06/24 07:07:36] ppsci INFO: train: epoch 1283 | step 10 | lr 0.000101 | loss 0.026682 | mae 0.128882 -[2024/06/24 07:07:37] ppsci INFO: train: epoch 1283 | step 20 | lr 0.000101 | loss 0.025974 | mae 0.129067 -[2024/06/24 07:07:37] ppsci INFO: train: epoch 1283 | step 30 | lr 0.000101 | loss 0.059849 | mae 0.160034 -[2024/06/24 07:07:37] ppsci INFO: train: epoch 1283 | step 38 | lr 0.000101 | loss 0.011254 | mae 0.092797 -[2024/06/24 07:07:38] ppsci INFO: epoch: 1283, train_loss: 0.028305, train_metric: 0.123219, eval_loss: 0.056542, eval_mae: 0.152651 -[2024/06/24 07:07:38] ppsci INFO: train: epoch 1284 | step 0 | lr 0.000101 | loss 0.026196 | mae 0.121922 -[2024/06/24 07:07:38] ppsci INFO: train: epoch 1284 | step 10 | lr 0.000101 | loss 0.019786 | mae 0.107004 -[2024/06/24 07:07:39] ppsci INFO: train: epoch 1284 | step 20 | lr 0.000101 | loss 0.033409 | mae 0.140539 -[2024/06/24 07:07:39] ppsci INFO: train: epoch 1284 | step 30 | lr 0.000101 | loss 0.029641 | mae 0.124288 -[2024/06/24 07:07:40] ppsci INFO: train: epoch 1284 | step 38 | lr 0.000101 | loss 0.006677 | mae 0.070720 -[2024/06/24 07:07:40] ppsci INFO: epoch: 1284, train_loss: 0.029511, train_metric: 0.127426, eval_loss: 0.051905, eval_mae: 0.149420 -[2024/06/24 07:07:40] ppsci INFO: train: epoch 1285 | step 0 | lr 0.000102 | loss 0.030897 | mae 0.127493 -[2024/06/24 07:07:40] ppsci INFO: train: epoch 1285 | step 10 | lr 0.000102 | loss 0.028488 | mae 0.126847 -[2024/06/24 07:07:41] ppsci INFO: train: epoch 1285 | step 20 | lr 0.000102 | loss 0.029218 | mae 0.117505 -[2024/06/24 07:07:41] ppsci INFO: train: epoch 1285 | step 30 | lr 0.000102 | loss 0.030597 | mae 0.125424 -[2024/06/24 07:07:42] ppsci INFO: train: epoch 1285 | step 38 | lr 0.000102 | loss 0.020941 | mae 0.118709 -[2024/06/24 07:07:42] ppsci INFO: epoch: 1285, train_loss: 0.029721, train_metric: 0.123933, eval_loss: 0.049718, eval_mae: 0.147890 -[2024/06/24 07:07:42] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:07:42] ppsci INFO: train: epoch 1286 | step 0 | lr 0.000102 | loss 0.028810 | mae 0.132258 -[2024/06/24 07:07:43] ppsci INFO: train: epoch 1286 | step 10 | lr 0.000102 | loss 0.022716 | mae 0.114915 -[2024/06/24 07:07:43] ppsci INFO: train: epoch 1286 | step 20 | lr 0.000102 | loss 0.017188 | mae 0.107554 -[2024/06/24 07:07:44] ppsci INFO: train: epoch 1286 | step 30 | lr 0.000102 | loss 0.028622 | mae 0.128088 -[2024/06/24 07:07:44] ppsci INFO: train: epoch 1286 | step 38 | lr 0.000102 | loss 0.025525 | mae 0.126006 -[2024/06/24 07:07:44] ppsci INFO: epoch: 1286, train_loss: 0.027556, train_metric: 0.123162, eval_loss: 0.051431, eval_mae: 0.149184 -[2024/06/24 07:07:44] ppsci INFO: train: epoch 1287 | step 0 | lr 0.000103 | loss 0.031514 | mae 0.134715 -[2024/06/24 07:07:45] ppsci INFO: train: epoch 1287 | step 10 | lr 0.000103 | loss 0.027142 | mae 0.114611 -[2024/06/24 07:07:45] ppsci INFO: train: epoch 1287 | step 20 | lr 0.000103 | loss 0.021974 | mae 0.108092 -[2024/06/24 07:07:46] ppsci INFO: train: epoch 1287 | step 30 | lr 0.000103 | loss 0.026935 | mae 0.118805 -[2024/06/24 07:07:46] ppsci INFO: train: epoch 1287 | step 38 | lr 0.000103 | loss 0.009854 | mae 0.082615 -[2024/06/24 07:07:46] ppsci INFO: epoch: 1287, train_loss: 0.026821, train_metric: 0.121520, eval_loss: 0.051026, eval_mae: 0.147021 -[2024/06/24 07:07:46] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:07:46] ppsci INFO: train: epoch 1288 | step 0 | lr 0.000104 | loss 0.027684 | mae 0.129609 -[2024/06/24 07:07:47] ppsci INFO: train: epoch 1288 | step 10 | lr 0.000104 | loss 0.027663 | mae 0.126413 -[2024/06/24 07:07:47] ppsci INFO: train: epoch 1288 | step 20 | lr 0.000104 | loss 0.028130 | mae 0.118776 -[2024/06/24 07:07:48] ppsci INFO: train: epoch 1288 | step 30 | lr 0.000104 | loss 0.026580 | mae 0.126714 -[2024/06/24 07:07:48] ppsci INFO: train: epoch 1288 | step 38 | lr 0.000104 | loss 0.026598 | mae 0.128819 -[2024/06/24 07:07:48] ppsci INFO: epoch: 1288, train_loss: 0.027271, train_metric: 0.123312, eval_loss: 0.053005, eval_mae: 0.150792 -[2024/06/24 07:07:48] ppsci INFO: train: epoch 1289 | step 0 | lr 0.000104 | loss 0.025620 | mae 0.117516 -[2024/06/24 07:07:49] ppsci INFO: train: epoch 1289 | step 10 | lr 0.000104 | loss 0.024837 | mae 0.122451 -[2024/06/24 07:07:49] ppsci INFO: train: epoch 1289 | step 20 | lr 0.000104 | loss 0.030213 | mae 0.127346 -[2024/06/24 07:07:50] ppsci INFO: train: epoch 1289 | step 30 | lr 0.000104 | loss 0.022043 | mae 0.117230 -[2024/06/24 07:07:50] ppsci INFO: train: epoch 1289 | step 38 | lr 0.000104 | loss 0.043960 | mae 0.157426 -[2024/06/24 07:07:50] ppsci INFO: epoch: 1289, train_loss: 0.027274, train_metric: 0.122179, eval_loss: 0.052932, eval_mae: 0.148515 -[2024/06/24 07:07:51] ppsci INFO: train: epoch 1290 | step 0 | lr 0.000105 | loss 0.025543 | mae 0.115185 -[2024/06/24 07:07:51] ppsci INFO: train: epoch 1290 | step 10 | lr 0.000105 | loss 0.029459 | mae 0.122912 -[2024/06/24 07:07:52] ppsci INFO: train: epoch 1290 | step 20 | lr 0.000105 | loss 0.030102 | mae 0.123990 -[2024/06/24 07:07:52] ppsci INFO: train: epoch 1290 | step 30 | lr 0.000105 | loss 0.029704 | mae 0.125283 -[2024/06/24 07:07:52] ppsci INFO: train: epoch 1290 | step 38 | lr 0.000105 | loss 0.031977 | mae 0.152539 -[2024/06/24 07:07:53] ppsci INFO: epoch: 1290, train_loss: 0.028214, train_metric: 0.123131, eval_loss: 0.052043, eval_mae: 0.147477 -[2024/06/24 07:07:53] ppsci INFO: train: epoch 1291 | step 0 | lr 0.000105 | loss 0.020806 | mae 0.111545 -[2024/06/24 07:07:53] ppsci INFO: train: epoch 1291 | step 10 | lr 0.000105 | loss 0.026191 | mae 0.120152 -[2024/06/24 07:07:54] ppsci INFO: train: epoch 1291 | step 20 | lr 0.000105 | loss 0.026557 | mae 0.127970 -[2024/06/24 07:07:54] ppsci INFO: train: epoch 1291 | step 30 | lr 0.000105 | loss 0.030836 | mae 0.139693 -[2024/06/24 07:07:55] ppsci INFO: train: epoch 1291 | step 38 | lr 0.000105 | loss 0.011575 | mae 0.085534 -[2024/06/24 07:07:55] ppsci INFO: epoch: 1291, train_loss: 0.025954, train_metric: 0.121634, eval_loss: 0.053768, eval_mae: 0.147359 -[2024/06/24 07:07:55] ppsci INFO: train: epoch 1292 | step 0 | lr 0.000106 | loss 0.027393 | mae 0.129347 -[2024/06/24 07:07:55] ppsci INFO: train: epoch 1292 | step 10 | lr 0.000106 | loss 0.027160 | mae 0.121130 -[2024/06/24 07:07:56] ppsci INFO: train: epoch 1292 | step 20 | lr 0.000106 | loss 0.024655 | mae 0.117317 -[2024/06/24 07:07:56] ppsci INFO: train: epoch 1292 | step 30 | lr 0.000106 | loss 0.024387 | mae 0.115134 -[2024/06/24 07:07:57] ppsci INFO: train: epoch 1292 | step 38 | lr 0.000106 | loss 0.028554 | mae 0.139113 -[2024/06/24 07:07:57] ppsci INFO: epoch: 1292, train_loss: 0.028039, train_metric: 0.122793, eval_loss: 0.052726, eval_mae: 0.149073 -[2024/06/24 07:07:57] ppsci INFO: train: epoch 1293 | step 0 | lr 0.000107 | loss 0.025996 | mae 0.120175 -[2024/06/24 07:07:58] ppsci INFO: train: epoch 1293 | step 10 | lr 0.000107 | loss 0.029475 | mae 0.131450 -[2024/06/24 07:07:58] ppsci INFO: train: epoch 1293 | step 20 | lr 0.000107 | loss 0.029831 | mae 0.129922 -[2024/06/24 07:07:59] ppsci INFO: train: epoch 1293 | step 30 | lr 0.000107 | loss 0.034985 | mae 0.131608 -[2024/06/24 07:07:59] ppsci INFO: train: epoch 1293 | step 38 | lr 0.000107 | loss 0.021000 | mae 0.095169 -[2024/06/24 07:07:59] ppsci INFO: epoch: 1293, train_loss: 0.027578, train_metric: 0.120877, eval_loss: 0.055261, eval_mae: 0.153832 -[2024/06/24 07:07:59] ppsci INFO: train: epoch 1294 | step 0 | lr 0.000107 | loss 0.025795 | mae 0.120688 -[2024/06/24 07:08:00] ppsci INFO: train: epoch 1294 | step 10 | lr 0.000107 | loss 0.021207 | mae 0.112803 -[2024/06/24 07:08:00] ppsci INFO: train: epoch 1294 | step 20 | lr 0.000107 | loss 0.027237 | mae 0.125142 -[2024/06/24 07:08:01] ppsci INFO: train: epoch 1294 | step 30 | lr 0.000107 | loss 0.052773 | mae 0.157924 -[2024/06/24 07:08:01] ppsci INFO: train: epoch 1294 | step 38 | lr 0.000107 | loss 0.015326 | mae 0.106359 -[2024/06/24 07:08:01] ppsci INFO: epoch: 1294, train_loss: 0.027083, train_metric: 0.121886, eval_loss: 0.056444, eval_mae: 0.153762 -[2024/06/24 07:08:01] ppsci INFO: train: epoch 1295 | step 0 | lr 0.000108 | loss 0.021963 | mae 0.110423 -[2024/06/24 07:08:02] ppsci INFO: train: epoch 1295 | step 10 | lr 0.000108 | loss 0.027650 | mae 0.126474 -[2024/06/24 07:08:03] ppsci INFO: train: epoch 1295 | step 20 | lr 0.000108 | loss 0.030199 | mae 0.121712 -[2024/06/24 07:08:03] ppsci INFO: train: epoch 1295 | step 30 | lr 0.000108 | loss 0.025415 | mae 0.111812 -[2024/06/24 07:08:04] ppsci INFO: train: epoch 1295 | step 38 | lr 0.000108 | loss 0.008680 | mae 0.077562 -[2024/06/24 07:08:04] ppsci INFO: epoch: 1295, train_loss: 0.026927, train_metric: 0.120476, eval_loss: 0.053522, eval_mae: 0.156035 -[2024/06/24 07:08:04] ppsci INFO: train: epoch 1296 | step 0 | lr 0.000109 | loss 0.020963 | mae 0.115878 -[2024/06/24 07:08:04] ppsci INFO: train: epoch 1296 | step 10 | lr 0.000109 | loss 0.021205 | mae 0.113322 -[2024/06/24 07:08:05] ppsci INFO: train: epoch 1296 | step 20 | lr 0.000109 | loss 0.027157 | mae 0.120354 -[2024/06/24 07:08:05] ppsci INFO: train: epoch 1296 | step 30 | lr 0.000109 | loss 0.030798 | mae 0.128110 -[2024/06/24 07:08:06] ppsci INFO: train: epoch 1296 | step 38 | lr 0.000109 | loss 0.040206 | mae 0.156009 -[2024/06/24 07:08:06] ppsci INFO: epoch: 1296, train_loss: 0.029335, train_metric: 0.125964, eval_loss: 0.050553, eval_mae: 0.149721 -[2024/06/24 07:08:06] ppsci INFO: train: epoch 1297 | step 0 | lr 0.000109 | loss 0.020599 | mae 0.106270 -[2024/06/24 07:08:07] ppsci INFO: train: epoch 1297 | step 10 | lr 0.000109 | loss 0.028419 | mae 0.123993 -[2024/06/24 07:08:07] ppsci INFO: train: epoch 1297 | step 20 | lr 0.000109 | loss 0.025771 | mae 0.125198 -[2024/06/24 07:08:08] ppsci INFO: train: epoch 1297 | step 30 | lr 0.000109 | loss 0.028744 | mae 0.126671 -[2024/06/24 07:08:08] ppsci INFO: train: epoch 1297 | step 38 | lr 0.000109 | loss 0.019143 | mae 0.104865 -[2024/06/24 07:08:08] ppsci INFO: epoch: 1297, train_loss: 0.028738, train_metric: 0.124785, eval_loss: 0.050191, eval_mae: 0.147886 -[2024/06/24 07:08:08] ppsci INFO: train: epoch 1298 | step 0 | lr 0.000110 | loss 0.025503 | mae 0.118731 -[2024/06/24 07:08:09] ppsci INFO: train: epoch 1298 | step 10 | lr 0.000110 | loss 0.030610 | mae 0.117711 -[2024/06/24 07:08:09] ppsci INFO: train: epoch 1298 | step 20 | lr 0.000110 | loss 0.027460 | mae 0.130548 -[2024/06/24 07:08:10] ppsci INFO: train: epoch 1298 | step 30 | lr 0.000110 | loss 0.033749 | mae 0.133778 -[2024/06/24 07:08:10] ppsci INFO: train: epoch 1298 | step 38 | lr 0.000110 | loss 0.030789 | mae 0.136722 -[2024/06/24 07:08:10] ppsci INFO: epoch: 1298, train_loss: 0.027663, train_metric: 0.122722, eval_loss: 0.051643, eval_mae: 0.150082 -[2024/06/24 07:08:10] ppsci INFO: train: epoch 1299 | step 0 | lr 0.000110 | loss 0.021659 | mae 0.115140 -[2024/06/24 07:08:11] ppsci INFO: train: epoch 1299 | step 10 | lr 0.000110 | loss 0.036513 | mae 0.142527 -[2024/06/24 07:08:11] ppsci INFO: train: epoch 1299 | step 20 | lr 0.000110 | loss 0.047600 | mae 0.112740 -[2024/06/24 07:08:12] ppsci INFO: train: epoch 1299 | step 30 | lr 0.000110 | loss 0.030141 | mae 0.128952 -[2024/06/24 07:08:12] ppsci INFO: train: epoch 1299 | step 38 | lr 0.000110 | loss 0.008215 | mae 0.079499 -[2024/06/24 07:08:12] ppsci INFO: epoch: 1299, train_loss: 0.028047, train_metric: 0.122752, eval_loss: 0.055038, eval_mae: 0.150884 -[2024/06/24 07:08:13] ppsci INFO: train: epoch 1300 | step 0 | lr 0.000111 | loss 0.030194 | mae 0.133324 -[2024/06/24 07:08:13] ppsci INFO: train: epoch 1300 | step 10 | lr 0.000111 | loss 0.027886 | mae 0.117963 -[2024/06/24 07:08:14] ppsci INFO: train: epoch 1300 | step 20 | lr 0.000111 | loss 0.025819 | mae 0.119336 -[2024/06/24 07:08:14] ppsci INFO: train: epoch 1300 | step 30 | lr 0.000111 | loss 0.023610 | mae 0.111844 -[2024/06/24 07:08:15] ppsci INFO: train: epoch 1300 | step 38 | lr 0.000111 | loss 0.012678 | mae 0.098369 -[2024/06/24 07:08:15] ppsci INFO: epoch: 1300, train_loss: 0.027818, train_metric: 0.123832, eval_loss: 0.052085, eval_mae: 0.150023 -[2024/06/24 07:08:15] ppsci INFO: train: epoch 1301 | step 0 | lr 0.000112 | loss 0.017647 | mae 0.102186 -[2024/06/24 07:08:15] ppsci INFO: train: epoch 1301 | step 10 | lr 0.000112 | loss 0.031914 | mae 0.127100 -[2024/06/24 07:08:16] ppsci INFO: train: epoch 1301 | step 20 | lr 0.000112 | loss 0.029767 | mae 0.123151 -[2024/06/24 07:08:16] ppsci INFO: train: epoch 1301 | step 30 | lr 0.000112 | loss 0.021402 | mae 0.115365 -[2024/06/24 07:08:17] ppsci INFO: train: epoch 1301 | step 38 | lr 0.000112 | loss 0.014240 | mae 0.087928 -[2024/06/24 07:08:17] ppsci INFO: epoch: 1301, train_loss: 0.026388, train_metric: 0.121623, eval_loss: 0.058559, eval_mae: 0.154161 -[2024/06/24 07:08:17] ppsci INFO: train: epoch 1302 | step 0 | lr 0.000112 | loss 0.033959 | mae 0.131149 -[2024/06/24 07:08:18] ppsci INFO: train: epoch 1302 | step 10 | lr 0.000112 | loss 0.029745 | mae 0.124151 -[2024/06/24 07:08:18] ppsci INFO: train: epoch 1302 | step 20 | lr 0.000112 | loss 0.020752 | mae 0.109890 -[2024/06/24 07:08:19] ppsci INFO: train: epoch 1302 | step 30 | lr 0.000112 | loss 0.023235 | mae 0.110517 -[2024/06/24 07:08:19] ppsci INFO: train: epoch 1302 | step 38 | lr 0.000112 | loss 0.014791 | mae 0.103433 -[2024/06/24 07:08:19] ppsci INFO: epoch: 1302, train_loss: 0.031131, train_metric: 0.127696, eval_loss: 0.051239, eval_mae: 0.151986 -[2024/06/24 07:08:19] ppsci INFO: train: epoch 1303 | step 0 | lr 0.000113 | loss 0.023343 | mae 0.111039 -[2024/06/24 07:08:20] ppsci INFO: train: epoch 1303 | step 10 | lr 0.000113 | loss 0.031608 | mae 0.139977 -[2024/06/24 07:08:20] ppsci INFO: train: epoch 1303 | step 20 | lr 0.000113 | loss 0.030559 | mae 0.132568 -[2024/06/24 07:08:21] ppsci INFO: train: epoch 1303 | step 30 | lr 0.000113 | loss 0.021841 | mae 0.103636 -[2024/06/24 07:08:21] ppsci INFO: train: epoch 1303 | step 38 | lr 0.000113 | loss 0.036723 | mae 0.127614 -[2024/06/24 07:08:21] ppsci INFO: epoch: 1303, train_loss: 0.029959, train_metric: 0.127042, eval_loss: 0.051752, eval_mae: 0.150276 -[2024/06/24 07:08:21] ppsci INFO: train: epoch 1304 | step 0 | lr 0.000113 | loss 0.052036 | mae 0.139630 -[2024/06/24 07:08:22] ppsci INFO: train: epoch 1304 | step 10 | lr 0.000113 | loss 0.036424 | mae 0.130097 -[2024/06/24 07:08:22] ppsci INFO: train: epoch 1304 | step 20 | lr 0.000113 | loss 0.030179 | mae 0.129218 -[2024/06/24 07:08:23] ppsci INFO: train: epoch 1304 | step 30 | lr 0.000113 | loss 0.032619 | mae 0.133725 -[2024/06/24 07:08:23] ppsci INFO: train: epoch 1304 | step 38 | lr 0.000113 | loss 0.133858 | mae 0.229860 -[2024/06/24 07:08:23] ppsci INFO: epoch: 1304, train_loss: 0.032389, train_metric: 0.125077, eval_loss: 0.053297, eval_mae: 0.151204 -[2024/06/24 07:08:23] ppsci INFO: train: epoch 1305 | step 0 | lr 0.000114 | loss 0.028707 | mae 0.126855 -[2024/06/24 07:08:24] ppsci INFO: train: epoch 1305 | step 10 | lr 0.000114 | loss 0.041269 | mae 0.144704 -[2024/06/24 07:08:24] ppsci INFO: train: epoch 1305 | step 20 | lr 0.000114 | loss 0.030847 | mae 0.119119 -[2024/06/24 07:08:25] ppsci INFO: train: epoch 1305 | step 30 | lr 0.000114 | loss 0.026435 | mae 0.121630 -[2024/06/24 07:08:25] ppsci INFO: train: epoch 1305 | step 38 | lr 0.000114 | loss 0.024915 | mae 0.113814 -[2024/06/24 07:08:25] ppsci INFO: epoch: 1305, train_loss: 0.028019, train_metric: 0.124893, eval_loss: 0.054632, eval_mae: 0.151795 -[2024/06/24 07:08:25] ppsci INFO: train: epoch 1306 | step 0 | lr 0.000115 | loss 0.025808 | mae 0.120998 -[2024/06/24 07:08:26] ppsci INFO: train: epoch 1306 | step 10 | lr 0.000115 | loss 0.019942 | mae 0.108534 -[2024/06/24 07:08:26] ppsci INFO: train: epoch 1306 | step 20 | lr 0.000115 | loss 0.025493 | mae 0.121138 -[2024/06/24 07:08:27] ppsci INFO: train: epoch 1306 | step 30 | lr 0.000115 | loss 0.038407 | mae 0.133334 -[2024/06/24 07:08:27] ppsci INFO: train: epoch 1306 | step 38 | lr 0.000115 | loss 0.025331 | mae 0.125525 -[2024/06/24 07:08:27] ppsci INFO: epoch: 1306, train_loss: 0.027653, train_metric: 0.121837, eval_loss: 0.053444, eval_mae: 0.150674 -[2024/06/24 07:08:27] ppsci INFO: train: epoch 1307 | step 0 | lr 0.000115 | loss 0.020282 | mae 0.107054 -[2024/06/24 07:08:28] ppsci INFO: train: epoch 1307 | step 10 | lr 0.000115 | loss 0.032826 | mae 0.126851 -[2024/06/24 07:08:28] ppsci INFO: train: epoch 1307 | step 20 | lr 0.000115 | loss 0.020753 | mae 0.106395 -[2024/06/24 07:08:29] ppsci INFO: train: epoch 1307 | step 30 | lr 0.000115 | loss 0.025625 | mae 0.115173 -[2024/06/24 07:08:29] ppsci INFO: train: epoch 1307 | step 38 | lr 0.000115 | loss 0.032430 | mae 0.151095 -[2024/06/24 07:08:29] ppsci INFO: epoch: 1307, train_loss: 0.026999, train_metric: 0.120719, eval_loss: 0.051952, eval_mae: 0.148991 -[2024/06/24 07:08:29] ppsci INFO: train: epoch 1308 | step 0 | lr 0.000116 | loss 0.026756 | mae 0.118516 -[2024/06/24 07:08:30] ppsci INFO: train: epoch 1308 | step 10 | lr 0.000116 | loss 0.039656 | mae 0.146045 -[2024/06/24 07:08:31] ppsci INFO: train: epoch 1308 | step 20 | lr 0.000116 | loss 0.026136 | mae 0.120805 -[2024/06/24 07:08:31] ppsci INFO: train: epoch 1308 | step 30 | lr 0.000116 | loss 0.022368 | mae 0.112877 -[2024/06/24 07:08:31] ppsci INFO: train: epoch 1308 | step 38 | lr 0.000116 | loss 0.013105 | mae 0.102833 -[2024/06/24 07:08:32] ppsci INFO: epoch: 1308, train_loss: 0.028545, train_metric: 0.123063, eval_loss: 0.051649, eval_mae: 0.149998 -[2024/06/24 07:08:32] ppsci INFO: train: epoch 1309 | step 0 | lr 0.000117 | loss 0.030270 | mae 0.124981 -[2024/06/24 07:08:32] ppsci INFO: train: epoch 1309 | step 10 | lr 0.000117 | loss 0.023392 | mae 0.119802 -[2024/06/24 07:08:33] ppsci INFO: train: epoch 1309 | step 20 | lr 0.000117 | loss 0.029481 | mae 0.116865 -[2024/06/24 07:08:33] ppsci INFO: train: epoch 1309 | step 30 | lr 0.000117 | loss 0.027985 | mae 0.124302 -[2024/06/24 07:08:33] ppsci INFO: train: epoch 1309 | step 38 | lr 0.000117 | loss 0.035777 | mae 0.130605 -[2024/06/24 07:08:34] ppsci INFO: epoch: 1309, train_loss: 0.028388, train_metric: 0.123219, eval_loss: 0.053354, eval_mae: 0.149490 -[2024/06/24 07:08:34] ppsci INFO: train: epoch 1310 | step 0 | lr 0.000117 | loss 0.029283 | mae 0.124657 -[2024/06/24 07:08:34] ppsci INFO: train: epoch 1310 | step 10 | lr 0.000117 | loss 0.024127 | mae 0.116073 -[2024/06/24 07:08:35] ppsci INFO: train: epoch 1310 | step 20 | lr 0.000117 | loss 0.024923 | mae 0.115709 -[2024/06/24 07:08:35] ppsci INFO: train: epoch 1310 | step 30 | lr 0.000117 | loss 0.020696 | mae 0.110875 -[2024/06/24 07:08:36] ppsci INFO: train: epoch 1310 | step 38 | lr 0.000117 | loss 0.046497 | mae 0.144029 -[2024/06/24 07:08:36] ppsci INFO: epoch: 1310, train_loss: 0.028166, train_metric: 0.123266, eval_loss: 0.053004, eval_mae: 0.152480 -[2024/06/24 07:08:36] ppsci INFO: train: epoch 1311 | step 0 | lr 0.000118 | loss 0.023560 | mae 0.105875 -[2024/06/24 07:08:36] ppsci INFO: train: epoch 1311 | step 10 | lr 0.000118 | loss 0.033076 | mae 0.142781 -[2024/06/24 07:08:37] ppsci INFO: train: epoch 1311 | step 20 | lr 0.000118 | loss 0.020521 | mae 0.112481 -[2024/06/24 07:08:37] ppsci INFO: train: epoch 1311 | step 30 | lr 0.000118 | loss 0.042877 | mae 0.146742 -[2024/06/24 07:08:38] ppsci INFO: train: epoch 1311 | step 38 | lr 0.000118 | loss 0.055451 | mae 0.154532 -[2024/06/24 07:08:38] ppsci INFO: epoch: 1311, train_loss: 0.028372, train_metric: 0.122486, eval_loss: 0.051791, eval_mae: 0.149925 -[2024/06/24 07:08:38] ppsci INFO: train: epoch 1312 | step 0 | lr 0.000119 | loss 0.035449 | mae 0.136411 -[2024/06/24 07:08:38] ppsci INFO: train: epoch 1312 | step 10 | lr 0.000119 | loss 0.025997 | mae 0.115587 -[2024/06/24 07:08:39] ppsci INFO: train: epoch 1312 | step 20 | lr 0.000119 | loss 0.025967 | mae 0.118336 -[2024/06/24 07:08:39] ppsci INFO: train: epoch 1312 | step 30 | lr 0.000119 | loss 0.026076 | mae 0.118746 -[2024/06/24 07:08:40] ppsci INFO: train: epoch 1312 | step 38 | lr 0.000119 | loss 0.046735 | mae 0.153198 -[2024/06/24 07:08:40] ppsci INFO: epoch: 1312, train_loss: 0.028522, train_metric: 0.122295, eval_loss: 0.054756, eval_mae: 0.151711 -[2024/06/24 07:08:40] ppsci INFO: train: epoch 1313 | step 0 | lr 0.000119 | loss 0.034190 | mae 0.131687 -[2024/06/24 07:08:41] ppsci INFO: train: epoch 1313 | step 10 | lr 0.000119 | loss 0.030224 | mae 0.128446 -[2024/06/24 07:08:41] ppsci INFO: train: epoch 1313 | step 20 | lr 0.000119 | loss 0.026235 | mae 0.124021 -[2024/06/24 07:08:42] ppsci INFO: train: epoch 1313 | step 30 | lr 0.000119 | loss 0.032335 | mae 0.132838 -[2024/06/24 07:08:42] ppsci INFO: train: epoch 1313 | step 38 | lr 0.000119 | loss 0.040423 | mae 0.137377 -[2024/06/24 07:08:42] ppsci INFO: epoch: 1313, train_loss: 0.029936, train_metric: 0.127609, eval_loss: 0.051983, eval_mae: 0.148641 -[2024/06/24 07:08:42] ppsci INFO: train: epoch 1314 | step 0 | lr 0.000120 | loss 0.027286 | mae 0.123627 -[2024/06/24 07:08:43] ppsci INFO: train: epoch 1314 | step 10 | lr 0.000120 | loss 0.036080 | mae 0.134688 -[2024/06/24 07:08:43] ppsci INFO: train: epoch 1314 | step 20 | lr 0.000120 | loss 0.031565 | mae 0.129228 -[2024/06/24 07:08:44] ppsci INFO: train: epoch 1314 | step 30 | lr 0.000120 | loss 0.036928 | mae 0.142915 -[2024/06/24 07:08:44] ppsci INFO: train: epoch 1314 | step 38 | lr 0.000120 | loss 0.038919 | mae 0.140140 -[2024/06/24 07:08:44] ppsci INFO: epoch: 1314, train_loss: 0.027972, train_metric: 0.123352, eval_loss: 0.052482, eval_mae: 0.150867 -[2024/06/24 07:08:44] ppsci INFO: train: epoch 1315 | step 0 | lr 0.000120 | loss 0.021814 | mae 0.112408 -[2024/06/24 07:08:45] ppsci INFO: train: epoch 1315 | step 10 | lr 0.000120 | loss 0.045465 | mae 0.145713 -[2024/06/24 07:08:45] ppsci INFO: train: epoch 1315 | step 20 | lr 0.000120 | loss 0.031093 | mae 0.125573 -[2024/06/24 07:08:46] ppsci INFO: train: epoch 1315 | step 30 | lr 0.000120 | loss 0.026173 | mae 0.120691 -[2024/06/24 07:08:46] ppsci INFO: train: epoch 1315 | step 38 | lr 0.000120 | loss 0.023592 | mae 0.120129 -[2024/06/24 07:08:46] ppsci INFO: epoch: 1315, train_loss: 0.028725, train_metric: 0.125246, eval_loss: 0.052744, eval_mae: 0.147233 -[2024/06/24 07:08:47] ppsci INFO: train: epoch 1316 | step 0 | lr 0.000121 | loss 0.024554 | mae 0.117602 -[2024/06/24 07:08:47] ppsci INFO: train: epoch 1316 | step 10 | lr 0.000121 | loss 0.019677 | mae 0.108859 -[2024/06/24 07:08:48] ppsci INFO: train: epoch 1316 | step 20 | lr 0.000121 | loss 0.033608 | mae 0.127214 -[2024/06/24 07:08:48] ppsci INFO: train: epoch 1316 | step 30 | lr 0.000121 | loss 0.021416 | mae 0.113088 -[2024/06/24 07:08:49] ppsci INFO: train: epoch 1316 | step 38 | lr 0.000121 | loss 0.017078 | mae 0.110355 -[2024/06/24 07:08:49] ppsci INFO: epoch: 1316, train_loss: 0.026163, train_metric: 0.121199, eval_loss: 0.049817, eval_mae: 0.148105 -[2024/06/24 07:08:49] ppsci INFO: train: epoch 1317 | step 0 | lr 0.000122 | loss 0.028445 | mae 0.123987 -[2024/06/24 07:08:49] ppsci INFO: train: epoch 1317 | step 10 | lr 0.000122 | loss 0.028794 | mae 0.123686 -[2024/06/24 07:08:50] ppsci INFO: train: epoch 1317 | step 20 | lr 0.000122 | loss 0.025372 | mae 0.123267 -[2024/06/24 07:08:50] ppsci INFO: train: epoch 1317 | step 30 | lr 0.000122 | loss 0.030518 | mae 0.129899 -[2024/06/24 07:08:51] ppsci INFO: train: epoch 1317 | step 38 | lr 0.000122 | loss 0.007386 | mae 0.069088 -[2024/06/24 07:08:51] ppsci INFO: epoch: 1317, train_loss: 0.025674, train_metric: 0.120626, eval_loss: 0.053895, eval_mae: 0.148830 -[2024/06/24 07:08:51] ppsci INFO: train: epoch 1318 | step 0 | lr 0.000122 | loss 0.023986 | mae 0.111783 -[2024/06/24 07:08:51] ppsci INFO: train: epoch 1318 | step 10 | lr 0.000122 | loss 0.024704 | mae 0.115012 -[2024/06/24 07:08:52] ppsci INFO: train: epoch 1318 | step 20 | lr 0.000122 | loss 0.022492 | mae 0.112280 -[2024/06/24 07:08:52] ppsci INFO: train: epoch 1318 | step 30 | lr 0.000122 | loss 0.018405 | mae 0.099365 -[2024/06/24 07:08:53] ppsci INFO: train: epoch 1318 | step 38 | lr 0.000122 | loss 0.028249 | mae 0.135722 -[2024/06/24 07:08:53] ppsci INFO: epoch: 1318, train_loss: 0.026724, train_metric: 0.120516, eval_loss: 0.052597, eval_mae: 0.150389 -[2024/06/24 07:08:53] ppsci INFO: train: epoch 1319 | step 0 | lr 0.000123 | loss 0.021016 | mae 0.109621 -[2024/06/24 07:08:54] ppsci INFO: train: epoch 1319 | step 10 | lr 0.000123 | loss 0.031992 | mae 0.134927 -[2024/06/24 07:08:54] ppsci INFO: train: epoch 1319 | step 20 | lr 0.000123 | loss 0.031330 | mae 0.131803 -[2024/06/24 07:08:55] ppsci INFO: train: epoch 1319 | step 30 | lr 0.000123 | loss 0.024033 | mae 0.119392 -[2024/06/24 07:08:55] ppsci INFO: train: epoch 1319 | step 38 | lr 0.000123 | loss 0.057086 | mae 0.200101 -[2024/06/24 07:08:55] ppsci INFO: epoch: 1319, train_loss: 0.028361, train_metric: 0.123318, eval_loss: 0.054418, eval_mae: 0.152590 -[2024/06/24 07:08:55] ppsci INFO: train: epoch 1320 | step 0 | lr 0.000124 | loss 0.023041 | mae 0.118011 -[2024/06/24 07:08:56] ppsci INFO: train: epoch 1320 | step 10 | lr 0.000124 | loss 0.029356 | mae 0.130190 -[2024/06/24 07:08:56] ppsci INFO: train: epoch 1320 | step 20 | lr 0.000124 | loss 0.027302 | mae 0.112575 -[2024/06/24 07:08:57] ppsci INFO: train: epoch 1320 | step 30 | lr 0.000124 | loss 0.022688 | mae 0.116752 -[2024/06/24 07:08:57] ppsci INFO: train: epoch 1320 | step 38 | lr 0.000124 | loss 0.020219 | mae 0.115142 -[2024/06/24 07:08:57] ppsci INFO: epoch: 1320, train_loss: 0.028273, train_metric: 0.123394, eval_loss: 0.053750, eval_mae: 0.151571 -[2024/06/24 07:08:57] ppsci INFO: train: epoch 1321 | step 0 | lr 0.000124 | loss 0.034249 | mae 0.130542 -[2024/06/24 07:08:58] ppsci INFO: train: epoch 1321 | step 10 | lr 0.000124 | loss 0.019823 | mae 0.112105 -[2024/06/24 07:08:58] ppsci INFO: train: epoch 1321 | step 20 | lr 0.000124 | loss 0.021688 | mae 0.114569 -[2024/06/24 07:08:59] ppsci INFO: train: epoch 1321 | step 30 | lr 0.000124 | loss 0.019915 | mae 0.105866 -[2024/06/24 07:08:59] ppsci INFO: train: epoch 1321 | step 38 | lr 0.000124 | loss 0.039932 | mae 0.147232 -[2024/06/24 07:08:59] ppsci INFO: epoch: 1321, train_loss: 0.027250, train_metric: 0.121824, eval_loss: 0.052702, eval_mae: 0.153120 -[2024/06/24 07:08:59] ppsci INFO: train: epoch 1322 | step 0 | lr 0.000125 | loss 0.033068 | mae 0.130780 -[2024/06/24 07:09:00] ppsci INFO: train: epoch 1322 | step 10 | lr 0.000125 | loss 0.029056 | mae 0.138217 -[2024/06/24 07:09:00] ppsci INFO: train: epoch 1322 | step 20 | lr 0.000125 | loss 0.028934 | mae 0.124964 -[2024/06/24 07:09:01] ppsci INFO: train: epoch 1322 | step 30 | lr 0.000125 | loss 0.021895 | mae 0.115385 -[2024/06/24 07:09:01] ppsci INFO: train: epoch 1322 | step 38 | lr 0.000125 | loss 0.031272 | mae 0.150147 -[2024/06/24 07:09:01] ppsci INFO: epoch: 1322, train_loss: 0.027728, train_metric: 0.122556, eval_loss: 0.054969, eval_mae: 0.152750 -[2024/06/24 07:09:01] ppsci INFO: train: epoch 1323 | step 0 | lr 0.000126 | loss 0.027155 | mae 0.125218 -[2024/06/24 07:09:02] ppsci INFO: train: epoch 1323 | step 10 | lr 0.000126 | loss 0.022325 | mae 0.116927 -[2024/06/24 07:09:03] ppsci INFO: train: epoch 1323 | step 20 | lr 0.000126 | loss 0.029514 | mae 0.117921 -[2024/06/24 07:09:03] ppsci INFO: train: epoch 1323 | step 30 | lr 0.000126 | loss 0.028318 | mae 0.133243 -[2024/06/24 07:09:03] ppsci INFO: train: epoch 1323 | step 38 | lr 0.000126 | loss 0.022013 | mae 0.111711 -[2024/06/24 07:09:04] ppsci INFO: epoch: 1323, train_loss: 0.027171, train_metric: 0.121076, eval_loss: 0.052457, eval_mae: 0.150569 -[2024/06/24 07:09:04] ppsci INFO: train: epoch 1324 | step 0 | lr 0.000126 | loss 0.022825 | mae 0.114435 -[2024/06/24 07:09:04] ppsci INFO: train: epoch 1324 | step 10 | lr 0.000126 | loss 0.020258 | mae 0.105998 -[2024/06/24 07:09:05] ppsci INFO: train: epoch 1324 | step 20 | lr 0.000126 | loss 0.026915 | mae 0.124755 -[2024/06/24 07:09:05] ppsci INFO: train: epoch 1324 | step 30 | lr 0.000126 | loss 0.029639 | mae 0.134054 -[2024/06/24 07:09:06] ppsci INFO: train: epoch 1324 | step 38 | lr 0.000126 | loss 0.021510 | mae 0.100494 -[2024/06/24 07:09:06] ppsci INFO: epoch: 1324, train_loss: 0.026919, train_metric: 0.121853, eval_loss: 0.050849, eval_mae: 0.150148 -[2024/06/24 07:09:06] ppsci INFO: train: epoch 1325 | step 0 | lr 0.000127 | loss 0.027890 | mae 0.125727 -[2024/06/24 07:09:06] ppsci INFO: train: epoch 1325 | step 10 | lr 0.000127 | loss 0.027760 | mae 0.129376 -[2024/06/24 07:09:07] ppsci INFO: train: epoch 1325 | step 20 | lr 0.000127 | loss 0.029032 | mae 0.120824 -[2024/06/24 07:09:07] ppsci INFO: train: epoch 1325 | step 30 | lr 0.000127 | loss 0.024723 | mae 0.120429 -[2024/06/24 07:09:08] ppsci INFO: train: epoch 1325 | step 38 | lr 0.000127 | loss 0.023098 | mae 0.111707 -[2024/06/24 07:09:08] ppsci INFO: epoch: 1325, train_loss: 0.027682, train_metric: 0.123402, eval_loss: 0.053812, eval_mae: 0.150960 -[2024/06/24 07:09:08] ppsci INFO: train: epoch 1326 | step 0 | lr 0.000128 | loss 0.031104 | mae 0.126127 -[2024/06/24 07:09:08] ppsci INFO: train: epoch 1326 | step 10 | lr 0.000128 | loss 0.031613 | mae 0.131623 -[2024/06/24 07:09:09] ppsci INFO: train: epoch 1326 | step 20 | lr 0.000128 | loss 0.024167 | mae 0.114330 -[2024/06/24 07:09:09] ppsci INFO: train: epoch 1326 | step 30 | lr 0.000128 | loss 0.019726 | mae 0.109637 -[2024/06/24 07:09:10] ppsci INFO: train: epoch 1326 | step 38 | lr 0.000128 | loss 0.040144 | mae 0.150235 -[2024/06/24 07:09:10] ppsci INFO: epoch: 1326, train_loss: 0.027575, train_metric: 0.122092, eval_loss: 0.052602, eval_mae: 0.150658 -[2024/06/24 07:09:10] ppsci INFO: train: epoch 1327 | step 0 | lr 0.000128 | loss 0.022734 | mae 0.109886 -[2024/06/24 07:09:11] ppsci INFO: train: epoch 1327 | step 10 | lr 0.000128 | loss 0.019978 | mae 0.109327 -[2024/06/24 07:09:11] ppsci INFO: train: epoch 1327 | step 20 | lr 0.000128 | loss 0.029508 | mae 0.129015 -[2024/06/24 07:09:12] ppsci INFO: train: epoch 1327 | step 30 | lr 0.000128 | loss 0.022470 | mae 0.112223 -[2024/06/24 07:09:12] ppsci INFO: train: epoch 1327 | step 38 | lr 0.000128 | loss 0.020961 | mae 0.117458 -[2024/06/24 07:09:12] ppsci INFO: epoch: 1327, train_loss: 0.027251, train_metric: 0.122922, eval_loss: 0.054483, eval_mae: 0.152938 -[2024/06/24 07:09:12] ppsci INFO: train: epoch 1328 | step 0 | lr 0.000129 | loss 0.024948 | mae 0.118233 -[2024/06/24 07:09:13] ppsci INFO: train: epoch 1328 | step 10 | lr 0.000129 | loss 0.026314 | mae 0.117739 -[2024/06/24 07:09:13] ppsci INFO: train: epoch 1328 | step 20 | lr 0.000129 | loss 0.034080 | mae 0.142746 -[2024/06/24 07:09:14] ppsci INFO: train: epoch 1328 | step 30 | lr 0.000129 | loss 0.043919 | mae 0.144755 -[2024/06/24 07:09:14] ppsci INFO: train: epoch 1328 | step 38 | lr 0.000129 | loss 0.009389 | mae 0.076789 -[2024/06/24 07:09:14] ppsci INFO: epoch: 1328, train_loss: 0.028140, train_metric: 0.123228, eval_loss: 0.059347, eval_mae: 0.155894 -[2024/06/24 07:09:14] ppsci INFO: train: epoch 1329 | step 0 | lr 0.000130 | loss 0.038633 | mae 0.141854 -[2024/06/24 07:09:15] ppsci INFO: train: epoch 1329 | step 10 | lr 0.000130 | loss 0.034662 | mae 0.139907 -[2024/06/24 07:09:16] ppsci INFO: train: epoch 1329 | step 20 | lr 0.000130 | loss 0.021010 | mae 0.114341 -[2024/06/24 07:09:16] ppsci INFO: train: epoch 1329 | step 30 | lr 0.000130 | loss 0.029380 | mae 0.128682 -[2024/06/24 07:09:17] ppsci INFO: train: epoch 1329 | step 38 | lr 0.000130 | loss 0.033772 | mae 0.110808 -[2024/06/24 07:09:17] ppsci INFO: epoch: 1329, train_loss: 0.028784, train_metric: 0.124868, eval_loss: 0.054968, eval_mae: 0.153244 -[2024/06/24 07:09:17] ppsci INFO: train: epoch 1330 | step 0 | lr 0.000130 | loss 0.034337 | mae 0.128830 -[2024/06/24 07:09:17] ppsci INFO: train: epoch 1330 | step 10 | lr 0.000130 | loss 0.028320 | mae 0.126834 -[2024/06/24 07:09:18] ppsci INFO: train: epoch 1330 | step 20 | lr 0.000130 | loss 0.033315 | mae 0.133249 -[2024/06/24 07:09:19] ppsci INFO: train: epoch 1330 | step 30 | lr 0.000130 | loss 0.028402 | mae 0.123947 -[2024/06/24 07:09:19] ppsci INFO: train: epoch 1330 | step 38 | lr 0.000130 | loss 0.006668 | mae 0.068891 -[2024/06/24 07:09:19] ppsci INFO: epoch: 1330, train_loss: 0.027501, train_metric: 0.123002, eval_loss: 0.052061, eval_mae: 0.152046 -[2024/06/24 07:09:19] ppsci INFO: train: epoch 1331 | step 0 | lr 0.000131 | loss 0.024414 | mae 0.123431 -[2024/06/24 07:09:20] ppsci INFO: train: epoch 1331 | step 10 | lr 0.000131 | loss 0.023361 | mae 0.113784 -[2024/06/24 07:09:20] ppsci INFO: train: epoch 1331 | step 20 | lr 0.000131 | loss 0.027779 | mae 0.124525 -[2024/06/24 07:09:21] ppsci INFO: train: epoch 1331 | step 30 | lr 0.000131 | loss 0.020438 | mae 0.109335 -[2024/06/24 07:09:21] ppsci INFO: train: epoch 1331 | step 38 | lr 0.000131 | loss 0.029546 | mae 0.142241 -[2024/06/24 07:09:21] ppsci INFO: epoch: 1331, train_loss: 0.026935, train_metric: 0.121840, eval_loss: 0.050876, eval_mae: 0.149819 -[2024/06/24 07:09:21] ppsci INFO: train: epoch 1332 | step 0 | lr 0.000132 | loss 0.023717 | mae 0.111517 -[2024/06/24 07:09:22] ppsci INFO: train: epoch 1332 | step 10 | lr 0.000132 | loss 0.025673 | mae 0.119203 -[2024/06/24 07:09:22] ppsci INFO: train: epoch 1332 | step 20 | lr 0.000132 | loss 0.031343 | mae 0.128021 -[2024/06/24 07:09:23] ppsci INFO: train: epoch 1332 | step 30 | lr 0.000132 | loss 0.029923 | mae 0.128780 -[2024/06/24 07:09:23] ppsci INFO: train: epoch 1332 | step 38 | lr 0.000132 | loss 0.007224 | mae 0.073997 -[2024/06/24 07:09:24] ppsci INFO: epoch: 1332, train_loss: 0.028040, train_metric: 0.125128, eval_loss: 0.052570, eval_mae: 0.151226 -[2024/06/24 07:09:24] ppsci INFO: train: epoch 1333 | step 0 | lr 0.000132 | loss 0.031728 | mae 0.135970 -[2024/06/24 07:09:24] ppsci INFO: train: epoch 1333 | step 10 | lr 0.000132 | loss 0.019046 | mae 0.099467 -[2024/06/24 07:09:25] ppsci INFO: train: epoch 1333 | step 20 | lr 0.000132 | loss 0.031083 | mae 0.128208 -[2024/06/24 07:09:25] ppsci INFO: train: epoch 1333 | step 30 | lr 0.000132 | loss 0.022696 | mae 0.108030 -[2024/06/24 07:09:26] ppsci INFO: train: epoch 1333 | step 38 | lr 0.000132 | loss 0.008605 | mae 0.080870 -[2024/06/24 07:09:26] ppsci INFO: epoch: 1333, train_loss: 0.027790, train_metric: 0.122731, eval_loss: 0.053456, eval_mae: 0.152557 -[2024/06/24 07:09:26] ppsci INFO: train: epoch 1334 | step 0 | lr 0.000133 | loss 0.022230 | mae 0.116613 -[2024/06/24 07:09:26] ppsci INFO: train: epoch 1334 | step 10 | lr 0.000133 | loss 0.029999 | mae 0.123025 -[2024/06/24 07:09:27] ppsci INFO: train: epoch 1334 | step 20 | lr 0.000133 | loss 0.032996 | mae 0.142191 -[2024/06/24 07:09:27] ppsci INFO: train: epoch 1334 | step 30 | lr 0.000133 | loss 0.023904 | mae 0.120010 -[2024/06/24 07:09:28] ppsci INFO: train: epoch 1334 | step 38 | lr 0.000133 | loss 0.044650 | mae 0.152644 -[2024/06/24 07:09:28] ppsci INFO: epoch: 1334, train_loss: 0.028417, train_metric: 0.123491, eval_loss: 0.047720, eval_mae: 0.148602 -[2024/06/24 07:09:28] ppsci INFO: train: epoch 1335 | step 0 | lr 0.000134 | loss 0.025959 | mae 0.124529 -[2024/06/24 07:09:28] ppsci INFO: train: epoch 1335 | step 10 | lr 0.000134 | loss 0.030253 | mae 0.127579 -[2024/06/24 07:09:29] ppsci INFO: train: epoch 1335 | step 20 | lr 0.000134 | loss 0.020407 | mae 0.108030 -[2024/06/24 07:09:29] ppsci INFO: train: epoch 1335 | step 30 | lr 0.000134 | loss 0.024426 | mae 0.111850 -[2024/06/24 07:09:30] ppsci INFO: train: epoch 1335 | step 38 | lr 0.000134 | loss 0.026782 | mae 0.133373 -[2024/06/24 07:09:30] ppsci INFO: epoch: 1335, train_loss: 0.028210, train_metric: 0.123123, eval_loss: 0.051456, eval_mae: 0.151858 -[2024/06/24 07:09:30] ppsci INFO: train: epoch 1336 | step 0 | lr 0.000134 | loss 0.024459 | mae 0.123774 -[2024/06/24 07:09:31] ppsci INFO: train: epoch 1336 | step 10 | lr 0.000134 | loss 0.032194 | mae 0.124852 -[2024/06/24 07:09:31] ppsci INFO: train: epoch 1336 | step 20 | lr 0.000134 | loss 0.023119 | mae 0.114869 -[2024/06/24 07:09:32] ppsci INFO: train: epoch 1336 | step 30 | lr 0.000134 | loss 0.026797 | mae 0.117126 -[2024/06/24 07:09:32] ppsci INFO: train: epoch 1336 | step 38 | lr 0.000134 | loss 0.059919 | mae 0.148859 -[2024/06/24 07:09:32] ppsci INFO: epoch: 1336, train_loss: 0.028962, train_metric: 0.121462, eval_loss: 0.049741, eval_mae: 0.150132 -[2024/06/24 07:09:32] ppsci INFO: train: epoch 1337 | step 0 | lr 0.000135 | loss 0.026375 | mae 0.119675 -[2024/06/24 07:09:33] ppsci INFO: train: epoch 1337 | step 10 | lr 0.000135 | loss 0.036698 | mae 0.140545 -[2024/06/24 07:09:33] ppsci INFO: train: epoch 1337 | step 20 | lr 0.000135 | loss 0.031850 | mae 0.136758 -[2024/06/24 07:09:34] ppsci INFO: train: epoch 1337 | step 30 | lr 0.000135 | loss 0.029796 | mae 0.122510 -[2024/06/24 07:09:34] ppsci INFO: train: epoch 1337 | step 38 | lr 0.000135 | loss 0.016553 | mae 0.089168 -[2024/06/24 07:09:34] ppsci INFO: epoch: 1337, train_loss: 0.028791, train_metric: 0.124978, eval_loss: 0.052132, eval_mae: 0.149297 -[2024/06/24 07:09:34] ppsci INFO: train: epoch 1338 | step 0 | lr 0.000136 | loss 0.020910 | mae 0.108767 -[2024/06/24 07:09:35] ppsci INFO: train: epoch 1338 | step 10 | lr 0.000136 | loss 0.029128 | mae 0.125824 -[2024/06/24 07:09:35] ppsci INFO: train: epoch 1338 | step 20 | lr 0.000136 | loss 0.028727 | mae 0.119302 -[2024/06/24 07:09:36] ppsci INFO: train: epoch 1338 | step 30 | lr 0.000136 | loss 0.048613 | mae 0.136750 -[2024/06/24 07:09:36] ppsci INFO: train: epoch 1338 | step 38 | lr 0.000136 | loss 0.031177 | mae 0.141645 -[2024/06/24 07:09:36] ppsci INFO: epoch: 1338, train_loss: 0.027693, train_metric: 0.121481, eval_loss: 0.050651, eval_mae: 0.148137 -[2024/06/24 07:09:36] ppsci INFO: train: epoch 1339 | step 0 | lr 0.000136 | loss 0.023341 | mae 0.112105 -[2024/06/24 07:09:37] ppsci INFO: train: epoch 1339 | step 10 | lr 0.000136 | loss 0.026048 | mae 0.122105 -[2024/06/24 07:09:37] ppsci INFO: train: epoch 1339 | step 20 | lr 0.000136 | loss 0.026165 | mae 0.124403 -[2024/06/24 07:09:38] ppsci INFO: train: epoch 1339 | step 30 | lr 0.000136 | loss 0.018225 | mae 0.100581 -[2024/06/24 07:09:38] ppsci INFO: train: epoch 1339 | step 38 | lr 0.000136 | loss 0.013229 | mae 0.099718 -[2024/06/24 07:09:38] ppsci INFO: epoch: 1339, train_loss: 0.028244, train_metric: 0.123547, eval_loss: 0.051846, eval_mae: 0.152762 -[2024/06/24 07:09:39] ppsci INFO: train: epoch 1340 | step 0 | lr 0.000137 | loss 0.026558 | mae 0.118711 -[2024/06/24 07:09:39] ppsci INFO: train: epoch 1340 | step 10 | lr 0.000137 | loss 0.031529 | mae 0.130267 -[2024/06/24 07:09:40] ppsci INFO: train: epoch 1340 | step 20 | lr 0.000137 | loss 0.028604 | mae 0.118460 -[2024/06/24 07:09:40] ppsci INFO: train: epoch 1340 | step 30 | lr 0.000137 | loss 0.028748 | mae 0.120686 -[2024/06/24 07:09:41] ppsci INFO: train: epoch 1340 | step 38 | lr 0.000137 | loss 0.035369 | mae 0.134984 -[2024/06/24 07:09:41] ppsci INFO: epoch: 1340, train_loss: 0.028218, train_metric: 0.122625, eval_loss: 0.050706, eval_mae: 0.150336 -[2024/06/24 07:09:41] ppsci INFO: train: epoch 1341 | step 0 | lr 0.000138 | loss 0.021160 | mae 0.113879 -[2024/06/24 07:09:41] ppsci INFO: train: epoch 1341 | step 10 | lr 0.000138 | loss 0.027260 | mae 0.125970 -[2024/06/24 07:09:42] ppsci INFO: train: epoch 1341 | step 20 | lr 0.000138 | loss 0.019532 | mae 0.102759 -[2024/06/24 07:09:42] ppsci INFO: train: epoch 1341 | step 30 | lr 0.000138 | loss 0.025854 | mae 0.118854 -[2024/06/24 07:09:43] ppsci INFO: train: epoch 1341 | step 38 | lr 0.000138 | loss 0.008187 | mae 0.052094 -[2024/06/24 07:09:43] ppsci INFO: epoch: 1341, train_loss: 0.028457, train_metric: 0.122954, eval_loss: 0.050017, eval_mae: 0.150003 -[2024/06/24 07:09:43] ppsci INFO: train: epoch 1342 | step 0 | lr 0.000138 | loss 0.035821 | mae 0.140657 -[2024/06/24 07:09:43] ppsci INFO: train: epoch 1342 | step 10 | lr 0.000138 | loss 0.031460 | mae 0.117432 -[2024/06/24 07:09:44] ppsci INFO: train: epoch 1342 | step 20 | lr 0.000138 | loss 0.027018 | mae 0.121624 -[2024/06/24 07:09:44] ppsci INFO: train: epoch 1342 | step 30 | lr 0.000138 | loss 0.026015 | mae 0.130350 -[2024/06/24 07:09:45] ppsci INFO: train: epoch 1342 | step 38 | lr 0.000138 | loss 0.009682 | mae 0.086291 -[2024/06/24 07:09:45] ppsci INFO: epoch: 1342, train_loss: 0.028716, train_metric: 0.123096, eval_loss: 0.052612, eval_mae: 0.152077 -[2024/06/24 07:09:45] ppsci INFO: train: epoch 1343 | step 0 | lr 0.000139 | loss 0.024153 | mae 0.119118 -[2024/06/24 07:09:46] ppsci INFO: train: epoch 1343 | step 10 | lr 0.000139 | loss 0.027372 | mae 0.121638 -[2024/06/24 07:09:46] ppsci INFO: train: epoch 1343 | step 20 | lr 0.000139 | loss 0.040266 | mae 0.144213 -[2024/06/24 07:09:47] ppsci INFO: train: epoch 1343 | step 30 | lr 0.000139 | loss 0.034906 | mae 0.139243 -[2024/06/24 07:09:47] ppsci INFO: train: epoch 1343 | step 38 | lr 0.000139 | loss 0.011031 | mae 0.086268 -[2024/06/24 07:09:47] ppsci INFO: epoch: 1343, train_loss: 0.027757, train_metric: 0.123142, eval_loss: 0.052067, eval_mae: 0.150243 -[2024/06/24 07:09:47] ppsci INFO: train: epoch 1344 | step 0 | lr 0.000140 | loss 0.020452 | mae 0.112661 -[2024/06/24 07:09:48] ppsci INFO: train: epoch 1344 | step 10 | lr 0.000140 | loss 0.034111 | mae 0.136475 -[2024/06/24 07:09:48] ppsci INFO: train: epoch 1344 | step 20 | lr 0.000140 | loss 0.026858 | mae 0.122337 -[2024/06/24 07:09:49] ppsci INFO: train: epoch 1344 | step 30 | lr 0.000140 | loss 0.026577 | mae 0.123602 -[2024/06/24 07:09:49] ppsci INFO: train: epoch 1344 | step 38 | lr 0.000140 | loss 0.015760 | mae 0.089921 -[2024/06/24 07:09:49] ppsci INFO: epoch: 1344, train_loss: 0.027995, train_metric: 0.124477, eval_loss: 0.049853, eval_mae: 0.148926 -[2024/06/24 07:09:49] ppsci INFO: train: epoch 1345 | step 0 | lr 0.000140 | loss 0.023426 | mae 0.106743 -[2024/06/24 07:09:50] ppsci INFO: train: epoch 1345 | step 10 | lr 0.000140 | loss 0.024621 | mae 0.113136 -[2024/06/24 07:09:50] ppsci INFO: train: epoch 1345 | step 20 | lr 0.000140 | loss 0.031840 | mae 0.133356 -[2024/06/24 07:09:51] ppsci INFO: train: epoch 1345 | step 30 | lr 0.000140 | loss 0.031305 | mae 0.124738 -[2024/06/24 07:09:51] ppsci INFO: train: epoch 1345 | step 38 | lr 0.000140 | loss 0.018651 | mae 0.115573 -[2024/06/24 07:09:51] ppsci INFO: epoch: 1345, train_loss: 0.029532, train_metric: 0.127020, eval_loss: 0.048323, eval_mae: 0.147518 -[2024/06/24 07:09:52] ppsci INFO: train: epoch 1346 | step 0 | lr 0.000141 | loss 0.024119 | mae 0.109393 -[2024/06/24 07:09:52] ppsci INFO: train: epoch 1346 | step 10 | lr 0.000141 | loss 0.028449 | mae 0.124962 -[2024/06/24 07:09:53] ppsci INFO: train: epoch 1346 | step 20 | lr 0.000141 | loss 0.025164 | mae 0.121054 -[2024/06/24 07:09:53] ppsci INFO: train: epoch 1346 | step 30 | lr 0.000141 | loss 0.018983 | mae 0.103257 -[2024/06/24 07:09:53] ppsci INFO: train: epoch 1346 | step 38 | lr 0.000141 | loss 0.011419 | mae 0.094852 -[2024/06/24 07:09:54] ppsci INFO: epoch: 1346, train_loss: 0.028181, train_metric: 0.123268, eval_loss: 0.050787, eval_mae: 0.146369 -[2024/06/24 07:09:54] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:09:54] ppsci INFO: train: epoch 1347 | step 0 | lr 0.000142 | loss 0.021718 | mae 0.115660 -[2024/06/24 07:09:54] ppsci INFO: train: epoch 1347 | step 10 | lr 0.000142 | loss 0.024928 | mae 0.115750 -[2024/06/24 07:09:55] ppsci INFO: train: epoch 1347 | step 20 | lr 0.000142 | loss 0.031640 | mae 0.126720 -[2024/06/24 07:09:55] ppsci INFO: train: epoch 1347 | step 30 | lr 0.000142 | loss 0.039174 | mae 0.130537 -[2024/06/24 07:09:56] ppsci INFO: train: epoch 1347 | step 38 | lr 0.000142 | loss 0.036776 | mae 0.135352 -[2024/06/24 07:09:56] ppsci INFO: epoch: 1347, train_loss: 0.027604, train_metric: 0.121069, eval_loss: 0.051868, eval_mae: 0.148141 -[2024/06/24 07:09:56] ppsci INFO: train: epoch 1348 | step 0 | lr 0.000142 | loss 0.024215 | mae 0.113573 -[2024/06/24 07:09:56] ppsci INFO: train: epoch 1348 | step 10 | lr 0.000142 | loss 0.037737 | mae 0.141850 -[2024/06/24 07:09:57] ppsci INFO: train: epoch 1348 | step 20 | lr 0.000142 | loss 0.016667 | mae 0.104170 -[2024/06/24 07:09:57] ppsci INFO: train: epoch 1348 | step 30 | lr 0.000142 | loss 0.022104 | mae 0.115294 -[2024/06/24 07:09:58] ppsci INFO: train: epoch 1348 | step 38 | lr 0.000142 | loss 0.023776 | mae 0.123803 -[2024/06/24 07:09:58] ppsci INFO: epoch: 1348, train_loss: 0.025376, train_metric: 0.119038, eval_loss: 0.049407, eval_mae: 0.147895 -[2024/06/24 07:09:58] ppsci INFO: train: epoch 1349 | step 0 | lr 0.000143 | loss 0.031992 | mae 0.133057 -[2024/06/24 07:09:59] ppsci INFO: train: epoch 1349 | step 10 | lr 0.000143 | loss 0.026708 | mae 0.124887 -[2024/06/24 07:09:59] ppsci INFO: train: epoch 1349 | step 20 | lr 0.000143 | loss 0.030352 | mae 0.130389 -[2024/06/24 07:10:00] ppsci INFO: train: epoch 1349 | step 30 | lr 0.000143 | loss 0.031388 | mae 0.128561 -[2024/06/24 07:10:00] ppsci INFO: train: epoch 1349 | step 38 | lr 0.000143 | loss 0.027721 | mae 0.143760 -[2024/06/24 07:10:00] ppsci INFO: epoch: 1349, train_loss: 0.027732, train_metric: 0.122177, eval_loss: 0.053327, eval_mae: 0.148752 -[2024/06/24 07:10:00] ppsci INFO: train: epoch 1350 | step 0 | lr 0.000144 | loss 0.026045 | mae 0.115489 -[2024/06/24 07:10:01] ppsci INFO: train: epoch 1350 | step 10 | lr 0.000144 | loss 0.021027 | mae 0.113052 -[2024/06/24 07:10:01] ppsci INFO: train: epoch 1350 | step 20 | lr 0.000144 | loss 0.026639 | mae 0.124960 -[2024/06/24 07:10:02] ppsci INFO: train: epoch 1350 | step 30 | lr 0.000144 | loss 0.023929 | mae 0.122058 -[2024/06/24 07:10:02] ppsci INFO: train: epoch 1350 | step 38 | lr 0.000144 | loss 0.041425 | mae 0.155513 -[2024/06/24 07:10:02] ppsci INFO: epoch: 1350, train_loss: 0.027649, train_metric: 0.122308, eval_loss: 0.048794, eval_mae: 0.146558 -[2024/06/24 07:10:02] ppsci INFO: train: epoch 1351 | step 0 | lr 0.000144 | loss 0.024802 | mae 0.112755 -[2024/06/24 07:10:03] ppsci INFO: train: epoch 1351 | step 10 | lr 0.000144 | loss 0.026594 | mae 0.119002 -[2024/06/24 07:10:03] ppsci INFO: train: epoch 1351 | step 20 | lr 0.000144 | loss 0.021937 | mae 0.117191 -[2024/06/24 07:10:04] ppsci INFO: train: epoch 1351 | step 30 | lr 0.000144 | loss 0.027080 | mae 0.126648 -[2024/06/24 07:10:04] ppsci INFO: train: epoch 1351 | step 38 | lr 0.000144 | loss 0.044497 | mae 0.167745 -[2024/06/24 07:10:04] ppsci INFO: epoch: 1351, train_loss: 0.027034, train_metric: 0.120255, eval_loss: 0.048806, eval_mae: 0.146965 -[2024/06/24 07:10:04] ppsci INFO: train: epoch 1352 | step 0 | lr 0.000145 | loss 0.035579 | mae 0.139664 -[2024/06/24 07:10:05] ppsci INFO: train: epoch 1352 | step 10 | lr 0.000145 | loss 0.039350 | mae 0.132618 -[2024/06/24 07:10:06] ppsci INFO: train: epoch 1352 | step 20 | lr 0.000145 | loss 0.031960 | mae 0.130718 -[2024/06/24 07:10:06] ppsci INFO: train: epoch 1352 | step 30 | lr 0.000145 | loss 0.023560 | mae 0.114355 -[2024/06/24 07:10:06] ppsci INFO: train: epoch 1352 | step 38 | lr 0.000145 | loss 0.022867 | mae 0.131873 -[2024/06/24 07:10:07] ppsci INFO: epoch: 1352, train_loss: 0.026708, train_metric: 0.121272, eval_loss: 0.054553, eval_mae: 0.151475 -[2024/06/24 07:10:07] ppsci INFO: train: epoch 1353 | step 0 | lr 0.000146 | loss 0.030722 | mae 0.134973 -[2024/06/24 07:10:07] ppsci INFO: train: epoch 1353 | step 10 | lr 0.000146 | loss 0.027430 | mae 0.125279 -[2024/06/24 07:10:08] ppsci INFO: train: epoch 1353 | step 20 | lr 0.000146 | loss 0.029268 | mae 0.116757 -[2024/06/24 07:10:08] ppsci INFO: train: epoch 1353 | step 30 | lr 0.000146 | loss 0.026400 | mae 0.118881 -[2024/06/24 07:10:09] ppsci INFO: train: epoch 1353 | step 38 | lr 0.000146 | loss 0.082454 | mae 0.205891 -[2024/06/24 07:10:09] ppsci INFO: epoch: 1353, train_loss: 0.029288, train_metric: 0.123688, eval_loss: 0.051331, eval_mae: 0.149158 -[2024/06/24 07:10:09] ppsci INFO: train: epoch 1354 | step 0 | lr 0.000147 | loss 0.023390 | mae 0.118216 -[2024/06/24 07:10:10] ppsci INFO: train: epoch 1354 | step 10 | lr 0.000147 | loss 0.018970 | mae 0.108208 -[2024/06/24 07:10:10] ppsci INFO: train: epoch 1354 | step 20 | lr 0.000147 | loss 0.036709 | mae 0.138951 -[2024/06/24 07:10:11] ppsci INFO: train: epoch 1354 | step 30 | lr 0.000147 | loss 0.029676 | mae 0.129403 -[2024/06/24 07:10:11] ppsci INFO: train: epoch 1354 | step 38 | lr 0.000147 | loss 0.050820 | mae 0.173977 -[2024/06/24 07:10:11] ppsci INFO: epoch: 1354, train_loss: 0.027594, train_metric: 0.121609, eval_loss: 0.050422, eval_mae: 0.149916 -[2024/06/24 07:10:11] ppsci INFO: train: epoch 1355 | step 0 | lr 0.000147 | loss 0.023047 | mae 0.116651 -[2024/06/24 07:10:12] ppsci INFO: train: epoch 1355 | step 10 | lr 0.000147 | loss 0.025835 | mae 0.131321 -[2024/06/24 07:10:12] ppsci INFO: train: epoch 1355 | step 20 | lr 0.000147 | loss 0.034259 | mae 0.140254 -[2024/06/24 07:10:13] ppsci INFO: train: epoch 1355 | step 30 | lr 0.000147 | loss 0.022402 | mae 0.109841 -[2024/06/24 07:10:13] ppsci INFO: train: epoch 1355 | step 38 | lr 0.000147 | loss 0.016006 | mae 0.083245 -[2024/06/24 07:10:13] ppsci INFO: epoch: 1355, train_loss: 0.027433, train_metric: 0.123794, eval_loss: 0.048051, eval_mae: 0.146840 -[2024/06/24 07:10:13] ppsci INFO: train: epoch 1356 | step 0 | lr 0.000148 | loss 0.018423 | mae 0.101501 -[2024/06/24 07:10:14] ppsci INFO: train: epoch 1356 | step 10 | lr 0.000148 | loss 0.029344 | mae 0.133736 -[2024/06/24 07:10:14] ppsci INFO: train: epoch 1356 | step 20 | lr 0.000148 | loss 0.035232 | mae 0.141478 -[2024/06/24 07:10:15] ppsci INFO: train: epoch 1356 | step 30 | lr 0.000148 | loss 0.020015 | mae 0.109519 -[2024/06/24 07:10:15] ppsci INFO: train: epoch 1356 | step 38 | lr 0.000148 | loss 0.012907 | mae 0.095624 -[2024/06/24 07:10:15] ppsci INFO: epoch: 1356, train_loss: 0.027203, train_metric: 0.123038, eval_loss: 0.051520, eval_mae: 0.151857 -[2024/06/24 07:10:15] ppsci INFO: train: epoch 1357 | step 0 | lr 0.000149 | loss 0.032739 | mae 0.122349 -[2024/06/24 07:10:16] ppsci INFO: train: epoch 1357 | step 10 | lr 0.000149 | loss 0.026123 | mae 0.125186 -[2024/06/24 07:10:17] ppsci INFO: train: epoch 1357 | step 20 | lr 0.000149 | loss 0.023137 | mae 0.108888 -[2024/06/24 07:10:17] ppsci INFO: train: epoch 1357 | step 30 | lr 0.000149 | loss 0.032996 | mae 0.128512 -[2024/06/24 07:10:18] ppsci INFO: train: epoch 1357 | step 38 | lr 0.000149 | loss 0.006846 | mae 0.066359 -[2024/06/24 07:10:18] ppsci INFO: epoch: 1357, train_loss: 0.026830, train_metric: 0.121519, eval_loss: 0.051947, eval_mae: 0.150635 -[2024/06/24 07:10:18] ppsci INFO: train: epoch 1358 | step 0 | lr 0.000149 | loss 0.020248 | mae 0.106725 -[2024/06/24 07:10:18] ppsci INFO: train: epoch 1358 | step 10 | lr 0.000149 | loss 0.023264 | mae 0.113859 -[2024/06/24 07:10:19] ppsci INFO: train: epoch 1358 | step 20 | lr 0.000149 | loss 0.024543 | mae 0.117245 -[2024/06/24 07:10:19] ppsci INFO: train: epoch 1358 | step 30 | lr 0.000149 | loss 0.060050 | mae 0.158127 -[2024/06/24 07:10:20] ppsci INFO: train: epoch 1358 | step 38 | lr 0.000149 | loss 0.024977 | mae 0.119030 -[2024/06/24 07:10:20] ppsci INFO: epoch: 1358, train_loss: 0.027350, train_metric: 0.122061, eval_loss: 0.048491, eval_mae: 0.149236 -[2024/06/24 07:10:20] ppsci INFO: train: epoch 1359 | step 0 | lr 0.000150 | loss 0.027228 | mae 0.125947 -[2024/06/24 07:10:20] ppsci INFO: train: epoch 1359 | step 10 | lr 0.000150 | loss 0.025218 | mae 0.124875 -[2024/06/24 07:10:21] ppsci INFO: train: epoch 1359 | step 20 | lr 0.000150 | loss 0.035442 | mae 0.139842 -[2024/06/24 07:10:21] ppsci INFO: train: epoch 1359 | step 30 | lr 0.000150 | loss 0.023095 | mae 0.114339 -[2024/06/24 07:10:22] ppsci INFO: train: epoch 1359 | step 38 | lr 0.000150 | loss 0.016629 | mae 0.076197 -[2024/06/24 07:10:22] ppsci INFO: epoch: 1359, train_loss: 0.026570, train_metric: 0.121875, eval_loss: 0.051855, eval_mae: 0.151898 -[2024/06/24 07:10:22] ppsci INFO: train: epoch 1360 | step 0 | lr 0.000151 | loss 0.024047 | mae 0.114698 -[2024/06/24 07:10:22] ppsci INFO: train: epoch 1360 | step 10 | lr 0.000151 | loss 0.028042 | mae 0.123627 -[2024/06/24 07:10:23] ppsci INFO: train: epoch 1360 | step 20 | lr 0.000151 | loss 0.024039 | mae 0.116150 -[2024/06/24 07:10:23] ppsci INFO: train: epoch 1360 | step 30 | lr 0.000151 | loss 0.026619 | mae 0.120529 -[2024/06/24 07:10:24] ppsci INFO: train: epoch 1360 | step 38 | lr 0.000151 | loss 0.028775 | mae 0.127890 -[2024/06/24 07:10:24] ppsci INFO: epoch: 1360, train_loss: 0.027303, train_metric: 0.121413, eval_loss: 0.051665, eval_mae: 0.150490 -[2024/06/24 07:10:24] ppsci INFO: train: epoch 1361 | step 0 | lr 0.000151 | loss 0.022340 | mae 0.116741 -[2024/06/24 07:10:25] ppsci INFO: train: epoch 1361 | step 10 | lr 0.000151 | loss 0.026949 | mae 0.123161 -[2024/06/24 07:10:25] ppsci INFO: train: epoch 1361 | step 20 | lr 0.000151 | loss 0.024501 | mae 0.118338 -[2024/06/24 07:10:26] ppsci INFO: train: epoch 1361 | step 30 | lr 0.000151 | loss 0.024192 | mae 0.113133 -[2024/06/24 07:10:26] ppsci INFO: train: epoch 1361 | step 38 | lr 0.000151 | loss 0.036019 | mae 0.139101 -[2024/06/24 07:10:26] ppsci INFO: epoch: 1361, train_loss: 0.027820, train_metric: 0.121489, eval_loss: 0.052990, eval_mae: 0.150892 -[2024/06/24 07:10:26] ppsci INFO: train: epoch 1362 | step 0 | lr 0.000152 | loss 0.027932 | mae 0.115877 -[2024/06/24 07:10:27] ppsci INFO: train: epoch 1362 | step 10 | lr 0.000152 | loss 0.033441 | mae 0.137971 -[2024/06/24 07:10:27] ppsci INFO: train: epoch 1362 | step 20 | lr 0.000152 | loss 0.062140 | mae 0.149760 -[2024/06/24 07:10:28] ppsci INFO: train: epoch 1362 | step 30 | lr 0.000152 | loss 0.038229 | mae 0.146131 -[2024/06/24 07:10:28] ppsci INFO: train: epoch 1362 | step 38 | lr 0.000152 | loss 0.015305 | mae 0.096073 -[2024/06/24 07:10:28] ppsci INFO: epoch: 1362, train_loss: 0.030130, train_metric: 0.127747, eval_loss: 0.050502, eval_mae: 0.150643 -[2024/06/24 07:10:29] ppsci INFO: train: epoch 1363 | step 0 | lr 0.000153 | loss 0.044790 | mae 0.135293 -[2024/06/24 07:10:29] ppsci INFO: train: epoch 1363 | step 10 | lr 0.000153 | loss 0.027810 | mae 0.122850 -[2024/06/24 07:10:30] ppsci INFO: train: epoch 1363 | step 20 | lr 0.000153 | loss 0.019033 | mae 0.106634 -[2024/06/24 07:10:30] ppsci INFO: train: epoch 1363 | step 30 | lr 0.000153 | loss 0.035201 | mae 0.138586 -[2024/06/24 07:10:31] ppsci INFO: train: epoch 1363 | step 38 | lr 0.000153 | loss 0.017799 | mae 0.106468 -[2024/06/24 07:10:31] ppsci INFO: epoch: 1363, train_loss: 0.028217, train_metric: 0.122504, eval_loss: 0.054542, eval_mae: 0.153446 -[2024/06/24 07:10:31] ppsci INFO: train: epoch 1364 | step 0 | lr 0.000153 | loss 0.026623 | mae 0.116468 -[2024/06/24 07:10:31] ppsci INFO: train: epoch 1364 | step 10 | lr 0.000153 | loss 0.028937 | mae 0.125003 -[2024/06/24 07:10:32] ppsci INFO: train: epoch 1364 | step 20 | lr 0.000153 | loss 0.028643 | mae 0.126901 -[2024/06/24 07:10:32] ppsci INFO: train: epoch 1364 | step 30 | lr 0.000153 | loss 0.030830 | mae 0.134101 -[2024/06/24 07:10:33] ppsci INFO: train: epoch 1364 | step 38 | lr 0.000153 | loss 0.019294 | mae 0.117481 -[2024/06/24 07:10:33] ppsci INFO: epoch: 1364, train_loss: 0.026435, train_metric: 0.120508, eval_loss: 0.051010, eval_mae: 0.152857 -[2024/06/24 07:10:33] ppsci INFO: train: epoch 1365 | step 0 | lr 0.000154 | loss 0.025382 | mae 0.113011 -[2024/06/24 07:10:33] ppsci INFO: train: epoch 1365 | step 10 | lr 0.000154 | loss 0.022263 | mae 0.115033 -[2024/06/24 07:10:34] ppsci INFO: train: epoch 1365 | step 20 | lr 0.000154 | loss 0.029883 | mae 0.122252 -[2024/06/24 07:10:35] ppsci INFO: train: epoch 1365 | step 30 | lr 0.000154 | loss 0.026282 | mae 0.113455 -[2024/06/24 07:10:35] ppsci INFO: train: epoch 1365 | step 38 | lr 0.000154 | loss 0.020716 | mae 0.107052 -[2024/06/24 07:10:35] ppsci INFO: epoch: 1365, train_loss: 0.026752, train_metric: 0.121448, eval_loss: 0.050706, eval_mae: 0.152873 -[2024/06/24 07:10:35] ppsci INFO: train: epoch 1366 | step 0 | lr 0.000155 | loss 0.025628 | mae 0.117754 -[2024/06/24 07:10:36] ppsci INFO: train: epoch 1366 | step 10 | lr 0.000155 | loss 0.021578 | mae 0.112727 -[2024/06/24 07:10:36] ppsci INFO: train: epoch 1366 | step 20 | lr 0.000155 | loss 0.025033 | mae 0.119866 -[2024/06/24 07:10:37] ppsci INFO: train: epoch 1366 | step 30 | lr 0.000155 | loss 0.031162 | mae 0.133348 -[2024/06/24 07:10:37] ppsci INFO: train: epoch 1366 | step 38 | lr 0.000155 | loss 0.022159 | mae 0.103847 -[2024/06/24 07:10:37] ppsci INFO: epoch: 1366, train_loss: 0.026501, train_metric: 0.120707, eval_loss: 0.051012, eval_mae: 0.152554 -[2024/06/24 07:10:37] ppsci INFO: train: epoch 1367 | step 0 | lr 0.000156 | loss 0.029848 | mae 0.126409 -[2024/06/24 07:10:38] ppsci INFO: train: epoch 1367 | step 10 | lr 0.000156 | loss 0.035091 | mae 0.133800 -[2024/06/24 07:10:38] ppsci INFO: train: epoch 1367 | step 20 | lr 0.000156 | loss 0.026411 | mae 0.125705 -[2024/06/24 07:10:39] ppsci INFO: train: epoch 1367 | step 30 | lr 0.000156 | loss 0.027063 | mae 0.125344 -[2024/06/24 07:10:39] ppsci INFO: train: epoch 1367 | step 38 | lr 0.000156 | loss 0.024069 | mae 0.124116 -[2024/06/24 07:10:39] ppsci INFO: epoch: 1367, train_loss: 0.029960, train_metric: 0.125926, eval_loss: 0.053880, eval_mae: 0.149698 -[2024/06/24 07:10:39] ppsci INFO: train: epoch 1368 | step 0 | lr 0.000156 | loss 0.027024 | mae 0.116928 -[2024/06/24 07:10:40] ppsci INFO: train: epoch 1368 | step 10 | lr 0.000156 | loss 0.024047 | mae 0.123709 -[2024/06/24 07:10:40] ppsci INFO: train: epoch 1368 | step 20 | lr 0.000156 | loss 0.025548 | mae 0.121211 -[2024/06/24 07:10:41] ppsci INFO: train: epoch 1368 | step 30 | lr 0.000156 | loss 0.026800 | mae 0.126402 -[2024/06/24 07:10:41] ppsci INFO: train: epoch 1368 | step 38 | lr 0.000156 | loss 0.027448 | mae 0.123627 -[2024/06/24 07:10:42] ppsci INFO: epoch: 1368, train_loss: 0.027273, train_metric: 0.122385, eval_loss: 0.052420, eval_mae: 0.152081 -[2024/06/24 07:10:42] ppsci INFO: train: epoch 1369 | step 0 | lr 0.000157 | loss 0.027333 | mae 0.129258 -[2024/06/24 07:10:42] ppsci INFO: train: epoch 1369 | step 10 | lr 0.000157 | loss 0.024537 | mae 0.113610 -[2024/06/24 07:10:43] ppsci INFO: train: epoch 1369 | step 20 | lr 0.000157 | loss 0.034865 | mae 0.134504 -[2024/06/24 07:10:43] ppsci INFO: train: epoch 1369 | step 30 | lr 0.000157 | loss 0.028293 | mae 0.126177 -[2024/06/24 07:10:44] ppsci INFO: train: epoch 1369 | step 38 | lr 0.000157 | loss 0.033364 | mae 0.149257 -[2024/06/24 07:10:44] ppsci INFO: epoch: 1369, train_loss: 0.027610, train_metric: 0.122867, eval_loss: 0.052993, eval_mae: 0.152057 -[2024/06/24 07:10:44] ppsci INFO: train: epoch 1370 | step 0 | lr 0.000158 | loss 0.026756 | mae 0.126828 -[2024/06/24 07:10:44] ppsci INFO: train: epoch 1370 | step 10 | lr 0.000158 | loss 0.020985 | mae 0.108877 -[2024/06/24 07:10:45] ppsci INFO: train: epoch 1370 | step 20 | lr 0.000158 | loss 0.027944 | mae 0.119602 -[2024/06/24 07:10:45] ppsci INFO: train: epoch 1370 | step 30 | lr 0.000158 | loss 0.023184 | mae 0.114682 -[2024/06/24 07:10:46] ppsci INFO: train: epoch 1370 | step 38 | lr 0.000158 | loss 0.022220 | mae 0.102605 -[2024/06/24 07:10:46] ppsci INFO: epoch: 1370, train_loss: 0.026627, train_metric: 0.121693, eval_loss: 0.049353, eval_mae: 0.150651 -[2024/06/24 07:10:46] ppsci INFO: train: epoch 1371 | step 0 | lr 0.000158 | loss 0.023649 | mae 0.115368 -[2024/06/24 07:10:47] ppsci INFO: train: epoch 1371 | step 10 | lr 0.000158 | loss 0.024542 | mae 0.115503 -[2024/06/24 07:10:47] ppsci INFO: train: epoch 1371 | step 20 | lr 0.000158 | loss 0.025258 | mae 0.122985 -[2024/06/24 07:10:48] ppsci INFO: train: epoch 1371 | step 30 | lr 0.000158 | loss 0.021969 | mae 0.113176 -[2024/06/24 07:10:48] ppsci INFO: train: epoch 1371 | step 38 | lr 0.000158 | loss 0.020066 | mae 0.113200 -[2024/06/24 07:10:48] ppsci INFO: epoch: 1371, train_loss: 0.028261, train_metric: 0.124997, eval_loss: 0.053213, eval_mae: 0.149787 -[2024/06/24 07:10:48] ppsci INFO: train: epoch 1372 | step 0 | lr 0.000159 | loss 0.024916 | mae 0.115742 -[2024/06/24 07:10:49] ppsci INFO: train: epoch 1372 | step 10 | lr 0.000159 | loss 0.027599 | mae 0.130137 -[2024/06/24 07:10:49] ppsci INFO: train: epoch 1372 | step 20 | lr 0.000159 | loss 0.030264 | mae 0.127381 -[2024/06/24 07:10:50] ppsci INFO: train: epoch 1372 | step 30 | lr 0.000159 | loss 0.036368 | mae 0.128333 -[2024/06/24 07:10:50] ppsci INFO: train: epoch 1372 | step 38 | lr 0.000159 | loss 0.012371 | mae 0.095630 -[2024/06/24 07:10:50] ppsci INFO: epoch: 1372, train_loss: 0.026393, train_metric: 0.120698, eval_loss: 0.052901, eval_mae: 0.148562 -[2024/06/24 07:10:50] ppsci INFO: train: epoch 1373 | step 0 | lr 0.000160 | loss 0.025559 | mae 0.114867 -[2024/06/24 07:10:51] ppsci INFO: train: epoch 1373 | step 10 | lr 0.000160 | loss 0.028141 | mae 0.115120 -[2024/06/24 07:10:51] ppsci INFO: train: epoch 1373 | step 20 | lr 0.000160 | loss 0.021289 | mae 0.110457 -[2024/06/24 07:10:52] ppsci INFO: train: epoch 1373 | step 30 | lr 0.000160 | loss 0.022864 | mae 0.112005 -[2024/06/24 07:10:52] ppsci INFO: train: epoch 1373 | step 38 | lr 0.000160 | loss 0.019796 | mae 0.126679 -[2024/06/24 07:10:52] ppsci INFO: epoch: 1373, train_loss: 0.027400, train_metric: 0.121860, eval_loss: 0.050076, eval_mae: 0.151503 -[2024/06/24 07:10:52] ppsci INFO: train: epoch 1374 | step 0 | lr 0.000161 | loss 0.029975 | mae 0.126585 -[2024/06/24 07:10:53] ppsci INFO: train: epoch 1374 | step 10 | lr 0.000161 | loss 0.027635 | mae 0.128234 -[2024/06/24 07:10:53] ppsci INFO: train: epoch 1374 | step 20 | lr 0.000161 | loss 0.025619 | mae 0.121192 -[2024/06/24 07:10:54] ppsci INFO: train: epoch 1374 | step 30 | lr 0.000161 | loss 0.024184 | mae 0.115267 -[2024/06/24 07:10:54] ppsci INFO: train: epoch 1374 | step 38 | lr 0.000161 | loss 0.037837 | mae 0.158105 -[2024/06/24 07:10:55] ppsci INFO: epoch: 1374, train_loss: 0.027604, train_metric: 0.122248, eval_loss: 0.051754, eval_mae: 0.149508 -[2024/06/24 07:10:55] ppsci INFO: train: epoch 1375 | step 0 | lr 0.000161 | loss 0.022094 | mae 0.109559 -[2024/06/24 07:10:55] ppsci INFO: train: epoch 1375 | step 10 | lr 0.000161 | loss 0.022424 | mae 0.115275 -[2024/06/24 07:10:56] ppsci INFO: train: epoch 1375 | step 20 | lr 0.000161 | loss 0.023673 | mae 0.120934 -[2024/06/24 07:10:56] ppsci INFO: train: epoch 1375 | step 30 | lr 0.000161 | loss 0.027646 | mae 0.122873 -[2024/06/24 07:10:57] ppsci INFO: train: epoch 1375 | step 38 | lr 0.000161 | loss 0.019179 | mae 0.117492 -[2024/06/24 07:10:57] ppsci INFO: epoch: 1375, train_loss: 0.026454, train_metric: 0.120060, eval_loss: 0.052200, eval_mae: 0.153148 -[2024/06/24 07:10:57] ppsci INFO: train: epoch 1376 | step 0 | lr 0.000162 | loss 0.023795 | mae 0.118437 -[2024/06/24 07:10:57] ppsci INFO: train: epoch 1376 | step 10 | lr 0.000162 | loss 0.028840 | mae 0.128474 -[2024/06/24 07:10:58] ppsci INFO: train: epoch 1376 | step 20 | lr 0.000162 | loss 0.031420 | mae 0.132487 -[2024/06/24 07:10:58] ppsci INFO: train: epoch 1376 | step 30 | lr 0.000162 | loss 0.019183 | mae 0.104106 -[2024/06/24 07:10:59] ppsci INFO: train: epoch 1376 | step 38 | lr 0.000162 | loss 0.094930 | mae 0.189366 -[2024/06/24 07:10:59] ppsci INFO: epoch: 1376, train_loss: 0.029485, train_metric: 0.121528, eval_loss: 0.049041, eval_mae: 0.149094 -[2024/06/24 07:10:59] ppsci INFO: train: epoch 1377 | step 0 | lr 0.000163 | loss 0.027899 | mae 0.118533 -[2024/06/24 07:10:59] ppsci INFO: train: epoch 1377 | step 10 | lr 0.000163 | loss 0.035120 | mae 0.143568 -[2024/06/24 07:11:00] ppsci INFO: train: epoch 1377 | step 20 | lr 0.000163 | loss 0.036924 | mae 0.127517 -[2024/06/24 07:11:00] ppsci INFO: train: epoch 1377 | step 30 | lr 0.000163 | loss 0.022223 | mae 0.120094 -[2024/06/24 07:11:01] ppsci INFO: train: epoch 1377 | step 38 | lr 0.000163 | loss 0.037062 | mae 0.148688 -[2024/06/24 07:11:01] ppsci INFO: epoch: 1377, train_loss: 0.026843, train_metric: 0.120599, eval_loss: 0.050042, eval_mae: 0.148525 -[2024/06/24 07:11:01] ppsci INFO: train: epoch 1378 | step 0 | lr 0.000163 | loss 0.022137 | mae 0.111759 -[2024/06/24 07:11:02] ppsci INFO: train: epoch 1378 | step 10 | lr 0.000163 | loss 0.022001 | mae 0.112355 -[2024/06/24 07:11:02] ppsci INFO: train: epoch 1378 | step 20 | lr 0.000163 | loss 0.024847 | mae 0.119173 -[2024/06/24 07:11:03] ppsci INFO: train: epoch 1378 | step 30 | lr 0.000163 | loss 0.031066 | mae 0.129637 -[2024/06/24 07:11:03] ppsci INFO: train: epoch 1378 | step 38 | lr 0.000163 | loss 0.052149 | mae 0.176216 -[2024/06/24 07:11:03] ppsci INFO: epoch: 1378, train_loss: 0.033323, train_metric: 0.128845, eval_loss: 0.054768, eval_mae: 0.159163 -[2024/06/24 07:11:03] ppsci INFO: train: epoch 1379 | step 0 | lr 0.000164 | loss 0.027181 | mae 0.128071 -[2024/06/24 07:11:04] ppsci INFO: train: epoch 1379 | step 10 | lr 0.000164 | loss 0.029079 | mae 0.122905 -[2024/06/24 07:11:04] ppsci INFO: train: epoch 1379 | step 20 | lr 0.000164 | loss 0.052376 | mae 0.147873 -[2024/06/24 07:11:05] ppsci INFO: train: epoch 1379 | step 30 | lr 0.000164 | loss 0.041295 | mae 0.148664 -[2024/06/24 07:11:05] ppsci INFO: train: epoch 1379 | step 38 | lr 0.000164 | loss 0.051439 | mae 0.183344 -[2024/06/24 07:11:05] ppsci INFO: epoch: 1379, train_loss: 0.031641, train_metric: 0.128821, eval_loss: 0.048756, eval_mae: 0.149349 -[2024/06/24 07:11:05] ppsci INFO: train: epoch 1380 | step 0 | lr 0.000165 | loss 0.025963 | mae 0.111774 -[2024/06/24 07:11:06] ppsci INFO: train: epoch 1380 | step 10 | lr 0.000165 | loss 0.027244 | mae 0.130930 -[2024/06/24 07:11:06] ppsci INFO: train: epoch 1380 | step 20 | lr 0.000165 | loss 0.031131 | mae 0.128347 -[2024/06/24 07:11:07] ppsci INFO: train: epoch 1380 | step 30 | lr 0.000165 | loss 0.031428 | mae 0.116570 -[2024/06/24 07:11:07] ppsci INFO: train: epoch 1380 | step 38 | lr 0.000165 | loss 0.018179 | mae 0.095958 -[2024/06/24 07:11:07] ppsci INFO: epoch: 1380, train_loss: 0.029314, train_metric: 0.123112, eval_loss: 0.050688, eval_mae: 0.152551 -[2024/06/24 07:11:07] ppsci INFO: train: epoch 1381 | step 0 | lr 0.000166 | loss 0.022497 | mae 0.112663 -[2024/06/24 07:11:08] ppsci INFO: train: epoch 1381 | step 10 | lr 0.000166 | loss 0.036983 | mae 0.137404 -[2024/06/24 07:11:08] ppsci INFO: train: epoch 1381 | step 20 | lr 0.000166 | loss 0.022540 | mae 0.110620 -[2024/06/24 07:11:09] ppsci INFO: train: epoch 1381 | step 30 | lr 0.000166 | loss 0.031898 | mae 0.134152 -[2024/06/24 07:11:09] ppsci INFO: train: epoch 1381 | step 38 | lr 0.000166 | loss 0.040254 | mae 0.134225 -[2024/06/24 07:11:09] ppsci INFO: epoch: 1381, train_loss: 0.031588, train_metric: 0.125864, eval_loss: 0.054344, eval_mae: 0.154301 -[2024/06/24 07:11:10] ppsci INFO: train: epoch 1382 | step 0 | lr 0.000166 | loss 0.027102 | mae 0.128797 -[2024/06/24 07:11:10] ppsci INFO: train: epoch 1382 | step 10 | lr 0.000166 | loss 0.031834 | mae 0.127559 -[2024/06/24 07:11:11] ppsci INFO: train: epoch 1382 | step 20 | lr 0.000166 | loss 0.026272 | mae 0.117748 -[2024/06/24 07:11:11] ppsci INFO: train: epoch 1382 | step 30 | lr 0.000166 | loss 0.021380 | mae 0.110927 -[2024/06/24 07:11:12] ppsci INFO: train: epoch 1382 | step 38 | lr 0.000166 | loss 0.026668 | mae 0.105340 -[2024/06/24 07:11:12] ppsci INFO: epoch: 1382, train_loss: 0.028548, train_metric: 0.122061, eval_loss: 0.049622, eval_mae: 0.147929 -[2024/06/24 07:11:12] ppsci INFO: train: epoch 1383 | step 0 | lr 0.000167 | loss 0.022836 | mae 0.117138 -[2024/06/24 07:11:12] ppsci INFO: train: epoch 1383 | step 10 | lr 0.000167 | loss 0.025911 | mae 0.113965 -[2024/06/24 07:11:13] ppsci INFO: train: epoch 1383 | step 20 | lr 0.000167 | loss 0.028195 | mae 0.124711 -[2024/06/24 07:11:13] ppsci INFO: train: epoch 1383 | step 30 | lr 0.000167 | loss 0.032888 | mae 0.137690 -[2024/06/24 07:11:14] ppsci INFO: train: epoch 1383 | step 38 | lr 0.000167 | loss 0.009150 | mae 0.080209 -[2024/06/24 07:11:14] ppsci INFO: epoch: 1383, train_loss: 0.026980, train_metric: 0.122431, eval_loss: 0.048369, eval_mae: 0.150426 -[2024/06/24 07:11:14] ppsci INFO: train: epoch 1384 | step 0 | lr 0.000168 | loss 0.025759 | mae 0.109599 -[2024/06/24 07:11:15] ppsci INFO: train: epoch 1384 | step 10 | lr 0.000168 | loss 0.019276 | mae 0.107272 -[2024/06/24 07:11:15] ppsci INFO: train: epoch 1384 | step 20 | lr 0.000168 | loss 0.026298 | mae 0.117393 -[2024/06/24 07:11:16] ppsci INFO: train: epoch 1384 | step 30 | lr 0.000168 | loss 0.019042 | mae 0.104842 -[2024/06/24 07:11:16] ppsci INFO: train: epoch 1384 | step 38 | lr 0.000168 | loss 0.075810 | mae 0.211622 -[2024/06/24 07:11:16] ppsci INFO: epoch: 1384, train_loss: 0.028763, train_metric: 0.121964, eval_loss: 0.055501, eval_mae: 0.154033 -[2024/06/24 07:11:16] ppsci INFO: train: epoch 1385 | step 0 | lr 0.000168 | loss 0.023468 | mae 0.120389 -[2024/06/24 07:11:17] ppsci INFO: train: epoch 1385 | step 10 | lr 0.000168 | loss 0.034825 | mae 0.135244 -[2024/06/24 07:11:17] ppsci INFO: train: epoch 1385 | step 20 | lr 0.000168 | loss 0.028599 | mae 0.121836 -[2024/06/24 07:11:18] ppsci INFO: train: epoch 1385 | step 30 | lr 0.000168 | loss 0.028181 | mae 0.120364 -[2024/06/24 07:11:18] ppsci INFO: train: epoch 1385 | step 38 | lr 0.000168 | loss 0.013440 | mae 0.109156 -[2024/06/24 07:11:18] ppsci INFO: epoch: 1385, train_loss: 0.026902, train_metric: 0.122243, eval_loss: 0.055278, eval_mae: 0.154583 -[2024/06/24 07:11:18] ppsci INFO: train: epoch 1386 | step 0 | lr 0.000169 | loss 0.026980 | mae 0.120452 -[2024/06/24 07:11:19] ppsci INFO: train: epoch 1386 | step 10 | lr 0.000169 | loss 0.031333 | mae 0.134428 -[2024/06/24 07:11:20] ppsci INFO: train: epoch 1386 | step 20 | lr 0.000169 | loss 0.022171 | mae 0.116866 -[2024/06/24 07:11:20] ppsci INFO: train: epoch 1386 | step 30 | lr 0.000169 | loss 0.025309 | mae 0.121558 -[2024/06/24 07:11:20] ppsci INFO: train: epoch 1386 | step 38 | lr 0.000169 | loss 0.016016 | mae 0.103433 -[2024/06/24 07:11:21] ppsci INFO: epoch: 1386, train_loss: 0.026866, train_metric: 0.121565, eval_loss: 0.050726, eval_mae: 0.151014 -[2024/06/24 07:11:21] ppsci INFO: train: epoch 1387 | step 0 | lr 0.000170 | loss 0.065139 | mae 0.136132 -[2024/06/24 07:11:21] ppsci INFO: train: epoch 1387 | step 10 | lr 0.000170 | loss 0.027534 | mae 0.125687 -[2024/06/24 07:11:22] ppsci INFO: train: epoch 1387 | step 20 | lr 0.000170 | loss 0.019497 | mae 0.113592 -[2024/06/24 07:11:22] ppsci INFO: train: epoch 1387 | step 30 | lr 0.000170 | loss 0.019593 | mae 0.111889 -[2024/06/24 07:11:23] ppsci INFO: train: epoch 1387 | step 38 | lr 0.000170 | loss 0.015806 | mae 0.104953 -[2024/06/24 07:11:23] ppsci INFO: epoch: 1387, train_loss: 0.027925, train_metric: 0.121040, eval_loss: 0.050726, eval_mae: 0.150041 -[2024/06/24 07:11:23] ppsci INFO: train: epoch 1388 | step 0 | lr 0.000171 | loss 0.037639 | mae 0.139086 -[2024/06/24 07:11:23] ppsci INFO: train: epoch 1388 | step 10 | lr 0.000171 | loss 0.024966 | mae 0.116359 -[2024/06/24 07:11:24] ppsci INFO: train: epoch 1388 | step 20 | lr 0.000171 | loss 0.030540 | mae 0.129268 -[2024/06/24 07:11:24] ppsci INFO: train: epoch 1388 | step 30 | lr 0.000171 | loss 0.029384 | mae 0.125381 -[2024/06/24 07:11:25] ppsci INFO: train: epoch 1388 | step 38 | lr 0.000171 | loss 0.027878 | mae 0.122097 -[2024/06/24 07:11:25] ppsci INFO: epoch: 1388, train_loss: 0.027251, train_metric: 0.122221, eval_loss: 0.049890, eval_mae: 0.151819 -[2024/06/24 07:11:25] ppsci INFO: train: epoch 1389 | step 0 | lr 0.000171 | loss 0.024815 | mae 0.116823 -[2024/06/24 07:11:26] ppsci INFO: train: epoch 1389 | step 10 | lr 0.000171 | loss 0.031055 | mae 0.135853 -[2024/06/24 07:11:26] ppsci INFO: train: epoch 1389 | step 20 | lr 0.000171 | loss 0.035764 | mae 0.134000 -[2024/06/24 07:11:27] ppsci INFO: train: epoch 1389 | step 30 | lr 0.000171 | loss 0.027523 | mae 0.124330 -[2024/06/24 07:11:27] ppsci INFO: train: epoch 1389 | step 38 | lr 0.000171 | loss 0.015634 | mae 0.083643 -[2024/06/24 07:11:27] ppsci INFO: epoch: 1389, train_loss: 0.027286, train_metric: 0.122791, eval_loss: 0.048927, eval_mae: 0.150014 -[2024/06/24 07:11:27] ppsci INFO: train: epoch 1390 | step 0 | lr 0.000172 | loss 0.021519 | mae 0.118202 -[2024/06/24 07:11:28] ppsci INFO: train: epoch 1390 | step 10 | lr 0.000172 | loss 0.025725 | mae 0.117791 -[2024/06/24 07:11:28] ppsci INFO: train: epoch 1390 | step 20 | lr 0.000172 | loss 0.033681 | mae 0.124838 -[2024/06/24 07:11:29] ppsci INFO: train: epoch 1390 | step 30 | lr 0.000172 | loss 0.016771 | mae 0.098440 -[2024/06/24 07:11:29] ppsci INFO: train: epoch 1390 | step 38 | lr 0.000172 | loss 0.019294 | mae 0.107576 -[2024/06/24 07:11:29] ppsci INFO: epoch: 1390, train_loss: 0.026905, train_metric: 0.120442, eval_loss: 0.049986, eval_mae: 0.150763 -[2024/06/24 07:11:29] ppsci INFO: train: epoch 1391 | step 0 | lr 0.000173 | loss 0.025967 | mae 0.121723 -[2024/06/24 07:11:30] ppsci INFO: train: epoch 1391 | step 10 | lr 0.000173 | loss 0.023739 | mae 0.115221 -[2024/06/24 07:11:30] ppsci INFO: train: epoch 1391 | step 20 | lr 0.000173 | loss 0.031347 | mae 0.128176 -[2024/06/24 07:11:31] ppsci INFO: train: epoch 1391 | step 30 | lr 0.000173 | loss 0.028392 | mae 0.120262 -[2024/06/24 07:11:31] ppsci INFO: train: epoch 1391 | step 38 | lr 0.000173 | loss 0.047280 | mae 0.174654 -[2024/06/24 07:11:31] ppsci INFO: epoch: 1391, train_loss: 0.027191, train_metric: 0.121542, eval_loss: 0.051397, eval_mae: 0.151757 -[2024/06/24 07:11:32] ppsci INFO: train: epoch 1392 | step 0 | lr 0.000173 | loss 0.028472 | mae 0.126883 -[2024/06/24 07:11:32] ppsci INFO: train: epoch 1392 | step 10 | lr 0.000173 | loss 0.024003 | mae 0.122093 -[2024/06/24 07:11:33] ppsci INFO: train: epoch 1392 | step 20 | lr 0.000173 | loss 0.023633 | mae 0.111613 -[2024/06/24 07:11:33] ppsci INFO: train: epoch 1392 | step 30 | lr 0.000173 | loss 0.026036 | mae 0.125896 -[2024/06/24 07:11:34] ppsci INFO: train: epoch 1392 | step 38 | lr 0.000173 | loss 0.025115 | mae 0.138473 -[2024/06/24 07:11:34] ppsci INFO: epoch: 1392, train_loss: 0.024846, train_metric: 0.116330, eval_loss: 0.053320, eval_mae: 0.152031 -[2024/06/24 07:11:34] ppsci INFO: train: epoch 1393 | step 0 | lr 0.000174 | loss 0.034092 | mae 0.133685 -[2024/06/24 07:11:34] ppsci INFO: train: epoch 1393 | step 10 | lr 0.000174 | loss 0.026753 | mae 0.122830 -[2024/06/24 07:11:35] ppsci INFO: train: epoch 1393 | step 20 | lr 0.000174 | loss 0.027588 | mae 0.125454 -[2024/06/24 07:11:36] ppsci INFO: train: epoch 1393 | step 30 | lr 0.000174 | loss 0.028057 | mae 0.122125 -[2024/06/24 07:11:36] ppsci INFO: train: epoch 1393 | step 38 | lr 0.000174 | loss 0.029420 | mae 0.131598 -[2024/06/24 07:11:36] ppsci INFO: epoch: 1393, train_loss: 0.026847, train_metric: 0.120618, eval_loss: 0.052537, eval_mae: 0.151179 -[2024/06/24 07:11:36] ppsci INFO: train: epoch 1394 | step 0 | lr 0.000175 | loss 0.019956 | mae 0.108567 -[2024/06/24 07:11:37] ppsci INFO: train: epoch 1394 | step 10 | lr 0.000175 | loss 0.025692 | mae 0.115386 -[2024/06/24 07:11:37] ppsci INFO: train: epoch 1394 | step 20 | lr 0.000175 | loss 0.029508 | mae 0.117240 -[2024/06/24 07:11:38] ppsci INFO: train: epoch 1394 | step 30 | lr 0.000175 | loss 0.027926 | mae 0.123879 -[2024/06/24 07:11:38] ppsci INFO: train: epoch 1394 | step 38 | lr 0.000175 | loss 0.027386 | mae 0.147891 -[2024/06/24 07:11:38] ppsci INFO: epoch: 1394, train_loss: 0.027152, train_metric: 0.123028, eval_loss: 0.045072, eval_mae: 0.144614 -[2024/06/24 07:11:38] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:11:38] ppsci INFO: train: epoch 1395 | step 0 | lr 0.000176 | loss 0.023226 | mae 0.119634 -[2024/06/24 07:11:39] ppsci INFO: train: epoch 1395 | step 10 | lr 0.000176 | loss 0.028700 | mae 0.131028 -[2024/06/24 07:11:39] ppsci INFO: train: epoch 1395 | step 20 | lr 0.000176 | loss 0.022055 | mae 0.117562 -[2024/06/24 07:11:40] ppsci INFO: train: epoch 1395 | step 30 | lr 0.000176 | loss 0.029912 | mae 0.126092 -[2024/06/24 07:11:40] ppsci INFO: train: epoch 1395 | step 38 | lr 0.000176 | loss 0.026195 | mae 0.114084 -[2024/06/24 07:11:40] ppsci INFO: epoch: 1395, train_loss: 0.028117, train_metric: 0.123555, eval_loss: 0.051461, eval_mae: 0.147092 -[2024/06/24 07:11:40] ppsci INFO: train: epoch 1396 | step 0 | lr 0.000176 | loss 0.024363 | mae 0.113574 -[2024/06/24 07:11:41] ppsci INFO: train: epoch 1396 | step 10 | lr 0.000176 | loss 0.027625 | mae 0.125941 -[2024/06/24 07:11:41] ppsci INFO: train: epoch 1396 | step 20 | lr 0.000176 | loss 0.029961 | mae 0.118707 -[2024/06/24 07:11:42] ppsci INFO: train: epoch 1396 | step 30 | lr 0.000176 | loss 0.027898 | mae 0.124128 -[2024/06/24 07:11:42] ppsci INFO: train: epoch 1396 | step 38 | lr 0.000176 | loss 0.022390 | mae 0.126044 -[2024/06/24 07:11:42] ppsci INFO: epoch: 1396, train_loss: 0.026727, train_metric: 0.122335, eval_loss: 0.053131, eval_mae: 0.151517 -[2024/06/24 07:11:42] ppsci INFO: train: epoch 1397 | step 0 | lr 0.000177 | loss 0.026012 | mae 0.116004 -[2024/06/24 07:11:43] ppsci INFO: train: epoch 1397 | step 10 | lr 0.000177 | loss 0.023014 | mae 0.109950 -[2024/06/24 07:11:44] ppsci INFO: train: epoch 1397 | step 20 | lr 0.000177 | loss 0.023725 | mae 0.107402 -[2024/06/24 07:11:44] ppsci INFO: train: epoch 1397 | step 30 | lr 0.000177 | loss 0.026851 | mae 0.123328 -[2024/06/24 07:11:44] ppsci INFO: train: epoch 1397 | step 38 | lr 0.000177 | loss 0.054565 | mae 0.163925 -[2024/06/24 07:11:44] ppsci INFO: epoch: 1397, train_loss: 0.026371, train_metric: 0.119563, eval_loss: 0.052877, eval_mae: 0.153136 -[2024/06/24 07:11:45] ppsci INFO: train: epoch 1398 | step 0 | lr 0.000178 | loss 0.020016 | mae 0.108495 -[2024/06/24 07:11:45] ppsci INFO: train: epoch 1398 | step 10 | lr 0.000178 | loss 0.033096 | mae 0.139439 -[2024/06/24 07:11:46] ppsci INFO: train: epoch 1398 | step 20 | lr 0.000178 | loss 0.021490 | mae 0.116674 -[2024/06/24 07:11:46] ppsci INFO: train: epoch 1398 | step 30 | lr 0.000178 | loss 0.021981 | mae 0.111247 -[2024/06/24 07:11:47] ppsci INFO: train: epoch 1398 | step 38 | lr 0.000178 | loss 0.008841 | mae 0.072572 -[2024/06/24 07:11:47] ppsci INFO: epoch: 1398, train_loss: 0.027531, train_metric: 0.123683, eval_loss: 0.048290, eval_mae: 0.147725 -[2024/06/24 07:11:47] ppsci INFO: train: epoch 1399 | step 0 | lr 0.000179 | loss 0.030853 | mae 0.131211 -[2024/06/24 07:11:47] ppsci INFO: train: epoch 1399 | step 10 | lr 0.000179 | loss 0.022785 | mae 0.110832 -[2024/06/24 07:11:48] ppsci INFO: train: epoch 1399 | step 20 | lr 0.000179 | loss 0.020951 | mae 0.113309 -[2024/06/24 07:11:48] ppsci INFO: train: epoch 1399 | step 30 | lr 0.000179 | loss 0.025902 | mae 0.124404 -[2024/06/24 07:11:49] ppsci INFO: train: epoch 1399 | step 38 | lr 0.000179 | loss 0.084471 | mae 0.188387 -[2024/06/24 07:11:49] ppsci INFO: epoch: 1399, train_loss: 0.028255, train_metric: 0.122121, eval_loss: 0.050692, eval_mae: 0.151150 -[2024/06/24 07:11:49] ppsci INFO: train: epoch 1400 | step 0 | lr 0.000179 | loss 0.027760 | mae 0.126467 -[2024/06/24 07:11:49] ppsci INFO: train: epoch 1400 | step 10 | lr 0.000179 | loss 0.029779 | mae 0.128859 -[2024/06/24 07:11:50] ppsci INFO: train: epoch 1400 | step 20 | lr 0.000179 | loss 0.019031 | mae 0.107448 -[2024/06/24 07:11:50] ppsci INFO: train: epoch 1400 | step 30 | lr 0.000179 | loss 0.030289 | mae 0.136220 -[2024/06/24 07:11:51] ppsci INFO: train: epoch 1400 | step 38 | lr 0.000179 | loss 0.033575 | mae 0.146657 -[2024/06/24 07:11:51] ppsci INFO: epoch: 1400, train_loss: 0.027449, train_metric: 0.121412, eval_loss: 0.049439, eval_mae: 0.150534 -[2024/06/24 07:11:51] ppsci INFO: train: epoch 1401 | step 0 | lr 0.000180 | loss 0.023225 | mae 0.113583 -[2024/06/24 07:11:52] ppsci INFO: train: epoch 1401 | step 10 | lr 0.000180 | loss 0.026432 | mae 0.118971 -[2024/06/24 07:11:52] ppsci INFO: train: epoch 1401 | step 20 | lr 0.000180 | loss 0.026454 | mae 0.114072 -[2024/06/24 07:11:53] ppsci INFO: train: epoch 1401 | step 30 | lr 0.000180 | loss 0.023666 | mae 0.119504 -[2024/06/24 07:11:53] ppsci INFO: train: epoch 1401 | step 38 | lr 0.000180 | loss 0.014007 | mae 0.091963 -[2024/06/24 07:11:53] ppsci INFO: epoch: 1401, train_loss: 0.025091, train_metric: 0.118690, eval_loss: 0.050986, eval_mae: 0.151653 -[2024/06/24 07:11:53] ppsci INFO: train: epoch 1402 | step 0 | lr 0.000181 | loss 0.030801 | mae 0.136222 -[2024/06/24 07:11:54] ppsci INFO: train: epoch 1402 | step 10 | lr 0.000181 | loss 0.023314 | mae 0.116029 -[2024/06/24 07:11:54] ppsci INFO: train: epoch 1402 | step 20 | lr 0.000181 | loss 0.026414 | mae 0.121827 -[2024/06/24 07:11:55] ppsci INFO: train: epoch 1402 | step 30 | lr 0.000181 | loss 0.029537 | mae 0.126615 -[2024/06/24 07:11:55] ppsci INFO: train: epoch 1402 | step 38 | lr 0.000181 | loss 0.017793 | mae 0.110131 -[2024/06/24 07:11:55] ppsci INFO: epoch: 1402, train_loss: 0.026351, train_metric: 0.120709, eval_loss: 0.049174, eval_mae: 0.148899 -[2024/06/24 07:11:55] ppsci INFO: train: epoch 1403 | step 0 | lr 0.000181 | loss 0.020057 | mae 0.107132 -[2024/06/24 07:11:56] ppsci INFO: train: epoch 1403 | step 10 | lr 0.000181 | loss 0.027577 | mae 0.128184 -[2024/06/24 07:11:56] ppsci INFO: train: epoch 1403 | step 20 | lr 0.000181 | loss 0.021668 | mae 0.110621 -[2024/06/24 07:11:57] ppsci INFO: train: epoch 1403 | step 30 | lr 0.000181 | loss 0.026049 | mae 0.121691 -[2024/06/24 07:11:57] ppsci INFO: train: epoch 1403 | step 38 | lr 0.000181 | loss 0.298108 | mae 0.258641 -[2024/06/24 07:11:57] ppsci INFO: epoch: 1403, train_loss: 0.033481, train_metric: 0.121702, eval_loss: 0.054797, eval_mae: 0.152396 -[2024/06/24 07:11:57] ppsci INFO: train: epoch 1404 | step 0 | lr 0.000182 | loss 0.019981 | mae 0.112056 -[2024/06/24 07:11:58] ppsci INFO: train: epoch 1404 | step 10 | lr 0.000182 | loss 0.023893 | mae 0.119074 -[2024/06/24 07:11:58] ppsci INFO: train: epoch 1404 | step 20 | lr 0.000182 | loss 0.020744 | mae 0.110130 -[2024/06/24 07:11:59] ppsci INFO: train: epoch 1404 | step 30 | lr 0.000182 | loss 0.031244 | mae 0.123226 -[2024/06/24 07:11:59] ppsci INFO: train: epoch 1404 | step 38 | lr 0.000182 | loss 0.029324 | mae 0.148811 -[2024/06/24 07:11:59] ppsci INFO: epoch: 1404, train_loss: 0.025495, train_metric: 0.118200, eval_loss: 0.052081, eval_mae: 0.151438 -[2024/06/24 07:11:59] ppsci INFO: train: epoch 1405 | step 0 | lr 0.000183 | loss 0.034143 | mae 0.136355 -[2024/06/24 07:12:00] ppsci INFO: train: epoch 1405 | step 10 | lr 0.000183 | loss 0.024941 | mae 0.119925 -[2024/06/24 07:12:00] ppsci INFO: train: epoch 1405 | step 20 | lr 0.000183 | loss 0.022448 | mae 0.107582 -[2024/06/24 07:12:01] ppsci INFO: train: epoch 1405 | step 30 | lr 0.000183 | loss 0.021414 | mae 0.112039 -[2024/06/24 07:12:01] ppsci INFO: train: epoch 1405 | step 38 | lr 0.000183 | loss 0.040310 | mae 0.149211 -[2024/06/24 07:12:01] ppsci INFO: epoch: 1405, train_loss: 0.027873, train_metric: 0.122860, eval_loss: 0.049375, eval_mae: 0.150770 -[2024/06/24 07:12:02] ppsci INFO: train: epoch 1406 | step 0 | lr 0.000184 | loss 0.023273 | mae 0.110439 -[2024/06/24 07:12:02] ppsci INFO: train: epoch 1406 | step 10 | lr 0.000184 | loss 0.037053 | mae 0.139131 -[2024/06/24 07:12:03] ppsci INFO: train: epoch 1406 | step 20 | lr 0.000184 | loss 0.023911 | mae 0.115586 -[2024/06/24 07:12:03] ppsci INFO: train: epoch 1406 | step 30 | lr 0.000184 | loss 0.035737 | mae 0.126178 -[2024/06/24 07:12:04] ppsci INFO: train: epoch 1406 | step 38 | lr 0.000184 | loss 0.019927 | mae 0.120355 -[2024/06/24 07:12:04] ppsci INFO: epoch: 1406, train_loss: 0.027704, train_metric: 0.122335, eval_loss: 0.051466, eval_mae: 0.152582 -[2024/06/24 07:12:04] ppsci INFO: train: epoch 1407 | step 0 | lr 0.000184 | loss 0.022046 | mae 0.113981 -[2024/06/24 07:12:04] ppsci INFO: train: epoch 1407 | step 10 | lr 0.000184 | loss 0.020392 | mae 0.109906 -[2024/06/24 07:12:05] ppsci INFO: train: epoch 1407 | step 20 | lr 0.000184 | loss 0.020572 | mae 0.109622 -[2024/06/24 07:12:05] ppsci INFO: train: epoch 1407 | step 30 | lr 0.000184 | loss 0.023106 | mae 0.120025 -[2024/06/24 07:12:06] ppsci INFO: train: epoch 1407 | step 38 | lr 0.000184 | loss 0.005715 | mae 0.063345 -[2024/06/24 07:12:06] ppsci INFO: epoch: 1407, train_loss: 0.026219, train_metric: 0.122504, eval_loss: 0.048082, eval_mae: 0.151830 -[2024/06/24 07:12:06] ppsci INFO: train: epoch 1408 | step 0 | lr 0.000185 | loss 0.025347 | mae 0.125006 -[2024/06/24 07:12:06] ppsci INFO: train: epoch 1408 | step 10 | lr 0.000185 | loss 0.030395 | mae 0.125843 -[2024/06/24 07:12:07] ppsci INFO: train: epoch 1408 | step 20 | lr 0.000185 | loss 0.034087 | mae 0.130978 -[2024/06/24 07:12:07] ppsci INFO: train: epoch 1408 | step 30 | lr 0.000185 | loss 0.030081 | mae 0.128216 -[2024/06/24 07:12:08] ppsci INFO: train: epoch 1408 | step 38 | lr 0.000185 | loss 0.007017 | mae 0.069441 -[2024/06/24 07:12:08] ppsci INFO: epoch: 1408, train_loss: 0.027490, train_metric: 0.123261, eval_loss: 0.048762, eval_mae: 0.151264 -[2024/06/24 07:12:08] ppsci INFO: train: epoch 1409 | step 0 | lr 0.000186 | loss 0.027156 | mae 0.125185 -[2024/06/24 07:12:09] ppsci INFO: train: epoch 1409 | step 10 | lr 0.000186 | loss 0.023730 | mae 0.097321 -[2024/06/24 07:12:09] ppsci INFO: train: epoch 1409 | step 20 | lr 0.000186 | loss 0.024737 | mae 0.116935 -[2024/06/24 07:12:10] ppsci INFO: train: epoch 1409 | step 30 | lr 0.000186 | loss 0.022135 | mae 0.103217 -[2024/06/24 07:12:10] ppsci INFO: train: epoch 1409 | step 38 | lr 0.000186 | loss 0.058351 | mae 0.192780 -[2024/06/24 07:12:10] ppsci INFO: epoch: 1409, train_loss: 0.028724, train_metric: 0.122022, eval_loss: 0.047772, eval_mae: 0.149327 -[2024/06/24 07:12:10] ppsci INFO: train: epoch 1410 | step 0 | lr 0.000187 | loss 0.025468 | mae 0.124365 -[2024/06/24 07:12:11] ppsci INFO: train: epoch 1410 | step 10 | lr 0.000187 | loss 0.032235 | mae 0.134706 -[2024/06/24 07:12:11] ppsci INFO: train: epoch 1410 | step 20 | lr 0.000187 | loss 0.026094 | mae 0.122414 -[2024/06/24 07:12:12] ppsci INFO: train: epoch 1410 | step 30 | lr 0.000187 | loss 0.023394 | mae 0.116791 -[2024/06/24 07:12:12] ppsci INFO: train: epoch 1410 | step 38 | lr 0.000187 | loss 0.009977 | mae 0.080023 -[2024/06/24 07:12:12] ppsci INFO: epoch: 1410, train_loss: 0.026611, train_metric: 0.121383, eval_loss: 0.049290, eval_mae: 0.150957 -[2024/06/24 07:12:12] ppsci INFO: train: epoch 1411 | step 0 | lr 0.000187 | loss 0.026374 | mae 0.126876 -[2024/06/24 07:12:13] ppsci INFO: train: epoch 1411 | step 10 | lr 0.000187 | loss 0.027148 | mae 0.119418 -[2024/06/24 07:12:14] ppsci INFO: train: epoch 1411 | step 20 | lr 0.000187 | loss 0.027562 | mae 0.126300 -[2024/06/24 07:12:14] ppsci INFO: train: epoch 1411 | step 30 | lr 0.000187 | loss 0.023897 | mae 0.116595 -[2024/06/24 07:12:14] ppsci INFO: train: epoch 1411 | step 38 | lr 0.000187 | loss 0.047881 | mae 0.164279 -[2024/06/24 07:12:15] ppsci INFO: epoch: 1411, train_loss: 0.025727, train_metric: 0.117019, eval_loss: 0.051874, eval_mae: 0.152657 -[2024/06/24 07:12:15] ppsci INFO: train: epoch 1412 | step 0 | lr 0.000188 | loss 0.018217 | mae 0.101393 -[2024/06/24 07:12:15] ppsci INFO: train: epoch 1412 | step 10 | lr 0.000188 | loss 0.036411 | mae 0.138374 -[2024/06/24 07:12:16] ppsci INFO: train: epoch 1412 | step 20 | lr 0.000188 | loss 0.023941 | mae 0.111873 -[2024/06/24 07:12:16] ppsci INFO: train: epoch 1412 | step 30 | lr 0.000188 | loss 0.029219 | mae 0.125154 -[2024/06/24 07:12:17] ppsci INFO: train: epoch 1412 | step 38 | lr 0.000188 | loss 0.019376 | mae 0.124194 -[2024/06/24 07:12:17] ppsci INFO: epoch: 1412, train_loss: 0.026425, train_metric: 0.118917, eval_loss: 0.053636, eval_mae: 0.152469 -[2024/06/24 07:12:17] ppsci INFO: train: epoch 1413 | step 0 | lr 0.000189 | loss 0.017857 | mae 0.104437 -[2024/06/24 07:12:18] ppsci INFO: train: epoch 1413 | step 10 | lr 0.000189 | loss 0.031127 | mae 0.126739 -[2024/06/24 07:12:18] ppsci INFO: train: epoch 1413 | step 20 | lr 0.000189 | loss 0.021912 | mae 0.109943 -[2024/06/24 07:12:19] ppsci INFO: train: epoch 1413 | step 30 | lr 0.000189 | loss 0.024522 | mae 0.114979 -[2024/06/24 07:12:19] ppsci INFO: train: epoch 1413 | step 38 | lr 0.000189 | loss 0.015840 | mae 0.103633 -[2024/06/24 07:12:19] ppsci INFO: epoch: 1413, train_loss: 0.026074, train_metric: 0.119465, eval_loss: 0.050793, eval_mae: 0.145702 -[2024/06/24 07:12:19] ppsci INFO: train: epoch 1414 | step 0 | lr 0.000190 | loss 0.018792 | mae 0.111406 -[2024/06/24 07:12:20] ppsci INFO: train: epoch 1414 | step 10 | lr 0.000190 | loss 0.031712 | mae 0.121291 -[2024/06/24 07:12:20] ppsci INFO: train: epoch 1414 | step 20 | lr 0.000190 | loss 0.034962 | mae 0.141057 -[2024/06/24 07:12:21] ppsci INFO: train: epoch 1414 | step 30 | lr 0.000190 | loss 0.024005 | mae 0.113415 -[2024/06/24 07:12:21] ppsci INFO: train: epoch 1414 | step 38 | lr 0.000190 | loss 0.040574 | mae 0.146988 -[2024/06/24 07:12:21] ppsci INFO: epoch: 1414, train_loss: 0.027391, train_metric: 0.122402, eval_loss: 0.052177, eval_mae: 0.150897 -[2024/06/24 07:12:21] ppsci INFO: train: epoch 1415 | step 0 | lr 0.000190 | loss 0.028632 | mae 0.128893 -[2024/06/24 07:12:22] ppsci INFO: train: epoch 1415 | step 10 | lr 0.000190 | loss 0.026585 | mae 0.123708 -[2024/06/24 07:12:22] ppsci INFO: train: epoch 1415 | step 20 | lr 0.000190 | loss 0.024499 | mae 0.118627 -[2024/06/24 07:12:23] ppsci INFO: train: epoch 1415 | step 30 | lr 0.000190 | loss 0.038095 | mae 0.135464 -[2024/06/24 07:12:23] ppsci INFO: train: epoch 1415 | step 38 | lr 0.000190 | loss 0.030172 | mae 0.156226 -[2024/06/24 07:12:23] ppsci INFO: epoch: 1415, train_loss: 0.027511, train_metric: 0.120634, eval_loss: 0.052588, eval_mae: 0.147624 -[2024/06/24 07:12:24] ppsci INFO: train: epoch 1416 | step 0 | lr 0.000191 | loss 0.032640 | mae 0.126846 -[2024/06/24 07:12:24] ppsci INFO: train: epoch 1416 | step 10 | lr 0.000191 | loss 0.019347 | mae 0.101582 -[2024/06/24 07:12:25] ppsci INFO: train: epoch 1416 | step 20 | lr 0.000191 | loss 0.025819 | mae 0.114053 -[2024/06/24 07:12:25] ppsci INFO: train: epoch 1416 | step 30 | lr 0.000191 | loss 0.028107 | mae 0.128481 -[2024/06/24 07:12:26] ppsci INFO: train: epoch 1416 | step 38 | lr 0.000191 | loss 0.035840 | mae 0.158953 -[2024/06/24 07:12:26] ppsci INFO: epoch: 1416, train_loss: 0.025951, train_metric: 0.118847, eval_loss: 0.051830, eval_mae: 0.149402 -[2024/06/24 07:12:26] ppsci INFO: train: epoch 1417 | step 0 | lr 0.000192 | loss 0.030321 | mae 0.134635 -[2024/06/24 07:12:26] ppsci INFO: train: epoch 1417 | step 10 | lr 0.000192 | loss 0.027343 | mae 0.119179 -[2024/06/24 07:12:27] ppsci INFO: train: epoch 1417 | step 20 | lr 0.000192 | loss 0.037535 | mae 0.140488 -[2024/06/24 07:12:27] ppsci INFO: train: epoch 1417 | step 30 | lr 0.000192 | loss 0.025491 | mae 0.120153 -[2024/06/24 07:12:28] ppsci INFO: train: epoch 1417 | step 38 | lr 0.000192 | loss 0.041050 | mae 0.131642 -[2024/06/24 07:12:28] ppsci INFO: epoch: 1417, train_loss: 0.029033, train_metric: 0.124488, eval_loss: 0.048947, eval_mae: 0.146239 -[2024/06/24 07:12:28] ppsci INFO: train: epoch 1418 | step 0 | lr 0.000193 | loss 0.027966 | mae 0.123198 -[2024/06/24 07:12:28] ppsci INFO: train: epoch 1418 | step 10 | lr 0.000193 | loss 0.025240 | mae 0.120849 -[2024/06/24 07:12:29] ppsci INFO: train: epoch 1418 | step 20 | lr 0.000193 | loss 0.022806 | mae 0.117425 -[2024/06/24 07:12:29] ppsci INFO: train: epoch 1418 | step 30 | lr 0.000193 | loss 0.020869 | mae 0.111783 -[2024/06/24 07:12:30] ppsci INFO: train: epoch 1418 | step 38 | lr 0.000193 | loss 0.020844 | mae 0.112218 -[2024/06/24 07:12:30] ppsci INFO: epoch: 1418, train_loss: 0.026214, train_metric: 0.120077, eval_loss: 0.050076, eval_mae: 0.148731 -[2024/06/24 07:12:30] ppsci INFO: train: epoch 1419 | step 0 | lr 0.000193 | loss 0.023677 | mae 0.113255 -[2024/06/24 07:12:30] ppsci INFO: train: epoch 1419 | step 10 | lr 0.000193 | loss 0.021203 | mae 0.112276 -[2024/06/24 07:12:31] ppsci INFO: train: epoch 1419 | step 20 | lr 0.000193 | loss 0.021378 | mae 0.107222 -[2024/06/24 07:12:31] ppsci INFO: train: epoch 1419 | step 30 | lr 0.000193 | loss 0.043383 | mae 0.141801 -[2024/06/24 07:12:32] ppsci INFO: train: epoch 1419 | step 38 | lr 0.000193 | loss 0.021987 | mae 0.110002 -[2024/06/24 07:12:32] ppsci INFO: epoch: 1419, train_loss: 0.027819, train_metric: 0.122556, eval_loss: 0.054650, eval_mae: 0.151148 -[2024/06/24 07:12:32] ppsci INFO: train: epoch 1420 | step 0 | lr 0.000194 | loss 0.032208 | mae 0.137312 -[2024/06/24 07:12:32] ppsci INFO: train: epoch 1420 | step 10 | lr 0.000194 | loss 0.023469 | mae 0.113033 -[2024/06/24 07:12:33] ppsci INFO: train: epoch 1420 | step 20 | lr 0.000194 | loss 0.022125 | mae 0.113787 -[2024/06/24 07:12:34] ppsci INFO: train: epoch 1420 | step 30 | lr 0.000194 | loss 0.023748 | mae 0.117413 -[2024/06/24 07:12:34] ppsci INFO: train: epoch 1420 | step 38 | lr 0.000194 | loss 0.022074 | mae 0.119186 -[2024/06/24 07:12:34] ppsci INFO: epoch: 1420, train_loss: 0.027245, train_metric: 0.123354, eval_loss: 0.050396, eval_mae: 0.149716 -[2024/06/24 07:12:34] ppsci INFO: train: epoch 1421 | step 0 | lr 0.000195 | loss 0.037764 | mae 0.127731 -[2024/06/24 07:12:35] ppsci INFO: train: epoch 1421 | step 10 | lr 0.000195 | loss 0.035247 | mae 0.139400 -[2024/06/24 07:12:35] ppsci INFO: train: epoch 1421 | step 20 | lr 0.000195 | loss 0.026435 | mae 0.117295 -[2024/06/24 07:12:36] ppsci INFO: train: epoch 1421 | step 30 | lr 0.000195 | loss 0.024422 | mae 0.111437 -[2024/06/24 07:12:36] ppsci INFO: train: epoch 1421 | step 38 | lr 0.000195 | loss 0.065643 | mae 0.204573 -[2024/06/24 07:12:36] ppsci INFO: epoch: 1421, train_loss: 0.028447, train_metric: 0.123101, eval_loss: 0.049406, eval_mae: 0.150192 -[2024/06/24 07:12:36] ppsci INFO: train: epoch 1422 | step 0 | lr 0.000196 | loss 0.021509 | mae 0.108855 -[2024/06/24 07:12:37] ppsci INFO: train: epoch 1422 | step 10 | lr 0.000196 | loss 0.038067 | mae 0.143420 -[2024/06/24 07:12:37] ppsci INFO: train: epoch 1422 | step 20 | lr 0.000196 | loss 0.024049 | mae 0.113350 -[2024/06/24 07:12:38] ppsci INFO: train: epoch 1422 | step 30 | lr 0.000196 | loss 0.026535 | mae 0.122211 -[2024/06/24 07:12:38] ppsci INFO: train: epoch 1422 | step 38 | lr 0.000196 | loss 0.023057 | mae 0.113772 -[2024/06/24 07:12:38] ppsci INFO: epoch: 1422, train_loss: 0.027706, train_metric: 0.119904, eval_loss: 0.049535, eval_mae: 0.155178 -[2024/06/24 07:12:39] ppsci INFO: train: epoch 1423 | step 0 | lr 0.000196 | loss 0.025211 | mae 0.125651 -[2024/06/24 07:12:39] ppsci INFO: train: epoch 1423 | step 10 | lr 0.000196 | loss 0.024826 | mae 0.118547 -[2024/06/24 07:12:40] ppsci INFO: train: epoch 1423 | step 20 | lr 0.000196 | loss 0.029529 | mae 0.122824 -[2024/06/24 07:12:40] ppsci INFO: train: epoch 1423 | step 30 | lr 0.000196 | loss 0.020502 | mae 0.106723 -[2024/06/24 07:12:40] ppsci INFO: train: epoch 1423 | step 38 | lr 0.000196 | loss 0.031456 | mae 0.139785 -[2024/06/24 07:12:41] ppsci INFO: epoch: 1423, train_loss: 0.027615, train_metric: 0.122067, eval_loss: 0.052722, eval_mae: 0.154357 -[2024/06/24 07:12:41] ppsci INFO: train: epoch 1424 | step 0 | lr 0.000197 | loss 0.023608 | mae 0.117380 -[2024/06/24 07:12:41] ppsci INFO: train: epoch 1424 | step 10 | lr 0.000197 | loss 0.025043 | mae 0.125798 -[2024/06/24 07:12:42] ppsci INFO: train: epoch 1424 | step 20 | lr 0.000197 | loss 0.024231 | mae 0.108895 -[2024/06/24 07:12:42] ppsci INFO: train: epoch 1424 | step 30 | lr 0.000197 | loss 0.014594 | mae 0.093876 -[2024/06/24 07:12:43] ppsci INFO: train: epoch 1424 | step 38 | lr 0.000197 | loss 0.017763 | mae 0.100528 -[2024/06/24 07:12:43] ppsci INFO: epoch: 1424, train_loss: 0.026515, train_metric: 0.121999, eval_loss: 0.049009, eval_mae: 0.146904 -[2024/06/24 07:12:43] ppsci INFO: train: epoch 1425 | step 0 | lr 0.000198 | loss 0.026060 | mae 0.120335 -[2024/06/24 07:12:43] ppsci INFO: train: epoch 1425 | step 10 | lr 0.000198 | loss 0.023608 | mae 0.119833 -[2024/06/24 07:12:44] ppsci INFO: train: epoch 1425 | step 20 | lr 0.000198 | loss 0.018814 | mae 0.105502 -[2024/06/24 07:12:44] ppsci INFO: train: epoch 1425 | step 30 | lr 0.000198 | loss 0.028124 | mae 0.122214 -[2024/06/24 07:12:45] ppsci INFO: train: epoch 1425 | step 38 | lr 0.000198 | loss 0.011080 | mae 0.090394 -[2024/06/24 07:12:45] ppsci INFO: epoch: 1425, train_loss: 0.025962, train_metric: 0.119766, eval_loss: 0.049776, eval_mae: 0.148865 -[2024/06/24 07:12:45] ppsci INFO: train: epoch 1426 | step 0 | lr 0.000199 | loss 0.022598 | mae 0.110260 -[2024/06/24 07:12:45] ppsci INFO: train: epoch 1426 | step 10 | lr 0.000199 | loss 0.020194 | mae 0.107342 -[2024/06/24 07:12:46] ppsci INFO: train: epoch 1426 | step 20 | lr 0.000199 | loss 0.023583 | mae 0.124715 -[2024/06/24 07:12:46] ppsci INFO: train: epoch 1426 | step 30 | lr 0.000199 | loss 0.029262 | mae 0.128274 -[2024/06/24 07:12:47] ppsci INFO: train: epoch 1426 | step 38 | lr 0.000199 | loss 0.012788 | mae 0.089891 -[2024/06/24 07:12:47] ppsci INFO: epoch: 1426, train_loss: 0.025210, train_metric: 0.119223, eval_loss: 0.049781, eval_mae: 0.149886 -[2024/06/24 07:12:47] ppsci INFO: train: epoch 1427 | step 0 | lr 0.000199 | loss 0.026034 | mae 0.122919 -[2024/06/24 07:12:48] ppsci INFO: train: epoch 1427 | step 10 | lr 0.000199 | loss 0.014762 | mae 0.098631 -[2024/06/24 07:12:48] ppsci INFO: train: epoch 1427 | step 20 | lr 0.000199 | loss 0.015647 | mae 0.093901 -[2024/06/24 07:12:49] ppsci INFO: train: epoch 1427 | step 30 | lr 0.000199 | loss 0.022616 | mae 0.116228 -[2024/06/24 07:12:49] ppsci INFO: train: epoch 1427 | step 38 | lr 0.000199 | loss 0.026497 | mae 0.132786 -[2024/06/24 07:12:49] ppsci INFO: epoch: 1427, train_loss: 0.025881, train_metric: 0.119818, eval_loss: 0.049530, eval_mae: 0.147059 -[2024/06/24 07:12:49] ppsci INFO: train: epoch 1428 | step 0 | lr 0.000200 | loss 0.023955 | mae 0.116633 -[2024/06/24 07:12:50] ppsci INFO: train: epoch 1428 | step 10 | lr 0.000200 | loss 0.019500 | mae 0.107310 -[2024/06/24 07:12:50] ppsci INFO: train: epoch 1428 | step 20 | lr 0.000200 | loss 0.028271 | mae 0.133754 -[2024/06/24 07:12:51] ppsci INFO: train: epoch 1428 | step 30 | lr 0.000200 | loss 0.030488 | mae 0.121033 -[2024/06/24 07:12:51] ppsci INFO: train: epoch 1428 | step 38 | lr 0.000200 | loss 0.018690 | mae 0.114703 -[2024/06/24 07:12:51] ppsci INFO: epoch: 1428, train_loss: 0.026612, train_metric: 0.121379, eval_loss: 0.047632, eval_mae: 0.149627 -[2024/06/24 07:12:51] ppsci INFO: train: epoch 1429 | step 0 | lr 0.000201 | loss 0.020594 | mae 0.108815 -[2024/06/24 07:12:52] ppsci INFO: train: epoch 1429 | step 10 | lr 0.000201 | loss 0.023591 | mae 0.115314 -[2024/06/24 07:12:53] ppsci INFO: train: epoch 1429 | step 20 | lr 0.000201 | loss 0.022356 | mae 0.109818 -[2024/06/24 07:12:53] ppsci INFO: train: epoch 1429 | step 30 | lr 0.000201 | loss 0.021879 | mae 0.114134 -[2024/06/24 07:12:54] ppsci INFO: train: epoch 1429 | step 38 | lr 0.000201 | loss 0.024840 | mae 0.114923 -[2024/06/24 07:12:54] ppsci INFO: epoch: 1429, train_loss: 0.024597, train_metric: 0.116064, eval_loss: 0.049930, eval_mae: 0.147652 -[2024/06/24 07:12:54] ppsci INFO: train: epoch 1430 | step 0 | lr 0.000202 | loss 0.025589 | mae 0.116330 -[2024/06/24 07:12:54] ppsci INFO: train: epoch 1430 | step 10 | lr 0.000202 | loss 0.018857 | mae 0.106682 -[2024/06/24 07:12:55] ppsci INFO: train: epoch 1430 | step 20 | lr 0.000202 | loss 0.027107 | mae 0.121785 -[2024/06/24 07:12:55] ppsci INFO: train: epoch 1430 | step 30 | lr 0.000202 | loss 0.030411 | mae 0.121328 -[2024/06/24 07:12:56] ppsci INFO: train: epoch 1430 | step 38 | lr 0.000202 | loss 0.046888 | mae 0.165048 -[2024/06/24 07:12:56] ppsci INFO: epoch: 1430, train_loss: 0.027037, train_metric: 0.120309, eval_loss: 0.049140, eval_mae: 0.147976 -[2024/06/24 07:12:56] ppsci INFO: train: epoch 1431 | step 0 | lr 0.000202 | loss 0.022921 | mae 0.114548 -[2024/06/24 07:12:56] ppsci INFO: train: epoch 1431 | step 10 | lr 0.000202 | loss 0.020919 | mae 0.112624 -[2024/06/24 07:12:57] ppsci INFO: train: epoch 1431 | step 20 | lr 0.000202 | loss 0.026704 | mae 0.109183 -[2024/06/24 07:12:57] ppsci INFO: train: epoch 1431 | step 30 | lr 0.000202 | loss 0.021953 | mae 0.109369 -[2024/06/24 07:12:58] ppsci INFO: train: epoch 1431 | step 38 | lr 0.000202 | loss 0.015667 | mae 0.091819 -[2024/06/24 07:12:58] ppsci INFO: epoch: 1431, train_loss: 0.026598, train_metric: 0.121850, eval_loss: 0.050868, eval_mae: 0.149823 -[2024/06/24 07:12:58] ppsci INFO: train: epoch 1432 | step 0 | lr 0.000203 | loss 0.034195 | mae 0.142362 -[2024/06/24 07:12:58] ppsci INFO: train: epoch 1432 | step 10 | lr 0.000203 | loss 0.014964 | mae 0.091072 -[2024/06/24 07:12:59] ppsci INFO: train: epoch 1432 | step 20 | lr 0.000203 | loss 0.023730 | mae 0.112250 -[2024/06/24 07:12:59] ppsci INFO: train: epoch 1432 | step 30 | lr 0.000203 | loss 0.023581 | mae 0.121230 -[2024/06/24 07:13:00] ppsci INFO: train: epoch 1432 | step 38 | lr 0.000203 | loss 0.022259 | mae 0.108927 -[2024/06/24 07:13:00] ppsci INFO: epoch: 1432, train_loss: 0.027441, train_metric: 0.121076, eval_loss: 0.051906, eval_mae: 0.149760 -[2024/06/24 07:13:00] ppsci INFO: train: epoch 1433 | step 0 | lr 0.000204 | loss 0.031025 | mae 0.138873 -[2024/06/24 07:13:01] ppsci INFO: train: epoch 1433 | step 10 | lr 0.000204 | loss 0.037085 | mae 0.140060 -[2024/06/24 07:13:01] ppsci INFO: train: epoch 1433 | step 20 | lr 0.000204 | loss 0.029860 | mae 0.127871 -[2024/06/24 07:13:02] ppsci INFO: train: epoch 1433 | step 30 | lr 0.000204 | loss 0.038128 | mae 0.133074 -[2024/06/24 07:13:02] ppsci INFO: train: epoch 1433 | step 38 | lr 0.000204 | loss 0.012417 | mae 0.087587 -[2024/06/24 07:13:02] ppsci INFO: epoch: 1433, train_loss: 0.026927, train_metric: 0.119371, eval_loss: 0.048010, eval_mae: 0.147786 -[2024/06/24 07:13:02] ppsci INFO: train: epoch 1434 | step 0 | lr 0.000205 | loss 0.090206 | mae 0.133639 -[2024/06/24 07:13:03] ppsci INFO: train: epoch 1434 | step 10 | lr 0.000205 | loss 0.024265 | mae 0.118570 -[2024/06/24 07:13:03] ppsci INFO: train: epoch 1434 | step 20 | lr 0.000205 | loss 0.026220 | mae 0.123784 -[2024/06/24 07:13:04] ppsci INFO: train: epoch 1434 | step 30 | lr 0.000205 | loss 0.034158 | mae 0.139272 -[2024/06/24 07:13:04] ppsci INFO: train: epoch 1434 | step 38 | lr 0.000205 | loss 0.016025 | mae 0.102201 -[2024/06/24 07:13:04] ppsci INFO: epoch: 1434, train_loss: 0.027907, train_metric: 0.120722, eval_loss: 0.047765, eval_mae: 0.149339 -[2024/06/24 07:13:04] ppsci INFO: train: epoch 1435 | step 0 | lr 0.000205 | loss 0.019084 | mae 0.104405 -[2024/06/24 07:13:05] ppsci INFO: train: epoch 1435 | step 10 | lr 0.000205 | loss 0.028674 | mae 0.121207 -[2024/06/24 07:13:05] ppsci INFO: train: epoch 1435 | step 20 | lr 0.000205 | loss 0.030640 | mae 0.128613 -[2024/06/24 07:13:06] ppsci INFO: train: epoch 1435 | step 30 | lr 0.000205 | loss 0.018469 | mae 0.104160 -[2024/06/24 07:13:06] ppsci INFO: train: epoch 1435 | step 38 | lr 0.000205 | loss 0.016899 | mae 0.091731 -[2024/06/24 07:13:06] ppsci INFO: epoch: 1435, train_loss: 0.026685, train_metric: 0.118920, eval_loss: 0.052084, eval_mae: 0.149995 -[2024/06/24 07:13:06] ppsci INFO: train: epoch 1436 | step 0 | lr 0.000206 | loss 0.027420 | mae 0.126407 -[2024/06/24 07:13:07] ppsci INFO: train: epoch 1436 | step 10 | lr 0.000206 | loss 0.027682 | mae 0.123056 -[2024/06/24 07:13:08] ppsci INFO: train: epoch 1436 | step 20 | lr 0.000206 | loss 0.022263 | mae 0.111957 -[2024/06/24 07:13:08] ppsci INFO: train: epoch 1436 | step 30 | lr 0.000206 | loss 0.016278 | mae 0.097794 -[2024/06/24 07:13:08] ppsci INFO: train: epoch 1436 | step 38 | lr 0.000206 | loss 0.016530 | mae 0.108170 -[2024/06/24 07:13:09] ppsci INFO: epoch: 1436, train_loss: 0.026111, train_metric: 0.120440, eval_loss: 0.052329, eval_mae: 0.151195 -[2024/06/24 07:13:09] ppsci INFO: train: epoch 1437 | step 0 | lr 0.000207 | loss 0.031331 | mae 0.114486 -[2024/06/24 07:13:09] ppsci INFO: train: epoch 1437 | step 10 | lr 0.000207 | loss 0.025831 | mae 0.126389 -[2024/06/24 07:13:10] ppsci INFO: train: epoch 1437 | step 20 | lr 0.000207 | loss 0.023036 | mae 0.120453 -[2024/06/24 07:13:10] ppsci INFO: train: epoch 1437 | step 30 | lr 0.000207 | loss 0.018874 | mae 0.100090 -[2024/06/24 07:13:11] ppsci INFO: train: epoch 1437 | step 38 | lr 0.000207 | loss 0.048470 | mae 0.153313 -[2024/06/24 07:13:11] ppsci INFO: epoch: 1437, train_loss: 0.027824, train_metric: 0.120538, eval_loss: 0.048011, eval_mae: 0.147060 -[2024/06/24 07:13:11] ppsci INFO: train: epoch 1438 | step 0 | lr 0.000208 | loss 0.023068 | mae 0.116707 -[2024/06/24 07:13:11] ppsci INFO: train: epoch 1438 | step 10 | lr 0.000208 | loss 0.021451 | mae 0.106233 -[2024/06/24 07:13:12] ppsci INFO: train: epoch 1438 | step 20 | lr 0.000208 | loss 0.023106 | mae 0.117198 -[2024/06/24 07:13:13] ppsci INFO: train: epoch 1438 | step 30 | lr 0.000208 | loss 0.047317 | mae 0.132357 -[2024/06/24 07:13:13] ppsci INFO: train: epoch 1438 | step 38 | lr 0.000208 | loss 0.031950 | mae 0.158845 -[2024/06/24 07:13:13] ppsci INFO: epoch: 1438, train_loss: 0.027244, train_metric: 0.120579, eval_loss: 0.047938, eval_mae: 0.150066 -[2024/06/24 07:13:13] ppsci INFO: train: epoch 1439 | step 0 | lr 0.000208 | loss 0.028437 | mae 0.127903 -[2024/06/24 07:13:14] ppsci INFO: train: epoch 1439 | step 10 | lr 0.000208 | loss 0.028608 | mae 0.110713 -[2024/06/24 07:13:14] ppsci INFO: train: epoch 1439 | step 20 | lr 0.000208 | loss 0.029450 | mae 0.134046 -[2024/06/24 07:13:15] ppsci INFO: train: epoch 1439 | step 30 | lr 0.000208 | loss 0.020078 | mae 0.107478 -[2024/06/24 07:13:15] ppsci INFO: train: epoch 1439 | step 38 | lr 0.000208 | loss 0.023288 | mae 0.112981 -[2024/06/24 07:13:15] ppsci INFO: epoch: 1439, train_loss: 0.026041, train_metric: 0.118932, eval_loss: 0.049442, eval_mae: 0.148219 -[2024/06/24 07:13:15] ppsci INFO: train: epoch 1440 | step 0 | lr 0.000209 | loss 0.025970 | mae 0.123148 -[2024/06/24 07:13:16] ppsci INFO: train: epoch 1440 | step 10 | lr 0.000209 | loss 0.037033 | mae 0.138850 -[2024/06/24 07:13:16] ppsci INFO: train: epoch 1440 | step 20 | lr 0.000209 | loss 0.020417 | mae 0.109185 -[2024/06/24 07:13:17] ppsci INFO: train: epoch 1440 | step 30 | lr 0.000209 | loss 0.023209 | mae 0.113093 -[2024/06/24 07:13:17] ppsci INFO: train: epoch 1440 | step 38 | lr 0.000209 | loss 0.018909 | mae 0.108300 -[2024/06/24 07:13:18] ppsci INFO: epoch: 1440, train_loss: 0.025898, train_metric: 0.118482, eval_loss: 0.051914, eval_mae: 0.152529 -[2024/06/24 07:13:18] ppsci INFO: train: epoch 1441 | step 0 | lr 0.000210 | loss 0.039984 | mae 0.146127 -[2024/06/24 07:13:18] ppsci INFO: train: epoch 1441 | step 10 | lr 0.000210 | loss 0.036713 | mae 0.142133 -[2024/06/24 07:13:19] ppsci INFO: train: epoch 1441 | step 20 | lr 0.000210 | loss 0.025404 | mae 0.121420 -[2024/06/24 07:13:19] ppsci INFO: train: epoch 1441 | step 30 | lr 0.000210 | loss 0.020559 | mae 0.110018 -[2024/06/24 07:13:20] ppsci INFO: train: epoch 1441 | step 38 | lr 0.000210 | loss 0.029193 | mae 0.124654 -[2024/06/24 07:13:20] ppsci INFO: epoch: 1441, train_loss: 0.027323, train_metric: 0.122255, eval_loss: 0.049730, eval_mae: 0.148980 -[2024/06/24 07:13:20] ppsci INFO: train: epoch 1442 | step 0 | lr 0.000211 | loss 0.027180 | mae 0.126971 -[2024/06/24 07:13:21] ppsci INFO: train: epoch 1442 | step 10 | lr 0.000211 | loss 0.029223 | mae 0.121373 -[2024/06/24 07:13:21] ppsci INFO: train: epoch 1442 | step 20 | lr 0.000211 | loss 0.032123 | mae 0.137787 -[2024/06/24 07:13:22] ppsci INFO: train: epoch 1442 | step 30 | lr 0.000211 | loss 0.025688 | mae 0.122167 -[2024/06/24 07:13:22] ppsci INFO: train: epoch 1442 | step 38 | lr 0.000211 | loss 0.017961 | mae 0.110220 -[2024/06/24 07:13:22] ppsci INFO: epoch: 1442, train_loss: 0.027020, train_metric: 0.121427, eval_loss: 0.050947, eval_mae: 0.154411 -[2024/06/24 07:13:22] ppsci INFO: train: epoch 1443 | step 0 | lr 0.000211 | loss 0.023472 | mae 0.116644 -[2024/06/24 07:13:23] ppsci INFO: train: epoch 1443 | step 10 | lr 0.000211 | loss 0.018891 | mae 0.104087 -[2024/06/24 07:13:23] ppsci INFO: train: epoch 1443 | step 20 | lr 0.000211 | loss 0.027232 | mae 0.117121 -[2024/06/24 07:13:24] ppsci INFO: train: epoch 1443 | step 30 | lr 0.000211 | loss 0.024177 | mae 0.116392 -[2024/06/24 07:13:24] ppsci INFO: train: epoch 1443 | step 38 | lr 0.000211 | loss 0.035667 | mae 0.118106 -[2024/06/24 07:13:24] ppsci INFO: epoch: 1443, train_loss: 0.026251, train_metric: 0.118393, eval_loss: 0.046740, eval_mae: 0.151311 -[2024/06/24 07:13:24] ppsci INFO: train: epoch 1444 | step 0 | lr 0.000212 | loss 0.024230 | mae 0.119253 -[2024/06/24 07:13:25] ppsci INFO: train: epoch 1444 | step 10 | lr 0.000212 | loss 0.028993 | mae 0.134653 -[2024/06/24 07:13:25] ppsci INFO: train: epoch 1444 | step 20 | lr 0.000212 | loss 0.023872 | mae 0.114107 -[2024/06/24 07:13:26] ppsci INFO: train: epoch 1444 | step 30 | lr 0.000212 | loss 0.028340 | mae 0.126353 -[2024/06/24 07:13:26] ppsci INFO: train: epoch 1444 | step 38 | lr 0.000212 | loss 0.029482 | mae 0.133530 -[2024/06/24 07:13:26] ppsci INFO: epoch: 1444, train_loss: 0.026270, train_metric: 0.120743, eval_loss: 0.046541, eval_mae: 0.151100 -[2024/06/24 07:13:26] ppsci INFO: train: epoch 1445 | step 0 | lr 0.000213 | loss 0.024396 | mae 0.120557 -[2024/06/24 07:13:27] ppsci INFO: train: epoch 1445 | step 10 | lr 0.000213 | loss 0.023690 | mae 0.117838 -[2024/06/24 07:13:27] ppsci INFO: train: epoch 1445 | step 20 | lr 0.000213 | loss 0.022459 | mae 0.111860 -[2024/06/24 07:13:28] ppsci INFO: train: epoch 1445 | step 30 | lr 0.000213 | loss 0.021524 | mae 0.116264 -[2024/06/24 07:13:28] ppsci INFO: train: epoch 1445 | step 38 | lr 0.000213 | loss 0.025074 | mae 0.106694 -[2024/06/24 07:13:28] ppsci INFO: epoch: 1445, train_loss: 0.026534, train_metric: 0.120296, eval_loss: 0.050610, eval_mae: 0.151831 -[2024/06/24 07:13:28] ppsci INFO: train: epoch 1446 | step 0 | lr 0.000214 | loss 0.037032 | mae 0.135062 -[2024/06/24 07:13:29] ppsci INFO: train: epoch 1446 | step 10 | lr 0.000214 | loss 0.032851 | mae 0.135126 -[2024/06/24 07:13:29] ppsci INFO: train: epoch 1446 | step 20 | lr 0.000214 | loss 0.027202 | mae 0.124854 -[2024/06/24 07:13:30] ppsci INFO: train: epoch 1446 | step 30 | lr 0.000214 | loss 0.022457 | mae 0.112179 -[2024/06/24 07:13:30] ppsci INFO: train: epoch 1446 | step 38 | lr 0.000214 | loss 0.017401 | mae 0.103509 -[2024/06/24 07:13:30] ppsci INFO: epoch: 1446, train_loss: 0.026857, train_metric: 0.121376, eval_loss: 0.047647, eval_mae: 0.148566 -[2024/06/24 07:13:30] ppsci INFO: train: epoch 1447 | step 0 | lr 0.000214 | loss 0.024829 | mae 0.113227 -[2024/06/24 07:13:31] ppsci INFO: train: epoch 1447 | step 10 | lr 0.000214 | loss 0.024072 | mae 0.116085 -[2024/06/24 07:13:31] ppsci INFO: train: epoch 1447 | step 20 | lr 0.000214 | loss 0.023993 | mae 0.115499 -[2024/06/24 07:13:32] ppsci INFO: train: epoch 1447 | step 30 | lr 0.000214 | loss 0.019830 | mae 0.108139 -[2024/06/24 07:13:32] ppsci INFO: train: epoch 1447 | step 38 | lr 0.000214 | loss 0.010779 | mae 0.083004 -[2024/06/24 07:13:32] ppsci INFO: epoch: 1447, train_loss: 0.025185, train_metric: 0.117082, eval_loss: 0.049095, eval_mae: 0.149975 -[2024/06/24 07:13:32] ppsci INFO: train: epoch 1448 | step 0 | lr 0.000215 | loss 0.023239 | mae 0.110211 -[2024/06/24 07:13:33] ppsci INFO: train: epoch 1448 | step 10 | lr 0.000215 | loss 0.027529 | mae 0.124387 -[2024/06/24 07:13:34] ppsci INFO: train: epoch 1448 | step 20 | lr 0.000215 | loss 0.032626 | mae 0.131500 -[2024/06/24 07:13:34] ppsci INFO: train: epoch 1448 | step 30 | lr 0.000215 | loss 0.024022 | mae 0.120079 -[2024/06/24 07:13:34] ppsci INFO: train: epoch 1448 | step 38 | lr 0.000215 | loss 0.034695 | mae 0.135897 -[2024/06/24 07:13:35] ppsci INFO: epoch: 1448, train_loss: 0.025985, train_metric: 0.120845, eval_loss: 0.048373, eval_mae: 0.148598 -[2024/06/24 07:13:35] ppsci INFO: train: epoch 1449 | step 0 | lr 0.000216 | loss 0.023009 | mae 0.109185 -[2024/06/24 07:13:35] ppsci INFO: train: epoch 1449 | step 10 | lr 0.000216 | loss 0.022205 | mae 0.106539 -[2024/06/24 07:13:36] ppsci INFO: train: epoch 1449 | step 20 | lr 0.000216 | loss 0.020175 | mae 0.107072 -[2024/06/24 07:13:36] ppsci INFO: train: epoch 1449 | step 30 | lr 0.000216 | loss 0.027217 | mae 0.123301 -[2024/06/24 07:13:37] ppsci INFO: train: epoch 1449 | step 38 | lr 0.000216 | loss 0.033022 | mae 0.137649 -[2024/06/24 07:13:37] ppsci INFO: epoch: 1449, train_loss: 0.027255, train_metric: 0.121949, eval_loss: 0.049546, eval_mae: 0.149211 -[2024/06/24 07:13:37] ppsci INFO: train: epoch 1450 | step 0 | lr 0.000217 | loss 0.026533 | mae 0.119364 -[2024/06/24 07:13:37] ppsci INFO: train: epoch 1450 | step 10 | lr 0.000217 | loss 0.029964 | mae 0.126088 -[2024/06/24 07:13:38] ppsci INFO: train: epoch 1450 | step 20 | lr 0.000217 | loss 0.026878 | mae 0.123698 -[2024/06/24 07:13:38] ppsci INFO: train: epoch 1450 | step 30 | lr 0.000217 | loss 0.023629 | mae 0.123627 -[2024/06/24 07:13:39] ppsci INFO: train: epoch 1450 | step 38 | lr 0.000217 | loss 0.018551 | mae 0.107755 -[2024/06/24 07:13:39] ppsci INFO: epoch: 1450, train_loss: 0.025469, train_metric: 0.119782, eval_loss: 0.049385, eval_mae: 0.148199 -[2024/06/24 07:13:39] ppsci INFO: train: epoch 1451 | step 0 | lr 0.000217 | loss 0.022705 | mae 0.120669 -[2024/06/24 07:13:40] ppsci INFO: train: epoch 1451 | step 10 | lr 0.000217 | loss 0.026659 | mae 0.121612 -[2024/06/24 07:13:40] ppsci INFO: train: epoch 1451 | step 20 | lr 0.000217 | loss 0.021436 | mae 0.108003 -[2024/06/24 07:13:41] ppsci INFO: train: epoch 1451 | step 30 | lr 0.000217 | loss 0.029739 | mae 0.123084 -[2024/06/24 07:13:41] ppsci INFO: train: epoch 1451 | step 38 | lr 0.000217 | loss 0.015018 | mae 0.101623 -[2024/06/24 07:13:41] ppsci INFO: epoch: 1451, train_loss: 0.026595, train_metric: 0.118590, eval_loss: 0.047748, eval_mae: 0.147610 -[2024/06/24 07:13:41] ppsci INFO: train: epoch 1452 | step 0 | lr 0.000218 | loss 0.027036 | mae 0.133191 -[2024/06/24 07:13:42] ppsci INFO: train: epoch 1452 | step 10 | lr 0.000218 | loss 0.023847 | mae 0.116020 -[2024/06/24 07:13:42] ppsci INFO: train: epoch 1452 | step 20 | lr 0.000218 | loss 0.025269 | mae 0.113312 -[2024/06/24 07:13:43] ppsci INFO: train: epoch 1452 | step 30 | lr 0.000218 | loss 0.020193 | mae 0.110558 -[2024/06/24 07:13:43] ppsci INFO: train: epoch 1452 | step 38 | lr 0.000218 | loss 0.016299 | mae 0.087481 -[2024/06/24 07:13:43] ppsci INFO: epoch: 1452, train_loss: 0.026026, train_metric: 0.118678, eval_loss: 0.051109, eval_mae: 0.150554 -[2024/06/24 07:13:43] ppsci INFO: train: epoch 1453 | step 0 | lr 0.000219 | loss 0.024839 | mae 0.117743 -[2024/06/24 07:13:44] ppsci INFO: train: epoch 1453 | step 10 | lr 0.000219 | loss 0.026032 | mae 0.121932 -[2024/06/24 07:13:44] ppsci INFO: train: epoch 1453 | step 20 | lr 0.000219 | loss 0.039227 | mae 0.140265 -[2024/06/24 07:13:45] ppsci INFO: train: epoch 1453 | step 30 | lr 0.000219 | loss 0.040781 | mae 0.148346 -[2024/06/24 07:13:45] ppsci INFO: train: epoch 1453 | step 38 | lr 0.000219 | loss 0.026406 | mae 0.123272 -[2024/06/24 07:13:45] ppsci INFO: epoch: 1453, train_loss: 0.028126, train_metric: 0.122308, eval_loss: 0.046827, eval_mae: 0.145010 -[2024/06/24 07:13:45] ppsci INFO: train: epoch 1454 | step 0 | lr 0.000220 | loss 0.020235 | mae 0.106524 -[2024/06/24 07:13:46] ppsci INFO: train: epoch 1454 | step 10 | lr 0.000220 | loss 0.020393 | mae 0.108138 -[2024/06/24 07:13:46] ppsci INFO: train: epoch 1454 | step 20 | lr 0.000220 | loss 0.028670 | mae 0.125014 -[2024/06/24 07:13:47] ppsci INFO: train: epoch 1454 | step 30 | lr 0.000220 | loss 0.028716 | mae 0.132878 -[2024/06/24 07:13:47] ppsci INFO: train: epoch 1454 | step 38 | lr 0.000220 | loss 0.018845 | mae 0.098257 -[2024/06/24 07:13:48] ppsci INFO: epoch: 1454, train_loss: 0.024145, train_metric: 0.116318, eval_loss: 0.045054, eval_mae: 0.147118 -[2024/06/24 07:13:48] ppsci INFO: train: epoch 1455 | step 0 | lr 0.000220 | loss 0.018912 | mae 0.106051 -[2024/06/24 07:13:48] ppsci INFO: train: epoch 1455 | step 10 | lr 0.000220 | loss 0.028324 | mae 0.129991 -[2024/06/24 07:13:49] ppsci INFO: train: epoch 1455 | step 20 | lr 0.000220 | loss 0.022027 | mae 0.109321 -[2024/06/24 07:13:49] ppsci INFO: train: epoch 1455 | step 30 | lr 0.000220 | loss 0.028712 | mae 0.126127 -[2024/06/24 07:13:50] ppsci INFO: train: epoch 1455 | step 38 | lr 0.000220 | loss 0.042729 | mae 0.159357 -[2024/06/24 07:13:50] ppsci INFO: epoch: 1455, train_loss: 0.026858, train_metric: 0.120501, eval_loss: 0.046487, eval_mae: 0.146991 -[2024/06/24 07:13:50] ppsci INFO: train: epoch 1456 | step 0 | lr 0.000221 | loss 0.028897 | mae 0.122190 -[2024/06/24 07:13:50] ppsci INFO: train: epoch 1456 | step 10 | lr 0.000221 | loss 0.023907 | mae 0.112691 -[2024/06/24 07:13:51] ppsci INFO: train: epoch 1456 | step 20 | lr 0.000221 | loss 0.020157 | mae 0.111887 -[2024/06/24 07:13:51] ppsci INFO: train: epoch 1456 | step 30 | lr 0.000221 | loss 0.031729 | mae 0.138462 -[2024/06/24 07:13:52] ppsci INFO: train: epoch 1456 | step 38 | lr 0.000221 | loss 0.039117 | mae 0.153072 -[2024/06/24 07:13:52] ppsci INFO: epoch: 1456, train_loss: 0.026048, train_metric: 0.120238, eval_loss: 0.050144, eval_mae: 0.149276 -[2024/06/24 07:13:52] ppsci INFO: train: epoch 1457 | step 0 | lr 0.000222 | loss 0.031831 | mae 0.127432 -[2024/06/24 07:13:53] ppsci INFO: train: epoch 1457 | step 10 | lr 0.000222 | loss 0.031846 | mae 0.123082 -[2024/06/24 07:13:53] ppsci INFO: train: epoch 1457 | step 20 | lr 0.000222 | loss 0.036234 | mae 0.127678 -[2024/06/24 07:13:54] ppsci INFO: train: epoch 1457 | step 30 | lr 0.000222 | loss 0.022380 | mae 0.118147 -[2024/06/24 07:13:54] ppsci INFO: train: epoch 1457 | step 38 | lr 0.000222 | loss 0.023745 | mae 0.134665 -[2024/06/24 07:13:54] ppsci INFO: epoch: 1457, train_loss: 0.025787, train_metric: 0.118399, eval_loss: 0.047761, eval_mae: 0.150162 -[2024/06/24 07:13:54] ppsci INFO: train: epoch 1458 | step 0 | lr 0.000223 | loss 0.032791 | mae 0.127286 -[2024/06/24 07:13:55] ppsci INFO: train: epoch 1458 | step 10 | lr 0.000223 | loss 0.019582 | mae 0.107328 -[2024/06/24 07:13:55] ppsci INFO: train: epoch 1458 | step 20 | lr 0.000223 | loss 0.026812 | mae 0.115018 -[2024/06/24 07:13:56] ppsci INFO: train: epoch 1458 | step 30 | lr 0.000223 | loss 0.030038 | mae 0.125211 -[2024/06/24 07:13:56] ppsci INFO: train: epoch 1458 | step 38 | lr 0.000223 | loss 0.034361 | mae 0.137489 -[2024/06/24 07:13:56] ppsci INFO: epoch: 1458, train_loss: 0.027058, train_metric: 0.120851, eval_loss: 0.053402, eval_mae: 0.148482 -[2024/06/24 07:13:56] ppsci INFO: train: epoch 1459 | step 0 | lr 0.000224 | loss 0.017113 | mae 0.098868 -[2024/06/24 07:13:57] ppsci INFO: train: epoch 1459 | step 10 | lr 0.000224 | loss 0.022240 | mae 0.108340 -[2024/06/24 07:13:57] ppsci INFO: train: epoch 1459 | step 20 | lr 0.000224 | loss 0.028736 | mae 0.125816 -[2024/06/24 07:13:58] ppsci INFO: train: epoch 1459 | step 30 | lr 0.000224 | loss 0.021539 | mae 0.106205 -[2024/06/24 07:13:58] ppsci INFO: train: epoch 1459 | step 38 | lr 0.000224 | loss 0.016594 | mae 0.120065 -[2024/06/24 07:13:58] ppsci INFO: epoch: 1459, train_loss: 0.026211, train_metric: 0.119489, eval_loss: 0.049153, eval_mae: 0.150887 -[2024/06/24 07:13:58] ppsci INFO: train: epoch 1460 | step 0 | lr 0.000224 | loss 0.023771 | mae 0.116377 -[2024/06/24 07:13:59] ppsci INFO: train: epoch 1460 | step 10 | lr 0.000224 | loss 0.019931 | mae 0.110970 -[2024/06/24 07:14:00] ppsci INFO: train: epoch 1460 | step 20 | lr 0.000224 | loss 0.028561 | mae 0.126499 -[2024/06/24 07:14:00] ppsci INFO: train: epoch 1460 | step 30 | lr 0.000224 | loss 0.022450 | mae 0.116388 -[2024/06/24 07:14:00] ppsci INFO: train: epoch 1460 | step 38 | lr 0.000224 | loss 0.047159 | mae 0.181365 -[2024/06/24 07:14:01] ppsci INFO: epoch: 1460, train_loss: 0.027221, train_metric: 0.120383, eval_loss: 0.049679, eval_mae: 0.147064 -[2024/06/24 07:14:01] ppsci INFO: train: epoch 1461 | step 0 | lr 0.000225 | loss 0.018905 | mae 0.101641 -[2024/06/24 07:14:01] ppsci INFO: train: epoch 1461 | step 10 | lr 0.000225 | loss 0.021968 | mae 0.117941 -[2024/06/24 07:14:02] ppsci INFO: train: epoch 1461 | step 20 | lr 0.000225 | loss 0.026928 | mae 0.115188 -[2024/06/24 07:14:02] ppsci INFO: train: epoch 1461 | step 30 | lr 0.000225 | loss 0.032533 | mae 0.131763 -[2024/06/24 07:14:03] ppsci INFO: train: epoch 1461 | step 38 | lr 0.000225 | loss 0.027975 | mae 0.148591 -[2024/06/24 07:14:03] ppsci INFO: epoch: 1461, train_loss: 0.027645, train_metric: 0.121037, eval_loss: 0.047369, eval_mae: 0.149085 -[2024/06/24 07:14:03] ppsci INFO: train: epoch 1462 | step 0 | lr 0.000226 | loss 0.029248 | mae 0.125084 -[2024/06/24 07:14:03] ppsci INFO: train: epoch 1462 | step 10 | lr 0.000226 | loss 0.031110 | mae 0.134322 -[2024/06/24 07:14:04] ppsci INFO: train: epoch 1462 | step 20 | lr 0.000226 | loss 0.049895 | mae 0.148035 -[2024/06/24 07:14:04] ppsci INFO: train: epoch 1462 | step 30 | lr 0.000226 | loss 0.032374 | mae 0.130169 -[2024/06/24 07:14:05] ppsci INFO: train: epoch 1462 | step 38 | lr 0.000226 | loss 0.013963 | mae 0.098071 -[2024/06/24 07:14:05] ppsci INFO: epoch: 1462, train_loss: 0.025999, train_metric: 0.118916, eval_loss: 0.049710, eval_mae: 0.149757 -[2024/06/24 07:14:05] ppsci INFO: train: epoch 1463 | step 0 | lr 0.000227 | loss 0.027710 | mae 0.123664 -[2024/06/24 07:14:06] ppsci INFO: train: epoch 1463 | step 10 | lr 0.000227 | loss 0.020419 | mae 0.106950 -[2024/06/24 07:14:06] ppsci INFO: train: epoch 1463 | step 20 | lr 0.000227 | loss 0.017913 | mae 0.105801 -[2024/06/24 07:14:07] ppsci INFO: train: epoch 1463 | step 30 | lr 0.000227 | loss 0.027669 | mae 0.127715 -[2024/06/24 07:14:07] ppsci INFO: train: epoch 1463 | step 38 | lr 0.000227 | loss 0.024838 | mae 0.122004 -[2024/06/24 07:14:07] ppsci INFO: epoch: 1463, train_loss: 0.025212, train_metric: 0.117014, eval_loss: 0.049982, eval_mae: 0.152667 -[2024/06/24 07:14:07] ppsci INFO: train: epoch 1464 | step 0 | lr 0.000227 | loss 0.023144 | mae 0.114939 -[2024/06/24 07:14:08] ppsci INFO: train: epoch 1464 | step 10 | lr 0.000227 | loss 0.017206 | mae 0.092479 -[2024/06/24 07:14:08] ppsci INFO: train: epoch 1464 | step 20 | lr 0.000227 | loss 0.023321 | mae 0.116309 -[2024/06/24 07:14:09] ppsci INFO: train: epoch 1464 | step 30 | lr 0.000227 | loss 0.019831 | mae 0.108724 -[2024/06/24 07:14:09] ppsci INFO: train: epoch 1464 | step 38 | lr 0.000227 | loss 0.014674 | mae 0.096033 -[2024/06/24 07:14:09] ppsci INFO: epoch: 1464, train_loss: 0.025985, train_metric: 0.118365, eval_loss: 0.052231, eval_mae: 0.151281 -[2024/06/24 07:14:09] ppsci INFO: train: epoch 1465 | step 0 | lr 0.000228 | loss 0.022929 | mae 0.110500 -[2024/06/24 07:14:10] ppsci INFO: train: epoch 1465 | step 10 | lr 0.000228 | loss 0.023573 | mae 0.119568 -[2024/06/24 07:14:10] ppsci INFO: train: epoch 1465 | step 20 | lr 0.000228 | loss 0.030927 | mae 0.130824 -[2024/06/24 07:14:11] ppsci INFO: train: epoch 1465 | step 30 | lr 0.000228 | loss 0.024041 | mae 0.124887 -[2024/06/24 07:14:11] ppsci INFO: train: epoch 1465 | step 38 | lr 0.000228 | loss 0.084251 | mae 0.151403 -[2024/06/24 07:14:11] ppsci INFO: epoch: 1465, train_loss: 0.027327, train_metric: 0.120450, eval_loss: 0.049207, eval_mae: 0.151032 -[2024/06/24 07:14:12] ppsci INFO: train: epoch 1466 | step 0 | lr 0.000229 | loss 0.022086 | mae 0.113206 -[2024/06/24 07:14:12] ppsci INFO: train: epoch 1466 | step 10 | lr 0.000229 | loss 0.033534 | mae 0.125603 -[2024/06/24 07:14:13] ppsci INFO: train: epoch 1466 | step 20 | lr 0.000229 | loss 0.023118 | mae 0.116621 -[2024/06/24 07:14:13] ppsci INFO: train: epoch 1466 | step 30 | lr 0.000229 | loss 0.027744 | mae 0.128450 -[2024/06/24 07:14:13] ppsci INFO: train: epoch 1466 | step 38 | lr 0.000229 | loss 0.012283 | mae 0.096174 -[2024/06/24 07:14:14] ppsci INFO: epoch: 1466, train_loss: 0.025511, train_metric: 0.119824, eval_loss: 0.047729, eval_mae: 0.147884 -[2024/06/24 07:14:14] ppsci INFO: train: epoch 1467 | step 0 | lr 0.000230 | loss 0.022062 | mae 0.109538 -[2024/06/24 07:14:14] ppsci INFO: train: epoch 1467 | step 10 | lr 0.000230 | loss 0.021505 | mae 0.112412 -[2024/06/24 07:14:15] ppsci INFO: train: epoch 1467 | step 20 | lr 0.000230 | loss 0.018672 | mae 0.101655 -[2024/06/24 07:14:15] ppsci INFO: train: epoch 1467 | step 30 | lr 0.000230 | loss 0.025939 | mae 0.123023 -[2024/06/24 07:14:16] ppsci INFO: train: epoch 1467 | step 38 | lr 0.000230 | loss 0.013475 | mae 0.096960 -[2024/06/24 07:14:16] ppsci INFO: epoch: 1467, train_loss: 0.026282, train_metric: 0.119303, eval_loss: 0.049422, eval_mae: 0.148179 -[2024/06/24 07:14:16] ppsci INFO: train: epoch 1468 | step 0 | lr 0.000230 | loss 0.021663 | mae 0.111388 -[2024/06/24 07:14:16] ppsci INFO: train: epoch 1468 | step 10 | lr 0.000230 | loss 0.028926 | mae 0.116782 -[2024/06/24 07:14:17] ppsci INFO: train: epoch 1468 | step 20 | lr 0.000230 | loss 0.031058 | mae 0.133593 -[2024/06/24 07:14:18] ppsci INFO: train: epoch 1468 | step 30 | lr 0.000230 | loss 0.022048 | mae 0.111936 -[2024/06/24 07:14:18] ppsci INFO: train: epoch 1468 | step 38 | lr 0.000230 | loss 0.023234 | mae 0.125913 -[2024/06/24 07:14:18] ppsci INFO: epoch: 1468, train_loss: 0.026333, train_metric: 0.120712, eval_loss: 0.047886, eval_mae: 0.147573 -[2024/06/24 07:14:18] ppsci INFO: train: epoch 1469 | step 0 | lr 0.000231 | loss 0.023910 | mae 0.115982 -[2024/06/24 07:14:19] ppsci INFO: train: epoch 1469 | step 10 | lr 0.000231 | loss 0.033031 | mae 0.131664 -[2024/06/24 07:14:19] ppsci INFO: train: epoch 1469 | step 20 | lr 0.000231 | loss 0.022210 | mae 0.119603 -[2024/06/24 07:14:20] ppsci INFO: train: epoch 1469 | step 30 | lr 0.000231 | loss 0.026016 | mae 0.122189 -[2024/06/24 07:14:20] ppsci INFO: train: epoch 1469 | step 38 | lr 0.000231 | loss 0.031821 | mae 0.128021 -[2024/06/24 07:14:20] ppsci INFO: epoch: 1469, train_loss: 0.027686, train_metric: 0.122262, eval_loss: 0.045666, eval_mae: 0.146696 -[2024/06/24 07:14:20] ppsci INFO: train: epoch 1470 | step 0 | lr 0.000232 | loss 0.022799 | mae 0.118353 -[2024/06/24 07:14:21] ppsci INFO: train: epoch 1470 | step 10 | lr 0.000232 | loss 0.035744 | mae 0.134019 -[2024/06/24 07:14:21] ppsci INFO: train: epoch 1470 | step 20 | lr 0.000232 | loss 0.020183 | mae 0.111843 -[2024/06/24 07:14:22] ppsci INFO: train: epoch 1470 | step 30 | lr 0.000232 | loss 0.021270 | mae 0.108957 -[2024/06/24 07:14:22] ppsci INFO: train: epoch 1470 | step 38 | lr 0.000232 | loss 0.026747 | mae 0.132658 -[2024/06/24 07:14:22] ppsci INFO: epoch: 1470, train_loss: 0.025896, train_metric: 0.118418, eval_loss: 0.048808, eval_mae: 0.148082 -[2024/06/24 07:14:22] ppsci INFO: train: epoch 1471 | step 0 | lr 0.000233 | loss 0.027876 | mae 0.125770 -[2024/06/24 07:14:23] ppsci INFO: train: epoch 1471 | step 10 | lr 0.000233 | loss 0.022243 | mae 0.111476 -[2024/06/24 07:14:24] ppsci INFO: train: epoch 1471 | step 20 | lr 0.000233 | loss 0.018630 | mae 0.103443 -[2024/06/24 07:14:24] ppsci INFO: train: epoch 1471 | step 30 | lr 0.000233 | loss 0.018681 | mae 0.102862 -[2024/06/24 07:14:25] ppsci INFO: train: epoch 1471 | step 38 | lr 0.000233 | loss 0.017245 | mae 0.095287 -[2024/06/24 07:14:25] ppsci INFO: epoch: 1471, train_loss: 0.026135, train_metric: 0.121035, eval_loss: 0.047005, eval_mae: 0.150751 -[2024/06/24 07:14:25] ppsci INFO: train: epoch 1472 | step 0 | lr 0.000233 | loss 0.029713 | mae 0.131219 -[2024/06/24 07:14:26] ppsci INFO: train: epoch 1472 | step 10 | lr 0.000233 | loss 0.023161 | mae 0.109752 -[2024/06/24 07:14:26] ppsci INFO: train: epoch 1472 | step 20 | lr 0.000233 | loss 0.016529 | mae 0.097300 -[2024/06/24 07:14:27] ppsci INFO: train: epoch 1472 | step 30 | lr 0.000233 | loss 0.023439 | mae 0.118405 -[2024/06/24 07:14:27] ppsci INFO: train: epoch 1472 | step 38 | lr 0.000233 | loss 0.018568 | mae 0.120891 -[2024/06/24 07:14:27] ppsci INFO: epoch: 1472, train_loss: 0.027156, train_metric: 0.120046, eval_loss: 0.050489, eval_mae: 0.149635 -[2024/06/24 07:14:27] ppsci INFO: train: epoch 1473 | step 0 | lr 0.000234 | loss 0.019975 | mae 0.104706 -[2024/06/24 07:14:28] ppsci INFO: train: epoch 1473 | step 10 | lr 0.000234 | loss 0.031140 | mae 0.127581 -[2024/06/24 07:14:28] ppsci INFO: train: epoch 1473 | step 20 | lr 0.000234 | loss 0.029125 | mae 0.105602 -[2024/06/24 07:14:29] ppsci INFO: train: epoch 1473 | step 30 | lr 0.000234 | loss 0.021397 | mae 0.115214 -[2024/06/24 07:14:29] ppsci INFO: train: epoch 1473 | step 38 | lr 0.000234 | loss 0.026400 | mae 0.133021 -[2024/06/24 07:14:29] ppsci INFO: epoch: 1473, train_loss: 0.025899, train_metric: 0.118099, eval_loss: 0.045143, eval_mae: 0.144722 -[2024/06/24 07:14:30] ppsci INFO: train: epoch 1474 | step 0 | lr 0.000235 | loss 0.038427 | mae 0.122306 -[2024/06/24 07:14:30] ppsci INFO: train: epoch 1474 | step 10 | lr 0.000235 | loss 0.019977 | mae 0.110601 -[2024/06/24 07:14:31] ppsci INFO: train: epoch 1474 | step 20 | lr 0.000235 | loss 0.021387 | mae 0.114878 -[2024/06/24 07:14:31] ppsci INFO: train: epoch 1474 | step 30 | lr 0.000235 | loss 0.025590 | mae 0.118512 -[2024/06/24 07:14:32] ppsci INFO: train: epoch 1474 | step 38 | lr 0.000235 | loss 0.021900 | mae 0.121771 -[2024/06/24 07:14:32] ppsci INFO: epoch: 1474, train_loss: 0.024194, train_metric: 0.116250, eval_loss: 0.048253, eval_mae: 0.146409 -[2024/06/24 07:14:32] ppsci INFO: train: epoch 1475 | step 0 | lr 0.000236 | loss 0.026451 | mae 0.112287 -[2024/06/24 07:14:32] ppsci INFO: train: epoch 1475 | step 10 | lr 0.000236 | loss 0.034696 | mae 0.127205 -[2024/06/24 07:14:33] ppsci INFO: train: epoch 1475 | step 20 | lr 0.000236 | loss 0.019228 | mae 0.110057 -[2024/06/24 07:14:33] ppsci INFO: train: epoch 1475 | step 30 | lr 0.000236 | loss 0.026187 | mae 0.129806 -[2024/06/24 07:14:34] ppsci INFO: train: epoch 1475 | step 38 | lr 0.000236 | loss 0.024974 | mae 0.125652 -[2024/06/24 07:14:34] ppsci INFO: epoch: 1475, train_loss: 0.026354, train_metric: 0.119247, eval_loss: 0.045599, eval_mae: 0.143354 -[2024/06/24 07:14:34] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:14:34] ppsci INFO: train: epoch 1476 | step 0 | lr 0.000237 | loss 0.021765 | mae 0.111845 -[2024/06/24 07:14:35] ppsci INFO: train: epoch 1476 | step 10 | lr 0.000237 | loss 0.023448 | mae 0.112440 -[2024/06/24 07:14:35] ppsci INFO: train: epoch 1476 | step 20 | lr 0.000237 | loss 0.022387 | mae 0.115687 -[2024/06/24 07:14:36] ppsci INFO: train: epoch 1476 | step 30 | lr 0.000237 | loss 0.030492 | mae 0.133830 -[2024/06/24 07:14:36] ppsci INFO: train: epoch 1476 | step 38 | lr 0.000237 | loss 0.030238 | mae 0.150313 -[2024/06/24 07:14:36] ppsci INFO: epoch: 1476, train_loss: 0.024968, train_metric: 0.117155, eval_loss: 0.048965, eval_mae: 0.149671 -[2024/06/24 07:14:36] ppsci INFO: train: epoch 1477 | step 0 | lr 0.000237 | loss 0.031655 | mae 0.128948 -[2024/06/24 07:14:37] ppsci INFO: train: epoch 1477 | step 10 | lr 0.000237 | loss 0.024849 | mae 0.119656 -[2024/06/24 07:14:37] ppsci INFO: train: epoch 1477 | step 20 | lr 0.000237 | loss 0.020135 | mae 0.109558 -[2024/06/24 07:14:38] ppsci INFO: train: epoch 1477 | step 30 | lr 0.000237 | loss 0.033377 | mae 0.135158 -[2024/06/24 07:14:38] ppsci INFO: train: epoch 1477 | step 38 | lr 0.000237 | loss 0.040833 | mae 0.154738 -[2024/06/24 07:14:38] ppsci INFO: epoch: 1477, train_loss: 0.027371, train_metric: 0.121386, eval_loss: 0.048778, eval_mae: 0.150772 -[2024/06/24 07:14:39] ppsci INFO: train: epoch 1478 | step 0 | lr 0.000238 | loss 0.031431 | mae 0.133016 -[2024/06/24 07:14:39] ppsci INFO: train: epoch 1478 | step 10 | lr 0.000238 | loss 0.033341 | mae 0.130011 -[2024/06/24 07:14:40] ppsci INFO: train: epoch 1478 | step 20 | lr 0.000238 | loss 0.029057 | mae 0.126217 -[2024/06/24 07:14:40] ppsci INFO: train: epoch 1478 | step 30 | lr 0.000238 | loss 0.020318 | mae 0.108369 -[2024/06/24 07:14:40] ppsci INFO: train: epoch 1478 | step 38 | lr 0.000238 | loss 0.011313 | mae 0.090473 -[2024/06/24 07:14:41] ppsci INFO: epoch: 1478, train_loss: 0.026513, train_metric: 0.120709, eval_loss: 0.041275, eval_mae: 0.142539 -[2024/06/24 07:14:41] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:14:41] ppsci INFO: train: epoch 1479 | step 0 | lr 0.000239 | loss 0.030239 | mae 0.121079 -[2024/06/24 07:14:41] ppsci INFO: train: epoch 1479 | step 10 | lr 0.000239 | loss 0.019441 | mae 0.105228 -[2024/06/24 07:14:42] ppsci INFO: train: epoch 1479 | step 20 | lr 0.000239 | loss 0.023421 | mae 0.114052 -[2024/06/24 07:14:42] ppsci INFO: train: epoch 1479 | step 30 | lr 0.000239 | loss 0.026795 | mae 0.122509 -[2024/06/24 07:14:43] ppsci INFO: train: epoch 1479 | step 38 | lr 0.000239 | loss 0.023921 | mae 0.128235 -[2024/06/24 07:14:43] ppsci INFO: epoch: 1479, train_loss: 0.025885, train_metric: 0.118768, eval_loss: 0.048666, eval_mae: 0.147517 -[2024/06/24 07:14:43] ppsci INFO: train: epoch 1480 | step 0 | lr 0.000240 | loss 0.021337 | mae 0.109470 -[2024/06/24 07:14:43] ppsci INFO: train: epoch 1480 | step 10 | lr 0.000240 | loss 0.021254 | mae 0.110226 -[2024/06/24 07:14:44] ppsci INFO: train: epoch 1480 | step 20 | lr 0.000240 | loss 0.018537 | mae 0.107194 -[2024/06/24 07:14:44] ppsci INFO: train: epoch 1480 | step 30 | lr 0.000240 | loss 0.022000 | mae 0.110847 -[2024/06/24 07:14:45] ppsci INFO: train: epoch 1480 | step 38 | lr 0.000240 | loss 0.016743 | mae 0.105490 -[2024/06/24 07:14:45] ppsci INFO: epoch: 1480, train_loss: 0.027459, train_metric: 0.119998, eval_loss: 0.046027, eval_mae: 0.149101 -[2024/06/24 07:14:45] ppsci INFO: train: epoch 1481 | step 0 | lr 0.000240 | loss 0.023789 | mae 0.117775 -[2024/06/24 07:14:45] ppsci INFO: train: epoch 1481 | step 10 | lr 0.000240 | loss 0.034637 | mae 0.129937 -[2024/06/24 07:14:46] ppsci INFO: train: epoch 1481 | step 20 | lr 0.000240 | loss 0.020537 | mae 0.110034 -[2024/06/24 07:14:47] ppsci INFO: train: epoch 1481 | step 30 | lr 0.000240 | loss 0.023160 | mae 0.117758 -[2024/06/24 07:14:47] ppsci INFO: train: epoch 1481 | step 38 | lr 0.000240 | loss 0.057301 | mae 0.173328 -[2024/06/24 07:14:47] ppsci INFO: epoch: 1481, train_loss: 0.026486, train_metric: 0.119513, eval_loss: 0.047162, eval_mae: 0.148928 -[2024/06/24 07:14:47] ppsci INFO: train: epoch 1482 | step 0 | lr 0.000241 | loss 0.018650 | mae 0.103710 -[2024/06/24 07:14:48] ppsci INFO: train: epoch 1482 | step 10 | lr 0.000241 | loss 0.026361 | mae 0.123823 -[2024/06/24 07:14:48] ppsci INFO: train: epoch 1482 | step 20 | lr 0.000241 | loss 0.033840 | mae 0.127042 -[2024/06/24 07:14:49] ppsci INFO: train: epoch 1482 | step 30 | lr 0.000241 | loss 0.021544 | mae 0.114156 -[2024/06/24 07:14:49] ppsci INFO: train: epoch 1482 | step 38 | lr 0.000241 | loss 0.004959 | mae 0.060693 -[2024/06/24 07:14:49] ppsci INFO: epoch: 1482, train_loss: 0.024687, train_metric: 0.116837, eval_loss: 0.046514, eval_mae: 0.148932 -[2024/06/24 07:14:49] ppsci INFO: train: epoch 1483 | step 0 | lr 0.000242 | loss 0.029828 | mae 0.124034 -[2024/06/24 07:14:50] ppsci INFO: train: epoch 1483 | step 10 | lr 0.000242 | loss 0.025723 | mae 0.113537 -[2024/06/24 07:14:50] ppsci INFO: train: epoch 1483 | step 20 | lr 0.000242 | loss 0.026072 | mae 0.116894 -[2024/06/24 07:14:51] ppsci INFO: train: epoch 1483 | step 30 | lr 0.000242 | loss 0.016504 | mae 0.094647 -[2024/06/24 07:14:51] ppsci INFO: train: epoch 1483 | step 38 | lr 0.000242 | loss 0.035835 | mae 0.130821 -[2024/06/24 07:14:51] ppsci INFO: epoch: 1483, train_loss: 0.025576, train_metric: 0.118210, eval_loss: 0.048254, eval_mae: 0.151007 -[2024/06/24 07:14:51] ppsci INFO: train: epoch 1484 | step 0 | lr 0.000243 | loss 0.024652 | mae 0.113789 -[2024/06/24 07:14:52] ppsci INFO: train: epoch 1484 | step 10 | lr 0.000243 | loss 0.020525 | mae 0.108301 -[2024/06/24 07:14:52] ppsci INFO: train: epoch 1484 | step 20 | lr 0.000243 | loss 0.027150 | mae 0.120163 -[2024/06/24 07:14:53] ppsci INFO: train: epoch 1484 | step 30 | lr 0.000243 | loss 0.018405 | mae 0.103963 -[2024/06/24 07:14:53] ppsci INFO: train: epoch 1484 | step 38 | lr 0.000243 | loss 0.026555 | mae 0.118005 -[2024/06/24 07:14:53] ppsci INFO: epoch: 1484, train_loss: 0.026382, train_metric: 0.119571, eval_loss: 0.045086, eval_mae: 0.148132 -[2024/06/24 07:14:53] ppsci INFO: train: epoch 1485 | step 0 | lr 0.000243 | loss 0.026129 | mae 0.121663 -[2024/06/24 07:14:54] ppsci INFO: train: epoch 1485 | step 10 | lr 0.000243 | loss 0.044318 | mae 0.139348 -[2024/06/24 07:14:54] ppsci INFO: train: epoch 1485 | step 20 | lr 0.000243 | loss 0.031140 | mae 0.123880 -[2024/06/24 07:14:55] ppsci INFO: train: epoch 1485 | step 30 | lr 0.000243 | loss 0.017447 | mae 0.108325 -[2024/06/24 07:14:55] ppsci INFO: train: epoch 1485 | step 38 | lr 0.000243 | loss 0.007754 | mae 0.074114 -[2024/06/24 07:14:55] ppsci INFO: epoch: 1485, train_loss: 0.026674, train_metric: 0.120320, eval_loss: 0.046486, eval_mae: 0.146374 -[2024/06/24 07:14:56] ppsci INFO: train: epoch 1486 | step 0 | lr 0.000244 | loss 0.027552 | mae 0.125449 -[2024/06/24 07:14:56] ppsci INFO: train: epoch 1486 | step 10 | lr 0.000244 | loss 0.033999 | mae 0.136171 -[2024/06/24 07:14:57] ppsci INFO: train: epoch 1486 | step 20 | lr 0.000244 | loss 0.028816 | mae 0.124066 -[2024/06/24 07:14:57] ppsci INFO: train: epoch 1486 | step 30 | lr 0.000244 | loss 0.028807 | mae 0.124955 -[2024/06/24 07:14:57] ppsci INFO: train: epoch 1486 | step 38 | lr 0.000244 | loss 0.041588 | mae 0.120923 -[2024/06/24 07:14:58] ppsci INFO: epoch: 1486, train_loss: 0.027128, train_metric: 0.119927, eval_loss: 0.049012, eval_mae: 0.153144 -[2024/06/24 07:14:58] ppsci INFO: train: epoch 1487 | step 0 | lr 0.000245 | loss 0.020970 | mae 0.112203 -[2024/06/24 07:14:58] ppsci INFO: train: epoch 1487 | step 10 | lr 0.000245 | loss 0.024605 | mae 0.119335 -[2024/06/24 07:14:59] ppsci INFO: train: epoch 1487 | step 20 | lr 0.000245 | loss 0.022527 | mae 0.108812 -[2024/06/24 07:14:59] ppsci INFO: train: epoch 1487 | step 30 | lr 0.000245 | loss 0.035072 | mae 0.139920 -[2024/06/24 07:15:00] ppsci INFO: train: epoch 1487 | step 38 | lr 0.000245 | loss 0.018689 | mae 0.105857 -[2024/06/24 07:15:00] ppsci INFO: epoch: 1487, train_loss: 0.027401, train_metric: 0.122896, eval_loss: 0.049205, eval_mae: 0.148272 -[2024/06/24 07:15:00] ppsci INFO: train: epoch 1488 | step 0 | lr 0.000246 | loss 0.017499 | mae 0.102192 -[2024/06/24 07:15:00] ppsci INFO: train: epoch 1488 | step 10 | lr 0.000246 | loss 0.035502 | mae 0.136024 -[2024/06/24 07:15:01] ppsci INFO: train: epoch 1488 | step 20 | lr 0.000246 | loss 0.028568 | mae 0.125997 -[2024/06/24 07:15:01] ppsci INFO: train: epoch 1488 | step 30 | lr 0.000246 | loss 0.024804 | mae 0.121045 -[2024/06/24 07:15:02] ppsci INFO: train: epoch 1488 | step 38 | lr 0.000246 | loss 0.051834 | mae 0.181201 -[2024/06/24 07:15:02] ppsci INFO: epoch: 1488, train_loss: 0.026604, train_metric: 0.118696, eval_loss: 0.049530, eval_mae: 0.148642 -[2024/06/24 07:15:02] ppsci INFO: train: epoch 1489 | step 0 | lr 0.000247 | loss 0.026095 | mae 0.117299 -[2024/06/24 07:15:02] ppsci INFO: train: epoch 1489 | step 10 | lr 0.000247 | loss 0.018246 | mae 0.103006 -[2024/06/24 07:15:03] ppsci INFO: train: epoch 1489 | step 20 | lr 0.000247 | loss 0.029342 | mae 0.125232 -[2024/06/24 07:15:03] ppsci INFO: train: epoch 1489 | step 30 | lr 0.000247 | loss 0.033341 | mae 0.133518 -[2024/06/24 07:15:04] ppsci INFO: train: epoch 1489 | step 38 | lr 0.000247 | loss 0.008764 | mae 0.083942 -[2024/06/24 07:15:04] ppsci INFO: epoch: 1489, train_loss: 0.026945, train_metric: 0.120932, eval_loss: 0.042918, eval_mae: 0.144108 -[2024/06/24 07:15:04] ppsci INFO: train: epoch 1490 | step 0 | lr 0.000247 | loss 0.021912 | mae 0.113001 -[2024/06/24 07:15:04] ppsci INFO: train: epoch 1490 | step 10 | lr 0.000247 | loss 0.020560 | mae 0.112447 -[2024/06/24 07:15:05] ppsci INFO: train: epoch 1490 | step 20 | lr 0.000247 | loss 0.028184 | mae 0.122954 -[2024/06/24 07:15:05] ppsci INFO: train: epoch 1490 | step 30 | lr 0.000247 | loss 0.021985 | mae 0.112507 -[2024/06/24 07:15:06] ppsci INFO: train: epoch 1490 | step 38 | lr 0.000247 | loss 0.020122 | mae 0.089208 -[2024/06/24 07:15:06] ppsci INFO: epoch: 1490, train_loss: 0.024943, train_metric: 0.118107, eval_loss: 0.043204, eval_mae: 0.144289 -[2024/06/24 07:15:06] ppsci INFO: train: epoch 1491 | step 0 | lr 0.000248 | loss 0.020215 | mae 0.109188 -[2024/06/24 07:15:07] ppsci INFO: train: epoch 1491 | step 10 | lr 0.000248 | loss 0.025160 | mae 0.119747 -[2024/06/24 07:15:07] ppsci INFO: train: epoch 1491 | step 20 | lr 0.000248 | loss 0.024687 | mae 0.126855 -[2024/06/24 07:15:08] ppsci INFO: train: epoch 1491 | step 30 | lr 0.000248 | loss 0.036117 | mae 0.134610 -[2024/06/24 07:15:08] ppsci INFO: train: epoch 1491 | step 38 | lr 0.000248 | loss 0.094347 | mae 0.185023 -[2024/06/24 07:15:08] ppsci INFO: epoch: 1491, train_loss: 0.029681, train_metric: 0.122184, eval_loss: 0.044231, eval_mae: 0.142412 -[2024/06/24 07:15:08] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:15:08] ppsci INFO: train: epoch 1492 | step 0 | lr 0.000249 | loss 0.021140 | mae 0.114479 -[2024/06/24 07:15:09] ppsci INFO: train: epoch 1492 | step 10 | lr 0.000249 | loss 0.027664 | mae 0.123945 -[2024/06/24 07:15:09] ppsci INFO: train: epoch 1492 | step 20 | lr 0.000249 | loss 0.027829 | mae 0.128416 -[2024/06/24 07:15:10] ppsci INFO: train: epoch 1492 | step 30 | lr 0.000249 | loss 0.025493 | mae 0.121629 -[2024/06/24 07:15:10] ppsci INFO: train: epoch 1492 | step 38 | lr 0.000249 | loss 0.014590 | mae 0.095813 -[2024/06/24 07:15:10] ppsci INFO: epoch: 1492, train_loss: 0.024944, train_metric: 0.118209, eval_loss: 0.044364, eval_mae: 0.146273 -[2024/06/24 07:15:10] ppsci INFO: train: epoch 1493 | step 0 | lr 0.000250 | loss 0.042909 | mae 0.143481 -[2024/06/24 07:15:11] ppsci INFO: train: epoch 1493 | step 10 | lr 0.000250 | loss 0.018395 | mae 0.098094 -[2024/06/24 07:15:11] ppsci INFO: train: epoch 1493 | step 20 | lr 0.000250 | loss 0.019935 | mae 0.110350 -[2024/06/24 07:15:12] ppsci INFO: train: epoch 1493 | step 30 | lr 0.000250 | loss 0.025303 | mae 0.120987 -[2024/06/24 07:15:13] ppsci INFO: train: epoch 1493 | step 38 | lr 0.000250 | loss 0.010983 | mae 0.086930 -[2024/06/24 07:15:13] ppsci INFO: epoch: 1493, train_loss: 0.025985, train_metric: 0.119297, eval_loss: 0.047782, eval_mae: 0.148985 -[2024/06/24 07:15:13] ppsci INFO: train: epoch 1494 | step 0 | lr 0.000250 | loss 0.023201 | mae 0.108161 -[2024/06/24 07:15:13] ppsci INFO: train: epoch 1494 | step 10 | lr 0.000250 | loss 0.020007 | mae 0.108807 -[2024/06/24 07:15:14] ppsci INFO: train: epoch 1494 | step 20 | lr 0.000250 | loss 0.025933 | mae 0.116508 -[2024/06/24 07:15:14] ppsci INFO: train: epoch 1494 | step 30 | lr 0.000250 | loss 0.023167 | mae 0.122217 -[2024/06/24 07:15:15] ppsci INFO: train: epoch 1494 | step 38 | lr 0.000250 | loss 0.035061 | mae 0.150078 -[2024/06/24 07:15:15] ppsci INFO: epoch: 1494, train_loss: 0.027807, train_metric: 0.120666, eval_loss: 0.045979, eval_mae: 0.149270 -[2024/06/24 07:15:15] ppsci INFO: train: epoch 1495 | step 0 | lr 0.000251 | loss 0.022773 | mae 0.117915 -[2024/06/24 07:15:16] ppsci INFO: train: epoch 1495 | step 10 | lr 0.000251 | loss 0.021948 | mae 0.112071 -[2024/06/24 07:15:16] ppsci INFO: train: epoch 1495 | step 20 | lr 0.000251 | loss 0.021790 | mae 0.109003 -[2024/06/24 07:15:17] ppsci INFO: train: epoch 1495 | step 30 | lr 0.000251 | loss 0.027841 | mae 0.125677 -[2024/06/24 07:15:17] ppsci INFO: train: epoch 1495 | step 38 | lr 0.000251 | loss 0.016042 | mae 0.105772 -[2024/06/24 07:15:17] ppsci INFO: epoch: 1495, train_loss: 0.026582, train_metric: 0.121185, eval_loss: 0.050142, eval_mae: 0.152007 -[2024/06/24 07:15:17] ppsci INFO: train: epoch 1496 | step 0 | lr 0.000252 | loss 0.028303 | mae 0.125699 -[2024/06/24 07:15:18] ppsci INFO: train: epoch 1496 | step 10 | lr 0.000252 | loss 0.024913 | mae 0.122136 -[2024/06/24 07:15:18] ppsci INFO: train: epoch 1496 | step 20 | lr 0.000252 | loss 0.018861 | mae 0.107853 -[2024/06/24 07:15:19] ppsci INFO: train: epoch 1496 | step 30 | lr 0.000252 | loss 0.039728 | mae 0.135755 -[2024/06/24 07:15:19] ppsci INFO: train: epoch 1496 | step 38 | lr 0.000252 | loss 0.015257 | mae 0.103729 -[2024/06/24 07:15:19] ppsci INFO: epoch: 1496, train_loss: 0.026721, train_metric: 0.119537, eval_loss: 0.048481, eval_mae: 0.146265 -[2024/06/24 07:15:19] ppsci INFO: train: epoch 1497 | step 0 | lr 0.000253 | loss 0.027002 | mae 0.117139 -[2024/06/24 07:15:20] ppsci INFO: train: epoch 1497 | step 10 | lr 0.000253 | loss 0.031355 | mae 0.127799 -[2024/06/24 07:15:21] ppsci INFO: train: epoch 1497 | step 20 | lr 0.000253 | loss 0.024040 | mae 0.113861 -[2024/06/24 07:15:21] ppsci INFO: train: epoch 1497 | step 30 | lr 0.000253 | loss 0.021374 | mae 0.112921 -[2024/06/24 07:15:21] ppsci INFO: train: epoch 1497 | step 38 | lr 0.000253 | loss 0.036608 | mae 0.146305 -[2024/06/24 07:15:21] ppsci INFO: epoch: 1497, train_loss: 0.026629, train_metric: 0.117710, eval_loss: 0.047135, eval_mae: 0.148396 -[2024/06/24 07:15:22] ppsci INFO: train: epoch 1498 | step 0 | lr 0.000253 | loss 0.030792 | mae 0.130355 -[2024/06/24 07:15:22] ppsci INFO: train: epoch 1498 | step 10 | lr 0.000253 | loss 0.033012 | mae 0.129890 -[2024/06/24 07:15:23] ppsci INFO: train: epoch 1498 | step 20 | lr 0.000253 | loss 0.024865 | mae 0.118164 -[2024/06/24 07:15:23] ppsci INFO: train: epoch 1498 | step 30 | lr 0.000253 | loss 0.029027 | mae 0.116248 -[2024/06/24 07:15:23] ppsci INFO: train: epoch 1498 | step 38 | lr 0.000253 | loss 0.037168 | mae 0.141976 -[2024/06/24 07:15:24] ppsci INFO: epoch: 1498, train_loss: 0.027496, train_metric: 0.121863, eval_loss: 0.048710, eval_mae: 0.144571 -[2024/06/24 07:15:24] ppsci INFO: train: epoch 1499 | step 0 | lr 0.000254 | loss 0.017367 | mae 0.103258 -[2024/06/24 07:15:24] ppsci INFO: train: epoch 1499 | step 10 | lr 0.000254 | loss 0.020217 | mae 0.109955 -[2024/06/24 07:15:25] ppsci INFO: train: epoch 1499 | step 20 | lr 0.000254 | loss 0.026122 | mae 0.123661 -[2024/06/24 07:15:25] ppsci INFO: train: epoch 1499 | step 30 | lr 0.000254 | loss 0.026689 | mae 0.123851 -[2024/06/24 07:15:26] ppsci INFO: train: epoch 1499 | step 38 | lr 0.000254 | loss 0.012185 | mae 0.092429 -[2024/06/24 07:15:26] ppsci INFO: epoch: 1499, train_loss: 0.024980, train_metric: 0.117091, eval_loss: 0.046760, eval_mae: 0.147503 -[2024/06/24 07:15:26] ppsci INFO: train: epoch 1500 | step 0 | lr 0.000255 | loss 0.027088 | mae 0.114616 -[2024/06/24 07:15:26] ppsci INFO: train: epoch 1500 | step 10 | lr 0.000255 | loss 0.027196 | mae 0.119531 -[2024/06/24 07:15:27] ppsci INFO: train: epoch 1500 | step 20 | lr 0.000255 | loss 0.021868 | mae 0.112203 -[2024/06/24 07:15:28] ppsci INFO: train: epoch 1500 | step 30 | lr 0.000255 | loss 0.027053 | mae 0.121979 -[2024/06/24 07:15:28] ppsci INFO: train: epoch 1500 | step 38 | lr 0.000255 | loss 0.020779 | mae 0.114046 -[2024/06/24 07:15:28] ppsci INFO: epoch: 1500, train_loss: 0.025507, train_metric: 0.117873, eval_loss: 0.045567, eval_mae: 0.148776 -[2024/06/24 07:15:28] ppsci INFO: train: epoch 1501 | step 0 | lr 0.000256 | loss 0.042144 | mae 0.137280 -[2024/06/24 07:15:29] ppsci INFO: train: epoch 1501 | step 10 | lr 0.000256 | loss 0.023491 | mae 0.111036 -[2024/06/24 07:15:29] ppsci INFO: train: epoch 1501 | step 20 | lr 0.000256 | loss 0.015206 | mae 0.098525 -[2024/06/24 07:15:30] ppsci INFO: train: epoch 1501 | step 30 | lr 0.000256 | loss 0.020611 | mae 0.112620 -[2024/06/24 07:15:30] ppsci INFO: train: epoch 1501 | step 38 | lr 0.000256 | loss 0.015520 | mae 0.083928 -[2024/06/24 07:15:30] ppsci INFO: epoch: 1501, train_loss: 0.026162, train_metric: 0.120302, eval_loss: 0.043241, eval_mae: 0.144689 -[2024/06/24 07:15:30] ppsci INFO: train: epoch 1502 | step 0 | lr 0.000257 | loss 0.023792 | mae 0.114395 -[2024/06/24 07:15:31] ppsci INFO: train: epoch 1502 | step 10 | lr 0.000257 | loss 0.025822 | mae 0.120578 -[2024/06/24 07:15:31] ppsci INFO: train: epoch 1502 | step 20 | lr 0.000257 | loss 0.029800 | mae 0.131469 -[2024/06/24 07:15:32] ppsci INFO: train: epoch 1502 | step 30 | lr 0.000257 | loss 0.029689 | mae 0.131809 -[2024/06/24 07:15:32] ppsci INFO: train: epoch 1502 | step 38 | lr 0.000257 | loss 0.021582 | mae 0.098106 -[2024/06/24 07:15:32] ppsci INFO: epoch: 1502, train_loss: 0.028107, train_metric: 0.125038, eval_loss: 0.042932, eval_mae: 0.146687 -[2024/06/24 07:15:32] ppsci INFO: train: epoch 1503 | step 0 | lr 0.000257 | loss 0.021324 | mae 0.108978 -[2024/06/24 07:15:33] ppsci INFO: train: epoch 1503 | step 10 | lr 0.000257 | loss 0.030289 | mae 0.125462 -[2024/06/24 07:15:33] ppsci INFO: train: epoch 1503 | step 20 | lr 0.000257 | loss 0.024930 | mae 0.124183 -[2024/06/24 07:15:34] ppsci INFO: train: epoch 1503 | step 30 | lr 0.000257 | loss 0.020269 | mae 0.104313 -[2024/06/24 07:15:34] ppsci INFO: train: epoch 1503 | step 38 | lr 0.000257 | loss 0.042605 | mae 0.153124 -[2024/06/24 07:15:34] ppsci INFO: epoch: 1503, train_loss: 0.029217, train_metric: 0.124306, eval_loss: 0.055511, eval_mae: 0.156712 -[2024/06/24 07:15:34] ppsci INFO: train: epoch 1504 | step 0 | lr 0.000258 | loss 0.020381 | mae 0.109441 -[2024/06/24 07:15:35] ppsci INFO: train: epoch 1504 | step 10 | lr 0.000258 | loss 0.016388 | mae 0.096676 -[2024/06/24 07:15:36] ppsci INFO: train: epoch 1504 | step 20 | lr 0.000258 | loss 0.028405 | mae 0.124727 -[2024/06/24 07:15:36] ppsci INFO: train: epoch 1504 | step 30 | lr 0.000258 | loss 0.029626 | mae 0.133842 -[2024/06/24 07:15:36] ppsci INFO: train: epoch 1504 | step 38 | lr 0.000258 | loss 0.034805 | mae 0.142470 -[2024/06/24 07:15:36] ppsci INFO: epoch: 1504, train_loss: 0.028251, train_metric: 0.122345, eval_loss: 0.047846, eval_mae: 0.147637 -[2024/06/24 07:15:37] ppsci INFO: train: epoch 1505 | step 0 | lr 0.000259 | loss 0.029044 | mae 0.122934 -[2024/06/24 07:15:37] ppsci INFO: train: epoch 1505 | step 10 | lr 0.000259 | loss 0.047764 | mae 0.129378 -[2024/06/24 07:15:38] ppsci INFO: train: epoch 1505 | step 20 | lr 0.000259 | loss 0.021530 | mae 0.112318 -[2024/06/24 07:15:38] ppsci INFO: train: epoch 1505 | step 30 | lr 0.000259 | loss 0.025456 | mae 0.111961 -[2024/06/24 07:15:38] ppsci INFO: train: epoch 1505 | step 38 | lr 0.000259 | loss 0.016732 | mae 0.108200 -[2024/06/24 07:15:39] ppsci INFO: epoch: 1505, train_loss: 0.026592, train_metric: 0.119379, eval_loss: 0.051670, eval_mae: 0.149753 -[2024/06/24 07:15:39] ppsci INFO: train: epoch 1506 | step 0 | lr 0.000260 | loss 0.022262 | mae 0.114240 -[2024/06/24 07:15:39] ppsci INFO: train: epoch 1506 | step 10 | lr 0.000260 | loss 0.033722 | mae 0.133886 -[2024/06/24 07:15:40] ppsci INFO: train: epoch 1506 | step 20 | lr 0.000260 | loss 0.033891 | mae 0.139811 -[2024/06/24 07:15:40] ppsci INFO: train: epoch 1506 | step 30 | lr 0.000260 | loss 0.021752 | mae 0.111700 -[2024/06/24 07:15:41] ppsci INFO: train: epoch 1506 | step 38 | lr 0.000260 | loss 0.044992 | mae 0.141999 -[2024/06/24 07:15:41] ppsci INFO: epoch: 1506, train_loss: 0.026131, train_metric: 0.116719, eval_loss: 0.045118, eval_mae: 0.147469 -[2024/06/24 07:15:41] ppsci INFO: train: epoch 1507 | step 0 | lr 0.000260 | loss 0.026807 | mae 0.126306 -[2024/06/24 07:15:41] ppsci INFO: train: epoch 1507 | step 10 | lr 0.000260 | loss 0.026961 | mae 0.121118 -[2024/06/24 07:15:42] ppsci INFO: train: epoch 1507 | step 20 | lr 0.000260 | loss 0.027657 | mae 0.118149 -[2024/06/24 07:15:42] ppsci INFO: train: epoch 1507 | step 30 | lr 0.000260 | loss 0.025939 | mae 0.122031 -[2024/06/24 07:15:42] ppsci INFO: train: epoch 1507 | step 38 | lr 0.000260 | loss 0.015006 | mae 0.083271 -[2024/06/24 07:15:43] ppsci INFO: epoch: 1507, train_loss: 0.025721, train_metric: 0.118304, eval_loss: 0.047910, eval_mae: 0.147940 -[2024/06/24 07:15:43] ppsci INFO: train: epoch 1508 | step 0 | lr 0.000261 | loss 0.026902 | mae 0.112930 -[2024/06/24 07:15:43] ppsci INFO: train: epoch 1508 | step 10 | lr 0.000261 | loss 0.018887 | mae 0.098914 -[2024/06/24 07:15:44] ppsci INFO: train: epoch 1508 | step 20 | lr 0.000261 | loss 0.021815 | mae 0.116822 -[2024/06/24 07:15:44] ppsci INFO: train: epoch 1508 | step 30 | lr 0.000261 | loss 0.018081 | mae 0.105204 -[2024/06/24 07:15:45] ppsci INFO: train: epoch 1508 | step 38 | lr 0.000261 | loss 0.062771 | mae 0.191111 -[2024/06/24 07:15:45] ppsci INFO: epoch: 1508, train_loss: 0.026546, train_metric: 0.116741, eval_loss: 0.056013, eval_mae: 0.154623 -[2024/06/24 07:15:45] ppsci INFO: train: epoch 1509 | step 0 | lr 0.000262 | loss 0.029846 | mae 0.132504 -[2024/06/24 07:15:45] ppsci INFO: train: epoch 1509 | step 10 | lr 0.000262 | loss 0.027433 | mae 0.121631 -[2024/06/24 07:15:46] ppsci INFO: train: epoch 1509 | step 20 | lr 0.000262 | loss 0.022095 | mae 0.112859 -[2024/06/24 07:15:46] ppsci INFO: train: epoch 1509 | step 30 | lr 0.000262 | loss 0.024226 | mae 0.120734 -[2024/06/24 07:15:47] ppsci INFO: train: epoch 1509 | step 38 | lr 0.000262 | loss 0.015858 | mae 0.106585 -[2024/06/24 07:15:47] ppsci INFO: epoch: 1509, train_loss: 0.025316, train_metric: 0.117888, eval_loss: 0.048758, eval_mae: 0.149067 -[2024/06/24 07:15:47] ppsci INFO: train: epoch 1510 | step 0 | lr 0.000263 | loss 0.032276 | mae 0.135203 -[2024/06/24 07:15:48] ppsci INFO: train: epoch 1510 | step 10 | lr 0.000263 | loss 0.022714 | mae 0.118955 -[2024/06/24 07:15:48] ppsci INFO: train: epoch 1510 | step 20 | lr 0.000263 | loss 0.027473 | mae 0.120038 -[2024/06/24 07:15:49] ppsci INFO: train: epoch 1510 | step 30 | lr 0.000263 | loss 0.031413 | mae 0.135802 -[2024/06/24 07:15:49] ppsci INFO: train: epoch 1510 | step 38 | lr 0.000263 | loss 0.016807 | mae 0.112755 -[2024/06/24 07:15:49] ppsci INFO: epoch: 1510, train_loss: 0.026291, train_metric: 0.119622, eval_loss: 0.046946, eval_mae: 0.149911 -[2024/06/24 07:15:49] ppsci INFO: train: epoch 1511 | step 0 | lr 0.000263 | loss 0.022754 | mae 0.115967 -[2024/06/24 07:15:50] ppsci INFO: train: epoch 1511 | step 10 | lr 0.000263 | loss 0.020053 | mae 0.107032 -[2024/06/24 07:15:50] ppsci INFO: train: epoch 1511 | step 20 | lr 0.000263 | loss 0.015969 | mae 0.098346 -[2024/06/24 07:15:51] ppsci INFO: train: epoch 1511 | step 30 | lr 0.000263 | loss 0.019088 | mae 0.105741 -[2024/06/24 07:15:51] ppsci INFO: train: epoch 1511 | step 38 | lr 0.000263 | loss 0.017694 | mae 0.109597 -[2024/06/24 07:15:51] ppsci INFO: epoch: 1511, train_loss: 0.025539, train_metric: 0.118793, eval_loss: 0.051739, eval_mae: 0.150664 -[2024/06/24 07:15:51] ppsci INFO: train: epoch 1512 | step 0 | lr 0.000264 | loss 0.017979 | mae 0.097509 -[2024/06/24 07:15:52] ppsci INFO: train: epoch 1512 | step 10 | lr 0.000264 | loss 0.030196 | mae 0.127633 -[2024/06/24 07:15:52] ppsci INFO: train: epoch 1512 | step 20 | lr 0.000264 | loss 0.030657 | mae 0.124161 -[2024/06/24 07:15:53] ppsci INFO: train: epoch 1512 | step 30 | lr 0.000264 | loss 0.024751 | mae 0.115774 -[2024/06/24 07:15:53] ppsci INFO: train: epoch 1512 | step 38 | lr 0.000264 | loss 0.005559 | mae 0.065793 -[2024/06/24 07:15:53] ppsci INFO: epoch: 1512, train_loss: 0.025417, train_metric: 0.118025, eval_loss: 0.049296, eval_mae: 0.150264 -[2024/06/24 07:15:53] ppsci INFO: train: epoch 1513 | step 0 | lr 0.000265 | loss 0.023780 | mae 0.117619 -[2024/06/24 07:15:54] ppsci INFO: train: epoch 1513 | step 10 | lr 0.000265 | loss 0.031045 | mae 0.123916 -[2024/06/24 07:15:54] ppsci INFO: train: epoch 1513 | step 20 | lr 0.000265 | loss 0.032956 | mae 0.129673 -[2024/06/24 07:15:55] ppsci INFO: train: epoch 1513 | step 30 | lr 0.000265 | loss 0.020486 | mae 0.105911 -[2024/06/24 07:15:55] ppsci INFO: train: epoch 1513 | step 38 | lr 0.000265 | loss 0.032369 | mae 0.131026 -[2024/06/24 07:15:55] ppsci INFO: epoch: 1513, train_loss: 0.025814, train_metric: 0.116853, eval_loss: 0.047016, eval_mae: 0.147388 -[2024/06/24 07:15:55] ppsci INFO: train: epoch 1514 | step 0 | lr 0.000266 | loss 0.021024 | mae 0.112375 -[2024/06/24 07:15:56] ppsci INFO: train: epoch 1514 | step 10 | lr 0.000266 | loss 0.027271 | mae 0.120962 -[2024/06/24 07:15:56] ppsci INFO: train: epoch 1514 | step 20 | lr 0.000266 | loss 0.029381 | mae 0.128493 -[2024/06/24 07:15:57] ppsci INFO: train: epoch 1514 | step 30 | lr 0.000266 | loss 0.029157 | mae 0.133211 -[2024/06/24 07:15:57] ppsci INFO: train: epoch 1514 | step 38 | lr 0.000266 | loss 0.020315 | mae 0.124118 -[2024/06/24 07:15:58] ppsci INFO: epoch: 1514, train_loss: 0.026370, train_metric: 0.119530, eval_loss: 0.043960, eval_mae: 0.143917 -[2024/06/24 07:15:58] ppsci INFO: train: epoch 1515 | step 0 | lr 0.000267 | loss 0.023894 | mae 0.119733 -[2024/06/24 07:15:58] ppsci INFO: train: epoch 1515 | step 10 | lr 0.000267 | loss 0.026193 | mae 0.121759 -[2024/06/24 07:15:59] ppsci INFO: train: epoch 1515 | step 20 | lr 0.000267 | loss 0.026328 | mae 0.121741 -[2024/06/24 07:15:59] ppsci INFO: train: epoch 1515 | step 30 | lr 0.000267 | loss 0.030180 | mae 0.124428 -[2024/06/24 07:16:00] ppsci INFO: train: epoch 1515 | step 38 | lr 0.000267 | loss 0.032731 | mae 0.132915 -[2024/06/24 07:16:00] ppsci INFO: epoch: 1515, train_loss: 0.025672, train_metric: 0.118828, eval_loss: 0.044590, eval_mae: 0.144877 -[2024/06/24 07:16:00] ppsci INFO: train: epoch 1516 | step 0 | lr 0.000267 | loss 0.032025 | mae 0.128097 -[2024/06/24 07:16:00] ppsci INFO: train: epoch 1516 | step 10 | lr 0.000267 | loss 0.032804 | mae 0.126312 -[2024/06/24 07:16:01] ppsci INFO: train: epoch 1516 | step 20 | lr 0.000267 | loss 0.032262 | mae 0.134675 -[2024/06/24 07:16:01] ppsci INFO: train: epoch 1516 | step 30 | lr 0.000267 | loss 0.029064 | mae 0.128592 -[2024/06/24 07:16:02] ppsci INFO: train: epoch 1516 | step 38 | lr 0.000267 | loss 0.030130 | mae 0.134129 -[2024/06/24 07:16:02] ppsci INFO: epoch: 1516, train_loss: 0.026441, train_metric: 0.119951, eval_loss: 0.041897, eval_mae: 0.143652 -[2024/06/24 07:16:02] ppsci INFO: train: epoch 1517 | step 0 | lr 0.000268 | loss 0.025004 | mae 0.113683 -[2024/06/24 07:16:02] ppsci INFO: train: epoch 1517 | step 10 | lr 0.000268 | loss 0.026557 | mae 0.119765 -[2024/06/24 07:16:03] ppsci INFO: train: epoch 1517 | step 20 | lr 0.000268 | loss 0.025071 | mae 0.121967 -[2024/06/24 07:16:03] ppsci INFO: train: epoch 1517 | step 30 | lr 0.000268 | loss 0.027607 | mae 0.128371 -[2024/06/24 07:16:04] ppsci INFO: train: epoch 1517 | step 38 | lr 0.000268 | loss 0.025538 | mae 0.140523 -[2024/06/24 07:16:04] ppsci INFO: epoch: 1517, train_loss: 0.025102, train_metric: 0.118114, eval_loss: 0.048602, eval_mae: 0.144235 -[2024/06/24 07:16:04] ppsci INFO: train: epoch 1518 | step 0 | lr 0.000269 | loss 0.032692 | mae 0.125645 -[2024/06/24 07:16:05] ppsci INFO: train: epoch 1518 | step 10 | lr 0.000269 | loss 0.024241 | mae 0.122113 -[2024/06/24 07:16:05] ppsci INFO: train: epoch 1518 | step 20 | lr 0.000269 | loss 0.027878 | mae 0.121358 -[2024/06/24 07:16:06] ppsci INFO: train: epoch 1518 | step 30 | lr 0.000269 | loss 0.030751 | mae 0.132618 -[2024/06/24 07:16:06] ppsci INFO: train: epoch 1518 | step 38 | lr 0.000269 | loss 0.031419 | mae 0.138927 -[2024/06/24 07:16:06] ppsci INFO: epoch: 1518, train_loss: 0.026838, train_metric: 0.119702, eval_loss: 0.048531, eval_mae: 0.145615 -[2024/06/24 07:16:06] ppsci INFO: train: epoch 1519 | step 0 | lr 0.000270 | loss 0.020127 | mae 0.104433 -[2024/06/24 07:16:07] ppsci INFO: train: epoch 1519 | step 10 | lr 0.000270 | loss 0.023503 | mae 0.118765 -[2024/06/24 07:16:07] ppsci INFO: train: epoch 1519 | step 20 | lr 0.000270 | loss 0.030447 | mae 0.121535 -[2024/06/24 07:16:08] ppsci INFO: train: epoch 1519 | step 30 | lr 0.000270 | loss 0.021676 | mae 0.114765 -[2024/06/24 07:16:08] ppsci INFO: train: epoch 1519 | step 38 | lr 0.000270 | loss 0.033756 | mae 0.146081 -[2024/06/24 07:16:08] ppsci INFO: epoch: 1519, train_loss: 0.024691, train_metric: 0.116610, eval_loss: 0.046574, eval_mae: 0.146968 -[2024/06/24 07:16:08] ppsci INFO: train: epoch 1520 | step 0 | lr 0.000270 | loss 0.023154 | mae 0.114386 -[2024/06/24 07:16:09] ppsci INFO: train: epoch 1520 | step 10 | lr 0.000270 | loss 0.025863 | mae 0.122762 -[2024/06/24 07:16:09] ppsci INFO: train: epoch 1520 | step 20 | lr 0.000270 | loss 0.016856 | mae 0.104036 -[2024/06/24 07:16:10] ppsci INFO: train: epoch 1520 | step 30 | lr 0.000270 | loss 0.032186 | mae 0.125408 -[2024/06/24 07:16:10] ppsci INFO: train: epoch 1520 | step 38 | lr 0.000270 | loss 0.011072 | mae 0.075110 -[2024/06/24 07:16:10] ppsci INFO: epoch: 1520, train_loss: 0.024323, train_metric: 0.117570, eval_loss: 0.047070, eval_mae: 0.144829 -[2024/06/24 07:16:10] ppsci INFO: train: epoch 1521 | step 0 | lr 0.000271 | loss 0.023841 | mae 0.107164 -[2024/06/24 07:16:11] ppsci INFO: train: epoch 1521 | step 10 | lr 0.000271 | loss 0.026080 | mae 0.121190 -[2024/06/24 07:16:11] ppsci INFO: train: epoch 1521 | step 20 | lr 0.000271 | loss 0.028980 | mae 0.127561 -[2024/06/24 07:16:12] ppsci INFO: train: epoch 1521 | step 30 | lr 0.000271 | loss 0.021840 | mae 0.118249 -[2024/06/24 07:16:12] ppsci INFO: train: epoch 1521 | step 38 | lr 0.000271 | loss 0.188951 | mae 0.232089 -[2024/06/24 07:16:13] ppsci INFO: epoch: 1521, train_loss: 0.029104, train_metric: 0.116276, eval_loss: 0.045485, eval_mae: 0.146737 -[2024/06/24 07:16:13] ppsci INFO: train: epoch 1522 | step 0 | lr 0.000272 | loss 0.032646 | mae 0.127806 -[2024/06/24 07:16:13] ppsci INFO: train: epoch 1522 | step 10 | lr 0.000272 | loss 0.025304 | mae 0.125387 -[2024/06/24 07:16:14] ppsci INFO: train: epoch 1522 | step 20 | lr 0.000272 | loss 0.021705 | mae 0.102368 -[2024/06/24 07:16:14] ppsci INFO: train: epoch 1522 | step 30 | lr 0.000272 | loss 0.037534 | mae 0.138874 -[2024/06/24 07:16:15] ppsci INFO: train: epoch 1522 | step 38 | lr 0.000272 | loss 0.006205 | mae 0.062431 -[2024/06/24 07:16:15] ppsci INFO: epoch: 1522, train_loss: 0.026776, train_metric: 0.121474, eval_loss: 0.048178, eval_mae: 0.146518 -[2024/06/24 07:16:15] ppsci INFO: train: epoch 1523 | step 0 | lr 0.000273 | loss 0.020013 | mae 0.105007 -[2024/06/24 07:16:15] ppsci INFO: train: epoch 1523 | step 10 | lr 0.000273 | loss 0.027071 | mae 0.128303 -[2024/06/24 07:16:16] ppsci INFO: train: epoch 1523 | step 20 | lr 0.000273 | loss 0.033460 | mae 0.128131 -[2024/06/24 07:16:16] ppsci INFO: train: epoch 1523 | step 30 | lr 0.000273 | loss 0.018869 | mae 0.105343 -[2024/06/24 07:16:17] ppsci INFO: train: epoch 1523 | step 38 | lr 0.000273 | loss 0.029079 | mae 0.139145 -[2024/06/24 07:16:17] ppsci INFO: epoch: 1523, train_loss: 0.024880, train_metric: 0.116419, eval_loss: 0.047744, eval_mae: 0.144474 -[2024/06/24 07:16:17] ppsci INFO: train: epoch 1524 | step 0 | lr 0.000273 | loss 0.029239 | mae 0.123759 -[2024/06/24 07:16:18] ppsci INFO: train: epoch 1524 | step 10 | lr 0.000273 | loss 0.029682 | mae 0.118648 -[2024/06/24 07:16:18] ppsci INFO: train: epoch 1524 | step 20 | lr 0.000273 | loss 0.025721 | mae 0.116581 -[2024/06/24 07:16:19] ppsci INFO: train: epoch 1524 | step 30 | lr 0.000273 | loss 0.025837 | mae 0.119033 -[2024/06/24 07:16:19] ppsci INFO: train: epoch 1524 | step 38 | lr 0.000273 | loss 0.025659 | mae 0.110892 -[2024/06/24 07:16:19] ppsci INFO: epoch: 1524, train_loss: 0.024781, train_metric: 0.117153, eval_loss: 0.046016, eval_mae: 0.150211 -[2024/06/24 07:16:19] ppsci INFO: train: epoch 1525 | step 0 | lr 0.000274 | loss 0.026674 | mae 0.115396 -[2024/06/24 07:16:20] ppsci INFO: train: epoch 1525 | step 10 | lr 0.000274 | loss 0.015683 | mae 0.101087 -[2024/06/24 07:16:20] ppsci INFO: train: epoch 1525 | step 20 | lr 0.000274 | loss 0.017414 | mae 0.103181 -[2024/06/24 07:16:21] ppsci INFO: train: epoch 1525 | step 30 | lr 0.000274 | loss 0.021271 | mae 0.115483 -[2024/06/24 07:16:21] ppsci INFO: train: epoch 1525 | step 38 | lr 0.000274 | loss 0.010358 | mae 0.085583 -[2024/06/24 07:16:21] ppsci INFO: epoch: 1525, train_loss: 0.025170, train_metric: 0.116576, eval_loss: 0.044712, eval_mae: 0.144854 -[2024/06/24 07:16:21] ppsci INFO: train: epoch 1526 | step 0 | lr 0.000275 | loss 0.029127 | mae 0.123543 -[2024/06/24 07:16:22] ppsci INFO: train: epoch 1526 | step 10 | lr 0.000275 | loss 0.033939 | mae 0.113703 -[2024/06/24 07:16:22] ppsci INFO: train: epoch 1526 | step 20 | lr 0.000275 | loss 0.028233 | mae 0.120248 -[2024/06/24 07:16:23] ppsci INFO: train: epoch 1526 | step 30 | lr 0.000275 | loss 0.024717 | mae 0.118101 -[2024/06/24 07:16:23] ppsci INFO: train: epoch 1526 | step 38 | lr 0.000275 | loss 0.018551 | mae 0.108566 -[2024/06/24 07:16:23] ppsci INFO: epoch: 1526, train_loss: 0.025275, train_metric: 0.117287, eval_loss: 0.047236, eval_mae: 0.147752 -[2024/06/24 07:16:24] ppsci INFO: train: epoch 1527 | step 0 | lr 0.000276 | loss 0.019625 | mae 0.109915 -[2024/06/24 07:16:24] ppsci INFO: train: epoch 1527 | step 10 | lr 0.000276 | loss 0.024944 | mae 0.117817 -[2024/06/24 07:16:25] ppsci INFO: train: epoch 1527 | step 20 | lr 0.000276 | loss 0.036178 | mae 0.144380 -[2024/06/24 07:16:25] ppsci INFO: train: epoch 1527 | step 30 | lr 0.000276 | loss 0.021596 | mae 0.106436 -[2024/06/24 07:16:25] ppsci INFO: train: epoch 1527 | step 38 | lr 0.000276 | loss 0.018624 | mae 0.110326 -[2024/06/24 07:16:26] ppsci INFO: epoch: 1527, train_loss: 0.025523, train_metric: 0.119529, eval_loss: 0.046322, eval_mae: 0.147234 -[2024/06/24 07:16:26] ppsci INFO: train: epoch 1528 | step 0 | lr 0.000277 | loss 0.020977 | mae 0.112806 -[2024/06/24 07:16:26] ppsci INFO: train: epoch 1528 | step 10 | lr 0.000277 | loss 0.024014 | mae 0.119618 -[2024/06/24 07:16:27] ppsci INFO: train: epoch 1528 | step 20 | lr 0.000277 | loss 0.023758 | mae 0.118621 -[2024/06/24 07:16:27] ppsci INFO: train: epoch 1528 | step 30 | lr 0.000277 | loss 0.018203 | mae 0.102381 -[2024/06/24 07:16:28] ppsci INFO: train: epoch 1528 | step 38 | lr 0.000277 | loss 0.010056 | mae 0.077917 -[2024/06/24 07:16:28] ppsci INFO: epoch: 1528, train_loss: 0.025303, train_metric: 0.117712, eval_loss: 0.045240, eval_mae: 0.151060 -[2024/06/24 07:16:28] ppsci INFO: train: epoch 1529 | step 0 | lr 0.000277 | loss 0.025307 | mae 0.118350 -[2024/06/24 07:16:28] ppsci INFO: train: epoch 1529 | step 10 | lr 0.000277 | loss 0.021189 | mae 0.110529 -[2024/06/24 07:16:29] ppsci INFO: train: epoch 1529 | step 20 | lr 0.000277 | loss 0.029499 | mae 0.132727 -[2024/06/24 07:16:29] ppsci INFO: train: epoch 1529 | step 30 | lr 0.000277 | loss 0.021772 | mae 0.116441 -[2024/06/24 07:16:30] ppsci INFO: train: epoch 1529 | step 38 | lr 0.000277 | loss 0.026632 | mae 0.131452 -[2024/06/24 07:16:30] ppsci INFO: epoch: 1529, train_loss: 0.026427, train_metric: 0.119106, eval_loss: 0.050887, eval_mae: 0.152985 -[2024/06/24 07:16:30] ppsci INFO: train: epoch 1530 | step 0 | lr 0.000278 | loss 0.020474 | mae 0.109410 -[2024/06/24 07:16:31] ppsci INFO: train: epoch 1530 | step 10 | lr 0.000278 | loss 0.025225 | mae 0.109194 -[2024/06/24 07:16:31] ppsci INFO: train: epoch 1530 | step 20 | lr 0.000278 | loss 0.028187 | mae 0.123798 -[2024/06/24 07:16:32] ppsci INFO: train: epoch 1530 | step 30 | lr 0.000278 | loss 0.019812 | mae 0.109410 -[2024/06/24 07:16:32] ppsci INFO: train: epoch 1530 | step 38 | lr 0.000278 | loss 0.026061 | mae 0.128428 -[2024/06/24 07:16:32] ppsci INFO: epoch: 1530, train_loss: 0.024759, train_metric: 0.116637, eval_loss: 0.045019, eval_mae: 0.148581 -[2024/06/24 07:16:32] ppsci INFO: train: epoch 1531 | step 0 | lr 0.000279 | loss 0.031982 | mae 0.126256 -[2024/06/24 07:16:33] ppsci INFO: train: epoch 1531 | step 10 | lr 0.000279 | loss 0.024867 | mae 0.115063 -[2024/06/24 07:16:33] ppsci INFO: train: epoch 1531 | step 20 | lr 0.000279 | loss 0.025803 | mae 0.119647 -[2024/06/24 07:16:34] ppsci INFO: train: epoch 1531 | step 30 | lr 0.000279 | loss 0.024941 | mae 0.106034 -[2024/06/24 07:16:34] ppsci INFO: train: epoch 1531 | step 38 | lr 0.000279 | loss 0.034908 | mae 0.154561 -[2024/06/24 07:16:34] ppsci INFO: epoch: 1531, train_loss: 0.024821, train_metric: 0.115094, eval_loss: 0.048319, eval_mae: 0.153998 -[2024/06/24 07:16:34] ppsci INFO: train: epoch 1532 | step 0 | lr 0.000280 | loss 0.041107 | mae 0.132650 -[2024/06/24 07:16:35] ppsci INFO: train: epoch 1532 | step 10 | lr 0.000280 | loss 0.025999 | mae 0.122898 -[2024/06/24 07:16:36] ppsci INFO: train: epoch 1532 | step 20 | lr 0.000280 | loss 0.025242 | mae 0.117948 -[2024/06/24 07:16:36] ppsci INFO: train: epoch 1532 | step 30 | lr 0.000280 | loss 0.020960 | mae 0.108438 -[2024/06/24 07:16:36] ppsci INFO: train: epoch 1532 | step 38 | lr 0.000280 | loss 0.045481 | mae 0.171636 -[2024/06/24 07:16:37] ppsci INFO: epoch: 1532, train_loss: 0.025553, train_metric: 0.115594, eval_loss: 0.046449, eval_mae: 0.148408 -[2024/06/24 07:16:37] ppsci INFO: train: epoch 1533 | step 0 | lr 0.000280 | loss 0.022795 | mae 0.113526 -[2024/06/24 07:16:37] ppsci INFO: train: epoch 1533 | step 10 | lr 0.000280 | loss 0.033491 | mae 0.122608 -[2024/06/24 07:16:38] ppsci INFO: train: epoch 1533 | step 20 | lr 0.000280 | loss 0.023952 | mae 0.119791 -[2024/06/24 07:16:38] ppsci INFO: train: epoch 1533 | step 30 | lr 0.000280 | loss 0.021450 | mae 0.113499 -[2024/06/24 07:16:38] ppsci INFO: train: epoch 1533 | step 38 | lr 0.000280 | loss 0.014106 | mae 0.096621 -[2024/06/24 07:16:39] ppsci INFO: epoch: 1533, train_loss: 0.024530, train_metric: 0.115867, eval_loss: 0.045050, eval_mae: 0.147364 -[2024/06/24 07:16:39] ppsci INFO: train: epoch 1534 | step 0 | lr 0.000281 | loss 0.029857 | mae 0.125373 -[2024/06/24 07:16:39] ppsci INFO: train: epoch 1534 | step 10 | lr 0.000281 | loss 0.031812 | mae 0.133693 -[2024/06/24 07:16:40] ppsci INFO: train: epoch 1534 | step 20 | lr 0.000281 | loss 0.025990 | mae 0.128791 -[2024/06/24 07:16:40] ppsci INFO: train: epoch 1534 | step 30 | lr 0.000281 | loss 0.020387 | mae 0.113949 -[2024/06/24 07:16:41] ppsci INFO: train: epoch 1534 | step 38 | lr 0.000281 | loss 0.017781 | mae 0.098422 -[2024/06/24 07:16:41] ppsci INFO: epoch: 1534, train_loss: 0.041098, train_metric: 0.131300, eval_loss: 0.045552, eval_mae: 0.145158 -[2024/06/24 07:16:41] ppsci INFO: train: epoch 1535 | step 0 | lr 0.000282 | loss 0.018059 | mae 0.103634 -[2024/06/24 07:16:41] ppsci INFO: train: epoch 1535 | step 10 | lr 0.000282 | loss 0.037465 | mae 0.130604 -[2024/06/24 07:16:42] ppsci INFO: train: epoch 1535 | step 20 | lr 0.000282 | loss 0.145532 | mae 0.166215 -[2024/06/24 07:16:42] ppsci INFO: train: epoch 1535 | step 30 | lr 0.000282 | loss 0.026586 | mae 0.117371 -[2024/06/24 07:16:43] ppsci INFO: train: epoch 1535 | step 38 | lr 0.000282 | loss 0.011631 | mae 0.086900 -[2024/06/24 07:16:43] ppsci INFO: epoch: 1535, train_loss: 0.029172, train_metric: 0.119229, eval_loss: 0.046293, eval_mae: 0.147847 -[2024/06/24 07:16:43] ppsci INFO: train: epoch 1536 | step 0 | lr 0.000283 | loss 0.032992 | mae 0.126792 -[2024/06/24 07:16:44] ppsci INFO: train: epoch 1536 | step 10 | lr 0.000283 | loss 0.023501 | mae 0.124446 -[2024/06/24 07:16:44] ppsci INFO: train: epoch 1536 | step 20 | lr 0.000283 | loss 0.024211 | mae 0.115484 -[2024/06/24 07:16:45] ppsci INFO: train: epoch 1536 | step 30 | lr 0.000283 | loss 0.024648 | mae 0.117316 -[2024/06/24 07:16:45] ppsci INFO: train: epoch 1536 | step 38 | lr 0.000283 | loss 0.058404 | mae 0.194924 -[2024/06/24 07:16:45] ppsci INFO: epoch: 1536, train_loss: 0.029315, train_metric: 0.122339, eval_loss: 0.048263, eval_mae: 0.146584 -[2024/06/24 07:16:45] ppsci INFO: train: epoch 1537 | step 0 | lr 0.000283 | loss 0.026468 | mae 0.126981 -[2024/06/24 07:16:46] ppsci INFO: train: epoch 1537 | step 10 | lr 0.000283 | loss 0.031066 | mae 0.127286 -[2024/06/24 07:16:46] ppsci INFO: train: epoch 1537 | step 20 | lr 0.000283 | loss 0.026259 | mae 0.113862 -[2024/06/24 07:16:47] ppsci INFO: train: epoch 1537 | step 30 | lr 0.000283 | loss 0.021310 | mae 0.114845 -[2024/06/24 07:16:47] ppsci INFO: train: epoch 1537 | step 38 | lr 0.000283 | loss 0.017656 | mae 0.104360 -[2024/06/24 07:16:47] ppsci INFO: epoch: 1537, train_loss: 0.026287, train_metric: 0.121317, eval_loss: 0.039891, eval_mae: 0.142328 -[2024/06/24 07:16:47] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:16:48] ppsci INFO: train: epoch 1538 | step 0 | lr 0.000284 | loss 0.016936 | mae 0.099863 -[2024/06/24 07:16:48] ppsci INFO: train: epoch 1538 | step 10 | lr 0.000284 | loss 0.022331 | mae 0.112716 -[2024/06/24 07:16:49] ppsci INFO: train: epoch 1538 | step 20 | lr 0.000284 | loss 0.027949 | mae 0.120584 -[2024/06/24 07:16:49] ppsci INFO: train: epoch 1538 | step 30 | lr 0.000284 | loss 0.024142 | mae 0.120747 -[2024/06/24 07:16:50] ppsci INFO: train: epoch 1538 | step 38 | lr 0.000284 | loss 0.007525 | mae 0.069588 -[2024/06/24 07:16:50] ppsci INFO: epoch: 1538, train_loss: 0.025887, train_metric: 0.117802, eval_loss: 0.043942, eval_mae: 0.145333 -[2024/06/24 07:16:50] ppsci INFO: train: epoch 1539 | step 0 | lr 0.000285 | loss 0.030666 | mae 0.123887 -[2024/06/24 07:16:50] ppsci INFO: train: epoch 1539 | step 10 | lr 0.000285 | loss 0.022545 | mae 0.114682 -[2024/06/24 07:16:51] ppsci INFO: train: epoch 1539 | step 20 | lr 0.000285 | loss 0.019433 | mae 0.099780 -[2024/06/24 07:16:51] ppsci INFO: train: epoch 1539 | step 30 | lr 0.000285 | loss 0.026271 | mae 0.121788 -[2024/06/24 07:16:52] ppsci INFO: train: epoch 1539 | step 38 | lr 0.000285 | loss 0.035430 | mae 0.146936 -[2024/06/24 07:16:52] ppsci INFO: epoch: 1539, train_loss: 0.027184, train_metric: 0.118833, eval_loss: 0.048955, eval_mae: 0.149620 -[2024/06/24 07:16:52] ppsci INFO: train: epoch 1540 | step 0 | lr 0.000286 | loss 0.026142 | mae 0.110099 -[2024/06/24 07:16:52] ppsci INFO: train: epoch 1540 | step 10 | lr 0.000286 | loss 0.025688 | mae 0.120320 -[2024/06/24 07:16:53] ppsci INFO: train: epoch 1540 | step 20 | lr 0.000286 | loss 0.032333 | mae 0.131433 -[2024/06/24 07:16:53] ppsci INFO: train: epoch 1540 | step 30 | lr 0.000286 | loss 0.022461 | mae 0.112787 -[2024/06/24 07:16:54] ppsci INFO: train: epoch 1540 | step 38 | lr 0.000286 | loss 0.018079 | mae 0.117169 -[2024/06/24 07:16:54] ppsci INFO: epoch: 1540, train_loss: 0.025342, train_metric: 0.118728, eval_loss: 0.051198, eval_mae: 0.150124 -[2024/06/24 07:16:54] ppsci INFO: train: epoch 1541 | step 0 | lr 0.000286 | loss 0.025099 | mae 0.110777 -[2024/06/24 07:16:54] ppsci INFO: train: epoch 1541 | step 10 | lr 0.000286 | loss 0.022006 | mae 0.110026 -[2024/06/24 07:16:55] ppsci INFO: train: epoch 1541 | step 20 | lr 0.000286 | loss 0.014983 | mae 0.095424 -[2024/06/24 07:16:56] ppsci INFO: train: epoch 1541 | step 30 | lr 0.000286 | loss 0.025490 | mae 0.120981 -[2024/06/24 07:16:56] ppsci INFO: train: epoch 1541 | step 38 | lr 0.000286 | loss 0.010454 | mae 0.082220 -[2024/06/24 07:16:56] ppsci INFO: epoch: 1541, train_loss: 0.023173, train_metric: 0.113313, eval_loss: 0.049182, eval_mae: 0.148494 -[2024/06/24 07:16:56] ppsci INFO: train: epoch 1542 | step 0 | lr 0.000287 | loss 0.021980 | mae 0.111311 -[2024/06/24 07:16:57] ppsci INFO: train: epoch 1542 | step 10 | lr 0.000287 | loss 0.021485 | mae 0.112759 -[2024/06/24 07:16:57] ppsci INFO: train: epoch 1542 | step 20 | lr 0.000287 | loss 0.022786 | mae 0.113780 -[2024/06/24 07:16:58] ppsci INFO: train: epoch 1542 | step 30 | lr 0.000287 | loss 0.020031 | mae 0.109451 -[2024/06/24 07:16:58] ppsci INFO: train: epoch 1542 | step 38 | lr 0.000287 | loss 0.081550 | mae 0.161727 -[2024/06/24 07:16:58] ppsci INFO: epoch: 1542, train_loss: 0.026542, train_metric: 0.116684, eval_loss: 0.050623, eval_mae: 0.151568 -[2024/06/24 07:16:58] ppsci INFO: train: epoch 1543 | step 0 | lr 0.000288 | loss 0.021481 | mae 0.109595 -[2024/06/24 07:16:59] ppsci INFO: train: epoch 1543 | step 10 | lr 0.000288 | loss 0.020785 | mae 0.109783 -[2024/06/24 07:16:59] ppsci INFO: train: epoch 1543 | step 20 | lr 0.000288 | loss 0.030104 | mae 0.118736 -[2024/06/24 07:17:00] ppsci INFO: train: epoch 1543 | step 30 | lr 0.000288 | loss 0.022877 | mae 0.120300 -[2024/06/24 07:17:00] ppsci INFO: train: epoch 1543 | step 38 | lr 0.000288 | loss 0.021500 | mae 0.104238 -[2024/06/24 07:17:00] ppsci INFO: epoch: 1543, train_loss: 0.026462, train_metric: 0.119067, eval_loss: 0.051797, eval_mae: 0.150584 -[2024/06/24 07:17:00] ppsci INFO: train: epoch 1544 | step 0 | lr 0.000289 | loss 0.020793 | mae 0.113362 -[2024/06/24 07:17:01] ppsci INFO: train: epoch 1544 | step 10 | lr 0.000289 | loss 0.021281 | mae 0.112852 -[2024/06/24 07:17:02] ppsci INFO: train: epoch 1544 | step 20 | lr 0.000289 | loss 0.032673 | mae 0.126893 -[2024/06/24 07:17:02] ppsci INFO: train: epoch 1544 | step 30 | lr 0.000289 | loss 0.018148 | mae 0.097358 -[2024/06/24 07:17:02] ppsci INFO: train: epoch 1544 | step 38 | lr 0.000289 | loss 0.010990 | mae 0.078296 -[2024/06/24 07:17:02] ppsci INFO: epoch: 1544, train_loss: 0.023934, train_metric: 0.114647, eval_loss: 0.047517, eval_mae: 0.148497 -[2024/06/24 07:17:03] ppsci INFO: train: epoch 1545 | step 0 | lr 0.000290 | loss 0.019693 | mae 0.109438 -[2024/06/24 07:17:03] ppsci INFO: train: epoch 1545 | step 10 | lr 0.000290 | loss 0.020436 | mae 0.108908 -[2024/06/24 07:17:04] ppsci INFO: train: epoch 1545 | step 20 | lr 0.000290 | loss 0.029595 | mae 0.118240 -[2024/06/24 07:17:04] ppsci INFO: train: epoch 1545 | step 30 | lr 0.000290 | loss 0.033572 | mae 0.132449 -[2024/06/24 07:17:04] ppsci INFO: train: epoch 1545 | step 38 | lr 0.000290 | loss 0.023498 | mae 0.129419 -[2024/06/24 07:17:04] ppsci INFO: epoch: 1545, train_loss: 0.025133, train_metric: 0.116120, eval_loss: 0.048473, eval_mae: 0.155878 -[2024/06/24 07:17:05] ppsci INFO: train: epoch 1546 | step 0 | lr 0.000290 | loss 0.019894 | mae 0.110916 -[2024/06/24 07:17:05] ppsci INFO: train: epoch 1546 | step 10 | lr 0.000290 | loss 0.019995 | mae 0.106723 -[2024/06/24 07:17:06] ppsci INFO: train: epoch 1546 | step 20 | lr 0.000290 | loss 0.022159 | mae 0.110235 -[2024/06/24 07:17:06] ppsci INFO: train: epoch 1546 | step 30 | lr 0.000290 | loss 0.028368 | mae 0.123870 -[2024/06/24 07:17:06] ppsci INFO: train: epoch 1546 | step 38 | lr 0.000290 | loss 0.020801 | mae 0.108927 -[2024/06/24 07:17:07] ppsci INFO: epoch: 1546, train_loss: 0.026490, train_metric: 0.118341, eval_loss: 0.043736, eval_mae: 0.146383 -[2024/06/24 07:17:07] ppsci INFO: train: epoch 1547 | step 0 | lr 0.000291 | loss 0.033524 | mae 0.124056 -[2024/06/24 07:17:07] ppsci INFO: train: epoch 1547 | step 10 | lr 0.000291 | loss 0.030109 | mae 0.121829 -[2024/06/24 07:17:08] ppsci INFO: train: epoch 1547 | step 20 | lr 0.000291 | loss 0.021402 | mae 0.103730 -[2024/06/24 07:17:08] ppsci INFO: train: epoch 1547 | step 30 | lr 0.000291 | loss 0.023808 | mae 0.116606 -[2024/06/24 07:17:09] ppsci INFO: train: epoch 1547 | step 38 | lr 0.000291 | loss 0.058105 | mae 0.168625 -[2024/06/24 07:17:09] ppsci INFO: epoch: 1547, train_loss: 0.027466, train_metric: 0.119109, eval_loss: 0.048724, eval_mae: 0.146520 -[2024/06/24 07:17:09] ppsci INFO: train: epoch 1548 | step 0 | lr 0.000292 | loss 0.026235 | mae 0.117751 -[2024/06/24 07:17:09] ppsci INFO: train: epoch 1548 | step 10 | lr 0.000292 | loss 0.027445 | mae 0.120008 -[2024/06/24 07:17:10] ppsci INFO: train: epoch 1548 | step 20 | lr 0.000292 | loss 0.019913 | mae 0.109045 -[2024/06/24 07:17:10] ppsci INFO: train: epoch 1548 | step 30 | lr 0.000292 | loss 0.025404 | mae 0.122763 -[2024/06/24 07:17:11] ppsci INFO: train: epoch 1548 | step 38 | lr 0.000292 | loss 0.021730 | mae 0.112447 -[2024/06/24 07:17:11] ppsci INFO: epoch: 1548, train_loss: 0.025061, train_metric: 0.117223, eval_loss: 0.047489, eval_mae: 0.145889 -[2024/06/24 07:17:11] ppsci INFO: train: epoch 1549 | step 0 | lr 0.000293 | loss 0.016286 | mae 0.097028 -[2024/06/24 07:17:12] ppsci INFO: train: epoch 1549 | step 10 | lr 0.000293 | loss 0.029233 | mae 0.126075 -[2024/06/24 07:17:12] ppsci INFO: train: epoch 1549 | step 20 | lr 0.000293 | loss 0.024069 | mae 0.118882 -[2024/06/24 07:17:13] ppsci INFO: train: epoch 1549 | step 30 | lr 0.000293 | loss 0.028698 | mae 0.125399 -[2024/06/24 07:17:13] ppsci INFO: train: epoch 1549 | step 38 | lr 0.000293 | loss 0.005792 | mae 0.058581 -[2024/06/24 07:17:13] ppsci INFO: epoch: 1549, train_loss: 0.023117, train_metric: 0.114449, eval_loss: 0.046342, eval_mae: 0.150060 -[2024/06/24 07:17:13] ppsci INFO: train: epoch 1550 | step 0 | lr 0.000293 | loss 0.037591 | mae 0.118137 -[2024/06/24 07:17:14] ppsci INFO: train: epoch 1550 | step 10 | lr 0.000293 | loss 0.020158 | mae 0.111287 -[2024/06/24 07:17:14] ppsci INFO: train: epoch 1550 | step 20 | lr 0.000293 | loss 0.017782 | mae 0.103213 -[2024/06/24 07:17:15] ppsci INFO: train: epoch 1550 | step 30 | lr 0.000293 | loss 0.032933 | mae 0.136137 -[2024/06/24 07:17:15] ppsci INFO: train: epoch 1550 | step 38 | lr 0.000293 | loss 0.016947 | mae 0.102529 -[2024/06/24 07:17:15] ppsci INFO: epoch: 1550, train_loss: 0.024905, train_metric: 0.114929, eval_loss: 0.047003, eval_mae: 0.143703 -[2024/06/24 07:17:15] ppsci INFO: train: epoch 1551 | step 0 | lr 0.000294 | loss 0.026032 | mae 0.117745 -[2024/06/24 07:17:16] ppsci INFO: train: epoch 1551 | step 10 | lr 0.000294 | loss 0.026105 | mae 0.121014 -[2024/06/24 07:17:16] ppsci INFO: train: epoch 1551 | step 20 | lr 0.000294 | loss 0.025511 | mae 0.120314 -[2024/06/24 07:17:17] ppsci INFO: train: epoch 1551 | step 30 | lr 0.000294 | loss 0.031063 | mae 0.130317 -[2024/06/24 07:17:17] ppsci INFO: train: epoch 1551 | step 38 | lr 0.000294 | loss 0.029143 | mae 0.113638 -[2024/06/24 07:17:17] ppsci INFO: epoch: 1551, train_loss: 0.029328, train_metric: 0.122895, eval_loss: 0.046191, eval_mae: 0.150187 -[2024/06/24 07:17:17] ppsci INFO: train: epoch 1552 | step 0 | lr 0.000295 | loss 0.022009 | mae 0.116076 -[2024/06/24 07:17:18] ppsci INFO: train: epoch 1552 | step 10 | lr 0.000295 | loss 0.027516 | mae 0.121864 -[2024/06/24 07:17:18] ppsci INFO: train: epoch 1552 | step 20 | lr 0.000295 | loss 0.031552 | mae 0.127788 -[2024/06/24 07:17:19] ppsci INFO: train: epoch 1552 | step 30 | lr 0.000295 | loss 0.025611 | mae 0.117811 -[2024/06/24 07:17:19] ppsci INFO: train: epoch 1552 | step 38 | lr 0.000295 | loss 0.026591 | mae 0.136876 -[2024/06/24 07:17:19] ppsci INFO: epoch: 1552, train_loss: 0.025785, train_metric: 0.119459, eval_loss: 0.049112, eval_mae: 0.149596 -[2024/06/24 07:17:20] ppsci INFO: train: epoch 1553 | step 0 | lr 0.000296 | loss 0.020975 | mae 0.107823 -[2024/06/24 07:17:20] ppsci INFO: train: epoch 1553 | step 10 | lr 0.000296 | loss 0.019370 | mae 0.112186 -[2024/06/24 07:17:21] ppsci INFO: train: epoch 1553 | step 20 | lr 0.000296 | loss 0.024657 | mae 0.115811 -[2024/06/24 07:17:21] ppsci INFO: train: epoch 1553 | step 30 | lr 0.000296 | loss 0.020383 | mae 0.112895 -[2024/06/24 07:17:21] ppsci INFO: train: epoch 1553 | step 38 | lr 0.000296 | loss 0.036046 | mae 0.152468 -[2024/06/24 07:17:22] ppsci INFO: epoch: 1553, train_loss: 0.025017, train_metric: 0.116497, eval_loss: 0.047275, eval_mae: 0.145867 -[2024/06/24 07:17:22] ppsci INFO: train: epoch 1554 | step 0 | lr 0.000296 | loss 0.039034 | mae 0.134909 -[2024/06/24 07:17:22] ppsci INFO: train: epoch 1554 | step 10 | lr 0.000296 | loss 0.025829 | mae 0.117351 -[2024/06/24 07:17:23] ppsci INFO: train: epoch 1554 | step 20 | lr 0.000296 | loss 0.017978 | mae 0.103800 -[2024/06/24 07:17:23] ppsci INFO: train: epoch 1554 | step 30 | lr 0.000296 | loss 0.018224 | mae 0.100589 -[2024/06/24 07:17:24] ppsci INFO: train: epoch 1554 | step 38 | lr 0.000296 | loss 0.018624 | mae 0.100106 -[2024/06/24 07:17:24] ppsci INFO: epoch: 1554, train_loss: 0.024789, train_metric: 0.116547, eval_loss: 0.047459, eval_mae: 0.145649 -[2024/06/24 07:17:24] ppsci INFO: train: epoch 1555 | step 0 | lr 0.000297 | loss 0.019011 | mae 0.106560 -[2024/06/24 07:17:24] ppsci INFO: train: epoch 1555 | step 10 | lr 0.000297 | loss 0.027238 | mae 0.118869 -[2024/06/24 07:17:25] ppsci INFO: train: epoch 1555 | step 20 | lr 0.000297 | loss 0.022994 | mae 0.109315 -[2024/06/24 07:17:25] ppsci INFO: train: epoch 1555 | step 30 | lr 0.000297 | loss 0.031425 | mae 0.132957 -[2024/06/24 07:17:26] ppsci INFO: train: epoch 1555 | step 38 | lr 0.000297 | loss 0.033830 | mae 0.145399 -[2024/06/24 07:17:26] ppsci INFO: epoch: 1555, train_loss: 0.024428, train_metric: 0.115677, eval_loss: 0.048464, eval_mae: 0.151845 -[2024/06/24 07:17:26] ppsci INFO: train: epoch 1556 | step 0 | lr 0.000298 | loss 0.030318 | mae 0.126470 -[2024/06/24 07:17:27] ppsci INFO: train: epoch 1556 | step 10 | lr 0.000298 | loss 0.020698 | mae 0.113513 -[2024/06/24 07:17:27] ppsci INFO: train: epoch 1556 | step 20 | lr 0.000298 | loss 0.020660 | mae 0.108528 -[2024/06/24 07:17:28] ppsci INFO: train: epoch 1556 | step 30 | lr 0.000298 | loss 0.023575 | mae 0.111121 -[2024/06/24 07:17:28] ppsci INFO: train: epoch 1556 | step 38 | lr 0.000298 | loss 0.014174 | mae 0.085110 -[2024/06/24 07:17:28] ppsci INFO: epoch: 1556, train_loss: 0.023225, train_metric: 0.114759, eval_loss: 0.048007, eval_mae: 0.145743 -[2024/06/24 07:17:28] ppsci INFO: train: epoch 1557 | step 0 | lr 0.000299 | loss 0.019437 | mae 0.103203 -[2024/06/24 07:17:29] ppsci INFO: train: epoch 1557 | step 10 | lr 0.000299 | loss 0.042712 | mae 0.140087 -[2024/06/24 07:17:29] ppsci INFO: train: epoch 1557 | step 20 | lr 0.000299 | loss 0.028020 | mae 0.114748 -[2024/06/24 07:17:30] ppsci INFO: train: epoch 1557 | step 30 | lr 0.000299 | loss 0.027897 | mae 0.114580 -[2024/06/24 07:17:30] ppsci INFO: train: epoch 1557 | step 38 | lr 0.000299 | loss 0.021207 | mae 0.109703 -[2024/06/24 07:17:30] ppsci INFO: epoch: 1557, train_loss: 0.027414, train_metric: 0.118557, eval_loss: 0.051919, eval_mae: 0.147869 -[2024/06/24 07:17:30] ppsci INFO: train: epoch 1558 | step 0 | lr 0.000299 | loss 0.028471 | mae 0.125714 -[2024/06/24 07:17:31] ppsci INFO: train: epoch 1558 | step 10 | lr 0.000299 | loss 0.022505 | mae 0.109351 -[2024/06/24 07:17:31] ppsci INFO: train: epoch 1558 | step 20 | lr 0.000299 | loss 0.025311 | mae 0.116249 -[2024/06/24 07:17:32] ppsci INFO: train: epoch 1558 | step 30 | lr 0.000299 | loss 0.021095 | mae 0.112162 -[2024/06/24 07:17:32] ppsci INFO: train: epoch 1558 | step 38 | lr 0.000299 | loss 0.048690 | mae 0.161839 -[2024/06/24 07:17:32] ppsci INFO: epoch: 1558, train_loss: 0.025479, train_metric: 0.116407, eval_loss: 0.050871, eval_mae: 0.147027 -[2024/06/24 07:17:32] ppsci INFO: train: epoch 1559 | step 0 | lr 0.000300 | loss 0.026725 | mae 0.120566 -[2024/06/24 07:17:33] ppsci INFO: train: epoch 1559 | step 10 | lr 0.000300 | loss 0.023094 | mae 0.115485 -[2024/06/24 07:17:33] ppsci INFO: train: epoch 1559 | step 20 | lr 0.000300 | loss 0.025426 | mae 0.122620 -[2024/06/24 07:17:34] ppsci INFO: train: epoch 1559 | step 30 | lr 0.000300 | loss 0.023028 | mae 0.113609 -[2024/06/24 07:17:34] ppsci INFO: train: epoch 1559 | step 38 | lr 0.000300 | loss 0.019558 | mae 0.107483 -[2024/06/24 07:17:34] ppsci INFO: epoch: 1559, train_loss: 0.023669, train_metric: 0.116049, eval_loss: 0.045292, eval_mae: 0.147691 -[2024/06/24 07:17:35] ppsci INFO: train: epoch 1560 | step 0 | lr 0.000301 | loss 0.030746 | mae 0.121770 -[2024/06/24 07:17:35] ppsci INFO: train: epoch 1560 | step 10 | lr 0.000301 | loss 0.020423 | mae 0.106196 -[2024/06/24 07:17:36] ppsci INFO: train: epoch 1560 | step 20 | lr 0.000301 | loss 0.024397 | mae 0.113476 -[2024/06/24 07:17:36] ppsci INFO: train: epoch 1560 | step 30 | lr 0.000301 | loss 0.029789 | mae 0.131214 -[2024/06/24 07:17:37] ppsci INFO: train: epoch 1560 | step 38 | lr 0.000301 | loss 0.012197 | mae 0.093962 -[2024/06/24 07:17:37] ppsci INFO: epoch: 1560, train_loss: 0.023467, train_metric: 0.115479, eval_loss: 0.045066, eval_mae: 0.148827 -[2024/06/24 07:17:37] ppsci INFO: train: epoch 1561 | step 0 | lr 0.000302 | loss 0.029967 | mae 0.125059 -[2024/06/24 07:17:37] ppsci INFO: train: epoch 1561 | step 10 | lr 0.000302 | loss 0.017458 | mae 0.096956 -[2024/06/24 07:17:38] ppsci INFO: train: epoch 1561 | step 20 | lr 0.000302 | loss 0.029815 | mae 0.111506 -[2024/06/24 07:17:38] ppsci INFO: train: epoch 1561 | step 30 | lr 0.000302 | loss 0.021306 | mae 0.117660 -[2024/06/24 07:17:39] ppsci INFO: train: epoch 1561 | step 38 | lr 0.000302 | loss 0.018627 | mae 0.116407 -[2024/06/24 07:17:39] ppsci INFO: epoch: 1561, train_loss: 0.024418, train_metric: 0.115985, eval_loss: 0.043948, eval_mae: 0.149159 -[2024/06/24 07:17:39] ppsci INFO: train: epoch 1562 | step 0 | lr 0.000302 | loss 0.024073 | mae 0.115278 -[2024/06/24 07:17:39] ppsci INFO: train: epoch 1562 | step 10 | lr 0.000302 | loss 0.015150 | mae 0.092239 -[2024/06/24 07:17:40] ppsci INFO: train: epoch 1562 | step 20 | lr 0.000302 | loss 0.026929 | mae 0.125142 -[2024/06/24 07:17:40] ppsci INFO: train: epoch 1562 | step 30 | lr 0.000302 | loss 0.022418 | mae 0.117812 -[2024/06/24 07:17:41] ppsci INFO: train: epoch 1562 | step 38 | lr 0.000302 | loss 0.012784 | mae 0.096013 -[2024/06/24 07:17:41] ppsci INFO: epoch: 1562, train_loss: 0.025845, train_metric: 0.117274, eval_loss: 0.048369, eval_mae: 0.151015 -[2024/06/24 07:17:41] ppsci INFO: train: epoch 1563 | step 0 | lr 0.000303 | loss 0.023285 | mae 0.114694 -[2024/06/24 07:17:41] ppsci INFO: train: epoch 1563 | step 10 | lr 0.000303 | loss 0.020633 | mae 0.108481 -[2024/06/24 07:17:42] ppsci INFO: train: epoch 1563 | step 20 | lr 0.000303 | loss 0.022945 | mae 0.111544 -[2024/06/24 07:17:42] ppsci INFO: train: epoch 1563 | step 30 | lr 0.000303 | loss 0.019573 | mae 0.108523 -[2024/06/24 07:17:43] ppsci INFO: train: epoch 1563 | step 38 | lr 0.000303 | loss 0.012345 | mae 0.096094 -[2024/06/24 07:17:43] ppsci INFO: epoch: 1563, train_loss: 0.023835, train_metric: 0.114223, eval_loss: 0.049018, eval_mae: 0.149595 -[2024/06/24 07:17:43] ppsci INFO: train: epoch 1564 | step 0 | lr 0.000304 | loss 0.020578 | mae 0.108735 -[2024/06/24 07:17:44] ppsci INFO: train: epoch 1564 | step 10 | lr 0.000304 | loss 0.018926 | mae 0.100428 -[2024/06/24 07:17:44] ppsci INFO: train: epoch 1564 | step 20 | lr 0.000304 | loss 0.020123 | mae 0.103105 -[2024/06/24 07:17:45] ppsci INFO: train: epoch 1564 | step 30 | lr 0.000304 | loss 0.024679 | mae 0.116705 -[2024/06/24 07:17:45] ppsci INFO: train: epoch 1564 | step 38 | lr 0.000304 | loss 0.022861 | mae 0.121644 -[2024/06/24 07:17:45] ppsci INFO: epoch: 1564, train_loss: 0.023890, train_metric: 0.113803, eval_loss: 0.047340, eval_mae: 0.148733 -[2024/06/24 07:17:45] ppsci INFO: train: epoch 1565 | step 0 | lr 0.000305 | loss 0.030546 | mae 0.128356 -[2024/06/24 07:17:46] ppsci INFO: train: epoch 1565 | step 10 | lr 0.000305 | loss 0.022120 | mae 0.112425 -[2024/06/24 07:17:46] ppsci INFO: train: epoch 1565 | step 20 | lr 0.000305 | loss 0.020476 | mae 0.109960 -[2024/06/24 07:17:47] ppsci INFO: train: epoch 1565 | step 30 | lr 0.000305 | loss 0.024724 | mae 0.114608 -[2024/06/24 07:17:47] ppsci INFO: train: epoch 1565 | step 38 | lr 0.000305 | loss 0.013079 | mae 0.094471 -[2024/06/24 07:17:47] ppsci INFO: epoch: 1565, train_loss: 0.025082, train_metric: 0.116387, eval_loss: 0.044366, eval_mae: 0.146617 -[2024/06/24 07:17:48] ppsci INFO: train: epoch 1566 | step 0 | lr 0.000305 | loss 0.021442 | mae 0.110550 -[2024/06/24 07:17:48] ppsci INFO: train: epoch 1566 | step 10 | lr 0.000305 | loss 0.016246 | mae 0.098502 -[2024/06/24 07:17:49] ppsci INFO: train: epoch 1566 | step 20 | lr 0.000305 | loss 0.022557 | mae 0.110694 -[2024/06/24 07:17:49] ppsci INFO: train: epoch 1566 | step 30 | lr 0.000305 | loss 0.030489 | mae 0.126213 -[2024/06/24 07:17:50] ppsci INFO: train: epoch 1566 | step 38 | lr 0.000305 | loss 0.052085 | mae 0.155559 -[2024/06/24 07:17:50] ppsci INFO: epoch: 1566, train_loss: 0.025171, train_metric: 0.113290, eval_loss: 0.045091, eval_mae: 0.149718 -[2024/06/24 07:17:50] ppsci INFO: train: epoch 1567 | step 0 | lr 0.000306 | loss 0.029117 | mae 0.128515 -[2024/06/24 07:17:50] ppsci INFO: train: epoch 1567 | step 10 | lr 0.000306 | loss 0.025733 | mae 0.114655 -[2024/06/24 07:17:51] ppsci INFO: train: epoch 1567 | step 20 | lr 0.000306 | loss 0.021548 | mae 0.108367 -[2024/06/24 07:17:51] ppsci INFO: train: epoch 1567 | step 30 | lr 0.000306 | loss 0.028544 | mae 0.126451 -[2024/06/24 07:17:52] ppsci INFO: train: epoch 1567 | step 38 | lr 0.000306 | loss 0.011487 | mae 0.084834 -[2024/06/24 07:17:52] ppsci INFO: epoch: 1567, train_loss: 0.024566, train_metric: 0.115776, eval_loss: 0.049751, eval_mae: 0.154740 -[2024/06/24 07:17:52] ppsci INFO: train: epoch 1568 | step 0 | lr 0.000307 | loss 0.024934 | mae 0.116945 -[2024/06/24 07:17:53] ppsci INFO: train: epoch 1568 | step 10 | lr 0.000307 | loss 0.020139 | mae 0.106091 -[2024/06/24 07:17:53] ppsci INFO: train: epoch 1568 | step 20 | lr 0.000307 | loss 0.032093 | mae 0.130928 -[2024/06/24 07:17:54] ppsci INFO: train: epoch 1568 | step 30 | lr 0.000307 | loss 0.025332 | mae 0.116861 -[2024/06/24 07:17:54] ppsci INFO: train: epoch 1568 | step 38 | lr 0.000307 | loss 0.022223 | mae 0.111647 -[2024/06/24 07:17:54] ppsci INFO: epoch: 1568, train_loss: 0.027475, train_metric: 0.120908, eval_loss: 0.048354, eval_mae: 0.152197 -[2024/06/24 07:17:54] ppsci INFO: train: epoch 1569 | step 0 | lr 0.000308 | loss 0.024016 | mae 0.118615 -[2024/06/24 07:17:55] ppsci INFO: train: epoch 1569 | step 10 | lr 0.000308 | loss 0.022244 | mae 0.114229 -[2024/06/24 07:17:55] ppsci INFO: train: epoch 1569 | step 20 | lr 0.000308 | loss 0.031662 | mae 0.133808 -[2024/06/24 07:17:56] ppsci INFO: train: epoch 1569 | step 30 | lr 0.000308 | loss 0.027171 | mae 0.124424 -[2024/06/24 07:17:56] ppsci INFO: train: epoch 1569 | step 38 | lr 0.000308 | loss 0.015728 | mae 0.116725 -[2024/06/24 07:17:56] ppsci INFO: epoch: 1569, train_loss: 0.024316, train_metric: 0.117585, eval_loss: 0.045740, eval_mae: 0.145481 -[2024/06/24 07:17:56] ppsci INFO: train: epoch 1570 | step 0 | lr 0.000308 | loss 0.029291 | mae 0.121884 -[2024/06/24 07:17:57] ppsci INFO: train: epoch 1570 | step 10 | lr 0.000308 | loss 0.026642 | mae 0.123235 -[2024/06/24 07:17:57] ppsci INFO: train: epoch 1570 | step 20 | lr 0.000308 | loss 0.027516 | mae 0.125404 -[2024/06/24 07:17:58] ppsci INFO: train: epoch 1570 | step 30 | lr 0.000308 | loss 0.025329 | mae 0.116145 -[2024/06/24 07:17:58] ppsci INFO: train: epoch 1570 | step 38 | lr 0.000308 | loss 0.035353 | mae 0.153489 -[2024/06/24 07:17:59] ppsci INFO: epoch: 1570, train_loss: 0.025524, train_metric: 0.117077, eval_loss: 0.049548, eval_mae: 0.151149 -[2024/06/24 07:17:59] ppsci INFO: train: epoch 1571 | step 0 | lr 0.000309 | loss 0.024147 | mae 0.113949 -[2024/06/24 07:17:59] ppsci INFO: train: epoch 1571 | step 10 | lr 0.000309 | loss 0.022095 | mae 0.115992 -[2024/06/24 07:18:00] ppsci INFO: train: epoch 1571 | step 20 | lr 0.000309 | loss 0.030080 | mae 0.124966 -[2024/06/24 07:18:00] ppsci INFO: train: epoch 1571 | step 30 | lr 0.000309 | loss 0.023059 | mae 0.117592 -[2024/06/24 07:18:01] ppsci INFO: train: epoch 1571 | step 38 | lr 0.000309 | loss 0.025872 | mae 0.119259 -[2024/06/24 07:18:01] ppsci INFO: epoch: 1571, train_loss: 0.024874, train_metric: 0.116687, eval_loss: 0.049190, eval_mae: 0.151158 -[2024/06/24 07:18:01] ppsci INFO: train: epoch 1572 | step 0 | lr 0.000310 | loss 0.018759 | mae 0.102163 -[2024/06/24 07:18:01] ppsci INFO: train: epoch 1572 | step 10 | lr 0.000310 | loss 0.022532 | mae 0.117924 -[2024/06/24 07:18:02] ppsci INFO: train: epoch 1572 | step 20 | lr 0.000310 | loss 0.022672 | mae 0.112409 -[2024/06/24 07:18:02] ppsci INFO: train: epoch 1572 | step 30 | lr 0.000310 | loss 0.028569 | mae 0.123231 -[2024/06/24 07:18:03] ppsci INFO: train: epoch 1572 | step 38 | lr 0.000310 | loss 0.015465 | mae 0.107346 -[2024/06/24 07:18:03] ppsci INFO: epoch: 1572, train_loss: 0.024040, train_metric: 0.115293, eval_loss: 0.048421, eval_mae: 0.146788 -[2024/06/24 07:18:03] ppsci INFO: train: epoch 1573 | step 0 | lr 0.000311 | loss 0.022493 | mae 0.109730 -[2024/06/24 07:18:03] ppsci INFO: train: epoch 1573 | step 10 | lr 0.000311 | loss 0.024918 | mae 0.113339 -[2024/06/24 07:18:04] ppsci INFO: train: epoch 1573 | step 20 | lr 0.000311 | loss 0.024131 | mae 0.113180 -[2024/06/24 07:18:05] ppsci INFO: train: epoch 1573 | step 30 | lr 0.000311 | loss 0.016761 | mae 0.102516 -[2024/06/24 07:18:05] ppsci INFO: train: epoch 1573 | step 38 | lr 0.000311 | loss 0.050177 | mae 0.151568 -[2024/06/24 07:18:05] ppsci INFO: epoch: 1573, train_loss: 0.024391, train_metric: 0.113317, eval_loss: 0.045617, eval_mae: 0.144703 -[2024/06/24 07:18:05] ppsci INFO: train: epoch 1574 | step 0 | lr 0.000311 | loss 0.024746 | mae 0.120679 -[2024/06/24 07:18:06] ppsci INFO: train: epoch 1574 | step 10 | lr 0.000311 | loss 0.021637 | mae 0.113400 -[2024/06/24 07:18:06] ppsci INFO: train: epoch 1574 | step 20 | lr 0.000311 | loss 0.026562 | mae 0.123351 -[2024/06/24 07:18:07] ppsci INFO: train: epoch 1574 | step 30 | lr 0.000311 | loss 0.029824 | mae 0.124527 -[2024/06/24 07:18:07] ppsci INFO: train: epoch 1574 | step 38 | lr 0.000311 | loss 0.018516 | mae 0.110754 -[2024/06/24 07:18:07] ppsci INFO: epoch: 1574, train_loss: 0.023962, train_metric: 0.115602, eval_loss: 0.046296, eval_mae: 0.147119 -[2024/06/24 07:18:07] ppsci INFO: train: epoch 1575 | step 0 | lr 0.000312 | loss 0.029026 | mae 0.124859 -[2024/06/24 07:18:08] ppsci INFO: train: epoch 1575 | step 10 | lr 0.000312 | loss 0.023881 | mae 0.123758 -[2024/06/24 07:18:08] ppsci INFO: train: epoch 1575 | step 20 | lr 0.000312 | loss 0.024992 | mae 0.120344 -[2024/06/24 07:18:09] ppsci INFO: train: epoch 1575 | step 30 | lr 0.000312 | loss 0.022693 | mae 0.109915 -[2024/06/24 07:18:09] ppsci INFO: train: epoch 1575 | step 38 | lr 0.000312 | loss 0.029585 | mae 0.127412 -[2024/06/24 07:18:09] ppsci INFO: epoch: 1575, train_loss: 0.025951, train_metric: 0.118259, eval_loss: 0.045340, eval_mae: 0.145835 -[2024/06/24 07:18:09] ppsci INFO: train: epoch 1576 | step 0 | lr 0.000313 | loss 0.021196 | mae 0.113837 -[2024/06/24 07:18:10] ppsci INFO: train: epoch 1576 | step 10 | lr 0.000313 | loss 0.020576 | mae 0.109240 -[2024/06/24 07:18:10] ppsci INFO: train: epoch 1576 | step 20 | lr 0.000313 | loss 0.025431 | mae 0.120391 -[2024/06/24 07:18:11] ppsci INFO: train: epoch 1576 | step 30 | lr 0.000313 | loss 0.023869 | mae 0.117945 -[2024/06/24 07:18:12] ppsci INFO: train: epoch 1576 | step 38 | lr 0.000313 | loss 0.047303 | mae 0.162963 -[2024/06/24 07:18:12] ppsci INFO: epoch: 1576, train_loss: 0.023766, train_metric: 0.113665, eval_loss: 0.044993, eval_mae: 0.142799 -[2024/06/24 07:18:12] ppsci INFO: train: epoch 1577 | step 0 | lr 0.000314 | loss 0.024015 | mae 0.119459 -[2024/06/24 07:18:12] ppsci INFO: train: epoch 1577 | step 10 | lr 0.000314 | loss 0.024144 | mae 0.107222 -[2024/06/24 07:18:13] ppsci INFO: train: epoch 1577 | step 20 | lr 0.000314 | loss 0.025305 | mae 0.114754 -[2024/06/24 07:18:13] ppsci INFO: train: epoch 1577 | step 30 | lr 0.000314 | loss 0.029901 | mae 0.126951 -[2024/06/24 07:18:14] ppsci INFO: train: epoch 1577 | step 38 | lr 0.000314 | loss 0.012638 | mae 0.086034 -[2024/06/24 07:18:14] ppsci INFO: epoch: 1577, train_loss: 0.024686, train_metric: 0.115444, eval_loss: 0.046271, eval_mae: 0.146143 -[2024/06/24 07:18:14] ppsci INFO: train: epoch 1578 | step 0 | lr 0.000314 | loss 0.024601 | mae 0.116755 -[2024/06/24 07:18:15] ppsci INFO: train: epoch 1578 | step 10 | lr 0.000314 | loss 0.017184 | mae 0.100960 -[2024/06/24 07:18:15] ppsci INFO: train: epoch 1578 | step 20 | lr 0.000314 | loss 0.022445 | mae 0.110197 -[2024/06/24 07:18:16] ppsci INFO: train: epoch 1578 | step 30 | lr 0.000314 | loss 0.020010 | mae 0.109229 -[2024/06/24 07:18:16] ppsci INFO: train: epoch 1578 | step 38 | lr 0.000314 | loss 0.015388 | mae 0.106003 -[2024/06/24 07:18:16] ppsci INFO: epoch: 1578, train_loss: 0.022795, train_metric: 0.112761, eval_loss: 0.048970, eval_mae: 0.150743 -[2024/06/24 07:18:16] ppsci INFO: train: epoch 1579 | step 0 | lr 0.000315 | loss 0.026266 | mae 0.126881 -[2024/06/24 07:18:17] ppsci INFO: train: epoch 1579 | step 10 | lr 0.000315 | loss 0.024055 | mae 0.113991 -[2024/06/24 07:18:17] ppsci INFO: train: epoch 1579 | step 20 | lr 0.000315 | loss 0.023596 | mae 0.117115 -[2024/06/24 07:18:18] ppsci INFO: train: epoch 1579 | step 30 | lr 0.000315 | loss 0.031873 | mae 0.130897 -[2024/06/24 07:18:18] ppsci INFO: train: epoch 1579 | step 38 | lr 0.000315 | loss 0.045063 | mae 0.170633 -[2024/06/24 07:18:18] ppsci INFO: epoch: 1579, train_loss: 0.026068, train_metric: 0.117585, eval_loss: 0.045990, eval_mae: 0.149688 -[2024/06/24 07:18:18] ppsci INFO: train: epoch 1580 | step 0 | lr 0.000316 | loss 0.022057 | mae 0.110525 -[2024/06/24 07:18:19] ppsci INFO: train: epoch 1580 | step 10 | lr 0.000316 | loss 0.019719 | mae 0.112514 -[2024/06/24 07:18:19] ppsci INFO: train: epoch 1580 | step 20 | lr 0.000316 | loss 0.024987 | mae 0.114527 -[2024/06/24 07:18:20] ppsci INFO: train: epoch 1580 | step 30 | lr 0.000316 | loss 0.023241 | mae 0.122897 -[2024/06/24 07:18:20] ppsci INFO: train: epoch 1580 | step 38 | lr 0.000316 | loss 0.011042 | mae 0.072595 -[2024/06/24 07:18:20] ppsci INFO: epoch: 1580, train_loss: 0.024008, train_metric: 0.115790, eval_loss: 0.049788, eval_mae: 0.149599 -[2024/06/24 07:18:20] ppsci INFO: train: epoch 1581 | step 0 | lr 0.000317 | loss 0.022769 | mae 0.115861 -[2024/06/24 07:18:21] ppsci INFO: train: epoch 1581 | step 10 | lr 0.000317 | loss 0.026603 | mae 0.122624 -[2024/06/24 07:18:21] ppsci INFO: train: epoch 1581 | step 20 | lr 0.000317 | loss 0.030219 | mae 0.126725 -[2024/06/24 07:18:22] ppsci INFO: train: epoch 1581 | step 30 | lr 0.000317 | loss 0.017364 | mae 0.103467 -[2024/06/24 07:18:22] ppsci INFO: train: epoch 1581 | step 38 | lr 0.000317 | loss 0.052757 | mae 0.177760 -[2024/06/24 07:18:22] ppsci INFO: epoch: 1581, train_loss: 0.026561, train_metric: 0.115859, eval_loss: 0.042211, eval_mae: 0.144883 -[2024/06/24 07:18:22] ppsci INFO: train: epoch 1582 | step 0 | lr 0.000317 | loss 0.025468 | mae 0.119371 -[2024/06/24 07:18:23] ppsci INFO: train: epoch 1582 | step 10 | lr 0.000317 | loss 0.022479 | mae 0.107786 -[2024/06/24 07:18:24] ppsci INFO: train: epoch 1582 | step 20 | lr 0.000317 | loss 0.025151 | mae 0.115087 -[2024/06/24 07:18:24] ppsci INFO: train: epoch 1582 | step 30 | lr 0.000317 | loss 0.022028 | mae 0.108223 -[2024/06/24 07:18:24] ppsci INFO: train: epoch 1582 | step 38 | lr 0.000317 | loss 0.018576 | mae 0.109452 -[2024/06/24 07:18:25] ppsci INFO: epoch: 1582, train_loss: 0.024171, train_metric: 0.115732, eval_loss: 0.045137, eval_mae: 0.145651 -[2024/06/24 07:18:25] ppsci INFO: train: epoch 1583 | step 0 | lr 0.000318 | loss 0.020058 | mae 0.107469 -[2024/06/24 07:18:25] ppsci INFO: train: epoch 1583 | step 10 | lr 0.000318 | loss 0.026711 | mae 0.127276 -[2024/06/24 07:18:26] ppsci INFO: train: epoch 1583 | step 20 | lr 0.000318 | loss 0.024038 | mae 0.116952 -[2024/06/24 07:18:26] ppsci INFO: train: epoch 1583 | step 30 | lr 0.000318 | loss 0.021106 | mae 0.102820 -[2024/06/24 07:18:26] ppsci INFO: train: epoch 1583 | step 38 | lr 0.000318 | loss 0.013350 | mae 0.097395 -[2024/06/24 07:18:27] ppsci INFO: epoch: 1583, train_loss: 0.024721, train_metric: 0.116422, eval_loss: 0.047394, eval_mae: 0.153232 -[2024/06/24 07:18:27] ppsci INFO: train: epoch 1584 | step 0 | lr 0.000319 | loss 0.042741 | mae 0.141784 -[2024/06/24 07:18:27] ppsci INFO: train: epoch 1584 | step 10 | lr 0.000319 | loss 0.019936 | mae 0.106525 -[2024/06/24 07:18:28] ppsci INFO: train: epoch 1584 | step 20 | lr 0.000319 | loss 0.030635 | mae 0.131906 -[2024/06/24 07:18:28] ppsci INFO: train: epoch 1584 | step 30 | lr 0.000319 | loss 0.023436 | mae 0.117272 -[2024/06/24 07:18:28] ppsci INFO: train: epoch 1584 | step 38 | lr 0.000319 | loss 0.007267 | mae 0.074847 -[2024/06/24 07:18:29] ppsci INFO: epoch: 1584, train_loss: 0.025454, train_metric: 0.117279, eval_loss: 0.044147, eval_mae: 0.143609 -[2024/06/24 07:18:29] ppsci INFO: train: epoch 1585 | step 0 | lr 0.000320 | loss 0.028378 | mae 0.116417 -[2024/06/24 07:18:29] ppsci INFO: train: epoch 1585 | step 10 | lr 0.000320 | loss 0.013723 | mae 0.094206 -[2024/06/24 07:18:30] ppsci INFO: train: epoch 1585 | step 20 | lr 0.000320 | loss 0.020185 | mae 0.104460 -[2024/06/24 07:18:30] ppsci INFO: train: epoch 1585 | step 30 | lr 0.000320 | loss 0.024542 | mae 0.125512 -[2024/06/24 07:18:31] ppsci INFO: train: epoch 1585 | step 38 | lr 0.000320 | loss 0.018079 | mae 0.114308 -[2024/06/24 07:18:31] ppsci INFO: epoch: 1585, train_loss: 0.023762, train_metric: 0.112741, eval_loss: 0.044326, eval_mae: 0.144801 -[2024/06/24 07:18:31] ppsci INFO: train: epoch 1586 | step 0 | lr 0.000320 | loss 0.021023 | mae 0.108062 -[2024/06/24 07:18:31] ppsci INFO: train: epoch 1586 | step 10 | lr 0.000320 | loss 0.023366 | mae 0.111782 -[2024/06/24 07:18:32] ppsci INFO: train: epoch 1586 | step 20 | lr 0.000320 | loss 0.026054 | mae 0.110567 -[2024/06/24 07:18:32] ppsci INFO: train: epoch 1586 | step 30 | lr 0.000320 | loss 0.022191 | mae 0.116657 -[2024/06/24 07:18:33] ppsci INFO: train: epoch 1586 | step 38 | lr 0.000320 | loss 0.017403 | mae 0.110398 -[2024/06/24 07:18:33] ppsci INFO: epoch: 1586, train_loss: 0.022659, train_metric: 0.112151, eval_loss: 0.043570, eval_mae: 0.145501 -[2024/06/24 07:18:33] ppsci INFO: train: epoch 1587 | step 0 | lr 0.000321 | loss 0.023001 | mae 0.113477 -[2024/06/24 07:18:33] ppsci INFO: train: epoch 1587 | step 10 | lr 0.000321 | loss 0.024765 | mae 0.116665 -[2024/06/24 07:18:34] ppsci INFO: train: epoch 1587 | step 20 | lr 0.000321 | loss 0.022707 | mae 0.111678 -[2024/06/24 07:18:34] ppsci INFO: train: epoch 1587 | step 30 | lr 0.000321 | loss 0.024279 | mae 0.116017 -[2024/06/24 07:18:35] ppsci INFO: train: epoch 1587 | step 38 | lr 0.000321 | loss 0.023306 | mae 0.129733 -[2024/06/24 07:18:35] ppsci INFO: epoch: 1587, train_loss: 0.023711, train_metric: 0.113752, eval_loss: 0.047656, eval_mae: 0.145595 -[2024/06/24 07:18:35] ppsci INFO: train: epoch 1588 | step 0 | lr 0.000322 | loss 0.018655 | mae 0.101074 -[2024/06/24 07:18:36] ppsci INFO: train: epoch 1588 | step 10 | lr 0.000322 | loss 0.031579 | mae 0.130049 -[2024/06/24 07:18:36] ppsci INFO: train: epoch 1588 | step 20 | lr 0.000322 | loss 0.024867 | mae 0.119598 -[2024/06/24 07:18:37] ppsci INFO: train: epoch 1588 | step 30 | lr 0.000322 | loss 0.021713 | mae 0.108230 -[2024/06/24 07:18:37] ppsci INFO: train: epoch 1588 | step 38 | lr 0.000322 | loss 0.019079 | mae 0.108450 -[2024/06/24 07:18:37] ppsci INFO: epoch: 1588, train_loss: 0.031109, train_metric: 0.124520, eval_loss: 0.045125, eval_mae: 0.152577 -[2024/06/24 07:18:37] ppsci INFO: train: epoch 1589 | step 0 | lr 0.000323 | loss 0.031811 | mae 0.131155 -[2024/06/24 07:18:38] ppsci INFO: train: epoch 1589 | step 10 | lr 0.000323 | loss 0.026079 | mae 0.125001 -[2024/06/24 07:18:38] ppsci INFO: train: epoch 1589 | step 20 | lr 0.000323 | loss 0.023106 | mae 0.115502 -[2024/06/24 07:18:39] ppsci INFO: train: epoch 1589 | step 30 | lr 0.000323 | loss 0.027914 | mae 0.125965 -[2024/06/24 07:18:39] ppsci INFO: train: epoch 1589 | step 38 | lr 0.000323 | loss 0.055594 | mae 0.176378 -[2024/06/24 07:18:39] ppsci INFO: epoch: 1589, train_loss: 0.028694, train_metric: 0.121455, eval_loss: 0.045227, eval_mae: 0.148459 -[2024/06/24 07:18:39] ppsci INFO: train: epoch 1590 | step 0 | lr 0.000323 | loss 0.021404 | mae 0.108495 -[2024/06/24 07:18:40] ppsci INFO: train: epoch 1590 | step 10 | lr 0.000323 | loss 0.022388 | mae 0.115340 -[2024/06/24 07:18:40] ppsci INFO: train: epoch 1590 | step 20 | lr 0.000323 | loss 0.026267 | mae 0.122922 -[2024/06/24 07:18:41] ppsci INFO: train: epoch 1590 | step 30 | lr 0.000323 | loss 0.020033 | mae 0.107258 -[2024/06/24 07:18:41] ppsci INFO: train: epoch 1590 | step 38 | lr 0.000323 | loss 0.009607 | mae 0.076761 -[2024/06/24 07:18:41] ppsci INFO: epoch: 1590, train_loss: 0.024733, train_metric: 0.117124, eval_loss: 0.044181, eval_mae: 0.147854 -[2024/06/24 07:18:41] ppsci INFO: train: epoch 1591 | step 0 | lr 0.000324 | loss 0.018068 | mae 0.102659 -[2024/06/24 07:18:42] ppsci INFO: train: epoch 1591 | step 10 | lr 0.000324 | loss 0.031320 | mae 0.128953 -[2024/06/24 07:18:42] ppsci INFO: train: epoch 1591 | step 20 | lr 0.000324 | loss 0.018165 | mae 0.104276 -[2024/06/24 07:18:43] ppsci INFO: train: epoch 1591 | step 30 | lr 0.000324 | loss 0.021257 | mae 0.112912 -[2024/06/24 07:18:43] ppsci INFO: train: epoch 1591 | step 38 | lr 0.000324 | loss 0.009440 | mae 0.072133 -[2024/06/24 07:18:43] ppsci INFO: epoch: 1591, train_loss: 0.023581, train_metric: 0.112742, eval_loss: 0.048544, eval_mae: 0.151052 -[2024/06/24 07:18:43] ppsci INFO: train: epoch 1592 | step 0 | lr 0.000325 | loss 0.026907 | mae 0.124861 -[2024/06/24 07:18:44] ppsci INFO: train: epoch 1592 | step 10 | lr 0.000325 | loss 0.026660 | mae 0.122276 -[2024/06/24 07:18:44] ppsci INFO: train: epoch 1592 | step 20 | lr 0.000325 | loss 0.029998 | mae 0.118665 -[2024/06/24 07:18:45] ppsci INFO: train: epoch 1592 | step 30 | lr 0.000325 | loss 0.024186 | mae 0.117820 -[2024/06/24 07:18:45] ppsci INFO: train: epoch 1592 | step 38 | lr 0.000325 | loss 0.016354 | mae 0.088775 -[2024/06/24 07:18:45] ppsci INFO: epoch: 1592, train_loss: 0.024368, train_metric: 0.116532, eval_loss: 0.049488, eval_mae: 0.150976 -[2024/06/24 07:18:46] ppsci INFO: train: epoch 1593 | step 0 | lr 0.000326 | loss 0.041613 | mae 0.127915 -[2024/06/24 07:18:46] ppsci INFO: train: epoch 1593 | step 10 | lr 0.000326 | loss 0.022329 | mae 0.108369 -[2024/06/24 07:18:46] ppsci INFO: train: epoch 1593 | step 20 | lr 0.000326 | loss 0.030704 | mae 0.129745 -[2024/06/24 07:18:47] ppsci INFO: train: epoch 1593 | step 30 | lr 0.000326 | loss 0.026931 | mae 0.119857 -[2024/06/24 07:18:47] ppsci INFO: train: epoch 1593 | step 38 | lr 0.000326 | loss 0.048941 | mae 0.176615 -[2024/06/24 07:18:48] ppsci INFO: epoch: 1593, train_loss: 0.028360, train_metric: 0.119160, eval_loss: 0.049429, eval_mae: 0.147292 -[2024/06/24 07:18:48] ppsci INFO: train: epoch 1594 | step 0 | lr 0.000326 | loss 0.031035 | mae 0.138206 -[2024/06/24 07:18:48] ppsci INFO: train: epoch 1594 | step 10 | lr 0.000326 | loss 0.027712 | mae 0.115189 -[2024/06/24 07:18:49] ppsci INFO: train: epoch 1594 | step 20 | lr 0.000326 | loss 0.024253 | mae 0.111120 -[2024/06/24 07:18:49] ppsci INFO: train: epoch 1594 | step 30 | lr 0.000326 | loss 0.018296 | mae 0.104558 -[2024/06/24 07:18:49] ppsci INFO: train: epoch 1594 | step 38 | lr 0.000326 | loss 0.062485 | mae 0.180251 -[2024/06/24 07:18:50] ppsci INFO: epoch: 1594, train_loss: 0.027077, train_metric: 0.119161, eval_loss: 0.049339, eval_mae: 0.153150 -[2024/06/24 07:18:50] ppsci INFO: train: epoch 1595 | step 0 | lr 0.000327 | loss 0.021377 | mae 0.115460 -[2024/06/24 07:18:50] ppsci INFO: train: epoch 1595 | step 10 | lr 0.000327 | loss 0.026505 | mae 0.122005 -[2024/06/24 07:18:51] ppsci INFO: train: epoch 1595 | step 20 | lr 0.000327 | loss 0.019481 | mae 0.105639 -[2024/06/24 07:18:51] ppsci INFO: train: epoch 1595 | step 30 | lr 0.000327 | loss 0.027748 | mae 0.117236 -[2024/06/24 07:18:52] ppsci INFO: train: epoch 1595 | step 38 | lr 0.000327 | loss 0.029839 | mae 0.127140 -[2024/06/24 07:18:52] ppsci INFO: epoch: 1595, train_loss: 0.026624, train_metric: 0.117709, eval_loss: 0.047708, eval_mae: 0.152110 -[2024/06/24 07:18:52] ppsci INFO: train: epoch 1596 | step 0 | lr 0.000328 | loss 0.024229 | mae 0.113123 -[2024/06/24 07:18:52] ppsci INFO: train: epoch 1596 | step 10 | lr 0.000328 | loss 0.023259 | mae 0.111695 -[2024/06/24 07:18:53] ppsci INFO: train: epoch 1596 | step 20 | lr 0.000328 | loss 0.024328 | mae 0.116410 -[2024/06/24 07:18:53] ppsci INFO: train: epoch 1596 | step 30 | lr 0.000328 | loss 0.027908 | mae 0.124242 -[2024/06/24 07:18:54] ppsci INFO: train: epoch 1596 | step 38 | lr 0.000328 | loss 0.011989 | mae 0.091808 -[2024/06/24 07:18:54] ppsci INFO: epoch: 1596, train_loss: 0.024252, train_metric: 0.115890, eval_loss: 0.048576, eval_mae: 0.153565 -[2024/06/24 07:18:54] ppsci INFO: train: epoch 1597 | step 0 | lr 0.000329 | loss 0.019484 | mae 0.109652 -[2024/06/24 07:18:54] ppsci INFO: train: epoch 1597 | step 10 | lr 0.000329 | loss 0.026641 | mae 0.126617 -[2024/06/24 07:18:55] ppsci INFO: train: epoch 1597 | step 20 | lr 0.000329 | loss 0.028802 | mae 0.120865 -[2024/06/24 07:18:55] ppsci INFO: train: epoch 1597 | step 30 | lr 0.000329 | loss 0.020322 | mae 0.106021 -[2024/06/24 07:18:56] ppsci INFO: train: epoch 1597 | step 38 | lr 0.000329 | loss 0.028025 | mae 0.149274 -[2024/06/24 07:18:56] ppsci INFO: epoch: 1597, train_loss: 0.025984, train_metric: 0.117776, eval_loss: 0.047349, eval_mae: 0.152391 -[2024/06/24 07:18:56] ppsci INFO: train: epoch 1598 | step 0 | lr 0.000329 | loss 0.025439 | mae 0.120871 -[2024/06/24 07:18:57] ppsci INFO: train: epoch 1598 | step 10 | lr 0.000329 | loss 0.026399 | mae 0.122102 -[2024/06/24 07:18:57] ppsci INFO: train: epoch 1598 | step 20 | lr 0.000329 | loss 0.026458 | mae 0.126659 -[2024/06/24 07:18:58] ppsci INFO: train: epoch 1598 | step 30 | lr 0.000329 | loss 0.023588 | mae 0.120070 -[2024/06/24 07:18:58] ppsci INFO: train: epoch 1598 | step 38 | lr 0.000329 | loss 0.040224 | mae 0.162987 -[2024/06/24 07:18:58] ppsci INFO: epoch: 1598, train_loss: 0.026251, train_metric: 0.118643, eval_loss: 0.044045, eval_mae: 0.147593 -[2024/06/24 07:18:58] ppsci INFO: train: epoch 1599 | step 0 | lr 0.000330 | loss 0.021238 | mae 0.109214 -[2024/06/24 07:18:59] ppsci INFO: train: epoch 1599 | step 10 | lr 0.000330 | loss 0.018617 | mae 0.101866 -[2024/06/24 07:18:59] ppsci INFO: train: epoch 1599 | step 20 | lr 0.000330 | loss 0.043866 | mae 0.129819 -[2024/06/24 07:19:00] ppsci INFO: train: epoch 1599 | step 30 | lr 0.000330 | loss 0.029517 | mae 0.123470 -[2024/06/24 07:19:00] ppsci INFO: train: epoch 1599 | step 38 | lr 0.000330 | loss 0.007814 | mae 0.062325 -[2024/06/24 07:19:00] ppsci INFO: epoch: 1599, train_loss: 0.029684, train_metric: 0.119920, eval_loss: 0.052907, eval_mae: 0.158563 -[2024/06/24 07:19:01] ppsci INFO: train: epoch 1600 | step 0 | lr 0.000331 | loss 0.032378 | mae 0.140743 -[2024/06/24 07:19:01] ppsci INFO: train: epoch 1600 | step 10 | lr 0.000331 | loss 0.023570 | mae 0.117993 -[2024/06/24 07:19:02] ppsci INFO: train: epoch 1600 | step 20 | lr 0.000331 | loss 0.026982 | mae 0.128540 -[2024/06/24 07:19:02] ppsci INFO: train: epoch 1600 | step 30 | lr 0.000331 | loss 0.028886 | mae 0.117856 -[2024/06/24 07:19:03] ppsci INFO: train: epoch 1600 | step 38 | lr 0.000331 | loss 0.020966 | mae 0.119072 -[2024/06/24 07:19:03] ppsci INFO: epoch: 1600, train_loss: 0.024303, train_metric: 0.116105, eval_loss: 0.044304, eval_mae: 0.145388 -[2024/06/24 07:19:03] ppsci INFO: train: epoch 1601 | step 0 | lr 0.000331 | loss 0.024181 | mae 0.116841 -[2024/06/24 07:19:03] ppsci INFO: train: epoch 1601 | step 10 | lr 0.000331 | loss 0.029559 | mae 0.128758 -[2024/06/24 07:19:04] ppsci INFO: train: epoch 1601 | step 20 | lr 0.000331 | loss 0.031444 | mae 0.129577 -[2024/06/24 07:19:04] ppsci INFO: train: epoch 1601 | step 30 | lr 0.000331 | loss 0.019652 | mae 0.107256 -[2024/06/24 07:19:05] ppsci INFO: train: epoch 1601 | step 38 | lr 0.000331 | loss 0.032405 | mae 0.148929 -[2024/06/24 07:19:05] ppsci INFO: epoch: 1601, train_loss: 0.025018, train_metric: 0.115760, eval_loss: 0.044719, eval_mae: 0.146110 -[2024/06/24 07:19:05] ppsci INFO: train: epoch 1602 | step 0 | lr 0.000332 | loss 0.024806 | mae 0.115705 -[2024/06/24 07:19:05] ppsci INFO: train: epoch 1602 | step 10 | lr 0.000332 | loss 0.025633 | mae 0.124263 -[2024/06/24 07:19:06] ppsci INFO: train: epoch 1602 | step 20 | lr 0.000332 | loss 0.025774 | mae 0.120507 -[2024/06/24 07:19:06] ppsci INFO: train: epoch 1602 | step 30 | lr 0.000332 | loss 0.023790 | mae 0.116822 -[2024/06/24 07:19:07] ppsci INFO: train: epoch 1602 | step 38 | lr 0.000332 | loss 0.035036 | mae 0.133739 -[2024/06/24 07:19:07] ppsci INFO: epoch: 1602, train_loss: 0.025604, train_metric: 0.117708, eval_loss: 0.042870, eval_mae: 0.141643 -[2024/06/24 07:19:07] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:19:07] ppsci INFO: train: epoch 1603 | step 0 | lr 0.000333 | loss 0.020198 | mae 0.110567 -[2024/06/24 07:19:08] ppsci INFO: train: epoch 1603 | step 10 | lr 0.000333 | loss 0.022897 | mae 0.109863 -[2024/06/24 07:19:08] ppsci INFO: train: epoch 1603 | step 20 | lr 0.000333 | loss 0.025545 | mae 0.118393 -[2024/06/24 07:19:09] ppsci INFO: train: epoch 1603 | step 30 | lr 0.000333 | loss 0.025041 | mae 0.112724 -[2024/06/24 07:19:09] ppsci INFO: train: epoch 1603 | step 38 | lr 0.000333 | loss 0.070997 | mae 0.173191 -[2024/06/24 07:19:09] ppsci INFO: epoch: 1603, train_loss: 0.024965, train_metric: 0.113573, eval_loss: 0.044858, eval_mae: 0.148365 -[2024/06/24 07:19:09] ppsci INFO: train: epoch 1604 | step 0 | lr 0.000334 | loss 0.027113 | mae 0.119830 -[2024/06/24 07:19:10] ppsci INFO: train: epoch 1604 | step 10 | lr 0.000334 | loss 0.018720 | mae 0.101713 -[2024/06/24 07:19:10] ppsci INFO: train: epoch 1604 | step 20 | lr 0.000334 | loss 0.032248 | mae 0.121474 -[2024/06/24 07:19:11] ppsci INFO: train: epoch 1604 | step 30 | lr 0.000334 | loss 0.023910 | mae 0.113875 -[2024/06/24 07:19:11] ppsci INFO: train: epoch 1604 | step 38 | lr 0.000334 | loss 0.014365 | mae 0.090598 -[2024/06/24 07:19:11] ppsci INFO: epoch: 1604, train_loss: 0.026261, train_metric: 0.114423, eval_loss: 0.049285, eval_mae: 0.151187 -[2024/06/24 07:19:12] ppsci INFO: train: epoch 1605 | step 0 | lr 0.000334 | loss 0.025327 | mae 0.121243 -[2024/06/24 07:19:12] ppsci INFO: train: epoch 1605 | step 10 | lr 0.000334 | loss 0.026686 | mae 0.118296 -[2024/06/24 07:19:13] ppsci INFO: train: epoch 1605 | step 20 | lr 0.000334 | loss 0.022313 | mae 0.110347 -[2024/06/24 07:19:13] ppsci INFO: train: epoch 1605 | step 30 | lr 0.000334 | loss 0.020010 | mae 0.110014 -[2024/06/24 07:19:14] ppsci INFO: train: epoch 1605 | step 38 | lr 0.000334 | loss 0.007807 | mae 0.062987 -[2024/06/24 07:19:14] ppsci INFO: epoch: 1605, train_loss: 0.027128, train_metric: 0.120288, eval_loss: 0.047749, eval_mae: 0.153171 -[2024/06/24 07:19:14] ppsci INFO: train: epoch 1606 | step 0 | lr 0.000335 | loss 0.025136 | mae 0.121044 -[2024/06/24 07:19:14] ppsci INFO: train: epoch 1606 | step 10 | lr 0.000335 | loss 0.019038 | mae 0.110926 -[2024/06/24 07:19:15] ppsci INFO: train: epoch 1606 | step 20 | lr 0.000335 | loss 0.023863 | mae 0.115339 -[2024/06/24 07:19:15] ppsci INFO: train: epoch 1606 | step 30 | lr 0.000335 | loss 0.018128 | mae 0.103235 -[2024/06/24 07:19:16] ppsci INFO: train: epoch 1606 | step 38 | lr 0.000335 | loss 0.017103 | mae 0.104574 -[2024/06/24 07:19:16] ppsci INFO: epoch: 1606, train_loss: 0.025572, train_metric: 0.117890, eval_loss: 0.046849, eval_mae: 0.145953 -[2024/06/24 07:19:16] ppsci INFO: train: epoch 1607 | step 0 | lr 0.000336 | loss 0.023406 | mae 0.118939 -[2024/06/24 07:19:17] ppsci INFO: train: epoch 1607 | step 10 | lr 0.000336 | loss 0.022256 | mae 0.109952 -[2024/06/24 07:19:17] ppsci INFO: train: epoch 1607 | step 20 | lr 0.000336 | loss 0.023385 | mae 0.113449 -[2024/06/24 07:19:18] ppsci INFO: train: epoch 1607 | step 30 | lr 0.000336 | loss 0.032771 | mae 0.130311 -[2024/06/24 07:19:18] ppsci INFO: train: epoch 1607 | step 38 | lr 0.000336 | loss 0.026314 | mae 0.126127 -[2024/06/24 07:19:18] ppsci INFO: epoch: 1607, train_loss: 0.023931, train_metric: 0.114681, eval_loss: 0.045266, eval_mae: 0.147283 -[2024/06/24 07:19:18] ppsci INFO: train: epoch 1608 | step 0 | lr 0.000337 | loss 0.024788 | mae 0.119136 -[2024/06/24 07:19:19] ppsci INFO: train: epoch 1608 | step 10 | lr 0.000337 | loss 0.025428 | mae 0.111498 -[2024/06/24 07:19:19] ppsci INFO: train: epoch 1608 | step 20 | lr 0.000337 | loss 0.024413 | mae 0.118982 -[2024/06/24 07:19:20] ppsci INFO: train: epoch 1608 | step 30 | lr 0.000337 | loss 0.020959 | mae 0.111357 -[2024/06/24 07:19:20] ppsci INFO: train: epoch 1608 | step 38 | lr 0.000337 | loss 0.017957 | mae 0.097129 -[2024/06/24 07:19:21] ppsci INFO: epoch: 1608, train_loss: 0.024553, train_metric: 0.114126, eval_loss: 0.049231, eval_mae: 0.155596 -[2024/06/24 07:19:21] ppsci INFO: train: epoch 1609 | step 0 | lr 0.000337 | loss 0.021101 | mae 0.111079 -[2024/06/24 07:19:21] ppsci INFO: train: epoch 1609 | step 10 | lr 0.000337 | loss 0.021149 | mae 0.104982 -[2024/06/24 07:19:22] ppsci INFO: train: epoch 1609 | step 20 | lr 0.000337 | loss 0.031852 | mae 0.131139 -[2024/06/24 07:19:22] ppsci INFO: train: epoch 1609 | step 30 | lr 0.000337 | loss 0.019842 | mae 0.112559 -[2024/06/24 07:19:23] ppsci INFO: train: epoch 1609 | step 38 | lr 0.000337 | loss 0.019988 | mae 0.118934 -[2024/06/24 07:19:23] ppsci INFO: epoch: 1609, train_loss: 0.023881, train_metric: 0.115041, eval_loss: 0.046987, eval_mae: 0.150249 -[2024/06/24 07:19:23] ppsci INFO: train: epoch 1610 | step 0 | lr 0.000338 | loss 0.018102 | mae 0.102627 -[2024/06/24 07:19:23] ppsci INFO: train: epoch 1610 | step 10 | lr 0.000338 | loss 0.025082 | mae 0.114826 -[2024/06/24 07:19:24] ppsci INFO: train: epoch 1610 | step 20 | lr 0.000338 | loss 0.028398 | mae 0.118301 -[2024/06/24 07:19:24] ppsci INFO: train: epoch 1610 | step 30 | lr 0.000338 | loss 0.027430 | mae 0.124534 -[2024/06/24 07:19:25] ppsci INFO: train: epoch 1610 | step 38 | lr 0.000338 | loss 0.022154 | mae 0.133131 -[2024/06/24 07:19:25] ppsci INFO: epoch: 1610, train_loss: 0.024258, train_metric: 0.115557, eval_loss: 0.047663, eval_mae: 0.144232 -[2024/06/24 07:19:25] ppsci INFO: train: epoch 1611 | step 0 | lr 0.000339 | loss 0.021115 | mae 0.110017 -[2024/06/24 07:19:25] ppsci INFO: train: epoch 1611 | step 10 | lr 0.000339 | loss 0.028058 | mae 0.120885 -[2024/06/24 07:19:26] ppsci INFO: train: epoch 1611 | step 20 | lr 0.000339 | loss 0.019335 | mae 0.108897 -[2024/06/24 07:19:26] ppsci INFO: train: epoch 1611 | step 30 | lr 0.000339 | loss 0.018263 | mae 0.098670 -[2024/06/24 07:19:27] ppsci INFO: train: epoch 1611 | step 38 | lr 0.000339 | loss 0.022995 | mae 0.119213 -[2024/06/24 07:19:27] ppsci INFO: epoch: 1611, train_loss: 0.024994, train_metric: 0.116144, eval_loss: 0.049521, eval_mae: 0.151931 -[2024/06/24 07:19:27] ppsci INFO: train: epoch 1612 | step 0 | lr 0.000339 | loss 0.031991 | mae 0.129063 -[2024/06/24 07:19:28] ppsci INFO: train: epoch 1612 | step 10 | lr 0.000339 | loss 0.020265 | mae 0.100102 -[2024/06/24 07:19:28] ppsci INFO: train: epoch 1612 | step 20 | lr 0.000339 | loss 0.018014 | mae 0.102756 -[2024/06/24 07:19:29] ppsci INFO: train: epoch 1612 | step 30 | lr 0.000339 | loss 0.025031 | mae 0.119373 -[2024/06/24 07:19:29] ppsci INFO: train: epoch 1612 | step 38 | lr 0.000339 | loss 0.037818 | mae 0.143336 -[2024/06/24 07:19:29] ppsci INFO: epoch: 1612, train_loss: 0.026163, train_metric: 0.117372, eval_loss: 0.044523, eval_mae: 0.148679 -[2024/06/24 07:19:29] ppsci INFO: train: epoch 1613 | step 0 | lr 0.000340 | loss 0.018457 | mae 0.103245 -[2024/06/24 07:19:30] ppsci INFO: train: epoch 1613 | step 10 | lr 0.000340 | loss 0.020419 | mae 0.109278 -[2024/06/24 07:19:30] ppsci INFO: train: epoch 1613 | step 20 | lr 0.000340 | loss 0.025366 | mae 0.119339 -[2024/06/24 07:19:31] ppsci INFO: train: epoch 1613 | step 30 | lr 0.000340 | loss 0.021115 | mae 0.107774 -[2024/06/24 07:19:31] ppsci INFO: train: epoch 1613 | step 38 | lr 0.000340 | loss 0.022395 | mae 0.105312 -[2024/06/24 07:19:31] ppsci INFO: epoch: 1613, train_loss: 0.023245, train_metric: 0.112643, eval_loss: 0.049066, eval_mae: 0.145616 -[2024/06/24 07:19:31] ppsci INFO: train: epoch 1614 | step 0 | lr 0.000341 | loss 0.020449 | mae 0.110271 -[2024/06/24 07:19:32] ppsci INFO: train: epoch 1614 | step 10 | lr 0.000341 | loss 0.023150 | mae 0.108333 -[2024/06/24 07:19:32] ppsci INFO: train: epoch 1614 | step 20 | lr 0.000341 | loss 0.030917 | mae 0.123699 -[2024/06/24 07:19:33] ppsci INFO: train: epoch 1614 | step 30 | lr 0.000341 | loss 0.022156 | mae 0.113305 -[2024/06/24 07:19:33] ppsci INFO: train: epoch 1614 | step 38 | lr 0.000341 | loss 0.028276 | mae 0.124130 -[2024/06/24 07:19:33] ppsci INFO: epoch: 1614, train_loss: 0.023417, train_metric: 0.113657, eval_loss: 0.046518, eval_mae: 0.148502 -[2024/06/24 07:19:33] ppsci INFO: train: epoch 1615 | step 0 | lr 0.000342 | loss 0.026595 | mae 0.115577 -[2024/06/24 07:19:34] ppsci INFO: train: epoch 1615 | step 10 | lr 0.000342 | loss 0.026331 | mae 0.129532 -[2024/06/24 07:19:34] ppsci INFO: train: epoch 1615 | step 20 | lr 0.000342 | loss 0.018499 | mae 0.104960 -[2024/06/24 07:19:35] ppsci INFO: train: epoch 1615 | step 30 | lr 0.000342 | loss 0.036709 | mae 0.142079 -[2024/06/24 07:19:35] ppsci INFO: train: epoch 1615 | step 38 | lr 0.000342 | loss 0.025997 | mae 0.137444 -[2024/06/24 07:19:35] ppsci INFO: epoch: 1615, train_loss: 0.024931, train_metric: 0.115469, eval_loss: 0.044760, eval_mae: 0.153210 -[2024/06/24 07:19:35] ppsci INFO: train: epoch 1616 | step 0 | lr 0.000342 | loss 0.031064 | mae 0.137282 -[2024/06/24 07:19:36] ppsci INFO: train: epoch 1616 | step 10 | lr 0.000342 | loss 0.024486 | mae 0.120863 -[2024/06/24 07:19:36] ppsci INFO: train: epoch 1616 | step 20 | lr 0.000342 | loss 0.020079 | mae 0.105482 -[2024/06/24 07:19:37] ppsci INFO: train: epoch 1616 | step 30 | lr 0.000342 | loss 0.023774 | mae 0.119545 -[2024/06/24 07:19:37] ppsci INFO: train: epoch 1616 | step 38 | lr 0.000342 | loss 0.034989 | mae 0.157035 -[2024/06/24 07:19:37] ppsci INFO: epoch: 1616, train_loss: 0.025164, train_metric: 0.116590, eval_loss: 0.050356, eval_mae: 0.149729 -[2024/06/24 07:19:38] ppsci INFO: train: epoch 1617 | step 0 | lr 0.000343 | loss 0.019498 | mae 0.105744 -[2024/06/24 07:19:38] ppsci INFO: train: epoch 1617 | step 10 | lr 0.000343 | loss 0.017871 | mae 0.107751 -[2024/06/24 07:19:39] ppsci INFO: train: epoch 1617 | step 20 | lr 0.000343 | loss 0.026427 | mae 0.116045 -[2024/06/24 07:19:39] ppsci INFO: train: epoch 1617 | step 30 | lr 0.000343 | loss 0.019176 | mae 0.096310 -[2024/06/24 07:19:40] ppsci INFO: train: epoch 1617 | step 38 | lr 0.000343 | loss 0.022590 | mae 0.095751 -[2024/06/24 07:19:40] ppsci INFO: epoch: 1617, train_loss: 0.023002, train_metric: 0.112736, eval_loss: 0.049530, eval_mae: 0.150849 -[2024/06/24 07:19:40] ppsci INFO: train: epoch 1618 | step 0 | lr 0.000344 | loss 0.033927 | mae 0.132162 -[2024/06/24 07:19:40] ppsci INFO: train: epoch 1618 | step 10 | lr 0.000344 | loss 0.019632 | mae 0.104847 -[2024/06/24 07:19:41] ppsci INFO: train: epoch 1618 | step 20 | lr 0.000344 | loss 0.021267 | mae 0.110280 -[2024/06/24 07:19:41] ppsci INFO: train: epoch 1618 | step 30 | lr 0.000344 | loss 0.024685 | mae 0.116996 -[2024/06/24 07:19:42] ppsci INFO: train: epoch 1618 | step 38 | lr 0.000344 | loss 0.103764 | mae 0.232551 -[2024/06/24 07:19:42] ppsci INFO: epoch: 1618, train_loss: 0.025697, train_metric: 0.113503, eval_loss: 0.046266, eval_mae: 0.150084 -[2024/06/24 07:19:42] ppsci INFO: train: epoch 1619 | step 0 | lr 0.000344 | loss 0.021215 | mae 0.107729 -[2024/06/24 07:19:43] ppsci INFO: train: epoch 1619 | step 10 | lr 0.000344 | loss 0.030458 | mae 0.134568 -[2024/06/24 07:19:43] ppsci INFO: train: epoch 1619 | step 20 | lr 0.000344 | loss 0.020293 | mae 0.106286 -[2024/06/24 07:19:44] ppsci INFO: train: epoch 1619 | step 30 | lr 0.000344 | loss 0.024025 | mae 0.113867 -[2024/06/24 07:19:44] ppsci INFO: train: epoch 1619 | step 38 | lr 0.000344 | loss 0.034521 | mae 0.133830 -[2024/06/24 07:19:44] ppsci INFO: epoch: 1619, train_loss: 0.023794, train_metric: 0.114354, eval_loss: 0.045141, eval_mae: 0.148062 -[2024/06/24 07:19:44] ppsci INFO: train: epoch 1620 | step 0 | lr 0.000345 | loss 0.024676 | mae 0.117089 -[2024/06/24 07:19:45] ppsci INFO: train: epoch 1620 | step 10 | lr 0.000345 | loss 0.030459 | mae 0.135249 -[2024/06/24 07:19:45] ppsci INFO: train: epoch 1620 | step 20 | lr 0.000345 | loss 0.017446 | mae 0.104003 -[2024/06/24 07:19:46] ppsci INFO: train: epoch 1620 | step 30 | lr 0.000345 | loss 0.021491 | mae 0.107181 -[2024/06/24 07:19:46] ppsci INFO: train: epoch 1620 | step 38 | lr 0.000345 | loss 0.039219 | mae 0.135252 -[2024/06/24 07:19:46] ppsci INFO: epoch: 1620, train_loss: 0.025689, train_metric: 0.118221, eval_loss: 0.048554, eval_mae: 0.147785 -[2024/06/24 07:19:46] ppsci INFO: train: epoch 1621 | step 0 | lr 0.000346 | loss 0.018634 | mae 0.102632 -[2024/06/24 07:19:47] ppsci INFO: train: epoch 1621 | step 10 | lr 0.000346 | loss 0.026746 | mae 0.120786 -[2024/06/24 07:19:47] ppsci INFO: train: epoch 1621 | step 20 | lr 0.000346 | loss 0.018256 | mae 0.101944 -[2024/06/24 07:19:48] ppsci INFO: train: epoch 1621 | step 30 | lr 0.000346 | loss 0.026776 | mae 0.120536 -[2024/06/24 07:19:48] ppsci INFO: train: epoch 1621 | step 38 | lr 0.000346 | loss 0.020839 | mae 0.109380 -[2024/06/24 07:19:49] ppsci INFO: epoch: 1621, train_loss: 0.023301, train_metric: 0.113264, eval_loss: 0.051314, eval_mae: 0.154904 -[2024/06/24 07:19:49] ppsci INFO: train: epoch 1622 | step 0 | lr 0.000347 | loss 0.016008 | mae 0.097763 -[2024/06/24 07:19:49] ppsci INFO: train: epoch 1622 | step 10 | lr 0.000347 | loss 0.025826 | mae 0.121549 -[2024/06/24 07:19:50] ppsci INFO: train: epoch 1622 | step 20 | lr 0.000347 | loss 0.021813 | mae 0.112005 -[2024/06/24 07:19:50] ppsci INFO: train: epoch 1622 | step 30 | lr 0.000347 | loss 0.025341 | mae 0.121161 -[2024/06/24 07:19:51] ppsci INFO: train: epoch 1622 | step 38 | lr 0.000347 | loss 0.014138 | mae 0.094124 -[2024/06/24 07:19:51] ppsci INFO: epoch: 1622, train_loss: 0.023414, train_metric: 0.114564, eval_loss: 0.045174, eval_mae: 0.145532 -[2024/06/24 07:19:51] ppsci INFO: train: epoch 1623 | step 0 | lr 0.000347 | loss 0.023789 | mae 0.121030 -[2024/06/24 07:19:51] ppsci INFO: train: epoch 1623 | step 10 | lr 0.000347 | loss 0.023714 | mae 0.112149 -[2024/06/24 07:19:52] ppsci INFO: train: epoch 1623 | step 20 | lr 0.000347 | loss 0.031912 | mae 0.130488 -[2024/06/24 07:19:52] ppsci INFO: train: epoch 1623 | step 30 | lr 0.000347 | loss 0.024716 | mae 0.117778 -[2024/06/24 07:19:53] ppsci INFO: train: epoch 1623 | step 38 | lr 0.000347 | loss 0.017115 | mae 0.104947 -[2024/06/24 07:19:53] ppsci INFO: epoch: 1623, train_loss: 0.024297, train_metric: 0.114414, eval_loss: 0.047619, eval_mae: 0.148743 -[2024/06/24 07:19:53] ppsci INFO: train: epoch 1624 | step 0 | lr 0.000348 | loss 0.034633 | mae 0.137921 -[2024/06/24 07:19:54] ppsci INFO: train: epoch 1624 | step 10 | lr 0.000348 | loss 0.028667 | mae 0.126602 -[2024/06/24 07:19:54] ppsci INFO: train: epoch 1624 | step 20 | lr 0.000348 | loss 0.023143 | mae 0.108382 -[2024/06/24 07:19:55] ppsci INFO: train: epoch 1624 | step 30 | lr 0.000348 | loss 0.033093 | mae 0.132941 -[2024/06/24 07:19:55] ppsci INFO: train: epoch 1624 | step 38 | lr 0.000348 | loss 0.015311 | mae 0.103304 -[2024/06/24 07:19:55] ppsci INFO: epoch: 1624, train_loss: 0.025202, train_metric: 0.117240, eval_loss: 0.046723, eval_mae: 0.149008 -[2024/06/24 07:19:55] ppsci INFO: train: epoch 1625 | step 0 | lr 0.000349 | loss 0.018249 | mae 0.102079 -[2024/06/24 07:19:56] ppsci INFO: train: epoch 1625 | step 10 | lr 0.000349 | loss 0.026955 | mae 0.119635 -[2024/06/24 07:19:56] ppsci INFO: train: epoch 1625 | step 20 | lr 0.000349 | loss 0.024335 | mae 0.111184 -[2024/06/24 07:19:57] ppsci INFO: train: epoch 1625 | step 30 | lr 0.000349 | loss 0.020355 | mae 0.107469 -[2024/06/24 07:19:57] ppsci INFO: train: epoch 1625 | step 38 | lr 0.000349 | loss 0.046800 | mae 0.157791 -[2024/06/24 07:19:57] ppsci INFO: epoch: 1625, train_loss: 0.024909, train_metric: 0.113611, eval_loss: 0.042420, eval_mae: 0.142049 -[2024/06/24 07:19:57] ppsci INFO: train: epoch 1626 | step 0 | lr 0.000349 | loss 0.019918 | mae 0.110814 -[2024/06/24 07:19:58] ppsci INFO: train: epoch 1626 | step 10 | lr 0.000349 | loss 0.020311 | mae 0.108697 -[2024/06/24 07:19:58] ppsci INFO: train: epoch 1626 | step 20 | lr 0.000349 | loss 0.022845 | mae 0.114149 -[2024/06/24 07:19:59] ppsci INFO: train: epoch 1626 | step 30 | lr 0.000349 | loss 0.027701 | mae 0.129812 -[2024/06/24 07:19:59] ppsci INFO: train: epoch 1626 | step 38 | lr 0.000349 | loss 0.012413 | mae 0.101127 -[2024/06/24 07:19:59] ppsci INFO: epoch: 1626, train_loss: 0.022762, train_metric: 0.112708, eval_loss: 0.049227, eval_mae: 0.145358 -[2024/06/24 07:19:59] ppsci INFO: train: epoch 1627 | step 0 | lr 0.000350 | loss 0.021230 | mae 0.108042 -[2024/06/24 07:20:00] ppsci INFO: train: epoch 1627 | step 10 | lr 0.000350 | loss 0.018993 | mae 0.105642 -[2024/06/24 07:20:00] ppsci INFO: train: epoch 1627 | step 20 | lr 0.000350 | loss 0.032210 | mae 0.128893 -[2024/06/24 07:20:01] ppsci INFO: train: epoch 1627 | step 30 | lr 0.000350 | loss 0.025671 | mae 0.115709 -[2024/06/24 07:20:01] ppsci INFO: train: epoch 1627 | step 38 | lr 0.000350 | loss 0.040639 | mae 0.146507 -[2024/06/24 07:20:01] ppsci INFO: epoch: 1627, train_loss: 0.025119, train_metric: 0.116012, eval_loss: 0.043367, eval_mae: 0.146169 -[2024/06/24 07:20:02] ppsci INFO: train: epoch 1628 | step 0 | lr 0.000351 | loss 0.021254 | mae 0.110918 -[2024/06/24 07:20:02] ppsci INFO: train: epoch 1628 | step 10 | lr 0.000351 | loss 0.023069 | mae 0.114477 -[2024/06/24 07:20:03] ppsci INFO: train: epoch 1628 | step 20 | lr 0.000351 | loss 0.021061 | mae 0.110906 -[2024/06/24 07:20:03] ppsci INFO: train: epoch 1628 | step 30 | lr 0.000351 | loss 0.018372 | mae 0.106366 -[2024/06/24 07:20:03] ppsci INFO: train: epoch 1628 | step 38 | lr 0.000351 | loss 0.026029 | mae 0.136699 -[2024/06/24 07:20:04] ppsci INFO: epoch: 1628, train_loss: 0.023724, train_metric: 0.113771, eval_loss: 0.047955, eval_mae: 0.150935 -[2024/06/24 07:20:04] ppsci INFO: train: epoch 1629 | step 0 | lr 0.000352 | loss 0.025664 | mae 0.117770 -[2024/06/24 07:20:04] ppsci INFO: train: epoch 1629 | step 10 | lr 0.000352 | loss 0.018833 | mae 0.096895 -[2024/06/24 07:20:05] ppsci INFO: train: epoch 1629 | step 20 | lr 0.000352 | loss 0.030433 | mae 0.122111 -[2024/06/24 07:20:05] ppsci INFO: train: epoch 1629 | step 30 | lr 0.000352 | loss 0.020330 | mae 0.105970 -[2024/06/24 07:20:06] ppsci INFO: train: epoch 1629 | step 38 | lr 0.000352 | loss 0.026320 | mae 0.129341 -[2024/06/24 07:20:06] ppsci INFO: epoch: 1629, train_loss: 0.022554, train_metric: 0.111914, eval_loss: 0.048704, eval_mae: 0.149647 -[2024/06/24 07:20:06] ppsci INFO: train: epoch 1630 | step 0 | lr 0.000352 | loss 0.021609 | mae 0.109672 -[2024/06/24 07:20:06] ppsci INFO: train: epoch 1630 | step 10 | lr 0.000352 | loss 0.019951 | mae 0.110193 -[2024/06/24 07:20:07] ppsci INFO: train: epoch 1630 | step 20 | lr 0.000352 | loss 0.025734 | mae 0.109296 -[2024/06/24 07:20:07] ppsci INFO: train: epoch 1630 | step 30 | lr 0.000352 | loss 0.023574 | mae 0.111842 -[2024/06/24 07:20:08] ppsci INFO: train: epoch 1630 | step 38 | lr 0.000352 | loss 0.014222 | mae 0.098659 -[2024/06/24 07:20:08] ppsci INFO: epoch: 1630, train_loss: 0.023201, train_metric: 0.112753, eval_loss: 0.051329, eval_mae: 0.153022 -[2024/06/24 07:20:08] ppsci INFO: train: epoch 1631 | step 0 | lr 0.000353 | loss 0.020931 | mae 0.114933 -[2024/06/24 07:20:08] ppsci INFO: train: epoch 1631 | step 10 | lr 0.000353 | loss 0.024959 | mae 0.121817 -[2024/06/24 07:20:09] ppsci INFO: train: epoch 1631 | step 20 | lr 0.000353 | loss 0.021202 | mae 0.110499 -[2024/06/24 07:20:09] ppsci INFO: train: epoch 1631 | step 30 | lr 0.000353 | loss 0.040470 | mae 0.126676 -[2024/06/24 07:20:10] ppsci INFO: train: epoch 1631 | step 38 | lr 0.000353 | loss 0.038893 | mae 0.123109 -[2024/06/24 07:20:10] ppsci INFO: epoch: 1631, train_loss: 0.024912, train_metric: 0.116060, eval_loss: 0.046310, eval_mae: 0.147143 -[2024/06/24 07:20:10] ppsci INFO: train: epoch 1632 | step 0 | lr 0.000354 | loss 0.017739 | mae 0.097380 -[2024/06/24 07:20:11] ppsci INFO: train: epoch 1632 | step 10 | lr 0.000354 | loss 0.024665 | mae 0.120238 -[2024/06/24 07:20:11] ppsci INFO: train: epoch 1632 | step 20 | lr 0.000354 | loss 0.024099 | mae 0.111668 -[2024/06/24 07:20:12] ppsci INFO: train: epoch 1632 | step 30 | lr 0.000354 | loss 0.028485 | mae 0.132024 -[2024/06/24 07:20:12] ppsci INFO: train: epoch 1632 | step 38 | lr 0.000354 | loss 0.016454 | mae 0.106961 -[2024/06/24 07:20:12] ppsci INFO: epoch: 1632, train_loss: 0.024302, train_metric: 0.115776, eval_loss: 0.047198, eval_mae: 0.149899 -[2024/06/24 07:20:12] ppsci INFO: train: epoch 1633 | step 0 | lr 0.000354 | loss 0.019748 | mae 0.108849 -[2024/06/24 07:20:13] ppsci INFO: train: epoch 1633 | step 10 | lr 0.000354 | loss 0.029023 | mae 0.124308 -[2024/06/24 07:20:13] ppsci INFO: train: epoch 1633 | step 20 | lr 0.000354 | loss 0.019009 | mae 0.103478 -[2024/06/24 07:20:14] ppsci INFO: train: epoch 1633 | step 30 | lr 0.000354 | loss 0.021954 | mae 0.114600 -[2024/06/24 07:20:14] ppsci INFO: train: epoch 1633 | step 38 | lr 0.000354 | loss 0.011860 | mae 0.078509 -[2024/06/24 07:20:14] ppsci INFO: epoch: 1633, train_loss: 0.023204, train_metric: 0.113873, eval_loss: 0.050805, eval_mae: 0.154996 -[2024/06/24 07:20:14] ppsci INFO: train: epoch 1634 | step 0 | lr 0.000355 | loss 0.024302 | mae 0.111673 -[2024/06/24 07:20:15] ppsci INFO: train: epoch 1634 | step 10 | lr 0.000355 | loss 0.020696 | mae 0.106027 -[2024/06/24 07:20:16] ppsci INFO: train: epoch 1634 | step 20 | lr 0.000355 | loss 0.026189 | mae 0.121906 -[2024/06/24 07:20:16] ppsci INFO: train: epoch 1634 | step 30 | lr 0.000355 | loss 0.017723 | mae 0.094582 -[2024/06/24 07:20:16] ppsci INFO: train: epoch 1634 | step 38 | lr 0.000355 | loss 0.048738 | mae 0.158698 -[2024/06/24 07:20:16] ppsci INFO: epoch: 1634, train_loss: 0.024009, train_metric: 0.113902, eval_loss: 0.050741, eval_mae: 0.150963 -[2024/06/24 07:20:17] ppsci INFO: train: epoch 1635 | step 0 | lr 0.000356 | loss 0.019705 | mae 0.111534 -[2024/06/24 07:20:17] ppsci INFO: train: epoch 1635 | step 10 | lr 0.000356 | loss 0.028272 | mae 0.118728 -[2024/06/24 07:20:18] ppsci INFO: train: epoch 1635 | step 20 | lr 0.000356 | loss 0.026249 | mae 0.120416 -[2024/06/24 07:20:18] ppsci INFO: train: epoch 1635 | step 30 | lr 0.000356 | loss 0.021666 | mae 0.103742 -[2024/06/24 07:20:19] ppsci INFO: train: epoch 1635 | step 38 | lr 0.000356 | loss 0.035161 | mae 0.112285 -[2024/06/24 07:20:19] ppsci INFO: epoch: 1635, train_loss: 0.025656, train_metric: 0.115884, eval_loss: 0.045465, eval_mae: 0.148445 -[2024/06/24 07:20:19] ppsci INFO: train: epoch 1636 | step 0 | lr 0.000357 | loss 0.022776 | mae 0.110496 -[2024/06/24 07:20:19] ppsci INFO: train: epoch 1636 | step 10 | lr 0.000357 | loss 0.023032 | mae 0.115149 -[2024/06/24 07:20:20] ppsci INFO: train: epoch 1636 | step 20 | lr 0.000357 | loss 0.021071 | mae 0.113044 -[2024/06/24 07:20:21] ppsci INFO: train: epoch 1636 | step 30 | lr 0.000357 | loss 0.024318 | mae 0.115568 -[2024/06/24 07:20:21] ppsci INFO: train: epoch 1636 | step 38 | lr 0.000357 | loss 0.039057 | mae 0.129657 -[2024/06/24 07:20:21] ppsci INFO: epoch: 1636, train_loss: 0.023993, train_metric: 0.113021, eval_loss: 0.046480, eval_mae: 0.148676 -[2024/06/24 07:20:21] ppsci INFO: train: epoch 1637 | step 0 | lr 0.000357 | loss 0.025152 | mae 0.113099 -[2024/06/24 07:20:22] ppsci INFO: train: epoch 1637 | step 10 | lr 0.000357 | loss 0.021493 | mae 0.108557 -[2024/06/24 07:20:22] ppsci INFO: train: epoch 1637 | step 20 | lr 0.000357 | loss 0.026903 | mae 0.122457 -[2024/06/24 07:20:23] ppsci INFO: train: epoch 1637 | step 30 | lr 0.000357 | loss 0.020144 | mae 0.101046 -[2024/06/24 07:20:23] ppsci INFO: train: epoch 1637 | step 38 | lr 0.000357 | loss 0.020486 | mae 0.110528 -[2024/06/24 07:20:23] ppsci INFO: epoch: 1637, train_loss: 0.023763, train_metric: 0.113544, eval_loss: 0.040846, eval_mae: 0.140778 -[2024/06/24 07:20:23] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:20:23] ppsci INFO: train: epoch 1638 | step 0 | lr 0.000358 | loss 0.025431 | mae 0.119151 -[2024/06/24 07:20:24] ppsci INFO: train: epoch 1638 | step 10 | lr 0.000358 | loss 0.015261 | mae 0.097926 -[2024/06/24 07:20:25] ppsci INFO: train: epoch 1638 | step 20 | lr 0.000358 | loss 0.016511 | mae 0.096594 -[2024/06/24 07:20:25] ppsci INFO: train: epoch 1638 | step 30 | lr 0.000358 | loss 0.026760 | mae 0.118515 -[2024/06/24 07:20:26] ppsci INFO: train: epoch 1638 | step 38 | lr 0.000358 | loss 0.021919 | mae 0.119791 -[2024/06/24 07:20:26] ppsci INFO: epoch: 1638, train_loss: 0.023569, train_metric: 0.113039, eval_loss: 0.042590, eval_mae: 0.144185 -[2024/06/24 07:20:26] ppsci INFO: train: epoch 1639 | step 0 | lr 0.000359 | loss 0.018329 | mae 0.104689 -[2024/06/24 07:20:26] ppsci INFO: train: epoch 1639 | step 10 | lr 0.000359 | loss 0.024794 | mae 0.121884 -[2024/06/24 07:20:27] ppsci INFO: train: epoch 1639 | step 20 | lr 0.000359 | loss 0.020334 | mae 0.108233 -[2024/06/24 07:20:27] ppsci INFO: train: epoch 1639 | step 30 | lr 0.000359 | loss 0.026797 | mae 0.118970 -[2024/06/24 07:20:28] ppsci INFO: train: epoch 1639 | step 38 | lr 0.000359 | loss 0.025364 | mae 0.134445 -[2024/06/24 07:20:28] ppsci INFO: epoch: 1639, train_loss: 0.024485, train_metric: 0.115259, eval_loss: 0.048380, eval_mae: 0.148786 -[2024/06/24 07:20:28] ppsci INFO: train: epoch 1640 | step 0 | lr 0.000359 | loss 0.027812 | mae 0.124351 -[2024/06/24 07:20:28] ppsci INFO: train: epoch 1640 | step 10 | lr 0.000359 | loss 0.023994 | mae 0.112995 -[2024/06/24 07:20:29] ppsci INFO: train: epoch 1640 | step 20 | lr 0.000359 | loss 0.031005 | mae 0.128376 -[2024/06/24 07:20:29] ppsci INFO: train: epoch 1640 | step 30 | lr 0.000359 | loss 0.024827 | mae 0.111571 -[2024/06/24 07:20:30] ppsci INFO: train: epoch 1640 | step 38 | lr 0.000359 | loss 0.033572 | mae 0.134448 -[2024/06/24 07:20:30] ppsci INFO: epoch: 1640, train_loss: 0.024402, train_metric: 0.114642, eval_loss: 0.048605, eval_mae: 0.151907 -[2024/06/24 07:20:30] ppsci INFO: train: epoch 1641 | step 0 | lr 0.000360 | loss 0.023728 | mae 0.109488 -[2024/06/24 07:20:30] ppsci INFO: train: epoch 1641 | step 10 | lr 0.000360 | loss 0.032250 | mae 0.122465 -[2024/06/24 07:20:31] ppsci INFO: train: epoch 1641 | step 20 | lr 0.000360 | loss 0.036139 | mae 0.137788 -[2024/06/24 07:20:31] ppsci INFO: train: epoch 1641 | step 30 | lr 0.000360 | loss 0.060538 | mae 0.155564 -[2024/06/24 07:20:32] ppsci INFO: train: epoch 1641 | step 38 | lr 0.000360 | loss 0.016946 | mae 0.107600 -[2024/06/24 07:20:32] ppsci INFO: epoch: 1641, train_loss: 0.031460, train_metric: 0.127801, eval_loss: 0.048342, eval_mae: 0.154608 -[2024/06/24 07:20:32] ppsci INFO: train: epoch 1642 | step 0 | lr 0.000361 | loss 0.036122 | mae 0.141878 -[2024/06/24 07:20:33] ppsci INFO: train: epoch 1642 | step 10 | lr 0.000361 | loss 0.022754 | mae 0.115721 -[2024/06/24 07:20:33] ppsci INFO: train: epoch 1642 | step 20 | lr 0.000361 | loss 0.028662 | mae 0.132107 -[2024/06/24 07:20:34] ppsci INFO: train: epoch 1642 | step 30 | lr 0.000361 | loss 0.024505 | mae 0.120075 -[2024/06/24 07:20:34] ppsci INFO: train: epoch 1642 | step 38 | lr 0.000361 | loss 0.036676 | mae 0.133085 -[2024/06/24 07:20:34] ppsci INFO: epoch: 1642, train_loss: 0.032079, train_metric: 0.121195, eval_loss: 0.045772, eval_mae: 0.150437 -[2024/06/24 07:20:34] ppsci INFO: train: epoch 1643 | step 0 | lr 0.000361 | loss 0.028622 | mae 0.127906 -[2024/06/24 07:20:35] ppsci INFO: train: epoch 1643 | step 10 | lr 0.000361 | loss 0.019026 | mae 0.110499 -[2024/06/24 07:20:35] ppsci INFO: train: epoch 1643 | step 20 | lr 0.000361 | loss 0.037546 | mae 0.132731 -[2024/06/24 07:20:36] ppsci INFO: train: epoch 1643 | step 30 | lr 0.000361 | loss 0.018651 | mae 0.100296 -[2024/06/24 07:20:36] ppsci INFO: train: epoch 1643 | step 38 | lr 0.000361 | loss 0.013694 | mae 0.093770 -[2024/06/24 07:20:36] ppsci INFO: epoch: 1643, train_loss: 0.025937, train_metric: 0.118496, eval_loss: 0.044879, eval_mae: 0.150301 -[2024/06/24 07:20:36] ppsci INFO: train: epoch 1644 | step 0 | lr 0.000362 | loss 0.017618 | mae 0.101814 -[2024/06/24 07:20:37] ppsci INFO: train: epoch 1644 | step 10 | lr 0.000362 | loss 0.029561 | mae 0.127590 -[2024/06/24 07:20:37] ppsci INFO: train: epoch 1644 | step 20 | lr 0.000362 | loss 0.026744 | mae 0.112567 -[2024/06/24 07:20:38] ppsci INFO: train: epoch 1644 | step 30 | lr 0.000362 | loss 0.032505 | mae 0.134687 -[2024/06/24 07:20:38] ppsci INFO: train: epoch 1644 | step 38 | lr 0.000362 | loss 0.014148 | mae 0.082719 -[2024/06/24 07:20:38] ppsci INFO: epoch: 1644, train_loss: 0.025368, train_metric: 0.117618, eval_loss: 0.044362, eval_mae: 0.146170 -[2024/06/24 07:20:38] ppsci INFO: train: epoch 1645 | step 0 | lr 0.000363 | loss 0.020366 | mae 0.112279 -[2024/06/24 07:20:39] ppsci INFO: train: epoch 1645 | step 10 | lr 0.000363 | loss 0.023864 | mae 0.119352 -[2024/06/24 07:20:39] ppsci INFO: train: epoch 1645 | step 20 | lr 0.000363 | loss 0.024966 | mae 0.113662 -[2024/06/24 07:20:40] ppsci INFO: train: epoch 1645 | step 30 | lr 0.000363 | loss 0.022452 | mae 0.110362 -[2024/06/24 07:20:40] ppsci INFO: train: epoch 1645 | step 38 | lr 0.000363 | loss 0.031638 | mae 0.113715 -[2024/06/24 07:20:40] ppsci INFO: epoch: 1645, train_loss: 0.025943, train_metric: 0.115170, eval_loss: 0.044361, eval_mae: 0.149247 -[2024/06/24 07:20:41] ppsci INFO: train: epoch 1646 | step 0 | lr 0.000363 | loss 0.016230 | mae 0.097353 -[2024/06/24 07:20:41] ppsci INFO: train: epoch 1646 | step 10 | lr 0.000363 | loss 0.028446 | mae 0.126163 -[2024/06/24 07:20:42] ppsci INFO: train: epoch 1646 | step 20 | lr 0.000363 | loss 0.029324 | mae 0.120896 -[2024/06/24 07:20:42] ppsci INFO: train: epoch 1646 | step 30 | lr 0.000363 | loss 0.020412 | mae 0.109121 -[2024/06/24 07:20:42] ppsci INFO: train: epoch 1646 | step 38 | lr 0.000363 | loss 0.032429 | mae 0.161068 -[2024/06/24 07:20:43] ppsci INFO: epoch: 1646, train_loss: 0.024847, train_metric: 0.113238, eval_loss: 0.043969, eval_mae: 0.147911 -[2024/06/24 07:20:43] ppsci INFO: train: epoch 1647 | step 0 | lr 0.000364 | loss 0.027970 | mae 0.118001 -[2024/06/24 07:20:43] ppsci INFO: train: epoch 1647 | step 10 | lr 0.000364 | loss 0.017327 | mae 0.101464 -[2024/06/24 07:20:44] ppsci INFO: train: epoch 1647 | step 20 | lr 0.000364 | loss 0.024076 | mae 0.114215 -[2024/06/24 07:20:44] ppsci INFO: train: epoch 1647 | step 30 | lr 0.000364 | loss 0.022159 | mae 0.107193 -[2024/06/24 07:20:45] ppsci INFO: train: epoch 1647 | step 38 | lr 0.000364 | loss 0.027116 | mae 0.138403 -[2024/06/24 07:20:45] ppsci INFO: epoch: 1647, train_loss: 0.024575, train_metric: 0.114791, eval_loss: 0.043602, eval_mae: 0.143329 -[2024/06/24 07:20:45] ppsci INFO: train: epoch 1648 | step 0 | lr 0.000365 | loss 0.027256 | mae 0.122695 -[2024/06/24 07:20:45] ppsci INFO: train: epoch 1648 | step 10 | lr 0.000365 | loss 0.022693 | mae 0.107255 -[2024/06/24 07:20:46] ppsci INFO: train: epoch 1648 | step 20 | lr 0.000365 | loss 0.020945 | mae 0.106983 -[2024/06/24 07:20:46] ppsci INFO: train: epoch 1648 | step 30 | lr 0.000365 | loss 0.023665 | mae 0.115497 -[2024/06/24 07:20:47] ppsci INFO: train: epoch 1648 | step 38 | lr 0.000365 | loss 0.038370 | mae 0.145935 -[2024/06/24 07:20:47] ppsci INFO: epoch: 1648, train_loss: 0.023350, train_metric: 0.111132, eval_loss: 0.042968, eval_mae: 0.141730 -[2024/06/24 07:20:47] ppsci INFO: train: epoch 1649 | step 0 | lr 0.000366 | loss 0.024353 | mae 0.120264 -[2024/06/24 07:20:47] ppsci INFO: train: epoch 1649 | step 10 | lr 0.000366 | loss 0.019437 | mae 0.105184 -[2024/06/24 07:20:48] ppsci INFO: train: epoch 1649 | step 20 | lr 0.000366 | loss 0.020323 | mae 0.114559 -[2024/06/24 07:20:48] ppsci INFO: train: epoch 1649 | step 30 | lr 0.000366 | loss 0.026331 | mae 0.117761 -[2024/06/24 07:20:49] ppsci INFO: train: epoch 1649 | step 38 | lr 0.000366 | loss 0.021947 | mae 0.118167 -[2024/06/24 07:20:49] ppsci INFO: epoch: 1649, train_loss: 0.022689, train_metric: 0.111934, eval_loss: 0.042784, eval_mae: 0.141630 -[2024/06/24 07:20:49] ppsci INFO: train: epoch 1650 | step 0 | lr 0.000366 | loss 0.014905 | mae 0.094506 -[2024/06/24 07:20:49] ppsci INFO: train: epoch 1650 | step 10 | lr 0.000366 | loss 0.015593 | mae 0.096722 -[2024/06/24 07:20:50] ppsci INFO: train: epoch 1650 | step 20 | lr 0.000366 | loss 0.022658 | mae 0.118337 -[2024/06/24 07:20:51] ppsci INFO: train: epoch 1650 | step 30 | lr 0.000366 | loss 0.022057 | mae 0.104790 -[2024/06/24 07:20:51] ppsci INFO: train: epoch 1650 | step 38 | lr 0.000366 | loss 0.032368 | mae 0.132300 -[2024/06/24 07:20:51] ppsci INFO: epoch: 1650, train_loss: 0.024267, train_metric: 0.112723, eval_loss: 0.046518, eval_mae: 0.144750 -[2024/06/24 07:20:51] ppsci INFO: train: epoch 1651 | step 0 | lr 0.000367 | loss 0.013943 | mae 0.089324 -[2024/06/24 07:20:52] ppsci INFO: train: epoch 1651 | step 10 | lr 0.000367 | loss 0.029930 | mae 0.129581 -[2024/06/24 07:20:52] ppsci INFO: train: epoch 1651 | step 20 | lr 0.000367 | loss 0.025807 | mae 0.122129 -[2024/06/24 07:20:53] ppsci INFO: train: epoch 1651 | step 30 | lr 0.000367 | loss 0.031395 | mae 0.126269 -[2024/06/24 07:20:53] ppsci INFO: train: epoch 1651 | step 38 | lr 0.000367 | loss 0.009540 | mae 0.077359 -[2024/06/24 07:20:53] ppsci INFO: epoch: 1651, train_loss: 0.023610, train_metric: 0.113498, eval_loss: 0.046780, eval_mae: 0.143923 -[2024/06/24 07:20:53] ppsci INFO: train: epoch 1652 | step 0 | lr 0.000368 | loss 0.026089 | mae 0.124108 -[2024/06/24 07:20:54] ppsci INFO: train: epoch 1652 | step 10 | lr 0.000368 | loss 0.022852 | mae 0.116769 -[2024/06/24 07:20:54] ppsci INFO: train: epoch 1652 | step 20 | lr 0.000368 | loss 0.028313 | mae 0.120831 -[2024/06/24 07:20:55] ppsci INFO: train: epoch 1652 | step 30 | lr 0.000368 | loss 0.024427 | mae 0.116373 -[2024/06/24 07:20:55] ppsci INFO: train: epoch 1652 | step 38 | lr 0.000368 | loss 0.015411 | mae 0.104326 -[2024/06/24 07:20:55] ppsci INFO: epoch: 1652, train_loss: 0.026470, train_metric: 0.119403, eval_loss: 0.047136, eval_mae: 0.150797 -[2024/06/24 07:20:55] ppsci INFO: train: epoch 1653 | step 0 | lr 0.000368 | loss 0.025170 | mae 0.117700 -[2024/06/24 07:20:56] ppsci INFO: train: epoch 1653 | step 10 | lr 0.000368 | loss 0.017909 | mae 0.097420 -[2024/06/24 07:20:56] ppsci INFO: train: epoch 1653 | step 20 | lr 0.000368 | loss 0.026250 | mae 0.116083 -[2024/06/24 07:20:57] ppsci INFO: train: epoch 1653 | step 30 | lr 0.000368 | loss 0.023446 | mae 0.115881 -[2024/06/24 07:20:57] ppsci INFO: train: epoch 1653 | step 38 | lr 0.000368 | loss 0.009806 | mae 0.085157 -[2024/06/24 07:20:57] ppsci INFO: epoch: 1653, train_loss: 0.022905, train_metric: 0.112984, eval_loss: 0.046814, eval_mae: 0.145011 -[2024/06/24 07:20:58] ppsci INFO: train: epoch 1654 | step 0 | lr 0.000369 | loss 0.022409 | mae 0.110500 -[2024/06/24 07:20:58] ppsci INFO: train: epoch 1654 | step 10 | lr 0.000369 | loss 0.019113 | mae 0.106637 -[2024/06/24 07:20:59] ppsci INFO: train: epoch 1654 | step 20 | lr 0.000369 | loss 0.018988 | mae 0.105008 -[2024/06/24 07:20:59] ppsci INFO: train: epoch 1654 | step 30 | lr 0.000369 | loss 0.022371 | mae 0.104817 -[2024/06/24 07:20:59] ppsci INFO: train: epoch 1654 | step 38 | lr 0.000369 | loss 0.016197 | mae 0.104353 -[2024/06/24 07:21:00] ppsci INFO: epoch: 1654, train_loss: 0.024235, train_metric: 0.113238, eval_loss: 0.047284, eval_mae: 0.155104 -[2024/06/24 07:21:00] ppsci INFO: train: epoch 1655 | step 0 | lr 0.000370 | loss 0.020812 | mae 0.111099 -[2024/06/24 07:21:00] ppsci INFO: train: epoch 1655 | step 10 | lr 0.000370 | loss 0.022814 | mae 0.109712 -[2024/06/24 07:21:01] ppsci INFO: train: epoch 1655 | step 20 | lr 0.000370 | loss 0.028402 | mae 0.134455 -[2024/06/24 07:21:01] ppsci INFO: train: epoch 1655 | step 30 | lr 0.000370 | loss 0.030936 | mae 0.124893 -[2024/06/24 07:21:02] ppsci INFO: train: epoch 1655 | step 38 | lr 0.000370 | loss 0.023406 | mae 0.115186 -[2024/06/24 07:21:02] ppsci INFO: epoch: 1655, train_loss: 0.025845, train_metric: 0.117170, eval_loss: 0.045947, eval_mae: 0.146715 -[2024/06/24 07:21:02] ppsci INFO: train: epoch 1656 | step 0 | lr 0.000370 | loss 0.029001 | mae 0.125734 -[2024/06/24 07:21:02] ppsci INFO: train: epoch 1656 | step 10 | lr 0.000370 | loss 0.026100 | mae 0.118086 -[2024/06/24 07:21:03] ppsci INFO: train: epoch 1656 | step 20 | lr 0.000370 | loss 0.026695 | mae 0.115487 -[2024/06/24 07:21:03] ppsci INFO: train: epoch 1656 | step 30 | lr 0.000370 | loss 0.034656 | mae 0.127242 -[2024/06/24 07:21:04] ppsci INFO: train: epoch 1656 | step 38 | lr 0.000370 | loss 0.019397 | mae 0.105551 -[2024/06/24 07:21:04] ppsci INFO: epoch: 1656, train_loss: 0.025071, train_metric: 0.115777, eval_loss: 0.045083, eval_mae: 0.150491 -[2024/06/24 07:21:04] ppsci INFO: train: epoch 1657 | step 0 | lr 0.000371 | loss 0.016515 | mae 0.102288 -[2024/06/24 07:21:04] ppsci INFO: train: epoch 1657 | step 10 | lr 0.000371 | loss 0.023613 | mae 0.116206 -[2024/06/24 07:21:05] ppsci INFO: train: epoch 1657 | step 20 | lr 0.000371 | loss 0.025007 | mae 0.116134 -[2024/06/24 07:21:05] ppsci INFO: train: epoch 1657 | step 30 | lr 0.000371 | loss 0.027916 | mae 0.117673 -[2024/06/24 07:21:06] ppsci INFO: train: epoch 1657 | step 38 | lr 0.000371 | loss 0.012875 | mae 0.089157 -[2024/06/24 07:21:06] ppsci INFO: epoch: 1657, train_loss: 0.022444, train_metric: 0.112290, eval_loss: 0.051488, eval_mae: 0.150967 -[2024/06/24 07:21:06] ppsci INFO: train: epoch 1658 | step 0 | lr 0.000372 | loss 0.019353 | mae 0.102019 -[2024/06/24 07:21:07] ppsci INFO: train: epoch 1658 | step 10 | lr 0.000372 | loss 0.030697 | mae 0.127978 -[2024/06/24 07:21:07] ppsci INFO: train: epoch 1658 | step 20 | lr 0.000372 | loss 0.024189 | mae 0.112781 -[2024/06/24 07:21:08] ppsci INFO: train: epoch 1658 | step 30 | lr 0.000372 | loss 0.021311 | mae 0.107714 -[2024/06/24 07:21:08] ppsci INFO: train: epoch 1658 | step 38 | lr 0.000372 | loss 0.024536 | mae 0.121681 -[2024/06/24 07:21:08] ppsci INFO: epoch: 1658, train_loss: 0.023680, train_metric: 0.113777, eval_loss: 0.045247, eval_mae: 0.145440 -[2024/06/24 07:21:08] ppsci INFO: train: epoch 1659 | step 0 | lr 0.000372 | loss 0.028997 | mae 0.122164 -[2024/06/24 07:21:09] ppsci INFO: train: epoch 1659 | step 10 | lr 0.000372 | loss 0.022608 | mae 0.114125 -[2024/06/24 07:21:09] ppsci INFO: train: epoch 1659 | step 20 | lr 0.000372 | loss 0.027838 | mae 0.125532 -[2024/06/24 07:21:10] ppsci INFO: train: epoch 1659 | step 30 | lr 0.000372 | loss 0.019683 | mae 0.106939 -[2024/06/24 07:21:10] ppsci INFO: train: epoch 1659 | step 38 | lr 0.000372 | loss 0.027138 | mae 0.126692 -[2024/06/24 07:21:10] ppsci INFO: epoch: 1659, train_loss: 0.023108, train_metric: 0.111414, eval_loss: 0.046735, eval_mae: 0.149546 -[2024/06/24 07:21:10] ppsci INFO: train: epoch 1660 | step 0 | lr 0.000373 | loss 0.014539 | mae 0.093824 -[2024/06/24 07:21:11] ppsci INFO: train: epoch 1660 | step 10 | lr 0.000373 | loss 0.028577 | mae 0.129250 -[2024/06/24 07:21:11] ppsci INFO: train: epoch 1660 | step 20 | lr 0.000373 | loss 0.017004 | mae 0.101773 -[2024/06/24 07:21:12] ppsci INFO: train: epoch 1660 | step 30 | lr 0.000373 | loss 0.035252 | mae 0.110835 -[2024/06/24 07:21:12] ppsci INFO: train: epoch 1660 | step 38 | lr 0.000373 | loss 0.035364 | mae 0.147982 -[2024/06/24 07:21:12] ppsci INFO: epoch: 1660, train_loss: 0.025087, train_metric: 0.114932, eval_loss: 0.045670, eval_mae: 0.148503 -[2024/06/24 07:21:12] ppsci INFO: train: epoch 1661 | step 0 | lr 0.000374 | loss 0.023716 | mae 0.111402 -[2024/06/24 07:21:13] ppsci INFO: train: epoch 1661 | step 10 | lr 0.000374 | loss 0.027653 | mae 0.117975 -[2024/06/24 07:21:14] ppsci INFO: train: epoch 1661 | step 20 | lr 0.000374 | loss 0.023950 | mae 0.116252 -[2024/06/24 07:21:14] ppsci INFO: train: epoch 1661 | step 30 | lr 0.000374 | loss 0.019466 | mae 0.108049 -[2024/06/24 07:21:14] ppsci INFO: train: epoch 1661 | step 38 | lr 0.000374 | loss 0.013796 | mae 0.095579 -[2024/06/24 07:21:15] ppsci INFO: epoch: 1661, train_loss: 0.022444, train_metric: 0.110715, eval_loss: 0.041037, eval_mae: 0.145343 -[2024/06/24 07:21:15] ppsci INFO: train: epoch 1662 | step 0 | lr 0.000374 | loss 0.047462 | mae 0.134104 -[2024/06/24 07:21:15] ppsci INFO: train: epoch 1662 | step 10 | lr 0.000374 | loss 0.020879 | mae 0.111966 -[2024/06/24 07:21:16] ppsci INFO: train: epoch 1662 | step 20 | lr 0.000374 | loss 0.020151 | mae 0.104356 -[2024/06/24 07:21:16] ppsci INFO: train: epoch 1662 | step 30 | lr 0.000374 | loss 0.019108 | mae 0.113955 -[2024/06/24 07:21:17] ppsci INFO: train: epoch 1662 | step 38 | lr 0.000374 | loss 0.019331 | mae 0.094233 -[2024/06/24 07:21:17] ppsci INFO: epoch: 1662, train_loss: 0.023434, train_metric: 0.112495, eval_loss: 0.044178, eval_mae: 0.143958 -[2024/06/24 07:21:17] ppsci INFO: train: epoch 1663 | step 0 | lr 0.000375 | loss 0.016971 | mae 0.098000 -[2024/06/24 07:21:17] ppsci INFO: train: epoch 1663 | step 10 | lr 0.000375 | loss 0.028600 | mae 0.118081 -[2024/06/24 07:21:18] ppsci INFO: train: epoch 1663 | step 20 | lr 0.000375 | loss 0.021882 | mae 0.118486 -[2024/06/24 07:21:18] ppsci INFO: train: epoch 1663 | step 30 | lr 0.000375 | loss 0.015230 | mae 0.093393 -[2024/06/24 07:21:19] ppsci INFO: train: epoch 1663 | step 38 | lr 0.000375 | loss 0.011956 | mae 0.089862 -[2024/06/24 07:21:19] ppsci INFO: epoch: 1663, train_loss: 0.022554, train_metric: 0.111508, eval_loss: 0.042904, eval_mae: 0.140531 -[2024/06/24 07:21:19] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:21:19] ppsci INFO: train: epoch 1664 | step 0 | lr 0.000376 | loss 0.014652 | mae 0.093346 -[2024/06/24 07:21:20] ppsci INFO: train: epoch 1664 | step 10 | lr 0.000376 | loss 0.029383 | mae 0.119993 -[2024/06/24 07:21:20] ppsci INFO: train: epoch 1664 | step 20 | lr 0.000376 | loss 0.020774 | mae 0.114015 -[2024/06/24 07:21:21] ppsci INFO: train: epoch 1664 | step 30 | lr 0.000376 | loss 0.018653 | mae 0.105788 -[2024/06/24 07:21:21] ppsci INFO: train: epoch 1664 | step 38 | lr 0.000376 | loss 0.015370 | mae 0.098044 -[2024/06/24 07:21:21] ppsci INFO: epoch: 1664, train_loss: 0.022910, train_metric: 0.113216, eval_loss: 0.047442, eval_mae: 0.147782 -[2024/06/24 07:21:21] ppsci INFO: train: epoch 1665 | step 0 | lr 0.000376 | loss 0.017053 | mae 0.102147 -[2024/06/24 07:21:22] ppsci INFO: train: epoch 1665 | step 10 | lr 0.000376 | loss 0.024348 | mae 0.109025 -[2024/06/24 07:21:22] ppsci INFO: train: epoch 1665 | step 20 | lr 0.000376 | loss 0.019101 | mae 0.104983 -[2024/06/24 07:21:23] ppsci INFO: train: epoch 1665 | step 30 | lr 0.000376 | loss 0.022272 | mae 0.107729 -[2024/06/24 07:21:23] ppsci INFO: train: epoch 1665 | step 38 | lr 0.000376 | loss 0.054186 | mae 0.161574 -[2024/06/24 07:21:23] ppsci INFO: epoch: 1665, train_loss: 0.023773, train_metric: 0.110839, eval_loss: 0.050093, eval_mae: 0.147328 -[2024/06/24 07:21:23] ppsci INFO: train: epoch 1666 | step 0 | lr 0.000377 | loss 0.022660 | mae 0.113674 -[2024/06/24 07:21:24] ppsci INFO: train: epoch 1666 | step 10 | lr 0.000377 | loss 0.021424 | mae 0.108637 -[2024/06/24 07:21:24] ppsci INFO: train: epoch 1666 | step 20 | lr 0.000377 | loss 0.024553 | mae 0.121687 -[2024/06/24 07:21:25] ppsci INFO: train: epoch 1666 | step 30 | lr 0.000377 | loss 0.039311 | mae 0.148433 -[2024/06/24 07:21:25] ppsci INFO: train: epoch 1666 | step 38 | lr 0.000377 | loss 0.051017 | mae 0.175980 -[2024/06/24 07:21:25] ppsci INFO: epoch: 1666, train_loss: 0.026155, train_metric: 0.117949, eval_loss: 0.047496, eval_mae: 0.148902 -[2024/06/24 07:21:25] ppsci INFO: train: epoch 1667 | step 0 | lr 0.000378 | loss 0.030193 | mae 0.127831 -[2024/06/24 07:21:26] ppsci INFO: train: epoch 1667 | step 10 | lr 0.000378 | loss 0.032758 | mae 0.133081 -[2024/06/24 07:21:27] ppsci INFO: train: epoch 1667 | step 20 | lr 0.000378 | loss 0.024693 | mae 0.121637 -[2024/06/24 07:21:27] ppsci INFO: train: epoch 1667 | step 30 | lr 0.000378 | loss 0.025916 | mae 0.115284 -[2024/06/24 07:21:28] ppsci INFO: train: epoch 1667 | step 38 | lr 0.000378 | loss 0.060238 | mae 0.145939 -[2024/06/24 07:21:28] ppsci INFO: epoch: 1667, train_loss: 0.026543, train_metric: 0.117736, eval_loss: 0.044420, eval_mae: 0.148005 -[2024/06/24 07:21:28] ppsci INFO: train: epoch 1668 | step 0 | lr 0.000378 | loss 0.026691 | mae 0.118679 -[2024/06/24 07:21:28] ppsci INFO: train: epoch 1668 | step 10 | lr 0.000378 | loss 0.020061 | mae 0.108295 -[2024/06/24 07:21:29] ppsci INFO: train: epoch 1668 | step 20 | lr 0.000378 | loss 0.030201 | mae 0.116148 -[2024/06/24 07:21:29] ppsci INFO: train: epoch 1668 | step 30 | lr 0.000378 | loss 0.014625 | mae 0.097752 -[2024/06/24 07:21:30] ppsci INFO: train: epoch 1668 | step 38 | lr 0.000378 | loss 0.038348 | mae 0.138684 -[2024/06/24 07:21:30] ppsci INFO: epoch: 1668, train_loss: 0.025908, train_metric: 0.115666, eval_loss: 0.049987, eval_mae: 0.152429 -[2024/06/24 07:21:30] ppsci INFO: train: epoch 1669 | step 0 | lr 0.000379 | loss 0.042477 | mae 0.130329 -[2024/06/24 07:21:30] ppsci INFO: train: epoch 1669 | step 10 | lr 0.000379 | loss 0.021166 | mae 0.105073 -[2024/06/24 07:21:31] ppsci INFO: train: epoch 1669 | step 20 | lr 0.000379 | loss 0.026956 | mae 0.120464 -[2024/06/24 07:21:31] ppsci INFO: train: epoch 1669 | step 30 | lr 0.000379 | loss 0.029065 | mae 0.123508 -[2024/06/24 07:21:32] ppsci INFO: train: epoch 1669 | step 38 | lr 0.000379 | loss 0.044136 | mae 0.170290 -[2024/06/24 07:21:32] ppsci INFO: epoch: 1669, train_loss: 0.027098, train_metric: 0.114677, eval_loss: 0.047358, eval_mae: 0.150476 -[2024/06/24 07:21:32] ppsci INFO: train: epoch 1670 | step 0 | lr 0.000380 | loss 0.022872 | mae 0.107252 -[2024/06/24 07:21:33] ppsci INFO: train: epoch 1670 | step 10 | lr 0.000380 | loss 0.025464 | mae 0.124283 -[2024/06/24 07:21:33] ppsci INFO: train: epoch 1670 | step 20 | lr 0.000380 | loss 0.024224 | mae 0.115783 -[2024/06/24 07:21:34] ppsci INFO: train: epoch 1670 | step 30 | lr 0.000380 | loss 0.022468 | mae 0.105470 -[2024/06/24 07:21:34] ppsci INFO: train: epoch 1670 | step 38 | lr 0.000380 | loss 0.016249 | mae 0.102708 -[2024/06/24 07:21:34] ppsci INFO: epoch: 1670, train_loss: 0.023226, train_metric: 0.112398, eval_loss: 0.044195, eval_mae: 0.144239 -[2024/06/24 07:21:34] ppsci INFO: train: epoch 1671 | step 0 | lr 0.000380 | loss 0.018922 | mae 0.108514 -[2024/06/24 07:21:35] ppsci INFO: train: epoch 1671 | step 10 | lr 0.000380 | loss 0.029369 | mae 0.123590 -[2024/06/24 07:21:35] ppsci INFO: train: epoch 1671 | step 20 | lr 0.000380 | loss 0.019548 | mae 0.104756 -[2024/06/24 07:21:36] ppsci INFO: train: epoch 1671 | step 30 | lr 0.000380 | loss 0.020810 | mae 0.103830 -[2024/06/24 07:21:36] ppsci INFO: train: epoch 1671 | step 38 | lr 0.000380 | loss 0.036538 | mae 0.141320 -[2024/06/24 07:21:36] ppsci INFO: epoch: 1671, train_loss: 0.024119, train_metric: 0.114094, eval_loss: 0.045440, eval_mae: 0.147454 -[2024/06/24 07:21:36] ppsci INFO: train: epoch 1672 | step 0 | lr 0.000381 | loss 0.021276 | mae 0.108880 -[2024/06/24 07:21:37] ppsci INFO: train: epoch 1672 | step 10 | lr 0.000381 | loss 0.023062 | mae 0.116419 -[2024/06/24 07:21:37] ppsci INFO: train: epoch 1672 | step 20 | lr 0.000381 | loss 0.024118 | mae 0.116018 -[2024/06/24 07:21:38] ppsci INFO: train: epoch 1672 | step 30 | lr 0.000381 | loss 0.019930 | mae 0.103285 -[2024/06/24 07:21:38] ppsci INFO: train: epoch 1672 | step 38 | lr 0.000381 | loss 0.025802 | mae 0.116535 -[2024/06/24 07:21:39] ppsci INFO: epoch: 1672, train_loss: 0.023290, train_metric: 0.113496, eval_loss: 0.044385, eval_mae: 0.142851 -[2024/06/24 07:21:39] ppsci INFO: train: epoch 1673 | step 0 | lr 0.000382 | loss 0.019286 | mae 0.106451 -[2024/06/24 07:21:39] ppsci INFO: train: epoch 1673 | step 10 | lr 0.000382 | loss 0.018286 | mae 0.105963 -[2024/06/24 07:21:40] ppsci INFO: train: epoch 1673 | step 20 | lr 0.000382 | loss 0.021839 | mae 0.106005 -[2024/06/24 07:21:40] ppsci INFO: train: epoch 1673 | step 30 | lr 0.000382 | loss 0.017951 | mae 0.099765 -[2024/06/24 07:21:41] ppsci INFO: train: epoch 1673 | step 38 | lr 0.000382 | loss 0.020263 | mae 0.118996 -[2024/06/24 07:21:41] ppsci INFO: epoch: 1673, train_loss: 0.023769, train_metric: 0.113928, eval_loss: 0.044332, eval_mae: 0.149469 -[2024/06/24 07:21:41] ppsci INFO: train: epoch 1674 | step 0 | lr 0.000382 | loss 0.029737 | mae 0.132110 -[2024/06/24 07:21:41] ppsci INFO: train: epoch 1674 | step 10 | lr 0.000382 | loss 0.038855 | mae 0.134358 -[2024/06/24 07:21:42] ppsci INFO: train: epoch 1674 | step 20 | lr 0.000382 | loss 0.032261 | mae 0.127457 -[2024/06/24 07:21:42] ppsci INFO: train: epoch 1674 | step 30 | lr 0.000382 | loss 0.029825 | mae 0.126335 -[2024/06/24 07:21:43] ppsci INFO: train: epoch 1674 | step 38 | lr 0.000382 | loss 0.011056 | mae 0.088004 -[2024/06/24 07:21:43] ppsci INFO: epoch: 1674, train_loss: 0.025863, train_metric: 0.116035, eval_loss: 0.045686, eval_mae: 0.147905 -[2024/06/24 07:21:43] ppsci INFO: train: epoch 1675 | step 0 | lr 0.000383 | loss 0.021698 | mae 0.113304 -[2024/06/24 07:21:43] ppsci INFO: train: epoch 1675 | step 10 | lr 0.000383 | loss 0.019103 | mae 0.106365 -[2024/06/24 07:21:44] ppsci INFO: train: epoch 1675 | step 20 | lr 0.000383 | loss 0.018063 | mae 0.102169 -[2024/06/24 07:21:44] ppsci INFO: train: epoch 1675 | step 30 | lr 0.000383 | loss 0.021026 | mae 0.113599 -[2024/06/24 07:21:45] ppsci INFO: train: epoch 1675 | step 38 | lr 0.000383 | loss 0.014496 | mae 0.101129 -[2024/06/24 07:21:45] ppsci INFO: epoch: 1675, train_loss: 0.022796, train_metric: 0.111822, eval_loss: 0.041203, eval_mae: 0.139763 -[2024/06/24 07:21:45] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:21:45] ppsci INFO: train: epoch 1676 | step 0 | lr 0.000384 | loss 0.023048 | mae 0.111392 -[2024/06/24 07:21:46] ppsci INFO: train: epoch 1676 | step 10 | lr 0.000384 | loss 0.018040 | mae 0.096897 -[2024/06/24 07:21:46] ppsci INFO: train: epoch 1676 | step 20 | lr 0.000384 | loss 0.032475 | mae 0.122764 -[2024/06/24 07:21:47] ppsci INFO: train: epoch 1676 | step 30 | lr 0.000384 | loss 0.018945 | mae 0.107386 -[2024/06/24 07:21:47] ppsci INFO: train: epoch 1676 | step 38 | lr 0.000384 | loss 0.019869 | mae 0.100839 -[2024/06/24 07:21:47] ppsci INFO: epoch: 1676, train_loss: 0.022339, train_metric: 0.109691, eval_loss: 0.044292, eval_mae: 0.146381 -[2024/06/24 07:21:47] ppsci INFO: train: epoch 1677 | step 0 | lr 0.000384 | loss 0.016758 | mae 0.095822 -[2024/06/24 07:21:48] ppsci INFO: train: epoch 1677 | step 10 | lr 0.000384 | loss 0.018077 | mae 0.104233 -[2024/06/24 07:21:48] ppsci INFO: train: epoch 1677 | step 20 | lr 0.000384 | loss 0.024649 | mae 0.119586 -[2024/06/24 07:21:49] ppsci INFO: train: epoch 1677 | step 30 | lr 0.000384 | loss 0.020724 | mae 0.110027 -[2024/06/24 07:21:49] ppsci INFO: train: epoch 1677 | step 38 | lr 0.000384 | loss 0.024566 | mae 0.119966 -[2024/06/24 07:21:49] ppsci INFO: epoch: 1677, train_loss: 0.021516, train_metric: 0.109487, eval_loss: 0.043027, eval_mae: 0.140153 -[2024/06/24 07:21:49] ppsci INFO: train: epoch 1678 | step 0 | lr 0.000385 | loss 0.016307 | mae 0.102974 -[2024/06/24 07:21:50] ppsci INFO: train: epoch 1678 | step 10 | lr 0.000385 | loss 0.018283 | mae 0.097050 -[2024/06/24 07:21:50] ppsci INFO: train: epoch 1678 | step 20 | lr 0.000385 | loss 0.023916 | mae 0.115873 -[2024/06/24 07:21:51] ppsci INFO: train: epoch 1678 | step 30 | lr 0.000385 | loss 0.023489 | mae 0.118221 -[2024/06/24 07:21:51] ppsci INFO: train: epoch 1678 | step 38 | lr 0.000385 | loss 0.023686 | mae 0.128388 -[2024/06/24 07:21:51] ppsci INFO: epoch: 1678, train_loss: 0.023436, train_metric: 0.112463, eval_loss: 0.041384, eval_mae: 0.142932 -[2024/06/24 07:21:52] ppsci INFO: train: epoch 1679 | step 0 | lr 0.000386 | loss 0.024042 | mae 0.116463 -[2024/06/24 07:21:52] ppsci INFO: train: epoch 1679 | step 10 | lr 0.000386 | loss 0.016411 | mae 0.104129 -[2024/06/24 07:21:53] ppsci INFO: train: epoch 1679 | step 20 | lr 0.000386 | loss 0.018994 | mae 0.105574 -[2024/06/24 07:21:53] ppsci INFO: train: epoch 1679 | step 30 | lr 0.000386 | loss 0.025259 | mae 0.118679 -[2024/06/24 07:21:54] ppsci INFO: train: epoch 1679 | step 38 | lr 0.000386 | loss 0.011203 | mae 0.091744 -[2024/06/24 07:21:54] ppsci INFO: epoch: 1679, train_loss: 0.023397, train_metric: 0.112019, eval_loss: 0.046189, eval_mae: 0.145283 -[2024/06/24 07:21:54] ppsci INFO: train: epoch 1680 | step 0 | lr 0.000386 | loss 0.015945 | mae 0.097566 -[2024/06/24 07:21:54] ppsci INFO: train: epoch 1680 | step 10 | lr 0.000386 | loss 0.027770 | mae 0.125761 -[2024/06/24 07:21:55] ppsci INFO: train: epoch 1680 | step 20 | lr 0.000386 | loss 0.026652 | mae 0.107183 -[2024/06/24 07:21:55] ppsci INFO: train: epoch 1680 | step 30 | lr 0.000386 | loss 0.023137 | mae 0.111059 -[2024/06/24 07:21:56] ppsci INFO: train: epoch 1680 | step 38 | lr 0.000386 | loss 0.013909 | mae 0.090889 -[2024/06/24 07:21:56] ppsci INFO: epoch: 1680, train_loss: 0.022882, train_metric: 0.110775, eval_loss: 0.045079, eval_mae: 0.142853 -[2024/06/24 07:21:56] ppsci INFO: train: epoch 1681 | step 0 | lr 0.000387 | loss 0.028156 | mae 0.128239 -[2024/06/24 07:21:56] ppsci INFO: train: epoch 1681 | step 10 | lr 0.000387 | loss 0.031028 | mae 0.107219 -[2024/06/24 07:21:57] ppsci INFO: train: epoch 1681 | step 20 | lr 0.000387 | loss 0.022998 | mae 0.118112 -[2024/06/24 07:21:57] ppsci INFO: train: epoch 1681 | step 30 | lr 0.000387 | loss 0.032464 | mae 0.118777 -[2024/06/24 07:21:58] ppsci INFO: train: epoch 1681 | step 38 | lr 0.000387 | loss 0.046241 | mae 0.170381 -[2024/06/24 07:21:58] ppsci INFO: epoch: 1681, train_loss: 0.024994, train_metric: 0.111012, eval_loss: 0.044790, eval_mae: 0.146660 -[2024/06/24 07:21:58] ppsci INFO: train: epoch 1682 | step 0 | lr 0.000388 | loss 0.021893 | mae 0.112086 -[2024/06/24 07:21:59] ppsci INFO: train: epoch 1682 | step 10 | lr 0.000388 | loss 0.025103 | mae 0.117602 -[2024/06/24 07:21:59] ppsci INFO: train: epoch 1682 | step 20 | lr 0.000388 | loss 0.028624 | mae 0.116629 -[2024/06/24 07:21:59] ppsci INFO: train: epoch 1682 | step 30 | lr 0.000388 | loss 0.028142 | mae 0.124743 -[2024/06/24 07:22:00] ppsci INFO: train: epoch 1682 | step 38 | lr 0.000388 | loss 0.052293 | mae 0.164520 -[2024/06/24 07:22:00] ppsci INFO: epoch: 1682, train_loss: 0.024240, train_metric: 0.114755, eval_loss: 0.040163, eval_mae: 0.139662 -[2024/06/24 07:22:00] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:22:00] ppsci INFO: train: epoch 1683 | step 0 | lr 0.000388 | loss 0.029390 | mae 0.124893 -[2024/06/24 07:22:01] ppsci INFO: train: epoch 1683 | step 10 | lr 0.000388 | loss 0.028195 | mae 0.118922 -[2024/06/24 07:22:01] ppsci INFO: train: epoch 1683 | step 20 | lr 0.000388 | loss 0.031670 | mae 0.119971 -[2024/06/24 07:22:02] ppsci INFO: train: epoch 1683 | step 30 | lr 0.000388 | loss 0.020826 | mae 0.110634 -[2024/06/24 07:22:02] ppsci INFO: train: epoch 1683 | step 38 | lr 0.000388 | loss 0.006224 | mae 0.065224 -[2024/06/24 07:22:02] ppsci INFO: epoch: 1683, train_loss: 0.022828, train_metric: 0.111441, eval_loss: 0.049379, eval_mae: 0.147737 -[2024/06/24 07:22:02] ppsci INFO: train: epoch 1684 | step 0 | lr 0.000389 | loss 0.027700 | mae 0.125928 -[2024/06/24 07:22:03] ppsci INFO: train: epoch 1684 | step 10 | lr 0.000389 | loss 0.021772 | mae 0.115060 -[2024/06/24 07:22:03] ppsci INFO: train: epoch 1684 | step 20 | lr 0.000389 | loss 0.021330 | mae 0.114779 -[2024/06/24 07:22:04] ppsci INFO: train: epoch 1684 | step 30 | lr 0.000389 | loss 0.018845 | mae 0.105422 -[2024/06/24 07:22:04] ppsci INFO: train: epoch 1684 | step 38 | lr 0.000389 | loss 0.017442 | mae 0.101044 -[2024/06/24 07:22:04] ppsci INFO: epoch: 1684, train_loss: 0.022326, train_metric: 0.110495, eval_loss: 0.044652, eval_mae: 0.144337 -[2024/06/24 07:22:04] ppsci INFO: train: epoch 1685 | step 0 | lr 0.000390 | loss 0.024684 | mae 0.113483 -[2024/06/24 07:22:05] ppsci INFO: train: epoch 1685 | step 10 | lr 0.000390 | loss 0.024879 | mae 0.121988 -[2024/06/24 07:22:05] ppsci INFO: train: epoch 1685 | step 20 | lr 0.000390 | loss 0.022336 | mae 0.110515 -[2024/06/24 07:22:06] ppsci INFO: train: epoch 1685 | step 30 | lr 0.000390 | loss 0.034847 | mae 0.123267 -[2024/06/24 07:22:06] ppsci INFO: train: epoch 1685 | step 38 | lr 0.000390 | loss 0.048014 | mae 0.164244 -[2024/06/24 07:22:06] ppsci INFO: epoch: 1685, train_loss: 0.023636, train_metric: 0.112609, eval_loss: 0.048391, eval_mae: 0.145560 -[2024/06/24 07:22:06] ppsci INFO: train: epoch 1686 | step 0 | lr 0.000390 | loss 0.020492 | mae 0.112255 -[2024/06/24 07:22:07] ppsci INFO: train: epoch 1686 | step 10 | lr 0.000390 | loss 0.023857 | mae 0.117045 -[2024/06/24 07:22:07] ppsci INFO: train: epoch 1686 | step 20 | lr 0.000390 | loss 0.025160 | mae 0.111674 -[2024/06/24 07:22:08] ppsci INFO: train: epoch 1686 | step 30 | lr 0.000390 | loss 0.017161 | mae 0.105614 -[2024/06/24 07:22:08] ppsci INFO: train: epoch 1686 | step 38 | lr 0.000390 | loss 0.023482 | mae 0.115181 -[2024/06/24 07:22:08] ppsci INFO: epoch: 1686, train_loss: 0.023870, train_metric: 0.113194, eval_loss: 0.045148, eval_mae: 0.145664 -[2024/06/24 07:22:08] ppsci INFO: train: epoch 1687 | step 0 | lr 0.000391 | loss 0.032455 | mae 0.131152 -[2024/06/24 07:22:09] ppsci INFO: train: epoch 1687 | step 10 | lr 0.000391 | loss 0.023714 | mae 0.117247 -[2024/06/24 07:22:10] ppsci INFO: train: epoch 1687 | step 20 | lr 0.000391 | loss 0.018441 | mae 0.105177 -[2024/06/24 07:22:10] ppsci INFO: train: epoch 1687 | step 30 | lr 0.000391 | loss 0.030889 | mae 0.134145 -[2024/06/24 07:22:10] ppsci INFO: train: epoch 1687 | step 38 | lr 0.000391 | loss 0.044419 | mae 0.155689 -[2024/06/24 07:22:11] ppsci INFO: epoch: 1687, train_loss: 0.024790, train_metric: 0.113911, eval_loss: 0.044619, eval_mae: 0.145786 -[2024/06/24 07:22:11] ppsci INFO: train: epoch 1688 | step 0 | lr 0.000391 | loss 0.018697 | mae 0.102712 -[2024/06/24 07:22:11] ppsci INFO: train: epoch 1688 | step 10 | lr 0.000391 | loss 0.023814 | mae 0.118741 -[2024/06/24 07:22:12] ppsci INFO: train: epoch 1688 | step 20 | lr 0.000391 | loss 0.020867 | mae 0.112215 -[2024/06/24 07:22:12] ppsci INFO: train: epoch 1688 | step 30 | lr 0.000391 | loss 0.017616 | mae 0.099805 -[2024/06/24 07:22:13] ppsci INFO: train: epoch 1688 | step 38 | lr 0.000391 | loss 0.016708 | mae 0.104734 -[2024/06/24 07:22:13] ppsci INFO: epoch: 1688, train_loss: 0.023509, train_metric: 0.111938, eval_loss: 0.040120, eval_mae: 0.139402 -[2024/06/24 07:22:13] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:22:13] ppsci INFO: train: epoch 1689 | step 0 | lr 0.000392 | loss 0.022515 | mae 0.116318 -[2024/06/24 07:22:13] ppsci INFO: train: epoch 1689 | step 10 | lr 0.000392 | loss 0.019664 | mae 0.106256 -[2024/06/24 07:22:14] ppsci INFO: train: epoch 1689 | step 20 | lr 0.000392 | loss 0.035738 | mae 0.137594 -[2024/06/24 07:22:14] ppsci INFO: train: epoch 1689 | step 30 | lr 0.000392 | loss 0.018990 | mae 0.104119 -[2024/06/24 07:22:15] ppsci INFO: train: epoch 1689 | step 38 | lr 0.000392 | loss 0.023816 | mae 0.118945 -[2024/06/24 07:22:15] ppsci INFO: epoch: 1689, train_loss: 0.023816, train_metric: 0.113171, eval_loss: 0.043812, eval_mae: 0.142746 -[2024/06/24 07:22:15] ppsci INFO: train: epoch 1690 | step 0 | lr 0.000393 | loss 0.016509 | mae 0.100521 -[2024/06/24 07:22:16] ppsci INFO: train: epoch 1690 | step 10 | lr 0.000393 | loss 0.021582 | mae 0.111337 -[2024/06/24 07:22:16] ppsci INFO: train: epoch 1690 | step 20 | lr 0.000393 | loss 0.019494 | mae 0.104266 -[2024/06/24 07:22:17] ppsci INFO: train: epoch 1690 | step 30 | lr 0.000393 | loss 0.030231 | mae 0.120107 -[2024/06/24 07:22:17] ppsci INFO: train: epoch 1690 | step 38 | lr 0.000393 | loss 0.013468 | mae 0.099237 -[2024/06/24 07:22:17] ppsci INFO: epoch: 1690, train_loss: 0.021450, train_metric: 0.109243, eval_loss: 0.044822, eval_mae: 0.148904 -[2024/06/24 07:22:17] ppsci INFO: train: epoch 1691 | step 0 | lr 0.000393 | loss 0.019885 | mae 0.100611 -[2024/06/24 07:22:18] ppsci INFO: train: epoch 1691 | step 10 | lr 0.000393 | loss 0.028404 | mae 0.132278 -[2024/06/24 07:22:19] ppsci INFO: train: epoch 1691 | step 20 | lr 0.000393 | loss 0.023854 | mae 0.116414 -[2024/06/24 07:22:19] ppsci INFO: train: epoch 1691 | step 30 | lr 0.000393 | loss 0.018116 | mae 0.103961 -[2024/06/24 07:22:20] ppsci INFO: train: epoch 1691 | step 38 | lr 0.000393 | loss 0.015784 | mae 0.094894 -[2024/06/24 07:22:20] ppsci INFO: epoch: 1691, train_loss: 0.021658, train_metric: 0.110373, eval_loss: 0.044760, eval_mae: 0.141426 -[2024/06/24 07:22:20] ppsci INFO: train: epoch 1692 | step 0 | lr 0.000394 | loss 0.024993 | mae 0.113436 -[2024/06/24 07:22:20] ppsci INFO: train: epoch 1692 | step 10 | lr 0.000394 | loss 0.016937 | mae 0.102710 -[2024/06/24 07:22:21] ppsci INFO: train: epoch 1692 | step 20 | lr 0.000394 | loss 0.024072 | mae 0.117870 -[2024/06/24 07:22:21] ppsci INFO: train: epoch 1692 | step 30 | lr 0.000394 | loss 0.015660 | mae 0.099036 -[2024/06/24 07:22:22] ppsci INFO: train: epoch 1692 | step 38 | lr 0.000394 | loss 0.053081 | mae 0.177678 -[2024/06/24 07:22:22] ppsci INFO: epoch: 1692, train_loss: 0.022329, train_metric: 0.110160, eval_loss: 0.047158, eval_mae: 0.150800 -[2024/06/24 07:22:22] ppsci INFO: train: epoch 1693 | step 0 | lr 0.000395 | loss 0.014043 | mae 0.093031 -[2024/06/24 07:22:22] ppsci INFO: train: epoch 1693 | step 10 | lr 0.000395 | loss 0.017519 | mae 0.102801 -[2024/06/24 07:22:23] ppsci INFO: train: epoch 1693 | step 20 | lr 0.000395 | loss 0.018255 | mae 0.103019 -[2024/06/24 07:22:24] ppsci INFO: train: epoch 1693 | step 30 | lr 0.000395 | loss 0.017043 | mae 0.096156 -[2024/06/24 07:22:24] ppsci INFO: train: epoch 1693 | step 38 | lr 0.000395 | loss 0.015148 | mae 0.091957 -[2024/06/24 07:22:24] ppsci INFO: epoch: 1693, train_loss: 0.023265, train_metric: 0.112149, eval_loss: 0.045616, eval_mae: 0.147628 -[2024/06/24 07:22:24] ppsci INFO: train: epoch 1694 | step 0 | lr 0.000395 | loss 0.020029 | mae 0.102850 -[2024/06/24 07:22:25] ppsci INFO: train: epoch 1694 | step 10 | lr 0.000395 | loss 0.022301 | mae 0.099607 -[2024/06/24 07:22:25] ppsci INFO: train: epoch 1694 | step 20 | lr 0.000395 | loss 0.012587 | mae 0.089623 -[2024/06/24 07:22:26] ppsci INFO: train: epoch 1694 | step 30 | lr 0.000395 | loss 0.022455 | mae 0.116444 -[2024/06/24 07:22:26] ppsci INFO: train: epoch 1694 | step 38 | lr 0.000395 | loss 0.011375 | mae 0.084333 -[2024/06/24 07:22:26] ppsci INFO: epoch: 1694, train_loss: 0.022502, train_metric: 0.110718, eval_loss: 0.044874, eval_mae: 0.149131 -[2024/06/24 07:22:27] ppsci INFO: train: epoch 1695 | step 0 | lr 0.000396 | loss 0.023671 | mae 0.114112 -[2024/06/24 07:22:27] ppsci INFO: train: epoch 1695 | step 10 | lr 0.000396 | loss 0.016094 | mae 0.097110 -[2024/06/24 07:22:28] ppsci INFO: train: epoch 1695 | step 20 | lr 0.000396 | loss 0.022867 | mae 0.117415 -[2024/06/24 07:22:28] ppsci INFO: train: epoch 1695 | step 30 | lr 0.000396 | loss 0.017681 | mae 0.107042 -[2024/06/24 07:22:29] ppsci INFO: train: epoch 1695 | step 38 | lr 0.000396 | loss 0.010543 | mae 0.067942 -[2024/06/24 07:22:29] ppsci INFO: epoch: 1695, train_loss: 0.022266, train_metric: 0.112443, eval_loss: 0.048054, eval_mae: 0.153086 -[2024/06/24 07:22:29] ppsci INFO: train: epoch 1696 | step 0 | lr 0.000397 | loss 0.033571 | mae 0.133149 -[2024/06/24 07:22:29] ppsci INFO: train: epoch 1696 | step 10 | lr 0.000397 | loss 0.024117 | mae 0.112549 -[2024/06/24 07:22:30] ppsci INFO: train: epoch 1696 | step 20 | lr 0.000397 | loss 0.024465 | mae 0.108161 -[2024/06/24 07:22:30] ppsci INFO: train: epoch 1696 | step 30 | lr 0.000397 | loss 0.015734 | mae 0.099088 -[2024/06/24 07:22:31] ppsci INFO: train: epoch 1696 | step 38 | lr 0.000397 | loss 0.010305 | mae 0.065235 -[2024/06/24 07:22:31] ppsci INFO: epoch: 1696, train_loss: 0.022922, train_metric: 0.111446, eval_loss: 0.044379, eval_mae: 0.147220 -[2024/06/24 07:22:31] ppsci INFO: train: epoch 1697 | step 0 | lr 0.000397 | loss 0.021926 | mae 0.110270 -[2024/06/24 07:22:32] ppsci INFO: train: epoch 1697 | step 10 | lr 0.000397 | loss 0.020441 | mae 0.104363 -[2024/06/24 07:22:32] ppsci INFO: train: epoch 1697 | step 20 | lr 0.000397 | loss 0.024603 | mae 0.120797 -[2024/06/24 07:22:33] ppsci INFO: train: epoch 1697 | step 30 | lr 0.000397 | loss 0.024854 | mae 0.120235 -[2024/06/24 07:22:33] ppsci INFO: train: epoch 1697 | step 38 | lr 0.000397 | loss 0.021295 | mae 0.088997 -[2024/06/24 07:22:33] ppsci INFO: epoch: 1697, train_loss: 0.022465, train_metric: 0.111007, eval_loss: 0.047050, eval_mae: 0.144258 -[2024/06/24 07:22:33] ppsci INFO: train: epoch 1698 | step 0 | lr 0.000398 | loss 0.026372 | mae 0.120207 -[2024/06/24 07:22:34] ppsci INFO: train: epoch 1698 | step 10 | lr 0.000398 | loss 0.022056 | mae 0.109168 -[2024/06/24 07:22:34] ppsci INFO: train: epoch 1698 | step 20 | lr 0.000398 | loss 0.023540 | mae 0.118801 -[2024/06/24 07:22:35] ppsci INFO: train: epoch 1698 | step 30 | lr 0.000398 | loss 0.030320 | mae 0.131359 -[2024/06/24 07:22:35] ppsci INFO: train: epoch 1698 | step 38 | lr 0.000398 | loss 0.009421 | mae 0.084295 -[2024/06/24 07:22:35] ppsci INFO: epoch: 1698, train_loss: 0.024647, train_metric: 0.114772, eval_loss: 0.041272, eval_mae: 0.144171 -[2024/06/24 07:22:35] ppsci INFO: train: epoch 1699 | step 0 | lr 0.000398 | loss 0.020359 | mae 0.109882 -[2024/06/24 07:22:36] ppsci INFO: train: epoch 1699 | step 10 | lr 0.000398 | loss 0.022687 | mae 0.116488 -[2024/06/24 07:22:36] ppsci INFO: train: epoch 1699 | step 20 | lr 0.000398 | loss 0.015662 | mae 0.096472 -[2024/06/24 07:22:37] ppsci INFO: train: epoch 1699 | step 30 | lr 0.000398 | loss 0.022164 | mae 0.111509 -[2024/06/24 07:22:37] ppsci INFO: train: epoch 1699 | step 38 | lr 0.000398 | loss 0.007889 | mae 0.075832 -[2024/06/24 07:22:37] ppsci INFO: epoch: 1699, train_loss: 0.021095, train_metric: 0.108401, eval_loss: 0.047226, eval_mae: 0.146347 -[2024/06/24 07:22:37] ppsci INFO: train: epoch 1700 | step 0 | lr 0.000399 | loss 0.020356 | mae 0.109696 -[2024/06/24 07:22:38] ppsci INFO: train: epoch 1700 | step 10 | lr 0.000399 | loss 0.023468 | mae 0.110778 -[2024/06/24 07:22:38] ppsci INFO: train: epoch 1700 | step 20 | lr 0.000399 | loss 0.020555 | mae 0.107338 -[2024/06/24 07:22:39] ppsci INFO: train: epoch 1700 | step 30 | lr 0.000399 | loss 0.023503 | mae 0.112340 -[2024/06/24 07:22:39] ppsci INFO: train: epoch 1700 | step 38 | lr 0.000399 | loss 0.012033 | mae 0.084311 -[2024/06/24 07:22:39] ppsci INFO: epoch: 1700, train_loss: 0.021601, train_metric: 0.108954, eval_loss: 0.043547, eval_mae: 0.146548 -[2024/06/24 07:22:40] ppsci INFO: train: epoch 1701 | step 0 | lr 0.000400 | loss 0.021065 | mae 0.106166 -[2024/06/24 07:22:40] ppsci INFO: train: epoch 1701 | step 10 | lr 0.000400 | loss 0.023791 | mae 0.118791 -[2024/06/24 07:22:41] ppsci INFO: train: epoch 1701 | step 20 | lr 0.000400 | loss 0.024192 | mae 0.116103 -[2024/06/24 07:22:41] ppsci INFO: train: epoch 1701 | step 30 | lr 0.000400 | loss 0.017236 | mae 0.096434 -[2024/06/24 07:22:41] ppsci INFO: train: epoch 1701 | step 38 | lr 0.000400 | loss 0.013855 | mae 0.092197 -[2024/06/24 07:22:42] ppsci INFO: epoch: 1701, train_loss: 0.022068, train_metric: 0.112208, eval_loss: 0.046004, eval_mae: 0.145095 -[2024/06/24 07:22:42] ppsci INFO: train: epoch 1702 | step 0 | lr 0.000400 | loss 0.016821 | mae 0.095787 -[2024/06/24 07:22:42] ppsci INFO: train: epoch 1702 | step 10 | lr 0.000400 | loss 0.029040 | mae 0.119285 -[2024/06/24 07:22:43] ppsci INFO: train: epoch 1702 | step 20 | lr 0.000400 | loss 0.014154 | mae 0.088694 -[2024/06/24 07:22:43] ppsci INFO: train: epoch 1702 | step 30 | lr 0.000400 | loss 0.021927 | mae 0.112330 -[2024/06/24 07:22:44] ppsci INFO: train: epoch 1702 | step 38 | lr 0.000400 | loss 0.014945 | mae 0.105168 -[2024/06/24 07:22:44] ppsci INFO: epoch: 1702, train_loss: 0.022293, train_metric: 0.110419, eval_loss: 0.044279, eval_mae: 0.147947 -[2024/06/24 07:22:44] ppsci INFO: train: epoch 1703 | step 0 | lr 0.000401 | loss 0.026347 | mae 0.116947 -[2024/06/24 07:22:44] ppsci INFO: train: epoch 1703 | step 10 | lr 0.000401 | loss 0.024903 | mae 0.120530 -[2024/06/24 07:22:45] ppsci INFO: train: epoch 1703 | step 20 | lr 0.000401 | loss 0.034405 | mae 0.128013 -[2024/06/24 07:22:45] ppsci INFO: train: epoch 1703 | step 30 | lr 0.000401 | loss 0.020607 | mae 0.114565 -[2024/06/24 07:22:46] ppsci INFO: train: epoch 1703 | step 38 | lr 0.000401 | loss 0.024385 | mae 0.128824 -[2024/06/24 07:22:46] ppsci INFO: epoch: 1703, train_loss: 0.030679, train_metric: 0.117021, eval_loss: 0.065024, eval_mae: 0.163341 -[2024/06/24 07:22:46] ppsci INFO: train: epoch 1704 | step 0 | lr 0.000401 | loss 0.037394 | mae 0.137830 -[2024/06/24 07:22:46] ppsci INFO: train: epoch 1704 | step 10 | lr 0.000401 | loss 0.021091 | mae 0.112139 -[2024/06/24 07:22:47] ppsci INFO: train: epoch 1704 | step 20 | lr 0.000401 | loss 0.027548 | mae 0.121827 -[2024/06/24 07:22:47] ppsci INFO: train: epoch 1704 | step 30 | lr 0.000401 | loss 0.020672 | mae 0.112125 -[2024/06/24 07:22:48] ppsci INFO: train: epoch 1704 | step 38 | lr 0.000401 | loss 0.040045 | mae 0.171034 -[2024/06/24 07:22:48] ppsci INFO: epoch: 1704, train_loss: 0.029954, train_metric: 0.126007, eval_loss: 0.044674, eval_mae: 0.149446 -[2024/06/24 07:22:48] ppsci INFO: train: epoch 1705 | step 0 | lr 0.000402 | loss 0.023227 | mae 0.105816 -[2024/06/24 07:22:48] ppsci INFO: train: epoch 1705 | step 10 | lr 0.000402 | loss 0.030670 | mae 0.125471 -[2024/06/24 07:22:49] ppsci INFO: train: epoch 1705 | step 20 | lr 0.000402 | loss 0.023443 | mae 0.113565 -[2024/06/24 07:22:49] ppsci INFO: train: epoch 1705 | step 30 | lr 0.000402 | loss 0.022920 | mae 0.113381 -[2024/06/24 07:22:50] ppsci INFO: train: epoch 1705 | step 38 | lr 0.000402 | loss 0.043253 | mae 0.183011 -[2024/06/24 07:22:50] ppsci INFO: epoch: 1705, train_loss: 0.026117, train_metric: 0.117568, eval_loss: 0.043829, eval_mae: 0.149905 -[2024/06/24 07:22:50] ppsci INFO: train: epoch 1706 | step 0 | lr 0.000403 | loss 0.021149 | mae 0.110035 -[2024/06/24 07:22:50] ppsci INFO: train: epoch 1706 | step 10 | lr 0.000403 | loss 0.022068 | mae 0.108502 -[2024/06/24 07:22:51] ppsci INFO: train: epoch 1706 | step 20 | lr 0.000403 | loss 0.033465 | mae 0.117170 -[2024/06/24 07:22:51] ppsci INFO: train: epoch 1706 | step 30 | lr 0.000403 | loss 0.026935 | mae 0.123208 -[2024/06/24 07:22:52] ppsci INFO: train: epoch 1706 | step 38 | lr 0.000403 | loss 0.013418 | mae 0.092062 -[2024/06/24 07:22:52] ppsci INFO: epoch: 1706, train_loss: 0.022915, train_metric: 0.112161, eval_loss: 0.042137, eval_mae: 0.138817 -[2024/06/24 07:22:52] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:22:52] ppsci INFO: train: epoch 1707 | step 0 | lr 0.000403 | loss 0.020115 | mae 0.109897 -[2024/06/24 07:22:53] ppsci INFO: train: epoch 1707 | step 10 | lr 0.000403 | loss 0.029452 | mae 0.130259 -[2024/06/24 07:22:53] ppsci INFO: train: epoch 1707 | step 20 | lr 0.000403 | loss 0.027761 | mae 0.118553 -[2024/06/24 07:22:54] ppsci INFO: train: epoch 1707 | step 30 | lr 0.000403 | loss 0.026830 | mae 0.115840 -[2024/06/24 07:22:54] ppsci INFO: train: epoch 1707 | step 38 | lr 0.000403 | loss 0.019989 | mae 0.100729 -[2024/06/24 07:22:54] ppsci INFO: epoch: 1707, train_loss: 0.023584, train_metric: 0.113625, eval_loss: 0.044908, eval_mae: 0.145795 -[2024/06/24 07:22:54] ppsci INFO: train: epoch 1708 | step 0 | lr 0.000404 | loss 0.018905 | mae 0.104508 -[2024/06/24 07:22:55] ppsci INFO: train: epoch 1708 | step 10 | lr 0.000404 | loss 0.027180 | mae 0.119559 -[2024/06/24 07:22:55] ppsci INFO: train: epoch 1708 | step 20 | lr 0.000404 | loss 0.020710 | mae 0.111290 -[2024/06/24 07:22:56] ppsci INFO: train: epoch 1708 | step 30 | lr 0.000404 | loss 0.035319 | mae 0.152441 -[2024/06/24 07:22:56] ppsci INFO: train: epoch 1708 | step 38 | lr 0.000404 | loss 0.020325 | mae 0.119830 -[2024/06/24 07:22:56] ppsci INFO: epoch: 1708, train_loss: 0.030329, train_metric: 0.121378, eval_loss: 0.052548, eval_mae: 0.158638 -[2024/06/24 07:22:56] ppsci INFO: train: epoch 1709 | step 0 | lr 0.000405 | loss 0.043781 | mae 0.143857 -[2024/06/24 07:22:57] ppsci INFO: train: epoch 1709 | step 10 | lr 0.000405 | loss 0.029315 | mae 0.125452 -[2024/06/24 07:22:57] ppsci INFO: train: epoch 1709 | step 20 | lr 0.000405 | loss 0.028122 | mae 0.118281 -[2024/06/24 07:22:58] ppsci INFO: train: epoch 1709 | step 30 | lr 0.000405 | loss 0.033465 | mae 0.135677 -[2024/06/24 07:22:58] ppsci INFO: train: epoch 1709 | step 38 | lr 0.000405 | loss 0.024846 | mae 0.111491 -[2024/06/24 07:22:58] ppsci INFO: epoch: 1709, train_loss: 0.035085, train_metric: 0.132509, eval_loss: 0.049543, eval_mae: 0.148155 -[2024/06/24 07:22:58] ppsci INFO: train: epoch 1710 | step 0 | lr 0.000405 | loss 0.023621 | mae 0.109852 -[2024/06/24 07:22:59] ppsci INFO: train: epoch 1710 | step 10 | lr 0.000405 | loss 0.031821 | mae 0.128793 -[2024/06/24 07:22:59] ppsci INFO: train: epoch 1710 | step 20 | lr 0.000405 | loss 0.028671 | mae 0.122225 -[2024/06/24 07:23:00] ppsci INFO: train: epoch 1710 | step 30 | lr 0.000405 | loss 0.031267 | mae 0.117441 -[2024/06/24 07:23:00] ppsci INFO: train: epoch 1710 | step 38 | lr 0.000405 | loss 0.008067 | mae 0.077949 -[2024/06/24 07:23:00] ppsci INFO: epoch: 1710, train_loss: 0.026309, train_metric: 0.120158, eval_loss: 0.044379, eval_mae: 0.148889 -[2024/06/24 07:23:01] ppsci INFO: train: epoch 1711 | step 0 | lr 0.000406 | loss 0.027887 | mae 0.118382 -[2024/06/24 07:23:01] ppsci INFO: train: epoch 1711 | step 10 | lr 0.000406 | loss 0.020629 | mae 0.107051 -[2024/06/24 07:23:02] ppsci INFO: train: epoch 1711 | step 20 | lr 0.000406 | loss 0.084065 | mae 0.140185 -[2024/06/24 07:23:02] ppsci INFO: train: epoch 1711 | step 30 | lr 0.000406 | loss 0.024706 | mae 0.115730 -[2024/06/24 07:23:02] ppsci INFO: train: epoch 1711 | step 38 | lr 0.000406 | loss 0.009388 | mae 0.085873 -[2024/06/24 07:23:03] ppsci INFO: epoch: 1711, train_loss: 0.026903, train_metric: 0.118051, eval_loss: 0.044320, eval_mae: 0.143836 -[2024/06/24 07:23:03] ppsci INFO: train: epoch 1712 | step 0 | lr 0.000406 | loss 0.021716 | mae 0.106389 -[2024/06/24 07:23:03] ppsci INFO: train: epoch 1712 | step 10 | lr 0.000406 | loss 0.025749 | mae 0.125236 -[2024/06/24 07:23:04] ppsci INFO: train: epoch 1712 | step 20 | lr 0.000406 | loss 0.026470 | mae 0.129309 -[2024/06/24 07:23:04] ppsci INFO: train: epoch 1712 | step 30 | lr 0.000406 | loss 0.038568 | mae 0.120034 -[2024/06/24 07:23:05] ppsci INFO: train: epoch 1712 | step 38 | lr 0.000406 | loss 0.014109 | mae 0.098559 -[2024/06/24 07:23:05] ppsci INFO: epoch: 1712, train_loss: 0.025275, train_metric: 0.116298, eval_loss: 0.041200, eval_mae: 0.144752 -[2024/06/24 07:23:05] ppsci INFO: train: epoch 1713 | step 0 | lr 0.000407 | loss 0.020481 | mae 0.111160 -[2024/06/24 07:23:05] ppsci INFO: train: epoch 1713 | step 10 | lr 0.000407 | loss 0.021536 | mae 0.112542 -[2024/06/24 07:23:06] ppsci INFO: train: epoch 1713 | step 20 | lr 0.000407 | loss 0.016657 | mae 0.096414 -[2024/06/24 07:23:06] ppsci INFO: train: epoch 1713 | step 30 | lr 0.000407 | loss 0.026917 | mae 0.111720 -[2024/06/24 07:23:07] ppsci INFO: train: epoch 1713 | step 38 | lr 0.000407 | loss 0.024375 | mae 0.118776 -[2024/06/24 07:23:07] ppsci INFO: epoch: 1713, train_loss: 0.022921, train_metric: 0.111537, eval_loss: 0.042894, eval_mae: 0.144420 -[2024/06/24 07:23:07] ppsci INFO: train: epoch 1714 | step 0 | lr 0.000408 | loss 0.015318 | mae 0.095588 -[2024/06/24 07:23:07] ppsci INFO: train: epoch 1714 | step 10 | lr 0.000408 | loss 0.026944 | mae 0.114081 -[2024/06/24 07:23:08] ppsci INFO: train: epoch 1714 | step 20 | lr 0.000408 | loss 0.019659 | mae 0.105480 -[2024/06/24 07:23:08] ppsci INFO: train: epoch 1714 | step 30 | lr 0.000408 | loss 0.033285 | mae 0.135327 -[2024/06/24 07:23:09] ppsci INFO: train: epoch 1714 | step 38 | lr 0.000408 | loss 0.024780 | mae 0.122431 -[2024/06/24 07:23:09] ppsci INFO: epoch: 1714, train_loss: 0.025977, train_metric: 0.115701, eval_loss: 0.046402, eval_mae: 0.148187 -[2024/06/24 07:23:09] ppsci INFO: train: epoch 1715 | step 0 | lr 0.000408 | loss 0.020352 | mae 0.112144 -[2024/06/24 07:23:09] ppsci INFO: train: epoch 1715 | step 10 | lr 0.000408 | loss 0.019227 | mae 0.107943 -[2024/06/24 07:23:10] ppsci INFO: train: epoch 1715 | step 20 | lr 0.000408 | loss 0.021376 | mae 0.110306 -[2024/06/24 07:23:11] ppsci INFO: train: epoch 1715 | step 30 | lr 0.000408 | loss 0.030920 | mae 0.125787 -[2024/06/24 07:23:11] ppsci INFO: train: epoch 1715 | step 38 | lr 0.000408 | loss 0.030595 | mae 0.148051 -[2024/06/24 07:23:11] ppsci INFO: epoch: 1715, train_loss: 0.023012, train_metric: 0.112284, eval_loss: 0.042636, eval_mae: 0.144303 -[2024/06/24 07:23:11] ppsci INFO: train: epoch 1716 | step 0 | lr 0.000409 | loss 0.025579 | mae 0.115428 -[2024/06/24 07:23:12] ppsci INFO: train: epoch 1716 | step 10 | lr 0.000409 | loss 0.019549 | mae 0.107428 -[2024/06/24 07:23:12] ppsci INFO: train: epoch 1716 | step 20 | lr 0.000409 | loss 0.024460 | mae 0.120116 -[2024/06/24 07:23:13] ppsci INFO: train: epoch 1716 | step 30 | lr 0.000409 | loss 0.024502 | mae 0.111597 -[2024/06/24 07:23:13] ppsci INFO: train: epoch 1716 | step 38 | lr 0.000409 | loss 0.016931 | mae 0.117519 -[2024/06/24 07:23:13] ppsci INFO: epoch: 1716, train_loss: 0.023370, train_metric: 0.112252, eval_loss: 0.042341, eval_mae: 0.145392 -[2024/06/24 07:23:14] ppsci INFO: train: epoch 1717 | step 0 | lr 0.000409 | loss 0.019977 | mae 0.094531 -[2024/06/24 07:23:14] ppsci INFO: train: epoch 1717 | step 10 | lr 0.000409 | loss 0.027950 | mae 0.125207 -[2024/06/24 07:23:15] ppsci INFO: train: epoch 1717 | step 20 | lr 0.000409 | loss 0.018901 | mae 0.104377 -[2024/06/24 07:23:15] ppsci INFO: train: epoch 1717 | step 30 | lr 0.000409 | loss 0.017846 | mae 0.101201 -[2024/06/24 07:23:15] ppsci INFO: train: epoch 1717 | step 38 | lr 0.000409 | loss 0.025395 | mae 0.124624 -[2024/06/24 07:23:15] ppsci INFO: epoch: 1717, train_loss: 0.022837, train_metric: 0.110211, eval_loss: 0.047050, eval_mae: 0.148425 -[2024/06/24 07:23:16] ppsci INFO: train: epoch 1718 | step 0 | lr 0.000410 | loss 0.024806 | mae 0.116447 -[2024/06/24 07:23:16] ppsci INFO: train: epoch 1718 | step 10 | lr 0.000410 | loss 0.028133 | mae 0.124507 -[2024/06/24 07:23:17] ppsci INFO: train: epoch 1718 | step 20 | lr 0.000410 | loss 0.025551 | mae 0.117981 -[2024/06/24 07:23:17] ppsci INFO: train: epoch 1718 | step 30 | lr 0.000410 | loss 0.018072 | mae 0.105926 -[2024/06/24 07:23:18] ppsci INFO: train: epoch 1718 | step 38 | lr 0.000410 | loss 0.012716 | mae 0.102389 -[2024/06/24 07:23:18] ppsci INFO: epoch: 1718, train_loss: 0.022500, train_metric: 0.111202, eval_loss: 0.041320, eval_mae: 0.146034 -[2024/06/24 07:23:18] ppsci INFO: train: epoch 1719 | step 0 | lr 0.000411 | loss 0.016042 | mae 0.096268 -[2024/06/24 07:23:18] ppsci INFO: train: epoch 1719 | step 10 | lr 0.000411 | loss 0.025430 | mae 0.115710 -[2024/06/24 07:23:19] ppsci INFO: train: epoch 1719 | step 20 | lr 0.000411 | loss 0.019027 | mae 0.105917 -[2024/06/24 07:23:19] ppsci INFO: train: epoch 1719 | step 30 | lr 0.000411 | loss 0.021801 | mae 0.103823 -[2024/06/24 07:23:20] ppsci INFO: train: epoch 1719 | step 38 | lr 0.000411 | loss 0.014743 | mae 0.096663 -[2024/06/24 07:23:20] ppsci INFO: epoch: 1719, train_loss: 0.021864, train_metric: 0.109832, eval_loss: 0.041521, eval_mae: 0.142639 -[2024/06/24 07:23:20] ppsci INFO: train: epoch 1720 | step 0 | lr 0.000411 | loss 0.029863 | mae 0.124924 -[2024/06/24 07:23:21] ppsci INFO: train: epoch 1720 | step 10 | lr 0.000411 | loss 0.030579 | mae 0.123826 -[2024/06/24 07:23:21] ppsci INFO: train: epoch 1720 | step 20 | lr 0.000411 | loss 0.018729 | mae 0.105306 -[2024/06/24 07:23:22] ppsci INFO: train: epoch 1720 | step 30 | lr 0.000411 | loss 0.030734 | mae 0.118898 -[2024/06/24 07:23:22] ppsci INFO: train: epoch 1720 | step 38 | lr 0.000411 | loss 0.052967 | mae 0.156692 -[2024/06/24 07:23:22] ppsci INFO: epoch: 1720, train_loss: 0.026098, train_metric: 0.115077, eval_loss: 0.040199, eval_mae: 0.141788 -[2024/06/24 07:23:22] ppsci INFO: train: epoch 1721 | step 0 | lr 0.000412 | loss 0.022211 | mae 0.109737 -[2024/06/24 07:23:23] ppsci INFO: train: epoch 1721 | step 10 | lr 0.000412 | loss 0.020939 | mae 0.102164 -[2024/06/24 07:23:23] ppsci INFO: train: epoch 1721 | step 20 | lr 0.000412 | loss 0.040819 | mae 0.144553 -[2024/06/24 07:23:24] ppsci INFO: train: epoch 1721 | step 30 | lr 0.000412 | loss 0.037662 | mae 0.132527 -[2024/06/24 07:23:24] ppsci INFO: train: epoch 1721 | step 38 | lr 0.000412 | loss 0.049294 | mae 0.141894 -[2024/06/24 07:23:24] ppsci INFO: epoch: 1721, train_loss: 0.024366, train_metric: 0.112177, eval_loss: 0.041840, eval_mae: 0.141947 -[2024/06/24 07:23:24] ppsci INFO: train: epoch 1722 | step 0 | lr 0.000412 | loss 0.016232 | mae 0.091278 -[2024/06/24 07:23:25] ppsci INFO: train: epoch 1722 | step 10 | lr 0.000412 | loss 0.029225 | mae 0.121369 -[2024/06/24 07:23:26] ppsci INFO: train: epoch 1722 | step 20 | lr 0.000412 | loss 0.017439 | mae 0.101578 -[2024/06/24 07:23:26] ppsci INFO: train: epoch 1722 | step 30 | lr 0.000412 | loss 0.022465 | mae 0.118622 -[2024/06/24 07:23:27] ppsci INFO: train: epoch 1722 | step 38 | lr 0.000412 | loss 0.016076 | mae 0.107110 -[2024/06/24 07:23:27] ppsci INFO: epoch: 1722, train_loss: 0.023708, train_metric: 0.110075, eval_loss: 0.043155, eval_mae: 0.148567 -[2024/06/24 07:23:27] ppsci INFO: train: epoch 1723 | step 0 | lr 0.000413 | loss 0.028110 | mae 0.125146 -[2024/06/24 07:23:27] ppsci INFO: train: epoch 1723 | step 10 | lr 0.000413 | loss 0.028458 | mae 0.125755 -[2024/06/24 07:23:28] ppsci INFO: train: epoch 1723 | step 20 | lr 0.000413 | loss 0.018801 | mae 0.108173 -[2024/06/24 07:23:28] ppsci INFO: train: epoch 1723 | step 30 | lr 0.000413 | loss 0.022664 | mae 0.122146 -[2024/06/24 07:23:29] ppsci INFO: train: epoch 1723 | step 38 | lr 0.000413 | loss 0.016510 | mae 0.096306 -[2024/06/24 07:23:29] ppsci INFO: epoch: 1723, train_loss: 0.023835, train_metric: 0.113998, eval_loss: 0.038574, eval_mae: 0.141896 -[2024/06/24 07:23:29] ppsci INFO: train: epoch 1724 | step 0 | lr 0.000414 | loss 0.027005 | mae 0.122112 -[2024/06/24 07:23:29] ppsci INFO: train: epoch 1724 | step 10 | lr 0.000414 | loss 0.018876 | mae 0.108659 -[2024/06/24 07:23:30] ppsci INFO: train: epoch 1724 | step 20 | lr 0.000414 | loss 0.025738 | mae 0.104568 -[2024/06/24 07:23:30] ppsci INFO: train: epoch 1724 | step 30 | lr 0.000414 | loss 0.022383 | mae 0.111388 -[2024/06/24 07:23:31] ppsci INFO: train: epoch 1724 | step 38 | lr 0.000414 | loss 0.017767 | mae 0.106287 -[2024/06/24 07:23:31] ppsci INFO: epoch: 1724, train_loss: 0.021324, train_metric: 0.108731, eval_loss: 0.047919, eval_mae: 0.144894 -[2024/06/24 07:23:31] ppsci INFO: train: epoch 1725 | step 0 | lr 0.000414 | loss 0.018722 | mae 0.106853 -[2024/06/24 07:23:31] ppsci INFO: train: epoch 1725 | step 10 | lr 0.000414 | loss 0.025551 | mae 0.119849 -[2024/06/24 07:23:32] ppsci INFO: train: epoch 1725 | step 20 | lr 0.000414 | loss 0.027540 | mae 0.122882 -[2024/06/24 07:23:32] ppsci INFO: train: epoch 1725 | step 30 | lr 0.000414 | loss 0.025588 | mae 0.109395 -[2024/06/24 07:23:33] ppsci INFO: train: epoch 1725 | step 38 | lr 0.000414 | loss 0.012160 | mae 0.083708 -[2024/06/24 07:23:33] ppsci INFO: epoch: 1725, train_loss: 0.022477, train_metric: 0.110580, eval_loss: 0.040519, eval_mae: 0.142488 -[2024/06/24 07:23:33] ppsci INFO: train: epoch 1726 | step 0 | lr 0.000415 | loss 0.013183 | mae 0.087987 -[2024/06/24 07:23:33] ppsci INFO: train: epoch 1726 | step 10 | lr 0.000415 | loss 0.021720 | mae 0.111385 -[2024/06/24 07:23:34] ppsci INFO: train: epoch 1726 | step 20 | lr 0.000415 | loss 0.018750 | mae 0.104598 -[2024/06/24 07:23:35] ppsci INFO: train: epoch 1726 | step 30 | lr 0.000415 | loss 0.021671 | mae 0.109190 -[2024/06/24 07:23:35] ppsci INFO: train: epoch 1726 | step 38 | lr 0.000415 | loss 0.014311 | mae 0.102589 -[2024/06/24 07:23:35] ppsci INFO: epoch: 1726, train_loss: 0.022053, train_metric: 0.109894, eval_loss: 0.045216, eval_mae: 0.149186 -[2024/06/24 07:23:35] ppsci INFO: train: epoch 1727 | step 0 | lr 0.000415 | loss 0.018463 | mae 0.106732 -[2024/06/24 07:23:36] ppsci INFO: train: epoch 1727 | step 10 | lr 0.000415 | loss 0.018762 | mae 0.107869 -[2024/06/24 07:23:36] ppsci INFO: train: epoch 1727 | step 20 | lr 0.000415 | loss 0.022019 | mae 0.112732 -[2024/06/24 07:23:37] ppsci INFO: train: epoch 1727 | step 30 | lr 0.000415 | loss 0.021138 | mae 0.109593 -[2024/06/24 07:23:37] ppsci INFO: train: epoch 1727 | step 38 | lr 0.000415 | loss 0.012301 | mae 0.084922 -[2024/06/24 07:23:37] ppsci INFO: epoch: 1727, train_loss: 0.022010, train_metric: 0.109878, eval_loss: 0.048233, eval_mae: 0.148065 -[2024/06/24 07:23:37] ppsci INFO: train: epoch 1728 | step 0 | lr 0.000416 | loss 0.029641 | mae 0.131482 -[2024/06/24 07:23:38] ppsci INFO: train: epoch 1728 | step 10 | lr 0.000416 | loss 0.019697 | mae 0.097410 -[2024/06/24 07:23:38] ppsci INFO: train: epoch 1728 | step 20 | lr 0.000416 | loss 0.021328 | mae 0.111866 -[2024/06/24 07:23:39] ppsci INFO: train: epoch 1728 | step 30 | lr 0.000416 | loss 0.019534 | mae 0.102680 -[2024/06/24 07:23:39] ppsci INFO: train: epoch 1728 | step 38 | lr 0.000416 | loss 0.031166 | mae 0.109823 -[2024/06/24 07:23:39] ppsci INFO: epoch: 1728, train_loss: 0.022286, train_metric: 0.110576, eval_loss: 0.044764, eval_mae: 0.145795 -[2024/06/24 07:23:39] ppsci INFO: train: epoch 1729 | step 0 | lr 0.000416 | loss 0.022381 | mae 0.114210 -[2024/06/24 07:23:40] ppsci INFO: train: epoch 1729 | step 10 | lr 0.000416 | loss 0.028888 | mae 0.122196 -[2024/06/24 07:23:40] ppsci INFO: train: epoch 1729 | step 20 | lr 0.000416 | loss 0.020815 | mae 0.111426 -[2024/06/24 07:23:41] ppsci INFO: train: epoch 1729 | step 30 | lr 0.000416 | loss 0.028489 | mae 0.126255 -[2024/06/24 07:23:41] ppsci INFO: train: epoch 1729 | step 38 | lr 0.000416 | loss 0.013989 | mae 0.080357 -[2024/06/24 07:23:41] ppsci INFO: epoch: 1729, train_loss: 0.022599, train_metric: 0.111401, eval_loss: 0.042904, eval_mae: 0.140142 -[2024/06/24 07:23:41] ppsci INFO: train: epoch 1730 | step 0 | lr 0.000417 | loss 0.021165 | mae 0.102264 -[2024/06/24 07:23:42] ppsci INFO: train: epoch 1730 | step 10 | lr 0.000417 | loss 0.027158 | mae 0.115948 -[2024/06/24 07:23:42] ppsci INFO: train: epoch 1730 | step 20 | lr 0.000417 | loss 0.017805 | mae 0.110006 -[2024/06/24 07:23:43] ppsci INFO: train: epoch 1730 | step 30 | lr 0.000417 | loss 0.025649 | mae 0.116553 -[2024/06/24 07:23:43] ppsci INFO: train: epoch 1730 | step 38 | lr 0.000417 | loss 0.015536 | mae 0.099168 -[2024/06/24 07:23:43] ppsci INFO: epoch: 1730, train_loss: 0.021780, train_metric: 0.108938, eval_loss: 0.045152, eval_mae: 0.143667 -[2024/06/24 07:23:44] ppsci INFO: train: epoch 1731 | step 0 | lr 0.000418 | loss 0.016701 | mae 0.101145 -[2024/06/24 07:23:44] ppsci INFO: train: epoch 1731 | step 10 | lr 0.000418 | loss 0.025663 | mae 0.118380 -[2024/06/24 07:23:45] ppsci INFO: train: epoch 1731 | step 20 | lr 0.000418 | loss 0.022289 | mae 0.105276 -[2024/06/24 07:23:45] ppsci INFO: train: epoch 1731 | step 30 | lr 0.000418 | loss 0.021039 | mae 0.106973 -[2024/06/24 07:23:45] ppsci INFO: train: epoch 1731 | step 38 | lr 0.000418 | loss 0.015834 | mae 0.098207 -[2024/06/24 07:23:46] ppsci INFO: epoch: 1731, train_loss: 0.022615, train_metric: 0.109636, eval_loss: 0.043362, eval_mae: 0.140812 -[2024/06/24 07:23:46] ppsci INFO: train: epoch 1732 | step 0 | lr 0.000418 | loss 0.025300 | mae 0.122534 -[2024/06/24 07:23:46] ppsci INFO: train: epoch 1732 | step 10 | lr 0.000418 | loss 0.021547 | mae 0.107451 -[2024/06/24 07:23:47] ppsci INFO: train: epoch 1732 | step 20 | lr 0.000418 | loss 0.015551 | mae 0.096779 -[2024/06/24 07:23:47] ppsci INFO: train: epoch 1732 | step 30 | lr 0.000418 | loss 0.014445 | mae 0.090581 -[2024/06/24 07:23:48] ppsci INFO: train: epoch 1732 | step 38 | lr 0.000418 | loss 0.019951 | mae 0.109385 -[2024/06/24 07:23:48] ppsci INFO: epoch: 1732, train_loss: 0.021245, train_metric: 0.108616, eval_loss: 0.042824, eval_mae: 0.149059 -[2024/06/24 07:23:48] ppsci INFO: train: epoch 1733 | step 0 | lr 0.000419 | loss 0.017595 | mae 0.102804 -[2024/06/24 07:23:49] ppsci INFO: train: epoch 1733 | step 10 | lr 0.000419 | loss 0.016459 | mae 0.097043 -[2024/06/24 07:23:49] ppsci INFO: train: epoch 1733 | step 20 | lr 0.000419 | loss 0.021304 | mae 0.110583 -[2024/06/24 07:23:50] ppsci INFO: train: epoch 1733 | step 30 | lr 0.000419 | loss 0.021077 | mae 0.105033 -[2024/06/24 07:23:50] ppsci INFO: train: epoch 1733 | step 38 | lr 0.000419 | loss 0.010630 | mae 0.078538 -[2024/06/24 07:23:50] ppsci INFO: epoch: 1733, train_loss: 0.021445, train_metric: 0.108325, eval_loss: 0.043878, eval_mae: 0.148274 -[2024/06/24 07:23:50] ppsci INFO: train: epoch 1734 | step 0 | lr 0.000419 | loss 0.024069 | mae 0.117505 -[2024/06/24 07:23:51] ppsci INFO: train: epoch 1734 | step 10 | lr 0.000419 | loss 0.020268 | mae 0.105124 -[2024/06/24 07:23:51] ppsci INFO: train: epoch 1734 | step 20 | lr 0.000419 | loss 0.027928 | mae 0.127872 -[2024/06/24 07:23:52] ppsci INFO: train: epoch 1734 | step 30 | lr 0.000419 | loss 0.023581 | mae 0.117253 -[2024/06/24 07:23:52] ppsci INFO: train: epoch 1734 | step 38 | lr 0.000419 | loss 0.020671 | mae 0.105617 -[2024/06/24 07:23:52] ppsci INFO: epoch: 1734, train_loss: 0.022105, train_metric: 0.110392, eval_loss: 0.042188, eval_mae: 0.144438 -[2024/06/24 07:23:52] ppsci INFO: train: epoch 1735 | step 0 | lr 0.000420 | loss 0.019271 | mae 0.102271 -[2024/06/24 07:23:53] ppsci INFO: train: epoch 1735 | step 10 | lr 0.000420 | loss 0.026938 | mae 0.116939 -[2024/06/24 07:23:53] ppsci INFO: train: epoch 1735 | step 20 | lr 0.000420 | loss 0.021568 | mae 0.109538 -[2024/06/24 07:23:54] ppsci INFO: train: epoch 1735 | step 30 | lr 0.000420 | loss 0.025458 | mae 0.120369 -[2024/06/24 07:23:54] ppsci INFO: train: epoch 1735 | step 38 | lr 0.000420 | loss 0.042619 | mae 0.121066 -[2024/06/24 07:23:54] ppsci INFO: epoch: 1735, train_loss: 0.023366, train_metric: 0.111378, eval_loss: 0.044487, eval_mae: 0.145778 -[2024/06/24 07:23:54] ppsci INFO: train: epoch 1736 | step 0 | lr 0.000420 | loss 0.018707 | mae 0.101634 -[2024/06/24 07:23:55] ppsci INFO: train: epoch 1736 | step 10 | lr 0.000420 | loss 0.028335 | mae 0.125295 -[2024/06/24 07:23:56] ppsci INFO: train: epoch 1736 | step 20 | lr 0.000420 | loss 0.015522 | mae 0.094022 -[2024/06/24 07:23:56] ppsci INFO: train: epoch 1736 | step 30 | lr 0.000420 | loss 0.018484 | mae 0.105589 -[2024/06/24 07:23:56] ppsci INFO: train: epoch 1736 | step 38 | lr 0.000420 | loss 0.011536 | mae 0.081949 -[2024/06/24 07:23:57] ppsci INFO: epoch: 1736, train_loss: 0.021218, train_metric: 0.108052, eval_loss: 0.045203, eval_mae: 0.147693 -[2024/06/24 07:23:57] ppsci INFO: train: epoch 1737 | step 0 | lr 0.000421 | loss 0.016982 | mae 0.102303 -[2024/06/24 07:23:57] ppsci INFO: train: epoch 1737 | step 10 | lr 0.000421 | loss 0.015221 | mae 0.094181 -[2024/06/24 07:23:58] ppsci INFO: train: epoch 1737 | step 20 | lr 0.000421 | loss 0.022617 | mae 0.114331 -[2024/06/24 07:23:58] ppsci INFO: train: epoch 1737 | step 30 | lr 0.000421 | loss 0.021592 | mae 0.109919 -[2024/06/24 07:23:59] ppsci INFO: train: epoch 1737 | step 38 | lr 0.000421 | loss 0.013192 | mae 0.085594 -[2024/06/24 07:23:59] ppsci INFO: epoch: 1737, train_loss: 0.021459, train_metric: 0.109775, eval_loss: 0.045065, eval_mae: 0.147622 -[2024/06/24 07:23:59] ppsci INFO: train: epoch 1738 | step 0 | lr 0.000422 | loss 0.015400 | mae 0.091573 -[2024/06/24 07:23:59] ppsci INFO: train: epoch 1738 | step 10 | lr 0.000422 | loss 0.027633 | mae 0.120229 -[2024/06/24 07:24:00] ppsci INFO: train: epoch 1738 | step 20 | lr 0.000422 | loss 0.018768 | mae 0.104937 -[2024/06/24 07:24:00] ppsci INFO: train: epoch 1738 | step 30 | lr 0.000422 | loss 0.026615 | mae 0.118191 -[2024/06/24 07:24:01] ppsci INFO: train: epoch 1738 | step 38 | lr 0.000422 | loss 0.009415 | mae 0.086501 -[2024/06/24 07:24:01] ppsci INFO: epoch: 1738, train_loss: 0.020119, train_metric: 0.106685, eval_loss: 0.040016, eval_mae: 0.140130 -[2024/06/24 07:24:01] ppsci INFO: train: epoch 1739 | step 0 | lr 0.000422 | loss 0.017949 | mae 0.098481 -[2024/06/24 07:24:02] ppsci INFO: train: epoch 1739 | step 10 | lr 0.000422 | loss 0.018107 | mae 0.103941 -[2024/06/24 07:24:02] ppsci INFO: train: epoch 1739 | step 20 | lr 0.000422 | loss 0.024143 | mae 0.115685 -[2024/06/24 07:24:03] ppsci INFO: train: epoch 1739 | step 30 | lr 0.000422 | loss 0.026350 | mae 0.124078 -[2024/06/24 07:24:03] ppsci INFO: train: epoch 1739 | step 38 | lr 0.000422 | loss 0.022497 | mae 0.119124 -[2024/06/24 07:24:03] ppsci INFO: epoch: 1739, train_loss: 0.022423, train_metric: 0.110517, eval_loss: 0.046369, eval_mae: 0.149249 -[2024/06/24 07:24:03] ppsci INFO: train: epoch 1740 | step 0 | lr 0.000423 | loss 0.020150 | mae 0.107825 -[2024/06/24 07:24:04] ppsci INFO: train: epoch 1740 | step 10 | lr 0.000423 | loss 0.022101 | mae 0.110704 -[2024/06/24 07:24:04] ppsci INFO: train: epoch 1740 | step 20 | lr 0.000423 | loss 0.019819 | mae 0.106528 -[2024/06/24 07:24:05] ppsci INFO: train: epoch 1740 | step 30 | lr 0.000423 | loss 0.021497 | mae 0.106919 -[2024/06/24 07:24:05] ppsci INFO: train: epoch 1740 | step 38 | lr 0.000423 | loss 0.037062 | mae 0.137707 -[2024/06/24 07:24:05] ppsci INFO: epoch: 1740, train_loss: 0.023230, train_metric: 0.111526, eval_loss: 0.040966, eval_mae: 0.143891 -[2024/06/24 07:24:05] ppsci INFO: train: epoch 1741 | step 0 | lr 0.000423 | loss 0.013261 | mae 0.091024 -[2024/06/24 07:24:06] ppsci INFO: train: epoch 1741 | step 10 | lr 0.000423 | loss 0.027218 | mae 0.114414 -[2024/06/24 07:24:06] ppsci INFO: train: epoch 1741 | step 20 | lr 0.000423 | loss 0.026705 | mae 0.114828 -[2024/06/24 07:24:07] ppsci INFO: train: epoch 1741 | step 30 | lr 0.000423 | loss 0.024584 | mae 0.116303 -[2024/06/24 07:24:07] ppsci INFO: train: epoch 1741 | step 38 | lr 0.000423 | loss 0.012124 | mae 0.093689 -[2024/06/24 07:24:08] ppsci INFO: epoch: 1741, train_loss: 0.023863, train_metric: 0.113225, eval_loss: 0.042919, eval_mae: 0.144836 -[2024/06/24 07:24:08] ppsci INFO: train: epoch 1742 | step 0 | lr 0.000424 | loss 0.015784 | mae 0.094977 -[2024/06/24 07:24:08] ppsci INFO: train: epoch 1742 | step 10 | lr 0.000424 | loss 0.028843 | mae 0.118293 -[2024/06/24 07:24:09] ppsci INFO: train: epoch 1742 | step 20 | lr 0.000424 | loss 0.024102 | mae 0.118492 -[2024/06/24 07:24:09] ppsci INFO: train: epoch 1742 | step 30 | lr 0.000424 | loss 0.021812 | mae 0.115282 -[2024/06/24 07:24:10] ppsci INFO: train: epoch 1742 | step 38 | lr 0.000424 | loss 0.010458 | mae 0.089529 -[2024/06/24 07:24:10] ppsci INFO: epoch: 1742, train_loss: 0.021145, train_metric: 0.109254, eval_loss: 0.040826, eval_mae: 0.142769 -[2024/06/24 07:24:10] ppsci INFO: train: epoch 1743 | step 0 | lr 0.000424 | loss 0.030053 | mae 0.127333 -[2024/06/24 07:24:10] ppsci INFO: train: epoch 1743 | step 10 | lr 0.000424 | loss 0.029308 | mae 0.118049 -[2024/06/24 07:24:11] ppsci INFO: train: epoch 1743 | step 20 | lr 0.000424 | loss 0.017920 | mae 0.105619 -[2024/06/24 07:24:11] ppsci INFO: train: epoch 1743 | step 30 | lr 0.000424 | loss 0.024265 | mae 0.115904 -[2024/06/24 07:24:12] ppsci INFO: train: epoch 1743 | step 38 | lr 0.000424 | loss 0.014489 | mae 0.086978 -[2024/06/24 07:24:12] ppsci INFO: epoch: 1743, train_loss: 0.021816, train_metric: 0.109441, eval_loss: 0.041454, eval_mae: 0.143861 -[2024/06/24 07:24:12] ppsci INFO: train: epoch 1744 | step 0 | lr 0.000425 | loss 0.026025 | mae 0.123728 -[2024/06/24 07:24:13] ppsci INFO: train: epoch 1744 | step 10 | lr 0.000425 | loss 0.026859 | mae 0.118911 -[2024/06/24 07:24:13] ppsci INFO: train: epoch 1744 | step 20 | lr 0.000425 | loss 0.023690 | mae 0.113308 -[2024/06/24 07:24:14] ppsci INFO: train: epoch 1744 | step 30 | lr 0.000425 | loss 0.028885 | mae 0.121041 -[2024/06/24 07:24:14] ppsci INFO: train: epoch 1744 | step 38 | lr 0.000425 | loss 0.049412 | mae 0.165823 -[2024/06/24 07:24:14] ppsci INFO: epoch: 1744, train_loss: 0.023221, train_metric: 0.110887, eval_loss: 0.044215, eval_mae: 0.147488 -[2024/06/24 07:24:14] ppsci INFO: train: epoch 1745 | step 0 | lr 0.000425 | loss 0.022477 | mae 0.112200 -[2024/06/24 07:24:15] ppsci INFO: train: epoch 1745 | step 10 | lr 0.000425 | loss 0.033451 | mae 0.113613 -[2024/06/24 07:24:15] ppsci INFO: train: epoch 1745 | step 20 | lr 0.000425 | loss 0.032639 | mae 0.125574 -[2024/06/24 07:24:16] ppsci INFO: train: epoch 1745 | step 30 | lr 0.000425 | loss 0.039644 | mae 0.141354 -[2024/06/24 07:24:16] ppsci INFO: train: epoch 1745 | step 38 | lr 0.000425 | loss 0.013585 | mae 0.099508 -[2024/06/24 07:24:16] ppsci INFO: epoch: 1745, train_loss: 0.033257, train_metric: 0.131892, eval_loss: 0.057049, eval_mae: 0.164939 -[2024/06/24 07:24:17] ppsci INFO: train: epoch 1746 | step 0 | lr 0.000426 | loss 0.042749 | mae 0.146141 -[2024/06/24 07:24:17] ppsci INFO: train: epoch 1746 | step 10 | lr 0.000426 | loss 0.041712 | mae 0.148119 -[2024/06/24 07:24:18] ppsci INFO: train: epoch 1746 | step 20 | lr 0.000426 | loss 0.032669 | mae 0.142068 -[2024/06/24 07:24:18] ppsci INFO: train: epoch 1746 | step 30 | lr 0.000426 | loss 0.033389 | mae 0.129355 -[2024/06/24 07:24:18] ppsci INFO: train: epoch 1746 | step 38 | lr 0.000426 | loss 0.014526 | mae 0.097145 -[2024/06/24 07:24:19] ppsci INFO: epoch: 1746, train_loss: 0.031245, train_metric: 0.127863, eval_loss: 0.047403, eval_mae: 0.153472 -[2024/06/24 07:24:19] ppsci INFO: train: epoch 1747 | step 0 | lr 0.000427 | loss 0.023876 | mae 0.120401 -[2024/06/24 07:24:19] ppsci INFO: train: epoch 1747 | step 10 | lr 0.000427 | loss 0.024362 | mae 0.111901 -[2024/06/24 07:24:20] ppsci INFO: train: epoch 1747 | step 20 | lr 0.000427 | loss 0.034212 | mae 0.131324 -[2024/06/24 07:24:20] ppsci INFO: train: epoch 1747 | step 30 | lr 0.000427 | loss 0.022190 | mae 0.114858 -[2024/06/24 07:24:21] ppsci INFO: train: epoch 1747 | step 38 | lr 0.000427 | loss 0.049656 | mae 0.179671 -[2024/06/24 07:24:21] ppsci INFO: epoch: 1747, train_loss: 0.025581, train_metric: 0.116261, eval_loss: 0.049155, eval_mae: 0.156698 -[2024/06/24 07:24:21] ppsci INFO: train: epoch 1748 | step 0 | lr 0.000427 | loss 0.024322 | mae 0.118550 -[2024/06/24 07:24:21] ppsci INFO: train: epoch 1748 | step 10 | lr 0.000427 | loss 0.026743 | mae 0.124643 -[2024/06/24 07:24:22] ppsci INFO: train: epoch 1748 | step 20 | lr 0.000427 | loss 0.032257 | mae 0.127561 -[2024/06/24 07:24:22] ppsci INFO: train: epoch 1748 | step 30 | lr 0.000427 | loss 0.021383 | mae 0.112862 -[2024/06/24 07:24:23] ppsci INFO: train: epoch 1748 | step 38 | lr 0.000427 | loss 0.043488 | mae 0.159144 -[2024/06/24 07:24:23] ppsci INFO: epoch: 1748, train_loss: 0.026082, train_metric: 0.114105, eval_loss: 0.041299, eval_mae: 0.149225 -[2024/06/24 07:24:23] ppsci INFO: train: epoch 1749 | step 0 | lr 0.000428 | loss 0.018828 | mae 0.103786 -[2024/06/24 07:24:23] ppsci INFO: train: epoch 1749 | step 10 | lr 0.000428 | loss 0.072672 | mae 0.181270 -[2024/06/24 07:24:24] ppsci INFO: train: epoch 1749 | step 20 | lr 0.000428 | loss 0.072365 | mae 0.152973 -[2024/06/24 07:24:25] ppsci INFO: train: epoch 1749 | step 30 | lr 0.000428 | loss 0.040237 | mae 0.150669 -[2024/06/24 07:24:25] ppsci INFO: train: epoch 1749 | step 38 | lr 0.000428 | loss 0.043555 | mae 0.164179 -[2024/06/24 07:24:25] ppsci INFO: epoch: 1749, train_loss: 0.050990, train_metric: 0.153828, eval_loss: 0.058006, eval_mae: 0.160843 -[2024/06/24 07:24:25] ppsci INFO: train: epoch 1750 | step 0 | lr 0.000428 | loss 0.030512 | mae 0.135886 -[2024/06/24 07:24:26] ppsci INFO: train: epoch 1750 | step 10 | lr 0.000428 | loss 0.025213 | mae 0.122589 -[2024/06/24 07:24:26] ppsci INFO: train: epoch 1750 | step 20 | lr 0.000428 | loss 0.022988 | mae 0.113674 -[2024/06/24 07:24:27] ppsci INFO: train: epoch 1750 | step 30 | lr 0.000428 | loss 0.052715 | mae 0.146012 -[2024/06/24 07:24:27] ppsci INFO: train: epoch 1750 | step 38 | lr 0.000428 | loss 0.017095 | mae 0.097189 -[2024/06/24 07:24:27] ppsci INFO: epoch: 1750, train_loss: 0.037666, train_metric: 0.137082, eval_loss: 0.047013, eval_mae: 0.155512 -[2024/06/24 07:24:27] ppsci INFO: train: epoch 1751 | step 0 | lr 0.000429 | loss 0.027553 | mae 0.127246 -[2024/06/24 07:24:28] ppsci INFO: train: epoch 1751 | step 10 | lr 0.000429 | loss 0.025983 | mae 0.118143 -[2024/06/24 07:24:28] ppsci INFO: train: epoch 1751 | step 20 | lr 0.000429 | loss 0.022346 | mae 0.112426 -[2024/06/24 07:24:29] ppsci INFO: train: epoch 1751 | step 30 | lr 0.000429 | loss 0.020068 | mae 0.103396 -[2024/06/24 07:24:29] ppsci INFO: train: epoch 1751 | step 38 | lr 0.000429 | loss 0.044903 | mae 0.174790 -[2024/06/24 07:24:29] ppsci INFO: epoch: 1751, train_loss: 0.030664, train_metric: 0.126956, eval_loss: 0.043892, eval_mae: 0.149977 -[2024/06/24 07:24:29] ppsci INFO: train: epoch 1752 | step 0 | lr 0.000429 | loss 0.025502 | mae 0.111776 -[2024/06/24 07:24:30] ppsci INFO: train: epoch 1752 | step 10 | lr 0.000429 | loss 0.028899 | mae 0.126553 -[2024/06/24 07:24:30] ppsci INFO: train: epoch 1752 | step 20 | lr 0.000429 | loss 0.047780 | mae 0.138287 -[2024/06/24 07:24:31] ppsci INFO: train: epoch 1752 | step 30 | lr 0.000429 | loss 0.019721 | mae 0.111551 -[2024/06/24 07:24:31] ppsci INFO: train: epoch 1752 | step 38 | lr 0.000429 | loss 0.029695 | mae 0.114862 -[2024/06/24 07:24:32] ppsci INFO: epoch: 1752, train_loss: 0.026250, train_metric: 0.119374, eval_loss: 0.047785, eval_mae: 0.151323 -[2024/06/24 07:24:32] ppsci INFO: train: epoch 1753 | step 0 | lr 0.000430 | loss 0.020373 | mae 0.107517 -[2024/06/24 07:24:32] ppsci INFO: train: epoch 1753 | step 10 | lr 0.000430 | loss 0.024834 | mae 0.117152 -[2024/06/24 07:24:33] ppsci INFO: train: epoch 1753 | step 20 | lr 0.000430 | loss 0.027022 | mae 0.117540 -[2024/06/24 07:24:33] ppsci INFO: train: epoch 1753 | step 30 | lr 0.000430 | loss 0.023314 | mae 0.114841 -[2024/06/24 07:24:34] ppsci INFO: train: epoch 1753 | step 38 | lr 0.000430 | loss 0.014312 | mae 0.090364 -[2024/06/24 07:24:34] ppsci INFO: epoch: 1753, train_loss: 0.025224, train_metric: 0.117211, eval_loss: 0.042925, eval_mae: 0.149615 -[2024/06/24 07:24:34] ppsci INFO: train: epoch 1754 | step 0 | lr 0.000430 | loss 0.025121 | mae 0.119411 -[2024/06/24 07:24:34] ppsci INFO: train: epoch 1754 | step 10 | lr 0.000430 | loss 0.023361 | mae 0.115313 -[2024/06/24 07:24:35] ppsci INFO: train: epoch 1754 | step 20 | lr 0.000430 | loss 0.020720 | mae 0.106703 -[2024/06/24 07:24:35] ppsci INFO: train: epoch 1754 | step 30 | lr 0.000430 | loss 0.019828 | mae 0.105709 -[2024/06/24 07:24:36] ppsci INFO: train: epoch 1754 | step 38 | lr 0.000430 | loss 0.014418 | mae 0.094129 -[2024/06/24 07:24:36] ppsci INFO: epoch: 1754, train_loss: 0.023368, train_metric: 0.114245, eval_loss: 0.042079, eval_mae: 0.146849 -[2024/06/24 07:24:36] ppsci INFO: train: epoch 1755 | step 0 | lr 0.000431 | loss 0.025020 | mae 0.117355 -[2024/06/24 07:24:36] ppsci INFO: train: epoch 1755 | step 10 | lr 0.000431 | loss 0.020518 | mae 0.109855 -[2024/06/24 07:24:37] ppsci INFO: train: epoch 1755 | step 20 | lr 0.000431 | loss 0.017995 | mae 0.107220 -[2024/06/24 07:24:37] ppsci INFO: train: epoch 1755 | step 30 | lr 0.000431 | loss 0.021072 | mae 0.112761 -[2024/06/24 07:24:38] ppsci INFO: train: epoch 1755 | step 38 | lr 0.000431 | loss 0.014790 | mae 0.088968 -[2024/06/24 07:24:38] ppsci INFO: epoch: 1755, train_loss: 0.023811, train_metric: 0.115534, eval_loss: 0.039451, eval_mae: 0.144544 -[2024/06/24 07:24:38] ppsci INFO: train: epoch 1756 | step 0 | lr 0.000431 | loss 0.019845 | mae 0.104412 -[2024/06/24 07:24:38] ppsci INFO: train: epoch 1756 | step 10 | lr 0.000431 | loss 0.023706 | mae 0.117225 -[2024/06/24 07:24:39] ppsci INFO: train: epoch 1756 | step 20 | lr 0.000431 | loss 0.021971 | mae 0.113213 -[2024/06/24 07:24:40] ppsci INFO: train: epoch 1756 | step 30 | lr 0.000431 | loss 0.028334 | mae 0.116236 -[2024/06/24 07:24:40] ppsci INFO: train: epoch 1756 | step 38 | lr 0.000431 | loss 0.032402 | mae 0.126777 -[2024/06/24 07:24:40] ppsci INFO: epoch: 1756, train_loss: 0.023830, train_metric: 0.114633, eval_loss: 0.042339, eval_mae: 0.146205 -[2024/06/24 07:24:40] ppsci INFO: train: epoch 1757 | step 0 | lr 0.000432 | loss 0.028663 | mae 0.129173 -[2024/06/24 07:24:41] ppsci INFO: train: epoch 1757 | step 10 | lr 0.000432 | loss 0.029079 | mae 0.120703 -[2024/06/24 07:24:41] ppsci INFO: train: epoch 1757 | step 20 | lr 0.000432 | loss 0.022596 | mae 0.114947 -[2024/06/24 07:24:42] ppsci INFO: train: epoch 1757 | step 30 | lr 0.000432 | loss 0.021972 | mae 0.110232 -[2024/06/24 07:24:42] ppsci INFO: train: epoch 1757 | step 38 | lr 0.000432 | loss 0.059504 | mae 0.184880 -[2024/06/24 07:24:42] ppsci INFO: epoch: 1757, train_loss: 0.029308, train_metric: 0.117603, eval_loss: 0.040906, eval_mae: 0.145102 -[2024/06/24 07:24:42] ppsci INFO: train: epoch 1758 | step 0 | lr 0.000433 | loss 0.026037 | mae 0.119155 -[2024/06/24 07:24:43] ppsci INFO: train: epoch 1758 | step 10 | lr 0.000433 | loss 0.022923 | mae 0.116104 -[2024/06/24 07:24:43] ppsci INFO: train: epoch 1758 | step 20 | lr 0.000433 | loss 0.021638 | mae 0.117438 -[2024/06/24 07:24:44] ppsci INFO: train: epoch 1758 | step 30 | lr 0.000433 | loss 0.025408 | mae 0.114525 -[2024/06/24 07:24:44] ppsci INFO: train: epoch 1758 | step 38 | lr 0.000433 | loss 0.049069 | mae 0.148196 -[2024/06/24 07:24:44] ppsci INFO: epoch: 1758, train_loss: 0.025996, train_metric: 0.116459, eval_loss: 0.041279, eval_mae: 0.144598 -[2024/06/24 07:24:44] ppsci INFO: train: epoch 1759 | step 0 | lr 0.000433 | loss 0.021392 | mae 0.112974 -[2024/06/24 07:24:45] ppsci INFO: train: epoch 1759 | step 10 | lr 0.000433 | loss 0.019887 | mae 0.106668 -[2024/06/24 07:24:45] ppsci INFO: train: epoch 1759 | step 20 | lr 0.000433 | loss 0.020106 | mae 0.105097 -[2024/06/24 07:24:46] ppsci INFO: train: epoch 1759 | step 30 | lr 0.000433 | loss 0.020317 | mae 0.101864 -[2024/06/24 07:24:46] ppsci INFO: train: epoch 1759 | step 38 | lr 0.000433 | loss 0.016254 | mae 0.104017 -[2024/06/24 07:24:46] ppsci INFO: epoch: 1759, train_loss: 0.023158, train_metric: 0.112069, eval_loss: 0.046010, eval_mae: 0.148270 -[2024/06/24 07:24:46] ppsci INFO: train: epoch 1760 | step 0 | lr 0.000434 | loss 0.020314 | mae 0.108229 -[2024/06/24 07:24:47] ppsci INFO: train: epoch 1760 | step 10 | lr 0.000434 | loss 0.024731 | mae 0.120575 -[2024/06/24 07:24:47] ppsci INFO: train: epoch 1760 | step 20 | lr 0.000434 | loss 0.027308 | mae 0.126143 -[2024/06/24 07:24:48] ppsci INFO: train: epoch 1760 | step 30 | lr 0.000434 | loss 0.021960 | mae 0.107272 -[2024/06/24 07:24:48] ppsci INFO: train: epoch 1760 | step 38 | lr 0.000434 | loss 0.018953 | mae 0.101834 -[2024/06/24 07:24:48] ppsci INFO: epoch: 1760, train_loss: 0.022798, train_metric: 0.111995, eval_loss: 0.041618, eval_mae: 0.141547 -[2024/06/24 07:24:49] ppsci INFO: train: epoch 1761 | step 0 | lr 0.000434 | loss 0.025757 | mae 0.121347 -[2024/06/24 07:24:49] ppsci INFO: train: epoch 1761 | step 10 | lr 0.000434 | loss 0.018935 | mae 0.105454 -[2024/06/24 07:24:49] ppsci INFO: train: epoch 1761 | step 20 | lr 0.000434 | loss 0.030266 | mae 0.122972 -[2024/06/24 07:24:50] ppsci INFO: train: epoch 1761 | step 30 | lr 0.000434 | loss 0.021935 | mae 0.113104 -[2024/06/24 07:24:50] ppsci INFO: train: epoch 1761 | step 38 | lr 0.000434 | loss 0.020427 | mae 0.105240 -[2024/06/24 07:24:51] ppsci INFO: epoch: 1761, train_loss: 0.021273, train_metric: 0.109053, eval_loss: 0.037763, eval_mae: 0.138418 -[2024/06/24 07:24:51] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:24:51] ppsci INFO: train: epoch 1762 | step 0 | lr 0.000435 | loss 0.020831 | mae 0.107627 -[2024/06/24 07:24:51] ppsci INFO: train: epoch 1762 | step 10 | lr 0.000435 | loss 0.018094 | mae 0.101421 -[2024/06/24 07:24:52] ppsci INFO: train: epoch 1762 | step 20 | lr 0.000435 | loss 0.017312 | mae 0.096729 -[2024/06/24 07:24:52] ppsci INFO: train: epoch 1762 | step 30 | lr 0.000435 | loss 0.027922 | mae 0.110789 -[2024/06/24 07:24:53] ppsci INFO: train: epoch 1762 | step 38 | lr 0.000435 | loss 0.015391 | mae 0.096593 -[2024/06/24 07:24:53] ppsci INFO: epoch: 1762, train_loss: 0.022337, train_metric: 0.110383, eval_loss: 0.046306, eval_mae: 0.144608 -[2024/06/24 07:24:53] ppsci INFO: train: epoch 1763 | step 0 | lr 0.000435 | loss 0.030198 | mae 0.122384 -[2024/06/24 07:24:53] ppsci INFO: train: epoch 1763 | step 10 | lr 0.000435 | loss 0.021248 | mae 0.108513 -[2024/06/24 07:24:54] ppsci INFO: train: epoch 1763 | step 20 | lr 0.000435 | loss 0.022698 | mae 0.104677 -[2024/06/24 07:24:54] ppsci INFO: train: epoch 1763 | step 30 | lr 0.000435 | loss 0.016428 | mae 0.096387 -[2024/06/24 07:24:55] ppsci INFO: train: epoch 1763 | step 38 | lr 0.000435 | loss 0.031155 | mae 0.125463 -[2024/06/24 07:24:55] ppsci INFO: epoch: 1763, train_loss: 0.024430, train_metric: 0.111797, eval_loss: 0.042173, eval_mae: 0.141939 -[2024/06/24 07:24:55] ppsci INFO: train: epoch 1764 | step 0 | lr 0.000436 | loss 0.029318 | mae 0.123772 -[2024/06/24 07:24:56] ppsci INFO: train: epoch 1764 | step 10 | lr 0.000436 | loss 0.018297 | mae 0.099075 -[2024/06/24 07:24:56] ppsci INFO: train: epoch 1764 | step 20 | lr 0.000436 | loss 0.017509 | mae 0.103805 -[2024/06/24 07:24:57] ppsci INFO: train: epoch 1764 | step 30 | lr 0.000436 | loss 0.032149 | mae 0.128138 -[2024/06/24 07:24:57] ppsci INFO: train: epoch 1764 | step 38 | lr 0.000436 | loss 0.016875 | mae 0.113531 -[2024/06/24 07:24:57] ppsci INFO: epoch: 1764, train_loss: 0.022114, train_metric: 0.109953, eval_loss: 0.043705, eval_mae: 0.142318 -[2024/06/24 07:24:57] ppsci INFO: train: epoch 1765 | step 0 | lr 0.000436 | loss 0.014964 | mae 0.091443 -[2024/06/24 07:24:58] ppsci INFO: train: epoch 1765 | step 10 | lr 0.000436 | loss 0.024210 | mae 0.114443 -[2024/06/24 07:24:58] ppsci INFO: train: epoch 1765 | step 20 | lr 0.000436 | loss 0.022163 | mae 0.112293 -[2024/06/24 07:24:59] ppsci INFO: train: epoch 1765 | step 30 | lr 0.000436 | loss 0.025892 | mae 0.120057 -[2024/06/24 07:24:59] ppsci INFO: train: epoch 1765 | step 38 | lr 0.000436 | loss 0.016151 | mae 0.100278 -[2024/06/24 07:24:59] ppsci INFO: epoch: 1765, train_loss: 0.020315, train_metric: 0.107490, eval_loss: 0.047268, eval_mae: 0.145339 -[2024/06/24 07:24:59] ppsci INFO: train: epoch 1766 | step 0 | lr 0.000437 | loss 0.021260 | mae 0.112638 -[2024/06/24 07:25:00] ppsci INFO: train: epoch 1766 | step 10 | lr 0.000437 | loss 0.019965 | mae 0.102864 -[2024/06/24 07:25:00] ppsci INFO: train: epoch 1766 | step 20 | lr 0.000437 | loss 0.020378 | mae 0.100139 -[2024/06/24 07:25:01] ppsci INFO: train: epoch 1766 | step 30 | lr 0.000437 | loss 0.025569 | mae 0.120162 -[2024/06/24 07:25:01] ppsci INFO: train: epoch 1766 | step 38 | lr 0.000437 | loss 0.013907 | mae 0.100915 -[2024/06/24 07:25:01] ppsci INFO: epoch: 1766, train_loss: 0.022924, train_metric: 0.111878, eval_loss: 0.042474, eval_mae: 0.140284 -[2024/06/24 07:25:01] ppsci INFO: train: epoch 1767 | step 0 | lr 0.000437 | loss 0.019241 | mae 0.102573 -[2024/06/24 07:25:02] ppsci INFO: train: epoch 1767 | step 10 | lr 0.000437 | loss 0.018931 | mae 0.098350 -[2024/06/24 07:25:02] ppsci INFO: train: epoch 1767 | step 20 | lr 0.000437 | loss 0.020442 | mae 0.099408 -[2024/06/24 07:25:03] ppsci INFO: train: epoch 1767 | step 30 | lr 0.000437 | loss 0.020308 | mae 0.103858 -[2024/06/24 07:25:03] ppsci INFO: train: epoch 1767 | step 38 | lr 0.000437 | loss 0.015681 | mae 0.110739 -[2024/06/24 07:25:03] ppsci INFO: epoch: 1767, train_loss: 0.020407, train_metric: 0.106831, eval_loss: 0.044343, eval_mae: 0.140881 -[2024/06/24 07:25:03] ppsci INFO: train: epoch 1768 | step 0 | lr 0.000438 | loss 0.017642 | mae 0.097543 -[2024/06/24 07:25:04] ppsci INFO: train: epoch 1768 | step 10 | lr 0.000438 | loss 0.019795 | mae 0.101983 -[2024/06/24 07:25:04] ppsci INFO: train: epoch 1768 | step 20 | lr 0.000438 | loss 0.019830 | mae 0.107798 -[2024/06/24 07:25:05] ppsci INFO: train: epoch 1768 | step 30 | lr 0.000438 | loss 0.012501 | mae 0.085569 -[2024/06/24 07:25:05] ppsci INFO: train: epoch 1768 | step 38 | lr 0.000438 | loss 0.024676 | mae 0.132298 -[2024/06/24 07:25:05] ppsci INFO: epoch: 1768, train_loss: 0.021101, train_metric: 0.107006, eval_loss: 0.047585, eval_mae: 0.144776 -[2024/06/24 07:25:06] ppsci INFO: train: epoch 1769 | step 0 | lr 0.000438 | loss 0.018249 | mae 0.103385 -[2024/06/24 07:25:06] ppsci INFO: train: epoch 1769 | step 10 | lr 0.000438 | loss 0.024152 | mae 0.109869 -[2024/06/24 07:25:07] ppsci INFO: train: epoch 1769 | step 20 | lr 0.000438 | loss 0.026466 | mae 0.124973 -[2024/06/24 07:25:07] ppsci INFO: train: epoch 1769 | step 30 | lr 0.000438 | loss 0.022703 | mae 0.111606 -[2024/06/24 07:25:08] ppsci INFO: train: epoch 1769 | step 38 | lr 0.000438 | loss 0.013192 | mae 0.094268 -[2024/06/24 07:25:08] ppsci INFO: epoch: 1769, train_loss: 0.021112, train_metric: 0.108338, eval_loss: 0.047729, eval_mae: 0.149489 -[2024/06/24 07:25:08] ppsci INFO: train: epoch 1770 | step 0 | lr 0.000439 | loss 0.027915 | mae 0.122589 -[2024/06/24 07:25:08] ppsci INFO: train: epoch 1770 | step 10 | lr 0.000439 | loss 0.020210 | mae 0.112800 -[2024/06/24 07:25:09] ppsci INFO: train: epoch 1770 | step 20 | lr 0.000439 | loss 0.022445 | mae 0.107074 -[2024/06/24 07:25:09] ppsci INFO: train: epoch 1770 | step 30 | lr 0.000439 | loss 0.020723 | mae 0.108800 -[2024/06/24 07:25:10] ppsci INFO: train: epoch 1770 | step 38 | lr 0.000439 | loss 0.023911 | mae 0.091213 -[2024/06/24 07:25:10] ppsci INFO: epoch: 1770, train_loss: 0.021426, train_metric: 0.107290, eval_loss: 0.047965, eval_mae: 0.146635 -[2024/06/24 07:25:10] ppsci INFO: train: epoch 1771 | step 0 | lr 0.000439 | loss 0.032849 | mae 0.121015 -[2024/06/24 07:25:10] ppsci INFO: train: epoch 1771 | step 10 | lr 0.000439 | loss 0.019854 | mae 0.103834 -[2024/06/24 07:25:11] ppsci INFO: train: epoch 1771 | step 20 | lr 0.000439 | loss 0.026598 | mae 0.120581 -[2024/06/24 07:25:12] ppsci INFO: train: epoch 1771 | step 30 | lr 0.000439 | loss 0.023290 | mae 0.108978 -[2024/06/24 07:25:12] ppsci INFO: train: epoch 1771 | step 38 | lr 0.000439 | loss 0.018208 | mae 0.098039 -[2024/06/24 07:25:12] ppsci INFO: epoch: 1771, train_loss: 0.022673, train_metric: 0.109779, eval_loss: 0.042464, eval_mae: 0.143915 -[2024/06/24 07:25:12] ppsci INFO: train: epoch 1772 | step 0 | lr 0.000440 | loss 0.018338 | mae 0.102205 -[2024/06/24 07:25:13] ppsci INFO: train: epoch 1772 | step 10 | lr 0.000440 | loss 0.023256 | mae 0.113362 -[2024/06/24 07:25:13] ppsci INFO: train: epoch 1772 | step 20 | lr 0.000440 | loss 0.023392 | mae 0.115384 -[2024/06/24 07:25:14] ppsci INFO: train: epoch 1772 | step 30 | lr 0.000440 | loss 0.019833 | mae 0.107229 -[2024/06/24 07:25:14] ppsci INFO: train: epoch 1772 | step 38 | lr 0.000440 | loss 0.016282 | mae 0.097289 -[2024/06/24 07:25:14] ppsci INFO: epoch: 1772, train_loss: 0.022500, train_metric: 0.111764, eval_loss: 0.046931, eval_mae: 0.151448 -[2024/06/24 07:25:14] ppsci INFO: train: epoch 1773 | step 0 | lr 0.000440 | loss 0.022089 | mae 0.107594 -[2024/06/24 07:25:15] ppsci INFO: train: epoch 1773 | step 10 | lr 0.000440 | loss 0.026280 | mae 0.123465 -[2024/06/24 07:25:15] ppsci INFO: train: epoch 1773 | step 20 | lr 0.000440 | loss 0.032631 | mae 0.126574 -[2024/06/24 07:25:16] ppsci INFO: train: epoch 1773 | step 30 | lr 0.000440 | loss 0.017628 | mae 0.103729 -[2024/06/24 07:25:16] ppsci INFO: train: epoch 1773 | step 38 | lr 0.000440 | loss 0.010283 | mae 0.077433 -[2024/06/24 07:25:16] ppsci INFO: epoch: 1773, train_loss: 0.022786, train_metric: 0.110395, eval_loss: 0.043807, eval_mae: 0.142452 -[2024/06/24 07:25:16] ppsci INFO: train: epoch 1774 | step 0 | lr 0.000441 | loss 0.020889 | mae 0.110305 -[2024/06/24 07:25:17] ppsci INFO: train: epoch 1774 | step 10 | lr 0.000441 | loss 0.018942 | mae 0.112012 -[2024/06/24 07:25:18] ppsci INFO: train: epoch 1774 | step 20 | lr 0.000441 | loss 0.025354 | mae 0.112010 -[2024/06/24 07:25:18] ppsci INFO: train: epoch 1774 | step 30 | lr 0.000441 | loss 0.033117 | mae 0.135250 -[2024/06/24 07:25:19] ppsci INFO: train: epoch 1774 | step 38 | lr 0.000441 | loss 0.024287 | mae 0.114992 -[2024/06/24 07:25:19] ppsci INFO: epoch: 1774, train_loss: 0.022133, train_metric: 0.108997, eval_loss: 0.043506, eval_mae: 0.140686 -[2024/06/24 07:25:19] ppsci INFO: train: epoch 1775 | step 0 | lr 0.000441 | loss 0.029971 | mae 0.124625 -[2024/06/24 07:25:19] ppsci INFO: train: epoch 1775 | step 10 | lr 0.000441 | loss 0.020377 | mae 0.109755 -[2024/06/24 07:25:20] ppsci INFO: train: epoch 1775 | step 20 | lr 0.000441 | loss 0.027735 | mae 0.127732 -[2024/06/24 07:25:21] ppsci INFO: train: epoch 1775 | step 30 | lr 0.000441 | loss 0.021616 | mae 0.114387 -[2024/06/24 07:25:21] ppsci INFO: train: epoch 1775 | step 38 | lr 0.000441 | loss 0.019348 | mae 0.101426 -[2024/06/24 07:25:21] ppsci INFO: epoch: 1775, train_loss: 0.022264, train_metric: 0.109846, eval_loss: 0.038257, eval_mae: 0.138015 -[2024/06/24 07:25:21] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:25:21] ppsci INFO: train: epoch 1776 | step 0 | lr 0.000442 | loss 0.024396 | mae 0.117184 -[2024/06/24 07:25:22] ppsci INFO: train: epoch 1776 | step 10 | lr 0.000442 | loss 0.022292 | mae 0.112991 -[2024/06/24 07:25:22] ppsci INFO: train: epoch 1776 | step 20 | lr 0.000442 | loss 0.019654 | mae 0.104218 -[2024/06/24 07:25:23] ppsci INFO: train: epoch 1776 | step 30 | lr 0.000442 | loss 0.023740 | mae 0.113670 -[2024/06/24 07:25:23] ppsci INFO: train: epoch 1776 | step 38 | lr 0.000442 | loss 0.017817 | mae 0.114572 -[2024/06/24 07:25:23] ppsci INFO: epoch: 1776, train_loss: 0.020865, train_metric: 0.109138, eval_loss: 0.041326, eval_mae: 0.147355 -[2024/06/24 07:25:23] ppsci INFO: train: epoch 1777 | step 0 | lr 0.000442 | loss 0.015667 | mae 0.096331 -[2024/06/24 07:25:24] ppsci INFO: train: epoch 1777 | step 10 | lr 0.000442 | loss 0.028659 | mae 0.113140 -[2024/06/24 07:25:24] ppsci INFO: train: epoch 1777 | step 20 | lr 0.000442 | loss 0.020735 | mae 0.112676 -[2024/06/24 07:25:25] ppsci INFO: train: epoch 1777 | step 30 | lr 0.000442 | loss 0.027578 | mae 0.120996 -[2024/06/24 07:25:25] ppsci INFO: train: epoch 1777 | step 38 | lr 0.000442 | loss 0.007462 | mae 0.075468 -[2024/06/24 07:25:25] ppsci INFO: epoch: 1777, train_loss: 0.021500, train_metric: 0.107521, eval_loss: 0.044225, eval_mae: 0.144629 -[2024/06/24 07:25:25] ppsci INFO: train: epoch 1778 | step 0 | lr 0.000443 | loss 0.016816 | mae 0.097218 -[2024/06/24 07:25:26] ppsci INFO: train: epoch 1778 | step 10 | lr 0.000443 | loss 0.022880 | mae 0.115561 -[2024/06/24 07:25:26] ppsci INFO: train: epoch 1778 | step 20 | lr 0.000443 | loss 0.017581 | mae 0.098747 -[2024/06/24 07:25:27] ppsci INFO: train: epoch 1778 | step 30 | lr 0.000443 | loss 0.020225 | mae 0.105888 -[2024/06/24 07:25:27] ppsci INFO: train: epoch 1778 | step 38 | lr 0.000443 | loss 0.009241 | mae 0.083115 -[2024/06/24 07:25:27] ppsci INFO: epoch: 1778, train_loss: 0.020681, train_metric: 0.107721, eval_loss: 0.045725, eval_mae: 0.150206 -[2024/06/24 07:25:27] ppsci INFO: train: epoch 1779 | step 0 | lr 0.000443 | loss 0.021758 | mae 0.106958 -[2024/06/24 07:25:28] ppsci INFO: train: epoch 1779 | step 10 | lr 0.000443 | loss 0.018228 | mae 0.105808 -[2024/06/24 07:25:29] ppsci INFO: train: epoch 1779 | step 20 | lr 0.000443 | loss 0.020710 | mae 0.104842 -[2024/06/24 07:25:29] ppsci INFO: train: epoch 1779 | step 30 | lr 0.000443 | loss 0.015289 | mae 0.094562 -[2024/06/24 07:25:29] ppsci INFO: train: epoch 1779 | step 38 | lr 0.000443 | loss 0.017531 | mae 0.106323 -[2024/06/24 07:25:30] ppsci INFO: epoch: 1779, train_loss: 0.021484, train_metric: 0.109141, eval_loss: 0.050247, eval_mae: 0.150290 -[2024/06/24 07:25:30] ppsci INFO: train: epoch 1780 | step 0 | lr 0.000444 | loss 0.014602 | mae 0.095181 -[2024/06/24 07:25:30] ppsci INFO: train: epoch 1780 | step 10 | lr 0.000444 | loss 0.023148 | mae 0.110590 -[2024/06/24 07:25:31] ppsci INFO: train: epoch 1780 | step 20 | lr 0.000444 | loss 0.021737 | mae 0.114722 -[2024/06/24 07:25:31] ppsci INFO: train: epoch 1780 | step 30 | lr 0.000444 | loss 0.016727 | mae 0.098515 -[2024/06/24 07:25:32] ppsci INFO: train: epoch 1780 | step 38 | lr 0.000444 | loss 0.016913 | mae 0.104855 -[2024/06/24 07:25:32] ppsci INFO: epoch: 1780, train_loss: 0.021350, train_metric: 0.106980, eval_loss: 0.040877, eval_mae: 0.140880 -[2024/06/24 07:25:32] ppsci INFO: train: epoch 1781 | step 0 | lr 0.000444 | loss 0.017537 | mae 0.094243 -[2024/06/24 07:25:32] ppsci INFO: train: epoch 1781 | step 10 | lr 0.000444 | loss 0.017668 | mae 0.097400 -[2024/06/24 07:25:33] ppsci INFO: train: epoch 1781 | step 20 | lr 0.000444 | loss 0.023432 | mae 0.111099 -[2024/06/24 07:25:33] ppsci INFO: train: epoch 1781 | step 30 | lr 0.000444 | loss 0.025503 | mae 0.120877 -[2024/06/24 07:25:34] ppsci INFO: train: epoch 1781 | step 38 | lr 0.000444 | loss 0.018336 | mae 0.089568 -[2024/06/24 07:25:34] ppsci INFO: epoch: 1781, train_loss: 0.020593, train_metric: 0.106017, eval_loss: 0.042824, eval_mae: 0.144431 -[2024/06/24 07:25:34] ppsci INFO: train: epoch 1782 | step 0 | lr 0.000445 | loss 0.012108 | mae 0.081964 -[2024/06/24 07:25:34] ppsci INFO: train: epoch 1782 | step 10 | lr 0.000445 | loss 0.030673 | mae 0.128680 -[2024/06/24 07:25:35] ppsci INFO: train: epoch 1782 | step 20 | lr 0.000445 | loss 0.032367 | mae 0.126411 -[2024/06/24 07:25:35] ppsci INFO: train: epoch 1782 | step 30 | lr 0.000445 | loss 0.019454 | mae 0.097198 -[2024/06/24 07:25:36] ppsci INFO: train: epoch 1782 | step 38 | lr 0.000445 | loss 0.008281 | mae 0.082480 -[2024/06/24 07:25:36] ppsci INFO: epoch: 1782, train_loss: 0.022256, train_metric: 0.109014, eval_loss: 0.044767, eval_mae: 0.146581 -[2024/06/24 07:25:36] ppsci INFO: train: epoch 1783 | step 0 | lr 0.000445 | loss 0.018818 | mae 0.103880 -[2024/06/24 07:25:36] ppsci INFO: train: epoch 1783 | step 10 | lr 0.000445 | loss 0.016879 | mae 0.097277 -[2024/06/24 07:25:37] ppsci INFO: train: epoch 1783 | step 20 | lr 0.000445 | loss 0.016184 | mae 0.096080 -[2024/06/24 07:25:37] ppsci INFO: train: epoch 1783 | step 30 | lr 0.000445 | loss 0.030752 | mae 0.124420 -[2024/06/24 07:25:38] ppsci INFO: train: epoch 1783 | step 38 | lr 0.000445 | loss 0.010491 | mae 0.080000 -[2024/06/24 07:25:38] ppsci INFO: epoch: 1783, train_loss: 0.020752, train_metric: 0.106545, eval_loss: 0.044586, eval_mae: 0.143652 -[2024/06/24 07:25:38] ppsci INFO: train: epoch 1784 | step 0 | lr 0.000446 | loss 0.018068 | mae 0.101696 -[2024/06/24 07:25:38] ppsci INFO: train: epoch 1784 | step 10 | lr 0.000446 | loss 0.013436 | mae 0.092020 -[2024/06/24 07:25:39] ppsci INFO: train: epoch 1784 | step 20 | lr 0.000446 | loss 0.020162 | mae 0.106357 -[2024/06/24 07:25:39] ppsci INFO: train: epoch 1784 | step 30 | lr 0.000446 | loss 0.028285 | mae 0.125928 -[2024/06/24 07:25:40] ppsci INFO: train: epoch 1784 | step 38 | lr 0.000446 | loss 0.008469 | mae 0.077566 -[2024/06/24 07:25:40] ppsci INFO: epoch: 1784, train_loss: 0.020121, train_metric: 0.106790, eval_loss: 0.046659, eval_mae: 0.148894 -[2024/06/24 07:25:40] ppsci INFO: train: epoch 1785 | step 0 | lr 0.000446 | loss 0.021930 | mae 0.105013 -[2024/06/24 07:25:41] ppsci INFO: train: epoch 1785 | step 10 | lr 0.000446 | loss 0.019298 | mae 0.106833 -[2024/06/24 07:25:41] ppsci INFO: train: epoch 1785 | step 20 | lr 0.000446 | loss 0.022885 | mae 0.114110 -[2024/06/24 07:25:42] ppsci INFO: train: epoch 1785 | step 30 | lr 0.000446 | loss 0.026014 | mae 0.116399 -[2024/06/24 07:25:42] ppsci INFO: train: epoch 1785 | step 38 | lr 0.000446 | loss 0.012620 | mae 0.083738 -[2024/06/24 07:25:42] ppsci INFO: epoch: 1785, train_loss: 0.020981, train_metric: 0.105661, eval_loss: 0.042023, eval_mae: 0.139847 -[2024/06/24 07:25:42] ppsci INFO: train: epoch 1786 | step 0 | lr 0.000447 | loss 0.028196 | mae 0.109628 -[2024/06/24 07:25:43] ppsci INFO: train: epoch 1786 | step 10 | lr 0.000447 | loss 0.024812 | mae 0.122722 -[2024/06/24 07:25:43] ppsci INFO: train: epoch 1786 | step 20 | lr 0.000447 | loss 0.023625 | mae 0.110492 -[2024/06/24 07:25:44] ppsci INFO: train: epoch 1786 | step 30 | lr 0.000447 | loss 0.015545 | mae 0.100183 -[2024/06/24 07:25:44] ppsci INFO: train: epoch 1786 | step 38 | lr 0.000447 | loss 0.017078 | mae 0.088956 -[2024/06/24 07:25:44] ppsci INFO: epoch: 1786, train_loss: 0.021419, train_metric: 0.107942, eval_loss: 0.047187, eval_mae: 0.149078 -[2024/06/24 07:25:44] ppsci INFO: train: epoch 1787 | step 0 | lr 0.000447 | loss 0.021730 | mae 0.101017 -[2024/06/24 07:25:45] ppsci INFO: train: epoch 1787 | step 10 | lr 0.000447 | loss 0.019767 | mae 0.107661 -[2024/06/24 07:25:45] ppsci INFO: train: epoch 1787 | step 20 | lr 0.000447 | loss 0.027715 | mae 0.118892 -[2024/06/24 07:25:46] ppsci INFO: train: epoch 1787 | step 30 | lr 0.000447 | loss 0.020266 | mae 0.107191 -[2024/06/24 07:25:46] ppsci INFO: train: epoch 1787 | step 38 | lr 0.000447 | loss 0.025486 | mae 0.098487 -[2024/06/24 07:25:46] ppsci INFO: epoch: 1787, train_loss: 0.021869, train_metric: 0.109142, eval_loss: 0.039606, eval_mae: 0.140685 -[2024/06/24 07:25:46] ppsci INFO: train: epoch 1788 | step 0 | lr 0.000448 | loss 0.039524 | mae 0.130632 -[2024/06/24 07:25:47] ppsci INFO: train: epoch 1788 | step 10 | lr 0.000448 | loss 0.018606 | mae 0.106611 -[2024/06/24 07:25:48] ppsci INFO: train: epoch 1788 | step 20 | lr 0.000448 | loss 0.022136 | mae 0.111145 -[2024/06/24 07:25:48] ppsci INFO: train: epoch 1788 | step 30 | lr 0.000448 | loss 0.018895 | mae 0.099880 -[2024/06/24 07:25:48] ppsci INFO: train: epoch 1788 | step 38 | lr 0.000448 | loss 0.027001 | mae 0.125862 -[2024/06/24 07:25:48] ppsci INFO: epoch: 1788, train_loss: 0.021549, train_metric: 0.108587, eval_loss: 0.040926, eval_mae: 0.148230 -[2024/06/24 07:25:49] ppsci INFO: train: epoch 1789 | step 0 | lr 0.000448 | loss 0.022038 | mae 0.109708 -[2024/06/24 07:25:49] ppsci INFO: train: epoch 1789 | step 10 | lr 0.000448 | loss 0.023403 | mae 0.105650 -[2024/06/24 07:25:50] ppsci INFO: train: epoch 1789 | step 20 | lr 0.000448 | loss 0.030641 | mae 0.130669 -[2024/06/24 07:25:50] ppsci INFO: train: epoch 1789 | step 30 | lr 0.000448 | loss 0.025393 | mae 0.109146 -[2024/06/24 07:25:50] ppsci INFO: train: epoch 1789 | step 38 | lr 0.000448 | loss 0.024361 | mae 0.126337 -[2024/06/24 07:25:51] ppsci INFO: epoch: 1789, train_loss: 0.020810, train_metric: 0.106534, eval_loss: 0.041111, eval_mae: 0.144407 -[2024/06/24 07:25:51] ppsci INFO: train: epoch 1790 | step 0 | lr 0.000449 | loss 0.024386 | mae 0.114325 -[2024/06/24 07:25:51] ppsci INFO: train: epoch 1790 | step 10 | lr 0.000449 | loss 0.036535 | mae 0.110842 -[2024/06/24 07:25:52] ppsci INFO: train: epoch 1790 | step 20 | lr 0.000449 | loss 0.016486 | mae 0.095523 -[2024/06/24 07:25:52] ppsci INFO: train: epoch 1790 | step 30 | lr 0.000449 | loss 0.028065 | mae 0.108115 -[2024/06/24 07:25:53] ppsci INFO: train: epoch 1790 | step 38 | lr 0.000449 | loss 0.017677 | mae 0.105059 -[2024/06/24 07:25:53] ppsci INFO: epoch: 1790, train_loss: 0.020933, train_metric: 0.106018, eval_loss: 0.050023, eval_mae: 0.147923 -[2024/06/24 07:25:53] ppsci INFO: train: epoch 1791 | step 0 | lr 0.000449 | loss 0.024449 | mae 0.113215 -[2024/06/24 07:25:53] ppsci INFO: train: epoch 1791 | step 10 | lr 0.000449 | loss 0.023749 | mae 0.113765 -[2024/06/24 07:25:54] ppsci INFO: train: epoch 1791 | step 20 | lr 0.000449 | loss 0.022248 | mae 0.110003 -[2024/06/24 07:25:54] ppsci INFO: train: epoch 1791 | step 30 | lr 0.000449 | loss 0.019306 | mae 0.104603 -[2024/06/24 07:25:55] ppsci INFO: train: epoch 1791 | step 38 | lr 0.000449 | loss 0.010945 | mae 0.073748 -[2024/06/24 07:25:55] ppsci INFO: epoch: 1791, train_loss: 0.020453, train_metric: 0.106140, eval_loss: 0.044198, eval_mae: 0.145058 -[2024/06/24 07:25:55] ppsci INFO: train: epoch 1792 | step 0 | lr 0.000450 | loss 0.022207 | mae 0.114107 -[2024/06/24 07:25:55] ppsci INFO: train: epoch 1792 | step 10 | lr 0.000450 | loss 0.018131 | mae 0.102283 -[2024/06/24 07:25:56] ppsci INFO: train: epoch 1792 | step 20 | lr 0.000450 | loss 0.018309 | mae 0.109939 -[2024/06/24 07:25:56] ppsci INFO: train: epoch 1792 | step 30 | lr 0.000450 | loss 0.019735 | mae 0.109698 -[2024/06/24 07:25:57] ppsci INFO: train: epoch 1792 | step 38 | lr 0.000450 | loss 0.024895 | mae 0.115417 -[2024/06/24 07:25:57] ppsci INFO: epoch: 1792, train_loss: 0.020203, train_metric: 0.104901, eval_loss: 0.044297, eval_mae: 0.144672 -[2024/06/24 07:25:57] ppsci INFO: train: epoch 1793 | step 0 | lr 0.000450 | loss 0.020579 | mae 0.103414 -[2024/06/24 07:25:57] ppsci INFO: train: epoch 1793 | step 10 | lr 0.000450 | loss 0.018993 | mae 0.109549 -[2024/06/24 07:25:58] ppsci INFO: train: epoch 1793 | step 20 | lr 0.000450 | loss 0.022992 | mae 0.113146 -[2024/06/24 07:25:59] ppsci INFO: train: epoch 1793 | step 30 | lr 0.000450 | loss 0.023492 | mae 0.114666 -[2024/06/24 07:25:59] ppsci INFO: train: epoch 1793 | step 38 | lr 0.000450 | loss 0.015707 | mae 0.090311 -[2024/06/24 07:25:59] ppsci INFO: epoch: 1793, train_loss: 0.021292, train_metric: 0.108371, eval_loss: 0.041445, eval_mae: 0.141046 -[2024/06/24 07:25:59] ppsci INFO: train: epoch 1794 | step 0 | lr 0.000450 | loss 0.022387 | mae 0.109457 -[2024/06/24 07:26:00] ppsci INFO: train: epoch 1794 | step 10 | lr 0.000450 | loss 0.021483 | mae 0.111180 -[2024/06/24 07:26:00] ppsci INFO: train: epoch 1794 | step 20 | lr 0.000450 | loss 0.029157 | mae 0.117819 -[2024/06/24 07:26:01] ppsci INFO: train: epoch 1794 | step 30 | lr 0.000450 | loss 0.032789 | mae 0.125447 -[2024/06/24 07:26:01] ppsci INFO: train: epoch 1794 | step 38 | lr 0.000450 | loss 0.040124 | mae 0.173855 -[2024/06/24 07:26:01] ppsci INFO: epoch: 1794, train_loss: 0.022012, train_metric: 0.107435, eval_loss: 0.044758, eval_mae: 0.147659 -[2024/06/24 07:26:01] ppsci INFO: train: epoch 1795 | step 0 | lr 0.000451 | loss 0.021657 | mae 0.101450 -[2024/06/24 07:26:02] ppsci INFO: train: epoch 1795 | step 10 | lr 0.000451 | loss 0.027185 | mae 0.112619 -[2024/06/24 07:26:02] ppsci INFO: train: epoch 1795 | step 20 | lr 0.000451 | loss 0.016369 | mae 0.095971 -[2024/06/24 07:26:03] ppsci INFO: train: epoch 1795 | step 30 | lr 0.000451 | loss 0.024224 | mae 0.122833 -[2024/06/24 07:26:03] ppsci INFO: train: epoch 1795 | step 38 | lr 0.000451 | loss 0.012785 | mae 0.081153 -[2024/06/24 07:26:03] ppsci INFO: epoch: 1795, train_loss: 0.021145, train_metric: 0.106764, eval_loss: 0.043387, eval_mae: 0.145387 -[2024/06/24 07:26:03] ppsci INFO: train: epoch 1796 | step 0 | lr 0.000451 | loss 0.022267 | mae 0.112401 -[2024/06/24 07:26:04] ppsci INFO: train: epoch 1796 | step 10 | lr 0.000451 | loss 0.030972 | mae 0.132412 -[2024/06/24 07:26:04] ppsci INFO: train: epoch 1796 | step 20 | lr 0.000451 | loss 0.027474 | mae 0.113861 -[2024/06/24 07:26:05] ppsci INFO: train: epoch 1796 | step 30 | lr 0.000451 | loss 0.022013 | mae 0.109134 -[2024/06/24 07:26:05] ppsci INFO: train: epoch 1796 | step 38 | lr 0.000451 | loss 0.011291 | mae 0.079474 -[2024/06/24 07:26:05] ppsci INFO: epoch: 1796, train_loss: 0.021745, train_metric: 0.109051, eval_loss: 0.046498, eval_mae: 0.148132 -[2024/06/24 07:26:05] ppsci INFO: train: epoch 1797 | step 0 | lr 0.000452 | loss 0.020871 | mae 0.110493 -[2024/06/24 07:26:06] ppsci INFO: train: epoch 1797 | step 10 | lr 0.000452 | loss 0.021885 | mae 0.110596 -[2024/06/24 07:26:07] ppsci INFO: train: epoch 1797 | step 20 | lr 0.000452 | loss 0.018802 | mae 0.107006 -[2024/06/24 07:26:07] ppsci INFO: train: epoch 1797 | step 30 | lr 0.000452 | loss 0.022841 | mae 0.108632 -[2024/06/24 07:26:07] ppsci INFO: train: epoch 1797 | step 38 | lr 0.000452 | loss 0.030889 | mae 0.142939 -[2024/06/24 07:26:08] ppsci INFO: epoch: 1797, train_loss: 0.021434, train_metric: 0.107165, eval_loss: 0.042931, eval_mae: 0.146135 -[2024/06/24 07:26:08] ppsci INFO: train: epoch 1798 | step 0 | lr 0.000452 | loss 0.020510 | mae 0.102159 -[2024/06/24 07:26:08] ppsci INFO: train: epoch 1798 | step 10 | lr 0.000452 | loss 0.026320 | mae 0.111993 -[2024/06/24 07:26:09] ppsci INFO: train: epoch 1798 | step 20 | lr 0.000452 | loss 0.025184 | mae 0.110271 -[2024/06/24 07:26:09] ppsci INFO: train: epoch 1798 | step 30 | lr 0.000452 | loss 0.016081 | mae 0.098468 -[2024/06/24 07:26:10] ppsci INFO: train: epoch 1798 | step 38 | lr 0.000452 | loss 0.025899 | mae 0.132151 -[2024/06/24 07:26:10] ppsci INFO: epoch: 1798, train_loss: 0.024592, train_metric: 0.113116, eval_loss: 0.042270, eval_mae: 0.148816 -[2024/06/24 07:26:10] ppsci INFO: train: epoch 1799 | step 0 | lr 0.000453 | loss 0.024840 | mae 0.114225 -[2024/06/24 07:26:10] ppsci INFO: train: epoch 1799 | step 10 | lr 0.000453 | loss 0.019331 | mae 0.099992 -[2024/06/24 07:26:11] ppsci INFO: train: epoch 1799 | step 20 | lr 0.000453 | loss 0.023385 | mae 0.119832 -[2024/06/24 07:26:11] ppsci INFO: train: epoch 1799 | step 30 | lr 0.000453 | loss 0.016468 | mae 0.099449 -[2024/06/24 07:26:12] ppsci INFO: train: epoch 1799 | step 38 | lr 0.000453 | loss 0.073490 | mae 0.206719 -[2024/06/24 07:26:12] ppsci INFO: epoch: 1799, train_loss: 0.024962, train_metric: 0.110592, eval_loss: 0.044091, eval_mae: 0.146415 -[2024/06/24 07:26:12] ppsci INFO: train: epoch 1800 | step 0 | lr 0.000453 | loss 0.017467 | mae 0.099336 -[2024/06/24 07:26:12] ppsci INFO: train: epoch 1800 | step 10 | lr 0.000453 | loss 0.019347 | mae 0.110650 -[2024/06/24 07:26:13] ppsci INFO: train: epoch 1800 | step 20 | lr 0.000453 | loss 0.023839 | mae 0.105845 -[2024/06/24 07:26:14] ppsci INFO: train: epoch 1800 | step 30 | lr 0.000453 | loss 0.026802 | mae 0.117054 -[2024/06/24 07:26:14] ppsci INFO: train: epoch 1800 | step 38 | lr 0.000453 | loss 0.013100 | mae 0.081977 -[2024/06/24 07:26:14] ppsci INFO: epoch: 1800, train_loss: 0.020438, train_metric: 0.106660, eval_loss: 0.042705, eval_mae: 0.143366 -[2024/06/24 07:26:14] ppsci INFO: train: epoch 1801 | step 0 | lr 0.000454 | loss 0.019315 | mae 0.109539 -[2024/06/24 07:26:15] ppsci INFO: train: epoch 1801 | step 10 | lr 0.000454 | loss 0.019547 | mae 0.105778 -[2024/06/24 07:26:15] ppsci INFO: train: epoch 1801 | step 20 | lr 0.000454 | loss 0.017658 | mae 0.100952 -[2024/06/24 07:26:16] ppsci INFO: train: epoch 1801 | step 30 | lr 0.000454 | loss 0.020295 | mae 0.107884 -[2024/06/24 07:26:16] ppsci INFO: train: epoch 1801 | step 38 | lr 0.000454 | loss 0.012905 | mae 0.084328 -[2024/06/24 07:26:16] ppsci INFO: epoch: 1801, train_loss: 0.020919, train_metric: 0.107266, eval_loss: 0.040376, eval_mae: 0.139677 -[2024/06/24 07:26:16] ppsci INFO: train: epoch 1802 | step 0 | lr 0.000454 | loss 0.017118 | mae 0.098756 -[2024/06/24 07:26:17] ppsci INFO: train: epoch 1802 | step 10 | lr 0.000454 | loss 0.020681 | mae 0.109380 -[2024/06/24 07:26:18] ppsci INFO: train: epoch 1802 | step 20 | lr 0.000454 | loss 0.016205 | mae 0.102985 -[2024/06/24 07:26:18] ppsci INFO: train: epoch 1802 | step 30 | lr 0.000454 | loss 0.017354 | mae 0.099232 -[2024/06/24 07:26:18] ppsci INFO: train: epoch 1802 | step 38 | lr 0.000454 | loss 0.011495 | mae 0.090594 -[2024/06/24 07:26:19] ppsci INFO: epoch: 1802, train_loss: 0.019375, train_metric: 0.103902, eval_loss: 0.043756, eval_mae: 0.147107 -[2024/06/24 07:26:19] ppsci INFO: train: epoch 1803 | step 0 | lr 0.000455 | loss 0.021164 | mae 0.110497 -[2024/06/24 07:26:19] ppsci INFO: train: epoch 1803 | step 10 | lr 0.000455 | loss 0.018643 | mae 0.100689 -[2024/06/24 07:26:20] ppsci INFO: train: epoch 1803 | step 20 | lr 0.000455 | loss 0.020298 | mae 0.107140 -[2024/06/24 07:26:20] ppsci INFO: train: epoch 1803 | step 30 | lr 0.000455 | loss 0.024216 | mae 0.119665 -[2024/06/24 07:26:21] ppsci INFO: train: epoch 1803 | step 38 | lr 0.000455 | loss 0.028999 | mae 0.112153 -[2024/06/24 07:26:21] ppsci INFO: epoch: 1803, train_loss: 0.021413, train_metric: 0.108461, eval_loss: 0.042231, eval_mae: 0.140712 -[2024/06/24 07:26:21] ppsci INFO: train: epoch 1804 | step 0 | lr 0.000455 | loss 0.023009 | mae 0.115282 -[2024/06/24 07:26:21] ppsci INFO: train: epoch 1804 | step 10 | lr 0.000455 | loss 0.018763 | mae 0.104830 -[2024/06/24 07:26:22] ppsci INFO: train: epoch 1804 | step 20 | lr 0.000455 | loss 0.025056 | mae 0.112541 -[2024/06/24 07:26:22] ppsci INFO: train: epoch 1804 | step 30 | lr 0.000455 | loss 0.023849 | mae 0.118652 -[2024/06/24 07:26:23] ppsci INFO: train: epoch 1804 | step 38 | lr 0.000455 | loss 0.016818 | mae 0.092994 -[2024/06/24 07:26:23] ppsci INFO: epoch: 1804, train_loss: 0.019583, train_metric: 0.104802, eval_loss: 0.042723, eval_mae: 0.145602 -[2024/06/24 07:26:23] ppsci INFO: train: epoch 1805 | step 0 | lr 0.000455 | loss 0.014885 | mae 0.090191 -[2024/06/24 07:26:24] ppsci INFO: train: epoch 1805 | step 10 | lr 0.000455 | loss 0.024515 | mae 0.116991 -[2024/06/24 07:26:24] ppsci INFO: train: epoch 1805 | step 20 | lr 0.000455 | loss 0.024647 | mae 0.119416 -[2024/06/24 07:26:25] ppsci INFO: train: epoch 1805 | step 30 | lr 0.000455 | loss 0.017620 | mae 0.103367 -[2024/06/24 07:26:25] ppsci INFO: train: epoch 1805 | step 38 | lr 0.000455 | loss 0.005697 | mae 0.064495 -[2024/06/24 07:26:25] ppsci INFO: epoch: 1805, train_loss: 0.019155, train_metric: 0.103576, eval_loss: 0.042102, eval_mae: 0.141060 -[2024/06/24 07:26:25] ppsci INFO: train: epoch 1806 | step 0 | lr 0.000456 | loss 0.022660 | mae 0.110750 -[2024/06/24 07:26:26] ppsci INFO: train: epoch 1806 | step 10 | lr 0.000456 | loss 0.020928 | mae 0.110269 -[2024/06/24 07:26:26] ppsci INFO: train: epoch 1806 | step 20 | lr 0.000456 | loss 0.019271 | mae 0.108804 -[2024/06/24 07:26:27] ppsci INFO: train: epoch 1806 | step 30 | lr 0.000456 | loss 0.019284 | mae 0.108817 -[2024/06/24 07:26:27] ppsci INFO: train: epoch 1806 | step 38 | lr 0.000456 | loss 0.011249 | mae 0.089532 -[2024/06/24 07:26:27] ppsci INFO: epoch: 1806, train_loss: 0.021405, train_metric: 0.107443, eval_loss: 0.039825, eval_mae: 0.141338 -[2024/06/24 07:26:27] ppsci INFO: train: epoch 1807 | step 0 | lr 0.000456 | loss 0.021586 | mae 0.113173 -[2024/06/24 07:26:28] ppsci INFO: train: epoch 1807 | step 10 | lr 0.000456 | loss 0.018930 | mae 0.109044 -[2024/06/24 07:26:28] ppsci INFO: train: epoch 1807 | step 20 | lr 0.000456 | loss 0.019285 | mae 0.104326 -[2024/06/24 07:26:29] ppsci INFO: train: epoch 1807 | step 30 | lr 0.000456 | loss 0.021127 | mae 0.111879 -[2024/06/24 07:26:29] ppsci INFO: train: epoch 1807 | step 38 | lr 0.000456 | loss 0.011277 | mae 0.093788 -[2024/06/24 07:26:29] ppsci INFO: epoch: 1807, train_loss: 0.019312, train_metric: 0.105243, eval_loss: 0.040996, eval_mae: 0.143094 -[2024/06/24 07:26:29] ppsci INFO: train: epoch 1808 | step 0 | lr 0.000457 | loss 0.018726 | mae 0.102417 -[2024/06/24 07:26:30] ppsci INFO: train: epoch 1808 | step 10 | lr 0.000457 | loss 0.022642 | mae 0.110134 -[2024/06/24 07:26:30] ppsci INFO: train: epoch 1808 | step 20 | lr 0.000457 | loss 0.022476 | mae 0.115354 -[2024/06/24 07:26:31] ppsci INFO: train: epoch 1808 | step 30 | lr 0.000457 | loss 0.018091 | mae 0.102467 -[2024/06/24 07:26:31] ppsci INFO: train: epoch 1808 | step 38 | lr 0.000457 | loss 0.041420 | mae 0.159041 -[2024/06/24 07:26:31] ppsci INFO: epoch: 1808, train_loss: 0.021787, train_metric: 0.107120, eval_loss: 0.040947, eval_mae: 0.141657 -[2024/06/24 07:26:31] ppsci INFO: train: epoch 1809 | step 0 | lr 0.000457 | loss 0.017105 | mae 0.093447 -[2024/06/24 07:26:32] ppsci INFO: train: epoch 1809 | step 10 | lr 0.000457 | loss 0.024113 | mae 0.114251 -[2024/06/24 07:26:33] ppsci INFO: train: epoch 1809 | step 20 | lr 0.000457 | loss 0.020885 | mae 0.110100 -[2024/06/24 07:26:33] ppsci INFO: train: epoch 1809 | step 30 | lr 0.000457 | loss 0.020852 | mae 0.113410 -[2024/06/24 07:26:33] ppsci INFO: train: epoch 1809 | step 38 | lr 0.000457 | loss 0.036051 | mae 0.170568 -[2024/06/24 07:26:33] ppsci INFO: epoch: 1809, train_loss: 0.020704, train_metric: 0.105909, eval_loss: 0.049683, eval_mae: 0.147862 -[2024/06/24 07:26:34] ppsci INFO: train: epoch 1810 | step 0 | lr 0.000458 | loss 0.018491 | mae 0.099780 -[2024/06/24 07:26:34] ppsci INFO: train: epoch 1810 | step 10 | lr 0.000458 | loss 0.019009 | mae 0.105155 -[2024/06/24 07:26:35] ppsci INFO: train: epoch 1810 | step 20 | lr 0.000458 | loss 0.021825 | mae 0.113841 -[2024/06/24 07:26:35] ppsci INFO: train: epoch 1810 | step 30 | lr 0.000458 | loss 0.020435 | mae 0.102708 -[2024/06/24 07:26:35] ppsci INFO: train: epoch 1810 | step 38 | lr 0.000458 | loss 0.016445 | mae 0.104129 -[2024/06/24 07:26:36] ppsci INFO: epoch: 1810, train_loss: 0.020234, train_metric: 0.106014, eval_loss: 0.047959, eval_mae: 0.149478 -[2024/06/24 07:26:36] ppsci INFO: train: epoch 1811 | step 0 | lr 0.000458 | loss 0.020007 | mae 0.107463 -[2024/06/24 07:26:36] ppsci INFO: train: epoch 1811 | step 10 | lr 0.000458 | loss 0.014429 | mae 0.097170 -[2024/06/24 07:26:37] ppsci INFO: train: epoch 1811 | step 20 | lr 0.000458 | loss 0.022781 | mae 0.112382 -[2024/06/24 07:26:37] ppsci INFO: train: epoch 1811 | step 30 | lr 0.000458 | loss 0.026421 | mae 0.119350 -[2024/06/24 07:26:38] ppsci INFO: train: epoch 1811 | step 38 | lr 0.000458 | loss 0.020046 | mae 0.115207 -[2024/06/24 07:26:38] ppsci INFO: epoch: 1811, train_loss: 0.020345, train_metric: 0.105581, eval_loss: 0.047171, eval_mae: 0.146131 -[2024/06/24 07:26:38] ppsci INFO: train: epoch 1812 | step 0 | lr 0.000458 | loss 0.018229 | mae 0.104875 -[2024/06/24 07:26:39] ppsci INFO: train: epoch 1812 | step 10 | lr 0.000458 | loss 0.016538 | mae 0.102623 -[2024/06/24 07:26:39] ppsci INFO: train: epoch 1812 | step 20 | lr 0.000458 | loss 0.014250 | mae 0.095056 -[2024/06/24 07:26:40] ppsci INFO: train: epoch 1812 | step 30 | lr 0.000458 | loss 0.018864 | mae 0.101558 -[2024/06/24 07:26:40] ppsci INFO: train: epoch 1812 | step 38 | lr 0.000458 | loss 0.011950 | mae 0.087816 -[2024/06/24 07:26:40] ppsci INFO: epoch: 1812, train_loss: 0.019186, train_metric: 0.104457, eval_loss: 0.043516, eval_mae: 0.143358 -[2024/06/24 07:26:40] ppsci INFO: train: epoch 1813 | step 0 | lr 0.000459 | loss 0.019532 | mae 0.109474 -[2024/06/24 07:26:41] ppsci INFO: train: epoch 1813 | step 10 | lr 0.000459 | loss 0.022703 | mae 0.112781 -[2024/06/24 07:26:41] ppsci INFO: train: epoch 1813 | step 20 | lr 0.000459 | loss 0.020527 | mae 0.108070 -[2024/06/24 07:26:42] ppsci INFO: train: epoch 1813 | step 30 | lr 0.000459 | loss 0.024030 | mae 0.113148 -[2024/06/24 07:26:42] ppsci INFO: train: epoch 1813 | step 38 | lr 0.000459 | loss 0.028882 | mae 0.123019 -[2024/06/24 07:26:42] ppsci INFO: epoch: 1813, train_loss: 0.020035, train_metric: 0.105039, eval_loss: 0.039059, eval_mae: 0.141770 -[2024/06/24 07:26:42] ppsci INFO: train: epoch 1814 | step 0 | lr 0.000459 | loss 0.027322 | mae 0.127677 -[2024/06/24 07:26:43] ppsci INFO: train: epoch 1814 | step 10 | lr 0.000459 | loss 0.025545 | mae 0.123371 -[2024/06/24 07:26:43] ppsci INFO: train: epoch 1814 | step 20 | lr 0.000459 | loss 0.026655 | mae 0.117695 -[2024/06/24 07:26:44] ppsci INFO: train: epoch 1814 | step 30 | lr 0.000459 | loss 0.024420 | mae 0.110476 -[2024/06/24 07:26:44] ppsci INFO: train: epoch 1814 | step 38 | lr 0.000459 | loss 0.027442 | mae 0.132271 -[2024/06/24 07:26:44] ppsci INFO: epoch: 1814, train_loss: 0.022022, train_metric: 0.109241, eval_loss: 0.039874, eval_mae: 0.143822 -[2024/06/24 07:26:44] ppsci INFO: train: epoch 1815 | step 0 | lr 0.000460 | loss 0.015767 | mae 0.094477 -[2024/06/24 07:26:45] ppsci INFO: train: epoch 1815 | step 10 | lr 0.000460 | loss 0.017111 | mae 0.101532 -[2024/06/24 07:26:46] ppsci INFO: train: epoch 1815 | step 20 | lr 0.000460 | loss 0.026408 | mae 0.104471 -[2024/06/24 07:26:46] ppsci INFO: train: epoch 1815 | step 30 | lr 0.000460 | loss 0.021616 | mae 0.111117 -[2024/06/24 07:26:47] ppsci INFO: train: epoch 1815 | step 38 | lr 0.000460 | loss 0.011892 | mae 0.085942 -[2024/06/24 07:26:47] ppsci INFO: epoch: 1815, train_loss: 0.021659, train_metric: 0.108332, eval_loss: 0.041148, eval_mae: 0.138785 -[2024/06/24 07:26:47] ppsci INFO: train: epoch 1816 | step 0 | lr 0.000460 | loss 0.020485 | mae 0.109532 -[2024/06/24 07:26:47] ppsci INFO: train: epoch 1816 | step 10 | lr 0.000460 | loss 0.022953 | mae 0.110776 -[2024/06/24 07:26:48] ppsci INFO: train: epoch 1816 | step 20 | lr 0.000460 | loss 0.019417 | mae 0.108155 -[2024/06/24 07:26:48] ppsci INFO: train: epoch 1816 | step 30 | lr 0.000460 | loss 0.018874 | mae 0.105479 -[2024/06/24 07:26:49] ppsci INFO: train: epoch 1816 | step 38 | lr 0.000460 | loss 0.069246 | mae 0.152897 -[2024/06/24 07:26:49] ppsci INFO: epoch: 1816, train_loss: 0.022480, train_metric: 0.108489, eval_loss: 0.044294, eval_mae: 0.144740 -[2024/06/24 07:26:49] ppsci INFO: train: epoch 1817 | step 0 | lr 0.000461 | loss 0.024683 | mae 0.117693 -[2024/06/24 07:26:50] ppsci INFO: train: epoch 1817 | step 10 | lr 0.000461 | loss 0.017652 | mae 0.095587 -[2024/06/24 07:26:50] ppsci INFO: train: epoch 1817 | step 20 | lr 0.000461 | loss 0.019562 | mae 0.105166 -[2024/06/24 07:26:51] ppsci INFO: train: epoch 1817 | step 30 | lr 0.000461 | loss 0.013500 | mae 0.091653 -[2024/06/24 07:26:51] ppsci INFO: train: epoch 1817 | step 38 | lr 0.000461 | loss 0.020311 | mae 0.115743 -[2024/06/24 07:26:51] ppsci INFO: epoch: 1817, train_loss: 0.021127, train_metric: 0.106683, eval_loss: 0.046228, eval_mae: 0.145211 -[2024/06/24 07:26:51] ppsci INFO: train: epoch 1818 | step 0 | lr 0.000461 | loss 0.016945 | mae 0.096842 -[2024/06/24 07:26:52] ppsci INFO: train: epoch 1818 | step 10 | lr 0.000461 | loss 0.020880 | mae 0.116157 -[2024/06/24 07:26:52] ppsci INFO: train: epoch 1818 | step 20 | lr 0.000461 | loss 0.027269 | mae 0.114914 -[2024/06/24 07:26:53] ppsci INFO: train: epoch 1818 | step 30 | lr 0.000461 | loss 0.021386 | mae 0.114119 -[2024/06/24 07:26:53] ppsci INFO: train: epoch 1818 | step 38 | lr 0.000461 | loss 0.021805 | mae 0.106187 -[2024/06/24 07:26:53] ppsci INFO: epoch: 1818, train_loss: 0.020891, train_metric: 0.106867, eval_loss: 0.046202, eval_mae: 0.140899 -[2024/06/24 07:26:53] ppsci INFO: train: epoch 1819 | step 0 | lr 0.000461 | loss 0.016827 | mae 0.099906 -[2024/06/24 07:26:54] ppsci INFO: train: epoch 1819 | step 10 | lr 0.000461 | loss 0.024603 | mae 0.114803 -[2024/06/24 07:26:54] ppsci INFO: train: epoch 1819 | step 20 | lr 0.000461 | loss 0.020378 | mae 0.110376 -[2024/06/24 07:26:55] ppsci INFO: train: epoch 1819 | step 30 | lr 0.000461 | loss 0.019943 | mae 0.114273 -[2024/06/24 07:26:55] ppsci INFO: train: epoch 1819 | step 38 | lr 0.000461 | loss 0.018494 | mae 0.110530 -[2024/06/24 07:26:55] ppsci INFO: epoch: 1819, train_loss: 0.020874, train_metric: 0.107727, eval_loss: 0.043876, eval_mae: 0.148538 -[2024/06/24 07:26:55] ppsci INFO: train: epoch 1820 | step 0 | lr 0.000462 | loss 0.019907 | mae 0.102696 -[2024/06/24 07:26:56] ppsci INFO: train: epoch 1820 | step 10 | lr 0.000462 | loss 0.021762 | mae 0.107150 -[2024/06/24 07:26:56] ppsci INFO: train: epoch 1820 | step 20 | lr 0.000462 | loss 0.026511 | mae 0.111178 -[2024/06/24 07:26:57] ppsci INFO: train: epoch 1820 | step 30 | lr 0.000462 | loss 0.021519 | mae 0.108924 -[2024/06/24 07:26:57] ppsci INFO: train: epoch 1820 | step 38 | lr 0.000462 | loss 0.015483 | mae 0.087259 -[2024/06/24 07:26:57] ppsci INFO: epoch: 1820, train_loss: 0.022450, train_metric: 0.108251, eval_loss: 0.038046, eval_mae: 0.143671 -[2024/06/24 07:26:58] ppsci INFO: train: epoch 1821 | step 0 | lr 0.000462 | loss 0.017490 | mae 0.099415 -[2024/06/24 07:26:58] ppsci INFO: train: epoch 1821 | step 10 | lr 0.000462 | loss 0.018736 | mae 0.099984 -[2024/06/24 07:26:59] ppsci INFO: train: epoch 1821 | step 20 | lr 0.000462 | loss 0.022868 | mae 0.113871 -[2024/06/24 07:26:59] ppsci INFO: train: epoch 1821 | step 30 | lr 0.000462 | loss 0.015745 | mae 0.095581 -[2024/06/24 07:26:59] ppsci INFO: train: epoch 1821 | step 38 | lr 0.000462 | loss 0.042450 | mae 0.135486 -[2024/06/24 07:27:00] ppsci INFO: epoch: 1821, train_loss: 0.020170, train_metric: 0.106249, eval_loss: 0.043576, eval_mae: 0.146476 -[2024/06/24 07:27:00] ppsci INFO: train: epoch 1822 | step 0 | lr 0.000463 | loss 0.019046 | mae 0.106782 -[2024/06/24 07:27:00] ppsci INFO: train: epoch 1822 | step 10 | lr 0.000463 | loss 0.023188 | mae 0.112098 -[2024/06/24 07:27:01] ppsci INFO: train: epoch 1822 | step 20 | lr 0.000463 | loss 0.019027 | mae 0.110242 -[2024/06/24 07:27:01] ppsci INFO: train: epoch 1822 | step 30 | lr 0.000463 | loss 0.017615 | mae 0.099519 -[2024/06/24 07:27:02] ppsci INFO: train: epoch 1822 | step 38 | lr 0.000463 | loss 0.014403 | mae 0.106231 -[2024/06/24 07:27:02] ppsci INFO: epoch: 1822, train_loss: 0.022587, train_metric: 0.107564, eval_loss: 0.043369, eval_mae: 0.143956 -[2024/06/24 07:27:02] ppsci INFO: train: epoch 1823 | step 0 | lr 0.000463 | loss 0.024925 | mae 0.110077 -[2024/06/24 07:27:02] ppsci INFO: train: epoch 1823 | step 10 | lr 0.000463 | loss 0.026147 | mae 0.120222 -[2024/06/24 07:27:03] ppsci INFO: train: epoch 1823 | step 20 | lr 0.000463 | loss 0.023774 | mae 0.110160 -[2024/06/24 07:27:04] ppsci INFO: train: epoch 1823 | step 30 | lr 0.000463 | loss 0.020314 | mae 0.106265 -[2024/06/24 07:27:04] ppsci INFO: train: epoch 1823 | step 38 | lr 0.000463 | loss 0.016088 | mae 0.107522 -[2024/06/24 07:27:04] ppsci INFO: epoch: 1823, train_loss: 0.021071, train_metric: 0.107398, eval_loss: 0.041823, eval_mae: 0.144471 -[2024/06/24 07:27:04] ppsci INFO: train: epoch 1824 | step 0 | lr 0.000463 | loss 0.021787 | mae 0.111000 -[2024/06/24 07:27:05] ppsci INFO: train: epoch 1824 | step 10 | lr 0.000463 | loss 0.020580 | mae 0.109668 -[2024/06/24 07:27:05] ppsci INFO: train: epoch 1824 | step 20 | lr 0.000463 | loss 0.022462 | mae 0.116004 -[2024/06/24 07:27:06] ppsci INFO: train: epoch 1824 | step 30 | lr 0.000463 | loss 0.024444 | mae 0.116510 -[2024/06/24 07:27:06] ppsci INFO: train: epoch 1824 | step 38 | lr 0.000463 | loss 0.030283 | mae 0.138086 -[2024/06/24 07:27:06] ppsci INFO: epoch: 1824, train_loss: 0.020306, train_metric: 0.104650, eval_loss: 0.041235, eval_mae: 0.144322 -[2024/06/24 07:27:06] ppsci INFO: train: epoch 1825 | step 0 | lr 0.000464 | loss 0.019115 | mae 0.103576 -[2024/06/24 07:27:07] ppsci INFO: train: epoch 1825 | step 10 | lr 0.000464 | loss 0.016891 | mae 0.098541 -[2024/06/24 07:27:07] ppsci INFO: train: epoch 1825 | step 20 | lr 0.000464 | loss 0.019179 | mae 0.110038 -[2024/06/24 07:27:08] ppsci INFO: train: epoch 1825 | step 30 | lr 0.000464 | loss 0.016179 | mae 0.095921 -[2024/06/24 07:27:08] ppsci INFO: train: epoch 1825 | step 38 | lr 0.000464 | loss 0.016640 | mae 0.094525 -[2024/06/24 07:27:08] ppsci INFO: epoch: 1825, train_loss: 0.020061, train_metric: 0.105910, eval_loss: 0.040973, eval_mae: 0.139233 -[2024/06/24 07:27:08] ppsci INFO: train: epoch 1826 | step 0 | lr 0.000464 | loss 0.014422 | mae 0.092802 -[2024/06/24 07:27:09] ppsci INFO: train: epoch 1826 | step 10 | lr 0.000464 | loss 0.019368 | mae 0.101958 -[2024/06/24 07:27:10] ppsci INFO: train: epoch 1826 | step 20 | lr 0.000464 | loss 0.016625 | mae 0.098136 -[2024/06/24 07:27:10] ppsci INFO: train: epoch 1826 | step 30 | lr 0.000464 | loss 0.020660 | mae 0.103958 -[2024/06/24 07:27:10] ppsci INFO: train: epoch 1826 | step 38 | lr 0.000464 | loss 0.027535 | mae 0.133222 -[2024/06/24 07:27:11] ppsci INFO: epoch: 1826, train_loss: 0.019792, train_metric: 0.102240, eval_loss: 0.043642, eval_mae: 0.142614 -[2024/06/24 07:27:11] ppsci INFO: train: epoch 1827 | step 0 | lr 0.000465 | loss 0.015677 | mae 0.095440 -[2024/06/24 07:27:11] ppsci INFO: train: epoch 1827 | step 10 | lr 0.000465 | loss 0.020572 | mae 0.106708 -[2024/06/24 07:27:12] ppsci INFO: train: epoch 1827 | step 20 | lr 0.000465 | loss 0.017007 | mae 0.100805 -[2024/06/24 07:27:12] ppsci INFO: train: epoch 1827 | step 30 | lr 0.000465 | loss 0.014889 | mae 0.094001 -[2024/06/24 07:27:13] ppsci INFO: train: epoch 1827 | step 38 | lr 0.000465 | loss 0.015860 | mae 0.091432 -[2024/06/24 07:27:13] ppsci INFO: epoch: 1827, train_loss: 0.019498, train_metric: 0.104328, eval_loss: 0.046699, eval_mae: 0.144864 -[2024/06/24 07:27:13] ppsci INFO: train: epoch 1828 | step 0 | lr 0.000465 | loss 0.017968 | mae 0.102599 -[2024/06/24 07:27:13] ppsci INFO: train: epoch 1828 | step 10 | lr 0.000465 | loss 0.021650 | mae 0.108308 -[2024/06/24 07:27:14] ppsci INFO: train: epoch 1828 | step 20 | lr 0.000465 | loss 0.017370 | mae 0.103908 -[2024/06/24 07:27:14] ppsci INFO: train: epoch 1828 | step 30 | lr 0.000465 | loss 0.021277 | mae 0.111576 -[2024/06/24 07:27:15] ppsci INFO: train: epoch 1828 | step 38 | lr 0.000465 | loss 0.008673 | mae 0.077910 -[2024/06/24 07:27:15] ppsci INFO: epoch: 1828, train_loss: 0.020595, train_metric: 0.106992, eval_loss: 0.041115, eval_mae: 0.144374 -[2024/06/24 07:27:15] ppsci INFO: train: epoch 1829 | step 0 | lr 0.000465 | loss 0.015270 | mae 0.092289 -[2024/06/24 07:27:16] ppsci INFO: train: epoch 1829 | step 10 | lr 0.000465 | loss 0.014598 | mae 0.093666 -[2024/06/24 07:27:16] ppsci INFO: train: epoch 1829 | step 20 | lr 0.000465 | loss 0.019596 | mae 0.100202 -[2024/06/24 07:27:17] ppsci INFO: train: epoch 1829 | step 30 | lr 0.000465 | loss 0.036257 | mae 0.127688 -[2024/06/24 07:27:17] ppsci INFO: train: epoch 1829 | step 38 | lr 0.000465 | loss 0.014772 | mae 0.090095 -[2024/06/24 07:27:17] ppsci INFO: epoch: 1829, train_loss: 0.019592, train_metric: 0.103661, eval_loss: 0.039788, eval_mae: 0.142290 -[2024/06/24 07:27:17] ppsci INFO: train: epoch 1830 | step 0 | lr 0.000466 | loss 0.024273 | mae 0.114217 -[2024/06/24 07:27:18] ppsci INFO: train: epoch 1830 | step 10 | lr 0.000466 | loss 0.029151 | mae 0.124770 -[2024/06/24 07:27:18] ppsci INFO: train: epoch 1830 | step 20 | lr 0.000466 | loss 0.016646 | mae 0.095311 -[2024/06/24 07:27:19] ppsci INFO: train: epoch 1830 | step 30 | lr 0.000466 | loss 0.025368 | mae 0.113006 -[2024/06/24 07:27:19] ppsci INFO: train: epoch 1830 | step 38 | lr 0.000466 | loss 0.050741 | mae 0.172113 -[2024/06/24 07:27:19] ppsci INFO: epoch: 1830, train_loss: 0.021865, train_metric: 0.108571, eval_loss: 0.042352, eval_mae: 0.145665 -[2024/06/24 07:27:19] ppsci INFO: train: epoch 1831 | step 0 | lr 0.000466 | loss 0.019043 | mae 0.104227 -[2024/06/24 07:27:20] ppsci INFO: train: epoch 1831 | step 10 | lr 0.000466 | loss 0.025623 | mae 0.112900 -[2024/06/24 07:27:21] ppsci INFO: train: epoch 1831 | step 20 | lr 0.000466 | loss 0.023102 | mae 0.116204 -[2024/06/24 07:27:21] ppsci INFO: train: epoch 1831 | step 30 | lr 0.000466 | loss 0.022490 | mae 0.119105 -[2024/06/24 07:27:21] ppsci INFO: train: epoch 1831 | step 38 | lr 0.000466 | loss 0.010154 | mae 0.079259 -[2024/06/24 07:27:22] ppsci INFO: epoch: 1831, train_loss: 0.022058, train_metric: 0.109058, eval_loss: 0.039328, eval_mae: 0.140577 -[2024/06/24 07:27:22] ppsci INFO: train: epoch 1832 | step 0 | lr 0.000467 | loss 0.020595 | mae 0.108867 -[2024/06/24 07:27:22] ppsci INFO: train: epoch 1832 | step 10 | lr 0.000467 | loss 0.019103 | mae 0.106893 -[2024/06/24 07:27:23] ppsci INFO: train: epoch 1832 | step 20 | lr 0.000467 | loss 0.015403 | mae 0.096865 -[2024/06/24 07:27:23] ppsci INFO: train: epoch 1832 | step 30 | lr 0.000467 | loss 0.017827 | mae 0.110825 -[2024/06/24 07:27:24] ppsci INFO: train: epoch 1832 | step 38 | lr 0.000467 | loss 0.022230 | mae 0.126232 -[2024/06/24 07:27:24] ppsci INFO: epoch: 1832, train_loss: 0.021771, train_metric: 0.107590, eval_loss: 0.039636, eval_mae: 0.139992 -[2024/06/24 07:27:24] ppsci INFO: train: epoch 1833 | step 0 | lr 0.000467 | loss 0.015614 | mae 0.094273 -[2024/06/24 07:27:24] ppsci INFO: train: epoch 1833 | step 10 | lr 0.000467 | loss 0.023674 | mae 0.112404 -[2024/06/24 07:27:25] ppsci INFO: train: epoch 1833 | step 20 | lr 0.000467 | loss 0.020378 | mae 0.104954 -[2024/06/24 07:27:25] ppsci INFO: train: epoch 1833 | step 30 | lr 0.000467 | loss 0.019692 | mae 0.102023 -[2024/06/24 07:27:26] ppsci INFO: train: epoch 1833 | step 38 | lr 0.000467 | loss 0.016610 | mae 0.099803 -[2024/06/24 07:27:26] ppsci INFO: epoch: 1833, train_loss: 0.021410, train_metric: 0.107375, eval_loss: 0.036696, eval_mae: 0.138430 -[2024/06/24 07:27:26] ppsci INFO: train: epoch 1834 | step 0 | lr 0.000467 | loss 0.016376 | mae 0.100037 -[2024/06/24 07:27:27] ppsci INFO: train: epoch 1834 | step 10 | lr 0.000467 | loss 0.014127 | mae 0.089727 -[2024/06/24 07:27:27] ppsci INFO: train: epoch 1834 | step 20 | lr 0.000467 | loss 0.018451 | mae 0.111058 -[2024/06/24 07:27:28] ppsci INFO: train: epoch 1834 | step 30 | lr 0.000467 | loss 0.019951 | mae 0.100135 -[2024/06/24 07:27:28] ppsci INFO: train: epoch 1834 | step 38 | lr 0.000467 | loss 0.008145 | mae 0.079253 -[2024/06/24 07:27:28] ppsci INFO: epoch: 1834, train_loss: 0.019709, train_metric: 0.104969, eval_loss: 0.040708, eval_mae: 0.140811 -[2024/06/24 07:27:28] ppsci INFO: train: epoch 1835 | step 0 | lr 0.000468 | loss 0.015814 | mae 0.094041 -[2024/06/24 07:27:29] ppsci INFO: train: epoch 1835 | step 10 | lr 0.000468 | loss 0.016132 | mae 0.096331 -[2024/06/24 07:27:29] ppsci INFO: train: epoch 1835 | step 20 | lr 0.000468 | loss 0.019829 | mae 0.105799 -[2024/06/24 07:27:30] ppsci INFO: train: epoch 1835 | step 30 | lr 0.000468 | loss 0.014390 | mae 0.092478 -[2024/06/24 07:27:30] ppsci INFO: train: epoch 1835 | step 38 | lr 0.000468 | loss 0.020455 | mae 0.117397 -[2024/06/24 07:27:30] ppsci INFO: epoch: 1835, train_loss: 0.018817, train_metric: 0.101741, eval_loss: 0.041372, eval_mae: 0.142140 -[2024/06/24 07:27:30] ppsci INFO: train: epoch 1836 | step 0 | lr 0.000468 | loss 0.018898 | mae 0.104746 -[2024/06/24 07:27:31] ppsci INFO: train: epoch 1836 | step 10 | lr 0.000468 | loss 0.018480 | mae 0.109300 -[2024/06/24 07:27:31] ppsci INFO: train: epoch 1836 | step 20 | lr 0.000468 | loss 0.031532 | mae 0.110702 -[2024/06/24 07:27:32] ppsci INFO: train: epoch 1836 | step 30 | lr 0.000468 | loss 0.025513 | mae 0.120484 -[2024/06/24 07:27:32] ppsci INFO: train: epoch 1836 | step 38 | lr 0.000468 | loss 0.020860 | mae 0.120153 -[2024/06/24 07:27:32] ppsci INFO: epoch: 1836, train_loss: 0.021832, train_metric: 0.107529, eval_loss: 0.040015, eval_mae: 0.144334 -[2024/06/24 07:27:32] ppsci INFO: train: epoch 1837 | step 0 | lr 0.000469 | loss 0.016839 | mae 0.100275 -[2024/06/24 07:27:33] ppsci INFO: train: epoch 1837 | step 10 | lr 0.000469 | loss 0.030653 | mae 0.135826 -[2024/06/24 07:27:33] ppsci INFO: train: epoch 1837 | step 20 | lr 0.000469 | loss 0.024410 | mae 0.116031 -[2024/06/24 07:27:34] ppsci INFO: train: epoch 1837 | step 30 | lr 0.000469 | loss 0.031093 | mae 0.118415 -[2024/06/24 07:27:34] ppsci INFO: train: epoch 1837 | step 38 | lr 0.000469 | loss 0.031862 | mae 0.129233 -[2024/06/24 07:27:34] ppsci INFO: epoch: 1837, train_loss: 0.026742, train_metric: 0.118035, eval_loss: 0.045201, eval_mae: 0.142279 -[2024/06/24 07:27:34] ppsci INFO: train: epoch 1838 | step 0 | lr 0.000469 | loss 0.022363 | mae 0.114650 -[2024/06/24 07:27:35] ppsci INFO: train: epoch 1838 | step 10 | lr 0.000469 | loss 0.018593 | mae 0.105129 -[2024/06/24 07:27:36] ppsci INFO: train: epoch 1838 | step 20 | lr 0.000469 | loss 0.021765 | mae 0.106768 -[2024/06/24 07:27:36] ppsci INFO: train: epoch 1838 | step 30 | lr 0.000469 | loss 0.020538 | mae 0.109770 -[2024/06/24 07:27:36] ppsci INFO: train: epoch 1838 | step 38 | lr 0.000469 | loss 0.007188 | mae 0.071752 -[2024/06/24 07:27:37] ppsci INFO: epoch: 1838, train_loss: 0.022080, train_metric: 0.110352, eval_loss: 0.041303, eval_mae: 0.142783 -[2024/06/24 07:27:37] ppsci INFO: train: epoch 1839 | step 0 | lr 0.000469 | loss 0.027028 | mae 0.110271 -[2024/06/24 07:27:37] ppsci INFO: train: epoch 1839 | step 10 | lr 0.000469 | loss 0.022282 | mae 0.112357 -[2024/06/24 07:27:38] ppsci INFO: train: epoch 1839 | step 20 | lr 0.000469 | loss 0.021586 | mae 0.113782 -[2024/06/24 07:27:38] ppsci INFO: train: epoch 1839 | step 30 | lr 0.000469 | loss 0.013674 | mae 0.089394 -[2024/06/24 07:27:39] ppsci INFO: train: epoch 1839 | step 38 | lr 0.000469 | loss 0.012983 | mae 0.079097 -[2024/06/24 07:27:39] ppsci INFO: epoch: 1839, train_loss: 0.021493, train_metric: 0.106659, eval_loss: 0.039706, eval_mae: 0.140826 -[2024/06/24 07:27:39] ppsci INFO: train: epoch 1840 | step 0 | lr 0.000470 | loss 0.024941 | mae 0.116661 -[2024/06/24 07:27:39] ppsci INFO: train: epoch 1840 | step 10 | lr 0.000470 | loss 0.039093 | mae 0.117967 -[2024/06/24 07:27:40] ppsci INFO: train: epoch 1840 | step 20 | lr 0.000470 | loss 0.031414 | mae 0.119765 -[2024/06/24 07:27:41] ppsci INFO: train: epoch 1840 | step 30 | lr 0.000470 | loss 0.015661 | mae 0.095607 -[2024/06/24 07:27:41] ppsci INFO: train: epoch 1840 | step 38 | lr 0.000470 | loss 0.009226 | mae 0.083867 -[2024/06/24 07:27:41] ppsci INFO: epoch: 1840, train_loss: 0.022031, train_metric: 0.108529, eval_loss: 0.041941, eval_mae: 0.146706 -[2024/06/24 07:27:41] ppsci INFO: train: epoch 1841 | step 0 | lr 0.000470 | loss 0.020545 | mae 0.105872 -[2024/06/24 07:27:42] ppsci INFO: train: epoch 1841 | step 10 | lr 0.000470 | loss 0.057972 | mae 0.145044 -[2024/06/24 07:27:42] ppsci INFO: train: epoch 1841 | step 20 | lr 0.000470 | loss 0.024911 | mae 0.108244 -[2024/06/24 07:27:43] ppsci INFO: train: epoch 1841 | step 30 | lr 0.000470 | loss 0.018309 | mae 0.099857 -[2024/06/24 07:27:43] ppsci INFO: train: epoch 1841 | step 38 | lr 0.000470 | loss 0.030201 | mae 0.105628 -[2024/06/24 07:27:43] ppsci INFO: epoch: 1841, train_loss: 0.024772, train_metric: 0.112726, eval_loss: 0.044902, eval_mae: 0.144411 -[2024/06/24 07:27:43] ppsci INFO: train: epoch 1842 | step 0 | lr 0.000470 | loss 0.018459 | mae 0.100802 -[2024/06/24 07:27:44] ppsci INFO: train: epoch 1842 | step 10 | lr 0.000470 | loss 0.017080 | mae 0.098207 -[2024/06/24 07:27:44] ppsci INFO: train: epoch 1842 | step 20 | lr 0.000470 | loss 0.022465 | mae 0.102936 -[2024/06/24 07:27:45] ppsci INFO: train: epoch 1842 | step 30 | lr 0.000470 | loss 0.045795 | mae 0.119753 -[2024/06/24 07:27:45] ppsci INFO: train: epoch 1842 | step 38 | lr 0.000470 | loss 0.008065 | mae 0.072210 -[2024/06/24 07:27:45] ppsci INFO: epoch: 1842, train_loss: 0.021202, train_metric: 0.106910, eval_loss: 0.044667, eval_mae: 0.146318 -[2024/06/24 07:27:45] ppsci INFO: train: epoch 1843 | step 0 | lr 0.000471 | loss 0.016612 | mae 0.095883 -[2024/06/24 07:27:46] ppsci INFO: train: epoch 1843 | step 10 | lr 0.000471 | loss 0.014847 | mae 0.089806 -[2024/06/24 07:27:46] ppsci INFO: train: epoch 1843 | step 20 | lr 0.000471 | loss 0.012998 | mae 0.086666 -[2024/06/24 07:27:47] ppsci INFO: train: epoch 1843 | step 30 | lr 0.000471 | loss 0.017321 | mae 0.095483 -[2024/06/24 07:27:47] ppsci INFO: train: epoch 1843 | step 38 | lr 0.000471 | loss 0.012035 | mae 0.083505 -[2024/06/24 07:27:47] ppsci INFO: epoch: 1843, train_loss: 0.020285, train_metric: 0.104180, eval_loss: 0.045786, eval_mae: 0.147753 -[2024/06/24 07:27:47] ppsci INFO: train: epoch 1844 | step 0 | lr 0.000471 | loss 0.019802 | mae 0.108571 -[2024/06/24 07:27:48] ppsci INFO: train: epoch 1844 | step 10 | lr 0.000471 | loss 0.021516 | mae 0.103242 -[2024/06/24 07:27:49] ppsci INFO: train: epoch 1844 | step 20 | lr 0.000471 | loss 0.019918 | mae 0.110261 -[2024/06/24 07:27:49] ppsci INFO: train: epoch 1844 | step 30 | lr 0.000471 | loss 0.020402 | mae 0.111327 -[2024/06/24 07:27:49] ppsci INFO: train: epoch 1844 | step 38 | lr 0.000471 | loss 0.017853 | mae 0.100650 -[2024/06/24 07:27:50] ppsci INFO: epoch: 1844, train_loss: 0.020253, train_metric: 0.106846, eval_loss: 0.044103, eval_mae: 0.146912 -[2024/06/24 07:27:50] ppsci INFO: train: epoch 1845 | step 0 | lr 0.000472 | loss 0.018713 | mae 0.103623 -[2024/06/24 07:27:50] ppsci INFO: train: epoch 1845 | step 10 | lr 0.000472 | loss 0.020521 | mae 0.104826 -[2024/06/24 07:27:51] ppsci INFO: train: epoch 1845 | step 20 | lr 0.000472 | loss 0.019885 | mae 0.110731 -[2024/06/24 07:27:51] ppsci INFO: train: epoch 1845 | step 30 | lr 0.000472 | loss 0.016084 | mae 0.096114 -[2024/06/24 07:27:52] ppsci INFO: train: epoch 1845 | step 38 | lr 0.000472 | loss 0.006183 | mae 0.065275 -[2024/06/24 07:27:52] ppsci INFO: epoch: 1845, train_loss: 0.020266, train_metric: 0.106050, eval_loss: 0.039135, eval_mae: 0.139759 -[2024/06/24 07:27:52] ppsci INFO: train: epoch 1846 | step 0 | lr 0.000472 | loss 0.014701 | mae 0.092690 -[2024/06/24 07:27:53] ppsci INFO: train: epoch 1846 | step 10 | lr 0.000472 | loss 0.021204 | mae 0.105856 -[2024/06/24 07:27:53] ppsci INFO: train: epoch 1846 | step 20 | lr 0.000472 | loss 0.020522 | mae 0.098582 -[2024/06/24 07:27:54] ppsci INFO: train: epoch 1846 | step 30 | lr 0.000472 | loss 0.021974 | mae 0.098860 -[2024/06/24 07:27:54] ppsci INFO: train: epoch 1846 | step 38 | lr 0.000472 | loss 0.052299 | mae 0.173058 -[2024/06/24 07:27:54] ppsci INFO: epoch: 1846, train_loss: 0.020622, train_metric: 0.105106, eval_loss: 0.040125, eval_mae: 0.140330 -[2024/06/24 07:27:54] ppsci INFO: train: epoch 1847 | step 0 | lr 0.000472 | loss 0.017390 | mae 0.098464 -[2024/06/24 07:27:55] ppsci INFO: train: epoch 1847 | step 10 | lr 0.000472 | loss 0.020320 | mae 0.109535 -[2024/06/24 07:27:55] ppsci INFO: train: epoch 1847 | step 20 | lr 0.000472 | loss 0.024244 | mae 0.119782 -[2024/06/24 07:27:56] ppsci INFO: train: epoch 1847 | step 30 | lr 0.000472 | loss 0.027975 | mae 0.118537 -[2024/06/24 07:27:56] ppsci INFO: train: epoch 1847 | step 38 | lr 0.000472 | loss 0.005664 | mae 0.048870 -[2024/06/24 07:27:56] ppsci INFO: epoch: 1847, train_loss: 0.021123, train_metric: 0.108129, eval_loss: 0.044272, eval_mae: 0.142525 -[2024/06/24 07:27:57] ppsci INFO: train: epoch 1848 | step 0 | lr 0.000473 | loss 0.018972 | mae 0.103689 -[2024/06/24 07:27:57] ppsci INFO: train: epoch 1848 | step 10 | lr 0.000473 | loss 0.030494 | mae 0.118068 -[2024/06/24 07:27:58] ppsci INFO: train: epoch 1848 | step 20 | lr 0.000473 | loss 0.022714 | mae 0.116794 -[2024/06/24 07:27:58] ppsci INFO: train: epoch 1848 | step 30 | lr 0.000473 | loss 0.015798 | mae 0.093925 -[2024/06/24 07:27:59] ppsci INFO: train: epoch 1848 | step 38 | lr 0.000473 | loss 0.019849 | mae 0.112572 -[2024/06/24 07:27:59] ppsci INFO: epoch: 1848, train_loss: 0.019935, train_metric: 0.104992, eval_loss: 0.041693, eval_mae: 0.143993 -[2024/06/24 07:27:59] ppsci INFO: train: epoch 1849 | step 0 | lr 0.000473 | loss 0.020302 | mae 0.108064 -[2024/06/24 07:28:00] ppsci INFO: train: epoch 1849 | step 10 | lr 0.000473 | loss 0.021994 | mae 0.110135 -[2024/06/24 07:28:00] ppsci INFO: train: epoch 1849 | step 20 | lr 0.000473 | loss 0.016544 | mae 0.102206 -[2024/06/24 07:28:01] ppsci INFO: train: epoch 1849 | step 30 | lr 0.000473 | loss 0.023908 | mae 0.107164 -[2024/06/24 07:28:01] ppsci INFO: train: epoch 1849 | step 38 | lr 0.000473 | loss 0.029169 | mae 0.141094 -[2024/06/24 07:28:01] ppsci INFO: epoch: 1849, train_loss: 0.020417, train_metric: 0.104641, eval_loss: 0.042079, eval_mae: 0.143569 -[2024/06/24 07:28:01] ppsci INFO: train: epoch 1850 | step 0 | lr 0.000473 | loss 0.017750 | mae 0.098815 -[2024/06/24 07:28:02] ppsci INFO: train: epoch 1850 | step 10 | lr 0.000473 | loss 0.031265 | mae 0.123747 -[2024/06/24 07:28:02] ppsci INFO: train: epoch 1850 | step 20 | lr 0.000473 | loss 0.024865 | mae 0.116822 -[2024/06/24 07:28:03] ppsci INFO: train: epoch 1850 | step 30 | lr 0.000473 | loss 0.025868 | mae 0.122612 -[2024/06/24 07:28:03] ppsci INFO: train: epoch 1850 | step 38 | lr 0.000473 | loss 0.020860 | mae 0.106707 -[2024/06/24 07:28:03] ppsci INFO: epoch: 1850, train_loss: 0.020756, train_metric: 0.107280, eval_loss: 0.039486, eval_mae: 0.141225 -[2024/06/24 07:28:03] ppsci INFO: train: epoch 1851 | step 0 | lr 0.000474 | loss 0.022194 | mae 0.115898 -[2024/06/24 07:28:04] ppsci INFO: train: epoch 1851 | step 10 | lr 0.000474 | loss 0.018076 | mae 0.100830 -[2024/06/24 07:28:05] ppsci INFO: train: epoch 1851 | step 20 | lr 0.000474 | loss 0.023499 | mae 0.110985 -[2024/06/24 07:28:05] ppsci INFO: train: epoch 1851 | step 30 | lr 0.000474 | loss 0.014041 | mae 0.089722 -[2024/06/24 07:28:06] ppsci INFO: train: epoch 1851 | step 38 | lr 0.000474 | loss 0.017778 | mae 0.101871 -[2024/06/24 07:28:06] ppsci INFO: epoch: 1851, train_loss: 0.021575, train_metric: 0.107290, eval_loss: 0.042908, eval_mae: 0.146141 -[2024/06/24 07:28:06] ppsci INFO: train: epoch 1852 | step 0 | lr 0.000474 | loss 0.144733 | mae 0.130479 -[2024/06/24 07:28:06] ppsci INFO: train: epoch 1852 | step 10 | lr 0.000474 | loss 0.025422 | mae 0.114194 -[2024/06/24 07:28:07] ppsci INFO: train: epoch 1852 | step 20 | lr 0.000474 | loss 0.018800 | mae 0.105070 -[2024/06/24 07:28:07] ppsci INFO: train: epoch 1852 | step 30 | lr 0.000474 | loss 0.027502 | mae 0.116400 -[2024/06/24 07:28:08] ppsci INFO: train: epoch 1852 | step 38 | lr 0.000474 | loss 0.022783 | mae 0.123985 -[2024/06/24 07:28:08] ppsci INFO: epoch: 1852, train_loss: 0.028730, train_metric: 0.117799, eval_loss: 0.044322, eval_mae: 0.144416 -[2024/06/24 07:28:08] ppsci INFO: train: epoch 1853 | step 0 | lr 0.000474 | loss 0.033720 | mae 0.127410 -[2024/06/24 07:28:08] ppsci INFO: train: epoch 1853 | step 10 | lr 0.000474 | loss 0.021006 | mae 0.107835 -[2024/06/24 07:28:09] ppsci INFO: train: epoch 1853 | step 20 | lr 0.000474 | loss 0.023702 | mae 0.115004 -[2024/06/24 07:28:09] ppsci INFO: train: epoch 1853 | step 30 | lr 0.000474 | loss 0.017418 | mae 0.104682 -[2024/06/24 07:28:10] ppsci INFO: train: epoch 1853 | step 38 | lr 0.000474 | loss 0.014004 | mae 0.091939 -[2024/06/24 07:28:10] ppsci INFO: epoch: 1853, train_loss: 0.021275, train_metric: 0.107981, eval_loss: 0.048416, eval_mae: 0.149428 -[2024/06/24 07:28:10] ppsci INFO: train: epoch 1854 | step 0 | lr 0.000475 | loss 0.022405 | mae 0.109749 -[2024/06/24 07:28:11] ppsci INFO: train: epoch 1854 | step 10 | lr 0.000475 | loss 0.023493 | mae 0.110991 -[2024/06/24 07:28:11] ppsci INFO: train: epoch 1854 | step 20 | lr 0.000475 | loss 0.023035 | mae 0.108386 -[2024/06/24 07:28:12] ppsci INFO: train: epoch 1854 | step 30 | lr 0.000475 | loss 0.015259 | mae 0.096840 -[2024/06/24 07:28:12] ppsci INFO: train: epoch 1854 | step 38 | lr 0.000475 | loss 0.014880 | mae 0.094197 -[2024/06/24 07:28:12] ppsci INFO: epoch: 1854, train_loss: 0.020287, train_metric: 0.105864, eval_loss: 0.041333, eval_mae: 0.145626 -[2024/06/24 07:28:12] ppsci INFO: train: epoch 1855 | step 0 | lr 0.000475 | loss 0.020234 | mae 0.107811 -[2024/06/24 07:28:13] ppsci INFO: train: epoch 1855 | step 10 | lr 0.000475 | loss 0.020221 | mae 0.104053 -[2024/06/24 07:28:13] ppsci INFO: train: epoch 1855 | step 20 | lr 0.000475 | loss 0.017646 | mae 0.105075 -[2024/06/24 07:28:14] ppsci INFO: train: epoch 1855 | step 30 | lr 0.000475 | loss 0.020746 | mae 0.112504 -[2024/06/24 07:28:14] ppsci INFO: train: epoch 1855 | step 38 | lr 0.000475 | loss 0.023593 | mae 0.116043 -[2024/06/24 07:28:14] ppsci INFO: epoch: 1855, train_loss: 0.022236, train_metric: 0.109050, eval_loss: 0.042984, eval_mae: 0.144825 -[2024/06/24 07:28:14] ppsci INFO: train: epoch 1856 | step 0 | lr 0.000475 | loss 0.040048 | mae 0.128736 -[2024/06/24 07:28:15] ppsci INFO: train: epoch 1856 | step 10 | lr 0.000475 | loss 0.022927 | mae 0.115571 -[2024/06/24 07:28:16] ppsci INFO: train: epoch 1856 | step 20 | lr 0.000475 | loss 0.020174 | mae 0.100867 -[2024/06/24 07:28:16] ppsci INFO: train: epoch 1856 | step 30 | lr 0.000475 | loss 0.017245 | mae 0.104141 -[2024/06/24 07:28:16] ppsci INFO: train: epoch 1856 | step 38 | lr 0.000475 | loss 0.019079 | mae 0.117883 -[2024/06/24 07:28:17] ppsci INFO: epoch: 1856, train_loss: 0.021854, train_metric: 0.109472, eval_loss: 0.038891, eval_mae: 0.142690 -[2024/06/24 07:28:17] ppsci INFO: train: epoch 1857 | step 0 | lr 0.000476 | loss 0.021202 | mae 0.112854 -[2024/06/24 07:28:17] ppsci INFO: train: epoch 1857 | step 10 | lr 0.000476 | loss 0.022622 | mae 0.104949 -[2024/06/24 07:28:18] ppsci INFO: train: epoch 1857 | step 20 | lr 0.000476 | loss 0.027723 | mae 0.117507 -[2024/06/24 07:28:18] ppsci INFO: train: epoch 1857 | step 30 | lr 0.000476 | loss 0.025919 | mae 0.114928 -[2024/06/24 07:28:19] ppsci INFO: train: epoch 1857 | step 38 | lr 0.000476 | loss 0.012829 | mae 0.095889 -[2024/06/24 07:28:19] ppsci INFO: epoch: 1857, train_loss: 0.020815, train_metric: 0.105968, eval_loss: 0.047349, eval_mae: 0.142383 -[2024/06/24 07:28:19] ppsci INFO: train: epoch 1858 | step 0 | lr 0.000476 | loss 0.022505 | mae 0.118199 -[2024/06/24 07:28:19] ppsci INFO: train: epoch 1858 | step 10 | lr 0.000476 | loss 0.019158 | mae 0.097455 -[2024/06/24 07:28:20] ppsci INFO: train: epoch 1858 | step 20 | lr 0.000476 | loss 0.018837 | mae 0.095752 -[2024/06/24 07:28:21] ppsci INFO: train: epoch 1858 | step 30 | lr 0.000476 | loss 0.025432 | mae 0.118374 -[2024/06/24 07:28:21] ppsci INFO: train: epoch 1858 | step 38 | lr 0.000476 | loss 0.018877 | mae 0.103134 -[2024/06/24 07:28:21] ppsci INFO: epoch: 1858, train_loss: 0.019545, train_metric: 0.104591, eval_loss: 0.041055, eval_mae: 0.140227 -[2024/06/24 07:28:21] ppsci INFO: train: epoch 1859 | step 0 | lr 0.000476 | loss 0.020044 | mae 0.111993 -[2024/06/24 07:28:22] ppsci INFO: train: epoch 1859 | step 10 | lr 0.000476 | loss 0.022032 | mae 0.111250 -[2024/06/24 07:28:22] ppsci INFO: train: epoch 1859 | step 20 | lr 0.000476 | loss 0.022104 | mae 0.110242 -[2024/06/24 07:28:23] ppsci INFO: train: epoch 1859 | step 30 | lr 0.000476 | loss 0.013222 | mae 0.089403 -[2024/06/24 07:28:23] ppsci INFO: train: epoch 1859 | step 38 | lr 0.000476 | loss 0.018947 | mae 0.121892 -[2024/06/24 07:28:23] ppsci INFO: epoch: 1859, train_loss: 0.019726, train_metric: 0.104898, eval_loss: 0.043084, eval_mae: 0.142985 -[2024/06/24 07:28:23] ppsci INFO: train: epoch 1860 | step 0 | lr 0.000477 | loss 0.031378 | mae 0.108864 -[2024/06/24 07:28:24] ppsci INFO: train: epoch 1860 | step 10 | lr 0.000477 | loss 0.019064 | mae 0.105455 -[2024/06/24 07:28:25] ppsci INFO: train: epoch 1860 | step 20 | lr 0.000477 | loss 0.016768 | mae 0.095193 -[2024/06/24 07:28:25] ppsci INFO: train: epoch 1860 | step 30 | lr 0.000477 | loss 0.029688 | mae 0.131003 -[2024/06/24 07:28:25] ppsci INFO: train: epoch 1860 | step 38 | lr 0.000477 | loss 0.025510 | mae 0.126093 -[2024/06/24 07:28:25] ppsci INFO: epoch: 1860, train_loss: 0.021362, train_metric: 0.106924, eval_loss: 0.037885, eval_mae: 0.138837 -[2024/06/24 07:28:26] ppsci INFO: train: epoch 1861 | step 0 | lr 0.000477 | loss 0.021135 | mae 0.106149 -[2024/06/24 07:28:26] ppsci INFO: train: epoch 1861 | step 10 | lr 0.000477 | loss 0.021983 | mae 0.115208 -[2024/06/24 07:28:27] ppsci INFO: train: epoch 1861 | step 20 | lr 0.000477 | loss 0.021616 | mae 0.108666 -[2024/06/24 07:28:27] ppsci INFO: train: epoch 1861 | step 30 | lr 0.000477 | loss 0.022961 | mae 0.106491 -[2024/06/24 07:28:27] ppsci INFO: train: epoch 1861 | step 38 | lr 0.000477 | loss 0.012205 | mae 0.086774 -[2024/06/24 07:28:28] ppsci INFO: epoch: 1861, train_loss: 0.020045, train_metric: 0.105817, eval_loss: 0.042186, eval_mae: 0.138253 -[2024/06/24 07:28:28] ppsci INFO: train: epoch 1862 | step 0 | lr 0.000477 | loss 0.020917 | mae 0.112295 -[2024/06/24 07:28:28] ppsci INFO: train: epoch 1862 | step 10 | lr 0.000477 | loss 0.026103 | mae 0.122258 -[2024/06/24 07:28:29] ppsci INFO: train: epoch 1862 | step 20 | lr 0.000477 | loss 0.023287 | mae 0.118880 -[2024/06/24 07:28:29] ppsci INFO: train: epoch 1862 | step 30 | lr 0.000477 | loss 0.019376 | mae 0.106196 -[2024/06/24 07:28:30] ppsci INFO: train: epoch 1862 | step 38 | lr 0.000477 | loss 0.014138 | mae 0.092051 -[2024/06/24 07:28:30] ppsci INFO: epoch: 1862, train_loss: 0.021096, train_metric: 0.108068, eval_loss: 0.046703, eval_mae: 0.144504 -[2024/06/24 07:28:30] ppsci INFO: train: epoch 1863 | step 0 | lr 0.000478 | loss 0.028357 | mae 0.114911 -[2024/06/24 07:28:30] ppsci INFO: train: epoch 1863 | step 10 | lr 0.000478 | loss 0.023459 | mae 0.107604 -[2024/06/24 07:28:31] ppsci INFO: train: epoch 1863 | step 20 | lr 0.000478 | loss 0.016210 | mae 0.098127 -[2024/06/24 07:28:31] ppsci INFO: train: epoch 1863 | step 30 | lr 0.000478 | loss 0.015902 | mae 0.095156 -[2024/06/24 07:28:32] ppsci INFO: train: epoch 1863 | step 38 | lr 0.000478 | loss 0.010214 | mae 0.079269 -[2024/06/24 07:28:32] ppsci INFO: epoch: 1863, train_loss: 0.019533, train_metric: 0.104993, eval_loss: 0.040918, eval_mae: 0.142419 -[2024/06/24 07:28:32] ppsci INFO: train: epoch 1864 | step 0 | lr 0.000478 | loss 0.025755 | mae 0.115891 -[2024/06/24 07:28:32] ppsci INFO: train: epoch 1864 | step 10 | lr 0.000478 | loss 0.015108 | mae 0.097809 -[2024/06/24 07:28:33] ppsci INFO: train: epoch 1864 | step 20 | lr 0.000478 | loss 0.019251 | mae 0.103706 -[2024/06/24 07:28:33] ppsci INFO: train: epoch 1864 | step 30 | lr 0.000478 | loss 0.017732 | mae 0.100530 -[2024/06/24 07:28:34] ppsci INFO: train: epoch 1864 | step 38 | lr 0.000478 | loss 0.033312 | mae 0.144995 -[2024/06/24 07:28:34] ppsci INFO: epoch: 1864, train_loss: 0.021003, train_metric: 0.105591, eval_loss: 0.045749, eval_mae: 0.143293 -[2024/06/24 07:28:34] ppsci INFO: train: epoch 1865 | step 0 | lr 0.000478 | loss 0.015824 | mae 0.093729 -[2024/06/24 07:28:35] ppsci INFO: train: epoch 1865 | step 10 | lr 0.000478 | loss 0.017636 | mae 0.100401 -[2024/06/24 07:28:35] ppsci INFO: train: epoch 1865 | step 20 | lr 0.000478 | loss 0.018318 | mae 0.104768 -[2024/06/24 07:28:36] ppsci INFO: train: epoch 1865 | step 30 | lr 0.000478 | loss 0.022719 | mae 0.116423 -[2024/06/24 07:28:36] ppsci INFO: train: epoch 1865 | step 38 | lr 0.000478 | loss 0.033016 | mae 0.161488 -[2024/06/24 07:28:36] ppsci INFO: epoch: 1865, train_loss: 0.020103, train_metric: 0.105179, eval_loss: 0.042567, eval_mae: 0.141136 -[2024/06/24 07:28:36] ppsci INFO: train: epoch 1866 | step 0 | lr 0.000479 | loss 0.016232 | mae 0.096506 -[2024/06/24 07:28:37] ppsci INFO: train: epoch 1866 | step 10 | lr 0.000479 | loss 0.029156 | mae 0.124788 -[2024/06/24 07:28:37] ppsci INFO: train: epoch 1866 | step 20 | lr 0.000479 | loss 0.014923 | mae 0.098547 -[2024/06/24 07:28:38] ppsci INFO: train: epoch 1866 | step 30 | lr 0.000479 | loss 0.018185 | mae 0.098523 -[2024/06/24 07:28:38] ppsci INFO: train: epoch 1866 | step 38 | lr 0.000479 | loss 0.006262 | mae 0.066660 -[2024/06/24 07:28:38] ppsci INFO: epoch: 1866, train_loss: 0.019259, train_metric: 0.104765, eval_loss: 0.040236, eval_mae: 0.140630 -[2024/06/24 07:28:38] ppsci INFO: train: epoch 1867 | step 0 | lr 0.000479 | loss 0.022597 | mae 0.109239 -[2024/06/24 07:28:39] ppsci INFO: train: epoch 1867 | step 10 | lr 0.000479 | loss 0.014903 | mae 0.095177 -[2024/06/24 07:28:39] ppsci INFO: train: epoch 1867 | step 20 | lr 0.000479 | loss 0.018675 | mae 0.102861 -[2024/06/24 07:28:40] ppsci INFO: train: epoch 1867 | step 30 | lr 0.000479 | loss 0.019121 | mae 0.100075 -[2024/06/24 07:28:40] ppsci INFO: train: epoch 1867 | step 38 | lr 0.000479 | loss 0.011807 | mae 0.084743 -[2024/06/24 07:28:40] ppsci INFO: epoch: 1867, train_loss: 0.018868, train_metric: 0.102354, eval_loss: 0.042237, eval_mae: 0.142082 -[2024/06/24 07:28:41] ppsci INFO: train: epoch 1868 | step 0 | lr 0.000479 | loss 0.020303 | mae 0.106545 -[2024/06/24 07:28:41] ppsci INFO: train: epoch 1868 | step 10 | lr 0.000479 | loss 0.018759 | mae 0.105249 -[2024/06/24 07:28:42] ppsci INFO: train: epoch 1868 | step 20 | lr 0.000479 | loss 0.019018 | mae 0.104572 -[2024/06/24 07:28:42] ppsci INFO: train: epoch 1868 | step 30 | lr 0.000479 | loss 0.022088 | mae 0.110955 -[2024/06/24 07:28:43] ppsci INFO: train: epoch 1868 | step 38 | lr 0.000479 | loss 0.007910 | mae 0.074047 -[2024/06/24 07:28:43] ppsci INFO: epoch: 1868, train_loss: 0.019276, train_metric: 0.103343, eval_loss: 0.046224, eval_mae: 0.143716 -[2024/06/24 07:28:43] ppsci INFO: train: epoch 1869 | step 0 | lr 0.000480 | loss 0.022857 | mae 0.110752 -[2024/06/24 07:28:43] ppsci INFO: train: epoch 1869 | step 10 | lr 0.000480 | loss 0.023329 | mae 0.106655 -[2024/06/24 07:28:44] ppsci INFO: train: epoch 1869 | step 20 | lr 0.000480 | loss 0.020358 | mae 0.101951 -[2024/06/24 07:28:44] ppsci INFO: train: epoch 1869 | step 30 | lr 0.000480 | loss 0.021711 | mae 0.111295 -[2024/06/24 07:28:45] ppsci INFO: train: epoch 1869 | step 38 | lr 0.000480 | loss 0.055166 | mae 0.138425 -[2024/06/24 07:28:45] ppsci INFO: epoch: 1869, train_loss: 0.022816, train_metric: 0.106280, eval_loss: 0.050039, eval_mae: 0.143441 -[2024/06/24 07:28:45] ppsci INFO: train: epoch 1870 | step 0 | lr 0.000480 | loss 0.024586 | mae 0.114964 -[2024/06/24 07:28:46] ppsci INFO: train: epoch 1870 | step 10 | lr 0.000480 | loss 0.017591 | mae 0.098681 -[2024/06/24 07:28:46] ppsci INFO: train: epoch 1870 | step 20 | lr 0.000480 | loss 0.024574 | mae 0.113397 -[2024/06/24 07:28:47] ppsci INFO: train: epoch 1870 | step 30 | lr 0.000480 | loss 0.021238 | mae 0.110796 -[2024/06/24 07:28:47] ppsci INFO: train: epoch 1870 | step 38 | lr 0.000480 | loss 0.020036 | mae 0.092308 -[2024/06/24 07:28:47] ppsci INFO: epoch: 1870, train_loss: 0.019825, train_metric: 0.105617, eval_loss: 0.038966, eval_mae: 0.139180 -[2024/06/24 07:28:47] ppsci INFO: train: epoch 1871 | step 0 | lr 0.000480 | loss 0.013893 | mae 0.088799 -[2024/06/24 07:28:48] ppsci INFO: train: epoch 1871 | step 10 | lr 0.000480 | loss 0.015533 | mae 0.093989 -[2024/06/24 07:28:48] ppsci INFO: train: epoch 1871 | step 20 | lr 0.000480 | loss 0.019238 | mae 0.096263 -[2024/06/24 07:28:49] ppsci INFO: train: epoch 1871 | step 30 | lr 0.000480 | loss 0.017804 | mae 0.098738 -[2024/06/24 07:28:49] ppsci INFO: train: epoch 1871 | step 38 | lr 0.000480 | loss 0.008345 | mae 0.071216 -[2024/06/24 07:28:49] ppsci INFO: epoch: 1871, train_loss: 0.020471, train_metric: 0.105159, eval_loss: 0.040119, eval_mae: 0.138919 -[2024/06/24 07:28:49] ppsci INFO: train: epoch 1872 | step 0 | lr 0.000480 | loss 0.017575 | mae 0.099955 -[2024/06/24 07:28:50] ppsci INFO: train: epoch 1872 | step 10 | lr 0.000480 | loss 0.022063 | mae 0.111135 -[2024/06/24 07:28:50] ppsci INFO: train: epoch 1872 | step 20 | lr 0.000480 | loss 0.023346 | mae 0.109876 -[2024/06/24 07:28:51] ppsci INFO: train: epoch 1872 | step 30 | lr 0.000480 | loss 0.015674 | mae 0.093456 -[2024/06/24 07:28:51] ppsci INFO: train: epoch 1872 | step 38 | lr 0.000480 | loss 0.012350 | mae 0.093551 -[2024/06/24 07:28:51] ppsci INFO: epoch: 1872, train_loss: 0.020897, train_metric: 0.106743, eval_loss: 0.038550, eval_mae: 0.143485 -[2024/06/24 07:28:51] ppsci INFO: train: epoch 1873 | step 0 | lr 0.000481 | loss 0.025145 | mae 0.114110 -[2024/06/24 07:28:52] ppsci INFO: train: epoch 1873 | step 10 | lr 0.000481 | loss 0.016991 | mae 0.099367 -[2024/06/24 07:28:53] ppsci INFO: train: epoch 1873 | step 20 | lr 0.000481 | loss 0.028941 | mae 0.113974 -[2024/06/24 07:28:53] ppsci INFO: train: epoch 1873 | step 30 | lr 0.000481 | loss 0.013931 | mae 0.087669 -[2024/06/24 07:28:54] ppsci INFO: train: epoch 1873 | step 38 | lr 0.000481 | loss 0.010711 | mae 0.076161 -[2024/06/24 07:28:54] ppsci INFO: epoch: 1873, train_loss: 0.020501, train_metric: 0.104473, eval_loss: 0.043791, eval_mae: 0.140999 -[2024/06/24 07:28:54] ppsci INFO: train: epoch 1874 | step 0 | lr 0.000481 | loss 0.018479 | mae 0.103525 -[2024/06/24 07:28:54] ppsci INFO: train: epoch 1874 | step 10 | lr 0.000481 | loss 0.026745 | mae 0.108126 -[2024/06/24 07:28:55] ppsci INFO: train: epoch 1874 | step 20 | lr 0.000481 | loss 0.018194 | mae 0.098132 -[2024/06/24 07:28:55] ppsci INFO: train: epoch 1874 | step 30 | lr 0.000481 | loss 0.013127 | mae 0.087446 -[2024/06/24 07:28:56] ppsci INFO: train: epoch 1874 | step 38 | lr 0.000481 | loss 0.039396 | mae 0.140845 -[2024/06/24 07:28:56] ppsci INFO: epoch: 1874, train_loss: 0.019721, train_metric: 0.101667, eval_loss: 0.043826, eval_mae: 0.142111 -[2024/06/24 07:28:56] ppsci INFO: train: epoch 1875 | step 0 | lr 0.000481 | loss 0.017192 | mae 0.098319 -[2024/06/24 07:28:57] ppsci INFO: train: epoch 1875 | step 10 | lr 0.000481 | loss 0.024403 | mae 0.114055 -[2024/06/24 07:28:57] ppsci INFO: train: epoch 1875 | step 20 | lr 0.000481 | loss 0.016227 | mae 0.094831 -[2024/06/24 07:28:58] ppsci INFO: train: epoch 1875 | step 30 | lr 0.000481 | loss 0.024860 | mae 0.115983 -[2024/06/24 07:28:58] ppsci INFO: train: epoch 1875 | step 38 | lr 0.000481 | loss 0.027144 | mae 0.110494 -[2024/06/24 07:28:58] ppsci INFO: epoch: 1875, train_loss: 0.021277, train_metric: 0.106965, eval_loss: 0.047812, eval_mae: 0.143975 -[2024/06/24 07:28:58] ppsci INFO: train: epoch 1876 | step 0 | lr 0.000482 | loss 0.018559 | mae 0.090688 -[2024/06/24 07:28:59] ppsci INFO: train: epoch 1876 | step 10 | lr 0.000482 | loss 0.017907 | mae 0.097909 -[2024/06/24 07:28:59] ppsci INFO: train: epoch 1876 | step 20 | lr 0.000482 | loss 0.019487 | mae 0.104966 -[2024/06/24 07:29:00] ppsci INFO: train: epoch 1876 | step 30 | lr 0.000482 | loss 0.015438 | mae 0.098993 -[2024/06/24 07:29:00] ppsci INFO: train: epoch 1876 | step 38 | lr 0.000482 | loss 0.030407 | mae 0.139365 -[2024/06/24 07:29:00] ppsci INFO: epoch: 1876, train_loss: 0.021090, train_metric: 0.103209, eval_loss: 0.038561, eval_mae: 0.145170 -[2024/06/24 07:29:01] ppsci INFO: train: epoch 1877 | step 0 | lr 0.000482 | loss 0.015042 | mae 0.093737 -[2024/06/24 07:29:01] ppsci INFO: train: epoch 1877 | step 10 | lr 0.000482 | loss 0.015157 | mae 0.095349 -[2024/06/24 07:29:02] ppsci INFO: train: epoch 1877 | step 20 | lr 0.000482 | loss 0.013112 | mae 0.087827 -[2024/06/24 07:29:02] ppsci INFO: train: epoch 1877 | step 30 | lr 0.000482 | loss 0.016354 | mae 0.096482 -[2024/06/24 07:29:03] ppsci INFO: train: epoch 1877 | step 38 | lr 0.000482 | loss 0.008961 | mae 0.075543 -[2024/06/24 07:29:03] ppsci INFO: epoch: 1877, train_loss: 0.018298, train_metric: 0.100633, eval_loss: 0.042285, eval_mae: 0.139381 -[2024/06/24 07:29:03] ppsci INFO: train: epoch 1878 | step 0 | lr 0.000482 | loss 0.017135 | mae 0.099979 -[2024/06/24 07:29:03] ppsci INFO: train: epoch 1878 | step 10 | lr 0.000482 | loss 0.019204 | mae 0.103681 -[2024/06/24 07:29:04] ppsci INFO: train: epoch 1878 | step 20 | lr 0.000482 | loss 0.018435 | mae 0.097065 -[2024/06/24 07:29:04] ppsci INFO: train: epoch 1878 | step 30 | lr 0.000482 | loss 0.024280 | mae 0.099631 -[2024/06/24 07:29:05] ppsci INFO: train: epoch 1878 | step 38 | lr 0.000482 | loss 0.029543 | mae 0.123177 -[2024/06/24 07:29:05] ppsci INFO: epoch: 1878, train_loss: 0.021121, train_metric: 0.104286, eval_loss: 0.045162, eval_mae: 0.144155 -[2024/06/24 07:29:05] ppsci INFO: train: epoch 1879 | step 0 | lr 0.000483 | loss 0.016596 | mae 0.101686 -[2024/06/24 07:29:05] ppsci INFO: train: epoch 1879 | step 10 | lr 0.000483 | loss 0.020019 | mae 0.102845 -[2024/06/24 07:29:06] ppsci INFO: train: epoch 1879 | step 20 | lr 0.000483 | loss 0.014432 | mae 0.094162 -[2024/06/24 07:29:06] ppsci INFO: train: epoch 1879 | step 30 | lr 0.000483 | loss 0.021482 | mae 0.110305 -[2024/06/24 07:29:06] ppsci INFO: train: epoch 1879 | step 38 | lr 0.000483 | loss 0.023321 | mae 0.121334 -[2024/06/24 07:29:07] ppsci INFO: epoch: 1879, train_loss: 0.020239, train_metric: 0.105365, eval_loss: 0.042673, eval_mae: 0.139806 -[2024/06/24 07:29:07] ppsci INFO: train: epoch 1880 | step 0 | lr 0.000483 | loss 0.027321 | mae 0.114960 -[2024/06/24 07:29:07] ppsci INFO: train: epoch 1880 | step 10 | lr 0.000483 | loss 0.019543 | mae 0.108039 -[2024/06/24 07:29:08] ppsci INFO: train: epoch 1880 | step 20 | lr 0.000483 | loss 0.019740 | mae 0.104115 -[2024/06/24 07:29:08] ppsci INFO: train: epoch 1880 | step 30 | lr 0.000483 | loss 0.018900 | mae 0.102239 -[2024/06/24 07:29:08] ppsci INFO: train: epoch 1880 | step 38 | lr 0.000483 | loss 0.039057 | mae 0.173786 -[2024/06/24 07:29:08] ppsci INFO: epoch: 1880, train_loss: 0.021753, train_metric: 0.105875, eval_loss: 0.037303, eval_mae: 0.140015 -[2024/06/24 07:29:09] ppsci INFO: train: epoch 1881 | step 0 | lr 0.000483 | loss 0.018078 | mae 0.098994 -[2024/06/24 07:29:09] ppsci INFO: train: epoch 1881 | step 10 | lr 0.000483 | loss 0.019003 | mae 0.109735 -[2024/06/24 07:29:10] ppsci INFO: train: epoch 1881 | step 20 | lr 0.000483 | loss 0.016762 | mae 0.102876 -[2024/06/24 07:29:10] ppsci INFO: train: epoch 1881 | step 30 | lr 0.000483 | loss 0.019878 | mae 0.109116 -[2024/06/24 07:29:10] ppsci INFO: train: epoch 1881 | step 38 | lr 0.000483 | loss 0.010853 | mae 0.085013 -[2024/06/24 07:29:11] ppsci INFO: epoch: 1881, train_loss: 0.019364, train_metric: 0.103718, eval_loss: 0.041170, eval_mae: 0.143745 -[2024/06/24 07:29:11] ppsci INFO: train: epoch 1882 | step 0 | lr 0.000483 | loss 0.028309 | mae 0.110907 -[2024/06/24 07:29:11] ppsci INFO: train: epoch 1882 | step 10 | lr 0.000483 | loss 0.015248 | mae 0.099374 -[2024/06/24 07:29:12] ppsci INFO: train: epoch 1882 | step 20 | lr 0.000483 | loss 0.021836 | mae 0.107210 -[2024/06/24 07:29:12] ppsci INFO: train: epoch 1882 | step 30 | lr 0.000483 | loss 0.020231 | mae 0.103787 -[2024/06/24 07:29:13] ppsci INFO: train: epoch 1882 | step 38 | lr 0.000483 | loss 0.005714 | mae 0.064583 -[2024/06/24 07:29:13] ppsci INFO: epoch: 1882, train_loss: 0.019019, train_metric: 0.102791, eval_loss: 0.039159, eval_mae: 0.140857 -[2024/06/24 07:29:13] ppsci INFO: train: epoch 1883 | step 0 | lr 0.000484 | loss 0.018807 | mae 0.106238 -[2024/06/24 07:29:13] ppsci INFO: train: epoch 1883 | step 10 | lr 0.000484 | loss 0.024656 | mae 0.111199 -[2024/06/24 07:29:14] ppsci INFO: train: epoch 1883 | step 20 | lr 0.000484 | loss 0.016313 | mae 0.099679 -[2024/06/24 07:29:14] ppsci INFO: train: epoch 1883 | step 30 | lr 0.000484 | loss 0.020569 | mae 0.108162 -[2024/06/24 07:29:15] ppsci INFO: train: epoch 1883 | step 38 | lr 0.000484 | loss 0.026977 | mae 0.121427 -[2024/06/24 07:29:15] ppsci INFO: epoch: 1883, train_loss: 0.020075, train_metric: 0.104781, eval_loss: 0.040995, eval_mae: 0.144767 -[2024/06/24 07:29:15] ppsci INFO: train: epoch 1884 | step 0 | lr 0.000484 | loss 0.016757 | mae 0.099963 -[2024/06/24 07:29:16] ppsci INFO: train: epoch 1884 | step 10 | lr 0.000484 | loss 0.017182 | mae 0.094603 -[2024/06/24 07:29:16] ppsci INFO: train: epoch 1884 | step 20 | lr 0.000484 | loss 0.016087 | mae 0.097431 -[2024/06/24 07:29:17] ppsci INFO: train: epoch 1884 | step 30 | lr 0.000484 | loss 0.022647 | mae 0.113049 -[2024/06/24 07:29:17] ppsci INFO: train: epoch 1884 | step 38 | lr 0.000484 | loss 0.025837 | mae 0.146589 -[2024/06/24 07:29:17] ppsci INFO: epoch: 1884, train_loss: 0.018763, train_metric: 0.101616, eval_loss: 0.037737, eval_mae: 0.141326 -[2024/06/24 07:29:17] ppsci INFO: train: epoch 1885 | step 0 | lr 0.000484 | loss 0.021948 | mae 0.110041 -[2024/06/24 07:29:18] ppsci INFO: train: epoch 1885 | step 10 | lr 0.000484 | loss 0.023458 | mae 0.113865 -[2024/06/24 07:29:18] ppsci INFO: train: epoch 1885 | step 20 | lr 0.000484 | loss 0.030700 | mae 0.125104 -[2024/06/24 07:29:19] ppsci INFO: train: epoch 1885 | step 30 | lr 0.000484 | loss 0.023494 | mae 0.116688 -[2024/06/24 07:29:19] ppsci INFO: train: epoch 1885 | step 38 | lr 0.000484 | loss 0.010780 | mae 0.077870 -[2024/06/24 07:29:19] ppsci INFO: epoch: 1885, train_loss: 0.019888, train_metric: 0.105362, eval_loss: 0.042822, eval_mae: 0.143822 -[2024/06/24 07:29:19] ppsci INFO: train: epoch 1886 | step 0 | lr 0.000484 | loss 0.017835 | mae 0.095904 -[2024/06/24 07:29:20] ppsci INFO: train: epoch 1886 | step 10 | lr 0.000484 | loss 0.019872 | mae 0.109914 -[2024/06/24 07:29:21] ppsci INFO: train: epoch 1886 | step 20 | lr 0.000484 | loss 0.018824 | mae 0.099719 -[2024/06/24 07:29:21] ppsci INFO: train: epoch 1886 | step 30 | lr 0.000484 | loss 0.014722 | mae 0.091729 -[2024/06/24 07:29:21] ppsci INFO: train: epoch 1886 | step 38 | lr 0.000484 | loss 0.005150 | mae 0.056322 -[2024/06/24 07:29:21] ppsci INFO: epoch: 1886, train_loss: 0.019718, train_metric: 0.105071, eval_loss: 0.040612, eval_mae: 0.142390 -[2024/06/24 07:29:22] ppsci INFO: train: epoch 1887 | step 0 | lr 0.000485 | loss 0.017637 | mae 0.101558 -[2024/06/24 07:29:22] ppsci INFO: train: epoch 1887 | step 10 | lr 0.000485 | loss 0.022281 | mae 0.116868 -[2024/06/24 07:29:23] ppsci INFO: train: epoch 1887 | step 20 | lr 0.000485 | loss 0.018919 | mae 0.102512 -[2024/06/24 07:29:23] ppsci INFO: train: epoch 1887 | step 30 | lr 0.000485 | loss 0.021043 | mae 0.108351 -[2024/06/24 07:29:23] ppsci INFO: train: epoch 1887 | step 38 | lr 0.000485 | loss 0.038511 | mae 0.138251 -[2024/06/24 07:29:24] ppsci INFO: epoch: 1887, train_loss: 0.019095, train_metric: 0.101962, eval_loss: 0.042275, eval_mae: 0.141974 -[2024/06/24 07:29:24] ppsci INFO: train: epoch 1888 | step 0 | lr 0.000485 | loss 0.017203 | mae 0.098233 -[2024/06/24 07:29:24] ppsci INFO: train: epoch 1888 | step 10 | lr 0.000485 | loss 0.017365 | mae 0.094914 -[2024/06/24 07:29:25] ppsci INFO: train: epoch 1888 | step 20 | lr 0.000485 | loss 0.018158 | mae 0.100995 -[2024/06/24 07:29:25] ppsci INFO: train: epoch 1888 | step 30 | lr 0.000485 | loss 0.015023 | mae 0.094383 -[2024/06/24 07:29:26] ppsci INFO: train: epoch 1888 | step 38 | lr 0.000485 | loss 0.010452 | mae 0.066336 -[2024/06/24 07:29:26] ppsci INFO: epoch: 1888, train_loss: 0.019225, train_metric: 0.103623, eval_loss: 0.039234, eval_mae: 0.141038 -[2024/06/24 07:29:26] ppsci INFO: train: epoch 1889 | step 0 | lr 0.000485 | loss 0.019472 | mae 0.103257 -[2024/06/24 07:29:27] ppsci INFO: train: epoch 1889 | step 10 | lr 0.000485 | loss 0.021489 | mae 0.103672 -[2024/06/24 07:29:27] ppsci INFO: train: epoch 1889 | step 20 | lr 0.000485 | loss 0.016058 | mae 0.096153 -[2024/06/24 07:29:28] ppsci INFO: train: epoch 1889 | step 30 | lr 0.000485 | loss 0.027079 | mae 0.118618 -[2024/06/24 07:29:28] ppsci INFO: train: epoch 1889 | step 38 | lr 0.000485 | loss 0.064120 | mae 0.146396 -[2024/06/24 07:29:28] ppsci INFO: epoch: 1889, train_loss: 0.020542, train_metric: 0.102164, eval_loss: 0.046006, eval_mae: 0.148017 -[2024/06/24 07:29:28] ppsci INFO: train: epoch 1890 | step 0 | lr 0.000486 | loss 0.021831 | mae 0.112874 -[2024/06/24 07:29:29] ppsci INFO: train: epoch 1890 | step 10 | lr 0.000486 | loss 0.022752 | mae 0.114509 -[2024/06/24 07:29:29] ppsci INFO: train: epoch 1890 | step 20 | lr 0.000486 | loss 0.017640 | mae 0.094958 -[2024/06/24 07:29:30] ppsci INFO: train: epoch 1890 | step 30 | lr 0.000486 | loss 0.015548 | mae 0.099121 -[2024/06/24 07:29:30] ppsci INFO: train: epoch 1890 | step 38 | lr 0.000486 | loss 0.052999 | mae 0.132282 -[2024/06/24 07:29:30] ppsci INFO: epoch: 1890, train_loss: 0.020693, train_metric: 0.104893, eval_loss: 0.046976, eval_mae: 0.142860 -[2024/06/24 07:29:30] ppsci INFO: train: epoch 1891 | step 0 | lr 0.000486 | loss 0.033656 | mae 0.116934 -[2024/06/24 07:29:31] ppsci INFO: train: epoch 1891 | step 10 | lr 0.000486 | loss 0.026937 | mae 0.115705 -[2024/06/24 07:29:31] ppsci INFO: train: epoch 1891 | step 20 | lr 0.000486 | loss 0.028733 | mae 0.108657 -[2024/06/24 07:29:32] ppsci INFO: train: epoch 1891 | step 30 | lr 0.000486 | loss 0.012016 | mae 0.086732 -[2024/06/24 07:29:32] ppsci INFO: train: epoch 1891 | step 38 | lr 0.000486 | loss 0.021228 | mae 0.109049 -[2024/06/24 07:29:32] ppsci INFO: epoch: 1891, train_loss: 0.021096, train_metric: 0.106714, eval_loss: 0.039021, eval_mae: 0.137564 -[2024/06/24 07:29:32] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:29:33] ppsci INFO: train: epoch 1892 | step 0 | lr 0.000486 | loss 0.020301 | mae 0.105025 -[2024/06/24 07:29:33] ppsci INFO: train: epoch 1892 | step 10 | lr 0.000486 | loss 0.016989 | mae 0.104618 -[2024/06/24 07:29:34] ppsci INFO: train: epoch 1892 | step 20 | lr 0.000486 | loss 0.018013 | mae 0.101957 -[2024/06/24 07:29:34] ppsci INFO: train: epoch 1892 | step 30 | lr 0.000486 | loss 0.020826 | mae 0.105433 -[2024/06/24 07:29:34] ppsci INFO: train: epoch 1892 | step 38 | lr 0.000486 | loss 0.027092 | mae 0.129553 -[2024/06/24 07:29:35] ppsci INFO: epoch: 1892, train_loss: 0.019739, train_metric: 0.101281, eval_loss: 0.041064, eval_mae: 0.141939 -[2024/06/24 07:29:35] ppsci INFO: train: epoch 1893 | step 0 | lr 0.000486 | loss 0.016194 | mae 0.098722 -[2024/06/24 07:29:35] ppsci INFO: train: epoch 1893 | step 10 | lr 0.000486 | loss 0.019739 | mae 0.110870 -[2024/06/24 07:29:36] ppsci INFO: train: epoch 1893 | step 20 | lr 0.000486 | loss 0.017974 | mae 0.099470 -[2024/06/24 07:29:36] ppsci INFO: train: epoch 1893 | step 30 | lr 0.000486 | loss 0.019642 | mae 0.103628 -[2024/06/24 07:29:37] ppsci INFO: train: epoch 1893 | step 38 | lr 0.000486 | loss 0.023254 | mae 0.134148 -[2024/06/24 07:29:37] ppsci INFO: epoch: 1893, train_loss: 0.020941, train_metric: 0.105195, eval_loss: 0.041759, eval_mae: 0.143860 -[2024/06/24 07:29:37] ppsci INFO: train: epoch 1894 | step 0 | lr 0.000487 | loss 0.016578 | mae 0.106123 -[2024/06/24 07:29:37] ppsci INFO: train: epoch 1894 | step 10 | lr 0.000487 | loss 0.040682 | mae 0.119322 -[2024/06/24 07:29:38] ppsci INFO: train: epoch 1894 | step 20 | lr 0.000487 | loss 0.025080 | mae 0.115193 -[2024/06/24 07:29:38] ppsci INFO: train: epoch 1894 | step 30 | lr 0.000487 | loss 0.025830 | mae 0.113165 -[2024/06/24 07:29:39] ppsci INFO: train: epoch 1894 | step 38 | lr 0.000487 | loss 0.026928 | mae 0.121945 -[2024/06/24 07:29:39] ppsci INFO: epoch: 1894, train_loss: 0.023331, train_metric: 0.110549, eval_loss: 0.043845, eval_mae: 0.140584 -[2024/06/24 07:29:39] ppsci INFO: train: epoch 1895 | step 0 | lr 0.000487 | loss 0.024714 | mae 0.120013 -[2024/06/24 07:29:40] ppsci INFO: train: epoch 1895 | step 10 | lr 0.000487 | loss 0.014742 | mae 0.093215 -[2024/06/24 07:29:40] ppsci INFO: train: epoch 1895 | step 20 | lr 0.000487 | loss 0.018871 | mae 0.103386 -[2024/06/24 07:29:41] ppsci INFO: train: epoch 1895 | step 30 | lr 0.000487 | loss 0.015008 | mae 0.094371 -[2024/06/24 07:29:41] ppsci INFO: train: epoch 1895 | step 38 | lr 0.000487 | loss 0.026131 | mae 0.116508 -[2024/06/24 07:29:41] ppsci INFO: epoch: 1895, train_loss: 0.020773, train_metric: 0.105174, eval_loss: 0.041361, eval_mae: 0.140786 -[2024/06/24 07:29:41] ppsci INFO: train: epoch 1896 | step 0 | lr 0.000487 | loss 0.012955 | mae 0.088719 -[2024/06/24 07:29:42] ppsci INFO: train: epoch 1896 | step 10 | lr 0.000487 | loss 0.020019 | mae 0.106838 -[2024/06/24 07:29:42] ppsci INFO: train: epoch 1896 | step 20 | lr 0.000487 | loss 0.023319 | mae 0.110160 -[2024/06/24 07:29:43] ppsci INFO: train: epoch 1896 | step 30 | lr 0.000487 | loss 0.028933 | mae 0.113772 -[2024/06/24 07:29:43] ppsci INFO: train: epoch 1896 | step 38 | lr 0.000487 | loss 0.017892 | mae 0.110942 -[2024/06/24 07:29:43] ppsci INFO: epoch: 1896, train_loss: 0.020117, train_metric: 0.104638, eval_loss: 0.040883, eval_mae: 0.140327 -[2024/06/24 07:29:43] ppsci INFO: train: epoch 1897 | step 0 | lr 0.000487 | loss 0.019787 | mae 0.103172 -[2024/06/24 07:29:44] ppsci INFO: train: epoch 1897 | step 10 | lr 0.000487 | loss 0.013718 | mae 0.089799 -[2024/06/24 07:29:45] ppsci INFO: train: epoch 1897 | step 20 | lr 0.000487 | loss 0.013126 | mae 0.086786 -[2024/06/24 07:29:45] ppsci INFO: train: epoch 1897 | step 30 | lr 0.000487 | loss 0.027190 | mae 0.118420 -[2024/06/24 07:29:46] ppsci INFO: train: epoch 1897 | step 38 | lr 0.000487 | loss 0.029192 | mae 0.106546 -[2024/06/24 07:29:46] ppsci INFO: epoch: 1897, train_loss: 0.019181, train_metric: 0.102239, eval_loss: 0.041411, eval_mae: 0.145023 -[2024/06/24 07:29:46] ppsci INFO: train: epoch 1898 | step 0 | lr 0.000488 | loss 0.022513 | mae 0.110169 -[2024/06/24 07:29:46] ppsci INFO: train: epoch 1898 | step 10 | lr 0.000488 | loss 0.023831 | mae 0.103280 -[2024/06/24 07:29:47] ppsci INFO: train: epoch 1898 | step 20 | lr 0.000488 | loss 0.015958 | mae 0.097041 -[2024/06/24 07:29:47] ppsci INFO: train: epoch 1898 | step 30 | lr 0.000488 | loss 0.022034 | mae 0.112240 -[2024/06/24 07:29:48] ppsci INFO: train: epoch 1898 | step 38 | lr 0.000488 | loss 0.028916 | mae 0.129920 -[2024/06/24 07:29:48] ppsci INFO: epoch: 1898, train_loss: 0.021564, train_metric: 0.107357, eval_loss: 0.046269, eval_mae: 0.149101 -[2024/06/24 07:29:48] ppsci INFO: train: epoch 1899 | step 0 | lr 0.000488 | loss 0.035602 | mae 0.122970 -[2024/06/24 07:29:48] ppsci INFO: train: epoch 1899 | step 10 | lr 0.000488 | loss 0.018570 | mae 0.099985 -[2024/06/24 07:29:49] ppsci INFO: train: epoch 1899 | step 20 | lr 0.000488 | loss 0.017235 | mae 0.099302 -[2024/06/24 07:29:49] ppsci INFO: train: epoch 1899 | step 30 | lr 0.000488 | loss 0.014953 | mae 0.095036 -[2024/06/24 07:29:50] ppsci INFO: train: epoch 1899 | step 38 | lr 0.000488 | loss 0.017066 | mae 0.098366 -[2024/06/24 07:29:50] ppsci INFO: epoch: 1899, train_loss: 0.020231, train_metric: 0.103463, eval_loss: 0.042228, eval_mae: 0.146233 -[2024/06/24 07:29:50] ppsci INFO: train: epoch 1900 | step 0 | lr 0.000488 | loss 0.015015 | mae 0.097102 -[2024/06/24 07:29:51] ppsci INFO: train: epoch 1900 | step 10 | lr 0.000488 | loss 0.022017 | mae 0.109128 -[2024/06/24 07:29:51] ppsci INFO: train: epoch 1900 | step 20 | lr 0.000488 | loss 0.022364 | mae 0.116387 -[2024/06/24 07:29:52] ppsci INFO: train: epoch 1900 | step 30 | lr 0.000488 | loss 0.031858 | mae 0.127645 -[2024/06/24 07:29:52] ppsci INFO: train: epoch 1900 | step 38 | lr 0.000488 | loss 0.025640 | mae 0.135857 -[2024/06/24 07:29:52] ppsci INFO: epoch: 1900, train_loss: 0.027381, train_metric: 0.114407, eval_loss: 0.087473, eval_mae: 0.174567 -[2024/06/24 07:29:52] ppsci INFO: train: epoch 1901 | step 0 | lr 0.000488 | loss 0.049336 | mae 0.164979 -[2024/06/24 07:29:53] ppsci INFO: train: epoch 1901 | step 10 | lr 0.000488 | loss 0.030165 | mae 0.131718 -[2024/06/24 07:29:53] ppsci INFO: train: epoch 1901 | step 20 | lr 0.000488 | loss 0.024351 | mae 0.114741 -[2024/06/24 07:29:54] ppsci INFO: train: epoch 1901 | step 30 | lr 0.000488 | loss 0.021407 | mae 0.113518 -[2024/06/24 07:29:54] ppsci INFO: train: epoch 1901 | step 38 | lr 0.000488 | loss 0.028595 | mae 0.149915 -[2024/06/24 07:29:55] ppsci INFO: epoch: 1901, train_loss: 0.037594, train_metric: 0.131740, eval_loss: 0.048528, eval_mae: 0.147183 -[2024/06/24 07:29:55] ppsci INFO: train: epoch 1902 | step 0 | lr 0.000488 | loss 0.015491 | mae 0.095106 -[2024/06/24 07:29:55] ppsci INFO: train: epoch 1902 | step 10 | lr 0.000488 | loss 0.022530 | mae 0.110832 -[2024/06/24 07:29:56] ppsci INFO: train: epoch 1902 | step 20 | lr 0.000488 | loss 0.021932 | mae 0.115277 -[2024/06/24 07:29:56] ppsci INFO: train: epoch 1902 | step 30 | lr 0.000488 | loss 0.019400 | mae 0.102555 -[2024/06/24 07:29:56] ppsci INFO: train: epoch 1902 | step 38 | lr 0.000488 | loss 0.031467 | mae 0.087776 -[2024/06/24 07:29:57] ppsci INFO: epoch: 1902, train_loss: 0.033928, train_metric: 0.113085, eval_loss: 0.041138, eval_mae: 0.143129 -[2024/06/24 07:29:57] ppsci INFO: train: epoch 1903 | step 0 | lr 0.000489 | loss 0.020185 | mae 0.102875 -[2024/06/24 07:29:57] ppsci INFO: train: epoch 1903 | step 10 | lr 0.000489 | loss 0.018660 | mae 0.106238 -[2024/06/24 07:29:58] ppsci INFO: train: epoch 1903 | step 20 | lr 0.000489 | loss 0.032914 | mae 0.118098 -[2024/06/24 07:29:58] ppsci INFO: train: epoch 1903 | step 30 | lr 0.000489 | loss 0.017631 | mae 0.099160 -[2024/06/24 07:29:59] ppsci INFO: train: epoch 1903 | step 38 | lr 0.000489 | loss 0.018383 | mae 0.113311 -[2024/06/24 07:29:59] ppsci INFO: epoch: 1903, train_loss: 0.032317, train_metric: 0.112143, eval_loss: 0.036652, eval_mae: 0.139695 -[2024/06/24 07:29:59] ppsci INFO: train: epoch 1904 | step 0 | lr 0.000489 | loss 0.012482 | mae 0.086709 -[2024/06/24 07:29:59] ppsci INFO: train: epoch 1904 | step 10 | lr 0.000489 | loss 0.021846 | mae 0.109738 -[2024/06/24 07:30:00] ppsci INFO: train: epoch 1904 | step 20 | lr 0.000489 | loss 0.016457 | mae 0.094446 -[2024/06/24 07:30:00] ppsci INFO: train: epoch 1904 | step 30 | lr 0.000489 | loss 0.018209 | mae 0.101043 -[2024/06/24 07:30:01] ppsci INFO: train: epoch 1904 | step 38 | lr 0.000489 | loss 0.013957 | mae 0.098528 -[2024/06/24 07:30:01] ppsci INFO: epoch: 1904, train_loss: 0.023253, train_metric: 0.105364, eval_loss: 0.045167, eval_mae: 0.147151 -[2024/06/24 07:30:01] ppsci INFO: train: epoch 1905 | step 0 | lr 0.000489 | loss 0.023707 | mae 0.109992 -[2024/06/24 07:30:02] ppsci INFO: train: epoch 1905 | step 10 | lr 0.000489 | loss 0.019745 | mae 0.101582 -[2024/06/24 07:30:02] ppsci INFO: train: epoch 1905 | step 20 | lr 0.000489 | loss 0.021778 | mae 0.104287 -[2024/06/24 07:30:03] ppsci INFO: train: epoch 1905 | step 30 | lr 0.000489 | loss 0.022998 | mae 0.117329 -[2024/06/24 07:30:03] ppsci INFO: train: epoch 1905 | step 38 | lr 0.000489 | loss 0.118377 | mae 0.235931 -[2024/06/24 07:30:03] ppsci INFO: epoch: 1905, train_loss: 0.025781, train_metric: 0.106256, eval_loss: 0.045135, eval_mae: 0.146174 -[2024/06/24 07:30:03] ppsci INFO: train: epoch 1906 | step 0 | lr 0.000489 | loss 0.023428 | mae 0.105986 -[2024/06/24 07:30:04] ppsci INFO: train: epoch 1906 | step 10 | lr 0.000489 | loss 0.017238 | mae 0.100865 -[2024/06/24 07:30:04] ppsci INFO: train: epoch 1906 | step 20 | lr 0.000489 | loss 0.019152 | mae 0.108623 -[2024/06/24 07:30:05] ppsci INFO: train: epoch 1906 | step 30 | lr 0.000489 | loss 0.024162 | mae 0.115646 -[2024/06/24 07:30:05] ppsci INFO: train: epoch 1906 | step 38 | lr 0.000489 | loss 0.036375 | mae 0.153226 -[2024/06/24 07:30:05] ppsci INFO: epoch: 1906, train_loss: 0.026254, train_metric: 0.107555, eval_loss: 0.041658, eval_mae: 0.144812 -[2024/06/24 07:30:05] ppsci INFO: train: epoch 1907 | step 0 | lr 0.000490 | loss 0.035923 | mae 0.104775 -[2024/06/24 07:30:06] ppsci INFO: train: epoch 1907 | step 10 | lr 0.000490 | loss 0.028400 | mae 0.123407 -[2024/06/24 07:30:06] ppsci INFO: train: epoch 1907 | step 20 | lr 0.000490 | loss 0.020473 | mae 0.109594 -[2024/06/24 07:30:07] ppsci INFO: train: epoch 1907 | step 30 | lr 0.000490 | loss 0.019146 | mae 0.095867 -[2024/06/24 07:30:07] ppsci INFO: train: epoch 1907 | step 38 | lr 0.000490 | loss 0.011197 | mae 0.079054 -[2024/06/24 07:30:07] ppsci INFO: epoch: 1907, train_loss: 0.026371, train_metric: 0.108852, eval_loss: 0.043291, eval_mae: 0.147961 -[2024/06/24 07:30:07] ppsci INFO: train: epoch 1908 | step 0 | lr 0.000490 | loss 0.021650 | mae 0.113870 -[2024/06/24 07:30:08] ppsci INFO: train: epoch 1908 | step 10 | lr 0.000490 | loss 0.024145 | mae 0.119690 -[2024/06/24 07:30:09] ppsci INFO: train: epoch 1908 | step 20 | lr 0.000490 | loss 0.030279 | mae 0.114642 -[2024/06/24 07:30:09] ppsci INFO: train: epoch 1908 | step 30 | lr 0.000490 | loss 0.022069 | mae 0.112685 -[2024/06/24 07:30:09] ppsci INFO: train: epoch 1908 | step 38 | lr 0.000490 | loss 0.023352 | mae 0.101181 -[2024/06/24 07:30:10] ppsci INFO: epoch: 1908, train_loss: 0.024266, train_metric: 0.108221, eval_loss: 0.046976, eval_mae: 0.151172 -[2024/06/24 07:30:10] ppsci INFO: train: epoch 1909 | step 0 | lr 0.000490 | loss 0.023479 | mae 0.114170 -[2024/06/24 07:30:10] ppsci INFO: train: epoch 1909 | step 10 | lr 0.000490 | loss 0.163103 | mae 0.144132 -[2024/06/24 07:30:11] ppsci INFO: train: epoch 1909 | step 20 | lr 0.000490 | loss 0.015044 | mae 0.095282 -[2024/06/24 07:30:11] ppsci INFO: train: epoch 1909 | step 30 | lr 0.000490 | loss 0.015697 | mae 0.101701 -[2024/06/24 07:30:12] ppsci INFO: train: epoch 1909 | step 38 | lr 0.000490 | loss 0.018316 | mae 0.106628 -[2024/06/24 07:30:12] ppsci INFO: epoch: 1909, train_loss: 0.024497, train_metric: 0.107076, eval_loss: 0.043835, eval_mae: 0.142509 -[2024/06/24 07:30:12] ppsci INFO: train: epoch 1910 | step 0 | lr 0.000490 | loss 0.018350 | mae 0.102990 -[2024/06/24 07:30:12] ppsci INFO: train: epoch 1910 | step 10 | lr 0.000490 | loss 0.020634 | mae 0.107204 -[2024/06/24 07:30:13] ppsci INFO: train: epoch 1910 | step 20 | lr 0.000490 | loss 0.018867 | mae 0.108888 -[2024/06/24 07:30:13] ppsci INFO: train: epoch 1910 | step 30 | lr 0.000490 | loss 0.020215 | mae 0.112771 -[2024/06/24 07:30:14] ppsci INFO: train: epoch 1910 | step 38 | lr 0.000490 | loss 0.023513 | mae 0.133934 -[2024/06/24 07:30:14] ppsci INFO: epoch: 1910, train_loss: 0.023314, train_metric: 0.108849, eval_loss: 0.047426, eval_mae: 0.149768 -[2024/06/24 07:30:14] ppsci INFO: train: epoch 1911 | step 0 | lr 0.000490 | loss 0.031835 | mae 0.109508 -[2024/06/24 07:30:15] ppsci INFO: train: epoch 1911 | step 10 | lr 0.000490 | loss 0.021709 | mae 0.104609 -[2024/06/24 07:30:15] ppsci INFO: train: epoch 1911 | step 20 | lr 0.000490 | loss 0.019840 | mae 0.106581 -[2024/06/24 07:30:16] ppsci INFO: train: epoch 1911 | step 30 | lr 0.000490 | loss 0.018634 | mae 0.104412 -[2024/06/24 07:30:16] ppsci INFO: train: epoch 1911 | step 38 | lr 0.000490 | loss 0.014346 | mae 0.093734 -[2024/06/24 07:30:16] ppsci INFO: epoch: 1911, train_loss: 0.020865, train_metric: 0.105576, eval_loss: 0.042066, eval_mae: 0.141381 -[2024/06/24 07:30:16] ppsci INFO: train: epoch 1912 | step 0 | lr 0.000491 | loss 0.023686 | mae 0.113323 -[2024/06/24 07:30:17] ppsci INFO: train: epoch 1912 | step 10 | lr 0.000491 | loss 0.020742 | mae 0.108739 -[2024/06/24 07:30:17] ppsci INFO: train: epoch 1912 | step 20 | lr 0.000491 | loss 0.036700 | mae 0.129436 -[2024/06/24 07:30:18] ppsci INFO: train: epoch 1912 | step 30 | lr 0.000491 | loss 0.028559 | mae 0.126705 -[2024/06/24 07:30:18] ppsci INFO: train: epoch 1912 | step 38 | lr 0.000491 | loss 0.017617 | mae 0.109257 -[2024/06/24 07:30:18] ppsci INFO: epoch: 1912, train_loss: 0.021149, train_metric: 0.108340, eval_loss: 0.047135, eval_mae: 0.144000 -[2024/06/24 07:30:19] ppsci INFO: train: epoch 1913 | step 0 | lr 0.000491 | loss 0.021193 | mae 0.113473 -[2024/06/24 07:30:19] ppsci INFO: train: epoch 1913 | step 10 | lr 0.000491 | loss 0.030717 | mae 0.127987 -[2024/06/24 07:30:20] ppsci INFO: train: epoch 1913 | step 20 | lr 0.000491 | loss 0.017299 | mae 0.099630 -[2024/06/24 07:30:20] ppsci INFO: train: epoch 1913 | step 30 | lr 0.000491 | loss 0.020865 | mae 0.106587 -[2024/06/24 07:30:20] ppsci INFO: train: epoch 1913 | step 38 | lr 0.000491 | loss 0.030443 | mae 0.122324 -[2024/06/24 07:30:21] ppsci INFO: epoch: 1913, train_loss: 0.022815, train_metric: 0.110239, eval_loss: 0.046443, eval_mae: 0.148476 -[2024/06/24 07:30:21] ppsci INFO: train: epoch 1914 | step 0 | lr 0.000491 | loss 0.020533 | mae 0.106899 -[2024/06/24 07:30:21] ppsci INFO: train: epoch 1914 | step 10 | lr 0.000491 | loss 0.016828 | mae 0.098359 -[2024/06/24 07:30:22] ppsci INFO: train: epoch 1914 | step 20 | lr 0.000491 | loss 0.017235 | mae 0.093451 -[2024/06/24 07:30:22] ppsci INFO: train: epoch 1914 | step 30 | lr 0.000491 | loss 0.016573 | mae 0.101911 -[2024/06/24 07:30:23] ppsci INFO: train: epoch 1914 | step 38 | lr 0.000491 | loss 0.007258 | mae 0.073319 -[2024/06/24 07:30:23] ppsci INFO: epoch: 1914, train_loss: 0.020996, train_metric: 0.106940, eval_loss: 0.044791, eval_mae: 0.146763 -[2024/06/24 07:30:23] ppsci INFO: train: epoch 1915 | step 0 | lr 0.000491 | loss 0.021708 | mae 0.106435 -[2024/06/24 07:30:23] ppsci INFO: train: epoch 1915 | step 10 | lr 0.000491 | loss 0.019216 | mae 0.102617 -[2024/06/24 07:30:24] ppsci INFO: train: epoch 1915 | step 20 | lr 0.000491 | loss 0.010013 | mae 0.073098 -[2024/06/24 07:30:24] ppsci INFO: train: epoch 1915 | step 30 | lr 0.000491 | loss 0.021605 | mae 0.101339 -[2024/06/24 07:30:25] ppsci INFO: train: epoch 1915 | step 38 | lr 0.000491 | loss 0.034299 | mae 0.147384 -[2024/06/24 07:30:25] ppsci INFO: epoch: 1915, train_loss: 0.020546, train_metric: 0.104296, eval_loss: 0.042110, eval_mae: 0.143373 -[2024/06/24 07:30:25] ppsci INFO: train: epoch 1916 | step 0 | lr 0.000492 | loss 0.021612 | mae 0.107774 -[2024/06/24 07:30:25] ppsci INFO: train: epoch 1916 | step 10 | lr 0.000492 | loss 0.015832 | mae 0.095672 -[2024/06/24 07:30:26] ppsci INFO: train: epoch 1916 | step 20 | lr 0.000492 | loss 0.016320 | mae 0.093948 -[2024/06/24 07:30:26] ppsci INFO: train: epoch 1916 | step 30 | lr 0.000492 | loss 0.032887 | mae 0.124140 -[2024/06/24 07:30:27] ppsci INFO: train: epoch 1916 | step 38 | lr 0.000492 | loss 0.016268 | mae 0.104046 -[2024/06/24 07:30:27] ppsci INFO: epoch: 1916, train_loss: 0.020364, train_metric: 0.104337, eval_loss: 0.047318, eval_mae: 0.148613 -[2024/06/24 07:30:27] ppsci INFO: train: epoch 1917 | step 0 | lr 0.000492 | loss 0.017447 | mae 0.099164 -[2024/06/24 07:30:27] ppsci INFO: train: epoch 1917 | step 10 | lr 0.000492 | loss 0.017426 | mae 0.101774 -[2024/06/24 07:30:28] ppsci INFO: train: epoch 1917 | step 20 | lr 0.000492 | loss 0.016492 | mae 0.093875 -[2024/06/24 07:30:29] ppsci INFO: train: epoch 1917 | step 30 | lr 0.000492 | loss 0.015493 | mae 0.096480 -[2024/06/24 07:30:29] ppsci INFO: train: epoch 1917 | step 38 | lr 0.000492 | loss 0.011834 | mae 0.085228 -[2024/06/24 07:30:29] ppsci INFO: epoch: 1917, train_loss: 0.019029, train_metric: 0.102114, eval_loss: 0.040156, eval_mae: 0.140150 -[2024/06/24 07:30:29] ppsci INFO: train: epoch 1918 | step 0 | lr 0.000492 | loss 0.014442 | mae 0.091065 -[2024/06/24 07:30:30] ppsci INFO: train: epoch 1918 | step 10 | lr 0.000492 | loss 0.019584 | mae 0.104666 -[2024/06/24 07:30:30] ppsci INFO: train: epoch 1918 | step 20 | lr 0.000492 | loss 0.022571 | mae 0.109820 -[2024/06/24 07:30:31] ppsci INFO: train: epoch 1918 | step 30 | lr 0.000492 | loss 0.018516 | mae 0.106533 -[2024/06/24 07:30:31] ppsci INFO: train: epoch 1918 | step 38 | lr 0.000492 | loss 0.009302 | mae 0.080181 -[2024/06/24 07:30:31] ppsci INFO: epoch: 1918, train_loss: 0.020621, train_metric: 0.106084, eval_loss: 0.047497, eval_mae: 0.145198 -[2024/06/24 07:30:31] ppsci INFO: train: epoch 1919 | step 0 | lr 0.000492 | loss 0.021599 | mae 0.104522 -[2024/06/24 07:30:32] ppsci INFO: train: epoch 1919 | step 10 | lr 0.000492 | loss 0.016444 | mae 0.097789 -[2024/06/24 07:30:32] ppsci INFO: train: epoch 1919 | step 20 | lr 0.000492 | loss 0.015716 | mae 0.096326 -[2024/06/24 07:30:33] ppsci INFO: train: epoch 1919 | step 30 | lr 0.000492 | loss 0.018921 | mae 0.100284 -[2024/06/24 07:30:33] ppsci INFO: train: epoch 1919 | step 38 | lr 0.000492 | loss 0.012430 | mae 0.092039 -[2024/06/24 07:30:33] ppsci INFO: epoch: 1919, train_loss: 0.019768, train_metric: 0.104372, eval_loss: 0.040121, eval_mae: 0.135035 -[2024/06/24 07:30:33] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:30:33] ppsci INFO: train: epoch 1920 | step 0 | lr 0.000492 | loss 0.015764 | mae 0.094874 -[2024/06/24 07:30:34] ppsci INFO: train: epoch 1920 | step 10 | lr 0.000492 | loss 0.017158 | mae 0.099635 -[2024/06/24 07:30:35] ppsci INFO: train: epoch 1920 | step 20 | lr 0.000492 | loss 0.022434 | mae 0.101484 -[2024/06/24 07:30:35] ppsci INFO: train: epoch 1920 | step 30 | lr 0.000492 | loss 0.017770 | mae 0.098551 -[2024/06/24 07:30:36] ppsci INFO: train: epoch 1920 | step 38 | lr 0.000492 | loss 0.020455 | mae 0.108396 -[2024/06/24 07:30:36] ppsci INFO: epoch: 1920, train_loss: 0.018639, train_metric: 0.100225, eval_loss: 0.045803, eval_mae: 0.146118 -[2024/06/24 07:30:36] ppsci INFO: train: epoch 1921 | step 0 | lr 0.000492 | loss 0.022072 | mae 0.109871 -[2024/06/24 07:30:36] ppsci INFO: train: epoch 1921 | step 10 | lr 0.000492 | loss 0.022623 | mae 0.118830 -[2024/06/24 07:30:37] ppsci INFO: train: epoch 1921 | step 20 | lr 0.000492 | loss 0.012853 | mae 0.091336 -[2024/06/24 07:30:37] ppsci INFO: train: epoch 1921 | step 30 | lr 0.000492 | loss 0.013819 | mae 0.085523 -[2024/06/24 07:30:38] ppsci INFO: train: epoch 1921 | step 38 | lr 0.000492 | loss 0.006728 | mae 0.068201 -[2024/06/24 07:30:38] ppsci INFO: epoch: 1921, train_loss: 0.018303, train_metric: 0.101654, eval_loss: 0.041250, eval_mae: 0.140984 -[2024/06/24 07:30:38] ppsci INFO: train: epoch 1922 | step 0 | lr 0.000493 | loss 0.025076 | mae 0.120624 -[2024/06/24 07:30:38] ppsci INFO: train: epoch 1922 | step 10 | lr 0.000493 | loss 0.016344 | mae 0.101968 -[2024/06/24 07:30:39] ppsci INFO: train: epoch 1922 | step 20 | lr 0.000493 | loss 0.011914 | mae 0.086897 -[2024/06/24 07:30:39] ppsci INFO: train: epoch 1922 | step 30 | lr 0.000493 | loss 0.029105 | mae 0.109731 -[2024/06/24 07:30:40] ppsci INFO: train: epoch 1922 | step 38 | lr 0.000493 | loss 0.043571 | mae 0.180823 -[2024/06/24 07:30:40] ppsci INFO: epoch: 1922, train_loss: 0.020634, train_metric: 0.104504, eval_loss: 0.038191, eval_mae: 0.134827 -[2024/06/24 07:30:40] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:30:40] ppsci INFO: train: epoch 1923 | step 0 | lr 0.000493 | loss 0.016764 | mae 0.095840 -[2024/06/24 07:30:41] ppsci INFO: train: epoch 1923 | step 10 | lr 0.000493 | loss 0.020521 | mae 0.102263 -[2024/06/24 07:30:41] ppsci INFO: train: epoch 1923 | step 20 | lr 0.000493 | loss 0.019778 | mae 0.098562 -[2024/06/24 07:30:42] ppsci INFO: train: epoch 1923 | step 30 | lr 0.000493 | loss 0.024215 | mae 0.106566 -[2024/06/24 07:30:42] ppsci INFO: train: epoch 1923 | step 38 | lr 0.000493 | loss 0.018696 | mae 0.115225 -[2024/06/24 07:30:42] ppsci INFO: epoch: 1923, train_loss: 0.018547, train_metric: 0.100419, eval_loss: 0.038368, eval_mae: 0.137025 -[2024/06/24 07:30:42] ppsci INFO: train: epoch 1924 | step 0 | lr 0.000493 | loss 0.017236 | mae 0.094992 -[2024/06/24 07:30:43] ppsci INFO: train: epoch 1924 | step 10 | lr 0.000493 | loss 0.015241 | mae 0.092624 -[2024/06/24 07:30:43] ppsci INFO: train: epoch 1924 | step 20 | lr 0.000493 | loss 0.015284 | mae 0.098181 -[2024/06/24 07:30:44] ppsci INFO: train: epoch 1924 | step 30 | lr 0.000493 | loss 0.020914 | mae 0.107847 -[2024/06/24 07:30:44] ppsci INFO: train: epoch 1924 | step 38 | lr 0.000493 | loss 0.031229 | mae 0.141567 -[2024/06/24 07:30:44] ppsci INFO: epoch: 1924, train_loss: 0.017985, train_metric: 0.098823, eval_loss: 0.040262, eval_mae: 0.141941 -[2024/06/24 07:30:44] ppsci INFO: train: epoch 1925 | step 0 | lr 0.000493 | loss 0.013368 | mae 0.090432 -[2024/06/24 07:30:45] ppsci INFO: train: epoch 1925 | step 10 | lr 0.000493 | loss 0.020977 | mae 0.100244 -[2024/06/24 07:30:45] ppsci INFO: train: epoch 1925 | step 20 | lr 0.000493 | loss 0.013731 | mae 0.087740 -[2024/06/24 07:30:46] ppsci INFO: train: epoch 1925 | step 30 | lr 0.000493 | loss 0.037783 | mae 0.119235 -[2024/06/24 07:30:46] ppsci INFO: train: epoch 1925 | step 38 | lr 0.000493 | loss 0.009010 | mae 0.068272 -[2024/06/24 07:30:46] ppsci INFO: epoch: 1925, train_loss: 0.018085, train_metric: 0.099011, eval_loss: 0.046387, eval_mae: 0.143098 -[2024/06/24 07:30:46] ppsci INFO: train: epoch 1926 | step 0 | lr 0.000493 | loss 0.012523 | mae 0.086907 -[2024/06/24 07:30:47] ppsci INFO: train: epoch 1926 | step 10 | lr 0.000493 | loss 0.018178 | mae 0.104933 -[2024/06/24 07:30:47] ppsci INFO: train: epoch 1926 | step 20 | lr 0.000493 | loss 0.029661 | mae 0.122487 -[2024/06/24 07:30:48] ppsci INFO: train: epoch 1926 | step 30 | lr 0.000493 | loss 0.018462 | mae 0.106256 -[2024/06/24 07:30:48] ppsci INFO: train: epoch 1926 | step 38 | lr 0.000493 | loss 0.005056 | mae 0.052968 -[2024/06/24 07:30:48] ppsci INFO: epoch: 1926, train_loss: 0.020179, train_metric: 0.104483, eval_loss: 0.040599, eval_mae: 0.137790 -[2024/06/24 07:30:49] ppsci INFO: train: epoch 1927 | step 0 | lr 0.000494 | loss 0.015862 | mae 0.100642 -[2024/06/24 07:30:49] ppsci INFO: train: epoch 1927 | step 10 | lr 0.000494 | loss 0.014339 | mae 0.089834 -[2024/06/24 07:30:50] ppsci INFO: train: epoch 1927 | step 20 | lr 0.000494 | loss 0.017544 | mae 0.102877 -[2024/06/24 07:30:50] ppsci INFO: train: epoch 1927 | step 30 | lr 0.000494 | loss 0.025882 | mae 0.101022 -[2024/06/24 07:30:50] ppsci INFO: train: epoch 1927 | step 38 | lr 0.000494 | loss 0.042435 | mae 0.137444 -[2024/06/24 07:30:51] ppsci INFO: epoch: 1927, train_loss: 0.019883, train_metric: 0.102670, eval_loss: 0.044347, eval_mae: 0.143706 -[2024/06/24 07:30:51] ppsci INFO: train: epoch 1928 | step 0 | lr 0.000494 | loss 0.016739 | mae 0.102186 -[2024/06/24 07:30:51] ppsci INFO: train: epoch 1928 | step 10 | lr 0.000494 | loss 0.017324 | mae 0.101793 -[2024/06/24 07:30:52] ppsci INFO: train: epoch 1928 | step 20 | lr 0.000494 | loss 0.012275 | mae 0.086657 -[2024/06/24 07:30:52] ppsci INFO: train: epoch 1928 | step 30 | lr 0.000494 | loss 0.018236 | mae 0.102021 -[2024/06/24 07:30:53] ppsci INFO: train: epoch 1928 | step 38 | lr 0.000494 | loss 0.014340 | mae 0.107246 -[2024/06/24 07:30:53] ppsci INFO: epoch: 1928, train_loss: 0.018805, train_metric: 0.102732, eval_loss: 0.038660, eval_mae: 0.140433 -[2024/06/24 07:30:53] ppsci INFO: train: epoch 1929 | step 0 | lr 0.000494 | loss 0.025310 | mae 0.109303 -[2024/06/24 07:30:53] ppsci INFO: train: epoch 1929 | step 10 | lr 0.000494 | loss 0.017428 | mae 0.101958 -[2024/06/24 07:30:54] ppsci INFO: train: epoch 1929 | step 20 | lr 0.000494 | loss 0.015464 | mae 0.094645 -[2024/06/24 07:30:54] ppsci INFO: train: epoch 1929 | step 30 | lr 0.000494 | loss 0.016808 | mae 0.094239 -[2024/06/24 07:30:55] ppsci INFO: train: epoch 1929 | step 38 | lr 0.000494 | loss 0.007650 | mae 0.065710 -[2024/06/24 07:30:55] ppsci INFO: epoch: 1929, train_loss: 0.018548, train_metric: 0.100981, eval_loss: 0.041079, eval_mae: 0.139281 -[2024/06/24 07:30:55] ppsci INFO: train: epoch 1930 | step 0 | lr 0.000494 | loss 0.029357 | mae 0.113727 -[2024/06/24 07:30:55] ppsci INFO: train: epoch 1930 | step 10 | lr 0.000494 | loss 0.015433 | mae 0.091510 -[2024/06/24 07:30:56] ppsci INFO: train: epoch 1930 | step 20 | lr 0.000494 | loss 0.013952 | mae 0.092028 -[2024/06/24 07:30:57] ppsci INFO: train: epoch 1930 | step 30 | lr 0.000494 | loss 0.014941 | mae 0.096110 -[2024/06/24 07:30:57] ppsci INFO: train: epoch 1930 | step 38 | lr 0.000494 | loss 0.018710 | mae 0.090507 -[2024/06/24 07:30:57] ppsci INFO: epoch: 1930, train_loss: 0.018660, train_metric: 0.100790, eval_loss: 0.043298, eval_mae: 0.140808 -[2024/06/24 07:30:57] ppsci INFO: train: epoch 1931 | step 0 | lr 0.000494 | loss 0.017472 | mae 0.100385 -[2024/06/24 07:30:58] ppsci INFO: train: epoch 1931 | step 10 | lr 0.000494 | loss 0.023279 | mae 0.114520 -[2024/06/24 07:30:58] ppsci INFO: train: epoch 1931 | step 20 | lr 0.000494 | loss 0.019284 | mae 0.110370 -[2024/06/24 07:30:59] ppsci INFO: train: epoch 1931 | step 30 | lr 0.000494 | loss 0.015925 | mae 0.098293 -[2024/06/24 07:30:59] ppsci INFO: train: epoch 1931 | step 38 | lr 0.000494 | loss 0.017982 | mae 0.110569 -[2024/06/24 07:30:59] ppsci INFO: epoch: 1931, train_loss: 0.018626, train_metric: 0.101638, eval_loss: 0.044962, eval_mae: 0.142132 -[2024/06/24 07:30:59] ppsci INFO: train: epoch 1932 | step 0 | lr 0.000494 | loss 0.013594 | mae 0.093154 -[2024/06/24 07:31:00] ppsci INFO: train: epoch 1932 | step 10 | lr 0.000494 | loss 0.020333 | mae 0.103189 -[2024/06/24 07:31:00] ppsci INFO: train: epoch 1932 | step 20 | lr 0.000494 | loss 0.041412 | mae 0.121277 -[2024/06/24 07:31:01] ppsci INFO: train: epoch 1932 | step 30 | lr 0.000494 | loss 0.019981 | mae 0.101904 -[2024/06/24 07:31:01] ppsci INFO: train: epoch 1932 | step 38 | lr 0.000494 | loss 0.008827 | mae 0.074519 -[2024/06/24 07:31:01] ppsci INFO: epoch: 1932, train_loss: 0.019388, train_metric: 0.102808, eval_loss: 0.048174, eval_mae: 0.140979 -[2024/06/24 07:31:02] ppsci INFO: train: epoch 1933 | step 0 | lr 0.000495 | loss 0.011916 | mae 0.084152 -[2024/06/24 07:31:02] ppsci INFO: train: epoch 1933 | step 10 | lr 0.000495 | loss 0.029239 | mae 0.117132 -[2024/06/24 07:31:03] ppsci INFO: train: epoch 1933 | step 20 | lr 0.000495 | loss 0.015851 | mae 0.098859 -[2024/06/24 07:31:03] ppsci INFO: train: epoch 1933 | step 30 | lr 0.000495 | loss 0.020435 | mae 0.105304 -[2024/06/24 07:31:03] ppsci INFO: train: epoch 1933 | step 38 | lr 0.000495 | loss 0.014937 | mae 0.094713 -[2024/06/24 07:31:04] ppsci INFO: epoch: 1933, train_loss: 0.018285, train_metric: 0.099653, eval_loss: 0.044983, eval_mae: 0.139634 -[2024/06/24 07:31:04] ppsci INFO: train: epoch 1934 | step 0 | lr 0.000495 | loss 0.021229 | mae 0.110529 -[2024/06/24 07:31:04] ppsci INFO: train: epoch 1934 | step 10 | lr 0.000495 | loss 0.015840 | mae 0.093598 -[2024/06/24 07:31:05] ppsci INFO: train: epoch 1934 | step 20 | lr 0.000495 | loss 0.015291 | mae 0.088764 -[2024/06/24 07:31:05] ppsci INFO: train: epoch 1934 | step 30 | lr 0.000495 | loss 0.012691 | mae 0.089212 -[2024/06/24 07:31:06] ppsci INFO: train: epoch 1934 | step 38 | lr 0.000495 | loss 0.010056 | mae 0.084500 -[2024/06/24 07:31:06] ppsci INFO: epoch: 1934, train_loss: 0.017603, train_metric: 0.098908, eval_loss: 0.043136, eval_mae: 0.139214 -[2024/06/24 07:31:06] ppsci INFO: train: epoch 1935 | step 0 | lr 0.000495 | loss 0.019303 | mae 0.106915 -[2024/06/24 07:31:06] ppsci INFO: train: epoch 1935 | step 10 | lr 0.000495 | loss 0.020015 | mae 0.104636 -[2024/06/24 07:31:07] ppsci INFO: train: epoch 1935 | step 20 | lr 0.000495 | loss 0.024287 | mae 0.113412 -[2024/06/24 07:31:07] ppsci INFO: train: epoch 1935 | step 30 | lr 0.000495 | loss 0.014856 | mae 0.095580 -[2024/06/24 07:31:08] ppsci INFO: train: epoch 1935 | step 38 | lr 0.000495 | loss 0.046451 | mae 0.156588 -[2024/06/24 07:31:08] ppsci INFO: epoch: 1935, train_loss: 0.019387, train_metric: 0.100899, eval_loss: 0.043835, eval_mae: 0.142757 -[2024/06/24 07:31:08] ppsci INFO: train: epoch 1936 | step 0 | lr 0.000495 | loss 0.016526 | mae 0.096335 -[2024/06/24 07:31:08] ppsci INFO: train: epoch 1936 | step 10 | lr 0.000495 | loss 0.022390 | mae 0.104912 -[2024/06/24 07:31:09] ppsci INFO: train: epoch 1936 | step 20 | lr 0.000495 | loss 0.020454 | mae 0.110040 -[2024/06/24 07:31:09] ppsci INFO: train: epoch 1936 | step 30 | lr 0.000495 | loss 0.021122 | mae 0.103383 -[2024/06/24 07:31:10] ppsci INFO: train: epoch 1936 | step 38 | lr 0.000495 | loss 0.029376 | mae 0.142099 -[2024/06/24 07:31:10] ppsci INFO: epoch: 1936, train_loss: 0.018406, train_metric: 0.099709, eval_loss: 0.041524, eval_mae: 0.140196 -[2024/06/24 07:31:10] ppsci INFO: train: epoch 1937 | step 0 | lr 0.000495 | loss 0.019177 | mae 0.105851 -[2024/06/24 07:31:11] ppsci INFO: train: epoch 1937 | step 10 | lr 0.000495 | loss 0.016258 | mae 0.095667 -[2024/06/24 07:31:11] ppsci INFO: train: epoch 1937 | step 20 | lr 0.000495 | loss 0.018422 | mae 0.100934 -[2024/06/24 07:31:12] ppsci INFO: train: epoch 1937 | step 30 | lr 0.000495 | loss 0.017917 | mae 0.093945 -[2024/06/24 07:31:12] ppsci INFO: train: epoch 1937 | step 38 | lr 0.000495 | loss 0.016760 | mae 0.103475 -[2024/06/24 07:31:12] ppsci INFO: epoch: 1937, train_loss: 0.019500, train_metric: 0.102952, eval_loss: 0.040263, eval_mae: 0.138256 -[2024/06/24 07:31:12] ppsci INFO: train: epoch 1938 | step 0 | lr 0.000495 | loss 0.017599 | mae 0.096093 -[2024/06/24 07:31:13] ppsci INFO: train: epoch 1938 | step 10 | lr 0.000495 | loss 0.019923 | mae 0.105848 -[2024/06/24 07:31:13] ppsci INFO: train: epoch 1938 | step 20 | lr 0.000495 | loss 0.023599 | mae 0.106187 -[2024/06/24 07:31:14] ppsci INFO: train: epoch 1938 | step 30 | lr 0.000495 | loss 0.015913 | mae 0.098366 -[2024/06/24 07:31:14] ppsci INFO: train: epoch 1938 | step 38 | lr 0.000495 | loss 0.037118 | mae 0.171201 -[2024/06/24 07:31:14] ppsci INFO: epoch: 1938, train_loss: 0.019028, train_metric: 0.100552, eval_loss: 0.045354, eval_mae: 0.142706 -[2024/06/24 07:31:14] ppsci INFO: train: epoch 1939 | step 0 | lr 0.000496 | loss 0.014605 | mae 0.092799 -[2024/06/24 07:31:15] ppsci INFO: train: epoch 1939 | step 10 | lr 0.000496 | loss 0.017081 | mae 0.092073 -[2024/06/24 07:31:15] ppsci INFO: train: epoch 1939 | step 20 | lr 0.000496 | loss 0.016285 | mae 0.090754 -[2024/06/24 07:31:16] ppsci INFO: train: epoch 1939 | step 30 | lr 0.000496 | loss 0.016784 | mae 0.094239 -[2024/06/24 07:31:16] ppsci INFO: train: epoch 1939 | step 38 | lr 0.000496 | loss 0.014947 | mae 0.101705 -[2024/06/24 07:31:16] ppsci INFO: epoch: 1939, train_loss: 0.017394, train_metric: 0.098309, eval_loss: 0.044640, eval_mae: 0.145214 -[2024/06/24 07:31:16] ppsci INFO: train: epoch 1940 | step 0 | lr 0.000496 | loss 0.020732 | mae 0.114322 -[2024/06/24 07:31:17] ppsci INFO: train: epoch 1940 | step 10 | lr 0.000496 | loss 0.016638 | mae 0.093957 -[2024/06/24 07:31:18] ppsci INFO: train: epoch 1940 | step 20 | lr 0.000496 | loss 0.013290 | mae 0.089423 -[2024/06/24 07:31:18] ppsci INFO: train: epoch 1940 | step 30 | lr 0.000496 | loss 0.022476 | mae 0.112583 -[2024/06/24 07:31:18] ppsci INFO: train: epoch 1940 | step 38 | lr 0.000496 | loss 0.009072 | mae 0.077499 -[2024/06/24 07:31:19] ppsci INFO: epoch: 1940, train_loss: 0.016972, train_metric: 0.099040, eval_loss: 0.041098, eval_mae: 0.141999 -[2024/06/24 07:31:19] ppsci INFO: train: epoch 1941 | step 0 | lr 0.000496 | loss 0.019200 | mae 0.110173 -[2024/06/24 07:31:19] ppsci INFO: train: epoch 1941 | step 10 | lr 0.000496 | loss 0.014585 | mae 0.089362 -[2024/06/24 07:31:20] ppsci INFO: train: epoch 1941 | step 20 | lr 0.000496 | loss 0.015270 | mae 0.097085 -[2024/06/24 07:31:20] ppsci INFO: train: epoch 1941 | step 30 | lr 0.000496 | loss 0.020588 | mae 0.109478 -[2024/06/24 07:31:21] ppsci INFO: train: epoch 1941 | step 38 | lr 0.000496 | loss 0.010745 | mae 0.082046 -[2024/06/24 07:31:21] ppsci INFO: epoch: 1941, train_loss: 0.020972, train_metric: 0.106685, eval_loss: 0.040590, eval_mae: 0.138822 -[2024/06/24 07:31:21] ppsci INFO: train: epoch 1942 | step 0 | lr 0.000496 | loss 0.024105 | mae 0.118792 -[2024/06/24 07:31:21] ppsci INFO: train: epoch 1942 | step 10 | lr 0.000496 | loss 0.024940 | mae 0.109734 -[2024/06/24 07:31:22] ppsci INFO: train: epoch 1942 | step 20 | lr 0.000496 | loss 0.023718 | mae 0.117947 -[2024/06/24 07:31:22] ppsci INFO: train: epoch 1942 | step 30 | lr 0.000496 | loss 0.016592 | mae 0.101017 -[2024/06/24 07:31:23] ppsci INFO: train: epoch 1942 | step 38 | lr 0.000496 | loss 0.036141 | mae 0.101959 -[2024/06/24 07:31:23] ppsci INFO: epoch: 1942, train_loss: 0.022378, train_metric: 0.107361, eval_loss: 0.042479, eval_mae: 0.141295 -[2024/06/24 07:31:23] ppsci INFO: train: epoch 1943 | step 0 | lr 0.000496 | loss 0.020258 | mae 0.110276 -[2024/06/24 07:31:23] ppsci INFO: train: epoch 1943 | step 10 | lr 0.000496 | loss 0.019722 | mae 0.107457 -[2024/06/24 07:31:24] ppsci INFO: train: epoch 1943 | step 20 | lr 0.000496 | loss 0.023779 | mae 0.109728 -[2024/06/24 07:31:24] ppsci INFO: train: epoch 1943 | step 30 | lr 0.000496 | loss 0.022980 | mae 0.114475 -[2024/06/24 07:31:25] ppsci INFO: train: epoch 1943 | step 38 | lr 0.000496 | loss 0.012181 | mae 0.084090 -[2024/06/24 07:31:25] ppsci INFO: epoch: 1943, train_loss: 0.019514, train_metric: 0.102515, eval_loss: 0.037078, eval_mae: 0.136752 -[2024/06/24 07:31:25] ppsci INFO: train: epoch 1944 | step 0 | lr 0.000496 | loss 0.015701 | mae 0.096619 -[2024/06/24 07:31:26] ppsci INFO: train: epoch 1944 | step 10 | lr 0.000496 | loss 0.016371 | mae 0.095696 -[2024/06/24 07:31:26] ppsci INFO: train: epoch 1944 | step 20 | lr 0.000496 | loss 0.013833 | mae 0.095558 -[2024/06/24 07:31:27] ppsci INFO: train: epoch 1944 | step 30 | lr 0.000496 | loss 0.020698 | mae 0.104651 -[2024/06/24 07:31:27] ppsci INFO: train: epoch 1944 | step 38 | lr 0.000496 | loss 0.012008 | mae 0.089520 -[2024/06/24 07:31:27] ppsci INFO: epoch: 1944, train_loss: 0.017460, train_metric: 0.099174, eval_loss: 0.040081, eval_mae: 0.135758 -[2024/06/24 07:31:27] ppsci INFO: train: epoch 1945 | step 0 | lr 0.000496 | loss 0.017209 | mae 0.097975 -[2024/06/24 07:31:28] ppsci INFO: train: epoch 1945 | step 10 | lr 0.000496 | loss 0.023026 | mae 0.105904 -[2024/06/24 07:31:28] ppsci INFO: train: epoch 1945 | step 20 | lr 0.000496 | loss 0.019423 | mae 0.097637 -[2024/06/24 07:31:29] ppsci INFO: train: epoch 1945 | step 30 | lr 0.000496 | loss 0.015696 | mae 0.099780 -[2024/06/24 07:31:29] ppsci INFO: train: epoch 1945 | step 38 | lr 0.000496 | loss 0.022646 | mae 0.138150 -[2024/06/24 07:31:29] ppsci INFO: epoch: 1945, train_loss: 0.018978, train_metric: 0.101749, eval_loss: 0.043209, eval_mae: 0.143028 -[2024/06/24 07:31:29] ppsci INFO: train: epoch 1946 | step 0 | lr 0.000496 | loss 0.021807 | mae 0.110905 -[2024/06/24 07:31:30] ppsci INFO: train: epoch 1946 | step 10 | lr 0.000496 | loss 0.048365 | mae 0.156685 -[2024/06/24 07:31:30] ppsci INFO: train: epoch 1946 | step 20 | lr 0.000496 | loss 0.032388 | mae 0.138208 -[2024/06/24 07:31:31] ppsci INFO: train: epoch 1946 | step 30 | lr 0.000496 | loss 0.037749 | mae 0.141537 -[2024/06/24 07:31:31] ppsci INFO: train: epoch 1946 | step 38 | lr 0.000496 | loss 0.053965 | mae 0.175124 -[2024/06/24 07:31:31] ppsci INFO: epoch: 1946, train_loss: 0.037087, train_metric: 0.134046, eval_loss: 0.050579, eval_mae: 0.154595 -[2024/06/24 07:31:32] ppsci INFO: train: epoch 1947 | step 0 | lr 0.000497 | loss 0.028525 | mae 0.128237 -[2024/06/24 07:31:32] ppsci INFO: train: epoch 1947 | step 10 | lr 0.000497 | loss 0.033801 | mae 0.129198 -[2024/06/24 07:31:33] ppsci INFO: train: epoch 1947 | step 20 | lr 0.000497 | loss 0.029232 | mae 0.133650 -[2024/06/24 07:31:33] ppsci INFO: train: epoch 1947 | step 30 | lr 0.000497 | loss 0.029743 | mae 0.120137 -[2024/06/24 07:31:33] ppsci INFO: train: epoch 1947 | step 38 | lr 0.000497 | loss 0.019005 | mae 0.110938 -[2024/06/24 07:31:34] ppsci INFO: epoch: 1947, train_loss: 0.033151, train_metric: 0.122348, eval_loss: 0.041986, eval_mae: 0.141102 -[2024/06/24 07:31:34] ppsci INFO: train: epoch 1948 | step 0 | lr 0.000497 | loss 0.024418 | mae 0.113070 -[2024/06/24 07:31:34] ppsci INFO: train: epoch 1948 | step 10 | lr 0.000497 | loss 0.016941 | mae 0.098138 -[2024/06/24 07:31:35] ppsci INFO: train: epoch 1948 | step 20 | lr 0.000497 | loss 0.017405 | mae 0.096783 -[2024/06/24 07:31:35] ppsci INFO: train: epoch 1948 | step 30 | lr 0.000497 | loss 0.017349 | mae 0.099474 -[2024/06/24 07:31:36] ppsci INFO: train: epoch 1948 | step 38 | lr 0.000497 | loss 0.012453 | mae 0.103284 -[2024/06/24 07:31:36] ppsci INFO: epoch: 1948, train_loss: 0.021798, train_metric: 0.109312, eval_loss: 0.036666, eval_mae: 0.132526 -[2024/06/24 07:31:36] ppsci INFO: Saving best checkpoint at ./checkpoints/megnet_2d_dp0.5 -[2024/06/24 07:31:36] ppsci INFO: train: epoch 1949 | step 0 | lr 0.000497 | loss 0.030973 | mae 0.118321 -[2024/06/24 07:31:36] ppsci INFO: train: epoch 1949 | step 10 | lr 0.000497 | loss 0.017867 | mae 0.104864 -[2024/06/24 07:31:37] ppsci INFO: train: epoch 1949 | step 20 | lr 0.000497 | loss 0.024939 | mae 0.120363 -[2024/06/24 07:31:37] ppsci INFO: train: epoch 1949 | step 30 | lr 0.000497 | loss 0.017130 | mae 0.096039 -[2024/06/24 07:31:38] ppsci INFO: train: epoch 1949 | step 38 | lr 0.000497 | loss 0.006533 | mae 0.064111 -[2024/06/24 07:31:38] ppsci INFO: epoch: 1949, train_loss: 0.027435, train_metric: 0.110916, eval_loss: 0.041633, eval_mae: 0.140644 -[2024/06/24 07:31:38] ppsci INFO: train: epoch 1950 | step 0 | lr 0.000497 | loss 0.018365 | mae 0.099265 -[2024/06/24 07:31:38] ppsci INFO: train: epoch 1950 | step 10 | lr 0.000497 | loss 0.020881 | mae 0.107968 -[2024/06/24 07:31:39] ppsci INFO: train: epoch 1950 | step 20 | lr 0.000497 | loss 0.016240 | mae 0.099496 -[2024/06/24 07:31:40] ppsci INFO: train: epoch 1950 | step 30 | lr 0.000497 | loss 0.015359 | mae 0.094822 -[2024/06/24 07:31:40] ppsci INFO: train: epoch 1950 | step 38 | lr 0.000497 | loss 0.027068 | mae 0.141917 -[2024/06/24 07:31:40] ppsci INFO: epoch: 1950, train_loss: 0.020382, train_metric: 0.105130, eval_loss: 0.044136, eval_mae: 0.143387 -[2024/06/24 07:31:40] ppsci INFO: train: epoch 1951 | step 0 | lr 0.000497 | loss 0.015008 | mae 0.096319 -[2024/06/24 07:31:41] ppsci INFO: train: epoch 1951 | step 10 | lr 0.000497 | loss 0.016342 | mae 0.095274 -[2024/06/24 07:31:41] ppsci INFO: train: epoch 1951 | step 20 | lr 0.000497 | loss 0.019480 | mae 0.104375 -[2024/06/24 07:31:42] ppsci INFO: train: epoch 1951 | step 30 | lr 0.000497 | loss 0.024504 | mae 0.111252 -[2024/06/24 07:31:42] ppsci INFO: train: epoch 1951 | step 38 | lr 0.000497 | loss 0.022777 | mae 0.106975 -[2024/06/24 07:31:42] ppsci INFO: epoch: 1951, train_loss: 0.019363, train_metric: 0.103071, eval_loss: 0.043190, eval_mae: 0.140544 -[2024/06/24 07:31:42] ppsci INFO: train: epoch 1952 | step 0 | lr 0.000497 | loss 0.013360 | mae 0.091217 -[2024/06/24 07:31:43] ppsci INFO: train: epoch 1952 | step 10 | lr 0.000497 | loss 0.016246 | mae 0.099387 -[2024/06/24 07:31:43] ppsci INFO: train: epoch 1952 | step 20 | lr 0.000497 | loss 0.014544 | mae 0.091900 -[2024/06/24 07:31:44] ppsci INFO: train: epoch 1952 | step 30 | lr 0.000497 | loss 0.022092 | mae 0.102624 -[2024/06/24 07:31:44] ppsci INFO: train: epoch 1952 | step 38 | lr 0.000497 | loss 0.015392 | mae 0.107986 -[2024/06/24 07:31:44] ppsci INFO: epoch: 1952, train_loss: 0.019138, train_metric: 0.102385, eval_loss: 0.048728, eval_mae: 0.144002 -[2024/06/24 07:31:44] ppsci INFO: train: epoch 1953 | step 0 | lr 0.000497 | loss 0.016314 | mae 0.101924 -[2024/06/24 07:31:45] ppsci INFO: train: epoch 1953 | step 10 | lr 0.000497 | loss 0.016247 | mae 0.097633 -[2024/06/24 07:31:45] ppsci INFO: train: epoch 1953 | step 20 | lr 0.000497 | loss 0.019698 | mae 0.102520 -[2024/06/24 07:31:46] ppsci INFO: train: epoch 1953 | step 30 | lr 0.000497 | loss 0.018086 | mae 0.101180 -[2024/06/24 07:31:46] ppsci INFO: train: epoch 1953 | step 38 | lr 0.000497 | loss 0.015990 | mae 0.095282 -[2024/06/24 07:31:46] ppsci INFO: epoch: 1953, train_loss: 0.022496, train_metric: 0.102714, eval_loss: 0.040806, eval_mae: 0.141176 -[2024/06/24 07:31:47] ppsci INFO: train: epoch 1954 | step 0 | lr 0.000497 | loss 0.024895 | mae 0.117496 -[2024/06/24 07:31:47] ppsci INFO: train: epoch 1954 | step 10 | lr 0.000497 | loss 0.017710 | mae 0.098794 -[2024/06/24 07:31:48] ppsci INFO: train: epoch 1954 | step 20 | lr 0.000497 | loss 0.019255 | mae 0.106020 -[2024/06/24 07:31:48] ppsci INFO: train: epoch 1954 | step 30 | lr 0.000497 | loss 0.017118 | mae 0.098136 -[2024/06/24 07:31:49] ppsci INFO: train: epoch 1954 | step 38 | lr 0.000497 | loss 0.018777 | mae 0.114989 -[2024/06/24 07:31:49] ppsci INFO: epoch: 1954, train_loss: 0.019375, train_metric: 0.101835, eval_loss: 0.041901, eval_mae: 0.143577 -[2024/06/24 07:31:49] ppsci INFO: train: epoch 1955 | step 0 | lr 0.000498 | loss 0.021044 | mae 0.106746 -[2024/06/24 07:31:49] ppsci INFO: train: epoch 1955 | step 10 | lr 0.000498 | loss 0.013034 | mae 0.089368 -[2024/06/24 07:31:50] ppsci INFO: train: epoch 1955 | step 20 | lr 0.000498 | loss 0.022599 | mae 0.113534 -[2024/06/24 07:31:50] ppsci INFO: train: epoch 1955 | step 30 | lr 0.000498 | loss 0.022052 | mae 0.104911 -[2024/06/24 07:31:51] ppsci INFO: train: epoch 1955 | step 38 | lr 0.000498 | loss 0.015373 | mae 0.095035 -[2024/06/24 07:31:51] ppsci INFO: epoch: 1955, train_loss: 0.018891, train_metric: 0.102597, eval_loss: 0.044461, eval_mae: 0.143089 -[2024/06/24 07:31:51] ppsci INFO: train: epoch 1956 | step 0 | lr 0.000498 | loss 0.024717 | mae 0.122811 -[2024/06/24 07:31:51] ppsci INFO: train: epoch 1956 | step 10 | lr 0.000498 | loss 0.020688 | mae 0.105675 -[2024/06/24 07:31:52] ppsci INFO: train: epoch 1956 | step 20 | lr 0.000498 | loss 0.018284 | mae 0.103412 -[2024/06/24 07:31:52] ppsci INFO: train: epoch 1956 | step 30 | lr 0.000498 | loss 0.023523 | mae 0.107780 -[2024/06/24 07:31:53] ppsci INFO: train: epoch 1956 | step 38 | lr 0.000498 | loss 0.020918 | mae 0.116249 -[2024/06/24 07:31:53] ppsci INFO: epoch: 1956, train_loss: 0.019890, train_metric: 0.105046, eval_loss: 0.044450, eval_mae: 0.146154 -[2024/06/24 07:31:53] ppsci INFO: train: epoch 1957 | step 0 | lr 0.000498 | loss 0.017031 | mae 0.104769 -[2024/06/24 07:31:54] ppsci INFO: train: epoch 1957 | step 10 | lr 0.000498 | loss 0.020431 | mae 0.108819 -[2024/06/24 07:31:54] ppsci INFO: train: epoch 1957 | step 20 | lr 0.000498 | loss 0.012630 | mae 0.089976 -[2024/06/24 07:31:55] ppsci INFO: train: epoch 1957 | step 30 | lr 0.000498 | loss 0.014999 | mae 0.092245 -[2024/06/24 07:31:55] ppsci INFO: train: epoch 1957 | step 38 | lr 0.000498 | loss 0.012096 | mae 0.086157 -[2024/06/24 07:31:55] ppsci INFO: epoch: 1957, train_loss: 0.018191, train_metric: 0.100882, eval_loss: 0.043394, eval_mae: 0.140764 -[2024/06/24 07:31:55] ppsci INFO: train: epoch 1958 | step 0 | lr 0.000498 | loss 0.017650 | mae 0.100382 -[2024/06/24 07:31:56] ppsci INFO: train: epoch 1958 | step 10 | lr 0.000498 | loss 0.019908 | mae 0.104516 -[2024/06/24 07:31:56] ppsci INFO: train: epoch 1958 | step 20 | lr 0.000498 | loss 0.021478 | mae 0.112601 -[2024/06/24 07:31:57] ppsci INFO: train: epoch 1958 | step 30 | lr 0.000498 | loss 0.018232 | mae 0.103551 -[2024/06/24 07:31:57] ppsci INFO: train: epoch 1958 | step 38 | lr 0.000498 | loss 0.009017 | mae 0.079340 -[2024/06/24 07:31:57] ppsci INFO: epoch: 1958, train_loss: 0.018563, train_metric: 0.101328, eval_loss: 0.047228, eval_mae: 0.147296 -[2024/06/24 07:31:57] ppsci INFO: train: epoch 1959 | step 0 | lr 0.000498 | loss 0.017996 | mae 0.100797 -[2024/06/24 07:31:58] ppsci INFO: train: epoch 1959 | step 10 | lr 0.000498 | loss 0.015281 | mae 0.088171 -[2024/06/24 07:31:59] ppsci INFO: train: epoch 1959 | step 20 | lr 0.000498 | loss 0.018701 | mae 0.098653 -[2024/06/24 07:31:59] ppsci INFO: train: epoch 1959 | step 30 | lr 0.000498 | loss 0.029087 | mae 0.120376 -[2024/06/24 07:32:00] ppsci INFO: train: epoch 1959 | step 38 | lr 0.000498 | loss 0.014515 | mae 0.082973 -[2024/06/24 07:32:00] ppsci INFO: epoch: 1959, train_loss: 0.018917, train_metric: 0.100123, eval_loss: 0.044274, eval_mae: 0.141927 -[2024/06/24 07:32:00] ppsci INFO: train: epoch 1960 | step 0 | lr 0.000498 | loss 0.013607 | mae 0.091600 -[2024/06/24 07:32:00] ppsci INFO: train: epoch 1960 | step 10 | lr 0.000498 | loss 0.021278 | mae 0.108636 -[2024/06/24 07:32:01] ppsci INFO: train: epoch 1960 | step 20 | lr 0.000498 | loss 0.015461 | mae 0.099390 -[2024/06/24 07:32:01] ppsci INFO: train: epoch 1960 | step 30 | lr 0.000498 | loss 0.014582 | mae 0.089742 -[2024/06/24 07:32:02] ppsci INFO: train: epoch 1960 | step 38 | lr 0.000498 | loss 0.026565 | mae 0.122568 -[2024/06/24 07:32:02] ppsci INFO: epoch: 1960, train_loss: 0.018552, train_metric: 0.101050, eval_loss: 0.046048, eval_mae: 0.143051 -[2024/06/24 07:32:02] ppsci INFO: train: epoch 1961 | step 0 | lr 0.000498 | loss 0.013776 | mae 0.091527 -[2024/06/24 07:32:03] ppsci INFO: train: epoch 1961 | step 10 | lr 0.000498 | loss 0.019759 | mae 0.101012 -[2024/06/24 07:32:03] ppsci INFO: train: epoch 1961 | step 20 | lr 0.000498 | loss 0.012659 | mae 0.090262 -[2024/06/24 07:32:04] ppsci INFO: train: epoch 1961 | step 30 | lr 0.000498 | loss 0.017828 | mae 0.099838 -[2024/06/24 07:32:04] ppsci INFO: train: epoch 1961 | step 38 | lr 0.000498 | loss 0.020025 | mae 0.116172 -[2024/06/24 07:32:04] ppsci INFO: epoch: 1961, train_loss: 0.018906, train_metric: 0.101520, eval_loss: 0.041759, eval_mae: 0.138200 -[2024/06/24 07:32:05] ppsci INFO: train: epoch 1962 | step 0 | lr 0.000498 | loss 0.022096 | mae 0.105234 -[2024/06/24 07:32:05] ppsci INFO: train: epoch 1962 | step 10 | lr 0.000498 | loss 0.014518 | mae 0.093079 -[2024/06/24 07:32:06] ppsci INFO: train: epoch 1962 | step 20 | lr 0.000498 | loss 0.015978 | mae 0.091144 -[2024/06/24 07:32:06] ppsci INFO: train: epoch 1962 | step 30 | lr 0.000498 | loss 0.019437 | mae 0.091078 -[2024/06/24 07:32:07] ppsci INFO: train: epoch 1962 | step 38 | lr 0.000498 | loss 0.022775 | mae 0.114237 -[2024/06/24 07:32:07] ppsci INFO: epoch: 1962, train_loss: 0.018202, train_metric: 0.097141, eval_loss: 0.048958, eval_mae: 0.149232 -[2024/06/24 07:32:07] ppsci INFO: train: epoch 1963 | step 0 | lr 0.000498 | loss 0.018097 | mae 0.097814 -[2024/06/24 07:32:07] ppsci INFO: train: epoch 1963 | step 10 | lr 0.000498 | loss 0.021913 | mae 0.112826 -[2024/06/24 07:32:08] ppsci INFO: train: epoch 1963 | step 20 | lr 0.000498 | loss 0.017224 | mae 0.098500 -[2024/06/24 07:32:08] ppsci INFO: train: epoch 1963 | step 30 | lr 0.000498 | loss 0.022283 | mae 0.112160 -[2024/06/24 07:32:09] ppsci INFO: train: epoch 1963 | step 38 | lr 0.000498 | loss 0.011539 | mae 0.084390 -[2024/06/24 07:32:09] ppsci INFO: epoch: 1963, train_loss: 0.018049, train_metric: 0.099465, eval_loss: 0.045191, eval_mae: 0.147381 -[2024/06/24 07:32:09] ppsci INFO: train: epoch 1964 | step 0 | lr 0.000498 | loss 0.019661 | mae 0.091785 -[2024/06/24 07:32:09] ppsci INFO: train: epoch 1964 | step 10 | lr 0.000498 | loss 0.017573 | mae 0.103033 -[2024/06/24 07:32:10] ppsci INFO: train: epoch 1964 | step 20 | lr 0.000498 | loss 0.015568 | mae 0.097617 -[2024/06/24 07:32:10] ppsci INFO: train: epoch 1964 | step 30 | lr 0.000498 | loss 0.020681 | mae 0.105072 -[2024/06/24 07:32:11] ppsci INFO: train: epoch 1964 | step 38 | lr 0.000498 | loss 0.018324 | mae 0.092676 -[2024/06/24 07:32:11] ppsci INFO: epoch: 1964, train_loss: 0.020256, train_metric: 0.103491, eval_loss: 0.044750, eval_mae: 0.145127 -[2024/06/24 07:32:11] ppsci INFO: train: epoch 1965 | step 0 | lr 0.000499 | loss 0.014203 | mae 0.090839 -[2024/06/24 07:32:11] ppsci INFO: train: epoch 1965 | step 10 | lr 0.000499 | loss 0.023551 | mae 0.112431 -[2024/06/24 07:32:12] ppsci INFO: train: epoch 1965 | step 20 | lr 0.000499 | loss 0.015413 | mae 0.097726 -[2024/06/24 07:32:12] ppsci INFO: train: epoch 1965 | step 30 | lr 0.000499 | loss 0.024368 | mae 0.099752 -[2024/06/24 07:32:13] ppsci INFO: train: epoch 1965 | step 38 | lr 0.000499 | loss 0.017105 | mae 0.110328 -[2024/06/24 07:32:13] ppsci INFO: epoch: 1965, train_loss: 0.018636, train_metric: 0.100378, eval_loss: 0.041643, eval_mae: 0.141535 -[2024/06/24 07:32:13] ppsci INFO: train: epoch 1966 | step 0 | lr 0.000499 | loss 0.015422 | mae 0.096831 -[2024/06/24 07:32:14] ppsci INFO: train: epoch 1966 | step 10 | lr 0.000499 | loss 0.014835 | mae 0.092769 -[2024/06/24 07:32:14] ppsci INFO: train: epoch 1966 | step 20 | lr 0.000499 | loss 0.018341 | mae 0.101268 -[2024/06/24 07:32:15] ppsci INFO: train: epoch 1966 | step 30 | lr 0.000499 | loss 0.013237 | mae 0.088084 -[2024/06/24 07:32:15] ppsci INFO: train: epoch 1966 | step 38 | lr 0.000499 | loss 0.011329 | mae 0.078811 -[2024/06/24 07:32:15] ppsci INFO: epoch: 1966, train_loss: 0.018444, train_metric: 0.099903, eval_loss: 0.039217, eval_mae: 0.138413 -[2024/06/24 07:32:15] ppsci INFO: train: epoch 1967 | step 0 | lr 0.000499 | loss 0.015064 | mae 0.092787 -[2024/06/24 07:32:16] ppsci INFO: train: epoch 1967 | step 10 | lr 0.000499 | loss 0.017794 | mae 0.103996 -[2024/06/24 07:32:16] ppsci INFO: train: epoch 1967 | step 20 | lr 0.000499 | loss 0.024514 | mae 0.121801 -[2024/06/24 07:32:17] ppsci INFO: train: epoch 1967 | step 30 | lr 0.000499 | loss 0.013108 | mae 0.090920 -[2024/06/24 07:32:17] ppsci INFO: train: epoch 1967 | step 38 | lr 0.000499 | loss 0.006319 | mae 0.060781 -[2024/06/24 07:32:17] ppsci INFO: epoch: 1967, train_loss: 0.018335, train_metric: 0.100276, eval_loss: 0.043642, eval_mae: 0.141216 -[2024/06/24 07:32:17] ppsci INFO: train: epoch 1968 | step 0 | lr 0.000499 | loss 0.019069 | mae 0.102643 -[2024/06/24 07:32:18] ppsci INFO: train: epoch 1968 | step 10 | lr 0.000499 | loss 0.018959 | mae 0.097786 -[2024/06/24 07:32:18] ppsci INFO: train: epoch 1968 | step 20 | lr 0.000499 | loss 0.018470 | mae 0.102744 -[2024/06/24 07:32:19] ppsci INFO: train: epoch 1968 | step 30 | lr 0.000499 | loss 0.014535 | mae 0.089261 -[2024/06/24 07:32:19] ppsci INFO: train: epoch 1968 | step 38 | lr 0.000499 | loss 0.005502 | mae 0.053380 -[2024/06/24 07:32:19] ppsci INFO: epoch: 1968, train_loss: 0.018032, train_metric: 0.099478, eval_loss: 0.041949, eval_mae: 0.137342 -[2024/06/24 07:32:20] ppsci INFO: train: epoch 1969 | step 0 | lr 0.000499 | loss 0.015252 | mae 0.094722 -[2024/06/24 07:32:20] ppsci INFO: train: epoch 1969 | step 10 | lr 0.000499 | loss 0.019799 | mae 0.108437 -[2024/06/24 07:32:21] ppsci INFO: train: epoch 1969 | step 20 | lr 0.000499 | loss 0.020535 | mae 0.112042 -[2024/06/24 07:32:21] ppsci INFO: train: epoch 1969 | step 30 | lr 0.000499 | loss 0.015846 | mae 0.097980 -[2024/06/24 07:32:22] ppsci INFO: train: epoch 1969 | step 38 | lr 0.000499 | loss 0.005416 | mae 0.050697 -[2024/06/24 07:32:22] ppsci INFO: epoch: 1969, train_loss: 0.019105, train_metric: 0.102336, eval_loss: 0.042191, eval_mae: 0.143801 -[2024/06/24 07:32:22] ppsci INFO: train: epoch 1970 | step 0 | lr 0.000499 | loss 0.019336 | mae 0.094028 -[2024/06/24 07:32:22] ppsci INFO: train: epoch 1970 | step 10 | lr 0.000499 | loss 0.013365 | mae 0.085071 -[2024/06/24 07:32:23] ppsci INFO: train: epoch 1970 | step 20 | lr 0.000499 | loss 0.016959 | mae 0.096898 -[2024/06/24 07:32:23] ppsci INFO: train: epoch 1970 | step 30 | lr 0.000499 | loss 0.018508 | mae 0.102372 -[2024/06/24 07:32:24] ppsci INFO: train: epoch 1970 | step 38 | lr 0.000499 | loss 0.012782 | mae 0.101338 -[2024/06/24 07:32:24] ppsci INFO: epoch: 1970, train_loss: 0.018040, train_metric: 0.100018, eval_loss: 0.044266, eval_mae: 0.144918 -[2024/06/24 07:32:24] ppsci INFO: train: epoch 1971 | step 0 | lr 0.000499 | loss 0.017266 | mae 0.094787 -[2024/06/24 07:32:24] ppsci INFO: train: epoch 1971 | step 10 | lr 0.000499 | loss 0.013951 | mae 0.088587 -[2024/06/24 07:32:25] ppsci INFO: train: epoch 1971 | step 20 | lr 0.000499 | loss 0.021762 | mae 0.100091 -[2024/06/24 07:32:26] ppsci INFO: train: epoch 1971 | step 30 | lr 0.000499 | loss 0.015710 | mae 0.092326 -[2024/06/24 07:32:26] ppsci INFO: train: epoch 1971 | step 38 | lr 0.000499 | loss 0.017626 | mae 0.118769 -[2024/06/24 07:32:26] ppsci INFO: epoch: 1971, train_loss: 0.017481, train_metric: 0.099140, eval_loss: 0.041264, eval_mae: 0.141039 -[2024/06/24 07:32:26] ppsci INFO: train: epoch 1972 | step 0 | lr 0.000499 | loss 0.023260 | mae 0.111092 -[2024/06/24 07:32:27] ppsci INFO: train: epoch 1972 | step 10 | lr 0.000499 | loss 0.026663 | mae 0.113076 -[2024/06/24 07:32:27] ppsci INFO: train: epoch 1972 | step 20 | lr 0.000499 | loss 0.012987 | mae 0.090122 -[2024/06/24 07:32:28] ppsci INFO: train: epoch 1972 | step 30 | lr 0.000499 | loss 0.016118 | mae 0.092819 -[2024/06/24 07:32:28] ppsci INFO: train: epoch 1972 | step 38 | lr 0.000499 | loss 0.022096 | mae 0.111052 -[2024/06/24 07:32:28] ppsci INFO: epoch: 1972, train_loss: 0.018445, train_metric: 0.100292, eval_loss: 0.043132, eval_mae: 0.146318 -[2024/06/24 07:32:28] ppsci INFO: train: epoch 1973 | step 0 | lr 0.000499 | loss 0.020996 | mae 0.101132 -[2024/06/24 07:32:29] ppsci INFO: train: epoch 1973 | step 10 | lr 0.000499 | loss 0.017026 | mae 0.098145 -[2024/06/24 07:32:29] ppsci INFO: train: epoch 1973 | step 20 | lr 0.000499 | loss 0.020324 | mae 0.107891 -[2024/06/24 07:32:30] ppsci INFO: train: epoch 1973 | step 30 | lr 0.000499 | loss 0.027464 | mae 0.123193 -[2024/06/24 07:32:30] ppsci INFO: train: epoch 1973 | step 38 | lr 0.000499 | loss 0.008286 | mae 0.069777 -[2024/06/24 07:32:30] ppsci INFO: epoch: 1973, train_loss: 0.018060, train_metric: 0.099640, eval_loss: 0.041570, eval_mae: 0.143935 -[2024/06/24 07:32:31] ppsci INFO: train: epoch 1974 | step 0 | lr 0.000499 | loss 0.014355 | mae 0.091701 -[2024/06/24 07:32:31] ppsci INFO: train: epoch 1974 | step 10 | lr 0.000499 | loss 0.022101 | mae 0.112437 -[2024/06/24 07:32:32] ppsci INFO: train: epoch 1974 | step 20 | lr 0.000499 | loss 0.025551 | mae 0.114255 -[2024/06/24 07:32:32] ppsci INFO: train: epoch 1974 | step 30 | lr 0.000499 | loss 0.021738 | mae 0.103331 -[2024/06/24 07:32:32] ppsci INFO: train: epoch 1974 | step 38 | lr 0.000499 | loss 0.013842 | mae 0.090355 -[2024/06/24 07:32:33] ppsci INFO: epoch: 1974, train_loss: 0.019109, train_metric: 0.101727, eval_loss: 0.044532, eval_mae: 0.143983 -[2024/06/24 07:32:33] ppsci INFO: train: epoch 1975 | step 0 | lr 0.000499 | loss 0.012663 | mae 0.084122 -[2024/06/24 07:32:33] ppsci INFO: train: epoch 1975 | step 10 | lr 0.000499 | loss 0.019219 | mae 0.099762 -[2024/06/24 07:32:34] ppsci INFO: train: epoch 1975 | step 20 | lr 0.000499 | loss 0.019291 | mae 0.105742 -[2024/06/24 07:32:34] ppsci INFO: train: epoch 1975 | step 30 | lr 0.000499 | loss 0.014760 | mae 0.091680 -[2024/06/24 07:32:35] ppsci INFO: train: epoch 1975 | step 38 | lr 0.000499 | loss 0.012295 | mae 0.091212 -[2024/06/24 07:32:35] ppsci INFO: epoch: 1975, train_loss: 0.017953, train_metric: 0.098638, eval_loss: 0.046339, eval_mae: 0.145681 -[2024/06/24 07:32:35] ppsci INFO: train: epoch 1976 | step 0 | lr 0.000499 | loss 0.021040 | mae 0.113303 -[2024/06/24 07:32:35] ppsci INFO: train: epoch 1976 | step 10 | lr 0.000499 | loss 0.022576 | mae 0.112392 -[2024/06/24 07:32:36] ppsci INFO: train: epoch 1976 | step 20 | lr 0.000499 | loss 0.017554 | mae 0.099373 -[2024/06/24 07:32:36] ppsci INFO: train: epoch 1976 | step 30 | lr 0.000499 | loss 0.018292 | mae 0.099586 -[2024/06/24 07:32:37] ppsci INFO: train: epoch 1976 | step 38 | lr 0.000499 | loss 0.013997 | mae 0.097246 -[2024/06/24 07:32:37] ppsci INFO: epoch: 1976, train_loss: 0.017568, train_metric: 0.098920, eval_loss: 0.044142, eval_mae: 0.145737 -[2024/06/24 07:32:37] ppsci INFO: train: epoch 1977 | step 0 | lr 0.000499 | loss 0.018455 | mae 0.107875 -[2024/06/24 07:32:38] ppsci INFO: train: epoch 1977 | step 10 | lr 0.000499 | loss 0.017843 | mae 0.100823 -[2024/06/24 07:32:38] ppsci INFO: train: epoch 1977 | step 20 | lr 0.000499 | loss 0.021525 | mae 0.105158 -[2024/06/24 07:32:39] ppsci INFO: train: epoch 1977 | step 30 | lr 0.000499 | loss 0.026774 | mae 0.112291 -[2024/06/24 07:32:39] ppsci INFO: train: epoch 1977 | step 38 | lr 0.000499 | loss 0.004086 | mae 0.053683 -[2024/06/24 07:32:39] ppsci INFO: epoch: 1977, train_loss: 0.018087, train_metric: 0.100740, eval_loss: 0.040301, eval_mae: 0.141808 -[2024/06/24 07:32:39] ppsci INFO: train: epoch 1978 | step 0 | lr 0.000499 | loss 0.011918 | mae 0.082362 -[2024/06/24 07:32:40] ppsci INFO: train: epoch 1978 | step 10 | lr 0.000499 | loss 0.013898 | mae 0.086737 -[2024/06/24 07:32:41] ppsci INFO: train: epoch 1978 | step 20 | lr 0.000499 | loss 0.016239 | mae 0.098033 -[2024/06/24 07:32:41] ppsci INFO: train: epoch 1978 | step 30 | lr 0.000499 | loss 0.020710 | mae 0.105090 -[2024/06/24 07:32:41] ppsci INFO: train: epoch 1978 | step 38 | lr 0.000499 | loss 0.020272 | mae 0.121111 -[2024/06/24 07:32:42] ppsci INFO: epoch: 1978, train_loss: 0.017992, train_metric: 0.098590, eval_loss: 0.042323, eval_mae: 0.142091 -[2024/06/24 07:32:42] ppsci INFO: train: epoch 1979 | step 0 | lr 0.000499 | loss 0.015937 | mae 0.099078 -[2024/06/24 07:32:42] ppsci INFO: train: epoch 1979 | step 10 | lr 0.000499 | loss 0.017141 | mae 0.098903 -[2024/06/24 07:32:43] ppsci INFO: train: epoch 1979 | step 20 | lr 0.000499 | loss 0.016174 | mae 0.089334 -[2024/06/24 07:32:43] ppsci INFO: train: epoch 1979 | step 30 | lr 0.000499 | loss 0.013586 | mae 0.086697 -[2024/06/24 07:32:44] ppsci INFO: train: epoch 1979 | step 38 | lr 0.000499 | loss 0.013861 | mae 0.098717 -[2024/06/24 07:32:44] ppsci INFO: epoch: 1979, train_loss: 0.016906, train_metric: 0.097831, eval_loss: 0.038837, eval_mae: 0.137727 -[2024/06/24 07:32:44] ppsci INFO: train: epoch 1980 | step 0 | lr 0.000500 | loss 0.015672 | mae 0.097574 -[2024/06/24 07:32:44] ppsci INFO: train: epoch 1980 | step 10 | lr 0.000500 | loss 0.021960 | mae 0.102711 -[2024/06/24 07:32:45] ppsci INFO: train: epoch 1980 | step 20 | lr 0.000500 | loss 0.016773 | mae 0.093529 -[2024/06/24 07:32:46] ppsci INFO: train: epoch 1980 | step 30 | lr 0.000500 | loss 0.014651 | mae 0.091844 -[2024/06/24 07:32:46] ppsci INFO: train: epoch 1980 | step 38 | lr 0.000500 | loss 0.010578 | mae 0.075277 -[2024/06/24 07:32:46] ppsci INFO: epoch: 1980, train_loss: 0.018298, train_metric: 0.100480, eval_loss: 0.037072, eval_mae: 0.134518 -[2024/06/24 07:32:46] ppsci INFO: train: epoch 1981 | step 0 | lr 0.000500 | loss 0.013375 | mae 0.090261 -[2024/06/24 07:32:47] ppsci INFO: train: epoch 1981 | step 10 | lr 0.000500 | loss 0.014814 | mae 0.087671 -[2024/06/24 07:32:47] ppsci INFO: train: epoch 1981 | step 20 | lr 0.000500 | loss 0.018304 | mae 0.093317 -[2024/06/24 07:32:48] ppsci INFO: train: epoch 1981 | step 30 | lr 0.000500 | loss 0.013383 | mae 0.082860 -[2024/06/24 07:32:48] ppsci INFO: train: epoch 1981 | step 38 | lr 0.000500 | loss 0.014653 | mae 0.084806 -[2024/06/24 07:32:48] ppsci INFO: epoch: 1981, train_loss: 0.017326, train_metric: 0.097538, eval_loss: 0.040782, eval_mae: 0.141539 -[2024/06/24 07:32:48] ppsci INFO: train: epoch 1982 | step 0 | lr 0.000500 | loss 0.028457 | mae 0.110966 -[2024/06/24 07:32:49] ppsci INFO: train: epoch 1982 | step 10 | lr 0.000500 | loss 0.016348 | mae 0.096855 -[2024/06/24 07:32:49] ppsci INFO: train: epoch 1982 | step 20 | lr 0.000500 | loss 0.018314 | mae 0.101264 -[2024/06/24 07:32:50] ppsci INFO: train: epoch 1982 | step 30 | lr 0.000500 | loss 0.041667 | mae 0.100305 -[2024/06/24 07:32:50] ppsci INFO: train: epoch 1982 | step 38 | lr 0.000500 | loss 0.007538 | mae 0.067893 -[2024/06/24 07:32:50] ppsci INFO: epoch: 1982, train_loss: 0.017858, train_metric: 0.098804, eval_loss: 0.041392, eval_mae: 0.139666 -[2024/06/24 07:32:50] ppsci INFO: train: epoch 1983 | step 0 | lr 0.000500 | loss 0.017271 | mae 0.098827 -[2024/06/24 07:32:51] ppsci INFO: train: epoch 1983 | step 10 | lr 0.000500 | loss 0.028483 | mae 0.117377 -[2024/06/24 07:32:52] ppsci INFO: train: epoch 1983 | step 20 | lr 0.000500 | loss 0.018858 | mae 0.100814 -[2024/06/24 07:32:52] ppsci INFO: train: epoch 1983 | step 30 | lr 0.000500 | loss 0.014980 | mae 0.094449 -[2024/06/24 07:32:52] ppsci INFO: train: epoch 1983 | step 38 | lr 0.000500 | loss 0.020650 | mae 0.119854 -[2024/06/24 07:32:53] ppsci INFO: epoch: 1983, train_loss: 0.018738, train_metric: 0.099208, eval_loss: 0.039992, eval_mae: 0.137363 -[2024/06/24 07:32:53] ppsci INFO: train: epoch 1984 | step 0 | lr 0.000500 | loss 0.018461 | mae 0.104333 -[2024/06/24 07:32:53] ppsci INFO: train: epoch 1984 | step 10 | lr 0.000500 | loss 0.018028 | mae 0.103091 -[2024/06/24 07:32:54] ppsci INFO: train: epoch 1984 | step 20 | lr 0.000500 | loss 0.019479 | mae 0.102204 -[2024/06/24 07:32:54] ppsci INFO: train: epoch 1984 | step 30 | lr 0.000500 | loss 0.015859 | mae 0.096308 -[2024/06/24 07:32:55] ppsci INFO: train: epoch 1984 | step 38 | lr 0.000500 | loss 0.035357 | mae 0.133364 -[2024/06/24 07:32:55] ppsci INFO: epoch: 1984, train_loss: 0.020350, train_metric: 0.104076, eval_loss: 0.041153, eval_mae: 0.147125 -[2024/06/24 07:32:55] ppsci INFO: train: epoch 1985 | step 0 | lr 0.000500 | loss 0.022619 | mae 0.111141 -[2024/06/24 07:32:55] ppsci INFO: train: epoch 1985 | step 10 | lr 0.000500 | loss 0.028301 | mae 0.123637 -[2024/06/24 07:32:56] ppsci INFO: train: epoch 1985 | step 20 | lr 0.000500 | loss 0.025678 | mae 0.110218 -[2024/06/24 07:32:56] ppsci INFO: train: epoch 1985 | step 30 | lr 0.000500 | loss 0.017484 | mae 0.094690 -[2024/06/24 07:32:57] ppsci INFO: train: epoch 1985 | step 38 | lr 0.000500 | loss 0.029207 | mae 0.124632 -[2024/06/24 07:32:57] ppsci INFO: epoch: 1985, train_loss: 0.019590, train_metric: 0.102217, eval_loss: 0.042835, eval_mae: 0.144624 -[2024/06/24 07:32:57] ppsci INFO: train: epoch 1986 | step 0 | lr 0.000500 | loss 0.020773 | mae 0.103424 -[2024/06/24 07:32:57] ppsci INFO: train: epoch 1986 | step 10 | lr 0.000500 | loss 0.017403 | mae 0.098498 -[2024/06/24 07:32:58] ppsci INFO: train: epoch 1986 | step 20 | lr 0.000500 | loss 0.023936 | mae 0.095021 -[2024/06/24 07:32:58] ppsci INFO: train: epoch 1986 | step 30 | lr 0.000500 | loss 0.011104 | mae 0.081852 -[2024/06/24 07:32:59] ppsci INFO: train: epoch 1986 | step 38 | lr 0.000500 | loss 0.011919 | mae 0.082934 -[2024/06/24 07:32:59] ppsci INFO: epoch: 1986, train_loss: 0.019147, train_metric: 0.100147, eval_loss: 0.040768, eval_mae: 0.143276 -[2024/06/24 07:32:59] ppsci INFO: train: epoch 1987 | step 0 | lr 0.000500 | loss 0.016912 | mae 0.101396 -[2024/06/24 07:32:59] ppsci INFO: train: epoch 1987 | step 10 | lr 0.000500 | loss 0.014182 | mae 0.088387 -[2024/06/24 07:33:00] ppsci INFO: train: epoch 1987 | step 20 | lr 0.000500 | loss 0.019176 | mae 0.102294 -[2024/06/24 07:33:01] ppsci INFO: train: epoch 1987 | step 30 | lr 0.000500 | loss 0.019186 | mae 0.112862 -[2024/06/24 07:33:01] ppsci INFO: train: epoch 1987 | step 38 | lr 0.000500 | loss 0.008947 | mae 0.075594 -[2024/06/24 07:33:01] ppsci INFO: epoch: 1987, train_loss: 0.017219, train_metric: 0.098556, eval_loss: 0.043379, eval_mae: 0.140882 -[2024/06/24 07:33:01] ppsci INFO: train: epoch 1988 | step 0 | lr 0.000500 | loss 0.020047 | mae 0.099901 -[2024/06/24 07:33:02] ppsci INFO: train: epoch 1988 | step 10 | lr 0.000500 | loss 0.016584 | mae 0.101061 -[2024/06/24 07:33:02] ppsci INFO: train: epoch 1988 | step 20 | lr 0.000500 | loss 0.014541 | mae 0.091982 -[2024/06/24 07:33:03] ppsci INFO: train: epoch 1988 | step 30 | lr 0.000500 | loss 0.022786 | mae 0.104126 -[2024/06/24 07:33:03] ppsci INFO: train: epoch 1988 | step 38 | lr 0.000500 | loss 0.011880 | mae 0.083609 -[2024/06/24 07:33:03] ppsci INFO: epoch: 1988, train_loss: 0.018933, train_metric: 0.100393, eval_loss: 0.044649, eval_mae: 0.146241 -[2024/06/24 07:33:03] ppsci INFO: train: epoch 1989 | step 0 | lr 0.000500 | loss 0.014001 | mae 0.086005 -[2024/06/24 07:33:04] ppsci INFO: train: epoch 1989 | step 10 | lr 0.000500 | loss 0.019780 | mae 0.104355 -[2024/06/24 07:33:04] ppsci INFO: train: epoch 1989 | step 20 | lr 0.000500 | loss 0.016861 | mae 0.097235 -[2024/06/24 07:33:05] ppsci INFO: train: epoch 1989 | step 30 | lr 0.000500 | loss 0.015361 | mae 0.091849 -[2024/06/24 07:33:05] ppsci INFO: train: epoch 1989 | step 38 | lr 0.000500 | loss 0.026159 | mae 0.112742 -[2024/06/24 07:33:05] ppsci INFO: epoch: 1989, train_loss: 0.018652, train_metric: 0.100154, eval_loss: 0.042722, eval_mae: 0.141988 -[2024/06/24 07:33:05] ppsci INFO: train: epoch 1990 | step 0 | lr 0.000500 | loss 0.018476 | mae 0.102603 -[2024/06/24 07:33:06] ppsci INFO: train: epoch 1990 | step 10 | lr 0.000500 | loss 0.018184 | mae 0.098579 -[2024/06/24 07:33:06] ppsci INFO: train: epoch 1990 | step 20 | lr 0.000500 | loss 0.016040 | mae 0.099261 -[2024/06/24 07:33:07] ppsci INFO: train: epoch 1990 | step 30 | lr 0.000500 | loss 0.016578 | mae 0.096548 -[2024/06/24 07:33:07] ppsci INFO: train: epoch 1990 | step 38 | lr 0.000500 | loss 0.021058 | mae 0.102517 -[2024/06/24 07:33:07] ppsci INFO: epoch: 1990, train_loss: 0.017915, train_metric: 0.099037, eval_loss: 0.045349, eval_mae: 0.148103 -[2024/06/24 07:33:08] ppsci INFO: train: epoch 1991 | step 0 | lr 0.000500 | loss 0.021312 | mae 0.107302 -[2024/06/24 07:33:08] ppsci INFO: train: epoch 1991 | step 10 | lr 0.000500 | loss 0.016396 | mae 0.091345 -[2024/06/24 07:33:09] ppsci INFO: train: epoch 1991 | step 20 | lr 0.000500 | loss 0.021221 | mae 0.106062 -[2024/06/24 07:33:09] ppsci INFO: train: epoch 1991 | step 30 | lr 0.000500 | loss 0.013407 | mae 0.093808 -[2024/06/24 07:33:10] ppsci INFO: train: epoch 1991 | step 38 | lr 0.000500 | loss 0.007089 | mae 0.066188 -[2024/06/24 07:33:10] ppsci INFO: epoch: 1991, train_loss: 0.017496, train_metric: 0.098170, eval_loss: 0.039642, eval_mae: 0.142786 -[2024/06/24 07:33:10] ppsci INFO: train: epoch 1992 | step 0 | lr 0.000500 | loss 0.016739 | mae 0.099177 -[2024/06/24 07:33:10] ppsci INFO: train: epoch 1992 | step 10 | lr 0.000500 | loss 0.014586 | mae 0.092236 -[2024/06/24 07:33:11] ppsci INFO: train: epoch 1992 | step 20 | lr 0.000500 | loss 0.015301 | mae 0.090394 -[2024/06/24 07:33:11] ppsci INFO: train: epoch 1992 | step 30 | lr 0.000500 | loss 0.018974 | mae 0.107008 -[2024/06/24 07:33:12] ppsci INFO: train: epoch 1992 | step 38 | lr 0.000500 | loss 0.016080 | mae 0.101666 -[2024/06/24 07:33:12] ppsci INFO: epoch: 1992, train_loss: 0.018397, train_metric: 0.099060, eval_loss: 0.042926, eval_mae: 0.144787 -[2024/06/24 07:33:12] ppsci INFO: train: epoch 1993 | step 0 | lr 0.000500 | loss 0.017424 | mae 0.098858 -[2024/06/24 07:33:13] ppsci INFO: train: epoch 1993 | step 10 | lr 0.000500 | loss 0.014487 | mae 0.093000 -[2024/06/24 07:33:13] ppsci INFO: train: epoch 1993 | step 20 | lr 0.000500 | loss 0.017218 | mae 0.092002 -[2024/06/24 07:33:14] ppsci INFO: train: epoch 1993 | step 30 | lr 0.000500 | loss 0.019352 | mae 0.107904 -[2024/06/24 07:33:14] ppsci INFO: train: epoch 1993 | step 38 | lr 0.000500 | loss 0.020643 | mae 0.113605 -[2024/06/24 07:33:14] ppsci INFO: epoch: 1993, train_loss: 0.017288, train_metric: 0.097681, eval_loss: 0.040206, eval_mae: 0.138641 -[2024/06/24 07:33:14] ppsci INFO: train: epoch 1994 | step 0 | lr 0.000500 | loss 0.020624 | mae 0.097709 -[2024/06/24 07:33:15] ppsci INFO: train: epoch 1994 | step 10 | lr 0.000500 | loss 0.020020 | mae 0.102297 -[2024/06/24 07:33:16] ppsci INFO: train: epoch 1994 | step 20 | lr 0.000500 | loss 0.018259 | mae 0.096500 -[2024/06/24 07:33:16] ppsci INFO: train: epoch 1994 | step 30 | lr 0.000500 | loss 0.015708 | mae 0.101626 -[2024/06/24 07:33:17] ppsci INFO: train: epoch 1994 | step 38 | lr 0.000500 | loss 0.013908 | mae 0.102728 -[2024/06/24 07:33:17] ppsci INFO: epoch: 1994, train_loss: 0.018388, train_metric: 0.099715, eval_loss: 0.041964, eval_mae: 0.140711 -[2024/06/24 07:33:17] ppsci INFO: train: epoch 1995 | step 0 | lr 0.000500 | loss 0.010497 | mae 0.080770 -[2024/06/24 07:33:17] ppsci INFO: train: epoch 1995 | step 10 | lr 0.000500 | loss 0.019787 | mae 0.104004 -[2024/06/24 07:33:18] ppsci INFO: train: epoch 1995 | step 20 | lr 0.000500 | loss 0.019356 | mae 0.100305 -[2024/06/24 07:33:18] ppsci INFO: train: epoch 1995 | step 30 | lr 0.000500 | loss 0.019306 | mae 0.101315 -[2024/06/24 07:33:19] ppsci INFO: train: epoch 1995 | step 38 | lr 0.000500 | loss 0.013716 | mae 0.086453 -[2024/06/24 07:33:19] ppsci INFO: epoch: 1995, train_loss: 0.016658, train_metric: 0.096158, eval_loss: 0.039508, eval_mae: 0.140505 -[2024/06/24 07:33:19] ppsci INFO: train: epoch 1996 | step 0 | lr 0.000500 | loss 0.015274 | mae 0.092601 -[2024/06/24 07:33:20] ppsci INFO: train: epoch 1996 | step 10 | lr 0.000500 | loss 0.015581 | mae 0.095938 -[2024/06/24 07:33:20] ppsci INFO: train: epoch 1996 | step 20 | lr 0.000500 | loss 0.014523 | mae 0.092334 -[2024/06/24 07:33:21] ppsci INFO: train: epoch 1996 | step 30 | lr 0.000500 | loss 0.014141 | mae 0.090229 -[2024/06/24 07:33:21] ppsci INFO: train: epoch 1996 | step 38 | lr 0.000500 | loss 0.020425 | mae 0.113682 -[2024/06/24 07:33:21] ppsci INFO: epoch: 1996, train_loss: 0.016387, train_metric: 0.095382, eval_loss: 0.039538, eval_mae: 0.137508 -[2024/06/24 07:33:21] ppsci INFO: train: epoch 1997 | step 0 | lr 0.000500 | loss 0.017084 | mae 0.098155 -[2024/06/24 07:33:22] ppsci INFO: train: epoch 1997 | step 10 | lr 0.000500 | loss 0.012768 | mae 0.089147 -[2024/06/24 07:33:22] ppsci INFO: train: epoch 1997 | step 20 | lr 0.000500 | loss 0.017239 | mae 0.103130 -[2024/06/24 07:33:23] ppsci INFO: train: epoch 1997 | step 30 | lr 0.000500 | loss 0.018400 | mae 0.104340 -[2024/06/24 07:33:23] ppsci INFO: train: epoch 1997 | step 38 | lr 0.000500 | loss 0.006355 | mae 0.067536 -[2024/06/24 07:33:23] ppsci INFO: epoch: 1997, train_loss: 0.017450, train_metric: 0.098485, eval_loss: 0.042429, eval_mae: 0.144371 -[2024/06/24 07:33:23] ppsci INFO: train: epoch 1998 | step 0 | lr 0.000500 | loss 0.018707 | mae 0.093350 -[2024/06/24 07:33:24] ppsci INFO: train: epoch 1998 | step 10 | lr 0.000500 | loss 0.020588 | mae 0.112959 -[2024/06/24 07:33:25] ppsci INFO: train: epoch 1998 | step 20 | lr 0.000500 | loss 0.012375 | mae 0.084677 -[2024/06/24 07:33:25] ppsci INFO: train: epoch 1998 | step 30 | lr 0.000500 | loss 0.012074 | mae 0.085033 -[2024/06/24 07:33:26] ppsci INFO: train: epoch 1998 | step 38 | lr 0.000500 | loss 0.008842 | mae 0.075898 -[2024/06/24 07:33:26] ppsci INFO: epoch: 1998, train_loss: 0.018194, train_metric: 0.099551, eval_loss: 0.045970, eval_mae: 0.144475 -[2024/06/24 07:33:26] ppsci INFO: train: epoch 1999 | step 0 | lr 0.000500 | loss 0.019974 | mae 0.097405 -[2024/06/24 07:33:26] ppsci INFO: train: epoch 1999 | step 10 | lr 0.000500 | loss 0.022229 | mae 0.100297 -[2024/06/24 07:33:27] ppsci INFO: train: epoch 1999 | step 20 | lr 0.000500 | loss 0.012683 | mae 0.082662 -[2024/06/24 07:33:27] ppsci INFO: train: epoch 1999 | step 30 | lr 0.000500 | loss 0.021524 | mae 0.101176 -[2024/06/24 07:33:28] ppsci INFO: train: epoch 1999 | step 38 | lr 0.000500 | loss 0.008392 | mae 0.074627 -[2024/06/24 07:33:28] ppsci INFO: epoch: 1999, train_loss: 0.018003, train_metric: 0.099723, eval_loss: 0.049091, eval_mae: 0.145649 -[2024/06/24 07:33:28] ppsci INFO: test_loss: 0.080365, test_mae: 0.161434 diff --git a/structure_generation/README.md b/structure_generation/README.md new file mode 100644 index 00000000..d15a30f0 --- /dev/null +++ b/structure_generation/README.md @@ -0,0 +1,36 @@ +# SG-Structure Generation + +## 1.Introduction + +The structure generation (SG) task tackles the inverse-design challenge of creating entirely new crystal structures that satisfy stability and functional constraints without exhaustive enumeration. Models first embed known crystals into symmetry-aware latent spaces—fractional-coordinate graphs, Wyckoff-sequence tokens, or E(3)-equivariant voxel fields. Generators—diffusion models, graph-autoregressive Transformers, or symmetry-equivariant GANs—sample this space. Running on a single GPU, the framework can propose over a thousand candidate crystal structures per minute, dramatically lowering the trial-and-error cost of discovering scintillators, solid-state electrolytes, and high-entropy compounds. Combined with a rapid, tiered screening funnel—machine-learning potential relaxation, energy threshold filtering, and final DFT refinement—this keeps computation affordable and tightly couples theory with experiment. + +## 2.Models Matrix + +| **Supported Functions** | **[DiffCSP](./configs/diffcsp/README.md)** | **[MatterGen](./configs/mattergen/README.md)** | +| ----------------------------------- | ------------------------------------------ | ---------------------------------------------- | +| **Support Material Types** | | | +| Inorganic Materials | ✅ | ✅ | +| **Structure Generation** | | | +|  Random Sample | ✅ | ✅ | +|  Condition Sample | ✅ | ✅ | +| **ML Capabilities · Training** | | | +|  Single-GPU | ✅ | ✅ | +|  Distributed Train | ✅ | ✅ | +|  Mixed Precision | - | - | +|  Fine-tuning | ✅ | ✅ | +|  Uncertainty / Active-Learning | - | - | +|  Dynamic→Static | - | - | +|  Compiler CINN | - | - | +| **ML Capabilities · Predict** | | | +|  Distillation / Pruning | - | - | +|  Standard inference | ✅ | ✅ | +|  Distributed inference | - | - | +|  Compiler CINN | - | - | +| **Dataset** | | | +| **Materials Project** | | | +|  MP20 | ✅ | ✅ | +| **Hrbrid** | | | +|  ALEX MP20 | - | ✅ | +| **ML2DDB🌟** | - | ✅ | + +**Notice**:🌟 represent originate research work published from paddlematerials toolkit diff --git a/structure_generation/configs/diffcsp/README.md b/structure_generation/configs/diffcsp/README.md new file mode 100644 index 00000000..790f0519 --- /dev/null +++ b/structure_generation/configs/diffcsp/README.md @@ -0,0 +1,220 @@ +# DiffCSP + +[COMPLETE AND EFFICIENT GRAPH TRANSFORMERS FOR CRYSTAL MATERIAL PROPERTY PREDICTION](https://arxiv.org/abs/2309.04475) + +## Abstract + +Crystal structures are characterized by atomic bases within a primitive unit cell that repeats along a regular lattice throughout 3D space. The periodic and infinite nature of crystals poses unique challenges for geometric graph representation learning. Specifically, constructing graphs that effectively capture the complete geometric information of crystals and handle chiral crystals remains an unsolved and challenging problem. In this paper, we introduce a novel approach that utilizes the periodic patterns of unit cells to establish the lattice-based representation for each atom, enabling efficient and expressive graph representations of crystals. Furthermore, we propose ComFormer, a SE(3) transformer designed specifically for crystalline materials. ComFormer includes two variants; namely, iComFormer that employs invariant geometric descriptors of Euclidean distances and angles, and eComFormer that utilizes equivariant vector representations. Experimental results demonstrate the state-of-the-art predictive accuracy of ComFormer variants on various tasks across three widely used crystal benchmarks. + +![DiffCSP Overview](../../docs/diffcsp_overview.png) + +--- + +## Model Description + +### Overview +A periodic crystal unit cell is represented as: +- atom types (composition): $A = (a_1,\ldots,a_N)$ +- fractional coordinates: $F = (f_1,\ldots,f_N),\; f_i \in [0,1)^3$ (stacked as $F \in [0,1)^{3 \times N}$) +- lattice matrix: $L \in \mathbb{R}^{3 \times 3}$ + +DiffCSP designs separate forward corruption processes for $(L, F)$: the lattice is diffused with a standard DDPM Gaussian process, while fractional coordinates are diffused on a 3D torus using wrapped Gaussian noise. The denoiser $\phi(L, F, A, t)$ is an EGNN-style model with periodic Fourier features on fractional coordinate differences. + +### Method + +#### 1) Lattice diffusion (DDPM on $L$) +Forward diffusion: + +$$ +q(L_t \mid L_0) = \mathcal{N}\!\left(L_t \mid \sqrt{\bar{\alpha}_t}\,L_0,\; (1-\bar{\alpha}_t) I\right), +\qquad +\bar{\alpha}_t = \prod_{s=1}^{t} (1 - \beta_s). +$$ + +Reparameterized sampling: + +$$ +L_t = \sqrt{\bar{\alpha}_t}\,L_0 + \sqrt{1 - \bar{\alpha}_t}\,\epsilon_L, +\qquad +\epsilon_L \sim \mathcal{N}(0, I). +$$ + +Reverse (ancestral) step: + +$$ +p_\theta(L_{t-1} \mid M_t) = \mathcal{N}\!\left(L_{t-1} \mid \mu_\theta(M_t, t),\; \sigma_t^2 I\right), +\qquad +M_t = (L_t, F_t, A). +$$ + +With mean: + +$$ +\mu_\theta(M_t, t) = \frac{1}{\sqrt{\alpha_t}} +\left(L_t - \frac{\sqrt{\beta_t}}{\sqrt{1 - \bar{\alpha}_t}}\,\hat{\epsilon}_L(M_t, t)\right). +$$ + +Lattice denoising loss: + +$$ +\mathcal{L}_L = \mathbb{E}_{t,\epsilon_L}\left[\left\|\epsilon_L - \hat{\epsilon}_L(M_t, t)\right\|_F^2\right]. +$$ + +#### 2) Fractional-coordinate diffusion on a torus (wrapped Normal / score matching) +Because $F \in [0,1)^{3 \times N}$ is periodic, DiffCSP corrupts coordinates by adding Gaussian noise then wrapping back into the unit cell via a truncation/wrapping operator $w(\cdot)$: + +$$ +F_t = w(F_0 + \sigma_t \epsilon_F), +\qquad +\epsilon_F \sim \mathcal{N}(0, I). +$$ + +This implies the wrapped Normal transition density: + +$$ +q(F_t \mid F_0) \propto +\sum_{Z \in \mathbb{Z}^{3 \times N}} +\exp\left( +-\frac{\left\|F_t - F_0 + Z\right\|_F^2}{2 \sigma_t^2} +\right). +$$ + +As $\sigma_t$ increases sufficiently, $q(F_t \mid F_0)$ approaches the uniform distribution over $[0,1)^{3 \times N}$. + +Score-matching objective: + +$$ +\mathcal{L}_F = +\mathbb{E}_{t, F_t}\left[ +\lambda_t \left\| +\nabla_{F_t} \log q(F_t \mid F_0) - \hat{\epsilon}_F(M_t, t) +\right\|_F^2 +\right]. +$$ + +Sampling typically uses a predictor-corrector scheme: an ancestral predictor combined with a Langevin corrector driven by $\hat{\epsilon}_F(M_t, t)$. + +#### 3) Periodic E(3)-aware denoiser (EGNN + periodic Fourier features) +DiffCSP builds $\phi(L, F, A, t)$ on a fully connected atom graph. Node initialization: + +$$ +h_i^{(0)} = \rho\left(f_{\text{atom}}(a_i),, f_{\text{pos}}(t)\right) +$$ + +Message passing at layer $s$: + +$$ +m_{ij}^{(s)} = \phi_m\left( +h_i^{(s-1)},, h_j^{(s-1)},, L^\top L,, \psi_{\mathrm{FT}}(f_j - f_i) +\right) +$$ + +$$ +m_i^{(s)} = \sum_{j=1}^{N} m_{ij}^{(s)} +$$ + +$$ +h_i^{(s)} = h_i^{(s-1)} + \phi_h\left(h_i^{(s-1)},, m_i^{(s)}\right) +$$ + +Periodic Fourier features for relative fractional coordinates $f = [f_1, f_2, f_3]^\top$: + +$$ +\psi_{\mathrm{FT}}(f)[c, k] = +\begin{cases} +\sin(2 \pi m f_c), & k = 2m \ +\cos(2 \pi m f_c), & k = 2m + 1 +\end{cases} +$$ + +which is periodic-translation invariant under wrapping. + +Outputs (noise/score predictions): + +$$ +\hat{\epsilon}L = L,\phi_L\left(\frac{1}{N} \sum{i=1}^{N} h_i^{(S)}\right) +$$ + +$$ +\hat{\epsilon}_F[:, i] = \phi_F\left(h_i^{(S)}\right) +$$ + +--- + +## Dataset Description + +- **Perov-5**: 18,928 perovskite structures; each unit cell contains 5 atoms (ABX$_3$-like), forming a structured CSP benchmark. +- **Carbon-24**: 10,153 carbon structures; unit cells contain 6-24 atoms with all-carbon composition, useful for assessing one-to-many structure diversity. +- **MP-20**: 45,231 inorganic crystals (Materials Project subset) with at most 20 atoms per unit cell; widely used for crystal generation and CSP. +- **MPTS-52 (Materials Project Time Split)**: 40,476 crystals with up to 52 atoms per cell; chronological split for temporal generalization. A common split is 27,380 / 5,000 / 8,096 for train/val/test. + +Recommended data fields for each sample: +- `atom_types`: length-$N$ atomic numbers or element indices +- `frac_coords`: $N \times 3$ fractional coordinates in $[0,1)$ +- `lattice`: $3 \times 3$ lattice matrix + +Optional fields include `material_id`, `spacegroup`, `energy`, and dataset split tags. + +#### MP-20 split (download link) +| Dataset | Train | Val | Test | +| --- | --- | --- | --- | +| [MP-20](https://paddle-org.bj.bcebos.com/paddlematerial/datasets/mp_20/mp_20.zip) | 27136 | 9047 | 9046 | + +--- + +## Results + +| Model | Dataset | Match Rate (%) | RMS Dist | GPUs | Training Time | Config | Checkpoint / Log | +| --- | --- | --- | --- | --- | --- | --- | --- | +| diffcsp_mp20 | mp20 | 51.72 | 0.0591 | 1 | ~13.5 hours | [diffcsp_mp20.yaml](diffcsp_mp20.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/diffcsp/diffcsp_mp20.zip) | + +--- + +## Command + +### Training +```bash +# multi-gpu training (example with 4 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3" structure_generation/train.py -c structure_generation/configs/diffcsp/diffcsp_mp20.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/diffcsp/diffcsp_mp20.yaml +``` + +### Validation +```bash +# Adjust program behavior on the fly using command-line parameters without modifying the configuration file directly. +# Example: --Global.do_eval=True +python structure_generation/train.py -c structure_generation/configs/diffcsp/diffcsp_mp20.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Testing +```bash +# Evaluate the model on the test dataset. +python structure_generation/train.py -c structure_generation/configs/diffcsp/diffcsp_mp20.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Sample +```bash +# Predict crystal structures using a trained model. +# Mode 1: Use a pre-trained model (downloads automatically). +# Mode 2: Use a custom configuration file and checkpoint. +# Results are saved to the folder specified by --save_path (default: result). + +# Mode 1: pre-trained model +python structure_generation/sample.py --model_name='diffcsp_mp20' --weights_name='latest.pdparams' --save_path='result_diffcsp_mp20/' --chemical_formula='LiMnO2' + +# Mode 2: custom config + checkpoint +python structure_generation/sample.py --config_path='structure_generation/configs/diffcsp/diffcsp_mp20.yaml' --checkpoint_path='./output/diffcsp_mp20/checkpoints/latest.pdparams' --save_path='result_diffcsp_mp20/' --chemical_formula='LiMnO2' +``` + +--- + +## Citation +``` +@article{jiao2023crystal, + title={Crystal structure prediction by joint equivariant diffusion}, + author={Jiao, Rui and Huang, Wenbing and Lin, Peijia and Han, Jiaqi and Chen, Pin and Lu, Yutong and Liu, Yang}, + journal={arXiv preprint arXiv:2309.04475}, + year={2023} +} +``` diff --git a/structure_generation/configs/diffcsp/diffcsp_mp20.yaml b/structure_generation/configs/diffcsp/diffcsp_mp20.yaml new file mode 100644 index 00000000..2a0058fe --- /dev/null +++ b/structure_generation/configs/diffcsp/diffcsp_mp20.yaml @@ -0,0 +1,183 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + +Trainer: + # Max epochs to train + max_epochs: 1000 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/diffcsp_mp20 + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null # set your pretrained model path here + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: DiffCSP + __init_params__: + decoder_cfg: + hidden_dim: 512 + latent_dim: 256 + num_layers: 6 + act_fn: silu + dis_emb: sin + num_freqs: 128 + edge_style: fc + ln: true + ip: true + smooth: False + pred_type: False + prop_dim: 512 + pred_scalar: False + num_classes: 100 + lattice_noise_scheduler_cfg: + __class_name__: DDPMScheduler + __init_params__: + beta_schedule: 'squaredcos_cap_v2' + num_train_timesteps: ${Global.num_train_timesteps} + clip_sample: False + coord_noise_scheduler_cfg: + __class_name__: ScoreSdeVeSchedulerWrapped + __init_params__: + num_train_timesteps: ${Global.num_train_timesteps} + sigma_min: 0.005 + sigma_max: 0.5 + snr: 1e-5 + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 1 + +Optimizer: + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.001 + factor: 0.6 + by_epoch: True + patience: 30 + min_lr: 0.0001 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: MP20Dataset + __init_params__: + path: "./data/mp_20/train.csv" + build_structure_cfg: + format: cif_str + num_cpus: 10 + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 256 # for 1 gpu, total batch size = 256 * 1 gpus = 256 + val: + dataset: + __class_name__: MP20Dataset + __init_params__: + path: "./data/mp_20/val.csv" + build_structure_cfg: + format: cif_str + num_cpus: 10 + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + test: + dataset: + __class_name__: MP20Dataset + __init_params__: + path: "./data/mp_20/test.csv" + build_structure_cfg: + format: cif_str + num_cpus: 10 + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 128 + +Sample: + data: + dataset: + __class_name__: MP20Dataset + __init_params__: + path: "./data/mp_20/test.csv" + build_structure_cfg: + format: cif_str + num_cpus: 10 + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 256 + build_structure_cfg: + format: array + niggli: False + + metrics: + __class_name__: CSPMetric + __init_params__: + gt_file_path: "./data/mp_20/test.csv" + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/README.md b/structure_generation/configs/mattergen/README.md new file mode 100644 index 00000000..d779119b --- /dev/null +++ b/structure_generation/configs/mattergen/README.md @@ -0,0 +1,363 @@ +# MatterGen + +[A generative model for inorganic materials design](https://www.nature.com/articles/s41586-025-08628-5) + +## Abstract + +The design of functional materials with desired properties is essential in driving technological advances in areas like energy storage, catalysis, and carbon capture. Generative models provide a new paradigm for materials design by directly generating novel materials given desired property constraints, but current methods have low success rates in proposing stable crystals or can only satisfy a limited set of property constraints. Here, we present MatterGen, a model that generates stable, diverse inorganic materials across the periodic table and can be fine-tuned to steer the generation toward a broad range of property constraints. Compared to prior generative models, structures produced by MatterGen are more than twice as likely to be novel and stable, and more than 10 times closer to the local energy minimum. After fine-tuning, MatterGen successfully generates stable, novel materials with desired chemistry, symmetry, as well as mechanical, electronic, and magnetic properties. As a proof of concept, we synthesize one of the generated structures and measure its property value to be within 20% of our target. We believe that the quality of generated materials and the breadth of MatterGen's capabilities represent a major advancement toward creating a foundational generative model for materials design. + +![MatterGen Overview](../../docs/mattergen.png) + +--- + +## Model Description + +### Overview +MatterGen is a diffusion-based generative model for **periodic inorganic crystal structures**. A crystal is represented by its unit cell: +- atom types: $A = (a_1,\ldots,a_N)$ +- fractional coordinates: $X = (x_1,\ldots,x_N),\; x_i \in [0,1)^3$ +- lattice: $L \in \mathbb{R}^{3 \times 3}$ + +MatterGen defines separate forward corruption processes for $(A, X, L)$ and trains an equivariant score network to reverse (denoise) them. The model can be further adapted to conditional generation (chemistry / symmetry / scalar properties) via lightweight adapter modules and classifier-free guidance. + +### Method + +#### 1) Forward diffusion (corruption) + +##### (a) Fractional coordinate diffusion on a torus (periodic boundary) +Because fractional coordinates live on a 3D torus, MatterGen uses a **wrapped Normal** corruption that approaches the **uniform distribution** as noise increases. + +$$ +p_t(x_t \mid x_0) \propto \sum_{k \in \mathbb{Z}^3} +\exp\left(-\frac{\|x_t - x_0 + k\|^2}{2\sigma^2(t)}\right), +\qquad x_t, x_0 \in [0,1)^3 +$$ + +In practice, we can sample by adding Gaussian noise and wrapping back into the unit cell: + +$$ +\tilde{x}_t = x_0 + \sigma(t)\,\epsilon,\qquad \epsilon \sim \mathcal{N}(0, I) +$$ + +$$ +x_t = \tilde{x}_t \bmod 1 +$$ + +##### (b) Lattice diffusion +The lattice diffusion is defined on the periodic lattice matrix $L$ with a noise schedule such that the noisy limit approaches a physically motivated lattice distribution (for example, centered around a cubic lattice with the average density from training data). In implementation, this is commonly handled by diffusing a suitable lattice parameterization and training the network to denoise it. + +$$ +L_t = \sqrt{\alpha(t)}\,L_0 + \sqrt{1 - \alpha(t)}\,\epsilon +$$ + +##### (c) Atom-type diffusion in categorical space +Atom types are diffused as a **discrete corruption** process (for example, masking atoms into a special $\text{[MASK]}$ state with a time-dependent probability). This allows the model to gradually refine chemistry while remaining compatible with variable compositions. + +$$ +q(a_t \mid a_{t - \Delta t}) = (1 - \beta(t))\,\mathbb{I}[a_t = a_{t - \Delta t}] + \beta(t)\,\mathbb{I}[a_t = \text{[MASK]}] +$$ + +#### 2) Equivariant score network (denoiser) +MatterGen uses an E(3)-equivariant graph neural network (GNN) to predict: +- **invariant** logits/scores for atom types $A$ +- **equivariant** scores (or noise) for coordinates $X$ +- **equivariant** scores (or noise) for lattice $L$ + +The key requirements are rotation/translation equivariance for geometric outputs (coordinates/lattice), permutation invariance over atoms, and periodic consistency via fractional coordinates plus lattice. + +#### 3) Training objective (typical form) +A standard diffusion training objective combines continuous denoising losses and discrete cross-entropy losses: + +$$ +\begin{aligned} +\mathcal{L} +&= \lambda_X\,\mathbb{E}\big[\|\epsilon_X - \epsilon_{X,\theta}(X_t, A_t, L_t, t)\|_2^2\big] \\ +&\quad + \lambda_L\,\mathbb{E}\big[\|\epsilon_L - \epsilon_{L,\theta}(X_t, A_t, L_t, t)\|_2^2\big] \\ +&\quad + \lambda_A\,\mathbb{E}\big[-\log p_{\theta}(A_0 \mid A_t, X_t, L_t, t)\big] +\end{aligned} +$$ + +where $\epsilon_X, \epsilon_L$ are the injected noises for coordinates and lattice, and $p_\theta$ is the predicted atom-type distribution. + +#### 4) Conditional generation (fine-tuning) and classifier-free guidance +To steer generation toward constraints (composition / symmetry / scalar properties), MatterGen introduces **adapter modules** injected into the base network and fine-tunes them on a labeled dataset. At sampling time, classifier-free guidance (CFG) can be used: + +$$ +s_{\mathrm{cfg}} = (1 + w)\,s_{\theta}(\cdot \mid c) - w\,s_{\theta}(\cdot \mid \varnothing) +$$ + +where $c$ is the condition (for example, a target property) and $w$ is the guidance scale. + +--- + +## Dataset Description + +### Dataset contents + +#### 1) MP-20 (commonly used benchmark subset) +MP-20 typically refers to a benchmark subset of Materials Project structures with **up to 20 atoms per cell**, used in many crystal generative model papers. It is frequently adopted for fair comparison and for training smaller baseline models. + +#### 2) Alex-MP-20 (large-scale pretraining dataset in MatterGen) +MatterGen pretrains on **Alex-MP-20**, a curated dataset that contains **607,683 stable structures (<= 20 atoms)** recomputed from Materials Project and Alexandria. Stability is defined using **energy-above-hull** after DFT relaxation (for example, <= 0.1 eV/atom with respect to a reference convex hull). A larger reference set (Alex-MP-ICSD) is used to define stability/novelty and to compute convex-hull statistics. + +#### 3) Labeled datasets for fine-tuning (optional) +For conditional generation, a labeled dataset is needed. Each sample contains $(A, X, L)$ plus a condition label $c$ such as: +- scalar property targets (for example, band gap, bulk modulus, magnetic density) +- chemistry constraints (allowed elements / target system) +- symmetry constraints (for example, target space group) + +### Data format (recommended) +Each structure sample should minimally provide: +- `atom_types`: length-$N$ list of atomic numbers or element indices +- `frac_coords`: $N \times 3$ fractional coordinates in $[0,1)$ +- `lattice`: $3 \times 3$ lattice matrix (row/column convention must match the dataloader) + +Optional fields include `num_atoms`, `spacegroup`, and `property` / `condition`. + +--- + +## Results + +| Model Name | Dataset | Val (loss) | Config | Checkpoint / Log | +| --- | --- | --- | --- | --- | +| mattergen_mp20 | mp20 | 0.3721 | [mattergen_mp20.yaml](mattergen_mp20.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20.zip) | +| mattergen_mp20_chemical_system | mp20 | 0.3121 | [mattergen_mp20_chemical_system.yaml](mattergen_mp20_chemical_system.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_chemical_system.zip) | +| mattergen_mp20_dft_band_gap | mp20 | 0.3575 | [mattergen_mp20_dft_band_gap.yaml](mattergen_mp20_dft_band_gap.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_dft_band_gap.zip) | +| mattergen_mp20_dft_bulk_modulus | mp20 | 0.2942 | [mattergen_mp20_dft_bulk_modulus.yaml](mattergen_mp20_dft_bulk_modulus.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_dft_bulk_modulus.zip) | +| mattergen_mp20_dft_mag_density | mp20 | 0.3620 | [mattergen_mp20_dft_mag_density.yaml](mattergen_mp20_dft_mag_density.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20_dft_mag_density.zip) | +| mattergen_alex_mp20 | alex_mp20 | 0.2960 | [mattergen_alex_mp20.yaml](mattergen_alex_mp20.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip) | +| mattergen_alex_mp20_dft_band_gap | alex_mp20 | 0.3101 | [mattergen_alex_mp20_dft_band_gap.yaml](mattergen_alex_mp20_dft_band_gap.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_dft_band_gap.zip) | +| mattergen_alex_mp20_chemical_system | alex_mp20 | 0.2289 | [mattergen_alex_mp20_chemical_system.yaml](mattergen_alex_mp20_chemical_system.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_chemical_system.zip) | +| mattergen_alex_mp20_dft_mag_density | alex_mp20 | 0.2881 | [mattergen_alex_mp20_dft_mag_density.yaml](mattergen_alex_mp20_dft_mag_density.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_dft_mag_density.zip) | +| mattergen_alex_mp20_ml_bulk_modulus | alex_mp20 | 0.2811 | [mattergen_alex_mp20_ml_bulk_modulus.yaml](mattergen_alex_mp20_ml_bulk_modulus.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_ml_bulk_modulus.zip) | +| mattergen_alex_mp20_space_group | alex_mp20 | 0.2795 | [mattergen_alex_mp20_space_group.yaml](mattergen_alex_mp20_space_group.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_space_group.zip) | +| mattergen_alex_mp20_chemical_system_energy_above_hull | alex_mp20 | 0.2272 | [mattergen_alex_mp20_chemical_system_energy_above_hull.yaml](mattergen_alex_mp20_chemical_system_energy_above_hull.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.zip) | +| mattergen_alex_mp20_dft_mag_density_hhi_score | alex_mp20 | 0.2803 | [mattergen_alex_mp20_dft_mag_density_hhi_score.yaml](mattergen_alex_mp20_dft_mag_density_hhi_score.yaml) | [checkpoint / log](https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.zip) | + +--- + +## Command + +### Training +```bash +# mp20 dataset, without conditional constraints +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20.yaml + +# mp20 dataset, with chemical system constraints (pre-trained model is mattergen_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml + +# mp20 dataset, with dft_band_gap constraints (pre-trained model is mattergen_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml + +# mp20 dataset, with dft_bulk_modulus constraints (pre-trained model is mattergen_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml + +# mp20 dataset, with dft_mag_density constraints (pre-trained model is mattergen_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml + +# alex_mp20 dataset, without conditional constraints +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20.yaml + +# alex_mp20 dataset, with dft_band_gap constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml + +# alex_mp20 dataset, with chemical system constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml + +# alex_mp20 dataset, with dft_mag_density constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml + +# alex_mp20 dataset, with ml_bulk_modulus constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml + +# alex_mp20 dataset, with space_group constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml + +# alex_mp20 dataset, with chemical system and energy above hull constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml + +# alex_mp20 dataset, with dft_mag_density and hhi_score constraints (pre-trained model is mattergen_alex_mp20; downloads automatically) +# multi-gpu training (example with 8 GPUs) +python -m paddle.distributed.launch --gpus="0,1,2,3,4,5,6,7" structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml +# single-gpu training +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml +``` + +### Validation +```bash +# Adjust program behavior on the fly using command-line parameters without modifying the configuration file directly. +# Example: --Global.do_eval=True + +# mp20 dataset, without conditional constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with chemical system constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with dft_band_gap constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with dft_bulk_modulus constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with dft_mag_density constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, without conditional constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with dft_band_gap constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with chemical system constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with dft_mag_density constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with ml_bulk_modulus constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with space_group constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with chemical system and energy above hull constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' + +# alex_mp20 dataset, with dft_mag_density and hhi_score constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml Global.do_eval=True Global.do_train=False Global.do_test=False Trainer.pretrained_model_path='path/to/model.pdparams' +``` + +### Testing +```bash +# This command is used to evaluate the model's performance on the test dataset. + +# mp20 dataset, without conditional constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with chemical system constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with dft_band_gap constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with dft_bulk_modulus constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' + +# mp20 dataset, with dft_mag_density constraints +python structure_generation/train.py -c structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml Global.do_eval=False Global.do_train=False Global.do_test=True Trainer.pretrained_model_path='path/to/model.pdparams' + +# Since the alex_mp20 dataset does not include a test set, we cannot utilize the test command. +``` + +### Sample +```bash +# This command is used to predict the crystal structure using a trained model. +# Mode 1: Use a pre-trained model (downloads automatically). +# Mode 2: Use a custom configuration file and checkpoint. +# Results are saved to the folder specified by --save_path (default: result). + +# mp20 dataset, without conditional constraints +python structure_generation/sample.py --model_name='mattergen_mp20' --weights_name='latest.pdparams' --save_path='result_mattergen_mp20/' --mode='by_num_atoms' --num_atoms=4 +python structure_generation/sample.py --model_name='mattergen_mp20' --weights_name='latest.pdparams' --save_path='result_mattergen_mp20/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_mp20.yaml' --checkpoint_path='./output/mattergen_mp20/checkpoints/latest.pdparams' --save_path='result_mattergen_mp20/' --mode='by_num_atoms' --num_atoms=4 +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_mp20.yaml' --checkpoint_path='./output/mattergen_mp20/checkpoints/latest.pdparams' --save_path='result_mattergen_mp20/' --mode='by_dataloader' + +# mp20 dataset, with chemical system constraints +python structure_generation/sample.py --model_name='mattergen_mp20_chemical_system' --weights_name='latest.pdparams' --save_path='result_mattergen_mp20_chemical_system/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml' --checkpoint_path='./output/mattergen_mp20_chemical_system/checkpoints/latest.pdparams' --save_path='result_mattergen_mp20_chemical_system/' --mode='by_dataloader' + +# mp20 dataset, with dft_band_gap constraints +python structure_generation/sample.py --model_name='mattergen_mp20_dft_band_gap' --weights_name='latest.pdparams' --save_path='result_mattergen_mp20_dft_band_gap/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml' --checkpoint_path='./output/mattergen_mp20_dft_band_gap/checkpoints/latest.pdparams' --save_path='result_mattergen_mp20_dft_band_gap/' --mode='by_dataloader' + +# mp20 dataset, with dft_bulk_modulus constraints +python structure_generation/sample.py --model_name='mattergen_mp20_dft_bulk_modulus' --weights_name='latest.pdparams' --save_path='result_mattergen_mp20_dft_bulk_modulus/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml' --checkpoint_path='./output/mattergen_mp20_dft_bulk_modulus/checkpoints/latest.pdparams' --save_path='result_mattergen_mp20_dft_bulk_modulus/' --mode='by_dataloader' + +# mp20 dataset, with dft_mag_density constraints +python structure_generation/sample.py --model_name='mattergen_mp20_dft_mag_density' --weights_name='latest.pdparams' --save_path='result_mattergen_mp20_dft_mag_density/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml' --checkpoint_path='./output/mattergen_mp20_dft_mag_density/checkpoints/latest.pdparams' --save_path='result_mattergen_mp20_dft_mag_density/' --mode='by_dataloader' + +# alex_mp20 dataset, without conditional constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20.yaml' --checkpoint_path='./output/mattergen_alex_mp20/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20/' --mode='by_dataloader' + +# alex_mp20 dataset, with dft_band_gap constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_dft_band_gap' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_dft_band_gap/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml' --checkpoint_path='./output/mattergen_alex_mp20_dft_band_gap/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_dft_band_gap/' --mode='by_dataloader' + +# alex_mp20 dataset, with chemical system constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_chemical_system' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_chemical_system/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml' --checkpoint_path='./output/mattergen_alex_mp20_chemical_system/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_chemical_system/' --mode='by_dataloader' + +# alex_mp20 dataset, with dft_mag_density constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_dft_mag_density' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_dft_mag_density/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml' --checkpoint_path='./output/mattergen_alex_mp20_dft_mag_density/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_dft_mag_density/' --mode='by_dataloader' + +# alex_mp20 dataset, with ml_bulk_modulus constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_ml_bulk_modulus' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_ml_bulk_modulus/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml' --checkpoint_path='./output/mattergen_alex_mp20_ml_bulk_modulus/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_ml_bulk_modulus/' --mode='by_dataloader' + +# alex_mp20 dataset, with space_group constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_space_group' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_space_group/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml' --checkpoint_path='./output/mattergen_alex_mp20_space_group/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_space_group/' --mode='by_dataloader' + +# alex_mp20 dataset, with chemical system and energy above hull constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_chemical_system_energy_above_hull' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_chemical_system_energy_above_hull/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml' --checkpoint_path='./output/mattergen_alex_mp20_chemical_system_energy_above_hull/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_chemical_system_energy_above_hull/' --mode='by_dataloader' + +# alex_mp20 dataset, with dft_mag_density and hhi_score constraints +python structure_generation/sample.py --model_name='mattergen_alex_mp20_dft_mag_density_hhi_score' --weights_name='latest.pdparams' --save_path='result_mattergen_alex_mp20_dft_mag_density_hhi_score/' --mode='by_dataloader' +python structure_generation/sample.py --config_path='structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml' --checkpoint_path='./output/mattergen_alex_mp20_dft_mag_density_hhi_score/checkpoints/latest.pdparams' --save_path='result_mattergen_alex_mp20_dft_mag_density_hhi_score/' --mode='by_dataloader' +``` + +--- + +## Citation +``` +@article{zeni2025generative, + title={A generative model for inorganic materials design}, + author={Zeni, Claudio and Pinsler, Robert and Z{\"u}gner, Daniel and Fowler, Andrew and Horton, Matthew and Fu, Xiang and Wang, Zilong and Shysheya, Aliaksandra and Crabb{\'e}, Jonathan and Ueda, Shoko and others}, + journal={Nature}, + pages={1--3}, + year={2025}, + publisher={Nature Publishing Group UK London} +} +``` diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20.yaml new file mode 100644 index 00000000..adb32ddf --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20.yaml @@ -0,0 +1,171 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + +Trainer: + # Max epochs to train + max_epochs: 2200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20 + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null # set your pretrained model path here + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGen + __init_params__: + decoder_cfg: + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.0001 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 64 # for 8 gpu, total batch size = 64 * 8 gpus = 512 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml new file mode 100644 index 00000000..81548bab --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system.yaml @@ -0,0 +1,195 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['chemical_system'] + property_embeddings_adapt_cfg: + chemical_system: + conditional_embedding_module_name: 'ChemicalSystemMultiHotEmbedding' + conditional_embedding_module_cfg: + hidden_dim: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: Identity + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_chemical_system + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: ['Mo-Si'] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml new file mode 100644 index 00000000..c7c6b32c --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_chemical_system_energy_above_hull.yaml @@ -0,0 +1,204 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['chemical_system', 'energy_above_hull'] + property_embeddings_adapt_cfg: + chemical_system: + conditional_embedding_module_name: 'ChemicalSystemMultiHotEmbedding' + conditional_embedding_module_cfg: + hidden_dim: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: Identity + scaler_cfg: {} + energy_above_hull: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_chemical_system_energy_above_hull + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: ['Mo-Si', 0.13] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml new file mode 100644 index 00000000..6e480446 --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_band_gap.yaml @@ -0,0 +1,195 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['dft_band_gap'] + property_embeddings_adapt_cfg: + dft_band_gap: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_dft_band_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.897] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml new file mode 100644 index 00000000..2d330297 --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density.yaml @@ -0,0 +1,195 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['dft_mag_density'] + property_embeddings_adapt_cfg: + dft_mag_density: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_dft_mag_density + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.897] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml new file mode 100644 index 00000000..09d584bb --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_dft_mag_density_hhi_score.yaml @@ -0,0 +1,204 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['dft_mag_density', 'hhi_score'] + property_embeddings_adapt_cfg: + dft_mag_density: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} + hhi_score: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_dft_mag_density_hhi_score + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.0, 1900] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml new file mode 100644 index 00000000..41130b8b --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_ml_bulk_modulus.yaml @@ -0,0 +1,195 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['ml_bulk_modulus'] + property_embeddings_adapt_cfg: + ml_bulk_modulus: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_ml_bulk_modulus + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20_ml_bulk_modulus.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.897] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml b/structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml new file mode 100644 index 00000000..d4dd84ea --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_alex_mp20_space_group.yaml @@ -0,0 +1,195 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['space_group'] + property_embeddings_adapt_cfg: + space_group: + conditional_embedding_module_name: 'SpaceGroupEmbeddingVector' + conditional_embedding_module_cfg: + hidden_dim: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: Identity + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_alex_mp20_space_group + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_alex_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: AlexMP20MatterGenDataset + __init_params__: + path: "./data/alex_mp_20/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/alex_mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [7] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_mp20.yaml b/structure_generation/configs/mattergen/mattergen_mp20.yaml new file mode 100644 index 00000000..805cba54 --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_mp20.yaml @@ -0,0 +1,192 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + +Trainer: + # Max epochs to train + max_epochs: 900 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_mp20 + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 20 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: null # set your pretrained model path here + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGen + __init_params__: + decoder_cfg: + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 0.0001 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/train.csv" + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/val.csv" + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/test.csv" + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/test" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml b/structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml new file mode 100644 index 00000000..a15d4ab6 --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_mp20_chemical_system.yaml @@ -0,0 +1,217 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['chemical_system'] + property_embeddings_adapt_cfg: + chemical_system: + conditional_embedding_module_name: 'ChemicalSystemMultiHotEmbedding' + conditional_embedding_module_cfg: + hidden_dim: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: Identity + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_mp20_chemical_system + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/test.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/test" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: ['Mo-Si'] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml b/structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml new file mode 100644 index 00000000..9363f26f --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_mp20_dft_band_gap.yaml @@ -0,0 +1,217 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['dft_band_gap'] + property_embeddings_adapt_cfg: + dft_band_gap: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_mp20_dft_band_gap + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/test.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/test" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.897] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml b/structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml new file mode 100644 index 00000000..ee8cb126 --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_mp20_dft_bulk_modulus.yaml @@ -0,0 +1,217 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['dft_bulk_modulus'] + property_embeddings_adapt_cfg: + dft_bulk_modulus: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_mp20_dft_bulk_modulus + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/test.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/test" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.897] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml b/structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml new file mode 100644 index 00000000..fb463fb8 --- /dev/null +++ b/structure_generation/configs/mattergen/mattergen_mp20_dft_mag_density.yaml @@ -0,0 +1,217 @@ +Global: + # Whether to train, evaluate or test + do_train: True + do_eval: False + do_test: False + # Number of training timesteps for diffusion scheduler + num_train_timesteps: 1000 + + condition_names: ['dft_mag_density'] + property_embeddings_adapt_cfg: + dft_mag_density: + conditional_embedding_module_name: 'NoiseLevelEncoding' + conditional_embedding_module_cfg: + d_model: 512 + unconditional_embedding_module_name: ZerosEmbedding + unconditional_embedding_module_cfg: + hidden_dim: 512 + scaler_name: StandardScalerPaddle + scaler_cfg: {} +Trainer: + # Max epochs to train + max_epochs: 200 + # Random seed + seed: 42 + # Save path for checkpoints and logs + output_dir: ./output/mattergen_mp20_dft_mag_density + # Save frequency [epoch], for example, save_freq=10 means save checkpoints every 10 epochs + save_freq: 100 # set 0 to disable saving during training + # Logging frequency [step], for example, log_freq=10 means log every 10 steps + log_freq: 10 # log frequency [step] + + # Start evaluation epoch, for example, start_eval_epoch=10 means start evaluation from epoch 10 + start_eval_epoch: 1 + # Evaluation frequency [epoch], for example, eval_freq=1 means evaluate every 1 epoch + eval_freq: 1 # set 0 to disable evaluation during training + # Pretrained model path, if null, no pretrained model will be loaded + pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlematerial/checkpoints/structure_generation/mattergen/mattergen_mp20.zip # set your pretrained model path here + # Pretrained weight name, will be used when pretrained_model_path is a directory + pretrained_weight_name: 'latest.pdparams' + # Resume from checkpoint path, useful for resuming training + resume_from_checkpoint: null + # whether use automatic mixed precision + use_amp: False + # automatic mixed precision level + amp_level: 'O1' + # whether run a model on no_grad mode during evaluation, useful for saving memory + # If the model contains higher-order derivatives in the forward, it should be set to + # False + eval_with_no_grad: True + # gradient accumulation steps, for example, gradient_accumulation_steps=2 means + # gradient accumulation every 2 forward steps + # Note: + # one complete step = gradient_accumulation_steps * forward steps + backward steps + gradient_accumulation_steps: 1 + + # best metric indicator, you can choose from "train_loss", "eval_loss", "train_metric", "eval_metric" + best_metric_indicator: 'eval_loss' # "train_loss", "eval_loss", "train_metric", "eval_metric" + # The name of the best metric, since you may have multiple metrics, such as "mae", "rmse", "mape" + name_for_best_metric: "loss" + # The metric whether is better when it is greater + greater_is_better: False + + # compute metric during training or evaluation + compute_metric_during_train: False # True: the metric will be calculated on train dataset + metric_strategy_during_eval: 'step' # step or epoch, compute metric after step or epoch, if set to 'step', the metric will be calculated after every step, else after epoch + + # whether use visualdl, wandb, tensorboard to log + use_visualdl: False + use_wandb: False + use_tensorboard: False + +Model: + __class_name__: MatterGenWithCondition + __init_params__: + set_embedding_type_cfg: + dropout_fields_iid: false + p_unconditional: 0.2 + condition_names: ${Global.condition_names} + decoder_cfg: + property_embeddings_adapt_cfg: ${Global.property_embeddings_adapt_cfg} + gemnet_type: 'GemNetTCtrl' + gemnet_cfg: + num_targets: 1 + latent_dim: 512 + atom_embedding_cfg: + emb_size: 512 + with_mask_type: True + max_neighbors: 50 + max_cell_images_per_dim: 5 + cutoff: 7.0 + num_blocks: 4 + otf_graph: true + condition_on_adapt: ${Global.condition_names} + lattice_noise_scheduler_cfg: + __class_name__: LatticeVPSDEScheduler + __init_params__: + limit_density: 0.05771451654022283 + coord_noise_scheduler_cfg: + __class_name__: NumAtomsVarianceAdjustedWrappedVESDE + __init_params__: {} + atom_noise_scheduler_cfg: + __class_name__: D3PMScheduler + __init_params__: {} + num_train_timesteps: ${Global.num_train_timesteps} + time_dim: 256 + lattice_loss_weight: 1 + coord_loss_weight: 0.1 + atom_loss_weight: 1 + +Optimizer: + clip_value: 0.5 + __class_name__: Adam + __init_params__: + beta1: 0.9 + beta2: 0.999 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 5.0e-06 + factor: 0.6 + by_epoch: True + patience: 100 + min_lr: 1.0e-06 + indicator: "train_loss" + indicator_name: 'loss' + +Dataset: + train: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/train.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/train" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: False + batch_size: 16 # for 8 gpu, total batch size = 16 * 8 gpus = 128 + val: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/val.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/val" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + test: + dataset: + __class_name__: MP20MatterGenDataset + __init_params__: + path: "./data/mp_20_chemical_system/test.csv" + property_names: ${Global.condition_names} + build_structure_cfg: + format: cif_str + primitive: True + niggli: True + canocial: False + num_cpus: 10 + cache_path: "./data/mp_20_chemical_system_cache/test" + transforms: + - __class_name__: LatticePolarDecomposition + __init_params__: {} + sampler: + __class_name__: DistributedBatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 32 + +Sample: + data: + dataset: + __class_name__: NumAtomsCrystalDataset + __init_params__: + total_num: 16 + prop_names: ${Global.condition_names} + prop_values: [0.897] + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 16 + build_structure_cfg: + format: array + niggli: False + + model_sample_params: + num_inference_steps: 1000 diff --git a/structure_generation/configs/sgequidiff/README.md b/structure_generation/configs/sgequidiff/README.md new file mode 100644 index 00000000..84a02454 --- /dev/null +++ b/structure_generation/configs/sgequidiff/README.md @@ -0,0 +1,95 @@ +# SGEquiDiff + +[SPACE GROUP EQUIVARIANT CRYSTAL DIFFUSION](https://arxiv.org/abs/2505.10994) + +## Abstract + +We introduce SGEquiDiff, a diffusion model for crystal structure prediction that operates entirely within the asymmetric unit (ASU) of a crystallographic space group. By modeling the joint distribution over Wyckoff positions, atomic species, lattice parameters, and space group assignments, SGEquiDiff generates crystals that are consistent with the symmetries of the 230 space groups. We demonstrate the effectiveness of our model on the MP-20 and MPTS-52 crystal structure prediction benchmarks. + +--- + +## Model Description + +### Overview + +A crystal is represented by its asymmetric unit: +- space group: $g \in \{1,\ldots,230\}$ +- lattice parameters: $L = (a,b,c,\alpha,\beta,\gamma)$ +- Wyckoff positions: $W = (w_1,\ldots,w_N)$ +- atomic species: $E = (e_1,\ldots,e_N)$ +- fractional coordinates: $X = (x_1,\ldots,x_N),\; x_i \in \text{ASU}_g$ + +SGEquiDiff generates crystals in four stages: +1. **Space group** -- a categorical distribution over 230 space groups +2. **Lattice parameters** -- telescoping discrete sampling constrained by Bravais lattice type +3. **Wyckoff positions and elements** -- autoregressive Transformer over Wyckoff sites +4. **Fractional coordinates** -- VE-SDE diffusion on the ASU-wrapped torus + +### Method + +#### 1) Space group and lattice sampling +The space group is sampled from a learnable categorical distribution. Lattice parameters are discretized via a telescoping binning scheme that respects the Bravais-lattice constraints of each space group. + +#### 2) Autoregressive Wyckoff/element sampling +A Transformer decoder autoregressively predicts the next Wyckoff position and atomic element, conditioned on previously sampled sites and the global space-group/lattice context. + +#### 3) Equivariant diffusion on the ASU torus +Fractional coordinates are corrupted with VE-SDE noise wrapped into the ASU. The denoiser predicts an equivariant score field, and sampling uses a predictor-corrector scheme with Wyckoff-subspace projection after each step. + +--- + +## Dataset Description + +- **MP-20**: 45,231 inorganic crystals (Materials Project subset) with up to 20 atoms per unit cell. +- **MPTS-52 (Materials Project Time Split)**: 40,476 crystals with up to 52 atoms per cell; chronological split for temporal generalization. + +Data is stored in ASU representation as `.npz` + `.pkl` files. Each sample contains space group index, composition vector, lattice parameters, and per-atom Wyckoff indices / element indices / fractional coordinates. + +--- + +## Results + +Pretrained weights are hosted on **AiStudio (Paddle format)**. Each dataset has 4 sub-module weight files (diffusion / lattice / space_group / wyckoff). The model auto-downloads all 4 via `load_pretrained_weights()`. + +| Dataset | Sub-module | Download | +| --- | --- | --- | +| mp_20 | diffusion | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_diffusion_snapshot.pdparams) | +| mp_20 | lattice | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_lattice_snapshot.pdparams) | +| mp_20 | space_group | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_space_group_snapshot.pdparams) | +| mp_20 | wyckoff | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mp_20_best_wyckoff-transformer_snapshot.pdparams) | +| mpts_52 | diffusion | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_diffusion_snapshot.pdparams) | +| mpts_52 | lattice | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_lattice_snapshot.pdparams) | +| mpts_52 | space_group | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_space_group_snapshot.pdparams) | +| mpts_52 | wyckoff | [download](https://paddle-org.bj.bcebos.com/paddlematerials/checkpoints/structure_generation/SGEquiDiff/mpts_52_best_wyckoff-transformer_snapshot.pdparams) | + +--- + +## Command + +### Setup +```bash +export SGEQUIFF_DATA_DIR=/path/to/data +``` + +### Training +```bash +python structure_generation/train.py -c structure_generation/configs/sgequidiff/sgequidiff_mp20.yaml +``` + +### Generation +```bash +python structure_generation/sample.py --config_path=structure_generation/configs/sgequidiff/sgequidiff_mp20_sample.yaml --checkpoint_path=/path/to/weight_dir --mode=by_num_atoms --num_atoms=8 --save_path=./sgequidiff_samples +``` + +--- + +## Citation +``` +@misc{chang2025spacegroupequivariantcrystal, + title={Space Group Equivariant Crystal Diffusion}, + author={Rees Chang and Angela Pak and Alex Guerra and Ni Zhan and Nick Richardson and Elif Ertekin and Ryan P. Adams}, + year={2025}, + eprint={2505.10994}, + archivePrefix={arXiv}, +} +``` diff --git a/structure_generation/configs/sgequidiff/sgequidiff_mp20.yaml b/structure_generation/configs/sgequidiff/sgequidiff_mp20.yaml new file mode 100644 index 00000000..9e20b56f --- /dev/null +++ b/structure_generation/configs/sgequidiff/sgequidiff_mp20.yaml @@ -0,0 +1,122 @@ +Global: + do_train: True + do_eval: False + do_test: False + num_train_timesteps: 1000 + +Trainer: + max_epochs: 2000 + seed: 42 + output_dir: ./output/sgequidiff_mp20 + save_freq: 100 + log_freq: 10 + start_eval_epoch: 1 + eval_freq: 10 + pretrained_model_path: null + resume_from_checkpoint: null + use_amp: False + amp_level: 'O1' + eval_with_no_grad: True + gradient_accumulation_steps: 1 + best_metric_indicator: 'train_loss' + name_for_best_metric: "loss" + greater_is_better: False + compute_metric_during_train: False + metric_strategy_during_eval: 'epoch' + use_visualdl: False + use_wandb: False + use_tensorboard: True + + +Model: + __class_name__: EquivariantDiffusionModel + __init_params__: + num_wn_lattice_translations: 3 + noise_scheduler_cfg: + __class_name__: ASUVESDEScheduler + __init_params__: + num_timesteps: ${Global.num_train_timesteps} + sigma_min: 0.002 + sigma_max: 0.5 + num_lattice_translations: 3 + num_monte_carlo_samples: 2500 + time_emb_dim: 128 + model_type: gnn + num_plane_wave_freqs: 96 + subsample_group_operations: False + gnn_config: + num_plane_wave_freqs: 96 + num_cartesian_distance_gaussians: 96 + edge_hidden_dim: 128 + atom_hidden_dim: 256 + use_vpa: True + use_graph_norm: True + num_msg_pass_steps: 5 + cutoff: 10.0 + use_frac_coords_in_node_emb: True + dataset_name: mp_20 + +Optimizer: + __class_name__: AdamW + __init_params__: + beta1: 0.9 + beta2: 0.999 + epsilon: 1.0e-8 + weight_decay: 0.0 + lr: + __class_name__: ReduceOnPlateau + __init_params__: + learning_rate: 1.0e-3 + indicator: train_loss + indicator_name: loss + factor: 0.6 + patience: 30 + min_lr: 1.0e-5 + +Dataset: + train: + dataset: + __class_name__: AsymmetricUnitDataset + __init_params__: + name: mp_20 + split: train + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: True + drop_last: True + batch_size: 32 + val: + dataset: + __class_name__: AsymmetricUnitDataset + __init_params__: + name: mp_20 + split: val + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + test: + dataset: + __class_name__: AsymmetricUnitDataset + __init_params__: + name: mp_20 + split: test + loader: + num_workers: 0 + use_shared_memory: False + sampler: + __class_name__: BatchSampler + __init_params__: + shuffle: False + drop_last: False + batch_size: 64 + diff --git a/structure_generation/configs/sgequidiff/sgequidiff_mp20_sample.yaml b/structure_generation/configs/sgequidiff/sgequidiff_mp20_sample.yaml new file mode 100644 index 00000000..b71fdbc7 --- /dev/null +++ b/structure_generation/configs/sgequidiff/sgequidiff_mp20_sample.yaml @@ -0,0 +1,22 @@ +Global: + do_train: False + do_eval: False + do_test: False + +Model: + __class_name__: SGEQUIDiffSampler + __init_params__: + dataset_name: mp_20 + diffusion_snr: 0.4 + temperature: 1.0 + num_timesteps: 1000 + noise_scheduler_num_monte_carlo_samples: 10 + num_wn_lattice_translations: 1 + weight_dir: null + +Sample: + build_structure_cfg: + format: array + primitive: False + niggli: False + canocial: True diff --git a/structure_generation/docs/diffcsp_overview.png b/structure_generation/docs/diffcsp_overview.png new file mode 100644 index 00000000..994cef83 Binary files /dev/null and b/structure_generation/docs/diffcsp_overview.png differ diff --git a/structure_generation/docs/mattergen.png b/structure_generation/docs/mattergen.png new file mode 100644 index 00000000..11ec1dbd Binary files /dev/null and b/structure_generation/docs/mattergen.png differ diff --git a/structure_generation/sample.py b/structure_generation/sample.py new file mode 100644 index 00000000..51441fc2 --- /dev/null +++ b/structure_generation/sample.py @@ -0,0 +1,307 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +from typing import Optional + +import numpy as np +import paddle +from omegaconf import OmegaConf +from pymatgen.core import Composition +from pymatgen.io.cif import CifWriter + +from ppmat.datasets import build_dataloader +from ppmat.datasets.build_structure import BuildStructure +from ppmat.datasets.transform import build_post_transforms +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.models import build_model_from_name +from ppmat.utils import logger +from ppmat.utils import save_load + + +class StructureSampler: + """Structure Sampler. + + This class provides an interface for sampling structures using pre-trained deep + learning models. Supports two initialization modes: + + 1. **Automatic Model Loading** + Specify `model_name` and `weights_name` to automatically download + and load pre-trained weights from the `MODEL_REGISTRY`. + + 2. **Custom Model Loading** + Provide explicit `config_path` and `checkpoint_path` to load + custom-trained models from local files. + + Args: + model_name (Optional[str], optional): Name of the pre-defined model architecture + from the `MODEL_REGISTRY` registry. When specified, associated weights + will be automatically downloaded. Defaults to None. + + weights_name (Optional[str], optional): Specific pre-trained weight identifier. + Used only when `model_name` is provided. Valid options include: + - 'best.pdparams' (highest validation performance) + - 'latest.pdparams' (most recent training checkpoint) + - Custom weight files ending with '.pdparams' + Defaults to None. + + config_path (Optional[str], optional): Path to model configuration file (YAML) + for custom models. Required when not using predefined `model_name`. + Defaults to None. + checkpoint_path (Optional[str], optional): Path to model checkpoint file + (.pdparams) for custom models. Required when not using predefined + `model_name`. Defaults to None. + """ + + def __init__( + self, + model_name: Optional[str] = None, + weights_name: Optional[str] = None, + config_path: Optional[str] = None, + checkpoint_path: Optional[str] = None, + ): + # if model_name is not None, then config_path and checkpoint_path must be + # provided + if model_name is None: + assert ( + config_path is not None and checkpoint_path is not None + ), "config_path and checkpoint_path must be provided when model_name is " + "None." + + logger.info(f"Loading model from {config_path} and {checkpoint_path}.") + + config = OmegaConf.load(config_path) + config = OmegaConf.to_container(config, resolve=True) + + model_config = config.get("Model", None) + assert model_config is not None, "Model config must be provided." + model = build_model(model_config) + save_load.load_pretrain(model, checkpoint_path) + + else: + logger.info("Since model_name is given, downloading it...") + model, config = build_model_from_name(model_name, weights_name) + + self.model = model + self.config = config + + self.model.eval() + + # sample config + sample_config = config.get("Sample", None) + self.sample_config = sample_config + + self.post_transforms_cfg = self.sample_config.get("post_transforms", None) + if self.post_transforms_cfg is not None: + self.post_transforms = build_post_transforms(self.post_transforms_cfg) + else: + self.post_transforms = None + + def compute_metric( + self, + save_path=None, + ): + metrics_cfg = self.sample_config.get("metrics") + assert metrics_cfg is not None, "metrics config must be provided." + metrics_fn = build_metric(metrics_cfg) + + total_results = self.sample_by_dataloader(save_path) + + metric = metrics_fn(total_results) + return metric + + def post_process(self, data): + if self.post_transforms is None: + return data + return self.post_transforms(data) + + def sample(self, data, sample_params=None): + if sample_params is None: + sample_params = {} + assert isinstance(sample_params, dict), "sample_params must be a dict or None." + pred_data = self.model.sample(data, **sample_params) + pred_data = self.post_process(pred_data) + return pred_data + + def sample_by_dataloader( + self, + save_path=None, + ): + dataset_cfg = self.sample_config["data"] + data_loader = build_dataloader(dataset_cfg) + + build_structure_cfg = self.sample_config["build_structure_cfg"] + structure_converter = BuildStructure(**build_structure_cfg) + + logger.info(f"Total iterations: {len(data_loader)}") + logger.info("Start sampling process...\n") + + total_results = [] + for iter_id, batch_data in enumerate(data_loader): + pred_data = self.model.sample(batch_data) + structures = structure_converter(pred_data["result"]) + if save_path is not None: + os.makedirs(save_path, exist_ok=True) + for i, structure in enumerate(structures): + formula = structure.formula.replace(" ", "-") + tar_file = os.path.join( + save_path, f"{formula}_{iter_id + 1}_{i + 1}.cif" + ) + if structure is not None: + writer = CifWriter(structure) + writer.write_file(tar_file) + else: + logger.info( + f"No structure generated for iteration {iter_id}, index {i}" + ) + total_results.extend(pred_data["result"]) + return total_results + + def sample_by_num_atoms(self, num_atoms, save_path=None, sample_params=None): + assert isinstance(num_atoms, int), "num_atoms must be an integer." + data = { + "structure_array": { + "num_atoms": paddle.to_tensor(np.array([num_atoms]).astype("int64")), + } + } + + result = self.sample(data, sample_params=sample_params) + + if save_path is not None: + os.makedirs(save_path, exist_ok=True) + logger.info(f"Save results to {save_path}") + build_structure_cfg = self.sample_config["build_structure_cfg"] + structure_converter = BuildStructure(**build_structure_cfg) + structures = structure_converter(result["result"]) + for i, structure in enumerate(structures): + formula = structure.formula.replace(" ", "-") + tar_file = os.path.join(save_path, f"{formula}_{i + 1}.cif") + if structure is not None: + writer = CifWriter(structure) + writer.write_file(tar_file) + else: + logger.info(f"No structure generated for index {i}") + + return result + + def sample_by_chemical_formula( + self, chemical_formula, save_path=None, sample_params=None + ): + assert isinstance(chemical_formula, str), "chemical_formula must be a string." + composition = Composition(chemical_formula) + atom_types = [] + for elem, num in composition.items(): + atom_types.extend([elem.Z] * int(num)) + atom_types = np.array(atom_types).astype("int64") + + data = { + "structure_array": { + "atom_types": paddle.to_tensor(atom_types), + "num_atoms": paddle.to_tensor( + np.array([atom_types.shape[0]]).astype("int64") + ), + } + } + result = self.sample(data, sample_params=sample_params) + + if save_path is not None: + os.makedirs(save_path, exist_ok=True) + logger.info(f"Save results to {save_path}") + build_structure_cfg = self.sample_config["build_structure_cfg"] + structure_converter = BuildStructure(**build_structure_cfg) + structures = structure_converter(result["result"]) + for i, structure in enumerate(structures): + formula = structure.formula.replace(" ", "-") + tar_file = os.path.join(save_path, f"{formula}_{i + 1}.cif") + if structure is not None: + writer = CifWriter(structure) + writer.write_file(tar_file) + else: + logger.info(f"No structure generated for index {i}") + + return result + + def sample_by_condition(self, composition, save_path=None, sample_params=None): + # todo: implement this function + pass + + +if __name__ == "__main__": + + argparse = argparse.ArgumentParser() + + argparse.add_argument("--model_name", type=str, default=None) + argparse.add_argument( + "--weights_name", + type=str, + default=None, + help="Weights name, e.g., best.pdparams, latest.pdparams.", + ) + argparse.add_argument( + "--config_path", + type=str, + default=None, + help="Path to the configuration file.", + ) + argparse.add_argument( + "--checkpoint_path", + type=str, + default=None, + help="Path to the checkpoint file.", + ) + argparse.add_argument("--save_path", type=str, default="results") + argparse.add_argument("--chemical_formula", type=str, default="LiMnO2") + argparse.add_argument("--num_atoms", type=int, default=4) + argparse.add_argument( + "--mode", + type=str, + choices=[ + "by_chemical_formula", + "by_num_atoms", + "by_dataloader", + "compute_metric", + ], + default="by_chemical_formula", + ) + + args = argparse.parse_args() + + sampler = StructureSampler( + model_name=args.model_name, + weights_name=args.weights_name, + config_path=args.config_path, + checkpoint_path=args.checkpoint_path, + ) + if args.mode == "compute_metric": + metric_result = sampler.compute_metric(save_path=args.save_path) + for metric_name, metric_value in metric_result.items(): + logger.info(f"{metric_name}: {metric_value}") + elif args.mode == "by_chemical_formula": + result = sampler.sample_by_chemical_formula( + chemical_formula=args.chemical_formula, + save_path=args.save_path, + ) + elif args.mode == "by_num_atoms": + result = sampler.sample_by_num_atoms( + num_atoms=args.num_atoms, + save_path=args.save_path, + ) + elif args.mode == "by_dataloader": + result = sampler.sample_by_dataloader( + save_path=args.save_path, + ) + else: + raise ValueError(f"Unknown mode: {args.mode}") diff --git a/structure_generation/train.py b/structure_generation/train.py new file mode 100644 index 00000000..09a7f94a --- /dev/null +++ b/structure_generation/train.py @@ -0,0 +1,146 @@ +# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import os.path as osp + +import paddle.distributed as dist +import paddle.distributed.fleet as fleet +from omegaconf import OmegaConf + +from ppmat.datasets import build_dataloader +from ppmat.datasets import set_signal_handlers +from ppmat.metrics import build_metric +from ppmat.models import build_model +from ppmat.optimizer import build_optimizer +from ppmat.trainer.base_trainer import BaseTrainer +from ppmat.utils import logger +from ppmat.utils import misc + +if dist.get_world_size() > 1: + fleet.init(is_collective=True) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-c", + "--config", + type=str, + default="./structure_generation/configs/diffcsp/diffcsp_mp20.yaml", + help="Path to config file", + ) + + args, dynamic_args = parser.parse_known_args() + + # load config and merge with cli args + config = OmegaConf.load(args.config) + cli_config = OmegaConf.from_dotlist(dynamic_args) + config = OmegaConf.merge(config, cli_config) + + # save config to output_dir, only rank 0 process will do this + if dist.get_rank() == 0: + os.makedirs(config["Trainer"]["output_dir"], exist_ok=True) + config_name = os.path.basename(args.config) + OmegaConf.save(config, osp.join(config["Trainer"]["output_dir"], config_name)) + # convert to dict + config = OmegaConf.to_container(config, resolve=True) + + # init logger + logger_path = osp.join(config["Trainer"]["output_dir"], "run.log") + logger.init_logger(log_file=logger_path) + logger.info(f"Logger saved to {logger_path}") + + # set random seed + seed = config["Trainer"].get("seed", 42) + misc.set_random_seed(seed) + logger.info(f"Set random seed to {seed}") + + # build model from config + model_cfg = config["Model"] + model = build_model(model_cfg) + + # build dataloader from config + set_signal_handlers() + if config["Global"].get("do_train", True): + train_data_cfg = config["Dataset"].get("train") + assert ( + train_data_cfg is not None + ), "train_data_cfg must be defined, when do_train is true" + train_loader = build_dataloader(train_data_cfg) + else: + train_loader = None + + if config["Global"].get("do_eval", False) or config["Global"].get("do_train", True): + val_data_cfg = config["Dataset"].get("val") + if val_data_cfg is not None: + val_loader = build_dataloader(val_data_cfg) + else: + logger.info("No validation dataset defined.") + val_loader = None + else: + val_loader = None + + if config["Global"].get("do_test", False): + test_data_cfg = config["Dataset"].get("test") + assert ( + test_data_cfg is not None + ), "test_data_cfg must be defined, when do_test is true" + test_loader = build_dataloader(test_data_cfg) + else: + test_loader = None + + # build optimizer and learning rate scheduler from config + if config.get("Optimizer") is not None and config["Global"].get("do_train", True): + assert ( + train_loader is not None + ), "train_loader must be defined when optimizer is defined." + assert ( + config["Trainer"].get("max_epochs") is not None + ), "max_epochs must be defined when optimizer is defined." + optimizer, lr_scheduler = build_optimizer( + config["Optimizer"], + model, + config["Trainer"]["max_epochs"], + len(train_loader), + ) + else: + optimizer, lr_scheduler = None, None + + # build metric from config + metric_cfg = config.get("Metric") + if metric_cfg is not None: + metric_func = build_metric(metric_cfg) + else: + metric_func = None + + # # initialize trainer + trainer = BaseTrainer( + config["Trainer"], + model, + train_dataloader=train_loader, + val_dataloader=val_loader, + optimizer=optimizer, + lr_scheduler=lr_scheduler, + compute_metric_func_dict=metric_func, + ) + + if config["Global"].get("do_train", True): + trainer.train() + if config["Global"].get("do_eval", False): + logger.info("Evaluating on validation set") + time_info, loss_info, metric_info = trainer.eval(val_loader) + if config["Global"].get("do_test", False): + logger.info("Evaluating on test set") + time_info, loss_info, metric_info = trainer.eval(test_loader) diff --git a/test/rename_weights.py b/test/rename_weights.py new file mode 100644 index 00000000..a0790ed6 --- /dev/null +++ b/test/rename_weights.py @@ -0,0 +1,25 @@ +import paddle + + +def rename_weights(input_path, output_path): + # 加载权重文件 + weights = paddle.load(input_path) + + # 创建新字典并修改键名 + new_weights = {} + for key in weights.keys(): + if key.startswith("text_encoder"): + new_key = key.replace("text_encoder", "spectrum_encoder", 1) + new_weights[new_key] = weights[key] + else: + new_weights[key] = weights[key] + + # 保存修改后的权重 + paddle.save(new_weights, output_path) + print(f"Weights renamed and saved to {output_path}") + + +if __name__ == "__main__": + input_path = "./pretrained/step2_onlyH_best.pdparams" + output_path = "./pretrained/DiffNMR_NMRNet_nless15_onlyH_best.pdparams" + rename_weights(input_path, output_path)